Merge "jquery.tablesorter: Reset unaffected columns' sort counts when sorting"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 5 Jun 2013 11:48:07 +0000 (11:48 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 5 Jun 2013 11:48:07 +0000 (11:48 +0000)
1464 files changed:
.gitignore
.jshintignore
.jshintrc
CREDITS
HISTORY
RELEASE-NOTES-1.21 [deleted file]
RELEASE-NOTES-1.22 [new file with mode: 0644]
UPGRADE
api.php
docs/hooks.txt
docs/maintenance.txt
docs/php-memcached/Documentation
docs/skin.txt
docs/title.txt
docs/uidesign/child-selector-emu.html
docs/uidesign/design.html
docs/uidesign/mediawiki.action.history.diff.html
docs/uidesign/monospace.html
docs/uidesign/table-layout.html
extensions/README
img_auth.php
includes/Action.php
includes/AjaxDispatcher.php
includes/ArrayUtils.php
includes/Article.php
includes/AutoLoader.php
includes/Autopromote.php
includes/Block.php
includes/Category.php
includes/CategoryViewer.php
includes/Cdb.php
includes/Cdb_PHP.php
includes/ChangeTags.php
includes/ChangesFeed.php
includes/ChangesList.php
includes/Collation.php
includes/ConfEditor.php
includes/CryptRand.php [deleted file]
includes/DataUpdate.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/Exception.php
includes/Export.php
includes/ExternalEdit.php [deleted file]
includes/ExternalUser.php [deleted file]
includes/Fallback.php
includes/Feed.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/ForkController.php
includes/FormOptions.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/HashRing.php [new file with mode: 0644]
includes/HistoryBlob.php
includes/Hooks.php
includes/Html.php
includes/HttpFunctions.php
includes/IP.php
includes/ImageGallery.php
includes/ImagePage.php
includes/ImageQueryPage.php
includes/Import.php
includes/Init.php
includes/Licenses.php
includes/LinkFilter.php
includes/Linker.php
includes/LinksUpdate.php
includes/MWCryptRand.php [new file with mode: 0644]
includes/MWFunction.php
includes/MagicWord.php
includes/MappedIterator.php
includes/Message.php
includes/Metadata.php
includes/MimeMagic.php
includes/Namespace.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/PageQueryPage.php
includes/Pager.php
includes/PathRouter.php
includes/PoolCounter.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/QueryPage.php
includes/RecentChange.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/ScopedCallback.php
includes/SeleniumWebSettings.php
includes/Setup.php
includes/SiteConfiguration.php
includes/SiteStats.php
includes/Skin.php
includes/SkinLegacy.php [deleted file]
includes/SkinTemplate.php
includes/SpecialPage.php
includes/SpecialPageFactory.php
includes/SqlDataUpdate.php
includes/StatCounter.php [new file with mode: 0644]
includes/Status.php
includes/StreamFile.php
includes/StringUtils.php
includes/StubObject.php
includes/Timestamp.php
includes/Title.php
includes/UIDGenerator.php
includes/User.php
includes/UserArray.php
includes/UserMailer.php
includes/UserRightsProxy.php
includes/WatchedItem.php
includes/WebRequest.php
includes/WebResponse.php
includes/WebStart.php
includes/Wiki.php
includes/WikiError.php
includes/WikiMap.php
includes/WikiPage.php
includes/Xml.php
includes/XmlTypeCheck.php
includes/ZhClient.php
includes/ZipDirectoryReader.php
includes/actions/CreditsAction.php
includes/actions/EditAction.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/PurgeAction.php
includes/actions/RawAction.php
includes/actions/WatchAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiComparePages.php
includes/api/ApiCreateAccount.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatWddx.php
includes/api/ApiFormatXml.php
includes/api/ApiImageRotate.php
includes/api/ApiImport.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.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
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiRsd.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/cache/BacklinkCache.php
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/GenderCache.php
includes/cache/HTMLCacheUpdate.php
includes/cache/HTMLFileCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/LocalisationCache.php
includes/cache/MessageCache.php
includes/cache/ResourceFileCache.php
includes/cache/SquidUpdate.php
includes/cache/UserCache.php
includes/clientpool/RedisConnectionPool.php
includes/content/AbstractContent.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/content/CssContent.php
includes/content/JavaScriptContent.php
includes/content/TextContent.php
includes/content/WikitextContent.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/db/ChronologyProtector.php [new file with mode: 0644]
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/IORMRow.php
includes/db/LBFactory.php
includes/db/LBFactory_Multi.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/db/ORMRow.php
includes/db/ORMTable.php
includes/debug/Debug.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/extauth/Hardcoded.php [deleted file]
includes/extauth/MediaWiki.php [deleted file]
includes/extauth/vB.php [deleted file]
includes/externalstore/ExternalStore.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendGroup.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOp.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filebackend/lockmanager/LockManager.php
includes/filebackend/lockmanager/LockManagerGroup.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/filebackend/lockmanager/QuorumLockManager.php
includes/filebackend/lockmanager/RedisLockManager.php [new file with mode: 0644]
includes/filebackend/lockmanager/ScopedLock.php
includes/filerepo/FSRepo.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/installer/CliInstaller.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/job/Job.php
includes/job/JobQueue.php
includes/job/JobQueueAggregator.php [deleted file]
includes/job/JobQueueAggregatorMemc.php [deleted file]
includes/job/JobQueueAggregatorRedis.php [deleted file]
includes/job/JobQueueDB.php
includes/job/JobQueueFederated.php [new file with mode: 0644]
includes/job/JobQueueGroup.php
includes/job/JobQueueRedis.php
includes/job/aggregator/JobQueueAggregator.php [new file with mode: 0644]
includes/job/aggregator/JobQueueAggregatorMemc.php [new file with mode: 0644]
includes/job/aggregator/JobQueueAggregatorRedis.php [new file with mode: 0644]
includes/job/jobs/AssembleUploadChunksJob.php
includes/job/jobs/DoubleRedirectJob.php
includes/job/jobs/DuplicateJob.php
includes/job/jobs/EnotifNotifyJob.php
includes/job/jobs/HTMLCacheUpdateJob.php
includes/job/jobs/NullJob.php
includes/job/jobs/PublishStashedFileJob.php
includes/job/jobs/RefreshLinksJob.php
includes/json/FormatJson.php
includes/json/Services_JSON.php [deleted file]
includes/logging/DeleteLogFormatter.php [new file with mode: 0644]
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/logging/LogPager.php
includes/logging/MoveLogFormatter.php [new file with mode: 0644]
includes/logging/NewUsersLogFormatter.php [new file with mode: 0644]
includes/logging/PatrolLog.php
includes/logging/PatrolLogFormatter.php [new file with mode: 0644]
includes/logging/RightsLogFormatter.php [new file with mode: 0644]
includes/media/BMP.php
includes/media/Bitmap.php
includes/media/BitmapMetadataHandler.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/Jpeg.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaHandler.php
includes/media/MediaTransformOutput.php
includes/media/PNG.php
includes/media/PNGMetadataExtractor.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/media/Tiff.php
includes/media/XCF.php
includes/media/XMP.php
includes/media/XMPInfo.php
includes/media/XMPValidate.php
includes/normal/README
includes/normal/RandomTest.php
includes/normal/UtfNormal.php
includes/normal/UtfNormalTest.php
includes/normal/UtfNormalTest2.php
includes/normal/UtfNormalUtil.php
includes/objectcache/BagOStuff.php
includes/objectcache/MemcachedBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/objectcache/RedisBagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/parser/CacheTime.php
includes/parser/CoreLinkFunctions.php [deleted file]
includes/parser/CoreParserFunctions.php
includes/parser/CoreTagHooks.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Parser_DiffTest.php
includes/parser/Parser_LinkHooks.php [deleted file]
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/Tidy.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimple.php
includes/profiler/ProfilerSimpleText.php
includes/profiler/ProfilerSimpleUDP.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/revisiondelete/RevisionDeleteUser.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchSqlite.php
includes/search/SearchUpdate.php
includes/site/MediaWikiSite.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllmessages.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialBlankpage.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBlockme.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCachedPage.php
includes/specials/SpecialCategories.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialComparePages.php
includes/specials/SpecialConfirmemail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeadendpages.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialDisambiguations.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExport.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialFilepath.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialListusers.php
includes/specials/SpecialLog.php
includes/specials/SpecialLonelypages.php
includes/specials/SpecialLongpages.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostimages.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPopularpages.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRandompage.php
includes/specials/SpecialRandomredirect.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRedirect.php [new file with mode: 0644]
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialSpecialpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUncategorizedcategories.php
includes/specials/SpecialUncategorizedimages.php
includes/specials/SpecialUncategorizedpages.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnusedcategories.php
includes/specials/SpecialUnusedimages.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/SpecialWantedcategories.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWantedtemplates.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/SpecialWithoutinterwiki.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/UsercreateVForm.php [new file with mode: 0644]
includes/templates/Userlogin.php
includes/templates/UserloginVForm.php [new file with mode: 0644]
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromFile.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.php
index.php
languages/Language.php
languages/LanguageConverter.php
languages/Names.php
languages/classes/LanguageBe_tarask.php
languages/classes/LanguageCu.php
languages/classes/LanguageEo.php
languages/classes/LanguageFi.php
languages/classes/LanguageGa.php
languages/classes/LanguageGan.php
languages/classes/LanguageGv.php
languages/classes/LanguageHi.php
languages/classes/LanguageHr.php
languages/classes/LanguageHy.php
languages/classes/LanguageIu.php
languages/classes/LanguageKaa.php
languages/classes/LanguageKk.php
languages/classes/LanguageKk_cyrl.php
languages/classes/LanguageKsh.php
languages/classes/LanguageKu.php
languages/classes/LanguageLa.php
languages/classes/LanguageMg.php
languages/classes/LanguageMk.php [deleted file]
languages/classes/LanguageMt.php
languages/classes/LanguageNso.php [deleted file]
languages/classes/LanguageOs.php
languages/classes/LanguagePl.php
languages/classes/LanguageSh.php
languages/classes/LanguageShi.php
languages/classes/LanguageSk.php
languages/classes/LanguageSl.php
languages/classes/LanguageSr.php
languages/classes/LanguageSr_ec.php
languages/classes/LanguageSr_el.php
languages/classes/LanguageTg.php
languages/classes/LanguageTi.php
languages/classes/LanguageTl.php
languages/classes/LanguageTyv.php
languages/classes/LanguageUk.php
languages/classes/LanguageUz.php
languages/classes/LanguageWa.php
languages/classes/LanguageZh.php
languages/data/plurals-mediawiki.xml
languages/messages/MessagesAce.php
languages/messages/MessagesAeb.php
languages/messages/MessagesAf.php
languages/messages/MessagesAln.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAnp.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesAry.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBa.php
languages/messages/MessagesBar.php
languages/messages/MessagesBbc.php [new file with mode: 0644]
languages/messages/MessagesBbc_latn.php [new file with mode: 0644]
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBho.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBo.php
languages/messages/MessagesBpy.php
languages/messages/MessagesBqi.php
languages/messages/MessagesBr.php
languages/messages/MessagesBrh.php
languages/messages/MessagesBs.php
languages/messages/MessagesBug.php
languages/messages/MessagesBxr.php [new file with mode: 0644]
languages/messages/MessagesCa.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCe.php
languages/messages/MessagesCeb.php
languages/messages/MessagesCh.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCo.php
languages/messages/MessagesCps.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCu.php
languages/messages/MessagesCv.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDtp.php
languages/messages/MessagesDv.php
languages/messages/MessagesDz.php
languages/messages/MessagesEe.php
languages/messages/MessagesEgl.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFf.php
languages/messages/MessagesFi.php
languages/messages/MessagesFit.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrc.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGag.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGn.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHa.php
languages/messages/MessagesHak.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHil.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/MessagesIg.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJam.php
languages/messages/MessagesJut.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKbd_cyrl.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKoi.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKri.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKw.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLfn.php
languages/messages/MessagesLg.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLiv.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLn.php
languages/messages/MessagesLo.php
languages/messages/MessagesLoz.php
languages/messages/MessagesLt.php
languages/messages/MessagesLtg.php
languages/messages/MessagesLus.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesLzz.php
languages/messages/MessagesMai.php
languages/messages/MessagesMap_bms.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMo.php
languages/messages/MessagesMr.php
languages/messages/MessagesMrj.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMwl.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNah.php
languages/messages/MessagesNan.php
languages/messages/MessagesNap.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNew.php
languages/messages/MessagesNl.php
languages/messages/MessagesNl_informal.php
languages/messages/MessagesNn.php
languages/messages/MessagesNov.php
languages/messages/MessagesNso.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPam.php
languages/messages/MessagesPcd.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPdt.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPnt.php
languages/messages/MessagesPrg.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesRgn.php
languages/messages/MessagesRif.php
languages/messages/MessagesRm.php
languages/messages/MessagesRmy.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSat.php
languages/messages/MessagesSc.php
languages/messages/MessagesScn.php
languages/messages/MessagesSco.php
languages/messages/MessagesSd.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSei.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesShi.php
languages/messages/MessagesSi.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSli.php
languages/messages/MessagesSma.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSrn.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTcy.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTg_latn.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTly.php
languages/messages/MessagesTo.php
languages/messages/MessagesTpi.php
languages/messages/MessagesTr.php
languages/messages/MessagesTru.php
languages/messages/MessagesTs.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVmf.php
languages/messages/MessagesVo.php
languages/messages/MessagesVot.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesWuu.php
languages/messages/MessagesXal.php
languages/messages/MessagesXmf.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZea.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/utils/CLDRPluralRuleEvaluator.php
load.php
maintenance/Doxyfile
maintenance/Maintenance.php
maintenance/archives/patch-eu_local_id.sql [deleted file]
maintenance/archives/patch-external_user.sql [deleted file]
maintenance/archives/patch-img_media_mime-index.sql [new file with mode: 0644]
maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql [new file with mode: 0644]
maintenance/archives/patch-iwlinks-from-title-index.sql [new file with mode: 0644]
maintenance/archives/patch-kill-iwl_pft.sql [deleted file]
maintenance/archives/upgradeLogging.php
maintenance/attachLatest.php
maintenance/backup.inc
maintenance/backupPrefetch.inc
maintenance/backupTextPass.inc
maintenance/benchmarks/Benchmarker.php
maintenance/benchmarks/bench_HTTP_HTTPS.php
maintenance/benchmarks/bench_delete_truncate.php
maintenance/benchmarks/bench_if_switch.php
maintenance/benchmarks/bench_strtr_str_replace.php
maintenance/benchmarks/bench_utf8_title_check.php
maintenance/benchmarks/bench_wfBaseConvert.php
maintenance/benchmarks/bench_wfIsWindows.php
maintenance/benchmarks/benchmarkHooks.php
maintenance/benchmarks/benchmarkPurge.php
maintenance/cdb.php
maintenance/changePassword.php
maintenance/checkBadRedirects.php
maintenance/checkImages.php
maintenance/checkSyntax.php
maintenance/checkUsernames.php
maintenance/cleanupAncientTables.php
maintenance/cleanupCaps.php
maintenance/cleanupImages.php
maintenance/cleanupPreferences.php
maintenance/cleanupRemovedModules.php
maintenance/cleanupSpam.php
maintenance/cleanupTable.inc
maintenance/cleanupTitles.php
maintenance/cleanupUploadStash.php
maintenance/cleanupWatchlist.php
maintenance/clearCacheStats.php
maintenance/clearInterwikiCache.php
maintenance/commandLine.inc
maintenance/compareParsers.php
maintenance/convertLinks.php
maintenance/convertUserOptions.php
maintenance/copyFileBackend.php
maintenance/copyJobQueue.php [new file with mode: 0644]
maintenance/createAndPromote.php
maintenance/deleteArchivedFiles.inc
maintenance/deleteArchivedFiles.php
maintenance/deleteArchivedRevisions.php
maintenance/deleteBatch.php
maintenance/deleteDefaultMessages.php
maintenance/deleteEqualMessages.php
maintenance/deleteImageMemcached.php
maintenance/deleteOldRevisions.php
maintenance/deleteOrphanedRevisions.php
maintenance/deleteRevision.php
maintenance/deleteSelfExternals.php
maintenance/dev/includes/router.php
maintenance/dictionary/mediawiki.dic [new file with mode: 0644]
maintenance/doMaintenance.php
maintenance/dumpBackup.php
maintenance/dumpIterator.php
maintenance/dumpLinks.php
maintenance/dumpSisterSites.php
maintenance/dumpTextPass.php
maintenance/dumpUploads.php
maintenance/edit.php
maintenance/eraseArchivedFile.php [new file with mode: 0644]
maintenance/eval.php
maintenance/fetchText.php
maintenance/fileOpPerfTest.php
maintenance/findHooks.php
maintenance/fixDoubleRedirects.php
maintenance/fixExtLinksProtocolRelative.php
maintenance/fixSlaveDesync.php
maintenance/fixTimestamps.php
maintenance/fixUserRegistration.php
maintenance/formatInstallDoc.php
maintenance/fuzz-tester.php
maintenance/generateSitemap.php
maintenance/getConfiguration.php
maintenance/getLagTimes.php
maintenance/getSlaveServer.php
maintenance/getText.php
maintenance/hiphop/compiler.conf [deleted file]
maintenance/hiphop/extra-files [deleted file]
maintenance/hiphop/make [deleted file]
maintenance/hiphop/run-server [changed mode: 0644->0755]
maintenance/hiphop/server.conf
maintenance/importDump.php
maintenance/importImages.inc
maintenance/importImages.php
maintenance/importSiteScripts.php
maintenance/importTextFile.php
maintenance/initEditCount.php
maintenance/initSiteStats.php
maintenance/install.php
maintenance/jsduck/MetaTags.rb
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/jsduck/external.js
maintenance/jsparse.php
maintenance/lag.php
maintenance/language/StatOutputs.php
maintenance/language/alltrans.php
maintenance/language/checkDupeMessages.php
maintenance/language/checkExtensions.php
maintenance/language/checkLanguage.inc
maintenance/language/checkLanguage.php
maintenance/language/countMessages.php
maintenance/language/date-formats.php
maintenance/language/digit2html.php
maintenance/language/dumpMessages.php
maintenance/language/generateCollationData.php
maintenance/language/generateNormalizerData.php
maintenance/language/langmemusage.php
maintenance/language/languages.inc
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/language/rebuildLanguage.php
maintenance/language/transstat.php
maintenance/language/validate.php
maintenance/language/writeMessagesArray.inc
maintenance/mcc.php
maintenance/mctest.php
maintenance/mergeMessageFileList.php
maintenance/migrateUserGroup.php
maintenance/minify.php
maintenance/moveBatch.php
maintenance/mssql/tables.sql
maintenance/mwdoc-filter.php
maintenance/mwdocgen.php
maintenance/mwjsduck-gen
maintenance/namespaceDupes.php
maintenance/nextJobDB.php
maintenance/nukeNS.php
maintenance/nukePage.php
maintenance/oracle/alterSharedConstraints.php
maintenance/oracle/tables.sql
maintenance/orphans.php
maintenance/parse.php
maintenance/patchSql.php
maintenance/populateCategory.php
maintenance/populateFilearchiveSha1.php
maintenance/populateImageSha1.php
maintenance/populateLogSearch.php
maintenance/populateLogUsertext.php
maintenance/populateParentId.php
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/postgres/archives/patch-external_user.sql [deleted file]
maintenance/postgres/archives/patch-kill-iwl_pft.sql [deleted file]
maintenance/postgres/archives/patch-rename-iwl_prefix.sql
maintenance/postgres/tables.sql
maintenance/preprocessDump.php
maintenance/preprocessorFuzzTest.php
maintenance/protect.php
maintenance/proxyCheck.php
maintenance/pruneFileCache.php
maintenance/purgeDeletedFiles.php
maintenance/purgeList.php
maintenance/purgeOldText.inc
maintenance/purgeOldText.php
maintenance/purgeParserCache.php
maintenance/reassignEdits.php
maintenance/rebuildFileCache.php
maintenance/rebuildImages.php
maintenance/rebuildLocalisationCache.php
maintenance/rebuildall.php
maintenance/rebuildmessages.php
maintenance/rebuildrecentchanges.php
maintenance/rebuildtextindex.php
maintenance/refreshFileHeaders.php
maintenance/refreshImageMetadata.php
maintenance/refreshLinks.php
maintenance/removeUnusedAccounts.php
maintenance/renameDbPrefix.php
maintenance/renderDump.php
maintenance/resetUserTokens.php
maintenance/rollbackEdits.php
maintenance/runBatchedQuery.php
maintenance/runJobs.php
maintenance/showCacheStats.php
maintenance/showJobs.php
maintenance/showSiteStats.php
maintenance/sql.php
maintenance/sqlite.inc
maintenance/sqlite.php
maintenance/sqlite/archives/patch-kill-iwl_pft.sql [deleted file]
maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
maintenance/storage/checkStorage.php
maintenance/storage/compressOld.php
maintenance/storage/dumpRev.php
maintenance/storage/fixBug20757.php
maintenance/storage/moveToExternal.php
maintenance/storage/orphanStats.php
maintenance/storage/recompressTracked.php
maintenance/storage/resolveStubs.php
maintenance/storage/storageTypeStats.php
maintenance/storage/testCompression.php
maintenance/storage/trackBlobs.php
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/undelete.php
maintenance/update.php
maintenance/updateArticleCount.php
maintenance/updateCollation.php
maintenance/updateDoubleWidthSearch.php
maintenance/updateRestrictions.php
maintenance/updateSearchIndex.php
maintenance/updateSpecialPages.php
maintenance/userDupes.inc
maintenance/userOptions.inc
maintenance/userOptions.php
maintenance/waitForSlave.php
mw-config/index.php
opensearch_desc.php
profileinfo.php
redirect.php [deleted file]
redirect.php5 [deleted file]
redirect.phtml [deleted file]
resources/Resources.php
resources/jquery.chosen/LICENSE [new file with mode: 0644]
resources/jquery.chosen/chosen-sprite.png [new file with mode: 0644]
resources/jquery.chosen/chosen-sprite@2x.png [new file with mode: 0644]
resources/jquery.chosen/chosen.css [new file with mode: 0644]
resources/jquery.chosen/chosen.jquery.js [new file with mode: 0644]
resources/jquery.ui/themes/vector/images/button-blue-hover-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-blue-hover.png [deleted file]
resources/jquery.ui/themes/vector/images/button-blue-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-disabled-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-disabled-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-disabled-red.png [deleted file]
resources/jquery.ui/themes/vector/images/button-disabled.png [deleted file]
resources/jquery.ui/themes/vector/images/button-down-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-down-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-down-red.png [deleted file]
resources/jquery.ui/themes/vector/images/button-down.png [deleted file]
resources/jquery.ui/themes/vector/images/button-green-hover-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-green-hover.png [deleted file]
resources/jquery.ui/themes/vector/images/button-green-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-large-disabled-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-large-off-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-off-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-off-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-off-red.png [deleted file]
resources/jquery.ui/themes/vector/images/button-off.png [deleted file]
resources/jquery.ui/themes/vector/images/button-orange-hover-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-orange-hover.png [deleted file]
resources/jquery.ui/themes/vector/images/button-orange-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-orange.png [deleted file]
resources/jquery.ui/themes/vector/images/button-over-blue.png [deleted file]
resources/jquery.ui/themes/vector/images/button-over-green.png [deleted file]
resources/jquery.ui/themes/vector/images/button-over-red.png [deleted file]
resources/jquery.ui/themes/vector/images/button-over.png [deleted file]
resources/jquery.ui/themes/vector/images/button-red-hover-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-red-hover.png [deleted file]
resources/jquery.ui/themes/vector/images/button-red-large.png [deleted file]
resources/jquery.ui/themes/vector/images/button-red.png [deleted file]
resources/jquery.ui/themes/vector/jquery.ui.button.css [changed mode: 0644->0755]
resources/jquery/jquery.badge.css
resources/jquery/jquery.byteLimit.js
resources/jquery/jquery.makeCollapsible.js
resources/jquery/jquery.tablesorter.js
resources/jquery/jquery.textSelection.js
resources/mediawiki.action/images/green-checkmark.png [new file with mode: 0644]
resources/mediawiki.action/mediawiki.action.edit.editWarning.js [new file with mode: 0644]
resources/mediawiki.action/mediawiki.action.edit.js
resources/mediawiki.action/mediawiki.action.view.postEdit.css [new file with mode: 0644]
resources/mediawiki.action/mediawiki.action.view.postEdit.js
resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/mediawiki.api/mediawiki.api.category.js
resources/mediawiki.api/mediawiki.api.edit.js
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.api/mediawiki.api.parse.js
resources/mediawiki.api/mediawiki.api.watch.js
resources/mediawiki.libs/mediawiki.libs.jpegmeta.js
resources/mediawiki.page/mediawiki.page.watch.ajax.js
resources/mediawiki.special/images/arrow-collapsed-ltr.png [deleted file]
resources/mediawiki.special/images/arrow-collapsed-rtl.png [deleted file]
resources/mediawiki.special/images/arrow-expanded.png [deleted file]
resources/mediawiki.special/images/glyph-people-large.png [new file with mode: 0644]
resources/mediawiki.special/images/icon-contributors.png [new file with mode: 0644]
resources/mediawiki.special/images/icon-edits.png [new file with mode: 0644]
resources/mediawiki.special/images/icon-lock.png [new file with mode: 0644]
resources/mediawiki.special/images/icon-pages.png [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.changeslist.css
resources/mediawiki.special/mediawiki.special.createAccount.vform.css [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.createAccount.vform.js [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.preferences.css
resources/mediawiki.special/mediawiki.special.userLogin.vform.css [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.vforms.css [new file with mode: 0644]
resources/mediawiki.ui/mediawiki.ui.default.css [new file with mode: 0644]
resources/mediawiki.ui/mediawiki.ui.vector.css [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/Makefile [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/config.rb [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/_default.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss [new file with mode: 0644]
resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss [new file with mode: 0644]
resources/mediawiki/images/arrow-collapsed-ltr.png [new file with mode: 0644]
resources/mediawiki/images/arrow-collapsed-rtl.png [new file with mode: 0644]
resources/mediawiki/images/arrow-expanded.png [new file with mode: 0644]
resources/mediawiki/mediawiki.Uri.js
resources/mediawiki/mediawiki.debug.js
resources/mediawiki/mediawiki.htmlform.js
resources/mediawiki/mediawiki.icon.css [new file with mode: 0644]
resources/mediawiki/mediawiki.jqueryMsg.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.log.js
resources/mediawiki/mediawiki.searchSuggest.js
resources/mediawiki/mediawiki.user.js
resources/mediawiki/mediawiki.util.js
resources/startup.js
serialized/serialize.php
skins/Chick.php [deleted file]
skins/CologneBlue.php
skins/Modern.php
skins/MonoBook.php
skins/MySkin.php [deleted file]
skins/Nostalgia.php [deleted file]
skins/Simple.php [deleted file]
skins/Standard.php [deleted file]
skins/Vector.php
skins/chick/IE60Fixes.css [deleted file]
skins/chick/main.css [deleted file]
skins/cologneblue/print.css [new file with mode: 0644]
skins/common/ajax.js
skins/common/commonElements.css
skins/common/commonPrint.css
skins/common/images/question-small.png [new file with mode: 0644]
skins/common/images/question.svg [new file with mode: 0644]
skins/common/oldshared.css
skins/common/shared.css
skins/common/wikibits.js
skins/common/wikiprintable.css
skins/modern/main.css
skins/modern/print.css
skins/monobook/FF2Fixes.css [deleted file]
skins/monobook/Opera6Fixes.css [deleted file]
skins/monobook/Opera7Fixes.css [deleted file]
skins/monobook/Opera9Fixes.css [deleted file]
skins/monobook/main.css
skins/myskin/main.css [deleted file]
skins/nostalgia/screen.css [deleted file]
skins/simple/discussionitem_icon.gif [deleted file]
skins/simple/external.png [deleted file]
skins/simple/file_icon.gif [deleted file]
skins/simple/link_icon.gif [deleted file]
skins/simple/lock_icon.gif [deleted file]
skins/simple/mail_icon.gif [deleted file]
skins/simple/main.css [deleted file]
skins/standard/main.css [deleted file]
skins/vector/images/user-icon.svg [new file with mode: 0644]
skins/vector/screen.css
tests/RunSeleniumTests.php
tests/TestsAutoLoader.php
tests/parser/ParserTestResult.php [new file with mode: 0644]
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/parserTests.php
tests/phpunit/AutoLoaderTest.php [deleted file]
tests/phpunit/MediaWikiLangTestCase.php
tests/phpunit/MediaWikiPHPUnitCommand.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/StructureTest.php [deleted file]
tests/phpunit/bootstrap.php
tests/phpunit/data/db/sqlite/tables-1.16.sql
tests/phpunit/data/db/sqlite/tables-1.17.sql
tests/phpunit/data/db/sqlite/tables-1.18.sql
tests/phpunit/data/xmp/7.result.php
tests/phpunit/includes/ArticleTablesTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/CdbTest.php
tests/phpunit/includes/CollationTest.php [new file with mode: 0644]
tests/phpunit/includes/DiffHistoryBlobTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/FauxRequestTest.php [new file with mode: 0644]
tests/phpunit/includes/FauxResponseTest.php
tests/phpunit/includes/FormOptionsInitializationTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/GlobalWithDBTest.php
tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
tests/phpunit/includes/GlobalFunctions/wfShorthandToIntegerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/HTMLCheckMatrixTest.php [new file with mode: 0644]
tests/phpunit/includes/HashRingTest.php [new file with mode: 0644]
tests/phpunit/includes/HooksTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/JsonTest.php [deleted file]
tests/phpunit/includes/LanguageConverterTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/MWFunctionTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PathRouterTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/Providers.php
tests/phpunit/includes/RecentChangeTest.php
tests/phpunit/includes/RequestContextTest.php
tests/phpunit/includes/ResourceLoaderTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SeleniumConfigurationTest.php
tests/phpunit/includes/SiteConfigurationTest.php
tests/phpunit/includes/StringUtilsTest.php
tests/phpunit/includes/TemplateCategoriesTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TimeAdjustTest.php
tests/phpunit/includes/TimestampTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
tests/phpunit/includes/XmlSelectTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiAccountCreationTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiPurgeTest.php
tests/phpunit/includes/api/ApiTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiTestCaseUpload.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/api/RandomImageGenerator.php
tests/phpunit/includes/api/format/ApiFormatPhpTest.php
tests/phpunit/includes/api/generateRandomImages.php
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
tests/phpunit/includes/api/query/ApiQueryContinueTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/api/query/ApiQueryTestBase.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/cache/ProcessCacheLRUTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/db/DatabaseTestHelper.php [new file with mode: 0644]
tests/phpunit/includes/db/ORMRowTest.php
tests/phpunit/includes/db/ORMTableTest.php
tests/phpunit/includes/db/TestORMRowTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/FileRepoTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/installer/InstallDocFormatterTest.php
tests/phpunit/includes/installer/OracleInstallerTest.php [new file with mode: 0644]
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/json/FormatJsonTest.php [new file with mode: 0644]
tests/phpunit/includes/json/ServicesJsonTest.php [deleted file]
tests/phpunit/includes/libs/CSSJanusTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/GenericArrayObjectTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/BitmapScalingTest.php
tests/phpunit/includes/media/ExifRotationTest.php
tests/phpunit/includes/media/ExifTest.php
tests/phpunit/includes/media/IPTCTest.php
tests/phpunit/includes/media/PNGMetadataExtractorTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/media/XMPTest.php
tests/phpunit/includes/media/XMPValidateTest.php
tests/phpunit/includes/normal/CleanUpTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.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/ParserPreloadTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/search/SearchUpdateTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/site/SiteListTest.php
tests/phpunit/includes/site/SiteSQLStoreTest.php
tests/phpunit/includes/site/SiteTest.php
tests/phpunit/includes/site/TestSites.php
tests/phpunit/includes/specials/SpecialPreferencesTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/upload/UploadBaseTest.php [new file with mode: 0644]
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/upload/UploadTest.php [deleted file]
tests/phpunit/install-phpunit.sh
tests/phpunit/languages/LanguageAmTest.php
tests/phpunit/languages/LanguageArTest.php
tests/phpunit/languages/LanguageBeTest.php
tests/phpunit/languages/LanguageBe_taraskTest.php
tests/phpunit/languages/LanguageBhoTest.php
tests/phpunit/languages/LanguageBsTest.php
tests/phpunit/languages/LanguageClassesTestCase.php
tests/phpunit/languages/LanguageCsTest.php
tests/phpunit/languages/LanguageCuTest.php
tests/phpunit/languages/LanguageCyTest.php
tests/phpunit/languages/LanguageDsbTest.php
tests/phpunit/languages/LanguageFrTest.php
tests/phpunit/languages/LanguageGaTest.php
tests/phpunit/languages/LanguageGdTest.php
tests/phpunit/languages/LanguageGvTest.php
tests/phpunit/languages/LanguageHeTest.php
tests/phpunit/languages/LanguageHiTest.php
tests/phpunit/languages/LanguageHrTest.php
tests/phpunit/languages/LanguageHsbTest.php
tests/phpunit/languages/LanguageHuTest.php
tests/phpunit/languages/LanguageHyTest.php
tests/phpunit/languages/LanguageKshTest.php
tests/phpunit/languages/LanguageLnTest.php
tests/phpunit/languages/LanguageLtTest.php
tests/phpunit/languages/LanguageLvTest.php
tests/phpunit/languages/LanguageMgTest.php
tests/phpunit/languages/LanguageMkTest.php
tests/phpunit/languages/LanguageMlTest.php
tests/phpunit/languages/LanguageMoTest.php
tests/phpunit/languages/LanguageMtTest.php
tests/phpunit/languages/LanguageNsoTest.php
tests/phpunit/languages/LanguagePlTest.php
tests/phpunit/languages/LanguageRoTest.php
tests/phpunit/languages/LanguageRuTest.php
tests/phpunit/languages/LanguageSeTest.php
tests/phpunit/languages/LanguageSgsTest.php
tests/phpunit/languages/LanguageShTest.php
tests/phpunit/languages/LanguageSkTest.php
tests/phpunit/languages/LanguageSlTest.php
tests/phpunit/languages/LanguageSmaTest.php
tests/phpunit/languages/LanguageSrTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/LanguageTiTest.php
tests/phpunit/languages/LanguageTlTest.php
tests/phpunit/languages/LanguageTrTest.php
tests/phpunit/languages/LanguageUkTest.php
tests/phpunit/languages/LanguageUzTest.php
tests/phpunit/languages/LanguageWaTest.php
tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupPrefetchTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/backup_LogTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/maintenance/getSlaveServerTest.php
tests/phpunit/mocks/filebackend/MockFSFile.php [new file with mode: 0644]
tests/phpunit/mocks/filebackend/MockFileBackend.php [new file with mode: 0644]
tests/phpunit/mocks/media/MockBitmapHandler.php [new file with mode: 0644]
tests/phpunit/phpunit.php
tests/phpunit/resources/ResourcesTest.php [deleted file]
tests/phpunit/skins/SideBarTest.php
tests/phpunit/structure/AutoLoaderTest.php [new file with mode: 0644]
tests/phpunit/structure/ResourcesTest.php [new file with mode: 0644]
tests/phpunit/structure/StructureTest.php [new file with mode: 0644]
tests/phpunit/suite.xml
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/generateJqueryMsgData.php
tests/qunit/data/load.mock.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js [new file with mode: 0644]
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/qunit/suites/resources/startup.test.js [new file with mode: 0644]
tests/selenium/Selenium.php
tests/selenium/SeleniumLoader.php
tests/selenium/SeleniumServerManager.php
tests/selenium/SeleniumTestCase.php
tests/selenium/SeleniumTestHTMLLogger.php
tests/selenium/installer/MediaWikiButtonsAvailabilityTestCase.php
tests/selenium/installer/MediaWikiDifferentDatabaseAccountTestCase.php
tests/selenium/installer/MediaWikiDifferntDatabasePrefixTestCase.php
tests/selenium/installer/MediaWikiErrorsConnectToDatabasePageTestCase.php
tests/selenium/installer/MediaWikiErrorsNamepageTestCase.php
tests/selenium/installer/MediaWikiHelpFieldHintTestCase.php
tests/selenium/installer/MediaWikiInstallationCommonFunction.php
tests/selenium/installer/MediaWikiInstallerTestSuite.php
tests/selenium/installer/MediaWikiMySQLDataBaseTestCase.php
tests/selenium/installer/MediaWikiMySQLiteDataBaseTestCase.php
tests/selenium/installer/MediaWikiOnAlreadyInstalledTestCase.php
tests/selenium/installer/MediaWikiRestartInstallationTestCase.php
tests/selenium/installer/MediaWikiRightFrameworkLinksTestCase.php
tests/selenium/installer/MediaWikiUpgradeExistingDatabaseTestCase.php
tests/selenium/installer/MediaWikiUserInterfaceTestCase.php
tests/selenium/suites/AddContentToNewPageTestCase.php
tests/selenium/suites/SimpleSeleniumTestSuite.php
tests/testHelpers.inc
thumb.php
thumb_handler.php
wiki.phtml

index ca87d93..9c0c3b6 100644 (file)
@@ -7,6 +7,8 @@
 # Editors
 *.kate-swp
 *~
+\#*#
+.#*
 .*.swp
 .project
 cscope.files
@@ -14,7 +16,9 @@ cscope.out
 ## NetBeans
 nbproject*
 project.index
+## Sublime
 sublime-*
+sftp-config.json
 
 # MediaWiki install & usage
 /cache
index 3869deb..ad5e959 100644 (file)
@@ -1,3 +1,7 @@
+# Generated documentation
+docs/html/
+docs/js/
+
 # third-party libs
 extensions/
 node_modules/
@@ -19,9 +23,13 @@ resources/jquery.effects/
 resources/jquery.tipsy/
 resources/jquery.ui/
 resources/mediawiki.libs/
+resources/jquery.chosen/chosen.jquery.js
 
 # legacy scripts
-skins/common/
+skins/common/IEFixes.js
+skins/common/config.js
+skins/common/protect.js
+skins/common/upload.js
 
 # github.com/jshint/jshint/issues/729
 tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
index 7fa138d..c4e265a 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,15 +1,10 @@
 {
-       "predef": [
-               "mediaWiki",
-               "jQuery",
-               "QUnit"
-       ],
+       /* Common */
 
-       "bitwise": true,
+       // Enforcing
        "camelcase": true,
        "curly": true,
        "eqeqeq": true,
-       "forin": false,
        "immed": true,
        "latedef": true,
        "newcap": true,
        "noempty": true,
        "nonew": true,
        "quotmark": "single",
-       "regexp": false,
+       "trailing": true,
        "undef": true,
        "unused": true,
-       "strict": false,
-       "trailing": true,
+       // Legacy
+       "onevar": true,
+
+       /* Local */
 
+       // Enforcing
+       "bitwise": true,
+       "forin": false,
+       "regexp": false,
+       "strict": false,
+       // Relaxing
        "laxbreak": true,
        "smarttabs": true,
        "multistr": true,
-
+       // Environment
        "browser": true,
-
+       // Legacy
        "nomen": true,
-       "onevar": true
+
+       "predef": [
+               "mediaWiki",
+               "jQuery",
+               "QUnit"
+       ]
 }
diff --git a/CREDITS b/CREDITS
index 9c49a9b..417bec3 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,4 +1,4 @@
-MediaWiki 1.21 is a collaborative project released under the
+MediaWiki 1.22 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.
 
@@ -80,7 +80,7 @@ following names for their contribution to the product.
 * Thomas Bleher
 * Tim Starling
 * Timo Tijhof
-* Tom Gries
+* Thomas Gries
 * Trevor Parscal
 * Victor Vasiliev
 * Yesid Carrillo
@@ -143,6 +143,7 @@ following names for their contribution to the product.
 * Jimmy Xu
 * Jonathan Wiltshire
 * John N
+* JuneHyeon Bae
 * Jure Kajzer
 * Karun Dambiec
 * Katie Filbert
@@ -159,7 +160,7 @@ following names for their contribution to the product.
 * Manuel Menal
 * Marcin Cieślak
 * Marcus Buck
-* Mark A. Pelletier
+* Marc-André Pelletier
 * Mark Hershberger
 * Mark Holmquist
 * Marooned
diff --git a/HISTORY b/HISTORY
index 02ba8d8..45eab2e 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,337 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.21.
+Change notes from older releases. For current info see RELEASE-NOTES-1.22.
+
+== MediaWiki 1.21 ==
+
+MediaWiki 1.21 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.21 ===
+* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
+* Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
+  instead.
+* (bug 39957) Added $wgUnwatchedPageThreshold, specifying minimum count
+  of page watchers required for the number to be accessible to users
+  without the unwatchedpages permission.
+* $wgBug34832TransitionalRollback has been removed.
+* (bug 29472) $wgUseDynamicDates has been removed and its functionality
+  disabled.
+
+=== New features in 1.21 ===
+* (bug 38110) Schema changes (adding or dropping tables, indices and
+  fields) can be now be done separately from from other changes that
+  update.php makes.  This is useful in environments that use database
+  permissions to restrict schema changes but allow the DB user that
+  MediaWiki normally runs as to perform other changes that update.php
+  makes.  Schema changes can be run separately.  See the file UPGRADE
+  for more information.
+* (bug 34876) jquery.makeCollapsible has been improved in performance.
+* Added ContentHandler facility to allow extensions to support other content
+  than wikitext. See docs/contenthandler.txt for details.
+* New feature was developed for showing high-DPI thumbnails for high-DPI mobile
+  and desktop displays (configurable with $wgResponsiveImages).
+* Added new backend to represent and store information about sites and site
+  specific configuration.
+* jQuery upgraded from 1.8.2 to 1.8.3.
+* jQuery UI upgraded from 1.8.23 to 1.8.24.
+* Added separate fa_sha1 field to filearchive table. This allows sha1
+  searches with the api in miser mode for deleted files.
+* Add initial and programmatic sorting for tablesorter.
+* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
+* The Job system was refactored to allow for different backing stores for
+  queues as well as cross-wiki access to queues, among other things. The schema
+  for the DB queue was changed to support better concurrency and reduce
+  deadlock errors.
+* Added ApiQueryORM class to facilitate creation of query API modules based on
+  tables that have a corresponding ORMTable class.
+* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
+* (bug 40641) Implemented Special:Version/Credits with a list of contributors.
+* (bug 7851) Implemented one-click AJAX patrolling.
+* The <data>, <time>, <meta>, and <link> elements are allowed within WikiText
+  for use with Microdata.
+* The HTML5 <mark> tag has been whitelisted.
+* Added ParserCloned hook for when the Parser object is cloned.
+* Added AlternateEditPreview hook to allow extensions to replace the page
+  preview from the edit page.
+* Added EditPage::showStandardInputs:options hook to allow extensions to add
+  new fields to the "editOptions" area of the edit form.
+* Upload stash DB schema altered to improve upload performance.
+* The following global functions are now reporting deprecated warnings in
+  debug mode: wfMsg, wfMsgNoTrans, wfMsgForContent, wfMsgForContentNoTrans,
+  wfMsgReal, wfMsgGetKey, wfMsgHtml, wfMsgWikiHtml, wfMsgExt, wfEmptyMsg. Use
+  the Message class, or the global method wfMessage.
+* Added $wgEnableCanonicalServerLink, off by default. If enabled, a
+  <link rel=canonical> tag is added to every page indicating the correct server
+  to use.
+* Debug message emitted by wfDebugLog() will now be prefixed with the group
+  name when its logged to the default log file. That is the case whenever the
+  group has no key in wgDebugLogGroups, that will help triage the default log.
+* (bug 24620) Add types to LogFormatter.
+* jQuery JSON upgraded from 2.3 to 2.4.0.
+* Added GetDoubleUnderscoreIDs hook, for modifying the list of magic words.
+* DatabaseUpdater class has two new methods to ease extensions schema changes:
+  dropExtensionIndex and renameExtensionIndex.
+* New preference type - 'api'. Preferences of this type are not shown on
+  Special:Preferences, but are still available via the action=options API.
+* (bug 39397) Hide rollback link if a user is the only contributor of the page.
+* $wgPageInfoTransclusionLimit limits the list size of transcluded articles
+  on the info action. Default is 50.
+* Added action=createaccount to allow user account creation.
+* (bug 40124) action=options API also allows for setting of arbitrary
+  preferences, provided that their names are prefixed with 'userjs-'. This
+  officially reenables the feature that was undocumented and defective
+  in MW 1.20 (saving preferences using Special:Preferences cleared any
+  additional fields) and which has been disabled in 1.20.1 as a part of
+  a security fix (bug 42202).
+* Added option to specify "others" as author in extension credits using
+  "..." as author name.
+* Added the ability to limit the wall clock time used by shell processes,
+  as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
+* Allow memory of shell subprocesses to be limited using Linux cgroups
+  instead of ulimit -v, which tends to cause deadlocks in recent versions
+  of ImageMagick. Configurable with $wgShellCgroup.
+* Added $wgWhitelistReadRegexp for regex whitelisting.
+* (bug 5346) Categories that are redirects will be displayed italic in
+  the category links section at the bottom of a page.
+* (bug 43915) New maintenance script deleteEqualMessages.php.
+* You can now create checkbox option matrices through the HTMLCheckMatrix
+  subclass in HTMLForm.
+* WikiText now permits the use of WAI-ARIA's role="presentation" inside of
+  html elements and tables. This allows presentational markup, especially
+  tables. To be marked up as such.
+* maintenance/sql.php learned the --cluster option. Let you run the script
+  on some external cluster instead of the primary cluster for a given wiki.
+* (bug 20281) test the parsing of inline URLs.
+* Added Special:PagesWithProp, which lists pages using a particular page property.
+* Implemented language-specific collations for category sorting for 67 languages
+  based in latin, greek and cyrillic alphabets. This allows one to *finally* get
+  articles to be correctly sorted on category pages. They are named
+  'uca-<langcode>', where <langcode> is one of: af, ast, az, be, bg, br, bs, ca,
+  co, cs, cy, da, de, dsb, el, en, eo, es, et, eu, fi, fo, fr, fur, fy, ga, gd,
+  gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
+  oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
+  uz, vi.
+* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
+* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
+* Added 'SpecialSearchResultsPrepend' and 'SpecialSearchResultsAppend' hooks.
+* (bug 33186) Add image rotation api "imagerotate"
+* (bug 34040) Add "User rights management" link on user page toolbox.
+* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
+  structual equality of HTML (ignoring insignificant differences like
+  quotmarks, order and whitespace in the attribute list).
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+  correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+  is now non-significant and not preserved in the HTML output.
+
+=== Bug fixes in 1.21 ===
+* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
+* (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
+* (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
+* (bug 34960) Drop unused fields rc_moved_to_ns and rc_moved_to_title from
+  recentchanges table.
+* (bug 32951) Do not register internal externals with absolute protocol,
+  when server has relative protocol.
+* (bug 39005) When purging proxies listed in $wgSquidServers using HTTP PURGE
+  method requests, we now send a Host header by default, for Varnish
+  compatibility. This also works with Squid in reverse-proxy mode. If you wish
+  to support Squid configured in forward-proxy mode, set
+  $wgSquidPurgeUseHostHeader to false.
+* (bug 37020) sql.php with readline eats semicolon.
+* (bug 11748) Properly handle optionally-closed HTML tags when Tidy is
+  disabled, and don't wrap HTML-syntax definition lists in paragraphs.
+* (bug 41409) Diffs while editing an old revision should again diff against the
+  current revision.
+* (bug 41494) Honor $wgLogExceptionBacktrace when logging non-API exceptions
+  caught during API execution.
+* (bug 37963) Fixed loading process for user options.
+* (bug 26995) Update filename field on Upload page after having sanitized it.
+* (bug 41793) Contribution links to users with 0 edits on Special:ListUsers
+  didn't show up red.
+* (bug 41899) A PHP notice no longer occurs when using the "rvcontinue" API
+  parameter.
+* (bug 42036) Account creation emails now contain canonical (not
+  protocol-relative) URLs.
+* (bug 41990) Fix regression: API edit with redirect=true and lacking
+  starttimestamp and basetimestamp should not cause an edit conflict.
+* (bug 41706) EditPage: Preloaded page should be converted if possible and
+  needed.
+* (bug 41886) Rowspans are no longer exploded by tablesorter until the table is
+  actually sorted.
+* (bug 2865)  User interface HTML elements don't use lang attribute.
+  (completed the fix by adding the lang attribute to firstHeading).
+* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
+* (bug 36053) Log in "returnto" feature forgets query parameters if no
+  title parameter was specified.
+* (bug 42410) API action=edit now returns correct timestamp for the new edit.
+* (bug 14901) Email notification mistakes log action for new page creation.
+  Enotif no longer sends "page has been created" notifications for some log
+  actions. The following events now have a correct message: page creation,
+  deletion, move, restore (undeletion), change (edit). Parameter
+  $CHANGEDORCREATED is deprecated in 'enotif_body' and scheduled for removal in
+  MediaWiki 1.23.
+* (bug 457) In the sidebar of Vector, CologneBlue, Monobook, and Monobook-based
+  skins, the heading levels have been changed from (variously per skin)
+  <h4>, <h5> or <h6> to only <h3>s, with a <h2> hidden heading above them.
+  If you are styling or scripting the headings in a custom way, this change
+  will require updates to your site's CSS or JS.
+* (bug 41342) jquery.suggestions should cancel any active (async) fetches
+  before it triggers another fetch.
+* (bug 42184) $wgUploadSizeWarning missing second variable.
+* (bug 34581) removeUnusedAccounts.php maintenance script now ignores newuser
+  log when determining whether an account is used.
+* (bug 43379) Gracefully fail if rev_len is unavailable for a revision on the
+  History page.
+* (bug 42949) API no longer assumes all exceptions are MWException.
+* (bug 41733) Hide "New user message" (.usermessage) element from printable view.
+* (bug 39062) Special:Contributions will display changes that don't have
+  a parent id instead of just an empty bullet item.
+* (bug 37209) "LinkCache doesn't currently know about this title" error fixed.
+* wfMerge() now works if $wgDiff3 contains spaces
+* (bug 43052) mediawiki.action.view.dblClickEdit.dblClickEdit should trigger
+  ca-edit click instead opening URL directly.
+* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
+  a fatal error.
+* (bug 44775) The username field is not pre-filled when creating an account.
+* (bug 45069) wfParseUrl() no longer produces a PHP notice if passed a "mailto:"
+  URL without address
+* (bug 45012) Creating an account by e-mail can no longer show a
+  "password mismatch" error.
+* (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
+  extensions) performed using Git 1.7.8+ should now appear.
+* (bug 42184) $wgUploadSizeWarning missing second variable
+* (bug 40326) Check if files exist with a different extension during uploading
+* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
+* (bug 42430) Calling numRows on MySQL no longer propagates unrelated errors.
+* (bug 44719) Removed mention of non-existing maintenance/migrateCurStubs.php
+  script in includes/DefaultSettings.php
+* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
+* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
+* (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
+
+=== API changes in 1.21 ===
+* prop=revisions can now report the contentmodel and contentformat.
+  See docs/contenthandler.txt.
+* action=edit and action=parse now support contentmodel and contentformat
+  parameters to control the interpretation of page content.
+  See docs/contenthandler.txt for details.
+* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata.
+* (bug 40111) Disable minor edit for page/section creation by API.
+* (bug 41042) Revert change to action=parse&page=... behavior when the page
+  does not exist.
+* (bug 27202) Add timestamp sort to list=allimages.
+* (bug 43137) Don't return the sha1 of revisions through the API if the content is
+  revision-deleted.
+* ApiQueryImageInfo now also returns imageinfo for redirects.
+* list=alltransclusions added to enumerate every instance of page embedding
+* list=alllinks & alltransclusions now allow both 'from' and 'continue' in
+  the same query. When both are present, 'from' is simply ignored.
+* list=alllinks & alltransclusions now allow 'unique' in generators, to yield
+  a list of all link/template target pages instead of source pages.
+* BREAKING CHANGE: list=logevents output format changed for details of some log
+  types. Specifically, details that were formerly reported under a key like
+  "4::foo" will now be reported under a key of simply "foo".
+* BREAKING CHANGE: '??_badcontinue' error code was changed to '??badcontinue'
+  for all query modules.
+* ApiQueryBase adds 'badcontinue' error code if module has 'continue' parameter.
+* (bug 35885) Removed version parameter and all getVersion() methods.
+* action=options now takes a "resetkinds" option, which allows only resetting
+  certain types of preferences when the "reset" option is set.
+* (bug 36751) ApiQueryImageInfo now returns imageinfo for the redirect target
+  when queried with &redirects=.
+* (bug 31849) ApiQueryImageInfo no longer gets confused when asked for info on
+  a redirect and its target.
+* (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
+  redirects.
+* On error, any warnings generated before that error will be shown in the result.
+* action=help supports generalized submodules (modules=query+value), querymodules obsolete
+* ApiQueryImageInfo continuation is more reliable. The only major change is
+  that the imagerepository property will no longer be set on page objects not
+  processed in the current query (i.e. non-images or those skipped due to
+  iicontinue).
+* Add supports for all pageset capabilities - generators, redirects, converttitles to
+  action=purge and action=setnotificationtimestamp.
+* (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
+* ApiQueryImageInfo will now limit the number of calls to File::transform made
+  in any one query. If there are too many, iicontinue will be returned.
+* action=query&meta=siteinfo&siprop=general will now return the regexes used for
+  link trails and link prefixes. Added for Parsoid support.
+* Added an API query module list=pageswithprop, which lists pages using a
+  particular page property.
+* Added an API query module list=pagepropnames, which lists all page prop names
+  currently in use on the wiki.
+* (bug 44921) ApiMain::execute() will now return after the CORS check for an
+  HTTP OPTIONS request.
+* (bug 44923) action=upload works correctly if the entire file is uploaded in
+  the first chunk.
+* Added 'continue=' parameter to streamline client iteration over complex query results
+* (bug 44909) API parameters may now be marked as type "upload", which is now
+  used for action=upload's 'file' and 'chunk' parameters. This type will raise
+  an error during parameter validation if the parameter is given but not
+  recognized as an uploaded file.
+* (bug 44244) prop=info may now return the number of people watching each page.
+* (bug 33304) list=allpages will no longer return duplicate entries when
+  querying protection.
+* (bug 33304) list=allpages will now find really old indefinite protections.
+* (bug 45937) meta=allmessages will report a syntactically invalid lang as a
+  proper error instead of as an uncaught exception.
+* (bug 25325) added support for wlshow filtering (bots/anon/minor/patrolled)
+  to action=feedwatchlist
+* WDDX formatted output will actually be formatted (and normal output will no
+  longer be), and will no longer choke on booleans.
+
+=== API internal changes in 1.21 ===
+* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
+  Never use on the production servers, as this flag introduces security holes.
+  Whenever enabled, a warning will also be added to all output.
+* ApiModuleManager now handles all submodules (actions,props,lists) and instantiation
+* Query stores prop/list/meta as submodules
+* ApiPageSet can now be used in any action to process titles/pageids/revids or any generator.
+* BREAKING CHANGE: ApiPageSet constructor now has two params instead of three, with only the
+  first one keeping its meaning. ApiPageSet is now derived from ApiBase.
+* BREAKING CHANGE: ApiQuery::newGenerator() and executeGeneratorModule() were deleted.
+* ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
+* $wgAPIGeneratorModules is now obsolete and will be ignored.
+* Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
+* Internal API calls will now include <warnings> in case of unused parameters
+
+=== Languages updated in 1.21 ===
+
+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.
+
+* South Azerbaijani (azb) added.
+* (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
+* (bug 45436) Autonym for pi (Pali) is now 'पालि' (was ''पाळि').
+* (bug 34977) Now formatted numbers in Spanish use space as separator
+  for thousands, as mandated by the Real Academia Española.
+* (bug 35031) Kurdish formatted numbers now use period and comma
+  as separators for thousands and decimals respectively.
+
+=== Other changes in 1.21 ===
+* BREAKING CHANGE: (bug 44385) Removed the jquery.collapsibleTabs module and
+  moved it to the Vector extension. It was entirely Vector-extension-specific,
+  deeply interconnected with the extension, and this functionality really
+  belongs to the extension instead of the skin anyway. In the unlikely case you
+  were using it, you have to either copy it to your extension, or install the
+  Vector extension (and possibly disable its features using config settings if
+  you don't want them).
+* Experimental IBM DB2 support was removed due to lack of interest and maintainership
+* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
+  lowerCamelCase format, and made more explicit:
+  - clear_stats.php -> clearCacheStats.php
+  - clear_interwiki_cache.php -> clearInterwikiCache.php
+  - initStats.php -> initSiteStats.php
+  - proxy_check.php -> proxyCheck.php
+  - stats.php -> showCacheStats.php
+  - showStats.php -> showSiteStats.php.
+  Class names were renamed accordingly:
+  - clear_stats -> ClearCacheStats
+  - InitStats -> InitSiteStats
+  - CacheStats -> ShowCacheStats
+  - ShowStats -> ShowSiteStats.
+* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
+  and moved it to the TitleBlacklist extension.
 
 == MediaWiki 1.20 ==
 
diff --git a/RELEASE-NOTES-1.21 b/RELEASE-NOTES-1.21
deleted file mode 100644 (file)
index 295eb7b..0000000
+++ /dev/null
@@ -1,392 +0,0 @@
-Security reminder: MediaWiki does not require PHP's register_globals. If you
-have it on, turn it '''off''' if you can.
-
-== MediaWiki 1.21 ==
-
-THIS IS NOT A RELEASE YET
-
-MediaWiki 1.21 is an alpha-quality branch and is not recommended for use in
-production.
-
-=== Configuration changes in 1.21 ===
-* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
-* Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
-  instead.
-* (bug 39957) Added $wgUnwatchedPageThreshold, specifying minimum count
-  of page watchers required for the number to be accessible to users
-  without the unwatchedpages permission.
-* $wgBug34832TransitionalRollback has been removed.
-* (bug 29472) $wgUseDynamicDates has been removed and its functionality
-  disabled.
-
-=== New features in 1.21 ===
-* (bug 38110) Schema changes (adding or dropping tables, indices and
-  fields) can be now be done separately from from other changes that
-  update.php makes.  This is useful in environments that use database
-  permissions to restrict schema changes but allow the DB user that
-  MediaWiki normally runs as to perform other changes that update.php
-  makes.  Schema changes can be run separately.  See the file UPGRADE
-  for more information.
-* (bug 34876) jquery.makeCollapsible has been improved in performance.
-* Added ContentHandler facility to allow extensions to support other content
-  than wikitext. See docs/contenthandler.txt for details.
-* New feature was developed for showing high-DPI thumbnails for high-DPI mobile
-  and desktop displays (configurable with $wgResponsiveImages).
-* Added new backend to represent and store information about sites and site
-  specific configuration.
-* jQuery upgraded from 1.8.2 to 1.8.3.
-* jQuery UI upgraded from 1.8.23 to 1.8.24.
-* Added separate fa_sha1 field to filearchive table. This allows sha1
-  searches with the api in miser mode for deleted files.
-* Add initial and programmatic sorting for tablesorter.
-* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
-* The Job system was refactored to allow for different backing stores for
-  queues as well as cross-wiki access to queues, among other things. The schema
-  for the DB queue was changed to support better concurrency and reduce
-  deadlock errors.
-* Added ApiQueryORM class to facilitate creation of query API modules based on
-  tables that have a corresponding ORMTable class.
-* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
-* (bug 40641) Implemented Special:Version/Credits with a list of contributors.
-* (bug 7851) Implemented one-click AJAX patrolling.
-* The <data>, <time>, <meta>, and <link> elements are allowed within WikiText
-  for use with Microdata.
-* The HTML5 <mark> tag has been whitelisted.
-* Added ParserCloned hook for when the Parser object is cloned.
-* Added AlternateEditPreview hook to allow extensions to replace the page
-  preview from the edit page.
-* Added EditPage::showStandardInputs:options hook to allow extensions to add
-  new fields to the "editOptions" area of the edit form.
-* Upload stash DB schema altered to improve upload performance.
-* The following global functions are now reporting deprecated warnings in
-  debug mode: wfMsg, wfMsgNoTrans, wfMsgForContent, wfMsgForContentNoTrans,
-  wfMsgReal, wfMsgGetKey, wfMsgHtml, wfMsgWikiHtml, wfMsgExt, wfEmptyMsg. Use
-  the Message class, or the global method wfMessage.
-* Added $wgEnableCanonicalServerLink, off by default. If enabled, a
-  <link rel=canonical> tag is added to every page indicating the correct server
-  to use.
-* Debug message emitted by wfDebugLog() will now be prefixed with the group
-  name when its logged to the default log file. That is the case whenever the
-  group has no key in wgDebugLogGroups, that will help triage the default log.
-* (bug 24620) Add types to LogFormatter.
-* jQuery JSON upgraded from 2.3 to 2.4.0.
-* Added GetDoubleUnderscoreIDs hook, for modifying the list of magic words.
-* DatabaseUpdater class has two new methods to ease extensions schema changes:
-  dropExtensionIndex and renameExtensionIndex.
-* New preference type - 'api'. Preferences of this type are not shown on
-  Special:Preferences, but are still available via the action=options API.
-* (bug 39397) Hide rollback link if a user is the only contributor of the page.
-* $wgPageInfoTransclusionLimit limits the list size of transcluded articles
-  on the info action. Default is 50.
-* Added action=createaccount to allow user account creation.
-* (bug 40124) action=options API also allows for setting of arbitrary
-  preferences, provided that their names are prefixed with 'userjs-'. This
-  officially reenables the feature that was undocumented and defective
-  in MW 1.20 (saving preferences using Special:Preferences cleared any
-  additional fields) and which has been disabled in 1.20.1 as a part of
-  a security fix (bug 42202).
-* Added option to specify "others" as author in extension credits using
-  "..." as author name.
-* Added the ability to limit the wall clock time used by shell processes,
-  as well as the CPU time. Configurable with $wgMaxShellWallClockTime.
-* Allow memory of shell subprocesses to be limited using Linux cgroups
-  instead of ulimit -v, which tends to cause deadlocks in recent versions
-  of ImageMagick. Configurable with $wgShellCgroup.
-* Added $wgWhitelistReadRegexp for regex whitelisting.
-* (bug 5346) Categories that are redirects will be displayed italic in
-  the category links section at the bottom of a page.
-* (bug 43915) New maintenance script deleteEqualMessages.php.
-* You can now create checkbox option matrices through the HTMLCheckMatrix
-  subclass in HTMLForm.
-* WikiText now permits the use of WAI-ARIA's role="presentation" inside of
-  html elements and tables. This allows presentational markup, especially
-  tables. To be marked up as such.
-* maintenance/sql.php learned the --cluster option. Let you run the script
-  on some external cluster instead of the primary cluster for a given wiki.
-* (bug 20281) test the parsing of inline URLs.
-* Added Special:PagesWithProp, which lists pages using a particular page property.
-* Implemented language-specific collations for category sorting for 67 languages
-  based in latin, greek and cyrillic alphabets. This allows one to *finally* get
-  articles to be correctly sorted on category pages. They are named
-  'uca-<langcode>', where <langcode> is one of: af, ast, az, be, bg, br, bs, ca,
-  co, cs, cy, da, de, dsb, el, en, eo, es, et, eu, fi, fo, fr, fur, fy, ga, gd,
-  gl, hr, hsb, hu, is, it, kk, kl, ku, ky, la, lb, lt, lv, mk, mo, mt, nl, no,
-  oc, pl, pt, rm, ro, ru, rup, sco, sk, sl, smn, sq, sr, sv, tk, tl, tr, tt, uk,
-  uz, vi.
-* Added 'CategoryAfterPageAdded' and 'CategoryAfterPageRemoved' hooks.
-* Added 'HistoryRevisionTools' and 'DiffRevisionTools' hooks.
-* (bug 33186) Add image rotation api "imagerotate"
-* (bug 34040) Add "User rights management" link on user page toolbox.
-* (bug 45526) Add QUnit assertion helper "QUnit.assert.htmlEqual" for asserting
-  structual equality of HTML (ignoring insignificant differences like
-  quotmarks, order and whitespace in the attribute list).
-
-=== Bug fixes in 1.21 ===
-* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
-* (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
-* (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
-* (bug 34960) Drop unused fields rc_moved_to_ns and rc_moved_to_title from
-  recentchanges table.
-* (bug 32951) Do not register internal externals with absolute protocol,
-  when server has relative protocol.
-* (bug 39005) When purging proxies listed in $wgSquidServers using HTTP PURGE
-  method requests, we now send a Host header by default, for Varnish
-  compatibility. This also works with Squid in reverse-proxy mode. If you wish
-  to support Squid configured in forward-proxy mode, set
-  $wgSquidPurgeUseHostHeader to false.
-* (bug 37020) sql.php with readline eats semicolon.
-* (bug 11748) Properly handle optionally-closed HTML tags when Tidy is
-  disabled, and don't wrap HTML-syntax definition lists in paragraphs.
-* (bug 41409) Diffs while editing an old revision should again diff against the
-  current revision.
-* (bug 41494) Honor $wgLogExceptionBacktrace when logging non-API exceptions
-  caught during API execution.
-* (bug 37963) Fixed loading process for user options.
-* (bug 26995) Update filename field on Upload page after having sanitized it.
-* (bug 41793) Contribution links to users with 0 edits on Special:ListUsers
-  didn't show up red.
-* (bug 41899) A PHP notice no longer occurs when using the "rvcontinue" API
-  parameter.
-* (bug 42036) Account creation emails now contain canonical (not
-  protocol-relative) URLs.
-* (bug 41990) Fix regression: API edit with redirect=true and lacking
-  starttimestamp and basetimestamp should not cause an edit conflict.
-* (bug 41706) EditPage: Preloaded page should be converted if possible and
-  needed.
-* (bug 41886) Rowspans are no longer exploded by tablesorter until the table is
-  actually sorted.
-* (bug 2865)  User interface HTML elements don't use lang attribute.
-  (completed the fix by adding the lang attribute to firstHeading).
-* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
-* (bug 36053) Log in "returnto" feature forgets query parameters if no
-  title parameter was specified.
-* (bug 42410) API action=edit now returns correct timestamp for the new edit.
-* (bug 14901) Email notification mistakes log action for new page creation.
-  Enotif no longer sends "page has been created" notifications for some log
-  actions. The following events now have a correct message: page creation,
-  deletion, move, restore (undeletion), change (edit). Parameter
-  $CHANGEDORCREATED is deprecated in 'enotif_body' and scheduled for removal in
-  MediaWiki 1.23.
-* (bug 457) In the sidebar of Vector, CologneBlue, Monobook, and Monobook-based
-  skins, the heading levels have been changed from (variously per skin)
-  <h4>, <h5> or <h6> to only <h3>s, with a <h2> hidden heading above them.
-  If you are styling or scripting the headings in a custom way, this change
-  will require updates to your site's CSS or JS.
-* (bug 41342) jquery.suggestions should cancel any active (async) fetches
-  before it triggers another fetch.
-* (bug 42184) $wgUploadSizeWarning missing second variable.
-* (bug 34581) removeUnusedAccounts.php maintenance script now ignores newuser
-  log when determining whether an account is used.
-* (bug 43379) Gracefully fail if rev_len is unavailable for a revision on the
-  History page.
-* (bug 42949) API no longer assumes all exceptions are MWException.
-* (bug 41733) Hide "New user message" (.usermessage) element from printable view.
-* (bug 39062) Special:Contributions will display changes that don't have
-  a parent id instead of just an empty bullet item.
-* (bug 37209) "LinkCache doesn't currently know about this title" error fixed.
-* wfMerge() now works if $wgDiff3 contains spaces
-* (bug 43052) mediawiki.action.view.dblClickEdit.dblClickEdit should trigger
-  ca-edit click instead opening URL directly.
-* (bug 43964) Invalid value of "link" parameter in <gallery> no longer produces
-  a fatal error.
-* (bug 44775) The username field is not pre-filled when creating an account.
-* (bug 45069) wfParseUrl() no longer produces a PHP notice if passed a "mailto:"
-  URL without address
-* (bug 45012) Creating an account by e-mail can no longer show a
-  "password mismatch" error.
-* (bug 44599) On Special:Version, HEADs for submodule checkouts (e.g. for
-  extensions) performed using Git 1.7.8+ should now appear.
-* (bug 42184) $wgUploadSizeWarning missing second variable
-* (bug 40326) Check if files exist with a different extension during uploading
-* (bug 34798) Updated CSS for Atom/RSS recent changes feeds to match on-wiki diffs.
-* (bug 42430) Calling numRows on MySQL no longer propagates unrelated errors.
-* (bug 44719) Removed mention of non-existing maintenance/migrateCurStubs.php
-  script in includes/DefaultSettings.php
-* (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
-* (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
-* (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
-
-=== API changes in 1.21 ===
-* prop=revisions can now report the contentmodel and contentformat.
-  See docs/contenthandler.txt.
-* action=edit and action=parse now support contentmodel and contentformat
-  parameters to control the interpretation of page content.
-  See docs/contenthandler.txt for details.
-* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata.
-* (bug 40111) Disable minor edit for page/section creation by API.
-* (bug 41042) Revert change to action=parse&page=... behavior when the page
-  does not exist.
-* (bug 27202) Add timestamp sort to list=allimages.
-* (bug 43137) Don't return the sha1 of revisions through the API if the content is
-  revision-deleted.
-* ApiQueryImageInfo now also returns imageinfo for redirects.
-* list=alltransclusions added to enumerate every instance of page embedding
-* list=alllinks & alltransclusions now allow both 'from' and 'continue' in
-  the same query. When both are present, 'from' is simply ignored.
-* list=alllinks & alltransclusions now allow 'unique' in generators, to yield
-  a list of all link/template target pages instead of source pages.
-* BREAKING CHANGE: list=logevents output format changed for details of some log
-  types. Specifically, details that were formerly reported under a key like
-  "4::foo" will now be reported under a key of simply "foo".
-* BREAKING CHANGE: '??_badcontinue' error code was changed to '??badcontinue'
-  for all query modules.
-* ApiQueryBase adds 'badcontinue' error code if module has 'continue' parameter.
-* (bug 35885) Removed version parameter and all getVersion() methods.
-* action=options now takes a "resetkinds" option, which allows only resetting
-  certain types of preferences when the "reset" option is set.
-* (bug 36751) ApiQueryImageInfo now returns imageinfo for the redirect target
-  when queried with &redirects=.
-* (bug 31849) ApiQueryImageInfo no longer gets confused when asked for info on
-  a redirect and its target.
-* (bug 43849) ApiQueryImageInfo no longer throws exceptions with ForeignDBRepo
-  redirects.
-* On error, any warnings generated before that error will be shown in the result.
-* action=help supports generalized submodules (modules=query+value), querymodules obsolete
-* ApiQueryImageInfo continuation is more reliable. The only major change is
-  that the imagerepository property will no longer be set on page objects not
-  processed in the current query (i.e. non-images or those skipped due to
-  iicontinue).
-* Add supports for all pageset capabilities - generators, redirects, converttitles to
-  action=purge and action=setnotificationtimestamp.
-* (bug 43251) prop=pageprops&ppprop= now accepts multiple props to query.
-* ApiQueryImageInfo will now limit the number of calls to File::transform made
-  in any one query. If there are too many, iicontinue will be returned.
-* action=query&meta=siteinfo&siprop=general will now return the regexes used for
-  link trails and link prefixes. Added for Parsoid support.
-* Added an API query module list=pageswithprop, which lists pages using a
-  particular page property.
-* Added an API query module list=pagepropnames, which lists all page prop names
-  currently in use on the wiki.
-* (bug 44921) ApiMain::execute() will now return after the CORS check for an
-  HTTP OPTIONS request.
-* (bug 44923) action=upload works correctly if the entire file is uploaded in
-  the first chunk.
-* Added 'continue=' parameter to streamline client iteration over complex query results
-* (bug 44909) API parameters may now be marked as type "upload", which is now
-  used for action=upload's 'file' and 'chunk' parameters. This type will raise
-  an error during parameter validation if the parameter is given but not
-  recognized as an uploaded file.
-* (bug 44244) prop=info may now return the number of people watching each page.
-* (bug 33304) list=allpages will no longer return duplicate entries when
-  querying protection.
-* (bug 33304) list=allpages will now find really old indefinite protections.
-* (bug 45937) meta=allmessages will report a syntactically invalid lang as a
-  proper error instead of as an uncaught exception.
-
-=== API internal changes in 1.21 ===
-* For debugging only, a new global $wgDebugAPI removes many API restrictions when true.
-  Never use on the production servers, as this flag introduces security holes.
-  Whenever enabled, a warning will also be added to all output.
-* ApiModuleManager now handles all submodules (actions,props,lists) and instantiation
-* Query stores prop/list/meta as submodules
-* ApiPageSet can now be used in any action to process titles/pageids/revids or any generator.
-* BREAKING CHANGE: ApiPageSet constructor now has two params instead of three, with only the
-  first one keeping its meaning. ApiPageSet is now derived from ApiBase.
-* BREAKING CHANGE: ApiQuery::newGenerator() and executeGeneratorModule() were deleted.
-* ApiQueryGeneratorBase::setGeneratorMode() now requires a pageset param.
-* $wgAPIGeneratorModules is now obsolete and will be ignored.
-* Added flags ApiResult::OVERRIDE and ADD_ON_TOP to setElement() and addValue()
-* Internal API calls will now include <warnings> in case of unused parameters
-
-=== Languages updated in 1.21 ===
-
-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.
-
-* South Azerbaijani (azb) added.
-* (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
-* (bug 45436) Autonym for pi (Pali) is now 'पालि' (was ''पाळि').
-* (bug 34977) Now formatted numbers in Spanish use space as separator
-  for thousands, as mandated by the Real Academia Española.
-* (bug 35031) Kurdish formatted numbers now use period and comma
-  as separators for thousands and decimals respectively.
-
-=== Other changes in 1.21 ===
-* BREAKING CHANGE: (bug 44385) Removed the jquery.collapsibleTabs module and
-  moved it to the Vector extension. It was entirely Vector-extension-specific,
-  deeply interconnected with the extension, and this functionality really
-  belongs to the extension instead of the skin anyway. In the unlikely case you
-  were using it, you have to either copy it to your extension, or install the
-  Vector extension (and possibly disable its features using config settings if
-  you don't want them).
-* Experimental IBM DB2 support was removed due to lack of interest and maintainership
-* BREAKING CHANGE: Filenames of maintenance scripts were standardized into
-  lowerCamelCase format, and made more explicit:
-  - clear_stats.php -> clearCacheStats.php
-  - clear_interwiki_cache.php -> clearInterwikiCache.php
-  - initStats.php -> initSiteStats.php
-  - proxy_check.php -> proxyCheck.php
-  - stats.php -> showCacheStats.php
-  - showStats.php -> showSiteStats.php.
-  Class names were renamed accordingly:
-  - clear_stats -> ClearCacheStats
-  - InitStats -> InitSiteStats
-  - CacheStats -> ShowCacheStats
-  - ShowStats -> ShowSiteStats.
-* BREAKING CHANGE: (bug 38244) Removed the mediawiki.api.titleblacklist module
-  and moved it to the TitleBlacklist extension.
-
-== Compatibility ==
-
-MediaWiki 1.21 requires PHP 5.3.2 or later.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for
-Oracle.
-
-The supported versions are:
-
-* MySQL 5.0.2 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-
-== Upgrading ==
-
-1.21 has several database changes since 1.20, 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.19.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/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22
new file mode 100644 (file)
index 0000000..c46d327
--- /dev/null
@@ -0,0 +1,271 @@
+Security reminder: MediaWiki does not require PHP's register_globals. If you
+have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.22 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.22 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.22 ===
+* $wgRedirectScript was removed. It was unused.
+* Removed $wgLocalMessageCacheSerialized, it is now always true.
+* When $wgUseVFormUserLogin is true, the redesign of Special:UserLogin is
+  activated; when $wgUseVFormCreateAccount is true, the redesign of
+  Special:UserLogin/signup is activated.
+* $wgVectorUseIconWatch is now enabled by default.
+* $wgCascadingRestrictionLevels was added.
+* ftps, ssh, sftp, xmpp, sip, sips, tel, sms, bitcoin, magnet, urn, and geo
+  have been whitelisted inside of $wgUrlProtocols.
+* $wgDocType and $wgDTD have been removed and are no longer used for the DOCTYPE.
+* $wgHtml5 is no longer used by core. Setting it to false will no longer disable HTML5.
+  It is still set to true for extension compatibility but doing so in extensions is deprecated.
+* $wgXhtmlDefaultNamespace is no longer used by core. Setting it will no longer change the
+  xmlns used by MediaWiki. Reliance on this variable by extensions is deprecated.
+* $wgHandheldStyle was removed.
+* $wgHandheldForIPhone was removed.
+* $wgJsMimeType is no longer used by core. Most usage has been removed since
+  HTML output is now exclusively HTML5.
+* $wgDBOracleDRCP added. True enables persistent connection with DRCP on Oracle.
+* $wgLogAutopatrol added to allow disabling logging of autopatrol edits in the logging table.
+  default for $wgLogAutopatrol is true.
+
+=== New features in 1.22 ===
+* (bug 44525) mediawiki.jqueryMsg can now parse (whitelisted) HTML elements and attributes.
+* (bug 33454) Language::sprintfDate now has a timezone parameter, and supports
+  the "eIOPTZ" formatting characters.
+* EditWarning: A warning is shown when an editor leaves the edit form without
+  saving (enabled by default, users can opt-out via the 'useeditwarning'
+  preference). This feature was moved from the Vector extension, and is now part
+  of core for all skins. Take care when upgrading that you don't use an older
+  version of the Vector extension as this feature may conflict.
+* New 'mediawiki.ui' CSS module providing mw-ui-* styles for buttons and a
+  compact vertical form layout.
+* New versions of login (Special:UserLogin) and create account
+  (Special:UserLogin/signup) forms. They are opt-in for now, controlled by
+  the $wgUseVFormUserLogin and $wgUseVFormCreateAccount settings or a 'useNew'
+  URL parameter trigger.
+* (bug 23343) Implemented ability to apply IP blocks to the contents of X-Forwarded-For headers
+  by adding a new configuration variable $wgApplyIpBlocksToXff (disabled by default).
+* The new hook 'APIGetPossibleErrors' to modify the list of possible errors was
+  added.
+* (bug 25592) LogEventsList::showLogExtract() will now ignore various
+  Pager-related WebRequest parameters by default, as this is overwhelmingly
+  likely to be what was intended by users of the method. If any caller wishes
+  to use these parameters, the new param 'useRequestParams' may be set to true.
+* mw.util.addPortletLink: Tooltip is no longer required to be plain (without
+  an accesskey in it already). As such it now rountrips. Creating a link with a
+  message as tooltip, grabbing the title attribute and using it to create
+  another portlet will work as expected.
+* (bug 6747) {{ROOTPAGENAME}} introduced, contains the name of the topmost
+  page without namespace.
+* BREAKING CHANGE: (bug 41729) Display editsection links next to headings. Also
+  change their class name from .editsection to .mw-editsection and place them at
+  the end of the heading element instead of the beginning. Client-side code and
+  screen-scrapers will have to be adjusted to handle both cases (old HTML will
+  still be visible on cached page renders until they are purged); extensions
+  using the DoEditSectionLink or EditSectionLink hooks might need adjustments as
+  well.
+* (bug 45535) introduced the new 'LanguageLinks' hook for manipulating the
+  language links associated with a page before display.
+* Chosen (http://harvesthq.github.io/chosen/) was added as module 'jquery.chosen'
+* HTMLForm will turn multiselect checkboxes into a Chosen interface when setting cssclass 'mw-chosen'
+* rebuildLocalisationCache learned --lang option. Let you rebuild l10n caches
+  of the specified languages instead of all of them.
+* New GetNewMessagesAlert hook allowing extensions to disable or modify the new
+  messages alert
+* New wgUserNewMsgRevisionId JS global for logged in users. This will be null
+  if the user has no new talk page messages. Otherwise it will be set to the
+  revision ID of the oldest new talk page message. This will allow gadgets and
+  extensions to create their own new message alerts on the client side.
+* mediawiki.log: Added log.warn wrapper (uses console.warn and console.trace).
+* mediawiki.log: Implemented log.deprecate. This method defines a property and
+  uses ES5 getter/setter to emit a warning when they are used.
+* $wgCascadingRestrictionLevels was added, allowing one to specify restriction levels
+  which can be cascading (previously 'sysop' was hard-coded as the only one).
+* XHTML5 support has been improved. If you set $wgMimeType = 'application/xhtml+xml'
+  MediaWiki will try outputting markup acording to XHTML5 rules.
+* New hook 'TitleSquidURLs' for manipulating the list of URLs to be purged from
+  HTTP caches when a page is changed.
+* Changed the patrolling system to always show the link for patrolling in case the
+  current revision is patrollable. This also removed the usage of the rcid URI parameters.
+* Oracle DB backend now supports Database Resident Connection Pooling (DRCP).
+  Can be enabled by setting $wgDBOracleDRCP=true.
+  Requires Oracle DB 11gR1 or above, enabled DRCP inside the DB itself and a
+  propper connect string.
+  More about DRCP can be found at:
+  http://www.oracle-base.com/articles/11g/database-resident-connection-pool-11gr1.php
+* Add a new parameter $patrolFooterShown to hook ArticleViewFooter so the hook
+  handlers can take further action based on the status of the patrol footer
+* LinkCache singleton can now be altered or cleared, letting one to specify
+  another instance that does not rely on a database backend.
+
+=== Bug fixes in 1.22 ===
+* Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
+  could still navigate to the page by entering the URL directly.
+* (bug 47138) Fixed a fatal error when a blocked user tries to automatically
+  create an account on login due external authentication in some circumstances.
+* (bug 23393) HTML <hN> headings containing line breaks are now handled
+  correctly.
+* (bug 45803) Whitespace within == Headline == syntax and within <hN> headings
+  is now non-significant and not preserved in the HTML output.
+* (bug 47218) Special:BlockList now handles correctly user names with spaces
+  when passed as subpage.
+* Pager's properly validate which fields are allowed to be sorted on.
+* mw.util.tooltipAccessKeyRegexp: The regex now matches "option-" as well.
+  Support for Mac "option" was added in 1.16, but the regex was never updated.
+* (bug 46768) Usernames of blocking users now display correctly, even if numeric.
+* (bug 39590) {{PAGESIZE}} for the current page and self-transclusions now
+  show the most up to date result always instead of being a revision behind.
+* A bias in wfRandomString() toward digits 1-7 has been corrected. Generated
+  strings will now start with digits 0 and 8-f as often as they should.
+* (bug 45371) Removed Parser_LinkHooks and CoreLinkFunctions classes.
+* (bug 41545) Allow <kbd>, <samp>, and <var> to be nested like allowed in html.
+* PLURAL magic word no longer causes a PHP notice when no matching form exists.
+* (bug 36641) Patrol page links no longer show on non-existent revisions.
+* (bug 35810) Pages not linked from Special:RecentChanges or Special:NewPages
+  are patrollable now.
+* (bug 30213) JavaScript for search suggestions is now disabled when the API
+  is disabled, and AJAX patrolling and watching are now disabled when use of
+  the write API is not allowed.
+* (bug 48294) API: Fix chunk upload async mode.
+
+=== API changes in 1.22 ===
+* (bug 46626) xmldoublequote parameter was removed. Because of a bug, the
+  parameter has had no effect since MediaWiki 1.16, and so its removal is
+  unlikely to impact existing clients.
+* (bug 47216) action=query&meta=siteinfo&siprop=skins will now indicate which
+  skin is the default and which are unusable (e.g. listed in $wgSkipSkins).
+* (bug 25325) Added support for wlshow filtering (bots/anon/minor/patrolled)
+  to action=feedwatchlist.
+* WDDX formatted output will actually be formatted (and normal output will no
+  longer be), and will no longer choke on booleans.
+* action=opensearch no longer silently ignores the format parameter.
+* action=opensearch now supports format=jsonfm.
+* list=usercontribs&ucprop=ids will now include the parent revision id.
+* BREAKING CHANGE: action=parse no longer returns all langlinks for the page
+  with prop=langlinks by default. The new effectivelanglinks parameter will
+  request that the LanguageLinks hook be called to determine the effective
+  language links.
+* BREAKING CHANGE: list=allpages, list=langbacklinks, and prop=langlinks do not
+  apply the new LanguageLinks hook, and thus only consider language links
+  stored in the database.
+* (bug 47219) Allow specifying change type of Wikipedia feed items
+* prop=imageinfo now allows setting iiurlheight without setting iiurlwidth
+* prop=info now adds the content model and page language of the title.
+* New upload log entries will now contain information on the relavent
+  image (sha1 and timestamp).
+
+=== Languages updated in 1.22===
+
+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.
+
+* Batak Toba (bbc-latn) added.
+* (bug 46751) Made Buryat (Russia) (буряад) (bxr) fallback to Russian.
+
+=== Other changes in 1.22 ===
+* redirect.php was removed. It was unused.
+* ClickTracking integration was dropped from the mediaWiki.user.bucket
+  JavaScript function. The 'tracked' option is now ignored.
+* BREAKING CHANGE: Legacy skins Simple, MySkin, Chick, Standard and Nostalgia
+  were all removed. (Nostalgia was moved to an extension.) The SkinLegacy and
+  LegacyTemplate classes that supported them were removed as well and are now a
+  part of the Nostalgia extension.
+* Event namespace used by jquery.makeCollapsible has been changed from
+  'mw-collapse' to 'mw-collapsible' for consistency with the module name.
+* BREAKING CHANGE: The "ExternalAuth" authentication subsystem was removed, along
+  with its associated globals of $wgExternalAuthType, $wgExternalAuthConf,
+  $wgAutocreatePolicy and $wgAllowPrefChange. Affected users are encouraged to
+  use AuthPlugin for external authentication/authorization needs.
+* The Quickbar feature of the legacy skin model and the last remnants of it
+  throughout the code base have been removed.
+* Externaledit/externaldiff preference was removed. Very few users used this
+  feature, and improper configuration can actually prevent a user from editing
+* Calling Linker methods using a skin will now output deprecation warnings.
+* (bug 46680) "Return to" links are no longer tagged with rel="next".
+* BREAKING CHANGE: mw.util.tooltipAccessKeyRegexp: The match group for the
+  accesskey character is now $6 instead of $5.
+* HipHop compiler (hphpc) support was removed. HipHop VM support (hhvm) was
+  added.
+* A new Special:Redirect page was added, providing lookup by revision ID,
+  user ID, or file name.  The old Special:Filepath page was reimplemented
+  to redirect through Special:Redirect.
+* Monobook: Removed the old conditional stylesheets for Opera 6, 7 and 9.
+* Support for XHTML 1.0 has been removed. MediaWiki now only outputs (X)HTML5.
+* wikibits: User-agent related globals have been deprecated. The following
+  properties now default to false and emit mw.log.warn: is_gecko, is_chrome_mac,
+  is_chrome, webkit_version, is_safari_win, is_safari, webkit_match, is_ff2,
+  ff2_bugs, is_ff2_win, is_ff2_x11, opera95_bugs, opera7_bugs, opera6_bugs,
+  is_opera_95, is_opera_preseven, is_opera, and ie6_bugs.
+* (bug 48276) MediaWiki will now flash a confirmation message upon successfully
+  editing a page.
+* (bug 40785) mediawiki.legacy.ajax has been marked as deprecated. The following
+  properties now emit mw.log.warn when accessed: sajax_debug, sajax_init_object,
+  sajax_do_call and wfSupportsAjax.
+
+== Compatibility ==
+
+MediaWiki 1.22 requires PHP 5.3.2 or later.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for
+Oracle.
+
+The supported versions are:
+
+* MySQL 5.0.2 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+
+== Upgrading ==
+
+1.22 has several database changes since 1.21, 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.21.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 7987b22..96b5836 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -296,18 +296,3 @@ If you have a very old database (earlier than organized MediaWiki releases
 in late August 2003) you may need to manually run some of the update SQL
 scripts in maintenance/archives before the installer is able to pick up
 with remaining updates.
-
-
-== Upgrading from UseModWiki or old "phase 2" Wikipedia code ==
-
-There is a semi-maintained UseModWiki to MediaWiki conversion script at
-maintenance/importUseModWiki.php; it may require tweaking and customization
-to work for you.
-
-Install a new MediaWiki first, then use the conversion script which will
-output SQL statements; direct these to a file and then run that into your
-database.
-
-You will have to rebuild the links tables etc after importing.
-
-
diff --git a/api.php b/api.php
index bc90229..8fab878 100644 (file)
--- a/api.php
+++ b/api.php
@@ -36,16 +36,12 @@ define( 'MW_API', true );
 // Bail if PHP is too low
 if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
        // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
-       require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
+       require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
        wfPHPVersionError( 'api.php' );
 }
 
 // Initialise common code.
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       require ( 'core/includes/WebStart.php' );
-} else {
-       require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 wfProfileIn( 'api.php' );
 $starttime = microtime( true );
@@ -58,8 +54,8 @@ if ( !$wgRequest->checkUrlExtension() ) {
 // Verify that the API has not been disabled
 if ( !$wgEnableAPI ) {
        header( $_SERVER['SERVER_PROTOCOL'] . ' 500 MediaWiki configuration Error', true, 500 );
-       echo( 'MediaWiki API is not enabled for this site. Add the following line to your LocalSettings.php'
-               . '<pre><b>$wgEnableAPI=true;</b></pre>' );
+       echo 'MediaWiki API is not enabled for this site. Add the following line to your LocalSettings.php'
+               . '<pre><b>$wgEnableAPI=true;</b></pre>';
        die( 1 );
 }
 
index c266dcc..02c9fad 100644 (file)
@@ -120,7 +120,7 @@ If the code is well enough isolated, it can even be excluded when not used --
 making for some slight savings in memory and load-up performance at runtime.
 Admins who want to have all the reversed titles can add:
 
-       require_once('extensions/ReverseTitle.php');
+       require_once 'extensions/ReverseTitle.php';
 
 ...to their LocalSettings.php file; those of us who don't want or need it can
 just leave it out.
@@ -270,6 +270,12 @@ $reason: the reason for the move (added in 1.13)
 $user: the User object about to be created (read-only, incomplete)
 &$msg: out parameter: HTML to display on abort
 
+'AbortChangePassword': Return false to cancel password change.
+$user: the User object to which the password change is occuring
+$mOldpass: the old password provided by the user
+$newpass: the new password provided by the user
+&$abortMsg: the message identifier for abort reason
+
 'ActionBeforeFormDisplay': Before executing the HTMLForm object.
 $name: name of the action
 &$form: HTMLForm object
@@ -371,6 +377,11 @@ result.
 &$module: ApiBase Module object
 &$properties: Array of properties
 
+'APIGetPossibleErrors': Use this hook to modify the module's list of possible
+errors.
+$module: ApiBase Module object
+&$possibleErrors: Array of possible errors
+
 'APIQueryAfterExecute': After calling the execute() method of an
 action=query submodule. Use this to extend core API modules.
 &$module: Module object
@@ -482,7 +493,8 @@ $logEntry: the ManualLogEntry used to record the deletion
 
 'ArticleEditUpdateNewTalk': Before updating user_newtalk when a user talk page
 was changed.
-$wikiPage: WikiPage (object) of the user talk page
+&$wikiPage: WikiPage (object) of the user talk page
+$recipient: User (object) who's talk page was edited
 
 'ArticleEditUpdates': When edit updates (mainly link tracking) are made when an
 article has been changed.
@@ -603,6 +615,7 @@ the user is redirected back to the page.
 
 'ArticleViewFooter': After showing the footer section of an ordinary page view
 $article: Article object
+$patrolFooterShown: boolean whether patrol footer is shown
 
 'ArticleViewHeader': Before the parser cache is about to be tried for article
 viewing.
@@ -788,6 +801,19 @@ content model name, but no entry for that model exists in $wgContentHandlers.
 $modeName: the requested content model name
 &$handler: set this to a ContentHandler object, if desired.
 
+'ContentGetParserOutput': Customize parser output for a given content object,
+called by AbstractContent::getParserOutput. May be used to override the normal
+model-specific rendering of page content.
+$content: The Content to render
+$title: Title of the page, as context
+$revId: The revision ID, as context
+$options: ParserOptions for rendering. To avoid confusing the parser cache,
+the output can only depend on parameters provided to this hook function, not on global state.
+$generateHtml: boolean, indicating whether full HTML should be generated. If false,
+generation of HTML may be skipped, but other information should still be present in the
+ParserOutput object.
+&$output: ParserOutput, to manipulate or replace
+
 'ConvertContent': Called by AbstractContent::convert when a conversion to another
 content model is requested.
 $content: The Content object to be converted.
@@ -1132,6 +1158,15 @@ $title: Title object of page
 $url: string value as output (out parameter, can modify)
 $query: query options passed to Title::getFullURL()
 
+'GetHumanTimestamp': Pre-emptively override the human-readable timestamp generated
+by MWTimestamp::getHumanTimestamp(). Return false in this hook to use the custom
+output.
+&$output: string for the output timestamp
+$timestamp: MWTimestamp object of the current (user-adjusted) timestamp
+$relativeTo: MWTimestamp object of the relative (user-adjusted) timestamp
+$user: User whose preferences are being used to make timestamp
+$lang: Language that will be used to render the timestamp
+
 'GetInternalURL': Modify fully-qualified URLs used for squid cache purging.
 $title: Title object of page
 $url: string value as output (out parameter, can modify)
@@ -1172,6 +1207,14 @@ to do this unless they broke backwards compatibility with a previous version of
 the media handler metadata output.
 &$version: Array of version strings
 
+'GetNewMessagesAlert': Disable or modify the new messages alert
+&$newMessagesAlert: An empty string by default. If the user has new talk page
+messages, this should be populated with an alert message to that effect
+$newtalks: An empty array if the user has no new messages or an array containing
+links and revisions if there are new messages (See User::getNewMessageLinks)
+$user: The user object of the user who is loading the page
+$out: OutputPage object (to check what type of page the user is on)
+
 'GetPreferences': Modify user preferences.
 $user: User whose preferences are being modified.
 &$preferences: Preferences description array, to be fed to an HTMLForm object
@@ -1369,6 +1412,16 @@ $lang: language code (string)
 &$names: array of language code => language name
 $code language of the preferred translations
 
+'LanguageLinks': Manipulate a page's language links. This is called
+in various places to allow extensions to define the effective language
+links for a page.
+$title: The page's Title.
+&$links: Associative array mapping language codes to prefixed links of the
+  form "language:title".
+&$linkFlags: Associative array mapping prefixed links to arrays of flags.
+  Currently unused, but planned to provide support for marking individual
+  language links in the UI, e.g. for featured articles.
+
 'LinkBegin': Used when generating internal and interwiki links in
 Linker::link(), before processing starts.  Return false to skip default
 processing and return $ret. See documentation for Linker::link() for details on
@@ -1954,7 +2007,7 @@ $title : Current Title object being displayed in search results.
 $article: The article object corresponding to the page
 
 'ShowRawCssJs': Customise the output of raw CSS and JavaScript in page views.
-DEPRECATED, use the ContentHandler facility to handle CSS and JavaScript!
+DEPRECATED, use the ContentGetParserOutput hook instead!
 $text: Text being shown
 $title: Title of the custom script/stylesheet page
 $output: Current OutputPage object
@@ -2072,8 +2125,6 @@ $checkEdit: Whether or not the action=edit query should be added if appropriate.
 &$text: Link text.
 &$result: Complete assoc. array if you want to return true.
 
-'SkinTemplateTabs': TODO
-
 'SkinTemplateToolboxEnd': Called by SkinTemplate skins after toolbox links have
 been rendered (useful for adding more).
 $sk: The QuickTemplate based skin template running the hook.
@@ -2293,6 +2344,15 @@ database result.
 &$titleArray: set this to an object to override the default object returned
 $res: database result used to create the object
 
+'TitleQuickPermissions': Called from Title::checkQuickPermissions to add to
+or override the quick permissions check.
+$title: The Title object being accessed
+$user: The User performing the action
+$action: Action being performed
+&$errors: Array of errors
+$doExpensiveQueries: Whether to do expensive DB queries
+$short: Whether to return immediately on first error
+
 'TitleGetRestrictionTypes': Allows extensions to modify the types of protection
 that can be applied.
 $title: The title in question.
@@ -2340,6 +2400,10 @@ $title: Title object being checked against
 $user: Current user object
 &$whitelisted: Boolean value of whether this title is whitelisted
 
+'TitleSquidURLs': Called to determine which URLs to purge from HTTP caches.
+$this: Title object to purge
+&$urls: An array of URLs to purge from the caches, to be manipulated.
+
 'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
 PageArchive object has been created but before any further processing is done.
 &$archive: PageArchive object
index 27619c8..87a32a8 100644 (file)
@@ -34,7 +34,7 @@ In it, write the following:
 
 <?php
 
-require_once( "Maintenance.php" );
+require_once 'Maintenance.php';
 
 class DemoMaint extends Maintenance {
 
@@ -47,7 +47,7 @@ class DemoMaint extends Maintenance {
 }
 
 $maintClass = "DemoMaint";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
 
 ==END==
 
index c905605..32e340a 100644 (file)
@@ -163,7 +163,7 @@ MemCacheClient::set_compression($setting)
 
 EXAMPLE:
 <?php
-require("MemCachedClient.inc.php");
+require 'MemCachedClient.inc.php';
 
 // set the servers, with the last one having an integer weight value of 3
 $options["servers"] = array("10.0.0.15:11000","10.0.0.16:11001",array("10.0.0.17:11002", 3));
index fab27b8..1459d7a 100644 (file)
@@ -1,57 +1,59 @@
 skin.txt
 
-MediaWiki's default skin is called Vector. Vector was introduced in
-the 1.16 release (2010) and has been set as the default in MediaWiki since
-the 1.17 release (2011). This replaced the popular skin, Monobook which
-had been been the default since MediaWiki 1.3 (2004). Vector is now the
-default skin on Wikimedia Projects.
+MediaWiki includes four core skins:
 
-There are three legacy skins which were introduced before MediaWiki 1.3:
+* Vector: The default skin. Introduced in the 1.16 release (2010), it has been
+  set as the default in MediaWiki since the 1.17 release (2011), replacing
+  Monobook.
 
-* Standard (a.k.a. Classic): The old default skin written by Lee Crocker 
-during the phase 3 rewrite, in 2002.
+* Monobook: Named after the black-and-white photo of a book in the page
+  background. Introduced in the 2004 release of 1.3, it had been been the
+  default skin since then, before being replaced by Vector.
 
-* Nostalgia: A skin which looks like Wikipedia did in its first year (2001). 
-This skin is now used for the old Wikipedia snapshot at
-http://nostalgia.wikipedia.org/
+* Modern: An attractive blue/grey theme with sidebar and top bar. Derived from
+  Monobook.
 
-* Cologne Blue: A nicer-looking alternative to Standard.
+* Cologne Blue: A lightweight skin with minimal formatting. The oldest of the
+  currently bundled skins, largely rewritten in 2012 while keeping its
+  appearance.
 
-The other skin that is widely used (and is the MediaWiki default before 1.17)
-is Monobook.
 
-* Monobook: Named after the black-and-white photo of a book, in the page background.
-This was introduced in the 2004 release of 1.3
+Several legacy skins were removed in the 1.22 release, as the burden of
+supporting them became too heavy to bear. Those were:
 
-And there are four Monobook-derived skins which have been introduced since 1.3:
+* Standard (a.k.a. Classic): The old default skin written by Lee Crocker during
+  the phase 3 rewrite, in 2002.
 
-* MySkin: Monobook without the CSS. The idea is that you customise it using user
-or site CSS (see below)
+* Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
+  This skin is now used for the old Wikipedia snapshot at
+  http://nostalgia.wikipedia.org/
 
-* Chick: A lightweight Monobook skin with no sidebar, the sidebar links are
-given at the bottom of the page instead, as in the unstyled MySkin.
+* Chick: A lightweight Monobook skin with no sidebar. The sidebar links were
+  given at the bottom of the page instead.
 
-* Simple: A lightweight skin with a simple white-background sidebar and no
-top bar.
+* Simple: A lightweight skin with a simple white-background sidebar and no top
+  bar.
+
+* MySkin: Essentially Monobook without the CSS. The idea was that it could be
+  customised using user-specific or site-wide CSS (see below).
 
-* Modern: An attractive blue/grey theme with sidebar and top bar.
 
 == Custom CSS/JS ==
 
 It is possible to customise the site CSS and JavaScript without editing any
-source files. This is done by editing some pages on the wiki:
+server-side source files. This is done by editing some pages on the wiki:
 
 * [[MediaWiki:Common.css]] -- for skin-independent CSS
-* [[MediaWiki:Monobook.css]], [[MediaWiki:Simple.css]], etc. -- for
-skin-dependent CSS
-* [[MediaWiki:Common.js]], [[MediaWiki:Monobook.js]], etc. -- for custom
-site JavaScript
+* [[MediaWiki:Common.js]] -- for skin-independent JavaScript
+* [[MediaWiki:Vector.css]], [[MediaWiki:Monobook.css]], etc. -- for
+  skin-dependent CSS
+* [[MediaWiki:Vector.js]], [[MediaWiki:Monobook.js]], etc. -- for
+  skin-dependent JavaScript
 
 These can also be customised on a per-user basis, by editing
-[[User:<name>/monobook.css]], [[User:<name>/monobook.js]], etc.
+[[User:<name>/vector.css]], [[User:<name>/vector.js]], etc.
 
-This feature has led to a wide variety of "user styles" becoming available,
-which change the appearance of Monobook or MySkin:
+This feature has led to a wide variety of "user styles" becoming available:
 
 http://www.mediawiki.org/wiki/Manual:Gallery_of_user_styles
 
@@ -72,7 +74,7 @@ $wgSkipSkins[] = '<name>';
 
 This technique is used by the more ambitious MediaWiki site operators, to 
 create complex custom skins for their wikis. It should be preferred over 
-editing the core Monobook skin directly. 
+editing the core Monobook skin directly.
 
 See http://www.mediawiki.org/wiki/Manual:Skinning for more information.
 
index d2d91c9..454711d 100644 (file)
@@ -8,7 +8,7 @@ and can be queried for the others, and for other attributes of the title. This
 is intended to be an immutable "value" class, so there are no mutator functions.
 
 To get a new instance, call Title::newFromText(). Once instantiated, the
-non-static accessor methods can be used, such as getText(), getDBKey(),
+non-static accessor methods can be used, such as getText(), getDBkey(),
 getNamespace(), etc. Note that Title::newFromText() may return false if the text
 is illegal according to the rules below.
 
@@ -36,11 +36,11 @@ An initial colon in a title listed in wiki text may however suppress special
 handling for interlanguage links, image links, and category links. It is also
 used to indicate the main namespace in template inclusions.
 
-Once prefixes have been stripped, the rest of the title processed this way: 
+Once prefixes have been stripped, the rest of the title processed this way:
 
 * Spaces and underscores are treated as equivalent and each  is converted to the
   other in the appropriate context (underscore in URL and database keys, spaces
-  in plain text). 
+  in plain text).
 * Multiple consecutive spaces are converted to a single space.
 * Leading or trailing space is removed.
 * If $wgCapitalLinks is enabled (the default), the first letter is  capitalised,
@@ -58,7 +58,7 @@ UTF-8, because that is the size of the database field. Special page titles may
 be up to 512 bytes.
 
 Note that Unicode Normal Form C (NFC) is enforced by MediaWiki's user interface
-input functions, and so titles will typically be in this form. 
+input functions, and so titles will typically be in this form.
 
 getArticleID() needs some explanation: for "internal" articles, it should return
 the "page_id" field if the article exists, else it returns 0. For all external
index 8294b6d..dedb3a6 100644 (file)
@@ -2,7 +2,7 @@
 <html>
 <head>
        <title>CSS Child selector emulation for IE 6</title>
-       <style type="text/css">
+       <style>
                /** Common rules **/
                body  { background-color: #CCC; }
                table { border:1px black solid; }
@@ -98,4 +98,3 @@ With child selector we could limit the wikitable styling to the direct childs of
 </tr>
 </table>
 <p><strong>NOTE:</strong>The nested caption keep the green background. The nested table keep the black border. This is because those declarations are global so we did not reset them.</p>
-
index 7062a82..a285a5b 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" dir="ltr">
 <head>
-       <link rel="stylesheet" href="../../skins/common/shared.css" />
+       <link rel="stylesheet" href="../../skins/common/shared.css">
 </head>
 <body style="font-size: small;">
 
@@ -31,4 +31,5 @@
                <tr><td>line with hover</td><td>line with hover</td></tr>
        </table>
 
-</body></html>
+</body>
+</html>
index 7b8eb2a..5edcfb8 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" dir="ltr">
 <head>
-       <link rel="stylesheet" href="../../resources/mediawiki.action/mediawiki.action.history.diff.css" />
+       <link rel="stylesheet" href="../../resources/mediawiki.action/mediawiki.action.history.diff.css">
 </head>
 <body style="background-color: #C0C0C0;">
 <p>
@@ -54,4 +54,5 @@ Below are some basic lines being applied one or two classes. Mainly for debuggin
        </td></tr>
 </table>
 
-</body></html>
+</body>
+</html>
index 84ec13a..f2b988e 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
-<html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
+<html lang="en" dir="ltr">
 <head>
-       <style type="text/css">
+       <style>
                pre {
                        border: 1px dashed #AAA;
                        background-color: #E0E0E0;
@@ -75,4 +75,3 @@ font-family: monospace, Verdana;
 font-family: monospace, DOESNOTEXISTREALLY;'>
 font-family: monospace, DOESNOTEXISTREALLY;
 </pre>
-
index 6f53825..2c26819 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html>
 <head>
-       <style type="text/css">
+       <style>
                /** This is just for coloring: */
                table { border: 1px solid #CC0; }
                td { border: 1px solid  #CCC; }
@@ -57,4 +57,3 @@ On a perfect browser, both tables should look the same</p>
        </tr>
 </table>
 </div>
-
index 66236e8..e815062 100644 (file)
@@ -27,4 +27,4 @@ The following code snippet lets you override the default path:
  if( $IP === false ) {
        $IP = __DIR__ . '/../..';
  }
- require_once( "$IP/maintenance/Maintenance.php" ); // a MediaWiki core file
+ require_once "$IP/maintenance/Maintenance.php"; // a MediaWiki core file
index ccaa8af..c8759ec 100644 (file)
  */
 
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       require ( 'core/includes/WebStart.php' );
-} else {
-       require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 wfProfileIn( 'img_auth.php' );
 
 # Set action base paths so that WebRequest::getPathInfo()
@@ -117,6 +113,8 @@ function wfImageAuthMain() {
        }
 
        // Run hook for extension authorization plugins
+       /** @var $result array */
+       $result = null;
        if ( !wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) ) {
                wfForbidden( $result[0], $result[1], array_slice( $result, 2 ) );
                return;
index 2e0c88b..e996104 100644 (file)
@@ -213,7 +213,7 @@ abstract class Action {
        /**
         * Shortcut to get the user Language being used for this instance
         *
-        * @deprecated 1.19 Use getLanguage instead
+        * @deprecated since 1.19 Use getLanguage instead
         * @return Language
         */
        final public function getLang() {
@@ -374,18 +374,23 @@ abstract class FormAction extends Action {
         * Add pre- or post-text to the form
         * @return String HTML which will be sent to $form->addPreText()
         */
-       protected function preText() { return ''; }
+       protected function preText() {
+               return '';
+       }
 
        /**
         * @return string
         */
-       protected function postText() { return ''; }
+       protected function postText() {
+               return '';
+       }
 
        /**
         * Play with the HTMLForm if you need to more substantially
         * @param $form HTMLForm
         */
-       protected function alterForm( HTMLForm $form ) {}
+       protected function alterForm( HTMLForm $form ) {
+       }
 
        /**
         * Get the HTMLForm to control behavior
index b00cf30..e22fe20 100644 (file)
@@ -63,7 +63,7 @@ class AjaxDispatcher {
                        $this->mode = "post";
                }
 
-               switch( $this->mode ) {
+               switch ( $this->mode ) {
                        case 'get':
                                $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
                                if ( ! empty( $_GET["rsargs"] ) ) {
index 0b74f06..985271f 100644 (file)
@@ -39,7 +39,7 @@ class ArrayUtils {
         *
         * @return bool|int|string
         */
-       public static function pickRandom( $weights ){
+       public static function pickRandom( $weights ) {
                if ( !is_array( $weights ) || count( $weights ) == 0 ) {
                        return false;
                }
index 9b4afe4..f0eb568 100644 (file)
@@ -25,7 +25,7 @@
  *
  * This maintains WikiPage functions for backwards compatibility.
  *
- * @todo move and rewrite code to an Action class
+ * @todo Move and rewrite code to an Action class
  *
  * See design.txt for an overview.
  * Note: edit user interface and cache support functions have been
@@ -160,7 +160,7 @@ class Article implements Page {
                $page = null;
                wfRunHooks( 'ArticleFromTitle', array( &$title, &$page ) );
                if ( !$page ) {
-                       switch( $title->getNamespace() ) {
+                       switch ( $title->getNamespace() ) {
                                case NS_FILE:
                                        $page = new ImagePage( $title );
                                        break;
@@ -385,7 +385,8 @@ class Article implements Page {
 
                $content = $this->fetchContentObject();
 
-               $this->mContent = ContentHandler::getContentText( $content ); #@todo: get rid of mContent everywhere!
+               // @todo Get rid of mContent everywhere!
+               $this->mContent = ContentHandler::getContentText( $content );
                ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
 
                wfProfileOut( __METHOD__ );
@@ -609,7 +610,7 @@ class Article implements Page {
                $this->mParserOutput = false;
 
                while ( !$outputDone && ++$pass ) {
-                       switch( $pass ) {
+                       switch ( $pass ) {
                                case 1:
                                        wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
                                        break;
@@ -673,12 +674,12 @@ class Article implements Page {
                                                wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
                                                $this->showCssOrJsPage();
                                                $outputDone = true;
-                                       } elseif( !wfRunHooks( 'ArticleContentViewCustom',
+                                       } elseif ( !wfRunHooks( 'ArticleContentViewCustom',
                                                        array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
 
                                                # Allow extensions do their own custom view for certain pages
                                                $outputDone = true;
-                                       } elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
+                                       } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
                                                        array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
 
                                                # Allow extensions do their own custom view for certain pages
@@ -787,7 +788,7 @@ class Article implements Page {
         * Show a diff page according to current request variables. For use within
         * Article::view() only, other callers should use the DifferenceEngine class.
         *
-        * @todo: make protected
+        * @todo Make protected
         */
        public function showDiffPage() {
                $request = $this->getContext()->getRequest();
@@ -854,11 +855,11 @@ class Article implements Page {
        /**
         * Get the robot policy to be used for the current view
         * @param string $action the action= GET parameter
-        * @param $pOutput ParserOutput
+        * @param $pOutput ParserOutput|null
         * @return Array the policy that should be set
         * TODO: actions other than 'view'
         */
-       public function getRobotPolicy( $action, $pOutput ) {
+       public function getRobotPolicy( $action, $pOutput = null ) {
                global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
 
                $ns = $this->getTitle()->getNamespace();
@@ -875,7 +876,7 @@ class Article implements Page {
                        }
                        if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
                                return array(
-                                       'index'  => 'noindex',
+                                       'index' => 'noindex',
                                        'follow' => 'nofollow'
                                );
                        }
@@ -884,19 +885,19 @@ class Article implements Page {
                if ( $this->mPage->getID() === 0 || $this->getOldID() ) {
                        # Non-articles (special pages etc), and old revisions
                        return array(
-                               'index'  => 'noindex',
+                               'index' => 'noindex',
                                'follow' => 'nofollow'
                        );
                } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
                        # Discourage indexing of printable versions, but encourage following
                        return array(
-                               'index'  => 'noindex',
+                               'index' => 'noindex',
                                'follow' => 'follow'
                        );
                } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
                        # For ?curid=x urls, disallow indexing
                        return array(
-                               'index'  => 'noindex',
+                               'index' => 'noindex',
                                'follow' => 'follow'
                        );
                }
@@ -988,8 +989,9 @@ class Article implements Page {
 
                                // Set the fragment if one was specified in the redirect
                                if ( strval( $this->getTitle()->getFragment() ) != '' ) {
-                                       $fragment = Xml::escapeJsString( $this->getTitle()->getFragmentForURL() );
-                                       $outputPage->addInlineScript( "redirectToFragment(\"$fragment\");" );
+                                       $outputPage->addInlineScript( Xml::encodeJsCall(
+                                               'redirectToFragment', array( $this->getTitle()->getFragmentForURL() )
+                                       ) );
                                }
 
                                // Add a <link rel="canonical"> tag
@@ -1035,11 +1037,10 @@ class Article implements Page {
                        $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
                }
 
-               # If we have been passed an &rcid= parameter, we want to give the user a
-               # chance to mark this new article as patrolled.
-               $this->showPatrolFooter();
+               // Show a footer allowing the user to patrol the shown revision or page if possible
+               $patrolFooterShown = $this->showPatrolFooter();
 
-               wfRunHooks( 'ArticleViewFooter', array( $this ) );
+               wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
 
        }
 
@@ -1049,21 +1050,128 @@ class Article implements Page {
         * desired, does nothing.
         * Side effect: When the patrol link is build, this method will call
         * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
+        *
+        * @return bool
         */
        public function showPatrolFooter() {
+               global $wgUseRCPatrol, $wgUseNPPatrol, $wgRCMaxAge, $wgEnableAPI, $wgEnableWriteAPI;
+
                $request = $this->getContext()->getRequest();
                $outputPage = $this->getContext()->getOutput();
                $user = $this->getContext()->getUser();
-               $rcid = $request->getVal( 'rcid' );
+               $cache = wfGetMainCache();
 
-               if ( !$rcid || !$this->getTitle()->quickUserCan( 'patrol', $user ) ) {
-                       return;
+               // Normally this makes a link to patrol the revision being viewed.
+               // Sometimes, the 'patrolpage' flag is set in case we want to patrol the first
+               // revision and not the one being viewed by the user (set in Special:NewPages).
+               $useRCPatrol = $wgUseRCPatrol && !$request->getBool( 'patrolpage' );
+
+               if ( !$this->getTitle()->quickUserCan( 'patrol', $user ) || ( !$wgUseNPPatrol && !$wgUseRCPatrol ) ) {
+                       // Patrolling is fully disabled or the user isn't allowed to
+                       return false;
                }
 
+               wfProfileIn( __METHOD__ );
+
+               if ( $useRCPatrol ) {
+                       // Check for cached results
+                       if ( $cache->get( wfMemcKey( 'NotPatrollableRevId', $this->getRevIdFetched() ) ) ) {
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+
+                       // We make use of a little index trick over here:
+                       // First we get the timestamp of the last revision and then
+                       // we look up the RC row by that as the timestamp is indexed
+                       // and usually very few rows exist for one timestamp
+                       // (While several thousand can exists for a single page)
+                       if ( !$this->mRevision ) {
+                               $this->mRevision = Revision::newFromId( $this->getRevIdFetched() );
+                       }
+
+                       if ( !$this->mRevision || !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 )  ) {
+                               // The revision is more than 6 hours older than the Max RC age
+                               // no need to torture the DB any further (6h because the RC might not be cleaned out regularly)
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+                       $rc = RecentChange::newFromConds(
+                               array(
+                                       'rc_this_oldid' => $this->getRevIdFetched(),
+                                       'rc_timestamp' => $this->mRevision->getTimestamp(),
+                                       'rc_cur_id' => $this->getTitle()->getArticleID(),
+                                       'rc_patrolled' => 0
+                               ),
+                               __METHOD__,
+                               array( 'USE INDEX' => 'rc_timestamp' )
+                       );
+               } else {
+                       // RC patrol is disabled so we have to patrol the first
+                       // revision (new page patrol) in case it's in the RC table.
+                       // To achieve this we get the timestamp of the oldest revison
+                       // the revision table holds for the given page. Then we look
+                       // whether it's within the RC lifespan and if it is, we try
+                       // 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() ) ) ) {
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $oldestRevisionTimestamp = $dbr->selectField(
+                               'revision',
+                               'MIN( rev_timestamp )',
+                               array( 'rev_page' => $this->getTitle()->getArticleID() ),
+                               __METHOD__
+                       );
+
+                       if ( !$oldestRevisionTimestamp || !RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 ) ) {
+                               // We either didn't find the oldest revision for the given page
+                               // or it's to old for the RC table (with 6h tolerance)
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+
+                       $rc = RecentChange::newFromConds(
+                               array(
+                                       'rc_new' => 1,
+                                       'rc_timestamp' => $oldestRevisionTimestamp,
+                                       'rc_namespace' => $this->getTitle()->getNamespace(),
+                                       'rc_cur_id' => $this->getTitle()->getArticleID(),
+                                       'rc_patrolled' => 0
+                               ),
+                               __METHOD__,
+                               array( 'USE INDEX' => 'new_name_timestamp' )
+                       );
+               }
+
+               wfProfileOut( __METHOD__ );
+
+               if ( !$rc ) {
+                       // No 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
+                       if( $useRCPatrol ) {
+                               $cache->set( wfMemcKey( 'NotPatrollableRevId', $this->getRevIdFetched() ), '1', $wgRCMaxAge );
+                       } else {
+                               $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1', $wgRCMaxAge );
+                       }
+
+                       return false;
+               }
+
+               $rcid = $rc->getAttribute( 'rc_id' );
+
                $token = $user->getEditToken( $rcid );
 
                $outputPage->preventClickjacking();
-               $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+               if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
+                       $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+               }
 
                $link = Linker::linkKnown(
                        $this->getTitle(),
@@ -1081,6 +1189,8 @@ class Article implements Page {
                                wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
                        '</div>'
                );
+
+               return true;
        }
 
        /**
@@ -1090,6 +1200,7 @@ class Article implements Page {
        public function showMissingArticle() {
                global $wgSend404Code;
                $outputPage = $this->getContext()->getOutput();
+               // Whether the page is a root user page of an existing user (but not a subpage)
                $validUserPage = false;
 
                # Show info in user (talk) namespace. Does the user exist? Is he blocked?
@@ -1099,7 +1210,7 @@ class Article implements Page {
                        $user = User::newFromName( $rootPart, false /* allow IP users*/ );
                        $ip = User::isIP( $rootPart );
 
-                       if ( !($user && $user->isLoggedIn()) && !$ip ) { # User does not exist
+                       if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
                                $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
                                        array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
                        } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
@@ -1117,9 +1228,9 @@ class Article implements Page {
                                                )
                                        )
                                );
-                               $validUserPage = true;
+                               $validUserPage = !$this->getTitle()->isSubpage();
                        } else {
-                               $validUserPage = true;
+                               $validUserPage = !$this->getTitle()->isSubpage();
                        }
                }
 
@@ -1139,6 +1250,13 @@ class Article implements Page {
                        $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
                }
 
+               if ( $validUserPage ) {
+                       // Also apply the robot policy for nonexisting user pages (as those aren't served as 404)
+                       $policy = $this->getRobotPolicy( 'view' );
+                       $outputPage->setIndexPolicy( $policy['index'] );
+                       $outputPage->setFollowPolicy( $policy['follow'] );
+               }
+
                $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
 
                if ( ! $hookResult ) {
@@ -1188,7 +1306,7 @@ class Article implements Page {
                } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
                        # Give explanation and add a link to view the revision...
                        $oldid = intval( $this->getOldID() );
-                       $link = $this->getTitle()->getFullUrl( "oldid={$oldid}&unhide=1" );
+                       $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
                        $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
                                'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
                        $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
index 7136232..e92b67d 100644 (file)
@@ -65,7 +65,6 @@ $wgAutoloadLocalClasses = array(
        'ConfEditorToken' => 'includes/ConfEditor.php',
        'Cookie' => 'includes/Cookie.php',
        'CookieJar' => 'includes/Cookie.php',
-       'MWCryptRand' => 'includes/CryptRand.php',
        'CurlHttpRequest' => 'includes/HttpFunctions.php',
        'DeferrableUpdate' => 'includes/DeferredUpdates.php',
        'DeferredUpdates' => 'includes/DeferredUpdates.php',
@@ -90,13 +89,6 @@ $wgAutoloadLocalClasses = array(
        'EnhancedChangesList' => 'includes/ChangesList.php',
        'ErrorPageError' => 'includes/Exception.php',
        'ExplodeIterator' => 'includes/StringUtils.php',
-       'ExternalEdit' => 'includes/ExternalEdit.php',
-       'ExternalStore' => 'includes/externalstore/ExternalStore.php',
-       'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
-       'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
-       'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
-       'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
-       'ExternalUser' => 'includes/ExternalUser.php',
        'FakeTitle' => 'includes/FakeTitle.php',
        'Fallback' => 'includes/Fallback.php',
        'FatalError' => 'includes/Exception.php',
@@ -111,6 +103,7 @@ $wgAutoloadLocalClasses = array(
        'FormOptions' => 'includes/FormOptions.php',
        'FormSpecialPage' => 'includes/SpecialPage.php',
        'GitInfo' => 'includes/GitInfo.php',
+       'HashRing' => 'includes/HashRing.php',
        'HashtableReplacer' => 'includes/StringUtils.php',
        'HistoryBlob' => 'includes/HistoryBlob.php',
        'HistoryBlobCurStub' => 'includes/HistoryBlob.php',
@@ -118,15 +111,18 @@ $wgAutoloadLocalClasses = array(
        'Hooks' => 'includes/Hooks.php',
        'Html' => 'includes/Html.php',
        'HTMLApiField' => 'includes/HTMLForm.php',
+       'HTMLButtonField' => 'includes/HTMLForm.php',
        'HTMLCheckField' => 'includes/HTMLForm.php',
        'HTMLCheckMatrix' => 'includes/HTMLForm.php',
        'HTMLEditTools' => 'includes/HTMLForm.php',
        'HTMLFloatField' => 'includes/HTMLForm.php',
        'HTMLForm' => 'includes/HTMLForm.php',
        'HTMLFormField' => 'includes/HTMLForm.php',
+       'HTMLFormFieldRequiredOptionsException' => 'includes/HTMLForm.php',
        'HTMLHiddenField' => 'includes/HTMLForm.php',
        'HTMLInfoField' => 'includes/HTMLForm.php',
        'HTMLIntField' => 'includes/HTMLForm.php',
+       'HTMLNestedFilterable' => 'includes/HTMLForm.php',
        'HTMLMultiSelectField' => 'includes/HTMLForm.php',
        'HTMLRadioField' => 'includes/HTMLForm.php',
        'HTMLSelectAndOtherField' => 'includes/HTMLForm.php',
@@ -156,7 +152,6 @@ $wgAutoloadLocalClasses = array(
        'LCStore_CDB' => 'includes/cache/LocalisationCache.php',
        'LCStore_DB' => 'includes/cache/LocalisationCache.php',
        'LCStore_Null' => 'includes/cache/LocalisationCache.php',
-       'LegacyTemplate' => 'includes/SkinLegacy.php',
        'License' => 'includes/Licenses.php',
        'Licenses' => 'includes/Licenses.php',
        'Linker' => 'includes/Linker.php',
@@ -174,6 +169,7 @@ $wgAutoloadLocalClasses = array(
        'Message' => 'includes/Message.php',
        'MessageBlobStore' => 'includes/MessageBlobStore.php',
        'MimeMagic' => 'includes/MimeMagic.php',
+       'MWCryptRand' => 'includes/MWCryptRand.php',
        'MWException' => 'includes/Exception.php',
        'MWExceptionHandler' => 'includes/Exception.php',
        'MWFunction' => 'includes/MWFunction.php',
@@ -194,6 +190,7 @@ $wgAutoloadLocalClasses = array(
        'PoolCounter' => 'includes/PoolCounter.php',
        'PoolCounter_Stub' => 'includes/PoolCounter.php',
        'PoolCounterWork' => 'includes/PoolCounter.php',
+       'PoolCounterWorkViaCallback' => 'includes/PoolCounter.php',
        'PoolWorkArticleView' => 'includes/WikiPage.php',
        'Preferences' => 'includes/Preferences.php',
        'PreferencesForm' => 'includes/Preferences.php',
@@ -228,7 +225,6 @@ $wgAutoloadLocalClasses = array(
        'SiteStatsInit' => 'includes/SiteStats.php',
        'SiteStatsUpdate' => 'includes/SiteStats.php',
        'Skin' => 'includes/Skin.php',
-       'SkinLegacy' => 'includes/SkinLegacy.php',
        'SkinTemplate' => 'includes/SkinTemplate.php',
        'SpecialCreateAccount' => 'includes/SpecialPage.php',
        'SpecialListAdmins' => 'includes/SpecialPage.php',
@@ -242,6 +238,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialRedirectToSpecial' => 'includes/SpecialPage.php',
        'SquidPurgeClient' => 'includes/SquidPurgeClient.php',
        'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
+       'StatCounter' => 'includes/StatCounter.php',
        'Status' => 'includes/Status.php',
        'StreamFile' => 'includes/StreamFile.php',
        'StringUtils' => 'includes/StringUtils.php',
@@ -473,7 +470,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/db
        'Blob' => 'includes/db/DatabaseUtility.php',
-       'ChronologyProtector' => 'includes/db/LBFactory.php',
+       'ChronologyProtector' => 'includes/db/ChronologyProtector.php',
        'CloneDatabase' => 'includes/db/CloneDatabase.php',
        'DatabaseBase' => 'includes/db/Database.php',
        'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
@@ -543,10 +540,12 @@ $wgAutoloadLocalClasses = array(
        'WikiDiff3' => 'includes/diff/WikiDiff3.php',
        'WordLevelDiff' => 'includes/diff/DairikiDiff.php',
 
-       # includes/extauth
-       'ExternalUser_Hardcoded' => 'includes/extauth/Hardcoded.php',
-       'ExternalUser_MediaWiki' => 'includes/extauth/MediaWiki.php',
-       'ExternalUser_vB' => 'includes/extauth/vB.php',
+       # includes/externalstore
+       'ExternalStore' => 'includes/externalstore/ExternalStore.php',
+       'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
+       'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
+       'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
+       'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
 
        # includes/filebackend
        'FileBackendGroup' => 'includes/filebackend/FileBackendGroup.php',
@@ -582,6 +581,7 @@ $wgAutoloadLocalClasses = array(
        'QuorumLockManager' => 'includes/filebackend/lockmanager/QuorumLockManager.php',
        'MySqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
        'PostgreSqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
+       'RedisLockManager' => 'includes/filebackend/lockmanager/RedisLockManager.php',
        'NullLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
        'FileOp' => 'includes/filebackend/FileOp.php',
        'FileOpBatch' => 'includes/filebackend/FileOpBatch.php',
@@ -657,11 +657,12 @@ $wgAutoloadLocalClasses = array(
        # includes/job
        'Job' => 'includes/job/Job.php',
        'JobQueue' => 'includes/job/JobQueue.php',
-       'JobQueueAggregator' => 'includes/job/JobQueueAggregator.php',
-       'JobQueueAggregatorMemc' => 'includes/job/JobQueueAggregatorMemc.php',
-       'JobQueueAggregatorRedis' => 'includes/job/JobQueueAggregatorRedis.php',
+       'JobQueueAggregator' => 'includes/job/aggregator/JobQueueAggregator.php',
+       'JobQueueAggregatorMemc' => 'includes/job/aggregator/JobQueueAggregatorMemc.php',
+       'JobQueueAggregatorRedis' => 'includes/job/aggregator/JobQueueAggregatorRedis.php',
        'JobQueueDB' => 'includes/job/JobQueueDB.php',
        'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
+       'JobQueueFederated' => 'includes/job/JobQueueFederated.php',
        'JobQueueRedis' => 'includes/job/JobQueueRedis.php',
 
        # includes/job/jobs
@@ -679,8 +680,6 @@ $wgAutoloadLocalClasses = array(
 
        # includes/json
        'FormatJson' => 'includes/json/FormatJson.php',
-       'Services_JSON' => 'includes/json/Services_JSON.php',
-       'Services_JSON_Error' => 'includes/json/Services_JSON.php',
 
        # includes/libs
        'CSSJanus' => 'includes/libs/CSSJanus.php',
@@ -700,7 +699,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/logging
        'DatabaseLogEntry' => 'includes/logging/LogEntry.php',
-       'DeleteLogFormatter' => 'includes/logging/LogFormatter.php',
+       'DeleteLogFormatter' => 'includes/logging/DeleteLogFormatter.php',
        'LegacyLogFormatter' => 'includes/logging/LogFormatter.php',
        'LogEntry' => 'includes/logging/LogEntry.php',
        'LogEventsList' => 'includes/logging/LogEventsList.php',
@@ -709,12 +708,12 @@ $wgAutoloadLocalClasses = array(
        'LogPage' => 'includes/logging/LogPage.php',
        'LogPager' => 'includes/logging/LogPager.php',
        'ManualLogEntry' => 'includes/logging/LogEntry.php',
-       'MoveLogFormatter' => 'includes/logging/LogFormatter.php',
-       'NewUsersLogFormatter' => 'includes/logging/LogFormatter.php',
+       'MoveLogFormatter' => 'includes/logging/MoveLogFormatter.php',
+       'NewUsersLogFormatter' => 'includes/logging/NewUsersLogFormatter.php',
        'PatrolLog' => 'includes/logging/PatrolLog.php',
-       'PatrolLogFormatter' => 'includes/logging/LogFormatter.php',
+       'PatrolLogFormatter' => 'includes/logging/PatrolLogFormatter.php',
        'RCDatabaseLogEntry' => 'includes/logging/LogEntry.php',
-       'RightsLogFormatter' => 'includes/logging/LogFormatter.php',
+       'RightsLogFormatter' => 'includes/logging/RightsLogFormatter.php',
 
        # includes/media
        'BitmapHandler' => 'includes/media/Bitmap.php',
@@ -776,12 +775,10 @@ $wgAutoloadLocalClasses = array(
 
        # includes/parser
        'CacheTime' => 'includes/parser/CacheTime.php',
-       'CoreLinkFunctions' => 'includes/parser/CoreLinkFunctions.php',
        'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
        'CoreTagHooks' => 'includes/parser/CoreTagHooks.php',
        'DateFormatter' => 'includes/parser/DateFormatter.php',
        'LinkHolderArray' => 'includes/parser/LinkHolderArray.php',
-       'LinkMarkerReplacer' => 'includes/parser/Parser_LinkHooks.php',
        'MWTidy' => 'includes/parser/Tidy.php',
        'MWTidyWrapper' => 'includes/parser/Tidy.php',
        'PPCustomFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
@@ -809,7 +806,6 @@ $wgAutoloadLocalClasses = array(
        'ParserOptions' => 'includes/parser/ParserOptions.php',
        'ParserOutput' => 'includes/parser/ParserOutput.php',
        'Parser_DiffTest' => 'includes/parser/Parser_DiffTest.php',
-       'Parser_LinkHooks' => 'includes/parser/Parser_LinkHooks.php',
        'Preprocessor' => 'includes/parser/Preprocessor.php',
        'Preprocessor_DOM' => 'includes/parser/Preprocessor_DOM.php',
        'Preprocessor_Hash' => 'includes/parser/Preprocessor_Hash.php',
@@ -822,6 +818,7 @@ $wgAutoloadLocalClasses = array(
        'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
        'ProfilerSimpleUDP' => 'includes/profiler/ProfilerSimpleUDP.php',
        'ProfilerStub' => 'includes/profiler/ProfilerStub.php',
+       'ProfileSection' => 'includes/profiler/Profiler.php',
 
        # includes/resourceloader
        'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
@@ -973,6 +970,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialRandomredirect' => 'includes/specials/SpecialRandomredirect.php',
        'SpecialRecentChanges' => 'includes/specials/SpecialRecentchanges.php',
        'SpecialRecentchangeslinked' => 'includes/specials/SpecialRecentchangeslinked.php',
+       'SpecialRedirect' => 'includes/specials/SpecialRedirect.php',
        'SpecialRevisionDelete' => 'includes/specials/SpecialRevisiondelete.php',
        'SpecialSearch' => 'includes/specials/SpecialSearch.php',
        'SpecialSpecialpages' => 'includes/specials/SpecialSpecialpages.php',
@@ -998,6 +996,7 @@ $wgAutoloadLocalClasses = array(
        'UnwatchedpagesPage' => 'includes/specials/SpecialUnwatchedpages.php',
        'UploadChunkFileException' => 'includes/upload/UploadFromChunks.php',
        'UploadChunkZeroLengthFileException' => 'includes/upload/UploadFromChunks.php',
+       'UploadChunkVerificationException' => 'includes/upload/UploadFromChunks.php',
        'UploadForm' => 'includes/specials/SpecialUpload.php',
        'UploadSourceField' => 'includes/specials/SpecialUpload.php',
        'UserrightsPage' => 'includes/specials/SpecialUserrights.php',
@@ -1011,7 +1010,9 @@ $wgAutoloadLocalClasses = array(
 
        # includes/templates
        'UserloginTemplate' => 'includes/templates/Userlogin.php',
+       'UserloginTemplateVForm' => 'includes/templates/UserloginVForm.php',
        'UsercreateTemplate' => 'includes/templates/Usercreate.php',
+       'UsercreateTemplateVForm' => 'includes/templates/UsercreateVForm.php',
 
        # includes/upload
        'UploadBase' => 'includes/upload/UploadBase.php',
@@ -1091,17 +1092,10 @@ $wgAutoloadLocalClasses = array(
        'CologneBlueTemplate' => 'skins/CologneBlue.php',
        'ModernTemplate' => 'skins/Modern.php',
        'MonoBookTemplate' => 'skins/MonoBook.php',
-       'NostalgiaTemplate' => 'skins/Nostalgia.php',
-       'SkinChick' => 'skins/Chick.php',
        'SkinCologneBlue' => 'skins/CologneBlue.php',
        'SkinModern' => 'skins/Modern.php',
        'SkinMonoBook' => 'skins/MonoBook.php',
-       'SkinMySkin' => 'skins/MySkin.php',
-       'SkinNostalgia' => 'skins/Nostalgia.php',
-       'SkinSimple' => 'skins/Simple.php',
-       'SkinStandard' => 'skins/Standard.php',
        'SkinVector' => 'skins/Vector.php',
-       'StandardTemplate' => 'skins/Standard.php',
        'VectorTemplate' => 'skins/Vector.php',
 );
 
@@ -1157,7 +1151,7 @@ class AutoLoader {
                        $filename = "$IP/$filename";
                }
 
-               require( $filename );
+               require $filename;
 
                return true;
        }
index 604b924..ec9dcf5 100644 (file)
@@ -165,7 +165,7 @@ class Autopromote {
                        return false;
                }
 
-               switch( $cond[0] ) {
+               switch ( $cond[0] ) {
                        case APCOND_EMAILCONFIRMED:
                                if ( Sanitizer::validateEmail( $user->getEmail() ) ) {
                                        if ( $wgEmailAuthentication ) {
index 7ee36ce..d2f430e 100644 (file)
@@ -65,11 +65,11 @@ class Block {
                $timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
                $hideName = 0, $blockEmail = 0, $allowUsertalk = 0, $byText = '' )
        {
-               if( $timestamp === 0 ) {
+               if ( $timestamp === 0 ) {
                        $timestamp = wfTimestampNow();
                }
 
-               if( count( func_get_args() ) > 0 ) {
+               if ( count( func_get_args() ) > 0 ) {
                        # Soon... :D
                        # wfDeprecated( __METHOD__ . " with arguments" );
                }
@@ -206,16 +206,16 @@ class Block {
         */
        public function load( $address = '', $user = 0 ) {
                wfDeprecated( __METHOD__, '1.18' );
-               if( $user ) {
+               if ( $user ) {
                        $username = User::whoIs( $user );
                        $block = self::newFromTarget( $username, $address );
                } else {
                        $block = self::newFromTarget( null, $address );
                }
 
-               if( $block instanceof Block ) {
+               if ( $block instanceof Block ) {
                        # This is mildly evil, but hey, it's B/C :D
-                       foreach( $block as $variable => $value ) {
+                       foreach ( $block as $variable => $value ) {
                                $this->$variable = $value;
                        }
                        return true;
@@ -237,7 +237,7 @@ class Block {
        protected function newLoad( $vagueTarget = null ) {
                $db = wfGetDB( $this->mFromMaster ? DB_MASTER : DB_SLAVE );
 
-               if( $this->type !== null ) {
+               if ( $this->type !== null ) {
                        $conds = array(
                                'ipb_address' => array( (string)$this->target ),
                        );
@@ -247,9 +247,9 @@ class Block {
 
                # Be aware that the != '' check is explicit, since empty values will be
                # passed by some callers (bug 29116)
-               if( $vagueTarget != '' ) {
+               if ( $vagueTarget != '' ) {
                        list( $target, $type ) = self::parseTarget( $vagueTarget );
-                       switch( $type ) {
+                       switch ( $type ) {
                                case self::TYPE_USER:
                                        # Slightly weird, but who are we to argue?
                                        $conds['ipb_address'][] = (string)$target;
@@ -285,20 +285,20 @@ class Block {
                # This is begging for $this = $bestBlock, but that's not allowed in PHP :(
                $bestBlockPreventsEdit = null;
 
-               foreach( $res as $row ) {
+               foreach ( $res as $row ) {
                        $block = self::newFromRow( $row );
 
                        # Don't use expired blocks
-                       if( $block->deleteIfExpired() ) {
+                       if ( $block->deleteIfExpired() ) {
                                continue;
                        }
 
                        # Don't use anon only blocks on users
-                       if( $this->type == self::TYPE_USER && !$block->isHardblock() ) {
+                       if ( $this->type == self::TYPE_USER && !$block->isHardblock() ) {
                                continue;
                        }
 
-                       if( $block->getType() == self::TYPE_RANGE ) {
+                       if ( $block->getType() == self::TYPE_RANGE ) {
                                # This is the number of bits that are allowed to vary in the block, give
                                # or take some floating point errors
                                $end = wfBaseconvert( $block->getRangeEnd(), 16, 10 );
@@ -313,14 +313,14 @@ class Block {
                                $score = $block->getType();
                        }
 
-                       if( $score < $bestBlockScore ) {
+                       if ( $score < $bestBlockScore ) {
                                $bestBlockScore = $score;
                                $bestRow = $row;
                                $bestBlockPreventsEdit = $block->prevents( 'edit' );
                        }
                }
 
-               if( $bestRow !== null ) {
+               if ( $bestRow !== null ) {
                        $this->initFromRow( $bestRow );
                        $this->prevents( 'edit', $bestBlockPreventsEdit );
                        return true;
@@ -511,7 +511,7 @@ class Block {
         * @return Array
         */
        protected function getDatabaseArray( $db = null ) {
-               if( !$db ) {
+               if ( !$db ) {
                        $db = wfGetDB( DB_SLAVE );
                }
                $expiry = $db->encodeExpiry( $this->mExpiry );
@@ -579,7 +579,7 @@ class Block {
                global $wgPutIPinRC;
 
                // No IPs are in recentchanges table, so nothing to select
-               if( !$wgPutIPinRC ) {
+               if ( !$wgPutIPinRC ) {
                        return;
                }
 
@@ -601,7 +601,9 @@ class Block {
                        foreach ( $res as $row ) {
                                if ( $row->rc_ip ) {
                                        $id = $block->doAutoblock( $row->rc_ip );
-                                       if ( $id ) $blockIds[] = $id;
+                                       if ( $id ) {
+                                               $blockIds[] = $id;
+                                       }
                                }
                        }
                }
@@ -681,7 +683,7 @@ class Block {
                if ( $ipblock ) {
                        # Check if the block is an autoblock and would exceed the user block
                        # if renewed. If so, do nothing, otherwise prolong the block time...
-                       if ( $ipblock->mAuto && // @TODO: why not compare $ipblock->mExpiry?
+                       if ( $ipblock->mAuto && // @todo Why not compare $ipblock->mExpiry?
                                $this->mExpiry > Block::getAutoblockExpiry( $ipblock->mTimestamp )
                        ) {
                                # Reset block timestamp to now and its expiry to
@@ -793,7 +795,7 @@ class Block {
         * @return String IP in Hex form
         */
        public function getRangeStart() {
-               switch( $this->type ) {
+               switch ( $this->type ) {
                        case self::TYPE_USER:
                                return '';
                        case self::TYPE_IP:
@@ -801,7 +803,8 @@ class Block {
                        case self::TYPE_RANGE:
                                list( $start, /*...*/ ) = IP::parseRange( $this->target );
                                return $start;
-                       default: throw new MWException( "Block with invalid type" );
+                       default:
+                               throw new MWException( "Block with invalid type" );
                }
        }
 
@@ -811,7 +814,7 @@ class Block {
         * @return String IP in Hex form
         */
        public function getRangeEnd() {
-               switch( $this->type ) {
+               switch ( $this->type ) {
                        case self::TYPE_USER:
                                return '';
                        case self::TYPE_IP:
@@ -819,7 +822,8 @@ class Block {
                        case self::TYPE_RANGE:
                                list( /*...*/, $end ) = IP::parseRange( $this->target );
                                return $end;
-                       default: throw new MWException( "Block with invalid type" );
+                       default:
+                               throw new MWException( "Block with invalid type" );
                }
        }
 
@@ -907,7 +911,7 @@ class Block {
         * @return Bool
         */
        public function prevents( $action, $x = null ) {
-               switch( $action ) {
+               switch ( $action ) {
                        case 'edit':
                                # For now... <evil laugh>
                                return true;
@@ -997,11 +1001,16 @@ class Block {
         * Purge expired blocks from the ipblocks table
         */
        public static function purgeExpired() {
-               if ( !wfReadOnly() ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->delete( 'ipblocks',
-                               array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), __METHOD__ );
+               if ( wfReadOnly() ) {
+                       return;
                }
+
+               $method = __METHOD__;
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+                       $dbw->delete( 'ipblocks',
+                               array( 'ipb_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ), $method );
+               } );
        }
 
        /**
@@ -1050,30 +1059,216 @@ class Block {
        public static function newFromTarget( $specificTarget, $vagueTarget = null, $fromMaster = false ) {
 
                list( $target, $type ) = self::parseTarget( $specificTarget );
-               if( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ) {
+               if ( $type == Block::TYPE_ID || $type == Block::TYPE_AUTO ) {
                        return Block::newFromID( $target );
 
-               } elseif( $target === null && $vagueTarget == '' ) {
+               } elseif ( $target === null && $vagueTarget == '' ) {
                        # We're not going to find anything useful here
                        # Be aware that the == '' check is explicit, since empty values will be
                        # passed by some callers (bug 29116)
                        return null;
 
-               } elseif( in_array( $type, array( Block::TYPE_USER, Block::TYPE_IP, Block::TYPE_RANGE, null ) ) ) {
+               } elseif ( in_array( $type, array( Block::TYPE_USER, Block::TYPE_IP, Block::TYPE_RANGE, null ) ) ) {
                        $block = new Block();
                        $block->fromMaster( $fromMaster );
 
-                       if( $type !== null ) {
+                       if ( $type !== null ) {
                                $block->setTarget( $target );
                        }
 
-                       if( $block->newLoad( $vagueTarget ) ) {
+                       if ( $block->newLoad( $vagueTarget ) ) {
                                return $block;
                        }
                }
                return null;
        }
 
+
+       /**
+        * Get all blocks that match any IP from an array of IP addresses
+        *
+        * @param Array $ipChain list of IPs (strings), usually retrieved from the
+        *         X-Forwarded-For header of the request
+        * @param Bool $isAnon Exclude anonymous-only blocks if false
+        * @param Bool $fromMaster Whether to query the master or slave database
+        * @return Array of Blocks
+        * @since 1.21
+        */
+       public static function getBlocksForIPList( array $ipChain, $isAnon, $fromMaster = false ) {
+               if ( !count( $ipChain ) ) {
+                       return array();
+               }
+
+               wfProfileIn( __METHOD__ );
+               $conds = array();
+               foreach ( array_unique( $ipChain ) as $ipaddr ) {
+                       # Discard invalid IP addresses. Since XFF can be spoofed and we do not
+                       # necessarily trust the header given to us, make sure that we are only
+                       # checking for blocks on well-formatted IP addresses (IPv4 and IPv6).
+                       # Do not treat private IP spaces as special as it may be desirable for wikis
+                       # to block those IP ranges in order to stop misbehaving proxies that spoof XFF.
+                       if ( !IP::isValid( $ipaddr ) ) {
+                               continue;
+                       }
+                       # Don't check trusted IPs (includes local squids which will be in every request)
+                       if ( wfIsTrustedProxy( $ipaddr ) ) {
+                               continue;
+                       }
+                       # Check both the original IP (to check against single blocks), as well as build
+                       # the clause to check for rangeblocks for the given IP.
+                       $conds['ipb_address'][] = $ipaddr;
+                       $conds[] = self::getRangeCond( IP::toHex( $ipaddr ) );
+               }
+
+               if ( !count( $conds ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return array();
+               }
+
+               if ( $fromMaster ) {
+                       $db = wfGetDB( DB_MASTER );
+               } else {
+                       $db = wfGetDB( DB_SLAVE );
+               }
+               $conds = $db->makeList( $conds, LIST_OR );
+               if ( !$isAnon ) {
+                       $conds = array( $conds, 'ipb_anon_only' => 0 );
+               }
+               $selectFields = array_merge(
+                       array( 'ipb_range_start', 'ipb_range_end' ),
+                       Block::selectFields()
+               );
+               $rows = $db->select( 'ipblocks',
+                       $selectFields,
+                       $conds,
+                       __METHOD__
+               );
+
+               $blocks = array();
+               foreach ( $rows as $row ) {
+                       $block = self::newFromRow( $row );
+                       if ( !$block->deleteIfExpired()  ) {
+                               $blocks[] = $block;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $blocks;
+       }
+
+       /**
+        * From a list of multiple blocks, find the most exact and strongest Block.
+        * The logic for finding the "best" block is:
+        *  - Blocks that match the block's target IP are preferred over ones in a range
+        *  - Hardblocks are chosen over softblocks that prevent account creation
+        *  - Softblocks that prevent account creation are chosen over other softblocks
+        *  - Other softblocks are chosen over autoblocks
+        *  - If there are multiple exact or range blocks at the same level, the one chosen
+        *    is random
+
+        * @param Array $ipChain list of IPs (strings). This is used to determine how "close"
+        *        a block is to the server, and if a block matches exactly, or is in a range.
+        *        The order is furthest from the server to nearest e.g., (Browser, proxy1, proxy2,
+        *        local-squid, ...)
+        * @param Array $block Array of blocks
+        * @return Block|null the "best" block from the list
+        */
+       public static function chooseBlock( array $blocks, array $ipChain ) {
+               if ( !count( $blocks ) ) {
+                       return null;
+               } elseif ( count( $blocks ) == 1 ) {
+                       return $blocks[0];
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               // Sort hard blocks before soft ones and secondarily sort blocks
+               // that disable account creation before those that don't.
+               usort( $blocks, function( Block $a, Block $b ) {
+                       $aWeight = (int)$a->isHardblock() . (int)$a->prevents( 'createaccount' );
+                       $bWeight = (int)$b->isHardblock() . (int)$b->prevents( 'createaccount' );
+                       return strcmp( $bWeight, $aWeight ); // highest weight first
+               } );
+
+               $blocksListExact = array(
+                       'hard' => false,
+                       'disable_create' => false,
+                       'other' => false,
+                       'auto' => false
+               );
+               $blocksListRange = array(
+                       'hard' => false,
+                       'disable_create' => false,
+                       'other' => false,
+                       'auto' => false
+               );
+               $ipChain = array_reverse( $ipChain );
+
+               foreach ( $blocks as $block ) {
+                       // Stop searching if we have already have a "better" block. This
+                       // is why the order of the blocks matters
+                       if ( !$block->isHardblock() && $blocksListExact['hard'] ) {
+                               break;
+                       } elseif ( !$block->prevents( 'createaccount' ) && $blocksListExact['disable_create'] ) {
+                               break;
+                       }
+
+                       foreach ( $ipChain as $checkip ) {
+                               $checkipHex = IP::toHex( $checkip );
+                               if ( (string)$block->getTarget() === $checkip ) {
+                                       if ( $block->isHardblock() ) {
+                                               $blocksListExact['hard'] = $blocksListExact['hard'] ?: $block;
+                                       } elseif ( $block->prevents( 'createaccount' ) ) {
+                                               $blocksListExact['disable_create'] = $blocksListExact['disable_create'] ?: $block;
+                                       } elseif ( $block->mAuto ) {
+                                               $blocksListExact['auto'] = $blocksListExact['auto'] ?: $block;
+                                       } else {
+                                               $blocksListExact['other'] = $blocksListExact['other'] ?: $block;
+                                       }
+                                       // We found closest exact match in the ip list, so go to the next Block
+                                       break;
+                               } elseif ( array_filter( $blocksListExact ) == array()
+                                       && $block->getRangeStart() <= $checkipHex
+                                       && $block->getRangeEnd() >= $checkipHex
+                               ) {
+                                       if ( $block->isHardblock() ) {
+                                               $blocksListRange['hard'] = $blocksListRange['hard'] ?: $block;
+                                       } elseif ( $block->prevents( 'createaccount' ) ) {
+                                               $blocksListRange['disable_create'] = $blocksListRange['disable_create'] ?: $block;
+                                       } elseif ( $block->mAuto ) {
+                                               $blocksListRange['auto'] = $blocksListRange['auto'] ?: $block;
+                                       } else {
+                                               $blocksListRange['other'] = $blocksListRange['other'] ?: $block;
+                                       }
+                                       break;
+                               }
+                       }
+               }
+
+               if ( array_filter( $blocksListExact ) == array() ) {
+                       $blocksList = &$blocksListRange;
+               } else {
+                       $blocksList = &$blocksListExact;
+               }
+
+               $chosenBlock = null;
+               if ( $blocksList['hard'] ) {
+                       $chosenBlock = $blocksList['hard'];
+               } elseif ( $blocksList['disable_create'] ) {
+                       $chosenBlock = $blocksList['disable_create'];
+               } elseif ( $blocksList['other'] ) {
+                       $chosenBlock = $blocksList['other'];
+               } elseif ( $blocksList['auto'] ) {
+                       $chosenBlock = $blocksList['auto'];
+               } else {
+                       wfProfileOut( __METHOD__ );
+                       throw new MWException( "Proxy block found, but couldn't be classified." );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $chosenBlock;
+       }
+
        /**
         * From an existing Block, get the target and the type of target.
         * Note that, except for null, it is always safe to treat the target
@@ -1085,13 +1280,13 @@ class Block {
         */
        public static function parseTarget( $target ) {
                # We may have been through this before
-               if( $target instanceof User ) {
-                       if( IP::isValid( $target->getName() ) ) {
+               if ( $target instanceof User ) {
+                       if ( IP::isValid( $target->getName() ) ) {
                                return array( $target, self::TYPE_IP );
                        } else {
                                return array( $target, self::TYPE_USER );
                        }
-               } elseif( $target === null ) {
+               } elseif ( $target === null ) {
                        return array( null, null );
                }
 
@@ -1112,7 +1307,7 @@ class Block {
 
                # Consider the possibility that this is not a username at all
                # but actually an old subpage (bug #29797)
-               if( strpos( $target, '/' ) !== false ) {
+               if ( strpos( $target, '/' ) !== false ) {
                        # An old subpage, drill down to the user behind it
                        $parts = explode( '/', $target );
                        $target = $parts[0];
@@ -1198,4 +1393,43 @@ class Block {
        public function setBlocker( $user ) {
                $this->blocker = $user;
        }
+
+       /**
+        * Get the key and parameters for the corresponding error message.
+        *
+        * @since 1.22
+        * @param IContextSource $context
+        * @return array
+        */
+       public function getPermissionsError( IContextSource $context ) {
+               $blocker = $this->getBlocker();
+               if ( $blocker instanceof User ) { // local user
+                       $blockerUserpage = $blocker->getUserPage();
+                       $link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
+               } else { // foreign user
+                       $link = $blocker;
+               }
+
+               $reason = $this->mReason;
+               if ( $reason == '' ) {
+                       $reason = $context->msg( 'blockednoreason' )->text();
+               }
+
+               /* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
+                * This could be a username, an IP range, or a single IP. */
+               $intended = $this->getTarget();
+
+               $lang = $context->getLanguage();
+               return array(
+                       $this->mAuto ? 'autoblockedtext' : 'blockedtext',
+                       $link,
+                       $reason,
+                       $context->getRequest()->getIP(),
+                       $this->getByName(),
+                       $this->getId(),
+                       $lang->formatExpiry( $this->mExpiry ),
+                       (string)$intended,
+                       $lang->timeanddate( wfTimestamp( TS_MW, $this->mTimestamp ), true ),
+               );
+       }
 }
index 868d6c4..126b8fe 100644 (file)
@@ -40,7 +40,8 @@ class Category {
        /** Counts of membership (cat_pages, cat_subcats, cat_files) */
        private $mPages = null, $mSubcats = null, $mFiles = null;
 
-       private function __construct() { }
+       private function __construct() {
+       }
 
        /**
         * Set up all member variables using a database query.
index 970adb5..a98f792 100644 (file)
@@ -526,7 +526,10 @@ class CategoryViewer extends ContextSource {
 
                        $first = true;
                        foreach ( $colContents as $char => $articles ) {
-                               $ret .= '<h3>' . htmlspecialchars( $char );
+                               # Change space to non-breaking space to keep headers aligned
+                               $h3char = $char === ' ' ? '&#160;' : htmlspecialchars( $char );
+
+                               $ret .= '<h3>' . $h3char;
                                if ( $first && $char === $prevchar ) {
                                        # We're continuing a previous chunk at the top of a new
                                        # column, so add " cont." after the letter.
index a142c7c..81c0afe 100644 (file)
@@ -133,7 +133,7 @@ class CdbReader_DBA {
        }
 
        function close() {
-               if( isset( $this->handle ) ) {
+               if ( isset( $this->handle ) ) {
                        dba_close( $this->handle );
                }
                unset( $this->handle );
@@ -164,7 +164,7 @@ class CdbWriter_DBA {
        }
 
        function close() {
-               if( isset( $this->handle ) ) {
+               if ( isset( $this->handle ) ) {
                        dba_close( $this->handle );
                }
                if ( wfIsWindows() ) {
index 71b55f8..a38b9a8 100644 (file)
@@ -73,10 +73,10 @@ class CdbFunctions {
        public static function hash( $s ) {
                $h = 5381;
                for ( $i = 0; $i < strlen( $s ); $i++ ) {
-                       $h5 = ($h << 5) & 0xffffffff;
+                       $h5 = ( $h << 5 ) & 0xffffffff;
                        // Do a 32-bit sum
                        // Inlined here for speed
-                       $sum = ($h & 0x3fffffff) + ($h5 & 0x3fffffff);
+                       $sum = ( $h & 0x3fffffff ) + ( $h5 & 0x3fffffff );
                        $h =
                                (
                                        ( $sum & 0x40000000 ? 1 : 0 )
@@ -138,7 +138,7 @@ class CdbReader_PHP extends CdbReader {
        }
 
        function close() {
-               if( isset( $this->handle ) ) {
+               if ( isset( $this->handle ) ) {
                        fclose( $this->handle );
                }
                unset( $this->handle );
@@ -332,7 +332,7 @@ class CdbWriter_PHP extends CdbWriter {
         */
        public function close() {
                $this->finish();
-               if( isset( $this->handle ) ) {
+               if ( isset( $this->handle ) ) {
                        fclose( $this->handle );
                }
                if ( wfIsWindows() && file_exists( $this->realFileName ) ) {
@@ -411,7 +411,7 @@ class CdbWriter_PHP extends CdbWriter {
                // Calculate the number of items that will be in each hashtable
                $counts = array_fill( 0, 256, 0 );
                foreach ( $this->hplist as $item ) {
-                       ++ $counts[ 255 & $item['h'] ];
+                       ++ $counts[255 & $item['h']];
                }
 
                // Fill in $starts with the *end* indexes
@@ -450,9 +450,11 @@ class CdbWriter_PHP extends CdbWriter {
                                $hp = $packedTables[$starts[$i] + $u];
                                $where = CdbFunctions::unsignedMod(
                                        CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
-                               while ( $hashtable[$where]['p'] )
-                                       if ( ++$where == $len )
+                               while ( $hashtable[$where]['p'] ) {
+                                       if ( ++$where == $len ) {
                                                $where = 0;
+                                       }
+                               }
                                $hashtable[$where] = $hp;
                        }
 
index 3adf58f..5478396 100644 (file)
@@ -37,14 +37,15 @@ class ChangeTags {
        static function formatSummaryRow( $tags, $page ) {
                global $wgLang;
 
-               if( !$tags )
+               if ( !$tags ) {
                        return array( '', array() );
+               }
 
                $classes = array();
 
                $tags = explode( ',', $tags );
                $displayTags = array();
-               foreach( $tags as $tag ) {
+               foreach ( $tags as $tag ) {
                        $displayTags[] = Xml::tags(
                                'span',
                                array( 'class' => 'mw-tag-marker ' .
@@ -93,21 +94,21 @@ class ChangeTags {
 
                $tags = array_filter( $tags ); // Make sure we're submitting all tags...
 
-               if( !$rc_id && !$rev_id && !$log_id ) {
+               if ( !$rc_id && !$rev_id && !$log_id ) {
                        throw new MWException( "At least one of: RCID, revision ID, and log ID MUST be specified when adding a tag to a change!" );
                }
 
                $dbr = wfGetDB( DB_SLAVE );
 
                // Might as well look for rcids and so on.
-               if( !$rc_id ) {
+               if ( !$rc_id ) {
                        $dbr = wfGetDB( DB_MASTER ); // Info might be out of date, somewhat fractionally, on slave.
-                       if( $log_id ) {
+                       if ( $log_id ) {
                                $rc_id = $dbr->selectField( 'recentchanges', 'rc_id', array( 'rc_logid' => $log_id ), __METHOD__ );
-                       } elseif( $rev_id ) {
+                       } elseif ( $rev_id ) {
                                $rc_id = $dbr->selectField( 'recentchanges', 'rc_id', array( 'rc_this_oldid' => $rev_id ), __METHOD__ );
                        }
-               } elseif( !$log_id && !$rev_id ) {
+               } elseif ( !$log_id && !$rev_id ) {
                        $dbr = wfGetDB( DB_MASTER ); // Info might be out of date, somewhat fractionally, on slave.
                        $log_id = $dbr->selectField( 'recentchanges', 'rc_logid', array( 'rc_id' => $rc_id ), __METHOD__ );
                        $rev_id = $dbr->selectField( 'recentchanges', 'rc_this_oldid', array( 'rc_id' => $rc_id ), __METHOD__ );
@@ -138,7 +139,7 @@ class ChangeTags {
 
                // Insert the tags rows.
                $tagsRows = array();
-               foreach( $tags as $tag ) { // Filter so we don't insert NULLs as zero accidentally.
+               foreach ( $tags as $tag ) { // Filter so we don't insert NULLs as zero accidentally.
                        $tagsRows[] = array_filter(
                                array(
                                        'ct_tag' => $tag,
@@ -173,14 +174,14 @@ class ChangeTags {
                                                                                &$join_conds, &$options, $filter_tag = false ) {
                global $wgRequest, $wgUseTagFilter;
 
-               if( $filter_tag === false ) {
+               if ( $filter_tag === false ) {
                        $filter_tag = $wgRequest->getVal( 'tagfilter' );
                }
 
                // Figure out which conditions can be done.
                if ( in_array( 'recentchanges', $tables ) ) {
                        $join_cond = 'rc_id';
-               } elseif( in_array( 'logging', $tables ) ) {
+               } elseif ( in_array( 'logging', $tables ) ) {
                        $join_cond = 'log_id';
                } elseif ( in_array( 'revision', $tables ) ) {
                        $join_cond = 'rev_id';
@@ -193,7 +194,7 @@ class ChangeTags {
                $join_conds['tag_summary'] = array( 'LEFT JOIN', "ts_$join_cond=$join_cond" );
                $fields[] = 'ts_tags';
 
-               if( $wgUseTagFilter && $filter_tag ) {
+               if ( $wgUseTagFilter && $filter_tag ) {
                        // Somebody wants to filter on a tag.
                        // Add an INNER JOIN on change_tag
 
index 476de5b..1d89888 100644 (file)
@@ -54,7 +54,7 @@ class ChangesFeed {
                        return false;
                }
 
-               if( !array_key_exists( $this->format, $wgFeedClasses ) ) {
+               if ( !array_key_exists( $this->format, $wgFeedClasses ) ) {
                        // falling back to atom
                        $this->format = 'atom';
                }
@@ -92,7 +92,7 @@ class ChangesFeed {
                 * gets it quick too.
                 */
                $cachedFeed = $this->loadFromCache( $lastmod, $timekey, $key );
-               if( is_string( $cachedFeed ) ) {
+               if ( is_string( $cachedFeed ) ) {
                        wfDebug( "RC: Outputting cached feed\n" );
                        $feed->httpHeaders();
                        echo $cachedFeed;
@@ -134,7 +134,7 @@ class ChangesFeed {
 
                $feedLastmod = $messageMemc->get( $timekey );
 
-               if( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
+               if ( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
                        /**
                         * If the cached feed was rendered very recently, we may
                         * go ahead and use it even if there have been edits made
@@ -146,7 +146,7 @@ class ChangesFeed {
                        $feedLastmodUnix = wfTimestamp( TS_UNIX, $feedLastmod );
                        $lastmodUnix = wfTimestamp( TS_UNIX, $lastmod );
 
-                       if( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix) {
+                       if ( $feedAge < $wgFeedCacheTimeout || $feedLastmodUnix > $lastmodUnix ) {
                                wfDebug( "RC: loading feed from cache ($key; $feedLastmod; $lastmod)...\n" );
                                if ( $feedLastmodUnix < $lastmodUnix ) {
                                        $wgOut->setLastModified( $feedLastmod ); // bug 21916
@@ -172,30 +172,32 @@ class ChangesFeed {
                # Merge adjacent edits by one user
                $sorted = array();
                $n = 0;
-               foreach( $rows as $obj ) {
-                       if( $n > 0 &&
+               foreach ( $rows as $obj ) {
+                       if ( $n > 0 &&
                                $obj->rc_type == RC_EDIT &&
                                $obj->rc_namespace >= 0 &&
-                               $obj->rc_cur_id == $sorted[$n-1]->rc_cur_id &&
-                               $obj->rc_user_text == $sorted[$n-1]->rc_user_text ) {
-                               $sorted[$n-1]->rc_last_oldid = $obj->rc_last_oldid;
+                               $obj->rc_cur_id == $sorted[$n - 1]->rc_cur_id &&
+                               $obj->rc_user_text == $sorted[$n - 1]->rc_user_text ) {
+                               $sorted[$n - 1]->rc_last_oldid = $obj->rc_last_oldid;
                        } else {
                                $sorted[$n] = $obj;
                                $n++;
                        }
                }
 
-               foreach( $sorted as $obj ) {
+               foreach ( $sorted as $obj ) {
                        $title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title );
-                       $talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullUrl() : '';
+                       $talkpage = MWNamespace::canTalk( $obj->rc_namespace ) ? $title->getTalkPage()->getFullURL() : '';
                        // Skip items with deleted content (avoids partially complete/inconsistent output)
-                       if( $obj->rc_deleted ) continue;
+                       if ( $obj->rc_deleted ) {
+                               continue;
+                       }
 
                        if ( $obj->rc_this_oldid ) {
-                               $url = $title->getFullURL(
-                                       'diff=' . $obj->rc_this_oldid .
-                                       '&oldid=' . $obj->rc_last_oldid
-                               );
+                               $url = $title->getFullURL( array(
+                                       'diff' => $obj->rc_this_oldid,
+                                       'oldid' => $obj->rc_last_oldid,
+                               ) );
                        } else {
                                // log entry or something like that.
                                $url = $title->getFullURL();
index 8461001..b1bb82e 100644 (file)
@@ -99,7 +99,7 @@ class ChangesList extends ContextSource {
                $user = $context->getUser();
                $sk = $context->getSkin();
                $list = null;
-               if( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
+               if ( wfRunHooks( 'FetchChangesList', array( $user, &$sk, &$list ) ) ) {
                        $new = $context->getRequest()->getBool( 'enhanced', $user->getOption( 'usenewrc' ) );
                        return $new ? new EnhancedChangesList( $context ) : new OldChangesList( $context );
                } else {
@@ -120,9 +120,11 @@ class ChangesList extends ContextSource {
         * they are called often, we call them once and save them in $this->message
         */
        private function preCacheMessages() {
-               if( !isset( $this->message ) ) {
-                       foreach ( explode( ' ', 'cur diff hist last blocklink history ' .
-                       'semicolon-separator pipe-separator' ) as $msg ) {
+               if ( !isset( $this->message ) ) {
+                       foreach ( array(
+                               'cur', 'diff', 'hist', 'last', 'blocklink', 'history',
+                               'semicolon-separator', 'pipe-separator' ) as $msg
+                       ) {
                                $this->message[$msg] = $this->msg( $msg )->escaped();
                        }
                }
@@ -136,7 +138,7 @@ class ChangesList extends ContextSource {
         */
        protected function recentChangesFlags( $flags, $nothing = '&#160;' ) {
                $f = '';
-               foreach( array( 'newpage', 'minor', 'bot', 'unpatrolled' ) as $flag ) {
+               foreach ( array( 'newpage', 'minor', 'bot', 'unpatrolled' ) as $flag ) {
                        $f .= isset( $flags[$flag] ) && $flags[$flag]
                                ? self::flag( $flag )
                                : $nothing;
@@ -162,7 +164,7 @@ class ChangesList extends ContextSource {
                                'botedit' => array( 'boteditletter', 'recentchanges-label-bot' ),
                                'unpatrolled' => array( 'unpatrolledletter', 'recentchanges-label-unpatrolled' ),
                        );
-                       foreach( $messages as &$value ) {
+                       foreach ( $messages as &$value ) {
                                $value[0] = wfMessage( $value[0] )->escaped();
                                $value[1] = wfMessage( $value[1] )->escaped();
                        }
@@ -192,7 +194,7 @@ class ChangesList extends ContextSource {
                $this->rcCacheIndex = 0;
                $this->lastdate = '';
                $this->rclistOpen = false;
-               $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
+               $this->getOutput()->addModules( 'mediawiki.special.changeslist' );
                return '';
        }
 
@@ -227,7 +229,7 @@ class ChangesList extends ContextSource {
                        $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
                }
 
-               if( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
+               if ( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
                        $tag = 'strong';
                } else {
                        $tag = 'span';
@@ -267,7 +269,7 @@ class ChangesList extends ContextSource {
                        $newlen = $old->mAttribs['rc_new_len'];
                }
 
-               if( $oldlen === null || $newlen === null ) {
+               if ( $oldlen === null || $newlen === null ) {
                        return '';
                }
 
@@ -279,7 +281,7 @@ class ChangesList extends ContextSource {
         * @return String
         */
        public function endRecentChangesList() {
-               if( $this->rclistOpen ) {
+               if ( $this->rclistOpen ) {
                        return "</ul>\n";
                } else {
                        return '';
@@ -293,8 +295,8 @@ class ChangesList extends ContextSource {
        public function insertDateHeader( &$s, $rc_timestamp ) {
                # Make date header if necessary
                $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
-               if( $date != $this->lastdate ) {
-                       if( $this->lastdate != '' ) {
+               if ( $date != $this->lastdate ) {
+                       if ( $this->lastdate != '' ) {
                                $s .= "</ul>\n";
                        }
                        $s .= Xml::element( 'h4', null, $date ) . "\n<ul class=\"special\">";
@@ -321,7 +323,7 @@ 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 ) {
                        $diffLink = $this->message['diff'];
                } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $diffLink = $this->message['diff'];
@@ -332,10 +334,6 @@ class ChangesList extends ContextSource {
                                'oldid' => $rc->mAttribs['rc_last_oldid']
                        );
 
-                       if( $unpatrolled ) {
-                               $query['rcid'] = $rc->mAttribs['rc_id'];
-                       };
-
                        $diffLink = Linker::linkKnown(
                                $rc->getTitle(),
                                $this->message['diff'],
@@ -364,12 +362,16 @@ class ChangesList extends ContextSource {
         * @param $watched
         */
        public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
-               # If it's a new article, there is no diff link, but if it hasn't been
-               # patrolled yet, we need to give users a way to do so
+               global $wgUseRCPatrol;
+
                $params = array();
 
-               if ( $unpatrolled && $rc->mAttribs['rc_type'] == RC_NEW ) {
-                       $params['rcid'] = $rc->mAttribs['rc_id'];
+               // In case we got a page creation which is yet unpatrolled and
+               // recent changes patrolling is enabled, the user probably rather
+               // wants to patrol the whole page (first revision) instead of seeing
+               // a patrollink for the current revision.
+               if ( $wgUseRCPatrol && $unpatrolled && $rc->getAttribute( 'rc_type' ) == RC_NEW ) {
+                       $params['patrolpage'] = 1;
                }
 
                $articlelink = Linker::linkKnown(
@@ -378,7 +380,7 @@ class ChangesList extends ContextSource {
                        array( 'class' => 'mw-changeslist-title' ),
                        $params
                );
-               if( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
+               if ( $this->isDeleted( $rc, Revision::DELETED_TEXT ) ) {
                        $articlelink = '<span class="history-deleted">' . $articlelink . '</span>';
                }
                # To allow for boldening pages watched by this user
@@ -421,7 +423,7 @@ class ChangesList extends ContextSource {
         * @param &$rc RecentChange
         */
        public function insertUserRelatedLinks( &$s, &$rc ) {
-               if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+               if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
                        $s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
@@ -450,8 +452,8 @@ class ChangesList extends ContextSource {
         * @return string
         */
        public function insertComment( $rc ) {
-               if( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
-                       if( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
+               if ( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
+                       if ( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
                                return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
                        } else {
                                return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
@@ -475,8 +477,8 @@ class ChangesList extends ContextSource {
         */
        protected function numberofWatchingusers( $count ) {
                static $cache = array();
-               if( $count > 0 ) {
-                       if( !isset( $cache[$count] ) ) {
+               if ( $count > 0 ) {
+                       if ( !isset( $cache[$count] ) ) {
                                $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
                        }
                        return $cache[$count];
@@ -504,7 +506,7 @@ class ChangesList extends ContextSource {
         * @return Boolean
         */
        public static function userCan( $rc, $field, User $user = null ) {
-               if( $rc->mAttribs['rc_type'] == RC_LOG ) {
+               if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
                        return LogEventsList::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
                } else {
                        return Revision::userCanBitfield( $rc->mAttribs['rc_deleted'], $field, $user );
@@ -517,7 +519,7 @@ class ChangesList extends ContextSource {
         * @return string
         */
        protected function maybeWatchedLink( $link, $watched = false ) {
-               if( $watched ) {
+               if ( $watched ) {
                        return '<strong class="mw-watched">' . $link . '</strong>';
                } else {
                        return '<span class="mw-rc-unwatched">' . $link . '</span>';
@@ -530,7 +532,7 @@ class ChangesList extends ContextSource {
         * @param $rc RecentChange
         */
        public function insertRollback( &$s, &$rc ) {
-               if( $rc->mAttribs['rc_type'] != RC_NEW && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
+               if ( $rc->mAttribs['rc_type'] != RC_NEW && $rc->mAttribs['rc_this_oldid'] && $rc->mAttribs['rc_cur_id'] ) {
                        $page = $rc->getTitle();
                        /** Check for rollback and edit permissions, disallow special pages, and only
                          * show a link on the top-most revision */
@@ -543,7 +545,7 @@ class ChangesList extends ContextSource {
                                        'user_text' => $rc->mAttribs['rc_user_text'],
                                        'deleted' => $rc->mAttribs['rc_deleted']
                                ) );
-                               $s .= ' '.Linker::generateRollback( $rev, $this->getContext() );
+                               $s .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
                        }
                }
        }
@@ -554,8 +556,9 @@ class ChangesList extends ContextSource {
         * @param $classes
         */
        public function insertTags( &$s, &$rc, &$classes ) {
-               if ( empty( $rc->mAttribs['ts_tags'] ) )
+               if ( empty( $rc->mAttribs['ts_tags'] ) ) {
                        return;
+               }
 
                list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $rc->mAttribs['ts_tags'], 'changeslist' );
                $classes = array_merge( $classes, $newClasses );
@@ -605,29 +608,29 @@ class OldChangesList extends ChangesList {
                $s = '';
                $classes = array();
                // use mw-line-even/mw-line-odd class only if linenumber is given (feature from bug 14468)
-               if( $linenumber ) {
-                       if( $linenumber & 1 ) {
+               if ( $linenumber ) {
+                       if ( $linenumber & 1 ) {
                                $classes[] = 'mw-line-odd';
-                       }
-                       else {
+                       } else {
                                $classes[] = 'mw-line-even';
                        }
                }
 
                // Indicate watched status on the line to allow for more
                // comprehensive styling.
-               $classes[] = $watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+               $classes[] = $watched && $rc->mAttribs['rc_timestamp'] >= $watched
+                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
 
                // Moved pages (very very old, not supported anymore)
-               if( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
+               if ( $rc->mAttribs['rc_type'] == RC_MOVE || $rc->mAttribs['rc_type'] == RC_MOVE_OVER_REDIRECT ) {
                // Log entries
-               } elseif( $rc->mAttribs['rc_log_type'] ) {
+               } elseif ( $rc->mAttribs['rc_log_type'] ) {
                        $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
                        $this->insertLog( $s, $logtitle, $rc->mAttribs['rc_log_type'] );
                // Log entries (old format) or log targets, and special pages
-               } elseif( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+               } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
                        list( $name, $subpage ) = SpecialPageFactory::resolveAlias( $rc->mAttribs['rc_title'] );
-                       if( $name == 'Log' ) {
+                       if ( $name == 'Log' ) {
                                $this->insertLog( $s, $rc->getTitle(), $subpage );
                        }
                // Regular entries
@@ -673,11 +676,11 @@ class OldChangesList extends ChangesList {
                $this->insertExtra( $s, $rc, $classes );
 
                # How many users watch this page
-               if( $rc->numberofWatchingusers > 0 ) {
+               if ( $rc->numberofWatchingusers > 0 ) {
                        $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
                }
 
-               if( $this->watchlist ) {
+               if ( $this->watchlist ) {
                        $classes[] = Sanitizer::escapeClass( 'watchlist-' . $rc->mAttribs['rc_namespace'] . '-' . $rc->mAttribs['rc_title'] );
                }
 
@@ -708,7 +711,7 @@ class EnhancedChangesList extends ChangesList {
                $this->rcCacheIndex = 0;
                $this->lastdate = '';
                $this->rclistOpen = false;
-               $this->getOutput()->addModuleStyles( 'mediawiki.special.changeslist' );
+               $this->getOutput()->addModules( 'mediawiki.special.changeslist' );
                return '';
        }
        /**
@@ -730,7 +733,7 @@ class EnhancedChangesList extends ChangesList {
                # If it's a new day, add the headline and flush the cache
                $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() );
                $ret = '';
-               if( $date != $this->lastdate ) {
+               if ( $date != $this->lastdate ) {
                        # Process current cache
                        $ret = $this->recentChangesBlock();
                        $this->rc_cache = array();
@@ -746,14 +749,13 @@ class EnhancedChangesList extends ChangesList {
                $type = $rc->mAttribs['rc_type'];
                $logType = $rc->mAttribs['rc_log_type'];
                // Page moves, very old style, not supported anymore
-               if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
                // New unpatrolled pages
-               } elseif( $rc->unpatrolled && $type == RC_NEW ) {
-                       $clink = Linker::linkKnown( $rc->getTitle(), null, array(),
-                               array( 'rcid' => $rc->mAttribs['rc_id'] ) );
+               } elseif ( $rc->unpatrolled && $type == RC_NEW ) {
+                       $clink = Linker::linkKnown( $rc->getTitle() );
                // Log entries
-               } elseif( $type == RC_LOG ) {
-                       if( $logType ) {
+               } elseif ( $type == RC_LOG ) {
+                       if ( $logType ) {
                                $logtitle = SpecialPage::getTitleFor( 'Log', $logType );
                                $logpage = new LogPage( $logType );
                                $logname = $logpage->getName()->escaped();
@@ -763,7 +765,7 @@ class EnhancedChangesList extends ChangesList {
                        }
                        $watched = false;
                // Log entries (old format) and special pages
-               } elseif( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
+               } elseif ( $rc->mAttribs['rc_namespace'] == NS_SPECIAL ) {
                        wfDebug( "Unexpected special page in recentchanges\n" );
                        $clink = '';
                // Edits
@@ -786,19 +788,14 @@ class EnhancedChangesList extends ChangesList {
                # called too many times (50% of CPU time on RecentChanges!).
                $thisOldid = $rc->mAttribs['rc_this_oldid'];
                $lastOldid = $rc->mAttribs['rc_last_oldid'];
-               if( $rc->unpatrolled ) {
-                       $rcIdQuery = array( 'rcid' => $rc->mAttribs['rc_id'] );
-               } else {
-                       $rcIdQuery = array();
-               }
+
                $querycur = $curIdEq + array( 'diff' => '0', 'oldid' => $thisOldid );
-               $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' =>
-                       $lastOldid ) + $rcIdQuery;
+               $querydiff = $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid );
 
-               if( !$showdifflinks ) {
+               if ( !$showdifflinks ) {
                        $curLink = $this->message['cur'];
                        $diffLink = $this->message['diff'];
-               } elseif( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
+               } elseif ( in_array( $type, array( RC_NEW, RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
                        if ( $type != RC_NEW ) {
                                $curLink = $this->message['cur'];
                        } else {
@@ -814,17 +811,17 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # Make "last" link
-               if( !$showdifflinks || !$lastOldid ) {
+               if ( !$showdifflinks || !$lastOldid ) {
                        $lastLink = $this->message['last'];
-               } elseif( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
+               } elseif ( in_array( $type, array( RC_LOG, RC_MOVE, RC_MOVE_OVER_REDIRECT ) ) ) {
                        $lastLink = $this->message['last'];
                } else {
                        $lastLink = Linker::linkKnown( $rc->getTitle(), $this->message['last'],
-                               array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) + $rcIdQuery );
+                               array(), $curIdEq + array( 'diff' => $thisOldid, 'oldid' => $lastOldid ) );
                }
 
                # Make user links
-               if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
+               if ( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
                        $rc->userlink = ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        $rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
@@ -839,15 +836,15 @@ class EnhancedChangesList extends ChangesList {
                # Page moves go on their own line
                $title = $rc->getTitle();
                $secureName = $title->getPrefixedDBkey();
-               if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
                        # Use an @ character to prevent collision with page names
-                       $this->rc_cache['@@' . ($this->rcMoveIndex++)] = array( $rc );
+                       $this->rc_cache['@@' . ( $this->rcMoveIndex++ )] = array( $rc );
                } else {
                        # Logs are grouped by type
-                       if( $type == RC_LOG ) {
+                       if ( $type == RC_LOG ) {
                                $secureName = SpecialPage::getTitleFor( 'Log', $logType )->getPrefixedDBkey();
                        }
-                       if( !isset( $this->rc_cache[$secureName] ) ) {
+                       if ( !isset( $this->rc_cache[$secureName] ) ) {
                                $this->rc_cache[$secureName] = array();
                        }
 
@@ -878,7 +875,8 @@ class EnhancedChangesList extends ChangesList {
                        $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
                                        . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
                }
-               $classes[] = $block[0]->watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+               $classes[] = $block[0]->watched && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
+                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
                $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
                        Html::openElement( 'tr' );
 
@@ -893,39 +891,39 @@ class EnhancedChangesList extends ChangesList {
                # Some catalyst variables...
                $namehidden = true;
                $allLogs = true;
-               foreach( $block as $rcObj ) {
+               foreach ( $block as $rcObj ) {
                        $oldid = $rcObj->mAttribs['rc_last_oldid'];
-                       if( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
+                       if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
                                $isnew = true;
                        }
                        // If all log actions to this page were hidden, then don't
                        // give the name of the affected page for this block!
-                       if( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
+                       if ( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
                                $namehidden = false;
                        }
                        $u = $rcObj->userlink;
-                       if( !isset( $userlinks[$u] ) ) {
+                       if ( !isset( $userlinks[$u] ) ) {
                                $userlinks[$u] = 0;
                        }
-                       if( $rcObj->unpatrolled ) {
+                       if ( $rcObj->unpatrolled ) {
                                $unpatrolled = true;
                        }
-                       if( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
+                       if ( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
                                $allLogs = false;
                        }
                        # Get the latest entry with a page_id and oldid
                        # since logs may not have these.
-                       if( !$curId && $rcObj->mAttribs['rc_cur_id'] ) {
+                       if ( !$curId && $rcObj->mAttribs['rc_cur_id'] ) {
                                $curId = $rcObj->mAttribs['rc_cur_id'];
                        }
-                       if( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) {
+                       if ( !$currentRevision && $rcObj->mAttribs['rc_this_oldid'] ) {
                                $currentRevision = $rcObj->mAttribs['rc_this_oldid'];
                        }
 
-                       if( !$rcObj->mAttribs['rc_bot'] ) {
+                       if ( !$rcObj->mAttribs['rc_bot'] ) {
                                $allBots = false;
                        }
-                       if( !$rcObj->mAttribs['rc_minor'] ) {
+                       if ( !$rcObj->mAttribs['rc_minor'] ) {
                                $allMinors = false;
                        }
 
@@ -936,10 +934,10 @@ class EnhancedChangesList extends ChangesList {
                krsort( $userlinks );
                asort( $userlinks );
                $users = array();
-               foreach( $userlinks as $userlink => $count) {
+               foreach ( $userlinks as $userlink => $count ) {
                        $text = $userlink;
                        $text .= $this->getLanguage()->getDirMark();
-                       if( $count > 1 ) {
+                       if ( $count > 1 ) {
                                $text .= ' ' . $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->formatNum( $count ) . '×' )->escaped();
                        }
                        array_push( $users, $text );
@@ -950,7 +948,7 @@ class EnhancedChangesList extends ChangesList {
                                implode( $this->message['semicolon-separator'], $users )
                        )->escaped() . '</span>';
 
-               $tl = '<span class="mw-collapsible-toggle mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
+               $tl = '<span class="mw-collapsible-toggle mw-collapsible-arrow mw-enhancedchanges-arrow mw-enhancedchanges-arrow-space"></span>';
                $r .= "<td>$tl</td>";
 
                # Main line
@@ -965,9 +963,9 @@ class EnhancedChangesList extends ChangesList {
                $r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
 
                # Article link
-               if( $namehidden ) {
+               if ( $namehidden ) {
                        $r .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
-               } elseif( $allLogs ) {
+               } elseif ( $allLogs ) {
                        $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
                } else {
                        $this->insertArticleLink( $r, $block[0], $block[0]->unpatrolled, $block[0]->watched );
@@ -985,10 +983,10 @@ class EnhancedChangesList extends ChangesList {
                # Total change link
                $r .= ' ';
                $logtext = '';
-               if( !$allLogs ) {
-                       if( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+               if ( !$allLogs ) {
+                       if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
                                $logtext .= $nchanges[$n];
-                       } elseif( $isnew ) {
+                       } elseif ( $isnew ) {
                                $logtext .= $nchanges[$n];
                        } else {
                                $params = $queryParams;
@@ -1006,9 +1004,9 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # History
-               if( $allLogs ) {
+               if ( $allLogs ) {
                        // don't show history link for logs
-               } elseif( $namehidden || !$block[0]->getTitle()->exists() ) {
+               } elseif ( $namehidden || !$block[0]->getTitle()->exists() ) {
                        $logtext .= $this->message['pipe-separator'] . $this->message['hist'];
                } else {
                        $params = $queryParams;
@@ -1023,30 +1021,30 @@ class EnhancedChangesList extends ChangesList {
                                );
                }
 
-               if( $logtext !== '' ) {
+               if ( $logtext !== '' ) {
                        $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
                }
 
                $r .= ' <span class="mw-changeslist-separator">. .</span> ';
 
                # Character difference (does not apply if only log items)
-               if( $wgRCShowChangedSize && !$allLogs ) {
+               if ( $wgRCShowChangedSize && !$allLogs ) {
                        $last = 0;
                        $first = count( $block ) - 1;
                        # Some events (like logs) have an "empty" size, so we need to skip those...
-                       while( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
+                       while ( $last < $first && $block[$last]->mAttribs['rc_new_len'] === null ) {
                                $last++;
                        }
-                       while( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) {
+                       while ( $first > $last && $block[$first]->mAttribs['rc_old_len'] === null ) {
                                $first--;
                        }
                        # Get net change
                        $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
 
-                       if( $chardiff == '' ) {
+                       if ( $chardiff == '' ) {
                                $r .= ' ';
                        } else {
-                               $r .= ' ' . $chardiff. ' <span class="mw-changeslist-separator">. .</span> ';
+                               $r .= ' ' . $chardiff . ' <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
@@ -1054,12 +1052,15 @@ class EnhancedChangesList extends ChangesList {
                $r .= $this->numberofWatchingusers( $block[0]->numberofWatchingusers );
 
                # Sub-entries
-               foreach( $block as $rcObj ) {
+               foreach ( $block as $rcObj ) {
                        # Classes to apply -- TODO implement
                        $classes = array();
                        $type = $rcObj->mAttribs['rc_type'];
 
-                       $r .= '<tr><td></td><td class="mw-enhanced-rc">';
+                       $trClass = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+                               ? ' class="mw-enhanced-watched"' : '';
+
+                       $r .= '<tr' . $trClass . '><td></td><td class="mw-enhanced-rc">';
                        $r .= $this->recentChangesFlags( array(
                                'newpage' => $type == RC_NEW,
                                'minor' => $rcObj->mAttribs['rc_minor'],
@@ -1070,20 +1071,17 @@ class EnhancedChangesList extends ChangesList {
 
                        $params = $queryParams;
 
-                       if( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
+                       if ( $rcObj->mAttribs['rc_this_oldid'] != 0 ) {
                                $params['oldid'] = $rcObj->mAttribs['rc_this_oldid'];
                        }
 
                        # Log timestamp
-                       if( $type == RC_LOG ) {
+                       if ( $type == RC_LOG ) {
                                $link = $rcObj->timestamp;
                        # Revision link
-                       } elseif( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       } elseif ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
                                $link = '<span class="history-deleted">' . $rcObj->timestamp . '</span> ';
                        } else {
-                               if ( $rcObj->unpatrolled && $type == RC_NEW) {
-                                       $params['rcid'] = $rcObj->mAttribs['rc_id'];
-                               }
 
                                $link = Linker::linkKnown(
                                                $rcObj->getTitle(),
@@ -1091,7 +1089,7 @@ class EnhancedChangesList extends ChangesList {
                                                array(),
                                                $params
                                        );
-                               if( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
+                               if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
                                        $link = '<span class="history-deleted">' . $link . '</span> ';
                                }
                        }
@@ -1192,7 +1190,7 @@ class EnhancedChangesList extends ChangesList {
                $type = $rcObj->mAttribs['rc_type'];
                $logType = $rcObj->mAttribs['rc_log_type'];
                $classes = array( 'mw-enhanced-rc' );
-               if( $logType ) {
+               if ( $logType ) {
                        # Log entry
                        $classes[] = Sanitizer::escapeClass( 'mw-changeslist-log-'
                                        . $logType . '-' . $rcObj->mAttribs['rc_title'] );
@@ -1200,13 +1198,14 @@ class EnhancedChangesList extends ChangesList {
                        $classes[] = Sanitizer::escapeClass( 'mw-changeslist-ns' .
                                        $rcObj->mAttribs['rc_namespace'] . '-' . $rcObj->mAttribs['rc_title'] );
                }
-               $classes[] = $rcObj->watched ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
+               $classes[] = $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
+                       ? 'mw-changeslist-line-watched' : 'mw-changeslist-line-not-watched';
                $r = Html::openElement( 'table', array( 'class' => $classes ) ) .
                        Html::openElement( 'tr' );
 
                $r .= '<td class="mw-enhanced-rc"><span class="mw-enhancedchanges-arrow-space"></span>';
                # Flag and Timestamp
-               if( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
+               if ( $type == RC_MOVE || $type == RC_MOVE_OVER_REDIRECT ) {
                        $r .= '&#160;&#160;&#160;&#160;'; // 4 flags -> 4 spaces
                } else {
                        $r .= $this->recentChangesFlags( array(
@@ -1218,7 +1217,7 @@ class EnhancedChangesList extends ChangesList {
                }
                $r .= '&#160;' . $rcObj->timestamp . '&#160;</td><td>';
                # Article or log link
-               if( $logType ) {
+               if ( $logType ) {
                        $logPage = new LogPage( $logType );
                        $logTitle = SpecialPage::getTitleFor( 'Log', $logType );
                        $logName = $logPage->getName()->escaped();
@@ -1272,15 +1271,15 @@ class EnhancedChangesList extends ChangesList {
         * @return string
         */
        protected function recentChangesBlock() {
-               if( count ( $this->rc_cache ) == 0 ) {
+               if ( count ( $this->rc_cache ) == 0 ) {
                        return '';
                }
 
                wfProfileIn( __METHOD__ );
 
                $blockOut = '';
-               foreach( $this->rc_cache as $block ) {
-                       if( count( $block ) < 2 ) {
+               foreach ( $this->rc_cache as $block ) {
+                       if ( count( $block ) < 2 ) {
                                $blockOut .= $this->recentChangesBlockLine( array_shift( $block ) );
                        } else {
                                $blockOut .= $this->recentChangesBlockGroup( $block );
index a0e1d2d..ed8a031 100644 (file)
@@ -40,7 +40,7 @@ abstract class Collation {
         * @return Collation
         */
        static function factory( $collationName ) {
-               switch( $collationName ) {
+               switch ( $collationName ) {
                        case 'uppercase':
                                return new UppercaseCollation;
                        case 'identity':
@@ -62,7 +62,7 @@ abstract class Collation {
                                }
 
                                // If all else fails...
-                               throw new MWException( __METHOD__.": unknown collation type \"$collationName\"" );
+                               throw new MWException( __METHOD__ . ": unknown collation type \"$collationName\"" );
                }
        }
 
@@ -213,7 +213,9 @@ class IcuCollation extends Collation {
                'pl' => array( "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ),
                'pt' => array(),
                'ru' => array(),
+               'sv' => array( "Å", "Ä", "Ö" ),
                'uk' => array( "Ґ", "Ь" ),
+               'vi' => array( "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ),
                // Not verified, but likely correct
                'af' => array(),
                'ast' => array( "Ch", "Ll", "Ñ" ),
@@ -266,14 +268,11 @@ class IcuCollation extends Collation {
                'smn' => array( "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ),
                'sq' => array( "Ç", "Dh", "Ë", "Gj", "Ll", "Nj", "Rr", "Sh", "Th", "Xh", "Zh" ),
                'sr' => array(),
-               'sv' => array( "Å", "Ä", "Ö" ),
-               '-sv' => array( "Þ" ), // sorted as "th" in Swedish, causing unexpected output - bug 45446
                'tk' => array( "Ç", "Ä", "Ž", "Ň", "Ö", "Ş", "Ü", "Ý" ),
                'tl' => array( "Ñ", "Ng" ),
                'tr' => array( "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ),
                'tt' => array( "Ә", "Ө", "Ү", "Җ", "Ң", "Һ" ),
                'uz' => array( "Ch", "G'", "Ng", "O'", "Sh" ),
-               'vi' => array( "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ),
        );
 
        const RECORD_LENGTH = 14;
@@ -350,21 +349,21 @@ class IcuCollation extends Collation {
                $cacheEntry = $cache->get( $cacheKey );
 
                if ( $cacheEntry && isset( $cacheEntry['version'] )
-                       && $cacheEntry['version'] == self::FIRST_LETTER_VERSION ) 
-               {
+                       && $cacheEntry['version'] == self::FIRST_LETTER_VERSION
+               {
                        $this->firstLetterData = $cacheEntry;
                        return $this->firstLetterData;
                }
 
                // Generate data from serialized data file
 
-               if ( isset ( self::$tailoringFirstLetters[$this->locale] ) ) {
+               if ( isset( self::$tailoringFirstLetters[$this->locale] ) ) {
                        $letters = wfGetPrecompiledData( "first-letters-root.ser" );
                        // Append additional characters
                        $letters = array_merge( $letters, self::$tailoringFirstLetters[$this->locale] );
                        // Remove unnecessary ones, if any
-                       if ( isset( self::$tailoringFirstLetters[ '-' . $this->locale ] ) ) {
-                               $letters = array_diff( $letters, self::$tailoringFirstLetters[ '-' . $this->locale ] );
+                       if ( isset( self::$tailoringFirstLetters['-' . $this->locale] ) ) {
+                               $letters = array_diff( $letters, self::$tailoringFirstLetters['-' . $this->locale] );
                        }
                } else {
                        $letters = wfGetPrecompiledData( "first-letters-{$this->locale}.ser" );
@@ -396,6 +395,72 @@ 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.
+
+               $prev = false;
+               $duplicatePrefixes = array();
+               foreach ( $letterMap as $key => $value ) {
+                       // Remove terminator byte. Otherwise the prefix
+                       // comparison will get hung up on that.
+                       $trimmedKey = rtrim( $key, "\0" );
+                       if ( $prev === false || $prev === '' ) {
+                               $prev = $trimmedKey;
+                               // We don't yet have a collation element
+                               // to compare against, so continue.
+                               continue;
+                       }
+
+                       // Due to the fact the array is sorted, we only have
+                       // to compare with the element directly previous
+                       // to the current element (skipping expansions).
+                       // An element "X" will always sort directly
+                       // before "XZ" (Unless we have "XY", but we
+                       // do not update $prev in that case).
+                       if ( substr( $trimmedKey, 0, strlen( $prev ) ) === $prev ) {
+                               $duplicatePrefixes[] = $key;
+                               // If this is an expansion, we don't want to
+                               // compare the next element to this element,
+                               // but to what is currently $prev
+                               continue;
+                       }
+                       $prev = $trimmedKey;
+               }
+               foreach ( $duplicatePrefixes as $badKey ) {
+                       wfDebug( "Removing '{$letterMap[$badKey]}' from first letters." );
+                       unset( $letterMap[$badKey] );
+                       // This code assumes that unsetting does not change sort order.
+               }
                $data = array(
                        'chars' => array_values( $letterMap ),
                        'keys' => array_keys( $letterMap ),
index 1d9ca92..67cb87d 100644 (file)
@@ -278,19 +278,23 @@ class ConfEditor {
        function getVars() {
                $vars = array();
                $this->parse();
-               foreach( $this->pathInfo as $path => $data ) {
-                       if ( $path[0] != '$' )
+               foreach ( $this->pathInfo as $path => $data ) {
+                       if ( $path[0] != '$' ) {
                                continue;
+                       }
                        $trimmedPath = substr( $path, 1 );
                        $name = $data['name'];
-                       if ( $name[0] == '@' )
+                       if ( $name[0] == '@' ) {
                                continue;
-                       if ( $name[0] == '$' )
+                       }
+                       if ( $name[0] == '$' ) {
                                $name = substr( $name, 1 );
+                       }
                        $parentPath = substr( $trimmedPath, 0,
                                strlen( $trimmedPath ) - strlen( $name ) );
-                       if( substr( $parentPath, -1 ) == '/' )
+                       if ( substr( $parentPath, -1 ) == '/' ) {
                                $parentPath = substr( $parentPath, 0, -1 );
+                       }
 
                        $value = substr( $this->text, $data['valueStartByte'],
                                $data['valueEndByte'] - $data['valueStartByte']
@@ -315,13 +319,15 @@ class ConfEditor {
                $target =& $array;
                if ( $path !== '' ) {
                        foreach ( $pathArr as $p ) {
-                               if( !isset( $target[$p] ) )
+                               if ( !isset( $target[$p] ) ) {
                                        $target[$p] = array();
+                               }
                                $target =& $target[$p];
                        }
                }
-               if ( !isset( $target[$key] ) )
+               if ( !isset( $target[$key] ) ) {
                        $target[$key] = $value;
+               }
        }
 
        /**
@@ -329,25 +335,30 @@ class ConfEditor {
         * @return mixed Parsed value
         */
        function parseScalar( $str ) {
-               if ( $str !== '' && $str[0] == '\'' )
+               if ( $str !== '' && $str[0] == '\'' ) {
                        // Single-quoted string
                        // @todo FIXME: trim() call is due to mystery bug where whitespace gets
                        // appended to the token; without it we ended up reading in the
                        // extra quote on the end!
                        return strtr( substr( trim( $str ), 1, -1 ),
                                array( '\\\'' => '\'', '\\\\' => '\\' ) );
-               if ( $str !== '' && $str[0] == '"' )
+               }
+               if ( $str !== '' && $str[0] == '"' ) {
                        // Double-quoted string
                        // @todo FIXME: trim() call is due to mystery bug where whitespace gets
                        // appended to the token; without it we ended up reading in the
                        // extra quote on the end!
                        return stripcslashes( substr( trim( $str ), 1, -1 ) );
-               if ( substr( $str, 0, 4 ) == 'true' )
+               }
+               if ( substr( $str, 0, 4 ) == 'true' ) {
                        return true;
-               if ( substr( $str, 0, 5 ) == 'false' )
+               }
+               if ( substr( $str, 0, 5 ) == 'false' ) {
                        return false;
-               if ( substr( $str, 0, 4 ) == 'null' )
+               }
+               if ( substr( $str, 0, 4 ) == 'null' ) {
                        return null;
+               }
                // Must be some kind of numeric value, so let PHP's weak typing
                // be useful for a change
                return $str;
@@ -537,7 +548,7 @@ class ConfEditor {
         */
        function getIndent( $pos, $key = false, $arrowPos = false ) {
                $arrowIndent = ' ';
-               if ( $pos == 0 || $this->text[$pos-1] == "\n" ) {
+               if ( $pos == 0 || $this->text[$pos - 1] == "\n" ) {
                        $indentLength = strspn( $this->text, " \t", $pos );
                        $indent = substr( $this->text, $pos, $indentLength );
                } else {
@@ -559,7 +570,7 @@ class ConfEditor {
        public function parse() {
                $this->initParse();
                $this->pushState( 'file' );
-               $this->pushPath( '@extra-' . ($this->serial++) );
+               $this->pushPath( '@extra-' . ( $this->serial++ ) );
                $token = $this->firstToken();
 
                while ( !$token->isEnd() ) {
@@ -617,19 +628,21 @@ class ConfEditor {
                                $this->expect( '=' );
                                $this->skipSpace();
                                $this->startPathValue();
-                               if ( $arrayAssign )
+                               if ( $arrayAssign ) {
                                        $this->pushState( 'expression', 'array assign end' );
-                               else
+                               } else {
                                        $this->pushState( 'expression', 'statement end' );
+                               }
                                break;
                        case 'array assign end':
                        case 'statement end':
                                $this->endPathValue();
-                               if ( $state == 'array assign end' )
+                               if ( $state == 'array assign end' ) {
                                        $this->popPath();
+                               }
                                $this->skipSpace();
                                $this->expect( ';' );
-                               $this->nextPath( '@extra-' . ($this->serial++) );
+                               $this->nextPath( '@extra-' . ( $this->serial++ ) );
                                break;
                        case 'expression':
                                $token = $this->skipSpace();
@@ -649,7 +662,7 @@ class ConfEditor {
                                $this->skipSpace();
                                $this->expect( '(' );
                                $this->skipSpace();
-                               $this->pushPath( '@extra-' . ($this->serial++) );
+                               $this->pushPath( '@extra-' . ( $this->serial++ ) );
                                if ( $this->isAhead( ')' ) ) {
                                        // Empty array
                                        $this->pushState( 'array end' );
@@ -681,7 +694,7 @@ class ConfEditor {
                                        $this->endPathValue();
                                        $this->markComma();
                                        $this->nextToken();
-                                       $this->nextPath( '@extra-' . ($this->serial++) );
+                                       $this->nextPath( '@extra-' . ( $this->serial++ ) );
                                        // Look ahead to find ending bracket
                                        if ( $this->isAhead( ")" ) ) {
                                                // Found ending bracket, no continuation
@@ -1056,7 +1069,7 @@ class ConfEditorParseError extends MWException {
                $lines = StringUtils::explode( "\n", $text );
                foreach ( $lines as $lineNum => $line ) {
                        if ( $lineNum == $this->lineNum - 1 ) {
-                               return "$line\n" .str_repeat( ' ', $this->colNum - 1 ) . "^\n";
+                               return "$line\n" . str_repeat( ' ', $this->colNum - 1 ) . "^\n";
                        }
                }
                return '';
diff --git a/includes/CryptRand.php b/includes/CryptRand.php
deleted file mode 100644 (file)
index d0305d8..0000000
+++ /dev/null
@@ -1,497 +0,0 @@
-<?php
-/**
- * A cryptographic random generator class used for generating secret keys
- *
- * This is based in part on Drupal code as well as what we used in our own code
- * prior to introduction of this 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
- *
- * @author Daniel Friesen
- * @file
- */
-
-class MWCryptRand {
-
-       /**
-        * Minimum number of iterations we want to make in our drift calculations.
-        */
-       const MIN_ITERATIONS = 1000;
-
-       /**
-        * Number of milliseconds we want to spend generating each separate byte
-        * of the final generated bytes.
-        * This is used in combination with the hash length to determine the duration
-        * we should spend doing drift calculations.
-        */
-       const MSEC_PER_BYTE = 0.5;
-
-       /**
-        * Singleton instance for public use
-        */
-       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.
-        */
-       protected $strong = null;
-
-       /**
-        * Initialize an initial random state based off of whatever we can find
-        */
-       protected function initialRandomState() {
-               // $_SERVER contains a variety of unstable user and system specific information
-               // It'll vary a little with each page, and vary even more with separate users
-               // It'll also vary slightly across different machines
-               $state = serialize( $_SERVER );
-
-               // To try vary the system information of the state a bit more
-               // by including the system's hostname into the state
-               $state .= wfHostname();
-
-               // Try to gather a little entropy from the different php rand sources
-               $state .= rand() . uniqid( mt_rand(), true );
-
-               // Include some information about the filesystem's current state in the random state
-               $files = array();
-
-               // We know this file is here so grab some info about ourselves
-               $files[] = __FILE__;
-
-               // We must also have a parent folder, and with the usual file structure, a grandparent
-               $files[] = __DIR__;
-               $files[] = dirname( __DIR__ );
-
-               // The config file is likely the most often edited file we know should be around
-               // so include its stat info into the state.
-               // The constant with its location will almost always be defined, as WebStart.php defines
-               // MW_CONFIG_FILE to $IP/LocalSettings.php unless being configured with MW_CONFIG_CALLBACK (eg. the installer)
-               if ( defined( 'MW_CONFIG_FILE' ) ) {
-                       $files[] = MW_CONFIG_FILE;
-               }
-
-               foreach ( $files as $file ) {
-                       wfSuppressWarnings();
-                       $stat = stat( $file );
-                       wfRestoreWarnings();
-                       if ( $stat ) {
-                               // stat() duplicates data into numeric and string keys so kill off all the numeric ones
-                               foreach ( $stat as $k => $v ) {
-                                       if ( is_numeric( $k ) ) {
-                                               unset( $k );
-                                       }
-                               }
-                               // The absolute filename itself will differ from install to install so don't leave it out
-                               if( ( $path = realpath( $file ) ) !== false ) {
-                                       $state .= $path;
-                               } else {
-                                       $state .= $file;
-                               }
-                               $state .= implode( '', $stat );
-                       } else {
-                               // The fact that the file isn't there is worth at least a
-                               // minuscule amount of entropy.
-                               $state .= '0';
-                       }
-               }
-
-               // Try and make this a little more unstable by including the varying process
-               // id of the php process we are running inside of if we are able to access it
-               if ( function_exists( 'getmypid' ) ) {
-                       $state .= getmypid();
-               }
-
-               // If available try to increase the instability of the data by throwing in
-               // the precise amount of memory that we happen to be using at the moment.
-               if ( function_exists( 'memory_get_usage' ) ) {
-                       $state .= memory_get_usage( true );
-               }
-
-               // It's mostly worthless but throw the wiki's id into the data for a little more variance
-               $state .= wfWikiID();
-
-               // If we have a secret key or proxy key set then throw it into the state as well
-               global $wgSecretKey, $wgProxyKey;
-               if ( $wgSecretKey ) {
-                       $state .= $wgSecretKey;
-               } elseif ( $wgProxyKey ) {
-                       $state .= $wgProxyKey;
-               }
-
-               return $state;
-       }
-
-       /**
-        * Randomly hash data while mixing in clock drift data for randomness
-        *
-        * @param string $data The data to randomly hash.
-        * @return String The hashed bytes
-        * @author Tim Starling
-        */
-       protected function driftHash( $data ) {
-               // Minimum number of iterations (to avoid slow operations causing the 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();
-               // Create a buffer to use to trigger memory operations
-               $bufLength = 10000000;
-               $buffer = str_repeat( ' ', $bufLength );
-               $bufPos = 0;
-
-               // Iterate for $duration seconds or at least $minIterations number of iterations
-               $iterations = 0;
-               $startTime = microtime( true );
-               $currentTime = $startTime;
-               while ( $iterations < $minIterations || $currentTime - $startTime < $duration ) {
-                       // Trigger some memory writing to trigger some bus activity
-                       // This may create variance in the time between iterations
-                       $bufPos = ( $bufPos + 13 ) % $bufLength;
-                       $buffer[$bufPos] = ' ';
-                       // Add the drift between this iteration and the last in as entropy
-                       $nextTime = microtime( true );
-                       $delta = (int)( ( $nextTime - $currentTime ) * 1000000 );
-                       $data .= $delta;
-                       // Every 100 iterations hash the data and entropy
-                       if ( $iterations % 100 === 0 ) {
-                               $data = sha1( $data );
-                       }
-                       $currentTime = $nextTime;
-                       $iterations++;
-               }
-               $timeTaken = $currentTime - $startTime;
-               $data = $this->hash( $data );
-
-               wfDebug( __METHOD__ . ": Clock drift calculation " .
-                       "(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
-                       "iterations=$iterations, " .
-                       "time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)\n" );
-               return $data;
-       }
-
-       /**
-        * Return a rolling random state initially build using data from unstable sources
-        * @return string A new weak random state
-        */
-       protected function randomState() {
-               static $state = null;
-               if ( is_null( $state ) ) {
-                       // 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() );
-               }
-               // Generate a new random state based on the initial random state or previous
-               // random state by combining it with clock drift
-               $state = $this->driftHash( $state );
-               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 $data string
-        * @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 $data string
-        * @param $key string
-        * @return String A raw hash of the data
-        */
-       protected function hmac( $data, $key ) {
-               return hash_hmac( $this->hashAlgo(), $data, $key, true );
-       }
-
-       /**
-        * @see self::wasStrong()
-        */
-       public function realWasStrong() {
-               if ( is_null( $this->strong ) ) {
-                       throw new MWException( __METHOD__ . ' called before generation of random data' );
-               }
-               return $this->strong;
-       }
-
-       /**
-        * @see self::generate()
-        */
-       public function realGenerate( $bytes, $forceStrong = false ) {
-               wfProfileIn( __METHOD__ );
-
-               wfDebug( __METHOD__ . ": Generating cryptographic random bytes for " . wfGetAllCallers( 5 ) . "\n" );
-
-               $bytes = floor( $bytes );
-               static $buffer = '';
-               if ( is_null( $this->strong ) ) {
-                       // Set strength to false initially until we know what source data is coming from
-                       $this->strong = true;
-               }
-
-               if ( strlen( $buffer ) < $bytes ) {
-                       // If available make use of mcrypt_create_iv URANDOM source to generate randomness
-                       // On unix-like systems this reads from /dev/urandom but does it without any buffering
-                       // and bypasses openbasedir restrictions, so it's preferable to reading directly
-                       // On Windows starting in PHP 5.3.0 Windows' native CryptGenRandom is used to generate
-                       // entropy so this is also preferable to just trying to read urandom because it may work
-                       // on Windows systems as well.
-                       if ( function_exists( 'mcrypt_create_iv' ) ) {
-                               wfProfileIn( __METHOD__ . '-mcrypt' );
-                               $rem = $bytes - strlen( $buffer );
-                               $iv = mcrypt_create_iv( $rem, MCRYPT_DEV_URANDOM );
-                               if ( $iv === false ) {
-                                       wfDebug( __METHOD__ . ": mcrypt_create_iv returned false.\n" );
-                               } else {
-                                       $buffer .= $iv;
-                                       wfDebug( __METHOD__ . ": mcrypt_create_iv generated " . strlen( $iv ) . " bytes of randomness.\n" );
-                               }
-                               wfProfileOut( __METHOD__ . '-mcrypt' );
-                       }
-               }
-
-               if ( strlen( $buffer ) < $bytes ) {
-                       // If available make use of openssl's random_pseudo_bytes method to attempt to generate randomness.
-                       // However don't do this on Windows with PHP < 5.3.4 due to a bug:
-                       // http://stackoverflow.com/questions/1940168/openssl-random-pseudo-bytes-is-slow-php
-                       // http://git.php.net/?p=php-src.git;a=commitdiff;h=cd62a70863c261b07f6dadedad9464f7e213cad5
-                       if ( function_exists( 'openssl_random_pseudo_bytes' )
-                               && ( !wfIsWindows() || version_compare( PHP_VERSION, '5.3.4', '>=' ) )
-                       ) {
-                               wfProfileIn( __METHOD__ . '-openssl' );
-                               $rem = $bytes - strlen( $buffer );
-                               $openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
-                               if ( $openssl_bytes === false ) {
-                                       wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes returned false.\n" );
-                               } else {
-                                       $buffer .= $openssl_bytes;
-                                       wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes generated " . strlen( $openssl_bytes ) . " bytes of " . ( $openssl_strong ? "strong" : "weak" ) . " randomness.\n" );
-                               }
-                               if ( strlen( $buffer ) >= $bytes ) {
-                                       // openssl tells us if the random source was strong, if some of our data was generated
-                                       // using it use it's say on whether the randomness is strong
-                                       $this->strong = !!$openssl_strong;
-                               }
-                               wfProfileOut( __METHOD__ . '-openssl' );
-                       }
-               }
-
-               // Only read from urandom if we can control the buffer size or were passed forceStrong
-               if ( strlen( $buffer ) < $bytes && ( function_exists( 'stream_set_read_buffer' ) || $forceStrong ) ) {
-                       wfProfileIn( __METHOD__ . '-fopen-urandom' );
-                       $rem = $bytes - strlen( $buffer );
-                       if ( !function_exists( 'stream_set_read_buffer' ) && $forceStrong ) {
-                               wfDebug( __METHOD__ . ": Was forced to read from /dev/urandom without control over the buffer size.\n" );
-                       }
-                       // /dev/urandom is generally considered the best possible commonly
-                       // available random source, and is available on most *nix systems.
-                       wfSuppressWarnings();
-                       $urandom = fopen( "/dev/urandom", "rb" );
-                       wfRestoreWarnings();
-
-                       // Attempt to read all our random data from urandom
-                       // php's fread always does buffered reads based on the stream's chunk_size
-                       // so in reality it will usually read more than the amount of data we're
-                       // asked for and not storing that risks depleting the system's random pool.
-                       // If stream_set_read_buffer is available set the chunk_size to the amount
-                       // of data we need. Otherwise read 8k, php's default chunk_size.
-                       if ( $urandom ) {
-                               // php's default chunk_size is 8k
-                               $chunk_size = 1024 * 8;
-                               if ( function_exists( 'stream_set_read_buffer' ) ) {
-                                       // If possible set the chunk_size to the amount of data we need
-                                       stream_set_read_buffer( $urandom, $rem );
-                                       $chunk_size = $rem;
-                               }
-                               $random_bytes = fread( $urandom, max( $chunk_size, $rem ) );
-                               $buffer .= $random_bytes;
-                               fclose( $urandom );
-                               wfDebug( __METHOD__ . ": /dev/urandom generated " . strlen( $random_bytes ) . " bytes of randomness.\n" );
-                               if ( strlen( $buffer ) >= $bytes ) {
-                                       // urandom is always strong, set to true if all our data was generated using it
-                                       $this->strong = true;
-                               }
-                       } else {
-                               wfDebug( __METHOD__ . ": /dev/urandom could not be opened.\n" );
-                       }
-                       wfProfileOut( __METHOD__ . '-fopen-urandom' );
-               }
-
-               // If we cannot use or generate enough data from a secure source
-               // use this loop to generate a good set of pseudo random data.
-               // This works by initializing a random state using a pile of unstable data
-               // and continually shoving it through a hash along with a variable salt.
-               // We hash the random state with more salt to avoid the state from leaking
-               // out and being used to predict the /randomness/ that follows.
-               if ( strlen( $buffer ) < $bytes ) {
-                       wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" );
-               }
-               while ( strlen( $buffer ) < $bytes ) {
-                       wfProfileIn( __METHOD__ . '-fallback' );
-                       $buffer .= $this->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;
-                       wfProfileOut( __METHOD__ . '-fallback' );
-               }
-
-               // Once the buffer has been filled up with enough random data to fulfill
-               // the request shift off enough data to handle the request and leave the
-               // unused portion left inside the buffer for the next request for random data
-               $generated = substr( $buffer, 0, $bytes );
-               $buffer = substr( $buffer, $bytes );
-
-               wfDebug( __METHOD__ . ": " . strlen( $buffer ) . " bytes of randomness leftover in the buffer.\n" );
-
-               wfProfileOut( __METHOD__ );
-               return $generated;
-       }
-
-       /**
-        * @see self::generateHex()
-        */
-       public function realGenerateHex( $chars, $forceStrong = false ) {
-               // hex strings are 2x the length of raw binary so we divide the length in half
-               // odd numbers will result in a .5 that leads the generate() being 1 character
-               // short, so we use ceil() to ensure that we always have enough bytes
-               $bytes = ceil( $chars / 2 );
-               // Generate the data and then convert it to a hex string
-               $hex = bin2hex( $this->generate( $bytes, $forceStrong ) );
-               // A bit of paranoia here, the caller asked for a specific length of string
-               // here, and it's possible (eg when given an odd number) that we may actually
-               // have at least 1 char more than they asked for. Just in case they made this
-               // call intending to insert it into a database that does truncation we don't
-               // want to give them too much and end up with their database and their live
-               // code having two different values because part of what we gave them is truncated
-               // hence, we strip out any run of characters longer than what we were asked for.
-               return substr( $hex, 0, $chars );
-       }
-
-       /** Publicly exposed static methods **/
-
-       /**
-        * Return a singleton instance of MWCryptRand
-        * @return MWCryptRand
-        */
-       protected static function singleton() {
-               if ( is_null( self::$singleton ) ) {
-                       self::$singleton = new self;
-               }
-               return self::$singleton;
-       }
-
-       /**
-        * Return a boolean indicating whether or not the source used for cryptographic
-        * random bytes generation in the previously run generate* call
-        * was cryptographically strong.
-        *
-        * @return bool Returns true if the source was strong, false if not.
-        */
-       public static function wasStrong() {
-               return self::singleton()->realWasStrong();
-       }
-
-       /**
-        * Generate a run of (ideally) cryptographically random data and return
-        * it in raw binary form.
-        * You can use MWCryptRand::wasStrong() if you wish to know if the source used
-        * was cryptographically strong.
-        *
-        * @param int $bytes the number of bytes of random data to generate
-        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
-        *                          strong sources of entropy even if reading from them may steal
-        *                          more entropy from the system than optimal.
-        * @return String Raw binary random data
-        */
-       public static function generate( $bytes, $forceStrong = false ) {
-               return self::singleton()->realGenerate( $bytes, $forceStrong );
-       }
-
-       /**
-        * Generate a run of (ideally) cryptographically random data and return
-        * it in hexadecimal string format.
-        * You can use MWCryptRand::wasStrong() if you wish to know if the source used
-        * was cryptographically strong.
-        *
-        * @param int $chars the number of hex chars of random data to generate
-        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
-        *                          strong sources of entropy even if reading from them may steal
-        *                          more entropy from the system than optimal.
-        * @return String Hexadecimal random data
-        */
-       public static function generateHex( $chars, $forceStrong = false ) {
-               return self::singleton()->realGenerateHex( $chars, $forceStrong );
-       }
-
-}
index c1076b2..7b9ac28 100644 (file)
@@ -78,7 +78,9 @@ abstract class DataUpdate implements DeferrableUpdate {
         * @throws Exception|null
         */
        public static function runUpdates( $updates ) {
-               if ( empty( $updates ) ) return; # nothing to do
+               if ( empty( $updates ) ) {
+                       return; # nothing to do
+               }
 
                $open_transactions = array();
                $exception = null;
index 1945bd2..58eb3d7 100644 (file)
@@ -63,7 +63,7 @@ $wgConf = new SiteConfiguration;
  * MediaWiki version number
  * @since 1.2
  */
-$wgVersion = '1.21alpha';
+$wgVersion = '1.22alpha';
 
 /**
  * Name of the site. It must be changed in LocalSettings.php
@@ -171,14 +171,6 @@ $wgScriptExtension = '.php';
  */
 $wgScript = false;
 
-/**
- * The URL path to redirect.php. This is a script that is used by the Nostalgia
- * skin.
- *
- * Defaults to "{$wgScriptPath}/redirect{$wgScriptExtension}".
- */
-$wgRedirectScript = false;
-
 /**
  * The URL path to load.php.
  *
@@ -274,7 +266,6 @@ $wgAppleTouchIcon = false;
  *
  * @see wfTempDir()
  * @note Default changed to false in MediaWiki 1.20.
- *
  */
 $wgTmpDirectory = false;
 
@@ -505,11 +496,11 @@ $wgFileBackends = array();
 $wgLockManagers = array();
 
 /**
- * Show EXIF data, on by default if available.
- * Requires PHP's EXIF extension: http://www.php.net/manual/en/ref.exif.php
+ * Show Exif data, on by default if available.
+ * Requires PHP's Exif extension: http://www.php.net/manual/en/ref.exif.php
  *
  * @note FOR WINDOWS USERS:
- * To enable EXIF functions, add the following lines to the "Windows
+ * To enable Exif functions, add the following lines to the "Windows
  * extensions" section of php.ini:
  * @code{.ini}
  * extension=extensions/php_mbstring.dll
@@ -606,7 +597,6 @@ $wgCopyUploadProxy = false;
  * @endcode
  * Sets the maximum for all uploads to 250 kB except for upload-by-url, which
  * will have a maximum of 500 kB.
- *
  */
 $wgMaxUploadSize = 1024 * 1024 * 100; # 100MB
 
@@ -692,7 +682,7 @@ $wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' );
  * Files with these extensions will never be allowed as uploads.
  * An array of file extensions to blacklist. You should append to this array
  * if you want to blacklist additional files.
- * */
+ */
 $wgFileBlacklist = array(
        # HTML may contain cookie-stealing JavaScript and web bugs
        'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
@@ -858,7 +848,7 @@ $wgJpegTran = '/usr/bin/jpegtran';
 
 
 /**
- * Some tests and extensions use exiv2 to manipulate the EXIF metadata in some
+ * Some tests and extensions use exiv2 to manipulate the Exif metadata in some
  * image formats.
  */
 $wgExiv2Command = '/usr/bin/exiv2';
@@ -1599,6 +1589,35 @@ $wgDBAvgStatusPoll = 2000;
  */
 $wgDBmysql5 = false;
 
+/**
+ * Set true to enable Oracle DCRP (supported from 11gR1 onward)
+ *
+ * To use this feature set to true and use a datasource defined as
+ * POOLED (i.e. in tnsnames definition set server=pooled in connect_data
+ * block).
+ *
+ * Starting from 11gR1 you can use DCRP (Database Resident Connection
+ * Pool) that maintains established sessions and reuses them on new
+ * connections.
+ *
+ * Not completely tested, but it should fall back on normal connection
+ * in case the pool is full or the datasource is not configured as
+ * pooled.
+ * And the other way around; using oci_pconnect on a non pooled
+ * datasource should produce a normal connection.
+ *
+ * When it comes to frequent shortlived DB connections like with MW
+ * Oracle tends to s***. The problem is the driver connects to the
+ * database reasonably fast, but establishing a session takes time and
+ * resources. MW does not rely on session state (as it does not use
+ * features such as package variables) so establishing a valid session
+ * is in this case an unwanted overhead that just slows things down.
+ *
+ * @warning EXPERIMENTAL!
+ *
+ */
+$wgDBOracleDRCP = false;
+
 /**
  * Other wikis on this site, can be administered from a single developer
  * account.
@@ -1883,7 +1902,7 @@ $wgSessionHandler = null;
 $wgMemCachedDebug = false;
 
 /** The list of MemCached servers and port numbers */
-$wgMemCachedServers = array( '127.0.0.1:11000' );
+$wgMemCachedServers = array( '127.0.0.1:11211' );
 
 /**
  * Use persistent connections to MemCached, which are shared across multiple
@@ -1902,13 +1921,6 @@ $wgMemCachedTimeout = 500000;
  */
 $wgUseLocalMessageCache = false;
 
-/**
- * Defines format of local cache.
- *  - true: Serialized object
- *  - false: PHP source file (Warning - security risk)
- */
-$wgLocalMessageCacheSerialized = true;
-
 /**
  * Instead of caching everything, only cache those messages which have
  * been customised in the site content language. This means that
@@ -2535,48 +2547,38 @@ $wgLocalTZoffset = null;
 $wgMimeType = 'text/html';
 
 /**
- * The content type used in script tags.  This is mostly going to be ignored if
- * $wgHtml5 is true, at least for actual HTML output, since HTML5 doesn't
- * require a MIME type for JavaScript or CSS (those are the default script and
- * style languages).
+ * Previously used as content type in HTML script tags. This is now ignored since
+ * HTML5 doesn't require a MIME type for script tags (javascript is the default).
+ * It was also previously used by RawAction to determine the ctype query parameter
+ * value that will result in a javascript response.
+ * @deprecated since 1.22
  */
-$wgJsMimeType = 'text/javascript';
+$wgJsMimeType = null;
 
 /**
- * The HTML document type.  Ignored if $wgHtml5 is true, since <!DOCTYPE html>
- * doesn't actually have a doctype part to put this variable's contents in.
+ * The default xmlns attribute. The option to define this has been removed.
+ * The value of this variable is no longer used by core and is set to a fixed
+ * value in Setup.php for compatibility with extensions that depend on the value
+ * of this variable being set. Such a dependency however is deprecated.
+ * @deprecated since 1.22
  */
-$wgDocType = '-//W3C//DTD XHTML 1.0 Transitional//EN';
+$wgXhtmlDefaultNamespace = null;
 
 /**
- * The URL of the document type declaration.  Ignored if $wgHtml5 is true,
- * since HTML5 has no DTD, and <!DOCTYPE html> doesn't actually have a DTD part
- * to put this variable's contents in.
- */
-$wgDTD = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd';
-
-/**
- * The default xmlns attribute.  Ignored if $wgHtml5 is true (or it's supposed
- * to be), since we don't currently support XHTML5, and in HTML5 (i.e., served
- * as text/html) the attribute has no effect, so why bother?
- */
-$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
-
-/**
- * Should we output an HTML5 doctype?  If false, use XHTML 1.0 Transitional
- * instead, and disable HTML5 features.  This may eventually be removed and set
- * to always true.  If it's true, a number of other settings will be irrelevant
- * and have no effect.
+ * Previously used to determine if we should output an HTML5 doctype.
+ * This is no longer used as we always output HTML5 now. For compatibility with
+ * extensions that still check the value of this config it's value is now forced
+ * to true by Setup.php.
+ * @deprecated since 1.22
  */
 $wgHtml5 = true;
 
 /**
  * Defines the value of the version attribute in the &lt;html&gt; tag, if any.
- * This is ignored if $wgHtml5 is false.  If $wgAllowRdfaAttributes and
- * $wgHtml5 are both true, and this evaluates to boolean false (like if it's
- * left at the default null value), it will be auto-initialized to the correct
- * value for RDFa+HTML5.  As such, you should have no reason to ever actually
- * set this to anything.
+ * If $wgAllowRdfaAttributes is true, and this evaluates to boolean false
+ * (like if it's left at the default null value), it will be auto-initialized
+ * to the correct value for RDFa+HTML5.  As such, you should have no reason to
+ * ever actually set this to anything.
  */
 $wgHtml5Version = null;
 
@@ -2587,7 +2589,7 @@ $wgHtml5Version = null;
 $wgAllowRdfaAttributes = false;
 
 /**
- * Enabled HTML5 microdata attributes for use in wikitext, if $wgHtml5 is also true.
+ * Enabled HTML5 microdata attributes for use in wikitext.
  */
 $wgAllowMicrodataAttributes = false;
 
@@ -2621,8 +2623,7 @@ $wgWellFormedXml = true;
  * Normally we wouldn't have to define this in the root "<html>"
  * element, but IE needs it there in some circumstances.
  *
- * This is ignored if $wgHtml5 is true, for the same reason as
- * $wgXhtmlDefaultNamespace.
+ * This is ignored if $wgMimeType is set to a non-XML mimetype.
  */
 $wgXhtmlNamespaces = array();
 
@@ -2675,32 +2676,6 @@ $wgSkipSkin = '';
 /** Array for more like $wgSkipSkin. */
 $wgSkipSkins = array();
 
-/**
- * Optionally, we can specify a stylesheet to use for media="handheld".
- * This is recognized by some, but not all, handheld/mobile/PDA browsers.
- * If left empty, compliant handheld browsers won't pick up the skin
- * stylesheet, which is specified for 'screen' media.
- *
- * Can be a complete URL, base-relative path, or $wgStylePath-relative path.
- * Try 'chick/main.css' to apply the Chick styles to the MonoBook HTML.
- *
- * Will also be switched in when 'handheld=yes' is added to the URL, like
- * the 'printable=yes' mode for print media.
- */
-$wgHandheldStyle = false;
-
-/**
- * If set, 'screen' and 'handheld' media specifiers for stylesheets are
- * transformed such that they apply to the iPhone/iPod Touch Mobile Safari,
- * which doesn't recognize 'handheld' but does support media queries on its
- * screen size.
- *
- * Consider only using this if you have a *really good* handheld stylesheet,
- * as iPhone users won't have any way to disable it and use the "grown-up"
- * styles instead.
- */
-$wgHandheldForIPhone = false;
-
 /**
  * Allow user Javascript page?
  * This enables a lot of neat customizations, but may
@@ -2764,7 +2739,6 @@ $wgEditPageFrameOptions = 'DENY';
  *   - 'SAMEORIGIN': Allow framing by pages on the same domain.
  *   - false: Allow all framing.
  */
-
 $wgApiFrameOptions = 'DENY';
 
 /**
@@ -2844,7 +2818,24 @@ $wgVectorUseSimpleSearch = true;
  *  - true = use an icon watch/unwatch button
  *  - false = use watch/unwatch text link
  */
-$wgVectorUseIconWatch = false;
+$wgVectorUseIconWatch = true;
+
+/**
+ * Use compact vertical form ("VForm") design for Special:Userlogin.  This can
+ * be overridden by a useNew bool in the query string.  For instance, if it is
+ * globally false, you can try it with useNew=1.
+ *
+ * @since 1.22
+ */
+$wgUseVFormUserLogin = false;
+
+/**
+ * Use compact vertical form ("VForm") design for account creation
+ * (Special:Userlogin?type=signup).
+ *
+ * @since 1.22
+ */
+$wgUseVFormCreateAccount = false;
 
 /**
  * Display user edit counts in various prominent places.
@@ -3306,7 +3297,7 @@ $wgMaxRedirects = 1;
  * As of now, this only checks special pages. Redirects to pages in
  * other namespaces cannot be invalidated by this variable.
  */
-$wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk' );
+$wgInvalidRedirectTargets = array( 'Filepath', 'Mypage', 'Mytalk', 'Redirect' );
 
 /** @} */ # End of title and interwiki settings }
 
@@ -3378,17 +3369,29 @@ $wgUrlProtocols = array(
        'http://',
        'https://',
        'ftp://',
+       'ftps://', // If we allow ftp:// we should allow the secure version.
+       'ssh://',
+       'sftp://', // SFTP > FTP
        'irc://',
        'ircs://', // @bug 28503
+       'xmpp:', // Another open communication protocol
+       'sip:',
+       'sips:',
        'gopher://',
        'telnet://', // Well if we're going to support the above.. -ævar
        'nntp://', // @bug 3808 RFC 1738
        'worldwind://',
        'mailto:',
+       'tel:', // If we can make emails linkable, why not phone numbers?
+       'sms:', // Likewise this is standardized too
        'news:',
        'svn://',
        'git://',
        'mms://',
+       'bitcoin:', // Even registerProtocolHandler whitelists this along with mailto:
+       'magnet:', // No reason to reject torrents over magnet: when they're allowed over http://
+       'urn:', // Allow URNs to be used in Microdata/RDFa <link ... href="urn:...">s
+       'geo:', // geo: urls define locations, they're useful in Microdata/RDFa and when mentioning coordinates.
        '//', // for protocol-relative URLs
 );
 
@@ -3511,8 +3514,9 @@ $wgNoFollowDomainExceptions = array();
 $wgAllowDisplayTitle = true;
 
 /**
- * For consistency, restrict DISPLAYTITLE to titles that normalize to the same
- * canonical DB key.
+ * For consistency, restrict DISPLAYTITLE to text that normalizes to the same
+ * canonical DB key. Also disallow some inline CSS rules like display: none;
+ * which can cause the text to be hidden or unselectable.
  */
 $wgRestrictDisplayTitle = true;
 
@@ -3584,7 +3588,8 @@ $wgHitcounterUpdateFreq = 1;
 
 /**
  * How many days user must be idle before he is considered inactive. Will affect
- * the number shown on Special:Statistics and Special:ActiveUsers special page.
+ * the number shown on Special:Statistics, Special:ActiveUsers, and the
+ * {{NUMBEROFACTIVEUSERS}} magic word in wikitext.
  * You might want to leave this as the default value, to provide comparable
  * numbers between different wikis.
  */
@@ -3648,7 +3653,6 @@ $wgReservedUsernames = array(
  * preferences used by anonymous visitors and newly created accounts.
  * For instance, to disable section editing links:
  * $wgDefaultUserOptions ['editsection'] = 0;
- *
  */
 $wgDefaultUserOptions = array(
        'ccmeonemails' => 0,
@@ -3666,8 +3670,6 @@ $wgDefaultUserOptions = array(
        'enotifusertalkpages' => 1,
        'enotifwatchlistpages' => 0,
        'extendwatchlist' => 0,
-       'externaldiff' => 0,
-       'externaleditor' => 0,
        'fancysig' => 0,
        'forceeditsummary' => 0,
        'gender' => 'unknown',
@@ -3684,7 +3686,6 @@ $wgDefaultUserOptions = array(
        'numberheadings' => 0,
        'previewonfirst' => 0,
        'previewontop' => 1,
-       'quickbar' => 5,
        'rcdays' => 7,
        'rclimit' => 50,
        'rememberpassword' => 0,
@@ -3713,6 +3714,7 @@ $wgDefaultUserOptions = array(
        'watchlisthidepatrolled' => 0,
        'watchmoves' => 0,
        'wllimit' => 250,
+       'useeditwarning' => 1,
 );
 
 /** An array of preferences to not show for the user */
@@ -3736,63 +3738,6 @@ $wgInvalidUsernameCharacters = '@';
  */
 $wgUserrightsInterwikiDelimiter = '@';
 
-/**
- * Use some particular type of external authentication.  The specific
- * authentication module you use will normally require some extra settings to
- * be specified.
- *
- * null indicates no external authentication is to be used.  Otherwise,
- * $wgExternalAuthType must be the name of a non-abstract class that extends
- * ExternalUser.
- *
- * Core authentication modules can be found in includes/extauth/.
- */
-$wgExternalAuthType = null;
-
-/**
- * Configuration for the external authentication.  This may include arbitrary
- * keys that depend on the authentication mechanism.  For instance,
- * authentication against another web app might require that the database login
- * info be provided.  Check the file where your auth mechanism is defined for
- * info on what to put here.
- */
-$wgExternalAuthConf = array();
-
-/**
- * When should we automatically create local accounts when external accounts
- * already exist, if using ExternalAuth?  Can have three values: 'never',
- * 'login', 'view'.  'view' requires the external database to support cookies,
- * and implies 'login'.
- *
- * TODO: Implement 'view' (currently behaves like 'login').
- */
-$wgAutocreatePolicy = 'login';
-
-/**
- * Policies for how each preference is allowed to be changed, in the presence
- * of external authentication.  The keys are preference keys, e.g., 'password'
- * or 'emailaddress' (see Preferences.php et al.).  The value can be one of the
- * following:
- *
- * - local: Allow changes to this pref through the wiki interface but only
- * apply them locally (default).
- * - semiglobal: Allow changes through the wiki interface and try to apply them
- * to the foreign database, but continue on anyway if that fails.
- * - global: Allow changes through the wiki interface, but only let them go
- * through if they successfully update the foreign database.
- * - message: Allow no local changes for linked accounts; replace the change
- * form with a message provided by the auth plugin, telling the user how to
- * change the setting externally (maybe providing a link, etc.).  If the auth
- * plugin provides no message for this preference, hide it entirely.
- *
- * Accounts that are not linked to an external account are never affected by
- * this setting.  You may want to look at $wgHiddenPrefs instead.
- * $wgHiddenPrefs supersedes this option.
- *
- * TODO: Implement message, global.
- */
-$wgAllowPrefChange = array();
-
 /**
  * This is to let user authenticate using https when they come from http.
  * Based on an idea by George Herbert on wikitech-l:
@@ -4077,7 +4022,6 @@ $wgImplicitGroups = array( '*', 'user', 'autoconfirmed' );
  * @endcode
  * This allows users in the '*' group (i.e. any user) to remove themselves from
  * any group that they happen to be in.
- *
  */
 $wgGroupsAddToSelf = array();
 
@@ -4105,6 +4049,21 @@ $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' );
  */
 $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' );
 
+/**
+ * Restriction levels that can be used with cascading protection
+ *
+ * A page can only be protected with cascading protection if the
+ * requested restriction level is included in this array.
+ *
+ * This is intended to prevent abuse - if any protection could be
+ * cascading, users could who cannot normally protect pages could
+ * "protect" them by transcluding them on protected pages they are
+ * allowed to edit.
+ *
+ * 'sysop' is quietly rewritten to 'protect' for backwards compatibility.
+ */
+$wgCascadingRestrictionLevels = array( 'sysop' );
+
 /**
  * Set the minimum permissions required to edit pages in each
  * namespace.  If you list more than one permission, a user must
@@ -4329,6 +4288,13 @@ $wgSorbsUrl = array();
  */
 $wgProxyWhitelist = array();
 
+/**
+ * Whether to look at the X-Forwarded-For header's list of (potentially spoofed)
+ * IPs and apply IP blocks to them. This allows for IP blocks to work with correctly-configured
+ * (transparent) proxies without needing to block the proxies themselves.
+ */
+$wgApplyIpBlocksToXff = false;
+
 /**
  * Simple rate limiter options to brake edit floods.
  *
@@ -4355,7 +4321,7 @@ $wgRateLimits = array(
                '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, // ... with final octet removed
+               'subnet' => null, // ... within a /24 subnet in IPv4 or /64 in IPv6
        ),
        'move' => array(
                'user' => null,
@@ -4416,14 +4382,13 @@ $wgPasswordAttemptThrottle = array( 'count' => 5, 'seconds' => 300 );
  * @warning Don't enable this. Many sysops will report "hostile TCP port scans"
  * to your ISP and ask for your server to be shut down.
  * You have been warned.
- *
  */
 $wgBlockOpenProxies = false;
 /** Port we want to scan for a proxy */
 $wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 );
 /** Script used to scan */
 $wgProxyScriptPath = "$IP/maintenance/proxyCheck.php";
-/** */
+/** Expiration time for cached proxy IPs */
 $wgProxyMemcExpiry = 86400;
 /** This should always be customised in LocalSettings.php */
 $wgSecretKey = false;
@@ -4530,7 +4495,7 @@ $wgSessionName = false;
  */
 $wgUseTeX = false;
 
-/* @} */ # end LaTeX }
+/** @} */ # end LaTeX }
 
 /************************************************************************//**
  * @name   Profiling, testing and debugging
@@ -4860,7 +4825,6 @@ $wgCountTotalSearchHits = false;
  * PHP wrapper to avoid firing up mediawiki for every keystroke
  *
  * Placeholders: {searchTerms}
- *
  */
 $wgOpenSearchTemplate = false;
 
@@ -4912,7 +4876,6 @@ $wgNamespacesToBeSearchedHelp = array(
  * logged-in users.
  * Useful for big wikis to maintain different search profiles for anonymous and
  * logged-in users.
- *
  */
 $wgSearchEverythingOnlyLoggedIn = false;
 
@@ -5003,12 +4966,6 @@ $wgPreviewOnOpenNamespaces = array(
        NS_CATEGORY => true
 );
 
-/**
- * Activate external editor interface for files and pages
- * See http://www.mediawiki.org/wiki/Manual:External_editors
- */
-$wgUseExternalEditor = true;
-
 /** Go button goes straight to the edit screen if the article doesn't exist. */
 $wgGoToEdit = false;
 
@@ -5083,6 +5040,11 @@ $wgReadOnlyFile = false;
  */
 $wgUpgradeKey = false;
 
+/**
+ * Fully specified path to git binary
+ */
+$wgGitBin = '/usr/bin/git';
+
 /**
  * Map GIT repository URLs to viewer URLs to provide links in Special:Version
  *
@@ -5173,6 +5135,9 @@ $wgUseRCPatrol = true;
 /** Use new page patrolling to check new pages on Special:Newpages */
 $wgUseNPPatrol = true;
 
+/** Log autopatrol actions to the log table */
+$wgLogAutopatrol = true;
+
 /** Provide syndication feeds (RSS, Atom) for, e.g., Recentchanges, Newpages */
 $wgFeed = true;
 
@@ -5536,7 +5501,6 @@ $wgJobClasses = array(
        'refreshLinks' => 'RefreshLinksJob',
        'refreshLinks2' => 'RefreshLinksJob2',
        'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
-       'html_cache_update' => 'HTMLCacheUpdateJob', // backwards-compatible
        'sendMail' => 'EmaillingJob',
        'enotifNotify' => 'EnotifNotifyJob',
        'fixDoubleRedirect' => 'DoubleRedirectJob',
@@ -5836,12 +5800,13 @@ $wgDisableQueryPageUpdate = false;
  * List of special pages, followed by what subtitle they should go under
  * at Special:SpecialPages
  *
- * @deprecated 1.21 Override SpecialPage::getGroupName instead
+ * @deprecated since 1.21 Override SpecialPage::getGroupName instead
  */
 $wgSpecialPageGroups = array();
 
-/** Whether or not to sort special pages in Special:Specialpages */
-
+/**
+ * Whether or not to sort special pages in Special:Specialpages
+ */
 $wgSortSpecialPages = true;
 
 /**
@@ -6112,7 +6077,6 @@ $wgCrossSiteAJAXdomains = array();
  * even if they match one of the domains allowed by $wgCrossSiteAJAXdomains
  * Uses the same syntax as $wgCrossSiteAJAXdomains
  */
-
 $wgCrossSiteAJAXdomainExceptions = array();
 
 /** @} */ # End AJAX and API }
@@ -6203,6 +6167,12 @@ $wgAsyncHTTPTimeout = 25;
  */
 $wgHTTPProxy = false;
 
+/**
+ * Timeout for connections done internally (in seconds)
+ * Only works for curl
+ */
+$wgHTTPConnectTimeout = 5e0;
+
 /** @} */ # End HTTP client }
 
 /************************************************************************//**
@@ -6240,56 +6210,6 @@ $wgMaxBacklinksInvalidate = false;
 
 /** @} */ # End job queue }
 
-/************************************************************************//**
- * @name   HipHop compilation
- * @{
- */
-
-/**
- * The build directory for HipHop compilation.
- * Defaults to '$IP/maintenance/hiphop/build'.
- */
-$wgHipHopBuildDirectory = false;
-
-/**
- * The HipHop build type. Can be either "Debug" or "Release".
- */
-$wgHipHopBuildType = 'Debug';
-
-/**
- * Number of parallel processes to use during HipHop compilation, or "detect"
- * to guess from system properties.
- */
-$wgHipHopCompilerProcs = 'detect';
-
-/**
- * Filesystem extensions directory. Defaults to $IP/../extensions.
- *
- * To compile extensions with HipHop, set $wgExtensionsDirectory correctly,
- * and use code like:
- * @code
- *    require( MWInit::extensionSetupPath( 'Extension/Extension.php' ) );
- * @endcode
- *
- * to include the extension setup file from LocalSettings.php. It is not
- * necessary to set this variable unless you use MWInit::extensionSetupPath().
- */
-$wgExtensionsDirectory = false;
-
-/**
- * A list of files that should be compiled into a HipHop build, in addition to
- * those listed in $wgAutoloadClasses. Add to this array in an extension setup
- * file in order to add files to the build.
- *
- * The files listed here must either be either absolute paths under $IP or
- * under $wgExtensionsDirectory, or paths relative to the virtual source root
- * "$IP/..", i.e. starting with "phase3" for core files, and "extensions" for
- * extension files.
- */
-$wgCompiledFiles = array();
-
-/** @} */ # End of HipHop compilation }
-
 /************************************************************************//**
  * @name   Miscellaneous
  * @{
@@ -6413,7 +6333,7 @@ $wgContentHandlerUseDB = true;
  * of texts are also rendered as wikitext, it only means that links, magic words, etc will have
  * the effect on the database they would have on a wikitext page.
  *
- * @todo: On the long run, it would be nice to put categories etc into a separate structure,
+ * @todo On the long run, it would be nice to put categories etc into a separate structure,
  * or at least parse only the contents of comments in the scripts.
  *
  * @since 1.21
@@ -6440,6 +6360,12 @@ $wgSiteTypes = array(
        'mediawiki' => 'MediaWikiSite',
 );
 
+/**
+ * Formerly a list of files for HipHop compilation
+ * @deprecated since 1.22
+ */
+$wgCompiledFiles = array();
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index c4a8633..86c5520 100644 (file)
@@ -197,14 +197,14 @@ define( 'EDIT_AUTOSUMMARY', 64 );
 define( 'LIST_COMMA', 0 );
 define( 'LIST_AND', 1 );
 define( 'LIST_SET', 2 );
-define( 'LIST_NAMES', 3);
-define( 'LIST_OR', 4);
+define( 'LIST_NAMES', 3 );
+define( 'LIST_OR', 4 );
 /**@}*/
 
 /**
  * Unicode and normalisation related
  */
-require_once __DIR__.'/normal/UtfNormalDefines.php';
+require_once __DIR__ . '/normal/UtfNormalDefines.php';
 
 /**@{
  * Hook support constants
@@ -236,11 +236,6 @@ define( 'SFH_NO_HASH', 1 );
 define( 'SFH_OBJECT_ARGS', 2 );
 /**@}*/
 
-/**
- * Flags for Parser::setLinkHook
- */
-define( 'SLH_PATTERN', 1 );
-
 /**
  * Flags for Parser::replaceLinkHolders
  */
index 8b2dbb5..27f4556 100644 (file)
@@ -100,7 +100,7 @@ class EditPage {
 
        /**
         * Status: user tried to create this page, but is not allowed to do that
-        * ( Title->usercan('create') == false )
+        * ( Title->userCan('create') == false )
         */
        const AS_NO_CREATE_PERMISSION = 223;
 
@@ -487,7 +487,7 @@ class EditPage {
                        // The edit page was reached via a red link.
                        // Redirect to the article page and let them click the edit tab if
                        // they really want a permission error.
-                       $wgOut->redirect( $this->mTitle->getFullUrl() );
+                       $wgOut->redirect( $this->mTitle->getFullURL() );
                        return;
                }
 
@@ -540,7 +540,7 @@ class EditPage {
                        // The edit page was reached via a red link.
                        // Redirect to the article page and let them click the edit tab if
                        // they really want a permission error.
-                       $wgOut->redirect( $this->mTitle->getFullUrl() );
+                       $wgOut->redirect( $this->mTitle->getFullURL() );
                } else {
                        $wgOut->readOnlyPage( $source, $protected, $reasons, $action );
                }
@@ -621,6 +621,7 @@ class EditPage {
                $this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
 
                if ( $this->section !== null && $this->section !== '' && !$this->isSectionEditSupported() ) {
+                       wfProfileOut( __METHOD__ );
                        throw new ErrorPageError( 'sectioneditnotsupported-title', 'sectioneditnotsupported-text' );
                }
 
@@ -897,7 +898,9 @@ class EditPage {
                                $orig = $this->getOriginalContent();
                                $content = $orig ? $orig->getSection( $this->section ) : null;
 
-                               if ( !$content ) $content = $def_content;
+                               if ( !$content ) {
+                                       $content = $def_content;
+                               }
                        } else {
                                $undoafter = $wgRequest->getInt( 'undoafter' );
                                $undo = $wgRequest->getInt( 'undo' );
@@ -985,7 +988,9 @@ class EditPage {
                }
                $revision = $this->mArticle->getRevisionFetched();
                if ( $revision === null ) {
-                       if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+                       if ( !$this->contentModel ) {
+                               $this->contentModel = $this->getTitle()->getContentModel();
+                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
 
                        return $handler->makeEmptyContent();
@@ -1007,7 +1012,9 @@ class EditPage {
                $content = $rev ? $rev->getContent( Revision::RAW ) : null;
 
                if ( $content === false || $content === null ) {
-                       if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+                       if ( !$this->contentModel ) {
+                               $this->contentModel = $this->getTitle()->getContentModel();
+                       }
                        $handler = ContentHandler::getForModelID( $this->contentModel );
 
                        return $handler->makeEmptyContent();
@@ -1213,7 +1220,7 @@ class EditPage {
 
                        case self::AS_SUCCESS_NEW_ARTICLE:
                                $query = $resultDetails['redirect'] ? 'redirect=no' : '';
-                               $anchor = isset ( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
+                               $anchor = isset( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
                                $wgOut->redirect( $this->mTitle->getFullURL( $query ) . $anchor );
                                return false;
 
@@ -1889,6 +1896,11 @@ class EditPage {
                if ( $wgUser->getOption( 'uselivepreview', false ) ) {
                        $wgOut->addModules( 'mediawiki.action.edit.preview' );
                }
+
+               if ( $wgUser->getOption( 'useeditwarning', false ) ) {
+                       $wgOut->addModules( 'mediawiki.action.edit.editWarning' );
+               }
+
                // Bug #19334: textarea jumps when editing articles in IE8
                $wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
 
@@ -1928,15 +1940,15 @@ class EditPage {
                if ( $namespace == NS_MEDIAWIKI ) {
                        # Show a warning if editing an interface message
                        $wgOut->wrapWikiMsg( "<div class='mw-editinginterface'>\n$1\n</div>", 'editinginterface' );
-               } else if( $namespace == NS_FILE ) {
+               } elseif ( $namespace == NS_FILE ) {
                        # Show a hint to shared repo
                        $file = wfFindFile( $this->mTitle );
-                       if( $file && !$file->isLocal() ) {
+                       if ( $file && !$file->isLocal() ) {
                                $descUrl = $file->getDescriptionUrl();
                                # there must be a description url to show a hint to shared repo
-                               if( $descUrl ) {
-                                       if( !$this->mTitle->exists() ) {
-                                               $wgOut->wrapWikiMsg( "<div class=\"mw-sharedupload-desc-create\">\n$1\n</div>", array (
+                               if ( $descUrl ) {
+                                       if ( !$this->mTitle->exists() ) {
+                                               $wgOut->wrapWikiMsg( "<div class=\"mw-sharedupload-desc-create\">\n$1\n</div>", array(
                                                                        'sharedupload-desc-create', $file->getRepo()->getDisplayName(), $descUrl
                                                ) );
                                        } else {
@@ -2126,7 +2138,7 @@ class EditPage {
                        }
                }
 
-               //@todo: add EditForm plugin interface and use it here!
+               // @todo add EditForm plugin interface and use it here!
                //       search for textarea1 and textares2, and allow EditForm to override all uses.
                $wgOut->addHTML( Html::openElement( 'form', array( 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID,
                        'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
@@ -2161,7 +2173,7 @@ class EditPage {
                }
 
                # When the summary is hidden, also hide them on preview/show changes
-               if( $this->nosummary ) {
+               if ( $this->nosummary ) {
                        $wgOut->addHTML( Html::hidden( 'nosummary', true ) );
                }
 
@@ -2626,7 +2638,7 @@ HTML
 
                $attribs = $customAttribs + array(
                        'accesskey' => ',',
-                       'id'   => $name,
+                       'id' => $name,
                        'cols' => $wgUser->getIntOption( 'cols' ),
                        'rows' => $wgUser->getIntOption( 'rows' ),
                        'style' => '' // avoid php notices when appending preferences (appending allows customAttribs['style'] to still work
@@ -2702,9 +2714,9 @@ HTML
 
                $oldtitlemsg = 'currentrev';
                # if message does not exist, show diff against the preloaded default
-               if( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
+               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && !$this->mTitle->exists() ) {
                        $oldtext = $this->mTitle->getDefaultMessageText();
-                       if( $oldtext !== false ) {
+                       if ( $oldtext !== false ) {
                                $oldtitlemsg = 'defaultmessagetext';
                                $oldContent = $this->toEditContent( $oldtext );
                        } else {
@@ -3028,9 +3040,9 @@ HTML
 
                        # don't parse non-wikitext pages, show message about preview
                        if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
-                               if( $this->mTitle->isCssJsSubpage() ) {
+                               if ( $this->mTitle->isCssJsSubpage() ) {
                                        $level = 'user';
-                               } elseif( $this->mTitle->isCssOrJsPage() ) {
+                               } elseif ( $this->mTitle->isCssOrJsPage() ) {
                                        $level = 'site';
                                } else {
                                        $level = false;
@@ -3046,7 +3058,7 @@ HTML
 
                                # Used messages to make sure grep find them:
                                # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
-                               if( $level && $format ) {
+                               if ( $level && $format ) {
                                        $note = "<div id='mw-{$level}{$format}preview'>" . wfMessage( "{$level}{$format}preview" )->text() . "</div>";
                                }
                        }
@@ -3314,9 +3326,9 @@ HTML
                        $minorLabel = wfMessage( 'minoredit' )->parse();
                        if ( $wgUser->isAllowed( 'minoredit' ) ) {
                                $attribs = array(
-                                       'tabindex'  => ++$tabindex,
+                                       'tabindex' => ++$tabindex,
                                        'accesskey' => wfMessage( 'accesskey-minoredit' )->text(),
-                                       'id'        => 'wpMinoredit',
+                                       'id' => 'wpMinoredit',
                                );
                                $checkboxes['minor'] =
                                        Xml::check( 'wpMinoredit', $checked['minor'], $attribs ) .
@@ -3330,9 +3342,9 @@ HTML
                $checkboxes['watch'] = '';
                if ( $wgUser->isLoggedIn() ) {
                        $attribs = array(
-                               'tabindex'  => ++$tabindex,
+                               'tabindex' => ++$tabindex,
                                'accesskey' => wfMessage( 'accesskey-watch' )->text(),
-                               'id'        => 'wpWatchthis',
+                               'id' => 'wpWatchthis',
                        );
                        $checkboxes['watch'] =
                                Xml::check( 'wpWatchthis', $checked['watch'], $attribs ) .
@@ -3356,37 +3368,37 @@ HTML
                $buttons = array();
 
                $temp = array(
-                       'id'        => 'wpSave',
-                       'name'      => 'wpSave',
-                       'type'      => 'submit',
-                       'tabindex'  => ++$tabindex,
-                       'value'     => wfMessage( 'savearticle' )->text(),
+                       'id' => 'wpSave',
+                       'name' => 'wpSave',
+                       'type' => 'submit',
+                       'tabindex' => ++$tabindex,
+                       'value' => wfMessage( 'savearticle' )->text(),
                        'accesskey' => wfMessage( 'accesskey-save' )->text(),
-                       'title'     => wfMessage( 'tooltip-save' )->text() . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
+                       'title' => wfMessage( 'tooltip-save' )->text() . ' [' . wfMessage( 'accesskey-save' )->text() . ']',
                );
                $buttons['save'] = Xml::element( 'input', $temp, '' );
 
                ++$tabindex; // use the same for preview and live preview
                $temp = array(
-                       'id'        => 'wpPreview',
-                       'name'      => 'wpPreview',
-                       'type'      => 'submit',
-                       'tabindex'  => $tabindex,
-                       'value'     => wfMessage( 'showpreview' )->text(),
+                       'id' => 'wpPreview',
+                       'name' => 'wpPreview',
+                       'type' => 'submit',
+                       'tabindex' => $tabindex,
+                       'value' => wfMessage( 'showpreview' )->text(),
                        'accesskey' => wfMessage( 'accesskey-preview' )->text(),
-                       'title'     => wfMessage( 'tooltip-preview' )->text() . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
+                       'title' => wfMessage( 'tooltip-preview' )->text() . ' [' . wfMessage( 'accesskey-preview' )->text() . ']',
                );
                $buttons['preview'] = Xml::element( 'input', $temp, '' );
                $buttons['live'] = '';
 
                $temp = array(
-                       'id'        => 'wpDiff',
-                       'name'      => 'wpDiff',
-                       'type'      => 'submit',
-                       'tabindex'  => ++$tabindex,
-                       'value'     => wfMessage( 'showdiff' )->text(),
+                       'id' => 'wpDiff',
+                       'name' => 'wpDiff',
+                       'type' => 'submit',
+                       'tabindex' => ++$tabindex,
+                       'value' => wfMessage( 'showdiff' )->text(),
                        'accesskey' => wfMessage( 'accesskey-diff' )->text(),
-                       'title'     => wfMessage( 'tooltip-diff' )->text() . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
+                       'title' => wfMessage( 'tooltip-diff' )->text() . ' [' . wfMessage( 'accesskey-diff' )->text() . ']',
                );
                $buttons['diff'] = Xml::element( 'input', $temp, '' );
 
@@ -3506,7 +3518,7 @@ HTML
                global $wgOut, $wgLang;
                $this->textbox2 = $this->textbox1;
 
-               if( is_array( $match ) ) {
+               if ( is_array( $match ) ) {
                        $match = $wgLang->listToText( $match );
                }
                $wgOut->prepareErrorPage( wfMessage( 'spamprotectiontitle' ) );
index 0bd7a2a..dc1208a 100644 (file)
@@ -75,11 +75,11 @@ class MWException extends Exception {
                        return null; // Just silently ignore
                }
 
-               if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) ) {
+               if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[$name] ) ) {
                        return null;
                }
 
-               $hooks = $wgExceptionHooks[ $name ];
+               $hooks = $wgExceptionHooks[$name];
                $callargs = array_merge( array( $this ), $args );
 
                foreach ( $hooks as $hook ) {
@@ -130,8 +130,7 @@ class MWException extends Exception {
                                '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( $this->getTraceAsString() ) ) .
                                "</p>\n";
                } else {
-                       return
-                               "<div class=\"errorbox\">" .
+                       return "<div class=\"errorbox\">" .
                                '[' . $this->getLogId() . '] ' .
                                gmdate( 'Y-m-d H:i:s' ) .
                                ": Fatal exception of type " . get_class( $this ) . "</div>\n" .
@@ -248,7 +247,7 @@ class MWException extends Exception {
         * It will be either HTML or plain text based on isCommandLine().
         */
        function report() {
-               global $wgLogExceptionBacktrace;
+               global $wgLogExceptionBacktrace, $wgMimeType;
                $log = $this->getLogMessage();
 
                if ( $log ) {
@@ -268,6 +267,7 @@ class MWException extends Exception {
                } else {
                        header( "HTTP/1.1 500 MediaWiki exception" );
                        header( "Status: 500 MediaWiki exception", true );
+                       header( "Content-Type: $wgMimeType; charset=utf-8", true );
 
                        $this->reportHTML();
                }
@@ -329,11 +329,17 @@ class ErrorPageError extends MWException {
                $this->msg = $msg;
                $this->params = $params;
 
-               if( $msg instanceof Message ) {
-                       parent::__construct( $msg );
+               // Bug 44111: Messages in the log files should be in English and not
+               // customized by the local wiki. So get the default English version for
+               // passing to the parent constructor. Our overridden report() below
+               // makes sure that the page shown to the user is not forced to English.
+               if ( $msg instanceof Message ) {
+                       $enMsg = clone( $msg );
                } else {
-                       parent::__construct( wfMessage( $msg )->text() );
+                       $enMsg = wfMessage( $msg, $params );
                }
+               $enMsg->inLanguage( 'en' )->useDatabase( false );
+               parent::__construct( $enMsg->text() );
        }
 
        function report() {
@@ -461,39 +467,9 @@ class ThrottledError extends ErrorPageError {
  */
 class UserBlockedError extends ErrorPageError {
        public function __construct( Block $block ) {
-               global $wgLang, $wgRequest;
-
-               $blocker = $block->getBlocker();
-               if ( $blocker instanceof User ) { // local user
-                       $blockerUserpage = $block->getBlocker()->getUserPage();
-                       $link = "[[{$blockerUserpage->getPrefixedText()}|{$blockerUserpage->getText()}]]";
-               } else { // foreign user
-                       $link = $blocker;
-               }
-
-               $reason = $block->mReason;
-               if( $reason == '' ) {
-                       $reason = wfMessage( 'blockednoreason' )->text();
-               }
-
-               /* $ip returns who *is* being blocked, $intended contains who was meant to be blocked.
-                * This could be a username, an IP range, or a single IP. */
-               $intended = $block->getTarget();
-
-               parent::__construct(
-                       'blockedtitle',
-                       $block->mAuto ? 'autoblockedtext' : 'blockedtext',
-                       array(
-                               $link,
-                               $reason,
-                               $wgRequest->getIP(),
-                               $block->getByName(),
-                               $block->getId(),
-                               $wgLang->formatExpiry( $block->mExpiry ),
-                               $intended,
-                               $wgLang->timeanddate( wfTimestamp( TS_MW, $block->mTimestamp ), true )
-                       )
-               );
+               // @todo FIXME: Implement a more proper way to get context here.
+               $params = $block->getPermissionsError( RequestContext::getMain() );
+               parent::__construct( 'blockedtitle', array_shift( $params ), $params );
        }
 }
 
@@ -611,7 +587,7 @@ class HttpError extends MWException {
                        $content = htmlspecialchars( $this->content );
                }
 
-               return "<!DOCTYPE html>\n".
+               return "<!DOCTYPE html>\n" .
                        "<html><head><title>$header</title></head>\n" .
                        "<body><h1>$header</h1><p>$content</p></body></html>\n";
        }
@@ -692,7 +668,7 @@ class MWExceptionHandler {
                if ( defined( 'STDERR' ) ) {
                        fwrite( STDERR, $message );
                } else {
-                       echo( $message );
+                       echo $message;
                }
        }
 
@@ -715,8 +691,10 @@ class MWExceptionHandler {
                // Final cleanup
                if ( $wgFullyInitialised ) {
                        try {
-                               wfLogProfilingData(); // uses $wgRequest, hence the $wgFullyInitialised condition
-                       } catch ( Exception $e ) {}
+                               // uses $wgRequest, hence the $wgFullyInitialised condition
+                               wfLogProfilingData();
+                       } catch ( Exception $e ) {
+                       }
                }
 
                // Exit value should be nonzero for the benefit of shell jobs
index d8cc024..a26e853 100644 (file)
@@ -249,9 +249,13 @@ class WikiExporter {
                        $where = array( 'user_id = log_user' );
                        # Hide private logs
                        $hideLogs = LogEventsList::getExcludeClause( $this->db );
-                       if ( $hideLogs ) $where[] = $hideLogs;
+                       if ( $hideLogs ) {
+                               $where[] = $hideLogs;
+                       }
                        # Add on any caller specified conditions
-                       if ( $cond ) $where[] = $cond;
+                       if ( $cond ) {
+                               $where[] = $cond;
+                       }
                        # Get logging table name for logging.* clause
                        $logging = $this->db->tableName( 'logging' );
 
@@ -296,6 +300,7 @@ class WikiExporter {
                                }
 
                                // Inform caller about problem
+                               wfProfileOut( __METHOD__ );
                                throw $e;
                        }
                # For page dumps...
@@ -541,7 +546,7 @@ class XmlDumpWriter {
         * @return string
         */
        function homelink() {
-               return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalUrl() );
+               return Xml::element( 'base', array(), Title::newMainPage()->getCanonicalURL() );
        }
 
        /**
@@ -563,8 +568,9 @@ class XmlDumpWriter {
                foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
                        $spaces .= '      ' .
                                Xml::element( 'namespace',
-                                       array(  'key' => $ns,
-                                                       'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
+                                       array(
+                                               'key' => $ns,
+                                               'case' => MWNamespace::isCapitalized( $ns ) ? 'first-letter' : 'case-sensitive',
                                        ), $title ) . "\n";
                }
                $spaces .= "    </namespaces>";
@@ -593,7 +599,7 @@ class XmlDumpWriter {
                $out = "  <page>\n";
                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                $out .= '    ' . Xml::elementClean( 'title', array(), self::canonicalTitle( $title ) ) . "\n";
-               $out .= '    ' . Xml::element( 'ns', array(), strval( $row->page_namespace) ) . "\n";
+               $out .= '    ' . Xml::element( 'ns', array(), strval( $row->page_namespace ) ) . "\n";
                $out .= '    ' . Xml::element( 'id', array(), strval( $row->page_id ) ) . "\n";
                if ( $row->page_is_redirect ) {
                        $page = WikiPage::factory( $title );
@@ -636,7 +642,7 @@ class XmlDumpWriter {
 
                $out = "    <revision>\n";
                $out .= "      " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
-               if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
+               if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
                        $out .= "      " . Xml::element( 'parentid', null, strval( $row->rev_parent_id ) ) . "\n";
                }
 
@@ -683,7 +689,7 @@ class XmlDumpWriter {
                        $content_model = strval( $row->rev_content_model );
                } else {
                        // probably using $wgContentHandlerUseDB = false;
-                       // @todo: test!
+                       // @todo test!
                        $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                        $content_model = ContentHandler::getDefaultModelFor( $title );
                }
@@ -694,7 +700,7 @@ class XmlDumpWriter {
                        $content_format = strval( $row->rev_content_format );
                } else {
                        // probably using $wgContentHandlerUseDB = false;
-                       // @todo: test!
+                       // @todo test!
                        $content_handler = ContentHandler::getForModelID( $content_model );
                        $content_format = $content_handler->getDefaultFormat();
                }
@@ -837,7 +843,7 @@ class XmlDumpWriter {
                        "      " . $comment . "\n" .
                        "      " . Xml::element( 'filename', null, $file->getName() ) . "\n" .
                        $archiveName .
-                       "      " . Xml::element( 'src', null, $file->getCanonicalUrl() ) . "\n" .
+                       "      " . Xml::element( 'src', null, $file->getCanonicalURL() ) . "\n" .
                        "      " . Xml::element( 'size', null, $file->getSize() ) . "\n" .
                        "      " . Xml::element( 'sha1base36', null, $file->getSha1() ) . "\n" .
                        "      " . Xml::element( 'rel', null, $file->getRel() ) . "\n" .
@@ -1185,7 +1191,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
                // Suppress annoying useless crap from p7zip
                // Unfortunately this could suppress real error messages too
                $command .= ' >' . wfGetNull() . ' 2>&1';
-               return( $command );
+               return $command;
        }
 
        /**
diff --git a/includes/ExternalEdit.php b/includes/ExternalEdit.php
deleted file mode 100644 (file)
index 11e9423..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-/**
- * External editors support
- *
- * License: Public domain
- *
- * @file
- * @author Erik Moeller <moeller@scireview.de>
- */
-
-/**
- * Support for external editors to modify both text and files
- * in external applications. It works as follows: MediaWiki
- * sends a meta-file with the MIME type 'application/x-external-editor'
- * to the client. The user has to associate that MIME type with
- * a helper application (a reference implementation in Perl
- * can be found in extensions/ee), which will launch the editor,
- * and save the modified data back to the server.
- *
- */
-class ExternalEdit extends ContextSource {
-
-       /**
-        * Array of URLs to link to
-        * @var Array
-        */
-       private $urls;
-
-       /**
-        * Constructor
-        * @param $context IContextSource context to use
-        * @param $urls array
-        */
-       public function __construct( IContextSource $context, array $urls = array() ) {
-               $this->setContext( $context );
-               $this->urls = $urls;
-       }
-
-       /**
-        * Check whether external edit or diff should be used.
-        *
-        * @param $context IContextSource context to use
-        * @param string $type can be either 'edit' or 'diff'
-        * @return Bool
-        */
-       public static function useExternalEngine( IContextSource $context, $type ) {
-               global $wgUseExternalEditor;
-
-               if ( !$wgUseExternalEditor ) {
-                       return false;
-               }
-
-               $pref = $type == 'diff' ? 'externaldiff' : 'externaleditor';
-               $request = $context->getRequest();
-
-               return !$request->getVal( 'internaledit' ) &&
-                       ( $context->getUser()->getOption( $pref ) || $request->getVal( 'externaledit' ) );
-       }
-
-       /**
-        * Output the information for the external editor
-        */
-       public function execute() {
-               global $wgContLang, $wgScript, $wgScriptPath, $wgCanonicalServer;
-
-               $this->getOutput()->disable();
-
-               $response = $this->getRequest()->response();
-               $response->header( 'Content-type: application/x-external-editor; charset=utf-8' );
-               $response->header( 'Cache-control: no-cache' );
-
-               $special = $wgContLang->getNsText( NS_SPECIAL );
-
-               # $type can be "Edit text", "Edit file" or "Diff text" at the moment
-               # See the protocol specifications at [[m:Help:External editors/Tech]] for
-               # details.
-               if ( count( $this->urls ) ) {
-                       $urls = $this->urls;
-                       $type = "Diff text";
-               } elseif ( $this->getRequest()->getVal( 'mode' ) == 'file' ) {
-                       $type = "Edit file";
-                       $image = wfLocalFile( $this->getTitle() );
-                       if ( $image ) {
-                               $urls = array(
-                                       'File' => array(
-                                               'Extension' => $image->getExtension(),
-                                               'URL' => $image->getCanonicalURL()
-                                       )
-                               );
-                       } else {
-                               $urls = array();
-                       }
-               } else {
-                       $type = "Edit text";
-                       # *.wiki file extension is used by some editors for syntax
-                       # highlighting, so we follow that convention
-                       $urls = array( 'File' => array(
-                               'Extension' => 'wiki',
-                               'URL' => $this->getTitle()->getCanonicalURL(
-                                       array( 'action' => 'edit', 'internaledit' => 'true' ) )
-                       ) );
-               }
-
-               $files = '';
-               foreach( $urls as $key => $vars ) {
-                       $files .= "\n[$key]\n";
-                       foreach( $vars as $varname => $varval ) {
-                               $files .= "$varname=$varval\n";
-                       }
-               }
-
-               $url = $this->getTitle()->getFullURL(
-                       $this->getRequest()->appendQueryValue( 'internaledit', 1, true ) );
-
-               $control = <<<CONTROL
-; You're seeing this file because you're using Mediawiki's External Editor feature.
-; This is probably because you selected use external editor in your preferences.
-; To edit normally, either disable that preference or go to the URL:
-; $url
-; See http://www.mediawiki.org/wiki/Manual:External_editors for details.
-[Process]
-Type=$type
-Engine=MediaWiki
-Script={$wgCanonicalServer}{$wgScript}
-Server={$wgCanonicalServer}
-Path={$wgScriptPath}
-Special namespace=$special
-$files
-CONTROL;
-               echo $control;
-       }
-}
diff --git a/includes/ExternalUser.php b/includes/ExternalUser.php
deleted file mode 100644 (file)
index 580b989..0000000
+++ /dev/null
@@ -1,309 +0,0 @@
-<?php
-/**
- * Authentication with a foreign database
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * @defgroup ExternalUser ExternalUser
- */
-
-/**
- * A class intended to supplement, and perhaps eventually replace, AuthPlugin.
- * See: http://www.mediawiki.org/wiki/ExternalAuth
- *
- * The class represents a user whose data is in a foreign database.  The
- * database may have entirely different conventions from MediaWiki, but it's
- * assumed to at least support the concept of a user id (possibly not an
- * integer), a user name (possibly not meeting MediaWiki's username
- * requirements), and a password.
- *
- * @ingroup ExternalUser
- */
-abstract class ExternalUser {
-       protected function __construct() {}
-
-       /**
-        * Wrappers around initFrom*().
-        */
-
-       /**
-        * @param $name string
-        * @return mixed ExternalUser, or false on failure
-        */
-       public static function newFromName( $name ) {
-               global $wgExternalAuthType;
-               if ( is_null( $wgExternalAuthType ) ) {
-                       return false;
-               }
-               $obj = new $wgExternalAuthType;
-               if ( !$obj->initFromName( $name ) ) {
-                       return false;
-               }
-               return $obj;
-       }
-
-       /**
-        * @param $id string
-        * @return mixed ExternalUser, or false on failure
-        */
-       public static function newFromId( $id ) {
-               global $wgExternalAuthType;
-               if ( is_null( $wgExternalAuthType ) ) {
-                       return false;
-               }
-               $obj = new $wgExternalAuthType;
-               if ( !$obj->initFromId( $id ) ) {
-                       return false;
-               }
-               return $obj;
-       }
-
-       /**
-        * @return mixed ExternalUser, or false on failure
-        */
-       public static function newFromCookie() {
-               global $wgExternalAuthType;
-               if ( is_null( $wgExternalAuthType ) ) {
-                       return false;
-               }
-               $obj = new $wgExternalAuthType;
-               if ( !$obj->initFromCookie() ) {
-                       return false;
-               }
-               return $obj;
-       }
-
-       /**
-        * Creates the object corresponding to the given User object, assuming the
-        * user exists on the wiki and is linked to an external account.  If either
-        * of these is false, this will return false.
-        *
-        * This is a wrapper around newFromId().
-        *
-        * @param $user User
-        * @return ExternalUser|bool False on failure
-        */
-       public static function newFromUser( $user ) {
-               global $wgExternalAuthType;
-               if ( is_null( $wgExternalAuthType ) ) {
-                       # Short-circuit to avoid database query in common case so no one
-                       # kills me
-                       return false;
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $id = $dbr->selectField( 'external_user', 'eu_external_id',
-                       array( 'eu_local_id' => $user->getId() ), __METHOD__ );
-               if ( $id === false ) {
-                       return false;
-               }
-               return self::newFromId( $id );
-       }
-
-       /**
-        * Given a name, which is a string exactly as input by the user in the
-        * login form but with whitespace stripped, initialize this object to be
-        * the corresponding ExternalUser.  Return true if successful, otherwise
-        * false.
-        *
-        * @param $name string
-        * @return bool Success?
-        */
-       abstract protected function initFromName( $name );
-
-       /**
-        * Given an id, which was at some previous point in history returned by
-        * getId(), initialize this object to be the corresponding ExternalUser.
-        * Return true if successful, false otherwise.
-        *
-        * @param $id string
-        * @return bool Success?
-        */
-       abstract protected function initFromId( $id );
-
-       /**
-        * Try to magically initialize the user from cookies or similar information
-        * so he or she can be logged in on just viewing the wiki.  If this is
-        * impossible to do, just return false.
-        *
-        * TODO: Actually use this.
-        *
-        * @return bool Success?
-        */
-       protected function initFromCookie() {
-               return false;
-       }
-
-       /**
-        * This must return some identifier that stably, uniquely identifies the
-        * user.  In a typical web application, this could be an integer
-        * representing the "user id".  In other cases, it might be a string.  In
-        * any event, the return value should be a string between 1 and 255
-        * characters in length; must uniquely identify the user in the foreign
-        * database; and, if at all possible, should be permanent.
-        *
-        * This will only ever be used to reconstruct this ExternalUser object via
-        * newFromId().  The resulting object in that case should correspond to the
-        * same user, even if details have changed in the interim (e.g., renames or
-        * preference changes).
-        *
-        * @return string
-        */
-       abstract public function getId();
-
-       /**
-        * This must return the name that the user would normally use for login to
-        * the external database.  It is subject to no particular restrictions
-        * beyond rudimentary sanity, and in particular may be invalid as a
-        * MediaWiki username.  It's used to auto-generate an account name that
-        * *is* valid for MediaWiki, either with or without user input, but
-        * basically is only a hint.
-        *
-        * @return string
-        */
-       abstract public function getName();
-
-       /**
-        * Is the given password valid for the external user?  The password is
-        * provided in plaintext.
-        *
-        * @param $password string
-        * @return bool
-        */
-       abstract public function authenticate( $password );
-
-       /**
-        * Retrieve the value corresponding to the given preference key.  The most
-        * important values are:
-        *
-        * - emailaddress
-        * - language
-        *
-        * The value must meet MediaWiki's requirements for values of this type,
-        * and will be checked for validity before use.  If the preference makes no
-        * sense for the backend, or it makes sense but is unset for this user, or
-        * is unrecognized, return null.
-        *
-        * $pref will never equal 'password', since passwords are usually hashed
-        * and cannot be directly retrieved.  authenticate() is used for this
-        * instead.
-        *
-        * TODO: Currently this is only called for 'emailaddress'; generalize!  Add
-        * some config option to decide which values are grabbed on user
-        * initialization.
-        *
-        * @param $pref string
-        * @return mixed
-        */
-       public function getPref( $pref ) {
-               return null;
-       }
-
-       /**
-        * Return an array of identifiers for all the foreign groups that this user
-        * has.  The identifiers are opaque objects that only need to be
-        * specifiable by the administrator in LocalSettings.php when configuring
-        * $wgAutopromote.  They may be, for instance, strings or integers.
-        *
-        * TODO: Support this in $wgAutopromote.
-        *
-        * @return array
-        */
-       public function getGroups() {
-               return array();
-       }
-
-       /**
-        * Given a preference key (e.g., 'emailaddress'), provide an HTML message
-        * telling the user how to change it in the external database.  The
-        * administrator has specified that this preference cannot be changed on
-        * the wiki, and may only be changed in the foreign database.  If no
-        * message is available, such as for an unrecognized preference, return
-        * false.
-        *
-        * TODO: Use this somewhere.
-        *
-        * @param $pref string
-        * @return mixed String or false
-        */
-       public static function getPrefMessage( $pref ) {
-               return false;
-       }
-
-       /**
-        * Set the given preference key to the given value.  Two important
-        * preference keys that you might want to implement are 'password' and
-        * 'emailaddress'.  If the set fails, such as because the preference is
-        * unrecognized or because the external database can't be changed right
-        * now, return false.  If it succeeds, return true.
-        *
-        * If applicable, you should make sure to validate the new value against
-        * any constraints the external database may have, since MediaWiki may have
-        * more limited constraints (e.g., on password strength).
-        *
-        * TODO: Untested.
-        *
-        * @param $key string
-        * @param $value string
-        * @return bool Success?
-        */
-       public static function setPref( $key, $value ) {
-               return false;
-       }
-
-       /**
-        * Create a link for future reference between this object and the provided
-        * user_id.  If the user was already linked, the old link will be
-        * overwritten.
-        *
-        * This is part of the core code and is not overridable by specific
-        * plugins.  It's in this class only for convenience.
-        *
-        * @param int $id user_id
-        */
-       final public function linkToLocal( $id ) {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace( 'external_user',
-                       array( 'eu_local_id', 'eu_external_id' ),
-                       array( 'eu_local_id' => $id,
-                               'eu_external_id' => $this->getId() ),
-                       __METHOD__ );
-       }
-
-       /**
-        * Check whether this external user id is already linked with
-        * a local user.
-        * @return Mixed User if the account is linked, Null otherwise.
-        */
-       final public function getLocalUser() {
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow(
-                       'external_user',
-                       '*',
-                       array( 'eu_external_id' => $this->getId() )
-               );
-               return $row
-                       ? User::newFromId( $row->eu_local_id )
-                       : null;
-       }
-
-}
index 2e19a09..cdf6c88 100644 (file)
@@ -35,13 +35,13 @@ class Fallback {
                if ( substr( $to, -8 ) == '//IGNORE' ) {
                        $to = substr( $to, 0, strlen( $to ) - 8 );
                }
-               if( strcasecmp( $from, $to ) == 0 ) {
+               if ( strcasecmp( $from, $to ) == 0 ) {
                        return $string;
                }
-               if( strcasecmp( $from, 'utf-8' ) == 0 ) {
+               if ( strcasecmp( $from, 'utf-8' ) == 0 ) {
                        return utf8_decode( $string );
                }
-               if( strcasecmp( $to, 'utf-8' ) == 0 ) {
+               if ( strcasecmp( $to, 'utf-8' ) == 0 ) {
                        return utf8_encode( $string );
                }
                return $string;
@@ -64,12 +64,12 @@ class Fallback {
         * @return string
         */
        public static function mb_substr( $str, $start, $count = 'end' ) {
-               if( $start != 0 ) {
+               if ( $start != 0 ) {
                        $split = self::mb_substr_split_unicode( $str, intval( $start ) );
                        $str = substr( $str, $split );
                }
 
-               if( $count !== 'end' ) {
+               if ( $count !== 'end' ) {
                        $split = self::mb_substr_split_unicode( $str, intval( $count ) );
                        $str = substr( $str, 0, $split );
                }
@@ -83,14 +83,14 @@ class Fallback {
         * @return int
         */
        public static function mb_substr_split_unicode( $str, $splitPos ) {
-               if( $splitPos == 0 ) {
+               if ( $splitPos == 0 ) {
                        return 0;
                }
 
                $byteLen = strlen( $str );
 
-               if( $splitPos > 0 ) {
-                       if( $splitPos > 256 ) {
+               if ( $splitPos > 0 ) {
+                       if ( $splitPos > 256 ) {
                                // Optimize large string offsets by skipping ahead N bytes.
                                // This will cut out most of our slow time on Latin-based text,
                                // and 1/2 to 1/3 on East European and Asian scripts.
@@ -104,7 +104,7 @@ class Fallback {
                                $bytePos = 0;
                        }
 
-                       while( $charPos++ < $splitPos ) {
+                       while ( $charPos++ < $splitPos ) {
                                ++$bytePos;
                                // Move past any tail bytes
                                while ( $bytePos < $byteLen && $str[$bytePos] >= "\x80" && $str[$bytePos] < "\xc0" ) {
@@ -115,7 +115,7 @@ class Fallback {
                        $splitPosX = $splitPos + 1;
                        $charPos = 0; // relative to end of string; we don't care about the actual char position here
                        $bytePos = $byteLen;
-                       while( $bytePos > 0 && $charPos-- >= $splitPosX ) {
+                       while ( $bytePos > 0 && $charPos-- >= $splitPosX ) {
                                --$bytePos;
                                // Move past any tail bytes
                                while ( $bytePos > 0 && $str[$bytePos] >= "\x80" && $str[$bytePos] < "\xc0" ) {
@@ -138,12 +138,12 @@ class Fallback {
                $total = 0;
 
                // Count ASCII bytes
-               for( $i = 0; $i < 0x80; $i++ ) {
+               for ( $i = 0; $i < 0x80; $i++ ) {
                        $total += $counts[$i];
                }
 
                // Count multibyte sequence heads
-               for( $i = 0xc0; $i < 0xff; $i++ ) {
+               for ( $i = 0xc0; $i < 0xff; $i++ ) {
                        $total += $counts[$i];
                }
                return $total;
@@ -163,7 +163,7 @@ class Fallback {
                $ar = array();
                preg_match( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
 
-               if( isset( $ar[0][1] ) ) {
+               if ( isset( $ar[0][1] ) ) {
                        return $ar[0][1];
                } else {
                        return false;
@@ -184,7 +184,7 @@ class Fallback {
                $ar = array();
                preg_match_all( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset );
 
-               if( isset( $ar[0] ) && count( $ar[0] ) > 0 &&
+               if ( isset( $ar[0] ) && count( $ar[0] ) > 0 &&
                        isset( $ar[0][count( $ar[0] ) - 1][1] ) ) {
                        return $ar[0][count( $ar[0] ) - 1][1];
                } else {
index caf2e57..635b04e 100644 (file)
@@ -245,7 +245,7 @@ abstract class ChannelFeed extends FeedItem {
                global $wgRequest;
                $ctype = $wgRequest->getVal( 'ctype', 'application/xml' );
                $allowedctypes = array( 'application/xml', 'text/xml', 'application/rss+xml', 'application/atom+xml' );
-               return (in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml');
+               return ( in_array( $ctype, $allowedctypes ) ? $ctype : 'application/xml' );
        }
 
        /**
@@ -306,13 +306,13 @@ class RSSFeed extends ChannelFeed {
        function outItem( $item ) {
        ?>
                <item>
-                       <title><?php print $item->getTitle() ?></title>
-                       <link><?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ) ?></link>
-                       <guid<?php if( !$item->rssIsPermalink ) print ' isPermaLink="false"' ?>><?php print $item->getUniqueId() ?></guid>
+                       <title><?php print $item->getTitle(); ?></title>
+                       <link><?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ); ?></link>
+                       <guid<?php if ( !$item->rssIsPermalink ) { print ' isPermaLink="false"'; } ?>><?php print $item->getUniqueId(); ?></guid>
                        <description><?php print $item->getDescription() ?></description>
-                       <?php if( $item->getDate() ) { ?><pubDate><?php print $this->formatTime( $item->getDate() ) ?></pubDate><?php } ?>
-                       <?php if( $item->getAuthor() ) { ?><dc:creator><?php print $item->getAuthor() ?></dc:creator><?php }?>
-                       <?php if( $item->getComments() ) { ?><comments><?php print wfExpandUrl( $item->getComments(), PROTO_CURRENT ) ?></comments><?php }?>
+                       <?php if ( $item->getDate() ) { ?><pubDate><?php print $this->formatTime( $item->getDate() ); ?></pubDate><?php } ?>
+                       <?php if ( $item->getAuthor() ) { ?><dc:creator><?php print $item->getAuthor(); ?></dc:creator><?php }?>
+                       <?php if ( $item->getComments() ) { ?><comments><?php print wfExpandUrl( $item->getComments(), PROTO_CURRENT ); ?></comments><?php }?>
                </item>
 <?php
        }
@@ -392,15 +392,15 @@ class AtomFeed extends ChannelFeed {
                global $wgMimeType;
        ?>
        <entry>
-               <id><?php print $item->getUniqueId() ?></id>
-               <title><?php print $item->getTitle() ?></title>
-               <link rel="alternate" type="<?php print $wgMimeType ?>" href="<?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ) ?>"/>
-               <?php if( $item->getDate() ) { ?>
-               <updated><?php print $this->formatTime( $item->getDate() ) ?>Z</updated>
+               <id><?php print $item->getUniqueId(); ?></id>
+               <title><?php print $item->getTitle(); ?></title>
+               <link rel="alternate" type="<?php print $wgMimeType ?>" href="<?php print wfExpandUrl( $item->getUrl(), PROTO_CURRENT ); ?>"/>
+               <?php if ( $item->getDate() ) { ?>
+               <updated><?php print $this->formatTime( $item->getDate() ); ?>Z</updated>
                <?php } ?>
 
                <summary type="html"><?php print $item->getDescription() ?></summary>
-               <?php if( $item->getAuthor() ) { ?><author><name><?php print $item->getAuthor() ?></name></author><?php }?>
+               <?php if ( $item->getAuthor() ) { ?><author><name><?php print $item->getAuthor(); ?></name></author><?php }?>
        </entry>
 
 <?php /* @todo FIXME: Need to add comments
index adc1f78..22cb52b 100644 (file)
@@ -59,7 +59,7 @@ class FeedUtils {
                        return false;
                }
 
-               if( !isset( $wgFeedClasses[$type] ) ) {
+               if ( !isset( $wgFeedClasses[$type] ) ) {
                        $wgOut->addWikiMsg( 'feed-invalid' );
                        return false;
                }
@@ -77,14 +77,14 @@ class FeedUtils {
                $titleObj = Title::makeTitle( $row->rc_namespace, $row->rc_title );
                $timestamp = wfTimestamp( TS_MW, $row->rc_timestamp );
                $actiontext = '';
-               if( $row->rc_type == RC_LOG ) {
+               if ( $row->rc_type == RC_LOG ) {
                        $rcRow = (array)$row; // newFromRow() only accepts arrays for RC rows
                        $actiontext = LogFormatter::newFromRow( $rcRow )->getActionText();
                }
                return self::formatDiffRow( $titleObj,
                        $row->rc_last_oldid, $row->rc_this_oldid,
                        $timestamp,
-                       ($row->rc_deleted & Revision::DELETED_COMMENT)
+                       $row->rc_deleted & Revision::DELETED_COMMENT
                                ? wfMessage( 'rev-deleted-comment' )->escaped()
                                : $row->rc_comment,
                        $actiontext
@@ -121,13 +121,13 @@ class FeedUtils {
 
                // Can't diff special pages, unreadable pages or pages with no new revision
                // to compare against: just return the text.
-               if( $title->getNamespace() < 0 || $accErrors || !$newid ) {
+               if ( $title->getNamespace() < 0 || $accErrors || !$newid ) {
                        wfProfileOut( __METHOD__ );
                        return $completeText;
                }
 
-               if( $oldid ) {
-                       wfProfileIn( __METHOD__."-dodiff" );
+               if ( $oldid ) {
+                       wfProfileIn( __METHOD__ . "-dodiff" );
 
                        #$diffText = $de->getDiff( wfMessage( 'revisionasof',
                        #       $wgLang->timeanddate( $timestamp ),
@@ -168,10 +168,10 @@ class FeedUtils {
                                $diffText = UtfNormal::cleanUp( $diffText );
                                $diffText = self::applyDiffStyle( $diffText );
                        }
-                       wfProfileOut( __METHOD__."-dodiff" );
+                       wfProfileOut( __METHOD__ . "-dodiff" );
                } else {
                        $rev = Revision::newFromId( $newid );
-                       if( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
+                       if ( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
                                $newContent = ContentHandler::getForTitle( $title )->makeEmptyContent();
                        } else {
                                $newContent = $rev->getContent();
@@ -220,10 +220,11 @@ class FeedUtils {
         * @return string
         */
        protected static function getDiffLink( Title $title, $newid, $oldid = null ) {
-               $queryParameters = ($oldid == null)
-                       ? "diff={$newid}"
-                       : "diff={$newid}&oldid={$oldid}";
-               $diffUrl = $title->getFullUrl( $queryParameters );
+               $queryParameters = array( 'diff' => $newid );
+               if ( $oldid != null ) {
+                       $queryParameters['oldid'] = $oldid;
+               }
+               $diffUrl = $title->getFullURL( $queryParameters );
 
                $diffLink = Html::element( 'a', array( 'href' => $diffUrl ),
                        wfMessage( 'showdiff' )->inContentLanguage()->text() );
@@ -250,7 +251,7 @@ class FeedUtils {
                        'diffchange'       => 'font-weight: bold; text-decoration: none;',
                );
 
-               foreach( $styles as $class => $style ) {
+               foreach ( $styles as $class => $style ) {
                        $text = preg_replace( "/(<[^>]+)class=(['\"])$class\\2([^>]*>)/",
                                "\\1style=\"$style\"\\3", $text );
                }
index 28403cc..9fc70eb 100644 (file)
@@ -82,18 +82,18 @@ class FileDeleteForm {
                # Flag to hide all contents of the archived revisions
                $suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
 
-               if( $this->oldimage ) {
+               if ( $this->oldimage ) {
                        $this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->title, $this->oldimage );
                }
 
-               if( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
+               if ( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
                        $wgOut->addHTML( $this->prepareMessage( 'filedelete-nofile' ) );
                        $wgOut->addReturnTo( $this->title );
                        return;
                }
 
                // Perform the deletion if appropriate
-               if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
+               if ( $wgRequest->wasPosted() && $wgUser->matchEditToken( $token, $this->oldimage ) ) {
                        $deleteReasonList = $wgRequest->getText( 'wpDeleteReasonList' );
                        $deleteReason = $wgRequest->getText( 'wpReason' );
 
@@ -109,11 +109,11 @@ class FileDeleteForm {
 
                        $status = self::doDelete( $this->title, $this->file, $this->oldimage, $reason, $suppress, $wgUser );
 
-                       if( !$status->isGood() ) {
+                       if ( !$status->isGood() ) {
                                $wgOut->addHTML( '<h2>' . $this->prepareMessage( 'filedeleteerror-short' ) . "</h2>\n" );
                                $wgOut->addWikiText( '<div class="error">' . $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' ) . '</div>' );
                        }
-                       if( $status->ok ) {
+                       if ( $status->ok ) {
                                $wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
                                $wgOut->addHTML( $this->prepareMessage( 'filedelete-success' ) );
                                // Return to the main page if we just deleted all versions of the
@@ -153,13 +153,13 @@ class FileDeleteForm {
                        $user = $wgUser;
                }
 
-               if( $oldimage ) {
+               if ( $oldimage ) {
                        $page = null;
                        $status = $file->deleteOld( $oldimage, $reason, $suppress );
-                       if( $status->ok ) {
+                       if ( $status->ok ) {
                                // Need to do a log item
                                $logComment = wfMessage( 'deletedrevision', $oldimage )->inContentLanguage()->text();
-                               if( trim( $reason ) != '' ) {
+                               if ( trim( $reason ) != '' ) {
                                        $logComment .= wfMessage( 'colon-separator' )
                                                ->inContentLanguage()->text() . $reason;
                                }
@@ -187,7 +187,7 @@ class FileDeleteForm {
                                // or revision is missing, so check for isOK() rather than isGood()
                                if ( $deleteStatus->isOK() ) {
                                        $status = $file->delete( $reason, $suppress );
-                                       if( $status->isOK() ) {
+                                       if ( $status->isOK() ) {
                                                $dbw->commit( __METHOD__ );
                                        } else {
                                                $dbw->rollback( __METHOD__ );
@@ -213,7 +213,7 @@ class FileDeleteForm {
        private function showForm() {
                global $wgOut, $wgUser, $wgRequest;
 
-               if( $wgUser->isAllowed( 'suppressrevision' ) ) {
+               if ( $wgUser->isAllowed( 'suppressrevision' ) ) {
                        $suppress = "<tr id=\"wpDeleteSuppressRow\">
                                        <td></td>
                                        <td class='mw-input'><strong>" .
@@ -258,7 +258,7 @@ class FileDeleteForm {
                                "</td>
                        </tr>
                        {$suppress}";
-               if( $wgUser->isLoggedIn() ) {
+               if ( $wgUser->isLoggedIn() ) {
                        $form .= "
                        <tr>
                                <td></td>
@@ -314,7 +314,7 @@ class FileDeleteForm {
         */
        private function prepareMessage( $message ) {
                global $wgLang;
-               if( $this->oldimage ) {
+               if ( $this->oldimage ) {
                        return wfMessage(
                                "{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
                                wfEscapeWikiText( $this->title->getText() ),
@@ -375,11 +375,11 @@ class FileDeleteForm {
                $q = array();
                $q['action'] = 'delete';
 
-               if( $this->oldimage ) {
+               if ( $this->oldimage ) {
                        $q['oldimage'] = $this->oldimage;
                }
 
-               return $this->title->getLocalUrl( $q );
+               return $this->title->getLocalURL( $q );
        }
 
        /**
index 89ad955..ced45af 100644 (file)
@@ -121,7 +121,9 @@ class ForkController {
                        if ( function_exists( 'pcntl_signal_dispatch' ) ) {
                                pcntl_signal_dispatch();
                        } else {
-                               declare (ticks=1) { $status = $status; }
+                               declare( ticks = 1 ) {
+                                       $status = $status;
+                               }
                        }
                        // Respond to TERM signal
                        if ( $this->termReceived ) {
index 8477ed9..530b094 100644 (file)
@@ -290,15 +290,19 @@ class FormOptions implements ArrayAccess {
                        $default = $this->options[$name]['default'];
                        $type = $this->options[$name]['type'];
 
-                       switch( $type ) {
+                       switch ( $type ) {
                                case self::BOOL:
-                                       $value = $r->getBool( $name, $default ); break;
+                                       $value = $r->getBool( $name, $default );
+                                       break;
                                case self::INT:
-                                       $value = $r->getInt( $name, $default ); break;
+                                       $value = $r->getInt( $name, $default );
+                                       break;
                                case self::STRING:
-                                       $value = $r->getText( $name, $default ); break;
+                                       $value = $r->getText( $name, $default );
+                                       break;
                                case self::INTNULL:
-                                       $value = $r->getIntOrNull( $name ); break;
+                                       $value = $r->getIntOrNull( $name );
+                                       break;
                                default:
                                        throw new MWException( 'Unsupported datatype' );
                        }
index 6f7f802..a54b807 100644 (file)
@@ -120,6 +120,32 @@ class GitInfo {
                return $sha1;
        }
 
+       /**
+        * Return the commit date of HEAD entry of the git code repository
+        *
+        * @since 1.22
+        * @return int|bool Commit date (UNIX timestamp) or false
+        */
+       public function getHeadCommitDate() {
+               global $wgGitBin;
+
+               if ( !is_file( $wgGitBin ) || !is_executable( $wgGitBin ) ) {
+                       return false;
+               }
+
+               $environment = array( "GIT_DIR" => $this->basedir );
+               $cmd = wfEscapeShellArg( $wgGitBin ) . " show -s --format=format:%ct HEAD";
+               $retc = false;
+               $commitDate = wfShellExec( $cmd, $retc, $environment );
+
+               if ( $retc !== 0 ) {
+                       return false;
+               } else {
+                       return (int)$commitDate;
+               }
+
+        }
+
        /**
         * Return the name of the current branch, or HEAD if not found
         * @return string The branch name, HEAD, or false
@@ -151,7 +177,7 @@ class GitInfo {
                if ( isset( $configArray['remote origin'] ) ) {
                        $remote = $configArray['remote origin'];
                } else {
-                       foreach( $configArray as $sectionName => $sectionConf ) {
+                       foreach ( $configArray as $sectionName => $sectionConf ) {
                                if ( substr( $sectionName, 0, 6 ) == 'remote' ) {
                                        $remote = $sectionConf;
                                }
@@ -166,7 +192,7 @@ class GitInfo {
                if ( substr( $url, -4 ) !== '.git' ) {
                        $url .= '.git';
                }
-               foreach( self::getViewers() as $repo => $viewer ) {
+               foreach ( self::getViewers() as $repo => $viewer ) {
                        $pattern = '#^' . $repo . '$#';
                        if ( preg_match( $pattern, $url ) ) {
                                $viewerUrl = preg_replace( $pattern, $viewer, $url );
@@ -212,7 +238,7 @@ class GitInfo {
        protected static function getViewers() {
                global $wgGitRepositoryViewers;
 
-               if( self::$viewers === false ) {
+               if ( self::$viewers === false ) {
                        self::$viewers = $wgGitRepositoryViewers;
                        wfRunHooks( 'GitViewers', array( &self::$viewers ) );
                }
index 016736f..1c6f642 100644 (file)
@@ -35,7 +35,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  * PHP extensions may be included here.
  */
 
-if( !function_exists( 'iconv' ) ) {
+if ( !function_exists( 'iconv' ) ) {
        /**
         * @codeCoverageIgnore
         * @return string
@@ -73,7 +73,7 @@ if ( !function_exists( 'mb_strlen' ) ) {
        }
 }
 
-if( !function_exists( 'mb_strpos' ) ) {
+if ( !function_exists( 'mb_strpos' ) ) {
        /**
         * @codeCoverageIgnore
         * @return int
@@ -84,7 +84,7 @@ if( !function_exists( 'mb_strpos' ) ) {
 
 }
 
-if( !function_exists( 'mb_strrpos' ) ) {
+if ( !function_exists( 'mb_strrpos' ) ) {
        /**
         * @codeCoverageIgnore
         * @return int
@@ -93,26 +93,6 @@ if( !function_exists( 'mb_strrpos' ) ) {
                return Fallback::mb_strrpos( $haystack, $needle, $offset, $encoding );
        }
 }
-
-// Support for Wietse Venema's taint feature
-if ( !function_exists( 'istainted' ) ) {
-       /**
-        * @codeCoverageIgnore
-        * @return int
-        */
-       function istainted( $var ) {
-               return 0;
-       }
-       /** @codeCoverageIgnore */
-       function taint( $var, $level = 0 ) {}
-       /** @codeCoverageIgnore */
-       function untaint( $var, $level = 0 ) {}
-       define( 'TC_HTML', 1 );
-       define( 'TC_SHELL', 1 );
-       define( 'TC_MYSQL', 1 );
-       define( 'TC_PCRE', 1 );
-       define( 'TC_SELF', 1 );
-}
 /// @endcond
 
 /**
@@ -138,7 +118,7 @@ function wfArrayDiff2_cmp( $a, $b ) {
        } else {
                reset( $a );
                reset( $b );
-               while( ( list( , $valueA ) = each( $a ) ) && ( list( , $valueB ) = each( $b ) ) ) {
+               while ( ( list( , $valueA ) = each( $a ) ) && ( list( , $valueB ) = each( $b ) ) ) {
                        $cmp = strcmp( $valueA, $valueB );
                        if ( $cmp !== 0 ) {
                                return $cmp;
@@ -262,7 +242,7 @@ function wfArrayInsertAfter( array $array, array $insert, $after ) {
  */
 function wfObjectToArray( $objOrArray, $recursive = true ) {
        $array = array();
-       if( is_object( $objOrArray ) ) {
+       if ( is_object( $objOrArray ) ) {
                $objOrArray = get_object_vars( $objOrArray );
        }
        foreach ( $objOrArray as $key => $value ) {
@@ -276,24 +256,6 @@ function wfObjectToArray( $objOrArray, $recursive = true ) {
        return $array;
 }
 
-/**
- * Wrapper around array_map() which also taints variables
- *
- * @param  $function Callback
- * @param  $input Array
- * @return Array
- */
-function wfArrayMap( $function, $input ) {
-       $ret = array_map( $function, $input );
-       foreach ( $ret as $key => $value ) {
-               $taint = istainted( $input[$key] );
-               if ( $taint ) {
-                       taint( $ret[$key], $taint );
-               }
-       }
-       return $ret;
-}
-
 /**
  * Get a random decimal value between 0 and 1, in a way
  * not likely to give duplicate values for any realistic
@@ -322,8 +284,8 @@ function wfRandom() {
  */
 function wfRandomString( $length = 32 ) {
        $str = '';
-       while ( strlen( $str ) < $length ) {
-               $str .= dechex( mt_rand() );
+       for ( $n = 0; $n < $length; $n += 7 ) {
+               $str .= sprintf( '%07x', mt_rand() & 0xfffffff );
        }
        return substr( $str, 0, $length );
 }
@@ -480,8 +442,8 @@ function wfAppendQuery( $url, $query ) {
        if ( is_array( $query ) ) {
                $query = wfArrayToCgi( $query );
        }
-       if( $query != '' ) {
-               if( false === strpos( $url, '?' ) ) {
+       if ( $query != '' ) {
+               if ( false === strpos( $url, '?' ) ) {
                        $url .= '?';
                } else {
                        $url .= '&';
@@ -1011,7 +973,7 @@ function wfDebugTimer() {
  */
 function wfDebugMem( $exact = false ) {
        $mem = memory_get_usage();
-       if( !$exact ) {
+       if ( !$exact ) {
                $mem = floor( $mem / 1024 ) . ' kilobytes';
        } else {
                $mem .= ' bytes';
@@ -1031,7 +993,7 @@ function wfDebugMem( $exact = false ) {
 function wfDebugLog( $logGroup, $text, $public = true ) {
        global $wgDebugLogGroups;
        $text = trim( $text ) . "\n";
-       if( isset( $wgDebugLogGroups[$logGroup] ) ) {
+       if ( isset( $wgDebugLogGroups[$logGroup] ) ) {
                $time = wfTimestamp( TS_DB );
                $wiki = wfWikiID();
                $host = wfHostname();
@@ -1093,16 +1055,29 @@ function wfDeprecated( $function, $version = false, $component = false, $callerO
 
 /**
  * Send a warning either to the debug log or in a PHP error depending on
- * $wgDevelopmentWarnings
+ * $wgDevelopmentWarnings. To log warnings in production, use wfLogWarning() instead.
  *
  * @param string $msg message to send
  * @param $callerOffset Integer: number of items to go back in the backtrace to
  *        find the correct caller (1 = function calling wfWarn, ...)
- * @param $level Integer: PHP error level; only used when $wgDevelopmentWarnings
- *        is true
+ * @param $level Integer: PHP error level; defaults to E_USER_NOTICE;
+ *        only used when $wgDevelopmentWarnings is true
  */
 function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
-       MWDebug::warning( $msg, $callerOffset + 1, $level );
+       MWDebug::warning( $msg, $callerOffset + 1, $level, 'auto' );
+}
+
+/**
+ * Send a warning as a PHP error and the debug log. This is intended for logging
+ * warnings in production. For logging development warnings, use WfWarn instead.
+ *
+ * @param $msg String: message to send
+ * @param $callerOffset Integer: number of items to go back in the backtrace to
+ *        find the correct caller (1 = function calling wfLogWarning, ...)
+ * @param $level Integer: PHP error level; defaults to E_USER_WARNING
+ */
+function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
+       MWDebug::warning( $msg, $callerOffset + 1, $level, 'production' );
 }
 
 /**
@@ -1177,6 +1152,8 @@ function wfLogProfilingData() {
        global $wgRequestTime, $wgDebugLogFile, $wgDebugRawPage, $wgRequest;
        global $wgProfileLimit, $wgUser;
 
+       StatCounter::singleton()->flush();
+
        $profiler = Profiler::instance();
 
        # Profiling must actually be enabled...
@@ -1240,51 +1217,7 @@ function wfLogProfilingData() {
  * @return void
  */
 function wfIncrStats( $key, $count = 1 ) {
-       global $wgStatsMethod;
-
-       $count = intval( $count );
-       if ( $count == 0 ) {
-               return;
-       }
-
-       if( $wgStatsMethod == 'udp' ) {
-               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
-               static $socket;
-
-               $id = $wgAggregateStatsID !== false ? $wgAggregateStatsID : wfWikiID();
-
-               if ( !$socket ) {
-                       $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-                       $statline = "stats/{$id} - 1 1 1 1 1 -total\n";
-                       socket_sendto(
-                               $socket,
-                               $statline,
-                               strlen( $statline ),
-                               0,
-                               $wgUDPProfilerHost,
-                               $wgUDPProfilerPort
-                       );
-               }
-               $statline = "stats/{$id} - {$count} 1 1 1 1 {$key}\n";
-               wfSuppressWarnings();
-               socket_sendto(
-                       $socket,
-                       $statline,
-                       strlen( $statline ),
-                       0,
-                       $wgUDPProfilerHost,
-                       $wgUDPProfilerPort
-               );
-               wfRestoreWarnings();
-       } elseif( $wgStatsMethod == 'cache' ) {
-               global $wgMemc;
-               $key = wfMemcKey( 'stats', $key );
-               if ( is_null( $wgMemc->incr( $key, $count ) ) ) {
-                       $wgMemc->add( $key, $count );
-               }
-       } else {
-               // Disabled
-       }
+       StatCounter::singleton()->incr( $key, $count );
 }
 
 /**
@@ -1339,27 +1272,27 @@ function wfReadOnlyReason() {
 function wfGetLangObj( $langcode = false ) {
        # Identify which language to get or create a language object for.
        # Using is_object here due to Stub objects.
-       if( is_object( $langcode ) ) {
+       if ( is_object( $langcode ) ) {
                # Great, we already have the object (hopefully)!
                return $langcode;
        }
 
        global $wgContLang, $wgLanguageCode;
-       if( $langcode === true || $langcode === $wgLanguageCode ) {
+       if ( $langcode === true || $langcode === $wgLanguageCode ) {
                # $langcode is the language code of the wikis content language object.
                # or it is a boolean and value is true
                return $wgContLang;
        }
 
        global $wgLang;
-       if( $langcode === false || $langcode === $wgLang->getCode() ) {
+       if ( $langcode === false || $langcode === $wgLang->getCode() ) {
                # $langcode is the language code of user language object.
                # or it was a boolean and value is false
                return $wgLang;
        }
 
        $validCodes = array_keys( Language::fetchLanguageNames() );
-       if( in_array( $langcode, $validCodes ) ) {
+       if ( in_array( $langcode, $validCodes ) ) {
                # $langcode corresponds to a valid language.
                return Language::factory( $langcode );
        }
@@ -1492,7 +1425,7 @@ function wfMsgForContent( $key ) {
        $args = func_get_args();
        array_shift( $args );
        $forcontent = true;
-       if( is_array( $wgForceUIMsgAsContentMsg ) &&
+       if ( is_array( $wgForceUIMsgAsContentMsg ) &&
                in_array( $key, $wgForceUIMsgAsContentMsg ) )
        {
                $forcontent = false;
@@ -1515,7 +1448,7 @@ function wfMsgForContentNoTrans( $key ) {
        $args = func_get_args();
        array_shift( $args );
        $forcontent = true;
-       if( is_array( $wgForceUIMsgAsContentMsg ) &&
+       if ( is_array( $wgForceUIMsgAsContentMsg ) &&
                in_array( $key, $wgForceUIMsgAsContentMsg ) )
        {
                $forcontent = false;
@@ -1564,7 +1497,7 @@ function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true
 
        $cache = MessageCache::singleton();
        $message = $cache->get( $key, $useDB, $langCode );
-       if( $message === false ) {
+       if ( $message === false ) {
                $message = '&lt;' . htmlspecialchars( $key ) . '&gt;';
        } elseif ( $transform ) {
                $message = $cache->transform( $message );
@@ -1591,7 +1524,7 @@ function wfMsgReplaceArgs( $message, $args ) {
                        $args = array_values( $args[0] );
                }
                $replacementKeys = array();
-               foreach( $args as $n => $param ) {
+               foreach ( $args as $n => $param ) {
                        $replacementKeys['$' . ( $n + 1 )] = $param;
                }
                $message = strtr( $message, $replacementKeys );
@@ -1675,11 +1608,11 @@ function wfMsgExt( $key, $options ) {
        array_shift( $args );
        $options = (array)$options;
 
-       foreach( $options as $arrayKey => $option ) {
-               if( !preg_match( '/^[0-9]+|language$/', $arrayKey ) ) {
+       foreach ( $options as $arrayKey => $option ) {
+               if ( !preg_match( '/^[0-9]+|language$/', $arrayKey ) ) {
                        # An unknown index, neither numeric nor "language"
                        wfWarn( "wfMsgExt called with incorrect parameter key $arrayKey", 1, E_USER_WARNING );
-               } elseif( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option,
+               } elseif ( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option,
                array( 'parse', 'parseinline', 'escape', 'escapenoentities',
                'replaceafter', 'parsemag', 'content' ) ) ) {
                        # A numeric index with unknown value
@@ -1687,11 +1620,11 @@ function wfMsgExt( $key, $options ) {
                }
        }
 
-       if( in_array( 'content', $options, true ) ) {
+       if ( in_array( 'content', $options, true ) ) {
                $forContent = true;
                $langCode = true;
                $langCodeObj = null;
-       } elseif( array_key_exists( 'language', $options ) ) {
+       } elseif ( array_key_exists( 'language', $options ) ) {
                $forContent = false;
                $langCode = wfGetLangObj( $options['language'] );
                $langCodeObj = $langCode;
@@ -1703,13 +1636,13 @@ function wfMsgExt( $key, $options ) {
 
        $string = wfMsgGetKey( $key, /*DB*/true, $langCode, /*Transform*/false );
 
-       if( !in_array( 'replaceafter', $options, true ) ) {
+       if ( !in_array( 'replaceafter', $options, true ) ) {
                $string = wfMsgReplaceArgs( $string, $args );
        }
 
        $messageCache = MessageCache::singleton();
        $parseInline = in_array( 'parseinline', $options, true );
-       if( in_array( 'parse', $options, true ) || $parseInline ) {
+       if ( in_array( 'parse', $options, true ) || $parseInline ) {
                $string = $messageCache->parse( $string, null, true, !$forContent, $langCodeObj );
                if ( $string instanceof ParserOutput ) {
                        $string = $string->getText();
@@ -1717,7 +1650,7 @@ function wfMsgExt( $key, $options ) {
 
                if ( $parseInline ) {
                        $m = array();
-                       if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
+                       if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
                                $string = $m[1];
                        }
                }
@@ -1732,7 +1665,7 @@ function wfMsgExt( $key, $options ) {
                $string = Sanitizer::escapeHtmlAllowEntities( $string );
        }
 
-       if( in_array( 'replaceafter', $options, true ) ) {
+       if ( in_array( 'replaceafter', $options, true ) ) {
                $string = wfMsgReplaceArgs( $string, $args );
        }
 
@@ -1741,7 +1674,7 @@ function wfMsgExt( $key, $options ) {
 
 /**
  * Since wfMsg() and co suck, they don't return false if the message key they
- * looked up didn't exist but a XHTML string, this function checks for the
+ * looked up didn't exist but instead the key wrapped in <>'s, this function checks for the
  * nonexistence of messages by checking the MessageCache::get() result directly.
  *
  * @deprecated since 1.18. Use Message::isDisabled().
@@ -1779,7 +1712,7 @@ function wfHostname() {
 
                # Hostname overriding
                global $wgOverrideHostname;
-               if( $wgOverrideHostname !== false ) {
+               if ( $wgOverrideHostname !== false ) {
                        # Set static and skip any detection
                        $host = $wgOverrideHostname;
                        return $host;
@@ -1791,7 +1724,7 @@ function wfHostname() {
                } else {
                        $uname = false;
                }
-               if( is_array( $uname ) && isset( $uname['nodename'] ) ) {
+               if ( is_array( $uname ) && isset( $uname['nodename'] ) ) {
                        $host = $uname['nodename'];
                } elseif ( getenv( 'COMPUTERNAME' ) ) {
                        # Windows computer name
@@ -1838,7 +1771,7 @@ function wfReportTime() {
 function wfDebugBacktrace( $limit = 0 ) {
        static $disabled = null;
 
-       if( extension_loaded( 'Zend Optimizer' ) ) {
+       if ( extension_loaded( 'Zend Optimizer' ) ) {
                wfDebug( "Zend Optimizer detected; skipping debug_backtrace for safety.\n" );
                return array();
        }
@@ -1878,14 +1811,14 @@ function wfBacktrace() {
                $msg = "<ul>\n";
        }
        $backtrace = wfDebugBacktrace();
-       foreach( $backtrace as $call ) {
-               if( isset( $call['file'] ) ) {
+       foreach ( $backtrace as $call ) {
+               if ( isset( $call['file'] ) ) {
                        $f = explode( DIRECTORY_SEPARATOR, $call['file'] );
                        $file = $f[count( $f ) - 1];
                } else {
                        $file = '-';
                }
-               if( isset( $call['line'] ) ) {
+               if ( isset( $call['line'] ) ) {
                        $line = $call['line'];
                } else {
                        $line = '-';
@@ -1895,7 +1828,7 @@ function wfBacktrace() {
                } else {
                        $msg .= '<li>' . $file . ' line ' . $line . ' calls ';
                }
-               if( !empty( $call['class'] ) ) {
+               if ( !empty( $call['class'] ) ) {
                        $msg .= $call['class'] . $call['type'];
                }
                $msg .= $call['function'] . '()';
@@ -1993,11 +1926,11 @@ function wfViewPrevNext( $offset, $limit, $link, $query = '', $atend = false ) {
 
        $query = wfCgiToArray( $query );
 
-       if( is_object( $link ) ) {
+       if ( is_object( $link ) ) {
                $title = $link;
        } else {
                $title = Title::newFromText( $link );
-               if( is_null( $title ) ) {
+               if ( is_null( $title ) ) {
                        return false;
                }
        }
@@ -2033,16 +1966,16 @@ function wfClientAcceptsGzip( $force = false ) {
        static $result = null;
        if ( $result === null || $force ) {
                $result = false;
-               if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
+               if ( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) ) {
                        # @todo FIXME: We may want to blacklist some broken browsers
                        $m = array();
-                       if( preg_match(
+                       if ( preg_match(
                                '/\bgzip(?:;(q)=([0-9]+(?:\.[0-9]+)))?\b/',
                                $_SERVER['HTTP_ACCEPT_ENCODING'],
                                $m )
                        )
                        {
-                               if( isset( $m[2] ) && ( $m[1] == 'q' ) && ( $m[2] == 0 ) ) {
+                               if ( isset( $m[2] ) && ( $m[1] == 'q' ) && ( $m[2] == 0 ) ) {
                                        $result = false;
                                        return $result;
                                }
@@ -2195,14 +2128,14 @@ function wfHttpError( $code, $label, $desc ) {
  * @param $resetGzipEncoding Bool
  */
 function wfResetOutputBuffers( $resetGzipEncoding = true ) {
-       if( $resetGzipEncoding ) {
+       if ( $resetGzipEncoding ) {
                // Suppress Content-Encoding and Content-Length
                // headers from 1.10+s wfOutputHandler
                global $wgDisableOutputCompression;
                $wgDisableOutputCompression = true;
        }
-       while( $status = ob_get_status() ) {
-               if( $status['type'] == 0 /* PHP_OUTPUT_HANDLER_INTERNAL */ ) {
+       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.
                        //
@@ -2210,13 +2143,13 @@ function wfResetOutputBuffers( $resetGzipEncoding = true ) {
                        // output behavior.
                        break;
                }
-               if( !ob_end_clean() ) {
+               if ( !ob_end_clean() ) {
                        // Could not remove output buffer handler; abort now
                        // to avoid getting in some kind of infinite loop.
                        break;
                }
-               if( $resetGzipEncoding ) {
-                       if( $status['name'] == 'ob_gzhandler' ) {
+               if ( $resetGzipEncoding ) {
+                       if ( $status['name'] == 'ob_gzhandler' ) {
                                // Reset the 'Content-Encoding' field set by this handler
                                // so we can start fresh.
                                header_remove( 'Content-Encoding' );
@@ -2252,7 +2185,7 @@ function wfClearOutputBuffers() {
  */
 function wfAcceptToPrefs( $accept, $def = '*/*' ) {
        # No arg means accept anything (per HTTP spec)
-       if( !$accept ) {
+       if ( !$accept ) {
                return array( $def => 1.0 );
        }
 
@@ -2260,7 +2193,7 @@ function wfAcceptToPrefs( $accept, $def = '*/*' ) {
 
        $parts = explode( ',', $accept );
 
-       foreach( $parts as $part ) {
+       foreach ( $parts as $part ) {
                # @todo FIXME: Doesn't deal with params like 'text/html; level=1'
                $values = explode( ';', trim( $part ) );
                $match = array();
@@ -2287,13 +2220,13 @@ function wfAcceptToPrefs( $accept, $def = '*/*' ) {
  * @private
  */
 function mimeTypeMatch( $type, $avail ) {
-       if( array_key_exists( $type, $avail ) ) {
+       if ( array_key_exists( $type, $avail ) ) {
                return $type;
        } else {
                $parts = explode( '/', $type );
-               if( array_key_exists( $parts[0] . '/*', $avail ) ) {
+               if ( array_key_exists( $parts[0] . '/*', $avail ) ) {
                        return $parts[0] . '/*';
-               } elseif( array_key_exists( '*/*', $avail ) ) {
+               } elseif ( array_key_exists( '*/*', $avail ) ) {
                        return '*/*';
                } else {
                        return null;
@@ -2317,21 +2250,21 @@ function mimeTypeMatch( $type, $avail ) {
 function wfNegotiateType( $cprefs, $sprefs ) {
        $combine = array();
 
-       foreach( array_keys( $sprefs ) as $type ) {
+       foreach ( array_keys( $sprefs ) as $type ) {
                $parts = explode( '/', $type );
-               if( $parts[1] != '*' ) {
+               if ( $parts[1] != '*' ) {
                        $ckey = mimeTypeMatch( $type, $cprefs );
-                       if( $ckey ) {
+                       if ( $ckey ) {
                                $combine[$type] = $sprefs[$type] * $cprefs[$ckey];
                        }
                }
        }
 
-       foreach( array_keys( $cprefs ) as $type ) {
+       foreach ( array_keys( $cprefs ) as $type ) {
                $parts = explode( '/', $type );
-               if( $parts[1] != '*' && !array_key_exists( $type, $sprefs ) ) {
+               if ( $parts[1] != '*' && !array_key_exists( $type, $sprefs ) ) {
                        $skey = mimeTypeMatch( $type, $sprefs );
-                       if( $skey ) {
+                       if ( $skey ) {
                                $combine[$type] = $sprefs[$skey] * $cprefs[$type];
                        }
                }
@@ -2340,8 +2273,8 @@ function wfNegotiateType( $cprefs, $sprefs ) {
        $bestq = 0;
        $besttype = null;
 
-       foreach( array_keys( $combine ) as $type ) {
-               if( $combine[$type] > $bestq ) {
+       foreach ( array_keys( $combine ) as $type ) {
+               if ( $combine[$type] > $bestq ) {
                        $besttype = $type;
                        $bestq = $combine[$type];
                }
@@ -2447,7 +2380,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
        try {
                $timestamp = new MWTimestamp( $ts );
                return $timestamp->getTimestamp( $outputtype );
-       } catch( TimestampException $e ) {
+       } catch ( TimestampException $e ) {
                wfDebug( "wfTimestamp() fed bogus time value: TYPE=$outputtype; VALUE=$ts\n" );
                return false;
        }
@@ -2462,7 +2395,7 @@ function wfTimestamp( $outputtype = TS_UNIX, $ts = 0 ) {
  * @return String
  */
 function wfTimestampOrNull( $outputtype = TS_UNIX, $ts = null ) {
-       if( is_null( $ts ) ) {
+       if ( is_null( $ts ) ) {
                return null;
        } else {
                return wfTimestamp( $outputtype, $ts );
@@ -2533,8 +2466,8 @@ function wfTempDir() {
 
        $tmpDir = array_map( "getenv", array( 'TMPDIR', 'TMP', 'TEMP' ) );
 
-       foreach( $tmpDir as $tmp ) {
-               if( $tmp && file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) {
+       foreach ( $tmpDir as $tmp ) {
+               if ( $tmp && file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) {
                        return $tmp;
                }
        }
@@ -2561,7 +2494,7 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
                wfDebug( "$caller: called wfMkdirParents($dir)\n" );
        }
 
-       if( strval( $dir ) === '' || file_exists( $dir ) ) {
+       if ( strval( $dir ) === '' || file_exists( $dir ) ) {
                return true;
        }
 
@@ -2576,10 +2509,9 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
        $ok = mkdir( $dir, $mode, true ); // PHP5 <3
        wfRestoreWarnings();
 
-       if( !$ok ) {
+       if ( !$ok ) {
                // PHP doesn't report the path in its warning message, so add our own to aid in diagnosis.
-               trigger_error( sprintf( "%s: failed to mkdir \"%s\" mode 0%o", __FUNCTION__, $dir, $mode ),
-                       E_USER_WARNING );
+               wfLogWarning( sprintf( "failed to mkdir \"%s\" mode 0%o", $dir, $mode ) );
        }
        return $ok;
 }
@@ -2630,7 +2562,9 @@ function wfPercent( $nr, $acc = 2, $round = true ) {
 function in_string( $needle, $str, $insensitive = false ) {
        wfDeprecated( __METHOD__, '1.21' );
        $func = 'strpos';
-       if( $insensitive ) $func = 'stripos';
+       if ( $insensitive ) {
+               $func = 'stripos';
+       }
 
        return $func( $str, $needle ) !== false;
 }
@@ -2659,11 +2593,11 @@ function in_string( $needle, $str, $insensitive = false ) {
  * @return Bool
  */
 function wfIniGetBool( $setting ) {
-       $val = ini_get( $setting );
+       $val = strtolower( ini_get( $setting ) );
        // 'on' and 'true' can't have whitespace around them, but '1' can.
-       return strtolower( $val ) == 'on'
-               || strtolower( $val ) == 'true'
-               || strtolower( $val ) == 'yes'
+       return $val == 'on'
+               || $val == 'true'
+               || $val == 'yes'
                || preg_match( "/^\s*[+-]?0*[1-9]/", $val ); // approx C atoi() function
 }
 
@@ -2677,19 +2611,19 @@ function wfIniGetBool( $setting ) {
  * @return Bool - Whether or not the extension is loaded
  */
 function wfDl( $extension, $fileName = null ) {
-       if( extension_loaded( $extension ) ) {
+       if ( extension_loaded( $extension ) ) {
                return true;
        }
 
        $canDl = false;
-       if( PHP_SAPI == 'cli' || PHP_SAPI == 'cgi' || PHP_SAPI == 'embed' ) {
+       if ( PHP_SAPI == 'cli' || PHP_SAPI == 'cgi' || PHP_SAPI == 'embed' ) {
                $canDl = ( function_exists( 'dl' ) && is_callable( 'dl' )
                && wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ) );
        }
 
-       if( $canDl ) {
+       if ( $canDl ) {
                $fileName = $fileName ? $fileName : $extension;
-               if( wfIsWindows() ) {
+               if ( wfIsWindows() ) {
                        $fileName = 'php_' . $fileName;
                }
                wfSuppressWarnings();
@@ -2764,25 +2698,15 @@ function wfEscapeShellArg() {
 }
 
 /**
- * Execute a shell command, with time and memory limits mirrored from the PHP
- * configuration if supported.
- * @param string $cmd Command line, properly escaped for shell.
- * @param &$retval null|Mixed optional, will receive the program's exit code.
- *                 (non-zero is usually failure)
- * @param array $environ optional environment variables which should be
- *                 added to the executed command environment.
- * @param array $limits optional array with limits(filesize, memory, time, walltime)
- *                 this overwrites the global wgShellMax* limits.
- * @return string collected stdout as a string (trailing newlines stripped)
+ * Check if wfShellExec() is effectively disabled via php.ini config
+ * @return bool|string False or one of (safemode,disabled)
+ * @since 1.22
  */
-function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
-       global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
-               $wgMaxShellWallClockTime, $wgShellCgroup;
-
-       static $disabled;
+function wfShellExecDisabled() {
+       static $disabled = null;
        if ( is_null( $disabled ) ) {
                $disabled = false;
-               if( wfIniGetBool( 'safe_mode' ) ) {
+               if ( wfIniGetBool( 'safe_mode' ) ) {
                        wfDebug( "wfShellExec can't run in safe_mode, PHP's exec functions are too broken.\n" );
                        $disabled = 'safemode';
                } else {
@@ -2795,6 +2719,26 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
                        }
                }
        }
+       return $disabled;
+}
+
+/**
+ * Execute a shell command, with time and memory limits mirrored from the PHP
+ * configuration if supported.
+ * @param string $cmd Command line, properly escaped for shell.
+ * @param &$retval null|Mixed optional, will receive the program's exit code.
+ *                 (non-zero is usually failure)
+ * @param array $environ optional environment variables which should be
+ *                 added to the executed command environment.
+ * @param array $limits optional array with limits(filesize, memory, time, walltime)
+ *                 this overwrites the global wgShellMax* limits.
+ * @return string collected stdout as a string (trailing newlines stripped)
+ */
+function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array() ) {
+       global $IP, $wgMaxShellMemory, $wgMaxShellFileSize, $wgMaxShellTime,
+               $wgMaxShellWallClockTime, $wgShellCgroup;
+
+       $disabled = wfShellExecDisabled();
        if ( $disabled ) {
                $retval = 1;
                return $disabled == 'safemode' ?
@@ -2805,7 +2749,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(), $limits = array
        wfInitShellLocale();
 
        $envcmd = '';
-       foreach( $environ as $k => $v ) {
+       foreach ( $environ as $k => $v ) {
                if ( wfIsWindows() ) {
                        /* Surrounding a set in quotes (method used by wfEscapeShellArg) makes the quotes themselves
                         * appear in the environment variable, so we must use carat escaping as documented in
@@ -2930,7 +2874,7 @@ function wfMerge( $old, $mine, $yours, &$result ) {
        $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
        wfRestoreWarnings();
 
-       if( !$haveDiff3 ) {
+       if ( !$haveDiff3 ) {
                wfDebug( "diff3 not found\n" );
                return false;
        }
@@ -2959,7 +2903,7 @@ function wfMerge( $old, $mine, $yours, &$result ) {
                wfEscapeShellArg( $yourtextName );
        $handle = popen( $cmd, 'r' );
 
-       if( fgets( $handle, 1024 ) ) {
+       if ( fgets( $handle, 1024 ) ) {
                $conflict = true;
        } else {
                $conflict = false;
@@ -3011,7 +2955,7 @@ function wfDiff( $before, $after, $params = '-u' ) {
 
        # This check may also protect against code injection in
        # case of broken installations.
-       if( !$haveDiff ) {
+       if ( !$haveDiff ) {
                wfDebug( "diff executable not found\n" );
                $diffs = new Diff( explode( "\n", $before ), explode( "\n", $after ) );
                $format = new UnifiedDiffFormatter();
@@ -3125,7 +3069,7 @@ function wfBaseName( $path, $suffix = '' ) {
                ? ''
                : ( '(?:' . preg_quote( $suffix, '#' ) . ')?' );
        $matches = array();
-       if( preg_match( "#([^/\\\\]*?){$encSuffix}[/\\\\]*$#", $path, $matches ) ) {
+       if ( preg_match( "#([^/\\\\]*?){$encSuffix}[/\\\\]*$#", $path, $matches ) ) {
                return $matches[1];
        } else {
                return '';
@@ -3153,21 +3097,21 @@ function wfRelativePath( $path, $from ) {
        $pieces = explode( DIRECTORY_SEPARATOR, dirname( $path ) );
        $against = explode( DIRECTORY_SEPARATOR, $from );
 
-       if( $pieces[0] !== $against[0] ) {
+       if ( $pieces[0] !== $against[0] ) {
                // Non-matching Windows drive letters?
                // Return a full path.
                return $path;
        }
 
        // Trim off common prefix
-       while( count( $pieces ) && count( $against )
+       while ( count( $pieces ) && count( $against )
                && $pieces[0] == $against[0] ) {
                array_shift( $pieces );
                array_shift( $against );
        }
 
        // relative dots to bump us to the parent
-       while( count( $against ) ) {
+       while ( count( $against ) ) {
                array_unshift( $pieces, '..' );
                array_shift( $against );
        }
@@ -3206,7 +3150,7 @@ function wfDoUpdates( $commit = '' ) {
  */
 function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = true, $engine = 'auto' ) {
        $input = (string)$input;
-       if(
+       if (
                $sourceBase < 2 ||
                $sourceBase > 36 ||
                $destBase < 2 ||
@@ -3219,7 +3163,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
                return false;
        }
 
-       static $baseChars = array (
+       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',
@@ -3234,39 +3178,39 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
                'u' => 30, 'v' => 31, 'w' => 32, 'x' => 33, 'y' => 34, 'z' => 35
        );
 
-       if( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
+       if ( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
                $result = gmp_strval( gmp_init( $input, $sourceBase ), $destBase );
-       } elseif( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
+       } elseif ( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
                $decimal = '0';
-               foreach( str_split( strtolower( $input ) ) as $char ) {
+               foreach ( str_split( strtolower( $input ) ) as $char ) {
                        $decimal = bcmul( $decimal, $sourceBase );
                        $decimal = bcadd( $decimal, $baseChars[$char] );
                }
 
-               for( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
+               for ( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
                        $result .= $baseChars[bcmod( $decimal, $destBase )];
                }
 
                $result = strrev( $result );
        } else {
                $inDigits = array();
-               foreach( str_split( strtolower( $input ) ) as $char ) {
+               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 ) {
+               while ( $inDigits ) {
                        $work = 0;
                        $workDigits = array();
 
                        // Long division...
-                       foreach( $inDigits as $digit ) {
+                       foreach ( $inDigits as $digit ) {
                                $work *= $sourceBase;
                                $work += $digit;
 
-                               if( $workDigits || $work >= $destBase ) {
+                               if ( $workDigits || $work >= $destBase ) {
                                        $workDigits[] = (int) ( $work / $destBase );
                                }
                                $work %= $destBase;
@@ -3283,7 +3227,7 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1, $lowercase = t
                $result = strrev( $result );
        }
 
-       if( !$lowercase ) {
+       if ( !$lowercase ) {
                $result = strtoupper( $result );
        }
 
@@ -3309,9 +3253,9 @@ function wfCreateObject( $name, $p ) {
 function wfHttpOnlySafe() {
        global $wgHttpOnlyBlacklist;
 
-       if( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
-               foreach( $wgHttpOnlyBlacklist as $regex ) {
-                       if( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
+       if ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) {
+               foreach ( $wgHttpOnlyBlacklist as $regex ) {
+                       if ( preg_match( $regex, $_SERVER['HTTP_USER_AGENT'] ) ) {
                                return false;
                        }
                }
@@ -3338,7 +3282,7 @@ function wfCheckEntropy() {
  */
 function wfFixSessionID() {
        // If the cookie or session id is already set we already have a session and should abort
-       if ( isset( $_COOKIE[ session_name() ] ) || session_id() ) {
+       if ( isset( $_COOKIE[session_name()] ) || session_id() ) {
                return;
        }
 
@@ -3363,9 +3307,9 @@ function wfFixSessionID() {
 function wfSetupSession( $sessionId = false ) {
        global $wgSessionsInMemcached, $wgSessionsInObjectCache, $wgCookiePath, $wgCookieDomain,
                        $wgCookieSecure, $wgCookieHttpOnly, $wgSessionHandler;
-       if( $wgSessionsInObjectCache || $wgSessionsInMemcached ) {
+       if ( $wgSessionsInObjectCache || $wgSessionsInMemcached ) {
                ObjectCacheSessionHandler::install();
-       } elseif( $wgSessionHandler && $wgSessionHandler != ini_get( 'session.save_handler' ) ) {
+       } elseif ( $wgSessionHandler && $wgSessionHandler != ini_get( 'session.save_handler' ) ) {
                # Only set this if $wgSessionHandler isn't null and session.save_handler
                # hasn't already been set to the desired value (that causes errors)
                ini_set( 'session.save_handler', $wgSessionHandler );
@@ -3588,7 +3532,7 @@ function wfScript( $script = 'index' ) {
        global $wgScriptPath, $wgScriptExtension, $wgScript, $wgLoadScript;
        if ( $script === 'index' ) {
                return $wgScript;
-       } else if ( $script === 'load' ) {
+       } elseif ( $script === 'load' ) {
                return $wgLoadScript;
        } else {
                return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
@@ -3601,7 +3545,7 @@ function wfScript( $script = 'index' ) {
  * @return string script URL
  */
 function wfGetScriptUrl() {
-       if( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+       if ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
                #
                # as it was called, minus the query string.
                #
@@ -3649,15 +3593,22 @@ function wfGetNull() {
  *
  * @param $maxLag Integer (deprecated)
  * @param $wiki mixed Wiki identifier accepted by wfGetLB
+ * @param $cluster string cluster name accepted by LBFactory
  */
-function wfWaitForSlaves( $maxLag = false, $wiki = false ) {
-       $lb = wfGetLB( $wiki );
+function wfWaitForSlaves( $maxLag = false, $wiki = false, $cluster = false ) {
+       $lb = ( $cluster !== false )
+               ? wfGetLBFactory()->getExternalLB( $cluster )
+               : wfGetLB( $wiki );
        // bug 27975 - Don't try to wait for slaves if there are none
        // Prevents permission error when getting master position
        if ( $lb->getServerCount() > 1 ) {
-               $dbw = $lb->getConnection( DB_MASTER );
+               $dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
                $pos = $dbw->getMasterPos();
-               $lb->waitForAll( $pos );
+               // The DBMS may not support getMasterPos() or the whole
+               // load balancer might be fake (e.g. $wgAllDBsAreLocalhost).
+               if ( $pos !== false ) {
+                       $lb->waitForAll( $pos );
+               }
        }
 }
 
@@ -3739,9 +3690,9 @@ function wfStripIllegalFilenameChars( $name ) {
 function wfMemoryLimit() {
        global $wgMemoryLimit;
        $memlimit = wfShorthandToInteger( ini_get( 'memory_limit' ) );
-       if( $memlimit != -1 ) {
+       if ( $memlimit != -1 ) {
                $conflimit = wfShorthandToInteger( $wgMemoryLimit );
-               if( $conflimit == -1 ) {
+               if ( $conflimit == -1 ) {
                        wfDebug( "Removing PHP's memory limit\n" );
                        wfSuppressWarnings();
                        ini_set( 'memory_limit', $conflimit );
@@ -3766,12 +3717,12 @@ function wfMemoryLimit() {
  */
 function wfShorthandToInteger( $string = '' ) {
        $string = trim( $string );
-       if( $string === '' ) {
+       if ( $string === '' ) {
                return -1;
        }
        $last = $string[strlen( $string ) - 1];
        $val = intval( $string );
-       switch( $last ) {
+       switch ( $last ) {
                case 'g':
                case 'G':
                        $val *= 1024;
@@ -3801,7 +3752,7 @@ function wfBCP47( $code ) {
        foreach ( $codeSegment as $segNo => $seg ) {
                if ( count( $codeSegment ) > 0 ) {
                        // when previous segment is x, it is a private segment and should be lc
-                       if( $segNo > 0 && strtolower( $codeSegment[( $segNo - 1 )] ) == 'x' ) {
+                       if ( $segNo > 0 && strtolower( $codeSegment[( $segNo - 1 )] ) == 'x' ) {
                                $codeBCP[$segNo] = strtolower( $seg );
                        // ISO 3166 country code
                        } elseif ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) ) {
@@ -3879,7 +3830,7 @@ function wfGetLangConverterCacheStorage() {
  * @param array $args parameters passed to hook functions
  * @return Boolean True if no handler aborted the hook
  */
-function wfRunHooks( $event, $args = array() ) {
+function wfRunHooks( $event, array $args = array() ) {
        return Hooks::run( $event, $args );
 }
 
@@ -3897,7 +3848,7 @@ function wfRunHooks( $event, $args = array() ) {
  * @throws MWException if $data not long enough, or if unpack fails
  * @return array Associative array of the extracted data
  */
-function wfUnpack( $format, $data, $length=false ) {
+function wfUnpack( $format, $data, $length = false ) {
        if ( $length !== false ) {
                $realLen = strlen( $data );
                if ( $realLen < $length ) {
@@ -3939,19 +3890,19 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
 
        # Handle redirects
        $redirectTitle = RepoGroup::singleton()->checkRedirect( Title::makeTitle( NS_FILE, $name ) );
-       if( $redirectTitle ) {
-               $name = $redirectTitle->getDbKey();
+       if ( $redirectTitle ) {
+               $name = $redirectTitle->getDBkey();
        }
 
        # Run the extension hook
        $bad = false;
-       if( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) {
+       if ( !wfRunHooks( 'BadImage', array( $name, &$bad ) ) ) {
                wfProfileOut( __METHOD__ );
                return $bad;
        }
 
        $cacheable = ( $blacklist === null );
-       if( $cacheable && $badImageCache !== null ) {
+       if ( $cacheable && $badImageCache !== null ) {
                $badImages = $badImageCache;
        } else { // cache miss
                if ( $blacklist === null ) {
@@ -3960,7 +3911,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
                # Build the list now
                $badImages = array();
                $lines = explode( "\n", $blacklist );
-               foreach( $lines as $line ) {
+               foreach ( $lines as $line ) {
                        # List items only
                        if ( substr( $line, 0, 1 ) !== '*' ) {
                                continue;
index 6863973..33e447e 100644 (file)
@@ -83,9 +83,8 @@
  * $form = new HTMLForm( $someFields );
  * $form->setMethod( 'get' )
  *      ->setWrapperLegendMsg( 'message-key' )
- *      ->suppressReset()
  *      ->prepareForm()
- *      ->displayForm();
+ *      ->displayForm( '' );
  * @endcode
  * Note that you will have prepareForm and displayForm at the end. Other
  * methods call done after that would simply not be part of the form :(
@@ -95,7 +94,7 @@
 class HTMLForm extends ContextSource {
 
        // A mapping of 'type' inputs onto standard HTMLFormField subclasses
-       static $typeMappings = array(
+       private static $typeMappings = array(
                'api' => 'HTMLApiField',
                'text' => 'HTMLTextField',
                'textarea' => 'HTMLTextAreaField',
@@ -128,6 +127,7 @@ class HTMLForm extends ContextSource {
 
        protected $mFieldTree;
        protected $mShowReset = false;
+       protected $mShowSubmit = true;
        public $mFieldData;
 
        protected $mSubmitCallback;
@@ -140,6 +140,7 @@ class HTMLForm extends ContextSource {
        protected $mSectionFooters = array();
        protected $mPost = '';
        protected $mId;
+       protected $mTableId = '';
 
        protected $mSubmitID;
        protected $mSubmitName;
@@ -200,12 +201,12 @@ class HTMLForm extends ContextSource {
                        $this->setContext( $context );
                        $this->mTitle = false; // We don't need them to set a title
                        $this->mMessagePrefix = $messagePrefix;
-               } else {
+               } elseif ( is_null( $context ) && $messagePrefix !== '' ) {
+                       $this->mMessagePrefix = $messagePrefix;
+               } elseif ( is_string( $context ) && $messagePrefix === '' ) {
                        // B/C since 1.18
-                       if ( is_string( $context ) && $messagePrefix === '' ) {
-                               // it's actually $messagePrefix
-                               $this->mMessagePrefix = $context;
-                       }
+                       // it's actually $messagePrefix
+                       $this->mMessagePrefix = $context;
                }
 
                // Expand out into a tree.
@@ -256,7 +257,7 @@ class HTMLForm extends ContextSource {
         */
        public function setDisplayFormat( $format ) {
                if ( !in_array( $format, $this->availableDisplayFormats ) ) {
-                       throw new MWException ( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
+                       throw new MWException( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
                }
                $this->displayFormat = $format;
                return $this;
@@ -276,7 +277,9 @@ class HTMLForm extends ContextSource {
         * done already.
         * @deprecated since 1.18 load modules with ResourceLoader instead
         */
-       static function addJS() { wfDeprecated( __METHOD__, '1.18' ); }
+       static function addJS() {
+               wfDeprecated( __METHOD__, '1.18' );
+       }
 
        /**
         * Initialise a new Object for the field
@@ -585,8 +588,8 @@ class HTMLForm extends ContextSource {
        }
 
        /**
-        * Display the form (sending to $wgOut), with an appropriate error
-        * message or stack of messages, and any validation errors, etc.
+        * Display the form (sending to the context's OutputPage object), with an
+        * appropriate error message or stack of messages, and any validation errors, etc.
         *
         * @attention You should call prepareForm() before calling this function.
         * Moreover, when doing method chaining this should be the very last method
@@ -683,23 +686,26 @@ class HTMLForm extends ContextSource {
         */
        function getButtons() {
                $html = '';
-               $attribs = array();
 
-               if ( isset( $this->mSubmitID ) ) {
-                       $attribs['id'] = $this->mSubmitID;
-               }
+               if ( $this->mShowSubmit ) {
+                       $attribs = array();
 
-               if ( isset( $this->mSubmitName ) ) {
-                       $attribs['name'] = $this->mSubmitName;
-               }
+                       if ( isset( $this->mSubmitID ) ) {
+                               $attribs['id'] = $this->mSubmitID;
+                       }
 
-               if ( isset( $this->mSubmitTooltip ) ) {
-                       $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
-               }
+                       if ( isset( $this->mSubmitName ) ) {
+                               $attribs['name'] = $this->mSubmitName;
+                       }
 
-               $attribs['class'] = 'mw-htmlform-submit';
+                       if ( isset( $this->mSubmitTooltip ) ) {
+                               $attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
+                       }
 
-               $html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+                       $attribs['class'] = 'mw-htmlform-submit';
+
+                       $html .= Xml::submitButton( $this->getSubmitText(), $attribs ) . "\n";
+               }
 
                if ( $this->mShowReset ) {
                        $html .= Html::element(
@@ -737,7 +743,7 @@ class HTMLForm extends ContextSource {
         * @return String
         */
        function getBody() {
-               return $this->displaySection( $this->mFieldTree );
+               return $this->displaySection( $this->mFieldTree, $this->mTableId );
        }
 
        /**
@@ -851,6 +857,33 @@ class HTMLForm extends ContextSource {
                return $this;
        }
 
+       /**
+        * Stop a default submit button being shown for this form. This implies that an
+        * alternate submit method must be provided manually.
+        *
+        * @since 1.22
+        *
+        * @param bool $suppressSubmit Set to false to re-enable the button again
+        *
+        * @return HTMLForm $this for chaining calls
+        */
+       function suppressDefaultSubmit( $suppressSubmit = true ) {
+               $this->mShowSubmit = !$suppressSubmit;
+               return $this;
+       }
+
+       /**
+        * Set the id of the \<table\> or outermost \<div\> element.
+        *
+        * @since 1.22
+        * @param string $id new value of the id attribute, or "" to remove
+        * @return HTMLForm $this for chaining calls
+        */
+       public function setTableId( $id ) {
+               $this->mTableId = $id;
+               return $this;
+       }
+
        /**
         * @param string $id DOM id for the form
         * @return HTMLForm $this for chaining calls (since 1.20)
@@ -859,6 +892,7 @@ class HTMLForm extends ContextSource {
                $this->mId = $id;
                return $this;
        }
+
        /**
         * Prompt the whole form to be wrapped in a "<fieldset>", with
         * this text as its "<legend>" element.
@@ -957,7 +991,7 @@ class HTMLForm extends ContextSource {
                                        $hasLabel = true;
                                }
                        } elseif ( is_array( $value ) ) {
-                               $section = $this->displaySection( $value, $key, "$fieldsetIDPrefix$key-" );
+                               $section = $this->displaySection( $value, "mw-htmlform-$key", "$fieldsetIDPrefix$key-" );
                                $legend = $this->getLegend( $key );
                                if ( isset( $this->mSectionHeaders[$key] ) ) {
                                        $section = $this->mSectionHeaders[$key] . $section;
@@ -985,7 +1019,7 @@ class HTMLForm extends ContextSource {
                        );
 
                        if ( $sectionName ) {
-                               $attribs['id'] = Sanitizer::escapeId( "mw-htmlform-$sectionName" );
+                               $attribs['id'] = Sanitizer::escapeId( $sectionName );
                        }
 
                        if ( $displayFormat === 'table' ) {
@@ -1073,7 +1107,6 @@ class HTMLForm extends ContextSource {
                $this->mAction = $action;
                return $this;
        }
-
 }
 
 /**
@@ -1091,6 +1124,12 @@ abstract class HTMLFormField {
        protected $mClass = '';
        protected $mDefault;
 
+       /**
+        * @var bool If true will generate an empty div element with no label
+        * @since 1.22
+        */
+       protected $mShowEmptyLabels = true;
+
        /**
         * @var HTMLForm
         */
@@ -1183,6 +1222,8 @@ abstract class HTMLFormField {
        /**
         * Initialise the object
         * @param array $params Associative Array. See HTMLForm doc for syntax.
+        *
+        * @since 1.22 The 'label' attribute no longer accepts raw HTML, use 'label-raw' instead
         * @throws MWException
         */
        function __construct( $params ) {
@@ -1201,7 +1242,14 @@ abstract class HTMLFormField {
 
                        $this->mLabel = wfMessage( $msg, $msgInfo )->parse();
                } elseif ( isset( $params['label'] ) ) {
-                       $this->mLabel = $params['label'];
+                       if ( $params['label'] === '&#160;' ) {
+                               // Apparently some things set &nbsp directly and in an odd format
+                               $this->mLabel = '&#160;';
+                       } else {
+                               $this->mLabel = htmlspecialchars( $params['label'] );
+                       }
+               } elseif ( isset( $params['label-raw'] ) ) {
+                       $this->mLabel = $params['label-raw'];
                }
 
                $this->mName = "wp{$params['fieldname']}";
@@ -1246,6 +1294,10 @@ abstract class HTMLFormField {
                if ( isset( $params['flatlist'] ) ) {
                        $this->mClass .= ' mw-htmlform-flatlist';
                }
+
+               if ( isset( $params['hidelabel'] ) ) {
+                       $this->mShowEmptyLabels = false;
+               }
        }
 
        /**
@@ -1306,9 +1358,14 @@ abstract class HTMLFormField {
                $cellAttributes = array();
                $label = $this->getLabelHtml( $cellAttributes );
 
+               $outerDivClass = array(
+                       'mw-input',
+                       'mw-htmlform-nolabel' => ( $label === '' )
+               );
+
                $field = Html::rawElement(
                        'div',
-                       array( 'class' => 'mw-input' ) + $cellAttributes,
+                       array( 'class' => $outerDivClass ) + $cellAttributes,
                        $inputHtml . "\n$errors"
                );
                $html = Html::rawElement( 'div',
@@ -1437,7 +1494,7 @@ abstract class HTMLFormField {
        }
 
        function getLabel() {
-               return $this->mLabel;
+               return is_null( $this->mLabel ) ? '' : $this->mLabel;
        }
 
        function getLabelHtml( $cellAttributes = array() ) {
@@ -1449,20 +1506,32 @@ abstract class HTMLFormField {
                        $for['for'] = $this->mID;
                }
 
+               $labelValue = trim( $this->getLabel() );
+               $hasLabel = false;
+               if ( $labelValue !== '&#160;' && $labelValue !== '' ) {
+                       $hasLabel = true;
+               }
+
                $displayFormat = $this->mParent->getDisplayFormat();
-               $labelElement = Html::rawElement( 'label', $for, $this->getLabel() );
+               $html = '';
 
-               if ( $displayFormat == 'table' ) {
-                       return Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
-                               Html::rawElement( 'label', $for, $this->getLabel() )
-                       );
-               } elseif ( $displayFormat == 'div' ) {
-                       return Html::rawElement( 'div', array( 'class' => 'mw-label' ) + $cellAttributes,
-                               Html::rawElement( 'label', $for, $this->getLabel() )
+               if ( $displayFormat === 'table' ) {
+                       $html = Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
+                               Html::rawElement( 'label', $for, $labelValue )
                        );
-               } else {
-                       return $labelElement;
+               } elseif ( $hasLabel || $this->mShowEmptyLabels ) {
+                       if ( $displayFormat === 'div' ) {
+                               $html = Html::rawElement(
+                                       'div',
+                                       array( 'class' => 'mw-label' ) + $cellAttributes,
+                                       Html::rawElement( 'label', $for, $labelValue )
+                               );
+                       } else {
+                               $html = Html::rawElement( 'label', $for, $labelValue );
+                       }
                }
+
+               return $html;
        }
 
        function getDefault() {
@@ -1602,16 +1671,19 @@ class HTMLTextField extends HTMLFormField {
        }
 }
 class HTMLTextAreaField extends HTMLFormField {
+       const DEFAULT_COLS = 80;
+       const DEFAULT_ROWS = 25;
+
        function getCols() {
                return isset( $this->mParams['cols'] )
                        ? $this->mParams['cols']
-                       : 80;
+                       : static::DEFAULT_COLS;
        }
 
        function getRows() {
                return isset( $this->mParams['rows'] )
                        ? $this->mParams['rows']
-                       : 25;
+                       : static::DEFAULT_ROWS;
        }
 
        function getInputHTML( $value ) {
@@ -1786,9 +1858,39 @@ class HTMLCheckField extends HTMLFormField {
  * A checkbox matrix
  * Operates similarly to HTMLMultiSelectField, but instead of using an array of
  * options, uses an array of rows and an array of columns to dynamically
- * construct a matrix of options.
+ * construct a matrix of options. The tags used to identify a particular cell
+ * are of the form "columnName-rowName"
+ *
+ * Options:
+ *   - columns
+ *     - Required list of columns in the matrix.
+ *   - rows
+ *     - Required list of rows in the matrix.
+ *   - force-options-on
+ *     - Accepts array of column-row tags to be displayed as enabled but unavailable to change
+ *   - force-options-off
+ *     - Accepts array of column-row tags to be displayed as disabled but unavailable to change.
+ *   - tooltips
+ *     - Optional array mapping row label to tooltip content
+ *   - tooltip-class
+ *     - Optional CSS class used on tooltip container span. Defaults to mw-icon-question.
  */
-class HTMLCheckMatrix extends HTMLFormField {
+class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
+
+       static private $requiredParams = array(
+               // Required by underlying HTMLFormField
+               'fieldname',
+               // Required by HTMLCheckMatrix
+               'rows', 'columns'
+       );
+
+       public function __construct( $params ) {
+               $missing = array_diff( self::$requiredParams, array_keys( $params ) );
+               if ( $missing ) {
+                       throw HTMLFormFieldRequiredOptionsException::create( $this, $missing );
+               }
+               parent::__construct( $params );
+       }
 
        function validate( $value, $alldata ) {
                $rows = $this->mParams['rows'];
@@ -1848,27 +1950,42 @@ class HTMLCheckMatrix extends HTMLFormField {
                }
                $tableContents .= Html::rawElement( 'tr', array(), "\n$headerContents\n" );
 
+               $tooltipClass = 'mw-icon-question';
+               if ( isset( $this->mParams['tooltip-class'] ) ) {
+                       $tooltipClass = $this->mParams['tooltip-class'];
+               }
+
                // Build the options matrix
                foreach ( $rows as $rowLabel => $rowTag ) {
+                       // Append tooltip if configured
+                       if ( isset( $this->mParams['tooltips'][$rowLabel] ) ) {
+                               $tooltipAttribs = array(
+                                       'class' => "mw-htmlform-tooltip $tooltipClass",
+                                       'title' =>  $this->mParams['tooltips'][$rowLabel],
+                               );
+                               $rowLabel .= ' ' . Html::element( 'span', $tooltipAttribs, '' );
+                       }
                        $rowContents = Html::rawElement( 'td', array(), $rowLabel );
                        foreach ( $columns as $columnTag ) {
-                               // Knock out any options that are not wanted
-                               if ( isset( $this->mParams['remove-options'] )
-                                       && in_array( "$columnTag-$rowTag", $this->mParams['remove-options'] ) )
-                               {
-                                       $rowContents .= Html::rawElement( 'td', array(), '&#160;' );
-                               } else {
-                                       // Construct the checkbox
-                                       $thisAttribs = array(
-                                               'id' => "{$this->mID}-$columnTag-$rowTag",
-                                               'value' => $columnTag . '-' . $rowTag
-                                       );
-                                       $checkbox = Xml::check(
-                                               $this->mName . '[]',
-                                               in_array( $columnTag . '-' . $rowTag, (array)$value, true ),
-                                               $attribs + $thisAttribs );
-                                       $rowContents .= Html::rawElement( 'td', array(), $checkbox );
+                               $thisTag = "$columnTag-$rowTag";
+                               // Construct the checkbox
+                               $thisAttribs = array(
+                                       'id' => "{$this->mID}-$thisTag",
+                                       'value' => $thisTag,
+                               );
+                               $checked = in_array( $thisTag, (array)$value, true );
+                               if ( $this->isTagForcedOff( $thisTag ) ) {
+                                       $checked = false;
+                                       $thisAttribs['disabled'] = 1;
+                               } elseif ( $this->isTagForcedOn( $thisTag ) ) {
+                                       $checked = true;
+                                       $thisAttribs['disabled'] = 1;
                                }
+                               $rowContents .= Html::rawElement(
+                                       'td',
+                                       array(),
+                                       Xml::check( "{$this->mName}[]", $checked, $attribs + $thisAttribs )
+                               );
                        }
                        $tableContents .= Html::rawElement( 'tr', array(), "\n$rowContents\n" );
                }
@@ -1880,6 +1997,16 @@ class HTMLCheckMatrix extends HTMLFormField {
                return $html;
        }
 
+       protected function isTagForcedOff( $tag ) {
+               return isset( $this->mParams['force-options-off'] )
+                       && in_array( $tag, $this->mParams['force-options-off'] );
+       }
+
+       protected function isTagForcedOn( $tag ) {
+               return isset( $this->mParams['force-options-on'] )
+                       && in_array( $tag, $this->mParams['force-options-on'] );
+       }
+
        /**
         * Get the complete table row for the input, including help text,
         * labels, and whatever.
@@ -1944,6 +2071,27 @@ class HTMLCheckMatrix extends HTMLFormField {
                        return array();
                }
        }
+
+       function filterDataForSubmit( $data ) {
+               $columns = HTMLFormField::flattenOptions( $this->mParams['columns'] );
+               $rows = HTMLFormField::flattenOptions( $this->mParams['rows'] );
+               $res = array();
+               foreach ( $columns as $column ) {
+                       foreach ( $rows as $row ) {
+                               // Make sure option hasn't been forced
+                               $thisTag = "$column-$row";
+                               if ( $this->isTagForcedOff( $thisTag ) ) {
+                                       $res[$thisTag] = false;
+                               } elseif ( $this->isTagForcedOn( $thisTag ) ) {
+                                       $res[$thisTag] = true;
+                               } else {
+                                       $res[$thisTag] = in_array( $thisTag, $data );
+                               }
+                       }
+               }
+
+               return $res;
+       }
 }
 
 /**
@@ -1959,10 +2107,11 @@ class HTMLSelectField extends HTMLFormField {
 
                $validOptions = HTMLFormField::flattenOptions( $this->mParams['options'] );
 
-               if ( in_array( $value, $validOptions ) )
+               if ( in_array( $value, $validOptions ) ) {
                        return true;
-               else
+               } else {
                        return $this->msg( 'htmlform-select-badoption' )->parse();
+               }
        }
 
        function getInputHTML( $value ) {
@@ -1996,7 +2145,6 @@ class HTMLSelectField extends HTMLFormField {
  * Select dropdown field, with an additional "other" textbox.
  */
 class HTMLSelectOrOtherField extends HTMLTextField {
-       static $jsAdded = false;
 
        function __construct( $params ) {
                if ( !in_array( 'other', $params['options'], true ) ) {
@@ -2085,7 +2233,7 @@ class HTMLSelectOrOtherField extends HTMLTextField {
 /**
  * Multi-select field
  */
-class HTMLMultiSelectField extends HTMLFormField {
+class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable {
 
        function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
@@ -2178,6 +2326,17 @@ class HTMLMultiSelectField extends HTMLFormField {
                }
        }
 
+       function filterDataForSubmit( $data ) {
+               $options = HTMLFormField::flattenOptions( $this->mParams['options'] );
+
+               $res = array();
+               foreach ( $options as $opt ) {
+                       $res["$opt"] = in_array( $opt, $data );
+               }
+
+               return $res;
+       }
+
        protected function needsLabel() {
                return false;
        }
@@ -2512,14 +2671,28 @@ class HTMLHiddenField extends HTMLFormField {
                return $this->getTableRow( $value );
        }
 
-       public function getInputHTML( $value ) { return ''; }
+       public function getInputHTML( $value ) {
+               return '';
+       }
 }
 
 /**
  * Add a submit button inline in the form (as opposed to
  * HTMLForm::addButton(), which will add it at the end).
  */
-class HTMLSubmitField extends HTMLFormField {
+class HTMLSubmitField extends HTMLButtonField {
+       protected $buttonType = 'submit';
+}
+
+/**
+ * Adds a generic button inline to the form. Does not do anything, you must add
+ * click handling code in JavaScript. Use a HTMLSubmitField if you merely
+ * wish to add a submit button to a form.
+ *
+ * @since 1.22
+ */
+class HTMLButtonField extends HTMLFormField {
+       protected $buttonType = 'button';
 
        public function __construct( $info ) {
                $info['nodata'] = true;
@@ -2527,13 +2700,20 @@ class HTMLSubmitField extends HTMLFormField {
        }
 
        public function getInputHTML( $value ) {
-               return Xml::submitButton(
+               $attr = array(
+                       'class' => 'mw-htmlform-submit ' . $this->mClass,
+                       'id' => $this->mID,
+               );
+
+               if ( !empty( $this->mParams['disabled'] ) ) {
+                       $attr['disabled'] = 'disabled';
+               }
+
+               return Html::input(
+                       $this->mName,
                        $value,
-                       array(
-                               'class' => 'mw-htmlform-submit ' . $this->mClass,
-                               'name' => $this->mName,
-                               'id' => $this->mID,
-                       )
+                       $this->buttonType,
+                       $attr
                );
        }
 
@@ -2612,3 +2792,22 @@ class HTMLApiField extends HTMLFormField {
                return '';
        }
 }
+
+interface HTMLNestedFilterable {
+       /**
+        * Support for seperating multi-option preferences into multiple preferences
+        * Due to lack of array support.
+        * @param $data array
+        */
+       function filterDataForSubmit( $data );
+}
+
+class HTMLFormFieldRequiredOptionsException extends MWException {
+       static public function create( HTMLFormField $field, array $missing ) {
+               return new self( sprintf(
+                       "Form type `%s` expected the following parameters to be set: %s",
+                       get_class( $field ),
+                       implode( ', ', $missing )
+               ) );
+       }
+}
diff --git a/includes/HashRing.php b/includes/HashRing.php
new file mode 100644 (file)
index 0000000..cd39ad8
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Convenience class for weighted consistent hash rings.
+ *
+ * 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
+ */
+
+/**
+ * Convenience class for weighted consistent hash rings
+ *
+ * @since 1.22
+ */
+class HashRing {
+       /** @var Array (location => (start, end)) */
+       protected $ring = array();
+
+       const RING_SIZE = 268435456; // 2^28
+
+       /**
+        * @param array $map (location => weight)
+        */
+       public function __construct( array $map ) {
+               $map = array_filter( $map, function( $w ) { return $w > 0; } );
+               if ( !count( $map ) ) {
+                       throw new MWException( "Ring is empty or all weights are zero." );
+               }
+               // Sort the locations based on the hash of their names
+               $hashes = array();
+               foreach ( $map as $location => $weight ) {
+                       $hashes[$location] = sha1( $location );
+               }
+               uksort( $map, function ( $a, $b ) use ( $hashes ) {
+                       return strcmp( $hashes[$a], $hashes[$b] );
+               } );
+               // Fit the map to weight-proportionate one with a space of size RING_SIZE
+               $sum = array_sum( $map );
+               $standardMap = array();
+               foreach ( $map as $location => $weight ) {
+                       $standardMap[$location] = (int)floor( $weight / $sum * self::RING_SIZE );
+               }
+               // Build a ring of RING_SIZE spots, with each location at a spot in location hash order
+               $index = 0;
+               foreach ( $standardMap as $location => $weight ) {
+                       // Location covers half-closed interval [$index,$index + $weight)
+                       $this->ring[$location] = array( $index, $index + $weight );
+                       $index += $weight;
+               }
+               // Make sure the last location covers what is left
+               end( $this->ring );
+               $this->ring[key( $this->ring )][1] = self::RING_SIZE;
+       }
+
+       /**
+        * Get the location of an item on the ring
+        *
+        * @param string $item
+        * @return string Location
+        */
+       public function getLocation( $item ) {
+               $locations = $this->getLocations( $item, 1 );
+               return $locations[0];
+       }
+
+       /**
+        * Get the location of an item on the ring, as well as the next clockwise locations
+        *
+        * @param string $item
+        * @param integer $limit Maximum number of locations to return
+        * @return array List of locations
+        */
+       public function getLocations( $item, $limit ) {
+               $locations = array();
+               $primaryLocation = null;
+               $spot = hexdec( substr( sha1( $item ), 0, 7 ) ); // first 28 bits
+               foreach ( $this->ring as $location => $range ) {
+                       if ( count( $locations ) >= $limit ) {
+                               break;
+                       }
+                       // The $primaryLocation is the location the item spot is in.
+                       // After that is reached, keep appending the next locations.
+                       if ( ( $range[0] <= $spot && $spot < $range[1] ) || $primaryLocation !== null ) {
+                               if ( $primaryLocation === null ) {
+                                       $primaryLocation = $location;
+                               }
+                               $locations[] = $location;
+                       }
+               }
+               // If more locations are requested, wrap-around and keep adding them
+               reset( $this->ring );
+               while ( count( $locations ) < $limit ) {
+                       list( $location, ) = each( $this->ring );
+                       if ( $location === $primaryLocation ) {
+                               break; // don't go in circles
+                       }
+                       $locations[] = $location;
+               }
+               return $locations;
+       }
+}
index 1af733a..46cf238 100644 (file)
@@ -143,7 +143,7 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
         * Compress the bulk data in the object
         */
        public function compress() {
-               if ( !$this->mCompressed  ) {
+               if ( !$this->mCompressed ) {
                        $this->mItems = gzdeflate( serialize( $this->mItems ) );
                        $this->mCompressed = true;
                }
@@ -231,16 +231,16 @@ class HistoryBlobStub {
         * @return string
         */
        function getText() {
-               if( isset( self::$blobCache[$this->mOldId] ) ) {
+               if ( isset( self::$blobCache[$this->mOldId] ) ) {
                        $obj = self::$blobCache[$this->mOldId];
                } else {
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow( 'text', array( 'old_flags', 'old_text' ), array( 'old_id' => $this->mOldId ) );
-                       if( !$row ) {
+                       if ( !$row ) {
                                return false;
                        }
                        $flags = explode( ',', $row->old_flags );
-                       if( in_array( 'external', $flags ) ) {
+                       if ( in_array( 'external', $flags ) ) {
                                $url = $row->old_text;
                                $parts = explode( '://', $url, 2 );
                                if ( !isset( $parts[1] ) || $parts[1] == '' ) {
@@ -249,11 +249,11 @@ class HistoryBlobStub {
                                $row->old_text = ExternalStore::fetchFromUrl( $url );
 
                        }
-                       if( !in_array( 'object', $flags ) ) {
+                       if ( !in_array( 'object', $flags ) ) {
                                return false;
                        }
 
-                       if( in_array( 'gzip', $flags ) ) {
+                       if ( in_array( 'gzip', $flags ) ) {
                                // This shouldn't happen, but a bug in the compress script
                                // may at times gzip-compress a HistoryBlob object row.
                                $obj = unserialize( gzinflate( $row->old_text ) );
@@ -261,7 +261,7 @@ class HistoryBlobStub {
                                $obj = unserialize( $row->old_text );
                        }
 
-                       if( !is_object( $obj ) ) {
+                       if ( !is_object( $obj ) ) {
                                // Correct for old double-serialization bug.
                                $obj = unserialize( $obj );
                        }
@@ -318,7 +318,7 @@ class HistoryBlobCurStub {
        function getText() {
                $dbr = wfGetDB( DB_SLAVE );
                $row = $dbr->selectRow( 'cur', array( 'cur_text' ), array( 'cur_id' => $this->mCurId ) );
-               if( !$row ) {
+               if ( !$row ) {
                        return false;
                }
                return $row->cur_text;
index 8cc7ace..ed8b3ed 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * A tool for running hook functions.
  *
@@ -37,40 +38,43 @@ class MWHookException extends MWException {}
  */
 class Hooks {
 
+       /**
+        * Array of events mapped to an array of callbacks to be run
+        * when that event is triggered.
+        */
        protected static $handlers = array();
 
        /**
-        * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
-        * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
+        * Attach an event handler to a given hook.
         *
-        * @since 1.21
-        *
-        * @param string $name the name of the hook to clear.
+        * @param string $name Name of hook
+        * @param mixed $callback Callback function to attach
         *
-        * @throws MWException if not in testing mode.
+        * @since 1.18
         */
-       public static function clear( $name ) {
-               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
-                       throw new MWException( 'can not reset hooks in operation.' );
+       public static function register( $name, $callback ) {
+               if ( !isset( self::$handlers[$name] ) ) {
+                       self::$handlers[$name] = array();
                }
 
-               unset( self::$handlers[$name] );
+               self::$handlers[$name][] = $callback;
        }
 
        /**
-        * Attach an event handler to a given hook
+        * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
+        * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
         *
-        * @since 1.18
+        * @param string $name the name of the hook to clear.
         *
-        * @param string $name name of hook
-        * @param $callback Mixed: callback function to attach
+        * @since 1.21
+        * @throws MWException if not in testing mode.
         */
-       public static function register( $name, $callback ) {
-               if( !isset( self::$handlers[$name] ) ) {
-                       self::$handlers[$name] = array();
+       public static function clear( $name ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException( 'Cannot reset hooks in operation.' );
                }
 
-               self::$handlers[$name][] = $callback;
+               unset( self::$handlers[$name] );
        }
 
        /**
@@ -79,216 +83,143 @@ class Hooks {
         *
         * @since 1.18
         *
-        * @param string $name name of hook
-        * @return Boolean: true if the hook has a function registered to it
+        * @param string $name Name of hook
+        * @return bool True if the hook has a function registered to it
         */
        public static function isRegistered( $name ) {
                global $wgHooks;
-
                return !empty( $wgHooks[$name] ) || !empty( self::$handlers[$name] );
        }
 
        /**
         * Returns an array of all the event functions attached to a hook
         * This combines functions registered via Hooks::register and with $wgHooks.
-        * @since 1.18
         *
-        * @throws MWException
-        * @throws FatalError
-        * @param string $name name of the hook
+        * @since 1.18
         *
+        * @param string $name Name of the hook
         * @return array
         */
        public static function getHandlers( $name ) {
                global $wgHooks;
 
-               // Return quickly in the most common case
-               if ( empty( self::$handlers[$name] ) && empty( $wgHooks[$name] ) ) {
+               if ( !self::isRegistered( $name ) ) {
                        return array();
-               }
-
-               if ( !is_array( self::$handlers ) ) {
-                       throw new MWException( "Local hooks array is not an array!\n" );
-               }
-
-               if ( !is_array( $wgHooks ) ) {
-                       throw new MWException( "Global hooks array is not an array!\n" );
-               }
-
-               if ( empty( Hooks::$handlers[$name] ) ) {
-                       $hooks = $wgHooks[$name];
-               } elseif ( empty( $wgHooks[$name] ) ) {
-                       $hooks = Hooks::$handlers[$name];
+               } elseif ( !isset( self::$handlers[$name] ) ) {
+                       return $wgHooks[$name];
+               } elseif ( !isset( $wgHooks[$name] ) ) {
+                       return self::$handlers[$name];
                } else {
-                       // so they are both not empty...
-                       $hooks = array_merge( Hooks::$handlers[$name], $wgHooks[$name] );
+                       return array_merge( self::$handlers[$name], $wgHooks[$name] );
                }
-
-               if ( !is_array( $hooks ) ) {
-                       throw new MWException( "Hooks array for event '$name' is not an array!\n" );
-               }
-
-               return $hooks;
        }
 
        /**
-        * Call hook functions defined in Hooks::register
+        * Call hook functions defined in Hooks::register and $wgHooks.
         *
-        * @param string $event event name
-        * @param $args  Array: parameters passed to hook functions
+        * For a certain hook event, fetch the array of hook events and
+        * process them. Determine the proper callback for each hook and
+        * then call the actual hook using the appropriate arguments.
+        * Finally, process the return value and return/throw accordingly.
+        *
+        * @param string $event Event name
+        * @param array $args  Array of parameters passed to hook functions
+        * @return bool True if no handler aborted the hook
         *
         * @throws MWException
         * @throws FatalError
-        * @return Boolean True if no handler aborted the hook
         */
-       public static function run( $event, $args = array() ) {
-               global $wgHooks;
-
-               // Return quickly in the most common case
-               if ( empty( self::$handlers[$event] ) && empty( $wgHooks[$event] ) ) {
-                       return true;
-               }
-
+       public static function run( $event, array $args = array() ) {
                wfProfileIn( 'hook: ' . $event );
-               $hooks = self::getHandlers( $event );
+               foreach ( self::getHandlers( $event ) as $hook ) {
+                       // Turn non-array values into an array. (Can't use casting because of objects.)
+                       if ( !is_array( $hook ) ) {
+                               $hook = array( $hook );
+                       }
 
-               foreach ( $hooks as $hook ) {
-                       $object = null;
-                       $method = null;
-                       $func = null;
-                       $data = null;
-                       $have_data = false;
-                       $closure = false;
-                       $badhookmsg = false;
+                       if ( !array_filter( $hook ) ) {
+                               // Either array is empty or it's an array filled with null/false/empty.
+                               continue;
+                       } elseif ( is_array( $hook[0] ) ) {
+                               // First element is an array, meaning the developer intended
+                               // the first element to be a callback. Merge it in so that
+                               // processing can be uniform.
+                               $hook = array_merge( $hook[0], array_slice( $hook, 1 ) );
+                       }
 
                        /**
                         * $hook can be: a function, an object, an array of $function and
                         * $data, an array of just a function, an array of object and
                         * method, or an array of object, method, and data.
                         */
-                       if ( is_array( $hook ) ) {
-                               if ( count( $hook ) < 1 ) {
-                                       throw new MWException( 'Empty array in hooks for ' . $event . "\n" );
-                               } elseif ( is_object( $hook[0] ) ) {
-                                       $object = $hook[0];
-                                       if ( $object instanceof Closure ) {
-                                               $closure = true;
-                                               if ( count( $hook ) > 1 ) {
-                                                       $data = $hook[1];
-                                                       $have_data = true;
-                                               }
-                                       } else {
-                                               if ( count( $hook ) < 2 ) {
-                                                       $method = 'on' . $event;
-                                               } else {
-                                                       $method = $hook[1];
-                                                       if ( count( $hook ) > 2 ) {
-                                                               $data = $hook[2];
-                                                               $have_data = true;
-                                                       }
-                                               }
-                                       }
-                               } elseif ( is_string( $hook[0] ) ) {
-                                       $func = $hook[0];
-                                       if ( count( $hook ) > 1) {
-                                               $data = $hook[1];
-                                               $have_data = true;
-                                       }
-                               } else {
-                                       throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
-                               }
-                       } elseif ( is_string( $hook ) ) { # functions look like strings, too
-                               $func = $hook;
-                       } elseif ( is_object( $hook ) ) {
-                               $object = $hook;
-                               if ( $object instanceof Closure ) {
-                                       $closure = true;
-                               } else {
-                                       $method = "on" . $event;
+                       if ( $hook[0] instanceof Closure ) {
+                               $func = "hook-$event-closure";
+                               $callback = array_shift( $hook );
+                       } elseif ( is_object( $hook[0] ) ) {
+                               $object = array_shift( $hook );
+                               $method = array_shift( $hook );
+
+                               // If no method was specified, default to on$event.
+                               if ( $method === null ) {
+                                       $method = "on$event";
                                }
-                       } else {
-                               throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
-                       }
-
-                       /* We put the first data element on, if needed. */
-                       if ( $have_data ) {
-                               $hook_args = array_merge( array( $data ), $args );
-                       } else {
-                               $hook_args = $args;
-                       }
 
-                       if ( $closure ) {
-                               $callback = $object;
-                               $func = "hook-$event-closure";
-                       } elseif ( isset( $object ) ) {
                                $func = get_class( $object ) . '::' . $method;
                                $callback = array( $object, $method );
+                       } elseif ( is_string( $hook[0] ) ) {
+                               $func = $callback = array_shift( $hook );
                        } else {
-                               $callback = $func;
+                               throw new MWException( 'Unknown datatype in hooks for ' . $event . "\n" );
                        }
 
                        // Run autoloader (workaround for call_user_func_array bug)
-                       is_callable( $callback );
+                       // and throw error if not callable.
+                       if ( !is_callable( $callback ) ) {
+                               throw new MWException( 'Invalid callback in hooks for ' . $event . "\n" );
+                       }
 
-                       /**
-                        * Call the hook. The documentation of call_user_func_array clearly
-                        * states that FALSE is returned on failure. However this is not
-                        * case always. In some version of PHP if the function signature
-                        * does not match the call signature, PHP will issue an warning:
-                        * Param y in x expected to be a reference, value given.
-                        *
-                        * In that case the call will also return null. The following code
-                        * catches that warning and provides better error message. The
-                        * function documentation also says that:
-                        *     In other words, it does not depend on the function signature
-                        *     whether the parameter is passed by a value or by a reference.
-                        * There is also PHP bug http://bugs.php.net/bug.php?id=47554 which
-                        * is unsurprisingly marked as bogus. In short handling of failures
-                        * with call_user_func_array is a failure, the documentation for that
-                        * function is wrong and misleading and PHP developers don't see any
-                        * problem here.
+                       /*
+                        * Call the hook. The documentation of call_user_func_array says
+                        * false is returned on failure. However, if the function signature
+                        * does not match the call signature, PHP will issue an warning and
+                        * return null instead. The following code catches that warning and
+                        * provides better error message.
                         */
                        $retval = null;
-                       set_error_handler( 'Hooks::hookErrorHandler' );
+                       $badhookmsg = null;
+                       $hook_args = array_merge( $hook, $args );
+
+                       // Profile first in case the Profiler causes errors.
                        wfProfileIn( $func );
+                       set_error_handler( 'Hooks::hookErrorHandler' );
                        try {
                                $retval = call_user_func_array( $callback, $hook_args );
                        } catch ( MWHookException $e ) {
                                $badhookmsg = $e->getMessage();
                        }
-                       wfProfileOut( $func );
                        restore_error_handler();
+                       wfProfileOut( $func );
 
-                       /* String return is an error; false return means stop processing. */
+                       // Process the return value.
                        if ( is_string( $retval ) ) {
+                               // String returned means error.
                                throw new FatalError( $retval );
-                       } elseif( $retval === null ) {
-                               if ( $closure ) {
-                                       $prettyFunc = "$event closure";
-                               } elseif( is_array( $callback ) ) {
-                                       if( is_object( $callback[0] ) ) {
-                                               $prettyClass = get_class( $callback[0] );
-                                       } else {
-                                               $prettyClass = strval( $callback[0] );
-                                       }
-                                       $prettyFunc = $prettyClass . '::' . strval( $callback[1] );
-                               } else {
-                                       $prettyFunc = strval( $callback );
-                               }
-                               if ( $badhookmsg ) {
-                                       throw new MWException(
-                                               'Detected bug in an extension! ' .
-                                               "Hook $prettyFunc has invalid call signature; " . $badhookmsg
-                                       );
-                               } else {
-                                       throw new MWException(
-                                               'Detected bug in an extension! ' .
-                                               "Hook $prettyFunc failed to return a value; " .
-                                               'should return true to continue hook processing or false to abort.'
-                                       );
-                               }
+                       } elseif ( $badhookmsg !== null ) {
+                               // Exception was thrown from Hooks::hookErrorHandler.
+                               throw new MWException(
+                                       'Detected bug in an extension! ' .
+                                       "Hook $func has invalid call signature; " . $badhookmsg
+                               );
+                       } elseif ( $retval === null ) {
+                               // Null was returned. Error.
+                               throw new MWException(
+                                       'Detected bug in an extension! ' .
+                                       "Hook $func failed to return a value; " .
+                                       'should return true to continue hook processing or false to abort.'
+                               );
                        } elseif ( !$retval ) {
                                wfProfileOut( 'hook: ' . $event );
+                               // False was returned. Stop processing, but no error.
                                return false;
                        }
                }
@@ -298,18 +229,21 @@ 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.
+        *
         * This REALLY should be protected... but it's public for compatibility
         *
         * @since 1.18
         *
-        * @param int $errno Unused
-        * @param string $errstr error message
-        * @throws MWHookException
-        * @return Boolean: false
+        * @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
         */
        public static function hookErrorHandler( $errno, $errstr ) {
                if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false ) {
-                       throw new MWHookException( $errstr );
+                       throw new MWHookException( $errstr, $errno );
                }
                return false;
        }
index af4b4bb..e7455b7 100644 (file)
@@ -36,8 +36,8 @@
  *
  * There are two important configuration options this class uses:
  *
- * $wgHtml5: If this is set to false, then all output should be valid XHTML 1.0
- *     Transitional.
+ * $wgMimeType: If this is set to an xml mimetype then output should be
+ *     valid XHTML5.
  * $wgWellFormedXml: If this is set to true, then all output should be
  *     well-formed XML (quotes on attributes, self-closing tags, etc.).
  *
@@ -101,19 +101,6 @@ class Html {
                'itemscope',
        );
 
-       private static $HTMLFiveOnlyAttribs = array(
-               'autocomplete',
-               'autofocus',
-               'max',
-               'min',
-               'multiple',
-               'pattern',
-               'placeholder',
-               'required',
-               'step',
-               'spellcheck',
-       );
-
        /**
         * Returns an HTML element in a string.  The major advantage here over
         * manually typing out the HTML is that it will escape all attribute
@@ -177,7 +164,7 @@ class Html {
         * @return string
         */
        public static function openElement( $element, $attribs = array() ) {
-               global $wgHtml5, $wgWellFormedXml;
+               global $wgWellFormedXml;
                $attribs = (array)$attribs;
                // This is not required in HTML5, but let's do it anyway, for
                // consistency and better compression.
@@ -204,36 +191,28 @@ class Html {
                                'image',
                                'reset',
                                'button',
-                       );
 
-                       // Allow more input types in HTML5 mode
-                       if( $wgHtml5 ) {
-                               $validTypes = array_merge( $validTypes, array(
-                                       'datetime',
-                                       'datetime-local',
-                                       'date',
-                                       'month',
-                                       'time',
-                                       'week',
-                                       'number',
-                                       'range',
-                                       'email',
-                                       'url',
-                                       'search',
-                                       'tel',
-                                       'color',
-                               ) );
-                       }
+                               // HTML input types
+                               'datetime',
+                               'datetime-local',
+                               'date',
+                               'month',
+                               'time',
+                               'week',
+                               'number',
+                               'range',
+                               'email',
+                               'url',
+                               'search',
+                               'tel',
+                               'color',
+                       );
                        if ( isset( $attribs['type'] )
                        && !in_array( $attribs['type'], $validTypes ) ) {
                                unset( $attribs['type'] );
                        }
                }
 
-               if ( !$wgHtml5 && $element == 'textarea' && isset( $attribs['maxlength'] ) ) {
-                       unset( $attribs['maxlength'] );
-               }
-
                // According to standard the default type for <button> elements is "submit".
                // Depending on compatibility mode IE might use "button", instead.
                // We enforce the standard "submit".
@@ -294,12 +273,6 @@ class Html {
         * @return array An array of attributes functionally identical to $attribs
         */
        private static function dropDefaults( $element, $attribs ) {
-               // Don't bother doing anything if we aren't outputting HTML5; it's too
-               // much of a pain to maintain two sets of defaults.
-               global $wgHtml5;
-               if ( !$wgHtml5 ) {
-                       return $attribs;
-               }
 
                // Whenever altering this array, please provide a covering test case
                // in HtmlTest::provideElementsWithAttributesHavingDefaultValues
@@ -340,7 +313,7 @@ class Html {
 
                foreach ( $attribs as $attrib => $value ) {
                        $lcattrib = strtolower( $attrib );
-                       if( is_array( $value ) ) {
+                       if ( is_array( $value ) ) {
                                $value = implode( ' ', $value );
                        } else {
                                $value = strval( $value );
@@ -444,7 +417,7 @@ class Html {
         *   (starting with a space if at least one attribute is output)
         */
        public static function expandAttributes( $attribs ) {
-               global $wgHtml5, $wgWellFormedXml;
+               global $wgWellFormedXml;
 
                $ret = '';
                $attribs = (array)$attribs;
@@ -460,15 +433,10 @@ class Html {
                                $key = $value;
                        }
 
-                       // Not technically required in HTML5, but required in XHTML 1.0,
-                       // and we'd like consistency and better compression anyway.
+                       // Not technically required in HTML5 but we'd like consistency
+                       // and better compression anyway.
                        $key = strtolower( $key );
 
-                       // Here we're blacklisting some HTML5-only attributes...
-                       if ( !$wgHtml5 && in_array( $key, self::$HTMLFiveOnlyAttribs ) ) {
-                               continue;
-                       }
-
                        // Bug 23769: Blacklist all form validation attributes for now.  Current
                        // (June 2010) WebKit has no UI, so the form just refuses to submit
                        // without telling the user why, which is much worse than failing
@@ -552,15 +520,12 @@ class Html {
                        }
 
                        if ( in_array( $key, self::$boolAttribs ) ) {
-                               // In XHTML 1.0 Transitional, the value needs to be equal to the
-                               // key.  In HTML5, we can leave the value empty instead.  If we
-                               // don't need well-formed XML, we can omit the = entirely.
+                               // In HTML5, we can leave the value empty. If we don't need
+                               // well-formed XML, we can omit the = entirely.
                                if ( !$wgWellFormedXml ) {
                                        $ret .= " $key";
-                               } elseif ( $wgHtml5 ) {
-                                       $ret .= " $key=\"\"";
                                } else {
-                                       $ret .= " $key=\"$key\"";
+                                       $ret .= " $key=\"\"";
                                }
                        } else {
                                // Apparently we need to entity-encode \n, \r, \t, although the
@@ -602,14 +567,10 @@ class Html {
         * @return string Raw HTML
         */
        public static function inlineScript( $contents ) {
-               global $wgHtml5, $wgJsMimeType, $wgWellFormedXml;
+               global $wgWellFormedXml;
 
                $attrs = array();
 
-               if ( !$wgHtml5 ) {
-                       $attrs['type'] = $wgJsMimeType;
-               }
-
                if ( $wgWellFormedXml && preg_match( '/[<&]/', $contents ) ) {
                        $contents = "/*<![CDATA[*/$contents/*]]>*/";
                }
@@ -625,14 +586,8 @@ class Html {
         * @return string Raw HTML
         */
        public static function linkedScript( $url ) {
-               global $wgHtml5, $wgJsMimeType;
-
                $attrs = array( 'src' => $url );
 
-               if ( !$wgHtml5 ) {
-                       $attrs['type'] = $wgJsMimeType;
-               }
-
                return self::element( 'script', $attrs );
        }
 
@@ -677,8 +632,7 @@ class Html {
 
        /**
         * Convenience function to produce an "<input>" element.  This supports the
-        * new HTML5 input types and attributes, and will silently strip them if
-        * $wgHtml5 is false.
+        * new HTML5 input types and attributes.
         *
         * @param $name    string name attribute
         * @param $value   mixed  value attribute
@@ -712,9 +666,7 @@ class Html {
         * Convenience function to produce an "<input>" element.
         *
         * This supports leaving out the cols= and rows= which Xml requires and are
-        * required by HTML4/XHTML but not required by HTML5 and will silently set
-        * cols="" and rows="" if $wgHtml5 is false and cols and rows are omitted
-        * (HTML4 validates present but empty cols="" and rows="" as valid).
+        * required by HTML4/XHTML but not required by HTML5.
         *
         * @param $name    string name attribute
         * @param $value   string value attribute
@@ -723,20 +675,8 @@ class Html {
         * @return string Raw HTML
         */
        public static function textarea( $name, $value = '', $attribs = array() ) {
-               global $wgHtml5;
-
                $attribs['name'] = $name;
 
-               if ( !$wgHtml5 ) {
-                       if ( !isset( $attribs['cols'] ) ) {
-                               $attribs['cols'] = "";
-                       }
-
-                       if ( !isset( $attribs['rows'] ) ) {
-                               $attribs['rows'] = "";
-                       }
-               }
-
                if ( substr( $value, 0, 1 ) == "\n" ) {
                        // Workaround for bug 12130: browsers eat the initial newline
                        // assuming that it's just for show, but they do keep the later
@@ -859,28 +799,29 @@ class Html {
        public static function htmlHeader( $attribs = array() ) {
                $ret = '';
 
-               global $wgMimeType;
-
-               if ( self::isXmlMimeType( $wgMimeType ) ) {
-                       $ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n";
-               }
+               global $wgHtml5Version, $wgMimeType, $wgXhtmlNamespaces;
 
-               global $wgHtml5, $wgHtml5Version, $wgDocType, $wgDTD;
-               global $wgXhtmlNamespaces, $wgXhtmlDefaultNamespace;
+               $isXHTML = self::isXmlMimeType( $wgMimeType );
 
-               if ( $wgHtml5 ) {
-                       $ret .= "<!DOCTYPE html>\n";
+               if ( $isXHTML ) { // XHTML5
+                       // XML mimetyped markup should have an xml header.
+                       // However a DOCTYPE is not needed.
+                       $ret .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?" . ">\n";
 
-                       if ( $wgHtml5Version ) {
-                               $attribs['version'] = $wgHtml5Version;
-                       }
-               } else {
-                       $ret .= "<!DOCTYPE html PUBLIC \"$wgDocType\" \"$wgDTD\">\n";
-                       $attribs['xmlns'] = $wgXhtmlDefaultNamespace;
+                       // Add the standard xmlns
+                       $attribs['xmlns'] = 'http://www.w3.org/1999/xhtml';
 
+                       // And support custom namespaces
                        foreach ( $wgXhtmlNamespaces as $tag => $ns ) {
                                $attribs["xmlns:$tag"] = $ns;
                        }
+               } else { // HTML5
+                       // DOCTYPE
+                       $ret .= "<!DOCTYPE html>\n";
+               }
+
+               if ( $wgHtml5Version ) {
+                       $attribs['version'] = $wgHtml5Version;
                }
 
                $html = Html::openElement( 'html', $attribs );
@@ -901,14 +842,11 @@ class Html {
         * @return Boolean
         */
        public static function isXmlMimeType( $mimetype ) {
-               switch ( $mimetype ) {
-                       case 'text/xml':
-                       case 'application/xhtml+xml':
-                       case 'application/xml':
-                               return true;
-                       default:
-                               return false;
-               }
+               # http://www.whatwg.org/specs/web-apps/current-work/multipage/infrastructure.html#xml-mime-type
+               # * text/xml
+               # * application/xml
+               # * Any mimetype with a subtype ending in +xml (this implicitly includes application/xhtml+xml)
+               return (bool) preg_match( '!^(text|application)/xml$|^.+/.+\+xml$!', $mimetype );
        }
 
        /**
@@ -926,22 +864,22 @@ class Html {
                global $wgStylePath;
 
                if ( $useStylePath ) {
-                       $icon = $wgStylePath.'/common/images/'.$icon;
+                       $icon = $wgStylePath . '/common/images/' . $icon;
                }
 
                $s = Html::openElement( 'div', array( 'class' => "mw-infobox $class" ) );
 
-               $s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-left' ) ).
+               $s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-left' ) ) .
                                Html::element( 'img',
                                        array(
                                                'src' => $icon,
                                                'alt' => $alt,
                                        )
-                               ).
+                               ) .
                                Html::closeElement( 'div' );
 
-               $s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-right' ) ).
-                               $text.
+               $s .= Html::openElement( 'div', array( 'class' => 'mw-infobox-right' ) ) .
+                               $text .
                                Html::closeElement( 'div' );
                $s .= Html::element( 'div', array( 'style' => 'clear: left;' ), ' ' );
 
@@ -962,7 +900,7 @@ class Html {
         */
        static function srcSet( $urls ) {
                $candidates = array();
-               foreach( $urls as $density => $url ) {
+               foreach ( $urls as $density => $url ) {
                        // Image candidate syntax per current whatwg live spec, 2012-09-23:
                        // http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content-1.html#attr-img-srcset
                        $candidates[] = "{$url} {$density}x";
index 98d36d3..1c9ad38 100644 (file)
@@ -40,6 +40,7 @@ class Http {
         * @param array $options options to pass to MWHttpRequest object.
         *      Possible keys for the array:
         *    - timeout             Timeout length in seconds
+        *    - connectTimeout      Timeout for connection, in seconds (curl only)
         *    - postData            An array of key-value pairs or a url-encoded form data
         *    - proxy               The proxy to use.
         *                          Otherwise it will use $wgHTTPProxy (if set)
@@ -65,18 +66,19 @@ class Http {
                if ( !isset( $options['timeout'] ) ) {
                        $options['timeout'] = 'default';
                }
+               if( !isset( $options['connectTimeout'] ) ) {
+                       $options['connectTimeout'] = 'default';
+               }
 
                $req = MWHttpRequest::factory( $url, $options );
                $status = $req->execute();
 
+               $content = false;
                if ( $status->isOK() ) {
                        $content = $req->getContent();
-                       wfProfileOut( __METHOD__ . "-$method" );
-                       return $content;
-               } else {
-                       wfProfileOut( __METHOD__ . "-$method" );
-                       return false;
                }
+               wfProfileOut( __METHOD__ . "-$method" );
+               return $content;
        }
 
        /**
@@ -234,7 +236,12 @@ class MWHttpRequest {
                } else {
                        $this->timeout = $wgHTTPTimeout;
                }
-               if( isset( $options['userAgent'] ) ) {
+               if ( isset( $options['connectTimeout'] ) && $options['connectTimeout'] != 'default' ) {
+                       $this->connectTimeout = $options['connectTimeout'];
+               } else {
+                       $this->connectTimeout = $wgHTTPConnectTimeout;
+               }
+               if ( isset( $options['userAgent'] ) ) {
                        $this->setUserAgent( $options['userAgent'] );
                }
 
@@ -282,7 +289,7 @@ class MWHttpRequest {
                                ' Http::$httpEngine is set to "curl"' );
                }
 
-               switch( Http::$httpEngine ) {
+               switch ( Http::$httpEngine ) {
                        case 'curl':
                                return new CurlHttpRequest( $url, $options );
                        case 'php':
@@ -307,7 +314,7 @@ class MWHttpRequest {
 
        /**
         * Set the parameters of the request
-
+        *
         * @param $args Array
         * @todo overload the args param
         */
@@ -565,8 +572,8 @@ class MWHttpRequest {
                        $this->parseHeader();
                }
 
-               if ( isset( $this->respHeaders[strtolower ( $header ) ] ) ) {
-                       $v = $this->respHeaders[strtolower ( $header ) ];
+               if ( isset( $this->respHeaders[strtolower( $header )] ) ) {
+                       $v = $this->respHeaders[strtolower( $header )];
                        return $v[count( $v ) - 1];
                }
 
@@ -629,7 +636,7 @@ class MWHttpRequest {
                        }
                }
 
-               wfProfileIn( __METHOD__ );
+               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -648,17 +655,17 @@ class MWHttpRequest {
                $headers = $this->getResponseHeaders();
 
                //return full url (fix for incorrect but handled relative location)
-               if ( isset( $headers[ 'location' ] ) ) {
-                       $locations = $headers[ 'location' ];
+               if ( isset( $headers['location'] ) ) {
+                       $locations = $headers['location'];
                        $domain = '';
                        $foundRelativeURI = false;
                        $countLocations = count( $locations );
 
                        for ( $i = $countLocations - 1; $i >= 0; $i-- ) {
-                               $url = parse_url( $locations[ $i ] );
+                               $url = parse_url( $locations[$i] );
 
                                if ( isset( $url['host'] ) ) {
-                                       $domain = $url[ 'scheme' ] . '://' . $url[ 'host' ];
+                                       $domain = $url['scheme'] . '://' . $url['host'];
                                        break; //found correct URI (with host)
                                } else {
                                        $foundRelativeURI = true;
@@ -667,15 +674,15 @@ class MWHttpRequest {
 
                        if ( $foundRelativeURI ) {
                                if ( $domain ) {
-                                       return $domain . $locations[ $countLocations - 1 ];
+                                       return $domain . $locations[$countLocations - 1];
                                } else {
                                        $url = parse_url( $this->url );
-                                       if ( isset($url[ 'host' ]) ) {
-                                               return $url[ 'scheme' ] . '://' . $url[ 'host' ] . $locations[ $countLocations - 1 ];
+                                       if ( isset( $url['host'] ) ) {
+                                               return $url['scheme'] . '://' . $url['host'] . $locations[$countLocations - 1];
                                        }
                                }
                        } else {
-                               return $locations[ $countLocations - 1 ];
+                               return $locations[$countLocations - 1];
                        }
                }
 
@@ -698,11 +705,6 @@ class MWHttpRequest {
 class CurlHttpRequest extends MWHttpRequest {
        const SUPPORTS_FILE_POSTS = true;
 
-       static $curlMessageMap = array(
-               6 => 'http-host-unreachable',
-               28 => 'http-timed-out'
-       );
-
        protected $curlOptions = array();
        protected $headerText = "";
 
@@ -728,6 +730,7 @@ class CurlHttpRequest extends MWHttpRequest {
 
                $this->curlOptions[CURLOPT_PROXY] = $this->proxy;
                $this->curlOptions[CURLOPT_TIMEOUT] = $this->timeout;
+               $this->curlOptions[CURLOPT_CONNECTTIMEOUT_MS] = $this->connectTimeout * 1000;
                $this->curlOptions[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0;
                $this->curlOptions[CURLOPT_WRITEFUNCTION] = $this->callback;
                $this->curlOptions[CURLOPT_HEADERFUNCTION] = array( $this, "readHeader" );
@@ -781,14 +784,11 @@ class CurlHttpRequest extends MWHttpRequest {
                        wfRestoreWarnings();
                }
 
-               if ( false === curl_exec( $curlHandle ) ) {
-                       $code = curl_error( $curlHandle );
-
-                       if ( isset( self::$curlMessageMap[$code] ) ) {
-                               $this->status->fatal( self::$curlMessageMap[$code] );
-                       } else {
-                               $this->status->fatal( 'http-curl-error', curl_error( $curlHandle ) );
-                       }
+               $curlRes = curl_exec( $curlHandle );
+               if ( curl_errno( $curlHandle ) == CURLE_OPERATION_TIMEOUTED ) {
+                       $this->status->fatal( 'http-timed-out', $this->url );
+               } elseif ( $curlRes === false ) {
+                       $this->status->fatal( 'http-curl-error', curl_error( $curlHandle ) );
                } else {
                        $this->headerList = explode( "\r\n", $this->headerText );
                }
@@ -851,7 +851,7 @@ class PhpHttpRequest extends MWHttpRequest {
                if ( $this->method == 'POST' ) {
                        // Required for HTTP 1.0 POSTs
                        $this->reqHeaders['Content-Length'] = strlen( $this->postData );
-                       if( !isset( $this->reqHeaders['Content-Type'] ) ) {
+                       if ( !isset( $this->reqHeaders['Content-Type'] ) ) {
                                $this->reqHeaders['Content-Type'] = "application/x-www-form-urlencoded";
                        }
                }
@@ -940,8 +940,7 @@ class PhpHttpRequest extends MWHttpRequest {
 
                // If everything went OK, or we received some error code
                // get the response body content.
-               if ( $this->status->isOK()
-                               || (int)$this->respStatus >= 300) {
+               if ( $this->status->isOK() || (int)$this->respStatus >= 300 ) {
                        while ( !feof( $fh ) ) {
                                $buf = fread( $fh, 8192 );
 
index 72b9a52..1e0a4f9 100644 (file)
@@ -33,7 +33,7 @@ define( 'RE_IP_BLOCK', RE_IP_ADD . '\/' . RE_IP_PREFIX );
 // An IPv6 address is made up of 8 words (each x0000 to xFFFF).
 // However, the "::" abbreviation can be used on consecutive x0000 words.
 define( 'RE_IPV6_WORD', '([0-9A-Fa-f]{1,4})' );
-define( 'RE_IPV6_PREFIX', '(12[0-8]|1[01][0-9]|[1-9]?\d)');
+define( 'RE_IPV6_PREFIX', '(12[0-8]|1[01][0-9]|[1-9]?\d)' );
 define( 'RE_IPV6_ADD',
        '(?:' . // starts with "::" (including "::")
                ':(?::|(?::' . RE_IPV6_WORD . '){1,7})' .
@@ -392,11 +392,11 @@ class IP {
                static $privateRanges = false;
                if ( !$privateRanges ) {
                        $privateRanges = array(
-                               array( '10.0.0.0',    '10.255.255.255' ),   # RFC 1918 (private)
-                               array( '172.16.0.0',  '172.31.255.255' ),   #     "
-                               array( '192.168.0.0', '192.168.255.255' ),  #     "
-                               array( '0.0.0.0',     '0.255.255.255' ),    # this network
-                               array( '127.0.0.0',   '127.255.255.255' ),  # loopback
+                               array( '10.0.0.0', '10.255.255.255' ), # RFC 1918 (private)
+                               array( '172.16.0.0', '172.31.255.255' ), # RFC 1918 (private)
+                               array( '192.168.0.0', '192.168.255.255' ), # RFC 1918 (private)
+                               array( '0.0.0.0', '0.255.255.255' ), # this network
+                               array( '127.0.0.0', '127.255.255.255' ), # loopback
                        );
                }
 
@@ -526,7 +526,7 @@ class IP {
                        if ( $bits == 0 ) {
                                $network = 0;
                        } else {
-                               $network &= ~( ( 1 << ( 32 - $bits ) ) - 1);
+                               $network &= ~( ( 1 << ( 32 - $bits ) ) - 1 );
                        }
                        # Convert to unsigned
                        if ( $network < 0 ) {
index 1556ad9..43cf7f6 100644 (file)
@@ -282,11 +282,11 @@ class ImageGallery {
                                $img = false;
                        }
 
-                       if( !$img ) {
+                       if ( !$img ) {
                                # We're dealing with a non-image, spit out the name and be done with it.
                                $thumbhtml = "\n\t\t\t" . '<div style="height: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">'
                                        . htmlspecialchars( $nt->getText() ) . '</div>';
-                       } elseif( $this->mHideBadImages && wfIsBadImage( $nt->getDBkey(), $this->getContextTitle() ) ) {
+                       } elseif ( $this->mHideBadImages && wfIsBadImage( $nt->getDBkey(), $this->getContextTitle() ) ) {
                                # The image is blacklisted, just show it as a text link.
                                $thumbhtml = "\n\t\t\t" . '<div style="height: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">' .
                                        Linker::link(
@@ -297,12 +297,12 @@ class ImageGallery {
                                                array( 'known', 'noclasses' )
                                        ) .
                                        '</div>';
-                       } elseif( !( $thumb = $img->transform( $params ) ) ) {
+                       } elseif ( !( $thumb = $img->transform( $params ) ) ) {
                                # Error generating thumbnail.
                                $thumbhtml = "\n\t\t\t" . '<div style="height: ' . ( self::THUMB_PADDING + $this->mHeights ) . 'px;">'
                                        . htmlspecialchars( $img->getLastError() ) . '</div>';
                        } else {
-                               $vpad = ( self::THUMB_PADDING + $this->mHeights - $thumb->height ) /2;
+                               $vpad = ( self::THUMB_PADDING + $this->mHeights - $thumb->height ) / 2;
 
                                $imageParameters = array(
                                        'desc-link' => true,
@@ -334,8 +334,8 @@ class ImageGallery {
                        // $linkTarget = Title::newFromText( $wgContLang->getNsText( MWNamespace::getUser() ) . ":{$ut}" );
                        // $ul = Linker::link( $linkTarget, $ut );
 
-                       if( $this->mShowBytes ) {
-                               if( $img ) {
+                       if ( $this->mShowBytes ) {
+                               if ( $img ) {
                                        $fileSize = htmlspecialchars( $lang->formatSize( $img->getSize() ) );
                                } else {
                                        $fileSize = wfMessage( 'filemissing' )->escaped();
index b3a485a..a5beb5d 100644 (file)
@@ -206,7 +206,7 @@ class ImagePage extends Article {
                }
 
                // Add remote Filepage.css
-               if( !$this->repo->isLocal() ) {
+               if ( !$this->repo->isLocal() ) {
                        $css = $this->repo->getDescriptionStylesheetUrl();
                        if ( $css ) {
                                $out->addStyle( $css );
@@ -250,7 +250,7 @@ class ImagePage extends Article {
         *
         * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
         *
-        * @param array $metadata the array containing the EXIF data
+        * @param array $metadata the array containing the Exif data
         * @return String The metadata table. This is treated as Wikitext (!)
         */
        protected function makeMetadataTable( $metadata ) {
@@ -597,7 +597,7 @@ EOT
                $descText = $this->mPage->getFile()->getDescriptionText();
 
                /* Add canonical to head if there is no local page for this shared file */
-               if( $descUrl && $this->mPage->getID() == 0 ) {
+               if ( $descUrl && $this->mPage->getID() == 0 ) {
                        $out->setCanonicalUrl( $descUrl );
                }
 
@@ -631,7 +631,7 @@ EOT
         * external editing (and instructions link) etc.
         */
        protected function uploadLinksBox() {
-               global $wgEnableUploads, $wgUseExternalEditor;
+               global $wgEnableUploads;
 
                if ( !$wgEnableUploads ) {
                        return;
@@ -654,25 +654,6 @@ EOT
                        $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">" . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
                }
 
-               # External editing link
-               if ( $wgUseExternalEditor ) {
-                       $elink = Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'edit-externally' )->escaped(),
-                               array(),
-                               array(
-                                       'action' => 'edit',
-                                       'externaledit' => 'true',
-                                       'mode' => 'file'
-                               )
-                       );
-                       $out->addHTML(
-                               '<li id="mw-imagepage-edit-external">' . $elink . ' <small>' .
-                                       wfMessage( 'edit-externally-help' )->parse() .
-                                       "</small></li>\n"
-                       );
-               }
-
                $out->addHTML( "</ul>\n" );
        }
 
@@ -719,7 +700,7 @@ EOT
                $limit = 100;
 
                $out = $this->getContext()->getOutput();
-               $res = $this->queryImageLinks( $this->getTitle()->getDbKey(), $limit + 1);
+               $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
                $rows = array();
                $redirects = array();
                foreach ( $res as $row ) {
@@ -772,7 +753,7 @@ EOT
 
                // Create links for every element
                $currentCount = 0;
-               foreach( $rows as $element ) {
+               foreach ( $rows as $element ) {
                        $currentCount++;
                        if ( $currentCount > $limit ) {
                                break;
index f9f6cee..eeec5cd 100644 (file)
  * @author Rob Church <robchur@gmail.com>
  */
 abstract class ImageQueryPage extends QueryPage {
-
        /**
         * Format and output report results using the given information plus
         * OutputPage
         *
-        * @param $out OutputPage to print to
-        * @param $skin Skin: user skin to use [unused]
-        * @param $dbr DatabaseBase (read) connection to use
-        * @param $res Integer: result pointer
-        * @param $num Integer: number of available result rows
-        * @param $offset Integer: paging offset
+        * @param OutputPage $out OutputPage to print to
+        * @param Skin $skin User skin to use [unused]
+        * @param DatabaseBase $dbr (read) connection to use
+        * @param int $res Result pointer
+        * @param int $num Number of available result rows
+        * @param int $offset Paging offset
         */
        protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
-               if( $num > 0 ) {
+               if ( $num > 0 ) {
                        $gallery = new ImageGallery();
 
                        # $res might contain the whole 1,000 rows, so we read up to
                        # $num [should update this to use a Pager]
-                       for( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
+                       for ( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
                                $namespace = isset( $row->namespace ) ? $row->namespace : NS_FILE;
                                $title = Title::makeTitleSafe( $namespace, $row->title );
                                if ( $title instanceof Title && $title->getNamespace() == NS_FILE ) {
@@ -65,11 +64,10 @@ abstract class ImageQueryPage extends QueryPage {
        /**
         * Get additional HTML to be shown in a results' cell
         *
-        * @param $row Object: result row
-        * @return String
+        * @param object $row Result row
+        * @return string
         */
        protected function getCellHtml( $row ) {
                return '';
        }
-
 }
index fee636f..8b7af02 100644 (file)
@@ -47,7 +47,7 @@ class WikiImporter {
 
                stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
                $id = UploadSourceAdapter::registerSource( $source );
-               if (defined( 'LIBXML_PARSEHUGE' ) ) {
+               if ( defined( 'LIBXML_PARSEHUGE' ) ) {
                        $this->reader->open( "uploadsource://$id", null, LIBXML_PARSEHUGE );
                } else {
                        $this->reader->open( "uploadsource://$id" );
@@ -66,7 +66,7 @@ class WikiImporter {
        }
 
        private function debug( $data ) {
-               if( $this->mDebug ) {
+               if ( $this->mDebug ) {
                        wfDebug( "IMPORT: $data\n" );
                }
        }
@@ -188,10 +188,10 @@ class WikiImporter {
         * @return bool
         */
        public function setTargetNamespace( $namespace ) {
-               if( is_null( $namespace ) ) {
+               if ( is_null( $namespace ) ) {
                        // Don't override namespaces
                        $this->mTargetNamespace = null;
-               } elseif( $namespace >= 0 ) {
+               } elseif ( $namespace >= 0 ) {
                        // @todo FIXME: Check for validity
                        $this->mTargetNamespace = intval( $namespace );
                } else {
@@ -206,16 +206,16 @@ class WikiImporter {
         */
        public function setTargetRootPage( $rootpage ) {
                $status = Status::newGood();
-               if( is_null( $rootpage ) ) {
+               if ( is_null( $rootpage ) ) {
                        // No rootpage
                        $this->mTargetRootPage = null;
-               } elseif( $rootpage !== '' ) {
+               } elseif ( $rootpage !== '' ) {
                        $rootpage = rtrim( $rootpage, '/' ); //avoid double slashes
                        $title = Title::newFromText( $rootpage, !is_null( $this->mTargetNamespace ) ? $this->mTargetNamespace : NS_MAIN );
-                       if( !$title || $title->isExternal() ) {
+                       if ( !$title || $title->isExternal() ) {
                                $status->fatal( 'import-rootpage-invalid' );
                        } else {
-                               if( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
+                               if ( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
                                        global $wgContLang;
 
                                        $displayNSText = $title->getNamespace() == NS_MAIN
@@ -304,7 +304,7 @@ class WikiImporter {
         */
        public function debugRevisionHandler( &$revision ) {
                $this->debug( "Got revision:" );
-               if( is_object( $revision->title ) ) {
+               if ( is_object( $revision->title ) ) {
                        $this->debug( "-- Title: " . $revision->title->getPrefixedText() );
                } else {
                        $this->debug( "-- Title: <invalid>" );
@@ -320,7 +320,7 @@ class WikiImporter {
         * @param $title Title
         */
        function pageCallback( $title ) {
-               if( isset( $this->mPageCallback ) ) {
+               if ( isset( $this->mPageCallback ) ) {
                        call_user_func( $this->mPageCallback, $title );
                }
        }
@@ -334,7 +334,7 @@ class WikiImporter {
         * @param array $pageInfo associative array of page information
         */
        private function pageOutCallback( $title, $origTitle, $revCount, $sucCount, $pageInfo ) {
-               if( isset( $this->mPageOutCallback ) ) {
+               if ( isset( $this->mPageOutCallback ) ) {
                        $args = func_get_args();
                        call_user_func_array( $this->mPageOutCallback, $args );
                }
@@ -376,12 +376,12 @@ class WikiImporter {
         * @access private
         */
        private function nodeContents() {
-               if( $this->reader->isEmptyElement ) {
+               if ( $this->reader->isEmptyElement ) {
                        return "";
                }
                $buffer = "";
-               while( $this->reader->read() ) {
-                       switch( $this->reader->nodeType ) {
+               while ( $this->reader->read() ) {
+                       switch ( $this->reader->nodeType ) {
                        case XmlReader::TEXT:
                        case XmlReader::SIGNIFICANT_WHITESPACE:
                                $buffer .= $this->reader->value;
@@ -420,19 +420,19 @@ class WikiImporter {
                                "END_ELEMENT",
                                "END_ENTITY",
                                "XML_DECLARATION",
-                               );
+                       );
                        $lookup = array();
 
-                       foreach( $xmlReaderConstants as $name ) {
-                               $lookup[constant("XmlReader::$name")] = $name;
+                       foreach ( $xmlReaderConstants as $name ) {
+                               $lookup[constant( "XmlReader::$name" )] = $name;
                        }
                }
 
-               print( var_dump(
+               print var_dump(
                        $lookup[$this->reader->nodeType],
                        $this->reader->name,
                        $this->reader->value
-               )."\n\n" );
+               ) . "\n\n";
        }
 
        /**
@@ -441,10 +441,16 @@ class WikiImporter {
         * @return bool
         */
        public function doImport() {
+
+               // Calls to reader->read need to be wrapped in calls to
+               // libxml_disable_entity_loader() to avoid local file
+               // inclusion attacks (bug 46932).
+               $oldDisable = libxml_disable_entity_loader( true );
                $this->reader->read();
 
                if ( $this->reader->name != 'mediawiki' ) {
-                       throw new MWException( "Expected <mediawiki> tag, got ".
+                       libxml_disable_entity_loader( $oldDisable );
+                       throw new MWException( "Expected <mediawiki> tag, got " .
                                $this->reader->name );
                }
                $this->debug( "<mediawiki> tag is correct." );
@@ -457,7 +463,7 @@ class WikiImporter {
                        $tag = $this->reader->name;
                        $type = $this->reader->nodeType;
 
-                       if ( !wfRunHooks( 'ImportHandleToplevelXMLTag', $this ) ) {
+                       if ( !wfRunHooks( 'ImportHandleToplevelXMLTag', array( $this ) ) ) {
                                // Do nothing
                        } elseif ( $tag == 'mediawiki' && $type == XmlReader::END_ELEMENT ) {
                                break;
@@ -482,6 +488,7 @@ class WikiImporter {
                        }
                }
 
+               libxml_disable_entity_loader( $oldDisable );
                return true;
        }
 
@@ -515,8 +522,9 @@ class WikiImporter {
 
                        $tag = $this->reader->name;
 
-                       if ( !wfRunHooks( 'ImportHandleLogItemXMLTag',
-                                               $this, $logInfo ) ) {
+                       if ( !wfRunHooks( 'ImportHandleLogItemXMLTag', array(
+                               $this, $logInfo
+                       ) ) ) {
                                // Do nothing
                        } elseif ( in_array( $tag, $normalFields ) ) {
                                $logInfo[$tag] = $this->nodeContents();
@@ -632,8 +640,9 @@ class WikiImporter {
 
                        $tag = $this->reader->name;
 
-                       if ( !wfRunHooks( 'ImportHandleRevisionXMLTag', $this,
-                                               $pageInfo, $revisionInfo ) ) {
+                       if ( !wfRunHooks( 'ImportHandleRevisionXMLTag', array(
+                               $this, $pageInfo, $revisionInfo
+                       ) ) ) {
                                // Do nothing
                        } elseif ( in_array( $tag, $normalFields ) ) {
                                $revisionInfo[$tag] = $this->nodeContents();
@@ -659,7 +668,7 @@ class WikiImporter {
        private function processRevision( $pageInfo, $revisionInfo ) {
                $revision = new WikiRevision;
 
-               if( isset( $revisionInfo['id'] ) ) {
+               if ( isset( $revisionInfo['id'] ) ) {
                        $revision->setID( $revisionInfo['id'] );
                }
                if ( isset( $revisionInfo['text'] ) ) {
@@ -718,8 +727,9 @@ class WikiImporter {
 
                        $tag = $this->reader->name;
 
-                       if ( !wfRunHooks( 'ImportHandleUploadXMLTag', $this,
-                                               $pageInfo ) ) {
+                       if ( !wfRunHooks( 'ImportHandleUploadXMLTag', array(
+                               $this, $pageInfo
+                       ) ) ) {
                                // Do nothing
                        } elseif ( in_array( $tag, $normalFields ) ) {
                                $uploadInfo[$tag] = $this->nodeContents();
@@ -833,33 +843,33 @@ class WikiImporter {
                $workTitle = $text;
                $origTitle = Title::newFromText( $workTitle );
 
-               if( !is_null( $this->mTargetNamespace ) && !is_null( $origTitle ) ) {
+               if ( !is_null( $this->mTargetNamespace ) && !is_null( $origTitle ) ) {
                        # makeTitleSafe, because $origTitle can have a interwiki (different setting of interwiki map)
                        # and than dbKey can begin with a lowercase char
                        $title = Title::makeTitleSafe( $this->mTargetNamespace,
                                $origTitle->getDBkey() );
                } else {
-                       if( !is_null( $this->mTargetRootPage ) ) {
+                       if ( !is_null( $this->mTargetRootPage ) ) {
                                $workTitle = $this->mTargetRootPage . '/' . $workTitle;
                        }
                        $title = Title::newFromText( $workTitle );
                }
 
-               if( is_null( $title ) ) {
+               if ( is_null( $title ) ) {
                        # Invalid page title? Ignore the page
                        $this->notice( 'import-error-invalid', $workTitle );
                        return false;
-               } elseif( $title->isExternal() ) {
+               } elseif ( $title->isExternal() ) {
                        $this->notice( 'import-error-interwiki', $title->getPrefixedText() );
                        return false;
-               } elseif( !$title->canExist() ) {
+               } elseif ( !$title->canExist() ) {
                        $this->notice( 'import-error-special', $title->getPrefixedText() );
                        return false;
-               } elseif( !$title->userCan( 'edit' ) && !$wgCommandLineMode ) {
+               } elseif ( !$title->userCan( 'edit' ) && !$wgCommandLineMode ) {
                        # Do not import if the importing wiki user cannot edit this page
                        $this->notice( 'import-error-edit', $title->getPrefixedText() );
                        return false;
-               } elseif( !$title->exists() && !$title->userCan( 'create' ) && !$wgCommandLineMode ) {
+               } elseif ( !$title->exists() && !$title->userCan( 'create' ) && !$wgCommandLineMode ) {
                        # Do not import if the importing wiki user cannot create this page
                        $this->notice( 'import-error-create', $title->getPrefixedText() );
                        return false;
@@ -990,12 +1000,12 @@ class XMLReader2 extends XMLReader {
         * @return bool|string
         */
        function nodeContents() {
-               if( $this->isEmptyElement ) {
+               if ( $this->isEmptyElement ) {
                        return "";
                }
                $buffer = "";
-               while( $this->read() ) {
-                       switch( $this->nodeType ) {
+               while ( $this->read() ) {
+                       switch ( $this->nodeType ) {
                        case XmlReader::TEXT:
                        case XmlReader::SIGNIFICANT_WHITESPACE:
                                $buffer .= $this->value;
@@ -1044,9 +1054,9 @@ class WikiRevision {
         * @throws MWException
         */
        function setTitle( $title ) {
-               if( is_object( $title ) ) {
+               if ( is_object( $title ) ) {
                        $this->title = $title;
-               } elseif( is_null( $title ) ) {
+               } elseif ( is_null( $title ) ) {
                        throw new MWException( "WikiRevision given a null title in import. You may need to adjust \$wgLegalTitleChars." );
                } else {
                        throw new MWException( "WikiRevision given non-object title in import." );
@@ -1362,7 +1372,7 @@ class WikiRevision {
 
                # Sneak a single revision into place
                $user = User::newFromName( $this->getUser() );
-               if( $user ) {
+               if ( $user ) {
                        $userId = intval( $user->getId() );
                        $userText = $user->getName();
                        $userObj = $user;
@@ -1377,7 +1387,7 @@ class WikiRevision {
                $linkCache->clear();
 
                $page = WikiPage::factory( $this->title );
-               if( !$page->exists() ) {
+               if ( !$page->exists() ) {
                        # must create the page...
                        $pageId = $page->insertOn( $dbw );
                        $created = true;
@@ -1393,7 +1403,7 @@ class WikiRevision {
                                        'rev_comment' => $this->getComment() ),
                                __METHOD__
                        );
-                       if( $prior ) {
+                       if ( $prior ) {
                                // @todo FIXME: This could fail slightly for multiple matches :P
                                wfDebug( __METHOD__ . ": skipping existing revision for [[" .
                                        $this->title->getPrefixedText() . "]], timestamp " . $this->timestamp . "\n" );
@@ -1433,7 +1443,7 @@ class WikiRevision {
        function importLogItem() {
                $dbw = wfGetDB( DB_MASTER );
                # @todo FIXME: This will not record autoblocks
-               if( !$this->getTitle() ) {
+               if ( !$this->getTitle() ) {
                        wfDebug( __METHOD__ . ": skipping invalid {$this->type}/{$this->action} log time, timestamp " .
                                $this->timestamp . "\n" );
                        return;
@@ -1452,7 +1462,7 @@ class WikiRevision {
                        __METHOD__
                );
                // @todo FIXME: This could fail slightly for multiple matches :P
-               if( $prior ) {
+               if ( $prior ) {
                        wfDebug( __METHOD__ . ": skipping existing item for Log:{$this->type}/{$this->action}, timestamp " .
                                $this->timestamp . "\n" );
                        return;
@@ -1493,7 +1503,7 @@ class WikiRevision {
                                wfDebug( __METHOD__ . "File already exists; importing as $archiveName\n" );
                        }
                }
-               if( !$file ) {
+               if ( !$file ) {
                        wfDebug( __METHOD__ . ': Bad file for ' . $this->getTitle() . "\n" );
                        return false;
                }
@@ -1505,7 +1515,7 @@ class WikiRevision {
                        $source = $this->downloadSource();
                        $flags |= File::DELETE_SOURCE;
                }
-               if( !$source ) {
+               if ( !$source ) {
                        wfDebug( __METHOD__ . ": Could not fetch remote file.\n" );
                        return false;
                }
@@ -1544,13 +1554,13 @@ class WikiRevision {
         */
        function downloadSource() {
                global $wgEnableUploads;
-               if( !$wgEnableUploads ) {
+               if ( !$wgEnableUploads ) {
                        return false;
                }
 
                $tempo = tempnam( wfTempDir(), 'download' );
                $f = fopen( $tempo, 'wb' );
-               if( !$f ) {
+               if ( !$f ) {
                        wfDebug( "IMPORT: couldn't write to temp file $tempo\n" );
                        return false;
                }
@@ -1558,7 +1568,7 @@ class WikiRevision {
                // @todo FIXME!
                $src = $this->getSrc();
                $data = Http::get( $src );
-               if( !$data ) {
+               if ( !$data ) {
                        wfDebug( "IMPORT: couldn't fetch source $src\n" );
                        fclose( $f );
                        unlink( $tempo );
@@ -1594,7 +1604,7 @@ class ImportStringSource {
         * @return bool|string
         */
        function readChunk() {
-               if( $this->atEnd() ) {
+               if ( $this->atEnd() ) {
                        return false;
                }
                $this->mRead = true;
@@ -1633,7 +1643,7 @@ class ImportStreamSource {
                wfSuppressWarnings();
                $file = fopen( $filename, 'rt' );
                wfRestoreWarnings();
-               if( !$file ) {
+               if ( !$file ) {
                        return Status::newFatal( "importcantopen" );
                }
                return Status::newGood( new ImportStreamSource( $file ) );
@@ -1646,11 +1656,11 @@ class ImportStreamSource {
        static function newFromUpload( $fieldname = "xmlimport" ) {
                $upload =& $_FILES[$fieldname];
 
-               if( $upload === null || !$upload['name'] ) {
+               if ( $upload === null || !$upload['name'] ) {
                        return Status::newFatal( 'importnofile' );
                }
-               if( !empty( $upload['error'] ) ) {
-                       switch( $upload['error'] ) {
+               if ( !empty( $upload['error'] ) ) {
+                       switch ( $upload['error'] ) {
                                case 1: # The uploaded file exceeds the upload_max_filesize directive in php.ini.
                                        return Status::newFatal( 'importuploaderrorsize' );
                                case 2: # The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.
@@ -1664,7 +1674,7 @@ class ImportStreamSource {
 
                }
                $fname = $upload['tmp_name'];
-               if( is_uploaded_file( $fname ) ) {
+               if ( is_uploaded_file( $fname ) ) {
                        return ImportStreamSource::newFromFile( $fname );
                } else {
                        return Status::newFatal( 'importnofile' );
@@ -1683,7 +1693,7 @@ class ImportStreamSource {
                # otherwise prevent importing from large sites, such
                # as the Wikimedia cluster, etc.
                $data = Http::request( $method, $url, array( 'followRedirects' => true ) );
-               if( $data !== false ) {
+               if ( $data !== false ) {
                        $file = tmpfile();
                        fwrite( $file, $data );
                        fflush( $file );
@@ -1703,18 +1713,24 @@ class ImportStreamSource {
         * @return Status
         */
        public static function newFromInterwiki( $interwiki, $page, $history = false, $templates = false, $pageLinkDepth = 0 ) {
-               if( $page == '' ) {
+               if ( $page == '' ) {
                        return Status::newFatal( 'import-noarticle' );
                }
                $link = Title::newFromText( "$interwiki:Special:Export/$page" );
-               if( is_null( $link ) || $link->getInterwiki() == '' ) {
+               if ( is_null( $link ) || $link->getInterwiki() == '' ) {
                        return Status::newFatal( 'importbadinterwiki' );
                } else {
                        $params = array();
-                       if ( $history ) $params['history'] = 1;
-                       if ( $templates ) $params['templates'] = 1;
-                       if ( $pageLinkDepth ) $params['pagelink-depth'] = $pageLinkDepth;
-                       $url = $link->getFullUrl( $params );
+                       if ( $history ) {
+                               $params['history'] = 1;
+                       }
+                       if ( $templates ) {
+                               $params['templates'] = 1;
+                       }
+                       if ( $pageLinkDepth ) {
+                               $params['pagelink-depth'] = $pageLinkDepth;
+                       }
+                       $url = $link->getFullURL( $params );
                        # For interwikis, use POST to avoid redirects.
                        return ImportStreamSource::newFromURL( $url, "POST" );
                }
index 66f9544..64431f0 100644 (file)
@@ -2,6 +2,9 @@
 /**
  * Some functions that are useful during startup.
  *
+ * This class previously contained some functionality related to a PHP compiler
+ * called hphpc. That compiler has now been discontinued.
+ *
  * 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
 
 /**
  * Some functions that are useful during startup.
+ *
+ * This class previously contained some functionality related to a PHP compiler
+ * called hphpc. That compiler has now been discontinued. All methods are now
+ * deprecated.
  */
 class MWInit {
        static $compilerVersion;
 
        /**
-        * Get the version of HipHop used to compile, or false if MediaWiki was not
-        * compiled. This works by having our build script insert a special function
-        * into the compiled code.
+        * @deprecated since 1.22
         */
        static function getCompilerVersion() {
-               if ( self::$compilerVersion === null ) {
-                       if ( self::functionExists( 'wfHipHopCompilerVersion' ) ) {
-                               self::$compilerVersion = wfHipHopCompilerVersion();
-                       } else {
-                               self::$compilerVersion = false;
-                       }
-               }
-               return self::$compilerVersion;
+               return false;
        }
 
        /**
         * Returns true if we are running under HipHop, whether in compiled or
         * interpreted mode.
         *
+        * @deprecated since 1.22
         * @return bool
         */
        static function isHipHop() {
-               return function_exists( 'hphp_thread_set_warmup_enabled' );
+               return defined( 'HPHP_VERSION' );
        }
 
        /**
-        * Get a fully-qualified path for a source file relative to $IP. Including
-        * such a path under HipHop will force the file to be interpreted. This is
-        * useful for configuration files.
+        * Get a fully-qualified path for a source file relative to $IP.
+        * @deprecated since 1.22
         *
         * @param $file string
         *
@@ -67,117 +65,39 @@ class MWInit {
        }
 
        /**
-        * If we are running code compiled by HipHop, this will pass through the
-        * input path, assumed to be relative to $IP. If the code is interpreted,
-        * it will converted to a fully qualified path. It is necessary to use a
-        * path which is relative to $IP in order to make HipHop use its compiled
-        * code.
-        *
+        * @deprecated since 1.22
         * @param $file string
-        *
         * @return string
         */
        static function compiledPath( $file ) {
                global $IP;
-
-               if ( defined( 'MW_COMPILED' ) ) {
-                       return "phase3/$file";
-               } else {
-                       return "$IP/$file";
-               }
-       }
-
-       /**
-        * The equivalent of MWInit::interpretedPath() but for files relative to the
-        * extensions directory.
-        *
-        * @param $file string
-        * @return string
-        */
-       static function extInterpretedPath( $file ) {
-               return self::getExtensionsDirectory() . '/' . $file;
+               return "$IP/$file";
        }
 
        /**
-        * The equivalent of MWInit::compiledPath() but for files relative to the
-        * extensions directory. Any files referenced in this way must be registered
-        * for compilation by including them in $wgCompiledFiles.
+        * @deprecated since 1.22
         * @param $file string
         * @return string
         */
        static function extCompiledPath( $file ) {
-               if ( defined( 'MW_COMPILED' ) ) {
-                       return "extensions/$file";
-               } else {
-                       return self::getExtensionsDirectory() . '/' . $file;
-               }
+               return false;
        }
 
        /**
-        * Register an extension setup file and return its path for compiled
-        * inclusion. Use this function in LocalSettings.php to add extensions
-        * to the build. For example:
-        *
-        *    require( MWInit::extSetupPath( 'ParserFunctions/ParserFunctions.php' ) );
-        *
-        * @param string $extRel The path relative to the extensions directory, as defined by
-        *   $wgExtensionsDirectory.
-        *
-        * @return string
-        */
-       static function extSetupPath( $extRel ) {
-               $baseRel = "extensions/$extRel";
-               if ( defined( 'MW_COMPILED' ) ) {
-                       return $baseRel;
-               } else {
-                       global $wgCompiledFiles;
-                       $wgCompiledFiles[] = $baseRel;
-                       return self::getExtensionsDirectory() . '/' . $extRel;
-               }
-       }
-
-       /**
-        * @return bool|string
-        */
-       static function getExtensionsDirectory() {
-               global $wgExtensionsDirectory, $IP;
-               if ( $wgExtensionsDirectory === false ) {
-                       $wgExtensionsDirectory = "$IP/../extensions";
-               }
-               return $wgExtensionsDirectory;
-       }
-
-       /**
-        * Determine whether a class exists, using a method which works under HipHop.
-        *
-        * Note that it's not possible to implement this with any variant of
-        * class_exists(), because class_exists() returns false for classes which
-        * are compiled in.
-        *
-        * Calling class_exists() on a literal string causes the class to be made
-        * "volatile", which means (as of March 2011) that the class is broken and
-        * can't be used at all. So don't do that. See
-        * https://github.com/facebook/hiphop-php/issues/314
+        * Deprecated wrapper for class_exists()
+        * @deprecated since 1.22
         *
         * @param $class string
         *
         * @return bool
         */
        static function classExists( $class ) {
-               try {
-                       $r = new ReflectionClass( $class );
-               } catch( ReflectionException $r ) {
-                       $r = false;
-               }
-               return $r !== false;
+               return class_exists( $class );
        }
 
        /**
-        * Determine whether a method exists within a class, using a method which works
-        * under HipHop.
-        *
-        * Note that under HipHop when method_exists is given a string for it's class
-        * such as to test for a static method has the same issues as class_exists does.
+        * Deprecated wrapper for method_exists()
+        * @deprecated since 1.22
         *
         * @param $class string
         * @param $method string
@@ -185,34 +105,25 @@ class MWInit {
         * @return bool
         */
        static function methodExists( $class, $method ) {
-               try {
-                       $r = new ReflectionMethod( $class, $method );
-               } catch( ReflectionException $r ) {
-                       $r = false;
-               }
-               return $r !== false;
+               return method_exists( $class, $method );
        }
 
        /**
-        * Determine whether a function exists, using a method which works under
-        * HipHop.
+        * Deprecated wrapper for function_exists()
+        * @deprecated since 1.22
         *
         * @param $function string
         *
         * @return bool
         */
        static function functionExists( $function ) {
-               try {
-                       $r = new ReflectionFunction( $function );
-               } catch( ReflectionException $r ) {
-                       $r = false;
-               }
-               return $r !== false;
+               return function_exists( $function );
        }
 
        /**
-        * Call a static method of a class with variable arguments without causing
-        * it to become volatile.
+        * Deprecated wrapper for call_user_func_array()
+        * @deprecated since 1.22
+        *
         * @param $className string
         * @param $methodName string
         * @param $args array
@@ -220,7 +131,6 @@ class MWInit {
         * @return mixed
         */
        static function callStaticMethod( $className, $methodName, $args ) {
-               $r = new ReflectionMethod( $className, $methodName );
-               return $r->invokeArgs( null, $args );
+               return call_user_func_array( array( $className, $methodName ), $args );
        }
 }
index e8aee0b..6c582aa 100644 (file)
@@ -105,7 +105,7 @@ class Licenses extends HTMLFormField {
        protected function stackItem( &$list, $path, $item ) {
                $position =& $list;
                if ( $path ) {
-                       foreach( $path as $key ) {
+                       foreach ( $path as $key ) {
                                $position =& $position[$key];
                        }
                }
index 11b6559..d552c69 100644 (file)
@@ -152,11 +152,11 @@ class LinkFilter {
         * @return array filtered array
         */
        public static function keepOneWildcard( $arr ) {
-               if( !is_array( $arr ) ) {
+               if ( !is_array( $arr ) ) {
                        return $arr;
                }
 
-               foreach( $arr as $key => $value ) {
+               foreach ( $arr as $key => $value ) {
                        if ( $value instanceof LikeMatch ) {
                                return array_slice( $arr, 0, $key + 1 );
                        }
index 972adfc..3529d28 100644 (file)
@@ -199,7 +199,7 @@ class Linker {
                        return "<!-- ERROR -->$html";
                }
 
-               if( is_string( $query ) ) {
+               if ( is_string( $query ) ) {
                        // some functions withing core using this still hand over query strings
                        wfDeprecated( __METHOD__ . ' with parameter $query as string (should be array)', '1.20' );
                        $query = wfCgiToArray( $query );
@@ -238,7 +238,7 @@ class Linker {
                # Note: we want the href attribute first, for prettiness.
                $attribs = array( 'href' => self::linkUrl( $target, $query, $options ) );
                if ( in_array( 'forcearticlepath', $options ) && $oldquery ) {
-                       $attribs['href'] = wfAppendQuery( $attribs['href'], wfArrayToCgi( $oldquery ) );
+                       $attribs['href'] = wfAppendQuery( $attribs['href'], $oldquery );
                }
 
                $attribs = array_merge(
@@ -612,7 +612,7 @@ class Linker {
                                $hp['width'] = $file->getWidth( $page );
                        }
 
-                       if ( isset( $fp['thumbnail'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
+                       if ( isset( $fp['thumbnail'] ) || isset( $fp['manualthumb'] ) || isset( $fp['framed'] ) || isset( $fp['frameless'] ) || !$hp['width'] ) {
                                global $wgThumbLimits, $wgThumbUpright;
                                if ( $widthOption === null || !isset( $wgThumbLimits[$widthOption] ) ) {
                                        $widthOption = User::getDefaultOption( 'thumbsize' );
@@ -644,7 +644,7 @@ class Linker {
                        # If a thumbnail width has not been provided, it is set
                        # to the default user option as specified in Language*.php
                        if ( $fp['align'] == '' ) {
-                               if( $parser instanceof Parser ) {
+                               if ( $parser instanceof Parser ) {
                                        $fp['align'] = $parser->getTargetLanguage()->alignEnd();
                                } else {
                                        # backwards compatibility, remove with makeImageLink2()
@@ -786,10 +786,18 @@ class Linker {
                $hp =& $handlerParams;
 
                $page = isset( $hp['page'] ) ? $hp['page'] : false;
-               if ( !isset( $fp['align'] ) ) $fp['align'] = 'right';
-               if ( !isset( $fp['alt'] ) ) $fp['alt'] = '';
-               if ( !isset( $fp['title'] ) ) $fp['title'] = '';
-               if ( !isset( $fp['caption'] ) ) $fp['caption'] = '';
+               if ( !isset( $fp['align'] ) ) {
+                       $fp['align'] = 'right';
+               }
+               if ( !isset( $fp['alt'] ) ) {
+                       $fp['alt'] = '';
+               }
+               if ( !isset( $fp['title'] ) ) {
+                       $fp['title'] = '';
+               }
+               if ( !isset( $fp['caption'] ) ) {
+                       $fp['caption'] = '';
+               }
 
                if ( empty( $hp['width'] ) ) {
                        // Reduce width for upright images when parameter 'upright' is used
@@ -797,6 +805,7 @@ class Linker {
                }
                $thumb = false;
                $noscale = false;
+               $manualthumb = false;
 
                if ( !$exists ) {
                        $outerWidth = $hp['width'] + 2;
@@ -808,6 +817,7 @@ class Linker {
                                        $manual_img = wfFindFile( $manual_title );
                                        if ( $manual_img ) {
                                                $thumb = $manual_img->getUnscaledThumb( $hp );
+                                               $manualthumb = true;
                                        } else {
                                                $exists = false;
                                        }
@@ -838,7 +848,13 @@ class Linker {
                # zoom icon still needs it, so we make a unique query for it. See bug 14771
                $url = $title->getLocalURL( $query );
                if ( $page ) {
-                       $url = wfAppendQuery( $url, 'page=' . urlencode( $page ) );
+                       $url = wfAppendQuery( $url, array( 'page' => $page ) );
+               }
+               if ( $manualthumb &&
+                    !isset( $fp['link-title'] ) &&
+                    !isset( $fp['link-url'] ) &&
+                    !isset( $fp['no-link'] ) ) {
+                       $fp['link-url'] = $url;
                }
 
                $s = "<div class=\"thumb t{$fp['align']}\"><div class=\"thumbinner\" style=\"width:{$outerWidth}px;\">";
@@ -849,7 +865,7 @@ class Linker {
                        $s .= wfMessage( 'thumbnail_error', '' )->escaped();
                        $zoomIcon = '';
                } else {
-                       if ( !$noscale ) {
+                       if ( !$noscale && !$manualthumb ) {
                                self::processResponsiveImages( $file, $thumb, $hp );
                        }
                        $params = array(
@@ -961,17 +977,18 @@ class Linker {
         */
        protected static function getUploadUrl( $destFile, $query = '' ) {
                global $wgUploadMissingFileUrl, $wgUploadNavigationUrl;
-               $q = 'wpDestFile=' . $destFile->getPartialUrl();
-               if ( $query != '' )
+               $q = 'wpDestFile=' . $destFile->getPartialURL();
+               if ( $query != '' ) {
                        $q .= '&' . $query;
+               }
 
                if ( $wgUploadMissingFileUrl ) {
                        return wfAppendQuery( $wgUploadMissingFileUrl, $q );
-               } elseif( $wgUploadNavigationUrl ) {
+               } elseif ( $wgUploadNavigationUrl ) {
                        return wfAppendQuery( $wgUploadNavigationUrl, $q );
                } else {
                        $upload = SpecialPage::getTitleFor( 'Upload' );
-                       return $upload->getLocalUrl( $q );
+                       return $upload->getLocalURL( $q );
                }
        }
 
@@ -1442,8 +1459,9 @@ class Linker {
                                $trail = "";
                        }
                        $linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/';
-                       if ( isset( $match[1][0] ) && $match[1][0] == ':' )
+                       if ( isset( $match[1][0] ) && $match[1][0] == ':' ) {
                                $match[1] = substr( $match[1], 1 );
+                       }
                        list( $inside, $trail ) = self::splitTrail( $trail );
 
                        $linkText = $text;
@@ -1527,7 +1545,7 @@ class Linker {
                                        $nodotdot = substr( $nodotdot, 3 );
                                }
                                if ( $dotdotcount > 0 ) {
-                                       $exploded = explode( '/', $contextTitle->GetPrefixedText() );
+                                       $exploded = explode( '/', $contextTitle->getPrefixedText() );
                                        if ( count( $exploded ) > $dotdotcount ) { # not allowed to go below top level page
                                                $ret = implode( '/', array_slice( $exploded, 0, -$dotdotcount ) );
                                                # / at the end means don't show full path
@@ -1687,13 +1705,14 @@ class Linker {
                $toc = '';
                $lastLevel = 0;
                foreach ( $tree as $section ) {
-                       if ( $section['toclevel'] > $lastLevel )
+                       if ( $section['toclevel'] > $lastLevel ) {
                                $toc .= self::tocIndent();
-                       elseif ( $section['toclevel'] < $lastLevel )
+                       } elseif ( $section['toclevel'] < $lastLevel ) {
                                $toc .= self::tocUnindent(
                                        $lastLevel - $section['toclevel'] );
-                       else
+                       } else {
                                $toc .= self::tocLineEnd();
+                       }
 
                        $toc .= self::tocLine( $section['anchor'],
                                $section['line'], $section['number'],
@@ -1721,8 +1740,8 @@ class Linker {
         */
        public static function makeHeadline( $level, $attribs, $anchor, $html, $link, $legacyAnchor = false ) {
                $ret = "<h$level$attribs"
+                       . "<span class=\"mw-headline\" id=\"$anchor\">$html</span>"
                        . $link
-                       . " <span class=\"mw-headline\" id=\"$anchor\">$html</span>"
                        . "</h$level>";
                if ( $legacyAnchor !== false ) {
                        $ret = "<div id=\"$legacyAnchor\"></div>$ret";
@@ -1887,21 +1906,21 @@ class Linker {
                }
 
                $disableRollbackEditCount = false;
-               if( $wgMiserMode ) {
-                       foreach( $disableRollbackEditCountSpecialPage as $specialPage ) {
-                               if( $context->getTitle()->isSpecial( $specialPage ) ) {
+               if ( $wgMiserMode ) {
+                       foreach ( $disableRollbackEditCountSpecialPage as $specialPage ) {
+                               if ( $context->getTitle()->isSpecial( $specialPage ) ) {
                                        $disableRollbackEditCount = true;
                                        break;
                                }
                        }
                }
 
-               if( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
+               if ( !$disableRollbackEditCount && is_int( $wgShowRollbackEditCount ) && $wgShowRollbackEditCount > 0 ) {
                        if ( !is_numeric( $editCount ) ) {
                                $editCount = self::getRollbackEditCount( $rev, false );
                        }
 
-                       if( $editCount > $wgShowRollbackEditCount ) {
+                       if ( $editCount > $wgShowRollbackEditCount ) {
                                $editCount_output = $context->msg( 'rollbacklinkcount-morethan' )->numParams( $wgShowRollbackEditCount )->parse();
                        } else {
                                $editCount_output = $context->msg( 'rollbacklinkcount' )->numParams( $editCount )->parse();
index d99ae22..4b1b5b8 100644 (file)
@@ -27,7 +27,7 @@
  */
 class LinksUpdate extends SqlDataUpdate {
 
-       // @todo: make members protected, but make sure extensions don't break
+       // @todo make members protected, but make sure extensions don't break
 
        public $mId,         //!< Page ID of the article linked from
                $mTitle,         //!< Title object of the article linked from
@@ -354,7 +354,7 @@ class LinksUpdate extends SqlDataUpdate {
         */
        private function getLinkInsertions( $existing = array() ) {
                $arr = array();
-               foreach( $this->mLinks as $ns => $dbkeys ) {
+               foreach ( $this->mLinks as $ns => $dbkeys ) {
                        $diffs = isset( $existing[$ns] )
                                ? array_diff_key( $dbkeys, $existing[$ns] )
                                : $dbkeys;
@@ -376,7 +376,7 @@ class LinksUpdate extends SqlDataUpdate {
         */
        private function getTemplateInsertions( $existing = array() ) {
                $arr = array();
-               foreach( $this->mTemplates as $ns => $dbkeys ) {
+               foreach ( $this->mTemplates as $ns => $dbkeys ) {
                        $diffs = isset( $existing[$ns] ) ? array_diff_key( $dbkeys, $existing[$ns] ) : $dbkeys;
                        foreach ( $diffs as $dbk => $id ) {
                                $arr[] = array(
@@ -398,7 +398,7 @@ class LinksUpdate extends SqlDataUpdate {
        private function getImageInsertions( $existing = array() ) {
                $arr = array();
                $diffs = array_diff_key( $this->mImages, $existing );
-               foreach( $diffs as $iname => $dummy ) {
+               foreach ( $diffs as $iname => $dummy ) {
                        $arr[] = array(
                                'il_from' => $this->mId,
                                'il_to' => $iname
@@ -415,8 +415,8 @@ class LinksUpdate extends SqlDataUpdate {
        private function getExternalInsertions( $existing = array() ) {
                $arr = array();
                $diffs = array_diff_key( $this->mExternals, $existing );
-               foreach( $diffs as $url => $dummy ) {
-                       foreach( wfMakeUrlIndexes( $url ) as $index ) {
+               foreach ( $diffs as $url => $dummy ) {
+                       foreach ( wfMakeUrlIndexes( $url ) as $index ) {
                                $arr[] = array(
                                        'el_from' => $this->mId,
                                        'el_to' => $url,
@@ -481,7 +481,7 @@ class LinksUpdate extends SqlDataUpdate {
        private function getInterlangInsertions( $existing = array() ) {
                $diffs = array_diff_assoc( $this->mInterlangs, $existing );
                $arr = array();
-               foreach( $diffs as $lang => $title ) {
+               foreach ( $diffs as $lang => $title ) {
                        $arr[] = array(
                                'll_from' => $this->mId,
                                'll_lang' => $lang,
@@ -517,7 +517,7 @@ class LinksUpdate extends SqlDataUpdate {
         */
        private function getInterwikiInsertions( $existing = array() ) {
                $arr = array();
-               foreach( $this->mInterwikis as $prefix => $dbkeys ) {
+               foreach ( $this->mInterwikis as $prefix => $dbkeys ) {
                        $diffs = isset( $existing[$prefix] ) ? array_diff_key( $dbkeys, $existing[$prefix] ) : $dbkeys;
                        foreach ( $diffs as $dbk => $id ) {
                                $arr[] = array(
@@ -840,14 +840,14 @@ class LinksDeletionUpdate extends SqlDataUpdate {
                $id = $this->mPage->getId();
 
                # Delete restrictions for it
-               $this->mDb->delete( 'page_restrictions', array ( 'pr_page' => $id ), __METHOD__ );
+               $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;
+                       $cats[] = $row->cl_to;
                }
 
                $this->mPage->updateCategoryCounts( array(), $cats );
diff --git a/includes/MWCryptRand.php b/includes/MWCryptRand.php
new file mode 100644 (file)
index 0000000..bac018e
--- /dev/null
@@ -0,0 +1,497 @@
+<?php
+/**
+ * A cryptographic random generator class used for generating secret keys
+ *
+ * This is based in part on Drupal code as well as what we used in our own code
+ * prior to introduction of this 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
+ *
+ * @author Daniel Friesen
+ * @file
+ */
+
+class MWCryptRand {
+
+       /**
+        * Minimum number of iterations we want to make in our drift calculations.
+        */
+       const MIN_ITERATIONS = 1000;
+
+       /**
+        * Number of milliseconds we want to spend generating each separate byte
+        * of the final generated bytes.
+        * This is used in combination with the hash length to determine the duration
+        * we should spend doing drift calculations.
+        */
+       const MSEC_PER_BYTE = 0.5;
+
+       /**
+        * Singleton instance for public use
+        */
+       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.
+        */
+       protected $strong = null;
+
+       /**
+        * Initialize an initial random state based off of whatever we can find
+        */
+       protected function initialRandomState() {
+               // $_SERVER contains a variety of unstable user and system specific information
+               // It'll vary a little with each page, and vary even more with separate users
+               // It'll also vary slightly across different machines
+               $state = serialize( $_SERVER );
+
+               // To try vary the system information of the state a bit more
+               // by including the system's hostname into the state
+               $state .= wfHostname();
+
+               // Try to gather a little entropy from the different php rand sources
+               $state .= rand() . uniqid( mt_rand(), true );
+
+               // Include some information about the filesystem's current state in the random state
+               $files = array();
+
+               // We know this file is here so grab some info about ourselves
+               $files[] = __FILE__;
+
+               // We must also have a parent folder, and with the usual file structure, a grandparent
+               $files[] = __DIR__;
+               $files[] = dirname( __DIR__ );
+
+               // The config file is likely the most often edited file we know should be around
+               // so include its stat info into the state.
+               // The constant with its location will almost always be defined, as WebStart.php defines
+               // MW_CONFIG_FILE to $IP/LocalSettings.php unless being configured with MW_CONFIG_CALLBACK (eg. the installer)
+               if ( defined( 'MW_CONFIG_FILE' ) ) {
+                       $files[] = MW_CONFIG_FILE;
+               }
+
+               foreach ( $files as $file ) {
+                       wfSuppressWarnings();
+                       $stat = stat( $file );
+                       wfRestoreWarnings();
+                       if ( $stat ) {
+                               // stat() duplicates data into numeric and string keys so kill off all the numeric ones
+                               foreach ( $stat as $k => $v ) {
+                                       if ( is_numeric( $k ) ) {
+                                               unset( $k );
+                                       }
+                               }
+                               // The absolute filename itself will differ from install to install so don't leave it out
+                               if ( ( $path = realpath( $file ) ) !== false ) {
+                                       $state .= $path;
+                               } else {
+                                       $state .= $file;
+                               }
+                               $state .= implode( '', $stat );
+                       } else {
+                               // The fact that the file isn't there is worth at least a
+                               // minuscule amount of entropy.
+                               $state .= '0';
+                       }
+               }
+
+               // Try and make this a little more unstable by including the varying process
+               // id of the php process we are running inside of if we are able to access it
+               if ( function_exists( 'getmypid' ) ) {
+                       $state .= getmypid();
+               }
+
+               // If available try to increase the instability of the data by throwing in
+               // the precise amount of memory that we happen to be using at the moment.
+               if ( function_exists( 'memory_get_usage' ) ) {
+                       $state .= memory_get_usage( true );
+               }
+
+               // It's mostly worthless but throw the wiki's id into the data for a little more variance
+               $state .= wfWikiID();
+
+               // If we have a secret key or proxy key set then throw it into the state as well
+               global $wgSecretKey, $wgProxyKey;
+               if ( $wgSecretKey ) {
+                       $state .= $wgSecretKey;
+               } elseif ( $wgProxyKey ) {
+                       $state .= $wgProxyKey;
+               }
+
+               return $state;
+       }
+
+       /**
+        * Randomly hash data while mixing in clock drift data for randomness
+        *
+        * @param string $data The data to randomly hash.
+        * @return String The hashed bytes
+        * @author Tim Starling
+        */
+       protected function driftHash( $data ) {
+               // Minimum number of iterations (to avoid slow operations causing the 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();
+               // Create a buffer to use to trigger memory operations
+               $bufLength = 10000000;
+               $buffer = str_repeat( ' ', $bufLength );
+               $bufPos = 0;
+
+               // Iterate for $duration seconds or at least $minIterations number of iterations
+               $iterations = 0;
+               $startTime = microtime( true );
+               $currentTime = $startTime;
+               while ( $iterations < $minIterations || $currentTime - $startTime < $duration ) {
+                       // Trigger some memory writing to trigger some bus activity
+                       // This may create variance in the time between iterations
+                       $bufPos = ( $bufPos + 13 ) % $bufLength;
+                       $buffer[$bufPos] = ' ';
+                       // Add the drift between this iteration and the last in as entropy
+                       $nextTime = microtime( true );
+                       $delta = (int)( ( $nextTime - $currentTime ) * 1000000 );
+                       $data .= $delta;
+                       // Every 100 iterations hash the data and entropy
+                       if ( $iterations % 100 === 0 ) {
+                               $data = sha1( $data );
+                       }
+                       $currentTime = $nextTime;
+                       $iterations++;
+               }
+               $timeTaken = $currentTime - $startTime;
+               $data = $this->hash( $data );
+
+               wfDebug( __METHOD__ . ": Clock drift calculation " .
+                       "(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
+                       "iterations=$iterations, " .
+                       "time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)\n" );
+               return $data;
+       }
+
+       /**
+        * Return a rolling random state initially build using data from unstable sources
+        * @return string A new weak random state
+        */
+       protected function randomState() {
+               static $state = null;
+               if ( is_null( $state ) ) {
+                       // 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() );
+               }
+               // Generate a new random state based on the initial random state or previous
+               // random state by combining it with clock drift
+               $state = $this->driftHash( $state );
+               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 $data string
+        * @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 $data string
+        * @param $key string
+        * @return String A raw hash of the data
+        */
+       protected function hmac( $data, $key ) {
+               return hash_hmac( $this->hashAlgo(), $data, $key, true );
+       }
+
+       /**
+        * @see self::wasStrong()
+        */
+       public function realWasStrong() {
+               if ( is_null( $this->strong ) ) {
+                       throw new MWException( __METHOD__ . ' called before generation of random data' );
+               }
+               return $this->strong;
+       }
+
+       /**
+        * @see self::generate()
+        */
+       public function realGenerate( $bytes, $forceStrong = false ) {
+               wfProfileIn( __METHOD__ );
+
+               wfDebug( __METHOD__ . ": Generating cryptographic random bytes for " . wfGetAllCallers( 5 ) . "\n" );
+
+               $bytes = floor( $bytes );
+               static $buffer = '';
+               if ( is_null( $this->strong ) ) {
+                       // Set strength to false initially until we know what source data is coming from
+                       $this->strong = true;
+               }
+
+               if ( strlen( $buffer ) < $bytes ) {
+                       // If available make use of mcrypt_create_iv URANDOM source to generate randomness
+                       // On unix-like systems this reads from /dev/urandom but does it without any buffering
+                       // and bypasses openbasedir restrictions, so it's preferable to reading directly
+                       // On Windows starting in PHP 5.3.0 Windows' native CryptGenRandom is used to generate
+                       // entropy so this is also preferable to just trying to read urandom because it may work
+                       // on Windows systems as well.
+                       if ( function_exists( 'mcrypt_create_iv' ) ) {
+                               wfProfileIn( __METHOD__ . '-mcrypt' );
+                               $rem = $bytes - strlen( $buffer );
+                               $iv = mcrypt_create_iv( $rem, MCRYPT_DEV_URANDOM );
+                               if ( $iv === false ) {
+                                       wfDebug( __METHOD__ . ": mcrypt_create_iv returned false.\n" );
+                               } else {
+                                       $buffer .= $iv;
+                                       wfDebug( __METHOD__ . ": mcrypt_create_iv generated " . strlen( $iv ) . " bytes of randomness.\n" );
+                               }
+                               wfProfileOut( __METHOD__ . '-mcrypt' );
+                       }
+               }
+
+               if ( strlen( $buffer ) < $bytes ) {
+                       // If available make use of openssl's random_pseudo_bytes method to attempt to generate randomness.
+                       // However don't do this on Windows with PHP < 5.3.4 due to a bug:
+                       // http://stackoverflow.com/questions/1940168/openssl-random-pseudo-bytes-is-slow-php
+                       // http://git.php.net/?p=php-src.git;a=commitdiff;h=cd62a70863c261b07f6dadedad9464f7e213cad5
+                       if ( function_exists( 'openssl_random_pseudo_bytes' )
+                               && ( !wfIsWindows() || version_compare( PHP_VERSION, '5.3.4', '>=' ) )
+                       ) {
+                               wfProfileIn( __METHOD__ . '-openssl' );
+                               $rem = $bytes - strlen( $buffer );
+                               $openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
+                               if ( $openssl_bytes === false ) {
+                                       wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes returned false.\n" );
+                               } else {
+                                       $buffer .= $openssl_bytes;
+                                       wfDebug( __METHOD__ . ": openssl_random_pseudo_bytes generated " . strlen( $openssl_bytes ) . " bytes of " . ( $openssl_strong ? "strong" : "weak" ) . " randomness.\n" );
+                               }
+                               if ( strlen( $buffer ) >= $bytes ) {
+                                       // openssl tells us if the random source was strong, if some of our data was generated
+                                       // using it use it's say on whether the randomness is strong
+                                       $this->strong = !!$openssl_strong;
+                               }
+                               wfProfileOut( __METHOD__ . '-openssl' );
+                       }
+               }
+
+               // Only read from urandom if we can control the buffer size or were passed forceStrong
+               if ( strlen( $buffer ) < $bytes && ( function_exists( 'stream_set_read_buffer' ) || $forceStrong ) ) {
+                       wfProfileIn( __METHOD__ . '-fopen-urandom' );
+                       $rem = $bytes - strlen( $buffer );
+                       if ( !function_exists( 'stream_set_read_buffer' ) && $forceStrong ) {
+                               wfDebug( __METHOD__ . ": Was forced to read from /dev/urandom without control over the buffer size.\n" );
+                       }
+                       // /dev/urandom is generally considered the best possible commonly
+                       // available random source, and is available on most *nix systems.
+                       wfSuppressWarnings();
+                       $urandom = fopen( "/dev/urandom", "rb" );
+                       wfRestoreWarnings();
+
+                       // Attempt to read all our random data from urandom
+                       // php's fread always does buffered reads based on the stream's chunk_size
+                       // so in reality it will usually read more than the amount of data we're
+                       // asked for and not storing that risks depleting the system's random pool.
+                       // If stream_set_read_buffer is available set the chunk_size to the amount
+                       // of data we need. Otherwise read 8k, php's default chunk_size.
+                       if ( $urandom ) {
+                               // php's default chunk_size is 8k
+                               $chunk_size = 1024 * 8;
+                               if ( function_exists( 'stream_set_read_buffer' ) ) {
+                                       // If possible set the chunk_size to the amount of data we need
+                                       stream_set_read_buffer( $urandom, $rem );
+                                       $chunk_size = $rem;
+                               }
+                               $random_bytes = fread( $urandom, max( $chunk_size, $rem ) );
+                               $buffer .= $random_bytes;
+                               fclose( $urandom );
+                               wfDebug( __METHOD__ . ": /dev/urandom generated " . strlen( $random_bytes ) . " bytes of randomness.\n" );
+                               if ( strlen( $buffer ) >= $bytes ) {
+                                       // urandom is always strong, set to true if all our data was generated using it
+                                       $this->strong = true;
+                               }
+                       } else {
+                               wfDebug( __METHOD__ . ": /dev/urandom could not be opened.\n" );
+                       }
+                       wfProfileOut( __METHOD__ . '-fopen-urandom' );
+               }
+
+               // If we cannot use or generate enough data from a secure source
+               // use this loop to generate a good set of pseudo random data.
+               // This works by initializing a random state using a pile of unstable data
+               // and continually shoving it through a hash along with a variable salt.
+               // We hash the random state with more salt to avoid the state from leaking
+               // out and being used to predict the /randomness/ that follows.
+               if ( strlen( $buffer ) < $bytes ) {
+                       wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" );
+               }
+               while ( strlen( $buffer ) < $bytes ) {
+                       wfProfileIn( __METHOD__ . '-fallback' );
+                       $buffer .= $this->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;
+                       wfProfileOut( __METHOD__ . '-fallback' );
+               }
+
+               // Once the buffer has been filled up with enough random data to fulfill
+               // the request shift off enough data to handle the request and leave the
+               // unused portion left inside the buffer for the next request for random data
+               $generated = substr( $buffer, 0, $bytes );
+               $buffer = substr( $buffer, $bytes );
+
+               wfDebug( __METHOD__ . ": " . strlen( $buffer ) . " bytes of randomness leftover in the buffer.\n" );
+
+               wfProfileOut( __METHOD__ );
+               return $generated;
+       }
+
+       /**
+        * @see self::generateHex()
+        */
+       public function realGenerateHex( $chars, $forceStrong = false ) {
+               // hex strings are 2x the length of raw binary so we divide the length in half
+               // odd numbers will result in a .5 that leads the generate() being 1 character
+               // short, so we use ceil() to ensure that we always have enough bytes
+               $bytes = ceil( $chars / 2 );
+               // Generate the data and then convert it to a hex string
+               $hex = bin2hex( $this->generate( $bytes, $forceStrong ) );
+               // A bit of paranoia here, the caller asked for a specific length of string
+               // here, and it's possible (eg when given an odd number) that we may actually
+               // have at least 1 char more than they asked for. Just in case they made this
+               // call intending to insert it into a database that does truncation we don't
+               // want to give them too much and end up with their database and their live
+               // code having two different values because part of what we gave them is truncated
+               // hence, we strip out any run of characters longer than what we were asked for.
+               return substr( $hex, 0, $chars );
+       }
+
+       /** Publicly exposed static methods **/
+
+       /**
+        * Return a singleton instance of MWCryptRand
+        * @return MWCryptRand
+        */
+       protected static function singleton() {
+               if ( is_null( self::$singleton ) ) {
+                       self::$singleton = new self;
+               }
+               return self::$singleton;
+       }
+
+       /**
+        * Return a boolean indicating whether or not the source used for cryptographic
+        * random bytes generation in the previously run generate* call
+        * was cryptographically strong.
+        *
+        * @return bool Returns true if the source was strong, false if not.
+        */
+       public static function wasStrong() {
+               return self::singleton()->realWasStrong();
+       }
+
+       /**
+        * Generate a run of (ideally) cryptographically random data and return
+        * it in raw binary form.
+        * You can use MWCryptRand::wasStrong() if you wish to know if the source used
+        * was cryptographically strong.
+        *
+        * @param int $bytes the number of bytes of random data to generate
+        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
+        *                          strong sources of entropy even if reading from them may steal
+        *                          more entropy from the system than optimal.
+        * @return String Raw binary random data
+        */
+       public static function generate( $bytes, $forceStrong = false ) {
+               return self::singleton()->realGenerate( $bytes, $forceStrong );
+       }
+
+       /**
+        * Generate a run of (ideally) cryptographically random data and return
+        * it in hexadecimal string format.
+        * You can use MWCryptRand::wasStrong() if you wish to know if the source used
+        * was cryptographically strong.
+        *
+        * @param int $chars the number of hex chars of random data to generate
+        * @param bool $forceStrong Pass true if you want generate to prefer cryptographically
+        *                          strong sources of entropy even if reading from them may steal
+        *                          more entropy from the system than optimal.
+        * @return String Hexadecimal random data
+        */
+       public static function generateHex( $chars, $forceStrong = false ) {
+               return self::singleton()->realGenerateHex( $chars, $forceStrong );
+       }
+
+}
index 36fcc30..3eaa8fe 100644 (file)
@@ -28,15 +28,15 @@ class MWFunction {
         * @throws MWException
         */
        protected static function cleanCallback( $callback ) {
-               if( is_string( $callback ) ) {
+               if ( is_string( $callback ) ) {
                        if ( strpos( $callback, '::' ) !== false ) {
                                // PHP 5.1 cannot use call_user_func( 'Class::Method' )
                                // It can only handle only call_user_func( array( 'Class', 'Method' ) )
-                               $callback = explode( '::', $callback, 2);
+                               $callback = explode( '::', $callback, 2 );
                        }
                }
 
-               if( count( $callback ) == 2 && $callback[0] == 'self' || $callback[0] == 'parent' ) {
+               if ( count( $callback ) == 2 && $callback[0] == 'self' || $callback[0] == 'parent' ) {
                        throw new MWException( 'MWFunction cannot call self::method() or parent::method()' );
                }
 
@@ -74,7 +74,7 @@ class MWFunction {
         * @return object
         */
        public static function newObj( $class, $args = array() ) {
-               if( !count( $args ) ) {
+               if ( !count( $args ) ) {
                        return new $class;
                }
 
index 7b66924..ae7f8fe 100644 (file)
@@ -138,6 +138,8 @@ class MagicWord {
                'numberofactiveusers',
                'numberofpages',
                'currentversion',
+               'rootpagename',
+               'rootpagenamee',
                'basepagename',
                'basepagenamee',
                'currenttimestamp',
@@ -149,7 +151,7 @@ class MagicWord {
        );
 
        /* Array of caching hints for ParserCache */
-       static public $mCacheTTLs = array (
+       static public $mCacheTTLs = array(
                'currentmonth' => 86400,
                'currentmonth1' => 86400,
                'currentmonthname' => 86400,
@@ -309,6 +311,7 @@ class MagicWord {
                $wgContLang->getMagic( $this );
                if ( !$this->mSynonyms ) {
                        $this->mSynonyms = array( 'dkjsagfjsgashfajsh' );
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Error: invalid magic word '$id'" );
                        #wfDebugLog( 'exception', "Error: invalid magic word '$id'\n" );
                }
@@ -326,9 +329,10 @@ class MagicWord {
                usort( $synonyms, array( $this, 'compareStringLength' ) );
 
                $escSyn = array();
-               foreach ( $synonyms as $synonym )
+               foreach ( $synonyms as $synonym ) {
                        // In case a magic word contains /, like that's going to happen;)
                        $escSyn[] = preg_quote( $synonym, '/' );
+               }
                $this->mBaseRegex = implode( '|', $escSyn );
 
                $case = $this->mCaseSensitive ? '' : 'iu';
@@ -381,8 +385,9 @@ class MagicWord {
         * @return string
         */
        function getRegexCase() {
-               if ( $this->mRegex === '' )
+               if ( $this->mRegex === '' ) {
                        $this->initRegex();
+               }
 
                return $this->mCaseSensitive ? '' : 'iu';
        }
@@ -509,7 +514,7 @@ class MagicWord {
         */
        function replace( $replacement, $subject, $limit = -1 ) {
                $res = preg_replace( $this->getRegex(), StringUtils::escapeRegexReplacement( $replacement ), $subject, $limit );
-               $this->mModified = !($res === $subject);
+               $this->mModified = $res !== $subject;
                return $res;
        }
 
@@ -525,7 +530,7 @@ class MagicWord {
         */
        function substituteCallback( $text, $callback ) {
                $res = preg_replace_callback( $this->getVariableRegex(), $callback, $text );
-               $this->mModified = !($res === $text);
+               $this->mModified = $res !== $text;
                return $res;
        }
 
@@ -597,14 +602,14 @@ class MagicWord {
        function replaceMultiple( $magicarr, $subject, &$result ) {
                $search = array();
                $replace = array();
-               foreach( $magicarr as $id => $replacement ) {
+               foreach ( $magicarr as $id => $replacement ) {
                        $mw = MagicWord::get( $id );
                        $search[] = $mw->getRegex();
                        $replace[] = $replacement;
                }
 
                $result = preg_replace( $search, $replace, $subject );
-               return !($result === $subject);
+               return $result !== $subject;
        }
 
        /**
index b4376f4..14495f2 100644 (file)
@@ -29,7 +29,7 @@
 class MappedIterator implements Iterator {
        /** @var Iterator */
        protected $baseIterator;
-       /** @var Closure */
+       /** @var callable */
        protected $vCallback;
 
        /**
@@ -39,10 +39,10 @@ class MappedIterator implements Iterator {
         * The keys of the base iterator are reused verbatim.
         *
         * @param Iterator|Array $iter
-        * @param Closure $vCallback
+        * @param callable $vCallback
         * @throws MWException
         */
-    public function __construct( $iter, Closure $vCallback ) {
+       public function __construct( $iter, $vCallback ) {
                if ( is_array( $iter ) ) {
                        $this->baseIterator = new ArrayIterator( $iter );
                } elseif ( $iter instanceof Iterator ) {
@@ -51,7 +51,7 @@ class MappedIterator implements Iterator {
                        throw new MWException( "Invalid base iterator provided." );
                }
                $this->vCallback = $vCallback;
-    }
+       }
 
        /**
         * @return void
index 5719f83..de0b17e 100644 (file)
@@ -326,7 +326,7 @@ class Message {
                if ( isset( $params[0] ) && is_array( $params[0] ) ) {
                        $params = $params[0];
                }
-               foreach( $params as $param ) {
+               foreach ( $params as $param ) {
                        $this->parameters[] = self::rawParam( $param );
                }
                return $this;
@@ -344,7 +344,7 @@ class Message {
                if ( isset( $params[0] ) && is_array( $params[0] ) ) {
                        $params = $params[0];
                }
-               foreach( $params as $param ) {
+               foreach ( $params as $param ) {
                        $this->parameters[] = self::numParam( $param );
                }
                return $this;
@@ -377,7 +377,7 @@ class Message {
                if ( $lang instanceof Language || $lang instanceof StubUserLang ) {
                        $this->language = $lang;
                } elseif ( is_string( $lang ) ) {
-                       if( $this->language->getCode() != $lang ) {
+                       if ( $this->language->getCode() != $lang ) {
                                $this->language = Language::factory( $lang );
                        }
                } else {
@@ -484,17 +484,17 @@ class Message {
                $string = $this->replaceParameters( $string, 'before' );
 
                # Maybe transform using the full parser
-               if( $this->format === 'parse' ) {
+               if ( $this->format === 'parse' ) {
                        $string = $this->parseText( $string );
                        $m = array();
-                       if( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
+                       if ( preg_match( '/^<p>(.*)\n?<\/p>\n?$/sU', $string, $m ) ) {
                                $string = $m[1];
                        }
-               } elseif( $this->format === 'block-parse' ) {
+               } elseif ( $this->format === 'block-parse' ) {
                        $string = $this->parseText( $string );
-               } elseif( $this->format === 'text' ) {
+               } elseif ( $this->format === 'text' ) {
                        $string = $this->transformText( $string );
-               } elseif( $this->format === 'escaped' ) {
+               } elseif ( $this->format === 'escaped' ) {
                        $string = $this->transformText( $string );
                        $string = htmlspecialchars( $string, ENT_QUOTES, 'UTF-8', false );
                }
@@ -641,10 +641,10 @@ class Message {
         */
        protected function replaceParameters( $message, $type = 'before' ) {
                $replacementKeys = array();
-               foreach( $this->parameters as $n => $param ) {
+               foreach ( $this->parameters as $n => $param ) {
                        list( $paramType, $value ) = $this->extractParam( $param );
                        if ( $type === $paramType ) {
-                               $replacementKeys['$' . ($n + 1)] = $value;
+                               $replacementKeys['$' . ( $n + 1 )] = $value;
                        }
                }
                $message = strtr( $message, $replacementKeys );
@@ -760,7 +760,7 @@ class RawMessage extends Message {
         */
        public function fetchMessage() {
                // Just in case the message is unset somewhere.
-               if( !isset( $this->message ) ) {
+               if ( !isset( $this->message ) ) {
                        $this->message = $this->key;
                }
                return $this->message;
index 0b8014a..cd77ef8 100644 (file)
@@ -42,7 +42,7 @@ abstract class RdfMetaData {
                $httpaccept = isset( $_SERVER['HTTP_ACCEPT'] ) ? $_SERVER['HTTP_ACCEPT'] : null;
                $rdftype = wfNegotiateType( wfAcceptToPrefs( $httpaccept ), wfAcceptToPrefs( self::RDF_TYPE_PREFS ) );
 
-               if( !$rdftype ) {
+               if ( !$rdftype ) {
                        throw new HttpError( 406, wfMessage( 'notacceptable' ) );
                }
 
@@ -70,7 +70,7 @@ abstract class RdfMetaData {
                $lastEditor = User::newFromId( $this->mArticle->getUser() );
                $this->person( 'creator', $lastEditor );
 
-               foreach( $this->mArticle->getContributors() as $user ) {
+               foreach ( $this->mArticle->getContributors() as $user ) {
                        $this->person( 'contributor', $user );
                }
 
@@ -89,13 +89,13 @@ abstract class RdfMetaData {
        }
 
        protected function pageOrString( $name, $page, $str ) {
-               if( $page instanceof Title ) {
+               if ( $page instanceof Title ) {
                        $nt = $page;
                } else {
                        $nt = Title::newFromText( $page );
                }
 
-               if( !$nt || $nt->getArticleID() == 0 ) {
+               if ( !$nt || $nt->getArticleID() == 0 ) {
                        $this->element( $name, $str );
                } else {
                        $this->page( $name, $nt );
@@ -107,7 +107,7 @@ abstract class RdfMetaData {
         * @param $title Title
         */
        protected function page( $name, $title ) {
-               $this->url( $name, $title->getFullUrl() );
+               $this->url( $name, $title->getFullURL() );
        }
 
        protected function url( $name, $url ) {
@@ -116,11 +116,11 @@ abstract class RdfMetaData {
        }
 
        protected function person( $name, User $user ) {
-               if( $user->isAnon() ) {
+               if ( $user->isAnon() ) {
                        $this->element( $name, wfMessage( 'anonymous' )->numParams( 1 )->text() );
                } else {
                        $real = $user->getRealName();
-                       if( $real ) {
+                       if ( $real ) {
                                $this->element( $name, $real );
                        } else {
                                $userName = $user->getName();
@@ -140,12 +140,12 @@ abstract class RdfMetaData {
        protected function rights() {
                global $wgRightsPage, $wgRightsUrl, $wgRightsText;
 
-               if( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) )
+               if ( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) )
                        && ( $nt->getArticleID() != 0 ) ) {
                        $this->page( 'rights', $nt );
-               } elseif( $wgRightsUrl ) {
+               } elseif ( $wgRightsUrl ) {
                        $this->url( 'rights', $wgRightsUrl );
-               } elseif( $wgRightsText ) {
+               } elseif ( $wgRightsText ) {
                        $this->element( 'rights', $wgRightsText );
                }
        }
@@ -153,11 +153,11 @@ abstract class RdfMetaData {
        protected function getTerms( $url ) {
                global $wgLicenseTerms;
 
-               if( $wgLicenseTerms ) {
+               if ( $wgLicenseTerms ) {
                        return $wgLicenseTerms;
                } else {
                        $known = $this->getKnownLicenses();
-                       if( isset( $known[$url] ) ) {
+                       if ( isset( $known[$url] ) ) {
                                return $known[$url];
                        } else {
                                return array();
@@ -173,7 +173,7 @@ abstract class RdfMetaData {
 
                foreach ( $ccVersions as $version ) {
                        foreach ( $ccLicenses as $license ) {
-                               if( $version == '2.0' && substr( $license, 0, 2 ) != 'by' ) {
+                               if ( $version == '2.0' && substr( $license, 0, 2 ) != 'by' ) {
                                        # 2.0 dropped the non-attribs licenses
                                        continue;
                                }
index edabd54..44fafca 100644 (file)
@@ -39,7 +39,7 @@
  * appending MM_WELL_KNOWN_MIME_TYPES behind $wgMimeTypeFile, but who knows
  * what will break? In practice this probably isn't a problem anyway -- Bryan)
  */
-define('MM_WELL_KNOWN_MIME_TYPES', <<<END_STRING
+define( 'MM_WELL_KNOWN_MIME_TYPES', <<<END_STRING
 application/ogg ogx ogg ogm ogv oga spx
 application/pdf pdf
 application/vnd.oasis.opendocument.chart odc
@@ -91,7 +91,7 @@ END_STRING
  * An extensive list of well known mime types is provided by
  * the file mime.info in the includes directory.
  */
-define('MM_WELL_KNOWN_MIME_INFO', <<<END_STRING
+define( 'MM_WELL_KNOWN_MIME_INFO', <<<END_STRING
 application/pdf [OFFICE]
 application/vnd.oasis.opendocument.chart [OFFICE]
 application/vnd.oasis.opendocument.chart-template [OFFICE]
@@ -231,7 +231,7 @@ class MimeMagic {
                        }
 
                        $mime = substr( $s, 0, $i );
-                       $ext = trim( substr( $s, $i+1 ) );
+                       $ext = trim( substr( $s, $i + 1 ) );
 
                        if ( empty( $ext ) ) {
                                continue;
@@ -432,7 +432,7 @@ class MimeMagic {
                $ext = explode( ' ', $ext );
 
                $extension = strtolower( $extension );
-               return  in_array( $extension, $ext );
+               return in_array( $extension, $ext );
        }
 
        /**
@@ -560,7 +560,7 @@ class MimeMagic {
 
                $mime = $this->doGuessMimeType( $file, $ext );
 
-               if( !$mime ) {
+               if ( !$mime ) {
                        wfDebug( __METHOD__ . ": internal type detection failed for $file (.$ext)...\n" );
                        $mime = $this->detectMimeType( $file, $ext );
                }
@@ -587,7 +587,7 @@ class MimeMagic {
                $f = fopen( $file, 'rt' );
                wfRestoreWarnings();
 
-               if( !$f ) {
+               if ( !$f ) {
                        return 'unknown/unknown';
                }
                $head = fread( $f, 1024 );
@@ -628,7 +628,7 @@ class MimeMagic {
                        $doctype = strpos( $head, "\x42\x82" );
                        if ( $doctype ) {
                                // Next byte is datasize, then data (sizes larger than 1 byte are very stupid muxers)
-                               $data = substr( $head, $doctype+3, 8 );
+                               $data = substr( $head, $doctype + 3, 8 );
                                if ( strncmp( $data, "matroska", 8 ) == 0 ) {
                                        wfDebug( __METHOD__ . ": recognized file as video/x-matroska\n" );
                                        return "video/x-matroska";
@@ -642,7 +642,7 @@ class MimeMagic {
                }
 
                /* Look for WebP */
-               if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8), "WEBPVP8 ", 8 ) == 0 ) {
+               if ( strncmp( $head, "RIFF", 4 ) == 0 && strncmp( substr( $head, 8, 8 ), "WEBPVP8 ", 8 ) == 0 ) {
                        wfDebug( __METHOD__ . ": recognized file as image/webp\n" );
                        return "image/webp";
                }
@@ -689,11 +689,11 @@ class MimeMagic {
                $script_type = null;
 
                # detect by shebang
-               if ( substr( $head, 0, 2) == "#!" ) {
+               if ( substr( $head, 0, 2 ) == "#!" ) {
                        $script_type = "ASCII";
-               } elseif ( substr( $head, 0, 5) == "\xef\xbb\xbf#!" ) {
+               } elseif ( substr( $head, 0, 5 ) == "\xef\xbb\xbf#!" ) {
                        $script_type = "UTF-8";
-               } elseif ( substr( $head, 0, 7) == "\xfe\xff\x00#\x00!" ) {
+               } elseif ( substr( $head, 0, 7 ) == "\xfe\xff\x00#\x00!" ) {
                        $script_type = "UTF-16BE";
                } elseif ( substr( $head, 0, 7 ) == "\xff\xfe#\x00!" ) {
                        $script_type = "UTF-16LE";
@@ -705,8 +705,8 @@ class MimeMagic {
                                $pack = array( 'UTF-16BE' => 'n*', 'UTF-16LE' => 'v*' );
                                $chars = unpack( $pack[$script_type], substr( $head, 2 ) );
                                $head = '';
-                               foreach( $chars as $codepoint ) {
-                                       if( $codepoint < 128 ) {
+                               foreach ( $chars as $codepoint ) {
+                                       if ( $codepoint < 128 ) {
                                                $head .= chr( $codepoint );
                                        } else {
                                                $head .= '?';
@@ -733,7 +733,7 @@ class MimeMagic {
                $gis = getimagesize( $file );
                wfRestoreWarnings();
 
-               if( $gis && isset( $gis['mime'] ) ) {
+               if ( $gis && isset( $gis['mime'] ) ) {
                        $mime = $gis['mime'];
                        wfDebug( __METHOD__ . ": getimagesize detected $file as $mime\n" );
                        return $mime;
@@ -741,7 +741,7 @@ class MimeMagic {
 
                // Also test DjVu
                $deja = new DjVuImage( $file );
-               if( $deja->isValid() ) {
+               if ( $deja->isValid() ) {
                        wfDebug( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
                        return 'image/vnd.djvu';
                }
@@ -763,7 +763,7 @@ class MimeMagic {
         * @return string
         */
        function detectZipType( $header, $tail = null, $ext = false ) {
-               if( $ext ) { # TODO: remove $ext param
+               if ( $ext ) { # TODO: remove $ext param
                        wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. " .
                                "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
                }
@@ -804,7 +804,7 @@ class MimeMagic {
                                 * These mime's are stored in the database, where we don't really want
                                 * x-opc+zip, because we use it only for internal purposes
                                 */
-                               if ( $this->isMatchingExtension( $ext, $mime) ) {
+                               if ( $this->isMatchingExtension( $ext, $mime ) ) {
                                        /* A known file extension for an OPC file,
                                         * find the proper mime type for that file extension
                                         */
@@ -815,12 +815,12 @@ class MimeMagic {
                        }
                        wfDebug( __METHOD__ . ": detected an Open Packaging Conventions archive: $mime\n" );
                } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
-                               ($headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
+                               ( $headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
                                preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
-                       if ( substr( $header, 512, 4) == "\xEC\xA5\xC1\x00" ) {
+                       if ( substr( $header, 512, 4 ) == "\xEC\xA5\xC1\x00" ) {
                                $mime = "application/msword";
                        }
-                       switch( substr( $header, 512, 6) ) {
+                       switch ( substr( $header, 512, 6 ) ) {
                                case "\xEC\xA5\xC1\x00\x0E\x00":
                                case "\xEC\xA5\xC1\x00\x1C\x00":
                                case "\xEC\xA5\xC1\x00\x43\x00":
@@ -876,9 +876,8 @@ class MimeMagic {
 
                $m = null;
                if ( $wgMimeDetectorCommand ) {
-                       // @todo FIXME: Use wfShellExec
-                       $fn = wfEscapeShellArg( $file );
-                       $m = `$wgMimeDetectorCommand $fn`;
+                       $args = wfEscapeShellArg( $file );
+                       $m = wfShellExec( "$wgMimeDetectorCommand $args" );
                } elseif ( function_exists( "finfo_open" ) && function_exists( "finfo_file" ) ) {
 
                        # This required the fileinfo extension by PECL,
@@ -897,7 +896,7 @@ class MimeMagic {
                                $m = finfo_file( $mime_magic_resource, $file );
                                finfo_close( $mime_magic_resource );
                        } else {
-                               wfDebug( __METHOD__ . ": finfo_open failed on ".FILEINFO_MIME."!\n" );
+                               wfDebug( __METHOD__ . ": finfo_open failed on " . FILEINFO_MIME . "!\n" );
                        }
                } elseif ( function_exists( "mime_content_type" ) ) {
 
@@ -935,7 +934,7 @@ class MimeMagic {
                        $ext = strtolower( $i ? substr( $file, $i + 1 ) : '' );
                }
                if ( $ext ) {
-                       if( $this->isRecognizableExtension( $ext ) ) {
+                       if ( $this->isRecognizableExtension( $ext ) ) {
                                wfDebug( __METHOD__ . ": refusing to guess mime type for .$ext file, we should have recognized it\n" );
                        } else {
                                $m = $this->guessTypesForExtension( $ext );
@@ -968,12 +967,12 @@ class MimeMagic {
         * @return (int?string?) a value to be used with the MEDIATYPE_xxx constants.
         */
        function getMediaType( $path = null, $mime = null ) {
-               if( !$mime && !$path ) {
+               if ( !$mime && !$path ) {
                        return MEDIATYPE_UNKNOWN;
                }
 
                // If mime type is unknown, guess it
-               if( !$mime ) {
+               if ( !$mime ) {
                        $mime = $this->guessMimeType( $path, false );
                }
 
@@ -983,22 +982,30 @@ class MimeMagic {
 
                        // Read a chunk of the file
                        $f = fopen( $path, "rt" );
-                       if ( !$f ) return MEDIATYPE_UNKNOWN;
+                       if ( !$f ) {
+                               return MEDIATYPE_UNKNOWN;
+                       }
                        $head = fread( $f, 256 );
                        fclose( $f );
 
                        $head = strtolower( $head );
 
                        // This is an UGLY HACK, file should be parsed correctly
-                       if ( strpos( $head, 'theora' ) !== false ) return MEDIATYPE_VIDEO;
-                       elseif ( strpos( $head, 'vorbis' ) !== false ) return MEDIATYPE_AUDIO;
-                       elseif ( strpos( $head, 'flac' ) !== false ) return MEDIATYPE_AUDIO;
-                       elseif ( strpos( $head, 'speex' ) !== false ) return MEDIATYPE_AUDIO;
-                       else return MEDIATYPE_MULTIMEDIA;
+                       if ( strpos( $head, 'theora' ) !== false ) {
+                               return MEDIATYPE_VIDEO;
+                       } elseif ( strpos( $head, 'vorbis' ) !== false ) {
+                               return MEDIATYPE_AUDIO;
+                       } elseif ( strpos( $head, 'flac' ) !== false ) {
+                               return MEDIATYPE_AUDIO;
+                       } elseif ( strpos( $head, 'speex' ) !== false ) {
+                               return MEDIATYPE_AUDIO;
+                       } else {
+                               return MEDIATYPE_MULTIMEDIA;
+                       }
                }
 
                // Check for entry for full mime type
-               if( $mime ) {
+               if ( $mime ) {
                        $type = $this->findMediaType( $mime );
                        if ( $type !== MEDIATYPE_UNKNOWN ) {
                                return $type;
@@ -1029,7 +1036,7 @@ class MimeMagic {
                        }
                }
 
-               if( !$type ) {
+               if ( !$type ) {
                        $type = MEDIATYPE_UNKNOWN;
                }
 
index fccfbed..8001b41 100644 (file)
@@ -387,9 +387,9 @@ class MWNamespace {
                if ( in_array( $index, self::$alwaysCapitalizedNamespaces ) ) {
                        return true;
                }
-               if ( isset( $wgCapitalLinkOverrides[ $index ] ) ) {
+               if ( isset( $wgCapitalLinkOverrides[$index] ) ) {
                        // $wgCapitalLinkOverrides is explicitly set
-                       return $wgCapitalLinkOverrides[ $index ];
+                       return $wgCapitalLinkOverrides[$index];
                }
                // Default to the global setting
                return $wgCapitalLinks;
index 6b40c30..5104a1a 100644 (file)
@@ -64,10 +64,10 @@ function wfOutputHandler( $s ) {
  */
 function wfRequestExtension() {
        /// @todo FIXME: this sort of dupes some code in WebRequest::getRequestUrl()
-       if( isset( $_SERVER['REQUEST_URI'] ) ) {
+       if ( isset( $_SERVER['REQUEST_URI'] ) ) {
                // Strip the query string...
                list( $path ) = explode( '?', $_SERVER['REQUEST_URI'], 2 );
-       } elseif( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+       } elseif ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
                // Probably IIS. QUERY_STRING appears separately.
                $path = $_SERVER['SCRIPT_NAME'];
        } else {
@@ -76,7 +76,7 @@ function wfRequestExtension() {
        }
 
        $period = strrpos( $path, '.' );
-       if( $period !== false ) {
+       if ( $period !== false ) {
                return strtolower( substr( $path, $period ) );
        }
        return '';
@@ -91,17 +91,17 @@ function wfRequestExtension() {
  * @return string
  */
 function wfGzipHandler( $s ) {
-       if( !function_exists( 'gzencode' ) ) {
+       if ( !function_exists( 'gzencode' ) ) {
                wfDebug( __FUNCTION__ . "() skipping compression (gzencode unavailable)\n" );
                return $s;
        }
-       if( headers_sent() ) {
+       if ( headers_sent() ) {
                wfDebug( __FUNCTION__ . "() skipping compression (headers already sent)\n" );
                return $s;
        }
 
        $ext = wfRequestExtension();
-       if( $ext == '.gz' || $ext == '.tgz' ) {
+       if ( $ext == '.gz' || $ext == '.tgz' ) {
                // Don't do gzip compression if the URL path ends in .gz or .tgz
                // This confuses Safari and triggers a download of the page,
                // even though it's pretty clearly labeled as viewable HTML.
@@ -109,7 +109,7 @@ function wfGzipHandler( $s ) {
                return $s;
        }
 
-       if( wfClientAcceptsGzip() ) {
+       if ( wfClientAcceptsGzip() ) {
                wfDebug( __FUNCTION__ . "() is compressing output\n" );
                header( 'Content-Encoding: gzip' );
                $s = gzencode( $s, 6 );
@@ -177,20 +177,8 @@ function wfHtmlValidationHandler( $s ) {
 
        header( 'Cache-Control: no-cache' );
 
-       $out = <<<EOT
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr">
-<head>
-<title>HTML validation error</title>
-<style>
-.highlight { background-color: #ffc }
-li { white-space: pre }
-</style>
-</head>
-<body>
-<h1>HTML validation error</h1>
-<ul>
-EOT;
+       $out = Html::element( 'h1', null, 'HTML validation error' );
+       $out .= Html::openElement( 'ul' );
 
        $error = strtok( $errors, "\n" );
        $badLines = array();
@@ -198,26 +186,40 @@ EOT;
                if ( preg_match( '/^line (\d+)/', $error, $m ) ) {
                        $lineNum = intval( $m[1] );
                        $badLines[$lineNum] = true;
-                       $out .= "<li><a href=\"#line-{$lineNum}\">" . htmlspecialchars( $error ) . "</a></li>\n";
+                       $out .= Html::rawElement( 'li', null,
+                               Html::element( 'a', array( 'href' => "#line-{$lineNum}" ), $error ) ) . "\n";
                }
                $error = strtok( "\n" );
        }
 
-       $out .= '</ul>';
-       $out .= '<pre>' . htmlspecialchars( $errors ) . '</pre>';
-       $out .= "<ol>\n";
+       $out .= Html::closeElement( 'ul' );
+       $out .= Html::element( 'pre', null, $errors );
+       $out .= Html::openElement( 'ol' ) . "\n";
        $line = strtok( $s, "\n" );
        $i = 1;
        while ( $line !== false ) {
+               $attrs = array();
                if ( isset( $badLines[$i] ) ) {
-                       $out .= "<li class=\"highlight\" id=\"line-$i\">";
-               } else {
-                       $out .= '<li>';
+                       $attrs['class'] = 'highlight';
+                       $attrs['id'] = "line-$i";
                }
-               $out .= htmlspecialchars( $line ) . "</li>\n";
+               $out .= Html::element( 'li', $attrs, $line ) . "\n";
                $line = strtok( "\n" );
                $i++;
        }
-       $out .= '</ol></body></html>';
+       $out .= Html::closeElement( 'ol' );
+
+       $style = <<<CSS
+.highlight { background-color: #ffc }
+li { white-space: pre }
+CSS;
+
+       $out = Html::htmlHeader( array( 'lang' => 'en', 'dir' => 'ltr' ) ) .
+               Html::rawElement( 'head', null,
+                       Html::element( 'title', null, 'HTML validation error' ) .
+                       Html::inlineStyle( $style ) ) .
+               Html::rawElement( 'body', null, $out ) .
+               Html::closeElement( 'html' );
+
        return $out;
 }
index 1e0c396..0849afd 100644 (file)
@@ -253,6 +253,11 @@ class OutputPage extends ContextSource {
         */
        private $mProperties = array();
 
+       /**
+        * @var string|null: ResourceLoader target for load.php links. If null, will be omitted
+        */
+       private $mTarget = null;
+
        /**
         * Constructor for OutputPage. This should not be called directly.
         * Instead a new RequestContext should be created and it will implicitly create
@@ -314,7 +319,7 @@ class OutputPage extends ContextSource {
         * @param string $text or array of strings
         */
        function addKeyword( $text ) {
-               if( is_array( $text ) ) {
+               if ( is_array( $text ) ) {
                        $this->mKeywords = array_merge( $this->mKeywords, $text );
                } else {
                        array_push( $this->mKeywords, $text );
@@ -408,13 +413,14 @@ class OutputPage extends ContextSource {
        public function addScriptFile( $file, $version = null ) {
                global $wgStylePath, $wgStyleVersion;
                // See if $file parameter is an absolute URL or begins with a slash
-               if( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
+               if ( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
                        $path = $file;
                } else {
                        $path = "{$wgStylePath}/common/{$file}";
                }
-               if ( is_null( $version ) )
+               if ( is_null( $version ) ) {
                        $version = $wgStyleVersion;
+               }
                $this->addScript( Html::linkedScript( wfAppendQuery( $path, $version ) ) );
        }
 
@@ -447,11 +453,12 @@ class OutputPage extends ContextSource {
        protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ) {
                $resourceLoader = $this->getResourceLoader();
                $filteredModules = array();
-               foreach( $modules as $val ) {
+               foreach ( $modules as $val ) {
                        $module = $resourceLoader->getModule( $val );
-                       if( $module instanceof ResourceLoaderModule
+                       if ( $module instanceof ResourceLoaderModule
                                && $module->getOrigin() <= $this->getAllowedModules( $type )
-                               && ( is_null( $position ) || $module->getPosition() == $position ) )
+                               && ( is_null( $position ) || $module->getPosition() == $position )
+                               && ( !$this->mTarget || in_array( $this->mTarget, $module->getTargets() ) ) )
                        {
                                $filteredModules[] = $val;
                        }
@@ -556,6 +563,22 @@ class OutputPage extends ContextSource {
                $this->mModuleMessages = array_merge( $this->mModuleMessages, (array)$modules );
        }
 
+       /**
+        * @return null|string: ResourceLoader target
+        */
+       public function getTarget() {
+               return $this->mTarget;
+       }
+
+       /**
+        * Sets ResourceLoader target for load.php links. If null, will be omitted
+        *
+        * @param $target string|null
+        */
+       public function setTarget( $target ) {
+               $this->mTarget = $target;
+       }
+
        /**
         * Get an array of head items
         *
@@ -665,17 +688,17 @@ class OutputPage extends ContextSource {
         * @return Boolean: true iff cache-ok headers was sent.
         */
        public function checkLastModified( $timestamp ) {
-               global $wgCachePages, $wgCacheEpoch;
+               global $wgCachePages, $wgCacheEpoch, $wgUseSquid, $wgSquidMaxage;
 
                if ( !$timestamp || $timestamp == '19700101000000' ) {
                        wfDebug( __METHOD__ . ": CACHE DISABLED, NO TIMESTAMP\n" );
                        return false;
                }
-               if( !$wgCachePages ) {
+               if ( !$wgCachePages ) {
                        wfDebug( __METHOD__ . ": CACHE DISABLED\n", false );
                        return false;
                }
-               if( $this->getUser()->getOption( 'nocache' ) ) {
+               if ( $this->getUser()->getOption( 'nocache' ) ) {
                        wfDebug( __METHOD__ . ": USER DISABLED CACHE\n", false );
                        return false;
                }
@@ -686,6 +709,10 @@ class OutputPage extends ContextSource {
                        'user' => $this->getUser()->getTouched(),
                        'epoch' => $wgCacheEpoch
                );
+               if ( $wgUseSquid ) {
+                       // bug 44570: the core page itself may not change, but resources might
+                       $modifiedTimes['sepoch'] = wfTimestamp( TS_MW, time() - $wgSquidMaxage );
+               }
                wfRunHooks( 'OutputPageCheckLastModified', array( &$modifiedTimes ) );
 
                $maxModified = max( $modifiedTimes );
@@ -724,7 +751,7 @@ class OutputPage extends ContextSource {
                        wfTimestamp( TS_ISO_8601, $clientHeaderTime ) . "\n", false );
                wfDebug( __METHOD__ . ": effective Last-Modified: " .
                        wfTimestamp( TS_ISO_8601, $maxModified ) . "\n", false );
-               if( $clientHeaderTime < $maxModified ) {
+               if ( $clientHeaderTime < $maxModified ) {
                        wfDebug( __METHOD__ . ": STALE, $info\n", false );
                        return false;
                }
@@ -766,10 +793,10 @@ class OutputPage extends ContextSource {
        public function setRobotPolicy( $policy ) {
                $policy = Article::formatRobotPolicy( $policy );
 
-               if( isset( $policy['index'] ) ) {
+               if ( isset( $policy['index'] ) ) {
                        $this->setIndexPolicy( $policy['index'] );
                }
-               if( isset( $policy['follow'] ) ) {
+               if ( isset( $policy['follow'] ) ) {
                        $this->setFollowPolicy( $policy['follow'] );
                }
        }
@@ -783,7 +810,7 @@ class OutputPage extends ContextSource {
         */
        public function setIndexPolicy( $policy ) {
                $policy = trim( $policy );
-               if( in_array( $policy, array( 'index', 'noindex' ) ) ) {
+               if ( in_array( $policy, array( 'index', 'noindex' ) ) ) {
                        $this->mIndexPolicy = $policy;
                }
        }
@@ -797,7 +824,7 @@ class OutputPage extends ContextSource {
         */
        public function setFollowPolicy( $policy ) {
                $policy = trim( $policy );
-               if( in_array( $policy, array( 'follow', 'nofollow' ) ) ) {
+               if ( in_array( $policy, array( 'follow', 'nofollow' ) ) ) {
                        $this->mFollowPolicy = $policy;
                }
        }
@@ -1269,7 +1296,6 @@ class OutputPage extends ContextSource {
         * Return whether user JavaScript is allowed for this page
         * @deprecated since 1.18 Load modules with ResourceLoader, and origin and
         *     trustworthiness is identified and enforced automagically.
-        *     Will be removed in 1.20.
         * @return Boolean
         */
        public function isUserJsAllowed() {
@@ -1284,7 +1310,7 @@ class OutputPage extends ContextSource {
         * @return Int ResourceLoaderModule ORIGIN_ class constant
         */
        public function getAllowedModules( $type ) {
-               if( $type == ResourceLoaderModule::TYPE_COMBINED ) {
+               if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
                        return min( array_values( $this->mAllowedModules ) );
                } else {
                        return isset( $this->mAllowedModules[$type] )
@@ -1401,7 +1427,7 @@ class OutputPage extends ContextSource {
         * @param $timestamp Mixed: string, or null
         * @return Mixed: previous value
         */
-       public function setRevisionTimestamp( $timestamp) {
+       public function setRevisionTimestamp( $timestamp ) {
                return wfSetVar( $this->mRevisionTimestamp, $timestamp );
        }
 
@@ -1582,6 +1608,10 @@ class OutputPage extends ContextSource {
                        }
                }
 
+               // Link flags are ignored for now, but may in the future be
+               // used to mark individual language links.
+               $linkFlags = array();
+               wfRunHooks( 'LanguageLinks', array( $this->getTitle(), &$this->mLanguageLinks, &$linkFlags ) );
                wfRunHooks( 'OutputPageParserOutput', array( &$this, $parserOutput ) );
        }
 
@@ -1626,7 +1656,7 @@ class OutputPage extends ContextSource {
        public function parse( $text, $linestart = true, $interface = false, $language = null ) {
                global $wgParser;
 
-               if( is_null( $this->getTitle() ) ) {
+               if ( is_null( $this->getTitle() ) ) {
                        throw new MWException( 'Empty $mTitle in ' . __METHOD__ );
                }
 
@@ -1750,8 +1780,8 @@ class OutputPage extends ContextSource {
        public function addVaryHeader( $header, $option = null ) {
                if ( !array_key_exists( $header, $this->mVaryHeader ) ) {
                        $this->mVaryHeader[$header] = (array)$option;
-               } elseif( is_array( $option ) ) {
-                       if( is_array( $this->mVaryHeader[$header] ) ) {
+               } elseif ( is_array( $option ) ) {
+                       if ( is_array( $this->mVaryHeader[$header] ) ) {
                                $this->mVaryHeader[$header] = array_merge( $this->mVaryHeader[$header], $option );
                        } else {
                                $this->mVaryHeader[$header] = $option;
@@ -1785,7 +1815,7 @@ class OutputPage extends ContextSource {
                $this->addVaryHeader( 'Cookie', $cookiesOption );
 
                $headers = array();
-               foreach( $this->mVaryHeader as $header => $option ) {
+               foreach ( $this->mVaryHeader as $header => $option ) {
                        $newheader = $header;
                        if ( is_array( $option ) && count( $option ) > 0 ) {
                                $newheader .= ';' . implode( ';', $option );
@@ -1807,11 +1837,11 @@ class OutputPage extends ContextSource {
         */
        function addAcceptLanguage() {
                $lang = $this->getTitle()->getPageLanguage();
-               if( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
+               if ( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
                        $variants = $lang->getVariants();
                        $aloption = array();
                        foreach ( $variants as $variant ) {
-                               if( $variant === $lang->getCode() ) {
+                               if ( $variant === $lang->getCode() ) {
                                        continue;
                                } else {
                                        $aloption[] = 'string-contains=' . $variant;
@@ -1892,12 +1922,11 @@ class OutputPage extends ContextSource {
                        $response->header( $this->getXVO() );
                }
 
-               if( $this->mEnableClientCache ) {
-                       if(
+               if ( $this->mEnableClientCache ) {
+                       if (
                                $wgUseSquid && session_id() == '' && !$this->isPrintable() &&
                                $this->mSquidMaxage != 0 && !$this->haveCacheVaryCookies()
-                       )
-                       {
+                       ) {
                                if ( $wgUseESI ) {
                                        # We'll purge the proxy cache explicitly, but require end user agents
                                        # to revalidate against the proxy on each visit.
@@ -1924,7 +1953,7 @@ class OutputPage extends ContextSource {
                                $response->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
                                $response->header( "Cache-Control: private, must-revalidate, max-age=0" );
                        }
-                       if( $this->mLastModified ) {
+                       if ( $this->mLastModified ) {
                                $response->header( "Last-Modified: {$this->mLastModified}" );
                        }
                } else {
@@ -1957,9 +1986,10 @@ class OutputPage extends ContextSource {
         * the object, let's actually output it:
         */
        public function output() {
-               global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP;
+               global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP,
+                       $wgUseAjax, $wgResponsiveImages;
 
-               if( $this->mDoNothing ) {
+               if ( $this->mDoNothing ) {
                        return;
                }
 
@@ -1974,9 +2004,9 @@ class OutputPage extends ContextSource {
                        $redirect = $this->mRedirect;
                        $code = $this->mRedirectCode;
 
-                       if( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
-                               if( $code == '301' || $code == '303' ) {
-                                       if( !$wgDebugRedirects ) {
+                       if ( wfRunHooks( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
+                               if ( $code == '301' || $code == '303' ) {
+                                       if ( !$wgDebugRedirects ) {
                                                $message = HttpStatus::getMessage( $code );
                                                $response->header( "HTTP/1.1 $code $message" );
                                        }
@@ -1988,7 +2018,7 @@ class OutputPage extends ContextSource {
                                $this->sendCacheControl();
 
                                $response->header( "Content-Type: text/html; charset=utf-8" );
-                               if( $wgDebugRedirects ) {
+                               if ( $wgDebugRedirects ) {
                                        $url = htmlspecialchars( $redirect );
                                        print "<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n";
                                        print "<p>Location: <a href=\"$url\">$url</a></p>\n";
@@ -2020,11 +2050,34 @@ class OutputPage extends ContextSource {
                }
 
                if ( $this->mArticleBodyOnly ) {
-                       $this->out( $this->mBodytext );
+                       echo $this->mBodytext;
                } else {
-                       $this->addDefaultModules();
 
                        $sk = $this->getSkin();
+                       // add skin specific modules
+                       $modules = $sk->getDefaultModules();
+
+                       // enforce various default modules for all skins
+                       $coreModules = array(
+                               // keep this list as small as possible
+                               'mediawiki.page.startup',
+                               'mediawiki.user',
+                       );
+
+                       // Support for high-density display images if enabled
+                       if ( $wgResponsiveImages ) {
+                               $coreModules[] = 'mediawiki.hidpi';
+                       }
+
+                       $this->addModules( $coreModules );
+                       foreach ( $modules as $group ) {
+                               $this->addModules( $group );
+                       }
+                       MWDebug::addModules( $this );
+                       if ( $wgUseAjax ) {
+                               // FIXME: deprecate? - not clear why this is useful
+                               wfRunHooks( 'AjaxAddScript', array( &$this ) );
+                       }
 
                        // Hook that allows last minute changes to the output page, e.g.
                        // adding of CSS or Javascript by extensions.
@@ -2046,11 +2099,13 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Actually output something with print().
+        * Actually output something with print.
         *
         * @param string $ins the string to output
+        * @deprecated since 1.20 Use echo yourself.
         */
        public function out( $ins ) {
+               wfDeprecated( __METHOD__, '1.22' );
                print $ins;
        }
 
@@ -2097,7 +2152,7 @@ class OutputPage extends ContextSource {
         * @param array $params message parameters; ignored if $msg is a Message object
         */
        public function showErrorPage( $title, $msg, $params = array() ) {
-               if( !$title instanceof Message ) {
+               if ( !$title instanceof Message ) {
                        $title = $this->msg( $title );
                }
 
@@ -2238,7 +2293,7 @@ class OutputPage extends ContextSource {
                if ( count( $errors ) > 1 ) {
                        $text .= '<ul class="permissions-errors">' . "\n";
 
-                       foreach( $errors as $error ) {
+                       foreach ( $errors as $error ) {
                                $text .= '<li>';
                                $text .= call_user_func_array( array( $this, 'msg' ), $error )->plain();
                                $text .= "</li>\n";
@@ -2286,7 +2341,7 @@ class OutputPage extends ContextSource {
 
                if ( !empty( $reasons ) ) {
                        // Permissions error
-                       if( $source ) {
+                       if ( $source ) {
                                $this->setPageTitle( $this->msg( 'viewsource-title', $this->getTitle()->getPrefixedText() ) );
                                $this->addBacklinkSubtitle( $this->getTitle() );
                        } else {
@@ -2299,7 +2354,7 @@ class OutputPage extends ContextSource {
                }
 
                // Show source, if supplied
-               if( is_string( $source ) ) {
+               if ( is_string( $source ) ) {
                        $this->addWikiMsg( 'viewsourcetext' );
 
                        $pageLang = $this->getTitle()->getPageLanguage();
@@ -2325,7 +2380,7 @@ $templates
                # If the title doesn't exist, it's fairly pointless to print a return
                # link to it.  After all, you just tried editing it and couldn't, so
                # what's there to do there?
-               if( $this->getTitle()->exists() ) {
+               if ( $this->getTitle()->exists() ) {
                        $this->returnToMain( null, $this->getTitle() );
                }
        }
@@ -2349,7 +2404,7 @@ $templates
         */
        public function showLagWarning( $lag ) {
                global $wgSlaveLagWarning, $wgSlaveLagCritical;
-               if( $lag >= $wgSlaveLagWarning ) {
+               if ( $lag >= $wgSlaveLagWarning ) {
                        $message = $lag < $wgSlaveLagCritical
                                ? 'lag-warn-normal'
                                : 'lag-warn-high';
@@ -2393,15 +2448,14 @@ $templates
         * @param $options Options array to pass to Linker
         */
        public function addReturnTo( $title, $query = array(), $text = null, $options = array() ) {
-               if( in_array( 'http', $options ) ) {
+               if ( in_array( 'http', $options ) ) {
                        $proto = PROTO_HTTP;
-               } elseif( in_array( 'https', $options ) ) {
+               } elseif ( in_array( 'https', $options ) ) {
                        $proto = PROTO_HTTPS;
                } else {
                        $proto = PROTO_RELATIVE;
                }
 
-               $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL( '', false, $proto ) ) );
                $link = $this->msg( 'returnto' )->rawParams(
                        Linker::link( $title, $text, array(), $query, $options ) )->escaped();
                $this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
@@ -2446,7 +2500,7 @@ $templates
         * @return String: The doctype, opening "<html>", and head element.
         */
        public function headElement( Skin $sk, $includeStyle = true ) {
-               global $wgContLang;
+               global $wgContLang, $wgMimeType;
 
                $userdir = $this->getLanguage()->getDir();
                $sitedir = $wgContLang->getDir();
@@ -2467,10 +2521,22 @@ $templates
                        $ret .= "$openHead\n";
                }
 
+               if ( !Html::isXmlMimeType( $wgMimeType ) ) {
+                       // Add <meta charset="UTF-8">
+                       // This should be before <title> since it defines the charset used by
+                       // text including the text inside <title>.
+                       // The spec recommends defining XHTML5's charset using the XML declaration
+                       // instead of meta.
+                       // Our XML declaration is output by Html::htmlHeader.
+                       // http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#attr-meta-http-equiv-content-type
+                       // http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#charset
+                       $ret .= Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
+               }
+
                $ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
 
                $ret .= implode( "\n", array(
-                       $this->getHeadLinks( null, true ),
+                       $this->getHeadLinks(),
                        $this->buildCssLinks(),
                        $this->getHeadScripts(),
                        $this->getHeadItems()
@@ -2481,20 +2547,29 @@ $templates
                        $ret .= "$closeHead\n";
                }
 
-               $bodyAttrs = array();
+               $bodyClasses = array();
+               $bodyClasses[] = 'mediawiki';
 
                # Classes for LTR/RTL directionality support
-               $bodyAttrs['class'] = "mediawiki $userdir sitedir-$sitedir";
+               $bodyClasses[] = $userdir;
+               $bodyClasses[] = "sitedir-$sitedir";
 
                if ( $this->getLanguage()->capitalizeAllNouns() ) {
                        # A <body> class is probably not the best way to do this . . .
-                       $bodyAttrs['class'] .= ' capitalize-all-nouns';
+                       $bodyClasses[] = 'capitalize-all-nouns';
                }
-               $bodyAttrs['class'] .= ' ' . $sk->getPageClasses( $this->getTitle() );
-               $bodyAttrs['class'] .= ' skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
-               $bodyAttrs['class'] .= ' action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
 
-               $sk->addToBodyAttributes( $this, $bodyAttrs ); // Allow skins to add body attributes they need
+               $bodyClasses[] = $sk->getPageClasses( $this->getTitle() );
+               $bodyClasses[] = 'skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
+               $bodyClasses[] = 'action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
+
+               $bodyAttrs = array();
+               // While the implode() is not strictly needed, it's used for backwards compatibility
+               // (this used to be built as a string and hooks likely still expect that).
+               $bodyAttrs['class'] = implode( ' ', $bodyClasses );
+
+               // Allow skins and extensions to add body attributes they need
+               $sk->addToBodyAttributes( $this, $bodyAttrs );
                wfRunHooks( 'OutputPageBodyAttributes', array( $this, $sk, &$bodyAttrs ) );
 
                $ret .= Html::openElement( 'body', $bodyAttrs ) . "\n";
@@ -2502,59 +2577,6 @@ $templates
                return $ret;
        }
 
-       /**
-        * Add the default ResourceLoader modules to this object
-        */
-       private function addDefaultModules() {
-               global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
-                       $wgAjaxWatch, $wgResponsiveImages;
-
-               // Add base resources
-               $this->addModules( array(
-                       'mediawiki.user',
-                       'mediawiki.page.startup',
-                       'mediawiki.page.ready',
-               ) );
-               if ( $wgIncludeLegacyJavaScript ) {
-                       $this->addModules( 'mediawiki.legacy.wikibits' );
-               }
-
-               if ( $wgPreloadJavaScriptMwUtil ) {
-                       $this->addModules( 'mediawiki.util' );
-               }
-
-               MWDebug::addModules( $this );
-
-               // Add various resources if required
-               if ( $wgUseAjax ) {
-                       $this->addModules( 'mediawiki.legacy.ajax' );
-
-                       wfRunHooks( 'AjaxAddScript', array( &$this ) );
-
-                       if( $wgAjaxWatch && $this->getUser()->isLoggedIn() ) {
-                               $this->addModules( 'mediawiki.page.watch.ajax' );
-                       }
-
-                       if ( !$this->getUser()->getOption( 'disablesuggest', false ) ) {
-                               $this->addModules( 'mediawiki.searchSuggest' );
-                       }
-               }
-
-               if ( $this->getUser()->getBoolOption( 'editsectiononrightclick' ) ) {
-                       $this->addModules( 'mediawiki.action.view.rightClickEdit' );
-               }
-
-               # Crazy edit-on-double-click stuff
-               if ( $this->isArticle() && $this->getUser()->getOption( 'editondblclick' ) ) {
-                       $this->addModules( 'mediawiki.action.view.dblClickEdit' );
-               }
-
-               // Support for high-density display images
-               if ( $wgResponsiveImages ) {
-                       $this->addModules( 'mediawiki.hidpi' );
-               }
-       }
-
        /**
         * Get a ResourceLoader object associated with this OutputPage
         *
@@ -2600,6 +2622,9 @@ $templates
                                return $links;
                        }
                }
+               if ( !is_null( $this->mTarget ) ) {
+                       $extraQuery['target'] = $this->mTarget;
+               }
 
                // Create keyed-by-group list of module objects from modules list
                $groups = array();
@@ -2612,8 +2637,8 @@ $templates
                                        && $only == ResourceLoaderModule::TYPE_SCRIPTS )
                                || ( $module->getOrigin() > $this->getAllowedModules( ResourceLoaderModule::TYPE_STYLES )
                                        && $only == ResourceLoaderModule::TYPE_STYLES )
-                               )
-                       {
+                               || ( $this->mTarget && !in_array( $this->mTarget, $module->getTargets() ) )
+                       {
                                continue;
                        }
 
@@ -2648,7 +2673,7 @@ $templates
                        );
                        $context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
                        // Extract modules that know they're empty
-                       $emptyModules = array ();
+                       $emptyModules = array();
                        foreach ( $grpModules as $key => $module ) {
                                if ( $module->isKnownEmpty( $context ) ) {
                                        $emptyModules[$key] = 'ready';
@@ -2659,13 +2684,9 @@ $templates
                        if ( count( $emptyModules ) > 0 && $only !== ResourceLoaderModule::TYPE_STYLES ) {
                                // If we're only getting the styles, we don't need to do anything for empty modules.
                                $links .= Html::inlineScript(
-
                                                ResourceLoader::makeLoaderConditionalScript(
-
                                                                ResourceLoader::makeLoaderStateScript( $emptyModules )
-
                                                )
-
                                ) . "\n";
                        }
 
@@ -2732,7 +2753,7 @@ $templates
                                // Automatically select style/script elements
                                if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
                                        $link = Html::linkedStyle( $url );
-                               } else if ( $loadCall ) {
+                               } elseif ( $loadCall ) {
                                        $link = Html::inlineScript(
                                                ResourceLoader::makeLoaderConditionalScript(
                                                        Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
@@ -2743,7 +2764,7 @@ $templates
                                }
                        }
 
-                       if( $group == 'noscript' ) {
+                       if ( $group == 'noscript' ) {
                                $links .= Html::rawElement( 'noscript', array(), $link ) . "\n";
                        } else {
                                $links .= $link . "\n";
@@ -2847,14 +2868,14 @@ $templates
                        );
                        $defaultModules['site'] = 'loading';
                } else {
-                       // The wiki is configured to not allow a site module.
-                       $defaultModules['site'] = 'missing';
+                       // Site module is empty, save request by marking ready in advance (bug 46857)
+                       $defaultModules['site'] = 'ready';
                }
 
                // Add user JS if enabled
                if ( $wgAllowUserJs ) {
                        if ( $this->getUser()->isLoggedIn() ) {
-                               if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+                               if ( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
                                        # XXX: additional security check/prompt?
                                        // We're on a preview of a JS subpage
                                        // Exclude this page from the user module in case it's in there (bug 26283)
@@ -2874,15 +2895,14 @@ $templates
                                }
                                $defaultModules['user'] = 'loading';
                        } else {
-                               // Non-logged-in users have no user module. Treat it as empty and 'ready' to avoid
-                               // blocking default gadgets that might depend on it. Although arguably default-enabled
-                               // gadgets should not depend on the user module, it's harmless and less error-prone to
-                               // handle this case.
+                               // Non-logged-in users have an empty user module.
+                               // Save request by marking ready in advance (bug 46857)
                                $defaultModules['user'] = 'ready';
                        }
                } else {
-                       // User JS disabled
-                       $defaultModules['user'] = 'missing';
+                       // User modules are disabled on this wiki.
+                       // Save request by marking ready in advance (bug 46857)
+                       $defaultModules['user'] = 'ready';
                }
 
                // Group JS is only enabled if site JS is enabled.
@@ -2893,13 +2913,13 @@ $templates
                                );
                                $defaultModules['user.groups'] = 'loading';
                        } else {
-                               // Non-logged-in users have no user.groups module. Treat it as empty and 'ready' to
-                               // avoid blocking gadgets that might depend upon the module.
+                               // Non-logged-in users have no user.groups module.
+                               // Save request by marking ready in advance (bug 46857)
                                $defaultModules['user.groups'] = 'ready';
                        }
                } else {
                        // Site (and group JS) disabled
-                       $defaultModules['user.groups'] = 'missing';
+                       $defaultModules['user.groups'] = 'ready';
                }
 
                $loaderInit = '';
@@ -2927,11 +2947,18 @@ $templates
         */
        function getBottomScripts() {
                global $wgResourceLoaderExperimentalAsyncLoading;
+
+               // Optimise jQuery ready event cross-browser.
+               // This also enforces $.isReady to be true at </body> which fixes the
+               // mw.loader bug in Firefox with using document.write between </body>
+               // and the DOMContentReady event (bug 47457).
+               $html = Html::inlineScript( 'window.jQuery && jQuery.ready();' );
+
                if ( !$wgResourceLoaderExperimentalAsyncLoading ) {
-                       return $this->getScriptsForBottomQueue( false );
-               } else {
-                       return '';
+                       $html .= $this->getScriptsForBottomQueue( false );
                }
+
+               return $html;
        }
 
        /**
@@ -3019,6 +3046,7 @@ $templates
                        'wgCategories' => $this->getCategories(),
                        'wgBreakFrames' => $this->getFrameOptions() == 'DENY',
                        'wgPageContentLanguage' => $lang->getCode(),
+                       'wgPageContentModel' => $title->getContentModel(),
                        'wgSeparatorTransformTable' => $compactSeparatorTransTable,
                        'wgDigitTransformTable' => $compactDigitTransTable,
                        'wgDefaultDateFormat' => $lang->getDefaultDateFormat(),
@@ -3031,6 +3059,10 @@ $templates
                        $vars['wgUserEditCount'] = $user->getEditCount();
                        $userReg = wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
                        $vars['wgUserRegistration'] = $userReg !== null ? ( $userReg * 1000 ) : null;
+                       // Get the revision ID of the oldest new message on the user's talk
+                       // page. This can be used for constructing new message alerts on
+                       // the client side.
+                       $vars['wgUserNewMsgRevisionId'] = $user->getNewMessageRevisionId();
                }
                if ( $wgContLang->hasVariants() ) {
                        $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
@@ -3080,13 +3112,11 @@ $templates
        }
 
        /**
-        * @param bool $addContentType Whether "<meta>" specifying content type should be returned
-        *
         * @return array in format "link name or number => 'link html'".
         */
-       public function getHeadLinksArray( $addContentType = false ) {
+       public function getHeadLinksArray() {
                global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
-                       $wgSitename, $wgVersion, $wgHtml5, $wgMimeType,
+                       $wgSitename, $wgVersion,
                        $wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
                        $wgDisableLangConversion, $wgCanonicalLanguageLinks,
                        $wgRightsPage, $wgRightsUrl;
@@ -3095,30 +3125,13 @@ $templates
 
                $canonicalUrl = $this->mCanonicalUrl;
 
-               if ( $addContentType ) {
-                       if ( $wgHtml5 ) {
-                               # More succinct than <meta http-equiv=Content-Type>, has the
-                               # same effect
-                               $tags['meta-charset'] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
-                       } else {
-                               $tags['meta-content-type'] = Html::element( 'meta', array(
-                                       'http-equiv' => 'Content-Type',
-                                       'content' => "$wgMimeType; charset=UTF-8"
-                               ) );
-                               $tags['meta-content-style-type'] = Html::element( 'meta', array( // bug 15835
-                                       'http-equiv' => 'Content-Style-Type',
-                                       'content' => 'text/css'
-                               ) );
-                       }
-               }
-
                $tags['meta-generator'] = Html::element( 'meta', array(
                        'name' => 'generator',
                        'content' => "MediaWiki $wgVersion",
                ) );
 
                $p = "{$this->mIndexPolicy},{$this->mFollowPolicy}";
-               if( $p !== 'index,follow' ) {
+               if ( $p !== 'index,follow' ) {
                        // http://www.robotstxt.org/wc/meta-user.html
                        // Only show if it's different from the default robots policy
                        $tags['meta-robots'] = Html::element( 'meta', array(
@@ -3266,7 +3279,7 @@ $templates
 
                # Feeds
                if ( $wgFeed ) {
-                       foreach( $this->getSyndicationLinks() as $format => $link ) {
+                       foreach ( $this->getSyndicationLinks() as $format => $link ) {
                                # Use the page name for the title.  In principle, this could
                                # lead to issues with having the same name for different feeds
                                # corresponding to the same page, but we can't avoid that at
@@ -3301,7 +3314,7 @@ $templates
                                foreach ( $wgAdvertisedFeedTypes as $format ) {
                                        $tags[] = $this->feedLink(
                                                $format,
-                                               $rctitle->getLocalURL( "feed={$format}" ),
+                                               $rctitle->getLocalURL( array( 'feed' => $format ) ),
                                                $this->msg( "site-{$format}-feed", $wgSitename )->text() # For grep: 'site-rss-feed', 'site-atom-feed'.
                                        );
                                }
@@ -3329,13 +3342,10 @@ $templates
        }
 
        /**
-        * @param $unused
-        * @param bool $addContentType Whether "<meta>" specifying content type should be returned
-        *
         * @return string HTML tag links to be put in the header.
         */
-       public function getHeadLinks( $unused = null, $addContentType = false ) {
-               return implode( "\n", $this->getHeadLinksArray( $addContentType ) );
+       public function getHeadLinks() {
+               return implode( "\n", $this->getHeadLinksArray() );
        }
 
        /**
@@ -3368,13 +3378,13 @@ $templates
                $options = array();
                // Even though we expect the media type to be lowercase, but here we
                // force it to lowercase to be safe.
-               if( $media ) {
+               if ( $media ) {
                        $options['media'] = $media;
                }
-               if( $condition ) {
+               if ( $condition ) {
                        $options['condition'] = $condition;
                }
-               if( $dir ) {
+               if ( $dir ) {
                        $options['dir'] = $dir;
                }
                $this->styles[$style] = $options;
@@ -3386,7 +3396,7 @@ $templates
         * @param string $flip Set to 'flip' to flip the CSS if needed
         */
        public function addInlineStyle( $style_css, $flip = 'noflip' ) {
-               if( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
+               if ( $flip === 'flip' && $this->getLanguage()->isRTL() ) {
                        # If wanted, and the interface is right-to-left, flip the CSS
                        $style_css = CSSJanus::transform( $style_css, true, false );
                }
@@ -3416,7 +3426,7 @@ $templates
                if ( $wgUseSiteCss ) {
                        $moduleStyles[] = 'site';
                        $moduleStyles[] = 'noscript';
-                       if( $this->getUser()->isLoggedIn() ) {
+                       if ( $this->getUser()->isLoggedIn() ) {
                                $moduleStyles[] = 'user.groups';
                        }
                }
@@ -3497,9 +3507,9 @@ $templates
                }
                $this->mExtStyles = array();
 
-               foreach( $this->styles as $file => $options ) {
+               foreach ( $this->styles as $file => $options ) {
                        $link = $this->styleLink( $file, $options );
-                       if( $link ) {
+                       if ( $link ) {
                                $links[$file] = $link;
                        }
                }
@@ -3515,22 +3525,22 @@ $templates
         * @return String: HTML fragment
         */
        protected function styleLink( $style, $options ) {
-               if( isset( $options['dir'] ) ) {
-                       if( $this->getLanguage()->getDir() != $options['dir'] ) {
+               if ( isset( $options['dir'] ) ) {
+                       if ( $this->getLanguage()->getDir() != $options['dir'] ) {
                                return '';
                        }
                }
 
-               if( isset( $options['media'] ) ) {
+               if ( isset( $options['media'] ) ) {
                        $media = self::transformCssMedia( $options['media'] );
-                       if( is_null( $media ) ) {
+                       if ( is_null( $media ) ) {
                                return '';
                        }
                } else {
                        $media = 'all';
                }
 
-               if( substr( $style, 0, 1 ) == '/' ||
+               if ( substr( $style, 0, 1 ) == '/' ||
                        substr( $style, 0, 5 ) == 'http:' ||
                        substr( $style, 0, 6 ) == 'https:' ) {
                        $url = $style;
@@ -3541,7 +3551,7 @@ $templates
 
                $link = Html::linkedStyle( $url, $media );
 
-               if( isset( $options['condition'] ) ) {
+               if ( isset( $options['condition'] ) ) {
                        $condition = htmlspecialchars( $options['condition'] );
                        $link = "<!--[if $condition]>$link<![endif]-->";
                }
@@ -3556,7 +3566,7 @@ $templates
         * this stylesheet
         */
        public static function transformCssMedia( $media ) {
-               global $wgRequest, $wgHandheldForIPhone;
+               global $wgRequest;
 
                // http://www.w3.org/TR/css3-mediaqueries/#syntax
                $screenMediaQueryRegex = '/^(?:only\s+)?screen\b/i';
@@ -3566,11 +3576,11 @@ $templates
                        'printable' => 'print',
                        'handheld' => 'handheld',
                );
-               foreach( $switches as $switch => $targetMedia ) {
-                       if( $wgRequest->getBool( $switch ) ) {
-                               if( $media == $targetMedia ) {
+               foreach ( $switches as $switch => $targetMedia ) {
+                       if ( $wgRequest->getBool( $switch ) ) {
+                               if ( $media == $targetMedia ) {
                                        $media = '';
-                               } elseif( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
+                               } 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)' ),
@@ -3581,25 +3591,13 @@ $templates
                                        // 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' ) {
+                                       if ( $targetMedia == 'print' || $media == 'screen' ) {
                                                return null;
                                        }
                                }
                        }
                }
 
-               // Expand longer media queries as iPhone doesn't grok 'handheld'
-               if( $wgHandheldForIPhone ) {
-                       $mediaAliases = array(
-                               'screen' => 'screen and (min-device-width: 481px)',
-                               'handheld' => 'handheld, only screen and (max-device-width: 480px)',
-                       );
-
-                       if( isset( $mediaAliases[$media] ) ) {
-                               $media = $mediaAliases[$media];
-                       }
-               }
-
                return $media;
        }
 
index 7749bf1..02d3546 100644 (file)
@@ -38,7 +38,7 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ) {
-       $mwVersion = '1.21';
+       $mwVersion = '1.22';
        $minimumVersionPHP = '5.3.2';
 
        $phpVersion = phpversion();
@@ -61,12 +61,12 @@ function wfPHPVersionError( $type ) {
                header( 'Pragma: no-cache' );
 
                $finalOutput = <<<HTML
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
        <head>
+               <meta charset="UTF-8" />
                <title>MediaWiki {$mwVersion}</title>
-               <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
-               <style type='text/css' media='screen'>
+               <style media='screen'>
                        body {
                                color: #000;
                                background-color: #fff;
@@ -112,6 +112,6 @@ HTML;
                $finalOutput = ( $type == 'load.php' ) ? "/* $message */" : $message;
                header( "$protocol 500 MediaWiki configuration Error" );
        }
-       echo( "$finalOutput\n" );
+       echo "$finalOutput\n";
        die( 1 );
 }
index 01a2439..61a535d 100644 (file)
  * @ingroup SpecialPage
  */
 abstract class PageQueryPage extends QueryPage {
-
        /**
         * Format the result as a simple link to the page
         *
-        * @param $skin Skin
-        * @param $row Object: result row
+        * @param Skin $skin
+        * @param object $row Result row
         * @return string
         */
        public function formatResult( $skin, $row ) {
index d2ac904..c2bd364 100644 (file)
@@ -155,13 +155,13 @@ abstract class IndexPager extends ContextSource implements Pager {
                $index = $this->getIndexField(); // column to sort on
                $extraSort = $this->getExtraSortFields(); // extra columns to sort on for query planning
                $order = $this->mRequest->getVal( 'order' );
-               if( is_array( $index ) && isset( $index[$order] ) ) {
+               if ( is_array( $index ) && isset( $index[$order] ) ) {
                        $this->mOrderType = $order;
                        $this->mIndexField = $index[$order];
                        $this->mExtraSortFields = isset( $extraSort[$order] )
                                ? (array)$extraSort[$order]
                                : array();
-               } elseif( is_array( $index ) ) {
+               } elseif ( is_array( $index ) ) {
                        # First element is the default
                        reset( $index );
                        list( $this->mOrderType, $this->mIndexField ) = each( $index );
@@ -175,7 +175,7 @@ abstract class IndexPager extends ContextSource implements Pager {
                        $this->mExtraSortFields = (array)$extraSort;
                }
 
-               if( !isset( $this->mDefaultDirection ) ) {
+               if ( !isset( $this->mDefaultDirection ) ) {
                        $dir = $this->getDefaultDirections();
                        $this->mDefaultDirection = is_array( $dir )
                                ? $dir[$this->mOrderType]
@@ -206,13 +206,25 @@ abstract class IndexPager extends ContextSource implements Pager {
                # Plus an extra row so that we can tell the "next" link should be shown
                $queryLimit = $this->mLimit + 1;
 
+               if ( $this->mOffset == '' ) {
+                       $isFirst = true;
+               } else {
+                       // If there's an offset, we may or may not be at the first entry.
+                       // The only way to tell is to run the query in the opposite
+                       // direction see if we get a row.
+                       $oldIncludeOffset = $this->mIncludeOffset;
+                       $this->mIncludeOffset = !$this->mIncludeOffset;
+                       $isFirst = !$this->reallyDoQuery( $this->mOffset, 1, !$descending )->numRows();
+                       $this->mIncludeOffset = $oldIncludeOffset;
+               }
+
                $this->mResult = $this->reallyDoQuery(
                        $this->mOffset,
                        $queryLimit,
                        $descending
                );
 
-               $this->extractResultInfo( $this->mOffset, $queryLimit, $this->mResult );
+               $this->extractResultInfo( $isFirst, $queryLimit, $this->mResult );
                $this->mQueryDone = true;
 
                $this->preprocessResults( $this->mResult );
@@ -269,11 +281,12 @@ abstract class IndexPager extends ContextSource implements Pager {
         * Extract some useful data from the result object for use by
         * the navigation bar, put it into $this
         *
-        * @param string $offset index offset, inclusive
+        * @param $isFirst bool: False if there are rows before those fetched (i.e.
+        *     if a "previous" link would make sense)
         * @param $limit Integer: exact query limit
         * @param $res ResultWrapper
         */
-       function extractResultInfo( $offset, $limit, ResultWrapper $res ) {
+       function extractResultInfo( $isFirst, $limit, ResultWrapper $res ) {
                $numRows = $res->numRows();
                if ( $numRows ) {
                        # Remove any table prefix from index field
@@ -311,11 +324,11 @@ abstract class IndexPager extends ContextSource implements Pager {
 
                if ( $this->mIsBackwards ) {
                        $this->mIsFirst = ( $numRows < $limit );
-                       $this->mIsLast = ( $offset == '' );
+                       $this->mIsLast = $isFirst;
                        $this->mLastShown = $firstIndex;
                        $this->mFirstShown = $lastIndex;
                } else {
-                       $this->mIsFirst = ( $offset == '' );
+                       $this->mIsFirst = $isFirst;
                        $this->mIsLast = ( $numRows < $limit );
                        $this->mLastShown = $lastIndex;
                        $this->mFirstShown = $firstIndex;
@@ -443,12 +456,12 @@ abstract class IndexPager extends ContextSource implements Pager {
                }
 
                $attrs = array();
-               if( in_array( $type, array( 'first', 'prev', 'next', 'last' ) ) ) {
+               if ( in_array( $type, array( 'first', 'prev', 'next', 'last' ) ) ) {
                        # HTML5 rel attributes
                        $attrs['rel'] = $type;
                }
 
-               if( $type ) {
+               if ( $type ) {
                        $attrs['class'] = "mw-{$type}link";
                }
 
@@ -580,7 +593,7 @@ abstract class IndexPager extends ContextSource implements Pager {
                        $this->doQuery();
                }
                // Hide navigation by default if there is nothing to page
-               return !($this->mIsFirst && $this->mIsLast);
+               return !( $this->mIsFirst && $this->mIsLast );
        }
 
        /**
@@ -685,7 +698,9 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @return Array
         */
-       protected function getExtraSortFields() { return array(); }
+       protected function getExtraSortFields() {
+               return array();
+       }
 
        /**
         * Return the default sorting direction: false for ascending, true for
@@ -706,7 +721,9 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @return Boolean
         */
-       protected function getDefaultDirections() { return false; }
+       protected function getDefaultDirections() {
+               return false;
+       }
 }
 
 /**
@@ -726,7 +743,7 @@ abstract class AlphabeticPager extends IndexPager {
                        return '';
                }
 
-               if( isset( $this->mNavigationBar ) ) {
+               if ( isset( $this->mNavigationBar ) ) {
                        return $this->mNavigationBar;
                }
 
@@ -749,7 +766,7 @@ abstract class AlphabeticPager extends IndexPager {
                        $this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'],
                                $pagingLinks['next'], $limits )->escaped();
 
-               if( !is_array( $this->getIndexField() ) ) {
+               if ( !is_array( $this->getIndexField() ) ) {
                        # Early return to avoid undue nesting
                        return $this->mNavigationBar;
                }
@@ -757,14 +774,14 @@ abstract class AlphabeticPager extends IndexPager {
                $extra = '';
                $first = true;
                $msgs = $this->getOrderTypeMessages();
-               foreach( array_keys( $msgs ) as $order ) {
-                       if( $first ) {
+               foreach ( array_keys( $msgs ) as $order ) {
+                       if ( $first ) {
                                $first = false;
                        } else {
                                $extra .= $this->msg( 'pipe-separator' )->escaped();
                        }
 
-                       if( $order == $this->mOrderType ) {
+                       if ( $order == $this->mOrderType ) {
                                $extra .= $this->msg( $msgs[$order] )->escaped();
                        } else {
                                $extra .= $this->makeLink(
@@ -774,7 +791,7 @@ abstract class AlphabeticPager extends IndexPager {
                        }
                }
 
-               if( $extra !== '' ) {
+               if ( $extra !== '' ) {
                        $extra = ' ' . $this->msg( 'parentheses' )->rawParams( $extra )->escaped();
                        $this->mNavigationBar .= $extra;
                }
@@ -857,7 +874,7 @@ abstract class ReverseChronologicalPager extends IndexPager {
                        // If no year given, assume the current one
                        $year = gmdate( 'Y' );
                        // If this month hasn't happened yet this year, go back to last year's month
-                       if( $this->mMonth > gmdate( 'n' ) ) {
+                       if ( $this->mMonth > gmdate( 'n' ) ) {
                                $year--;
                        }
                }
@@ -904,7 +921,9 @@ abstract class TablePager extends IndexPager {
                }
 
                $this->mSort = $this->getRequest()->getText( 'sort' );
-               if ( !array_key_exists( $this->mSort, $this->getFieldNames() ) ) {
+               if ( !array_key_exists( $this->mSort, $this->getFieldNames() )
+                       || !$this->isFieldSortable( $this->mSort )
+               ) {
                        $this->mSort = $this->getDefaultSort();
                }
                if ( $this->getRequest()->getBool( 'asc' ) ) {
@@ -922,16 +941,15 @@ abstract class TablePager extends IndexPager {
         */
        function getStartBody() {
                global $wgStylePath;
-               $tableClass = htmlspecialchars( $this->getTableClass() );
-               $sortClass = htmlspecialchars( $this->getSortHeaderClass() );
+               $sortClass = $this->getSortHeaderClass();
 
-               $s = "<table style='border:1px;' class=\"mw-datatable $tableClass\"><thead><tr>\n";
+               $s = '';
                $fields = $this->getFieldNames();
 
                # Make table header
                foreach ( $fields as $field => $name ) {
                        if ( strval( $name ) == '' ) {
-                               $s .= "<th>&#160;</th>\n";
+                               $s .= Html::rawElement( 'th', array(), '&#160;' ) . "\n";
                        } elseif ( $this->isFieldSortable( $field ) ) {
                                $query = array( 'sort' => $field, 'limit' => $this->mLimit );
                                if ( $field == $this->mSort ) {
@@ -950,20 +968,26 @@ abstract class TablePager extends IndexPager {
                                                $query['desc'] = '1';
                                                $alt = $this->msg( 'ascending_abbrev' )->escaped();
                                        }
-                                       $image = htmlspecialchars( "$wgStylePath/common/images/$image" );
+                                       $image = "$wgStylePath/common/images/$image";
                                        $link = $this->makeLink(
-                                               "<img width=\"12\" height=\"12\" alt=\"$alt\" src=\"$image\" />" .
-                                                       htmlspecialchars( $name ), $query );
-                                       $s .= "<th class=\"$sortClass\">$link</th>\n";
+                                               Html::element( 'img', array( 'width' => 12, 'height' => 12,
+                                                       'alt' => $alt, 'src' => $image ) ) . htmlspecialchars( $name ), $query );
+                                       $s .= Html::rawElement( 'th', array( 'class' => $sortClass ), $link ) . "\n";
                                } else {
-                                       $s .= '<th>' . $this->makeLink( htmlspecialchars( $name ), $query ) . "</th>\n";
+                                       $s .= Html::rawElement( 'th', array(),
+                                               $this->makeLink( htmlspecialchars( $name ), $query ) ) . "\n";
                                }
                        } else {
-                               $s .= '<th>' . htmlspecialchars( $name ) . "</th>\n";
+                               $s .= Html::element( 'th', array(), $name ) . "\n";
                        }
                }
-               $s .= "</tr></thead><tbody>\n";
-               return $s;
+
+               $tableClass = $this->getTableClass();
+               $ret = Html::openElement( 'table', array( 'style' => 'border:1px;', 'class' => "mw-datatable $tableClass" ) );
+               $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
+               $ret .= Html::openElement( 'tbody' ) . "\n";
+
+               return $ret;
        }
 
        /**
@@ -980,8 +1004,9 @@ abstract class TablePager extends IndexPager {
         */
        function getEmptyBody() {
                $colspan = count( $this->getFieldNames() );
-               $msgEmpty = $this->msg( 'table_pager_empty' )->escaped();
-               return "<tr><td colspan=\"$colspan\">$msgEmpty</td></tr>\n";
+               $msgEmpty = $this->msg( 'table_pager_empty' )->text();
+               return Html::rawElement( 'tr', array(),
+                       Html::element( 'td', array( 'colspan' => $colspan ), $msgEmpty ) );
        }
 
        /**
@@ -991,7 +1016,7 @@ abstract class TablePager extends IndexPager {
         */
        function formatRow( $row ) {
                $this->mCurrentRow = $row; // In case formatValue etc need to know
-               $s = Xml::openElement( 'tr', $this->getRowAttrs( $row ) );
+               $s = Html::openElement( 'tr', $this->getRowAttrs( $row ) ) . "\n";
                $fieldNames = $this->getFieldNames();
 
                foreach ( $fieldNames as $field => $name ) {
@@ -1002,10 +1027,10 @@ abstract class TablePager extends IndexPager {
                                $formatted = '&#160;';
                        }
 
-                       $s .= Xml::tags( 'td', $this->getCellAttrs( $field, $value ), $formatted );
+                       $s .= Html::rawElement( 'td', $this->getCellAttrs( $field, $value ), $formatted ) . "\n";
                }
 
-               $s .= "</tr>\n";
+               $s .= Html::closeElement( 'tr' ) . "\n";
 
                return $s;
        }
@@ -1117,7 +1142,7 @@ abstract class TablePager extends IndexPager {
                        'next' => 'arrow_disabled_right_25.png',
                        'last' => 'arrow_disabled_last_25.png',
                );
-               if( $this->getLanguage()->isRTL() ) {
+               if ( $this->getLanguage()->isRTL() ) {
                        $keys = array_keys( $labels );
                        $images = array_combine( $keys, array_reverse( $images ) );
                        $disabledImages = array_combine( $keys, array_reverse( $disabledImages ) );
@@ -1127,18 +1152,20 @@ abstract class TablePager extends IndexPager {
                $disabledTexts = array();
                foreach ( $labels as $type => $label ) {
                        $msgLabel = $this->msg( $label )->escaped();
-                       $linkTexts[$type] = "<img src=\"$path/{$images[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
-                       $disabledTexts[$type] = "<img src=\"$path/{$disabledImages[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
+                       $linkTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$images[$type]}",
+                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
+                       $disabledTexts[$type] = Html::element( 'img', array( 'src' => "$path/{$disabledImages[$type]}",
+                               'alt' => $msgLabel ) ) . "<br />$msgLabel";
                }
                $links = $this->getPagingLinks( $linkTexts, $disabledTexts );
 
-               $navClass = htmlspecialchars( $this->getNavClass() );
-               $s = "<table class=\"$navClass\"><tr>\n";
+               $s = Html::openElement( 'table', array( 'class' => $this->getNavClass() ) );
+               $s .= Html::openElement( 'tr' ) . "\n";
                $width = 100 / count( $links ) . '%';
                foreach ( $labels as $type => $label ) {
-                       $s .= "<td style='width:$width;'>{$links[$type]}</td>\n";
+                       $s .= Html::rawElement( 'td', array( 'style' => "width:$width;" ), $links[$type] ) . "\n";
                }
-               $s .= "</tr></table>\n";
+               $s .= Html::closeElement( 'tr' ) . Html::closeElement( 'table' ) . "\n";
                return $s;
        }
 
@@ -1148,28 +1175,40 @@ abstract class TablePager extends IndexPager {
         * @return String: HTML fragment
         */
        public function getLimitSelect() {
+               $select = new XmlSelect( 'limit', false, $this->mLimit );
+               $select->addOptions( $this->getLimitSelectList() );
+               return $select->getHTML();
+       }
+
+       /**
+        * Get a list of items to show in a "<select>" element of limits.
+        * This can be passed directly to XmlSelect::addOptions().
+        *
+        * @since 1.22
+        * @return array
+        */
+       public function getLimitSelectList() {
                # Add the current limit from the query string
                # to avoid that the limit is lost after clicking Go next time
                if ( !in_array( $this->mLimit, $this->mLimitsShown ) ) {
                        $this->mLimitsShown[] = $this->mLimit;
                        sort( $this->mLimitsShown );
                }
-               $s = Html::openElement( 'select', array( 'name' => 'limit' ) ) . "\n";
+               $ret = array();
                foreach ( $this->mLimitsShown as $key => $value ) {
                        # The pair is either $index => $limit, in which case the $value
                        # will be numeric, or $limit => $text, in which case the $value
                        # will be a string.
-                       if( is_int( $value ) ) {
+                       if ( is_int( $value ) ) {
                                $limit = $value;
                                $text = $this->getLanguage()->formatNum( $limit );
                        } else {
                                $limit = $key;
                                $text = $value;
                        }
-                       $s .= Xml::option( $text, $limit, $limit == $this->mLimit ) . "\n";
+                       $ret[$text] = $limit;
                }
-               $s .= Html::closeElement( 'select' );
-               return $s;
+               return $ret;
        }
 
        /**
@@ -1188,9 +1227,7 @@ abstract class TablePager extends IndexPager {
                }
                $s = '';
                foreach ( $query as $name => $value ) {
-                       $encName = htmlspecialchars( $name );
-                       $encValue = htmlspecialchars( $value );
-                       $s .= "<input type=\"hidden\" name=\"$encName\" value=\"$encValue\"/>\n";
+                       $s .= Html::hidden( $name, $value ) . "\n";
                }
                return $s;
        }
@@ -1203,12 +1240,14 @@ abstract class TablePager extends IndexPager {
        function getLimitForm() {
                global $wgScript;
 
-               return Xml::openElement(
+               return Html::rawElement(
                        'form',
                        array(
                                'method' => 'get',
                                'action' => $wgScript
-                       ) ) . "\n" . $this->getLimitDropdown() . "</form>\n";
+                       ),
+                       "\n" . $this->getLimitDropdown()
+               ) . "\n";
        }
 
        /**
index fc891bb..435e09e 100644 (file)
@@ -141,10 +141,10 @@ class PathRouter {
                }
 
                $pattern = (object)array(
-                       'path'    => $path,
-                       'params'  => $params,
+                       'path' => $path,
+                       'params' => $params,
                        'options' => $options,
-                       'key'     => $key,
+                       'key' => $key,
                );
                $pattern->weight = self::makeWeight( $pattern );
                $this->patterns[] = $pattern;
@@ -185,7 +185,7 @@ class PathRouter {
         */
        protected function sortByWeight() {
                $weights = array();
-               foreach( $this->patterns as $key => $pattern ) {
+               foreach ( $this->patterns as $key => $pattern ) {
                        $weights[$key] = $pattern->weight;
                }
                array_multisort( $weights, SORT_DESC, SORT_NUMERIC, $this->patterns );
@@ -203,7 +203,7 @@ class PathRouter {
                $path = explode( '/', $pattern->path );
 
                # For each level of the path
-               foreach( $path as $piece ) {
+               foreach ( $path as $piece ) {
                        if ( preg_match( '/^\$(\d+|key)$/u', $piece ) ) {
                                # For a piece that is only a $1 variable add 1 points of weight
                                $weight += 1;
index 2ebef04..2dac938 100644 (file)
  */
 
 /**
- *  When you have many workers (threads/servers) giving service, and a
+ * When you have many workers (threads/servers) giving service, and a
  * cached item expensive to produce expires, you may get several workers
  * doing the job at the same time.
  *
- *  Given enough requests and the item expiring fast (non-cacheable,
+ * Given enough requests and the item expiring fast (non-cacheable,
  * lots of edits...) that single work can end up unfairly using most (all)
  * of the cpu of the pool. This is also known as 'Michael Jackson effect'
  * since this effect triggered on the english wikipedia on the day Michael
  * Jackson died, the biographical article got hit with several edits per
  * minutes and hundreds of read hits.
  *
- *  The PoolCounter provides semaphore semantics for restricting the number
+ * The PoolCounter provides semaphore semantics for restricting the number
  * of workers that may be concurrently performing such single task.
  *
- *  By default PoolCounter_Stub is used, which provides no locking. You
+ * By default PoolCounter_Stub is used, which provides no locking. You
  * can get a useful one in the PoolCounter extension.
  */
 abstract class PoolCounter {
-
        /* Return codes */
        const LOCKED = 1; /* Lock acquired */
        const RELEASED = 2; /* Lock released */
@@ -52,39 +51,26 @@ abstract class PoolCounter {
        const TIMEOUT = -4; /* Timeout exceeded */
        const LOCK_HELD = -5; /* Cannot acquire another lock while you have one lock held */
 
-       /**
-        * I want to do this task and I need to do it myself.
-        *
-        * @return Locked/Error
-        */
-       abstract function acquireForMe();
-
-       /**
-        * I want to do this task, but if anyone else does it
-        * instead, it's also fine for me. I will read its cached data.
-        *
-        * @return Locked/Done/Error
-        */
-       abstract function acquireForAnyone();
-
-       /**
-        * I have successfully finished my task.
-        * Lets another one grab the lock, and returns the workers
-        * waiting on acquireForAnyone()
-        *
-        * @return Released/NotLocked/Error
-        */
-       abstract function release();
+       /** @var string All workers with the same key share the lock */
+       protected $key;
+       /** @var integer Maximum number of workers doing the task simultaneously */
+       protected $workers;
+       /** @var integer If this number of workers are already working/waiting, fail instead of wait */
+       protected $maxqueue;
+       /** @var float Maximum time in seconds to wait for the lock */
+       protected $timeout;
 
        /**
-        *  $key: All workers with the same key share the lock.
-        *  $workers: It wouldn't be a good idea to have more than this number of
-        * workers doing the task simultaneously.
-        *  $maxqueue: If this number of workers are already working/waiting,
-        * fail instead of wait.
-        *  $timeout: Maximum time in seconds to wait for the lock.
+        * @param array $conf
+        * @param string $type
+        * @param string $key
         */
-       protected $key, $workers, $maxqueue, $timeout;
+       protected function __construct( $conf, $type, $key ) {
+               $this->key = $key;
+               $this->workers = $conf['workers'];
+               $this->maxqueue = $conf['maxqueue'];
+               $this->timeout = $conf['timeout'];
+       }
 
        /**
         * Create a Pool counter. This should only be called from the PoolWorks.
@@ -105,58 +91,74 @@ abstract class PoolCounter {
                return new $class( $conf, $type, $key );
        }
 
-       protected function __construct( $conf, $type, $key ) {
-               $this->key = $key;
-               $this->workers = $conf['workers'];
-               $this->maxqueue = $conf['maxqueue'];
-               $this->timeout = $conf['timeout'];
-       }
-}
-
-class PoolCounter_Stub extends PoolCounter {
-
        /**
-        * @return Status
+        * I want to do this task and I need to do it myself.
+        *
+        * @return Status Value is one of Locked/Error
         */
-       function acquireForMe() {
-               return Status::newGood( PoolCounter::LOCKED );
-       }
+       abstract public function acquireForMe();
 
        /**
-        * @return Status
+        * I want to do this task, but if anyone else does it
+        * instead, it's also fine for me. I will read its cached data.
+        *
+        * @return Status Value is one of Locked/Done/Error
         */
-       function acquireForAnyone() {
-               return Status::newGood( PoolCounter::LOCKED );
-       }
+       abstract public function acquireForAnyone();
 
        /**
-        * @return Status
+        * I have successfully finished my task.
+        * Lets another one grab the lock, and returns the workers
+        * waiting on acquireForAnyone()
+        *
+        * @return Status value is one of Released/NotLocked/Error
         */
-       function release() {
-               return Status::newGood( PoolCounter::RELEASED );
-       }
+       abstract public function release();
+}
 
+class PoolCounter_Stub extends PoolCounter {
        public function __construct() {
                /* No parameters needed */
        }
+
+       public function acquireForMe() {
+               return Status::newGood( PoolCounter::LOCKED );
+       }
+
+       public function acquireForAnyone() {
+               return Status::newGood( PoolCounter::LOCKED );
+       }
+
+       public function release() {
+               return Status::newGood( PoolCounter::RELEASED );
+       }
 }
 
 /**
- * Handy class for dealing with PoolCounters using class members instead of callbacks.
+ * Class for dealing with PoolCounters using class members
  */
 abstract class PoolCounterWork {
        protected $cacheable = false; //Does this override getCachedWork() ?
 
        /**
-        * Actually perform the work, caching it if needed.
+        * @param string $type The type of PoolCounter to use
+        * @param string $key Key that identifies the queue this work is placed on
         */
-       abstract function doWork();
+       public function __construct( $type, $key ) {
+               $this->poolCounter = PoolCounter::factory( $type, $key );
+       }
+
+       /**
+        * Actually perform the work, caching it if needed
+        * @return mixed work result or false
+        */
+       abstract public function doWork();
 
        /**
         * Retrieve the work from cache
         * @return mixed work result or false
         */
-       function getCachedWork() {
+       public function getCachedWork() {
                return false;
        }
 
@@ -165,7 +167,7 @@ abstract class PoolCounterWork {
         * message.
         * @return mixed work result or false
         */
-       function fallback() {
+       public function fallback() {
                return false;
        }
 
@@ -181,17 +183,28 @@ abstract class PoolCounterWork {
         * Log an error
         *
         * @param $status Status
+        * @return void
         */
        function logError( $status ) {
                wfDebugLog( 'poolcounter', $status->getWikiText() );
        }
 
        /**
-        * Get the result of the work (whatever it is), or false.
+        * Get the result of the work (whatever it is), or the result of the error() function.
+        * This returns the result of the first applicable method that returns a non-false value,
+        * where the methods are checked in the following order:
+        *   - a) doWork()       : Applies if the work is exclusive or no another process
+        *                         is doing it, and on the condition that either this process
+        *                         successfully entered the pool or the pool counter is down.
+        *   - b) doCachedWork() : Applies if the work is cacheable and this blocked on another
+        *                         process which finished the work.
+        *   - c) fallback()     : Applies for all remaining cases.
+        * If these all fall through (by returning false), then the result of error() is returned.
+        *
         * @param $skipcache bool
-        * @return bool|mixed
+        * @return mixed
         */
-       function execute( $skipcache = false ) {
+       public function execute( $skipcache = false ) {
                if ( $this->cacheable && !$skipcache ) {
                        $status = $this->poolCounter->acquireForAnyone();
                } else {
@@ -232,15 +245,85 @@ abstract class PoolCounterWork {
                        /* These two cases should never be hit... */
                        case PoolCounter::ERROR:
                        default:
-                               $errors = array( PoolCounter::QUEUE_FULL => 'pool-queuefull', PoolCounter::TIMEOUT => 'pool-timeout' );
+                               $errors = array(
+                                       PoolCounter::QUEUE_FULL => 'pool-queuefull',
+                                       PoolCounter::TIMEOUT => 'pool-timeout' );
 
-                               $status = Status::newFatal( isset( $errors[$status->value] ) ? $errors[$status->value] : 'pool-errorunknown' );
+                               $status = Status::newFatal( isset( $errors[$status->value] )
+                                       ? $errors[$status->value]
+                                       : 'pool-errorunknown' );
                                $this->logError( $status );
                                return $this->error( $status );
                }
        }
+}
 
-       function __construct( $type, $key ) {
-               $this->poolCounter = PoolCounter::factory( $type, $key );
+/**
+ * Convenience class for dealing with PoolCounters using callbacks
+ * @since 1.22
+ */
+class PoolCounterWorkViaCallback extends PoolCounterWork {
+       /** @var callable */
+       protected $doWork;
+       /** @var callable|null */
+       protected $doCachedWork;
+       /** @var callable|null */
+       protected $fallback;
+       /** @var callable|null */
+       protected $error;
+
+       /**
+        * Build a PoolCounterWork class from a type, key, and callback map.
+        *
+        * The callback map must at least have a callback for the 'doWork' method.
+        * Additionally, callbacks can be provided for the 'doCachedWork', 'fallback',
+        * and 'error' methods. Methods without callbacks will be no-ops that return false.
+        * If a 'doCachedWork' callback is provided, then execute() may wait for any prior
+        * process in the pool to finish and reuse its cached result.
+        *
+        * @param string $type
+        * @param string $key
+        * @param array $callbacks Map of callbacks
+        * @throws MWException
+        */
+       public function __construct( $type, $key, array $callbacks ) {
+               parent::__construct( $type, $key );
+               foreach ( array( 'doWork', 'doCachedWork', 'fallback', 'error' ) as $name ) {
+                       if ( isset( $callbacks[$name] ) ) {
+                               if ( !is_callable( $callbacks[$name] ) ) {
+                                       throw new MWException( "Invalid callback provided for '$name' function." );
+                               }
+                               $this->$name = $callbacks[$name];
+                       }
+               }
+               if ( !isset( $this->doWork ) ) {
+                       throw new MWException( "No callback provided for 'doWork' function." );
+               }
+               $this->cacheable = isset( $this->doCachedWork );
+       }
+
+       public function doWork() {
+               return call_user_func_array( $this->doWork, array() );
+       }
+
+       public function getCachedWork() {
+               if ( $this->doCachedWork ) {
+                       return call_user_func_array( $this->doCachedWork, array() );
+               }
+               return false;
+       }
+
+       function fallback() {
+               if ( $this->fallback ) {
+                       return call_user_func_array( $this->fallback, array() );
+               }
+               return false;
+       }
+
+       function error( $status ) {
+               if ( $this->error ) {
+                       return call_user_func_array( $this->error, array( $status ) );
+               }
+               return false;
        }
 }
index 56dba05..848cd32 100644 (file)
@@ -90,10 +90,14 @@ class Preferences {
                        }
                }
 
+               ## Make sure that form fields have their parent set. See bug 41337.
+               $dummyForm = new HTMLForm( array(), $context );
+
                ## Prod in defaults from the user
                foreach ( $defaultPreferences as $name => &$info ) {
                        $prefFromUser = self::getOptionFromUser( $name, $info, $user );
                        $field = HTMLForm::loadInputFromParameters( $name, $info ); // For validation
+                       $field->mParent = $dummyForm;
                        $defaultOptions = User::getDefaultOptions();
                        $globalDefault = isset( $defaultOptions[$name] )
                                ? $defaultOptions[$name]
@@ -153,7 +157,7 @@ class Preferences {
 
                        foreach ( $columns as $column ) {
                                foreach ( $rows as $row ) {
-                                       if ( $user->getOption( "$prefix-$column-$row" ) ) {
+                                       if ( $user->getOption( "$prefix$column-$row" ) ) {
                                                $val[] = "$column-$row";
                                        }
                                }
@@ -225,10 +229,14 @@ class Preferences {
                        'section' => 'personal/info',
                );
 
+               $editCount = Linker::link( SpecialPage::getTitleFor( "Contributions", $userName ),
+                       $lang->formatNum( $user->getEditCount() ) );
+
                $defaultPreferences['editcount'] = array(
                        'type' => 'info',
+                       'raw' => true,
                        'label-message' => 'prefs-edits',
-                       'default' => $lang->formatNum( $user->getEditCount() ),
+                       'default' => $editCount,
                        'section' => 'personal/info',
                );
 
@@ -310,23 +318,23 @@ class Preferences {
                        'label-message' => 'yourlanguage',
                );
 
-               /* see if there are multiple language variants to choose from*/
-               $variantArray = array();
+               // see if there are multiple language variants to choose from
                if ( !$wgDisableLangConversion ) {
                        $variants = $wgContLang->getVariants();
 
-                       foreach ( $variants as $v ) {
-                               $v = str_replace( '_', '-', strtolower( $v ) );
-                               $variantArray[$v] = $wgContLang->getVariantname( $v, false );
-                       }
+                       if ( count( $variants ) > 1 ) {
+                               $variantArray = array();
+                               foreach ( $variants as $v ) {
+                                       $v = str_replace( '_', '-', strtolower( $v ) );
+                                       $variantArray[$v] = $wgContLang->getVariantname( $v, false );
+                               }
 
-                       $options = array();
-                       foreach ( $variantArray as $code => $name ) {
-                               $display = wfBCP47( $code ) . ' - ' . $name;
-                               $options[$display] = $code;
-                       }
+                               $options = array();
+                               foreach ( $variantArray as $code => $name ) {
+                                       $display = wfBCP47( $code ) . ' - ' . $name;
+                                       $options[$display] = $code;
+                               }
 
-                       if ( count( $variantArray ) > 1 ) {
                                $defaultPreferences['variant'] = array(
                                        'label-message' => 'yourvariant',
                                        'type' => 'select',
@@ -334,16 +342,16 @@ class Preferences {
                                        'section' => 'personal/i18n',
                                        'help-message' => 'prefs-help-variant',
                                );
-                       }
-               }
 
-               if ( count( $variantArray ) > 1 && !$wgDisableLangConversion && !$wgDisableTitleConversion ) {
-                       $defaultPreferences['noconvertlink'] =
-                               array(
-                               'type' => 'toggle',
-                               'section' => 'personal/i18n',
-                               'label-message' => 'tog-noconvertlink',
-                       );
+                               if ( !$wgDisableTitleConversion ) {
+                                       $defaultPreferences['noconvertlink'] =
+                                               array(
+                                               'type' => 'toggle',
+                                               'section' => 'personal/i18n',
+                                               'label-message' => 'tog-noconvertlink',
+                                       );
+                               }
+                       }
                }
 
                // show a preview of the old signature first
@@ -378,7 +386,7 @@ class Preferences {
                                        ? 'prefs-help-email-required'
                                        : 'prefs-help-email';
 
-                       if( $wgEnableUserEmail ) {
+                       if ( $wgEnableUserEmail ) {
                                // additional messages when users can send email to each other
                                $helpMessages[] = 'prefs-help-email-others';
                        }
@@ -409,8 +417,8 @@ class Preferences {
 
                        $disableEmailPrefs = false;
 
-                       $emailauthenticationclass = 'mw-email-not-authenticated';
                        if ( $wgEmailAuthentication ) {
+                               $emailauthenticationclass = 'mw-email-not-authenticated';
                                if ( $user->getEmail() ) {
                                        if ( $user->getEmailAuthenticationTimestamp() ) {
                                                // date and time are separate parameters to facilitate localisation.
@@ -432,7 +440,7 @@ class Preferences {
                                                                SpecialPage::getTitleFor( 'Confirmemail' ),
                                                                $context->msg( 'emailconfirmlink' )->escaped()
                                                        ) . '<br />';
-                                               $emailauthenticationclass="mw-email-not-authenticated";
+                                               $emailauthenticationclass = "mw-email-not-authenticated";
                                        }
                                } else {
                                        $disableEmailPrefs = true;
@@ -449,8 +457,8 @@ class Preferences {
                                        # Apply the same CSS class used on the input to the message:
                                        'cssclass' => $emailauthenticationclass,
                                );
+                               $defaultPreferences['emailaddress']['cssclass'] = $emailauthenticationclass;
                        }
-                       $defaultPreferences['emailaddress']['cssclass'] = $emailauthenticationclass;
 
                        if ( $wgEnableUserEmail && $user->isAllowed( 'sendemail' ) ) {
                                $defaultPreferences['disablemail'] = array(
@@ -546,18 +554,6 @@ class Preferences {
                                'section' => 'rendering/skin',
                        );
                }
-
-               $selectedSkin = $user->getOption( 'skin' );
-               if ( in_array( $selectedSkin, array( 'cologneblue', 'standard' ) ) ) {
-                       $settings = array_flip( $context->getLanguage()->getQuickbarSettings() );
-
-                       $defaultPreferences['quickbar'] = array(
-                               'type' => 'radio',
-                               'options' => $settings,
-                               'section' => 'rendering/skin',
-                               'label-message' => 'qbsettings',
-                       );
-               }
        }
 
        /**
@@ -686,7 +682,7 @@ class Preferences {
                        'section' => 'rendering/advancedrendering',
                        'options' => $stubThresholdOptions,
                        'size' => 20,
-                       'label' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
+                       'label-raw' => $context->msg( 'stub-threshold' )->text(), // Raw HTML message. Yay?
                );
 
                if ( $wgAllowUserCssPrefs ) {
@@ -733,7 +729,7 @@ class Preferences {
         * @param $defaultPreferences Array
         */
        static function editingPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgUseExternalEditor, $wgAllowUserCssPrefs;
+               global $wgAllowUserCssPrefs;
 
                ## Editing #####################################
                $defaultPreferences['cols'] = array(
@@ -806,19 +802,6 @@ class Preferences {
                        );
                }
 
-               if ( $wgUseExternalEditor ) {
-                       $defaultPreferences['externaleditor'] = array(
-                               'type' => 'toggle',
-                               'section' => 'editing/advancedediting',
-                               'label-message' => 'tog-externaleditor',
-                       );
-                       $defaultPreferences['externaldiff'] = array(
-                               'type' => 'toggle',
-                               'section' => 'editing/advancedediting',
-                               'label-message' => 'tog-externaldiff',
-                       );
-               }
-
                $defaultPreferences['forceeditsummary'] = array(
                        'type' => 'toggle',
                        'section' => 'editing/advancedediting',
@@ -830,6 +813,13 @@ class Preferences {
                        'section' => 'editing/advancedediting',
                        'label-message' => 'tog-uselivepreview',
                );
+
+               $defaultPreferences['useeditwarning'] = array(
+                       'type' => 'toggle',
+                       'section' => 'editing/advancedediting',
+                       'label-message' => 'tog-useeditwarning',
+               );
+
        }
 
        /**
@@ -1030,8 +1020,9 @@ class Preferences {
                $nsOptions = $wgContLang->getFormattedNamespaces();
                $nsOptions[0] = $context->msg( 'blanknamespace' )->text();
                foreach ( $nsOptions as $ns => $name ) {
-                       if ( $ns < 0 )
+                       if ( $ns < 0 ) {
                                unset( $nsOptions[$ns] );
+                       }
                }
 
                $defaultPreferences['searchnamespaces'] = array(
@@ -1110,7 +1101,7 @@ class Preferences {
                        }
 
                        # Create preview link
-                       $mplink = htmlspecialchars( $mptitle->getLocalURL( "useskin=$skinkey" ) );
+                       $mplink = htmlspecialchars( $mptitle->getLocalURL( array( 'useskin' => $skinkey ) ) );
                        $linkTools[] = "<a target='_blank' href=\"$mplink\">$previewtext</a>";
 
                        # Create links to user CSS/JS pages
@@ -1278,6 +1269,7 @@ class Preferences {
        }
 
        /**
+        * @param $context IContextSource
         * @return array
         */
        static function getTimezoneOptions( IContextSource $context ) {
@@ -1368,7 +1360,9 @@ class Preferences {
                                        $data[0] = intval( $data[0] );
                                        $data[1] = intval( $data[1] );
                                        $minDiff = abs( $data[0] ) * 60 + $data[1];
-                                       if ( $data[0] < 0 ) $minDiff = - $minDiff;
+                                       if ( $data[0] < 0 ) {
+                                               $minDiff = - $minDiff;
+                                       }
                                } else {
                                        $minDiff = intval( $data[0] ) * 60;
                                }
@@ -1382,6 +1376,8 @@ class Preferences {
        }
 
        /**
+        * Handle the form submission if everything validated properly
+        *
         * @param $formData
         * @param $form PreferencesForm
         * @param $entryPoint string
@@ -1421,7 +1417,7 @@ class Preferences {
                # via $wgHiddenPrefs, we don't want to destroy that setting in case the preference
                # is subsequently re-enabled
                # TODO: maintenance script to actually delete these
-               foreach( $wgHiddenPrefs as $pref ) {
+               foreach ( $wgHiddenPrefs as $pref ) {
                        # If the user has not set a non-default value here, the default will be returned
                        # and subsequently discarded
                        $formData[$pref] = $user->getOption( $pref, null, true );
@@ -1488,7 +1484,7 @@ class Preferences {
        }
 
        /**
-        * @deprecated in 1.19; will be removed in 1.20.
+        * @deprecated in 1.19
         * @param $user User
         * @return array
         */
@@ -1570,40 +1566,19 @@ class PreferencesForm extends HTMLForm {
        }
 
        /**
+        * Separate multi-option preferences into multiple preferences, since we
+        * have to store them separately
         * @param $data array
         * @return array
         */
        function filterDataForSubmit( $data ) {
-               // Support for separating multi-option preferences into multiple preferences
-               // Due to lack of array support.
                foreach ( $this->mFlatFields as $fieldname => $field ) {
-                       $info = $field->mParams;
-
-                       if ( $field instanceof HTMLMultiSelectField ) {
-                               $options = HTMLFormField::flattenOptions( $info['options'] );
-                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
-
-                               foreach ( $options as $opt ) {
-                                       $data["$prefix$opt"] = in_array( $opt, $data[$fieldname] );
-                               }
-
-                               unset( $data[$fieldname] );
-
-                       } elseif ( $field instanceof HTMLCheckMatrix ) {
-                               $columns = HTMLFormField::flattenOptions( $info['columns'] );
-                               $rows = HTMLFormField::flattenOptions( $info['rows'] );
+                       if ( $field instanceof HTMLNestedFilterable ) {
+                               $info = $field->mParams;
                                $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
-                               foreach ( $columns as $column ) {
-                                       foreach ( $rows as $row ) {
-                                               // Make sure option hasn't been removed
-                                               if ( !isset( $info['remove-options'] )
-                                                       || !in_array( "$column-$row", $info['remove-options'] ) )
-                                               {
-                                                       $data["$prefix-$column-$row"] = in_array( "$column-$row", $data[$fieldname] );
-                                               }
-                                       }
+                               foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
+                                       $data["$prefix$key"] = $value;
                                }
-
                                unset( $data[$fieldname] );
                        }
                }
index d37d9e8..3c464c5 100644 (file)
@@ -37,16 +37,16 @@ class PrefixSearch {
         */
        public static function titleSearch( $search, $limit, $namespaces = array() ) {
                $search = trim( $search );
-               if( $search == '' ) {
+               if ( $search == '' ) {
                        return array(); // Return empty result
                }
                $namespaces = self::validateNamespaces( $namespaces );
 
                // Find a Title which is not an interwiki and is in NS_MAIN
                $title = Title::newFromText( $search );
-               if( $title && $title->getInterwiki() == '' ) {
+               if ( $title && $title->getInterwiki() == '' ) {
                        $ns = array( $title->getNamespace() );
-                       if( $ns[0] == NS_MAIN ) {
+                       if ( $ns[0] == NS_MAIN ) {
                                $ns = $namespaces; // no explicit prefix, use default namespaces
                        }
                        return self::searchBackend(
@@ -55,7 +55,7 @@ class PrefixSearch {
 
                // Is this a namespace prefix?
                $title = Title::newFromText( $search . 'Dummy' );
-               if( $title && $title->getText() == 'Dummy'
+               if ( $title && $title->getText() == 'Dummy'
                        && $title->getNamespace() != NS_MAIN
                        && $title->getInterwiki() == '' ) {
                        return self::searchBackend(
@@ -73,16 +73,16 @@ class PrefixSearch {
         * @return Array of strings
         */
        protected static function searchBackend( $namespaces, $search, $limit ) {
-               if( count( $namespaces ) == 1 ) {
+               if ( count( $namespaces ) == 1 ) {
                        $ns = $namespaces[0];
-                       if( $ns == NS_MEDIA ) {
+                       if ( $ns == NS_MEDIA ) {
                                $namespaces = array( NS_FILE );
-                       } elseif( $ns == NS_SPECIAL ) {
+                       } elseif ( $ns == NS_SPECIAL ) {
                                return self::specialSearch( $search, $limit );
                        }
                }
                $srchres = array();
-               if( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
+               if ( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
                        return self::defaultSearchBackend( $namespaces, $search, $limit );
                }
                return $srchres;
@@ -106,24 +106,24 @@ class PrefixSearch {
                // Unlike SpecialPage itself, we want the canonical forms of both
                // canonical and alias title forms...
                $keys = array();
-               foreach( SpecialPageFactory::getList() as $page => $class ) {
+               foreach ( SpecialPageFactory::getList() as $page => $class ) {
                        $keys[$wgContLang->caseFold( $page )] = $page;
                }
 
-               foreach( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
-                       if( !array_key_exists( $page, SpecialPageFactory::getList() ) ) {# bug 20885
+               foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
+                       if ( !array_key_exists( $page, SpecialPageFactory::getList() ) ) {# bug 20885
                                continue;
                        }
 
-                       foreach( $aliases as $alias ) {
+                       foreach ( $aliases as $alias ) {
                                $keys[$wgContLang->caseFold( $alias )] = $alias;
                        }
                }
                ksort( $keys );
 
                $srchres = array();
-               foreach( $keys as $pageKey => $page ) {
-                       if( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
+               foreach ( $keys as $pageKey => $page ) {
+                       if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
                                wfSuppressWarnings();
                                // bug 27671: Don't use SpecialPage::getTitleFor() here because it
                                // localizes its input leading to searches for e.g. Special:All
@@ -133,7 +133,7 @@ class PrefixSearch {
                                wfRestoreWarnings();
                        }
 
-                       if( count( $srchres ) >= $limit ) {
+                       if ( count( $srchres ) >= $limit ) {
                                break;
                        }
                }
@@ -154,7 +154,7 @@ class PrefixSearch {
         */
        protected static function defaultSearchBackend( $namespaces, $search, $limit ) {
                $ns = array_shift( $namespaces ); // support only one namespace
-               if( in_array( NS_MAIN, $namespaces ) ) {
+               if ( in_array( NS_MAIN, $namespaces ) ) {
                        $ns = NS_MAIN; // if searching on many always default to main
                }
 
@@ -175,7 +175,7 @@ class PrefixSearch {
                $data = $module->getResultData();
 
                // Reformat useful data for future printing by JSON engine
-               $srchres = array ();
+               $srchres = array();
                foreach ( (array)$data['query']['allpages'] as $pageinfo ) {
                        // Note: this data will no be printable by the xml engine
                        // because it does not support lists of unnamed items
@@ -196,14 +196,14 @@ class PrefixSearch {
 
                // We will look at each given namespace against wgContLang namespaces
                $validNamespaces = $wgContLang->getNamespaces();
-               if( is_array( $namespaces ) && count( $namespaces ) > 0 ) {
+               if ( is_array( $namespaces ) && count( $namespaces ) > 0 ) {
                        $valid = array();
                        foreach ( $namespaces as $ns ) {
-                               if( is_numeric( $ns ) && array_key_exists( $ns, $validNamespaces ) ) {
+                               if ( is_numeric( $ns ) && array_key_exists( $ns, $validNamespaces ) ) {
                                        $valid[] = $ns;
                                }
                        }
-                       if( count( $valid ) > 0 ) {
+                       if ( count( $valid ) > 0 ) {
                                return $valid;
                        }
                }
index d7b8840..6f444ee 100644 (file)
@@ -91,7 +91,7 @@ class ProtectionForm {
                $this->mReasonSelection = $wgRequest->getText( 'wpProtectReasonSelection' );
                $this->mCascade = $wgRequest->getBool( 'mwProtect-cascade', $this->mCascade );
 
-               foreach( $this->mApplicableTypes as $action ) {
+               foreach ( $this->mApplicableTypes as $action ) {
                        // @todo FIXME: This form currently requires individual selections,
                        // but the db allows multiples separated by commas.
 
@@ -132,15 +132,15 @@ class ProtectionForm {
                        }
 
                        $val = $wgRequest->getVal( "mwProtect-level-$action" );
-                       if( isset( $val ) && in_array( $val, $wgRestrictionLevels ) ) {
+                       if ( isset( $val ) && in_array( $val, $wgRestrictionLevels ) ) {
                                // Prevent users from setting levels that they cannot later unset
-                               if( $val == 'sysop' ) {
+                               if ( $val == 'sysop' ) {
                                        // Special case, rewrite sysop to either protect and editprotected
-                                       if( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) )
-                                               continue;
-                               } else {
-                                       if( !$wgUser->isAllowed( $val ) )
+                                       if ( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) ) {
                                                continue;
+                                       }
+                               } elseif ( !$wgUser->isAllowed( $val ) ) {
+                                       continue;
                                }
                                $this->mRestrictions[$action] = $val;
                        }
@@ -188,10 +188,10 @@ class ProtectionForm {
                        throw new ErrorPageError( 'protect-badnamespace-title', 'protect-badnamespace-text' );
                }
 
-               if( $wgRequest->wasPosted() ) {
-                       if( $this->save() ) {
+               if ( $wgRequest->wasPosted() ) {
+                       if ( $this->save() ) {
                                $q = $this->mArticle->isRedirect() ? 'redirect=no' : '';
-                               $wgOut->redirect( $this->mTitle->getFullUrl( $q ) );
+                               $wgOut->redirect( $this->mTitle->getFullURL( $q ) );
                        }
                } else {
                        $this->show();
@@ -282,10 +282,11 @@ class ProtectionForm {
                        $reasonstr = $this->mReason;
                }
                $expiry = array();
-               foreach( $this->mApplicableTypes as $action ) {
+               foreach ( $this->mApplicableTypes as $action ) {
                        $expiry[$action] = $this->getExpiry( $action );
-                       if( empty( $this->mRestrictions[$action] ) )
+                       if ( empty( $this->mRestrictions[$action] ) ) {
                                continue; // unprotected
+                       }
                        if ( !$expiry[$action] ) {
                                $this->show( array( 'protect_expiry_invalid' ) );
                                return false;
@@ -300,9 +301,10 @@ class ProtectionForm {
                #  to a semi-protected page.
                $edit_restriction = isset( $this->mRestrictions['edit'] ) ? $this->mRestrictions['edit'] : '';
                $this->mCascade = $wgRequest->getBool( 'mwProtect-cascade' );
-               if ( $this->mCascade && ($edit_restriction != 'protect') &&
-                       !User::groupHasPermission( $edit_restriction, 'protect' ) )
+               if ( $this->mCascade && ( $edit_restriction != 'protect' ) &&
+                       !User::groupHasPermission( $edit_restriction, 'protect' ) ) {
                        $this->mCascade = false;
+               }
 
                $status = $this->mArticle->doUpdateRestrictions( $this->mRestrictions, $expiry, $this->mCascade, $reasonstr, $wgUser );
 
@@ -318,12 +320,12 @@ class ProtectionForm {
                 *             you can also return an array of message name and its parameters
                 */
                $errorMsg = '';
-               if( !wfRunHooks( 'ProtectionForm::save', array( $this->mArticle, &$errorMsg ) ) ) {
+               if ( !wfRunHooks( 'ProtectionForm::save', array( $this->mArticle, &$errorMsg ) ) ) {
                        if ( $errorMsg == '' ) {
                                $errorMsg = array( 'hookaborted' );
                        }
                }
-               if( $errorMsg != '' ) {
+               if ( $errorMsg != '' ) {
                        $this->show( $errorMsg );
                        return false;
                }
@@ -356,10 +358,10 @@ class ProtectionForm {
                );
 
                $out = '';
-               if( !$this->disabled ) {
+               if ( !$this->disabled ) {
                        $wgOut->addModules( 'mediawiki.legacy.protect' );
                        $out .= Xml::openElement( 'form', array( 'method' => 'post',
-                               'action' => $this->mTitle->getLocalUrl( 'action=protect' ),
+                               'action' => $this->mTitle->getLocalURL( 'action=protect' ),
                                'id' => 'mw-Protect-Form', 'onsubmit' => 'ProtectionForm.enableUnchainedInputs(true)' ) );
                }
 
@@ -368,10 +370,10 @@ class ProtectionForm {
                        Xml::openElement( 'table', array( 'id' => 'mwProtectSet' ) ) .
                        Xml::openElement( 'tbody' );
 
-               foreach( $this->mRestrictions as $action => $selected ) {
+               foreach ( $this->mRestrictions as $action => $selected ) {
                        /* Not all languages have V_x <-> N_x relation */
                        $msg = wfMessage( 'restriction-' . $action );
-                       $out .= "<tr><td>".
+                       $out .= "<tr><td>" .
                        Xml::openElement( 'fieldset' ) .
                        Xml::element( 'legend', null, $msg->exists() ? $msg->text() : $action ) .
                        Xml::openElement( 'table', array( 'id' => "mw-protect-table-$action" ) ) .
@@ -384,7 +386,7 @@ class ProtectionForm {
                                'mwProtect-reason', 4 );
                        $scExpiryOptions = wfMessage( 'protect-expiry-options' )->inContentLanguage()->text();
 
-                       $showProtectOptions = ($scExpiryOptions !== '-' && !$this->disabled);
+                       $showProtectOptions = $scExpiryOptions !== '-' && !$this->disabled;
 
                        $mProtectexpiry = Xml::label(
                                wfMessage( 'protectexpiry' )->text(),
@@ -412,7 +414,7 @@ class ProtectionForm {
                                wfMessage( 'protect-othertime-op' )->text(),
                                "othertime"
                        ) . "\n";
-                       foreach( explode( ',', $scExpiryOptions ) as $option ) {
+                       foreach ( explode( ',', $scExpiryOptions ) as $option ) {
                                if ( strpos( $option, ":" ) === false ) {
                                        $show = $value = $option;
                                } else {
@@ -423,7 +425,7 @@ class ProtectionForm {
                                $expiryFormOptions .= Xml::option( $show, $value, $this->mExpirySelection[$action] === $value ) . "\n";
                        }
                        # Add expiry dropdown
-                       if( $showProtectOptions && !$this->disabled ) {
+                       if ( $showProtectOptions && !$this->disabled ) {
                                $out .= "
                                        <table><tr>
                                                <td class='mw-label'>
@@ -463,7 +465,7 @@ class ProtectionForm {
                $out .= Xml::closeElement( 'tbody' ) . Xml::closeElement( 'table' );
 
                // JavaScript will add another row with a value-chaining checkbox
-               if( $this->mTitle->exists() ) {
+               if ( $this->mTitle->exists() ) {
                        $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table2' ) ) .
                                Xml::openElement( 'tbody' );
                        $out .= '<tr>
@@ -481,7 +483,7 @@ class ProtectionForm {
                }
 
                # Add manual and custom reason field/selects as well as submit
-               if( !$this->disabled ) {
+               if ( !$this->disabled ) {
                        $out .= Xml::openElement( 'table', array( 'id' => 'mw-protect-table3' ) ) .
                                Xml::openElement( 'tbody' );
                        $out .= "
@@ -506,7 +508,7 @@ class ProtectionForm {
                                        "</td>
                                </tr>";
                        # Disallow watching is user is not logged in
-                       if( $wgUser->isLoggedIn() ) {
+                       if ( $wgUser->isLoggedIn() ) {
                                $out .= "
                                <tr>
                                        <td></td>
@@ -562,15 +564,17 @@ class ProtectionForm {
                global $wgRestrictionLevels, $wgUser;
 
                $levels = array();
-               foreach( $wgRestrictionLevels as $key ) {
+               foreach ( $wgRestrictionLevels as $key ) {
                        //don't let them choose levels above their own (aka so they can still unprotect and edit the page). but only when the form isn't disabled
-                       if( $key == 'sysop' ) {
+                       if ( $key == 'sysop' ) {
                                //special case, rewrite sysop to protect and editprotected
-                               if( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) && !$this->disabled )
+                               if ( !$wgUser->isAllowedAny( 'protect', 'editprotected' ) && !$this->disabled ) {
                                        continue;
+                               }
                        } else {
-                               if( !$wgUser->isAllowed( $key ) && !$this->disabled )
+                               if ( !$wgUser->isAllowed( $key ) && !$this->disabled ) {
                                        continue;
+                               }
                        }
                        $levels[] = $key;
                }
@@ -584,7 +588,7 @@ class ProtectionForm {
                        ) + $this->disabledAttrib;
 
                $out = Xml::openElement( 'select', $attribs );
-               foreach( $levels as $key ) {
+               foreach ( $levels as $key ) {
                        $out .= Xml::option( $this->getOptionLabel( $key ), $key, $key == $selected );
                }
                $out .= Xml::closeElement( 'select' );
@@ -598,11 +602,11 @@ class ProtectionForm {
         * @return String
         */
        private function getOptionLabel( $permission ) {
-               if( $permission == '' ) {
+               if ( $permission == '' ) {
                        return wfMessage( 'protect-default' )->text();
                } else {
                        $msg = wfMessage( "protect-level-{$permission}" );
-                       if( $msg->exists() ) {
+                       if ( $msg->exists() ) {
                                return $msg->text();
                        }
                        return wfMessage( 'protect-fallback', $permission )->text();
@@ -610,16 +614,9 @@ class ProtectionForm {
        }
 
        function buildCleanupScript() {
-               global $wgRestrictionLevels, $wgOut;
-
-               $cascadeableLevels = array();
-               foreach( $wgRestrictionLevels as $key ) {
-                       if ( User::groupHasPermission( $key, 'protect' )
-                               || $key == 'protect'
-                       ) {
-                               $cascadeableLevels[] = $key;
-                       }
-               }
+               global $wgCascadingRestrictionLevels, $wgOut;
+
+               $cascadeableLevels = $wgCascadingRestrictionLevels;
                $options = array(
                        'tableId' => 'mwProtectSet',
                        'labelText' => wfMessage( 'protect-unchain-permissions' )->plain(),
index e1f24fa..a93639a 100644 (file)
@@ -69,8 +69,9 @@ $wgQueryPages = array(
 wfRunHooks( 'wgQueryPages', array( &$wgQueryPages ) );
 
 global $wgDisableCounters;
-if ( !$wgDisableCounters )
+if ( !$wgDisableCounters ) {
        $wgQueryPages[] = array( 'PopularPagesPage', 'Popularpages' );
+}
 
 /**
  * This is a class for doing query pages; since they're almost all the same,
@@ -89,7 +90,7 @@ abstract class QueryPage extends SpecialPage {
        /**
         * The offset and limit in use, as passed to the query() function
         *
-        * @var integer
+        * @var int
         */
        var $offset = 0;
        var $limit = 0;
@@ -111,7 +112,7 @@ abstract class QueryPage extends SpecialPage {
        /**
         * A mutator for $this->listoutput;
         *
-        * @param $bool Boolean
+        * @param bool $bool
         */
        function setListoutput( $bool ) {
                $this->listoutput = $bool;
@@ -186,7 +187,7 @@ abstract class QueryPage extends SpecialPage {
        /**
         * Override to sort by increasing values
         *
-        * @return Boolean
+        * @return bool
         */
        function sortDescending() {
                return true;
@@ -197,7 +198,7 @@ abstract class QueryPage extends SpecialPage {
         * don't let it run in miser mode. $wgDisableQueryPages causes all query
         * pages to be declared expensive. Some query pages are always expensive.
         *
-        * @return Boolean
+        * @return bool
         */
        function isExpensive() {
                global $wgDisableQueryPages;
@@ -208,7 +209,7 @@ abstract class QueryPage extends SpecialPage {
         * Is the output of this query cacheable? Non-cacheable expensive pages
         * will be disabled in miser mode and will not have their results written
         * to the querycache table.
-        * @return Boolean
+        * @return bool
         * @since 1.18
         */
        public function isCacheable() {
@@ -219,7 +220,7 @@ abstract class QueryPage extends SpecialPage {
         * Whether or not the output of the page in question is retrieved from
         * the database cache.
         *
-        * @return Boolean
+        * @return bool
         */
        function isCached() {
                global $wgMiserMode;
@@ -230,7 +231,7 @@ abstract class QueryPage extends SpecialPage {
        /**
         * Sometime we don't want to build rss / atom feeds.
         *
-        * @return Boolean
+        * @return bool
         */
        function isSyndicated() {
                return true;
@@ -241,19 +242,16 @@ abstract class QueryPage extends SpecialPage {
         * skin; you can use it for making links. The result is a single row of
         * result data. You should be able to grab SQL results off of it.
         * If the function returns false, the line output will be skipped.
-        * @param $skin Skin
-        * @param $result object Result row
-        * @return mixed String or false to skip
-        *
-        * @param $skin Skin object
-        * @param $result Object: database row
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string|bool String or false to skip
         */
        abstract function formatResult( $skin, $result );
 
        /**
         * The content returned by this function will be output before any result
         *
-        * @return String
+        * @return string
         */
        function getPageHeader() {
                return '';
@@ -264,7 +262,7 @@ abstract class QueryPage extends SpecialPage {
         * as an associative array. They will be encoded and added to the paging
         * links (prev/next/lengths).
         *
-        * @return Array
+        * @return array
         */
        function linkParameters() {
                return array();
@@ -285,8 +283,9 @@ abstract class QueryPage extends SpecialPage {
        /**
         * Clear the cache and save new results
         *
-        * @param $limit Integer: limit for SQL statement
-        * @param $ignoreErrors Boolean: whether to ignore database errors
+        * @param int|bool $limit Limit for SQL statement
+        * @param bool $ignoreErrors Whether to ignore database errors
+        * @throws DBError|Exception
         * @return bool|int
         */
        function recache( $limit, $ignoreErrors = true ) {
@@ -351,8 +350,8 @@ abstract class QueryPage extends SpecialPage {
 
        /**
         * Run the query and return the result
-        * @param $limit mixed Numerical limit or false for no limit
-        * @param $offset mixed Numerical offset or false for no offset
+        * @param int|bool $limit Numerical limit or false for no limit
+        * @param int|bool $offset Numerical offset or false for no offset
         * @return ResultWrapper
         * @since 1.18
         */
@@ -361,23 +360,28 @@ abstract class QueryPage extends SpecialPage {
                $dbr = wfGetDB( DB_SLAVE );
                $query = $this->getQueryInfo();
                $order = $this->getOrderFields();
+
                if ( $this->sortDescending() ) {
                        foreach ( $order as &$field ) {
                                $field .= ' DESC';
                        }
                }
+
                if ( is_array( $query ) ) {
                        $tables = isset( $query['tables'] ) ? (array)$query['tables'] : array();
                        $fields = isset( $query['fields'] ) ? (array)$query['fields'] : array();
                        $conds = isset( $query['conds'] ) ? (array)$query['conds'] : array();
                        $options = isset( $query['options'] ) ? (array)$query['options'] : array();
                        $join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : array();
+
                        if ( count( $order ) ) {
                                $options['ORDER BY'] = $order;
                        }
+
                        if ( $limit !== false ) {
                                $options['LIMIT'] = intval( $limit );
                        }
+
                        if ( $offset !== false ) {
                                $options['OFFSET'] = intval( $offset );
                        }
@@ -392,11 +396,14 @@ abstract class QueryPage extends SpecialPage {
                        $sql = $dbr->limitResult( $sql, $limit, $offset );
                        $res = $dbr->query( $sql, $fname );
                }
+
                return $dbr->resultObject( $res );
        }
 
        /**
         * Somewhat deprecated, you probably want to be using execute()
+        * @param int|bool $offset
+        * @oaram int|bool $limit
         * @return ResultWrapper
         */
        function doQuery( $offset = false, $limit = false ) {
@@ -409,14 +416,14 @@ abstract class QueryPage extends SpecialPage {
 
        /**
         * Fetch the query results from the query cache
-        * @param $limit mixed Numerical limit or false for no limit
-        * @param $offset mixed Numerical offset or false for no offset
+        * @param int|bool $limit Numerical limit or false for no limit
+        * @param int|bool $offset Numerical offset or false for no offset
         * @return ResultWrapper
         * @since 1.18
         */
        function fetchFromCache( $limit, $offset = false ) {
                $dbr = wfGetDB( DB_SLAVE );
-               $options = array ();
+               $options = array();
                if ( $limit !== false ) {
                        $options['LIMIT'] = intval( $limit );
                }
@@ -451,6 +458,7 @@ abstract class QueryPage extends SpecialPage {
        /**
         * This is the actual workhorse. It does everything needed to make a
         * real, honest-to-gosh query page.
+        * @para $par
         * @return int
         */
        function execute( $par ) {
@@ -562,12 +570,12 @@ abstract class QueryPage extends SpecialPage {
         * Format and output report results using the given information plus
         * OutputPage
         *
-        * @param $out OutputPage to print to
-        * @param $skin Skin: user skin to use
-        * @param $dbr Database (read) connection to use
-        * @param $res Integer: result pointer
-        * @param $num Integer: number of available result rows
-        * @param $offset Integer: paging offset
+        * @param OutputPage $out OutputPage to print to
+        * @param Skin $skin User skin to use
+        * @param DatabaseBase $dbr Database (read) connection to use
+        * @param int $res Result pointer
+        * @param int $num Number of available result rows
+        * @param int $offset Paging offset
         */
        protected function outputResults( $out, $skin, $dbr, $res, $num, $offset ) {
                global $wgContLang;
@@ -635,11 +643,15 @@ abstract class QueryPage extends SpecialPage {
 
        /**
         * Do any necessary preprocessing of the result object.
+        * @param DatabaseBase $db
+        * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {}
 
        /**
         * Similar to above, but packaging in a syndicated feed instead of a web page
+        * @param string $class
+        * @param int $limit
         * @return bool
         */
        function doFeed( $class = '', $limit = 50 ) {
@@ -680,6 +692,7 @@ abstract class QueryPage extends SpecialPage {
        /**
         * Override for custom handling. If the titles/links are ok, just do
         * feedItemDesc()
+        * @param object $row
         * @return FeedItem|null
         */
        function feedResult( $row ) {
@@ -735,7 +748,6 @@ abstract class QueryPage extends SpecialPage {
  * WantedPages, WantedTemplates, etc
  */
 abstract class WantedQueryPage extends QueryPage {
-
        function isExpensive() {
                return true;
        }
@@ -746,6 +758,8 @@ abstract class WantedQueryPage extends QueryPage {
 
        /**
         * Cache page existence for performance
+        * @param DatabaseBase $db
+        * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                if ( !$res->numRows() ) {
@@ -777,8 +791,8 @@ abstract class WantedQueryPage extends QueryPage {
        /**
         * Format an individual result
         *
-        * @param $skin Skin to use for UI elements
-        * @param $result Result row
+        * @param Skin $skin Skin to use for UI elements
+        * @param object $result Result row
         * @return string
         */
        public function formatResult( $skin, $result ) {
@@ -812,8 +826,8 @@ abstract class WantedQueryPage extends QueryPage {
        /**
         * Make a "what links here" link for a given title
         *
-        * @param $title Title to make the link for
-        * @param $result Object: result row
+        * @param Title $title Title to make the link for
+        * @param object $result Result row
         * @return string
         */
        private function makeWlhLink( $title, $result ) {
index d7cf995..24db569 100644 (file)
@@ -96,10 +96,12 @@ class RecentChange {
        }
 
        /**
+        * @deprecated in 1.22
         * @param $row
         * @return RecentChange
         */
        public static function newFromCurRow( $row ) {
+               wfDeprecated( __METHOD__, '1.22' );
                $rc = new RecentChange;
                $rc->loadFromCurRow( $row );
                $rc->notificationtimestamp = false;
@@ -122,11 +124,12 @@ class RecentChange {
         *
         * @param array $conds of conditions
         * @param $fname Mixed: override the method name in profiling/logs
+        * @param $options Array Query options
         * @return RecentChange
         */
-       public static function newFromConds( $conds, $fname = __METHOD__ ) {
+       public static function newFromConds( $conds, $fname = __METHOD__, $options = array() ) {
                $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname );
+               $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname, $options );
                if ( $row !== false ) {
                        return self::newFromRow( $row );
                } else {
@@ -284,7 +287,9 @@ class RecentChange {
        public function notifyRC2UDP() {
                global $wgRC2UDPAddress, $wgRC2UDPOmitBots;
                # Notify external application via UDP
-               if ( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
+               # Omit RC_EXTERNAL changes: bots and tools can get these edits from the feed of the external wiki
+               if ( $wgRC2UDPAddress && $this->mAttribs['rc_type'] != RC_EXTERNAL &&
+                       ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
                        self::sendToUDP( $this->getIRCLine() );
                }
        }
@@ -326,7 +331,7 @@ class RecentChange {
         * @return String
         */
        public static function cleanupForIRC( $text ) {
-               return Sanitizer::decodeCharReferences( str_replace( array( "\n", "\r" ), array( "", "" ), $text ) );
+               return Sanitizer::decodeCharReferences( str_replace( array( "\n", "\r" ), array( " ", "" ), $text ) );
        }
 
        /**
@@ -407,6 +412,9 @@ class RecentChange {
                        ),
                        __METHOD__
                );
+               // Invalidate the page cache after the page has been patrolled
+               // to make sure that the Patrol link isn't visible any longer!
+               $this->getTitle()->invalidateCache();
                return $dbw->affectedRows();
        }
 
@@ -651,9 +659,11 @@ class RecentChange {
        /**
         * Makes a pseudo-RC entry from a cur row
         *
+        * @deprected in 1.22
         * @param $row
         */
        public function loadFromCurRow( $row ) {
+               wfDeprecated( __METHOD__, '1.22' );
                $this->mAttribs = array(
                        'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ),
                        'rc_cur_time' => $row->rev_timestamp,
@@ -823,6 +833,29 @@ class RecentChange {
                return ChangesList::showCharacterDifference( $old, $new );
        }
 
+       /**
+        * Purge expired changes from the recentchanges table
+        * @since 1.22
+        */
+       public static function purgeExpiredChanges() {
+               if ( wfReadOnly() ) {
+                       return;
+               }
+
+               $method = __METHOD__;
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+                       global $wgRCMaxAge;
+
+                       $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
+                       $dbw->delete(
+                               'recentchanges',
+                               array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
+                               $method
+                       );
+               } );
+       }
+
        private static function checkIPAddress( $ip ) {
                global $wgRequest;
                if ( $ip ) {
@@ -837,4 +870,18 @@ class RecentChange {
                }
                return $ip;
        }
+
+       /**
+        * Check whether the given timestamp is new enough to have a RC row with a given tolerance
+        * as the recentchanges table might not be cleared out regularly (so older entries might exist)
+        * or rows which will be deleted soon shouldn't be included.
+        *
+        * @param $timestamp mixed MWTimestamp compatible timestamp
+        * @param $tolerance integer Tolerance in seconds
+        * @return bool
+        */
+       public static function isInRCLifespan( $timestamp, $tolerance = 0 ) {
+               global $wgRCMaxAge;
+               return wfTimestamp( TS_UNIX, $timestamp ) > time() - $tolerance - $wgRCMaxAge;
+       }
 }
index 2b34984..47626a2 100644 (file)
@@ -106,7 +106,7 @@ class Revision implements IDBAccessObject {
        public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
                $conds = array(
                        'page_namespace' => $title->getNamespace(),
-                       'page_title'     => $title->getDBkey()
+                       'page_title' => $title->getDBkey()
                );
                if ( $id ) {
                        // Use the specified ID
@@ -228,8 +228,8 @@ class Revision implements IDBAccessObject {
         * @return Revision or null
         */
        public static function loadFromPageId( $db, $pageid, $id = 0 ) {
-               $conds = array( 'rev_page' => intval( $pageid ), 'page_id'  => intval( $pageid ) );
-               if( $id ) {
+               $conds = array( 'rev_page' => intval( $pageid ), 'page_id' => intval( $pageid ) );
+               if ( $id ) {
                        $conds['rev_id'] = intval( $id );
                } else {
                        $conds[] = 'rev_id=page_latest';
@@ -248,7 +248,7 @@ class Revision implements IDBAccessObject {
         * @return Revision or null
         */
        public static function loadFromTitle( $db, $title, $id = 0 ) {
-               if( $id ) {
+               if ( $id ) {
                        $matchId = intval( $id );
                } else {
                        $matchId = 'page_latest';
@@ -257,7 +257,7 @@ class Revision implements IDBAccessObject {
                        array(
                                "rev_id=$matchId",
                                'page_namespace' => $title->getNamespace(),
-                               'page_title'     => $title->getDBkey()
+                               'page_title' => $title->getDBkey()
                        )
                );
        }
@@ -275,9 +275,9 @@ class Revision implements IDBAccessObject {
        public static function loadFromTimestamp( $db, $title, $timestamp ) {
                return self::loadFromConds( $db,
                        array(
-                               'rev_timestamp'  => $db->timestamp( $timestamp ),
+                               'rev_timestamp' => $db->timestamp( $timestamp ),
                                'page_namespace' => $title->getNamespace(),
-                               'page_title'     => $title->getDBkey()
+                               'page_title' => $title->getDBkey()
                        )
                );
        }
@@ -312,9 +312,9 @@ class Revision implements IDBAccessObject {
         */
        private static function loadFromConds( $db, $conditions, $flags = 0 ) {
                $res = self::fetchFromConds( $db, $conditions, $flags );
-               if( $res ) {
+               if ( $res ) {
                        $row = $res->fetchObject();
-                       if( $row ) {
+                       if ( $row ) {
                                $ret = new Revision( $row );
                                return $ret;
                        }
@@ -337,7 +337,7 @@ class Revision implements IDBAccessObject {
                        array(
                                'rev_id=page_latest',
                                'page_namespace' => $title->getNamespace(),
-                               'page_title'     => $title->getDBkey()
+                               'page_title' => $title->getDBkey()
                        )
                );
        }
@@ -489,7 +489,7 @@ class Revision implements IDBAccessObject {
         * @access private
         */
        function __construct( $row ) {
-               if( is_object( $row ) ) {
+               if ( is_object( $row ) ) {
                        $this->mId        = intval( $row->rev_id );
                        $this->mPage      = intval( $row->rev_page );
                        $this->mTextId    = intval( $row->rev_text_id );
@@ -517,7 +517,7 @@ class Revision implements IDBAccessObject {
                                $this->mSha1 = $row->rev_sha1;
                        }
 
-                       if( isset( $row->page_latest ) ) {
+                       if ( isset( $row->page_latest ) ) {
                                $this->mCurrent = ( $row->rev_id == $row->page_latest );
                                $this->mTitle = Title::newFromRow( $row );
                        } else {
@@ -525,13 +525,13 @@ class Revision implements IDBAccessObject {
                                $this->mTitle = null;
                        }
 
-                       if( !isset( $row->rev_content_model ) || is_null( $row->rev_content_model ) ) {
+                       if ( !isset( $row->rev_content_model ) || is_null( $row->rev_content_model ) ) {
                                $this->mContentModel = null; # determine on demand if needed
                        } else {
                                $this->mContentModel = strval( $row->rev_content_model );
                        }
 
-                       if( !isset( $row->rev_content_format ) || is_null( $row->rev_content_format ) ) {
+                       if ( !isset( $row->rev_content_format ) || is_null( $row->rev_content_format ) ) {
                                $this->mContentFormat = null; # determine on demand if needed
                        } else {
                                $this->mContentFormat = strval( $row->rev_content_format );
@@ -539,7 +539,7 @@ class Revision implements IDBAccessObject {
 
                        // Lazy extraction...
                        $this->mText = null;
-                       if( isset( $row->old_text ) ) {
+                       if ( isset( $row->old_text ) ) {
                                $this->mTextRow = $row;
                        } else {
                                // 'text' table row entry will be lazy-loaded
@@ -554,13 +554,13 @@ class Revision implements IDBAccessObject {
                                $this->mUserText = $row->user_name; // logged-in user
                        }
                        $this->mOrigUserText = $row->rev_user_text;
-               } elseif( is_array( $row ) ) {
+               } elseif ( is_array( $row ) ) {
                        // Build a new revision to be saved...
                        global $wgUser; // ugh
 
                        # if we have a content object, use it to set the model and type
                        if ( !empty( $row['content'] ) ) {
-                               //@todo: when is that set? test with external store setup! check out insertOn() [dk]
+                               // @todo when is that set? test with external store setup! check out insertOn() [dk]
                                if ( !empty( $row['text_id'] ) ) {
                                        throw new MWException( "Text already stored in external store (id {$row['text_id']}), " .
                                                "can't serialize content object" );
@@ -714,10 +714,10 @@ class Revision implements IDBAccessObject {
         * @return Title|null
         */
        public function getTitle() {
-               if( isset( $this->mTitle ) ) {
+               if ( isset( $this->mTitle ) ) {
                        return $this->mTitle;
                }
-               if( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
+               if ( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow(
                                array( 'page', 'revision' ),
@@ -769,9 +769,9 @@ class Revision implements IDBAccessObject {
         * @return Integer
         */
        public function getUser( $audience = self::FOR_PUBLIC, User $user = null ) {
-               if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
+               if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
                        return 0;
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
+               } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
                        return 0;
                } else {
                        return $this->mUser;
@@ -801,9 +801,9 @@ class Revision implements IDBAccessObject {
         * @return string
         */
        public function getUserText( $audience = self::FOR_PUBLIC, User $user = null ) {
-               if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
+               if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_USER ) ) {
                        return '';
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
+               } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) {
                        return '';
                } else {
                        return $this->getRawUserText();
@@ -841,9 +841,9 @@ class Revision implements IDBAccessObject {
         * @return String
         */
        function getComment( $audience = self::FOR_PUBLIC, User $user = null ) {
-               if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
+               if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
                        return '';
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
+               } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_COMMENT, $user ) ) {
                        return '';
                } else {
                        return $this->mComment;
@@ -870,17 +870,17 @@ class Revision implements IDBAccessObject {
         * @return Integer rcid of the unpatrolled row, zero if there isn't one
         */
        public function isUnpatrolled() {
-               if( $this->mUnpatrolled !== null ) {
+               if ( $this->mUnpatrolled !== null ) {
                        return $this->mUnpatrolled;
                }
                $dbr = wfGetDB( DB_SLAVE );
                $this->mUnpatrolled = $dbr->selectField( 'recentchanges',
                        'rc_id',
                        array( // Add redundant user,timestamp condition so we can use the existing index
-                               'rc_user_text'  => $this->getRawUserText(),
-                               'rc_timestamp'  => $dbr->timestamp( $this->getTimestamp() ),
+                               'rc_user_text' => $this->getRawUserText(),
+                               'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
                                'rc_this_oldid' => $this->getId(),
-                               'rc_patrolled'  => 0
+                               'rc_patrolled' => 0
                        ),
                        __METHOD__
                );
@@ -918,7 +918,7 @@ class Revision implements IDBAccessObject {
         *              to the $audience parameter
         *
         * @deprecated in 1.21, use getContent() instead
-        * @todo: replace usage in core
+        * @todo Replace usage in core
         * @return String
         */
        public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
@@ -943,9 +943,9 @@ class Revision implements IDBAccessObject {
         * @return Content|null
         */
        public function getContent( $audience = self::FOR_PUBLIC, User $user = null ) {
-               if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
+               if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
                        return null;
-               } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
+               } elseif ( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
                        return null;
                } else {
                        return $this->getContentInternal();
@@ -996,9 +996,9 @@ class Revision implements IDBAccessObject {
         * @return Content|null the Revision's content, or null on failure.
         */
        protected function getContentInternal() {
-               if( is_null( $this->mContent ) ) {
+               if ( is_null( $this->mContent ) ) {
                        // Revision is immutable. Load on demand:
-                       if( is_null( $this->mText ) ) {
+                       if ( is_null( $this->mText ) ) {
                                $this->mText = $this->loadText();
                        }
 
@@ -1097,9 +1097,9 @@ class Revision implements IDBAccessObject {
         * @return Revision|null
         */
        public function getPrevious() {
-               if( $this->getTitle() ) {
+               if ( $this->getTitle() ) {
                        $prev = $this->getTitle()->getPreviousRevisionID( $this->getId() );
-                       if( $prev ) {
+                       if ( $prev ) {
                                return self::newFromTitle( $this->getTitle(), $prev );
                        }
                }
@@ -1112,7 +1112,7 @@ class Revision implements IDBAccessObject {
         * @return Revision or null
         */
        public function getNext() {
-               if( $this->getTitle() ) {
+               if ( $this->getTitle() ) {
                        $next = $this->getTitle()->getNextRevisionID( $this->getId() );
                        if ( $next ) {
                                return self::newFromTitle( $this->getTitle(), $next );
@@ -1129,11 +1129,11 @@ class Revision implements IDBAccessObject {
         * @return Integer
         */
        private function getPreviousRevisionId( $db ) {
-               if( is_null( $this->mPage ) ) {
+               if ( is_null( $this->mPage ) ) {
                        return 0;
                }
                # Use page_latest if ID is not given
-               if( !$this->mId ) {
+               if ( !$this->mId ) {
                        $prevId = $db->selectField( 'page', 'page_latest',
                                array( 'page_id' => $this->mPage ),
                                __METHOD__ );
@@ -1166,13 +1166,13 @@ class Revision implements IDBAccessObject {
                $textField = $prefix . 'text';
                $flagsField = $prefix . 'flags';
 
-               if( isset( $row->$flagsField ) ) {
+               if ( isset( $row->$flagsField ) ) {
                        $flags = explode( ',', $row->$flagsField );
                } else {
                        $flags = array();
                }
 
-               if( isset( $row->$textField ) ) {
+               if ( isset( $row->$textField ) ) {
                        $text = $row->$textField;
                } else {
                        wfProfileOut( __METHOD__ );
@@ -1183,7 +1183,7 @@ class Revision implements IDBAccessObject {
                if ( in_array( 'external', $flags ) ) {
                        $url = $text;
                        $parts = explode( '://', $url, 2 );
-                       if( count( $parts ) == 1 || $parts[1] == '' ) {
+                       if ( count( $parts ) == 1 || $parts[1] == '' ) {
                                wfProfileOut( __METHOD__ );
                                return false;
                        }
@@ -1192,14 +1192,14 @@ class Revision implements IDBAccessObject {
 
                // If the text was fetched without an error, convert it
                if ( $text !== false ) {
-                       if( in_array( 'gzip', $flags ) ) {
+                       if ( in_array( 'gzip', $flags ) ) {
                                # Deal with optional compression of archived pages.
                                # This can be done periodically via maintenance/compressOld.php, and
                                # as pages are saved if $wgCompressRevisions is set.
                                $text = gzinflate( $text );
                        }
 
-                       if( in_array( 'object', $flags ) ) {
+                       if ( in_array( 'object', $flags ) ) {
                                # Generic compressed storage
                                $obj = unserialize( $text );
                                if ( !is_object( $obj ) ) {
@@ -1211,7 +1211,7 @@ class Revision implements IDBAccessObject {
                        }
 
                        global $wgLegacyEncoding;
-                       if( $text !== false && $wgLegacyEncoding
+                       if ( $text !== false && $wgLegacyEncoding
                                && !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags ) )
                        {
                                # Old revisions kept around in a legacy encoding?
@@ -1244,8 +1244,8 @@ class Revision implements IDBAccessObject {
                # on load if $wgLegacyCharset is set in the future.
                $flags[] = 'utf-8';
 
-               if( $wgCompressRevisions ) {
-                       if( function_exists( 'gzdeflate' ) ) {
+               if ( $wgCompressRevisions ) {
+                       if ( function_exists( 'gzdeflate' ) ) {
                                $text = gzdeflate( $text );
                                $flags[] = 'gzip';
                        } else {
@@ -1274,32 +1274,35 @@ class Revision implements IDBAccessObject {
                $flags = self::compressRevisionText( $data );
 
                # Write to external storage if required
-               if( $wgDefaultExternalStore ) {
+               if ( $wgDefaultExternalStore ) {
                        // Store and get the URL
                        $data = ExternalStore::insertToDefault( $data );
-                       if( !$data ) {
+                       if ( !$data ) {
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Unable to store text to external storage" );
                        }
-                       if( $flags ) {
+                       if ( $flags ) {
                                $flags .= ',';
                        }
                        $flags .= 'external';
                }
 
                # Record the text (or external storage URL) to the text table
-               if( !isset( $this->mTextId ) ) {
+               if ( !isset( $this->mTextId ) ) {
                        $old_id = $dbw->nextSequenceValue( 'text_old_id_seq' );
                        $dbw->insert( 'text',
                                array(
-                                       'old_id'    => $old_id,
-                                       'old_text'  => $data,
+                                       'old_id' => $old_id,
+                                       'old_text' => $data,
                                        'old_flags' => $flags,
                                ), __METHOD__
                        );
                        $this->mTextId = $dbw->insertId();
                }
 
-               if ( $this->mComment === null ) $this->mComment = "";
+               if ( $this->mComment === null ) {
+                       $this->mComment = "";
+               }
 
                # Record the edit in revisions
                $rev_id = isset( $this->mId )
@@ -1334,14 +1337,15 @@ class Revision implements IDBAccessObject {
                        $title = $this->getTitle();
 
                        if ( $title === null ) {
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Insufficient information to determine the title of the revision's page!" );
                        }
 
                        $defaultModel = ContentHandler::getDefaultModelFor( $title );
                        $defaultFormat = ContentHandler::getForModelID( $defaultModel )->getDefaultFormat();
 
-                       $row[ 'rev_content_model' ] = ( $model === $defaultModel ) ? null : $model;
-                       $row[ 'rev_content_format' ] = ( $format === $defaultFormat ) ? null : $format;
+                       $row['rev_content_model'] = ( $model === $defaultModel ) ? null : $model;
+                       $row['rev_content_format'] = ( $format === $defaultFormat ) ? null : $format;
                }
 
                $dbw->insert( 'revision', $row, __METHOD__ );
@@ -1422,9 +1426,9 @@ class Revision implements IDBAccessObject {
                global $wgRevisionCacheExpiry, $wgMemc;
                $textId = $this->getTextId();
                $key = wfMemcKey( 'revisiontext', 'textid', $textId );
-               if( $wgRevisionCacheExpiry ) {
+               if ( $wgRevisionCacheExpiry ) {
                        $text = $wgMemc->get( $key );
-                       if( is_string( $text ) ) {
+                       if ( is_string( $text ) ) {
                                wfDebug( __METHOD__ . ": got id $textId from cache\n" );
                                wfProfileOut( __METHOD__ );
                                return $text;
@@ -1439,7 +1443,7 @@ class Revision implements IDBAccessObject {
                        $row = null;
                }
 
-               if( !$row ) {
+               if ( !$row ) {
                        // Text data is immutable; check slaves first.
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow( 'text',
@@ -1448,7 +1452,7 @@ class Revision implements IDBAccessObject {
                                __METHOD__ );
                }
 
-               if( !$row && wfGetLB()->getServerCount() > 1 ) {
+               if ( !$row && wfGetLB()->getServerCount() > 1 ) {
                        // Possible slave lag!
                        $dbw = wfGetDB( DB_MASTER );
                        $row = $dbw->selectRow( 'text',
@@ -1460,7 +1464,7 @@ class Revision implements IDBAccessObject {
                $text = self::getRevisionText( $row );
 
                # No negative caching -- negative hits on text rows may be due to corrupted slave servers
-               if( $wgRevisionCacheExpiry && $text !== false ) {
+               if ( $wgRevisionCacheExpiry && $text !== false ) {
                        $wgMemc->set( $key, $text, $wgRevisionCacheExpiry );
                }
 
@@ -1505,7 +1509,7 @@ class Revision implements IDBAccessObject {
                                ),
                        __METHOD__ );
 
-               if( $current ) {
+               if ( $current ) {
                        $row = array(
                                'page'       => $pageId,
                                'comment'    => $summary,
@@ -1517,8 +1521,8 @@ class Revision implements IDBAccessObject {
                        );
 
                        if ( $wgContentHandlerUseDB ) {
-                               $row[ 'content_model' ] = $current->rev_content_model;
-                               $row[ 'content_format' ] = $current->rev_content_format;
+                               $row['content_model'] = $current->rev_content_model;
+                               $row['content_format'] = $current->rev_content_format;
                        }
 
                        $revision = new Revision( $row );
@@ -1558,7 +1562,7 @@ class Revision implements IDBAccessObject {
         * @return Boolean
         */
        public static function userCanBitfield( $bitfield, $field, User $user = null ) {
-               if( $bitfield & $field ) { // aspect is deleted
+               if ( $bitfield & $field ) { // aspect is deleted
                        if ( $bitfield & self::DELETED_RESTRICTED ) {
                                $permission = 'suppressrevision';
                        } elseif ( $field & self::DELETED_TEXT ) {
@@ -1611,7 +1615,7 @@ class Revision implements IDBAccessObject {
        static function countByPageId( $db, $id ) {
                $row = $db->selectRow( 'revision', array( 'revCount' => 'COUNT(*)' ),
                        array( 'rev_page' => $id ), __METHOD__ );
-               if( $row ) {
+               if ( $row ) {
                        return $row->revCount;
                }
                return 0;
@@ -1626,7 +1630,7 @@ class Revision implements IDBAccessObject {
         */
        static function countByTitle( $db, $title ) {
                $id = $title->getArticleID();
-               if( $id ) {
+               if ( $id ) {
                        return self::countByPageId( $db, $id );
                }
                return 0;
@@ -1648,7 +1652,9 @@ class Revision implements IDBAccessObject {
         * @return bool True if the given user was the only one to edit since the given timestamp
         */
        public static function userWasLastToEdit( $db, $pageId, $userId, $since ) {
-               if ( !$userId ) return false;
+               if ( !$userId ) {
+                       return false;
+               }
 
                if ( is_int( $db ) ) {
                        $db = wfGetDB( $db );
index d87c540..1b865bb 100644 (file)
@@ -105,7 +105,7 @@ abstract class RevisionListBase extends ContextSource {
         * @return int
         */
        public function length() {
-               if( !$this->res ) {
+               if ( !$this->res ) {
                        return 0;
                } else {
                        return $this->res->numRows();
@@ -352,8 +352,7 @@ class RevisionItem extends RevisionItemBase {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $this->context->msg( 'diff' )->escaped();
                } else {
-                       return
-                               Linker::link(
+                       return Linker::link(
                                        $this->list->title,
                                        $this->context->msg( 'diff' )->escaped(),
                                        array(),
index 2dff081..b4a1c62 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * XHTML sanitizer for %MediaWiki.
+ * HTML sanitizer for %MediaWiki.
  *
  * Copyright © 2002-2005 Brion Vibber <brion@pobox.com> et al
  * http://www.mediawiki.org/
@@ -25,7 +25,7 @@
  */
 
 /**
- * XHTML sanitizer for MediaWiki
+ * HTML sanitizer for MediaWiki
  * @ingroup Parser
  */
 class Sanitizer {
@@ -364,7 +364,7 @@ class Sanitizer {
         * @return string
         */
        static function removeHTMLtags( $text, $processCallback = null, $args = array(), $extratags = array(), $removetags = array() ) {
-               global $wgUseTidy, $wgHtml5, $wgAllowMicrodataAttributes, $wgAllowImageTag;
+               global $wgUseTidy, $wgAllowMicrodataAttributes, $wgAllowImageTag;
 
                static $htmlpairsStatic, $htmlsingle, $htmlsingleonly, $htmlnest, $tabletags,
                        $htmllist, $listtags, $htmlsingleallowed, $htmlelementsStatic, $staticInitialised;
@@ -373,7 +373,7 @@ class Sanitizer {
 
                // Base our staticInitialised variable off of the global config state so that if the globals
                // are changed (like in the screwed up test system) we will re-initialise the settings.
-               $globalContext = implode( '-', compact( 'wgHtml5', 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
+               $globalContext = implode( '-', compact( 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
                if ( !$staticInitialised || $staticInitialised != $globalContext ) {
 
                        $htmlpairsStatic = array( # Tags that must be closed
@@ -382,30 +382,28 @@ class Sanitizer {
                                'strike', 'strong', 'tt', 'var', 'div', 'center',
                                'blockquote', 'ol', 'ul', 'dl', 'table', 'caption', 'pre',
                                'ruby', 'rt', 'rb', 'rp', 'p', 'span', 'abbr', 'dfn',
-                               'kbd', 'samp'
+                               'kbd', 'samp', 'data', 'time', 'mark'
                        );
-                       if ( $wgHtml5 ) {
-                               $htmlpairsStatic = array_merge( $htmlpairsStatic, array( 'data', 'time', 'mark' ) );
-                       }
                        $htmlsingle = array(
                                'br', 'hr', 'li', 'dt', 'dd'
                        );
                        $htmlsingleonly = array( # Elements that cannot have close tags
                                'br', 'hr'
                        );
-                       if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
+                       if ( $wgAllowMicrodataAttributes ) {
                                $htmlsingle[] = $htmlsingleonly[] = 'meta';
                                $htmlsingle[] = $htmlsingleonly[] = 'link';
                        }
                        $htmlnest = array( # Tags that can be nested--??
                                'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul',
-                               'li', 'dl', 'dt', 'dd', 'font', 'big', 'small', 'sub', 'sup', 'span'
+                               'li', 'dl', 'dt', 'dd', 'font', 'big', 'small', 'sub', 'sup', 'span',
+                               'var', 'kbd', 'samp'
                        );
                        $tabletags = array( # Can only appear inside table, we will close them
                                'td', 'th', 'tr',
                        );
                        $htmllist = array( # Tags used by list
-                               'ul','ol',
+                               'ul', 'ol',
                        );
                        $listtags = array( # Tags that can appear in a list
                                'li',
@@ -446,7 +444,7 @@ class Sanitizer {
                                # $params: String between element name and >
                                # $brace: Ending '>' or '/>'
                                # $rest: Everything until the next element of $bits
-                               if( preg_match( '!^(/?)(\\w+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
+                               if ( preg_match( '!^(/?)(\\w+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
                                        list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
                                } else {
                                        $slash = $t = $params = $brace = $rest = null;
@@ -507,7 +505,7 @@ class Sanitizer {
                                                !in_array( 'table', $tagstack ) ) {
                                                        $badtag = true;
                                                } elseif ( in_array( $t, $tagstack ) &&
-                                               !isset( $htmlnest [$t ] ) ) {
+                                               !isset( $htmlnest[$t] ) ) {
                                                        $badtag = true;
                                                # Is it a self closed htmlpair ? (bug 5487)
                                                } elseif ( $brace == '/>' &&
@@ -537,7 +535,7 @@ class Sanitizer {
 
                                                # Replace any variables or template parameters with
                                                # plaintext results.
-                                               if( is_callable( $processCallback ) ) {
+                                               if ( is_callable( $processCallback ) ) {
                                                        call_user_func_array( $processCallback, array( &$params, $args ) );
                                                }
 
@@ -555,12 +553,14 @@ class Sanitizer {
                                                continue;
                                        }
                                }
-                               $text .= '&lt;' . str_replace( '>', '&gt;', $x);
+                               $text .= '&lt;' . str_replace( '>', '&gt;', $x );
                        }
                        # Close off any remaining tags
-                       while ( is_array( $tagstack ) && ($t = array_pop( $tagstack )) ) {
+                       while ( is_array( $tagstack ) && ( $t = array_pop( $tagstack ) ) ) {
                                $text .= "</$t>\n";
-                               if ( $t == 'table' ) { $tagstack = array_pop( $tablestack ); }
+                               if ( $t == 'table' ) {
+                                       $tagstack = array_pop( $tablestack );
+                               }
                        }
                } else {
                        # this might be possible using tidy itself
@@ -570,7 +570,7 @@ class Sanitizer {
                                @list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
                                $badtag = false;
                                if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
-                                       if( is_callable( $processCallback ) ) {
+                                       if ( is_callable( $processCallback ) ) {
                                                call_user_func_array( $processCallback, array( &$params, $args ) );
                                        }
 
@@ -585,7 +585,7 @@ class Sanitizer {
                                                continue;
                                        }
                                }
-                               $text .= '&lt;' . str_replace( '>', '&gt;', $x);
+                               $text .= '&lt;' . str_replace( '>', '&gt;', $x );
                        }
                }
                wfProfileOut( __METHOD__ );
@@ -604,7 +604,7 @@ class Sanitizer {
         */
        static function removeHTMLcomments( $text ) {
                wfProfileIn( __METHOD__ );
-               while ( ($start = strpos( $text, '<!--' ) ) !== false ) {
+               while ( ( $start = strpos( $text, '<!--' ) ) !== false ) {
                        $end = strpos( $text, '-->', $start + 4 );
                        if ( $end === false ) {
                                # Unterminated comment; bail out
@@ -621,8 +621,9 @@ class Sanitizer {
                                $spaceStart--;
                                $spaceLen++;
                        }
-                       while ( substr( $text, $spaceStart + $spaceLen, 1 ) === ' ' )
+                       while ( substr( $text, $spaceStart + $spaceLen, 1 ) === ' ' ) {
                                $spaceLen++;
+                       }
                        if ( substr( $text, $spaceStart, 1 ) === "\n" and substr( $text, $spaceStart + $spaceLen, 1 ) === "\n" ) {
                                # Remove the comment, leading and trailing
                                # spaces, and leave only one newline.
@@ -706,13 +707,13 @@ class Sanitizer {
         * @todo Check for unique id attribute :P
         */
        static function validateAttributes( $attribs, $whitelist ) {
-               global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes, $wgHtml5;
+               global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
 
                $whitelist = array_flip( $whitelist );
                $hrefExp = '/^(' . wfUrlProtocols() . ')[^\s]+$/';
 
                $out = array();
-               foreach( $attribs as $attribute => $value ) {
+               foreach ( $attribs as $attribute => $value ) {
                        #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 ) ) {
@@ -722,14 +723,14 @@ class Sanitizer {
                                continue;
                        }
 
-                       # Allow any attribute beginning with "data-", if in HTML5 mode
-                       if ( !($wgHtml5 && preg_match( '/^data-/i', $attribute )) && !isset( $whitelist[$attribute] ) ) {
+                       # Allow any attribute beginning with "data-"
+                       if ( !preg_match( '/^data-/i', $attribute ) && !isset( $whitelist[$attribute] ) ) {
                                continue;
                        }
 
                        # Strip javascript "expression" from stylesheets.
                        # http://msdn.microsoft.com/workshop/author/dhtml/overview/recalc.asp
-                       if( $attribute == 'style' ) {
+                       if ( $attribute == 'style' ) {
                                $value = Sanitizer::checkCss( $value );
                        }
 
@@ -798,9 +799,10 @@ class Sanitizer {
         */
        static function mergeAttributes( $a, $b ) {
                $out = array_merge( $a, $b );
-               if( isset( $a['class'] ) && isset( $b['class'] )
-               && is_string( $a['class'] ) && is_string( $b['class'] )
-               && $a['class'] !== $b['class'] ) {
+               if ( isset( $a['class'] ) && isset( $b['class'] )
+                       && is_string( $a['class'] ) && is_string( $b['class'] )
+                       && $a['class'] !== $b['class']
+               ) {
                        $classes = preg_split( '/\s+/', "{$a['class']} {$b['class']}",
                                -1, PREG_SPLIT_NO_EMPTY );
                        $out['class'] = implode( ' ', array_unique( $classes ) );
@@ -811,9 +813,10 @@ class Sanitizer {
        /**
         * Pick apart some CSS and check it for forbidden or unsafe structures.
         * Returns a sanitized string. This sanitized string will have
-        * character references and escape sequences decoded, and comments
-        * stripped. If the input is just too evil, only a comment complaining
-        * about evilness will be returned.
+        * character references and escape sequences decoded and comments
+        * stripped (unless it is itself one valid comment, in which case the value
+        * will be passed through). If the input is just too evil, only a comment
+        * complaining about evilness will be returned.
         *
         * Currently URL references, 'expression', 'tps' are forbidden.
         *
@@ -854,19 +857,24 @@ class Sanitizer {
                $value = preg_replace_callback( $decodeRegex,
                        array( __CLASS__, 'cssDecodeCallback' ), $value );
 
-               // Remove any comments; IE gets token splitting wrong
-               // This must be done AFTER decoding character references and
-               // escape sequences, because those steps can introduce comments
-               // This step cannot introduce character references or escape
-               // sequences, because it replaces comments with spaces rather
-               // than removing them completely.
-               $value = StringUtils::delimiterReplace( '/*', '*/', ' ', $value );
-
-               // Remove anything after a comment-start token, to guard against
-               // incorrect client implementations.
-               $commentPos = strpos( $value, '/*' );
-               if ( $commentPos !== false ) {
-                       $value = substr( $value, 0, $commentPos );
+               // Let the value through if it's nothing but a single comment, to
+               // allow other functions which may reject it to pass some error
+               // message through.
+               if ( !preg_match( '! ^ \s* /\* [^*\\/]* \*/ \s* $ !x', $value ) ) {
+                       // Remove any comments; IE gets token splitting wrong
+                       // This must be done AFTER decoding character references and
+                       // escape sequences, because those steps can introduce comments
+                       // This step cannot introduce character references or escape
+                       // sequences, because it replaces comments with spaces rather
+                       // than removing them completely.
+                       $value = StringUtils::delimiterReplace( '/*', '*/', ' ', $value );
+
+                       // Remove anything after a comment-start token, to guard against
+                       // incorrect client implementations.
+                       $commentPos = strpos( $value, '/*' );
+                       if ( $commentPos !== false ) {
+                               $value = substr( $value, 0, $commentPos );
+                       }
                }
 
                // Reject problematic keywords and control characters
@@ -923,21 +931,14 @@ class Sanitizer {
         * @return String
         */
        static function fixTagAttributes( $text, $element ) {
-               if( trim( $text ) == '' ) {
+               if ( trim( $text ) == '' ) {
                        return '';
                }
 
                $decoded = Sanitizer::decodeTagAttributes( $text );
                $stripped = Sanitizer::validateTagAttributes( $decoded, $element );
 
-               $attribs = array();
-               foreach( $stripped as $attribute => $value ) {
-                       $encAttribute = htmlspecialchars( $attribute );
-                       $encValue = Sanitizer::safeEncodeAttribute( $value );
-
-                       $attribs[] = "$encAttribute=\"$encValue\"";
-               }
-               return count( $attribs ) ? ' ' . implode( ' ', $attribs ) : '';
+               return Sanitizer::safeEncodeTagAttributes( $stripped );
        }
 
        /**
@@ -1025,10 +1026,10 @@ class Sanitizer {
         * @return String
         */
        static function escapeId( $id, $options = array() ) {
-               global $wgHtml5, $wgExperimentalHtmlIds;
+               global $wgExperimentalHtmlIds;
                $options = (array)$options;
 
-               if ( $wgHtml5 && $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
+               if ( $wgExperimentalHtmlIds && !in_array( 'legacy', $options ) ) {
                        $id = Sanitizer::decodeCharReferences( $id );
                        $id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id );
                        $id = trim( $id, '_' );
@@ -1109,13 +1110,13 @@ class Sanitizer {
         * @return Array
         */
        public static function decodeTagAttributes( $text ) {
-               if( trim( $text ) == '' ) {
+               if ( trim( $text ) == '' ) {
                        return array();
                }
 
                $attribs = array();
                $pairs = array();
-               if( !preg_match_all(
+               if ( !preg_match_all(
                        self::getAttribsRegex(),
                        $text,
                        $pairs,
@@ -1123,7 +1124,7 @@ class Sanitizer {
                        return $attribs;
                }
 
-               foreach( $pairs as $set ) {
+               foreach ( $pairs as $set ) {
                        $attribute = strtolower( $set[1] );
                        $value = Sanitizer::getTagAttributeCallback( $set );
 
@@ -1137,6 +1138,24 @@ class Sanitizer {
                return $attribs;
        }
 
+       /**
+        * Build a partial tag string from an associative array of attribute
+        * names and values as returned by decodeTagAttributes.
+        *
+        * @param $assoc_array Array
+        * @return String
+        */
+       public static function safeEncodeTagAttributes( $assoc_array ) {
+               $attribs = array();
+               foreach ( $assoc_array as $attribute => $value ) {
+                       $encAttribute = htmlspecialchars( $attribute );
+                       $encValue = Sanitizer::safeEncodeAttribute( $value );
+
+                       $attribs[] = "$encAttribute=\"$encValue\"";
+               }
+               return count( $attribs ) ? ' ' . implode( ' ', $attribs ) : '';
+       }
+
        /**
         * Pick the appropriate attribute value from a match set from the
         * attribs regex matches.
@@ -1146,19 +1165,19 @@ class Sanitizer {
         * @return String
         */
        private static function getTagAttributeCallback( $set ) {
-               if( isset( $set[6] ) ) {
+               if ( isset( $set[6] ) ) {
                        # Illegal #XXXXXX color with no quotes.
                        return $set[6];
-               } elseif( isset( $set[5] ) ) {
+               } elseif ( isset( $set[5] ) ) {
                        # No quotes.
                        return $set[5];
-               } elseif( isset( $set[4] ) ) {
+               } elseif ( isset( $set[4] ) ) {
                        # Single-quoted
                        return $set[4];
-               } elseif( isset( $set[3] ) ) {
+               } elseif ( isset( $set[3] ) ) {
                        # Double-quoted
                        return $set[3];
-               } elseif( !isset( $set[2] ) ) {
+               } elseif ( !isset( $set[2] ) ) {
                        # In XHTML, attributes must have a value.
                        # For 'reduced' form, return explicitly the attribute name here.
                        return $set[1];
@@ -1234,14 +1253,14 @@ class Sanitizer {
         */
        static function normalizeCharReferencesCallback( $matches ) {
                $ret = null;
-               if( $matches[1] != '' ) {
+               if ( $matches[1] != '' ) {
                        $ret = Sanitizer::normalizeEntity( $matches[1] );
-               } elseif( $matches[2] != '' ) {
+               } elseif ( $matches[2] != '' ) {
                        $ret = Sanitizer::decCharReference( $matches[2] );
-               } elseif( $matches[3] != '' ) {
+               } elseif ( $matches[3] != '' ) {
                        $ret = Sanitizer::hexCharReference( $matches[3] );
                }
-               if( is_null( $ret ) ) {
+               if ( is_null( $ret ) ) {
                        return htmlspecialchars( $matches[0] );
                } else {
                        return $ret;
@@ -1277,7 +1296,7 @@ class Sanitizer {
         */
        static function decCharReference( $codepoint ) {
                $point = intval( $codepoint );
-               if( Sanitizer::validateCodepoint( $point ) ) {
+               if ( Sanitizer::validateCodepoint( $point ) ) {
                        return sprintf( '&#%d;', $point );
                } else {
                        return null;
@@ -1290,7 +1309,7 @@ class Sanitizer {
         */
        static function hexCharReference( $codepoint ) {
                $point = hexdec( $codepoint );
-               if( Sanitizer::validateCodepoint( $point ) ) {
+               if ( Sanitizer::validateCodepoint( $point ) ) {
                        return sprintf( '&#x%x;', $point );
                } else {
                        return null;
@@ -1303,12 +1322,12 @@ class Sanitizer {
         * @return Boolean
         */
        private static function validateCodepoint( $codepoint ) {
-               return ($codepoint ==    0x09)
-                       || ($codepoint ==    0x0a)
-                       || ($codepoint ==    0x0d)
-                       || ($codepoint >=    0x20 && $codepoint <=   0xd7ff)
-                       || ($codepoint >=  0xe000 && $codepoint <=   0xfffd)
-                       || ($codepoint >= 0x10000 && $codepoint <= 0x10ffff);
+               return $codepoint == 0x09
+                       || $codepoint == 0x0a
+                       || $codepoint == 0x0d
+                       || ( $codepoint >= 0x20 && $codepoint <= 0xd7ff )
+                       || ( $codepoint >= 0xe000 && $codepoint <= 0xfffd )
+                       || ( $codepoint >= 0x10000 && $codepoint <= 0x10ffff );
        }
 
        /**
@@ -1354,12 +1373,12 @@ class Sanitizer {
         * @return String
         */
        static function decodeCharReferencesCallback( $matches ) {
-               if( $matches[1] != '' ) {
+               if ( $matches[1] != '' ) {
                        return Sanitizer::decodeEntity( $matches[1] );
-               } elseif( $matches[2] != '' ) {
-                       return  Sanitizer::decodeChar( intval( $matches[2] ) );
-               } elseif( $matches[3] != '' ) {
-                       return  Sanitizer::decodeChar( hexdec( $matches[3] ) );
+               } elseif ( $matches[2] != '' ) {
+                       return Sanitizer::decodeChar( intval( $matches[2] ) );
+               } elseif ( $matches[3] != '' ) {
+                       return Sanitizer::decodeChar( hexdec( $matches[3] ) );
                }
                # Last case should be an ampersand by itself
                return $matches[0];
@@ -1373,7 +1392,7 @@ class Sanitizer {
         * @private
         */
        static function decodeChar( $codepoint ) {
-               if( Sanitizer::validateCodepoint( $codepoint ) ) {
+               if ( Sanitizer::validateCodepoint( $codepoint ) ) {
                        return codepointToUtf8( $codepoint );
                } else {
                        return UTF8_REPLACEMENT;
@@ -1392,7 +1411,7 @@ class Sanitizer {
                if ( isset( self::$htmlEntityAliases[$name] ) ) {
                        $name = self::$htmlEntityAliases[$name];
                }
-               if( isset( self::$htmlEntities[$name] ) ) {
+               if ( isset( self::$htmlEntities[$name] ) ) {
                        return codepointToUtf8( self::$htmlEntities[$name] );
                } else {
                        return "&$name;";
@@ -1418,10 +1437,10 @@ class Sanitizer {
         * @return Array
         */
        static function setupAttributeWhitelist() {
-               global $wgAllowRdfaAttributes, $wgHtml5, $wgAllowMicrodataAttributes;
+               global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
 
                static $whitelist, $staticInitialised;
-               $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgHtml5', 'wgAllowMicrodataAttributes' ) );
+               $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgAllowMicrodataAttributes' ) );
 
                if ( isset( $whitelist ) && $staticInitialised == $globalContext ) {
                        return $whitelist;
@@ -1443,30 +1462,31 @@ class Sanitizer {
                if ( $wgAllowRdfaAttributes ) {
                        #RDFa attributes as specified in section 9 of http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014
                        $common = array_merge( $common, array(
-                           'about', 'property', 'resource', 'datatype', 'typeof',
+                               'about', 'property', 'resource', 'datatype', 'typeof',
                        ) );
                }
 
-               if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
+               if ( $wgAllowMicrodataAttributes ) {
                        # add HTML5 microdata tags as specified by http://www.whatwg.org/specs/web-apps/current-work/multipage/microdata.html#the-microdata-model
                        $common = array_merge( $common, array(
-                           'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
+                               'itemid', 'itemprop', 'itemref', 'itemscope', 'itemtype'
                        ) );
                }
 
                $block = array_merge( $common, array( 'align' ) );
                $tablealign = array( 'align', 'char', 'charoff', 'valign' );
-               $tablecell = array( 'abbr',
-                                   'axis',
-                                   'headers',
-                                   'scope',
-                                   'rowspan',
-                                   'colspan',
-                                   'nowrap', # deprecated
-                                   'width',  # deprecated
-                                   'height', # deprecated
-                                   'bgcolor' # deprecated
-                                   );
+               $tablecell = array(
+                       'abbr',
+                       'axis',
+                       'headers',
+                       'scope',
+                       'rowspan',
+                       'colspan',
+                       'nowrap', # deprecated
+                       'width', # deprecated
+                       'height', # deprecated
+                       'bgcolor', # deprecated
+               );
 
                # Numbers refer to sections in HTML 4.01 standard describing the element.
                # See: http://www.w3.org/TR/html4/
@@ -1585,8 +1605,8 @@ class Sanitizer {
                        # 15.3
                        'hr'         => array_merge( $common, array( 'noshade', 'size', 'width' ) ),
 
-                       # XHTML Ruby annotation text module, simple ruby only.
-                       # http://www.w3c.org/TR/ruby/
+                       # HTML Ruby annotation text module, simple ruby only.
+                       # http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-ruby-element
                        'ruby'       => $common,
                        # rbc
                        # rtc
@@ -1602,25 +1622,20 @@ class Sanitizer {
                        # HTML 5 section 4.6
                        'bdi' => $common,
 
-               );
-
-               if ( $wgHtml5 ) {
                        # HTML5 elements, defined by:
                        # http://www.whatwg.org/specs/web-apps/current-work/multipage/
-                       $whitelist += array(
-                               'data' => array_merge( $common, array( 'value' ) ),
-                               'time' => array_merge( $common, array( 'datetime' ) ),
-                               'mark' => $common,
-
-                               // meta and link are only permitted by removeHTMLtags when Microdata
-                               // is enabled so we don't bother adding a conditional to hide these
-                               // Also meta and link are only valid in WikiText as Microdata elements
-                               // (ie: validateTag rejects tags missing the attributes needed for Microdata)
-                               // So we don't bother including $common attributes that have no purpose.
-                               'meta' => array( 'itemprop', 'content' ),
-                               'link' => array( 'itemprop', 'href' ),
-                       );
-               }
+                       'data' => array_merge( $common, array( 'value' ) ),
+                       'time' => array_merge( $common, array( 'datetime' ) ),
+                       'mark' => $common,
+
+                       // meta and link are only permitted by removeHTMLtags when Microdata
+                       // is enabled so we don't bother adding a conditional to hide these
+                       // Also meta and link are only valid in WikiText as Microdata elements
+                       // (ie: validateTag rejects tags missing the attributes needed for Microdata)
+                       // So we don't bother including $common attributes that have no purpose.
+                       'meta' => array( 'itemprop', 'content' ),
+                       'link' => array( 'itemprop', 'href' ),
+               );
 
                $staticInitialised = $globalContext;
 
@@ -1659,7 +1674,7 @@ class Sanitizer {
         */
        static function hackDocType() {
                $out = "<!DOCTYPE html [\n";
-               foreach( self::$htmlEntities as $entity => $codepoint ) {
+               foreach ( self::$htmlEntities as $entity => $codepoint ) {
                        $out .= "<!ENTITY $entity \"&#$codepoint;\">";
                }
                $out .= "]>\n";
@@ -1681,7 +1696,7 @@ class Sanitizer {
 
                # Validate hostname portion
                $matches = array();
-               if( preg_match( '!^([^:]+:)(//[^/]+)?(.*)$!iD', $url, $matches ) ) {
+               if ( preg_match( '!^([^:]+:)(//[^/]+)?(.*)$!iD', $url, $matches ) ) {
                        list( /* $whole */, $protocol, $host, $rest ) = $matches;
 
                        // Characters that will be ignored in IDNs.
@@ -1751,7 +1766,7 @@ class Sanitizer {
         */
        public static function validateEmail( $addr ) {
                $result = null;
-               if( !wfRunHooks( 'isValidEmailAddr', array( $addr, &$result ) ) ) {
+               if ( !wfRunHooks( 'isValidEmailAddr', array( $addr, &$result ) ) ) {
                        return $result;
                }
 
index 8ecd874..ef22e0a 100644 (file)
  * @since 1.21
  */
 class ScopedCallback {
-       /** @var Closure */
+       /** @var callable */
        protected $callback;
 
        /**
-        * @param $callback Closure
+        * @param callable $callback
+        * @throws MWException
         */
-       public function __construct( Closure $callback ) {
+       public function __construct( $callback ) {
+               if ( !is_callable( $callback ) ) {
+                       throw new MWException( "Provided callback is not valid." );
+               }
                $this->callback = $callback;
        }
 
index 7715484..2fcbe65 100644 (file)
@@ -27,7 +27,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
        die( 1 );
 }
 
-require_once( "$IP/includes/GlobalFunctions.php" );
+require_once "$IP/includes/GlobalFunctions.php";
 
 $fname = 'SeleniumWebSettings.php';
 wfProfileIn( $fname );
@@ -67,7 +67,7 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
        $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
        $callback = $wgSeleniumTestConfigs[$setupTestSuiteName];
-       call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
+       call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles ) );
 
        if ( isset( $testResourceFiles['images'] ) ) {
                $testImageZip = $testResourceFiles['images'];
@@ -112,7 +112,7 @@ if ( isset( $_COOKIE[$cookieName] ) ) {
        $testGlobalConfigs = array(); // an array containing all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
        $callback = $wgSeleniumTestConfigs[$testSuiteName];
-       call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
+       call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles ) );
 
        if ( isset( $testResourceFiles['db'] ) ) {
                $testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
@@ -120,7 +120,7 @@ if ( isset( $_COOKIE[$cookieName] ) ) {
        }
        foreach ( $testIncludes as $includeFile ) {
                $file = $IP . '/' . $includeFile;
-               require_once( $file );
+               require_once $file;
        }
        foreach ( $testGlobalConfigs as $key => $value ) {
                if ( is_array( $value ) ) {
index e87b200..d8c9180 100644 (file)
@@ -44,9 +44,12 @@ if ( !isset( $wgVersion ) ) {
 }
 
 // Set various default paths sensibly...
-if ( $wgScript === false ) $wgScript = "$wgScriptPath/index$wgScriptExtension";
-if ( $wgRedirectScript === false ) $wgRedirectScript = "$wgScriptPath/redirect$wgScriptExtension";
-if ( $wgLoadScript === false ) $wgLoadScript = "$wgScriptPath/load$wgScriptExtension";
+if ( $wgScript === false ) {
+       $wgScript = "$wgScriptPath/index$wgScriptExtension";
+}
+if ( $wgLoadScript === false ) {
+       $wgLoadScript = "$wgScriptPath/load$wgScriptExtension";
+}
 
 if ( $wgArticlePath === false ) {
        if ( $wgUsePathInfo ) {
@@ -62,24 +65,38 @@ if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
        $wgActionPaths['view'] = $wgArticlePath;
 }
 
-if ( !empty( $wgActionPaths ) && !isset( $wgActionPaths['view'] ) ) {
-       # 'view' is assumed the default action path everywhere in the code
-       # but is rarely filled in $wgActionPaths
-       $wgActionPaths['view'] = $wgArticlePath;
+if ( $wgStylePath === false ) {
+       $wgStylePath = "$wgScriptPath/skins";
+}
+if ( $wgLocalStylePath === false ) {
+       $wgLocalStylePath = "$wgScriptPath/skins";
+}
+if ( $wgStyleDirectory === false ) {
+       $wgStyleDirectory = "$IP/skins";
+}
+if ( $wgExtensionAssetsPath === false ) {
+       $wgExtensionAssetsPath = "$wgScriptPath/extensions";
 }
 
-if ( $wgStylePath === false ) $wgStylePath = "$wgScriptPath/skins";
-if ( $wgLocalStylePath === false ) $wgLocalStylePath = "$wgScriptPath/skins";
-if ( $wgStyleDirectory === false ) $wgStyleDirectory = "$IP/skins";
-if ( $wgExtensionAssetsPath === false ) $wgExtensionAssetsPath = "$wgScriptPath/extensions";
-
-if ( $wgLogo === false ) $wgLogo = "$wgStylePath/common/images/wiki.png";
+if ( $wgLogo === false ) {
+       $wgLogo = "$wgStylePath/common/images/wiki.png";
+}
 
-if ( $wgUploadPath === false ) $wgUploadPath = "$wgScriptPath/images";
-if ( $wgUploadDirectory === false ) $wgUploadDirectory = "$IP/images";
-if ( $wgReadOnlyFile === false ) $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
-if ( $wgFileCacheDirectory === false ) $wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
-if ( $wgDeletedDirectory === false ) $wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
+if ( $wgUploadPath === false ) {
+       $wgUploadPath = "$wgScriptPath/images";
+}
+if ( $wgUploadDirectory === false ) {
+       $wgUploadDirectory = "$IP/images";
+}
+if ( $wgReadOnlyFile === false ) {
+       $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
+}
+if ( $wgFileCacheDirectory === false ) {
+       $wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
+}
+if ( $wgDeletedDirectory === false ) {
+       $wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
+}
 
 if ( isset( $wgFileStore['deleted']['directory'] ) ) {
        $wgDeletedDirectory = $wgFileStore['deleted']['directory'];
@@ -130,13 +147,13 @@ $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
  * Initialise $wgLockManagers to include basic FS version
  */
 $wgLockManagers[] = array(
-       'name'          => 'fsLockManager',
-       'class'         => 'FSLockManager',
+       'name' => 'fsLockManager',
+       'class' => 'FSLockManager',
        'lockDirectory' => "{$wgUploadDirectory}/lockdir",
 );
 $wgLockManagers[] = array(
-       'name'          => 'nullLockManager',
-       'class'         => 'NullLockManager',
+       'name' => 'nullLockManager',
+       'class' => 'NullLockManager',
 );
 
 /**
@@ -202,15 +219,15 @@ if ( $wgUseSharedUploads ) {
 }
 if ( $wgUseInstantCommons ) {
        $wgForeignFileRepos[] = array(
-               'class'                  => 'ForeignAPIRepo',
-               'name'                   => 'wikimediacommons',
-               'apibase'                => WebRequest::detectProtocol() === 'https' ?
+               'class' => 'ForeignAPIRepo',
+               'name' => 'wikimediacommons',
+               'apibase' => WebRequest::detectProtocol() === 'https' ?
                        'https://commons.wikimedia.org/w/api.php' :
                        'http://commons.wikimedia.org/w/api.php',
-               'hashLevels'             => 2,
-               'fetchDescription'       => true,
+               'hashLevels' => 2,
+               'fetchDescription' => true,
                'descriptionCacheExpiry' => 43200,
-               'apiThumbCacheExpiry'    => 86400,
+               'apiThumbCacheExpiry' => 86400,
        );
 }
 /*
@@ -301,7 +318,7 @@ $wgCanonicalNamespaceNames = array(
 );
 
 /// @todo UGLY UGLY
-if( is_array( $wgExtraNamespaces ) ) {
+if ( is_array( $wgExtraNamespaces ) ) {
        $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
 }
 
@@ -323,11 +340,17 @@ if ( !$wgEnotifMinorEdits ) {
 }
 
 # $wgDisabledActions is deprecated as of 1.18
-foreach( $wgDisabledActions as $action ) {
+foreach ( $wgDisabledActions as $action ) {
        $wgActions[$action] = false;
 }
 
-if ( !$wgHtml5Version && $wgHtml5 && $wgAllowRdfaAttributes ) {
+# We always output HTML5 since 1.22, overriding these is no longer supported
+# we set them here for extensions that depend on its value.
+$wgHtml5 = true;
+$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
+$wgJsMimeType = 'text/javascript';
+
+if ( !$wgHtml5Version && $wgAllowRdfaAttributes ) {
        # see http://www.w3.org/TR/rdfa-in-html/#document-conformance
        if ( $wgMimeType == 'application/xhtml+xml' ) {
                $wgHtml5Version = 'XHTML+RDFa 1.0';
@@ -374,22 +397,20 @@ if ( $wgDebugToolbar && !$wgCommandLineMode ) {
        MWDebug::init();
 }
 
-if ( !defined( 'MW_COMPILED' ) ) {
-       if ( !MWInit::classExists( 'AutoLoader' ) ) {
-               require_once( "$IP/includes/AutoLoader.php" );
-       }
+if ( !class_exists( 'AutoLoader' ) ) {
+       require_once "$IP/includes/AutoLoader.php";
+}
 
-       wfProfileIn( $fname . '-exception' );
-       MWExceptionHandler::installHandler();
-       wfProfileOut( $fname . '-exception' );
+wfProfileIn( $fname . '-exception' );
+MWExceptionHandler::installHandler();
+wfProfileOut( $fname . '-exception' );
 
-       wfProfileIn( $fname . '-includes' );
-       require_once( "$IP/includes/normal/UtfNormalUtil.php" );
-       require_once( "$IP/includes/GlobalFunctions.php" );
-       require_once( "$IP/includes/ProxyTools.php" );
-       require_once( "$IP/includes/normal/UtfNormalDefines.php" );
-       wfProfileOut( $fname . '-includes' );
-}
+wfProfileIn( $fname . '-includes' );
+require_once "$IP/includes/normal/UtfNormalUtil.php";
+require_once "$IP/includes/GlobalFunctions.php";
+require_once "$IP/includes/ProxyTools.php";
+require_once "$IP/includes/normal/UtfNormalDefines.php";
+wfProfileOut( $fname . '-includes' );
 
 if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
        $wgSecureLogin = false;
@@ -426,14 +447,14 @@ wfMemoryLimit();
  * that happens whenever you use a date function without the timezone being
  * explicitly set. Inspired by phpMyAdmin's treatment of the problem.
  */
-if ( is_null( $wgLocaltimezone) ) {
+if ( is_null( $wgLocaltimezone ) ) {
        wfSuppressWarnings();
        $wgLocaltimezone = date_default_timezone_get();
        wfRestoreWarnings();
 }
 
 date_default_timezone_set( $wgLocaltimezone );
-if( is_null( $wgLocalTZoffset ) ) {
+if ( is_null( $wgLocalTZoffset ) ) {
        $wgLocalTZoffset = date( 'Z' ) / 60;
 }
 
@@ -539,10 +560,11 @@ foreach ( $wgExtensionFunctions as $func ) {
        if ( is_object( $func ) && $func instanceof Closure ) {
                $profName = $fname . '-extensions-closure';
        } elseif ( is_array( $func ) ) {
-               if ( is_object( $func[0] ) )
+               if ( is_object( $func[0] ) ) {
                        $profName = $fname . '-extensions-' . get_class( $func[0] ) . '::' . $func[1];
-               else
+               } else {
                        $profName = $fname . '-extensions-' . implode( '::', $func );
+               }
        } else {
                $profName = $fname . '-extensions-' . strval( $func );
        }
index bbc14a1..8234428 100644 (file)
@@ -191,11 +191,11 @@ class SiteConfiguration {
         */
        protected function getSetting( $settingName, $wiki, /*array*/ $params ) {
                $retval = null;
-               if( array_key_exists( $settingName, $this->settings ) ) {
+               if ( array_key_exists( $settingName, $this->settings ) ) {
                        $thisSetting =& $this->settings[$settingName];
                        do {
                                // Do individual wiki settings
-                               if( array_key_exists( $wiki, $thisSetting ) ) {
+                               if ( array_key_exists( $wiki, $thisSetting ) ) {
                                        $retval = $thisSetting[$wiki];
                                        break;
                                } elseif ( array_key_exists( "+$wiki", $thisSetting ) && is_array( $thisSetting["+$wiki"] ) ) {
@@ -203,16 +203,16 @@ class SiteConfiguration {
                                }
 
                                // Do tag settings
-                               foreach( $params['tags'] as $tag ) {
-                                       if( array_key_exists( $tag, $thisSetting ) ) {
+                               foreach ( $params['tags'] as $tag ) {
+                                       if ( array_key_exists( $tag, $thisSetting ) ) {
                                                if ( isset( $retval ) && is_array( $retval ) && is_array( $thisSetting[$tag] ) ) {
                                                        $retval = self::arrayMerge( $retval, $thisSetting[$tag] );
                                                } else {
                                                        $retval = $thisSetting[$tag];
                                                }
                                                break 2;
-                                       } elseif( array_key_exists( "+$tag", $thisSetting ) && is_array( $thisSetting["+$tag"] ) ) {
-                                               if( !isset( $retval ) ) {
+                                       } elseif ( array_key_exists( "+$tag", $thisSetting ) && is_array( $thisSetting["+$tag"] ) ) {
+                                               if ( !isset( $retval ) ) {
                                                        $retval = array();
                                                }
                                                $retval = self::arrayMerge( $retval, $thisSetting["+$tag"] );
@@ -220,15 +220,15 @@ class SiteConfiguration {
                                }
                                // Do suffix settings
                                $suffix = $params['suffix'];
-                               if( !is_null( $suffix ) ) {
-                                       if( array_key_exists( $suffix, $thisSetting ) ) {
+                               if ( !is_null( $suffix ) ) {
+                                       if ( array_key_exists( $suffix, $thisSetting ) ) {
                                                if ( isset( $retval ) && is_array( $retval ) && is_array( $thisSetting[$suffix] ) ) {
                                                        $retval = self::arrayMerge( $retval, $thisSetting[$suffix] );
                                                } else {
                                                        $retval = $thisSetting[$suffix];
                                                }
                                                break;
-                                       } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array($thisSetting["+$suffix"]) ) {
+                                       } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array( $thisSetting["+$suffix"] ) ) {
                                                if ( !isset( $retval ) ) {
                                                        $retval = array();
                                                }
@@ -237,8 +237,8 @@ class SiteConfiguration {
                                }
 
                                // Fall back to default.
-                               if( array_key_exists( 'default', $thisSetting ) ) {
-                                       if( is_array( $retval ) && is_array( $thisSetting['default'] ) ) {
+                               if ( array_key_exists( 'default', $thisSetting ) ) {
+                                       if ( is_array( $retval ) && is_array( $thisSetting['default'] ) ) {
                                                $retval = self::arrayMerge( $retval, $thisSetting['default'] );
                                        } else {
                                                $retval = $thisSetting['default'];
@@ -248,7 +248,7 @@ class SiteConfiguration {
                        } while ( false );
                }
 
-               if( !is_null( $retval ) && count( $params['params'] ) ) {
+               if ( !is_null( $retval ) && count( $params['params'] ) ) {
                        foreach ( $params['params'] as $key => $value ) {
                                $retval = $this->doReplace( '$' . $key, $value, $retval );
                        }
@@ -266,10 +266,10 @@ class SiteConfiguration {
         * @return string
         */
        function doReplace( $from, $to, $in ) {
-               if( is_string( $in ) ) {
+               if ( is_string( $in ) ) {
                        return str_replace( $from, $to, $in );
-               } elseif( is_array( $in ) ) {
-                       foreach( $in as $key => $val ) {
+               } elseif ( is_array( $in ) ) {
+                       foreach ( $in as $key => $val ) {
                                $in[$key] = $this->doReplace( $from, $to, $val );
                        }
                        return $in;
@@ -289,7 +289,7 @@ class SiteConfiguration {
        public function getAll( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                $localSettings = array();
-               foreach( $this->settings as $varname => $stuff ) {
+               foreach ( $this->settings as $varname => $stuff ) {
                        $append = false;
                        $var = $varname;
                        if ( substr( $varname, 0, 1 ) == '+' ) {
@@ -317,7 +317,7 @@ class SiteConfiguration {
         * @return bool The value of the setting requested.
         */
        public function getBool( $setting, $wiki, $suffix = null, $wikiTags = array() ) {
-               return (bool)($this->get( $setting, $wiki, $suffix, array(), $wikiTags ) );
+               return (bool)$this->get( $setting, $wiki, $suffix, array(), $wikiTags );
        }
 
        /**
@@ -409,18 +409,18 @@ class SiteConfiguration {
                        'params' => array(),
                );
 
-               if( !is_callable( $this->siteParamsCallback ) ) {
+               if ( !is_callable( $this->siteParamsCallback ) ) {
                        return $default;
                }
 
                $ret = call_user_func_array( $this->siteParamsCallback, array( $this, $wiki ) );
                # Validate the returned value
-               if( !is_array( $ret ) ) {
+               if ( !is_array( $ret ) ) {
                        return $default;
                }
 
-               foreach( $default as $name => $def ) {
-                       if( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) ) {
+               foreach ( $default as $name => $def ) {
+                       if ( !isset( $ret[$name] ) || ( is_array( $default[$name] ) && !is_array( $ret[$name] ) ) ) {
                                $ret[$name] = $default[$name];
                        }
                }
@@ -443,7 +443,7 @@ class SiteConfiguration {
        protected function mergeParams( $wiki, $suffix, /*array*/ $params, /*array*/ $wikiTags ) {
                $ret = $this->getWikiParams( $wiki );
 
-               if( is_null( $ret['suffix'] ) ) {
+               if ( is_null( $ret['suffix'] ) ) {
                        $ret['suffix'] = $suffix;
                }
 
@@ -452,10 +452,10 @@ class SiteConfiguration {
                $ret['params'] += $params;
 
                // Automatically fill that ones if needed
-               if( !isset( $ret['params']['lang'] ) && !is_null( $ret['lang'] ) ) {
+               if ( !isset( $ret['params']['lang'] ) && !is_null( $ret['lang'] ) ) {
                        $ret['params']['lang'] = $ret['lang'];
                }
-               if( !isset( $ret['params']['site'] ) && !is_null( $ret['suffix'] ) ) {
+               if ( !isset( $ret['params']['site'] ) && !is_null( $ret['suffix'] ) ) {
                        $ret['params']['site'] = $ret['suffix'];
                }
 
@@ -471,7 +471,7 @@ class SiteConfiguration {
        public function siteFromDB( $db ) {
                // Allow override
                $def = $this->getWikiParams( $db );
-               if( !is_null( $def['suffix'] ) && !is_null( $def['lang'] ) ) {
+               if ( !is_null( $def['suffix'] ) && !is_null( $def['lang'] ) ) {
                        return array( $def['suffix'], $def['lang'] );
                }
 
@@ -574,8 +574,8 @@ class SiteConfiguration {
         */
        static function arrayMerge( $array1/* ... */ ) {
                $out = $array1;
-               for( $i = 1; $i < func_num_args(); $i++ ) {
-                       foreach( func_get_arg( $i ) as $key => $value ) {
+               for ( $i = 1; $i < func_num_args(); $i++ ) {
+                       foreach ( func_get_arg( $i ) as $key => $value ) {
                                if ( isset( $out[$key] ) && is_array( $out[$key] ) && is_array( $value ) ) {
                                        $out[$key] = self::arrayMerge( $out[$key], $value );
                                } elseif ( !isset( $out[$key] ) || !$out[$key] && !is_numeric( $key ) ) {
index b7be29d..199c64f 100644 (file)
@@ -61,13 +61,13 @@ class SiteStats {
                wfDebug( __METHOD__ . ": reading site_stats from slave\n" );
                $row = self::doLoad( wfGetDB( DB_SLAVE ) );
 
-               if( !self::isSane( $row ) ) {
+               if ( !self::isSane( $row ) ) {
                        // Might have just been initialized during this request? Underflow?
                        wfDebug( __METHOD__ . ": site_stats damaged or missing on slave\n" );
                        $row = self::doLoad( wfGetDB( DB_MASTER ) );
                }
 
-               if( !self::isSane( $row ) ) {
+               if ( !self::isSane( $row ) ) {
                        // Normally the site_stats table is initialized at install time.
                        // Some manual construction scenarios may leave the table empty or
                        // broken, however, for instance when importing from a dump into a
@@ -79,7 +79,7 @@ class SiteStats {
                        $row = self::doLoad( wfGetDB( DB_MASTER ) );
                }
 
-               if( !self::isSane( $row ) ) {
+               if ( !self::isSane( $row ) ) {
                        wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" );
                }
                return $row;
@@ -205,7 +205,7 @@ class SiteStats {
         */
        static function pagesInNs( $ns ) {
                wfProfileIn( __METHOD__ );
-               if( !isset( self::$pageCount[$ns] ) ) {
+               if ( !isset( self::$pageCount[$ns] ) ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        self::$pageCount[$ns] = (int)$dbr->selectField(
                                'page',
@@ -226,20 +226,24 @@ class SiteStats {
         * @return bool
         */
        private static function isSane( $row ) {
-               if(
-                       $row === false
+               if ( $row === false
                        || $row->ss_total_pages < $row->ss_good_articles
                        || $row->ss_total_edits < $row->ss_total_pages
+                       || $row->ss_users < $row->ss_active_users
                ) {
                        return false;
                }
                // Now check for underflow/overflow
-               foreach( array( 'total_views', 'total_edits', 'good_articles',
-               'total_pages', 'users', 'images' ) as $member ) {
-                       if(
-                               $row->{"ss_$member"} > 2000000000
-                               || $row->{"ss_$member"} < 0
-                       ) {
+               foreach ( array(
+                       'ss_total_views',
+                       'ss_total_edits',
+                       'ss_good_articles',
+                       'ss_total_pages',
+                       'ss_users',
+                       'ss_active_users',
+                       'ss_images',
+               ) as $member ) {
+                       if ( $row->$member > 2000000000 || $row->$member < 0 ) {
                                return false;
                        }
                }
@@ -258,7 +262,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
        protected $users = 0;
        protected $images = 0;
 
-       // @TODO: deprecate this constructor
+       // @todo deprecate this constructor
        function __construct( $views, $edits, $good, $pages = 0, $users = 0 ) {
                $this->views = $views;
                $this->edits = $edits;
@@ -306,12 +310,12 @@ class SiteStatsUpdate implements DeferrableUpdate {
                                }
                                $pd = $this->getPendingDeltas();
                                // Piggy-back the async deltas onto those of this stats update....
-                               $this->views    += ( $pd['ss_total_views']['+'] - $pd['ss_total_views']['-'] );
-                               $this->edits    += ( $pd['ss_total_edits']['+'] - $pd['ss_total_edits']['-'] );
+                               $this->views += ( $pd['ss_total_views']['+'] - $pd['ss_total_views']['-'] );
+                               $this->edits += ( $pd['ss_total_edits']['+'] - $pd['ss_total_edits']['-'] );
                                $this->articles += ( $pd['ss_good_articles']['+'] - $pd['ss_good_articles']['-'] );
-                               $this->pages    += ( $pd['ss_total_pages']['+'] - $pd['ss_total_pages']['-'] );
-                               $this->users    += ( $pd['ss_users']['+'] - $pd['ss_users']['-'] );
-                               $this->images   += ( $pd['ss_images']['+'] - $pd['ss_images']['-'] );
+                               $this->pages += ( $pd['ss_total_pages']['+'] - $pd['ss_total_pages']['-'] );
+                               $this->users += ( $pd['ss_users']['+'] - $pd['ss_users']['-'] );
+                               $this->images += ( $pd['ss_images']['+'] - $pd['ss_images']['-'] );
                        }
 
                        // Need a separate transaction because this a global lock
@@ -356,7 +360,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
                                'rc_user != 0',
                                'rc_bot' => 0,
                                'rc_log_type != ' . $dbr->addQuotes( 'newusers' ) . ' OR rc_log_type IS NULL',
-                               'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 ) ),
+                               'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays * 24 * 3600 ) ),
                        ),
                        __METHOD__
                );
@@ -592,19 +596,19 @@ class SiteStatsInit {
                $counter->files();
 
                // Only do views if we don't want to not count them
-               if( $options['views'] ) {
+               if ( $options['views'] ) {
                        $counter->views();
                }
 
                // Update/refresh
-               if( $options['update'] ) {
+               if ( $options['update'] ) {
                        $counter->update();
                } else {
                        $counter->refresh();
                }
 
                // Count active users if need be
-               if( $options['activeUsers'] ) {
+               if ( $options['activeUsers'] ) {
                        SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
                }
        }
index 0cc1086..53003c6 100644 (file)
@@ -25,7 +25,7 @@
  */
 
 /**
- * The main skin class that provide methods and properties for all other skins.
+ * The main skin class which provides methods and properties for all other skins.
  * This base class is also the "Standard" skin.
  *
  * See docs/skin.txt for more information.
@@ -56,17 +56,19 @@ abstract class Skin extends ContextSource {
 
                        $skinDir = dir( $wgStyleDirectory );
 
-                       # while code from www.php.net
-                       while ( false !== ( $file = $skinDir->read() ) ) {
-                               // Skip non-PHP files, hidden files, and '.dep' includes
-                               $matches = array();
+                       if ( $skinDir !== false && $skinDir !== null ) {
+                               # while code from www.php.net
+                               while ( false !== ( $file = $skinDir->read() ) ) {
+                                       // Skip non-PHP files, hidden files, and '.dep' includes
+                                       $matches = array();
 
-                               if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
-                                       $aSkin = $matches[1];
-                                       $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
+                                       if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
+                                               $aSkin = $matches[1];
+                                               $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
+                                       }
                                }
+                               $skinDir->close();
                        }
-                       $skinDir->close();
                        $skinsInitialised = true;
                        wfProfileOut( __METHOD__ . '-init' );
                }
@@ -79,14 +81,14 @@ abstract class Skin extends ContextSource {
         */
        static function getSkinNameMessages() {
                $messages = array();
-               foreach( self::getSkinNames() as $skinKey => $skinName ) {
+               foreach ( self::getSkinNames() as $skinKey => $skinName ) {
                        $messages[] = "skinname-$skinKey";
                }
                return $messages;
        }
 
        /**
-        * Fetch the list of usable skins in regards to $wgSkipSkins.
+        * Fetch the list of user-selectable skins in regards to $wgSkipSkins.
         * Useful for Special:Preferences and other places where you
         * only want to show skins users _can_ use.
         * @return array of strings
@@ -94,13 +96,13 @@ abstract class Skin extends ContextSource {
        public static function getUsableSkins() {
                global $wgSkipSkins;
 
-               $usableSkins = self::getSkinNames();
+               $allowedSkins = self::getSkinNames();
 
                foreach ( $wgSkipSkins as $skip ) {
-                       unset( $usableSkins[$skip] );
+                       unset( $allowedSkins[$skip] );
                }
 
-               return $usableSkins;
+               return $allowedSkins;
        }
 
        /**
@@ -129,7 +131,6 @@ abstract class Skin extends ContextSource {
                // in the user preferences.
                $fallback = array(
                        0 => $wgDefaultSkin,
-                       1 => 'nostalgia',
                        2 => 'cologneblue'
                );
 
@@ -161,23 +162,19 @@ abstract class Skin extends ContextSource {
                $className = "Skin{$skinName}";
 
                # Grab the skin class and initialise it.
-               if ( !MWInit::classExists( $className ) ) {
+               if ( !class_exists( $className ) ) {
 
-                       if ( !defined( 'MW_COMPILED' ) ) {
-                               require_once( "{$wgStyleDirectory}/{$skinName}.php" );
-                       }
+                       require_once "{$wgStyleDirectory}/{$skinName}.php";
 
                        # Check if we got if not fallback to default skin
-                       if ( !MWInit::classExists( $className ) ) {
+                       if ( !class_exists( $className ) ) {
                                # DO NOT die if the class isn't found. This breaks maintenance
                                # scripts and can cause a user account to be unrecoverable
                                # except by SQL manipulation if a previously valid skin name
                                # is no longer valid.
                                wfDebug( "Skin class does not exist: $className\n" );
                                $className = 'SkinVector';
-                               if ( !defined( 'MW_COMPILED' ) ) {
-                                       require_once( "{$wgStyleDirectory}/Vector.php" );
-                               }
+                               require_once "{$wgStyleDirectory}/Vector.php";
                        }
                }
                $skin = new $className( $key );
@@ -200,6 +197,68 @@ abstract class Skin extends ContextSource {
                wfProfileOut( __METHOD__ );
        }
 
+       /**
+        * Defines the ResourceLoader modules that should be added to the skin
+        * It is recommended that skins wishing to override call parent::getDefaultModules()
+        * and substitute out any modules they wish to change by using a key to look them up
+        * @return Array of modules with helper keys for easy overriding
+        */
+       public function getDefaultModules() {
+               global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
+                       $wgAjaxWatch, $wgEnableAPI, $wgEnableWriteAPI;
+
+               $out = $this->getOutput();
+               $user = $out->getUser();
+               $modules = array(
+                       // modules that enhance the page content in some way
+                       'content' => array(
+                               'mediawiki.page.ready',
+                       ),
+                       // modules that exist for legacy reasons
+                       'legacy' => array(),
+                       // modules relating to search functionality
+                       'search' => array(),
+                       // modules relating to functionality relating to watching an article
+                       'watch' => array(),
+                       // modules which relate to the current users preferences
+                       'user' => array(),
+               );
+               if ( $wgIncludeLegacyJavaScript ) {
+                       $modules['legacy'][] = 'mediawiki.legacy.wikibits';
+               }
+
+               if ( $wgPreloadJavaScriptMwUtil ) {
+                       $modules['legacy'][] = 'mediawiki.util';
+               }
+
+               // Add various resources if required
+               if ( $wgUseAjax ) {
+                       $modules['legacy'][] = 'mediawiki.legacy.ajax';
+
+                       if ( $wgEnableAPI ) {
+                               if ( $wgEnableWriteAPI && $wgAjaxWatch && $user->isLoggedIn()
+                                       && $user->isAllowed( 'writeapi' )
+                               ) {
+                                       $modules['watch'][] = 'mediawiki.page.watch.ajax';
+                               }
+
+                               if ( !$user->getOption( 'disablesuggest', false ) ) {
+                                       $modules['search'][] = 'mediawiki.searchSuggest';
+                               }
+                       }
+               }
+
+               if ( $user->getBoolOption( 'editsectiononrightclick' ) ) {
+                       $modules['user'][] = 'mediawiki.action.view.rightClickEdit';
+               }
+
+               // Crazy edit-on-double-click stuff
+               if ( $out->isArticle() && $user->getOption( 'editondblclick' ) ) {
+                       $modules['user'][] = 'mediawiki.action.view.dblClickEdit';
+               }
+               return $modules;
+       }
+
        /**
         * Preload the existence of three commonly-requested pages in a single query
         */
@@ -290,7 +349,7 @@ abstract class Skin extends ContextSource {
                        return $this->mRelevantUser;
                }
                $title = $this->getRelevantTitle();
-               if( $title->hasSubjectNamespace( NS_USER ) ) {
+               if ( $title->hasSubjectNamespace( NS_USER ) ) {
                        $rootUser = $title->getRootText();
                        if ( User::isIP( $rootUser ) ) {
                                $this->mRelevantUser = User::newFromName( $rootUser, false );
@@ -667,7 +726,7 @@ abstract class Skin extends ContextSource {
 
                                                if ( $c > 1 ) {
                                                        $subpages .= $wgLang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped();
-                                               } else  {
+                                               } else {
                                                        $subpages .= '&lt; ';
                                                }
 
@@ -1014,7 +1073,7 @@ abstract class Skin extends ContextSource {
         */
        static function makeSpecialUrl( $name, $urlaction = '', $proto = null ) {
                $title = SpecialPage::getSafeTitleFor( $name );
-               if( is_null( $proto ) ) {
+               if ( is_null( $proto ) ) {
                        return $title->getLocalURL( $urlaction );
                } else {
                        return $title->getFullURL( $urlaction, false, $proto );
@@ -1252,7 +1311,7 @@ abstract class Skin extends ContextSource {
                                                }
 
                                                global $wgExternalLinkTarget;
-                                               if ( $wgExternalLinkTarget) {
+                                               if ( $wgExternalLinkTarget ) {
                                                        $extraAttribs['target'] = $wgExternalLinkTarget;
                                                }
                                        } else {
@@ -1293,17 +1352,27 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Gets new talk page messages for the current user.
-        * @return MediaWiki message or if no new talk page messages, nothing
+        * Gets new talk page messages for the current user and returns an
+        * appropriate alert message (or an empty string if there are no messages)
+        * @return String
         */
        function getNewtalks() {
+
+               $newMessagesAlert = '';
+               $user = $this->getUser();
+               $newtalks = $user->getNewMessageLinks();
                $out = $this->getOutput();
 
-               $newtalks = $this->getUser()->getNewMessageLinks();
-               $ntl = '';
+               // Allow extensions to disable or modify the new messages alert
+               if ( !wfRunHooks( 'GetNewMessagesAlert', array( &$newMessagesAlert, $newtalks, $user, $out ) ) ) {
+                       return '';
+               }
+               if ( $newMessagesAlert ) {
+                       return $newMessagesAlert;
+               }
 
                if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
-                       $uTalkTitle = $this->getUser()->getTalkPage();
+                       $uTalkTitle = $user->getTalkPage();
 
                        if ( !$uTalkTitle->equals( $out->getTitle() ) ) {
                                $lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null;
@@ -1342,26 +1411,25 @@ abstract class Skin extends ContextSource {
                                );
 
                                if ( $nofAuthors >= 1 && $nofAuthors <= 10 ) {
-                                       $ntl = $this->msg(
+                                       $newMessagesAlert = $this->msg(
                                                'youhavenewmessagesfromusers',
                                                $newMessagesLink,
                                                $newMessagesDiffLink
                                        )->numParams( $nofAuthors );
                                } else {
                                        // $nofAuthors === 11 signifies "11 or more" ("more than 10")
-                                       $ntl = $this->msg(
+                                       $newMessagesAlert = $this->msg(
                                                $nofAuthors > 10 ? 'youhavenewmessagesmanyusers' : 'youhavenewmessages',
                                                $newMessagesLink,
                                                $newMessagesDiffLink
                                        );
                                }
-                               $ntl = $ntl->text();
+                               $newMessagesAlert = $newMessagesAlert->text();
                                # Disable Squid cache
                                $out->setSquidMaxage( 0 );
                        }
                } elseif ( count( $newtalks ) ) {
-                       // _>" " for BC <= 1.16
-                       $sep = str_replace( '_', ' ', $this->msg( 'newtalkseparator' )->escaped() );
+                       $sep = $this->msg( 'newtalkseparator' )->escaped();
                        $msgs = array();
 
                        foreach ( $newtalks as $newtalk ) {
@@ -1371,11 +1439,11 @@ abstract class Skin extends ContextSource {
                                );
                        }
                        $parts = implode( $sep, $msgs );
-                       $ntl = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped();
+                       $newMessagesAlert = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped();
                        $out->setSquidMaxage( 0 );
                }
 
-               return $ntl;
+               return $newMessagesAlert;
        }
 
        /**
@@ -1391,17 +1459,17 @@ abstract class Skin extends ContextSource {
 
                $needParse = false;
 
-               if( $name === 'default' ) {
+               if ( $name === 'default' ) {
                        // special case
                        global $wgSiteNotice;
                        $notice = $wgSiteNotice;
-                       if( empty( $notice ) ) {
+                       if ( empty( $notice ) ) {
                                wfProfileOut( __METHOD__ );
                                return false;
                        }
                } else {
                        $msg = $this->msg( $name )->inContentLanguage();
-                       if( $msg->isDisabled() ) {
+                       if ( $msg->isDisabled() ) {
                                wfProfileOut( __METHOD__ );
                                return false;
                        }
@@ -1411,8 +1479,8 @@ abstract class Skin extends ContextSource {
                // Use the extra hash appender to let eg SSL variants separately cache.
                $key = wfMemcKey( $name . $wgRenderHashAppend );
                $cachedNotice = $parserMemc->get( $key );
-               if( is_array( $cachedNotice ) ) {
-                       if( md5( $notice ) == $cachedNotice['hash'] ) {
+               if ( is_array( $cachedNotice ) ) {
+                       if ( md5( $notice ) == $cachedNotice['hash'] ) {
                                $notice = $cachedNotice['html'];
                        } else {
                                $needParse = true;
@@ -1532,14 +1600,14 @@ abstract class Skin extends ContextSource {
                        # DoEditSectionLink: it can't change the brackets or the span.)
                        $result = wfMessage( 'editsection-brackets' )->rawParams( $result )
                                ->inLanguage( $lang )->escaped();
-                       return "<span class=\"editsection\">$result</span>";
+                       return "<span class=\"mw-editsection\">$result</span>";
                }
 
                # Add the brackets and the span, and *then* run the nice new hook, with
                # clean and non-redundant arguments.
                $result = wfMessage( 'editsection-brackets' )->rawParams( $link )
                        ->inLanguage( $lang )->escaped();
-               $result = "<span class=\"editsection\">$result</span>";
+               $result = "<span class=\"mw-editsection\">$result</span>";
 
                wfRunHooks( 'DoEditSectionLink', array( $this, $nt, $section, $tooltip, &$result, $lang ) );
                return $result;
@@ -1557,6 +1625,7 @@ abstract class Skin extends ContextSource {
        function __call( $fname, $args ) {
                $realFunction = array( 'Linker', $fname );
                if ( is_callable( $realFunction ) ) {
+                       wfDeprecated( get_class( $this ) . '::' . $fname, '1.21' );
                        return call_user_func_array( $realFunction, $args );
                } else {
                        $className = get_class( $this );
diff --git a/includes/SkinLegacy.php b/includes/SkinLegacy.php
deleted file mode 100644 (file)
index b9766a9..0000000
+++ /dev/null
@@ -1,882 +0,0 @@
-<?php
-/**
- * Base class for legacy skins.
- *
- * 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 SkinLegacy extends SkinTemplate {
-       var $useHeadElement = true;
-       protected $mWatchLinkNum = 0; // Appended to end of watch link id's
-
-       /**
-        * Add skin specific stylesheets
-        * @param $out OutputPage
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               $out->addModuleStyles( 'mediawiki.legacy.shared' );
-               $out->addModuleStyles( 'mediawiki.legacy.oldshared' );
-       }
-
-       public function commonPrintStylesheet() {
-               return true;
-       }
-
-       /**
-        * This was for the old skins and for users with 640x480 screen.
-        * Please note old skins are still used and might prove useful for
-        * users having old computers or visually impaired.
-        */
-       var $mSuppressQuickbar = false;
-
-       /**
-        * Suppress the quickbar from the output, only for skin supporting
-        * the quickbar
-        */
-       public function suppressQuickbar() {
-               $this->mSuppressQuickbar = true;
-       }
-
-       /**
-        * Return whether the quickbar should be suppressed from the output
-        *
-        * @return Boolean
-        */
-       public function isQuickbarSuppressed() {
-               return $this->mSuppressQuickbar;
-       }
-
-       function qbSetting() {
-               global $wgUser;
-               if ( $this->isQuickbarSuppressed() ) {
-                       return 0;
-               }
-               $q = $wgUser->getOption( 'quickbar', 0 );
-               if( $q == 5 ) {
-                       # 5 is the default, which chooses the setting
-                       # depending on the directionality of your interface language
-                       global $wgLang;
-                       return $wgLang->isRTL() ? 2 : 1;
-               }
-               return $q;
-       }
-
-}
-
-class LegacyTemplate extends BaseTemplate {
-
-       // How many search boxes have we made?  Avoid duplicate id's.
-       protected $searchboxes = '';
-
-       function execute() {
-               $this->html( 'headelement' );
-               echo $this->beforeContent();
-               $this->html( 'bodytext' );
-               echo "\n";
-               echo $this->afterContent();
-               $this->html( 'dataAfterContent' );
-               $this->printTrail();
-               echo "\n</body></html>";
-       }
-
-       /**
-        * This will be called immediately after the "<body>" tag.  Split into
-        * two functions to make it easier to subclass.
-        * @return string
-        */
-       function beforeContent() {
-               return $this->doBeforeContent();
-       }
-
-       function doBeforeContent() {
-               global $wgLang;
-               wfProfileIn( __METHOD__ );
-
-               $s = '';
-
-               $langlinks = $this->otherLanguages();
-               if ( $langlinks ) {
-                       $rows = 2;
-                       $borderhack = '';
-               } else {
-                       $rows = 1;
-                       $langlinks = false;
-                       $borderhack = 'class="top"';
-               }
-
-               $s .= "\n<div id='content'>\n<div id='topbar'>\n" .
-                       "<table cellspacing='0' style='width: 100%;'>\n<tr>\n";
-
-               if ( $this->getSkin()->qbSetting() == 0 ) {
-                       $s .= "<td class='top' style='text-align: left; vertical-align: top;' rowspan='{$rows}'>\n" .
-                               $this->getSkin()->logoText( $wgLang->alignStart() ) . '</td>';
-               }
-
-               $l = $wgLang->alignStart();
-               $s .= "<td {$borderhack} style='text-align: $l; vertical-align: top;'>\n";
-
-               $s .= $this->topLinks();
-               $s .= '<p class="subtitle">' . $this->pageTitleLinks() . "</p>\n";
-
-               $r = $wgLang->alignEnd();
-               $s .= "</td>\n<td {$borderhack} style='text-align: $r; vertical-align: top;' nowrap='nowrap'>";
-               $s .= $this->nameAndLogin();
-               $s .= "\n<br />" . $this->searchForm() . '</td>';
-
-               if ( $langlinks ) {
-                       $s .= "</tr>\n<tr>\n<td class='top' colspan=\"2\">$langlinks</td>\n";
-               }
-
-               $s .= "</tr>\n</table>\n</div>\n";
-               $s .= "\n<div id='article'>\n";
-
-               $notice = $this->getSkin()->getSiteNotice();
-
-               if ( $notice ) {
-                       $s .= "\n<div id='siteNotice'>$notice</div>\n";
-               }
-               $s .= $this->pageTitle();
-               $s .= $this->pageSubtitle();
-               $s .= $this->getSkin()->getCategories();
-
-               wfProfileOut( __METHOD__ );
-               return $s;
-       }
-
-       /**
-        * This gets called shortly before the "</body>" tag.
-        * @return String HTML to be put before "</body>"
-        */
-       function afterContent() {
-               return $this->doAfterContent();
-       }
-
-       /** overloaded by derived classes
-        * @return string
-        */
-       function doAfterContent() {
-               return '</div></div>';
-       }
-
-       function searchForm() {
-               global $wgRequest, $wgUseTwoButtonsSearchForm;
-
-               $search = $wgRequest->getText( 'search' );
-
-               $s = '<form id="searchform' . $this->searchboxes . '" name="search" class="inline" method="post" action="'
-                       . $this->getSkin()->escapeSearchLink() . "\">\n"
-                       . '<input type="text" id="searchInput' . $this->searchboxes . '" name="search" size="19" value="'
-                       . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />\n"
-                       . '<input type="submit" name="go" value="' . wfMessage( 'searcharticle' )->text() . '" />';
-
-               if ( $wgUseTwoButtonsSearchForm ) {
-                       $s .= '&#160;<input type="submit" name="fulltext" value="' . wfMessage( 'searchbutton' )->text() . "\" />\n";
-               } else {
-                       $s .= ' <a href="' . $this->getSkin()->escapeSearchLink() . '" rel="search">' . wfMessage( 'powersearch-legend' )->text() . "</a>\n";
-               }
-
-               $s .= '</form>';
-
-               // Ensure unique id's for search boxes made after the first
-               $this->searchboxes = $this->searchboxes == '' ? 2 : $this->searchboxes + 1;
-
-               return $s;
-       }
-
-       function pageStats() {
-               $ret = array();
-               $items = array( 'viewcount', 'credits', 'lastmod', 'numberofwatchingusers', 'copyright' );
-
-               foreach( $items as $item ) {
-                       if ( $this->data[$item] !== false ) {
-                               $ret[] = $this->data[$item];
-                       }
-               }
-
-               return implode( ' ', $ret );
-       }
-
-       function topLinks() {
-               global $wgOut;
-
-               $s = array(
-                       $this->getSkin()->mainPageLink(),
-                       Linker::specialLink( 'Recentchanges' )
-               );
-
-               if ( $wgOut->isArticleRelated() ) {
-                       $s[] = $this->editThisPage();
-                       $s[] = $this->historyLink();
-               }
-
-               # Many people don't like this dropdown box
-               # $s[] = $this->specialPagesList();
-
-               if ( $this->variantLinks() ) {
-                       $s[] = $this->variantLinks();
-               }
-
-               if ( $this->extensionTabLinks() ) {
-                       $s[] = $this->extensionTabLinks();
-               }
-
-               // @todo FIXME: Is using Language::pipeList impossible here? Do not quite understand the use of the newline
-               return implode( $s, wfMessage( 'pipe-separator' )->escaped() . "\n" );
-       }
-
-       /**
-        * Language/charset variant links for classic-style skins
-        * @return string
-        */
-       function variantLinks() {
-               $s = '';
-
-               /* show links to different language variants */
-               global $wgDisableLangConversion, $wgLang;
-
-               $title = $this->getSkin()->getTitle();
-               $lang = $title->getPageLanguage();
-               $variants = $lang->getVariants();
-
-               if ( !$wgDisableLangConversion && count( $variants ) > 1
-                       && !$title->isSpecialPage() ) {
-                       foreach ( $variants as $code ) {
-                               $varname = $lang->getVariantname( $code );
-
-                               if ( $varname == 'disable' ) {
-                                       continue;
-                               }
-                               $s = $wgLang->pipeList( array(
-                                       $s,
-                                       '<a href="' . htmlspecialchars( $title->getLocalURL( 'variant=' . $code ) ) . '" lang="' . $code . '" hreflang="' . $code . '">' . htmlspecialchars( $varname ) . '</a>'
-                               ) );
-                       }
-               }
-
-               return $s;
-       }
-
-       /**
-        * Compatibility for extensions adding functionality through tabs.
-        * Eventually these old skins should be replaced with SkinTemplate-based
-        * versions, sigh...
-        * @return string
-        * @todo Exterminate! ...that, and replace it with normal SkinTemplate stuff
-        */
-       function extensionTabLinks() {
-               $tabs = array();
-               $out = '';
-               $s = array();
-               wfRunHooks( 'SkinTemplateTabs', array( $this->getSkin(), &$tabs ) );
-               foreach ( $tabs as $tab ) {
-                       $s[] = Xml::element( 'a',
-                               array( 'href' => $tab['href'] ),
-                               $tab['text'] );
-               }
-
-               if ( count( $s ) ) {
-                       global $wgLang;
-
-                       $out = wfMessage( 'pipe-separator' )->escaped();
-                       $out .= $wgLang->pipeList( $s );
-               }
-
-               return $out;
-       }
-
-       function bottomLinks() {
-               global $wgOut, $wgUser;
-               $sep = wfMessage( 'pipe-separator' )->escaped() . "\n";
-
-               $s = '';
-               if ( $wgOut->isArticleRelated() ) {
-                       $element[] = '<strong>' . $this->editThisPage() . '</strong>';
-
-                       if ( $wgUser->isLoggedIn() ) {
-                               $element[] = $this->watchThisPage();
-                       }
-
-                       $element[] = $this->talkLink();
-                       $element[] = $this->historyLink();
-                       $element[] = $this->whatLinksHere();
-                       $element[] = $this->watchPageLinksLink();
-
-                       $title = $this->getSkin()->getTitle();
-
-                       if (
-                               $title->getNamespace() == NS_USER ||
-                               $title->getNamespace() == NS_USER_TALK
-                       ) {
-                               $id = User::idFromName( $title->getText() );
-                               $ip = User::isIP( $title->getText() );
-
-                               # Both anons and non-anons have contributions list
-                               if ( $id || $ip ) {
-                                       $element[] = $this->userContribsLink();
-                               }
-
-                               if ( $this->getSkin()->showEmailUser( $id ) ) {
-                                       $element[] = $this->emailUserLink();
-                               }
-                       }
-
-                       $s = implode( $element, $sep );
-
-                       if ( $title->getArticleID() ) {
-                               $s .= "\n<br />";
-
-                               // Delete/protect/move links for privileged users
-                               if ( $wgUser->isAllowed( 'delete' ) ) {
-                                       $s .= $this->deleteThisPage();
-                               }
-
-                               if ( $wgUser->isAllowed( 'protect' ) && $title->getRestrictionTypes() ) {
-                                       $s .= $sep . $this->protectThisPage();
-                               }
-
-                               if ( $wgUser->isAllowed( 'move' ) ) {
-                                       $s .= $sep . $this->moveThisPage();
-                               }
-                       }
-
-                       $s .= "<br />\n" . $this->otherLanguages();
-               }
-
-               return $s;
-       }
-
-       function otherLanguages() {
-               global $wgOut, $wgLang, $wgHideInterlanguageLinks;
-
-               if ( $wgHideInterlanguageLinks ) {
-                       return '';
-               }
-
-               $a = $wgOut->getLanguageLinks();
-
-               if ( 0 == count( $a ) ) {
-                       return '';
-               }
-
-               $s = wfMessage( 'otherlanguages' )->text() . wfMessage( 'colon-separator' )->text();
-               $first = true;
-
-               if ( $wgLang->isRTL() ) {
-                       $s .= '<span dir="ltr">';
-               }
-
-               foreach ( $a as $l ) {
-                       if ( !$first ) {
-                               $s .= wfMessage( 'pipe-separator' )->escaped();
-                       }
-
-                       $first = false;
-
-                       $nt = Title::newFromText( $l );
-                       $text = Language::fetchLanguageName( $nt->getInterwiki() );
-
-                       $s .= Html::element( 'a',
-                               array( 'href' => $nt->getFullURL(), 'title' => $nt->getText(), 'class' => "external" ),
-                               $text == '' ? $l : $text );
-               }
-
-               if ( $wgLang->isRTL() ) {
-                       $s .= '</span>';
-               }
-
-               return $s;
-       }
-
-       /**
-        * Show a drop-down box of special pages
-        * @return string
-        */
-       function specialPagesList() {
-               global $wgScript;
-
-               $select = new XmlSelect( 'title' );
-               $pages = SpecialPageFactory::getUsablePages();
-               array_unshift( $pages, SpecialPageFactory::getPage( 'SpecialPages' ) );
-               foreach ( $pages as $obj ) {
-                       $select->addOption( $obj->getDescription(),
-                               $obj->getTitle()->getPrefixedDBkey() );
-               }
-
-               return Html::rawElement( 'form',
-                       array( 'id' => 'specialpages', 'method' => 'get', 'action' => $wgScript ),
-                       $select->getHTML() . Xml::submitButton( wfMessage( 'go' )->text() ) );
-       }
-
-       function pageTitleLinks() {
-               global $wgOut, $wgUser, $wgRequest, $wgLang;
-
-               $oldid = $wgRequest->getVal( 'oldid' );
-               $diff = $wgRequest->getVal( 'diff' );
-               $action = $wgRequest->getText( 'action' );
-
-               $skin = $this->getSkin();
-               $title = $skin->getTitle();
-
-               $s[] = $this->printableLink();
-               $disclaimer = $skin->disclaimerLink(); # may be empty
-
-               if ( $disclaimer ) {
-                       $s[] = $disclaimer;
-               }
-
-               $privacy = $skin->privacyLink(); # may be empty too
-
-               if ( $privacy ) {
-                       $s[] = $privacy;
-               }
-
-               if ( $wgOut->isArticleRelated() ) {
-                       if ( $title->getNamespace() == NS_FILE ) {
-                               $image = wfFindFile( $title );
-
-                               if ( $image ) {
-                                       $href = $image->getURL();
-                                       $s[] = Html::element( 'a', array( 'href' => $href,
-                                               'title' => $href ), $title->getText() );
-
-                               }
-                       }
-               }
-
-               if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) {
-                       $s[] .= Linker::linkKnown(
-                               $title,
-                               wfMessage( 'currentrev' )->text()
-                       );
-               }
-
-               if ( $wgUser->getNewtalk() ) {
-                       # do not show "You have new messages" text when we are viewing our
-                       # own talk page
-                       if ( !$title->equals( $wgUser->getTalkPage() ) ) {
-                               $tl = Linker::linkKnown(
-                                       $wgUser->getTalkPage(),
-                                       wfMessage( 'newmessageslink' )->escaped(),
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               );
-
-                               $dl = Linker::linkKnown(
-                                       $wgUser->getTalkPage(),
-                                       wfMessage( 'newmessagesdifflink' )->escaped(),
-                                       array(),
-                                       array( 'diff' => 'cur' )
-                               );
-                               $s[] = '<strong>' . wfMessage( 'youhavenewmessages', $tl, $dl )->text() . '</strong>';
-                               # disable caching
-                               $wgOut->setSquidMaxage( 0 );
-                               $wgOut->enableClientCache( false );
-                       }
-               }
-
-               $undelete = $skin->getUndeleteLink();
-
-               if ( !empty( $undelete ) ) {
-                       $s[] = $undelete;
-               }
-
-               return $wgLang->pipeList( $s );
-       }
-
-       /**
-        * Gets the h1 element with the page title.
-        * @return string
-        */
-       function pageTitle() {
-               global $wgOut;
-               $s = '<h1 class="pagetitle"><span dir="auto">' . $wgOut->getPageTitle() . '</span></h1>';
-               return $s;
-       }
-
-       function pageSubtitle() {
-               global $wgOut;
-
-               $sub = $wgOut->getSubtitle();
-
-               if ( $sub == '' ) {
-                       global $wgExtraSubtitle;
-                       $sub = wfMessage( 'tagline' )->parse() . $wgExtraSubtitle;
-               }
-
-               $subpages = $this->getSkin()->subPageSubtitle();
-               $sub .= !empty( $subpages ) ? "</p><p class='subpages'>$subpages" : '';
-               $s = "<p class='subtitle'>{$sub}</p>\n";
-
-               return $s;
-       }
-
-       function printableLink() {
-               global $wgOut, $wgRequest, $wgLang;
-
-               $s = array();
-
-               if ( !$wgOut->isPrintable() ) {
-                       $printurl = htmlspecialchars( $this->getSkin()->getTitle()->getLocalUrl(
-                               $wgRequest->appendQueryValue( 'printable', 'yes', true ) ) );
-                       $s[] = "<a href=\"$printurl\" rel=\"alternate\">"
-                               . wfMessage( 'printableversion' )->text() . '</a>';
-               }
-
-               if ( $wgOut->isSyndicated() ) {
-                       foreach ( $wgOut->getSyndicationLinks() as $format => $link ) {
-                               $feedurl = htmlspecialchars( $link );
-                               $s[] = "<a href=\"$feedurl\" rel=\"alternate\" type=\"application/{$format}+xml\""
-                                               . " class=\"feedlink\">" . wfMessage( "feed-$format" )->escaped() . "</a>";
-                       }
-               }
-               return $wgLang->pipeList( $s );
-       }
-
-       /**
-        * @deprecated in 1.19
-        * @return string
-        */
-       function getQuickbarCompensator( $rows = 1 ) {
-               wfDeprecated( __METHOD__, '1.19' );
-               return "<td style='width: 152px;' rowspan='{$rows}'>&#160;</td>";
-       }
-
-       function editThisPage() {
-               global $wgOut;
-
-               if ( !$wgOut->isArticleRelated() ) {
-                       $s = wfMessage( 'protectedpage' )->text();
-               } else {
-                       $title = $this->getSkin()->getTitle();
-                       if ( $title->quickUserCan( 'edit' ) && $title->exists() ) {
-                               $t = wfMessage( 'editthispage' )->text();
-                       } elseif ( $title->quickUserCan( 'create' ) && !$title->exists() ) {
-                               $t = wfMessage( 'create-this-page' )->text();
-                       } else {
-                               $t = wfMessage( 'viewsource' )->text();
-                       }
-
-                       $s = Linker::linkKnown(
-                               $title,
-                               $t,
-                               array(),
-                               $this->getSkin()->editUrlOptions()
-                       );
-               }
-
-               return $s;
-       }
-
-       function deleteThisPage() {
-               global $wgUser, $wgRequest;
-
-               $diff = $wgRequest->getVal( 'diff' );
-               $title = $this->getSkin()->getTitle();
-
-               if ( $title->getArticleID() && ( !$diff ) && $wgUser->isAllowed( 'delete' ) ) {
-                       $t = wfMessage( 'deletethispage' )->text();
-
-                       $s = Linker::linkKnown(
-                               $title,
-                               $t,
-                               array(),
-                               array( 'action' => 'delete' )
-                       );
-               } else {
-                       $s = '';
-               }
-
-               return $s;
-       }
-
-       function protectThisPage() {
-               global $wgUser, $wgRequest;
-
-               $diff = $wgRequest->getVal( 'diff' );
-               $title = $this->getSkin()->getTitle();
-
-               if ( $title->getArticleID() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) && $title->getRestrictionTypes() ) {
-                       if ( $title->isProtected() ) {
-                               $text = wfMessage( 'unprotectthispage' )->text();
-                               $query = array( 'action' => 'unprotect' );
-                       } else {
-                               $text = wfMessage( 'protectthispage' )->text();
-                               $query = array( 'action' => 'protect' );
-                       }
-
-                       $s = Linker::linkKnown(
-                               $title,
-                               $text,
-                               array(),
-                               $query
-                       );
-               } else {
-                       $s = '';
-               }
-
-               return $s;
-       }
-
-       function watchThisPage() {
-               global $wgOut, $wgUser;
-               ++$this->mWatchLinkNum;
-
-               // Cache
-               $title = $this->getSkin()->getTitle();
-
-               if ( $wgOut->isArticleRelated() ) {
-                       if ( $wgUser->isWatched( $title ) ) {
-                               $text = wfMessage( 'unwatchthispage' )->text();
-                               $query = array(
-                                       'action' => 'unwatch',
-                                       'token' => UnwatchAction::getUnwatchToken( $title, $wgUser ),
-                               );
-                               $id = 'mw-unwatch-link' . $this->mWatchLinkNum;
-                       } else {
-                               $text = wfMessage( 'watchthispage' )->text();
-                               $query = array(
-                                       'action' => 'watch',
-                                       'token' => WatchAction::getWatchToken( $title, $wgUser ),
-                               );
-                               $id = 'mw-watch-link' . $this->mWatchLinkNum;
-                       }
-
-                       $s = Linker::linkKnown(
-                               $title,
-                               $text,
-                               array( 'id' => $id ),
-                               $query
-                       );
-               } else {
-                       $s = wfMessage( 'notanarticle' )->text();
-               }
-
-               return $s;
-       }
-
-       function moveThisPage() {
-               if ( $this->getSkin()->getTitle()->quickUserCan( 'move' ) ) {
-                       return Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Movepage' ),
-                               wfMessage( 'movethispage' )->text(),
-                               array(),
-                               array( 'target' => $this->getSkin()->getTitle()->getPrefixedDBkey() )
-                       );
-               } else {
-                       // no message if page is protected - would be redundant
-                       return '';
-               }
-       }
-
-       function historyLink() {
-               return Linker::link(
-                       $this->getSkin()->getTitle(),
-                       wfMessage( 'history' )->escaped(),
-                       array( 'rel' => 'archives' ),
-                       array( 'action' => 'history' )
-               );
-       }
-
-       function whatLinksHere() {
-               return Linker::linkKnown(
-                       SpecialPage::getTitleFor( 'Whatlinkshere', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
-                       wfMessage( 'whatlinkshere' )->escaped()
-               );
-       }
-
-       function userContribsLink() {
-               return Linker::linkKnown(
-                       SpecialPage::getTitleFor( 'Contributions', $this->getSkin()->getTitle()->getDBkey() ),
-                       wfMessage( 'contributions' )->escaped()
-               );
-       }
-
-       function emailUserLink() {
-               return Linker::linkKnown(
-                       SpecialPage::getTitleFor( 'Emailuser', $this->getSkin()->getTitle()->getDBkey() ),
-                       wfMessage( 'emailuser' )->escaped()
-               );
-       }
-
-       function watchPageLinksLink() {
-               global $wgOut;
-
-               if ( !$wgOut->isArticleRelated() ) {
-                       return wfMessage( 'parentheses', wfMessage( 'notanarticle' )->text() )->escaped();
-               } else {
-                       return Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Recentchangeslinked', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
-                               wfMessage( 'recentchangeslinked-toolbox' )->escaped()
-                       );
-               }
-       }
-
-       function talkLink() {
-               $title = $this->getSkin()->getTitle();
-               if ( NS_SPECIAL == $title->getNamespace() ) {
-                       # No discussion links for special pages
-                       return '';
-               }
-
-               $linkOptions = array();
-
-               if ( $title->isTalkPage() ) {
-                       $link = $title->getSubjectPage();
-                       switch( $link->getNamespace() ) {
-                               case NS_MAIN:
-                                       $text = wfMessage( 'articlepage' );
-                                       break;
-                               case NS_USER:
-                                       $text = wfMessage( 'userpage' );
-                                       break;
-                               case NS_PROJECT:
-                                       $text = wfMessage( 'projectpage' );
-                                       break;
-                               case NS_FILE:
-                                       $text = wfMessage( 'imagepage' );
-                                       # Make link known if image exists, even if the desc. page doesn't.
-                                       if ( wfFindFile( $link ) )
-                                               $linkOptions[] = 'known';
-                                       break;
-                               case NS_MEDIAWIKI:
-                                       $text = wfMessage( 'mediawikipage' );
-                                       break;
-                               case NS_TEMPLATE:
-                                       $text = wfMessage( 'templatepage' );
-                                       break;
-                               case NS_HELP:
-                                       $text = wfMessage( 'viewhelppage' );
-                                       break;
-                               case NS_CATEGORY:
-                                       $text = wfMessage( 'categorypage' );
-                                       break;
-                               default:
-                                       $text = wfMessage( 'articlepage' );
-                       }
-               } else {
-                       $link = $title->getTalkPage();
-                       $text = wfMessage( 'talkpage' );
-               }
-
-               $s = Linker::link( $link, $text->text(), array(), array(), $linkOptions );
-
-               return $s;
-       }
-
-       function commentLink() {
-               global $wgOut;
-
-               $title = $this->getSkin()->getTitle();
-               if ( $title->isSpecialPage() ) {
-                       return '';
-               }
-
-               # __NEWSECTIONLINK___ changes behavior here
-               # If it is present, the link points to this page, otherwise
-               # it points to the talk page
-               if ( !$title->isTalkPage() && !$wgOut->showNewSectionLink() ) {
-                       $title = $title->getTalkPage();
-               }
-
-               return Linker::linkKnown(
-                       $title,
-                       wfMessage( 'postcomment' )->text(),
-                       array(),
-                       array(
-                               'action' => 'edit',
-                               'section' => 'new'
-                       )
-               );
-       }
-
-       function getUploadLink() {
-               global $wgUploadNavigationUrl;
-
-               if ( $wgUploadNavigationUrl ) {
-                       # Using an empty class attribute to avoid automatic setting of "external" class
-                       return Linker::makeExternalLink( $wgUploadNavigationUrl,
-                               wfMessage( 'upload' )->escaped(),
-                               false, null, array( 'class' => '' ) );
-               } else {
-                       return Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Upload' ),
-                               wfMessage( 'upload' )->escaped()
-                       );
-               }
-       }
-
-       function nameAndLogin() {
-               global $wgUser, $wgLang, $wgRequest;
-
-               $returnTo = $this->getSkin()->getTitle();
-               $ret = '';
-
-               if ( $wgUser->isAnon() ) {
-                       if ( $this->getSkin()->showIPinHeader() ) {
-                               $name = $wgRequest->getIP();
-
-                               $talkLink = Linker::link( $wgUser->getTalkPage(),
-                                       $wgLang->getNsText( NS_TALK ) );
-                               $talkLink = wfMessage( 'parentheses' )->rawParams( $talkLink )->escaped();
-
-                               $ret .= "$name $talkLink";
-                       } else {
-                               $ret .= wfMessage( 'notloggedin' )->text();
-                       }
-
-                       $query = array();
-
-                       if ( !$returnTo->isSpecial( 'Userlogout' ) ) {
-                               $query['returnto'] = $returnTo->getPrefixedDBkey();
-                       }
-
-                       $loginlink = $wgUser->isAllowed( 'createaccount' )
-                               ? 'nav-login-createaccount'
-                               : 'login';
-                       $ret .= "\n<br />" . Linker::link(
-                               SpecialPage::getTitleFor( 'Userlogin' ),
-                               wfMessage( $loginlink )->text(), array(), $query
-                       );
-               } else {
-                       $talkLink = Linker::link( $wgUser->getTalkPage(),
-                               $wgLang->getNsText( NS_TALK ) );
-                       $talkLink = wfMessage( 'parentheses' )->rawParams( $talkLink )->escaped();
-
-                       $ret .= Linker::link( $wgUser->getUserPage(),
-                               htmlspecialchars( $wgUser->getName() ) );
-                       $ret .= " $talkLink<br />";
-                       $ret .= $wgLang->pipeList( array(
-                               Linker::link(
-                                       SpecialPage::getTitleFor( 'Userlogout' ), wfMessage( 'logout' )->text(),
-                                       array(), array( 'returnto' => $returnTo->getPrefixedDBkey() )
-                               ),
-                               Linker::specialLink( 'Preferences' ),
-                       ) );
-               }
-
-               $ret = $wgLang->pipeList( array(
-                       $ret,
-                       Linker::link(
-                               Title::newFromText( wfMessage( 'helppage' )->inContentLanguage()->text() ),
-                               wfMessage( 'help' )->text()
-                       ),
-               ) );
-
-               return $ret;
-       }
-}
index 59e1ccf..fa90954 100644 (file)
@@ -43,7 +43,7 @@ class MediaWiki_I18N {
                $value = wfMessage( $value )->text();
                // interpolate variables
                $m = array();
-               while( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
+               while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
                        list( $src, $var ) = $m;
                        wfSuppressWarnings();
                        $varValue = $this->_context[$var];
@@ -122,17 +122,60 @@ class SkinTemplate extends Skin {
                return new $classname();
        }
 
+       /**
+        * Generates array of language links for the current page
+        *
+        * @return array
+        * @public
+        */
+       public function getLanguages() {
+               global $wgHideInterlanguageLinks;
+               $out = $this->getOutput();
+
+               # Language links
+               $language_urls = array();
+
+               if ( !$wgHideInterlanguageLinks ) {
+                       foreach ( $out->getLanguageLinks() as $languageLinkText ) {
+                               $languageLinkParts = explode( ':', $languageLinkText, 2 );
+                               $class = 'interwiki-' . $languageLinkParts[0];
+                               unset( $languageLinkParts );
+                               $languageLinkTitle = Title::newFromText( $languageLinkText );
+                               if ( $languageLinkTitle ) {
+                                       $ilInterwikiCode = $languageLinkTitle->getInterwiki();
+                                       $ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
+
+                                       if ( strval( $ilLangName ) === '' ) {
+                                               $ilLangName = $languageLinkText;
+                                       } else {
+                                               $ilLangName = $this->formatLanguageName( $ilLangName );
+                                       }
+
+                                       $language_urls[] = array(
+                                               'href' => $languageLinkTitle->getFullURL(),
+                                               'text' => $ilLangName,
+                                               'title' => $languageLinkTitle->getText(),
+                                               'class' => $class,
+                                               'lang' => $ilInterwikiCode,
+                                               'hreflang' => $ilInterwikiCode
+                                       );
+                               }
+                       }
+               }
+               return $language_urls;
+       }
+
        /**
         * initialize various variables and generate the template
         *
         * @param $out OutputPage
         */
-       function outputPage( OutputPage $out=null ) {
+       function outputPage( OutputPage $out = null ) {
                global $wgContLang;
                global $wgScript, $wgStylePath;
                global $wgMimeType, $wgJsMimeType;
-               global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces, $wgHtml5Version;
-               global $wgDisableCounters, $wgSitename, $wgLogo, $wgHideInterlanguageLinks;
+               global $wgXhtmlNamespaces, $wgHtml5Version;
+               global $wgDisableCounters, $wgSitename, $wgLogo;
                global $wgMaxCredits, $wgShowCreditsIfMax;
                global $wgPageShowWatchingUsers;
                global $wgArticlePath, $wgScriptPath, $wgServer;
@@ -193,7 +236,7 @@ class SkinTemplate extends Skin {
 
                        $tpl->set( 'jsvarurl', false );
 
-                       $tpl->setRef( 'xhtmldefaultnamespace', $wgXhtmlDefaultNamespace );
+                       $tpl->set( 'xhtmldefaultnamespace', 'http://www.w3.org/1999/xhtml' );
                        $tpl->set( 'xhtmlnamespaces', $wgXhtmlNamespaces );
                        $tpl->set( 'html5version', $wgHtml5Version );
                        $tpl->set( 'headlinks', $out->getHeadLinks() );
@@ -229,9 +272,9 @@ class SkinTemplate extends Skin {
                }
 
                $tpl->set( 'catlinks', $this->getCategories() );
-               if( $out->isSyndicated() ) {
+               if ( $out->isSyndicated() ) {
                        $feeds = array();
-                       foreach( $out->getSyndicationLinks() as $format => $link ) {
+                       foreach ( $out->getSyndicationLinks() as $format => $link ) {
                                $feeds[$format] = array(
                                        'text' => $this->msg( "feed-$format" )->text(),
                                        'href' => $link
@@ -409,36 +452,7 @@ class SkinTemplate extends Skin {
                $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext );
                $tpl->setRef( 'bodytext', $out->mBodytext );
 
-               # Language links
-               $language_urls = array();
-
-               if ( !$wgHideInterlanguageLinks ) {
-                       foreach( $out->getLanguageLinks() as $languageLinkText ) {
-                               $languageLinkParts = explode( ':', $languageLinkText, 2 );
-                               $class = 'interwiki-' . $languageLinkParts[0];
-                               unset( $languageLinkParts );
-                               $languageLinkTitle = Title::newFromText( $languageLinkText );
-                               if ( $languageLinkTitle ) {
-                                       $ilInterwikiCode = $languageLinkTitle->getInterwiki();
-                                       $ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
-
-                                       if ( strval( $ilLangName ) === '' ) {
-                                               $ilLangName = $languageLinkText;
-                                       } else {
-                                               $ilLangName = $this->formatLanguageName( $ilLangName );
-                                       }
-
-                                       $language_urls[] = array(
-                                               'href' => $languageLinkTitle->getFullURL(),
-                                               'text' => $ilLangName,
-                                               'title' => $languageLinkTitle->getText(),
-                                               'class' => $class,
-                                               'lang' => $ilInterwikiCode,
-                                               'hreflang' => $ilInterwikiCode
-                                       );
-                               }
-                       }
-               }
+               $language_urls = $this->getLanguages();
                if ( count( $language_urls ) ) {
                        $tpl->setRef( 'language_urls', $language_urls );
                } else {
@@ -469,7 +483,7 @@ class SkinTemplate extends Skin {
                $tpl->set( 'reporttime', wfReportTime() );
 
                // original version by hansm
-               if( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) {
+               if ( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) {
                        wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" );
                }
 
@@ -568,7 +582,7 @@ class SkinTemplate extends Skin {
                if ( strval( $page ) !== '' ) {
                        $a['returnto'] = $page;
                        $query = $request->getVal( 'returntoquery', $this->thisquery );
-                       if( $query != '' ) {
+                       if ( $query != '' ) {
                                $a['returntoquery'] = $query;
                        }
                }
@@ -578,7 +592,7 @@ class SkinTemplate extends Skin {
                }
 
                $returnto = wfArrayToCgi( $a );
-               if( $this->loggedin ) {
+               if ( $this->loggedin ) {
                        $personal_urls['userpage'] = array(
                                'text' => $this->username,
                                'href' => &$this->userpageUrlDetails['href'],
@@ -614,7 +628,7 @@ class SkinTemplate extends Skin {
                        # thickens, because the Title object is altered for special pages,
                        # so it doesn't contain the original alias-with-subpage.
                        $origTitle = Title::newFromText( $request->getText( 'title' ) );
-                       if( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
+                       if ( $origTitle instanceof Title && $origTitle->isSpecialPage() ) {
                                list( $spName, $spPar ) = SpecialPageFactory::resolveAlias( $origTitle->getText() );
                                $active = $spName == 'Contributions'
                                        && ( ( $spPar && $spPar == $this->username )
@@ -662,7 +676,7 @@ class SkinTemplate extends Skin {
                                'class' => $wgSecureLogin ? 'link-https' : ''
                        );
 
-                       if( $this->showIPinHeader() ) {
+                       if ( $this->showIPinHeader() ) {
                                $href = &$this->userpageUrlDetails['href'];
                                $personal_urls['anonuserpage'] = array(
                                        'text' => $this->username,
@@ -705,10 +719,10 @@ class SkinTemplate extends Skin {
         */
        function tabAction( $title, $message, $selected, $query = '', $checkEdit = false ) {
                $classes = array();
-               if( $selected ) {
+               if ( $selected ) {
                        $classes[] = 'selected';
                }
-               if( $checkEdit && !$title->isKnown() ) {
+               if ( $checkEdit && !$title->isKnown() ) {
                        $classes[] = 'new';
                        if ( $query !== '' ) {
                                $query = 'action=edit&redlink=1&' . $query;
@@ -733,7 +747,7 @@ class SkinTemplate extends Skin {
                }
 
                $result = array();
-               if( !wfRunHooks( 'SkinTemplateTabAction', array( &$this,
+               if ( !wfRunHooks( 'SkinTemplateTabAction', array( &$this,
                                $title, $message, $selected, $checkEdit,
                                &$classes, &$query, &$text, &$result ) ) ) {
                        return $result;
@@ -742,13 +756,13 @@ class SkinTemplate extends Skin {
                return array(
                        'class' => implode( ' ', $classes ),
                        'text' => $text,
-                       'href' => $title->getLocalUrl( $query ),
+                       'href' => $title->getLocalURL( $query ),
                        'primary' => true );
        }
 
        function makeTalkUrlDetails( $name, $urlaction = '' ) {
                $title = Title::newFromText( $name );
-               if( !is_object( $title ) ) {
+               if ( !is_object( $title ) ) {
                        throw new MWException( __METHOD__ . " given invalid pagename $name" );
                }
                $title = $title->getTalkPage();
@@ -761,7 +775,7 @@ class SkinTemplate extends Skin {
 
        function makeArticleUrlDetails( $name, $urlaction = '' ) {
                $title = Title::newFromText( $name );
-               $title= $title->getSubjectPage();
+               $title = $title->getSubjectPage();
                self::checkTitle( $title, $name );
                return array(
                        'href' => $title->getLocalURL( $urlaction ),
@@ -831,7 +845,7 @@ class SkinTemplate extends Skin {
                wfRunHooks( 'SkinTemplatePreventOtherActiveTabs', array( &$this, &$preventActiveTabs ) );
 
                // Checks if page is some kind of content
-               if( $title->canExist() ) {
+               if ( $title->canExist() ) {
                        // Gets page objects for the related namespaces
                        $subjectPage = $title->getSubjectPage();
                        $talkPage = $title->getTalkPage();
@@ -1018,14 +1032,9 @@ class SkinTemplate extends Skin {
                                                $params = array();
                                        }
                                        // Loops over each variant
-                                       foreach( $variants as $code ) {
+                                       foreach ( $variants as $code ) {
                                                // Gets variant name from language code
                                                $varname = $pageLang->getVariantname( $code );
-                                               // Checks if the variant is marked as disabled
-                                               if( $varname == 'disable' ) {
-                                                       // Skips this variant
-                                                       continue;
-                                               }
                                                // Appends variant link
                                                $content_navigation['variants'][] = array(
                                                        'class' => ( $code == $preferred ) ? 'selected' : false,
@@ -1156,9 +1165,9 @@ class SkinTemplate extends Skin {
 
                $nav_urls = array();
                $nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() );
-               if( $wgUploadNavigationUrl ) {
+               if ( $wgUploadNavigationUrl ) {
                        $nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl );
-               } elseif( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) {
+               } elseif ( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getUser() ) === true ) {
                        $nav_urls['upload'] = array( 'href' => self::makeSpecialUrl( 'Upload' ) );
                } else {
                        $nav_urls['upload'] = false;
@@ -1203,7 +1212,7 @@ class SkinTemplate extends Skin {
 
                if ( $out->isArticleRelated() ) {
                        $nav_urls['whatlinkshere'] = array(
-                               'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalUrl()
+                               'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalURL()
                        );
 
                        $nav_urls['info'] = array(
@@ -1213,7 +1222,7 @@ class SkinTemplate extends Skin {
 
                        if ( $this->getTitle()->getArticleID() ) {
                                $nav_urls['recentchangeslinked'] = array(
-                                       'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalUrl()
+                                       'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalURL()
                                );
                        }
                }
@@ -1244,6 +1253,7 @@ class SkinTemplate extends Skin {
                        }
 
                        $sur = new UserrightsPage;
+                       $sur->setContext( $this->getContext() );
                        if ( $sur->userCanExecute( $this->getUser() ) ) {
                                $nav_urls['userrights'] = array(
                                        'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
@@ -1322,8 +1332,10 @@ abstract class QuickTemplate {
 
        /**
         * @private
+        * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
         */
        function jstext( $str ) {
+               wfDeprecated( __METHOD__, '1.21' );
                echo Xml::escapeJsString( $this->data[$str] );
        }
 
@@ -1506,8 +1518,9 @@ abstract class BaseTemplate extends QuickTemplate {
                                $ptool['active'] = $plink['active'];
                        }
                        foreach ( array( 'href', 'class', 'text' ) as $k ) {
-                               if ( isset( $plink[$k] ) )
+                               if ( isset( $plink[$k] ) ) {
                                        $ptool['links'][0][$k] = $plink[$k];
+                               }
                        }
                        $personal_tools[$key] = $ptool;
                }
@@ -1546,39 +1559,39 @@ abstract class BaseTemplate extends QuickTemplate {
                        case 'SEARCH':
                                // Search is a special case, skins should custom implement this
                                $boxes[$boxName] = array(
-                                       'id'        => 'p-search',
-                                       'header'    => $this->getMsg( 'search' )->text(),
+                                       'id' => 'p-search',
+                                       'header' => $this->getMsg( 'search' )->text(),
                                        'generated' => false,
-                                       'content'   => true,
+                                       'content' => true,
                                );
                                break;
                        case 'TOOLBOX':
                                $msgObj = $this->getMsg( 'toolbox' );
                                $boxes[$boxName] = array(
-                                       'id'        => 'p-tb',
-                                       'header'    => $msgObj->exists() ? $msgObj->text() : 'toolbox',
+                                       'id' => 'p-tb',
+                                       'header' => $msgObj->exists() ? $msgObj->text() : 'toolbox',
                                        'generated' => false,
-                                       'content'   => $this->getToolbox(),
+                                       'content' => $this->getToolbox(),
                                );
                                break;
                        case 'LANGUAGES':
                                if ( $this->data['language_urls'] ) {
                                        $msgObj = $this->getMsg( 'otherlanguages' );
                                        $boxes[$boxName] = array(
-                                               'id'        => 'p-lang',
-                                               'header'    => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
+                                               'id' => 'p-lang',
+                                               'header' => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
                                                'generated' => false,
-                                               'content'   => $this->data['language_urls'],
+                                               'content' => $this->data['language_urls'],
                                        );
                                }
                                break;
                        default:
                                $msgObj = $this->getMsg( $boxName );
                                $boxes[$boxName] = array(
-                                       'id'        => "p-$boxName",
-                                       'header'    => $msgObj->exists() ? $msgObj->text() : $boxName,
+                                       'id' => "p-$boxName",
+                                       'header' => $msgObj->exists() ? $msgObj->text() : $boxName,
                                        'generated' => true,
-                                       'content'   => $content,
+                                       'content' => $content,
                                );
                                break;
                        }
@@ -1618,10 +1631,10 @@ abstract class BaseTemplate extends QuickTemplate {
                } else {
                        if ( $hookContents ) {
                                $boxes['TOOLBOXEND'] = array(
-                                       'id'        => 'p-toolboxend',
-                                       'header'    => $boxes['TOOLBOX']['header'],
+                                       'id' => 'p-toolboxend',
+                                       'header' => $boxes['TOOLBOX']['header'],
                                        'generated' => false,
-                                       'content'   => "<ul>{$hookContents}</ul>",
+                                       'content' => "<ul>{$hookContents}</ul>",
                                );
                                // HACK: Make sure that TOOLBOXEND is sorted next to TOOLBOX
                                $boxes2 = array();
@@ -1807,6 +1820,7 @@ abstract class BaseTemplate extends QuickTemplate {
                $realAttrs = array(
                        'type' => 'search',
                        'name' => 'search',
+                       'placeholder' => wfMessage( 'searchsuggest-search' )->text(),
                        'value' => isset( $this->data['search'] ) ? $this->data['search'] : '',
                );
                $realAttrs = array_merge( $realAttrs, Linker::tooltipAndAccesskeyAttribs( 'search' ), $attrs );
@@ -1814,7 +1828,7 @@ abstract class BaseTemplate extends QuickTemplate {
        }
 
        function makeSearchButton( $mode, $attrs = array() ) {
-               switch( $mode ) {
+               switch ( $mode ) {
                        case 'go':
                        case 'fulltext':
                                $realAttrs = array(
@@ -1870,10 +1884,10 @@ abstract class BaseTemplate extends QuickTemplate {
 
                // Reduce footer links down to only those which are being used
                $validFooterLinks = array();
-               foreach( $footerlinks as $category => $links ) {
+               foreach ( $footerlinks as $category => $links ) {
                        $validFooterLinks[$category] = array();
-                       foreach( $links as $link ) {
-                               if( isset( $this->data[$link] ) && $this->data[$link] ) {
+                       foreach ( $links as $link ) {
+                               if ( isset( $this->data[$link] ) && $this->data[$link] ) {
                                        $validFooterLinks[$category][] = $link;
                                }
                        }
index c32738f..ac838a5 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialPage {
-
        // The canonical name of this special page
        // Also used for the default <h1> heading, @see getDescription()
        protected $mName;
@@ -305,12 +304,14 @@ class SpecialPage {
         *     If you override execute(), you can recover the default behavior with userCanExecute()
         *     and displayRestrictionError()
         *
-        * @param string $name name of the special page, as seen in links and URLs
-        * @param string $restriction user right required, e.g. "block" or "delete"
-        * @param bool $listed whether the page is listed in Special:Specialpages
-        * @param $function Callback|Bool: function called by execute(). By default it is constructed from $name
-        * @param string $file file which is included by execute(). It is also constructed from $name by default
-        * @param bool $includable whether the page can be included in normal pages
+        * @param string $name Name of the special page, as seen in links and URLs
+        * @param string $restriction User right required, e.g. "block" or "delete"
+        * @param bool $listed Whether the page is listed in Special:Specialpages
+        * @param Callback|Bool $function Function called by execute(). By default
+        * it is constructed from $name
+        * @param string $file File which is included by execute(). It is also
+        * constructed from $name by default
+        * @param bool $includable Whether the page can be included in normal pages
         */
        public function __construct(
                $name = '', $restriction = '', $listed = true,
@@ -322,12 +323,14 @@ class SpecialPage {
        /**
         * Do the real work for the constructor, mainly so __call() can intercept
         * calls to SpecialPage()
-        * @param string $name name of the special page, as seen in links and URLs
-        * @param string $restriction user right required, e.g. "block" or "delete"
-        * @param bool $listed whether the page is listed in Special:Specialpages
-        * @param $function Callback|Bool: function called by execute(). By default it is constructed from $name
-        * @param string $file file which is included by execute(). It is also constructed from $name by default
-        * @param bool $includable whether the page can be included in normal pages
+        * @param string $name Name of the special page, as seen in links and URLs
+        * @param string $restriction User right required, e.g. "block" or "delete"
+        * @param bool $listed Whether the page is listed in Special:Specialpages
+        * @param Callback|Bool $function Function called by execute(). By default
+        * it is constructed from $name
+        * @param string $file File which is included by execute(). It is also
+        * constructed from $name by default
+        * @param bool $includable Whether the page can be included in normal pages
         */
        private function init( $name, $restriction, $listed, $function, $file, $includable ) {
                $this->mName = $name;
@@ -445,7 +448,10 @@ class SpecialPage {
         * @return Mixed
         * @deprecated since 1.18
         */
-       function name( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mName, $x ); }
+       function name( $x = null ) {
+               wfDeprecated( __METHOD__, '1.18' );
+               return wfSetVar( $this->mName, $x );
+       }
 
        /**
         * These mutators are very evil, as the relevant variables should not mutate.  So
@@ -454,7 +460,10 @@ class SpecialPage {
         * @return Mixed
         * @deprecated since 1.18
         */
-       function restriction( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mRestriction, $x ); }
+       function restriction( $x = null ) {
+               wfDeprecated( __METHOD__, '1.18' );
+               return wfSetVar( $this->mRestriction, $x );
+       }
 
        /**
         * These mutators are very evil, as the relevant variables should not mutate.  So
@@ -463,7 +472,10 @@ class SpecialPage {
         * @return Mixed
         * @deprecated since 1.18
         */
-       function func( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mFunction, $x ); }
+       function func( $x = null ) {
+               wfDeprecated( __METHOD__, '1.18' );
+               return wfSetVar( $this->mFunction, $x );
+       }
 
        /**
         * These mutators are very evil, as the relevant variables should not mutate.  So
@@ -472,7 +484,10 @@ class SpecialPage {
         * @return Mixed
         * @deprecated since 1.18
         */
-       function file( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mFile, $x ); }
+       function file( $x = null ) {
+               wfDeprecated( __METHOD__, '1.18' );
+               return wfSetVar( $this->mFile, $x );
+       }
 
        /**
         * These mutators are very evil, as the relevant variables should not mutate.  So
@@ -481,7 +496,10 @@ class SpecialPage {
         * @return Mixed
         * @deprecated since 1.18
         */
-       function includable( $x = null ) { wfDeprecated( __METHOD__, '1.18' ); return wfSetVar( $this->mIncludable, $x ); }
+       function includable( $x = null ) {
+               wfDeprecated( __METHOD__, '1.18' );
+               return wfSetVar( $this->mIncludable, $x );
+       }
 
        /**
         * Whether the special page is being evaluated via transclusion
@@ -661,7 +679,7 @@ class SpecialPage {
                $func = $this->mFunction;
                // only load file if the function does not exist
                if ( !is_callable( $func ) && $this->mFile ) {
-                       require_once( $this->mFile );
+                       require_once $this->mFile;
                }
                $this->outputHeader();
                call_user_func( $func, $subPage, $this );
@@ -734,7 +752,8 @@ class SpecialPage {
                if ( $this->mContext instanceof IContextSource ) {
                        return $this->mContext;
                } else {
-                       wfDebug( __METHOD__ . " called and \$mContext is null. Return RequestContext::getMain(); for sanity\n" );
+                       wfDebug( __METHOD__ . " called and \$mContext is null. " .
+                               "Return RequestContext::getMain(); for sanity\n" );
                        return RequestContext::getMain();
                }
        }
@@ -782,7 +801,7 @@ class SpecialPage {
        /**
         * Shortcut to get user's language
         *
-        * @deprecated 1.19 Use getLanguage instead
+        * @deprecated since 1.19 Use getLanguage instead
         * @return Language
         * @since 1.18
         */
@@ -842,11 +861,11 @@ class SpecialPage {
        protected function addFeedLinks( $params ) {
                global $wgFeedClasses;
 
-               $feedTemplate = wfScript( 'api' ) . '?';
+               $feedTemplate = wfScript( 'api' );
 
                foreach ( $wgFeedClasses as $format => $class ) {
                        $theseParams = $params + array( 'feedformat' => $format );
-                       $url = $feedTemplate . wfArrayToCgi( $theseParams );
+                       $url = wfAppendQuery( $feedTemplate, $theseParams );
                        $this->getOutput()->addFeedLink( $format, $url );
                }
        }
@@ -909,6 +928,11 @@ class SpecialPage {
  * a new structure for SpecialPages
  */
 abstract class FormSpecialPage extends SpecialPage {
+       /**
+        * The sub-page of the special page.
+        * @var string
+        */
+       protected $par = null;
 
        /**
         * Get an HTMLForm descriptor array
@@ -917,17 +941,27 @@ abstract class FormSpecialPage extends SpecialPage {
        abstract protected function getFormFields();
 
        /**
-        * Add pre- or post-text to the form
+        * Add pre-text to the form
         * @return String HTML which will be sent to $form->addPreText()
         */
-       protected function preText() { return ''; }
-       protected function postText() { return ''; }
+       protected function preText() {
+               return '';
+       }
+
+       /**
+        * Add post-text to the form
+        * @return String HTML which will be sent to $form->addPostText()
+        */
+       protected function postText() {
+               return '';
+       }
 
        /**
         * Play with the HTMLForm if you need to more substantially
         * @param $form HTMLForm
         */
-       protected function alterForm( HTMLForm $form ) {}
+       protected function alterForm( HTMLForm $form ) {
+       }
 
        /**
         * Get message prefix for HTMLForm
@@ -948,9 +982,12 @@ abstract class FormSpecialPage extends SpecialPage {
 
                $form = new HTMLForm( $this->fields, $this->getContext(), $this->getMessagePrefix() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
-               $form->setWrapperLegend( $this->msg( $this->getMessagePrefix() . '-legend' ) );
-               $form->addHeaderText(
-                       $this->msg( $this->getMessagePrefix() . '-text' )->parseAsBlock() );
+               $form->setWrapperLegendMsg( $this->getMessagePrefix() . '-legend' );
+
+               $headerMsg = $this->msg( $this->getMessagePrefix() . '-text' );
+               if ( !$headerMsg->isDisabled() ) {
+                       $form->addHeaderText( $headerMsg->parseAsBlock() );
+               }
 
                // Retain query parameters (uselang etc)
                $params = array_diff_key(
@@ -977,8 +1014,10 @@ abstract class FormSpecialPage extends SpecialPage {
        /**
         * Do something exciting on successful processing of the form, most likely to show a
         * confirmation message
+        * @since 1.22 Default is to do nothing
         */
-       abstract public function onSuccess();
+       public function onSuccess() {
+       }
 
        /**
         * Basic SpecialPage workflow: get a form, send it to the user; get some data back,
@@ -1000,9 +1039,11 @@ abstract class FormSpecialPage extends SpecialPage {
 
        /**
         * Maybe do something interesting with the subpage parameter
-        * @param $par String
+        * @param string $par
         */
-       protected function setParameter( $par ) {}
+       protected function setParameter( $par ) {
+               $this->par = $par;
+       }
 
        /**
         * Called from execute() to check if the given user can perform this action.
@@ -1090,17 +1131,16 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
                $query = $this->getRedirectQuery();
                // Redirect to a page title with possible query parameters
                if ( $redirect instanceof Title ) {
-                       $url = $redirect->getFullUrl( $query );
+                       $url = $redirect->getFullURL( $query );
                        $this->getOutput()->redirect( $url );
                        return $redirect;
-               // Redirect to index.php with query parameters
                } elseif ( $redirect === true ) {
-                       global $wgScript;
-                       $url = $wgScript . '?' . wfArrayToCgi( $query );
+                       // Redirect to index.php with query parameters
+                       $url = wfAppendQuery( wfScript( 'index' ), $query );
                        $this->getOutput()->redirect( $url );
                        return $redirect;
                } else {
-                       $class = __CLASS__;
+                       $class = get_class( $this );
                        throw new MWException( "RedirectSpecialPage $class doesn't redirect!" );
                }
        }
@@ -1140,6 +1180,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
 }
 
 abstract class SpecialRedirectToSpecial extends RedirectSpecialPage {
+       // @todo FIXME: Visibility must be declared
        var $redirName, $redirSubpage;
 
        function __construct(
@@ -1216,7 +1257,7 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial {
  * - limit, offset: Useful for linking to history of one's own user page or
  * user talk page. For example, this would be a link to "the last edit to your
  * user talk page in the year 2010":
- * http://en.wikipedia.org/w/index.php?title=Special:MyPage&offset=20110000000000&limit=1&action=history
+ * http://en.wikipedia.org/wiki/Special:MyPage?offset=20110000000000&limit=1&action=history
  *
  * - feed: would allow linking to the current user's RSS feed for their user
  * talk page:
@@ -1270,9 +1311,9 @@ abstract class RedirectSpecialArticle extends RedirectSpecialPage {
                        'action',
                        'redirect', 'rdfrom',
                        # Options for preloaded edits
-                       'preload', 'editintro', 'preloadtitle', 'summary',
+                       'preload', 'editintro', 'preloadtitle', 'summary', 'nosummary',
                        # Options for overriding user settings
-                       'preview', 'internaledit', 'externaledit', 'mode',
+                       'preview', 'internaledit', 'externaledit', 'mode', 'minor', 'watchthis',
                        # Options for history/diffs
                        'section', 'oldid', 'diff', 'dir',
                        'limit', 'offset', 'feed',
index 7368ab7..4d63553 100644 (file)
@@ -162,6 +162,7 @@ class SpecialPageFactory {
                'Mytalk'                    => 'SpecialMytalk',
                'Myuploads'                 => 'SpecialMyuploads',
                'PermanentLink'             => 'SpecialPermanentLink',
+               'Redirect'                  => 'SpecialRedirect',
                'Revisiondelete'            => 'SpecialRevisionDelete',
                'Specialpages'              => 'SpecialSpecialpages',
                'Userlogout'                => 'SpecialUserlogout',
@@ -200,7 +201,7 @@ class SpecialPageFactory {
                                self::$mList['ChangeEmail'] = 'SpecialChangeEmail';
                        }
 
-                       if( $wgEnableJavaScriptTest ) {
+                       if ( $wgEnableJavaScriptTest ) {
                                self::$mList['JavaScriptTest'] = 'SpecialJavaScriptTest';
                        }
 
@@ -286,7 +287,7 @@ class SpecialPageFactory {
         *
         * @param $page Mixed: SpecialPage or string
         * @param $group String
-        * @deprecated 1.21 Override SpecialPage::getGroupName
+        * @deprecated since 1.21 Override SpecialPage::getGroupName
         */
        public static function setGroup( $page, $group ) {
                wfDeprecated( __METHOD__, '1.21' );
@@ -301,7 +302,7 @@ class SpecialPageFactory {
         *
         * @param $page SpecialPage
         * @return String
-        * @deprecated 1.21 Use SpecialPage::getFinalGroupName
+        * @deprecated since 1.21 Use SpecialPage::getFinalGroupName
         */
        public static function getGroup( &$page ) {
                wfDeprecated( __METHOD__, '1.21' );
@@ -464,9 +465,8 @@ class SpecialPageFactory {
                        if ( $name != $page->getLocalName() && !$context->getRequest()->wasPosted() ) {
                                $query = $context->getRequest()->getQueryValues();
                                unset( $query['title'] );
-                               $query = wfArrayToCgi( $query );
                                $title = $page->getTitle( $par );
-                               $url = $title->getFullUrl( $query );
+                               $url = $title->getFullURL( $query );
                                $context->getOutput()->redirect( $url );
                                wfProfileOut( __METHOD__ );
                                return $title;
index 79dcdc5..51188d8 100644 (file)
@@ -56,7 +56,7 @@ abstract class SqlDataUpdate extends DataUpdate {
                        $this->mOptions = array( 'FOR UPDATE' );
                }
 
-               // @todo: get connection only when it's needed? make sure that doesn't break anything, especially transactions!
+               // @todo get connection only when it's needed? make sure that doesn't break anything, especially transactions!
                $this->mDb = wfGetDB( DB_MASTER );
 
                $this->mWithTransaction = $withTransaction;
diff --git a/includes/StatCounter.php b/includes/StatCounter.php
new file mode 100644 (file)
index 0000000..374d5ca
--- /dev/null
@@ -0,0 +1,150 @@
+<?php
+/**
+ * @defgroup StatCounter StatCounter
+ *
+ * StatCounter is used to increment arbitrary keys for profiling reasons.
+ * The key/values are persisted in several possible ways (see $wgStatsMethod).
+ */
+
+/**
+ * Aggregator for wfIncrStats() that batches updates per request.
+ *
+ * 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 StatCounter
+ * @author Aaron Schulz
+ */
+
+/**
+ * Aggregator for wfIncrStats() that batches updates per request.
+ * This avoids spamming the collector many times for the same key.
+ *
+ * @ingroup StatCounter
+ */
+class StatCounter {
+       /** @var Array */
+       protected $deltas = array(); // (key => count)
+
+       protected function __construct() {}
+
+       /**
+        * @return StatCounter
+        */
+       public static function singleton() {
+               static $instance = null;
+               if ( !$instance ) {
+                       $instance = new self();
+               }
+               return $instance;
+       }
+
+       /**
+        * Increment a key by delta $count
+        *
+        * @param string $key
+        * @param integer $count
+        * @return void
+        */
+       public function incr( $key, $count = 1 ) {
+               $this->deltas[$key] = isset( $this->deltas[$key] ) ? $this->deltas[$key] : 0;
+               $this->deltas[$key] += $count;
+               if ( PHP_SAPI === 'cli' ) {
+                       $this->flush();
+               }
+       }
+
+       /**
+        * Flush all pending deltas to persistent storage
+        *
+        * @return void
+        */
+       public function flush() {
+               global $wgStatsMethod;
+
+               $deltas = array_filter( $this->deltas ); // remove 0 valued entries
+               if ( $wgStatsMethod === 'udp' ) {
+                       $this->sendDeltasUDP( $deltas );
+               } elseif ( $wgStatsMethod === 'cache' ) {
+                       $this->sendDeltasMemc( $deltas );
+               } else {
+                       // disabled
+               }
+               $this->deltas = array();
+       }
+
+       /**
+        * @param array $deltas
+        * @return void
+        */
+       protected function sendDeltasUDP( array $deltas ) {
+               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgAggregateStatsID;
+
+               $id = strlen( $wgAggregateStatsID ) ? $wgAggregateStatsID : wfWikiID();
+
+               $lines = array();
+               foreach ( $deltas as $key => $count ) {
+                       $lines[] = "stats/{$id} - {$count} 1 1 1 1 {$key}\n";
+               }
+
+               if ( count( $lines ) ) {
+                       static $socket = null;
+                       if ( !$socket ) {
+                               $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+                               array_unshift( $lines, "stats/{$id} - 1 1 1 1 1 -total\n" );
+                       }
+                       $packet = '';
+                       $packets = array();
+                       foreach ( $lines as $line ) {
+                               if ( ( strlen( $packet ) + strlen( $line ) ) > 1450 ) {
+                                       $packets[] = $packet;
+                                       $packet = '';
+                               }
+                               $packet .= $line;
+                       }
+                       if ( $packet != '' ) {
+                               $packets[] = $packet;
+                       }
+                       foreach ( $packets as $packet ) {
+                               wfSuppressWarnings();
+                               socket_sendto(
+                                       $socket,
+                                       $packet,
+                                       strlen( $packet ),
+                                       0,
+                                       $wgUDPProfilerHost,
+                                       $wgUDPProfilerPort
+                               );
+                               wfRestoreWarnings();
+                       }
+               }
+       }
+
+       /**
+        * @param array $deltas
+        * @return void
+        */
+       protected function sendDeltasMemc( array $deltas ) {
+               global $wgMemc;
+
+               foreach ( $deltas as $key => $count ) {
+                       $ckey = wfMemcKey( 'stats', $key );
+                       if ( $wgMemc->incr( $ckey, $count ) === null ) {
+                               $wgMemc->add( $ckey, $count );
+                       }
+               }
+       }
+}
index 5d6236f..f0253df 100644 (file)
@@ -190,7 +190,7 @@ class Status {
                                $s = wfMessage( $longContext, "* $s\n" )->plain();
                        }
                } else {
-                       $s = '* '. implode( "\n* ",
+                       $s = '* ' . implode( "\n* ",
                                $this->getErrorMessageArray( $this->errors ) ) . "\n";
                        if ( $longContext ) {
                                $s = wfMessage( $longContext, $s )->plain();
@@ -212,7 +212,7 @@ class Status {
         */
        protected function getErrorMessage( $error ) {
                if ( is_array( $error ) ) {
-                       if( isset( $error['message'] ) && $error['message'] instanceof Message ) {
+                       if ( isset( $error['message'] ) && $error['message'] instanceof Message ) {
                                $msg = $error['message'];
                        } elseif ( isset( $error['message'] ) && isset( $error['params'] ) ) {
                                $msg = wfMessage( $error['message'],
@@ -234,7 +234,7 @@ class Status {
         *
         * @note: this does not perform a full wikitext to HTML conversion, it merely applies
         *        a message transformation.
-        * @todo: figure out whether that is actually The Right Thing.
+        * @todo figure out whether that is actually The Right Thing.
         */
        public function getHTML( $shortContext = false, $longContext = false ) {
                $text = $this->getWikiText( $shortContext, $longContext );
@@ -294,9 +294,9 @@ class Status {
                $result = array();
                foreach ( $this->errors as $error ) {
                        if ( $error['type'] === $type ) {
-                               if( $error['message'] instanceof Message ) {
+                               if ( $error['message'] instanceof Message ) {
                                        $result[] = $error['message'];
-                               } elseif( $error['params'] ) {
+                               } elseif ( $error['params'] ) {
                                        $result[] = array_merge( array( $error['message'] ), $error['params'] );
                                } else {
                                        $result[] = array( $error['message'] );
index f5e4acf..1ad643a 100644 (file)
@@ -42,6 +42,7 @@ class StreamFile {
                wfProfileIn( __METHOD__ );
 
                if ( FileBackend::isStoragePath( $fname ) ) { // sanity
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( __FUNCTION__ . " given storage path '$fname'." );
                }
 
index f4c98f1..48cde0e 100644 (file)
@@ -65,7 +65,7 @@ class StringUtils {
                                | [\xf8-\xfb][\x80-\xbf]{4}
                                | \xfc[\x84-\xbf][\x80-\xbf]{4}
                        )+$/x', $value );
-                       return ($hasUtf8 > 0 );
+                       return ( $hasUtf8 > 0 );
                }
        }
 
@@ -233,7 +233,7 @@ class StringUtils {
 
                // Explode, then put the replaced separators back in
                $items = explode( $separator, $cleaned );
-               foreach( $items as $i => $str ) {
+               foreach ( $items as $i => $str ) {
                        $items[$i] = str_replace( $placeholder, $separator, $str );
                }
 
@@ -440,7 +440,7 @@ class ReplacementArray {
         * @param $data array
         */
        function removeArray( $data ) {
-               foreach( $data as $from => $to ) {
+               foreach ( $data as $from => $to ) {
                        $this->removePair( $from );
                }
                $this->fss = false;
@@ -452,16 +452,16 @@ class ReplacementArray {
         */
        function replace( $subject ) {
                if ( function_exists( 'fss_prep_replace' ) ) {
-                       wfProfileIn( __METHOD__.'-fss' );
+                       wfProfileIn( __METHOD__ . '-fss' );
                        if ( $this->fss === false ) {
                                $this->fss = fss_prep_replace( $this->data );
                        }
                        $result = fss_exec_replace( $this->fss, $subject );
-                       wfProfileOut( __METHOD__.'-fss' );
+                       wfProfileOut( __METHOD__ . '-fss' );
                } else {
-                       wfProfileIn( __METHOD__.'-strtr' );
+                       wfProfileIn( __METHOD__ . '-strtr' );
                        $result = strtr( $subject, $this->data );
-                       wfProfileOut( __METHOD__.'-strtr' );
+                       wfProfileOut( __METHOD__ . '-strtr' );
                }
                return $result;
        }
index f0a3574..59238fa 100644 (file)
@@ -60,7 +60,7 @@ class StubObject {
         * @return Boolean: true if $obj is not an instance of StubObject class.
         */
        static function isRealObject( $obj ) {
-               return is_object( $obj ) && !($obj instanceof StubObject);
+               return is_object( $obj ) && !$obj instanceof StubObject;
        }
 
        /**
@@ -113,7 +113,7 @@ class StubObject {
        function _unstub( $name = '_unstub', $level = 2 ) {
                static $recursionLevel = 0;
 
-               if ( !($GLOBALS[$this->mGlobal] instanceof StubObject) ) {
+               if ( !$GLOBALS[$this->mGlobal] instanceof StubObject ) {
                        return $GLOBALS[$this->mGlobal]; // already unstubbed.
                }
 
@@ -122,6 +122,7 @@ class StubObject {
                        wfProfileIn( $fname );
                        $caller = wfGetCaller( $level );
                        if ( ++$recursionLevel > 2 ) {
+                               wfProfileOut( $fname );
                                throw new MWException( "Unstub loop detected on call of \${$this->mGlobal}->$name from $caller\n" );
                        }
                        wfDebug( "Unstubbing \${$this->mGlobal} on call of \${$this->mGlobal}::$name from $caller\n" );
index 1cf99a7..5296122 100644 (file)
@@ -45,26 +45,10 @@ class MWTimestamp {
        );
 
        /**
-        * Different units for human readable timestamps.
-        * @see MWTimestamp::getHumanTimestamp
+        * The actual timestamp being wrapped (DateTime object).
+        * @var DateTime
         */
-       private static $units = array(
-               "milliseconds" => 1,
-               "seconds" => 1000, // 1000 milliseconds per second
-               "minutes" => 60, // 60 seconds per minute
-               "hours" => 60, // 60 minutes per hour
-               "days" => 24, // 24 hours per day
-               "months" => 30, // approximately 30 days per month
-               "years" => 12, // 12 months per year
-       );
-
-       /**
-        * The actual timestamp being wrapped. Either a DateTime
-        * object or a string with a Unix timestamp depending on
-        * PHP.
-        * @var string|DateTime
-        */
-       private $timestamp;
+       public $timestamp;
 
        /**
         * Make a new timestamp and set it to the specified time,
@@ -133,7 +117,7 @@ class MWTimestamp {
                        throw new TimestampException( __METHOD__ . " : Invalid timestamp - $ts" );
                }
 
-               if( !$strtime ) {
+               if ( !$strtime ) {
                        $da = array_map( 'intval', $da );
                        $da[0] = "%04d-%02d-%02dT%02d:%02d:%02d.00+00:00";
                        $strtime = call_user_func_array( "sprintf", $da );
@@ -141,11 +125,11 @@ class MWTimestamp {
 
                try {
                        $final = new DateTime( $strtime, new DateTimeZone( 'GMT' ) );
-               } catch(Exception $e) {
+               } catch ( Exception $e ) {
                        throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
                }
 
-               if( $final === false ) {
+               if ( $final === false ) {
                        throw new TimestampException( __METHOD__ . ' Invalid timestamp format.' );
                }
                $this->timestamp = $final;
@@ -164,20 +148,11 @@ class MWTimestamp {
         * @return string The formatted timestamp
         */
        public function getTimestamp( $style = TS_UNIX ) {
-               if( !isset( self::$formats[$style] ) ) {
+               if ( !isset( self::$formats[$style] ) ) {
                        throw new TimestampException( __METHOD__ . ' : Illegal timestamp output type.' );
                }
 
-               if( is_object( $this->timestamp  ) ) {
-                       // DateTime object was used, call DateTime::format.
-                       $output = $this->timestamp->format( self::$formats[$style] );
-               } elseif( TS_UNIX == $style ) {
-                       // Unix timestamp was used and is wanted, just return it.
-                       $output = $this->timestamp;
-               } else {
-                       // Unix timestamp was used, use gmdate().
-                       $output = gmdate( self::$formats[$style], $this->timestamp );
-               }
+               $output = $this->timestamp->format( self::$formats[$style] );
 
                if ( ( $style == TS_RFC2822 ) || ( $style == TS_POSTGRES ) ) {
                        $output .= ' GMT';
@@ -194,31 +169,105 @@ class MWTimestamp {
         * largest possible unit is used.
         *
         * @since 1.20
+        * @since 1.22 Uses Language::getHumanTimestamp to produce the timestamp
         *
-        * @return Message Formatted timestamp
+        * @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)
+        * @return string Formatted timestamp
         */
-       public function getHumanTimestamp() {
-               $then = $this->getTimestamp( TS_UNIX );
-               $now = time();
-               $timeago = ($now - $then) * 1000;
-               $message = false;
-
-               foreach( self::$units as $unit => $factor ) {
-                       $next = $timeago / $factor;
-                       if( $next < 1 ) {
-                               break;
+       public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
+               if ( $relativeTo === null ) {
+                       $relativeTo = new self();
+               }
+               if ( $user === null ) {
+                       $user = RequestContext::getMain()->getUser();
+               }
+               if ( $lang === null ) {
+                       $lang = RequestContext::getMain()->getLanguage();
+               }
+
+               // Adjust for the user's timezone.
+               $offsetThis = $this->offsetForUser( $user );
+               $offsetRel = $relativeTo->offsetForUser( $user );
+
+               $ts = '';
+               if ( wfRunHooks( 'GetHumanTimestamp', array( &$ts, $this, $relativeTo, $user, $lang ) ) ) {
+                       $ts = $lang->getHumanTimestamp( $this, $relativeTo, $user );
+               }
+
+               // Reset the timezone on the objects.
+               $this->timestamp->sub( $offsetThis );
+               $relativeTo->timestamp->sub( $offsetRel );
+
+               return $ts;
+       }
+
+       /**
+        * Adjust the timestamp depending on the given user's preferences.
+        *
+        * @since 1.22
+        *
+        * @param User $user User to take preferences from
+        * @param[out] MWTimestamp $ts Timestamp to adjust
+        * @return DateInterval Offset that was applied to the timestamp
+        */
+       public function offsetForUser( User $user ) {
+               global $wgLocalTZoffset;
+
+               $option = $user->getOption( 'timecorrection' );
+               $data = explode( '|', $option, 3 );
+
+               // First handle the case of an actual timezone being specified.
+               if ( $data[0] == 'ZoneInfo' ) {
+                       try {
+                               $tz = new DateTimeZone( $data[2] );
+                       } catch ( Exception $e ) {
+                               $tz = false;
+                       }
+
+                       if ( $tz ) {
+                               $this->timestamp->setTimezone( $tz );
+                               return new DateInterval( 'P0Y' );
                        } else {
-                               $timeago = $next;
-                               $message = array( $unit, floor( $timeago ) );
+                               $data[0] = 'Offset';
                        }
                }
 
-               if( $message ) {
-                       $initial = call_user_func_array( 'wfMessage', $message );
-                       return wfMessage( 'ago', $initial->parse() );
+               $diff = 0;
+               // If $option is in fact a pipe-separated value, check the
+               // first value.
+               if ( $data[0] == 'System' ) {
+                       // First value is System, so use the system offset.
+                       if ( isset( $wgLocalTZoffset ) ) {
+                               $diff = $wgLocalTZoffset;
+                       }
+               } elseif ( $data[0] == 'Offset' ) {
+                       // First value is Offset, so use the specified offset
+                       $diff = (int)$data[1];
                } else {
-                       return wfMessage( 'just-now' );
+                       // $option actually isn't a pipe separated value, but instead
+                       // a comma separated value. Isn't MediaWiki fun?
+                       $data = explode( ':', $option );
+                       if ( count( $data ) >= 2 ) {
+                               // Combination hours and minutes.
+                               $diff = abs( (int)$data[0] ) * 60 + (int)$data[1];
+                               if ( (int) $data[0] < 0 ) {
+                                       $diff *= -1;
+                               }
+                       } else {
+                               // Just hours.
+                               $diff = (int)$data[0] * 60;
+                       }
                }
+
+               $interval = new DateInterval( 'PT' . abs( $diff ) . 'M' );
+               if ( $diff < 1 ) {
+                       $interval->invert = 1;
+               }
+
+               $this->timestamp->add( $interval );
+               return $interval;
        }
 
        /**
@@ -229,6 +278,17 @@ class MWTimestamp {
        public function __toString() {
                return $this->getTimestamp();
        }
+
+       /**
+        * Calculate the difference between two MWTimestamp objects.
+        *
+        * @since 1.22
+        * @param MWTimestamp $relativeTo Base time to calculate difference from
+        * @return DateInterval|bool The DateInterval object representing the difference between the two dates or false on failure
+        */
+       public function diff( MWTimestamp $relativeTo ) {
+               return $this->timestamp->diff( $relativeTo->timestamp );
+       }
 }
 
 /**
index e81023a..a543126 100644 (file)
@@ -225,7 +225,7 @@ class Title {
         *
         * @param int $id the page_id corresponding to the Title to create
         * @param int $flags use Title::GAID_FOR_UPDATE to use master
-        * @return Title the new object, or NULL on an error
+        * @return Title|null the new object, or NULL on an error
         */
        public static function newFromID( $id, $flags = 0 ) {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
@@ -289,18 +289,23 @@ class Title {
         */
        public function loadFromRow( $row ) {
                if ( $row ) { // page found
-                       if ( isset( $row->page_id ) )
+                       if ( isset( $row->page_id ) ) {
                                $this->mArticleID = (int)$row->page_id;
-                       if ( isset( $row->page_len ) )
+                       }
+                       if ( isset( $row->page_len ) ) {
                                $this->mLength = (int)$row->page_len;
-                       if ( isset( $row->page_is_redirect ) )
+                       }
+                       if ( isset( $row->page_is_redirect ) ) {
                                $this->mRedirect = (bool)$row->page_is_redirect;
-                       if ( isset( $row->page_latest ) )
+                       }
+                       if ( isset( $row->page_latest ) ) {
                                $this->mLatestID = (int)$row->page_latest;
-                       if ( isset( $row->page_content_model ) )
+                       }
+                       if ( isset( $row->page_content_model ) ) {
                                $this->mContentModel = strval( $row->page_content_model );
-                       else
+                       } else {
                                $this->mContentModel = false; # initialized lazily in getContentModel()
+                       }
                } else { // page not found
                        $this->mArticleID = 0;
                        $this->mLength = 0;
@@ -575,10 +580,12 @@ class Title {
         */
        public function isLocal() {
                if ( $this->mInterwiki != '' ) {
-                       return Interwiki::fetch( $this->mInterwiki )->isLocal();
-               } else {
-                       return true;
+                       $iw = Interwiki::fetch( $this->mInterwiki );
+                       if ( $iw ) {
+                               return $iw->isLocal();
+                       }
                }
+               return true;
        }
 
        /**
@@ -680,7 +687,6 @@ class Title {
        public function getContentModel() {
                if ( !$this->mContentModel ) {
                        $linkCache = LinkCache::singleton();
-                       $linkCache->addLinkObj( $this );
                        $this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' );
                }
 
@@ -688,7 +694,7 @@ class Title {
                        $this->mContentModel = ContentHandler::getDefaultModelFor( $this );
                }
 
-               if( !$this->mContentModel ) {
+               if ( !$this->mContentModel ) {
                        throw new MWException( 'Failed to determine content model!' );
                }
 
@@ -751,7 +757,7 @@ class Title {
         */
        public function getTalkNsText() {
                global $wgContLang;
-               return( $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) ) );
+               return $wgContLang->getNsText( MWNamespace::getTalk( $this->mNamespace ) );
        }
 
        /**
@@ -760,7 +766,7 @@ class Title {
         * @return Bool TRUE or FALSE
         */
        public function canTalk() {
-               return( MWNamespace::canTalk( $this->mNamespace ) );
+               return MWNamespace::canTalk( $this->mNamespace );
        }
 
        /**
@@ -938,7 +944,7 @@ class Title {
         * @return Bool
         */
        public function isConversionTable() {
-               //@todo: ConversionTable should become a separate content model.
+               // @todo ConversionTable should become a separate content model.
 
                return $this->getNamespace() == NS_MEDIAWIKI &&
                        strpos( $this->getText(), 'Conversiontable/' ) === 0;
@@ -994,10 +1000,11 @@ class Title {
         */
        public function getSkinFromCssJsSubpage() {
                $subpage = explode( '/', $this->mTextform );
-               $subpage = $subpage[ count( $subpage ) - 1 ];
+               $subpage = $subpage[count( $subpage ) - 1];
                $lastdot = strrpos( $subpage, '.' );
-               if ( $lastdot === false )
+               if ( $lastdot === false ) {
                        return $subpage; # Never happens: only called for names ending in '.css' or '.js'
+               }
                return substr( $subpage, 0, $lastdot );
        }
 
@@ -1268,10 +1275,10 @@ class Title {
         */
        public function getSubpageText() {
                if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
-                       return( $this->mTextform );
+                       return $this->mTextform;
                }
                $parts = explode( '/', $this->mTextform );
-               return( $parts[count( $parts ) - 1] );
+               return $parts[count( $parts ) - 1];
        }
 
        /**
@@ -1311,7 +1318,7 @@ class Title {
        public function getSubpageUrlForm() {
                $text = $this->getSubpageText();
                $text = wfUrlencode( str_replace( ' ', '_', $text ) );
-               return( $text );
+               return $text;
        }
 
        /**
@@ -1326,8 +1333,8 @@ class Title {
        }
 
        /**
-        * Helper to fix up the get{Local,Full,Link,Canonical}URL args
-        * get{Canonical,Full,Link,Local}URL methods accepted an optional
+        * Helper to fix up the get{Canonical,Full,Link,Local,Internal}URL args
+        * get{Canonical,Full,Link,Local,Internal}URL methods accepted an optional
         * second argument named variant. This was deprecated in favor
         * of passing an array of option with a "variant" key
         * Once $query2 is removed for good, this helper can be dropped
@@ -1339,8 +1346,10 @@ class Title {
         * @return String
         */
        private static function fixUrlQueryArgs( $query, $query2 = false ) {
-               if( $query2 !== false ) {
-                       wfDeprecated( "Title::get{Canonical,Full,Link,Local} method called with a second parameter is deprecated. Add your parameter to an array passed as the first parameter.", "1.19" );
+               if ( $query2 !== false ) {
+                       wfDeprecated( "Title::get{Canonical,Full,Link,Local,Internal}URL " .
+                               "method called with a second parameter is deprecated. Add your " .
+                               "parameter to an array passed as the first parameter.", "1.19" );
                }
                if ( is_array( $query ) ) {
                        $query = wfArrayToCgi( $query );
@@ -1398,7 +1407,6 @@ class Title {
         * Get a URL with no fragment or server name.  If this page is generated
         * with action=render, $wgServer is prepended.
         *
-
         * @param string|array $query an optional query string,
         *   not used for interwiki links. Can be specified as an associative array as well,
         *   e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
@@ -1731,6 +1739,10 @@ class Title {
         * @return Array list of errors
         */
        private function checkQuickPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+               if ( !wfRunHooks( 'TitleQuickPermissions', array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) ) ) {
+                       return $errors;
+               }
+
                if ( $action == 'create' ) {
                        if (
                                ( $this->isTalkPage() && !$user->isAllowed( 'createtalk' ) ) ||
@@ -1952,8 +1964,9 @@ class Title {
                                        $right = ( $right == 'sysop' ) ? 'protect' : $right;
                                        if ( $right != '' && !$user->isAllowed( $right ) ) {
                                                $pages = '';
-                                               foreach ( $cascadingSources as $page )
+                                               foreach ( $cascadingSources as $page ) {
                                                        $pages .= '* [[:' . $page->getPrefixedText() . "]]\n";
+                                               }
                                                $errors[] = array( 'cascadeprotected', count( $cascadingSources ), $pages );
                                        }
                                }
@@ -1984,11 +1997,11 @@ class Title {
                        }
                } elseif ( $action == 'create' ) {
                        $title_protection = $this->getTitleProtection();
-                       if( $title_protection ) {
-                               if( $title_protection['pt_create_perm'] == 'sysop' ) {
+                       if ( $title_protection ) {
+                               if ( $title_protection['pt_create_perm'] == 'sysop' ) {
                                        $title_protection['pt_create_perm'] = 'protect'; // B/C
                                }
-                               if( $title_protection['pt_create_perm'] == '' ||
+                               if ( $title_protection['pt_create_perm'] == '' ||
                                        !$user->isAllowed( $title_protection['pt_create_perm'] ) )
                                {
                                        $errors[] = array( 'titleprotected', User::whoIs( $title_protection['pt_user'] ), $title_protection['pt_reason'] );
@@ -2033,11 +2046,11 @@ class Title {
        private function checkUserBlock( $action, $user, $errors, $doExpensiveQueries, $short ) {
                // Account creation blocks handled at userlogin.
                // Unblocking handled in SpecialUnblock
-               if( !$doExpensiveQueries || in_array( $action, array( 'createaccount', 'unblock' ) ) ) {
+               if ( !$doExpensiveQueries || in_array( $action, array( 'createaccount', 'unblock' ) ) ) {
                        return $errors;
                }
 
-               global $wgContLang, $wgLang, $wgEmailConfirmToEdit;
+               global $wgEmailConfirmToEdit;
 
                if ( $wgEmailConfirmToEdit && !$user->isEmailConfirmed() ) {
                        $errors[] = array( 'confirmedittext' );
@@ -2046,39 +2059,9 @@ class Title {
                if ( ( $action == 'edit' || $action == 'create' ) && !$user->isBlockedFrom( $this ) ) {
                        // Don't block the user from editing their own talk page unless they've been
                        // explicitly blocked from that too.
-               } elseif( $user->isBlocked() && $user->mBlock->prevents( $action ) !== false ) {
-                       $block = $user->getBlock();
-
-                       // This is from OutputPage::blockedPage
-                       // Copied at r23888 by werdna
-
-                       $id = $user->blockedBy();
-                       $reason = $user->blockedFor();
-                       if ( $reason == '' ) {
-                               $reason = wfMessage( 'blockednoreason' )->text();
-                       }
-                       $ip = $user->getRequest()->getIP();
-
-                       if ( is_numeric( $id ) ) {
-                               $name = User::whoIs( $id );
-                       } else {
-                               $name = $id;
-                       }
-
-                       $link = '[[' . $wgContLang->getNsText( NS_USER ) . ":{$name}|{$name}]]";
-                       $blockid = $block->getId();
-                       $blockExpiry = $block->getExpiry();
-                       $blockTimestamp = $wgLang->timeanddate( wfTimestamp( TS_MW, $block->mTimestamp ), true );
-                       if ( $blockExpiry == 'infinity' ) {
-                               $blockExpiry = wfMessage( 'infiniteblock' )->text();
-                       } else {
-                               $blockExpiry = $wgLang->timeanddate( wfTimestamp( TS_MW, $blockExpiry ), true );
-                       }
-
-                       $intended = strval( $block->getTarget() );
-
-                       $errors[] = array( ( $block->mAuto ? 'autoblockedtext' : 'blockedtext' ), $link, $reason, $ip, $name,
-                               $blockid, $blockExpiry, $intended, $blockTimestamp );
+               } elseif ( $user->isBlocked() && $user->mBlock->prevents( $action ) !== false ) {
+                       // @todo FIXME: Pass the relevant context into this function.
+                       $errors[] = $user->getBlock()->getPermissionsError( RequestContext::getMain() );
                }
 
                return $errors;
@@ -2164,7 +2147,7 @@ class Title {
                        }
                }
 
-               if( !$whitelisted && is_array( $wgWhitelistReadRegexp ) && !empty( $wgWhitelistReadRegexp ) ) {
+               if ( !$whitelisted && is_array( $wgWhitelistReadRegexp ) && !empty( $wgWhitelistReadRegexp ) ) {
                        $name = $this->getPrefixedText();
                        // Check for regex whitelisting
                        foreach ( $wgWhitelistReadRegexp as $listItem ) {
@@ -2249,7 +2232,7 @@ class Title {
                }
 
                $errors = array();
-               while( count( $checks ) > 0 &&
+               while ( count( $checks ) > 0 &&
                                !( $short && count( $errors ) > 0 ) ) {
                        $method = array_shift( $checks );
                        $errors = $this->$method( $action, $user, $errors, $doExpensiveQueries, $short );
@@ -2263,7 +2246,7 @@ class Title {
         * Protect css subpages of user pages: can $wgUser edit
         * this page?
         *
-        * @deprecated in 1.19; will be removed in 1.20. Use getUserPermissionsErrors() instead.
+        * @deprecated in 1.19; use getUserPermissionsErrors() instead.
         * @return Bool
         */
        public function userCanEditCssSubpage() {
@@ -2277,7 +2260,7 @@ class Title {
         * Protect js subpages of user pages: can $wgUser edit
         * this page?
         *
-        * @deprecated in 1.19; will be removed in 1.20. Use getUserPermissionsErrors() instead.
+        * @deprecated in 1.19; use getUserPermissionsErrors() instead.
         * @return Bool
         */
        public function userCanEditJsSubpage() {
@@ -2370,7 +2353,7 @@ class Title {
        /**
         * Update the title protection status
         *
-        * @deprecated in 1.19; will be removed in 1.20. Use WikiPage::doUpdateRestrictions() instead.
+        * @deprecated in 1.19; use WikiPage::doUpdateRestrictions() instead.
         * @param $create_perm String Permission required for creation
         * @param string $reason Reason for protection
         * @param string $expiry Expiry timestamp
@@ -2444,7 +2427,7 @@ class Title {
                $restrictionTypes = $this->getRestrictionTypes();
 
                # Special pages have inherent protection
-               if( $this->isSpecialPage() ) {
+               if ( $this->isSpecialPage() ) {
                        return true;
                }
 
@@ -2691,7 +2674,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 );
                                        }
                                }
@@ -2710,8 +2693,9 @@ class Title {
                        foreach ( $rows as $row ) {
 
                                // Don't take care of restrictions types that aren't allowed
-                               if ( !in_array( $row->pr_type, $restrictionTypes ) )
+                               if ( !in_array( $row->pr_type, $restrictionTypes ) ) {
                                        continue;
+                               }
 
                                // This code should be refactored, now that it's being used more generally,
                                // But I don't really see any harm in leaving it in Block for now -werdna
@@ -2797,18 +2781,20 @@ class Title {
                        return;
                }
 
+               $method = __METHOD__;
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete(
-                       'page_restrictions',
-                       array( 'pr_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
-                       __METHOD__
-               );
-
-               $dbw->delete(
-                       'protected_titles',
-                       array( 'pt_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
-                       __METHOD__
-               );
+               $dbw->onTransactionIdle( function() use ( $dbw, $method ) {
+                       $dbw->delete(
+                               'page_restrictions',
+                               array( 'pr_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
+                               $method
+                       );
+                       $dbw->delete(
+                               'protected_titles',
+                               array( 'pt_expiry < ' . $dbw->addQuotes( $dbw->timestamp() ) ),
+                               $method
+                       );
+               } );
        }
 
        /**
@@ -2948,21 +2934,22 @@ class Title {
         * @return Bool
         */
        public function isRedirect( $flags = 0 ) {
-               if ( !( $flags & Title::GAID_FOR_UPDATE ) && !is_null( $this->mRedirect ) ) {
+               if ( !is_null( $this->mRedirect ) ) {
                        return $this->mRedirect;
                }
-
+               # Calling getArticleID() loads the field from cache as needed
                if ( !$this->getArticleID( $flags ) ) {
                        return $this->mRedirect = false;
                }
 
                $linkCache = LinkCache::singleton();
-               $linkCache->addLinkObj( $this );
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
-
                if ( $cached === null ) {
-                       // Should not happen
-                       throw new MWException( "LinkCache doesn't know redirect status of this title: " . $this->getPrefixedDBkey() );
+                       // TODO: check the assumption that the cache actually knows about this title
+                       // and handle this, such as get the title from the database.
+                       // See https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
+                       wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+                       wfDebug( wfBacktrace() );
                }
 
                $this->mRedirect = (bool)$cached;
@@ -2978,21 +2965,20 @@ class Title {
         * @return Int
         */
        public function getLength( $flags = 0 ) {
-               if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLength != -1 ) {
+               if ( $this->mLength != -1 ) {
                        return $this->mLength;
                }
-
+               # Calling getArticleID() loads the field from cache as needed
                if ( !$this->getArticleID( $flags ) ) {
                        return $this->mLength = 0;
                }
-
                $linkCache = LinkCache::singleton();
-               $linkCache->addLinkObj( $this );
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
-
-               if ( $cached === null ) {
-                       // Should not happen
-                       throw new MWException( "LinkCache doesn't know redirect status of this title: " . $this->getPrefixedDBkey() );
+               if ( $cached === null ) { # check the assumption that the cache actually knows about this title
+                       # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
+                       #      as a stop gap, perhaps log this, but don't throw an exception?
+                       wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+                       wfDebug( wfBacktrace() );
                }
 
                $this->mLength = intval( $cached );
@@ -3011,18 +2997,17 @@ class Title {
                if ( !( $flags & Title::GAID_FOR_UPDATE ) && $this->mLatestID !== false ) {
                        return intval( $this->mLatestID );
                }
-
+               # Calling getArticleID() loads the field from cache as needed
                if ( !$this->getArticleID( $flags ) ) {
                        return $this->mLatestID = 0;
                }
-
                $linkCache = LinkCache::singleton();
                $linkCache->addLinkObj( $this );
                $cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
-
-               if ( $cached === null ) {
-                       // Should not happen
-                       throw new MWException( "LinkCache doesn't know latest revision ID of this title: " . $this->getPrefixedDBkey() );
+               if ( $cached === null ) { # check the assumption that the cache actually knows about this title
+                       # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
+                       #      as a stop gap, perhaps log this, but don't throw an exception?
+                       throw new MWException( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
                }
 
                $this->mLatestID = intval( $cached );
@@ -3301,7 +3286,7 @@ class Title {
                        array(
                                "{$prefix}_from=page_id",
                                "{$prefix}_namespace" => $this->getNamespace(),
-                               "{$prefix}_title"     => $this->getDBkey() ),
+                               "{$prefix}_title" => $this->getDBkey() ),
                        __METHOD__,
                        $options
                );
@@ -3366,7 +3351,9 @@ class Title {
                $titleField = "{$prefix}_title";
 
                $fields = array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
-               if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'page_content_model';
+               }
 
                $res = $db->select(
                        array( $table, 'page' ),
@@ -3465,6 +3452,7 @@ class Title {
                        }
                }
 
+               wfRunHooks( 'TitleSquidURLs', array( $this, &$urls ) );
                return $urls;
        }
 
@@ -3711,12 +3699,12 @@ class Title {
                        # Protect the redirect title as the title used to be...
                        $dbw->insertSelect( 'page_restrictions', 'page_restrictions',
                                array(
-                                       'pr_page'    => $redirid,
-                                       'pr_type'    => 'pr_type',
-                                       'pr_level'   => 'pr_level',
+                                       'pr_page' => $redirid,
+                                       'pr_type' => 'pr_type',
+                                       'pr_level' => 'pr_level',
                                        'pr_cascade' => 'pr_cascade',
-                                       'pr_user'    => 'pr_user',
-                                       'pr_expiry'  => 'pr_expiry'
+                                       'pr_user' => 'pr_user',
+                                       'pr_expiry' => 'pr_expiry'
                                ),
                                array( 'pr_page' => $pageid ),
                                __METHOD__,
@@ -3830,7 +3818,7 @@ class Title {
                $dbw->update( 'page',
                        /* SET */ array(
                                'page_namespace' => $nt->getNamespace(),
-                               'page_title'     => $nt->getDBkey(),
+                               'page_title' => $nt->getDBkey(),
                        ),
                        /* WHERE */ array( 'page_id' => $oldid ),
                        __METHOD__
@@ -3838,6 +3826,7 @@ class Title {
 
                $this->resetArticleID( 0 );
                $nt->resetArticleID( $oldid );
+               $newpage->loadPageData( WikiPage::READ_LOCKING ); // bug 46397
 
                $newpage->updateRevisionOn( $dbw, $nullRevision );
 
@@ -3855,13 +3844,14 @@ class Title {
                        WikiPage::onArticleDelete( $this );
                } else {
                        $redirectArticle = WikiPage::factory( $this );
+                       $redirectArticle->loadFromRow( false, WikiPage::READ_LOCKING ); // bug 46397
                        $newid = $redirectArticle->insertOn( $dbw );
                        if ( $newid ) { // sanity
                                $redirectRevision = new Revision( array(
-                                       'title'   => $this, // for determining the default content model
-                                       'page'    => $newid,
+                                       'title' => $this, // for determining the default content model
+                                       'page' => $newid,
                                        'comment' => $comment,
-                                       'content'    => $redirectContent ) );
+                                       'content' => $redirectContent ) );
                                $redirectRevision->insertOn( $dbw );
                                $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
 
@@ -3963,7 +3953,9 @@ class Title {
 
                # Is it a redirect?
                $fields = array( 'page_is_redirect', 'page_latest', 'page_id' );
-               if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'page_content_model';
+               }
 
                $row = $dbw->selectRow( 'page',
                        $fields,
@@ -4017,7 +4009,7 @@ class Title {
                }
                # Get the article text
                $rev = Revision::newFromTitle( $nt, false, Revision::READ_LATEST );
-               if( !is_object( $rev ) ) {
+               if ( !is_object( $rev ) ) {
                        return false;
                }
                $content = $rev->getContent();
@@ -4070,8 +4062,8 @@ class Title {
 
                if ( $res->numRows() > 0 ) {
                        foreach ( $res as $row ) {
-                               // $data[] = Title::newFromText($wgContLang->getNSText ( NS_CATEGORY ).':'.$row->cl_to);
-                               $data[$wgContLang->getNSText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
+                               // $data[] = Title::newFromText($wgContLang->getNsText ( NS_CATEGORY ).':'.$row->cl_to);
+                               $data[$wgContLang->getNsText( NS_CATEGORY ) . ':' . $row->cl_to] = $this->getFullText();
                        }
                }
                return $data;
@@ -4319,7 +4311,7 @@ class Title {
                // No DB query needed if $old and $new are the same or successive revisions:
                if ( $old->getId() === $new->getId() ) {
                        return ( $old_cmp === '>' && $new_cmp === '<' ) ? 0 : 1;
-               } else if ( $old->getId() === $new->getParentId() ) {
+               } elseif ( $old->getId() === $new->getParentId() ) {
                        if ( $old_cmp === '>' || $new_cmp === '<' ) {
                                return ( $old_cmp === '>' && $new_cmp === '<' ) ? 0 : 1;
                        }
@@ -4414,7 +4406,7 @@ class Title {
                        return true;  // any interwiki link might be viewable, for all we know
                }
 
-               switch( $this->mNamespace ) {
+               switch ( $this->mNamespace ) {
                        case NS_MEDIA:
                        case NS_FILE:
                                // file exists, possibly in a foreign repo
@@ -4500,27 +4492,23 @@ class Title {
         * @return Bool true if the update succeeded
         */
        public function invalidateCache() {
-               global $wgMemc;
                if ( wfReadOnly() ) {
                        return false;
                }
-               $dbw = wfGetDB( DB_MASTER );
-               $success = $dbw->update(
-                       'page',
-                       array( 'page_touched' => $dbw->timestamp() ),
-                       $this->pageCond(),
-                       __METHOD__
-               );
-               HTMLFileCache::clearFileCache( $this );
 
-               // Clear page info.
-               $revision = WikiPage::factory( $this )->getRevision();
-               if( $revision !== null ) {
-                       $memcKey = wfMemcKey( 'infoaction', $this->getPrefixedText(), $revision->getId() );
-                       $success = $success && $wgMemc->delete( $memcKey );
-               }
+               $method = __METHOD__;
+               $dbw = wfGetDB( DB_MASTER );
+               $conds = $this->pageCond();
+               $dbw->onTransactionIdle( function() use ( $dbw, $conds, $method ) {
+                       $dbw->update(
+                               'page',
+                               array( 'page_touched' => $dbw->timestamp() ),
+                               $conds,
+                               $method
+                       );
+               } );
 
-               return $success;
+               return true;
        }
 
        /**
index b042d8c..20ec302 100644 (file)
@@ -304,7 +304,7 @@ class UIDGenerator {
                        if ( $ct >= $time ) { // http://php.net/manual/en/language.operators.comparison.php
                                return $ct; // current timestamp is higher than $time
                        }
-               } while ( ( ( $time[0] - $ct[0] )*1000 + ( $time[1] - $ct[1] ) ) <= 10 );
+               } while ( ( ( $time[0] - $ct[0] ) * 1000 + ( $time[1] - $ct[1] ) ) <= 10 );
 
                return false;
        }
@@ -315,25 +315,12 @@ class UIDGenerator {
         */
        protected function millisecondsSinceEpochBinary( array $time ) {
                list( $sec, $msec ) = $time;
-               if ( PHP_INT_SIZE >= 8 ) { // 64 bit integers
-                       $ts = ( 1000 * $sec + $msec );
-                       $id_bin = str_pad( decbin( $ts % pow( 2, 46 ) ), 46, '0', STR_PAD_LEFT );
-               } elseif ( extension_loaded( 'gmp' ) ) {
-                       $ts = gmp_mod( // wrap around
-                               gmp_add( gmp_mul( (string) $sec, (string) 1000 ), (string) $msec ),
-                               gmp_pow( '2', '46' )
-                       );
-                       $id_bin = str_pad( gmp_strval( $ts, 2 ), 46, '0', STR_PAD_LEFT );
-               } elseif ( extension_loaded( 'bcmath' ) ) {
-                       $ts = bcmod( // wrap around
-                               bcadd( bcmul( $sec, 1000 ), $msec ),
-                               bcpow( 2, 46 )
-                       );
-                       $id_bin = wfBaseConvert( $ts, 10, 2, 46 );
-               } else {
-                       throw new MWException( 'bcmath or gmp extension required for 32 bit machines.' );
+               $ts = 1000 * $sec + $msec;
+               if ( $ts > pow( 2, 52 ) ) {
+                       throw new MWException( __METHOD__ .
+                               ': sorry, this function doesn\'t work after the year 144680' );
                }
-               return $id_bin;
+               return substr( wfBaseConvert( $ts, 10, 2, 46 ), -46 );
        }
 
        /**
index 6b7348a..699ea67 100644 (file)
@@ -251,7 +251,7 @@ class User {
        }
 
        /**
-        * @return String
+        * @return string
         */
        function __toString() {
                return $this->getName();
@@ -266,7 +266,7 @@ class User {
                }
                wfProfileIn( __METHOD__ );
 
-               # Set it now to avoid infinite recursion in accessors
+               // Set it now to avoid infinite recursion in accessors
                $this->mLoadedItems = true;
 
                switch ( $this->mFrom ) {
@@ -276,7 +276,7 @@ class User {
                        case 'name':
                                $this->mId = self::idFromName( $this->mName );
                                if ( !$this->mId ) {
-                                       # Nonexistent user placeholder object
+                                       // Nonexistent user placeholder object
                                        $this->loadDefaults( $this->mName );
                                } else {
                                        $this->loadFromId();
@@ -286,7 +286,7 @@ class User {
                                $this->loadFromId();
                                break;
                        case 'session':
-                               if( !$this->loadFromSession() ) {
+                               if ( !$this->loadFromSession() ) {
                                        // Loading from session failed. Load defaults.
                                        $this->loadDefaults();
                                }
@@ -301,7 +301,7 @@ class User {
 
        /**
         * Load user table data, given mId has already been set.
-        * @return Bool false if the ID does not exist, true otherwise
+        * @return bool false if the ID does not exist, true otherwise
         */
        public function loadFromId() {
                global $wgMemc;
@@ -310,25 +310,25 @@ class User {
                        return false;
                }
 
-               # Try cache
+               // Try cache
                $key = wfMemcKey( 'user', 'id', $this->mId );
                $data = $wgMemc->get( $key );
                if ( !is_array( $data ) || $data['mVersion'] < MW_USER_VERSION ) {
-                       # Object is expired, load from DB
+                       // Object is expired, load from DB
                        $data = false;
                }
 
                if ( !$data ) {
                        wfDebug( "User: cache miss for user {$this->mId}\n" );
-                       # Load from DB
+                       // Load from DB
                        if ( !$this->loadFromDatabase() ) {
-                               # Can't load from ID, user is anonymous
+                               // Can't load from ID, user is anonymous
                                return false;
                        }
                        $this->saveToCache();
                } else {
                        wfDebug( "User: got user {$this->mId} from cache\n" );
-                       # Restore from cache
+                       // Restore from cache
                        foreach ( self::$mCacheVars as $name ) {
                                $this->$name = $data[$name];
                        }
@@ -370,14 +370,14 @@ class User {
         * you have both an ID and a name handy.
         *
         * @param string $name Username, validated by Title::newFromText()
-        * @param string|Bool $validate Validate username. Takes the same parameters as
-        *    User::getCanonicalName(), except that true is accepted as an alias
-        *    for 'valid', for BC.
+        * @param string|bool $validate Validate username. Takes the same parameters as
+        *  User::getCanonicalName(), except that true is accepted as an alias
+        *  for 'valid', for BC.
         *
         * @return User|bool User object, or false if the username is invalid
-        *    (e.g. if it contains illegal characters or is an IP address). If the
-        *    username is not present in the database, the result will be a user object
-        *    with a name, zero user ID and default settings.
+        *  (e.g. if it contains illegal characters or is an IP address). If the
+        *  username is not present in the database, the result will be a user object
+        *  with a name, zero user ID and default settings.
         */
        public static function newFromName( $name, $validate = 'valid' ) {
                if ( $validate === true ) {
@@ -387,7 +387,7 @@ class User {
                if ( $name === false ) {
                        return false;
                } else {
-                       # Create unloaded user object
+                       // Create unloaded user object
                        $u = new User;
                        $u->mName = $name;
                        $u->mFrom = 'name';
@@ -418,7 +418,7 @@ class User {
         * If the code is invalid or has expired, returns NULL.
         *
         * @param string $code Confirmation code
-        * @return User object, or null
+        * @return User|null
         */
        public static function newFromConfirmationCode( $code ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -426,7 +426,7 @@ class User {
                        'user_email_token' => md5( $code ),
                        'user_email_token_expires > ' . $dbr->addQuotes( $dbr->timestamp() ),
                        ) );
-               if( $id !== false ) {
+               if ( $id !== false ) {
                        return User::newFromId( $id );
                } else {
                        return null;
@@ -437,7 +437,7 @@ class User {
         * Create a new user object using data from session or cookies. If the
         * login credentials are invalid, the result is an anonymous user.
         *
-        * @param $request WebRequest object to use; $wgRequest will be used if omitted.
+        * @param WebRequest $request Object to use; $wgRequest will be used if omitted.
         * @return User object
         */
        public static function newFromSession( WebRequest $request = null ) {
@@ -472,7 +472,7 @@ class User {
        /**
         * Get the username corresponding to a given user ID
         * @param int $id User ID
-        * @return String|bool The corresponding username
+        * @return string|bool The corresponding username
         */
        public static function whoIs( $id ) {
                return UserCache::singleton()->getProp( $id, 'name' );
@@ -482,7 +482,7 @@ class User {
         * Get the real name of a user given their user ID
         *
         * @param int $id User ID
-        * @return String|bool The corresponding user's real name
+        * @return string|bool The corresponding user's real name
         */
        public static function whoIsReal( $id ) {
                return UserCache::singleton()->getProp( $id, 'real_name' );
@@ -491,12 +491,12 @@ class User {
        /**
         * Get database id given a user name
         * @param string $name Username
-        * @return Int|Null The corresponding user's ID, or null if user is nonexistent
+        * @return int|null The corresponding user's ID, or null if user is nonexistent
         */
        public static function idFromName( $name ) {
                $nt = Title::makeTitleSafe( NS_USER, $name );
-               if( is_null( $nt ) ) {
-                       # Illegal name
+               if ( is_null( $nt ) ) {
+                       // Illegal name
                        return null;
                }
 
@@ -542,8 +542,8 @@ class User {
         * addresses like this, if we allowed accounts like this to be created
         * new users could get the old edits of these anonymous users.
         *
-        * @param string $name to match
-        * @return Bool
+        * @param string $name Name to match
+        * @return bool
         */
        public static function isIP( $name ) {
                return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name ) || IP::isIPv6( $name );
@@ -557,8 +557,8 @@ class User {
         * is longer than the maximum allowed username size or doesn't begin with
         * a capital letter.
         *
-        * @param string $name to match
-        * @return Bool
+        * @param string $name Name to match
+        * @return bool
         */
        public static function isValidUserName( $name ) {
                global $wgContLang, $wgMaxNameChars;
@@ -576,7 +576,7 @@ class User {
                // Ensure that the name can't be misresolved as a different title,
                // such as with extra namespace keys at the start.
                $parsed = Title::newFromText( $name );
-               if( is_null( $parsed )
+               if ( is_null( $parsed )
                        || $parsed->getNamespace()
                        || strcmp( $name, $parsed->getPrefixedText() ) ) {
                        wfDebugLog( 'username', __METHOD__ .
@@ -594,7 +594,7 @@ class User {
                        '\x{3000}' .          # ideographic space
                        '\x{e000}-\x{f8ff}' . # private use
                        ']/u';
-               if( preg_match( $unicodeBlacklist, $name ) ) {
+               if ( preg_match( $unicodeBlacklist, $name ) ) {
                        wfDebugLog( 'username', __METHOD__ .
                                ": '$name' invalid due to blacklisted characters" );
                        return false;
@@ -611,8 +611,8 @@ class User {
         * If an account already exists in this form, login will be blocked
         * by a failure to pass this function.
         *
-        * @param string $name to match
-        * @return Bool
+        * @param string $name Name to match
+        * @return bool
         */
        public static function isUsableName( $name ) {
                global $wgReservedUsernames;
@@ -649,7 +649,7 @@ class User {
         * isValidUserName() to avoid disrupting existing accounts.
         *
         * @param string $name to match
-        * @return Bool
+        * @return bool
         */
        public static function isCreatableName( $name ) {
                global $wgInvalidUsernameCharacters;
@@ -657,15 +657,15 @@ class User {
                // Ensure that the username isn't longer than 235 bytes, so that
                // (at least for the builtin skins) user javascript and css files
                // will work. (bug 23080)
-               if( strlen( $name ) > 235 ) {
+               if ( strlen( $name ) > 235 ) {
                        wfDebugLog( 'username', __METHOD__ .
                                ": '$name' invalid due to length" );
                        return false;
                }
 
                // Preg yells if you try to give it an empty string
-               if( $wgInvalidUsernameCharacters !== '' ) {
-                       if( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
+               if ( $wgInvalidUsernameCharacters !== '' ) {
+                       if ( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
                                wfDebugLog( 'username', __METHOD__ .
                                        ": '$name' invalid due to wgInvalidUsernameCharacters" );
                                return false;
@@ -679,7 +679,7 @@ class User {
         * Is the input a valid password for this user?
         *
         * @param string $password Desired password
-        * @return Bool
+        * @return bool
         */
        public function isValidPassword( $password ) {
                //simple boolean wrapper for getPasswordValidity
@@ -702,15 +702,16 @@ class User {
 
                $result = false; //init $result to false for the internal checks
 
-               if( !wfRunHooks( 'isValidPassword', array( $password, &$result, $this ) ) )
+               if ( !wfRunHooks( 'isValidPassword', array( $password, &$result, $this ) ) ) {
                        return $result;
+               }
 
                if ( $result === false ) {
-                       if( strlen( $password ) < $wgMinimalPasswordLength ) {
+                       if ( strlen( $password ) < $wgMinimalPasswordLength ) {
                                return 'passwordtooshort';
                        } elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) {
                                return 'password-name-match';
-                       } elseif ( isset( $blockedLogins[ $this->getName() ] ) && $password == $blockedLogins[ $this->getName() ] ) {
+                       } elseif ( isset( $blockedLogins[$this->getName()] ) && $password == $blockedLogins[$this->getName()] ) {
                                return 'password-login-forbidden';
                        } else {
                                //it seems weird returning true here, but this is because of the
@@ -719,7 +720,7 @@ class User {
                                //a valid password.
                                return true;
                        }
-               } elseif( $result === true ) {
+               } elseif ( $result === true ) {
                        return true;
                } else {
                        return $result; //the isValidPassword hook set a string $result and returned true
@@ -750,7 +751,7 @@ class User {
         * pass validation here.
         *
         * @param string $addr E-mail address
-        * @return Bool
+        * @return bool
         * @deprecated since 1.18 call Sanitizer::isValidEmail() directly
         */
        public static function isValidEmailAddr( $addr ) {
@@ -762,7 +763,7 @@ class User {
         * Given unvalidated user input, return a canonical username, or false if
         * the username is invalid.
         * @param string $name User input
-        * @param string|Bool $validate type of validation to use:
+        * @param string|bool $validate type of validation to use:
         *                - false        No validation
         *                - 'valid'      Valid for batch processes
         *                - 'usable'     Valid for batch processes and login
@@ -772,25 +773,26 @@ class User {
         * @return bool|string
         */
        public static function getCanonicalName( $name, $validate = 'valid' ) {
-               # Force usernames to capital
+               // Force usernames to capital
                global $wgContLang;
                $name = $wgContLang->ucfirst( $name );
 
                # Reject names containing '#'; these will be cleaned up
                # with title normalisation, but then it's too late to
                # check elsewhere
-               if( strpos( $name, '#' ) !== false )
+               if ( strpos( $name, '#' ) !== false ) {
                        return false;
+               }
 
-               # Clean up name according to title rules
+               // Clean up name according to title rules
                $t = ( $validate === 'valid' ) ?
                        Title::newFromText( $name ) : Title::makeTitle( NS_USER, $name );
-               # Check for invalid titles
-               if( is_null( $t ) ) {
+               // Check for invalid titles
+               if ( is_null( $t ) ) {
                        return false;
                }
 
-               # Reject various classes of invalid names
+               // Reject various classes of invalid names
                global $wgAuth;
                $name = $wgAuth->getCanonicalName( $t->getText() );
 
@@ -822,7 +824,7 @@ class User {
         * Count the number of edits of a user
         *
         * @param int $uid User ID to check
-        * @return Int the user's edit count
+        * @return int The user's edit count
         *
         * @deprecated since 1.21 in favour of User::getEditCount
         */
@@ -835,7 +837,7 @@ class User {
        /**
         * Return a random password.
         *
-        * @return String new random password
+        * @return string New random password
         */
        public static function randomPassword() {
                global $wgMinimalPasswordLength;
@@ -870,7 +872,7 @@ class User {
                $this->mOptionsLoaded = false;
 
                $loggedOut = $this->getRequest()->getCookie( 'LoggedOut' );
-               if( $loggedOut !== null ) {
+               if ( $loggedOut !== null ) {
                        $this->mTouched = wfTimestamp( TS_MW, $loggedOut );
                } else {
                        $this->mTouched = '1'; # Allow any pages to be cached
@@ -898,7 +900,7 @@ class User {
         * @param string $all 'all' to check if the whole object has been loaded
         *        or any other string to check if only the item is available (e.g.
         *        for optimisation)
-        * @return Boolean
+        * @return boolean
         */
        public function isItemLoaded( $item, $all = 'all' ) {
                return ( $this->mLoadedItems === true && $all === 'all' ) ||
@@ -908,9 +910,9 @@ class User {
        /**
         * Set that an item has been loaded
         *
-        * @param $item String
+        * @param string $item
         */
-       private function setItemLoaded( $item ) {
+       protected function setItemLoaded( $item ) {
                if ( is_array( $this->mLoadedItems ) ) {
                        $this->mLoadedItems[$item] = true;
                }
@@ -918,25 +920,15 @@ class User {
 
        /**
         * Load user data from the session or login cookie.
-        * @return Bool True if the user is logged in, false otherwise.
+        * @return bool True if the user is logged in, false otherwise.
         */
        private function loadFromSession() {
-               global $wgExternalAuthType, $wgAutocreatePolicy;
-
                $result = null;
                wfRunHooks( 'UserLoadFromSession', array( $this, &$result ) );
                if ( $result !== null ) {
                        return $result;
                }
 
-               if ( $wgExternalAuthType && $wgAutocreatePolicy == 'view' ) {
-                       $extUser = ExternalUser::newFromCookie();
-                       if ( $extUser ) {
-                               # TODO: Automatically create the user here (or probably a bit
-                               # lower down, in fact)
-                       }
-               }
-
                $request = $this->getRequest();
 
                $cookieId = $request->getCookie( 'UserID' );
@@ -944,7 +936,7 @@ class User {
 
                if ( $cookieId !== null ) {
                        $sId = intval( $cookieId );
-                       if( $sessId !== null && $cookieId != $sessId ) {
+                       if ( $sessId !== null && $cookieId != $sessId ) {
                                wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
                                        cookie user ID ($sId) don't match!" );
                                return false;
@@ -967,13 +959,13 @@ class User {
 
                $proposedUser = User::newFromId( $sId );
                if ( !$proposedUser->isLoggedIn() ) {
-                       # Not a valid ID
+                       // Not a valid ID
                        return false;
                }
 
                global $wgBlockDisablesLogin;
-               if( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
-                       # User blocked and we've disabled blocked user logins
+               if ( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
+                       // User blocked and we've disabled blocked user logins
                        return false;
                }
 
@@ -987,7 +979,7 @@ class User {
                        $passwordCorrect = ( strlen( $token ) && $token === $request->getCookie( 'Token' ) );
                        $from = 'cookie';
                } else {
-                       # No session or persistent login cookie
+                       // No session or persistent login cookie
                        return false;
                }
 
@@ -997,7 +989,7 @@ class User {
                        wfDebug( "User: logged in from $from\n" );
                        return true;
                } else {
-                       # Invalid credentials
+                       // Invalid credentials
                        wfDebug( "User: can't log in from $from, invalid credentials\n" );
                        return false;
                }
@@ -1007,14 +999,14 @@ class User {
         * Load user and user_group data from the database.
         * $this->mId must be set, this is how the user is identified.
         *
-        * @return Bool True if the user exists, false if the user is anonymous
+        * @return bool True if the user exists, false if the user is anonymous
         */
        public function loadFromDatabase() {
-               # Paranoia
+               // Paranoia
                $this->mId = intval( $this->mId );
 
-               /** Anonymous user */
-               if( !$this->mId ) {
+               // Anonymous user
+               if ( !$this->mId ) {
                        $this->loadDefaults();
                        return false;
                }
@@ -1025,13 +1017,13 @@ class User {
                wfRunHooks( 'UserLoadFromDatabase', array( $this, &$s ) );
 
                if ( $s !== false ) {
-                       # Initialise user table data
+                       // Initialise user table data
                        $this->loadFromRow( $s );
                        $this->mGroups = null; // deferred
                        $this->getEditCount(); // revalidation for nulls
                        return true;
                } else {
-                       # Invalid user_id
+                       // Invalid user_id
                        $this->mId = 0;
                        $this->loadDefaults();
                        return false;
@@ -1194,7 +1186,7 @@ class User {
         * Clear various cached data stored in this object. The cache of the user table
         * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
         *
-        * @param bool|String $reloadFrom Reload user and user_groups table data from a
+        * @param bool|string $reloadFrom Reload user and user_groups table data from a
         *   given source. May be "name", "id", "defaults", "session", or false for
         *   no reload.
         */
@@ -1235,11 +1227,10 @@ class User {
                }
 
                $defOpt = $wgDefaultUserOptions;
-               # default language setting
-               $defOpt['variant'] = $wgContLang->getCode();
-               $defOpt['language'] = $wgContLang->getCode();
-               foreach( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
-                       $defOpt['searchNs'.$nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
+               // Default language setting
+               $defOpt['language'] = $defOpt['variant'] = $wgContLang->getCode();
+               foreach ( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
+                       $defOpt['searchNs' . $nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
                }
                $defOpt['skin'] = $wgDefaultSkin;
 
@@ -1252,11 +1243,11 @@ class User {
         * Get a given default option value.
         *
         * @param string $opt Name of option to retrieve
-        * @return String Default option value
+        * @return string Default option value
         */
        public static function getDefaultOption( $opt ) {
                $defOpts = self::getDefaultOptions();
-               if( isset( $defOpts[$opt] ) ) {
+               if ( isset( $defOpts[$opt] ) ) {
                        return $defOpts[$opt];
                } else {
                        return null;
@@ -1271,14 +1262,14 @@ class User {
         *                    done against master.
         */
        private function getBlockedStatus( $bFromSlave = true ) {
-               global $wgProxyWhitelist, $wgUser;
+               global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff;
 
                if ( -1 != $this->mBlockedby ) {
                        return;
                }
 
                wfProfileIn( __METHOD__ );
-               wfDebug( __METHOD__.": checking...\n" );
+               wfDebug( __METHOD__ . ": checking...\n" );
 
                // Initialize data...
                // Otherwise something ends up stomping on $this->mBlockedby when
@@ -1296,14 +1287,14 @@ class User {
                        $ip = null;
                }
 
-               # User/IP blocking
+               // User/IP blocking
                $block = Block::newFromTarget( $this, $ip, !$bFromSlave );
 
-               # Proxy blocking
+               // Proxy blocking
                if ( !$block instanceof Block && $ip !== null && !$this->isAllowed( 'proxyunbannable' )
                        && !in_array( $ip, $wgProxyWhitelist ) )
                {
-                       # Local list
+                       // Local list
                        if ( self::isLocallyBlockedProxy( $ip ) ) {
                                $block = new Block;
                                $block->setBlocker( wfMessage( 'proxyblocker' )->text() );
@@ -1317,6 +1308,25 @@ class User {
                        }
                }
 
+               // (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+               if ( !$block instanceof Block
+                       && $wgApplyIpBlocksToXff
+                       && $ip !== null
+                       && !$this->isAllowed( 'proxyunbannable' )
+                       && !in_array( $ip, $wgProxyWhitelist )
+               ) {
+                       $xff = $this->getRequest()->getHeader( 'X-Forwarded-For' );
+                       $xff = array_map( 'trim', explode( ',', $xff ) );
+                       $xff = array_diff( $xff, array( $ip ) );
+                       $xffblocks = Block::getBlocksForIPList( $xff, $this->isAnon(), !$bFromSlave );
+                       $block = Block::chooseBlock( $xffblocks, $xff );
+                       if ( $block instanceof Block ) {
+                               # Mangle the reason to alert the user that the block
+                               # originated from matching the X-Forwarded-For header.
+                               $block->mReason = wfMessage( 'xffblockreason', $block->mReason )->text();
+                       }
+               }
+
                if ( $block instanceof Block ) {
                        wfDebug( __METHOD__ . ": Found block.\n" );
                        $this->mBlock = $block;
@@ -1330,7 +1340,7 @@ class User {
                        $this->mAllowUsertalk = false;
                }
 
-               # Extensions
+               // Extensions
                wfRunHooks( 'GetBlockedStatus', array( &$this ) );
 
                wfProfileOut( __METHOD__ );
@@ -1341,17 +1351,19 @@ class User {
         *
         * @param string $ip IP to check
         * @param bool $checkWhitelist whether to check the whitelist first
-        * @return Bool True if blacklisted.
+        * @return bool True if blacklisted.
         */
        public function isDnsBlacklisted( $ip, $checkWhitelist = false ) {
                global $wgEnableSorbs, $wgEnableDnsBlacklist,
                        $wgSorbsUrl, $wgDnsBlacklistUrls, $wgProxyWhitelist;
 
-               if ( !$wgEnableDnsBlacklist && !$wgEnableSorbs )
+               if ( !$wgEnableDnsBlacklist && !$wgEnableSorbs ) {
                        return false;
+               }
 
-               if ( $checkWhitelist && in_array( $ip, $wgProxyWhitelist ) )
+               if ( $checkWhitelist && in_array( $ip, $wgProxyWhitelist ) ) {
                        return false;
+               }
 
                $urls = array_merge( $wgDnsBlacklistUrls, (array)$wgSorbsUrl );
                return $this->inDnsBlacklist( $ip, $urls );
@@ -1362,23 +1374,23 @@ class User {
         *
         * @param string $ip IP to check
         * @param string|array $bases of Strings: URL of the DNS blacklist
-        * @return Bool True if blacklisted.
+        * @return bool True if blacklisted.
         */
        public function inDnsBlacklist( $ip, $bases ) {
                wfProfileIn( __METHOD__ );
 
                $found = false;
                // @todo FIXME: IPv6 ???  (http://bugs.php.net/bug.php?id=33170)
-               if( IP::isIPv4( $ip ) ) {
-                       # Reverse IP, bug 21255
+               if ( IP::isIPv4( $ip ) ) {
+                       // Reverse IP, bug 21255
                        $ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
 
-                       foreach( (array)$bases as $base ) {
-                               # Make hostname
-                               # If we have an access key, use that too (ProjectHoneypot, etc.)
-                               if( is_array( $base ) ) {
-                                       if( count( $base ) >= 2 ) {
-                                               # Access key is 1, base URL is 0
+                       foreach ( (array)$bases as $base ) {
+                               // Make hostname
+                               // If we have an access key, use that too (ProjectHoneypot, etc.)
+                               if ( is_array( $base ) ) {
+                                       if ( count( $base ) >= 2 ) {
+                                               // Access key is 1, base URL is 0
                                                $host = "{$base[1]}.$ipReversed.{$base[0]}";
                                        } else {
                                                $host = "$ipReversed.{$base[0]}";
@@ -1387,10 +1399,10 @@ class User {
                                        $host = "$ipReversed.$base";
                                }
 
-                               # Send query
+                               // Send query
                                $ipList = gethostbynamel( $host );
 
-                               if( $ipList ) {
+                               if ( $ipList ) {
                                        wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $base!\n" );
                                        $found = true;
                                        break;
@@ -1420,7 +1432,7 @@ class User {
                wfProfileIn( __METHOD__ );
 
                if ( !is_array( $wgProxyList ) ) {
-                       # Load from the specified file
+                       // Load from the specified file
                        $wgProxyList = array_map( 'trim', file( $wgProxyList ) );
                }
 
@@ -1429,7 +1441,7 @@ class User {
                } elseif ( array_search( $ip, $wgProxyList ) !== false ) {
                        $ret = true;
                } elseif ( array_key_exists( $ip, $wgProxyList ) ) {
-                       # Old-style flipped proxy list
+                       // Old-style flipped proxy list
                        $ret = true;
                } else {
                        $ret = false;
@@ -1441,11 +1453,11 @@ class User {
        /**
         * Is this user subject to rate limiting?
         *
-        * @return Bool True if rate limited
+        * @return bool True if rate limited
         */
        public function isPingLimitable() {
                global $wgRateLimitsExcludedIPs;
-               if( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
+               if ( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
                        // No other good way currently to disable rate limits
                        // for specific IPs. :P
                        // But this is a crappy hack and should die.
@@ -1462,23 +1474,24 @@ class User {
         * last-hit counters will be shared across wikis.
         *
         * @param string $action Action to enforce; 'edit' if unspecified
-        * @return Bool True if a rate limiter was tripped
+        * @return bool True if a rate limiter was tripped
         */
        public function pingLimiter( $action = 'edit' ) {
-               # Call the 'PingLimiter' hook
+               // Call the 'PingLimiter' hook
                $result = false;
-               if( !wfRunHooks( 'PingLimiter', array( &$this, $action, &$result ) ) ) {
+               if ( !wfRunHooks( 'PingLimiter', array( &$this, $action, &$result ) ) ) {
                        return $result;
                }
 
                global $wgRateLimits;
-               if( !isset( $wgRateLimits[$action] ) ) {
+               if ( !isset( $wgRateLimits[$action] ) ) {
                        return false;
                }
 
-               # Some groups shouldn't trigger the ping limiter, ever
-               if( !$this->isPingLimitable() )
+               // Some groups shouldn't trigger the ping limiter, ever
+               if ( !$this->isPingLimitable() ) {
                        return false;
+               }
 
                global $wgMemc, $wgRateLimitLog;
                wfProfileIn( __METHOD__ );
@@ -1486,27 +1499,37 @@ class User {
                $limits = $wgRateLimits[$action];
                $keys = array();
                $id = $this->getId();
-               $ip = $this->getRequest()->getIP();
                $userLimit = false;
 
-               if( isset( $limits['anon'] ) && $id == 0 ) {
+               if ( isset( $limits['anon'] ) && $id == 0 ) {
                        $keys[wfMemcKey( 'limiter', $action, 'anon' )] = $limits['anon'];
                }
 
-               if( isset( $limits['user'] ) && $id != 0 ) {
+               if ( isset( $limits['user'] ) && $id != 0 ) {
                        $userLimit = $limits['user'];
                }
-               if( $this->isNewbie() ) {
-                       if( isset( $limits['newbie'] ) && $id != 0 ) {
+               if ( $this->isNewbie() ) {
+                       if ( isset( $limits['newbie'] ) && $id != 0 ) {
                                $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
                        }
-                       if( isset( $limits['ip'] ) ) {
+                       if ( isset( $limits['ip'] ) ) {
+                               $ip = $this->getRequest()->getIP();
                                $keys["mediawiki:limiter:$action:ip:$ip"] = $limits['ip'];
                        }
-                       $matches = array();
-                       if( isset( $limits['subnet'] ) && preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
-                               $subnet = $matches[1];
-                               $keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
+                       if ( isset( $limits['subnet'] ) ) {
+                               $ip = $this->getRequest()->getIP();
+                               $matches = array();
+                               $subnet = false;
+                               if ( IP::isIPv6( $ip ) ) {
+                                       $parts = IP::parseRange( "$ip/64" );
+                                       $subnet = $parts[0];
+                               } elseif ( preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
+                                       // IPv4
+                                       $subnet = $matches[1];
+                               }
+                               if ( $subnet !== false ) {
+                                       $keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
+                               }
                        }
                }
                // Check for group-specific permissions
@@ -1520,20 +1543,21 @@ class User {
                }
                // Set the user limit key
                if ( $userLimit !== false ) {
-                       wfDebug( __METHOD__ . ": effective user limit: $userLimit\n" );
-                       $keys[ wfMemcKey( 'limiter', $action, 'user', $id ) ] = $userLimit;
+                       list( $max, $period ) = $userLimit;
+                       wfDebug( __METHOD__ . ": effective user limit: $max in {$period}s\n" );
+                       $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
                }
 
                $triggered = false;
-               foreach( $keys as $key => $limit ) {
+               foreach ( $keys as $key => $limit ) {
                        list( $max, $period ) = $limit;
                        $summary = "(limit $max in {$period}s)";
                        $count = $wgMemc->get( $key );
                        // Already pinged?
-                       if( $count ) {
-                               if( $count >= $max ) {
+                       if ( $count ) {
+                               if ( $count >= $max ) {
                                        wfDebug( __METHOD__ . ": tripped! $key at $count $summary\n" );
-                                       if( $wgRateLimitLog ) {
+                                       if ( $wgRateLimitLog ) {
                                                wfSuppressWarnings();
                                                file_put_contents( $wgRateLimitLog, wfTimestamp( TS_MW ) . ' ' . wfWikiID() . ': ' . $this->getName() . " tripped $key at $count $summary\n", FILE_APPEND );
                                                wfRestoreWarnings();
@@ -1557,7 +1581,7 @@ class User {
         * Check if user is blocked
         *
         * @param bool $bFromSlave Whether to check the slave database instead of the master
-        * @return Bool True if blocked, false otherwise
+        * @return bool True if blocked, false otherwise
         */
        public function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
                return $this->getBlock( $bFromSlave ) instanceof Block && $this->getBlock()->prevents( 'edit' );
@@ -1577,9 +1601,9 @@ class User {
        /**
         * Check if user is blocked from editing a particular article
         *
-        * @param $title Title to check
+        * @param Title $title Title to check
         * @param bool $bFromSlave whether to check the slave database instead of the master
-        * @return Bool
+        * @return bool
         */
        function isBlockedFrom( $title, $bFromSlave = false ) {
                global $wgBlockAllowsUTEdit;
@@ -1587,7 +1611,7 @@ class User {
 
                $blocked = $this->isBlocked( $bFromSlave );
                $allowUsertalk = ( $wgBlockAllowsUTEdit ? $this->mAllowUsertalk : false );
-               # If a user's name is suppressed, they cannot make edits anywhere
+               // If a user's name is suppressed, they cannot make edits anywhere
                if ( !$this->mHideName && $allowUsertalk && $title->getText() === $this->getName() &&
                  $title->getNamespace() == NS_USER_TALK ) {
                        $blocked = false;
@@ -1602,7 +1626,7 @@ class User {
 
        /**
         * If user is blocked, return the name of the user who placed the block
-        * @return String name of blocker
+        * @return string Name of blocker
         */
        public function blockedBy() {
                $this->getBlockedStatus();
@@ -1611,7 +1635,7 @@ class User {
 
        /**
         * If user is blocked, return the specified reason for the block
-        * @return String Blocking reason
+        * @return string Blocking reason
         */
        public function blockedFor() {
                $this->getBlockedStatus();
@@ -1620,7 +1644,7 @@ class User {
 
        /**
         * If user is blocked, return the ID for the block
-        * @return Int Block ID
+        * @return int Block ID
         */
        public function getBlockId() {
                $this->getBlockedStatus();
@@ -1633,16 +1657,16 @@ class User {
         * This is intended for quick UI checks.
         *
         * @param string $ip IP address, uses current client if none given
-        * @return Bool True if blocked, false otherwise
+        * @return bool True if blocked, false otherwise
         */
        public function isBlockedGlobally( $ip = '' ) {
-               if( $this->mBlockedGlobally !== null ) {
+               if ( $this->mBlockedGlobally !== null ) {
                        return $this->mBlockedGlobally;
                }
                // User is already an IP?
-               if( IP::isIPAddress( $this->getName() ) ) {
+               if ( IP::isIPAddress( $this->getName() ) ) {
                        $ip = $this->getName();
-               } elseif( !$ip ) {
+               } elseif ( !$ip ) {
                        $ip = $this->getRequest()->getIP();
                }
                $blocked = false;
@@ -1654,10 +1678,10 @@ class User {
        /**
         * Check if user account is locked
         *
-        * @return Bool True if locked, false otherwise
+        * @return bool True if locked, false otherwise
         */
        public function isLocked() {
-               if( $this->mLocked !== null ) {
+               if ( $this->mLocked !== null ) {
                        return $this->mLocked;
                }
                global $wgAuth;
@@ -1669,14 +1693,14 @@ class User {
        /**
         * Check if user account is hidden
         *
-        * @return Bool True if hidden, false otherwise
+        * @return bool True if hidden, false otherwise
         */
        public function isHidden() {
-               if( $this->mHideName !== null ) {
+               if ( $this->mHideName !== null ) {
                        return $this->mHideName;
                }
                $this->getBlockedStatus();
-               if( !$this->mHideName ) {
+               if ( !$this->mHideName ) {
                        global $wgAuth;
                        $authUser = $wgAuth->getUserInstance( $this );
                        $this->mHideName = (bool)$authUser->isHidden();
@@ -1686,14 +1710,13 @@ class User {
 
        /**
         * Get the user's ID.
-        * @return Int The user's ID; 0 if the user is anonymous or nonexistent
+        * @return int The user's ID; 0 if the user is anonymous or nonexistent
         */
        public function getId() {
-               if( $this->mId === null && $this->mName !== null
-               && User::isIP( $this->mName ) ) {
+               if ( $this->mId === null && $this->mName !== null && User::isIP( $this->mName ) ) {
                        // Special case, we know the user is anonymous
                        return 0;
-               } elseif( !$this->isItemLoaded( 'id' ) ) {
+               } elseif ( !$this->isItemLoaded( 'id' ) ) {
                        // Don't load if this was initialized from an ID
                        $this->load();
                }
@@ -1711,16 +1734,16 @@ class User {
 
        /**
         * Get the user name, or the IP of an anonymous user
-        * @return String User's name or IP address
+        * @return string User's name or IP address
         */
        public function getName() {
                if ( $this->isItemLoaded( 'name', 'only' ) ) {
-                       # Special case optimisation
+                       // Special case optimisation
                        return $this->mName;
                } else {
                        $this->load();
                        if ( $this->mName === false ) {
-                               # Clean up IPs
+                               // Clean up IPs
                                $this->mName = IP::sanitizeIP( $this->getRequest()->getIP() );
                        }
                        return $this->mName;
@@ -1747,7 +1770,7 @@ class User {
 
        /**
         * Get the user's name escaped by underscores.
-        * @return String Username escaped by underscores.
+        * @return string Username escaped by underscores.
         */
        public function getTitleKey() {
                return str_replace( ' ', '_', $this->getName() );
@@ -1755,27 +1778,27 @@ class User {
 
        /**
         * Check if the user has new messages.
-        * @return Bool True if the user has new messages
+        * @return bool True if the user has new messages
         */
        public function getNewtalk() {
                $this->load();
 
-               # Load the newtalk status if it is unloaded (mNewtalk=-1)
-               if( $this->mNewtalk === -1 ) {
+               // Load the newtalk status if it is unloaded (mNewtalk=-1)
+               if ( $this->mNewtalk === -1 ) {
                        $this->mNewtalk = false; # reset talk page status
 
-                       # Check memcached separately for anons, who have no
-                       # entire User object stored in there.
-                       if( !$this->mId ) {
+                       // Check memcached separately for anons, who have no
+                       // entire User object stored in there.
+                       if ( !$this->mId ) {
                                global $wgDisableAnonTalk;
-                               if( $wgDisableAnonTalk ) {
+                               if ( $wgDisableAnonTalk ) {
                                        // Anon newtalk disabled by configuration.
                                        $this->mNewtalk = false;
                                } else {
                                        global $wgMemc;
                                        $key = wfMemcKey( 'newtalk', 'ip', $this->getName() );
                                        $newtalk = $wgMemc->get( $key );
-                                       if( strval( $newtalk ) !== '' ) {
+                                       if ( strval( $newtalk ) !== '' ) {
                                                $this->mNewtalk = (bool)$newtalk;
                                        } else {
                                                // Since we are caching this, make sure it is up to date by getting it
@@ -1793,14 +1816,17 @@ class User {
        }
 
        /**
-        * Return the talk page(s) this user has new messages on.
-        * @return Array of String page URLs
+        * Return the revision and link for the oldest new talk page message for
+        * this user.
+        * @note This function was designed to accomodate multiple talk pages, but
+        * currently only returns a single link and revision.
+        * @return Array
         */
        public function getNewMessageLinks() {
                $talks = array();
-               if( !wfRunHooks( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) ) {
+               if ( !wfRunHooks( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) ) {
                        return $talks;
-               } elseif( !$this->getNewtalk() ) {
+               } elseif ( !$this->getNewtalk() ) {
                        return array();
                }
                $utp = $this->getTalkPage();
@@ -1814,14 +1840,36 @@ class User {
                return array( array( 'wiki' => wfWikiID(), 'link' => $utp->getLocalURL(), 'rev' => $rev ) );
        }
 
+       /**
+        * Get the revision ID for the oldest new talk page message for this user
+        * @return int|null Revision id or null if there are no new messages
+        */
+       public function getNewMessageRevisionId() {
+               $newMessageRevisionId = null;
+               $newMessageLinks = $this->getNewMessageLinks();
+               if ( $newMessageLinks ) {
+                       // Note: getNewMessageLinks() never returns more than a single link
+                       // and it is always for the same wiki, but we double-check here in
+                       // case that changes some time in the future.
+                       if ( count( $newMessageLinks ) === 1
+                               && $newMessageLinks[0]['wiki'] === wfWikiID()
+                               && $newMessageLinks[0]['rev']
+                       ) {
+                               $newMessageRevision = $newMessageLinks[0]['rev'];
+                               $newMessageRevisionId = $newMessageRevision->getId();
+                       }
+               }
+               return $newMessageRevisionId;
+       }
+
        /**
         * Internal uncached check for new messages
         *
         * @see getNewtalk()
         * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
-        * @param string|Int $id User's IP address for anonymous users, User ID otherwise
+        * @param string|int $id User's IP address for anonymous users, User ID otherwise
         * @param bool $fromMaster true to fetch from the master, false for a slave
-        * @return Bool True if the user has new messages
+        * @return bool True if the user has new messages
         */
        protected function checkNewtalk( $field, $id, $fromMaster = false ) {
                if ( $fromMaster ) {
@@ -1837,9 +1885,9 @@ class User {
        /**
         * Add or update the new messages flag
         * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
-        * @param string|Int $id User's IP address for anonymous users, User ID otherwise
+        * @param string|int $id User's IP address for anonymous users, User ID otherwise
         * @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null.
-        * @return Bool True if successful, false otherwise
+        * @return bool True if successful, false otherwise
         */
        protected function updateNewtalk( $field, $id, $curRev = null ) {
                // Get timestamp of the talk page revision prior to the current one
@@ -1863,8 +1911,8 @@ class User {
        /**
         * Clear the new messages flag for the given user
         * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
-        * @param string|Int $id User's IP address for anonymous users, User ID otherwise
-        * @return Bool True if successful, false otherwise
+        * @param string|int $id User's IP address for anonymous users, User ID otherwise
+        * @return bool True if successful, false otherwise
         */
        protected function deleteNewtalk( $field, $id ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -1886,14 +1934,14 @@ class User {
         * @param $curRev Revision new, as yet unseen revision of the user talk page. Ignored if null or !$val.
         */
        public function setNewtalk( $val, $curRev = null ) {
-               if( wfReadOnly() ) {
+               if ( wfReadOnly() ) {
                        return;
                }
 
                $this->load();
                $this->mNewtalk = $val;
 
-               if( $this->isAnon() ) {
+               if ( $this->isAnon() ) {
                        $field = 'user_ip';
                        $id = $this->getName();
                } else {
@@ -1902,13 +1950,13 @@ class User {
                }
                global $wgMemc;
 
-               if( $val ) {
+               if ( $val ) {
                        $changed = $this->updateNewtalk( $field, $id, $curRev );
                } else {
                        $changed = $this->deleteNewtalk( $field, $id );
                }
 
-               if( $this->isAnon() ) {
+               if ( $this->isAnon() ) {
                        // Anons have a separate memcached space, since
                        // user records aren't kept for them.
                        $key = wfMemcKey( 'newtalk', 'ip', $id );
@@ -1922,7 +1970,7 @@ class User {
        /**
         * Generate a current or new-future timestamp to be stored in the
         * user_touched field when we update things.
-        * @return String Timestamp in TS_MW format
+        * @return string Timestamp in TS_MW format
         */
        private static function newTouchedTimestamp() {
                global $wgClockSkewFudge;
@@ -1938,7 +1986,7 @@ class User {
         */
        private function clearSharedCache() {
                $this->load();
-               if( $this->mId ) {
+               if ( $this->mId ) {
                        global $wgMemc;
                        $wgMemc->delete( wfMemcKey( 'user', 'id', $this->mId ) );
                }
@@ -1950,28 +1998,30 @@ class User {
         * for reload on the next hit.
         */
        public function invalidateCache() {
-               if( wfReadOnly() ) {
+               if ( wfReadOnly() ) {
                        return;
                }
                $this->load();
-               if( $this->mId ) {
+               if ( $this->mId ) {
                        $this->mTouched = self::newTouchedTimestamp();
 
                        $dbw = wfGetDB( DB_MASTER );
-
-                       // Prevent contention slams by checking user_touched first
-                       $now = $dbw->timestamp( $this->mTouched );
-                       $needsPurge = $dbw->selectField( 'user', '1',
-                               array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) )
-                       );
-                       if ( $needsPurge ) {
-                               $dbw->update( 'user',
-                                       array( 'user_touched' => $now ),
-                                       array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) ),
-                                       __METHOD__
-                               );
-                       }
-
+                       $userid = $this->mId;
+                       $touched = $this->mTouched;
+                       $method = __METHOD__;
+                       $dbw->onTransactionIdle( function() use ( $dbw, $userid, $touched, $method ) {
+                               // Prevent contention slams by checking user_touched first
+                               $encTouched = $dbw->addQuotes( $dbw->timestamp( $touched ) );
+                               $needsPurge = $dbw->selectField( 'user', '1',
+                                       array( 'user_id' => $userid, 'user_touched < ' . $encTouched ) );
+                               if ( $needsPurge ) {
+                                       $dbw->update( 'user',
+                                               array( 'user_touched' => $dbw->timestamp( $touched ) ),
+                                               array( 'user_id' => $userid, 'user_touched < ' . $encTouched ),
+                                               $method
+                                       );
+                               }
+                       } );
                        $this->clearSharedCache();
                }
        }
@@ -1979,7 +2029,6 @@ class User {
        /**
         * Validate the cache for this account.
         * @param string $timestamp A timestamp in TS_MW format
-        *
         * @return bool
         */
        public function validateCache( $timestamp ) {
@@ -1989,7 +2038,7 @@ class User {
 
        /**
         * Get the user touched timestamp
-        * @return String timestamp
+        * @return string timestamp
         */
        public function getTouched() {
                $this->load();
@@ -2015,12 +2064,12 @@ class User {
        public function setPassword( $str ) {
                global $wgAuth;
 
-               if( $str !== null ) {
-                       if( !$wgAuth->allowPasswordChange() ) {
+               if ( $str !== null ) {
+                       if ( !$wgAuth->allowPasswordChange() ) {
                                throw new PasswordError( wfMessage( 'password-change-forbidden' )->text() );
                        }
 
-                       if( !$this->isValidPassword( $str ) ) {
+                       if ( !$this->isValidPassword( $str ) ) {
                                global $wgMinimalPasswordLength;
                                $valid = $this->getPasswordValidity( $str );
                                if ( is_array( $valid ) ) {
@@ -2034,7 +2083,7 @@ class User {
                        }
                }
 
-               if( !$wgAuth->setPassword( $this, $str ) ) {
+               if ( !$wgAuth->setPassword( $this, $str ) ) {
                        throw new PasswordError( wfMessage( 'externaldberror' )->text() );
                }
 
@@ -2047,14 +2096,14 @@ class User {
         * Set the password and reset the random token unconditionally.
         *
         * @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.
+        *  password hash meaning that the user will not be able to log in
+        *  through the web interface.
         */
        public function setInternalPassword( $str ) {
                $this->load();
                $this->setToken();
 
-               if( $str === null ) {
+               if ( $str === null ) {
                        // Save an invalid hash...
                        $this->mPassword = '';
                } else {
@@ -2067,7 +2116,7 @@ class User {
        /**
         * Get the user's current token.
         * @param bool $forceCreation Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
-        * @return String Token
+        * @return string Token
         */
        public function getToken( $forceCreation = true ) {
                $this->load();
@@ -2109,7 +2158,7 @@ class User {
        /**
         * Has password reminder email been sent within the last
         * $wgPasswordReminderResendTime hours?
-        * @return Bool
+        * @return bool
         */
        public function isPasswordReminderThrottled() {
                global $wgPasswordReminderResendTime;
@@ -2123,7 +2172,7 @@ class User {
 
        /**
         * Get the user's e-mail address
-        * @return String User's email address
+        * @return string User's email address
         */
        public function getEmail() {
                $this->load();
@@ -2133,7 +2182,7 @@ class User {
 
        /**
         * Get the timestamp of the user's e-mail authentication
-        * @return String TS_MW timestamp
+        * @return string TS_MW timestamp
         */
        public function getEmailAuthenticationTimestamp() {
                $this->load();
@@ -2147,7 +2196,7 @@ class User {
         */
        public function setEmail( $str ) {
                $this->load();
-               if( $str == $this->mEmail ) {
+               if ( $str == $this->mEmail ) {
                        return;
                }
                $this->mEmail = $str;
@@ -2177,11 +2226,11 @@ class User {
                $this->setEmail( $str );
 
                if ( $str !== '' && $wgEmailAuthentication ) {
-                       # Send a confirmation request to the new address if needed
+                       // Send a confirmation request to the new address if needed
                        $type = $oldaddr != '' ? 'changed' : 'set';
                        $result = $this->sendConfirmationMail( $type );
                        if ( $result->isGood() ) {
-                               # Say the the caller that a confirmation mail has been sent
+                               // Say the the caller that a confirmation mail has been sent
                                $result->value = 'eauth';
                        }
                } else {
@@ -2193,7 +2242,7 @@ class User {
 
        /**
         * Get the user's real name
-        * @return String User's real name
+        * @return string User's real name
         */
        public function getRealName() {
                if ( !$this->isItemLoaded( 'realname' ) ) {
@@ -2217,8 +2266,8 @@ class User {
         *
         * @param string $oname The option to check
         * @param string $defaultOverride A default value returned if the option does not exist
-        * @param bool $ignoreHidden = whether to ignore the effects of $wgHiddenPrefs
-        * @return String User's current value for the option
+        * @param bool $ignoreHidden Whether to ignore the effects of $wgHiddenPrefs
+        * @return string User's current value for the option
         * @see getBoolOption()
         * @see getIntOption()
         */
@@ -2231,7 +2280,7 @@ class User {
                # set it, and then it was disabled removing their ability to change it).  But
                # we don't want to erase the preferences in the database in case the preference
                # is re-enabled again.  So don't touch $mOptions, just override the returned value
-               if( in_array( $oname, $wgHiddenPrefs ) && !$ignoreHidden ) {
+               if ( in_array( $oname, $wgHiddenPrefs ) && !$ignoreHidden ) {
                        return self::getDefaultOption( $oname );
                }
 
@@ -2257,9 +2306,9 @@ class User {
                # set it, and then it was disabled removing their ability to change it).  But
                # we don't want to erase the preferences in the database in case the preference
                # is re-enabled again.  So don't touch $mOptions, just override the returned value
-               foreach( $wgHiddenPrefs as $pref ) {
+               foreach ( $wgHiddenPrefs as $pref ) {
                        $default = self::getDefaultOption( $pref );
-                       if( $default !== null ) {
+                       if ( $default !== null ) {
                                $options[$pref] = $default;
                        }
                }
@@ -2271,7 +2320,7 @@ class User {
         * Get the user's current setting for a given option, as a boolean value.
         *
         * @param string $oname The option to check
-        * @return Bool User's current value for the option
+        * @return bool User's current value for the option
         * @see getOption()
         */
        public function getBoolOption( $oname ) {
@@ -2283,12 +2332,12 @@ class User {
         *
         * @param string $oname The option to check
         * @param int $defaultOverride A default value returned if the option does not exist
-        * @return Int User's current value for the option
+        * @return int User's current value for the option
         * @see getOption()
         */
        public function getIntOption( $oname, $defaultOverride = 0 ) {
                $val = $this->getOption( $oname );
-               if( $val == '' ) {
+               if ( $val == '' ) {
                        $val = $defaultOverride;
                }
                return intval( $val );
@@ -2298,13 +2347,13 @@ class User {
         * Set the given option for a user.
         *
         * @param string $oname The option to set
-        * @param $val mixed New value to set
+        * @param mixed $val New value to set
         */
        public function setOption( $oname, $val ) {
                $this->loadOptions();
 
                // Explicitly NULL values should refer to defaults
-               if( is_null( $val ) ) {
+               if ( is_null( $val ) ) {
                        $val = self::getDefaultOption( $oname );
                }
 
@@ -2400,9 +2449,9 @@ class User {
                foreach ( $options as $key => $value ) {
                        if ( isset( $prefs[$key] ) ) {
                                $mapping[$key] = 'registered';
-                       } elseif( isset( $multiselectOptions[$key] ) ) {
+                       } elseif ( isset( $multiselectOptions[$key] ) ) {
                                $mapping[$key] = 'registered-multiselect';
-                       } elseif( isset( $checkmatrixOptions[$key] ) ) {
+                       } elseif ( isset( $checkmatrixOptions[$key] ) ) {
                                $mapping[$key] = 'registered-checkmatrix';
                        } elseif ( substr( $key, 0, 7 ) === 'userjs-' ) {
                                $mapping[$key] = 'userjs';
@@ -2422,11 +2471,11 @@ class User {
         * and 'all', which forces a reset of *all* preferences and overrides everything else.
         *
         * @param array|string $resetKinds which kinds of preferences to reset. Defaults to
-        *             array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
-        *             for backwards-compatibility.
+        *  array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
+        *  for backwards-compatibility.
         * @param $context IContextSource|null context source used when $resetKinds
-        *             does not contain 'all', passed to getOptionKinds().
-        *             Defaults to RequestContext::getMain() when null.
+        *  does not contain 'all', passed to getOptionKinds().
+        *  Defaults to RequestContext::getMain() when null.
         */
        public function resetOptions(
                $resetKinds = array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' ),
@@ -2469,7 +2518,7 @@ class User {
 
        /**
         * Get the user's preferred date format.
-        * @return String User's preferred date format
+        * @return string User's preferred date format
         */
        public function getDatePreference() {
                // Important migration for old data rows
@@ -2494,8 +2543,8 @@ class User {
                global $wgMaxArticleSize; # Maximum article size, in Kb
                $threshold = $this->getIntOption( 'stubthreshold' );
                if ( $threshold > $wgMaxArticleSize * 1024 ) {
-                       # If they have set an impossible value, disable the preference
-                       # so we can use the parser cache again.
+                       // If they have set an impossible value, disable the preference
+                       // so we can use the parser cache again.
                        $threshold = 0;
                }
                return $threshold;
@@ -2540,7 +2589,7 @@ class User {
                                $this->getGroups(), // explicit groups
                                $this->getAutomaticGroups( $recache ) // implicit groups
                        ) );
-                       # Hook for additional groups
+                       // Hook for additional groups
                        wfRunHooks( 'UserEffectiveGroups', array( &$this, &$this->mEffectiveGroups ) );
                        // Force reindexation of groups when a hook has unset one of them
                        $this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
@@ -2569,8 +2618,8 @@ class User {
                                ) );
                        }
                        if ( $recache ) {
-                               # Assure data consistency with rights/groups,
-                               # as getEffectiveGroups() depends on this function
+                               // Assure data consistency with rights/groups,
+                               // as getEffectiveGroups() depends on this function
                                $this->mEffectiveGroups = null;
                        }
                        wfProfileOut( __METHOD__ );
@@ -2588,14 +2637,14 @@ class User {
         * @return array Names of the groups the user has belonged to.
         */
        public function getFormerGroups() {
-               if( is_null( $this->mFormerGroups ) ) {
+               if ( is_null( $this->mFormerGroups ) ) {
                        $dbr = wfGetDB( DB_MASTER );
                        $res = $dbr->select( 'user_former_groups',
                                array( 'ufg_group' ),
                                array( 'ufg_user' => $this->mId ),
                                __METHOD__ );
                        $this->mFormerGroups = array();
-                       foreach( $res as $row ) {
+                       foreach ( $res as $row ) {
                                $this->mFormerGroups[] = $row->ufg_group;
                        }
                }
@@ -2604,7 +2653,7 @@ class User {
 
        /**
         * Get the user's edit count.
-        * @return Int
+        * @return int
         */
        public function getEditCount() {
                if ( !$this->getId() ) {
@@ -2622,7 +2671,7 @@ class User {
                                __METHOD__
                        );
 
-                       if( $count === null ) {
+                       if ( $count === null ) {
                                // it has not been initialized. do so.
                                $count = $this->initEditCount();
                        }
@@ -2638,9 +2687,9 @@ class User {
         * @param string $group Name of the group to add
         */
        public function addGroup( $group ) {
-               if( wfRunHooks( 'UserAddGroup', array( $this, &$group ) ) ) {
+               if ( wfRunHooks( 'UserAddGroup', array( $this, &$group ) ) ) {
                        $dbw = wfGetDB( DB_MASTER );
-                       if( $this->getId() ) {
+                       if ( $this->getId() ) {
                                $dbw->insert( 'user_groups',
                                        array(
                                                'ug_user' => $this->getID(),
@@ -2652,6 +2701,9 @@ class User {
                }
                $this->loadGroups();
                $this->mGroups[] = $group;
+               // In case loadGroups was not called before, we now have the right twice.
+               // Get rid of the duplicate.
+               $this->mGroups = array_unique( $this->mGroups );
                $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
 
                $this->invalidateCache();
@@ -2664,7 +2716,7 @@ class User {
         */
        public function removeGroup( $group ) {
                $this->load();
-               if( wfRunHooks( 'UserRemoveGroup', array( $this, &$group ) ) ) {
+               if ( wfRunHooks( 'UserRemoveGroup', array( $this, &$group ) ) ) {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->delete( 'user_groups',
                                array(
@@ -2689,7 +2741,7 @@ class User {
 
        /**
         * Get whether the user is logged in
-        * @return Bool
+        * @return bool
         */
        public function isLoggedIn() {
                return $this->getID() != 0;
@@ -2697,7 +2749,7 @@ class User {
 
        /**
         * Get whether the user is anonymous
-        * @return Bool
+        * @return bool
         */
        public function isAnon() {
                return !$this->isLoggedIn();
@@ -2707,14 +2759,14 @@ class User {
         * Check if user is allowed to access a feature / make an action
         *
         * @internal param \String $varargs permissions to test
-        * @return Boolean: True if user is allowed to perform *any* of the given actions
+        * @return boolean: True if user is allowed to perform *any* of the given actions
         *
         * @return bool
         */
        public function isAllowedAny( /*...*/ ) {
                $permissions = func_get_args();
-               foreach( $permissions as $permission ) {
-                       if( $this->isAllowed( $permission ) ) {
+               foreach ( $permissions as $permission ) {
+                       if ( $this->isAllowed( $permission ) ) {
                                return true;
                        }
                }
@@ -2728,8 +2780,8 @@ class User {
         */
        public function isAllowedAll( /*...*/ ) {
                $permissions = func_get_args();
-               foreach( $permissions as $permission ) {
-                       if( !$this->isAllowed( $permission ) ) {
+               foreach ( $permissions as $permission ) {
+                       if ( !$this->isAllowed( $permission ) ) {
                                return false;
                        }
                }
@@ -2738,27 +2790,28 @@ class User {
 
        /**
         * Internal mechanics of testing a permission
-        * @param $action String
+        * @param string $action
         * @return bool
         */
        public function isAllowed( $action = '' ) {
                if ( $action === '' ) {
                        return true; // In the spirit of DWIM
                }
-               # Patrolling may not be enabled
-               if( $action === 'patrol' || $action === 'autopatrol' ) {
+               // Patrolling may not be enabled
+               if ( $action === 'patrol' || $action === 'autopatrol' ) {
                        global $wgUseRCPatrol, $wgUseNPPatrol;
-                       if( !$wgUseRCPatrol && !$wgUseNPPatrol )
+                       if ( !$wgUseRCPatrol && !$wgUseNPPatrol ) {
                                return false;
+                       }
                }
-               # Use strict parameter to avoid matching numeric 0 accidentally inserted
-               # by misconfiguration: 0 == 'foo'
+               // Use strict parameter to avoid matching numeric 0 accidentally inserted
+               // by misconfiguration: 0 == 'foo'
                return in_array( $action, $this->getRights(), true );
        }
 
        /**
         * Check whether to enable recent changes patrol features for this user
-        * @return Boolean: True or false
+        * @return boolean: True or false
         */
        public function useRCPatrol() {
                global $wgUseRCPatrol;
@@ -2767,11 +2820,14 @@ class User {
 
        /**
         * Check whether to enable new pages patrol features for this user
-        * @return Bool True or false
+        * @return bool True or false
         */
        public function useNPPatrol() {
                global $wgUseRCPatrol, $wgUseNPPatrol;
-               return( ( $wgUseRCPatrol || $wgUseNPPatrol ) && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) ) );
+               return (
+                       ( $wgUseRCPatrol || $wgUseNPPatrol )
+                               && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) )
+               );
        }
 
        /**
@@ -2823,7 +2879,7 @@ class User {
        /**
         * Check the watched status of an article.
         * @param $title Title of the article to look at
-        * @return Bool
+        * @return bool
         */
        public function isWatched( $title ) {
                return $this->getWatchedItem( $title )->isWatched();
@@ -2856,23 +2912,24 @@ class User {
        public function clearNotification( &$title ) {
                global $wgUseEnotif, $wgShowUpdatedMarker;
 
-               # Do nothing if the database is locked to writes
-               if( wfReadOnly() ) {
+               // Do nothing if the database is locked to writes
+               if ( wfReadOnly() ) {
                        return;
                }
 
-               if( $title->getNamespace() == NS_USER_TALK &&
+               if ( $title->getNamespace() == NS_USER_TALK &&
                        $title->getText() == $this->getName() ) {
-                       if( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this ) ) )
+                       if ( !wfRunHooks( 'UserClearNewTalkNotification', array( &$this ) ) ) {
                                return;
+                       }
                        $this->setNewtalk( false );
                }
 
-               if( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
+               if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
                        return;
                }
 
-               if( $this->isAnon() ) {
+               if ( $this->isAnon() ) {
                        // Nothing else to do...
                        return;
                }
@@ -2907,7 +2964,7 @@ class User {
                        return;
                }
                $id = $this->getId();
-               if( $id != 0 ) {
+               if ( $id != 0 ) {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update( 'watchlist',
                                array( /* SET */
@@ -2929,8 +2986,9 @@ class User {
         */
        private function decodeOptions( $str ) {
                wfDeprecated( __METHOD__, '1.19' );
-               if( !$str )
+               if ( !$str ) {
                        return;
+               }
 
                $this->mOptionsLoaded = true;
                $this->mOptionOverrides = array();
@@ -2955,7 +3013,7 @@ class User {
         * @param string $value Value to set
         * @param int $exp Expiration time, as a UNIX time value;
         *                   if 0 or not specified, use the default $wgCookieExpiration
-        * @param $secure Bool
+        * @param bool $secure
         *  true: Force setting the secure attribute when setting the cookie
         *  false: Force NOT setting the secure attribute when setting the cookie
         *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
@@ -3038,7 +3096,7 @@ class User {
         * Log this user out.
         */
        public function logout() {
-               if( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
+               if ( wfRunHooks( 'UserLogout', array( &$this ) ) ) {
                        $this->doLogout();
                }
        }
@@ -3056,7 +3114,7 @@ class User {
                $this->clearCookie( 'Token' );
                $this->clearCookie( 'forceHTTPS' );
 
-               # Remember when user logged out, to prevent seeing cached pages
+               // Remember when user logged out, to prevent seeing cached pages
                $this->setCookie( 'LoggedOut', wfTimestampNow(), time() + 86400 );
        }
 
@@ -3068,8 +3126,12 @@ class User {
                global $wgAuth;
 
                $this->load();
-               if ( wfReadOnly() ) { return; }
-               if ( 0 == $this->mId ) { return; }
+               if ( wfReadOnly() ) {
+                       return;
+               }
+               if ( 0 == $this->mId ) {
+                       return;
+               }
 
                $this->mTouched = self::newTouchedTimestamp();
                if ( !$wgAuth->allowSetLocalPassword() ) {
@@ -3104,11 +3166,13 @@ class User {
 
        /**
         * If only this user's username is known, and it exists, return the user ID.
-        * @return Int
+        * @return int
         */
        public function idForName() {
                $s = trim( $this->getName() );
-               if ( $s === '' ) return 0;
+               if ( $s === '' ) {
+                       return 0;
+               }
 
                $dbr = wfGetDB( DB_SLAVE );
                $id = $dbr->selectField( 'user', 'user_id', array( 'user_name' => $s ), __METHOD__ );
@@ -3234,8 +3298,8 @@ class User {
                                }
                        }
                        if ( !$loaded ) {
-                               throw new MWException( __METHOD__. ": hit a key conflict attempting " .
-                                       "to insert a user row, but then it doesn't exist when we select it!" );
+                               throw new MWException( __METHOD__ . ": hit a key conflict attempting " .
+                                       "to insert user '{$this->mName}' row, but it was not present in select!" );
                        }
                        return Status::newFatal( 'userexists' );
                }
@@ -3292,13 +3356,13 @@ class User {
         * settings.
         *
         * @deprecated since 1.17 use the ParserOptions object to get the relevant options
-        * @return String Page rendering hash
+        * @return string Page rendering hash
         */
        public function getPageRenderingHash() {
                wfDeprecated( __METHOD__, '1.17' );
 
                global $wgRenderHashAppend, $wgLang, $wgContLang;
-               if( $this->mHash ) {
+               if ( $this->mHash ) {
                        return $this->mHash;
                }
 
@@ -3332,11 +3396,11 @@ class User {
 
        /**
         * Get whether the user is explicitly blocked from account creation.
-        * @return Bool|Block
+        * @return bool|Block
         */
        public function isBlockedFromCreateAccount() {
                $this->getBlockedStatus();
-               if( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
+               if ( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
                        return $this->mBlock;
                }
 
@@ -3353,7 +3417,7 @@ class User {
 
        /**
         * Get whether the user is blocked from using Special:Emailuser.
-        * @return Bool
+        * @return bool
         */
        public function isBlockedFromEmailuser() {
                $this->getBlockedStatus();
@@ -3362,7 +3426,7 @@ class User {
 
        /**
         * Get whether the user is allowed to create an account.
-        * @return Bool
+        * @return bool
         */
        function isAllowedToCreateAccount() {
                return $this->isAllowed( 'createaccount' ) && !$this->isBlockedFromCreateAccount();
@@ -3390,7 +3454,7 @@ class User {
        /**
         * Determine whether the user is a newbie. Newbies are either
         * anonymous IPs, or the most recently created accounts.
-        * @return Bool
+        * @return bool
         */
        public function isNewbie() {
                return !$this->isAllowed( 'autoconfirmed' );
@@ -3399,7 +3463,7 @@ class User {
        /**
         * Check to see if the given clear-text password is one of the accepted passwords
         * @param string $password user password.
-        * @return Boolean: True if the given password is correct, otherwise False.
+        * @return boolean: True if the given password is correct, otherwise False.
         */
        public function checkPassword( $password ) {
                global $wgAuth, $wgLegacyEncoding;
@@ -3410,24 +3474,24 @@ class User {
                // to. Certain authentication plugins do NOT want to save
                // domain passwords in a mysql database, so we should
                // check this (in case $wgAuth->strict() is false).
-               if( !$this->isValidPassword( $password ) ) {
+               if ( !$this->isValidPassword( $password ) ) {
                        return false;
                }
 
-               if( $wgAuth->authenticate( $this->getName(), $password ) ) {
+               if ( $wgAuth->authenticate( $this->getName(), $password ) ) {
                        return true;
-               } elseif( $wgAuth->strict() ) {
-                       /* Auth plugin doesn't allow local authentication */
+               } elseif ( $wgAuth->strict() ) {
+                       // Auth plugin doesn't allow local authentication
                        return false;
-               } elseif( $wgAuth->strictUserAuth( $this->getName() ) ) {
-                       /* Auth plugin doesn't allow local authentication for this user name */
+               } elseif ( $wgAuth->strictUserAuth( $this->getName() ) ) {
+                       // Auth plugin doesn't allow local authentication for this user name
                        return false;
                }
                if ( self::comparePasswords( $this->mPassword, $password, $this->mId ) ) {
                        return true;
                } elseif ( $wgLegacyEncoding ) {
-                       # Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
-                       # Check for this with iconv
+                       // 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 &&
                                self::comparePasswords( $this->mPassword, $cp1252Password, $this->mId ) )
@@ -3444,13 +3508,13 @@ class User {
         *
         * @param $plaintext string
         *
-        * @return Boolean: True if matches, false otherwise
+        * @return boolean: True if matches, false otherwise
         */
        public function checkTemporaryPassword( $plaintext ) {
                global $wgNewPasswordExpiry;
 
                $this->load();
-               if( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) {
+               if ( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) {
                        if ( is_null( $this->mNewpassTime ) ) {
                                return true;
                        }
@@ -3467,7 +3531,7 @@ class User {
         *
         * @param string|array $salt of Strings Optional function-specific data for hashing
         * @param $request WebRequest object to use or null to use $wgRequest
-        * @return String The new edit token
+        * @return string The new edit token
         */
        public function editToken( $salt = '', $request = null ) {
                wfDeprecated( __METHOD__, '1.19' );
@@ -3484,7 +3548,7 @@ class User {
         *
         * @param string|array $salt of Strings Optional function-specific data for hashing
         * @param $request WebRequest object to use or null to use $wgRequest
-        * @return String The new edit token
+        * @return string The new edit token
         */
        public function getEditToken( $salt = '', $request = null ) {
                if ( $request == null ) {
@@ -3499,7 +3563,7 @@ class User {
                                $token = MWCryptRand::generateHex( 32 );
                                $request->setSessionData( 'wsEditToken', $token );
                        }
-                       if( is_array( $salt ) ) {
+                       if ( is_array( $salt ) ) {
                                $salt = implode( '|', $salt );
                        }
                        return md5( $token . $salt ) . EDIT_TOKEN_SUFFIX;
@@ -3509,8 +3573,8 @@ class User {
        /**
         * Generate a looking random token for various uses.
         *
-        * @return String The new random token
-        * @deprecated since 1.20; Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
+        * @return string The new random token
+        * @deprecated since 1.20: Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
         */
        public static function generateToken() {
                return MWCryptRand::generateHex( 32 );
@@ -3524,8 +3588,8 @@ class User {
         *
         * @param string $val Input value to compare
         * @param string $salt Optional function-specific data for hashing
-        * @param $request WebRequest object to use or null to use $wgRequest
-        * @return Boolean: Whether the token matches
+        * @param WebRequest $request Object to use or null to use $wgRequest
+        * @return boolean: Whether the token matches
         */
        public function matchEditToken( $val, $salt = '', $request = null ) {
                $sessionToken = $this->getEditToken( $salt, $request );
@@ -3541,8 +3605,8 @@ class User {
         *
         * @param string $val Input value to compare
         * @param string $salt Optional function-specific data for hashing
-        * @param $request WebRequest object to use or null to use $wgRequest
-        * @return Boolean: Whether the token matches
+        * @param WebRequest $request object to use or null to use $wgRequest
+        * @return boolean: Whether the token matches
         */
        public function matchEditTokenNoSuffix( $val, $salt = '', $request = null ) {
                $sessionToken = $this->getEditToken( $salt, $request );
@@ -3594,7 +3658,7 @@ class User {
         * @return Status
         */
        public function sendMail( $subject, $body, $from = null, $replyto = null ) {
-               if( is_null( $from ) ) {
+               if ( is_null( $from ) ) {
                        global $wgPasswordSender, $wgPasswordSenderName;
                        $sender = new MailAddress( $wgPasswordSender, $wgPasswordSenderName );
                } else {
@@ -3613,9 +3677,9 @@ class User {
         * this change to the database.
         *
         * @param &$expiration \mixed Accepts the expiration time
-        * @return String New token
+        * @return string New token
         */
-       private function confirmationToken( &$expiration ) {
+       protected function confirmationToken( &$expiration ) {
                global $wgUserEmailConfirmationTokenExpiry;
                $now = time();
                $expires = $now + $wgUserEmailConfirmationTokenExpiry;
@@ -3631,18 +3695,18 @@ class User {
        /**
         * Return a URL the user can use to confirm their email address.
         * @param string $token Accepts the email confirmation token
-        * @return String New token URL
+        * @return string New token URL
         */
-       private function confirmationTokenUrl( $token ) {
+       protected function confirmationTokenUrl( $token ) {
                return $this->getTokenUrl( 'ConfirmEmail', $token );
        }
 
        /**
         * Return a URL the user can use to invalidate their email address.
         * @param string $token Accepts the email confirmation token
-        * @return String New token URL
+        * @return string New token URL
         */
-       private function invalidationTokenUrl( $token ) {
+       protected function invalidationTokenUrl( $token ) {
                return $this->getTokenUrl( 'InvalidateEmail', $token );
        }
 
@@ -3658,12 +3722,12 @@ class User {
         *
         * @param string $page Special page
         * @param string $token Token
-        * @return String Formatted URL
+        * @return string Formatted URL
         */
        protected function getTokenUrl( $page, $token ) {
                // Hack to bypass localization of 'Special:'
                $title = Title::makeTitle( NS_MAIN, "Special:$page/$token" );
-               return $title->getCanonicalUrl();
+               return $title->getCanonicalURL();
        }
 
        /**
@@ -3674,8 +3738,12 @@ class User {
         * @return bool
         */
        public function confirmEmail() {
-               $this->setEmailAuthenticationTimestamp( wfTimestampNow() );
-               wfRunHooks( 'ConfirmEmailComplete', array( $this ) );
+               // Check if it's already confirmed, so we don't touch the database
+               // and fire the ConfirmEmailComplete hook on redundant confirmations.
+               if ( !$this->isEmailConfirmed() ) {
+                       $this->setEmailAuthenticationTimestamp( wfTimestampNow() );
+                       wfRunHooks( 'ConfirmEmailComplete', array( $this ) );
+               }
                return true;
        }
 
@@ -3708,11 +3776,11 @@ class User {
        /**
         * Is this user allowed to send e-mails within limits of current
         * site configuration?
-        * @return Bool
+        * @return bool
         */
        public function canSendEmail() {
                global $wgEnableEmail, $wgEnableUserEmail;
-               if( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
+               if ( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
                        return false;
                }
                $canSend = $this->isEmailConfirmed();
@@ -3723,7 +3791,7 @@ class User {
        /**
         * Is this user allowed to receive e-mails within limits of current
         * site configuration?
-        * @return Bool
+        * @return bool
         */
        public function canReceiveEmail() {
                return $this->isEmailConfirmed() && !$this->getOption( 'disablemail' );
@@ -3737,20 +3805,20 @@ class User {
         * confirmed their address by returning a code or using a password
         * sent to the address from the wiki.
         *
-        * @return Bool
+        * @return bool
         */
        public function isEmailConfirmed() {
                global $wgEmailAuthentication;
                $this->load();
                $confirmed = true;
-               if( wfRunHooks( 'EmailConfirmed', array( &$this, &$confirmed ) ) ) {
-                       if( $this->isAnon() ) {
+               if ( wfRunHooks( 'EmailConfirmed', array( &$this, &$confirmed ) ) ) {
+                       if ( $this->isAnon() ) {
                                return false;
                        }
-                       if( !Sanitizer::validateEmail( $this->mEmail ) ) {
+                       if ( !Sanitizer::validateEmail( $this->mEmail ) ) {
                                return false;
                        }
-                       if( $wgEmailAuthentication && !$this->getEmailAuthenticationTimestamp() ) {
+                       if ( $wgEmailAuthentication && !$this->getEmailAuthenticationTimestamp() ) {
                                return false;
                        }
                        return true;
@@ -3761,7 +3829,7 @@ class User {
 
        /**
         * Check whether there is an outstanding request for e-mail confirmation.
-        * @return Bool
+        * @return bool
         */
        public function isEmailConfirmationPending() {
                global $wgEmailAuthentication;
@@ -3774,9 +3842,9 @@ class User {
        /**
         * Get the timestamp of account creation.
         *
-        * @return String|Bool|Null Timestamp of account creation, false for
-        *     non-existent/anonymous user accounts, or null if existing account
-        *     but information is not in database.
+        * @return string|bool|null Timestamp of account creation, false for
+        *  non-existent/anonymous user accounts, or null if existing account
+        *  but information is not in database.
         */
        public function getRegistration() {
                if ( $this->isAnon() ) {
@@ -3789,11 +3857,11 @@ class User {
        /**
         * Get the timestamp of the first edit
         *
-        * @return String|Bool Timestamp of first edit, or false for
-        *     non-existent/anonymous user accounts.
+        * @return string|bool Timestamp of first edit, or false for
+        *  non-existent/anonymous user accounts.
         */
        public function getFirstEditTimestamp() {
-               if( $this->getId() == 0 ) {
+               if ( $this->getId() == 0 ) {
                        return false; // anons
                }
                $dbr = wfGetDB( DB_SLAVE );
@@ -3802,7 +3870,7 @@ class User {
                        __METHOD__,
                        array( 'ORDER BY' => 'rev_timestamp ASC' )
                );
-               if( !$time ) {
+               if ( !$time ) {
                        return false; // no edits
                }
                return wfTimestamp( TS_MW, $time );
@@ -3818,16 +3886,16 @@ class User {
                global $wgGroupPermissions, $wgRevokePermissions;
                $rights = array();
                // grant every granted permission first
-               foreach( $groups as $group ) {
-                       if( isset( $wgGroupPermissions[$group] ) ) {
+               foreach ( $groups as $group ) {
+                       if ( isset( $wgGroupPermissions[$group] ) ) {
                                $rights = array_merge( $rights,
                                        // array_filter removes empty items
                                        array_keys( array_filter( $wgGroupPermissions[$group] ) ) );
                        }
                }
                // now revoke the revoked permissions
-               foreach( $groups as $group ) {
-                       if( isset( $wgRevokePermissions[$group] ) ) {
+               foreach ( $groups as $group ) {
+                       if ( isset( $wgRevokePermissions[$group] ) ) {
                                $rights = array_diff( $rights,
                                        array_keys( array_filter( $wgRevokePermissions[$group] ) ) );
                        }
@@ -3855,6 +3923,7 @@ class User {
        /**
         * Check, if the given group has the given permission
         *
+        * @since 1.21
         * @param string $group Group to check
         * @param string $role Role to check
         * @return bool
@@ -3869,7 +3938,7 @@ class User {
         * Get the localized descriptive name for a group, if it exists
         *
         * @param string $group Internal group name
-        * @return String Localized descriptive group name
+        * @return string Localized descriptive group name
         */
        public static function getGroupName( $group ) {
                $msg = wfMessage( "group-$group" );
@@ -3881,7 +3950,7 @@ class User {
         *
         * @param string $group Internal group name
         * @param string $username Username for gender (since 1.19)
-        * @return String Localized name for group member
+        * @return string Localized name for group member
         */
        public static function getGroupMember( $group, $username = '#' ) {
                $msg = wfMessage( "group-$group-member", $username );
@@ -3934,14 +4003,15 @@ class User {
         * Get the title of a page describing a particular group
         *
         * @param string $group Internal group name
-        * @return Title|Bool Title of the page if it exists, false otherwise
+        * @return Title|bool Title of the page if it exists, false otherwise
         */
        public static function getGroupPage( $group ) {
                $msg = wfMessage( 'grouppage-' . $group )->inContentLanguage();
-               if( $msg->exists() ) {
+               if ( $msg->exists() ) {
                        $title = Title::newFromText( $msg->text() );
-                       if( is_object( $title ) )
+                       if ( is_object( $title ) ) {
                                return $title;
+                       }
                }
                return false;
        }
@@ -3952,14 +4022,14 @@ class User {
         *
         * @param string $group Internal name of the group
         * @param string $text The text of the link
-        * @return String HTML link to the group
+        * @return string HTML link to the group
         */
        public static function makeGroupLinkHTML( $group, $text = '' ) {
-               if( $text == '' ) {
+               if ( $text == '' ) {
                        $text = self::getGroupName( $group );
                }
                $title = self::getGroupPage( $group );
-               if( $title ) {
+               if ( $title ) {
                        return Linker::link( $title, htmlspecialchars( $text ) );
                } else {
                        return $text;
@@ -3972,14 +4042,14 @@ class User {
         *
         * @param string $group Internal name of the group
         * @param string $text The text of the link
-        * @return String Wikilink to the group
+        * @return string Wikilink to the group
         */
        public static function makeGroupLinkWiki( $group, $text = '' ) {
-               if( $text == '' ) {
+               if ( $text == '' ) {
                        $text = self::getGroupName( $group );
                }
                $title = self::getGroupPage( $group );
-               if( $title ) {
+               if ( $title ) {
                        $page = $title->getPrefixedText();
                        return "[[$page|$text]]";
                } else {
@@ -4000,53 +4070,53 @@ class User {
                global $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
 
                $groups = array( 'add' => array(), 'remove' => array(), 'add-self' => array(), 'remove-self' => array() );
-               if( empty( $wgAddGroups[$group] ) ) {
+               if ( empty( $wgAddGroups[$group] ) ) {
                        // Don't add anything to $groups
-               } elseif( $wgAddGroups[$group] === true ) {
+               } elseif ( $wgAddGroups[$group] === true ) {
                        // You get everything
                        $groups['add'] = self::getAllGroups();
-               } elseif( is_array( $wgAddGroups[$group] ) ) {
+               } elseif ( is_array( $wgAddGroups[$group] ) ) {
                        $groups['add'] = $wgAddGroups[$group];
                }
 
                // Same thing for remove
-               if( empty( $wgRemoveGroups[$group] ) ) {
-               } elseif( $wgRemoveGroups[$group] === true ) {
+               if ( empty( $wgRemoveGroups[$group] ) ) {
+               } elseif ( $wgRemoveGroups[$group] === true ) {
                        $groups['remove'] = self::getAllGroups();
-               } elseif( is_array( $wgRemoveGroups[$group] ) ) {
+               } elseif ( is_array( $wgRemoveGroups[$group] ) ) {
                        $groups['remove'] = $wgRemoveGroups[$group];
                }
 
                // Re-map numeric keys of AddToSelf/RemoveFromSelf to the 'user' key for backwards compatibility
-               if( empty( $wgGroupsAddToSelf['user']) || $wgGroupsAddToSelf['user'] !== true ) {
-                       foreach( $wgGroupsAddToSelf as $key => $value ) {
-                               if( is_int( $key ) ) {
+               if ( empty( $wgGroupsAddToSelf['user'] ) || $wgGroupsAddToSelf['user'] !== true ) {
+                       foreach ( $wgGroupsAddToSelf as $key => $value ) {
+                               if ( is_int( $key ) ) {
                                        $wgGroupsAddToSelf['user'][] = $value;
                                }
                        }
                }
 
-               if( empty( $wgGroupsRemoveFromSelf['user']) || $wgGroupsRemoveFromSelf['user'] !== true ) {
-                       foreach( $wgGroupsRemoveFromSelf as $key => $value ) {
-                               if( is_int( $key ) ) {
+               if ( empty( $wgGroupsRemoveFromSelf['user'] ) || $wgGroupsRemoveFromSelf['user'] !== true ) {
+                       foreach ( $wgGroupsRemoveFromSelf as $key => $value ) {
+                               if ( is_int( $key ) ) {
                                        $wgGroupsRemoveFromSelf['user'][] = $value;
                                }
                        }
                }
 
                // Now figure out what groups the user can add to him/herself
-               if( empty( $wgGroupsAddToSelf[$group] ) ) {
-               } elseif( $wgGroupsAddToSelf[$group] === true ) {
+               if ( empty( $wgGroupsAddToSelf[$group] ) ) {
+               } elseif ( $wgGroupsAddToSelf[$group] === true ) {
                        // No idea WHY this would be used, but it's there
                        $groups['add-self'] = User::getAllGroups();
-               } elseif( is_array( $wgGroupsAddToSelf[$group] ) ) {
+               } elseif ( is_array( $wgGroupsAddToSelf[$group] ) ) {
                        $groups['add-self'] = $wgGroupsAddToSelf[$group];
                }
 
-               if( empty( $wgGroupsRemoveFromSelf[$group] ) ) {
-               } elseif( $wgGroupsRemoveFromSelf[$group] === true ) {
+               if ( empty( $wgGroupsRemoveFromSelf[$group] ) ) {
+               } elseif ( $wgGroupsRemoveFromSelf[$group] === true ) {
                        $groups['remove-self'] = User::getAllGroups();
-               } elseif( is_array( $wgGroupsRemoveFromSelf[$group] ) ) {
+               } elseif ( is_array( $wgGroupsRemoveFromSelf[$group] ) ) {
                        $groups['remove-self'] = $wgGroupsRemoveFromSelf[$group];
                }
 
@@ -4061,7 +4131,7 @@ class User {
         *  'remove-self' => array( removable groups from self) )
         */
        public function changeableGroups() {
-               if( $this->isAllowed( 'userrights' ) ) {
+               if ( $this->isAllowed( 'userrights' ) ) {
                        // This group gives the right to modify everything (reverse-
                        // compatibility with old "userrights lets you change
                        // everything")
@@ -4084,7 +4154,7 @@ class User {
                );
                $addergroups = $this->getEffectiveGroups();
 
-               foreach( $addergroups as $addergroup ) {
+               foreach ( $addergroups as $addergroup ) {
                        $groups = array_merge_recursive(
                                $groups, $this->changeableByGroup( $addergroup )
                        );
@@ -4101,7 +4171,7 @@ class User {
         * Will have no effect for anonymous users.
         */
        public function incEditCount() {
-               if( !$this->isAnon() ) {
+               if ( !$this->isAnon() ) {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update(
                                'user',
@@ -4111,10 +4181,10 @@ class User {
                        );
 
                        // Lazy initialization check...
-                       if( $dbw->affectedRows() == 0 ) {
+                       if ( $dbw->affectedRows() == 0 ) {
                                // Now here's a goddamn hack...
                                $dbr = wfGetDB( DB_SLAVE );
-                               if( $dbr !== $dbw ) {
+                               if ( $dbr !== $dbw ) {
                                        // If we actually have a slave server, the count is
                                        // at least one behind because the current transaction
                                        // has not been committed and replicated.
@@ -4135,7 +4205,7 @@ class User {
         * Initialize user_editcount from data out of the revision table
         *
         * @param $add Integer Edits to add to the count from the revision table
-        * @return Integer Number of edits
+        * @return integer Number of edits
         */
        protected function initEditCount( $add = 0 ) {
                // Pull from a slave to be less cruel to servers
@@ -4164,7 +4234,7 @@ class User {
         * Get the description of a given right
         *
         * @param string $right Right to query
-        * @return String Localized description of the right
+        * @return string Localized description of the right
         */
        public static function getRightDescription( $right ) {
                $key = "right-$right";
@@ -4177,7 +4247,7 @@ class User {
         *
         * @param string $password Plain-text password
         * @param string $userId User ID
-        * @return String Password hash
+        * @return string Password hash
         */
        public static function oldCrypt( $password, $userId ) {
                global $wgPasswordSalt;
@@ -4193,19 +4263,18 @@ class User {
         *
         * @param string $password Plain-text password
         * @param bool|string $salt Optional salt, may be random or the user ID.
-
-        *                     If unspecified or false, will generate one automatically
-        * @return String Password hash
+        *  If unspecified or false, will generate one automatically
+        * @return string Password hash
         */
        public static function crypt( $password, $salt = false ) {
                global $wgPasswordSalt;
 
                $hash = '';
-               if( !wfRunHooks( 'UserCryptPassword', array( &$password, &$salt, &$wgPasswordSalt, &$hash ) ) ) {
+               if ( !wfRunHooks( 'UserCryptPassword', array( &$password, &$salt, &$wgPasswordSalt, &$hash ) ) ) {
                        return $hash;
                }
 
-               if( $wgPasswordSalt ) {
+               if ( $wgPasswordSalt ) {
                        if ( $salt === false ) {
                                $salt = MWCryptRand::generateHex( 8 );
                        }
@@ -4223,25 +4292,25 @@ class User {
         * @param string $password Plain-text password to compare
         * @param string|bool $userId User ID for old-style password salt
         *
-        * @return Boolean
+        * @return boolean
         */
        public static function comparePasswords( $hash, $password, $userId = false ) {
                $type = substr( $hash, 0, 3 );
 
                $result = false;
-               if( !wfRunHooks( 'UserComparePasswords', array( &$hash, &$password, &$userId, &$result ) ) ) {
+               if ( !wfRunHooks( 'UserComparePasswords', array( &$hash, &$password, &$userId, &$result ) ) ) {
                        return $result;
                }
 
                if ( $type == ':A:' ) {
-                       # Unsalted
+                       // Unsalted
                        return md5( $password ) === substr( $hash, 3 );
                } elseif ( $type == ':B:' ) {
-                       # Salted
+                       // Salted
                        list( $salt, $realHash ) = explode( ':', substr( $hash, 3 ), 2 );
-                       return md5( $salt.'-'.md5( $password ) ) === $realHash;
+                       return md5( $salt . '-' . md5( $password ) ) === $realHash;
                } else {
-                       # Old-style
+                       // Old-style
                        return self::oldCrypt( $password, $userId ) === $hash;
                }
        }
@@ -4257,6 +4326,7 @@ class User {
         *       no matter the value of $wgUser
         *     - 'create2' for a logged in user creating an account for someone else
         *     - 'byemail' when the created user will receive its password by e-mail
+        *     - 'autocreate' when the user is automatically created (such as by CentralAuth).
         *   - Boolean means whether the account was created by e-mail (deprecated):
         *     - true will be converted to 'byemail'
         *     - false will be converted to 'create' if this object is the same as
@@ -4268,7 +4338,7 @@ class User {
         */
        public function addNewUserLogEntry( $action = false, $reason = '' ) {
                global $wgUser, $wgNewUserLog;
-               if( empty( $wgNewUserLog ) ) {
+               if ( empty( $wgNewUserLog ) ) {
                        return true; // disabled
                }
 
@@ -4348,11 +4418,11 @@ class User {
                // Maybe load from the object
                if ( !is_null( $this->mOptionOverrides ) ) {
                        wfDebug( "User: loading options for user " . $this->getId() . " from override cache.\n" );
-                       foreach( $this->mOptionOverrides as $key => $value ) {
+                       foreach ( $this->mOptionOverrides as $key => $value ) {
                                $this->mOptions[$key] = $value;
                        }
                } else {
-                       if( !is_array( $data ) ) {
+                       if ( !is_array( $data ) ) {
                                wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
                                // Load from database
                                $dbr = wfGetDB( DB_SLAVE );
@@ -4385,8 +4455,6 @@ class User {
         * @todo document
         */
        protected function saveOptions() {
-               global $wgAllowPrefChange;
-
                $this->loadOptions();
 
                // Not using getOptions(), to keep hidden preferences in database
@@ -4394,15 +4462,14 @@ class User {
 
                // Allow hooks to abort, for instance to save to a global profile.
                // Reset options to default state before saving.
-               if( !wfRunHooks( 'UserSaveOptions', array( $this, &$saveOptions ) ) ) {
+               if ( !wfRunHooks( 'UserSaveOptions', array( $this, &$saveOptions ) ) ) {
                        return;
                }
 
-               $extuser = ExternalUser::newFromUser( $this );
                $userId = $this->getId();
                $insert_rows = array();
-               foreach( $saveOptions as $key => $value ) {
-                       # Don't bother storing default values
+               foreach ( $saveOptions as $key => $value ) {
+                       // Don't bother storing default values
                        $defaultOption = self::getDefaultOption( $key );
                        if ( ( is_null( $defaultOption ) &&
                                        !( $value === false || is_null( $value ) ) ) ||
@@ -4413,21 +4480,21 @@ class User {
                                                'up_value' => $value,
                                        );
                        }
-                       if ( $extuser && isset( $wgAllowPrefChange[$key] ) ) {
-                               switch ( $wgAllowPrefChange[$key] ) {
-                                       case 'local':
-                                       case 'message':
-                                               break;
-                                       case 'semiglobal':
-                                       case 'global':
-                                               $extuser->setPref( $key, $value );
-                               }
-                       }
                }
 
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'user_properties', array( 'up_user' => $userId ), __METHOD__ );
-               $dbw->insert( 'user_properties', $insert_rows, __METHOD__ );
+               $hasRows = $dbw->selectField( 'user_properties', '1',
+                       array( 'up_user' => $userId ), __METHOD__ );
+
+               if ( $hasRows ) {
+                       // Only do this delete if there is something there. A very large portion of
+                       // calls to this function are for setting 'rememberpassword' for new accounts.
+                       // Doing this delete for new accounts with no rows in the table rougly causes
+                       // gap locks on [max user ID,+infinity) which causes high contention since many
+                       // updates will pile up on each other since they are for higher (newer) user IDs.
+                       $dbw->delete( 'user_properties', array( 'up_user' => $userId ), __METHOD__ );
+               }
+               $dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
        }
 
        /**
@@ -4451,8 +4518,7 @@ class User {
         *
         * @return array Array of HTML attributes suitable for feeding to
         *   Html::element(), directly or indirectly.  (Don't feed to Xml::*()!
-        *   That will potentially output invalid XHTML 1.0 Transitional, and will
-        *   get confused by the boolean attribute syntax used.)
+        *   That will get confused by the boolean attribute syntax used.)
         */
        public static function passwordChangeInputAttribs() {
                global $wgMinimalPasswordLength;
index 3b8f5c1..1f55ef3 100644 (file)
@@ -44,7 +44,7 @@ abstract class UserArray implements Iterator {
                $ids = array_map( 'intval', (array)$ids ); // paranoia
                if ( !$ids ) {
                        // Database::select() doesn't like empty arrays
-                       return new ArrayIterator(array());
+                       return new ArrayIterator( array() );
                }
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'user', '*', array( 'user_id' => $ids ),
index 6eb9917..e48070a 100644 (file)
@@ -119,7 +119,7 @@ class UserMailer {
         */
        static function arrayToHeaderString( $headers, $endl = "\n" ) {
                $strings = array();
-               foreach( $headers as $name => $value ) {
+               foreach ( $headers as $name => $value ) {
                        $strings[] = "$name: $value";
                }
                return implode( $endl, $strings );
@@ -260,7 +260,7 @@ class UserMailer {
                                wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" );
                        }
                        else {
-                               require_once( 'Mail/mime.php' );
+                               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'] );
@@ -300,7 +300,7 @@ class UserMailer {
                        if ( !stream_resolve_include_path( 'Mail.php' ) ) {
                                throw new MWException( 'PEAR mail package is not installed' );
                        }
-                       require_once( 'Mail.php' );
+                       require_once 'Mail.php';
 
                        wfSuppressWarnings();
 
@@ -338,7 +338,7 @@ class UserMailer {
                        #
                        # PHP mail()
                        #
-                       if( count( $to ) > 1 ) {
+                       if ( count( $to ) > 1 ) {
                                $headers['To'] = 'undisclosed-recipients:;';
                        }
                        $headers = self::arrayToHeaderString( $headers, $endl );
@@ -409,7 +409,7 @@ class UserMailer {
         */
        public static function quotedPrintable( $string, $charset = '' ) {
                # Probably incomplete; see RFC 2045
-               if( empty( $charset ) ) {
+               if ( empty( $charset ) ) {
                        $charset = 'UTF-8';
                }
                $charset = strtoupper( $charset );
@@ -417,7 +417,7 @@ class UserMailer {
 
                $illegal = '\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\xff=';
                $replace = $illegal . '\t ?_';
-               if( !preg_match( "/[$illegal]/", $string ) ) {
+               if ( !preg_match( "/[$illegal]/", $string ) ) {
                        return $string;
                }
                $out = "=?$charset?Q?";
@@ -605,6 +605,7 @@ class EmailNotification {
 
                wfRunHooks( 'UpdateUserMailerFormattedPageStatus', array( &$formattedPageStatus ) );
                if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Not a valid page status!' );
                }
 
@@ -696,20 +697,20 @@ class EmailNotification {
 
                $keys = array();
                $postTransformKeys = array();
-               $pageTitleUrl = $this->title->getCanonicalUrl();
+               $pageTitleUrl = $this->title->getCanonicalURL();
                $pageTitle = $this->title->getPrefixedText();
 
                if ( $this->oldid ) {
                        // Always show a link to the diff which triggered the mail. See bug 32210.
                        $keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
-                               $this->title->getCanonicalUrl( 'diff=next&oldid=' . $this->oldid ) )
+                               $this->title->getCanonicalURL( array( 'diff' => 'next', 'oldid' => $this->oldid ) ) )
                                ->inContentLanguage()->text();
 
                        if ( !$wgEnotifImpersonal ) {
                                // For personal mail, also show a link to the diff of all changes
                                // since last visited.
                                $keys['$NEWPAGE'] .= "\n\n" . wfMessage( 'enotif_lastvisited',
-                                       $this->title->getCanonicalUrl( 'diff=0&oldid=' . $this->oldid ) )
+                                       $this->title->getCanonicalURL( array( 'diff' => '0', 'oldid' => $this->oldid ) ) )
                                        ->inContentLanguage()->text();
                        }
                        $keys['$OLDID'] = $this->oldid;
@@ -724,10 +725,10 @@ class EmailNotification {
                }
 
                $keys['$PAGETITLE'] = $this->title->getPrefixedText();
-               $keys['$PAGETITLE_URL'] = $this->title->getCanonicalUrl();
+               $keys['$PAGETITLE_URL'] = $this->title->getCanonicalURL();
                $keys['$PAGEMINOREDIT'] = $this->minorEdit ?
                        wfMessage( 'minoredit' )->inContentLanguage()->text() : '';
-               $keys['$UNWATCHURL'] = $this->title->getCanonicalUrl( 'action=unwatch' );
+               $keys['$UNWATCHURL'] = $this->title->getCanonicalURL( 'action=unwatch' );
 
                if ( $this->editor->isAnon() ) {
                        # real anon (user:xxx.xxx.xxx.xxx)
@@ -738,10 +739,10 @@ class EmailNotification {
                } else {
                        $keys['$PAGEEDITOR'] = $wgEnotifUseRealName ? $this->editor->getRealName() : $this->editor->getName();
                        $emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
-                       $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalUrl();
+                       $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalURL();
                }
 
-               $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalUrl();
+               $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalURL();
 
                # Replace this after transforming the message, bug 35019
                $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
@@ -790,8 +791,9 @@ class EmailNotification {
        function compose( $user ) {
                global $wgEnotifImpersonal;
 
-               if ( !$this->composed_common )
+               if ( !$this->composed_common ) {
                        $this->composeCommonMailtext();
+               }
 
                if ( $wgEnotifImpersonal ) {
                        $this->mailTargets[] = new MailAddress( $user );
index cd5dff8..56bb73f 100644 (file)
@@ -74,7 +74,7 @@ class UserRightsProxy {
         */
        public static function whoIs( $database, $id, $ignoreInvalidDB = false ) {
                $user = self::newFromId( $database, $id, $ignoreInvalidDB );
-               if( $user ) {
+               if ( $user ) {
                        return $user->name;
                } else {
                        return false;
@@ -114,12 +114,12 @@ class UserRightsProxy {
         */
        private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) {
                $db = self::getDB( $database, $ignoreInvalidDB );
-               if( $db ) {
+               if ( $db ) {
                        $row = $db->selectRow( 'user',
                                array( 'user_id', 'user_name' ),
                                array( $field => $value ),
                                __METHOD__ );
-                       if( $row !== false ) {
+                       if ( $row !== false ) {
                                return new UserRightsProxy( $db, $database,
                                        $row->user_name,
                                        intval( $row->user_id ) );
@@ -138,8 +138,8 @@ class UserRightsProxy {
         */
        public static function getDB( $database, $ignoreInvalidDB = false ) {
                global $wgDBname;
-               if( self::validDatabase( $database ) ) {
-                       if( $database == $wgDBname ) {
+               if ( self::validDatabase( $database ) ) {
+                       if ( $database == $wgDBname ) {
                                // Hmm... this shouldn't happen though. :)
                                return wfGetDB( DB_MASTER );
                        } else {
index 5ac92f7..45aa822 100644 (file)
@@ -89,6 +89,12 @@ class WatchedItem {
                }
                $this->loaded = true;
 
+               // Only loggedin user can have a watchlist
+               if ( $this->mUser->isAnon() ) {
+                       $this->watched = false;
+                       return;
+               }
+
                # Pages and their talk pages are considered equivalent for watching;
                # remember that talk namespaces are numbered as page namespace+1.
 
@@ -135,6 +141,11 @@ class WatchedItem {
         *        page is not watched or the notification timestamp is already NULL.
         */
        public function resetNotificationTimestamp( $force = '' ) {
+               // Only loggedin user can have a watchlist
+               if ( wfReadOnly() || $this->mUser->isAnon() ) {
+                       return;
+               }
+
                if ( $force != 'force' ) {
                        $this->load();
                        if ( !$this->watched || $this->timestamp === null ) {
@@ -153,11 +164,17 @@ class WatchedItem {
        /**
         * Given a title and user (assumes the object is setup), add the watch to the
         * database.
-        * @return bool (always true)
+        * @return bool
         */
        public function addWatch() {
                wfProfileIn( __METHOD__ );
 
+               // Only loggedin user can have a watchlist
+               if ( wfReadOnly() || $this->mUser->isAnon() ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
                // Use INSERT IGNORE to avoid overwriting the notification timestamp
                // if there's already an entry for this page
                $dbw = wfGetDB( DB_MASTER );
@@ -192,6 +209,12 @@ class WatchedItem {
        public function removeWatch() {
                wfProfileIn( __METHOD__ );
 
+               // Only loggedin user can have a watchlist
+               if ( wfReadOnly() || $this->mUser->isAnon() ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
                $success = false;
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'watchlist',
@@ -268,7 +291,7 @@ class WatchedItem {
                        );
                }
 
-               if( empty( $values ) ) {
+               if ( empty( $values ) ) {
                        // Nothing to do
                        return true;
                }
index 98007ef..dbd0740 100644 (file)
@@ -91,11 +91,11 @@ class WebRequest {
                        wfSuppressWarnings();
                        $a = parse_url( $url );
                        wfRestoreWarnings();
-                       if( $a ) {
+                       if ( $a ) {
                                $path = isset( $a['path'] ) ? $a['path'] : '';
 
                                global $wgScript;
-                               if( $path == $wgScript && $want !== 'all' ) {
+                               if ( $path == $wgScript && $want !== 'all' ) {
                                        // Script inside a rewrite path?
                                        // Abort to keep from breaking...
                                        return $matches;
@@ -106,7 +106,7 @@ class WebRequest {
                                // Raw PATH_INFO style
                                $router->add( "$wgScript/$1" );
 
-                               if( isset( $_SERVER['SCRIPT_NAME'] )
+                               if ( isset( $_SERVER['SCRIPT_NAME'] )
                                        && preg_match( '/\.php5?/', $_SERVER['SCRIPT_NAME'] ) )
                                {
                                        # Check for SCRIPT_NAME, we handle index.php explicitly
@@ -116,17 +116,17 @@ class WebRequest {
                                }
 
                                global $wgArticlePath;
-                               if( $wgArticlePath ) {
+                               if ( $wgArticlePath ) {
                                        $router->add( $wgArticlePath );
                                }
 
                                global $wgActionPaths;
-                               if( $wgActionPaths ) {
+                               if ( $wgActionPaths ) {
                                        $router->add( $wgActionPaths, array( 'action' => '$key' ) );
                                }
 
                                global $wgVariantArticlePath, $wgContLang;
-                               if( $wgVariantArticlePath ) {
+                               if ( $wgVariantArticlePath ) {
                                        $router->add( $wgVariantArticlePath,
                                                array( 'variant' => '$2' ),
                                                array( '$2' => $wgContLang->getVariants() )
@@ -224,7 +224,7 @@ class WebRequest {
                }
 
                $matches = self::getPathInfo( 'title' );
-               foreach( $matches as $key => $val) {
+               foreach ( $matches as $key => $val ) {
                        $this->data[$key] = $_GET[$key] = $_REQUEST[$key] = $val;
                }
        }
@@ -240,15 +240,15 @@ class WebRequest {
         * @return array of URL variables to interpolate; empty if no match
         */
        static function extractTitle( $path, $bases, $key = false ) {
-               foreach( (array)$bases as $keyValue => $base ) {
+               foreach ( (array)$bases as $keyValue => $base ) {
                        // Find the part after $wgArticlePath
                        $base = str_replace( '$1', '', $base );
                        $baseLen = strlen( $base );
-                       if( substr( $path, 0, $baseLen ) == $base ) {
+                       if ( substr( $path, 0, $baseLen ) == $base ) {
                                $raw = substr( $path, $baseLen );
-                               if( $raw !== '' ) {
+                               if ( $raw !== '' ) {
                                        $matches = array( 'title' => rawurldecode( $raw ) );
-                                       if( $key ) {
+                                       if ( $key ) {
                                                $matches[$key] = $keyValue;
                                        }
                                        return $matches;
@@ -271,8 +271,8 @@ class WebRequest {
         */
        private function &fix_magic_quotes( &$arr, $topLevel = true ) {
                $clean = array();
-               foreach( $arr as $key => $val ) {
-                       if( is_array( $val ) ) {
+               foreach ( $arr as $key => $val ) {
+                       if ( is_array( $val ) ) {
                                $cleanKey = $topLevel ? stripslashes( $key ) : $key;
                                $clean[$cleanKey] = $this->fix_magic_quotes( $arr[$key], false );
                        } else {
@@ -293,7 +293,7 @@ class WebRequest {
        private function checkMagicQuotes() {
                $mustFixQuotes = function_exists( 'get_magic_quotes_gpc' )
                        && get_magic_quotes_gpc();
-               if( $mustFixQuotes ) {
+               if ( $mustFixQuotes ) {
                        $this->fix_magic_quotes( $_COOKIE );
                        $this->fix_magic_quotes( $_ENV );
                        $this->fix_magic_quotes( $_GET );
@@ -311,8 +311,8 @@ class WebRequest {
         * @private
         */
        function normalizeUnicode( $data ) {
-               if( is_array( $data ) ) {
-                       foreach( $data as $key => $val ) {
+               if ( is_array( $data ) ) {
+                       foreach ( $data as $key => $val ) {
                                $data[$key] = $this->normalizeUnicode( $val );
                        }
                } else {
@@ -335,19 +335,18 @@ class WebRequest {
                # http://us2.php.net/variables.external#language.variables.external.dot-in-names
                # Work around PHP *feature* to avoid *bugs* elsewhere.
                $name = strtr( $name, '.', '_' );
-               if( isset( $arr[$name] ) ) {
+               if ( isset( $arr[$name] ) ) {
                        global $wgContLang;
                        $data = $arr[$name];
-                       if( isset( $_GET[$name] ) && !is_array( $data ) ) {
+                       if ( isset( $_GET[$name] ) && !is_array( $data ) ) {
                                # Check for alternate/legacy character encoding.
-                               if( isset( $wgContLang ) ) {
+                               if ( isset( $wgContLang ) ) {
                                        $data = $wgContLang->checkTitleEncoding( $data );
                                }
                        }
                        $data = $this->normalizeUnicode( $data );
                        return $data;
                } else {
-                       taint( $default );
                        return $default;
                }
        }
@@ -364,10 +363,10 @@ class WebRequest {
         */
        public function getVal( $name, $default = null ) {
                $val = $this->getGPCVal( $this->data, $name, $default );
-               if( is_array( $val ) ) {
+               if ( is_array( $val ) ) {
                        $val = $default;
                }
-               if( is_null( $val ) ) {
+               if ( is_null( $val ) ) {
                        return $val;
                } else {
                        return (string)$val;
@@ -414,7 +413,7 @@ class WebRequest {
         */
        public function getArray( $name, $default = null ) {
                $val = $this->getGPCVal( $this->data, $name, $default );
-               if( is_null( $val ) ) {
+               if ( is_null( $val ) ) {
                        return null;
                } else {
                        return (array)$val;
@@ -433,7 +432,7 @@ class WebRequest {
         */
        public function getIntArray( $name, $default = null ) {
                $val = $this->getArray( $name, $default );
-               if( is_array( $val ) ) {
+               if ( is_array( $val ) ) {
                        $val = array_map( 'intval', $val );
                }
                return $val;
@@ -603,7 +602,7 @@ class WebRequest {
         * @return Boolean
         */
        public function checkSessionCookie() {
-               return isset( $_COOKIE[ session_name() ] );
+               return isset( $_COOKIE[session_name()] );
        }
 
        /**
@@ -615,7 +614,7 @@ class WebRequest {
         * @return Mixed: cookie value or $default if the cookie not set
         */
        public function getCookie( $key, $prefix = null, $default = null ) {
-               if( $prefix === null ) {
+               if ( $prefix === null ) {
                        global $wgCookiePrefix;
                        $prefix = $wgCookiePrefix;
                }
@@ -630,14 +629,14 @@ class WebRequest {
         * @return String
         */
        public function getRequestURL() {
-               if( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
+               if ( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
                        $base = $_SERVER['REQUEST_URI'];
                } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {
                        // Probably IIS; doesn't set REQUEST_URI
                        $base = $_SERVER['HTTP_X_ORIGINAL_URL'];
-               } elseif( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+               } elseif ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
                        $base = $_SERVER['SCRIPT_NAME'];
-                       if( isset( $_SERVER['QUERY_STRING'] ) && $_SERVER['QUERY_STRING'] != '' ) {
+                       if ( isset( $_SERVER['QUERY_STRING'] ) && $_SERVER['QUERY_STRING'] != '' ) {
                                $base .= '?' . $_SERVER['QUERY_STRING'];
                        }
                } else {
@@ -651,14 +650,16 @@ class WebRequest {
                // need to strip it or we get false-positive redirect loops
                // or weird output URLs
                $hash = strpos( $base, '#' );
-               if( $hash !== false ) {
+               if ( $hash !== false ) {
                        $base = substr( $base, 0, $hash );
                }
-               if( $base[0] == '/' ) {
-                       return $base;
+
+               if ( $base[0] == '/' ) {
+                       // More than one slash will look like it is protocol relative
+                       return preg_replace( '!^/+!', '/', $base );
                } else {
                        // We may get paths with a host prepended; strip it.
-                       return preg_replace( '!^[^:]+://[^/]+/!', '/', $base );
+                       return preg_replace( '!^[^:]+://[^/]+/+!', '/', $base );
                }
        }
 
@@ -737,21 +738,21 @@ class WebRequest {
                global $wgUser;
 
                $limit = $this->getInt( 'limit', 0 );
-               if( $limit < 0 ) {
+               if ( $limit < 0 ) {
                        $limit = 0;
                }
-               if( ( $limit == 0 ) && ( $optionname != '' ) ) {
+               if ( ( $limit == 0 ) && ( $optionname != '' ) ) {
                        $limit = $wgUser->getIntOption( $optionname );
                }
-               if( $limit <= 0 ) {
+               if ( $limit <= 0 ) {
                        $limit = $deflimit;
                }
-               if( $limit > 5000 ) {
+               if ( $limit > 5000 ) {
                        $limit = 5000; # We have *some* limits...
                }
 
                $offset = $this->getInt( 'offset', 0 );
-               if( $offset < 0 ) {
+               if ( $offset < 0 ) {
                        $offset = 0;
                }
 
@@ -844,7 +845,7 @@ class WebRequest {
 
                if ( function_exists( 'apache_request_headers' ) ) {
                        foreach ( apache_request_headers() as $tempName => $tempValue ) {
-                               $this->headers[ strtoupper( $tempName ) ] = $tempValue;
+                               $this->headers[strtoupper( $tempName )] = $tempValue;
                        }
                } else {
                        foreach ( $_SERVER as $name => $value ) {
@@ -891,7 +892,7 @@ class WebRequest {
         * @return Mixed
         */
        public function getSessionData( $key ) {
-               if( !isset( $_SESSION[$key] ) ) {
+               if ( !isset( $_SESSION[$key] ) ) {
                        return null;
                }
                return $_SESSION[$key];
@@ -1097,19 +1098,21 @@ HTML;
                                array_unshift( $ipchain, $ip );
                        }
 
-                       # Step through XFF list and find the last address in the list which is a trusted server
-                       # Set $ip to the IP address given by that trusted server, unless the address is not sensible (e.g. private)
+                       # Step through XFF list and find the last address in the list which is a
+                       # trusted server. Set $ip to the IP address given by that trusted server,
+                       # unless the address is not sensible (e.g. private). However, prefer private
+                       # IP addresses over proxy servers controlled by this site (more sensible).
                        foreach ( $ipchain as $i => $curIP ) {
                                $curIP = IP::canonicalize( $curIP );
-                               if ( wfIsTrustedProxy( $curIP ) ) {
-                                       if ( isset( $ipchain[$i + 1] ) ) {
-                                               if ( $wgUsePrivateIPs || IP::isPublic( $ipchain[$i + 1 ] ) ) {
-                                                       $ip = $ipchain[$i + 1];
-                                               }
+                               if ( wfIsTrustedProxy( $curIP ) && isset( $ipchain[$i + 1] ) ) {
+                                       if ( wfIsConfiguredProxy( $curIP ) || // bug 48919
+                                               ( IP::isPublic( $ipchain[$i + 1] ) || $wgUsePrivateIPs )
+                                       ) {
+                                               $ip = IP::canonicalize( $ipchain[$i + 1] );
+                                               continue;
                                        }
-                               } else {
-                                       break;
                                }
+                               break;
                        }
                }
 
@@ -1266,13 +1269,13 @@ class FauxRequest extends WebRequest {
         * @throws MWException
         */
        public function __construct( $data = array(), $wasPosted = false, $session = null ) {
-               if( is_array( $data ) ) {
+               if ( is_array( $data ) ) {
                        $this->data = $data;
                } else {
                        throw new MWException( "FauxRequest() got bogus data" );
                }
                $this->wasPosted = $wasPosted;
-               if( $session ) {
+               if ( $session ) {
                        $this->session = $session;
                }
        }
@@ -1337,10 +1340,11 @@ class FauxRequest extends WebRequest {
        }
 
        /**
-        * @param $name
+        * @param string $name The name of the header to get (case insensitive).
         * @return bool|string
         */
        public function getHeader( $name ) {
+               $name = strtoupper( $name );
                return isset( $this->headers[$name] ) ? $this->headers[$name] : false;
        }
 
@@ -1349,6 +1353,7 @@ class FauxRequest extends WebRequest {
         * @param $val string
         */
        public function setHeader( $name, $val ) {
+               $name = strtoupper( $name );
                $this->headers[$name] = $val;
        }
 
@@ -1357,7 +1362,7 @@ class FauxRequest extends WebRequest {
         * @return mixed
         */
        public function getSessionData( $key ) {
-               if( isset( $this->session[$key] ) ) {
+               if ( isset( $this->session[$key] ) ) {
                        return $this->session[$key];
                }
                return null;
index 8e15d71..0deae96 100644 (file)
@@ -57,10 +57,10 @@ class WebResponse {
                if ( $expire == 0 ) {
                        $expire = time() + $wgCookieExpiration;
                }
-               if( $prefix === null ) {
+               if ( $prefix === null ) {
                        $prefix = $wgCookiePrefix;
                }
-               if( $domain === null ) {
+               if ( $domain === null ) {
                        $domain = $wgCookieDomain;
                }
 
@@ -116,7 +116,9 @@ class FauxResponse extends WebResponse {
                } else {
                        list( $key, $val ) = array_map( 'trim', explode( ":", $string, 2 ) );
 
-                       if( $replace || !isset( $this->headers[$key] ) ) {
+                       $key = strtoupper( $key );
+
+                       if ( $replace || !isset( $this->headers[$key] ) ) {
                                $this->headers[$key] = $val;
                        }
                }
@@ -127,10 +129,12 @@ class FauxResponse extends WebResponse {
        }
 
        /**
-        * @param $key string
+        * @param string $key The name of the header to get (case insensitive).
         * @return string
         */
        public function getheader( $key ) {
+               $key = strtoupper( $key );
+
                if ( isset( $this->headers[$key] ) ) {
                        return $this->headers[$key];
                }
index e6f3135..ead6d77 100644 (file)
@@ -48,7 +48,7 @@ if ( ini_get( 'register_globals' ) ) {
                'HTTP_SESSION_VARS'
        );
        foreach ( $_REQUEST as $name => $value ) {
-               if( in_array( $name, $verboten ) ) {
+               if ( in_array( $name, $verboten ) ) {
                        header( "HTTP/1.1 500 Internal Server Error" );
                        echo "register_globals security paranoia: trying to overwrite superglobals, aborting.";
                        die( -1 );
@@ -84,62 +84,58 @@ define( 'MEDIAWIKI', true );
 # if we don't have permissions on parent directories.
 $IP = getenv( 'MW_INSTALL_PATH' );
 if ( $IP === false ) {
-       if( realpath( '.' ) ) {
+       if ( realpath( '.' ) ) {
                $IP = realpath( '.' );
        } else {
                $IP = dirname( __DIR__ );
        }
 }
 
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       define( 'MW_COMPILED', 1 );
-} else {
-       # Get MWInit class
-       require_once( "$IP/includes/Init.php" );
+# Get MWInit class
+require_once "$IP/includes/Init.php";
 
-       # Start the autoloader, so that extensions can derive classes from core files
-       require_once( "$IP/includes/AutoLoader.php" );
+# Start the autoloader, so that extensions can derive classes from core files
+require_once "$IP/includes/AutoLoader.php";
 
-       # Load the profiler
-       require_once( "$IP/includes/profiler/Profiler.php" );
+# Load the profiler
+require_once "$IP/includes/profiler/Profiler.php";
 
-       # Load up some global defines.
-       require_once( "$IP/includes/Defines.php" );
-}
+# Load up some global defines.
+require_once "$IP/includes/Defines.php";
 
 # Start the profiler
 $wgProfiler = array();
 if ( file_exists( "$IP/StartProfiler.php" ) ) {
-       require( "$IP/StartProfiler.php" );
+       require "$IP/StartProfiler.php";
 }
 
 wfProfileIn( 'WebStart.php-conf' );
 
 # Load default settings
-require_once( MWInit::compiledPath( "includes/DefaultSettings.php" ) );
+require_once "$IP/includes/DefaultSettings.php";
 
 if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        # Use a callback function to configure MediaWiki
        MWFunction::call( MW_CONFIG_CALLBACK );
 } else {
        if ( !defined( 'MW_CONFIG_FILE' ) ) {
-               define( 'MW_CONFIG_FILE', MWInit::interpretedPath( 'LocalSettings.php' ) );
+               define( 'MW_CONFIG_FILE', "$IP/LocalSettings.php" );
        }
 
        # LocalSettings.php is the per site customization file. If it does not exist
        # the wiki installer needs to be launched or the generated file uploaded to
        # the root wiki directory
-       if( !file_exists( MW_CONFIG_FILE ) ) {
-               require_once( "$IP/includes/templates/NoLocalSettings.php" );
+       if ( !file_exists( MW_CONFIG_FILE ) ) {
+               require_once "$IP/includes/templates/NoLocalSettings.php";
                die();
        }
 
        # Include site settings. $IP may be changed (hopefully before the AutoLoader is invoked)
-       require_once( MW_CONFIG_FILE );
+       require_once MW_CONFIG_FILE;
 }
 
 if ( $wgEnableSelenium ) {
-       require_once( MWInit::compiledPath( "includes/SeleniumWebSettings.php" ) );
+       require_once "$IP/includes/SeleniumWebSettings.php";
 }
 
 wfProfileOut( 'WebStart.php-conf' );
@@ -150,13 +146,11 @@ wfProfileIn( 'WebStart.php-ob_start' );
 # that would cause us to potentially mix gzip and non-gzip output, creating a
 # big mess.
 if ( !defined( 'MW_NO_OUTPUT_BUFFER' ) && ob_get_level() == 0 ) {
-       if ( !defined( 'MW_COMPILED' ) ) {
-               require_once( "$IP/includes/OutputHandler.php" );
-       }
+       require_once "$IP/includes/OutputHandler.php";
        ob_start( 'wfOutputHandler' );
 }
 wfProfileOut( 'WebStart.php-ob_start' );
 
 if ( !defined( 'MW_NO_SETUP' ) ) {
-       require_once( MWInit::compiledPath( "includes/Setup.php" ) );
+       require_once "$IP/includes/Setup.php";
 }
index f8f699c..3f7e19c 100644 (file)
@@ -126,7 +126,7 @@ class MediaWiki {
         * @return Title
         */
        public function getTitle() {
-               if( $this->context->getTitle() === null ) {
+               if ( $this->context->getTitle() === null ) {
                        $this->context->setTitle( $this->parseTitle() );
                }
                return $this->context->getTitle();
@@ -227,7 +227,7 @@ class MediaWiki {
                if ( $title->getInterwiki() != '' ) {
                        $rdfrom = $request->getVal( 'rdfrom' );
                        if ( $rdfrom ) {
-                               $url = $title->getFullURL( 'rdfrom=' . urlencode( $rdfrom ) );
+                               $url = $title->getFullURL( array( 'rdfrom' => $rdfrom ) );
                        } else {
                                $query = $request->getValues();
                                unset( $query['title'] );
@@ -480,7 +480,7 @@ class MediaWiki {
                                $resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
                                $resp->header( 'X-Database-Lag: ' . intval( $lag ) );
                                $resp->header( 'Content-Type: text/plain' );
-                               if( $wgShowHostnames ) {
+                               if ( $wgShowHostnames ) {
                                        echo "Waiting for $host: $lag seconds lagged\n";
                                } else {
                                        echo "Waiting for a database server: $lag seconds lagged\n";
@@ -599,7 +599,7 @@ class MediaWiki {
         * Do a job from the job queue
         */
        private function doJobs() {
-               global $wgJobRunRate;
+               global $wgJobRunRate, $wgPhpCli, $IP;
 
                if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
                        return;
@@ -615,23 +615,36 @@ class MediaWiki {
                        $n = intval( $wgJobRunRate );
                }
 
-               $group = JobQueueGroup::singleton();
-               do {
-                       $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
-                       if ( $job ) {
-                               $output = $job->toString() . "\n";
-                               $t = - microtime( true );
-                               $success = $job->run();
-                               $group->ack( $job ); // done
-                               $t += microtime( true );
-                               $t = round( $t * 1000 );
-                               if ( !$success ) {
-                                       $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
-                               } else {
-                                       $output .= "Success, Time: $t ms\n";
+               if ( !wfShellExecDisabled() && is_executable( $wgPhpCli ) ) {
+                       // Start a background process to run some of the jobs.
+                       // This will be asynchronous on *nix though not on Windows.
+                       wfProfileIn( __METHOD__ . '-exec' );
+                       $retVal = 1;
+                       $cmd = wfShellWikiCmd( "$IP/maintenance/runJobs.php", array( '--maxjobs', $n ) );
+                       wfShellExec( "$cmd &", $retVal );
+                       wfProfileOut( __METHOD__ . '-exec' );
+               } else {
+                       // Fallback to running the jobs here while the user waits
+                       $group = JobQueueGroup::singleton();
+                       do {
+                               $job = $group->pop( JobQueueGroup::USE_CACHE ); // job from any queue
+                               if ( $job ) {
+                                       $output = $job->toString() . "\n";
+                                       $t = - microtime( true );
+                                       wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
+                                       $success = $job->run();
+                                       wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
+                                       $group->ack( $job ); // done
+                                       $t += microtime( true );
+                                       $t = round( $t * 1000 );
+                                       if ( $success === false ) {
+                                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+                                       } else {
+                                               $output .= "Success, Time: $t ms\n";
+                                       }
+                                       wfDebugLog( 'jobqueue', $output );
                                }
-                               wfDebugLog( 'jobqueue', $output );
-                       }
-               } while ( --$n && $job );
+                       } while ( --$n && $job );
+               }
        }
 }
index 6278121..08eb800 100644 (file)
@@ -143,7 +143,7 @@ class WikiXmlError extends WikiError {
        }
 
        function _extractContext( $context, $offset ) {
-               if( is_null( $context ) ) {
+               if ( is_null( $context ) ) {
                        return null;
                } else {
                        // Hopefully integer overflow will be handled transparently here
index b04a784..5d90b12 100644 (file)
@@ -37,7 +37,7 @@ class WikiMap {
                $wgConf->loadFullData();
 
                list( $major, $minor ) = $wgConf->siteFromDB( $wikiID );
-               if( $major === null ) {
+               if ( $major === null ) {
                        return null;
                }
                $canonicalServer = $wgConf->get( 'wgCanonicalServer', $wikiID, $major,
@@ -73,7 +73,7 @@ class WikiMap {
         * @param string $text link's text; optional, default to "User:$user"
         * @return String: HTML link or false if the wiki was not found
         */
-       public static function foreignUserLink( $wikiID, $user, $text=null ) {
+       public static function foreignUserLink( $wikiID, $user, $text = null ) {
                return self::makeForeignLink( $wikiID, "User:$user", $text );
        }
 
@@ -85,7 +85,7 @@ class WikiMap {
         * @param string $text link's text; optional, default to $page
         * @return String: HTML link or false if the wiki was not found
         */
-       public static function makeForeignLink( $wikiID, $page, $text=null ) {
+       public static function makeForeignLink( $wikiID, $page, $text = null ) {
                if ( !$text ) {
                        $text = $page;
                }
@@ -211,15 +211,14 @@ class WikiReference {
        }
 
        /**
-        * Get a URL based on $wgServer, like Title::getFullUrl() would produce
+        * Get a URL based on $wgServer, like Title::getFullURL() would produce
         * when called locally on the wiki.
         *
         * @param string $page page name (must be normalized before calling this function!)
         * @return String: URL
         */
        public function getFullUrl( $page ) {
-               return
-                       $this->mServer .
+               return $this->mServer .
                        $this->getLocalUrl( $page );
        }
 }
index 8d9d740..a3cb4b5 100644 (file)
@@ -187,7 +187,7 @@ class WikiPage implements Page, IDBAccessObject {
         * (and only when) $wgActions[$action] === true. This allows subclasses
         * to override the default behavior.
         *
-        * @todo: move this UI stuff somewhere else
+        * @todo Move this UI stuff somewhere else
         *
         * @return Array
         */
@@ -305,7 +305,7 @@ class WikiPage implements Page, IDBAccessObject {
        public function pageDataFromTitle( $dbr, $title, $options = array() ) {
                return $this->pageData( $dbr, array(
                        'page_namespace' => $title->getNamespace(),
-                       'page_title'     => $title->getDBkey() ), $options );
+                       'page_title' => $title->getDBkey() ), $options );
        }
 
        /**
@@ -462,7 +462,9 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public function isRedirect() {
                $content = $this->getContent();
-               if ( !$content ) return false;
+               if ( !$content ) {
+                       return false;
+               }
 
                return $content->isRedirect();
        }
@@ -646,7 +648,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return String|false The text of the current revision
         * @deprecated as of 1.21, getContent() should be used instead.
         */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo: deprecated, replace usage!
+       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo deprecated, replace usage!
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
                $this->loadLastEdit();
@@ -797,7 +799,7 @@ class WikiPage implements Page, IDBAccessObject {
        public function setCachedLastEditTime( $timestamp ) {
                global $wgMemc;
                $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
-               $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60*15 );
+               $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
        }
 
        /**
@@ -906,10 +908,10 @@ class WikiPage implements Page, IDBAccessObject {
                $dbw = wfGetDB( DB_MASTER );
                $dbw->replace( 'redirect', array( 'rd_from' ),
                        array(
-                               'rd_from'      => $this->getId(),
+                               'rd_from' => $this->getId(),
                                'rd_namespace' => $rt->getNamespace(),
-                               'rd_title'     => $rt->getDBkey(),
-                               'rd_fragment'  => $rt->getFragment(),
+                               'rd_title' => $rt->getDBkey(),
+                               'rd_fragment' => $rt->getFragment(),
                                'rd_interwiki' => $rt->getInterwiki(),
                        ),
                        __METHOD__
@@ -944,7 +946,7 @@ class WikiPage implements Page, IDBAccessObject {
                                // 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' );
-                               return $rt->getFullURL( 'rdfrom=' . urlencode( $source ) );
+                               return $rt->getFullURL( array( 'rdfrom' => $source ) );
                        } else {
                                // External pages pages without "local" bit set are not valid
                                // redirect targets
@@ -1155,13 +1157,12 @@ class WikiPage implements Page, IDBAccessObject {
        public function doPurge() {
                global $wgUseSquid;
 
-               if( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
+               if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
                        return false;
                }
 
                // Invalidate the cache
                $this->mTitle->invalidateCache();
-               $this->clear();
 
                if ( $wgUseSquid ) {
                        // Commit the transaction before the purge is sent
@@ -1174,7 +1175,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                       // @todo: move this logic to MessageCache
+                       // @todo move this logic to MessageCache
 
                        if ( $this->exists() ) {
                                // NOTE: use transclusion text for messages.
@@ -1183,7 +1184,9 @@ class WikiPage implements Page, IDBAccessObject {
                                $content = $this->getContent();
                                $text = $content === null ? null : $content->getWikitextForTransclusion();
 
-                               if ( $text === null ) $text = false;
+                               if ( $text === null ) {
+                                       $text = false;
+                               }
                        } else {
                                $text = false;
                        }
@@ -1274,7 +1277,7 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                if ( $wgContentHandlerUseDB ) {
-                       $row[ 'page_content_model' ] = $revision->getContentModel();
+                       $row['page_content_model'] = $revision->getContentModel();
                }
 
                $dbw->update( 'page',
@@ -1456,8 +1459,8 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @return boolean whether sections are supported.
         *
-        * @todo: the skin should check this and not offer section functionality if sections are not supported.
-        * @todo: the EditPage should check this and not offer section functionality if sections are not supported.
+        * @todo The skin should check this and not offer section functionality if sections are not supported.
+        * @todo The EditPage should check this and not offer section functionality if sections are not supported.
         */
        public function supportsSections() {
                return $this->getContentHandler()->supportsSections();
@@ -1482,6 +1485,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $newContent = $sectionContent;
                } else {
                        if ( !$this->supportsSections() ) {
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
                        }
 
@@ -1698,7 +1702,9 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Provide autosummaries if one is not provided and autosummaries are enabled.
                if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
-                       if ( !$old_content ) $old_content = null;
+                       if ( !$old_content ) {
+                               $old_content = null;
+                       }
                        $summary = $handler->getAutosummary( $old_content, $content, $flags );
                }
 
@@ -1747,6 +1753,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                        if ( $changed ) {
                                if ( !$content->isValid() ) {
+                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( "New content failed validity check!" );
                                }
 
@@ -1949,7 +1956,7 @@ class WikiPage implements Page, IDBAccessObject {
                $options = $this->getContentHandler()->makeParserOptions( $context );
 
                if ( $this->getTitle()->isConversionTable() ) {
-                       //@todo: ConversionTable should become a separate content model, so we don't need special cases like this one.
+                       // @todo ConversionTable should become a separate content model, so we don't need special cases like this one.
                        $options->disableContentConversion();
                }
 
@@ -2046,7 +2053,8 @@ class WikiPage implements Page, IDBAccessObject {
                $content = $revision->getContent();
 
                // Parse the text
-               // Be careful not to double-PST: $text is usually already PST-ed once
+               // Be careful not to do pre-save transform twice: $text is usually
+               // already pre-save transformed once.
                if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
                        wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
                        $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
@@ -2073,15 +2081,7 @@ class WikiPage implements Page, IDBAccessObject {
                        if ( 0 == mt_rand( 0, 99 ) ) {
                                // Flush old entries from the `recentchanges` table; we do this on
                                // random requests so as to avoid an increase in writes for no good reason
-                               global $wgRCMaxAge;
-
-                               $dbw = wfGetDB( DB_MASTER );
-                               $cutoff = $dbw->timestamp( time() - $wgRCMaxAge );
-                               $dbw->delete(
-                                       'recentchanges',
-                                       array( 'rc_timestamp < ' . $dbw->addQuotes( $cutoff ) ),
-                                       __METHOD__
-                               );
+                               RecentChange::purgeExpiredChanges();
                        }
                }
 
@@ -2110,7 +2110,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, $good, $total ) );
                DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content->getTextForSearchIndex() ) );
-               // @TODO: let the search engine decide what to do with the content object
+               // @todo let the search engine decide what to do with the content object
 
                // If this is another user's talk page, update newtalk.
                // Don't do this if $options['changed'] = false (null-edits) nor if
@@ -2120,17 +2120,20 @@ class WikiPage implements Page, IDBAccessObject {
                        && $shortTitle != $user->getTitleKey()
                        && !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
                ) {
-                       if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this ) ) ) {
-                               $other = User::newFromName( $shortTitle, false );
-                               if ( !$other ) {
-                                       wfDebug( __METHOD__ . ": invalid username\n" );
-                               } elseif ( User::isIP( $shortTitle ) ) {
-                                       // An anonymous user
-                                       $other->setNewtalk( true, $revision );
-                               } elseif ( $other->isLoggedIn() ) {
-                                       $other->setNewtalk( true, $revision );
-                               } else {
-                                       wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+                       $recipient = User::newFromName( $shortTitle, false );
+                       if ( !$recipient ) {
+                               wfDebug( __METHOD__ . ": invalid username\n" );
+                       } else {
+                               // Allow extensions to prevent user notification when a new message is added to their talk page
+                               if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
+                                       if ( User::isIP( $shortTitle ) ) {
+                                               // An anonymous user
+                                               $recipient->setNewtalk( true, $revision );
+                                       } elseif ( $recipient->isLoggedIn() ) {
+                                               $recipient->setNewtalk( true, $revision );
+                                       } else {
+                                               wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+                                       }
                                }
                        }
                }
@@ -2138,12 +2141,14 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        // XXX: could skip pseudo-messages like js/css here, based on content model.
                        $msgtext = $content ? $content->getWikitextForTransclusion() : null;
-                       if ( $msgtext === false || $msgtext === null ) $msgtext = '';
+                       if ( $msgtext === false || $msgtext === null ) {
+                               $msgtext = '';
+                       }
 
                        MessageCache::singleton()->replace( $shortTitle, $msgtext );
                }
 
-               if( $options['created'] ) {
+               if ( $options['created'] ) {
                        self::onArticleCreate( $this->mTitle );
                } else {
                        self::onArticleEdit( $this->mTitle );
@@ -2216,7 +2221,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return Status
         */
        public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
-               global $wgContLang;
+               global $wgContLang, $wgCascadingRestrictionLevels;
 
                if ( wfReadOnly() ) {
                        return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
@@ -2339,12 +2344,17 @@ class WikiPage implements Page, IDBAccessObject {
                                return Status::newGood();
                        }
 
-                       // Only restrictions with the 'protect' right can cascade...
-                       // Otherwise, people who cannot normally protect can "protect" pages via transclusion
+                       // Only certain restrictions can cascade... Otherwise, users who cannot normally protect pages
+                       // could "protect" them by transcluding them on protected pages they are allowed to edit.
                        $editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
 
+                       $cascadingRestrictionLevels = $wgCascadingRestrictionLevels;
+                       if ( in_array( 'sysop', $cascadingRestrictionLevels ) ) {
+                               $cascadingRestrictionLevels[] = 'protect'; // backwards compatibility
+                       }
+
                        // The schema allows multiple restrictions
-                       if ( !in_array( 'protect', $editrestriction ) && !in_array( 'sysop', $editrestriction ) ) {
+                       if ( !array_intersect( $editrestriction, $cascadingRestrictionLevels ) ) {
                                $cascade = false;
                        }
 
@@ -2433,6 +2443,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $this->mTitle->flushRestrictions();
+               InfoAction::invalidateCache( $this->mTitle );
 
                if ( $logAction == 'unprotect' ) {
                        $logParams = array();
@@ -2591,8 +2602,8 @@ class WikiPage implements Page, IDBAccessObject {
                );
 
                if ( $wgContentHandlerUseDB ) {
-                       $row[ 'ar_content_model' ] = 'rev_content_model';
-                       $row[ 'ar_content_format' ] = 'rev_content_format';
+                       $row['ar_content_model'] = 'rev_content_model';
+                       $row['ar_content_format'] = 'rev_content_format';
                }
 
                $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
@@ -2663,7 +2674,7 @@ class WikiPage implements Page, IDBAccessObject {
         * performs permissions checks on $user, then calls commitRollback()
         * to do the dirty work
         *
-        * @todo: separate the business/permission stuff out from backend code
+        * @todo Separate the business/permission stuff out from backend code
         *
         * @param string $fromP Name of the user whose edits to rollback.
         * @param string $summary Custom summary. Set to default summary if empty.
@@ -2807,7 +2818,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
                        $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
                );
-               if( $summary instanceof Message ) {
+               if ( $summary instanceof Message ) {
                        $summary = $summary->params( $args )->inContentLanguage()->text();
                } else {
                        $summary = wfMsgReplaceArgs( $summary, $args );
@@ -2848,8 +2859,8 @@ class WikiPage implements Page, IDBAccessObject {
                $resultDetails = array(
                        'summary' => $summary,
                        'current' => $current,
-                       'target'  => $target,
-                       'newid'   => $revId
+                       'target' => $target,
+                       'newid' => $revId
                );
 
                return array();
@@ -2903,6 +2914,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // File cache
                HTMLFileCache::clearFileCache( $title );
+               InfoAction::invalidateCache( $title );
 
                // Messages
                if ( $title->getNamespace() == NS_MEDIAWIKI ) {
@@ -2931,7 +2943,7 @@ class WikiPage implements Page, IDBAccessObject {
         * Purge caches on page update etc
         *
         * @param $title Title object
-        * @todo:  verify that $title is always a Title object (and never false or null), add Title hint to parameter $title
+        * @todo Verify that $title is always a Title object (and never false or null), add Title hint to parameter $title
         */
        public static function onArticleEdit( $title ) {
                // Invalidate caches of articles which include this page
@@ -2945,6 +2957,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Clear file cache for this page only
                HTMLFileCache::clearFileCache( $title );
+               InfoAction::invalidateCache( $title );
        }
 
        /**#@-*/
@@ -3018,69 +3031,76 @@ class WikiPage implements Page, IDBAccessObject {
         * @param array $added   The names of categories that were added
         * @param array $deleted The names of categories that were deleted
         */
-       public function updateCategoryCounts( $added, $deleted ) {
-               $ns = $this->mTitle->getNamespace();
+       public function updateCategoryCounts( array $added, array $deleted ) {
+               $that = $this;
+               $method = __METHOD__;
                $dbw = wfGetDB( DB_MASTER );
 
-               // First make sure the rows exist.  If one of the "deleted" ones didn't
-               // exist, we might legitimately not create it, but it's simpler to just
-               // create it and then give it a negative value, since the value is bogus
-               // anyway.
-               //
-               // Sometimes I wish we had INSERT ... ON DUPLICATE KEY UPDATE.
-               $insertCats = array_merge( $added, $deleted );
-               if ( !$insertCats ) {
-                       // Okay, nothing to do
-                       return;
-               }
+               // Do this at the end of the commit to reduce lock wait timeouts
+               $dbw->onTransactionPreCommitOrIdle(
+                       function() use ( $dbw, $that, $method, $added, $deleted ) {
+                               $ns = $that->getTitle()->getNamespace();
 
-               $insertRows = array();
+                               // First make sure the rows exist.  If one of the "deleted" ones didn't
+                               // exist, we might legitimately not create it, but it's simpler to just
+                               // create it and then give it a negative value, since the value is bogus
+                               // anyway.
+                               //
+                               // Sometimes I wish we had INSERT ... ON DUPLICATE KEY UPDATE.
+                               $insertCats = array_merge( $added, $deleted );
+                               if ( !$insertCats ) {
+                                       // Okay, nothing to do
+                                       return;
+                               }
 
-               foreach ( $insertCats as $cat ) {
-                       $insertRows[] = array(
-                               'cat_id' => $dbw->nextSequenceValue( 'category_cat_id_seq' ),
-                               'cat_title' => $cat
-                       );
-               }
-               $dbw->insert( 'category', $insertRows, __METHOD__, 'IGNORE' );
+                               $insertRows = array();
+                               foreach ( $insertCats as $cat ) {
+                                       $insertRows[] = array(
+                                               'cat_id' => $dbw->nextSequenceValue( 'category_cat_id_seq' ),
+                                               'cat_title' => $cat
+                                       );
+                               }
+                               $dbw->insert( 'category', $insertRows, $method, 'IGNORE' );
 
-               $addFields = array( 'cat_pages = cat_pages + 1' );
-               $removeFields = array( 'cat_pages = cat_pages - 1' );
+                               $addFields = array( 'cat_pages = cat_pages + 1' );
+                               $removeFields = array( 'cat_pages = cat_pages - 1' );
 
-               if ( $ns == NS_CATEGORY ) {
-                       $addFields[] = 'cat_subcats = cat_subcats + 1';
-                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
-               } elseif ( $ns == NS_FILE ) {
-                       $addFields[] = 'cat_files = cat_files + 1';
-                       $removeFields[] = 'cat_files = cat_files - 1';
-               }
+                               if ( $ns == NS_CATEGORY ) {
+                                       $addFields[] = 'cat_subcats = cat_subcats + 1';
+                                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
+                               } elseif ( $ns == NS_FILE ) {
+                                       $addFields[] = 'cat_files = cat_files + 1';
+                                       $removeFields[] = 'cat_files = cat_files - 1';
+                               }
 
-               if ( $added ) {
-                       $dbw->update(
-                               'category',
-                               $addFields,
-                               array( 'cat_title' => $added ),
-                               __METHOD__
-                       );
-               }
+                               if ( $added ) {
+                                       $dbw->update(
+                                               'category',
+                                               $addFields,
+                                               array( 'cat_title' => $added ),
+                                               $method
+                                       );
+                               }
 
-               if ( $deleted ) {
-                       $dbw->update(
-                               'category',
-                               $removeFields,
-                               array( 'cat_title' => $deleted ),
-                               __METHOD__
-                       );
-               }
+                               if ( $deleted ) {
+                                       $dbw->update(
+                                               'category',
+                                               $removeFields,
+                                               array( 'cat_title' => $deleted ),
+                                               $method
+                                       );
+                               }
 
-               foreach( $added as $catName ) {
-                       $cat = Category::newFromName( $catName );
-                       wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $this ) );
-               }
-               foreach( $deleted as $catName ) {
-                       $cat = Category::newFromName( $catName );
-                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $this ) );
-               }
+                               foreach ( $added as $catName ) {
+                                       $cat = Category::newFromName( $catName );
+                                       wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
+                               }
+                               foreach ( $deleted as $catName ) {
+                                       $cat = Category::newFromName( $catName );
+                                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
+                               }
+                       }
+               );
        }
 
        /**
@@ -3386,7 +3406,7 @@ class PoolWorkArticleView extends PoolCounterWork {
        function doWork() {
                global $wgUseFileCache;
 
-               // @todo: several of the methods called on $this->page are not declared in Page, but present
+               // @todo several of the methods called on $this->page are not declared in Page, but present
                //        in WikiPage and delegated by Article.
 
                $isCurrent = $this->revid === $this->page->getLatest();
index 57a4fcf..223061a 100644 (file)
@@ -38,13 +38,13 @@ class Xml {
         */
        public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
                $out = '<' . $element;
-               if( !is_null( $attribs ) ) {
+               if ( !is_null( $attribs ) ) {
                        $out .= self::expandAttributes( $attribs );
                }
-               if( is_null( $contents ) ) {
+               if ( is_null( $contents ) ) {
                        $out .= '>';
                } else {
-                       if( $allowShortTag && $contents === '' ) {
+                       if ( $allowShortTag && $contents === '' ) {
                                $out .= ' />';
                        } else {
                                $out .= '>' . htmlspecialchars( $contents ) . "</$element>";
@@ -64,10 +64,10 @@ class Xml {
         */
        public static function expandAttributes( $attribs ) {
                $out = '';
-               if( is_null( $attribs ) ) {
+               if ( is_null( $attribs ) ) {
                        return null;
-               } elseif( is_array( $attribs ) ) {
-                       foreach( $attribs as $name => $val ) {
+               } elseif ( is_array( $attribs ) ) {
+                       foreach ( $attribs as $name => $val ) {
                                $out .= " {$name}=\"" . Sanitizer::encodeAttribute( $val ) . '"';
                        }
                        return $out;
@@ -88,10 +88,10 @@ class Xml {
         */
        public static function elementClean( $element, $attribs = array(), $contents = '' ) {
                global $wgContLang;
-               if( $attribs ) {
+               if ( $attribs ) {
                        $attribs = array_map( array( 'UtfNormal', 'cleanUp' ), $attribs );
                }
-               if( $contents ) {
+               if ( $contents ) {
                        wfProfileIn( __METHOD__ . '-norm' );
                        $contents = $wgContLang->normalize( $contents );
                        wfProfileOut( __METHOD__ . '-norm' );
@@ -115,7 +115,9 @@ class Xml {
         * @param string $element element name
         * @return string
         */
-       public static function closeElement( $element ) { return "</$element>"; }
+       public static function closeElement( $element ) {
+               return "</$element>";
+       }
 
        /**
         * Same as Xml::element(), but does not escape contents. Handy when the
@@ -144,11 +146,11 @@ class Xml {
                wfDeprecated( __METHOD__, '1.19' );
                return Html::namespaceSelector( array(
                        'selected' => $selected,
-                       'all'      => $all,
-                       'label'    => $label,
+                       'all' => $all,
+                       'label' => $label,
                ), array(
-                       'name'  => $element_name,
-                       'id'    => 'namespace',
+                       'name' => $element_name,
+                       'id' => 'namespace',
                        'class' => 'namespaceselector',
                ) );
        }
@@ -164,12 +166,15 @@ class Xml {
        public static function monthSelector( $selected = '', $allmonths = null, $id = 'month' ) {
                global $wgLang;
                $options = array();
-               if( is_null( $selected ) )
+               if ( is_null( $selected ) ) {
                        $selected = '';
-               if( !is_null( $allmonths ) )
+               }
+               if ( !is_null( $allmonths ) ) {
                        $options[] = self::option( wfMessage( 'monthsall' )->text(), $allmonths, $selected === $allmonths );
-               for( $i = 1; $i < 13; $i++ )
+               }
+               for ( $i = 1; $i < 13; $i++ ) {
                        $options[] = self::option( $wgLang->getMonthName( $i ), $i, $selected === $i );
+               }
                return self::openElement( 'select', array( 'id' => $id, 'name' => 'month', 'class' => 'mw-month-selector' ) )
                        . implode( "\n", $options )
                        . self::closeElement( 'select' );
@@ -182,17 +187,17 @@ class Xml {
         */
        public static function dateMenu( $year, $month ) {
                # Offset overrides year/month selection
-               if( $month && $month !== -1 ) {
+               if ( $month && $month !== -1 ) {
                        $encMonth = intval( $month );
                } else {
                        $encMonth = '';
                }
-               if( $year ) {
+               if ( $year ) {
                        $encYear = intval( $year );
-               } elseif( $encMonth ) {
+               } elseif ( $encMonth ) {
                        $thisMonth = intval( gmdate( 'n' ) );
                        $thisYear = intval( gmdate( 'Y' ) );
-                       if( intval( $encMonth ) > $thisMonth ) {
+                       if ( intval( $encMonth ) > $thisMonth ) {
                                $thisYear--;
                        }
                        $encYear = $thisYear;
@@ -200,9 +205,9 @@ class Xml {
                        $encYear = '';
                }
                $inputAttribs = array( 'id' => 'year', 'maxlength' => 4, 'size' => 7 );
-               return self::label( wfMessage( 'year' )->text(), 'year' ) . ' '.
-                       Html::input( 'year', $encYear, 'number', $inputAttribs ) . ' '.
-                       self::label( wfMessage( 'month' )->text(), 'month' ) . ' '.
+               return self::label( wfMessage( 'year' )->text(), 'year' ) . ' ' .
+                       Html::input( 'year', $encYear, 'number', $inputAttribs ) . ' ' .
+                       self::label( wfMessage( 'month' )->text(), 'month' ) . ' ' .
                        self::monthSelector( $encMonth, -1 );
        }
 
@@ -224,7 +229,7 @@ class Xml {
 
                // Make sure the site language is in the list;
                // a custom language code might not have a defined name...
-               if( !array_key_exists( $wgLanguageCode, $languages ) ) {
+               if ( !array_key_exists( $wgLanguageCode, $languages ) ) {
                        $languages[$wgLanguageCode] = $wgLanguageCode;
                }
 
@@ -237,14 +242,14 @@ class Xml {
                 */
                $selected = isset( $languages[$selected] ) ? $selected : $wgLanguageCode;
                $options = "\n";
-               foreach( $languages as $code => $name ) {
-                       $options .= Xml::option( "$code - $name", $code, ($code == $selected) ) . "\n";
+               foreach ( $languages as $code => $name ) {
+                       $options .= Xml::option( "$code - $name", $code, $code == $selected ) . "\n";
                }
 
                $attrs = array( 'id' => 'wpUserLanguage', 'name' => 'wpUserLanguage' );
                $attrs = array_merge( $attrs, $overrideAttrs );
 
-               if( $msg === null ) {
+               if ( $msg === null ) {
                        $msg = wfMessage( 'yourlanguage' );
                }
                return array(
@@ -288,11 +293,11 @@ class Xml {
        public static function input( $name, $size = false, $value = false, $attribs = array() ) {
                $attributes = array( 'name' => $name );
 
-               if( $size ) {
+               if ( $size ) {
                        $attributes['size'] = $size;
                }
 
-               if( $value !== false ) { // maybe 0
+               if ( $value !== false ) { // maybe 0
                        $attributes['value'] = $value;
                }
 
@@ -330,7 +335,7 @@ class Xml {
         * @param array $attribs other attributes
         * @return string HTML
         */
-       public static function check( $name, $checked = false, $attribs=array() ) {
+       public static function check( $name, $checked = false, $attribs = array() ) {
                return self::element( 'input', array_merge(
                        array(
                                'name' => $name,
@@ -369,10 +374,10 @@ class Xml {
                $a = array( 'for' => $id );
 
                # FIXME avoid copy pasting below:
-               if( isset( $attribs['class'] ) ) {
+               if ( isset( $attribs['class'] ) ) {
                                $a['class'] = $attribs['class'];
                }
-               if( isset( $attribs['title'] ) ) {
+               if ( isset( $attribs['title'] ) ) {
                                $a['title'] = $attribs['title'];
                }
 
@@ -389,7 +394,7 @@ class Xml {
         * @param array $attribs other attributes
         * @return string HTML
         */
-       public static function inputLabel( $label, $name, $id, $size=false, $value=false, $attribs = array() ) {
+       public static function inputLabel( $label, $name, $id, $size = false, $value = false, $attribs = array() ) {
                list( $label, $input ) = self::inputLabelSep( $label, $name, $id, $size, $value, $attribs );
                return $label . '&#160;' . $input;
        }
@@ -460,18 +465,18 @@ class Xml {
 
        /**
         * Convenience function to build an HTML drop-down list item.
-        * @param string $text text for this item
+        * @param string $text text for this item. Will be HTML escaped
         * @param string $value form submission value; if empty, use text
         * @param $selected boolean: if true, will be the default selected item
         * @param array $attribs optional additional HTML attributes
         * @return string HTML
         */
-       public static function option( $text, $value=null, $selected = false,
+       public static function option( $text, $value = null, $selected = false,
                        $attribs = array() ) {
-               if( !is_null( $value ) ) {
+               if ( !is_null( $value ) ) {
                        $attribs['value'] = $value;
                }
-               if( $selected ) {
+               if ( $selected ) {
                        $attribs['selected'] = 'selected';
                }
                return Html::element( 'option', $attribs, $text );
@@ -488,47 +493,53 @@ class Xml {
         * @param $tabindex Mixed: Value of the tabindex attribute
         * @return string
         */
-       public static function listDropDown( $name= '', $list = '', $other = '', $selected = '', $class = '', $tabindex = null ) {
+       public static function listDropDown( $name = '', $list = '', $other = '', $selected = '', $class = '', $tabindex = null ) {
                $optgroup = false;
 
                $options = self::option( $other, 'other', $selected === 'other' );
 
-               foreach ( explode( "\n", $list ) as $option) {
+               foreach ( explode( "\n", $list ) as $option ) {
                                $value = trim( $option );
                                if ( $value == '' ) {
                                        continue;
-                               } elseif ( substr( $value, 0, 1) == '*' && substr( $value, 1, 1) != '*' ) {
+                               } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
                                        // A new group is starting ...
                                        $value = trim( substr( $value, 1 ) );
-                                       if( $optgroup ) $options .= self::closeElement( 'optgroup' );
+                                       if ( $optgroup ) {
+                                               $options .= self::closeElement( 'optgroup' );
+                                       }
                                        $options .= self::openElement( 'optgroup', array( 'label' => $value ) );
                                        $optgroup = true;
-                               } elseif ( substr( $value, 0, 2) == '**' ) {
+                               } elseif ( substr( $value, 0, 2 ) == '**' ) {
                                        // groupmember
                                        $value = trim( substr( $value, 2 ) );
                                        $options .= self::option( $value, $value, $selected === $value );
                                } else {
                                        // groupless reason list
-                                       if( $optgroup ) $options .= self::closeElement( 'optgroup' );
+                                       if ( $optgroup ) {
+                                               $options .= self::closeElement( 'optgroup' );
+                                       }
                                        $options .= self::option( $value, $value, $selected === $value );
                                        $optgroup = false;
                                }
                        }
 
-                       if( $optgroup ) $options .= self::closeElement( 'optgroup' );
+                       if ( $optgroup ) {
+                               $options .= self::closeElement( 'optgroup' );
+                       }
 
                $attribs = array();
 
-               if( $name ) {
+               if ( $name ) {
                        $attribs['id'] = $name;
                        $attribs['name'] = $name;
                }
 
-               if( $class ) {
+               if ( $class ) {
                        $attribs['class'] = $class;
                }
 
-               if( $tabindex ) {
+               if ( $tabindex ) {
                        $attribs['tabindex'] = $tabindex;
                }
 
@@ -590,6 +601,7 @@ class Xml {
         * for JavaScript source code.
         * Illegal control characters are assumed not to be present.
         *
+        * @deprecated since 1.21; use Xml::encodeJsVar() or Xml::encodeJsCall() instead
         * @param string $string to escape
         * @return String
         */
@@ -621,72 +633,46 @@ class Xml {
        }
 
        /**
-        * Encode a variable of unknown type to JavaScript.
-        * Arrays are converted to JS arrays, objects are converted to JS associative
-        * arrays (objects). So cast your PHP associative arrays to objects before
-        * passing them to here.
+        * Encode a variable of arbitrary type to JavaScript.
+        * If the value is an XmlJsCode object, pass through the object's value verbatim.
         *
-        * @param $value
+        * @note Only use this function for generating JavaScript code. If generating output
+        *       for a proper JSON parser, just call FormatJson::encode() directly.
         *
-        * @return string
+        * @param mixed $value The value being encoded. Can be any type except a resource.
+        * @param bool $pretty If true, add non-significant whitespace to improve readability.
+        * @return string|bool: String if successful; false upon failure
         */
-       public static function encodeJsVar( $value ) {
-               if ( is_bool( $value ) ) {
-                       $s = $value ? 'true' : 'false';
-               } elseif ( is_null( $value ) ) {
-                       $s = 'null';
-               } elseif ( is_int( $value ) || is_float( $value ) ) {
-                       $s = strval( $value );
-               } elseif ( is_array( $value ) && // Make sure it's not associative.
-                                       array_keys( $value ) === range( 0, count( $value ) - 1 ) ||
-                                       count( $value ) == 0
-                               ) {
-                       $s = '[';
-                       foreach ( $value as $elt ) {
-                               if ( $s != '[' ) {
-                                       $s .= ',';
-                               }
-                               $s .= self::encodeJsVar( $elt );
-                       }
-                       $s .= ']';
-               } elseif ( $value instanceof XmlJsCode ) {
-                       $s = $value->value;
-               } elseif ( is_object( $value ) || is_array( $value ) ) {
-                       // Objects and associative arrays
-                       $s = '{';
-                       foreach ( (array)$value as $name => $elt ) {
-                               if ( $s != '{' ) {
-                                       $s .= ',';
-                               }
-
-                               $s .= '"' . self::escapeJsString( $name ) . '":' .
-                                       self::encodeJsVar( $elt );
-                       }
-                       $s .= '}';
-               } else {
-                       $s = '"' . self::escapeJsString( $value ) . '"';
+       public static function encodeJsVar( $value, $pretty = false ) {
+               if ( $value instanceof XmlJsCode ) {
+                       return $value->value;
                }
-               return $s;
+               return FormatJson::encode( $value, $pretty, FormatJson::UTF8_OK );
        }
 
        /**
         * Create a call to a JavaScript function. The supplied arguments will be
         * encoded using Xml::encodeJsVar().
         *
+        * @since 1.17
         * @param string $name The name of the function to call, or a JavaScript expression
         *    which evaluates to a function object which is called.
-        * @param array $args of arguments to pass to the function.
-        *
-        * @since 1.17
-        *
-        * @return string
+        * @param array $args The arguments to pass to the function.
+        * @param bool $pretty If true, add non-significant whitespace to improve readability.
+        * @return string|bool: String if successful; false upon failure
         */
-       public static function encodeJsCall( $name, $args ) {
+       public static function encodeJsCall( $name, $args, $pretty = false ) {
                foreach ( $args as &$arg ) {
-                       $arg = Xml::encodeJsVar( $arg );
+                       $arg = Xml::encodeJsVar( $arg, $pretty );
+                       if ( $arg === false ) {
+                               return false;
+                       }
                }
 
-               return "$name(" . implode( ', ', $args ) . ");\n";
+               return "$name(" . ( $pretty
+                       ? ( ' ' . implode( ', ', $args ) . ' ' )
+                       : implode( ',', $args )
+               ) . ");";
        }
 
        /**
@@ -704,7 +690,7 @@ class Xml {
                # case folding violates XML standard, turn it off
                xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
 
-               if( !xml_parse( $parser, $text, true ) ) {
+               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 );
@@ -753,23 +739,28 @@ class Xml {
        /**
         * Generate a form (without the opening form element).
         * Output optionally includes a submit button.
-        * @param array $fields Associative array, key is message corresponding to a description for the field (colon is in the message), value is appropriate input.
-        * @param string $submitLabel A message containing a label for the submit button.
+        * @param array $fields Associative array, key is the name of a message that contains a description for the field, value is an HTML string containing the appropriate input.
+        * @param string $submitLabel The name of a message containing a label for the submit button.
         * @return string HTML form.
         */
        public static function buildForm( $fields, $submitLabel = null ) {
                $form = '';
                $form .= "<table><tbody>";
 
-               foreach( $fields as $labelmsg => $input ) {
+               foreach ( $fields as $labelmsg => $input ) {
                        $id = "mw-$labelmsg";
                        $form .= Xml::openElement( 'tr', array( 'id' => $id ) );
+
+                       // TODO use a <label> here for accessibility purposes - will need
+                       // to either not use a table to build the form, or find the ID of
+                       // the input somehow.
+
                        $form .= Xml::tags( 'td', array( 'class' => 'mw-label' ), wfMessage( $labelmsg )->parse() );
                        $form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) ) . $input . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
 
-               if( $submitLabel ) {
+               if ( $submitLabel ) {
                        $form .= Xml::openElement( 'tr' );
                        $form .= Xml::tags( 'td', array(), '' );
                        $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text() ) . Xml::closeElement( 'td' );
@@ -794,7 +785,7 @@ class Xml {
                if ( is_array( $headers ) ) {
                        $s .= Xml::openElement( 'thead', $attribs );
 
-                       foreach( $headers as $id => $header ) {
+                       foreach ( $headers as $id => $header ) {
                                $attribs = array();
 
                                if ( is_string( $id ) ) {
@@ -806,7 +797,7 @@ class Xml {
                        $s .= Xml::closeElement( 'thead' );
                }
 
-               foreach( $rows as $id => $row ) {
+               foreach ( $rows as $id => $row ) {
                        $attribs = array();
 
                        if ( is_string( $id ) ) {
@@ -830,8 +821,7 @@ class Xml {
        public static function buildTableRow( $attribs, $cells ) {
                $s = Xml::openElement( 'tr', $attribs );
 
-               foreach( $cells as $id => $cell ) {
-
+               foreach ( $cells as $id => $cell ) {
                        $attribs = array();
 
                        if ( is_string( $id ) ) {
@@ -899,7 +889,7 @@ class XmlSelect {
         */
        public function addOption( $name, $value = false ) {
                // Stab stab stab
-               $value = ($value !== false) ? $value : $name;
+               $value = $value !== false ? $value : $name;
 
                $this->options[] = array( $name => $value );
        }
@@ -927,7 +917,7 @@ class XmlSelect {
        static function formatOptions( $options, $default = false ) {
                $data = '';
 
-               foreach( $options as $label => $value ) {
+               foreach ( $options as $label => $value ) {
                        if ( is_array( $value ) ) {
                                $contents = self::formatOptions( $value, $default );
                                $data .= Html::rawElement( 'optgroup', array( 'label' => $label ), $contents ) . "\n";
@@ -963,6 +953,11 @@ class XmlSelect {
  *    Xml::encodeJsVar( new XmlJsCode( 'a + b' ) );
  *
  * Returns "a + b".
+ *
+ * @note As of 1.21, XmlJsCode objects cannot be nested inside objects or arrays. The sole
+ *       exception is the $args argument to Xml::encodeJsCall() because Xml::encodeJsVar() is
+ *       called for each individual element in that array.
+ *
  * @since 1.17
  */
 class XmlJsCode {
index 2e18460..25dde7d 100644 (file)
@@ -47,7 +47,7 @@ class XmlTypeCheck {
         *        namespace, name, and attributes, but not to text contents.
         *        Filter should return 'true' to toggle on $this->filterMatch
         */
-       function __construct( $file, $filterCallback=null ) {
+       function __construct( $file, $filterCallback = null ) {
                $this->filterCallback = $filterCallback;
                $this->run( $file );
        }
@@ -78,13 +78,13 @@ class XmlTypeCheck {
                                do {
                                        $chunk = fread( $file, 32768 );
                                        $ret = xml_parse( $parser, $chunk, feof( $file ) );
-                                       if( $ret == 0 ) {
+                                       if ( $ret == 0 ) {
                                                // XML isn't well-formed!
                                                fclose( $file );
                                                xml_parser_free( $parser );
                                                return;
                                        }
-                               } while( !feof( $file ) );
+                               } while ( !feof( $file ) );
 
                                fclose( $file );
                        }
@@ -103,7 +103,7 @@ class XmlTypeCheck {
        private function rootElementOpen( $parser, $name, $attribs ) {
                $this->rootElement = $name;
 
-               if( is_callable( $this->filterCallback ) ) {
+               if ( is_callable( $this->filterCallback ) ) {
                        xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false );
                        $this->elementOpen( $parser, $name, $attribs );
                } else {
@@ -118,7 +118,7 @@ class XmlTypeCheck {
         * @param $attribs
         */
        private function elementOpen( $parser, $name, $attribs ) {
-               if( call_user_func( $this->filterCallback, $name, $attribs ) ) {
+               if ( call_user_func( $this->filterCallback, $name, $attribs ) ) {
                        // Filter hit!
                        $this->filterMatch = true;
                }
index fd03ec4..c5955ae 100644 (file)
@@ -81,14 +81,14 @@ class ZhClient {
                $result = fgets( $this->mFP, 1024 );
 
                list( $status, $len ) = explode( ' ', $result );
-               if( $status == 'ERROR' ) {
+               if ( $status == 'ERROR' ) {
                        // $len is actually the error code...
                        print "zhdaemon error $len<br />\n";
                        return false;
                }
                $bytesread = 0;
                $data = '';
-               while( !feof( $this->mFP ) && $bytesread < $len ) {
+               while ( !feof( $this->mFP ) && $bytesread < $len ) {
                        $str = fread( $this->mFP, $len - $bytesread );
                        $bytesread += strlen( $str );
                        $data .= $str;
@@ -131,7 +131,7 @@ class ZhClient {
                $info = explode( ';', $infoline );
                $ret = array();
                $i = 0;
-               foreach( $info as $variant ) {
+               foreach ( $info as $variant ) {
                        list( $code, $len ) = explode( ' ', $variant );
                        $ret[strtolower( $code )] = substr( $data, $i, $len );
                        $i += $len;
index 646180d..307efce 100644 (file)
@@ -162,7 +162,7 @@ class ZipDirectoryReader {
                                        || $this->eocdr['CD entries total'] == 0xffff )
                                {
                                        $this->error( 'zip-unsupported', 'Central directory header indicates ZIP64, ' .
-                                               'but we are in legacy mode. Rejecting this upload is necessary to avoid '.
+                                               'but we are in legacy mode. Rejecting this upload is necessary to avoid ' .
                                                'opening vulnerabilities on clients using OpenJDK 7 or later.' );
                                }
 
index 4d3c41b..0a2bf30 100644 (file)
@@ -79,17 +79,17 @@ class CreditsAction extends FormlessAction {
 
        /**
         * Get the last author with the last modification time
-        * @param $article Article object
+        * @param Page $page
         * @return String HTML
         */
-       protected function getAuthor( Page $article ) {
-               $user = User::newFromName( $article->getUserText(), false );
+       protected function getAuthor( Page $page ) {
+               $user = User::newFromName( $page->getUserText(), false );
 
-               $timestamp = $article->getTimestamp();
+               $timestamp = $page->getTimestamp();
                if ( $timestamp ) {
                        $lang = $this->getLanguage();
-                       $d = $lang->date( $article->getTimestamp(), true );
-                       $t = $lang->time( $article->getTimestamp(), true );
+                       $d = $lang->date( $page->getTimestamp(), true );
+                       $t = $lang->time( $page->getTimestamp(), true );
                } else {
                        $d = '';
                        $t = '';
@@ -114,9 +114,10 @@ class CreditsAction extends FormlessAction {
                # Hmm... too many to fit!
                if ( $cnt > 0 && $contributors->count() > $cnt ) {
                        $others_link = $this->othersLink();
-                       if ( !$showIfMax )
+                       if ( !$showIfMax ) {
                                return $this->msg( 'othercontribs' )->rawParams(
                                        $others_link )->params( $contributors->count() )->escaped();
+                       }
                }
 
                $real_names = array();
index dec3d84..3dd4c48 100644 (file)
@@ -43,21 +43,11 @@ class EditAction extends FormlessAction {
 
        public function show() {
                $page = $this->page;
-               $request = $this->getRequest();
                $user = $this->getUser();
-               $context = $this->getContext();
 
                if ( wfRunHooks( 'CustomEditor', array( $page, $user ) ) ) {
-                       if ( ExternalEdit::useExternalEngine( $context, 'edit' )
-                               && $this->getName() == 'edit' && !$request->getVal( 'section' )
-                               && !$request->getVal( 'oldid' ) )
-                       {
-                               $extedit = new ExternalEdit( $context );
-                               $extedit->execute();
-                       } else {
-                               $editor = new EditPage( $page );
-                               $editor->edit();
-                       }
+                       $editor = new EditPage( $page );
+                       $editor->edit();
                }
 
        }
index f2e61a5..f43736b 100644 (file)
@@ -211,7 +211,7 @@ class HistoryAction extends FormlessAction {
         */
        function fetchRevisions( $limit, $offset, $direction ) {
                // Fail if article doesn't exist.
-               if( !$this->getTitle()->exists() ) {
+               if ( !$this->getTitle()->exists() ) {
                        return new FakeResultWrapper( array() );
                }
 
@@ -224,7 +224,7 @@ class HistoryAction extends FormlessAction {
                }
 
                if ( $offset ) {
-                       $offsets = array( 'rev_timestamp $oper ' . $dbr->addQuotes( $dbr->timestamp( $offset ) ) );
+                       $offsets = array( "rev_timestamp $oper " . $dbr->addQuotes( $dbr->timestamp( $offset ) ) );
                } else {
                        $offsets = array();
                }
@@ -256,7 +256,7 @@ class HistoryAction extends FormlessAction {
                        $this->getTitle()->getPrefixedText() . ' - ' .
                        $this->msg( 'history-feed-title' )->inContentLanguage()->text(),
                        $this->msg( 'history-feed-description' )->inContentLanguage()->text(),
-                       $this->getTitle()->getFullUrl( 'action=history' )
+                       $this->getTitle()->getFullURL( 'action=history' )
                );
 
                // Get a limit on number of feed entries. Provide a sane default
@@ -283,10 +283,10 @@ class HistoryAction extends FormlessAction {
                return new FeedItem(
                        $this->msg( 'nohistory' )->inContentLanguage()->text(),
                        $this->msg( 'history-feed-empty' )->inContentLanguage()->parseAsBlock(),
-                       $this->getTitle()->getFullUrl(),
+                       $this->getTitle()->getFullURL(),
                        wfTimestamp( TS_MW ),
                        '',
-                       $this->getTitle()->getTalkPage()->getFullUrl()
+                       $this->getTitle()->getTalkPage()->getFullURL()
                );
        }
 
@@ -323,10 +323,10 @@ class HistoryAction extends FormlessAction {
                return new FeedItem(
                        $title,
                        $text,
-                       $this->getTitle()->getFullUrl( 'diff=' . $rev->getId() . '&oldid=prev' ),
+                       $this->getTitle()->getFullURL( 'diff=' . $rev->getId() . '&oldid=prev' ),
                        $rev->getTimestamp(),
                        $rev->getUserText(),
-                       $this->getTitle()->getTalkPage()->getFullUrl()
+                       $this->getTitle()->getTalkPage()->getFullURL()
                );
        }
 }
@@ -367,14 +367,14 @@ class HistoryPager extends ReverseChronologicalPager {
 
        function getQueryInfo() {
                $queryInfo = array(
-                       'tables'  => array( 'revision', 'user' ),
-                       'fields'  => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
-                       'conds'   => array_merge(
+                       'tables' => array( 'revision', 'user' ),
+                       'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
+                       'conds' => array_merge(
                                array( 'rev_page' => $this->getWikiPage()->getId() ),
                                $this->conds ),
                        'options' => array( 'USE INDEX' => array( 'revision' => 'page_timestamp' ) ),
                        'join_conds' => array(
-                               'user'        => Revision::userJoinCond(),
+                               'user' => Revision::userJoinCond(),
                                'tag_summary' => array( 'LEFT JOIN', 'ts_rev_id=rev_id' ) ),
                );
                ChangeTags::modifyDisplayQuery(
@@ -413,10 +413,10 @@ class HistoryPager extends ReverseChronologicalPager {
                $batch = new LinkBatch();
                $revIds = array();
                foreach ( $this->mResult as $row ) {
-                       if( $row->rev_parent_id ) {
+                       if ( $row->rev_parent_id ) {
                                $revIds[] = $row->rev_parent_id;
                        }
-                       if( !is_null( $row->user_name ) ) {
+                       if ( !is_null( $row->user_name ) ) {
                                $batch->add( NS_USER, $row->user_name );
                                $batch->add( NS_USER_TALK, $row->user_name );
                        } else { # for anons or usernames of imported revisions
@@ -649,9 +649,9 @@ class HistoryPager extends ReverseChronologicalPager {
                                        $this->msg( 'editundo' )->escaped(),
                                        $undoTooltip,
                                        array(
-                                               'action'    => 'edit',
+                                               'action' => 'edit',
                                                'undoafter' => $prevRev->getId(),
-                                               'undo'      => $rev->getId()
+                                               'undo' => $rev->getId()
                                        )
                                );
                                $tools[] = "<span class=\"mw-history-undo\">{$undolink}</span>";
@@ -661,7 +661,7 @@ class HistoryPager extends ReverseChronologicalPager {
                wfRunHooks( 'HistoryRevisionTools', array( $rev, &$tools ) );
 
                if ( $tools ) {
-                       $s2 .= ' '. $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
+                       $s2 .= ' ' . $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
                }
 
                # Tags
@@ -788,13 +788,13 @@ class HistoryPager extends ReverseChronologicalPager {
        function diffButtons( $rev, $firstInList ) {
                if ( $this->getNumRows() > 1 ) {
                        $id = $rev->getId();
-                       $radio = array( 'type'  => 'radio', 'value' => $id );
-                       /** @todo: move title texts to javascript */
+                       $radio = array( 'type' => 'radio', 'value' => $id );
+                       /** @todo Move title texts to javascript */
                        if ( $firstInList ) {
                                $first = Xml::element( 'input',
                                        array_merge( $radio, array(
                                                'style' => 'visibility:hidden',
-                                               'name'  => 'oldid',
+                                               'name' => 'oldid',
                                                'id' => 'mw-oldid-null' ) )
                                );
                                $checkmark = array( 'checked' => 'checked' );
@@ -811,13 +811,13 @@ class HistoryPager extends ReverseChronologicalPager {
                                }
                                $first = Xml::element( 'input',
                                        array_merge( $radio, $checkmark, array(
-                                               'name'  => 'oldid',
+                                               'name' => 'oldid',
                                                'id' => "mw-oldid-$id" ) ) );
                                $checkmark = array();
                        }
                        $second = Xml::element( 'input',
                                array_merge( $radio, $checkmark, array(
-                                       'name'  => 'diff',
+                                       'name' => 'diff',
                                        'id' => "mw-diff-$id" ) ) );
                        return $first . $second;
                } else {
index 1e312d7..7cd1f72 100644 (file)
@@ -55,6 +55,22 @@ class InfoAction extends FormlessAction {
                return false;
        }
 
+       /**
+        * Clear the info cache for a given Title.
+        *
+        * @since 1.22
+        * @param Title $title Title to clear cache for
+        */
+       public static function invalidateCache( Title $title ) {
+               global $wgMemc;
+               // Clear page info.
+               $revision = WikiPage::factory( $title )->getRevision();
+               if ( $revision !== null ) {
+                       $memcKey = wfMemcKey( 'infoaction', $title->getPrefixedText(), $revision->getId() );
+                       $wgMemc->delete( $memcKey );
+               }
+       }
+
        /**
         * Shows page information on GET request.
         *
@@ -126,7 +142,7 @@ class InfoAction extends FormlessAction {
        /**
         * Creates a header that can be added to the output.
         *
-        * @param $header The header text.
+        * @param string $header The header text.
         * @return string The HTML.
         */
        protected function makeHeader( $header ) {
@@ -229,7 +245,7 @@ class InfoAction extends FormlessAction {
                }
 
                // Default sort key
-               $sortKey = $title->getCategorySortKey();
+               $sortKey = $title->getCategorySortkey();
                if ( !empty( $pageProperties['defaultsort'] ) ) {
                        $sortKey = $pageProperties['defaultsort'];
                }
@@ -602,7 +618,7 @@ class InfoAction extends FormlessAction {
                        'COUNT(*)',
                        array(
                                'wl_namespace' => $title->getNamespace(),
-                               'wl_title'     => $title->getDBkey(),
+                               'wl_title' => $title->getDBkey(),
                        ),
                        __METHOD__
                );
index 00bb961..ed0bff7 100644 (file)
@@ -71,7 +71,7 @@ class PurgeAction extends FormAction {
                                $this->getRequest()->getQueryValues(),
                                array( 'title' => null, 'action' => null )
                        ) );
-                       if( $this->onSubmit( array() ) ) {
+                       if ( $this->onSubmit( array() ) ) {
                                $this->onSuccess();
                        }
                } else {
@@ -96,6 +96,6 @@ class PurgeAction extends FormAction {
        }
 
        public function onSuccess() {
-               $this->getOutput()->redirect( $this->getTitle()->getFullUrl( $this->redirectParams ) );
+               $this->getOutput()->redirect( $this->getTitle()->getFullURL( $this->redirectParams ) );
        }
 }
index d1d457c..dd14311 100644 (file)
@@ -48,7 +48,7 @@ class RawAction extends FormlessAction {
        }
 
        function onView() {
-               global $wgSquidMaxage, $wgForcedRawSMaxage, $wgJsMimeType;
+               global $wgSquidMaxage, $wgForcedRawSMaxage;
 
                $this->getOutput()->disable();
                $request = $this->getRequest();
@@ -79,7 +79,7 @@ class RawAction extends FormlessAction {
 
                # Force caching for CSS and JS raw content, default: 5 minutes
                if ( $smaxage === null ) {
-                       if ( $contentType == 'text/css' || $contentType == $wgJsMimeType ) {
+                       if ( $contentType == 'text/css' || $contentType == 'text/javascript' ) {
                                $smaxage = intval( $wgForcedRawSMaxage );
                        } else {
                                $smaxage = 0;
@@ -125,7 +125,7 @@ class RawAction extends FormlessAction {
                global $wgParser;
 
                # No longer used
-               if( $this->mGen ) {
+               if ( $this->mGen ) {
                        return '';
                }
 
@@ -194,18 +194,18 @@ class RawAction extends FormlessAction {
                switch ( $this->getRequest()->getText( 'direction' ) ) {
                        case 'next':
                                # output next revision, or nothing if there isn't one
-                               if( $oldid ) {
-                                       $oldid = $this->getTitle()->getNextRevisionId( $oldid );
+                               if ( $oldid ) {
+                                       $oldid = $this->getTitle()->getNextRevisionID( $oldid );
                                }
                                $oldid = $oldid ? $oldid : -1;
                                break;
                        case 'prev':
                                # output previous revision, or nothing if there isn't one
-                               if( !$oldid ) {
+                               if ( !$oldid ) {
                                        # get the current revision so we can get the penultimate one
                                        $oldid = $this->page->getLatest();
                                }
-                               $prev = $this->getTitle()->getPreviousRevisionId( $oldid );
+                               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
                                $oldid = $prev ? $prev : -1;
                                break;
                        case 'cur':
@@ -221,20 +221,18 @@ class RawAction extends FormlessAction {
         * @return String
         */
        public function getContentType() {
-               global $wgJsMimeType;
-
                $ctype = $this->getRequest()->getVal( 'ctype' );
 
                if ( $ctype == '' ) {
                        $gen = $this->getRequest()->getVal( 'gen' );
                        if ( $gen == 'js' ) {
-                               $ctype = $wgJsMimeType;
+                               $ctype = 'text/javascript';
                        } elseif ( $gen == 'css' ) {
                                $ctype = 'text/css';
                        }
                }
 
-               $allowedCTypes = array( 'text/x-wiki', $wgJsMimeType, 'text/css', 'application/x-zope-edit' );
+               $allowedCTypes = array( 'text/x-wiki', 'text/javascript', 'text/css', 'application/x-zope-edit' );
                if ( $ctype == '' || !in_array( $ctype, $allowedCTypes ) ) {
                        $ctype = 'text/x-wiki';
                }
@@ -251,6 +249,10 @@ class RawAction extends FormlessAction {
 class RawPage extends RawAction {
        public $mOldId;
 
+       /**
+        * @param Page $page
+        * @param WebRequest|bool $request The WebRequest (default: false).
+        */
        function __construct( Page $page, $request = false ) {
                wfDeprecated( __CLASS__, '1.19' );
                parent::__construct( $page );
index ae5f76c..de9e1d6 100644 (file)
@@ -87,7 +87,7 @@ class WatchAction extends FormAction {
                return parent::checkCanExecute( $user );
        }
 
-       public static function doWatch( Title $title, User $user  ) {
+       public static function doWatch( Title $title, User $user ) {
                $page = WikiPage::factory( $title );
 
                if ( wfRunHooks( 'WatchArticle', array( &$user, &$page ) ) ) {
@@ -97,7 +97,7 @@ class WatchAction extends FormAction {
                return true;
        }
 
-       public static function doUnwatch( Title $title, User $user  ) {
+       public static function doUnwatch( Title $title, User $user ) {
                $page = WikiPage::factory( $title );
 
                if ( wfRunHooks( 'UnwatchArticle', array( &$user, &$page ) ) ) {
index d2d50ae..fdf3b76 100644 (file)
@@ -304,15 +304,14 @@ abstract class ApiBase extends ContextSource {
                        }
 
                        $examples = $this->getExamples();
-                       if ( $examples !== false && $examples !== '' ) {
+                       if ( $examples ) {
                                if ( !is_array( $examples ) ) {
                                        $examples = array(
                                                $examples
                                        );
                                }
                                $msg .= "Example" . ( count( $examples ) > 1 ? 's' : '' ) . ":\n";
-                               foreach( $examples as $k => $v ) {
-
+                               foreach ( $examples as $k => $v ) {
                                        if ( is_numeric( $k ) ) {
                                                $msg .= "  $v\n";
                                        } else {
@@ -445,7 +444,7 @@ abstract class ApiBase extends ContextSource {
                                                                $hintPipeSeparated = false;
                                                                break;
                                                        case 'limit':
-                                                               $desc .= $paramPrefix . "No more than {$paramSettings[self :: PARAM_MAX]}";
+                                                               $desc .= $paramPrefix . "No more than {$paramSettings[self::PARAM_MAX]}";
                                                                if ( isset( $paramSettings[self::PARAM_MAX2] ) ) {
                                                                        $desc .= " ({$paramSettings[self::PARAM_MAX2]} for bots)";
                                                                }
@@ -689,9 +688,9 @@ abstract class ApiBase extends ContextSource {
                        array( $this, "parameterNotEmpty" ) ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
-                       $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', "{$p}invalidparammix" );
+                       $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', 'invalidparammix' );
                } elseif ( count( $intersection ) == 0 ) {
-                       $this->dieUsage( "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', "{$p}missingparam" );
+                       $this->dieUsage( "One of the parameters {$p}" . implode( ", {$p}", $required ) . ' is required', 'missingparam' );
                }
        }
 
@@ -725,7 +724,7 @@ abstract class ApiBase extends ContextSource {
                        array( $this, "parameterNotEmpty" ) ) ), $required );
 
                if ( count( $intersection ) > 1 ) {
-                       $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', "{$p}invalidparammix" );
+                       $this->dieUsage( "The parameters {$p}" . implode( ", {$p}", $intersection ) . ' can not be used together', 'invalidparammix' );
                }
        }
 
@@ -967,9 +966,9 @@ abstract class ApiBase extends ContextSource {
                                                }
                                                break;
                                        case 'integer': // Force everything using intval() and optionally validate limits
-                                               $min = isset ( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
-                                               $max = isset ( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
-                                               $enforceLimits = isset ( $paramSettings[self::PARAM_RANGE_ENFORCE] )
+                                               $min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
+                                               $max = isset( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
+                                               $enforceLimits = isset( $paramSettings[self::PARAM_RANGE_ENFORCE] )
                                                                ? $paramSettings[self::PARAM_RANGE_ENFORCE] : false;
 
                                                if ( is_array( $value ) ) {
@@ -1081,7 +1080,7 @@ abstract class ApiBase extends ContextSource {
 
                if ( !$allowMultiple && count( $valuesList ) != 1 ) {
                        // Bug 33482 - Allow entries with | in them for non-multiple values
-                       if ( in_array( $value, $allowedValues ) ) {
+                       if ( in_array( $value, $allowedValues, true ) ) {
                                return $value;
                        }
 
@@ -1165,7 +1164,7 @@ abstract class ApiBase extends ContextSource {
        /**
         * Validate and normalize of parameters of type 'user'
         * @param string $value Parameter value
-        * @param string $encParamName Parameter value
+        * @param string $encParamName Parameter name
         * @return string Validated and normalized parameter
         */
        private function validateUser( $value, $encParamName ) {
@@ -1397,7 +1396,7 @@ abstract class ApiBase extends ContextSource {
        public function dieUsageMsg( $error ) {
                # most of the time we send a 1 element, so we might as well send it as
                # a string and make this an array here.
-               if( is_string( $error ) ) {
+               if ( is_string( $error ) ) {
                        $error = array( $error );
                }
                $parsed = $this->parseMsg( $error );
@@ -1412,10 +1411,10 @@ abstract class ApiBase extends ContextSource {
         */
        public function dieUsageMsgOrDebug( $error ) {
                global $wgDebugAPI;
-               if( $wgDebugAPI !== true ) {
+               if ( $wgDebugAPI !== true ) {
                        $this->dieUsageMsg( $error );
                } else {
-                       if( is_string( $error ) ) {
+                       if ( is_string( $error ) ) {
                                $error = array( $error );
                        }
                        $parsed = $this->parseMsg( $error );
@@ -1448,7 +1447,7 @@ abstract class ApiBase extends ContextSource {
 
                // Check whether the error array was nested
                // array( array( <code>, <params> ), array( <another_code>, <params> ) )
-               if( is_array( $key ) ) {
+               if ( is_array( $key ) ) {
                        $error = $key;
                        $key = array_shift( $error );
                }
@@ -1535,7 +1534,7 @@ abstract class ApiBase extends ContextSource {
        public function getWatchlistUser( $params ) {
                if ( !is_null( $params['owner'] ) && !is_null( $params['token'] ) ) {
                        $user = User::newFromName( $params['owner'], false );
-                       if ( !($user && $user->getId()) ) {
+                       if ( !( $user && $user->getId() ) ) {
                                $this->dieUsage( 'Specified user does not exist', 'bad_wlowner' );
                        }
                        $token = $user->getOption( 'watchlisttoken' );
@@ -1560,6 +1559,10 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Returns a list of all possible errors returned by the module
+        *
+        * Don't call this function directly: use getFinalPossibleErrors() to allow
+        * hooks to modify parameters as needed.
+        *
         * @return array in the format of array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
         */
        public function getPossibleErrors() {
@@ -1574,10 +1577,9 @@ abstract class ApiBase extends ContextSource {
                        }
                        if ( array_key_exists( 'continue', $params ) ) {
                                $ret[] = array(
-                                       array(
-                                               'code' => 'badcontinue',
-                                               'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
-                                       ) );
+                                       'code' => 'badcontinue',
+                                       'info' => 'Invalid continue param. You should pass the original value returned by the previous query'
+                               );
                        }
                }
 
@@ -1602,6 +1604,19 @@ abstract class ApiBase extends ContextSource {
                return $ret;
        }
 
+       /**
+        * Get final list of possible errors, after hooks have had a chance to
+        * tweak it as needed.
+        *
+        * @return array
+        * @since 1.22
+        */
+       public function getFinalPossibleErrors() {
+               $possibleErrors = $this->getPossibleErrors();
+               wfRunHooks( 'APIGetPossibleErrors', array( $this, &$possibleErrors ) );
+               return $possibleErrors;
+       }
+
        /**
         * Parses a list of errors into a standardised format
         * @param array $errors List of errors. Items can be in the for array( key, param1, param2, ... ) or array( 'code' => ..., 'info' => ... )
index 90432b9..ab0a7e9 100644 (file)
@@ -104,7 +104,7 @@ class ApiBlock extends ApiBase {
                $res['userID'] = $target instanceof User ? $target->getId() : 0;
 
                $block = Block::newFromTarget( $target );
-               if( $block instanceof Block ) {
+               if ( $block instanceof Block ) {
                        $res['expiry'] = $block->mExpiry == $this->getDB()->getInfinity()
                                ? 'infinite'
                                : wfTimestamp( TS_ISO_8601, $block->mExpiry );
index 79ffcb0..1e35c34 100644 (file)
@@ -81,17 +81,17 @@ class ApiComparePages extends ApiBase {
         * @return int
         */
        private function revisionOrTitleOrId( $revision, $titleText, $titleId ) {
-               if( $revision ) {
+               if ( $revision ) {
                        return $revision;
-               } elseif( $titleText ) {
+               } elseif ( $titleText ) {
                        $title = Title::newFromText( $titleText );
-                       if( !$title || $title->isExternal() ) {
+                       if ( !$title || $title->isExternal() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $titleText ) );
                        }
                        return $title->getLatestRevID();
                } elseif ( $titleId ) {
                        $title = Title::newFromID( $titleId );
-                       if( !$title ) {
+                       if ( !$title ) {
                                $this->dieUsageMsg( array( 'nosuchpageid', $titleId ) );
                        }
                        return $title->getLatestRevID();
index 55c60cc..59ff324 100644 (file)
@@ -43,17 +43,19 @@ class ApiCreateAccount extends ApiBase {
 
                $params = $this->extractRequestParams();
 
-               $result = array();
-
                // Init session if necessary
                if ( session_id() == '' ) {
                        wfSetupSession();
                }
 
-               if( $params['mailpassword'] && !$params['email'] ) {
+               if ( $params['mailpassword'] && !$params['email'] ) {
                        $this->dieUsageMsg( 'noemail' );
                }
 
+               if ( $params['language'] && !Language::isSupportedLanguage( $params['language'] ) ) {
+                       $this->dieUsage( 'Invalid language parameter', 'langinvalid' );
+               }
+
                $context = new DerivativeContext( $this->getContext() );
                $context->setRequest( new DerivativeRequest(
                        $this->getContext()->getRequest(),
@@ -78,22 +80,20 @@ class ApiCreateAccount extends ApiBase {
 
                $status = $loginForm->addNewaccountInternal();
                $result = array();
-               if( $status->isGood() ) {
+               if ( $status->isGood() ) {
                        // Success!
+                       global $wgEmailAuthentication;
                        $user = $status->getValue();
 
-                       // If we showed up language selection links, and one was in use, be
-                       // smart (and sensible) and save that language as the user's preference
-                       global $wgLoginLanguageSelector, $wgEmailAuthentication;
-                       if( $wgLoginLanguageSelector && $params['language'] ) {
+                       if ( $params['language'] ) {
                                $user->setOption( 'language', $params['language'] );
                        }
 
-                       if( $params['mailpassword'] ) {
+                       if ( $params['mailpassword'] ) {
                                // If mailpassword was set, disable the password and send an email.
                                $user->setPassword( null );
                                $status->merge( $loginForm->mailPasswordInternal( $user, false, 'createaccount-title', 'createaccount-text' ) );
-                       } elseif( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
+                       } elseif ( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
                                // Send out an email authentication message if needed
                                $status->merge( $user->sendConfirmationMail() );
                        }
@@ -120,18 +120,18 @@ class ApiCreateAccount extends ApiBase {
 
                $apiResult = $this->getResult();
 
-               if( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
+               if ( $status->hasMessage( 'sessionfailure' ) || $status->hasMessage( 'nocookiesfornew' ) ) {
                        // Token was incorrect, so add it to result, but don't throw an exception
                        // since not having the correct token is part of the normal
                        // flow of events.
                        $result['token'] = LoginForm::getCreateaccountToken();
                        $result['result'] = 'needtoken';
-               } elseif( !$status->isOK() ) {
+               } elseif ( !$status->isOK() ) {
                        // There was an error. Die now.
                        // Cannot use dieUsageMsg() directly because extensions
                        // might return custom error messages.
                        $errors = $status->getErrorsArray();
-                       if( $errors[0] instanceof Message ) {
+                       if ( $errors[0] instanceof Message ) {
                                $code = 'aborted';
                                $desc = $errors[0];
                        } else {
@@ -139,14 +139,14 @@ class ApiCreateAccount extends ApiBase {
                                $desc = wfMessage( $code, $errors[0] );
                        }
                        $this->dieUsage( $desc, $code );
-               } elseif( !$status->isGood() ) {
+               } elseif ( !$status->isGood() ) {
                        // Status is not good, but OK. This means warnings.
                        $result['result'] = 'warning';
 
                        // Add any warnings to the result
                        $warnings = $status->getErrorsByType( 'warning' );
-                       if( $warnings ) {
-                               foreach( $warnings as &$warning ) {
+                       if ( $warnings ) {
+                               foreach ( $warnings as &$warning ) {
                                        $apiResult->setIndexedTagName( $warning['params'], 'param' );
                                }
                                $apiResult->setIndexedTagName( $warnings, 'warning' );
@@ -259,7 +259,7 @@ class ApiCreateAccount extends ApiBase {
 
                $errors = parent::getPossibleErrors();
                // All local errors are from LoginForm, which means they're actually message keys.
-               foreach( $localErrors as $error ) {
+               foreach ( $localErrors as $error ) {
                        $errors[] = array( 'code' => $error, 'info' => wfMessage( $error )->parse() );
                }
 
@@ -275,6 +275,10 @@ class ApiCreateAccount extends ApiBase {
                        'code' => 'aborted',
                        'info' => 'Account creation aborted by hook (info may vary)'
                );
+               $errors[] = array(
+                       'code' => 'langinvalid',
+                       'info' => 'Invalid language parameter'
+               );
 
                // 'passwordtooshort' has parameters. :(
                global $wgMinimalPasswordLength;
index 4916145..3d0b425 100644 (file)
@@ -100,7 +100,7 @@ class ApiEditPage extends ApiBase {
                        $name = $titleObj->getPrefixedDBkey();
                        $model = $contentHandler->getModelID();
 
-                       $this->dieUsage( "The requested format $contentFormat is not supported for content model ".
+                       $this->dieUsage( "The requested format $contentFormat is not supported for content model " .
                                                        " $model used by $name", 'badformat' );
                }
 
@@ -146,7 +146,7 @@ class ApiEditPage extends ApiBase {
                                }
                        }
 
-                       // @todo: Add support for appending/prepending to the Content interface
+                       // @todo Add support for appending/prepending to the Content interface
 
                        if ( !( $content instanceof TextContent ) ) {
                                $mode = $contentHandler->getModelID();
@@ -262,7 +262,7 @@ class ApiEditPage extends ApiBase {
                        $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
                }
 
-               if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) )       {
+               if ( $params['minor'] || ( !$params['notminor'] && $user->getOption( 'minordefault' ) ) ) {
                        $requestArray['wpMinoredit'] = '';
                }
 
@@ -342,7 +342,7 @@ class ApiEditPage extends ApiBase {
                $wgRequest = $oldRequest;
                global $wgMaxArticleSize;
 
-               switch( $status->value ) {
+               switch ( $status->value ) {
                        case EditPage::AS_HOOK_ERROR:
                        case EditPage::AS_HOOK_ERROR_EXPECTED:
                                $this->dieUsageMsg( 'hookaborted' );
index f5898fb..d5c789c 100644 (file)
@@ -65,14 +65,14 @@ class ApiExpandTemplates extends ApiBase {
                                $xml = $dom->__toString();
                        }
                        $xml_result = array();
-                       $result->setContent( $xml_result, $xml );
+                       ApiResult::setContent( $xml_result, $xml );
                        $result->addValue( null, 'parsetree', $xml_result );
                }
                $retval = $wgParser->preprocess( $params['text'], $title_obj, $options );
 
                // Return result
                $retval_array = array();
-               $result->setContent( $retval_array, $retval );
+               ApiResult::setContent( $retval_array, $retval );
                $result->addValue( null, $this->getModuleName(), $retval_array );
        }
 
index 015a992..abd657c 100644 (file)
@@ -43,11 +43,11 @@ class ApiFeedContributions extends ApiBase {
 
                global $wgFeed, $wgFeedClasses, $wgSitename, $wgLanguageCode;
 
-               if( !$wgFeed ) {
+               if ( !$wgFeed ) {
                        $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
                }
 
-               if( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+               if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
                        $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                }
 
@@ -82,7 +82,7 @@ class ApiFeedContributions extends ApiBase {
                ) );
 
                $feedItems = array();
-               if( $pager->getNumRows() > 0 ) {
+               if ( $pager->getNumRows() > 0 ) {
                        foreach ( $pager->mResult as $row ) {
                                $feedItems[] = $this->feedItem( $row );
                        }
@@ -93,7 +93,7 @@ class ApiFeedContributions extends ApiBase {
 
        protected function feedItem( $row ) {
                $title = Title::makeTitle( intval( $row->page_namespace ), $row->page_title );
-               if( $title ) {
+               if ( $title && $title->userCan( 'read' ) ) {
                        $date = $row->rev_timestamp;
                        $comments = $title->getTalkPage()->getFullURL();
                        $revision = Revision::newFromRow( $row );
@@ -106,9 +106,8 @@ class ApiFeedContributions extends ApiBase {
                                $this->feedItemAuthor( $revision ),
                                $comments
                        );
-               } else {
-                       return null;
                }
+               return null;
        }
 
        /**
@@ -124,7 +123,7 @@ class ApiFeedContributions extends ApiBase {
         * @return string
         */
        protected function feedItemDesc( $revision ) {
-               if( $revision ) {
+               if ( $revision ) {
                        $msg = wfMessage( 'colon-separator' )->inContentLanguage()->text();
                        $content = $revision->getContent();
 
@@ -149,7 +148,7 @@ class ApiFeedContributions extends ApiBase {
        public function getAllowedParams() {
                global $wgFeedClasses;
                $feedFormatNames = array_keys( $wgFeedClasses );
-               return array (
+               return array(
                        'feedformat' => array(
                                ApiBase::PARAM_DFLT => 'rss',
                                ApiBase::PARAM_TYPE => $feedFormatNames
index 6c793b3..9f6b8b4 100644 (file)
  */
 class ApiFeedWatchlist extends ApiBase {
 
+       private $watchlistModule = null;
+       private $linkToDiffs = false;
+       private $linkToSections = false;
+
        /**
         * This module uses a custom feed wrapper printer.
         *
@@ -42,8 +46,6 @@ class ApiFeedWatchlist extends ApiBase {
                return new ApiFormatFeedWrapper( $this->getMain() );
        }
 
-       private $linkToDiffs = false;
-
        /**
         * Make a nested call to the API to request watchlist items in the last $hours.
         * Wrap the result as an RSS/Atom feed.
@@ -54,11 +56,11 @@ class ApiFeedWatchlist extends ApiBase {
                try {
                        $params = $this->extractRequestParams();
 
-                       if( !$wgFeed ) {
+                       if ( !$wgFeed ) {
                                $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
                        }
 
-                       if( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+                       if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
                                $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                        }
 
@@ -86,6 +88,12 @@ class ApiFeedWatchlist extends ApiBase {
                        if ( $params['wlexcludeuser'] !== null ) {
                                $fauxReqArr['wlexcludeuser'] = $params['wlexcludeuser'];
                        }
+                       if ( $params['wlshow'] !== null ) {
+                               $fauxReqArr['wlshow'] = $params['wlshow'];
+                       }
+                       if ( $params['wltype'] !== null ) {
+                               $fauxReqArr['wltype'] = $params['wltype'];
+                       }
 
                        // Support linking to diffs instead of article
                        if ( $params['linktodiffs'] ) {
@@ -93,6 +101,12 @@ class ApiFeedWatchlist extends ApiBase {
                                $fauxReqArr['wlprop'] .= '|ids';
                        }
 
+                       // Support linking directly to sections when possible
+                       // (possible only if section name is present in comment)
+                       if ( $params['linktosections'] ) {
+                               $this->linkToSections = true;
+                       }
+
                        // Check for 'allrev' parameter, and if found, show all revisions to each page on wl.
                        if ( $params['allrev'] ) {
                                $fauxReqArr['wlallrev'] = '';
@@ -160,6 +174,18 @@ class ApiFeedWatchlist extends ApiBase {
                        $titleUrl = $title->getFullURL();
                }
                $comment = isset( $info['comment'] ) ? $info['comment'] : null;
+
+               // Create an anchor to section.
+               // The anchor won't work for sections that have dupes on page
+               // as there's no way to strip that info from ApiWatchlist (apparently?).
+               // RegExp in the line below is equal to Linker::formatAutocomments().
+               if ( $this->linkToSections && $comment !== null && preg_match( '!(.*)/\*\s*(.*?)\s*\*/(.*)!', $comment, $matches ) ) {
+                       global $wgParser;
+                       $sectionTitle = $wgParser->stripSectionName( $matches[2] );
+                       $sectionTitle = Sanitizer::normalizeSectionNameWhitespace( $sectionTitle );
+                       $titleUrl .= Title::newFromText( '#' . $sectionTitle )->getFragmentForURL();
+               }
+
                $timestamp = $info['timestamp'];
                $user = $info['user'];
 
@@ -168,10 +194,18 @@ class ApiFeedWatchlist extends ApiBase {
                return new FeedItem( $titleStr, $completeText, $titleUrl, $timestamp, $user );
        }
 
-       public function getAllowedParams() {
+       private function getWatchlistModule() {
+               if ( $this->watchlistModule === null ) {
+                       $this->watchlistModule = $this->getMain()->getModuleManager()->getModule( 'query' )
+                               ->getModuleManager()->getModule( 'watchlist' );
+               }
+               return $this->watchlistModule;
+       }
+
+       public function getAllowedParams( $flags = 0 ) {
                global $wgFeedClasses;
                $feedFormatNames = array_keys( $wgFeedClasses );
-               return array (
+               $ret = array(
                        'feedformat' => array(
                                ApiBase::PARAM_DFLT => 'rss',
                                ApiBase::PARAM_TYPE => $feedFormatNames
@@ -182,29 +216,41 @@ class ApiFeedWatchlist extends ApiBase {
                                ApiBase::PARAM_MIN => 1,
                                ApiBase::PARAM_MAX => 72,
                        ),
-                       'allrev' => false,
-                       'wlowner' => array(
-                               ApiBase::PARAM_TYPE => 'user'
-                       ),
-                       'wltoken' => array(
-                               ApiBase::PARAM_TYPE => 'string'
-                       ),
-                       'wlexcludeuser' => array(
-                               ApiBase::PARAM_TYPE => 'user'
-                       ),
                        'linktodiffs' => false,
+                       'linktosections' => false,
                );
+               if ( $flags ) {
+                       $wlparams = $this->getWatchlistModule()->getAllowedParams( $flags );
+                       $ret['allrev'] = $wlparams['allrev'];
+                       $ret['wlowner'] = $wlparams['owner'];
+                       $ret['wltoken'] = $wlparams['token'];
+                       $ret['wlshow'] = $wlparams['show'];
+                       $ret['wltype'] = $wlparams['type'];
+                       $ret['wlexcludeuser'] = $wlparams['excludeuser'];
+               } else {
+                       $ret['allrev'] = null;
+                       $ret['wlowner'] = null;
+                       $ret['wltoken'] = null;
+                       $ret['wlshow'] = null;
+                       $ret['wltype'] = null;
+                       $ret['wlexcludeuser'] = null;
+               }
+               return $ret;
        }
 
        public function getParamDescription() {
+               $wldescr = $this->getWatchlistModule()->getParamDescription();
                return array(
                        'feedformat' => 'The format of the feed',
-                       'hours'      => 'List pages modified within this many hours from now',
-                       'allrev'     => 'Include multiple revisions of the same page within given timeframe',
-                       'wlowner'    => "The user whose watchlist you want (must be accompanied by {$this->getModulePrefix()}wltoken if it's not you)",
-                       'wltoken'    => 'Security token that requested user set in their preferences',
-                       'wlexcludeuser' => 'A user whose edits should not be shown in the watchlist',
+                       'hours' => 'List pages modified within this many hours from now',
                        'linktodiffs' => 'Link to change differences instead of article pages',
+                       'linktosections' => 'Link directly to changed sections if possible',
+                       'allrev' => $wldescr['allrev'],
+                       'wlowner' => $wldescr['owner'],
+                       'wltoken' => $wldescr['token'],
+                       'wlshow' => $wldescr['show'],
+                       'wltype' => $wldescr['type'],
+                       'wlexcludeuser' => $wldescr['excludeuser'],
                );
        }
 
index e8e6acf..b89fb3a 100644 (file)
@@ -170,12 +170,12 @@ abstract class ApiFormatBase extends ApiBase {
 ?>
 <br />
 <small>
-You are looking at the HTML representation of the <?php echo( $this->mFormat ); ?> format.<br />
+You are looking at the HTML representation of the <?php echo $this->mFormat; ?> format.<br />
 HTML is good for debugging, but is unsuitable for application use.<br />
 Specify the format parameter to change the output format.<br />
-To see the non HTML representation of the <?php echo( $this->mFormat ); ?> format, set format=<?php echo( strtolower( $this->mFormat ) ); ?>.<br />
+To see the non HTML representation of the <?php echo $this->mFormat; ?> format, set format=<?php echo strtolower( $this->mFormat ); ?>.<br />
 See the <a href='https://www.mediawiki.org/wiki/API'>complete documentation</a>, or
-<a href='<?php echo( $script ); ?>'>API help</a> for more information.
+<a href='<?php echo $script; ?>'>API help</a> for more information.
 </small>
 <pre style='white-space: pre-wrap;'>
 <?php
index abb6348..342a580 100644 (file)
@@ -56,30 +56,32 @@ class ApiFormatJson extends ApiFormatBase {
        }
 
        public function execute() {
-               $prefix = $suffix = '';
-
                $params = $this->extractRequestParams();
+               $json = FormatJson::encode(
+                       $this->getResultData(),
+                       $this->getIsHtml(),
+                       $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK
+               );
                $callback = $params['callback'];
-               if ( !is_null( $callback ) ) {
-                       $prefix = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback ) . '(';
-                       $suffix = ')';
+               if ( $callback !== null ) {
+                       $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback );
+                       $this->printText( "$callback($json)" );
+               } else {
+                       $this->printText( $json );
                }
-               $this->printText(
-                       $prefix .
-                       FormatJson::encode( $this->getResultData(), $this->getIsHtml() ) .
-                       $suffix
-               );
        }
 
        public function getAllowedParams() {
                return array(
-                       'callback'  => null,
+                       'callback' => null,
+                       'utf8' => false,
                );
        }
 
        public function getParamDescription() {
                return array(
                        'callback' => 'If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.',
+                       'utf8' => 'If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences.',
                );
        }
 
index 884a1dc..5685d93 100644 (file)
@@ -46,7 +46,7 @@ class ApiFormatWddx extends ApiFormatBase {
                } else {
                        // Don't do newlines and indentation if we weren't asked
                        // for pretty output
-                       $nl = ( $this->getIsHtml() ? '' : "\n" );
+                       $nl = ( $this->getIsHtml() ? "\n" : '' );
                        $indstr = ' ';
                        $this->printText( "<?xml version=\"1.0\"?>$nl" );
                        $this->printText( "<wddxPacket version=\"1.0\">$nl" );
@@ -64,9 +64,9 @@ class ApiFormatWddx extends ApiFormatBase {
         * @param $indent int
         */
        function slowWddxPrinter( $elemValue, $indent = 0 ) {
-               $indstr = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent ) );
-               $indstr2 = ( $this->getIsHtml() ? '' : str_repeat( ' ', $indent + 2 ) );
-               $nl = ( $this->getIsHtml() ? '' : "\n" );
+               $indstr = ( $this->getIsHtml() ? str_repeat( ' ', $indent ) : '' );
+               $indstr2 = ( $this->getIsHtml() ? str_repeat( ' ', $indent + 2 ) : '' );
+               $nl = ( $this->getIsHtml() ? "\n" : '' );
                if ( is_array( $elemValue ) ) {
                        // Check whether we've got an associative array (<struct>)
                        // or a regular array (<array>)
@@ -95,6 +95,10 @@ class ApiFormatWddx extends ApiFormatBase {
                        $this->printText( $indstr . Xml::element( 'number', null, $elemValue ) . $nl );
                } elseif ( is_string( $elemValue ) ) {
                        $this->printText( $indstr . Xml::element( 'string', null, $elemValue ) . $nl );
+               } elseif ( is_bool( $elemValue ) ) {
+                       $this->printText( $indstr . Xml::element( 'boolean',
+                               array( 'value' => $elemValue ? 'true' : 'false' ) ) . $nl
+                       );
                } else {
                        ApiBase::dieDebug( __METHOD__, 'Unknown type ' . gettype( $elemValue ) );
                }
index 183d48c..4ec149c 100644 (file)
@@ -32,7 +32,6 @@ class ApiFormatXml extends ApiFormatBase {
 
        private $mRootElemName = 'api';
        public static $namespace = 'http://www.mediawiki.org/xml/api/';
-       private $mDoubleQuote = false;
        private $mIncludeNamespace = false;
        private $mXslt = null;
 
@@ -50,7 +49,6 @@ class ApiFormatXml extends ApiFormatBase {
 
        public function execute() {
                $params = $this->extractRequestParams();
-               $this->mDoubleQuote = $params['xmldoublequote'];
                $this->mIncludeNamespace = $params['includexmlnamespace'];
                $this->mXslt = $params['xslt'];
 
@@ -71,8 +69,7 @@ class ApiFormatXml extends ApiFormatBase {
                $this->printText(
                        self::recXmlPrint( $this->mRootElemName,
                                $data,
-                               $this->getIsHtml() ? - 2 : null,
-                               $this->mDoubleQuote
+                               $this->getIsHtml() ? - 2 : null
                        )
                );
        }
@@ -117,11 +114,10 @@ class ApiFormatXml extends ApiFormatBase {
         * @param $elemName
         * @param $elemValue
         * @param $indent
-        * @param $doublequote bool
         *
         * @return string
         */
-       public static function recXmlPrint( $elemName, $elemValue, $indent, $doublequote = false ) {
+       public static function recXmlPrint( $elemName, $elemValue, $indent ) {
                $retval = '';
                if ( !is_null( $indent ) ) {
                        $indent += 2;
@@ -134,9 +130,6 @@ class ApiFormatXml extends ApiFormatBase {
                if ( is_array( $elemValue ) ) {
                        if ( isset( $elemValue['*'] ) ) {
                                $subElemContent = $elemValue['*'];
-                               if ( $doublequote ) {
-                                       $subElemContent = Sanitizer::encodeAttribute( $subElemContent );
-                               }
                                unset( $elemValue['*'] );
 
                                // Add xml:space="preserve" to the
@@ -157,16 +150,12 @@ class ApiFormatXml extends ApiFormatBase {
                        $indElements = array();
                        $subElements = array();
                        foreach ( $elemValue as $subElemId => & $subElemValue ) {
-                               if ( is_string( $subElemValue ) && $doublequote ) {
-                                       $subElemValue = Sanitizer::encodeAttribute( $subElemValue );
-                               }
-
                                if ( is_int( $subElemId ) ) {
                                        $indElements[] = $subElemValue;
                                        unset( $elemValue[$subElemId] );
                                } elseif ( is_array( $subElemValue ) ) {
                                        $subElements[$subElemId] = $subElemValue;
-                                       unset ( $elemValue[$subElemId] );
+                                       unset( $elemValue[$subElemId] );
                                }
                        }
 
@@ -226,7 +215,6 @@ class ApiFormatXml extends ApiFormatBase {
 
        public function getAllowedParams() {
                return array(
-                       'xmldoublequote' => false,
                        'xslt' => null,
                        'includexmlnamespace' => false,
                );
@@ -234,7 +222,6 @@ class ApiFormatXml extends ApiFormatBase {
 
        public function getParamDescription() {
                return array(
-                       'xmldoublequote' => 'If specified, double quotes all attributes and content',
                        'xslt' => 'If specified, adds <xslt> as stylesheet. This should be a wiki page '
                                . 'in the MediaWiki namespace whose page name ends with ".xsl"',
                        'includexmlnamespace' => 'If specified, adds an XML namespace'
index b2d7582..7a60e83 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 class ApiImageRotate extends ApiBase {
-
        private $mPageSet = null;
 
        public function __construct( $main, $action ) {
@@ -38,31 +37,28 @@ class ApiImageRotate extends ApiBase {
         */
        private static function addValues( array &$result, $values, $flag = null, $name = null ) {
                foreach ( $values as $val ) {
-                       if( $val instanceof Title ) {
+                       if ( $val instanceof Title ) {
                                $v = array();
                                ApiQueryBase::addTitleInfo( $v, $val );
-                       } elseif( $name !== null ) {
+                       } elseif ( $name !== null ) {
                                $v = array( $name => $val );
                        } else {
                                $v = $val;
                        }
-                       if( $flag !== null ) {
+                       if ( $flag !== null ) {
                                $v[$flag] = '';
                        }
                        $result[] = $v;
                }
        }
 
-
        public function execute() {
                $params = $this->extractRequestParams();
-               $rotation = $params[ 'rotation' ];
-               $user = $this->getUser();
+               $rotation = $params['rotation'];
 
                $pageSet = $this->getPageSet();
                $pageSet->execute();
 
-               $result = array();
                $result = array();
 
                self::addValues( $result, $pageSet->getInvalidTitles(), 'invalid', 'title' );
@@ -111,15 +107,17 @@ class ApiImageRotate extends ApiBase {
                                continue;
                        }
                        $ext = strtolower( pathinfo( "$srcPath", PATHINFO_EXTENSION ) );
-                       $tmpFile = TempFSFile::factory( 'rotate_', $ext);
+                       $tmpFile = TempFSFile::factory( 'rotate_', $ext );
                        $dstPath = $tmpFile->getPath();
                        $err = $handler->rotate( $file, array(
                                "srcPath" => $srcPath,
                                "dstPath" => $dstPath,
-                               "rotation"=> $rotation
+                               "rotation" => $rotation
                        ) );
                        if ( !$err ) {
-                               $comment = wfMessage( 'rotate-comment' )->numParams( $rotation )->text();
+                               $comment = wfMessage(
+                                       'rotate-comment'
+                               )->numParams( $rotation )->inContentLanguage()->text();
                                $status = $file->upload( $dstPath,
                                        $comment, $comment, 0, false, false, $this->getUser() );
                                if ( $status->isGood() ) {
@@ -152,13 +150,14 @@ class ApiImageRotate extends ApiBase {
 
        /**
         * Checks that the user has permissions to perform rotations.
-        * @param $user User The user to check.
+        * @param User $user The user to check
+        * @param Title $title
         * @return string|null Permission error message, or null if there is no error
         */
        protected function checkPermissions( $user, $title ) {
                $permissionErrors = array_merge(
-                       $title->getUserPermissionsErrors( 'edit' , $user ),
-                       $title->getUserPermissionsErrors( 'upload' , $user )
+                       $title->getUserPermissionsErrors( 'edit', $user ),
+                       $title->getUserPermissionsErrors( 'upload', $user )
                );
 
                if ( $permissionErrors ) {
@@ -179,7 +178,6 @@ class ApiImageRotate extends ApiBase {
        }
 
        public function getAllowedParams( $flags = 0 ) {
-               $pageSet = $this->getPageSet();
                $result = array(
                        'rotation' => array(
                                ApiBase::PARAM_TYPE => array( '90', '180', '270' ),
@@ -198,7 +196,7 @@ class ApiImageRotate extends ApiBase {
 
        public function getParamDescription() {
                $pageSet = $this->getPageSet();
-               return $pageSet->getParamDescription() + array(
+               return $pageSet->getFinalParamDescription() + array(
                        'rotation' => 'Degrees to rotate image clockwise',
                        'token' => 'Edit token. You can get one of these through action=tokens',
                );
@@ -220,7 +218,7 @@ class ApiImageRotate extends ApiBase {
                $pageSet = $this->getPageSet();
                return array_merge(
                        parent::getPossibleErrors(),
-                       $pageSet->getPossibleErrors()
+                       $pageSet->getFinalPossibleErrors()
                );
        }
 
index 1f0a5fa..56af76f 100644 (file)
@@ -66,7 +66,7 @@ class ApiImport extends ApiBase {
                }
                if ( isset( $params['rootpage'] ) ) {
                        $statusRootPage = $importer->setTargetRootPage( $params['rootpage'] );
-                       if( !$statusRootPage->isGood() ) {
+                       if ( !$statusRootPage->isGood() ) {
                                $this->dieUsageMsg( $statusRootPage->getErrorsArray() );
                        }
                }
index 80bca2f..5ddb3ab 100644 (file)
@@ -83,7 +83,7 @@ class ApiMain extends ApiBase {
                'import' => 'ApiImport',
                'userrights' => 'ApiUserrights',
                'options' => 'ApiOptions',
-               'imagerotate' =>'ApiImageRotate',
+               'imagerotate' => 'ApiImageRotate',
        );
 
        /**
@@ -418,7 +418,7 @@ class ApiMain extends ApiBase {
                }
 
                // Log the request whether or not there was an error
-               $this->logRequest( microtime( true ) - $t);
+               $this->logRequest( microtime( true ) - $t );
 
                // Send cache headers after any code which might generate an error, to
                // avoid sending public cache headers for errors.
@@ -609,7 +609,7 @@ class ApiMain extends ApiBase {
 
                $result = $this->getResult();
                // Printer may not be initialized if the extractRequestParams() fails for the main module
-               if ( !isset ( $this->mPrinter ) ) {
+               if ( !isset( $this->mPrinter ) ) {
                        // The printer has not been created yet. Try to manually get formatter value.
                        $value = $this->getRequest()->getVal( 'format', self::API_DEFAULT_FORMAT );
                        if ( !$this->mModuleMgr->isDefined( $value, 'format' ) ) {
@@ -788,7 +788,7 @@ class ApiMain extends ApiBase {
 
                // Allow extensions to stop execution for arbitrary reasons.
                $message = false;
-               if( !wfRunHooks( 'ApiCheckCanExecute', array( $module, $user, &$message ) ) ) {
+               if ( !wfRunHooks( 'ApiCheckCanExecute', array( $module, $user, &$message ) ) ) {
                        $this->dieUsageMsg( $message );
                }
        }
@@ -863,7 +863,7 @@ class ApiMain extends ApiBase {
                        ' ' . $request->getMethod() .
                        ' ' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) .
                        ' ' . $request->getIP() .
-                       ' T=' . $milliseconds .'ms';
+                       ' T=' . $milliseconds . 'ms';
                foreach ( $this->getParamsUsed() as $name ) {
                        $value = $request->getVal( $name );
                        if ( $value === null ) {
@@ -950,7 +950,7 @@ class ApiMain extends ApiBase {
                        $unusedParams = array_diff( $allParams, $paramsUsed );
                }
 
-               if( count( $unusedParams ) ) {
+               if ( count( $unusedParams ) ) {
                        $s = count( $unusedParams ) > 1 ? 's' : '';
                        $this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
                }
@@ -963,7 +963,7 @@ class ApiMain extends ApiBase {
         */
        protected function printResult( $isError ) {
                global $wgDebugAPI;
-               if( $wgDebugAPI !== false ) {
+               if ( $wgDebugAPI !== false ) {
                        $this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
                }
 
@@ -1008,7 +1008,7 @@ class ApiMain extends ApiBase {
                                ApiBase::PARAM_DFLT => 'help',
                                ApiBase::PARAM_TYPE => $this->mModuleMgr->getNames( 'action' )
                        ),
-                       'maxlag'  => array(
+                       'maxlag' => array(
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'smaxage' => array(
@@ -1020,7 +1020,7 @@ class ApiMain extends ApiBase {
                                ApiBase::PARAM_DFLT => 0
                        ),
                        'requestid' => null,
-                       'servedby'  => false,
+                       'servedby' => false,
                        'origin' => null,
                );
        }
@@ -1048,6 +1048,7 @@ class ApiMain extends ApiBase {
                        'servedby' => 'Include the hostname that served the request in the results. Unconditionally shown on error',
                        'origin' => array(
                                '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 Origin: header exactly, so it has to be set to something like http://en.wikipedia.org or https://meta.wikimedia.org .',
                                'If this parameter does not match the Origin: header, a 403 response will be returned.',
                                'If this parameter matches the Origin: header and the origin is whitelisted, an Access-Control-Allow-Origin header will be set.',
@@ -1120,7 +1121,7 @@ class ApiMain extends ApiBase {
                return array(
                        'API developers:',
                        '    Roan Kattouw "<Firstname>.<Lastname>@gmail.com" (lead developer Sep 2007-2009)',
-                       '    Victor Vasiliev - vasilvv at gee mail dot com',
+                       '    Victor Vasiliev - vasilvv @ gmail . com',
                        '    Bryan Tong Minh - bryan . tongminh @ gmail . com',
                        '    Sam Reed - sam @ reedyboy . net',
                        '    Yuri Astrakhan "<Firstname><Lastname>@gmail.com" (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
index 3e846e3..c18036c 100644 (file)
@@ -88,7 +88,7 @@ class ApiMove extends ApiBase {
                        $r['redirectcreated'] = '';
                }
 
-               if( $toTitleExists ) {
+               if ( $toTitleExists ) {
                        $r['moveoverredirect'] = '';
                }
 
@@ -99,7 +99,7 @@ class ApiMove extends ApiBase {
                        if ( $retval === true ) {
                                $r['talkfrom'] = $fromTalk->getPrefixedText();
                                $r['talkto'] = $toTalk->getPrefixedText();
-                               if( $toTalkExists ) {
+                               if ( $toTalkExists ) {
                                        $r['talkmoveoverredirect'] = '';
                                }
                        } else {
index caf361a..315ace3 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- *
- *
  * Created on Oct 13, 2006
  *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  */
 class ApiOpenSearch extends ApiBase {
 
+       /**
+        * Override built-in handling of format parameter.
+        * Only JSON is supported.
+        *
+        * @return ApiFormatBase
+        */
        public function getCustomPrinter() {
-               return $this->getMain()->createPrinterByName( 'json' );
+               $params = $this->extractRequestParams();
+               $format = $params['format'];
+               $allowed = array( 'json', 'jsonfm' );
+               if ( in_array( $format, $allowed ) ) {
+                       return $this->getMain()->createPrinterByName( $format );
+               }
+               return $this->getMain()->createPrinterByName( $allowed[0] );
        }
 
        public function execute() {
@@ -94,6 +104,10 @@ class ApiOpenSearch extends ApiBase {
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'suggest' => false,
+                       'format' => array(
+                               ApiBase::PARAM_DFLT => 'json',
+                               ApiBase::PARAM_TYPE => array( 'json', 'jsonfm' ),
+                       )
                );
        }
 
@@ -103,6 +117,7 @@ class ApiOpenSearch extends ApiBase {
                        'limit' => 'Maximum amount of results to return',
                        'namespace' => 'Namespaces to search',
                        'suggest' => 'Do nothing if $wgEnableOpenSearchSuggest is false',
+                       'format' => 'The format of the output',
                );
        }
 
index bab59b7..9fdad2b 100644 (file)
@@ -69,6 +69,9 @@ class ApiPageSet extends ApiBase {
        private $mFakePageId = -1;
        private $mCacheMode = 'public';
        private $mRequestedPageFields = array();
+       /**
+        * @var int
+        */
        private $mDefaultNamespace = NS_MAIN;
 
        /**
@@ -185,7 +188,7 @@ class ApiPageSet extends ApiBase {
 
                        if ( !$isDryRun ) {
                                // Populate page information with the original user input
-                               switch( $dataSource ) {
+                               switch ( $dataSource ) {
                                        case 'titles':
                                                $this->initFromTitles( $this->mParams['titles'] );
                                                break;
@@ -217,6 +220,30 @@ class ApiPageSet extends ApiBase {
                return $this->mResolveRedirects;
        }
 
+       /**
+        * Return the parameter name that is the source of data for this PageSet
+        *
+        * If multiple source parameters are specified (e.g. titles and pageids),
+        * one will be named arbitrarily.
+        *
+        * @return string|null
+        */
+       public function getDataSource() {
+               if ( $this->mAllowGenerator && isset( $this->mParams['generator'] ) ) {
+                       return 'generator';
+               }
+               if ( isset( $this->mParams['titles'] ) ) {
+                       return 'titles';
+               }
+               if ( isset( $this->mParams['pageids'] ) ) {
+                       return 'pageids';
+               }
+               if ( isset( $this->mParams['revids'] ) ) {
+                       return 'revids';
+               }
+               return null;
+       }
+
        /**
         * Request an additional field from the page table.
         * Must be called before execute()
@@ -380,7 +407,7 @@ class ApiPageSet extends ApiBase {
         * @return array of raw_prefixed_title (string) => prefixed_title (string)
         * @since 1.21
         */
-       public function getNormalizedTitlesAsResult( $result = null  ) {
+       public function getNormalizedTitlesAsResult( $result = null ) {
                $values = array();
                foreach ( $this->getNormalizedTitles() as $rawTitleStr => $titleStr ) {
                        $values[] = array(
@@ -571,13 +598,13 @@ class ApiPageSet extends ApiBase {
                }
 
                foreach ( $this->mRequestedPageFields as $fieldName => &$fieldValues ) {
-                       $fieldValues[$pageId] = $row-> $fieldName;
+                       $fieldValues[$pageId] = $row->$fieldName;
                }
        }
 
        /**
         * Do not use, does nothing, will be removed
-        * @deprecated 1.21
+        * @deprecated since 1.21
         */
        public function finishPageSetGeneration() {
                wfDeprecated( __METHOD__, '1.21' );
@@ -835,7 +862,7 @@ class ApiPageSet extends ApiBase {
                        $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
                        $to = Title::makeTitle( $row->rd_namespace, $row->rd_title, $row->rd_fragment, $row->rd_interwiki );
                        unset( $this->mPendingRedirectIDs[$rdfrom] );
-                       if ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
+                       if ( !$to->isExternal() && !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
                                $lb->add( $row->rd_namespace, $row->rd_title );
                        }
                        $this->mRedirectTitles[$from] = $to;
index 27f8cef..3e1a753 100644 (file)
@@ -149,7 +149,7 @@ class ApiParamInfo extends ApiBase {
                                $item = array();
                                if ( is_numeric( $k ) ) {
                                        $retval['examples'] .= $v;
-                                       $result->setContent( $item, $v );
+                                       ApiResult::setContent( $item, $v );
                                } else {
                                        if ( !is_array( $v ) ) {
                                                $item['description'] = $v;
@@ -157,7 +157,7 @@ class ApiParamInfo extends ApiBase {
                                                $item['description'] = implode( $v, "\n" );
                                        }
                                        $retval['examples'] .= $item['description'] . ' ' . $k;
-                                       $result->setContent( $item, $k );
+                                       ApiResult::setContent( $item, $k );
                                }
                                $retval['allexamples'][] = $item;
                        }
@@ -300,7 +300,7 @@ class ApiParamInfo extends ApiBase {
                }
 
                // Errors
-               $retval['errors'] = $this->parseErrors( $obj->getPossibleErrors() );
+               $retval['errors'] = $this->parseErrors( $obj->getFinalPossibleErrors() );
                $result->setIndexedTagName( $retval['errors'], 'error' );
 
                return $retval;
index 09b7a88..bde1d99 100644 (file)
@@ -194,10 +194,10 @@ class ApiParse extends ApiBase {
                                // Build a result and bail out
                                $result_array = array();
                                $result_array['text'] = array();
-                               $result->setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
+                               ApiResult::setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
                                if ( isset( $prop['wikitext'] ) ) {
                                        $result_array['wikitext'] = array();
-                                       $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+                                       ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
                                }
                                $result->addValue( null, $this->getModuleName(), $result_array );
                                return;
@@ -225,21 +225,35 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['text'] ) ) {
                        $result_array['text'] = array();
-                       $result->setContent( $result_array['text'], $p_result->getText() );
+                       ApiResult::setContent( $result_array['text'], $p_result->getText() );
                }
 
                if ( !is_null( $params['summary'] ) ) {
                        $result_array['parsedsummary'] = array();
-                       $result->setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
+                       ApiResult::setContent( $result_array['parsedsummary'], Linker::formatComment( $params['summary'], $titleObj ) );
+               }
+
+               if ( isset( $prop['langlinks'] ) || isset( $prop['languageshtml'] ) ) {
+                       $langlinks = $p_result->getLanguageLinks();
+
+                       if ( $params['effectivelanglinks'] ) {
+                               // Link flags are ignored for now, but may in the future be
+                               // included in the result.
+                               $linkFlags = array();
+                               wfRunHooks( 'LanguageLinks', array( $titleObj, &$langlinks, &$linkFlags ) );
+                       }
+               } else {
+                       $langlinks = false;
                }
 
                if ( isset( $prop['langlinks'] ) ) {
-                       $result_array['langlinks'] = $this->formatLangLinks( $p_result->getLanguageLinks() );
+                       $result_array['langlinks'] = $this->formatLangLinks( $langlinks );
                }
                if ( isset( $prop['languageshtml'] ) ) {
-                       $languagesHtml = $this->languagesHtml( $p_result->getLanguageLinks() );
+                       $languagesHtml = $this->languagesHtml( $langlinks );
+
                        $result_array['languageshtml'] = array();
-                       $result->setContent( $result_array['languageshtml'], $languagesHtml );
+                       ApiResult::setContent( $result_array['languageshtml'], $languagesHtml );
                }
                if ( isset( $prop['categories'] ) ) {
                        $result_array['categories'] = $this->formatCategoryLinks( $p_result->getCategories() );
@@ -247,7 +261,7 @@ class ApiParse extends ApiBase {
                if ( isset( $prop['categorieshtml'] ) ) {
                        $categoriesHtml = $this->categoriesHtml( $p_result->getCategories() );
                        $result_array['categorieshtml'] = array();
-                       $result->setContent( $result_array['categorieshtml'], $categoriesHtml );
+                       ApiResult::setContent( $result_array['categorieshtml'], $categoriesHtml );
                }
                if ( isset( $prop['links'] ) ) {
                        $result_array['links'] = $this->formatLinks( $p_result->getLinks() );
@@ -288,7 +302,7 @@ class ApiParse extends ApiBase {
 
                        if ( isset( $prop['headhtml'] ) ) {
                                $result_array['headhtml'] = array();
-                               $result->setContent( $result_array['headhtml'], $context->getOutput()->headElement( $context->getSkin() ) );
+                               ApiResult::setContent( $result_array['headhtml'], $context->getOutput()->headElement( $context->getSkin() ) );
                        }
                }
 
@@ -298,10 +312,10 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['wikitext'] ) ) {
                        $result_array['wikitext'] = array();
-                       $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+                       ApiResult::setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
                        if ( !is_null( $this->pstContent ) ) {
                                $result_array['psttext'] = array();
-                               $result->setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
+                               ApiResult::setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
                        }
                }
                if ( isset( $prop['properties'] ) ) {
@@ -321,7 +335,7 @@ class ApiParse extends ApiBase {
                                $xml = $dom->__toString();
                        }
                        $result_array['parsetree'] = array();
-                       $result->setContent( $result_array['parsetree'], $xml );
+                       ApiResult::setContent( $result_array['parsetree'], $xml );
                }
 
                $result_mapping = array(
@@ -400,7 +414,7 @@ class ApiParse extends ApiBase {
                        if ( $title ) {
                                $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
                        }
-                       $this->getResult()->setContent( $entry, $bits[1] );
+                       ApiResult::setContent( $entry, $bits[1] );
                        $result[] = $entry;
                }
                return $result;
@@ -411,7 +425,7 @@ class ApiParse extends ApiBase {
                foreach ( $links as $link => $sortkey ) {
                        $entry = array();
                        $entry['sortkey'] = $sortkey;
-                       $this->getResult()->setContent( $entry, $link );
+                       ApiResult::setContent( $entry, $link );
                        $result[] = $entry;
                }
                return $result;
@@ -465,7 +479,7 @@ class ApiParse extends ApiBase {
                        foreach ( $nslinks as $title => $id ) {
                                $entry = array();
                                $entry['ns'] = $ns;
-                               $this->getResult()->setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
+                               ApiResult::setContent( $entry, Title::makeTitle( $ns, $title )->getFullText() );
                                if ( $id != 0 ) {
                                        $entry['exists'] = '';
                                }
@@ -487,7 +501,7 @@ class ApiParse extends ApiBase {
                                        $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
                                }
 
-                               $this->getResult()->setContent( $entry, $title->getFullText() );
+                               ApiResult::setContent( $entry, $title->getFullText() );
                                $result[] = $entry;
                        }
                }
@@ -499,7 +513,7 @@ class ApiParse extends ApiBase {
                foreach ( $headItems as $tag => $content ) {
                        $entry = array();
                        $entry['tag'] = $tag;
-                       $this->getResult()->setContent( $entry, $content );
+                       ApiResult::setContent( $entry, $content );
                        $result[] = $entry;
                }
                return $result;
@@ -510,7 +524,7 @@ class ApiParse extends ApiBase {
                foreach ( $properties as $name => $value ) {
                        $entry = array();
                        $entry['name'] = $name;
-                       $this->getResult()->setContent( $entry, $value );
+                       ApiResult::setContent( $entry, $value );
                        $result[] = $entry;
                }
                return $result;
@@ -521,7 +535,7 @@ class ApiParse extends ApiBase {
                foreach ( $css as $file => $link ) {
                        $entry = array();
                        $entry['file'] = $file;
-                       $this->getResult()->setContent( $entry, $link );
+                       ApiResult::setContent( $entry, $link );
                        $result[] = $entry;
                }
                return $result;
@@ -575,6 +589,7 @@ class ApiParse extends ApiBase {
                        ),
                        'pst' => false,
                        'onlypst' => false,
+                       'effectivelanglinks' => false,
                        'uselang' => null,
                        'section' => null,
                        'disablepp' => false,
@@ -618,6 +633,10 @@ class ApiParse extends ApiBase {
                                ' wikitext       - Gives the original wikitext that was parsed',
                                ' properties     - Gives various properties defined in the parsed wikitext',
                        ),
+                       'effectivelanglinks' => array(
+                               'Includes language links supplied by extensions',
+                               '(for use with prop=langlinks|languageshtml)',
+                       ),
                        'pst' => array(
                                'Do a pre-save transform on the input before parsing it',
                                'Ignored if page, pageid or oldid is used'
index 134f4a0..b68dc5c 100644 (file)
@@ -42,15 +42,15 @@ class ApiPurge extends ApiBase {
         */
        private static function addValues( array &$result, $values, $flag = null, $name = null ) {
                foreach ( $values as $val ) {
-                       if( $val instanceof Title ) {
+                       if ( $val instanceof Title ) {
                                $v = array();
                                ApiQueryBase::addTitleInfo( $v, $val );
-                       } elseif( $name !== null ) {
+                       } elseif ( $name !== null ) {
                                $v = array( $name => $val );
                        } else {
                                $v = $val;
                        }
-                       if( $flag !== null ) {
+                       if ( $flag !== null ) {
                                $v[$flag] = '';
                        }
                        $result[] = $v;
@@ -158,7 +158,7 @@ class ApiPurge extends ApiBase {
        }
 
        public function getParamDescription() {
-               return $this->getPageSet()->getParamDescription()
+               return $this->getPageSet()->getFinalParamDescription()
                        + array( 'forcelinkupdate' => 'Update the links tables' );
        }
 
@@ -204,7 +204,7 @@ class ApiPurge extends ApiBase {
        public function getPossibleErrors() {
                return array_merge(
                        parent::getPossibleErrors(),
-                       $this->getPageSet()->getPossibleErrors()
+                       $this->getPageSet()->getFinalPossibleErrors()
                );
        }
 
index f69ad23..aafd582 100644 (file)
@@ -382,7 +382,6 @@ class ApiQuery extends ApiBase {
                $modules = $allModules;
                $tmp = $completeModules;
                $wasPosted = $this->getRequest()->wasPosted();
-               $main = $this->getMain();
 
                /** @var $module ApiQueryBase */
                foreach ( $allModules as $moduleName => $module ) {
@@ -513,7 +512,7 @@ class ApiQuery extends ApiBase {
                        ApiQueryBase::addTitleInfo( $vals, $title );
                        $vals['special'] = '';
                        if ( $title->isSpecialPage() &&
-                                       !SpecialPageFactory::exists( $title->getDbKey() ) ) {
+                                       !SpecialPageFactory::exists( $title->getDBkey() ) ) {
                                $vals['missing'] = '';
                        } elseif ( $title->getNamespace() == NS_MEDIA &&
                                        !wfFindFile( $title ) ) {
@@ -697,7 +696,7 @@ class ApiQuery extends ApiBase {
        }
 
        public function getParamDescription() {
-               return $this->getPageSet()->getParamDescription() + array(
+               return $this->getPageSet()->getFinalParamDescription() + array(
                        'prop' => 'Which properties to get for the titles/revisions/pageids. Module help is available below',
                        'list' => 'Which lists to get. Module help is available below',
                        'meta' => 'Which metadata to get about the site. Module help is available below',
@@ -723,7 +722,7 @@ class ApiQuery extends ApiBase {
        public function getPossibleErrors() {
                return array_merge(
                        parent::getPossibleErrors(),
-                       $this->getPageSet()->getPossibleErrors()
+                       $this->getPageSet()->getFinalPossibleErrors()
                );
        }
 
@@ -736,6 +735,7 @@ class ApiQuery extends ApiBase {
 
        public function getHelpUrls() {
                return array(
+                       'https://www.mediawiki.org/wiki/API:Query',
                        'https://www.mediawiki.org/wiki/API:Meta',
                        'https://www.mediawiki.org/wiki/API:Properties',
                        'https://www.mediawiki.org/wiki/API:Lists',
index 496a0eb..3f5c6ee 100644 (file)
@@ -76,7 +76,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                if ( $dir == 'newer' ) {
                        $this->addWhereRange( 'cat_pages', 'newer', $min, $max );
                } else {
-                       $this->addWhereRange( 'cat_pages', 'older', $max, $min);
+                       $this->addWhereRange( 'cat_pages', 'older', $max, $min );
                }
 
                if ( isset( $params['prefix'] ) ) {
@@ -121,7 +121,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                                $pages[] = $titleObj;
                        } else {
                                $item = array();
-                               $result->setContent( $item, $titleObj->getText() );
+                               ApiResult::setContent( $item, $titleObj->getText() );
                                if ( isset( $prop['size'] ) ) {
                                        $item['size'] = intval( $row->cat_pages );
                                        $item['pages'] = $row->cat_pages - $row->cat_subcats - $row->cat_files;
index e24b162..ccc7a3a 100644 (file)
@@ -189,7 +189,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                if ( !is_null( $params['mime'] ) ) {
                        global $wgMiserMode;
-                       if ( $wgMiserMode  ) {
+                       if ( $wgMiserMode ) {
                                $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
                        }
 
@@ -260,7 +260,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               return array (
+               return array(
                        'sort' => array(
                                ApiBase::PARAM_DFLT => 'name',
                                ApiBase::PARAM_TYPE => array(
index c9811b0..d47c7b7 100644 (file)
@@ -87,7 +87,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                        foreach ( $messages_target as $message ) {
                                // === 0: must be at beginning of string (position 0)
                                if ( strpos( $message, $params['prefix'] ) === 0 ) {
-                                       if( !$skip ) {
+                                       if ( !$skip ) {
                                                $skip = true;
                                        }
                                        $messages_filtered[] = $message;
index d718b96..d95980c 100644 (file)
@@ -174,7 +174,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                $res = $this->select( __METHOD__ );
 
                //Get gender information
-               if( MWNamespace::hasGenderDistinction( $params['namespace'] ) ) {
+               if ( MWNamespace::hasGenderDistinction( $params['namespace'] ) ) {
                        $users = array();
                        foreach ( $res as $row ) {
                                $users[] = $row->page_title;
@@ -304,7 +304,10 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        'prtype' => 'Limit to protected pages only',
                        'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
                        'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
-                       'filterlanglinks' => 'Filter based on whether a page has langlinks',
+                       'filterlanglinks' => array(
+                               'Filter based on whether a page has langlinks',
+                               'Note that this may not consider langlinks added by extensions.',
+                       ),
                        'limit' => 'How many total pages to return.',
                        'prexpiry' => array(
                                'Which protection expiry to filter the page on',
index 7283aa0..1948a51 100644 (file)
@@ -83,12 +83,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
                if ( !is_null( $params['rights'] ) && count( $params['rights'] ) ) {
                        $groups = array();
-                       foreach( $params['rights'] as $r ) {
+                       foreach ( $params['rights'] as $r ) {
                                $groups = array_merge( $groups, User::getGroupsWithPermission( $r ) );
                        }
 
                        // no group with the given right(s) exists, no need for a query
-                       if( !count( $groups ) ) {
+                       if ( !count( $groups ) ) {
                                $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), '' );
                                return;
                        }
index 3ef6b84..e39c25a 100644 (file)
@@ -229,10 +229,10 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $orderBy = array();
                $sort = ( $this->params['dir'] == 'descending' ? ' DESC' : '' );
                // Don't order by namespace/title if it's constant in the WHERE clause
-               if( $this->hasNS && count( array_unique( $allRedirNs ) ) != 1 ) {
+               if ( $this->hasNS && count( array_unique( $allRedirNs ) ) != 1 ) {
                        $orderBy[] = $this->bl_ns . $sort;
                }
-               if( count( array_unique( $allRedirDBkey ) ) != 1 ) {
+               if ( count( array_unique( $allRedirDBkey ) ) != 1 ) {
                        $orderBy[] = $this->bl_title . $sort;
                }
                $orderBy[] = $this->bl_from . $sort;
@@ -294,9 +294,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                        // We've reached the one extra which shows that there are additional pages to be had. Stop here...
                                        // We need to keep the parent page of this redir in
                                        if ( $this->hasNS ) {
-                                               $parentID = $this->pageMap[$row-> { $this->bl_ns } ][$row-> { $this->bl_title } ];
+                                               $parentID = $this->pageMap[$row->{$this->bl_ns}][$row->{$this->bl_title}];
                                        } else {
-                                               $parentID = $this->pageMap[NS_FILE][$row-> { $this->bl_title } ];
+                                               $parentID = $this->pageMap[NS_FILE][$row->{$this->bl_title}];
                                        }
                                        $this->continueStr = $this->getContinueRedirStr( $parentID, $row->page_id );
                                        break;
@@ -377,8 +377,8 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                if ( $row->page_is_redirect ) {
                        $a['redirect'] = '';
                }
-               $ns = $this->hasNS ? $row-> { $this->bl_ns } : NS_FILE;
-               $parentID = $this->pageMap[$ns][$row-> { $this->bl_title } ];
+               $ns = $this->hasNS ? $row->{$this->bl_ns} : NS_FILE;
+               $parentID = $this->pageMap[$ns][$row->{$this->bl_title}];
                // Put all the results in an array first
                $this->resultArr[$parentID]['redirlinks'][] = $a;
                $this->getResult()->setIndexedTagName( $this->resultArr[$parentID]['redirlinks'], $this->bl_code );
index 7819ead..8668e04 100644 (file)
@@ -432,7 +432,7 @@ abstract class ApiQueryBase extends ApiBase {
                if ( trim( $key ) == '' ) {
                        return '';
                }
-               $t = Title::newFromDbKey( $key );
+               $t = Title::newFromDBkey( $key );
                // This really shouldn't happen but we gotta check anyway
                if ( !$t ) {
                        $this->dieUsageMsg( array( 'invalidtitle', $key ) );
@@ -478,7 +478,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @param $protocol String
         * @return null|string
         */
-       public function prepareUrlQuerySearchString( $query = null, $protocol = null) {
+       public function prepareUrlQuerySearchString( $query = null, $protocol = null ) {
                $db = $this->getDb();
                if ( !is_null( $query ) || $query != '' ) {
                        if ( is_null( $protocol ) ) {
index d9be9f2..881269f 100644 (file)
@@ -63,7 +63,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                $this->addTables( 'ipblocks' );
                $this->addFields( 'ipb_auto' );
 
-               $this->addFieldsIf ( 'ipb_id', $fld_id );
+               $this->addFieldsIf( 'ipb_id', $fld_id );
                $this->addFieldsIf( array( 'ipb_address', 'ipb_user' ), $fld_user || $fld_userid );
                $this->addFieldsIf( 'ipb_by_text', $fld_by );
                $this->addFieldsIf( 'ipb_by', $fld_byid );
@@ -94,8 +94,9 @@ class ApiQueryBlocks extends ApiQueryBase {
                        list( $ip, $range ) = IP::parseCIDR( $params['ip'] );
                        if ( $ip && $range ) {
                                // We got a CIDR range
-                               if ( $range < 16 )
+                               if ( $range < 16 ) {
                                        $this->dieUsage( 'CIDR ranges broader than /16 are not accepted', 'cidrtoobroad' );
+                               }
                                $lower = wfBaseConvert( $ip, 10, 16, 8, false );
                                $upper = wfBaseConvert( $ip + pow( 2, 32 - $range ) - 1, 10, 16, 8, false );
                        } else {
@@ -120,10 +121,10 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $show = array_flip( $params['show'] );
 
                        /* Check for conflicting parameters. */
-                       if ( ( isset ( $show['account'] ) && isset ( $show['!account'] ) )
-                                       || ( isset ( $show['ip'] ) && isset ( $show['!ip'] ) )
-                                       || ( isset ( $show['range'] ) && isset ( $show['!range'] ) )
-                                       || ( isset ( $show['temp'] ) && isset ( $show['!temp'] ) )
+                       if ( ( isset( $show['account'] ) && isset( $show['!account'] ) )
+                                       || ( isset( $show['ip'] ) && isset( $show['!ip'] ) )
+                                       || ( isset( $show['range'] ) && isset( $show['!range'] ) )
+                                       || ( isset( $show['temp'] ) && isset( $show['!temp'] ) )
                        ) {
                                $this->dieUsageMsg( 'show' );
                        }
index 69a6441..5d714f5 100644 (file)
@@ -49,7 +49,6 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
 
        /**
         * @param $resultPageSet ApiPageSet
-        * @return
         */
        private function run( $resultPageSet = null ) {
                if ( $this->getPageSet()->getGoodTitleCount() == 0 ) {
@@ -174,7 +173,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                                        break;
                                }
 
-                               $titles[] = Title :: makeTitle( NS_CATEGORY, $row->cl_to );
+                               $titles[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
                        }
                        $resultPageSet->populateFromTitles( $titles );
                }
@@ -184,7 +183,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                return array(
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array (
+                               ApiBase::PARAM_TYPE => array(
                                        'sortkey',
                                        'timestamp',
                                        'hidden',
index 9dbd859..704d108 100644 (file)
@@ -217,7 +217,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                if ( $fld_sortkeyprefix ) {
                                        $vals['sortkeyprefix'] = $row->cl_sortkey_prefix;
                                }
-                               if ( $fld_type  ) {
+                               if ( $fld_type ) {
                                        $vals['type'] = $row->cl_type;
                                }
                                if ( $fld_timestamp ) {
@@ -258,7 +258,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                        'prop' => array(
                                ApiBase::PARAM_DFLT => 'ids|title',
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array (
+                               ApiBase::PARAM_TYPE => array(
                                        'ids',
                                        'title',
                                        'sortkey',
@@ -267,7 +267,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                        'timestamp',
                                )
                        ),
-                       'namespace' => array (
+                       'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => 'namespace',
                        ),
index 31ca1ef..690d0e6 100644 (file)
@@ -50,7 +50,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                $fld_user = isset( $prop['user'] );
                $fld_userid = isset( $prop['userid'] );
                $fld_comment = isset( $prop['comment'] );
-               $fld_parsedcomment = isset ( $prop['parsedcomment'] );
+               $fld_parsedcomment = isset( $prop['parsedcomment'] );
                $fld_minor = isset( $prop['minor'] );
                $fld_len = isset( $prop['len'] );
                $fld_sha1 = isset( $prop['sha1'] );
@@ -74,13 +74,13 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
 
                if ( $mode == 'revs' || $mode == 'user' ) {
                        // Ignore namespace and unique due to inability to know whether they were purposely set
-                       foreach( array( 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ) as $p ) {
+                       foreach ( array( 'from', 'to', 'prefix', /*'namespace', 'unique'*/ ) as $p ) {
                                if ( !is_null( $params[$p] ) ) {
                                        $this->dieUsage( "The '{$p}' parameter cannot be used in modes 1 or 2", 'badparams' );
                                }
                        }
                } else {
-                       foreach( array( 'start', 'end' ) as $p ) {
+                       foreach ( array( 'start', 'end' ) as $p ) {
                                if ( !is_null( $params[$p] ) ) {
                                        $this->dieUsage( "The {$p} parameter cannot be used in mode 3", 'badparams' );
                                }
index 18dcba8..0311fa7 100644 (file)
@@ -48,8 +48,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
        }
 
        /**
-        * @param $resultPageSet ApiPageSet
-        * @return
+        * @param ApiPageSet $resultPageSet
         */
        private function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
@@ -59,7 +58,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                }
                $images = $namespaces[NS_FILE];
 
-               if( $params['dir'] == 'descending' ) {
+               if ( $params['dir'] == 'descending' ) {
                        $images = array_reverse( $images );
                }
 
@@ -80,7 +79,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                }
 
                $filesToFind = array_keys( $images );
-               if( $params['localonly'] ) {
+               if ( $params['localonly'] ) {
                        $files = RepoGroup::singleton()->getLocalRepo()->findFiles( $filesToFind );
                } else {
                        $files = RepoGroup::singleton()->findFiles( $filesToFind );
@@ -98,29 +97,29 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
 
                // find all files with the hashes, result format is: array( hash => array( dup1, dup2 ), hash1 => ... )
                $filesToFindBySha1s = array_unique( array_values( $sha1s ) );
-               if( $params['localonly'] ) {
+               if ( $params['localonly'] ) {
                        $filesBySha1s = RepoGroup::singleton()->getLocalRepo()->findBySha1s( $filesToFindBySha1s );
                } else {
                        $filesBySha1s = RepoGroup::singleton()->findBySha1s( $filesToFindBySha1s );
                }
 
                // iterate over $images to handle continue param correct
-               foreach( $images as $image => $pageId ) {
-                       if( !isset( $sha1s[$image] ) ) {
+               foreach ( $images as $image => $pageId ) {
+                       if ( !isset( $sha1s[$image] ) ) {
                                continue; //file does not exist
                        }
                        $sha1 = $sha1s[$image];
                        $dupFiles = $filesBySha1s[$sha1];
-                       if( $params['dir'] == 'descending' ) {
+                       if ( $params['dir'] == 'descending' ) {
                                $dupFiles = array_reverse( $dupFiles );
                        }
                        /** @var $dupFile File */
                        foreach ( $dupFiles as $dupFile ) {
                                $dupName = $dupFile->getName();
-                               if( $image == $dupName && $dupFile->isLocal() ) {
+                               if ( $image == $dupName && $dupFile->isLocal() ) {
                                        continue; //ignore the local file itself
                                }
-                               if( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
+                               if ( $skipUntilThisDup !== false && $dupName < $skipUntilThisDup ) {
                                        continue; //skip to pos after the image from continue param
                                }
                                $skipUntilThisDup = false;
@@ -139,7 +138,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                                                'user' => $dupFile->getUser( 'text' ),
                                                'timestamp' => wfTimestamp( TS_ISO_8601, $dupFile->getTimestamp() )
                                        );
-                                       if( !$dupFile->isLocal() ) {
+                                       if ( !$dupFile->isLocal() ) {
                                                $r['shared'] = '';
                                        }
                                        $fit = $this->addPageSubItem( $pageId, $r );
@@ -149,7 +148,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                                        }
                                }
                        }
-                       if( !$fit ) {
+                       if ( !$fit ) {
                                break;
                        }
                }
index eb9cdf9..124d273 100644 (file)
@@ -123,7 +123,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                                if ( $fld_url ) {
                                        $to = $row->el_to;
                                        // expand protocol-relative urls
-                                       if( $params['expandurl'] ) {
+                                       if ( $params['expandurl'] ) {
                                                $to = wfExpandUrl( $to, PROTO_CANONICAL );
                                        }
                                        $vals['url'] = $to;
index 761b49e..56ee268 100644 (file)
@@ -88,7 +88,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                        $entry = array();
                        $to = $row->el_to;
                        // expand protocol-relative urls
-                       if( $params['expandurl'] ) {
+                       if ( $params['expandurl'] ) {
                                $to = wfExpandUrl( $to, PROTO_CANONICAL );
                        }
                        ApiResult::setContent( $entry, $to );
index 021074a..f53cd38 100644 (file)
@@ -218,7 +218,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
        }
 
        public function getAllowedParams() {
-               return array (
+               return array(
                        'from' => null,
                        'continue' => null,
                        'to' => null,
@@ -281,7 +281,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                ' parseddescription - Parse the description on the version',
                                ' mime              - Adds MIME of the image',
                                ' mediatype         - Adds the media type of the image',
-                               ' metadata          - Lists EXIF metadata for the version of the image',
+                               ' metadata          - Lists Exif metadata for the version of the image',
                                ' bitdepth          - Adds the bit depth of the version',
                                ' archivename       - Adds the file name of the archive version for non-latest versions'
                        ),
@@ -373,4 +373,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        ),
                );
        }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Filearchive';
+       }
 }
index b47d31f..ebae3e7 100644 (file)
@@ -239,4 +239,8 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                        'api.php?action=query&generator=iwbacklinks&giwbltitle=Test&giwblprefix=wikibooks&prop=info'
                );
        }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Iwbacklinks';
+       }
 }
index fc77b4e..be53931 100644 (file)
@@ -81,8 +81,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
                                $this->addOption( 'ORDER BY', 'iwl_from' . $sort );
                        } else {
                                $this->addOption( 'ORDER BY', array(
-                                               'iwl_title' . $sort,
-                                               'iwl_from' . $sort
+                                               'iwl_from' . $sort,
+                                               'iwl_title' . $sort
                                ));
                        }
                } else {
@@ -90,9 +90,10 @@ class ApiQueryIWLinks extends ApiQueryBase {
                        if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
                                $this->addOption( 'ORDER BY', 'iwl_prefix' . $sort );
                        } else {
-                               $this->addOption( 'ORDER BY', array (
+                               $this->addOption( 'ORDER BY', array(
                                                'iwl_from' . $sort,
-                                               'iwl_prefix' . $sort
+                                               'iwl_prefix' . $sort,
+                                               'iwl_title' . $sort
                                ));
                        }
                }
@@ -192,4 +193,8 @@ class ApiQueryIWLinks extends ApiQueryBase {
                        'api.php?action=query&prop=iwlinks&titles=Main%20Page' => 'Get interwiki links from the [[Main Page]]',
                );
        }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Iwlinks';
+       }
 }
index 556f147..4849f40 100644 (file)
@@ -72,7 +72,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                        $result = $this->getResult();
                        //search only inside the local repo
-                       if( $params['localonly'] ) {
+                       if ( $params['localonly'] ) {
                                $images = RepoGroup::singleton()->getLocalRepo()->findFiles( $titles );
                        } else {
                                $images = RepoGroup::singleton()->findFiles( $titles );
@@ -170,9 +170,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                                }
                                                break;
                                        }
-                                       $fit = $this->addPageSubItem( $pageId,
-                                               self::getInfo( $oldie, $prop, $result,
-                                                       $finalThumbParams, $params['metadataversion'] ) );
+                                       $fit = self::getTransformCount() < self::TRANSFORM_LIMIT &&
+                                               $this->addPageSubItem( $pageId,
+                                                       self::getInfo( $oldie, $prop, $result,
+                                                               $finalThumbParams, $params['metadataversion']
+                                                       )
+                                               );
                                        if ( !$fit ) {
                                                if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                        $this->setContinueEnumParameter( 'start',
@@ -199,21 +202,20 @@ class ApiQueryImageInfo extends ApiQueryBase {
        public function getScale( $params ) {
                $p = $this->getModulePrefix();
 
-               // Height and width.
-               if ( $params['urlheight'] != -1 && $params['urlwidth'] == -1 ) {
-                       $this->dieUsage( "{$p}urlheight cannot be used without {$p}urlwidth", "{$p}urlwidth" );
-               }
-
                if ( $params['urlwidth'] != -1 ) {
                        $scale = array();
                        $scale['width'] = $params['urlwidth'];
                        $scale['height'] = $params['urlheight'];
+               } elseif ( $params['urlheight'] != -1 ) {
+                       // Height is specified but width isn't
+                       // Don't set $scale['width']; this signals mergeThumbParams() to fill it with the image's width
+                       $scale = array();
+                       $scale['height'] = $params['urlheight'];
                } else {
                        $scale = null;
                        if ( $params['urlparam'] ) {
                                $this->dieUsage( "{$p}urlparam requires {$p}urlwidth", "urlparam_no_width" );
                        }
-                       return $scale;
                }
 
                return $scale;
@@ -229,6 +231,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @return Array of parameters for transform.
         */
        protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
+
+               if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) {
+                       // Populate the width with the image's width, so only the height restriction applies
+                       $thumbParams['width'] = $image->getWidth();
+               }
+
                if ( !$otherParams ) {
                        return $thumbParams;
                }
@@ -254,8 +262,8 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                if ( isset( $paramList['width'] ) ) {
                        if ( intval( $paramList['width'] ) != intval( $thumbParams['width'] ) ) {
-                               $this->dieUsage( "{$p}urlparam had width of {$paramList['width']} but "
-                                       . "{$p}urlwidth was {$thumbParams['width']}", "urlparam_urlwidth_mismatch" );
+                               $this->setWarning( "Ignoring width value set in {$p}urlparam ({$paramList['width']}) "
+                                       . "in favor of width value derived from {$p}urlwidth/{$p}urlheight ({$thumbParams['width']})" );
                        }
                }
 
@@ -537,7 +545,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        'thumbmime' =>      ' thumbmime     - Adds MIME type of the image thumbnail' .
                                ' (requires url and param ' . $modulePrefix . 'urlwidth)',
                        'mediatype' =>      ' mediatype     - Adds the media type of the image',
-                       'metadata' =>       ' metadata      - Lists EXIF metadata for the version of the image',
+                       'metadata' =>       ' metadata      - Lists Exif metadata for the version of the image',
                        'archivename' =>    ' archivename   - Adds the file name of the archive version for non-latest versions',
                        'bitdepth' =>       ' bitdepth      - Adds the bit depth of the version',
                );
@@ -547,7 +555,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * Returns the descriptions for the properties provided by getPropertyNames()
         *
         * @param array $filter List of properties to filter out
-        *
+        * @param string $modulePrefix
         * @return array
         */
        public static function getPropertyDescriptions( $filter = array(), $modulePrefix = '' ) {
@@ -566,11 +574,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
                return array(
                        'prop' => self::getPropertyDescriptions( array(), $p ),
                        'urlwidth' => array( "If {$p}prop=url is set, a URL to an image scaled to this width will be returned.",
-                                               'Only the current version of the image can be scaled' ),
-                       'urlheight' => "Similar to {$p}urlwidth. Cannot be used without {$p}urlwidth",
+                               'For performance reasons if this option is used, ' .
+                                       'no more than ' . self::TRANSFORM_LIMIT . ' scaled images will be returned.' ),
+                       'urlheight' => "Similar to {$p}urlwidth.",
                        'urlparam' => array( "A handler specific parameter string. For example, pdf's ",
                                "might use 'page15-100px'. {$p}urlwidth must be used and be consistent with {$p}urlparam" ),
-                       'limit' => 'How many image revisions to return',
+                       'limit' => 'How many image revisions to return per image',
                        'start' => 'Timestamp to start listing from',
                        'end' => 'Timestamp to stop listing at',
                        'metadataversion' => array( "Version of metadata to use. if 'latest' is specified, use latest version.",
@@ -714,8 +723,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        array( 'code' => "{$p}urlwidth", 'info' => "{$p}urlheight cannot be used without {$p}urlwidth" ),
                        array( 'code' => 'urlparam', 'info' => "Invalid value for {$p}urlparam" ),
                        array( 'code' => 'urlparam_no_width', 'info' => "{$p}urlparam requires {$p}urlwidth" ),
-                       array( 'code' => 'urlparam_urlwidth_mismatch', 'info' => "The width set in {$p}urlparm doesn't " .
-                               "match the one in {$p}urlwidth" ),
                ) );
        }
 
index 37cd915..5f8c497 100644 (file)
@@ -56,11 +56,11 @@ class ApiQueryInfo extends ApiQueryBase {
         * @return void
         */
        public function requestExtraData( $pageSet ) {
-               global $wgDisableCounters;
+               global $wgDisableCounters, $wgContentHandlerUseDB;
 
                $pageSet->requestField( 'page_restrictions' );
                // when resolving redirects, no page will have this field
-               if( !$pageSet->isResolvingRedirects() ) {
+               if ( !$pageSet->isResolvingRedirects() ) {
                        $pageSet->requestField( 'page_is_redirect' );
                }
                $pageSet->requestField( 'page_is_new' );
@@ -70,6 +70,9 @@ class ApiQueryInfo extends ApiQueryBase {
                $pageSet->requestField( 'page_touched' );
                $pageSet->requestField( 'page_latest' );
                $pageSet->requestField( 'page_len' );
+               if ( $wgContentHandlerUseDB ) {
+                       $pageSet->requestField( 'page_content_model' );
+               }
        }
 
        /**
@@ -348,6 +351,10 @@ class ApiQueryInfo extends ApiQueryBase {
                $titleExists = $pageid > 0; //$title->exists() needs pageid, which is not set for all title objects
                $ns = $title->getNamespace();
                $dbkey = $title->getDBkey();
+
+               $pageInfo['contentmodel'] = $title->getContentModel();
+               $pageInfo['pagelanguage'] = $title->getPageLanguage()->getCode();
+
                if ( $titleExists ) {
                        global $wgDisableCounters;
 
@@ -476,7 +483,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $this->protections[$title->getNamespace()][$title->getDBkey()][] = $a;
                        }
                        // Also check old restrictions
-                       foreach( $this->titles as $pageId => $title ) {
+                       foreach ( $this->titles as $pageId => $title ) {
                                if ( $this->pageRestrictions[$pageId] ) {
                                        $namespace = $title->getNamespace();
                                        $dbKey = $title->getDBkey();
@@ -819,7 +826,8 @@ class ApiQueryInfo extends ApiQueryBase {
                                'starttimestamp' => array(
                                        ApiBase::PROP_TYPE => 'timestamp',
                                        ApiBase::PROP_NULLABLE => true
-                               )
+                               ),
+                               'contentmodel' => 'string',
                        ),
                        'watched' => array(
                                'watched' => 'boolean'
index 7a4880a..5bd451b 100644 (file)
@@ -195,7 +195,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                        'prop' => array(
                                'Which properties to get',
                                ' lllang         - Adds the language code of the language link',
-                               ' lltitle        - Adds the title of the language ink',
+                               ' lltitle        - Adds the title of the language link',
                        ),
                        'limit' => 'How many total pages to return',
                        'dir' => 'The direction in which to list',
@@ -223,7 +223,8 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                return array( 'Find all pages that link to the given language link.',
                        'Can be used to find all links with a language code, or',
                        'all links to a title (with a given language).',
-                       'Using neither parameter is effectively "All Language Links"',
+                       'Using neither parameter is effectively "All Language Links".',
+                       'Note that this may not consider language links added by extensions.',
                );
        }
 
@@ -239,4 +240,8 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                        'api.php?action=query&generator=langbacklinks&glbltitle=Test&glbllang=fr&prop=info'
                );
        }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Langbacklinks';
+       }
 }
index ac65d2d..aa796e3 100644 (file)
@@ -67,18 +67,19 @@ class ApiQueryLangLinks extends ApiQueryBase {
                        );
                }
 
-                       $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-                       if ( isset( $params['lang'] ) ) {
+               //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.
+
+               // Note that, since (ll_from, ll_lang) is a unique key, we don't need
+               // to sort by ll_title to ensure deterministic ordering.
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               if ( isset( $params['lang'] ) ) {
                        $this->addWhereFld( 'll_lang', $params['lang'] );
                        if ( isset( $params['title'] ) ) {
                                $this->addWhereFld( 'll_title', $params['title'] );
-                               $this->addOption( 'ORDER BY', 'll_from' . $sort );
-                       } else {
-                               $this->addOption( 'ORDER BY', array(
-                                                       'll_title' . $sort,
-                                                       'll_from' . $sort
-                               ));
                        }
+                       $this->addOption( 'ORDER BY', 'll_from' . $sort );
                } else {
                        // Don't order by ll_from if it's constant in the WHERE clause
                        if ( count( $this->getPageSet()->getGoodTitles() ) == 1 ) {
index 73dcea4..2aa5c28 100644 (file)
@@ -49,12 +49,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $this->fld_ids = isset( $prop['ids'] );
                $this->fld_title = isset( $prop['title'] );
                $this->fld_type = isset( $prop['type'] );
-               $this->fld_action = isset ( $prop['action'] );
+               $this->fld_action = isset( $prop['action'] );
                $this->fld_user = isset( $prop['user'] );
                $this->fld_userid = isset( $prop['userid'] );
                $this->fld_timestamp = isset( $prop['timestamp'] );
                $this->fld_comment = isset( $prop['comment'] );
-               $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
                $this->fld_details = isset( $prop['details'] );
                $this->fld_tags = isset( $prop['tags'] );
 
@@ -241,7 +241,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                break;
                        case 'rights':
                                $vals2 = array();
-                               if( $legacy ) {
+                               if ( $legacy ) {
                                        list( $vals2['old'], $vals2['new'] ) = $params;
                                } else {
                                        $vals2['new'] = implode( ', ', $params['5::newgroups'] );
@@ -265,6 +265,11 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                $vals[$type] = $vals2;
                                $params = null;
                                break;
+                       case 'upload':
+                               if ( isset( $params['img_timestamp'] ) ) {
+                                       $params['img_timestamp'] = wfTimestamp( TS_ISO_8601, $params['img_timestamp'] );
+                               }
+                               break;
                }
                if ( !is_null( $params ) ) {
                        $logParams = array();
index 41d8f11..a23ff06 100644 (file)
@@ -228,7 +228,7 @@ abstract class ApiQueryORM extends ApiQueryBase {
         * @return array
         */
        public function getAllowedParams() {
-               $params = array (
+               $params = array(
                        'props' => array(
                                ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(),
                                ApiBase::PARAM_ISMULTI => true,
@@ -252,7 +252,7 @@ abstract class ApiQueryORM extends ApiQueryBase {
         * @return array
         */
        public function getParamDescription() {
-               $descriptions = array (
+               $descriptions = array(
                        'props' => 'Fields to query',
                        'continue' => 'Offset number from where to continue the query',
                        'limit' => 'Max amount of rows to return',
index 0132fc3..6f2f02e 100644 (file)
@@ -133,7 +133,7 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
                        'prop' => array(
                                ApiBase::PARAM_DFLT => 'ids|title',
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array (
+                               ApiBase::PARAM_TYPE => array(
                                        'ids',
                                        'title',
                                        'value',
index 4aa0000..222ad07 100644 (file)
@@ -157,7 +157,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
                        ),
-                       'limit' => array (
+                       'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
                                ApiBase::PARAM_TYPE => 'limit',
                                ApiBase::PARAM_MIN => 1,
index b03bdfb..c15da1a 100644 (file)
@@ -46,13 +46,13 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                // We need to do this to make sure $wgQueryPages is set up
                // This SUCKS
                global $IP;
-               require_once( "$IP/includes/QueryPage.php" );
+               require_once "$IP/includes/QueryPage.php";
 
                // Build mapping from special page names to QueryPage classes
                global $wgQueryPages;
                $this->qpMap = array();
                foreach ( $wgQueryPages as $page ) {
-                       if( !in_array( $page[1], $this->uselessQueryPages ) ) {
+                       if ( !in_array( $page[1], $this->uselessQueryPages ) ) {
                                $this->qpMap[$page[1]] = $page[0];
                        }
                }
@@ -222,4 +222,8 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                        'api.php?action=query&list=querypage&qppage=Ancientpages'
                );
        }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Querypage';
+       }
 }
index ae3bb89..2754bda 100644 (file)
@@ -185,4 +185,8 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        public function getExamples() {
                return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';
        }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Random';
+       }
 }
index 72e80b8..7cb445d 100644 (file)
@@ -159,15 +159,20 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                        $timestamp = $this->getDB()->addQuotes( wfTimestamp( TS_MW, $cont[0] ) );
                        $id = intval( $cont[1] );
-                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $op = $params['dir'] === 'older' ? '<' : '>';
 
                        $this->addWhere(
                                "rc_timestamp $op $timestamp OR " .
                                "(rc_timestamp = $timestamp AND " .
-                               "rc_id <= $id)"
+                               "rc_id $op= $id)"
                        );
                }
 
+               $order = $params['dir'] === 'older' ? 'DESC' : 'ASC';
+               $this->addOption( 'ORDER BY', array(
+                       "rc_timestamp $order",
+                       "rc_id $order",
+               ) );
 
                $this->addWhereFld( 'rc_namespace', $params['namespace'] );
                $this->addWhereFld( 'rc_deleted', 0 );
@@ -494,7 +499,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        }
                        return $retval;
                }
-               switch( $type ) {
+               switch ( $type ) {
                        case 'edit':
                                return RC_EDIT;
                        case 'new':
index 192fe87..1d86c97 100644 (file)
@@ -146,17 +146,17 @@ class ApiQueryRevisions extends ApiQueryBase {
                $prop = array_flip( $params['prop'] );
 
                // Optional fields
-               $this->fld_ids = isset ( $prop['ids'] );
+               $this->fld_ids = isset( $prop['ids'] );
                // $this->addFieldsIf('rev_text_id', $this->fld_ids); // should this be exposed?
-               $this->fld_flags = isset ( $prop['flags'] );
-               $this->fld_timestamp = isset ( $prop['timestamp'] );
-               $this->fld_comment = isset ( $prop['comment'] );
-               $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
-               $this->fld_size = isset ( $prop['size'] );
-               $this->fld_sha1 = isset ( $prop['sha1'] );
-               $this->fld_contentmodel = isset ( $prop['contentmodel'] );
+               $this->fld_flags = isset( $prop['flags'] );
+               $this->fld_timestamp = isset( $prop['timestamp'] );
+               $this->fld_comment = isset( $prop['comment'] );
+               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
+               $this->fld_size = isset( $prop['size'] );
+               $this->fld_sha1 = isset( $prop['sha1'] );
+               $this->fld_contentmodel = isset( $prop['contentmodel'] );
                $this->fld_userid = isset( $prop['userid'] );
-               $this->fld_user = isset ( $prop['user'] );
+               $this->fld_user = isset( $prop['user'] );
                $this->token = $params['token'];
 
                if ( !empty( $params['contentformat'] ) ) {
@@ -550,7 +550,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                if ( !$content->isSupportedFormat( $format ) ) {
                                        $name = $title->getPrefixedDBkey();
 
-                                       $this->dieUsage( "The requested format {$this->contentFormat} is not supported ".
+                                       $this->dieUsage( "The requested format {$this->contentFormat} is not supported " .
                                                                        "for content model $model used by $name", 'badformat' );
                                }
 
@@ -593,7 +593,7 @@ class ApiQueryRevisions extends ApiQueryBase {
 
                                                $name = $title->getPrefixedDBkey();
 
-                                               $this->dieUsage( "The requested format {$this->contentFormat} is not supported for ".
+                                               $this->dieUsage( "The requested format {$this->contentFormat} is not supported for " .
                                                                                        "content model $model used by $name", 'badformat' );
                                        }
 
index 8618339..0349830 100644 (file)
@@ -93,6 +93,8 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                }
                if ( is_null( $matches ) ) {
                        $this->dieUsage( "{$what} search is disabled", "search-{$what}-disabled" );
+               } elseif ( $matches instanceof Status && !$matches->isGood() ) {
+                       $this->dieUsage( $matches->getWikiText(), 'search-error' );
                }
 
                $apiResult = $this->getResult();
@@ -345,6 +347,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'code' => 'search-text-disabled', 'info' => 'text search is disabled' ),
                        array( 'code' => 'search-title-disabled', 'info' => 'title search is disabled' ),
+                       array( 'code' => 'search-error', 'info' => 'search error has occurred' ),
                ) );
        }
 
index 810e1d6..09a0f3d 100644 (file)
@@ -121,7 +121,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data = array();
                $mainPage = Title::newMainPage();
                $data['mainpage'] = $mainPage->getPrefixedText();
-               $data['base'] = wfExpandUrl( $mainPage->getFullUrl(), PROTO_CURRENT );
+               $data['base'] = wfExpandUrl( $mainPage->getFullURL(), PROTO_CURRENT );
                $data['sitename'] = $GLOBALS['wgSitename'];
                $data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
                $data['phpversion'] = phpversion();
@@ -170,15 +170,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['lang'] = $GLOBALS['wgLanguageCode'];
 
                $fallbacks = array();
-               foreach( $wgContLang->getFallbackLanguages() as $code ) {
+               foreach ( $wgContLang->getFallbackLanguages() as $code ) {
                        $fallbacks[] = array( 'code' => $code );
                }
                $data['fallback'] = $fallbacks;
                $this->getResult()->setIndexedTagName( $data['fallback'], 'lang' );
 
-               if( $wgContLang->hasVariants() ) {
+               if ( $wgContLang->hasVariants() ) {
                        $variants = array();
-                       foreach( $wgContLang->getVariants() as $code ) {
+                       foreach ( $wgContLang->getVariants() as $code ) {
                                $variants[] = array( 'code' => $code );
                        }
                        $data['variants'] = $variants;
@@ -345,10 +345,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                $val['language'] = $langNames[$prefix];
                        }
                        $val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
-                       if( isset( $row['iw_wikiid'] ) ) {
+                       if ( isset( $row['iw_wikiid'] ) ) {
                                $val['wikiid'] = $row['iw_wikiid'];
                        }
-                       if( isset( $row['iw_api'] ) ) {
+                       if ( isset( $row['iw_api'] ) ) {
                                $val['api'] = $row['iw_api'];
                        }
 
@@ -520,7 +520,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                $data = array(
                        'url' => $url ? $url : '',
-                       'text' => $text ?  $text : ''
+                       'text' => $text ? $text : ''
                );
 
                return $this->getResult()->addValue( 'query', $property, $data );
@@ -544,9 +544,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
        public function appendSkins( $property ) {
                $data = array();
+               $usable = Skin::getUsableSkins();
+               $default = Skin::normalizeKey( 'default' );
                foreach ( Skin::getSkinNames() as $name => $displayName ) {
                        $skin = array( 'code' => $name );
                        ApiResult::setContent( $skin, $displayName );
+                       if ( !isset( $usable[$name] ) ) {
+                               $skin['unusable'] = '';
+                       }
+                       if ( $name === $default ) {
+                               $skin['default'] = '';
+                       }
                        $data[] = $skin;
                }
                $this->getResult()->setIndexedTagName( $data, 'skin' );
@@ -675,7 +683,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                ' variables             - Returns a list of variable IDs',
                                ' protocols             - Returns a list of protocols that are allowed in external links.',
                        ),
-                       'filteriw' =>  'Return only local or only nonlocal entries of the interwiki map',
+                       'filteriw' => 'Return only local or only nonlocal entries of the interwiki map',
                        'showalldb' => 'List all database servers, not just the one lagging the most',
                        'numberingroup' => 'Lists the number of users in user groups',
                        'inlanguagecode' => 'Language code for localised language names (best effort, use CLDR extension)',
index 22480c6..732df9a 100644 (file)
@@ -194,4 +194,8 @@ class ApiQueryTags extends ApiQueryBase {
                        'api.php?action=query&list=tags&tgprop=displayname|description|hitcount'
                );
        }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Tags';
+       }
 }
index 597c412..1e013eb 100644 (file)
@@ -48,7 +48,7 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->fld_ids = isset( $prop['ids'] );
                $this->fld_title = isset( $prop['title'] );
                $this->fld_comment = isset( $prop['comment'] );
-               $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
                $this->fld_size = isset( $prop['size'] );
                $this->fld_sizediff = isset( $prop['sizediff'] );
                $this->fld_flags = isset( $prop['flags'] );
@@ -83,10 +83,10 @@ class ApiQueryContributions extends ApiQueryBase {
                // Do the actual query.
                $res = $this->select( __METHOD__ );
 
-               if( $this->fld_sizediff ) {
+               if ( $this->fld_sizediff ) {
                        $revIds = array();
                        foreach ( $res as $row ) {
-                               if( $row->rev_parent_id ) {
+                               if ( $row->rev_parent_id ) {
                                        $revIds[] = $row->rev_parent_id;
                                }
                        }
@@ -255,7 +255,7 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->addFieldsIf( 'rev_comment', $this->fld_comment || $this->fld_parsedcomment );
                $this->addFieldsIf( 'rev_len', $this->fld_size || $this->fld_sizediff );
                $this->addFieldsIf( 'rev_minor_edit', $this->fld_flags );
-               $this->addFieldsIf( 'rev_parent_id', $this->fld_flags || $this->fld_sizediff );
+               $this->addFieldsIf( 'rev_parent_id', $this->fld_flags || $this->fld_sizediff || $this->fld_ids );
                $this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
 
                if ( $this->fld_tags ) {
@@ -297,6 +297,10 @@ class ApiQueryContributions extends ApiQueryBase {
                        $vals['pageid'] = intval( $row->rev_page );
                        $vals['revid'] = intval( $row->rev_id );
                        // $vals['textid'] = intval( $row->rev_text_id ); // todo: Should this field be exposed?
+
+                       if ( !is_null( $row->rev_parent_id ) ) {
+                               $vals['parentid'] = intval( $row->rev_parent_id );
+                       }
                }
 
                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
@@ -474,7 +478,11 @@ class ApiQueryContributions extends ApiQueryBase {
                        ),
                        'ids' => array(
                                'pageid' => 'integer',
-                               'revid' => 'integer'
+                               'revid' => 'integer',
+                               'parentid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
                        ),
                        'title' => array(
                                'ns' => 'namespace',
index 1a491ec..8e65b40 100644 (file)
@@ -167,8 +167,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
                if ( $user->isNewbie() ) {
                        $categories[] = 'ip';
                        $categories[] = 'subnet';
-                       if ( !$user->isAnon() )
+                       if ( !$user->isAnon() ) {
                                $categories[] = 'newbie';
+                       }
                }
                $categories = array_merge( $categories, $user->getGroups() );
 
index 72ab786..aec57a0 100644 (file)
@@ -127,7 +127,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                $this->addFields( array( 'user_name', 'ug_group' ) );
                                $userGroupsRes = $this->select( __METHOD__ );
 
-                               foreach( $userGroupsRes as $row ) {
+                               foreach ( $userGroupsRes as $row ) {
                                        $userGroups[$row->user_name][] = $row->ug_group;
                                }
                        }
@@ -204,11 +204,13 @@ class ApiQueryUsers extends ApiQueryBase {
                        }
                }
 
+               $context = $this->getContext();
                // Second pass: add result data to $retval
                foreach ( $goodNames as $u ) {
                        if ( !isset( $data[$u] ) ) {
                                $data[$u] = array( 'name' => $u );
                                $urPage = new UserrightsPage;
+                               $urPage->setContext( $context );
                                $iwUser = $urPage->fetchUser( $u );
 
                                if ( $iwUser instanceof UserRightsProxy ) {
index 90b12c1..22843f5 100644 (file)
@@ -68,7 +68,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $this->fld_user = isset( $prop['user'] );
                        $this->fld_userid = isset( $prop['userid'] );
                        $this->fld_comment = isset( $prop['comment'] );
-                       $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
+                       $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
                        $this->fld_timestamp = isset( $prop['timestamp'] );
                        $this->fld_sizes = isset( $prop['sizes'] );
                        $this->fld_patrol = isset( $prop['patrol'] );
@@ -135,7 +135,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                if ( !$params['allrev'] ) {
                        $this->addTables( 'page' );
-                       $this->addJoinConds( array( 'page' => array( 'LEFT JOIN','rc_cur_id=page_id' ) ) );
+                       $this->addJoinConds( array( 'page' => array( 'LEFT JOIN', 'rc_cur_id=page_id' ) ) );
                        $this->addWhere( 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG );
                }
 
@@ -143,12 +143,11 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $show = array_flip( $params['show'] );
 
                        /* Check for conflicting parameters. */
-                       if ( ( isset ( $show['minor'] ) && isset ( $show['!minor'] ) )
-                                       || ( isset ( $show['bot'] ) && isset ( $show['!bot'] ) )
-                                       || ( isset ( $show['anon'] ) && isset ( $show['!anon'] ) )
-                                       || ( isset ( $show['patrolled'] ) && isset ( $show['!patrolled'] ) )
-                       )
-                       {
+                       if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) )
+                                       || ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
+                                       || ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
+                                       || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+                       ) {
                                $this->dieUsageMsg( 'show' );
                        }
 
@@ -171,6 +170,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
                }
 
+               if ( !is_null( $params['type'] ) ) {
+                       $this->addWhereFld( 'rc_type', $this->parseRCType( $params['type'] ) );
+               }
+
                if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
                        $this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' );
                }
@@ -226,6 +229,32 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        private function extractRowInfo( $row ) {
                $vals = array();
 
+               $type = intval( $row->rc_type );
+
+               /* Determine what kind of change this was. */
+               switch ( $type ) {
+                       case RC_EDIT:
+                               $vals['type'] = 'edit';
+                               break;
+                       case RC_NEW:
+                               $vals['type'] = 'new';
+                               break;
+                       case RC_MOVE:
+                               $vals['type'] = 'move';
+                               break;
+                       case RC_LOG:
+                               $vals['type'] = 'log';
+                               break;
+                       case RC_EXTERNAL:
+                               $vals['type'] = 'external';
+                               break;
+                       case RC_MOVE_OVER_REDIRECT:
+                               $vals['type'] = 'move over redirect';
+                               break;
+                       default:
+                               $vals['type'] = $type;
+               }
+
                if ( $this->fld_ids ) {
                        $vals['pageid'] = intval( $row->rc_cur_id );
                        $vals['revid'] = intval( $row->rc_this_oldid );
@@ -312,6 +341,27 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                return $vals;
        }
 
+       /* Copied from ApiQueryRecentChanges. */
+       private function parseRCType( $type ) {
+               if ( is_array( $type ) ) {
+                       $retval = array();
+                       foreach ( $type as $t ) {
+                               $retval[] = $this->parseRCType( $t );
+                       }
+                       return $retval;
+               }
+               switch ( $type ) {
+                       case 'edit':
+                               return RC_EDIT;
+                       case 'new':
+                               return RC_NEW;
+                       case 'log':
+                               return RC_LOG;
+                       case 'external':
+                               return RC_EXTERNAL;
+               }
+       }
+
        public function getAllowedParams() {
                return array(
                        'allrev' => false,
@@ -321,7 +371,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        'end' => array(
                                ApiBase::PARAM_TYPE => 'timestamp'
                        ),
-                       'namespace' => array (
+                       'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => 'namespace'
                        ),
@@ -376,6 +426,15 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                        '!patrolled',
                                )
                        ),
+                       'type' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array(
+                                       'edit',
+                                       'external',
+                                       'new',
+                                       'log',
+                               )
+                       ),
                        'owner' => array(
                                ApiBase::PARAM_TYPE => 'user'
                        ),
@@ -415,6 +474,13 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                'Show only items that meet this criteria.',
                                "For example, to see only minor edits done by logged-in users, set {$p}show=minor|!anon"
                        ),
+                       'type' => array(
+                               'Which types of changes to show',
+                               ' edit           - Regular page edits',
+                               ' external       - External changes',
+                               ' new            - Page creations',
+                               ' log            - Log entries',
+                       ),
                        'owner' => 'The name of the user whose watchlist you\'d like to access',
                        'token' => 'Give a security token (settable in preferences) to allow access to another user\'s watchlist'
                );
@@ -423,6 +489,17 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        public function getResultProperties() {
                global $wgLogTypes;
                return array(
+                       '' => array(
+                               'type' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'edit',
+                                               'new',
+                                               'move',
+                                               'log',
+                                               'move over redirect'
+                                       )
+                               )
+                       ),
                        'ids' => array(
                                'pageid' => 'integer',
                                'revid' => 'integer',
index 2cb4d9e..ea4e724 100644 (file)
@@ -222,4 +222,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                        'api.php?action=query&generator=watchlistraw&gwrshow=changed&prop=revisions',
                );
        }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Watchlistraw';
+       }
 }
index c4a1328..d219c91 100644 (file)
@@ -40,7 +40,7 @@ class ApiRsd extends ApiBase {
                $service = array( 'apis' => $this->formatRsdApiList() );
                ApiResult::setContent( $service, 'MediaWiki', 'engineName' );
                ApiResult::setContent( $service, 'https://www.mediawiki.org/', 'engineLink' );
-               ApiResult::setContent( $service, Title::newMainPage()->getCanonicalUrl(), 'homePageLink' );
+               ApiResult::setContent( $service, Title::newMainPage()->getCanonicalURL(), 'homePageLink' );
 
                $result->setIndexedTagName( $service['apis'], 'api' );
 
index b40476a..53affbd 100644 (file)
@@ -44,8 +44,9 @@ class ApiSetNotificationTimestamp extends ApiBase {
                $this->requireMaxOneParameter( $params, 'timestamp', 'torevid', 'newerthanrevid' );
 
                $pageSet = $this->getPageSet();
-               $args = array_merge( array( $params, 'entirewatchlist' ), array_keys( $pageSet->getAllowedParams() ) );
-               call_user_func_array( array( $this, 'requireOnlyOneParameter' ), $args );
+               if ( $params['entirewatchlist'] && $pageSet->getDataSource() !== null ) {
+                       $this->dieUsage( "Cannot use 'entirewatchlist' at the same time as '{$pageSet->getDataSource()}'", 'multisource' );
+               }
 
                $dbw = wfGetDB( DB_MASTER, 'api' );
 
@@ -211,7 +212,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
        }
 
        public function getParamDescription() {
-               return $this->getPageSet()->getParamDescription() + array(
+               return $this->getPageSet()->getFinalParamDescription() + array(
                        'entirewatchlist' => 'Work on all watched pages',
                        'timestamp' => 'Timestamp to which to set the notification timestamp',
                        'torevid' => 'Revision to set the notification timestamp to (one page only)',
@@ -269,7 +270,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                $ps = $this->getPageSet();
                return array_merge(
                        parent::getPossibleErrors(),
-                       $ps->getPossibleErrors(),
+                       $ps->getFinalPossibleErrors(),
                        $this->getRequireMaxOneParameterErrorMessages(
                                array( 'timestamp', 'torevid', 'newerthanrevid' ) ),
                        $this->getRequireOnlyOneParameterErrorMessages(
index 2dcf392..8f71fbe 100644 (file)
@@ -56,7 +56,7 @@ class ApiUpload extends ApiBase {
                $this->mParams['chunk'] = $request->getFileName( 'chunk' );
 
                // Copy the session key to the file key, for backward compatibility.
-               if( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
+               if ( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
                        $this->mParams['filekey'] = $this->mParams['sessionkey'];
                }
 
@@ -82,15 +82,16 @@ class ApiUpload extends ApiBase {
                // Check if the uploaded file is sane
                if ( $this->mParams['chunk'] ) {
                        $maxSize = $this->mUpload->getMaxUploadSize();
-                       if( $this->mParams['filesize'] > $maxSize ) {
+                       if ( $this->mParams['filesize'] > $maxSize ) {
                                $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
                        }
                        if ( !$this->mUpload->getTitle() ) {
                                $this->dieUsage( 'Invalid file title supplied', 'internal-error' );
                        }
-               } elseif ( $this->mParams['async'] ) {
+               } elseif ( $this->mParams['async'] && $this->mParams['filekey'] ) {
                        // defer verification to background process
                } else {
+                       wfDebug( __METHOD__ . 'about to verify' );
                        $this->verifyUpload();
                }
 
@@ -143,7 +144,7 @@ class ApiUpload extends ApiBase {
         * @return array
         */
        private function getStashResult( $warnings ) {
-               $result = array ();
+               $result = array();
                // Some uploads can request they be stashed, so as not to publish them immediately.
                // In this case, a failure to stash ought to be fatal
                try {
@@ -195,7 +196,12 @@ class ApiUpload extends ApiBase {
                $chunkPath = $request->getFileTempname( 'chunk' );
                $chunkSize = $request->getUpload( 'chunk' )->getSize();
                if ( $this->mParams['offset'] == 0 ) {
-                       $filekey = $this->performStash();
+                       try {
+                               $filekey = $this->performStash();
+                       } catch ( MWException $e ) {
+                               // FIXME: Error handling here is wrong/different from rest of this
+                               $this->dieUsage( $e->getMessage(), 'stashfailed' );
+                       }
                } else {
                        $filekey = $this->mParams['filekey'];
                        /** @var $status Status */
@@ -210,27 +216,27 @@ class ApiUpload extends ApiBase {
                // Check we added the last chunk:
                if ( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
                        if ( $this->mParams['async'] ) {
-                               $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+                               $progress = UploadBase::getSessionStatus( $filekey );
                                if ( $progress && $progress['result'] === 'Poll' ) {
                                        $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
                                }
                                UploadBase::setSessionStatus(
-                                       $this->mParams['filekey'],
+                                       $filekey,
                                        array( 'result' => 'Poll',
                                                'stage' => 'queued', 'status' => Status::newGood() )
                                );
                                $ok = JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
-                                       Title::makeTitle( NS_FILE, $this->mParams['filekey'] ),
+                                       Title::makeTitle( NS_FILE, $filekey ),
                                        array(
-                                               'filename'  => $this->mParams['filename'],
-                                               'filekey'   => $this->mParams['filekey'],
-                                               'session'   => $this->getContext()->exportSession()
+                                               'filename' => $this->mParams['filename'],
+                                               'filekey' => $filekey,
+                                               'session' => $this->getContext()->exportSession()
                                        )
                                ) );
                                if ( $ok ) {
                                        $result['result'] = 'Poll';
                                } else {
-                                       UploadBase::setSessionStatus( $this->mParams['filekey'], false );
+                                       UploadBase::setSessionStatus( $filekey, false );
                                        $this->dieUsage(
                                                "Failed to start AssembleUploadChunks.php", 'stashfailed' );
                                }
@@ -354,7 +360,7 @@ class ApiUpload extends ApiBase {
                if ( $this->mParams['chunk'] ) {
                        // Chunk upload
                        $this->mUpload = new UploadFromChunks();
-                       if( isset( $this->mParams['filekey'] ) ) {
+                       if ( isset( $this->mParams['filekey'] ) ) {
                                // handle new chunk
                                $this->mUpload->continueChunks(
                                        $this->mParams['filename'],
@@ -444,9 +450,9 @@ class ApiUpload extends ApiBase {
                $verification = $this->mUpload->verifyUpload();
                if ( $verification['status'] === UploadBase::OK ) {
                        return;
-               } else {
-                       return $this->checkVerification( $verification );
                }
+
+               $this->checkVerification( $verification );
        }
 
        /**
@@ -455,8 +461,8 @@ class ApiUpload extends ApiBase {
        protected function checkVerification( array $verification ) {
                global $wgFileExtensions;
 
-               // TODO: Move them to ApiBase's message map
-               switch( $verification['status'] ) {
+               // @todo Move them to ApiBase's message map
+               switch ( $verification['status'] ) {
                        // Recoverable errors
                        case UploadBase::MIN_LENGTH_PARTNAME:
                                $this->dieRecoverableError( 'filename-tooshort', 'filename' );
@@ -588,12 +594,12 @@ class ApiUpload extends ApiBase {
                        $ok = JobQueueGroup::singleton()->push( new PublishStashedFileJob(
                                Title::makeTitle( NS_FILE, $this->mParams['filename'] ),
                                array(
-                                       'filename'  => $this->mParams['filename'],
-                                       'filekey'   => $this->mParams['filekey'],
-                                       'comment'   => $this->mParams['comment'],
-                                       'text'      => $this->mParams['text'],
-                                       'watch'     => $watch,
-                                       'session'   => $this->getContext()->exportSession()
+                                       'filename' => $this->mParams['filename'],
+                                       'filekey' => $this->mParams['filekey'],
+                                       'comment' => $this->mParams['comment'],
+                                       'text' => $this->mParams['text'],
+                                       'watch' => $watch,
+                                       'session' => $this->getContext()->exportSession()
                                )
                        ) );
                        if ( $ok ) {
index b9b1eed..870201e 100644 (file)
@@ -38,6 +38,7 @@ class ApiUserrights extends ApiBase {
                $user = $this->getUrUser();
 
                $form = new UserrightsPage;
+               $form->setContext( $this->getContext() );
                $r['user'] = $user->getName();
                $r['userid'] = $user->getId();
                list( $r['added'], $r['removed'] ) =
@@ -62,6 +63,7 @@ class ApiUserrights extends ApiBase {
                $params = $this->extractRequestParams();
 
                $form = new UserrightsPage;
+               $form->setContext( $this->getContext() );
                $status = $form->fetchUser( $params['user'] );
                if ( !$status->isOK() ) {
                        $errors = $status->getErrorsArray();
@@ -83,7 +85,7 @@ class ApiUserrights extends ApiBase {
        }
 
        public function getAllowedParams() {
-               return array (
+               return array(
                        'user' => array(
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
index a59cc9a..193f20f 100644 (file)
@@ -20,6 +20,7 @@
  *
  * @file
  * @author Tim Starling
+ * @author Aaron Schulz
  * @copyright © 2009, Tim Starling, Domas Mituzas
  * @copyright © 2010, Max Sem
  * @copyright © 2011, Antoine Musso
@@ -103,7 +104,7 @@ class BacklinkCache {
                        self::$cache = new ProcessCacheLRU( 1 );
                }
                $dbKey = $title->getPrefixedDBkey();
-               if ( !self::$cache->has( $dbKey, 'obj' ) ) {
+               if ( !self::$cache->has( $dbKey, 'obj', 3600 ) ) {
                        self::$cache->set( $dbKey, 'obj', new self( $title ) );
                }
                return self::$cache->get( $dbKey, 'obj' );
@@ -147,71 +148,73 @@ class BacklinkCache {
                if ( !isset( $this->db ) ) {
                        $this->db = wfGetDB( DB_SLAVE );
                }
-
                return $this->db;
        }
 
        /**
         * Get the backlinks for a given table. Cached in process memory only.
         * @param $table String
-        * @param $startId Integer or false
-        * @param $endId Integer or false
+        * @param $startId Integer|false
+        * @param $endId Integer|false
+        * @param $max Integer|INF
         * @return TitleArrayFromResult
         */
-       public function getLinks( $table, $startId = false, $endId = false ) {
+       public function getLinks( $table, $startId = false, $endId = false, $max = INF ) {
+               return TitleArray::newFromResult( $this->queryLinks( $table, $startId, $endId, $max ) );
+       }
+
+       /**
+        * Get the backlinks for a given table. Cached in process memory only.
+        * @param $table String
+        * @param $startId Integer|false
+        * @param $endId Integer|false
+        * @param $max Integer|INF
+        * @return ResultWrapper
+        */
+       protected function queryLinks( $table, $startId, $endId, $max ) {
                wfProfileIn( __METHOD__ );
 
                $fromField = $this->getPrefix( $table ) . '_from';
 
-               if ( $startId || $endId ) {
-                       // Partial range, not cached
-                       wfDebug( __METHOD__ . ": from DB (uncacheable range)\n" );
+               if ( !$startId && !$endId && is_infinite( $max )
+                       && isset( $this->fullResultCache[$table] ) )
+               {
+                       wfDebug( __METHOD__ . ": got results from cache\n" );
+                       $res = $this->fullResultCache[$table];
+               } else {
+                       wfDebug( __METHOD__ . ": got results from DB\n" );
                        $conds = $this->getConditions( $table );
-
                        // Use the from field in the condition rather than the joined page_id,
                        // because databases are stupid and don't necessarily propagate indexes.
                        if ( $startId ) {
                                $conds[] = "$fromField >= " . intval( $startId );
                        }
-
                        if ( $endId ) {
                                $conds[] = "$fromField <= " . intval( $endId );
                        }
+                       $options = array( 'STRAIGHT_JOIN', 'ORDER BY' => $fromField );
+                       if ( is_finite( $max ) && $max > 0 ) {
+                               $options['LIMIT'] = $max;
+                       }
 
                        $res = $this->getDB()->select(
                                array( $table, 'page' ),
                                array( 'page_namespace', 'page_title', 'page_id' ),
                                $conds,
                                __METHOD__,
-                               array(
-                                       'STRAIGHT_JOIN',
-                                       'ORDER BY' => $fromField
-                               ) );
-                       $ta = TitleArray::newFromResult( $res );
-
-                       wfProfileOut( __METHOD__ );
-                       return $ta;
-               }
+                               $options
+                       );
 
-               // @todo FIXME: Make this a function?
-               if ( !isset( $this->fullResultCache[$table] ) ) {
-                       wfDebug( __METHOD__ . ": from DB\n" );
-                       $res = $this->getDB()->select(
-                               array( $table, 'page' ),
-                               array( 'page_namespace', 'page_title', 'page_id' ),
-                               $this->getConditions( $table ),
-                               __METHOD__,
-                               array(
-                                       'STRAIGHT_JOIN',
-                                       'ORDER BY' => $fromField,
-                               ) );
-                       $this->fullResultCache[$table] = $res;
+                       if ( !$startId && !$endId && $res->numRows() < $max ) {
+                               // The full results fit within the limit, so cache them
+                               $this->fullResultCache[$table] = $res;
+                       } else {
+                               wfDebug( __METHOD__ . ": results from DB were uncacheable\n" );
+                       }
                }
 
-               $ta = TitleArray::newFromResult( $this->fullResultCache[$table] );
-
                wfProfileOut( __METHOD__ );
-               return $ta;
+               return $res;
        }
 
        /**
@@ -234,7 +237,7 @@ class BacklinkCache {
                } else {
                        $prefix = null;
                        wfRunHooks( 'BacklinkCacheGetPrefix', array( $table, &$prefix ) );
-                       if( $prefix ) {
+                       if ( $prefix ) {
                                return $prefix;
                        } else {
                                throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
@@ -289,7 +292,7 @@ class BacklinkCache {
                        default:
                                $conds = null;
                                wfRunHooks( 'BacklinkCacheGetConditions', array( $table, $this->title, &$conds ) );
-                               if( !$conds ) {
+                               if ( !$conds ) {
                                        throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
                                }
                }
@@ -309,7 +312,7 @@ class BacklinkCache {
        /**
         * Get the approximate number of backlinks
         * @param $table String
-        * @param $max integer Only count up to this many backlinks
+        * @param $max integer|INF Only count up to this many backlinks
         * @return integer
         */
        public function getNumLinks( $table, $max = INF ) {
@@ -335,20 +338,12 @@ class BacklinkCache {
                }
 
                // 4) fetch from the database ...
-               if ( is_infinite( $max ) ) { // full count
-                       $count = $this->getLinks( $table )->count();
+               $count = $this->getLinks( $table, false, false, $max )->count();
+               if ( $count < $max ) { // full count
                        $wgMemc->set( $memcKey, $count, self::CACHE_EXPIRY );
-               } else { // with limit
-                       $count = $this->getDB()->select(
-                               array( $table, 'page' ),
-                               '1',
-                               $this->getConditions( $table ),
-                               __METHOD__,
-                               array( 'LIMIT' => $max )
-                       )->numRows();
                }
 
-               return $count;
+               return min( $max, $count );
        }
 
        /**
@@ -395,8 +390,28 @@ class BacklinkCache {
                }
 
                // 4) ... finally fetch from the slow database :(
-               $this->getLinks( $table );
-               $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
+               $cacheEntry = array( 'numRows' => 0, 'batches' => array() ); // final result
+               // Do the selects in batches to avoid client-side OOMs (bug 43452).
+               // Use a LIMIT that plays well with $batchSize to keep equal sized partitions.
+               $selectSize = max( $batchSize, 200000 - ( 200000 % $batchSize ) );
+               $start = false;
+               do {
+                       $res = $this->queryLinks( $table, $start, false, $selectSize );
+                       $partitions = $this->partitionResult( $res, $batchSize, false );
+                       // Merge the link count and range partitions for this chunk
+                       $cacheEntry['numRows'] += $partitions['numRows'];
+                       $cacheEntry['batches'] = array_merge( $cacheEntry['batches'], $partitions['batches'] );
+                       if ( count( $partitions['batches'] ) ) {
+                               list( $lStart, $lEnd ) = end( $partitions['batches'] );
+                               $start = $lEnd + 1; // pick up after this inclusive range
+                       }
+               } while ( $partitions['numRows'] >= $selectSize );
+               // Make sure the first range has start=false and the last one has end=false
+               if ( count( $cacheEntry['batches'] ) ) {
+                       $cacheEntry['batches'][0][0] = false;
+                       $cacheEntry['batches'][count( $cacheEntry['batches'] ) - 1][1] = false;
+               }
+
                // Save partitions to memcached
                $wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
 
@@ -412,31 +427,32 @@ class BacklinkCache {
         * Partition a DB result with backlinks in it into batches
         * @param $res ResultWrapper database result
         * @param $batchSize integer
+        * @param $isComplete bool Whether $res includes all the backlinks
         * @throws MWException
-        * @return array @see
+        * @return array
         */
-       protected function partitionResult( $res, $batchSize ) {
+       protected function partitionResult( $res, $batchSize, $isComplete = true ) {
                $batches = array();
                $numRows = $res->numRows();
                $numBatches = ceil( $numRows / $batchSize );
 
                for ( $i = 0; $i < $numBatches; $i++ ) {
-                       if ( $i == 0  ) {
+                       if ( $i == 0 && $isComplete ) {
                                $start = false;
                        } else {
-                               $rowNum = intval( $numRows * $i / $numBatches );
+                               $rowNum = $i * $batchSize;
                                $res->seek( $rowNum );
                                $row = $res->fetchObject();
-                               $start = $row->page_id;
+                               $start = (int)$row->page_id;
                        }
 
-                       if ( $i == $numBatches - 1 ) {
+                       if ( $i == ( $numBatches - 1 ) && $isComplete ) {
                                $end = false;
                        } else {
-                               $rowNum = intval( $numRows * ( $i + 1 ) / $numBatches );
+                               $rowNum = min( $numRows - 1, ( $i + 1 ) * $batchSize - 1 );
                                $res->seek( $rowNum );
                                $row = $res->fetchObject();
-                               $end = $row->page_id - 1;
+                               $end = (int)$row->page_id;
                        }
 
                        # Sanity check order
index 0f047e8..32bcdf7 100644 (file)
@@ -404,7 +404,7 @@ class GlobalDependency extends CacheDependency {
         * @return bool
         */
        function isExpired() {
-               if( !isset( $GLOBALS[$this->name] ) ) {
+               if ( !isset( $GLOBALS[$this->name] ) ) {
                        return true;
                }
                return $GLOBALS[$this->name] != $this->value;
index 30a7217..d4bf5ee 100644 (file)
@@ -35,7 +35,7 @@ abstract class FileCacheBase {
        /* lazy loaded */
        protected $mCached;
 
-       /* @TODO: configurable? */
+       /* @todo configurable? */
        const MISS_FACTOR = 15; // log 1 every MISS_FACTOR cache misses
        const MISS_TTL_SEC = 3600; // how many seconds ago is "recent"
 
@@ -138,7 +138,7 @@ abstract class FileCacheBase {
         * @return string
         */
        public function fetchText() {
-               if( $this->useGzip() ) {
+               if ( $this->useGzip() ) {
                        $fh = gzopen( $this->cachePath(), 'rb' );
                        return stream_get_contents( $fh );
                } else {
@@ -163,7 +163,7 @@ abstract class FileCacheBase {
 
                $this->checkCacheDirs(); // build parent dir
                if ( !file_put_contents( $this->cachePath(), $text, LOCK_EX ) ) {
-                       wfDebug( __METHOD__ . "() failed saving ". $this->cachePath() . "\n" );
+                       wfDebug( __METHOD__ . "() failed saving " . $this->cachePath() . "\n" );
                        $this->mCached = null;
                        return false;
                }
index 63e4226..b7d1b26 100644 (file)
@@ -66,15 +66,14 @@ class GenderCache {
        public function getGenderOf( $username, $caller = '' ) {
                global $wgUser;
 
-               if( $username instanceof User ) {
+               if ( $username instanceof User ) {
                        $username = $username->getName();
                }
 
                $username = self::normalizeUsername( $username );
                if ( !isset( $this->cache[$username] ) ) {
-
                        if ( $this->misses >= $this->missLimit && $wgUser->getName() !== $username ) {
-                               if( $this->misses === $this->missLimit ) {
+                               if ( $this->misses === $this->missLimit ) {
                                        $this->misses++;
                                        wfDebug( __METHOD__ . ": too many misses, returning default onwards\n" );
                                }
@@ -84,7 +83,6 @@ class GenderCache {
                                $this->misses++;
                                $this->doQuery( $username, $caller );
                        }
-
                }
 
                /* Undefined if there is a valid username which for some reason doesn't
@@ -102,7 +100,9 @@ class GenderCache {
        public function doLinkBatch( $data, $caller = '' ) {
                $users = array();
                foreach ( $data as $ns => $pagenames ) {
-                       if ( !MWNamespace::hasGenderDistinction( $ns ) ) continue;
+                       if ( !MWNamespace::hasGenderDistinction( $ns ) ) {
+                               continue;
+                       }
                        foreach ( array_keys( $pagenames ) as $username ) {
                                $users[$username] = true;
                        }
@@ -150,7 +150,7 @@ class GenderCache {
                                // For existing users, this value will be overwritten by the correct value
                                $this->cache[$name] = $default;
                                // query only for valid names, which can be in the database
-                               if( User::isValidUserName( $name ) ) {
+                               if ( User::isValidUserName( $name ) ) {
                                        $usersToCheck[] = $name;
                                }
                        }
index 88e7928..992809e 100644 (file)
@@ -46,8 +46,6 @@ class HTMLCacheUpdate implements DeferrableUpdate {
        }
 
        public function doUpdate() {
-               global $wgMaxBacklinksInvalidate;
-
                wfProfileIn( __METHOD__ );
 
                $job = new HTMLCacheUpdateJob(
@@ -60,13 +58,14 @@ class HTMLCacheUpdate implements DeferrableUpdate {
                );
 
                $count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 200 );
-               if ( $wgMaxBacklinksInvalidate !== false && $count > $wgMaxBacklinksInvalidate ) {
-                       wfDebug( "Skipped HTML cache invalidation of {$this->mTitle->getPrefixedText()}." );
-               } elseif ( $count >= 200 ) { // many backlinks
+               if ( $count >= 200 ) { // many backlinks
                        JobQueueGroup::singleton()->push( $job );
                        JobQueueGroup::singleton()->deduplicateRootJob( $job );
                } else { // few backlinks ($count might be off even if 0)
-                       $job->run(); // just do the purge query now
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->onTransactionIdle( function() use ( $job ) {
+                               $job->run(); // just do the purge query now
+                       } );
                }
 
                wfProfileOut( __METHOD__ );
index 055fd68..ab37911 100644 (file)
@@ -163,7 +163,7 @@ class HTMLFileCache extends FileCacheBase {
                        return $text;
                }
 
-               wfDebug( __METHOD__ . "()\n", false);
+               wfDebug( __METHOD__ . "()\n", false );
 
                $now = wfTimestampNow();
                if ( $this->useGzip() ) {
@@ -182,7 +182,7 @@ class HTMLFileCache extends FileCacheBase {
 
                // gzip output to buffer as needed and set headers...
                if ( $this->useGzip() ) {
-                       // @TODO: ugly wfClientAcceptsGzip() function - use context!
+                       // @todo Ugly wfClientAcceptsGzip() function - use context!
                        if ( wfClientAcceptsGzip() ) {
                                header( 'Content-Encoding: gzip' );
                                return $compressed;
index 72a2e8e..48b60aa 100644 (file)
@@ -39,7 +39,7 @@ class LinkBatch {
        protected $caller;
 
        function __construct( $arr = array() ) {
-               foreach( $arr as $item ) {
+               foreach ( $arr as $item ) {
                        $this->addObj( $item );
                }
        }
@@ -98,7 +98,7 @@ class LinkBatch {
         * @return bool
         */
        public function isEmpty() {
-               return ($this->getSize() == 0);
+               return $this->getSize() == 0;
        }
 
        /**
index 0e41e26..6ac7e7a 100644 (file)
@@ -37,16 +37,41 @@ class LinkCache {
        private $mForUpdate = false;
 
        /**
-        * Get an instance of this class
+        * @var LinkCache
+        */
+       protected static $instance;
+
+       /**
+        * Get an instance of this class.
         *
         * @return LinkCache
         */
        static function &singleton() {
-               static $instance;
-               if ( !isset( $instance ) ) {
-                       $instance = new LinkCache;
+               if ( self::$instance ) {
+                       return self::$instance;
                }
-               return $instance;
+               self::$instance = new LinkCache;
+               return self::$instance;
+       }
+
+       /**
+        * Destroy the singleton instance, a new one will be created next time
+        * singleton() is called.
+        * @since 1.22
+        */
+       static function destroySingleton() {
+               self::$instance = null;
+       }
+
+       /**
+        * Set the singleton instance to a given object.
+        * Since we do not have an interface for LinkCache, you have to be sure the
+        * given object implements all the LinkCache public methods.
+        * @param LinkCache $instance
+        * @since 1.22
+        */
+       static function setSingleton( LinkCache $instance ) {
+               self::$instance = $instance;
        }
 
        /**
@@ -156,8 +181,13 @@ class LinkCache {
                unset( $this->mGoodLinkFields[$dbkey] );
        }
 
-       public function getGoodLinks() { return $this->mGoodLinks; }
-       public function getBadLinks() { return array_keys( $this->mBadLinks ); }
+       public function getGoodLinks() {
+               return $this->mGoodLinks;
+       }
+
+       public function getBadLinks() {
+               return array_keys( $this->mBadLinks );
+       }
 
        /**
         * Add a title to the link cache, return the page_id or zero if non-existent
@@ -167,7 +197,7 @@ class LinkCache {
         */
        public function addLink( $title ) {
                $nt = Title::newFromDBkey( $title );
-               if( $nt ) {
+               if ( $nt ) {
                        return $this->addLinkObj( $nt );
                } else {
                        return 0;
@@ -215,7 +245,9 @@ class LinkCache {
                }
 
                $f = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
-               if ( $wgContentHandlerUseDB ) $f[] = 'page_content_model';
+               if ( $wgContentHandlerUseDB ) {
+                       $f[] = 'page_content_model';
+               }
 
                $s = $db->selectRow( 'page', $f,
                        array( 'page_namespace' => $nt->getNamespace(), 'page_title' => $nt->getDBkey() ),
index 009b950..0f229f9 100644 (file)
@@ -110,7 +110,7 @@ class LocalisationCache {
                'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
                'defaultDateFormat', 'extraUserToggles', 'specialPageAliases',
                'imageFiles', 'preloadedMessages', 'namespaceGenderAliases',
-               'digitGroupingPattern', 'pluralRules', 'compiledPluralRules',
+               'digitGroupingPattern', 'pluralRules', 'pluralRuleTypes', 'compiledPluralRules',
        );
 
        /**
@@ -160,6 +160,20 @@ class LocalisationCache {
         */
        var $pluralRules = null;
 
+       /**
+        * Associative array of cached plural rule types. The key is the language
+        * code, the value is an array of plural rule types for that language. For
+        * example, $pluralRuleTypes['ar'] = ['zero', 'one', 'two', 'few', 'many'].
+        * The index for each rule type matches the index for the rule in
+        * $pluralRules, thus allowing correlation between the two. The reason we
+        * don't just use the type names as the keys in $pluralRules is because
+        * Language::convertPlural applies the rules based on numeric order (or
+        * explicit numeric parameter), not based on the name of the rule type. For
+        * example, {{plural:count|wordform1|wordform2|wordform3}}, rather than
+        * {{plural:count|one=wordform1|two=wordform2|many=wordform3}}.
+        */
+       var $pluralRuleTypes = null;
+
        var $mergeableKeys = null;
 
        /**
@@ -340,7 +354,6 @@ class LocalisationCache {
         * @param $code
         * @param $key
         * @param $subkey
-        * @return
         */
        protected function loadSubitem( $code, $key, $subkey ) {
                if ( !in_array( $key, self::$splitKeys ) ) {
@@ -370,6 +383,9 @@ class LocalisationCache {
 
        /**
         * Returns true if the cache identified by $code is missing or expired.
+        *
+        * @param string $code
+        *
         * @return bool
         */
        public function isExpired( $code ) {
@@ -480,9 +496,10 @@ class LocalisationCache {
         * @return array
         */
        protected function readPHPFile( $_fileName, $_fileType ) {
+               wfProfileIn( __METHOD__ );
                // Disable APC caching
                $_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
-               include( $_fileName );
+               include $_fileName;
                ini_set( 'apc.cache_by_default', $_apcEnabled );
 
                if ( $_fileType == 'core' || $_fileType == 'extension' ) {
@@ -490,8 +507,10 @@ class LocalisationCache {
                } elseif ( $_fileType == 'aliases' ) {
                        $data = compact( 'aliases' );
                } else {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ": Invalid file type: $_fileType" );
                }
+               wfProfileOut( __METHOD__ );
                return $data;
        }
 
@@ -506,7 +525,7 @@ class LocalisationCache {
                }
                try {
                        $compiledRules = CLDRPluralRuleEvaluator::compile( $rules );
-               } catch( CLDRPluralRuleError $e ) {
+               } catch ( CLDRPluralRuleError $e ) {
                        wfDebugLog( 'l10n', $e->getMessage() . "\n" );
                        return array();
                }
@@ -519,17 +538,8 @@ class LocalisationCache {
         * @since 1.20
         */
        public function getPluralRules( $code ) {
-               global $IP;
-
                if ( $this->pluralRules === null ) {
-                       $cldrPlural = "$IP/languages/data/plurals.xml";
-                       $mwPlural = "$IP/languages/data/plurals-mediawiki.xml";
-                       // Load CLDR plural rules
-                       $this->loadPluralFile( $cldrPlural );
-                       if ( file_exists( $mwPlural ) ) {
-                               // Override or extend
-                               $this->loadPluralFile( $mwPlural );
-                       }
+                       $this->loadPluralFiles();
                }
                if ( !isset( $this->pluralRules[$code] ) ) {
                        return null;
@@ -538,6 +548,37 @@ class LocalisationCache {
                }
        }
 
+       /**
+        * Get the plural rule types for a given language from the XML files.
+        * Cached.
+        * @since 1.21
+        */
+       public function getPluralRuleTypes( $code ) {
+               if ( $this->pluralRuleTypes === null ) {
+                       $this->loadPluralFiles();
+               }
+               if ( !isset( $this->pluralRuleTypes[$code] ) ) {
+                       return null;
+               } else {
+                       return $this->pluralRuleTypes[$code];
+               }
+       }
+
+       /**
+        * Load the plural XML files.
+        */
+       protected function loadPluralFiles() {
+               global $IP;
+               $cldrPlural = "$IP/languages/data/plurals.xml";
+               $mwPlural = "$IP/languages/data/plurals-mediawiki.xml";
+               // Load CLDR plural rules
+               $this->loadPluralFile( $cldrPlural );
+               if ( file_exists( $mwPlural ) ) {
+                       // Override or extend
+                       $this->loadPluralFile( $mwPlural );
+               }
+       }
+
        /**
         * Load a plural XML file with the given filename, compile the relevant
         * rules, and save the compiled rules in a process-local cache.
@@ -549,12 +590,16 @@ class LocalisationCache {
                foreach ( $rulesets as $ruleset ) {
                        $codes = $ruleset->getAttribute( 'locales' );
                        $rules = array();
+                       $ruleTypes = array();
                        $ruleElements = $ruleset->getElementsByTagName( "pluralRule" );
                        foreach ( $ruleElements as $elt ) {
+                               $ruleType = $elt->getAttribute( 'count' );
                                $rules[] = $elt->nodeValue;
+                               $ruleTypes[] = $ruleType;
                        }
                        foreach ( explode( ' ', $codes ) as $code ) {
                                $this->pluralRules[$code] = $rules;
+                               $this->pluralRuleTypes[$code] = $ruleTypes;
                        }
                }
        }
@@ -566,9 +611,11 @@ class LocalisationCache {
         */
        protected function readSourceFilesAndRegisterDeps( $code, &$deps ) {
                global $IP;
+               wfProfileIn( __METHOD__ );
 
                $fileName = Language::getMessagesFileName( $code );
                if ( !file_exists( $fileName ) ) {
+                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -579,10 +626,13 @@ class LocalisationCache {
                $data['pluralRules'] = $this->getPluralRules( $code );
                # And for PHP
                $data['compiledPluralRules'] = $this->getCompiledPluralRules( $code );
+               # Load plural rule types
+               $data['pluralRuleTypes'] = $this->getPluralRuleTypes( $code );
 
                $deps['plurals'] = new FileDependency( "$IP/languages/data/plurals.xml" );
                $deps['plurals-mw'] = new FileDependency( "$IP/languages/data/plurals-mediawiki.xml" );
 
+               wfProfileOut( __METHOD__ );
                return $data;
        }
 
@@ -673,6 +723,7 @@ class LocalisationCache {
                wfProfileIn( __METHOD__ );
 
                if ( !$code ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Invalid language code requested" );
                }
                $this->recachedLangs[$code] = true;
@@ -741,6 +792,7 @@ class LocalisationCache {
                # This is done after the core because we know the fallback sequence now.
                # But it has a higher precedence for merging so that we can support things
                # like site-specific message overrides.
+               wfProfileIn( __METHOD__ . '-extensions' );
                $allData = $initialData;
                foreach ( $wgExtensionMessagesFiles as $fileName ) {
                        $data = $this->readPHPFile( $fileName, 'extension' );
@@ -761,6 +813,7 @@ class LocalisationCache {
                foreach ( $coreData as $key => $item ) {
                        $this->mergeItem( $key, $allData[$key], $item );
                }
+               wfProfileOut( __METHOD__ . '-extensions' );
 
                # Add cache dependencies for any referenced globals
                $deps['wgExtensionMessagesFiles'] = new GlobalDependency( 'wgExtensionMessagesFiles' );
@@ -786,6 +839,10 @@ class LocalisationCache {
                if ( $allData['compiledPluralRules'] === null ) {
                        $allData['compiledPluralRules'] = array();
                }
+               # If there were no plural rule types, return an empty array
+               if ( $allData['pluralRuleTypes'] === null ) {
+                       $allData['pluralRuleTypes'] = array();
+               }
 
                # Set the list keys
                $allData['list'] = array();
@@ -796,6 +853,7 @@ class LocalisationCache {
                wfRunHooks( 'LocalisationCacheRecache', array( $this, $code, &$allData ) );
 
                if ( is_null( $allData['namespaceNames'] ) ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ': Localisation data failed sanity check! ' .
                                'Check that your languages/messages/MessagesEn.php file is intact.' );
                }
@@ -810,6 +868,7 @@ class LocalisationCache {
                }
 
                # Save to the persistent cache
+               wfProfileIn( __METHOD__ . '-write' );
                $this->store->startWrite( $code );
                foreach ( $allData as $key => $value ) {
                        if ( in_array( $key, self::$splitKeys ) ) {
@@ -821,6 +880,7 @@ class LocalisationCache {
                        }
                }
                $this->store->finishWrite();
+               wfProfileOut( __METHOD__ . '-write' );
 
                # Clear out the MessageBlobStore
                # HACK: If using a null (i.e. disabled) storage backend, we
@@ -921,7 +981,7 @@ interface LCStore {
 
        /**
         * Start a write transaction.
-        * @param $code Language code
+        * @param string $code Language code
         */
        function startWrite( $code );
 
@@ -933,8 +993,8 @@ interface LCStore {
        /**
         * Set a key to a given value. startWrite() must be called before this
         * is called, and finishWrite() must be called afterwards.
-        * @param $key
-        * @param $value
+        * @param string $key
+        * @param mixed $value
         */
        function set( $key, $value );
 }
@@ -1284,5 +1344,4 @@ class LocalisationCache_BulkLoad extends LocalisationCache {
                        $this->unload( $code );
                }
        }
-
 }
index 7425978..7dc8d05 100644 (file)
  */
 
 /**
- *
+ * MediaWiki message cache structure version.
+ * Bump this whenever the message cache format has changed.
  */
-define( 'MSG_LOAD_TIMEOUT', 60 );
-define( 'MSG_LOCK_TIMEOUT', 10 );
-define( 'MSG_WAIT_TIMEOUT', 10 );
 define( 'MSG_CACHE_VERSION', 1 );
 
+/**
+ * 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
@@ -44,10 +59,16 @@ class MessageCache {
         */
        protected $mCache;
 
-       // Should  mean that database cannot be used, but check
+       /**
+        * Should  mean that database cannot be used, but check
+        * @var bool $mDisable
+        */
        protected $mDisable;
 
-       /// Lifetime for cache, used by object caching
+       /**
+        * Lifetime for cache, used by object caching.
+        * Set on construction, see __construct().
+        */
        protected $mExpiry;
 
        /**
@@ -56,18 +77,21 @@ class MessageCache {
         */
        protected $mParserOptions, $mParser;
 
-       /// Variable for tracking which variables are already loaded
+       /**
+        * Variable for tracking which variables are already loaded
+        * @var array $mLoadedLanguages
+        */
        protected $mLoadedLanguages = array();
 
        /**
         * Singleton instance
         *
-        * @var MessageCache
+        * @var MessageCache $instance
         */
        private static $instance;
 
        /**
-        * @var bool
+        * @var bool $mInParser
         */
        protected $mInParser = false;
 
@@ -75,12 +99,16 @@ class MessageCache {
         * Get the signleton instance of this class
         *
         * @since 1.18
-        * @return MessageCache object
+        * @return MessageCache
         */
        public static function singleton() {
                if ( is_null( self::$instance ) ) {
                        global $wgUseDatabaseMessages, $wgMsgCacheExpiry;
-                       self::$instance = new self( wfGetMessageCacheStorage(), $wgUseDatabaseMessages, $wgMsgCacheExpiry );
+                       self::$instance = new self(
+                               wfGetMessageCacheStorage(),
+                               $wgUseDatabaseMessages,
+                               $wgMsgCacheExpiry
+                       );
                }
                return self::$instance;
        }
@@ -94,6 +122,11 @@ class MessageCache {
                self::$instance = null;
        }
 
+       /**
+        * @param ObjectCache $memCached A cache instance. If none, fall back to CACHE_NONE.
+        * @param bool $useDB
+        * @param int $expiry Lifetime for cache. @see $mExpiry.
+        */
        function __construct( $memCached, $useDB, $expiry ) {
                if ( !$memCached ) {
                        $memCached = wfGetCache( CACHE_NONE );
@@ -119,15 +152,13 @@ class MessageCache {
 
        /**
         * Try to load the cache from a local file.
-        * Actual format of the file depends on the $wgLocalMessageCacheSerialized
-        * setting.
         *
         * @param string $hash the hash of contents, to check validity.
-        * @param $code Mixed: Optional language code, see documenation of load().
-        * @return bool on failure.
+        * @param Mixed $code Optional language code, see documenation of load().
+        * @return array The cache array
         */
-       function loadFromLocal( $hash, $code ) {
-               global $wgCacheDirectory, $wgLocalMessageCacheSerialized;
+       function getLocalCache( $hash, $code ) {
+               global $wgCacheDirectory;
 
                $filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
 
@@ -139,31 +170,19 @@ class MessageCache {
                        return false; // No cache file
                }
 
-               if ( $wgLocalMessageCacheSerialized ) {
-                       // Check to see if the file has the hash specified
-                       $localHash = fread( $file, 32 );
-                       if ( $hash === $localHash ) {
-                               // All good, get the rest of it
-                               $serialized = '';
-                               while ( !feof( $file ) ) {
-                                       $serialized .= fread( $file, 100000 );
-                               }
-                               fclose( $file );
-                               return $this->setCache( unserialize( $serialized ), $code );
-                       } else {
-                               fclose( $file );
-                               return false; // Wrong hash
+               // Check to see if the file has the hash specified
+               $localHash = fread( $file, 32 );
+               if ( $hash === $localHash ) {
+                       // All good, get the rest of it
+                       $serialized = '';
+                       while ( !feof( $file ) ) {
+                               $serialized .= fread( $file, 100000 );
                        }
+                       fclose( $file );
+                       return unserialize( $serialized );
                } else {
-                       $localHash = substr( fread( $file, 40 ), 8 );
                        fclose( $file );
-                       if ( $hash != $localHash ) {
-                               return false; // Wrong hash
-                       }
-
-                       # Require overwrites the member variable or just shadows it?
-                       require( $filename );
-                       return $this->setCache( $this->mCache, $code );
+                       return false; // Wrong hash
                }
        }
 
@@ -192,55 +211,6 @@ class MessageCache {
                wfRestoreWarnings();
        }
 
-       function saveToScript( $array, $hash, $code ) {
-               global $wgCacheDirectory;
-
-               $filename = "$wgCacheDirectory/messages-" . wfWikiID() . "-$code";
-               $tempFilename = $filename . '.tmp';
-               wfMkdirParents( $wgCacheDirectory, null, __METHOD__ ); // might fail
-
-               wfSuppressWarnings();
-               $file = fopen( $tempFilename, 'w' );
-               wfRestoreWarnings();
-
-               if ( !$file ) {
-                       wfDebug( "Unable to open local cache file for writing\n" );
-                       return;
-               }
-
-               fwrite( $file, "<?php\n//$hash\n\n \$this->mCache = array(" );
-
-               foreach ( $array as $key => $message ) {
-                       $key = $this->escapeForScript( $key );
-                       $message = $this->escapeForScript( $message );
-                       fwrite( $file, "'$key' => '$message',\n" );
-               }
-
-               fwrite( $file, ");\n?>" );
-               fclose( $file);
-               rename( $tempFilename, $filename );
-       }
-
-       function escapeForScript( $string ) {
-               $string = str_replace( '\\', '\\\\', $string );
-               $string = str_replace( '\'', '\\\'', $string );
-               return $string;
-       }
-
-       /**
-        * Set the cache to $cache, if it is valid. Otherwise set the cache to false.
-        *
-        * @return bool
-        */
-       function setCache( $cache, $code ) {
-               if ( isset( $cache['VERSION'] ) && $cache['VERSION'] == MSG_CACHE_VERSION ) {
-                       $this->mCache[$code] = $cache;
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
        /**
         * Loads messages from caches or from database in this order:
         * (1) local message cache (if $wgUseLocalMessageCache is enabled)
@@ -257,16 +227,14 @@ class MessageCache {
         * or false if populating empty cache fails. Also returns true if MessageCache
         * is disabled.
         *
-        * @param bool|String $code String: language to which load messages
+        * @param bool|String $code Language to which load messages
         * @throws MWException
         * @return bool
         */
        function load( $code = false ) {
                global $wgUseLocalMessageCache;
 
-               $exception = null; // deferred error
-
-               if( !is_string( $code ) ) {
+               if ( !is_string( $code ) ) {
                        # This isn't really nice, so at least make a note about it and try to
                        # fall back
                        wfDebug( __METHOD__ . " called without providing a language code\n" );
@@ -291,94 +259,161 @@ class MessageCache {
                # Loading code starts
                wfProfileIn( __METHOD__ );
                $success = false; # Keep track of success
+               $staleCache = false; # a cache array with expired data, or false if none has been loaded
                $where = array(); # Debug info, delayed to avoid spamming debug log too much
                $cacheKey = wfMemcKey( 'messages', $code ); # Key in memc for messages
 
-               # (1) local cache
+               # Local cache
                # Hash of the contents is stored in memcache, to detect if local cache goes
-               # out of date (due to update in other thread?)
+               # out of date (e.g. due to replace() on some other server)
                if ( $wgUseLocalMessageCache ) {
                        wfProfileIn( __METHOD__ . '-fromlocal' );
 
                        $hash = $this->mMemc->get( wfMemcKey( 'messages', $code, 'hash' ) );
                        if ( $hash ) {
-                               $success = $this->loadFromLocal( $hash, $code );
-                               if ( $success ) $where[] = 'got from local cache';
+                               $cache = $this->getLocalCache( $hash, $code );
+                               if ( !$cache ) {
+                                       $where[] = 'local cache is empty or has the wrong hash';
+                               } elseif ( $this->isCacheExpired( $cache ) ) {
+                                       $where[] = 'local cache is expired';
+                                       $staleCache = $cache;
+                               } else {
+                                       $where[] = 'got from local cache';
+                                       $success = true;
+                                       $this->mCache[$code] = $cache;
+                               }
                        }
                        wfProfileOut( __METHOD__ . '-fromlocal' );
                }
 
-               # (2) memcache
-               # Fails if nothing in cache, or in the wrong version.
                if ( !$success ) {
-                       wfProfileIn( __METHOD__ . '-fromcache' );
-                       $cache = $this->mMemc->get( $cacheKey );
-                       $success = $this->setCache( $cache, $code );
-                       if ( $success ) {
-                               $where[] = 'got from global cache';
-                               $this->saveToCaches( $cache, false, $code );
-                       }
-                       wfProfileOut( __METHOD__ . '-fromcache' );
-               }
+                       # 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++ ) {
+                               wfProfileIn( __METHOD__ . '-fromcache' );
+                               $cache = $this->mMemc->get( $cacheKey );
+                               if ( !$cache ) {
+                                       $where[] = 'global cache is empty';
+                               } elseif ( $this->isCacheExpired( $cache ) ) {
+                                       $where[] = 'global cache is expired';
+                                       $staleCache = $cache;
+                               } else {
+                                       $where[] = 'got from global cache';
+                                       $this->mCache[$code] = $cache;
+                                       $this->saveToCaches( $cache, 'local-only', $code );
+                                       $success = true;
+                               }
 
-               # (3)
-               # Nothing in caches... so we need create one and store it in caches
-               if ( !$success ) {
-                       $where[] = 'cache is empty';
-                       $where[] = 'loading from database';
-
-                       if ( $this->lock( $cacheKey ) ) {
-                               $that = $this;
-                               $osc = new ScopedCallback( function() use ( $that, $cacheKey ) {
-                                       $that->unlock( $cacheKey );
-                               } );
-                       }
-                       # Limit the concurrency of loadFromDB to a single process
-                       # This prevents the site from going down when the cache expires
-                       $statusKey = wfMemcKey( 'messages', $code, 'status' );
-                       $success = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
-                       if ( $success ) { // acquired lock
-                               $cache = $this->mMemc;
-                               $isc = new ScopedCallback( function() use ( $cache, $statusKey ) {
-                                       $cache->delete( $statusKey );
-                               } );
-                               $cache = $this->loadFromDB( $code );
-                               $success = $this->setCache( $cache, $code );
-                               if ( $success ) { // messages loaded
-                                       $success = $this->saveToCaches( $cache, true, $code );
-                                       $isc = null; // unlock
-                                       if ( !$success ) {
-                                               $this->mMemc->set( $statusKey, 'error', 60 * 5 );
-                                               wfDebug( __METHOD__ . ": set() error: restart memcached server!\n" );
-                                               $exception = new MWException( "Could not save cache for '$code'." );
+                               wfProfileOut( __METHOD__ . '-fromcache' );
+
+                               if ( $success ) {
+                                       # Done, no need to retry
+                                       break;
+                               }
+
+                               # We need to call loadFromDB. Limit the concurrency to a single
+                               # process. This prevents the site from going down when the cache
+                               # expires.
+                               $statusKey = wfMemcKey( 'messages', $code, 'status' );
+                               $acquired = $this->mMemc->add( $statusKey, 'loading', MSG_LOAD_TIMEOUT );
+                               if ( $acquired ) {
+                                       # Unlock the status key if there is an exception
+                                       $that = $this;
+                                       $statusUnlocker = new ScopedCallback( function () use ( $that, $statusKey ) {
+                                               $that->mMemc->delete( $statusKey );
+                                       } );
+
+                                       # Now let's regenerate
+                                       $where[] = 'loading from database';
+
+                                       # 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 ) ) {
+                                               $mainUnlocker = new ScopedCallback( function () use ( $that, $cacheKey ) {
+                                                       $that->unlock( $cacheKey );
+                                               } );
+                                       } else {
+                                               $mainUnlocker = null;
+                                               $where[] = 'could not acquire main lock';
+                                       }
+
+                                       $cache = $this->loadFromDB( $code );
+                                       $this->mCache[$code] = $cache;
+                                       $success = true;
+                                       $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.
+                                               if ( !$wgUseLocalMessageCache ) {
+                                                       $this->mMemc->set( $statusKey, 'error', 60 * 5 );
+                                                       $where[] = 'could not save cache, disabled globally for 5 minutes';
+                                               } else {
+                                                       $where[] = "could not save global cache";
+                                               }
                                        }
+
+                                       # Load from DB complete, no need to retry
+                                       break;
+                               } elseif ( $staleCache ) {
+                                       # Use the stale cache while some other thread constructs the new one
+                                       $where[] = 'using stale cache';
+                                       $this->mCache[$code] = $staleCache;
+                                       $success = true;
+                                       break;
+                               } elseif ( $failedAttempts > 0 ) {
+                                       # Already retried once, still failed, so don't do another lock/unlock cycle
+                                       # This case will typically be hit if memcached is down, or if
+                                       # loadFromDB() takes longer than MSG_WAIT_TIMEOUT
+                                       $where[] = "could not acquire status key.";
+                                       break;
                                } else {
-                                       $isc = null; // unlock
-                                       $exception = new MWException( "Could not load cache from DB for '$code'." );
+                                       $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 );
+                                       }
                                }
-                       } else {
-                               $exception = new MWException( "Could not acquire '$statusKey' lock." );
                        }
-                       $osc = null; // unlock
                }
 
                if ( !$success ) {
+                       $where[] = 'loading FAILED - cache is disabled';
                        $this->mDisable = true;
                        $this->mCache = false;
-                       // This used to go on, but that led to lots of nasty side
-                       // effects like gadgets and sidebar getting cached with their
-                       // default content
-                       if ( $exception instanceof Exception ) {
-                               throw $exception;
-                       } else {
-                               throw new MWException( "MessageCache failed to load messages" );
-                       }
+                       # This used to throw an exception, but that led to nasty side effects like
+                       # the whole wiki being instantly down if the memcached server died
                } else {
                        # All good, just record the success
-                       $info = implode( ', ', $where );
-                       wfDebug( __METHOD__ . ": Loading $code... $info\n" );
                        $this->mLoadedLanguages[$code] = true;
                }
+               $info = implode( ', ', $where );
+               wfDebug( __METHOD__ . ": Loading $code... $info\n" );
                wfProfileOut( __METHOD__ );
                return $success;
        }
@@ -388,8 +423,8 @@ 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.
+        * @return array Loaded messages for storing in caches.
         */
        function loadFromDB( $code ) {
                wfProfileIn( __METHOD__ );
@@ -449,11 +484,15 @@ class MessageCache {
 
                foreach ( $res as $row ) {
                        $text = Revision::getRevisionText( $row );
-                       if( $text === false ) {
+                       if ( $text === false ) {
                                // Failed to fetch data; possible ES errors?
                                // Store a marker to fetch on-demand as a workaround...
                                $entry = '!TOO BIG';
-                               wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$row->page_title} ($code)" );
+                               wfDebugLog(
+                                       'MessageCache',
+                                       __METHOD__
+                                               . ": failed to load message page text for {$row->page_title} ($code)"
+                               );
                        } else {
                                $entry = ' ' . $text;
                        }
@@ -461,6 +500,7 @@ class MessageCache {
                }
 
                $cache['VERSION'] = MSG_CACHE_VERSION;
+               $cache['EXPIRY'] = wfTimestamp( TS_MW, time() + $this->mExpiry );
                wfProfileOut( __METHOD__ );
                return $cache;
        }
@@ -468,8 +508,8 @@ class MessageCache {
        /**
         * Updates cache as necessary when message page is changed
         *
-        * @param string $title name of the page changed.
-        * @param $text Mixed: new contents of the page.
+        * @param string $title Name of the page changed.
+        * @param mixed $text New contents of the page.
         */
        public function replace( $title, $text ) {
                global $wgMaxMsgCacheEntrySize;
@@ -502,7 +542,7 @@ class MessageCache {
                }
 
                # Update caches
-               $this->saveToCaches( $this->mCache[$code], true, $code );
+               $this->saveToCaches( $this->mCache[$code], 'all', $code );
                $this->unlock( $cacheKey );
 
                // Also delete cached sidebar... just in case it is affected
@@ -528,22 +568,42 @@ class MessageCache {
                wfProfileOut( __METHOD__ );
        }
 
+       /**
+        * Is the given cache array expired due to time passing or a version change?
+        *
+        * @param $cache
+        * @return bool
+        */
+       protected function isCacheExpired( $cache ) {
+               if ( !isset( $cache['VERSION'] ) || !isset( $cache['EXPIRY'] ) ) {
+                       return true;
+               }
+               if ( $cache['VERSION'] != MSG_CACHE_VERSION ) {
+                       return true;
+               }
+               if ( wfTimestampNow() >= $cache['EXPIRY'] ) {
+                       return true;
+               }
+               return false;
+       }
+
        /**
         * Shortcut to update caches.
         *
-        * @param array $cache cached messages with a version.
-        * @param bool $memc Wether to update or not memcache.
-        * @param string $code Language code.
-        * @return bool on somekind of error.
+        * @param array $cache Cached messages with a version.
+        * @param string $dest Either "local-only" to save to local caches only
+        *   or "all" to save to all caches.
+        * @param string|bool $code Language code (default: false)
+        * @return bool
         */
-       protected function saveToCaches( $cache, $memc = true, $code = false ) {
+       protected function saveToCaches( $cache, $dest, $code = false ) {
                wfProfileIn( __METHOD__ );
-               global $wgUseLocalMessageCache, $wgLocalMessageCacheSerialized;
+               global $wgUseLocalMessageCache;
 
                $cacheKey = wfMemcKey( 'messages', $code );
 
-               if ( $memc ) {
-                       $success = $this->mMemc->set( $cacheKey, $cache, $this->mExpiry );
+               if ( $dest === 'all' ) {
+                       $success = $this->mMemc->set( $cacheKey, $cache );
                } else {
                        $success = true;
                }
@@ -552,12 +612,8 @@ class MessageCache {
                if ( $wgUseLocalMessageCache ) {
                        $serialized = serialize( $cache );
                        $hash = md5( $serialized );
-                       $this->mMemc->set( wfMemcKey( 'messages', $code, 'hash' ), $hash, $this->mExpiry );
-                       if ( $wgLocalMessageCacheSerialized ) {
-                               $this->saveToLocal( $serialized, $hash, $code );
-                       } else {
-                               $this->saveToScript( $cache, $hash, $code );
-                       }
+                       $this->mMemc->set( wfMemcKey( 'messages', $code, 'hash' ), $hash );
+                       $this->saveToLocal( $serialized, $hash, $code );
                }
 
                wfProfileOut( __METHOD__ );
@@ -565,19 +621,35 @@ class MessageCache {
        }
 
        /**
-        * Represents a write lock on the messages key
+        * Represents a write lock on the messages key.
         *
-        * @param $key string
+        * Will retry MessageCache::MSG_WAIT_TIMEOUT times, each operations having
+        * a timeout of MessageCache::MSG_LOCK_TIMEOUT.
         *
+        * @param string $key
         * @return Boolean: success
         */
        function lock( $key ) {
                $lockKey = $key . ':lock';
-               for ( $i = 0; $i < MSG_WAIT_TIMEOUT && !$this->mMemc->add( $lockKey, 1, MSG_LOCK_TIMEOUT ); $i++ ) {
+               $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 $i >= MSG_WAIT_TIMEOUT;
+               return $acquired;
        }
 
        function unlock( $key ) {
@@ -586,73 +658,64 @@ class MessageCache {
        }
 
        /**
-        * Get a message from either the content language or the user language. The fallback
-        * language order is the users language fallback union the content language fallback.
-        * This list is then applied to find keys in the following order
-        * 1) MediaWiki:$key/$langcode (for every language except the content language where
-        *    we look at MediaWiki:$key)
-        * 2) Built-in messages via the l10n cache which is also in fallback order
+        * Get a message from either the content language or the user language.
         *
-        * @param string $key the message cache key
-        * @param $useDB Boolean: If true will look for the message in the DB, false only
-        *        get the message from the DB, false to use only the compiled l10n cache.
+        * First, assemble a list of languages to attempt getting the message from. This
+        * chain begins with the requested language and its fallbacks and then continues with
+        * the content language and its fallbacks. For each language in the chain, the following
+        * process will occur (in this order):
+        *  1. If a language-specific override, i.e., [[MW:msg/lang]], is available, use that.
+        *     Note: for the content language, there is no /lang subpage.
+        *  2. Fetch from the static CDB cache.
+        *  3. If available, check the database for fallback language overrides.
+        *
+        * This process provides a number of guarantees. When changing this code, make sure all
+        * of these guarantees are preserved.
+        *  * If the requested language is *not* the content language, then the CDB cache for that
+        *    specific language will take precedence over the root database page ([[MW:msg]]).
+        *  * Fallbacks will be just that: fallbacks. A fallback language will never be reached if
+        *    the message is available *anywhere* in the language for which it is a fallback.
+        *
+        * @param string $key the message key
+        * @param bool $useDB If true, look for the message in the DB, false
+        *                    to use only the compiled l10n cache.
         * @param bool|string|object $langcode Code of the language to get the message for.
         *        - If string and a valid code, will create a standard language object
         *        - If string but not a valid code, will create a basic language object
         *        - If boolean and false, create object from the current users language
         *        - If boolean and true, create object from the wikis content language
         *        - If language object, use it as given
-        * @param $isFullKey Boolean: specifies whether $key is a two part key
+        * @param bool $isFullKey specifies whether $key is a two part key
         *                   "msg/lang".
         *
-        * @throws MWException
-        * @return string|bool False if the message doesn't exist, otherwise the message
+        * @throws MWException when given an invalid key
+        * @return string|bool False if the message doesn't exist, otherwise the message (which can be empty)
         */
        function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
-               global $wgLanguageCode, $wgContLang;
+               global $wgContLang;
 
-               wfProfileIn( __METHOD__ );
+               $section = new ProfileSection( __METHOD__ );
 
                if ( is_int( $key ) ) {
-                       // "Non-string key given" exception sometimes happens for numerical strings that become ints somewhere on their way here
-                       $key = strval( $key );
-               }
-
-               if ( !is_string( $key ) ) {
-                       wfProfileOut( __METHOD__ );
+                       // Fix numerical strings that somehow become ints
+                       // on their way here
+                       $key = (string)$key;
+               } elseif ( !is_string( $key ) ) {
                        throw new MWException( 'Non-string key given' );
-               }
-
-               if ( strval( $key ) === '' ) {
-                       # Shortcut: the empty key is always missing
-                       wfProfileOut( __METHOD__ );
+               } elseif ( $key === '' ) {
+                       // Shortcut: the empty key is always missing
                        return false;
                }
 
-
-               # Obtain the initial language object
-               if ( $isFullKey ) {
-                       $keyParts = explode( '/', $key );
-                       if ( count( $keyParts ) < 2 ) {
-                               throw new MWException( "Message key '$key' does not appear to be a full key." );
-                       }
-
-                       $langcode = array_pop( $keyParts );
-                       $key = implode( '/', $keyParts );
+               // For full keys, get the language code from the key
+               $pos = strrpos( $key, '/' );
+               if ( $isFullKey && $pos !== false ) {
+                       $langcode = substr( $key, $pos + 1 );
+                       $key = substr( $key, 0, $pos );
                }
 
-               # Obtain a language object for the requested language from the passed language code
-               # Note that the language code could in fact be a language object already but we assume
-               # it's a string further below.
-               $requestedLangObj = wfGetLangObj( $langcode );
-               if ( !$requestedLangObj ) {
-                       wfProfileOut( __METHOD__ );
-                       throw new MWException( "Bad lang code $langcode given" );
-               }
-               $langcode = $requestedLangObj->getCode();
-
-               # Normalise title-case input (with some inlining)
-               $lckey = str_replace( ' ', '_', $key );
+               // Normalise title-case input (with some inlining)
+               $lckey = strtr( $key, ' ', '_');
                if ( ord( $key ) < 128 ) {
                        $lckey[0] = strtolower( $lckey[0] );
                        $uckey = ucfirst( $lckey );
@@ -661,77 +724,147 @@ class MessageCache {
                        $uckey = $wgContLang->ucfirst( $lckey );
                }
 
-               # Loop through each language in the fallback list until we find something useful
+               // Loop through each language in the fallback list until we find something useful
+               $lang = wfGetLangObj( $langcode );
+               $message = $this->getMessageFromFallbackChain( $lang, $lckey, $uckey, !$this->mDisable && $useDB );
+
+               // If we still have no message, maybe the key was in fact a full key so try that
+               if ( $message === false ) {
+                       $parts = explode( '/', $lckey );
+                       // We may get calls for things that are http-urls from sidebar
+                       // Let's not load nonexistent languages for those
+                       // They usually have more than one slash.
+                       if ( count( $parts ) == 2 && $parts[1] !== '' ) {
+                               $message = Language::getMessageFor( $parts[0], $parts[1] );
+                               if ( $message === null ) {
+                                       $message = false;
+                               }
+                       }
+               }
+
+               // Post-processing if the message exists
+               if( $message !== false ) {
+                       // Fix whitespace
+                       $message = str_replace(
+                               array(
+                                       # Fix for trailing whitespace, removed by textarea
+                                       '&#32;',
+                                       # Fix for NBSP, converted to space by firefox
+                                       '&nbsp;',
+                                       '&#160;',
+                               ),
+                               array(
+                                       ' ',
+                                       "\xc2\xa0",
+                                       "\xc2\xa0"
+                               ),
+                               $message
+                       );
+               }
+
+               return $message;
+       }
+
+       /**
+        * Given a language, try and fetch a message from that language, then the
+        * fallbacks of that language, then the site language, then the fallbacks for the
+        * site language.
+        *
+        * @param Language $lang Requested language
+        * @param string $lckey Lowercase key for the message
+        * @param string $uckey Uppercase key for the message
+        * @param bool $useDB Whether to use the database
+        *
+        * @see MessageCache::get
+        * @return string|bool The message, or false if not found
+        */
+       protected function getMessageFromFallbackChain( $lang, $lckey, $uckey, $useDB ) {
+               global $wgLanguageCode, $wgContLang;
+
+               $langcode = $lang->getCode();
                $message = false;
 
-               # Try the MediaWiki namespace
-               if ( !$this->mDisable && $useDB ) {
-                       $fallbackChain = Language::getFallbacksIncludingSiteLanguage( $langcode );
-                       array_unshift( $fallbackChain, $langcode );
+               // First try the requested language.
+               if ( $useDB ) {
+                       if ( $langcode === $wgLanguageCode ) {
+                               // Messages created in the content language will not have the /lang extension
+                               $message = $this->getMsgFromNamespace( $uckey, $langcode );
+                       } else {
+                               $message = $this->getMsgFromNamespace( "$uckey/$langcode", $langcode );
+                       }
+               }
+
+               if ( $message !== false ) {
+                       return $message;
+               }
 
-                       foreach ( $fallbackChain as $langcode ) {
-                               if ( $langcode === $wgLanguageCode ) {
-                                       # Messages created in the content language will not have the /lang extension
-                                       $message = $this->getMsgFromNamespace( $uckey, $langcode );
+               // Check the CDB cache
+               $message = $lang->getMessage( $lckey );
+               if ( $message !== null ) {
+                       return $message;
+               }
+
+               list( $fallbackChain, $siteFallbackChain ) = Language::getFallbacksIncludingSiteLanguage( $langcode );
+
+               // Next try checking the database for all of the fallback languages of the requested language.
+               if ( $useDB ) {
+                       foreach ( $fallbackChain as $code ) {
+                               if ( $code === $wgLanguageCode ) {
+                                       // Messages created in the content language will not have the /lang extension
+                                       $message = $this->getMsgFromNamespace( $uckey, $code );
                                } else {
-                                       $message = $this->getMsgFromNamespace( "$uckey/$langcode", $langcode );
+                                       $message = $this->getMsgFromNamespace( "$uckey/$code", $code );
                                }
 
                                if ( $message !== false ) {
-                                       break;
+                                       // Found the message.
+                                       return $message;
                                }
                        }
                }
 
-               # Try the array in the language object
-               if ( $message === false ) {
-                       $message = $requestedLangObj->getMessage( $lckey );
-                       if ( is_null ( $message ) ) {
-                               $message = false;
+               // Now try checking the site language.
+               if ( $useDB ) {
+                       $message = $this->getMsgFromNamespace( $uckey, $wgLanguageCode );
+                       if ( $message !== false ) {
+                               return $message;
                        }
                }
 
-               # If we still have no message, maybe the key was in fact a full key so try that
-               if( $message === false ) {
-                       $parts = explode( '/', $lckey );
-                       # We may get calls for things that are http-urls from sidebar
-                       # Let's not load nonexistent languages for those
-                       # They usually have more than one slash.
-                       if ( count( $parts ) == 2 && $parts[1] !== '' ) {
-                               $message = Language::getMessageFor( $parts[0], $parts[1] );
-                               if ( is_null( $message ) ) {
-                                       $message = false;
-                               }
-                       }
+               $message = $wgContLang->getMessage( $lckey );
+               if ( $message !== null ) {
+                       return $message;
                }
 
-               # Final fallback
-               if( $message === false ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
+               // Finally try the DB for the site language's fallbacks.
+               if ( $useDB ) {
+                       foreach ( $siteFallbackChain as $code ) {
+                               $message = $this->getMsgFromNamespace( "$uckey/$code", $code );
+                               if ( $message === false && $code === $wgLanguageCode ) {
+                                       // Messages created in the content language will not have the /lang extension
+                                       $message = $this->getMsgFromNamespace( $uckey, $code );
+                               }
 
-               # Fix whitespace
-               $message = strtr( $message,
-                       array(
-                               # Fix for trailing whitespace, removed by textarea
-                               '&#32;' => ' ',
-                               # Fix for NBSP, converted to space by firefox
-                               '&nbsp;' => "\xc2\xa0",
-                               '&#160;' => "\xc2\xa0",
-                       ) );
+                               if ( $message !== false ) {
+                                       // Found the message.
+                                       return $message;
+                               }
+                       }
+               }
 
-               wfProfileOut( __METHOD__ );
-               return $message;
+               return false;
        }
 
        /**
         * Get a message from the MediaWiki namespace, with caching. The key must
         * first be converted to two-part lang/msg form if necessary.
         *
-        * @param string $title Message cache key with initial uppercase letter.
-        * @param string $code code denoting the language to try.
+        * Unlike self::get(), this function doesn't resolve fallback chains, and
+        * some callers require this behavior. LanguageConverter::parseCachedTable()
+        * and self::get() are some examples in core.
         *
+        * @param string $title Message cache key with initial uppercase letter.
+        * @param string $code Code denoting the language to try.
         * @return string|bool False on failure
         */
        function getMsgFromNamespace( $title, $code ) {
@@ -742,7 +875,7 @@ class MessageCache {
                                return substr( $entry, 1 );
                        } elseif ( $entry === '!NONEXISTENT' ) {
                                return false;
-                       } elseif( $entry === '!TOO BIG' ) {
+                       } elseif ( $entry === '!TOO BIG' ) {
                                // Fall through and try invididual message cache below
                        }
                } else {
@@ -780,17 +913,24 @@ class MessageCache {
                        $content = $revision->getContent();
                        if ( !$content ) {
                                // A possibly temporary loading failure.
-                               wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$title} ($code)" );
+                               wfDebugLog(
+                                       'MessageCache',
+                                       __METHOD__ . ": failed to load message page text for {$title} ($code)"
+                               );
                                $message = null; // no negative caching
                        } else {
                                // XXX: Is this the right way to turn a Content object into a message?
-                               // NOTE: $content is typically either WikitextContent, JavaScriptContent or CssContent.
-                               //       MessageContent is *not* used for storing messages, it's only used for wrapping them when needed.
+                               // NOTE: $content is typically either WikitextContent, JavaScriptContent or
+                               //       CssContent. MessageContent is *not* used for storing messages, it's
+                               //       only used for wrapping them when needed.
                                $message = $content->getWikitextForTransclusion();
 
                                if ( $message === false || $message === null ) {
-                                       wfDebugLog( 'MessageCache', __METHOD__ . ": message content doesn't provide wikitext "
-                                                               . "(content model: " . $content->getContentHandler() . ")" );
+                                       wfDebugLog(
+                                               'MessageCache',
+                                               __METHOD__ . ": message content doesn't provide wikitext "
+                                                       . "(content model: " . $content->getContentHandler() . ")"
+                                       );
 
                                        $message = false; // negative caching
                                } else {
@@ -811,15 +951,15 @@ class MessageCache {
        }
 
        /**
-        * @param $message string
-        * @param $interface bool
-        * @param $language
-        * @param $title Title
+        * @param string $message
+        * @param bool $interface
+        * @param string $language Language code
+        * @param Title $title
         * @return string
         */
        function transform( $message, $interface = false, $language = null, $title = null ) {
                // Avoid creating parser if nothing to transform
-               if( strpos( $message, '{{' ) === false ) {
+               if ( strpos( $message, '{{' ) === false ) {
                        return $message;
                }
 
@@ -863,14 +1003,16 @@ class MessageCache {
        }
 
        /**
-        * @param $text string
-        * @param $title Title
-        * @param $linestart bool
-        * @param $interface bool
-        * @param $language
+        * @param string $text
+        * @param Title $title
+        * @param bool $linestart Whether or not this is at the start of a line
+        * @param bool $interface Whether this is an interface message
+        * @param string $language Language code
         * @return ParserOutput|string
         */
-       public function parse( $text, $title = null, $linestart = true, $interface = false, $language = null  ) {
+       public function parse( $text, $title = null, $linestart = true,
+               $interface = false, $language = null
+       ) {
                if ( $this->mInParser ) {
                        return htmlspecialchars( $text );
                }
@@ -929,12 +1071,12 @@ class MessageCache {
        public function figureMessage( $key ) {
                global $wgLanguageCode;
                $pieces = explode( '/', $key );
-               if( count( $pieces ) < 2 ) {
+               if ( count( $pieces ) < 2 ) {
                        return array( $key, $wgLanguageCode );
                }
 
                $lang = array_pop( $pieces );
-               if( !Language::fetchLanguageName( $lang, null, 'mw' ) ) {
+               if ( !Language::fetchLanguageName( $lang, null, 'mw' ) ) {
                        return array( $key, $wgLanguageCode );
                }
 
@@ -947,7 +1089,7 @@ class MessageCache {
         * If $code is the content language code, this will return all message keys
         * for which MediaWiki:msgkey exists. If $code is another language code, this
         * will ONLY return message keys for which MediaWiki:msgkey/$code exists.
-        * @param $code string
+        * @param string $code Language code
         * @return array of message keys (strings)
         */
        public function getAllMessageKeys( $code ) {
@@ -957,9 +1099,12 @@ class MessageCache {
                        // Apparently load() failed
                        return null;
                }
-               $cache = $this->mCache[$code]; // Copy the cache
-               unset( $cache['VERSION'] ); // Remove the VERSION key
-               $cache = array_diff( $cache, array( '!NONEXISTENT' ) ); // Remove any !NONEXISTENT keys
+               // Remove administrative keys
+               $cache = $this->mCache[$code];
+               unset( $cache['VERSION'] );
+               unset( $cache['EXPIRY'] );
+               // Remove any !NONEXISTENT keys
+               $cache = array_diff( $cache, array( '!NONEXISTENT' ) );
                // Keys may appear with a capital first letter. lcfirst them.
                return array_map( array( $wgContLang, 'lcfirst' ), array_keys( $cache ) );
        }
index 61f1e8c..2ad7b85 100644 (file)
@@ -29,7 +29,7 @@
 class ResourceFileCache extends FileCacheBase {
        protected $mCacheWorthy;
 
-       /* @TODO: configurable? */
+       /* @todo configurable? */
        const MISS_THRESHOLD = 360; // 6/min * 60 min
 
        /**
index 39bf4c9..dd71801 100644 (file)
@@ -125,7 +125,7 @@ class SquidUpdate {
        static function purge( $urlArr ) {
                global $wgSquidServers, $wgHTCPMulticastRouting;
 
-               if( !$urlArr ) {
+               if ( !$urlArr ) {
                        return;
                }
 
@@ -172,7 +172,7 @@ class SquidUpdate {
                $htcpOpCLR = 4; // HTCP CLR
 
                // @todo FIXME: PHP doesn't support these socket constants (include/linux/in.h)
-               if( !defined( "IPPROTO_IP" ) ) {
+               if ( !defined( "IPPROTO_IP" ) ) {
                        define( "IPPROTO_IP", 0 );
                        define( "IP_MULTICAST_LOOP", 34 );
                        define( "IP_MULTICAST_TTL", 33 );
@@ -183,13 +183,15 @@ class SquidUpdate {
                if ( $conn ) {
                        // Set socket options
                        socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_LOOP, 0 );
-                       if ( $wgHTCPMulticastTTL != 1 )
+                       if ( $wgHTCPMulticastTTL != 1 ) {
                                socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
                                        $wgHTCPMulticastTTL );
+                       }
 
                        $urlArr = array_unique( $urlArr ); // Remove duplicates
                        foreach ( $urlArr as $url ) {
-                               if( !is_string( $url ) ) {
+                               if ( !is_string( $url ) ) {
+                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( 'Bad purge URL' );
                                }
                                $url = SquidUpdate::expand( $url );
@@ -199,6 +201,7 @@ class SquidUpdate {
                                        continue;
                                }
                                if ( !isset( $conf['host'] ) || !isset( $conf['port'] ) ) {
+                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( "Invalid HTCP rule for URL $url\n" );
                                }
 
@@ -219,7 +222,7 @@ class SquidUpdate {
                                // implementation exists, so adapt to Squid
                                $htcpPacket = pack( 'nxxnCxNxxa*n',
                                        $htcpLen, $htcpDataLen, $htcpOpCLR,
-                                       $htcpTransID, $htcpSpecifier, 2);
+                                       $htcpTransID, $htcpSpecifier, 2 );
 
                                // Send out
                                wfDebug( "Purging URL $url via HTCP\n" );
index bfbacfa..63d4141 100644 (file)
@@ -58,6 +58,17 @@ class UserCache {
                        : false; // user does not exist?
        }
 
+       /**
+        * Get the name of a user or return $ip if the user ID is 0
+        *
+        * @param integer $userId
+        * @param string $ip
+        * @since 1.21
+        */
+       public function getUserName( $userId, $ip ) {
+               return $userId > 0 ? $this->getProp( $userId, 'name' ) : $ip;
+       }
+
        /**
         * Preloads user names for given list of users.
         * @param array $userIds List of user IDs
@@ -70,6 +81,8 @@ class UserCache {
                $usersToCheck = array();
                $usersToQuery = array();
 
+               $userIds = array_unique( $userIds );
+
                foreach ( $userIds as $userId ) {
                        $userId = (int)$userId;
                        if ( $userId <= 0 ) {
index 5c7c4f2..da4621a 100644 (file)
  * @since 1.21
  */
 class RedisConnectionPool {
-       // Settings for all connections in this pool
-       protected $connectTimeout; // string; connection timeout
-       protected $persistent; // bool; whether connections persist
-       protected $password; // string; plaintext auth password
-       protected $serializer; // integer; the serializer to use (Redis::SERIALIZER_*)
+       /**
+        * @name Pool settings.
+        * Settings there are shared for any connection made in this pool.
+        * See the singleton() method documentation for more details.
+        * @{
+        */
+       /** @var string Connection timeout in seconds */
+       protected $connectTimeout;
+       /** @var string Plaintext auth password */
+       protected $password;
+       /** @var bool Whether connections persist */
+       protected $persistent;
+       /** @var integer Serializer to use (Redis::SERIALIZER_*) */
+       protected $serializer;
+       /** @} */
 
-       protected $idlePoolSize = 0; // integer; current idle pool size
+       /** @var integer Current idle pool size */
+       protected $idlePoolSize = 0;
 
        /** @var Array (server name => ((connection info array),...) */
        protected $connections = array();
        /** @var Array (server name => UNIX timestamp) */
        protected $downServers = array();
 
-       /** @var Array */
-       protected static $instances = array(); // (pool ID => RedisConnectionPool)
+       /** @var Array (pool ID => RedisConnectionPool) */
+       protected static $instances = array();
 
-       const SERVER_DOWN_TTL = 30; // integer; seconds to cache servers as "down"
+       /** integer; seconds to cache servers as "down". */
+       const SERVER_DOWN_TTL = 30;
 
        /**
-        * $options include:
-        *   - connectTimeout : The timeout for new connections, in seconds.
-        *                      Optional, default is 1 second.
-        *   - persistent     : Set this to true to allow connections to persist across
-        *                      multiple web requests. False by default.
-        *   - password       : The authentication password, will be sent to Redis in clear text.
-        *                      Optional, if it is unspecified, no AUTH command will be sent.
-        *   - serializer     : Set to "php", "igbinary", or "none". Default is "php".
         * @param array $options
         */
        protected function __construct( array $options ) {
                if ( !extension_loaded( 'redis' ) ) {
-                       throw new MWException( __CLASS__. ' requires the phpredis extension: ' .
+                       throw new MWException( __CLASS__ . ' requires the phpredis extension: ' .
                                'https://github.com/nicolasff/phpredis' );
                }
                $this->connectTimeout = $options['connectTimeout'];
@@ -103,6 +107,14 @@ class RedisConnectionPool {
 
        /**
         * @param $options Array
+        * $options include:
+        *   - connectTimeout : The timeout for new connections, in seconds.
+        *                      Optional, default is 1 second.
+        *   - persistent     : Set this to true to allow connections to persist across
+        *                      multiple web requests. False by default.
+        *   - password       : The authentication password, will be sent to Redis in clear text.
+        *                      Optional, if it is unspecified, no AUTH command will be sent.
+        *   - serializer     : Set to "php", "igbinary", or "none". Default is "php".
         * @return RedisConnectionPool
         */
        public static function singleton( array $options ) {
@@ -164,7 +176,7 @@ class RedisConnectionPool {
                        // TCP connection
                        $hostPort = IP::splitHostAndPort( $server );
                        if ( !$hostPort ) {
-                               throw new MWException( __CLASS__.": invalid configured server \"$server\"" );
+                               throw new MWException( __CLASS__ . ": invalid configured server \"$server\"" );
                        }
                        list( $host, $port ) = $hostPort;
                        if ( $port === false ) {
@@ -302,6 +314,38 @@ class RedisConnRef {
                return call_user_func_array( array( $this->conn, $name ), $arguments );
        }
 
+       /**
+        * @param string $script
+        * @param array $params
+        * @param integer $numKeys
+        * @return mixed
+        * @throws RedisException
+        */
+       public function luaEval( $script, array $params, $numKeys ) {
+               $sha1 = sha1( $script ); // 40 char hex
+               $conn = $this->conn; // convenience
+
+               // Try to run the server-side cached copy of the script
+               $conn->clearLastError();
+               $res = $conn->evalSha( $sha1, $params, $numKeys );
+               // If the script is not in cache, use eval() to retry and cache it
+               if ( preg_match( '/^NOSCRIPT/', $conn->getLastError() ) ) {
+                       $conn->clearLastError();
+                       $res = $conn->eval( $script, $params, $numKeys );
+                       wfDebugLog( 'redis', "Used eval() for Lua script $sha1." );
+               }
+
+               if ( $conn->getLastError() ) { // script bug?
+                       wfDebugLog( 'redis', "Lua script error: " . $conn->getLastError() );
+               }
+
+               return $res;
+       }
+
+       /**
+        * @param RedisConnRef $conn
+        * @return bool
+        */
        public function isConnIdentical( Redis $conn ) {
                return $this->conn === $conn;
        }
index 137efb8..8c6e24a 100644 (file)
@@ -441,4 +441,57 @@ abstract class AbstractContent implements Content {
                wfRunHooks( 'ConvertContent', array( $this, $toModel, $lossy, &$result ) );
                return $result;
        }
+
+       /**
+        * Returns a ParserOutput object, filled by a call to fillParserOutput().
+        * Subclasses that want to control the parser output may override this, or
+        * they can override fillParserOutput(). If they override getParserOutput(),
+        * itself, they should take care to call the ContentGetParserOutput hook.
+        *
+        * @param $title Title Context title for parsing
+        * @param $revId int|null Revision ID (for {{REVISIONID}})
+        * @param $options ParserOptions|null Parser options
+        * @param $generateHtml bool Whether or not to generate HTML
+        *
+        * @return ParserOutput representing the HTML form of the text
+        */
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
+               # Generic implementation, relying on $this->getHtml()
+
+               if ( $options === null ) {
+                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+               }
+
+               $po = new ParserOutput();
+
+               if ( wfRunHooks( 'ContentGetParserOutput',
+                       array( $this, $title, $revId, $options, $generateHtml, &$po ) ) ) {
+
+                       $this->fillParserOutput( $title, $revId, $options, $generateHtml, $po );
+               }
+
+               return $po;
+       }
+
+       /**
+        * Fills the provided ParserOutput object with the HTML returned by getHtml().
+        * Subclasses should override this (or getParserOutput) appropriately.
+        * This placeholder implementation always throws an exception.
+        *
+        * @param $title        Title Context title for parsing
+        * @param $revId        int|null Revision ID (for {{REVISIONID}})
+        * @param $options      ParserOptions|null Parser options
+        * @param $generateHtml bool Whether or not to generate HTML
+        * @param &$output      ParserOutput The output object to fill (reference).
+        *
+        * @throws MWException
+        */
+       protected function fillParserOutput( Title $title, $revId,
+               ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
+               // Don't make abstract, so subclasses that override getParserOutput() directly don't fail.
+               throw new MWException( 'Subclasses of AbstractContent must override fillParserOutput!' );
+       }
 }
index 72729b0..5a90e09 100644 (file)
@@ -40,8 +40,8 @@ interface Content {
         *   building a full text search index. If no useful representation exists,
         *   this method returns an empty string.
         *
-        * @todo: test that this actually works
-        * @todo: make sure this also works with LuceneSearch / WikiSearch
+        * @todo Test that this actually works
+        * @todo Make sure this also works with LuceneSearch / WikiSearch
         */
        public function getTextForSearchIndex();
 
@@ -51,11 +51,11 @@ interface Content {
         * @return string|false The wikitext to include when another page includes this
         * content, or false if the content is not includable in a wikitext page.
         *
-        * @todo allow native handling, bypassing wikitext representation, like
-        *    for includable special pages.
-        * @todo allow transclusion into other content models than Wikitext!
-        * @todo used in WikiPage and MessageCache to get message text. Not so
-        *    nice. What should we use instead?!
+        * @todo Allow native handling, bypassing wikitext representation, like
+        *  for includable special pages.
+        * @todo Allow transclusion into other content models than Wikitext!
+        * @todo Used in WikiPage and MessageCache to get message text. Not so
+        *  nice. What should we use instead?!
         */
        public function getWikitextForTransclusion();
 
index 9c20195..dcd33bc 100644 (file)
@@ -1060,7 +1060,7 @@ abstract class ContentHandler {
                                        if ( isset( $handler[1] ) ) {
                                                $info .= '::' . $handler[1];
                                        }
-                               } else if ( is_object( $handler ) ) {
+                               } elseif ( is_object( $handler ) ) {
                                        $info = get_class( $handler[0] );
                                        $info .= '::on' . $event;
                                } else {
@@ -1086,8 +1086,8 @@ abstract class ContentHandler {
                                $contentObjects[$k] = $v;
 
                                $v = $v->serialize();
-                               $contentTexts[ $k ] = $v;
-                               $args[ $k ] = $v;
+                               $contentTexts[$k] = $v;
+                               $args[$k] = $v;
                        }
                }
 
@@ -1098,7 +1098,7 @@ abstract class ContentHandler {
                foreach ( $contentTexts as $k => $orig ) {
                        /* @var Content $content */
 
-                       $modified = $args[ $k ];
+                       $modified = $args[$k];
                        $content = $contentObjects[$k];
 
                        if ( $modified !== $orig ) {
@@ -1106,7 +1106,7 @@ abstract class ContentHandler {
                                $content = $content->getContentHandler()->unserializeContent( $modified );
                        }
 
-                       $args[ $k ] = $content;
+                       $args[$k] = $content;
                }
 
                return $ok;
index 569d122..a25bd76 100644 (file)
@@ -46,7 +46,7 @@ class CssContent extends TextContent {
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
                global $wgParser;
-               // @todo: make pre-save transformation optional for script pages
+               // @todo Make pre-save transformation optional for script pages
 
                $text = $this->getNativeData();
                $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
@@ -57,7 +57,7 @@ class CssContent extends TextContent {
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n";
-               $html .= $this->getHighlightHtml();
+               $html .= htmlspecialchars( $this->getNativeData() );
                $html .= "\n</pre>\n";
 
                return $html;
index 9cd947f..247de6d 100644 (file)
@@ -46,7 +46,7 @@ class JavaScriptContent extends TextContent {
         */
        public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
                global $wgParser;
-               // @todo: make pre-save transformation optional for script pages
+               // @todo Make pre-save transformation optional for script pages
                // See bug #32858
 
                $text = $this->getNativeData();
@@ -58,7 +58,7 @@ class JavaScriptContent extends TextContent {
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-js\" dir=\"ltr\">\n";
-               $html .= $this->getHighlightHtml();
+               $html .= htmlspecialchars( $this->getNativeData() );
                $html .= "\n</pre>\n";
 
                return $html;
index 8fafcb6..a6ee7b0 100644 (file)
@@ -171,7 +171,7 @@ class TextContent extends AbstractContent {
 
                $this->checkModelID( $that->getModel() );
 
-               # @todo: could implement this in DifferenceEngine and just delegate here?
+               // @todo could implement this in DifferenceEngine and just delegate here?
 
                if ( !$lang ) {
                        $lang = $wgContLang;
@@ -189,32 +189,27 @@ class TextContent extends AbstractContent {
        }
 
        /**
-        * Returns a generic ParserOutput object, wrapping the HTML returned by
-        * getHtml().
+        * Fills the provided ParserOutput object with the HTML returned by getHtml().
+        *
+        * Content models in $wgTextModelsToParse will be parsed as wikitext to process links,
+        * magic words, etc.
+        *
+        * Subclasses may override this to provide custom rendering.
         *
         * @param $title Title Context title for parsing
         * @param int|null $revId Revision ID (for {{REVISIONID}})
         * @param $options ParserOptions|null Parser options
         * @param bool $generateHtml Whether or not to generate HTML
-        *
-        * @return ParserOutput representing the HTML form of the text
+        * @param $output ParserOutput The output object to fill (reference).
         */
-       public function getParserOutput( Title $title,
-               $revId = null,
-               ParserOptions $options = null, $generateHtml = true
+       protected function fillParserOutput( Title $title, $revId,
+               ParserOptions $options, $generateHtml, ParserOutput &$output
        ) {
                global $wgParser, $wgTextModelsToParse;
 
-               if ( !$options ) {
-                       //NOTE: use canonical options per default to produce cacheable output
-                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
-               }
-
                if ( in_array( $this->getModel(), $wgTextModelsToParse ) ) {
-                       // parse just to get links etc into the database
-                       $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
-               } else {
-                       $po = new ParserOutput();
+                       // parse just to get links etc into the database, HTML is replaced below.
+                       $output = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
                }
 
                if ( $generateHtml ) {
@@ -223,34 +218,25 @@ class TextContent extends AbstractContent {
                        $html = '';
                }
 
-               $po->setText( $html );
-               return $po;
+               $output->setText( $html );
        }
 
        /**
         * Generates an HTML version of the content, for display. Used by
         * getParserOutput() to construct a ParserOutput object.
         *
-        * This default implementation just calls getHighlightHtml(). Content
-        * models that have another mapping to HTML (as is the case for markup
-        * languages like wikitext) should override this method to generate the
-        * appropriate HTML.
+        * This default implementation runs the text returned by $this->getNativeData()
+        * through htmlspecialchars and tried to convert line breaks and indentation to HTML..
         *
         * @return string An HTML representation of the content
         */
-       protected function getHtml() {
-               return $this->getHighlightHtml();
-       }
-
-       /**
-        * Generates a syntax-highlighted version of the content, as HTML.
-        * Used by the default implementation of getHtml().
-        *
-        * @return string an HTML representation of the content's markup
-        */
-       protected function getHighlightHtml() {
-               # TODO: make Highlighter interface, use highlighter here, if available
-               return htmlspecialchars( $this->getNativeData() );
+       public static function convertWhiteSpaceToHTML( $msg ) {
+               $msg = htmlspecialchars( $msg );
+               $msg = preg_replace( '/^ /m', '&#160;', $msg );
+               $msg = preg_replace( '/ $/m', '&#160;', $msg );
+               $msg = preg_replace( '/  /', '&#160; ', $msg );
+               $msg = str_replace( "\n", '<br />', $msg );
+               return $msg;
        }
 
        /**
index 8be4eba..d821d9d 100644 (file)
@@ -61,7 +61,8 @@ class WikitextContent extends TextContent {
                $myModelId = $this->getModel();
                $sectionModelId = $with->getModel();
 
-               if ( $sectionModelId != $myModelId  ) {
+               if ( $sectionModelId != $myModelId ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Incompatible content model for section: " .
                                "document uses $myModelId but " .
                                "section uses $sectionModelId." );
@@ -276,28 +277,21 @@ class WikitextContent extends TextContent {
         * using $wgParser.
         *
         * @since    1.21
+        * @see AbstractContent::fillParserOutput().
         *
         * @param $title Title
         * @param int $revId Revision to pass to the parser (default: null)
         * @param $options ParserOptions (default: null)
         * @param bool $generateHtml (default: false)
-        *
-        * @internal param \IContextSource|null $context
-        * @return ParserOutput representing the HTML form of the text
+        * @param &$output ParserOutput representing the HTML form of the text,
+        *           may be manipulated or replaced.
         */
-       public function getParserOutput( Title $title,
-               $revId = null,
-               ParserOptions $options = null, $generateHtml = true
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output
        ) {
                global $wgParser;
 
-               if ( !$options ) {
-                       //NOTE: use canonical options per default to produce cacheable output
-                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
-               }
-
-               $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
-               return $po;
+               $output = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
        }
 
        protected function getHtml() {
index 33f51cb..e13cfa8 100644 (file)
@@ -125,7 +125,7 @@ abstract class ContextSource implements IContextSource {
        /**
         * Get the Language object
         *
-        * @deprecated 1.19 Use getLanguage instead
+        * @deprecated since 1.19 Use getLanguage instead
         * @return Language
         */
        public function getLang() {
index b9a7006..eda56a7 100644 (file)
@@ -209,7 +209,7 @@ class DerivativeContext extends ContextSource {
        /**
         * Set the Language object
         *
-        * @deprecated 1.19 Use setLanguage instead
+        * @deprecated since 1.19 Use setLanguage instead
         * @param Language|string $l Language instance or language code
         */
        public function setLang( $l ) {
@@ -237,7 +237,7 @@ class DerivativeContext extends ContextSource {
        }
 
        /**
-        * @deprecated 1.19 Use getLanguage instead
+        * @deprecated since 1.19 Use getLanguage instead
         * @return Language
         */
        public function getLang() {
index c7b221b..35d5aed 100644 (file)
@@ -79,7 +79,7 @@ interface IContextSource {
        /**
         * Get the Language object
         *
-        * @deprecated 1.19 Use getLanguage instead
+        * @deprecated since 1.19 Use getLanguage instead
         * @return Language
         */
        public function getLang();
index 6aefc98..cb26dcf 100644 (file)
@@ -233,7 +233,7 @@ class RequestContext implements IContextSource {
        /**
         * Set the Language object
         *
-        * @deprecated 1.19 Use setLanguage instead
+        * @deprecated since 1.19 Use setLanguage instead
         * @param Language|string $l Language instance or language code
         */
        public function setLang( $l ) {
@@ -261,7 +261,7 @@ class RequestContext implements IContextSource {
        }
 
        /**
-        * @deprecated 1.19 Use getLanguage instead
+        * @deprecated since 1.19 Use getLanguage instead
         * @return Language
         */
        public function getLang() {
@@ -401,10 +401,10 @@ class RequestContext implements IContextSource {
         */
        public function exportSession() {
                return array(
-                       'ip'        => $this->getRequest()->getIP(),
-                       'headers'   => $this->getRequest()->getAllHeaders(),
+                       'ip' => $this->getRequest()->getIP(),
+                       'headers' => $this->getRequest()->getAllHeaders(),
                        'sessionId' => session_id(),
-                       'userId'    => $this->getUser()->getId()
+                       'userId' => $this->getUser()->getId()
                );
        }
 
diff --git a/includes/db/ChronologyProtector.php b/includes/db/ChronologyProtector.php
new file mode 100644 (file)
index 0000000..de5e72c
--- /dev/null
@@ -0,0 +1,106 @@
+<?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
+ */
+
+/**
+ * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
+ * Kind of like Hawking's [[Chronology Protection Agency]].
+ */
+class ChronologyProtector {
+       /** @var Array (DB master name => position) */
+       protected $startupPositions = array();
+       /** @var Array (DB master name => position) */
+       protected $shutdownPositions = array();
+
+       protected $initialized = false; // bool; whether the session data was loaded
+
+       /**
+        * Initialise a LoadBalancer to give it appropriate chronology protection.
+        *
+        * If the session has a previous master position recorded, this will try to
+        * make sure that the next query to a slave of that master will see changes up
+        * to that position by delaying execution. The delay may timeout and allow stale
+        * data if no non-lagged slaves are available.
+        *
+        * @param $lb LoadBalancer
+        * @return void
+        */
+       public function initLB( LoadBalancer $lb ) {
+               if ( $lb->getServerCount() <= 1 ) {
+                       return; // non-replicated setup
+               }
+               if ( !$this->initialized ) {
+                       $this->initialized = true;
+                       if ( isset( $_SESSION[__CLASS__] ) && is_array( $_SESSION[__CLASS__] ) ) {
+                               $this->startupPositions = $_SESSION[__CLASS__];
+                       }
+               }
+               $masterName = $lb->getServerName( 0 );
+               if ( !empty( $this->startupPositions[$masterName] ) ) {
+                       $info = $lb->parentInfo();
+                       $pos = $this->startupPositions[$masterName];
+                       wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
+                       $lb->waitFor( $pos );
+               }
+       }
+
+       /**
+        * Notify the ChronologyProtector that the LoadBalancer is about to shut
+        * down. Saves replication positions.
+        *
+        * @param $lb LoadBalancer
+        * @return void
+        */
+       public function shutdownLB( LoadBalancer $lb ) {
+               if ( session_id() == '' || $lb->getServerCount() <= 1 ) {
+                       return; // don't start a session; don't bother with non-replicated setups
+               }
+               $masterName = $lb->getServerName( 0 );
+               if ( isset( $this->shutdownPositions[$masterName] ) ) {
+                       return; // already done
+               }
+               // Only save the position if writes have been done on the connection
+               $db = $lb->getAnyOpenConnection( 0 );
+               $info = $lb->parentInfo();
+               if ( !$db || !$db->doneWrites() ) {
+                       wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
+                       return;
+               }
+               $pos = $db->getMasterPos();
+               wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
+               $this->shutdownPositions[$masterName] = $pos;
+       }
+
+       /**
+        * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now.
+        * May commit chronology data to persistent storage.
+        *
+        * @return void
+        */
+       public function shutdown() {
+               if ( session_id() != '' && count( $this->shutdownPositions ) ) {
+                       wfDebug( __METHOD__ . ": saving master pos for " .
+                               count( $this->shutdownPositions ) . " master(s)\n" );
+                       $_SESSION[__CLASS__] = $this->shutdownPositions;
+               }
+       }
+}
index 4e44374..819925c 100644 (file)
@@ -87,7 +87,7 @@ class CloneDatabase {
         * Clone the table structure
         */
        public function cloneTableStructure() {
-               foreach( $this->tablesToClone as $tbl ) {
+               foreach ( $this->tablesToClone as $tbl ) {
                        # Clean up from previous aborted run.  So that table escaping
                        # works correctly across DB engines, we need to change the pre-
                        # fix back and forth so tableName() works right.
@@ -98,7 +98,7 @@ class CloneDatabase {
                        self::changePrefix( $this->newTablePrefix );
                        $newTableName = $this->db->tableName( $tbl, 'raw' );
 
-                       if( $this->dropCurrentTables && !in_array( $this->db->getType(), array( 'postgres', 'oracle' ) ) ) {
+                       if ( $this->dropCurrentTables && !in_array( $this->db->getType(), array( 'postgres', 'oracle' ) ) ) {
                                $this->db->dropTable( $tbl, __METHOD__ );
                                wfDebug( __METHOD__ . " dropping {$newTableName}\n", true );
                                //Dropping the oldTable because the prefix was changed
@@ -115,9 +115,9 @@ class CloneDatabase {
         * @param bool $dropTables Optionally drop the tables we created
         */
        public function destroy( $dropTables = false ) {
-               if( $dropTables ) {
+               if ( $dropTables ) {
                        self::changePrefix( $this->newTablePrefix );
-                       foreach( $this->tablesToClone as $tbl ) {
+                       foreach ( $this->tablesToClone as $tbl ) {
                                $this->db->dropTable( $tbl );
                        }
                }
@@ -127,7 +127,7 @@ class CloneDatabase {
        /**
         * Change the table prefix on all open DB connections/
         *
-        * @param  $prefix
+        * @param $prefix
         * @return void
         */
        public static function changePrefix( $prefix ) {
@@ -137,8 +137,8 @@ class CloneDatabase {
        }
 
        /**
-        * @param  $lb LoadBalancer
-        * @param  $prefix
+        * @param $lb LoadBalancer
+        * @param $prefix
         * @return void
         */
        public static function changeLBPrefix( $lb, $prefix ) {
@@ -146,8 +146,8 @@ class CloneDatabase {
        }
 
        /**
-        * @param  $db DatabaseBase
-        * @param  $prefix
+        * @param $db DatabaseBase
+        * @param $prefix
         * @return void
         */
        public static function changeDBPrefix( $db, $prefix ) {
index 65a74ab..4b2eae7 100644 (file)
  * @ingroup Database
  */
 
-/** Number of times to re-try an operation in case of deadlock */
-define( 'DEADLOCK_TRIES', 4 );
-/** Minimum time to wait before retry, in microseconds */
-define( 'DEADLOCK_DELAY_MIN', 500000 );
-/** Maximum time to wait before retry */
-define( 'DEADLOCK_DELAY_MAX', 1500000 );
-
 /**
  * Base interface for all DBMS-specific code. At a bare minimum, all of the
  * following must be implemented to support MediaWiki
@@ -165,7 +158,7 @@ interface DatabaseType {
         * @param string $fname Calling function name
         * @return Mixed: Database-specific index description class or false if the index does not exist
         */
-       function indexInfo( $table, $index, $fname = 'Database::indexInfo' );
+       function indexInfo( $table, $index, $fname = __METHOD__ );
 
        /**
         * Get the number of rows affected by the last write query
@@ -191,7 +184,7 @@ interface DatabaseType {
         *
         * @return string: wikitext of a link to the server software's web site
         */
-       static function getSoftwareLink();
+       function getSoftwareLink();
 
        /**
         * A string describing the current software version, like from
@@ -216,6 +209,12 @@ interface DatabaseType {
  * @ingroup Database
  */
 abstract class DatabaseBase implements DatabaseType {
+       /** Number of times to re-try an operation in case of deadlock */
+       const DEADLOCK_TRIES = 4;
+       /** Minimum time to wait before retry, in microseconds */
+       const DEADLOCK_DELAY_MIN = 500000;
+       /** Maximum time to wait before retry */
+       const DEADLOCK_DELAY_MAX = 1500000;
 
 # ------------------------------------------------------------------------------
 # Variables
@@ -230,11 +229,10 @@ abstract class DatabaseBase implements DatabaseType {
        protected $mConn = null;
        protected $mOpened = false;
 
-       /**
-        * @since 1.20
-        * @var array of Closure
-        */
+       /** @var callable[] */
        protected $mTrxIdleCallbacks = array();
+       /** @var callable[] */
+       protected $mTrxPreCommitCallbacks = array();
 
        protected $mTablePrefix;
        protected $mFlags;
@@ -553,12 +551,14 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * Returns true if there is a transaction open with possible write
-        * queries or transaction idle callbacks waiting on it to finish.
+        * queries or transaction pre-commit/idle callbacks waiting on it to finish.
         *
         * @return bool
         */
        public function writesOrCallbacksPending() {
-               return $this->mTrxLevel && ( $this->mTrxDoneWrites || $this->mTrxIdleCallbacks );
+               return $this->mTrxLevel && (
+                       $this->mTrxDoneWrites || $this->mTrxIdleCallbacks || $this->mTrxPreCommitCallbacks
+               );
        }
 
        /**
@@ -584,7 +584,7 @@ abstract class DatabaseBase implements DatabaseType {
        public function setFlag( $flag ) {
                global $wgDebugDBTransactions;
                $this->mFlags |= $flag;
-               if ( ( $flag & DBO_TRX) & $wgDebugDBTransactions ) {
+               if ( ( $flag & DBO_TRX ) & $wgDebugDBTransactions ) {
                        wfDebug( "Implicit transactions are now  disabled.\n" );
                }
        }
@@ -714,7 +714,6 @@ abstract class DatabaseBase implements DatabaseType {
         * an extension, et cetera). Do not use this to connect to the MediaWiki
         * database. Example uses in core:
         * @see LoadBalancer::reallyOpenConnection()
-        * @see ExternalUser_MediaWiki::initFromCond()
         * @see ForeignDBRepo::getMasterDB()
         * @see WebInstaller_DBConnect::execute()
         *
@@ -732,7 +731,7 @@ abstract class DatabaseBase implements DatabaseType {
                $dbType = strtolower( $dbType );
                $class = 'Database' . ucfirst( $dbType );
 
-               if( in_array( $dbType, $canonicalDBTypes ) || ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) ) {
+               if ( in_array( $dbType, $canonicalDBTypes ) || ( class_exists( $class ) && is_subclass_of( $class, 'DatabaseBase' ) ) ) {
                        return new $class(
                                isset( $p['host'] ) ? $p['host'] : false,
                                isset( $p['user'] ) ? $p['user'] : false,
@@ -772,8 +771,9 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * @param $errno
         * @param $errstr
+        * @access private
         */
-       protected function connectionErrorHandler( $errno, $errstr ) {
+       public function connectionErrorHandler( $errno, $errstr ) {
                $this->mPHPError = $errstr;
        }
 
@@ -870,7 +870,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @return boolean|ResultWrapper. true for a successful write query, ResultWrapper object
         *     for a successful read query, or false on failure if $tempIgnore set
         */
-       public function query( $sql, $fname = '', $tempIgnore = false ) {
+       public function query( $sql, $fname = __METHOD__, $tempIgnore = false ) {
                $isMaster = !is_null( $this->getLBInfo( 'master' ) );
                if ( !Profiler::instance()->isStub() ) {
                        # generalizeSQL will probably cut down the query to reasonable
@@ -945,10 +945,6 @@ abstract class DatabaseBase implements DatabaseType {
                        wfDebug( "Query {$this->mDBname} ($cnt) ($master): $sqlx\n" );
                }
 
-               if ( istainted( $sql ) & TC_MYSQL ) {
-                       throw new MWException( 'Tainted query found' );
-               }
-
                $queryId = MWDebug::query( $sql, $fname, $isMaster );
 
                # Do the query and handle errors
@@ -961,6 +957,7 @@ abstract class DatabaseBase implements DatabaseType {
                        # Transaction is gone, like it or not
                        $this->mTrxLevel = 0;
                        $this->mTrxIdleCallbacks = array(); // cancel
+                       $this->mTrxPreCommitCallbacks = array(); // cancel
                        wfDebug( "Connection lost, reconnecting...\n" );
 
                        if ( $this->ping() ) {
@@ -1091,17 +1088,22 @@ abstract class DatabaseBase implements DatabaseType {
         * @return String
         */
        protected function fillPreparedArg( $matches ) {
-               switch( $matches[1] ) {
-                       case '\\?': return '?';
-                       case '\\!': return '!';
-                       case '\\&': return '&';
+               switch ( $matches[1] ) {
+                       case '\\?':
+                               return '?';
+                       case '\\!':
+                               return '!';
+                       case '\\&':
+                               return '&';
                }
 
                list( /* $n */, $arg ) = each( $this->preparedArgs );
 
-               switch( $matches[1] ) {
-                       case '?': return $this->addQuotes( $arg );
-                       case '!': return $arg;
+               switch ( $matches[1] ) {
+                       case '?':
+                               return $this->addQuotes( $arg );
+                       case '!':
+                               return $arg;
                        case '&':
                                # return $this->addQuotes( file_get_contents( $arg ) );
                                throw new DBUnexpectedError( $this, '& mode is not implemented. If it\'s really needed, uncomment the line above.' );
@@ -1117,7 +1119,8 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $res Mixed: A SQL result
         */
-       public function freeResult( $res ) {}
+       public function freeResult( $res ) {
+       }
 
        /**
         * A SELECT wrapper which returns a single field from a single result row.
@@ -1136,9 +1139,9 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool|mixed The value from the field, or false on failure.
         */
-       public function selectField( $table, $var, $cond = '', $fname = 'DatabaseBase::selectField',
-               $options = array() )
-       {
+       public function selectField( $table, $var, $cond = '', $fname = __METHOD__,
+               $options = array()
+       {
                if ( !is_array( $options ) ) {
                        $options = array( $options );
                }
@@ -1427,7 +1430,7 @@ abstract class DatabaseBase implements DatabaseType {
         *   DBQueryError exception will be thrown, except if the "ignore errors"
         *   option was set, in which case false will be returned.
         */
-       public function select( $table, $vars, $conds = '', $fname = 'DatabaseBase::select',
+       public function select( $table, $vars, $conds = '', $fname = __METHOD__,
                $options = array(), $join_conds = array() ) {
                $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
 
@@ -1450,7 +1453,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @return string SQL query string.
         * @see DatabaseBase::select()
         */
-       public function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseBase::select',
+       public function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__,
                $options = array(), $join_conds = array() )
        {
                if ( is_array( $vars ) ) {
@@ -1517,7 +1520,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return object|bool
         */
-       public function selectRow( $table, $vars, $conds, $fname = 'DatabaseBase::selectRow',
+       public function selectRow( $table, $vars, $conds, $fname = __METHOD__,
                $options = array(), $join_conds = array() )
        {
                $options = (array)$options;
@@ -1558,7 +1561,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @return Integer: row count
         */
        public function estimateRowCount( $table, $vars = '*', $conds = '',
-               $fname = 'DatabaseBase::estimateRowCount', $options = array() )
+               $fname = __METHOD__, $options = array() )
        {
                $rows = 0;
                $res = $this->select( $table, array( 'rowcount' => 'COUNT(*)' ), $conds, $fname, $options );
@@ -1582,19 +1585,19 @@ abstract class DatabaseBase implements DatabaseType {
        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);
+               # $sql = preg_replace( "/'([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\"/", "'X'", $sql );
 
-               $sql = str_replace ( "\\\\", '', $sql );
-               $sql = str_replace ( "\\'", '', $sql );
-               $sql = str_replace ( "\\\"", '', $sql );
-               $sql = preg_replace ( "/'.*'/s", "'X'", $sql );
-               $sql = preg_replace ( '/".*"/s', "'X'", $sql );
+               $sql = str_replace( "\\\\", '', $sql );
+               $sql = str_replace( "\\'", '', $sql );
+               $sql = str_replace( "\\\"", '', $sql );
+               $sql = preg_replace( "/'.*'/s", "'X'", $sql );
+               $sql = preg_replace( '/".*"/s', "'X'", $sql );
 
                # All newlines, tabs, etc replaced by single space
-               $sql = preg_replace ( '/\s+/', ' ', $sql );
+               $sql = preg_replace( '/\s+/', ' ', $sql );
 
                # All numbers => N
-               $sql = preg_replace ( '/-?[0-9]+/s', 'N', $sql );
+               $sql = preg_replace( '/-?[0-9]+/s', 'N', $sql );
 
                return $sql;
        }
@@ -1607,7 +1610,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param string $fname calling function name (optional)
         * @return Boolean: whether $table has filed $field
         */
-       public function fieldExists( $table, $field, $fname = 'DatabaseBase::fieldExists' ) {
+       public function fieldExists( $table, $field, $fname = __METHOD__ ) {
                $info = $this->fieldInfo( $table, $field );
 
                return (bool)$info;
@@ -1624,8 +1627,8 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool|null
         */
-       public function indexExists( $table, $index, $fname = 'DatabaseBase::indexExists' ) {
-               if( !$this->tableExists( $table ) ) {
+       public function indexExists( $table, $index, $fname = __METHOD__ ) {
+               if ( !$this->tableExists( $table ) ) {
                        return null;
                }
 
@@ -1729,7 +1732,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @return bool
         */
-       public function insert( $table, $a, $fname = 'DatabaseBase::insert', $options = array() ) {
+       public function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
                # No rows to insert, easy just return now
                if ( !count( $a ) ) {
                        return true;
@@ -1828,7 +1831,7 @@ abstract class DatabaseBase implements DatabaseType {
         *                   - LOW_PRIORITY: MySQL-specific, see MySQL manual.
         * @return Boolean
         */
-       function update( $table, $values, $conds, $fname = 'DatabaseBase::update', $options = array() ) {
+       function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
                $table = $this->tableName( $table );
                $opts = $this->makeUpdateOptions( $options );
                $sql = "UPDATE $opts $table SET " . $this->makeList( $values, LIST_SET );
@@ -2274,9 +2277,9 @@ abstract class DatabaseBase implements DatabaseType {
        protected function indexName( $index ) {
                // Backwards-compatibility hack
                $renamed = array(
-                       'ar_usertext_timestamp' => 'usertext_timestamp',
-                       'un_user_id'            => 'user_id',
-                       'un_user_ip'            => 'user_ip',
+                       'ar_usertext_timestamp' => 'usertext_timestamp',
+                       'un_user_id' => 'user_id',
+                       'un_user_ip' => 'user_ip',
                );
 
                if ( isset( $renamed[$index] ) ) {
@@ -2445,7 +2448,7 @@ abstract class DatabaseBase implements DatabaseType {
         *    a field name or an array of field names
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         */
-       public function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseBase::replace' ) {
+       public function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
                $quotedTable = $this->tableName( $table );
 
                if ( count( $rows ) == 0 ) {
@@ -2457,7 +2460,7 @@ abstract class DatabaseBase implements DatabaseType {
                        $rows = array( $rows );
                }
 
-               foreach( $rows as $row ) {
+               foreach ( $rows as $row ) {
                        # Delete rows which collide
                        if ( $uniqueIndexes ) {
                                $sql = "DELETE FROM $quotedTable WHERE ";
@@ -2488,7 +2491,7 @@ abstract class DatabaseBase implements DatabaseType {
                        }
 
                        # Now insert the row
-                       $this->insert( $table, $row );
+                       $this->insert( $table, $row, $fname );
                }
        }
 
@@ -2526,6 +2529,92 @@ abstract class DatabaseBase implements DatabaseType {
                return $this->query( $sql, $fname );
        }
 
+       /**
+        * INSERT ON DUPLICATE KEY UPDATE wrapper, upserts an array into a table.
+        *
+        * This updates any conflicting rows (according to the unique indexes) using
+        * the provided SET clause and inserts any remaining (non-conflicted) rows.
+        *
+        * $rows may be either:
+        *   - A single associative array. The array keys are the field names, and
+        *     the values are the values to insert. The values are treated as data
+        *     and will be quoted appropriately. If NULL is inserted, this will be
+        *     converted to a database NULL.
+        *   - An array with numeric keys, holding a list of associative arrays.
+        *     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.
+        *
+        * It may be more efficient to leave off unique indexes which are unlikely
+        * to collide. However if you do this, you run the risk of encountering
+        * errors which wouldn't have occurred in MySQL.
+        *
+        * Usually throws a DBQueryError on failure. If errors are explicitly ignored,
+        * returns success.
+        *
+        * @param string $table Table name. This will be passed through DatabaseBase::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().
+        * @param string $fname Calling function name (use __METHOD__) for logs/profiling
+        * @param array $options of options
+        *
+        * @return bool
+        * @since 1.22
+        */
+       public function upsert(
+               $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+       ) {
+               if ( !count( $rows ) ) {
+                       return true; // nothing to do
+               }
+               $rows = is_array( reset( $rows ) ) ? $rows : array( $rows );
+
+               if ( count( $uniqueIndexes ) ) {
+                       $clauses = array(); // list WHERE clauses that each identify a single row
+                       foreach ( $rows as $row ) {
+                               foreach ( $uniqueIndexes as $index ) {
+                                       $index = is_array( $index ) ? $index : array( $index ); // columns
+                                       $rowKey = array(); // unique key to this row
+                                       foreach ( $index as $column ) {
+                                               $rowKey[$column] = $row[$column];
+                                       }
+                                       $clauses[] = $this->makeList( $rowKey, LIST_AND );
+                               }
+                       }
+                       $where = array( $this->makeList( $clauses, LIST_OR ) );
+               } else {
+                       $where = false;
+               }
+
+               $useTrx = !$this->mTrxLevel;
+               if ( $useTrx ) {
+                       $this->begin( $fname );
+               }
+               try {
+                       # Update any existing conflicting row(s)
+                       if ( $where !== false ) {
+                               $ok = $this->update( $table, $set, $where, $fname );
+                       } else {
+                               $ok = true;
+                       }
+                       # Now insert any non-conflicting row(s)
+                       $ok = $this->insert( $table, $rows, $fname, array( 'IGNORE' ) ) && $ok;
+               } catch ( Exception $e ) {
+                       if ( $useTrx ) {
+                               $this->rollback( $fname );
+                       }
+                       throw $e;
+               }
+               if ( $useTrx ) {
+                       $this->commit( $fname );
+               }
+
+               return $ok;
+       }
+
        /**
         * DELETE where the condition is a join.
         *
@@ -2548,7 +2637,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @throws DBUnexpectedError
         */
        public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
-               $fname = 'DatabaseBase::deleteJoin' )
+               $fname = __METHOD__ )
        {
                if ( !$conds ) {
                        throw new DBUnexpectedError( $this,
@@ -2614,7 +2703,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @throws DBUnexpectedError
         * @return bool|ResultWrapper
         */
-       public function delete( $table, $conds, $fname = 'DatabaseBase::delete' ) {
+       public function delete( $table, $conds, $fname = __METHOD__ ) {
                if ( !$conds ) {
                        throw new DBUnexpectedError( $this, 'DatabaseBase::delete() called with no conditions' );
                }
@@ -2656,7 +2745,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @return ResultWrapper
         */
        public function insertSelect( $destTable, $srcTable, $varMap, $conds,
-               $fname = 'DatabaseBase::insertSelect',
+               $fname = __METHOD__,
                $insertOptions = array(), $selectOptions = array() )
        {
                $destTable = $this->tableName( $destTable );
@@ -2848,7 +2937,7 @@ abstract class DatabaseBase implements DatabaseType {
                $args = func_get_args();
                $function = array_shift( $args );
                $oldIgnore = $this->ignoreErrors( true );
-               $tries = DEADLOCK_TRIES;
+               $tries = self::DEADLOCK_TRIES;
 
                if ( is_array( $function ) ) {
                        $fname = $function[0];
@@ -2865,7 +2954,7 @@ abstract class DatabaseBase implements DatabaseType {
                        if ( $errno ) {
                                if ( $this->wasDeadlock() ) {
                                        # Retry
-                                       usleep( mt_rand( DEADLOCK_DELAY_MIN, DEADLOCK_DELAY_MAX ) );
+                                       usleep( mt_rand( self::DEADLOCK_DELAY_MIN, self::DEADLOCK_DELAY_MAX ) );
                                } else {
                                        $this->reportQueryError( $error, $errno, $sql, $fname );
                                }
@@ -2955,24 +3044,45 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Run an anonymous function as soon as there is no transaction pending.
         * If there is a transaction and it is rolled back, then the callback is cancelled.
+        * Queries in the function will run in AUTO-COMMIT mode unless there are begin() calls.
         * Callbacks must commit any transactions that they begin.
         *
-        * This is useful for updates to different systems or separate transactions are needed.
+        * This is useful for updates to different systems or when separate transactions are needed.
+        * For example, one might want to enqueue jobs into a system outside the database, but only
+        * after the database is updated so that the jobs will see the data when they actually run.
+        * It can also be used for updates that easily cause deadlocks if locks are held too long.
         *
+        * @param callable $callback
         * @since 1.20
+        */
+       final public function onTransactionIdle( $callback ) {
+               $this->mTrxIdleCallbacks[] = $callback;
+               if ( !$this->mTrxLevel ) {
+                       $this->runOnTransactionIdleCallbacks();
+               }
+       }
+
+       /**
+        * Run an anonymous function before the current transaction commits or now if there is none.
+        * If there is a transaction and it is rolled back, then the callback is cancelled.
+        * Callbacks must not start nor commit any transactions.
+        *
+        * This is useful for updates that easily cause deadlocks if locks are held too long
+        * but where atomicity is strongly desired for these updates and some related updates.
         *
-        * @param Closure $callback
+        * @param callable $callback
+        * @since 1.22
         */
-       final public function onTransactionIdle( Closure $callback ) {
+       final public function onTransactionPreCommitOrIdle( $callback ) {
                if ( $this->mTrxLevel ) {
-                       $this->mTrxIdleCallbacks[] = $callback;
+                       $this->mTrxPreCommitCallbacks[] = $callback;
                } else {
-                       $callback();
+                       $this->onTransactionIdle( $callback ); // this will trigger immediately
                }
        }
 
        /**
-        * Actually run the "on transaction idle" callbacks.
+        * Actually any "on transaction idle" callbacks.
         *
         * @since 1.20
         */
@@ -2988,7 +3098,8 @@ abstract class DatabaseBase implements DatabaseType {
                                        $this->clearFlag( DBO_TRX ); // make each query its own transaction
                                        $callback();
                                        $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
-                               } catch ( Exception $e ) {}
+                               } catch ( Exception $e ) {
+                               }
                        }
                } while ( count( $this->mTrxIdleCallbacks ) );
 
@@ -2997,6 +3108,28 @@ abstract class DatabaseBase implements DatabaseType {
                }
        }
 
+       /**
+        * Actually any "on transaction pre-commit" callbacks.
+        *
+        * @since 1.22
+        */
+       protected function runOnTransactionPreCommitCallbacks() {
+               $e = null; // last exception
+               do { // callbacks may add callbacks :)
+                       $callbacks = $this->mTrxPreCommitCallbacks;
+                       $this->mTrxPreCommitCallbacks = array(); // recursion guard
+                       foreach ( $callbacks as $callback ) {
+                               try {
+                                       $callback();
+                               } catch ( Exception $e ) {}
+                       }
+               } while ( count( $this->mTrxPreCommitCallbacks ) );
+
+               if ( $e instanceof Exception ) {
+                       throw $e; // re-throw any last exception
+               }
+       }
+
        /**
         * Begin a transaction. If a transaction is already in progress, that transaction will be committed before the
         * new transaction is started.
@@ -3009,7 +3142,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $fname string
         */
-       final public function begin( $fname = 'DatabaseBase::begin' ) {
+       final public function begin( $fname = __METHOD__ ) {
                global $wgDebugDBTransactions;
 
                if ( $this->mTrxLevel ) { // implicit commit
@@ -3025,10 +3158,12 @@ abstract class DatabaseBase implements DatabaseType {
                                // log it if $wgDebugDBTransactions is enabled.
                                if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
                                        wfDebug( "$fname: Automatic transaction with writes in progress" .
-                                               " (from {$this->mTrxFname}), performing implicit commit!\n" );
+                                               " (from {$this->mTrxFname}), performing implicit commit!\n"
+                                       );
                                }
                        }
 
+                       $this->runOnTransactionPreCommitCallbacks();
                        $this->doCommit( $fname );
                        $this->runOnTransactionIdleCallbacks();
                }
@@ -3062,21 +3197,22 @@ abstract class DatabaseBase implements DatabaseType {
         *        This will silently break any ongoing explicit transaction. Only set the flush flag if you are sure
         *        that it is safe to ignore these warnings in your context.
         */
-       final public function commit( $fname = 'DatabaseBase::commit', $flush = '' ) {
+       final public function commit( $fname = __METHOD__, $flush = '' ) {
                if ( $flush != 'flush' ) {
                        if ( !$this->mTrxLevel ) {
                                wfWarn( "$fname: No transaction to commit, something got out of sync!" );
-                       } elseif( $this->mTrxAutomatic ) {
+                       } elseif ( $this->mTrxAutomatic ) {
                                wfWarn( "$fname: Explicit commit of implicit transaction. Something may be out of sync!" );
                        }
                } else {
                        if ( !$this->mTrxLevel ) {
                                return; // nothing to do
-                       } elseif( !$this->mTrxAutomatic ) {
+                       } elseif ( !$this->mTrxAutomatic ) {
                                wfWarn( "$fname: Flushing an explicit transaction, getting out of sync!" );
                        }
                }
 
+               $this->runOnTransactionPreCommitCallbacks();
                $this->doCommit( $fname );
                $this->runOnTransactionIdleCallbacks();
        }
@@ -3102,12 +3238,13 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $fname string
         */
-       final public function rollback( $fname = 'DatabaseBase::rollback' ) {
+       final public function rollback( $fname = __METHOD__ ) {
                if ( !$this->mTrxLevel ) {
                        wfWarn( "$fname: No transaction to rollback, something got out of sync!" );
                }
                $this->doRollback( $fname );
                $this->mTrxIdleCallbacks = array(); // cancel
+               $this->mTrxPreCommitCallbacks = array(); // cancel
        }
 
        /**
@@ -3139,8 +3276,8 @@ abstract class DatabaseBase implements DatabaseType {
         * @return Boolean: true if operation was successful
         */
        public function duplicateTableStructure( $oldName, $newName, $temporary = false,
-               $fname = 'DatabaseBase::duplicateTableStructure' )
-       {
+               $fname = __METHOD__
+       {
                throw new MWException(
                        'DatabaseBase::duplicateTableStructure is not implemented in descendant class' );
        }
@@ -3152,7 +3289,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param string $fname calling function name
         * @throws MWException
         */
-       function listTables( $prefix = null, $fname = 'DatabaseBase::listTables' ) {
+       function listTables( $prefix = null, $fname = __METHOD__ ) {
                throw new MWException( 'DatabaseBase::listTables is not implemented in descendant class' );
        }
 
@@ -3285,7 +3422,8 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $options Array
         * @return void
         */
-       public function setSessionOptions( array $options ) {}
+       public function setSessionOptions( array $options ) {
+       }
 
        /**
         * Read and execute SQL commands from a file.
@@ -3375,7 +3513,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @return bool|string
         */
        public function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
-               $fname = 'DatabaseBase::sourceStream', $inputCallback = false )
+               $fname = __METHOD__, $inputCallback = false )
        {
                $cmd = '';
 
@@ -3614,12 +3752,12 @@ abstract class DatabaseBase implements DatabaseType {
         * @return bool|ResultWrapper
         * @since 1.18
         */
-       public function dropTable( $tableName, $fName = 'DatabaseBase::dropTable' ) {
-               if( !$this->tableExists( $tableName, $fName ) ) {
+       public function dropTable( $tableName, $fName = __METHOD__ ) {
+               if ( !$this->tableExists( $tableName, $fName ) ) {
                        return false;
                }
                $sql = "DROP TABLE " . $this->tableName( $tableName );
-               if( $this->cascadingDeletes() ) {
+               if ( $this->cascadingDeletes() ) {
                        $sql .= " CASCADE";
                }
                return $this->query( $sql, $fName );
@@ -3692,8 +3830,8 @@ abstract class DatabaseBase implements DatabaseType {
        }
 
        public function __destruct() {
-               if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
-                       trigger_error( "Transaction idle callbacks still pending." );
+               if ( count( $this->mTrxIdleCallbacks ) || count( $this->mTrxPreCommitCallbacks ) ) {
+                       trigger_error( "Transaction idle or pre-commit callbacks still pending." ); // sanity
                }
        }
 }
index 628a2af..55095c3 100644 (file)
@@ -188,7 +188,7 @@ class DBConnectionError extends DBError {
                                        # Hack: extend the body for error messages
                                        $cache = str_replace( array( '</html>', '</body>' ), '', $cache );
                                        # Add cache notice...
-                                       $cache .= '<div style="color:red;font-size:150%;font-weight:bold;">'.
+                                       $cache .= '<div style="color:red;font-size:150%;font-weight:bold;">' .
                                                htmlspecialchars( $this->msg( 'dberr-cachederror',
                                                        'This is a cached copy of the requested page, and may not be up to date. ' ) ) .
                                                '</div>';
index 575f629..240a097 100644 (file)
@@ -37,24 +37,31 @@ class DatabaseMssql extends DatabaseBase {
        function cascadingDeletes() {
                return true;
        }
+
        function cleanupTriggers() {
                return true;
        }
+
        function strictIPs() {
                return true;
        }
+
        function realTimestamps() {
                return true;
        }
+
        function implicitGroupby() {
                return false;
        }
+
        function implicitOrderby() {
                return false;
        }
+
        function functionalIndexes() {
                return true;
        }
+
        function unionSupportsOrderAndLimit() {
                return false;
        }
@@ -89,7 +96,7 @@ class DatabaseMssql extends DatabaseBase {
 
                $connectionInfo = array();
 
-               if( $dbName ) {
+               if ( $dbName ) {
                        $connectionInfo['Database'] = $dbName;
                }
 
@@ -102,7 +109,7 @@ class DatabaseMssql extends DatabaseBase {
                $ntAuthPassTest = strtolower( $password );
 
                // Decide which auth scenerio to use
-               if( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ) {
+               if ( $ntAuthPassTest == 'ntauth' && $ntAuthUserTest == 'ntauth' ) {
                        // Don't add credentials to $connectionInfo
                } else {
                        $connectionInfo['UID'] = $user;
@@ -148,7 +155,7 @@ class DatabaseMssql extends DatabaseBase {
                }
 
                // MSSQL doesn't have EXTRACT(epoch FROM XXX)
-               if ( preg_match('#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
+               if ( preg_match( '#\bEXTRACT\s*?\(\s*?EPOCH\s+FROM\b#i', $sql, $matches ) ) {
                        // This is same as UNIX_TIMESTAMP, we need to calc # of seconds from 1970
                        $sql = str_replace( $matches[0], "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),", $sql );
                }
@@ -202,9 +209,9 @@ class DatabaseMssql extends DatabaseBase {
                $retErrors = sqlsrv_errors( SQLSRV_ERR_ALL );
                if ( $retErrors != null ) {
                        foreach ( $retErrors as $arrError ) {
-                               $strRet .= "SQLState: " . $arrError[ 'SQLSTATE'] . "\n";
-                               $strRet .= "Error Code: " . $arrError[ 'code'] . "\n";
-                               $strRet .= "Message: " . $arrError[ 'message'] . "\n";
+                               $strRet .= "SQLState: " . $arrError['SQLSTATE'] . "\n";
+                               $strRet .= "Error Code: " . $arrError['code'] . "\n";
+                               $strRet .= "Message: " . $arrError['message'] . "\n";
                        }
                } else {
                        $strRet = "No errors found";
@@ -290,7 +297,7 @@ class DatabaseMssql extends DatabaseBase {
         *                                                 (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
         * @return Mixed: database result resource (feed to Database::fetchObject or whatever), or false on failure
         */
-       function select( $table, $vars, $conds = '', $fname = 'DatabaseMssql::select', $options = array(), $join_conds = array() )
+       function select( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() )
        {
                $sql = $this->selectSQLText( $table, $vars, $conds, $fname, $options, $join_conds );
                if ( isset( $options['EXPLAIN'] ) ) {
@@ -315,7 +322,7 @@ class DatabaseMssql extends DatabaseBase {
         *                    (e.g. array( 'page' => array('LEFT JOIN','page_latest=rev_id') )
         * @return string, the SQL text
         */
-       function selectSQLText( $table, $vars, $conds = '', $fname = 'DatabaseMssql::select', $options = array(), $join_conds = array() ) {
+       function selectSQLText( $table, $vars, $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array() ) {
                if ( isset( $options['EXPLAIN'] ) ) {
                        unset( $options['EXPLAIN'] );
                }
@@ -330,14 +337,16 @@ class DatabaseMssql extends DatabaseBase {
         * Takes same arguments as Database::select()
         * @return int
         */
-       function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseMssql::estimateRowCount', $options = array() ) {
+       function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
                $options['EXPLAIN'] = true;// http://msdn2.microsoft.com/en-us/library/aa259203.aspx
                $res = $this->select( $table, $vars, $conds, $fname, $options );
 
                $rows = -1;
                if ( $res ) {
                        $row = $this->fetchRow( $res );
-                       if ( isset( $row['EstimateRows'] ) ) $rows = $row['EstimateRows'];
+                       if ( isset( $row['EstimateRows'] ) ) {
+                               $rows = $row['EstimateRows'];
+                       }
                }
                return $rows;
        }
@@ -347,7 +356,7 @@ class DatabaseMssql extends DatabaseBase {
         * If errors are explicitly ignored, returns NULL on failure
         * @return array|bool|null
         */
-       function indexInfo( $table, $index, $fname = 'DatabaseMssql::indexExists' ) {
+       function indexInfo( $table, $index, $fname = __METHOD__ ) {
                # This does not return the same info as MYSQL would, but that's OK because MediaWiki never uses the
                # returned value except to check for the existance of indexes.
                $sql = "sp_helpindex '" . $table . "'";
@@ -392,7 +401,7 @@ class DatabaseMssql extends DatabaseBase {
         * @throws DBQueryError
         * @return bool
         */
-       function insert( $table, $arrToInsert, $fname = 'DatabaseMssql::insert', $options = array() ) {
+       function insert( $table, $arrToInsert, $fname = __METHOD__, $options = array() ) {
                # No rows to insert, easy just return now
                if ( !count( $arrToInsert ) ) {
                        return true;
@@ -414,7 +423,7 @@ class DatabaseMssql extends DatabaseBase {
                $identity = null;
                $tableRaw = preg_replace( '#\[([^\]]*)\]#', '$1', $table ); // strip matching square brackets from table name
                $res = $this->doQuery( "SELECT NAME AS idColumn FROM SYS.IDENTITY_COLUMNS WHERE OBJECT_NAME(OBJECT_ID)='{$tableRaw}'" );
-               if( $res && $res->numrows() ) {
+               if ( $res && $res->numrows() ) {
                        // There is an identity for this table.
                        $identity = array_pop( $res->fetch( SQLSRV_FETCH_ASSOC ) );
                }
@@ -427,11 +436,11 @@ class DatabaseMssql extends DatabaseBase {
                        $identityClause = '';
 
                        // if we have an identity column
-                       if( $identity ) {
+                       if ( $identity ) {
                                // iterate through
-                               foreach ($a as $k => $v ) {
+                               foreach ( $a as $k => $v ) {
                                        if ( $k == $identity ) {
-                                               if( !is_null($v) ) {
+                                               if ( !is_null( $v ) ) {
                                                        // there is a value being passed to us, we need to turn on and off inserted identity
                                                        $sqlPre = "SET IDENTITY_INSERT $table ON;";
                                                        $sqlPost = ";SET IDENTITY_INSERT $table OFF;";
@@ -501,7 +510,7 @@ class DatabaseMssql extends DatabaseBase {
                        } elseif ( $ret != null ) {
                                // remember number of rows affected
                                $this->mAffectedRows = sqlsrv_rows_affected( $ret );
-                               if ( !is_null($identity) ) {
+                               if ( !is_null( $identity ) ) {
                                        // then we want to get the identity column value we were assigned and save it off
                                        $row = sqlsrv_fetch_object( $ret );
                                        $this->mInsertId = $row->$identity;
@@ -530,7 +539,7 @@ class DatabaseMssql extends DatabaseBase {
         * @throws DBQueryError
         * @return null|ResultWrapper
         */
-       function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseMssql::insertSelect',
+       function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
                $insertOptions = array(), $selectOptions = array() ) {
                $ret = parent::insertSelect( $destTable, $srcTable, $varMap, $conds, $fname, $insertOptions, $selectOptions );
 
@@ -645,7 +654,7 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * @return string wikitext of a link to the server software's web site
         */
-       public static function getSoftwareLink() {
+       public function getSoftwareLink() {
                return "[http://www.microsoft.com/sql/ MS SQL Server]";
        }
 
@@ -665,7 +674,7 @@ class DatabaseMssql extends DatabaseBase {
                $res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
                        WHERE table_type='BASE TABLE' AND table_name = '$table'" );
                if ( $res === false ) {
-                       print( "Error in tableExists query: " . $this->getErrors() );
+                       print "Error in tableExists query: " . $this->getErrors();
                        return false;
                }
                if ( sqlsrv_fetch( $res ) ) {
@@ -679,12 +688,12 @@ class DatabaseMssql extends DatabaseBase {
         * Query whether a given column exists in the mediawiki schema
         * @return bool
         */
-       function fieldExists( $table, $field, $fname = 'DatabaseMssql::fieldExists' ) {
+       function fieldExists( $table, $field, $fname = __METHOD__ ) {
                $table = $this->tableName( $table );
                $res = sqlsrv_query( $this->mConn, "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.Columns
                        WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
                if ( $res === false ) {
-                       print( "Error in fieldExists query: " . $this->getErrors() );
+                       print "Error in fieldExists query: " . $this->getErrors();
                        return false;
                }
                if ( sqlsrv_fetch( $res ) ) {
@@ -699,7 +708,7 @@ class DatabaseMssql extends DatabaseBase {
                $res = sqlsrv_query( $this->mConn, "SELECT * FROM INFORMATION_SCHEMA.Columns
                        WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
                if ( $res === false ) {
-                       print( "Error in fieldInfo query: " . $this->getErrors() );
+                       print "Error in fieldInfo query: " . $this->getErrors();
                        return false;
                }
                $meta = $this->fetchRow( $res );
@@ -712,7 +721,7 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * Begin a transaction, committing any previously open transaction
         */
-       protected function doBegin( $fname = 'DatabaseMssql::begin' ) {
+       protected function doBegin( $fname = __METHOD__ ) {
                sqlsrv_begin_transaction( $this->mConn );
                $this->mTrxLevel = 1;
        }
@@ -720,7 +729,7 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * End a transaction
         */
-       protected function doCommit( $fname = 'DatabaseMssql::commit' ) {
+       protected function doCommit( $fname = __METHOD__ ) {
                sqlsrv_commit( $this->mConn );
                $this->mTrxLevel = 0;
        }
@@ -729,7 +738,7 @@ class DatabaseMssql extends DatabaseBase {
         * Rollback a transaction.
         * No-op on non-transactional databases.
         */
-       protected function doRollback( $fname = 'DatabaseMssql::rollback' ) {
+       protected function doRollback( $fname = __METHOD__ ) {
                sqlsrv_rollback( $this->mConn );
                $this->mTrxLevel = 0;
        }
@@ -1002,7 +1011,7 @@ class MssqlResult {
 
                $rows = sqlsrv_fetch_array( $queryresult, SQLSRV_FETCH_ASSOC );
 
-               foreach( $rows as $row ) {
+               foreach ( $rows as $row ) {
                        if ( $row !== null ) {
                                foreach ( $row as $k => $v ) {
                                        if ( is_object( $v ) && method_exists( $v, 'format' ) ) {// DateTime Object
@@ -1040,7 +1049,7 @@ class MssqlResult {
                                $arrNum[] = $value;
                        }
                }
-               switch( $mode ) {
+               switch ( $mode ) {
                        case SQLSRV_FETCH_ASSOC:
                                $ret = $this->mRows[$this->mCursor];
                                break;
@@ -1093,37 +1102,96 @@ class MssqlResult {
                        $i++;
                }
                // http://msdn.microsoft.com/en-us/library/cc296183.aspx contains type table
-               switch( $intType ) {
-                       case SQLSRV_SQLTYPE_BIGINT:             $strType = 'bigint'; break;
-                       case SQLSRV_SQLTYPE_BINARY:             $strType = 'binary'; break;
-                       case SQLSRV_SQLTYPE_BIT:                        $strType = 'bit'; break;
-                       case SQLSRV_SQLTYPE_CHAR:                       $strType = 'char'; break;
-                       case SQLSRV_SQLTYPE_DATETIME:           $strType = 'datetime'; break;
-                       case SQLSRV_SQLTYPE_DECIMAL/*($precision, $scale)*/: $strType = 'decimal'; break;
-                       case SQLSRV_SQLTYPE_FLOAT:                      $strType = 'float'; break;
-                       case SQLSRV_SQLTYPE_IMAGE:                      $strType = 'image'; break;
-                       case SQLSRV_SQLTYPE_INT:                        $strType = 'int'; break;
-                       case SQLSRV_SQLTYPE_MONEY:                      $strType = 'money'; break;
-                       case SQLSRV_SQLTYPE_NCHAR/*($charCount)*/: $strType = 'nchar'; break;
-                       case SQLSRV_SQLTYPE_NUMERIC/*($precision, $scale)*/: $strType = 'numeric'; break;
-                       case SQLSRV_SQLTYPE_NVARCHAR/*($charCount)*/: $strType = 'nvarchar'; break;
-                       // case SQLSRV_SQLTYPE_NVARCHAR('max'): $strType = 'nvarchar(MAX)'; break;
-                       case SQLSRV_SQLTYPE_NTEXT:                      $strType = 'ntext'; break;
-                       case SQLSRV_SQLTYPE_REAL:                       $strType = 'real'; break;
-                       case SQLSRV_SQLTYPE_SMALLDATETIME:      $strType = 'smalldatetime'; break;
-                       case SQLSRV_SQLTYPE_SMALLINT:           $strType = 'smallint'; break;
-                       case SQLSRV_SQLTYPE_SMALLMONEY:         $strType = 'smallmoney'; break;
-                       case SQLSRV_SQLTYPE_TEXT:                       $strType = 'text'; break;
-                       case SQLSRV_SQLTYPE_TIMESTAMP:          $strType = 'timestamp'; break;
-                       case SQLSRV_SQLTYPE_TINYINT:            $strType = 'tinyint'; break;
-                       case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER: $strType = 'uniqueidentifier'; break;
-                       case SQLSRV_SQLTYPE_UDT:                        $strType = 'UDT'; break;
-                       case SQLSRV_SQLTYPE_VARBINARY/*($byteCount)*/: $strType = 'varbinary'; break;
-                       // case SQLSRV_SQLTYPE_VARBINARY('max'): $strType = 'varbinary(MAX)'; break;
-                       case SQLSRV_SQLTYPE_VARCHAR/*($charCount)*/: $strType = 'varchar'; break;
-                       // case SQLSRV_SQLTYPE_VARCHAR('max'): $strType = 'varchar(MAX)'; break;
-                       case SQLSRV_SQLTYPE_XML:                        $strType = 'xml'; break;
-                       default: $strType = $intType;
+               switch ( $intType ) {
+                       case SQLSRV_SQLTYPE_BIGINT:
+                               $strType = 'bigint';
+                               break;
+                       case SQLSRV_SQLTYPE_BINARY:
+                               $strType = 'binary';
+                               break;
+                       case SQLSRV_SQLTYPE_BIT:
+                               $strType = 'bit';
+                               break;
+                       case SQLSRV_SQLTYPE_CHAR:
+                               $strType = 'char';
+                               break;
+                       case SQLSRV_SQLTYPE_DATETIME:
+                               $strType = 'datetime';
+                               break;
+                       case SQLSRV_SQLTYPE_DECIMAL: // ($precision, $scale)
+                               $strType = 'decimal';
+                               break;
+                       case SQLSRV_SQLTYPE_FLOAT:
+                               $strType = 'float';
+                               break;
+                       case SQLSRV_SQLTYPE_IMAGE:
+                               $strType = 'image';
+                               break;
+                       case SQLSRV_SQLTYPE_INT:
+                               $strType = 'int';
+                               break;
+                       case SQLSRV_SQLTYPE_MONEY:
+                               $strType = 'money';
+                               break;
+                       case SQLSRV_SQLTYPE_NCHAR: // ($charCount):
+                               $strType = 'nchar';
+                               break;
+                       case SQLSRV_SQLTYPE_NUMERIC: // ($precision, $scale):
+                               $strType = 'numeric';
+                               break;
+                       case SQLSRV_SQLTYPE_NVARCHAR: // ($charCount)
+                               $strType = 'nvarchar';
+                               break;
+                       // case SQLSRV_SQLTYPE_NVARCHAR('max'):
+                       //       $strType = 'nvarchar(MAX)';
+                       //       break;
+                       case SQLSRV_SQLTYPE_NTEXT:
+                               $strType = 'ntext';
+                               break;
+                       case SQLSRV_SQLTYPE_REAL:
+                               $strType = 'real';
+                               break;
+                       case SQLSRV_SQLTYPE_SMALLDATETIME:
+                               $strType = 'smalldatetime';
+                               break;
+                       case SQLSRV_SQLTYPE_SMALLINT:
+                               $strType = 'smallint';
+                               break;
+                       case SQLSRV_SQLTYPE_SMALLMONEY:
+                               $strType = 'smallmoney';
+                               break;
+                       case SQLSRV_SQLTYPE_TEXT:
+                               $strType = 'text';
+                               break;
+                       case SQLSRV_SQLTYPE_TIMESTAMP:
+                               $strType = 'timestamp';
+                               break;
+                       case SQLSRV_SQLTYPE_TINYINT:
+                               $strType = 'tinyint';
+                               break;
+                       case SQLSRV_SQLTYPE_UNIQUEIDENTIFIER:
+                               $strType = 'uniqueidentifier';
+                               break;
+                       case SQLSRV_SQLTYPE_UDT:
+                               $strType = 'UDT';
+                               break;
+                       case SQLSRV_SQLTYPE_VARBINARY: // ($byteCount)
+                               $strType = 'varbinary';
+                               break;
+                       // case SQLSRV_SQLTYPE_VARBINARY('max'):
+                       //       $strType = 'varbinary(MAX)';
+                       //       break;
+                       case SQLSRV_SQLTYPE_VARCHAR: // ($charCount)
+                               $strType = 'varchar';
+                               break;
+                       // case SQLSRV_SQLTYPE_VARCHAR('max'):
+                       //       $strType = 'varchar(MAX)';
+                       //       break;
+                       case SQLSRV_SQLTYPE_XML:
+                               $strType = 'xml';
+                               break;
+                       default:
+                               $strType = $intType;
                }
                return $strType;
        }
index 0f7eb9e..3eb8c44 100644 (file)
@@ -42,7 +42,7 @@ class DatabaseMysql extends DatabaseBase {
         * @return resource
         */
        protected function doQuery( $sql ) {
-               if( $this->bufferResults() ) {
+               if ( $this->bufferResults() ) {
                        $ret = mysql_query( $sql, $this->mConn );
                } else {
                        $ret = mysql_unbuffered_query( $sql, $this->mConn );
@@ -68,6 +68,7 @@ class DatabaseMysql extends DatabaseBase {
                # Fail now
                # Otherwise we get a suppressed fatal error, which is very hard to track down
                if ( !function_exists( 'mysql_connect' ) ) {
+                       wfProfileOut( __METHOD__ );
                        throw new DBConnectionError( $this, "MySQL functions missing, have you compiled PHP with the --with-mysql option?\n" );
                }
 
@@ -152,7 +153,7 @@ class DatabaseMysql extends DatabaseBase {
 
                // Tell the server we're communicating with it in UTF-8.
                // This may engage various charset conversions.
-               if( $wgDBmysql5 ) {
+               if ( $wgDBmysql5 ) {
                        $this->query( 'SET NAMES utf8', __METHOD__ );
                } else {
                        $this->query( 'SET NAMES binary', __METHOD__ );
@@ -209,7 +210,7 @@ class DatabaseMysql extends DatabaseBase {
                // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
                // these are the only errors mysql_fetch_object can cause.
                // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-               if( $errno == 2000 || $errno == 2013 ) {
+               if ( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError( $this, 'Error in fetchObject(): ' . htmlspecialchars( $this->lastError() ) );
                }
                return $row;
@@ -233,7 +234,7 @@ class DatabaseMysql extends DatabaseBase {
                // Only check for CR_SERVER_LOST and CR_UNKNOWN_ERROR, as
                // these are the only errors mysql_fetch_object can cause.
                // See http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html.
-               if( $errno == 2000 || $errno == 2013 ) {
+               if ( $errno == 2000 || $errno == 2013 ) {
                        throw new DBUnexpectedError( $this, 'Error in fetchRow(): ' . htmlspecialchars( $this->lastError() ) );
                }
                return $row;
@@ -327,7 +328,7 @@ class DatabaseMysql extends DatabaseBase {
                } else {
                        $error = mysql_error();
                }
-               if( $error ) {
+               if ( $error ) {
                        $error .= ' (' . $this->mServer . ')';
                }
                return $error;
@@ -347,10 +348,41 @@ class DatabaseMysql extends DatabaseBase {
         * @param $fname string
         * @return ResultWrapper
         */
-       function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseMysql::replace' ) {
+       function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
                return $this->nativeReplace( $table, $rows, $fname );
        }
 
+       /**
+        * @param string $table
+        * @param array $rows
+        * @param array $uniqueIndexes
+        * @param array $set
+        * @param string $fname
+        * @param array $options
+        * @return bool
+        */
+       public function upsert(
+               $table, array $rows, array $uniqueIndexes, array $set, $fname = __METHOD__
+       ) {
+               if ( !count( $rows ) ) {
+                       return true; // nothing to do
+               }
+               $rows = is_array( reset( $rows ) ) ? $rows : array( $rows );
+
+               $table = $this->tableName( $table );
+               $columns = array_keys( $rows[0] );
+
+               $sql = "INSERT INTO $table (" . implode( ',', $columns ) . ') VALUES ';
+               $rowTuples = array();
+               foreach ( $rows as $row ) {
+                       $rowTuples[] = '(' . $this->makeList( $row ) . ')';
+               }
+               $sql .= implode( ',', $rowTuples );
+               $sql .= " ON DUPLICATE KEY UPDATE " . $this->makeList( $set, LIST_SET );
+
+               return (bool)$this->query( $sql, $fname );
+       }
+
        /**
         * Estimate rows in dataset
         * Returns estimated count, based on EXPLAIN output
@@ -363,7 +395,7 @@ class DatabaseMysql extends DatabaseBase {
         * @param $options string|array
         * @return int
         */
-       public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabaseMysql::estimateRowCount', $options = array() ) {
+       public function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
                $options['EXPLAIN'] = true;
                $res = $this->select( $table, $vars, $conds, $fname, $options );
                if ( $res === false ) {
@@ -392,9 +424,9 @@ class DatabaseMysql extends DatabaseBase {
                        return false;
                }
                $n = mysql_num_fields( $res->result );
-               for( $i = 0; $i < $n; $i++ ) {
+               for ( $i = 0; $i < $n; $i++ ) {
                        $meta = mysql_fetch_field( $res->result, $i );
-                       if( $field == $meta->name ) {
+                       if ( $field == $meta->name ) {
                                return new MySQLField( $meta );
                        }
                }
@@ -410,7 +442,7 @@ class DatabaseMysql extends DatabaseBase {
         * @param $fname string
         * @return bool|array|null False or null on failure
         */
-       function indexInfo( $table, $index, $fname = 'DatabaseMysql::indexInfo' ) {
+       function indexInfo( $table, $index, $fname = __METHOD__ ) {
                # SHOW INDEX works in MySQL 3.23.58, but SHOW INDEXES does not.
                # SHOW INDEX should work for 3.x and up:
                # http://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
@@ -451,7 +483,7 @@ class DatabaseMysql extends DatabaseBase {
        function strencode( $s ) {
                $sQuoted = mysql_real_escape_string( $s, $this->mConn );
 
-               if( $sQuoted === false ) {
+               if ( $sQuoted === false ) {
                        $this->ping();
                        $sQuoted = mysql_real_escape_string( $s, $this->mConn );
                }
@@ -536,11 +568,11 @@ class DatabaseMysql extends DatabaseBase {
        function getLagFromProcesslist() {
                wfDeprecated( __METHOD__, '1.19' );
                $res = $this->query( 'SHOW PROCESSLIST', __METHOD__ );
-               if( !$res ) {
+               if ( !$res ) {
                        return false;
                }
                # Find slave SQL thread
-               foreach( $res as $row ) {
+               foreach ( $res as $row ) {
                        /* This should work for most situations - when default db
                         * for thread is not specified, it had no events executed,
                         * and therefore it doesn't know yet how lagged it is.
@@ -576,12 +608,12 @@ class DatabaseMysql extends DatabaseBase {
         * @return bool|string
         */
        function masterPosWait( DBMasterPos $pos, $timeout ) {
-               $fname = 'DatabaseBase::masterPosWait';
+               $fname = __METHOD__;
                wfProfileIn( $fname );
 
                # Commit any open transactions
                if ( $this->mTrxLevel ) {
-                       $this->commit( __METHOD__ );
+                       $this->commit( $fname );
                }
 
                if ( !is_null( $this->mFakeSlaveLag ) ) {
@@ -670,7 +702,7 @@ class DatabaseMysql extends DatabaseBase {
        /**
         * @return string
         */
-       public static function getSoftwareLink() {
+       public function getSoftwareLink() {
                return '[http://www.mysql.com/ MySQL]';
        }
 
@@ -720,7 +752,7 @@ class DatabaseMysql extends DatabaseBase {
                $result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
                $row = $this->fetchObject( $result );
 
-               if( $row->lockstatus == 1 ) {
+               if ( $row->lockstatus == 1 ) {
                        return true;
                } else {
                        wfDebug( __METHOD__ . " failed to acquire lock\n" );
@@ -751,13 +783,13 @@ class DatabaseMysql extends DatabaseBase {
        public function lockTables( $read, $write, $method, $lowPriority = true ) {
                $items = array();
 
-               foreach( $write as $table ) {
+               foreach ( $write as $table ) {
                        $tbl = $this->tableName( $table ) .
                                        ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
                                        ' WRITE';
                        $items[] = $tbl;
                }
-               foreach( $read as $table ) {
+               foreach ( $read as $table ) {
                        $items[] = $this->tableName( $table ) . ' READ';
                }
                $sql = "LOCK TABLES " . implode( ',', $items );
@@ -814,7 +846,7 @@ class DatabaseMysql extends DatabaseBase {
         * @throws DBUnexpectedError
         * @return bool|ResultWrapper
         */
-       function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseBase::deleteJoin' ) {
+       function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = __METHOD__ ) {
                if ( !$conds ) {
                        throw new DBUnexpectedError( $this, 'DatabaseBase::deleteJoin() called with empty $conds' );
                }
@@ -884,7 +916,7 @@ class DatabaseMysql extends DatabaseBase {
         * @param $temporary bool
         * @param $fname string
         */
-       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseMysql::duplicateTableStructure' ) {
+       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
                $tmp = $temporary ? 'TEMPORARY ' : '';
                $newName = $this->addIdentifierQuotes( $newName );
                $oldName = $this->addIdentifierQuotes( $oldName );
@@ -899,16 +931,16 @@ class DatabaseMysql extends DatabaseBase {
         * @param string $fname calling function name
         * @return array
         */
-       function listTables( $prefix = null, $fname = 'DatabaseMysql::listTables' ) {
-               $result = $this->query( "SHOW TABLES", $fname);
+       function listTables( $prefix = null, $fname = __METHOD__ ) {
+               $result = $this->query( "SHOW TABLES", $fname );
 
                $endArray = array();
 
-               foreach( $result as $table ) {
+               foreach ( $result as $table ) {
                        $vars = get_object_vars( $table );
                        $table = array_pop( $vars );
 
-                       if( !$prefix || strpos( $table, $prefix ) === 0 ) {
+                       if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
                                $endArray[] = $table;
                        }
                }
@@ -921,8 +953,8 @@ class DatabaseMysql extends DatabaseBase {
         * @param $fName string
         * @return bool|ResultWrapper
         */
-       public function dropTable( $tableName, $fName = 'DatabaseMysql::dropTable' ) {
-               if( !$this->tableExists( $tableName, $fName ) ) {
+       public function dropTable( $tableName, $fName = __METHOD__ ) {
+               if ( !$this->tableExists( $tableName, $fName ) ) {
                        return false;
                }
                return $this->query( "DROP TABLE IF EXISTS " . $this->tableName( $tableName ), $fName );
index 7db032f..c0d3805 100644 (file)
@@ -206,7 +206,7 @@ class DatabaseOracle extends DatabaseBase {
        }
 
        function __destruct() {
-               if ($this->mOpened) {
+               if ( $this->mOpened ) {
                        wfSuppressWarnings();
                        $this->close();
                        wfRestoreWarnings();
@@ -249,6 +249,7 @@ class DatabaseOracle extends DatabaseBase {
         * @return DatabaseBase|null
         */
        function open( $server, $user, $password, $dbName ) {
+               global $wgDBOracleDRCP;
                if ( !function_exists( 'oci_connect' ) ) {
                        throw new DBConnectionError( $this, "Oracle functions missing, have you compiled PHP with the --with-oci8 option?\n (Note: if you recently installed PHP, you may need to restart your webserver and database)\n" );
                }
@@ -276,9 +277,16 @@ class DatabaseOracle extends DatabaseBase {
                        return;
                }
 
+               if ( $wgDBOracleDRCP ) {
+                       $this->setFlag( DBO_PERSISTENT );
+               }
+
                $session_mode = $this->mFlags & DBO_SYSDBA ? OCI_SYSDBA : OCI_DEFAULT;
+
                wfSuppressWarnings();
-               if ( $this->mFlags & DBO_DEFAULT ) {
+               if ( $this->mFlags & DBO_PERSISTENT ) {
+                       $this->mConn = oci_pconnect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
+               } else if ( $this->mFlags & DBO_DEFAULT ) {
                        $this->mConn = oci_new_connect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
                } else {
                        $this->mConn = oci_connect( $this->mUser, $this->mPassword, $this->mServer, $this->defaultCharset, $session_mode );
@@ -324,7 +332,7 @@ class DatabaseOracle extends DatabaseBase {
 
                // handle some oracle specifics
                // remove AS column/table/subquery namings
-               if( !$this->getFlag( DBO_DDLMODE ) ) {
+               if ( !$this->getFlag( DBO_DDLMODE ) ) {
                        $sql = preg_replace( '/ as /i', ' ', $sql );
                }
 
@@ -456,15 +464,15 @@ class DatabaseOracle extends DatabaseBase {
         * If errors are explicitly ignored, returns NULL on failure
         * @return bool
         */
-       function indexInfo( $table, $index, $fname = 'DatabaseOracle::indexExists' ) {
+       function indexInfo( $table, $index, $fname = __METHOD__ ) {
                return false;
        }
 
-       function indexUnique( $table, $index, $fname = 'DatabaseOracle::indexUnique' ) {
+       function indexUnique( $table, $index, $fname = __METHOD__ ) {
                return false;
        }
 
-       function insert( $table, $a, $fname = 'DatabaseOracle::insert', $options = array() ) {
+       function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
                if ( !count( $a ) ) {
                        return true;
                }
@@ -624,7 +632,7 @@ class DatabaseOracle extends DatabaseBase {
                oci_free_statement( $stmt );
        }
 
-       function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseOracle::insertSelect',
+       function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
                $insertOptions = array(), $selectOptions = array() )
        {
                $destTable = $this->tableName( $destTable );
@@ -677,7 +685,7 @@ class DatabaseOracle extends DatabaseBase {
                Using uppercase because that's the only way Oracle can handle
                quoted tablenames
                */
-               switch( $name ) {
+               switch ( $name ) {
                        case 'user':
                                $name = 'MWUSER';
                                break;
@@ -691,7 +699,7 @@ class DatabaseOracle extends DatabaseBase {
 
        function tableNameInternal( $name ) {
                $name = $this->tableName( $name );
-               return preg_replace( '/.*\.(.*)/', '$1', $name);
+               return preg_replace( '/.*\.(.*)/', '$1', $name );
        }
        /**
         * Return the next in a sequence, save the value for retrieval via insertId()
@@ -756,14 +764,14 @@ class DatabaseOracle extends DatabaseBase {
 
        function unionQueries( $sqls, $all ) {
                $glue = ' UNION ALL ';
-               return 'SELECT * ' . ( $all ? '':'/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')';
+               return 'SELECT * ' . ( $all ? '' : '/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')';
        }
 
        function wasDeadlock() {
                return $this->lastErrno() == 'OCI-00060';
        }
 
-       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseOracle::duplicateTableStructure' ) {
+       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
                $temporary = $temporary ? 'TRUE' : 'FALSE';
 
                $newName = strtoupper( $newName );
@@ -776,7 +784,7 @@ class DatabaseOracle extends DatabaseBase {
                return $this->doQuery( "BEGIN DUPLICATE_TABLE( '$tabName', '$oldPrefix', '$newPrefix', $temporary ); END;" );
        }
 
-       function listTables( $prefix = null, $fname = 'DatabaseOracle::listTables' ) {
+       function listTables( $prefix = null, $fname = __METHOD__ ) {
                $listWhere = '';
                if ( !empty( $prefix ) ) {
                        $listWhere = ' AND table_name LIKE \'' . strtoupper( $prefix ) . '%\'';
@@ -791,17 +799,18 @@ class DatabaseOracle extends DatabaseBase {
                $endArray[] = strtoupper( $prefix . 'PAGE' );
                $endArray[] = strtoupper( $prefix . 'IMAGE' );
                $fixedOrderTabs = $endArray;
-               while ( ($row = $result->fetchRow()) !== false ) {
-                       if ( !in_array( $row['table_name'], $fixedOrderTabs ) )
+               while ( ( $row = $result->fetchRow() ) !== false ) {
+                       if ( !in_array( $row['table_name'], $fixedOrderTabs ) ) {
                                $endArray[] = $row['table_name'];
+                       }
                }
 
                return $endArray;
        }
 
-       public function dropTable( $tableName, $fName = 'DatabaseOracle::dropTable' ) {
+       public function dropTable( $tableName, $fName = __METHOD__ ) {
                $tableName = $this->tableName( $tableName );
-               if( !$this->tableExists( $tableName ) ) {
+               if ( !$this->tableExists( $tableName ) ) {
                        return false;
                }
 
@@ -836,7 +845,7 @@ class DatabaseOracle extends DatabaseBase {
        /**
         * @return string wikitext of a link to the server software's web site
         */
-       public static function getSoftwareLink() {
+       public function getSoftwareLink() {
                return '[http://www.oracle.com/ Oracle]';
        }
 
@@ -856,7 +865,7 @@ class DatabaseOracle extends DatabaseBase {
         * Query whether a given index exists
         * @return bool
         */
-       function indexExists( $table, $index, $fname = 'DatabaseOracle::indexExists' ) {
+       function indexExists( $table, $index, $fname = __METHOD__ ) {
                $table = $this->tableName( $table );
                $table = strtoupper( $this->removeIdentifierQuotes( $table ) );
                $index = strtoupper( $index );
@@ -906,7 +915,7 @@ class DatabaseOracle extends DatabaseBase {
                if ( is_array( $table ) ) {
                        $table = array_map( array( &$this, 'tableNameInternal' ), $table );
                        $tableWhere = 'IN (';
-                       foreach( $table as &$singleTable ) {
+                       foreach ( $table as &$singleTable ) {
                                $singleTable = $this->removeIdentifierQuotes( $singleTable );
                                if ( isset( $this->mFieldInfoCache["$singleTable.$field"] ) ) {
                                        return $this->mFieldInfoCache["$singleTable.$field"];
@@ -919,7 +928,7 @@ class DatabaseOracle extends DatabaseBase {
                        if ( isset( $this->mFieldInfoCache["$table.$field"] ) ) {
                                return $this->mFieldInfoCache["$table.$field"];
                        }
-                       $tableWhere = '= \''.$table.'\'';
+                       $tableWhere = '= \'' . $table . '\'';
                }
 
                $fieldInfoStmt = oci_parse( $this->mConn, 'SELECT * FROM wiki_field_info_full WHERE table_name ' . $tableWhere . ' and column_name = \'' . $field . '\'' );
@@ -931,7 +940,7 @@ class DatabaseOracle extends DatabaseBase {
                $res = new ORAResult( $this, $fieldInfoStmt );
                if ( $res->numRows() == 0 ) {
                        if ( is_array( $table ) ) {
-                               foreach( $table as &$singleTable ) {
+                               foreach ( $table as &$singleTable ) {
                                        $this->mFieldInfoCache["$singleTable.$field"] = false;
                                }
                        } else {
@@ -960,12 +969,12 @@ class DatabaseOracle extends DatabaseBase {
                return $this->fieldInfoMulti( $table, $field );
        }
 
-       protected function doBegin( $fname = 'DatabaseOracle::begin' ) {
+       protected function doBegin( $fname = __METHOD__ ) {
                $this->mTrxLevel = 1;
                $this->doQuery( 'SET CONSTRAINTS ALL DEFERRED' );
        }
 
-       protected function doCommit( $fname = 'DatabaseOracle::commit' ) {
+       protected function doCommit( $fname = __METHOD__ ) {
                if ( $this->mTrxLevel ) {
                        $ret = oci_commit( $this->mConn );
                        if ( !$ret ) {
@@ -976,7 +985,7 @@ class DatabaseOracle extends DatabaseBase {
                }
        }
 
-       protected function doRollback( $fname = 'DatabaseOracle::rollback' ) {
+       protected function doRollback( $fname = __METHOD__ ) {
                if ( $this->mTrxLevel ) {
                        oci_rollback( $this->mConn );
                        $this->mTrxLevel = 0;
@@ -986,7 +995,7 @@ class DatabaseOracle extends DatabaseBase {
 
        /* defines must comply with ^define\s*([^\s=]*)\s*=\s?'\{\$([^\}]*)\}'; */
        function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
-               $fname = 'DatabaseOracle::sourceStream', $inputCallback = false ) {
+               $fname = __METHOD__, $inputCallback = false ) {
                $cmd = '';
                $done = false;
                $dollarquote = false;
@@ -1125,12 +1134,12 @@ class DatabaseOracle extends DatabaseBase {
                $conds2 = array();
                foreach ( $conds as $col => $val ) {
                        if ( is_array( $val ) ) {
-                               $conds2[$col] = $this->wrapConditionsForWhere ( $table, $val, $col );
+                               $conds2[$col] = $this->wrapConditionsForWhere( $table, $val, $col );
                        } else {
                                if ( is_numeric( $col ) && $parentCol != null ) {
-                                       $this->wrapFieldForWhere ( $table, $parentCol, $val );
+                                       $this->wrapFieldForWhere( $table, $parentCol, $val );
                                } else {
-                                       $this->wrapFieldForWhere ( $table, $col, $val );
+                                       $this->wrapFieldForWhere( $table, $col, $val );
                                }
                                $conds2[$col] = $val;
                        }
@@ -1138,7 +1147,7 @@ class DatabaseOracle extends DatabaseBase {
                return $conds2;
        }
 
-       function selectRow( $table, $vars, $conds, $fname = 'DatabaseOracle::selectRow', $options = array(), $join_conds = array() ) {
+       function selectRow( $table, $vars, $conds, $fname = __METHOD__, $options = array(), $join_conds = array() ) {
                if ( is_array( $conds ) ) {
                        $conds = $this->wrapConditionsForWhere( $table, $conds );
                }
@@ -1187,7 +1196,7 @@ class DatabaseOracle extends DatabaseBase {
                return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
        }
 
-       public function delete( $table, $conds, $fname = 'DatabaseOracle::delete' ) {
+       public function delete( $table, $conds, $fname = __METHOD__ ) {
                if ( is_array( $conds ) ) {
                        $conds = $this->wrapConditionsForWhere( $table, $conds );
                }
@@ -1210,7 +1219,7 @@ class DatabaseOracle extends DatabaseBase {
                return parent::delete( $table, $conds, $fname );
        }
 
-       function update( $table, $values, $conds, $fname = 'DatabaseOracle::update', $options = array() ) {
+       function update( $table, $values, $conds, $fname = __METHOD__, $options = array() ) {
                global $wgContLang;
 
                $table = $this->tableName( $table );
index c6ac11a..e564a16 100644 (file)
@@ -117,7 +117,7 @@ SQL;
         * @since 1.19
         */
        function defaultValue() {
-               if( $this->has_default ) {
+               if ( $this->has_default ) {
                        return $this->default;
                } else {
                        return false;
@@ -139,15 +139,15 @@ class PostgresTransactionState {
                array(
                        "desc" => "%s: Connection state changed from %s -> %s\n",
                        "states" => array(
-                               PGSQL_CONNECTION_OK       => "OK",
-                               PGSQL_CONNECTION_BAD      => "BAD"
+                               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_IDLE => "IDLE",
+                               PGSQL_TRANSACTION_ACTIVE => "ACTIVE",
                                PGSQL_TRANSACTION_INTRANS => "TRANS",
                                PGSQL_TRANSACTION_INERROR => "ERROR",
                                PGSQL_TRANSACTION_UNKNOWN => "UNKNOWN"
@@ -189,7 +189,7 @@ class PostgresTransactionState {
        }
 
        protected function describe_changed( $status, $desc_table ) {
-               if( isset( $desc_table[$status] ) ) {
+               if ( isset( $desc_table[$status] ) ) {
                        return $desc_table[$status];
                } else {
                        return "STATUS " . $status;
@@ -320,7 +320,7 @@ class DatabasePostgres extends DatabaseBase {
 
        function hasConstraint( $name ) {
                $SQL = "SELECT 1 FROM pg_catalog.pg_constraint c, pg_catalog.pg_namespace n WHERE c.connamespace = n.oid AND conname = '" .
-                               pg_escape_string( $this->mConn, $name ) . "' AND n.nspname = '" . pg_escape_string( $this->mConn, $this->getCoreSchema() ) ."'";
+                               pg_escape_string( $this->mConn, $name ) . "' AND n.nspname = '" . pg_escape_string( $this->mConn, $this->getCoreSchema() ) . "'";
                $res = $this->doQuery( $SQL );
                return $this->numRows( $res );
        }
@@ -438,7 +438,7 @@ class DatabasePostgres extends DatabaseBase {
                        $sql = mb_convert_encoding( $sql, 'UTF-8' );
                }
                $this->mTransactionState->check();
-               if( pg_send_query( $this->mConn, $sql ) === false ) {
+               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 );
@@ -464,7 +464,7 @@ class DatabasePostgres extends DatabaseBase {
                                PGSQL_DIAG_SOURCE_LINE,
                                PGSQL_DIAG_SOURCE_FUNCTION );
                foreach ( $diags as $d ) {
-                       wfDebug( sprintf("PgSQL ERROR(%d): %s\n", $d, pg_result_error_field( $this->mLastResult, $d ) ) );
+                       wfDebug( sprintf( "PgSQL ERROR(%d): %s\n", $d, pg_result_error_field( $this->mLastResult, $d ) ) );
                }
        }
 
@@ -482,7 +482,7 @@ class DatabasePostgres extends DatabaseBase {
                parent::reportQueryError( $error, $errno, $sql, $fname, false );
        }
 
-       function queryIgnore( $sql, $fname = 'DatabasePostgres::queryIgnore' ) {
+       function queryIgnore( $sql, $fname = __METHOD__ ) {
                return $this->query( $sql, $fname, true );
        }
 
@@ -509,7 +509,7 @@ class DatabasePostgres extends DatabaseBase {
 
                # @todo hashar: not sure if the following test really trigger if the object
                #          fetching failed.
-               if( pg_last_error( $this->mConn ) ) {
+               if ( pg_last_error( $this->mConn ) ) {
                        throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
                }
                return $row;
@@ -522,7 +522,7 @@ class DatabasePostgres extends DatabaseBase {
                wfSuppressWarnings();
                $row = pg_fetch_array( $res );
                wfRestoreWarnings();
-               if( pg_last_error( $this->mConn ) ) {
+               if ( pg_last_error( $this->mConn ) ) {
                        throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
                }
                return $row;
@@ -535,7 +535,7 @@ class DatabasePostgres extends DatabaseBase {
                wfSuppressWarnings();
                $n = pg_num_rows( $res );
                wfRestoreWarnings();
-               if( pg_last_error( $this->mConn ) ) {
+               if ( pg_last_error( $this->mConn ) ) {
                        throw new DBUnexpectedError( $this, 'SQL error: ' . htmlspecialchars( pg_last_error( $this->mConn ) ) );
                }
                return $n;
@@ -556,8 +556,10 @@ class DatabasePostgres extends DatabaseBase {
        }
 
        /**
-        * This must be called after nextSequenceVal
-        * @return null
+        * Return the result of the last call to nextSequenceValue();
+        * This must be called after nextSequenceValue().
+        *
+        * @return integer|null
         */
        function insertId() {
                return $this->mInsertId;
@@ -594,7 +596,7 @@ class DatabasePostgres extends DatabaseBase {
                        // Forced result for simulated queries
                        return $this->mAffectedRows;
                }
-               if( empty( $this->mLastResult ) ) {
+               if ( empty( $this->mLastResult ) ) {
                        return 0;
                }
                return pg_affected_rows( $this->mLastResult );
@@ -608,14 +610,14 @@ class DatabasePostgres extends DatabaseBase {
         * Takes same arguments as Database::select()
         * @return int
         */
-       function estimateRowCount( $table, $vars = '*', $conds = '', $fname = 'DatabasePostgres::estimateRowCount', $options = array() ) {
+       function estimateRowCount( $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array() ) {
                $options['EXPLAIN'] = true;
                $res = $this->select( $table, $vars, $conds, $fname, $options );
                $rows = -1;
                if ( $res ) {
                        $row = $this->fetchRow( $res );
                        $count = array();
-                       if( preg_match( '/rows=(\d+)/', $row[0], $count ) ) {
+                       if ( preg_match( '/rows=(\d+)/', $row[0], $count ) ) {
                                $rows = $count[1];
                        }
                }
@@ -627,7 +629,7 @@ class DatabasePostgres extends DatabaseBase {
         * If errors are explicitly ignored, returns NULL on failure
         * @return bool|null
         */
-       function indexInfo( $table, $index, $fname = 'DatabasePostgres::indexInfo' ) {
+       function indexInfo( $table, $index, $fname = __METHOD__ ) {
                $sql = "SELECT indexname FROM pg_indexes WHERE tablename='$table'";
                $res = $this->query( $sql, $fname );
                if ( !$res ) {
@@ -648,8 +650,9 @@ class DatabasePostgres extends DatabaseBase {
         * @return Array
         */
        function indexAttributes( $index, $schema = false ) {
-               if ( $schema === false )
+               if ( $schema === false ) {
                        $schema = $this->getCoreSchema();
+               }
                /*
                 * A subquery would be not needed if we didn't care about the order
                 * of attributes, but we do
@@ -702,8 +705,8 @@ __INDEXATTR__;
                return $a;
        }
 
-       function indexUnique( $table, $index, $fname = 'DatabasePostgres::indexUnique' ) {
-               $sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'".
+       function indexUnique( $table, $index, $fname = __METHOD__ ) {
+               $sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'" .
                        " AND indexdef LIKE 'CREATE UNIQUE%(" .
                        $this->strencode( $this->indexName( $index ) ) .
                        ")'";
@@ -730,7 +733,7 @@ __INDEXATTR__;
         *
         * @return bool Success of insert operation. IGNORE always returns true.
         */
-       function insert( $table, $args, $fname = 'DatabasePostgres::insert', $options = array() ) {
+       function insert( $table, $args, $fname = __METHOD__, $options = array() ) {
                if ( !count( $args ) ) {
                        return true;
                }
@@ -847,12 +850,12 @@ __INDEXATTR__;
         * @todo FIXME: Implement this a little better (seperate select/insert)?
         * @return bool
         */
-       function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabasePostgres::insertSelect',
+       function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = __METHOD__,
                $insertOptions = array(), $selectOptions = array() )
        {
                $destTable = $this->tableName( $destTable );
 
-               if( !is_array( $insertOptions ) ) {
+               if ( !is_array( $insertOptions ) ) {
                        $insertOptions = array( $insertOptions );
                }
 
@@ -868,11 +871,11 @@ __INDEXATTR__;
                        $savepoint->savepoint();
                }
 
-               if( !is_array( $selectOptions ) ) {
+               if ( !is_array( $selectOptions ) ) {
                        $selectOptions = array( $selectOptions );
                }
                list( $startOpts, $useIndex, $tailOpts ) = $this->makeSelectOptions( $selectOptions );
-               if( is_array( $srcTable ) ) {
+               if ( is_array( $srcTable ) ) {
                        $srcTable = implode( ',', array_map( array( &$this, 'tableName' ), $srcTable ) );
                } else {
                        $srcTable = $this->tableName( $srcTable );
@@ -889,9 +892,9 @@ __INDEXATTR__;
                $sql .= " $tailOpts";
 
                $res = (bool)$this->query( $sql, $fname, $savepoint );
-               if( $savepoint ) {
+               if ( $savepoint ) {
                        $bar = pg_last_error();
-                       if( $bar != false ) {
+                       if ( $bar != false ) {
                                $savepoint->rollback();
                        } else {
                                $savepoint->release();
@@ -912,7 +915,7 @@ __INDEXATTR__;
 
        function tableName( $name, $format = 'quoted' ) {
                # Replace reserved words with better ones
-               switch( $name ) {
+               switch ( $name ) {
                        case 'user':
                                return $this->realTableName( 'mwuser', $format );
                        case 'text':
@@ -958,7 +961,7 @@ __INDEXATTR__;
                        FROM pg_class c, pg_attribute a, pg_type t
                        WHERE relname='$table' AND a.attrelid=c.oid AND
                                a.atttypid=t.oid and a.attname='$field'";
-               $res =$this->query( $sql );
+               $res = $this->query( $sql );
                $row = $this->fetchObject( $res );
                if ( $row->ftype == 'varchar' ) {
                        $size = $row->size - 4;
@@ -976,21 +979,21 @@ __INDEXATTR__;
                return $this->lastErrno() == '40P01';
        }
 
-       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabasePostgres::duplicateTableStructure' ) {
+       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
                $newName = $this->addIdentifierQuotes( $newName );
                $oldName = $this->addIdentifierQuotes( $oldName );
                return $this->query( 'CREATE ' . ( $temporary ? 'TEMPORARY ' : '' ) . " TABLE $newName (LIKE $oldName INCLUDING DEFAULTS)", $fname );
        }
 
-       function listTables( $prefix = null, $fname = 'DatabasePostgres::listTables' ) {
+       function listTables( $prefix = null, $fname = __METHOD__ ) {
                $eschema = $this->addQuotes( $this->getCoreSchema() );
                $result = $this->query( "SELECT tablename FROM pg_tables WHERE schemaname = $eschema", $fname );
                $endArray = array();
 
-               foreach( $result as $table ) {
+               foreach ( $result as $table ) {
                        $vars = get_object_vars( $table );
                        $table = array_pop( $vars );
-                       if( !$prefix || strpos( $table, $prefix ) === 0 ) {
+                       if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
                                $endArray[] = $table;
                        }
                }
@@ -1021,26 +1024,26 @@ __INDEXATTR__;
         * @return string
         */
        function pg_array_parse( $text, &$output, $limit = false, $offset = 1 ) {
-               if( false === $limit ) {
-                       $limit = strlen( $text )-1;
+               if ( false === $limit ) {
+                       $limit = strlen( $text ) - 1;
                        $output = array();
                }
-               if( '{}' == $text ) {
+               if ( '{}' == $text ) {
                        return $output;
                }
                do {
-                       if ( '{' != $text{$offset} ) {
+                       if ( '{' != $text[$offset] ) {
                                preg_match( "/(\\{?\"([^\"\\\\]|\\\\.)*\"|[^,{}]+)+([,}]+)/",
                                        $text, $match, 0, $offset );
                                $offset += strlen( $match[0] );
-                               $output[] = ( '"' != $match[1]{0}
+                               $output[] = ( '"' != $match[1][0]
                                                ? $match[1]
                                                : stripcslashes( substr( $match[1], 1, -1 ) ) );
                                if ( '},' == $match[3] ) {
                                        return $output;
                                }
                        } else {
-                               $offset = $this->pg_array_parse( $text, $output, $limit, $offset+1 );
+                               $offset = $this->pg_array_parse( $text, $output, $limit, $offset + 1 );
                        }
                } while ( $limit > $offset );
                return $output;
@@ -1056,7 +1059,7 @@ __INDEXATTR__;
        /**
         * @return string wikitext of a link to the server software's web site
         */
-       public static function getSoftwareLink() {
+       public function getSoftwareLink() {
                return '[http://www.postgresql.org/ PostgreSQL]';
        }
 
@@ -1406,7 +1409,8 @@ SQL;
                return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
        }
 
-       function setFakeMaster( $enabled = true ) {}
+       function setFakeMaster( $enabled = true ) {
+       }
 
        function getDBname() {
                return $this->mDBname;
@@ -1473,7 +1477,7 @@ SQL;
                                sleep( 1 );
                        }
                }
-               wfDebug( __METHOD__." failed to acquire lock\n" );
+               wfDebug( __METHOD__ . " failed to acquire lock\n" );
                return false;
        }
 
index 0789e1b..6692fa4 100644 (file)
@@ -52,9 +52,9 @@ class DatabaseSqlite extends DatabaseBase {
                $this->mName = $dbName;
                parent::__construct( $server, $user, $password, $dbName, $flags );
                // parent doesn't open when $user is false, but we can work with $dbName
-               if( $dbName ) {
+               if ( $dbName ) {
                        global $wgSharedDB;
-                       if( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) {
+                       if ( $this->open( $server, $user, $password, $dbName ) && $wgSharedDB ) {
                                $this->attachDatabase( $wgSharedDB );
                        }
                }
@@ -68,7 +68,7 @@ class DatabaseSqlite extends DatabaseBase {
        }
 
        /**
-        * @todo: check if it should be true like parent class
+        * @todo Check if it should be true like parent class
         *
         * @return bool
         */
@@ -200,7 +200,7 @@ class DatabaseSqlite extends DatabaseBase {
         *
         * @return ResultWrapper
         */
-       function attachDatabase( $name, $file = false, $fname = 'DatabaseSqlite::attachDatabase' ) {
+       function attachDatabase( $name, $file = false, $fname = __METHOD__ ) {
                global $wgSQLiteDataDir;
                if ( !$file ) {
                        $file = self::generateFileName( $wgSQLiteDataDir, $name );
@@ -420,7 +420,7 @@ class DatabaseSqlite extends DatabaseBase {
         *
         * @return array
         */
-       function indexInfo( $table, $index, $fname = 'DatabaseSqlite::indexExists' ) {
+       function indexInfo( $table, $index, $fname = __METHOD__ ) {
                $sql = 'PRAGMA index_info(' . $this->addQuotes( $this->indexName( $index ) ) . ')';
                $res = $this->query( $sql, $fname );
                if ( !$res ) {
@@ -442,7 +442,7 @@ class DatabaseSqlite extends DatabaseBase {
         * @param $fname string
         * @return bool|null
         */
-       function indexUnique( $table, $index, $fname = 'DatabaseSqlite::indexUnique' ) {
+       function indexUnique( $table, $index, $fname = __METHOD__ ) {
                $row = $this->selectRow( 'sqlite_master', '*',
                        array(
                                'type' => 'index',
@@ -471,7 +471,7 @@ class DatabaseSqlite extends DatabaseBase {
         */
        function makeSelectOptions( $options ) {
                foreach ( $options as $k => $v ) {
-                       if ( is_numeric( $k ) && ($v == 'FOR UPDATE' || $v == 'LOCK IN SHARE MODE') ) {
+                       if ( is_numeric( $k ) && ( $v == 'FOR UPDATE' || $v == 'LOCK IN SHARE MODE' ) ) {
                                $options[$k] = '';
                        }
                }
@@ -514,7 +514,7 @@ class DatabaseSqlite extends DatabaseBase {
         * Based on generic method (parent) with some prior SQLite-sepcific adjustments
         * @return bool
         */
-       function insert( $table, $a, $fname = 'DatabaseSqlite::insert', $options = array() ) {
+       function insert( $table, $a, $fname = __METHOD__, $options = array() ) {
                if ( !count( $a ) ) {
                        return true;
                }
@@ -541,8 +541,10 @@ class DatabaseSqlite extends DatabaseBase {
         * @param $fname string
         * @return bool|ResultWrapper
         */
-       function replace( $table, $uniqueIndexes, $rows, $fname = 'DatabaseSqlite::replace' ) {
-               if ( !count( $rows ) ) return true;
+       function replace( $table, $uniqueIndexes, $rows, $fname = __METHOD__ ) {
+               if ( !count( $rows ) ) {
+                       return true;
+               }
 
                # SQLite can't handle multi-row replaces, so divide up into multiple single-row queries
                if ( isset( $rows[0] ) && is_array( $rows[0] ) ) {
@@ -610,7 +612,7 @@ class DatabaseSqlite extends DatabaseBase {
        /**
         * @return string wikitext of a link to the server software's web site
         */
-       public static function getSoftwareLink() {
+       public function getSoftwareLink() {
                return "[http://sqlite.org/ SQLite]";
        }
 
@@ -707,7 +709,7 @@ class DatabaseSqlite extends DatabaseBase {
        function addQuotes( $s ) {
                if ( $s instanceof Blob ) {
                        return "x'" . bin2hex( $s->fetch() ) . "'";
-               } else if ( strpos( $s, "\0" ) !== false ) {
+               } 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:
@@ -813,7 +815,7 @@ class DatabaseSqlite extends DatabaseBase {
         * @param $fname string
         * @return bool|ResultWrapper
         */
-       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = 'DatabaseSqlite::duplicateTableStructure' ) {
+       function duplicateTableStructure( $oldName, $newName, $temporary = false, $fname = __METHOD__ ) {
                $res = $this->query( "SELECT sql FROM sqlite_master WHERE tbl_name=" . $this->addQuotes( $oldName ) . " AND type='table'", $fname );
                $obj = $this->fetchObject( $res );
                if ( !$obj ) {
@@ -839,7 +841,7 @@ class DatabaseSqlite extends DatabaseBase {
         *
         * @return array
         */
-       function listTables( $prefix = null, $fname = 'DatabaseSqlite::listTables' ) {
+       function listTables( $prefix = null, $fname = __METHOD__ ) {
                $result = $this->select(
                        'sqlite_master',
                        'name',
@@ -848,11 +850,11 @@ class DatabaseSqlite extends DatabaseBase {
 
                $endArray = array();
 
-               foreach( $result as $table ) {
+               foreach ( $result as $table ) {
                        $vars = get_object_vars( $table );
                        $table = array_pop( $vars );
 
-                       if( !$prefix || strpos( $table, $prefix ) === 0 ) {
+                       if ( !$prefix || strpos( $table, $prefix ) === 0 ) {
                                if ( strpos( $table, 'sqlite_' ) !== 0 ) {
                                        $endArray[] = $table;
                                }
index 9a1c8bd..de58bab 100644 (file)
@@ -253,7 +253,8 @@ class FakeResultWrapper extends ResultWrapper {
                $this->pos = $row;
        }
 
-       function free() {}
+       function free() {
+       }
 
        // Callers want to be able to access fields with $this->fieldName
        function fetchObject() {
index 6bc0cdd..f8833f5 100644 (file)
 
 interface IORMRow {
 
-       /**
-        * Constructor.
-        *
-        * @since 1.20
-        *
-        * @param IORMTable $table
-        * @param array|null $fields
-        * @param boolean $loadDefaults
-        */
-       public function __construct( IORMTable $table, $fields = null, $loadDefaults = false );
-
        /**
         * Load the specified fields from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param array|null $fields
         * @param boolean $override
@@ -74,6 +64,7 @@ interface IORMRow {
         * Gets the value of a field but first loads it if not done so already.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param string$name
         *
@@ -155,6 +146,7 @@ interface IORMRow {
         * Load the default values, via getDefaults.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $override
         */
@@ -167,6 +159,7 @@ interface IORMRow {
         * @since 1.20
         *
         * @param string|null $functionName
+        * @deprecated since 1.21
         *
         * @return boolean Success indicator
         */
@@ -176,6 +169,7 @@ interface IORMRow {
         * Removes the object from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return boolean Success indicator
         */
@@ -215,9 +209,9 @@ interface IORMRow {
 
        /**
         * Add an amount (can be negative) to the specified field (needs to be numeric).
-        * TODO: most off this stuff makes more sense in the table class
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param string $field
         * @param integer $amount
@@ -239,6 +233,7 @@ interface IORMRow {
         * Computes and updates the values of the summary fields.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param array|string|null $summaryFields
         */
@@ -248,6 +243,7 @@ interface IORMRow {
         * Sets the value for the @see $updateSummaries field.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $update
         */
@@ -257,6 +253,7 @@ interface IORMRow {
         * Sets the value for the @see $inSummaryMode field.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $summaryMode
         */
@@ -266,6 +263,7 @@ interface IORMRow {
         * Returns the table this IORMRow is a row in.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return IORMTable
         */
index d469e86..16c43a0 100644 (file)
@@ -134,7 +134,8 @@ abstract class LBFactory {
         * Prepare all tracked load balancers for shutdown
         * STUB
         */
-       function shutdown() {}
+       function shutdown() {
+       }
 
        /**
         * Call a method of each tracked load balancer
@@ -201,7 +202,7 @@ class LBFactory_Simple extends LBFactory {
                                $flags |= DBO_COMPRESS;
                        }
 
-                       $servers = array(array(
+                       $servers = array( array(
                                'host' => $wgDBserver,
                                'user' => $wgDBuser,
                                'password' => $wgDBpassword,
@@ -256,6 +257,7 @@ class LBFactory_Simple extends LBFactory {
                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];
        }
@@ -280,6 +282,9 @@ class LBFactory_Simple extends LBFactory {
                if ( $this->mainLB ) {
                        $this->chronProt->shutdownLB( $this->mainLB );
                }
+               foreach ( $this->extLBs as $extLB ) {
+                       $this->chronProt->shutdownLB( $extLB );
+               }
                $this->chronProt->shutdown();
                $this->commitMasterChanges();
        }
@@ -292,21 +297,27 @@ class LBFactory_Simple extends LBFactory {
  * LBFactory::enableBackend() to return to normal behavior
  */
 class LBFactory_Fake extends LBFactory {
-       function __construct( $conf ) {}
+       function __construct( $conf ) {
+       }
 
-       function newMainLB( $wiki = false) {
+       function newMainLB( $wiki = false ) {
                throw new DBAccessError;
        }
+
        function getMainLB( $wiki = false ) {
                throw new DBAccessError;
        }
+
        function newExternalLB( $cluster, $wiki = false ) {
                throw new DBAccessError;
        }
+
        function &getExternalLB( $cluster, $wiki = false ) {
                throw new DBAccessError;
        }
-       function forEachLB( $callback, $params = array() ) {}
+
+       function forEachLB( $callback, $params = array() ) {
+       }
 }
 
 /**
@@ -317,76 +328,3 @@ class DBAccessError extends MWException {
                parent::__construct( "Mediawiki tried to access the database via wfGetDB(). This is not allowed." );
        }
 }
-
-/**
- * Class for ensuring a consistent ordering of events as seen by the user, despite replication.
- * Kind of like Hawking's [[Chronology Protection Agency]].
- */
-class ChronologyProtector {
-       var $startupPos;
-       var $shutdownPos = array();
-
-       /**
-        * Initialise a LoadBalancer to give it appropriate chronology protection.
-        *
-        * @param $lb LoadBalancer
-        */
-       function initLB( $lb ) {
-               if ( $this->startupPos === null ) {
-                       if ( !empty( $_SESSION[__CLASS__] ) ) {
-                               $this->startupPos = $_SESSION[__CLASS__];
-                       }
-               }
-               if ( !$this->startupPos ) {
-                       return;
-               }
-               $masterName = $lb->getServerName( 0 );
-
-               if ( $lb->getServerCount() > 1 && !empty( $this->startupPos[$masterName] ) ) {
-                       $info = $lb->parentInfo();
-                       $pos = $this->startupPos[$masterName];
-                       wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
-                       $lb->waitFor( $this->startupPos[$masterName] );
-               }
-       }
-
-       /**
-        * Notify the ChronologyProtector that the LoadBalancer is about to shut
-        * down. Saves replication positions.
-        *
-        * @param $lb LoadBalancer
-        */
-       function shutdownLB( $lb ) {
-               // Don't start a session, don't bother with non-replicated setups
-               if ( strval( session_id() ) == '' || $lb->getServerCount() <= 1 ) {
-                       return;
-               }
-               $masterName = $lb->getServerName( 0 );
-               if ( isset( $this->shutdownPos[$masterName] ) ) {
-                       // Already done
-                       return;
-               }
-               // Only save the position if writes have been done on the connection
-               $db = $lb->getAnyOpenConnection( 0 );
-               $info = $lb->parentInfo();
-               if ( !$db || !$db->doneWrites() ) {
-                       wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
-                       return;
-               }
-               $pos = $db->getMasterPos();
-               wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
-               $this->shutdownPos[$masterName] = $pos;
-       }
-
-       /**
-        * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now.
-        * May commit chronology data to persistent storage.
-        */
-       function shutdown() {
-               if ( session_id() != '' && count( $this->shutdownPos ) ) {
-                       wfDebug( __METHOD__ . ": saving master pos for " .
-                               count( $this->shutdownPos ) . " master(s)\n" );
-                       $_SESSION[__CLASS__] = $this->shutdownPos;
-               }
-       }
-}
index 2e4963d..3043946 100644 (file)
@@ -145,8 +145,8 @@ class LBFactory_Multi extends LBFactory {
                $section = $this->getSectionForWiki( $wiki );
                if ( !isset( $this->mainLBs[$section] ) ) {
                        $lb = $this->newMainLB( $wiki, $section );
-                       $this->chronProt->initLB( $lb );
                        $lb->parentInfo( array( 'id' => "main-$section" ) );
+                       $this->chronProt->initLB( $lb );
                        $this->mainLBs[$section] = $lb;
                }
                return $this->mainLBs[$section];
@@ -181,6 +181,7 @@ class LBFactory_Multi extends LBFactory {
                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];
        }
@@ -296,6 +297,9 @@ class LBFactory_Multi extends LBFactory {
                foreach ( $this->mainLBs as $lb ) {
                        $this->chronProt->shutdownLB( $lb );
                }
+               foreach ( $this->extLBs as $extLB ) {
+                       $this->chronProt->shutdownLB( $extLB );
+               }
                $this->chronProt->shutdown();
                $this->commitMasterChanges();
        }
index 1e85927..db709b5 100644 (file)
@@ -78,7 +78,7 @@ class LoadBalancer {
                        }
                }
 
-               foreach( $params['servers'] as $i => $server ) {
+               foreach ( $params['servers'] as $i => $server ) {
                        $this->mLoads[$i] = $server['load'];
                        if ( isset( $server['groupLoads'] ) ) {
                                foreach ( $server['groupLoads'] as $group => $ratio ) {
@@ -117,7 +117,7 @@ class LoadBalancer {
         * Given an array of non-normalised probabilities, this function will select
         * an element and return the appropriate key
         *
-        * @deprecated 1.21, use ArrayUtils::pickRandom()
+        * @deprecated since 1.21, use ArrayUtils::pickRandom()
         *
         * @param $weights array
         *
@@ -219,6 +219,7 @@ class LoadBalancer {
                }
 
                if ( !$nonErrorLoads ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Empty server array given to LoadBalancer" );
                }
 
@@ -348,7 +349,7 @@ class LoadBalancer {
         * 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 $pos int
+        * @param $pos DBMasterPos
         */
        public function waitFor( $pos ) {
                wfProfileIn( __METHOD__ );
@@ -366,7 +367,7 @@ class LoadBalancer {
 
        /**
         * Set the master wait position and wait for ALL slaves to catch up to it
-        * @param $pos int
+        * @param $pos DBMasterPos
         */
        public function waitForAll( $pos ) {
                wfProfileIn( __METHOD__ );
@@ -399,7 +400,7 @@ class LoadBalancer {
         * @param $open bool
         * @return bool
         */
-       function doWait( $index, $open = false ) {
+       protected function doWait( $index, $open = false ) {
                # Find a connection to wait on
                $conn = $this->getAnyOpenConnection( $index );
                if ( !$conn ) {
@@ -407,7 +408,7 @@ class LoadBalancer {
                                wfDebug( __METHOD__ . ": no connection open\n" );
                                return false;
                        } else {
-                               $conn = $this->openConnection( $index );
+                               $conn = $this->openConnection( $index, '' );
                                if ( !$conn ) {
                                        wfDebug( __METHOD__ . ": failed to open connection\n" );
                                        return false;
@@ -443,8 +444,10 @@ class LoadBalancer {
                wfProfileIn( __METHOD__ );
 
                if ( $i == DB_LAST ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Attempt to call ' . __METHOD__ . ' with deprecated server index DB_LAST' );
                } elseif ( $i === null || $i === false ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( 'Attempt to call ' . __METHOD__ . ' with invalid server index' );
                }
 
@@ -476,6 +479,7 @@ class LoadBalancer {
 
                # Operation-based index
                if ( $i == DB_SLAVE ) {
+                       $this->mLastError = 'Unknown error'; // reset error string
                        $i = $this->getReaderIndex( false, $wiki );
                        # Couldn't find a working server in getReaderIndex()?
                        if ( $i === false ) {
@@ -662,7 +666,7 @@ class LoadBalancer {
         * @return bool
         */
        function isOpen( $index ) {
-               if( !is_integer( $index ) ) {
+               if ( !is_integer( $index ) ) {
                        return false;
                }
                return (bool)$this->getAnyOpenConnection( $index );
@@ -679,7 +683,7 @@ class LoadBalancer {
         * @return DatabaseBase
         */
        function reallyOpenConnection( $server, $dbNameOverride = false ) {
-               if( !is_array( $server ) ) {
+               if ( !is_array( $server ) ) {
                        throw new MWException( 'You must update your load-balancing configuration. ' .
                                'See DefaultSettings.php entry for $wgDBservers.' );
                }
@@ -830,7 +834,7 @@ class LoadBalancer {
         */
        function closeAll() {
                foreach ( $this->mConns as $conns2 ) {
-                       foreach  ( $conns2 as $conns3 ) {
+                       foreach ( $conns2 as $conns3 ) {
                                foreach ( $conns3 as $conn ) {
                                        $conn->close();
                                }
index ad7b3b2..4b9ecce 100644 (file)
@@ -135,8 +135,9 @@ class LoadMonitor_MySQL implements LoadMonitor {
                $requestRate = 10;
 
                global $wgMemc;
-               if ( empty( $wgMemc ) )
+               if ( empty( $wgMemc ) ) {
                        $wgMemc = wfGetMainCache();
+               }
 
                $masterName = $this->parent->getServerName( 0 );
                $memcKey = wfMemcKey( 'lag_times', $masterName );
index 6c1f27f..ea6ff63 100644 (file)
@@ -42,18 +42,13 @@ class ORMRow implements IORMRow {
         */
        protected $fields = array( 'id' => null );
 
-       /**
-        * @since 1.20
-        * @var ORMTable
-        */
-       protected $table;
-
        /**
         * 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.21
         * @since 1.20
         * @var bool
         */
@@ -64,21 +59,29 @@ class ORMRow implements IORMRow {
         * This mode indicates that only summary fields got updated,
         * which allows for optimizations.
         *
+        * @deprecated since 1.21
         * @since 1.20
         * @var bool
         */
        protected $inSummaryMode = false;
 
+       /**
+        * @deprecated since 1.21
+        * @since 1.20
+        * @var ORMTable|null
+        */
+       protected $table;
+
        /**
         * Constructor.
         *
         * @since 1.20
         *
-        * @param IORMTable $table
+        * @param IORMTable|null $table Deprecated since 1.21
         * @param array|null $fields
-        * @param boolean $loadDefaults
+        * @param boolean $loadDefaults Deprecated since 1.21
         */
-       public function __construct( IORMTable $table, $fields = null, $loadDefaults = false ) {
+       public function __construct( IORMTable $table = null, $fields = null, $loadDefaults = false ) {
                $this->table = $table;
 
                if ( !is_array( $fields ) ) {
@@ -96,6 +99,7 @@ class ORMRow implements IORMRow {
         * Load the specified fields from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param array|null $fields
         * @param boolean $override
@@ -160,6 +164,7 @@ class ORMRow implements IORMRow {
         * Gets the value of a field but first loads it if not done so already.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param $name string
         *
@@ -231,26 +236,11 @@ class ORMRow implements IORMRow {
                        && !is_null( $this->getField( 'id' ) );
        }
 
-       /**
-        * Sets multiple fields.
-        *
-        * @since 1.20
-        *
-        * @param array $fields The fields to set
-        * @param boolean $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 );
-                       }
-               }
-       }
-
        /**
         * Gets the fields => values to write to the table.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return array
         */
@@ -269,10 +259,10 @@ class ORMRow implements IORMRow {
                                switch ( $type ) {
                                        case 'array':
                                                $value = (array)$value;
-                                               // fall-through!
+                                       // fall-through!
                                        case 'blob':
                                                $value = serialize( $value );
-                                               // fall-through!
+                                       // fall-through!
                                }
 
                                $values[$this->table->getPrefixedField( $name )] = $value;
@@ -282,6 +272,22 @@ class ORMRow implements IORMRow {
                return $values;
        }
 
+       /**
+        * Sets multiple fields.
+        *
+        * @since 1.20
+        *
+        * @param array $fields The fields to set
+        * @param boolean $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.
@@ -320,6 +326,7 @@ class ORMRow implements IORMRow {
         * Load the default values, via getDefaults.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $override
         */
@@ -332,6 +339,7 @@ class ORMRow implements IORMRow {
         * when it already exists, or inserting it when it doesn't.
         *
         * @since 1.20
+        * @deprecated since 1.21 Use IORMTable->updateRow or ->insertRow
         *
         * @param string|null $functionName
         *
@@ -339,9 +347,9 @@ class ORMRow implements IORMRow {
         */
        public function save( $functionName = null ) {
                if ( $this->hasIdField() ) {
-                       return $this->saveExisting( $functionName );
+                       return $this->table->updateRow( $this, $functionName );
                } else {
-                       return $this->insert( $functionName );
+                       return $this->table->insertRow( $this, $functionName );
                }
        }
 
@@ -349,6 +357,7 @@ class ORMRow implements IORMRow {
         * Updates the object in the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param string|null $functionName
         *
@@ -360,7 +369,7 @@ class ORMRow implements IORMRow {
                $success = $dbw->update(
                        $this->table->getName(),
                        $this->getWriteValues(),
-                       $this->table->getPrefixedValues( $this->getUpdateConditions() ),
+                       $this->table->getPrefixedValues( $this->getWriteValues() ),
                        is_null( $functionName ) ? __METHOD__ : $functionName
                );
 
@@ -386,6 +395,7 @@ class ORMRow implements IORMRow {
         * Inserts the object into the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param string|null $functionName
         * @param array|null $options
@@ -418,16 +428,14 @@ class ORMRow implements IORMRow {
         * Removes the object from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21, use IROMtable->removeRow
         *
         * @return boolean Success indicator
         */
        public function remove() {
                $this->beforeRemove();
 
-               $success = $this->table->delete( array( 'id' => $this->getId() ), __METHOD__ );
-
-               // DatabaseBase::delete does not always return true for success as documented...
-               $success = $success !== false;
+               $success = $this->table->removeRow( $this, __METHOD__ );
 
                if ( $success ) {
                        $this->onRemoved();
@@ -440,6 +448,7 @@ class ORMRow implements IORMRow {
         * Gets called before an object is removed from the database.
         *
         * @since 1.20
+        * @deprecated since 1.21
         */
        protected function beforeRemove() {
                $this->loadFields( $this->getBeforeRemoveFields(), false, true );
@@ -463,6 +472,7 @@ class ORMRow implements IORMRow {
         * Can be overridden to get rid of linked data.
         *
         * @since 1.20
+        * @deprecated since 1.21
         */
        protected function onRemoved() {
                $this->setField( 'id', null );
@@ -503,51 +513,14 @@ class ORMRow implements IORMRow {
         * @throws MWException
         */
        public function setField( $name, $value ) {
-               $fields = $this->table->getFields();
-
-               if ( array_key_exists( $name, $fields ) ) {
-                       switch ( $fields[$name] ) {
-                               case 'int':
-                                       $value = (int)$value;
-                                       break;
-                               case 'float':
-                                       $value = (float)$value;
-                                       break;
-                               case 'bool':
-                                       $value = (bool)$value;
-                                       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;
-                       }
-
-                       $this->fields[$name] = $value;
-               } else {
-                       throw new MWException( 'Attempted to set unknown field ' . $name );
-               }
+               $this->fields[$name] = $value;
        }
 
        /**
         * Add an amount (can be negative) to the specified field (needs to be numeric).
-        * TODO: most off this stuff makes more sense in the table class
         *
         * @since 1.20
+        * @deprecated since 1.21, use IORMTable->addToField
         *
         * @param string $field
         * @param integer $amount
@@ -555,41 +528,14 @@ class ORMRow implements IORMRow {
         * @return boolean Success indicator
         */
        public function addToField( $field, $amount ) {
-               if ( $amount == 0 ) {
-                       return true;
-               }
-
-               if ( !$this->hasIdField() ) {
-                       return false;
-               }
-
-               $absoluteAmount = abs( $amount );
-               $isNegative = $amount < 0;
-
-               $dbw = $this->table->getWriteDbConnection();
-
-               $fullField = $this->table->getPrefixedField( $field );
-
-               $success = $dbw->update(
-                       $this->table->getName(),
-                       array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
-                       array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
-                       __METHOD__
-               );
-
-               if ( $success && $this->hasField( $field ) ) {
-                       $this->setField( $field, $this->getField( $field ) + $amount );
-               }
-
-               $this->table->releaseConnection( $dbw );
-
-               return $success;
+               return $this->table->addToField( $this->getUpdateConditions(), $field, $amount );
        }
 
        /**
         * Return the names of the fields.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return array
         */
@@ -601,6 +547,7 @@ class ORMRow implements IORMRow {
         * Computes and updates the values of the summary fields.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param array|string|null $summaryFields
         */
@@ -612,6 +559,7 @@ class ORMRow implements IORMRow {
         * Sets the value for the @see $updateSummaries field.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $update
         */
@@ -623,6 +571,7 @@ class ORMRow implements IORMRow {
         * Sets the value for the @see $inSummaryMode field.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @param boolean $summaryMode
         */
@@ -630,40 +579,11 @@ class ORMRow implements IORMRow {
                $this->inSummaryMode = $summaryMode;
        }
 
-       /**
-        * Return if any fields got changed.
-        *
-        * @since 1.20
-        *
-        * @param IORMRow $object
-        * @param boolean|array $excludeSummaryFields
-        *  When set to true, summary field changes are ignored.
-        *  Can also be an array of fields to ignore.
-        *
-        * @return boolean
-        */
-       protected function fieldsChanged( IORMRow $object, $excludeSummaryFields = false ) {
-               $exclusionFields = array();
-
-               if ( $excludeSummaryFields !== false ) {
-                       $exclusionFields = is_array( $excludeSummaryFields ) ? $excludeSummaryFields : $this->table->getSummaryFields();
-               }
-
-               foreach ( $this->fields as $name => $value ) {
-                       $excluded = $excludeSummaryFields && in_array( $name, $exclusionFields );
-
-                       if ( !$excluded && $object->getField( $name ) !== $value ) {
-                               return true;
-                       }
-               }
-
-               return false;
-       }
-
        /**
         * Returns the table this IORMRow is a row in.
         *
         * @since 1.20
+        * @deprecated since 1.21
         *
         * @return IORMTable
         */
index bcbe94a..3a432cd 100644 (file)
@@ -814,10 +814,59 @@ class ORMTable extends DBAccessBase implements IORMTable {
         */
        public function getFieldsFromDBResult( stdClass $result ) {
                $result = (array)$result;
-               return array_combine(
+
+               $rawFields = array_combine(
                        $this->unprefixFieldNames( 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;
        }
 
        /**
@@ -867,14 +916,15 @@ class ORMTable extends DBAccessBase implements IORMTable {
         *
         * @since 1.20
         *
-        * @param array $data
+        * @param array $fields
         * @param boolean $loadDefaults
         *
         * @return IORMRow
         */
-       public function newRow( array $data, $loadDefaults = false ) {
+       public function newRow( array $fields, $loadDefaults = false ) {
                $class = $this->getRowClass();
-               return new $class( $this, $data, $loadDefaults );
+
+               return new $class( $this, $fields, $loadDefaults );
        }
 
        /**
@@ -901,4 +951,157 @@ class ORMTable extends DBAccessBase implements IORMTable {
                return array_key_exists( $name, $this->getFields() );
        }
 
+       /**
+        * Updated the provided row in the database.
+        *
+        * @since 1.21
+        *
+        * @param IORMRow $row The row to save
+        * @param string|null $functionName
+        *
+        * @return boolean 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.21
+        *
+        * @param IORMRow $row
+        * @param string|null $functionName
+        * @param array|null $options
+        *
+        * @return boolean 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.20
+        *
+        * @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.21
+        *
+        * @param IORMRow $row
+        * @param string|null $functionName
+        *
+        * @return boolean 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.21
+        *
+        * @param array $conditions
+        * @param string $field
+        * @param integer $amount
+        *
+        * @return boolean 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;
+       }
+
 }
index 8c39e1a..ec9a62a 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Debug toolbar related code
+ * Debug toolbar related code.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
  */
 
 /**
- * New debugger system that outputs a toolbar on page view
+ * New debugger system that outputs a toolbar on page view.
  *
  * By default, most methods do nothing ( self::$enabled = false ). You have
  * to explicitly call MWDebug::init() to enabled them.
@@ -35,28 +35,28 @@ class MWDebug {
        /**
         * Log lines
         *
-        * @var array
+        * @var array $log
         */
        protected static $log = array();
 
        /**
-        * Debug messages from wfDebug()
+        * Debug messages from wfDebug().
         *
-        * @var array
+        * @var array $debug
         */
        protected static $debug = array();
 
        /**
-        * Queries
+        * SQL statements of the databses queries.
         *
-        * @var array
+        * @var array $query
         */
        protected static $query = array();
 
        /**
         * Is the debugger enabled?
         *
-        * @var bool
+        * @var bool $enabled
         */
        protected static $enabled = false;
 
@@ -64,7 +64,7 @@ class MWDebug {
         * Array of functions that have already been warned, formatted
         * function-caller to prevent a buttload of warnings
         *
-        * @var array
+        * @var array $deprecationWarnings
         */
        protected static $deprecationWarnings = array();
 
@@ -135,10 +135,24 @@ class MWDebug {
         * @since 1.19
         * @param $msg string
         * @param $callerOffset int
-        * @param int $level A PHP error level. See sendWarning()
+        * @param $level int A PHP error level. See sendWarning()
+        * @param $log string: 'production' will always trigger a php error, 'auto'
+        *        will trigger an error if $wgDevelopmentWarnings is true, and 'debug'
+        *        will only write to the debug log(s).
+        *
         * @return mixed
         */
-       public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
+       public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE, $log = 'auto' ) {
+               global $wgDevelopmentWarnings;
+
+               if ( $log === 'auto' && !$wgDevelopmentWarnings ) {
+                       $log = 'debug';
+               }
+
+               if ( $log === 'debug' ) {
+                       $level = false;
+               }
+
                $callerDescription = self::getCallerDescription( $callerOffset );
 
                self::sendWarning( $msg, $callerDescription, $level );
@@ -212,7 +226,8 @@ class MWDebug {
                }
 
                if ( $sendToLog ) {
-                       self::sendWarning( $msg, $callerDescription, E_USER_DEPRECATED );
+                       global $wgDevelopmentWarnings; // we could have a more specific $wgDeprecationWarnings setting.
+                       self::sendWarning( $msg, $callerDescription, $wgDevelopmentWarnings ? E_USER_DEPRECATED : false );
                }
 
                if ( self::$enabled ) {
@@ -267,23 +282,21 @@ class MWDebug {
        }
 
        /**
-        * Send a warning either to the debug log or by triggering an user PHP
-        * error depending on $wgDevelopmentWarnings.
+        * Send a warning to the debug log and optionally also trigger a PHP
+        * error, depending on the $level argument.
         *
-        * @param string $msg Message to send
-        * @param array $caller caller description get from getCallerDescription()
-        * @param $level error level to use if $wgDevelopmentWarnings is true
+        * @param $msg string Message to send
+        * @param $caller array caller description get from getCallerDescription()
+        * @param $level int|bool error level to use; set to false to not trigger an error
         */
        private static function sendWarning( $msg, $caller, $level ) {
-               global $wgDevelopmentWarnings;
-
                $msg .= ' [Called from ' . $caller['func'] . ' in ' . $caller['file'] . ']';
 
-               if ( $wgDevelopmentWarnings ) {
+               if ( $level !== false ) {
                        trigger_error( $msg, $level );
-               } else {
-                       wfDebug( "$msg\n" );
                }
+
+               wfDebug( "$msg\n" );
        }
 
        /**
@@ -471,10 +484,10 @@ class MWDebug {
                // output errors as debug info, when display_errors is on
                // this is necessary for all non html output of the api, because that clears all errors first
                $obContents = ob_get_contents();
-               if( $obContents ) {
+               if ( $obContents ) {
                        $obContentArray = explode( '<br />', $obContents );
-                       foreach( $obContentArray as $obContent ) {
-                               if( trim( $obContent ) ) {
+                       foreach ( $obContentArray as $obContent ) {
+                               if ( trim( $obContent ) ) {
                                        self::debugMsg( Sanitizer::stripAllTags( $obContent ) );
                                }
                        }
@@ -485,7 +498,7 @@ class MWDebug {
 
                $result->setIndexedTagName( $debugInfo, 'debuginfo' );
                $result->setIndexedTagName( $debugInfo['log'], 'line' );
-               foreach( $debugInfo['debugLog'] as $index => $debugLogText ) {
+               foreach ( $debugInfo['debugLog'] as $index => $debugLogText ) {
                        $vals = array();
                        ApiResult::setContent( $vals, $debugLogText );
                        $debugInfo['debugLog'][$index] = $vals; //replace
index 1a26d0c..174c1d6 100644 (file)
@@ -271,7 +271,8 @@ class _DiffEngine {
                                $this->xchanged[$skip] = $this->ychanged[$skip] = false;
                        }
                        // Skip trailing common lines.
-                       $xi = $n_from; $yi = $n_to;
+                       $xi = $n_from;
+                       $yi = $n_to;
                        for ( $endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++ ) {
                                if ( $from_lines[$xi] !== $to_lines[$yi] ) {
                                        break;
@@ -394,7 +395,7 @@ class _DiffEngine {
                                                break;
                                        }
                                }
-                               while ( list ( , $y ) = each( $matches ) ) {
+                               while ( list( , $y ) = each( $matches ) ) {
                                        if ( $y > $this->seq[$k -1] ) {
                                                assert( '$y < $this->seq[$k]' );
                                                // Optimization: this is a common case:
@@ -471,8 +472,7 @@ class _DiffEngine {
         */
        function _compareseq( $xoff, $xlim, $yoff, $ylim ) {
                // Slide down the bottom initial diagonal.
-               while ( $xoff < $xlim && $yoff < $ylim
-               && $this->xv[$xoff] == $this->yv[$yoff] ) {
+               while ( $xoff < $xlim && $yoff < $ylim && $this->xv[$xoff] == $this->yv[$yoff] ) {
                        ++$xoff;
                        ++$yoff;
                }
@@ -491,7 +491,7 @@ class _DiffEngine {
                        // $nchunks = sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5);
                        // $nchunks = max(2,min(8,(int)$nchunks));
                        $nchunks = min( 7, $xlim - $xoff, $ylim - $yoff ) + 1;
-                       list ( $lcs, $seps ) = $this->_diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
+                       list( $lcs, $seps ) = $this->_diag( $xoff, $xlim, $yoff, $ylim, $nchunks );
                }
 
                if ( $lcs == 0 ) {
@@ -508,7 +508,7 @@ class _DiffEngine {
                        reset( $seps );
                        $pt1 = $seps[0];
                        while ( $pt2 = next( $seps ) ) {
-                               $this->_compareseq ( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
+                               $this->_compareseq( $pt1[0], $pt2[0], $pt1[1], $pt2[1] );
                                $pt1 = $pt2;
                        }
                }
@@ -554,9 +554,11 @@ class _DiffEngine {
 
                        while ( $i < $len && ! $changed[$i] ) {
                                assert( '$j < $other_len && ! $other_changed[$j]' );
-                               $i++; $j++;
-                               while ( $j < $other_len && $other_changed[$j] )
+                               $i++;
                                $j++;
+                               while ( $j < $other_len && $other_changed[$j] ) {
+                                       $j++;
+                               }
                        }
 
                        if ( $i == $len ) {
@@ -1109,7 +1111,7 @@ class ArrayDiffFormatter extends DiffFormatter {
                $newline = 1;
                $retval = array();
                foreach ( $diff->edits as $edit ) {
-                       switch( $edit->type ) {
+                       switch ( $edit->type ) {
                                case 'add':
                                        foreach ( $edit->closing as $l ) {
                                                $retval[] = array(
@@ -1282,8 +1284,12 @@ class WordLevelDiff extends MappedDiff {
                                if ( preg_match_all( '/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
                                        $line, $m ) )
                                {
-                                       $words = array_merge( $words, $m[0] );
-                                       $stripped = array_merge( $stripped, $m[1] );
+                                       foreach ( $m[0] as $word ) {
+                                               $words[] = $word;
+                                       }
+                                       foreach ( $m[1] as $stripped_word ) {
+                                               $stripped[] = $stripped_word;
+                                       }
                                }
                        }
                }
index 0f3c77f..4ee066e 100644 (file)
@@ -48,7 +48,6 @@ class DifferenceEngine extends ContextSource {
         * @var Title
         */
        var $mOldPage, $mNewPage;
-       var $mRcidMarkPatrolled;
 
        /**
         * @var Revision
@@ -80,8 +79,8 @@ class DifferenceEngine extends ContextSource {
         * Constructor
         * @param $context IContextSource context to use, anything else will be ignored
         * @param $old Integer old ID we want to show and diff with.
-        * @param string $new either 'prev' or 'next'.
-        * @param $rcid Integer ??? FIXME (default 0)
+        * @param $new String either 'prev' or 'next'.
+        * @param $rcid Integer Deprecated, no longer used!
         * @param $refreshCache boolean If set, refreshes the diff cache
         * @param $unhide boolean If set, allow viewing deleted revs
         */
@@ -96,7 +95,6 @@ class DifferenceEngine extends ContextSource {
 
                $this->mOldid = $old;
                $this->mNewid = $new;
-               $this->mRcidMarkPatrolled = intval( $rcid );  # force it to be an integer
                $this->mRefreshCache = $refreshCache;
                $this->unhide = $unhide;
        }
@@ -223,33 +221,6 @@ class DifferenceEngine extends ContextSource {
                        throw new PermissionsError( 'read', $permErrors );
                }
 
-               # If external diffs are enabled both globally and for the user,
-               # we'll use the application/x-external-editor interface to call
-               # an external diff tool like kompare, kdiff3, etc.
-               if ( ExternalEdit::useExternalEngine( $this->getContext(), 'diff' ) ) {
-                       //TODO: come up with a good solution for non-text content here.
-                       //      at least, the content format needs to be passed to the client somehow.
-                       //      Currently, action=raw will just fail for non-text content.
-
-                       $urls = array(
-                               'File' => array( 'Extension' => 'wiki', 'URL' =>
-                                       # This should be mOldPage, but it may not be set, see below.
-                                       $this->mNewPage->getCanonicalURL( array(
-                                               'action' => 'raw', 'oldid' => $this->mOldid ) )
-                               ),
-                               'File2' => array( 'Extension' => 'wiki', 'URL' =>
-                                       $this->mNewPage->getCanonicalURL( array(
-                                               'action' => 'raw', 'oldid' => $this->mNewid ) )
-                               ),
-                       );
-
-                       $externalEditor = new ExternalEdit( $this->getContext(), $urls );
-                       $externalEditor->execute();
-
-                       wfProfileOut( __METHOD__ );
-                       return;
-               }
-
                $rollback = '';
                $undoLink = '';
 
@@ -279,11 +250,6 @@ class DifferenceEngine extends ContextSource {
                } else {
                        wfRunHooks( 'DiffViewHeader', array( $this, $this->mOldRev, $this->mNewRev ) );
 
-                       $sk = $this->getSkin();
-                       if ( method_exists( $sk, 'suppressQuickbar' ) ) {
-                               $sk->suppressQuickbar();
-                       }
-
                        if ( $this->mNewPage->equals( $this->mOldPage ) ) {
                                $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) );
                                $samePage = true;
@@ -304,7 +270,7 @@ class DifferenceEngine extends ContextSource {
                                }
                                if ( !$this->mOldRev->isDeleted( Revision::DELETED_TEXT ) && !$this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
                                        $undoLink = Html::element( 'a', array(
-                                                       'href' => $this->mNewPage->getLocalUrl( array(
+                                                       'href' => $this->mNewPage->getLocalURL( array(
                                                                'action' => 'edit',
                                                                'undoafter' => $this->mOldid,
                                                                'undo' => $this->mNewid ) ),
@@ -397,8 +363,9 @@ class DifferenceEngine extends ContextSource {
 
                if ( $this->mNewRev->isDeleted( Revision::DELETED_TEXT ) ) {
                        $deleted = true; // new revisions text is hidden
-                       if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) )
+                       if ( $this->mNewRev->isDeleted( Revision::DELETED_RESTRICTED ) ) {
                                $suppressed = true; // also suppressed
+                       }
                }
 
                # If the diff cannot be shown due to a deleted revision, then output
@@ -414,7 +381,7 @@ class DifferenceEngine extends ContextSource {
                                        array( $msg ) );
                        } else {
                                # Give explanation and add a link to view the diff...
-                               $link = $this->getTitle()->getFullUrl( $this->getRequest()->appendQueryValue( 'unhide', '1', true ) );
+                               $link = $this->getTitle()->getFullURL( $this->getRequest()->appendQueryValue( 'unhide', '1', true ) );
                                $msg = $suppressed ? 'rev-suppressed-unhide-diff' : 'rev-deleted-unhide-diff';
                                $out->wrapWikiMsg( "<div id='mw-$msg' class='mw-warning plainlinks'>\n$1\n</div>\n", array( $msg, $link ) );
                        }
@@ -443,43 +410,47 @@ class DifferenceEngine extends ContextSource {
         * @return String
         */
        protected function markPatrolledLink() {
-               global $wgUseRCPatrol;
+               global $wgUseRCPatrol, $wgRCMaxAge, $wgEnableAPI, $wgEnableWriteAPI;
+               $cache = wfGetMainCache();
 
                if ( $this->mMarkPatrolledLink === null ) {
                        // Prepare a change patrol link, if applicable
-                       if ( $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $this->getUser() ) ) {
-                               // If we've been given an explicit change identifier, use it; saves time
-                               if ( $this->mRcidMarkPatrolled ) {
-                                       $rcid = $this->mRcidMarkPatrolled;
-                                       $rc = RecentChange::newFromId( $rcid );
-                                       // Already patrolled?
-                                       $rcid = is_object( $rc ) && !$rc->getAttribute( 'rc_patrolled' ) ? $rcid : 0;
+                       if (
+                               // Is patrolling enabled and the user allowed to?
+                               $wgUseRCPatrol && $this->mNewPage->quickUserCan( 'patrol', $this->getUser() ) &&
+                               // Only do this if the revision isn't more than 6 hours older
+                               // than the Max RC age (6h because the RC might not be cleaned out regularly)
+                               RecentChange::isInRCLifespan( $this->mNewRev->getTimestamp(), 21600 ) &&
+                               // Maybe the result is cached
+                               !$cache->get( wfMemcKey( 'NotPatrollableRevId', $this->mNewid ) )
+                       ) {
+                               // Look for an unpatrolled change corresponding to this diff
+
+                               $db = wfGetDB( DB_SLAVE );
+                               $change = RecentChange::newFromConds(
+                                       array(
+                                               'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
+                                               'rc_this_oldid' => $this->mNewid,
+                                               'rc_patrolled' => 0
+                                       ),
+                                       __METHOD__,
+                                       array( 'USE INDEX' => 'rc_timestamp' )
+                               );
+
+                               if ( $change ) {
+                                       $rcid = $change->getAttribute( 'rc_id' );
                                } else {
-                                       // Look for an unpatrolled change corresponding to this diff
-                                       $db = wfGetDB( DB_SLAVE );
-                                       $change = RecentChange::newFromConds(
-                                               array(
-                                               // Redundant user,timestamp condition so we can use the existing index
-                                                       'rc_user_text'  => $this->mNewRev->getRawUserText(),
-                                                       'rc_timestamp'  => $db->timestamp( $this->mNewRev->getTimestamp() ),
-                                                       'rc_this_oldid' => $this->mNewid,
-                                                       'rc_last_oldid' => $this->mOldid,
-                                                       'rc_patrolled'  => 0
-                                               ),
-                                               __METHOD__
-                                       );
-                                       if ( $change instanceof RecentChange ) {
-                                               $rcid = $change->mAttribs['rc_id'];
-                                               $this->mRcidMarkPatrolled = $rcid;
-                                       } else {
-                                               // None found
-                                               $rcid = 0;
-                                       }
+                                       // None found
+                                       $rcid = 0;
                                }
                                // Build the link
                                if ( $rcid ) {
                                        $this->getOutput()->preventClickjacking();
-                                       $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
+                                       if ( $wgEnableAPI && $wgEnableWriteAPI
+                                               && $this->getUser()->isAllowed( 'writeapi' )
+                                       ) {
+                                               $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
+                                       }
 
                                        $token = $this->getUser()->getEditToken( $rcid );
                                        $this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
@@ -493,6 +464,7 @@ class DifferenceEngine extends ContextSource {
                                                )
                                        ) . ']</span>';
                                } else {
+                                       $cache->set( wfMemcKey( 'NotPatrollableRevId', $this->mNewid ), '1', $wgRCMaxAge );
                                        $this->mMarkPatrolledLink = '';
                                }
                        } else {
@@ -536,7 +508,7 @@ class DifferenceEngine extends ContextSource {
                        if ( $this->mNewPage->isCssJsSubpage() || $this->mNewPage->isCssOrJsPage() ) {
                                // Stolen from Article::view --AG 2007-10-11
                                // Give hooks a chance to customise the output
-                               // @TODO: standardize this crap into one function
+                               // @todo standardize this crap into one function
                                if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
                                        // NOTE: deprecated hook, B/C only
                                        // use the content object's own rendering
@@ -545,9 +517,9 @@ class DifferenceEngine extends ContextSource {
                                        $txt = $po ? $po->getText() : '';
                                        $out->addHTML( $txt );
                                }
-                       } elseif( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+                       } elseif ( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
                                // Handled by extension
-                       } elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+                       } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
                                // NOTE: deprecated hook, B/C only
                                // Handled by extension
                        } else {
@@ -576,7 +548,7 @@ class DifferenceEngine extends ContextSource {
                                                # Show categories etc.
                                                $out->addParserOutputNoText( $parserOutput );
                                        }
-                               } else if ( $parserOutput ) {
+                               } elseif ( $parserOutput ) {
                                        $out->addParserOutput( $parserOutput );
                                }
                        }
@@ -893,7 +865,9 @@ class DifferenceEngine extends ContextSource {
        }
 
        function localiseLineNumbersCb( $matches ) {
-               if ( $matches[1] === '1' && $this->mReducedLineNumbers ) return '';
+               if ( $matches[1] === '1' && $this->mReducedLineNumbers ) {
+                       return '';
+               }
                return $this->msg( 'lineno' )->numParams( $matches[1] )->escaped();
        }
 
diff --git a/includes/extauth/Hardcoded.php b/includes/extauth/Hardcoded.php
deleted file mode 100644 (file)
index dfb4674..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-/**
- * External authentication with hardcoded user names and passwords
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * 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
- */
-
-/**
- * This class supports external authentication from a literal array dumped in
- * LocalSettings.php.  It's mostly useful for testing.  Example configuration:
- *
- *   $wgExternalAuthType = 'ExternalUser_Hardcoded';
- *   $wgExternalAuthConf = array(
- *       'Bob Smith' => array(
- *           'password' => 'literal string',
- *           'emailaddress' => 'bob@example.com',
- *       ),
- *   );
- *
- * Multiple names may be provided.  The keys of the inner arrays can be either
- * 'password', or the name of any preference.
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_Hardcoded extends ExternalUser {
-       private $mName;
-
-       protected function initFromName( $name ) {
-               global $wgExternalAuthConf;
-
-               if ( isset( $wgExternalAuthConf[$name] ) ) {
-                       $this->mName = $name;
-                       return true;
-               }
-               return false;
-       }
-
-       protected function initFromId( $id ) {
-               return $this->initFromName( $id );
-       }
-
-       public function getId() {
-               return $this->mName;
-       }
-
-       public function getName() {
-               return $this->mName;
-       }
-
-       public function authenticate( $password ) {
-               global $wgExternalAuthConf;
-
-               return isset( $wgExternalAuthConf[$this->mName]['password'] )
-                       && $wgExternalAuthConf[$this->mName]['password'] == $password;
-       }
-
-       public function getPref( $pref ) {
-               global $wgExternalAuthConf;
-
-               if ( isset( $wgExternalAuthConf[$this->mName][$pref] ) ) {
-                       return $wgExternalAuthConf[$this->mName][$pref];
-               }
-               return null;
-       }
-
-       # TODO: Implement setPref() via regex on LocalSettings.  (Just kidding.)
-}
diff --git a/includes/extauth/MediaWiki.php b/includes/extauth/MediaWiki.php
deleted file mode 100644 (file)
index c7f6a20..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-/**
- * External authentication with external MediaWiki database.
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * 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
- */
-
-/**
- * This class supports authentication against an external MediaWiki database,
- * probably any version back to 1.5 or something.  Example configuration:
- *
- *   $wgExternalAuthType = 'ExternalUser_MediaWiki';
- *   $wgExternalAuthConf = array(
- *       'DBtype' => 'mysql',
- *       'DBserver' => 'localhost',
- *       'DBname' => 'wikidb',
- *       'DBuser' => 'quasit',
- *       'DBpassword' => 'a5Cr:yf9u-6[{`g',
- *       'DBprefix' => '',
- *   );
- *
- * All fields must be present.  These mean the same things as $wgDBtype,
- * $wgDBserver, etc.  This implementation is quite crude; it could easily
- * support multiple database servers, for instance, and memcached, and it
- * probably has bugs.  Kind of hard to reuse code when things might rely on who
- * knows what configuration globals.
- *
- * If either wiki uses the UserComparePasswords hook, password authentication
- * might fail unexpectedly unless they both do the exact same validation.
- * There may be other corner cases like this where this will fail, but it
- * should be unlikely.
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_MediaWiki extends ExternalUser {
-       private $mRow;
-
-       /**
-        * @var DatabaseBase
-        */
-       private $mDb;
-
-       /**
-        * @param $name string
-        * @return bool
-        */
-       protected function initFromName( $name ) {
-               # We might not need the 'usable' bit, but let's be safe.  Theoretically
-               # this might return wrong results for old versions, but it's probably
-               # good enough.
-               $name = User::getCanonicalName( $name, 'usable' );
-
-               if ( !is_string( $name ) ) {
-                       return false;
-               }
-
-               return $this->initFromCond( array( 'user_name' => $name ) );
-       }
-
-       /**
-        * @param $id int
-        * @return bool
-        */
-       protected function initFromId( $id ) {
-               return $this->initFromCond( array( 'user_id' => $id ) );
-       }
-
-       /**
-        * @param $cond array
-        * @return bool
-        */
-       private function initFromCond( $cond ) {
-               global $wgExternalAuthConf;
-
-               $this->mDb = DatabaseBase::factory( $wgExternalAuthConf['DBtype'],
-                       array(
-                               'host'        => $wgExternalAuthConf['DBserver'],
-                               'user'        => $wgExternalAuthConf['DBuser'],
-                               'password'    => $wgExternalAuthConf['DBpassword'],
-                               'dbname'      => $wgExternalAuthConf['DBname'],
-                               'tablePrefix' => $wgExternalAuthConf['DBprefix'],
-                       )
-               );
-
-               $row = $this->mDb->selectRow(
-                       'user',
-                       array(
-                               'user_name', 'user_id', 'user_password', 'user_email',
-                               'user_email_authenticated'
-                       ),
-                       $cond,
-                       __METHOD__
-               );
-               if ( !$row ) {
-                       return false;
-               }
-               $this->mRow = $row;
-
-               return true;
-       }
-
-       # TODO: Implement initFromCookie().
-
-       public function getId() {
-               return $this->mRow->user_id;
-       }
-
-       /**
-        * @return string
-        */
-       public function getName() {
-               return $this->mRow->user_name;
-       }
-
-       public function authenticate( $password ) {
-               # This might be wrong if anyone actually uses the UserComparePasswords hook
-               # (on either end), so don't use this if you those are incompatible.
-               return User::comparePasswords( $this->mRow->user_password, $password,
-                       $this->mRow->user_id );
-       }
-
-       public function getPref( $pref ) {
-               # @todo FIXME: Return other prefs too.  Lots of global-riddled code that does
-               # this normally.
-               if ( $pref === 'emailaddress'
-               && $this->row->user_email_authenticated !== null ) {
-                       return $this->mRow->user_email;
-               }
-               return null;
-       }
-
-       /**
-        * @return array
-        */
-       public function getGroups() {
-               # @todo FIXME: Untested.
-               $groups = array();
-               $res = $this->mDb->select(
-                       'user_groups',
-                       'ug_group',
-                       array( 'ug_user' => $this->mRow->user_id ),
-                       __METHOD__
-               );
-               foreach ( $res as $row ) {
-                       $groups[] = $row->ug_group;
-               }
-               return $groups;
-       }
-
-       # TODO: Implement setPref().
-}
diff --git a/includes/extauth/vB.php b/includes/extauth/vB.php
deleted file mode 100644 (file)
index 0565a2e..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-/**
- * External authentication with a vBulletin database.
- *
- * Copyright © 2009 Aryeh Gregor
- *
- * 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
- */
-
-/**
- * This class supports the proprietary vBulletin forum system
- * <http://www.vbulletin.com>, versions 3.5 and up.  It calls no functions or
- * code, only reads from the database.  Example lines to put in
- * LocalSettings.php:
- *
- *   $wgExternalAuthType = 'ExternalUser_vB';
- *   $wgExternalAuthConf = array(
- *       'server' => 'localhost',
- *       'username' => 'forum',
- *       'password' => 'udE,jSqDJ<""p=fI.K9',
- *       'dbname' => 'forum',
- *       'tablePrefix' => '',
- *       'cookieprefix' => 'bb'
- *   );
- *
- * @ingroup ExternalUser
- */
-class ExternalUser_vB extends ExternalUser {
-       private $mRow;
-
-       protected function initFromName( $name ) {
-               return $this->initFromCond( array( 'username' => $name ) );
-       }
-
-       protected function initFromId( $id ) {
-               return $this->initFromCond( array( 'userid' => $id ) );
-       }
-
-       protected function initFromCookie() {
-               # Try using the session table.  It will only have a row if the user has
-               # an active session, so it might not always work, but it's a lot easier
-               # than trying to convince PHP to give us vB's $_SESSION.
-               global $wgExternalAuthConf, $wgRequest;
-               if ( !isset( $wgExternalAuthConf['cookieprefix'] ) ) {
-                       $prefix = 'bb';
-               } else {
-                       $prefix = $wgExternalAuthConf['cookieprefix'];
-               }
-               if ( $wgRequest->getCookie( 'sessionhash', $prefix ) === null ) {
-                       return false;
-               }
-
-               $db = $this->getDb();
-
-               $row = $db->selectRow(
-                       array( 'session', 'user' ),
-                       $this->getFields(),
-                       array(
-                               'session.userid = user.userid',
-                               'sessionhash' => $wgRequest->getCookie( 'sessionhash', $prefix ),
-                       ),
-                       __METHOD__
-               );
-               if ( !$row ) {
-                       return false;
-               }
-               $this->mRow = $row;
-
-               return true;
-       }
-
-       private function initFromCond( $cond ) {
-               $db = $this->getDb();
-
-               $row = $db->selectRow(
-                       'user',
-                       $this->getFields(),
-                       $cond,
-                       __METHOD__
-               );
-               if ( !$row ) {
-                       return false;
-               }
-               $this->mRow = $row;
-
-               return true;
-       }
-
-       private function getDb() {
-               global $wgExternalAuthConf;
-               return DatabaseBase::factory( 'mysql',
-                       array(
-                               'host' => $wgExternalAuthConf['server'],
-                               'user' => $wgExternalAuthConf['username'],
-                               'password' => $wgExternalAuthConf['password'],
-                               'dbname' => $wgExternalAuthConf['dbname'],
-                               'tablePrefix' => $wgExternalAuthConf['tablePrefix'],
-                       )
-               );
-       }
-
-       private function getFields() {
-               return array( 'user.userid', 'username', 'password', 'salt', 'email',
-                       'usergroupid', 'membergroupids' );
-       }
-
-       public function getId() { return $this->mRow->userid; }
-       public function getName() { return $this->mRow->username; }
-
-       public function authenticate( $password ) {
-               # vBulletin seemingly strips whitespace from passwords
-               $password = trim( $password );
-               return $this->mRow->password == md5( md5( $password )
-                       . $this->mRow->salt );
-       }
-
-       public function getPref( $pref ) {
-               if ( $pref == 'emailaddress' && $this->mRow->email ) {
-                       # TODO: only return if validated?
-                       return $this->mRow->email;
-               }
-               return null;
-       }
-
-       public function getGroups() {
-               $groups = array( $this->mRow->usergroupid );
-               $groups = array_merge( $groups, explode( ',', $this->mRow->membergroupids ) );
-               $groups = array_unique( $groups );
-               return $groups;
-       }
-}
index 4ca193d..f5119d5 100644 (file)
@@ -60,7 +60,7 @@ class ExternalStore {
 
                $class = 'ExternalStore' . ucfirst( $proto );
                // Any custom modules should be added to $wgAutoLoadClasses for on-demand loading
-               return MWInit::classExists( $class ) ? new $class( $params ) : false;
+               return class_exists( $class ) ? new $class( $params ) : false;
        }
 
        /**
index 196e7f2..be9c066 100644 (file)
@@ -64,7 +64,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
                        __METHOD__ );
                $id = $dbw->insertId();
                if ( !$id ) {
-                       throw new MWException( __METHOD__.': no insert ID' );
+                       throw new MWException( __METHOD__ . ': no insert ID' );
                }
                if ( $dbw->getFlag( DBO_TRX ) ) {
                        $dbw->commit( __METHOD__ );
@@ -152,7 +152,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
                static $externalBlobCache = array();
 
                $cacheID = ( $itemID === false ) ? "$cluster/$id" : "$cluster/$id/";
-               if( isset( $externalBlobCache[$cacheID] ) ) {
+               if ( isset( $externalBlobCache[$cacheID] ) ) {
                        wfDebugLog( 'ExternalStoreDB-cache', "ExternalStoreDB::fetchBlob cache hit on $cacheID\n" );
                        return $externalBlobCache[$cacheID];
                }
@@ -166,11 +166,11 @@ class ExternalStoreDB extends ExternalStoreMedium {
                        // Try the master
                        $dbw =& $this->getMaster( $cluster );
                        $ret = $dbw->selectField( $this->getTable( $dbw ), 'blob_text', array( 'blob_id' => $id ), __METHOD__ );
-                       if( $ret === false) {
+                       if ( $ret === false ) {
                                wfDebugLog( 'ExternalStoreDB', "ExternalStoreDB::fetchBlob master failed to find $cacheID\n" );
                        }
                }
-               if( $itemID !== false && $ret !== false ) {
+               if ( $itemID !== false && $ret !== false ) {
                        // Unserialise object; caller extracts item
                        $ret = unserialize( $ret );
                }
index c976998..11a5ac9 100644 (file)
@@ -319,7 +319,7 @@ class FSFileBackend extends FileBackendStore {
                        $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
                } else { // immediate write
                        $this->trapWarnings();
-                       $ok = copy( $source, $dest );
+                       $ok = ( $source === $dest ) ? true : copy( $source, $dest );
                        $this->untrapWarnings();
                        // In some cases (at least over NFS), copy() returns true when it fails
                        if ( !$ok || ( filesize( $source ) !== filesize( $dest ) ) ) {
@@ -383,7 +383,7 @@ class FSFileBackend extends FileBackendStore {
                        $status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
                } else { // immediate write
                        $this->trapWarnings();
-                       $ok = rename( $source, $dest );
+                       $ok = ( $source === $dest ) ? true : rename( $source, $dest );
                        $this->untrapWarnings();
                        clearstatcache(); // file no longer at source
                        if ( !$ok ) {
@@ -577,7 +577,7 @@ class FSFileBackend extends FileBackendStore {
                if ( $stat ) {
                        return array(
                                'mtime' => wfTimestamp( TS_MW, $stat['mtime'] ),
-                               'size'  => $stat['size']
+                               'size' => $stat['size']
                        );
                } elseif ( !$hadError ) {
                        return false; // file does not exist
@@ -810,8 +810,9 @@ class FSFileBackend extends FileBackendStore {
         * @param $errno integer
         * @param $errstr string
         * @return bool
+        * @access private
         */
-       private function handleWarning( $errno, $errstr ) {
+       public function handleWarning( $errno, $errstr ) {
                wfDebugLog( 'FSFileBackend', $errstr ); // more detailed error logging
                $this->hadWarningErrors[count( $this->hadWarningErrors ) - 1] = true;
                return true; // suppress from PHP handler
@@ -862,7 +863,7 @@ abstract class FSFileBackendList implements Iterator {
         */
        public function __construct( $dir, array $params ) {
                $path = realpath( $dir ); // normalize
-               if( $path === false ) {
+               if ( $path === false ) {
                        $path = $dir;
                }
                $this->suffixStart = strlen( $path ) + 1; // size of "path/to/dir/"
@@ -963,7 +964,7 @@ abstract class FSFileBackendList implements Iterator {
         */
        protected function getRelPath( $dir ) {
                $path = realpath( $dir );
-               if( $path === false ) {
+               if ( $path === false ) {
                        $path = $dir;
                }
                return strtr( substr( $path, $this->suffixStart ), '\\', '/' );
index 903befc..ab30d30 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
  * @defgroup FileBackend File backend
- * @ingroup  FileRepo
  *
  * File backend is used to interact with file storage systems,
  * such as the local file system, NFS, or cloud storage systems.
@@ -262,17 +261,19 @@ abstract class FileBackend {
         *   - ignoreMissingSource : The operation will simply succeed and do
         *                           nothing if the source file does not exist.
         *   - overwrite           : Any destination file will be overwritten.
-        *   - overwriteSame       : An error will not be given if a file already
-        *                           exists at the destination that has the same
-        *                           contents as the new contents to be written there.
-        *   - headers             : If supplied, the backend will return these headers when
-        *                           GETs/HEADs of the destination file are made. Header values
-        *                           should be smaller than 256 bytes, often options or numbers.
-        *                           Content-Disposition headers can be longer, though the system
-        *                           might ignore or truncate ones that are too long to store.
-        *                           Existing headers will remain, but these will replace any
-        *                           conflicting previous headers, and headers will be removed
-        *                           if they are set to an empty string.
+        *   - overwriteSame       : If a file already exists at the destination with the
+        *                           same contents, then do nothing to the destination file
+        *                           instead of giving an error. This does not compare headers.
+        *                           This option is ignored if 'overwrite' is already provided.
+        *   - headers             : If supplied, the result of merging these headers with any
+        *                           existing source file headers (replacing conflicting ones)
+        *                           will be set as the destination file headers. Headers are
+        *                           deleted if their value is set to the empty string. When a
+        *                           file has headers they are included in responses to GET and
+        *                           HEAD requests to the backing store for that file.
+        *                           Header values should be no larger than 255 bytes, except for
+        *                           Content-Disposition. The system might ignore or truncate any
+        *                           headers that are too long to store (exact limits will vary).
         *                           Backends that don't support metadata ignore this. (since 1.21)
         *
         * $opts is an associative of boolean flags, including:
@@ -313,6 +314,9 @@ abstract class FileBackend {
                if ( empty( $opts['bypassReadOnly'] ) && $this->isReadOnly() ) {
                        return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
                }
+               if ( !count( $ops ) ) {
+                       return Status::newGood(); // nothing to do
+               }
                if ( empty( $opts['force'] ) ) { // sanity
                        unset( $opts['nonLocking'] );
                }
@@ -544,6 +548,9 @@ abstract class FileBackend {
                if ( empty( $opts['bypassReadOnly'] ) && $this->isReadOnly() ) {
                        return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
                }
+               if ( !count( $ops ) ) {
+                       return Status::newGood(); // nothing to do
+               }
                foreach ( $ops as &$op ) {
                        $op['overwrite'] = true; // avoids RTTs in key/value stores
                        if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
@@ -681,6 +688,8 @@ abstract class FileBackend {
         * The 'noAccess' and 'noListing' parameters works the same as in secure(),
         * except they are only applied *if* the directory/container had to be created.
         * These flags should always be set for directories that have private files.
+        * However, setting them is not guaranteed to actually do anything.
+        * Additional server configuration may be needed to achieve the desired effect.
         *
         * @param array $params
         * $params include:
@@ -708,7 +717,9 @@ abstract class FileBackend {
         * the container it belongs to. FS backends might add .htaccess
         * files whereas key/value store backends might revoke container
         * access to the storage user representing end-users in web requests.
-        * This is not guaranteed to actually do anything.
+        *
+        * This is not guaranteed to actually make files or listings publically hidden.
+        * Additional server configuration may be needed to achieve the desired effect.
         *
         * @param array $params
         * $params include:
@@ -738,6 +749,9 @@ abstract class FileBackend {
         * access to the storage user representing end-users in web requests.
         * This essentially can undo the result of secure() calls.
         *
+        * This is not guaranteed to actually make files or listings publically viewable.
+        * Additional server configuration may be needed to achieve the desired effect.
+        *
         * @param array $params
         * $params include:
         *   - dir            : storage directory
@@ -795,7 +809,9 @@ abstract class FileBackend {
        final protected function getScopedPHPBehaviorForOps() {
                if ( php_sapi_name() != 'cli' ) { // http://bugs.php.net/bug.php?id=47540
                        $old = ignore_user_abort( true ); // avoid half-finished operations
-                       return new ScopedCallback( function() use ( $old ) { ignore_user_abort( $old ); } );
+                       return new ScopedCallback( function() use ( $old ) {
+                               ignore_user_abort( $old );
+                       } );
                }
                return null;
        }
@@ -1082,8 +1098,9 @@ abstract class FileBackend {
         *
         * @param $params array
         * $params include:
-        *   - dir     : storage directory
-        *   - topOnly : only return direct child files of the directory (since 1.20)
+        *   - dir        : storage directory
+        *   - topOnly    : only return direct child files of the directory (since 1.20)
+        *   - adviseStat : set to true if stat requests will be made on the files (since 1.22)
         * @return Traversable|Array|null Returns null on failure
         */
        abstract public function getFileList( array $params );
@@ -1096,7 +1113,8 @@ abstract class FileBackend {
         *
         * @param $params array
         * $params include:
-        *   - dir : storage directory
+        *   - dir        : storage directory
+        *   - adviseStat : set to true if stat requests will be made on the files (since 1.22)
         * @return Traversable|Array|null Returns null on failure
         * @since 1.20
         */
index d790a99..672e437 100644 (file)
@@ -95,17 +95,17 @@ class FileBackendGroup {
                                : 0644;
                        // Get the FS backend configuration
                        $autoBackends[] = array(
-                               'name'           => $backendName,
-                               'class'          => 'FSFileBackend',
-                               'lockManager'    => 'fsLockManager',
+                               'name' => $backendName,
+                               'class' => 'FSFileBackend',
+                               'lockManager' => 'fsLockManager',
                                'containerPaths' => array(
-                                       "{$repoName}-public"  => "{$directory}",
-                                       "{$repoName}-thumb"   => $thumbDir,
-                                       "{$repoName}-transcoded"   => $transcodedDir,
+                                       "{$repoName}-public" => "{$directory}",
+                                       "{$repoName}-thumb" => $thumbDir,
+                                       "{$repoName}-transcoded" => $transcodedDir,
                                        "{$repoName}-deleted" => $deletedDir,
-                                       "{$repoName}-temp"    => "{$directory}/temp"
+                                       "{$repoName}-temp" => "{$directory}/temp"
                                ),
-                               'fileMode'       => $fileMode,
+                               'fileMode' => $fileMode,
                        );
                }
 
@@ -135,8 +135,8 @@ class FileBackendGroup {
 
                        unset( $config['class'] ); // backend won't need this
                        $this->backends[$name] = array(
-                               'class'    => $class,
-                               'config'   => $config,
+                               'class' => $class,
+                               'config' => $config,
                                'instance' => null
                        );
                }
index 939315d..60c813b 100644 (file)
@@ -75,6 +75,9 @@ class FileBackendMultiWrite extends FileBackend {
         *   - autoResync     : Automatically resync the clone backends to the master backend
         *                      when pre-operation sync checks fail. This should only be used
         *                      if the master backend is stable and not missing any files.
+        *                      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.
         *
@@ -86,7 +89,9 @@ class FileBackendMultiWrite extends FileBackend {
                $this->syncChecks = isset( $config['syncChecks'] )
                        ? $config['syncChecks']
                        : self::CHECK_SIZE;
-               $this->autoResync = !empty( $config['autoResync'] );
+               $this->autoResync = isset( $config['autoResync'] )
+                       ? $config['autoResync']
+                       : false;
                $this->noPushQuickOps = isset( $config['noPushQuickOps'] )
                        ? $config['noPushQuickOps']
                        : false;
@@ -304,11 +309,11 @@ class FileBackendMultiWrite extends FileBackend {
                $mBackend = $this->backends[$this->masterIndex];
                foreach ( $paths as $path ) {
                        $mPath = $this->substPaths( $path, $mBackend );
-                       $mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
-                       $mExist = $mBackend->fileExists( array( 'src' => $mPath ) );
-                       // Check if the master backend is available...
-                       if ( $mExist === null ) {
+                       $mSha1 = $mBackend->getFileSha1Base36( array( 'src' => $mPath, 'latest' => true ) );
+                       $mStat = $mBackend->getFileStat( array( 'src' => $mPath, 'latest' => true ) );
+                       if ( $mStat === null || ( $mSha1 !== false && !$mStat ) ) { // sanity
                                $status->fatal( 'backend-fail-internal', $this->name );
+                               continue; // file is not available on the master backend...
                        }
                        // Check of all clone backends agree with the master...
                        foreach ( $this->backends as $index => $cBackend ) {
@@ -316,15 +321,31 @@ class FileBackendMultiWrite extends FileBackend {
                                        continue; // master
                                }
                                $cPath = $this->substPaths( $path, $cBackend );
-                               $cSha1 = $cBackend->getFileSha1Base36( array( 'src' => $cPath ) );
+                               $cSha1 = $cBackend->getFileSha1Base36( array( 'src' => $cPath, 'latest' => true ) );
+                               $cStat = $cBackend->getFileStat( array( 'src' => $cPath, 'latest' => true ) );
+                               if ( $cStat === null || ( $cSha1 !== false && !$cStat ) ) { // sanity
+                                       $status->fatal( 'backend-fail-internal', $cBackend->getName() );
+                                       continue; // file is not available on the clone backend...
+                               }
                                if ( $mSha1 === $cSha1 ) {
                                        // already synced; nothing to do
-                               } elseif ( $mSha1 ) { // file is in master
-                                       $fsFile = $mBackend->getLocalReference( array( 'src' => $mPath ) );
+                               } elseif ( $mSha1 !== false ) { // file is in master
+                                       if ( $this->autoResync === 'conservative'
+                                               && $cStat && $cStat['mtime'] > $mStat['mtime'] )
+                                       {
+                                               $status->fatal( 'backend-fail-synced', $path );
+                                               continue; // don't rollback data
+                                       }
+                                       $fsFile = $mBackend->getLocalReference(
+                                               array( 'src' => $mPath, 'latest' => true ) );
                                        $status->merge( $cBackend->quickStore(
                                                array( 'src' => $fsFile->getPath(), 'dst' => $cPath )
                                        ) );
-                               } elseif ( $mExist === false ) { // file is not in master
+                               } elseif ( $mStat === false ) { // file is not in master
+                                       if ( $this->autoResync === 'conservative' ) {
+                                               $status->fatal( 'backend-fail-synced', $path );
+                                               continue; // don't delete data
+                                       }
                                        $status->merge( $cBackend->quickDelete( array( 'src' => $cPath ) ) );
                                }
                        }
@@ -457,7 +478,7 @@ class FileBackendMultiWrite extends FileBackend {
         * @return bool Path container should have dir changes pushed to all backends
         */
        protected function replicateContainerDirChanges( $path ) {
-               list( , $shortCont,  ) = self::splitStoragePath( $path );
+               list( , $shortCont, ) = self::splitStoragePath( $path );
                return !in_array( $shortCont, $this->noPushDirConts );
        }
 
index 1a9ac3b..8b365b5 100644 (file)
@@ -49,6 +49,8 @@ abstract class FileBackendStore extends FileBackend {
        protected $maxFileSize = 4294967296; // integer bytes (4GiB)
 
        const CACHE_TTL = 10; // integer; TTL in seconds for process cache entries
+       const CACHE_CHEAP_SIZE = 300; // integer; max entries in "cheap cache"
+       const CACHE_EXPENSIVE_SIZE = 5; // integer; max entries in "expensive cache"
 
        /**
         * @see FileBackend::__construct()
@@ -58,8 +60,8 @@ abstract class FileBackendStore extends FileBackend {
        public function __construct( array $config ) {
                parent::__construct( $config );
                $this->memCache = new EmptyBagOStuff(); // disabled by default
-               $this->cheapCache = new ProcessCacheLRU( 300 );
-               $this->expensiveCache = new ProcessCacheLRU( 5 );
+               $this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE );
+               $this->expensiveCache = new ProcessCacheLRU( self::CACHE_EXPENSIVE_SIZE );
        }
 
        /**
@@ -276,10 +278,12 @@ abstract class FileBackendStore extends FileBackend {
         */
        protected function doMoveInternal( array $params ) {
                unset( $params['async'] ); // two steps, won't work here :)
+               $nsrc = FileBackend::normalizeStoragePath( $params['src'] );
+               $ndst = FileBackend::normalizeStoragePath( $params['dst'] );
                // Copy source to dest
                $status = $this->copyInternal( $params );
-               if ( $status->isOK() ) {
-                       // Delete source (only fails due to races or medium going down)
+               if ( $nsrc !== $ndst && $status->isOK() ) {
+                       // Delete source (only fails due to races or network problems)
                        $status->merge( $this->deleteInternal( array( 'src' => $params['src'] ) ) );
                        $status->setResult( true, $status->value ); // ignore delete() errors
                }
@@ -303,9 +307,13 @@ abstract class FileBackendStore extends FileBackend {
        final public function describeInternal( array $params ) {
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-' . $this->name );
-               $status = $this->doDescribeInternal( $params );
-               $this->clearCache( array( $params['src'] ) );
-               $this->deleteFileCache( $params['src'] ); // persistent cache
+               if ( count( $params['headers'] ) ) {
+                       $status = $this->doDescribeInternal( $params );
+                       $this->clearCache( array( $params['src'] ) );
+                       $this->deleteFileCache( $params['src'] ); // persistent cache
+               } else {
+                       $status = Status::newGood(); // nothing to do
+               }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
                return $status;
@@ -693,6 +701,8 @@ abstract class FileBackendStore extends FileBackend {
                        }
                } elseif ( $stat === false ) { // file does not exist
                        $this->cheapCache->set( $path, 'stat', $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
+                       $this->cheapCache->set( $path, 'sha1', // the SHA-1 must be false too
+                               array( 'hash' => false, 'latest' => $latest ) );
                        wfDebug( __METHOD__ . ": File $path does not exist.\n" );
                } else { // an error occurred
                        wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
@@ -1052,13 +1062,13 @@ abstract class FileBackendStore extends FileBackend {
         */
        final public function getOperationsInternal( array $ops ) {
                $supportedOps = array(
-                       'store'    => 'StoreFileOp',
-                       'copy'     => 'CopyFileOp',
-                       'move'     => 'MoveFileOp',
-                       'delete'   => 'DeleteFileOp',
-                       'create'   => 'CreateFileOp',
+                       'store' => 'StoreFileOp',
+                       'copy' => 'CopyFileOp',
+                       'move' => 'MoveFileOp',
+                       'delete' => 'DeleteFileOp',
+                       'create' => 'CreateFileOp',
                        'describe' => 'DescribeFileOp',
-                       'null'     => 'NullFileOp'
+                       'null' => 'NullFileOp'
                );
 
                $performOps = array(); // array of FileOp objects
@@ -1183,7 +1193,7 @@ abstract class FileBackendStore extends FileBackend {
                $this->clearCache();
 
                $supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'null' );
-               $async = ( $this->parallelize === 'implicit' );
+               $async = ( $this->parallelize === 'implicit' && count( $ops ) > 1 );
                $maxConcurrency = $this->concurrency; // throttle
 
                $statuses = array(); // array of (index => Status)
@@ -1246,8 +1256,12 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Given a non-FileBackendStoreOpHandle object." );
                        } elseif ( $fileOpHandle->backend->getName() !== $this->getName() ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "Given a FileBackendStoreOpHandle for the wrong backend." );
                        }
                }
@@ -1407,7 +1421,13 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Like resolveStoragePath() except null values are returned if
-        * the container is sharded and the shard could not be determined.
+        * the container is sharded and the shard could not be determined
+        * or if the path ends with '/'. The later case is illegal for FS
+        * backends and can confuse listings for object store backends.
+        *
+        * This function is used when resolving paths that must be valid
+        * locations for files. Directory and listing functions should
+        * generally just use resolveStoragePath() instead.
         *
         * @see FileBackendStore::resolveStoragePath()
         *
@@ -1416,7 +1436,7 @@ abstract class FileBackendStore extends FileBackend {
         */
        final protected function resolveStoragePathReal( $storagePath ) {
                list( $container, $relPath, $cShard ) = $this->resolveStoragePath( $storagePath );
-               if ( $cShard !== null ) {
+               if ( $cShard !== null && substr( $relPath, -1 ) !== '/' ) {
                        return array( $container, $relPath );
                }
                return array( null, null );
@@ -1565,10 +1585,11 @@ abstract class FileBackendStore extends FileBackend {
         * Set the cached info for a container
         *
         * @param string $container Resolved container name
-        * @param $val mixed Information to cache
+        * @param array $val Information to cache
+        * @return void
         */
-       final protected function setContainerCache( $container, $val ) {
-               $this->memCache->add( $this->containerCacheKey( $container ), $val, 14*86400 );
+       final protected function setContainerCache( $container, array $val ) {
+               $this->memCache->add( $this->containerCacheKey( $container ), $val, 14 * 86400 );
        }
 
        /**
@@ -1576,6 +1597,7 @@ abstract class FileBackendStore extends FileBackend {
         * The cache key is salted for a while to prevent race conditions.
         *
         * @param string $container Resolved container name
+        * @return void
         */
        final protected function deleteContainerCache( $container ) {
                if ( !$this->memCache->set( $this->containerCacheKey( $container ), 'PURGED', 300 ) ) {
@@ -1656,14 +1678,17 @@ abstract class FileBackendStore extends FileBackend {
         * salting for the case when a file is created at a path were there was none before.
         *
         * @param string $path Storage path
-        * @param $val mixed Information to cache
+        * @param array $val Stat information to cache
+        * @return void
         */
-       final protected function setFileCache( $path, $val ) {
+       final protected function setFileCache( $path, array $val ) {
                $path = FileBackend::normalizeStoragePath( $path );
                if ( $path === null ) {
                        return; // invalid storage path
                }
-               $this->memCache->add( $this->fileCacheKey( $path ), $val, 7*86400 );
+               $age = time() - wfTimestamp( TS_UNIX, $val['mtime'] );
+               $ttl = min( 7 * 86400, max( 300, floor( .1 * $age ) ) );
+               $this->memCache->add( $this->fileCacheKey( $path ), $val, $ttl );
        }
 
        /**
@@ -1673,6 +1698,7 @@ abstract class FileBackendStore extends FileBackend {
         * a file is created at a path were there was none before.
         *
         * @param string $path Storage path
+        * @return void
         */
        final protected function deleteFileCache( $path ) {
                $path = FileBackend::normalizeStoragePath( $path );
@@ -1788,21 +1814,15 @@ abstract class FileBackendStoreOpHandle {
  *
  * @ingroup FileBackend
  */
-abstract class FileBackendStoreShardListIterator implements Iterator {
+abstract class FileBackendStoreShardListIterator extends FilterIterator {
        /** @var FileBackendStore */
        protected $backend;
        /** @var Array */
        protected $params;
-       /** @var Array */
-       protected $shardSuffixes;
+
        protected $container; // string; full container name
        protected $directory; // string; resolved relative path
 
-       /** @var Traversable */
-       protected $iter;
-       protected $curShard = 0; // integer
-       protected $pos = 0; // integer
-
        /** @var Array */
        protected $multiShardPaths = array(); // (rel path => 1)
 
@@ -1819,142 +1839,56 @@ abstract class FileBackendStoreShardListIterator implements Iterator {
                $this->backend = $backend;
                $this->container = $container;
                $this->directory = $dir;
-               $this->shardSuffixes = $suffixes;
                $this->params = $params;
-       }
-
-       /**
-        * @see Iterator::key()
-        * @return integer
-        */
-       public function key() {
-               return $this->pos;
-       }
 
-       /**
-        * @see Iterator::valid()
-        * @return bool
-        */
-       public function valid() {
-               if ( $this->iter instanceof Iterator ) {
-                       return $this->iter->valid();
-               } elseif ( is_array( $this->iter ) ) {
-                       return ( current( $this->iter ) !== false ); // no paths can have this value
+               $iter = new AppendIterator();
+               foreach ( $suffixes as $suffix ) {
+                       $iter->append( $this->listFromShard( $this->container . $suffix ) );
                }
-               return false; // some failure?
-       }
-
-       /**
-        * @see Iterator::current()
-        * @return string|bool String or false
-        */
-       public function current() {
-               return ( $this->iter instanceof Iterator )
-                       ? $this->iter->current()
-                       : current( $this->iter );
-       }
-
-       /**
-        * @see Iterator::next()
-        * @return void
-        */
-       public function next() {
-               ++$this->pos;
-               ( $this->iter instanceof Iterator ) ? $this->iter->next() : next( $this->iter );
-               do {
-                       $continue = false; // keep scanning shards?
-                       $this->filterViaNext(); // filter out duplicates
-                       // Find the next non-empty shard if no elements are left
-                       if ( !$this->valid() ) {
-                               $this->nextShardIteratorIfNotValid();
-                               $continue = $this->valid(); // re-filter unless we ran out of shards
-                       }
-               } while ( $continue );
-       }
 
-       /**
-        * @see Iterator::rewind()
-        * @return void
-        */
-       public function rewind() {
-               $this->pos = 0;
-               $this->curShard = 0;
-               $this->setIteratorFromCurrentShard();
-               do {
-                       $continue = false; // keep scanning shards?
-                       $this->filterViaNext(); // filter out duplicates
-                       // Find the next non-empty shard if no elements are left
-                       if ( !$this->valid() ) {
-                               $this->nextShardIteratorIfNotValid();
-                               $continue = $this->valid(); // re-filter unless we ran out of shards
-                       }
-               } while ( $continue );
+               parent::__construct( $iter );
        }
 
-       /**
-        * Filter out duplicate items by advancing to the next ones
-        */
-       protected function filterViaNext() {
-               while ( $this->valid() ) {
-                       $rel = $this->iter->current(); // path relative to given directory
-                       $path = $this->params['dir'] . "/{$rel}"; // full storage path
-                       if ( $this->backend->isSingleShardPathInternal( $path ) ) {
-                               break; // path is only on one shard; no issue with duplicates
-                       } elseif ( isset( $this->multiShardPaths[$rel] ) ) {
-                               // Don't keep listing paths that are on multiple shards
-                               ( $this->iter instanceof Iterator ) ? $this->iter->next() : next( $this->iter );
-                       } else {
-                               $this->multiShardPaths[$rel] = 1;
-                               break;
-                       }
-               }
-       }
-
-       /**
-        * If the list iterator for this container shard is out of items,
-        * then move on to the next container that has items.
-        * If there are none, then it advances to the last container.
-        */
-       protected function nextShardIteratorIfNotValid() {
-               while ( !$this->valid() && ++$this->curShard < count( $this->shardSuffixes ) ) {
-                       $this->setIteratorFromCurrentShard();
+       public function accept() {
+               $rel = $this->getInnerIterator()->current(); // path relative to given directory
+               $path = $this->params['dir'] . "/{$rel}"; // full storage path
+               if ( $this->backend->isSingleShardPathInternal( $path ) ) {
+                       return true; // path is only on one shard; no issue with duplicates
+               } elseif ( isset( $this->multiShardPaths[$rel] ) ) {
+                       // Don't keep listing paths that are on multiple shards
+                       return false;
+               } else {
+                       $this->multiShardPaths[$rel] = 1;
+                       return true;
                }
        }
 
-       /**
-        * Set the list iterator to that of the current container shard
-        */
-       protected function setIteratorFromCurrentShard() {
-               $this->iter = $this->listFromShard(
-                       $this->container . $this->shardSuffixes[$this->curShard],
-                       $this->directory, $this->params );
-               // Start loading results so that current() works
-               if ( $this->iter ) {
-                       ( $this->iter instanceof Iterator ) ? $this->iter->rewind() : reset( $this->iter );
-               }
+       public function rewind() {
+               parent::rewind();
+               $this->multiShardPaths = array();
        }
 
        /**
         * Get the list for a given container shard
         *
         * @param string $container Resolved container name
-        * @param string $dir Resolved path relative to container
-        * @param array $params
-        * @return Traversable|Array|null
+        * @return Iterator
         */
-       abstract protected function listFromShard( $container, $dir, array $params );
+       abstract protected function listFromShard( $container );
 }
 
 /**
  * Iterator for listing directories
  */
 class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator {
-       /**
-        * @see FileBackendStoreShardListIterator::listFromShard()
-        * @return Array|null|Traversable
-        */
-       protected function listFromShard( $container, $dir, array $params ) {
-               return $this->backend->getDirectoryListInternal( $container, $dir, $params );
+       protected function listFromShard( $container ) {
+               $list = $this->backend->getDirectoryListInternal(
+                       $container, $this->directory, $this->params );
+               if ( $list === null ) {
+                       return new ArrayIterator( array() );
+               } else {
+                       return is_array( $list ) ? new ArrayIterator( $list ) : $list;
+               }
        }
 }
 
@@ -1962,11 +1896,13 @@ class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator
  * Iterator for listing regular files
  */
 class FileBackendStoreShardFileIterator extends FileBackendStoreShardListIterator {
-       /**
-        * @see FileBackendStoreShardListIterator::listFromShard()
-        * @return Array|null|Traversable
-        */
-       protected function listFromShard( $container, $dir, array $params ) {
-               return $this->backend->getFileListInternal( $container, $dir, $params );
+       protected function listFromShard( $container ) {
+               $list = $this->backend->getFileListInternal(
+                       $container, $this->directory, $this->params );
+               if ( $list === null ) {
+                       return new ArrayIterator( array() );
+               } else {
+                       return is_array( $list ) ? new ArrayIterator( $list ) : $list;
+               }
        }
 }
index e019324..e4059d7 100644 (file)
@@ -46,7 +46,7 @@ abstract class FileOp {
 
        protected $doOperation = true; // boolean; operation is not a no-op
        protected $sourceSha1; // string
-       protected $destSameAsSource; // boolean
+       protected $overwriteSameCase; // boolean
        protected $destExists; // boolean
 
        /* Object life-cycle */
@@ -55,7 +55,7 @@ abstract class FileOp {
        const STATE_ATTEMPTED = 3;
 
        /**
-        * Build a new file operation transaction
+        * Build a new batch file operation transaction
         *
         * @param $backend FileBackendStore
         * @param $params Array
@@ -64,8 +64,10 @@ abstract class FileOp {
        final public function __construct( FileBackendStore $backend, array $params ) {
                $this->backend = $backend;
                list( $required, $optional ) = $this->allowedParams();
+               // @todo normalizeAnyStoragePaths() calls are overzealous, use a parameter list
                foreach ( $required as $name ) {
                        if ( isset( $params[$name] ) ) {
+                               // Normalize paths so the paths to the same file have the same string
                                $this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
                        } else {
                                throw new MWException( "File operation missing parameter '$name'." );
@@ -73,6 +75,7 @@ abstract class FileOp {
                }
                foreach ( $optional as $name ) {
                        if ( isset( $params[$name] ) ) {
+                               // Normalize paths so the paths to the same file have the same string
                                $this->params[$name] = self::normalizeAnyStoragePaths( $params[$name] );
                        }
                }
@@ -209,22 +212,22 @@ abstract class FileOp {
                $pathsUsed = array_merge( $this->storagePathsRead(), $this->storagePathsChanged() );
                foreach ( array_unique( $pathsUsed ) as $path ) {
                        $nullEntries[] = array( // assertion for recovery
-                               'op'      => 'null',
-                               'path'    => $path,
+                               'op' => 'null',
+                               'path' => $path,
                                'newSha1' => $this->fileSha1( $path, $oPredicates )
                        );
                }
                foreach ( $this->storagePathsChanged() as $path ) {
                        if ( $nPredicates['sha1'][$path] === false ) { // deleted
                                $deleteEntries[] = array(
-                                       'op'      => 'delete',
-                                       'path'    => $path,
+                                       'op' => 'delete',
+                                       'path' => $path,
                                        'newSha1' => ''
                                );
                        } else { // created/updated
                                $updateEntries[] = array(
-                                       'op'      => $this->fileExists( $path, $oPredicates ) ? 'update' : 'create',
-                                       'path'    => $path,
+                                       'op' => $this->fileExists( $path, $oPredicates ) ? 'update' : 'create',
+                                       'path' => $path,
                                        'newSha1' => $nPredicates['sha1'][$path]
                                );
                        }
@@ -341,7 +344,7 @@ abstract class FileOp {
 
        /**
         * Check for errors with regards to the destination file already existing.
-        * Also set the destExists, destSameAsSource and sourceSha1 member variables.
+        * Also set the destExists, overwriteSameCase and sourceSha1 member variables.
         * A bad status will be returned if there is no chance it can be overwritten.
         *
         * @param $predicates Array
@@ -354,7 +357,7 @@ abstract class FileOp {
                if ( $this->sourceSha1 === null ) { // file in storage?
                        $this->sourceSha1 = $this->fileSha1( $this->params['src'], $predicates );
                }
-               $this->destSameAsSource = false;
+               $this->overwriteSameCase = false;
                $this->destExists = $this->fileExists( $this->params['dst'], $predicates );
                if ( $this->destExists ) {
                        if ( $this->getParam( 'overwrite' ) ) {
@@ -368,7 +371,7 @@ abstract class FileOp {
                                        // Give an error if the files are not identical
                                        $status->fatal( 'backend-fail-notsame', $this->params['dst'] );
                                } else {
-                                       $this->destSameAsSource = true; // OK
+                                       $this->overwriteSameCase = true; // OK
                                }
                                return $status; // do nothing; either OK or bad status
                        } else {
@@ -489,7 +492,7 @@ class CreateFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               if ( !$this->destSameAsSource ) {
+               if ( !$this->overwriteSameCase ) {
                        // Create the file at the destination
                        return $this->backend->createInternal( $this->setFlags( $this->params ) );
                }
@@ -561,8 +564,8 @@ class StoreFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               // Store the file at the destination
-               if ( !$this->destSameAsSource ) {
+               if ( !$this->overwriteSameCase ) {
+                       // Store the file at the destination
                        return $this->backend->storeInternal( $this->setFlags( $this->params ) );
                }
                return Status::newGood();
@@ -638,14 +641,19 @@ class CopyFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               // Do nothing if the src/dst paths are the same
-               if ( $this->params['src'] !== $this->params['dst'] ) {
-                       // Copy the file into the destination
-                       if ( !$this->destSameAsSource ) {
-                               return $this->backend->copyInternal( $this->setFlags( $this->params ) );
-                       }
+               if ( $this->overwriteSameCase ) {
+                       $status = Status::newGood(); // nothing to do
+               } elseif ( $this->params['src'] === $this->params['dst'] ) {
+                       // Just update the destination file headers
+                       $headers = $this->getParam( 'headers' ) ?: array();
+                       $status = $this->backend->describeInternal( $this->setFlags( array(
+                               'src' => $this->params['dst'], 'headers' => $headers
+                       ) ) );
+               } else {
+                       // Copy the file to the destination
+                       $status = $this->backend->copyInternal( $this->setFlags( $this->params ) );
                }
-               return Status::newGood();
+               return $status;
        }
 
        /**
@@ -717,18 +725,27 @@ class MoveFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               // Do nothing if the src/dst paths are the same
-               if ( $this->params['src'] !== $this->params['dst'] ) {
-                       if ( !$this->destSameAsSource ) {
-                               // Move the file into the destination
-                               return $this->backend->moveInternal( $this->setFlags( $this->params ) );
+               if ( $this->overwriteSameCase ) {
+                       if ( $this->params['src'] === $this->params['dst'] ) {
+                               // Do nothing to the destination (which is also the source)
+                               $status = Status::newGood();
                        } else {
-                               // Just delete source as the destination needs no changes
-                               $params = array( 'src' => $this->params['src'] );
-                               return $this->backend->deleteInternal( $this->setFlags( $params ) );
+                               // Just delete the source as the destination file needs no changes
+                               $status = $this->backend->deleteInternal( $this->setFlags(
+                                       array( 'src' => $this->params['src'] )
+                               ) );
                        }
+               } elseif ( $this->params['src'] === $this->params['dst'] ) {
+                       // Just update the destination file headers
+                       $headers = $this->getParam( 'headers' ) ?: array();
+                       $status = $this->backend->describeInternal( $this->setFlags(
+                               array( 'src' => $this->params['dst'], 'headers' => $headers )
+                       ) );
+               } else {
+                       // Move the file to the destination
+                       $status = $this->backend->moveInternal( $this->setFlags( $this->params ) );
                }
-               return Status::newGood();
+               return $status;
        }
 
        /**
index aadad5c..f9e2ce4 100644 (file)
@@ -104,7 +104,7 @@ class SwiftFileBackend extends FileBackendStore {
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
-               if ( !MWInit::classExists( 'CF_Constants' ) ) {
+               if ( !class_exists( 'CF_Constants' ) ) {
                        throw new MWException( 'SwiftCloudFiles extension not installed.' );
                }
                // Required settings
@@ -132,7 +132,7 @@ class SwiftFileBackend extends FileBackendStore {
                        : false;
                $this->swiftCDNExpiry = isset( $config['swiftCDNExpiry'] )
                        ? $config['swiftCDNExpiry']
-                       : 12*3600; // 12 hours is safe (tokens last 24 hours per http://docs.openstack.org)
+                       : 12 * 3600; // 12 hours is safe (tokens last 24 hours per http://docs.openstack.org)
                $this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
                        ? $config['swiftCDNPurgable']
                        : true;
@@ -807,8 +807,8 @@ class SwiftFileBackend extends FileBackendStore {
                        $stat = array(
                                // Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
                                'mtime' => wfTimestamp( TS_MW, $srcObj->last_modified ),
-                               'size'  => (int)$srcObj->content_length,
-                               'sha1'  => $srcObj->getMetadataValue( 'Sha1base36' )
+                               'size' => (int)$srcObj->content_length,
+                               'sha1' => $srcObj->getMetadataValue( 'Sha1base36' )
                        );
                } catch ( NoSuchContainerException $e ) {
                } catch ( NoSuchObjectException $e ) {
@@ -968,23 +968,23 @@ class SwiftFileBackend extends FileBackendStore {
         * @param string $dir Resolved storage directory with no trailing slash
         * @param string|null $after Storage path of file to list items after
         * @param $limit integer Max number of items to list
-        * @param array $params Includes flag for 'topOnly'
-        * @return Array List of relative paths of dirs directly under $dir
+        * @param array $params Parameters for getDirectoryList()
+        * @return Array List of resolved paths of directories directly under $dir
         */
        public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
                $dirs = array();
                if ( $after === INF ) {
                        return $dirs; // nothing more
                }
-               wfProfileIn( __METHOD__ . '-' . $this->name );
 
+               wfProfileIn( __METHOD__ . '-' . $this->name );
                try {
                        $container = $this->getContainer( $fullCont );
                        $prefix = ( $dir == '' ) ? null : "{$dir}/";
                        // Non-recursive: only list dirs right under $dir
                        if ( !empty( $params['topOnly'] ) ) {
                                $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
-                               foreach ( $objects as $object ) { // files and dirs
+                               foreach ( $objects as $object ) { // files and directories
                                        if ( substr( $object, -1 ) === '/' ) {
                                                $dirs[] = $object; // directories end in '/'
                                        }
@@ -1015,6 +1015,7 @@ class SwiftFileBackend extends FileBackendStore {
                                        }
                                }
                        }
+                       // Page on the unfiltered directory listing (what is returned may be filtered)
                        if ( count( $objects ) < $limit ) {
                                $after = INF; // avoid a second RTT
                        } else {
@@ -1025,8 +1026,8 @@ class SwiftFileBackend extends FileBackendStore {
                        $this->handleException( $e, null, __METHOD__,
                                array( 'cont' => $fullCont, 'dir' => $dir ) );
                }
-
                wfProfileOut( __METHOD__ . '-' . $this->name );
+
                return $dirs;
        }
 
@@ -1041,32 +1042,47 @@ class SwiftFileBackend extends FileBackendStore {
         * @param string $dir Resolved storage directory with no trailing slash
         * @param string|null $after Storage path of file to list items after
         * @param $limit integer Max number of items to list
-        * @param array $params Includes flag for 'topOnly'
-        * @return Array List of relative paths of files under $dir
+        * @param array $params Parameters for getDirectoryList()
+        * @return Array List of resolved paths of files under $dir
         */
        public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
                $files = array();
                if ( $after === INF ) {
                        return $files; // nothing more
                }
-               wfProfileIn( __METHOD__ . '-' . $this->name );
 
+               wfProfileIn( __METHOD__ . '-' . $this->name );
                try {
                        $container = $this->getContainer( $fullCont );
                        $prefix = ( $dir == '' ) ? null : "{$dir}/";
                        // Non-recursive: only list files right under $dir
                        if ( !empty( $params['topOnly'] ) ) { // files and dirs
-                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
-                               foreach ( $objects as $object ) {
-                                       if ( substr( $object, -1 ) !== '/' ) {
-                                               $files[] = $object; // directories end in '/'
+                               if ( !empty( $params['adviseStat'] ) ) {
+                                       $limit = min( $limit, self::CACHE_CHEAP_SIZE );
+                                       // Note: get_objects() does not include directories
+                                       $objects = $this->loadObjectListing( $params, $dir,
+                                               $container->get_objects( $limit, $after, $prefix, null, '/' ) );
+                                       $files = $objects;
+                               } else {
+                                       $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+                                       foreach ( $objects as $object ) { // files and directories
+                                               if ( substr( $object, -1 ) !== '/' ) {
+                                                       $files[] = $object; // directories end in '/'
+                                               }
                                        }
                                }
                        // Recursive: list all files under $dir and its subdirs
                        } else { // files
-                               $objects = $container->list_objects( $limit, $after, $prefix );
+                               if ( !empty( $params['adviseStat'] ) ) {
+                                       $limit = min( $limit, self::CACHE_CHEAP_SIZE );
+                                       $objects = $this->loadObjectListing( $params, $dir,
+                                               $container->get_objects( $limit, $after, $prefix ) );
+                               } else {
+                                       $objects = $container->list_objects( $limit, $after, $prefix );
+                               }
                                $files = $objects;
                        }
+                       // Page on the unfiltered object listing (what is returned may be filtered)
                        if ( count( $objects ) < $limit ) {
                                $after = INF; // avoid a second RTT
                        } else {
@@ -1077,11 +1093,38 @@ class SwiftFileBackend extends FileBackendStore {
                        $this->handleException( $e, null, __METHOD__,
                                array( 'cont' => $fullCont, 'dir' => $dir ) );
                }
-
                wfProfileOut( __METHOD__ . '-' . $this->name );
+
                return $files;
        }
 
+       /**
+        * Load a list of objects that belong under $dir into stat cache
+        * and return a list of the names of the objects in the same order.
+        *
+        * @param array $params Parameters for getDirectoryList()
+        * @param string $dir Resolved container directory path
+        * @param array $cfObjects List of CF_Object items
+        * @return array List of object names
+        */
+       private function loadObjectListing( array $params, $dir, array $cfObjects ) {
+               $names = array();
+               $storageDir = rtrim( $params['dir'], '/' );
+               $suffixStart = ( $dir === '' ) ? 0 : strlen( $dir ) + 1; // size of "path/to/dir/"
+               foreach ( $cfObjects as $object ) {
+                       $path = "{$storageDir}/" . substr( $object->name, $suffixStart );
+                       $val = array(
+                               // Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
+                               'mtime'  => wfTimestamp( TS_MW, $object->last_modified ),
+                               'size'   => (int)$object->content_length,
+                               'latest' => false // eventually consistent
+                       );
+                       $this->cheapCache->set( $path, 'stat', $val );
+                       $names[] = $object->name;
+               }
+               return $names;
+       }
+
        /**
         * @see FileBackendStore::doGetFileSha1base36()
         * @return bool
@@ -1089,6 +1132,11 @@ class SwiftFileBackend extends FileBackendStore {
        protected function doGetFileSha1base36( array $params ) {
                $stat = $this->getFileStat( $params );
                if ( $stat ) {
+                       if ( !isset( $stat['sha1'] ) ) {
+                               // Stat entries filled by file listings don't include SHA1
+                               $this->clearCache( array( $params['src'] ) );
+                               $stat = $this->getFileStat( $params );
+                       }
                        return $stat['sha1'];
                } else {
                        return false;
@@ -1239,8 +1287,8 @@ class SwiftFileBackend extends FileBackendStore {
                                                str_replace( '/swift/v1', '', // S3 API is the rgw default
                                                        $sContObj->cfs_http->getStorageUrl() . $spath ),
                                                array(
-                                                       'Signature'      => $signature,
-                                                       'Expires'        => $expires,
+                                                       'Signature' => $signature,
+                                                       'Expires' => $expires,
                                                        'AWSAccessKeyId' => $this->rgwS3AccessKey )
                                        );
                                }
@@ -1316,7 +1364,7 @@ class SwiftFileBackend extends FileBackendStore {
         *                           matches the expression and the request is not for a listing.
         *                           Setting this to '*' effectively makes a container public.
         *   -".rlistings:<regex>" : Grants access if the request is from a referrer host that
-        *                           matches the expression and the request for a listing.
+        *                           matches the expression and the request is for a listing.
         *
         * $writeGrps is a list of the possible criteria for a request to have
         * access to write to a container. Each item is of the following format:
@@ -1397,12 +1445,12 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( is_array( $creds ) ) { // cache hit
                                $this->auth->load_cached_credentials(
                                        $creds['auth_token'], $creds['storage_url'], $creds['cdnm_url'] );
-                               $this->sessionStarted = time() - ceil( $this->authTTL/2 ); // skew for worst case
+                               $this->sessionStarted = time() - ceil( $this->authTTL / 2 ); // skew for worst case
                        } else { // cache miss
                                try {
                                        $this->auth->authenticate();
                                        $creds = $this->auth->export_credentials();
-                                       $this->srvCache->add( $cacheKey, $creds, ceil( $this->authTTL/2 ) ); // cache
+                                       $this->srvCache->add( $cacheKey, $creds, ceil( $this->authTTL / 2 ) ); // cache
                                        $this->sessionStarted = time();
                                } catch ( CloudFilesException $e ) {
                                        $this->connException = $e; // don't keep re-trying
index 73f29a9..9250aa5 100644 (file)
@@ -65,11 +65,11 @@ class DBFileJournal extends FileJournal {
                foreach ( $entries as $entry ) {
                        $data[] = array(
                                'fj_batch_uuid' => $batchId,
-                               'fj_backend'    => $this->backend,
-                               'fj_op'         => $entry['op'],
-                               'fj_path'       => $entry['path'],
-                               'fj_new_sha1'   => $entry['newSha1'],
-                               'fj_timestamp'  => $dbw->timestamp( $now )
+                               'fj_backend' => $this->backend,
+                               'fj_op' => $entry['op'],
+                               'fj_path' => $entry['path'],
+                               'fj_new_sha1' => $entry['newSha1'],
+                               'fj_timestamp' => $dbw->timestamp( $now )
                        );
                }
 
index f02387d..e081987 100644 (file)
@@ -369,7 +369,9 @@ class PostgreSqlLockManager extends DBLockManager {
 
                $db = $this->getConnection( $lockSrv ); // checked in isServerUp()
                $bigints = array_unique( array_map(
-                       function( $key ) { return wfBaseConvert( substr( $key, 0, 15 ), 16, 10 ); },
+                       function( $key ) {
+                               return wfBaseConvert( substr( $key, 0, 15 ), 16, 10 );
+                       },
                        array_map( array( $this, 'sha1Base16Absolute' ), $paths )
                ) );
 
index 0512a01..f0e54ec 100644 (file)
@@ -56,7 +56,7 @@ abstract class LockManager {
        protected $domain; // string; domain (usually wiki ID)
        protected $lockTTL; // integer; maximum time locks can be held
 
-       /* Lock types; stronger locks have higher values */
+       /** Lock types; stronger locks have higher values */
        const LOCK_SH = 1; // shared lock (for reads)
        const LOCK_UW = 2; // shared lock (for reads used to write elsewhere)
        const LOCK_EX = 3; // exclusive lock (for writes)
@@ -76,10 +76,10 @@ abstract class LockManager {
                if ( isset( $config['lockTTL'] ) ) {
                        $this->lockTTL = max( 1, $config['lockTTL'] );
                } elseif ( PHP_SAPI === 'cli' ) {
-                       $this->lockTTL = 2*3600;
+                       $this->lockTTL = 2 * 3600;
                } else {
                        $met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
-                       $this->lockTTL = max( 5*60, 2*(int)$met );
+                       $this->lockTTL = max( 5 * 60, 2 * (int)$met );
                }
        }
 
@@ -88,11 +88,36 @@ abstract class LockManager {
         *
         * @param array $paths List of resource names
         * @param $type integer LockManager::LOCK_* constant
+        * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.21)
         * @return Status
         */
-       final public function lock( array $paths, $type = self::LOCK_EX ) {
+       final public function lock( array $paths, $type = self::LOCK_EX, $timeout = 0 ) {
+               return $this->lockByType( array( $type => $paths ), $timeout );
+       }
+
+       /**
+        * Lock the resources at the given abstract paths
+        *
+        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.21)
+        * @return Status
+        * @since 1.22
+        */
+       final public function lockByType( array $pathsByType, $timeout = 0 ) {
                wfProfileIn( __METHOD__ );
-               $status = $this->doLock( array_unique( $paths ), $this->lockTypeMap[$type] );
+               $status = Status::newGood();
+               $pathsByType = $this->normalizePathsByType( $pathsByType );
+               $msleep = array( 0, 50, 100, 300, 500 ); // retry backoff times
+               $start = microtime( true );
+               do {
+                       $status = $this->doLockByType( $pathsByType );
+                       $elapsed = microtime( true ) - $start;
+                       if ( $status->isOK() || $elapsed >= $timeout || $elapsed < 0 ) {
+                               break; // success, timeout, or clock set back
+                       }
+                       usleep( 1e3 * ( next( $msleep ) ?: 1000 ) ); // use 1 sec after enough times
+                       $elapsed = microtime( true ) - $start;
+               } while ( $elapsed < $timeout && $elapsed >= 0 );
                wfProfileOut( __METHOD__ );
                return $status;
        }
@@ -105,8 +130,20 @@ abstract class LockManager {
         * @return Status
         */
        final public function unlock( array $paths, $type = self::LOCK_EX ) {
+               return $this->unlockByType( array( $type => $paths ) );
+       }
+
+       /**
+        * Unlock the resources at the given abstract paths
+        *
+        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @return Status
+        * @since 1.22
+        */
+       final public function unlockByType( array $pathsByType ) {
                wfProfileIn( __METHOD__ );
-               $status = $this->doUnlock( array_unique( $paths ), $this->lockTypeMap[$type] );
+               $pathsByType = $this->normalizePathsByType( $pathsByType );
+               $status = $this->doUnlockByType( $pathsByType );
                wfProfileOut( __METHOD__ );
                return $status;
        }
@@ -135,21 +172,75 @@ abstract class LockManager {
                return sha1( "{$this->domain}:{$path}" );
        }
 
+       /**
+        * Normalize the $paths array by converting LOCK_UW locks into the
+        * appropriate type and removing any duplicated paths for each lock type.
+        *
+        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @return Array
+        * @since 1.22
+        */
+       final protected function normalizePathsByType( array $pathsByType ) {
+               $res = array();
+               foreach ( $pathsByType as $type => $paths ) {
+                       $res[$this->lockTypeMap[$type]] = array_unique( $paths );
+               }
+               return $res;
+       }
+
+       /**
+        * @see LockManager::lockByType()
+        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @return Status
+        * @since 1.22
+        */
+       protected function doLockByType( array $pathsByType ) {
+               $status = Status::newGood();
+               $lockedByType = array(); // map of (type => paths)
+               foreach ( $pathsByType as $type => $paths ) {
+                       $status->merge( $this->doLock( $paths, $type ) );
+                       if ( $status->isOK() ) {
+                               $lockedByType[$type] = $paths;
+                       } else {
+                               // Release the subset of locks that were acquired
+                               foreach ( $lockedByType as $type => $paths ) {
+                                       $status->merge( $this->doUnlock( $paths, $type ) );
+                               }
+                               break;
+                       }
+               }
+               return $status;
+       }
+
        /**
         * Lock resources with the given keys and lock type
         *
         * @param array $paths List of storage paths
         * @param $type integer LockManager::LOCK_* constant
-        * @return string
+        * @return Status
         */
        abstract protected function doLock( array $paths, $type );
 
+       /**
+        * @see LockManager::unlockByType()
+        * @param array $paths Map of LockManager::LOCK_* constants to lists of storage paths
+        * @return Status
+        * @since 1.22
+        */
+       protected function doUnlockByType( array $pathsByType ) {
+               $status = Status::newGood();
+               foreach ( $pathsByType as $type => $paths ) {
+                       $status->merge( $this->doUnlock( $paths, $type ) );
+               }
+               return $status;
+       }
+
        /**
         * Unlock resources with the given keys and lock type
         *
         * @param array $paths List of storage paths
         * @param $type integer LockManager::LOCK_* constant
-        * @return string
+        * @return Status
         */
        abstract protected function doUnlock( array $paths, $type );
 }
index ac0bd49..9aff241 100644 (file)
@@ -97,8 +97,8 @@ class LockManagerGroup {
                        $class = $config['class'];
                        unset( $config['class'] ); // lock manager won't need this
                        $this->managers[$name] = array(
-                               'class'    => $class,
-                               'config'   => $config,
+                               'class' => $class,
+                               'config' => $config,
                                'instance' => null
                        );
                }
index fafc588..757aeee 100644 (file)
@@ -145,7 +145,7 @@ class MemcLockManager extends QuorumLockManager {
                        foreach ( $paths as $path ) {
                                $locksKey = $this->recordKeyForPath( $path );
                                $locksHeld = $lockRecords[$locksKey];
-                               $ok = $memc->set( $locksKey, $locksHeld, 7*86400 );
+                               $ok = $memc->set( $locksKey, $locksHeld, 7 * 86400 );
                                if ( !$ok ) {
                                        $status->fatal( 'lockmanager-fail-acquirelock', $path );
                                } else {
@@ -297,7 +297,7 @@ class MemcLockManager extends QuorumLockManager {
                $start = microtime( true );
                do {
                        if ( ( ++$rounds % 4 ) == 0 ) {
-                               usleep( 1000*50 ); // 50 ms
+                               usleep( 1000 * 50 ); // 50 ms
                        }
                        foreach ( array_diff( $keys, $lockedKeys ) as $key ) {
                                if ( $memc->add( "$key:mutex", 1, 180 ) ) { // lock record
index b331b54..3b96ad6 100644 (file)
@@ -125,7 +125,7 @@ abstract class QuorumLockManager extends LockManager {
 
                $yesVotes = 0; // locks made on trustable servers
                $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
-               $quorum = floor( $votesLeft/2 + 1 ); // simple majority
+               $quorum = floor( $votesLeft / 2 + 1 ); // simple majority
                // Get votes for each peer, in order, until we have enough...
                foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
                        if ( !$this->isServerUp( $lockSrv ) ) {
diff --git a/includes/filebackend/lockmanager/RedisLockManager.php b/includes/filebackend/lockmanager/RedisLockManager.php
new file mode 100644 (file)
index 0000000..e8e5996
--- /dev/null
@@ -0,0 +1,255 @@
+<?php
+/**
+ * Version of LockManager based on using redis servers.
+ *
+ * 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 LockManager
+ */
+
+/**
+ * Manage locks using redis servers.
+ *
+ * Version of LockManager based on using redis servers.
+ * This is meant for multi-wiki systems that may share files.
+ * All locks are non-blocking, which avoids deadlocks.
+ *
+ * All lock requests for a resource, identified by a hash string, will map to one
+ * bucket. Each bucket maps to one or several peer servers, each running redis.
+ * A majority of peers must agree for a lock to be acquired.
+ *
+ * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
+ *
+ * @ingroup LockManager
+ * @since 1.22
+ */
+class RedisLockManager extends QuorumLockManager {
+       /** @var Array Mapping of lock types to the type actually used */
+       protected $lockTypeMap = array(
+               self::LOCK_SH => self::LOCK_SH,
+               self::LOCK_UW => self::LOCK_SH,
+               self::LOCK_EX => self::LOCK_EX
+       );
+
+       /** @var RedisConnectionPool */
+       protected $redisPool;
+       /** @var Array Map server names to hostname/IP and port numbers */
+       protected $lockServers = array();
+
+       protected $session = ''; // string; random UUID
+
+       /**
+        * Construct a new instance from configuration.
+        *
+        * $config paramaters include:
+        *   - lockServers  : Associative array of server names to "<IP>:<port>" strings.
+        *   - srvsByBucket : Array of 1-16 consecutive integer keys, starting from 0,
+        *                    each having an odd-numbered list of server names (peers) as values.
+        *   - redisConfig  : Configuration for RedisConnectionPool::__construct().
+        *
+        * @param Array $config
+        * @throws MWException
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+
+               $this->lockServers = $config['lockServers'];
+               // Sanitize srvsByBucket config to prevent PHP errors
+               $this->srvsByBucket = array_filter( $config['srvsByBucket'], 'is_array' );
+               $this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
+
+               $config['redisConfig']['serializer'] = 'none';
+               $this->redisPool = RedisConnectionPool::singleton( $config['redisConfig'] );
+
+               $this->session = wfRandomString( 32 );
+       }
+
+       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               $server = $this->lockServers[$lockSrv];
+               $conn = $this->redisPool->getConnection( $server );
+               if ( !$conn ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                       }
+                       return $status;
+               }
+
+               $keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+               try {
+                       static $script =
+<<<LUA
+                       if ARGV[1] ~= 'EX' and ARGV[1] ~= 'SH' then
+                               return redis.error_reply('Unrecognized lock type given (must be EX or SH)')
+                       end
+                       local failed = {}
+                       -- Check that all the locks can be acquired
+                       for i,resourceKey in ipairs(KEYS) do
+                               local keyIsFree = true
+                               local currentLocks = redis.call('hKeys',resourceKey)
+                               for i,lockKey in ipairs(currentLocks) do
+                                       local _, _, type, session = string.find(lockKey,"(%w+):(%w+)")
+                                       -- Check any locks that are not owned by this session
+                                       if session ~= ARGV[2] then
+                                               local lockTimestamp = redis.call('hGet',resourceKey,lockKey)
+                                               if 1*lockTimestamp < ( ARGV[4] - ARGV[3] ) then
+                                                       -- Lock is stale, so just prune it out
+                                                       redis.call('hDel',resourceKey,lockKey)
+                                               elseif ARGV[1] == 'EX' or type == 'EX' then
+                                                       keyIsFree = false
+                                                       break
+                                               end
+                                       end
+                               end
+                               if not keyIsFree then
+                                       failed[#failed+1] = resourceKey
+                               end
+                       end
+                       -- If all locks could be acquired, then do so
+                       if #failed == 0 then
+                               for i,resourceKey in ipairs(KEYS) do
+                                       redis.call('hSet',resourceKey,ARGV[1] .. ':' .. ARGV[2],ARGV[4])
+                                       -- In addition to invalidation logic, be sure to garbage collect
+                                       redis.call('expire',resourceKey,ARGV[3])
+                               end
+                       end
+                       return failed
+LUA;
+                       $res = $conn->luaEval( $script,
+                               array_merge(
+                                       $keys, // KEYS[0], KEYS[1],...KEYS[N]
+                                       array(
+                                               $type === self::LOCK_SH ? 'SH' : 'EX', // ARGV[1]
+                                               $this->session, // ARGV[2]
+                                               $this->lockTTL, // ARGV[3]
+                                               time() // ARGV[4]
+                                       )
+                               ),
+                               count( $keys ) # number of first argument(s) that are keys
+                       );
+               } catch ( RedisException $e ) {
+                       $res = false;
+                       $this->redisPool->handleException( $server, $conn, $e );
+               }
+
+               if ( $res === false ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                       }
+               } else {
+                       $pathsByKey = array_combine( $keys, $paths );
+                       foreach ( $res as $key ) {
+                               $status->fatal( 'lockmanager-fail-acquirelock', $pathsByKey[$key] );
+                       }
+               }
+
+               return $status;
+       }
+
+       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               $server = $this->lockServers[$lockSrv];
+               $conn = $this->redisPool->getConnection( $server );
+               if ( !$conn ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                       }
+                       return $status;
+               }
+
+               $keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+               try {
+                       static $script =
+<<<LUA
+                       if ARGV[1] ~= 'EX' and ARGV[1] ~= 'SH' then
+                               return redis.error_reply('Unrecognized lock type given (must be EX or SH)')
+                       end
+                       local failed = {}
+                       for i,resourceKey in ipairs(KEYS) do
+                               local released = redis.call('hDel',resourceKey,ARGV[1] .. ':' .. ARGV[2])
+                               if released > 0 then
+                                       -- Remove the whole structure if it is now empty
+                                       if redis.call('hLen',resourceKey) == 0 then
+                                               redis.call('del',resourceKey)
+                                       end
+                               else
+                                       failed[#failed+1] = resourceKey
+                               end
+                       end
+                       return failed
+LUA;
+                       $res = $conn->luaEval( $script,
+                               array_merge(
+                                       $keys, // KEYS[0], KEYS[1],...KEYS[N]
+                                       array(
+                                               $type === self::LOCK_SH ? 'SH' : 'EX', // ARGV[1]
+                                               $this->session // ARGV[2]
+                                       )
+                               ),
+                               count( $keys ) # number of first argument(s) that are keys
+                       );
+               } catch ( RedisException $e ) {
+                       $res = false;
+                       $this->redisPool->handleException( $server, $conn, $e );
+               }
+
+               if ( $res === false ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                       }
+               } else {
+                       $pathsByKey = array_combine( $keys, $paths );
+                       foreach ( $res as $key ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $pathsByKey[$key] );
+                       }
+               }
+
+               return $status;
+       }
+
+       protected function releaseAllLocks() {
+               return Status::newGood(); // not supported
+       }
+
+       protected function isServerUp( $lockSrv ) {
+               return (bool)$this->redisPool->getConnection( $this->lockServers[$lockSrv] );
+       }
+
+       /**
+        * @param $path string
+        * @return string
+        */
+       protected function recordKeyForPath( $path ) {
+               return implode( ':', array( __CLASS__, 'locks', $this->sha1Base36Absolute( $path ) ) );
+       }
+
+       /**
+        * Make sure remaining locks get cleared for sanity
+        */
+       function __destruct() {
+               while ( count( $this->locksHeld ) ) {
+                       foreach ( $this->locksHeld as $path => $locks ) {
+                               $this->doUnlock( array( $path ), self::LOCK_EX );
+                               $this->doUnlock( array( $path ), self::LOCK_SH );
+                       }
+               }
+       }
+}
index edcb1d6..5faad4a 100644 (file)
@@ -36,24 +36,18 @@ class ScopedLock {
        protected $manager;
        /** @var Status */
        protected $status;
-       /** @var Array List of resource paths*/
-       protected $paths;
-
-       protected $type; // integer lock type
+       /** @var Array Map of lock types to resource paths */
+       protected $pathsByType;
 
        /**
-        * @param $manager LockManager
-        * @param array $paths List of storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @param $status Status
+        * @param LockManager $manager
+        * @param array $pathsByType Map of lock types to path lists
+        * @param Status $status
         */
-       protected function __construct(
-               LockManager $manager, array $paths, $type, Status $status
-       ) {
+       protected function __construct( LockManager $manager, array $pathsByType, Status $status ) {
                $this->manager = $manager;
-               $this->paths = $paths;
+               $this->pathsByType = $pathsByType;
                $this->status = $status;
-               $this->type = $type;
        }
 
        /**
@@ -61,19 +55,24 @@ class ScopedLock {
         * Any locks are released once this object goes out of scope.
         * The status object is updated with any errors or warnings.
         *
-        * @param $manager LockManager
-        * @param array $paths List of storage paths
-        * @param $type integer LockManager::LOCK_* constant
-        * @param $status Status
+        * $type can be "mixed" and $paths can be a map of types to paths (since 1.22).
+        * Otherwise $type should be an integer and $paths should be a list of paths.
+        *
+        * @param LockManager $manager
+        * @param array $paths List of storage paths or map of lock types to path lists
+        * @param integer|string $type LockManager::LOCK_* constant or "mixed"
+        * @param Status $status
+        * @param integer $timeout Timeout in seconds (0 means non-blocking) (since 1.22)
         * @return ScopedLock|null Returns null on failure
         */
        public static function factory(
-               LockManager $manager, array $paths, $type, Status $status
+               LockManager $manager, array $paths, $type, Status $status, $timeout = 0
        ) {
-               $lockStatus = $manager->lock( $paths, $type );
+               $pathsByType = is_integer( $type ) ? array( $type => $paths ) : $paths;
+               $lockStatus = $manager->lockByType( $pathsByType, $timeout );
                $status->merge( $lockStatus );
                if ( $lockStatus->isOK() ) {
-                       return new self( $manager, $paths, $type, $status );
+                       return new self( $manager, $pathsByType, $status );
                }
                return null;
        }
@@ -91,9 +90,12 @@ class ScopedLock {
                $lock = null;
        }
 
+       /**
+        * Release the locks when this goes out of scope
+        */
        function __destruct() {
                $wasOk = $this->status->isOK();
-               $this->status->merge( $this->manager->unlock( $this->paths, $this->type ) );
+               $this->status->merge( $this->manager->unlockByType( $this->pathsByType ) );
                if ( $wasOk ) {
                        // Make sure status is OK, despite any unlockFiles() fatals
                        $this->status->setResult( true, $this->status->value );
index e49f37d..42c9c94 100644 (file)
@@ -56,16 +56,16 @@ class FSRepo extends FileRepo {
                        $repoName = $info['name'];
                        // Get the FS backend configuration
                        $backend = new FSFileBackend( array(
-                               'name'           => $info['name'] . '-backend',
-                               'lockManager'    => 'fsLockManager',
+                               'name' => $info['name'] . '-backend',
+                               'lockManager' => 'fsLockManager',
                                'containerPaths' => array(
-                                       "{$repoName}-public"  => "{$directory}",
-                                       "{$repoName}-temp"    => "{$directory}/temp",
-                                       "{$repoName}-thumb"   => $thumbDir,
-                                       "{$repoName}-transcoded"   => $transcodedDir,
+                                       "{$repoName}-public" => "{$directory}",
+                                       "{$repoName}-temp" => "{$directory}/temp",
+                                       "{$repoName}-thumb" => $thumbDir,
+                                       "{$repoName}-transcoded" => $transcodedDir,
                                        "{$repoName}-deleted" => $deletedDir
                                ),
-                               'fileMode'       => $fileMode,
+                               'fileMode' => $fileMode,
                        ) );
                        // Update repo config to use this backend
                        $info['backend'] = $backend;
index 366dd8a..b82a0b8 100644 (file)
@@ -67,7 +67,7 @@ class FileRepo {
         */
        public function __construct( array $info = null ) {
                // Verify required settings presence
-               if(
+               if (
                        $info === null
                        || !array_key_exists( 'name', $info )
                        || !array_key_exists( 'backend', $info )
@@ -259,19 +259,19 @@ class FileRepo {
         */
        public function resolveVirtualUrl( $url ) {
                if ( substr( $url, 0, 9 ) != 'mwrepo://' ) {
-                       throw new MWException( __METHOD__.': unknown protocol' );
+                       throw new MWException( __METHOD__ . ': unknown protocol' );
                }
                $bits = explode( '/', substr( $url, 9 ), 3 );
                if ( count( $bits ) != 3 ) {
-                       throw new MWException( __METHOD__.": invalid mwrepo URL: $url" );
+                       throw new MWException( __METHOD__ . ": invalid mwrepo URL: $url" );
                }
                list( $repo, $zone, $rel ) = $bits;
                if ( $repo !== $this->name ) {
-                       throw new MWException( __METHOD__.": fetching from a foreign repo is not supported" );
+                       throw new MWException( __METHOD__ . ": fetching from a foreign repo is not supported" );
                }
                $base = $this->getZonePath( $zone );
                if ( !$base ) {
-                       throw new MWException( __METHOD__.": invalid zone: $zone" );
+                       throw new MWException( __METHOD__ . ": invalid zone: $zone" );
                }
                return $base . '/' . rawurldecode( $rel );
        }
@@ -383,7 +383,7 @@ class FileRepo {
                        return false;
                }
                $redir = $this->checkRedirect( $title );
-               if ( $redir && $title->getNamespace() == NS_FILE) {
+               if ( $redir && $title->getNamespace() == NS_FILE ) {
                        $img = $this->newFile( $redir );
                        if ( !$img ) {
                                return false;
@@ -794,10 +794,10 @@ class FileRepo {
                                }
                        }
                        $operations[] = array(
-                               'op'            => $opName,
-                               'src'           => $srcPath,
-                               'dst'           => $dstPath,
-                               'overwrite'     => $flags & self::OVERWRITE,
+                               'op' => $opName,
+                               'src' => $srcPath,
+                               'dst' => $dstPath,
+                               'overwrite' => $flags & self::OVERWRITE,
                                'overwriteSame' => $flags & self::OVERWRITE_SAME,
                        );
                }
@@ -917,9 +917,9 @@ class FileRepo {
                        $src = $this->resolveToStoragePath( $src );
                        $dst = $this->resolveToStoragePath( $dst );
                        $operations[] = array(
-                               'op'          => FileBackend::isStoragePath( $src ) ? 'copy' : 'store',
-                               'src'         => $src,
-                               'dst'         => $dst,
+                               'op' => FileBackend::isStoragePath( $src ) ? 'copy' : 'store',
+                               'src' => $src,
+                               'dst' => $dst,
                                'disposition' => isset( $triple[2] ) ? $triple[2] : null
                        );
                        $status->merge( $this->initDirectory( dirname( $dst ) ) );
@@ -942,8 +942,8 @@ class FileRepo {
                $operations = array();
                foreach ( $paths as $path ) {
                        $operations[] = array(
-                               'op'                  => 'delete',
-                               'src'                 => $this->resolveToStoragePath( $path ),
+                               'op' => 'delete',
+                               'src' => $this->resolveToStoragePath( $path ),
                                'ignoreMissingSource' => true
                        );
                }
@@ -987,7 +987,7 @@ class FileRepo {
 
                $temp = $this->getVirtualUrl( 'temp' );
                if ( substr( $virtualUrl, 0, strlen( $temp ) ) != $temp ) {
-                       wfDebug( __METHOD__.": Invalid temp virtual URL\n" );
+                       wfDebug( __METHOD__ . ": Invalid temp virtual URL\n" );
                        return false;
                }
 
@@ -1132,9 +1132,9 @@ class FileRepo {
                        // race conditions unless an functioning LockManager is used.
                        // LocalFile also uses SELECT FOR UPDATE for synchronization.
                        $operations[] = array(
-                               'op'                  => 'copy',
-                               'src'                 => $dstPath,
-                               'dst'                 => $archivePath,
+                               'op' => 'copy',
+                               'src' => $dstPath,
+                               'dst' => $archivePath,
                                'ignoreMissingSource' => true
                        );
 
@@ -1142,28 +1142,28 @@ class FileRepo {
                        if ( FileBackend::isStoragePath( $srcPath ) ) {
                                if ( $flags & self::DELETE_SOURCE ) {
                                        $operations[] = array(
-                                               'op'        => 'move',
-                                               'src'       => $srcPath,
-                                               'dst'       => $dstPath,
+                                               'op' => 'move',
+                                               'src' => $srcPath,
+                                               'dst' => $dstPath,
                                                'overwrite' => true, // replace current
-                                               'headers'   => $headers
+                                               'headers' => $headers
                                        );
                                } else {
                                        $operations[] = array(
-                                               'op'        => 'copy',
-                                               'src'       => $srcPath,
-                                               'dst'       => $dstPath,
+                                               'op' => 'copy',
+                                               'src' => $srcPath,
+                                               'dst' => $dstPath,
                                                'overwrite' => true, // replace current
-                                               'headers'   => $headers
+                                               'headers' => $headers
                                        );
                                }
                        } else { // FS source path
                                $operations[] = array(
-                                       'op'        => 'store',
-                                       'src'       => $srcPath,
-                                       'dst'       => $dstPath,
+                                       'op' => 'store',
+                                       'src' => $srcPath,
+                                       'dst' => $dstPath,
                                        'overwrite' => true, // replace current
-                                       'headers'   => $headers
+                                       'headers' => $headers
                                );
                                if ( $flags & self::DELETE_SOURCE ) {
                                        $sourceFSFilesToDelete[] = $srcPath;
@@ -1306,9 +1306,9 @@ class FileRepo {
                foreach ( $sourceDestPairs as $pair ) {
                        list( $srcRel, $archiveRel ) = $pair;
                        if ( !$this->validateFilename( $srcRel ) ) {
-                               throw new MWException( __METHOD__.':Validation error in $srcRel' );
+                               throw new MWException( __METHOD__ . ':Validation error in $srcRel' );
                        } elseif ( !$this->validateFilename( $archiveRel ) ) {
-                               throw new MWException( __METHOD__.':Validation error in $archiveRel' );
+                               throw new MWException( __METHOD__ . ':Validation error in $archiveRel' );
                        }
 
                        $publicRoot = $this->getZonePath( 'public' );
@@ -1324,9 +1324,9 @@ class FileRepo {
                        }
 
                        $operations[] = array(
-                               'op'            => 'move',
-                               'src'           => $srcPath,
-                               'dst'           => $archivePath,
+                               'op' => 'move',
+                               'src' => $srcPath,
+                               'dst' => $archivePath,
                                // We may have 2+ identical files being deleted,
                                // all of which will map to the same destination file
                                'overwriteSame' => true // also see bug 31792
@@ -1564,7 +1564,7 @@ class FileRepo {
        public function newFatal( $message /*, parameters...*/ ) {
                $params = func_get_args();
                array_unshift( $params, $this );
-               return MWInit::callStaticMethod( 'FileRepoStatus', 'newFatal', $params );
+               return call_user_func_array( array( 'FileRepoStatus', 'newFatal' ), $params );
        }
 
        /**
@@ -1671,29 +1671,29 @@ class FileRepo {
         */
        public function getTempRepo() {
                return new TempFileRepo( array(
-                       'name'      => "{$this->name}-temp",
-                       'backend'   => $this->backend,
-                       'zones'     => array(
+                       'name' => "{$this->name}-temp",
+                       'backend' => $this->backend,
+                       'zones' => array(
                                'public' => array(
                                        'container' => $this->zones['temp']['container'],
                                        'directory' => $this->zones['temp']['directory']
                                ),
-                               'thumb'  => array(
+                               'thumb' => array(
                                        'container' => $this->zones['thumb']['container'],
                                        'directory' => ( $this->zones['thumb']['directory'] == '' )
                                                ? 'temp'
                                                : $this->zones['thumb']['directory'] . '/temp'
                                ),
-                               'transcoded'  => array(
+                               'transcoded' => array(
                                        'container' => $this->zones['transcoded']['container'],
                                        'directory' => ( $this->zones['transcoded']['directory'] == '' )
                                                ? 'temp'
                                                : $this->zones['transcoded']['directory'] . '/temp'
                                )
                        ),
-                       'url'        => $this->getZoneUrl( 'temp' ),
-                       'thumbUrl'   => $this->getZoneUrl( 'thumb' ) . '/temp',
-                       'transcodedUrl'   => $this->getZoneUrl( 'transcoded' ) . '/temp',
+                       'url' => $this->getZoneUrl( 'temp' ),
+                       'thumbUrl' => $this->getZoneUrl( 'thumb' ) . '/temp',
+                       'transcodedUrl' => $this->getZoneUrl( 'transcoded' ) . '/temp',
                        'hashLevels' => $this->hashLevels // performance
                ) );
        }
index ba574da..6b0bc3a 100644 (file)
@@ -61,21 +61,21 @@ class ForeignAPIRepo extends FileRepo {
                // http://commons.wikimedia.org/w/api.php
                $this->mApiBase = isset( $info['apibase'] ) ? $info['apibase'] : null;
 
-               if( isset( $info['apiThumbCacheExpiry'] ) ) {
+               if ( isset( $info['apiThumbCacheExpiry'] ) ) {
                        $this->apiThumbCacheExpiry = $info['apiThumbCacheExpiry'];
                }
-               if( isset( $info['fileCacheExpiry'] ) ) {
+               if ( isset( $info['fileCacheExpiry'] ) ) {
                        $this->fileCacheExpiry = $info['fileCacheExpiry'];
                }
-               if( !$this->scriptDirUrl ) {
+               if ( !$this->scriptDirUrl ) {
                        // hack for description fetches
                        $this->scriptDirUrl = dirname( $this->mApiBase );
                }
                // If we can cache thumbs we can guess sane defaults for these
-               if( $this->canCacheThumbs() && !$this->url ) {
+               if ( $this->canCacheThumbs() && !$this->url ) {
                        $this->url = $wgLocalFileRepo['url'];
                }
-               if( $this->canCacheThumbs() && !$this->thumbUrl ) {
+               if ( $this->canCacheThumbs() && !$this->thumbUrl ) {
                        $this->thumbUrl = $this->url . '/thumb';
                }
        }
@@ -105,7 +105,7 @@ class ForeignAPIRepo extends FileRepo {
                        if ( isset( $this->mFileExists[$k] ) ) {
                                $results[$k] = true;
                                unset( $files[$k] );
-                       } elseif( self::isVirtualUrl( $f ) ) {
+                       } elseif ( self::isVirtualUrl( $f ) ) {
                                # @todo FIXME: We need to be able to handle virtual
                                # URLs better, at least when we know they refer to the
                                # same repo.
@@ -120,9 +120,9 @@ class ForeignAPIRepo extends FileRepo {
 
                $data = $this->fetchImageQuery( array( 'titles' => implode( $files, '|' ),
                                                                                        'prop' => 'imageinfo' ) );
-               if( isset( $data['query']['pages'] ) ) {
+               if ( isset( $data['query']['pages'] ) ) {
                        $i = 0;
-                       foreach( $files as $key => $file ) {
+                       foreach ( $files as $key => $file ) {
                                $results[$key] = $this->mFileExists[$key] = !isset( $data['query']['pages'][$i]['missing'] );
                                $i++;
                        }
@@ -143,24 +143,27 @@ class ForeignAPIRepo extends FileRepo {
         * @return string
         */
        function fetchImageQuery( $query ) {
-               global $wgMemc;
+               global $wgMemc, $wgLanguageCode;
 
                $query = array_merge( $query,
                        array(
-                               'format'    => 'json',
-                               'action'    => 'query',
+                               'format' => 'json',
+                               'action' => 'query',
                                'redirects' => 'true'
                        ) );
+               if ( !isset( $query['uselang'] ) ) { // uselang is unset or null
+                       $query['uselang'] = $wgLanguageCode;
+               }
                if ( $this->mApiBase ) {
                        $url = wfAppendQuery( $this->mApiBase, $query );
                } else {
                        $url = $this->makeUrl( $query, 'api' );
                }
 
-               if( !isset( $this->mQueryCache[$url] ) ) {
+               if ( !isset( $this->mQueryCache[$url] ) ) {
                        $key = $this->getLocalCacheKey( 'ForeignAPIRepo', 'Metadata', md5( $url ) );
                        $data = $wgMemc->get( $key );
-                       if( !$data ) {
+                       if ( !$data ) {
                                $data = self::httpGet( $url );
                                if ( !$data ) {
                                        return null;
@@ -168,7 +171,7 @@ class ForeignAPIRepo extends FileRepo {
                                $wgMemc->set( $key, $data, 3600 );
                        }
 
-                       if( count( $this->mQueryCache ) > 100 ) {
+                       if ( count( $this->mQueryCache ) > 100 ) {
                                // Keep the cache from growing infinitely
                                $this->mQueryCache = array();
                        }
@@ -182,9 +185,9 @@ class ForeignAPIRepo extends FileRepo {
         * @return bool|array
         */
        function getImageInfo( $data ) {
-               if( $data && isset( $data['query']['pages'] ) ) {
-                       foreach( $data['query']['pages'] as $info ) {
-                               if( isset( $info['imageinfo'][0] ) ) {
+               if ( $data && isset( $data['query']['pages'] ) ) {
+                       foreach ( $data['query']['pages'] as $info ) {
+                               if ( isset( $info['imageinfo'][0] ) ) {
                                        return $info['imageinfo'][0];
                                }
                        }
@@ -198,14 +201,15 @@ class ForeignAPIRepo extends FileRepo {
         */
        function findBySha1( $hash ) {
                $results = $this->fetchImageQuery( array(
-                                                                               'aisha1base36' => $hash,
-                                                                               'aiprop'       => ForeignAPIFile::getProps(),
-                                                                               'list'         => 'allimages', ) );
+                       'aisha1base36' => $hash,
+                       'aiprop' => ForeignAPIFile::getProps(),
+                       'list' => 'allimages',
+               ) );
                $ret = array();
                if ( isset( $results['query']['allimages'] ) ) {
                        foreach ( $results['query']['allimages'] as $img ) {
                                // 1.14 was broken, doesn't return name attribute
-                               if( !isset( $img['name'] ) ) {
+                               if ( !isset( $img['name'] ) ) {
                                        continue;
                                }
                                $ret[] = new ForeignAPIFile( Title::makeTitle( NS_FILE, $img['name'] ), $this, $img );
@@ -228,11 +232,11 @@ class ForeignAPIRepo extends FileRepo {
                        'iiprop' => 'url|timestamp',
                        'iiurlwidth' => $width,
                        'iiurlheight' => $height,
-                       'iiurlparam'  => $otherParams,
+                       'iiurlparam' => $otherParams,
                        'prop' => 'imageinfo' ) );
                $info = $this->getImageInfo( $data );
 
-               if( $data && $info && isset( $info['thumburl'] ) ) {
+               if ( $data && $info && isset( $info['thumburl'] ) ) {
                        wfDebug( __METHOD__ . " got remote thumb " . $info['thumburl'] . "\n" );
                        $result = $info;
                        return $info['thumburl'];
@@ -241,6 +245,40 @@ class ForeignAPIRepo extends FileRepo {
                }
        }
 
+       /**
+        * @param $name string
+        * @param $width int
+        * @param $height int
+        * @param $otherParams string
+        * @return bool|MediaTransformError
+        * @since 1.22
+        */
+       function getThumbError( $name, $width = -1, $height = -1, $otherParams = '', $lang = null ) {
+               $data = $this->fetchImageQuery( array(
+                       'titles' => 'File:' . $name,
+                       'iiprop' => 'url|timestamp',
+                       'iiurlwidth' => $width,
+                       'iiurlheight' => $height,
+                       'iiurlparam' => $otherParams,
+                       'prop' => 'imageinfo',
+                       'uselang' => $lang,
+               ) );
+               $info = $this->getImageInfo( $data );
+
+               if( $data && $info && isset( $info['thumberror'] ) ) {
+                       wfDebug( __METHOD__ . " got remote thumb error " . $info['thumberror'] . "\n" );
+                       return new MediaTransformError(
+                               'thumbnail_error_remote',
+                               $width,
+                               $height,
+                               $this->getDisplayName(),
+                               $info['thumberror'] // already parsed message from foreign repo
+                       );
+               } else {
+                       return false;
+               }
+       }
+
        /**
         * Return the imageurl from cache if possible
         *
@@ -268,11 +306,11 @@ class ForeignAPIRepo extends FileRepo {
 
                /* Get the array of urls that we already know */
                $knownThumbUrls = $wgMemc->get( $key );
-               if( !$knownThumbUrls ) {
+               if ( !$knownThumbUrls ) {
                        /* No knownThumbUrls for this file */
                        $knownThumbUrls = array();
                } else {
-                       if( isset( $knownThumbUrls[$sizekey] ) ) {
+                       if ( isset( $knownThumbUrls[$sizekey] ) ) {
                                wfDebug( __METHOD__ . ': Got thumburl from local cache: ' .
                                        "{$knownThumbUrls[$sizekey]} \n" );
                                return $knownThumbUrls[$sizekey];
@@ -283,14 +321,14 @@ class ForeignAPIRepo extends FileRepo {
                $metadata = null;
                $foreignUrl = $this->getThumbUrl( $name, $width, $height, $metadata, $params );
 
-               if( !$foreignUrl ) {
+               if ( !$foreignUrl ) {
                        wfDebug( __METHOD__ . " Could not find thumburl\n" );
                        return false;
                }
 
                // We need the same filename as the remote one :)
                $fileName = rawurldecode( pathinfo( $foreignUrl, PATHINFO_BASENAME ) );
-               if( !$this->validateFilename( $fileName ) ) {
+               if ( !$this->validateFilename( $fileName ) ) {
                        wfDebug( __METHOD__ . " The deduced filename $fileName is not safe\n" );
                        return false;
                }
@@ -298,15 +336,14 @@ class ForeignAPIRepo extends FileRepo {
                $localFilename = $localPath . "/" . $fileName;
                $localUrl = $this->getZoneUrl( 'thumb' ) . "/" . $this->getHashPath( $name ) . rawurlencode( $name ) . "/" . rawurlencode( $fileName );
 
-               if( $backend->fileExists( array( 'src' => $localFilename ) )
-                       && isset( $metadata['timestamp'] ) )
-               {
+               if ( $backend->fileExists( array( 'src' => $localFilename ) )
+                       && isset( $metadata['timestamp'] ) ) {
                        wfDebug( __METHOD__ . " Thumbnail was already downloaded before\n" );
                        $modified = $backend->getFileTimestamp( array( 'src' => $localFilename ) );
                        $remoteModified = strtotime( $metadata['timestamp'] );
                        $current = time();
                        $diff = abs( $modified - $current );
-                       if( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
+                       if ( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
                                /* Use our current and already downloaded thumbnail */
                                $knownThumbUrls[$sizekey] = $localUrl;
                                $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
@@ -315,7 +352,7 @@ class ForeignAPIRepo extends FileRepo {
                        /* There is a new Commons file, or existing thumbnail older than a month */
                }
                $thumb = self::httpGet( $foreignUrl );
-               if( !$thumb ) {
+               if ( !$thumb ) {
                        wfDebug( __METHOD__ . " Could not download thumb\n" );
                        return false;
                }
@@ -323,7 +360,7 @@ class ForeignAPIRepo extends FileRepo {
                # @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
                $backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
                $params = array( 'dst' => $localFilename, 'content' => $thumb );
-               if( !$backend->quickCreate( $params )->isOK() ) {
+               if ( !$backend->quickCreate( $params )->isOK() ) {
                        wfDebug( __METHOD__ . " could not write to thumb path '$localFilename'\n" );
                        return $foreignUrl;
                }
index 1865985..ecad618 100644 (file)
@@ -59,7 +59,7 @@ class ForeignDBRepo extends LocalRepo {
                        $this->dbConn = DatabaseBase::factory( $this->dbType,
                                array(
                                        'host' => $this->dbServer,
-                                       'user'   => $this->dbUser,
+                                       'user' => $this->dbUser,
                                        'password' => $this->dbPassword,
                                        'dbname' => $this->dbName,
                                        'flags' => $this->dbFlags,
index be11b23..549be40 100644 (file)
@@ -47,7 +47,7 @@ class LocalRepo extends FileRepo {
                } elseif ( isset( $row->oi_name ) ) {
                        return call_user_func( $this->oldFileFromRowFactory, $row, $this );
                } else {
-                       throw new MWException( __METHOD__.': invalid row' );
+                       throw new MWException( __METHOD__ . ': invalid row' );
                }
        }
 
@@ -176,7 +176,7 @@ class LocalRepo extends FileRepo {
                } // else $cachedValue is false or null: cache miss
 
                $id = $this->getArticleID( $title );
-               if( !$id ) {
+               if ( !$id ) {
                        $wgMemc->set( $memcKey, " ", $expiry );
                        return false;
                }
@@ -188,7 +188,7 @@ class LocalRepo extends FileRepo {
                        __METHOD__
                );
 
-               if( $row && $row->rd_namespace == NS_FILE ) {
+               if ( $row && $row->rd_namespace == NS_FILE ) {
                        $targetTitle = Title::makeTitle( $row->rd_namespace, $row->rd_title );
                        $wgMemc->set( $memcKey, $targetTitle->getDBkey(), $expiry );
                        return $targetTitle;
@@ -206,7 +206,7 @@ class LocalRepo extends FileRepo {
         * @return bool|int|mixed
         */
        protected function getArticleID( $title ) {
-               if( !$title instanceof Title ) {
+               if ( !$title instanceof Title ) {
                        return 0;
                }
                $dbr = $this->getSlaveDB();
@@ -258,7 +258,7 @@ class LocalRepo extends FileRepo {
         * @return array An Array of arrays or iterators of file objects and the hash as key
         */
        function findBySha1s( array $hashes ) {
-               if( !count( $hashes ) ) {
+               if ( !count( $hashes ) ) {
                        return array(); //empty parameter
                }
 
@@ -281,17 +281,17 @@ class LocalRepo extends FileRepo {
                return $result;
        }
 
-       /**\r
-        * Return an array of files where the name starts with $prefix.\r
-        *\r
-        * @param string $prefix The prefix to search for\r
-        * @param int $limit The maximum amount of files to return\r
-        * @return array\r
-        */\r
+       /**
+        * Return an array of files where the name starts with $prefix.
+        *
+        * @param string $prefix The prefix to search for
+        * @param int $limit The maximum amount of files to return
+        * @return array
+        */
        public function findFilesByPrefix( $prefix, $limit ) {
                $selectOptions = array( 'ORDER BY' => 'img_name', 'LIMIT' => intval( $limit ) );
 
-               // Query database\r
+               // Query database
                $dbr = $this->getSlaveDB();
                $res = $dbr->select(
                        'image',
@@ -306,7 +306,7 @@ class LocalRepo extends FileRepo {
                foreach ( $res as $row ) {
                        $files[] = $this->newFileFromRow( $row );
                }
-               return $files;\r
+               return $files;
        }
 
        /**
index 02dfdad..b2b9477 100644 (file)
@@ -209,7 +209,7 @@ class RepoGroup {
                }
 
                $redir = $this->localRepo->checkRedirect( $title );
-               if( $redir ) {
+               if ( $redir ) {
                        return $redir;
                }
                foreach ( $this->foreignRepos as $repo ) {
@@ -238,7 +238,9 @@ class RepoGroup {
                if ( !$file ) {
                        foreach ( $this->foreignRepos as $repo ) {
                                $file = $repo->findFileFromKey( $hash, $options );
-                               if ( $file ) break;
+                               if ( $file ) {
+                                       break;
+                               }
                        }
                }
                return $file;
@@ -279,7 +281,7 @@ class RepoGroup {
                        $result = array_merge_recursive( $result, $repo->findBySha1s( $hashes ) );
                }
                //sort the merged (and presorted) sublist of each hash
-               foreach( $result as $hash => $files ) {
+               foreach ( $result as $hash => $files ) {
                        usort( $result[$hash], 'File::compare' );
                }
                return $result;
@@ -339,9 +341,9 @@ class RepoGroup {
         * @return bool
         */
        function forEachForeignRepo( $callback, $params = array() ) {
-               foreach( $this->foreignRepos as $repo ) {
+               foreach ( $this->foreignRepos as $repo ) {
                        $args = array_merge( array( $repo ), $params );
-                       if( call_user_func_array( $callback, $args ) ) {
+                       if ( call_user_func_array( $callback, $args ) ) {
                                return true;
                        }
                }
index 3f78619..6c4bf8a 100644 (file)
@@ -90,7 +90,7 @@ class ArchivedFile {
                $this->exists = false;
                $this->sha1 = '';
 
-               if( $title instanceof Title ) {
+               if ( $title instanceof Title ) {
                        $this->title = File::normalizeTitle( $title, 'exception' );
                        $this->name = $title->getDBkey();
                }
@@ -119,22 +119,22 @@ class ArchivedFile {
                }
                $conds = array();
 
-               if( $this->id > 0 ) {
+               if ( $this->id > 0 ) {
                        $conds['fa_id'] = $this->id;
                }
-               if( $this->key ) {
+               if ( $this->key ) {
                        $conds['fa_storage_group'] = $this->group;
                        $conds['fa_storage_key'] = $this->key;
                }
-               if( $this->title ) {
+               if ( $this->title ) {
                        $conds['fa_name'] = $this->title->getDBkey();
                }
 
-               if( !count( $conds ) ) {
+               if ( !count( $conds ) ) {
                        throw new MWException( "No specific information for retrieving archived file" );
                }
 
-               if( !$this->title || $this->title->getNamespace() == NS_FILE ) {
+               if ( !$this->title || $this->title->getNamespace() == NS_FILE ) {
                        $this->dataLoaded = true; // set it here, to have also true on miss
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow(
@@ -224,7 +224,7 @@ class ArchivedFile {
                $this->user_text = $row->fa_user_text;
                $this->timestamp = $row->fa_timestamp;
                $this->deleted = $row->fa_deleted;
-               if( isset( $row->fa_sha1 ) ) {
+               if ( isset( $row->fa_sha1 ) ) {
                        $this->sha1 = $row->fa_sha1;
                } else {
                        // old row, populate from key
@@ -409,7 +409,7 @@ class ArchivedFile {
         */
        public function getUser() {
                $this->load();
-               if( $this->isDeleted( File::DELETED_USER ) ) {
+               if ( $this->isDeleted( File::DELETED_USER ) ) {
                        return 0;
                } else {
                        return $this->user;
@@ -423,7 +423,7 @@ class ArchivedFile {
         */
        public function getUserText() {
                $this->load();
-               if( $this->isDeleted( File::DELETED_USER ) ) {
+               if ( $this->isDeleted( File::DELETED_USER ) ) {
                        return 0;
                } else {
                        return $this->user_text;
@@ -437,7 +437,7 @@ class ArchivedFile {
         */
        public function getDescription() {
                $this->load();
-               if( $this->isDeleted( File::DELETED_COMMENT ) ) {
+               if ( $this->isDeleted( File::DELETED_COMMENT ) ) {
                        return 0;
                } else {
                        return $this->description;
@@ -491,7 +491,7 @@ class ArchivedFile {
         */
        public function isDeleted( $field ) {
                $this->load();
-               return ($this->deleted & $field) == $field;
+               return ( $this->deleted & $field ) == $field;
        }
 
        /**
index cecd0ae..0da4036 100644 (file)
@@ -201,9 +201,9 @@ abstract class File {
                        'mpeg' => 'mpg',
                        'tiff' => 'tif',
                        'ogv' => 'ogg' );
-               if( isset( $squish[$lower] ) ) {
+               if ( isset( $squish[$lower] ) ) {
                        return $squish[$lower];
-               } elseif( preg_match( '/^[0-9a-z]+$/', $lower ) ) {
+               } elseif ( preg_match( '/^[0-9a-z]+$/', $lower ) ) {
                        return $lower;
                } else {
                        return '';
@@ -241,7 +241,7 @@ abstract class File {
         * @return array ("text", "html") etc
         */
        public static function splitMime( $mime ) {
-               if( strpos( $mime, '/' ) !== false ) {
+               if ( strpos( $mime, '/' ) !== false ) {
                        return explode( '/', $mime, 2 );
                } else {
                        return array( $mime, 'unknown' );
@@ -518,7 +518,7 @@ abstract class File {
         * @param $version integer version number.
         * @return Array containing metadata, or what was passed to it on fail (unserializing if not array)
         */
-       public function convertMetadataVersion($metadata, $version) {
+       public function convertMetadataVersion( $metadata, $version ) {
                $handler = $this->getHandler();
                if ( !is_array( $metadata ) ) {
                        // Just to make the return type consistent
@@ -681,7 +681,7 @@ abstract class File {
                if ( $mime === "unknown/unknown" ) {
                        return false; #unknown type, not trusted
                }
-               if ( in_array( $mime, $wgTrustedMediaFormats) ) {
+               if ( in_array( $mime, $wgTrustedMediaFormats ) ) {
                        return true;
                }
 
@@ -737,7 +737,7 @@ abstract class File {
                        if ( $this->repo ) {
                                $script = $this->repo->getThumbScriptUrl();
                                if ( $script ) {
-                                       $this->transformScript = "$script?f=" . urlencode( $this->getName() );
+                                       $this->transformScript = wfAppendQuery( $script, array( 'f' => $this->getName() ) );
                                }
                        }
                }
@@ -910,8 +910,7 @@ abstract class File {
                                                // XXX: Pass in the storage path even though we are not rendering anything
                                                // and the path is supposed to be an FS path. This is due to getScalerType()
                                                // getting called on the path and clobbering $thumb->getUrl() if it's false.
-                                               $thumb = $handler->getTransform(
-                                                       $this, $thumbPath, $thumbUrl, $params );
+                                               $thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
                                                $thumb->setStoragePath( $thumbPath );
                                                break;
                                        }
@@ -1097,7 +1096,7 @@ abstract class File {
         *
         * @return array
         */
-       function getHistory( $limit = null, $start = null, $end = null, $inc=true ) {
+       function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
                return array();
        }
 
index a96c1f3..8829cd9 100644 (file)
@@ -54,22 +54,22 @@ class ForeignAPIFile extends File {
         */
        static function newFromTitle( Title $title, $repo ) {
                $data = $repo->fetchImageQuery( array(
-                       'titles'            => 'File:' . $title->getDBKey(),
-                       'iiprop'            => self::getProps(),
-                       'prop'              => 'imageinfo',
+                       'titles' => 'File:' . $title->getDBkey(),
+                       'iiprop' => self::getProps(),
+                       'prop' => 'imageinfo',
                        'iimetadataversion' => MediaHandler::getMetadataVersion()
                ) );
 
                $info = $repo->getImageInfo( $data );
 
-               if( $info ) {
+               if ( $info ) {
                        $lastRedirect = isset( $data['query']['redirects'] )
                                ? count( $data['query']['redirects'] ) - 1
                                : -1;
-                       if( $lastRedirect >= 0 ) {
-                               $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to']);
+                       if ( $lastRedirect >= 0 ) {
+                               $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to'] );
                                $img = new self( $newtitle, $repo, $info, true );
-                               if( $img ) {
+                               if ( $img ) {
                                        $img->redirectedFrom( $title->getDBkey() );
                                }
                        } else {
@@ -111,7 +111,7 @@ class ForeignAPIFile extends File {
         * @return bool|MediaTransformOutput
         */
        function transform( $params, $flags = 0 ) {
-               if( !$this->canRender() ) {
+               if ( !$this->canRender() ) {
                        // show icon
                        return parent::transform( $params, $flags );
                }
@@ -119,12 +119,25 @@ class ForeignAPIFile extends File {
                // Note, the this->canRender() check above implies
                // that we have a handler, and it can do makeParamString.
                $otherParams = $this->handler->makeParamString( $params );
+               $width = isset( $params['width'] ) ? $params['width'] : -1;
+               $height = isset( $params['height'] ) ? $params['height'] : -1;
 
                $thumbUrl = $this->repo->getThumbUrlFromCache(
                        $this->getName(),
-                       isset( $params['width'] ) ? $params['width'] : -1,
-                       isset( $params['height'] ) ? $params['height'] : -1,
-                       $otherParams );
+                       $width,
+                       $height,
+                       $otherParams
+               );
+               if ( $thumbUrl === false ) {
+                       global $wgLang;
+                       return $this->repo->getThumbError(
+                               $this->getName(),
+                               $width,
+                               $height,
+                               $otherParams,
+                               $wgLang->getCode()
+                       );
+               }
                return $this->handler->getTransform( $this, 'bogus', $thumbUrl, $params );
        }
 
@@ -161,12 +174,12 @@ class ForeignAPIFile extends File {
         * @return array
         */
        public static function parseMetadata( $metadata ) {
-               if( !is_array( $metadata ) ) {
+               if ( !is_array( $metadata ) ) {
                        return $metadata;
                }
                $ret = array();
-               foreach( $metadata as $meta ) {
-                       $ret[ $meta['name'] ] = self::parseMetadata( $meta['value'] );
+               foreach ( $metadata as $meta ) {
+                       $ret[$meta['name']] = self::parseMetadata( $meta['value'] );
                }
                return $ret;
        }
@@ -224,7 +237,7 @@ class ForeignAPIFile extends File {
         * @return string
         */
        function getMimeType() {
-               if( !isset( $this->mInfo['mime'] ) ) {
+               if ( !isset( $this->mInfo['mime'] ) ) {
                        $magic = MimeMagic::singleton();
                        $this->mInfo['mime'] = $magic->guessTypesForExtension( $this->getExtension() );
                }
index 639228b..3cb1f41 100644 (file)
@@ -382,6 +382,7 @@ class LocalFile extends File {
                                $this->$name = $value;
                        }
                } else {
+                       wfProfileOut( $fname );
                        throw new MWException( "Could not find data for image '{$this->getName()}'." );
                }
 
@@ -531,15 +532,15 @@ class LocalFile extends File {
 
                $dbw->update( 'image',
                        array(
-                               'img_size'       => $this->size, // sanity
-                               'img_width'      => $this->width,
-                               'img_height'     => $this->height,
-                               'img_bits'       => $this->bits,
+                               'img_size' => $this->size, // sanity
+                               'img_width' => $this->width,
+                               'img_height' => $this->height,
+                               'img_bits' => $this->bits,
                                'img_media_type' => $this->media_type,
                                'img_major_mime' => $major,
                                'img_minor_mime' => $minor,
-                               'img_metadata'   => $this->metadata,
-                               'img_sha1'       => $this->sha1,
+                               'img_metadata' => $this->metadata,
+                               'img_sha1' => $this->sha1,
                        ),
                        array( 'img_name' => $this->getName() ),
                        __METHOD__
@@ -802,7 +803,7 @@ class LocalFile extends File {
                $oldKey = $this->repo->getSharedCacheKey( 'oldfile', $hashedName );
 
                // Must purge thumbnails for old versions too! bug 30192
-               foreach( $this->getHistory() as $oldFile ) {
+               foreach ( $this->getHistory() as $oldFile ) {
                        $oldFile->purgeThumbnails();
                }
 
@@ -844,7 +845,7 @@ class LocalFile extends File {
                // Purge the squid
                if ( $wgUseSquid ) {
                        $urls = array();
-                       foreach( $files as $file ) {
+                       foreach ( $files as $file ) {
                                $urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
                        }
                        SquidUpdate::purge( $urls );
@@ -865,7 +866,7 @@ class LocalFile extends File {
                // Always purge all files from squid regardless of handler filters
                if ( $wgUseSquid ) {
                        $urls = array();
-                       foreach( $files as $file ) {
+                       foreach ( $files as $file ) {
                                $urls[] = $this->getThumbUrl( $file );
                        }
                        array_shift( $urls ); // don't purge directory
@@ -1195,20 +1196,20 @@ class LocalFile extends File {
                # doesn't deadlock. SELECT FOR UPDATE causes a deadlock for every race condition.
                $dbw->insert( 'image',
                        array(
-                               'img_name'        => $this->getName(),
-                               'img_size'        => $this->size,
-                               'img_width'       => intval( $this->width ),
-                               'img_height'      => intval( $this->height ),
-                               'img_bits'        => $this->bits,
-                               'img_media_type'  => $this->media_type,
-                               'img_major_mime'  => $this->major_mime,
-                               'img_minor_mime'  => $this->minor_mime,
-                               'img_timestamp'   => $timestamp,
+                               'img_name' => $this->getName(),
+                               'img_size' => $this->size,
+                               'img_width' => intval( $this->width ),
+                               'img_height' => intval( $this->height ),
+                               'img_bits' => $this->bits,
+                               'img_media_type' => $this->media_type,
+                               'img_major_mime' => $this->major_mime,
+                               'img_minor_mime' => $this->minor_mime,
+                               'img_timestamp' => $timestamp,
                                'img_description' => $comment,
-                               'img_user'        => $user->getId(),
-                               'img_user_text'   => $user->getName(),
-                               'img_metadata'    => $this->metadata,
-                               'img_sha1'        => $this->sha1
+                               'img_user' => $user->getId(),
+                               'img_user_text' => $user->getName(),
+                               'img_metadata' => $this->metadata,
+                               'img_sha1' => $this->sha1
                        ),
                        __METHOD__,
                        'IGNORE'
@@ -1274,9 +1275,27 @@ class LocalFile extends File {
                $wikiPage->setFile( $this );
 
                # Add the log entry
-               $log = new LogPage( 'upload' );
                $action = $reupload ? 'overwrite' : 'upload';
-               $logId = $log->addEntry( $action, $descTitle, $comment, array(), $user );
+
+               $logEntry = new ManualLogEntry( 'upload', $action );
+               $logEntry->setPerformer( $user );
+               $logEntry->setComment( $comment );
+               $logEntry->setTarget( $descTitle );
+
+               // Allow people using the api to associate log entries with the upload.
+               // Log has a timestamp, but sometimes different from upload timestamp.
+               $logEntry->setParameters(
+                       array(
+                               'img_sha1' => $this->sha1,
+                               'img_timestamp' => $timestamp,
+                       )
+               );
+               // Note we keep $logId around since during new image
+               // creation, page doesn't exist yet, so log_page = 0
+               // but we want it to point to the page we're making,
+               // so we later modify the log entry.
+               $logId = $logEntry->insert();
+               $logEntry->publish( $logId );
 
                wfProfileIn( __METHOD__ . '-edit' );
                $exists = $descTitle->exists();
@@ -1284,10 +1303,12 @@ class LocalFile extends File {
                if ( $exists ) {
                        # Create a null revision
                        $latest = $descTitle->getLatestRevID();
+                       $editSummary = LogFormatter::newFromEntry( $logEntry )->getPlainActionText();
+
                        $nullRevision = Revision::newNullRevision(
                                $dbw,
                                $descTitle->getArticleID(),
-                               $log->getRcComment(),
+                               $editSummary,
                                false
                        );
                        if ( !is_null( $nullRevision ) ) {
@@ -1405,7 +1426,7 @@ class LocalFile extends File {
 
                $this->lock(); // begin
 
-               $archiveName = wfTimestamp( TS_MW ) . '!'. $this->getName();
+               $archiveName = wfTimestamp( TS_MW ) . '!' . $this->getName();
                $archiveRel = 'archive/' . $this->getHashPath() . $archiveName;
                $flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
                $status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags, $options );
@@ -1590,7 +1611,7 @@ class LocalFile extends File {
         * @return String
         */
        function getDescriptionUrl() {
-               return $this->title->getLocalUrl();
+               return $this->title->getLocalURL();
        }
 
        /**
@@ -1601,9 +1622,13 @@ class LocalFile extends File {
         */
        function getDescriptionText() {
                $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
-               if ( !$revision ) return false;
+               if ( !$revision ) {
+                       return false;
+               }
                $content = $revision->getContent();
-               if ( !$content ) return false;
+               if ( !$content ) {
+                       return false;
+               }
                $pout = $content->getParserOutput( $this->title, null, new ParserOptions() );
                return $pout->getText();
        }
@@ -1658,11 +1683,13 @@ class LocalFile extends File {
        }
 
        /**
-        * @return bool
+        * @return bool Whether to cache in RepoGroup (this avoids OOMs)
         */
        function isCacheable() {
                $this->load();
-               return strlen( $this->metadata ) <= self::CACHE_FIELD_MAX_LEN; // avoid OOMs
+               // If extra data (metadata) was not loaded then it must have been large
+               return $this->extraDataLoaded
+                       && strlen( serialize( $this->metadata ) ) <= self::CACHE_FIELD_MAX_LEN;
        }
 
        /**
@@ -2173,7 +2200,7 @@ class LocalFileRestoreBatch {
                        $deletedRel = $this->file->repo->getDeletedHashPath( $row->fa_storage_key ) . $row->fa_storage_key;
                        $deletedUrl = $this->file->repo->getVirtualUrl() . '/deleted/' . $deletedRel;
 
-                       if( isset( $row->fa_sha1 ) ) {
+                       if ( isset( $row->fa_sha1 ) ) {
                                $sha1 = $row->fa_sha1;
                        } else {
                                // old row, populate from key
index 5c50592..2c54596 100644 (file)
@@ -218,6 +218,7 @@ class OldLocalFile extends LocalFile {
                                $this->$name = $value;
                        }
                } else {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "Could not find data for image '{$this->archive_name}'." );
                }
 
@@ -290,7 +291,7 @@ class OldLocalFile extends LocalFile {
         */
        function isDeleted( $field ) {
                $this->load();
-               return ($this->deleted & $field) == $field;
+               return ( $this->deleted & $field ) == $field;
        }
 
        /**
index bb7e877..e3bcb6f 100644 (file)
@@ -114,7 +114,7 @@ class CliInstaller extends Installer {
         */
        public function execute() {
                $vars = Installer::getExistingLocalSettings();
-               if( $vars ) {
+               if ( $vars ) {
                        $this->showStatusMessage(
                                Status::newFatal( "config-localsettings-cli-upgrade" )
                        );
index 3472b7f..13d5d42 100644 (file)
@@ -173,7 +173,7 @@ abstract class DatabaseInstaller {
                }
                $this->db->selectDB( $this->getVar( 'wgDBname' ) );
 
-               if( $this->db->tableExists( 'archive', __METHOD__ ) ) {
+               if ( $this->db->tableExists( 'archive', __METHOD__ ) ) {
                        $status->warning( 'config-install-tables-exist' );
                        $this->enableLB();
                        return $status;
@@ -183,7 +183,7 @@ abstract class DatabaseInstaller {
                $this->db->begin( __METHOD__ );
 
                $error = $this->db->sourceFile( $this->db->getSchemaPath() );
-               if( $error !== true ) {
+               if ( $error !== true ) {
                        $this->db->reportQueryError( $error, 0, '', __METHOD__ );
                        $this->db->rollback( __METHOD__ );
                        $status->fatal( 'config-install-tables-failed', $error );
@@ -191,7 +191,7 @@ abstract class DatabaseInstaller {
                        $this->db->commit( __METHOD__ );
                }
                // Resume normal operations
-               if( $status->isOk() ) {
+               if ( $status->isOk() ) {
                        $this->enableLB();
                }
                return $status;
@@ -335,6 +335,8 @@ abstract class DatabaseInstaller {
         * @return String
         */
        public function getReadableName() {
+               // Give grep a chance to find the usages:
+               // config-type-mysql, config-type-postgres, config-type-sqlite, config-type-oracle
                return wfMessage( 'config-type-' . $this->getName() )->text();
        }
 
@@ -508,8 +510,7 @@ abstract class DatabaseInstaller {
         * @return String
         */
        public function getInstallUserBox() {
-               return
-                       Html::openElement( 'fieldset' ) .
+               return Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-install-account' )->text() ) .
                        $this->getTextBox( '_InstallUser', 'config-db-username', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-username' ) ) .
                        $this->getPasswordBox( '_InstallPassword', 'config-db-password', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-install-password' ) ) .
@@ -568,7 +569,7 @@ abstract class DatabaseInstaller {
                        $this->setVar( 'wgDBpassword', $this->getVar( '_InstallPassword' ) );
                }
 
-               if( $this->getVar( '_CreateDBAccount' ) && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
+               if ( $this->getVar( '_CreateDBAccount' ) && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
                        return Status::newFatal( 'config-db-password-empty', $this->getVar( 'wgDBuser' ) );
                }
 
@@ -587,7 +588,7 @@ abstract class DatabaseInstaller {
                }
                $this->db->selectDB( $this->getVar( 'wgDBname' ) );
 
-               if( $this->db->selectRow( 'interwiki', '*', array(), __METHOD__ ) ) {
+               if ( $this->db->selectRow( 'interwiki', '*', array(), __METHOD__ ) ) {
                        $status->warning( 'config-install-interwiki-exists' );
                        return $status;
                }
@@ -600,9 +601,11 @@ abstract class DatabaseInstaller {
                if ( !$rows ) {
                        return Status::newFatal( 'config-install-interwiki-list' );
                }
-               foreach( $rows as $row ) {
+               foreach ( $rows as $row ) {
                        $row = preg_replace( '/^\s*([^#]*?)\s*(#.*)?$/', '\\1', $row ); // strip comments - whee
-                       if ( $row == "" ) continue;
+                       if ( $row == "" ) {
+                               continue;
+                       }
                        $row .= "||";
                        $interwikis[] = array_combine(
                                array( 'iw_prefix', 'iw_url', 'iw_local', 'iw_api', 'iw_wikiid' ),
index b88ae61..f0c5a21 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Deployment
  */
 
-require_once( __DIR__ . '/../../maintenance/Maintenance.php' );
+require_once __DIR__ . '/../../maintenance/Maintenance.php';
 
 /**
  * Class for handling database updates. Roughly based off of updaters.inc, with
@@ -157,7 +157,7 @@ abstract class DatabaseUpdater {
         */
        public static function newForDB( &$db, $shared = false, $maintenance = null ) {
                $type = $db->getType();
-               if( in_array( $type, Installer::getDBTypes() ) ) {
+               if ( in_array( $type, Installer::getDBTypes() ) ) {
                        $class = ucfirst( $type ) . 'Updater';
                        return new $class( $db, $shared, $maintenance );
                } else {
@@ -184,7 +184,7 @@ abstract class DatabaseUpdater {
                        return;
                }
                global $wgCommandLineMode;
-               if( !$wgCommandLineMode ) {
+               if ( !$wgCommandLineMode ) {
                        $str = htmlspecialchars( $str );
                }
                echo $str;
@@ -302,7 +302,7 @@ abstract class DatabaseUpdater {
         * @param string $fieldName The field to be modified
         * @param string $sqlPath The path to the SQL change path
         */
-       public function modifyExtensionField( $tableName, $fieldName, $sqlPath) {
+       public function modifyExtensionField( $tableName, $fieldName, $sqlPath ) {
                $this->extensionUpdates[] = array( 'modifyField', $tableName, $fieldName, $sqlPath, true );
        }
 
@@ -357,7 +357,7 @@ abstract class DatabaseUpdater {
                $updates = $this->updatesSkipped;
                $this->updatesSkipped = array();
 
-               foreach( $updates as $funcList ) {
+               foreach ( $updates as $funcList ) {
                        $func = $funcList[0];
                        $arg = $funcList[1];
                        $origParams = $funcList[2];
@@ -400,7 +400,7 @@ abstract class DatabaseUpdater {
 
                $this->setAppliedUpdates( $wgVersion, $this->updates );
 
-               if( $this->fileHandle ) {
+               if ( $this->fileHandle ) {
                        $this->skipSchema = false;
                        $this->writeSchemaUpdateFile();
                        $this->setAppliedUpdates( "$wgVersion-schema", $this->updatesSkipped );
@@ -422,14 +422,14 @@ abstract class DatabaseUpdater {
                foreach ( $updates as $params ) {
                        $origParams = $params;
                        $func = array_shift( $params );
-                       if( !is_array( $func ) && method_exists( $this, $func ) ) {
+                       if ( !is_array( $func ) && method_exists( $this, $func ) ) {
                                $func = array( $this, $func );
                        } elseif ( $passSelf ) {
                                array_unshift( $params, $this );
                        }
                        $ret = call_user_func_array( $func, $params );
                        flush();
-                       if( $ret !== false ) {
+                       if ( $ret !== false ) {
                                $updatesDone[] = $origParams;
                        } else {
                                $updatesSkipped[] = array( $func, $params, $origParams );
@@ -445,7 +445,7 @@ abstract class DatabaseUpdater {
         */
        protected function setAppliedUpdates( $version, $updates = array() ) {
                $this->db->clearFlag( DBO_DDLMODE );
-               if( !$this->canUseNewUpdatelog() ) {
+               if ( !$this->canUseNewUpdatelog() ) {
                        return;
                }
                $key = "updatelist-$version-" . time();
@@ -483,7 +483,7 @@ abstract class DatabaseUpdater {
        public function insertUpdateRow( $key, $val = null ) {
                $this->db->clearFlag( DBO_DDLMODE );
                $values = array( 'ul_key' => $key );
-               if( $val && $this->canUseNewUpdatelog() ) {
+               if ( $val && $this->canUseNewUpdatelog() ) {
                        $values['ul_value'] = $val;
                }
                $this->db->insert( 'updatelog', $values, __METHOD__, 'IGNORE' );
@@ -600,7 +600,7 @@ abstract class DatabaseUpdater {
         */
        public function appendLine( $line ) {
                $line = rtrim( $line ) . ";\n";
-               if( fwrite( $this->fileHandle, $line ) === false ) {
+               if ( fwrite( $this->fileHandle, $line ) === false ) {
                        throw new MWException( "trouble writing file" );
                }
                return false;
@@ -628,7 +628,7 @@ abstract class DatabaseUpdater {
                if ( !$isFullPath ) {
                        $path = $this->db->patchPath( $path );
                }
-               if( $this->fileHandle !== null ) {
+               if ( $this->fileHandle !== null ) {
                        $this->copyFile( $path );
                } else {
                        $this->db->sourceFile( $path );
@@ -698,7 +698,7 @@ abstract class DatabaseUpdater {
 
                if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
                        $this->output( "...skipping: '$table' table doesn't exist yet.\n" );
-               } else if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
+               } elseif ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
                        $this->output( "...index $index already set on $table table.\n" );
                } else {
                        return $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
@@ -844,7 +844,7 @@ abstract class DatabaseUpdater {
                        $this->output( "...$table table does not exist, skipping modify field patch.\n" );
                } elseif ( !$this->db->fieldExists( $table, $field, __METHOD__ ) ) {
                        $this->output( "...$field field does not exist in $table table, skipping modify field patch.\n" );
-               } elseif( $this->updateRowExists( $updateKey ) ) {
+               } elseif ( $this->updateRowExists( $updateKey ) ) {
                        $this->output( "...$field in table $table already modified by patch $patch.\n" );
                } else {
                        $this->insertUpdateRow( $updateKey );
@@ -865,6 +865,7 @@ abstract class DatabaseUpdater {
                if ( $wgLocalisationCacheConf['manualRecache'] ) {
                        $this->rebuildLocalisationCache();
                }
+               MessageBlobStore::clear();
                $this->output( "done.\n" );
        }
 
@@ -977,7 +978,7 @@ abstract class DatabaseUpdater {
         * Migrates user options from the user table blob to user_properties
         */
        protected function doMigrateUserOptions() {
-               if( $this->db->tableExists( 'user_properties' ) ) {
+               if ( $this->db->tableExists( 'user_properties' ) ) {
                        $cl = $this->maintenance->runChild( 'ConvertUserOptions', 'convertUserOptions.php' );
                        $cl->execute();
                        $this->output( "done.\n" );
index 5aa78cc..868e4da 100644 (file)
@@ -142,6 +142,8 @@ Object caching is not enabled.",
        'config-mod-security'             => "'''Warning:''' Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.
 Refer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
        'config-diff3-bad'                => 'GNU diff3 not found.',
+       'config-git'                      => 'Found the Git version control software: <code>$1</code>.',
+       'config-git-bad'                  => 'Git version control software not found.',
        'config-imagemagick'              => 'Found ImageMagick: <code>$1</code>.
 Image thumbnailing will be enabled if you enable uploads.',
        'config-gd'                       => 'Found GD graphics library built-in.
@@ -259,7 +261,7 @@ If you do not see the database system you are trying to use listed below, then f
        'config-missing-db-host'          => 'You must enter a value for "Database host"',
        'config-missing-db-server-oracle' => 'You must enter a value for "Database TNS"',
        'config-invalid-db-server-oracle' => 'Invalid database TNS "$1".
-Use only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and dots (.).',
+Use either "TNS Name" or an "Easy Connect" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])',
        'config-invalid-db-name'          => 'Invalid database name "$1".
 Use only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).',
        'config-invalid-db-prefix'        => 'Invalid database prefix "$1".
@@ -315,7 +317,7 @@ This is '''not recommended''' unless you are having problems with your wiki.",
        'config-upgrade-done-no-regenerate' => "Upgrade complete.
 
 You can now [$1 start using your wiki].",
-       'config-regenerate'               => 'Regenerate <code>LocalSettings.php</code> →',
+       'config-regenerate'               => 'Regenerate LocalSettings.php →',
        'config-show-table-status'        => '<code>SHOW TABLE STATUS</code> query failed!',
        'config-unknown-collation'        => "'''Warning:''' Database is using unrecognized collation.",
        'config-db-web-account'           => 'Database account for web access',
@@ -334,6 +336,12 @@ The account you specify here must already exist.',
 
 If your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.
 If your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
+       'config-mysql-only-myisam-dep'    => "'''Warning:''' MyISAM is the only available storage engine for MySQL, which is not recommended for use with MediaWiki, because:
+* it barely supports concurrency due to table locking
+* it is more prone to corruption than other engines
+* the MediaWiki codebase does not always handle MyISAM as it should
+
+Your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
        'config-mysql-engine-help'        => "'''InnoDB''' is almost always the best option, since it has good concurrency support.
 
 '''MyISAM''' may be faster in single-user or read-only installations.
@@ -455,6 +463,8 @@ Ideally, this should not be accessible from the web.',
        'config-logo-help'                => "MediaWiki's default skin includes space for a 135x160 pixel logo above the sidebar menu.
 Upload an image of the appropriate size, and enter the URL here.
 
+You can use <code>\$wgStylePath</code> or <code>\$wgScriptPath</code> if your logo is relative to those paths.
+
 If you do not want a logo, leave this box blank.",
        'config-instantcommons'           => 'Enable Instant Commons',
        'config-instantcommons-help'      => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is a feature that allows wikis to use images, sounds and other media found on the [//commons.wikimedia.org/ Wikimedia Commons] site.
@@ -548,6 +558,9 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
        'config-download-localsettings' => 'Download <code>LocalSettings.php</code>',
        'config-help' => 'help',
        '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/Manual:Extensions extensions]?
+
+You can browse [//www.mediawiki.org/wiki/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'      => "'''MediaWiki has been successfully installed.'''",
        'mainpagedocfooter' => "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.
 
@@ -574,6 +587,7 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
  * @author Shirayuki
  * @author Siebrand
  * @author Umherirrender
+ * @author Waldir
  */
 $messages['qqq'] = array(
        'config-desc' => '{{desc}}',
@@ -602,6 +616,7 @@ Used as error message.',
        'config-page-name' => '{{Identical|Name}}',
        'config-page-options' => '{{Identical|Options}}',
        'config-page-install' => '{{Identical|Install}}',
+       'config-page-releasenotes' => '{{Identical|Release notes}}',
        'config-page-copying' => 'This is a link to the full GPL text',
        'config-restart' => 'Button text to confirm the installation procedure has to be restarted.',
        'config-copyright' => 'This message follows {{msg-mw|config-env-good}}.
@@ -643,6 +658,10 @@ Parameters:
        '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',
+       'config-git' => 'Message if Git version control software is available.
+Parameter:
+* $1 is the <code>Git</code> executable file name.',
+       'config-git-bad' => 'Message if Git version control software is not found.',
        'config-imagemagick' => '$1 is ImageMagick\'s <code>convert</code> executable file name.
 
 Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
@@ -744,9 +763,11 @@ See also:
 * $1 - full URL of index.php
 See also:
 * {{msg-mw|config-upgrade-done}}',
+       'config-regenerate' => 'This message appears in a button after LocalSettings.php is generated and downloaded at the end of the MediaWiki installation process.',
        'config-show-table-status' => '{{doc-important|"<code>SHOW TABLE STATUS</code>" is a MySQL command. Do not translate this.}}',
        'config-db-web-account-same' => 'checkbox label',
        'config-db-web-create' => 'checkbox label',
+       'config-mysql-only-myisam-dep' => 'Used as warning message when mysql does not support the minimum suggested feature set.',
        'config-ns-generic' => 'Used as label for "namespace type" radio button.
 
 See also:
@@ -961,6 +982,7 @@ See also:
 {{Identical|Help}}',
        'config-nofile' => 'Used as failure message. Parameters:
 * $1 - filename',
+       'config-extension-link' => 'Shown on last page of installation to inform about possible extensions.',
        'mainpagetext' => 'Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.',
        'mainpagedocfooter' => 'Along with {{msg-mw|mainpagetext}}, the text you will see on the Main Page when your wiki is installed.
 This might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example.',
@@ -1043,12 +1065,10 @@ U gebruik tans $2.',
        'config-sqlite-dir' => 'Gids vir SQLite se data:',
        'config-oracle-def-ts' => 'Standaard tabelruimte:',
        'config-oracle-temp-ts' => 'Tydelike tabelruimte:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'MySQL-instellings',
        'config-header-postgres' => 'PostgreSQL-instellings',
        'config-header-sqlite' => 'SQLite-instellings',
        'config-header-oracle' => 'Oracle-instellings',
-       'config-header-ibm_db2' => 'Instellings vir IBM DB2',
        'config-invalid-db-type' => 'Ongeldige databasistipe',
        'config-missing-db-name' => 'U moet \'n waarde vir "Databasnaam" verskaf',
        'config-sqlite-readonly' => 'Die lêer <code>$1</code> kan nie geskryf word nie.',
@@ -1056,7 +1076,7 @@ U gebruik tans $2.',
        'config-upgrade-done-no-regenerate' => 'Opgradering is voltooi.
 
 U kan nou [$1 u wiki gebruik].',
-       'config-regenerate' => 'Herskep <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Herskep LocalSettings.php →',
        'config-show-table-status' => 'Die uitvoer van <code>SHOW TABLE STATUS</code> het gefaal!',
        'config-db-web-account' => 'Databasisgebruiker vir toegang tot die web',
        'config-mysql-engine' => 'Stoor-enjin:',
@@ -1162,7 +1182,7 @@ $messages['aln'] = array(
 
 * [//www.mediawiki.org/wiki/Help:Configuration_settings Konfigurimi i MediaWikit]
 * [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWikit]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWikit]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWikit]', # Fuzzy
 );
 
 /** Amharic (አማርኛ)
@@ -1175,7 +1195,7 @@ $messages['am'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Aragonese (aragonés)
@@ -1189,7 +1209,7 @@ $messages['an'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de caracteristicas confegurables]
 * [//www.mediawiki.org/wiki/Manual:FAQ Preguntas cutianas sobre MediaWiki (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correu sobre ta anuncios de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correu sobre ta anuncios de MediaWiki]", # Fuzzy
 );
 
 /** Old English (Ænglisc)
@@ -1202,7 +1222,7 @@ $messages['ang'] = array(
 == Beȝinnunȝ ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Onfæstnunȝa ȝesetednessa ȝetæl]
 * [//www.mediawiki.org/wiki/Manual:FAQ Ȝetæl oft ascodra ascunȝa ymb MediaǷiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ǣrendunȝȝetæl nīƿra MediaǷiki forþsendnessa]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ǣrendunȝȝetæl nīƿra MediaǷiki forþsendnessa]', # Fuzzy
 );
 
 /** Arabic (العربية)
@@ -1268,7 +1288,7 @@ $messages['ary'] = array(
 == L-bdaya mĝa MediaWiki ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dyal l-paramétraṫ dyal l-konfigurasyon]
 * [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ fe MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ ĝla versyonaṫ jdad dyal MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ ĝla versyonaṫ jdad dyal MediaWiki]', # Fuzzy
 );
 
 /** Egyptian Spoken Arabic (مصرى)
@@ -1281,10 +1301,10 @@ $messages['arz'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings لستة اعدادات الضبط]
 * [//www.mediawiki.org/wiki/Manual:FAQ أسئلة بتكرر حوالين الميدياويكى]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لستة الايميلات بتاعة اعلانات الميدياويكى]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce لستة الايميلات بتاعة اعلانات الميدياويكى]', # Fuzzy
 );
 
-/** Assamese (à¦\85সমà§\80à§\9fা)
+/** Assamese (à¦\85সমà§\80য়া)
  * @author Chaipau
  * @author Gitartha.bordoloi
  */
@@ -1295,7 +1315,7 @@ $messages['as'] = array(
 == আৰম্ভণি কৰিবলৈ ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Asturian (asturianu)
@@ -1381,7 +1401,6 @@ $messages['az'] = array(
        'config-page-install' => 'Nizamlama',
        'config-page-complete' => 'Komplektləşdir!',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-mysql-myisam' => 'MyISAM',
        'config-mysql-utf8' => 'UTF-8',
        'config-ns-generic' => 'Layihə',
@@ -1395,7 +1414,7 @@ $messages['az'] = array(
 == Faydalı keçidlər ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Tənzimləmələrin siyahısı]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqqında tez-tez soruşulan suallar]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]', # Fuzzy
 );
 
 /** Bashkir (башҡортса)
@@ -1408,7 +1427,7 @@ $messages['ba'] = array(
 == Файҙалы сығанаҡтар ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләүҙәр исемлеге (инг.)];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тураһында йыш бирелгән һорауҙар һәм яуаптар (инг.)];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның яңы версиялары тураһында хәбәрҙәр алып тороу].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ның яңы версиялары тураһында хәбәрҙәр алып тороу].', # Fuzzy
 );
 
 /** Bavarian (Boarisch)
@@ -1422,7 +1441,7 @@ $messages['bar'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen voh de Konfigurazionsvariaablen]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]', # Fuzzy
 );
 
 /** Southern Balochi (بلوچی مکرانی)
@@ -1434,7 +1453,7 @@ $messages['bcc'] = array(
 == شروع بیت ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Bikol Central (Bikol Central)
@@ -1447,7 +1466,7 @@ $messages['bcl'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Belarusian (беларуская)
@@ -1460,7 +1479,7 @@ $messages['be'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]
 * [//www.mediawiki.org/wiki/Manual:FAQ ЧАПЫ MediaWiki (англ.)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]', # Fuzzy
 );
 
 /** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
@@ -1698,7 +1717,6 @@ ResourceLoader, складнік MediaWiki, будзе абходзіць гэт
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki падтрымлівае наступныя сыстэмы базаў зьвестак:
 
 $1
@@ -1708,12 +1726,10 @@ $1
        'config-support-postgres' => '* $1 — вядомая сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL ([http://www.php.net/manual/en/pgsql.installation.php як кампіляваць PHP з падтрымкай PostgreSQL]). Яна можа ўтрымліваць дробныя памылкі, і не рэкамэндуецца выкарыстоўваць яе для працуючых праектаў.',
        'config-support-sqlite' => '* $1 — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([http://www.php.net/manual/en/pdo.installation.php як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)',
        'config-support-oracle' => '* $1 зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([http://www.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])',
-       'config-support-ibm_db2' => '* $1 — база зьвестак маштабу прадпрыемства. ([http://www.php.net/manual/en/ibm-db2.installation.php Як скампіляваць PHP з падтрымкай IBM DB2])',
        'config-header-mysql' => 'Налады MySQL',
        'config-header-postgres' => 'Налады PostgreSQL',
        'config-header-sqlite' => 'Налады SQLite',
        'config-header-oracle' => 'Налады Oracle',
-       'config-header-ibm_db2' => 'Налады IBM DB2',
        'config-invalid-db-type' => 'Няслушны тып базы зьвестак',
        'config-missing-db-name' => 'Вы павінны ўвесьці значэньне парамэтру «Імя базы зьвестак»',
        'config-missing-db-host' => 'Вы павінны ўвесьці значэньне парамэтру «Хост базы зьвестак»',
@@ -1775,7 +1791,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Абнаўленьне скончанае.
 
 Цяпер Вы можаце [$1 пачаць працу з вікі].',
-       'config-regenerate' => 'Рэгенэраваць <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Рэгенэраваць LocalSettings.php →',
        'config-show-table-status' => "Запыт '<code>SHOW TABLE STATUS</code>' не атрымаўся!",
        'config-unknown-collation' => "'''Папярэджаньне:''' база зьвестак выкарыстоўвае нераспазнанае супастаўленьне.",
        'config-db-web-account' => 'Рахунак базы зьвестак для вэб-доступу',
@@ -1805,7 +1821,6 @@ chmod a+w $3</pre>',
 Гэта болей эфэктыўна за рэжым MySQL UTF-8, і дазваляе Вам выкарыстоўваць увесь дыяпазон сымбаляў Unicode.
 
 У '''рэжыме UTF-8''', MySQL ведае, якая табліцы сымбаляў выкарыстоўваецца ў Вашых зьвестках, і можа адпаведна прадстаўляць і канвэртаваць іх, але гэта не дазволіць Вам захоўваць сымбалі па-за межамі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базавага шматмоўнага дыяпазону].",
-       'config-ibm_db2-low-db-pagesize' => "Вашая база зьвестак DB2 мае таблічную прасторну зь недастатковым памерам старонкі. Памер старонкі мусіць быць ня менш за '''32к'''.",
        'config-site-name' => 'Назва вікі:',
        'config-site-name-help' => 'Назва будзе паказвацца ў загалоўку браўзэра і ў некаторых іншых месцах.',
        'config-site-name-blank' => 'Увядзіце назву сайта.',
@@ -1915,7 +1930,7 @@ chmod a+w $3</pre>',
        'config-logo-help' => 'Афармленьне MediaWiki па змоўчваньні уключае прастору для лягатыпу памерам 135×160 піксэляў у верхнім левым куце.
 Загрузіце выяву адпаведнага памеру і увядзіце тут URL-адрас.
 
-Калі Вы не жадаеце мець ніякага лягатыпу, пакіньце поле пустым.',
+Калі Вы не жадаеце мець ніякага лягатыпу, пакіньце поле пустым.', # Fuzzy
        'config-instantcommons' => 'Дазволіць Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымасьць, якая дазваляе вікі выкарыстоўваць выявы, гукі і іншыя мэдыя, якія знаходзяцца на сайце [//commons.wikimedia.org/ Wikimedia Commons].
 Каб гэта зрабіць, MediaWiki патрабуе доступу да Інтэрнэту.
@@ -2224,7 +2239,6 @@ $1
 Това включва сурови данни за потребителите (адреси за е-поща, хеширани пароли), както и изтрити версии на страници и друга чувствителна и с ограничен достъп информация от и за уикито.
 
 Базата от данни е препоръчително да се разположи на друго място, например в <code>/var/lib/mediawiki/yourwiki</code>.",
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'МедияУики поддържа следните системи за бази от данни:
 
 $1
@@ -2234,12 +2248,10 @@ $1
        'config-support-postgres' => '* $1 е популярна система за бази от данни с отворен изходен код, която е алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php как се компилира PHP с поддръжка на PostgreSQL]). Възможно е все още да има грешки, затова не се препоръчва да се използва в общодостъпна среда.',
        'config-support-sqlite' => '* $1 е лека система за база от данни, която е много добре поддържана. ([http://www.php.net/manual/en/pdo.installation.php Как се компилира PHP с поддръжка на SQLite], използва PDO)',
        'config-support-oracle' => '* $1 е комерсиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как се компилира PHP с поддръжка на OCI8])',
-       'config-support-ibm_db2' => '* $1 е комерсиална фирмена база от данни. ([http://www.php.net/manual/en/ibm-db2.installation.php Как се компилира PHP с поддръжка на IBM DB2])',
        'config-header-mysql' => 'Настройки за MySQL',
        'config-header-postgres' => 'Настройки за PostgreSQL',
        'config-header-sqlite' => 'Настройки за SQLite',
        'config-header-oracle' => 'Настройки за Oracle',
-       'config-header-ibm_db2' => 'Настройки за IBM DB2',
        'config-invalid-db-type' => 'Невалиден тип база от данни',
        'config-missing-db-name' => 'Необходимо е да се въведе стойност за "Име на базата от данни"',
        'config-missing-db-host' => 'Необходимо е да се въведе стойност за "Хост на базата от данни"',
@@ -2301,7 +2313,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Обновяването приключи.
 
 Вече е възможно [$1 да използвате уикито].',
-       'config-regenerate' => 'Създаване на <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Създаване на LocalSettings.php →',
        'config-show-table-status' => 'Заявката <code>SHOW TABLE STATUS</code> не сполучи!',
        'config-unknown-collation' => "'''Предупреждение:''' Базата от данни използва неразпозната колация.",
        'config-db-web-account' => 'Сметка за уеб достъп до базата от данни',
@@ -2439,7 +2451,7 @@ chmod a+w $3</pre>',
        'config-logo-help' => 'Обликът по подразбиране на МедияУики вклчва място с размери 135х160 пиксела за лого над страничното меню.
 Ако има наличен файл с подходящ размер, неговият адрес може да бъде посочен тук.
 
-Ако не е необходимо лого, полето може да се остави празно.',
+Ако не е необходимо лого, полето може да се остави празно.', # Fuzzy
        'config-instantcommons' => 'Включване на Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функционалност, която позволява на уикитата да използват картинки, звуци и друга медиа от сайта на Уикимедия [//commons.wikimedia.org/ Общомедия].
 За да е възможно това, МедияУики изисква достъп до Интернет.
@@ -2552,7 +2564,7 @@ $messages['bjn'] = array(
 == Gasan bamula ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Daptar konpigurasi setélan]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki nang rancak ditakunakan]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki rilis milis]', # Fuzzy
 );
 
 /** Bengali (বাংলা)
@@ -2598,12 +2610,10 @@ $messages['bn'] = array(
        'config-sqlite-dir' => 'এসকিউলাইট ডেটা ডিরেক্টরি:',
        'config-oracle-def-ts' => 'পূর্বনির্ধারিত টেবিলস্পেস',
        'config-oracle-temp-ts' => 'সাময়কি টেবিলস্পেস:',
-       'config-type-ibm_db2' => 'আইবিএম ডিবি২',
        'config-header-mysql' => 'মাইএসকিউএল সেটিংস',
        'config-header-postgres' => 'পোস্টগ্রেএসকিউএল সেটিংস',
        'config-header-sqlite' => 'এসকিউলাইট সেটিংস',
        'config-header-oracle' => 'ওরাকল সেটিংস',
-       'config-header-ibm_db2' => 'আইবিএম ডিবি২ সেটিংস',
        'config-invalid-db-type' => 'ডেটাবেজের ধরন অগ্রহযোগ্য',
        'config-missing-db-name' => 'আপনাকে অবশ্যই "ডেটাবেজ নাম"-এর জন্য একটি মান প্রবেশ করাতে হবে',
        'config-missing-db-host' => 'আপনাকে অবশ্যই "ডেটাবেজ হোস্ট"-এর জন্য একটি মান প্রবেশ করাতে হবে',
@@ -2633,7 +2643,7 @@ $messages['bn'] = array(
        'config-optional-continue' => 'আরও প্রশ্ন জিজ্ঞেস করুন।',
        'config-optional-skip' => 'আমি ইতিমধ্যেই বিরক্ত হয়ে গেছি, উইকিটি ইন্সটল করো।',
        'config-profile' => 'ব্যবহারকারী অধিকার প্রোফাইল:',
-       'config-profile-wiki' => 'গতানুগতিক উইকি',
+       'config-profile-wiki' => 'গতানুগতিক উইকি', # Fuzzy
        'config-profile-no-anon' => 'অ্যাকাউন্ট তৈরি করা বাধ্যতামূলক',
        'config-profile-fishbowl' => 'শুধুমাত্র নির্ধারিত সম্পাদকদের  জন্যই',
        'config-profile-private' => 'ব্যক্তিগত উইকি',
@@ -2667,7 +2677,7 @@ $messages['bn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]
 * [//www.mediawiki.org/wiki/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]', # Fuzzy
 );
 
 /** Bishnupria Manipuri (বিষ্ণুপ্রিয়া মণিপুরী)
@@ -2680,7 +2690,7 @@ $messages['bpy'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings কনফিগারেশন সেটিংর তালিকাহান]
 * [//www.mediawiki.org/wiki/Manual:FAQ মিডিয়া উইকি আঙলাক]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]', # Fuzzy
 );
 
 /** Breton (brezhoneg)
@@ -2926,7 +2936,7 @@ Da hizivaat anezho da VediaWiki $1, klikañ war '''Kenderc'hel'''.",
        'config-upgrade-done-no-regenerate' => 'Hizivadenn kaset da benn.
 
 Gallout a rit [$1 kregiñ da implijout ho wiki].',
-       'config-regenerate' => 'Adgenel <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Adgenel LocalSettings.php →',
        'config-show-table-status' => "C'hwitet ar reked <code>SHOW TABLE STATUS</code> !",
        'config-unknown-collation' => "'''Diwallit :''' Emañ an diaz roadennoù o renkañ an traoù diouzh un urzh lizherennek dianav.",
        'config-db-web-account' => 'Kont an diaz roadennoù evit ar voned Kenrouedad',
@@ -3198,7 +3208,7 @@ $messages['ce'] = array(
 == Цхьаболу пайде гlирсаш ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Гlирс нисбан тарлушболу могlам];
 * [//www.mediawiki.org/wiki/Manual:FAQ Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].', # Fuzzy
 );
 
 /** Cebuano (Cebuano)
@@ -3210,7 +3220,7 @@ $messages['ceb'] = array(
 == Pagsugod ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listahan sa mga setting sa kompigurasyon]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce  Mailing list sa mga release sa MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce  Mailing list sa mga release sa MediaWiki]', # Fuzzy
 );
 
 /** Sorani Kurdish (کوردی)
@@ -3242,7 +3252,7 @@ $messages['cps'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga setting sang konpigurayon]
 * [//www.mediawiki.org/wiki/Manual:FAQ Mga perme napangkot sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]', # Fuzzy
 );
 
 /** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
@@ -3254,7 +3264,7 @@ $messages['crh-cyrl'] = array(
 == Базы файдалы сайтлар ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Олуджы сазламалар джедвели];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki боюнджа сыкъ берильген суаллернен джеваплар];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ янъы версияларынынъ чыкъувындан хабер йиберюв].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ янъы версияларынынъ чыкъувындан хабер йиберюв].", # Fuzzy
 );
 
 /** Crimean Turkish (Latin script) (qırımtatarca (Latin)‎)
@@ -3266,11 +3276,12 @@ $messages['crh-latn'] = array(
 == Bazı faydalı saytlar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Olucı sazlamalar cedveli];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki boyunca sıq berilgen suallernen cevaplar];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv].", # Fuzzy
 );
 
 /** Czech (česky)
  * @author Danny B.
+ * @author Jezevec
  * @author Mormegil
  * @author 아라
  */
@@ -3403,6 +3414,8 @@ Kešování objektů bude vypnuto.",
        'config-mod-security' => "'''Upozornění''': váš webový server má zapnuto [http://modsecurity.org/ mod_security]. Při chybné konfiguraci může způsobovat potíže MediaWiki či dalším programům, které umožňují ukládat libovolný obsah.
 Pokud narazíte na náhodné chyby, podívejte se do [http://modsecurity.org/documentation/ dokumentace mod_security] nebo kontaktujte technickou podporu vašeho poskytovatele.",
        'config-diff3-bad' => 'Nebyl nalezen GNU diff3.',
+       'config-git' => 'Nalezen software pro správu verzí Git: <code>$1</code>.',
+       'config-git-bad' => 'Software pro správu verzí Git nebyl nalezen.',
        'config-imagemagick' => 'Nalezen ImageMagick: <code>$1</code>.
 Pokud povolíte načítání souborů, bude zapnuto vytváření náhledů.',
        'config-gd' => 'Nalezena vestavěná grafická knihovna GD.
@@ -3501,7 +3514,6 @@ Zvažte umístění databáze někam zcela jinam, například do <code>/var/lib/
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Věštba',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki podporuje následující databázové systémy:
 
 $1
@@ -3511,12 +3523,10 @@ Pokud v nabídce níže nevidíte databázový systém, který chcete použít,
        'config-support-postgres' => '* $1 je populární open-source databázový systém používaný jako alternativa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php jak přeložit PHP s podporou PostgreSQL]). Mohou se vyskytnout ještě nějaké menší chyby, použití v produkčním prostředí se nedoporučuje.',
        'config-support-sqlite' => '* $1 je velmi dobře podporovaný lehký databázový systém. ([http://www.php.net/manual/en/pdo.installation.php Jak přeložit PHP s podporou SQLite], používá PDO)',
        'config-support-oracle' => '* $1 je komerční podniková databáze. ([http://www.php.net/manual/en/oci8.installation.php Jak přeložit PHP s podporou OCI8])',
-       'config-support-ibm_db2' => '* $1 je komerční podniková databáze. ([http://www.php.net/manual/en/ibm-db2.installation.php Jak přeložit PHP s podporou IBM DB2])',
        'config-header-mysql' => 'Nastavení MySQL',
        'config-header-postgres' => 'Nastavení PostgreSQL',
        'config-header-sqlite' => 'Nastavení SQLite',
        'config-header-oracle' => 'Nastavení Oracle',
-       'config-header-ibm_db2' => 'Nastavení IBM DB2',
        'config-invalid-db-type' => 'Chybný typ databáze',
        'config-missing-db-name' => 'Musíte zadat hodnotu pro „Jméno databáze“',
        'config-missing-db-host' => 'Musíte zadat hodnotu pro „Databázový server“',
@@ -3578,7 +3588,7 @@ To se ale '''nedoporučuje''', pokud s wiki nemáte problémy.",
        'config-upgrade-done-no-regenerate' => 'Aktualizace byla dokončena.
 
 Svou wiki teď můžete [$1 začít používat].',
-       'config-regenerate' => 'Přegenerovat <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Přegenerovat LocalSettings.php →',
        'config-show-table-status' => 'Dotaz <code>SHOW TABLE STATUS</code> se nezdařil!',
        'config-unknown-collation' => "'''Upozornění:''' Databáze používá nerozpoznané řazení.",
        'config-db-web-account' => 'Databázový účet pro webový přístup',
@@ -3608,7 +3618,6 @@ Databáze MyISAM bývají poškozeny častěji než databáze InnoDB.",
 To je výkonnější než UTF-8 režim MySQL a umožňuje využít plný rozsah znaků Unicode.
 
 V '''režimu UTF-8''' bude MySQL znát znakovou sadu vašich dat a může je příslušně zobrazovat a převádět, ale neumožní vám uložit znaky mimo [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-       'config-ibm_db2-low-db-pagesize' => "Vaše DB2 databáze má implicitní tabulkový prostor s nedostatečnou velikostí stránky. Velikost stránky musí být minimálně '''32K'''.",
        'config-site-name' => 'Název wiki:',
        'config-site-name-help' => 'Bude se zobrazovat v titulku prohlížeče a na dalších místech.',
        'config-site-name-blank' => 'Zadejte název serveru.',
@@ -3718,6 +3727,8 @@ Tento adresář by ideálně neměl být dostupný z webu.',
        'config-logo-help' => 'Základní vzhled MediaWiki zahrnuje místo pro logo o velikosti 135×160 pixelů nad bočním menu.
 Načtěte obrázek odpovídající velikosti a zadejte sem jeho URL.
 
+Pokud je vaše logo umístěno relativně vůči <code>$wgStylePath</code> nebo <code>$wgScriptPath</code>, můžete zde tyto proměnné použít.
+
 Pokud logo nechcete, ponechte toto pole prázdné.',
        'config-instantcommons' => 'Zapnout Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] je funkce, která umožňuje wiki používat obrázky, zvuky a další mediální soubory ze serveru [//commons.wikimedia.org/wiki/Hlavn%C3%AD_strana Wikimedia Commons].
@@ -3837,7 +3848,7 @@ $messages['cv'] = array(
 == Пулăшма пултарĕç ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Ĕнерлевсен списокĕ];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki тăрăх час-часах ыйтакан ыйтусемпе хуравсем];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верси тухнине пĕлтерекен рассылка].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верси тухнине пĕлтерекен рассылка].', # Fuzzy
 );
 
 /** Welsh (Cymraeg)
@@ -3851,7 +3862,7 @@ $messages['cy'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]
 * [//www.mediawiki.org/wiki/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]', # Fuzzy
 );
 
 /** Danish (dansk)
@@ -3864,10 +3875,11 @@ $messages['da'] = array(
 == At komme i gang ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listen over opsætningsmuligheder]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki ofte stillede spørgsmål]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]', # Fuzzy
 );
 
 /** German (Deutsch)
+ * @author Geitost
  * @author Kghbln
  * @author LWChris
  * @author Metalhead64
@@ -3940,7 +3952,7 @@ Dieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der v
 
 Dieses 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.
 
-Eine <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.",
+Eine <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-sidebar' => '* [//www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]
 * [//www.mediawiki.org/wiki/Help:Contents/de Benutzeranleitung]
 * [//www.mediawiki.org/wiki/Manual:Contents/de Administratorenanleitung]
@@ -4003,11 +4015,13 @@ Der Installationsvorgang könnte daher scheitern!",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] ist installiert',
        'config-apc' => '[http://www.php.net/apc APC] ist installiert',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert',
-       'config-no-cache' => "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] konnten nicht gefunden werden.
+       'config-no-cache' => "'''Warnung:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] oder [http://www.iis.net/download/WinCacheForPhp WinCache] wurden nicht gefunden.
 Das Objektcaching kann daher nicht aktiviert werden.",
        'config-mod-security' => "'''Warnung:''' Auf dem Webserver wurde [http://modsecurity.org/ ModSecurity] aktiviert. Sofern falsch konfiguriert, kann dies zu Problemen mit MediaWiki sowie anderer Software auf dem Server führen und es Benutzern ermöglichen beliebige Inhalte im Wiki einzustellen.
 Für weitere Informationen empfehlen wir die [http://modsecurity.org/documentation/ Dokumentation zu ModSecurity] oder den Kontakt zum Hoster, sofern Fehler auftreten.",
        'config-diff3-bad' => 'GNU diff3 wurde nicht gefunden.',
+       'config-git' => 'Die Git-Versionsverwaltungssoftware wurde gefunden: <code>$1</code>.',
+       'config-git-bad' => 'Die Git-Versionsverwaltungssoftware wurde nicht gefunden.',
        'config-imagemagick' => 'ImageMagick wurde gefunden: <code>$1</code>.
 Miniaturansichten von Bildern werden möglich sein, sobald das Hochladen von Dateien aktiviert wurde.',
        'config-gd' => 'Die im System integrierte GD-Grafikbibliothek wurde gefunden.
@@ -4092,19 +4106,18 @@ Nur Änderungen daran vornehmen, sofern es gute Gründe dafür gibt.',
 
 Das für sie vorgesehene Verzeichnis muss während des Installationsvorgangs beschreibbar sein.
 
-Es sollte '''nicht'' über das Web zugänglich sein, was der Grund ist, warum die Datei nicht dort abgelegt wird, wo sich die PHP-Dateien befinden.
+Es sollte '''nicht''' über das Web zugänglich sein, was der Grund ist, warum die Datei nicht dort abgelegt wird, wo sich die PHP-Dateien befinden.
 
 Das Installationsprogramm wird mit der Datei zusammen eine zusätzliche <code>.htaccess</code>-Datei erstellen. Sofern dies scheitert, können Dritte auf die Datendatei zugreifen.
 Dies umfasst die Nutzerdaten (E-Mail-Adressen, Passwörter, etc.) wie auch gelöschte Seitenversionen und andere vertrauliche Daten, die im Wiki gespeichert sind.
 
-Es ist daher zu erwägen die Datendatei an gänzlich anderer Stelle abzulegen, beispielsweise im Verzeichnis <code>./var/lib/mediawiki/yourwiki</code>.",
+Es ist daher zu erwägen, die Datendatei an gänzlich anderer Stelle abzulegen, beispielsweise im Verzeichnis <code>./var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts' => 'Standardtabellenraum:',
        'config-oracle-temp-ts' => 'Temporärer Tabellenraum:',
        'config-type-mysql' => 'MySQL',
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki unterstützt die folgenden Datenbanksysteme:
 
 $1
@@ -4114,12 +4127,10 @@ Sofern nicht das Datenbanksystem angezeigt wird, das verwendet werden soll, gibt
        'config-support-postgres' => '* $1 ist ein beliebtes Open-Source-Datenbanksystem und eine Alternative zu MySQL ([http://www.php.net/manual/de/pgsql.installation.php Anleitung zur Kompilierung von PHP mit PostgreSQL-Unterstützung]). Es gibt allerdings einige kleinere Implementierungsfehler, so dass von der Nutzung in einer Produktivumgebung abgeraten wird.',
        'config-support-sqlite' => '* $1 ist ein verschlanktes Datenbanksystem, das auch gut unterstützt wird ([http://www.php.net/manual/de/pdo.installation.php Anleitung zur Kompilierung von PHP mit SQLite-Unterstützung], verwendet PHP Data Objects (PDO))',
        'config-support-oracle' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/oci8.installation.php Anleitung zur Kompilierung von PHP mit OCI8-Unterstützung (en)])',
-       'config-support-ibm_db2' => '* $1 ist eine kommerzielle Unternehmensdatenbank ([http://www.php.net/manual/en/ibm-db2.installation.php PHP mit IBM-DB2-Support kompilieren])',
        'config-header-mysql' => 'MySQL-Einstellungen',
        'config-header-postgres' => 'PostgreSQL-Einstellungen',
        'config-header-sqlite' => 'SQLite-Einstellungen',
        'config-header-oracle' => 'Oracle-Einstellungen',
-       'config-header-ibm_db2' => 'IBM DB2-Einstellungen',
        'config-invalid-db-type' => 'Unzulässiges Datenbanksystem',
        'config-missing-db-name' => 'Bei „Datenbankname“ muss ein Wert angegeben werden.',
        'config-missing-db-host' => 'Bei „Datenbankhost“ muss ein Wert angegeben werden.',
@@ -4182,7 +4193,7 @@ Dies wird '''nicht empfohlen''', es sei denn, es treten Probleme mit dem Wiki au
        'config-upgrade-done-no-regenerate' => 'Die Aktualisierung ist abgeschlossen.
 
 Das Wiki kann nun [$1 genutzt werden].',
-       'config-regenerate' => '<code>LocalSettings.php</code> neu erstellen →',
+       'config-regenerate' => 'LocalSettings.php neu erstellen →',
        'config-show-table-status' => 'Die Abfrage <code>SHOW TABLE STATUS</code> ist gescheitert!',
        'config-unknown-collation' => "'''Warnung:''' Die Datenbank nutzt eine unbekannte Kollation.",
        'config-db-web-account' => 'Datenbankkonto für den Webzugriff',
@@ -4201,6 +4212,12 @@ Das hier angegebene Datenbankkonto muss daher bereits vorhanden sein.',
 
 Sofern die vorhandene MySQL-Installation die Speicher-Engine InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.
 Sofern sie sie nicht unterstützt, sollte eine entsprechende Aktualisierung nunmehr Erwägung gezogen werden.",
+       'config-mysql-only-myisam-dep' => "'''Warnung:''' MyISAM ist die einzige verfügbare Speicher-Engine für MySQL, die nicht für die Verwendung mit MediaWiki empfohlen wird, da sie
+* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,
+* anfälliger für Datenprobleme ist und
+* von MediaWiki nicht immer adäquat unterstützt wird.
+
+Deine MySQL-Installation unterstützt nicht InnoDB. Eventuell muss eine Aktualisierung durchgeführt werden.",
        'config-mysql-engine-help' => "'''InnoDB''' ist fast immer die bessere Wahl, da es gleichzeitige Zugriffe gut unterstützt.
 
 '''MyISAM''' ist in Einzelnutzerumgebungen sowie bei schreibgeschützten Wikis schneller.
@@ -4213,7 +4230,6 @@ Dies ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwen
 
 Im '''UTF-8-Modus''' wird MySQL den Zeichensatz der Daten erkennen und sie richtig anzeigen und konvertieren,
 allerdings können keine Zeichen außerhalb des [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert werden.",
-       'config-ibm_db2-low-db-pagesize' => "Die DB2-Datenbank verfügt über einen Standardtabellenraum mit einer unzureichenden Seitengröße. Die Seitengröße muss '''32 000'' oder größer sein.",
        'config-site-name' => 'Name des Wikis:',
        'config-site-name-help' => 'Er wird in der Titelleiste des Browsers, wie auch verschiedenen anderen Stellen, genutzt.',
        'config-site-name-blank' => 'Den Namen des Wikis angeben.',
@@ -4300,11 +4316,11 @@ Für den Fall, dass die E-Mail-Funktionen nicht benötigt werden, können sie hi
        'config-email-auth' => 'E-Mail-Authentifizierung ermöglichen',
        'config-email-auth-help' => "Sofern diese Funktion aktiviert ist, müssen Benutzer ihre E-Mail-Adresse bestätigen, indem sie den Bestätigungslink nutzen, der ihnen immer dann zugesandt wird, wenn sie ihre E-Mail-Adresse angeben oder ändern.
 Nur bestätigte E-Mail-Adressen können Nachrichten von anderen Benutzer oder Benachrichtigungsmitteilungen erhalten.
-Die Aktivierung dieser Funktion wird bei offenen Wikis, mit Hinblick auf möglichen Missbrauch der E-Mailfunktionen, '''empfohlen'''.",
+Die Aktivierung dieser Funktion wird bei offenen Wikis, mit Hinblick auf möglichen Missbrauch der E-Mail-Funktionen, '''empfohlen.'''",
        'config-email-sender' => 'E-Mail-Adresse für Antworten:',
        'config-email-sender-help' => 'Bitte hier die E-Mail-Adresse angeben, die als Absenderadresse bei ausgehenden E-Mails eingesetzt werden soll.
 Rücklaufende E-Mails werden an diese E-Mail-Adresse gesandt.
-Bei viele E-Mail-Servern muss der Teil der E-Mail-Adresse mit der Domainangabe korrekt sein.',
+Bei vielen E-Mail-Servern muss der Teil der E-Mail-Adresse mit der Domainangabe korrekt sein.',
        'config-upload-settings' => 'Hochladen von Bildern und Dateien',
        'config-upload-enable' => 'Das Hochladen von Dateien ermöglichen',
        'config-upload-help' => 'Das Hochladen von Dateien macht den Server für potentielle Sicherheitsprobleme anfällig.
@@ -4316,9 +4332,11 @@ Hernach kann diese Option aktiviert werden.',
        'config-upload-deleted-help' => 'Bitte ein Verzeichnis auswählen, in dem gelöschte Dateien archiviert werden sollen.
 Idealerweise sollte es nicht über das Internet zugänglich sein.',
        'config-logo' => 'URL des Logos:',
-       'config-logo-help' => 'Die Standardoberfläche von MediaWiki verfügt links oberhalb der Seitenleiste über Platz für eine Logo mit den Maßen 135x160 Pixel.
+       'config-logo-help' => 'Die Standardoberfläche von MediaWiki verfügt links oberhalb der Seitenleiste über Platz für ein Logo mit den Maßen 135x160 Pixel.
 Bitte ein Logo in entsprechender Größe hochladen und die zugehörige URL an dieser Stelle angeben.
 
+Du kannst <code>$wgStylePath</code> oder <code>$wgScriptPath</code> verwenden, falls dein Logo relativ zu diesen Pfaden ist.
+
 Sofern kein Logo benötigt wird, kann dieses Datenfeld leer bleiben.',
        'config-instantcommons' => '„InstantCommons“ aktivieren',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons] ist eine Funktion, die es Wikis ermöglicht, Bild-, Klang- und andere Mediendateien zu nutzen, die auf der Website [//commons.wikimedia.org/ Wikimedia Commons] verfügbar sind.
@@ -4335,7 +4353,7 @@ Die Lizenz ist daher jetzt manuell einzugeben.',
 Es wird sehr empfohlen es für mittelgroße bis große Wikis zu nutzen, aber auch für kleine Wikis ergeben sich erkennbare Geschwindigkeitsverbesserungen.',
        'config-cache-none' => 'Kein Objektcaching (es wird keine Funktion entfernt, allerdings kann dies die Geschwindigkeit größerer Wikis negativ beeinflussen)',
        'config-cache-accel' => 'Objektcaching von PHP (APC, XCache oder WinCache)',
-       'config-cache-memcached' => 'Memchached Cacheserver nutzen (erfordert einen zusätzliche Installationsvorgang mitsamt Konfiguration)',
+       'config-cache-memcached' => 'Memcached Cacheserver nutzen (erfordert einen zusätzlichen Installationsvorgang mitsamt Konfiguration)',
        'config-memcached-servers' => 'Memcached Cacheserver',
        'config-memcached-help' => 'Liste der für Memcached nutzbaren IP-Adressen.
 Es sollte eine je Zeile mitsamt des vorgesehenen Ports angegeben werden. Beispiele:
@@ -4412,6 +4430,9 @@ Sobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wi
        'config-download-localsettings' => '<code>LocalSettings.php</code> herunterladen',
        'config-help' => 'Hilfe',
        'config-nofile' => 'Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?',
+       'config-extension-link' => 'Wusstest du, dass dein Wiki [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?
+
+Du kannst [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Erweiterungstabelle] ansehen, um eine volle Erweiterungsliste zu erhalten.',
        'mainpagetext' => "'''MediaWiki wurde erfolgreich installiert.'''",
        'mainpagedocfooter' => 'Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].
 
@@ -4432,7 +4453,7 @@ $messages['de-formal'] = array(
 == Starthilfen ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]', # Fuzzy
 );
 
 /** Zazaki (Zazaki)
@@ -4470,7 +4491,6 @@ $messages['diq'] = array(
        'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 dılet',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
        'config-db-port' => 'Portê database:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'Sazkardışê MySQL',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
@@ -4499,7 +4519,7 @@ $messages['diq'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista eyaranê vıraştışi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]', # Fuzzy
 );
 
 /** Lower Sorbian (dolnoserbski)
@@ -4529,7 +4549,7 @@ $messages['dtp'] = array(
 == Kopotimpuunan ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis papatantu nuludan]
 * [//www.mediawiki.org/wiki/Manual:FAQ Ponguhatan Koinsoruan om Simbar ModiaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]', # Fuzzy
 );
 
 /** Greek (Ελληνικά)
@@ -4569,7 +4589,6 @@ $messages['el'] = array(
        'config-header-postgres' => 'Ρυθμίσεις PostgreSQL',
        'config-header-sqlite' => 'Ρυθμίσεις SQLite',
        'config-header-oracle' => 'Ρυθμίσεις Oracle',
-       'config-header-ibm_db2' => 'Ρυθμίσεις IBM DB2',
        'config-invalid-db-type' => 'Μη έγκυρος τύπος βάσης δεδομένων',
        'config-mysql-utf8' => 'UTF-8',
        'config-site-name' => 'Όνομα του βίκι:',
@@ -4637,13 +4656,15 @@ $messages['eo'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo de konfiguraĵoj] (angla)
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Oftaj Demandoj] (angla)
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki dissendolisto pri anoncoj] (angla)",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki dissendolisto pri anoncoj] (angla)", # Fuzzy
 );
 
 /** Spanish (español)
  * @author Armando-Martin
+ * @author Ciencia Al Poder
  * @author Crazymadlover
  * @author Danke7
+ * @author Fitoschido
  * @author Locos epraix
  * @author Od1n
  * @author Platonides
@@ -4782,6 +4803,7 @@ El caché de objetos no está habilitado.",
        'config-mod-security' => "''' Advertencia ''': Su servidor web tiene [http://modsecurity.org/ mod_security] habilitado. Si la configuración es incorrecta, puede causar problemas a MediaWiki u otro software que permita a los usuarios publicar contenido arbitrarios.
 Consulte la [http://modsecurity.org/documentation/ documentación de mod_security] o contacte con el soporte de su servidor (''host'') si encuentra errores aleatorios.",
        'config-diff3-bad' => 'GNU diff3 no se encuentra.',
+       'config-git-bad' => 'No se encontró el software de control de versiones Git.',
        'config-imagemagick' => 'ImageMagick encontrado: <code>$1</code>.
 La miniaturización de imágenes se habilitará si habilitas las cargas.',
        'config-gd' => 'Se ha encontrado una biblioteca de gráficos GD integrada.
@@ -4878,7 +4900,6 @@ Considere la posibilidad de poner la base de datos en algún otro sitio, por eje
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki es compatible con los siguientes sistemas de bases de datos:
 
 $1
@@ -4888,12 +4909,10 @@ Si no encuentras en el listado el sistema de base de datos que estás intentando
        'config-support-postgres' => '$1 es un popular sistema de base de datos de código abierto, alternativa a MySQL. ([http://www.php.net/manual/es/pgsql.installation.php cómo compilar PHP con compatibilidad PostgreSQL]). Puede haber algunos defectos menores destacables, y no es recomendable para uso en un entorno de producción.',
        'config-support-sqlite' => '* $1 es una base de datos ligera con gran compatibilidad con MediaWiki ([http://www.php.net/manual/es/pdo.installation.php cómo compilar PHP con compatibilidad SQLite usando PDO]).',
        'config-support-oracle' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/oci8.installation.php cómo compilar PHP con compatibilidad con OCI8])',
-       'config-support-ibm_db2' => '* $1 es una base de datos comercial a nivel empresarial ([http://www.php.net/manual/es/ibm-db2.installation.php cómo compilar PHP con compatibilidad con ibm_db2]).', # Fuzzy
        'config-header-mysql' => 'Configuración de MySQL',
        'config-header-postgres' => 'Configuración de PostgreSQL',
        'config-header-sqlite' => 'Configuración de SQLite',
        'config-header-oracle' => 'Configuración de Oracle',
-       'config-header-ibm_db2' => 'Configuración de IBM DB2',
        'config-invalid-db-type' => 'Tipo de base de datos inválida',
        'config-missing-db-name' => 'Debes introducir un valor para "Nombre de la base de datos"',
        'config-missing-db-host' => 'Debe introducir un valor para "Servidor (host) de base de datos"',
@@ -4954,7 +4973,7 @@ Esto '''no se recomienda''' a menos que esté teniendo problemas con su wiki.",
        'config-upgrade-done-no-regenerate' => 'Actualización completa.
 
 Usted puede ahora [$1  empezar a usar su wiki].',
-       'config-regenerate' => 'Regenerar <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerar LocalSettings.php →',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code> ha fallado!',
        'config-unknown-collation' => "'''Advertencia:''' La base de datos está utilizando una intercalación no reconocida.",
        'config-db-web-account' => 'Cuenta de base de datos para acceso Web',
@@ -4984,7 +5003,6 @@ Las bases de datos MyISAM tienden a corromperse más a menudo que las bases de d
 Esto es más eficiente que el modo UTF-8 de MySQL y le permite utilizar la gama completa de caracteres Unicode.
 
 En '''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-ibm_db2-low-db-pagesize' => "Su base de datos DB2 tiene un espacio de tablas por defecto con un tamaño de página insuficiente. El tamaño de página tiene que ser '''32 K''' o superior.",
        'config-site-name' => 'Nombre del wiki:',
        'config-site-name-help' => 'Esto aparecerá en la barra de título del navegador y en varios otros lugares.',
        'config-site-name-blank' => 'Ingresar un nombre de sitio.',
@@ -5087,14 +5105,14 @@ Para obtener más información, lea la [//www.mediawiki.org/wiki/Manual:Security
 
 Para 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.
 A continuación, habilite esta opción.',
-       'config-upload-deleted' => '*Directório 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.
 Lo ideal es una carpeta no accesible desde la red.',
        'config-logo' => 'URL del logo :',
        'config-logo-help' => 'La apariencia por defecto de MediaWiki incluye espacio para un logotipo de 135x160 píxeles encima del menú de la barra lateral.
 Cargue una imagen de tamaño adecuado e introduzca la dirección URL aquí.
 
-Si no desea un logotipo, deje esta casilla en blanco.',
+Si no desea un logotipo, deje esta casilla en blanco.', # Fuzzy
        'config-instantcommons' => 'Habilitar Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es una característica que permite que los wikis puedan utilizar imágenes, sonidos y otros archivos multimedia que se encuentran en el sitio [//commons.wikimedia.org/ Wikimedia Commons].
 Para ello, MediaWiki requiere acceso a Internet.
@@ -5204,7 +5222,7 @@ $messages['es-formal'] = array(
 == Empezando ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]
 * [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]', # Fuzzy
 );
 
 /** Estonian (eesti)
@@ -5349,7 +5367,7 @@ $messages['eu'] = array(
        'config-admin-password' => 'Pasahitza:',
        'config-admin-password-confirm' => 'Pasahitza berriz:',
        'config-admin-email' => 'E-posta helbidea:',
-       'config-profile-wiki' => 'Wiki tradizionala',
+       'config-profile-wiki' => 'Wiki tradizionala', # Fuzzy
        'config-profile-private' => 'Wiki pribatua',
        'config-license' => 'Copyright eta lizentzia:',
        'config-license-pd' => 'Domeinu Askea',
@@ -5365,7 +5383,7 @@ $messages['eu'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurazio balioen zerrenda]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]', # Fuzzy
 );
 
 /** Extremaduran (estremeñu)
@@ -5378,7 +5396,7 @@ $messages['ext'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Persian (فارسی)
@@ -5469,6 +5487,7 @@ $messages['fa'] = array(
  * @author Crt
  * @author Nike
  * @author Olli
+ * @author Silvonen
  * @author Str4nd
  * @author VezonThunder
  * @author 아라
@@ -5564,6 +5583,7 @@ Asennus saattaa epäonnistua!",
        'config-db-install-help' => 'Anna käyttäjätunnus ja salasana, joita käytetään asennuksen aikana.',
        'config-db-account-lock' => 'Käytä samaa tunnusta ja salasanaa myös asennuksen jälkeen',
        'config-db-prefix' => 'Tietokantataulujen etuliite',
+       'config-db-charset' => 'Tietokannan merkistö',
        'config-charset-mysql5-binary' => 'MySQL 4.1/5.0, binääri',
        'config-charset-mysql5' => 'MySQL 4.1/5.0, UTF-8',
        'config-charset-mysql4' => 'MySQL 4.0, taaksepäin yhteensopiva UTF-8',
@@ -5572,13 +5592,10 @@ Asennus saattaa epäonnistua!",
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
-       'config-support-ibm_db2' => '* $1 on kaupallinen tietokanta yrityskäyttöön.', # Fuzzy
        'config-header-mysql' => 'MySQL-asetukset',
        'config-header-postgres' => 'PostgreSQL-asetukset',
        'config-header-sqlite' => 'SQLite-asetukset',
        'config-header-oracle' => 'Oracle-asetukset',
-       'config-header-ibm_db2' => 'IBM DB2 -asetukset',
        'config-invalid-db-type' => 'Virheellinen tietokantatyyppi',
        'config-missing-db-name' => 'Kenttä »Tietokannan nimi» on pakollinen',
        'config-invalid-db-name' => '”$1” ei kelpaa tietokannan nimeksi.
@@ -5602,7 +5619,7 @@ Tämä '''ei ole suositeltavaa''', jos wikissäsi ei ole ongelmia.",
        'config-upgrade-done-no-regenerate' => 'Päivitys valmis.
 
 Voit [$1 aloittaa wikin käytön].',
-       'config-regenerate' => 'Luo <code>LocalSettings.php</code> uudelleen →',
+       'config-regenerate' => 'Luo LocalSettings.php uudelleen →',
        'config-show-table-status' => 'Kysely <code>SHOW TABLE STATUS</code> epäonnistui!',
        'config-mysql-engine' => 'Tallennusmoottori',
        'config-mysql-innodb' => 'InnoDB',
@@ -5814,6 +5831,8 @@ La mise en cache d'objets n'est pas activée.",
        'config-mod-security' => "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S&il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d'autres applications qui permettent aux utilisateurs de publier un contenu quelconque.
 Reportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le support de votre hébergeur si vous rencontrez des erreurs aléatoires.",
        'config-diff3-bad' => 'GNU diff3 introuvable.',
+       'config-git' => 'Logiciel de contrôle de version Git trouvé : <code>$1</code>.',
+       'config-git-bad' => 'Logiciel de contrôle de version Git non trouvé.',
        'config-imagemagick' => "ImageMagick trouvé : <code>$1</code>.
 La miniaturisation d'images sera activée si vous activez le téléversement de fichiers.",
        'config-gd' => "La bibliothèque graphique GD intégrée a été trouvée.
@@ -5907,7 +5926,6 @@ Envisagez de placer la base de données ailleurs, par exemple dans <code>/var/li
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => "MediaWiki supporte ces systèmes de bases de données :
 
 $1
@@ -5917,12 +5935,10 @@ Si vous ne voyez pas le système de base de données que vous essayez d'utiliser
        'config-support-postgres' => "* $1 est un système de base de données populaire et ''open source'' qui peut être une alternative à MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). Il peut contenir quelques bogues mineurs et n'est pas recommandé dans un environnement de production.",
        'config-support-sqlite' => '* $1 est un système de base de données léger qui est bien supporté. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], utilise PDO)',
        'config-support-oracle' => '* $1 est un système commercial de gestion de base de données d’entreprise. ([http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])',
-       'config-support-ibm_db2' => "* $1 est une base de données d'entreprise commerciale. ([http://www.php.net/manual/en/ibm-db2.installation.php Comment compiler PHP avec le support de DB2 d’IBM])",
        'config-header-mysql' => 'Paramètres de MySQL',
        'config-header-postgres' => 'Paramètres de PostgreSQL',
        'config-header-sqlite' => 'Paramètres de SQLite',
        'config-header-oracle' => 'Paramètres d’Oracle',
-       'config-header-ibm_db2' => 'paramètres de IBM DB2',
        'config-invalid-db-type' => 'Type de base de données non valide',
        'config-missing-db-name' => 'Vous devez saisir une valeur pour « Nom de la base de données »',
        'config-missing-db-host' => "Vous devez entrer une valeur pour « l'hôte de la base de données »",
@@ -5984,7 +6000,7 @@ Ce '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre
        'config-upgrade-done-no-regenerate' => 'Mise à jour terminée.
 
 Vous pouvez maintenant [$1 commencer à utiliser votre wiki].',
-       'config-regenerate' => 'Regénérer <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regénérer LocalSettings.php →',
        'config-show-table-status' => 'Échec de la requête <code>SHOW TABLE STATUS</code> !',
        'config-unknown-collation' => "'''Attention:''' La base de données effectue un classement alphabétique (''collation'') inconnu.",
        'config-db-web-account' => "Compte de la base de données pour l'accès Web",
@@ -6001,6 +6017,12 @@ Le compte que vous spécifiez ici doit déjà exister.",
  * il est plus sujet à la corruption que les autres moteurs
  * le codebase MediaWiki ne gère pas toujours MyISAM comme il se doit
 Si votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissez plutôt. Si votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
+       'config-mysql-only-myisam-dep' => "'''Attention :''' MyISAM est le seul moteur de stockage disponible pour MySQL qui ne soit pas recommandé pour une utilsiation avec MédiaWiki, car :
+* il supporte très peu les accès concurrents à cause du verrouillage des tables
+* il est plus sujet à corruption que les autres moteurs
+* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait
+
+Votre installation MySQL ne supporte pas InnoDB ; il est peut-être temps de la mettre à jour.",
        'config-mysql-engine-help' => "'''InnoDB''' est presque toujours la meilleure option, car il supporte bien l'[http://fr.wikipedia.org/wiki/Ordonnancement_dans_les_syst%C3%A8mes_d%27exploitation ordonnancement].
 
 '''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule. Les bases de données MyISAM ont tendance à se corrompre plus souvent que celles d'InnoDB.",
@@ -6011,7 +6033,6 @@ Si votre installation MySQL supporte InnoDB, il est fortement recommandé que vo
 
 En ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.
 En ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
-       'config-ibm_db2-low-db-pagesize' => "Votre base de données DB2 a un espace de stockage par défaut avec un pagesize insuffisant. Le pagesize doit être au minimum '''32K'''.",
        'config-site-name' => 'Nom du wiki :',
        'config-site-name-help' => 'Il apparaîtra dans la barre de titre du navigateur et en divers autres endroits.',
        'config-site-name-blank' => 'Entrez un nom de site.',
@@ -6116,10 +6137,12 @@ Ensuite, activez cette option.",
        'config-upload-deleted-help' => 'Choisissez un répertoire qui servira à archiver les fichiers supprimés.
 Idéalement, il ne devrait pas être accessible depuis le web.',
        'config-logo' => 'URL du logo :',
-       'config-logo-help' => "L'habillage (''skin'') par défaut de MediaWiki comprend l'espace pour un logo de 135x160 pixels dans le coin supérieur gauche.
-Téléchargez une image de la taille appropriée, et entrez l'URL ici.
+       'config-logo-help' => 'L’habillage par défaut de MediaWiki comprend l’espace pour un logo de 135x160 pixels au-dessus de la barre de menu latérale.
+Téléchargez une image de la taille appropriée, et entrez son URL ici.
+
+Vous pouvez utiliser <code>$wgStylePath</code> ou <code>$wgScriptPath</code> si votre logo est relatif à ces chemins.
 
-Si vous ne voulez pas d'un logo, laissez cette case vide.",
+Si vous ne voulez pas de logo, laissez cette case vide.',
        'config-instantcommons' => "Activer ''InstantCommons''",
        'config-instantcommons-help' => "[//www.mediawiki.org/wiki/InstantCommons InstantCommons] est un service qui permet d'utiliser les images, les sons et les autres médias disponibles sur le site [//commons.wikimedia.org/ Wikimedia Commons].
 Pour se faire, il faut que MediaWiki accède à Internet.
@@ -6209,6 +6232,9 @@ Lorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
        'config-download-localsettings' => 'Télécharger <code>LocalSettings.php</code>',
        'config-help' => 'aide',
        'config-nofile' => 'Le fichier « $1 » est introuvable. A-t-il été supprimé ?',
+       'config-extension-link' => 'Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Manual:Extensions des extensions] ?
+
+Vous pouvez consulter les [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions par catégorie] ou la [//www.mediawiki.org/wiki/Extension_Matrix Matrice des extensions] pourvoir la liste complète des extensions.',
        'mainpagetext' => "'''MediaWiki a été installé avec succès.'''",
        'mainpagedocfooter' => 'Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.
 
@@ -6229,7 +6255,7 @@ $messages['frc'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Réglage]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: Questions Souvent Posées]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]', # Fuzzy
 );
 
 /** Franco-Provençal (arpetan)
@@ -6290,18 +6316,16 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
        'config-sqlite-dir' => 'Dossiér de les balyês SQLite :',
        'config-oracle-def-ts' => "Èspâço de stocâjo (''tablespace'') per dèfôt :",
        'config-oracle-temp-ts' => "Èspâço de stocâjo (''tablespace'') temporèro :",
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'Paramètres de MySQL',
        'config-header-postgres' => 'Paramètres de PostgreSQL',
        'config-header-sqlite' => 'Paramètres de SQLite',
        'config-header-oracle' => 'Paramètres d’Oracle',
-       'config-header-ibm_db2' => 'Paramètres d’IBM DB2',
        'config-invalid-db-type' => 'Tipo de bâsa de balyês envalido',
        'config-missing-db-name' => 'Vos dête buchiér una valor por « Nom de la bâsa de balyês »',
        'config-missing-db-host' => 'Vos dête buchiér una valor por « Hôto de la bâsa de balyês »',
        'config-missing-db-server-oracle' => 'Vos dête buchiér una valor por « TNS de la bâsa de balyês »',
        'config-sqlite-readonly' => 'Lo fichiér <code>$1</code> est pas accèssiblo en ècritura.',
-       'config-regenerate' => 'Refâre <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Refâre LocalSettings.php →',
        'config-show-table-status' => 'Falyita de la requéta <code>SHOW TABLE STATUS</code> !',
        'config-db-web-account' => 'Compto de la bâsa de balyês por l’accès vouèbe',
        'config-db-web-account-same' => 'Utilisâd lo mémo compto que por l’enstalacion',
@@ -6393,18 +6417,18 @@ Portant, MediaWiki at fôta de PHP $2 ou ben ples hôt.',
 );
 
 /** Northern Frisian (Nordfriisk)
+ * @author Murma174
  * @author Pyt
  */
 $messages['frr'] = array(
        'mainpagetext' => "'''MediaWiki wörd ma erfolch instaliird.'''",
-       'mainpagedocfooter' => 'Heelp tu jü benjüting än konfigurasjoon foon e Wiki-software fanst dü önj dåt [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].
-
-
-== Startheelpe ==
+       'mainpagedocfooter' => "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.
 
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+== Getting started ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
+* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]",
 );
 
 /** Friulian (furlan)
@@ -6423,7 +6447,7 @@ $messages['fy'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings List mei ynstellings]
 * [//www.mediawiki.org/wiki/Manual:FAQ Faak stelde fragen (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]", # Fuzzy
 );
 
 /** Irish (Gaeilge)
@@ -6436,7 +6460,7 @@ $messages['ga'] = array(
        'config-help' => 'Cuidiú',
        'mainpagetext' => "'''D'éirigh le suiteáil MediaWiki.'''",
        'mainpagedocfooter' => 'Féach ar [//meta.wikimedia.org/wiki/MediaWiki_localisation doiciméid um conas an chomhéadán a athrú]
-agus an [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar úsáideora] chun cabhair úsáide agus fíoraíochta a fháil.',
+agus an [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Lámhleabhar úsáideora] chun cabhair úsáide agus fíoraíochta a fháil.', # Fuzzy
 );
 
 /** Gagauz (Gagauz)
@@ -6449,7 +6473,7 @@ $messages['gag'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Simplified Gan script (赣语(简体)‎)
@@ -6462,20 +6486,21 @@ $messages['gan-hans'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置设定列表]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常问题解答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布email清单]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布email清单]', # Fuzzy
 );
 
 /** Traditional Gan script (贛語(繁體)‎)
+ * @author Symane
  */
 $messages['gan-hant'] = array(
-       'mainpagetext' => "'''å®\89è£\9dæ­£MediaWikiå\98\8d。'''",
+       'mainpagetext' => "'''å®\89è£\9dæ­£MediaWikiå\93©。'''",
        'mainpagedocfooter' => '參看[//meta.wikimedia.org/wiki/Help:Contents 用戶指南]裡頭會話到啷用wiki軟件
 
 == 開始使用 ==
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置設定列表]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 平常問題解答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈email清單]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈email清單]', # Fuzzy
 );
 
 /** Scottish Gaelic (Gàidhlig)
@@ -6628,6 +6653,8 @@ A caché de obxectos está desactivada.",
        'config-mod-security' => "'''Atención:''' O seu servidor web ten o [http://modsecurity.org/ mod_security] activado. Se estivese mal configurado, pode causar problemas a MediaWiki ou calquera outro software que permita aos usuarios publicar contidos arbitrarios.
 Olle a [http://modsecurity.org/documentation/ documentación do mod_security] ou póñase en contacto co soporte do seu servidor se atopa erros aleatorios.",
        'config-diff3-bad' => 'GNU diff3 non se atopou.',
+       'config-git' => 'Atopouse o software de control da versión de Git: <code>$1</code>.',
+       'config-git-bad' => 'Non se atopou o software de control da versión de Git.',
        'config-imagemagick' => 'ImageMagick atopado: <code>$1</code>.
 As miniaturas de imaxes estarán dispoñibles se activa as cargas.',
        'config-gd' => 'Atopouse a biblioteca gráfica GD integrada.
@@ -6724,7 +6751,6 @@ Considere poñer a base de datos nun só lugar, por exemplo en <code>/var/lib/me
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki soporta os seguintes sistemas de bases de datos:
 
 $1
@@ -6734,12 +6760,10 @@ Se non ve listado a continuación o sistema de base de datos que intenta usar, s
        'config-support-postgres' => '* $1 é un sistema de base de datos popular e de código aberto como alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar o PHP con soporte PostgreSQL]). É posible que haxa algúns pequenos erros e non se recomenda o seu uso nunha contorna de produción.',
        'config-support-sqlite' => '* $1 é un sistema de base de datos lixeiro moi ben soportado. ([http://www.php.net/manual/en/pdo.installation.php Como compilar o PHP con soporte SQLite], emprega PDO)',
        'config-support-oracle' => '* $1 é un sistema comercial de xestión de base de datos de empresa. ([http://www.php.net/manual/en/oci8.installation.php Como compilar o PHP con soporte OCI8])',
-       'config-support-ibm_db2' => '* $1 é unha base de datos de empresa comercial. ([http://www.php.net/manual/en/ibm-db2.installation.php Como compilar o PHP con soporte IBM DB2])',
        'config-header-mysql' => 'Configuración do MySQL',
        'config-header-postgres' => 'Configuración do PostgreSQL',
        'config-header-sqlite' => 'Configuración do SQLite',
        'config-header-oracle' => 'Configuración do Oracle',
-       'config-header-ibm_db2' => 'Configuración de IBM DB2',
        'config-invalid-db-type' => 'Tipo de base de datos incorrecto',
        'config-missing-db-name' => 'Debe escribir un valor "Nome da base de datos"',
        'config-missing-db-host' => 'Debe escribir un valor "Servidor da base de datos"',
@@ -6801,7 +6825,7 @@ Isto '''non é recomendable''' a menos que estea a ter problemas co seu wiki.",
        'config-upgrade-done-no-regenerate' => 'Actualización completada.
 
 Xa pode [$1 comezar a usar o seu wiki].',
-       'config-regenerate' => 'Rexenerar <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Rexenerar LocalSettings.php →',
        'config-show-table-status' => 'A pescuda <code>SHOW TABLE STATUS</code> fallou!',
        'config-unknown-collation' => "'''Atención:''' A base de datos está a empregar unha clasificación alfabética irrecoñecible.",
        'config-db-web-account' => 'Conta na base de datos para o acceso á internet',
@@ -6820,6 +6844,12 @@ A conta que se especifique aquí xa debe existir.',
 
 Se a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.
 Se a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
+       'config-mysql-only-myisam-dep' => "'''Atención:''' MyISAM é o único motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:
+* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas
+* é máis propenso a corromperse ca outros motores
+* o código base de MediaWiki non sempre manexa o MyISAM como debera
+
+A súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
        'config-mysql-engine-help' => "'''InnoDB''' é case sempre a mellor opción, dado que soporta ben os accesos simultáneos.
 
 '''MyISAM''' é máis rápido en instalacións de usuario único e de só lectura.
@@ -6832,7 +6862,6 @@ Isto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango complet
 
 No '''modo UTF-8''', MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,
 pero non lle deixará gardar caracteres por riba do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
-       'config-ibm_db2-low-db-pagesize' => "A súa base de datos DB2 ten un espazo de táboa cun tamaño de páxina insuficiente. O tamaño de páxina debe ser '''32k''' ou maior.",
        'config-site-name' => 'Nome do wiki:',
        'config-site-name-help' => 'Isto aparecerá na barra de títulos do navegador e noutros lugares.',
        'config-site-name-blank' => 'Escriba o nome do sitio.',
@@ -6941,6 +6970,8 @@ O ideal é que non sexa accesible desde a web.',
        'config-logo-help' => 'A aparencia de MediaWiki por defecto inclúe espazo para un logo de 135x160 píxeles por riba do menú lateral.
 Cargue unha imaxe do tamaño axeitado e introduza o enderezo URL aquí.
 
+Pode utilizar <code>$wgStylePath</code> ou <code>$wgScriptPath</code> se o seu logo está relacionado con esas rutas.
+
 Se non quere un logo, deixe esta caixa en branco.',
        'config-instantcommons' => 'Activar Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons] é unha característica que permite aos wikis usar imaxes, sons e outros ficheiros multimedia atopados no sitio da [//commons.wikimedia.org/wiki/Portada_galega Wikimedia Commons].
@@ -7033,7 +7064,10 @@ $3
 Cando faga todo isto, xa poderá '''[$2 entrar no seu wiki]'''.",
        'config-download-localsettings' => 'Descargar o <code>LocalSettings.php</code>',
        'config-help' => 'axuda',
-       'config-nofile' => 'Non se puido atopar o ficheiro "$1". Se cadra, foi borrado?',
+       '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/Manual:Extensions extensións]?
+
+Pode explorar as [//www.mediawiki.org/wiki/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' => "'''MediaWiki instalouse correctamente.'''",
        '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.
 
@@ -7063,7 +7097,7 @@ $messages['grc'] = array(
 == Ἄρξασθε ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Διαλογή παραμέτρων διαμορφώσεως]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: τὰ πολλάκις αἰτηθέντα]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Διαλογή διαλέξεων ἐπὶ τῶν διανομῶν τῆς MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Διαλογή διαλέξεων ἐπὶ τῶν διανομῶν τῆς MediaWiki]', # Fuzzy
 );
 
 /** Swiss German (Alemannisch)
@@ -7178,6 +7212,7 @@ Miniaturaasichte vu Bilder sin megli, sobald s Uffelade vu Dateie aktiviert isch
 );
 
 /** Gujarati (ગુજરાતી)
+ * @author Ashok modhvadia
  * @author Dineshjk
  */
 $messages['gu'] = array(
@@ -7187,7 +7222,8 @@ $messages['gu'] = array(
 == શરૂઆતના તબક્કે ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings કોનફીગ્યુરેશન સેટીંગ્સની યાદી]
 * [//www.mediawiki.org/wiki/Manual:FAQ વારંવાર પુછાતા પ્રશ્નો]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઝ મેઇલીંગ લીસ્ટ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઝ મેઇલીંગ લીસ્ટ]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]',
 );
 
 /** Manx (Gaelg)
@@ -7206,7 +7242,7 @@ $messages['hak'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki Phi-chṳ sat-thin chhîn-tân]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Phìn-sòng mun-thì kié-tap]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]', # Fuzzy
 );
 
 /** Hawaiian (Hawai`i)
@@ -7442,7 +7478,6 @@ $1
 כדאי לשקול לשים את מסד הנתונים במקום אחר לגמרי, למשל ב־<code dir="ltr">/var/lib/mediawiki/yourwik</code>.',
        'config-oracle-def-ts' => 'מרחב טבלאות לפי בררת מחדל (default tablespace):',
        'config-oracle-temp-ts' => 'מרחב טבלאות זמני (temporary tablespace):',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'מדיה־ויקי תומכת במערכות מסדי הנתונים הבאות:
 
 $1
@@ -7452,12 +7487,10 @@ $1
        'config-support-postgres' => '$1 הוא מסד נתונים נפוץ בקוד פתוח והוא נפוץ בתור חלופה ל־MySQL (ר׳ [http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). ייתכן שיש בתצורה הזאת באגים מסוימים והיא לא מומלצת לסביבות מבצעיות.',
        'config-support-sqlite' => '* $1 הוא מסד נתונים קליל עם תמיכה טובה מאוד. (ר׳ [http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], משתמש ב־PDO)',
        'config-support-oracle' => '* $1 הוא מסד נתונים עסקי מסחרי. (ר׳ [http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
-       'config-support-ibm_db2' => '* $1 הוא מסד נתונים מסחרי ארגוני. ([http://www.php.net/manual/en/ibm-db2.installation.php How to compile PHP with IBM DB2 support])',
        'config-header-mysql' => 'הגדרות MySQL',
        'config-header-postgres' => 'הגדרות PostgreSQL',
        'config-header-sqlite' => 'הגדרות SQLite',
        'config-header-oracle' => 'הגדרות Oracle',
-       'config-header-ibm_db2' => 'תצורת IBM DB2',
        'config-invalid-db-type' => 'סוג מסד הנתונים שגוי',
        'config-missing-db-name' => 'עליך להזין ערך עבור "שם מסד הנתונים"',
        'config-missing-db-host' => 'יש להכניס ערך לשדה "שרת מסד הנתונים"',
@@ -7519,7 +7552,7 @@ chmod a+w $3</pre></div>',
        'config-upgrade-done-no-regenerate' => 'השדרוג הושלם.
 
 עכשיו אפשר [$1 להתחיל להשתמש בוויקי שלכם].',
-       'config-regenerate' => 'לחולל מחדש את <code>LocalSettings.php</code> ←',
+       'config-regenerate' => 'לחולל מחדש את LocalSettings.php ←',
        'config-show-table-status' => 'שאילתת <code>SHOW TABLE STATUS</code> נכשלה!',
        'config-unknown-collation' => "'''אזהרה:''' מסד הנתונים משתמש בשיטת מיון שאינה מוּכּרת.",
        'config-db-web-account' => 'חשבון במסד הנתונים לגישה מהרשת',
@@ -7549,7 +7582,6 @@ chmod a+w $3</pre></div>',
 זה יעיל יותר ממצב UTF-8 של MySQL ומאפשר לכם להשתמש בכל הטווח של תווי יוניקוד.
 
 ב'''מצב UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL יֵדַע מה קבוצת התווים (character set) של הטקסט שלכם ויציג וימיר אותו בהתאם, אבל לא יאפשר לכם לשמור תווים שאינם נמצאים בטווח הרב־לשוני הבסיסי ([//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
-       'config-ibm_db2-low-db-pagesize' => "במסד הנתונים DB2 שלכם יש מרחב טבלאות לפי מחדלי עם גודל דף בלתי־מספיק. גודל הדף צריך להיות '''32K''' או יותר.",
        'config-site-name' => 'שם הוויקי:',
        'config-site-name-help' => 'זה יופיע בשורת הכותרת של הדפדפן ובמקומות רבים אחרים.',
        'config-site-name-blank' => 'נא להזין שם לאתר.',
@@ -7658,7 +7690,7 @@ chmod a+w $3</pre></div>',
        'config-logo-help' => 'המראה ההתחלתי של מדיה־ויקי מכיל מקום לסמל של 135 על 160 פיקסלים בפינה העליונה מעל תפריט הצד.
 יש להעלות תמונה בגודל מתאים ולהכניס את הכתובת כאן.
 
-אם אינכם רוצים סמל, השאירו את התיבה הזאת ריקה.',
+אם אינכם רוצים סמל, השאירו את התיבה הזאת ריקה.', # Fuzzy
        'config-instantcommons' => 'להפעיל את Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] היא תכונה שמאפשרת לאתרי ויקי להשתמש בתמונות, בצלילים ובמדיה אחרת שנמצאת באתר [//commons.wikimedia.org/ ויקישיתוף] (Wikimedia Commons).
 כדי לעשות את זה, מדיה־ויקי צריך לגשת לאינטרנט.
@@ -7770,7 +7802,7 @@ $messages['hi'] = array(
 == शुरुवात करें ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉन्फिगरेशन सेटींगकी सूची]
 * [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकिके बारे में प्राय: पूछे जाने वाले सवाल]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]', # Fuzzy
 );
 
 /** Fiji Hindi (Latin script) (Fiji Hindi)
@@ -7783,7 +7815,7 @@ $messages['hif-latn'] = array(
 == Getting started ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Hiligaynon (Ilonggo)
@@ -7796,7 +7828,7 @@ $messages['hil'] = array(
 == Pag-umpisa ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sang mga konpigorasyon sang pagkay-o]
 * [//www.mediawiki.org/wiki/Manual:FAQ Mga Masami Pamangkoton sa MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]", # Fuzzy
 );
 
 /** Croatian (hrvatski)
@@ -7804,7 +7836,7 @@ $messages['hil'] = array(
 $messages['hr'] = array(
        'mainpagetext' => "'''Softver MediaWiki je uspješno instaliran.'''",
        'mainpagedocfooter' => 'Pogledajte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentaciju o prilagodbi sučelja]
-i [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Vodič za suradnike] za pomoć pri uporabi i podešavanju.',
+i [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Vodič za suradnike] za pomoć pri uporabi i podešavanju.', # Fuzzy
 );
 
 /** Upper Sorbian (hornjoserbsce)
@@ -7996,7 +8028,7 @@ Zo by je na MediaWiki $1 aktualizował, klikń na '''Dale'''.",
        'config-upgrade-done-no-regenerate' => 'Aktualizacija dokónčena.
 
 Móžeš nětko [$1 swój wiki wužiwać].',
-       'config-regenerate' => '<code>LocalSettings.php</code> znowa wutworić →',
+       'config-regenerate' => 'LocalSettings.php znowa wutworić →',
        'config-show-table-status' => 'Naprašowanje <code>SHOW TABLE STATUS</code> je so njeporadźiło!',
        'config-unknown-collation' => "'''Warnowanje:''' Datowa banka njeznatu kolaciju wužiwa.",
        'config-db-web-account' => 'Konto datoweje banki za webpřistup',
@@ -8165,7 +8197,7 @@ $messages['ht'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lis paramèt yo pou konfigirasyon]
 * [//www.mediawiki.org/wiki/Manyèl:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]', # Fuzzy
 );
 
 /** Hungarian (magyar)
@@ -8383,7 +8415,6 @@ A telepítő készít egy <code>.htaccess</code> fájlt az adatbázis mellé, az
 Fontold meg az adatbázis más helyre történő elhelyezését, például a <code>/var/lib/mediawiki/tewikid</code> könyvtárba.",
        'config-oracle-def-ts' => 'Alapértelmezett táblatér:',
        'config-oracle-temp-ts' => 'Ideiglenes táblatér:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'A MediaWiki a következő adatbázisrendszereket támogatja:
 
 $1
@@ -8393,12 +8424,10 @@ Ha az alábbi listán nem találod azt a rendszert, melyet használni szeretnél
        'config-support-postgres' => '* A $1 népszerű, nyílt forráskódú adatbázisrendszer, a MySQL alternatívája ([http://www.php.net/manual/en/pgsql.installation.php Hogyan fordítható a PHP PostgreSQL-támogatással]). Több apró, javítatlan hiba is előfordulhat, így nem ajánlott éles környezetben használni.',
        'config-support-sqlite' => '* Az $1 egy könnyű, nagyon jól támogatott adatbázisrendszer. ([http://www.php.net/manual/en/pdo.installation.php Hogyan fordítható a PHP SQLite-támogatással], PDO-t használ)',
        'config-support-oracle' => '* Az $1 kereskedelmi, vállalati adatbázisrendszer. ([http://www.php.net/manual/en/oci8.installation.php Hogyan fordítható a PHP OCI8-támogatással])',
-       'config-support-ibm_db2' => '* Az $1 kereskedelmi vállalati adatbázisrendszer.', # Fuzzy
        'config-header-mysql' => 'MySQL-beállítások',
        'config-header-postgres' => 'PostgreSQL-beállítások',
        'config-header-sqlite' => 'SQLite-beállítások',
        'config-header-oracle' => 'Oracle-beállítások',
-       'config-header-ibm_db2' => 'IBM DB2-beállítások',
        'config-invalid-db-type' => 'Érvénytelen adatbázistípus',
        'config-missing-db-name' => 'Meg kell adnod az „Adatbázisnév” értékét',
        'config-missing-db-host' => 'Meg kell adnod az „Adatbázis hosztneve” értékét',
@@ -8460,7 +8489,7 @@ Ez '''nem ajánlott''', csak akkor, ha problémák vannak a wikivel.",
        'config-upgrade-done-no-regenerate' => "A frissítés befejeződött.
 
 Most már '''[$1 beléphetsz a wikibe]'''.",
-       'config-regenerate' => '<code>LocalSettings.php</code> elkészítése újra →',
+       'config-regenerate' => 'LocalSettings.php elkészítése újra →',
        'config-show-table-status' => 'A <code>SHOW TABLE STATUS</code> lekérdezés nem sikerült!',
        'config-unknown-collation' => "'''Figyelmeztetés:''' az adatbázis ismeretlen egybevetést használ.",
        'config-db-web-account' => 'A webes hozzáférésnél használt adatbázisfiók',
@@ -8489,7 +8518,6 @@ A '''MyISAM''' gyorsabb megoldás lehet egyfelhasználós vagy csak olvasható k
 Ez sokkal hatékonyabb a MySQL UTF-8-as módjánál, és lehetővé teszi a teljes Unicode-karakterkészlet használatát.
 
 '''UTF-8-as módban''' a MySQL tudni fogja,hogy az adatok milyen karakterkészlettel rendelkeznek, és megfelelően átalakítja őket, azonban nem tárolhatóak olyan karakterek, melyek a [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] felett vannak.",
-       'config-ibm_db2-low-db-pagesize' => "A DB2 adatbázisodnak alapértelmezett táblatere van elégtelen lapmérettel. A lapméretnek legalább '''32K'''-nak kell lennie.",
        'config-site-name' => 'A wiki neve:',
        'config-site-name-help' => 'A böngésző címsorában és még számos más helyen jelenik meg.',
        'config-site-name-blank' => 'Add meg az oldal nevét.',
@@ -8596,7 +8624,7 @@ Normális esetben ennek nem szabad elérhetőnek lennie az internetről.',
        'config-logo-help' => 'A MediaWiki alapértelmezett felülete helyet ad egy 135×160 pixeles logónak a bal felső sarokban.
 Tölts fel egy megfelelő méretű képet, majd írd be ide az URL-címét!
 
-Ha nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.',
+Ha nem szeretnél logót használni, egyszerűen hagyd üresen a mezőt.', # Fuzzy
        'config-instantcommons' => 'Instant Commons engedélyezése',
        'config-instantcommons-help' => 'Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.
 A használatához a MediaWikinek internethozzáférésre van szüksége.
@@ -8781,7 +8809,7 @@ $messages['hy'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Interlingua (interlingua)
@@ -9014,7 +9042,6 @@ Considera poner le base de datos in un loco completemente differente, per exempl
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki supporta le sequente systemas de base de datos:
 
 $1
@@ -9024,12 +9051,10 @@ Si tu non vide hic infra le systema de base de datos que tu tenta usar, alora se
        'config-support-postgres' => '* $1 es un systema de base de datos popular e open source, alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP con supporto de PostgreSQL]). Es possibile que resta alcun minor defectos non resolvite, dunque illo non es recommendate pro uso in un ambiente de production.',
        'config-support-sqlite' => '* $1 es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)',
        'config-support-oracle' => '* $1 es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])',
-       'config-support-ibm_db2' => '* $1 es un systema commercial de base de datos pro interprisas.', # Fuzzy
        'config-header-mysql' => 'Configuration de MySQL',
        'config-header-postgres' => 'Configuration de PostgreSQL',
        'config-header-sqlite' => 'Configuration de SQLite',
        'config-header-oracle' => 'Configuration de Oracle',
-       'config-header-ibm_db2' => 'Configurationes pro IBM DB2',
        'config-invalid-db-type' => 'Typo de base de datos invalide',
        'config-missing-db-name' => 'Tu debe entrar un valor pro "Nomine de base de datos"',
        'config-missing-db-host' => 'Tu debe entrar un valor pro "Host del base de datos"',
@@ -9091,7 +9116,7 @@ Isto '''non es recommendate''' si tu non ha problemas con tu wiki.",
        'config-upgrade-done-no-regenerate' => 'Actualisation complete.
 
 Tu pote ora [$1 comenciar a usar tu wiki].',
-       'config-regenerate' => 'Regenerar <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerar LocalSettings.php →',
        'config-show-table-status' => 'Le consulta <code>SHOW TABLE STATUS</code> falleva!',
        'config-unknown-collation' => "'''Aviso:''' Le base de datos usa un collation non recognoscite.",
        'config-db-web-account' => 'Conto de base de datos pro accesso via web',
@@ -9121,7 +9146,6 @@ Le bases de datos MyISAM tende a esser corrumpite plus frequentemente que le bas
 Isto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres Unicode.
 
 In '''modo UTF-8''', MySQL cognoscera le codification de characteres usate pro tu dats, e pote presentar e converter lo appropriatemente, ma illo non permittera immagazinar characteres supra le [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
-       'config-ibm_db2-low-db-pagesize' => 'Tu base de datos DB2 ha un "tablespace" (spatio de tabella) predefinite con un "pagesize" (dimension de pagina) insufficiente. Le "pagesize" debe esser \'\'\'32K\'\'\' o plus.',
        'config-site-name' => 'Nomine del wiki:',
        'config-site-name-help' => 'Isto apparera in le barra de titulo del navigator e in varie altere locos.',
        'config-site-name-blank' => 'Entra un nomine de sito.',
@@ -9231,7 +9255,7 @@ Idealmente, isto non debe esser accessibile ab le web.',
        'config-logo-help' => 'Le apparentia predefinite de MediaWiki include spatio pro un logotypo de 135×160 pixels supra le menu del barra lateral.
 Incarga un imagine con le dimensiones appropriate, e entra le URL hic.
 
-Si tu non vole un logotypo, lassa iste quadro vacue.',
+Si tu non vole un logotypo, lassa iste quadro vacue.', # Fuzzy
        'config-instantcommons' => 'Activar "Instant Commons"',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] es un function que permitte a wikis de usar imagines, sonos e altere multimedia trovate in le sito [//commons.wikimedia.org/ Wikimedia Commons].
 Pro poter facer isto, MediaWiki require accesso a Internet.
@@ -9629,7 +9653,7 @@ Tindakan ini '''tidak dianjurkan''' kecuali jika Anda mengalami masalah dengan w
        'config-upgrade-done-no-regenerate' => 'Pemutakhiran selesai.
 
 Anda sekarang dapat [$1 mulai menggunakan wiki Anda].',
-       'config-regenerate' => 'Regenerasi <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerasi LocalSettings.php →',
        'config-show-table-status' => 'Kueri <code>SHOW TABLE STATUS</code> gagal!',
        'config-unknown-collation' => "'''Peringatan:''' basis data menggunakan kolasi yang tidak dikenal.",
        'config-db-web-account' => 'Akun basis data untuk akses web',
@@ -9757,7 +9781,7 @@ Idealnya, direktori ini tidak boleh dapat diakses dari web.',
        'config-logo-help' => 'Kulit bawaan MediaWiki memberikan ruang untuk logo berukuran 135x160 piksel di atas menu bilah samping.
 Unggah gambar dengan ukuran yang sesuai, lalu masukkan URL di sini.
 
-Jika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.',
+Jika Anda tidak ingin menyertakan logo, biarkan kotak ini kosong.', # Fuzzy
        'config-instantcommons' => 'Aktifkan Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] adalah fitur yang memungkinkan wiki untuk menggunakan gambar, suara, dan media lain dari [//commons.wikimedia.org/ Wikimedia Commons].
 Untuk melakukannya, MediaWiki memerlukan akses ke Internet.
@@ -9895,7 +9919,7 @@ $messages['io'] = array(
 == Komencar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listo di ''Configuration setting'']
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki OQQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]", # Fuzzy
 );
 
 /** Icelandic (íslenska)
@@ -9908,7 +9932,7 @@ $messages['is'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Listi yfir uppsetningarstillingar]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki Algengar spurningar MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]', # Fuzzy
 );
 
 /** Italian (italiano)
@@ -10037,12 +10061,10 @@ Anche se può essere possibile creare utenti senza password, questo non è sicur
 Da cambiare solamente se si è sicuri di averne bisogno.',
        'config-pg-test-error' => "Impossibile connettersi al database '''$1''': $2",
        'config-sqlite-dir' => 'Directory data di SQLite:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'Impostazioni MySQL',
        'config-header-postgres' => 'Impostazioni PostgreSQL',
        'config-header-sqlite' => 'Impostazioni SQLite',
        'config-header-oracle' => 'Impostazioni Oracle',
-       'config-header-ibm_db2' => 'Impostazioni IBM DB2',
        'config-invalid-db-type' => 'Tipo di database non valido',
        'config-missing-db-name' => 'È necessario immettere un valore per "Nome del database"',
        'config-db-web-account' => "Account del database per l'accesso web",
@@ -10053,7 +10075,6 @@ Da cambiare solamente se si è sicuri di averne bisogno.',
        'config-mysql-charset' => 'Set di caratteri del database:',
        'config-mysql-binary' => 'Binario',
        'config-mysql-utf8' => 'UTF-8',
-       'config-ibm_db2-low-db-pagesize' => "Il database DB2 in uso ha una tablespace predefinita con un insufficiente pagesize, che dovrebbe essere '''32K''' o maggiore.",
        'config-ns-generic' => 'Progetto',
        'config-ns-site-name' => 'Stesso nome wiki: $1',
        'config-ns-other-default' => 'MyWiki',
@@ -10078,7 +10099,7 @@ Inserire un indirizzo email se si desidera effettuare l'iscrizione alla mailing
        'config-almost-done' => 'Hai quasi finito!
 Adesso puoi saltare la rimanente parte della configurazione e semplicemente installare la wiki.',
        'config-optional-continue' => 'Fammi altre domande.',
-       'config-profile-wiki' => 'Wiki tradizionale', # Fuzzy
+       'config-profile-wiki' => 'Wiki aperto',
        'config-profile-no-anon' => 'Creazione utenza obbligatoria',
        'config-profile-fishbowl' => 'Solo editori autorizzati',
        'config-profile-private' => 'Wiki privata',
@@ -10143,6 +10164,7 @@ I seguenti collegamenti sono in lingua inglese:
 
 /** Japanese (日本語)
  * @author Aphaia
+ * @author Fryed-peach
  * @author Iwai.masaharu
  * @author Mizusumashi
  * @author Ninomy
@@ -10244,6 +10266,7 @@ Unicode を少しでも利用する可能性がある場合は、[//www.mediawik
 共有サーバーを使用している場合は、適切なデータベース ドライバーのインストールを、サーバーの管理者に依頼してください。
 PHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysql</code> を実行して、データベース クライアントを使用できるように再設定してください。
 Debian または Ubuntu のパッケージから PHP をインストールした場合は、php5-mysql モジュールもインストールする必要があります。',
+       'config-outdated-sqlite' => "'''警告:''' あなたは SQLite $1 を使っていますが、最低限要求されるバージョンである $2 未満となっています。SQLite は利用できません。",
        'config-no-fts3' => "'''警告:''' SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。",
        'config-register-globals' => "'''警告: PHP の <code>[http://php.net/register_globals register_globals]</code> オプションが有効になっています。'''
 '''可能なら無効化してください。'''
@@ -10279,6 +10302,8 @@ MediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
        'config-no-cache' => "'''警告:''' [http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]、[http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。
 オブジェクトのキャッシュは有効化されません。",
        'config-diff3-bad' => 'GNU diff3 が見つかりません。',
+       'config-git' => 'バージョン管理ソフトウェア Git が見つかりました: <code>$1</code>',
+       'config-git-bad' => 'バージョン管理ソフトウェア Git が見つかりません。',
        'config-imagemagick' => 'ImageMagickが見つかりました: <code>$1</code>。
 アップロードが有効であれば、画像のサムネイルを利用できます。',
        'config-gd' => 'GD画像ライブラリが内蔵されていることが確認されました。
@@ -10443,7 +10468,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'アップグレードが完了しました。
 
 [$1 ウィキの使用を開始]することができます。',
-       'config-regenerate' => '<code>LocalSettings.php</code> を再生成→',
+       'config-regenerate' => 'LocalSettings.php を再生成→',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code> クエリが失敗しました!',
        'config-unknown-collation' => "'''警告:''' データベースは認識されない照合を使用しています。",
        'config-db-web-account' => 'ウェブアクセスのためのデータベースアカウント',
@@ -10505,7 +10530,7 @@ chmod a+w $3</pre>',
        'config-optional-continue' => '私にもっと質問してください。',
        'config-optional-skip' => 'もう飽きてしまったので、とにかくウィキをインストールしてください。',
        'config-profile' => '利用者権限のプロファイル:',
-       'config-profile-wiki' => '伝統的なウィキ', # Fuzzy
+       'config-profile-wiki' => '公開ウィキ',
        'config-profile-no-anon' => 'アカウントの作成が必要',
        'config-profile-fishbowl' => '承認された編集者のみ',
        'config-profile-private' => '非公開ウィキ',
@@ -10568,10 +10593,12 @@ GFDLは有効なライセンスですが、内容を理解するのは困難で
        'config-upload-deleted-help' => '削除されるファイルを保存するためのディレクトリを選択してください。
 これがウェブからアクセスできないことが理想です。',
        'config-logo' => 'ロゴ のURL:',
-       'config-logo-help' => 'MediaWikiの既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
-適切なサイズの画像をアップロードして、そのURLをここに入力してください。
+       'config-logo-help' => 'MediaWiki の既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
+適切なサイズの画像をアップロードして、その URL をここに入力してください。
+
+ロゴが相対パスの場合は、<code>$wgStylePath</code> や <code>$wgScriptPath</code> を使用できます。
 
-ロゴが不要の場合は、このボックスを空白のままにしてください。',
+ロゴが不要の場合は、このを空白のままにしてください。',
        'config-instantcommons' => 'Instant Commons 機能を有効にする',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトにある画像、音声、その他のメディアをウィキ上で利用できるようにする機能です。
 これを使用するには、MediaWiki がインターネットに接続できる必要があります。
@@ -10672,7 +10699,7 @@ $messages['jam'] = array(
 == Taatop ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Jutish (jysk)
@@ -10680,7 +10707,7 @@ $messages['jam'] = array(
  */
 $messages['jut'] = array(
        '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.",
+       '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.", # Fuzzy
 );
 
 /** Javanese (Basa Jawa)
@@ -10691,7 +10718,7 @@ $messages['jv'] = array(
 == Miwiti panggunan  ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Daftar pangaturan préférènsi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]", # Fuzzy
 );
 
 /** Georgian (ქართული)
@@ -10739,7 +10766,6 @@ $messages['ka'] = array(
        'config-header-postgres' => 'PostgreSQL-ის პარამეტრები',
        'config-header-sqlite' => 'SQLite-ის პარამეტრები',
        'config-header-oracle' => 'Oracle-ის პარამეტრები',
-       'config-header-ibm_db2' => 'IBM DB2-ის პარამეტრები',
        'config-invalid-db-type' => 'არასწორი მონაცემთა ბაზის ტიპი',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
@@ -10800,7 +10826,7 @@ $messages['kaa'] = array(
 == Baslaw ushın ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfiguratsiya sazlaw dizimi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWikidin' Ko'p Soralatug'ın Sorawları]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki haqqında xat tarqatıw dizimi]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki haqqında xat tarqatıw dizimi]", # Fuzzy
 );
 
 /** Адыгэбзэ (Адыгэбзэ)
@@ -10814,7 +10840,7 @@ $messages['kbd-cyrl'] = array(
 == Къыщхьэпэгъуэ хъуфынухэр ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Зэгъэзэхуэгъуэ гуэрэхэм я тхылъ];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-м упщӀэ нахъыбу ятхэмрэ я жэуапхэмрэ];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и версиэ щӀэуэ къэжахэм я къэӀохугъуэ].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-м и версиэ щӀэуэ къэжахэм я къэӀохугъуэ].', # Fuzzy
 );
 
 /** Khowar (کھوار)
@@ -10834,7 +10860,7 @@ $messages['kiu'] = array(
 == Gamê verêni ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista ayarunê vırastene]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki de ÇZP]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]", # Fuzzy
 );
 
 /** Kazakh (Arabic script) (قازاقشا (تٴوتە)‏)
@@ -10846,7 +10872,7 @@ $messages['kk-arab'] = array(
 == باستاۋ ٴۇشىن ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings باپتالىم قالاۋلارىنىڭ ٴتىزىمى]
 * [//www.mediawiki.org/wiki/Manual:FAQ مەدىياۋىيكىيدىڭ جىيى قويىلعان ساۋالدارى]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]', # Fuzzy
 );
 
 /** Kazakh (Cyrillic script) (қазақша (кирил)‎)
@@ -10858,7 +10884,7 @@ $messages['kk-cyrl'] = array(
 == Бастау үшін ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Бапталым қалауларының тізімі]
 * [//www.mediawiki.org/wiki/Manual:FAQ МедиаУикидің Жиы Қойылған Сауалдары]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]', # Fuzzy
 );
 
 /** Kazakh (Latin script) (qazaqşa (latın)‎)
@@ -10870,7 +10896,7 @@ $messages['kk-latn'] = array(
 == Bastaw üşin ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Baptalım qalawlarınıñ tizimi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MedïaWïkïdiñ Jïı Qoýılğan Sawaldarı]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï şığw twralı xat taratw tizimi]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï şığw twralı xat taratw tizimi]', # Fuzzy
 );
 
 /** Khmer (ភាសាខ្មែរ)
@@ -10900,7 +10926,7 @@ $messages['km'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings បញ្ជីកំណត់ទម្រង់]
 * [//www.mediawiki.org/wiki/Manual:FAQ/km សំណួរញឹកញាប់​មេឌាវិគី]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​ពិភាក្សា​ការផ្សព្វផ្សាយ​របស់​មេឌាវិគី]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​ពិភាក្សា​ការផ្សព្វផ្សាយ​របស់​មេឌាវិគី]', # Fuzzy
 );
 
 /** Kannada (ಕನ್ನಡ)
@@ -10913,7 +10939,7 @@ $messages['kn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
 );
 
 /** Korean (한국어)
@@ -11146,7 +11172,6 @@ MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전
        'config-oracle-def-ts' => '기본 테이블공간:',
        'config-oracle-temp-ts' => '임시 테이블공간:',
        'config-type-oracle' => '오라클',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => '미디어위키는 다음의 데이터베이스 시스템을 지원합니다:
 
 $1
        'config-support-postgres' => '* $1은 MySQL의 대안으로 인기 있는 오픈 소스 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pgsql.installation.php PostgreSQL을 지원하여 PHP를 컴파일하는 방법]) 몇가지 사소한 해결하지 못한 버그가 있을 수 있으며, 이를 제작 환경에서 사용하지 않는 것이 좋습니다.',
        'config-support-sqlite' => '* $1는 매우 잘 지원하는 가벼운 데이터베이스 시스템입니다. ([http://www.php.net/manual/en/pdo.installation.php SQLite를 지원하여 PHP를 컴파일하는 방법], PDO 사용)',
        'config-support-oracle' => '* $1은 상용 엔터프라이스 데이터베이스입니다. ([http://www.php.net/manual/en/oci8.installation.php OCI8을 지원하여 PHP를 컴파일하는 방법])',
-       'config-support-ibm_db2' => '* $1는 상용 엔터프라이즈 데이터베이스입니다.([http://www.php.net/manual/en/ibm-db2.installation.php IBM DB2를 지원하여 PHP를 컴파일하는 방법])',
        'config-header-mysql' => 'MySQL 설정',
        'config-header-postgres' => 'PostgreSQL 설정',
        'config-header-sqlite' => 'SQLite 설정',
        'config-header-oracle' => '오라클 설정',
-       'config-header-ibm_db2' => 'IBM DB2 설정',
        'config-invalid-db-type' => '잘못된 데이터베이스 종류',
        'config-missing-db-name' => '"데이터베이스 이름"에 대한 값을 입력해야 합니다',
        'config-missing-db-host' => '"데이터베이스 호스트"에 대한 값을 입력해야 합니다',
@@ -11223,7 +11246,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => '업그레이드가 완료되었습니다.
 
 이제 [$1 위키를 시작]할 수 있습니다.',
-       'config-regenerate' => '<code>LocalSettings.php</code> 다시 만들기 →',
+       'config-regenerate' => 'LocalSettings.php 다시 만들기 →',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code> 쿼리를 실패했습니다!',
        'config-unknown-collation' => "'''경고:''' 데이터베이스가 인식하지 않는 정렬을 사용하고 있습니다.",
        'config-db-web-account' => '웹 접근을 위한 데이터베이스 계정',
@@ -11253,7 +11276,6 @@ MyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실
 MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.
 '''UTF-8 모드'''에서는 MySQL은 데이터를 설정하는 문자 집합을 알고 있기 때문에 적절하게 표현하고 변환할 수 있지만
 [//ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 평면] 밖의 문자를 저장할 수 없습니다.",
-       'config-ibm_db2-low-db-pagesize' => "DB2 데이터베이스에 부족한 페이지 크기가 기본 테이블 공간에 있습니다. 페이지 크기는 '''32K''' 이상이어야 합니다.",
        'config-site-name' => '위키 이름:',
        'config-site-name-help' => '브라우저 제목 표시줄과 다른 여러 곳에 나타납니다.',
        'config-site-name-blank' => '사이트 이름을 입력하세요.',
@@ -11360,8 +11382,10 @@ GFDL 하에 사용을 허가한 내용을 재사용하는 것도 어렵습니다
        'config-upload-deleted-help' => '삭제된 파일을 보관할 디렉토리를 선택하세요.
 이상적으로 웹에서 접근할 수 없게 해야 합니다.',
        'config-logo' => '로고 URL:',
-       'config-logo-help' => '미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고를 포함하고 있습니다.
-적당한 크기로 이미지를 올리고 URL을 여기에 입력하세요.
+       'config-logo-help' => '미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고의 공간을 포함하고 있습니다.
+적당한 크기로 그림을 올리고 여기에 URL을 입력하세요.
+
+로고가 상대적인 경로에 있으면 <code>$wgStylePath</code>나 <code>$wgScriptPath</code>를 사용할 수 있습니다.
 
 로고 사용을 원하지 않으면 이 상자를 비우세요.',
        'config-instantcommons' => '인스턴트 공용 활성화',
@@ -11477,7 +11501,7 @@ $messages['krc'] = array(
 == Файдалы ресурсла ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings тюрлендириулени списогу (ингил.)];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-ни юсюнден кёб берилген соруула];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ни джангы версиясыны чыкъгъанын билдириу письмола].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-ни джангы версиясыны чыкъгъанын билдириу письмола].", # Fuzzy
 );
 
 /** Colognian (Ripoarisch)
@@ -11607,7 +11631,7 @@ Dat heiß, mer moß en affschallde, söns jeiht nix.",
 MediaWiki bruch Funxjohne en däm Modul un deiht et esu nit.
 Wann De <i lang="en">Mandrake</i> aam loufehäs, donn dat Pakätt <code lang="en">php-xml</code> enstalleere.',
        'config-pcre' => 'Dem PHP sing Modul för <i lang="en">PCRE</i> schingk ze fähle.
-MediaWiki deiht et nit ohne de Funxjohne för de <i lang="en">Perl-compatible regular expressions</i>.',
+MediaWiki deiht et nit der ohne de Funxjohne för de rejolähre Ußdrök vun dä Zoot, wi <i lang="en">Perl</i> se kännt.',
        'config-pcre-no-utf8' => "'''Dä:''' Et PHP-Modul <i lang=\"en\">PCRE</i> schingk ohne de <i lang=\"en\">PCRE_UTF8</i>-Aandeile övversaz ze sin.
 MediaWiki bruch dä UTF-8-Krohm ävver, öm ohne Fähler loufe ze künne.",
        'config-memory-raised' => 'Der jrühzte zohjelasse Shpeisherbedarf vum PHP, et <code lang="en">memory_limit</code>, shtund op $1 un es op $2 erop jesaz woode.',
@@ -11622,6 +11646,8 @@ Et Enreeschte kunnt doh draan kappott jon!",
 Et <i lang="en">object caching</i> es nit müjjelesh un ußjeschalldt.',
        'config-mod-security' => "'''Opjepaß''': Dinge Webßööver hät <code lang=\"en\">[http://modsecurity.org/ mod_security]</code> enjeschalldt. Wann doh derbei en Enschtällong nit janz akeraat paßß, dann kann et goot sin, dat mer Probleme met MeedijaWiki un oc met ander Projramme kritt, die zohlööt, dat vun ußerhallef öhndsene Krohm op dä Webßööver jebraat wääde künnt.Beloor Der di Sigg <code lang=\"en\">[http://modsecurity.org/documentation/ mod_security documentation]</code> udder donn met dä Fachlück för Dinge Webßööver kalle, wann zohfälleje un koomijje Fähler bemerke deihß.",
        'config-diff3-bad' => 'Mer han <i lang="en">GNU</i> <code lang="en">diff3</code> nit jefonge.',
+       'config-git' => 'Mer han de Väsjohn <code>$1</code> vun däm Väsjohnsverwalldongsprojamm <i lang="en">Git</i> jefonge.',
+       'config-git-bad' => 'Dat Väsjohnsverwalldongsprojamm <i lang="en">Git</i> ham_mer nit jefonge.',
        'config-imagemagick' => 'Mer han <i lang="en">ImageMagick</i> jefonge: <code>$1</code>.
 Et Ömrääschne en Minni-Beldsche weed müjjelesch sin, wann De et Belder Huhlaade zohlöhß.',
        'config-gd' => 'Mer han de ennjeboute GD-Jrafik-Projramm-Biblijotheek jefonge.
@@ -11641,7 +11667,7 @@ Heh jeihd et nit wigger.',
        'config-using531' => 'MediaWiki läuf nit met PHP $1 zosamme wääje enem [//bugs.php.net/bug.php?id=50394 Fähler em Zosammehang met Parrameetere för <code lang="en">__call()</code>].
 Jangk op de Version 5.3.2 vum <i lang="en">PHP</i> ov dohnoh, udder op de Version 5.3.0 udder dovöör, öm dat Problem ze ömjonn.
 Heh jeiht et nit wigger.',
-       'config-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$q Bytes|noll Byte}} lang wääde. En MediaWiki singe <i lang="en">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat brems. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle. un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.', # Fuzzy
+       'config-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$1 Bytes|noll Byte}} lang wääde. Dem MediaWiki singe <i lang="en">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat bräms. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle, un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.',
        'config-db-type' => 'De Zoot Daatebangk:',
        'config-db-host' => 'Dä Name vun däm Rääschner met dä Daatebangk:',
        'config-db-host-help' => 'Wann Dinge ẞööver för de Daatebangk ob enem andere Rääschner es, donn heh dämm singe Name udder dämm sing <i lang="en">IP</i>-Addräß enjävve.
@@ -11723,7 +11749,6 @@ Donn Ding Daatebangk et beß janz woh anders hen, noh <code lang="en">/var/lib/m
        'config-type-postgres' => '<i lang="en">PostgreSQL</i>',
        'config-type-sqlite' => '<i lang="en">SQLite</i>',
        'config-type-oracle' => '<i lang="en">Oracle</i>',
-       'config-type-ibm_db2' => 'Dä <i lang="en">IBM</i> ier <i lang="en">DB2</i>',
        'config-support-info' => 'MediaWiki kann met heh dä Daatebangk_Süßteeme zosamme jonn:
 
 $1
@@ -11733,12 +11758,10 @@ Wann dat Daatebangk_Süßteem, wat De nämme wells, onge nit dobei es, dann donn
        'config-support-postgres' => '* <i lang="en">$1</i> es e bikannt Daatebangksüßteem met offe Quälltäxde, un en och en Wahl nävve <i lang="en">MySQL</i> ([http://www.php.net/manual/de/pgsql.installation.php Aanleidung för et Övversäze un Enreeschte von PHP met <i lang="en">PostgreSQL</i> dobei, op Deutsch]) Et sinn_er ävver paa klein Fählershe bekannt, um kunne dat em Momang för et reschtijje Werke nit emfähle.',
        'config-support-sqlite' => '* <i lang="en">$1</i> es e eijfach Daatebangksüßteem, wat joot ongershtöz weed. ([http://www.php.net/manual/de/pdo.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang="en">SQLite</i> dobei, op Deutsch])',
        'config-support-oracle' => '* <i lang="en">$1</i> es e jeschäfflesch Daatebangksüßteem för Ferme. ([http://www.php.net/manual/de/oci8.installation.php Aanleidong för et Övversäze un Enreeschte von PHP met <i lang="en">OCI8</i> dobei, op Deutsch])',
-       'config-support-ibm_db2' => '* $1 es en Datebengk för et Jeschäff un fö Ongernehme.', # Fuzzy
        'config-header-mysql' => 'De Enshtällunge för de <i lang="en">MySQL</i> Daatebangk',
        'config-header-postgres' => 'De Enshtällunge för de <i lang="en">PostgreSQL</i> Daatebangk',
        'config-header-sqlite' => 'De Enshtällunge för de <i lang="en">SQLite</i> Daatebangk',
        'config-header-oracle' => 'De Enshtällunge för de <i lang="en">Oracle</i> Daatebangk',
-       'config-header-ibm_db2' => 'De Enshtällunge för de <i lang="en">IBM</i> ier <i lang="en">DB2</i>',
        'config-invalid-db-type' => 'Dat es en onjöltijje Zoot Daatebangk.',
        'config-missing-db-name' => 'Do moß jät enjävve för dä Name vun dä Daatebangk.',
        'config-missing-db-host' => 'Do moß jät enjävve för dä Name vun däm Rääschner met dä Daatebangk.',
@@ -11815,6 +11838,13 @@ Dä aanjejovve Zohjang för der Nomaalbedrief moß dröm schunn enjersht sen!',
 
 Wann Ding <i lang="en">MySQL</i> et Schpeischere en <i lang="en">InnoDB</i>-Datteije ongerschtöze deiht, dom_mer dat nohdröcklesch ämfähle.
 Kann dä ẞööver dat nit, künnd et joode jelääjeheit sin, dä ens op der neuste Schtand ze bränge.',
+       'config-mysql-only-myisam-dep' => '\'\'\'Opjepaß:\'\'\' <i lang="en">MyISAM</i> es de einzeje Zoot Speischerprojramm för <i lang="en">MySQL</i>, di nit för MediaWiki ze ämfähle es, weil:
+* wääje dem Schpärre vun jannze Tabälle sin koum paralleele Axjuhne en dä Daatebangk möjjelesch,
+* et es aanfällesch för Probleeme met de Daate es, un
+* et weed vun MediaWiki nit emmer jood ongerschtöz.
+
+Ding Enschtallazjuhn vum <i lang="en">MySQL</i> kann nit met <i lang="en">InnoDB</i> ömjonn.
+Wi wöhr et met ener neuere väsjohn vum <i lang="en">MySQL</i>?',
        'config-mysql-engine-help' => "'''InnoDB''' es fö jewöhnlesch et beß, weil vill Zohjreffe op eijmohl joot ongershtöz wääde.
 
 '''MyISAM''' es flöcker op Rääschnere met bloß einem Minsch draan, un bei Wikis, di mer bloß lässe un nit schrieeve kann.
@@ -11827,7 +11857,6 @@ Dat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> u
 
 Beim Shpeishere em '''UTF-8 Fomaat''' deiht et <i lang=\"en\">MySQL</i> der Zeishesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,
 allerdengs künne kein Zeishe ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Shprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeshpeishert wääde.",
-       'config-ibm_db2-low-db-pagesize' => "De <i lang=\"en\">DB2</i> Daatebangk heh hät ene standattmääßeje Plaz för Tabälle met zoh klein Sigge. Dä Plaz en de Sigge moß '''32K''' udder mieh sin.",
        'config-site-name' => 'Däm Wiki singe Name:',
        'config-site-name-help' => 'Dä douch em Tittel vun de Brauserfinstere un aan ätlije andere Shtälle op.',
        'config-site-name-blank' => 'Donn ene Name för di Sait aanjävve.',
@@ -11870,25 +11899,25 @@ Do künnts jez der Räß vun de einzel Enshtellunge övverjonn, un et Wiki tirä
        'config-optional-continue' => 'De wells noch mieh Frore jeshtallt krijje un noch mieh Enshtällunge maache?',
        'config-optional-skip' => 'Nä, lohß dä Ömshtand, donn eifarr_et Wiki opsäze.',
        'config-profile' => 'Enshtällunge för de Metmaacher ier Rääschte:',
-       'config-profile-wiki' => 'E tradizjonäll offe Wiki', # Fuzzy
+       'config-profile-wiki' => 'En offe Wiki',
        '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 beß, wam_mer esu vill Lück wi müjjelesch draan metmaache un schrieve löht.
-Met MediaWiki es et ejfach, de neuste Änderunge ze beloore un wat ahnungslose udder fiese Lück kapott jemaat han wider retuur ze maache.
+       'config-profile-help' => "Wikis loufe et bäß, wam_mer esu vill Lück wi möjjelesch draan metmaache un schrieve löht.
+Met MediaWiki es et ejfach, de neuste Änderonge ze beloore un wat ahnungslose udder fiese Lück kapott jemaat han wider retuur ze maache.
 
-Bloß, mänsh eine häd_eruß jefonge, dat mer MediaWiki jood en en jruuße Zahl ongerscheidlijje Rolle bruche kann, un nit emmer es et leish, ene vum onverfälschte Wiki_Wääsch ze övverzeuje.
+Bloß, 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.
 Esu häß De de Wahl:
 
-'''{{int:config-profile-wiki}}''' löht jeder_ein metschrieve, och ohne enzelogge.
+'''{{int:config-profile-wiki}}''' löht jeder_ein metschrieve, och ohne sesch enzelogge.
 
-'''{{int:config-profile-no-anon}}''', dat sorsh för mieh seeshbaa Verantwootlishkeite, künnt ävver zohfällije Methellefer verschrecke.
+'''{{int:config-profile-no-anon}}''', dat sorsch för mieh seeschbaa Verantwootlischkeite, künnt ävver zohfällije Methellefer verschrecke.
 
 '''{{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.
 
 '''{{int:config-profile-private}}''' kann nur lässe, wäh en et Wiki zohjelohße es, un desellve Jropp kann uch schrieve.
 
-Noch ander un un opwändijere Enshtellunge för de Rääschte sin müjjelesch, wann et Wiki ens aam Loufe es. Loor Der doför de [//www.mediawiki.org/wiki/Manual:User_rights zopaß Hölp em Handbooch] aan.", # Fuzzy
+Noch 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/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',
@@ -11937,6 +11966,8 @@ Et bäß es, wam_mer vum <i lang="en">world wide web</i> doh nit drahn kumme kan
        'config-logo-help' => 'De Schtandart_Bedeen_Bovverfläsch vum MediaWiki hät e Logo bovve en der Eck met 135x160 Pixele.
 Donn e zopaß Logo huh laade, un donn däm sing URL heh endraare.
 
+Do kanns <code lang="en">$wgStylePath</code> udder <code lang="en">$wgScriptPath</code> nämme, wann Ding Logo en einem vun dänne Pahde litt.
+
 Wells De kei Logo han, draach heh nix en.',
        'config-instantcommons' => 'Donn <i lang="en">InstantCommons</i> zohlohße.',
        'config-instantcommons-help' => '<i lang="en">[//www.mediawiki.org/wiki/InstantCommons InstantCommons]</i> es en Eijeschaff, di et för Wikis müjjelesch määt, Belder, Tondatteie un ander Meedijedatteie enzebenge, di op dä Webßait vun de <i lang="en">[//commons.wikimedia.org/ Wikimedia Commons]</i> ongerjebraat sin. Öm dat noze ze künne, moß dä ẞööver vum MediaWiki en Verbendung nohm Internet opnämme künne.
@@ -11963,7 +11994,7 @@ Se sullte ein pro Reih opjeschrevve sin, un en Pooz (<i lang="en">port</i>) ier
        'config-memcache-noport' => 'Do has kein Pooz (<code lang="en">port</code>) Nommer aanjejovve för mem <code lang="en">memcached</code> ẞööver ze bruche: $1.
 Wann De di Nommer nit weiß, der Shtandatt es 11211.',
        'config-memcache-badport' => 'Dem <code lang="en">memcached</code> ẞööver singe Pooz (<code lang="en">port</code>) Nommere sullte zwesche $1 un $2 sin.',
-       'config-extensions' => 'Projramm-Zosätz (<i lang="en">extensions</i>)',
+       'config-extensions' => 'Projramm-Zohsäz (<i lang="en">Extensions</i>)',
        'config-extensions-help' => 'Di bovve opjeleß Zohsazprojramme för et MediaWiki sin em Verzeischneß <code lang="en">./extensions</code> ald ze fenge.
 
 Do kann se heh un jez aanschallde, ävver se künnte noch zohsäzlesch Enshtellunge bruche.',
@@ -11971,7 +12002,7 @@ Do kann se heh un jez aanschallde, ävver se künnte noch zohsäzlesch Enshtellu
 Et sühd esu uß, wi wann De MediaWiki ald enshtalleet hätß, un wöhrs aam Versöhke, dat norr_ens ze donn.
 Jang wigger op de näähßte Sigg.",
        'config-install-begin' => 'Wann De op „{{int:config-continue}}“ klecks, jeiht de Enshtallazjuhn vum MediaWiki loßß.
-Wann De noch Änderonge maache wells, dann kleck op „{{int:config-back}}“.', # Fuzzy
+Wann De noch Änderonge maache wells, dann kleck op „{{int:config-back}}“.',
        'config-install-step-done' => 'jedonn',
        'config-install-step-failed' => 'donävve jejange',
        'config-install-extensions' => 'Zohsazprojramme enjeschloße',
@@ -12031,14 +12062,18 @@ Wann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De '''[\$2 en Ding W
        'config-download-localsettings' => 'Donn di Dattei <code lang="en">LocalSettings.php</code> eronger laade',
        'config-help' => 'Hölp',
        '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/Manual:Extensions Zohsazprojramme] hann kann?
+
+Do kanns [//www.mediawiki.org/wiki/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' => "'''MediaWiki es jetz enstalleet.'''",
-       'mainpagedocfooter' => 'Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handboch] wann De wesse wells wie de Wiki-Soffwär jebruch un bedeent wääde muss.
+       '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ß.
 
 == För dä Aanfang ==
 Dat es och all op Änglesch:
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Donn MediaWiki op Ding Schprooch aanpaße]',
 );
 
 /** Kurdish (Latin script) (Kurdî (latînî)‎)
@@ -12060,7 +12095,7 @@ $messages['ku-latn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lîsteya varîyablên konfîgûrasîyonê]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lîsteya e-nameyên versyonên nuh yê MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lîsteya e-nameyên versyonên nuh yê MediaWiki]', # Fuzzy
 );
 
 /** Ladino (Ladino)
@@ -12073,7 +12108,7 @@ $messages['lad'] = array(
 == En Empeçando ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings La lista de los arreglamientos de la konfiggurasyón]
 * [//www.mediawiki.org/wiki/Manual:FAQ/lad DDS de MedyaViki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce La lista de las letrales (e-mail) de MedyaViki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce La lista de las letrales (e-mail) de MedyaViki]', # Fuzzy
 );
 
 /** Luxembourgish (Lëtzebuergesch)
@@ -12183,13 +12218,10 @@ Wann et de Kont net gëtt, a wann den Installatiouns-Kont genuch Rechter huet, g
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
-       'config-support-ibm_db2' => '* $1 ass eng kommerziell Firma fir Datebanken', # Fuzzy
        'config-header-mysql' => 'MySQL-Astellungen',
        'config-header-postgres' => 'PostgreSQL-Astellungen',
        'config-header-sqlite' => 'SQLite-Astellungen',
        'config-header-oracle' => 'Oracle-Astellungen',
-       'config-header-ibm_db2' => 'IBM DB2-Astellungen',
        'config-invalid-db-type' => 'Net valabelen Datebank-Typ',
        'config-missing-db-name' => 'Dir musst en Numm fir de Wäert "Numm vun der Datebank" uginn',
        'config-missing-db-host' => 'Dir musst e Wäert fir "Database host" uginn',
@@ -12204,7 +12236,7 @@ E gëtt fir den Numm vum SQLite Date-Fichier benotzt.',
        'config-upgrade-done-no-regenerate' => "D'Aktualisatioun ass ofgeschloss.
 
 Dir kënnt elo [$1 ufänken Är Wiki ze benotzen]",
-       'config-regenerate' => '<code>LocalSettings.php</code> regeneréieren →',
+       'config-regenerate' => 'LocalSettings.php regeneréieren →',
        'config-db-web-account' => 'Datebankkont fir den Accès iwwer de Web',
        'config-db-web-account-same' => 'Dee selwechte Kont wéi bei der Installatioun benotzen',
        'config-db-web-create' => 'De Kont uleeë wann et e net scho gëtt',
@@ -12242,7 +12274,7 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
        'config-optional-continue' => 'Stellt mir méi Froen.',
        'config-optional-skip' => "Ech hunn es genuch, installéier just d'Wiki.",
        'config-profile' => 'Profil vun de Benotzerrechter:',
-       'config-profile-wiki' => 'Traditionell Wiki', # Fuzzy
+       'config-profile-wiki' => 'Oppe Wiki',
        'config-profile-no-anon' => 'Uleeë vun engem Benotzerkont verlaangt',
        'config-profile-fishbowl' => 'Nëmmen autoriséiert Editeuren',
        'config-profile-private' => 'Privat Wiki',
@@ -12258,7 +12290,7 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
        'config-email-sender' => 'E-Mailadress fir Äntwerten:',
        'config-upload-settings' => 'Eropgeluede Biller a Fichieren',
        'config-upload-enable' => 'Eropluede vu Fichieren aschalten',
-       'config-upload-deleted' => 'Repertoire fir geläschte Fichieren:',
+       'config-upload-deleted' => 'Repertoire fir geläscht Fichieren:',
        'config-logo' => 'URL vum Logo:',
        'config-instantcommons' => '"Instant Commons" aktivéieren',
        'config-cc-again' => 'Nach eng kéier eraussichen...',
@@ -12268,6 +12300,7 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
        'config-install-step-failed' => 'huet net fonctionnéiert',
        'config-install-extensions' => 'Mat den Ereiderungen',
        'config-install-database' => 'Datebank gëtt installéiert',
+       'config-install-pg-plpgsql' => 'No der Sprooch PL/pgSQL sichen',
        'config-pg-no-plpgsql' => "Fir d'Datebank $1 muss d'Datebanksprooch PL/pgSQL installéiert ginn",
        'config-install-user' => 'Datebank Benotzer uleeën',
        'config-install-user-alreadyexists' => 'De Benotzer "$1" gëtt et schonn!',
@@ -12285,12 +12318,13 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
        'config-help' => 'Hëllef',
        'config-nofile' => 'De Fichier "$1" gouf net fonnt. Gouf e geläscht?',
        'mainpagetext' => "'''MediaWiki gouf installéiert.'''",
-       'mainpagedocfooter' => "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir den Interface ze personnaliséieren.
+       'mainpagedocfooter' => "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.
 
-== Starthëllefen ==
+== Fir  unzefänken ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Hëllef bei der Konfiguratioun]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]", # Fuzzy
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]",
 );
 
 /** Lingua Franca Nova (Lingua Franca Nova)
@@ -12303,7 +12337,7 @@ $messages['lfn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustas de la desinia]
 * [//www.mediawiki.org/wiki/Manual:FAQ Demandas comun de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista per receta anunsias de novas supra MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista per receta anunsias de novas supra MediaWiki]', # Fuzzy
 );
 
 /** Ganda (Luganda)
@@ -12316,7 +12350,7 @@ $messages['lg'] = array(
 == Amagezi agakuyamba okutandika ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lukalala lw'eby'enteekateeka yo]
 * [//www.mediawiki.org/wiki/Manual:FAQ Ebiter'okubuuzibwa ku MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]", # Fuzzy
 );
 
 /** Limburgish (Limburgs)
@@ -12329,7 +12363,7 @@ $messages['li'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lies mit instellinge]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki VGV (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]", # Fuzzy
 );
 
 /** Lao (ລາວ)
@@ -12359,12 +12393,10 @@ $messages['lt'] = array(
        'config-page-upgradedoc' => 'Atnaujinama',
        'config-restart' => 'Taip, paleiskite jį iš naujo',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'MySQL nustatymai',
        'config-header-postgres' => 'PostgreSQL nustatymai',
        'config-header-sqlite' => 'SQLite nustatymai',
        'config-header-oracle' => 'Oracle nustatymai',
-       'config-header-ibm_db2' => 'IBM DB2 nustatymai',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
        'config-mysql-utf8' => 'UTF-8',
@@ -12385,7 +12417,7 @@ $messages['lt'] = array(
        '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' => 'Tradicinė viki', # Fuzzy
        'config-profile-private' => 'Privati viki',
        'config-license-pd' => 'Viešas Domenas',
        'config-email-settings' => 'El. pašto nustatymai',
@@ -12432,7 +12464,7 @@ $messages['lv'] = array(
 == Pirmie soļi ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurācijas iespēju saraksts]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki J&A]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Parakstīties uz paziņojumiem par jaunām MediaWiki versijām]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Parakstīties uz paziņojumiem par jaunām MediaWiki versijām]', # Fuzzy
 );
 
 /** Literary Chinese (文言)
@@ -12445,7 +12477,7 @@ $messages['lzh'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Lazuri (Lazuri)
@@ -12458,7 +12490,7 @@ $messages['lzz'] = array(
 == Ağani na gyoç’k’u maxmarepe ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Ok'iduşi ayarepeşi liste]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki P'anda Na-k'itxu K'itxalape]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-mailepeşiş liste]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-mailepeşiş liste]", # Fuzzy
 );
 
 /** Maithili (मैथिली)
@@ -12471,7 +12503,7 @@ $messages['mai'] = array(
 ==प्रारम्भ कोना करी==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Moksha (мокшень)
@@ -12484,7 +12516,7 @@ $messages['mdf'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Васьфневи арафнематнень кярькссь]
 * [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикить Сидеста Кеподеви Кизефксне]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикить од верзиятнень колга кулянь пачфтема]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикить од верзиятнень колга кулянь пачфтема]', # Fuzzy
 );
 
 /** Malagasy (Malagasy)
@@ -12518,7 +12550,7 @@ $messages['mg'] = array(
        'config-admin-name' => 'Ny anaranao :',
        'config-admin-password' => 'Tenimiafina :',
        'config-admin-email' => 'Adiresy imailaka :',
-       'config-profile-wiki' => 'Wiki tsotra',
+       'config-profile-wiki' => 'Wiki tsotra', # Fuzzy
        'config-profile-no-anon' => 'Mila mamorona kaonty',
        'config-profile-fishbowl' => 'Mpanova mahazo alalana ihany',
        'config-profile-private' => 'Wiki tsy sarababem-bahoaka',
@@ -12542,7 +12574,7 @@ $messages['mg'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lisitra ny paramètre de configuration]
 * [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ momba ny MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]", # Fuzzy
 );
 
 /** Eastern Mari (олык марий)
@@ -12552,17 +12584,18 @@ $messages['mhr'] = array(
 );
 
 /** Minangkabau (Baso Minangkabau)
+ * @author Iwan Novirion
  * @author Luthfi94
  */
 $messages['min'] = array(
        'mainpagetext' => "'''MediaWiki alah tapasang jo sukses'''.",
-       'mainpagedocfooter' => 'Silakan baco [//www.mediawiki.org/wiki/Help:Contents/id Panduan Pangguno] untuak caro panggunoan parangkaik lunak wiki iko.
+       'mainpagedocfooter' => 'Konsultasian [//meta.wikimedia.org/wiki/Help:Contents/min Panduan Panggunoan] untuak informasi caro panggunoan parangkaik lunak wiki.
 
 == Mamulai panggunoan ==
-
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Dafta pangaturan konfigurasi]
-* [//www.mediawiki.org/wiki/Manual:FAQ/id Dafta patanyoan nan acok diajukan manganai MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]',
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings/id Daftar pangaturan konfigurasi]
+* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar patanyoan nan acok diajukan manganai MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]
+* [//www.mediawiki.org/wiki/Localisation#Translation_resources Palokalan MediaWiki untuak bahaso Sanak]',
 );
 
 /** Macedonian (македонски)
@@ -12701,6 +12734,8 @@ $1
        'config-mod-security' => "'''Предупредување''': на вашиот опслужувач има овозможено [http://modsecurity.org/ mod_security]. Ако не е поставено како што треба, ова може да предизвика проблеми кај МедијаВики и други програми што им овозможуваат на корисниците да објавуваат произволни содржини.
 Погледнете ја [http://modsecurity.org/documentation/ mod_security документацијата] или обратете се кај домаќинот ако наидете на случајни грешки.",
        'config-diff3-bad' => 'GNU diff3 не е пронајден.',
+       'config-git' => 'Го пронајдов Git програмот за контрола на верзии: <code>$1</code>.',
+       'config-git-bad' => 'Не го пронајдов Git-програмот за контрола на верзии.',
        'config-imagemagick' => 'Пронајден е ImageMagick: <code>$1</code>.
 Ако овозможите подигање, тогаш ќе биде овозможена минијатуризација на сликите.',
        'config-gd' => 'Утврдив дека има вградена GD графичка библиотека.
@@ -12794,7 +12829,6 @@ $1
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'МедијаВики ги поддржува следниве системи на бази на податоци:
 
 $1
        'config-support-postgres' => '* $1 е популарен систем на бази на податоци со отворен код кој претставува алтернатива на MySQL ([http://www.php.net/manual/en/pgsql.installation.php како да составите PHP со поддршка за PostgreSQL]). Може сè уште да има некои грешки. па затоа не се препорачува за употреба во производна средина.',
        'config-support-sqlite' => '* $1 е лесен систем за бази на податоци кој е многу добро поддржан. ([http://www.php.net/manual/en/pdo.installation.php Како да составите PHP со поддршка за SQLite], користи PDO)',
        'config-support-oracle' => '* $1 е база на податоци на комерцијално претпријатие. ([http://www.php.net/manual/en/oci8.installation.php Како да составите PHP со поддршка за OCI8])',
-       'config-support-ibm_db2' => '* $1 е комерцијална база на податоциза фирми. ([http://www.php.net/manual/en/ibm-db2.installation.php Како да составите PHP со поддршка за IBM DB2])',
        'config-header-mysql' => 'Нагодувања на MySQL',
        'config-header-postgres' => 'Нагодувања на PostgreSQL',
        'config-header-sqlite' => 'Нагодувања на SQLite',
        'config-header-oracle' => 'Нагодувања на Oracle',
-       'config-header-ibm_db2' => 'Нагодувања на IBM DB2',
        'config-invalid-db-type' => 'Неважечки тип на база',
        'config-missing-db-name' => 'Мора да внесете значење за параметарот „Име на базата“',
        'config-missing-db-host' => 'Мора да внесете вредност за „Домаќин на базата на податоци“',
@@ -12871,7 +12903,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Надградбата заврши.
 
 Сега можете да [$1 почнете да го користите викито].',
-       'config-regenerate' => 'Пресоздај <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Пресоздај LocalSettings.php →',
        'config-show-table-status' => 'Барањето <code>SHOW TABLE STATUS</code> не успеа!',
        'config-unknown-collation' => "'''Предупредување:''' Базата корисни непрепознаена упатна споредба.",
        'config-db-web-account' => 'Сметка на базата за мрежен пристап',
@@ -12890,6 +12922,11 @@ chmod a+w $3</pre>',
 
 Ако вашата инсталација на MySQL поддржува InnoDB, тогаш сериозно препорачуваме да го користите него наместо MyISAM.
 Ако вашата инсталација на MySQL не поддржува InnoDB, веројатно дошло време за надградба.",
+       'config-mysql-only-myisam-dep' => "'''Предупредување:''' MyISAM е единствениот достапен складишен погон за MySQL, што не се препорачува за употреба со МедијаВики, бидејќи:
+* речиси не поддржува истовремено извршување на задачите поради заклучувањето на табелите
+* поподложен е на расипувања од другите погони
+* кодната база на МедијаВИки не секогаш работи исправно со MyISAM
+Вашата инсталација на MySQL не поддржува InnoDB. Можеби е време да ја надградите.",
        'config-mysql-engine-help' => "'''InnoDB''' речиси секогаш е најдобар избор, бидејќи има добра поддршка за едновременост.
 
 '''MyISAM''' може да е побрз кај инсталациите наменети за само еден корисник или незаписни инсталации (само читање).
@@ -12901,7 +12938,6 @@ chmod a+w $3</pre>',
 Ова е поефикасно отколку  TF-8 режимот на MySQL, и ви овозможува да ја користите целата палета на уникодни знаци.
 
 Во '''UTF-8 режим''', MySQL ќе знае на кој збир знаци припаѓаат вашите податоци, и може соодветно да ги претстави и претвори, но нема да ви дозволи да складиратезнаци над [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основната повеќејазична рамнина].",
-       'config-ibm_db2-low-db-pagesize' => "Вашата база на податоци DB2 има основно-зададен табеларен простор со недоволна големина на страниците. Таа треба да изнесува барем '''32 килобајти'''.",
        'config-site-name' => 'Име на викито:',
        'config-site-name-help' => 'Ова ќе се појавува во заглавната лента на прелистувачот и на разни други места.',
        'config-site-name-blank' => 'Внесете име на мрежното место.',
@@ -12911,8 +12947,8 @@ chmod a+w $3</pre>',
        'config-ns-other' => 'Друго (наведете)',
        'config-ns-other-default' => 'МоеВики',
        'config-project-namespace-help' => "По примерот на Википедија, многу викија ги чуваат страниците со правила на посебно место од самите содржини, т.е. во „'''проектен именски простор'''“.
-СиÑ\82е Ð½Ð°Ñ\81лови Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ð²Ð¾ Ð¾Ð²Ð¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð¿Ð¾Ñ\87нÑ\83вааÑ\82 Ñ\81о Ð¸Ð·Ð²ÐµÑ\81ен Ð¿Ñ\80еÑ\84икÑ\81, којшто можете да го укажете тука.
\9fо Ñ\82Ñ\80адиÑ\86иÑ\98а Ð¿Ñ\80еÑ\84икÑ\81оÑ\82 произлегува од името на викито, но не смее да содржи интерпункциски знаци како „#“ или „:“.",
+СиÑ\82е Ð½Ð°Ñ\81лови Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ð²Ð¾ Ð¾Ð²Ð¾Ñ\98 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð¿Ð¾Ñ\87нÑ\83вааÑ\82 Ñ\81о Ð¸Ð·Ð²ÐµÑ\81на Ð¿Ñ\80еÑ\82Ñ\81Ñ\82авка, којшто можете да го укажете тука.
\9fо Ñ\82Ñ\80адиÑ\86иÑ\98а Ð¿Ñ\80еÑ\82Ñ\81Ñ\82авкаÑ\82а произлегува од името на викито, но не смее да содржи интерпункциски знаци како „#“ или „:“.",
        'config-ns-invalid' => 'Назначениот именски простор „<nowiki>$1</nowiki>“ е неважечки.
 Назначете друг проектен именски простор.',
        'config-ns-conflict' => 'Наведениот именски простор „<nowiki>$1</nowiki>“ се коси со основниот именски простор на МедијаВики.
@@ -13008,8 +13044,9 @@ chmod a+w $3</pre>',
        'config-upload-deleted-help' => 'Одберете во која папка да се архивираат избришаните податотеки.
 Најдобро би било ако таа не е достапна преку интернет.',
        'config-logo' => 'URL за логото:',
-       'config-logo-help' => 'Матичното руво на МедијаВики има простор за лого од 135 x 160 пиксели над страничната лента.
-Подигнете слика со соодветна големина, и тука внесете ја URL-адресата.
+       'config-logo-help' => 'Матичното руво на МедијаВики има простор за лого од 135x160 пиксели над страничната лента.
+
+Можете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.
 
 Ако не сакате да имате лого, тогаш оставете го ова поле празно.',
        'config-instantcommons' => 'Овозможи Instant Commons',
@@ -13104,6 +13141,9 @@ $3
        'config-download-localsettings' => 'Преземи го <code>LocalSettings.php</code>',
        'config-help' => 'помош',
        'config-nofile' => 'Податотеката „$1“ не е пронајдена. Да не е избришана?',
+       'config-extension-link' => 'Дали сте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Manual:Extensions додатоци]?
+
+Можете да ги прелистате [//www.mediawiki.org/wiki/Category:Extensions_by_category по категории] или да ја посетите [//www.mediawiki.org/wiki/Extension_Matrix матрицата], каде ќе најдете полн список на додатоци.',
        'mainpagetext' => "'''МедијаВики е успешно инсталиран.'''",
        'mainpagedocfooter' => 'Погледнете го [//meta.wikimedia.org/wiki/Help:Contents Упатството за корисници] за подетални иформации како се користи вики-програмот.
 
@@ -13181,7 +13221,7 @@ $1
        'config-connection-error' => '$1.
 
 താഴെ നൽകിയിരിക്കുന്ന ഹോസ്റ്റ്, ഉപയോക്തൃനാമം, രഹസ്യവാക്ക് എന്നിവ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.',
-       'config-regenerate' => '<code>LocalSettings.php</code> പുനഃസൃഷ്ടിക്കുക →',
+       'config-regenerate' => 'LocalSettings.php പുനഃസൃഷ്ടിക്കുക →',
        'config-mysql-engine' => 'സ്റ്റോറേജ് എൻജിൻ:',
        'config-site-name' => 'വിക്കിയുടെ പേര്:',
        'config-site-name-help' => 'ഇത് ബ്രൗസറിന്റെ ടൈറ്റിൽ ബാറിലും മറ്റനേകം ഇടങ്ങളിലും പ്രദർശിപ്പിക്കപ്പെടും.',
@@ -13281,7 +13321,7 @@ $messages['mn'] = array(
 == Эхлэх ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Тохиргоо]
 * [//www.mediawiki.org/wiki/Manual:FAQ МедиаВикигийн тогтмол тавигддаг асуултууд]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мэдээний мэйл явуулах жагсаалт]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мэдээний мэйл явуулах жагсаалт]', # Fuzzy
 );
 
 /** Marathi (मराठी)
@@ -13294,7 +13334,7 @@ $messages['mr'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings कॉन्फिगरेशन सेटींगची यादी]
 * [//www.mediawiki.org/wiki/Manual:FAQ मीडियाविकी नेहमी विचारले जाणारे प्रश्न]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मीडियाविकि मेलिंग लिस्ट]', # Fuzzy
 );
 
 /** Malay (Bahasa Melayu)
@@ -13335,12 +13375,10 @@ Bagaimanapun, MediaWiki memerlukan PHP $2 ke atas.',
        'config-unicode-using-utf8' => 'utf8_normalize.so oleh Brion Vibber digunakan untuk penormalan Unicode.',
        'config-unicode-using-intl' => '[http://pecl.php.net/intl Sambungan intl PECL] digunakan untuk penormalan Unicode.',
        'config-db-charset' => 'Peranggu aksara pangkalan data',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'Keutamaan MySQL',
        'config-header-postgres' => 'Keutamaan PostgreSQL',
        'config-header-sqlite' => 'Keutamaan SQLite',
        'config-header-oracle' => 'Keutamaan Oracle',
-       'config-header-ibm_db2' => 'Keutamaan IBM DB2',
        'config-invalid-db-type' => 'Jenis pangkalan data tidak sah',
        'config-db-web-account-same' => 'Gunakan akaun yang sama seperti dalam pemasangan',
        'config-db-web-create' => 'Ciptakan akaun jika belum wujud',
@@ -13533,10 +13571,10 @@ $messages['nan'] = array(
 == 入門 ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings 配置的設定]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki時常問答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]', # Fuzzy
 );
 
-/** Norwegian Bokmål (norsk (bokmål)‎)
+/** Norwegian Bokmål (norsk bokmål)
  * @author Event
  * @author Nghtwlkr
  * @author 아라
@@ -13767,7 +13805,6 @@ Vurder å plassere databasen et helt annet sted, for eksempel i <code>/var/lib/m
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki støtter følgende databasesystem:
 
 $1
@@ -13777,12 +13814,10 @@ Hvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg i
        'config-support-postgres' => '* $1 er et populært åpen kildekode-databasesystem som er et alternativ til MySQL ([http://www.php.net/manual/en/pgsql.installation.php hvordan kompilere PHP med PostgreSQL-støtte]). Det kan være noen små utestående feil og det anbefales ikke for bruk i et produksjonsmiljø.',
        'config-support-sqlite' => '* $1 er et lettvekts-databasesystem som er veldig godt støttet. ([http://www.php.net/manual/en/pdo.installation.php hvordan kompilere PHP med SQLite-støtte], bruker PDO)',
        'config-support-oracle' => '* $1 er en kommersiell bedriftsdatabase. ([http://www.php.net/manual/en/oci8.installation.php Hvordan kompilere PHP med OCI8-støtte])',
-       'config-support-ibm_db2' => '* $1 er en kommersiell bedriftsdatabase.', # Fuzzy
        'config-header-mysql' => 'MySQL-innstillinger',
        'config-header-postgres' => 'PostgreSQL-innstillinger',
        'config-header-sqlite' => 'SQLite-innstillinger',
        'config-header-oracle' => 'Oracle-innstillinger',
-       'config-header-ibm_db2' => 'IBM DB2-innstillinger',
        'config-invalid-db-type' => 'Ugyldig databasetype',
        'config-missing-db-name' => 'Du må skrive inn en verdi for «Databasenavn»',
        'config-missing-db-host' => 'Du må skrive inn en verdi for «Databasevert»',
@@ -13844,7 +13879,7 @@ Dette er '''ikke anbefalt''' med mindre du har problemer med wikien din.",
        'config-upgrade-done-no-regenerate' => 'Oppgradering fullført.
 
 Du kan nå [$1 begynne å bruke wikien din].',
-       'config-regenerate' => 'Regenerer <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerer LocalSettings.php →',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code> etterspørselen mislyktes!',
        'config-unknown-collation' => "'''Advarsel:''' Databasen bruker en ukjent sortering.",
        'config-db-web-account' => 'Databasekonto for nettilgang',
@@ -13868,7 +13903,6 @@ Dette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spek
 
 I '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,
 men det vil ikke la deg lagre tegn over «[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
-       'config-ibm_db2-low-db-pagesize' => "DB2-databasen din har et standard tabellområde med en utilstrekkelig pagesize. Pagesize må være '''32K''' eller større.",
        'config-site-name' => 'Navn på wiki:',
        'config-site-name-help' => 'Dette vil vises i tittellinjen i nettleseren og diverse andre steder.',
        'config-site-name-blank' => 'Skriv inn et nettstedsnavn.',
@@ -13999,14 +14033,20 @@ For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man
 );
 
 /** Low German (Plattdüütsch)
+ * @author Joachim Mos
  */
 $messages['nds'] = array(
+       'config-page-name' => 'Naam',
+       'config-ns-generic' => 'Projekt',
+       'config-admin-name' => 'Dien Naam:',
+       'config-admin-password' => 'Passwoord:',
+       'config-help' => 'Hülp',
        'mainpagetext' => "'''De MediaWiki-Software is mit Spood installeert worrn.'''",
        'mainpagedocfooter' => 'Kiek de [//meta.wikimedia.org/wiki/MediaWiki_localisation Dokumentatschoon för dat Anpassen vun de Brukerböversiet]
-un dat [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.',
+un dat [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.', # Fuzzy
 );
 
-/** Nedersaksisch (Nedersaksisch)
+/** Low Saxon (Netherlands) (Nedersaksies)
  * @author Servien
  */
 $messages['nds-nl'] = array(
@@ -14016,7 +14056,7 @@ $messages['nds-nl'] = array(
 == Meer hulpe ==
 * [//www.mediawiki.org/wiki/Help:Configuration_settings Lieste mit instellingen]
 * [//www.mediawiki.org/wiki/Help:FAQ MediaWiki-vragen die vake esteld wörden]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-postlieste veur nieje versies]', # Fuzzy
 );
 
 /** Nepali (नेपाली)
@@ -14030,7 +14070,7 @@ $messages['ne'] = array(
 == सुरू गर्नको लागि  ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings विन्यास सेटिङ्ग सूची]
 * [//www.mediawiki.org/wiki/Manual:FAQ मेडियाविकि सामान्य प्रश्नका उत्तरहरु]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सुचना मेलिङ्ग सूची]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce मेडियाविकि सुचना मेलिङ्ग सूची]', # Fuzzy
 );
 
 /** Dutch (Nederlands)
@@ -14175,6 +14215,8 @@ Het cachen van objecten is niet ingeschakeld.",
        'config-mod-security' => "'''Waarschuwing:''' uw webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.
 Lees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van uw provider als u tegen problemen aanloopt.",
        'config-diff3-bad' => 'GNU diff3 niet aangetroffen.',
+       'config-git' => 'Versiecontrolesoftware git is aangetroffen: <code>$1</code>',
+       'config-git-bad' => 'Geen git versiecontrolesoftware aangetroffen.',
        'config-imagemagick' => 'ImageMagick aangetroffen: <code>$1</code>.
 Het aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als u uploaden inschakelt.',
        'config-gd' => 'Ingebouwde GD grafische bibliotheek aangetroffen.
@@ -14272,7 +14314,6 @@ Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki ondersteunt de volgende databasesystemen:
 
 $1
@@ -14282,16 +14323,14 @@ Als u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg
        'config-support-postgres' => '* $1 is een populair open source databasesysteem als alternatief voor MySQL ([http://www.php.net/manual/en/pgsql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor PostgreSQL]). Het is mogelijk dat er een aantal bekende problemen zijn met MediaWiki in combinatie met deze database en daarom wordt PostgreSQL niet aanbevolen voor een productieomgeving.',
        'config-support-sqlite' => '* $1 is een zeer goed ondersteund lichtgewicht databasesysteem ([http://www.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd zijn met ondersteuning voor SQLite]; gebruikt PDO)',
        'config-support-oracle' => '* $1 is een commerciële data voor grote bedrijven ([http://www.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).',
-       'config-support-ibm_db2' => '* $1 is een commerciële enterprisedatabase. ([http://www.php.net/manual/en/ibm-db2.installation.php Hoe PHP compolieren met ondersteuning voor IBM DB2])',
        'config-header-mysql' => 'MySQL-instellingen',
        'config-header-postgres' => 'PostgreSQL-instellingen',
        'config-header-sqlite' => 'SQLite-instellingen',
        'config-header-oracle' => 'Oracle-instellingen',
-       'config-header-ibm_db2' => 'Instellingen voor IBM DB2',
        'config-invalid-db-type' => 'Ongeldig databasetype',
-       'config-missing-db-name' => 'U moet een waarde ingeven voor "Databasenaam"',
+       'config-missing-db-name' => 'U moet een waarde opgeven voor "Databasenaam"',
        'config-missing-db-host' => 'U moet een waarde invoeren voor "Databaseserver"',
-       'config-missing-db-server-oracle' => 'U moet een waarde voor "Database-TNS" ingeven',
+       'config-missing-db-server-oracle' => 'U moet een waarde opgeven voor "Database-TNS"',
        'config-invalid-db-server-oracle' => 'Ongeldige database-TMS "$1".
 Gebruik alleen letters (a-z, A-Z), cijfers (0-9) en liggende streepjes (_).',
        'config-invalid-db-name' => 'Ongeldige databasenaam "$1".
@@ -14351,7 +14390,7 @@ Dit is '''niet aan te raden''' tenzij u problemen hebt met uw wiki.",
        'config-upgrade-done-no-regenerate' => 'Het bijwerken is afgerond.
 
 U kunt nu [$1 uw wiki gebruiken].',
-       'config-regenerate' => '<code>LocalSettings.php</code> opnieuw aanmaken →',
+       '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',
@@ -14370,6 +14409,12 @@ De gebruiker die u hier opgeeft moet al bestaan.',
 
 Als uw installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.
 Als uw installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
+       'config-mysql-only-myisam-dep' => "'''Waarschuwing:''' MyISAM is enige beschikbare opslagmethode voor MySQL, en deze wordt niet aangeraden voor gebruik met MediaWiki, omdat:
+* er nauwelijks ondersteuning is voor meerdere gelijktijdige transacties omdat tabellen op slot gezet worden;
+* tabellen makkelijker stuk kunnen gaan;
+* de code van MediaWiki niet altijd op de juiste wijze omgaat met MyISAM.
+
+Uw installatie van MySQL heeft geen ondersteuning voor InnoDB. We raden u aan om een meer recente versie te gebruiken.",
        'config-mysql-engine-help' => "'''InnoDB''' is vrijwel altijd de beste instelling, omdat deze goed omgaat met meerdere verzoeken tegelijkertijd.
 
 '''MyISAM''' is bij een zeer beperkt aantal gebruikers mogelijk sneller, of als de wiki alleen-lezen is.
@@ -14382,7 +14427,6 @@ Dit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledig
 
 In '''UTF-8-modus''' kent MySQL de tekenset van uw gegevens en kan de databaseserver ze juist weergeven en converteren.
 Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
-       'config-ibm_db2-low-db-pagesize' => "Uw DB2-database heeft een standaard tablespace met een onvoldoende grote pagesize. De pagesize moet tenminste '''32K''' zijn.",
        'config-site-name' => 'Naam van de wiki:',
        'config-site-name-help' => 'Deze naam verschijnt in de titelbalk van browsers en op andere plaatsen.',
        'config-site-name-blank' => 'Geef een naam op voor de site.',
@@ -14392,11 +14436,11 @@ Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Li
        'config-ns-other' => 'Andere (geef aan welke)',
        'config-ns-other-default' => 'MijnWiki',
        'config-project-namespace-help' => "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".
-Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat u hier kunt aangeven.
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat u hier kunt opgeven.
 Dit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
-       'config-ns-invalid' => 'De aangegeven naamruimte "<nowiki>$1</nowiki>" is ongeldig.
+       'config-ns-invalid' => 'De opgegeven naamruimte "<nowiki>$1</nowiki>" is ongeldig.
 Geef een andere naamruimte op.',
-       'config-ns-conflict' => 'De aangegeven naamruimte "<nowiki>$1</nowiki>" conflicteert met een standaard naamruimte in MediaWiki.
+       'config-ns-conflict' => 'De opgegeven naamruimte "<nowiki>$1</nowiki>" conflicteert met een standaard naamruimte in MediaWiki.
 Geef een andere naam op voor de projectnaamruimte.',
        'config-admin-box' => 'Beheerdersgebruiker',
        'config-admin-name' => 'Uw naam:',
@@ -14492,6 +14536,8 @@ Idealiter is deze map niet via het web te benaderen.',
        'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.
 Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
 
+U kunt <code>$wgStylePath</code> of <code>$wgScriptPath</code> gebruiken als uw logo relatief is aan een van deze paden.
+
 Als u geen logo wilt gebruiken, kunt u dit veld leeg laten.',
        'config-instantcommons' => 'Instant Commons inschakelen',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is functie die het mogelijk maakt om afbeeldingen, geluidsbestanden en andere mediabestanden te gebruiken van de website [//commons.wikimedia.org/ Wikimedia Commons].
@@ -14501,7 +14547,7 @@ Meer informatie over deze functie en hoe deze in te stellen voor andere wiki\'s
        'config-cc-error' => 'De licentiekiezer van Creative Commons heeft geen resultaat opgeleverd.
 Voer de licentie handmatig in.',
        'config-cc-again' => 'Opnieuw kiezen...',
-       'config-cc-not-chosen' => 'Kies alstublieft de Creative Commonslicentie die u wilt gebruiken en klik op "doorgaan".',
+       'config-cc-not-chosen' => 'Kies de Creative Commonslicentie die u wilt gebruiken en klik op "doorgaan".',
        'config-advanced-settings' => 'Gevorderde instellingen',
        'config-cache-options' => 'Instellingen voor het cachen van objecten:',
        'config-cache-help' => 'Het cachen van objecten wordt gebruikt om de snelheid van MediaWiki te verbeteren door vaak gebruikte gegevens te bewaren.
@@ -14526,7 +14572,7 @@ De standaardpoort is 11211.',
 
 Mogelijk moet u aanvullende instellingen maken, maar u kunt deze uitbreidingen nu inschakelen.',
        'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof u MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
-Ga alstublieft door naar de volgende pagina.",
+Ga door naar de volgende pagina.",
        'config-install-begin' => 'Als u nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
 Als u nog wijzigingen wilt maken, klik dan op "{{int:config-back}}".',
        'config-install-step-done' => 'afgerond',
@@ -14588,6 +14634,8 @@ Na het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki betreden]
        'config-download-localsettings' => '<code>LocalSettings.php</code> downloaden',
        'config-help' => 'hulp',
        'config-nofile' => 'Het bestand "$1" is niet gevonden. Is het verwijderd?',
+       'config-extension-link' => 'Weet u dat u [//www.mediawiki.org/wiki/Manual:Extensions uitbreidingen] kunt gebruiken voor uw wiki?
+U kunt [//www.mediawiki.org/wiki/Category:Extensions_by_category uitbreidingen op categorie] bekijken of ga naar de [//www.mediawiki.org/wiki/Extension_Matrix Uitbreidingenmatrix] om de volledige lijst met uitbreidingen te bekijken.',
        'mainpagetext' => "'''De installatie van MediaWiki is geslaagd.'''",
        'mainpagedocfooter' => 'Raadpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handleiding] voor informatie over het gebruik van de wikisoftware.
 
@@ -14721,9 +14769,9 @@ Overweeg om de database op een totaal andere plaats neer te zetten, bijvoorbeeld
 $1
 
 Als je het databasesysteem dat je wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.',
-       'config-missing-db-name' => 'Je moet een waarde ingeven voor "Databasenaam"',
+       'config-missing-db-name' => 'Je moet een waarde opgeven voor "Databasenaam"',
        'config-missing-db-host' => 'Je moet een waarde invoeren voor "Databaseserver"',
-       'config-missing-db-server-oracle' => 'Je moet een waarde voor "Database-TNS" ingeven',
+       'config-missing-db-server-oracle' => 'Je moet een waarde opgeven voor "Database-TNS"',
        'config-postgres-old' => 'PostgreSQL $1 of hoger is vereist.
 Jij gebruikt $2.',
        'config-sqlite-name-help' => 'Kies een naam die je wiki identificeert.
@@ -14752,9 +14800,8 @@ Dit is efficiënter dan de UTF-8-modus van MySQL en stelt je in staat de volledi
 
 In '''UTF-8-modus''' kent MySQL de tekenset van je gegevens en kan de databaseserver ze juist weergeven en converteren.
 Het is dat niet mogelijk tekens op te slaan die de \"[//nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
-       'config-ibm_db2-low-db-pagesize' => "Je DB2-database heeft een standaard tablespace met een onvoldoende grote pagesize. De pagesize moet tenminste '''32K''' zijn.",
        'config-project-namespace-help' => "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".
-Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt aangeven.
+Alle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt opgeven.
 Dit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
        'config-admin-name' => 'Je naam:',
        'config-admin-password-mismatch' => 'De twee door jou ingevoerde wachtwoorden komen niet overeen.',
@@ -14798,8 +14845,8 @@ Daarmee wordt deze functie ingeschakeld.",
        'config-logo-help' => 'Het standaarduiterlijk van MediaWiki bevat ruimte voor een logo van 135x160 pixels boven het menu.
 Upload een afbeelding met de juiste afmetingen en voer de URL hier in.
 
-Als je geen logo wilt gebruiken, kan je dit veld leeg laten.',
-       'config-cc-not-chosen' => 'Kies alsjeblieft de Creative Commonslicentie die je wilt gebruiken en klik op "doorgaan".',
+Als je geen logo wilt gebruiken, kan je dit veld leeg laten.', # Fuzzy
+       'config-cc-not-chosen' => 'Kies de Creative Commonslicentie die je wilt gebruiken en klik op "doorgaan".',
        'config-memcache-needservers' => 'Je hebt Memcached geselecteerd als je cache, maar je hebt geen servers opgegeven.',
        'config-memcache-badip' => 'Je hebt een ongeldig IP-adres ingevoerd voor Memcached: $1.',
        'config-memcache-noport' => 'Je hebt geen poort opgegeven voor de Memcachedserver: $1.
@@ -14808,7 +14855,7 @@ De standaardpoort is 11211.',
 
 Mogelijk moet je aanvullende instellingen maken, maar je kunt deze uitbreidingen nu inschakelen.',
        'config-install-alreadydone' => "'''Waarschuwing:''' het lijkt alsof je MediaWiki al hebt geïnstalleerd en probeert het programma opnieuw te installeren.
-Ga alsjeblieft door naar de volgende pagina.",
+Ga door naar de volgende pagina.",
        'config-install-begin' => 'Als je nu op "{{int:config-continue}}" klikt, begint de installatie van MediaWiki.
 Als je nog wijzigingen wilt maken, klik dan op "Terug".', # Fuzzy
        'config-pg-no-plpgsql' => 'Je moet de taal PL/pgSQL installeren in de database $1',
@@ -14845,7 +14892,7 @@ Na het plaatsen van het bestand met instellingen kan je '''[$2 je wiki betreden]
 * [//www.mediawiki.org/wiki/Localisation#Translation_resources Maak MediaWiki beschikbaar in jouw taal]',
 );
 
-/** Norwegian Nynorsk (norsk (nynorsk)‎)
+/** Norwegian Nynorsk (norsk nynorsk)
  * @author Harald Khan
  * @author Nghtwlkr
  */
@@ -14892,7 +14939,7 @@ Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
 ==Kome i gang==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste over oppsettsinnstillingar]
 * [//www.mediawiki.org/wiki/Manual:FAQ Spørsmål og svar om MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]', # Fuzzy
 );
 
 /** Norwegian (bokmål)‬ (‪norsk (bokmål)‬) */
@@ -14910,10 +14957,10 @@ $messages['oc'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista dels paramètres de configuracion]
 * [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las parucions de MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las parucions de MediaWiki]", # Fuzzy
 );
 
-/** Oriya (à¬\93à­\9cିଆ)
+/** Oriya (à¬\93ଡ଼ିଆ)
  * @author Jnanaranjan Sahu
  */
 $messages['or'] = array(
@@ -14948,7 +14995,7 @@ $messages['pam'] = array(
 == Pamagumpisa ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Picard (Picard)
@@ -14972,12 +15019,13 @@ $messages['pdc'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lischt vun Gnepp zum Konfiguriere]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]", # Fuzzy
 );
 
 /** Polish (polski)
  * @author Beau
  * @author BeginaFelicysym
+ * @author Chrumps
  * @author Holek
  * @author Saper
  * @author Sp5uhe
@@ -15205,7 +15253,6 @@ Zawiera ona nieopracowane dane użytkownika (adresy e-mail, zahaszowane hasła)
 Warto rozważyć umieszczenie w bazie danych zupełnie gdzie indziej, na przykład w <code>/var/lib/mediawiki/yourwiki</code> .",
        'config-oracle-def-ts' => 'Domyślna przestrzeń tabel',
        'config-oracle-temp-ts' => 'Przestrzeń tabel tymczasowych',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki może współpracować z następującymi systemami baz danych:
 
 $1
@@ -15215,12 +15262,10 @@ Poniżej wyświetlone są systemy baz danych gotowe do użycia. Jeżeli poniżej
        'config-support-postgres' => '* $1 jest popularnym systemem baz danych, często stosowanym zamiast MySQL  ([http://www.php.net/manual/en/pgsql.installation.php Zobacz, jak skompilować PHP ze wsparciem dla PostgreSQL]). Z powodu możliwości wystąpienia drobnych błędów, nie jest zalecana do wymagających wdrożeń.',
        'config-support-sqlite' => '* $1 jest niewielkim systemem bazy danych, z którym MediaWiki bardzo dobrze współpracuje. ([http://www.php.net/manual/en/pdo.installation.php Jak skompilować PHP ze wsparciem dla SQLite], korzystając z PDO)',
        'config-support-oracle' => '* $1 jest komercyjną profesjonalną bazą danych. ([http://www.php.net/manual/en/oci8.installation.php Jak skompilować PHP ze wsparciem dla OCI8])',
-       'config-support-ibm_db2' => '* $1 jest komercyjną zaawansowaną bazą danych.', # Fuzzy
        'config-header-mysql' => 'Ustawienia MySQL',
        'config-header-postgres' => 'Ustawienia PostgreSQL',
        'config-header-sqlite' => 'Ustawienia SQLite',
        'config-header-oracle' => 'Ustawienia Oracle',
-       'config-header-ibm_db2' => 'ustawienia dla IBM DB2',
        'config-invalid-db-type' => 'Nieprawidłowy typ bazy danych',
        'config-missing-db-name' => 'Należy wpisać wartość w polu „Nazwa bazy danych”',
        'config-missing-db-host' => 'Musisz wpisać wartość w polu „Serwer bazy danych”',
@@ -15282,7 +15327,7 @@ Jest to '''nie zalecane''', chyba że występują problemy z twoją wiki.",
        'config-upgrade-done-no-regenerate' => 'Aktualizacja zakończona.
 
 Możesz wreszcie [$1 zacząć korzystać ze swojej wiki].',
-       'config-regenerate' => 'Ponowne generowanie <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Ponowne generowanie LocalSettings.php →',
        'config-show-table-status' => 'Zapytanie „<code>SHOW TABLE STATUS</code>” nie powiodło się!',
        'config-unknown-collation' => "'''Uwaga''' – bazy danych używa nierozpoznanej metody porównywania.",
        'config-db-web-account' => 'Konto bazy danych dla dostępu przez WWW',
@@ -15312,7 +15357,6 @@ Bazy danych MyISAM mają tendencję do ulegania uszkodzeniom częściej niż baz
 Jest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków pełnego zakresu Unicode.
 
 W '''trybie UTF-8''', MySQL będzie znać zestaw znaków w jakim zakodowano dane, można też przedstawić i przekonwertuj je odpowiednio, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
-       'config-ibm_db2-low-db-pagesize' => "Baza danych DB2 posiada domyślny obszar tabel z niewystarczającym rozmiarem strony. Wartość rozmiaru strony musi być równa lub powyżej  '''32 K'''.",
        'config-site-name' => 'Nazwa wiki',
        'config-site-name-help' => 'Ten napis pojawi się w pasku tytułowym przeglądarki oraz w różnych innych miejscach.',
        'config-site-name-blank' => 'Wprowadź nazwę witryny.',
@@ -15355,7 +15399,7 @@ Możesz pominąć pozostałe czynności konfiguracyjne i zainstalować wiki.',
        'config-optional-continue' => 'Zadaj mi więcej pytań.',
        'config-optional-skip' => 'Jestem już znudzony, po prostu zainstaluj wiki.',
        'config-profile' => 'Profil uprawnień użytkowników',
-       'config-profile-wiki' => 'Tradycyjne wiki', # Fuzzy
+       'config-profile-wiki' => 'Otwarte wiki',
        'config-profile-no-anon' => 'Wymagane utworzenie konta',
        'config-profile-fishbowl' => 'Wyłącznie zatwierdzeni edytorzy',
        'config-profile-private' => 'Prywatna wiki',
@@ -15421,7 +15465,7 @@ Najlepiej, aby nie był on dostępny z internetu.',
        'config-logo-help' => 'Domyślny motyw MediaWiki zawiera miejsce na logo wielkości 135 x 160 pikseli powyżej menu na pasku bocznym.
 Prześlij obrazek o odpowiednim rozmiarze, a następnie wpisz jego URL tutaj.
 
-Jeśli nie chcesz logo, pozostaw to pole puste.',
+Jeśli nie chcesz logo, pozostaw to pole puste.', # Fuzzy
        'config-instantcommons' => 'Włącz Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] jest funkcją, która pozwala wiki używać obrazów, dźwięków i innych mediów znalezionych na  witrynie [//commons.wikimedia.org/ Wikimedia Commons].
 Aby to zrobić, MediaWiki wymaga dostępu do internetu.
@@ -15749,7 +15793,6 @@ Lòn a comprend ij dat brut ëd l'utent (adrëssa ëd pòsta eletrònica, ciav t
 Ch'a consìdera ëd buté la base ëd dàit tuta antrega da n'àutra part, për esempi an <code>/var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts' => 'Spassi dla tàula dë stàndard:',
        'config-oracle-temp-ts' => 'Spassi dla tàula temporani:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => "MediaWiki a manten ij sistema ëd base ëd dàit sì-dapress:
 
 $1
@@ -15759,12 +15802,10 @@ S'a vëd pa listà sì-sota ël sistema ëd base ëd dàit ch'a preuva a dovré,
        'config-support-postgres' => "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL]). A peulo ess-ie chèich cit bigat, e a l'é nen arcomandà ëd dovrelo an n'ambient ëd produssion.",
        'config-support-sqlite' => "* $1 e l'é un sistema ëd base ëd dàit leger che a l'é motobin bin mantnù ([http://www.php.net/manual/en/pdo.installation.php com compilé PHP con ël manteniment ëd SQLite], a deuvra PDO)",
        'config-support-oracle' => "* $1 a l'é na base ëd dàit comersial për j'amprèise. ([http://www.php.net/manual/en/oci8.installation.php Com compilé PHP con ël manteniment OCI8])",
-       'config-support-ibm_db2' => "* $1 a l'é na base ëd dàit d'asiendal comersial.", # Fuzzy
        'config-header-mysql' => 'Ampostassion MySQL',
        'config-header-postgres' => 'Ampostassion PostgreSQL',
        'config-header-sqlite' => 'Ampostassion SQLite',
        'config-header-oracle' => 'Ampostassion Oracle',
-       'config-header-ibm_db2' => "Ampostassion d'IBM DB2",
        'config-invalid-db-type' => 'Sòrt ëd ëd base ëd dàit pa bon-a',
        'config-missing-db-name' => 'A dev buteje un valor për "Nòm ëd la base ëd dàit"',
        'config-missing-db-host' => 'A dev buteje un valor për "l\'òspit ëd la base ëd dàit"',
@@ -15824,7 +15865,7 @@ Sòn a l'è '''pa arcomandà''' gavà ch'a rancontra dij problema con soa wiki."
        'config-upgrade-done-no-regenerate' => 'Agiornament complet.
 
 It peule adess [$1 ancaminé a dovré toa wiki].',
-       'config-regenerate' => 'Generé torna <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Generé torna LocalSettings.php →',
        'config-show-table-status' => 'Arcesta <code>SHOW TABLE STATUS</code> falìa!',
        'config-unknown-collation' => "'''Avis:''' La base ëd dàit a deuvra na classificassion pa arconossùa.",
        'config-db-web-account' => "Cont dla base ëd dàit për l'acess a l'aragnà",
@@ -15854,7 +15895,6 @@ La base ëd dàit MyISAM a tira a corompse pi 'd soens che la base ëd dàit Inn
 Sòn a l'é pi eficient che la manera UTF-8 ëd MySQL, e a-j përmët ëd dovré l'ansema antregh ëd caràter Unicode.
 
 An '''manera UTF-8''', MySQL a conossrà an che ansem ëd caràter a son ij sò dat, e a peul presenteje e convertije apropriatament, ma a-j lassa pa memorisé ij caràter ëdzora al [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes pian multilenghìstich ëd base].",
-       'config-ibm_db2-low-db-pagesize' => "Soa base ëd dàit DB2 a l'ha në spassi d'ambaronament predefinì con na dimension ëd pàgina insuficent. La dimension ëd pàgina a dev esse '''32K''' o pi gròssa.",
        'config-site-name' => 'Nòm ëd la wiki:',
        'config-site-name-help' => "Sòn a comparirà ant la bara dël tìtol dël navigador e an vàire d'àutri pòst.",
        'config-site-name-blank' => "Ch'a buta un nòm ëd sit.",
@@ -15897,18 +15937,18 @@ A peul adess sauté la configurassion rimanenta e instalé dlongh la wiki.",
        'config-optional-continue' => "Ciameme d'àutre chestion.",
        'config-optional-skip' => 'I son già anojà, instala mach la wiki.',
        'config-profile' => "Profil dij drit d'utent:",
-       'config-profile-wiki' => 'Deurb wiki',
+       'config-profile-wiki' => 'Wiki duverta',
        'config-profile-no-anon' => 'A venta creé un cont',
        'config-profile-fishbowl' => 'Mach editor autorisà',
        'config-profile-private' => 'Wiki privà',
        'config-profile-help' => "Le wiki a marcio mej quand ch'a lassa che pì përsone possìbij a-j modìfico.
-An MediaWiki, a l'é bel fé revisioné ij cambi recent, e buté andré minca dann che a sia fàit da utent noviss o malissios.
+An MediaWiki, a l'é bel fé revisioné j'ùltime modìfiche, e buté andré qualsëssìa dann che a sia fàit da dj'utent noviss o malissios.
 
 An tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.
 Parèj a l'ha doe possibilità.
 
 Ël model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.
-Na wiki con  '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contribudor casuaj.
+Na wiki con  '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contributor ocasionaj.
 
 Ël senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.
 Un '''{{int:config-profile-private}}''' a përmët mach a j'utent aprovà ëd vëdde le pàgine, con la midema partìa ch'a peul modifiché.
@@ -15963,7 +16003,7 @@ Idealment, sòn a dovrìa pa esse acessìbil an sl'aragnà.",
        'config-logo-help' => "La pel dë stàndard ëd MediaWiki a comprend lë spassi për na marca ëd 135x160 pontin dzora la lista dla bara lateral.
 Ch'a dëscaria na figura ëd la dimension aproprià, e ch'a anserissa l'anliura ambelessì.
 
-S'a veul gnun-e marche, ch'a lassa ës camp bianch.",
+S'a veul gnun-e marche, ch'a lassa ës camp bianch.", # Fuzzy
        'config-instantcommons' => 'Abìlita Instant Commons',
        'config-instantcommons-help' => "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] a l'é na funsion ch'a përmët a le wiki ëd dovré dle figure, dij son e d'àutri mojen trovà an sël sit [//commons.wikimedia.org/ Wikimedia Commons].
 Për dovré sossì, MediaWiki a l'ha da manca dl'acess a la ragnà.
@@ -15996,8 +16036,8 @@ S'a conòsse nen la pòrta, cola predefinìa a l'é 11211.",
 A peulo avèj da manca ëd configurassion adissionaj, ma a peul abiliteje adess",
        'config-install-alreadydone' => "'''Avis''' A smija ch'a l'abie già instalà MediaWiki e ch'a preuva a instalelo torna.
 Për piasì, ch'a vada a la pàgina ch'a-i ven.",
-       'config-install-begin' => 'An sgnacand "{{int:config-continue}}", a anandiërà l\'istalassion ëd MediaWiki.
-S\'a veul anco\' fé dle modìfiche, ch\'a sgnaca su "{{int:config-back}}".',
+       'config-install-begin' => "An sgnacand su «{{int:config-continue}}», a anandiërà l'istalassion ëd MediaWiki.
+S'a veul anco' fé dle modìfiche, ch'a sgnaca su «{{int:config-back}}».",
        'config-install-step-done' => 'fàit',
        'config-install-step-failed' => 'falì',
        'config-install-extensions' => "Comprende j'estension",
@@ -16083,7 +16123,7 @@ $messages['prg'] = array(
 == En pagaūseņu ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
 );
 
 /** Pashto (پښتو)
@@ -16110,7 +16150,6 @@ $messages['ps'] = array(
        'config-header-postgres' => 'د PostgreSQL امستنې',
        'config-header-sqlite' => 'د SQLite امستنې',
        'config-header-oracle' => 'د اورېکل امستنې',
-       'config-header-ibm_db2' => 'د IBM DB2 امستنې',
        'config-sqlite-readonly' => 'د <code>$1</code> دوتنه د ليکلو وړ نه ده.',
        'config-sqlite-cant-create-db' => 'د توکبنسټ دوتنه <code>$1</code> جوړه نه شوه.',
        'config-site-name' => 'د ويکي نوم:',
@@ -16122,7 +16161,7 @@ $messages['ps'] = array(
        'config-admin-password' => 'پټنوم:',
        'config-admin-password-confirm' => 'پټنوم يو ځل بيا:',
        'config-admin-email' => 'برېښليک پته:',
-       'config-profile-wiki' => 'دوديزه ويکي', # Fuzzy
+       'config-profile-wiki' => 'پرانيستې ويکي',
        'config-license-pd' => 'ټولګړی شپول',
        'config-email-settings' => 'د برېښليک امستنې',
        'config-install-step-done' => 'ترسره شو',
@@ -16141,6 +16180,7 @@ $messages['ps'] = array(
 /** Portuguese (português)
  * @author Crazymadlover
  * @author Hamilton Abreu
+ * @author Luckas
  * @author Mormegil
  * @author Platonides
  * @author SandroHc
@@ -16371,7 +16411,6 @@ Considere colocar a base de dados num local completamente diferente, como, por e
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'O MediaWiki suporta as seguintes plataformas de base de dados:
 
 $1
@@ -16381,12 +16420,10 @@ Se a plataforma que pretende usar não está listada abaixo, siga as instruçõe
        'config-support-postgres' => '* $1 é uma plataforma de base de dados comum, de fonte aberta, alternativa ao MySQL ([http://www.php.net/manual/en/pgsql.installation.php como compilar PHP com suporte PostgreSQL]). Poderão existir alguns pequenos problemas e não é recomendado o seu uso em ambientes de exploração/produção.',
        'config-support-sqlite' => '* $1 é uma plataforma de base de dados ligeira muito bem suportada. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP com suporte SQLite], usa PDO)',
        'config-support-oracle' => '* $1 é uma base de dados de uma empresa comercial. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])',
-       'config-support-ibm_db2' => '* $1 é uma base de dados empresarial.', # Fuzzy
        'config-header-mysql' => 'Definições MySQL',
        'config-header-postgres' => 'Definições PostgreSQL',
        'config-header-sqlite' => 'Definições SQLite',
        'config-header-oracle' => 'Definições Oracle',
-       'config-header-ibm_db2' => 'Configurações da IBM DB2',
        'config-invalid-db-type' => 'O tipo de base de dados é inválido',
        'config-missing-db-name' => 'Tem de introduzir um valor para "Nome da base de dados"',
        'config-missing-db-host' => 'Tem de introduzir um valor para "Servidor da base de dados"',
@@ -16448,7 +16485,7 @@ Esta operação '''não é recomendada''' a menos que esteja a ter problemas com
        'config-upgrade-done-no-regenerate' => 'Actualização terminada.
 
 Agora pode [$1 começar a usar a sua wiki].',
-       'config-regenerate' => 'Regenerar o <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerar o LocalSettings.php →',
        'config-show-table-status' => 'A consulta <code>SHOW TABLE STATUS</code> falhou!',
        'config-unknown-collation' => "'''Aviso:''' A base de dados está a utilizar uma colação ''(collation)'' desconhecida.",
        'config-db-web-account' => 'Conta na base de dados para acesso pela internet',
@@ -16479,12 +16516,11 @@ Isto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados t
 
 No modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,
 mas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
-       'config-ibm_db2-low-db-pagesize' => "A sua base de dados DB2 tem um tablespace padrão com um pagesize insuficiente. O pagesize tem de ser '''32K'' ou maior.",
        'config-site-name' => 'Nome da wiki:',
        'config-site-name-help' => 'Este nome aparecerá no título da janela do seu browser e em vários outros sítios.',
        'config-site-name-blank' => 'Introduza o nome do site.',
        'config-project-namespace' => 'Espaço nominal do projecto:',
-       'config-ns-generic' => 'Projecto',
+       'config-ns-generic' => 'Projeto',
        'config-ns-site-name' => 'O mesmo que o nome da wiki: $1',
        'config-ns-other' => 'Outro (especifique)',
        'config-ns-other-default' => 'AMinhaWiki',
@@ -16589,7 +16625,7 @@ O ideal é que este directório não possa ser directamente acedido a partir da
        'config-logo-help' => 'O tema padrão do MediaWiki inclui espaço para um logótipo de 135x160 pixels acima do menu da barra lateral.
 Coloque na wiki uma imagem com estas dimensões e introduza aqui a URL dessa imagem.
 
-Se não pretende usar um logótipo, deixe este campo em branco.',
+Se não pretende usar um logótipo, deixe este campo em branco.', # Fuzzy
        'config-instantcommons' => 'Activar a funcionalidade Instant Commons',
        'config-instantcommons-help' => 'O [//www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no site [//commons.wikimedia.org/ Wikimedia Commons].
 Para poder usá-los, o MediaWiki necessita de acesso à internet.
@@ -16695,6 +16731,7 @@ Depois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
 /** Brazilian Portuguese (português do Brasil)
  * @author Giro720
  * @author Gustavo
+ * @author Luckas
  * @author Marcionunes
  * @author 555
  */
@@ -16740,6 +16777,7 @@ Verifique o seu php.ini e certifique-se de que em <code>session.save_path</code>
        'config-page-releasenotes' => 'Notas de lançamento',
        'config-page-copying' => 'Copiando',
        'config-page-upgradedoc' => 'Atualizando',
+       'config-page-existingwiki' => 'Wiki existente',
        'config-help-restart' => 'Deseja limpar todos os dados salvos que você introduziu e reiniciar o processo de instalação?',
        'config-restart' => 'Sim, reiniciar',
        'config-welcome' => '=== Verificações do ambiente ===
@@ -16773,10 +16811,24 @@ Se o seu site tem um alto volume de tráfego, devia informar-se um pouco sobre a
        'config-register-globals' => "' ' 'Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''
 ' ' 'Desative-a, se puder.'''
 O MediaWiki funcionará mesmo assim, mas o seu servidor ficará exposto a potenciais vulnerabilidades de segurança.",
+       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binário',
+       'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+       'config-mysql-innodb' => 'InnoDB',
+       'config-mysql-myisam' => 'MyISAM',
+       'config-mysql-binary' => 'Binário',
+       'config-mysql-utf8' => 'UTF-8',
+       'config-ns-generic' => 'Projeto',
+       'config-admin-box' => 'Conta de administrador',
+       'config-admin-name' => 'Seu nome:',
+       'config-admin-password' => 'Senha:',
+       'config-license-pd' => 'Domínio público',
        'config-logo-help' => 'O tema padrão do MediaWiki inclui espaço para um logotipo de 135x160 pixels no canto superior esquerdo.
 Faça o upload de uma imagem com estas dimensões e introduza aqui a URL dessa imagem.
 
 Se você não pretende usar um logotipo, deixe este campo em branco.', # Fuzzy
+       'config-advanced-settings' => 'Configuração avançada',
+       'config-extensions' => 'Extensões',
+       'config-help' => 'ajuda',
        'mainpagetext' => "'''MediaWiki instalado com sucesso.'''",
        'mainpagedocfooter' => 'Consulte o [//meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.
 
@@ -16829,7 +16881,7 @@ $messages['rm'] = array(
 == Cumenzar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Glista da las opziuns per la configuraziun]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]", # Fuzzy
 );
 
 /** Romanian (română)
@@ -16886,12 +16938,10 @@ Totuși, MediaWiki necesită PHP $2 sau mai nou.',
        '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-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'Setările MySQL',
        'config-header-postgres' => 'Setări PostgreSQL',
        'config-header-sqlite' => 'Setări SQLite',
        'config-header-oracle' => 'Setări Oracle',
-       'config-header-ibm_db2' => 'Setări IBM DB2',
        'config-invalid-db-type' => 'Tip de bază de date incorect',
        'config-missing-db-name' => 'Trebuie să introduci o valoare pentru „Numele bazei de date”',
        'config-connection-error' => '$1.
@@ -16900,7 +16950,7 @@ Verificați gazda, numele de utilizator și parola și reîncercați.',
        'config-upgrade-done-no-regenerate' => 'Actualizare completă.
 
 Acum puteți [$1 începe să vă folosiți wikiul].',
-       'config-regenerate' => 'Regenerare <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Regenerare LocalSettings.php →',
        'config-unknown-collation' => 'AVERTISMENT: Baza de date folosește o colaționare nerecunoscută.',
        'config-db-web-account' => 'Contul bazei de date pentru accesul web.',
        'config-db-web-create' => 'Creați contul dacă nu există deja',
@@ -16986,8 +17036,29 @@ $messages['roa-tara'] = array(
        'config-title' => 'Installazzione de MediaUicchi $1',
        'config-information' => "'Mbormaziune",
        'config-localsettings-key' => 'Chiave de aggiornamende:',
+       'config-localsettings-badkey' => "'A chiave ca è date non g'è corrette.",
+       'config-session-error' => "Errore facenne accumenzà 'a sessione: $1",
+       'config-your-language' => "'A lènga toje:",
+       'config-your-language-help' => "Scacchie 'na lènghe da ausà duranne 'u processe de installazzione:",
+       'config-wiki-language' => 'Lènga de Uicchi:',
+       'config-back' => '← Rrète',
+       'config-continue' => 'Condinue →',
        'config-page-language' => 'Lènghe',
+       'config-page-welcome' => "Bovègne jndr'à MediaUicchi!",
+       'config-page-dbconnect' => "Collegate a 'u database",
+       'config-page-upgrade' => "Aggiorne l'installazzione esistende",
+       'config-page-dbsettings' => "'Mbostaziune d'u database",
        'config-page-name' => 'Nome',
+       'config-page-options' => 'Opziune',
+       'config-page-install' => 'Installe',
+       'config-page-complete' => 'Combletate!',
+       'config-page-restart' => "Riavvie l'installazzione",
+       'config-page-readme' => 'Liggeme',
+       'config-page-releasenotes' => 'Note de rilasce',
+       'config-page-copying' => 'Stoche a copie',
+       'config-page-upgradedoc' => 'Aggiornamende',
+       'config-page-existingwiki' => 'Uicchi esistende',
+       'config-db-type' => 'Tipe de database:',
        'config-db-charset' => "'Nzieme de carattere d'u database",
        'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
@@ -16998,6 +17069,8 @@ $messages['roa-tara'] = array(
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
+       'config-mysql-innodb' => 'InnoDB',
+       'config-mysql-myisam' => 'MyISAM',
        'config-admin-email' => 'Indirizze e-mail:',
        'config-install-step-done' => 'fatte',
        'config-install-step-failed' => 'fallite',
@@ -17255,7 +17328,6 @@ MediaWiki требует поддержки UTF-8 для корректной р
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki поддерживает следующие СУБД:
 
 $1
        'config-support-postgres' => '* $1 — популярная открытая СУБД, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php инструкция, как собрать PHP с поддержкой PostgreSQL]). Могут встречаться небольшие неисправленные ошибки, не рекомендуется для использования в рабочей системе.',
        'config-support-sqlite' => '* $1 — это легковесная система баз данных, имеющая очень хорошую поддержку. ([http://www.php.net/manual/en/pdo.installation.php инструкция, как собрать PHP с поддержкой SQLite], работающей посредством PDO)',
        'config-support-oracle' => '* $1 — это коммерческая база данных масштаба предприятия. ([http://www.php.net/manual/en/oci8.installation.php Как собрать PHP с поддержкой OCI8])',
-       'config-support-ibm_db2' => '$1 — коммерческая база данных масштаба предприятия.', # Fuzzy
        'config-header-mysql' => 'Настройки MySQL',
        'config-header-postgres' => 'Настройки PostgreSQL',
        'config-header-sqlite' => 'Настройки SQLite',
        'config-header-oracle' => 'Настройки Oracle',
-       'config-header-ibm_db2' => 'Настройки IBM DB2',
        'config-invalid-db-type' => 'Неверный тип базы данных',
        'config-missing-db-name' => 'Вы должны ввести значение параметра «Имя базы данных»',
        'config-missing-db-host' => 'Необходимо ввести значение параметра «Сервер базы данных»',
@@ -17332,7 +17402,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Обновление завершено.
 
 Теперь вы можете [$1 начать работу с вики].',
-       'config-regenerate' => 'Создать <code>LocalSettings.php</code> заново →',
+       'config-regenerate' => 'Создать LocalSettings.php заново →',
        'config-show-table-status' => 'Запрос «<code>SHOW TABLE STATUS</code>» не выполнен!',
        'config-unknown-collation' => "'''Внимание:''' База данных использует нераспознанные правила сортировки.",
        'config-db-web-account' => 'Учётная запись для доступа к базе данных из веб-сервера',
@@ -17361,7 +17431,6 @@ chmod a+w $3</pre>',
 Это более эффективно, чем ''UTF-8 режим'' MySQL, и позволяет использовать полный набор символов Unicode.
 
 В '''режиме UTF-8''' MySQL будет знать в какой кодировке находятся Ваши данные и может отображать и преобразовывать их соответствующим образом, но это не позволит вам хранить символы выше [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базовой Многоязыковой Плоскости].",
-       'config-ibm_db2-low-db-pagesize' => "В вашей базе данных DB2 по умолчанию задано табличное пространство с недостаточным размером страницы. Размер страницы должен быть не менее '''32K'''.",
        'config-site-name' => 'Название вики:',
        'config-site-name-help' => 'Название будет отображаться в заголовке окна браузера и в некоторых других местах вики.',
        'config-site-name-blank' => 'Введите название сайта.',
@@ -17468,7 +17537,7 @@ GFDL может быть использована, но она сложна дл
        'config-logo-help' => 'Стандартная тема оформления MediaWiki содержит над боковой панелью пространство для логотипа размером 135x160 пикселей.
 Загрузите изображение соответствующего размера, и введите его URL здесь.
 
-Если вам не нужен логотип, оставьте это поле пустым.',
+Если вам не нужен логотип, оставьте это поле пустым.', # Fuzzy
        'config-instantcommons' => 'Включить Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] — это функция, позволяющая использовать изображения, звуки и другие медиафайлы с Викисклада ([//commons.wikimedia.org/ Wikimedia Commons]).
 Для работы этой функции MediaWiki необходим доступ к Интернету.
@@ -17582,7 +17651,7 @@ $messages['rue'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Наставлїня конфіґурації]
 * [//www.mediawiki.org/wiki/Manual:FAQ Часты вопросы о MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розосыланя повідомлїнь про новы верзії MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розосыланя повідомлїнь про новы верзії MediaWiki]', # Fuzzy
 );
 
 /** Sanskrit (संस्कृतम्)
@@ -17602,7 +17671,7 @@ $messages['sah'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Конфигурация уларытыытын параметрдара]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай испииһэгэ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай испииһэгэ]', # Fuzzy
 );
 
 /** Sardinian (sardu)
@@ -17621,7 +17690,7 @@ $messages['scn'] = array(
 == P'accuminzari ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Alencu di mpustazzioni di cunfigurazzioni]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]", # Fuzzy
 );
 
 /** Scots (Scots)
@@ -17634,7 +17703,7 @@ $messages['sco'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settins leet]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki releese mailin leet]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki releese mailin leet]", # Fuzzy
 );
 
 /** Sassaresu (Sassaresu)
@@ -17648,7 +17717,7 @@ Li sighenti cullegamenti so in linga ingrese:
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Impusthazioni di cunfigurazioni]
 * [//www.mediawiki.org/wiki/Manual:FAQ Prigonti friquenti i MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]", # Fuzzy
 );
 
 /** Cmique Itom (Cmique Itom)
@@ -17667,7 +17736,7 @@ $messages['sh'] = array(
 == Početak ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista postavki]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki najčešće postavljana pitanja]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]', # Fuzzy
 );
 
 /** Tachelhit (Tašlḥiyt/ⵜⴰⵛⵍⵃⵉⵜ)
@@ -17680,7 +17749,7 @@ $messages['shi'] = array(
 == Izwir d MediaWiki ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Umuɣ n iɣwwarn n usgadda ]
 * [//www.mediawiki.org/wiki/Manual:FAQ/fr Isqqsitn f MidyWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Umuɣ n imsgdaln f imbḍitn n MidyaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Umuɣ n imsgdaln f imbḍitn n MidyaWiki]', # Fuzzy
 );
 
 /** Sinhala (සිංහල)
@@ -17734,17 +17803,15 @@ $messages['si'] = array(
        'config-sqlite-dir' => 'SQLite දත්ත නාමවලිය:',
        'config-oracle-def-ts' => 'සාමාන්‍ය වගු අවකාශය:',
        'config-oracle-temp-ts' => 'තාවකාලික වගු අවකාශය:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-header-mysql' => 'MySQL සැකසුම්',
        'config-header-postgres' => 'PostgreSQL සැකසුම්',
        'config-header-sqlite' => 'SQLite සැකසුම්',
        'config-header-oracle' => 'ඔරකල් සැකසුම්',
-       'config-header-ibm_db2' => 'IBM DB2 සැකසුම්',
        'config-invalid-db-type' => 'වලංගු නොවන දත්ත සංචිත වර්ගය',
        'config-missing-db-name' => '"දත්ත සංචිත නාමය" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ',
        'config-missing-db-host' => '"දත්ත සංචිත ධාරකය" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ',
        'config-missing-db-server-oracle' => '"දත්ත සංචිත TNS" සඳහා ඔබ විසින් අගයක් දිය යුතු වේ',
-       'config-regenerate' => 'නැවත ජනිත කරන්න <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'නැවත ජනිත කරන්න LocalSettings.php →',
        'config-db-web-account' => 'ජාල ප්‍රවේශනය සඳහා දත්ත සංචිත ගිණුම',
        'config-mysql-engine' => 'ආචයන එන්ජිම:',
        'config-mysql-innodb' => 'InnoDB',
@@ -17942,7 +18009,6 @@ Vendar pa MediaWiki zahteva PHP $2 ali višji.',
        'config-db-schema-help' => 'Ta shema je po navadi v redu.
 Spremenite jo samo, če veste, da jo morate.',
        'config-sqlite-dir' => 'Mapa podatkov SQLite:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki podpira naslednje sisteme zbirk podatkov:
 
 $1
@@ -17952,7 +18018,6 @@ $1
        'config-header-postgres' => 'Nastavitve PostgreSQL',
        'config-header-sqlite' => 'Nastavitve SQLite',
        'config-header-oracle' => 'Nastavitve Oracle',
-       'config-header-ibm_db2' => 'Nastavitve IBM DB2',
        'config-invalid-db-type' => 'Neveljavna vrsta zbirke podatkov',
        'config-missing-db-name' => 'Vnesti morate vrednost za »Ime zbirke podatkov«',
        'config-missing-db-host' => 'Vnesti morate vrednost za »Gostitelj zbirke podatkov«',
@@ -17975,7 +18040,7 @@ Preverite mapo podatkov in ime zbirke podatkov spodaj ter poskusite znova.',
        'config-upgrade-done-no-regenerate' => 'Nadgradnja je končana.
 
 Sedaj lahko [$1 začnete uporabljati vaš wiki].',
-       'config-regenerate' => 'Ponovno ustvari <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Ponovno ustvari LocalSettings.php →',
        'config-show-table-status' => 'Poizvedba <code>SHOW TABLE STATUS</code> ni uspela!',
        'config-unknown-collation' => "'''Opozorilo:''' Zbirke podatkov uporablja neprepoznano razvrščanje znakov.",
        'config-db-web-account' => 'Račun zbirke podatkov za spletni dostop',
@@ -18017,7 +18082,7 @@ Določite drugo uporabniško ime.',
        'config-admin-error-bademail' => 'Vnesli ste neveljaven e-poštni naslov.',
        'config-subscribe' => 'Naročite se na [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce poštni seznam obvestil o izdajah].',
        'config-almost-done' => 'Skoraj ste že končali!
-Sedaj lahko preskočite preostalo konfiguriranje in zdaj namestite wiki.',
+Preostalo konfiguriranje lahko zdaj preskočite in wiki takoj namestite.',
        'config-optional-continue' => 'Zastavi mi več vprašanj.',
        'config-optional-skip' => 'Se že dolgočasim; samo namesti wiki.',
        'config-profile' => 'Profil uporabniških pravic:',
@@ -18078,7 +18143,7 @@ $messages['sli'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]', # Fuzzy
 );
 
 /** Somali (Soomaaliga)
@@ -18090,7 +18155,7 @@ $messages['so'] = array(
 == Bilaaw ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Albanian (shqip)
@@ -18102,7 +18167,7 @@ $messages['sq'] = array(
 == Sa për fillim==
 * [//www.mediawiki.org/wiki/Help:Configuration_settings Parazgjedhjet e MediaWiki-t]
 * [//www.mediawiki.org/wiki/Help:FAQ Pyetjet e shpeshta rreth MediaWiki-t]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]', # Fuzzy
 );
 
 /** Serbian (Cyrillic script) (српски (ћирилица)‎)
@@ -18148,7 +18213,7 @@ $messages['sr-ec'] = array(
 == Увод ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Помоћ у вези са подешавањима]
 * [//www.mediawiki.org/wiki/Manual:FAQ Често постављена питања]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]', # Fuzzy
 );
 
 /** Serbian (Latin script) (srpski (latinica)‎)
@@ -18192,7 +18257,7 @@ Proverite Vaš php.ini i obezbedite da je <code>session.save_path</code> postavl
 == Za početak ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Pomoć u vezi sa podešavanjima]
 * [//www.mediawiki.org/wiki/Manual:FAQ Najčešće postavljena pitanja]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]', # Fuzzy
 );
 
 /** Sranan Tongo (Sranantongo)
@@ -18205,7 +18270,7 @@ $messages['srn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Den seti]
 * [//www.mediawiki.org/wiki/Manual:FAQ Sani di ben aksi furu (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]', # Fuzzy
 );
 
 /** Swati (SiSwati)
@@ -18219,14 +18284,14 @@ $messages['ss'] = array(
  */
 $messages['stq'] = array(
        'mainpagetext' => "'''Ju MediaWiki Software wuude mäd Ärfoulch installierd.'''",
-       'mainpagedocfooter' => 'Sjuch ju [//meta.wikimedia.org/wiki/MediaWiki_localization Dokumentation tou de Anpaasenge fon dän Benutseruurfläche] un dät [//meta.wikimedia.org/wiki/Help:Contents Benutserhondbouk] foar Hälpe tou ju Benutsenge un Konfiguration.',
+       'mainpagedocfooter' => 'Sjuch ju [//meta.wikimedia.org/wiki/MediaWiki_localization Dokumentation tou de Anpaasenge fon dän Benutseruurfläche] un dät [//meta.wikimedia.org/wiki/Help:Contents Benutserhondbouk] foar Hälpe tou ju Benutsenge un Konfiguration.', # Fuzzy
 );
 
 /** Sundanese (Basa Sunda)
  */
 $messages['su'] = array(
        'mainpagetext' => "'''''Software'' MediaWiki geus diinstal.'''",
-       'mainpagedocfooter' => "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.",
+       'mainpagedocfooter' => "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.", # Fuzzy
 );
 
 /** Swedish (svenska)
@@ -18427,7 +18492,7 @@ $messages['sw'] = array(
 == Msaada wa kianzio ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Orodha ya mipangilio ya msingi]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ ya MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Orodha ya utoaji wa habari za MediaWiki]', # Fuzzy
 );
 
 /** Silesian (ślůnski)
@@ -18440,7 +18505,7 @@ $messages['szl'] = array(
 == Na sztart ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista sztalowań konfiguracyje]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komuńikaty uo nowych wersyjach MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komuńikaty uo nowych wersyjach MediaWiki]', # Fuzzy
 );
 
 /** Tamil (தமிழ்)
@@ -18557,7 +18622,7 @@ $messages['tcy'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ ಮೀಡಿಯವಿಕಿ FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]', # Fuzzy
 );
 
 /** Telugu (తెలుగు)
@@ -18603,7 +18668,7 @@ $messages['te'] = array(
        'config-admin-password-confirm' => 'సంకేతపదం మళ్ళీ:',
        'config-admin-email' => 'ఈ-మెయిలు చిరునామా:',
        'config-optional-continue' => 'నన్ను మరిన్ని ప్రశ్నలు అడుగు.',
-       'config-profile-wiki' => 'సంప్రదాయ వికీ',
+       'config-profile-wiki' => 'సంప్రదాయ వికీ', # Fuzzy
        'config-profile-no-anon' => 'ఖాతా సృష్టింపు తప్పనిసరి',
        'config-profile-private' => 'అంతరంగిక వికీ',
        'config-license' => 'కాపీహక్కులు మరియు లైసెన్సు:',
@@ -18621,7 +18686,7 @@ $messages['te'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings మీడియావికీ పనితీరు, అమరిక మార్చుకునేందుకు వీలుకల్పించే చిహ్నాల జాబితా]
 * [//www.mediawiki.org/wiki/Manual:FAQ మీడియావికీపై తరుచుగా అడిగే ప్రశ్నలు]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫ్టువేరు కొత్త వెర్షను విడుదలల గురించి తెలిపే మెయిలింగు లిస్టు]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫ్టువేరు కొత్త వెర్షను విడుదలల గురించి తెలిపే మెయిలింగు లిస్టు]', # Fuzzy
 );
 
 /** Tetum (tetun)
@@ -18642,7 +18707,7 @@ $messages['tg-cyrl'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Феҳристи танзимоти пайгирбандӣ]
 * [//www.mediawiki.org/wiki/Manual:FAQ Пурсишҳои МедиаВики]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Феҳристи ройномаҳои нусхаҳои МедиаВики]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Феҳристи ройномаҳои нусхаҳои МедиаВики]', # Fuzzy
 );
 
 /** Tajik (Latin script) (tojikī)
@@ -18656,7 +18721,7 @@ $messages['tg-latn'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Fehristi tanzimoti pajgirbandī]
 * [//www.mediawiki.org/wiki/Manual:FAQ Pursişhoi MediaViki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Fehristi rojnomahoi nusxahoi MediaViki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Fehristi rojnomahoi nusxahoi MediaViki]', # Fuzzy
 );
 
 /** Thai (ไทย)
@@ -18670,7 +18735,7 @@ $messages['th'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings รายการการปรับแต่งระบบ] (ภาษาอังกฤษ)
 * [//www.mediawiki.org/wiki/Manual:FAQ คำถามที่ถามบ่อยในมีเดียวิกิ] (ภาษาอังกฤษ)
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิกิ]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิกิ]', # Fuzzy
 );
 
 /** Turkmen (Türkmençe)
@@ -18683,7 +18748,7 @@ $messages['tk'] = array(
 == Öwrenjeler ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Konfigurasiýa sazlamalary]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçta sanawy]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçta sanawy]', # Fuzzy
 );
 
 /** Tagalog (Tagalog)
@@ -18914,7 +18979,6 @@ Isaalang-alang ang paglalagay na magkakasama ang kalipunan ng dato sa ibang luga
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
-       'config-type-ibm_db2' => 'DB2 ng IBM',
        'config-support-info' => 'Sinusuportahan ng MediaWiki ang sumusunod na mga sistema ng kalipunan ng dato:
 
 $1
@@ -18924,12 +18988,10 @@ Kung hindi mo makita ang sistema ng kalipunan ng dato na sinusubukan mong gamiti
        'config-support-postgres' => '* Ang $1 ay isang bantog na sistema ng kalipunan ng dato na bukas ang pinagmulan na panghalili sa MySQL ([http://www.php.net/manual/en/pgsql.installation.php paano magtipon ng PHP na mayroong suporta ng PostgreSQL]). Maaaring mayroong ilang hindi pangunahing mga surot na natitira pa, at hindi iminumungkahi para gamitin sa loob ng isang kapaligiran ng produksiyon.',
        'config-support-sqlite' => 'Ang $1 ay isang magaan ang timbang na sistema ng kalipunan ng dato na sinusuportahan nang napaka mainam. ([http://www.php.net/manual/en/pdo.installation.php Paano magtipon ng PHP na mayroong suporta ng SQLite], gumagamit ng PDO)',
        'config-support-oracle' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal. ([http://www.php.net/manual/en/oci8.installation.php Paano magtipunan ng PHP na mayroong suporta ng OCI8])',
-       'config-support-ibm_db2' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal.', # Fuzzy
        'config-header-mysql' => 'Mga katakdaan ng MySQL',
        'config-header-postgres' => 'Mga katakdaan ng PostgreSQL',
        'config-header-sqlite' => 'Mga katakdaan ng SQLite',
        'config-header-oracle' => 'Mga katakdaan ng Oracle',
-       'config-header-ibm_db2' => 'Mga katakdaan ng DB2 ng IBM',
        'config-invalid-db-type' => 'Hindi tanggap na uri ng kalipunan ng dato',
        'config-missing-db-name' => 'Dapat kang magpasok ng isang halaga para sa "Pangalan ng kalipunan ng dato"',
        'config-missing-db-host' => 'Dapat kang magpasok ng isang halaga para sa "Tagapagpasinaya ng kalipunan ng dato"',
@@ -18991,7 +19053,7 @@ Kung nais mong muling likhain ang iyong talaksang <code>LocalSettings.php</code>
        'config-upgrade-done-no-regenerate' => 'Buo na ang pagsasapanahon.
 
 Maaari ka na ngayong [$1 magsimula sa paggamit ng wiki mo].',
-       'config-regenerate' => 'Muling likhain ang <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Muling likhain ang LocalSettings.php →',
        'config-show-table-status' => 'Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!', # Fuzzy
        'config-unknown-collation' => "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
        'config-db-web-account' => 'Akawnt ng kalipunan ng dato para sa pagpunta sa web',
@@ -19021,7 +19083,6 @@ May gawi ang mga kalipunan ng dato ng MyISAM na masira nang mas madalas kaysa sa
 Mas kapaki-pakinabang ito kaysa sa gawi na UTF-8 ng MySQL, at nagpapahintulot sa iyo upang magamit ang buong kasaklawan ng mga panitik ng Unikodigo.
 
 Sa ''gawi na UTF-8''', malalaman ng MySQL kung sa anong pangkat ng panitik nakapaloob ang iyong dato, at angkop na makakapagharap at makapapagpalit nito, subalit hindi ka nito papayagan na mag-imbak ng mga panitik na nasa itaas ng [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] o Saligang Tapyas na Pangmaramihang Wika.",
-       'config-ibm_db2-low-db-pagesize' => "Ang kalipunan mo ng dato na DB2 ay mayroong isang likas na nakatakdang puwang ng talahanayan na mayroong hindi sapat na sukat ng pahina. Ang sukat ng pahina ay dapat na maging '''32K''' o mas mataas.",
        'config-site-name' => 'Pangalan ng wiki:',
        'config-site-name-help' => "Lilitaw ito sa bareta ng pamagat ng pantingin-tingin at sa samu't saring ibang mga lugar.",
        'config-site-name-blank' => 'Magpasok ng isang pangalan ng sityo.',
@@ -19129,7 +19190,7 @@ Ideyal na dapat itong  hindi mapupuntahan mula sa web.',
        'config-logo-help' => 'Ang likas na nakatakdang pabalat ng MediaWiki ay nagsasama ng puwang para sa isang logong 135x160 ang piksel na nasa itaas ng menu ng panggilid na bareta.
 Magkargang papaitaas ng isang imahe na mayroong naaangkop na sukat, at ipasok dito ang URL.
 
-Kung ayaw mo ng isang logo, iwanang walang laman ang kahong ito.',
+Kung ayaw mo ng isang logo, iwanang walang laman ang kahong ito.', # Fuzzy
        'config-instantcommons' => 'Paganahin ang Mga Pangkaraniwang Biglaan',
        'config-instantcommons-help' => 'Ang [//www.mediawiki.org/wiki/InstantCommons Instant Commons] ay isang tampok na nagpapahintulot sa mga wiki upang gumamit ng mga imahe, mga tunog at iba pang mga midyang matatagpuan sa pook ng [//commons.wikimedia.org/ Wikimedia Commons].
 Upang magawa ito, nangangailangan ang MediaWiki ng pagka nakakapunta sa Internet.
@@ -19248,7 +19309,7 @@ $messages['tr'] = array(
 == Yeni Başlayanlar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Yapılandırma ayarlarının listesi]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki SSS]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]', # Fuzzy
 );
 
 /** Tatar (Cyrillic script) (татарча)
@@ -19261,7 +19322,7 @@ $messages['tt-cyrl'] = array(
 == Кайбер файдалы ресурслар ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Көйләнмәләр исемлеге (инг.)];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki турында еш бирелгән сораулар һәм җаваплар (инг.)];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу].", # Fuzzy
 );
 
 /** Tatar (Latin script) (tatarça)
@@ -19274,7 +19335,7 @@ $messages['tt-latn'] = array(
 == Qayber faydalı resurslar ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Köylänmälär isemlege (ing.)];
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki turında yış birelgän sorawlar häm cawaplar (ing.)];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu].",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu].", # Fuzzy
 );
 
 /** Udmurt (удмурт)
@@ -19294,7 +19355,7 @@ $messages['ug-arab'] = array(
 == دەسلەپكى ساۋات ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings سەپلىمە تەڭشەك تىزىملىكى]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki كۆپ ئۇچرايدىغان مەسىلىلەرگە جاۋاب]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki تارقاتقان ئېلخەت تىزىملىكى]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki تارقاتقان ئېلخەت تىزىملىكى]', # Fuzzy
 );
 
 /** Ukrainian (українська)
@@ -19526,7 +19587,6 @@ MediaWiki вимагає підтримку UTF-8 для коректної ро
 За можливості розташуйте базу даних десь окремо, наприклад в <code>/var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts' => 'Простір таблиць за замовчуванням:',
        'config-oracle-temp-ts' => 'Тимчасовий простір таблиць:',
-       'config-type-ibm_db2' => 'IBM DB2',
        'config-support-info' => 'MediaWiki підтримує таки системи баз даних:
 
 $1
        'config-support-postgres' => '* $1 — популярна відкрита СУБД, альтернатива MySQL ([http://www.php.net/manual/en/pgsql.installation.php як зібрати PHP з допомогою PostgreSQL]). Можуть зустрічатись деякі невеликі невиправлені помилки, не рекомендується використовувати у робочій системі.',
        'config-support-sqlite' => '* $1 — легка система баз даних, яка дуже добре підтримується. ([http://www.php.net/manual/en/pdo.installation.php Як зібрати PHP з допомогою SQLite], що використовує PDO)',
        'config-support-oracle' => '* $1 — комерційна база даних масштабу підприємства. ([http://www.php.net/manual/en/oci8.installation.php Як зібрати PHP з підтримкою OCI8])',
-       'config-support-ibm_db2' => '* $1 — комерційна база даних масштабу підприємства.', # Fuzzy
        'config-header-mysql' => 'Налаштування MySQL',
        'config-header-postgres' => 'Налаштування PostgreSQL',
        'config-header-sqlite' => 'Налаштування SQLite',
        'config-header-oracle' => 'Налаштування Oracle',
-       'config-header-ibm_db2' => 'Налаштування IBM DB2',
        'config-invalid-db-type' => 'Невірний тип бази даних',
        'config-missing-db-name' => "Ви повинні ввести значення параметру «Ім'я бази даних»",
        'config-missing-db-host' => 'Ви повинні ввести значення параметру «Хост бази даних»',
@@ -19603,7 +19661,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => 'Оновлення завершено.
 
 Ви можете зараз [$1 починати використовувати свою вікі].',
-       'config-regenerate' => 'Повторно згенерувати <code>LocalSettings.php</code> →',
+       'config-regenerate' => 'Повторно згенерувати LocalSettings.php →',
        'config-show-table-status' => 'Запит <code>SHOW TABLE STATUS</code> не виконано!',
        'config-unknown-collation' => "'''Увага:''' База даних використовує нерозпізнане сортування.",
        'config-db-web-account' => 'Обліковий запис бази даних для інтернет-доступу',
@@ -19633,7 +19691,6 @@ chmod a+w $3</pre>',
 Це більш ефективно, ніж UTF-8 режим MySQL, і дозволяє використовувати увесь набір символів Юнікоду.
 
 У '''режимі UTF-8''' MySQL буде знати, якого символу стосуються Ваші дані, і могтиме відображати та конвертувати їх належним чином, але не дозволятиме зберігати символи, що виходять за межі [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-       'config-ibm_db2-low-db-pagesize' => "У Вашій базі даних DB2 за замовчуванням заданий табличний простір з недостатнім розміром сторінки. Розмір сторінки має бути '''32K''' і більше.",
        'config-site-name' => 'Назва вікі:',
        'config-site-name-help' => 'Це буде відображатись у заголовку вікна браузера та у деяких інших місцях.',
        'config-site-name-blank' => 'Введіть назву сайту.',
@@ -19739,7 +19796,7 @@ GFDL — допустима ліцензія, але у ній важко роз
        'config-logo-help' => 'Стандартна схема оформлення MediaWiki містить вільне для логотипу місце над бічною панеллю розміром 135x160 пікселів. 
 Завантажте зображення відповідного розміру і введіть тут його URL.
 
-Якщо Вам не потрібен логотип, залиште це поле пустим.',
+Якщо Вам не потрібен логотип, залиште це поле пустим.', # Fuzzy
        'config-instantcommons' => 'Увімкнути Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] це функція, що дозволяє вікі використовувати зображення, звуки та інші медіа, розміщені на [//commons.wikimedia.org/ Вікісховищі].
 Для цього MediaWiki необхідний доступ до інтернету.
 );
 
 /** Urdu (اردو)
+ * @author Noor2020
  * @author පසිඳු කාවින්ද
  */
 $messages['ur'] = array(
        'config-information' => 'معلومات',
+       'config-git' => 'Git ورژن کنٹرول مصنع لطیف ملا: <code>$1</code> ۔',
+       'config-git-bad' => 'GIT ورژن کنٹرول مصنع لطیف نہيں ملا ۔',
+       'config-mysql-only-myisam-dep' => "' ' تنبیہ: ' '[[MyISAM|مائ اسام]] واحد دستیاب 'ذخیرہ جاتی انجن' ہے جو مائی ایس کیو ایل کے لیے ہے ، جو کہ ناموزوں ہے میڈیا وکی کے لیے ،کیوں کہ :
+* یہ ہموار قطاروں کی سہولت بمشکل فراہم کرتا ہے 
+* یہ دوسرے انجنوں کے مقابلے  زیادہ بگڑ جاتا ہے
+* میڈیا وکی کوڈ بیس ہمیشہ سنبھال نہيں پاتا مائی اسام کو ۔ 
+
+آپ کا مائی ایس کیو ایل کا نصب ہمیشہ اننو ڈی بی کی سہولت نہيں دے سکتا ، ہو سکتا ہے یہ مزید ترقیاتی کام چاہے", # Fuzzy
        'config-profile-fishbowl' => 'صرف مجاز ایڈیٹرز',
        'config-license-pd' => 'پبلک ڈومین',
        'config-email-settings' => 'ای میل کی ترتیبات',
@@ -19880,7 +19946,7 @@ $messages['uz'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Moslamalar ro'yxati]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki haqida ko'p so'raladigan savollar]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]", # Fuzzy
 );
 
 /** vèneto (vèneto)
@@ -19896,7 +19962,7 @@ I seguenti cołegamenti i xé en łengua inglese:
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Inpostasion de configurasion]
 * [//www.mediawiki.org/wiki/Manual:FAQ Domande frequenti so MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]", # Fuzzy
 );
 
 /** Veps (vepsän kel’)
@@ -19909,7 +19975,7 @@ $messages['vep'] = array(
 == Erased tarbhaižed resursad ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Järgendusiden nimikirjutez]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce počtnimikirjutez]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce počtnimikirjutez]', # Fuzzy
 );
 
 /** Vietnamese (Tiếng Việt)
@@ -19931,7 +19997,7 @@ $messages['vi'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Danh sách các thiết lập cấu hình]
 * [//www.mediawiki.org/wiki/Manual:FAQ Các câu hỏi thường gặp MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]', # Fuzzy
 );
 
 /** Volapük (Volapük)
@@ -19944,7 +20010,7 @@ $messages['vo'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Parametalised]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki: SSP]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]', # Fuzzy
 );
 
 /** Võro (Võro)
@@ -19955,7 +20021,7 @@ $messages['vro'] = array(
 * [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide MediaWiki pruukmisoppus (inglüse keelen)].
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Säädmiisi oppus (inglüse keelen)]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki kõgõ küsütümbäq küsümiseq (inglüse keelen)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst].',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst].', # Fuzzy
 );
 
 /** Walloon (walon)
@@ -19975,7 +20041,7 @@ $messages['war'] = array(
 == Ha pagtikang==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Wolof (Wolof)
@@ -19988,7 +20054,7 @@ $messages['wo'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Limu jumtukaayi kocc-koccal gi]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Limu waxtaan ci liy-génn ci MediaWiki]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Limu waxtaan ci liy-génn ci MediaWiki]', # Fuzzy
 );
 
 /** Wu (吴语)
@@ -20001,7 +20067,7 @@ $messages['wuu'] = array(
 == 入门 ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 配置设置列表]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常见问题解答]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]', # Fuzzy
 );
 
 /** Kalmyk (хальмг)
@@ -20014,7 +20080,7 @@ $messages['xal'] = array(
 == Туста заавр ==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Көгүдә бүрткл]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki туск ЮмБи]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki шинҗллһнә бүрткл]',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki шинҗллһнә бүрткл]', # Fuzzy
 );
 
 /** Yiddish (ייִדיש)
@@ -20064,7 +20130,7 @@ $messages['yo'] = array(
 == Láti bẹ̀rẹ̀ ==
 *  [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]", # Fuzzy
 );
 
 /** Cantonese (粵語)
@@ -20076,7 +20142,7 @@ $messages['yue'] = array(
 ==開始使用==
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings 配置設定清單](英)
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題](英)
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件名單](英)',
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件名單](英)', # Fuzzy
 );
 
 /** Zeeuws (Zeêuws)
@@ -20089,14 +20155,16 @@ $messages['zea'] = array(
 
 * [//www.mediawiki.org/wiki/Manual:Configuration_settings Lieste mie instelliengen]
 * [//www.mediawiki.org/wiki/Manual:FAQ Veehestelde vraehen (FAQ)]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]",
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]", # Fuzzy
 );
 
 /** Simplified Chinese (中文(简体)‎)
  * @author Anthony Fok
+ * @author Cwek
  * @author Hydra
  * @author Hzy980512
  * @author Liangent
+ * @author Makecat
  * @author PhiLiP
  * @author Xiaomingyan
  * @author Yfdyh000
@@ -20202,6 +20270,8 @@ $1',
 Object caching is not enabled.",
        'config-mod-security' => "'''警告''':您的服务器已启动[http://modsecurity.org/ mod_security]。若其配置错误, 会导致MediaWiki和其他软件的错误并允许用户任意发布内容。如果您遇到任何错误,请查阅[http://modsecurity.org/documentation/ mod_security文档]或联系您的客服。",
        'config-diff3-bad' => '找不到GNU diff3。',
+       'config-git' => '发现Git版本控制软件:<code>$1</code>',
+       'config-git-bad' => 'Git版本控制软件未找到。',
        'config-imagemagick' => '已找到ImageMagick:<code>$1</code>。如果你启用了上传功能,缩略图功能也将被启用。',
        'config-gd' => '已找到内建的GD图形库。如果你启用了上传功能,缩略图功能也将被启用。',
        'config-no-scaling' => '找不到GD库或ImageMagick。缩略图功能将不可用。',
@@ -20213,7 +20283,7 @@ Object caching is not enabled.",
        'config-no-cli-uploads-check' => "'''警告''':在CLI安装过程中,没有对您的默认上传目录(<code>$1</code>)进行执行任意脚本的漏洞检查。",
        'config-brokenlibxml' => '您的系统安装的PHP和libxml2版本组合存在故障,并可能在MediaWiki和其他web应用程序中造成隐藏的数据损坏。请将PHP升级到5.2.9或以上,libxml2升级到2.7.3或以上([//bugs.php.net/bug.php?id=45996 PHP的故障报告])。安装已中断。',
        'config-using531' => '由于函数<code>__call()</code>的引用参数存在故障,PHP $1和MediaWiki无法兼容。请升级到PHP 5.3.2或更高版本,或降级到PHP 5.3.0以修复该问题。安装已中断。',
-       'config-suhosin-max-value-length' => 'Suhosin已经安装并将GET请求的参数长度限制在$1字节。MediaWiki的ResourceLoader部件可以在此限制下正常工作,但其性能会被降低。如果可能,请在<code>php.ini</code>中将<code>suhosin.get.max_value_length</code>设为1024或更高值,并在LocalSettings.php中将<code>$wgResourceLoaderMaxQueryLength</code>设为同一值。', # Fuzzy
+       'config-suhosin-max-value-length' => 'Suhosin已经安装并将GET请求的参数长度限制在$1字节。MediaWiki的ResourceLoader部件可以在此限制下正常工作,但其性能会被降低。如果可能,请在<code>php.ini</code>中将<code>suhosin.get.max_value_length</code>设为1024或更高值,并在LocalSettings.php中将<code>$wgResourceLoaderMaxQueryLength</code>设为同一值。',
        'config-db-type' => '数据库类型:',
        'config-db-host' => '数据库主机:',
        'config-db-host-help' => '如果您的数据库在别的服务器上,请在这里输入它的域名或IP地址。
@@ -20336,7 +20406,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => '升级完成。
 
 现在您可以[$1 开始使用您的wiki]了。',
-       'config-regenerate' => '重新生成<code>LocalSettings.php</code> →',
+       'config-regenerate' => '重新生成LocalSettings.php →',
        'config-show-table-status' => '<code>SHOW TABLE STATUS</code>语句执行失败!',
        'config-unknown-collation' => "'''警告:'''数据库使用了无法识别的整理。",
        'config-db-web-account' => '供网页访问使用的数据库帐号',
@@ -20354,6 +20424,12 @@ chmod a+w $3</pre>',
 
 如果您的MySQL程序支持InnoDB,我们高度推荐您使用该引擎替代MyISAM。
 如果您的MySQL程序不支持InnoDB,请考虑升级。",
+       'config-mysql-only-myisam-dep' => "''''警告:'''MyISAM是MySQL唯一可用的存储引擎,但不适合用于MediaWiki,是由于:
+*由于只支持表级锁定,几乎不支持并发。
+*它比其他引擎更容易损坏。
+*MediaWiki代码不能总是按照预设地操作MyISAM。
+
+你的MySQL不支持InnoDB,是时候升级了。",
        'config-mysql-engine-help' => "'''InnoDB'''通常是最佳选项,因为它对并发操作有着良好的支持。
 
 '''MyISAM'''在单用户或只读环境下可能会有更快的性能表现。但MyISAM数据库出错的概率一般要大于InnoDB数据库。",
@@ -20446,6 +20522,8 @@ GNU自由文档许可证是维基百科曾经使用过的许可证,并迄今
        'config-logo' => '标志URL:',
        'config-logo-help' => '在MediaWiki的默认外观中,左侧栏菜单之上有一块135x160像素的标志区。请上传一幅相应大小的图像,并在此输入URL。
 
+你可以用<code>$wgStylePath</code>或<code>$wgScriptPath</code>来表示相对于这些位置的路径。
+
 如果您不希望使用标志,请将本处留空。',
        'config-instantcommons' => '启用即时共享资源',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons 即时共享资源]可以让wiki使用来自[//commons.wikimedia.org/ 维基共享资源]网站的图像、音频和其他媒体文件。要启用该功能,MediaWiki必须能够访问互联网。
@@ -20776,7 +20854,7 @@ chmod a+w $3</pre>',
        'config-upgrade-done-no-regenerate' => '升級完成。
 
 現在您可以[$1 開始使用您的wiki]了。',
-       'config-regenerate' => '重新生成<code>LocalSettings.php</code> →',
+       'config-regenerate' => '重新生成LocalSettings.php →',
        'config-show-table-status' => '查詢<code>SHOW TABLE STATUS</code>失敗!',
        'config-unknown-collation' => "'''警告:'''數據庫使用了無法識別的整理。",
        'config-db-web-account' => '供網頁訪問使用的數據庫帳號',
@@ -20836,7 +20914,7 @@ chmod a+w $3</pre>',
        'config-optional-continue' => '多問我一些問題吧。',
        'config-optional-skip' => '我已經不耐煩了,趕緊安裝我的wiki。',
        'config-profile' => '用戶權限配置:',
-       'config-profile-wiki' => '傳統wiki', # Fuzzy
+       'config-profile-wiki' => '開放的wiki',
        'config-profile-no-anon' => '需要註冊帳號',
        'config-profile-fishbowl' => '編輯受限',
        'config-profile-private' => '非公開wiki',
@@ -20886,7 +20964,7 @@ GNU自由文檔許可證是維基百科曾經使用過的許可證,並迄今
        'config-logo' => '標誌URL:',
        'config-logo-help' => '在MediaWiki的默認外觀中,左側欄菜單之上有一塊135x160像素的標誌區。請上傳一幅相應大小的圖像,並在此輸入URL。
 
-如果您不希望使用標誌,請將本處留空。',
+如果您不希望使用標誌,請將本處留空。', # Fuzzy
        'config-instantcommons' => '啟用即時共享資源',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons 即時共享資源]可以讓wiki使用來自[//commons.wikimedia.org/ 維基共享資源]網站的圖像、音頻和其他媒體文件。要啟用該功能,MediaWiki必須能夠訪問互聯網。
 
index 4d8e5f0..b1517e4 100644 (file)
@@ -114,6 +114,7 @@ abstract class Installer {
                'envCheckModSecurity',
                'envCheckDiff3',
                'envCheckGraphics',
+               'envCheckGit',
                'envCheckServer',
                'envCheckPath',
                'envCheckExtension',
@@ -147,6 +148,7 @@ abstract class Installer {
                'wgDBtype',
                'wgDiff3',
                'wgImageMagickConvertCommand',
+               'wgGitBin',
                'IP',
                'wgServer',
                'wgScriptPath',
@@ -399,7 +401,7 @@ abstract class Installer {
         */
        public function doEnvironmentChecks() {
                $phpVersion = phpversion();
-               if( version_compare( $phpVersion, self::MINIMUM_PHP_VERSION, '>=' ) ) {
+               if ( version_compare( $phpVersion, self::MINIMUM_PHP_VERSION, '>=' ) ) {
                        $this->showMessage( 'config-env-php', $phpVersion );
                        $good = true;
                } else {
@@ -407,7 +409,7 @@ abstract class Installer {
                        $good = false;
                }
 
-               if( $good ) {
+               if ( $good ) {
                        foreach ( $this->envChecks as $check ) {
                                $status = $this->$check();
                                if ( $status === false ) {
@@ -464,7 +466,7 @@ abstract class Installer {
                $type = strtolower( $type );
 
                if ( !isset( $this->dbInstallers[$type] ) ) {
-                       $class = ucfirst( $type ). 'Installer';
+                       $class = ucfirst( $type ) . 'Installer';
                        $this->dbInstallers[$type] = new $class( $this );
                }
 
@@ -484,15 +486,15 @@ abstract class Installer {
                $_lsExists = file_exists( "$IP/LocalSettings.php" );
                wfRestoreWarnings();
 
-               if( !$_lsExists ) {
+               if ( !$_lsExists ) {
                        return false;
                }
                unset( $_lsExists );
 
-               require( "$IP/includes/DefaultSettings.php" );
-               require( "$IP/LocalSettings.php" );
+               require "$IP/includes/DefaultSettings.php";
+               require "$IP/LocalSettings.php";
                if ( file_exists( "$IP/AdminSettings.php" ) ) {
-                       require( "$IP/AdminSettings.php" );
+                       require "$IP/AdminSettings.php";
                }
                return get_defined_vars();
        }
@@ -643,6 +645,8 @@ abstract class Installer {
 
                $allNames = array();
 
+               // Give grep a chance to find the usages:
+               // config-type-mysql, config-type-postgres, config-type-oracle, config-type-sqlite
                foreach ( self::getDBTypes() as $name ) {
                        $allNames[] = wfMessage( "config-type-$name" )->text();
                }
@@ -680,7 +684,7 @@ abstract class Installer {
         * Environment check for register_globals.
         */
        protected function envCheckRegisterGlobals() {
-               if( wfIniGetBool( 'register_globals' ) ) {
+               if ( wfIniGetBool( 'register_globals' ) ) {
                        $this->showMessage( 'config-register-globals' );
                }
        }
@@ -718,7 +722,7 @@ abstract class Installer {
         * @return bool
         */
        protected function envCheckMagicQuotes() {
-               if( wfIniGetBool( "magic_quotes_runtime" ) ) {
+               if ( wfIniGetBool( "magic_quotes_runtime" ) ) {
                        $this->showError( 'config-magic-quotes-runtime' );
                        return false;
                }
@@ -826,10 +830,10 @@ abstract class Installer {
 
                $n = wfShorthandToInteger( $limit );
 
-               if( $n < $this->minMemorySize * 1024 * 1024 ) {
+               if ( $n < $this->minMemorySize * 1024 * 1024 ) {
                        $newLimit = "{$this->minMemorySize}M";
 
-                       if( ini_set( "memory_limit", $newLimit ) === false ) {
+                       if ( ini_set( "memory_limit", $newLimit ) === false ) {
                                $this->showMessage( 'config-memory-bad', $limit );
                        } else {
                                $this->showMessage( 'config-memory-raised', $limit, $newLimit );
@@ -896,7 +900,8 @@ abstract class Installer {
         */
        protected function envCheckGraphics() {
                $names = array( wfIsWindows() ? 'convert.exe' : 'convert' );
-               $convert = self::locateExecutableInDefaultPaths( $names, array( '$1 -version', 'ImageMagick' ) );
+               $versionInfo = array( '$1 -version', 'ImageMagick' );
+               $convert = self::locateExecutableInDefaultPaths( $names, $versionInfo );
 
                $this->setVar( 'wgImageMagickConvertCommand', '' );
                if ( $convert ) {
@@ -912,6 +917,28 @@ abstract class Installer {
                return true;
        }
 
+       /**
+        * Search for git.
+        *
+        * @since 1.22
+        * @return bool
+        */
+       protected function envCheckGit() {
+               $names = array( wfIsWindows() ? 'git.exe' : 'git' );
+               $versionInfo = array( '$1 --version', 'git version' );
+
+               $git = self::locateExecutableInDefaultPaths( $names, $versionInfo );
+
+               if ( $git ) {
+                       $this->setVar( 'wgGitBin', $git );
+                       $this->showMessage( 'config-git', $git );
+               } else {
+                       $this->setVar( 'wgGitBin', false );
+                       $this->showMessage( 'config-git-bad' );
+               }
+               return true;
+       }
+
        /**
         * Environment check for the server hostname.
         */
@@ -943,6 +970,7 @@ abstract class Installer {
 
        /**
         * Environment check for setting the preferred PHP file extension.
+        * @return bool
         */
        protected function envCheckExtension() {
                // @todo FIXME: Detect this properly
@@ -956,7 +984,7 @@ abstract class Installer {
        }
 
        /**
-        * TODO: document
+        * Environment check for preferred locale in shell
         * @return bool
         */
        protected function envCheckShellLocale() {
@@ -975,7 +1003,7 @@ abstract class Installer {
                        return true;
                }
 
-               $lines = wfArrayMap( 'trim', explode( "\n", $lines ) );
+               $lines = array_map( 'trim', explode( "\n", $lines ) );
                $candidatesByLocale = array();
                $candidatesByLang = array();
 
@@ -995,7 +1023,7 @@ abstract class Installer {
                }
 
                # Try the current value of LANG.
-               if ( isset( $candidatesByLocale[ getenv( 'LANG' ) ] ) ) {
+               if ( isset( $candidatesByLocale[getenv( 'LANG' )] ) ) {
                        $this->setVar( 'wgShellLocale', getenv( 'LANG' ) );
                        return true;
                }
@@ -1030,7 +1058,7 @@ abstract class Installer {
        }
 
        /**
-        * TODO: document
+        * Environment check for the permissions of the uploads directory
         * @return bool
         */
        protected function envCheckUploadsDirectory() {
@@ -1055,7 +1083,7 @@ abstract class Installer {
        protected function envCheckSuhosinMaxValueLength() {
                $maxValueLength = ini_get( 'suhosin.get.max_value_length' );
                if ( $maxValueLength > 0 ) {
-                       if( $maxValueLength < 1024 ) {
+                       if ( $maxValueLength < 1024 ) {
                                # Only warn if the value is below the sane 1024
                                $this->showMessage( 'config-suhosin-max-value-length', $maxValueLength );
                        }
@@ -1113,14 +1141,14 @@ abstract class Installer {
                 * We're going to prefer the pecl extension here unless
                 * utf8_normalize is more up to date.
                 */
-               if( $utf8 ) {
+               if ( $utf8 ) {
                        $useNormalizer = 'utf8';
                        $utf8 = utf8_normalize( $not_normal_c, UtfNormal::UNORM_NFC );
                        if ( $utf8 !== $normal_c ) {
                                $needsUpdate = true;
                        }
                }
-               if( $intl ) {
+               if ( $intl ) {
                        $useNormalizer = 'intl';
                        $intl = normalizer_normalize( $not_normal_c, Normalizer::FORM_C );
                        if ( $intl !== $normal_c ) {
@@ -1129,11 +1157,11 @@ abstract class Installer {
                }
 
                // Uses messages 'config-unicode-using-php', 'config-unicode-using-utf8', 'config-unicode-using-intl'
-               if( $useNormalizer === 'php' ) {
+               if ( $useNormalizer === 'php' ) {
                        $this->showMessage( 'config-unicode-pure-php-warning' );
                } else {
                        $this->showMessage( 'config-unicode-using-' . $useNormalizer );
-                       if( $needsUpdate ) {
+                       if ( $needsUpdate ) {
                                $this->showMessage( 'config-unicode-update-warning' );
                        }
                }
@@ -1216,9 +1244,9 @@ abstract class Installer {
         * @return bool|string
         */
        public static function locateExecutableInDefaultPaths( $names, $versionInfo = false ) {
-               foreach( self::getPossibleBinPaths() as $path ) {
+               foreach ( self::getPossibleBinPaths() as $path ) {
                        $exe = self::locateExecutable( $path, $names, $versionInfo );
-                       if( $exe !== false ) {
+                       if ( $exe !== false ) {
                                return $exe;
                        }
                }
@@ -1256,7 +1284,7 @@ abstract class Installer {
                                try {
                                        $text = Http::get( $url . $file, array( 'timeout' => 3 ) );
                                }
-                               catch( MWException $e ) {
+                               catch ( MWException $e ) {
                                        // Http::get throws with allow_url_fopen = false and no curl extension.
                                        $text = null;
                                }
@@ -1317,22 +1345,26 @@ abstract class Installer {
         * @return array
         */
        public function findExtensions() {
-               if( $this->getVar( 'IP' ) === null ) {
-                       return false;
+               if ( $this->getVar( 'IP' ) === null ) {
+                       return array();
                }
 
-               $exts = array();
                $extDir = $this->getVar( 'IP' ) . '/extensions';
-               $dh = opendir( $extDir );
+               if ( !is_readable( $extDir ) || !is_dir( $extDir ) ) {
+                       return array();
+               }
 
+               $dh = opendir( $extDir );
+               $exts = array();
                while ( ( $file = readdir( $dh ) ) !== false ) {
-                       if( !is_dir( "$extDir/$file" ) ) {
+                       if ( !is_dir( "$extDir/$file" ) ) {
                                continue;
                        }
-                       if( file_exists( "$extDir/$file/$file.php" ) ) {
+                       if ( file_exists( "$extDir/$file/$file.php" ) ) {
                                $exts[] = $file;
                        }
                }
+               closedir( $dh );
                natcasesort( $exts );
 
                return $exts;
@@ -1359,10 +1391,10 @@ abstract class Installer {
                global $wgAutoloadClasses;
                $wgAutoloadClasses = array();
 
-               require( "$IP/includes/DefaultSettings.php" );
+               require "$IP/includes/DefaultSettings.php";
 
-               foreach( $exts as $e ) {
-                       require_once( "$IP/extensions/$e/$e.php" );
+               foreach ( $exts as $e ) {
+                       require_once "$IP/extensions/$e/$e.php";
                }
 
                $hooksWeWant = isset( $wgHooks['LoadExtensionSchemaUpdates'] ) ?
@@ -1400,18 +1432,18 @@ abstract class Installer {
 
                // Build the array of install steps starting from the core install list,
                // then adding any callbacks that wanted to attach after a given step
-               foreach( $coreInstallSteps as $step ) {
+               foreach ( $coreInstallSteps as $step ) {
                        $this->installSteps[] = $step;
-                       if( isset( $this->extraInstallSteps[ $step['name'] ] ) ) {
+                       if ( isset( $this->extraInstallSteps[$step['name']] ) ) {
                                $this->installSteps = array_merge(
                                        $this->installSteps,
-                                       $this->extraInstallSteps[ $step['name'] ]
+                                       $this->extraInstallSteps[$step['name']]
                                );
                        }
                }
 
                // Prepend any steps that want to be at the beginning
-               if( isset( $this->extraInstallSteps['BEGINNING'] ) ) {
+               if ( isset( $this->extraInstallSteps['BEGINNING'] ) ) {
                        $this->installSteps = array_merge(
                                $this->extraInstallSteps['BEGINNING'],
                                $this->installSteps
@@ -1419,7 +1451,7 @@ abstract class Installer {
                }
 
                // Extensions should always go first, chance to tie into hooks and such
-               if( count( $this->getVar( '_Extensions' ) ) ) {
+               if ( count( $this->getVar( '_Extensions' ) ) ) {
                        array_unshift( $this->installSteps,
                                array( 'name' => 'extensions', 'callback' => array( $this, 'includeExtensions' ) )
                        );
@@ -1444,7 +1476,7 @@ abstract class Installer {
                $installer = $this->getDBInstaller();
                $installer->preInstall();
                $steps = $this->getInstallSteps( $installer );
-               foreach( $steps as $stepObj ) {
+               foreach ( $steps as $stepObj ) {
                        $name = $stepObj['name'];
                        call_user_func_array( $startCB, array( $name ) );
 
@@ -1457,11 +1489,11 @@ abstract class Installer {
 
                        // If we've hit some sort of fatal, we need to bail.
                        // Callback already had a chance to do output above.
-                       if( !$status->isOk() ) {
+                       if ( !$status->isOk() ) {
                                break;
                        }
                }
-               if( $status->isOk() ) {
+               if ( $status->isOk() ) {
                        $this->setVar( '_InstallDone', true );
                }
                return $installResults;
@@ -1529,13 +1561,13 @@ abstract class Installer {
 
                        try {
                                $user->setPassword( $this->getVar( '_AdminPassword' ) );
-                       } catch( PasswordError $pwe ) {
+                       } catch ( PasswordError $pwe ) {
                                return Status::newFatal( 'config-admin-error-password', $name, $pwe->getMessage() );
                        }
 
                        $user->addGroup( 'sysop' );
                        $user->addGroup( 'bureaucrat' );
-                       if( $this->getVar( '_AdminEmail' ) ) {
+                       if ( $this->getVar( '_AdminEmail' ) ) {
                                $user->setEmail( $this->getVar( '_AdminEmail' ) );
                        }
                        $user->saveSettings();
@@ -1546,7 +1578,7 @@ abstract class Installer {
                }
                $status = Status::newGood();
 
-               if( $this->getVar( '_Subscribe' ) && $this->getVar( '_AdminEmail' ) ) {
+               if ( $this->getVar( '_Subscribe' ) && $this->getVar( '_AdminEmail' ) ) {
                        $this->subscribeToMediaWikiAnnounce( $status );
                }
 
@@ -1558,23 +1590,23 @@ abstract class Installer {
         */
        private function subscribeToMediaWikiAnnounce( Status $s ) {
                $params = array(
-                       'email'    => $this->getVar( '_AdminEmail' ),
+                       'email' => $this->getVar( '_AdminEmail' ),
                        'language' => 'en',
-                       'digest'   => 0
+                       'digest' => 0
                );
 
                // Mailman doesn't support as many languages as we do, so check to make
                // sure their selected language is available
                $myLang = $this->getVar( '_UserLang' );
-               if( in_array( $myLang, $this->mediaWikiAnnounceLanguages ) ) {
+               if ( in_array( $myLang, $this->mediaWikiAnnounceLanguages ) ) {
                        $myLang = $myLang == 'pt-br' ? 'pt_BR' : $myLang; // rewrite to Mailman's pt_BR
                        $params['language'] = $myLang;
                }
 
-               if( MWHttpRequest::canMakeRequests() ) {
+               if ( MWHttpRequest::canMakeRequests() ) {
                        $res = MWHttpRequest::factory( $this->mediaWikiAnnounceUrl,
                                array( 'method' => 'POST', 'postData' => $params ) )->execute();
-                       if( !$res->isOK() ) {
+                       if ( !$res->isOK() ) {
                                $s->warning( 'config-install-subscribe-fail', $res->getMessage() );
                        }
                } else {
@@ -1592,7 +1624,7 @@ abstract class Installer {
                $status = Status::newGood();
                try {
                        $page = WikiPage::factory( Title::newMainPage() );
-                       $content = new WikitextContent (
+                       $content = new WikitextContent(
                                wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
                                wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text()
                        );
@@ -1602,7 +1634,7 @@ abstract class Installer {
                                        EDIT_NEW,
                                        false,
                                        User::newFromName( 'MediaWiki default' ) );
-               } catch (MWException $e) {
+               } catch ( MWException $e ) {
                        //using raw, because $wgShowExceptionDetails can not be set yet
                        $status->fatal( 'config-install-mainpage-failed', $e->getMessage() );
                }
index 7cb3779..3a9bfe8 100644 (file)
@@ -62,21 +62,21 @@ class LocalSettingsGenerator {
                                'wgRightsText', 'wgMainCacheType', 'wgEnableUploads',
                                'wgMainCacheType', '_MemCachedServers', 'wgDBserver', 'wgDBuser',
                                'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
-                               'wgMetaNamespace', 'wgResourceLoaderMaxQueryLength'
+                               'wgMetaNamespace', 'wgResourceLoaderMaxQueryLength', 'wgLogo',
                        ),
                        $db->getGlobalNames()
                );
 
-               $unescaped = array( 'wgRightsIcon' );
+               $unescaped = array( 'wgRightsIcon', 'wgLogo' );
                $boolItems = array(
                        'wgEnableEmail', 'wgEnableUserEmail', 'wgEnotifUserTalk',
                        'wgEnotifWatchlist', 'wgEmailAuthentication', 'wgEnableUploads', 'wgUseInstantCommons'
                );
 
-               foreach( $confItems as $c ) {
+               foreach ( $confItems as $c ) {
                        $val = $installer->getVar( $c );
 
-                       if( in_array( $c, $boolItems ) ) {
+                       if ( in_array( $c, $boolItems ) ) {
                                $val = wfBoolToStr( $val );
                        }
 
@@ -136,15 +136,15 @@ class LocalSettingsGenerator {
        public function getText() {
                $localSettings = $this->getDefaultText();
 
-               if( count( $this->extensions ) ) {
+               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
 # The following extensions were automatically enabled:\n";
 
-                       foreach( $this->extensions as $extName ) {
+                       foreach ( $this->extensions as $extName ) {
                                $encExtName = self::escapePhpString( $extName );
-                               $localSettings .= "require_once( \"\$IP/extensions/$encExtName/$encExtName.php\" );\n";
+                               $localSettings .= "require_once \"\$IP/extensions/$encExtName/$encExtName.php\";\n";
                        }
                }
 
@@ -169,13 +169,13 @@ class LocalSettingsGenerator {
        protected function buildMemcachedServerList() {
                $servers = $this->values['_MemCachedServers'];
 
-               if( !$servers ) {
+               if ( !$servers ) {
                        return 'array()';
                } else {
                        $ret = 'array( ';
                        $servers = explode( ',', $servers );
 
-                       foreach( $servers as $srv ) {
+                       foreach ( $servers as $srv ) {
                                $srv = trim( $srv );
                                $ret .= "'$srv', ";
                        }
@@ -188,14 +188,14 @@ class LocalSettingsGenerator {
         * @return String
         */
        protected function getDefaultText() {
-               if( !$this->values['wgImageMagickConvertCommand'] ) {
+               if ( !$this->values['wgImageMagickConvertCommand'] ) {
                        $this->values['wgImageMagickConvertCommand'] = '/usr/bin/convert';
                        $magic = '#';
                } else {
                        $magic = '';
                }
 
-               if( !$this->values['wgShellLocale'] ) {
+               if ( !$this->values['wgShellLocale'] ) {
                        $this->values['wgShellLocale'] = 'en_US.UTF-8';
                        $locale = '#';
                } else {
@@ -205,16 +205,16 @@ class LocalSettingsGenerator {
                //$rightsUrl = $this->values['wgRightsUrl'] ? '' : '#'; // TODO: Fixme, I'm unused!
                $hashedUploads = $this->safeMode ? '' : '#';
                $metaNamespace = '';
-               if( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) {
+               if ( $this->values['wgMetaNamespace'] !== $this->values['wgSitename'] ) {
                        $metaNamespace = "\$wgMetaNamespace = \"{$this->values['wgMetaNamespace']}\";\n";
                }
 
                $groupRights = '';
-               if( $this->groupPermissions ) {
+               if ( $this->groupPermissions ) {
                        $groupRights .= "# The following permissions were set based on your choice in the installer\n";
-                       foreach( $this->groupPermissions as $group => $rightArr ) {
+                       foreach ( $this->groupPermissions as $group => $rightArr ) {
                                $group = self::escapePhpString( $group );
-                               foreach( $rightArr as $right => $perm ) {
+                               foreach ( $rightArr as $right => $perm ) {
                                        $right = self::escapePhpString( $right );
                                        $groupRights .= "\$wgGroupPermissions['$group']['$right'] = " .
                                                wfBoolToStr( $perm ) . ";\n";
@@ -222,12 +222,12 @@ class LocalSettingsGenerator {
                        }
                }
 
-               switch( $this->values['wgMainCacheType'] ) {
+               switch ( $this->values['wgMainCacheType'] ) {
                        case 'anything':
                        case 'db':
                        case 'memcached':
                        case 'accel':
-                               $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType']);
+                               $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType'] );
                                break;
                        case 'none':
                        default:
@@ -273,7 +273,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 
 ## The relative URL path to the logo.  Make sure you change this from the default,
 ## or else you'll overwrite your logo when you upgrade!
-\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
+\$wgLogo             = \"{$this->values['wgLogo']}\";
 
 ## UPO means: this is also a user preference option
 
@@ -335,7 +335,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 \$wgUpgradeKey = \"{$this->values['wgUpgradeKey']}\";
 
 ## Default skin: you can change the default skin. Use the internal symbolic
-## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector':
+## names, ie 'cologneblue', 'monobook', 'vector':
 \$wgDefaultSkin = \"{$this->values['wgDefaultSkin']}\";
 
 ## For attaching licensing metadata to pages, and displaying an
index f9a8ce7..e0bf3d7 100644 (file)
@@ -86,8 +86,7 @@ class MysqlInstaller extends DatabaseInstaller {
         * @return string
         */
        public function getConnectForm() {
-               return
-                       $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+               return $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
                        Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
                        $this->getTextBox( 'wgDBname', 'config-db-name', array( 'dir' => 'ltr' ), $this->parent->getHelpBox( 'config-db-name-help' ) ) .
@@ -153,7 +152,6 @@ class MysqlInstaller extends DatabaseInstaller {
                                $this->getVar( '_InstallUser' ),
                                $this->getVar( '_InstallPassword' ),
                                false,
-                               false,
                                0,
                                $this->getVar( 'wgDBprefix' )
                        );
@@ -351,16 +349,23 @@ class MysqlInstaller extends DatabaseInstaller {
                $s .= Xml::openElement( 'div', array(
                        'id' => 'dbMyisamWarning'
                ));
-               $s .= $this->parent->getWarningBox( wfMessage( 'config-mysql-myisam-dep' )->text() );
+               $myisamWarning = 'config-mysql-myisam-dep';
+               if ( count( $engines ) === 1 ) {
+                       $myisamWarning = 'config-mysql-only-myisam-dep';
+               }
+               $s .= $this->parent->getWarningBox( wfMessage( $myisamWarning )->text() );
                $s .= Xml::closeElement( 'div' );
 
-               if( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
+               if ( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
                        $s .= Xml::openElement( 'script', array( 'type' => 'text/javascript' ) );
                        $s .= '$(\'#dbMyisamWarning\').hide();';
                        $s .= Xml::closeElement( 'script' );
                }
 
                if ( count( $engines ) >= 2 ) {
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-mysql-innodb, config-mysql-myisam
                        $s .= $this->getRadioSet( array(
                                'var' => '_MysqlEngine',
                                'label' => 'config-mysql-engine',
@@ -369,10 +374,12 @@ class MysqlInstaller extends DatabaseInstaller {
                                'itemAttribs' => array(
                                        'MyISAM' => array(
                                                'class' => 'showHideRadio',
-                                               'rel'   => 'dbMyisamWarning'),
+                                               'rel' => 'dbMyisamWarning'
+                                       ),
                                        'InnoDB' => array(
                                                'class' => 'hideShowRadio',
-                                               'rel'   => 'dbMyisamWarning')
+                                               'rel' => 'dbMyisamWarning'
+                                       )
                        )));
                        $s .= $this->parent->getHelpBox( 'config-mysql-engine-help' );
                }
@@ -385,6 +392,9 @@ class MysqlInstaller extends DatabaseInstaller {
 
                // Do charset selector
                if ( count( $charsets ) >= 2 ) {
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-mysql-binary, config-mysql-utf8
                        $s .= $this->getRadioSet( array(
                                'var' => '_MysqlCharset',
                                'label' => 'config-mysql-charset',
@@ -424,7 +434,6 @@ class MysqlInstaller extends DatabaseInstaller {
                                        $this->getVar( 'wgDBuser' ),
                                        $this->getVar( 'wgDBpassword' ),
                                        false,
-                                       false,
                                        0,
                                        $this->getVar( 'wgDBprefix' )
                                );
@@ -465,7 +474,7 @@ class MysqlInstaller extends DatabaseInstaller {
                }
                $conn = $status->value;
                $dbName = $this->getVar( 'wgDBname' );
-               if( !$conn->selectDB( $dbName ) ) {
+               if ( !$conn->selectDB( $dbName ) ) {
                        $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ), __METHOD__ );
                        $conn->selectDB( $dbName );
                }
@@ -478,7 +487,7 @@ class MysqlInstaller extends DatabaseInstaller {
         */
        public function setupUser() {
                $dbUser = $this->getVar( 'wgDBuser' );
-               if( $dbUser == $this->getVar( '_InstallUser' ) ) {
+               if ( $dbUser == $this->getVar( '_InstallUser' ) ) {
                        return Status::newGood();
                }
                $status = $this->getConnection();
@@ -501,7 +510,6 @@ class MysqlInstaller extends DatabaseInstaller {
                                        $dbUser,
                                        $password,
                                        false,
-                                       false,
                                        0,
                                        $this->getVar( 'wgDBprefix' )
                                );
@@ -515,7 +523,7 @@ class MysqlInstaller extends DatabaseInstaller {
                        $tryToCreate = false;
                }
 
-               if( $tryToCreate ) {
+               if ( $tryToCreate ) {
                        $createHostList = array(
                                $server,
                                'localhost',
@@ -526,16 +534,16 @@ class MysqlInstaller extends DatabaseInstaller {
                        $createHostList = array_unique( $createHostList );
                        $escPass = $this->db->addQuotes( $password );
 
-                       foreach( $createHostList as $host ) {
+                       foreach ( $createHostList as $host ) {
                                $fullName = $this->buildFullUserName( $dbUser, $host );
-                               if( !$this->userDefinitelyExists( $dbUser, $host ) ) {
-                                       try{
+                               if ( !$this->userDefinitelyExists( $dbUser, $host ) ) {
+                                       try {
                                                $this->db->begin( __METHOD__ );
                                                $this->db->query( "CREATE USER $fullName IDENTIFIED BY $escPass", __METHOD__ );
                                                $this->db->commit( __METHOD__ );
                                                $grantableNames[] = $fullName;
-                                       } catch( DBQueryError $dqe ) {
-                                               if( $this->db->lastErrno() == 1396 /* ER_CANNOT_USER */ ) {
+                                       } catch ( DBQueryError $dqe ) {
+                                               if ( $this->db->lastErrno() == 1396 /* ER_CANNOT_USER */ ) {
                                                        // User (probably) already exists
                                                        $this->db->rollback( __METHOD__ );
                                                        $status->warning( 'config-install-user-alreadyexists', $dbUser );
@@ -558,12 +566,12 @@ class MysqlInstaller extends DatabaseInstaller {
 
                // Try to grant to all the users we know exist or we were able to create
                $dbAllTables = $this->db->addIdentifierQuotes( $dbName ) . '.*';
-               foreach( $grantableNames as $name ) {
+               foreach ( $grantableNames as $name ) {
                        try {
                                $this->db->begin( __METHOD__ );
                                $this->db->query( "GRANT ALL PRIVILEGES ON $dbAllTables TO $name", __METHOD__ );
                                $this->db->commit( __METHOD__ );
-                       } catch( DBQueryError $dqe ) {
+                       } catch ( DBQueryError $dqe ) {
                                $this->db->rollback( __METHOD__ );
                                $status->fatal( 'config-install-user-grant-failed', $dbUser, $dqe->getText() );
                        }
@@ -594,7 +602,7 @@ class MysqlInstaller extends DatabaseInstaller {
                        $res = $this->db->selectRow( 'mysql.user', array( 'Host', 'User' ),
                                array( 'Host' => $host, 'User' => $user ), __METHOD__ );
                        return (bool)$res;
-               } catch( DBQueryError $dqe ) {
+               } catch ( DBQueryError $dqe ) {
                        return false;
                }
 
index 9978a92..1c22afb 100644 (file)
@@ -165,12 +165,10 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
                        array( 'doLogSearchPopulation' ),
                        array( 'addTable', 'l10n_cache',                        'patch-l10n_cache.sql' ),
-                       array( 'addTable', 'external_user',                     'patch-external_user.sql' ),
                        array( 'addIndex', 'log_search',    'ls_field_val',     'patch-log_search-rename-index.sql' ),
                        array( 'addIndex', 'change_tag',    'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
                        array( 'addField', 'redirect',      'rd_interwiki',     'patch-rd_interwiki.sql' ),
                        array( 'doUpdateTranscacheField' ),
-                       array( 'renameEuWikiId' ),
                        array( 'doUpdateMimeMinorField' ),
 
                        // 1.17
@@ -179,7 +177,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'addField', 'updatelog',     'ul_value',         'patch-ul_value.sql' ),
                        array( 'addField', 'interwiki',     'iw_api',           'patch-iw_api_and_wikiid.sql' ),
                        array( 'dropIndex', 'iwlinks',      'iwl_prefix',       'patch-kill-iwl_prefix.sql' ),
-                       array( 'dropIndex', 'iwlinks',      'iwl_prefix_from_title', 'patch-kill-iwl_pft.sql' ),
                        array( 'addField', 'categorylinks', 'cl_collation',     'patch-categorylinks-better-collation.sql' ),
                        array( 'doClFieldsUpdate' ),
                        array( 'doCollationUpdate' ),
@@ -229,6 +226,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
                        array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
                        array( 'addIndex', 'page_props', 'pp_propname_page',  'patch-page_props-propname-page-index.sql' ),
+                       array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
+
+                       // 1.22
+                       array( 'doIwlinksIndexNonUnique' ),
+                       array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',  'patch-iwlinks-from-title-index.sql' ),
                );
        }
 
@@ -329,7 +331,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        return;
                }
 
-               if( $this->applyPatch( 'patch-fix-il_from.sql', false, "Fixing ancient broken imagelinks table." ) ) {
+               if ( $this->applyPatch( 'patch-fix-il_from.sql', false, "Fixing ancient broken imagelinks table." ) ) {
                        $this->output( "NOTE: you will have to run maintenance/refreshLinks.php after this." );
                }
        }
@@ -366,7 +368,7 @@ class MysqlUpdater extends DatabaseUpdater {
                $this->output( wfTimestamp( TS_DB ) );
                $this->output( "......checking for duplicate entries.\n" );
 
-               list ( $cur, $old, $page, $revision, $text ) = $this->db->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' );
+               list( $cur, $old, $page, $revision, $text ) = $this->db->tableNamesN( 'cur', 'old', 'page', 'revision', 'text' );
 
                $rows = $this->db->query( "SELECT cur_title, cur_namespace, COUNT(cur_namespace) AS c
                                FROM $cur GROUP BY cur_title, cur_namespace HAVING c>1", __METHOD__ );
@@ -523,12 +525,12 @@ class MysqlUpdater extends DatabaseUpdater {
 
        protected function doNamespaceSize() {
                $tables = array(
-                       'page'          => 'page',
-                       'archive'       => 'ar',
+                       'page' => 'page',
+                       'archive' => 'ar',
                        'recentchanges' => 'rc',
-                       'watchlist'     => 'wl',
-                       'querycache'    => 'qc',
-                       'logging'       => 'log',
+                       'watchlist' => 'wl',
+                       'querycache' => 'qc',
+                       'logging' => 'log',
                );
                foreach ( $tables as $table => $prefix ) {
                        $field = $prefix . '_namespace';
@@ -649,7 +651,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        foreach ( $groups as $group ) {
                                $this->db->insert( 'user_groups',
                                        array(
-                                               'ug_user'  => $row->ur_user,
+                                               'ug_user' => $row->ur_user,
                                                'ug_group' => $group ),
                                        __METHOD__ );
                        }
@@ -684,7 +686,7 @@ class MysqlUpdater extends DatabaseUpdater {
                $this->db->query( "UPDATE $page SET page_random = RAND() WHERE page_random = 0", __METHOD__ );
                $rows = $this->db->affectedRows();
 
-               if( $rows ) {
+               if ( $rows ) {
                        $this->output( "Set page_random to a random value on $rows rows where it was set to 0\n" );
                } else {
                        $this->output( "...no page_random rows needed to be set\n" );
@@ -846,15 +848,6 @@ class MysqlUpdater extends DatabaseUpdater {
                return $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
        }
 
-       protected function renameEuWikiId() {
-               if ( $this->db->fieldExists( 'external_user', 'eu_local_id', __METHOD__ ) ) {
-                       $this->output( "...eu_wiki_id already renamed to eu_local_id.\n" );
-                       return;
-               }
-
-               $this->applyPatch( 'patch-eu_local_id.sql', false, "Renaming eu_wiki_id -> eu_local_id" );
-       }
-
        protected function doUpdateMimeMinorField() {
                if ( $this->updateRowExists( 'mime_minor_length' ) ) {
                        $this->output( "...*_mime_minor fields are already long enough.\n" );
@@ -901,4 +894,18 @@ class MysqlUpdater extends DatabaseUpdater {
 
                $this->applyPatch( 'patch-user-newtalk-timestamp-null.sql', false, "Making user_last_timestamp nullable" );
        }
+
+       protected function doIwlinksIndexNonUnique() {
+               $info = $this->db->indexInfo( 'iwlinks', 'iwl_prefix_title_from' );
+               if ( is_array( $info ) && $info[0]->Non_unique ) {
+                       $this->output( "...iwl_prefix_title_from index is already non-UNIQUE.\n" );
+                       return true;
+               }
+               if ( $this->skipSchema ) {
+                       $this->output( "...skipping schema change (making iwl_prefix_title_from index non-UNIQUE).\n" );
+                       return false;
+               }
+
+               return $this->applyPatch( 'patch-iwl_prefix_title_from-non-unique.sql', false, "Making iwl_prefix_title_from index non-UNIQUE" );
+       }
 }
index e853889..e34bed3 100644 (file)
@@ -59,16 +59,15 @@ class OracleInstaller extends DatabaseInstaller {
                if ( $this->getVar( 'wgDBserver' ) == 'localhost' ) {
                        $this->parent->setVar( 'wgDBserver', '' );
                }
-               return
-                       $this->getTextBox( 'wgDBserver', 'config-db-host-oracle', array(), $this->parent->getHelpBox( 'config-db-host-oracle-help' ) ) .
+               return $this->getTextBox( 'wgDBserver', 'config-db-host-oracle', array(), $this->parent->getHelpBox( 'config-db-host-oracle-help' ) ) .
                        Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
                        $this->getTextBox( 'wgDBprefix', 'config-db-prefix' ) .
                        $this->getTextBox( '_OracleDefTS', 'config-oracle-def-ts' ) .
                        $this->getTextBox( '_OracleTempTS', 'config-oracle-temp-ts', array(), $this->parent->getHelpBox( 'config-db-oracle-help' ) ) .
                        Html::closeElement( 'fieldset' ) .
-                       $this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ).
-                       $this->getInstallUserBox().
+                       $this->parent->getWarningBox( wfMessage( 'config-db-account-oracle-warn' )->text() ) .
+                       $this->getInstallUserBox() .
                        $this->getWebUserBox();
        }
 
@@ -87,7 +86,7 @@ class OracleInstaller extends DatabaseInstaller {
                $status = Status::newGood();
                if ( !strlen( $newValues['wgDBserver'] ) ) {
                        $status->fatal( 'config-missing-db-server-oracle' );
-               } elseif ( !preg_match( '/^[a-zA-Z0-9_\.]+$/', $newValues['wgDBserver'] ) ) {
+               } elseif ( !self::checkConnectStringFormat( $newValues['wgDBserver'] ) ) {
                        $status->fatal( 'config-invalid-db-server-oracle', $newValues['wgDBserver'] );
                }
                if ( !preg_match( '/^[a-zA-Z0-9_]*$/', $newValues['wgDBprefix'] ) ) {
@@ -297,4 +296,24 @@ class OracleInstaller extends DatabaseInstaller {
 ";
        }
 
+       /**
+        * Function checks the format of Oracle connect string
+        * The actual validity of the string is checked by attempting to connect
+        *
+        * Regex should be able to validate all connect string formats
+        * [//](host|tns_name)[:port][/service_name][:POOLED]
+        * http://www.orafaq.com/wiki/EZCONNECT
+        *
+        * @since 1.22
+        *
+        * @param string $connect_string
+        *
+        * @return bool Whether the connection string is valid.
+        */
+       public static function checkConnectStringFormat( $connect_string ) {
+               $isValid  = preg_match( '/^[[:alpha:]][\w\-]*(?:\.[[:alpha:]][\w\-]*){0,2}$/', $connect_string ); // TNS name
+               $isValid |= preg_match( '/^(?:\/\/)?[\w\-\.]+(?::[\d]+)?(?:\/(?:[\w\-\.]+(?::(pooled|dedicated|shared))?)?(?:\/[\w\-\.]+)?)?$/', $connect_string ); // EZConnect
+               return (bool)$isValid;
+       }
+
 }
index cafe8cd..be10e04 100644 (file)
@@ -183,7 +183,12 @@ class OracleUpdater extends DatabaseUpdater {
         * cascading taken in account in the deleting function
         */
        protected function doRecentchangesFK2Cascade() {
-               $meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \''.strtoupper($this->db->getDBname()).'\' AND constraint_name = \''.$this->db->tablePrefix().'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\'' );
+               $meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \'' .
+                       strtoupper( $this->db->getDBname() ) .
+                       '\' AND constraint_name = \'' .
+                       $this->db->tablePrefix() .
+                       'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\''
+               );
                $row = $meta->fetchRow();
                if ( $row ) {
                        return;
@@ -198,7 +203,12 @@ class OracleUpdater extends DatabaseUpdater {
        protected function doPageRestrictionsPKUKFix() {
                $this->output( "Altering PAGE_RESTRICTIONS keys ... " );
 
-               $meta = $this->db->query( 'SELECT column_name FROM all_cons_columns WHERE owner = \''.strtoupper($this->db->getDBname()).'\' AND constraint_name = \'MW_PAGE_RESTRICTIONS_PK\' AND rownum = 1' );
+               $meta = $this->db->query( 'SELECT column_name FROM all_cons_columns WHERE owner = \'' .
+                       strtoupper( $this->db->getDBname() ) .
+                       '\' AND constraint_name = \'' .
+                       $this->db->tablePrefix() .
+                       'PAGE_RESTRICTIONS_PK\' AND rownum = 1'
+               );
                $row = $meta->fetchRow();
                if ( $row['column_name'] == 'PR_ID' ) {
                        $this->output( "seems to be up to date.\n" );
@@ -234,7 +244,7 @@ class OracleUpdater extends DatabaseUpdater {
                # We can't guarantee that the user will be able to use TRUNCATE,
                # but we know that DELETE is available to us
                $this->output( "Purging caches..." );
-               $this->db->delete( '/*Q*/'.$this->db->tableName( 'objectcache' ), '*', __METHOD__ );
+               $this->db->delete( '/*Q*/' . $this->db->tableName( 'objectcache' ), '*', __METHOD__ );
                $this->output( "done.\n" );
        }
 
index 4e5ae8c..3747189 100644 (file)
@@ -56,8 +56,7 @@ class PostgresInstaller extends DatabaseInstaller {
        }
 
        function getConnectForm() {
-               return
-                       $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
+               return $this->getTextBox( 'wgDBserver', 'config-db-host', array(), $this->parent->getHelpBox( 'config-db-host-help' ) ) .
                        $this->getTextBox( 'wgDBport', 'config-db-port' ) .
                        Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-wiki-settings' )->text() ) .
@@ -137,7 +136,8 @@ class PostgresInstaller extends DatabaseInstaller {
                                $this->getVar( 'wgDBserver' ),
                                $user,
                                $password,
-                               $dbName);
+                               $dbName
+                       );
                        $status->value = $db;
                } catch ( DBConnectionError $e ) {
                        $status->fatal( 'config-connection-error', $e->getMessage() );
@@ -431,7 +431,7 @@ class PostgresInstaller extends DatabaseInstaller {
                        'callback' => array( $this, 'setupSchema' )
                );
 
-               if( $this->getVar( '_CreateDBAccount' ) ) {
+               if ( $this->getVar( '_CreateDBAccount' ) ) {
                        $this->parent->addInstallStep( $createDbAccount, 'database' );
                }
                $this->parent->addInstallStep( $commitCB, 'interwiki' );
@@ -469,7 +469,7 @@ class PostgresInstaller extends DatabaseInstaller {
                $schema = $this->getVar( 'wgDBmwschema' );
                $safeschema = $conn->addIdentifierQuotes( $schema );
                $safeuser = $conn->addIdentifierQuotes( $this->getVar( 'wgDBuser' ) );
-               if( !$conn->schemaExists( $schema ) ) {
+               if ( !$conn->schemaExists( $schema ) ) {
                        try {
                                $conn->query( "CREATE SCHEMA $safeschema AUTHORIZATION $safeuser" );
                        } catch ( DBQueryError $e ) {
@@ -557,7 +557,7 @@ class PostgresInstaller extends DatabaseInstaller {
                 */
                $conn = $status->value;
 
-               if( $conn->tableExists( 'archive' ) ) {
+               if ( $conn->tableExists( 'archive' ) ) {
                        $status->warning( 'config-install-tables-exist' );
                        $this->enableLB();
                        return $status;
@@ -565,12 +565,12 @@ class PostgresInstaller extends DatabaseInstaller {
 
                $conn->begin( __METHOD__ );
 
-               if( !$conn->schemaExists( $schema ) ) {
+               if ( !$conn->schemaExists( $schema ) ) {
                        $status->fatal( 'config-install-pg-schema-not-exist' );
                        return $status;
                }
                $error = $conn->sourceFile( $conn->getSchemaPath() );
-               if( $error !== true ) {
+               if ( $error !== true ) {
                        $conn->reportQueryError( $error, 0, '', __METHOD__ );
                        $conn->rollback( __METHOD__ );
                        $status->fatal( 'config-install-tables-failed', $error );
@@ -578,7 +578,7 @@ class PostgresInstaller extends DatabaseInstaller {
                        $conn->commit( __METHOD__ );
                }
                // Resume normal operations
-               if( $status->isOk() ) {
+               if ( $status->isOk() ) {
                        $this->enableLB();
                }
                return $status;
index 0a4b5e6..58a54c4 100644 (file)
@@ -46,9 +46,9 @@ class PostgresUpdater extends DatabaseUpdater {
                        # r15791 Change reserved word table names "user" and "text"
                        array( 'renameTable', 'user', 'mwuser' ),
                        array( 'renameTable', 'text', 'pagecontent' ),
-                       array( 'renameIndex', 'mwuser', 'user_pkey', 'mwuser_pkey'),
+                       array( 'renameIndex', 'mwuser', 'user_pkey', 'mwuser_pkey' ),
                        array( 'renameIndex', 'mwuser', 'user_user_name_key', 'mwuser_user_name_key' ),
-                       array( 'renameIndex', 'pagecontent','text_pkey', 'pagecontent_pkey' ),
+                       array( 'renameIndex', 'pagecontent', 'text_pkey', 'pagecontent_pkey' ),
 
                        # renamed sequences
                        array( 'renameSequence', 'ipblocks_ipb_id_val', 'ipblocks_ipb_id_seq'         ),
@@ -89,7 +89,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addTable', 'module_deps',       'patch-module_deps.sql' ),
                        array( 'addTable', 'uploadstash',       'patch-uploadstash.sql' ),
                        array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ),
-                       array( 'addTable', 'external_user',     'patch-external_user.sql' ),
                        array( 'addTable', 'sites',             'patch-sites.sql' ),
 
                        # Needed before new field
@@ -232,6 +231,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgIndex', 'watchlist',     'wl_user',                '(wl_user)' ),
                        array( 'addPgIndex', 'logging',       'logging_user_type_time', '(log_user, log_type, log_timestamp)' ),
                        array( 'addPgIndex', 'logging',       'logging_page_id_time',   '(log_page,log_timestamp)' ),
+                       array( 'addPgIndex', 'iwlinks',       'iwl_prefix_from_title',  '(iwl_prefix, iwl_from, iwl_title)' ),
                        array( 'addPgIndex', 'iwlinks',       'iwl_prefix_title_from',  '(iwl_prefix, iwl_title, iwl_from)' ),
                        array( 'addPgIndex', 'job',           'job_timestamp_idx',      '(job_timestamp)' ),
                        array( 'addPgIndex', 'job',           'job_sha1',               '(job_sha1)' ),
@@ -251,6 +251,12 @@ class PostgresUpdater extends DatabaseUpdater {
                                array( 'cl_from', 'int4_ops', 'btree', 0 ),
                        ),
                        'CREATE INDEX cl_sortkey ON "categorylinks" USING "btree" ("cl_to", "cl_sortkey", "cl_from")' ),
+                       array( 'checkIndex', 'iwl_prefix_title_from', array(
+                               array( 'iwl_prefix', 'text_ops', 'btree', 0 ),
+                               array( 'iwl_title', 'text_ops', 'btree', 0 ),
+                               array( 'iwl_from', 'int4_ops', 'btree', 0 ),
+                       ),
+                       'CREATE INDEX iwl_prefix_title_from ON "iwlinks" USING "btree" ("iwl_prefix", "iwl_title", "iwl_from")' ),
                        array( 'checkIndex', 'logging_times', array(
                                array( 'log_timestamp', 'timestamptz_ops', 'btree', 0 ),
                        ),
@@ -302,11 +308,11 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'checkOiNameConstraint' ),
                        array( 'checkPageDeletedTrigger' ),
                        array( 'checkRevUserFkey' ),
-                       array( 'dropIndex', 'ipblocks', 'ipb_address'),
+                       array( 'dropIndex', 'ipblocks', 'ipb_address' ),
                        array( 'checkIndex', 'ipb_address_unique', array(
                                array( 'ipb_address', 'text_ops', 'btree', 0 ),
-                               array( 'ipb_user',    'int4_ops', 'btree', 0 ),
-                               array( 'ipb_auto',    'int2_ops', 'btree', 0 ),
+                               array( 'ipb_user', 'int4_ops', 'btree', 0 ),
+                               array( 'ipb_auto', 'int2_ops', 'btree', 0 ),
                                array( 'ipb_anon_only', 'int2_ops', 'btree', 0 ),
                        ),
                        'CREATE UNIQUE INDEX ipb_address_unique ON ipblocks (ipb_address,ipb_user,ipb_auto,ipb_anon_only)' ),
@@ -509,7 +515,7 @@ END;
                if ( !$this->db->sequenceExists( $ns ) ) {
                        $this->output( "Creating sequence $ns\n" );
                        $this->db->query( "CREATE SEQUENCE $ns" );
-                       if( $pkey !== false ) {
+                       if ( $pkey !== false ) {
                                $this->setDefault( $table, $pkey, '"nextval"(\'"' . $ns . '"\'::"regclass")' );
                        }
                }
@@ -532,7 +538,7 @@ END;
                        $old = $this->db->realTableName( $old, "quoted" );
                        $new = $this->db->realTableName( $new, "quoted" );
                        $this->db->query( "ALTER TABLE $old RENAME TO $new" );
-                       if( $patch !== false ) {
+                       if ( $patch !== false ) {
                                $this->applyPatch( $patch );
                        }
                }
@@ -586,9 +592,9 @@ END;
                        exit( 1 );
                }
 
-               if ( $fi->type() === $newtype )
+               if ( $fi->type() === $newtype ) {
                        $this->output( "...column '$table.$field' is already of type '$newtype'\n" );
-               else {
+               else {
                        $this->output( "Changing column type of '$table.$field' from '{$fi->type()}' to '$newtype'\n" );
                        $sql = "ALTER TABLE $table ALTER $field TYPE $newtype";
                        if ( strlen( $default ) ) {
@@ -613,7 +619,7 @@ END;
                }
        }
 
-       protected function changeNullableField( $table, $field, $null) {
+       protected function changeNullableField( $table, $field, $null ) {
                $fi = $this->db->fieldInfo( $table, $field );
                if ( is_null( $fi ) ) {
                        $this->output( "...ERROR: expected column $table.$field to exist\n" );
@@ -738,7 +744,7 @@ END;
        protected function dropIndex( $table, $index, $patch = '', $fullpath = false ) {
                if ( $this->db->indexExists( $table, $index ) ) {
                        $this->output( "Dropping obsolete index '$index'\n" );
-                       $this->db->query( "DROP INDEX \"". $index ."\"" );
+                       $this->db->query( "DROP INDEX \"" . $index . "\"" );
                }
        }
 
@@ -746,7 +752,7 @@ END;
                $pu = $this->db->indexAttributes( $index );
                if ( !empty( $pu ) && $pu != $should_be ) {
                        $this->output( "Dropping obsolete version of index '$index'\n" );
-                       $this->db->query( "DROP INDEX \"". $index ."\"" );
+                       $this->db->query( "DROP INDEX \"" . $index . "\"" );
                        $pu = array();
                } else {
                        $this->output( "...no need to drop index '$index'\n" );
@@ -770,7 +776,7 @@ END;
 
        protected function checkIwlPrefix() {
                if ( $this->db->indexExists( 'iwlinks', 'iwl_prefix' ) ) {
-                       $this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_from_title'" );
+                       $this->applyPatch( 'patch-rename-iwl_prefix.sql', false, "Replacing index 'iwl_prefix' with 'iwl_prefix_title_from'" );
                }
        }
 
index 68df6ab..50a7181 100644 (file)
@@ -60,7 +60,7 @@ class SqliteInstaller extends DatabaseInstaller {
                        $result->fatal( 'config-outdated-sqlite', $db->getServerVersion(), self::MINIMUM_VERSION );
                }
                // Check for FTS3 full-text search module
-               if( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
+               if ( DatabaseSqlite::getFulltextSearchModule() != 'FTS3' ) {
                        $result->warning( 'config-no-fts3' );
                }
                return $result;
index 47650b6..28d8d66 100644 (file)
@@ -49,7 +49,6 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'doLogUsertextPopulation' ), # listed separately from the previous update because 1.16 was released without this update
                        array( 'doLogSearchPopulation' ),
                        array( 'addTable', 'l10n_cache',                        'patch-l10n_cache.sql' ),
-                       array( 'addTable', 'external_user',                     'patch-external_user.sql' ),
                        array( 'addIndex', 'log_search',    'ls_field_val',     'patch-log_search-rename-index.sql' ),
                        array( 'addIndex', 'change_tag',    'change_tag_rc_tag', 'patch-change_tag-indexes.sql' ),
                        array( 'addField', 'redirect',      'rd_interwiki',     'patch-rd_interwiki.sql' ),
@@ -62,7 +61,6 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'addField', 'updatelog', 'ul_value',             'patch-ul_value.sql' ),
                        array( 'addField', 'interwiki',     'iw_api',           'patch-iw_api_and_wikiid.sql' ),
                        array( 'dropIndex', 'iwlinks', 'iwl_prefix',            'patch-kill-iwl_prefix.sql' ),
-                       array( 'dropIndex', 'iwlinks', 'iwl_prefix_from_title', 'patch-kill-iwl_pft.sql' ),
                        array( 'addField', 'categorylinks', 'cl_collation',     'patch-categorylinks-better-collation.sql' ),
                        array( 'doCollationUpdate' ),
                        array( 'addTable', 'msg_resource',                      'patch-msg_resource.sql' ),
@@ -109,6 +107,8 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ),
                        array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase-255.sql' ),
                        array( 'addIndex', 'page_props', 'pp_propname_page',  'patch-page_props-propname-page-index.sql' ),
+                       array( 'addIndex', 'image', 'img_media_mime', 'patch-img_media_mime-index.sql' ),
+                       array( 'addIndex', 'iwlinks', 'iwl_prefix_from_title',  'patch-iwlinks-from-title-index.sql' ),
                );
        }
 
index 35d649b..10c7b96 100644 (file)
@@ -154,7 +154,7 @@ class WebInstaller extends Installer {
                $this->exportVars();
                $this->setupLanguage();
 
-               if( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
+               if ( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
                        && $this->request->getVal( 'localsettings' ) )
                {
                        $this->request->response()->header( 'Content-type: application/x-httpd-php' );
@@ -164,7 +164,7 @@ class WebInstaller extends Installer {
 
                        $ls = InstallerOverrides::getLocalSettingsGenerator( $this );
                        $rightsProfile = $this->rightsProfiles[$this->getVar( '_RightsProfile' )];
-                       foreach( $rightsProfile as $group => $rightsArr ) {
+                       foreach ( $rightsProfile as $group => $rightsArr ) {
                                $ls->setGroupRights( $group, $rightsArr );
                        }
                        echo $ls->getText();
@@ -172,7 +172,7 @@ class WebInstaller extends Installer {
                }
 
                $cssDir = $this->request->getVal( 'css' );
-               if( $cssDir ) {
+               if ( $cssDir ) {
                        $cssDir = ( $cssDir == 'rtl' ? 'rtl' : 'ltr' );
                        $this->request->response()->header( 'Content-type: text/css' );
                        echo $this->output->getCSS( $cssDir );
@@ -250,7 +250,7 @@ class WebInstaller extends Installer {
                                do {
                                        $nextPageId--;
                                        $nextPage = $this->pageSequence[$nextPageId];
-                               } while( isset( $this->skippedPages[$nextPage] ) );
+                               } while ( isset( $this->skippedPages[$nextPage] ) );
                        } else {
                                $nextPage = $this->pageSequence[$lowestUnhappy];
                        }
@@ -263,7 +263,7 @@ class WebInstaller extends Installer {
                $this->currentPageName = $page->getName();
                $this->startPageWrapper( $pageName );
 
-               if( $page->isSlow() ) {
+               if ( $page->isSlow() ) {
                        $this->disableTimeLimit();
                }
 
@@ -324,7 +324,7 @@ class WebInstaller extends Installer {
         * @return bool
         */
        public function startSession() {
-               if( wfIniGetBool( 'session.auto_start' ) || session_id() ) {
+               if ( wfIniGetBool( 'session.auto_start' ) || session_id() ) {
                        // Done already
                        return true;
                }
@@ -353,7 +353,7 @@ class WebInstaller extends Installer {
        public function getFingerprint() {
                // Get the base URL of the installation
                $url = $this->request->getFullRequestURL();
-               if ( preg_match( '!^(.*\?)!', $url, $m) ) {
+               if ( preg_match( '!^(.*\?)!', $url, $m ) ) {
                        // Trim query string
                        $url = $m[1];
                }
@@ -640,7 +640,7 @@ class WebInstaller extends Installer {
         */
        public function getInfoBox( $text, $icon = false, $class = false ) {
                $text = $this->parse( $text, true );
-               $icon = ( $icon == false ) ? '../skins/common/images/info-32.png' : '../skins/common/images/'.$icon;
+               $icon = ( $icon == false ) ? '../skins/common/images/info-32.png' : '../skins/common/images/' . $icon;
                $alt = wfMessage( 'config-information' )->text();
                return Html::infoBox( $text, $icon, $alt, $class, false );
        }
@@ -724,8 +724,7 @@ class WebInstaller extends Installer {
                        $attributes['for'] = $forId;
                }
 
-               return
-                       "<div class=\"config-block\">\n" .
+               return "<div class=\"config-block\">\n" .
                        "  <div class=\"config-block-label\">\n" .
                        Xml::tags( 'label',
                                $attributes,
@@ -767,8 +766,7 @@ class WebInstaller extends Installer {
                if ( !isset( $params['help'] ) ) {
                        $params['help'] = "";
                }
-               return
-                       $this->label(
+               return $this->label(
                                $params['label'],
                                $params['controlName'],
                                Xml::input(
@@ -814,8 +812,7 @@ class WebInstaller extends Installer {
                if ( !isset( $params['help'] ) ) {
                        $params['help'] = "";
                }
-               return
-                       $this->label(
+               return $this->label(
                                $params['label'],
                                $params['controlName'],
                                Xml::textarea(
@@ -892,14 +889,13 @@ class WebInstaller extends Installer {
                if ( !isset( $params['help'] ) ) {
                        $params['help'] = "";
                }
-               if( isset( $params['rawtext'] ) ) {
+               if ( isset( $params['rawtext'] ) ) {
                        $labelText = $params['rawtext'];
                } else {
                        $labelText = $this->parse( wfMessage( $params['label'] )->text() );
                }
 
-               return
-                       "<div class=\"config-input-check\">\n" .
+               return "<div class=\"config-input-check\">\n" .
                        $params['help'] .
                        "<label>\n" .
                        Xml::check(
@@ -987,10 +983,10 @@ class WebInstaller extends Installer {
         * @param $status Status
         */
        public function showStatusBox( $status ) {
-               if( !$status->isGood() ) {
+               if ( !$status->isGood() ) {
                        $text = $status->getWikiText();
 
-                       if( $status->isOk() ) {
+                       if ( $status->isOk() ) {
                                $box = $this->getWarningBox( $text );
                        } else {
                                $box = $this->getErrorBox( $text );
@@ -1071,7 +1067,7 @@ class WebInstaller extends Installer {
         * @param $parser
         * @return String Html for download link
         */
-       public function downloadLinkHook( $text, $attribs, $parser  ) {
+       public function downloadLinkHook( $text, $attribs, $parser ) {
                $img = Html::element( 'img', array(
                        'src' => '../skins/common/images/download-32.png',
                        'width' => '32',
index d61d843..3e65eae 100644 (file)
@@ -146,7 +146,7 @@ class WebInstallerOutput {
                }
                wfRestoreWarnings();
 
-               if( $dir == 'rtl' ) {
+               if ( $dir == 'rtl' ) {
                        $css = CSSJanus::transform( $css, true );
                }
 
@@ -223,7 +223,7 @@ class WebInstallerOutput {
                        $this->parent->request->response()->header( 'X-Frame-Options: DENY' );
                }
                if ( $this->redirectTarget ) {
-                       $this->parent->request->response()->header( 'Location: '.$this->redirectTarget );
+                       $this->parent->request->response()->header( 'Location: ' . $this->redirectTarget );
                        return;
                }
 
index 93092e3..8a9fc2d 100644 (file)
@@ -84,12 +84,14 @@ abstract class WebInstallerPage {
 
                if ( $continue ) {
                        // Fake submit button for enter keypress (bug 26267)
+                       // Give grep a chance to find the usages: config-continue
                        $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
                                array( 'name' => "enter-$continue", 'style' =>
                                        'visibility:hidden;overflow:hidden;width:1px;margin:0' ) ) . "\n";
                }
 
                if ( $back ) {
+                       // Give grep a chance to find the usages: config-back
                        $s .= Xml::submitButton( wfMessage( "config-$back" )->text(),
                                array(
                                        'name' => "submit-$back",
@@ -98,6 +100,7 @@ abstract class WebInstallerPage {
                }
 
                if ( $continue ) {
+                       // Give grep a chance to find the usages: config-continue
                        $s .= Xml::submitButton( wfMessage( "config-$continue" )->text(),
                                array(
                                        'name' => "submit-$continue",
@@ -251,7 +254,9 @@ class WebInstaller_Language extends WebInstallerPage {
                $languages = Language::fetchLanguageNames();
                ksort( $languages );
                foreach ( $languages as $code => $lang ) {
-                       if ( isset( $wgDummyLanguageCodes[$code] ) ) continue;
+                       if ( isset( $wgDummyLanguageCodes[$code] ) ) {
+                               continue;
+                       }
                        $s .= "\n" . Xml::option( "$code - $lang", $code, $code == $selectedCode );
                }
                $s .= "\n</select>\n";
@@ -307,7 +312,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
                $r = $this->parent->request;
                if ( $r->wasPosted() ) {
                        $key = $r->getText( 'config_wgUpgradeKey' );
-                       if( !$key || $key !== $vars['wgUpgradeKey'] ) {
+                       if ( !$key || $key !== $vars['wgUpgradeKey'] ) {
                                $this->parent->showError( 'config-localsettings-badkey' );
                                $this->showKeyForm();
                                return 'output';
@@ -333,7 +338,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
        protected function showKeyForm() {
                $this->startForm();
                $this->addHTML(
-                       $this->parent->getInfoBox( wfMessage( 'config-localsettings-upgrade' )->plain() ).
+                       $this->parent->getInfoBox( wfMessage( 'config-localsettings-upgrade' )->plain() ) .
                        '<br />' .
                        $this->parent->getTextBox( array(
                                'var' => 'wgUpgradeKey',
@@ -452,15 +457,24 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                $settings = '';
                $defaultType = $this->getVar( 'wgDBtype' );
 
+               // Give grep a chance to find the usages:
+               // config-support-mysql, config-support-postgres, config-support-oracle, config-support-sqlite
                $dbSupport = '';
-               foreach( $this->parent->getDBTypes() as $type ) {
+               foreach ( $this->parent->getDBTypes() as $type ) {
                        $link = DatabaseBase::factory( $type )->getSoftwareLink();
                        $dbSupport .= wfMessage( "config-support-$type", $link )->plain() . "\n";
                }
                $this->addHTML( $this->parent->getInfoBox(
                        wfMessage( 'config-support-info', trim( $dbSupport ) )->text() ) );
 
-               foreach ( $this->parent->getVar( '_CompiledDBs' ) as $type ) {
+               // It's possible that the library for the default DB type is not compiled in.
+               // In that case, instead select the first supported DB type in the list.
+               $compiledDBs = $this->parent->getVar( '_CompiledDBs' );
+               if ( !in_array( $defaultType, $compiledDBs ) ) {
+                       $defaultType = $compiledDBs[0];
+               }
+
+               foreach ( $compiledDBs as $type ) {
                        $installer = $this->parent->getDBInstaller( $type );
                        $types .=
                                '<li>' .
@@ -474,6 +488,8 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                                ) .
                                "</li>\n";
 
+                       // Give grep a chance to find the usages:
+                       // config-header-mysql, config-header-postgres, config-header-oracle, config-header-sqlite
                        $settings .=
                                Html::openElement( 'div', array( 'id' => 'DB_wrapper_' . $type,
                                                'class' => 'dbWrapper' ) ) .
@@ -494,6 +510,9 @@ class WebInstaller_DBConnect extends WebInstallerPage {
        public function submit() {
                $r = $this->parent->request;
                $type = $r->getVal( 'DBType' );
+               if ( !$type ) {
+                       return Status::newFatal( 'config-invalid-db-type' );
+               }
                $this->setVar( 'wgDBtype', $type );
                $installer = $this->parent->getDBInstaller( $type );
                if ( !$installer ) {
@@ -545,7 +564,7 @@ class WebInstaller_Upgrade extends WebInstallerPage {
                        if ( $result ) {
                                // If they're going to possibly regenerate LocalSettings, we
                                // need to create the upgrade/secret keys. Bug 26481
-                               if( !$this->getVar( '_ExistingDBSettings' ) ) {
+                               if ( !$this->getVar( '_ExistingDBSettings' ) ) {
                                        $this->parent->generateKeys();
                                }
                                $this->setVar( '_UpgradeDone', true );
@@ -647,6 +666,9 @@ class WebInstaller_Name extends WebInstallerPage {
                                'label' => 'config-site-name',
                                'help' => $this->parent->getHelpBox( 'config-site-name-help' )
                        ) ) .
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-ns-site-name, config-ns-generic, config-ns-other
                        $this->parent->getRadioSet( array(
                                'var' => '_NamespaceType',
                                'label' => 'config-project-namespace',
@@ -688,6 +710,9 @@ class WebInstaller_Name extends WebInstallerPage {
                        ) ) .
                        $this->getFieldSetEnd() .
                        $this->parent->getInfoBox( wfMessage( 'config-almost-done' )->text() ) .
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-optional-continue, config-optional-skip
                        $this->parent->getRadioSet( array(
                                'var' => '_SkipOptional',
                                'itemLabelPrefix' => 'config-optional-',
@@ -751,7 +776,7 @@ class WebInstaller_Name extends WebInstallerPage {
                // Make sure it won't conflict with any existing namespaces
                global $wgContLang;
                $nsIndex = $wgContLang->getNsIndex( $name );
-               if( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
+               if ( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
                        $this->parent->showError( 'config-ns-conflict', $name );
                        $retVal = false;
                }
@@ -799,13 +824,13 @@ class WebInstaller_Name extends WebInstallerPage {
 
                // Validate e-mail if provided
                $email = $this->getVar( '_AdminEmail' );
-               if( $email && !Sanitizer::validateEmail( $email ) ) {
+               if ( $email && !Sanitizer::validateEmail( $email ) ) {
                        $this->parent->showError( 'config-admin-error-bademail' );
                        $retVal = false;
                }
                // If they asked to subscribe to mediawiki-announce but didn't give
                // an e-mail, show an error. Bug 29332
-               if( !$email && $this->getVar( '_Subscribe' ) ) {
+               if ( !$email && $this->getVar( '_Subscribe' ) ) {
                        $this->parent->showError( 'config-subscribe-noemail' );
                        $retVal = false;
                }
@@ -831,6 +856,9 @@ class WebInstaller_Options extends WebInstallerPage {
                $this->startForm();
                $this->addHTML(
                        # User Rights
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-profile-wiki, config-profile-no-anon, config-profile-fishbowl, config-profile-private
                        $this->parent->getRadioSet( array(
                                'var' => '_RightsProfile',
                                'label' => 'config-profile',
@@ -840,6 +868,11 @@ class WebInstaller_Options extends WebInstallerPage {
                        $this->parent->getInfoBox( wfMessage( 'config-profile-help' )->plain() ) .
 
                        # Licensing
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // For grep: The following messages are used as the item labels:
+                       // config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+                       // config-license-cc-0, config-license-pd, config-license-gfdl,
+                       // config-license-none, config-license-cc-choose
                        $this->parent->getRadioSet( array(
                                'var' => '_LicenseCode',
                                'label' => 'config-license',
@@ -890,10 +923,10 @@ class WebInstaller_Options extends WebInstallerPage {
 
                $extensions = $this->parent->findExtensions();
 
-               if( $extensions ) {
+               if ( $extensions ) {
                        $extHtml = $this->getFieldSetStart( 'config-extensions' );
 
-                       foreach( $extensions as $ext ) {
+                       foreach ( $extensions as $ext ) {
                                $extHtml .= $this->parent->getCheckBox( array(
                                        'var' => "ext-$ext",
                                        'rawtext' => $ext,
@@ -912,6 +945,10 @@ class WebInstaller_Options extends WebInstallerPage {
                                $this->getVar( 'wgDeletedDirectory' )
                        )
                );
+               // If we're using the default, let the user set it relative to $wgScriptPath
+               $curLogo = $this->getVar( 'wgLogo' );
+               $logoString = ( $curLogo == "/wiki/skins/common/images/wiki.png" ) ?
+                       '$wgStylePath/common/images/wiki.png' : $curLogo;
 
                $uploadwrapperStyle = $this->getVar( 'wgEnableUploads' ) ? '' : 'display: none';
                $this->addHTML(
@@ -933,6 +970,7 @@ class WebInstaller_Options extends WebInstallerPage {
                        '</div>' .
                        $this->parent->getTextBox( array(
                                'var' => 'wgLogo',
+                               'value' => $logoString,
                                'label' => 'config-logo',
                                'attribs' => array( 'dir' => 'ltr' ),
                                'help' => $this->parent->getHelpBox( 'config-logo-help' )
@@ -948,7 +986,7 @@ class WebInstaller_Options extends WebInstallerPage {
                );
 
                $caches = array( 'none' );
-               if( count( $this->getVar( '_Caches' ) ) ) {
+               if ( count( $this->getVar( '_Caches' ) ) ) {
                        $caches[] = 'accel';
                }
                $caches[] = 'memcached';
@@ -961,11 +999,14 @@ class WebInstaller_Options extends WebInstallerPage {
                        // or going back!
                        $cacheval = 'none';
                }
-               $hidden = ($cacheval == 'memcached') ? '' : 'display: none';
+               $hidden = ( $cacheval == 'memcached' ) ? '' : 'display: none';
                $this->addHTML(
                        # Advanced settings
                        $this->getFieldSetStart( 'config-advanced-settings' ) .
                        # Object cache settings
+                       // getRadioSet() builds a set of labeled radio buttons.
+                       // 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',
                                'label' => 'config-cache-options',
@@ -1025,10 +1066,9 @@ class WebInstaller_Options extends WebInstallerPage {
                } else {
                        $iframeAttribs['src'] = $this->getCCPartnerUrl();
                }
-               $wrapperStyle = ($this->getVar( '_LicenseCode' ) == 'cc-choose') ? '' : 'display: none';
+               $wrapperStyle = ( $this->getVar( '_LicenseCode' ) == 'cc-choose' ) ? '' : 'display: none';
 
-               return
-                       "<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
+               return "<div class=\"config-cc-wrapper\" id=\"config-cc-wrapper\" style=\"$wrapperStyle\">\n" .
                        Html::element( 'iframe', $iframeAttribs, '', false /* not short */ ) .
                        "</div>\n";
        }
@@ -1038,13 +1078,12 @@ class WebInstaller_Options extends WebInstallerPage {
                // If you change this height, also change it in config.css
                $expandJs = str_replace( '$1', '54em', $js );
                $reduceJs = str_replace( '$1', '70px', $js );
-               return
-                       '<p>'.
+               return '<p>' .
                        Html::element( 'img', array( 'src' => $this->getVar( 'wgRightsIcon' ) ) ) .
                        '&#160;&#160;' .
                        htmlspecialchars( $this->getVar( 'wgRightsText' ) ) .
                        "</p>\n" .
-                       "<p style=\"text-align: center\">" .
+                       "<p style=\"text-align: center;\">" .
                        Html::element( 'a',
                                array(
                                        'href' => $this->getCCPartnerUrl(),
@@ -1053,7 +1092,7 @@ class WebInstaller_Options extends WebInstallerPage {
                                wfMessage( 'config-cc-again' )->text()
                        ) .
                        "</p>\n" .
-                       "<script type=\"text/javascript\">\n" .
+                       "<script>\n" .
                        # Reduce the wrapper div height
                        htmlspecialchars( $reduceJs ) .
                        "\n" .
@@ -1092,6 +1131,10 @@ class WebInstaller_Options extends WebInstallerPage {
                                return false;
                        }
                } elseif ( in_array( $code, array_keys( $this->parent->licenses ) ) ) {
+                       // Give grep a chance to find the usages:
+                       // config-license-cc-by, config-license-cc-by-sa, config-license-cc-by-nc-sa,
+                       // config-license-cc-0, config-license-pd, config-license-gfdl,
+                       // config-license-none, config-license-cc-choose
                        $entry = $this->parent->licenses[$code];
                        if ( isset( $entry['text'] ) ) {
                                $this->setVar( 'wgRightsText', $entry['text'] );
@@ -1108,31 +1151,31 @@ class WebInstaller_Options extends WebInstallerPage {
 
                $extsAvailable = $this->parent->findExtensions();
                $extsToInstall = array();
-               foreach( $extsAvailable as $ext ) {
-                       if( $this->parent->request->getCheck( 'config_ext-' . $ext ) ) {
+               foreach ( $extsAvailable as $ext ) {
+                       if ( $this->parent->request->getCheck( 'config_ext-' . $ext ) ) {
                                $extsToInstall[] = $ext;
                        }
                }
                $this->parent->setVar( '_Extensions', $extsToInstall );
 
-               if( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
+               if ( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
                        $memcServers = explode( "\n", $this->getVar( '_MemCachedServers' ) );
-                       if( !$memcServers ) {
+                       if ( !$memcServers ) {
                                $this->parent->showError( 'config-memcache-needservers' );
                                return false;
                        }
 
-                       foreach( $memcServers as $server ) {
+                       foreach ( $memcServers as $server ) {
                                $memcParts = explode( ":", $server, 2 );
                                if ( !isset( $memcParts[0] )
                                                || ( !IP::isValid( $memcParts[0] )
                                                        && ( gethostbyname( $memcParts[0] ) == $memcParts[0] ) ) ) {
                                        $this->parent->showError( 'config-memcache-badip', $memcParts[0] );
                                        return false;
-                               } elseif( !isset( $memcParts[1] )  ) {
+                               } elseif ( !isset( $memcParts[1] ) ) {
                                        $this->parent->showError( 'config-memcache-noport', $memcParts[0] );
                                        return false;
-                               } elseif( $memcParts[1] < 1 || $memcParts[1] > 65535 ) {
+                               } elseif ( $memcParts[1] < 1 || $memcParts[1] > 65535 ) {
                                        $this->parent->showError( 'config-memcache-badport', 1, 65535 );
                                        return false;
                                }
@@ -1149,11 +1192,11 @@ class WebInstaller_Install extends WebInstallerPage {
        }
 
        public function execute() {
-               if( $this->getVar( '_UpgradeDone' ) ) {
+               if ( $this->getVar( '_UpgradeDone' ) ) {
                        return 'skip';
-               } elseif( $this->getVar( '_InstallDone' ) ) {
+               } elseif ( $this->getVar( '_InstallDone' ) ) {
                        return 'continue';
-               } elseif( $this->parent->request->wasPosted() ) {
+               } elseif ( $this->parent->request->wasPosted() ) {
                        $this->startForm();
                        $this->addHTML( "<ul>" );
                        $results = $this->parent->performInstallation(
@@ -1196,7 +1239,7 @@ class WebInstaller_Install extends WebInstallerPage {
                        $html = "<span class=\"error\">$html</span>";
                }
                $this->addHTML( $html . "</li>\n" );
-               if( !$status->isGood() ) {
+               if ( !$status->isGood() ) {
                        $this->parent->showStatusBox( $status );
                }
        }
@@ -1212,9 +1255,8 @@ class WebInstaller_Complete extends WebInstallerPage {
                if ( isset( $_SERVER['HTTP_USER_AGENT'] ) &&
                         strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false ) {
                        // JS appears the only method that works consistently with IE7+
-                       $this->addHtml( "\n<script type=\"" . $GLOBALS['wgJsMimeType'] .
-                               '">jQuery( document ).ready( function() { document.location=' .
-                               Xml::encodeJsVar( $lsUrl) . "; } );</script>\n" );
+                       $this->addHtml( "\n<script>jQuery( document ).ready( function () { document.location = " .
+                               Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
                } else {
                        $this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
                }
@@ -1232,6 +1274,9 @@ class WebInstaller_Complete extends WebInstallerPage {
                                )->plain(), 'tick-32.png'
                        )
                );
+               $this->addHTML( $this->parent->getInfoBox(
+                       wfMessage( 'config-extension-link' )->text() ) );
+
                $this->parent->restoreLinkPopups();
                $this->endForm( false, false );
        }
@@ -1271,7 +1316,7 @@ abstract class WebInstaller_Document extends WebInstallerPage {
 
        public function getFileContents() {
                $file = __DIR__ . '/../../' . $this->getFileName();
-               if( ! file_exists( $file ) ) {
+               if ( ! file_exists( $file ) ) {
                        return wfMessage( 'config-nofile', $file )->plain();
                }
                return file_get_contents( $file );
@@ -1280,14 +1325,16 @@ abstract class WebInstaller_Document extends WebInstallerPage {
 }
 
 class WebInstaller_Readme extends WebInstaller_Document {
-       protected function getFileName() { return 'README'; }
+       protected function getFileName() {
+               return 'README';
+       }
 }
 
 class WebInstaller_ReleaseNotes extends WebInstaller_Document {
        protected function getFileName() {
                global $wgVersion;
 
-               if( !preg_match( '/^(\d+)\.(\d+).*/i', $wgVersion, $result ) ) {
+               if ( !preg_match( '/^(\d+)\.(\d+).*/i', $wgVersion, $result ) ) {
                        throw new MWException( 'Variable $wgVersion has an invalid value.' );
                }
 
@@ -1296,9 +1343,13 @@ class WebInstaller_ReleaseNotes extends WebInstaller_Document {
 }
 
 class WebInstaller_UpgradeDoc extends WebInstaller_Document {
-       protected function getFileName() { return 'UPGRADE'; }
+       protected function getFileName() {
+               return 'UPGRADE';
+       }
 }
 
 class WebInstaller_Copying extends WebInstaller_Document {
-       protected function getFileName() { return 'COPYING'; }
+       protected function getFileName() {
+               return 'COPYING';
+       }
 }
index bcf582e..ab7df5d 100644 (file)
@@ -68,7 +68,7 @@ abstract class Job {
         */
        public static function factory( $command, Title $title, $params = false, $id = 0 ) {
                global $wgJobClasses;
-               if( isset( $wgJobClasses[$command] ) ) {
+               if ( isset( $wgJobClasses[$command] ) ) {
                        $class = $wgJobClasses[$command];
                        return new $class( $title, $params, $id );
                }
@@ -84,7 +84,7 @@ abstract class Job {
         *
         * @param array $jobs of Job objects
         * @return bool
-        * @deprecated 1.21
+        * @deprecated since 1.21
         */
        public static function batchInsert( $jobs ) {
                return JobQueueGroup::singleton()->push( $jobs );
@@ -99,10 +99,10 @@ abstract class Job {
         *
         * @param array $jobs of Job objects
         * @return bool
-        * @deprecated 1.21
+        * @deprecated since 1.21
         */
        public static function safeBatchInsert( $jobs ) {
-               return JobQueueGroup::singleton()->push( $jobs, JobQueue::QoS_Atomic );
+               return JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
        }
 
        /**
@@ -112,7 +112,7 @@ abstract class Job {
         *
         * @param $type string
         * @return Job|bool Returns false if there are no jobs
-        * @deprecated 1.21
+        * @deprecated since 1.21
         */
        public static function pop_type( $type ) {
                return JobQueueGroup::singleton()->get( $type )->pop();
@@ -123,7 +123,7 @@ abstract class Job {
         * This is subject to $wgJobTypesExcludedFromDefaultQueue.
         *
         * @return Job or false if there's no jobs
-        * @deprecated 1.21
+        * @deprecated since 1.21
         */
        public static function pop() {
                return JobQueueGroup::singleton()->pop();
@@ -150,6 +150,7 @@ abstract class Job {
 
        /**
         * @return integer May be 0 for jobs stored outside the DB
+        * @deprecated since 1.22
         */
        public function getId() {
                return $this->id;
@@ -176,6 +177,16 @@ abstract class Job {
                return $this->params;
        }
 
+       /**
+        * @return integer|null UNIX timestamp to delay running this job until, otherwise null
+        * @since 1.22
+        */
+       public function getReleaseTimestamp() {
+               return isset( $this->params['jobReleaseTimestamp'] )
+                       ? wfTimestampOrNull( TS_UNIX, $this->params['jobReleaseTimestamp'] )
+                       : null;
+       }
+
        /**
         * @return bool Whether only one of each identical set of jobs should be run
         */
@@ -185,34 +196,43 @@ abstract class Job {
 
        /**
         * @return bool Whether this job can be retried on failure by job runners
+        * @since 1.21
         */
        public function allowRetries() {
                return true;
        }
 
        /**
-        * Subclasses may need to override this to make duplication detection work
+        * Subclasses may need to override this to make duplication detection work.
+        * The resulting map conveys everything that makes the job unique. This is
+        * only checked if ignoreDuplicates() returns true, meaning that duplicate
+        * jobs are supposed to be ignored.
         *
         * @return Array Map of key/values
+        * @since 1.21
         */
        public function getDeduplicationInfo() {
                $info = array(
-                       'type'      => $this->getType(),
+                       'type' => $this->getType(),
                        'namespace' => $this->getTitle()->getNamespace(),
-                       'title'     => $this->getTitle()->getDBkey(),
-                       'params'    => $this->getParams()
+                       'title' => $this->getTitle()->getDBkey(),
+                       'params' => $this->getParams()
                );
-               // Identical jobs with different "root" jobs should count as duplicates
                if ( is_array( $info['params'] ) ) {
+                       // Identical jobs with different "root" jobs should count as duplicates
                        unset( $info['params']['rootJobSignature'] );
                        unset( $info['params']['rootJobTimestamp'] );
+                       // Likewise for jobs with different delay times
+                       unset( $info['params']['jobReleaseTimestamp'] );
                }
                return $info;
        }
 
        /**
+        * @see JobQueue::deduplicateRootJob()
         * @param string $key A key that identifies the task
         * @return Array
+        * @since 1.21
         */
        public static function newRootJobParams( $key ) {
                return array(
@@ -222,7 +242,9 @@ abstract class Job {
        }
 
        /**
+        * @see JobQueue::deduplicateRootJob()
         * @return Array
+        * @since 1.21
         */
        public function getRootJobParams() {
                return array(
@@ -235,10 +257,20 @@ abstract class Job {
                );
        }
 
+       /**
+        * @see JobQueue::deduplicateRootJob()
+        * @return bool
+        * @since 1.22
+        */
+       public function hasRootJobParams() {
+               return isset( $this->params['rootJobSignature'] )
+                       && isset( $this->params['rootJobTimestamp'] );
+       }
+
        /**
         * Insert a single job into the queue.
         * @return bool true on success
-        * @deprecated 1.21
+        * @deprecated since 1.21
         */
        public function insert() {
                return JobQueueGroup::singleton()->push( $this );
index b0dd925..3295c24 100644 (file)
@@ -34,8 +34,12 @@ abstract class JobQueue {
        protected $order; // string; job priority for pop()
        protected $claimTTL; // integer; seconds
        protected $maxTries; // integer; maximum number of times to try a job
+       protected $checkDelay; // boolean; allow delayed jobs
 
-       const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
+       const QOS_ATOMIC = 1; // integer; "all-or-nothing" job insertions
+       const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions (b/c)
+
+       const ROOTJOB_TTL = 2419200; // integer; seconds to remember root jobs (28 days)
 
        /**
         * @param $params array
@@ -53,28 +57,36 @@ abstract class JobQueue {
                if ( !in_array( $this->order, $this->supportedOrders() ) ) {
                        throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
                }
+               $this->checkDelay = !empty( $params['checkDelay'] );
+               if ( $this->checkDelay && !$this->supportsDelayedJobs() ) {
+                       throw new MWException( __CLASS__ . " does not support delayed jobs." );
+               }
        }
 
        /**
         * Get a job queue object of the specified type.
         * $params includes:
-        *   - class    : What job class to use (determines job type)
-        *   - wiki     : wiki ID of the wiki the jobs are for (defaults to current wiki)
-        *   - type     : The name of the job types this queue handles
-        *   - order    : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
-        *                If "fifo" is used, the queue will effectively be FIFO. Note that
-        *                job completion will not appear to be exactly FIFO if there are multiple
-        *                job runners since jobs can take different times to finish once popped.
-        *                If "timestamp" is used, the queue will at least be loosely ordered
-        *                by timestamp, allowing for some jobs to be popped off out of order.
-        *                If "random" is used, pop() will pick jobs in random order.
-        *                Note that it may only be weakly random (e.g. a lottery of the oldest X).
-        *                If "any" is choosen, the queue will use whatever order is the fastest.
-        *                This might be useful for improving concurrency for job acquisition.
-        *   - claimTTL : If supported, the queue will recycle jobs that have been popped
-        *                but not acknowledged as completed after this many seconds. Recycling
-        *                of jobs simple means re-inserting them into the queue. Jobs can be
-        *                attempted up to three times before being discarded.
+        *   - class      : What job class to use (determines job type)
+        *   - wiki       : wiki ID of the wiki the jobs are for (defaults to current wiki)
+        *   - type       : The name of the job types this queue handles
+        *   - order      : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
+        *                  If "fifo" is used, the queue will effectively be FIFO. Note that job
+        *                  completion will not appear to be exactly FIFO if there are multiple
+        *                  job runners since jobs can take different times to finish once popped.
+        *                  If "timestamp" is used, the queue will at least be loosely ordered
+        *                  by timestamp, allowing for some jobs to be popped off out of order.
+        *                  If "random" is used, pop() will pick jobs in random order.
+        *                  Note that it may only be weakly random (e.g. a lottery of the oldest X).
+        *                  If "any" is choosen, the queue will use whatever order is the fastest.
+        *                  This might be useful for improving concurrency for job acquisition.
+        *   - claimTTL   : If supported, the queue will recycle jobs that have been popped
+        *                  but not acknowledged as completed after this many seconds. Recycling
+        *                  of jobs simple means re-inserting them into the queue. Jobs can be
+        *                  attempted up to three times before being discarded.
+        *   - checkDelay : If supported, respect Job::getReleaseTimestamp() in the push functions.
+        *                  This lets delayed jobs wait in a staging area until a given timestamp is
+        *                  reached, at which point they will enter the queue. If this is not enabled
+        *                  or not supported, an exception will be thrown on delayed job insertion.
         *
         * Queue classes should throw an exception if they do not support the options given.
         *
@@ -84,7 +96,7 @@ abstract class JobQueue {
         */
        final public static function factory( array $params ) {
                $class = $params['class'];
-               if ( !MWInit::classExists( $class ) ) {
+               if ( !class_exists( $class ) ) {
                        throw new MWException( "Invalid job queue class '$class'." );
                }
                $obj = new $class( $params );
@@ -109,24 +121,45 @@ abstract class JobQueue {
        }
 
        /**
-        * @return string One of (random, timestamp, fifo)
+        * @return string One of (random, timestamp, fifo, undefined)
         */
        final public function getOrder() {
                return $this->order;
        }
 
        /**
-        * @return Array Subset of (random, timestamp, fifo)
+        * @return bool Whether delayed jobs are enabled
+        * @since 1.22
+        */
+       final public function delayedJobsEnabled() {
+               return $this->checkDelay;
+       }
+
+       /**
+        * Get the allowed queue orders for configuration validation
+        *
+        * @return Array Subset of (random, timestamp, fifo, undefined)
         */
        abstract protected function supportedOrders();
 
        /**
-        * @return string One of (random, timestamp, fifo)
+        * Get the default queue order to use if configuration does not specify one
+        *
+        * @return string One of (random, timestamp, fifo, undefined)
         */
        abstract protected function optimalOrder();
 
        /**
-        * Quickly check if the queue is empty (has no available jobs).
+        * Find out if delayed jobs are supported for configuration validation
+        *
+        * @return boolean Whether delayed jobs are supported
+        */
+       protected function supportsDelayedJobs() {
+               return false; // not implemented
+       }
+
+       /**
+        * Quickly check if the queue has no available (unacquired, non-delayed) jobs.
         * Queue classes should use caching if they are any slower without memcached.
         *
         * If caching is used, this might return false when there are actually no jobs.
@@ -151,7 +184,7 @@ abstract class JobQueue {
        abstract protected function doIsEmpty();
 
        /**
-        * Get the number of available (unacquired) jobs in the queue.
+        * Get the number of available (unacquired, non-delayed) jobs in the queue.
         * Queue classes should use caching if they are any slower without memcached.
         *
         * If caching is used, this number might be out of date for a minute.
@@ -194,13 +227,62 @@ abstract class JobQueue {
         */
        abstract protected function doGetAcquiredCount();
 
+       /**
+        * Get the number of delayed jobs (these are temporarily out of the queue).
+        * Queue classes should use caching if they are any slower without memcached.
+        *
+        * If caching is used, this number might be out of date for a minute.
+        *
+        * @return integer
+        * @throws MWException
+        * @since 1.22
+        */
+       final public function getDelayedCount() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doGetDelayedCount();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueue::getDelayedCount()
+        * @return integer
+        */
+       protected function doGetDelayedCount() {
+               return 0; // not implemented
+       }
+
+       /**
+        * Get the number of acquired jobs that can no longer be attempted.
+        * Queue classes should use caching if they are any slower without memcached.
+        *
+        * If caching is used, this number might be out of date for a minute.
+        *
+        * @return integer
+        * @throws MWException
+        */
+       final public function getAbandonedCount() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doGetAbandonedCount();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueue::getAbandonedCount()
+        * @return integer
+        */
+       protected function doGetAbandonedCount() {
+               return 0; // not implemented
+       }
+
        /**
         * Push a single jobs into the queue.
         * This does not require $wgJobClasses to be set for the given job type.
         * Outside callers should use JobQueueGroup::push() instead of this function.
         *
         * @param $jobs Job|Array
-        * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+        * @param $flags integer Bitfield (supports JobQueue::QOS_ATOMIC)
         * @return bool Returns false on failure
         * @throws MWException
         */
@@ -214,7 +296,7 @@ abstract class JobQueue {
         * Outside callers should use JobQueueGroup::push() instead of this function.
         *
         * @param array $jobs List of Jobs
-        * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+        * @param $flags integer Bitfield (supports JobQueue::QOS_ATOMIC)
         * @return bool Returns false on failure
         * @throws MWException
         */
@@ -225,7 +307,11 @@ abstract class JobQueue {
 
                foreach ( $jobs as $job ) {
                        if ( $job->getType() !== $this->type ) {
-                               throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+                               throw new MWException(
+                                       "Got '{$job->getType()}' job; expected a '{$this->type}' job." );
+                       } elseif ( $job->getReleaseTimestamp() && !$this->checkDelay ) {
+                               throw new MWException(
+                                       "Got delayed '{$job->getType()}' job; delays are not supported." );
                        }
                }
 
@@ -262,6 +348,15 @@ abstract class JobQueue {
                wfProfileIn( __METHOD__ );
                $job = $this->doPop();
                wfProfileOut( __METHOD__ );
+
+               // Flag this job as an old duplicate based on its "root" job...
+               try {
+                       if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
+                               JobQueue::incrStats( 'job-pop-duplicate', $this->type );
+                               $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
+                       }
+               } catch ( MWException $e ) {} // don't lose jobs over this
+
                return $job;
        }
 
@@ -344,7 +439,94 @@ abstract class JobQueue {
         * @return bool
         */
        protected function doDeduplicateRootJob( Job $job ) {
-               return true;
+               global $wgMemc;
+
+               if ( !$job->hasRootJobParams() ) {
+                       throw new MWException( "Cannot register root job; missing parameters." );
+               }
+               $params = $job->getRootJobParams();
+
+               $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+               // Callers should call batchInsert() and then this function so that if the insert
+               // fails, the de-duplication registration will be aborted. Since the insert is
+               // deferred till "transaction idle", do the same here, so that the ordering is
+               // maintained. Having only the de-duplication registration succeed would cause
+               // jobs to become no-ops without any actual jobs that made them redundant.
+               $timestamp = $wgMemc->get( $key ); // current last timestamp of this job
+               if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+                       return true; // a newer version of this root job was enqueued
+               }
+
+               // Update the timestamp of the last root job started at the location...
+               return $wgMemc->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+       }
+
+       /**
+        * Check if the "root" job of a given job has been superseded by a newer one
+        *
+        * @param $job Job
+        * @return bool
+        * @throws MWException
+        */
+       final protected function isRootJobOldDuplicate( Job $job ) {
+               if ( $job->getType() !== $this->type ) {
+                       throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+               }
+               wfProfileIn( __METHOD__ );
+               $isDuplicate = $this->doIsRootJobOldDuplicate( $job );
+               wfProfileOut( __METHOD__ );
+               return $isDuplicate;
+       }
+
+       /**
+        * @see JobQueue::isRootJobOldDuplicate()
+        * @param Job $job
+        * @return bool
+        */
+       protected function doIsRootJobOldDuplicate( Job $job ) {
+               global $wgMemc;
+
+               if ( !$job->hasRootJobParams() ) {
+                       return false; // job has no de-deplication info
+               }
+               $params = $job->getRootJobParams();
+
+               // Get the last time this root job was enqueued
+               $timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
+
+               // Check if a new root job was started at the location after this one's...
+               return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+       }
+
+       /**
+        * @param string $signature Hash identifier of the root job
+        * @return string
+        */
+       protected function getRootJobCacheKey( $signature ) {
+               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
+       }
+
+       /**
+        * Deleted all unclaimed and delayed jobs from the queue
+        *
+        * @return bool Success
+        * @throws MWException
+        * @since 1.22
+        */
+       final public function delete() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doDelete();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueue::delete()
+        * @return bool Success
+        */
+       protected function doDelete() {
+               throw new MWException( "This method is not implemented." );
        }
 
        /**
@@ -413,15 +595,40 @@ abstract class JobQueue {
        protected function doFlushCaches() {}
 
        /**
-        * Get an iterator to traverse over all of the jobs in this queue.
-        * This does not include jobs that are current acquired. In general,
-        * this should only be called on a queue that is no longer being popped.
+        * Get an iterator to traverse over all available jobs in this queue.
+        * This does not include jobs that are currently acquired or delayed.
+        * This should only be called on a queue that is no longer being popped.
         *
-        * @return Iterator|Traversable|Array
+        * @return Iterator
         * @throws MWException
         */
        abstract public function getAllQueuedJobs();
 
+       /**
+        * Get an iterator to traverse over all delayed jobs in this queue.
+        * This should only be called on a queue that is no longer being popped.
+        *
+        * @return Iterator
+        * @throws MWException
+        * @since 1.22
+        */
+       public function getAllDelayedJobs() {
+               return new ArrayIterator( array() ); // not implemented
+       }
+
+       /**
+        * Call wfIncrStats() for the queue overall and for the queue type
+        *
+        * @param string $key Event type
+        * @param string $type Job type
+        * @param integer $delta
+        * @since 1.22
+        */
+       public static function incrStats( $key, $type, $delta = 1 ) {
+               wfIncrStats( $key, $delta );
+               wfIncrStats( "{$key}-{$type}", $delta );
+       }
+
        /**
         * Namespace the queue with a key to isolate it for testing
         *
diff --git a/includes/job/JobQueueAggregator.php b/includes/job/JobQueueAggregator.php
deleted file mode 100644 (file)
index 3dba3c5..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-/**
- * Job queue aggregator code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @author Aaron Schulz
- */
-
-/**
- * Class to handle tracking information about all queues
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-abstract class JobQueueAggregator {
-       /** @var JobQueueAggregator */
-       protected static $instance = null;
-
-       /**
-        * @param array $params
-        */
-       protected function __construct( array $params ) {}
-
-       /**
-        * @return JobQueueAggregator
-        */
-       final public static function singleton() {
-               global $wgJobQueueAggregator;
-
-               if ( !isset( self::$instance ) ) {
-                       $class = $wgJobQueueAggregator['class'];
-                       $obj = new $class( $wgJobQueueAggregator );
-                       if ( !( $obj instanceof JobQueueAggregator ) ) {
-                               throw new MWException( "Class '$class' is not a JobQueueAggregator class." );
-                       }
-                       self::$instance = $obj;
-               }
-
-               return self::$instance;
-       }
-
-       /**
-        * Destroy the singleton instance
-        *
-        * @return void
-        */
-       final public static function destroySingleton() {
-               self::$instance = null;
-       }
-
-       /**
-        * Mark a queue as being empty
-        *
-        * @param string $wiki
-        * @param string $type
-        * @return bool Success
-        */
-       final public function notifyQueueEmpty( $wiki, $type ) {
-               wfProfileIn( __METHOD__ );
-               $ok = $this->doNotifyQueueEmpty( $wiki, $type );
-               wfProfileOut( __METHOD__ );
-               return $ok;
-       }
-
-       /**
-        * @see JobQueueAggregator::notifyQueueEmpty()
-        */
-       abstract protected function doNotifyQueueEmpty( $wiki, $type );
-
-       /**
-        * Mark a queue as being non-empty
-        *
-        * @param string $wiki
-        * @param string $type
-        * @return bool Success
-        */
-       final public function notifyQueueNonEmpty( $wiki, $type ) {
-               wfProfileIn( __METHOD__ );
-               $ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
-               wfProfileOut( __METHOD__ );
-               return $ok;
-       }
-
-       /**
-        * @see JobQueueAggregator::notifyQueueNonEmpty()
-        */
-       abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
-
-       /**
-        * Get the list of all of the queues with jobs
-        *
-        * @return Array (job type => (list of wiki IDs))
-        */
-       final public function getAllReadyWikiQueues() {
-               wfProfileIn( __METHOD__ );
-               $res = $this->doGetAllReadyWikiQueues();
-               wfProfileOut( __METHOD__ );
-               return $res;
-       }
-
-       /**
-        * @see JobQueueAggregator::getAllReadyWikiQueues()
-        */
-       abstract protected function doGetAllReadyWikiQueues();
-
-       /**
-        * Get all databases that have a pending job.
-        * This poll all the queues and is this expensive.
-        *
-        * @return Array (job type => (list of wiki IDs))
-        */
-       protected function findPendingWikiQueues() {
-               global $wgLocalDatabases;
-
-               $pendingDBs = array(); // (job type => (db list))
-               foreach ( $wgLocalDatabases as $db ) {
-                       foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
-                               $pendingDBs[$type][] = $db;
-                       }
-               }
-
-               return $pendingDBs;
-       }
-}
diff --git a/includes/job/JobQueueAggregatorMemc.php b/includes/job/JobQueueAggregatorMemc.php
deleted file mode 100644 (file)
index 4b82cf9..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-/**
- * Job queue aggregator code that uses BagOStuff.
- *
- * 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
- */
-
-/**
- * Class to handle tracking information about all queues using BagOStuff
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-class JobQueueAggregatorMemc extends JobQueueAggregator {
-       /** @var BagOStuff */
-       protected $cache;
-
-       protected $cacheTTL; // integer; seconds
-
-       /**
-        * @params include:
-        *   - objectCache : Name of an object cache registered in $wgObjectCaches.
-        *                   This defaults to the one specified by $wgMainCacheType.
-        *   - cacheTTL    : Seconds to cache the aggregate data before regenerating.
-        * @param array $params
-        */
-       protected function __construct( array $params ) {
-               parent::__construct( $params );
-               $this->cache = isset( $params['objectCache'] )
-                       ? wfGetCache( $params['objectCache'] )
-                       : wfGetMainCache();
-               $this->cacheTTL = isset( $params['cacheTTL'] ) ? $params['cacheTTL'] : 180; // 3 min
-       }
-
-       /**
-        * @see JobQueueAggregator::doNotifyQueueEmpty()
-        */
-       protected function doNotifyQueueEmpty( $wiki, $type ) {
-               $key = $this->getReadyQueueCacheKey();
-               // Delist the queue from the "ready queue" list
-               if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
-                       $curInfo = $this->cache->get( $key );
-                       if ( is_array( $curInfo ) && isset( $curInfo['pendingDBs'][$type] ) ) {
-                               if ( in_array( $wiki, $curInfo['pendingDBs'][$type] ) ) {
-                                       $curInfo['pendingDBs'][$type] = array_diff(
-                                               $curInfo['pendingDBs'][$type], array( $wiki ) );
-                                       $this->cache->set( $key, $curInfo );
-                               }
-                       }
-                       $this->cache->delete( "$key:lock" ); // unlock
-               }
-               return true;
-       }
-
-       /**
-        * @see JobQueueAggregator::doNotifyQueueNonEmpty()
-        */
-       protected function doNotifyQueueNonEmpty( $wiki, $type ) {
-               return true; // updated periodically
-       }
-
-       /**
-        * @see JobQueueAggregator::doAllGetReadyWikiQueues()
-        */
-       protected function doGetAllReadyWikiQueues() {
-               $key = $this->getReadyQueueCacheKey();
-               // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
-               // regenerate the cache. Use any available stale cache if another process is
-               // currently regenerating the pending DB information.
-               $pendingDbInfo = $this->cache->get( $key );
-               if ( !is_array( $pendingDbInfo )
-                       || ( time() - $pendingDbInfo['timestamp'] ) > $this->cacheTTL
-                       || mt_rand( 0, 999 ) == 0
-               ) {
-                       if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
-                               $pendingDbInfo = array(
-                                       'pendingDBs' => $this->findPendingWikiQueues(),
-                                       'timestamp'  => time()
-                               );
-                               for ( $attempts=1; $attempts <= 25; ++$attempts ) {
-                                       if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
-                                               $this->cache->set( $key, $pendingDbInfo );
-                                               $this->cache->delete( "$key:lock" ); // unlock
-                                               break;
-                                       }
-                               }
-                               $this->cache->delete( "$key:rebuild" ); // unlock
-                       }
-               }
-               return is_array( $pendingDbInfo )
-                       ? $pendingDbInfo['pendingDBs']
-                       : array(); // cache is both empty and locked
-       }
-
-       /**
-        * @return string
-        */
-       private function getReadyQueueCacheKey() {
-               return "jobqueue:aggregator:ready-queues:v1"; // global
-       }
-}
diff --git a/includes/job/JobQueueAggregatorRedis.php b/includes/job/JobQueueAggregatorRedis.php
deleted file mode 100644 (file)
index 74e9171..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-<?php
-/**
- * Job queue aggregator code that uses PhpRedis.
- *
- * 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
- */
-
-/**
- * Class to handle tracking information about all queues using PhpRedis
- *
- * @ingroup JobQueue
- * @since 1.21
- */
-class JobQueueAggregatorRedis extends JobQueueAggregator {
-       /** @var RedisConnectionPool */
-       protected $redisPool;
-
-       /**
-        * @params include:
-        *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
-        *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
-        *                   If a hostname is specified but no port, the standard port number
-        *                   6379 will be used. Required.
-        * @param array $params
-        */
-       protected function __construct( array $params ) {
-               parent::__construct( $params );
-               $this->server = $params['redisServer'];
-               $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
-       }
-
-       /**
-        * @see JobQueueAggregator::doNotifyQueueEmpty()
-        */
-       protected function doNotifyQueueEmpty( $wiki, $type ) {
-               $conn = $this->getConnection();
-               if ( !$conn ) {
-                       return false;
-               }
-               try {
-                       $conn->hDel( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ) );
-                       return true;
-               } catch ( RedisException $e ) {
-                       $this->handleException( $conn, $e );
-                       return false;
-               }
-       }
-
-       /**
-        * @see JobQueueAggregator::doNotifyQueueNonEmpty()
-        */
-       protected function doNotifyQueueNonEmpty( $wiki, $type ) {
-               $conn = $this->getConnection();
-               if ( !$conn ) {
-                       return false;
-               }
-               try {
-                       $conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
-                       return true;
-               } catch ( RedisException $e ) {
-                       $this->handleException( $conn, $e );
-                       return false;
-               }
-       }
-
-       /**
-        * @see JobQueueAggregator::doAllGetReadyWikiQueues()
-        */
-       protected function doGetAllReadyWikiQueues() {
-               $conn = $this->getConnection();
-               if ( !$conn ) {
-                       return array();
-               }
-               try {
-                       $conn->multi( Redis::PIPELINE );
-                       $conn->exists( $this->getReadyQueueKey() );
-                       $conn->hGetAll( $this->getReadyQueueKey() );
-                       list( $exists, $map ) = $conn->exec();
-
-                       if ( $exists ) { // cache hit
-                               $pendingDBs = array(); // (type => list of wikis)
-                               foreach ( $map as $key => $time ) {
-                                       list( $type, $wiki ) = $this->dencQueueName( $key );
-                                       $pendingDBs[$type][] = $wiki;
-                               }
-                       } else { // cache miss
-                               $pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
-
-                               $now = time();
-                               $map = array();
-                               foreach ( $pendingDBs as $type => $wikis ) {
-                                       foreach ( $wikis as $wiki ) {
-                                               $map[$this->encQueueName( $type, $wiki )] = $now;
-                                       }
-                               }
-                               $conn->hMSet( $this->getReadyQueueKey(), $map );
-                       }
-
-                       return $pendingDBs;
-               } catch ( RedisException $e ) {
-                       $this->handleException( $conn, $e );
-                       return array();
-               }
-       }
-
-       /**
-        * Get a connection to the server that handles all sub-queues for this queue
-        *
-        * @return Array (server name, Redis instance)
-        * @throws MWException
-        */
-       protected function getConnection() {
-               return $this->redisPool->getConnection( $this->server );
-       }
-
-       /**
-        * @param RedisConnRef $conn
-        * @param RedisException $e
-        * @return void
-        */
-       protected function handleException( RedisConnRef $conn, $e ) {
-               $this->redisPool->handleException( $this->server, $conn, $e );
-       }
-
-       /**
-        * @return string
-        */
-       private function getReadyQueueKey() {
-               return "jobqueue:aggregator:h-ready-queues:v1"; // global
-       }
-
-       /**
-        * @param string $type
-        * @param string $wiki
-        * @return string
-        */
-       private function encQueueName( $type, $wiki ) {
-               return rawurlencode( $type ) . '/' . rawurlencode( $wiki );
-       }
-
-       /**
-        * @param string $name
-        * @return string
-        */
-       private function dencQueueName( $name ) {
-               list( $type, $wiki ) = explode( '/', $name, 2 );
-               return array( rawurldecode( $type ), rawurldecode( $wiki ) );
-       }
-}
index a7a459f..56da4f3 100644 (file)
  * @since 1.21
  */
 class JobQueueDB extends JobQueue {
-       const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
        const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
        const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
        const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed
        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 */
+       protected $cache;
+
        protected $cluster = false; // string; name of an external DB cluster
 
        /**
@@ -46,8 +48,13 @@ class JobQueueDB extends JobQueue {
         * @param $params array
         */
        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;
        }
 
        protected function supportedOrders() {
@@ -63,11 +70,9 @@ class JobQueueDB extends JobQueue {
         * @return bool
         */
        protected function doIsEmpty() {
-               global $wgMemc;
-
                $key = $this->getCacheKey( 'empty' );
 
-               $isEmpty = $wgMemc->get( $key );
+               $isEmpty = $this->cache->get( $key );
                if ( $isEmpty === 'true' ) {
                        return true;
                } elseif ( $isEmpty === 'false' ) {
@@ -78,7 +83,7 @@ class JobQueueDB extends JobQueue {
                $found = $dbr->selectField( // unclaimed job
                        'job', '1', array( 'job_cmd' => $this->type, 'job_token' => '' ), __METHOD__
                );
-               $wgMemc->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
+               $this->cache->add( $key, $found ? 'false' : 'true', self::CACHE_TTL_LONG );
 
                return !$found;
        }
@@ -88,11 +93,9 @@ class JobQueueDB extends JobQueue {
         * @return integer
         */
        protected function doGetSize() {
-               global $wgMemc;
-
                $key = $this->getCacheKey( 'size' );
 
-               $size = $wgMemc->get( $key );
+               $size = $this->cache->get( $key );
                if ( is_int( $size ) ) {
                        return $size;
                }
@@ -102,7 +105,7 @@ class JobQueueDB extends JobQueue {
                        array( 'job_cmd' => $this->type, 'job_token' => '' ),
                        __METHOD__
                );
-               $wgMemc->set( $key, $size, self::CACHE_TTL_SHORT );
+               $this->cache->set( $key, $size, self::CACHE_TTL_SHORT );
 
                return $size;
        }
@@ -112,13 +115,40 @@ class JobQueueDB extends JobQueue {
         * @return integer
         */
        protected function doGetAcquiredCount() {
+               if ( $this->claimTTL <= 0 ) {
+                       return 0; // no acknowledgements
+               }
+
+               $key = $this->getCacheKey( 'acquiredcount' );
+
+               $count = $this->cache->get( $key );
+               if ( is_int( $count ) ) {
+                       return $count;
+               }
+
+               list( $dbr, $scope ) = $this->getSlaveDB();
+               $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
+                       array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
+                       __METHOD__
+               );
+               $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
+
+               return $count;
+       }
+
+       /**
+        * @see JobQueue::doGetAbandonedCount()
+        * @return integer
+        * @throws MWException
+        */
+       protected function doGetAbandonedCount() {
                global $wgMemc;
 
                if ( $this->claimTTL <= 0 ) {
                        return 0; // no acknowledgements
                }
 
-               $key = $this->getCacheKey( 'acquiredcount' );
+               $key = $this->getCacheKey( 'abandonedcount' );
 
                $count = $wgMemc->get( $key );
                if ( is_int( $count ) ) {
@@ -127,7 +157,11 @@ class JobQueueDB extends JobQueue {
 
                list( $dbr, $scope ) = $this->getSlaveDB();
                $count = (int)$dbr->selectField( 'job', 'COUNT(*)',
-                       array( 'job_cmd' => $this->type, "job_token != {$dbr->addQuotes( '' )}" ),
+                       array(
+                               'job_cmd' => $this->type,
+                               "job_token != {$dbr->addQuotes( '' )}",
+                               "job_attempts >= " . $dbr->addQuotes( $this->maxTries )
+                       ),
                        __METHOD__
                );
                $wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
@@ -143,71 +177,85 @@ class JobQueueDB extends JobQueue {
         * @return bool
         */
        protected function doBatchPush( array $jobs, $flags ) {
-               if ( count( $jobs ) ) {
-                       list( $dbw, $scope ) = $this->getMasterDB();
-
-                       $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
-                       $rowList = array(); // list of jobs for jobs that are are not de-duplicated
-
-                       foreach ( $jobs as $job ) {
-                               $row = $this->insertFields( $job );
-                               if ( $job->ignoreDuplicates() ) {
-                                       $rowSet[$row['job_sha1']] = $row;
-                               } else {
-                                       $rowList[] = $row;
-                               }
+               list( $dbw, $scope ) = $this->getMasterDB();
+
+               $that = $this;
+               $method = __METHOD__;
+               $dbw->onTransactionIdle(
+                       function() use ( $dbw, $that, $jobs, $flags, $method, $scope ) {
+                               $that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
                        }
+               );
 
-                       $key = $this->getCacheKey( 'empty' );
-                       $atomic = ( $flags & self::QoS_Atomic );
+               return true;
+       }
+
+       /**
+        * This function should *not* be called outside of JobQueueDB
+        *
+        * @param DatabaseBase $dbw
+        * @param array $jobs
+        * @param int $flags
+        * @param string $method
+        * @return boolean
+        * @throws type
+        */
+       public function doBatchPushInternal( DatabaseBase $dbw, array $jobs, $flags, $method ) {
+               if ( !count( $jobs ) ) {
+                       return true;
+               }
 
-                       $dbw->onTransactionIdle(
-                               function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $scope
-                       ) {
-                               global $wgMemc;
+               $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
+               $rowList = array(); // list of jobs for jobs that are are not de-duplicated
+               foreach ( $jobs as $job ) {
+                       $row = $this->insertFields( $job );
+                       if ( $job->ignoreDuplicates() ) {
+                               $rowSet[$row['job_sha1']] = $row;
+                       } else {
+                               $rowList[] = $row;
+                       }
+               }
 
-                               if ( $atomic ) {
-                                       $dbw->begin( __METHOD__ ); // wrap all the job additions in one transaction
-                               }
-                               try {
-                                       // Strip out any duplicate jobs that are already in the queue...
-                                       if ( count( $rowSet ) ) {
-                                               $res = $dbw->select( 'job', 'job_sha1',
-                                                       array(
-                                                               // No job_type condition since it's part of the job_sha1 hash
-                                                               'job_sha1'  => array_keys( $rowSet ),
-                                                               'job_token' => '' // unclaimed
-                                                       ),
-                                                       __METHOD__
-                                               );
-                                               foreach ( $res as $row ) {
-                                                       wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate." );
-                                                       unset( $rowSet[$row->job_sha1] ); // already enqueued
-                                               }
-                                       }
-                                       // Build the full list of job rows to insert
-                                       $rows = array_merge( $rowList, array_values( $rowSet ) );
-                                       // Insert the job rows in chunks to avoid slave lag...
-                                       foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
-                                               $dbw->insert( 'job', $rowBatch, __METHOD__ );
-                                       }
-                                       wfIncrStats( 'job-insert', count( $rows ) );
-                                       wfIncrStats( 'job-insert-duplicate',
-                                               count( $rowSet ) + count( $rowList ) - count( $rows ) );
-                               } catch ( DBError $e ) {
-                                       if ( $atomic ) {
-                                               $dbw->rollback( __METHOD__ );
-                                       }
-                                       throw $e;
-                               }
-                               if ( $atomic ) {
-                                       $dbw->commit( __METHOD__ );
+               if ( $flags & self::QOS_ATOMIC ) {
+                       $dbw->begin( $method ); // wrap all the job additions in one transaction
+               }
+               try {
+                       // Strip out any duplicate jobs that are already in the queue...
+                       if ( count( $rowSet ) ) {
+                               $res = $dbw->select( 'job', 'job_sha1',
+                                       array(
+                                               // No job_type condition since it's part of the job_sha1 hash
+                                               'job_sha1' => array_keys( $rowSet ),
+                                               'job_token' => '' // unclaimed
+                                       ),
+                                       $method
+                               );
+                               foreach ( $res as $row ) {
+                                       wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate.\n" );
+                                       unset( $rowSet[$row->job_sha1] ); // already enqueued
                                }
-
-                               $wgMemc->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
-                       } );
+                       }
+                       // Build the full list of job rows to insert
+                       $rows = array_merge( $rowList, array_values( $rowSet ) );
+                       // Insert the job rows in chunks to avoid slave lag...
+                       foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
+                               $dbw->insert( 'job', $rowBatch, $method );
+                       }
+                       JobQueue::incrStats( 'job-insert', $this->type, count( $rows ) );
+                       JobQueue::incrStats( 'job-insert-duplicate', $this->type,
+                               count( $rowSet ) + count( $rowList ) - count( $rows ) );
+               } catch ( DBError $e ) {
+                       if ( $flags & self::QOS_ATOMIC ) {
+                               $dbw->rollback( $method );
+                       }
+                       throw $e;
+               }
+               if ( $flags & self::QOS_ATOMIC ) {
+                       $dbw->commit( $method );
                }
 
+               $this->cache->set( $this->getCacheKey( 'empty' ), 'false', JobQueueDB::CACHE_TTL_LONG );
+
                return true;
        }
 
@@ -216,14 +264,17 @@ class JobQueueDB extends JobQueue {
         * @return Job|bool
         */
        protected function doPop() {
-               global $wgMemc;
-
-               if ( $wgMemc->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
+               if ( $this->cache->get( $this->getCacheKey( 'empty' ) ) === 'true' ) {
                        return false; // queue is empty
                }
 
                list( $dbw, $scope ) = $this->getMasterDB();
                $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+               $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+               $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+               $scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
+                       $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+               } );
 
                $uuid = wfRandomString( 32 ); // pop attempt
                $job = false; // job popped off
@@ -238,27 +289,23 @@ class JobQueueDB extends JobQueue {
                        }
                        // Check if we found a row to reserve...
                        if ( !$row ) {
-                               $wgMemc->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
+                               $this->cache->set( $this->getCacheKey( 'empty' ), 'true', self::CACHE_TTL_LONG );
                                break; // nothing to do
                        }
-                       wfIncrStats( 'job-pop' );
+                       JobQueue::incrStats( 'job-pop', $this->type );
                        // Get the job object from the row...
                        $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
                        if ( !$title ) {
                                $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-                               wfDebugLog( 'JobQueueDB', "Row has invalid title '{$row->job_title}'." );
+                               wfDebug( "Row has invalid title '{$row->job_title}'." );
                                continue; // try again
                        }
                        $job = Job::factory( $row->job_cmd, $title,
                                self::extractBlob( $row->job_params ), $row->job_id );
+                       $job->metadata['id'] = $row->job_id;
                        $job->id = $row->job_id; // XXX: work around broken subclasses
-                       // Flag this job as an old duplicate based on its "root" job...
-                       if ( $this->isRootJobOldDuplicate( $job ) ) {
-                               wfIncrStats( 'job-pop-duplicate' );
-                               $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
-                       }
                        break; // done
-               } while( true );
+               } while ( true );
 
                return $job;
        }
@@ -272,11 +319,9 @@ class JobQueueDB extends JobQueue {
         * @return Row|false
         */
        protected function claimRandom( $uuid, $rand, $gte ) {
-               global $wgMemc;
-
                list( $dbw, $scope ) = $this->getMasterDB();
                // Check cache to see if the queue has <= OFFSET items
-               $tinyQueue = $wgMemc->get( $this->getCacheKey( 'small' ) );
+               $tinyQueue = $this->cache->get( $this->getCacheKey( 'small' ) );
 
                $row = false; // the row acquired
                $invertedDirection = false; // whether one job_random direction was already scanned
@@ -292,7 +337,7 @@ class JobQueueDB extends JobQueue {
                                $dir = $gte ? 'ASC' : 'DESC';
                                $row = $dbw->selectRow( 'job', '*', // find a random job
                                        array(
-                                               'job_cmd'   => $this->type,
+                                               'job_cmd' => $this->type,
                                                'job_token' => '', // unclaimed
                                                "job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
                                        __METHOD__,
@@ -309,7 +354,7 @@ class JobQueueDB extends JobQueue {
                                // instead of job_random for reducing excess claim retries.
                                $row = $dbw->selectRow( 'job', '*', // find a random job
                                        array(
-                                               'job_cmd'   => $this->type,
+                                               'job_cmd' => $this->type,
                                                'job_token' => '', // unclaimed
                                        ),
                                        __METHOD__,
@@ -317,14 +362,14 @@ class JobQueueDB extends JobQueue {
                                );
                                if ( !$row ) {
                                        $tinyQueue = true; // we know the queue must have <= MAX_OFFSET rows
-                                       $wgMemc->set( $this->getCacheKey( 'small' ), 1, 30 );
+                                       $this->cache->set( $this->getCacheKey( 'small' ), 1, 30 );
                                        continue; // use job_random
                                }
                        }
                        if ( $row ) { // claim the job
                                $dbw->update( 'job', // update by PK
                                        array(
-                                               'job_token'           => $uuid,
+                                               'job_token' => $uuid,
                                                'job_token_timestamp' => $dbw->timestamp(),
                                                'job_attempts = job_attempts+1' ),
                                        array( 'job_cmd' => $this->type, 'job_id' => $row->job_id, 'job_token' => '' ),
@@ -375,7 +420,7 @@ class JobQueueDB extends JobQueue {
                                // This uses as much of the DB wrapper functions as possible.
                                $dbw->update( 'job',
                                        array(
-                                               'job_token'           => $uuid,
+                                               'job_token' => $uuid,
                                                'job_token_timestamp' => $dbw->timestamp(),
                                                'job_attempts = job_attempts+1' ),
                                        array( 'job_id = (' .
@@ -394,7 +439,7 @@ class JobQueueDB extends JobQueue {
                                        array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__
                                );
                                if ( !$row ) { // raced out by duplicate job removal
-                                       wfDebugLog( 'JobQueueDB', "Row deleted as duplicate by another process." );
+                                       wfDebug( "Row deleted as duplicate by another process." );
                                }
                        } else {
                                break; // nothing to do
@@ -404,79 +449,6 @@ class JobQueueDB extends JobQueue {
                return $row;
        }
 
-       /**
-        * Recycle or destroy any jobs that have been claimed for too long
-        *
-        * @return integer Number of jobs recycled/deleted
-        */
-       public function recycleAndDeleteStaleJobs() {
-               global $wgMemc;
-
-               $now = time();
-               list( $dbw, $scope ) = $this->getMasterDB();
-               $count = 0; // affected rows
-
-               if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
-                       return $count; // already in progress
-               }
-
-               // Remove claims on jobs acquired for too long if enabled...
-               if ( $this->claimTTL > 0 ) {
-                       $claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
-                       // Get the IDs of jobs that have be claimed but not finished after too long.
-                       // These jobs can be recycled into the queue by expiring the claim. Selecting
-                       // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
-                       $res = $dbw->select( 'job', 'job_id',
-                               array(
-                                       'job_cmd' => $this->type,
-                                       "job_token != {$dbw->addQuotes( '' )}", // was acquired
-                                       "job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
-                                       "job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
-                               __METHOD__
-                       );
-                       $ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
-                       if ( count( $ids ) ) {
-                               // Reset job_token for these jobs so that other runners will pick them up.
-                               // Set the timestamp to the current time, as it is useful to now that the job
-                               // was already tried before (the timestamp becomes the "released" time).
-                               $dbw->update( 'job',
-                                       array(
-                                               'job_token' => '',
-                                               'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
-                                       array(
-                                               'job_id' => $ids ),
-                                       __METHOD__
-                               );
-                               $count += $dbw->affectedRows();
-                               wfIncrStats( 'job-recycle', $dbw->affectedRows() );
-                               $wgMemc->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
-                       }
-               }
-
-               // Just destroy any stale jobs...
-               $pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
-               $conds = array(
-                       'job_cmd' => $this->type,
-                       "job_token != {$dbw->addQuotes( '' )}", // was acquired
-                       "job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
-               );
-               if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
-                       $conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
-               }
-               // Get the IDs of jobs that are considered stale and should be removed. Selecting
-               // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
-               $res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
-               $ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
-               if ( count( $ids ) ) {
-                       $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
-                       $count += $dbw->affectedRows();
-               }
-
-               $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
-
-               return $count;
-       }
-
        /**
         * @see JobQueue::doAck()
         * @param Job $job
@@ -484,16 +456,21 @@ class JobQueueDB extends JobQueue {
         * @return Job|bool
         */
        protected function doAck( Job $job ) {
-               if ( !$job->getId() ) {
+               if ( !isset( $job->metadata['id'] ) ) {
                        throw new MWException( "Job of type '{$job->getType()}' has no ID." );
                }
 
                list( $dbw, $scope ) = $this->getMasterDB();
                $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+               $autoTrx = $dbw->getFlag( DBO_TRX ); // get current setting
+               $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+               $scopedReset = new ScopedCallback( function() use ( $dbw, $autoTrx ) {
+                       $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore old setting
+               } );
 
                // Delete a row with a single DELETE without holding row locks over RTTs...
                $dbw->delete( 'job',
-                       array( 'job_cmd' => $this->type, 'job_id' => $job->getId() ), __METHOD__ );
+                       array( 'job_cmd' => $this->type, 'job_id' => $job->metadata['id'] ), __METHOD__ );
 
                return true;
        }
@@ -518,43 +495,29 @@ class JobQueueDB extends JobQueue {
                // maintained. Having only the de-duplication registration succeed would cause
                // jobs to become no-ops without any actual jobs that made them redundant.
                list( $dbw, $scope ) = $this->getMasterDB();
-               $dbw->onTransactionIdle( function() use ( $params, $key, $scope ) {
-                       global $wgMemc;
-
-                       $timestamp = $wgMemc->get( $key ); // current last timestamp of this job
+               $cache = $this->cache;
+               $dbw->onTransactionIdle( function() use ( $cache, $params, $key, $scope ) {
+                       $timestamp = $cache->get( $key ); // current last timestamp of this job
                        if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
                                return true; // a newer version of this root job was enqueued
                        }
 
                        // Update the timestamp of the last root job started at the location...
-                       return $wgMemc->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
+                       return $cache->set( $key, $params['rootJobTimestamp'], JobQueueDB::ROOTJOB_TTL );
                } );
 
                return true;
        }
 
        /**
-        * Check if the "root" job of a given job has been superseded by a newer one
-        *
-        * @param $job Job
+        * @see JobQueue::doDelete()
         * @return bool
         */
-       protected function isRootJobOldDuplicate( Job $job ) {
-               global $wgMemc;
-
-               $params = $job->getParams();
-               if ( !isset( $params['rootJobSignature'] ) ) {
-                       return false; // job has no de-deplication info
-               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
-                       trigger_error( "Cannot check root job; missing 'rootJobTimestamp'." );
-                       return false;
-               }
-
-               // Get the last time this root job was enqueued
-               $timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
+       protected function doDelete() {
+               list( $dbw, $scope ) = $this->getMasterDB();
 
-               // Check if a new root job was started at the location after this one's...
-               return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+               $dbw->delete( 'job', array( 'job_cmd' => $this->type ) );
+               return true;
        }
 
        /**
@@ -572,7 +535,7 @@ class JobQueueDB extends JobQueue {
                return array(
                        'recycleAndDeleteStaleJobs' => array(
                                'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
-                               'period'   => ceil( $this->claimTTL / 2 )
+                               'period' => ceil( $this->claimTTL / 2 )
                        )
                );
        }
@@ -581,10 +544,8 @@ class JobQueueDB extends JobQueue {
         * @return void
         */
        protected function doFlushCaches() {
-               global $wgMemc;
-
                foreach ( array( 'empty', 'size', 'acquiredcount' ) as $type ) {
-                       $wgMemc->delete( $this->getCacheKey( $type ) );
+                       $this->cache->delete( $this->getCacheKey( $type ) );
                }
        }
 
@@ -603,12 +564,93 @@ class JobQueueDB extends JobQueue {
                                        strlen( $row->job_params ) ? unserialize( $row->job_params ) : false,
                                        $row->job_id
                                );
+                               $job->metadata['id'] = $row->job_id;
                                $job->id = $row->job_id; // XXX: work around broken subclasses
                                return $job;
                        }
                );
        }
 
+       /**
+        * Recycle or destroy any jobs that have been claimed for too long
+        *
+        * @return integer Number of jobs recycled/deleted
+        */
+       public function recycleAndDeleteStaleJobs() {
+               $now = time();
+               list( $dbw, $scope ) = $this->getMasterDB();
+               $count = 0; // affected rows
+
+               if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
+                       return $count; // already in progress
+               }
+
+               // Remove claims on jobs acquired for too long if enabled...
+               if ( $this->claimTTL > 0 ) {
+                       $claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
+                       // Get the IDs of jobs that have be claimed but not finished after too long.
+                       // These jobs can be recycled into the queue by expiring the claim. Selecting
+                       // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+                       $res = $dbw->select( 'job', 'job_id',
+                               array(
+                                       'job_cmd' => $this->type,
+                                       "job_token != {$dbw->addQuotes( '' )}", // was acquired
+                                       "job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
+                                       "job_attempts < {$dbw->addQuotes( $this->maxTries )}" ), // retries left
+                               __METHOD__
+                       );
+                       $ids = array_map(
+                               function( $o ) {
+                                       return $o->job_id;
+                               }, iterator_to_array( $res )
+                       );
+                       if ( count( $ids ) ) {
+                               // Reset job_token for these jobs so that other runners will pick them up.
+                               // Set the timestamp to the current time, as it is useful to now that the job
+                               // was already tried before (the timestamp becomes the "released" time).
+                               $dbw->update( 'job',
+                                       array(
+                                               'job_token' => '',
+                                               'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
+                                       array(
+                                               'job_id' => $ids ),
+                                       __METHOD__
+                               );
+                               $count += $dbw->affectedRows();
+                               JobQueue::incrStats( 'job-recycle', $this->type, $dbw->affectedRows() );
+                               $this->cache->set( $this->getCacheKey( 'empty' ), 'false', self::CACHE_TTL_LONG );
+                       }
+               }
+
+               // Just destroy any stale jobs...
+               $pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
+               $conds = array(
+                       'job_cmd' => $this->type,
+                       "job_token != {$dbw->addQuotes( '' )}", // was acquired
+                       "job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
+               );
+               if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
+                       $conds[] = "job_attempts >= {$dbw->addQuotes( $this->maxTries )}";
+               }
+               // Get the IDs of jobs that are considered stale and should be removed. Selecting
+               // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+               $res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
+               $ids = array_map(
+                       function( $o ) {
+                               return $o->job_id;
+                       }, iterator_to_array( $res )
+               );
+               if ( count( $ids ) ) {
+                       $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
+                       $count += $dbw->affectedRows();
+                       JobQueue::incrStats( 'job-abandon', $this->type, $dbw->affectedRows() );
+               }
+
+               $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
+
+               return $count;
+       }
+
        /**
         * @return Array (DatabaseBase, ScopedCallback)
         */
@@ -668,16 +710,8 @@ class JobQueueDB extends JobQueue {
         */
        private function getCacheKey( $property ) {
                list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
-       }
-
-       /**
-        * @param string $signature Hash identifier of the root job
-        * @return string
-        */
-       private function getRootJobCacheKey( $signature ) {
-               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
+               $cluster = is_string( $this->cluster ) ? $this->cluster : 'main';
+               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $cluster, $this->type, $property );
        }
 
        /**
diff --git a/includes/job/JobQueueFederated.php b/includes/job/JobQueueFederated.php
new file mode 100644 (file)
index 0000000..db5b686
--- /dev/null
@@ -0,0 +1,388 @@
+<?php
+/**
+ * Job queue code for federated queues.
+ *
+ * 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
+ */
+
+/**
+ * Class to handle enqueueing and running of background jobs for federated queues
+ *
+ * This class allows for queues to be partitioned into smaller queues.
+ * A partition is defined by the configuration for a JobQueue instance.
+ * For example, one can set $wgJobTypeConf['refreshLinks'] to point to a
+ * JobQueueFederated instance, which itself would consist of three JobQueueRedis
+ * instances, each using their own redis server. This would allow for the jobs
+ * to be split (evenly or based on weights) accross multiple servers if a single
+ * server becomes impractical or expensive. Different JobQueue classes can be mixed.
+ *
+ * The basic queue configuration (e.g. "order", "claimTTL") of a federated queue
+ * is inherited by the partition queues. Additional configuration defines what
+ * section each wiki is in, what partition queues each section uses (and their weight),
+ * and the JobQueue configuration for each partition. Some sections might only need a
+ * single queue partition, like the sections for groups of small wikis.
+ *
+ * If used for performance, then $wgMainCacheType should be set to memcached/redis.
+ * Note that "fifo" cannot be used for the ordering, since the data is distributed.
+ * One can still use "timestamp" instead, as in "roughly timestamp ordered".
+ *
+ * @ingroup JobQueue
+ * @since 1.22
+ */
+class JobQueueFederated extends JobQueue {
+       /** @var Array (wiki ID => section name) */
+       protected $sectionsByWiki = array();
+       /** @var Array (section name => (partition name => weight)) */
+       protected $partitionsBySection = array();
+       /** @var Array (section name => config array) */
+       protected $configByPartition = array();
+       /** @var Array (partition names => integer) */
+       protected $partitionsNoPush = array();
+
+       /** @var Array (partition name => JobQueue) */
+       protected $partitionQueues = array();
+       /** @var BagOStuff */
+       protected $cache;
+
+       const CACHE_TTL_SHORT = 30; // integer; seconds to cache info without re-validating
+       const CACHE_TTL_LONG = 300; // integer; seconds to cache info that is kept up to date
+
+       /**
+        * @params include:
+        *  - sectionsByWiki      : A map of wiki IDs to section names.
+        *                          Wikis will default to using the section "default".
+        *  - partitionsBySection : Map of section names to maps of (partition name => weight).
+        *                          A section called 'default' must be defined if not all wikis
+        *                          have explicitly defined sections.
+        *  - configByPartition   : Map of queue partition names to configuration arrays.
+        *                          These configuration arrays are passed to JobQueue::factory().
+        *                          The options set here are overriden by those passed to this
+        *                          the federated queue itself (e.g. 'order' and 'claimTTL').
+        *  - partitionsNoPush    : List of partition names that can handle pop() but not push().
+        *                          This can be used to migrate away from a certain partition.
+        * @param array $params
+        */
+       protected function __construct( array $params ) {
+               parent::__construct( $params );
+               $this->sectionsByWiki = $params['sectionsByWiki'];
+               $this->partitionsBySection = $params['partitionsBySection'];
+               $this->configByPartition = $params['configByPartition'];
+               if ( isset( $params['partitionsNoPush'] ) ) {
+                       $this->partitionsNoPush = array_flip( $params['partitionsNoPush'] );
+               }
+               $baseConfig = $params;
+               foreach ( array( 'class', 'sectionsByWiki',
+                       'partitionsBySection', 'configByPartition', 'partitionsNoPush' ) as $o )
+               {
+                       unset( $baseConfig[$o] );
+               }
+               foreach ( $this->getPartitionMap() as $partition => $w ) {
+                       if ( !isset( $this->configByPartition[$partition] ) ) {
+                               throw new MWException( "No configuration for partition '$partition'." );
+                       }
+                       $this->partitionQueues[$partition] = JobQueue::factory(
+                               $baseConfig + $this->configByPartition[$partition]
+                       );
+               }
+               // Aggregate cache some per-queue values if there are multiple partition queues
+               $this->cache = $this->isFederated() ? wfGetMainCache() : new EmptyBagOStuff();
+       }
+
+       protected function supportedOrders() {
+               // No FIFO due to partitioning, though "rough timestamp order" is supported
+               return array( 'undefined', 'random', 'timestamp' );
+       }
+
+       protected function optimalOrder() {
+               return 'undefined'; // defer to the partitions
+       }
+
+       protected function supportsDelayedJobs() {
+               return true; // defer checks to the partitions
+       }
+
+       protected function doIsEmpty() {
+               $key = $this->getCacheKey( 'empty' );
+
+               $isEmpty = $this->cache->get( $key );
+               if ( $isEmpty === 'true' ) {
+                       return true;
+               } elseif ( $isEmpty === 'false' ) {
+                       return false;
+               }
+
+               foreach ( $this->partitionQueues as $queue ) {
+                       if ( !$queue->doIsEmpty() ) {
+                               $this->cache->add( $key, 'false', self::CACHE_TTL_LONG );
+                               return false;
+                       }
+               }
+
+               $this->cache->add( $key, 'true', self::CACHE_TTL_LONG );
+               return true;
+       }
+
+       protected function doGetSize() {
+               return $this->getCrossPartitionSum( 'size', 'doGetSize' );
+       }
+
+       protected function doGetAcquiredCount() {
+               return $this->getCrossPartitionSum( 'acquiredcount', 'doGetAcquiredCount' );
+       }
+
+       protected function doGetDelayedCount() {
+               return $this->getCrossPartitionSum( 'delayedcount', 'doGetDelayedCount' );
+       }
+
+       protected function doGetAbandonedCount() {
+               return $this->getCrossPartitionSum( 'abandonedcount', 'doGetAbandonedCount' );
+       }
+
+       /**
+        * @param string $type
+        * @param string $method
+        * @return integer
+        */
+       protected function getCrossPartitionSum( $type, $method ) {
+               $key = $this->getCacheKey( $type );
+
+               $count = $this->cache->get( $key );
+               if ( is_int( $count ) ) {
+                       return $count;
+               }
+
+               $count = 0;
+               foreach ( $this->partitionQueues as $queue ) {
+                       $count += $queue->$method();
+               }
+
+               $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
+               return $count;
+       }
+
+       protected function doBatchPush( array $jobs, $flags ) {
+               if ( !count( $jobs ) ) {
+                       return true; // nothing to do
+               }
+
+               $partitionsTry = array_diff_key(
+                       $this->getPartitionMap(),
+                       $this->partitionsNoPush
+               ); // (partition => weight)
+
+               // Try to insert the jobs and update $partitionsTry on any failures
+               $jobsLeft = $this->tryJobInsertions( $jobs, $partitionsTry, $flags );
+               if ( count( $jobsLeft ) ) { // some jobs failed to insert?
+                       // Try to insert the remaning jobs once more, ignoring the bad partitions
+                       return !count( $this->tryJobInsertions( $jobsLeft, $partitionsTry, $flags ) );
+               } else {
+                       return true;
+               }
+       }
+
+       /**
+        * @param array $jobs
+        * @param array $partitionsTry
+        * @param integer $flags
+        * @return array List of Job object that could not be inserted
+        */
+       protected function tryJobInsertions( array $jobs, array &$partitionsTry, $flags ) {
+               if ( !count( $partitionsTry ) ) {
+                       return $jobs; // can't insert anything
+               }
+
+               $jobsLeft = array();
+
+               $partitionRing = new HashRing( $partitionsTry );
+               // Because jobs are spread across partitions, per-job de-duplication needs
+               // to use a consistent hash to avoid allowing duplicate jobs per partition.
+               // When inserting a batch of de-duplicated jobs, QOS_ATOMIC is disregarded.
+               $uJobsByPartition = array(); // (partition name => job list)
+               foreach ( $jobs as $key => $job ) {
+                       if ( $job->ignoreDuplicates() ) {
+                               $sha1 = sha1( serialize( $job->getDeduplicationInfo() ) );
+                               $uJobsByPartition[$partitionRing->getLocation( $sha1 )][] = $job;
+                               unset( $jobs[$key] );
+                       }
+               }
+               // Get the batches of jobs that are not de-duplicated
+               if ( $flags & self::QOS_ATOMIC ) {
+                       $nuJobBatches = array( $jobs ); // all or nothing
+               } else {
+                       // Split the jobs into batches and spread them out over servers if there
+                       // are many jobs. This helps keep the partitions even. Otherwise, send all
+                       // the jobs to a single partition queue to avoids the extra connections.
+                       $nuJobBatches = array_chunk( $jobs, 300 );
+               }
+
+               // Insert the de-duplicated jobs into the queues...
+               foreach ( $uJobsByPartition as $partition => $jobBatch ) {
+                       $queue = $this->partitionQueues[$partition];
+                       if ( $queue->doBatchPush( $jobBatch, $flags ) ) {
+                               $key = $this->getCacheKey( 'empty' );
+                               $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+                       } else {
+                               unset( $partitionsTry[$partition] ); // blacklist partition
+                               $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+                       }
+               }
+               // Insert the jobs that are not de-duplicated into the queues...
+               foreach ( $nuJobBatches as $jobBatch ) {
+                       $partition = ArrayUtils::pickRandom( $partitionsTry );
+                       if ( $partition === false ) { // all partitions at 0 weight?
+                               $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+                       } else {
+                               $queue = $this->partitionQueues[$partition];
+                               if ( $queue->doBatchPush( $jobBatch, $flags ) ) {
+                                       $key = $this->getCacheKey( 'empty' );
+                                       $this->cache->set( $key, 'false', JobQueueDB::CACHE_TTL_LONG );
+                               } else {
+                                       unset( $partitionsTry[$partition] ); // blacklist partition
+                                       $jobsLeft = array_merge( $jobsLeft, $jobBatch ); // not inserted
+                               }
+                       }
+               }
+
+               return $jobsLeft;
+       }
+
+       protected function doPop() {
+               $key = $this->getCacheKey( 'empty' );
+
+               $isEmpty = $this->cache->get( $key );
+               if ( $isEmpty === 'true' ) {
+                       return false;
+               }
+
+               $partitionsTry = $this->getPartitionMap(); // (partition => weight)
+
+               while ( count( $partitionsTry ) ) {
+                       $partition = ArrayUtils::pickRandom( $partitionsTry );
+                       if ( $partition === false ) {
+                               break; // all partitions at 0 weight
+                       }
+                       $queue = $this->partitionQueues[$partition];
+                       $job = $queue->pop();
+                       if ( $job ) {
+                               $job->metadata['QueuePartition'] = $partition;
+                               return $job;
+                       } else {
+                               unset( $partitionsTry[$partition] ); // blacklist partition
+                       }
+               }
+
+               $this->cache->set( $key, 'true', JobQueueDB::CACHE_TTL_LONG );
+               return false;
+       }
+
+       protected function doAck( Job $job ) {
+               if ( !isset( $job->metadata['QueuePartition'] ) ) {
+                       throw new MWException( "The given job has no defined partition name." );
+               }
+               return $this->partitionQueues[$job->metadata['QueuePartition']]->ack( $job );
+       }
+
+       protected function doDelete() {
+               foreach ( $this->partitionQueues as $queue ) {
+                       $queue->doDelete();
+               }
+       }
+
+       protected function doWaitForBackups() {
+               foreach ( $this->partitionQueues as $queue ) {
+                       $queue->waitForBackups();
+               }
+       }
+
+       protected function doGetPeriodicTasks() {
+               $tasks = array();
+               foreach ( $this->partitionQueues as $partition => $queue ) {
+                       foreach ( $queue->getPeriodicTasks() as $task => $def ) {
+                               $tasks["{$partition}:{$task}"] = $def;
+                       }
+               }
+               return $tasks;
+       }
+
+       protected function doFlushCaches() {
+               static $types = array(
+                       'empty',
+                       'size',
+                       'acquiredcount',
+                       'delayedcount',
+                       'abandonedcount'
+               );
+               foreach ( $types as $type ) {
+                       $this->cache->delete( $this->getCacheKey( $type ) );
+               }
+               foreach ( $this->partitionQueues as $queue ) {
+                       $queue->doFlushCaches();
+               }
+       }
+
+       public function getAllQueuedJobs() {
+               $iterator = new AppendIterator();
+               foreach ( $this->partitionQueues as $queue ) {
+                       $iterator->append( $queue->getAllQueuedJobs() );
+               }
+               return $iterator;
+       }
+
+       public function getAllDelayedJobs() {
+               $iterator = new AppendIterator();
+               foreach ( $this->partitionQueues as $queue ) {
+                       $iterator->append( $queue->getAllDelayedJobs() );
+               }
+               return $iterator;
+       }
+
+       public function setTestingPrefix( $key ) {
+               foreach ( $this->partitionQueues as $queue ) {
+                       $queue->setTestingPrefix( $key );
+               }
+       }
+
+       /**
+        * @return Array Map of (partition name => weight)
+        */
+       protected function getPartitionMap() {
+               $section = isset( $this->sectionsByWiki[$this->wiki] )
+                       ? $this->sectionsByWiki[$this->wiki]
+                       : 'default';
+               if ( !isset( $this->partitionsBySection[$section] ) ) {
+                       throw new MWException( "No configuration for section '$section'." );
+               }
+               return $this->partitionsBySection[$section];
+       }
+
+       /**
+        * @return bool The queue is actually split up across multiple queue partitions
+        */
+       protected function isFederated() {
+               return ( count( $this->getPartitionMap() ) > 1 );
+       }
+
+       /**
+        * @return string
+        */
+       private function getCacheKey( $property ) {
+               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, $property );
+       }
+}
index 351c71a..85f99b7 100644 (file)
@@ -40,6 +40,7 @@ class JobQueueGroup {
        const TYPE_ANY = 2; // integer; any job
 
        const USE_CACHE = 1; // integer; use process or persistent cache
+       const USE_PRIORITY = 2; // integer; respect deprioritization
 
        const PROC_CACHE_TTL = 15; // integer; seconds
 
@@ -146,6 +147,9 @@ class JobQueueGroup {
         */
        public function pop( $qtype = self::TYPE_DEFAULT, $flags = 0 ) {
                if ( is_string( $qtype ) ) { // specific job type
+                       if ( ( $flags & self::USE_PRIORITY ) && $this->isQueueDeprioritized( $qtype ) ) {
+                               return false; // back off
+                       }
                        $job = $this->get( $qtype )->pop();
                        if ( !$job ) {
                                JobQueueAggregator::singleton()->notifyQueueEmpty( $this->wiki, $qtype );
@@ -167,6 +171,9 @@ class JobQueueGroup {
                        shuffle( $types ); // avoid starvation
 
                        foreach ( $types as $type ) { // for each queue...
+                               if ( ( $flags & self::USE_PRIORITY ) && $this->isQueueDeprioritized( $type ) ) {
+                                       continue; // back off
+                               }
                                $job = $this->get( $type )->pop();
                                if ( $job ) { // found
                                        return $job;
@@ -264,10 +271,15 @@ class JobQueueGroup {
         * @return bool
         */
        public function isQueueDeprioritized( $type ) {
+               if ( $this->cache->has( 'isDeprioritized', $type, 5 ) ) {
+                       return $this->cache->get( 'isDeprioritized', $type );
+               }
                if ( $type === 'refreshLinks2' ) {
                        // Don't keep converting refreshLinks2 => refreshLinks jobs if the
                        // later jobs have not been done yet. This helps throttle queue spam.
-                       return !$this->get( 'refreshLinks' )->isEmpty();
+                       $deprioritized = !$this->get( 'refreshLinks' )->isEmpty();
+                       $this->cache->set( 'isDeprioritized', $type, $deprioritized );
+                       return $deprioritized;
                }
                return false;
        }
index 3db8260..1f5b761 100644 (file)
 /**
  * Class to handle job queues stored in Redis
  *
+ * This is faster, less resource intensive, queue that JobQueueDB.
+ * All data for a queue using this class is placed into one redis server.
+ *
+ * There are eight main redis keys used to track jobs:
+ *   - l-unclaimed  : A list of job IDs used for ready unclaimed jobs
+ *   - z-claimed    : A sorted set of (job ID, UNIX timestamp as score) used for job retries
+ *   - z-abandoned  : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
+ *   - z-delayed    : A sorted set of (job ID, UNIX timestamp as score) used for delayed jobs
+ *   - h-idBySha1   : A hash of (SHA1 => job ID) for unclaimed jobs used for de-duplication
+ *   - h-sha1ById   : A hash of (job ID => SHA1) for unclaimed jobs used for de-duplication
+ *   - h-attempts   : A hash of (job ID => attempt count) used for job claiming/retries
+ *   - h-data       : A hash of (job ID => serialized blobs) for job storage
+ * A job ID can be in only one of z-delayed, l-unclaimed, z-claimed, and z-abandoned.
+ * If an ID appears in any of those lists, it should have a h-data entry for its ID.
+ * If a job has a SHA1 de-duplication value and its ID is in l-unclaimed or z-delayed, then
+ * there should be no other such jobs with that SHA1. Every h-idBySha1 entry has an h-sha1ById
+ * entry and every h-sha1ById must refer to an ID that is l-unclaimed. If a job has its
+ * ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
+ *
+ * Additionally, "rootjob:* keys track "root jobs" used for additional de-duplication.
+ * Aside from root job keys, all keys have no expiry, and are only removed when jobs are run.
+ * All the keys are prefixed with the relevant wiki ID information.
+ *
+ * This class requires Redis 2.6 as it makes use Lua scripts for fast atomic operations.
+ * Additionally, it should be noted that redis has different persistence modes, such
+ * as rdb snapshots, journaling, and no persistent. Appropriate configuration should be
+ * made on the servers based on what queues are using it and what tolerance they have.
+ *
  * @ingroup JobQueue
- * @since 1.21
+ * @ingroup Redis
+ * @since 1.22
  */
 class JobQueueRedis extends JobQueue {
        /** @var RedisConnectionPool */
        protected $redisPool;
 
        protected $server; // string; server address
+       protected $compression; // string; compression method to use
 
-       const ROOTJOB_TTL = 1209600; // integer; seconds to remember root jobs (14 days)
        const MAX_AGE_PRUNE = 604800; // integer; seconds a job can live once claimed (7 days)
 
        protected $key; // string; key to prefix the queue keys with (used for testing)
@@ -41,14 +70,18 @@ class JobQueueRedis extends JobQueue {
        /**
         * @params include:
         *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+        *                   Note that the serializer option is ignored "none" is always used.
         *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
         *                   If a hostname is specified but no port, the standard port number
         *                   6379 will be used. Required.
+        *   - compression : The type of compression to use; one of (none,gzip).
         * @param array $params
         */
        public function __construct( array $params ) {
                parent::__construct( $params );
+               $params['redisConfig']['serializer'] = 'none'; // make it easy to use Lua
                $this->server = $params['redisServer'];
+               $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
        }
 
@@ -60,18 +93,17 @@ class JobQueueRedis extends JobQueue {
                return 'fifo';
        }
 
+       protected function supportsDelayedJobs() {
+               return true;
+       }
+
        /**
         * @see JobQueue::doIsEmpty()
         * @return bool
         * @throws MWException
         */
        protected function doIsEmpty() {
-               $conn = $this->getConnection();
-               try {
-                       return ( $conn->lSize( $this->getQueueKey( 'l-unclaimed' ) ) == 0 );
-               } catch ( RedisException $e ) {
-                       $this->throwRedisException( $this->server, $conn, $e );
-               }
+               return $this->doGetSize() == 0;
        }
 
        /**
@@ -99,7 +131,44 @@ class JobQueueRedis extends JobQueue {
                }
                $conn = $this->getConnection();
                try {
-                       return $conn->lSize( $this->getQueueKey( 'l-claimed' ) );
+                       $conn->multi( Redis::PIPELINE );
+                       $conn->zSize( $this->getQueueKey( 'z-claimed' ) );
+                       $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
+                       return array_sum( $conn->exec() );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+       }
+
+       /**
+        * @see JobQueue::doGetDelayedCount()
+        * @return integer
+        * @throws MWException
+        */
+       protected function doGetDelayedCount() {
+               if ( !$this->checkDelay ) {
+                       return 0; // no delayed jobs
+               }
+               $conn = $this->getConnection();
+               try {
+                       return $conn->zSize( $this->getQueueKey( 'z-delayed' ) );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+       }
+
+       /**
+        * @see JobQueue::doGetAbandonedCount()
+        * @return integer
+        * @throws MWException
+        */
+       protected function doGetAbandonedCount() {
+               if ( $this->claimTTL <= 0 ) {
+                       return 0; // no acknowledgements
+               }
+               $conn = $this->getConnection();
+               try {
+                       return $conn->zSize( $this->getQueueKey( 'z-abandoned' ) );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -113,65 +182,46 @@ class JobQueueRedis extends JobQueue {
         * @throws MWException
         */
        protected function doBatchPush( array $jobs, $flags ) {
-               if ( !count( $jobs ) ) {
-                       return true;
-               }
-
-               // Convert the jobs into a list of field maps
-               $items = array(); // (uid => job fields map)
+               // Convert the jobs into field maps (de-duplicated against each other)
+               $items = array(); // (job ID => job fields map)
                foreach ( $jobs as $job ) {
                        $item = $this->getNewJobFields( $job );
-                       $items[$item['uid']] = $item;
+                       if ( strlen( $item['sha1'] ) ) { // hash identifier => de-duplicate
+                               $items[$item['sha1']] = $item;
+                       } else {
+                               $items[$item['uuid']] = $item;
+                       }
                }
 
-               $dedupUids = array(); // list of uids to check for duplicates
-               foreach ( $items as $item ) {
-                       if ( $this->isHashUid( $item['uid'] ) ) { // hash identifier => de-duplicate
-                               $dedupUids[] = $item['uid'];
-                       }
+               if ( !count( $items ) ) {
+                       return true; // nothing to do
                }
 
                $conn = $this->getConnection();
                try {
-                       // Find which of these jobs are duplicates of unclaimed jobs in the queue...
-                       if ( count( $dedupUids ) ) {
-                               $conn->multi( Redis::PIPELINE );
-                               foreach ( $dedupUids as $uid ) { // check if job data exists
-                                       $conn->exists( $this->prefixWithQueueKey( 'data', $uid ) );
-                               }
-                               if ( $this->claimTTL > 0 ) { // check which jobs were claimed
-                                       foreach ( $dedupUids as $uid ) {
-                                               $conn->hExists( $this->prefixWithQueueKey( 'h-meta', $uid ), 'ctime' );
-                                       }
-                                       list( $exists, $claimed ) = array_chunk( $conn->exec(), count( $dedupUids ) );
+                       // Actually push the non-duplicate jobs into the queue...
+                       if ( $flags & self::QOS_ATOMIC ) {
+                               $batches = array( $items ); // all or nothing
+                       } else {
+                               $batches = array_chunk( $items, 500 ); // avoid tying up the server
+                       }
+                       $failed = 0;
+                       $pushed = 0;
+                       foreach ( $batches as $itemBatch ) {
+                               $added = $this->pushBlobs( $conn, $itemBatch );
+                               if ( is_int( $added ) ) {
+                                       $pushed += $added;
                                } else {
-                                       $exists = $conn->exec();
-                                       $claimed = array(); // no claim system
-                               }
-                               // Remove the duplicate jobs to cut down on pushing duplicate uids...
-                               foreach ( $dedupUids as $k => $uid ) {
-                                       if ( $exists[$k] && empty( $claimed[$k] ) ) {
-                                               unset( $items[$uid] );
-                                       }
+                                       $failed += count( $itemBatch );
                                }
                        }
-                       // Actually push the non-duplicate jobs into the queue...
-                       if ( count( $items ) ) {
-                               $uids = array_keys( $items );
-                               $conn->multi( Redis::MULTI ); // begin (atomic trx)
-                               $conn->mSet( $this->prefixKeysWithQueueKey( 'data', $items ) );
-                               call_user_func_array(
-                                       array( $conn, 'lPush' ),
-                                       array_merge( array( $this->getQueueKey( 'l-unclaimed' ) ), $uids )
-                               );
-                               $res = $conn->exec(); // commit (atomic trx)
-                               if ( in_array( false, $res, true ) ) {
-                                       wfDebugLog( 'JobQueueRedis', "Could not insert {$this->type} job(s)." );
-                                       return false;
-                               }
+                       if ( $failed > 0 ) {
+                               wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
+                               return false;
                        }
-                       wfIncrStats( 'job-insert', count( $items ) );
-                       wfIncrStats( 'job-insert-duplicate', count( $jobs ) - count( $items ) );
+                       JobQueue::incrStats( 'job-insert', $this->type, count( $items ) );
+                       JobQueue::incrStats( 'job-insert-duplicate', $this->type,
+                               count( $items ) - $failed - $pushed );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -179,6 +229,59 @@ class JobQueueRedis extends JobQueue {
                return true;
        }
 
+       /**
+        * @param RedisConnRef $conn
+        * @param array $items List of results from JobQueueRedis::getNewJobFields()
+        * @return integer Number of jobs inserted (duplicates are ignored)
+        * @throws RedisException
+        */
+       protected function pushBlobs( RedisConnRef $conn, array $items ) {
+               $args = array(); // ([id, sha1, rtime, blob [, id, sha1, rtime, blob ... ] ] )
+               foreach ( $items as $item ) {
+                       $args[] = (string)$item['uuid'];
+                       $args[] = (string)$item['sha1'];
+                       $args[] = (string)$item['rtimestamp'];
+                       $args[] = (string)$this->serialize( $item );
+               }
+               static $script =
+<<<LUA
+               if #ARGV % 4 ~= 0 then return redis.error_reply('Unmatched arguments') end
+               local pushed = 0
+               for i = 1,#ARGV,4 do
+                       local id,sha1,rtimestamp,blob = ARGV[i],ARGV[i+1],ARGV[i+2],ARGV[i+3]
+                       if sha1 == '' or redis.call('hExists',KEYS[3],sha1) == 0 then
+                               if 1*rtimestamp > 0 then
+                                       -- Insert into delayed queue (release time as score)
+                                       redis.call('zAdd',KEYS[4],rtimestamp,id)
+                               else
+                                       -- Insert into unclaimed queue
+                                       redis.call('lPush',KEYS[1],id)
+                               end
+                               if sha1 ~= '' then
+                                       redis.call('hSet',KEYS[2],id,sha1)
+                                       redis.call('hSet',KEYS[3],sha1,id)
+                               end
+                               redis.call('hSet',KEYS[5],id,blob)
+                               pushed = pushed + 1
+                       end
+               end
+               return pushed
+LUA;
+               return $conn->luaEval( $script,
+                       array_merge(
+                               array(
+                                       $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+                                       $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+                                       $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+                                       $this->getQueueKey( 'z-delayed' ), # KEYS[4]
+                                       $this->getQueueKey( 'h-data' ), # KEYS[5]
+                               ),
+                               $args
+                       ),
+                       5 # number of first argument(s) that are keys
+               );
+       }
+
        /**
         * @see JobQueue::doPop()
         * @return Job|bool
@@ -187,42 +290,33 @@ class JobQueueRedis extends JobQueue {
        protected function doPop() {
                $job = false;
 
-               if ( $this->claimTTL <= 0 && mt_rand( 0, 99 ) == 0 ) {
-                       $this->cleanupClaimedJobs(); // prune jobs and IDs from the "garbage" list
+               // Push ready delayed jobs into the queue every 10 jobs to spread the load.
+               // This is also done as a periodic task, but we don't want too much done at once.
+               if ( $this->checkDelay && mt_rand( 0, 9 ) == 0 ) {
+                       $this->releaseReadyDelayedJobs();
                }
 
                $conn = $this->getConnection();
                try {
                        do {
-                               // Atomically pop an item off the queue and onto the "claimed" list
-                               $uid = $conn->rpoplpush(
-                                       $this->getQueueKey( 'l-unclaimed' ),
-                                       $this->getQueueKey( 'l-claimed' )
-                               );
-                               if ( $uid === false ) {
-                                       break; // no jobs; nothing to do
-                               }
-
-                               wfIncrStats( 'job-pop' );
-                               $conn->multi( Redis::PIPELINE );
-                               $conn->get( $this->prefixWithQueueKey( 'data', $uid ) );
                                if ( $this->claimTTL > 0 ) {
-                                       // Set the claim timestamp metadata. If this step fails, then
-                                       // the timestamp will be assumed to be the current timestamp by
-                                       // recycleAndDeleteStaleJobs() as of the next time that it runs.
-                                       // If two runners claim duplicate jobs, one will abort here.
-                                       $conn->hSetNx( $this->prefixWithQueueKey( 'h-meta', $uid ), 'ctime', time() );
+                                       // Keep the claimed job list down for high-traffic queues
+                                       if ( mt_rand( 0, 99 ) == 0 ) {
+                                               $this->recycleAndDeleteStaleJobs();
+                                       }
+                                       $blob = $this->popAndAcquireBlob( $conn );
                                } else {
-                                       // If this fails, the message key will be deleted in cleanupClaimedJobs().
-                                       // If two runners claim duplicate jobs, one of them will abort here.
-                                       $conn->delete(
-                                               $this->prefixWithQueueKey( 'h-meta', $uid ),
-                                               $this->prefixWithQueueKey( 'data', $uid ) );
+                                       $blob = $this->popAndDeleteBlob( $conn );
                                }
-                               list( $item, $ok ) = $conn->exec();
-                               if ( $item === false || ( $this->claimTTL && !$ok ) ) {
-                                       wfDebug( "Could not find or delete job $uid; probably was a duplicate." );
-                                       continue; // job was probably a duplicate
+                               if ( $blob === false ) {
+                                       break; // no jobs; nothing to do
+                               }
+
+                               JobQueue::incrStats( 'job-pop', $this->type );
+                               $item = $this->unserialize( $blob );
+                               if ( $item === false ) {
+                                       wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
+                                       continue;
                                }
 
                                // If $item is invalid, recycleAndDeleteStaleJobs() will cleanup as needed
@@ -232,17 +326,75 @@ class JobQueueRedis extends JobQueue {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
 
-               // Flag this job as an old duplicate based on its "root" job...
-               try {
-                       if ( $job && $this->isRootJobOldDuplicate( $job ) ) {
-                               wfIncrStats( 'job-pop-duplicate' );
-                               return DuplicateJob::newFromJob( $job ); // convert to a no-op
-                       }
-               } catch ( MWException $e ) {} // don't lose jobs over this
-
                return $job;
        }
 
+       /**
+        * @param RedisConnRef $conn
+        * @return array serialized string or false
+        * @throws RedisException
+        */
+       protected function popAndDeleteBlob( RedisConnRef $conn ) {
+               static $script =
+<<<LUA
+               -- Pop an item off the queue
+               local id = redis.call('rpop',KEYS[1])
+               if not id then return false end
+               -- Get the job data and remove it
+               local item = redis.call('hGet',KEYS[4],id)
+               redis.call('hDel',KEYS[4],id)
+               -- Allow new duplicates of this job
+               local sha1 = redis.call('hGet',KEYS[2],id)
+               if sha1 then redis.call('hDel',KEYS[3],sha1) end
+               redis.call('hDel',KEYS[2],id)
+               -- Return the job data
+               return item
+LUA;
+               return $conn->luaEval( $script,
+                       array(
+                               $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+                               $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+                               $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+                               $this->getQueueKey( 'h-data' ), # KEYS[4]
+                       ),
+                       4 # number of first argument(s) that are keys
+               );
+       }
+
+       /**
+        * @param RedisConnRef $conn
+        * @return array serialized string or false
+        * @throws RedisException
+        */
+       protected function popAndAcquireBlob( RedisConnRef $conn ) {
+               static $script =
+<<<LUA
+               -- Pop an item off the queue
+               local id = redis.call('rPop',KEYS[1])
+               if not id then return false end
+               -- Allow new duplicates of this job
+               local sha1 = redis.call('hGet',KEYS[2],id)
+               if sha1 then redis.call('hDel',KEYS[3],sha1) end
+               redis.call('hDel',KEYS[2],id)
+               -- Mark the jobs as claimed and return it
+               redis.call('zAdd',KEYS[4],ARGV[1],id)
+               redis.call('hIncrBy',KEYS[5],id,1)
+               return redis.call('hGet',KEYS[6],id)
+LUA;
+               return $conn->luaEval( $script,
+                       array(
+                               $this->getQueueKey( 'l-unclaimed' ), # KEYS[1]
+                               $this->getQueueKey( 'h-sha1ById' ), # KEYS[2]
+                               $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
+                               $this->getQueueKey( 'z-claimed' ), # KEYS[4]
+                               $this->getQueueKey( 'h-attempts' ), # KEYS[5]
+                               $this->getQueueKey( 'h-data' ), # KEYS[6]
+                               time(), # ARGV[1] (injected to be replication-safe)
+                       ),
+                       6 # number of first argument(s) that are keys
+               );
+       }
+
        /**
         * @see JobQueue::doAck()
         * @param Job $job
@@ -250,27 +402,31 @@ class JobQueueRedis extends JobQueue {
         * @throws MWException
         */
        protected function doAck( Job $job ) {
+               if ( !isset( $job->metadata['uuid'] ) ) {
+                       throw new MWException( "Job of type '{$job->getType()}' has no UUID." );
+               }
                if ( $this->claimTTL > 0 ) {
                        $conn = $this->getConnection();
                        try {
-                               // Get the exact field map this Job came from, regardless of whether
-                               // the job was transformed into a DuplicateJob or anything of the sort.
-                               $item = $job->metadata['sourceFields'];
-
-                               $conn->multi( Redis::MULTI ); // begin (atomic trx)
-                               // Remove the first instance of this job scanning right-to-left.
-                               // This is O(N) in the worst case, but is likely to be much faster since
-                               // jobs are pushed to the left and we are starting from the right, where
-                               // the longest running jobs are likely to be. These should be the first
-                               // jobs to be acknowledged assuming that job run times are roughly equal.
-                               $conn->lRem( $this->getQueueKey( 'l-claimed' ), $item['uid'], -1 );
-                               // Delete the job data and its claim metadata
-                               $conn->delete(
-                                       $this->prefixWithQueueKey( 'h-meta', $item['uid'] ),
-                                       $this->prefixWithQueueKey( 'data', $item['uid'] ) );
-                               $res = $conn->exec(); // commit (atomic trx)
-
-                               if ( in_array( false, $res, true ) ) {
+                               static $script =
+<<<LUA
+                               -- Unmark the job as claimed
+                               redis.call('zRem',KEYS[1],ARGV[1])
+                               redis.call('hDel',KEYS[2],ARGV[1])
+                               -- Delete the job data itself
+                               return redis.call('hDel',KEYS[3],ARGV[1])
+LUA;
+                               $res = $conn->luaEval( $script,
+                                       array(
+                                               $this->getQueueKey( 'z-claimed' ), # KEYS[1]
+                                               $this->getQueueKey( 'h-attempts' ), # KEYS[2]
+                                               $this->getQueueKey( 'h-data' ), # KEYS[3]
+                                               $job->metadata['uuid'] # ARGV[1]
+                                       ),
+                                       3 # number of first argument(s) that are keys
+                               );
+
+                               if ( !$res ) {
                                        wfDebugLog( 'JobQueueRedis', "Could not acknowledge {$this->type} job." );
                                        return false;
                                }
@@ -288,13 +444,12 @@ class JobQueueRedis extends JobQueue {
         * @throws MWException
         */
        protected function doDeduplicateRootJob( Job $job ) {
-               $params = $job->getParams();
-               if ( !isset( $params['rootJobSignature'] ) ) {
-                       throw new MWException( "Cannot register root job; missing 'rootJobSignature'." );
-               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
-                       throw new MWException( "Cannot register root job; missing 'rootJobTimestamp'." );
+               if ( !$job->hasRootJobParams() ) {
+                       throw new MWException( "Cannot register root job; missing parameters." );
                }
-               $key = $this->getRootJobKey( $params['rootJobSignature'] );
+               $params = $job->getRootJobParams();
+
+               $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
 
                $conn = $this->getConnection();
                try {
@@ -310,25 +465,20 @@ class JobQueueRedis extends JobQueue {
        }
 
        /**
-        * Check if the "root" job of a given job has been superseded by a newer one
-        *
-        * @param $job Job
+        * @see JobQueue::doIsRootJobOldDuplicate()
+        * @param Job $job
         * @return bool
-        * @throws MWException
         */
-       protected function isRootJobOldDuplicate( Job $job ) {
-               $params = $job->getParams();
-               if ( !isset( $params['rootJobSignature'] ) ) {
+       protected function doIsRootJobOldDuplicate( Job $job ) {
+               if ( !$job->hasRootJobParams() ) {
                        return false; // job has no de-deplication info
-               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
-                       wfDebugLog( 'JobQueueRedis', "Cannot check root job; missing 'rootJobTimestamp'." );
-                       return false;
                }
+               $params = $job->getRootJobParams();
 
                $conn = $this->getConnection();
                try {
                        // Get the last time this root job was enqueued
-                       $timestamp = $conn->get( $this->getRootJobKey( $params['rootJobSignature'] ) );
+                       $timestamp = $conn->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -337,15 +487,32 @@ class JobQueueRedis extends JobQueue {
                return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
        }
 
+       /**
+        * @see JobQueue::doDelete()
+        * @return bool
+        */
+       protected function doDelete() {
+               static $props = array( 'l-unclaimed', 'z-claimed', 'z-abandoned',
+                       'z-delayed', 'h-idBySha1', 'h-sha1ById', 'h-attempts', 'h-data' );
+
+               $conn = $this->getConnection();
+               try {
+                       $keys = array();
+                       foreach ( $props as $prop ) {
+                               $keys[] = $this->getQueueKey( $prop );
+                       }
+                       $res = ( $conn->delete( $keys ) !== false );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+       }
+
        /**
         * @see JobQueue::getAllQueuedJobs()
         * @return Iterator
         */
        public function getAllQueuedJobs() {
                $conn = $this->getConnection();
-               if ( !$conn ) {
-                       throw new MWException( "Unable to connect to redis server." );
-               }
                try {
                        $that = $this;
                        return new MappedIterator(
@@ -360,7 +527,26 @@ class JobQueueRedis extends JobQueue {
        }
 
        /**
-        * This function should not be called outside RedisJobQueue
+        * @see JobQueue::getAllQueuedJobs()
+        * @return Iterator
+        */
+       public function getAllDelayedJobs() {
+               $conn = $this->getConnection();
+               try {
+                       $that = $this;
+                       return new MappedIterator( // delayed jobs
+                               $conn->zRange( $this->getQueueKey( 'z-delayed' ), 0, -1 ),
+                               function( $uid ) use ( $that, $conn ) {
+                                       return $that->getJobFromUidInternal( $uid, $conn );
+                               }
+                       );
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $this->server, $conn, $e );
+               }
+       }
+
+       /**
+        * This function should not be called outside JobQueueRedis
         *
         * @param $uid string
         * @param $conn RedisConnRef
@@ -369,14 +555,13 @@ class JobQueueRedis extends JobQueue {
         */
        public function getJobFromUidInternal( $uid, RedisConnRef $conn ) {
                try {
-                       $fields = $conn->get( $this->prefixWithQueueKey( 'data', $uid ) );
-                       if ( !is_array( $fields ) ) { // wtf?
-                               $conn->delete( $this->prefixWithQueueKey( 'data', $uid ) );
-                               throw new MWException( "Could not find job with UID '$uid'." );
+                       $item = $this->unserialize( $conn->hGet( $this->getQueueKey( 'h-data' ), $uid ) );
+                       if ( !is_array( $item ) ) { // this shouldn't happen
+                               throw new MWException( "Could not find job with ID '$uid'." );
                        }
-                       $title = Title::makeTitle( $fields['namespace'], $fields['title'] );
-                       $job = Job::factory( $fields['type'], $title, $fields['params'] );
-                       $job->metadata['sourceFields'] = $fields;
+                       $title = Title::makeTitle( $item['namespace'], $item['title'] );
+                       $job = Job::factory( $item['type'], $title, $item['params'] );
+                       $job->metadata['uuid'] = $item['uuid'];
                        return $job;
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
@@ -384,90 +569,35 @@ class JobQueueRedis extends JobQueue {
        }
 
        /**
-        * Recycle or destroy any jobs that have been claimed for too long
+        * Release any ready delayed jobs into the queue
         *
-        * @return integer Number of jobs recycled/deleted
+        * @return integer Number of jobs released
         * @throws MWException
         */
-       public function recycleAndDeleteStaleJobs() {
-               if ( $this->claimTTL <= 0 ) { // sanity
-                       throw new MWException( "Cannot recycle jobs since acknowledgements are disabled." );
-               }
+       public function releaseReadyDelayedJobs() {
                $count = 0;
-               // For each job item that can be retried, we need to add it back to the
-               // main queue and remove it from the list of currenty claimed job items.
+
                $conn = $this->getConnection();
                try {
-                       // Avoid duplicate insertions of items to be re-enqueued
-                       $conn->multi( Redis::MULTI );
-                       $conn->setnx( $this->getQueueKey( 'lock' ), 1 );
-                       $conn->expire( $this->getQueueKey( 'lock' ), 3600 );
-                       if ( $conn->exec() !== array( true, true ) ) { // lock
-                               return $count; // already in progress
-                       }
-
-                       $now = time();
-                       $claimCutoff = $now - $this->claimTTL;
-                       $pruneCutoff = $now - self::MAX_AGE_PRUNE;
-
-                       // Get the list of all claimed jobs
-                       $claimedUids = $conn->lRange( $this->getQueueKey( 'l-claimed' ), 0, -1 );
-                       // Get a map of (uid => claim metadata) for all claimed jobs
-                       $metadata = $conn->mGet( $this->prefixValuesWithQueueKey( 'h-meta', $claimedUids ) );
-
-                       $uidsPush = array(); // items IDs to move to the "unclaimed" queue
-                       $uidsRemove = array(); // item IDs to remove from "claimed" queue
-                       foreach ( $claimedUids as $i => $uid ) { // all claimed items
-                               $info = $metadata[$i] ? $metadata[$i] : array();
-                               if ( isset( $info['ctime'] ) || isset( $info['rctime'] ) ) {
-                                       // Prefer "ctime" (set by pop()) over "rctime" (set by this function)
-                                       $ctime = isset( $info['ctime'] ) ? $info['ctime'] : $info['rctime'];
-                                       // Claimed job claimed for too long?
-                                       if ( $ctime < $claimCutoff ) {
-                                               // Get the number of failed attempts
-                                               $attempts = isset( $info['attempts'] ) ? $info['attempts'] : 0;
-                                               if ( $attempts < $this->maxTries ) {
-                                                       $uidsPush[] = $uid; // retry it
-                                               } elseif ( $ctime < $pruneCutoff ) {
-                                                       $uidsRemove[] = $uid; // just remove it
-                                               }
-                                       }
-                               } else {
-                                       // If pop() failed to set the claim timestamp, set it to the current time.
-                                       // Since that function sets this non-atomically *after* moving the job to
-                                       // the "claimed" queue, it may be the case that it just didn't set it yet.
-                                       $conn->hSet( $this->prefixWithQueueKey( 'h-meta', $uid ), 'rctime', $now );
-                               }
-                       }
-
-                       $conn->multi( Redis::MULTI ); // begin (atomic trx)
-                       if ( count( $uidsPush ) ) { // move from "l-claimed" to "l-unclaimed"
-                               call_user_func_array(
-                                       array( $conn, 'lPush' ),
-                                       array_merge( array( $this->getQueueKey( 'l-unclaimed' ) ), $uidsPush )
-                               );
-                               foreach ( $uidsPush as $uid ) {
-                                       $conn->lRem( $this->getQueueKey( 'l-claimed' ), $uid, -1 );
-                                       $conn->hDel( $this->prefixWithQueueKey( 'h-meta', $uid ), 'ctime', 'rctime' );
-                                       $conn->hIncrBy( $this->prefixWithQueueKey( 'h-meta', $uid ), 'attempts', 1 );
-                               }
-                       }
-                       foreach ( $uidsRemove as $uid ) { // remove from "l-claimed"
-                               $conn->lRem( $this->getQueueKey( 'l-claimed' ), $uid, -1 );
-                               $conn->delete( // delete job data and metadata
-                                       $this->prefixWithQueueKey( 'h-meta', $uid ),
-                                       $this->prefixWithQueueKey( 'data', $uid ) );
-                       }
-                       $res = $conn->exec(); // commit (atomic trx)
-
-                       if ( in_array( false, $res, true ) ) {
-                               wfDebugLog( 'JobQueueRedis', "Could not recycle {$this->type} job(s)." );
-                       } else {
-                               $count += ( count( $uidsPush ) + count( $uidsRemove ) );
-                               wfIncrStats( 'job-recycle', count( $uidsPush ) );
-                       }
-
-                       $conn->delete( $this->getQueueKey( 'lock' ) ); // unlock
+                       static $script =
+<<<LUA
+                       -- Get the list of ready delayed jobs, sorted by readiness
+                       local ids = redis.call('zRangeByScore',KEYS[1],0,ARGV[1])
+                       -- Migrate the jobs from the "delayed" set to the "unclaimed" list
+                       for k,id in ipairs(ids) do
+                               redis.call('lPush',KEYS[2],id)
+                               redis.call('zRem',KEYS[1],id)
+                       end
+                       return #ids
+LUA;
+                       $count += (int)$conn->luaEval( $script,
+                               array(
+                                       $this->getQueueKey( 'z-delayed' ), // KEYS[1]
+                                       $this->getQueueKey( 'l-unclaimed' ), // KEYS[2]
+                                       time() // ARGV[1]; max "delay until" UNIX timestamp
+                               ),
+                               2 # first two arguments are keys
+                       );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -476,45 +606,75 @@ class JobQueueRedis extends JobQueue {
        }
 
        /**
-        * Destroy any jobs that have been claimed
+        * Recycle or destroy any jobs that have been claimed for too long
         *
-        * @return integer Number of jobs deleted
+        * @return integer Number of jobs recycled/deleted
         * @throws MWException
         */
-       protected function cleanupClaimedJobs() {
+       public function recycleAndDeleteStaleJobs() {
+               if ( $this->claimTTL <= 0 ) { // sanity
+                       throw new MWException( "Cannot recycle jobs since acknowledgements are disabled." );
+               }
                $count = 0;
-               // Make sure the message for claimed jobs was deleted
-               // and remove the claimed job IDs from the "claimed" list.
+               // For each job item that can be retried, we need to add it back to the
+               // main queue and remove it from the list of currenty claimed job items.
+               // For those that cannot, they are marked as dead and kept around for
+               // investigation and manual job restoration but are eventually deleted.
                $conn = $this->getConnection();
                try {
-                       // Avoid races and duplicate effort
-                       $conn->multi( Redis::MULTI );
-                       $conn->setnx( $this->getQueueKey( 'lock' ), 1 );
-                       $conn->expire( $this->getQueueKey( 'lock' ), 3600 );
-                       if ( $conn->exec() !== array( true, true ) ) { // lock
-                               return $count; // already in progress
-                       }
-                       // Get the list of all claimed jobs
-                       $uids = $conn->lRange( $this->getQueueKey( 'l-claimed' ), 0, -1 );
-                       if ( count( $uids ) ) {
-                               // Delete the message keys and delist the corresponding ids.
-                               // Since the only other changes to "l-claimed" are left pushes, we can just strip
-                               // off the elements read here using a right trim based on the number of ids read.
-                               $conn->multi( Redis::MULTI ); // begin (atomic trx)
-                               $conn->lTrim( $this->getQueueKey( 'l-claimed' ), 0, -count( $uids ) - 1 );
-                               $conn->delete( array_merge(
-                                       $this->prefixValuesWithQueueKey( 'h-meta', $uids ),
-                                       $this->prefixValuesWithQueueKey( 'data', $uids )
-                               ) );
-                               $res = $conn->exec(); // commit (atomic trx)
-
-                               if ( in_array( false, $res, true ) ) {
-                                       wfDebugLog( 'JobQueueRedis', "Could not purge {$this->type} job(s)." );
-                               } else {
-                                       $count += count( $uids );
-                               }
+                       $now = time();
+                       static $script =
+<<<LUA
+                       local released,abandoned,pruned = 0,0,0
+                       -- Get all non-dead jobs that have an expired claim on them.
+                       -- The score for each item is the last claim timestamp (UNIX).
+                       local staleClaims = redis.call('zRangeByScore',KEYS[1],0,ARGV[1])
+                       for k,id in ipairs(staleClaims) do
+                               local timestamp = redis.call('zScore',KEYS[1],id)
+                               local attempts = redis.call('hGet',KEYS[2],id)
+                               if attempts < ARGV[3] then
+                                       -- Claim expired and retries left: re-enqueue the job
+                                       redis.call('lPush',KEYS[3],id)
+                                       redis.call('hIncrBy',KEYS[2],id,1)
+                                       released = released + 1
+                               else
+                                       -- Claim expired and no retries left: mark the job as dead
+                                       redis.call('zAdd',KEYS[5],timestamp,id)
+                                       abandoned = abandoned + 1
+                               end
+                               redis.call('zRem',KEYS[1],id)
+                       end
+                       -- Get all of the dead jobs that have been marked as dead for too long.
+                       -- The score for each item is the last claim timestamp (UNIX).
+                       local deadClaims = redis.call('zRangeByScore',KEYS[5],0,ARGV[2])
+                       for k,id in ipairs(deadClaims) do
+                               -- Stale and out of retries: remove any traces of the job
+                               redis.call('zRem',KEYS[5],id)
+                               redis.call('hDel',KEYS[2],id)
+                               redis.call('hDel',KEYS[4],id)
+                               pruned = pruned + 1
+                       end
+                       return {released,abandoned,pruned}
+LUA;
+                       $res = $conn->luaEval( $script,
+                               array(
+                                       $this->getQueueKey( 'z-claimed' ), # KEYS[1]
+                                       $this->getQueueKey( 'h-attempts' ), # KEYS[2]
+                                       $this->getQueueKey( 'l-unclaimed' ), # KEYS[3]
+                                       $this->getQueueKey( 'h-data' ), # KEYS[4]
+                                       $this->getQueueKey( 'z-abandoned' ), # KEYS[5]
+                                       $now - $this->claimTTL, # ARGV[1]
+                                       $now - self::MAX_AGE_PRUNE, # ARGV[2]
+                                       $this->maxTries # ARGV[3]
+                               ),
+                               5 # number of first argument(s) that are keys
+                       );
+                       if ( $res ) {
+                               list( $released, $abandoned, $pruned ) = $res;
+                               $count += $released + $pruned;
+                               JobQueue::incrStats( 'job-recycle', $this->type, $released );
+                               JobQueue::incrStats( 'job-abandon', $this->type, $abandoned );
                        }
-                       $conn->delete( $this->getQueueKey( 'lock' ) ); // unlock
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $this->server, $conn, $e );
                }
@@ -526,16 +686,20 @@ class JobQueueRedis extends JobQueue {
         * @return Array
         */
        protected function doGetPeriodicTasks() {
+               $tasks = array();
                if ( $this->claimTTL > 0 ) {
-                       return array(
-                               'recycleAndDeleteStaleJobs' => array(
-                                       'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
-                                       'period'   => ceil( $this->claimTTL / 2 )
-                               )
+                       $tasks['recycleAndDeleteStaleJobs'] = array(
+                               'callback' => array( $this, 'recycleAndDeleteStaleJobs' ),
+                               'period' => ceil( $this->claimTTL / 2 )
                        );
-               } else {
-                       return array();
                }
+               if ( $this->checkDelay ) {
+                       $tasks['releaseReadyDelayedJobs'] = array(
+                               'callback' => array( $this, 'releaseReadyDelayedJobs' ),
+                               'period' => 300 // 5 minutes
+                       );
+               }
+               return $tasks;
        }
 
        /**
@@ -545,15 +709,18 @@ class JobQueueRedis extends JobQueue {
        protected function getNewJobFields( Job $job ) {
                return array(
                        // Fields that describe the nature of the job
-                       'type'      => $job->getType(),
-                       'namespace' => $job->getTitle()->getNamespace(),
-                       'title'     => $job->getTitle()->getDBkey(),
-                       'params'    => $job->getParams(),
-                       // Additional metadata
-                       'uid'       => $job->ignoreDuplicates()
+                       'type'       => $job->getType(),
+                       'namespace'  => $job->getTitle()->getNamespace(),
+                       'title'      => $job->getTitle()->getDBkey(),
+                       'params'     => $job->getParams(),
+                       // Some jobs cannot run until a "release timestamp"
+                       'rtimestamp' => $job->getReleaseTimestamp() ?: 0,
+                       // Additional job metadata
+                       'uuid'       => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
+                       'sha1'       => $job->ignoreDuplicates()
                                ? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
-                               : wfRandomString( 32 ),
-                       'timestamp' => time() // UNIX timestamp
+                               : '',
+                       'timestamp'  => time() // UNIX timestamp
                );
        }
 
@@ -565,18 +732,43 @@ class JobQueueRedis extends JobQueue {
                $title = Title::makeTitleSafe( $fields['namespace'], $fields['title'] );
                if ( $title ) {
                        $job = Job::factory( $fields['type'], $title, $fields['params'] );
-                       $job->metadata['sourceFields'] = $fields;
+                       $job->metadata['uuid'] = $fields['uuid'];
                        return $job;
                }
                return false;
        }
 
        /**
-        * @param string $uid Job UID
-        * @return bool Whether $uid is a SHA-1 hash based identifier for de-duplication
+        * @param array $fields
+        * @return string Serialized and possibly compressed version of $fields
+        */
+       protected function serialize( array $fields ) {
+               $blob = serialize( $fields );
+               if ( $this->compression === 'gzip'
+                       && strlen( $blob ) >= 1024 && function_exists( 'gzdeflate' ) )
+               {
+                       $object = (object)array( 'blob' => gzdeflate( $blob ), 'enc' => 'gzip' );
+                       $blobz = serialize( $object );
+                       return ( strlen( $blobz ) < strlen( $blob ) ) ? $blobz : $blob;
+               } else {
+                       return $blob;
+               }
+       }
+
+       /**
+        * @param string $blob
+        * @return array|bool Unserialized version of $blob or false
         */
-       protected function isHashUid( $uid ) {
-               return strlen( $uid ) == 31;
+       protected function unserialize( $blob ) {
+               $fields = unserialize( $blob );
+               if ( is_object( $fields ) ) {
+                       if ( $fields->enc === 'gzip' && function_exists( 'gzinflate' ) ) {
+                               $fields = unserialize( gzinflate( $fields->blob ) );
+                       } else {
+                               $fields = false;
+                       }
+               }
+               return is_array( $fields ) ? $fields : false;
        }
 
        /**
@@ -617,50 +809,6 @@ class JobQueueRedis extends JobQueue {
                }
        }
 
-       /**
-        * @param string $signature Hash identifier of the root job
-        * @return string
-        */
-       private function getRootJobKey( $signature ) {
-               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
-       }
-
-       /**
-        * @param $prop string
-        * @param $string string
-        * @return string
-        */
-       private function prefixWithQueueKey( $prop, $string ) {
-               return $this->getQueueKey( $prop ) . ':' . $string;
-       }
-
-       /**
-        * @param $prop string
-        * @param $items array
-        * @return Array
-        */
-       private function prefixValuesWithQueueKey( $prop, array $items ) {
-               $res = array();
-               foreach ( $items as $item ) {
-                       $res[] = $this->prefixWithQueueKey( $prop, $item );
-               }
-               return $res;
-       }
-
-       /**
-        * @param $prop string
-        * @param $items array
-        * @return Array
-        */
-       private function prefixKeysWithQueueKey( $prop, array $items ) {
-               $res = array();
-               foreach ( $items as $key => $item ) {
-                       $res[$this->prefixWithQueueKey( $prop, $key )] = $item;
-               }
-               return $res;
-       }
-
        /**
         * @param $key string
         * @return void
diff --git a/includes/job/aggregator/JobQueueAggregator.php b/includes/job/aggregator/JobQueueAggregator.php
new file mode 100644 (file)
index 0000000..a8186ab
--- /dev/null
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Job queue aggregator code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle tracking information about all queues
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+abstract class JobQueueAggregator {
+       /** @var JobQueueAggregator */
+       protected static $instance = null;
+
+       /**
+        * @param array $params
+        */
+       protected function __construct( array $params ) {}
+
+       /**
+        * @return JobQueueAggregator
+        */
+       final public static function singleton() {
+               global $wgJobQueueAggregator;
+
+               if ( !isset( self::$instance ) ) {
+                       $class = $wgJobQueueAggregator['class'];
+                       $obj = new $class( $wgJobQueueAggregator );
+                       if ( !( $obj instanceof JobQueueAggregator ) ) {
+                               throw new MWException( "Class '$class' is not a JobQueueAggregator class." );
+                       }
+                       self::$instance = $obj;
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * Destroy the singleton instance
+        *
+        * @return void
+        */
+       final public static function destroySingleton() {
+               self::$instance = null;
+       }
+
+       /**
+        * Mark a queue as being empty
+        *
+        * @param string $wiki
+        * @param string $type
+        * @return bool Success
+        */
+       final public function notifyQueueEmpty( $wiki, $type ) {
+               wfProfileIn( __METHOD__ );
+               $ok = $this->doNotifyQueueEmpty( $wiki, $type );
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @see JobQueueAggregator::notifyQueueEmpty()
+        */
+       abstract protected function doNotifyQueueEmpty( $wiki, $type );
+
+       /**
+        * Mark a queue as being non-empty
+        *
+        * @param string $wiki
+        * @param string $type
+        * @return bool Success
+        */
+       final public function notifyQueueNonEmpty( $wiki, $type ) {
+               wfProfileIn( __METHOD__ );
+               $ok = $this->doNotifyQueueNonEmpty( $wiki, $type );
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @see JobQueueAggregator::notifyQueueNonEmpty()
+        */
+       abstract protected function doNotifyQueueNonEmpty( $wiki, $type );
+
+       /**
+        * Get the list of all of the queues with jobs
+        *
+        * @return Array (job type => (list of wiki IDs))
+        */
+       final public function getAllReadyWikiQueues() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doGetAllReadyWikiQueues();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueueAggregator::getAllReadyWikiQueues()
+        */
+       abstract protected function doGetAllReadyWikiQueues();
+
+       /**
+        * Purge all of the aggregator information
+        *
+        * @return bool Success
+        */
+       final public function purge() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doPurge();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueueAggregator::purge()
+        */
+       abstract protected function doPurge();
+
+       /**
+        * Get all databases that have a pending job.
+        * This poll all the queues and is this expensive.
+        *
+        * @return Array (job type => (list of wiki IDs))
+        */
+       protected function findPendingWikiQueues() {
+               global $wgLocalDatabases;
+
+               $pendingDBs = array(); // (job type => (db list))
+               foreach ( $wgLocalDatabases as $db ) {
+                       foreach ( JobQueueGroup::singleton( $db )->getQueuesWithJobs() as $type ) {
+                               $pendingDBs[$type][] = $db;
+                       }
+               }
+
+               return $pendingDBs;
+       }
+}
diff --git a/includes/job/aggregator/JobQueueAggregatorMemc.php b/includes/job/aggregator/JobQueueAggregatorMemc.php
new file mode 100644 (file)
index 0000000..9434da0
--- /dev/null
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Job queue aggregator code that uses BagOStuff.
+ *
+ * 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
+ */
+
+/**
+ * Class to handle tracking information about all queues using BagOStuff
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueAggregatorMemc extends JobQueueAggregator {
+       /** @var BagOStuff */
+       protected $cache;
+
+       protected $cacheTTL; // integer; seconds
+
+       /**
+        * @params include:
+        *   - objectCache : Name of an object cache registered in $wgObjectCaches.
+        *                   This defaults to the one specified by $wgMainCacheType.
+        *   - cacheTTL    : Seconds to cache the aggregate data before regenerating.
+        * @param array $params
+        */
+       protected function __construct( array $params ) {
+               parent::__construct( $params );
+               $this->cache = isset( $params['objectCache'] )
+                       ? wfGetCache( $params['objectCache'] )
+                       : wfGetMainCache();
+               $this->cacheTTL = isset( $params['cacheTTL'] ) ? $params['cacheTTL'] : 180; // 3 min
+       }
+
+       /**
+        * @see JobQueueAggregator::doNotifyQueueEmpty()
+        */
+       protected function doNotifyQueueEmpty( $wiki, $type ) {
+               $key = $this->getReadyQueueCacheKey();
+               // Delist the queue from the "ready queue" list
+               if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+                       $curInfo = $this->cache->get( $key );
+                       if ( is_array( $curInfo ) && isset( $curInfo['pendingDBs'][$type] ) ) {
+                               if ( in_array( $wiki, $curInfo['pendingDBs'][$type] ) ) {
+                                       $curInfo['pendingDBs'][$type] = array_diff(
+                                               $curInfo['pendingDBs'][$type], array( $wiki ) );
+                                       $this->cache->set( $key, $curInfo );
+                               }
+                       }
+                       $this->cache->delete( "$key:lock" ); // unlock
+               }
+               return true;
+       }
+
+       /**
+        * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+        */
+       protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+               return true; // updated periodically
+       }
+
+       /**
+        * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+        */
+       protected function doGetAllReadyWikiQueues() {
+               $key = $this->getReadyQueueCacheKey();
+               // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
+               // regenerate the cache. Use any available stale cache if another process is
+               // currently regenerating the pending DB information.
+               $pendingDbInfo = $this->cache->get( $key );
+               if ( !is_array( $pendingDbInfo )
+                       || ( time() - $pendingDbInfo['timestamp'] ) > $this->cacheTTL
+                       || mt_rand( 0, 999 ) == 0
+               ) {
+                       if ( $this->cache->add( "$key:rebuild", 1, 1800 ) ) { // lock
+                               $pendingDbInfo = array(
+                                       'pendingDBs' => $this->findPendingWikiQueues(),
+                                       'timestamp' => time()
+                               );
+                               for ( $attempts = 1; $attempts <= 25; ++$attempts ) {
+                                       if ( $this->cache->add( "$key:lock", 1, 60 ) ) { // lock
+                                               $this->cache->set( $key, $pendingDbInfo );
+                                               $this->cache->delete( "$key:lock" ); // unlock
+                                               break;
+                                       }
+                               }
+                               $this->cache->delete( "$key:rebuild" ); // unlock
+                       }
+               }
+               return is_array( $pendingDbInfo )
+                       ? $pendingDbInfo['pendingDBs']
+                       : array(); // cache is both empty and locked
+       }
+
+       /**
+        * @see JobQueueAggregator::doPurge()
+        */
+       protected function doPurge() {
+               return $this->cache->delete( $this->getReadyQueueCacheKey() );
+       }
+
+       /**
+        * @return string
+        */
+       private function getReadyQueueCacheKey() {
+               return "jobqueue:aggregator:ready-queues:v1"; // global
+       }
+}
diff --git a/includes/job/aggregator/JobQueueAggregatorRedis.php b/includes/job/aggregator/JobQueueAggregatorRedis.php
new file mode 100644 (file)
index 0000000..c6a799d
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+/**
+ * Job queue aggregator code that uses PhpRedis.
+ *
+ * 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
+ */
+
+/**
+ * Class to handle tracking information about all queues using PhpRedis
+ *
+ * @ingroup JobQueue
+ * @ingroup Redis
+ * @since 1.21
+ */
+class JobQueueAggregatorRedis extends JobQueueAggregator {
+       /** @var RedisConnectionPool */
+       protected $redisPool;
+
+       /**
+        * @params include:
+        *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
+        *   - redisServer : A hostname/port combination or the absolute path of a UNIX socket.
+        *                   If a hostname is specified but no port, the standard port number
+        *                   6379 will be used. Required.
+        * @param array $params
+        */
+       protected function __construct( array $params ) {
+               parent::__construct( $params );
+               $this->server = $params['redisServer'];
+               $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
+       }
+
+       /**
+        * @see JobQueueAggregator::doNotifyQueueEmpty()
+        */
+       protected function doNotifyQueueEmpty( $wiki, $type ) {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       return false;
+               }
+               try {
+                       $conn->hDel( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ) );
+                       return true;
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+                       return false;
+               }
+       }
+
+       /**
+        * @see JobQueueAggregator::doNotifyQueueNonEmpty()
+        */
+       protected function doNotifyQueueNonEmpty( $wiki, $type ) {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       return false;
+               }
+               try {
+                       $conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
+                       return true;
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+                       return false;
+               }
+       }
+
+       /**
+        * @see JobQueueAggregator::doAllGetReadyWikiQueues()
+        */
+       protected function doGetAllReadyWikiQueues() {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       return array();
+               }
+               try {
+                       $conn->multi( Redis::PIPELINE );
+                       $conn->exists( $this->getReadyQueueKey() );
+                       $conn->hGetAll( $this->getReadyQueueKey() );
+                       list( $exists, $map ) = $conn->exec();
+
+                       if ( $exists ) { // cache hit
+                               $pendingDBs = array(); // (type => list of wikis)
+                               foreach ( $map as $key => $time ) {
+                                       list( $type, $wiki ) = $this->dencQueueName( $key );
+                                       $pendingDBs[$type][] = $wiki;
+                               }
+                       } else { // cache miss
+                               // Avoid duplicated effort
+                               $conn->multi( Redis::MULTI );
+                               $conn->setnx( $this->getReadyQueueKey() . ":lock", 1 );
+                               $conn->expire( $this->getReadyQueueKey() . ":lock", 3600 );
+                               if ( $conn->exec() !== array( true, true ) ) { // lock
+                                       return array(); // already in progress
+                               }
+
+                               $pendingDBs = $this->findPendingWikiQueues(); // (type => list of wikis)
+
+                               $conn->delete( $this->getReadyQueueKey() . ":lock" ); // unlock
+
+                               $now = time();
+                               $map = array();
+                               foreach ( $pendingDBs as $type => $wikis ) {
+                                       foreach ( $wikis as $wiki ) {
+                                               $map[$this->encQueueName( $type, $wiki )] = $now;
+                                       }
+                               }
+                               $conn->hMSet( $this->getReadyQueueKey(), $map );
+                       }
+
+                       return $pendingDBs;
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+                       return array();
+               }
+       }
+
+       /**
+        * @see JobQueueAggregator::doPurge()
+        */
+       protected function doPurge() {
+               $conn = $this->getConnection();
+               if ( !$conn ) {
+                       return false;
+               }
+               try {
+                       $conn->delete( $this->getReadyQueueKey() );
+               } catch ( RedisException $e ) {
+                       $this->handleException( $conn, $e );
+                       return false;
+               }
+               return true;
+       }
+
+       /**
+        * Get a connection to the server that handles all sub-queues for this queue
+        *
+        * @return Array (server name, Redis instance)
+        * @throws MWException
+        */
+       protected function getConnection() {
+               return $this->redisPool->getConnection( $this->server );
+       }
+
+       /**
+        * @param RedisConnRef $conn
+        * @param RedisException $e
+        * @return void
+        */
+       protected function handleException( RedisConnRef $conn, $e ) {
+               $this->redisPool->handleException( $this->server, $conn, $e );
+       }
+
+       /**
+        * @return string
+        */
+       private function getReadyQueueKey() {
+               return "jobqueue:aggregator:h-ready-queues:v1"; // global
+       }
+
+       /**
+        * @param string $type
+        * @param string $wiki
+        * @return string
+        */
+       private function encQueueName( $type, $wiki ) {
+               return rawurlencode( $type ) . '/' . rawurlencode( $wiki );
+       }
+
+       /**
+        * @param string $name
+        * @return string
+        */
+       private function dencQueueName( $name ) {
+               list( $type, $wiki ) = explode( '/', $name, 2 );
+               return array( rawurldecode( $type ), rawurldecode( $wiki ) );
+       }
+}
index c5dd9ea..4fe1753 100644 (file)
@@ -82,11 +82,11 @@ class AssembleUploadChunksJob extends Job {
                        UploadBase::setSessionStatus(
                                $this->params['filekey'],
                                array(
-                                       'result'    => 'Success',
-                                       'stage'     => 'assembling',
-                                       'filekey'   => $newFileKey,
+                                       'result' => 'Success',
+                                       'stage' => 'assembling',
+                                       'filekey' => $newFileKey,
                                        'imageinfo' => $imageInfo,
-                                       'status'    => Status::newGood()
+                                       'status' => Status::newGood()
                                )
                        );
                } catch ( MWException $e ) {
@@ -94,7 +94,7 @@ class AssembleUploadChunksJob extends Job {
                                $this->params['filekey'],
                                array(
                                        'result' => 'Failure',
-                                       'stage'  => 'assembling',
+                                       'stage' => 'assembling',
                                        'status' => Status::newFatal( 'api-error-stashfailed' )
                                )
                        );
index 05abeee..0be03b3 100644 (file)
@@ -90,33 +90,33 @@ class DoubleRedirectJob extends Job {
 
                $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
                if ( !$targetRev ) {
-                       wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
+                       wfDebug( __METHOD__ . ": target redirect already deleted, ignoring\n" );
                        return true;
                }
                $content = $targetRev->getContent();
                $currentDest = $content ? $content->getRedirectTarget() : null;
                if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
-                       wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
+                       wfDebug( __METHOD__ . ": Redirect has changed since the job was queued\n" );
                        return true;
                }
 
                # Check for a suppression tag (used e.g. in periodically archived discussions)
                $mw = MagicWord::get( 'staticredirect' );
                if ( $content->matchMagicWord( $mw ) ) {
-                       wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
+                       wfDebug( __METHOD__ . ": skipping: suppressed with __STATICREDIRECT__\n" );
                        return true;
                }
 
                # Find the current final destination
                $newTitle = self::getFinalDestination( $this->redirTitle );
                if ( !$newTitle ) {
-                       wfDebug( __METHOD__.": skipping: single redirect, circular redirect or invalid redirect destination\n" );
+                       wfDebug( __METHOD__ . ": skipping: single redirect, circular redirect or invalid redirect destination\n" );
                        return true;
                }
                if ( $newTitle->equals( $this->redirTitle ) ) {
                        # The redirect is already right, no need to change it
                        # This can happen if the page was moved back (say after vandalism)
-                       wfDebug( __METHOD__.": skipping, already good\n" );
+                       wfDebug( __METHOD__ . " : skipping, already good\n" );
                }
 
                # Preserve fragment (bug 14904)
index 524983b..be1bfe5 100644 (file)
@@ -45,7 +45,7 @@ final class DuplicateJob extends Job {
         * @return Job
         */
        public static function newFromJob( Job $job ) {
-               $djob = new self( $job->getTitle(), $job->getParams(), $job->getId() );
+               $djob = new self( $job->getTitle(), $job->getParams(), $job->id );
                $djob->command = $job->getType();
                $djob->params = is_array( $djob->params ) ? $djob->params : array();
                $djob->params = array( 'isDuplicate' => true ) + $djob->params;
index 2be05b6..bbe988d 100644 (file)
@@ -35,7 +35,7 @@ class EnotifNotifyJob extends Job {
        function run() {
                $enotif = new EmailNotification();
                // Get the user from ID (rename safe). Anons are 0, so defer to name.
-               if( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
+               if ( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
                        $editor = User::newFromId( $this->params['editorID'] );
                // B/C, only the name might be given.
                } else {
index 818c6ab..44c240b 100644 (file)
@@ -79,8 +79,16 @@ class HTMLCacheUpdateJob extends Job {
         * Update all of the backlinks
         */
        protected function doFullUpdate() {
+               global $wgMaxBacklinksInvalidate;
+
                # Get an estimate of the number of rows from the BacklinkCache
-               $numRows = $this->blCache->getNumLinks( $this->params['table'] );
+               $max = max( $this->rowsPerJob * 2, $wgMaxBacklinksInvalidate ) + 1;
+               $numRows = $this->blCache->getNumLinks( $this->params['table'], $max );
+               if ( $wgMaxBacklinksInvalidate !== false && $numRows > $wgMaxBacklinksInvalidate ) {
+                       wfDebug( "Skipped HTML cache invalidation of {$this->title->getPrefixedText()}." );
+                       return true;
+               }
+
                if ( $numRows > $this->rowsPerJob * 2 ) {
                        # Do fast cached partition
                        $this->insertPartitionJobs();
@@ -90,12 +98,13 @@ class HTMLCacheUpdateJob extends Job {
                        # Check if the row count estimate was correct
                        if ( $titleArray->count() > $this->rowsPerJob * 2 ) {
                                # Not correct, do accurate partition
-                               wfDebug( __METHOD__.": row count estimate was incorrect, repartitioning\n" );
+                               wfDebug( __METHOD__ . ": row count estimate was incorrect, repartitioning\n" );
                                $this->insertJobsFromTitles( $titleArray );
                        } else {
                                $this->invalidateTitles( $titleArray ); // just do the query
                        }
                }
+
                return true;
        }
 
@@ -145,7 +154,7 @@ class HTMLCacheUpdateJob extends Job {
                                        array(
                                                'table' => $this->params['table'],
                                                'start' => $start,
-                                               'end'   => $id - 1
+                                               'end' => $id - 1
                                        ) + $rootJobParams // carry over information for de-duplication
                                );
                                $start = $id;
@@ -158,16 +167,16 @@ class HTMLCacheUpdateJob extends Job {
                        array(
                                'table' => $this->params['table'],
                                'start' => $start,
-                               'end'   => $this->params['end']
+                               'end' => $this->params['end']
                        ) + $rootJobParams // carry over information for de-duplication
                );
-               wfDebug( __METHOD__.": repartitioning into " . count( $jobs ) . " jobs\n" );
+               wfDebug( __METHOD__ . ": repartitioning into " . count( $jobs ) . " jobs\n" );
 
                if ( count( $jobs ) < 2 ) {
                        # I don't think this is possible at present, but handling this case
                        # makes the code a bit more robust against future code updates and
                        # avoids a potential infinite loop of repartitioning
-                       wfDebug( __METHOD__.": repartitioning failed!\n" );
+                       wfDebug( __METHOD__ . ": repartitioning failed!\n" );
                        $this->invalidateTitles( $titleArray );
                } else {
                        JobQueueGroup::singleton()->push( $jobs );
@@ -194,7 +203,7 @@ class HTMLCacheUpdateJob extends Job {
                                array(
                                        'table' => $this->params['table'],
                                        'start' => $start,
-                                       'end'   => $end,
+                                       'end' => $end,
                                ) + $rootJobParams // carry over information for de-duplication
                        );
                }
@@ -245,7 +254,7 @@ class HTMLCacheUpdateJob extends Job {
                }
 
                # Update file cache
-               if  ( $wgUseFileCache ) {
+               if ( $wgUseFileCache ) {
                        foreach ( $titleArray as $title ) {
                                HTMLFileCache::clearFileCache( $title );
                        }
index d282a8e..b6164a5 100644 (file)
  * in the queue and/or sleep for a brief time period. These can be used
  * to represent "no-op" jobs or test lock contention and performance.
  *
+ * @par Example:
+ * Inserting a null job in the configured job queue:
+ * @code
+ * $ php maintenance/eval.php
+ * > $queue = JobQueueGroup::singleton();
+ * > $job = new NullJob( Title::newMainPage(), array( 'lives' => 10 ) );
+ * > $queue->push( $job );
+ * @endcode
+ * You can then confirm the job has been enqueued by using the showJobs.php
+ * maintenance utility:
+ * @code
+ * $ php maintenance/showJobs.php --group
+ * null: 1 queue; 0 claimed (0 active, 0 abandoned)
+ * $
+ * @endcode
+ *
  * @ingroup JobQueue
  */
 class NullJob extends Job {
index d3feda2..5114dc0 100644 (file)
@@ -48,7 +48,7 @@ class PublishStashedFileJob extends Job {
                        );
 
                        $upload = new UploadFromStash( $user );
-                       // @TODO: initialize() causes a GET, ideally we could frontload the antivirus
+                       // @todo initialize() causes a GET, ideally we could frontload the antivirus
                        // checks and anything else to the stash stage (which includes concatenation and
                        // the local file is thus already there). That way, instead of GET+PUT, there could
                        // just be a COPY operation from the stash to the public zone.
@@ -94,11 +94,11 @@ class PublishStashedFileJob extends Job {
                        UploadBase::setSessionStatus(
                                $this->params['filekey'],
                                array(
-                                       'result'    => 'Success',
-                                       'stage'     => 'publish',
-                                       'filename'  => $upload->getLocalFile()->getName(),
+                                       'result' => 'Success',
+                                       'stage' => 'publish',
+                                       'filename' => $upload->getLocalFile()->getName(),
                                        'imageinfo' => $imageInfo,
-                                       'status'    => Status::newGood()
+                                       'status' => Status::newGood()
                                )
                        );
                } catch ( MWException $e ) {
@@ -106,7 +106,7 @@ class PublishStashedFileJob extends Job {
                                $this->params['filekey'],
                                array(
                                        'result' => 'Failure',
-                                       'stage'  => 'publish',
+                                       'stage' => 'publish',
                                        'status' => Status::newFatal( 'api-error-publishfailed' )
                                )
                        );
index 9dbe827..563ce2f 100644 (file)
@@ -37,14 +37,11 @@ class RefreshLinksJob extends Job {
         * @return boolean success
         */
        function run() {
-               wfProfileIn( __METHOD__ );
-
                $linkCache = LinkCache::singleton();
                $linkCache->clear();
 
                if ( is_null( $this->title ) ) {
                        $this->error = "refreshLinks: Invalid title";
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -59,13 +56,11 @@ class RefreshLinksJob extends Job {
                if ( !$revision ) {
                        $this->error = 'refreshLinks: Article not found "' .
                                $this->title->getPrefixedDBkey() . '"';
-                       wfProfileOut( __METHOD__ );
                        return false; // XXX: what if it was just deleted?
                }
 
                self::runForTitleInternal( $this->title, $revision, __METHOD__ );
 
-               wfProfileOut( __METHOD__ );
                return true;
        }
 
@@ -101,6 +96,9 @@ class RefreshLinksJob extends Job {
 
                $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
                DataUpdate::runUpdates( $updates );
+
+               InfoAction::invalidateCache( $title );
+
                wfProfileOut( $fname );
        }
 }
@@ -114,6 +112,8 @@ class RefreshLinksJob extends Job {
 class RefreshLinksJob2 extends Job {
        function __construct( $title, $params, $id = 0 ) {
                parent::__construct( 'refreshLinks2', $title, $params, $id );
+               // Base jobs for large templates can easily be de-duplicated
+               $this->removeDuplicates = !isset( $params['start'] ) && !isset( $params['end'] );
        }
 
        /**
@@ -123,14 +123,11 @@ class RefreshLinksJob2 extends Job {
        function run() {
                global $wgUpdateRowsPerJob;
 
-               wfProfileIn( __METHOD__ );
-
                $linkCache = LinkCache::singleton();
                $linkCache->clear();
 
                if ( is_null( $this->title ) ) {
                        $this->error = "refreshLinks2: Invalid title";
-                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -144,7 +141,7 @@ class RefreshLinksJob2 extends Job {
                // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
                if ( isset( $this->params['masterPos'] ) ) {
                        $masterPos = $this->params['masterPos'];
-               } elseif ( wfGetLB()->getServerCount() > 1  ) {
+               } elseif ( wfGetLB()->getServerCount() > 1 ) {
                        $masterPos = wfGetLB()->getMasterPos();
                } else {
                        $masterPos = false;
@@ -158,7 +155,7 @@ class RefreshLinksJob2 extends Job {
                        $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
                } else {
                        # This is a base job to trigger the insertion of partitioned jobs...
-                       if ( $tbc->getNumLinks( $table ) <= $wgUpdateRowsPerJob ) {
+                       if ( $tbc->getNumLinks( $table, $wgUpdateRowsPerJob + 1 ) <= $wgUpdateRowsPerJob ) {
                                # Just directly insert the single per-title jobs
                                $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
                        } else {
@@ -167,10 +164,10 @@ class RefreshLinksJob2 extends Job {
                                        list( $start, $end ) = $batch;
                                        $jobs[] = new RefreshLinksJob2( $this->title,
                                                array(
-                                                       'table'            => $table,
-                                                       'start'            => $start,
-                                                       'end'              => $end,
-                                                       'masterPos'        => $masterPos,
+                                                       'table' => $table,
+                                                       'start' => $start,
+                                                       'end' => $end,
+                                                       'masterPos' => $masterPos,
                                                ) + $this->getRootJobParams() // carry over information for de-duplication
                                        );
                                }
@@ -181,7 +178,6 @@ class RefreshLinksJob2 extends Job {
                        JobQueueGroup::singleton()->push( $jobs );
                }
 
-               wfProfileOut( __METHOD__ );
                return true;
        }
 
index eececcb..f17a1a1 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Simple wrapper for json_encode and json_decode that falls back on Services_JSON class.
+ * Wrapper for json_encode and json_decode.
  *
  * 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
  */
 
-require_once __DIR__ . '/Services_JSON.php';
-
 /**
  * JSON formatter wrapper class
  */
 class FormatJson {
 
+       /**
+        * Skip escaping most characters above U+007F for readability and compactness.
+        * This encoding option saves 3 to 8 bytes (uncompressed) for each such character;
+        * however, it could break compatibility with systems that incorrectly handle UTF-8.
+        *
+        * @since 1.21
+        */
+       const UTF8_OK = 1;
+
+       /**
+        * Skip escaping the characters '<', '>', and '&', which have special meanings in
+        * HTML and XML.
+        *
+        * @warning Do not use this option for JSON that could end up in inline scripts.
+        * - HTML5, §4.3.1.2 Restrictions for contents of script elements
+        * - XML 1.0 (5th Ed.), §2.4 Character Data and Markup
+        *
+        * @since 1.21
+        */
+       const XMLMETA_OK = 2;
+
+       /**
+        * Skip escaping as many characters as reasonably possible.
+        *
+        * @warning When generating inline script blocks, use FormatJson::UTF8_OK instead.
+        *
+        * @since 1.21
+        */
+       const ALL_OK = 3;
+
+       /**
+        * Characters problematic in JavaScript.
+        *
+        * @note These are listed in ECMA-262 (5.1 Ed.), §7.3 Line Terminators along with U+000A (LF)
+        *       and U+000D (CR). However, PHP already escapes LF and CR according to RFC 4627.
+        */
+       private static $badChars = array(
+               "\xe2\x80\xa8", // U+2028 LINE SEPARATOR
+               "\xe2\x80\xa9", // U+2029 PARAGRAPH SEPARATOR
+       );
+
+       /**
+        * Escape sequences for characters listed in FormatJson::$badChars.
+        */
+       private static $badCharsEscaped = array(
+               '\u2028', // U+2028 LINE SEPARATOR
+               '\u2029', // U+2029 PARAGRAPH SEPARATOR
+       );
+
        /**
         * Returns the JSON representation of a value.
         *
-        * @param $value Mixed: the value being encoded. Can be any type except a resource.
-        * @param $pretty Boolean: If true, adds non-significant whitespace to improve readability.
+        * @note Empty arrays are encoded as numeric arrays, not as objects, so cast any associative
+        *       array that might be empty to an object before encoding it.
         *
-        * @return string
+        * @note In pre-1.21 versions of MediaWiki, using this function for generating inline script
+        *       blocks may result in an XSS vulnerability, and quite likely will in XML documents
+        *       (cf. FormatJson::XMLMETA_OK). Use Xml::encodeJsVar() instead in such cases.
+        *
+        * @param mixed $value The value to encode. Can be any type except a resource.
+        * @param bool $pretty If true, add non-significant whitespace to improve readability.
+        * @param int $escaping Bitfield consisting of _OK class constants
+        * @return string|bool: String if successful; false upon failure
         */
-       public static function encode( $value, $pretty = false ) {
-               if ( !function_exists( 'json_encode' ) || ( $pretty && version_compare( PHP_VERSION, '5.4.0', '<' ) ) ) {
-                       $json = new Services_JSON();
-                       return $json->encode( $value, $pretty );
-               } else {
-                       return json_encode( $value, $pretty ? JSON_PRETTY_PRINT : 0 );
+       public static function encode( $value, $pretty = false, $escaping = 0 ) {
+               if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
+                       return self::encode53( $value, $pretty, $escaping );
                }
+               return self::encode54( $value, $pretty, $escaping );
        }
 
        /**
         * Decodes a JSON string.
         *
-        * @param string $value the json string being decoded.
-        * @param $assoc Boolean: when true, returned objects will be converted into associative arrays.
+        * @param string $value The JSON string being decoded
+        * @param bool $assoc When true, returned objects will be converted into associative arrays.
         *
-        * @return Mixed: the value encoded in json in appropriate PHP type.
-        * Values true, false and null (case-insensitive) are returned as true, false
-        * and "&null;" respectively. "&null;" is returned if the json cannot be
+        * @return mixed: the value encoded in JSON in appropriate PHP type.
+        * Values `"true"`, `"false"`, and `"null"` (case-insensitive) are returned as `true`, `false`
+        * and `null` respectively. `null` is returned if the JSON cannot be
         * decoded or if the encoded data is deeper than the recursion limit.
         */
        public static function decode( $value, $assoc = false ) {
-               if ( !function_exists( 'json_decode' ) ) {
-                       $json = $assoc ? new Services_JSON( SERVICES_JSON_LOOSE_TYPE ) :
-                               new Services_JSON();
-                       $jsonDec = $json->decode( $value );
-                       return $jsonDec;
-               } else {
-                       return json_decode( $value, $assoc );
+               return json_decode( $value, $assoc );
+       }
+
+       /**
+        * JSON encoder wrapper for PHP >= 5.4, which supports useful encoding options.
+        *
+        * @param mixed $value
+        * @param bool $pretty
+        * @param int $escaping
+        * @return string|bool
+        */
+       private static function encode54( $value, $pretty, $escaping ) {
+               // PHP escapes '/' to prevent breaking out of inline script blocks using '</script>',
+               // which is hardly useful when '<' and '>' are escaped, and such escaping negatively
+               // impacts the human readability of URLs and similar strings.
+               $options = JSON_UNESCAPED_SLASHES;
+               $options |= $pretty ? JSON_PRETTY_PRINT : 0;
+               $options |= ( $escaping & self::UTF8_OK ) ? JSON_UNESCAPED_UNICODE : 0;
+               $options |= ( $escaping & self::XMLMETA_OK ) ? 0 : ( JSON_HEX_TAG | JSON_HEX_AMP );
+               $json = json_encode( $value, $options );
+               if ( $json === false ) {
+                       return false;
+               }
+               if ( $escaping & self::UTF8_OK ) {
+                       $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
                }
+               return $json;
        }
 
+       /**
+        * JSON encoder wrapper for PHP 5.3, which lacks native support for some encoding options.
+        * Therefore, the missing options are implemented here purely in PHP code.
+        *
+        * @param mixed $value
+        * @param bool $pretty
+        * @param int $escaping
+        * @return string|bool
+        */
+       private static function encode53( $value, $pretty, $escaping ) {
+               $options = ( $escaping & self::XMLMETA_OK ) ? 0 : ( JSON_HEX_TAG | JSON_HEX_AMP );
+               $json = json_encode( $value, $options );
+               if ( $json === false ) {
+                       return false;
+               }
+               $json = str_replace( '\\/', '/', $json ); // emulate JSON_UNESCAPED_SLASHES
+               if ( $escaping & self::UTF8_OK ) {
+                       // JSON hex escape sequences follow the format \uDDDD, where DDDD is four hex digits
+                       // indicating the equivalent UTF-16 code unit's value. To most efficiently unescape
+                       // them, we exploit the JSON extension's built-in decoder.
+                       // * We escape the input a second time, so any such sequence becomes \\uDDDD.
+                       // * To avoid interpreting escape sequences that were in the original input,
+                       //   each double-escaped backslash (\\\\) is replaced with \\\u005c.
+                       // * We strip one of the backslashes from each of the escape sequences to unescape.
+                       // * Then the JSON decoder can perform the actual unescaping.
+                       $json = str_replace( "\\\\\\\\", "\\\\\\u005c", addcslashes( $json, '\"' ) );
+                       $json = json_decode( preg_replace( "/\\\\\\\\u(?!00[0-7])/", "\\\\u", "\"$json\"" ) );
+                       $json = str_replace( self::$badChars, self::$badCharsEscaped, $json );
+               }
+               return $pretty ? self::prettyPrint( $json ) : $json;
+       }
+
+       /**
+        * Adds non-significant whitespace to an existing JSON representation of an object.
+        * Only needed for PHP < 5.4, which lacks the JSON_PRETTY_PRINT option.
+        *
+        * @param string $json
+        * @return string
+        */
+       private static function prettyPrint( $json ) {
+               $buf = '';
+               $indent = 0;
+               $json = strtr( $json, array( '\\\\' => '\\\\', '\"' => "\x01" ) );
+               for ( $i = 0, $n = strlen( $json ); $i < $n; $i += $skip ) {
+                       $skip = 1;
+                       switch ( $json[$i] ) {
+                               case ':':
+                                       $buf .= ': ';
+                                       break;
+                               case '[':
+                               case '{':
+                                       $indent++; // falls through
+                               case ',':
+                                       $buf .= $json[$i] . "\n" . str_repeat( '    ', $indent );
+                                       break;
+                               case ']':
+                               case '}':
+                                       $indent--;
+                                       $buf .= "\n" . str_repeat( '    ', $indent ) . $json[$i];
+                                       break;
+                               case '"':
+                                       $skip = strcspn( $json, '"', $i + 1 ) + 2;
+                                       $buf .= substr( $json, $i, $skip );
+                                       break;
+                               default:
+                                       $skip = strcspn( $json, ',]}"', $i + 1 ) + 1;
+                                       $buf .= substr( $json, $i, $skip );
+                       }
+               }
+               return str_replace( "\x01", '\"', preg_replace( '/ +$/m', '', $buf ) );
+       }
 }
diff --git a/includes/json/Services_JSON.php b/includes/json/Services_JSON.php
deleted file mode 100644 (file)
index b7c101a..0000000
+++ /dev/null
@@ -1,882 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
-* Converts to and from JSON format.
-*
-* JSON (JavaScript Object Notation) is a lightweight data-interchange
-* format. It is easy for humans to read and write. It is easy for machines
-* to parse and generate. It is based on a subset of the JavaScript
-* Programming Language, Standard ECMA-262 3rd Edition - December 1999.
-* This feature can also be found in  Python. JSON is a text format that is
-* completely language independent but uses conventions that are familiar
-* to programmers of the C-family of languages, including C, C++, C#, Java,
-* JavaScript, Perl, TCL, and many others. These properties make JSON an
-* ideal data-interchange language.
-*
-* This package provides a simple encoder and decoder for JSON notation. It
-* is intended for use with client-side Javascript applications that make
-* use of HTTPRequest to perform server communication functions - data can
-* be encoded into JSON notation for use in a client-side javascript, or
-* decoded from incoming Javascript requests. JSON format is native to
-* Javascript, and can be directly eval()'ed with no further parsing
-* overhead
-*
-* All strings should be in ASCII or UTF-8 format!
-*
-* LICENSE: 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.
-*
-* THIS SOFTWARE IS PROVIDED ``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 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.
-*
-* @file
-* @ingroup API
-* @author Michal Migurski <mike-json@teczno.com>
-* @author Matt Knapp <mdknapp[at]gmail[dot]com>
-* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
-* @copyright 2005 Michal Migurski
-* @version CVS: $Id$
-* @license http://www.opensource.org/licenses/bsd-license.php
-* @see http://pear.php.net/pepr/pepr-proposal-show.php?id=198
-*/
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_SLICE',   1);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_STR',  2);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_ARR',  3);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_OBJ',  4);
-
-/**
-* Marker constant for Services_JSON::decode(), used to flag stack state
-*/
-define('SERVICES_JSON_IN_CMT', 5);
-
-/**
-* Behavior switch for Services_JSON::decode()
-*/
-define('SERVICES_JSON_LOOSE_TYPE', 16);
-
-/**
-* Behavior switch for Services_JSON::decode()
-*/
-define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
-
-/**
- * Converts to and from JSON format.
- *
- * Brief example of use:
- *
- * <code>
- * // create a new instance of Services_JSON
- * $json = new Services_JSON();
- *
- * // convert a complex value to JSON notation, and send it to the browser
- * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
- * $output = $json->encode($value);
- *
- * print($output);
- * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
- *
- * // accept incoming POST data, assumed to be in JSON notation
- * $input = file_get_contents('php://input', 1000000);
- * $value = $json->decode($input);
- * </code>
- *
- * @ingroup API
- */
-class Services_JSON
-{
-       /**
-        * constructs a new JSON instance
-        *
-        * @param $use Integer: object behavior flags; combine with boolean-OR
-        *
-        *      possible values:
-        *      - SERVICES_JSON_LOOSE_TYPE:  loose typing.
-        *                      "{...}" syntax creates associative arrays
-        *                      instead of objects in decode().
-        *      - SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.
-        *                      Values which can't be encoded (e.g. resources)
-        *                      appear as NULL instead of throwing errors.
-        *                      By default, a deeply-nested resource will
-        *                      bubble up with an error, so all return values
-        *                      from encode() should be checked with isError()
-        */
-       function __construct($use = 0)
-       {
-               $this->use = $use;
-       }
-
-       private static $mHavePear = null;
-       /**
-        * Returns cached result of class_exists('pear'), to avoid calling AutoLoader numerous times
-        * in cases when PEAR is not present.
-        * @return boolean
-        */
-       private static function pearInstalled() {
-               if ( self::$mHavePear === null ) {
-                       self::$mHavePear = class_exists( 'pear' );
-               }
-               return self::$mHavePear;
-       }
-
-       /**
-        * convert a string from one UTF-16 char to one UTF-8 char
-        *
-        * Normally should be handled by mb_convert_encoding, but
-        * provides a slower PHP-only method for installations
-        * that lack the multibyte string extension.
-        *
-        * @param string $utf16 UTF-16 character
-        * @return String: UTF-8 character
-        * @access private
-        */
-       function utf162utf8($utf16)
-       {
-               // oh please oh please oh please oh please oh please
-               if(function_exists('mb_convert_encoding')) {
-                       return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
-               }
-
-               $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]);
-
-               switch(true) {
-                       case ((0x7F & $bytes) == $bytes):
-                               // this case should never be reached, because we are in ASCII range
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr(0x7F & $bytes);
-
-                       case (0x07FF & $bytes) == $bytes:
-                               // return a 2-byte UTF-8 character
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr(0xC0 | (($bytes >> 6) & 0x1F))
-                                        . chr(0x80 | ($bytes & 0x3F));
-
-                       case (0xFC00 & $bytes) == 0xD800 && strlen($utf16) >= 4 && (0xFC & ord($utf16[2])) == 0xDC:
-                               // return a 4-byte UTF-8 character
-                               $char = ((($bytes & 0x03FF) << 10)
-                                          | ((ord($utf16[2]) & 0x03) << 8)
-                                          | ord($utf16[3]));
-                               $char += 0x10000;
-                               return chr(0xF0 | (($char >> 18) & 0x07))
-                                        . chr(0x80 | (($char >> 12) & 0x3F))
-                                        . chr(0x80 | (($char >> 6) & 0x3F))
-                                        . chr(0x80 | ($char & 0x3F));
-
-                       case (0xFFFF & $bytes) == $bytes:
-                               // return a 3-byte UTF-8 character
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr(0xE0 | (($bytes >> 12) & 0x0F))
-                                        . chr(0x80 | (($bytes >> 6) & 0x3F))
-                                        . chr(0x80 | ($bytes & 0x3F));
-               }
-
-               // ignoring UTF-32 for now, sorry
-               return '';
-       }
-
-       /**
-        * convert a string from one UTF-8 char to one UTF-16 char
-        *
-        * Normally should be handled by mb_convert_encoding, but
-        * provides a slower PHP-only method for installations
-        * that lack the multibyte string extension.
-        *
-        * @param string $utf8 UTF-8 character
-        * @return String: UTF-16 character
-        * @access private
-        */
-       function utf82utf16($utf8)
-       {
-               // oh please oh please oh please oh please oh please
-               if(function_exists('mb_convert_encoding')) {
-                       return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
-               }
-
-               switch(strlen($utf8)) {
-                       case 1:
-                               // this case should never be reached, because we are in ASCII range
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return $utf8;
-
-                       case 2:
-                               // return a UTF-16 character from a 2-byte UTF-8 char
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr(0x07 & (ord($utf8[0]) >> 2))
-                                        . chr((0xC0 & (ord($utf8[0]) << 6))
-                                                | (0x3F & ord($utf8[1])));
-
-                       case 3:
-                               // return a UTF-16 character from a 3-byte UTF-8 char
-                               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                               return chr((0xF0 & (ord($utf8[0]) << 4))
-                                                | (0x0F & (ord($utf8[1]) >> 2)))
-                                        . chr((0xC0 & (ord($utf8[1]) << 6))
-                                                | (0x7F & ord($utf8[2])));
-
-                       case 4:
-                               // return a UTF-16 surrogate pair from a 4-byte UTF-8 char
-                               if(ord($utf8[0]) > 0xF4) return ''; # invalid
-                               $char = ((0x1C0000 & (ord($utf8[0]) << 18))
-                                          | (0x03F000 & (ord($utf8[1]) << 12))
-                                          | (0x000FC0 & (ord($utf8[2]) << 6))
-                                          | (0x00003F & ord($utf8[3])));
-                               if($char > 0x10FFFF) return ''; # invalid
-                               $char -= 0x10000;
-                               return chr(0xD8 | (($char >> 18) & 0x03))
-                                        . chr(($char >> 10) & 0xFF)
-                                        . chr(0xDC | (($char >> 8) & 0x03))
-                                        . chr($char & 0xFF);
-               }
-
-               // ignoring UTF-32 for now, sorry
-               return '';
-       }
-
-       /**
-        * encodes an arbitrary variable into JSON format
-        *
-        * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
-        *                      see argument 1 to Services_JSON() above for array-parsing behavior.
-        *                      if var is a string, note that encode() always expects it
-        *                      to be in ASCII or UTF-8 format!
-        * @param $pretty Boolean: pretty-print output with indents and newlines
-        *
-        * @return mixed JSON string representation of input var or an error if a problem occurs
-        * @access public
-        */
-       function encode($var, $pretty=false)
-       {
-               $this->indent = 0;
-               $this->pretty = $pretty;
-               $this->nameValSeparator = $pretty ? ': ' : ':';
-               return $this->encode2($var);
-       }
-
-       /**
-        * encodes an arbitrary variable into JSON format
-        *
-        * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
-        *                      see argument 1 to Services_JSON() above for array-parsing behavior.
-        *                      if var is a string, note that encode() always expects it
-        *                      to be in ASCII or UTF-8 format!
-        *
-        * @return mixed JSON string representation of input var or an error if a problem occurs
-        * @access private
-        */
-       function encode2($var)
-       {
-               if ($this->pretty) {
-                       $close = "\n" . str_repeat("\t", $this->indent);
-                       $open = $close . "\t";
-                       $mid = ',' . $open;
-               }
-               else {
-                       $open = $close = '';
-                       $mid = ',';
-               }
-
-               switch (gettype($var)) {
-                       case 'boolean':
-                               return $var ? 'true' : 'false';
-
-                       case 'NULL':
-                               return 'null';
-
-                       case 'integer':
-                               return (int) $var;
-
-                       case 'double':
-                       case 'float':
-                               return (float) $var;
-
-                       case 'string':
-                               // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
-                               $ascii = '';
-                               $strlen_var = strlen($var);
-
-                          /*
-                               * Iterate over every character in the string,
-                               * escaping with a slash or encoding to UTF-8 where necessary
-                               */
-                               for ($c = 0; $c < $strlen_var; ++$c) {
-
-                                       $ord_var_c = ord($var[$c]);
-
-                                       switch (true) {
-                                               case $ord_var_c == 0x08:
-                                                       $ascii .= '\b';
-                                                       break;
-                                               case $ord_var_c == 0x09:
-                                                       $ascii .= '\t';
-                                                       break;
-                                               case $ord_var_c == 0x0A:
-                                                       $ascii .= '\n';
-                                                       break;
-                                               case $ord_var_c == 0x0C:
-                                                       $ascii .= '\f';
-                                                       break;
-                                               case $ord_var_c == 0x0D:
-                                                       $ascii .= '\r';
-                                                       break;
-
-                                               case $ord_var_c == 0x22:
-                                               case $ord_var_c == 0x2F:
-                                               case $ord_var_c == 0x5C:
-                                                       // double quote, slash, slosh
-                                                       $ascii .= '\\'.$var[$c];
-                                                       break;
-
-                                               case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
-                                                       // characters U-00000000 - U-0000007F (same as ASCII)
-                                                       $ascii .= $var[$c];
-                                                       break;
-
-                                               case (($ord_var_c & 0xE0) == 0xC0):
-                                                       // characters U-00000080 - U-000007FF, mask 110XXXXX
-                                                       // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                       $char = pack('C*', $ord_var_c, ord($var[$c + 1]));
-                                                       $c += 1;
-                                                       $utf16 = $this->utf82utf16($char);
-                                                       $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                                                       break;
-
-                                               case (($ord_var_c & 0xF0) == 0xE0):
-                                                       // characters U-00000800 - U-0000FFFF, mask 1110XXXX
-                                                       // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                       $char = pack('C*', $ord_var_c,
-                                                                       ord($var[$c + 1]),
-                                                                       ord($var[$c + 2]));
-                                                       $c += 2;
-                                                       $utf16 = $this->utf82utf16($char);
-                                                       $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                                                       break;
-
-                                               case (($ord_var_c & 0xF8) == 0xF0):
-                                                       // characters U-00010000 - U-001FFFFF, mask 11110XXX
-                                                       // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                       // These will always return a surrogate pair
-                                                       $char = pack('C*', $ord_var_c,
-                                                                       ord($var[$c + 1]),
-                                                                       ord($var[$c + 2]),
-                                                                       ord($var[$c + 3]));
-                                                       $c += 3;
-                                                       $utf16 = $this->utf82utf16($char);
-                                                       if($utf16 == '') {
-                                                               $ascii .= '\ufffd';
-                                                       } else {
-                                                               $utf16 = str_split($utf16, 2);
-                                                               $ascii .= sprintf('\u%04s\u%04s', bin2hex($utf16[0]), bin2hex($utf16[1]));
-                                                       }
-                                                       break;
-                                       }
-                               }
-
-                               return '"'.$ascii.'"';
-
-                       case 'array':
-                          /*
-                               * As per JSON spec if any array key is not an integer
-                               * we must treat the the whole array as an object. We
-                               * also try to catch a sparsely populated associative
-                               * array with numeric keys here because some JS engines
-                               * will create an array with empty indexes up to
-                               * max_index which can cause memory issues and because
-                               * the keys, which may be relevant, will be remapped
-                               * otherwise.
-                               *
-                               * As per the ECMA and JSON specification an object may
-                               * have any string as a property. Unfortunately due to
-                               * a hole in the ECMA specification if the key is a
-                               * ECMA reserved word or starts with a digit the
-                               * parameter is only accessible using ECMAScript's
-                               * bracket notation.
-                               */
-
-                               // treat as a JSON object
-                               if (is_array($var) && count($var) && (array_keys($var) !== range(0, count($var) - 1))) {
-                                       $this->indent++;
-                                       $properties = array_map(array($this, 'name_value'),
-                                                               array_keys($var),
-                                                               array_values($var));
-                                       $this->indent--;
-
-                                       foreach($properties as $property) {
-                                               if($this->isError($property)) {
-                                                       return $property;
-                                               }
-                                       }
-
-                                       return '{' . $open . join($mid, $properties) . $close . '}';
-                               }
-
-                               // treat it like a regular array
-                               $this->indent++;
-                               $elements = array_map(array($this, 'encode2'), $var);
-                               $this->indent--;
-
-                               foreach($elements as $element) {
-                                       if($this->isError($element)) {
-                                               return $element;
-                                       }
-                               }
-
-                               return '[' . $open . join($mid, $elements) . $close . ']';
-
-                       case 'object':
-                               $vars = get_object_vars($var);
-
-                               $this->indent++;
-                               $properties = array_map(array($this, 'name_value'),
-                                                       array_keys($vars),
-                                                       array_values($vars));
-                               $this->indent--;
-
-                               foreach($properties as $property) {
-                                       if($this->isError($property)) {
-                                               return $property;
-                                       }
-                               }
-
-                               return '{' . $open . join($mid, $properties) . $close . '}';
-
-                       default:
-                               return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
-                                       ? 'null'
-                                       : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
-               }
-       }
-
-       /**
-        * array-walking function for use in generating JSON-formatted name-value pairs
-        *
-        * @param string $name name of key to use
-        * @param $value Mixed: reference to an array element to be encoded
-        *
-        * @return String: JSON-formatted name-value pair, like '"name":value'
-        * @access private
-        */
-       function name_value($name, $value)
-       {
-               $encoded_value = $this->encode2($value);
-
-               if($this->isError($encoded_value)) {
-                       return $encoded_value;
-               }
-
-               return $this->encode2(strval($name)) . $this->nameValSeparator . $encoded_value;
-       }
-
-       /**
-        * reduce a string by removing leading and trailing comments and whitespace
-        *
-        * @param string $str string value to strip of comments and whitespace
-        *
-        * @return String: string value stripped of comments and whitespace
-        * @access private
-        */
-       function reduce_string($str)
-       {
-               $str = preg_replace(array(
-
-                               // eliminate single line comments in '// ...' form
-                               '#^\s*//(.+)$#m',
-
-                               // eliminate multi-line comments in '/* ... */' form, at start of string
-                               '#^\s*/\*(.+)\*/#Us',
-
-                               // eliminate multi-line comments in '/* ... */' form, at end of string
-                               '#/\*(.+)\*/\s*$#Us'
-
-                       ), '', $str);
-
-               // eliminate extraneous space
-               return trim($str);
-       }
-
-       /**
-        * decodes a JSON string into appropriate variable
-        *
-        * @param string $str JSON-formatted string
-        *
-        * @return mixed number, boolean, string, array, or object
-        *                 corresponding to given JSON input string.
-        *                 See argument 1 to Services_JSON() above for object-output behavior.
-        *                 Note that decode() always returns strings
-        *                 in ASCII or UTF-8 format!
-        * @access public
-        */
-       function decode($str)
-       {
-               $str = $this->reduce_string($str);
-
-               switch (strtolower($str)) {
-                       case 'true':
-                               return true;
-
-                       case 'false':
-                               return false;
-
-                       case 'null':
-                               return null;
-
-                       default:
-                               $m = array();
-
-                               if (is_numeric($str)) {
-                                       // Lookie-loo, it's a number
-
-                                       // This would work on its own, but I'm trying to be
-                                       // good about returning integers where appropriate:
-                                       // return (float)$str;
-
-                                       // Return float or int, as appropriate
-                                       return ((float)$str == (integer)$str)
-                                               ? (integer)$str
-                                               : (float)$str;
-
-                               } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
-                                       // STRINGS RETURNED IN UTF-8 FORMAT
-                                       $delim = substr($str, 0, 1);
-                                       $chrs = substr($str, 1, -1);
-                                       $utf8 = '';
-                                       $strlen_chrs = strlen($chrs);
-
-                                       for ($c = 0; $c < $strlen_chrs; ++$c) {
-
-                                               $substr_chrs_c_2 = substr($chrs, $c, 2);
-                                               $ord_chrs_c = ord($chrs[$c]);
-
-                                               switch (true) {
-                                                       case $substr_chrs_c_2 == '\b':
-                                                               $utf8 .= chr(0x08);
-                                                               ++$c;
-                                                               break;
-                                                       case $substr_chrs_c_2 == '\t':
-                                                               $utf8 .= chr(0x09);
-                                                               ++$c;
-                                                               break;
-                                                       case $substr_chrs_c_2 == '\n':
-                                                               $utf8 .= chr(0x0A);
-                                                               ++$c;
-                                                               break;
-                                                       case $substr_chrs_c_2 == '\f':
-                                                               $utf8 .= chr(0x0C);
-                                                               ++$c;
-                                                               break;
-                                                       case $substr_chrs_c_2 == '\r':
-                                                               $utf8 .= chr(0x0D);
-                                                               ++$c;
-                                                               break;
-
-                                                       case $substr_chrs_c_2 == '\\"':
-                                                       case $substr_chrs_c_2 == '\\\'':
-                                                       case $substr_chrs_c_2 == '\\\\':
-                                                       case $substr_chrs_c_2 == '\\/':
-                                                               if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
-                                                                  ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
-                                                                       $utf8 .= $chrs[++$c];
-                                                               }
-                                                               break;
-
-                                                       case preg_match('/\\\uD[89AB][0-9A-F]{2}\\\uD[C-F][0-9A-F]{2}/i', substr($chrs, $c, 12)):
-                                                               // escaped unicode surrogate pair
-                                                               $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
-                                                                          . chr(hexdec(substr($chrs, ($c + 4), 2)))
-                                                                          . chr(hexdec(substr($chrs, ($c + 8), 2)))
-                                                                          . chr(hexdec(substr($chrs, ($c + 10), 2)));
-                                                               $utf8 .= $this->utf162utf8($utf16);
-                                                               $c += 11;
-                                                               break;
-
-                                                       case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
-                                                               // single, escaped unicode character
-                                                               $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
-                                                                          . chr(hexdec(substr($chrs, ($c + 4), 2)));
-                                                               $utf8 .= $this->utf162utf8($utf16);
-                                                               $c += 5;
-                                                               break;
-
-                                                       case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
-                                                               $utf8 .= $chrs[$c];
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xE0) == 0xC0:
-                                                               // characters U-00000080 - U-000007FF, mask 110XXXXX
-                                                               //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 2);
-                                                               ++$c;
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xF0) == 0xE0:
-                                                               // characters U-00000800 - U-0000FFFF, mask 1110XXXX
-                                                               // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 3);
-                                                               $c += 2;
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xF8) == 0xF0:
-                                                               // characters U-00010000 - U-001FFFFF, mask 11110XXX
-                                                               // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 4);
-                                                               $c += 3;
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xFC) == 0xF8:
-                                                               // characters U-00200000 - U-03FFFFFF, mask 111110XX
-                                                               // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 5);
-                                                               $c += 4;
-                                                               break;
-
-                                                       case ($ord_chrs_c & 0xFE) == 0xFC:
-                                                               // characters U-04000000 - U-7FFFFFFF, mask 1111110X
-                                                               // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                                               $utf8 .= substr($chrs, $c, 6);
-                                                               $c += 5;
-                                                               break;
-
-                                               }
-
-                                       }
-
-                                       return $utf8;
-
-                               } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
-                                       // array, or object notation
-
-                                       if ($str[0] == '[') {
-                                               $stk = array(SERVICES_JSON_IN_ARR);
-                                               $arr = array();
-                                       } else {
-                                               if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-                                                       $stk = array(SERVICES_JSON_IN_OBJ);
-                                                       $obj = array();
-                                               } else {
-                                                       $stk = array(SERVICES_JSON_IN_OBJ);
-                                                       $obj = new stdClass();
-                                               }
-                                       }
-
-                                       array_push($stk, array( 'what'  => SERVICES_JSON_SLICE,
-                                                               'where' => 0,
-                                                               'delim' => false));
-
-                                       $chrs = substr($str, 1, -1);
-                                       $chrs = $this->reduce_string($chrs);
-
-                                       if ($chrs == '') {
-                                               if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                                                       return $arr;
-
-                                               } else {
-                                                       return $obj;
-
-                                               }
-                                       }
-
-                                       //print("\nparsing {$chrs}\n");
-
-                                       $strlen_chrs = strlen($chrs);
-
-                                       for ($c = 0; $c <= $strlen_chrs; ++$c) {
-
-                                               $top = end($stk);
-                                               $substr_chrs_c_2 = substr($chrs, $c, 2);
-
-                                               if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
-                                                       // found a comma that is not inside a string, array, etc.,
-                                                       // OR we've reached the end of the character list
-                                                       $slice = substr($chrs, $top['where'], ($c - $top['where']));
-                                                       array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
-                                                       //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                                                       if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                                                               // we are in an array, so just push an element onto the stack
-                                                               array_push($arr, $this->decode($slice));
-
-                                                       } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-                                                               // we are in an object, so figure
-                                                               // out the property name and set an
-                                                               // element in an associative array,
-                                                               // for now
-                                                               $parts = array();
-
-                                                               if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-                                                                       // "name":value pair
-                                                                       $key = $this->decode($parts[1]);
-                                                                       $val = $this->decode($parts[2]);
-
-                                                                       if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-                                                                               $obj[$key] = $val;
-                                                                       } else {
-                                                                               $obj->$key = $val;
-                                                                       }
-                                                               } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-                                                                       // name:value pair, where name is unquoted
-                                                                       $key = $parts[1];
-                                                                       $val = $this->decode($parts[2]);
-
-                                                                       if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-                                                                               $obj[$key] = $val;
-                                                                       } else {
-                                                                               $obj->$key = $val;
-                                                                       }
-                                                               }
-
-                                                       }
-
-                                               } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
-                                                       // found a quote, and we are not inside a string
-                                                       array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c]));
-                                                       //print("Found start of string at {$c}\n");
-
-                                               } elseif (($chrs[$c] == $top['delim']) &&
-                                                                ($top['what'] == SERVICES_JSON_IN_STR) &&
-                                                                (($chrs[$c - 1] != '\\') ||
-                                                                ($chrs[$c - 1] == '\\' && $chrs[$c - 2] == '\\'))) {
-                                                       // found a quote, we're in a string, and it's not escaped
-                                                       array_pop($stk);
-                                                       //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
-
-                                               } elseif (($chrs[$c] == '[') &&
-                                                                in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                                                       // found a left-bracket, and we are in an array, object, or slice
-                                                       array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
-                                                       //print("Found start of array at {$c}\n");
-
-                                               } elseif (($chrs[$c] == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
-                                                       // found a right-bracket, and we're in an array
-                                                       array_pop($stk);
-                                                       //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                                               } elseif (($chrs[$c] == '{') &&
-                                                                in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                                                       // found a left-brace, and we are in an array, object, or slice
-                                                       array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
-                                                       //print("Found start of object at {$c}\n");
-
-                                               } elseif (($chrs[$c] == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
-                                                       // found a right-brace, and we're in an object
-                                                       array_pop($stk);
-                                                       //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                                               } elseif (($substr_chrs_c_2 == '/*') &&
-                                                                in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                                                       // found a comment start, and we are in an array, object, or slice
-                                                       array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
-                                                       $c++;
-                                                       //print("Found start of comment at {$c}\n");
-
-                                               } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
-                                                       // found a comment end, and we're in one now
-                                                       array_pop($stk);
-                                                       $c++;
-
-                                                       for ($i = $top['where']; $i <= $c; ++$i)
-                                                               $chrs = substr_replace($chrs, ' ', $i, 1);
-
-                                                       //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                                               }
-
-                                       }
-
-                                       if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                                               return $arr;
-
-                                       } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-                                               return $obj;
-
-                                       }
-
-                               }
-               }
-       }
-
-       /**
-        * @todo Ultimately, this should just call PEAR::isError()
-        * @return bool
-        */
-       function isError($data, $code = null)
-       {
-               if ( self::pearInstalled() ) {
-                       //avoid some strict warnings on PEAR isError check (looks like http://pear.php.net/bugs/bug.php?id=9950 has been around for some time)
-                       return @PEAR::isError($data, $code);
-               } elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
-                               is_subclass_of($data, 'services_json_error'))) {
-                       return true;
-               }
-
-               return false;
-       }
-}
-
-
-// Hide the PEAR_Error variant from Doxygen
-/// @cond
-if (class_exists('PEAR_Error')) {
-
-       /**
-        * @ingroup API
-        */
-       class Services_JSON_Error extends PEAR_Error
-       {
-               function Services_JSON_Error($message = 'unknown error', $code = null,
-                                               $mode = null, $options = null, $userinfo = null)
-               {
-                       parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
-               }
-       }
-
-} else {
-/// @endcond
-
-       /**
-        * @todo Ultimately, this class shall be descended from PEAR_Error
-        * @ingroup API
-        */
-       class Services_JSON_Error
-       {
-               function Services_JSON_Error($message = 'unknown error', $code = null,
-                                               $mode = null, $options = null, $userinfo = null)
-               {
-                       $this->message = $message;
-               }
-
-               function __toString()
-               {
-                       return $this->message;
-               }
-       }
-}
diff --git a/includes/logging/DeleteLogFormatter.php b/includes/logging/DeleteLogFormatter.php
new file mode 100644 (file)
index 0000000..ef9a2d4
--- /dev/null
@@ -0,0 +1,196 @@
+<?php
+/**
+ * Formatter for delete 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
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats delete log entries.
+ *
+ * @since 1.19
+ */
+class DeleteLogFormatter extends LogFormatter {
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
+                       if ( count( $this->getMessageParameters() ) < 5 ) {
+                               return "$key-legacy";
+                       }
+               }
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               if ( isset( $this->parsedParametersDeleteLog ) ) {
+                       return $this->parsedParametersDeleteLog;
+               }
+
+               $params = parent::getMessageParameters();
+               $subtype = $this->entry->getSubtype();
+               if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
+                       // $params[3] here is 'revision' for page revisions, 'oldimage' for file versions, or a comma-separated list of log_ids for log entries.
+                       // $subtype here is 'revision' for page revisions and file versions, or 'event' for log entries.
+                       if (
+                               ( $subtype === 'event' && count( $params ) === 6 ) ||
+                               ( $subtype === 'revision' && isset( $params[3] ) && ( $params[3] === 'revision' || $params[3] === 'oldimage' ) )
+                       ) {
+                               $paramStart = $subtype === 'revision' ? 4 : 3;
+
+                               $old = $this->parseBitField( $params[$paramStart + 1] );
+                               $new = $this->parseBitField( $params[$paramStart + 2] );
+                               list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
+                               $changes = array();
+                               foreach ( $hid as $v ) {
+                                       $changes[] = $this->msg( "$v-hid" )->plain();
+                               }
+                               foreach ( $unhid as $v ) {
+                                       $changes[] = $this->msg( "$v-unhid" )->plain();
+                               }
+                               foreach ( $extra as $v ) {
+                                       $changes[] = $this->msg( $v )->plain();
+                               }
+                               $changeText = $this->context->getLanguage()->listToText( $changes );
+
+                               $newParams = array_slice( $params, 0, 3 );
+                               $newParams[3] = $changeText;
+                               $count = count( explode( ',', $params[$paramStart] ) );
+                               $newParams[4] = $this->context->getLanguage()->formatNum( $count );
+                               return $this->parsedParametersDeleteLog = $newParams;
+                       } else {
+                               return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
+                       }
+               }
+
+               return $this->parsedParametersDeleteLog = $params;
+       }
+
+       protected function parseBitField( $string ) {
+               // Input is like ofield=2134 or just the number
+               if ( strpos( $string, 'field=' ) === 1 ) {
+                       list( , $field ) = explode( '=', $string );
+                       return (int) $field;
+               } else {
+                       return (int) $string;
+               }
+       }
+
+       public function getActionLinks() {
+               $user = $this->context->getUser();
+               if ( !$user->isAllowed( 'deletedhistory' ) || $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
+                       return '';
+               }
+
+               switch ( $this->entry->getSubtype() ) {
+               case 'delete': // Show undelete link
+                       if ( $user->isAllowed( 'undelete' ) ) {
+                               $message = 'undeletelink';
+                       } else {
+                               $message = 'undeleteviewlink';
+                       }
+                       $revert = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Undelete' ),
+                               $this->msg( $message )->escaped(),
+                               array(),
+                               array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
+                       );
+                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+
+               case 'revision': // If an edit was hidden from a page give a review link to the history
+                       $params = $this->extractParameters();
+                       if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
+                               return '';
+                       }
+
+                       // Different revision types use different URL params...
+                       $key = $params[3];
+                       // This is a CSV of the IDs
+                       $ids = explode( ',', $params[4] );
+
+                       $links = array();
+
+                       // If there's only one item, we can show a diff link
+                       if ( count( $ids ) == 1 ) {
+                               // Live revision diffs...
+                               if ( $key == 'oldid' || $key == 'revision' ) {
+                                       $links[] = Linker::linkKnown(
+                                               $this->entry->getTarget(),
+                                               $this->msg( 'diff' )->escaped(),
+                                               array(),
+                                               array(
+                                                       'diff' => intval( $ids[0] ),
+                                                       'unhide' => 1
+                                               )
+                                       );
+                               // Deleted revision diffs...
+                               } elseif ( $key == 'artimestamp' || $key == 'archive' ) {
+                                       $links[] = Linker::linkKnown(
+                                               SpecialPage::getTitleFor( 'Undelete' ),
+                                               $this->msg( 'diff' )->escaped(),
+                                               array(),
+                                               array(
+                                                       'target' => $this->entry->getTarget()->getPrefixedDBkey(),
+                                                       'diff' => 'prev',
+                                                       'timestamp' => $ids[0]
+                                               )
+                                       );
+                               }
+                       }
+
+                       // View/modify link...
+                       $links[] = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Revisiondelete' ),
+                               $this->msg( 'revdel-restore' )->escaped(),
+                               array(),
+                               array(
+                                       'target' => $this->entry->getTarget()->getPrefixedText(),
+                                       'type' => $key,
+                                       'ids' => implode( ',', $ids ),
+                               )
+                       );
+
+                       return $this->msg( 'parentheses' )->rawParams(
+                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
+
+               case 'event': // Hidden log items, give review link
+                       $params = $this->extractParameters();
+                       if ( !isset( $params[3] ) ) {
+                               return '';
+                       }
+                       // This is a CSV of the IDs
+                       $query = $params[3];
+                       // Link to each hidden object ID, $params[1] is the url param
+                       $revert = Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Revisiondelete' ),
+                               $this->msg( 'revdel-restore' )->escaped(),
+                               array(),
+                               array(
+                                       'target' => $this->entry->getTarget()->getPrefixedText(),
+                                       'type' => 'logging',
+                                       'ids' => $query
+                               )
+                       );
+                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+               default:
+                       return '';
+               }
+       }
+}
index 0f20ed1..b99f16b 100644 (file)
@@ -151,7 +151,7 @@ class DatabaseLogEntry extends LogEntryBase {
                return array(
                        'tables' => $tables,
                        'fields' => $fields,
-                       'conds'  => array(),
+                       'conds' => array(),
                        'options' => array(),
                        'join_conds' => $joins,
                );
@@ -233,7 +233,7 @@ class DatabaseLogEntry extends LogEntryBase {
        }
 
        public function getPerformer() {
-               if( !$this->performer ) {
+               if ( !$this->performer ) {
                        $userId = (int) $this->row->log_user;
                        if ( $userId !== 0 ) { // logged-in users
                                if ( isset( $this->row->user_name ) ) {
@@ -291,7 +291,7 @@ class RCDatabaseLogEntry extends DatabaseLogEntry {
        }
 
        public function getPerformer() {
-               if( !$this->performer ) {
+               if ( !$this->performer ) {
                        $userId = (int) $this->row->rc_user;
                        if ( $userId !== 0 ) {
                                $this->performer = User::newFromId( $userId );
index 501af7d..2150019 100644 (file)
@@ -74,9 +74,9 @@ class LogEventsList extends ContextSource {
        public function showHeader( $type ) {
                wfDeprecated( __METHOD__, '1.19' );
                // If only one log type is used, then show a special message...
-               $headerType = (count( $type ) == 1) ? $type[0] : '';
+               $headerType = count( $type ) == 1 ? $type[0] : '';
                $out = $this->getOutput();
-               if( LogPage::isLogType( $headerType ) ) {
+               if ( LogPage::isLogType( $headerType ) ) {
                        $page = new LogPage( $headerType );
                        $out->setPageTitle( $page->getName()->text() );
                        $out->addHTML( $page->getDescription()->parseAsBlock() );
@@ -97,14 +97,14 @@ class LogEventsList extends ContextSource {
         * @param $filter: array
         * @param $tagFilter: array?
         */
-       public function showOptions( $types=array(), $user = '', $page = '', $pattern = '', $year = '',
+       public function showOptions( $types = array(), $user = '', $page = '', $pattern = '', $year = '',
                $month = '', $filter = null, $tagFilter = '' ) {
                global $wgScript, $wgMiserMode;
 
                $title = SpecialPage::getTitleFor( 'Log' );
 
                // For B/C, we take strings, but make sure they are converted...
-               $types = ($types === '') ? array() : (array)$types;
+               $types = ( $types === '' ) ? array() : (array)$types;
 
                $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
 
@@ -156,7 +156,7 @@ class LogEventsList extends ContextSource {
                // Option value -> message mapping
                $links = array();
                $hiddens = ''; // keep track for "go" button
-               foreach( $filter as $type => $val ) {
+               foreach ( $filter as $type => $val ) {
                        // Should the below assignment be outside the foreach?
                        // Then it would have to be copied. Not certain what is more expensive.
                        $query = $this->getDefaultQuery();
@@ -212,7 +212,7 @@ class LogEventsList extends ContextSource {
        public function getTypeSelector() {
                $typesByName = array(); // Temporary array
                // First pass to load the log names
-               foreach( LogPage::validTypes() as $type ) {
+               foreach ( LogPage::validTypes() as $type ) {
                        $page = new LogPage( $type );
                        $restriction = $page->getRestriction();
                        if ( $this->getUser()->isAllowed( $restriction ) ) {
@@ -229,7 +229,7 @@ class LogEventsList extends ContextSource {
                $typesByName = array( '' => $public ) + $typesByName;
 
                $select = new XmlSelect( 'type' );
-               foreach( $typesByName as $type => $name ) {
+               foreach ( $typesByName as $type => $name ) {
                        $select->addOption( $name, $type );
                }
 
@@ -273,10 +273,10 @@ class LogEventsList extends ContextSource {
        private function getExtraInputs( $types ) {
                $offender = $this->getRequest()->getVal( 'offender' );
                $user = User::newFromName( $offender, false );
-               if( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
+               if ( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
                        $offender = ''; // Blank field if invalid
                }
-               if( count( $types ) == 1 && $types[0] == 'suppress' ) {
+               if ( count( $types ) == 1 && $types[0] == 'suppress' ) {
                        return Xml::inputLabel( $this->msg( 'revdelete-offender' )->text(), 'offender',
                                'mw-log-offender', 20, $offender );
                }
@@ -342,16 +342,16 @@ class LogEventsList extends ContextSource {
         * @return string
         */
        private function getShowHideLinks( $row ) {
-               if( ( $this->flags == self::NO_ACTION_LINK ) // we don't want to see the links
+               if ( ( $this->flags == self::NO_ACTION_LINK ) // we don't want to see the links
                        || $row->log_type == 'suppress' ) { // no one can hide items from the suppress log
                        return '';
                }
                $del = '';
                $user = $this->getUser();
                // Don't show useless checkbox to people who cannot hide log entries
-               if( $user->isAllowed( 'deletedhistory' ) ) {
+               if ( $user->isAllowed( 'deletedhistory' ) ) {
                        $canHide = $user->isAllowed( 'deletelogentry' );
-                       if( $row->log_deleted || $canHide ) {
+                       if ( $row->log_deleted || $canHide ) {
                                if ( $canHide && $this->flags & self::USE_REVDEL_CHECKBOXES ) { // Show checkboxes instead of links.
                                        if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED, $user ) ) { // If event was hidden from sysops
                                                $del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
@@ -364,8 +364,8 @@ class LogEventsList extends ContextSource {
                                        } else {
                                                $query = array(
                                                        'target' => SpecialPage::getTitleFor( 'Log', $row->log_type )->getPrefixedDBkey(),
-                                                       'type'   => 'logging',
-                                                       'ids'    => $row->log_id,
+                                                       'type' => 'logging',
+                                                       'ids' => $row->log_id,
                                                );
                                                $del = Linker::revDeleteLink( $query, self::isDeleted( $row, LogPage::DELETED_RESTRICTED ), $canHide );
                                        }
@@ -385,10 +385,10 @@ class LogEventsList extends ContextSource {
        public static function typeAction( $row, $type, $action, $right = '' ) {
                $match = is_array( $type ) ?
                        in_array( $row->log_type, $type ) : $row->log_type == $type;
-               if( $match ) {
+               if ( $match ) {
                        $match = is_array( $action ) ?
                                in_array( $row->log_action, $action ) : $row->log_action == $action;
-                       if( $match && $right ) {
+                       if ( $match && $right ) {
                                global $wgUser;
                                $match = $wgUser->isAllowed( $right );
                        }
@@ -419,7 +419,7 @@ class LogEventsList extends ContextSource {
         * @return Boolean
         */
        public static function userCanBitfield( $bitfield, $field, User $user = null ) {
-               if( $bitfield & $field ) {
+               if ( $bitfield & $field ) {
                        if ( $bitfield & LogPage::DELETED_RESTRICTED ) {
                                $permission = 'suppressrevision';
                        } else {
@@ -464,10 +464,11 @@ class LogEventsList extends ContextSource {
         *   set to '' to unset offset
         * - wrap String Wrap the message in html (usually something like "<div ...>$1</div>").
         * - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
+        * - useRequestParams boolean Set true to use Pager-related parameters in the WebRequest
         * @return Integer Number of total log items (not limited by $lim)
         */
        public static function showLogExtract(
-               &$out, $types=array(), $page = '', $user = '', $param = array()
+               &$out, $types = array(), $page = '', $user = '', $param = array()
        ) {
                $defaultParameters = array(
                        'lim' => 25,
@@ -475,7 +476,8 @@ class LogEventsList extends ContextSource {
                        'showIfEmpty' => true,
                        'msgKey' => array( '' ),
                        'wrap' => "$1",
-                       'flags' => 0
+                       'flags' => 0,
+                       'useRequestParams' => false,
                );
                # The + operator appends elements of remaining keys from the right
                # handed array to the left handed, whereas duplicated keys are NOT overwritten.
@@ -487,6 +489,7 @@ class LogEventsList extends ContextSource {
                $msgKey = $param['msgKey'];
                $wrap = $param['wrap'];
                $flags = $param['flags'];
+               $useRequestParams = $param['useRequestParams'];
                if ( !is_array( $msgKey ) ) {
                        $msgKey = array( $msgKey );
                }
@@ -500,13 +503,22 @@ class LogEventsList extends ContextSource {
                # Insert list of top 50 (or top $lim) items
                $loglist = new LogEventsList( $context, null, $flags );
                $pager = new LogPager( $loglist, $types, $user, $page, '', $conds );
+               if ( !$useRequestParams ) {
+                       # Reset vars that may have been taken from the request
+                       $pager->mLimit = 50;
+                       $pager->mDefaultLimit = 50;
+                       $pager->mOffset = "";
+                       $pager->mIsBackwards = false;
+               }
                if ( isset( $param['offset'] ) ) { # Tell pager to ignore WebRequest offset
                        $pager->setOffset( $param['offset'] );
                }
-               if( $lim > 0 ) $pager->mLimit = $lim;
+               if ( $lim > 0 ) {
+                       $pager->mLimit = $lim;
+               }
                $logBody = $pager->getBody();
                $s = '';
-               if( $logBody ) {
+               if ( $logBody ) {
                        if ( $msgKey[0] ) {
                                $s = '<div class="mw-warning-with-logexcerpt">';
 
@@ -521,26 +533,27 @@ class LogEventsList extends ContextSource {
                        $s .= $loglist->beginLogEventsList() .
                                $logBody .
                                $loglist->endLogEventsList();
-               } else {
-                       if ( $showIfEmpty ) {
-                               $s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
-                                       $context->msg( 'logempty' )->parse() );
-                       }
+               } elseif ( $showIfEmpty ) {
+                       $s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
+                               $context->msg( 'logempty' )->parse() );
                }
-               if( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
+               if ( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
                        $urlParam = array();
                        if ( $page instanceof Title ) {
                                $urlParam['page'] = $page->getPrefixedDBkey();
                        } elseif ( $page != '' ) {
                                $urlParam['page'] = $page;
                        }
-                       if ( $user != '' )
+                       if ( $user != '' ) {
                                $urlParam['user'] = $user;
-                       if ( !is_array( $types ) ) # Make it an array, if it isn't
+                       }
+                       if ( !is_array( $types ) ) { # Make it an array, if it isn't
                                $types = array( $types );
+                       }
                        # If there is exactly one log type, we can link to Special:Log?type=foo
-                       if ( count( $types ) == 1 )
+                       if ( count( $types ) == 1 ) {
                                $urlParam['type'] = $types[0];
+                       }
                        $s .= Linker::link(
                                SpecialPage::getTitleFor( 'Log' ),
                                $context->msg( 'log-fulllog' )->escaped(),
@@ -589,14 +602,14 @@ class LogEventsList extends ContextSource {
                $hiddenLogs = array();
 
                // Don't show private logs to unprivileged users
-               foreach( $wgLogRestrictions as $logType => $right ) {
-                       if( $audience == 'public' || !$user->isAllowed( $right ) ) {
+               foreach ( $wgLogRestrictions as $logType => $right ) {
+                       if ( $audience == 'public' || !$user->isAllowed( $right ) ) {
                                $hiddenLogs[] = $logType;
                        }
                }
-               if( count( $hiddenLogs ) == 1 ) {
+               if ( count( $hiddenLogs ) == 1 ) {
                        return 'log_type != ' . $db->addQuotes( $hiddenLogs[0] );
-               } elseif( $hiddenLogs ) {
+               } elseif ( $hiddenLogs ) {
                        return 'log_type NOT IN (' . $db->makeList( $hiddenLogs ) . ')';
                }
                return false;
index ace26bb..8f60aee 100644 (file)
@@ -194,9 +194,9 @@ class LogFormatter {
                // Text of title the action is aimed at.
                $target = $entry->getTarget()->getPrefixedText();
                $text = null;
-               switch( $entry->getType() ) {
+               switch ( $entry->getType() ) {
                        case 'move':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'move':
                                                $movesource = $parameters['4::target'];
                                                $text = wfMessage( '1movedto2' )
@@ -215,7 +215,7 @@ class LogFormatter {
                                break;
 
                        case 'delete':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'delete':
                                                $text = wfMessage( 'deletedarticle' )
                                                        ->rawParams( $target )->inContentLanguage()->escaped();
@@ -246,7 +246,7 @@ class LogFormatter {
                                break;
 
                        case 'protect':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                case 'protect':
                                        $text = wfMessage( 'protectedarticle' )
                                                ->rawParams( $target . ' ' . $parameters[0] )->inContentLanguage()->escaped();
@@ -263,7 +263,7 @@ class LogFormatter {
                                break;
 
                        case 'newusers':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'newusers':
                                        case 'create':
                                                $text = wfMessage( 'newuserlog-create-entry' )
@@ -282,7 +282,7 @@ class LogFormatter {
                                break;
 
                        case 'upload':
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'upload':
                                                $text = wfMessage( 'uploadedimage' )
                                                        ->rawParams( $target )->inContentLanguage()->escaped();
@@ -305,7 +305,7 @@ class LogFormatter {
                                } else {
                                        $newgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
                                }
-                               switch( $entry->getSubtype() ) {
+                               switch ( $entry->getSubtype() ) {
                                        case 'rights':
                                                $text = wfMessage( 'rightslogentry' )
                                                        ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
@@ -320,7 +320,7 @@ class LogFormatter {
                        // case 'suppress' --private log -- aaron  (sign your messages so we know who to blame in a few years :-D)
                        // default:
                }
-               if( is_null( $text ) ) {
+               if ( is_null( $text ) ) {
                        $text = $this->getPlainActionText();
                }
 
@@ -479,7 +479,7 @@ class LogFormatter {
        protected function formatParameterValue( $type, $value ) {
                $saveLinkFlood = $this->linkFlood;
 
-               switch( strtolower( trim( $type ) ) ) {
+               switch ( strtolower( trim( $type ) ) ) {
                        case 'raw':
                                $value = Message::rawParam( $value );
                                break;
@@ -775,7 +775,7 @@ class LegacyLogFormatter extends LogFormatter {
                        return $this->msg( 'parentheses' )->rawParams(
                                $this->context->getLanguage()->pipeList( $links ) )->escaped();
                // Show unmerge link
-               } elseif( $type == 'merge' && $subtype == 'merge' ) {
+               } elseif ( $type == 'merge' && $subtype == 'merge' ) {
                        if ( !$this->context->getUser()->isAllowed( 'mergehistory' ) ) {
                                return '';
                        }
@@ -814,395 +814,3 @@ class LegacyLogFormatter extends LogFormatter {
        }
 }
 
-/**
- * This class formats move log entries.
- * @since 1.19
- */
-class MoveLogFormatter extends LogFormatter {
-       public function getPreloadTitles() {
-               $params = $this->extractParameters();
-               return array( Title::newFromText( $params[3] ) );
-       }
-
-       protected function getMessageKey() {
-               $key = parent::getMessageKey();
-               $params = $this->getMessageParameters();
-               if ( isset( $params[4] ) && $params[4] === '1' ) {
-                       $key .= '-noredirect';
-               }
-               return $key;
-       }
-
-       protected function getMessageParameters() {
-               $params = parent::getMessageParameters();
-               $oldname = $this->makePageLink( $this->entry->getTarget(), array( 'redirect' => 'no' ) );
-               $newname = $this->makePageLink( Title::newFromText( $params[3] ) );
-               $params[2] = Message::rawParam( $oldname );
-               $params[3] = Message::rawParam( $newname );
-               return $params;
-       }
-
-       public function getActionLinks() {
-               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
-                       || $this->entry->getSubtype() !== 'move'
-                       || !$this->context->getUser()->isAllowed( 'move' ) )
-               {
-                       return '';
-               }
-
-               $params = $this->extractParameters();
-               $destTitle = Title::newFromText( $params[3] );
-               if ( !$destTitle ) {
-                       return '';
-               }
-
-               $revert = Linker::linkKnown(
-                       SpecialPage::getTitleFor( 'Movepage' ),
-                       $this->msg( 'revertmove' )->escaped(),
-                       array(),
-                       array(
-                               'wpOldTitle' => $destTitle->getPrefixedDBkey(),
-                               'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
-                               'wpReason'   => $this->msg( 'revertmove' )->inContentLanguage()->text(),
-                               'wpMovetalk' => 0
-                       )
-               );
-               return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-       }
-}
-
-/**
- * This class formats delete log entries.
- * @since 1.19
- */
-class DeleteLogFormatter extends LogFormatter {
-       protected function getMessageKey() {
-               $key = parent::getMessageKey();
-               if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
-                       if ( count( $this->getMessageParameters() ) < 5 ) {
-                               return "$key-legacy";
-                       }
-               }
-               return $key;
-       }
-
-       protected function getMessageParameters() {
-               if ( isset( $this->parsedParametersDeleteLog ) ) {
-                       return $this->parsedParametersDeleteLog;
-               }
-
-               $params = parent::getMessageParameters();
-               $subtype = $this->entry->getSubtype();
-               if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
-                       // $params[3] here is 'revision' for page revisions, 'oldimage' for file versions, or a comma-separated list of log_ids for log entries.
-                       // $subtype here is 'revision' for page revisions and file versions, or 'event' for log entries.
-                       if (
-                               ( $subtype === 'event' && count( $params ) === 6 ) ||
-                               ( $subtype === 'revision' && isset( $params[3] ) && ( $params[3] === 'revision' || $params[3] === 'oldimage' ) )
-                       ) {
-                               $paramStart = $subtype === 'revision' ? 4 : 3;
-
-                               $old = $this->parseBitField( $params[$paramStart+1] );
-                               $new = $this->parseBitField( $params[$paramStart+2] );
-                               list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
-                               $changes = array();
-                               foreach ( $hid as $v ) {
-                                       $changes[] = $this->msg( "$v-hid" )->plain();
-                               }
-                               foreach ( $unhid as $v ) {
-                                       $changes[] = $this->msg( "$v-unhid" )->plain();
-                               }
-                               foreach ( $extra as $v ) {
-                                       $changes[] = $this->msg( $v )->plain();
-                               }
-                               $changeText = $this->context->getLanguage()->listToText( $changes );
-
-                               $newParams = array_slice( $params, 0, 3 );
-                               $newParams[3] = $changeText;
-                               $count = count( explode( ',', $params[$paramStart] ) );
-                               $newParams[4] = $this->context->getLanguage()->formatNum( $count );
-                               return $this->parsedParametersDeleteLog = $newParams;
-                       } else {
-                               return $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
-                       }
-               }
-
-               return $this->parsedParametersDeleteLog = $params;
-       }
-
-       protected function parseBitField( $string ) {
-               // Input is like ofield=2134 or just the number
-               if ( strpos( $string, 'field=' ) === 1 ) {
-                       list( , $field ) = explode( '=', $string );
-                       return (int) $field;
-               } else {
-                       return (int) $string;
-               }
-       }
-
-       public function getActionLinks() {
-               $user = $this->context->getUser();
-               if ( !$user->isAllowed( 'deletedhistory' ) || $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
-                       return '';
-               }
-
-               switch ( $this->entry->getSubtype() ) {
-               case 'delete': // Show undelete link
-                       if( $user->isAllowed( 'undelete' ) ) {
-                               $message = 'undeletelink';
-                       } else {
-                               $message = 'undeleteviewlink';
-                       }
-                       $revert = Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Undelete' ),
-                               $this->msg( $message )->escaped(),
-                               array(),
-                               array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
-                       );
-                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-
-               case 'revision': // If an edit was hidden from a page give a review link to the history
-                       $params = $this->extractParameters();
-                       if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
-                               return '';
-                       }
-
-                       // Different revision types use different URL params...
-                       $key = $params[3];
-                       // This is a CSV of the IDs
-                       $ids = explode( ',', $params[4] );
-
-                       $links = array();
-
-                       // If there's only one item, we can show a diff link
-                       if ( count( $ids ) == 1 ) {
-                               // Live revision diffs...
-                               if ( $key == 'oldid' || $key == 'revision' ) {
-                                       $links[] = Linker::linkKnown(
-                                               $this->entry->getTarget(),
-                                               $this->msg( 'diff' )->escaped(),
-                                               array(),
-                                               array(
-                                                       'diff' => intval( $ids[0] ),
-                                                       'unhide' => 1
-                                               )
-                                       );
-                               // Deleted revision diffs...
-                               } elseif ( $key == 'artimestamp' || $key == 'archive' ) {
-                                       $links[] = Linker::linkKnown(
-                                               SpecialPage::getTitleFor( 'Undelete' ),
-                                               $this->msg( 'diff' )->escaped(),
-                                               array(),
-                                               array(
-                                                       'target'    => $this->entry->getTarget()->getPrefixedDBkey(),
-                                                       'diff'      => 'prev',
-                                                       'timestamp' => $ids[0]
-                                               )
-                                       );
-                               }
-                       }
-
-                       // View/modify link...
-                       $links[] = Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Revisiondelete' ),
-                               $this->msg( 'revdel-restore' )->escaped(),
-                               array(),
-                               array(
-                                       'target' => $this->entry->getTarget()->getPrefixedText(),
-                                       'type' => $key,
-                                       'ids' => implode( ',', $ids ),
-                               )
-                       );
-
-                       return $this->msg( 'parentheses' )->rawParams(
-                               $this->context->getLanguage()->pipeList( $links ) )->escaped();
-
-               case 'event': // Hidden log items, give review link
-                       $params = $this->extractParameters();
-                       if ( !isset( $params[3] ) ) {
-                               return '';
-                       }
-                       // This is a CSV of the IDs
-                       $query = $params[3];
-                       // Link to each hidden object ID, $params[1] is the url param
-                       $revert = Linker::linkKnown(
-                               SpecialPage::getTitleFor( 'Revisiondelete' ),
-                               $this->msg( 'revdel-restore' )->escaped(),
-                               array(),
-                               array(
-                                       'target' => $this->entry->getTarget()->getPrefixedText(),
-                                       'type' => 'logging',
-                                       'ids' => $query
-                               )
-                       );
-                       return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
-               default:
-                       return '';
-               }
-       }
-}
-
-/**
- * This class formats patrol log entries.
- * @since 1.19
- */
-class PatrolLogFormatter extends LogFormatter {
-       protected function getMessageKey() {
-               $key = parent::getMessageKey();
-               $params = $this->getMessageParameters();
-               if ( isset( $params[5] ) && $params[5] ) {
-                       $key .= '-auto';
-               }
-               return $key;
-       }
-
-       protected function getMessageParameters() {
-               $params = parent::getMessageParameters();
-
-               $target = $this->entry->getTarget();
-               $oldid = $params[3];
-               $revision = $this->context->getLanguage()->formatNum( $oldid, true );
-
-               if ( $this->plaintext ) {
-                       $revlink = $revision;
-               } elseif ( $target->exists() ) {
-                       $query = array(
-                               'oldid' => $oldid,
-                               'diff' => 'prev'
-                       );
-                       $revlink = Linker::link( $target, htmlspecialchars( $revision ), array(), $query );
-               } else {
-                       $revlink = htmlspecialchars( $revision );
-               }
-
-               $params[3] = Message::rawParam( $revlink );
-               return $params;
-       }
-}
-
-/**
- * This class formats new user log entries.
- * @since 1.19
- */
-class NewUsersLogFormatter extends LogFormatter {
-       protected function getMessageParameters() {
-               $params = parent::getMessageParameters();
-               $subtype = $this->entry->getSubtype();
-               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
-                       if ( isset( $params[3] ) ) {
-                               $target = User::newFromId( $params[3] );
-                       } else {
-                               $target = User::newFromName( $this->entry->getTarget()->getText(), false );
-                       }
-                       $params[2] = Message::rawParam( $this->makeUserLink( $target ) );
-                       $params[3] = $target->getName();
-               }
-               return $params;
-       }
-
-       public function getComment() {
-               $timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
-               if ( $timestamp < '20080129000000' ) {
-                       # Suppress $comment from old entries (before 2008-01-29),
-                       # not needed and can contain incorrect links
-                       return '';
-               }
-               return parent::getComment();
-       }
-
-       public function getPreloadTitles() {
-               $subtype = $this->entry->getSubtype();
-               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
-                       //add the user talk to LinkBatch for the userLink
-                       return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
-               }
-               return array();
-       }
-}
-
-/**
- * This class formats rights log entries.
- * @since 1.21
- */
-class RightsLogFormatter extends LogFormatter {
-       protected function makePageLink( Title $title = null, $parameters = array() ) {
-               global $wgContLang, $wgUserrightsInterwikiDelimiter;
-
-               if ( !$this->plaintext ) {
-                       $text = $wgContLang->ucfirst( $title->getText() );
-                       $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
-
-                       if ( count( $parts ) === 2 ) {
-                               $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
-                                       htmlspecialchars( $title->getPrefixedText() ) );
-
-                               if ( $titleLink !== false ) {
-                                       return $titleLink;
-                               }
-                       }
-               }
-
-               return parent::makePageLink( $title, $parameters );
-       }
-
-       protected function getMessageKey() {
-               $key = parent::getMessageKey();
-               $params = $this->getMessageParameters();
-               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
-                       $key .= '-legacy';
-               }
-               return $key;
-       }
-
-       protected function getMessageParameters() {
-               $params = parent::getMessageParameters();
-
-               // Really old entries
-               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
-                       return $params;
-               }
-
-               $oldGroups = $params[3];
-               $newGroups = $params[4];
-
-               // Less old entries
-               if ( $oldGroups === '' ) {
-                       $oldGroups = array();
-               } elseif ( is_string( $oldGroups ) ) {
-                       $oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
-               }
-               if ( $newGroups === '' ) {
-                       $newGroups = array();
-               } elseif ( is_string( $newGroups ) ) {
-                       $newGroups = array_map( 'trim', explode( ',', $newGroups ) );
-               }
-
-               $userName = $this->entry->getTarget()->getText();
-               if ( !$this->plaintext && count( $oldGroups ) ) {
-                       foreach ( $oldGroups as &$group ) {
-                               $group = User::getGroupMember( $group, $userName );
-                       }
-               }
-               if ( !$this->plaintext && count( $newGroups ) ) {
-                       foreach ( $newGroups as &$group ) {
-                               $group = User::getGroupMember( $group, $userName );
-                       }
-               }
-
-               $lang = $this->context->getLanguage();
-               if ( count( $oldGroups ) ) {
-                       $params[3] = $lang->listToText( $oldGroups );
-               } else {
-                       $params[3] = $this->msg( 'rightsnone' )->text();
-               }
-               if ( count( $newGroups ) ) {
-                       // Array_values is used here because of bug 42211
-                       // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
-                       $params[4] = $lang->listToText( array_values( $newGroups ) );
-               } else {
-                       $params[4] = $this->msg( 'rightsnone' )->text();
-               }
-
-               return $params;
-       }
-}
index 4191c57..521cb8a 100644 (file)
@@ -94,7 +94,7 @@ class LogPage {
                $newId = !is_null( $log_id ) ? $log_id : $dbw->insertId();
 
                # And update recentchanges
-               if( $this->updateRecentChanges ) {
+               if ( $this->updateRecentChanges ) {
                        $titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
 
                        RecentChange::notifyLog(
@@ -102,9 +102,9 @@ class LogPage {
                                $this->type, $this->action, $this->target, $this->comment,
                                $this->params, $newId, $this->getRcCommentIRC()
                        );
-               } elseif( $this->sendToUDP ) {
+               } elseif ( $this->sendToUDP ) {
                        # Don't send private logs to UDP
-                       if( isset( $wgLogRestrictions[$this->type] ) && $wgLogRestrictions[$this->type] != '*' ) {
+                       if ( isset( $wgLogRestrictions[$this->type] ) && $wgLogRestrictions[$this->type] != '*' ) {
                                return $newId;
                        }
 
@@ -129,7 +129,7 @@ class LogPage {
        public function getRcComment() {
                $rcComment = $this->actionText;
 
-               if( $this->comment != '' ) {
+               if ( $this->comment != '' ) {
                        if ( $rcComment == '' ) {
                                $rcComment = $this->comment;
                        } else {
@@ -149,7 +149,7 @@ class LogPage {
        public function getRcCommentIRC() {
                $rcComment = $this->ircActionText;
 
-               if( $this->comment != '' ) {
+               if ( $this->comment != '' ) {
                        if ( $rcComment == '' ) {
                                $rcComment = $this->comment;
                        } else {
@@ -198,7 +198,7 @@ class LogPage {
        public static function logName( $type ) {
                global $wgLogNames;
 
-               if( isset( $wgLogNames[$type] ) ) {
+               if ( isset( $wgLogNames[$type] ) ) {
                        return str_replace( '_', ' ', wfMessage( $wgLogNames[$type] )->text() );
                } else {
                        // Bogus log types? Perhaps an extension was removed.
@@ -247,13 +247,13 @@ class LogPage {
 
                $key = "$type/$action";
 
-               if( isset( $wgLogActions[$key] ) ) {
-                       if( is_null( $title ) ) {
+               if ( isset( $wgLogActions[$key] ) ) {
+                       if ( is_null( $title ) ) {
                                $rv = wfMessage( $wgLogActions[$key] )->inLanguage( $langObj )->escaped();
                        } else {
                                $titleLink = self::getTitleLink( $type, $langObjOrNull, $title, $params );
 
-                               if( count( $params ) == 0 ) {
+                               if ( count( $params ) == 0 ) {
                                        $rv = wfMessage( $wgLogActions[$key] )->rawParams( $titleLink )->inLanguage( $langObj )->escaped();
                                } else {
                                        $details = '';
@@ -262,7 +262,7 @@ class LogPage {
                                        // User suppression
                                        if ( preg_match( '/^(block|suppress)\/(block|reblock)$/', $key ) ) {
                                                if ( $skin ) {
-                                                       $params[1] = '<span class="blockExpiry" dir="ltr" title="' . htmlspecialchars( $params[1] ). '">' .
+                                                       $params[1] = '<span class="blockExpiry" dir="ltr" title="' . htmlspecialchars( $params[1] ) . '">' .
                                                                $wgLang->translateBlockExpiry( $params[1] ) . '</span>';
                                                } else {
                                                        $params[1] = $wgContLang->translateBlockExpiry( $params[1] );
@@ -273,14 +273,14 @@ class LogPage {
                                        // Page protections
                                        } elseif ( $type == 'protect' && count( $params ) == 3 ) {
                                                // Restrictions and expiries
-                                               if( $skin ) {
+                                               if ( $skin ) {
                                                        $details .= $wgLang->getDirMark() . htmlspecialchars( " {$params[1]}" );
                                                } else {
                                                        $details .= " {$params[1]}";
                                                }
 
                                                // Cascading flag...
-                                               if( $params[2] ) {
+                                               if ( $params[2] ) {
                                                        $details .= ' [' . wfMessage( 'protect-summary-cascade' )->inLanguage( $langObj )->text() . ']';
                                                }
                                        }
@@ -291,7 +291,7 @@ class LogPage {
                } else {
                        global $wgLogActionsHandlers;
 
-                       if( isset( $wgLogActionsHandlers[$key] ) ) {
+                       if ( isset( $wgLogActionsHandlers[$key] ) ) {
                                $args = func_get_args();
                                $rv = call_user_func_array( $wgLogActionsHandlers[$key], $args );
                        } else {
@@ -310,7 +310,7 @@ class LogPage {
                // you want to link to something OTHER than the title of the log entry.
                // The real problem, which Erik was trying to fix (and it sort-of works now) is
                // that the same messages are being treated as both wikitext *and* HTML.
-               if( $filterWikilinks ) {
+               if ( $filterWikilinks ) {
                        $rv = str_replace( '[[', '', $rv );
                        $rv = str_replace( ']]', '', $rv );
                }
@@ -327,11 +327,11 @@ class LogPage {
         * @return String
         */
        protected static function getTitleLink( $type, $lang, $title, &$params ) {
-               if( !$lang ) {
+               if ( !$lang ) {
                        return $title->getPrefixedText();
                }
 
-               switch( $type ) {
+               switch ( $type ) {
                        case 'move':
                                $titleLink = Linker::link(
                                        $title,
@@ -353,7 +353,7 @@ class LogPage {
                                }
                                break;
                        case 'block':
-                               if( substr( $title->getText(), 0, 1 ) == '#' ) {
+                               if ( substr( $title->getText(), 0, 1 ) == '#' ) {
                                        $titleLink = $title->getText();
                                } else {
                                        // @todo Store the user identifier in the parameters
@@ -377,11 +377,11 @@ class LogPage {
                                $params[1] = $lang->timeanddate( $params[1] );
                                break;
                        default:
-                               if( $title->isSpecialPage() ) {
+                               if ( $title->isSpecialPage() ) {
                                        list( $name, $par ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
 
                                        # Use the language name for log titles, rather than Log/X
-                                       if( $name == 'Log' ) {
+                                       if ( $name == 'Log' ) {
                                                $logPage = new LogPage( $par );
                                                $titleLink = Linker::link( $title, $logPage->getName()->escaped() );
                                                $titleLink = wfMessage( 'parentheses' )
@@ -465,13 +465,13 @@ class LogPage {
         * @return Boolean
         */
        public function addRelations( $field, $values, $logid ) {
-               if( !strlen( $field ) || empty( $values ) ) {
+               if ( !strlen( $field ) || empty( $values ) ) {
                        return false; // nothing
                }
 
                $data = array();
 
-               foreach( $values as $value ) {
+               foreach ( $values as $value ) {
                        $data[] = array(
                                'ls_field' => $field,
                                'ls_value' => $value,
@@ -518,17 +518,17 @@ class LogPage {
         * @return String
         */
        public static function formatBlockFlags( $flags, $lang ) {
-               $flags = explode( ',', trim( $flags ) );
+               $flags = trim( $flags );
+               if ( $flags === '' ) {
+                       return ''; //nothing to do
+               }
+               $flags = explode( ',', $flags );
 
-               if( count( $flags ) > 0 ) {
-                       for( $i = 0; $i < count( $flags ); $i++ ) {
-                               $flags[$i] = self::formatBlockFlag( $flags[$i], $lang );
-                       }
-                       return wfMessage( 'parentheses' )->inLanguage( $lang )
-                               ->rawParams( $lang->commaList( $flags ) )->escaped();
-               } else {
-                       return '';
+               for ( $i = 0; $i < count( $flags ); $i++ ) {
+                       $flags[$i] = self::formatBlockFlag( $flags[$i], $lang );
                }
+               return wfMessage( 'parentheses' )->inLanguage( $lang )
+                       ->rawParams( $lang->commaList( $flags ) )->escaped();
        }
 
        /**
@@ -541,7 +541,7 @@ class LogPage {
        public static function formatBlockFlag( $flag, $lang ) {
                static $messages = array();
 
-               if( !isset( $messages[$flag] ) ) {
+               if ( !isset( $messages[$flag] ) ) {
                        $messages[$flag] = htmlspecialchars( $flag ); // Fallback
 
                        // For grepping. The following core messages can be used here:
index 908755e..3fb7b89 100644 (file)
@@ -34,14 +34,14 @@ class LogPager extends ReverseChronologicalPager {
        /**
         * Constructor
         *
-        * @param $list LogEventsList
+        * @param LogEventsList $list
         * @param string $types or Array: log types to show
         * @param string $performer the user who made the log entries
         * @param string|Title $title the page title the log entries are for
         * @param string $pattern do a prefix search rather than an exact title match
         * @param array $conds extra conditions for the query
-        * @param $year Integer: the year to start from
-        * @param $month Integer: the month to start from
+        * @param int $year The year to start from
+        * @param int $month The month to start from
         * @param string $tagFilter tag
         */
        public function __construct( $list, $types = array(), $performer = '', $title = '', $pattern = '',
@@ -71,16 +71,17 @@ class LogPager extends ReverseChronologicalPager {
        public function getFilterParams() {
                global $wgFilterLogTypes;
                $filters = array();
-               if( count( $this->types ) ) {
+               if ( count( $this->types ) ) {
                        return $filters;
                }
-               foreach( $wgFilterLogTypes as $type => $default ) {
+               foreach ( $wgFilterLogTypes as $type => $default ) {
                        // Avoid silly filtering
-                       if( $type !== 'patrol' || $this->getUser()->useNPPatrol() ) {
+                       if ( $type !== 'patrol' || $this->getUser()->useNPPatrol() ) {
                                $hide = $this->getRequest()->getInt( "hide_{$type}_log", $default );
                                $filters[$type] = $hide;
-                               if( $hide )
+                               if ( $hide ) {
                                        $this->mConds[] = 'log_type != ' . $this->mDb->addQuotes( $type );
+                               }
                        }
                }
                return $filters;
@@ -98,11 +99,11 @@ class LogPager extends ReverseChronologicalPager {
 
                $user = $this->getUser();
                // If $types is not an array, make it an array
-               $types = ($types === '') ? array() : (array)$types;
+               $types = ( $types === '' ) ? array() : (array)$types;
                // Don't even show header for private logs; don't recognize it...
                $needReindex = false;
                foreach ( $types as $type ) {
-                       if( isset( $wgLogRestrictions[$type] )
+                       if ( isset( $wgLogRestrictions[$type] )
                                && !$user->isAllowed( $wgLogRestrictions[$type] )
                        ) {
                                $needReindex = true;
@@ -119,13 +120,15 @@ class LogPager extends ReverseChronologicalPager {
                // Also, only show them upon specific request to avoid suprises.
                $audience = $types ? 'user' : 'public';
                $hideLogs = LogEventsList::getExcludeClause( $this->mDb, $audience, $user );
-               if( $hideLogs !== false ) {
+               if ( $hideLogs !== false ) {
                        $this->mConds[] = $hideLogs;
                }
-               if( count( $types ) ) {
+               if ( count( $types ) ) {
                        $this->mConds['log_type'] = $types;
                        // Set typeCGI; used in url param for paging
-                       if( count( $types ) == 1 ) $this->typeCGI = $types[0];
+                       if ( count( $types ) == 1 ) {
+                               $this->typeCGI = $types[0];
+                       }
                }
        }
 
@@ -136,16 +139,16 @@ class LogPager extends ReverseChronologicalPager {
         * @return bool
         */
        private function limitPerformer( $name ) {
-               if( $name == '' ) {
+               if ( $name == '' ) {
                        return false;
                }
                $usertitle = Title::makeTitleSafe( NS_USER, $name );
-               if( is_null( $usertitle ) ) {
+               if ( is_null( $usertitle ) ) {
                        return false;
                }
                /* Fetch userid at first, if known, provides awesome query plan afterwards */
                $userid = User::idFromName( $name );
-               if( !$userid ) {
+               if ( !$userid ) {
                        /* It should be nicer to abort query at all,
                           but for now it won't pass anywhere behind the optimizer */
                        $this->mConds[] = "NULL";
@@ -153,9 +156,9 @@ class LogPager extends ReverseChronologicalPager {
                        $this->mConds['log_user'] = $userid;
                        // Paranoia: avoid brute force searches (bug 17342)
                        $user = $this->getUser();
-                       if( !$user->isAllowed( 'deletedhistory' ) ) {
+                       if ( !$user->isAllowed( 'deletedhistory' ) ) {
                                $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
-                       } elseif( !$user->isAllowed( 'suppressrevision' ) ) {
+                       } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
                                $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::SUPPRESSED_USER ) .
                                        ' != ' . LogPage::SUPPRESSED_USER;
                        }
@@ -178,7 +181,7 @@ class LogPager extends ReverseChronologicalPager {
                        $title = $page;
                } else {
                        $title = Title::newFromText( $page );
-                       if( strlen( $page ) == 0 || !$title instanceof Title ) {
+                       if ( strlen( $page ) == 0 || !$title instanceof Title ) {
                                return false;
                        }
                }
@@ -198,7 +201,7 @@ class LogPager extends ReverseChronologicalPager {
                # 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.
-               if( $pattern && !$wgMiserMode ) {
+               if ( $pattern && !$wgMiserMode ) {
                        $this->mConds['log_namespace'] = $ns;
                        $this->mConds[] = 'log_title ' . $db->buildLike( $title->getDBkey(), $db->anyString() );
                        $this->pattern = $pattern;
@@ -208,10 +211,10 @@ class LogPager extends ReverseChronologicalPager {
                }
                // Paranoia: avoid brute force searches (bug 17342)
                $user = $this->getUser();
-               if( !$user->isAllowed( 'deletedhistory' ) ) {
-                       $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION) . ' = 0';
-               } elseif( !$user->isAllowed( 'suppressrevision' ) ) {
-                       $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::SUPPRESSED_ACTION) .
+               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                       $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0';
+               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
+                       $this->mConds[] = $db->bitAnd( 'log_deleted', LogPage::SUPPRESSED_ACTION ) .
                                ' != ' . LogPage::SUPPRESSED_ACTION;
                }
        }
@@ -234,7 +237,7 @@ class LogPager extends ReverseChronologicalPager {
                # Add log_search table if there are conditions on it.
                # This filters the results to only include log rows that have
                # log_search records with the specified ls_field and ls_value values.
-               if( array_key_exists( 'ls_field', $this->mConds ) ) {
+               if ( array_key_exists( 'ls_field', $this->mConds ) ) {
                        $tables[] = 'log_search';
                        $index['log_search'] = 'ls_field_val';
                        $index['logging'] = 'PRIMARY';
@@ -249,12 +252,12 @@ class LogPager extends ReverseChronologicalPager {
                # Avoid usage of the wrong index by limiting
                # the choices of available indexes. This mainly
                # avoids site-breaking filesorts.
-               } elseif( $this->title || $this->pattern || $this->performer ) {
+               } elseif ( $this->title || $this->pattern || $this->performer ) {
                        $index['logging'] = array( 'page_time', 'user_time' );
-                       if( count( $this->types ) == 1 ) {
+                       if ( count( $this->types ) == 1 ) {
                                $index['logging'][] = 'log_user_type_time';
                        }
-               } elseif( count( $this->types ) == 1 ) {
+               } elseif ( count( $this->types ) == 1 ) {
                        $index['logging'] = 'type_time';
                } else {
                        $index['logging'] = 'times';
@@ -264,10 +267,10 @@ class LogPager extends ReverseChronologicalPager {
                $joins['log_search'] = array( 'INNER JOIN', 'ls_log_id=log_id' );
 
                $info = array(
-                       'tables'     => $tables,
-                       'fields'     => $fields,
-                       'conds'      => array_merge( $conds, $this->mConds ),
-                       'options'    => $options,
+                       'tables' => $tables,
+                       'fields' => $fields,
+                       'conds' => array_merge( $conds, $this->mConds ),
+                       'options' => $options,
                        'join_conds' => $joins,
                );
                # Add ChangeTags filter query
@@ -295,7 +298,7 @@ class LogPager extends ReverseChronologicalPager {
        public function getStartBody() {
                wfProfileIn( __METHOD__ );
                # Do a link batch query
-               if( $this->getNumRows() > 0 ) {
+               if ( $this->getNumRows() > 0 ) {
                        $lb = new LinkBatch;
                        foreach ( $this->mResult as $row ) {
                                $lb->add( $row->log_namespace, $row->log_title );
diff --git a/includes/logging/MoveLogFormatter.php b/includes/logging/MoveLogFormatter.php
new file mode 100644 (file)
index 0000000..589b1ba
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Formatter for move 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
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats move log entries.
+ *
+ * @since 1.19
+ */
+class MoveLogFormatter extends LogFormatter {
+       public function getPreloadTitles() {
+               $params = $this->extractParameters();
+               return array( Title::newFromText( $params[3] ) );
+       }
+
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->getMessageParameters();
+               if ( isset( $params[4] ) && $params[4] === '1' ) {
+                       $key .= '-noredirect';
+               }
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+               $oldname = $this->makePageLink( $this->entry->getTarget(), array( 'redirect' => 'no' ) );
+               $newname = $this->makePageLink( Title::newFromText( $params[3] ) );
+               $params[2] = Message::rawParam( $oldname );
+               $params[3] = Message::rawParam( $newname );
+               return $params;
+       }
+
+       public function getActionLinks() {
+               if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
+                       || $this->entry->getSubtype() !== 'move'
+                       || !$this->context->getUser()->isAllowed( 'move' ) )
+               {
+                       return '';
+               }
+
+               $params = $this->extractParameters();
+               $destTitle = Title::newFromText( $params[3] );
+               if ( !$destTitle ) {
+                       return '';
+               }
+
+               $revert = Linker::linkKnown(
+                       SpecialPage::getTitleFor( 'Movepage' ),
+                       $this->msg( 'revertmove' )->escaped(),
+                       array(),
+                       array(
+                               'wpOldTitle' => $destTitle->getPrefixedDBkey(),
+                               'wpNewTitle' => $this->entry->getTarget()->getPrefixedDBkey(),
+                               'wpReason' => $this->msg( 'revertmove' )->inContentLanguage()->text(),
+                               'wpMovetalk' => 0
+                       )
+               );
+               return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
+       }
+}
diff --git a/includes/logging/NewUsersLogFormatter.php b/includes/logging/NewUsersLogFormatter.php
new file mode 100644 (file)
index 0000000..ed37b6a
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Formatter for new user 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
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats new user log entries.
+ *
+ * @since 1.19
+ */
+class NewUsersLogFormatter extends LogFormatter {
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+               $subtype = $this->entry->getSubtype();
+               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
+                       if ( isset( $params[3] ) ) {
+                               $target = User::newFromId( $params[3] );
+                       } else {
+                               $target = User::newFromName( $this->entry->getTarget()->getText(), false );
+                       }
+                       $params[2] = Message::rawParam( $this->makeUserLink( $target ) );
+                       $params[3] = $target->getName();
+               }
+               return $params;
+       }
+
+       public function getComment() {
+               $timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
+               if ( $timestamp < '20080129000000' ) {
+                       # Suppress $comment from old entries (before 2008-01-29),
+                       # not needed and can contain incorrect links
+                       return '';
+               }
+               return parent::getComment();
+       }
+
+       public function getPreloadTitles() {
+               $subtype = $this->entry->getSubtype();
+               if ( $subtype === 'create2' || $subtype === 'byemail' ) {
+                       //add the user talk to LinkBatch for the userLink
+                       return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
+               }
+               return array();
+       }
+}
index 911fffc..bb76d5a 100644 (file)
@@ -38,6 +38,13 @@ class PatrolLog {
         * @return bool
         */
        public static function record( $rc, $auto = false, User $user = null ) {
+               global $wgLogAutopatrol;
+
+               // do not log autopatrolled edits if setting disables it
+               if ( $auto && !$wgLogAutopatrol ) {
+                       return false;
+               }
+
                if ( !$rc instanceof RecentChange ) {
                        $rc = RecentChange::newFromId( $rc );
                        if ( !is_object( $rc ) ) {
diff --git a/includes/logging/PatrolLogFormatter.php b/includes/logging/PatrolLogFormatter.php
new file mode 100644 (file)
index 0000000..74ab196
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Formatter for new user 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
+ * @author Niklas Laxström
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats patrol log entries.
+ *
+ * @since 1.19
+ */
+class PatrolLogFormatter extends LogFormatter {
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->getMessageParameters();
+               if ( isset( $params[5] ) && $params[5] ) {
+                       $key .= '-auto';
+               }
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+
+               $target = $this->entry->getTarget();
+               $oldid = $params[3];
+               $revision = $this->context->getLanguage()->formatNum( $oldid, true );
+
+               if ( $this->plaintext ) {
+                       $revlink = $revision;
+               } elseif ( $target->exists() ) {
+                       $query = array(
+                               'oldid' => $oldid,
+                               'diff' => 'prev'
+                       );
+                       $revlink = Linker::link( $target, htmlspecialchars( $revision ), array(), $query );
+               } else {
+                       $revlink = htmlspecialchars( $revision );
+               }
+
+               $params[3] = Message::rawParam( $revlink );
+               return $params;
+       }
+}
diff --git a/includes/logging/RightsLogFormatter.php b/includes/logging/RightsLogFormatter.php
new file mode 100644 (file)
index 0000000..67bd4d0
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Formatter for user rights 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
+ * @author Alexandre Emsenhuber
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.21
+ */
+
+/**
+ * This class formats rights log entries.
+ *
+ * @since 1.21
+ */
+class RightsLogFormatter extends LogFormatter {
+       protected function makePageLink( Title $title = null, $parameters = array() ) {
+               global $wgContLang, $wgUserrightsInterwikiDelimiter;
+
+               if ( !$this->plaintext ) {
+                       $text = $wgContLang->ucfirst( $title->getText() );
+                       $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
+
+                       if ( count( $parts ) === 2 ) {
+                               $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
+                                       htmlspecialchars( $title->getPrefixedText() ) );
+
+                               if ( $titleLink !== false ) {
+                                       return $titleLink;
+                               }
+                       }
+               }
+
+               return parent::makePageLink( $title, $parameters );
+       }
+
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->getMessageParameters();
+               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+                       $key .= '-legacy';
+               }
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+
+               // Really old entries
+               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+                       return $params;
+               }
+
+               $oldGroups = $params[3];
+               $newGroups = $params[4];
+
+               // Less old entries
+               if ( $oldGroups === '' ) {
+                       $oldGroups = array();
+               } elseif ( is_string( $oldGroups ) ) {
+                       $oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
+               }
+               if ( $newGroups === '' ) {
+                       $newGroups = array();
+               } elseif ( is_string( $newGroups ) ) {
+                       $newGroups = array_map( 'trim', explode( ',', $newGroups ) );
+               }
+
+               $userName = $this->entry->getTarget()->getText();
+               if ( !$this->plaintext && count( $oldGroups ) ) {
+                       foreach ( $oldGroups as &$group ) {
+                               $group = User::getGroupMember( $group, $userName );
+                       }
+               }
+               if ( !$this->plaintext && count( $newGroups ) ) {
+                       foreach ( $newGroups as &$group ) {
+                               $group = User::getGroupMember( $group, $userName );
+                       }
+               }
+
+               $lang = $this->context->getLanguage();
+               if ( count( $oldGroups ) ) {
+                       $params[3] = $lang->listToText( $oldGroups );
+               } else {
+                       $params[3] = $this->msg( 'rightsnone' )->text();
+               }
+               if ( count( $newGroups ) ) {
+                       // Array_values is used here because of bug 42211
+                       // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
+                       $params[4] = $lang->listToText( array_values( $newGroups ) );
+               } else {
+                       $params[4] = $this->msg( 'rightsnone' )->text();
+               }
+
+               return $params;
+       }
+}
index 46d1b95..99b7741 100644 (file)
@@ -58,15 +58,15 @@ class BmpHandler extends BitmapHandler {
         */
        function getImageSize( $image, $filename ) {
                $f = fopen( $filename, 'rb' );
-               if( !$f ) {
+               if ( !$f ) {
                        return false;
                }
                $header = fread( $f, 54 );
                fclose( $f );
 
                // Extract binary form of width and height from the header
-               $w = substr( $header, 18, 4);
-               $h = substr( $header, 22, 4);
+               $w = substr( $header, 18, 4 );
+               $h = substr( $header, 22, 4 );
 
                // Convert the unsigned long 32 bits (little endian):
                try {
index e2dc68b..9f7a09c 100644 (file)
@@ -131,7 +131,7 @@ class BitmapHandler extends ImageHandler {
                        # The size of the image on the page
                        'clientWidth' => $params['width'],
                        'clientHeight' => $params['height'],
-                       # Comment as will be added to the EXIF of the thumbnail
+                       # Comment as will be added to the Exif of the thumbnail
                        'comment' => isset( $params['descriptionUrl'] ) ?
                                "File source: {$params['descriptionUrl']}" : '',
                        # Properties of the original image
@@ -398,7 +398,7 @@ class BitmapHandler extends ImageHandler {
                                        $im->sharpenImage( $radius, $sigma );
                                }
                                $im->setCompressionQuality( 80 );
-                       } elseif( $params['mimeType'] == 'image/png' ) {
+                       } elseif ( $params['mimeType'] == 'image/png' ) {
                                $im->setCompressionQuality( 95 );
                        } elseif ( $params['mimeType'] == 'image/gif' ) {
                                if ( $this->getImageArea( $image ) > $wgMaxAnimatedGifArea ) {
@@ -765,16 +765,16 @@ class BitmapHandler extends ImageHandler {
        public function rotate( $file, $params ) {
                global $wgImageMagickConvertCommand;
 
-               $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+               $rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
                $scene = false;
 
                $scaler = self::getScalerType( null, false );
                switch ( $scaler ) {
                        case 'im':
                                $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " .
-                                       wfEscapeShellArg( $this->escapeMagickInput( $params[ 'srcPath' ], $scene ) ) .
+                                       wfEscapeShellArg( $this->escapeMagickInput( $params['srcPath'], $scene ) ) .
                                        " -rotate -$rotation " .
-                                       wfEscapeShellArg( $this->escapeMagickOutput( $params[ 'dstPath' ] ) ) . " 2>&1";
+                                       wfEscapeShellArg( $this->escapeMagickOutput( $params['dstPath'] ) ) . " 2>&1";
                                wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" );
                                wfProfileIn( 'convert' );
                                $retval = 0;
index 3876c52..7c39c81 100644 (file)
@@ -156,7 +156,7 @@ class BitmapMetadataHandler {
                        $meta->addMetadata( Array( 'JPEGFileComment' => $seg['COM'] ), 'native' );
                }
                if ( isset( $seg['PSIR'] ) && count( $seg['PSIR'] ) > 0 ) {
-                       foreach( $seg['PSIR'] as $curPSIRValue ) {
+                       foreach ( $seg['PSIR'] as $curPSIRValue ) {
                                $meta->doApp13( $curPSIRValue );
                        }
                }
@@ -286,11 +286,13 @@ class BitmapMetadataHandler {
         */
        static function getTiffByteOrder( $filename ) {
                $fh = fopen( $filename, 'rb' );
-               if ( !$fh ) return false;
+               if ( !$fh ) {
+                       return false;
+               }
                $head = fread( $fh, 2 );
                fclose( $fh );
 
-               switch( $head ) {
+               switch ( $head ) {
                        case 'II':
                                return 'LE'; // II for intel.
                        case 'MM':
index 0a39a2c..b9e89d9 100644 (file)
@@ -185,7 +185,7 @@ class DjVuHandler extends ImageHandler {
                }
                $cmd .= ' > ' . wfEscapeShellArg( $dstPath ) . ') 2>&1';
                wfProfileIn( 'ddjvu' );
-               wfDebug( __METHOD__.": $cmd\n" );
+               wfDebug( __METHOD__ . ": $cmd\n" );
                $retval = '';
                $err = wfShellExec( $cmd, $retval );
                wfProfileOut( 'ddjvu' );
@@ -246,24 +246,23 @@ class DjVuHandler extends ImageHandler {
                        $image->dejaMetaTree = false;
                        $image->djvuTextTree = false;
                        $tree = new SimpleXMLElement( $metadata );
-                       if( $tree->getName() == 'mw-djvu' ) {
-                               foreach( $tree->children() as $b ) {
-                                       if( $b->getName() == 'DjVuTxt' ) {
+                       if ( $tree->getName() == 'mw-djvu' ) {
+                               foreach ( $tree->children() as $b ) {
+                                       if ( $b->getName() == 'DjVuTxt' ) {
                                                $image->djvuTextTree = $b;
-                                       }
-                                       elseif ( $b->getName() == 'DjVuXML' ) {
+                                       } elseif ( $b->getName() == 'DjVuXML' ) {
                                                $image->dejaMetaTree = $b;
                                        }
                                }
                        } else {
                                $image->dejaMetaTree = $tree;
                        }
-               } catch( Exception $e ) {
+               } catch ( Exception $e ) {
                        wfDebug( "Bogus multipage XML metadata on '{$image->getName()}'\n" );
                }
                wfRestoreWarnings();
                wfProfileOut( __METHOD__ );
-               if( $gettext ) {
+               if ( $gettext ) {
                        return $image->djvuTextTree;
                } else {
                        return $image->dejaMetaTree;
@@ -294,7 +293,7 @@ class DjVuHandler extends ImageHandler {
        }
 
        function isMetadataValid( $image, $metadata ) {
-               return !empty( $metadata ) && $metadata != serialize(array());
+               return !empty( $metadata ) && $metadata != serialize( array() );
        }
 
        function pageCount( $image ) {
@@ -311,7 +310,7 @@ class DjVuHandler extends ImageHandler {
                        return false;
                }
 
-               $o = $tree->BODY[0]->OBJECT[$page-1];
+               $o = $tree->BODY[0]->OBJECT[$page - 1];
                if ( $o ) {
                        return array(
                                'width' => intval( $o['width'] ),
@@ -328,7 +327,7 @@ class DjVuHandler extends ImageHandler {
                        return false;
                }
 
-               $o = $tree->BODY[0]->PAGE[$page-1];
+               $o = $tree->BODY[0]->PAGE[$page - 1];
                if ( $o ) {
                        $txt = $o['value'];
                        return $txt;
index 4698966..54efe7a 100644 (file)
@@ -64,7 +64,7 @@ class DjVuImage {
        public function getImageSize() {
                $data = $this->getInfo();
 
-               if( $data !== false ) {
+               if ( $data !== false ) {
                        $width = $data['width'];
                        $height = $data['height'];
 
@@ -93,20 +93,20 @@ class DjVuImage {
                $start = ftell( $file );
                $secondary = fread( $file, 4 );
                echo str_repeat( ' ', $indent * 4 ) . "($secondary)\n";
-               while( ftell( $file ) - $start < $length ) {
+               while ( ftell( $file ) - $start < $length ) {
                        $chunkHeader = fread( $file, 8 );
-                       if( $chunkHeader == '' ) {
+                       if ( $chunkHeader == '' ) {
                                break;
                        }
                        // @todo FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
                        extract( unpack( 'a4chunk/NchunkLength', $chunkHeader ) );
                        echo str_repeat( ' ', $indent * 4 ) . "$chunk $chunkLength\n";
 
-                       if( $chunk == 'FORM' ) {
+                       if ( $chunk == 'FORM' ) {
                                $this->dumpForm( $file, $chunkLength, $indent + 1 );
                        } else {
                                fseek( $file, $chunkLength, SEEK_CUR );
-                               if( $chunkLength & 1 == 1 ) {
+                               if ( $chunkLength & 1 == 1 ) {
                                        // Padding byte between chunks
                                        fseek( $file, 1, SEEK_CUR );
                                }
@@ -118,7 +118,7 @@ class DjVuImage {
                wfSuppressWarnings();
                $file = fopen( $this->mFilename, 'rb' );
                wfRestoreWarnings();
-               if( $file === false ) {
+               if ( $file === false ) {
                        wfDebug( __METHOD__ . ": missing or failed file read\n" );
                        return false;
                }
@@ -126,21 +126,21 @@ class DjVuImage {
                $header = fread( $file, 16 );
                $info = false;
 
-               if( strlen( $header ) < 16 ) {
+               if ( strlen( $header ) < 16 ) {
                        wfDebug( __METHOD__ . ": too short file header\n" );
                } else {
                        // @todo FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
                        extract( unpack( 'a4magic/a4form/NformLength/a4subtype', $header ) );
 
-                       if( $magic != 'AT&T' ) {
+                       if ( $magic != 'AT&T' ) {
                                wfDebug( __METHOD__ . ": not a DjVu file\n" );
-                       } elseif( $subtype == 'DJVU' ) {
+                       } elseif ( $subtype == 'DJVU' ) {
                                // Single-page document
                                $info = $this->getPageInfo( $file, $formLength );
-                       } elseif( $subtype == 'DJVM' ) {
+                       } elseif ( $subtype == 'DJVM' ) {
                                // Multi-page document
                                $info = $this->getMultiPageInfo( $file, $formLength );
-                       } else  {
+                       } else {
                                wfDebug( __METHOD__ . ": unrecognized DJVU file type '$formType'\n" );
                        }
                }
@@ -150,7 +150,7 @@ class DjVuImage {
 
        private function readChunk( $file ) {
                $header = fread( $file, 8 );
-               if( strlen( $header ) < 8 ) {
+               if ( strlen( $header ) < 8 ) {
                        return array( false, 0 );
                } else {
                        // @todo FIXME: Would be good to replace this extract() call with something that explicitly initializes local variables.
@@ -162,7 +162,7 @@ class DjVuImage {
        private function skipChunk( $file, $chunkLength ) {
                fseek( $file, $chunkLength, SEEK_CUR );
 
-               if( $chunkLength & 0x01 == 1 && !feof( $file ) ) {
+               if ( $chunkLength & 0x01 == 1 && !feof( $file ) ) {
                        // padding byte
                        fseek( $file, 1, SEEK_CUR );
                }
@@ -174,13 +174,13 @@ class DjVuImage {
                $start = ftell( $file );
                do {
                        list( $chunk, $length ) = $this->readChunk( $file );
-                       if( !$chunk ) {
+                       if ( !$chunk ) {
                                break;
                        }
 
-                       if( $chunk == 'FORM' ) {
+                       if ( $chunk == 'FORM' ) {
                                $subtype = fread( $file, 4 );
-                               if( $subtype == 'DJVU' ) {
+                               if ( $subtype == 'DJVU' ) {
                                        wfDebug( __METHOD__ . ": found first subpage\n" );
                                        return $this->getPageInfo( $file, $length );
                                }
@@ -189,7 +189,7 @@ class DjVuImage {
                                wfDebug( __METHOD__ . ": skipping '$chunk' chunk\n" );
                                $this->skipChunk( $file, $length );
                        }
-               } while( $length != 0 && !feof( $file ) && ftell( $file ) - $start < $formLength );
+               } while ( $length != 0 && !feof( $file ) && ftell( $file ) - $start < $formLength );
 
                wfDebug( __METHOD__ . ": multi-page DJVU file contained no pages\n" );
                return false;
@@ -197,17 +197,17 @@ class DjVuImage {
 
        private function getPageInfo( $file, $formLength ) {
                list( $chunk, $length ) = $this->readChunk( $file );
-               if( $chunk != 'INFO' ) {
+               if ( $chunk != 'INFO' ) {
                        wfDebug( __METHOD__ . ": expected INFO chunk, got '$chunk'\n" );
                        return false;
                }
 
-               if( $length < 9 ) {
+               if ( $length < 9 ) {
                        wfDebug( __METHOD__ . ": INFO should be 9 or 10 bytes, found $length\n" );
                        return false;
                }
                $data = fread( $file, $length );
-               if( strlen( $data ) < $length ) {
+               if ( strlen( $data ) < $length ) {
                        wfDebug( __METHOD__ . ": INFO chunk cut off\n" );
                        return false;
                }
@@ -263,7 +263,7 @@ class DjVuImage {
                        $retval = '';
                        $txt = wfShellExec( $cmd, $retval, array(), array( 'memory' => self::DJVUTXT_MEMORY_LIMIT ) );
                        wfProfileOut( 'djvutxt' );
-                       if( $retval == 0) {
+                       if ( $retval == 0 ) {
                                # Strip some control characters
                                $txt = preg_replace( "/[\013\035\037]/", "", $txt );
                                $reg = <<<EOR
@@ -280,7 +280,7 @@ EOR;
                                $txt = preg_replace_callback( $reg, array( $this, 'pageTextCallback' ), $txt );
                                $txt = "<DjVuTxt>\n<HEAD></HEAD>\n<BODY>\n" . $txt . "</BODY>\n</DjVuTxt>\n";
                                $xml = preg_replace( "/<DjVuXML>/", "<mw-djvu><DjVuXML>", $xml, 1 );
-                               $xml = $xml . $txt. '</mw-djvu>';
+                               $xml = $xml . $txt . '</mw-djvu>';
                        }
                }
                wfProfileOut( __METHOD__ );
index 52d3195..9a2794a 100644 (file)
@@ -36,6 +36,7 @@ class Exif {
        const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer.
        const LONG = 4; //!< A 32-bit (4-byte) unsigned integer.
        const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator
+       const SHORT_OR_LONG = 6; //!< A 16-bit (2-byte) or 32-bit (4-byte) unsigned integer.
        const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition
        const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation),
        const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator.
@@ -113,7 +114,7 @@ class Exif {
         */
        function __construct( $file, $byteOrder = '' ) {
                /**
-                * Page numbers here refer to pages in the EXIF 2.2 standard
+                * Page numbers here refer to pages in the Exif 2.2 standard
                 *
                 * Note, Exif::UNDEFINED is treated as a string, not as an array of bytes
                 * so don't put a count parameter for any UNDEFINED values.
@@ -124,8 +125,8 @@ class Exif {
                        # TIFF Rev. 6.0 Attribute Information (p22)
                        'IFD0' => array(
                                # Tags relating to image structure
-                               'ImageWidth' => Exif::SHORT.','.Exif::LONG,             # Image width
-                               'ImageLength' => Exif::SHORT.','.Exif::LONG,            # Image height
+                               'ImageWidth' => Exif::SHORT_OR_LONG,            # Image width
+                               'ImageLength' => Exif::SHORT_OR_LONG,           # Image height
                                'BitsPerSample' => array( Exif::SHORT, 3 ),             # Number of bits per component
                                # "When a primary image is JPEG compressed, this designation is not"
                                # "necessary and is omitted." (p23)
@@ -134,25 +135,25 @@ class Exif {
                                'Orientation' => Exif::SHORT,                           # Orientation of image #p24
                                'SamplesPerPixel' => Exif::SHORT,                       # Number of components
                                'PlanarConfiguration' => Exif::SHORT,                   # Image data arrangement #p24
-                               'YCbCrSubSampling' => array( Exif::SHORT, 2),           # Subsampling ratio of Y to C #p24
+                               'YCbCrSubSampling' => array( Exif::SHORT, 2 ),          # Subsampling ratio of Y to C #p24
                                'YCbCrPositioning' => Exif::SHORT,                      # Y and C positioning #p24-25
                                'XResolution' => Exif::RATIONAL,                        # Image resolution in width direction
                                'YResolution' => Exif::RATIONAL,                        # Image resolution in height direction
                                'ResolutionUnit' => Exif::SHORT,                        # Unit of X and Y resolution #(p26)
 
                                # Tags relating to recording offset
-                               'StripOffsets' => Exif::SHORT.','.Exif::LONG,                   # Image data location
-                               'RowsPerStrip' => Exif::SHORT.','.Exif::LONG,                   # Number of rows per strip
-                               'StripByteCounts' => Exif::SHORT.','.Exif::LONG,                # Bytes per compressed strip
-                               'JPEGInterchangeFormat' => Exif::SHORT.','.Exif::LONG,          # Offset to JPEG SOI
-                               'JPEGInterchangeFormatLength' => Exif::SHORT.','.Exif::LONG,    # Bytes of JPEG data
+                               'StripOffsets' => Exif::SHORT_OR_LONG,                  # Image data location
+                               'RowsPerStrip' => Exif::SHORT_OR_LONG,                  # Number of rows per strip
+                               'StripByteCounts' => Exif::SHORT_OR_LONG,               # Bytes per compressed strip
+                               'JPEGInterchangeFormat' => Exif::SHORT_OR_LONG,         # Offset to JPEG SOI
+                               'JPEGInterchangeFormatLength' => Exif::SHORT_OR_LONG,   # Bytes of JPEG data
 
                                # Tags relating to image data characteristics
                                'TransferFunction' => Exif::IGNORE,                     # Transfer function
-                               'WhitePoint' => array( Exif::RATIONAL, 2),              # White point chromaticity
-                               'PrimaryChromaticities' => array( Exif::RATIONAL, 6),   # Chromaticities of primarities
-                               'YCbCrCoefficients' => array( Exif::RATIONAL, 3),       # Color space transformation matrix coefficients #p27
-                               'ReferenceBlackWhite' => array( Exif::RATIONAL, 6),     # Pair of black and white reference values
+                               'WhitePoint' => array( Exif::RATIONAL, 2 ),             # White point chromaticity
+                               'PrimaryChromaticities' => array( Exif::RATIONAL, 6 ),  # Chromaticities of primarities
+                               'YCbCrCoefficients' => array( Exif::RATIONAL, 3 ),      # Color space transformation matrix coefficients #p27
+                               'ReferenceBlackWhite' => array( Exif::RATIONAL, 6 ),    # Pair of black and white reference values
 
                                # Other tags
                                'DateTime' => Exif::ASCII,                              # File change date and time
@@ -167,8 +168,8 @@ class Exif {
                        # Exif IFD Attribute Information (p30-31)
                        'EXIF' => array(
                                # TODO: NOTE: Nonexistence of this field is taken to mean nonconformance
-                               # to the EXIF 2.1 AND 2.2 standards
-                               'ExifVersion' =>  Exif::UNDEFINED,                      # Exif version
+                               # to the Exif 2.1 AND 2.2 standards
+                               'ExifVersion' => Exif::UNDEFINED,                       # Exif version
                                'FlashPixVersion' => Exif::UNDEFINED,                   # Supported Flashpix version #p32
 
                                # Tags relating to Image Data Characteristics
@@ -177,8 +178,8 @@ class Exif {
                                # Tags relating to image configuration
                                'ComponentsConfiguration' => Exif::UNDEFINED,                   # Meaning of each component #p33
                                'CompressedBitsPerPixel' => Exif::RATIONAL,                     # Image compression mode
-                               'PixelYDimension' => Exif::SHORT.','.Exif::LONG,                # Valid image width
-                               'PixelXDimension' => Exif::SHORT.','.Exif::LONG,                # Valid image height
+                               'PixelYDimension' => Exif::SHORT_OR_LONG,               # Valid image width
+                               'PixelXDimension' => Exif::SHORT_OR_LONG,               # Valid image height
 
                                # Tags relating to related user information
                                'MakerNote' => Exif::IGNORE,                            # Manufacturer notes
@@ -218,7 +219,7 @@ class Exif {
                                'FocalPlaneXResolution' => Exif::RATIONAL,              # Focal plane X resolution
                                'FocalPlaneYResolution' => Exif::RATIONAL,              # Focal plane Y resolution
                                'FocalPlaneResolutionUnit' => Exif::SHORT,              # Focal plane resolution unit #p46
-                               'SubjectLocation' => array( Exif::SHORT, 2),            # Subject location
+                               'SubjectLocation' => array( Exif::SHORT, 2 ),           # Subject location
                                'ExposureIndex' => Exif::RATIONAL,                      # Exposure index
                                'SensingMethod' => Exif::SHORT,                         # Sensing method #p46
                                'FileSource' => Exif::UNDEFINED,                        # File source #p47
@@ -250,12 +251,12 @@ class Exif {
                                'GPSLatitudeRef' => Exif::ASCII,                        # North or South Latitude #p52-53
                                'GPSLatitude' => array( Exif::RATIONAL, 3 ),            # Latitude
                                'GPSLongitudeRef' => Exif::ASCII,                       # East or West Longitude #p53
-                               'GPSLongitude' => array( Exif::RATIONAL, 3),            # Longitude
+                               'GPSLongitude' => array( Exif::RATIONAL, 3 ),           # Longitude
                                'GPSAltitudeRef' => Exif::UNDEFINED,
                                # Altitude reference. Note, the exif standard says this should be an EXIF::Byte,
                                # but php seems to disagree.
                                'GPSAltitude' => Exif::RATIONAL,                        # Altitude
-                               'GPSTimeStamp' => array( Exif::RATIONAL, 3),            # GPS time (atomic clock)
+                               'GPSTimeStamp' => array( Exif::RATIONAL, 3 ),           # GPS time (atomic clock)
                                'GPSSatellites' => Exif::ASCII,                         # Satellites used for measurement
                                'GPSStatus' => Exif::ASCII,                             # Receiver status #p54
                                'GPSMeasureMode' => Exif::ASCII,                        # Measurement mode #p54-55
@@ -296,7 +297,7 @@ class Exif {
                }
 
                $this->debugFile( $this->basename, __FUNCTION__, true );
-               if( function_exists( 'exif_read_data' ) ) {
+               if ( function_exists( 'exif_read_data' ) ) {
                        wfSuppressWarnings();
                        $data = exif_read_data( $this->file, 0, true );
                        wfRestoreWarnings();
@@ -393,7 +394,7 @@ class Exif {
                //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'] ) ) {
+               if ( isset( $this->mFilteredExifData['ComponentsConfiguration'] ) ) {
                        $val = $this->mFilteredExifData['ComponentsConfiguration'];
                        $ccVals = array();
                        for ( $i = 0; $i < strlen( $val ); $i++ ) {
@@ -410,7 +411,7 @@ class Exif {
                //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'] ) ) {
+               if ( isset( $this->mFilteredExifData['GPSVersion'] ) ) {
                        $val = $this->mFilteredExifData['GPSVersion'];
                        $newVal = '';
                        for ( $i = 0; $i < strlen( $val ); $i++ ) {
@@ -737,26 +738,27 @@ class Exif {
                $debug = "tag is '$tag'";
                $etype = $this->mExifTags[$section][$tag];
                $ecount = 1;
-               if( is_array( $etype ) ) {
+               if ( is_array( $etype ) ) {
                        list( $etype, $ecount ) = $etype;
-                       if ( $recursive )
+                       if ( $recursive ) {
                                $ecount = 1; // checking individual elements
+                       }
                }
                $count = count( $val );
-               if( $ecount != $count ) {
+               if ( $ecount != $count ) {
                        $this->debug( $val, __FUNCTION__, "Expected $ecount elements for $tag but got $count" );
                        return false;
                }
-               if( $count > 1 ) {
-                       foreach( $val as $v ) {
-                               if( !$this->validate( $section, $tag, $v, true ) ) {
+               if ( $count > 1 ) {
+                       foreach ( $val as $v ) {
+                               if ( !$this->validate( $section, $tag, $v, true ) ) {
                                        return false;
                                }
                        }
                        return true;
                }
                // Does not work if not typecast
-               switch( (string)$etype ) {
+               switch ( (string)$etype ) {
                        case (string)Exif::BYTE:
                                $this->debug( $val, __FUNCTION__, $debug );
                                return $this->isByte( $val );
@@ -772,6 +774,9 @@ class Exif {
                        case (string)Exif::RATIONAL:
                                $this->debug( $val, __FUNCTION__, $debug );
                                return $this->isRational( $val );
+                       case (string)Exif::SHORT_OR_LONG:
+                               $this->debug( $val, __FUNCTION__, $debug );
+                               return $this->isShort( $val ) || $this->isLong( $val );
                        case (string)Exif::UNDEFINED:
                                $this->debug( $val, __FUNCTION__, $debug );
                                return $this->isUndefined( $val );
@@ -781,9 +786,6 @@ class Exif {
                        case (string)Exif::SRATIONAL:
                                $this->debug( $val, __FUNCTION__, $debug );
                                return $this->isSrational( $val );
-                       case (string)Exif::SHORT.','.Exif::LONG:
-                               $this->debug( $val, __FUNCTION__, $debug );
-                               return $this->isShort( $val ) || $this->isLong( $val );
                        case (string)Exif::IGNORE:
                                $this->debug( $val, __FUNCTION__, $debug );
                                return false;
index 1671ab2..d8d0bed 100644 (file)
@@ -51,11 +51,11 @@ class ExifBitmapHandler extends BitmapHandler {
 
                // Treat Software as a special case because in can contain
                // an array of (SoftwareName, Version).
-               if (isset( $metadata['Software'] )
+               if ( isset( $metadata['Software'] )
                        && is_array( $metadata['Software'] )
-                       && is_array( $metadata['Software'][0])
+                       && is_array( $metadata['Software'][0] )
                        && isset( $metadata['Software'][0][0] )
-                       && isset( $metadata['Software'][0][1])
+                       && isset( $metadata['Software'][0][1] )
                ) {
                        $metadata['Software'] = $metadata['Software'][0][0] . ' (Version '
                                . $metadata['Software'][0][1] . ')';
@@ -84,7 +84,7 @@ class ExifBitmapHandler extends BitmapHandler {
                        return self::METADATA_GOOD;
                }
                if ( $metadata === self::OLD_BROKEN_FILE ) {
-                       # Old special value indicating that there is no EXIF data in the file.
+                       # Old special value indicating that there is no Exif data in the file.
                        # or that there was an error well extracting the metadata.
                        wfDebug( __METHOD__ . ": back-compat version\n" );
                        return self::METADATA_COMPATIBLE;
index 1a7d772..1c5136f 100644 (file)
@@ -79,7 +79,7 @@ class FormatMetadata {
                        }
 
                        //This is done differently as the tag is an array.
-                       if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3) {
+                       if ( $tag == 'GPSTimeStamp' && count( $vals ) === 3 ) {
                                //hour min sec array
 
                                $h = explode( '/', $vals[0] );
@@ -127,9 +127,9 @@ class FormatMetadata {
 
                        foreach ( $vals as &$val ) {
 
-                               switch( $tag ) {
+                               switch ( $tag ) {
                                case 'Compression':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 2: case 3: case 4:
                                        case 5: case 6: case 7: case 8:
                                        case 32773: case 32946: case 34712:
@@ -142,7 +142,7 @@ class FormatMetadata {
                                        break;
 
                                case 'PhotometricInterpretation':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 2: case 6:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -153,7 +153,7 @@ class FormatMetadata {
                                        break;
 
                                case 'Orientation':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -164,7 +164,7 @@ class FormatMetadata {
                                        break;
 
                                case 'PlanarConfiguration':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -189,7 +189,7 @@ class FormatMetadata {
 
                                case 'XResolution':
                                case 'YResolution':
-                                       switch( $resolutionunit ) {
+                                       switch ( $resolutionunit ) {
                                                case 2:
                                                        $val = self::msg( 'XYResolution', 'i', self::formatNum( $val ) );
                                                        break;
@@ -208,7 +208,7 @@ class FormatMetadata {
                                        break;
 
                                case 'ColorSpace':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 65535:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -219,7 +219,7 @@ class FormatMetadata {
                                        break;
 
                                case 'ComponentsConfiguration':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4: case 5: case 6:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -267,7 +267,7 @@ class FormatMetadata {
                                        break;
 
                                case 'ExposureProgram':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -282,7 +282,7 @@ class FormatMetadata {
                                        break;
 
                                case 'MeteringMode':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 255:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -293,7 +293,7 @@ class FormatMetadata {
                                        break;
 
                                case 'LightSource':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4: case 9: case 10: case 11:
                                        case 12: case 13: case 14: case 15: case 17: case 18: case 19: case 20:
                                        case 21: case 22: case 23: case 24: case 255:
@@ -307,11 +307,11 @@ class FormatMetadata {
 
                                case 'Flash':
                                        $flashDecode = array(
-                                               'fired'    => $val & bindec( '00000001' ),
-                                               'return'   => ( $val & bindec( '00000110' ) ) >> 1,
-                                               'mode'     => ( $val & bindec( '00011000' ) ) >> 3,
+                                               'fired' => $val & bindec( '00000001' ),
+                                               'return' => ( $val & bindec( '00000110' ) ) >> 1,
+                                               'mode' => ( $val & bindec( '00011000' ) ) >> 3,
                                                'function' => ( $val & bindec( '00100000' ) ) >> 5,
-                                               'redeye'   => ( $val & bindec( '01000000' ) ) >> 6,
+                                               'redeye' => ( $val & bindec( '01000000' ) ) >> 6,
 //                                             'reserved' => ($val & bindec( '10000000' )) >> 7,
                                        );
                                        $flashMsgs = array();
@@ -328,7 +328,7 @@ class FormatMetadata {
                                        break;
 
                                case 'FocalPlaneResolutionUnit':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -339,7 +339,7 @@ class FormatMetadata {
                                        break;
 
                                case 'SensingMethod':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1: case 2: case 3: case 4: case 5: case 7: case 8:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -350,7 +350,7 @@ class FormatMetadata {
                                        break;
 
                                case 'FileSource':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 3:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -361,7 +361,7 @@ class FormatMetadata {
                                        break;
 
                                case 'SceneType':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 1:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -372,7 +372,7 @@ class FormatMetadata {
                                        break;
 
                                case 'CustomRendered':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -383,7 +383,7 @@ class FormatMetadata {
                                        break;
 
                                case 'ExposureMode':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -394,7 +394,7 @@ class FormatMetadata {
                                        break;
 
                                case 'WhiteBalance':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -405,7 +405,7 @@ class FormatMetadata {
                                        break;
 
                                case 'SceneCaptureType':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -416,7 +416,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GainControl':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3: case 4:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -427,7 +427,7 @@ class FormatMetadata {
                                        break;
 
                                case 'Contrast':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -438,7 +438,7 @@ class FormatMetadata {
                                        break;
 
                                case 'Saturation':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -449,7 +449,7 @@ class FormatMetadata {
                                        break;
 
                                case 'Sharpness':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -460,7 +460,7 @@ class FormatMetadata {
                                        break;
 
                                case 'SubjectDistanceRange':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 0: case 1: case 2: case 3:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -473,7 +473,7 @@ class FormatMetadata {
                                //The GPS...Ref values are kept for compatibility, probably won't be reached.
                                case 'GPSLatitudeRef':
                                case 'GPSDestLatitudeRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'N': case 'S':
                                                $val = self::msg( 'GPSLatitude', $val );
                                                break;
@@ -485,7 +485,7 @@ class FormatMetadata {
 
                                case 'GPSLongitudeRef':
                                case 'GPSDestLongitudeRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'E': case 'W':
                                                $val = self::msg( 'GPSLongitude', $val );
                                                break;
@@ -504,7 +504,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GPSStatus':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'A': case 'V':
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -515,7 +515,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GPSMeasureMode':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 2: case 3:
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -528,7 +528,7 @@ class FormatMetadata {
                                case 'GPSTrackRef':
                                case 'GPSImgDirectionRef':
                                case 'GPSDestBearingRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'T': case 'M':
                                                $val = self::msg( 'GPSDirection', $val );
                                                break;
@@ -548,7 +548,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GPSSpeedRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'K': case 'M': case 'N':
                                                $val = self::msg( 'GPSSpeed', $val );
                                                break;
@@ -559,7 +559,7 @@ class FormatMetadata {
                                        break;
 
                                case 'GPSDestDistanceRef':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'K': case 'M': case 'N':
                                                $val = self::msg( 'GPSDestDistance', $val );
                                                break;
@@ -646,7 +646,7 @@ class FormatMetadata {
                                        break;
 
                                case 'iimCategory':
-                                       switch( strtolower( $val ) ) {
+                                       switch ( strtolower( $val ) ) {
                                                // See pg 29 of IPTC photo
                                                // metadata standard.
                                                case 'ace': case 'clj':
@@ -682,7 +682,7 @@ class FormatMetadata {
                                                $urgency = 'high';
                                        } elseif ( $val == 5 ) {
                                                $urgency = 'normal';
-                                       } elseif ( $val <= 8 && $val > 5) {
+                                       } elseif ( $val <= 8 && $val > 5 ) {
                                                $urgency = 'low';
                                        }
 
@@ -791,7 +791,7 @@ class FormatMetadata {
                                        }
                                        break;
                                case 'Copyrighted':
-                                       switch( $val ) {
+                                       switch ( $val ) {
                                        case 'True': case 'False':
                                                $val = self::msg( $tag, $val );
                                                break;
@@ -854,7 +854,7 @@ class FormatMetadata {
                        return $vals[0];
                }
                elseif ( count( $vals ) === 0 ) {
-                       wfDebug( __METHOD__ . ' metadata array with 0 elements!' );
+                       wfDebug( __METHOD__ . " metadata array with 0 elements!\n" );
                        return ""; // paranoia. This should never happen
                }
                /* @todo FIXME: This should hide some of the list entries if there are
@@ -863,7 +863,7 @@ class FormatMetadata {
                 */
                else {
                        global $wgContLang;
-                       switch( $type ) {
+                       switch ( $type ) {
                        case 'lang':
                                // Display default, followed by ContLang,
                                // followed by the rest in no particular
@@ -948,7 +948,7 @@ class FormatMetadata {
         * this is treated as wikitext not html).
         */
        private static function langItem( $value, $lang, $default = false, $noHtml = false ) {
-               if ( $lang === false && $default === false) {
+               if ( $lang === false && $default === false ) {
                        throw new MWException( '$lang and $default cannot both '
                                . 'be false.' );
                }
@@ -1015,8 +1015,9 @@ class FormatMetadata {
        static function msg( $tag, $val, $arg = null, $arg2 = null ) {
                global $wgContLang;
 
-               if ( $val === '' )
+               if ( $val === '' ) {
                        $val = 'value';
+               }
                return wfMessage( $wgContLang->lc( "exif-$tag-$val" ), $arg, $arg2 )->text();
        }
 
@@ -1031,9 +1032,9 @@ class FormatMetadata {
        static function formatNum( $num, $round = false ) {
                global $wgLang;
                $m = array();
-               if( is_array( $num ) ) {
+               if ( is_array( $num ) ) {
                        $out = array();
-                       foreach( $num as $number ) {
+                       foreach ( $num as $number ) {
                                $out[] = self::formatNum( $number );
                        }
                        return $wgLang->commaList( $out );
@@ -1071,7 +1072,7 @@ class FormatMetadata {
                        $numerator = intval( $m[1] );
                        $denominator = intval( $m[2] );
                        $gcd = self::gcd( abs( $numerator ), $denominator );
-                       if( $gcd != 0 ) {
+                       if ( $gcd != 0 ) {
                                // 0 shouldn't happen! ;)
                                return self::formatNum( $numerator / $gcd ) . '/' . self::formatNum( $denominator / $gcd );
                        }
@@ -1096,7 +1097,7 @@ class FormatMetadata {
                        else
                                return gcd( $b, $a % $b );
                */
-               while( $b != 0 ) {
+               while ( $b != 0 ) {
                        $remainder = $a % $b;
 
                        // tail recursion...
@@ -1124,7 +1125,7 @@ class FormatMetadata {
                        return $val;
                }
                $cat = '';
-               switch( substr( $val, 0, 2 ) ) {
+               switch ( substr( $val, 0, 2 ) ) {
                        case '01':
                                $cat = 'ace';
                                break;
@@ -1236,7 +1237,7 @@ class FormatMetadata {
         * @return String of html-ish looking wikitext
         */
        public static function collapseContactInfo( $vals ) {
-               if( !( isset( $vals['CiAdrExtadr'] )
+               if ( !( isset( $vals['CiAdrExtadr'] )
                        || isset( $vals['CiAdrCity'] )
                        || isset( $vals['CiAdrCtry'] )
                        || isset( $vals['CiEmailWork'] )
@@ -1254,7 +1255,7 @@ class FormatMetadata {
                        // because people often insert >, etc into
                        // the metadata which should not be interpreted
                        // but we still want to auto-link urls.
-                       foreach( $vals as &$val ) {
+                       foreach ( $vals as &$val ) {
                                $val = htmlspecialchars( $val );
                        }
                        return self::flattenArray( $vals );
index 2e532fe..608fb25 100644 (file)
@@ -33,7 +33,7 @@ class GIFHandler extends BitmapHandler {
        function getMetadata( $image, $filename ) {
                try {
                        $parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename );
-               } catch( Exception $e ) {
+               } catch ( Exception $e ) {
                        // Broken file?
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
                        return self::BROKEN_FILE;
@@ -86,7 +86,7 @@ class GIFHandler extends BitmapHandler {
                $ser = $image->getMetadata();
                if ( $ser ) {
                        $metadata = unserialize( $ser );
-                       if( $metadata['frameCount'] > 1 ) {
+                       if ( $metadata['frameCount'] > 1 ) {
                                return true;
                        }
                }
@@ -119,13 +119,13 @@ class GIFHandler extends BitmapHandler {
                wfRestoreWarnings();
 
                if ( !$data || !is_array( $data ) ) {
-                       wfDebug( __METHOD__ . ' invalid GIF metadata' );
+                       wfDebug( __METHOD__ . " invalid GIF metadata\n" );
                        return self::METADATA_BAD;
                }
 
                if ( !isset( $data['metadata']['_MW_GIF_VERSION'] )
                        || $data['metadata']['_MW_GIF_VERSION'] != GIFMetadataExtractor::VERSION ) {
-                       wfDebug( __METHOD__ . ' old but compatible GIF metadata' );
+                       wfDebug( __METHOD__ . " old but compatible GIF metadata\n" );
                        return self::METADATA_COMPATIBLE;
                }
                return self::METADATA_GOOD;
index 6a4e753..887afa3 100644 (file)
@@ -90,7 +90,7 @@ class GIFMetadataExtractor {
                // Skip over the GCT
                self::readGCT( $fh, $bpp );
 
-               while( !feof( $fh ) ) {
+               while ( !feof( $fh ) ) {
                        $buf = fread( $fh, 1 );
 
                        if ( $buf == self::$gif_frame_sep ) {
@@ -110,7 +110,9 @@ class GIFMetadataExtractor {
                                self::skipBlock( $fh );
                        } elseif ( $buf == self::$gif_extension_sep ) {
                                $buf = fread( $fh, 1 );
-                               if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
+                               if ( strlen( $buf ) < 1 ) {
+                                       throw new Exception( "Ran out of input" );
+                               }
                                $extension_code = unpack( 'C', $buf );
                                $extension_code = $extension_code[1];
 
@@ -121,7 +123,9 @@ class GIFMetadataExtractor {
                                        fread( $fh, 1 ); // Transparency, disposal method, user input
 
                                        $buf = fread( $fh, 2 ); // Delay, in hundredths of seconds.
-                                       if ( strlen( $buf ) < 2 ) throw new Exception( "Ran out of input" );
+                                       if ( strlen( $buf ) < 2 ) {
+                                               throw new Exception( "Ran out of input" );
+                                       }
                                        $delay = unpack( 'v', $buf );
                                        $delay = $delay[1];
                                        $duration += $delay * 0.01;
@@ -129,7 +133,9 @@ class GIFMetadataExtractor {
                                        fread( $fh, 1 ); // Transparent colour index
 
                                        $term = fread( $fh, 1 ); // Should be a terminator
-                                       if ( strlen( $term ) < 1 ) throw new Exception( "Ran out of input" );
+                                       if ( strlen( $term ) < 1 ) {
+                                               throw new Exception( "Ran out of input" );
+                                       }
                                        $term = unpack( 'C', $term );
                                        $term = $term[1];
                                        if ( $term != 0 ) {
@@ -157,7 +163,7 @@ class GIFMetadataExtractor {
 
                                        $commentCount = count( $comment );
                                        if ( $commentCount === 0
-                                               || $comment[$commentCount-1] !== $data )
+                                               || $comment[$commentCount - 1] !== $data )
                                        {
                                                // Some applications repeat the same comment on each
                                                // frame of an animated GIF image, so if this comment
@@ -168,14 +174,16 @@ class GIFMetadataExtractor {
                                        // Application extension (Netscape info about the animated gif)
                                        // or XMP (or theoretically any other type of extension block)
                                        $blockLength = fread( $fh, 1 );
-                                       if ( strlen( $blockLength ) < 1 ) throw new Exception( "Ran out of input" );
+                                       if ( strlen( $blockLength ) < 1 ) {
+                                               throw new Exception( "Ran out of input" );
+                                       }
                                        $blockLength = unpack( 'C', $blockLength );
                                        $blockLength = $blockLength[1];
                                        $data = fread( $fh, $blockLength );
 
                                        if ( $blockLength != 11 ) {
-                                               wfDebug( __METHOD__ . ' GIF application block with wrong length' );
-                                               fseek( $fh, -($blockLength + 1), SEEK_CUR );
+                                               wfDebug( __METHOD__ . " GIF application block with wrong length\n" );
+                                               fseek( $fh, -( $blockLength + 1 ), SEEK_CUR );
                                                self::skipBlock( $fh );
                                                continue;
                                        }
@@ -190,7 +198,9 @@ class GIFMetadataExtractor {
 
                                                // Unsigned little-endian integer, loop count or zero for "forever"
                                                $loopData = fread( $fh, 2 );
-                                               if ( strlen( $loopData ) < 2 ) throw new Exception( "Ran out of input" );
+                                               if ( strlen( $loopData ) < 2 ) {
+                                                       throw new Exception( "Ran out of input" );
+                                               }
                                                $loopData = unpack( 'v', $loopData );
                                                $loopCount = $loopData[1];
 
@@ -218,7 +228,7 @@ class GIFMetadataExtractor {
 
                                        } else {
                                                // unrecognized extension block
-                                               fseek( $fh, -($blockLength + 1), SEEK_CUR );
+                                               fseek( $fh, -( $blockLength + 1 ), SEEK_CUR );
                                                self::skipBlock( $fh );
                                                continue;
                                        }
@@ -228,7 +238,9 @@ class GIFMetadataExtractor {
                        } elseif ( $buf == self::$gif_term ) {
                                break;
                        } else {
-                               if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
+                               if ( strlen( $buf ) < 1 ) {
+                                       throw new Exception( "Ran out of input" );
+                               }
                                $byte = unpack( 'C', $buf );
                                $byte = $byte[1];
                                throw new Exception( "At position: " . ftell( $fh ) . ", Unknown byte " . $byte );
@@ -251,7 +263,7 @@ class GIFMetadataExtractor {
         */
        static function readGCT( $fh, $bpp ) {
                if ( $bpp > 0 ) {
-                       for( $i = 1; $i <= pow( 2, $bpp ); ++$i ) {
+                       for ( $i = 1; $i <= pow( 2, $bpp ); ++$i ) {
                                fread( $fh, 3 );
                        }
                }
@@ -263,7 +275,9 @@ class GIFMetadataExtractor {
         * @return int
         */
        static function decodeBPP( $data ) {
-               if ( strlen( $data ) < 1 ) throw new Exception( "Ran out of input" );
+               if ( strlen( $data ) < 1 ) {
+                       throw new Exception( "Ran out of input" );
+               }
                $buf = unpack( 'C', $data );
                $buf = $buf[1];
                $bpp = ( $buf & 7 ) + 1;
@@ -281,7 +295,9 @@ class GIFMetadataExtractor {
        static function skipBlock( $fh ) {
                while ( !feof( $fh ) ) {
                        $buf = fread( $fh, 1 );
-                       if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
+                       if ( strlen( $buf ) < 1 ) {
+                               throw new Exception( "Ran out of input" );
+                       }
                        $block_len = unpack( 'C', $buf );
                        $block_len = $block_len[1];
                        if ( $block_len == 0 ) {
@@ -310,7 +326,7 @@ class GIFMetadataExtractor {
                $subLength = fread( $fh, 1 );
                $blocks = 0;
 
-               while( $subLength !== "\0" ) {
+               while ( $subLength !== "\0" ) {
                        $blocks++;
                        if ( $blocks > self::MAX_SUBBLOCKS ) {
                                throw new Exception( "MAX_SUBBLOCKS exceeded (over $blocks sub-blocks)" );
index a1b3fd8..544dd21 100644 (file)
@@ -63,7 +63,7 @@ class IPTC {
                                wfDebugLog( 'iptc', "IPTC tag $tag had only whitespace as its value." );
                                continue;
                        }
-                       switch( $tag ) {
+                       switch ( $tag ) {
                                case '2#120': /*IPTC caption. mapped with exif ImageDescription*/
                                        $data['ImageDescription'] = self::convIPTC( $val, $c );
                                        break;
@@ -396,7 +396,7 @@ class IPTC {
                        return null;
                }
 
-               $tz = ( intval( substr( $time, 7, 2 ) ) *60*60 )
+               $tz = ( intval( substr( $time, 7, 2 ) ) * 60 * 60 )
                        + ( intval( substr( $time, 9, 2 ) ) * 60 );
 
                if ( substr( $time, 6, 1 ) === '-' ) {
index 419afee..8e46f2f 100644 (file)
@@ -58,7 +58,7 @@ abstract class ImageHandler extends MediaHandler {
                } elseif ( isset( $params['width'] ) ) {
                        $width = $params['width'];
                } else {
-                       throw new MWException( 'No width specified to '.__METHOD__ );
+                       throw new MWException( 'No width specified to ' . __METHOD__ );
                }
                # Removed for ProofreadPage
                #$width = intval( $width );
@@ -92,7 +92,7 @@ abstract class ImageHandler extends MediaHandler {
 
                if ( !isset( $params['page'] ) ) {
                        $params['page'] = 1;
-               } else  {
+               } else {
                        if ( $params['page'] > $image->pageCount() ) {
                                $params['page'] = $image->pageCount();
                        }
@@ -160,7 +160,7 @@ abstract class ImageHandler extends MediaHandler {
                $width = intval( $width );
 
                # Sanity check $width
-               if( $width <= 0) {
+               if ( $width <= 0 ) {
                        wfDebug( __METHOD__ . ": Invalid destination width: $width\n" );
                        return false;
                }
@@ -187,9 +187,9 @@ abstract class ImageHandler extends MediaHandler {
                if ( !$this->normaliseParams( $image, $params ) ) {
                        return false;
                }
-               $url = $script . '&' . wfArrayToCgi( $this->getScriptParams( $params ) );
+               $url = wfAppendQuery( $script, $this->getScriptParams( $params ) );
 
-               if( $image->mustRender() || $params['width'] < $image->getWidth() ) {
+               if ( $image->mustRender() || $params['width'] < $image->getWidth() ) {
                        return new ThumbnailImage( $image, $url, false, $params );
                }
        }
index 3551943..1feb378 100644 (file)
@@ -69,18 +69,18 @@ class JpegHandler extends ExifBitmapHandler {
        public function rotate( $file, $params ) {
                global $wgJpegTran;
 
-               $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360;
+               $rotation = ( $params['rotation'] + $this->getRotation( $file ) ) % 360;
 
-               if( $wgJpegTran && is_file( $wgJpegTran ) ){
+               if ( $wgJpegTran && is_file( $wgJpegTran ) ) {
                        $cmd = wfEscapeShellArg( $wgJpegTran ) .
                                " -rotate " . wfEscapeShellArg( $rotation ) .
-                               " -outfile " . wfEscapeShellArg( $params[ 'dstPath' ] ) .
-                               " " . wfEscapeShellArg( $params[ 'srcPath' ] ) .  " 2>&1";
-                               wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
-                               wfProfileIn( 'jpegtran' );
-                               $retval = 0;
-                               $err = wfShellExec( $cmd, $retval, $env );
-                               wfProfileOut( 'jpegtran' );
+                               " -outfile " . wfEscapeShellArg( $params['dstPath'] ) .
+                               " " . wfEscapeShellArg( $params['srcPath'] ) . " 2>&1";
+                       wfDebug( __METHOD__ . ": running jpgtran: $cmd\n" );
+                       wfProfileIn( 'jpegtran' );
+                       $retval = 0;
+                       $err = wfShellExec( $cmd, $retval, $env );
+                       wfProfileOut( 'jpegtran' );
                        if ( $retval !== 0 ) {
                                $this->logErrorForExternalProcess( $retval, $err, $cmd );
                                return new MediaTransformError( 'thumbnail_error', 0, 0, $err );
index 121652f..c7030eb 100644 (file)
@@ -87,7 +87,7 @@ class JpegMetadataExtractor {
                        }
 
                        $buffer = fread( $fh, 1 );
-                       while( $buffer === "\xFF" && !feof( $fh ) ) {
+                       while ( $buffer === "\xFF" && !feof( $fh ) ) {
                                // Skip through any 0xFF padding bytes.
                                $buffer = fread( $fh, 1 );
                        }
@@ -111,7 +111,7 @@ class JpegMetadataExtractor {
                                if ( $com === $oldCom ) {
                                        $segments["COM"][] = $oldCom;
                                } else {
-                                       wfDebug( __METHOD__ . ' Ignoring JPEG comment as is garbage.' );
+                                       wfDebug( __METHOD__ . " Ignoring JPEG comment as is garbage.\n" );
                                }
 
                        } elseif ( $buffer === "\xE1" ) {
@@ -140,7 +140,7 @@ class JpegMetadataExtractor {
                                        } elseif ( $byteOrderMarker === 'II' ) {
                                                $segments['byteOrder'] = 'LE';
                                        } else {
-                                               wfDebug( __METHOD__ . ' Invalid byte ordering?!' );
+                                               wfDebug( __METHOD__ . " Invalid byte ordering?!\n" );
                                        }
                                }
                        } elseif ( $buffer === "\xED" ) {
@@ -155,7 +155,9 @@ class JpegMetadataExtractor {
                        } else {
                                // segment we don't care about, so skip
                                $size = wfUnpack( "nint", fread( $fh, 2 ), 2 );
-                               if ( $size['int'] <= 2 ) throw new MWException( "invalid marker size in jpeg" );
+                               if ( $size['int'] <= 2 ) {
+                                       throw new MWException( "invalid marker size in jpeg" );
+                               }
                                fseek( $fh, $size['int'] - 2, SEEK_CUR );
                        }
 
@@ -243,7 +245,9 @@ class JpegMetadataExtractor {
                        // PHP can take issue with very large unsigned ints and make them negative.
                        // Which should never ever happen, as this has to be inside a segment
                        // which is limited to a 16 bit number.
-                       if ( $lenData['len'] < 0 ) throw new MWException( "Too big PSIR (" . $lenData['len'] . ')' );
+                       if ( $lenData['len'] < 0 ) {
+                               throw new MWException( "Too big PSIR (" . $lenData['len'] . ')' );
+                       }
 
                        $offset += 4; // 4bytes length field;
 
@@ -267,7 +271,9 @@ class JpegMetadataExtractor {
 
                        // if odd, add 1 to length to account for
                        // null pad byte.
-                       if ( $lenData['len'] % 2 == 1 ) $lenData['len']++;
+                       if ( $lenData['len'] % 2 == 1 ) {
+                               $lenData['len']++;
+                       }
                        $offset += $lenData['len'];
 
                }
index b36bfa9..b368906 100644 (file)
@@ -116,7 +116,9 @@ abstract class MediaHandler {
         * @param string $path the filename
         * @return String
         */
-       function getMetadata( $image, $path ) { return ''; }
+       function getMetadata( $image, $path ) {
+               return '';
+       }
 
        /**
         * Get metadata version.
@@ -136,7 +138,7 @@ abstract class MediaHandler {
        static function getMetadataVersion() {
                $version = Array( '2' ); // core metadata version
                wfRunHooks( 'GetMetadataVersion', Array( &$version ) );
-               return implode( ';', $version);
+               return implode( ';', $version );
        }
 
        /**
@@ -166,7 +168,9 @@ abstract class MediaHandler {
         *
         * @return string
         */
-       function getMetadataType( $image ) { return false; }
+       function getMetadataType( $image ) {
+               return false;
+       }
 
        /**
         * Check if the metadata string is valid for this handler.
@@ -255,46 +259,69 @@ abstract class MediaHandler {
         * True if the handled types can be transformed
         * @return bool
         */
-       function canRender( $file ) { return true; }
+       function canRender( $file ) {
+               return true;
+       }
+
        /**
         * True if handled types cannot be displayed directly in a browser
         * but can be rendered
         * @return bool
         */
-       function mustRender( $file ) { return false; }
+       function mustRender( $file ) {
+               return false;
+       }
+
        /**
         * True if the type has multi-page capabilities
         * @return bool
         */
-       function isMultiPage( $file ) { return false; }
+       function isMultiPage( $file ) {
+               return false;
+       }
+
        /**
         * Page count for a multi-page document, false if unsupported or unknown
         * @return bool
         */
-       function pageCount( $file ) { return false; }
+       function pageCount( $file ) {
+               return false;
+       }
+
        /**
         * The material is vectorized and thus scaling is lossless
         * @return bool
         */
-       function isVectorized( $file ) { return false; }
+       function isVectorized( $file ) {
+               return false;
+       }
+
        /**
         * The material is an image, and is animated.
         * In particular, video material need not return true.
         * @note Before 1.20, this was a method of ImageHandler only
         * @return bool
         */
-       function isAnimatedImage( $file ) { return false; }
+       function isAnimatedImage( $file ) {
+               return false;
+       }
+
        /**
         * If the material is animated, we can animate the thumbnail
         * @since 1.20
         * @return bool If material is not animated, handler may return any value.
         */
-       function canAnimateThumbnail( $file ) { return true; }
+       function canAnimateThumbnail( $file ) {
+               return true;
+       }
+
        /**
         * False if the handler is disabled for all files
         * @return bool
         */
-       function isEnabled() { return true; }
+       function isEnabled() {
+               return true;
+       }
 
        /**
         * Get an associative array of page dimensions
@@ -394,9 +421,9 @@ abstract class MediaHandler {
        function visibleMetadataFields() {
                $fields = array();
                $lines = explode( "\n", wfMessage( 'metadata-fields' )->inContentLanguage()->text() );
-               foreach( $lines as $line ) {
+               foreach ( $lines as $line ) {
                        $matches = array();
-                       if( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
+                       if ( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
                                $fields[] = $matches[1];
                        }
                }
@@ -496,7 +523,7 @@ abstract class MediaHandler {
        public static function fitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) {
                $idealWidth = $boxWidth * $maxHeight / $boxHeight;
                $roundedUp = ceil( $idealWidth );
-               if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
+               if ( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) {
                        return floor( $idealWidth );
                } else {
                        return $roundedUp;
@@ -535,9 +562,9 @@ abstract class MediaHandler {
         * @return bool True if removed, false otherwise
         */
        function removeBadFile( $dstPath, $retval = 0 ) {
-               if( file_exists( $dstPath ) ) {
+               if ( file_exists( $dstPath ) ) {
                        $thumbstat = stat( $dstPath );
-                       if( $thumbstat['size'] == 0 || $retval != 0 ) {
+                       if ( $thumbstat['size'] == 0 || $retval != 0 ) {
                                $result = unlink( $dstPath );
 
                                if ( $result ) {
index 1f95bc3..1d197b1 100644 (file)
@@ -151,7 +151,12 @@ abstract class MediaTransformOutput {
                if ( $this->isError() ) {
                        return false;
                } elseif ( $this->path === null ) {
-                       return $this->file->getLocalRefPath();
+                       return $this->file->getLocalRefPath(); // assume thumb was not scaled
+               } elseif ( FileBackend::isStoragePath( $this->path ) ) {
+                       $be = $this->file->getRepo()->getBackend();
+                       // The temp file will be process cached by FileBackend
+                       $fsFile = $be->getLocalReference( array( 'src' => $this->path ) );
+                       return $fsFile ? $fsFile->getPath() : false;
                } else {
                        return $this->path; // may return false
                }
@@ -200,7 +205,7 @@ abstract class MediaTransformOutput {
                if ( $this->page && $this->page !== 1 ) {
                        $query = 'page=' . urlencode( $this->page );
                }
-               if( $params ) {
+               if ( $params ) {
                        $query .= $query ? '&' . $params : $params;
                }
                $attribs = array(
@@ -237,7 +242,7 @@ class ThumbnailImage extends MediaTransformOutput {
                # Previous parameters:
                #   $file, $url, $width, $height, $path = false, $page = false
 
-               if( is_array( $parameters ) ) {
+               if ( is_array( $parameters ) ) {
                        $defaults = array(
                                'page' => false
                        );
@@ -296,7 +301,7 @@ class ThumbnailImage extends MediaTransformOutput {
         */
        function toHtml( $options = array() ) {
                if ( count( func_get_args() ) == 2 ) {
-                       throw new MWException( __METHOD__ .' called in the old style' );
+                       throw new MWException( __METHOD__ . ' called in the old style' );
                }
 
                $alt = empty( $options['alt'] ) ? '' : $options['alt'];
index b8a5b40..98f1386 100644 (file)
@@ -38,7 +38,7 @@ class PNGHandler extends BitmapHandler {
        function getMetadata( $image, $filename ) {
                try {
                        $metadata = BitmapMetadataHandler::PNG( $filename );
-               } catch( Exception $e ) {
+               } catch ( Exception $e ) {
                        // Broken file?
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
                        return self::BROKEN_FILE;
@@ -76,7 +76,9 @@ class PNGHandler extends BitmapHandler {
                $ser = $image->getMetadata();
                if ( $ser ) {
                        $metadata = unserialize( $ser );
-                       if( $metadata['frameCount'] > 1 ) return true;
+                       if ( $metadata['frameCount'] > 1 ) {
+                               return true;
+                       }
                }
                return false;
        }
@@ -105,13 +107,13 @@ class PNGHandler extends BitmapHandler {
                wfRestoreWarnings();
 
                if ( !$data || !is_array( $data ) ) {
-                       wfDebug( __METHOD__ . ' invalid png metadata' );
+                       wfDebug( __METHOD__ . " invalid png metadata\n" );
                        return self::METADATA_BAD;
                }
 
                if ( !isset( $data['metadata']['_MW_PNG_VERSION'] )
                        || $data['metadata']['_MW_PNG_VERSION'] != PNGMetadataExtractor::VERSION ) {
-                       wfDebug( __METHOD__ . ' old but compatible png metadata' );
+                       wfDebug( __METHOD__ . " old but compatible png metadata\n" );
                        return self::METADATA_COMPATIBLE;
                }
                return self::METADATA_GOOD;
@@ -129,8 +131,9 @@ class PNGHandler extends BitmapHandler {
                $metadata = unserialize( $image->getMetadata() );
                wfRestoreWarnings();
 
-               if( !$metadata || $metadata['frameCount'] <= 0 )
+               if ( !$metadata || $metadata['frameCount'] <= 0 ) {
                        return $original;
+               }
 
                $info = array();
                $info[] = $original;
index 87f705c..34e5fa7 100644 (file)
@@ -142,7 +142,7 @@ class PNGMetadataExtractor {
                                }
                        } elseif ( $chunk_type == "acTL" ) {
                                $buf = fread( $fh, $chunk_size );
-                               if( !$buf || strlen( $buf ) < $chunk_size || $chunk_size < 4 ) {
+                               if ( !$buf || strlen( $buf ) < $chunk_size || $chunk_size < 4 ) {
                                        throw new Exception( __METHOD__ . ": Read error" );
                                }
 
@@ -202,21 +202,21 @@ class PNGMetadataExtractor {
 
                                                        if ( $items[5] === false ) {
                                                                // decompression failed
-                                                               wfDebug( __METHOD__ . ' Error decompressing iTxt chunk - ' . $items[1] );
+                                                               wfDebug( __METHOD__ . ' Error decompressing iTxt chunk - ' . $items[1] . "\n");
                                                                fseek( $fh, self::$CRC_size, SEEK_CUR );
                                                                continue;
                                                        }
 
                                                } else {
                                                        wfDebug( __METHOD__ . ' Skipping compressed png iTXt chunk due to lack of zlib,'
-                                                               . ' or potentially invalid compression method' );
+                                                               . " or potentially invalid compression method\n" );
                                                        fseek( $fh, self::$CRC_size, SEEK_CUR );
                                                        continue;
                                                }
                                        }
-                                       $finalKeyword = self::$text_chunks[ $items[1] ];
-                                       $text[ $finalKeyword ][ $items[3] ] = $items[5];
-                                       $text[ $finalKeyword ]['_type'] = 'lang';
+                                       $finalKeyword = self::$text_chunks[$items[1]];
+                                       $text[$finalKeyword][$items[3]] = $items[5];
+                                       $text[$finalKeyword]['_type'] = 'lang';
 
                                } else {
                                        // Error reading iTXt chunk
@@ -251,9 +251,9 @@ class PNGMetadataExtractor {
                                        throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
                                }
 
-                               $finalKeyword = self::$text_chunks[ $keyword ];
-                               $text[ $finalKeyword ][ 'x-default' ] = $content;
-                               $text[ $finalKeyword ]['_type'] = 'lang';
+                               $finalKeyword = self::$text_chunks[$keyword];
+                               $text[$finalKeyword]['x-default'] = $content;
+                               $text[$finalKeyword]['_type'] = 'lang';
 
                        } elseif ( $chunk_type == 'zTXt' ) {
                                if ( function_exists( 'gzuncompress' ) ) {
@@ -279,7 +279,7 @@ class PNGMetadataExtractor {
                                        $compression = substr( $postKeyword, 0, 1 );
                                        $content = substr( $postKeyword, 1 );
                                        if ( $compression !== "\x00" ) {
-                                               wfDebug( __METHOD__ . " Unrecognized compression method in zTXt ($keyword). Skipping." );
+                                               wfDebug( __METHOD__ . " Unrecognized compression method in zTXt ($keyword). Skipping.\n" );
                                                fseek( $fh, self::$CRC_size, SEEK_CUR );
                                                continue;
                                        }
@@ -290,7 +290,7 @@ class PNGMetadataExtractor {
 
                                        if ( $content === false ) {
                                                // decompression failed
-                                               wfDebug( __METHOD__ . ' Error decompressing zTXt chunk - ' . $keyword );
+                                               wfDebug( __METHOD__ . ' Error decompressing zTXt chunk - ' . $keyword . "\n");
                                                fseek( $fh, self::$CRC_size, SEEK_CUR );
                                                continue;
                                        }
@@ -303,12 +303,12 @@ class PNGMetadataExtractor {
                                                throw new Exception( __METHOD__ . ": Read error (error with iconv)" );
                                        }
 
-                                       $finalKeyword = self::$text_chunks[ $keyword ];
-                                       $text[ $finalKeyword ][ 'x-default' ] = $content;
-                                       $text[ $finalKeyword ]['_type'] = 'lang';
+                                       $finalKeyword = self::$text_chunks[$keyword];
+                                       $text[$finalKeyword]['x-default'] = $content;
+                                       $text[$finalKeyword]['_type'] = 'lang';
 
                                } else {
-                                       wfDebug( __METHOD__ . " Cannot decompress zTXt chunk due to lack of zlib. Skipping." );
+                                       wfDebug( __METHOD__ . " Cannot decompress zTXt chunk due to lack of zlib. Skipping.\n" );
                                        fseek( $fh, $chunk_size, SEEK_CUR );
                                }
                        } elseif ( $chunk_type == 'tIME' ) {
index cddab51..a133f6f 100644 (file)
@@ -56,7 +56,7 @@ class SvgHandler extends ImageHandler {
                $metadata = $file->getMetadata();
                if ( $metadata ) {
                        $metadata = $this->unpackMetadata( $metadata );
-                       if( isset( $metadata['animated'] ) ) {
+                       if ( isset( $metadata['animated'] ) ) {
                                return $metadata['animated'];
                        }
                }
@@ -263,11 +263,11 @@ class SvgHandler extends ImageHandler {
                $metadata = array( 'version' => self::SVG_METADATA_VERSION );
                try {
                        $metadata += SVGMetadataExtractor::getMetadata( $filename );
-               } catch( MWException $e ) { // @TODO: SVG specific exceptions
+               } catch ( MWException $e ) { // @todo SVG specific exceptions
                        // File not found, broken, etc.
                        $metadata['error'] = array(
                                'message' => $e->getMessage(),
-                               'code'    => $e->getCode()
+                               'code' => $e->getCode()
                        );
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
                }
index e07fd86..2e33bb9 100644 (file)
@@ -78,7 +78,12 @@ class SVGReader {
                // Expand entities, since Adobe Illustrator uses them for xmlns
                // attributes (bug 31719). Note that libxml2 has some protection
                // against large recursive entity expansions so this is not as
-               // insecure as it might appear to be.
+               // insecure as it might appear to be. However, it is still extremely
+               // insecure. It's necessary to wrap any read() calls with
+               // libxml_disable_entity_loader() to avoid arbitrary local file
+               // inclusion, or even arbitrary code execution if the expect
+               // extension is installed (bug 46859).
+               $oldDisable = libxml_disable_entity_loader( true );
                $this->reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
 
                $this->metadata['width'] = self::DEFAULT_WIDTH;
@@ -96,13 +101,15 @@ class SVGReader {
                wfSuppressWarnings();
                try {
                        $this->read();
-               } catch( Exception $e ) {
+               } catch ( Exception $e ) {
                        // Note, if this happens, the width/height will be taken to be 0x0.
                        // Should we consider it the default 512x512 instead?
                        wfRestoreWarnings();
+                       libxml_disable_entity_loader( $oldDisable );
                        throw $e;
                }
                wfRestoreWarnings();
+               libxml_disable_entity_loader( $oldDisable );
        }
 
        /**
@@ -117,16 +124,16 @@ class SVGReader {
         * @throws MWException
         * @return bool
         */
-       public function read() {
+       protected function read() {
                $keepReading = $this->reader->read();
 
                /* Skip until first element */
-               while( $keepReading && $this->reader->nodeType != XmlReader::ELEMENT ) {
+               while ( $keepReading && $this->reader->nodeType != XmlReader::ELEMENT ) {
                        $keepReading = $this->reader->read();
                }
 
                if ( $this->reader->localName != 'svg' || $this->reader->namespaceURI != self::NS_SVG ) {
-                       throw new MWException( "Expected <svg> tag, got ".
+                       throw new MWException( "Expected <svg> tag, got " .
                                $this->reader->localName . " in NS " . $this->reader->namespaceURI );
                }
                $this->debug( "<svg> tag is correct." );
@@ -137,7 +144,7 @@ class SVGReader {
                while ( $keepReading ) {
                        $tag = $this->reader->localName;
                        $type = $this->reader->nodeType;
-                       $isSVG = ($this->reader->namespaceURI == self::NS_SVG);
+                       $isSVG = ( $this->reader->namespaceURI == self::NS_SVG );
 
                        $this->debug( "$tag" );
 
@@ -178,16 +185,16 @@ class SVGReader {
         * @param string $name of the element that we are reading from
         * @param string $metafield that we will fill with the result
         */
-       private function readField( $name, $metafield=null ) {
-               $this->debug ( "Read field $metafield" );
-               if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+       private function readField( $name, $metafield = null ) {
+               $this->debug( "Read field $metafield" );
+               if ( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
                        return;
                }
                $keepReading = $this->reader->read();
-               while( $keepReading ) {
-                       if( $this->reader->localName == $name && $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
+               while ( $keepReading ) {
+                       if ( $this->reader->localName == $name && $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
                                break;
-                       } elseif( $this->reader->nodeType == XmlReader::TEXT ) {
+                       } elseif ( $this->reader->nodeType == XmlReader::TEXT ) {
                                $this->metadata[$metafield] = trim( $this->reader->value );
                        }
                        $keepReading = $this->reader->read();
@@ -200,13 +207,13 @@ class SVGReader {
         * @param string $metafield that we will fill with the result
         * @throws MWException
         */
-       private function readXml( $metafield=null ) {
-               $this->debug ( "Read top level metadata" );
-               if( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
+       private function readXml( $metafield = null ) {
+               $this->debug( "Read top level metadata" );
+               if ( !$metafield || $this->reader->nodeType != XmlReader::ELEMENT ) {
                        return;
                }
                // TODO: find and store type of xml snippet. metadata['metadataType'] = "rdf"
-               if( method_exists( $this->reader, 'readInnerXML' ) ) {
+               if ( method_exists( $this->reader, 'readInnerXML' ) ) {
                        $this->metadata[$metafield] = trim( $this->reader->readInnerXML() );
                } else {
                        throw new MWException( "The PHP XMLReader extension does not come with readInnerXML() method. Your libxml is probably out of date (need 2.6.20 or later)." );
@@ -220,8 +227,8 @@ class SVGReader {
         * @param string $name of the element that we are reading from
         */
        private function animateFilter( $name ) {
-               $this->debug ( "animate filter for tag $name" );
-               if( $this->reader->nodeType != XmlReader::ELEMENT ) {
+               $this->debug( "animate filter for tag $name" );
+               if ( $this->reader->nodeType != XmlReader::ELEMENT ) {
                        return;
                }
                if ( $this->reader->isEmptyElement ) {
@@ -229,12 +236,12 @@ class SVGReader {
                }
                $exitDepth = $this->reader->depth;
                $keepReading = $this->reader->read();
-               while( $keepReading ) {
-                       if( $this->reader->localName == $name && $this->reader->depth <= $exitDepth
+               while ( $keepReading ) {
+                       if ( $this->reader->localName == $name && $this->reader->depth <= $exitDepth
                                && $this->reader->nodeType == XmlReader::END_ELEMENT ) {
                                break;
                        } elseif ( $this->reader->namespaceURI == self::NS_SVG && $this->reader->nodeType == XmlReader::ELEMENT ) {
-                               switch( $this->reader->localName ) {
+                               switch ( $this->reader->localName ) {
                                        case 'script':
                                                // Normally we disallow files with
                                                // <script>, but its possible
@@ -260,7 +267,7 @@ class SVGReader {
        }
 
        private function debug( $data ) {
-               if( $this->mDebug ) {
+               if ( $this->mDebug ) {
                        wfDebug( "SVGReader: $data\n" );
                }
        }
@@ -285,37 +292,37 @@ class SVGReader {
                $width = null;
                $height = null;
 
-               if( $this->reader->getAttribute( 'viewBox' ) ) {
+               if ( $this->reader->getAttribute( 'viewBox' ) ) {
                        // min-x min-y width height
                        $viewBox = preg_split( '/\s+/', trim( $this->reader->getAttribute( 'viewBox' ) ) );
-                       if( count( $viewBox ) == 4 ) {
+                       if ( count( $viewBox ) == 4 ) {
                                $viewWidth = $this->scaleSVGUnit( $viewBox[2] );
                                $viewHeight = $this->scaleSVGUnit( $viewBox[3] );
-                               if( $viewWidth > 0 && $viewHeight > 0 ) {
+                               if ( $viewWidth > 0 && $viewHeight > 0 ) {
                                        $aspect = $viewWidth / $viewHeight;
                                        $defaultHeight = $defaultWidth / $aspect;
                                }
                        }
                }
-               if( $this->reader->getAttribute( 'width' ) ) {
+               if ( $this->reader->getAttribute( 'width' ) ) {
                        $width = $this->scaleSVGUnit( $this->reader->getAttribute( 'width' ), $defaultWidth );
                        $this->metadata['originalWidth'] = $this->reader->getAttribute( 'width' );
                }
-               if( $this->reader->getAttribute( 'height' ) ) {
+               if ( $this->reader->getAttribute( 'height' ) ) {
                        $height = $this->scaleSVGUnit( $this->reader->getAttribute( 'height' ), $defaultHeight );
                        $this->metadata['originalHeight'] = $this->reader->getAttribute( 'height' );
                }
 
-               if( !isset( $width ) && !isset( $height ) ) {
+               if ( !isset( $width ) && !isset( $height ) ) {
                        $width = $defaultWidth;
                        $height = $width / $aspect;
-               } elseif( isset( $width ) && !isset( $height ) ) {
+               } elseif ( isset( $width ) && !isset( $height ) ) {
                        $height = $width / $aspect;
-               } elseif( isset( $height ) && !isset( $width ) ) {
+               } elseif ( isset( $height ) && !isset( $width ) ) {
                        $width = $height * $aspect;
                }
 
-               if( $width > 0 && $height > 0 ) {
+               if ( $width > 0 && $height > 0 ) {
                        $this->metadata['width'] = intval( round( $width ) );
                        $this->metadata['height'] = intval( round( $height ) );
                }
@@ -339,13 +346,13 @@ class SVGReader {
                        'in' => 90.0,
                        'em' => 16.0, // fake it?
                        'ex' => 12.0, // fake it?
-                       ''   => 1.0, // "User units" pixels by default
+                       '' => 1.0, // "User units" pixels by default
                        );
                $matches = array();
-               if( preg_match( '/^\s*(\d+(?:\.\d+)?)(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/', $length, $matches ) ) {
+               if ( preg_match( '/^\s*(\d+(?:\.\d+)?)(em|ex|px|pt|pc|cm|mm|in|%|)\s*$/', $length, $matches ) ) {
                        $length = floatval( $matches[1] );
                        $unit = $matches[2];
-                       if( $unit == '%' ) {
+                       if ( $unit == '%' ) {
                                return $length * 0.01 * $viewportSize;
                        } else {
                                return $length * $unitLength[$unit];
index 0042208..55acb12 100644 (file)
@@ -43,7 +43,7 @@ class TiffHandler extends ExifBitmapHandler {
        function canRender( $file ) {
                global $wgTiffThumbnailType;
                return (bool)$wgTiffThumbnailType
-                       || ($file->getRepo() instanceof ForeignAPIRepo);
+                       || $file->getRepo() instanceof ForeignAPIRepo;
        }
 
        /**
index ba38d15..e77d384 100644 (file)
@@ -78,7 +78,7 @@ class XCFHandler extends BitmapHandler {
        static function getXCFMetaData( $filename ) {
                # Decode master structure
                $f = fopen( $filename, 'rb' );
-               if( !$f ) {
+               if ( !$f ) {
                        return false;
                }
                # The image structure always starts at offset 0 in the XCF file.
@@ -110,12 +110,12 @@ class XCFHandler extends BitmapHandler {
                                . "/Nbase_type" # /
                        , $binaryHeader
                        );
-               } catch( MWException $mwe ) {
+               } catch ( MWException $mwe ) {
                        return false;
                }
 
                # Check values
-               if( $header['magic'] !== 'gimp xcf' ) {
+               if ( $header['magic'] !== 'gimp xcf' ) {
                        wfDebug( __METHOD__ . " '$filename' has invalid magic signature.\n" );
                        return false;
                }
index d9cca3f..7eb3d19 100644 (file)
@@ -180,12 +180,12 @@ class XMPReader {
                ) {
                        // the is_array is just paranoia. It should always
                        // be an array.
-                       foreach( $data['xmp-special']['LocationShown'] as $loc ) {
+                       foreach ( $data['xmp-special']['LocationShown'] as $loc ) {
                                if ( !is_array( $loc ) ) {
                                        // To avoid copying over the _type meta-fields.
                                        continue;
                                }
-                               foreach( $loc as $field => $val ) {
+                               foreach ( $loc as $field => $val ) {
                                        $data['xmp-general'][$field . 'Dest'][] = $val;
                                }
                        }
@@ -195,12 +195,12 @@ class XMPReader {
                ) {
                        // the is_array is just paranoia. It should always
                        // be an array.
-                       foreach( $data['xmp-special']['LocationCreated'] as $loc ) {
+                       foreach ( $data['xmp-special']['LocationCreated'] as $loc ) {
                                if ( !is_array( $loc ) ) {
                                        // To avoid copying over the _type meta-fields.
                                        continue;
                                }
-                               foreach( $loc as $field => $val ) {
+                               foreach ( $loc as $field => $val ) {
                                        $data['xmp-general'][$field . 'Created'][] = $val;
                                }
                        }
@@ -391,7 +391,9 @@ class XMPReader {
                        throw new MWException( 'Unexpected character data before first rdf:Description element' );
                }
 
-               if ( $this->mode[0] === self::MODE_IGNORE ) return;
+               if ( $this->mode[0] === self::MODE_IGNORE ) {
+                       return;
+               }
 
                if ( $this->mode[0] !== self::MODE_SIMPLE
                        && $this->mode[0] !== self::MODE_QDESC
@@ -639,7 +641,7 @@ class XMPReader {
                        throw new MWException( "Hit end element </$elm> but no curItem" );
                }
 
-               switch( $this->mode[0] ) {
+               switch ( $this->mode[0] ) {
                        case self::MODE_IGNORE:
                                $this->endElementModeIgnore( $elm );
                                break;
@@ -993,15 +995,15 @@ class XMPReader {
                if ( $elm !== self::NS_RDF . ' li' ) {
                        throw new MWException( __METHOD__ . " <rdf:li> expected but got $elm." );
                }
-               if ( !isset( $attribs[ self::NS_XML . ' lang'] )
-                       || !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[ self::NS_XML . ' lang' ] ) )
+               if ( !isset( $attribs[self::NS_XML . ' lang'] )
+                       || !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[self::NS_XML . ' lang'] ) )
                {
                        throw new MWException( __METHOD__
                                . " <rdf:li> did not contain, or has invalid xml:lang attribute in lang alternative" );
                }
 
                // Lang is case-insensitive.
-               $this->itemLang = strtolower( $attribs[ self::NS_XML . ' lang' ] );
+               $this->itemLang = strtolower( $attribs[self::NS_XML . ' lang'] );
 
                // need to add curItem[0] on again since one is for the specific item
                // and one is for the entire group.
@@ -1058,7 +1060,7 @@ class XMPReader {
                                . "encountered <$elm> with no mode" );
                }
 
-               switch( $this->mode[0] ) {
+               switch ( $this->mode[0] ) {
                        case self::MODE_IGNORE:
                                $this->startElementModeIgnore( $elm );
                                break;
index 3b64fd3..f0b2cb5 100644 (file)
@@ -32,7 +32,7 @@ class XMPInfo {
         * @return Array XMP item configuration array.
         */
        public static function getItems() {
-               if( !self::$ranHooks ) {
+               if ( !self::$ranHooks ) {
                        // This is for if someone makes a custom metadata extension.
                        // For example, a medical wiki might want to decode DICOM xmp properties.
                        wfRunHooks( 'XMPGetInfo', Array( &self::$items ) );
@@ -428,7 +428,7 @@ class XMPInfo {
                                'mode'      => XMPReader::MODE_SIMPLE,
                                'validate'  => 'validateClosed',
                                /* can't use a range, as it skips... */
-                               'choices'   =>  array( '0' => true, '1' => true,
+                               'choices'   => array( '0' => true, '1' => true,
                                        '2' => true, '3' => true, '4' => true,
                                        '9' => true, '10' => true, '11' => true,
                                        '12' => true, '13' => true,
index b7b35dc..3e29c12 100644 (file)
@@ -214,7 +214,7 @@ class XMPValidate {
                        // this only validates standalone properties, not arrays, etc
                        return;
                }
-               if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val) ) {
+               if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val ) ) {
                        //this is a rather naive check.
                        wfDebugLog( 'XMP', __METHOD__ . " Expected Lang code but got $val" );
                        $val = null;
@@ -346,8 +346,8 @@ class XMPValidate {
                        $val, $m )
                ) {
                        $coord = intval( $m[1] );
-                       $coord += intval( $m[2] ) * (1/60);
-                       $coord += intval( $m[3] ) * (1/3600);
+                       $coord += intval( $m[2] ) * ( 1 / 60 );
+                       $coord += intval( $m[3] ) * ( 1 / 3600 );
                        if ( $m[4] === 'S' || $m[4] === 'W' ) {
                                $coord = -$coord;
                        }
@@ -358,7 +358,7 @@ class XMPValidate {
                        $val, $m )
                ) {
                        $coord = intval( $m[1] );
-                       $coord += floatval( $m[2] ) * (1/60);
+                       $coord += floatval( $m[2] ) * ( 1 / 60 );
                        if ( $m[3] === 'S' || $m[3] === 'W' ) {
                                $coord = -$coord;
                        }
index a17aa7d..993642e 100644 (file)
@@ -48,12 +48,12 @@ grains of salt.
 
 There's an experimental PHP extension module which wraps the ICU library's
 normalization functions. This is *MUCH* faster than doing this work in pure
-PHP code. This is in the 'normal' directory in MediaWiki's CVS extensions
-module. It is known to work with PHP 4.3.8 and 5.0.2 on Linux/x86 but hasn't
-been thoroughly tested on other configurations.
+PHP code. This is at https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/normal.git;a=summary.
+It is used by the WMF, which currently runs PHP 5.3.10 on Linux.  It hasn't been
+thoroughly tested on other configurations, but may work.
 
 If the php_normal.so module is loaded in php.ini, the normalization functions
 will automatically use it. If you can't (or don't want to) load it in php.ini,
-you may be able to load it using the dl() function before include()ing or
-require()ing UtfNormal.php, and it will be picked up.
+you may be able to load it using the dl() function before the inclusion of
+UtfNormal.php, and it will be picked up.
 
index 9dc1c86..0602986 100644 (file)
@@ -31,10 +31,10 @@ if( PHP_SAPI != 'cli' ) {
 }
 
 /** */
-require_once( 'UtfNormal.php' );
-require_once( '../diff/DifferenceEngine.php' );
+require_once 'UtfNormal.php';
+require_once '../diff/DifferenceEngine.php';
 
-dl('php_utfnormal.so' );
+dl( 'php_utfnormal.so' );
 
 # mt_srand( 99999 );
 
index 77ddb79..5a091af 100644 (file)
@@ -190,7 +190,7 @@ class UtfNormal {
         */
        static function loadData() {
                if( !isset( self::$utfCombiningClass ) ) {
-                       require_once( __DIR__ . '/UtfNormalData.inc' );
+                       require_once __DIR__ . '/UtfNormalData.inc';
                }
        }
 
@@ -491,7 +491,7 @@ class UtfNormal {
         */
        static function NFKD( $string ) {
                if( !isset( self::$utfCompatibilityDecomp ) ) {
-                       require_once( 'UtfNormalDataK.inc' );
+                       require_once 'UtfNormalDataK.inc';
                }
                return self::fastCombiningSort(
                        self::fastDecompose( $string, self::$utfCompatibilityDecomp ) );
index 661e53f..5118366 100644 (file)
@@ -34,9 +34,7 @@ $verbose = true;
 
 if( defined( 'PRETTY_UTF8' ) ) {
        function pretty( $string ) {
-               return preg_replace( '/([\x00-\xff])/e',
-                       'sprintf("%02X", ord("$1"))',
-                       $string );
+               return strtoupper( bin2hex( $string ) );
        }
 } else {
        /**
@@ -44,9 +42,7 @@ if( defined( 'PRETTY_UTF8' ) ) {
         * @return string
         */
        function pretty( $string ) {
-               return trim( preg_replace( '/(.)/use',
-                       'sprintf("%04X ", utf8ToCodepoint("$1"))',
-                       $string ) );
+               return strtoupper( utf8ToHexSequence( $string ) );
        }
 }
 
index 2266696..750c009 100644 (file)
@@ -65,7 +65,7 @@ $f = fopen($file, "r");
      later and slow down the runtime.
  */
 
-require_once("./UtfNormal.php");
+require_once './UtfNormal.php';
 function normalize_form_c($c)      { return UtfNormal::toNFC($c);  }
 function normalize_form_d($c)      { return UtfNormal::toNFD($c);  }
 function normalize_form_kc($c)     { return UtfNormal::toNFKC($c); }
index 9b96a07..e8fec93 100644 (file)
@@ -76,9 +76,11 @@ function hexSequenceToUtf8( $sequence ) {
  * @private
  */
 function utf8ToHexSequence( $str ) {
-       return rtrim( preg_replace( '/(.)/uSe',
-                                   'sprintf("%04x ", utf8ToCodepoint("$1"))',
-                                   $str ) );
+       $buf = '';
+       foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
+               $buf .= sprintf( '%04x ', utf8ToCodepoint( $cp ) );
+       }
+       return rtrim( $buf );
 }
 
 /**
index dd74467..857943e 100644 (file)
@@ -170,12 +170,12 @@ abstract class BagOStuff {
         */
        public function lock( $key, $timeout = 60 ) {
                $timestamp = microtime( true ); // starting UNIX timestamp
-               if ( $this->add( "{$key}:lock", $timeout ) ) {
+               if ( $this->add( "{$key}:lock", 1, $timeout ) ) {
                        return true;
                }
 
                $uRTT = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
-               $sleep = 2*$uRTT; // rough time to do get()+set()
+               $sleep = 2 * $uRTT; // rough time to do get()+set()
 
                $locked = false; // lock acquired
                $attempts = 0; // failed attempts
@@ -186,8 +186,8 @@ abstract class BagOStuff {
                                $sleep *= 2;
                        }
                        usleep( $sleep ); // back off
-                       $locked = $this->add( "{$key}:lock", $timeout );
-               } while( !$locked );
+                       $locked = $this->add( "{$key}:lock", 1, $timeout );
+               } while ( !$locked );
 
                return $locked;
        }
index 3f1fa3a..f1644ed 100644 (file)
@@ -43,7 +43,7 @@ class MemcachedBagOStuff extends BagOStuff {
                if ( !isset( $params['persistent'] ) ) {
                        $params['persistent'] = $GLOBALS['wgMemCachedPersistent'];
                }
-               if  ( !isset( $params['compress_threshold'] ) ) {
+               if ( !isset( $params['compress_threshold'] ) ) {
                        $params['compress_threshold'] = 1500;
                }
                if ( !isset( $params['timeout'] ) ) {
index 0d96ed6..e5f60b5 100644 (file)
@@ -55,9 +55,9 @@
  *              'compress_threshold' => 10240,
  *              'persistent' => true));
  *
- * $mc->add('key', array('some', 'array'));
- * $mc->replace('key', 'some random string');
- * $val = $mc->get('key');
+ * $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
@@ -329,7 +329,7 @@ class MWMemcached {
                        $this->stats['delete'] = 1;
                }
                $cmd = "delete $key $time\r\n";
-               if( !$this->_fwrite( $sock, $cmd ) ) {
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
                        return false;
                }
                $res = $this->_fgets( $sock );
@@ -489,17 +489,17 @@ class MWMemcached {
                        }
                        $key = is_array( $key ) ? $key[1] : $key;
                        if ( !isset( $sock_keys[$sock] ) ) {
-                               $sock_keys[ intval( $sock ) ] = array();
+                               $sock_keys[intval( $sock )] = array();
                                $socks[] = $sock;
                        }
-                       $sock_keys[ intval( $sock ) ][] = $key;
+                       $sock_keys[intval( $sock )][] = $key;
                }
 
                $gather = array();
                // Send out the requests
                foreach ( $socks as $sock ) {
                        $cmd = 'gets';
-                       foreach ( $sock_keys[ intval( $sock ) ] as $key ) {
+                       foreach ( $sock_keys[intval( $sock )] as $key ) {
                                $cmd .= ' ' . $key;
                        }
                        $cmd .= "\r\n";
@@ -733,7 +733,7 @@ class MWMemcached {
                $sock = false;
                $timeout = $this->_connect_timeout;
                $errno = $errstr = null;
-               for( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
+               for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
                        wfSuppressWarnings();
                        if ( $this->_persistent == 1 ) {
                                $sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
@@ -810,7 +810,7 @@ class MWMemcached {
                        $bu = array();
                        foreach ( $this->_servers as $v ) {
                                if ( is_array( $v ) ) {
-                                       for( $i = 0; $i < $v[1]; $i++ ) {
+                                       for ( $i = 0; $i < $v[1]; $i++ ) {
                                                $bu[] = $v[0];
                                        }
                                } else {
@@ -822,7 +822,7 @@ class MWMemcached {
                }
 
                $realkey = is_array( $key ) ? $key[1] : $key;
-               for( $tries = 0; $tries < 20; $tries++ ) {
+               for ( $tries = 0; $tries < 20; $tries++ ) {
                        $host = $this->_buckets[$hv % $this->_bucketcount];
                        $sock = $this->sock_to_host( $host );
                        if ( is_resource( $sock ) ) {
@@ -912,7 +912,7 @@ class MWMemcached {
                while ( 1 ) {
                        $decl = $this->_fgets( $sock );
 
-                       if( $decl === false ) {
+                       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.
@@ -1123,7 +1123,7 @@ class MWMemcached {
        function _fwrite( $sock, $buf ) {
                $bytesWritten = 0;
                $bufSize = strlen( $buf );
-               while ( $bytesWritten < $bufSize  ) {
+               while ( $bytesWritten < $bufSize ) {
                        $result = fwrite( $sock, $buf );
                        $data = stream_get_meta_data( $sock );
                        if ( $data['timed_out'] ) {
index 3192429..748c423 100644 (file)
@@ -87,13 +87,13 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                                break;
                        case 'igbinary':
                                if ( !Memcached::HAVE_IGBINARY ) {
-                                       throw new MWException( __CLASS__.': the igbinary extension is not available ' .
+                                       throw new MWException( __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 MWException( __CLASS__ . ': invalid value for serializer parameter' );
                }
                $servers = array();
                foreach ( $params['servers'] as $host ) {
index 92afaac..e550c0d 100644 (file)
@@ -43,7 +43,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         */
        public function __construct( $params ) {
                if ( !isset( $params['caches'] ) ) {
-                       throw new MWException( __METHOD__.': the caches parameter is required' );
+                       throw new MWException( __METHOD__ . ': the caches parameter is required' );
                }
 
                $this->caches = array();
index eafa836..f7247f9 100644 (file)
@@ -125,9 +125,9 @@ class ObjectCache {
        static function newAccelerator( $params ) {
                if ( function_exists( 'apc_fetch' ) ) {
                        $id = 'apc';
-               } elseif( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
+               } elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
                        $id = 'xcache';
-               } elseif( function_exists( 'wincache_ucache_get' ) ) {
+               } elseif ( function_exists( 'wincache_ucache_get' ) ) {
                        $id = 'wincache';
                } else {
                        throw new MWException( "CACHE_ACCEL requested but no suitable object " .
index bc76294..7cf960e 100644 (file)
@@ -94,7 +94,7 @@ class ObjectCacheSessionHandler {
         */
        static function read( $id ) {
                $data = self::getCache()->get( self::getKey( $id ) );
-               if( $data === false ) {
+               if ( $data === false ) {
                        return '';
                }
                return $data;
index f9feaf9..e1dc42e 100644 (file)
@@ -140,7 +140,13 @@ class RedisBagOStuff extends BagOStuff {
                                $conn->setex( $key, $expiry, $value );
                        }
 
-                       $result = $conn->exec();
+                       /*
+                        * multi()/exec() (transactional mode) allows multiple values to
+                        * be set/get at once and will return an array of results, in
+                        * the order they were set/get. In this case, we only set 1
+                        * value, which should (in case of success) result in true.
+                        */
+                       $result = ( $conn->exec() == array( true ) );
                } catch ( RedisException $e ) {
                        $result = false;
                        $this->handleException( $server, $conn, $e );
index 87f787d..b6bf3f8 100644 (file)
@@ -222,8 +222,8 @@ class SqlBagOStuff extends BagOStuff {
 
                $dataRows = array();
                foreach ( $keysByTable as $serverIndex => $serverKeys ) {
-                       $db = $this->getDB( $serverIndex );
                        try {
+                               $db = $this->getDB( $serverIndex );
                                foreach ( $serverKeys as $tableName => $tableKeys ) {
                                        $res = $db->select( $tableName,
                                                array( 'keyname', 'value', 'exptime' ),
@@ -244,10 +244,10 @@ class SqlBagOStuff extends BagOStuff {
                        if ( isset( $dataRows[$key] ) ) { // HIT?
                                $row = $dataRows[$key];
                                $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
-                               $db = $this->getDB( $row->serverIndex );
-                               if ( $this->isExpired( $db, $row->exptime ) ) { // MISS
-                                       $this->debug( "get: key has expired, deleting" );
-                                       try {
+                               try {
+                                       $db = $this->getDB( $row->serverIndex );
+                                       if ( $this->isExpired( $db, $row->exptime ) ) { // MISS
+                                               $this->debug( "get: key has expired, deleting" );
                                                $db->begin( __METHOD__ );
                                                # Put the expiry time in the WHERE condition to avoid deleting a
                                                # newly-inserted value
@@ -255,12 +255,12 @@ class SqlBagOStuff extends BagOStuff {
                                                        array( 'keyname' => $key, 'exptime' => $row->exptime ),
                                                        __METHOD__ );
                                                $db->commit( __METHOD__ );
-                                       } catch ( DBQueryError $e ) {
-                                               $this->handleWriteError( $e, $row->serverIndex );
+                                               $values[$key] = false;
+                                       } else { // HIT
+                                               $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
                                        }
-                                       $values[$key] = false;
-                               } else { // HIT
-                                       $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
+                               } catch ( DBQueryError $e ) {
+                                       $this->handleWriteError( $e, $row->serverIndex );
                                }
                        } else { // MISS
                                $values[$key] = false;
index 6b70e1d..8190a8a 100644 (file)
@@ -93,7 +93,7 @@ class CacheTime {
                        $expire = min( $expire, $wgParserCacheExpireTime );
                }
 
-               if( $this->containsOldMagic() ) { //compatibility hack
+               if ( $this->containsOldMagic() ) { //compatibility hack
                        $expire = min( $expire, 3600 ); # 1 hour
                }
 
diff --git a/includes/parser/CoreLinkFunctions.php b/includes/parser/CoreLinkFunctions.php
deleted file mode 100644 (file)
index 1cabf76..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * Link functions provided by MediaWiki core; experimental
- *
- * 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 Parser
- */
-
-/**
- * Various core link functions, registered in Parser::firstCallInit()
- * @ingroup Parser
- */
-class CoreLinkFunctions {
-       /**
-        * @param $parser Parser_LinkHooks
-        * @return bool
-        */
-       static function register( $parser ) {
-               $parser->setLinkHook( NS_CATEGORY, array( __CLASS__, 'categoryLinkHook' ) );
-               return true;
-       }
-
-       /**
-        * @param $parser Parser
-        * @param $holders LinkHolderArray
-        * @param $markers LinkMarkerReplacer
-        * @param Title $title
-        * @param $titleText
-        * @param null $displayText
-        * @param bool $leadingColon
-        * @return bool
-        */
-       static function defaultLinkHook( $parser, $holders, $markers,
-                       Title $title, $titleText, &$displayText = null, &$leadingColon = false ) {
-               if( isset( $displayText ) && $markers->findMarker( $displayText ) ) {
-                       # There are links inside of the displayText
-                       # For backwards compatibility the deepest links are dominant so this
-                       # link should not be handled
-                       $displayText = $markers->expand( $displayText );
-                       # Return false so that this link is reverted back to WikiText
-                       return false;
-               }
-               return $holders->makeHolder( $title, isset( $displayText ) ? $displayText : $titleText, array(), '', '' );
-       }
-
-       /**
-        * @param  $parser Parser
-        * @param  $holders LinkHolderArray
-        * @param  $markers LinkMarkerReplacer
-        * @param Title $title
-        * @param  $titleText
-        * @param null $sortText
-        * @param bool $leadingColon
-        * @return bool|string
-        */
-       static function categoryLinkHook( $parser, $holders, $markers,
-                       Title $title, $titleText, &$sortText = null, &$leadingColon = false ) {
-               global $wgContLang;
-               # When a category link starts with a : treat it as a normal link
-               if( $leadingColon ) return true;
-               if( isset( $sortText ) && $markers->findMarker( $sortText ) ) {
-                       # There are links inside of the sortText
-                       # For backwards compatibility the deepest links are dominant so this
-                       # link should not be handled
-                       $sortText = $markers->expand( $sortText );
-                       # Return false so that this link is reverted back to WikiText
-                       return false;
-               }
-               if( !isset( $sortText ) ) $sortText = $parser->getDefaultSort();
-               $sortText = Sanitizer::decodeCharReferences( $sortText );
-               $sortText = str_replace( "\n", '', $sortText );
-               $sortText = $wgContLang->convertCategoryKey( $sortText );
-               $parser->mOutput->addCategory( $title->getDBkey(), $sortText );
-               return '';
-       }
-
-}
index 542ac0f..375ff2b 100644 (file)
@@ -88,6 +88,8 @@ class CoreParserFunctions {
                $parser->setFunctionHook( 'pagenamee',        array( __CLASS__, 'pagenamee'        ), SFH_NO_HASH );
                $parser->setFunctionHook( 'fullpagename',     array( __CLASS__, 'fullpagename'     ), SFH_NO_HASH );
                $parser->setFunctionHook( 'fullpagenamee',    array( __CLASS__, 'fullpagenamee'    ), SFH_NO_HASH );
+               $parser->setFunctionHook( 'rootpagename',     array( __CLASS__, 'rootpagename'     ), SFH_NO_HASH );
+               $parser->setFunctionHook( 'rootpagenamee',    array( __CLASS__, 'rootpagenamee'    ), SFH_NO_HASH );
                $parser->setFunctionHook( 'basepagename',     array( __CLASS__, 'basepagename'     ), SFH_NO_HASH );
                $parser->setFunctionHook( 'basepagenamee',    array( __CLASS__, 'basepagenamee'    ), SFH_NO_HASH );
                $parser->setFunctionHook( 'subpagename',      array( __CLASS__, 'subpagename'      ), SFH_NO_HASH );
@@ -138,8 +140,9 @@ class CoreParserFunctions {
 
                // Specify a different default date format other than the the normal default
                // iff the user has 'default' for their setting
-               if ( $pref == 'default' && $defaultPref )
+               if ( $pref == 'default' && $defaultPref ) {
                        $pref = $defaultPref;
+               }
 
                $date = $df->reformat( $pref, $date, array( 'match-whole' ) );
                return $date;
@@ -184,7 +187,7 @@ class CoreParserFunctions {
                if ( is_null( $magicWords ) ) {
                        $magicWords = new MagicWordArray( array( 'url_path', 'url_query', 'url_wiki' ) );
                }
-               switch( $magicWords->matchStartToEnd( $arg ) ) {
+               switch ( $magicWords->matchStartToEnd( $arg ) ) {
 
                        // Encode as though it's a wiki page, '_' for ' '.
                        case 'url_wiki':
@@ -248,14 +251,15 @@ class CoreParserFunctions {
                # before arriving here; if that's true, then the title can't be created
                # and the variable will fail. If we can't get a decent title from the first
                # attempt, url-decode and try for a second.
-               if( is_null( $title ) )
+               if ( is_null( $title ) ) {
                        $title = Title::newFromURL( urldecode( $s ) );
-               if( !is_null( $title ) ) {
+               }
+               if ( !is_null( $title ) ) {
                        # Convert NS_MEDIA -> NS_FILE
-                       if( $title->getNamespace() == NS_MEDIA ) {
+                       if ( $title->getNamespace() == NS_MEDIA ) {
                                $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
                        }
-                       if( !is_null( $arg ) ) {
+                       if ( !is_null( $arg ) ) {
                                $text = $title->$func( $arg );
                        } else {
                                $text = $title->$func();
@@ -359,30 +363,49 @@ class CoreParserFunctions {
        static function displaytitle( $parser, $text = '' ) {
                global $wgRestrictDisplayTitle;
 
-               #parse a limited subset of wiki markup (just the single quote items)
+               // parse a limited subset of wiki markup (just the single quote items)
                $text = $parser->doQuotes( $text );
 
-               #remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
+               // remove stripped text (e.g. the UNIQ-QINU stuff) that was generated by tag extensions/whatever
                $text = preg_replace( '/' . preg_quote( $parser->uniqPrefix(), '/' ) . '.*?'
                        . preg_quote( Parser::MARKER_SUFFIX, '/' ) . '/', '', $text );
 
-               #list of disallowed tags for DISPLAYTITLE
-               #these will be escaped even though they are allowed in normal wiki text
+               // list of disallowed tags for DISPLAYTITLE
+               // these will be escaped even though they are allowed in normal wiki text
                $bad = array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'blockquote', 'ol', 'ul', 'li', 'hr',
                        'table', 'tr', 'th', 'td', 'dl', 'dd', 'caption', 'p', 'ruby', 'rb', 'rt', 'rp', 'br' );
 
-               #only requested titles that normalize to the actual title are allowed through
-               #if $wgRestrictDisplayTitle is true (it is by default)
-               #mimic the escaping process that occurs in OutputPage::setPageTitle
-               $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, null, array(), array(), $bad ) );
+               // disallow some styles that could be used to bypass $wgRestrictDisplayTitle
+               if ( $wgRestrictDisplayTitle ) {
+                       $htmlTagsCallback = function ( $params ) {
+                               $decoded = Sanitizer::decodeTagAttributes( $params );
+
+                               if ( isset( $decoded['style'] ) ) {
+                                       // this is called later anyway, but we need it right now for the regexes below to be safe
+                                       // calling it twice doesn't hurt
+                                       $decoded['style'] = Sanitizer::checkCss( $decoded['style'] );
+
+                                       if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) {
+                                               $decoded['style'] = '/* attempt to bypass $wgRestrictDisplayTitle */';
+                                       }
+                               }
+
+                               $params = Sanitizer::safeEncodeTagAttributes( $decoded );
+                       };
+               } else {
+                       $htmlTagsCallback = null;
+               }
+
+               // only requested titles that normalize to the actual title are allowed through
+               // if $wgRestrictDisplayTitle is true (it is by default)
+               // mimic the escaping process that occurs in OutputPage::setPageTitle
+               $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, $htmlTagsCallback, array(), array(), $bad ) );
                $title = Title::newFromText( Sanitizer::stripAllTags( $text ) );
 
-               if( !$wgRestrictDisplayTitle ) {
+               if ( !$wgRestrictDisplayTitle ) {
+                       $parser->mOutput->setDisplayTitle( $text );
+               } elseif ( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) {
                        $parser->mOutput->setDisplayTitle( $text );
-               } else {
-                       if ( $title instanceof Title && $title->getFragment() == '' && $title->equals( $parser->mTitle ) ) {
-                               $parser->mOutput->setDisplayTitle( $text );
-                       }
                }
 
                return '';
@@ -404,7 +427,7 @@ class CoreParserFunctions {
        }
 
        static function formatRaw( $num, $raw ) {
-               if( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
+               if ( self::matchAgainstMagicword( 'rawsuffix', $raw ) ) {
                        return $num;
                } else {
                        global $wgContLang;
@@ -438,7 +461,7 @@ class CoreParserFunctions {
        static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
                return self::formatRaw( SiteStats::pagesInNs( intval( $namespace ) ), $raw );
        }
-       static function numberingroup( $parser, $name = '', $raw = null) {
+       static function numberingroup( $parser, $name = '', $raw = null ) {
                return self::formatRaw( SiteStats::numberingroup( strtolower( $name ) ), $raw );
        }
 
@@ -451,44 +474,51 @@ class CoreParserFunctions {
         */
        static function mwnamespace( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return str_replace( '_', ' ', $t->getNsText() );
        }
        static function namespacee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return wfUrlencode( $t->getNsText() );
        }
        static function namespacenumber( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return $t->getNamespace();
        }
        static function talkspace( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) || !$t->canTalk() )
+               if ( is_null( $t ) || !$t->canTalk() ) {
                        return '';
+               }
                return str_replace( '_', ' ', $t->getTalkNsText() );
        }
        static function talkspacee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) || !$t->canTalk() )
+               if ( is_null( $t ) || !$t->canTalk() ) {
                        return '';
+               }
                return wfUrlencode( $t->getTalkNsText() );
        }
        static function subjectspace( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return str_replace( '_', ' ', $t->getSubjectNsText() );
        }
        static function subjectspacee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return wfUrlencode( $t->getSubjectNsText() );
        }
 
@@ -499,75 +529,101 @@ class CoreParserFunctions {
         */
        static function pagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return wfEscapeWikiText( $t->getText() );
        }
        static function pagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return wfEscapeWikiText( $t->getPartialURL() );
        }
        static function fullpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) || !$t->canTalk() )
+               if ( is_null( $t ) || !$t->canTalk() ) {
                        return '';
+               }
                return wfEscapeWikiText( $t->getPrefixedText() );
        }
        static function fullpagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) || !$t->canTalk() )
+               if ( is_null( $t ) || !$t->canTalk() ) {
                        return '';
+               }
                return wfEscapeWikiText( $t->getPrefixedURL() );
        }
        static function subpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return wfEscapeWikiText( $t->getSubpageText() );
        }
        static function subpagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return wfEscapeWikiText( $t->getSubpageUrlForm() );
        }
+       static function rootpagename( $parser, $title = null ) {
+               $t = Title::newFromText( $title );
+               if ( is_null( $t ) ) {
+                       return '';
+               }
+               return wfEscapeWikiText( $t->getRootText() );
+       }
+       static function rootpagenamee( $parser, $title = null ) {
+               $t = Title::newFromText( $title );
+               if ( is_null( $t ) ) {
+                       return '';
+               }
+               return wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $t->getRootText() ) ) );
+       }
        static function basepagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return wfEscapeWikiText( $t->getBaseText() );
        }
        static function basepagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $t->getBaseText() ) ) );
        }
        static function talkpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) || !$t->canTalk() )
+               if ( is_null( $t ) || !$t->canTalk() ) {
                        return '';
+               }
                return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() );
        }
        static function talkpagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) || !$t->canTalk() )
+               if ( is_null( $t ) || !$t->canTalk() ) {
                        return '';
-               return wfEscapeWikiText( $t->getTalkPage()->getPrefixedUrl() );
+               }
+               return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() );
        }
        static function subjectpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
+               }
                return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() );
        }
        static function subjectpagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
-               if ( is_null( $t ) )
+               if ( is_null( $t ) ) {
                        return '';
-               return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedUrl() );
+               }
+               return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedURL() );
        }
 
        /**
@@ -589,7 +645,7 @@ class CoreParserFunctions {
                static $cache = array();
 
                // split the given option to its variable
-               if( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
+               if ( self::matchAgainstMagicword( 'rawsuffix', $arg1 ) ) {
                        //{{pagesincategory:|raw[|type]}}
                        $raw = $arg1;
                        $type = $magicWords->matchStartToEnd( $arg2 );
@@ -598,23 +654,23 @@ class CoreParserFunctions {
                        $type = $magicWords->matchStartToEnd( $arg1 );
                        $raw = $arg2;
                }
-               if( !$type ) { //backward compatibility
+               if ( !$type ) { //backward compatibility
                        $type = 'pagesincategory_all';
                }
 
                $title = Title::makeTitleSafe( NS_CATEGORY, $name );
-               if( !$title ) { # invalid title
+               if ( !$title ) { # invalid title
                        return self::formatRaw( 0, $raw );
                }
 
                // Normalize name for cache
                $name = $title->getDBkey();
 
-               if( !isset( $cache[$name] ) ) {
+               if ( !isset( $cache[$name] ) ) {
                        $category = Category::newFromTitle( $title );
 
                        $allCount = $subcatCount = $fileCount = $pagesCount = 0;
-                       if( $parser->incrementExpensiveFunctionCount() ) {
+                       if ( $parser->incrementExpensiveFunctionCount() ) {
                                // $allCount is the total number of cat members,
                                // not the count of how many members are normal pages.
                                $allCount = (int)$category->getPageCount();
@@ -636,8 +692,6 @@ class CoreParserFunctions {
         * Return the size of the given page, or 0 if it's nonexistent.  This is an
         * expensive parser function and can't be called too many times per page.
         *
-        * @todo FIXME: This doesn't work correctly on preview for getting the size
-        *   of the current page.
         * @todo FIXME: Title::getLength() documentation claims that it adds things
         *   to the link cache, so the local cache here should be unnecessary, but
         *   in fact calling getLength() repeatedly for the same $page does seem to
@@ -645,15 +699,15 @@ class CoreParserFunctions {
         * @todo Document parameters
         *
         * @param $parser Parser
-        * @param string $page TODO DOCUMENT (Default: empty string)
-        * @param $raw TODO DOCUMENT (Default: null)
+        * @param $page String Name of page to check (Default: empty string)
+        * @param $raw String Should number be human readable with commas or just number
         * @return string
         */
        static function pagesize( $parser, $page = '', $raw = null ) {
                static $cache = array();
                $title = Title::newFromText( $page );
 
-               if( !is_object( $title ) ) {
+               if ( !is_object( $title ) ) {
                        $cache[$page] = 0;
                        return self::formatRaw( 0, $raw );
                }
@@ -662,9 +716,15 @@ class CoreParserFunctions {
                $page = $title->getPrefixedText();
 
                $length = 0;
-               if( isset( $cache[$page] ) ) {
+               if ( $title->equals( $parser->getTitle() )
+                       && $parser->mInputSize !== false
+               ) {
+                       # We are on current page (and not in PST), so
+                       # take length of input to parser.
+                       $length = $parser->mInputSize;
+               } elseif ( isset( $cache[$page] ) ) {
                        $length = $cache[$page];
-               } elseif( $parser->incrementExpensiveFunctionCount() ) {
+               } elseif ( $parser->incrementExpensiveFunctionCount() ) {
                        $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                        $pageID = $rev ? $rev->getPage() : 0;
                        $revID = $rev ? $rev->getId() : 0;
@@ -717,7 +777,9 @@ class CoreParserFunctions {
        static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) {
                $padding = $parser->killMarkers( $padding );
                $lengthOfPadding = mb_strlen( $padding );
-               if ( $lengthOfPadding == 0 ) return $string;
+               if ( $lengthOfPadding == 0 ) {
+                       return $string;
+               }
 
                # The remaining length to add counts down to 0 as padding is added
                $length = min( $length, 500 ) - mb_strlen( $string );
@@ -753,7 +815,7 @@ class CoreParserFunctions {
         */
        static function anchorencode( $parser, $text ) {
                $text = $parser->killMarkers( $text );
-               return substr( $parser->guessSectionNameFromWikiText( $text ), 1);
+               return (string)substr( $parser->guessSectionNameFromWikiText( $text ), 1 );
        }
 
        static function special( $parser, $text ) {
@@ -786,19 +848,20 @@ class CoreParserFunctions {
                $arg = $magicWords->matchStartToEnd( $uarg );
 
                $text = trim( $text );
-               if( strlen( $text ) == 0 )
+               if ( strlen( $text ) == 0 ) {
                        return '';
+               }
                $old = $parser->getCustomDefaultSort();
                if ( $old === false || $arg !== 'defaultsort_noreplace' ) {
                        $parser->setDefaultSort( $text );
                }
 
-               if( $old === false || $old == $text || $arg ) {
+               if ( $old === false || $old == $text || $arg ) {
                        return '';
                } else {
-                       return( '<span class="error">' .
+                       return '<span class="error">' .
                                wfMessage( 'duplicate-defaultsort', $old, $text )->inContentLanguage()->escaped() .
-                               '</span>' );
+                               '</span>';
                }
        }
 
@@ -807,14 +870,14 @@ class CoreParserFunctions {
        public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
                $file = wfFindFile( $name );
 
-               if( $argA == 'nowiki' ) {
+               if ( $argA == 'nowiki' ) {
                        // {{filepath: | option [| size] }}
                        $isNowiki = true;
                        $parsedWidthParam = $parser->parseWidthParam( $argB );
                } else {
                        // {{filepath: [| size [|option]] }}
                        $parsedWidthParam = $parser->parseWidthParam( $argA );
-                       $isNowiki = ($argB == 'nowiki');
+                       $isNowiki = ( $argB == 'nowiki' );
                }
 
                if ( $file ) {
index 6505183..a2eb698 100644 (file)
@@ -77,7 +77,7 @@ class CoreTagHooks {
         */
        static function html( $content, $attributes, $parser ) {
                global $wgRawHtml;
-               if( $wgRawHtml ) {
+               if ( $wgRawHtml ) {
                        return array( $content, 'markerType' => 'nowiki' );
                } else {
                        throw new MWException( '<html> extension tag encountered unexpectedly' );
index a2da307..0a69b04 100644 (file)
@@ -156,10 +156,10 @@ class DateFormatter {
                }
                for ( $i = 1; $i <= self::LAST; $i++ ) {
                        $this->mSource = $i;
-                       if ( isset ( $this->rules[$preference][$i] ) ) {
+                       if ( isset( $this->rules[$preference][$i] ) ) {
                                # Specific rules
                                $this->mTarget = $this->rules[$preference][$i];
-                       } elseif ( isset ( $this->rules[self::ALL][$i] ) ) {
+                       } elseif ( isset( $this->rules[self::ALL][$i] ) ) {
                                # General rules
                                $this->mTarget = $this->rules[self::ALL][$i];
                        } elseif ( $preference ) {
@@ -198,14 +198,15 @@ class DateFormatter {
        function replace( $matches ) {
                # Extract information from $matches
                $linked = true;
-               if ( isset( $this->mLinked ) )
+               if ( isset( $this->mLinked ) ) {
                        $linked = $this->mLinked;
+               }
 
                $bits = array();
                $key = $this->keys[$this->mSource];
                for ( $p = 0; $p < strlen( $key ); $p++ ) {
                        if ( $key[$p] != ' ' ) {
-                               $bits[$key[$p]] = $matches[$p+1];
+                               $bits[$key[$p]] = $matches[$p + 1];
                        }
                }
 
@@ -232,10 +233,12 @@ class DateFormatter {
                $fail = false;
 
                // Pre-generate y/Y stuff because we need the year for the <span> title.
-               if ( !isset( $bits['y'] ) && isset( $bits['Y'] ) )
+               if ( !isset( $bits['y'] ) && isset( $bits['Y'] ) ) {
                        $bits['y'] = $this->makeIsoYear( $bits['Y'] );
-               if ( !isset( $bits['Y'] ) && isset( $bits['y'] ) )
+               }
+               if ( !isset( $bits['Y'] ) && isset( $bits['y'] ) ) {
                        $bits['Y'] = $this->makeNormalYear( $bits['y'] );
+               }
 
                if ( !isset( $bits['m'] ) ) {
                        $m = $this->makeIsoMonth( $bits['F'] );
@@ -293,8 +296,9 @@ class DateFormatter {
                }
 
                $isoBits = array();
-               if ( isset( $bits['y'] ) )
+               if ( isset( $bits['y'] ) ) {
                        $isoBits[] = $bits['y'];
+               }
                $isoBits[] = $bits['m'];
                $isoBits[] = $bits['d'];
                $isoDate = implode( '-', $isoBits );
@@ -312,7 +316,7 @@ class DateFormatter {
         */
        function getMonthRegex() {
                $names = array();
-               for( $i = 1; $i <= 12; $i++ ) {
+               for ( $i = 1; $i <= 12; $i++ ) {
                        $names[] = $this->lang->getMonthName( $i );
                        $names[] = $this->lang->getMonthAbbreviation( $i );
                }
@@ -337,7 +341,7 @@ class DateFormatter {
        function makeIsoYear( $year ) {
                # Assumes the year is in a nice format, as enforced by the regex
                if ( substr( $year, -2 ) == 'BC' ) {
-                       $num = intval(substr( $year, 0, -3 )) - 1;
+                       $num = intval( substr( $year, 0, -3 ) ) - 1;
                        # PHP bug note: sprintf( "%04d", -1 ) fails poorly
                        $text = sprintf( '-%04d', $num );
 
@@ -353,7 +357,7 @@ class DateFormatter {
         */
        function makeNormalYear( $iso ) {
                if ( $iso[0] == '-' ) {
-                       $text = (intval( substr( $iso, 1 ) ) + 1) . ' BC';
+                       $text = ( intval( substr( $iso, 1 ) ) + 1 ) . ' BC';
                } else {
                        $text = intval( $iso );
                }
index 49b2d33..6fc457d 100644 (file)
@@ -322,7 +322,7 @@ class LinkHolderArray {
                }
                if ( $queries ) {
                        $where = array();
-                       foreach( $queries as $ns => $pages ) {
+                       foreach ( $queries as $ns => $pages ) {
                                $where[] = $dbr->makeList(
                                        array(
                                                'page_namespace' => $ns,
@@ -362,7 +362,7 @@ class LinkHolderArray {
                wfProfileOut( __METHOD__ . '-check' );
 
                # Do a second query for different language variants of links and categories
-               if( $wgContLang->hasVariants() ) {
+               if ( $wgContLang->hasVariants() ) {
                        $this->doVariants( $colours );
                }
 
@@ -406,7 +406,8 @@ class LinkHolderArray {
                $text = preg_replace_callback(
                        '/(<!--LINK .*?-->)/',
                        $replacer->cb(),
-                       $text);
+                       $text
+               );
 
                wfProfileOut( __METHOD__ . '-replace' );
                wfProfileOut( __METHOD__ );
@@ -424,7 +425,7 @@ class LinkHolderArray {
                # Make interwiki link HTML
                $output = $this->parent->getOutput();
                $replacePairs = array();
-               foreach( $this->interwikis as $key => $link ) {
+               foreach ( $this->interwikis as $key => $link ) {
                        $replacePairs[$key] = Linker::link( $link['title'], $link['text'] );
                        $output->addInterwikiLink( $link['title'] );
                }
@@ -485,7 +486,7 @@ class LinkHolderArray {
                                $textVariant = $titlesAllVariants[$variantName][$i];
                                if ( $textVariant != $titlesAttrs[$i]['titleText'] ) {
                                        $variantTitle = Title::makeTitle( $titlesAttrs[$i]['ns'], $textVariant );
-                                       if( is_null( $variantTitle ) ) {
+                                       if ( is_null( $variantTitle ) ) {
                                                continue;
                                        }
                                        $linkBatch->addObj( $variantTitle );
@@ -513,7 +514,7 @@ class LinkHolderArray {
                        }
                }
 
-               if( !$linkBatch->isEmpty() ) {
+               if ( !$linkBatch->isEmpty() ) {
                        // construct query
                        $dbr = wfGetDB( DB_SLAVE );
                        $varRes = $dbr->select( 'page',
@@ -532,14 +533,14 @@ class LinkHolderArray {
                                $vardbk = $variantTitle->getDBkey();
 
                                $holderKeys = array();
-                               if( isset( $variantMap[$varPdbk] ) ) {
+                               if ( isset( $variantMap[$varPdbk] ) ) {
                                        $holderKeys = $variantMap[$varPdbk];
                                        $linkCache->addGoodLinkObjFromRow( $variantTitle, $s );
                                        $output->addLink( $variantTitle, $s->page_id );
                                }
 
                                // loop over link holders
-                               foreach( $holderKeys as $key ) {
+                               foreach ( $holderKeys as $key ) {
                                        list( $ns, $index ) = explode( ':', $key, 2 );
                                        $entry =& $this->internals[$ns][$index];
                                        $pdbk = $entry['pdbk'];
@@ -569,12 +570,12 @@ class LinkHolderArray {
                        wfRunHooks( 'GetLinkColours', array( $linkcolour_ids, &$colours ) );
 
                        // rebuild the categories in original order (if there are replacements)
-                       if( count( $varCategories ) > 0 ) {
+                       if ( count( $varCategories ) > 0 ) {
                                $newCats = array();
                                $originalCats = $output->getCategories();
-                               foreach( $originalCats as $cat => $sortkey ) {
+                               foreach ( $originalCats as $cat => $sortkey ) {
                                        // make the replacement
-                                       if( array_key_exists( $cat, $varCategories ) ) {
+                                       if ( array_key_exists( $cat, $varCategories ) ) {
                                                $newCats[$varCategories[$cat]] = $sortkey;
                                        } else {
                                                $newCats[$cat] = $sortkey;
@@ -614,13 +615,13 @@ class LinkHolderArray {
        function replaceTextCallback( $matches ) {
                $type = $matches[1];
                $key = $matches[2];
-               if( $type == 'LINK' ) {
+               if ( $type == 'LINK' ) {
                        list( $ns, $index ) = explode( ':', $key, 2 );
-                       if( isset( $this->internals[$ns][$index]['text'] ) ) {
+                       if ( isset( $this->internals[$ns][$index]['text'] ) ) {
                                return $this->internals[$ns][$index]['text'];
                        }
-               } elseif( $type == 'IWLINK' ) {
-                       if( isset( $this->interwikis[$key]['text'] ) ) {
+               } elseif ( $type == 'IWLINK' ) {
+                       if ( isset( $this->interwikis[$key]['text'] ) ) {
                                return $this->interwikis[$key]['text'];
                        }
                }
index 99042ae..840e174 100644 (file)
@@ -28,7 +28,7 @@
 /**
  * PHP Parser - Processes wiki markup (which uses a more user-friendly
  * syntax, such as "[[link]]" for making links), and provides a one-way
- * transformation of that wiki markup it into XHTML output / markup
+ * transformation of that wiki markup it into (X)HTML output / markup
  * (which in turn the browser understands, and can display).
  *
  * There are seven main entry points into the Parser class:
@@ -193,6 +193,7 @@ class Parser {
        var $mRevisionTimestamp; # The timestamp of the specified revision ID
        var $mRevisionUser; # User to display in {{REVISIONUSER}} tag
        var $mRevIdForTs;   # The revision ID which was used to fetch the timestamp
+       var $mInputSize = false; # For {{PAGESIZE}} on current page.
 
        /**
         * @var string
@@ -218,8 +219,8 @@ class Parser {
                        self::EXT_LINK_URL_CLASS . '+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
                if ( isset( $conf['preprocessorClass'] ) ) {
                        $this->mPreprocessorClass = $conf['preprocessorClass'];
-               } elseif ( defined( 'MW_COMPILED' ) ) {
-                       # Preprocessor_Hash is much faster than Preprocessor_DOM in compiled mode
+               } elseif ( defined( 'HPHP_VERSION' ) ) {
+                       # Preprocessor_Hash is much faster than Preprocessor_DOM under HipHop
                        $this->mPreprocessorClass = 'Preprocessor_Hash';
                } elseif ( extension_loaded( 'domxml' ) ) {
                        # PECL extension that conflicts with the core DOM extension (bug 13770)
@@ -361,6 +362,8 @@ class Parser {
 
                $this->startParse( $title, $options, self::OT_HTML, $clearState );
 
+               $this->mInputSize = strlen( $text );
+
                # Remove the strip marker tag prefix from the input, if present.
                if ( $clearState ) {
                        $text = str_replace( $this->mUniqPrefix, '', $text );
@@ -501,6 +504,11 @@ class Parser {
                                "Highest expansion depth: {$this->mHighestExpansionDepth}/{$this->mOptions->getMaxPPExpandDepth()}\n" .
                                $PFreport;
                        wfRunHooks( 'ParserLimitReport', array( $this, &$limitReport ) );
+
+                       // Sanitize for comment. Note '‐' in the replacement is U+2010,
+                       // which looks much like the problematic '-'.
+                       $limitReport = str_replace( array( '-', '&' ), array( '‐', '&amp;' ), $limitReport );
+
                        $text .= "\n<!-- \n$limitReport-->\n";
 
                        if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
@@ -514,6 +522,7 @@ class Parser {
                $this->mRevisionObject = $oldRevisionObject;
                $this->mRevisionTimestamp = $oldRevisionTimestamp;
                $this->mRevisionUser = $oldRevisionUser;
+               $this->mInputSize = false;
                wfProfileOut( $fname );
                wfProfileOut( __METHOD__ );
 
@@ -531,7 +540,7 @@ class Parser {
         *
         * @return string
         */
-       function recursiveTagParse( $text, $frame=false ) {
+       function recursiveTagParse( $text, $frame = false ) {
                wfProfileIn( __METHOD__ );
                wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
                wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
@@ -764,9 +773,9 @@ class Parser {
 
                if ( $target !== null ) {
                        return $target;
-               } elseif( $this->mOptions->getInterfaceMessage() ) {
+               } elseif ( $this->mOptions->getInterfaceMessage() ) {
                        return $this->mOptions->getUserLangObj();
-               } elseif( is_null( $this->mTitle ) ) {
+               } elseif ( is_null( $this->mTitle ) ) {
                        throw new MWException( __METHOD__ . ': $this->mTitle is null' );
                }
 
@@ -1251,8 +1260,8 @@ class Parser {
                                'x' => 'X',
                        ));
                        $titleObj = SpecialPage::getTitleFor( 'Booksources', $num );
-                       return'<a href="' .
-                               htmlspecialchars( $titleObj->getLocalUrl() ) .
+                       return '<a href="' .
+                               htmlspecialchars( $titleObj->getLocalURL() ) .
                                "\" class=\"internal mw-magiclink-isbn\">ISBN $isbn</a>";
                } else {
                        return $m[0];
@@ -1374,12 +1383,12 @@ class Parser {
                                        # If there are ever four apostrophes, assume the first is supposed to
                                        # be text, and the remaining three constitute mark-up for bold text.
                                        if ( strlen( $arr[$i] ) == 4 ) {
-                                               $arr[$i-1] .= "'";
+                                               $arr[$i - 1] .= "'";
                                                $arr[$i] = "'''";
                                        } elseif ( strlen( $arr[$i] ) > 5 ) {
                                                # If there are more than 5 apostrophes in a row, assume they're all
                                                # text except for the last 5.
-                                               $arr[$i-1] .= str_repeat( "'", strlen( $arr[$i] ) - 5 );
+                                               $arr[$i - 1] .= str_repeat( "'", strlen( $arr[$i] ) - 5 );
                                                $arr[$i] = "'''''";
                                        }
                                        # Count the number of occurrences of bold and italics mark-ups.
@@ -1406,8 +1415,8 @@ class Parser {
                                $firstspace = -1;
                                foreach ( $arr as $r ) {
                                        if ( ( $i % 2 == 1 ) and ( strlen( $r ) == 3 ) ) {
-                                               $x1 = substr( $arr[$i-1], -1 );
-                                               $x2 = substr( $arr[$i-1], -2, 1 );
+                                               $x1 = substr( $arr[$i - 1], -1 );
+                                               $x2 = substr( $arr[$i - 1], -2, 1 );
                                                if ( $x1 === ' ' ) {
                                                        if ( $firstspace == -1 ) {
                                                                $firstspace = $i;
@@ -1428,17 +1437,17 @@ class Parser {
                                # If there is a single-letter word, use it!
                                if ( $firstsingleletterword > -1 ) {
                                        $arr[$firstsingleletterword] = "''";
-                                       $arr[$firstsingleletterword-1] .= "'";
+                                       $arr[$firstsingleletterword - 1] .= "'";
                                } elseif ( $firstmultiletterword > -1 ) {
                                        # If not, but there's a multi-letter word, use that one.
                                        $arr[$firstmultiletterword] = "''";
-                                       $arr[$firstmultiletterword-1] .= "'";
+                                       $arr[$firstmultiletterword - 1] .= "'";
                                } elseif ( $firstspace > -1 ) {
                                        # ... otherwise use the first one that has neither.
                                        # (notice that it is possible for all three to be -1 if, for example,
                                        # there is only one pentuple-apostrophe in the line)
                                        $arr[$firstspace] = "''";
-                                       $arr[$firstspace-1] .= "'";
+                                       $arr[$firstspace - 1] .= "'";
                                }
                        }
 
@@ -1457,41 +1466,57 @@ class Parser {
                                } else {
                                        if ( strlen( $r ) == 2 ) {
                                                if ( $state === 'i' ) {
-                                                       $output .= '</i>'; $state = '';
+                                                       $output .= '</i>';
+                                                       $state = '';
                                                } elseif ( $state === 'bi' ) {
-                                                       $output .= '</i>'; $state = 'b';
+                                                       $output .= '</i>';
+                                                       $state = 'b';
                                                } elseif ( $state === 'ib' ) {
-                                                       $output .= '</b></i><b>'; $state = 'b';
+                                                       $output .= '</b></i><b>';
+                                                       $state = 'b';
                                                } elseif ( $state === 'both' ) {
-                                                       $output .= '<b><i>' . $buffer . '</i>'; $state = 'b';
+                                                       $output .= '<b><i>' . $buffer . '</i>';
+                                                       $state = 'b';
                                                } else { # $state can be 'b' or ''
-                                                       $output .= '<i>'; $state .= 'i';
+                                                       $output .= '<i>';
+                                                       $state .= 'i';
                                                }
                                        } elseif ( strlen( $r ) == 3 ) {
                                                if ( $state === 'b' ) {
-                                                       $output .= '</b>'; $state = '';
+                                                       $output .= '</b>';
+                                                       $state = '';
                                                } elseif ( $state === 'bi' ) {
-                                                       $output .= '</i></b><i>'; $state = 'i';
+                                                       $output .= '</i></b><i>';
+                                                       $state = 'i';
                                                } elseif ( $state === 'ib' ) {
-                                                       $output .= '</b>'; $state = 'i';
+                                                       $output .= '</b>';
+                                                       $state = 'i';
                                                } elseif ( $state === 'both' ) {
-                                                       $output .= '<i><b>' . $buffer . '</b>'; $state = 'i';
+                                                       $output .= '<i><b>' . $buffer . '</b>';
+                                                       $state = 'i';
                                                } else { # $state can be 'i' or ''
-                                                       $output .= '<b>'; $state .= 'b';
+                                                       $output .= '<b>';
+                                                       $state .= 'b';
                                                }
                                        } elseif ( strlen( $r ) == 5 ) {
                                                if ( $state === 'b' ) {
-                                                       $output .= '</b><i>'; $state = 'i';
+                                                       $output .= '</b><i>';
+                                                       $state = 'i';
                                                } elseif ( $state === 'i' ) {
-                                                       $output .= '</i><b>'; $state = 'b';
+                                                       $output .= '</i><b>';
+                                                       $state = 'b';
                                                } elseif ( $state === 'bi' ) {
-                                                       $output .= '</i></b>'; $state = '';
+                                                       $output .= '</i></b>';
+                                                       $state = '';
                                                } elseif ( $state === 'ib' ) {
-                                                       $output .= '</b></i>'; $state = '';
+                                                       $output .= '</b></i>';
+                                                       $state = '';
                                                } elseif ( $state === 'both' ) {
-                                                       $output .= '<i><b>' . $buffer . '</b></i>'; $state = '';
+                                                       $output .= '<i><b>' . $buffer . '</b></i>';
+                                                       $state = '';
                                                } else { # ($state == '')
-                                                       $buffer = ''; $state = 'both';
+                                                       $buffer = '';
+                                                       $state = 'both';
                                                }
                                        }
                                }
@@ -1533,12 +1558,13 @@ class Parser {
 
                $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
                if ( $bits === false ) {
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( "PCRE needs to be compiled with --enable-unicode-properties in order for MediaWiki to function" );
                }
                $s = array_shift( $bits );
 
                $i = 0;
-               while ( $i<count( $bits ) ) {
+               while ( $i < count( $bits ) ) {
                        $url = $bits[$i++];
                        $i++; // protocol
                        $text = $bits[$i++];
@@ -2154,7 +2180,7 @@ class Parser {
        function closeParagraph() {
                $result = '';
                if ( $this->mLastSection != '' ) {
-                       $result = '</' . $this->mLastSection  . ">\n";
+                       $result = '</' . $this->mLastSection . ">\n";
                }
                $this->mInPre = false;
                $this->mLastSection = '';
@@ -2349,13 +2375,13 @@ class Parser {
 
                                # Close all the prefixes which aren't shared.
                                while ( $commonPrefixLength < $lastPrefixLength ) {
-                                       $output .= $this->closeList( $lastPrefix[$lastPrefixLength-1] );
+                                       $output .= $this->closeList( $lastPrefix[$lastPrefixLength - 1] );
                                        --$lastPrefixLength;
                                }
 
                                # Continue the current prefix if appropriate.
                                if ( $prefixLength <= $commonPrefixLength && $commonPrefixLength > 0 ) {
-                                       $output .= $this->nextItem( $prefix[$commonPrefixLength-1] );
+                                       $output .= $this->nextItem( $prefix[$commonPrefixLength - 1] );
                                }
 
                                # Open prefixes where appropriate.
@@ -2382,8 +2408,8 @@ class Parser {
                                # XXX: use a stack for nestable elements like span, table and div
                                $openmatch = preg_match( '/(?:<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
                                $closematch = preg_match(
-                                       '/(?:<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'.
-                                       '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
+                                       '/(?:<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' .
+                                       '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|' . $this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
                                if ( $openmatch or $closematch ) {
                                        $paragraphStack = false;
                                        # TODO bug 5718: paragraph closed
@@ -2440,7 +2466,7 @@ class Parser {
                        }
                }
                while ( $prefixLength ) {
-                       $output .= $this->closeList( $prefix2[$prefixLength-1] );
+                       $output .= $this->closeList( $prefix2[$prefixLength - 1] );
                        --$prefixLength;
                }
                if ( $this->mLastSection != '' ) {
@@ -2476,7 +2502,7 @@ class Parser {
                if ( $lt === false || $lt > $pos ) {
                        # Easy; no tag nesting to worry about
                        $before = substr( $str, 0, $pos );
-                       $after = substr( $str, $pos+1 );
+                       $after = substr( $str, $pos + 1 );
                        wfProfileOut( __METHOD__ );
                        return $pos;
                }
@@ -2485,13 +2511,13 @@ class Parser {
                $state = self::COLON_STATE_TEXT;
                $stack = 0;
                $len = strlen( $str );
-               for( $i = 0; $i < $len; $i++ ) {
+               for ( $i = 0; $i < $len; $i++ ) {
                        $c = $str[$i];
 
-                       switch( $state ) {
+                       switch ( $state ) {
                        # (Using the number is a performance hack for common cases)
                        case 0: # self::COLON_STATE_TEXT:
-                               switch( $c ) {
+                               switch ( $c ) {
                                case "<":
                                        # Could be either a <start> tag or an </end> tag
                                        $state = self::COLON_STATE_TAGSTART;
@@ -2536,7 +2562,7 @@ class Parser {
                                break;
                        case 1: # self::COLON_STATE_TAG:
                                # In a <tag>
-                               switch( $c ) {
+                               switch ( $c ) {
                                case ">":
                                        $stack++;
                                        $state = self::COLON_STATE_TEXT;
@@ -2550,7 +2576,7 @@ class Parser {
                                }
                                break;
                        case 2: # self::COLON_STATE_TAGSTART:
-                               switch( $c ) {
+                               switch ( $c ) {
                                case "/":
                                        $state = self::COLON_STATE_CLOSETAG;
                                        break;
@@ -2606,6 +2632,7 @@ class Parser {
                                }
                                break;
                        default:
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "State machine error in " . __METHOD__ );
                        }
                }
@@ -2739,6 +2766,12 @@ class Parser {
                        case 'subpagenamee':
                                $value = wfEscapeWikiText( $this->mTitle->getSubpageUrlForm() );
                                break;
+                       case 'rootpagename':
+                               $value = wfEscapeWikiText( $this->mTitle->getRootText() );
+                               break;
+                       case 'rootpagenamee':
+                               $value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getRootText() ) ) );
+                               break;
                        case 'basepagename':
                                $value = wfEscapeWikiText( $this->mTitle->getBaseText() );
                                break;
@@ -2756,7 +2789,7 @@ class Parser {
                        case 'talkpagenamee':
                                if ( $this->mTitle->canTalk() ) {
                                        $talkPage = $this->mTitle->getTalkPage();
-                                       $value = wfEscapeWikiText( $talkPage->getPrefixedUrl() );
+                                       $value = wfEscapeWikiText( $talkPage->getPrefixedURL() );
                                } else {
                                        $value = '';
                                }
@@ -2767,11 +2800,11 @@ class Parser {
                                break;
                        case 'subjectpagenamee':
                                $subjPage = $this->mTitle->getSubjectPage();
-                               $value = wfEscapeWikiText( $subjPage->getPrefixedUrl() );
+                               $value = wfEscapeWikiText( $subjPage->getPrefixedURL() );
                                break;
                        case 'pageid': // requested in bug 23427
-                               $pageid = $this->getTitle()->getArticleId();
-                               if( $pageid == 0 ) {
+                               $pageid = $this->getTitle()->getArticleID();
+                               if ( $pageid == 0 ) {
                                        # 0 means the page doesn't exist in the database,
                                        # which means the user is previewing a new page.
                                        # The vary-revision flag must be set, because the magic word
@@ -3087,7 +3120,7 @@ class Parser {
                                $assocArgs[$index++] = $arg;
                        } else {
                                $name = trim( substr( $arg, 0, $eqpos ) );
-                               $value = trim( substr( $arg, $eqpos+1 ) );
+                               $value = trim( substr( $arg, $eqpos + 1 ) );
                                if ( $value === false ) {
                                        $value = '';
                                }
@@ -3140,7 +3173,6 @@ class Parser {
         * @private
         */
        function braceSubstitution( $piece, $frame ) {
-               global $wgContLang;
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-setup' );
 
@@ -3237,70 +3269,23 @@ class Parser {
 
                        $colonPos = strpos( $part1, ':' );
                        if ( $colonPos !== false ) {
-                               # Case sensitive functions
-                               $function = substr( $part1, 0, $colonPos );
-                               if ( isset( $this->mFunctionSynonyms[1][$function] ) ) {
-                                       $function = $this->mFunctionSynonyms[1][$function];
-                               } else {
-                                       # Case insensitive functions
-                                       $function = $wgContLang->lc( $function );
-                                       if ( isset( $this->mFunctionSynonyms[0][$function] ) ) {
-                                               $function = $this->mFunctionSynonyms[0][$function];
-                                       } else {
-                                               $function = false;
-                                       }
+                               $func = substr( $part1, 0, $colonPos );
+                               $funcArgs = array( trim( substr( $part1, $colonPos + 1 ) ) );
+                               for ( $i = 0; $i < $args->getLength(); $i++ ) {
+                                       $funcArgs[] = $args->item( $i );
                                }
-                               if ( $function ) {
-                                       wfProfileIn( __METHOD__ . '-pfunc-' . $function );
-                                       list( $callback, $flags ) = $this->mFunctionHooks[$function];
-                                       $initialArgs = array( &$this );
-                                       $funcArgs = array( trim( substr( $part1, $colonPos + 1 ) ) );
-                                       if ( $flags & SFH_OBJECT_ARGS ) {
-                                               # Add a frame parameter, and pass the arguments as an array
-                                               $allArgs = $initialArgs;
-                                               $allArgs[] = $frame;
-                                               for ( $i = 0; $i < $args->getLength(); $i++ ) {
-                                                       $funcArgs[] = $args->item( $i );
-                                               }
-                                               $allArgs[] = $funcArgs;
-                                       } else {
-                                               # Convert arguments to plain text
-                                               for ( $i = 0; $i < $args->getLength(); $i++ ) {
-                                                       $funcArgs[] = trim( $frame->expand( $args->item( $i ) ) );
-                                               }
-                                               $allArgs = array_merge( $initialArgs, $funcArgs );
-                                       }
-
-                                       # Workaround for PHP bug 35229 and similar
-                                       if ( !is_callable( $callback ) ) {
-                                               wfProfileOut( __METHOD__ . '-pfunc-' . $function );
-                                               wfProfileOut( __METHOD__ . '-pfunc' );
-                                               wfProfileOut( __METHOD__ );
-                                               throw new MWException( "Tag hook for $function is not callable\n" );
-                                       }
-                                       $result = call_user_func_array( $callback, $allArgs );
-                                       $found = true;
-                                       $noparse = true;
-                                       $preprocessFlags = 0;
-
-                                       if ( is_array( $result ) ) {
-                                               if ( isset( $result[0] ) ) {
-                                                       $text = $result[0];
-                                                       unset( $result[0] );
-                                               }
-
-                                               # Extract flags into the local scope
-                                               # This allows callers to set flags such as nowiki, found, etc.
-                                               extract( $result );
-                                       } else {
-                                               $text = $result;
-                                       }
-                                       if ( !$noparse ) {
-                                               $text = $this->preprocessToDom( $text, $preprocessFlags );
-                                               $isChildObj = true;
-                                       }
-                                       wfProfileOut( __METHOD__ . '-pfunc-' . $function );
+                               try {
+                                       $result = $this->callParserFunction( $frame, $func, $funcArgs );
+                               } catch ( Exception $ex ) {
+                                       wfProfileOut( __METHOD__ . '-pfunc' );
+                                       wfProfileOut( __METHOD__ );
+                                       throw $ex;
                                }
+
+                               # The interface for parser functions allows for extracting
+                               # flags into the local scope. Extract any forwarded flags
+                               # here.
+                               extract( $result );
                        }
                        wfProfileOut( __METHOD__ . '-pfunc' );
                }
@@ -3338,7 +3323,7 @@ class Parser {
                if ( !$found && $title ) {
                        if ( !Profiler::instance()->isPersistent() ) {
                                # Too many unique items can kill profiling DBs/collectors
-                               $titleProfileIn = __METHOD__ . "-title-" . $title->getDBKey();
+                               $titleProfileIn = __METHOD__ . "-title-" . $title->getDBkey();
                                wfProfileIn( $titleProfileIn ); // template in
                        }
                        wfProfileIn( __METHOD__ . '-loadtpl' );
@@ -3497,6 +3482,120 @@ class Parser {
                return $ret;
        }
 
+       /**
+        * Call a parser function and return an array with text and flags.
+        *
+        * The returned array will always contain a boolean 'found', indicating
+        * whether the parser function was found or not. It may also contain the
+        * following:
+        *  text: string|object, resulting wikitext or PP DOM object
+        *  isHTML: bool, $text is HTML, armour it against wikitext transformation
+        *  isChildObj: bool, $text is a DOM node needing expansion in a child frame
+        *  isLocalObj: bool, $text is a DOM node needing expansion in the current frame
+        *  nowiki: bool, wiki markup in $text should be escaped
+        *
+        * @since 1.21
+        * @param $frame PPFrame The current frame, contains template arguments
+        * @param $function string Function name
+        * @param $args array Arguments to the function
+        * @return array
+        */
+       public function callParserFunction( $frame, $function, array $args = array() ) {
+               global $wgContLang;
+
+               wfProfileIn( __METHOD__ );
+
+               # Case sensitive functions
+               if ( isset( $this->mFunctionSynonyms[1][$function] ) ) {
+                       $function = $this->mFunctionSynonyms[1][$function];
+               } else {
+                       # Case insensitive functions
+                       $function = $wgContLang->lc( $function );
+                       if ( isset( $this->mFunctionSynonyms[0][$function] ) ) {
+                               $function = $this->mFunctionSynonyms[0][$function];
+                       } else {
+                               wfProfileOut( __METHOD__ );
+                               return array( 'found' => false );
+                       }
+               }
+
+               wfProfileIn( __METHOD__ . '-pfunc-' . $function );
+               list( $callback, $flags ) = $this->mFunctionHooks[$function];
+
+               # Workaround for PHP bug 35229 and similar
+               if ( !is_callable( $callback ) ) {
+                       wfProfileOut( __METHOD__ . '-pfunc-' . $function );
+                       wfProfileOut( __METHOD__ );
+                       throw new MWException( "Tag hook for $function is not callable\n" );
+               }
+
+               $allArgs = array( &$this );
+               if ( $flags & SFH_OBJECT_ARGS ) {
+                       # Convert arguments to PPNodes and collect for appending to $allArgs
+                       $funcArgs = array();
+                       foreach ( $args as $k => $v ) {
+                               if ( $v instanceof PPNode || $k === 0 ) {
+                                       $funcArgs[] = $v;
+                               } else {
+                                       $funcArgs[] = $this->mPreprocessor->newPartNodeArray( array( $k => $v ) )->item( 0 );
+                               }
+                       }
+
+                       # Add a frame parameter, and pass the arguments as an array
+                       $allArgs[] = $frame;
+                       $allArgs[] = $funcArgs;
+               } else {
+                       # Convert arguments to plain text and append to $allArgs
+                       foreach ( $args as $k => $v ) {
+                               if ( $v instanceof PPNode ) {
+                                       $allArgs[] = trim( $frame->expand( $v ) );
+                               } elseif ( is_int( $k ) && $k >= 0 ) {
+                                       $allArgs[] = trim( $v );
+                               } else {
+                                       $allArgs[] = trim( "$k=$v" );
+                               }
+                       }
+               }
+
+               $result = call_user_func_array( $callback, $allArgs );
+
+               # The interface for function hooks allows them to return a wikitext
+               # string or an array containing the string and any flags. This mungs
+               # things around to match what this method should return.
+               if ( !is_array( $result ) ) {
+                       $result = array(
+                               'found' => true,
+                               'text' => $result,
+                       );
+               } else {
+                       if ( isset( $result[0] ) && !isset( $result['text'] ) ) {
+                               $result['text'] = $result[0];
+                       }
+                       unset( $result[0] );
+                       $result += array(
+                               'found' => true,
+                       );
+               }
+
+               $noparse = true;
+               $preprocessFlags = 0;
+               if ( isset( $result['noparse'] ) ) {
+                       $noparse = $result['noparse'];
+               }
+               if ( isset( $result['preprocessFlags'] ) ) {
+                       $preprocessFlags = $result['preprocessFlags'];
+               }
+
+               if ( !$noparse ) {
+                       $result['text'] = $this->preprocessToDom( $result['text'], $preprocessFlags );
+                       $result['isChildObj'] = true;
+               }
+               wfProfileOut( __METHOD__ . '-pfunc-' . $function );
+               wfProfileOut( __METHOD__ );
+
+               return $result;
+       }
+
        /**
         * Get the semi-parsed DOM representation of a template with a given title,
         * and its redirect destination title. Cached.
@@ -3527,7 +3626,7 @@ class Parser {
                }
 
                $dom = $this->preprocessToDom( $text, self::PTD_FOR_INCLUSION );
-               $this->mTplDomCache[ $titleText ] = $dom;
+               $this->mTplDomCache[$titleText] = $dom;
 
                if ( !$title->equals( $cacheTitle ) ) {
                        $this->mTplRedirCache[$cacheTitle->getPrefixedDBkey()] =
@@ -3550,6 +3649,11 @@ class Parser {
                if ( isset( $stuff['deps'] ) ) {
                        foreach ( $stuff['deps'] as $dep ) {
                                $this->mOutput->addTemplate( $dep['title'], $dep['page_id'], $dep['rev_id'] );
+                               if ( $dep['title']->equals( $this->getTitle() ) ) {
+                                       // If we transclude ourselves, the final result
+                                       // will change based on the new version of the page
+                                       $this->mOutput->setFlag( 'vary-revision' );
+                               }
                        }
                }
                return array( $text, $finalTitle );
@@ -3589,9 +3693,9 @@ class Parser {
                        if ( $skip ) {
                                $text = false;
                                $deps[] = array(
-                                       'title'         => $title,
-                                       'page_id'       => $title->getArticleID(),
-                                       'rev_id'        => null
+                                       'title' => $title,
+                                       'page_id' => $title->getArticleID(),
+                                       'rev_id' => null
                                );
                                break;
                        }
@@ -3607,15 +3711,15 @@ class Parser {
                        }
 
                        $deps[] = array(
-                               'title'         => $title,
-                               'page_id'       => $title->getArticleID(),
-                               'rev_id'        => $rev_id );
+                               'title' => $title,
+                               'page_id' => $title->getArticleID(),
+                               'rev_id' => $rev_id );
                        if ( $rev && !$title->equals( $rev->getTitle() ) ) {
                                # We fetched a rev from a different title; register it too...
                                $deps[] = array(
-                                       'title'         => $rev->getTitle(),
-                                       'page_id'       => $rev->getPage(),
-                                       'rev_id'        => $rev_id );
+                                       'title' => $rev->getTitle(),
+                                       'page_id' => $rev->getPage(),
+                                       'rev_id' => $rev_id );
                        }
 
                        if ( $rev ) {
@@ -3710,7 +3814,7 @@ class Parser {
                        return wfMessage( 'scarytranscludedisabled' )->inContentLanguage()->text();
                }
 
-               $url = $title->getFullUrl( "action=$action" );
+               $url = $title->getFullURL( array( 'action' => $action ) );
 
                if ( strlen( $url ) > 255 ) {
                        return wfMessage( 'scarytranscludetoolong' )->inContentLanguage()->text();
@@ -3746,8 +3850,8 @@ class Parser {
                $dbw->replace( 'transcache', array( 'tc_url' ), array(
                        'tc_url' => $url,
                        'tc_time' => $dbw->timestamp( time() ),
-                       'tc_contents' => $text)
-               );
+                       'tc_contents' => $text
+               ) );
                return $text;
        }
 
@@ -4026,8 +4130,8 @@ class Parser {
         * @return mixed|string
         * @private
         */
-       function formatHeadings( $text, $origText, $isMain=true ) {
-               global $wgMaxTocLevel, $wgHtml5, $wgExperimentalHtmlIds;
+       function formatHeadings( $text, $origText, $isMain = true ) {
+               global $wgMaxTocLevel, $wgExperimentalHtmlIds;
 
                # Inhibit editsection links if requested in the page
                if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) {
@@ -4043,7 +4147,7 @@ class Parser {
                # Get all headlines for numbering them and adding funky stuff like [edit]
                # links - this is for later, but we need the number of headlines right now
                $matches = array();
-               $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?'.'>)(?P<header>.*?)<\/H[1-6] *>/i', $text, $matches );
+               $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i', $text, $matches );
 
                # if there are fewer than 4 headlines in the article, do not show TOC
                # unless it's been explicitly enabled.
@@ -4105,7 +4209,7 @@ class Parser {
                                $serial = $markerMatches[1];
                                list( $titleText, $sectionIndex ) = $this->mHeadings[$serial];
                                $isTemplate = ( $titleText != $baseTitleText );
-                               $headline = preg_replace( "/^$markerRegex/", "", $headline );
+                               $headline = preg_replace( "/^$markerRegex\\s*/", "", $headline );
                        }
 
                        if ( $toclevel ) {
@@ -4160,7 +4264,7 @@ class Parser {
                        # count number of headlines for each level
                        $sublevelCount[$toclevel]++;
                        $dot = 0;
-                       for( $i = 1; $i <= $toclevel; $i++ ) {
+                       for ( $i = 1; $i <= $toclevel; $i++ ) {
                                if ( !empty( $sublevelCount[$i] ) ) {
                                        if ( $dot ) {
                                                $numbering .= '.';
@@ -4192,20 +4296,20 @@ class Parser {
                        # We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
                        # to allow setting directionality in toc items.
                        $tocline = preg_replace(
-                               array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?'.'>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?'.'>#' ),
+                               array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#' ),
                                array( '', '<$1>' ),
                                $safeHeadline
                        );
                        $tocline = trim( $tocline );
 
                        # For the anchor, strip out HTML-y stuff period
-                       $safeHeadline = preg_replace( '/<.*?'.'>/', '', $safeHeadline );
+                       $safeHeadline = preg_replace( '/<.*?' . '>/', '', $safeHeadline );
                        $safeHeadline = Sanitizer::normalizeSectionNameWhitespace( $safeHeadline );
 
                        # Save headline for section edit hint before it's escaped
                        $headlineHint = $safeHeadline;
 
-                       if ( $wgHtml5 && $wgExperimentalHtmlIds ) {
+                       if ( $wgExperimentalHtmlIds ) {
                                # For reverse compatibility, provide an id that's
                                # HTML4-compatible, like we used to.
                                #
@@ -4351,7 +4455,7 @@ class Parser {
                }
 
                # split up and insert constructed headlines
-               $blocks = preg_split( '/<H[1-6].*?' . '>.*?<\/H[1-6]>/i', $text );
+               $blocks = preg_split( '/<H[1-6].*?' . '>[\s\S]*?<\/H[1-6]>/i', $text );
                $i = 0;
 
                // build an array of document sections
@@ -4413,7 +4517,7 @@ class Parser {
                        "\r\n" => "\n",
                );
                $text = str_replace( array_keys( $pairs ), array_values( $pairs ), $text );
-               if( $options->getPreSaveTransform() ) {
+               if ( $options->getPreSaveTransform() ) {
                        $text = $this->pstPass2( $text, $user );
                }
                $text = $this->mStripState->unstripBoth( $text );
@@ -4532,8 +4636,9 @@ class Parser {
                $username = $user->getName();
 
                # If not given, retrieve from the user object.
-               if ( $nickname === false )
+               if ( $nickname === false ) {
                        $nickname = $user->getOption( 'nickname' );
+               }
 
                if ( is_null( $fancySig ) ) {
                        $fancySig = $user->getBoolOption( 'fancysig' );
@@ -4574,7 +4679,7 @@ class Parser {
         * @return mixed An expanded string, or false if invalid.
         */
        function validateSig( $text ) {
-               return( Xml::isWellFormedXmlFragment( $text ) ? $text : false );
+               return Xml::isWellFormedXmlFragment( $text ) ? $text : false;
        }
 
        /**
@@ -4812,8 +4917,9 @@ class Parser {
 
                # Add to function cache
                $mw = MagicWord::get( $id );
-               if ( !$mw )
+               if ( !$mw ) {
                        throw new MWException( __METHOD__ . '() expecting a magic word identifier.' );
+               }
 
                $synonyms = $mw->getSynonyms();
                $sensitive = intval( $mw->isCaseSensitive() );
@@ -4857,7 +4963,9 @@ class Parser {
         */
        function setFunctionTagHook( $tag, $callback, $flags ) {
                $tag = strtolower( $tag );
-               if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" );
+               if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) {
+                       throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" );
+               }
                $old = isset( $this->mFunctionTagHooks[$tag] ) ?
                        $this->mFunctionTagHooks[$tag] : null;
                $this->mFunctionTagHooks[$tag] = array( $callback, $flags );
@@ -4976,7 +5084,7 @@ class Parser {
                                        if ( $match = $magicWordAlt->matchVariableStartToEnd( $parameterMatch ) ) {
                                                $alt = $this->stripAltText( $match, false );
                                        }
-                                       elseif( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ) {
+                                       elseif ( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ) {
                                                $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
                                                $chars = self::EXT_LINK_URL_CLASS;
                                                $prots = $this->mUrlProtocols;
@@ -5116,14 +5224,14 @@ class Parser {
                                # Special case; width and height come in one variable together
                                if ( $type === 'handler' && $paramName === 'width' ) {
                                        $parsedWidthParam = $this->parseWidthParam( $value );
-                                       if( isset( $parsedWidthParam['width'] ) ) {
+                                       if ( isset( $parsedWidthParam['width'] ) ) {
                                                $width = $parsedWidthParam['width'];
                                                if ( $handler->validateParam( 'width', $width ) ) {
                                                        $params[$type]['width'] = $width;
                                                        $validated = true;
                                                }
                                        }
-                                       if( isset( $parsedWidthParam['height'] ) ) {
+                                       if ( isset( $parsedWidthParam['height'] ) ) {
                                                $height = $parsedWidthParam['height'];
                                                if ( $handler->validateParam( 'height', $height ) ) {
                                                        $params[$type]['height'] = $height;
@@ -5137,7 +5245,7 @@ class Parser {
                                                $validated = $handler->validateParam( $paramName, $value );
                                        } else {
                                                # Validate internal parameters
-                                               switch( $paramName ) {
+                                               switch ( $paramName ) {
                                                case 'manualthumb':
                                                case 'alt':
                                                case 'class':
@@ -5575,14 +5683,14 @@ class Parser {
         * @return String: user name
         */
        function getRevisionUser() {
-               if( is_null( $this->mRevisionUser ) ) {
+               if ( is_null( $this->mRevisionUser ) ) {
                        $revObject = $this->getRevisionObject();
 
                        # if this template is subst: the revision id will be blank,
                        # so just use the current user's name
-                       if( $revObject ) {
+                       if ( $revObject ) {
                                $this->mRevisionUser = $revObject->getUserText();
-                       } elseif( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
+                       } elseif ( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) {
                                $this->mRevisionUser = $this->getUser()->getName();
                        }
                }
@@ -5862,7 +5970,7 @@ class Parser {
         */
        public function parseWidthParam( $value ) {
                $parsedWidthParam = array();
-               if( $value === '' ) {
+               if ( $value === '' ) {
                        return $parsedWidthParam;
                }
                $m = array();
index 0faa40a..7c5eeb4 100644 (file)
@@ -67,7 +67,7 @@ class ParserCache {
 
                // idhash seem to mean 'page id' + 'rendering hash' (r3710)
                $pageid = $article->getID();
-               $renderkey = (int)($wgRequest->getVal( 'action' ) == 'render');
+               $renderkey = (int)( $wgRequest->getVal( 'action' ) == 'render' );
 
                $key = wfMemcKey( 'pcache', 'idhash', "{$pageid}-{$renderkey}!{$hash}" );
                return $key;
@@ -128,7 +128,7 @@ class ParserCache {
        public function getKey( $article, $popts, $useOutdated = true ) {
                global $wgCacheEpoch;
 
-               if( $popts instanceof User ) {
+               if ( $popts instanceof User ) {
                        wfWarn( "Use of outdated prototype ParserCache::getKey( &\$article, &\$user )\n" );
                        $popts = ParserOptions::newFromUser( $popts );
                }
@@ -227,7 +227,7 @@ class ParserCache {
        public function save( $parserOutput, $article, $popts ) {
                $expire = $parserOutput->getCacheExpiry();
 
-               if( $expire > 0 ) {
+               if ( $expire > 0 ) {
                        $now = wfTimestampNow();
 
                        $optionsKey = new CacheTime;
index 3eb83e3..b01f162 100644 (file)
@@ -312,7 +312,7 @@ class ParserOptions {
        function setAllowSpecialInclusion( $x )     { return wfSetVar( $this->mAllowSpecialInclusion, $x ); }
        function setTidy( $x )                      { return wfSetVar( $this->mTidy, $x ); }
 
-       /** @deprecated in 1.19; will be removed in 1.20 */
+       /** @deprecated in 1.19 */
        function setSkin( $x )                      { wfDeprecated( __METHOD__, '1.19' ); }
        function setInterfaceMessage( $x )          { return wfSetVar( $this->mInterfaceMessage, $x ); }
        function setTargetLanguage( $x )            { return wfSetVar( $this->mTargetLanguage, $x, true ); }
@@ -538,7 +538,7 @@ class ParserOptions {
 
                // add in language specific options, if any
                // @todo FIXME: This is just a way of retrieving the url/user preferred variant
-               if( !is_null( $title ) ) {
+               if ( !is_null( $title ) ) {
                        $confstr .= $title->getPageLanguage()->getExtraHashOptions();
                } else {
                        global $wgContLang;
@@ -557,8 +557,9 @@ class ParserOptions {
                        $confstr .= '!printable=1';
                }
 
-               if ( $this->mExtraKey != '' )
+               if ( $this->mExtraKey != '' ) {
                        $confstr .= $this->mExtraKey;
+               }
 
                // Give a chance for extensions to modify the hash, if they have
                // extra options or other effects on the parser cache.
index 3af3b7a..29b3500 100644 (file)
@@ -67,8 +67,22 @@ class ParserOutput extends CacheTime {
 
        function getText() {
                if ( $this->mEditSectionTokens ) {
+                       $text = $this->mText;
+
+                       // If there's old output with misplaced editsections links cached, mangle it to put them in
+                       // the right position. We can assume that there is no '</hN>' inside header tags, making this
+                       // possible to do with a regex.
+                       $text = preg_replace(
+                               //            [ this part is like EDITSECTION_REGEX, but with non-capturing groups                           ]
+                               //                                                                                  note the space here ------v
+                               '#(<[hH](\d)>)(<(?:mw:)?editsection page="(?:.*?)" section="(?:.*?)"(?:/>|>(?:.*?)(?:</(?:mw:)?editsection>))) ([\s\S]*?)(</[hH]\2>)#',
+                               // swap the order of content and editsection link - $2 is ignored since it's the number in hN's tag name
+                               '$1$4 $3$5',
+                               $text
+                       );
+
                        return preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
-                               array( &$this, 'replaceEditSectionLinksCallback' ), $this->mText );
+                               array( &$this, 'replaceEditSectionLinksCallback' ), $text );
                }
                return preg_replace( ParserOutput::EDITSECTION_REGEX, '', $this->mText );
        }
@@ -176,10 +190,10 @@ class ParserOutput extends CacheTime {
                global $wgServer, $wgRegisterInternalExternals;
 
                $registerExternalLink = true;
-               if( !$wgRegisterInternalExternals ) {
+               if ( !$wgRegisterInternalExternals ) {
                        $registerExternalLink = !self::isLinkInternal( $wgServer, $url );
                }
-               if( $registerExternalLink ) {
+               if ( $registerExternalLink ) {
                        $this->mExternalLinks[$url] = 1;
                }
        }
@@ -201,11 +215,11 @@ class ParserOutput extends CacheTime {
                if ( $ns == NS_MEDIA ) {
                        // Normalize this pseudo-alias if it makes it down here...
                        $ns = NS_FILE;
-               } elseif( $ns == NS_SPECIAL ) {
+               } elseif ( $ns == NS_SPECIAL ) {
                        // We don't record Special: links currently
                        // It might actually be wise to, but we'd need to do some normalization.
                        return;
-               } elseif( $dbk === '' ) {
+               } elseif ( $dbk === '' ) {
                        // Don't record self links -  [[#Foo]]
                        return;
                }
@@ -258,7 +272,7 @@ class ParserOutput extends CacheTime {
         */
        function addInterwikiLink( $title ) {
                $prefix = $title->getInterwiki();
-               if( $prefix == '' ) {
+               if ( $prefix == '' ) {
                        throw new MWException( 'Non-interwiki link passed, internal parser error.' );
                }
                if ( !isset( $this->mInterwikiLinks[$prefix] ) ) {
@@ -329,7 +343,7 @@ class ParserOutput extends CacheTime {
         */
        public function getDisplayTitle() {
                $t = $this->getTitleText();
-               if( $t === '' ) {
+               if ( $t === '' ) {
                        return false;
                }
                return $t;
index f25340f..aeae234 100644 (file)
@@ -122,7 +122,7 @@ class Parser_DiffTest
 
        function setFunctionHook( $id, $callback, $flags = 0 ) {
                $this->init();
-               foreach  ( $this->parsers as $parser ) {
+               foreach ( $this->parsers as $parser ) {
                        $parser->setFunctionHook( $id, $callback, $flags );
                }
        }
diff --git a/includes/parser/Parser_LinkHooks.php b/includes/parser/Parser_LinkHooks.php
deleted file mode 100644 (file)
index b2cdc41..0000000
+++ /dev/null
@@ -1,326 +0,0 @@
-<?php
-/**
- * Modified version of the PHP parser with hooks for wiki links; experimental
- *
- * 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 Parser
- */
-
-/**
- * Parser with LinkHooks experiment
- * @ingroup Parser
- */
-class Parser_LinkHooks extends Parser {
-       /**
-        * Update this version number when the ParserOutput format
-        * changes in an incompatible way, so the parser cache
-        * can automatically discard old data.
-        */
-       const VERSION = '1.6.4';
-
-       # Flags for Parser::setLinkHook
-       # Also available as global constants from Defines.php
-       const SLH_PATTERN = 1;
-
-       # Constants needed for external link processing
-       # Everything except bracket, space, or control characters
-       const EXT_LINK_URL_CLASS = '[^][<>"\\x00-\\x20\\x7F]';
-       const EXT_IMAGE_REGEX = '/^(http:\/\/|https:\/\/)([^][<>"\\x00-\\x20\\x7F]+)
-               \\/([A-Za-z0-9_.,~%\\-+&;#*?!=()@\\x80-\\xFF]+)\\.((?i)gif|png|jpg|jpeg)$/Sx';
-
-       /**#@+
-        * @private
-        */
-       # Persistent:
-       var $mLinkHooks;
-
-       /**#@-*/
-
-       /**
-        * Constructor
-        */
-       public function __construct( $conf = array() ) {
-               parent::__construct( $conf );
-               $this->mLinkHooks = array();
-       }
-
-       /**
-        * Do various kinds of initialisation on the first call of the parser
-        */
-       function firstCallInit() {
-               parent::__construct();
-               if ( !$this->mFirstCall ) {
-                       return;
-               }
-               $this->mFirstCall = false;
-
-               wfProfileIn( __METHOD__ );
-
-               $this->setHook( 'pre', array( $this, 'renderPreTag' ) );
-               CoreParserFunctions::register( $this );
-               CoreLinkFunctions::register( $this );
-               $this->initialiseVariables();
-
-               wfRunHooks( 'ParserFirstCallInit', array( &$this ) );
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * Create a link hook, e.g. [[Namepsace:...|display}}
-        * The callback function should have the form:
-        *    function myLinkCallback( $parser, $holders, $markers,
-        *      Title $title, $titleText, &$sortText = null, &$leadingColon = false ) { ... }
-        *
-        * Or with SLH_PATTERN:
-        *    function myLinkCallback( $parser, $holders, $markers, )
-        *      &$titleText, &$sortText = null, &$leadingColon = false ) { ... }
-        *
-        * The callback may either return a number of different possible values:
-        * String) Text result of the link
-        * True) (Treat as link) Parse the link according to normal link rules
-        * False) (Bad link) Just output the raw wikitext (You may modify the text first)
-        *
-        * @param $ns Integer or String: the Namespace ID or regex pattern if SLH_PATTERN is set
-        * @param $callback Mixed: the callback function (and object) to use
-        * @param $flags Integer: a combination of the following flags:
-        *     SLH_PATTERN   Use a regex link pattern rather than a namespace
-        *
-        * @throws MWException
-        * @return callback|null The old callback function for this name, if any
-        */
-       public function setLinkHook( $ns, $callback, $flags = 0 ) {
-               if( $flags & SLH_PATTERN && !is_string($ns) )
-                       throw new MWException( __METHOD__ . '() expecting a regex string pattern.' );
-               elseif( $flags | ~SLH_PATTERN && !is_int( $ns ) )
-                       throw new MWException( __METHOD__ . '() expecting a namespace index.' );
-               $oldVal = isset( $this->mLinkHooks[$ns] ) ? $this->mLinkHooks[$ns][0] : null;
-               $this->mLinkHooks[$ns] = array( $callback, $flags );
-               return $oldVal;
-       }
-
-       /**
-        * Get all registered link hook identifiers
-        *
-        * @return array
-        */
-       function getLinkHooks() {
-               return array_keys( $this->mLinkHooks );
-       }
-
-       /**
-        * Process [[ ]] wikilinks
-        * @param $s
-        * @throws MWException
-        * @return LinkHolderArray
-        *
-        * @private
-        */
-       function replaceInternalLinks2( &$s ) {
-               wfProfileIn( __METHOD__ );
-
-               wfProfileIn( __METHOD__ . '-setup' );
-               static $tc = false, $titleRegex; //$e1, $e1_img;
-               if( !$tc ) {
-                       # the % is needed to support urlencoded titles as well
-                       $tc = Title::legalChars() . '#%';
-                       # Match a link having the form [[namespace:link|alternate]]trail
-                       //$e1 = "/^([{$tc}]+)(?:\\|(.+?))?]](.*)\$/sD";
-                       # Match cases where there is no "]]", which might still be images
-                       //$e1_img = "/^([{$tc}]+)\\|(.*)\$/sD";
-                       # Match a valid plain title
-                       $titleRegex = "/^([{$tc}]+)$/sD";
-               }
-
-               $holders = new LinkHolderArray( $this );
-
-               if( is_null( $this->mTitle ) ) {
-                       wfProfileOut( __METHOD__ . '-setup' );
-                       wfProfileOut( __METHOD__ );
-                       throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
-               }
-
-               wfProfileOut( __METHOD__ . '-setup' );
-
-               $offset = 0;
-               $offsetStack = array();
-               $markers = new LinkMarkerReplacer( $this, $holders, array( &$this, 'replaceInternalLinksCallback' ) );
-               while( true ) {
-                       $startBracketOffset = strpos( $s, '[[', $offset );
-                       $endBracketOffset   = strpos( $s, ']]', $offset );
-                       # Finish when there are no more brackets
-                       if( $startBracketOffset === false && $endBracketOffset === false ) break;
-                       # Determine if the bracket is a starting or ending bracket
-                       # When we find both, use the first one
-                       elseif( $startBracketOffset !== false && $endBracketOffset !== false )
-                               $isStart = $startBracketOffset <= $endBracketOffset;
-                       # When we only found one, check which it is
-                       else $isStart = $startBracketOffset !== false;
-                       $bracketOffset = $isStart ? $startBracketOffset : $endBracketOffset;
-                       if( $isStart ) {
-                               /** Opening bracket **/
-                               # Just push our current offset in the string onto the stack
-                               $offsetStack[] = $startBracketOffset;
-                       } else {
-                               /** Closing bracket **/
-                               # Pop the start pos for our current link zone off the stack
-                               $startBracketOffset = array_pop( $offsetStack );
-                               # Just to clean up the code, lets place offsets on the outer ends
-                               $endBracketOffset += 2;
-
-                               # Only do logic if we actually have a opening bracket for this
-                               if( isset( $startBracketOffset ) ) {
-                                       # Extract text inside the link
-                                       @list( $titleText, $paramText ) = explode( '|',
-                                               substr( $s, $startBracketOffset + 2, $endBracketOffset - $startBracketOffset - 4 ), 2 );
-                                       # Create markers only for valid links
-                                       if( preg_match( $titleRegex, $titleText ) ) {
-                                               # Store the text for the marker
-                                               $marker = $markers->addMarker( $titleText, $paramText );
-                                               # Replace the current link with the marker
-                                               $s = substr( $s, 0, $startBracketOffset ) .
-                                                       $marker .
-                                                       substr( $s, $endBracketOffset );
-                                               # We have modified $s, because of this we need to set the
-                                               # offset manually since the end position is different now
-                                               $offset = $startBracketOffset+strlen( $marker );
-                                               continue;
-                                       }
-                                       # ToDo: Some LinkHooks may allow recursive links inside of
-                                       # the link text, create a regex that also matches our
-                                       # <!-- LINKMARKER ### --> sequence in titles
-                                       # ToDO: Some LinkHooks use patterns rather than namespaces
-                                       # these need to be tested at this point here
-                               }
-                       }
-                       # Bump our offset to after our current bracket
-                       $offset = $bracketOffset+2;
-               }
-
-               # Now expand our tree
-               wfProfileIn( __METHOD__ . '-expand' );
-               $s = $markers->expand( $s );
-               wfProfileOut( __METHOD__ . '-expand' );
-
-               wfProfileOut( __METHOD__ );
-               return $holders;
-       }
-
-       function replaceInternalLinksCallback( $parser, $holders, $markers, $titleText, $paramText ) {
-               wfProfileIn( __METHOD__ );
-               $wt = isset( $paramText ) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
-               wfProfileIn( __METHOD__ . "-misc" );
-
-               # Don't allow internal links to pages containing
-               # PROTO: where PROTO is a valid URL protocol; these
-               # should be external links.
-               if( preg_match( '/^\b(?i:' . wfUrlProtocols() . ')/', $titleText ) ) {
-                       wfProfileOut( __METHOD__ . "-misc" );
-                       wfProfileOut( __METHOD__ );
-                       return $wt;
-               }
-
-               # Make subpage if necessary
-               if( $this->areSubpagesAllowed() ) {
-                       $titleText = $this->maybeDoSubpageLink( $titleText, $paramText );
-               }
-
-               # Check for a leading colon and strip it if it is there
-               $leadingColon = $titleText[0] == ':';
-               if( $leadingColon ) $titleText = substr( $titleText, 1 );
-
-               wfProfileOut( __METHOD__ . "-misc" );
-               # Make title object
-               wfProfileIn( __METHOD__ . "-title" );
-               $title = Title::newFromText( $this->mStripState->unstripNoWiki( $titleText ) );
-               if( !$title ) {
-                       wfProfileOut( __METHOD__ . "-title" );
-                       wfProfileOut( __METHOD__ );
-                       return $wt;
-               }
-               $ns = $title->getNamespace();
-               wfProfileOut( __METHOD__ . "-title" );
-
-               # Default for Namespaces is a default link
-               # ToDo: Default for patterns is plain wikitext
-               $return = true;
-               if( isset( $this->mLinkHooks[$ns] ) ) {
-                       list( $callback, $flags ) = $this->mLinkHooks[$ns];
-                       if( $flags & SLH_PATTERN ) {
-                               $args = array( $parser, $holders, $markers, $titleText, &$paramText, &$leadingColon );
-                       } else {
-                               $args = array( $parser, $holders, $markers, $title, $titleText, &$paramText, &$leadingColon );
-                       }
-                       # Workaround for PHP bug 35229 and similar
-                       if ( !is_callable( $callback ) ) {
-                               throw new MWException( "Tag hook for namespace $ns is not callable\n" );
-                       }
-                       $return = call_user_func_array( $callback, $args );
-               }
-               if( $return === true ) {
-                       # True (treat as plain link) was returned, call the defaultLinkHook
-                       $return = CoreLinkFunctions::defaultLinkHook( $parser, $holders, $markers, $title,
-                               $titleText, $paramText, $leadingColon );
-               }
-               if( $return === false ) {
-                       # False (no link) was returned, output plain wikitext
-                       # Build it again as the hook is allowed to modify $paramText
-                       $return = isset( $paramText ) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
-               }
-               # Content was returned, return it
-               wfProfileOut( __METHOD__ );
-               return $return;
-       }
-
-}
-
-class LinkMarkerReplacer {
-
-       protected $markers, $nextId, $parser, $holders, $callback;
-
-       function __construct( $parser, $holders, $callback ) {
-               $this->nextId   = 0;
-               $this->markers  = array();
-               $this->parser   = $parser;
-               $this->holders  = $holders;
-               $this->callback = $callback;
-       }
-
-       function addMarker( $titleText, $paramText ) {
-               $id = $this->nextId++;
-               $this->markers[$id] = array( $titleText, $paramText );
-               return "<!-- LINKMARKER $id -->";
-       }
-
-       function findMarker( $string ) {
-               return (bool) preg_match( '/<!-- LINKMARKER [0-9]+ -->/', $string );
-       }
-
-       function expand( $string ) {
-               return StringUtils::delimiterReplaceCallback( "<!-- LINKMARKER ", " -->", array( &$this, 'callback' ), $string );
-       }
-
-       function callback( $m ) {
-               $id = intval( $m[1] );
-               if( !array_key_exists( $id, $this->markers ) ) return $m[0];
-               $args = $this->markers[$id];
-               array_unshift( $args, $this );
-               array_unshift( $args, $this->holders );
-               array_unshift( $args, $this->parser );
-               return call_user_func_array( $this->callback, $args );
-       }
-}
index d0c57ab..809e7f7 100644 (file)
@@ -72,9 +72,8 @@ class Preprocessor_DOM implements Preprocessor {
                $xml = "<list>";
 
                foreach ( $values as $k => $val ) {
-
                        if ( is_int( $k ) ) {
-                               $xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) ."</value></part>";
+                               $xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) . "</value></part>";
                        } else {
                                $xml .= "<part><name>" . htmlspecialchars( $k ) . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
                        }
@@ -149,26 +148,28 @@ class Preprocessor_DOM implements Preprocessor {
                                        wfDebugLog( "Preprocessor", "Loaded preprocessor XML from memcached (key $cacheKey)" );
                                }
                        }
-               }
-               if ( $xml === false ) {
-                       if ( $cacheable ) {
+                       if ( $xml === false ) {
                                wfProfileIn( __METHOD__ . '-cache-miss' );
                                $xml = $this->preprocessToXml( $text, $flags );
                                $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . $xml;
                                $wgMemc->set( $cacheKey, $cacheValue, 86400 );
                                wfProfileOut( __METHOD__ . '-cache-miss' );
                                wfDebugLog( "Preprocessor", "Saved preprocessor XML to memcached (key $cacheKey)" );
-                       } else {
-                               $xml = $this->preprocessToXml( $text, $flags );
                        }
-
+               } else {
+                       $xml = $this->preprocessToXml( $text, $flags );
                }
 
+
                // Fail if the number of elements exceeds acceptable limits
                // Do not attempt to generate the DOM
                $this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
                $max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
                if ( $this->parser->mGeneratedPPNodeCount > $max ) {
+                       if ( $cacheable ) {
+                               wfProfileOut( __METHOD__ . '-cacheable' );
+                       }
+                       wfProfileOut( __METHOD__ );
                        throw new MWException( __METHOD__ . ': generated node count limit exceeded' );
                }
 
@@ -183,6 +184,11 @@ class Preprocessor_DOM implements Preprocessor {
                        // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
                        $result = $dom->loadXML( $xml, 1 << 19 );
                        if ( !$result ) {
+                               wfProfileOut( __METHOD__ . '-loadXML' );
+                               if ( $cacheable ) {
+                                       wfProfileOut( __METHOD__ . '-cacheable' );
+                               }
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( __METHOD__ . ' generated invalid XML' );
                        }
                }
@@ -397,7 +403,7 @@ class Preprocessor_DOM implements Preprocessor {
 
                                                if ( $stack->top ) {
                                                        $part = $stack->top->getCurrentPart();
-                                                       if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+                                                       if ( !( isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 ) ) {
                                                                $part->visualEnd = $wsStart;
                                                        }
                                                        // Else comments abutting, no change in visual end
@@ -432,7 +438,7 @@ class Preprocessor_DOM implements Preprocessor {
                                }
 
                                $tagStartPos = $i;
-                               if ( $text[$tagEndPos-1] == '/' ) {
+                               if ( $text[$tagEndPos - 1] == '/' ) {
                                        $attrEnd = $tagEndPos - 1;
                                        $inner = null;
                                        $i = $tagEndPos + 1;
@@ -569,7 +575,7 @@ class Preprocessor_DOM implements Preprocessor {
                                                'open' => $curChar,
                                                'close' => $rule['end'],
                                                'count' => $count,
-                                               'lineStart' => ($i > 0 && $text[$i-1] == "\n"),
+                                               'lineStart' => ( $i > 0 && $text[$i - 1] == "\n" ),
                                        );
 
                                        $stack->push( $piece );
@@ -746,7 +752,7 @@ class PPDStack {
                        $class = $this->elementClass;
                        $this->stack[] = new $class( $data );
                }
-               $this->top = $this->stack[ count( $this->stack ) - 1 ];
+               $this->top = $this->stack[count( $this->stack ) - 1];
                $this->accum =& $this->top->getAccum();
        }
 
@@ -757,7 +763,7 @@ class PPDStack {
                $temp = array_pop( $this->stack );
 
                if ( count( $this->stack ) ) {
-                       $this->top = $this->stack[ count( $this->stack ) - 1 ];
+                       $this->top = $this->stack[count( $this->stack ) - 1];
                        $this->accum =& $this->top->getAccum();
                } else {
                        $this->top = self::$false;
@@ -1014,11 +1020,13 @@ class PPFrame_DOM implements PPFrame {
 
                while ( count( $iteratorStack ) > 1 ) {
                        $level = count( $outStack ) - 1;
-                       $iteratorNode =& $iteratorStack[ $level ];
+                       $iteratorNode =& $iteratorStack[$level];
                        $out =& $outStack[$level];
                        $index =& $indexStack[$level];
 
-                       if ( $iteratorNode instanceof PPNode_DOM ) $iteratorNode = $iteratorNode->node;
+                       if ( $iteratorNode instanceof PPNode_DOM ) {
+                               $iteratorNode = $iteratorNode->node;
+                       }
 
                        if ( is_array( $iteratorNode ) ) {
                                if ( $index >= count( $iteratorNode ) ) {
@@ -1148,9 +1156,7 @@ class PPFrame_DOM implements PPFrame {
 
                                        # Insert a heading marker only for <h> children of <root>
                                        # This is to stop extractSections from going over multiple tree levels
-                                       if ( $contextNode->parentNode->nodeName == 'root'
-                                         && $this->parser->ot['html'] )
-                                       {
+                                       if ( $contextNode->parentNode->nodeName == 'root' && $this->parser->ot['html'] ) {
                                                # Insert heading index marker
                                                $headingIndex = $contextNode->getAttribute( 'i' );
                                                $titleText = $this->title->getPrefixedDBkey();
@@ -1206,7 +1212,9 @@ class PPFrame_DOM implements PPFrame {
                $first = true;
                $s = '';
                foreach ( $args as $root ) {
-                       if ( $root instanceof PPNode_DOM ) $root = $root->node;
+                       if ( $root instanceof PPNode_DOM ) {
+                               $root = $root->node;
+                       }
                        if ( !is_array( $root ) && !( $root instanceof DOMNodeList ) ) {
                                $root = array( $root );
                        }
index fad1adb..654a66e 100644 (file)
@@ -332,7 +332,7 @@ class Preprocessor_Hash implements Preprocessor {
 
                                                if ( $stack->top ) {
                                                        $part = $stack->top->getCurrentPart();
-                                                       if ( !(isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 )) {
+                                                       if ( !( isset( $part->commentEnd ) && $part->commentEnd == $wsStart - 1 ) ) {
                                                                $part->visualEnd = $wsStart;
                                                        }
                                                        // Else comments abutting, no change in visual end
@@ -367,7 +367,7 @@ class Preprocessor_Hash implements Preprocessor {
                                }
 
                                $tagStartPos = $i;
-                               if ( $text[$tagEndPos-1] == '/' ) {
+                               if ( $text[$tagEndPos - 1] == '/' ) {
                                        // Short end tag
                                        $attrEnd = $tagEndPos - 1;
                                        $inner = null;
@@ -515,7 +515,7 @@ class Preprocessor_Hash implements Preprocessor {
                                                'open' => $curChar,
                                                'close' => $rule['end'],
                                                'count' => $count,
-                                               'lineStart' => ($i > 0 && $text[$i-1] == "\n"),
+                                               'lineStart' => ( $i > 0 && $text[$i - 1] == "\n" ),
                                        );
 
                                        $stack->push( $piece );
@@ -591,9 +591,19 @@ class Preprocessor_Hash implements Preprocessor {
                                                                $lastNode = $node;
                                                        }
                                                        if ( !$node ) {
+                                                               if ( $cacheable ) {
+                                                                       wfProfileOut( __METHOD__ . '-cache-miss' );
+                                                                       wfProfileOut( __METHOD__ . '-cacheable' );
+                                                               }
+                                                               wfProfileOut( __METHOD__ );
                                                                throw new MWException( __METHOD__ . ': eqpos not found' );
                                                        }
                                                        if ( $node->name !== 'equals' ) {
+                                                               if ( $cacheable ) {
+                                                                       wfProfileOut( __METHOD__ . '-cache-miss' );
+                                                                       wfProfileOut( __METHOD__ . '-cacheable' );
+                                                               }
+                                                               wfProfileOut( __METHOD__ );
                                                                throw new MWException( __METHOD__ . ': eqpos is not equals' );
                                                        }
                                                        $equalsNode = $node;
@@ -952,7 +962,7 @@ class PPFrame_Hash implements PPFrame {
 
                while ( count( $iteratorStack ) > 1 ) {
                        $level = count( $outStack ) - 1;
-                       $iteratorNode =& $iteratorStack[ $level ];
+                       $iteratorNode =& $iteratorStack[$level];
                        $out =& $outStack[$level];
                        $index =& $indexStack[$level];
 
index 0f7e0d3..0625140 100644 (file)
@@ -158,7 +158,7 @@ class MWTidy {
                global $wgTidyInternal;
 
                $retval = 0;
-               if( $wgTidyInternal ) {
+               if ( $wgTidyInternal ) {
                        $errorStr = self::execInternalTidy( $text, true, $retval );
                } else {
                        $errorStr = self::execExternalTidy( $text, true, $retval );
@@ -244,7 +244,7 @@ class MWTidy {
                global $wgTidyConf, $wgDebugTidy;
                wfProfileIn( __METHOD__ );
 
-               if ( !MWInit::classExists( 'tidy' ) ) {
+               if ( !class_exists( 'tidy' ) ) {
                        wfWarn( "Unable to load internal tidy class." );
                        $retval = -1;
 
index 5ecdc4f..7ca4c2d 100644 (file)
  * @param string $functionname name of the function we will profile
  */
 function wfProfileIn( $functionname ) {
-       global $wgProfiler;
-       if ( $wgProfiler instanceof Profiler || isset( $wgProfiler['class'] ) ) {
+       if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
+               Profiler::instance();
+       }
+       if ( Profiler::$__instance && !( Profiler::$__instance instanceof ProfilerStub ) ) {
                Profiler::instance()->profileIn( $functionname );
        }
 }
@@ -42,22 +44,64 @@ function wfProfileIn( $functionname ) {
  * @param string $functionname name of the function we have profiled
  */
 function wfProfileOut( $functionname = 'missing' ) {
-       global $wgProfiler;
-       if ( $wgProfiler instanceof Profiler || isset( $wgProfiler['class'] ) ) {
+       if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
+               Profiler::instance();
+       }
+       if ( Profiler::$__instance && !( Profiler::$__instance instanceof ProfilerStub ) ) {
                Profiler::instance()->profileOut( $functionname );
        }
 }
 
+/**
+ * Class for handling function-scope profiling
+ *
+ * @since 1.22
+ */
+class ProfileSection {
+       protected $name; // string; method name
+       protected $enabled = false; // boolean; whether profiling is enabled
+
+       /**
+        * Begin profiling of a function and return an object that ends profiling of
+        * the function when that object leaves scope. As long as the object is not
+        * specifically linked to other objects, it will fall out of scope at the same
+        * moment that the function to be profiled terminates.
+        *
+        * This is typically called like:
+        * <code>$section = new ProfileSection( __METHOD__ );</code>
+        *
+        * @param string $name Name of the function to profile
+        */
+       public function __construct( $name ) {
+               $this->name = $name;
+               if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
+                       Profiler::instance();
+               }
+               if ( Profiler::$__instance && !( Profiler::$__instance instanceof ProfilerStub ) ) {
+                       $this->enabled = true;
+                       Profiler::$__instance->profileIn( $this->name );
+               }
+       }
+
+       function __destruct() {
+               if ( $this->enabled ) {
+                       Profiler::$__instance->profileOut( $this->name );
+               }
+       }
+}
+
 /**
  * @ingroup Profiler
  * @todo document
  */
 class Profiler {
-       protected $mStack = array(), $mWorkStack = array (), $mCollated = array (),
-               $mCalls = array (), $mTotals = array ();
+       protected $mStack = array(), $mWorkStack = array(), $mCollated = array(),
+               $mCalls = array(), $mTotals = array();
        protected $mTimeMetric = 'wall';
        protected $mProfileID = false, $mCollateDone = false, $mTemplated = false;
-       private static $__instance = null;
+
+       /** @var Profiler */
+       public static $__instance = null; // do not call this outside Profiler and ProfileSection
 
        function __construct( $params ) {
                if ( isset( $params['timeMetric'] ) ) {
@@ -75,22 +119,18 @@ class Profiler {
         * @return Profiler
         */
        public static function instance() {
-               if( is_null( self::$__instance ) ) {
+               if ( self::$__instance === null ) {
                        global $wgProfiler;
-                       if( is_array( $wgProfiler ) ) {
-                               if( !isset( $wgProfiler['class'] ) ) {
-                                       wfDebug( __METHOD__ . " called without \$wgProfiler['class']"
-                                               . " set, falling back to ProfilerStub for safety\n" );
+                       if ( is_array( $wgProfiler ) ) {
+                               if ( !isset( $wgProfiler['class'] ) ) {
                                        $class = 'ProfilerStub';
                                } else {
                                        $class = $wgProfiler['class'];
                                }
                                self::$__instance = new $class( $wgProfiler );
-                       } elseif( $wgProfiler instanceof Profiler ) {
+                       } elseif ( $wgProfiler instanceof Profiler ) {
                                self::$__instance = $wgProfiler; // back-compat
                        } else {
-                               wfDebug( __METHOD__ . ' called with bogus $wgProfiler setting,'
-                                               . " falling back to ProfilerStub for safety\n" );
                                self::$__instance = new ProfilerStub( $wgProfiler );
                        }
                }
@@ -157,7 +197,7 @@ class Profiler {
         */
        public function profileIn( $functionname ) {
                global $wgDebugFunctionEntry;
-               if( $wgDebugFunctionEntry ) {
+               if ( $wgDebugFunctionEntry ) {
                        $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) . 'Entering ' . $functionname . "\n" );
                }
 
@@ -174,7 +214,7 @@ class Profiler {
                $memory = memory_get_usage();
                $time = $this->getTime();
 
-               if( $wgDebugFunctionEntry ) {
+               if ( $wgDebugFunctionEntry ) {
                        $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) . 'Exiting ' . $functionname . "\n" );
                }
 
@@ -184,12 +224,11 @@ class Profiler {
                        $this->debug( "Profiling error, !\$bit: $functionname\n" );
                } else {
                        //if( $wgDebugProfiling ) {
-                               if( $functionname == 'close' ) {
+                               if ( $functionname == 'close' ) {
                                        $message = "Profile section ended by close(): {$bit[0]}";
                                        $this->debug( "$message\n" );
                                        $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
-                               }
-                               elseif( $bit[0] != $functionname ) {
+                               } elseif ( $bit[0] != $functionname ) {
                                        $message = "Profiling error: in({$bit[0]}), out($functionname)";
                                        $this->debug( "$message\n" );
                                        $this->mStack[] = array( $message, 0, 0.0, 0, 0.0, 0 );
@@ -205,7 +244,7 @@ class Profiler {
         * Close opened profiling sections
         */
        public function close() {
-               while( count( $this->mWorkStack ) ) {
+               while ( count( $this->mWorkStack ) ) {
                        $this->profileOut( 'close' );
                }
        }
@@ -228,11 +267,11 @@ class Profiler {
                global $wgDebugFunctionEntry, $wgProfileCallTree;
                $wgDebugFunctionEntry = false;
 
-               if( !count( $this->mStack ) && !count( $this->mCollated ) ) {
+               if ( !count( $this->mStack ) && !count( $this->mCollated ) ) {
                        return "No profiling output\n";
                }
 
-               if( $wgProfileCallTree ) {
+               if ( $wgProfileCallTree ) {
                        return $this->getCallTree();
                } else {
                        return $this->getFunctionReport();
@@ -254,16 +293,16 @@ class Profiler {
         * @return array
         */
        function remapCallTree( $stack ) {
-               if( count( $stack ) < 2 ) {
+               if ( count( $stack ) < 2 ) {
                        return $stack;
                }
-               $outputs = array ();
-               for( $max = count( $stack ) - 1; $max > 0; ) {
+               $outputs = array();
+               for ( $max = count( $stack ) - 1; $max > 0; ) {
                        /* Find all items under this entry */
                        $level = $stack[$max][1];
-                       $working = array ();
-                       for( $i = $max -1; $i >= 0; $i-- ) {
-                               if( $stack[$i][1] > $level ) {
+                       $working = array();
+                       for ( $i = $max -1; $i >= 0; $i-- ) {
+                               if ( $stack[$i][1] > $level ) {
                                        $working[] = $stack[$i];
                                } else {
                                        break;
@@ -271,7 +310,7 @@ class Profiler {
                        }
                        $working = $this->remapCallTree( array_reverse( $working ) );
                        $output = array();
-                       foreach( $working as $item ) {
+                       foreach ( $working as $item ) {
                                array_push( $output, $item );
                        }
                        array_unshift( $output, $stack[$max] );
@@ -280,8 +319,8 @@ class Profiler {
                        array_unshift( $outputs, $output );
                }
                $final = array();
-               foreach( $outputs as $output ) {
-                       foreach( $output as $item ) {
+               foreach ( $outputs as $output ) {
+                       foreach ( $output as $item ) {
                                $final[] = $item;
                        }
                }
@@ -391,18 +430,17 @@ class Profiler {
 
                # First, subtract the overhead!
                $overheadTotal = $overheadMemory = $overheadInternal = array();
-               foreach( $this->mStack as $entry ) {
+               foreach ( $this->mStack as $entry ) {
                        $fname = $entry[0];
                        $start = $entry[2];
                        $end = $entry[4];
                        $elapsed = $end - $start;
                        $memory = $entry[5] - $entry[3];
 
-                       if( $fname == '-overhead-total' ) {
+                       if ( $fname == '-overhead-total' ) {
                                $overheadTotal[] = $elapsed;
                                $overheadMemory[] = $memory;
-                       }
-                       elseif( $fname == '-overhead-internal' ) {
+                       } elseif ( $fname == '-overhead-internal' ) {
                                $overheadInternal[] = $elapsed;
                        }
                }
@@ -411,7 +449,7 @@ class Profiler {
                $overheadInternal = $overheadInternal ? array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
 
                # Collate
-               foreach( $this->mStack as $index => $entry ) {
+               foreach ( $this->mStack as $index => $entry ) {
                        $fname = $entry[0];
                        $start = $entry[2];
                        $end = $entry[4];
@@ -420,16 +458,16 @@ class Profiler {
                        $memory = $entry[5] - $entry[3];
                        $subcalls = $this->calltreeCount( $this->mStack, $index );
 
-                       if( !preg_match( '/^-overhead/', $fname ) ) {
+                       if ( !preg_match( '/^-overhead/', $fname ) ) {
                                # Adjust for profiling overhead (except special values with elapsed=0
-                               if( $elapsed ) {
+                               if ( $elapsed ) {
                                        $elapsed -= $overheadInternal;
-                                       $elapsed -= ($subcalls * $overheadTotal);
-                                       $memory -= ($subcalls * $overheadMemory);
+                                       $elapsed -= ( $subcalls * $overheadTotal );
+                                       $memory -= ( $subcalls * $overheadMemory );
                                }
                        }
 
-                       if( !array_key_exists( $fname, $this->mCollated ) ) {
+                       if ( !array_key_exists( $fname, $this->mCollated ) ) {
                                $this->mCollated[$fname] = 0;
                                $this->mCalls[$fname] = 0;
                                $this->mMemory[$fname] = 0;
@@ -467,11 +505,21 @@ class Profiler {
 
                $total = isset( $this->mCollated['-total'] ) ? $this->mCollated['-total'] : 0;
 
-               foreach( $this->mCollated as $fname => $elapsed ) {
+               foreach ( $this->mCollated as $fname => $elapsed ) {
                        $calls = $this->mCalls[$fname];
                        $percent = $total ? 100. * $elapsed / $total : 0;
                        $memory = $this->mMemory[$fname];
-                       $prof .= sprintf( $format, substr( $fname, 0, $nameWidth ), $calls, (float) ($elapsed * 1000), (float) ($elapsed * 1000) / $calls, $percent, $memory, ( $this->mMin[$fname] * 1000.0 ), ( $this->mMax[$fname] * 1000.0 ), $this->mOverhead[$fname] );
+                       $prof .= sprintf( $format,
+                               substr( $fname, 0, $nameWidth ),
+                               $calls,
+                               (float) ( $elapsed * 1000 ),
+                               (float) ( $elapsed * 1000 ) / $calls,
+                               $percent,
+                               $memory,
+                               ( $this->mMin[$fname] * 1000.0 ),
+                               ( $this->mMax[$fname] * 1000.0 ),
+                               $this->mOverhead[$fname]
+                       );
                }
                $prof .= "\nTotal: $total\n\n";
 
@@ -483,7 +531,7 @@ class Profiler {
         */
        protected static function calculateOverhead( $profileCount ) {
                wfProfileIn( '-overhead-total' );
-               for( $i = 0; $i < $profileCount; $i++ ) {
+               for ( $i = 0; $i < $profileCount; $i++ ) {
                        wfProfileIn( '-overhead-internal' );
                        wfProfileOut( '-overhead-internal' );
                }
@@ -515,16 +563,16 @@ class Profiler {
                global $wgProfilePerHost, $wgProfileToDatabase;
 
                # Do not log anything if database is readonly (bug 5375)
-               if( wfReadOnly() || !$wgProfileToDatabase ) {
+               if ( wfReadOnly() || !$wgProfileToDatabase ) {
                        return;
                }
 
                $dbw = wfGetDB( DB_MASTER );
-               if( !is_object( $dbw ) ) {
+               if ( !is_object( $dbw ) ) {
                        return;
                }
 
-               if( $wgProfilePerHost ) {
+               if ( $wgProfilePerHost ) {
                        $pfhost = wfHostname();
                } else {
                        $pfhost = '';
@@ -533,15 +581,15 @@ class Profiler {
                try {
                        $this->collateData();
 
-                       foreach( $this->mCollated as $name => $elapsed ) {
+                       foreach ( $this->mCollated as $name => $elapsed ) {
                                $eventCount = $this->mCalls[$name];
-                               $timeSum = (float) ($elapsed * 1000);
+                               $timeSum = (float) ( $elapsed * 1000 );
                                $memorySum = (float)$this->mMemory[$name];
-                               $name = substr($name, 0, 255);
+                               $name = substr( $name, 0, 255 );
 
                                // Kludge
-                               $timeSum = ($timeSum >= 0) ? $timeSum : 0;
-                               $memorySum = ($memorySum >= 0) ? $memorySum : 0;
+                               $timeSum = $timeSum >= 0 ? $timeSum : 0;
+                               $memorySum = $memorySum >= 0 ? $memorySum : 0;
 
                                $dbw->update( 'profiling',
                                        array(
@@ -557,9 +605,9 @@ class Profiler {
 
                                $rc = $dbw->affectedRows();
                                if ( $rc == 0 ) {
-                                       $dbw->insert( 'profiling', array ( 'pf_name' => $name, 'pf_count' => $eventCount,
+                                       $dbw->insert( 'profiling', array( 'pf_name' => $name, 'pf_count' => $eventCount,
                                                'pf_time' => $timeSum, 'pf_memory' => $memorySum, 'pf_server' => $pfhost ),
-                                               __METHOD__, array ( 'IGNORE' ) );
+                                               __METHOD__, array( 'IGNORE' ) );
                                }
                                // When we upgrade to mysql 4.1, the insert+update
                                // can be merged into just a insert with this construct added:
@@ -585,7 +633,7 @@ class Profiler {
         * @param string $s to output
         */
        function debug( $s ) {
-               if( defined( 'MW_COMPILED' ) || function_exists( 'wfDebug' ) ) {
+               if ( function_exists( 'wfDebug' ) ) {
                        wfDebug( $s );
                }
        }
index 1d4873c..b59c528 100644 (file)
@@ -96,9 +96,9 @@ class ProfilerSimple extends Profiler {
                                $this->mCollated[$functionname] =& $entry;
                        }
                        $entry['cpu'] += $elapsedcpu;
-                       $entry['cpu_sq'] += $elapsedcpu*$elapsedcpu;
+                       $entry['cpu_sq'] += $elapsedcpu * $elapsedcpu;
                        $entry['real'] += $elapsedreal;
-                       $entry['real_sq'] += $elapsedreal*$elapsedreal;
+                       $entry['real_sq'] += $elapsedreal * $elapsedreal;
                        $entry['count']++;
 
                }
index 37350bf..1d57ea8 100644 (file)
@@ -51,17 +51,17 @@ class ProfilerSimpleText extends ProfilerSimple {
                        uasort( $this->mCollated, array( 'self', 'sort' ) );
                        array_walk( $this->mCollated, array( 'self', 'format' ), $totalReal );
                        if ( PHP_SAPI === 'cli' ) {
-                               print "<!--\n".self::$out."\n-->\n";
+                               print "<!--\n" . self::$out . "\n-->\n";
                        } elseif ( $this->getContentType() === 'text/html' ) {
                                if ( $this->visible ) {
-                                       print '<pre>'.self::$out.'</pre>';
+                                       print '<pre>' . self::$out . '</pre>';
                                } else {
-                                       print "<!--\n".self::$out."\n-->\n";
+                                       print "<!--\n" . self::$out . "\n-->\n";
                                }
                        } elseif ( $this->getContentType() === 'text/javascript' ) {
-                               print "\n/*\n".self::$out."*/\n";
+                               print "\n/*\n" . self::$out . "*/\n";
                        } elseif ( $this->getContentType() === 'text/css' ) {
-                               print "\n/*\n".self::$out."*/\n";
+                               print "\n/*\n" . self::$out . "*/\n";
                        }
                }
        }
@@ -71,7 +71,7 @@ class ProfilerSimpleText extends ProfilerSimple {
        }
 
        static function format( $item, $key, $totalReal ) {
-               $perc = $totalReal ? $item['real']/$totalReal*100 : 0;
+               $perc = $totalReal ? $item['real'] / $totalReal * 100 : 0;
                self::$out .= sprintf( "%6.2f%% %3.6f %6d - %s\n",
                        $perc, $item['real'], $item['count'], $key );
        }
index abefa81..9204763 100644 (file)
@@ -41,16 +41,16 @@ class ProfilerSimpleUDP extends ProfilerSimple {
                        return;
                }
 
-               if ( !MWInit::functionExists( 'socket_create' ) ) {
+               if ( !function_exists( 'socket_create' ) ) {
                        # Sockets are not enabled
                        return;
                }
 
-               $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
+               $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
                $plength = 0;
                $packet = "";
                foreach ( $this->mCollated as $entry => $pfdata ) {
-                       if( !isset( $pfdata['count'] )
+                       if ( !isset( $pfdata['count'] )
                                || !isset( $pfdata['cpu'] )
                                || !isset( $pfdata['cpu_sq'] )
                                || !isset( $pfdata['real'] )
@@ -58,7 +58,7 @@ class ProfilerSimpleUDP extends ProfilerSimple {
                                continue;
                        }
                        $pfline = sprintf( "%s %s %d %f %f %f %f %s\n", $this->getProfileID(), "-", $pfdata['count'],
-                               $pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry);
+                               $pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry );
                        $length = strlen( $pfline );
                        /* printf("<!-- $pfline -->"); */
                        if ( $length + $plength > 1400 ) {
index 27f682c..543bd1d 100644 (file)
@@ -174,9 +174,10 @@ class ResourceLoader {
                        // Save filtered text to Memcached
                        $cache->set( $key, $result );
                } catch ( Exception $exception ) {
+                       wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $e" );
+                       $this->hasErrors = true;
                        // Return exception as a comment
                        $result = $this->makeComment( $exception->__toString() );
-                       $this->hasErrors = true;
                }
 
                wfProfileOut( __METHOD__ );
@@ -201,7 +202,7 @@ class ResourceLoader {
                $this->addSource( $wgResourceLoaderSources );
 
                // Register core modules
-               $this->register( include( "$IP/resources/Resources.php" ) );
+               $this->register( include "$IP/resources/Resources.php" );
                // Register extension modules
                wfRunHooks( 'ResourceLoaderRegisterModules', array( &$this ) );
                $this->register( $wgResourceModules );
@@ -234,6 +235,7 @@ class ResourceLoader {
                foreach ( $registrations as $name => $info ) {
                        // Disallow duplicate registrations
                        if ( isset( $this->moduleInfos[$name] ) ) {
+                               wfProfileOut( __METHOD__ );
                                // A module has already been registered by this name
                                throw new MWException(
                                        'ResourceLoader duplicate registration error. ' .
@@ -243,6 +245,7 @@ class ResourceLoader {
 
                        // Check $name for validity
                        if ( !self::isValidModuleName( $name ) ) {
+                               wfProfileOut( __METHOD__ );
                                throw new MWException( "ResourceLoader module name '$name' is invalid, see ResourceLoader::isValidModuleName()" );
                        }
 
@@ -251,6 +254,7 @@ class ResourceLoader {
                                // Old calling convention
                                // Validate the input
                                if ( !( $info instanceof ResourceLoaderModule ) ) {
+                                       wfProfileOut( __METHOD__ );
                                        throw new MWException( 'ResourceLoader invalid module error. ' .
                                                'Instances of ResourceLoaderModule expected.' );
                                }
@@ -280,17 +284,21 @@ class ResourceLoader {
 
                // Get core test suites
                $testModules = array();
-               $testModules['qunit'] = include( "$IP/tests/qunit/QUnitTestResources.php" );
+               $testModules['qunit'] = include "$IP/tests/qunit/QUnitTestResources.php";
                // Get other test suites (e.g. from extensions)
                wfRunHooks( 'ResourceLoaderTestModules', array( &$testModules, &$this ) );
 
                // Add the testrunner (which configures QUnit) to the dependencies.
                // Since it must be ready before any of the test suites are executed.
-               foreach( $testModules['qunit'] as $moduleName => $moduleProps ) {
-                       $testModules['qunit'][$moduleName]['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
+               foreach ( $testModules['qunit'] as &$module ) {
+                       // Make sure all test modules are top-loading so that when QUnit starts
+                       // on document-ready, it will run once and finish. If some tests arrive
+                       // later (possibly after QUnit has already finished) they will be ignored.
+                       $module['position'] = 'top';
+                       $module['dependencies'][] = 'mediawiki.tests.qunit.testrunner';
                }
 
-               foreach( $testModules as $id => $names ) {
+               foreach ( $testModules as $id => $names ) {
                        // Register test modules
                        $this->register( $testModules[$id] );
 
@@ -311,7 +319,7 @@ class ResourceLoader {
         * @param array $properties source properties
         * @throws MWException
         */
-       public function addSource( $id, $properties = null) {
+       public function addSource( $id, $properties = null ) {
                // Allow multiple sources to be registered in one call
                if ( is_array( $id ) ) {
                        foreach ( $id as $key => $value ) {
@@ -357,7 +365,7 @@ class ResourceLoader {
         * @return Array
         */
        public function getTestModuleNames( $framework = 'all' ) {
-               /// @TODO: api siteinfo prop testmodulenames modulenames
+               /// @todo api siteinfo prop testmodulenames modulenames
                if ( $framework == 'all' ) {
                        return $this->testModuleNames;
                } elseif ( isset( $this->testModuleNames[$framework] ) && is_array( $this->testModuleNames[$framework] ) ) {
@@ -446,8 +454,11 @@ class ResourceLoader {
                                // Do not allow private modules to be loaded from the web.
                                // This is a security issue, see bug 34907.
                                if ( $module->getGroup() === 'private' ) {
-                                       $errors .= $this->makeComment( "Cannot show private module \"$name\"" );
+                                       wfDebugLog( 'resourceloader', __METHOD__ . ": request for private module denied: $e" );
                                        $this->hasErrors = true;
+                                       // Add exception to the output as a comment
+                                       $errors .= $this->makeComment( "Cannot show private module \"$name\"" );
+
                                        continue;
                                }
                                $modules[$name] = $module;
@@ -459,13 +470,14 @@ class ResourceLoader {
                // Preload information needed to the mtime calculation below
                try {
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
-               } catch( Exception $e ) {
+               } catch ( Exception $e ) {
+                       wfDebugLog( 'resourceloader', __METHOD__ . ": preloading module info failed: $e" );
+                       $this->hasErrors = true;
                        // Add exception to the output as a comment
                        $errors .= $this->makeComment( $e->__toString() );
-                       $this->hasErrors = true;
                }
 
-               wfProfileIn( __METHOD__.'-getModifiedTime' );
+               wfProfileIn( __METHOD__ . '-getModifiedTime' );
 
                // To send Last-Modified and support If-Modified-Since, we need to detect
                // the last modified time
@@ -478,13 +490,14 @@ class ResourceLoader {
                                // Calculate maximum modified time
                                $mtime = max( $mtime, $module->getModifiedTime( $context ) );
                        } catch ( Exception $e ) {
+                               wfDebugLog( 'resourceloader', __METHOD__ . ": calculating maximum modified time failed: $e" );
+                               $this->hasErrors = true;
                                // Add exception to the output as a comment
                                $errors .= $this->makeComment( $e->__toString() );
-                               $this->hasErrors = true;
                        }
                }
 
-               wfProfileOut( __METHOD__.'-getModifiedTime' );
+               wfProfileOut( __METHOD__ . '-getModifiedTime' );
 
                // If there's an If-Modified-Since header, respond with a 304 appropriately
                if ( $this->tryRespondLastModified( $context, $mtime ) ) {
@@ -594,6 +607,8 @@ class ResourceLoader {
                                // no matter how often we call ob_get_clean(), so instead of doing
                                // the more intuitive while ( ob_get_level() > 0 ) ob_get_clean();
                                // we have to be safe here and avoid an infinite loop.
+                               // Caching the level is not an option, need to allow it to
+                               // shorten the loop on-the-fly (bug 46836)
                                for ( $i = 0; $i < ob_get_level(); $i++ ) {
                                        ob_end_clean();
                                }
@@ -628,7 +643,7 @@ class ResourceLoader {
                if ( !$good ) {
                        try { // RL always hits the DB on file cache miss...
                                wfGetDB( DB_SLAVE );
-                       } catch( DBConnectionError $e ) { // ...check if we need to fallback to cache
+                       } catch ( DBConnectionError $e ) { // ...check if we need to fallback to cache
                                $good = $fileCache->isCacheGood(); // cache existence check
                        }
                }
@@ -671,8 +686,8 @@ class ResourceLoader {
         * @return String: Response data
         */
        public function makeModuleResponse( ResourceLoaderContext $context,
-               array $modules, $missing = array() )
-       {
+               array $modules, $missing = array()
+       {
                $out = '';
                $exceptions = '';
                if ( $modules === array() && $missing === array() ) {
@@ -685,9 +700,10 @@ class ResourceLoader {
                        try {
                                $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
+                               wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
+                               $this->hasErrors = true;
                                // Add exception to the output as a comment
                                $exceptions .= $this->makeComment( $e->__toString() );
-                               $this->hasErrors = true;
                        }
                } else {
                        $blobs = array();
@@ -791,9 +807,10 @@ class ResourceLoader {
                                                break;
                                }
                        } catch ( Exception $e ) {
+                               wfDebugLog( 'resourceloader', __METHOD__ . ": generating module package failed: $e" );
+                               $this->hasErrors = true;
                                // Add exception to the output as a comment
                                $exceptions .= $this->makeComment( $e->__toString() );
-                               $this->hasErrors = true;
 
                                // Register module as missing
                                $missing[] = $name;
@@ -863,7 +880,9 @@ class ResourceLoader {
                                // output javascript "[]" instead of "{}". This fixes that.
                                (object)$styles,
                                (object)$messages
-                       ) );
+                       ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
@@ -892,7 +911,7 @@ class ResourceLoader {
                        // ResourceLoaderFileModule::getStyle can return the styles
                        // as a string or an array of strings. This is to allow separation in
                        // the front-end.
-                       $styles = (array) $styles;
+                       $styles = (array)$styles;
                        foreach ( $styles as $style ) {
                                $style = trim( $style );
                                // Don't output an empty "@media print { }" block (bug 40498)
@@ -903,7 +922,7 @@ class ResourceLoader {
 
                                        if ( $media === '' || $media == 'all' ) {
                                                $out[] = $style;
-                                       } else if ( is_string( $media ) ) {
+                                       } elseif ( is_string( $media ) ) {
                                                $out[] = "@media $media {\n" . str_replace( "\n", "\n\t", "\t" . $style ) . "}";
                                        }
                                        // else: skip
@@ -984,12 +1003,12 @@ class ResourceLoader {
         * @return string
         */
        public static function makeLoaderRegisterScript( $name, $version = null,
-               $dependencies = null, $group = null, $source = null )
-       {
+               $dependencies = null, $group = null, $source = null
+       {
                if ( is_array( $name ) ) {
                        return Xml::encodeJsCall( 'mw.loader.register', array( $name ) );
                } else {
-                       $version = (int) $version > 1 ? (int) $version : 1;
+                       $version = (int)$version > 1 ? (int)$version : 1;
                        return Xml::encodeJsCall( 'mw.loader.register',
                                array( $name, $version, $dependencies, $group, $source ) );
                }
@@ -1039,7 +1058,7 @@ class ResourceLoader {
         * @return string
         */
        public static function makeConfigSetScript( array $configuration ) {
-               return Xml::encodeJsCall( 'mw.config.set', array( $configuration ) );
+               return Xml::encodeJsCall( 'mw.config.set', array( $configuration ), ResourceLoader::inDebugMode() );
        }
 
        /**
index 4588015..22ff6a7 100644 (file)
@@ -96,7 +96,7 @@ class ResourceLoaderContext {
                                $pos = strrpos( $group, '.' );
                                if ( $pos === false ) {
                                        // Prefixless modules, i.e. without dots
-                                       $retval = explode( ',', $group );
+                                       $retval = array_merge( $retval, explode( ',', $group ) );
                                } else {
                                        // We have a prefix and a bunch of suffixes
                                        $prefix = substr( $group, 0, $pos ); // 'foo'
index cedb5dc..af533c6 100644 (file)
@@ -187,8 +187,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        public function __construct( $options = array(), $localBasePath = null,
-               $remoteBasePath = null )
-       {
+               $remoteBasePath = null
+       {
                global $IP, $wgScriptPath, $wgResourceBasePath;
                $this->localBasePath = $localBasePath === null ? $IP : $localBasePath;
                if ( $remoteBasePath !== null ) {
@@ -209,7 +209,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                case 'debugScripts':
                                case 'loaderScripts':
                                case 'styles':
-                                       $this->{$member} = (array) $option;
+                                       $this->{$member} = (array)$option;
                                        break;
                                // Collated lists of file paths
                                case 'languageScripts':
@@ -228,26 +228,26 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                                                "'$key' given, string expected."
                                                        );
                                                }
-                                               $this->{$member}[$key] = (array) $value;
+                                               $this->{$member}[$key] = (array)$value;
                                        }
                                        break;
                                // Lists of strings
                                case 'dependencies':
                                case 'messages':
                                case 'targets':
-                                       $this->{$member} = (array) $option;
+                                       $this->{$member} = (array)$option;
                                        break;
                                // Single strings
                                case 'group':
                                case 'position':
                                case 'localBasePath':
                                case 'remoteBasePath':
-                                       $this->{$member} = (string) $option;
+                                       $this->{$member} = (string)$option;
                                        break;
                                // Single booleans
                                case 'debugRaw':
                                case 'raw':
-                                       $this->{$member} = (bool) $option;
+                                       $this->{$member} = (bool)$option;
                                        break;
                        }
                }
@@ -324,7 +324,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                );
                        }
                } catch ( Exception $e ) {
-                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+                       wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
                }
                return $styles;
        }
@@ -481,7 +481,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        protected static function collateFilePathListByOption( array $list, $option, $default ) {
                $collatedFiles = array();
-               foreach ( (array) $list as $key => $value ) {
+               foreach ( (array)$list as $key => $value ) {
                        if ( is_int( $key ) ) {
                                // File name as the value
                                if ( !isset( $collatedFiles[$default] ) ) {
index 0f8e54c..e840300 100644 (file)
@@ -108,7 +108,7 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
         * @return array|int|Mixed
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
-               $this->language = Language::factory( $context ->getLanguage() );
+               $this->language = Language::factory( $context->getLanguage() );
                $cache = wfGetCache( CACHE_ANYTHING );
                $key = wfMemcKey( 'resourceloader', 'langdatamodule', 'changeinfo' );
 
index 03f3cc3..f6a7114 100644 (file)
@@ -319,7 +319,7 @@ abstract class ResourceLoaderModule {
                        ), __METHOD__
                );
                if ( !is_null( $deps ) ) {
-                       $this->fileDeps[$skin] = (array) FormatJson::decode( $deps, true );
+                       $this->fileDeps[$skin] = (array)FormatJson::decode( $deps, true );
                } else {
                        $this->fileDeps[$skin] = array();
                }
index 1cc5c1a..05754d3 100644 (file)
@@ -37,20 +37,19 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
         * @return Array: List of pages
         */
        protected function getPages( ResourceLoaderContext $context ) {
-               global $wgHandheldStyle;
+               global $wgUseSiteJs, $wgUseSiteCss;
 
-               $pages = array(
-                       'MediaWiki:Common.js' => array( 'type' => 'script' ),
-                       'MediaWiki:Common.css' => array( 'type' => 'style' ),
-                       'MediaWiki:' . ucfirst( $context->getSkin() ) . '.js' => array( 'type' => 'script' ),
-                       'MediaWiki:' . ucfirst( $context->getSkin() ) . '.css' => array( 'type' => 'style' ),
-                       'MediaWiki:Print.css' => array( 'type' => 'style', 'media' => 'print' ),
-               );
-               if ( $wgHandheldStyle ) {
-                       $pages['MediaWiki:Handheld.css'] = array(
-                               'type' => 'style',
-                               'media' => 'handheld' );
+               $pages = array();
+               if ( $wgUseSiteJs ) {
+                       $pages['MediaWiki:Common.js'] = array( 'type' => 'script' );
+                       $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.js'] = array( 'type' => 'script' );
                }
+               if ( $wgUseSiteCss ) {
+                       $pages['MediaWiki:Common.css'] = array( 'type' => 'style' );
+                       $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.css'] = array( 'type' => 'style' );
+
+               }
+               $pages['MediaWiki:Print.css'] = array( 'type' => 'style', 'media' => 'print' );
                return $pages;
        }
 
index 32cf6b2..861ff18 100644 (file)
@@ -27,6 +27,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        /* Protected Members */
 
        protected $modifiedTime = array();
+       protected $targets = array( 'desktop', 'mobile' );
 
        /* Protected Methods */
 
@@ -51,7 +52,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                 */
                $namespaceIds = $wgContLang->getNamespaceIds();
                $caseSensitiveNamespaces = array();
-               foreach( MWNamespace::getCanonicalNamespaces() as $index => $name ) {
+               foreach ( MWNamespace::getCanonicalNamespaces() as $index => $name ) {
                        $namespaceIds[$wgContLang->lc( $name )] = $index;
                        if ( !MWNamespace::isCapitalized( $index ) ) {
                                $caseSensitiveNamespaces[] = $index;
@@ -184,7 +185,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         * @return string
         */
        public function getScript( ResourceLoaderContext $context ) {
-               global $IP, $wgLoadScript, $wgLegacyJavaScriptGlobals;
+               global $IP, $wgLegacyJavaScriptGlobals;
 
                $out = file_get_contents( "$IP/resources/startup.js" );
                if ( $context->getOnly() === 'scripts' ) {
@@ -224,7 +225,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                "};\n";
 
                        // Conditional script injection
-                       $scriptTag = Html::linkedScript( $wgLoadScript . '?' . wfArrayToCgi( $query ) );
+                       $scriptTag = Html::linkedScript( wfAppendQuery( wfScript( 'load' ), $query ) );
                        $out .= "if ( isCompatible() ) {\n" .
                                "\t" . Xml::encodeJsCall( 'document.write', array( $scriptTag ) ) .
                                "}\n" .
index bdb240e..61e6e15 100644 (file)
@@ -56,43 +56,44 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
        public function getStyles( ResourceLoaderContext $context ) {
                global $wgAllowUserCssPrefs, $wgUser;
 
-               if ( $wgAllowUserCssPrefs ) {
-                       $options = $wgUser->getOptions();
+               if ( !$wgAllowUserCssPrefs ) {
+                       return array();
+               }
 
-                       // Build CSS rules
-                       $rules = array();
+               $options = $wgUser->getOptions();
 
-                       // Underline: 2 = browser default, 1 = always, 0 = never
-                       if ( $options['underline'] < 2 ) {
-                               $rules[] = "a { text-decoration: " .
-                                       ( $options['underline'] ? 'underline' : 'none' ) . "; }";
-                       } else {
-                               # The scripts of these languages are very hard to read with underlines
-                               $rules[] = 'a:lang(ar), a:lang(ckb), a:lang(fa),a:lang(kk-arab), ' .
-                               'a:lang(mzn), a:lang(ps), a:lang(ur) { text-decoration: none; }';
-                       }
-                       if ( $options['justify'] ) {
-                               $rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
-                       }
-                       if ( !$options['showtoc'] ) {
-                               $rules[] = "#toc { display: none; }\n";
-                       }
-                       if ( !$options['editsection'] ) {
-                               $rules[] = ".editsection { display: none; }\n";
-                       }
-                       if ( $options['editfont'] !== 'default' ) {
-                               // Double-check that $options['editfont'] consists of safe characters only
-                               if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
-                                       $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
-                               }
-                       }
-                       $style = implode( "\n", $rules );
-                       if ( $this->getFlip( $context ) ) {
-                               $style = CSSJanus::transform( $style, true, false );
+               // Build CSS rules
+               $rules = array();
+
+               // Underline: 2 = browser default, 1 = always, 0 = never
+               if ( $options['underline'] < 2 ) {
+                       $rules[] = "a { text-decoration: " .
+                               ( $options['underline'] ? 'underline' : 'none' ) . "; }";
+               } else {
+                       # The scripts of these languages are very hard to read with underlines
+                       $rules[] = 'a:lang(ar), a:lang(ckb), a:lang(fa),a:lang(kk-arab), ' .
+                       'a:lang(mzn), a:lang(ps), a:lang(ur) { text-decoration: none; }';
+               }
+               if ( $options['justify'] ) {
+                       $rules[] = "#article, #bodyContent, #mw_content { text-align: justify; }\n";
+               }
+               if ( !$options['showtoc'] ) {
+                       $rules[] = "#toc { display: none; }\n";
+               }
+               if ( !$options['editsection'] ) {
+                       $rules[] = ".mw-editsection, .editsection { display: none; }\n";
+               }
+               if ( $options['editfont'] !== 'default' ) {
+                       // Double-check that $options['editfont'] consists of safe characters only
+                       if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
+                               $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
                        }
-                       return array( 'all' => $style );
                }
-               return array();
+               $style = implode( "\n", $rules );
+               if ( $this->getFlip( $context ) ) {
+                       $style = CSSJanus::transform( $style, true, false );
+               }
+               return array( 'all' => $style );
        }
 
        /**
index 1316f42..9064263 100644 (file)
@@ -33,12 +33,15 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
         * @return array
         */
        protected function getPages( ResourceLoaderContext $context ) {
-               global $wgUser;
+               global $wgUser, $wgUseSiteJs, $wgUseSiteCss;
 
                $userName = $context->getUser();
                if ( $userName === null ) {
                        return array();
                }
+               if ( !$wgUseSiteJs && !$wgUseSiteCss ) {
+                       return array();
+               }
 
                // Use $wgUser is possible; allows to skip a lot of code
                if ( is_object( $wgUser ) && $wgUser->getName() == $userName ) {
@@ -51,12 +54,16 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
                }
 
                $pages = array();
-               foreach( $user->getEffectiveGroups() as $group ) {
+               foreach ( $user->getEffectiveGroups() as $group ) {
                        if ( in_array( $group, array( '*', 'user' ) ) ) {
                                continue;
                        }
-                       $pages["MediaWiki:Group-$group.js"] = array( 'type' => 'script' );
-                       $pages["MediaWiki:Group-$group.css"] = array( 'type' => 'style' );
+                       if ( $wgUseSiteJs ) {
+                               $pages["MediaWiki:Group-$group.js"] = array( 'type' => 'script' );
+                       }
+                       if ( $wgUseSiteCss ) {
+                               $pages["MediaWiki:Group-$group.css"] = array( 'type' => 'style' );
+                       }
                }
                return $pages;
        }
index 177302c..7a04e47 100644 (file)
@@ -35,11 +35,15 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
         * @return array
         */
        protected function getPages( ResourceLoaderContext $context ) {
+               global $wgAllowUserJs, $wgAllowUserCss;
                $username = $context->getUser();
 
                if ( $username === null ) {
                        return array();
                }
+               if ( !$wgAllowUserJs && !$wgAllowUserCss ) {
+                       return array();
+               }
 
                // Get the normalized title of the user's user page
                $userpageTitle = Title::makeTitleSafe( NS_USER, $username );
@@ -50,14 +54,15 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
 
                $userpage = $userpageTitle->getPrefixedDBkey(); // Needed so $excludepages works
 
-               $pages = array(
-                       "$userpage/common.js" => array( 'type' => 'script' ),
-                       "$userpage/" . $context->getSkin() . '.js' =>
-                               array( 'type' => 'script' ),
-                       "$userpage/common.css" => array( 'type' => 'style' ),
-                       "$userpage/" . $context->getSkin() . '.css' =>
-                               array( 'type' => 'style' ),
-               );
+               $pages = array();
+               if ( $wgAllowUserJs ) {
+                       $pages["$userpage/common.js"] = array( 'type' => 'script' );
+                       $pages["$userpage/" . $context->getSkin() . '.js'] = array( 'type' => 'script' );
+               }
+               if ( $wgAllowUserCss ) {
+                       $pages["$userpage/common.css"] = array( 'type' => 'style' );
+                       $pages["$userpage/" . $context->getSkin() . '.css'] = array( 'type' => 'style' );
+               }
 
                // Hack for bug 26283: if we're on a preview page for a CSS/JS page,
                // we need to exclude that page from this module. In that case, the excludepage
index 4624cbc..0b7e196 100644 (file)
@@ -56,7 +56,9 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
        public function getScript( ResourceLoaderContext $context ) {
                global $wgUser;
                return Xml::encodeJsCall( 'mw.user.options.set',
-                       array( $wgUser->getOptions() ) );
+                       array( $wgUser->getOptions() ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
index 6d787c5..92ebbe9 100644 (file)
@@ -35,10 +35,9 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
        /**
         * Fetch the tokens for the current user.
         *
-        * @param $context ResourceLoaderContext: Context object
-        * @return Array: List of tokens keyed by token type
+        * @return array: List of tokens keyed by token type
         */
-       protected function contextUserTokens( ResourceLoaderContext $context ) {
+       protected function contextUserTokens() {
                global $wgUser;
 
                return array(
@@ -54,7 +53,9 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
         */
        public function getScript( ResourceLoaderContext $context ) {
                return Xml::encodeJsCall( 'mw.user.tokens.set',
-                       array( $this->contextUserTokens( $context ) ) );
+                       array( $this->contextUserTokens() ),
+                       ResourceLoader::inDebugMode()
+               );
        }
 
        /**
index 6c60d47..3f10ae5 100644 (file)
@@ -92,14 +92,14 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                $content = $revision->getContent( Revision::RAW );
 
                if ( !$content ) {
-                       wfDebug( __METHOD__ . "failed to load content of JS/CSS page!\n" );
+                       wfDebugLog( 'resourceloader', __METHOD__ . ': failed to load content of JS/CSS page!' );
                        return null;
                }
 
                $model = $content->getModel();
 
                if ( $model !== CONTENT_MODEL_CSS && $model !== CONTENT_MODEL_JAVASCRIPT ) {
-                       wfDebug( __METHOD__ . "bad content model $model for JS/CSS page!\n" );
+                       wfDebugLog( 'resourceloader', __METHOD__ . ': bad content model $model for JS/CSS page!' );
                        return null;
                }
 
index 1ace383..ac72276 100644 (file)
@@ -52,7 +52,7 @@ class RevDel_RevisionList extends RevDel_List {
                        array_merge( Revision::selectFields(), Revision::selectUserFields() ),
                        array(
                                'rev_page' => $this->title->getArticleID(),
-                               'rev_id'   => $ids,
+                               'rev_id' => $ids,
                        ),
                        __METHOD__,
                        array( 'ORDER BY' => 'rev_id DESC' ),
@@ -242,8 +242,7 @@ class RevDel_RevisionItem extends RevDel_Item {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $this->list->msg( 'diff' )->escaped();
                } else {
-                       return
-                               Linker::linkKnown(
+                       return Linker::linkKnown(
                                        $this->list->title,
                                        $this->list->msg( 'diff' )->escaped(),
                                        array(),
@@ -293,7 +292,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
                return $db->select( 'archive', '*',
                                array(
                                        'ar_namespace' => $this->title->getNamespace(),
-                                       'ar_title'     => $this->title->getDBkey(),
+                                       'ar_title' => $this->title->getDBkey(),
                                        'ar_timestamp' => $timestamps
                                ),
                                __METHOD__,
@@ -350,12 +349,12 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
                $dbw->update( 'archive',
                        array( 'ar_deleted' => $bits ),
                        array(
-                               'ar_namespace'  => $this->list->title->getNamespace(),
-                               'ar_title'      => $this->list->title->getDBkey(),
+                               'ar_namespace' => $this->list->title->getNamespace(),
+                               'ar_title' => $this->list->title->getDBkey(),
                                // use timestamp for index
-                               'ar_timestamp'  => $this->row->ar_timestamp,
-                               'ar_rev_id'     => $this->row->ar_rev_id,
-                               'ar_deleted'    => $this->getBits()
+                               'ar_timestamp' => $this->row->ar_timestamp,
+                               'ar_rev_id' => $this->row->ar_rev_id,
+                               'ar_deleted' => $this->getBits()
                        ),
                        __METHOD__ );
                return (bool)$dbw->affectedRows();
@@ -450,14 +449,14 @@ class RevDel_FileList extends RevDel_List {
         */
        public function doQuery( $db ) {
                $archiveNames = array();
-               foreach( $this->ids as $timestamp ) {
+               foreach ( $this->ids as $timestamp ) {
                        $archiveNames[] = $timestamp . '!' . $this->title->getDBkey();
                }
                return $db->select(
                        'oldimage',
                        OldLocalFile::selectFields(),
                        array(
-                               'oi_name'         => $this->title->getDBkey(),
+                               'oi_name' => $this->title->getDBkey(),
                                'oi_archive_name' => $archiveNames
                        ),
                        __METHOD__,
@@ -624,8 +623,8 @@ class RevDel_FileItem extends RevDel_Item {
                                array(),
                                array(
                                        'target' => $this->list->title->getPrefixedText(),
-                                       'file'   => $this->file->getArchiveName(),
-                                       'token'  => $this->list->getUser()->getEditToken(
+                                       'file' => $this->file->getArchiveName(),
+                                       'token' => $this->list->getUser()->getEditToken(
                                                $this->file->getArchiveName() )
                                )
                        );
@@ -637,13 +636,13 @@ class RevDel_FileItem extends RevDel_Item {
         * @return string HTML
         */
        protected function getUserTools() {
-               if( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) {
+               if ( $this->file->userCan( Revision::DELETED_USER, $this->list->getUser() ) ) {
                        $link = Linker::userLink( $this->file->user, $this->file->user_text ) .
                                Linker::userToolLinks( $this->file->user, $this->file->user_text );
                } else {
                        $link = $this->list->msg( 'rev-deleted-user' )->escaped();
                }
-               if( $this->file->isDeleted( Revision::DELETED_USER ) ) {
+               if ( $this->file->isDeleted( Revision::DELETED_USER ) ) {
                        return '<span class="history-deleted">' . $link . '</span>';
                }
                return $link;
@@ -656,12 +655,12 @@ class RevDel_FileItem extends RevDel_Item {
         * @return string HTML
         */
        protected function getComment() {
-               if( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
+               if ( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
                        $block = Linker::commentBlock( $this->file->description );
                } else {
                        $block = ' ' . $this->list->msg( 'rev-deleted-comment' )->escaped();
                }
-               if( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
+               if ( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
                        return "<span class=\"history-deleted\">$block</span>";
                }
                return $block;
@@ -674,7 +673,7 @@ class RevDel_FileItem extends RevDel_Item {
                        ' (' . $this->list->msg( 'nbytes' )->numParams( $this->file->getSize() )->text() . ')';
 
                return '<li>' . $this->getLink() . ' ' . $this->getUserTools() . ' ' .
-                       $data . ' ' . $this->getComment(). '</li>';
+                       $data . ' ' . $this->getComment() . '</li>';
        }
 }
 
@@ -701,7 +700,7 @@ class RevDel_ArchivedFileList extends RevDel_FileList {
                        ArchivedFile::selectFields(),
                        array(
                                'fa_name' => $this->title->getDBkey(),
-                               'fa_id'   => $ids
+                               'fa_id' => $ids
                        ),
                        __METHOD__,
                        array( 'ORDER BY' => 'fa_id DESC' )
@@ -760,7 +759,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
                        $this->file->getTimestamp(), $this->list->getUser() ) );
 
                # Hidden files...
-               if( !$this->canViewContent() ) {
+               if ( !$this->canViewContent() ) {
                        $link = $date;
                } else {
                        $undelete = SpecialPage::getTitleFor( 'Undelete' );
@@ -773,7 +772,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
                                )
                        );
                }
-               if( $this->isDeleted() ) {
+               if ( $this->isDeleted() ) {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
                return $link;
@@ -902,7 +901,7 @@ class RevDel_LogItem extends RevDel_Item {
                $action = $formatter->getActionText();
                // Comment
                $comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
-               if( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
+               if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
                        $comment = '<span class="history-deleted">' . $comment . '</span>';
                }
 
index b2108de..9ace35a 100644 (file)
@@ -68,7 +68,7 @@ abstract class RevDel_List extends RevisionListBase {
 
                for ( $this->reset(); $this->current(); $this->next() ) {
                        $item = $this->current();
-                       unset( $missing[ $item->getId() ] );
+                       unset( $missing[$item->getId()] );
 
                        $oldBits = $item->getBits();
                        // Build the actual new rev_deleted bitfield
@@ -94,14 +94,14 @@ abstract class RevDel_List extends RevisionListBase {
                        }
                        if ( !$item->canView() ) {
                                // Cannot access this revision
-                               $msg = ($opType == 'show') ?
+                               $msg = ( $opType == 'show' ) ?
                                        'revdelete-show-no-access' : 'revdelete-modify-no-access';
                                $status->error( $msg, $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
                        }
                        // Cannot just "hide from Sysops" without hiding any fields
-                       if( $newBits == Revision::DELETED_RESTRICTED ) {
+                       if ( $newBits == Revision::DELETED_RESTRICTED ) {
                                $status->warning( 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
                                $status->failCount++;
                                continue;
@@ -113,9 +113,9 @@ abstract class RevDel_List extends RevisionListBase {
                        if ( $ok ) {
                                $idsForLog[] = $item->getId();
                                $status->successCount++;
-                               if( $item->getAuthorId() > 0 ) {
+                               if ( $item->getAuthorId() > 0 ) {
                                        $authorIds[] = $item->getAuthorId();
-                               } elseif( IP::isIPAddress( $item->getAuthorName() ) ) {
+                               } elseif ( IP::isIPAddress( $item->getAuthorName() ) ) {
                                        $authorIPs[] = $item->getAuthorName();
                                }
                        } else {
@@ -189,7 +189,7 @@ abstract class RevDel_List extends RevisionListBase {
        protected function updateLog( $params ) {
                // Get the URL param's corresponding DB field
                $field = RevisionDeleter::getRelationType( $this->getType() );
-               if( !$field ) {
+               if ( !$field ) {
                        throw new MWException( "Bad log URL param type!" );
                }
                // Put things hidden from sysops in the oversight log
index c02e9c7..4505ee1 100644 (file)
@@ -54,7 +54,7 @@ class RevisionDeleteUser {
                # The same goes for the sysop-restricted *_deleted bit.
                $delUser = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
                $delAction = LogPage::DELETED_ACTION | Revision::DELETED_RESTRICTED;
-               if( $op == '&' ) {
+               if ( $op == '&' ) {
                        $delUser = "~{$delUser}";
                        $delAction = "~{$delAction}";
                }
index fe351c5..2de19ac 100644 (file)
@@ -39,8 +39,8 @@ class RevisionDeleter {
         * @param array $arr the array to update.
         */
        protected static function checkItem( $desc, $field, $diff, $new, &$arr ) {
-               if( $diff & $field ) {
-                       $arr[ ( $new & $field ) ? 0 : 1 ][] = $desc;
+               if ( $diff & $field ) {
+                       $arr[( $new & $field ) ? 0 : 1][] = $desc;
                }
        }
 
@@ -73,11 +73,12 @@ class RevisionDeleter {
                self::checkItem( 'revdelete-uname',
                        Revision::DELETED_USER, $diff, $n, $ret );
                // Restriction application to sysops
-               if( $diff & Revision::DELETED_RESTRICTED ) {
-                       if( $n & Revision::DELETED_RESTRICTED )
+               if ( $diff & Revision::DELETED_RESTRICTED ) {
+                       if ( $n & Revision::DELETED_RESTRICTED ) {
                                $ret[2][] = 'revdelete-restricted';
-                       else
+                       } else {
                                $ret[2][] = 'revdelete-unrestricted';
+                       }
                }
                return $ret;
        }
index 6b3e62b..a975b03 100644 (file)
@@ -59,7 +59,7 @@ class SearchEngine {
         * STUB
         *
         * @param string $term raw search term
-        * @return SearchResultSet
+        * @return SearchResultSet|Status|null
         */
        function searchText( $term ) {
                return null;
@@ -71,7 +71,7 @@ class SearchEngine {
         * STUB
         *
         * @param string $term raw search term
-        * @return SearchResultSet
+        * @return SearchResultSet|null
         */
        function searchTitle( $term ) {
                return null;
@@ -93,7 +93,7 @@ class SearchEngine {
         * @return Boolean
         */
        public function supports( $feature ) {
-               switch( $feature ) {
+               switch ( $feature ) {
                case 'list-redirects':
                        return true;
                case 'title-suffix-filter':
@@ -331,8 +331,9 @@ class SearchEngine {
                                $parsed = substr( $query, strlen( $prefix ) + 1 );
                        }
                }
-               if ( trim( $parsed ) == '' )
+               if ( trim( $parsed ) == '' ) {
                        $parsed = $query; // prefix was the whole query
+               }
 
                wfRunHooks( 'SearchEngineReplacePrefixesComplete', array( $this, $query, &$parsed ) );
 
@@ -420,8 +421,9 @@ class SearchEngine {
 
                $formatted = array_map( array( $wgContLang, 'getFormattedNsText' ), $namespaces );
                foreach ( $formatted as $key => $ns ) {
-                       if ( empty( $ns ) )
+                       if ( empty( $ns ) ) {
                                $formatted[$key] = wfMessage( 'blanknamespace' )->text();
+                       }
                }
                return $formatted;
        }
@@ -641,26 +643,30 @@ class SqlSearchResultSet extends SearchResultSet {
        }
 
        function numRows() {
-               if ( $this->mResultSet === false )
+               if ( $this->mResultSet === false ) {
                        return false;
+               }
 
                return $this->mResultSet->numRows();
        }
 
        function next() {
-               if ( $this->mResultSet === false )
+               if ( $this->mResultSet === false ) {
                        return false;
+               }
 
                $row = $this->mResultSet->fetchObject();
-               if ( $row === false )
+               if ( $row === false ) {
                        return false;
+               }
 
                return SearchResult::newFromRow( $row );
        }
 
        function free() {
-               if ( $this->mResultSet === false )
+               if ( $this->mResultSet === false ) {
                        return false;
+               }
 
                $this->mResultSet->free();
        }
@@ -750,8 +756,9 @@ class SearchResult {
                        wfRunHooks( 'SearchResultInitFromTitle', array( $title, &$id ) );
                        $this->mRevision = Revision::newFromTitle(
                                $this->mTitle, $id, Revision::READ_NORMAL );
-                       if ( $this->mTitle->getNamespace() === NS_FILE )
+                       if ( $this->mTitle->getNamespace() === NS_FILE ) {
                                $this->mImage = wfFindFile( $this->mTitle );
+                       }
                }
        }
 
@@ -761,8 +768,9 @@ class SearchResult {
         * @return Boolean
         */
        function isBrokenTitle() {
-               if ( is_null( $this->mTitle ) )
+               if ( is_null( $this->mTitle ) ) {
                        return true;
+               }
                return false;
        }
 
@@ -816,10 +824,11 @@ class SearchResult {
                // TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
                list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs( $wgUser );
                $h = new SearchHighlighter();
-               if ( $wgAdvancedSearchHighlighting )
+               if ( $wgAdvancedSearchHighlighting ) {
                        return $h->highlightText( $this->mText, $terms, $contextlines, $contextchars );
-               else
+               } else {
                        return $h->highlightSimple( $this->mText, $terms, $contextlines, $contextchars );
+               }
        }
 
        /**
@@ -863,10 +872,11 @@ class SearchResult {
         * @return String: timestamp
         */
        function getTimestamp() {
-               if ( $this->mRevision )
+               if ( $this->mRevision ) {
                        return $this->mRevision->getTimestamp();
-               elseif ( $this->mImage )
+               } elseif ( $this->mImage ) {
                        return $this->mImage->getTimestamp();
+               }
                return '';
        }
 
@@ -952,8 +962,9 @@ class SearchHighlighter {
                global $wgSearchHighlightBoundaries;
                $fname = __METHOD__;
 
-               if ( $text == '' )
+               if ( $text == '' ) {
                        return '';
+               }
 
                // spli text into text + templates/links/tables
                $spat = "/(\\{\\{)|(\\[\\[[^\\]:]+:)|(\n\\{\\|)";
@@ -984,8 +995,9 @@ class SearchHighlighter {
                                                if ( $key == 2 ) {
                                                        // see if this is an image link
                                                        $ns = substr( $val[0], 2, - 1 );
-                                                       if ( $wgContLang->getNsIndex( $ns ) != NS_FILE )
+                                                       if ( $wgContLang->getNsIndex( $ns ) != NS_FILE ) {
                                                                break;
+                                                       }
 
                                                }
                                                $epat = $endPatterns[$key];
@@ -1006,7 +1018,7 @@ class SearchHighlighter {
                                                                $len = strlen( $endMatches[2][0] );
                                                                $off = $endMatches[2][1];
                                                                $this->splitAndAdd( $otherExt, $count,
-                                                                       substr( $text, $start, $off + $len  - $start ) );
+                                                                       substr( $text, $start, $off + $len - $start ) );
                                                                $start = $off + $len;
                                                                $found = true;
                                                                break;
@@ -1119,7 +1131,7 @@ class SearchHighlighter {
                        // if begin of the article contains the whole phrase, show only that !!
                        if ( array_key_exists( $first, $snippets ) && preg_match( $pat1, $snippets[$first] )
                                && $offsets[$first] < $contextchars * 2 ) {
-                               $snippets = array ( $first => $snippets[$first] );
+                               $snippets = array( $first => $snippets[$first] );
                        }
 
                        // calc by how much to extend existing snippets
@@ -1155,17 +1167,19 @@ class SearchHighlighter {
                $last = - 1;
                $extract = '';
                foreach ( $snippets as $index => $line ) {
-                       if ( $last == - 1 )
+                       if ( $last == - 1 ) {
                                $extract .= $line; // first line
-                       elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) )
+                       } elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) ) {
                                $extract .= " " . $line; // continous lines
-                       else
+                       } else {
                                $extract .= '<b> ... </b>' . $line;
+                       }
 
                        $last = $index;
                }
-               if ( $extract )
+               if ( $extract ) {
                        $extract .= '<b> ... </b>';
+               }
 
                $processed = array();
                foreach ( $terms as $term ) {
@@ -1193,8 +1207,9 @@ class SearchHighlighter {
                $split = explode( "\n", $this->mCleanWikitext ? $this->removeWiki( $text ) : $text );
                foreach ( $split as $line ) {
                        $tt = trim( $line );
-                       if ( $tt )
+                       if ( $tt ) {
                                $extracts[$count++] = $tt;
+                       }
                }
        }
 
@@ -1268,8 +1283,9 @@ class SearchHighlighter {
                        while ( $char >= 0x80 && $char < 0xc0 ) {
                                // skip trailing bytes
                                $point++;
-                               if ( $point >= strlen( $text ) )
+                               if ( $point >= strlen( $text ) ) {
                                        return strlen( $text );
+                               }
                                $char = ord( $text[$point] );
                        }
                        return $point;
@@ -1289,24 +1305,28 @@ class SearchHighlighter {
         * @protected
         */
        function process( $pattern, $extracts, &$linesleft, &$contextchars, &$out, &$offsets ) {
-               if ( $linesleft == 0 )
+               if ( $linesleft == 0 ) {
                        return; // nothing to do
+               }
                foreach ( $extracts as $index => $line ) {
-                       if ( array_key_exists( $index, $out ) )
+                       if ( array_key_exists( $index, $out ) ) {
                                continue; // this line already highlighted
+                       }
 
                        $m = array();
-                       if ( !preg_match( $pattern, $line, $m, PREG_OFFSET_CAPTURE ) )
+                       if ( !preg_match( $pattern, $line, $m, PREG_OFFSET_CAPTURE ) ) {
                                continue;
+                       }
 
                        $offset = $m[0][1];
                        $len = strlen( $m[0][0] );
-                       if ( $offset + $len < $contextchars )
+                       if ( $offset + $len < $contextchars ) {
                                $begin = 0;
-                       elseif ( $len > $contextchars )
+                       } elseif ( $len > $contextchars ) {
                                $begin = $offset;
-                       else
+                       } else {
                                $begin = $offset + intval( ( $len - $contextchars ) / 2 );
+                       }
 
                        $end = $begin + $contextchars;
 
@@ -1315,8 +1335,9 @@ class SearchHighlighter {
                        $out[$index] = $this->extract( $line, $begin, $end, $posBegin );
                        $offsets[$index] = $posBegin;
                        $linesleft--;
-                       if ( $linesleft == 0 )
+                       if ( $linesleft == 0 ) {
                                return;
+                       }
                }
        }
 
@@ -1357,16 +1378,17 @@ class SearchHighlighter {
         */
        function linkReplace( $matches ) {
                $colon = strpos( $matches[1], ':' );
-               if ( $colon === false )
+               if ( $colon === false ) {
                        return $matches[2]; // replace with caption
+               }
                global $wgContLang;
                $ns = substr( $matches[1], 0, $colon );
                $index = $wgContLang->getNsIndex( $ns );
-               if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) )
+               if ( $index !== false && ( $index == NS_FILE || $index == NS_CATEGORY ) ) {
                        return $matches[0]; // return the whole thing
-               else
+               } else {
                        return $matches[2];
-
+               }
        }
 
        /**
index 163d9dc..cbc1a7a 100644 (file)
@@ -170,8 +170,9 @@ class SearchMssql extends SearchEngine {
 
                                if ( !empty( $terms[3] ) ) {
                                        $regexp = preg_quote( $terms[3], '/' );
-                                       if ( $terms[4] )
+                                       if ( $terms[4] ) {
                                                $regexp .= "[0-9A-Za-z_]+";
+                                       }
                                } else {
                                        $regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
                                }
@@ -247,8 +248,9 @@ class MssqlSearchResultSet extends SearchResultSet {
 
        function next() {
                $row = $this->mResultSet->fetchObject();
-               if ( $row === false )
+               if ( $row === false ) {
                        return false;
+               }
                return new SearchResult( $row );
        }
 }
index 4a501fd..c219b92 100644 (file)
@@ -57,12 +57,12 @@ class SearchMySQL extends SearchEngine {
 
                # @todo FIXME: This doesn't handle parenthetical expressions.
                $m = array();
-               if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+               if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
-                       foreach( $m as $bits ) {
+                       foreach ( $m as $bits ) {
                                @list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
 
-                               if( $nonQuoted != '' ) {
+                               if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
                                        $quote = '';
                                } else {
@@ -70,8 +70,10 @@ class SearchMySQL extends SearchEngine {
                                        $quote = '"';
                                }
 
-                               if( $searchon !== '' ) $searchon .= ' ';
-                               if( $this->strictMatching && ($modifier == '') ) {
+                               if ( $searchon !== '' ) {
+                                       $searchon .= ' ';
+                               }
+                               if ( $this->strictMatching && ( $modifier == '' ) ) {
                                        // If we leave this out, boolean op defaults to OR which is rarely helpful.
                                        $modifier = '+';
                                }
@@ -79,7 +81,7 @@ class SearchMySQL extends SearchEngine {
                                // Some languages such as Serbian store the input form in the search index,
                                // so we may need to search for matches in multiple writing system variants.
                                $convertedVariants = $wgContLang->autoConvertToAllVariants( $term );
-                               if( is_array( $convertedVariants ) ) {
+                               if ( is_array( $convertedVariants ) ) {
                                        $variants = array_unique( array_values( $convertedVariants ) );
                                } else {
                                        $variants = array( $term );
@@ -99,11 +101,12 @@ class SearchMySQL extends SearchEngine {
                                $strippedVariants = array_unique( $strippedVariants );
 
                                $searchon .= $modifier;
-                               if( count( $strippedVariants) > 1 )
+                               if ( count( $strippedVariants ) > 1 ) {
                                        $searchon .= '(';
-                               foreach( $strippedVariants as $stripped ) {
+                               }
+                               foreach ( $strippedVariants as $stripped ) {
                                        $stripped = $this->normalizeText( $stripped );
-                                       if( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
+                                       if ( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
                                                // Hack for Chinese: we need to toss in quotes for
                                                // multiple-character phrases since normalizeForSearch()
                                                // added spaces between them to make word breaks.
@@ -111,8 +114,9 @@ class SearchMySQL extends SearchEngine {
                                        }
                                        $searchon .= "$quote$stripped$quote$wildcard ";
                                }
-                               if( count( $strippedVariants) > 1 )
+                               if ( count( $strippedVariants ) > 1 ) {
                                        $searchon .= ')';
+                               }
 
                                // Match individual terms or quoted phrase in result highlighting...
                                // Note that variants will be introduced in a later stage for highlighting!
@@ -134,8 +138,8 @@ class SearchMySQL extends SearchEngine {
                global $wgContLang;
 
                $regex = preg_quote( $string, '/' );
-               if( $wgContLang->hasWordBreaks() ) {
-                       if( $wildcard ) {
+               if ( $wgContLang->hasWordBreaks() ) {
+                       if ( $wildcard ) {
                                // Don't cut off the final bit!
                                $regex = "\b$regex";
                        } else {
@@ -177,7 +181,9 @@ class SearchMySQL extends SearchEngine {
                global $wgCountTotalSearchHits;
 
                // This seems out of place, why is this called with empty term?
-               if ( trim( $term ) === '' ) return null;
+               if ( trim( $term ) === '' ) {
+                       return null;
+               }
 
                $filteredTerm = $this->filter( $term );
                $query = $this->getQuery( $filteredTerm, $fulltext );
@@ -187,7 +193,7 @@ class SearchMySQL extends SearchEngine {
                );
 
                $total = null;
-               if( $wgCountTotalSearchHits ) {
+               if ( $wgCountTotalSearchHits ) {
                        $query = $this->getCountQuery( $filteredTerm, $fulltext );
                        $totalResult = $this->db->select(
                                $query['tables'], $query['fields'], $query['conds'],
@@ -195,7 +201,7 @@ class SearchMySQL extends SearchEngine {
                        );
 
                        $row = $totalResult->fetchObject();
-                       if( $row ) {
+                       if ( $row ) {
                                $total = intval( $row->c );
                        }
                        $totalResult->free();
@@ -205,7 +211,7 @@ class SearchMySQL extends SearchEngine {
        }
 
        public function supports( $feature ) {
-               switch( $feature ) {
+               switch ( $feature ) {
                case 'list-redirects':
                case 'title-suffix-filter':
                        return true;
@@ -223,7 +229,7 @@ class SearchMySQL extends SearchEngine {
                foreach ( $this->features as $feature => $value ) {
                        if ( $feature === 'list-redirects' && !$value ) {
                                $query['conds']['page_is_redirect'] = 0;
-                       } elseif( $feature === 'title-suffix-filter' && $value ) {
+                       } elseif ( $feature === 'title-suffix-filter' && $value ) {
                                $query['conds'][] = 'page_title' . $this->db->buildLike( $this->db->anyString(), $value );
                        }
                }
@@ -358,7 +364,7 @@ class SearchMySQL extends SearchEngine {
 
                $dbw->update( 'searchindex',
                        array( 'si_title' => $this->normalizeText( $title ) ),
-                       array( 'si_page'  => $id ),
+                       array( 'si_page' => $id ),
                        __METHOD__,
                        array( $dbw->lowPriorityOption() ) );
        }
@@ -386,7 +392,7 @@ class SearchMySQL extends SearchEngine {
                // ignores short words... Pad them so we can pass them
                // through without reconfiguring the server...
                $minLength = $this->minSearchLength();
-               if( $minLength > 1 ) {
+               if ( $minLength > 1 ) {
                        $n = $minLength - 1;
                        $out = preg_replace(
                                "/\b(\w{1,$n})\b/",
@@ -427,7 +433,7 @@ class SearchMySQL extends SearchEngine {
         * @return int
         */
        protected function minSearchLength() {
-               if( is_null( self::$mMinSearchLength ) ) {
+               if ( is_null( self::$mMinSearchLength ) ) {
                        $sql = "SHOW GLOBAL VARIABLES LIKE 'ft\\_min\\_word\\_len'";
 
                        $dbr = wfGetDB( DB_SLAVE );
@@ -435,7 +441,7 @@ class SearchMySQL extends SearchEngine {
                        $row = $result->fetchObject();
                        $result->free();
 
-                       if( $row && $row->Variable_name == 'ft_min_word_len' ) {
+                       if ( $row && $row->Variable_name == 'ft_min_word_len' ) {
                                self::$mMinSearchLength = intval( $row->Value );
                        } else {
                                self::$mMinSearchLength = 0;
@@ -449,7 +455,7 @@ class SearchMySQL extends SearchEngine {
  * @ingroup Search
  */
 class MySQLSearchResultSet extends SqlSearchResultSet {
-       function __construct( $resultSet, $terms, $totalHits=null ) {
+       function __construct( $resultSet, $terms, $totalHits = null ) {
                parent::__construct( $resultSet, $terms );
                $this->mTotalHits = $totalHits;
        }
index b0ea97f..a847965 100644 (file)
  */
 class SearchOracle extends SearchEngine {
 
-       private $reservedWords = array ('ABOUT' => 1,
-                                                                       'ACCUM' => 1,
-                                                                       'AND' => 1,
-                                                                       'BT' => 1,
-                                                                       'BTG' => 1,
-                                                                       'BTI' => 1,
-                                                                       'BTP' => 1,
-                                                                       'FUZZY' => 1,
-                                                                       'HASPATH' => 1,
-                                                                       'INPATH' => 1,
-                                                                       'MINUS' => 1,
-                                                                       'NEAR' => 1,
-                                                                       'NOT' => 1,
-                                                                       'NT' => 1,
-                                                                       'NTG' => 1,
-                                                                       'NTI' => 1,
-                                                                       'NTP' => 1,
-                                                                       'OR' => 1,
-                                                                       'PT' => 1,
-                                                                       'RT' => 1,
-                                                                       'SQE' => 1,
-                                                                       'SYN' => 1,
-                                                                       'TR' => 1,
-                                                                       'TRSYN' => 1,
-                                                                       'TT' => 1,
-                                                                       'WITHIN' => 1);
+       private $reservedWords = array(
+               'ABOUT' => 1,
+               'ACCUM' => 1,
+               'AND' => 1,
+               'BT' => 1,
+               'BTG' => 1,
+               'BTI' => 1,
+               'BTP' => 1,
+               'FUZZY' => 1,
+               'HASPATH' => 1,
+               'INPATH' => 1,
+               'MINUS' => 1,
+               'NEAR' => 1,
+               'NOT' => 1,
+               'NT' => 1,
+               'NTG' => 1,
+               'NTI' => 1,
+               'NTP' => 1,
+               'OR' => 1,
+               'PT' => 1,
+               'RT' => 1,
+               'SQE' => 1,
+               'SYN' => 1,
+               'TR' => 1,
+               'TRSYN' => 1,
+               'TT' => 1,
+               'WITHIN' => 1,
+       );
 
        /**
         * Creates an instance of this class
@@ -72,8 +74,9 @@ class SearchOracle extends SearchEngine {
         * @return SqlSearchResultSet
         */
        function searchText( $term ) {
-               if ( $term == '' )
+               if ( $term == '' ) {
                        return new SqlSearchResultSet( false, '' );
+               }
 
                $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
@@ -86,8 +89,9 @@ class SearchOracle extends SearchEngine {
         * @return SqlSearchResultSet
         */
        function searchTitle( $term ) {
-               if ( $term == '' )
+               if ( $term == '' ) {
                        return new SqlSearchResultSet( false, '' );
+               }
 
                $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
                return new MySQLSearchResultSet( $resultSet, $this->searchTerms );
@@ -110,8 +114,9 @@ class SearchOracle extends SearchEngine {
         * @return String
         */
        function queryNamespaces() {
-               if( is_null( $this->namespaces ) )
+               if ( is_null( $this->namespaces ) ) {
                        return '';
+               }
                if ( !count( $this->namespaces ) ) {
                        $namespaces = '0';
                } else {
@@ -195,23 +200,24 @@ class SearchOracle extends SearchEngine {
                $searchon = '';
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
-                       foreach( $m as $terms ) {
+                       foreach ( $m as $terms ) {
                                // Search terms in all variant forms, only
                                // apply on wiki with LanguageConverter
                                $temp_terms = $wgContLang->autoConvertToAllVariants( $terms[2] );
-                               if( is_array( $temp_terms )) {
-                                       $temp_terms = array_unique( array_values( $temp_terms ));
-                                       foreach( $temp_terms as $t ) {
-                                               $searchon .= ($terms[1] == '-' ? ' ~' : ' & ') . $this->escapeTerm( $t );
+                               if ( is_array( $temp_terms ) ) {
+                                       $temp_terms = array_unique( array_values( $temp_terms ) );
+                                       foreach ( $temp_terms as $t ) {
+                                               $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $t );
                                        }
                                }
                                else {
-                                       $searchon .= ($terms[1] == '-' ? ' ~' : ' & ') . $this->escapeTerm( $terms[2] );
+                                       $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $terms[2] );
                                }
                                if ( !empty( $terms[3] ) ) {
                                        $regexp = preg_quote( $terms[3], '/' );
-                                       if ( $terms[4] )
+                                       if ( $terms[4] ) {
                                                $regexp .= "[0-9A-Za-z_]+";
+                                       }
                                } else {
                                        $regexp = preg_quote( str_replace( '"', '', $terms[2] ), '/' );
                                }
@@ -227,9 +233,9 @@ class SearchOracle extends SearchEngine {
        private function escapeTerm( $t ) {
                global $wgContLang;
                $t = $wgContLang->normalizeForSearch( $t );
-               $t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{'.$t.'}' : $t;
-               $t = preg_replace('/^"(.*)"$/', '($1)', $t);
-               $t = preg_replace('/([-&|])/', '\\\\$1', $t);
+               $t = isset( $this->reservedWords[strtoupper( $t )] ) ? '{' . $t . '}' : $t;
+               $t = preg_replace( '/^"(.*)"$/', '($1)', $t );
+               $t = preg_replace( '/([-&|])/', '\\\\$1', $t );
                return $t;
        }
        /**
@@ -273,7 +279,7 @@ class SearchOracle extends SearchEngine {
 
                $dbw->update( 'searchindex',
                        array( 'si_title' => $title ),
-                       array( 'si_page'  => $id ),
+                       array( 'si_page' => $id ),
                        'SearchOracle::updateTitle',
                        array() );
        }
index 56464e9..7f19ed1 100644 (file)
@@ -64,7 +64,7 @@ class SearchPostgres extends SearchEngine {
 
        function searchText( $term ) {
                $q = $this->searchQuery( $term, 'textvector', 'old_text' );
-               $olderror = error_reporting(E_ERROR);
+               $olderror = error_reporting( E_ERROR );
                $resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
                error_reporting( $olderror );
                if ( !$resultSet ) {
@@ -86,19 +86,19 @@ class SearchPostgres extends SearchEngine {
                wfDebug( "parseQuery received: $term \n" );
 
                ## No backslashes allowed
-               $term = preg_replace('/\\\/', '', $term);
+               $term = preg_replace( '/\\\/', '', $term );
 
                ## Collapse parens into nearby words:
-               $term = preg_replace('/\s*\(\s*/', ' (', $term);
-               $term = preg_replace('/\s*\)\s*/', ') ', $term);
+               $term = preg_replace( '/\s*\(\s*/', ' (', $term );
+               $term = preg_replace( '/\s*\)\s*/', ') ', $term );
 
                ## Treat colons as word separators:
-               $term = preg_replace('/:/', ' ', $term);
+               $term = preg_replace( '/:/', ' ', $term );
 
                $searchstring = '';
                $m = array();
-               if( preg_match_all('/([-!]?)(\S+)\s*/', $term, $m, PREG_SET_ORDER ) ) {
-                       foreach( $m as $terms ) {
+               if ( preg_match_all( '/([-!]?)(\S+)\s*/', $term, $m, PREG_SET_ORDER ) ) {
+                       foreach ( $m as $terms ) {
                                if ( strlen( $terms[1] ) ) {
                                        $searchstring .= ' & !';
                                }
@@ -118,19 +118,19 @@ class SearchPostgres extends SearchEngine {
                }
 
                ## Strip out leading junk
-               $searchstring = preg_replace('/^[\s\&\|]+/', '', $searchstring);
+               $searchstring = preg_replace( '/^[\s\&\|]+/', '', $searchstring );
 
                ## Remove any doubled-up operators
-               $searchstring = preg_replace('/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring);
+               $searchstring = preg_replace( '/([\!\&\|]) +(?:[\&\|] +)+/', "$1 ", $searchstring );
 
                ## Remove any non-spaced operators (e.g. "Zounds!")
-               $searchstring = preg_replace('/([^ ])[\!\&\|]/', "$1", $searchstring);
+               $searchstring = preg_replace( '/([^ ])[\!\&\|]/', "$1", $searchstring );
 
                ## Remove any trailing whitespace or operators
-               $searchstring = preg_replace('/[\s\!\&\|]+$/', '', $searchstring);
+               $searchstring = preg_replace( '/[\s\!\&\|]+$/', '', $searchstring );
 
                ## Remove unnecessary quotes around everything
-               $searchstring = preg_replace('/^[\'"](.*)[\'"]$/', "$1", $searchstring);
+               $searchstring = preg_replace( '/^[\'"](.*)[\'"]$/', "$1", $searchstring );
 
                ## Quote the whole thing
                $searchstring = $this->db->addQuotes( $searchstring );
@@ -163,30 +163,31 @@ class SearchPostgres extends SearchEngine {
                $top = $top[0];
 
                if ( $top === "" ) { ## e.g. if only stopwords are used XXX return something better
-                       $query = "SELECT page_id, page_namespace, page_title, 0 AS score ".
+                       $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 {
                        $m = array();
-                       if( preg_match_all("/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
-                               foreach( $m as $terms ) {
+                       if ( preg_match_all( "/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
+                               foreach ( $m as $terms ) {
                                        $this->searchTerms[$terms[1]] = $terms[1];
                                }
                        }
 
-                       $query = "SELECT page_id, page_namespace, page_title, ".
-                       "ts_rank($fulltext, to_tsquery($searchstring), 5) AS score ".
+                       $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)";
                }
 
                ## Redirects
-               if ( !$this->showRedirects )
+               if ( !$this->showRedirects ) {
                        $query .= ' AND page_is_redirect = 0';
+               }
 
                ## Namespaces - defaults to 0
-               if( !is_null( $this->namespaces ) ) { // null -> search all
+               if ( !is_null( $this->namespaces ) ) { // null -> search all
                        if ( count( $this->namespaces ) < 1 ) {
                                $query .= ' AND page_namespace = 0';
                        } else {
@@ -208,7 +209,7 @@ class SearchPostgres extends SearchEngine {
 
        function update( $pageid, $title, $text ) {
                ## We don't want to index older revisions
-               $SQL = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN ".
+               $SQL = "UPDATE pagecontent SET textvector = NULL WHERE old_id IN " .
                                "(SELECT rev_text_id FROM revision WHERE rev_page = " . intval( $pageid ) .
                                " ORDER BY rev_text_id DESC OFFSET 1)";
                $this->db->query( $SQL );
@@ -244,7 +245,7 @@ class PostgresSearchResultSet extends SqlSearchResultSet {
 
        function next() {
                $row = $this->mResultSet->fetchObject();
-               if( $row === false ) {
+               if ( $row === false ) {
                        return false;
                } else {
                        return new PostgresSearchResult( $row );
index f3f4788..554181f 100644 (file)
@@ -61,12 +61,12 @@ class SearchSqlite extends SearchEngine {
                $this->searchTerms = array();
 
                $m = array();
-               if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
+               if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
-                       foreach( $m as $bits ) {
+                       foreach ( $m as $bits ) {
                                @list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
 
-                               if( $nonQuoted != '' ) {
+                               if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
                                        $quote = '';
                                } else {
@@ -74,14 +74,14 @@ class SearchSqlite extends SearchEngine {
                                        $quote = '"';
                                }
 
-                               if( $searchon !== '' ) {
+                               if ( $searchon !== '' ) {
                                        $searchon .= ' ';
                                }
 
                                // Some languages such as Serbian store the input form in the search index,
                                // so we may need to search for matches in multiple writing system variants.
                                $convertedVariants = $wgContLang->autoConvertToAllVariants( $term );
-                               if( is_array( $convertedVariants ) ) {
+                               if ( is_array( $convertedVariants ) ) {
                                        $variants = array_unique( array_values( $convertedVariants ) );
                                } else {
                                        $variants = array( $term );
@@ -101,10 +101,11 @@ class SearchSqlite extends SearchEngine {
                                $strippedVariants = array_unique( $strippedVariants );
 
                                $searchon .= $modifier;
-                               if( count( $strippedVariants) > 1 )
+                               if ( count( $strippedVariants ) > 1 ) {
                                        $searchon .= '(';
-                               foreach( $strippedVariants as $stripped ) {
-                                       if( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
+                               }
+                               foreach ( $strippedVariants as $stripped ) {
+                                       if ( $nonQuoted && strpos( $stripped, ' ' ) !== false ) {
                                                // Hack for Chinese: we need to toss in quotes for
                                                // multiple-character phrases since normalizeForSearch()
                                                // added spaces between them to make word breaks.
@@ -112,8 +113,9 @@ class SearchSqlite extends SearchEngine {
                                        }
                                        $searchon .= "$quote$stripped$quote$wildcard ";
                                }
-                               if( count( $strippedVariants) > 1 )
+                               if ( count( $strippedVariants ) > 1 ) {
                                        $searchon .= ')';
+                               }
 
                                // Match individual terms or quoted phrase in result highlighting...
                                // Note that variants will be introduced in a later stage for highlighting!
@@ -134,8 +136,8 @@ class SearchSqlite extends SearchEngine {
                global $wgContLang;
 
                $regex = preg_quote( $string, '/' );
-               if( $wgContLang->hasWordBreaks() ) {
-                       if( $wildcard ) {
+               if ( $wgContLang->hasWordBreaks() ) {
+                       if ( $wildcard ) {
                                // Don't cut off the final bit!
                                $regex = "\b$regex";
                        } else {
@@ -184,10 +186,10 @@ class SearchSqlite extends SearchEngine {
                $resultSet = $this->db->query( $this->getQuery( $filteredTerm, $fulltext ) );
 
                $total = null;
-               if( $wgCountTotalSearchHits ) {
+               if ( $wgCountTotalSearchHits ) {
                        $totalResult = $this->db->query( $this->getCountQuery( $filteredTerm, $fulltext ) );
                        $row = $totalResult->fetchObject();
-                       if( $row ) {
+                       if ( $row ) {
                                $total = intval( $row->c );
                        }
                        $totalResult->free();
@@ -201,7 +203,7 @@ class SearchSqlite extends SearchEngine {
         * @return String
         */
        function queryRedirect() {
-               if( $this->showRedirects ) {
+               if ( $this->showRedirects ) {
                        return '';
                } else {
                        return 'AND page_is_redirect=0';
@@ -213,8 +215,9 @@ class SearchSqlite extends SearchEngine {
         * @return String
         */
        function queryNamespaces() {
-               if( is_null( $this->namespaces ) )
+               if ( is_null( $this->namespaces ) ) {
                        return '';  # search all
+               }
                if ( !count( $this->namespaces ) ) {
                        $namespaces = '0';
                } else {
@@ -295,7 +298,7 @@ class SearchSqlite extends SearchEngine {
                if ( !$this->fulltextSearchSupported() ) {
                        return;
                }
-               // @todo: find a method to do it in a single request,
+               // @todo find a method to do it in a single request,
                // couldn't do it so far due to typelessness of FTS3 tables.
                $dbw = wfGetDB( DB_MASTER );
 
@@ -324,7 +327,7 @@ class SearchSqlite extends SearchEngine {
 
                $dbw->update( 'searchindex',
                        array( 'si_title' => $title ),
-                       array( 'rowid'  => $id ),
+                       array( 'rowid' => $id ),
                        __METHOD__ );
        }
 }
@@ -333,7 +336,7 @@ class SearchSqlite extends SearchEngine {
  * @ingroup Search
  */
 class SqliteSearchResultSet extends SqlSearchResultSet {
-       function __construct( $resultSet, $terms, $totalHits=null ) {
+       function __construct( $resultSet, $terms, $totalHits = null ) {
                parent::__construct( $resultSet, $terms );
                $this->mTotalHits = $totalHits;
        }
index eabcda3..8c1bda2 100644 (file)
@@ -40,7 +40,7 @@ class SearchUpdate implements DeferrableUpdate {
                        $nt = $title;
                }
 
-               if( $nt ) {
+               if ( $nt ) {
                        $this->mId = $id;
                        $this->mText = $text;
 
@@ -56,7 +56,7 @@ class SearchUpdate implements DeferrableUpdate {
        function doUpdate() {
                global $wgContLang, $wgDisableSearchUpdate;
 
-               if( $wgDisableSearchUpdate || !$this->mId ) {
+               if ( $wgDisableSearchUpdate || !$this->mId ) {
                        return;
                }
 
@@ -65,8 +65,8 @@ class SearchUpdate implements DeferrableUpdate {
                $search = SearchEngine::create();
                $lc = SearchEngine::legalSearchChars() . '&#;';
 
-               if( $this->mText === false ) {
-                       $search->updateTitle($this->mId,
+               if ( $this->mText === false ) {
+                       $search->updateTitle( $this->mId,
                                $search->normalizeText( Title::indexTitle( $this->mNamespace, $this->mTitle ) ) );
                        wfProfileOut( __METHOD__ );
                        return;
index 0509272..f3b8a0c 100644 (file)
@@ -123,17 +123,17 @@ class MediaWikiSite extends Site {
                                'converttitles' => true,
                                'format' => 'json',
                                'titles' => $pageName,
-                               //@todo: options for maxlag and maxage
+                               // @todo options for maxlag and maxage
                                // Note that maxlag will lead to a long delay before a reply is made,
                                // but that maxage can avoid the extreme delay. On the other hand
                                // maxage could be nice to use anyhow as it stops unnecessary requests.
                                // Also consider smaxage if maxage is used.
                        );
 
-                       $url = $this->getFileUrl( 'api.php' ) . '?' . wfArrayToCgi( $args );
+                       $url = wfAppendQuery( $this->getFileUrl( 'api.php' ), $args );
 
                        // Go on call the external site
-                       //@todo: we need a good way to specify a timeout here.
+                       // @todo we need a good way to specify a timeout here.
                        $ret = Http::get( $url );
                }
 
@@ -185,7 +185,7 @@ class MediaWikiSite extends Site {
                // the single page in the "pages" substructure.
                if ( isset( $externalData['query']['pages'] ) ) {
                        $pages = array_values( $externalData['query']['pages'] );
-                       if ( count( $pages) === 1 ) {
+                       if ( count( $pages ) === 1 ) {
                                return $pages[0];
                        }
                }
index c9c82ad..3885043 100644 (file)
@@ -62,7 +62,7 @@ class ActiveUsersPager extends UsersPager {
                $this->requestedUser = '';
                if ( $un != '' ) {
                        $username = Title::makeTitleSafe( NS_USER, $un );
-                       if( !is_null( $username ) ) {
+                       if ( !is_null( $username ) ) {
                                $this->requestedUser = $username->getText();
                        }
                }
@@ -91,42 +91,62 @@ class ActiveUsersPager extends UsersPager {
        }
 
        function getQueryInfo() {
-               $dbr = wfGetDB( DB_SLAVE );
+               $dbr = $this->getDatabase();
+
                $conds = array( 'rc_user > 0' ); // Users - no anons
-               if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
-                       $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; // don't show hidden names
-               }
                $conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
                $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes(
-                       $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
+                       $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge * 24 * 3600 ) );
 
-               if( $this->requestedUser != '' ) {
+               if ( $this->requestedUser != '' ) {
                        $conds[] = 'rc_user_text >= ' . $dbr->addQuotes( $this->requestedUser );
                }
 
+               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+                       $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
+                               'ipblocks', '1', array( 'rc_user=ipb_user', 'ipb_deleted' => 1 )
+                       ) . ')';
+               }
+
                return array(
-                       'tables' => array( 'recentchanges', 'ipblocks' ),
+                       'tables' => array( 'recentchanges' ),
                        'fields' => array(
                                'user_name' => 'rc_user_text', // for Pager inheritance
                                'rc_user_text', // for Pager
-                               'user_id' => 'rc_user',
-                               'recentedits' => 'COUNT(*)',
-                               'ipb_deleted' => 'MAX(ipb_deleted)'
+                               'user_id' => 'MAX(rc_user)', // Postgres
+                               'recentedits' => 'COUNT(*)'
                        ),
                        'options' => array(
-                               'GROUP BY' => array( 'rc_user_text', 'user_id' ),
+                               'GROUP BY' => array( 'rc_user_text' ),
                                'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
                        ),
-                       'join_conds' => array( // check for suppression blocks
-                               'ipblocks' => array( 'LEFT JOIN', array(
-                                       'rc_user=ipb_user',
-                                       'ipb_auto' => 0 # avoid duplicate blocks
-                               )),
-                       ),
                        'conds' => $conds
                );
        }
 
+       function doBatchLookups() {
+               $uids = array();
+               foreach ( $this->mResult as $row ) {
+                       $uids[] = $row->user_id;
+               }
+               // Fetch the block status of the user for showing "(blocked)" text and for
+               // striking out names of suppressed users when privileged user views the list.
+               // Although the first query already hits the block table for un-privileged, this
+               // is done in two queries to avoid huge quicksorts and to make COUNT(*) correct.
+               $dbr = $this->getDatabase();
+               $res = $dbr->select( 'ipblocks',
+                       array( 'ipb_user', 'MAX(ipb_deleted) AS block_status' ),
+                       array( 'ipb_user' => $uids ),
+                       __METHOD__,
+                       array( 'GROUP BY' => array( 'ipb_user' ) )
+               );
+               $this->blockStatusByUid = array();
+               foreach ( $res as $row ) {
+                       $this->blockStatusByUid[$row->ipb_user] = $row->block_status; // 0 or 1
+               }
+               $this->mResult->seek( 0 );
+       }
+
        function formatRow( $row ) {
                $userName = $row->user_name;
 
@@ -139,7 +159,7 @@ class ActiveUsersPager extends UsersPager {
                $user = User::newFromId( $row->user_id );
 
                // User right filter
-               foreach( $this->hideRights as $right ) {
+               foreach ( $this->hideRights as $right ) {
                        // Calling User::getRights() within the loop so that
                        // if the hideRights() filter is empty, we don't have to
                        // trigger the lazy-init of the big userrights array in the
@@ -153,7 +173,7 @@ class ActiveUsersPager extends UsersPager {
                // Note: This is a different loop than for user rights,
                // because we're reusing it to build the group links
                // at the same time
-               foreach( $user->getGroups() as $group ) {
+               foreach ( $user->getGroups() as $group ) {
                        if ( in_array( $group, $this->hideGroups ) ) {
                                return '';
                        }
@@ -163,12 +183,14 @@ class ActiveUsersPager extends UsersPager {
                $groups = $lang->commaList( $list );
 
                $item = $lang->specialList( $ulinks, $groups );
-               if( $row->ipb_deleted ) {
+
+               $isBlocked = isset( $this->blockStatusByUid[$row->user_id] );
+               if ( $isBlocked && $this->blockStatusByUid[$row->user_id] == 1 ) {
                        $item = "<span class=\"deleted\">$item</span>";
                }
                $count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits )
                        ->params( $userName )->numParams( $this->RCMaxAge )->escaped();
-               $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+               $blocked = $isBlocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
 
                return Html::rawElement( 'li', array(), "{$item} [{$count}]{$blocked}" );
        }
index a60c8ef..35d6a0c 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class SpecialAllmessages extends SpecialPage {
-
        /**
         * @var AllmessagesTablePager
         */
@@ -53,8 +52,9 @@ class SpecialAllmessages extends SpecialPage {
                $this->setHeaders();
 
                global $wgUseDatabaseMessages;
-               if( !$wgUseDatabaseMessages ) {
+               if ( !$wgUseDatabaseMessages ) {
                        $out->addWikiMsg( 'allmessagesnotsupportedDB' );
+
                        return;
                } else {
                        $this->outputHeader( 'allmessagestext' );
@@ -74,7 +74,6 @@ class SpecialAllmessages extends SpecialPage {
                        $this->table->getNavigationBar() .
                        $this->table->getBody() .
                        $this->table->getNavigationBar() );
-
        }
 
        protected function getGroupName() {
@@ -87,7 +86,6 @@ class SpecialAllmessages extends SpecialPage {
  * getting data from a table when in fact not all of it comes from the database.
  */
 class AllmessagesTablePager extends TablePager {
-
        protected $filter, $prefix, $langcode, $displayPrefix;
 
        public $mLimitsShown;
@@ -121,15 +119,15 @@ class AllmessagesTablePager extends TablePager {
                $request = $this->getRequest();
 
                $this->filter = $request->getVal( 'filter', 'all' );
-               if( $this->filter === 'all' ) {
+               if ( $this->filter === 'all' ) {
                        $this->custom = null; // So won't match in either case
                } else {
-                       $this->custom = ($this->filter == 'unmodified');
+                       $this->custom = ( $this->filter == 'unmodified' );
                }
 
                $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
                $prefix = $prefix != '' ? Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) : null;
-               if( $prefix !== null ) {
+               if ( $prefix !== null ) {
                        $this->displayPrefix = $prefix->getDBkey();
                        $this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
                } else {
@@ -139,7 +137,7 @@ class AllmessagesTablePager extends TablePager {
 
                // The suffix that may be needed for message names if we're in a
                // different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr'
-               if( $this->foreign ) {
+               if ( $this->foreign ) {
                        $this->suffix = '/' . $this->langcode;
                } else {
                        $this->suffix = '';
@@ -159,36 +157,36 @@ class AllmessagesTablePager extends TablePager {
                        Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
                        '<tr>
                                <td class="mw-label">' .
-                                       Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
-                               "</td>\n
-                               <td class=\"mw-input\">" .
-                                       Xml::input( 'prefix', 20, str_replace( '_', ' ', $this->displayPrefix ), array( 'id' => 'mw-allmessages-form-prefix' ) ) .
-                               "</td>\n
+                       Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
+                       "</td>\n
+                       <td class=\"mw-input\">" .
+                       Xml::input( 'prefix', 20, str_replace( '_', ' ', $this->displayPrefix ), array( 'id' => 'mw-allmessages-form-prefix' ) ) .
+                       "</td>\n
                        </tr>
                        <tr>\n
-                               <td class='mw-label'>" .
-                                       $this->msg( 'allmessages-filter' )->escaped() .
-                               "</td>\n
+                       <td class='mw-label'>" .
+                       $this->msg( 'allmessages-filter' )->escaped() .
+                       "</td>\n
                                <td class='mw-input'>" .
-                                       Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
-                                               'filter',
-                                               'unmodified',
-                                               'mw-allmessages-form-filter-unmodified',
-                                               ( $this->filter == 'unmodified' )
-                                       ) .
-                                       Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
-                                               'filter',
-                                               'all',
-                                               'mw-allmessages-form-filter-all',
-                                               ( $this->filter == 'all' )
-                                       ) .
-                                       Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
-                                               'filter',
-                                               'modified',
-                                               'mw-allmessages-form-filter-modified',
-                                       ( $this->filter == 'modified' )
-                               ) .
-                               "</td>\n
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
+                               'filter',
+                               'unmodified',
+                               'mw-allmessages-form-filter-unmodified',
+                               ( $this->filter == 'unmodified' )
+                       ) .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
+                               'filter',
+                               'all',
+                               'mw-allmessages-form-filter-all',
+                               ( $this->filter == 'all' )
+                       ) .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
+                               'filter',
+                               'modified',
+                               'mw-allmessages-form-filter-modified',
+                               ( $this->filter == 'modified' )
+                       ) .
+                       "</td>\n
                        </tr>
                        <tr>\n
                                <td class=\"mw-label\">" . $langSelect[0] . "</td>\n
@@ -197,29 +195,30 @@ class AllmessagesTablePager extends TablePager {
 
                        '<tr>
                                <td class="mw-label">' .
-                                       Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
-                               '</td>
-                               <td class="mw-input">' .
-                                       $this->getLimitSelect() .
-                               '</td>
+                       Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
+                       '</td>
+                       <td class="mw-input">' .
+                       $this->getLimitSelect() .
+                       '</td>
                        <tr>
                                <td></td>
                                <td>' .
-                                       Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
-                               "</td>\n
+                       Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
+                       "</td>\n
                        </tr>" .
 
                        Xml::closeElement( 'table' ) .
                        $this->getHiddenFields( array( 'title', 'prefix', 'filter', 'lang', 'limit' ) ) .
                        Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' );
+
                return $out;
        }
 
        function getAllMessages( $descending ) {
                wfProfileIn( __METHOD__ );
                $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
-               if( $descending ) {
+               if ( $descending ) {
                        rsort( $messageNames );
                } else {
                        asort( $messageNames );
@@ -229,6 +228,7 @@ class AllmessagesTablePager extends TablePager {
                $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
 
                wfProfileOut( __METHOD__ );
+
                return $messageNames;
        }
 
@@ -260,18 +260,19 @@ class AllmessagesTablePager extends TablePager {
 
                foreach ( $res as $s ) {
                        $exists = false;
-                       if( $foreign ) {
+                       if ( $foreign ) {
                                $title = explode( '/', $s->page_title );
-                               if( count( $title ) === 2 && $langcode == $title[1]
-                                       && isset( $xNames[$title[0]] ) ) {
+                               if ( count( $title ) === 2 && $langcode == $title[1]
+                                       && isset( $xNames[$title[0]] )
+                               ) {
                                        $exists = $title[0];
                                }
-                       } elseif( isset( $xNames[$s->page_title] ) ) {
+                       } elseif ( isset( $xNames[$s->page_title] ) ) {
                                $exists = $s->page_title;
                        }
-                       if( $exists && $s->page_namespace == NS_MEDIAWIKI ) {
+                       if ( $exists && $s->page_namespace == NS_MEDIAWIKI ) {
                                $pageFlags[$exists] = true;
-                       } elseif( $exists && $s->page_namespace == NS_MEDIAWIKI_TALK ) {
+                       } elseif ( $exists && $s->page_namespace == NS_MEDIAWIKI_TALK ) {
                                $talkFlags[$exists] = true;
                        }
                }
@@ -284,6 +285,9 @@ class AllmessagesTablePager extends TablePager {
        /**
         *  This function normally does a database query to get the results; we need
         * to make a pretend result using a FakeResultWrapper.
+        * @param string $offset
+        * @param int $limit
+        * @param bool $descending
         * @return FakeResultWrapper
         */
        function reallyDoQuery( $offset, $limit, $descending ) {
@@ -293,27 +297,29 @@ class AllmessagesTablePager extends TablePager {
                $statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign );
 
                $count = 0;
-               foreach( $messageNames as $key ) {
+               foreach ( $messageNames as $key ) {
                        $customised = isset( $statuses['pages'][$key] );
-                       if( $customised !== $this->custom &&
+                       if ( $customised !== $this->custom &&
                                ( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) &&
                                ( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false )
                        ) {
                                $actual = wfMessage( $key )->inLanguage( $this->langcode )->plain();
                                $default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain();
                                $result->result[] = array(
-                                       'am_title'      => $key,
-                                       'am_actual'     => $actual,
-                                       'am_default'    => $default,
+                                       'am_title' => $key,
+                                       'am_actual' => $actual,
+                                       'am_default' => $default,
                                        'am_customised' => $customised,
                                        'am_talk_exists' => isset( $statuses['talks'][$key] )
                                );
                                $count++;
                        }
-                       if( $count == $limit ) {
+
+                       if ( $count == $limit ) {
                                break;
                        }
                }
+
                return $result;
        }
 
@@ -321,26 +327,26 @@ class AllmessagesTablePager extends TablePager {
                return Xml::openElement( 'table', array( 'class' => 'mw-datatable TablePager', 'id' => 'mw-allmessagestable' ) ) . "\n" .
                        "<thead><tr>
                                <th rowspan=\"2\">" .
-                                       $this->msg( 'allmessagesname' )->escaped() . "
+                       $this->msg( 'allmessagesname' )->escaped() . "
                                </th>
                                <th>" .
-                                       $this->msg( 'allmessagesdefault' )->escaped() .
-                               "</th>
+                       $this->msg( 'allmessagesdefault' )->escaped() .
+                       "</th>
                        </tr>\n
                        <tr>
                                <th>" .
-                                       $this->msg( 'allmessagescurrent' )->escaped() .
-                               "</th>
+                       $this->msg( 'allmessagescurrent' )->escaped() .
+                       "</th>
                        </tr></thead><tbody>\n";
        }
 
        function formatValue( $field, $value ) {
-               switch( $field ) {
+               switch ( $field ) {
                        case 'am_title' :
                                $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
                                $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
 
-                               if( $this->mCurrentRow->am_customised ) {
+                               if ( $this->mCurrentRow->am_customised ) {
                                        $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
                                } else {
                                        $title = Linker::link(
@@ -362,6 +368,7 @@ class AllmessagesTablePager extends TablePager {
                                                array( 'broken' )
                                        );
                                }
+
                                return $title . ' ' . $this->msg( 'parentheses' )->rawParams( $talk )->escaped();
 
                        case 'am_default' :
@@ -376,7 +383,7 @@ class AllmessagesTablePager extends TablePager {
                $s = parent::formatRow( $row );
 
                // But if there's a customised message, add that too.
-               if( $row->am_customised ) {
+               if ( $row->am_customised ) {
                        $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
                        $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
                        if ( $formatted == '' ) {
@@ -385,24 +392,26 @@ class AllmessagesTablePager extends TablePager {
                        $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
                                . "</tr>\n";
                }
+
                return $s;
        }
 
        function getRowAttrs( $row, $isSecond = false ) {
                $arr = array();
-               if( $row->am_customised ) {
+               if ( $row->am_customised ) {
                        $arr['class'] = 'allmessages-customised';
                }
-               if( !$isSecond ) {
+               if ( !$isSecond ) {
                        $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
                }
+
                return $arr;
        }
 
        function getCellAttrs( $field, $value ) {
-               if( $this->mCurrentRow->am_customised && $field == 'am_title' ) {
+               if ( $this->mCurrentRow->am_customised && $field == 'am_title' ) {
                        return array( 'rowspan' => '2', 'class' => $field );
-               } elseif( $field == 'am_title' ) {
+               } elseif ( $field == 'am_title' ) {
                        return array( 'class' => $field );
                } else {
                        return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
index f9cb5cd..a082049 100644 (file)
@@ -71,7 +71,6 @@ class SpecialAllpages extends IncludableSpecialPage {
         * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default NULL)
         */
        function execute( $par ) {
-               global $wgContLang;
                $request = $this->getRequest();
                $out = $this->getOutput();
 
@@ -85,18 +84,18 @@ class SpecialAllpages extends IncludableSpecialPage {
                $namespace = $request->getInt( 'namespace' );
                $hideredirects = $request->getBool( 'hideredirects', false );
 
-               $namespaces = $wgContLang->getNamespaces();
+               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
 
                $out->setPageTitle(
-                       ( $namespace > 0 && in_array( $namespace, array_keys( $namespaces) ) ) ?
-                       $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
-                       $this->msg( 'allarticles' )
+                       ( $namespace > 0 && in_array( $namespace, array_keys( $namespaces ) ) ) ?
+                               $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
+                               $this->msg( 'allarticles' )
                );
                $out->addModuleStyles( 'mediawiki.special' );
 
-               if( $par !== null ) {
+               if ( $par !== null ) {
                        $this->showChunk( $namespace, $par, $to, $hideredirects );
-               } elseif( $from !== null && $to === null ) {
+               } elseif ( $from !== null && $to === null ) {
                        $this->showChunk( $namespace, $from, $to, $hideredirects );
                } else {
                        $this->showToplevel( $namespace, $from, $to, $hideredirects );
@@ -160,6 +159,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                $out .= Xml::closeElement( 'fieldset' );
                $out .= Xml::closeElement( 'form' );
                $out .= Xml::closeElement( 'div' );
+
                return $out;
        }
 
@@ -188,10 +188,13 @@ class SpecialAllpages extends IncludableSpecialPage {
                $from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
                $to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
 
-               if( isset( $from ) )
+               if ( isset( $from ) ) {
                        $where[] = 'page_title >= ' . $dbr->addQuotes( $from );
-               if( isset( $to ) )
+               }
+
+               if ( isset( $to ) ) {
                        $where[] = 'page_title <= ' . $dbr->addQuotes( $to );
+               }
 
                global $wgMemc;
                $key = wfMemcKey( 'allpages', 'ns', $namespace, sha1( $from ), sha1( $to ) );
@@ -201,7 +204,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                $maxPerSubpage = intval( $count / $this->maxLineCount );
                $maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
 
-               if( !is_array( $lines ) ) {
+               if ( !is_array( $lines ) ) {
                        $options = array( 'LIMIT' => 1 );
                        $options['ORDER BY'] = 'page_title ASC';
                        $firstTitle = $dbr->selectField( 'page', 'page_title', $where, __METHOD__, $options );
@@ -210,7 +213,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                        $lines = array( $firstTitle );
                        # If we are going to show n rows, we need n+1 queries to find the relevant titles.
                        $done = false;
-                       while( !$done ) {
+                       while ( !$done ) {
                                // Fetch the last title of this chunk and the first of the next
                                $chunk = ( $lastTitle === false )
                                        ? array()
@@ -223,7 +226,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                                );
 
                                $s = $dbr->fetchObject( $res );
-                               if( $s ) {
+                               if ( $s ) {
                                        array_push( $lines, $s->page_title );
                                } else {
                                        // Final chunk, but ended prematurely. Go back and find the end.
@@ -233,8 +236,9 @@ class SpecialAllpages extends IncludableSpecialPage {
                                        array_push( $lines, $endTitle );
                                        $done = true;
                                }
+
                                $s = $res->fetchObject();
-                               if( $s ) {
+                               if ( $s ) {
                                        array_push( $lines, $s->page_title );
                                        $lastTitle = $s->page_title;
                                } else {
@@ -249,18 +253,19 @@ class SpecialAllpages extends IncludableSpecialPage {
 
                // If there are only two or less sections, don't even display them.
                // Instead, display the first section directly.
-               if( count( $lines ) <= 2 ) {
-                       if( !empty( $lines ) ) {
+               if ( count( $lines ) <= 2 ) {
+                       if ( !empty( $lines ) ) {
                                $this->showChunk( $namespace, $from, $to, $hideredirects );
                        } else {
                                $output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
                        }
+
                        return;
                }
 
                # At this point, $lines should contain an even number of elements.
                $out .= Xml::openElement( 'table', array( 'class' => 'allpageslist' ) );
-               while( count ( $lines ) > 0 ) {
+               while ( count( $lines ) > 0 ) {
                        $inpoint = array_shift( $lines );
                        $outpoint = array_shift( $lines );
                        $out .= $this->showline( $inpoint, $outpoint, $namespace, $hideredirects );
@@ -269,19 +274,19 @@ class SpecialAllpages extends IncludableSpecialPage {
                $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
 
                # Is there more?
-               if( $this->including() ) {
+               if ( $this->including() ) {
                        $out2 = '';
                } else {
-                       if( isset( $from ) || isset( $to ) ) {
-                               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
-                                               '<tr>
+                       if ( isset( $from ) || isset( $to ) ) {
+                               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+                                       '<tr>
                                                        <td>' .
-                                                               $nsForm .
-                                                       '</td>
+                                       $nsForm .
+                                       '</td>
                                                        <td class="mw-allpages-nav">' .
-                                                               Linker::link( $this->getTitle(), $this->msg( 'allpages' )->escaped(),
-                                                                       array(), array(), 'known' ) .
-                                                       "</td>
+                                       Linker::link( $this->getTitle(), $this->msg( 'allpages' )->escaped(),
+                                               array(), array(), 'known' ) .
+                                       "</td>
                                                </tr>" .
                                        Xml::closeElement( 'table' );
                        } else {
@@ -297,47 +302,56 @@ class SpecialAllpages extends IncludableSpecialPage {
         * @param string $inpoint lower limit of pagenames
         * @param string $outpoint upper limit of pagenames
         * @param $namespace Integer (Default NS_MAIN)
-        * @param bool $hideredirects dont show redirects (default FALSE)
+        * @param bool $hideRedirects don't show redirects. Default: false
         * @return string
         */
-       function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideredirects ) {
+       function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideRedirects = false ) {
+               // Use content language since page titles are considered to use content language
                global $wgContLang;
-               $inpointf = htmlspecialchars( str_replace( '_', ' ', $inpoint ) );
-               $outpointf = htmlspecialchars( str_replace( '_', ' ', $outpoint ) );
+
+               $inpointf = str_replace( '_', ' ', $inpoint );
+               $outpointf = str_replace( '_', ' ', $outpoint );
+
                // Don't let the length runaway
                $inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength );
                $outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength );
 
-               $queryparams = $namespace ? "namespace=$namespace&" : '';
+               $queryParams = array(
+                       'from' => $inpoint,
+                       'to' => $outpoint,
+               );
 
-               $queryhideredirects = array();
-               if ( $hideredirects ) {
-                       $queryhideredirects['hideredirects'] = 1;
+               if ( $namespace ) {
+                       $queryParams['namespace'] = $namespace;
+               }
+               if ( $hideRedirects ) {
+                       $queryParams['hideredirects'] = 1;
                }
 
-               $special = $this->getTitle();
-               $link = htmlspecialchars( $special->getLocalUrl( $queryparams . 'from=' . urlencode( $inpoint ) . '&to=' . urlencode( $outpoint ), $queryhideredirects ) );
+               $url = $this->getTitle()->getLocalURL( $queryParams );
+               $inlink = Html::element( 'a', array( 'href' => $url ), $inpointf );
+               $outlink = Html::element( 'a', array( 'href' => $url ), $outpointf );
 
                $out = $this->msg( 'alphaindexline' )->rawParams(
-                       "<a href=\"$link\">$inpointf</a></td><td>",
-                       "</td><td><a href=\"$link\">$outpointf</a>"
+                       "$inlink</td><td>",
+                       "</td><td>$outlink"
                )->escaped();
+
                return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
        }
 
        /**
-        * @param $namespace Integer (Default NS_MAIN)
+        * @param int $namespace Namespace (Default NS_MAIN)
         * @param string $from list all pages from this name (default FALSE)
         * @param string $to list all pages to this name (default FALSE)
         * @param bool $hideredirects dont show redirects (default FALSE)
         */
        function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
-               global $wgContLang;
                $output = $this->getOutput();
 
                $fromList = $this->getNamespaceKeyAndText( $namespace, $from );
                $toList = $this->getNamespaceKeyAndText( $namespace, $to );
-               $namespaces = $wgContLang->getNamespaces();
+               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
                $n = 0;
 
                if ( !$fromList || !$toList ) {
@@ -360,7 +374,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                                $conds['page_is_redirect'] = 0;
                        }
 
-                       if( $toKey !== "" ) {
+                       if ( $toKey !== "" ) {
                                $conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
                        }
 
@@ -369,33 +383,36 @@ class SpecialAllpages extends IncludableSpecialPage {
                                $conds,
                                __METHOD__,
                                array(
-                                       'ORDER BY'  => 'page_title',
-                                       'LIMIT'     => $this->maxPerPage + 1,
+                                       'ORDER BY' => 'page_title',
+                                       'LIMIT' => $this->maxPerPage + 1,
                                        'USE INDEX' => 'name_title',
                                )
                        );
 
-                       if( $res->numRows() > 0 ) {
+                       if ( $res->numRows() > 0 ) {
                                $out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) );
-                               while( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+                               while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
                                        $t = Title::newFromRow( $s );
-                                       if( $t ) {
+                                       if ( $t ) {
                                                $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
                                                        Linker::link( $t ) .
-                                                       ($s->page_is_redirect ? '</div>' : '' );
+                                                       ( $s->page_is_redirect ? '</div>' : '' );
                                        } else {
                                                $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
                                        }
-                                       if( $n % 3 == 0 ) {
+
+                                       if ( $n % 3 == 0 ) {
                                                $out .= '<tr>';
                                        }
+
                                        $out .= "<td style=\"width:33%\">$link</td>";
                                        $n++;
-                                       if( $n % 3 == 0 ) {
+                                       if ( $n % 3 == 0 ) {
                                                $out .= "</tr>\n";
                                        }
                                }
-                               if( ($n % 3) != 0 ) {
+
+                               if ( ( $n % 3 ) != 0 ) {
                                        $out .= "</tr>\n";
                                }
                                $out .= Xml::closeElement( 'table' );
@@ -407,7 +424,7 @@ class SpecialAllpages extends IncludableSpecialPage {
                if ( $this->including() ) {
                        $out2 = '';
                } else {
-                       if( $from == '' ) {
+                       if ( $from == '' ) {
                                // First chunk; no previous link.
                                $prevTitle = null;
                        } else {
@@ -424,20 +441,20 @@ class SpecialAllpages extends IncludableSpecialPage {
                                );
 
                                # Get first title of previous complete chunk
-                               if( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
+                               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() ) {
+                                       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 ) {
+                                       if ( $from != $reallyFirstPage_title ) {
                                                $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
                                        } else {
                                                $prevTitle = null;
@@ -448,23 +465,25 @@ class SpecialAllpages extends IncludableSpecialPage {
                        $self = $this->getTitle();
 
                        $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-                       $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
-                                               '<tr>
+                       $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+                               '<tr>
                                                        <td>' .
-                                                               $nsForm .
-                                                       '</td>
+                               $nsForm .
+                               '</td>
                                                        <td class="mw-allpages-nav">' .
-                                                               Linker::link( $self, $this->msg( 'allpages' )->escaped() );
+                               Linker::link( $self, $this->msg( 'allpages' )->escaped() );
 
                        # Do we put a previous link ?
-                       if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
+                       if ( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
                                $query = array( 'from' => $prevTitle->getText() );
 
-                               if( $namespace )
+                               if ( $namespace ) {
                                        $query['namespace'] = $namespace;
+                               }
 
-                               if( $hideredirects )
+                               if ( $hideredirects ) {
                                        $query['hideredirects'] = $hideredirects;
+                               }
 
                                $prevLink = Linker::linkKnown(
                                        $self,
@@ -475,16 +494,18 @@ class SpecialAllpages extends IncludableSpecialPage {
                                $out2 = $this->getLanguage()->pipeList( array( $out2, $prevLink ) );
                        }
 
-                       if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
+                       if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
                                # $s is the first link of the next chunk
                                $t = Title::makeTitle( $namespace, $s->page_title );
                                $query = array( 'from' => $t->getText() );
 
-                               if( $namespace )
+                               if ( $namespace ) {
                                        $query['namespace'] = $namespace;
+                               }
 
-                               if( $hideredirects )
+                               if ( $hideredirects ) {
                                        $query['hideredirects'] = $hideredirects;
+                               }
 
                                $nextLink = Linker::linkKnown(
                                        $self,
@@ -500,17 +521,22 @@ class SpecialAllpages extends IncludableSpecialPage {
                $output->addHTML( $out2 . $out );
 
                $links = array();
-               if ( isset( $prevLink ) ) $links[] = $prevLink;
-               if ( isset( $nextLink ) ) $links[] = $nextLink;
+               if ( isset( $prevLink ) ) {
+                       $links[] = $prevLink;
+               }
+
+               if ( isset( $nextLink ) ) {
+                       $links[] = $nextLink;
+               }
 
                if ( count( $links ) ) {
                        $output->addHTML(
                                Html::element( 'hr' ) .
-                               Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-                                       $this->getLanguage()->pipeList( $links )
-                               ) );
+                                       Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
+                                               $this->getLanguage()->pipeList( $links )
+                                       )
+                       );
                }
-
        }
 
        /**
@@ -519,8 +545,10 @@ class SpecialAllpages extends IncludableSpecialPage {
         * @return array( int namespace, string dbkey, string pagename ) or NULL on error
         */
        protected function getNamespaceKeyAndText( $ns, $text ) {
-               if ( $text == '' )
-                       return array( $ns, '', '' ); # shortcut for common case
+               if ( $text == '' ) {
+                       # shortcut for common case
+                       return array( $ns, '', '' );
+               }
 
                $t = Title::makeTitleSafe( $ns, $text );
                if ( $t && $t->isLocal() ) {
index b0f333c..b083032 100644 (file)
@@ -43,12 +43,16 @@ class AncientPagesPage extends QueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'revision' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'rev_timestamp' ),
-                       'conds' => array( 'page_namespace' => MWNamespace::getContentNamespaces(),
-                                       'page_is_redirect' => 0,
-                                       'page_latest=rev_id' )
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'rev_timestamp'
+                       ),
+                       'conds' => array(
+                               'page_namespace' => MWNamespace::getContentNamespaces(),
+                               'page_is_redirect' => 0,
+                               'page_latest=rev_id'
+                       )
                );
        }
 
@@ -60,6 +64,11 @@ class AncientPagesPage extends QueryPage {
                return false;
        }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
        function formatResult( $skin, $result ) {
                global $wgContLang;
 
@@ -69,6 +78,7 @@ class AncientPagesPage extends QueryPage {
                        $title,
                        htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
                );
+
                return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
        }
 
index bfa2f95..e61f12b 100644 (file)
@@ -31,6 +31,7 @@ class SpecialBlankpage extends UnlistedSpecialPage {
        public function __construct() {
                parent::__construct( 'Blankpage' );
        }
+
        public function execute( $par ) {
                $this->setHeaders();
                $this->getOutput()->addWikiMsg( 'intentionallyblankpage' );
index 50fdbc2..5a2ad62 100644 (file)
@@ -110,10 +110,10 @@ class SpecialBlock extends FormSpecialPage {
                        $s = HTMLForm::formatErrors( $this->preErrors );
                        if ( $s ) {
                                $form->addHeaderText( Html::rawElement(
-                                               'div',
-                                               array( 'class' => 'error' ),
-                                               $s
-                                       ) );
+                                       'div',
+                                       array( 'class' => 'error' ),
+                                       $s
+                               ) );
                        }
                }
        }
@@ -127,6 +127,8 @@ class SpecialBlock extends FormSpecialPage {
 
                $user = $this->getUser();
 
+               $suggestedDurations = self::getSuggestedDurations();
+
                $a = array(
                        'Target' => array(
                                'type' => 'text',
@@ -139,11 +141,11 @@ class SpecialBlock extends FormSpecialPage {
                                'validation-callback' => array( __CLASS__, 'validateTargetField' ),
                        ),
                        'Expiry' => array(
-                               'type' => !count( self::getSuggestedDurations() ) ? 'text' : 'selectorother',
+                               'type' => !count( $suggestedDurations ) ? 'text' : 'selectorother',
                                'label-message' => 'ipbexpiry',
                                'required' => true,
                                'tabindex' => '2',
-                               'options' => self::getSuggestedDurations(),
+                               'options' => $suggestedDurations,
                                'other' => $this->msg( 'ipbother' )->text(),
                                'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
                        ),
@@ -241,8 +243,7 @@ class SpecialBlock extends FormSpecialPage {
                if ( $block instanceof Block && !$block->mAuto # The block exists and isn't an autoblock
                        && ( $this->type != Block::TYPE_RANGE # The block isn't a rangeblock
                                || $block->getTarget() == $this->target ) # or if it is, the range is what we're about to block
-                       )
-               {
+               ) {
                        $fields['HardBlock']['default'] = $block->isHardblock();
                        $fields['CreateAccount']['default'] = $block->prevents( 'createaccount' );
                        $fields['AutoBlock']['default'] = $block->isAutoblocking();
@@ -445,6 +446,7 @@ class SpecialBlock extends FormSpecialPage {
                } elseif ( IP::isIPAddress( $target ) ) {
                        return Title::makeTitleSafe( NS_USER, $target );
                }
+
                return null;
        }
 
@@ -460,8 +462,8 @@ class SpecialBlock extends FormSpecialPage {
                $i = 0;
                $target = null;
 
-               while( true ) {
-                       switch( $i++ ) {
+               while ( true ) {
+                       switch ( $i++ ) {
                                case 0:
                                        # The HTMLForm will check wpTarget first and only if it doesn't get
                                        # a value use the default, which will be generated from the options
@@ -511,6 +513,7 @@ class SpecialBlock extends FormSpecialPage {
                $status = self::validateTarget( $value, $form->getUser() );
                if ( !$status->isOK() ) {
                        $errors = $status->getErrorsArray();
+
                        return call_user_func_array( array( $form, 'msg' ), $errors[0] );
                } else {
                        return true;
@@ -528,6 +531,7 @@ class SpecialBlock extends FormSpecialPage {
        public static function validateTarget( $value, User $user ) {
                global $wgBlockCIDRLimit;
 
+               /** @var User $target */
                list( $target, $type ) = self::getTargetAndType( $value );
                $status = Status::newGood( $target );
 
@@ -606,6 +610,7 @@ class SpecialBlock extends FormSpecialPage {
                # can come from it
                $data['Confirm'] = !in_array( $data['Confirm'], array( '', '0', null, false ), true );
 
+               /** @var User $target */
                list( $target, $type ) = self::getTargetAndType( $data['Target'] );
                if ( $type == Block::TYPE_USER ) {
                        $user = $target;
@@ -620,8 +625,8 @@ class SpecialBlock extends FormSpecialPage {
                        # but $data['target'] gets overriden by (non-normalized) request variable
                        # from previous request.
                        if ( $target === $performer->getName() &&
-                               ( $data['PreviousTarget'] !== $target || !$data['Confirm'] ) )
-                       {
+                               ( $data['PreviousTarget'] !== $target || !$data['Confirm'] )
+                       {
                                return array( 'ipb-blockingself' );
                        }
                } elseif ( $type == Block::TYPE_RANGE ) {
@@ -634,9 +639,9 @@ class SpecialBlock extends FormSpecialPage {
                        return array( 'badipaddress' );
                }
 
-               if ( ( strlen( $data['Expiry'] ) == 0) || ( strlen( $data['Expiry'] ) > 50 )
-                       || !self::parseExpiryInput( $data['Expiry'] ) )
-               {
+               if ( ( strlen( $data['Expiry'] ) == 0 ) || ( strlen( $data['Expiry'] ) > 50 )
+                       || !self::parseExpiryInput( $data['Expiry'] )
+               {
                        return array( 'ipb_expiry_invalid' );
                }
 
@@ -703,9 +708,9 @@ class SpecialBlock extends FormSpecialPage {
                        $reblockNotAllowed = ( array_key_exists( 'Reblock', $data ) && !$data['Reblock'] );
 
                        # Show form unless the user is already aware of this...
-                       if( $blockNotConfirmed || $reblockNotAllowed ) {
+                       if ( $blockNotConfirmed || $reblockNotAllowed ) {
                                return array( array( 'ipb_already_blocked', $block->getTarget() ) );
-                       # Otherwise, try to update the block...
+                               # Otherwise, try to update the block...
                        } else {
                                # This returns direct blocks before autoblocks/rangeblocks, since we should
                                # be sure the user is blocked by now it should work for our purposes
@@ -865,7 +870,7 @@ class SpecialBlock extends FormSpecialPage {
                                # User is trying to unblock themselves
                                if ( $performer->isAllowed( 'unblockself' ) ) {
                                        return true;
-                               # User blocked themselves and is now trying to reverse it
+                                       # User blocked themselves and is now trying to reverse it
                                } elseif ( $performer->blockedBy() === $performer->getName() ) {
                                        return true;
                                } else {
@@ -953,4 +958,5 @@ class SpecialBlock extends FormSpecialPage {
 }
 
 # BC @since 1.18
-class IPBlockForm extends SpecialBlock {}
+class IPBlockForm extends SpecialBlock {
+}
index e10df4f..784ad04 100644 (file)
@@ -55,10 +55,11 @@ class SpecialBlockList extends SpecialPage {
 
                $action = $request->getText( 'action' );
 
-               if( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
+               if ( $action == 'unblock' || $action == 'submit' && $request->wasPosted() ) {
                        # B/C @since 1.18: Unblock interface is now at Special:Unblock
                        $title = SpecialPage::getTitleFor( 'Unblock', $this->target );
-                       $out->redirect( $title->getFullUrl() );
+                       $out->redirect( $title->getFullURL() );
+
                        return;
                }
 
@@ -96,6 +97,7 @@ class SpecialBlockList extends SpecialPage {
                        ),
                );
                $form = new HTMLForm( $fields, $this->getContext() );
+               $form->setTitle( $this->getTitle() ); // Remove subpage
                $form->setMethod( 'get' );
                $form->setWrapperLegendMsg( 'ipblocklist-legend' );
                $form->setSubmitTextMsg( 'ipblocklist-submit' );
@@ -120,7 +122,7 @@ class SpecialBlockList extends SpecialPage {
                if ( $this->target !== '' ) {
                        list( $target, $type ) = Block::parseTarget( $this->target );
 
-                       switch( $type ) {
+                       switch ( $type ) {
                                case Block::TYPE_ID:
                                case Block::TYPE_AUTO:
                                        $conds['ipb_id'] = $target;
@@ -141,23 +143,23 @@ class SpecialBlockList extends SpecialPage {
                                        break;
 
                                case Block::TYPE_USER:
-                                       $conds['ipb_address'] = (string)$this->target;
+                                       $conds['ipb_address'] = $target->getName();
                                        $conds['ipb_auto'] = 0;
                                        break;
                        }
                }
 
                # Apply filters
-               if( in_array( 'userblocks', $this->options ) ) {
+               if ( in_array( 'userblocks', $this->options ) ) {
                        $conds['ipb_user'] = 0;
                }
-               if( in_array( 'tempblocks', $this->options ) ) {
+               if ( in_array( 'tempblocks', $this->options ) ) {
                        $conds['ipb_expiry'] = 'infinity';
                }
-               if( in_array( 'addressblocks', $this->options ) ) {
+               if ( in_array( 'addressblocks', $this->options ) ) {
                        $conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
                }
-               if( in_array( 'rangeblocks', $this->options ) ) {
+               if ( in_array( 'rangeblocks', $this->options ) ) {
                        $conds[] = "ipb_range_end = ipb_range_start";
                }
 
@@ -169,7 +171,7 @@ class SpecialBlockList extends SpecialPage {
 
                # Show additional header for the local block only when other blocks exists.
                # Not necessary in a standard installation without such extensions enabled
-               if( count( $otherBlockLink ) ) {
+               if ( count( $otherBlockLink ) ) {
                        $out->addHTML(
                                Html::element( 'h2', array(), $this->msg( 'ipblocklist-localblock' )->text() ) . "\n"
                        );
@@ -179,18 +181,16 @@ class SpecialBlockList extends SpecialPage {
                if ( $pager->getNumRows() ) {
                        $out->addHTML(
                                $pager->getNavigationBar() .
-                               $pager->getBody().
-                               $pager->getNavigationBar()
+                                       $pager->getBody() .
+                                       $pager->getNavigationBar()
                        );
-
                } elseif ( $this->target ) {
                        $out->addWikiMsg( 'ipblocklist-no-results' );
-
                } else {
                        $out->addWikiMsg( 'ipblocklist-empty' );
                }
 
-               if( count( $otherBlockLink ) ) {
+               if ( count( $otherBlockLink ) ) {
                        $out->addHTML(
                                Html::rawElement(
                                        'h2',
@@ -199,7 +199,7 @@ class SpecialBlockList extends SpecialPage {
                                ) . "\n"
                        );
                        $list = '';
-                       foreach( $otherBlockLink as $link ) {
+                       foreach ( $otherBlockLink as $link ) {
                                $list .= Html::rawElement( 'li', array(), $link ) . "\n";
                        }
                        $out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
@@ -238,7 +238,7 @@ class BlockListPager extends TablePager {
                                'ipb_params' => 'blocklist-params',
                                'ipb_reason' => 'blocklist-reason',
                        );
-                       foreach( $headers as $key => $val ) {
+                       foreach ( $headers as $key => $val ) {
                                $headers[$key] = $this->msg( $val )->text();
                        }
                }
@@ -267,17 +267,17 @@ class BlockListPager extends TablePager {
 
                $formatted = '';
 
-               switch( $name ) {
+               switch ( $name ) {
                        case 'ipb_timestamp':
                                $formatted = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
                                break;
 
                        case 'ipb_target':
-                               if( $row->ipb_auto ) {
+                               if ( $row->ipb_auto ) {
                                        $formatted = $this->msg( 'autoblockid', $row->ipb_id )->parse();
                                } else {
                                        list( $target, $type ) = Block::parseTarget( $row->ipb_address );
-                                       switch( $type ) {
+                                       switch ( $type ) {
                                                case Block::TYPE_USER:
                                                case Block::TYPE_IP:
                                                        $formatted = Linker::userLink( $target->getId(), $target );
@@ -295,9 +295,9 @@ class BlockListPager extends TablePager {
                                break;
 
                        case 'ipb_expiry':
-                               $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */ true );
-                               if( $this->getUser()->isAllowed( 'block' ) ) {
-                                       if( $row->ipb_auto ) {
+                               $formatted = $this->getLanguage()->formatExpiry( $value, /* User preference timezone */true );
+                               if ( $this->getUser()->isAllowed( 'block' ) ) {
+                                       if ( $row->ipb_auto ) {
                                                $links[] = Linker::linkKnown(
                                                        SpecialPage::getTitleFor( 'Unblock' ),
                                                        $msg['unblocklink'],
@@ -420,7 +420,7 @@ class BlockListPager extends TablePager {
 
        /**
         * Do a LinkBatch query to minimise database load when generating all these links
-        * @param $result
+        * @param ResultWrapper $result
         */
        function preprocessResults( $result ) {
                wfProfileIn( __METHOD__ );
@@ -441,7 +441,7 @@ class BlockListPager extends TablePager {
                }
 
                $ua = UserArray::newFromIDs( $userids );
-               foreach( $ua as $user ) {
+               foreach ( $ua as $user ) {
                        $name = str_replace( ' ', '_', $user->getName() );
                        $lb->add( NS_USER, $name );
                        $lb->add( NS_USER_TALK, $name );
@@ -482,5 +482,4 @@ class HTMLBlockedUsersItemSelect extends HTMLSelectField {
 
                return true;
        }
-
 }
index 85a3019..c3d6080 100644 (file)
@@ -39,8 +39,9 @@ class SpecialBlockme extends UnlistedSpecialPage {
                $this->outputHeader();
 
                $ip = $this->getRequest()->getIP();
-               if( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
+               if ( !$wgBlockOpenProxies || $this->getRequest()->getText( 'ip' ) != md5( $ip . $wgProxyKey ) ) {
                        $this->getOutput()->addWikiMsg( 'proxyblocker-disabled' );
+
                        return;
                }
 
index bdbd77b..0d76883 100644 (file)
@@ -53,8 +53,8 @@ class SpecialBookSources extends SpecialPage {
                $this->outputHeader();
                $this->isbn = self::cleanIsbn( $isbn ? $isbn : $this->getRequest()->getText( 'isbn' ) );
                $this->getOutput()->addHTML( $this->makeForm() );
-               if( strlen( $this->isbn ) > 0 ) {
-                       if( !self::isValidISBN( $this->isbn ) ) {
+               if ( strlen( $this->isbn ) > 0 ) {
+                       if ( !self::isValidISBN( $this->isbn ) ) {
                                $this->getOutput()->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>", 'booksources-invalid-isbn' );
                        }
                        $this->showList();
@@ -69,32 +69,33 @@ class SpecialBookSources extends SpecialPage {
        public static function isValidISBN( $isbn ) {
                $isbn = self::cleanIsbn( $isbn );
                $sum = 0;
-               if( strlen( $isbn ) == 13 ) {
-                       for( $i = 0; $i < 12; $i++ ) {
-                               if( $i % 2 == 0 ) {
+               if ( strlen( $isbn ) == 13 ) {
+                       for ( $i = 0; $i < 12; $i++ ) {
+                               if ( $i % 2 == 0 ) {
                                        $sum += $isbn[$i];
                                } else {
                                        $sum += 3 * $isbn[$i];
                                }
                        }
 
-                       $check = (10 - ($sum % 10)) % 10;
+                       $check = ( 10 - ( $sum % 10 ) ) % 10;
                        if ( $check == $isbn[12] ) {
                                return true;
                        }
-               } elseif( strlen( $isbn ) == 10 ) {
-                       for( $i = 0; $i < 9; $i++ ) {
-                               $sum += $isbn[$i] * ($i + 1);
+               } elseif ( strlen( $isbn ) == 10 ) {
+                       for ( $i = 0; $i < 9; $i++ ) {
+                               $sum += $isbn[$i] * ( $i + 1 );
                        }
 
                        $check = $sum % 11;
-                       if( $check == 10 ) {
+                       if ( $check == 10 ) {
                                $check = "X";
                        }
-                       if( $check == $isbn[9] ) {
+                       if ( $check == $isbn[9] ) {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -116,13 +117,15 @@ class SpecialBookSources extends SpecialPage {
        private function makeForm() {
                global $wgScript;
 
-               $form = '<fieldset><legend>' . $this->msg( 'booksources-search-legend' )->escaped() . '</legend>';
-               $form .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
-               $form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() );
+               $form = Html::openElement( 'fieldset' ) . "\n";
+               $form .= Html::element( 'legend', array(), $this->msg( 'booksources-search-legend' )->text() ) . "\n";
+               $form .= Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n";
+               $form .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
                $form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn );
-               $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . '</p>';
-               $form .= Xml::closeElement( 'form' );
-               $form .= '</fieldset>';
+               $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
+               $form .= Html::closeElement( 'form' ) . "\n";
+               $form .= Html::closeElement( 'fieldset' ) . "\n";
+
                return $form;
        }
 
@@ -143,7 +146,7 @@ class SpecialBookSources extends SpecialPage {
                # Check for a local page such as Project:Book_sources and use that if available
                $page = $this->msg( 'booksources' )->inContentLanguage()->text();
                $title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language
-               if( is_object( $title ) && $title->exists() ) {
+               if ( is_object( $title ) && $title->exists() ) {
                        $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                        $content = $rev->getContent();
 
@@ -152,6 +155,7 @@ class SpecialBookSources extends SpecialPage {
 
                                $text = $content->getNativeData();
                                $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
+
                                return true;
                        } else {
                                throw new MWException( "Unexpected content type for book sources: " . $content->getModel() );
@@ -162,9 +166,11 @@ class SpecialBookSources extends SpecialPage {
                $this->getOutput()->addWikiMsg( 'booksources-text' );
                $this->getOutput()->addHTML( '<ul>' );
                $items = $wgContLang->getBookstoreList();
-               foreach( $items as $label => $url )
+               foreach ( $items as $label => $url ) {
                        $this->getOutput()->addHTML( $this->makeListItem( $label, $url ) );
+               }
                $this->getOutput()->addHTML( '</ul>' );
+
                return true;
        }
 
@@ -177,7 +183,9 @@ class SpecialBookSources extends SpecialPage {
         */
        private function makeListItem( $label, $url ) {
                $url = str_replace( '$1', $this->isbn, $url );
-               return '<li><a href="' . htmlspecialchars( $url ) . '" class="external">' . htmlspecialchars( $label ) . '</a></li>';
+
+               return Html::rawElement( 'li', array(),
+                       Html::element( 'a', array( 'href' => $url, 'class' => 'external' ), $label ) );
        }
 
        protected function getGroupName() {
index fac4123..b2ddc22 100644 (file)
@@ -51,6 +51,7 @@ class BrokenRedirectsPage extends QueryPage {
 
        function getQueryInfo() {
                $dbr = wfGetDB( DB_SLAVE );
+
                return array(
                        'tables' => array(
                                'redirect',
@@ -88,13 +89,13 @@ class BrokenRedirectsPage extends QueryPage {
         * @return array
         */
        function getOrderFields() {
-               return array ( 'rd_namespace', 'rd_title', 'rd_from' );
+               return array( 'rd_namespace', 'rd_title', 'rd_from' );
        }
 
        /**
-        * @param $skin Skin
-        * @param $result
-        * @return String
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
         */
        function formatResult( $skin, $result ) {
                $fromObj = Title::makeTitle( $result->namespace, $result->title );
@@ -138,7 +139,7 @@ class BrokenRedirectsPage extends QueryPage {
 
                $out = $from . $this->msg( 'word-separator' )->escaped();
 
-               if( $this->getUser()->isAllowed( 'delete' ) ) {
+               if ( $this->getUser()->isAllowed( 'delete' ) ) {
                        $links[] = Linker::linkKnown(
                                $fromObj,
                                $this->msg( 'brokenredirects-delete' )->escaped(),
@@ -149,6 +150,7 @@ class BrokenRedirectsPage extends QueryPage {
 
                $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( $links ) )->escaped();
                $out .= " {$arr} {$to}";
+
                return $out;
        }
 
index ddd11ad..39305f0 100644 (file)
@@ -194,5 +194,4 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
                        $this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) );
                }
        }
-
 }
index 9040c64..d01bfd7 100644 (file)
@@ -42,12 +42,12 @@ class SpecialCategories extends SpecialPage {
 
                $this->getOutput()->addHTML(
                        Html::openElement( 'div', array( 'class' => 'mw-spcontent' ) ) .
-                       $this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
-                       $cap->getStartForm( $from ) .
-                       $cap->getNavigationBar() .
-                       '<ul>' . $cap->getBody() . '</ul>' .
-                       $cap->getNavigationBar() .
-                       Html::closeElement( 'div' )
+                               $this->msg( 'categoriespagetext', $cap->getNumRows() )->parseAsBlock() .
+                               $cap->getStartForm( $from ) .
+                               $cap->getNavigationBar() .
+                               '<ul>' . $cap->getBody() . '</ul>' .
+                               $cap->getNavigationBar() .
+                               Html::closeElement( 'div' )
                );
        }
 
@@ -66,7 +66,7 @@ class CategoryPager extends AlphabeticPager {
        function __construct( IContextSource $context, $from ) {
                parent::__construct( $context );
                $from = str_replace( ' ', '_', $from );
-               if( $from !== '' ) {
+               if ( $from !== '' ) {
                        $from = Title::capitalize( $from, NS_CATEGORY );
                        $this->setOffset( $from );
                        $this->setIncludeOffset( true );
@@ -90,8 +90,10 @@ class CategoryPager extends AlphabeticPager {
        function getDefaultQuery() {
                parent::getDefaultQuery();
                unset( $this->mDefaultQuery['from'] );
+
                return $this->mDefaultQuery;
        }
+
 #      protected function getOrderTypeMessages() {
 #              return array( 'abc' => 'special-categories-sort-abc',
 #                      'count' => 'special-categories-sort-count' );
@@ -113,6 +115,7 @@ class CategoryPager extends AlphabeticPager {
                }
                $batch->execute();
                $this->mResult->rewind();
+
                return parent::getBody();
        }
 
@@ -120,19 +123,26 @@ class CategoryPager extends AlphabeticPager {
                $title = Title::makeTitle( NS_CATEGORY, $result->cat_title );
                $titleText = Linker::link( $title, htmlspecialchars( $title->getText() ) );
                $count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped();
+
                return Xml::tags( 'li', null, $this->getLanguage()->specialList( $titleText, $count ) ) . "\n";
        }
 
        public function getStartForm( $from ) {
                global $wgScript;
 
-               return
-                       Xml::tags( 'form', array( 'method' => 'get', 'action' => $wgScript ),
-                               Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-                               Xml::fieldset( $this->msg( 'categories' )->text(),
-                                       Xml::inputLabel( $this->msg( 'categoriesfrom' )->text(),
+               return Xml::tags(
+                       'form',
+                       array( 'method' => 'get', 'action' => $wgScript ),
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+                               Xml::fieldset(
+                                       $this->msg( 'categories' )->text(),
+                                       Xml::inputLabel(
+                                               $this->msg( 'categoriesfrom' )->text(),
                                                'from', 'from', 20, $from ) .
-                                       ' ' .
-                                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) ) );
+                                               ' ' .
+                                               Xml::submitButton( $this->msg( 'allpagessubmit' )->text()
+                                               )
+                               )
+               );
        }
 }
index 59a0257..9e435fb 100644 (file)
@@ -49,6 +49,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
         */
        function isListed() {
                global $wgAuth;
+
                return $wgAuth->allowPropChange( 'emailaddress' );
        }
 
@@ -67,6 +68,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                if ( !$wgAuth->allowPropChange( 'emailaddress' ) ) {
                        $this->error( 'cannotchangeemail' );
+
                        return;
                }
 
@@ -75,11 +77,13 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                if ( !$request->wasPosted() && !$user->isLoggedIn() ) {
                        $this->error( 'changeemail-no-info' );
+
                        return;
                }
 
                if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
                        $this->doReturnTo();
+
                        return;
                }
 
@@ -89,8 +93,8 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $this->mNewEmail = $request->getVal( 'wpNewEmail' );
 
                if ( $request->wasPosted()
-                       && $user->matchEditToken( $request->getVal( 'token' ) ) )
-               {
+                       && $user->matchEditToken( $request->getVal( 'token' ) )
+               {
                        $info = $this->attemptChange( $user, $this->mPassword, $this->mNewEmail );
                        if ( $info === true ) {
                                $this->doReturnTo();
@@ -138,15 +142,15 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                $this->getOutput()->addHTML(
                        Xml::fieldset( $this->msg( 'changeemail-header' )->text() ) .
-                       Xml::openElement( 'form',
-                               array(
-                                       'method' => 'post',
-                                       'action' => $this->getTitle()->getLocalUrl(),
-                                       'id' => 'mw-changeemail-form' ) ) . "\n" .
-                       Html::hidden( 'token', $user->getEditToken() ) . "\n" .
-                       Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
-                       $this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
-                       Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
+                               Xml::openElement( 'form',
+                                       array(
+                                               'method' => 'post',
+                                               'action' => $this->getTitle()->getLocalURL(),
+                                               'id' => 'mw-changeemail-form' ) ) . "\n" .
+                               Html::hidden( 'token', $user->getEditToken() ) . "\n" .
+                               Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
+                               $this->msg( 'changeemail-text' )->parseAsBlock() . "\n" .
+                               Xml::openElement( 'table', array( 'id' => 'mw-changeemail-table' ) ) . "\n"
                );
                $items = array(
                        array( 'wpName', 'username', 'text', $user->getName() ),
@@ -159,17 +163,17 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                $this->getOutput()->addHTML(
                        $this->pretty( $items ) .
-                       "\n" .
-                       "<tr>\n" .
+                               "\n" .
+                               "<tr>\n" .
                                "<td></td>\n" .
                                '<td class="mw-input">' .
-                                       Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) .
-                                       Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
+                               Xml::submitButton( $this->msg( 'changeemail-submit' )->text() ) .
+                               Xml::submitButton( $this->msg( 'changeemail-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
                                "</td>\n" .
-                       "</tr>\n" .
-                       Xml::closeElement( 'table' ) .
-                       Xml::closeElement( 'form' ) .
-                       Xml::closeElement( 'fieldset' ) . "\n"
+                               "</tr>\n" .
+                               Xml::closeElement( 'table' ) .
+                               Xml::closeElement( 'form' ) .
+                               Xml::closeElement( 'fieldset' ) . "\n"
                );
        }
 
@@ -181,7 +185,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $out = '';
                foreach ( $fields as $list ) {
                        list( $name, $label, $type, $value ) = $list;
-                       if( $type == 'text' ) {
+                       if ( $type == 'text' ) {
                                $field = htmlspecialchars( $value );
                        } else {
                                $attribs = array( 'id' => $name );
@@ -203,6 +207,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                        $out .= "</td>\n";
                        $out .= "</tr>";
                }
+
                return $out;
        }
 
@@ -217,18 +222,21 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) {
                        $this->error( 'invalidemailaddress' );
+
                        return false;
                }
 
                $throttleCount = LoginForm::incLoginThrottle( $user->getName() );
                if ( $throttleCount === true ) {
                        $this->error( 'login-throttled' );
+
                        return false;
                }
 
                global $wgRequirePasswordforEmailChange;
                if ( $wgRequirePasswordforEmailChange && !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
                        $this->error( 'wrongpassword' );
+
                        return false;
                }
 
@@ -241,8 +249,9 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                if ( !$status->isGood() ) {
                        $this->getOutput()->addHTML(
                                '<p class="error">' .
-                               $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
-                               '</p>' );
+                                       $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
+                                       '</p>' );
+
                        return false;
                }
 
index 73eb97f..b53a46a 100644 (file)
@@ -52,46 +52,50 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                $this->mDomain = $request->getVal( 'wpDomain' );
 
                $user = $this->getUser();
-               if( !$request->wasPosted() && !$user->isLoggedIn() ) {
+               if ( !$request->wasPosted() && !$user->isLoggedIn() ) {
                        $this->error( $this->msg( 'resetpass-no-info' )->text() );
+
                        return;
                }
 
-               if( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
+               if ( $request->wasPosted() && $request->getBool( 'wpCancel' ) ) {
                        $this->doReturnTo();
+
                        return;
                }
 
                $this->checkReadOnly();
 
-               if( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
+               if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
                        try {
                                $this->mDomain = $wgAuth->getDomain();
-                               if( !$wgAuth->allowPasswordChange() ) {
+                               if ( !$wgAuth->allowPasswordChange() ) {
                                        $this->error( $this->msg( 'resetpass_forbidden' )->text() );
+
                                        return;
                                }
 
                                $this->attemptReset( $this->mNewpass, $this->mRetype );
 
-                               if( $user->isLoggedIn() ) {
+                               if ( $user->isLoggedIn() ) {
                                        $this->doReturnTo();
                                } else {
                                        LoginForm::setLoginToken();
                                        $token = LoginForm::getLoginToken();
                                        $data = array(
-                                               'action'       => 'submitlogin',
-                                               'wpName'       => $this->mUserName,
-                                               'wpDomain'     => $this->mDomain,
+                                               'action' => 'submitlogin',
+                                               'wpName' => $this->mUserName,
+                                               'wpDomain' => $this->mDomain,
                                                'wpLoginToken' => $token,
-                                               'wpPassword'   => $request->getVal( 'wpNewPassword' ),
+                                               'wpPassword' => $request->getVal( 'wpNewPassword' ),
                                        ) + $request->getValues( 'wpRemember', 'returnto', 'returntoquery' );
                                        $login = new LoginForm( new FauxRequest( $data, true ) );
                                        $login->setContext( $this->getContext() );
                                        $login->execute( null );
                                }
+
                                return;
-                       } catch( PasswordError $e ) {
+                       } catch ( PasswordError $e ) {
                                $this->error( $e->getMessage() );
                        }
                }
@@ -127,12 +131,12 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        $rememberMe = '<tr>' .
                                '<td></td>' .
                                '<td class="mw-input">' .
-                                       Xml::checkLabel(
-                                               $this->msg( 'remembermypassword' )->numParams( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
-                                               'wpRemember', 'wpRemember',
-                                               $this->getRequest()->getCheck( 'wpRemember' ) ) .
+                               Xml::checkLabel(
+                                       $this->msg( 'remembermypassword' )->numParams( ceil( $wgCookieExpiration / ( 3600 * 24 ) ) )->text(),
+                                       'wpRemember', 'wpRemember',
+                                       $this->getRequest()->getCheck( 'wpRemember' ) ) .
                                '</td>' .
-                       '</tr>';
+                               '</tr>';
                        $submitMsg = 'resetpass_submit';
                        $oldpassMsg = 'resetpass-temp-password';
                } else {
@@ -142,11 +146,11 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                $extraFields = array();
                wfRunHooks( 'ChangePasswordForm', array( &$extraFields ) );
                $prettyFields = array(
-                                       array( 'wpName', 'username', 'text', $this->mUserName ),
-                                       array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
-                                       array( 'wpNewPassword', 'newpassword', 'password', null ),
-                                       array( 'wpRetype', 'retypenew', 'password', null ),
-                               );
+                       array( 'wpName', 'username', 'text', $this->mUserName ),
+                       array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
+                       array( 'wpNewPassword', 'newpassword', 'password', null ),
+                       array( 'wpRetype', 'retypenew', 'password', null ),
+               );
                $prettyFields = array_merge( $prettyFields, $extraFields );
                $hiddenFields = array(
                        'token' => $user->getEditToken(),
@@ -154,31 +158,31 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        'wpDomain' => $this->mDomain,
                ) + $this->getRequest()->getValues( 'returnto', 'returntoquery' );
                $hiddenFieldsStr = '';
-               foreach( $hiddenFields as $fieldname => $fieldvalue ) {
+               foreach ( $hiddenFields as $fieldname => $fieldvalue ) {
                        $hiddenFieldsStr .= Html::hidden( $fieldname, $fieldvalue ) . "\n";
                }
                $this->getOutput()->addHTML(
                        Xml::fieldset( $this->msg( 'resetpass_header' )->text() ) .
-                       Xml::openElement( 'form',
-                               array(
-                                       'method' => 'post',
-                                       'action' => $this->getTitle()->getLocalUrl(),
-                                       'id' => 'mw-resetpass-form' ) ) . "\n" .
-                       $hiddenFieldsStr .
-                       $this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
-                       Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
-                       $this->pretty( $prettyFields ) . "\n" .
-                       $rememberMe .
-                       "<tr>\n" .
+                               Xml::openElement( 'form',
+                                       array(
+                                               'method' => 'post',
+                                               'action' => $this->getTitle()->getLocalURL(),
+                                               'id' => 'mw-resetpass-form' ) ) . "\n" .
+                               $hiddenFieldsStr .
+                               $this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
+                               Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
+                               $this->pretty( $prettyFields ) . "\n" .
+                               $rememberMe .
+                               "<tr>\n" .
                                "<td></td>\n" .
                                '<td class="mw-input">' .
-                                       Xml::submitButton( $this->msg( $submitMsg )->text() ) .
-                                       Xml::submitButton( $this->msg( 'resetpass-submit-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
+                               Xml::submitButton( $this->msg( $submitMsg )->text() ) .
+                               Xml::submitButton( $this->msg( 'resetpass-submit-cancel' )->text(), array( 'name' => 'wpCancel' ) ) .
                                "</td>\n" .
-                       "</tr>\n" .
-                       Xml::closeElement( 'table' ) .
-                       Xml::closeElement( 'form' ) .
-                       Xml::closeElement( 'fieldset' ) . "\n"
+                               "</tr>\n" .
+                               Xml::closeElement( 'table' ) .
+                               Xml::closeElement( 'form' ) .
+                               Xml::closeElement( 'fieldset' ) . "\n"
                );
        }
 
@@ -190,7 +194,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                $out = '';
                foreach ( $fields as $list ) {
                        list( $name, $label, $type, $value ) = $list;
-                       if( $type == 'text' ) {
+                       if ( $type == 'text' ) {
                                $field = htmlspecialchars( $value );
                        } else {
                                $attribs = array( 'id' => $name );
@@ -205,16 +209,20 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        }
                        $out .= "<tr>\n";
                        $out .= "\t<td class='mw-label'>";
-                       if ( $type != 'text' )
+
+                       if ( $type != 'text' ) {
                                $out .= Xml::label( $this->msg( $label )->text(), $name );
-                       else
+                       } else {
                                $out .= $this->msg( $label )->escaped();
+                       }
+
                        $out .= "</td>\n";
                        $out .= "\t<td class='mw-input'>";
                        $out .= $field;
                        $out .= "</td>\n";
                        $out .= "</tr>";
                }
+
                return $out;
        }
 
@@ -229,11 +237,11 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        $user = User::newFromName( $this->mUserName );
                }
 
-               if( !$user || $user->isAnon() ) {
+               if ( !$user || $user->isAnon() ) {
                        throw new PasswordError( $this->msg( 'nosuchusershort', $this->mUserName )->text() );
                }
 
-               if( $newpass !== $retype ) {
+               if ( $newpass !== $retype ) {
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'badretype' ) );
                        throw new PasswordError( $this->msg( 'badretype' )->text() );
                }
@@ -243,7 +251,13 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        throw new PasswordError( $this->msg( 'login-throttled' )->text() );
                }
 
-               if( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
+               $abortMsg = 'resetpass-abort-generic';
+               if ( !wfRunHooks( 'AbortChangePassword', array( $user, $this->mOldpass, $newpass, &$abortMsg ) ) ) {
+                       wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'abortreset' ) );
+                       throw new PasswordError( $this->msg( $abortMsg )->text() );
+               }
+
+               if ( !$user->checkTemporaryPassword( $this->mOldpass ) && !$user->checkPassword( $this->mOldpass ) ) {
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
                        throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
                }
@@ -257,7 +271,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        $user->setPassword( $this->mNewpass );
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'success' ) );
                        $this->mNewpass = $this->mOldpass = $this->mRetype = '';
-               } catch( PasswordError $e ) {
+               } catch ( PasswordError $e ) {
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
                        throw new PasswordError( $e->getMessage() );
                }
index c3bd3fe..fc6b0c5 100644 (file)
@@ -110,7 +110,7 @@ class SpecialComparePages extends SpecialPage {
                $rev1 = self::revOrTitle( $data['Revision1'], $data['Page1'] );
                $rev2 = self::revOrTitle( $data['Revision2'], $data['Page2'] );
 
-               if( $rev1 && $rev2 ) {
+               if ( $rev1 && $rev2 ) {
                        $revision = Revision::newFromId( $rev1 );
 
                        if ( $revision ) { // NOTE: $rev1 was already checked, should exist.
@@ -128,14 +128,15 @@ class SpecialComparePages extends SpecialPage {
        }
 
        public static function revOrTitle( $revision, $title ) {
-               if( $revision ) {
+               if ( $revision ) {
                        return $revision;
-               } elseif( $title ) {
+               } elseif ( $title ) {
                        $title = Title::newFromText( $title );
-                       if( $title instanceof Title ) {
+                       if ( $title instanceof Title ) {
                                return $title->getLatestRevID();
                        }
                }
+
                return null;
        }
 
@@ -150,6 +151,7 @@ class SpecialComparePages extends SpecialPage {
                if ( !$title->exists() ) {
                        return $this->msg( 'compare-title-not-exists' )->parseAsBlock();
                }
+
                return true;
        }
 
@@ -161,6 +163,7 @@ class SpecialComparePages extends SpecialPage {
                if ( $revision === null ) {
                        return $this->msg( 'compare-revision-not-exists' )->parseAsBlock();
                }
+
                return true;
        }
 
index 078c386..47808d1 100644 (file)
  * @author Rob Church <robchur@gmail.com>
  */
 class EmailConfirmation extends UnlistedSpecialPage {
-
-       /**
-        * Constructor
-        */
        public function __construct() {
                parent::__construct( 'Confirmemail' );
        }
@@ -41,16 +37,16 @@ class EmailConfirmation extends UnlistedSpecialPage {
        /**
         * Main execution point
         *
-        * @param $code Confirmation code passed to the page
+        * @param null|string $code Confirmation code passed to the page
         */
        function execute( $code ) {
                $this->setHeaders();
 
                $this->checkReadOnly();
 
-               if( $code === null || $code === '' ) {
-                       if( $this->getUser()->isLoggedIn() ) {
-                               if( Sanitizer::validateEmail( $this->getUser()->getEmail() ) ) {
+               if ( $code === null || $code === '' ) {
+                       if ( $this->getUser()->isLoggedIn() ) {
+                               if ( Sanitizer::validateEmail( $this->getUser()->getEmail() ) ) {
                                        $this->showRequestForm();
                                } else {
                                        $this->getOutput()->addWikiMsg( 'confirmemail_noemail' );
@@ -62,7 +58,9 @@ class EmailConfirmation extends UnlistedSpecialPage {
                                        array(),
                                        array( 'returnto' => $this->getTitle()->getPrefixedText() )
                                );
-                               $this->getOutput()->addHTML( $this->msg( 'confirmemail_needlogin' )->rawParams( $llink )->parse() );
+                               $this->getOutput()->addHTML(
+                                       $this->msg( 'confirmemail_needlogin' )->rawParams( $llink )->parse()
+                               );
                        }
                } else {
                        $this->attemptConfirm( $code );
@@ -75,7 +73,10 @@ class EmailConfirmation extends UnlistedSpecialPage {
        function showRequestForm() {
                $user = $this->getUser();
                $out = $this->getOutput();
-               if( $this->getRequest()->wasPosted() && $user->matchEditToken( $this->getRequest()->getText( 'token' ) ) ) {
+
+               if ( $this->getRequest()->wasPosted() &&
+                       $user->matchEditToken( $this->getRequest()->getText( 'token' ) )
+               ) {
                        $status = $user->sendConfirmationMail();
                        if ( $status->isGood() ) {
                                $out->addWikiMsg( 'confirmemail_sent' );
@@ -83,7 +84,7 @@ class EmailConfirmation extends UnlistedSpecialPage {
                                $out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
                        }
                } else {
-                       if( $user->isEmailConfirmed() ) {
+                       if ( $user->isEmailConfirmed() ) {
                                // date and time are separate parameters to facilitate localisation.
                                // $time is kept for backward compat reasons.
                                // 'emailauthenticated' is also used in SpecialPreferences.php
@@ -94,14 +95,22 @@ class EmailConfirmation extends UnlistedSpecialPage {
                                $t = $lang->userTime( $emailAuthenticated, $user );
                                $out->addWikiMsg( 'emailauthenticated', $time, $d, $t );
                        }
-                       if( $user->isEmailConfirmationPending() ) {
-                               $out->wrapWikiMsg( "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>", 'confirmemail_pending' );
+
+                       if ( $user->isEmailConfirmationPending() ) {
+                               $out->wrapWikiMsg(
+                                       "<div class=\"error mw-confirmemail-pending\">\n$1\n</div>",
+                                       'confirmemail_pending'
+                               );
                        }
+
                        $out->addWikiMsg( 'confirmemail_text' );
-                       $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl() ) );
-                       $form .= Html::hidden( 'token', $user->getEditToken() );
-                       $form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() );
-                       $form .= Xml::closeElement( 'form' );
+                       $form = Html::openElement(
+                               'form',
+                               array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL() )
+                       ) . "\n";
+                       $form .= Html::hidden( 'token', $user->getEditToken() ) . "\n";
+                       $form .= Xml::submitButton( $this->msg( 'confirmemail_send' )->text() ) . "\n";
+                       $form .= Html::closeElement( 'form' ) . "\n";
                        $out->addHTML( $form );
                }
        }
@@ -114,20 +123,22 @@ class EmailConfirmation extends UnlistedSpecialPage {
         */
        function attemptConfirm( $code ) {
                $user = User::newFromConfirmationCode( $code );
-               if( is_object( $user ) ) {
-                       $user->confirmEmail();
-                       $user->saveSettings();
-                       $message = $this->getUser()->isLoggedIn() ? 'confirmemail_loggedin' : 'confirmemail_success';
-                       $this->getOutput()->addWikiMsg( $message );
-                       if( !$this->getUser()->isLoggedIn() ) {
-                               $title = SpecialPage::getTitleFor( 'Userlogin' );
-                               $this->getOutput()->returnToMain( true, $title );
-                       }
-               } else {
+               if ( !is_object( $user ) ) {
                        $this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+
+                       return;
                }
-       }
 
+               $user->confirmEmail();
+               $user->saveSettings();
+               $message = $this->getUser()->isLoggedIn() ? 'confirmemail_loggedin' : 'confirmemail_success';
+               $this->getOutput()->addWikiMsg( $message );
+
+               if ( !$this->getUser()->isLoggedIn() ) {
+                       $title = SpecialPage::getTitleFor( 'Userlogin' );
+                       $this->getOutput()->returnToMain( true, $title );
+               }
+       }
 }
 
 /**
@@ -137,16 +148,13 @@ class EmailConfirmation extends UnlistedSpecialPage {
  * @ingroup SpecialPage
  */
 class EmailInvalidation extends UnlistedSpecialPage {
-
        public function __construct() {
                parent::__construct( 'Invalidateemail' );
        }
 
        function execute( $code ) {
                $this->setHeaders();
-
                $this->checkReadOnly();
-
                $this->attemptInvalidate( $code );
        }
 
@@ -158,15 +166,18 @@ class EmailInvalidation extends UnlistedSpecialPage {
         */
        function attemptInvalidate( $code ) {
                $user = User::newFromConfirmationCode( $code );
-               if( is_object( $user ) ) {
-                       $user->invalidateEmail();
-                       $user->saveSettings();
-                       $this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
-                       if( !$this->getUser()->isLoggedIn() ) {
-                               $this->getOutput()->returnToMain();
-                       }
-               } else {
+               if ( !is_object( $user ) ) {
                        $this->getOutput()->addWikiMsg( 'confirmemail_invalid' );
+
+                       return;
+               }
+
+               $user->invalidateEmail();
+               $user->saveSettings();
+               $this->getOutput()->addWikiMsg( 'confirmemail_invalidated' );
+
+               if ( !$this->getUser()->isLoggedIn() ) {
+                       $this->getOutput()->returnToMain();
                }
        }
 }
index b118059..21becd6 100644 (file)
@@ -28,7 +28,6 @@
  */
 
 class SpecialContributions extends SpecialPage {
-
        protected $opts;
 
        public function __construct() {
@@ -65,6 +64,7 @@ class SpecialContributions extends SpecialPage {
 
                if ( !strlen( $target ) ) {
                        $out->addHTML( $this->getForm() );
+
                        return;
                }
 
@@ -77,11 +77,13 @@ class SpecialContributions extends SpecialPage {
                $nt = Title::makeTitleSafe( NS_USER, $target );
                if ( !$nt ) {
                        $out->addHTML( $this->getForm() );
+
                        return;
                }
                $userObj = User::newFromName( $nt->getText(), false );
                if ( !$userObj ) {
                        $out->addHTML( $this->getForm() );
+
                        return;
                }
                $id = $userObj->getID();
@@ -89,11 +91,17 @@ class SpecialContributions extends SpecialPage {
                if ( $this->opts['contribs'] != 'newbie' ) {
                        $target = $nt->getText();
                        $out->addSubtitle( $this->contributionsSub( $userObj ) );
-                       $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'contributions-title', $target )->plain() ) );
+                       $out->setHTMLTitle( $this->msg(
+                               'pagetitle',
+                               $this->msg( 'contributions-title', $target )->plain()
+                       ) );
                        $this->getSkin()->setRelevantUser( $userObj );
                } else {
                        $out->addSubtitle( $this->msg( 'sp-contributions-newbies-sub' ) );
-                       $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'sp-contributions-newbies-title' )->plain() ) );
+                       $out->setHTMLTitle( $this->msg(
+                               'pagetitle',
+                               $this->msg( 'sp-contributions-newbies-title' )->plain()
+                       ) );
                }
 
                if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
@@ -103,10 +111,8 @@ class SpecialContributions extends SpecialPage {
                }
 
                $this->opts['associated'] = $request->getBool( 'associated' );
-
-               $this->opts['nsInvert'] = (bool) $request->getVal( 'nsInvert' );
-
-               $this->opts['tagfilter'] = (string) $request->getVal( 'tagfilter' );
+               $this->opts['nsInvert'] = (bool)$request->getVal( 'nsInvert' );
+               $this->opts['tagfilter'] = (string)$request->getVal( 'tagfilter' );
 
                // Allows reverts to have the bot flag in recent changes. It is just here to
                // be passed in the form at the top of the page
@@ -152,9 +158,10 @@ class SpecialContributions extends SpecialPage {
                                $apiParams['month'] = $this->opts['month'];
                        }
 
-                       $url = wfScript( 'api' ) . '?' . wfArrayToCgi( $apiParams );
+                       $url = wfAppendQuery( wfScript( 'api' ), $apiParams );
 
                        $out->redirect( $url, '301' );
+
                        return;
                }
 
@@ -162,7 +169,6 @@ class SpecialContributions extends SpecialPage {
                $this->addFeedLinks( array( 'action' => 'feedcontributions', 'user' => $target ) );
 
                if ( wfRunHooks( 'SpecialContributionsBeforeMainOutput', array( $id ) ) ) {
-
                        $out->addHTML( $this->getForm() );
 
                        $pager = new ContribsPager( $this->getContext(), array(
@@ -176,18 +182,20 @@ class SpecialContributions extends SpecialPage {
                                'nsInvert' => $this->opts['nsInvert'],
                                'associated' => $this->opts['associated'],
                        ) );
+
                        if ( !$pager->getNumRows() ) {
                                $out->addWikiMsg( 'nocontribs', $target );
                        } else {
                                # Show a message about slave lag, if applicable
                                $lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
-                               if ( $lag > 0 )
+                               if ( $lag > 0 ) {
                                        $out->showLagWarning( $lag );
+                               }
 
                                $out->addHTML(
                                        '<p>' . $pager->getNavigationBar() . '</p>' .
-                                       $pager->getBody() .
-                                       '<p>' . $pager->getNavigationBar() . '</p>'
+                                               $pager->getBody() .
+                                               '<p>' . $pager->getNavigationBar() . '</p>'
                                );
                        }
                        $out->preventClickjacking( $pager->getPreventClickjacking() );
@@ -195,16 +203,16 @@ class SpecialContributions extends SpecialPage {
                        # Show the appropriate "footer" message - WHOIS tools, etc.
                        if ( $this->opts['contribs'] == 'newbie' ) {
                                $message = 'sp-contributions-footer-newbies';
-                       } elseif( IP::isIPAddress( $target ) ) {
+                       } elseif ( IP::isIPAddress( $target ) ) {
                                $message = 'sp-contributions-footer-anon';
-                       } elseif( $userObj->isAnon() ) {
+                       } elseif ( $userObj->isAnon() ) {
                                // No message for non-existing users
                                $message = '';
                        } else {
                                $message = 'sp-contributions-footer';
                        }
 
-                       if( $message ) {
+                       if ( $message ) {
                                if ( !$this->msg( $message, $target )->isDisabled() ) {
                                        $out->wrapWikiMsg(
                                                "<div class='mw-contributions-footer'>\n$1\n</div>",
@@ -266,10 +274,11 @@ class SpecialContributions extends SpecialPage {
                $oldMsg = $this->msg( 'contribsub' );
                if ( $oldMsg->exists() ) {
                        $linksWithParentheses = $this->msg( 'parentheses' )->rawParams( $links )->escaped();
+
                        return $oldMsg->rawParams( "$user $linksWithParentheses" );
-               } else {
-                       return $this->msg( 'contribsub2' )->rawParams( $user, $links );
                }
+
+               return $this->msg( 'contribsub2' )->rawParams( $user, $links );
        }
 
        /**
@@ -304,14 +313,13 @@ class SpecialContributions extends SpecialPage {
                                        );
                                }
                        }
+
                        # Block log link
                        $tools[] = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Log', 'block' ),
                                $this->msg( 'sp-contributions-blocklog' )->escaped(),
                                array(),
-                               array(
-                                       'page' => $userpage->getPrefixedText()
-                               )
+                               array( 'page' => $userpage->getPrefixedText() )
                        );
                }
                # Uploads
@@ -345,6 +353,7 @@ class SpecialContributions extends SpecialPage {
                }
 
                wfRunHooks( 'ContributionsToolLinks', array( $id, $userpage, &$tools ) );
+
                return $tools;
        }
 
@@ -398,10 +407,28 @@ class SpecialContributions extends SpecialPage {
                        $this->opts['topOnly'] = false;
                }
 
-               $form = Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
+               $form = Html::openElement(
+                       'form',
+                       array(
+                               'method' => 'get',
+                               'action' => $wgScript,
+                               'class' => 'mw-contributions-form'
+                       )
+               );
 
                # Add hidden params for tracking except for parameters in $skipParameters
-               $skipParameters = array( 'namespace', 'nsInvert', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly', 'associated' );
+               $skipParameters = array(
+                       'namespace',
+                       'nsInvert',
+                       'deletedOnly',
+                       'target',
+                       'contribs',
+                       'year',
+                       'month',
+                       'topOnly',
+                       'associated'
+               );
+
                foreach ( $this->opts as $name => $value ) {
                        if ( in_array( $name, $skipParameters ) ) {
                                continue;
@@ -412,65 +439,82 @@ class SpecialContributions extends SpecialPage {
                $tagFilter = ChangeTags::buildTagFilterSelector( $this->opts['tagfilter'] );
 
                if ( $tagFilter ) {
-                       $filterSelection =
-                               Html::rawElement( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
-                               Html::rawElement( 'td', array( 'class' => 'mw-input' ), implode( '&#160', $tagFilter ) );
+                       $filterSelection = Html::rawElement(
+                               'td',
+                               array( 'class' => 'mw-label' ),
+                               array_shift( $tagFilter )
+                       );
+                       $filterSelection .= Html::rawElement(
+                               'td',
+                               array( 'class' => 'mw-input' ),
+                               implode( '&#160', $tagFilter )
+                       );
                } else {
                        $filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
                }
 
-               $targetSelection = Html::rawElement( 'td', array( 'colspan' => 2 ),
-                       Xml::radioLabel(
-                               $this->msg( 'sp-contributions-newbies' )->text(),
-                               'contribs',
-                               'newbie',
-                               'newbie',
-                               $this->opts['contribs'] == 'newbie',
-                               array( 'class' => 'mw-input' )
-                       ) . '<br />' .
-                       Xml::radioLabel(
-                               $this->msg( 'sp-contributions-username' )->text(),
-                               'contribs',
-                               'user',
-                               'user',
-                               $this->opts['contribs'] == 'user',
-                               array( 'class' => 'mw-input' )
-                       ) . ' ' .
-                       Html::input(
-                               'target',
-                               $this->opts['target'],
-                               'text',
-                               array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
-                                       ( $this->opts['target'] ? array() : array( 'autofocus' )
+               $labelNewbies = Xml::radioLabel(
+                       $this->msg( 'sp-contributions-newbies' )->text(),
+                       'contribs',
+                       'newbie',
+                       'newbie',
+                       $this->opts['contribs'] == 'newbie',
+                       array( 'class' => 'mw-input' )
+               );
+               $labelUsername = Xml::radioLabel(
+                       $this->msg( 'sp-contributions-username' )->text(),
+                       'contribs',
+                       'user',
+                       'user',
+                       $this->opts['contribs'] == 'user',
+                       array( 'class' => 'mw-input' )
+               );
+               $input = Html::input(
+                       'target',
+                       $this->opts['target'],
+                       'text',
+                       array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
+                               ( $this->opts['target'] ? array() : array( 'autofocus' )
                                )
-                       ) . ' '
+               );
+               $targetSelection = Html::rawElement(
+                       'td',
+                       array( 'colspan' => 2 ),
+                       $labelNewbies . '<br />' . $labelUsername . ' ' . $input . ' '
                );
 
-               $namespaceSelection =
-                       Xml::tags( 'td', array( 'class' => 'mw-label' ),
-                               Xml::label(
-                                       $this->msg( 'namespace' )->text(),
-                                       'namespace',
-                                       ''
-                               )
-                       ) .
-                       Html::rawElement( 'td', null,
-                               Html::namespaceSelector( array(
-                                       'selected' => $this->opts['namespace'],
-                                       'all'      => '',
-                               ), array(
-                                       'name'  => 'namespace',
-                                       'id'    => 'namespace',
+               $namespaceSelection = Xml::tags(
+                       'td',
+                       array( 'class' => 'mw-label' ),
+                       Xml::label(
+                               $this->msg( 'namespace' )->text(),
+                               'namespace',
+                               ''
+                       )
+               );
+               $namespaceSelection .= Html::rawElement(
+                       'td',
+                       null,
+                       Html::namespaceSelector(
+                               array( 'selected' => $this->opts['namespace'], 'all' => '' ),
+                               array(
+                                       'name' => 'namespace',
+                                       'id' => 'namespace',
                                        'class' => 'namespaceselector',
-                               ) ) .
-                               '&#160;' .
-                               Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+                               )
+                       ) . '&#160;' .
+                               Html::rawElement(
+                                       'span',
+                                       array( 'style' => 'white-space: nowrap' ),
                                        Xml::checkLabel(
                                                $this->msg( 'invert' )->text(),
                                                'nsInvert',
                                                'nsInvert',
                                                $this->opts['nsInvert'],
-                                               array( 'title' => $this->msg( 'tooltip-invert' )->text(), 'class' => 'mw-input' )
+                                               array(
+                                                       'title' => $this->msg( 'tooltip-invert' )->text(),
+                                                       'class' => 'mw-input'
+                                               )
                                        ) . '&#160;'
                                ) .
                                Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
@@ -479,13 +523,18 @@ class SpecialContributions extends SpecialPage {
                                                'associated',
                                                'associated',
                                                $this->opts['associated'],
-                                               array( 'title' => $this->msg( 'tooltip-namespace_association' )->text(), 'class' => 'mw-input' )
+                                               array(
+                                                       'title' => $this->msg( 'tooltip-namespace_association' )->text(),
+                                                       'class' => 'mw-input'
+                                               )
                                        ) . '&#160;'
                                )
-                       );
+               );
 
                if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
-                       $deletedOnlyCheck = Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+                       $deletedOnlyCheck = Html::rawElement(
+                               'span',
+                               array( 'style' => 'white-space: nowrap' ),
                                Xml::checkLabel(
                                        $this->msg( 'history-show-deleted' )->text(),
                                        'deletedOnly',
@@ -498,46 +547,50 @@ class SpecialContributions extends SpecialPage {
                        $deletedOnlyCheck = '';
                }
 
-               $extraOptions = Html::rawElement( 'td', array( 'colspan' => 2 ),
-                       $deletedOnlyCheck .
-                       Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
-                               Xml::checkLabel(
-                                       $this->msg( 'sp-contributions-toponly' )->text(),
-                                       'topOnly',
-                                       'mw-show-top-only',
-                                       $this->opts['topOnly'],
-                                       array( 'class' => 'mw-input' )
-                               )
+               $checkLabelTopOnly = Html::rawElement(
+                       'span',
+                       array( 'style' => 'white-space: nowrap' ),
+                       Xml::checkLabel(
+                               $this->msg( 'sp-contributions-toponly' )->text(),
+                               'topOnly',
+                               'mw-show-top-only',
+                               $this->opts['topOnly'],
+                               array( 'class' => 'mw-input' )
                        )
                );
+               $extraOptions = Html::rawElement(
+                       'td',
+                       array( 'colspan' => 2 ),
+                       $deletedOnlyCheck . $checkLabelTopOnly
+               );
 
                $dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ),
                        Xml::dateMenu(
-                               $this->opts['year'],
+                               $this->opts['year'] === '' ? gmdate( 'Y' ) : $this->opts['year'],
                                $this->opts['month']
                        ) . ' ' .
-                       Xml::submitButton(
-                               $this->msg( 'sp-contributions-submit' )->text(),
-                               array( 'class' => 'mw-submit' )
-                       )
+                               Xml::submitButton(
+                                       $this->msg( 'sp-contributions-submit' )->text(),
+                                       array( 'class' => 'mw-submit' )
+                               )
                );
 
-               $form .=
-                       Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() ) .
-                       Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
-                               Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
-                               Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
-                               Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
-                               Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
-                               Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
-                       );
+               $form .= Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() );
+               $form .= Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
+                       Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
+                       Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
+                       Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
+                       Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
+                       Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
+               );
 
                $explain = $this->msg( 'sp-contributions-explain' );
                if ( !$explain->isBlank() ) {
                        $form .= "<p id='mw-sp-contributions-explain'>{$explain->parse()}</p>";
                }
-               $form .= Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
+
+               $form .= Xml::closeElement( 'fieldset' ) . Xml::closeElement( 'form' );
+
                return $form;
        }
 
@@ -564,7 +617,15 @@ class ContribsPager extends ReverseChronologicalPager {
        function __construct( IContextSource $context, array $options ) {
                parent::__construct( $context );
 
-               $msgs = array( 'uctop', 'diff', 'newarticle', 'rollbacklink', 'diff', 'hist', 'rev-delundel', 'pipe-separator' );
+               $msgs = array(
+                       'diff',
+                       'hist',
+                       'newarticle',
+                       'pipe-separator',
+                       'rev-delundel',
+                       'rollbacklink',
+                       'uctop'
+               );
 
                foreach ( $msgs as $msg ) {
                        $this->messages[$msg] = $this->msg( $msg )->escaped();
@@ -590,6 +651,7 @@ class ContribsPager extends ReverseChronologicalPager {
        function getDefaultQuery() {
                $query = parent::getDefaultQuery();
                $query['target'] = $this->target;
+
                return $query;
        }
 
@@ -603,7 +665,11 @@ class ContribsPager extends ReverseChronologicalPager {
         * @return ResultWrapper
         */
        function reallyDoQuery( $offset, $limit, $descending ) {
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $descending );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo(
+                       $offset,
+                       $limit,
+                       $descending
+               );
                $pager = $this;
 
                /*
@@ -673,15 +739,15 @@ class ContribsPager extends ReverseChronologicalPager {
                $join_cond['user'] = Revision::userJoinCond();
 
                $queryInfo = array(
-                       'tables'     => $tables,
-                       'fields'     => array_merge(
+                       'tables' => $tables,
+                       'fields' => array_merge(
                                Revision::selectFields(),
                                Revision::selectUserFields(),
                                array( 'page_namespace', 'page_title', 'page_is_new',
                                        'page_latest', 'page_is_redirect', 'page_len' )
                        ),
-                       'conds'      => $conds,
-                       'options'    => array( 'USE INDEX' => array( 'revision' => $index ) ),
+                       'conds' => $conds,
+                       'options' => array( 'USE INDEX' => array( 'revision' => $index ) ),
                        'join_conds' => $join_cond
                );
 
@@ -695,6 +761,7 @@ class ContribsPager extends ReverseChronologicalPager {
                );
 
                wfRunHooks( 'ContribsPager::getQueryInfo', array( &$this, &$queryInfo ) );
+
                return $queryInfo;
        }
 
@@ -709,7 +776,7 @@ class ContribsPager extends ReverseChronologicalPager {
                        # ignore local groups with the bot right
                        # @todo FIXME: Global groups may have 'bot' rights
                        $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
-                       if( count( $groupsWithBotPermission ) ) {
+                       if ( count( $groupsWithBotPermission ) ) {
                                $tables[] = 'user_groups';
                                $condition[] = 'ug_group IS NULL';
                                $join_conds['user_groups'] = array(
@@ -729,12 +796,15 @@ class ContribsPager extends ReverseChronologicalPager {
                                $index = 'usertext_timestamp';
                        }
                }
+
                if ( $this->deletedOnly ) {
                        $condition[] = 'rev_deleted != 0';
                }
+
                if ( $this->topOnly ) {
                        $condition[] = 'rev_id = page_latest';
                }
+
                return array( $tables, $index, $condition, $join_conds );
        }
 
@@ -746,20 +816,20 @@ class ContribsPager extends ReverseChronologicalPager {
 
                        if ( !$this->associated ) {
                                return array( "page_namespace $eq_op $selectedNS" );
-                       } else {
-                               $associatedNS = $this->mDb->addQuotes (
-                                       MWNamespace::getAssociated( $this->namespace )
-                               );
-                               return array(
-                                       "page_namespace $eq_op $selectedNS " .
-                                       $bool_op .
-                                       " page_namespace $eq_op $associatedNS"
-                               );
                        }
 
-               } else {
-                       return array();
+                       $associatedNS = $this->mDb->addQuotes(
+                               MWNamespace::getAssociated( $this->namespace )
+                       );
+
+                       return array(
+                               "page_namespace $eq_op $selectedNS " .
+                                       $bool_op .
+                                       " page_namespace $eq_op $associatedNS"
+                       );
                }
+
+               return array();
        }
 
        function getIndexField() {
@@ -773,7 +843,7 @@ class ContribsPager extends ReverseChronologicalPager {
                $batch = new LinkBatch();
                # Give some pointers to make (last) links
                foreach ( $this->mResult as $row ) {
-                       if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
+                       if ( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
                                $revIds[] = $row->rev_parent_id;
                        }
                        if ( isset( $row->rev_id ) ) {
@@ -830,7 +900,7 @@ class ContribsPager extends ReverseChronologicalPager {
                 */
                wfSuppressWarnings();
                $rev = new Revision( $row );
-               $validRevision = (bool) $rev->getId();
+               $validRevision = (bool)$rev->getId();
                wfRestoreWarnings();
 
                if ( $validRevision ) {
@@ -850,8 +920,8 @@ class ContribsPager extends ReverseChronologicalPager {
                                $topmarktext .= '<span class="mw-uctop">' . $this->messages['uctop'] . '</span>';
                                # Add rollback link
                                if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user )
-                                       && $page->quickUserCan( 'edit', $user ) )
-                               {
+                                       && $page->quickUserCan( 'edit', $user )
+                               {
                                        $this->preventClickjacking();
                                        $topmarktext .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
                                }
@@ -881,11 +951,18 @@ class ContribsPager extends ReverseChronologicalPager {
                                // For some reason rev_parent_id isn't populated for this row.
                                // Its rumoured this is true on wikipedia for some revisions (bug 34922).
                                // Next best thing is to have the total number of bytes.
-                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . Linker::formatRevisionSize( $row->rev_len ) . ' <span class="mw-changeslist-separator">. .</span> ';
+                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
+                               $chardiff .= Linker::formatRevisionSize( $row->rev_len );
+                               $chardiff .= ' <span class="mw-changeslist-separator">. .</span> ';
                        } else {
                                $parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0;
-                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . ChangesList::showCharacterDifference(
-                                               $parentLen, $row->rev_len, $this->getContext() ) . ' <span class="mw-changeslist-separator">. .</span> ';
+                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ';
+                               $chardiff .= ChangesList::showCharacterDifference(
+                                       $parentLen,
+                                       $row->rev_len,
+                                       $this->getContext()
+                               );
+                               $chardiff .= ' <span class="mw-changeslist-separator">. .</span> ';
                        }
 
                        $lang = $this->getLanguage();
@@ -932,7 +1009,9 @@ class ContribsPager extends ReverseChronologicalPager {
                                $del .= ' ';
                        }
 
-                       $diffHistLinks = $this->msg( 'parentheses' )->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )->escaped();
+                       $diffHistLinks = $this->msg( 'parentheses' )
+                               ->rawParams( $difftext . $this->messages['pipe-separator'] . $histlink )
+                               ->escaped();
                        $ret = "{$del}{$d} {$diffHistLinks}{$chardiff}{$nflag}{$mflag} {$link}{$userlink} {$comment} {$topmarktext}";
 
                        # Denote if username is redacted for this edit
@@ -941,7 +1020,10 @@ class ContribsPager extends ReverseChronologicalPager {
                        }
 
                        # Tags, if any.
-                       list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow( $row->ts_tags, 'contributions' );
+                       list( $tagSummary, $newClasses ) = ChangeTags::formatSummaryRow(
+                               $row->ts_tags,
+                               'contributions'
+                       );
                        $classes = array_merge( $classes, $newClasses );
                        $ret .= " $tagSummary";
                }
@@ -957,6 +1039,7 @@ class ContribsPager extends ReverseChronologicalPager {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $ret;
        }
 
@@ -966,7 +1049,8 @@ class ContribsPager extends ReverseChronologicalPager {
         */
        function getSqlComment() {
                if ( $this->namespace || $this->deletedOnly ) {
-                       return 'contributions page filtered for namespace or RevisionDeleted edits'; // potentially slow, see CR r58153
+                       // potentially slow, see CR r58153
+                       return 'contributions page filtered for namespace or RevisionDeleted edits';
                } else {
                        return 'contributions page unfiltered';
                }
index 6978d6b..44137c1 100644 (file)
@@ -59,24 +59,29 @@ class DeadendPagesPage extends PageQueryPage {
        function getQueryInfo() {
                return array(
                        'tables' => array( 'page', 'pagelinks' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_title'
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_title'
                        ),
-                       'conds' => array( 'pl_from IS NULL',
-                                       'page_namespace' => MWNamespace::getContentNamespaces(),
-                                       'page_is_redirect' => 0
+                       'conds' => array(
+                               'pl_from IS NULL',
+                               'page_namespace' => MWNamespace::getContentNamespaces(),
+                               'page_is_redirect' => 0
                        ),
-                       'join_conds' => array( 'pagelinks' => array( 'LEFT JOIN', array(
-                                       'page_id=pl_from'
-                       ) ) )
+                       'join_conds' => array(
+                               'pagelinks' => array(
+                                       'LEFT JOIN',
+                                       array( 'page_id=pl_from' )
+                               )
+                       )
                );
        }
 
        function getOrderFields() {
                // For some crazy reason ordering by a constant
                // causes a filesort
-               if( count( MWNamespace::getContentNamespaces() ) > 1 ) {
+               if ( count( MWNamespace::getContentNamespaces() ) > 1 ) {
                        return array( 'page_namespace', 'page_title' );
                } else {
                        return array( 'page_title' );
index e374979..28ca24b 100644 (file)
@@ -30,10 +30,15 @@ class DeletedContribsPager extends IndexPager {
        var $messages, $target;
        var $namespace = '', $mDb;
 
+       /**
+        * @var string Navigation bar with paging links.
+        */
+       protected $mNavigationBar;
+
        function __construct( IContextSource $context, $target, $namespace = false ) {
                parent::__construct( $context );
                $msgs = array( 'deletionlog', 'undeleteviewlink', 'diff' );
-               foreach( $msgs as $msg ) {
+               foreach ( $msgs as $msg ) {
                        $this->messages[$msg] = $this->msg( $msg )->escaped();
                }
                $this->target = $target;
@@ -44,6 +49,7 @@ class DeletedContribsPager extends IndexPager {
        function getDefaultQuery() {
                $query = parent::getDefaultQuery();
                $query['target'] = $this->target;
+
                return $query;
        }
 
@@ -52,17 +58,18 @@ class DeletedContribsPager extends IndexPager {
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
                $user = $this->getUser();
                // Paranoia: avoid brute force searches (bug 17792)
-               if( !$user->isAllowed( 'deletedhistory' ) ) {
+               if ( !$user->isAllowed( 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::DELETED_USER ) . ' = 0';
-               } elseif( !$user->isAllowed( 'suppressrevision' ) ) {
+               } elseif ( !$user->isAllowed( 'suppressrevision' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', Revision::SUPPRESSED_USER ) .
                                ' != ' . Revision::SUPPRESSED_USER;
                }
+
                return array(
                        'tables' => array( 'archive' ),
                        'fields' => array(
-                               'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment', 'ar_minor_edit',
-                               'ar_user', 'ar_user_text', 'ar_deleted'
+                               'ar_rev_id', 'ar_namespace', 'ar_title', 'ar_timestamp', 'ar_comment',
+                               'ar_minor_edit', 'ar_user', 'ar_user_text', 'ar_deleted'
                        ),
                        'conds' => $conds,
                        'options' => array( 'USE INDEX' => $index )
@@ -107,8 +114,17 @@ class DeletedContribsPager extends IndexPager {
                $lang = $this->getLanguage();
                $limits = $lang->pipeList( $limitLinks );
 
-               $this->mNavigationBar = "(" . $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) ) . ") " .
-                       $this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'], $pagingLinks['next'], $limits )->escaped();
+               $firstLast = $lang->pipeList( array( $pagingLinks['first'], $pagingLinks['last'] ) );
+               $firstLast = $this->msg( 'parentheses' )->rawParams( $firstLast )->escaped();
+               $prevNext = $this->msg( 'viewprevnext' )
+                       ->rawParams(
+                               $pagingLinks['prev'],
+                               $pagingLinks['next'],
+                               $limits
+                       )->escaped();
+               $separator = $this->msg( 'word-separator' )->escaped();
+               $this->mNavigationBar = $firstLast . $separator . $prevNext;
+
                return $this->mNavigationBar;
        }
 
@@ -138,15 +154,15 @@ class DeletedContribsPager extends IndexPager {
                $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
 
                $rev = new Revision( array(
-                               'title'      => $page,
-                               'id'         => $row->ar_rev_id,
-                               'comment'    => $row->ar_comment,
-                               'user'       => $row->ar_user,
-                               'user_text'  => $row->ar_user_text,
-                               'timestamp'  => $row->ar_timestamp,
-                               'minor_edit' => $row->ar_minor_edit,
-                               'deleted'    => $row->ar_deleted,
-                               ) );
+                       'title' => $page,
+                       'id' => $row->ar_rev_id,
+                       'comment' => $row->ar_comment,
+                       'user' => $row->ar_user,
+                       'user_text' => $row->ar_user_text,
+                       'timestamp' => $row->ar_timestamp,
+                       'minor_edit' => $row->ar_minor_edit,
+                       'deleted' => $row->ar_deleted,
+               ) );
 
                $undelete = SpecialPage::getTitleFor( 'Undelete' );
 
@@ -168,7 +184,7 @@ class DeletedContribsPager extends IndexPager {
 
                $user = $this->getUser();
 
-               if( $user->isAllowed( 'deletedtext' ) ) {
+               if ( $user->isAllowed( 'deletedtext' ) ) {
                        $last = Linker::linkKnown(
                                $undelete,
                                $this->messages['diff'],
@@ -184,9 +200,10 @@ class DeletedContribsPager extends IndexPager {
                }
 
                $comment = Linker::revComment( $rev );
-               $date = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user ) );
+               $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user );
+               $date = htmlspecialchars( $date );
 
-               if( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                        $link = $date; // unusable link
                } else {
                        $link = Linker::linkKnown(
@@ -200,7 +217,7 @@ class DeletedContribsPager extends IndexPager {
                        );
                }
                // Style deleted items
-               if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
 
@@ -210,7 +227,7 @@ class DeletedContribsPager extends IndexPager {
                        array( 'class' => 'mw-changeslist-title' )
                );
 
-               if( $rev->isMinor() ) {
+               if ( $rev->isMinor() ) {
                        $mflag = ChangesList::flag( 'minor' );
                } else {
                        $mflag = '';
@@ -218,7 +235,9 @@ class DeletedContribsPager extends IndexPager {
 
                // Revision delete link
                $del = Linker::getRevDeleteLink( $user, $rev, $page );
-               if ( $del ) $del .= ' ';
+               if ( $del ) {
+                       $del .= ' ';
+               }
 
                $tools = Html::rawElement(
                        'span',
@@ -231,13 +250,14 @@ class DeletedContribsPager extends IndexPager {
                $ret = "{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}";
 
                # Denote if username is redacted for this edit
-               if( $rev->isDeleted( Revision::DELETED_USER ) ) {
+               if ( $rev->isDeleted( Revision::DELETED_USER ) ) {
                        $ret .= " <strong>" . $this->msg( 'rev-deleted-user-contribs' )->escaped() . "</strong>";
                }
 
                $ret = Html::rawElement( 'li', array(), $ret ) . "\n";
 
                wfProfileOut( __METHOD__ );
+
                return $ret;
        }
 
@@ -254,7 +274,7 @@ class DeletedContribsPager extends IndexPager {
 class DeletedContributionsPage extends SpecialPage {
        function __construct() {
                parent::__construct( 'DeletedContributions', 'deletedhistory',
-               /*listed*/ true, /*function*/ false, /*file*/ false );
+               /*listed*/true, /*function*/false, /*file*/false );
        }
 
        /**
@@ -265,6 +285,7 @@ class DeletedContributionsPage extends SpecialPage {
         */
        function execute( $par ) {
                global $wgQueryPageDefaultLimit;
+
                $this->setHeaders();
                $this->outputHeader();
 
@@ -272,6 +293,7 @@ class DeletedContributionsPage extends SpecialPage {
 
                if ( !$this->userCanExecute( $user ) ) {
                        $this->displayRestrictionError();
+
                        return;
                }
 
@@ -289,6 +311,7 @@ class DeletedContributionsPage extends SpecialPage {
 
                if ( !strlen( $target ) ) {
                        $out->addHTML( $this->getForm( '' ) );
+
                        return;
                }
 
@@ -298,6 +321,7 @@ class DeletedContributionsPage extends SpecialPage {
                $userObj = User::newFromName( $target, false );
                if ( !$userObj ) {
                        $out->addHTML( $this->getForm( '' ) );
+
                        return;
                }
                $this->getSkin()->setRelevantUser( $userObj );
@@ -316,28 +340,33 @@ class DeletedContributionsPage extends SpecialPage {
                $pager = new DeletedContribsPager( $this->getContext(), $target, $options['namespace'] );
                if ( !$pager->getNumRows() ) {
                        $out->addWikiMsg( 'nocontribs' );
+
                        return;
                }
 
                # Show a message about slave lag, if applicable
                $lag = wfGetLB()->safeGetLag( $pager->getDatabase() );
-               if( $lag > 0 )
+               if ( $lag > 0 ) {
                        $out->showLagWarning( $lag );
+               }
 
                $out->addHTML(
                        '<p>' . $pager->getNavigationBar() . '</p>' .
-                       $pager->getBody() .
-                       '<p>' . $pager->getNavigationBar() . '</p>' );
+                               $pager->getBody() .
+                               '<p>' . $pager->getNavigationBar() . '</p>' );
 
                # If there were contributions, and it was a valid user or IP, show
                # the appropriate "footer" message - WHOIS tools, etc.
-               if( $target != 'newbies' ) {
+               if ( $target != 'newbies' ) {
                        $message = IP::isIPAddress( $target )
                                ? 'sp-contributions-footer-anon'
                                : 'sp-contributions-footer';
 
-                       if( !$this->msg( $message )->isDisabled() ) {
-                               $out->wrapWikiMsg( "<div class='mw-contributions-footer'>\n$1\n</div>", array( $message, $target ) );
+                       if ( !$this->msg( $message )->isDisabled() ) {
+                               $out->wrapWikiMsg(
+                                       "<div class='mw-contributions-footer'>\n$1\n</div>",
+                                       array( $message, $target )
+                               );
                        }
                }
        }
@@ -358,11 +387,12 @@ class DeletedContributionsPage extends SpecialPage {
                $nt = $userObj->getUserPage();
                $id = $userObj->getID();
                $talk = $nt->getTalkPage();
-               if( $talk ) {
+               if ( $talk ) {
                        # Talk page link
                        $tools[] = Linker::link( $talk, $this->msg( 'sp-contributions-talk' )->escaped() );
-                       if( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
-                               if( $this->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
+                       if ( ( $id !== null ) || ( $id === null && IP::isIPAddress( $nt->getText() ) ) ) {
+                               # Block / Change block / Unblock links
+                               if ( $this->getUser()->isAllowed( 'block' ) ) {
                                        if ( $userObj->isBlocked() ) {
                                                $tools[] = Linker::linkKnown( # Change block link
                                                        SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
@@ -377,8 +407,8 @@ class DeletedContributionsPage extends SpecialPage {
                                                                'ip' => $nt->getDBkey()
                                                        )
                                                );
-                                       }
-                                       else { # User is not blocked
+                                       } else {
+                                               # User is not blocked
                                                $tools[] = Linker::linkKnown( # Block link
                                                        SpecialPage::getTitleFor( 'Block', $nt->getDBkey() ),
                                                        $this->msg( 'blocklink' )->escaped()
@@ -419,7 +449,7 @@ class DeletedContributionsPage extends SpecialPage {
                        # Add a link to change user rights for privileged users
                        $userrightsPage = new UserrightsPage();
                        $userrightsPage->setContext( $this->getContext() );
-                       if( $userrightsPage->userCanChangeRights( $userObj ) ) {
+                       if ( $userrightsPage->userCanChangeRights( $userObj ) ) {
                                $tools[] = Linker::linkKnown(
                                        SpecialPage::getTitleFor( 'Userrights', $nt->getDBkey() ),
                                        $this->msg( 'sp-contributions-userrights' )->escaped()
@@ -432,7 +462,8 @@ class DeletedContributionsPage extends SpecialPage {
 
                        // Show a note if the user is blocked and display the last block log entry.
                        if ( $userObj->isBlocked() ) {
-                               $out = $this->getOutput(); // LogEventsList::showLogExtract() wants the first parameter by ref
+                               // LogEventsList::showLogExtract() wants the first parameter by ref
+                               $out = $this->getOutput();
                                LogEventsList::showLogExtract(
                                        $out,
                                        'block',
@@ -458,9 +489,9 @@ class DeletedContributionsPage extends SpecialPage {
                $oldMsg = $this->msg( 'contribsub' );
                if ( $oldMsg->exists() ) {
                        return $oldMsg->rawParams( "$user ($links)" );
-               } else {
-                       return $this->msg( 'contribsub2' )->rawParams( $user, $links );
                }
+
+               return $this->msg( 'contribsub2' )->rawParams( $user, $links );
        }
 
        /**
@@ -499,27 +530,38 @@ class DeletedContributionsPage extends SpecialPage {
                        $f .= "\t" . Html::hidden( $name, $value ) . "\n";
                }
 
-               $f .= Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() ) .
-                       Xml::tags( 'label', array( 'for' => 'target' ), $this->msg( 'sp-contributions-username' )->parse() ) . ' ' .
-                       Html::input( 'target', $options['target'], 'text', array(
+               $f .= Xml::openElement( 'fieldset' );
+               $f .= Xml::element( 'legend', array(), $this->msg( 'sp-contributions-search' )->text() );
+               $f .= Xml::tags(
+                       'label',
+                       array( 'for' => 'target' ),
+                       $this->msg( 'sp-contributions-username' )->parse()
+               ) . ' ';
+               $f .= Html::input(
+                       'target',
+                       $options['target'],
+                       'text',
+                       array(
                                'size' => '20',
                                'required' => ''
-                       ) + ( $options['target'] ? array() : array( 'autofocus' ) ) ) . ' '.
-                       Html::namespaceSelector(
-                               array(
-                                       'selected' => $options['namespace'],
-                                       'all' => '',
-                                       'label' => $this->msg( 'namespace' )->text()
-                               ), array(
-                                       'name'  => 'namespace',
-                                       'id'    => 'namespace',
-                                       'class' => 'namespaceselector',
-                               )
-                       ) . ' ' .
-                       Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
+                       ) + ( $options['target'] ? array() : array( 'autofocus' ) )
+               ) . ' ';
+               $f .= Html::namespaceSelector(
+                       array(
+                               'selected' => $options['namespace'],
+                               'all' => '',
+                               'label' => $this->msg( 'namespace' )->text()
+                       ),
+                       array(
+                               'name' => 'namespace',
+                               'id' => 'namespace',
+                               'class' => 'namespaceselector',
+                       )
+               ) . ' ';
+               $f .= Xml::submitButton( $this->msg( 'sp-contributions-submit' )->text() );
+               $f .= Xml::closeElement( 'fieldset' );
+               $f .= Xml::closeElement( 'form' );
+
                return $f;
        }
 
index 2126ca5..ceecd15 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class DisambiguationsPage extends QueryPage {
-
        function __construct( $name = 'Disambiguations' ) {
                parent::__construct( $name );
        }
@@ -55,43 +54,47 @@ class DisambiguationsPage extends QueryPage {
                # If the text can be treated as a title, use it verbatim.
                # Otherwise, pull the titles from the links table
                $dp = Title::newFromText( $dMsgText );
-               if( $dp ) {
-                       if( $dp->getNamespace() != NS_TEMPLATE ) {
+               if ( $dp ) {
+                       if ( $dp->getNamespace() != NS_TEMPLATE ) {
                                # @todo FIXME: We assume the disambiguation message is a template but
                                # the page can potentially be from another namespace :/
                                wfDebug( "Mediawiki:disambiguationspage message does not refer to a template!\n" );
                        }
                        $linkBatch->addObj( $dp );
                } else {
-                               # Get all the templates linked from the Mediawiki:Disambiguationspage
-                               $disPageObj = Title::makeTitleSafe( NS_MEDIAWIKI, 'disambiguationspage' );
-                               $res = $dbr->select(
-                                       array( 'pagelinks', 'page' ),
-                                       'pl_title',
-                                       array( 'page_id = pl_from',
-                                               'pl_namespace' => NS_TEMPLATE,
-                                               'page_namespace' => $disPageObj->getNamespace(),
-                                               'page_title' => $disPageObj->getDBkey()
-                                       ), __METHOD__ );
-
-                               foreach ( $res as $row ) {
-                                       $linkBatch->addObj( Title::makeTitle( NS_TEMPLATE, $row->pl_title ));
-                               }
+                       # Get all the templates linked from the Mediawiki:Disambiguationspage
+                       $disPageObj = Title::makeTitleSafe( NS_MEDIAWIKI, 'disambiguationspage' );
+                       $res = $dbr->select(
+                               array( 'pagelinks', 'page' ),
+                               'pl_title',
+                               array(
+                                       'page_id = pl_from',
+                                       'pl_namespace' => NS_TEMPLATE,
+                                       'page_namespace' => $disPageObj->getNamespace(),
+                                       'page_title' => $disPageObj->getDBkey()
+                               ),
+                               __METHOD__
+                       );
+
+                       foreach ( $res as $row ) {
+                               $linkBatch->addObj( Title::makeTitle( NS_TEMPLATE, $row->pl_title ) );
+                       }
                }
                $set = $linkBatch->constructSet( 'tl', $dbr );
 
-               if( $set === false ) {
+               if ( $set === false ) {
                        # We must always return a valid SQL query, but this way
                        # the DB will always quickly return an empty result
                        $set = 'FALSE';
                        wfDebug( "Mediawiki:disambiguationspage message does not link to any templates!\n" );
                }
+
                return $set;
        }
 
        function getQueryInfo() {
                // @todo FIXME: What are pagelinks and p2 doing here?
-               return array (
+               return array(
                        'tables' => array(
                                'templatelinks',
                                'p1' => 'page',
@@ -125,8 +128,8 @@ class DisambiguationsPage extends QueryPage {
        /**
         * Fetch links and cache their existence
         *
-        * @param $db DatabaseBase
-        * @param $res
+        * @param DatabaseBase $db
+        * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                if ( !$res->numRows() ) {
@@ -142,6 +145,11 @@ class DisambiguationsPage extends QueryPage {
                $res->seek( 0 );
        }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
        function formatResult( $skin, $result ) {
                $title = Title::newFromID( $result->value );
                $dp = Title::makeTitle( $result->namespace, $result->title );
index 5a5d749..c364f70 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class DoubleRedirectsPage extends QueryPage {
-
        function __construct( $name = 'DoubleRedirects' ) {
                parent::__construct( $name );
        }
@@ -52,8 +51,8 @@ class DoubleRedirectsPage extends QueryPage {
        function reallyGetQueryInfo( $namespace = null, $title = null ) {
                $limitToTitle = !( $namespace === null && $title === null );
                $dbr = wfGetDB( DB_SLAVE );
-               $retval = array (
-                       'tables' => array (
+               $retval = array(
+                       'tables' => array(
                                'ra' => 'redirect',
                                'rb' => 'redirect',
                                'pa' => 'page',
@@ -91,10 +90,12 @@ class DoubleRedirectsPage extends QueryPage {
                                'rb.rd_from = pb.page_id',
                        )
                );
+
                if ( $limitToTitle ) {
                        $retval['conds']['pa.page_namespace'] = $namespace;
                        $retval['conds']['pa.page_title'] = $title;
                }
+
                return $retval;
        }
 
@@ -103,9 +104,14 @@ class DoubleRedirectsPage extends QueryPage {
        }
 
        function getOrderFields() {
-               return array ( 'ra.rd_namespace', 'ra.rd_title' );
+               return array( 'ra.rd_namespace', 'ra.rd_title' );
        }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
        function formatResult( $skin, $result ) {
                $titleA = Title::makeTitle( $result->namespace, $result->title );
 
@@ -116,10 +122,17 @@ class DoubleRedirectsPage extends QueryPage {
                // using the filter of reallyGetQueryInfo.
                if ( $result && !isset( $result->nsb ) ) {
                        $dbr = wfGetDB( DB_SLAVE );
-                       $qi = $this->reallyGetQueryInfo( $result->namespace,
-                                       $result->title );
-                       $res = $dbr->select( $qi['tables'], $qi['fields'],
-                                       $qi['conds'], __METHOD__ );
+                       $qi = $this->reallyGetQueryInfo(
+                               $result->namespace,
+                               $result->title
+                       );
+                       $res = $dbr->select(
+                               $qi['tables'],
+                               $qi['fields'],
+                               $qi['conds'],
+                               __METHOD__
+                       );
+
                        if ( $res ) {
                                $result = $dbr->fetchObject( $res );
                        }
@@ -160,7 +173,7 @@ class DoubleRedirectsPage extends QueryPage {
                $lang = $this->getLanguage();
                $arr = $lang->getArrow() . $lang->getDirMark();
 
-               return( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
+               return ( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
        }
 
        protected function getGroupName() {
index d2838e0..f297039 100644 (file)
@@ -35,7 +35,6 @@
  * @author Rob Church <robchur@gmail.com>
  */
 class SpecialEditWatchlist extends UnlistedSpecialPage {
-
        /**
         * Editing modes
         */
@@ -64,7 +63,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $out = $this->getOutput();
 
                # Anons don't get a watchlist
-               if( $this->getUser()->isAnon() ) {
+               if ( $this->getUser()->isAnon() ) {
                        $out->setPageTitle( $this->msg( 'watchnologin' ) );
                        $llink = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Userlogin' ),
@@ -73,6 +72,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                array( 'returnto' => $this->getTitle()->getPrefixedText() )
                        );
                        $out->addHTML( $this->msg( 'watchlistanontext' )->rawParams( $llink )->parse() );
+
                        return;
                }
 
@@ -81,20 +81,20 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                $this->outputHeader();
 
-               $out->addSubtitle( $this->msg( 'watchlistfor2', $this->getUser()->getName()
-                       )->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
+               $out->addSubtitle( $this->msg( 'watchlistfor2', $this->getUser()->getName() )
+                       ->rawParams( SpecialEditWatchlist::buildTools( null ) ) );
 
                # B/C: $mode used to be waaay down the parameter list, and the first parameter
                # was $wgUser
-               if( $mode instanceof User ) {
+               if ( $mode instanceof User ) {
                        $args = func_get_args();
-                       if( count( $args >= 4 ) ) {
+                       if ( count( $args ) >= 4 ) {
                                $mode = $args[3];
                        }
                }
                $mode = self::getMode( $this->getRequest(), $mode );
 
-               switch( $mode ) {
+               switch ( $mode ) {
                        case self::EDIT_CLEAR:
                                // The "Clear" link scared people too much.
                                // Pass on to the raw editor, from which it's very easy to clear.
@@ -102,7 +102,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        case self::EDIT_RAW:
                                $out->setPageTitle( $this->msg( 'watchlistedit-raw-title' ) );
                                $form = $this->getRawForm();
-                               if( $form->show() ) {
+                               if ( $form->show() ) {
                                        $out->addHTML( $this->successMessage );
                                        $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
                                }
@@ -112,7 +112,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        default:
                                $out->setPageTitle( $this->msg( 'watchlistedit-normal-title' ) );
                                $form = $this->getNormalForm();
-                               if( $form->show() ) {
+                               if ( $form->show() ) {
                                        $out->addHTML( $this->successMessage );
                                        $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
                                } elseif ( $this->toc !== false ) {
@@ -131,15 +131,17 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         */
        private function extractTitles( $list ) {
                $list = explode( "\n", trim( $list ) );
-               if( !is_array( $list ) ) {
+               if ( !is_array( $list ) ) {
                        return array();
                }
+
                $titles = array();
-               foreach( $list as $text ) {
+
+               foreach ( $list as $text ) {
                        $text = trim( $text );
-                       if( strlen( $text ) > 0 ) {
+                       if ( strlen( $text ) > 0 ) {
                                $title = Title::newFromText( $text );
-                               if( $title instanceof Title && $title->isWatchable() ) {
+                               if ( $title instanceof Title && $title->isWatchable() ) {
                                        $titles[] = $title;
                                }
                        }
@@ -148,9 +150,11 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                GenderCache::singleton()->doTitlesArray( $titles );
 
                $list = array();
-               foreach( $titles as $title ) {
+               /** @var Title $title */
+               foreach ( $titles as $title ) {
                        $list[] = $title->getPrefixedText();
                }
+
                return array_unique( $list );
        }
 
@@ -158,44 +162,45 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $wanted = $this->extractTitles( $data['Titles'] );
                $current = $this->getWatchlist();
 
-               if( count( $wanted ) > 0 ) {
+               if ( count( $wanted ) > 0 ) {
                        $toWatch = array_diff( $wanted, $current );
                        $toUnwatch = array_diff( $current, $wanted );
                        $this->watchTitles( $toWatch );
                        $this->unwatchTitles( $toUnwatch );
                        $this->getUser()->invalidateCache();
 
-                       if( count( $toWatch ) > 0 || count( $toUnwatch ) > 0 ) {
+                       if ( count( $toWatch ) > 0 || count( $toUnwatch ) > 0 ) {
                                $this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
                        } else {
                                return false;
                        }
 
-                       if( count( $toWatch ) > 0 ) {
+                       if ( count( $toWatch ) > 0 ) {
                                $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-added'
-                                       )->numParams( count( $toWatch ) )->parse();
+                               )->numParams( count( $toWatch ) )->parse();
                                $this->showTitles( $toWatch, $this->successMessage );
                        }
 
-                       if( count( $toUnwatch ) > 0 ) {
+                       if ( count( $toUnwatch ) > 0 ) {
                                $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed'
-                                       )->numParams( count( $toUnwatch ) )->parse();
+                               )->numParams( count( $toUnwatch ) )->parse();
                                $this->showTitles( $toUnwatch, $this->successMessage );
                        }
                } else {
                        $this->clearWatchlist();
                        $this->getUser()->invalidateCache();
 
-                       if( count( $current ) > 0 ) {
+                       if ( count( $current ) > 0 ) {
                                $this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
                        } else {
                                return false;
                        }
 
-                       $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed'
-                               )->numParams( count( $current ) )->parse();
+                       $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed' )
+                               ->numParams( count( $current ) )->parse();
                        $this->showTitles( $current, $this->successMessage );
                }
+
                return true;
        }
 
@@ -212,29 +217,35 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $talk = $this->msg( 'talkpagelinktext' )->escaped();
                // Do a batch existence check
                $batch = new LinkBatch();
-               foreach( $titles as $title ) {
-                       if( !$title instanceof Title ) {
+               foreach ( $titles as $title ) {
+                       if ( !$title instanceof Title ) {
                                $title = Title::newFromText( $title );
                        }
-                       if( $title instanceof Title ) {
+
+                       if ( $title instanceof Title ) {
                                $batch->addObj( $title );
                                $batch->addObj( $title->getTalkPage() );
                        }
                }
+
                $batch->execute();
+
                // Print out the list
                $output .= "<ul>\n";
-               foreach( $titles as $title ) {
-                       if( !$title instanceof Title ) {
+
+               foreach ( $titles as $title ) {
+                       if ( !$title instanceof Title ) {
                                $title = Title::newFromText( $title );
                        }
-                       if( $title instanceof Title ) {
+
+                       if ( $title instanceof Title ) {
                                $output .= "<li>"
                                        . Linker::link( $title )
                                        . ' (' . Linker::link( $title->getTalkPage(), $talk )
                                        . ")</li>\n";
                        }
                }
+
                $output .= "</ul>\n";
        }
 
@@ -247,6 +258,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        private function getWatchlist() {
                $list = array();
                $dbr = wfGetDB( DB_MASTER );
+
                $res = $dbr->select(
                        'watchlist',
                        array(
@@ -256,10 +268,12 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        ),
                        __METHOD__
                );
-               if( $res->numRows() > 0 ) {
+
+               if ( $res->numRows() > 0 ) {
                        $titles = array();
                        foreach ( $res as $row ) {
                                $title = Title::makeTitleSafe( $row->wl_namespace, $row->wl_title );
+
                                if ( $this->checkTitle( $title, $row->wl_namespace, $row->wl_title )
                                        && !$title->isTalkPage()
                                ) {
@@ -270,11 +284,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                        GenderCache::singleton()->doTitlesArray( $titles );
 
-                       foreach( $titles as $title ) {
+                       foreach ( $titles as $title ) {
                                $list[] = $title->getPrefixedText();
                        }
                }
+
                $this->cleanupWatchlist();
+
                return $list;
        }
 
@@ -297,6 +313,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                );
 
                $lb = new LinkBatch();
+
                foreach ( $res as $row ) {
                        $lb->add( $row->wl_namespace, $row->wl_title );
                        if ( !MWNamespace::isTalk( $row->wl_namespace ) ) {
@@ -305,6 +322,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                }
 
                $lb->execute();
+
                return $titles;
        }
 
@@ -324,12 +342,14 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                ) {
                        $title = false; // unrecoverable
                }
+
                if ( !$title
                        || $title->getNamespace() != $namespace
                        || $title->getDBkey() != $dbKey
                ) {
                        $this->badItems[] = array( $title, $namespace, $dbKey );
                }
+
                return (bool)$title;
        }
 
@@ -337,16 +357,17 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * Attempts to clean up broken items
         */
        private function cleanupWatchlist() {
-               if( !count( $this->badItems ) ) {
+               if ( !count( $this->badItems ) ) {
                        return; //nothing to do
                }
+
                $dbw = wfGetDB( DB_MASTER );
                $user = $this->getUser();
+
                foreach ( $this->badItems as $row ) {
                        list( $title, $namespace, $dbKey ) = $row;
-                       wfDebug( "User {$user->getName()} has broken watchlist item ns($namespace):$dbKey, "
-                               . ( $title ? 'cleaning up' : 'deleting' ) . ".\n"
-                       );
+                       $action = $title ? 'cleaning up' : 'deleting';
+                       wfDebug( "User {$user->getName()} has broken watchlist item ns($namespace):$dbKey, $action.\n" );
 
                        $dbw->delete( 'watchlist',
                                array(
@@ -387,11 +408,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        private function watchTitles( $titles ) {
                $dbw = wfGetDB( DB_MASTER );
                $rows = array();
-               foreach( $titles as $title ) {
-                       if( !$title instanceof Title ) {
+
+               foreach ( $titles as $title ) {
+                       if ( !$title instanceof Title ) {
                                $title = Title::newFromText( $title );
                        }
-                       if( $title instanceof Title ) {
+
+                       if ( $title instanceof Title ) {
                                $rows[] = array(
                                        'wl_user' => $this->getUser()->getId(),
                                        'wl_namespace' => MWNamespace::getSubject( $title->getNamespace() ),
@@ -406,6 +429,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                );
                        }
                }
+
                $dbw->insert( 'watchlist', $rows, __METHOD__, 'IGNORE' );
        }
 
@@ -419,11 +443,13 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         */
        private function unwatchTitles( $titles ) {
                $dbw = wfGetDB( DB_MASTER );
-               foreach( $titles as $title ) {
-                       if( !$title instanceof Title ) {
+
+               foreach ( $titles as $title ) {
+                       if ( !$title instanceof Title ) {
                                $title = Title::newFromText( $title );
                        }
-                       if( $title instanceof Title ) {
+
+                       if ( $title instanceof Title ) {
                                $dbw->delete(
                                        'watchlist',
                                        array(
@@ -433,6 +459,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                        ),
                                        __METHOD__
                                );
+
                                $dbw->delete(
                                        'watchlist',
                                        array(
@@ -442,6 +469,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                        ),
                                        __METHOD__
                                );
+
                                $page = WikiPage::factory( $title );
                                wfRunHooks( 'UnwatchArticleComplete', array( $this->getUser(), &$page ) );
                        }
@@ -451,15 +479,16 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        public function submitNormal( $data ) {
                $removed = array();
 
-               foreach( $data as $titles ) {
+               foreach ( $data as $titles ) {
                        $this->unwatchTitles( $titles );
                        $removed = array_merge( $removed, $titles );
                }
 
-               if( count( $removed ) > 0 ) {
+               if ( count( $removed ) > 0 ) {
                        $this->successMessage = $this->msg( 'watchlistedit-normal-done'
-                               )->numParams( count( $removed ) )->parse();
+                       )->numParams( count( $removed ) )->parse();
                        $this->showTitles( $removed, $this->successMessage );
+
                        return true;
                } else {
                        return false;
@@ -477,7 +506,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $fields = array();
                $count = 0;
 
-               foreach( $this->getWatchlistInfo() as $namespace => $pages ) {
+               foreach ( $this->getWatchlistInfo() as $namespace => $pages ) {
                        if ( $namespace >= 0 ) {
                                $fields['TitlesNs' . $namespace] = array(
                                        'class' => 'EditWatchlistCheckboxSeriesField',
@@ -486,8 +515,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                );
                        }
 
-                       foreach( array_keys( $pages ) as $dbkey ) {
+                       foreach ( array_keys( $pages ) as $dbkey ) {
                                $title = Title::makeTitleSafe( $namespace, $dbkey );
+
                                if ( $this->checkTitle( $title, $namespace, $dbkey ) ) {
                                        $text = $this->buildRemoveLine( $title );
                                        $fields['TitlesNs' . $namespace]['options'][$text] = $title->getPrefixedText();
@@ -500,17 +530,18 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                if ( count( $fields ) > 1 && $count > 30 ) {
                        $this->toc = Linker::tocIndent();
                        $tocLength = 0;
-                       foreach( $fields as $data ) {
 
+                       foreach ( $fields as $data ) {
                                # strip out the 'ns' prefix from the section name:
                                $ns = substr( $data['section'], 2 );
 
-                               $nsText = ($ns == NS_MAIN)
+                               $nsText = ( $ns == NS_MAIN )
                                        ? $this->msg( 'blanknamespace' )->escaped()
                                        : htmlspecialchars( $wgContLang->getFormattedNsText( $ns ) );
                                $this->toc .= Linker::tocLine( "editwatchlist-{$data['section']}", $nsText,
                                        $this->getLanguage()->formatNum( ++$tocLength ), 1 ) . Linker::tocLineEnd();
                        }
+
                        $this->toc = Linker::tocList( $this->toc );
                } else {
                        $this->toc = false;
@@ -524,6 +555,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $form->setWrapperLegendMsg( 'watchlistedit-normal-legend' );
                $form->addHeaderText( $this->msg( 'watchlistedit-normal-explain' )->parse() );
                $form->setSubmitCallback( array( $this, 'submitNormal' ) );
+
                return $form;
        }
 
@@ -535,12 +567,15 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         */
        private function buildRemoveLine( $title ) {
                $link = Linker::link( $title );
-               if( $title->isRedirect() ) {
+
+               if ( $title->isRedirect() ) {
                        // Linker already makes class mw-redirect, so this is redundant
                        $link = '<span class="watchlistredir">' . $link . '</span>';
                }
+
                $tools[] = Linker::link( $title->getTalkPage(), $this->msg( 'talkpagelinktext' )->escaped() );
-               if( $title->exists() ) {
+
+               if ( $title->exists() ) {
                        $tools[] = Linker::linkKnown(
                                $title,
                                $this->msg( 'history_short' )->escaped(),
@@ -548,7 +583,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                array( 'action' => 'history' )
                        );
                }
-               if( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
+
+               if ( $title->getNamespace() == NS_USER && !$title->isSubpage() ) {
                        $tools[] = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Contributions', $title->getText() ),
                                $this->msg( 'contributions' )->escaped()
@@ -582,6 +618,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $form->setWrapperLegendMsg( 'watchlistedit-raw-legend' );
                $form->addHeaderText( $this->msg( 'watchlistedit-raw-explain' )->parse() );
                $form->setSubmitCallback( array( $this, 'submitRaw' ) );
+
                return $form;
        }
 
@@ -595,19 +632,17 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         */
        public static function getMode( $request, $par ) {
                $mode = strtolower( $request->getVal( 'action', $par ) );
-               switch( $mode ) {
+
+               switch ( $mode ) {
                        case 'clear':
                        case self::EDIT_CLEAR:
                                return self::EDIT_CLEAR;
-
                        case 'raw':
                        case self::EDIT_RAW:
                                return self::EDIT_RAW;
-
                        case 'edit':
                        case self::EDIT_NORMAL:
                                return self::EDIT_NORMAL;
-
                        default:
                                return false;
                }
@@ -629,21 +664,26 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        'edit' => array( 'EditWatchlist', false ),
                        'raw' => array( 'EditWatchlist', 'raw' ),
                );
-               foreach( $modes as $mode => $arr ) {
+
+               foreach ( $modes as $mode => $arr ) {
                        // can use messages 'watchlisttools-view', 'watchlisttools-edit', 'watchlisttools-raw'
                        $tools[] = Linker::linkKnown(
                                SpecialPage::getTitleFor( $arr[0], $arr[1] ),
                                wfMessage( "watchlisttools-{$mode}" )->escaped()
                        );
                }
-               return Html::rawElement( 'span',
-                                       array( 'class' => 'mw-watchlist-toollinks' ),
-                                       wfMessage( 'parentheses', $wgLang->pipeList( $tools ) )->text() );
+
+               return Html::rawElement(
+                       'span',
+                       array( 'class' => 'mw-watchlist-toollinks' ),
+                       wfMessage( 'parentheses', $wgLang->pipeList( $tools ) )->text()
+               );
        }
 }
 
 # B/C since 1.18
-class WatchlistEditor extends SpecialEditWatchlist {}
+class WatchlistEditor extends SpecialEditWatchlist {
+}
 
 /**
  * Extend HTMLForm purely so we can have a more sane way of getting the section headers
@@ -651,10 +691,12 @@ class WatchlistEditor extends SpecialEditWatchlist {}
 class EditWatchlistNormalHTMLForm extends HTMLForm {
        public function getLegend( $namespace ) {
                $namespace = substr( $namespace, 2 );
+
                return $namespace == NS_MAIN
                        ? $this->msg( 'blanknamespace' )->escaped()
                        : htmlspecialchars( $this->getContext()->getLanguage()->getFormattedNsText( $namespace ) );
        }
+
        public function getBody() {
                return $this->displaySection( $this->mFieldTree, '', 'editwatchlist-' );
        }
index b5ad589..d037d55 100644 (file)
 class SpecialEmailUser extends UnlistedSpecialPage {
        protected $mTarget;
 
+       /**
+        * @var User|string $mTargetObj
+        */
+       protected $mTargetObj;
+
        public function __construct() {
                parent::__construct( 'Emailuser' );
        }
 
        public function getDescription() {
                $target = self::getTarget( $this->mTarget );
-               if( !$target instanceof User ) {
+               if ( !$target instanceof User ) {
                        return $this->msg( 'emailuser-title-notarget' )->text();
                }
 
@@ -106,7 +111,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $this->outputHeader();
 
                // error out if sending user cannot do this
-               $error = self::getPermissionsError( $this->getUser(), $this->getRequest()->getVal( 'wpEditToken' ) );
+               $error = self::getPermissionsError(
+                       $this->getUser(),
+                       $this->getRequest()->getVal( 'wpEditToken' )
+               );
+
                switch ( $error ) {
                        case null:
                                # Wahey!
@@ -119,20 +128,21 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                                throw new ThrottledError;
                        case 'mailnologin':
                        case 'usermaildisabled':
-                               throw new  ErrorPageError( $error, "{$error}text" );
+                               throw new ErrorPageError( $error, "{$error}text" );
                        default:
                                # It's a hook error
                                list( $title, $msg, $params ) = $error;
-                               throw new  ErrorPageError( $title, $msg, $params );
+                               throw new ErrorPageError( $title, $msg, $params );
                }
                // Got a valid target user name? Else ask for one.
                $ret = self::getTarget( $this->mTarget );
-               if( !$ret instanceof User ) {
-                       if( $this->mTarget != '' ) {
+               if ( !$ret instanceof User ) {
+                       if ( $this->mTarget != '' ) {
                                $ret = ( $ret == 'notarget' ) ? 'emailnotarget' : ( $ret . 'text' );
                                $out->wrapWikiMsg( "<p class='error'>$1</p>", $ret );
                        }
                        $out->addHTML( $this->userForm( $this->mTarget ) );
+
                        return false;
                }
 
@@ -147,13 +157,13 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $form->setWrapperLegendMsg( 'email-legend' );
                $form->loadData();
 
-               if( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
+               if ( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
                        return false;
                }
 
                $result = $form->show();
 
-               if( $result === true || ( $result instanceof Status && $result->isGood() ) ) {
+               if ( $result === true || ( $result instanceof Status && $result->isGood() ) ) {
                        $out->setPageTitle( $this->msg( 'emailsent' ) );
                        $out->addWikiMsg( 'emailsenttext' );
                        $out->returnToMain( false, $this->mTargetObj->getUserPage() );
@@ -169,18 +179,22 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        public static function getTarget( $target ) {
                if ( $target == '' ) {
                        wfDebug( "Target is empty.\n" );
+
                        return 'notarget';
                }
 
                $nu = User::newFromName( $target );
-               if( !$nu instanceof User || !$nu->getId() ) {
+               if ( !$nu instanceof User || !$nu->getId() ) {
                        wfDebug( "Target is invalid user.\n" );
+
                        return 'notarget';
                } elseif ( !$nu->isEmailConfirmed() ) {
                        wfDebug( "User has no valid email.\n" );
+
                        return 'noemail';
                } elseif ( !$nu->canReceiveEmail() ) {
                        wfDebug( "User does not allow user emails.\n" );
+
                        return 'nowikiemail';
                }
 
@@ -196,31 +210,36 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         */
        public static function getPermissionsError( $user, $editToken ) {
                global $wgEnableEmail, $wgEnableUserEmail;
-               if( !$wgEnableEmail || !$wgEnableUserEmail ) {
+
+               if ( !$wgEnableEmail || !$wgEnableUserEmail ) {
                        return 'usermaildisabled';
                }
 
-               if( !$user->isAllowed( 'sendemail' ) ) {
+               if ( !$user->isAllowed( 'sendemail' ) ) {
                        return 'badaccess';
                }
 
-               if( !$user->isEmailConfirmed() ) {
+               if ( !$user->isEmailConfirmed() ) {
                        return 'mailnologin';
                }
 
-               if( $user->isBlockedFromEmailuser() ) {
+               if ( $user->isBlockedFromEmailuser() ) {
                        wfDebug( "User is blocked from sending e-mail.\n" );
+
                        return "blockedemailuser";
                }
 
-               if( $user->pingLimiter( 'emailuser' ) ) {
+               if ( $user->pingLimiter( 'emailuser' ) ) {
                        wfDebug( "Ping limiter triggered.\n" );
+
                        return 'actionthrottledtext';
                }
 
                $hookErr = false;
+
                wfRunHooks( 'UserCanSendEmail', array( &$user, &$hookErr ) );
                wfRunHooks( 'EmailUserPermissionsErrors', array( $user, $editToken, &$hookErr ) );
+
                if ( $hookErr ) {
                        return $hookErr;
                }
@@ -236,14 +255,25 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         */
        protected function userForm( $name ) {
                global $wgScript;
-               $string = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' ) ) .
+               $string = Xml::openElement(
+                       'form',
+                       array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' )
+               ) .
                        Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
                        Xml::openElement( 'fieldset' ) .
                        Html::rawElement( 'legend', null, $this->msg( 'emailtarget' )->parse() ) .
-                       Xml::inputLabel( $this->msg( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
+                       Xml::inputLabel(
+                               $this->msg( 'emailusername' )->text(),
+                               'target',
+                               'emailusertarget',
+                               30,
+                               $name
+                       ) .
+                       ' ' .
                        Xml::submitButton( $this->msg( 'emailusernamesubmit' )->text() ) .
                        Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' ) . "\n";
+
                return $string;
        }
 
@@ -264,6 +294,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * getPermissionsError(). It is probably also a good
         * idea to check the edit token and ping limiter in advance.
         *
+        * @param array $data
+        * @param IContextSource $context
         * @return Mixed: Status object, or potentially a String on error
         * or maybe even true on success if anything uses the EmailUser hook.
         */
@@ -271,9 +303,10 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                global $wgUserEmailUseReplyTo;
 
                $target = self::getTarget( $data['Target'] );
-               if( !$target instanceof User ) {
+               if ( !$target instanceof User ) {
                        return $context->msg( $target . 'text' )->parseAsBlock();
                }
+
                $to = new MailAddress( $target );
                $from = new MailAddress( $context->getUser() );
                $subject = $data['Subject'];
@@ -285,11 +318,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        $from->name, $to->name )->inContentLanguage()->text();
 
                $error = '';
-               if( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
+               if ( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
                        return $error;
                }
 
-               if( $wgUserEmailUseReplyTo ) {
+               if ( $wgUserEmailUseReplyTo ) {
                        // Put the generic wiki autogenerated address in the From:
                        // header and reserve the user for Reply-To.
                        //
@@ -297,6 +330,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        // wiki-borne mails from direct mails and protects against
                        // SPF and bounce problems with some mailers (see below).
                        global $wgPasswordSender, $wgPasswordSenderName;
+
                        $mailFrom = new MailAddress( $wgPasswordSender, $wgPasswordSenderName );
                        $replyTo = $from;
                } else {
@@ -319,7 +353,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
 
                $status = UserMailer::send( $to, $mailFrom, $subject, $text, $replyTo );
 
-               if( !$status->isGood() ) {
+               if ( !$status->isGood() ) {
                        return $status;
                } else {
                        // if the user requested a copy of this mail, do this now,
@@ -334,6 +368,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        }
 
                        wfRunHooks( 'EmailUserComplete', array( $to, $from, $subject, $text ) );
+
                        return $status;
                }
        }
index 7abfefe..61ed34d 100644 (file)
@@ -29,7 +29,6 @@
  * @ingroup SpecialPage
  */
 class SpecialExport extends SpecialPage {
-
        private $curonly, $doExport, $pageLinkDepth, $templates;
        private $images;
 
@@ -75,8 +74,7 @@ class SpecialExport extends SpecialPage {
                                        }
                                }
                        }
-               }
-               elseif( $request->getCheck( 'addns' ) && $wgExportFromNamespaces ) {
+               } elseif ( $request->getCheck( 'addns' ) && $wgExportFromNamespaces ) {
                        $page = $request->getText( 'pages' );
                        $nsindex = $request->getText( 'nsindex', '' );
 
@@ -89,8 +87,7 @@ class SpecialExport extends SpecialPage {
                                        $page .= "\n" . implode( "\n", $nspages );
                                }
                        }
-               }
-               elseif( $request->getCheck( 'exportall' ) && $wgExportAllowAll ) {
+               } elseif ( $request->getCheck( 'exportall' ) && $wgExportAllowAll ) {
                        $this->doExport = true;
                        $exportall = true;
 
@@ -100,13 +97,12 @@ class SpecialExport extends SpecialPage {
                        doExport(...) further down) */
                        $page = '';
                        $history = '';
-               }
-               elseif( $request->wasPosted() && $par == '' ) {
+               } elseif ( $request->wasPosted() && $par == '' ) {
                        $page = $request->getText( 'pages' );
                        $this->curonly = $request->getCheck( 'curonly' );
                        $rawOffset = $request->getVal( 'offset' );
 
-                       if( $rawOffset ) {
+                       if ( $rawOffset ) {
                                $offset = wfTimestamp( TS_MW, $rawOffset );
                        } else {
                                $offset = null;
@@ -127,15 +123,17 @@ class SpecialExport extends SpecialPage {
                                if ( $limit > 0 && ( $wgExportMaxHistory == 0 || $limit < $wgExportMaxHistory ) ) {
                                        $history['limit'] = $limit;
                                }
+
                                if ( !is_null( $offset ) ) {
                                        $history['offset'] = $offset;
                                }
+
                                if ( strtolower( $dir ) == 'desc' ) {
                                        $history['dir'] = 'desc';
                                }
                        }
 
-                       if( $page != '' ) {
+                       if ( $page != '' ) {
                                $this->doExport = true;
                        }
                } else {
@@ -143,18 +141,18 @@ class SpecialExport extends SpecialPage {
                        $page = $request->getText( 'pages', $par );
                        $historyCheck = $request->getCheck( 'history' );
 
-                       if( $historyCheck ) {
+                       if ( $historyCheck ) {
                                $history = WikiExporter::FULL;
                        } else {
                                $history = WikiExporter::CURRENT;
                        }
 
-                       if( $page != '' ) {
+                       if ( $page != '' ) {
                                $this->doExport = true;
                        }
                }
 
-               if( !$wgExportAllowHistory ) {
+               if ( !$wgExportAllowHistory ) {
                        // Override
                        $history = WikiExporter::CURRENT;
                }
@@ -172,7 +170,7 @@ class SpecialExport extends SpecialPage {
                        wfResetOutputBuffers();
                        $request->response()->header( "Content-type: application/xml; charset=utf-8" );
 
-                       if( $request->getCheck( 'wpDownload' ) ) {
+                       if ( $request->getCheck( 'wpDownload' ) ) {
                                // Provide a sane filename suggestion
                                $filename = urlencode( $wgSitename . '-' . wfTimestampNow() . '.xml' );
                                $request->response()->header( "Content-disposition: attachment;filename={$filename}" );
@@ -187,9 +185,17 @@ class SpecialExport extends SpecialPage {
                $out->addWikiMsg( 'exporttext' );
 
                $form = Xml::openElement( 'form', array( 'method' => 'post',
-                       'action' => $this->getTitle()->getLocalUrl( 'action=submit' ) ) );
-               $form .= Xml::inputLabel( $this->msg( 'export-addcattext' )->text(), 'catname', 'catname', 40 ) . '&#160;';
-               $form .= Xml::submitButton( $this->msg( 'export-addcat' )->text(), array( 'name' => 'addcat' ) ) . '<br />';
+                       'action' => $this->getTitle()->getLocalURL( 'action=submit' ) ) );
+               $form .= Xml::inputLabel(
+                       $this->msg( 'export-addcattext' )->text(),
+                       'catname',
+                       'catname',
+                       40
+               ) . '&#160;';
+               $form .= Xml::submitButton(
+                       $this->msg( 'export-addcat' )->text(),
+                       array( 'name' => 'addcat' )
+               ) . '<br />';
 
                if ( $wgExportFromNamespaces ) {
                        $form .= Html::namespaceSelector(
@@ -197,12 +203,15 @@ class SpecialExport extends SpecialPage {
                                        'selected' => $nsindex,
                                        'label' => $this->msg( 'export-addnstext' )->text()
                                ), array(
-                                       'name'  => 'nsindex',
-                                       'id'    => 'namespace',
+                                       'name' => 'nsindex',
+                                       'id' => 'namespace',
                                        'class' => 'namespaceselector',
                                )
                        ) . '&#160;';
-                       $form .= Xml::submitButton( $this->msg( 'export-addns' )->text(), array( 'name' => 'addns' ) ) . '<br />';
+                       $form .= Xml::submitButton(
+                               $this->msg( 'export-addns' )->text(),
+                               array( 'name' => 'addns' )
+                       ) . '<br />';
                }
 
                if ( $wgExportAllowAll ) {
@@ -214,10 +223,15 @@ class SpecialExport extends SpecialPage {
                        ) . '<br />';
                }
 
-               $form .= Xml::element( 'textarea', array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ), $page, false );
+               $form .= Xml::element(
+                       'textarea',
+                       array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ),
+                       $page,
+                       false
+               );
                $form .= '<br />';
 
-               if( $wgExportAllowHistory ) {
+               if ( $wgExportAllowHistory ) {
                        $form .= Xml::checkLabel(
                                $this->msg( 'exportcuronly' )->text(),
                                'curonly',
@@ -235,9 +249,16 @@ class SpecialExport extends SpecialPage {
                        $request->wasPosted() ? $request->getCheck( 'templates' ) : false
                ) . '<br />';
 
-               if( $wgExportMaxLinkDepth || $this->userCanOverrideExportDepth() ) {
-                       $form .= Xml::inputLabel( $this->msg( 'export-pagelinks' )->text(), 'pagelink-depth', 'pagelink-depth', 20, 0 ) . '<br />';
+               if ( $wgExportMaxLinkDepth || $this->userCanOverrideExportDepth() ) {
+                       $form .= Xml::inputLabel(
+                               $this->msg( 'export-pagelinks' )->text(),
+                               'pagelink-depth',
+                               'pagelink-depth',
+                               20,
+                               0
+                       ) . '<br />';
                }
+
                // Enable this when we can do something useful exporting/importing image information. :)
                //$form .= Xml::checkLabel( $this->msg( 'export-images' )->text(), 'images', 'wpExportImages', false ) . '<br />';
                $form .= Xml::checkLabel(
@@ -256,7 +277,10 @@ class SpecialExport extends SpecialPage {
                        ) . '<br />';
                }
 
-               $form .= Xml::submitButton( $this->msg( 'export-submit' )->text(), Linker::tooltipAndAccesskeyAttribs( 'export' ) );
+               $form .= Xml::submitButton(
+                       $this->msg( 'export-submit' )->text(),
+                       Linker::tooltipAndAccesskeyAttribs( 'export' )
+               );
                $form .= Xml::closeElement( 'form' );
 
                $out->addHTML( $form );
@@ -288,10 +312,10 @@ class SpecialExport extends SpecialPage {
                        $pageSet = array(); // Inverted index of all pages to look up
 
                        // Split up and normalize input
-                       foreach( explode( "\n", $page ) as $pageName ) {
+                       foreach ( explode( "\n", $page ) as $pageName ) {
                                $pageName = trim( $pageName );
                                $title = Title::newFromText( $pageName );
-                               if( $title && $title->getInterwiki() == '' && $title->getText() !== '' ) {
+                               if ( $title && $title->getInterwiki() == '' && $title->getText() !== '' ) {
                                        // Only record each page once!
                                        $pageSet[$title->getPrefixedText()] = true;
                                }
@@ -301,25 +325,23 @@ class SpecialExport extends SpecialPage {
                        $inputPages = array_keys( $pageSet );
 
                        // Look up any linked pages if asked...
-                       if( $this->templates ) {
+                       if ( $this->templates ) {
                                $pageSet = $this->getTemplates( $inputPages, $pageSet );
                        }
                        $linkDepth = $this->pageLinkDepth;
-                       if( $linkDepth ) {
+                       if ( $linkDepth ) {
                                $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 );
-                        }
-                       */
+                       // 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
-                       foreach( $pages as $k => $v ) {
+                       foreach ( $pages as $k => $v ) {
                                $pages[$k] = str_replace( " ", "_", $v );
                        }
 
@@ -327,7 +349,7 @@ class SpecialExport extends SpecialPage {
                }
 
                /* Ok, let's get to it... */
-               if( $history == WikiExporter::CURRENT ) {
+               if ( $history == WikiExporter::CURRENT ) {
                        $lb = false;
                        $db = wfGetDB( DB_SLAVE );
                        $buffer = WikiExporter::BUFFER;
@@ -350,26 +372,17 @@ class SpecialExport extends SpecialPage {
                if ( $exportall ) {
                        $exporter->allPages();
                } else {
-                       foreach( $pages as $page ) {
-                       /*
-                        if( $wgExportMaxHistory && !$this->curonly ) {
-                        $title = Title::newFromText( $page );
-                        if( $title ) {
-                        $count = Revision::countByTitle( $db, $title );
-                        if( $count > $wgExportMaxHistory ) {
-                        wfDebug( __FUNCTION__ .
-                        ": Skipped $page, $count revisions too big\n" );
-                        continue;
-                        }
-                        }
-                        }*/
-                       #Bug 8824: Only export pages the user can read
+                       foreach ( $pages as $page ) {
+                               #Bug 8824: Only export pages the user can read
                                $title = Title::newFromText( $page );
-                               if( is_null( $title ) ) {
-                                       continue; #TODO: perhaps output an <error> tag or something.
+                               if ( is_null( $title ) ) {
+                                       // @todo Perhaps output an <error> tag or something.
+                                       continue;
                                }
-                               if( !$title->userCan( 'read', $this->getUser() ) ) {
-                                       continue; #TODO: perhaps output an <error> tag or something.
+
+                               if ( !$title->userCan( 'read', $this->getUser() ) ) {
+                                       // @todo Perhaps output an <error> tag or something.
+                                       continue;
                                }
 
                                $exporter->pageByTitle( $title );
@@ -378,7 +391,7 @@ class SpecialExport extends SpecialPage {
 
                $exporter->closeStream();
 
-               if( $lb ) {
+               if ( $lb ) {
                        $lb->closeAll();
                }
        }
@@ -412,6 +425,7 @@ class SpecialExport extends SpecialPage {
 
                        $pages[] = $n;
                }
+
                return $pages;
        }
 
@@ -443,6 +457,7 @@ class SpecialExport extends SpecialPage {
 
                        $pages[] = $n;
                }
+
                return $pages;
        }
 
@@ -468,12 +483,12 @@ class SpecialExport extends SpecialPage {
        private function validateLinkDepth( $depth ) {
                global $wgExportMaxLinkDepth;
 
-               if( $depth < 0 ) {
+               if ( $depth < 0 ) {
                        return 0;
                }
 
                if ( !$this->userCanOverrideExportDepth() ) {
-                       if( $depth > $wgExportMaxLinkDepth ) {
+                       if ( $depth > $wgExportMaxLinkDepth ) {
                                return $wgExportMaxLinkDepth;
                        }
                }
@@ -483,6 +498,7 @@ class SpecialExport extends SpecialPage {
                 * crazy-big export from being done by someone setting the depth
                 * number too high. In other words, last resort safety net.
                 */
+
                return intval( min( $depth, 5 ) );
        }
 
@@ -494,7 +510,7 @@ class SpecialExport extends SpecialPage {
         * @return array
         */
        private function getPageLinks( $inputPages, $pageSet, $depth ) {
-               for( ; $depth > 0; --$depth ) {
+               for ( ; $depth > 0; --$depth ) {
                        $pageSet = $this->getLinks(
                                $inputPages, $pageSet, 'pagelinks',
                                array( 'namespace' => 'pl_namespace', 'title' => 'pl_title' ),
@@ -526,15 +542,20 @@ class SpecialExport extends SpecialPage {
 
        /**
         * Expand a list of pages to include items used in those pages.
+        * @param array $inputPages Array of page titles
+        * @param array $pageSet
+        * @param string $table
+        * @param array $fields Array of field names
+        * @param array $join
         * @return array
         */
        private function getLinks( $inputPages, $pageSet, $table, $fields, $join ) {
                $dbr = wfGetDB( DB_SLAVE );
 
-               foreach( $inputPages as $page ) {
+               foreach ( $inputPages as $page ) {
                        $title = Title::newFromText( $page );
 
-                       if( $title ) {
+                       if ( $title ) {
                                $pageSet[$title->getPrefixedText()] = true;
                                /// @todo FIXME: May or may not be more efficient to batch these
                                ///        by namespace when given multiple input pages.
@@ -551,7 +572,7 @@ class SpecialExport extends SpecialPage {
                                        __METHOD__
                                );
 
-                               foreach( $result as $row ) {
+                               foreach ( $result as $row ) {
                                        $template = Title::makeTitle( $row->namespace, $row->title );
                                        $pageSet[$template->getPrefixedText()] = true;
                                }
index 5b7f353..47a4d75 100644 (file)
@@ -28,7 +28,6 @@
  * @author Martin Drashkov
  */
 class FewestrevisionsPage extends QueryPage {
-
        function __construct( $name = 'Fewestrevisions' ) {
                parent::__construct( $name );
        }
@@ -42,21 +41,26 @@ class FewestrevisionsPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'revision', 'page' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'COUNT(*)',
-                                       'redirect' => 'page_is_redirect' ),
-                       'conds' => array ( 'page_namespace' => MWNamespace::getContentNamespaces(),
-                                       'page_id = rev_page' ),
-                       'options' => array ( 'HAVING' => 'COUNT(*) > 1',
-                       // ^^^ This was probably here to weed out redirects.
-                       // Since we mark them as such now, it might be
-                       // useful to remove this. People _do_ create pages
-                       // and never revise them, they aren't necessarily
-                       // redirects.
-                       'GROUP BY' => array( 'page_namespace', 'page_title', 'page_is_redirect' ) )
+               return array(
+                       'tables' => array( 'revision', 'page' ),
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'COUNT(*)',
+                               'redirect' => 'page_is_redirect'
+                       ),
+                       'conds' => array(
+                               'page_namespace' => MWNamespace::getContentNamespaces(),
+                               'page_id = rev_page' ),
+                       'options' => array(
+                               'HAVING' => 'COUNT(*) > 1',
+                               // ^^^ This was probably here to weed out redirects.
+                               // Since we mark them as such now, it might be
+                               // useful to remove this. People _do_ create pages
+                               // and never revise them, they aren't necessarily
+                               // redirects.
+                               'GROUP BY' => array( 'page_namespace', 'page_title', 'page_is_redirect' )
+                       )
                );
        }
 
@@ -65,17 +69,24 @@ class FewestrevisionsPage extends QueryPage {
        }
 
        /**
-        * @param $skin Skin object
-        * @param $result Object: database row
+        * @param Skin $skin
+        * @param object $result Database row
         * @return String
         */
        function formatResult( $skin, $result ) {
                global $wgContLang;
 
                $nt = Title::makeTitleSafe( $result->namespace, $result->title );
-               if( !$nt ) {
-                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+               if ( !$nt ) {
+                       return Html::element(
+                               'span',
+                               array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription(
+                                       $this->getContext(),
+                                       $result->namespace,
+                                       $result->title
+                               )
+                       );
                }
 
                $text = htmlspecialchars( $wgContLang->convert( $nt->getPrefixedText() ) );
index 3fe64e6..4c6593b 100644 (file)
@@ -59,7 +59,7 @@ class FileDuplicateSearchPage extends QueryPage {
        /**
         * Fetch dupes from all connected file repositories.
         *
-        * @return Array of File objects
+        * @return array of File objects
         */
        function getDupes() {
                return RepoGroup::singleton()->findBySha1( $this->hash );
@@ -101,11 +101,11 @@ class FileDuplicateSearchPage extends QueryPage {
                $this->setHeaders();
                $this->outputHeader();
 
-               $this->filename = isset( $par ) ?  $par : $this->getRequest()->getText( 'filename' );
+               $this->filename = isset( $par ) ? $par : $this->getRequest()->getText( 'filename' );
                $this->file = null;
                $this->hash = '';
                $title = Title::newFromText( $this->filename, NS_FILE );
-               if( $title && $title->getText() != '' ) {
+               if ( $title && $title->getText() != '' ) {
                        $this->file = wfFindFile( $title );
                }
 
@@ -113,37 +113,46 @@ class FileDuplicateSearchPage extends QueryPage {
 
                # Create the input form
                $out->addHTML(
-                       Xml::openElement( 'form', array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript ) ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                       Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) .
-                       Xml::inputLabel( $this->msg( 'fileduplicatesearch-filename' )->text(), 'filename', 'filename', 50, $this->filename ) . ' ' .
-                       Xml::submitButton( $this->msg( 'fileduplicatesearch-submit' )->text() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' )
+                       Html::openElement(
+                               'form',
+                               array( 'id' => 'fileduplicatesearch', 'method' => 'get', 'action' => $wgScript )
+                       ) . "\n" .
+                               Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
+                               Html::openElement( 'fieldset' ) . "\n" .
+                               Html::element( 'legend', null, $this->msg( 'fileduplicatesearch-legend' )->text() ) . "\n" .
+                               Xml::inputLabel(
+                                       $this->msg( 'fileduplicatesearch-filename' )->text(),
+                                       'filename',
+                                       'filename',
+                                       50,
+                                       $this->filename
+                               ) . "\n" .
+                               Xml::submitButton( $this->msg( 'fileduplicatesearch-submit' )->text() ) . "\n" .
+                               Html::closeElement( 'fieldset' ) . "\n" .
+                               Html::closeElement( 'form' )
                );
 
-               if( $this->file ) {
+               if ( $this->file ) {
                        $this->hash = $this->file->getSha1();
-               } elseif( $this->filename !== '' ) {
+               } elseif ( $this->filename !== '' ) {
                        $out->wrapWikiMsg(
                                "<p class='mw-fileduplicatesearch-noresults'>\n$1\n</p>",
                                array( 'fileduplicatesearch-noresults', wfEscapeWikiText( $this->filename ) )
                        );
                }
 
-               if( $this->hash != '' ) {
+               if ( $this->hash != '' ) {
                        # Show a thumbnail of the file
                        $img = $this->file;
                        if ( $img ) {
                                $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
-                               if( $thumb ) {
+                               if ( $thumb ) {
                                        $out->addHTML( '<div id="mw-fileduplicatesearch-icon">' .
                                                $thumb->toHtml( array( 'desc-link' => false ) ) . '<br />' .
                                                $this->msg( 'fileduplicatesearch-info' )->numParams(
                                                        $img->getWidth(), $img->getHeight() )->params(
-                                                       $this->getLanguage()->formatSize( $img->getSize() ),
-                                                       $img->getMimeType() )->parseAsBlock() .
+                                                               $this->getLanguage()->formatSize( $img->getSize() ),
+                                                               $img->getMimeType() )->parseAsBlock() .
                                                '</div>' );
                                }
                        }
@@ -152,7 +161,7 @@ class FileDuplicateSearchPage extends QueryPage {
                        $numRows = count( $dupes );
 
                        # Show a short summary
-                       if( $numRows == 1 ) {
+                       if ( $numRows == 1 ) {
                                $out->wrapWikiMsg(
                                        "<p class='mw-fileduplicatesearch-result-1'>\n$1\n</p>",
                                        array( 'fileduplicatesearch-result-1', wfEscapeWikiText( $this->filename ) )
@@ -172,14 +181,16 @@ class FileDuplicateSearchPage extends QueryPage {
 
        function doBatchLookups( $list ) {
                $batch = new LinkBatch();
-               foreach( $list as $file ) {
+               /** @var File $file */
+               foreach ( $list as $file ) {
                        $batch->addObj( $file->getTitle() );
-                       if( $file->isLocal() ) {
+                       if ( $file->isLocal() ) {
                                $userName = $file->getUser( 'text' );
                                $batch->add( NS_USER, $userName );
                                $batch->add( NS_USER_TALK, $userName );
                        }
                }
+
                $batch->execute();
        }
 
index bbcced2..57e552b 100644 (file)
@@ -2,6 +2,7 @@
 /**
  * Implements Special:Filepath
  *
+ * @section LICENSE
  * 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
  *
  * @ingroup SpecialPage
  */
-class SpecialFilepath extends SpecialPage {
-
+class SpecialFilepath extends RedirectSpecialPage {
        function __construct() {
                parent::__construct( 'Filepath' );
+               $this->mAllowedRedirectParams = array( 'width', 'height' );
        }
 
-       function execute( $par ) {
-               $this->setHeaders();
-               $this->outputHeader();
-
-               $request = $this->getRequest();
-               $file = !is_null( $par ) ? $par : $request->getText( 'file' );
-
-               $title = Title::newFromText( $file, NS_FILE );
-
-               if ( ! $title instanceof Title || $title->getNamespace() != NS_FILE ) {
-                       $this->showForm( $title );
-               } else {
-                       $file = wfFindFile( $title );
-
-                       if ( $file && $file->exists() ) {
-                               // Default behavior: Use the direct link to the file.
-                               $url = $file->getURL();
-                               $width = $request->getInt( 'width', -1 );
-                               $height = $request->getInt( 'height', -1 );
-
-                               // If a width is requested...
-                               if ( $width != -1 ) {
-                                       $mto = $file->transform( array( 'width' => $width, 'height' => $height ) );
-                                       // ... and we can
-                                       if ( $mto && !$mto->isError() ) {
-                                               // ... change the URL to point to a thumbnail.
-                                               $url = $mto->getURL();
-                                       }
-                               }
-                               $this->getOutput()->redirect( $url );
-                       } else {
-                               $this->getOutput()->setStatusCode( 404 );
-                               $this->showForm( $title );
-                       }
-               }
-       }
-
-       /**
-        * @param $title Title
-        */
-       function showForm( $title ) {
-               global $wgScript;
-
-               $this->getOutput()->addHTML(
-                       Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'specialfilepath' ) ) .
-                       Html::openElement( 'fieldset' ) .
-                       Html::element( 'legend', null, $this->msg( 'filepath' )->text() ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-                       Xml::inputLabel( $this->msg( 'filepath-page' )->text(), 'file', 'file', 25, is_object( $title ) ? $title->getText() : '' ) . ' ' .
-                       Xml::submitButton( $this->msg( 'filepath-submit' )->text() ) . "\n" .
-                       Html::closeElement( 'fieldset' ) .
-                       Html::closeElement( 'form' )
-               );
+       // implement by redirecting through Special:Redirect/file
+       function getRedirect( $par ) {
+               return SpecialPage::getSafeTitleFor( 'Redirect', 'file/' . $par );
        }
 
        protected function getGroupName() {
index aa56041..0d54bb3 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialImport extends SpecialPage {
-
        private $interwiki = false;
        private $namespace;
        private $rootpage = '';
        private $frompage = '';
-       private $logcomment= false;
+       private $logcomment = false;
        private $history = true;
        private $includeTemplates = false;
        private $pageLinkDepth;
@@ -108,13 +107,13 @@ class SpecialImport extends SpecialPage {
                        $source = Status::newFatal( 'import-token-mismatch' );
                } elseif ( $sourceName == 'upload' ) {
                        $isUpload = true;
-                       if( $user->isAllowed( 'importupload' ) ) {
+                       if ( $user->isAllowed( 'importupload' ) ) {
                                $source = ImportStreamSource::newFromUpload( "xmlimport" );
                        } else {
                                throw new PermissionsError( 'importupload' );
                        }
                } elseif ( $sourceName == "interwiki" ) {
-                       if( !$user->isAllowed( 'import' ) ) {
+                       if ( !$user->isAllowed( 'import' ) ) {
                                throw new PermissionsError( 'import' );
                        }
                        $this->interwiki = $request->getVal( 'interwiki' );
@@ -136,24 +135,40 @@ class SpecialImport extends SpecialPage {
                }
 
                $out = $this->getOutput();
-               if( !$source->isGood() ) {
-                       $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $source->getWikiText() ) );
+               if ( !$source->isGood() ) {
+                       $out->wrapWikiMsg(
+                               "<p class=\"error\">\n$1\n</p>",
+                               array( 'importfailed', $source->getWikiText() )
+                       );
                } else {
                        $importer = new WikiImporter( $source->value );
-                       if( !is_null( $this->namespace ) ) {
+                       if ( !is_null( $this->namespace ) ) {
                                $importer->setTargetNamespace( $this->namespace );
                        }
-                       if( !is_null( $this->rootpage ) ) {
+                       if ( !is_null( $this->rootpage ) ) {
                                $statusRootPage = $importer->setTargetRootPage( $this->rootpage );
-                               if( !$statusRootPage->isGood() ) {
-                                       $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'import-options-wrong', $statusRootPage->getWikiText(), count( $statusRootPage->getErrorsArray() ) ) );
+                               if ( !$statusRootPage->isGood() ) {
+                                       $out->wrapWikiMsg(
+                                               "<p class=\"error\">\n$1\n</p>",
+                                               array(
+                                                       'import-options-wrong',
+                                                       $statusRootPage->getWikiText(),
+                                                       count( $statusRootPage->getErrorsArray() )
+                                               )
+                                       );
+
                                        return;
                                }
                        }
 
                        $out->addWikiMsg( "importstart" );
 
-                       $reporter = new ImportReporter( $importer, $isUpload, $this->interwiki, $this->logcomment );
+                       $reporter = new ImportReporter(
+                               $importer,
+                               $isUpload,
+                               $this->interwiki,
+                               $this->logcomment
+                       );
                        $reporter->setContext( $this->getContext() );
                        $exception = false;
 
@@ -167,10 +182,16 @@ class SpecialImport extends SpecialPage {
 
                        if ( $exception ) {
                                # No source or XML parse error
-                               $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $exception->getMessage() ) );
-                       } elseif( !$result->isGood() ) {
+                               $out->wrapWikiMsg(
+                                       "<p class=\"error\">\n$1\n</p>",
+                                       array( 'importfailed', $exception->getMessage() )
+                               );
+                       } elseif ( !$result->isGood() ) {
                                # Zero revisions
-                               $out->wrapWikiMsg( "<p class=\"error\">\n$1\n</p>", array( 'importfailed', $result->getWikiText() ) );
+                               $out->wrapWikiMsg(
+                                       "<p class=\"error\">\n$1\n</p>",
+                                       array( 'importfailed', $result->getWikiText() )
+                               );
                        } else {
                                # Success!
                                $out->addWikiMsg( 'importsuccess' );
@@ -182,162 +203,195 @@ class SpecialImport extends SpecialPage {
        private function showForm() {
                global $wgImportSources, $wgExportMaxLinkDepth;
 
-               $action = $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) );
+               $action = $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) );
                $user = $this->getUser();
                $out = $this->getOutput();
 
-               if( $user->isAllowed( 'importupload' ) ) {
+               if ( $user->isAllowed( 'importupload' ) ) {
                        $out->addHTML(
-                               Xml::fieldset( $this->msg( 'import-upload' )->text() ).
-                               Xml::openElement( 'form', array( 'enctype' => 'multipart/form-data', 'method' => 'post',
-                                       'action' => $action, 'id' => 'mw-import-upload-form' ) ) .
-                               $this->msg( 'importtext' )->parseAsBlock() .
-                               Html::hidden( 'action', 'submit' ) .
-                               Html::hidden( 'source', 'upload' ) .
-                               Xml::openElement( 'table', array( 'id' => 'mw-import-table-upload' ) ) .
-
-                               "<tr>
+                               Xml::fieldset( $this->msg( 'import-upload' )->text() ) .
+                                       Xml::openElement(
+                                               'form',
+                                               array(
+                                                       'enctype' => 'multipart/form-data',
+                                                       'method' => 'post',
+                                                       'action' => $action,
+                                                       'id' => 'mw-import-upload-form'
+                                               )
+                                       ) .
+                                       $this->msg( 'importtext' )->parseAsBlock() .
+                                       Html::hidden( 'action', 'submit' ) .
+                                       Html::hidden( 'source', 'upload' ) .
+                                       Xml::openElement( 'table', array( 'id' => 'mw-import-table-upload' ) ) .
+                                       "<tr>
                                        <td class='mw-label'>" .
-                                               Xml::label( $this->msg( 'import-upload-filename' )->text(), 'xmlimport' ) .
+                                       Xml::label( $this->msg( 'import-upload-filename' )->text(), 'xmlimport' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                               Html::input( 'xmlimport', '', 'file', array( 'id' => 'xmlimport' ) ) . ' ' .
+                                       Html::input( 'xmlimport', '', 'file', array( 'id' => 'xmlimport' ) ) . ' ' .
                                        "</td>
                                </tr>
                                <tr>
                                        <td class='mw-label'>" .
-                                               Xml::label( $this->msg( 'import-comment' )->text(), 'mw-import-comment' ) .
+                                       Xml::label( $this->msg( 'import-comment' )->text(), 'mw-import-comment' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                               Xml::input( 'log-comment', 50, '',
-                                                       array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
+                                       Xml::input( 'log-comment', 50, '',
+                                               array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
                                <tr>
                                        <td class='mw-label'>" .
-                                               Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
+                                       Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                               Xml::input( 'rootpage', 50, $this->rootpage,
-                                                       array( 'id' => 'mw-interwiki-rootpage-upload', 'type' => 'text' ) ) . ' ' .
+                                       Xml::input( 'rootpage', 50, $this->rootpage,
+                                               array( 'id' => 'mw-interwiki-rootpage-upload', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
                                <tr>
                                        <td></td>
                                        <td class='mw-submit'>" .
-                                               Xml::submitButton( $this->msg( 'uploadbtn' )->text() ) .
+                                       Xml::submitButton( $this->msg( 'uploadbtn' )->text() ) .
                                        "</td>
                                </tr>" .
-                               Xml::closeElement( 'table' ).
-                               Html::hidden( 'editToken', $user->getEditToken() ) .
-                               Xml::closeElement( 'form' ) .
-                               Xml::closeElement( 'fieldset' )
+                                       Xml::closeElement( 'table' ) .
+                                       Html::hidden( 'editToken', $user->getEditToken() ) .
+                                       Xml::closeElement( 'form' ) .
+                                       Xml::closeElement( 'fieldset' )
                        );
                } else {
-                       if( empty( $wgImportSources ) ) {
+                       if ( empty( $wgImportSources ) ) {
                                $out->addWikiMsg( 'importnosources' );
                        }
                }
 
-               if( $user->isAllowed( 'import' ) && !empty( $wgImportSources ) ) {
+               if ( $user->isAllowed( 'import' ) && !empty( $wgImportSources ) ) {
                        # Show input field for import depth only if $wgExportMaxLinkDepth > 0
                        $importDepth = '';
-                       if( $wgExportMaxLinkDepth > 0 ) {
+                       if ( $wgExportMaxLinkDepth > 0 ) {
                                $importDepth = "<tr>
                                                        <td class='mw-label'>" .
-                                                               $this->msg( 'export-pagelinks' )->parse() .
-                                                       "</td>
+                                       $this->msg( 'export-pagelinks' )->parse() .
+                                       "</td>
                                                        <td class='mw-input'>" .
-                                                               Xml::input( 'pagelink-depth', 3, 0 ) .
-                                                       "</td>
-                                               </tr>";
+                                       Xml::input( 'pagelink-depth', 3, 0 ) .
+                                       "</td>
+                               </tr>";
                        }
 
                        $out->addHTML(
                                Xml::fieldset( $this->msg( 'importinterwiki' )->text() ) .
-                               Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'mw-import-interwiki-form' ) ) .
-                               $this->msg( 'import-interwiki-text' )->parseAsBlock() .
-                               Html::hidden( 'action', 'submit' ) .
-                               Html::hidden( 'source', 'interwiki' ) .
-                               Html::hidden( 'editToken', $user->getEditToken() ) .
-                               Xml::openElement( 'table', array( 'id' => 'mw-import-table-interwiki' ) ) .
-                               "<tr>
+                                       Xml::openElement(
+                                               'form',
+                                               array(
+                                                       'method' => 'post',
+                                                       'action' => $action,
+                                                       'id' => 'mw-import-interwiki-form'
+                                               )
+                                       ) .
+                                       $this->msg( 'import-interwiki-text' )->parseAsBlock() .
+                                       Html::hidden( 'action', 'submit' ) .
+                                       Html::hidden( 'source', 'interwiki' ) .
+                                       Html::hidden( 'editToken', $user->getEditToken() ) .
+                                       Xml::openElement( 'table', array( 'id' => 'mw-import-table-interwiki' ) ) .
+                                       "<tr>
                                        <td class='mw-label'>" .
-                                               Xml::label( $this->msg( 'import-interwiki-source' )->text(), 'interwiki' ) .
+                                       Xml::label( $this->msg( 'import-interwiki-source' )->text(), 'interwiki' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                               Xml::openElement( 'select', array( 'name' => 'interwiki', 'id' => 'interwiki' ) )
+                                       Xml::openElement(
+                                               'select',
+                                               array( 'name' => 'interwiki', 'id' => 'interwiki' )
+                                       )
                        );
-                       foreach( $wgImportSources as $prefix ) {
+
+                       foreach ( $wgImportSources as $prefix ) {
                                $selected = ( $this->interwiki === $prefix ) ? ' selected="selected"' : '';
                                $out->addHTML( Xml::option( $prefix, $prefix, $selected ) );
                        }
 
                        $out->addHTML(
-                                               Xml::closeElement( 'select' ) .
-                                               Xml::input( 'frompage', 50, $this->frompage, array( 'id' => 'frompage' ) ) .
+                               Xml::closeElement( 'select' ) .
+                                       Xml::input( 'frompage', 50, $this->frompage, array( 'id' => 'frompage' ) ) .
                                        "</td>
                                </tr>
                                <tr>
                                        <td>
                                        </td>
                                        <td class='mw-input'>" .
-                                               Xml::checkLabel( $this->msg( 'import-interwiki-history' )->text(), 'interwikiHistory', 'interwikiHistory', $this->history ) .
+                                       Xml::checkLabel(
+                                               $this->msg( 'import-interwiki-history' )->text(),
+                                               'interwikiHistory',
+                                               'interwikiHistory',
+                                               $this->history
+                                       ) .
                                        "</td>
                                </tr>
                                <tr>
                                        <td>
                                        </td>
                                        <td class='mw-input'>" .
-                                               Xml::checkLabel( $this->msg( 'import-interwiki-templates' )->text(), 'interwikiTemplates', 'interwikiTemplates', $this->includeTemplates ) .
+                                       Xml::checkLabel(
+                                               $this->msg( 'import-interwiki-templates' )->text(),
+                                               'interwikiTemplates',
+                                               'interwikiTemplates',
+                                               $this->includeTemplates
+                                       ) .
                                        "</td>
                                </tr>
                                $importDepth
                                <tr>
                                        <td class='mw-label'>" .
-                                               Xml::label( $this->msg( 'import-interwiki-namespace' )->text(), 'namespace' ) .
+                                       Xml::label( $this->msg( 'import-interwiki-namespace' )->text(), 'namespace' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                               Html::namespaceSelector(
-                                                       array(
-                                                               'selected' => $this->namespace,
-                                                               'all' => '',
-                                                       ), array(
-                                                               'name'  => 'namespace',
-                                                               'id'    => 'namespace',
-                                                               'class' => 'namespaceselector',
-                                                       )
-                                               ) .
+                                       Html::namespaceSelector(
+                                               array(
+                                                       'selected' => $this->namespace,
+                                                       'all' => '',
+                                               ), array(
+                                                       'name' => 'namespace',
+                                                       'id' => 'namespace',
+                                                       'class' => 'namespaceselector',
+                                               )
+                                       ) .
                                        "</td>
                                </tr>
                                <tr>
                                        <td class='mw-label'>" .
-                                               Xml::label( $this->msg( 'import-comment' )->text(), 'mw-interwiki-comment' ) .
+                                       Xml::label( $this->msg( 'import-comment' )->text(), 'mw-interwiki-comment' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                               Xml::input( 'log-comment', 50, '',
-                                                       array( 'id' => 'mw-interwiki-comment', 'type' => 'text' ) ) . ' ' .
+                                       Xml::input( 'log-comment', 50, '',
+                                               array( 'id' => 'mw-interwiki-comment', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
                                <tr>
                                        <td class='mw-label'>" .
-                                               Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-interwiki' ) .
+                                       Xml::label(
+                                               $this->msg( 'import-interwiki-rootpage' )->text(),
+                                               'mw-interwiki-rootpage-interwiki'
+                                       ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                               Xml::input( 'rootpage', 50, $this->rootpage,
-                                                       array( 'id' => 'mw-interwiki-rootpage-interwiki', 'type' => 'text' ) ) . ' ' .
+                                       Xml::input( 'rootpage', 50, $this->rootpage,
+                                               array( 'id' => 'mw-interwiki-rootpage-interwiki', 'type' => 'text' ) ) . ' ' .
                                        "</td>
                                </tr>
                                <tr>
                                        <td>
                                        </td>
                                        <td class='mw-submit'>" .
-                                               Xml::submitButton( $this->msg( 'import-interwiki-submit' )->text(), Linker::tooltipAndAccesskeyAttribs( 'import' ) ) .
+                                       Xml::submitButton(
+                                               $this->msg( 'import-interwiki-submit' )->text(),
+                                               Linker::tooltipAndAccesskeyAttribs( 'import' )
+                                       ) .
                                        "</td>
                                </tr>" .
-                               Xml::closeElement( 'table' ).
-                               Xml::closeElement( 'form' ) .
-                               Xml::closeElement( 'fieldset' )
+                                       Xml::closeElement( 'table' ) .
+                                       Xml::closeElement( 'form' ) .
+                                       Xml::closeElement( 'fieldset' )
                        );
                }
        }
@@ -352,14 +406,21 @@ class SpecialImport extends SpecialPage {
  * @ingroup SpecialPage
  */
 class ImportReporter extends ContextSource {
-       private $reason=false;
+       private $reason = false;
        private $mOriginalLogCallback = null;
        private $mOriginalPageOutCallback = null;
        private $mLogItemCount = 0;
 
+
+       /**
+        * @param WikiImporter $importer
+        * @param $upload
+        * @param $interwiki
+        * @param string|bool $reason
+        */
        function __construct( $importer, $upload, $interwiki, $reason = false ) {
                $this->mOriginalPageOutCallback =
-                               $importer->setPageOutCallback( array( $this, 'reportPage' ) );
+                       $importer->setPageOutCallback( array( $this, 'reportPage' ) );
                $this->mOriginalLogCallback =
                        $importer->setLogItemCallback( array( $this, 'reportLogItem' ) );
                $importer->setNoticeCallback( array( $this, 'reportNotice' ) );
@@ -403,14 +464,15 @@ class ImportReporter extends ContextSource {
 
                $this->mPageCount++;
 
-               if( $successCount > 0 ) {
-                       $this->getOutput()->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
-                               $this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
-                               "</li>\n"
+               if ( $successCount > 0 ) {
+                       $this->getOutput()->addHTML(
+                               "<li>" . Linker::linkKnown( $title ) . " " .
+                                       $this->msg( 'import-revision-count' )->numParams( $successCount )->escaped() .
+                                       "</li>\n"
                        );
 
                        $log = new LogPage( 'import' );
-                       if( $this->mIsUpload ) {
+                       if ( $this->mIsUpload ) {
                                $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
                                        $successCount )->inContentLanguage()->text();
                                if ( $this->reason ) {
@@ -450,8 +512,9 @@ class ImportReporter extends ContextSource {
                if ( $this->mLogItemCount > 0 ) {
                        $msg = $this->msg( 'imported-log-entries' )->numParams( $this->mLogItemCount )->parse();
                        $out->addHTML( Xml::tags( 'li', null, $msg ) );
-               } elseif( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
+               } elseif ( $this->mPageCount == 0 && $this->mLogItemCount == 0 ) {
                        $out->addHTML( "</ul>\n" );
+
                        return Status::newFatal( 'importnopages' );
                }
                $out->addHTML( "</ul>\n" );
index d204d50..f79fdd7 100644 (file)
@@ -55,24 +55,28 @@ class SpecialJavaScriptTest extends SpecialPage {
                if ( $par == '' ) {
                        $out->setPageTitle( $this->msg( 'javascripttest' ) );
                        $summary = $this->wrapSummaryHtml(
-                               $this->msg( 'javascripttest-pagetext-noframework' )->escaped() . $this->getFrameworkListHtml(),
+                               $this->msg( 'javascripttest-pagetext-noframework' )->escaped() .
+                                       $this->getFrameworkListHtml(),
                                'noframework'
                        );
                        $out->addHtml( $summary );
-
-               // Matched! Display proper title and initialize the framework
                } elseif ( isset( self::$frameworks[$framework] ) ) {
-                       $out->setPageTitle( $this->msg( 'javascripttest-title', $this->msg( "javascripttest-$framework-name" )->plain() ) );
-                       $out->setSubtitle( $this->msg( 'javascripttest-backlink' )->rawParams( Linker::linkKnown( $this->getTitle() ) ) );
+                       // Matched! Display proper title and initialize the framework
+                       $out->setPageTitle( $this->msg(
+                               'javascripttest-title',
+                               $this->msg( "javascripttest-$framework-name" )->plain()
+                       ) );
+                       $out->setSubtitle( $this->msg( 'javascripttest-backlink' )
+                               ->rawParams( Linker::linkKnown( $this->getTitle() ) ) );
                        $this->{self::$frameworks[$framework]}();
-
-               // Framework not found, display error
                } else {
+                       // Framework not found, display error
                        $out->setPageTitle( $this->msg( 'javascripttest' ) );
-                       $summary = $this->wrapSummaryHtml( '<p class="error">'
-                               . $this->msg( 'javascripttest-pagetext-unknownframework', $par )->escaped()
-                               . '</p>'
-                               . $this->getFrameworkListHtml(),
+                       $summary = $this->wrapSummaryHtml(
+                               '<p class="error">' .
+                                       $this->msg( 'javascripttest-pagetext-unknownframework', $par )->escaped() .
+                                       '</p>' .
+                                       $this->getFrameworkListHtml(),
                                'unknownframework'
                        );
                        $out->addHtml( $summary );
@@ -80,22 +84,27 @@ class SpecialJavaScriptTest extends SpecialPage {
        }
 
        /**
-        * Get a list of frameworks (including introduction paragraph and links to the framework run pages)
-        * @return String: HTML
+        * Get a list of frameworks (including introduction paragraph and links
+        * to the framework run pages)
+        *
+        * @return string HTML
         */
        private function getFrameworkListHtml() {
                $list = '<ul>';
-               foreach( self::$frameworks as $framework => $initFn ) {
+               foreach ( self::$frameworks as $framework => $initFn ) {
                        $list .= Html::rawElement(
                                'li',
                                array(),
-                               Linker::link( $this->getTitle( $framework ), $this->msg( "javascripttest-$framework-name" )->escaped() )
+                               Linker::link(
+                                       $this->getTitle( $framework ),
+                                       $this->msg( "javascripttest-$framework-name" )->escaped()
+                               )
                        );
                }
                $list .= '</ul>';
-               $msg = $this->msg( 'javascripttest-pagetext-frameworks' )->rawParams( $list )->parseAsBlock();
 
-               return $msg;
+               return $this->msg( 'javascripttest-pagetext-frameworks' )->rawParams( $list )
+                       ->parseAsBlock();
        }
 
        /**
@@ -109,12 +118,14 @@ class SpecialJavaScriptTest extends SpecialPage {
         */
        private function wrapSummaryHtml( $html, $state ) {
                $validStates = array( 'noframework', 'unknownframework', 'frameworkfound' );
-               if( !in_array( $state, $validStates ) ) {
+
+               if ( !in_array( $state, $validStates ) ) {
                        throw new MWException( __METHOD__
                                . ' given an invalid state. Must be one of "'
-                               . join( '", "', $validStates) . '".'
+                               . join( '", "', $validStates ) . '".'
                        );
                }
+
                return "<div id=\"mw-javascripttest-summary\" class=\"mw-javascripttest-$state\">$html</div>";
        }
 
@@ -155,7 +166,10 @@ HTML;
 
                // Used in ./tests/qunit/data/testrunner.js, see also documentation of
                // $wgJavaScriptTestConfig in DefaultSettings.php
-               $out->addJsConfigVars( 'QUnitTestSwarmInjectJSPath', $wgJavaScriptTestConfig['qunit']['testswarm-injectjs'] );
+               $out->addJsConfigVars(
+                       'QUnitTestSwarmInjectJSPath',
+                       $wgJavaScriptTestConfig['qunit']['testswarm-injectjs']
+               );
        }
 
        protected function getGroupName() {
index 030416f..5b0c56e 100644 (file)
@@ -55,7 +55,7 @@ class LinkSearchPage extends QueryPage {
                $namespace = $request->getIntorNull( 'namespace', null );
 
                $protocols_list = array();
-               foreach( $wgUrlProtocols as $prot ) {
+               foreach ( $wgUrlProtocols as $prot ) {
                        if ( $prot !== '//' ) {
                                $protocols_list[] = $prot;
                        }
@@ -72,7 +72,7 @@ class LinkSearchPage extends QueryPage {
                } elseif ( !$pr_sl && $pr_cl ) {
                        // For protocols without '//' like 'mailto:'
                        $protocol = substr( $target2, 0, $pr_cl + 1 );
-                       $target2 = substr( $target2, $pr_cl+1 );
+                       $target2 = substr( $target2, $pr_cl + 1 );
                } elseif ( $protocol == '' && $target2 != '' ) {
                        // default
                        $protocol = 'http://';
@@ -88,11 +88,21 @@ class LinkSearchPage extends QueryPage {
                        '<nowiki>' . $this->getLanguage()->commaList( $protocols_list ) . '</nowiki>',
                        count( $protocols_list )
                );
-               $s = Html::openElement( 'form', array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+               $s = Html::openElement(
+                       'form',
+                       array( 'id' => 'mw-linksearch-form', 'method' => 'get', 'action' => $wgScript )
+               ) . "\n" .
                        Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) . "\n" .
                        Html::openElement( 'fieldset' ) . "\n" .
                        Html::element( 'legend', array(), $this->msg( 'linksearch' )->text() ) . "\n" .
-                       Xml::inputLabel( $this->msg( 'linksearch-pat' )->text(), 'target', 'target', 50, $target ) . "\n";
+                       Xml::inputLabel(
+                               $this->msg( 'linksearch-pat' )->text(),
+                               'target',
+                               'target',
+                               50,
+                               $target
+                       ) . "\n";
+
                if ( !$wgMiserMode ) {
                        $s .= Html::namespaceSelector(
                                array(
@@ -100,25 +110,27 @@ class LinkSearchPage extends QueryPage {
                                        'all' => '',
                                        'label' => $this->msg( 'linksearch-ns' )->text()
                                ), array(
-                                       'name'  => 'namespace',
-                                       'id'    => 'namespace',
+                                       'name' => 'namespace',
+                                       'id' => 'namespace',
                                        'class' => 'namespaceselector',
                                )
                        );
                }
+
                $s .= Xml::submitButton( $this->msg( 'linksearch-ok' )->text() ) . "\n" .
                        Html::closeElement( 'fieldset' ) . "\n" .
                        Html::closeElement( 'form' ) . "\n";
                $out->addHTML( $s );
 
-               if( $target != '' ) {
+               if ( $target != '' ) {
                        $this->setParams( array(
                                'query' => $target2,
                                'namespace' => $namespace,
                                'protocol' => $protocol ) );
                        parent::execute( $par );
-                       if( $this->mMungedQuery === false )
+                       if ( $this->mMungedQuery === false ) {
                                $out->addWikiMsg( 'linksearch-error' );
+                       }
                }
        }
 
@@ -133,6 +145,8 @@ class LinkSearchPage extends QueryPage {
        /**
         * Return an appropriately formatted LIKE query and the clause
         *
+        * @param string $query
+        * @param string $prot
         * @return array
         */
        static function mungeQuery( $query, $prot ) {
@@ -140,12 +154,14 @@ class LinkSearchPage extends QueryPage {
                $rv = LinkFilter::makeLikeArray( $query, $prot );
                if ( $rv === false ) {
                        // LinkFilter doesn't handle wildcard in IP, so we'll have to munge here.
-                       if ( preg_match( '/^(:?[0-9]{1,3}\.)+\*\s*$|^(:?[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*\*\s*$/', $query ) ) {
+                       $pattern = '/^(:?[0-9]{1,3}\.)+\*\s*$|^(:?[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]*\*\s*$/';
+                       if ( preg_match( $pattern, $query ) ) {
                                $dbr = wfGetDB( DB_SLAVE );
                                $rv = array( $prot . rtrim( $query, " \t*" ), $dbr->anyString() );
                                $field = 'el_to';
                        }
                }
+
                return array( $rv, $field );
        }
 
@@ -153,9 +169,10 @@ class LinkSearchPage extends QueryPage {
                global $wgMiserMode;
                $params = array();
                $params['target'] = $this->mProt . $this->mQuery;
-               if( isset( $this->mNs ) && !$wgMiserMode ) {
+               if ( isset( $this->mNs ) && !$wgMiserMode ) {
                        $params['namespace'] = $this->mNs;
                }
+
                return $params;
        }
 
@@ -164,29 +181,41 @@ class LinkSearchPage extends QueryPage {
                $dbr = wfGetDB( DB_SLAVE );
                // strip everything past first wildcard, so that
                // index-based-only lookup would be done
-               list( $this->mMungedQuery, $clause ) = self::mungeQuery(
-                               $this->mQuery, $this->mProt );
-               if( $this->mMungedQuery === false )
+               list( $this->mMungedQuery, $clause ) = self::mungeQuery( $this->mQuery, $this->mProt );
+               if ( $this->mMungedQuery === false ) {
                        // Invalid query; return no results
                        return array( 'tables' => 'page', 'fields' => 'page_id', 'conds' => '0=1' );
+               }
 
                $stripped = LinkFilter::keepOneWildcard( $this->mMungedQuery );
                $like = $dbr->buildLike( $stripped );
-               $retval = array (
-                       'tables' => array ( 'page', 'externallinks' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'el_index', 'url' => 'el_to' ),
-                       'conds' => array ( 'page_id = el_from',
-                                       "$clause $like" ),
+               $retval = array(
+                       'tables' => array( 'page', 'externallinks' ),
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'el_index',
+                               'url' => 'el_to'
+                       ),
+                       'conds' => array(
+                               'page_id = el_from',
+                               "$clause $like"
+                       ),
                        'options' => array( 'USE INDEX' => $clause )
                );
+
                if ( isset( $this->mNs ) && !$wgMiserMode ) {
                        $retval['conds']['page_namespace'] = $this->mNs;
                }
+
                return $retval;
        }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
        function formatResult( $skin, $result ) {
                $title = Title::makeTitle( $result->namespace, $result->title );
                $url = $result->url;
@@ -201,7 +230,7 @@ class LinkSearchPage extends QueryPage {
         */
        function doQuery( $offset = false, $limit = false ) {
                list( $this->mMungedQuery, ) = LinkSearchPage::mungeQuery( $this->mQuery, $this->mProt );
-               if( $this->mMungedQuery === false ) {
+               if ( $this->mMungedQuery === false ) {
                        $this->getOutput()->addWikiMsg( 'linksearch-error' );
                } else {
                        // For debugging
index c864ae2..f508b7c 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 class SpecialListFiles extends IncludableSpecialPage {
-
        public function __construct() {
                parent::__construct( 'Listfiles' );
        }
@@ -39,7 +38,12 @@ class SpecialListFiles extends IncludableSpecialPage {
                        $search = $this->getRequest()->getText( 'ilsearch', '' );
                }
 
-               $pager = new ImageListPager( $this->getContext(), $userName, $search, $this->including() );
+               $pager = new ImageListPager(
+                       $this->getContext(),
+                       $userName,
+                       $search,
+                       $this->including()
+               );
 
                if ( $this->including() ) {
                        $html = $pager->getBody();
@@ -67,7 +71,9 @@ class ImageListPager extends TablePager {
        var $mSearch = '';
        var $mIncluding = false;
 
-       function __construct( IContextSource $context, $userName = null, $search = '', $including = false ) {
+       function __construct( IContextSource $context, $userName = null, $search = '',
+               $including = false
+       ) {
                global $wgMiserMode;
 
                $this->mIncluding = $including;
@@ -83,6 +89,7 @@ class ImageListPager extends TablePager {
                if ( $search != '' && !$wgMiserMode ) {
                        $this->mSearch = $search;
                        $nt = Title::newFromURL( $this->mSearch );
+
                        if ( $nt ) {
                                $dbr = wfGetDB( DB_SLAVE );
                                $this->mQueryConds[] = 'LOWER(img_name)' .
@@ -118,10 +125,11 @@ class ImageListPager extends TablePager {
                                'img_user_text' => $this->msg( 'listfiles_user' )->text(),
                                'img_description' => $this->msg( 'listfiles_description' )->text(),
                        );
-                       if( !$wgMiserMode ) {
+                       if ( !$wgMiserMode ) {
                                $this->mFieldNames['count'] = $this->msg( 'listfiles_count' )->text();
                        }
                }
+
                return $this->mFieldNames;
        }
 
@@ -134,6 +142,7 @@ class ImageListPager extends TablePager {
                        # No index for both img_size and img_user_text
                        return !isset( $this->mQueryConds['img_user_text'] );
                }
+
                return in_array( $field, $sortable );
        }
 
@@ -145,7 +154,7 @@ class ImageListPager extends TablePager {
                $options = $join_conds = array();
 
                # Depends on $wgMiserMode
-               if( isset( $this->mFieldNames['count'] ) ) {
+               if ( isset( $this->mFieldNames['count'] ) ) {
                        $tables[] = 'oldimage';
 
                        # Need to rewrite this one
@@ -157,7 +166,7 @@ class ImageListPager extends TablePager {
                        unset( $field );
 
                        $dbr = wfGetDB( DB_SLAVE );
-                       if( $dbr->implicitGroupby() ) {
+                       if ( $dbr->implicitGroupby() ) {
                                $options = array( 'GROUP BY' => 'img_name' );
                        } else {
                                $columnlist = preg_grep( '/^img/', array_keys( $this->getFieldNames() ) );
@@ -165,11 +174,12 @@ class ImageListPager extends TablePager {
                        }
                        $join_conds = array( 'oldimage' => array( 'LEFT JOIN', 'oi_name = img_name' ) );
                }
+
                return array(
-                       'tables'     => $tables,
-                       'fields'     => $fields,
-                       'conds'      => $this->mQueryConds,
-                       'options'    => $options,
+                       'tables' => $tables,
+                       'fields' => $fields,
+                       'conds' => $this->mQueryConds,
+                       'options' => $options,
                        'join_conds' => $join_conds
                );
        }
@@ -193,22 +203,30 @@ class ImageListPager extends TablePager {
                        case 'thumb':
                                $file = wfLocalFile( $value );
                                $thumb = $file->transform( array( 'width' => 180, 'height' => 360 ) );
+
                                return $thumb->toHtml( array( 'desc-link' => true ) );
                        case 'img_timestamp':
-                               return htmlspecialchars( $this->getLanguage()->userTimeAndDate( $value, $this->getUser() ) );
+                               $timeAndDate = $this->getLanguage()->userTimeAndDate( $value, $this->getUser() );
+                               return htmlspecialchars( $timeAndDate );
                        case 'img_name':
                                static $imgfile = null;
-                               if ( $imgfile === null ) $imgfile = $this->msg( 'imgfile' )->text();
+                               if ( $imgfile === null ) {
+                                       $imgfile = $this->msg( 'imgfile' )->text();
+                               }
 
                                // Weird files can maybe exist? Bug 22227
                                $filePage = Title::makeTitleSafe( NS_FILE, $value );
-                               if( $filePage ) {
-                                       $link = Linker::linkKnown( $filePage, htmlspecialchars( $filePage->getText() ) );
+                               if ( $filePage ) {
+                                       $link = Linker::linkKnown(
+                                               $filePage,
+                                               htmlspecialchars( $filePage->getText() )
+                                       );
                                        $download = Xml::element( 'a',
                                                array( 'href' => wfLocalFile( $filePage )->getURL() ),
                                                $imgfile
                                        );
                                        $download = $this->msg( 'parentheses' )->rawParams( $download )->escaped();
+
                                        return "$link $download";
                                } else {
                                        return htmlspecialchars( $value );
@@ -223,6 +241,7 @@ class ImageListPager extends TablePager {
                                } else {
                                        $link = htmlspecialchars( $value );
                                }
+
                                return $link;
                        case 'img_size':
                                return htmlspecialchars( $this->getLanguage()->formatSize( $value ) );
@@ -238,20 +257,26 @@ class ImageListPager extends TablePager {
                $inputForm = array();
                $inputForm['table_pager_limit_label'] = $this->getLimitSelect();
                if ( !$wgMiserMode ) {
-                       $inputForm['listfiles_search_for'] = Html::input( 'ilsearch', $this->mSearch, 'text',
+                       $inputForm['listfiles_search_for'] = Html::input(
+                               'ilsearch',
+                               $this->mSearch,
+                               'text',
                                array(
-                                       'size'          => '40',
+                                       'size' => '40',
                                        'maxlength' => '255',
-                                       'id'            => 'mw-ilsearch',
-                       ) );
+                                       'id' => 'mw-ilsearch',
+                               )
+                       );
                }
                $inputForm['username'] = Html::input( 'user', $this->mUserName, 'text', array(
-                       'size'          => '40',
+                       'size' => '40',
                        'maxlength' => '255',
-                       'id'            => 'mw-listfiles-user',
+                       'id' => 'mw-listfiles-user',
                ) );
+
                return Html::openElement( 'form',
-                               array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' ) ) .
+                       array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listfiles-form' )
+               ) .
                        Xml::fieldset( $this->msg( 'listfiles' )->text() ) .
                        Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
                        Xml::buildForm( $inputForm, 'table_pager_limit_submit' ) .
@@ -280,6 +305,7 @@ class ImageListPager extends TablePager {
                                $query['user'] = $this->mUserName;
                        }
                }
+
                return $queries;
        }
 
@@ -288,6 +314,7 @@ class ImageListPager extends TablePager {
                if ( !isset( $queries['user'] ) && !is_null( $this->mUserName ) ) {
                        $queries['user'] = $this->mUserName;
                }
+
                return $queries;
        }
 
index 7cccf88..57bfea5 100644 (file)
@@ -29,7 +29,6 @@
  * @author Petr Kadlec <mormegil@centrum.cz>
  */
 class SpecialListGroupRights extends SpecialPage {
-
        /**
         * Constructor
         */
@@ -54,8 +53,8 @@ class SpecialListGroupRights extends SpecialPage {
                $out->addHTML(
                        Xml::openElement( 'table', array( 'class' => 'wikitable mw-listgrouprights-table' ) ) .
                                '<tr>' .
-                                       Xml::element( 'th', null, $this->msg( 'listgrouprights-group' )->text() ) .
-                                       Xml::element( 'th', null, $this->msg( 'listgrouprights-rights' )->text() ) .
+                               Xml::element( 'th', null, $this->msg( 'listgrouprights-group' )->text() ) .
+                               Xml::element( 'th', null, $this->msg( 'listgrouprights-rights' )->text() ) .
                                '</tr>'
                );
 
@@ -85,7 +84,7 @@ class SpecialListGroupRights extends SpecialPage {
                                $msg->text() :
                                MWNamespace::getCanonicalName( NS_PROJECT ) . ':' . $groupname;
 
-                       if( $group == '*' ) {
+                       if ( $group == '*' ) {
                                // Do not make a link for the generic * group
                                $grouppage = htmlspecialchars( $groupnameLocalized );
                        } else {
@@ -124,8 +123,8 @@ class SpecialListGroupRights extends SpecialPage {
                                "
                                <td>$grouppage$grouplink</td>
                                        <td>" .
-                                               $this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
-                                                       $addgroupsSelf, $removegroupsSelf ) .
+                                       $this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
+                                               $addgroupsSelf, $removegroupsSelf ) .
                                        '</td>
                                '
                        ) );
@@ -149,9 +148,9 @@ class SpecialListGroupRights extends SpecialPage {
         */
        private function formatPermissions( $permissions, $revoke, $add, $remove, $addSelf, $removeSelf ) {
                $r = array();
-               foreach( $permissions as $permission => $granted ) {
+               foreach ( $permissions as $permission => $granted ) {
                        //show as granted only if it isn't revoked to prevent duplicate display of permissions
-                       if( $granted && ( !isset( $revoke[$permission] ) || !$revoke[$permission] ) ) {
+                       if ( $granted && ( !isset( $revoke[$permission] ) || !$revoke[$permission] ) ) {
                                $description = $this->msg( 'listgrouprights-right-display',
                                        User::getRightDescription( $permission ),
                                        '<span class="mw-listgrouprights-right-name">' . $permission . '</span>'
@@ -159,8 +158,8 @@ class SpecialListGroupRights extends SpecialPage {
                                $r[] = $description;
                        }
                }
-               foreach( $revoke as $permission => $revoked ) {
-                       if( $revoked ) {
+               foreach ( $revoke as $permission => $revoked ) {
+                       if ( $revoked ) {
                                $description = $this->msg( 'listgrouprights-right-revoked',
                                        User::getRightDescription( $permission ),
                                        '<span class="mw-listgrouprights-right-name">' . $permission . '</span>'
@@ -168,45 +167,52 @@ class SpecialListGroupRights extends SpecialPage {
                                $r[] = $description;
                        }
                }
+
                sort( $r );
+
                $lang = $this->getLanguage();
-               if( $add === true ) {
+
+               if ( $add === true ) {
                        $r[] = $this->msg( 'listgrouprights-addgroup-all' )->escaped();
-               } elseif( is_array( $add ) && count( $add ) ) {
+               } elseif ( is_array( $add ) && count( $add ) ) {
                        $add = array_values( array_unique( $add ) );
                        $r[] = $this->msg( 'listgrouprights-addgroup',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $add ) ),
                                count( $add )
                        )->parse();
                }
-               if( $remove === true ) {
+
+               if ( $remove === true ) {
                        $r[] = $this->msg( 'listgrouprights-removegroup-all' )->escaped();
-               } elseif( is_array( $remove ) && count( $remove ) ) {
+               } elseif ( is_array( $remove ) && count( $remove ) ) {
                        $remove = array_values( array_unique( $remove ) );
                        $r[] = $this->msg( 'listgrouprights-removegroup',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $remove ) ),
                                count( $remove )
                        )->parse();
                }
-               if( $addSelf === true ) {
+
+               if ( $addSelf === true ) {
                        $r[] = $this->msg( 'listgrouprights-addgroup-self-all' )->escaped();
-               } elseif( is_array( $addSelf ) && count( $addSelf ) ) {
+               } elseif ( is_array( $addSelf ) && count( $addSelf ) ) {
                        $addSelf = array_values( array_unique( $addSelf ) );
                        $r[] = $this->msg( 'listgrouprights-addgroup-self',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $addSelf ) ),
                                count( $addSelf )
                        )->parse();
                }
-               if( $removeSelf === true ) {
+
+               if ( $removeSelf === true ) {
                        $r[] = $this->msg( 'listgrouprights-removegroup-self-all' )->parse();
-               } elseif( is_array( $removeSelf ) && count( $removeSelf ) ) {
+               } elseif ( is_array( $removeSelf ) && count( $removeSelf ) ) {
                        $removeSelf = array_values( array_unique( $removeSelf ) );
                        $r[] = $this->msg( 'listgrouprights-removegroup-self',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $removeSelf ) ),
                                count( $removeSelf )
                        )->parse();
                }
-               if( empty( $r ) ) {
+
+               if ( empty( $r ) ) {
                        return '';
                } else {
                        return '<ul><li>' . implode( "</li>\n<li>", $r ) . '</li></ul>';
index 0283767..2c8792f 100644 (file)
@@ -29,7 +29,6 @@
  * @ingroup SpecialPage
  */
 class ListredirectsPage extends QueryPage {
-
        function __construct( $name = 'Listredirects' ) {
                parent::__construct( $name );
        }
@@ -50,16 +49,16 @@ class ListredirectsPage extends QueryPage {
                return array(
                        'tables' => array( 'p1' => 'page', 'redirect', 'p2' => 'page' ),
                        'fields' => array( 'namespace' => 'p1.page_namespace',
-                                       'title' => 'p1.page_title',
-                                       'value' => 'p1.page_title',
-                                       'rd_namespace',
-                                       'rd_title',
-                                       'rd_fragment',
-                                       'rd_interwiki',
-                                       'redirid' => 'p2.page_id' ),
+                               'title' => 'p1.page_title',
+                               'value' => 'p1.page_title',
+                               'rd_namespace',
+                               'rd_title',
+                               'rd_fragment',
+                               'rd_interwiki',
+                               'redirid' => 'p2.page_id' ),
                        'conds' => array( 'p1.page_is_redirect' => 1 ),
                        'join_conds' => array( 'redirect' => array(
-                                       'LEFT JOIN', 'rd_from=p1.page_id' ),
+                               'LEFT JOIN', 'rd_from=p1.page_id' ),
                                'p2' => array( 'LEFT JOIN', array(
                                        'p2.page_namespace=rd_namespace',
                                        'p2.page_title=rd_title' ) ) )
@@ -67,21 +66,23 @@ class ListredirectsPage extends QueryPage {
        }
 
        function getOrderFields() {
-               return array ( 'p1.page_namespace', 'p1.page_title' );
+               return array( 'p1.page_namespace', 'p1.page_title' );
        }
 
        /**
         * Cache page existence for performance
         *
-        * @param $db DatabaseBase
-        * @param $res ResultWrapper
+        * @param DatabaseBase $db
+        * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                $batch = new LinkBatch;
+
                foreach ( $res as $row ) {
                        $batch->add( $row->namespace, $row->title );
                        $batch->addObj( $this->getRedirectTarget( $row ) );
                }
+
                $batch->execute();
 
                // Back to start for display
@@ -100,10 +101,16 @@ class ListredirectsPage extends QueryPage {
                } else {
                        $title = Title::makeTitle( $row->namespace, $row->title );
                        $article = WikiPage::factory( $title );
+
                        return $article->getRedirectTarget();
                }
        }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
        function formatResult( $skin, $result ) {
                # Make a link to the redirect itself
                $rd_title = Title::makeTitle( $result->namespace, $result->title );
@@ -116,11 +123,12 @@ class ListredirectsPage extends QueryPage {
 
                # Find out where the redirect leads
                $target = $this->getRedirectTarget( $result );
-               if( $target ) {
+               if ( $target ) {
                        # Make a link to the destination page
                        $lang = $this->getLanguage();
                        $arr = $lang->getArrow() . $lang->getDirMark();
                        $targetLink = Linker::link( $target );
+
                        return "$rd_link $arr $targetLink";
                } else {
                        return "<del>$rd_link</del>";
index d253a4d..75b8490 100644 (file)
@@ -49,7 +49,10 @@ class UsersPager extends AlphabeticPager {
                $par = ( $par !== null ) ? $par : '';
                $parms = explode( '/', $par );
                $symsForAll = array( '*', 'user' );
-               if ( $parms[0] != '' && ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) ) ) {
+
+               if ( $parms[0] != '' &&
+                       ( in_array( $par, User::getAllGroups() ) || in_array( $par, $symsForAll ) )
+               ) {
                        $this->requestedGroup = $par;
                        $un = $request->getText( 'username' );
                } elseif ( count( $parms ) == 2 ) {
@@ -59,6 +62,7 @@ class UsersPager extends AlphabeticPager {
                        $this->requestedGroup = $request->getVal( 'group' );
                        $un = ( $par != '' ) ? $par : $request->getText( 'username' );
                }
+
                if ( in_array( $this->requestedGroup, $symsForAll ) ) {
                        $this->requestedGroup = '';
                }
@@ -67,12 +71,15 @@ class UsersPager extends AlphabeticPager {
                $this->including = $including;
 
                $this->requestedUser = '';
+
                if ( $un != '' ) {
                        $username = Title::makeTitleSafe( NS_USER, $un );
-                       if( ! is_null( $username ) ) {
+
+                       if ( !is_null( $username ) ) {
                                $this->requestedUser = $username->getText();
                        }
                }
+
                parent::__construct();
        }
 
@@ -89,27 +96,28 @@ class UsersPager extends AlphabeticPager {
        function getQueryInfo() {
                $dbr = wfGetDB( DB_SLAVE );
                $conds = array();
+
                // Don't show hidden names
-               if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
                        $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0';
                }
 
                $options = array();
 
-               if( $this->requestedGroup != '' ) {
+               if ( $this->requestedGroup != '' ) {
                        $conds['ug_group'] = $this->requestedGroup;
-               } else {
-                       //$options['USE INDEX'] = $this->creationSort ? 'PRIMARY' : 'user_name';
                }
-               if( $this->requestedUser != '' ) {
+
+               if ( $this->requestedUser != '' ) {
                        # Sorted either by account creation or name
-                       if( $this->creationSort ) {
+                       if ( $this->creationSort ) {
                                $conds[] = 'user_id >= ' . intval( User::idFromName( $this->requestedUser ) );
                        } else {
                                $conds[] = 'user_name >= ' . $dbr->addQuotes( $this->requestedUser );
                        }
                }
-               if( $this->editsOnly ) {
+
+               if ( $this->editsOnly ) {
                        $conds[] = 'user_editcount > 0';
                }
 
@@ -129,15 +137,18 @@ class UsersPager extends AlphabeticPager {
                        'options' => $options,
                        'join_conds' => array(
                                'user_groups' => array( 'LEFT JOIN', 'user_id=ug_user' ),
-                               'ipblocks' => array( 'LEFT JOIN', array(
-                                       'user_id=ipb_user',
-                                       'ipb_auto' => 0
-                               )),
+                               'ipblocks' => array(
+                                       'LEFT JOIN', array(
+                                               'user_id=ipb_user',
+                                               'ipb_auto' => 0
+                                       )
+                               ),
                        ),
                        'conds' => $conds
                );
 
                wfRunHooks( 'SpecialListusersQueryInfo', array( $this, &$query ) );
+
                return $query;
        }
 
@@ -153,42 +164,55 @@ class UsersPager extends AlphabeticPager {
                $userName = $row->user_name;
 
                $ulinks = Linker::userLink( $row->user_id, $userName );
-               $ulinks .= Linker::userToolLinksRedContribs( $row->user_id, $userName, intval( $row->edits ) );
+               $ulinks .= Linker::userToolLinksRedContribs(
+                       $row->user_id,
+                       $userName,
+                       (int)$row->edits
+               );
 
                $lang = $this->getLanguage();
 
                $groups = '';
                $groups_list = self::getGroups( $row->user_id );
-               if( !$this->including && count( $groups_list ) > 0 ) {
+
+               if ( !$this->including && count( $groups_list ) > 0 ) {
                        $list = array();
-                       foreach( $groups_list as $group )
+                       foreach ( $groups_list as $group ) {
                                $list[] = self::buildGroupLink( $group, $userName );
+                       }
                        $groups = $lang->commaList( $list );
                }
 
                $item = $lang->specialList( $ulinks, $groups );
-               if( $row->ipb_deleted ) {
+
+               if ( $row->ipb_deleted ) {
                        $item = "<span class=\"deleted\">$item</span>";
                }
 
                $edits = '';
                global $wgEdititis;
                if ( !$this->including && $wgEdititis ) {
-                       $edits = ' [' . $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped() . ']';
+                       // @fixme i18n issue: Hardcoded square brackets.
+                       $edits = ' [' .
+                               $this->msg( 'usereditcount' )->numParams( $row->edits )->escaped() .
+                               ']';
                }
 
                $created = '';
-               # Some rows may be NULL
-               if( !$this->including && $row->creation ) {
+               # Some rows may be null
+               if ( !$this->including && $row->creation ) {
                        $user = $this->getUser();
                        $d = $lang->userDate( $row->creation, $user );
                        $t = $lang->userTime( $row->creation, $user );
                        $created = $this->msg( 'usercreated', $d, $t, $row->user_name )->escaped();
                        $created = ' ' . $this->msg( 'parentheses' )->rawParams( $created )->escaped();
                }
-               $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+               $blocked = !is_null( $row->ipb_deleted ) ?
+                       ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() :
+                       '';
 
                wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
+
                return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}{$blocked}" );
        }
 
@@ -212,7 +236,10 @@ class UsersPager extends AlphabeticPager {
                list( $self ) = explode( '/', $this->getTitle()->getPrefixedDBkey() );
 
                # Form tag
-               $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' ) ) .
+               $out = Xml::openElement(
+                       'form',
+                       array( 'method' => 'get', 'action' => $wgScript, 'id' => 'mw-listusers-form' )
+               ) .
                        Xml::fieldset( $this->msg( 'listusers' )->text() ) .
                        Html::hidden( 'title', $self );
 
@@ -233,12 +260,23 @@ class UsersPager extends AlphabeticPager {
                $out .= Xml::label( $this->msg( 'group' )->text(), 'group' ) . ' ' .
                        Xml::openElement( 'select', array( 'name' => 'group', 'id' => 'group' ) ) .
                        Xml::option( $this->msg( 'group-all' )->text(), '' );
-               foreach( $this->getAllGroups() as $group => $groupText )
+               foreach ( $this->getAllGroups() as $group => $groupText ) {
                        $out .= Xml::option( $groupText, $group, $group == $this->requestedGroup );
+               }
                $out .= Xml::closeElement( 'select' ) . '<br />';
-               $out .= Xml::checkLabel( $this->msg( 'listusers-editsonly' )->text(), 'editsOnly', 'editsOnly', $this->editsOnly );
+               $out .= Xml::checkLabel(
+                       $this->msg( 'listusers-editsonly' )->text(),
+                       'editsOnly',
+                       'editsOnly',
+                       $this->editsOnly
+               );
                $out .= '&#160;';
-               $out .= Xml::checkLabel( $this->msg( 'listusers-creationsort' )->text(), 'creationSort', 'creationSort', $this->creationSort );
+               $out .= Xml::checkLabel(
+                       $this->msg( 'listusers-creationsort' )->text(),
+                       'creationSort',
+                       'creationSort',
+                       $this->creationSort
+               );
                $out .= '<br />';
 
                wfRunHooks( 'SpecialListusersHeaderForm', array( $this, &$out ) );
@@ -259,10 +297,11 @@ class UsersPager extends AlphabeticPager {
         */
        function getAllGroups() {
                $result = array();
-               foreach( User::getAllGroups() as $group ) {
+               foreach ( User::getAllGroups() as $group ) {
                        $result[$group] = User::getGroupName( $group );
                }
                asort( $result );
+
                return $result;
        }
 
@@ -272,13 +311,14 @@ class UsersPager extends AlphabeticPager {
         */
        function getDefaultQuery() {
                $query = parent::getDefaultQuery();
-               if( $this->requestedGroup != '' ) {
+               if ( $this->requestedGroup != '' ) {
                        $query['group'] = $this->requestedGroup;
                }
-               if( $this->requestedUser != '' ) {
+               if ( $this->requestedUser != '' ) {
                        $query['username'] = $this->requestedUser;
                }
                wfRunHooks( 'SpecialListusersDefaultQuery', array( $this, &$query ) );
+
                return $query;
        }
 
@@ -291,6 +331,7 @@ class UsersPager extends AlphabeticPager {
        protected static function getGroups( $uid ) {
                $user = User::newFromId( $uid );
                $groups = array_diff( $user->getEffectiveGroups(), User::getImplicitGroups() );
+
                return $groups;
        }
 
@@ -302,7 +343,10 @@ class UsersPager extends AlphabeticPager {
         * @return string
         */
        protected static function buildGroupLink( $group, $username ) {
-               return User::makeGroupLinkHtml( $group, htmlspecialchars( User::getGroupMember( $group, $username ) ) );
+               return User::makeGroupLinkHtml(
+                       $group,
+                       htmlspecialchars( User::getGroupMember( $group, $username ) )
+               );
        }
 }
 
@@ -310,7 +354,6 @@ class UsersPager extends AlphabeticPager {
  * @ingroup SpecialPage
  */
 class SpecialListUsers extends IncludableSpecialPage {
-
        /**
         * Constructor
         */
@@ -337,7 +380,7 @@ class SpecialListUsers extends IncludableSpecialPage {
                        $s = $up->getPageHeader();
                }
 
-               if( $usersbody ) {
+               if ( $usersbody ) {
                        $s .= $up->getNavigationBar();
                        $s .= Html::rawElement( 'ul', array(), $usersbody );
                        $s .= $up->getNavigationBar();
index 4fc0f6e..5d55a28 100644 (file)
@@ -29,7 +29,6 @@
  * @ingroup SpecialPage
  */
 class SpecialLog extends SpecialPage {
-
        /**
         * List log type for which the target is a user
         * Thus if the given target is in NS_MAIN we can alter it to be an NS_USER
@@ -99,10 +98,10 @@ class SpecialLog extends SpecialPage {
                # Some log types are only for a 'User:' title but we might have been given
                # only the username instead of the full title 'User:username'. This part try
                # to lookup for a user by that name and eventually fix user input. See bug 1697.
-               if( in_array( $opts->getValue( 'type' ), $this->typeOnUser ) ) {
+               if ( in_array( $opts->getValue( 'type' ), $this->typeOnUser ) ) {
                        # ok we have a type of log which expect a user title.
                        $target = Title::newFromText( $opts->getValue( 'page' ) );
-                       if( $target && $target->getNamespace() === NS_MAIN ) {
+                       if ( $target && $target->getNamespace() === NS_MAIN ) {
                                # User forgot to add 'User:', we are adding it for him
                                $opts->setValue( 'page',
                                        Title::makeTitleSafe( NS_USER, $opts->getValue( 'page' ) )
@@ -117,9 +116,11 @@ class SpecialLog extends SpecialPage {
                global $wgLogTypes;
 
                # Get parameters
-               $parms = explode( '/', ($par = ( $par !== null ) ? $par : '' ) );
+               $parms = explode( '/', ( $par = ( $par !== null ) ? $par : '' ) );
                $symsForAll = array( '*', 'all' );
-               if ( $parms[0] != '' && ( in_array( $par, $wgLogTypes ) || in_array( $par, $symsForAll ) ) ) {
+               if ( $parms[0] != '' &&
+                       ( in_array( $par, $wgLogTypes ) || in_array( $par, $symsForAll ) )
+               ) {
                        $opts->setValue( 'type', $par );
                } elseif ( count( $parms ) == 2 ) {
                        $opts->setValue( 'type', $parms[0] );
@@ -131,10 +132,22 @@ class SpecialLog extends SpecialPage {
 
        private function show( FormOptions $opts, array $extraConds ) {
                # Create a LogPager item to get the results and a LogEventsList item to format them...
-               $loglist = new LogEventsList( $this->getContext(), null, LogEventsList::USE_REVDEL_CHECKBOXES );
-               $pager = new LogPager( $loglist, $opts->getValue( 'type' ), $opts->getValue( 'user' ),
-                       $opts->getValue( 'page' ), $opts->getValue( 'pattern' ), $extraConds, $opts->getValue( 'year' ),
-                       $opts->getValue( 'month' ), $opts->getValue( 'tagfilter' ) );
+               $loglist = new LogEventsList(
+                       $this->getContext(),
+                       null,
+                       LogEventsList::USE_REVDEL_CHECKBOXES
+               );
+               $pager = new LogPager(
+                       $loglist,
+                       $opts->getValue( 'type' ),
+                       $opts->getValue( 'user' ),
+                       $opts->getValue( 'page' ),
+                       $opts->getValue( 'pattern' ),
+                       $extraConds,
+                       $opts->getValue( 'year' ),
+                       $opts->getValue( 'month' ),
+                       $opts->getValue( 'tagfilter' )
+               );
 
                $this->addHeader( $opts->getValue( 'type' ) );
 
@@ -144,16 +157,28 @@ class SpecialLog extends SpecialPage {
                }
 
                # Show form options
-               $loglist->showOptions( $pager->getType(), $opts->getValue( 'user' ), $pager->getPage(), $pager->getPattern(),
-                       $pager->getYear(), $pager->getMonth(), $pager->getFilterParams(), $opts->getValue( 'tagfilter' ) );
+               $loglist->showOptions(
+                       $pager->getType(),
+                       $opts->getValue( 'user' ),
+                       $pager->getPage(),
+                       $pager->getPattern(),
+                       $pager->getYear(),
+                       $pager->getMonth(),
+                       $pager->getFilterParams(),
+                       $opts->getValue( 'tagfilter' )
+               );
 
                # Insert list
                $logBody = $pager->getBody();
                if ( $logBody ) {
                        $this->getOutput()->addHTML(
                                $pager->getNavigationBar() .
-                               $this->getRevisionButton( $loglist->beginLogEventsList() . $logBody . $loglist->endLogEventsList() ) .
-                               $pager->getNavigationBar()
+                                       $this->getRevisionButton(
+                                               $loglist->beginLogEventsList() .
+                                                       $logBody .
+                                                       $loglist->endLogEventsList()
+                                       ) .
+                                       $pager->getNavigationBar()
                        );
                } else {
                        $this->getOutput()->addWikiMsg( 'logempty' );
@@ -161,19 +186,27 @@ class SpecialLog extends SpecialPage {
        }
 
        private function getRevisionButton( $formcontents ) {
-               # If the user doesn't have the ability to delete log entries, don't bother showing him/her the button.
+               # If the user doesn't have the ability to delete log entries,
+               # don't bother showing them the button.
                if ( !$this->getUser()->isAllowedAll( 'deletedhistory', 'deletelogentry' ) ) {
                        return $formcontents;
                }
 
                # Show button to hide log entries
                global $wgScript;
-               $s = Html::openElement( 'form', array( 'action' => $wgScript, 'id' => 'mw-log-deleterevision-submit' ) ) . "\n";
+               $s = Html::openElement(
+                       'form',
+                       array( 'action' => $wgScript, 'id' => 'mw-log-deleterevision-submit' )
+               ) . "\n";
                $s .= Html::hidden( 'title', SpecialPage::getTitleFor( 'Revisiondelete' ) ) . "\n";
                $s .= Html::hidden( 'target', SpecialPage::getTitleFor( 'Log' ) ) . "\n";
                $s .= Html::hidden( 'type', 'logging' ) . "\n";
-               $button = Html::element( 'button',
-                       array( 'type' => 'submit', 'class' => "deleterevision-log-submit mw-log-deleterevision-button" ),
+               $button = Html::element(
+                       'button',
+                       array(
+                               'type' => 'submit',
+                               'class' => "deleterevision-log-submit mw-log-deleterevision-button"
+                       ),
                        $this->msg( 'showhideselectedlogentries' )->text()
                ) . "\n";
                $s .= $button . $formcontents . $button;
index 8c6a88a..7c7771d 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class LonelyPagesPage extends PageQueryPage {
-
        function __construct( $name = 'Lonelypages' ) {
                parent::__construct( $name );
        }
@@ -50,32 +49,43 @@ class LonelyPagesPage extends PageQueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'page', 'pagelinks',
-                                       'templatelinks' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_title' ),
-                       'conds' => array ( 'pl_namespace IS NULL',
-                                       'page_namespace' => MWNamespace::getContentNamespaces(),
-                                       'page_is_redirect' => 0,
-                                       'tl_namespace IS NULL' ),
-                       'join_conds' => array (
-                                       'pagelinks' => array (
-                                               'LEFT JOIN', array (
+               return array(
+                       'tables' => array(
+                               'page', 'pagelinks',
+                               'templatelinks'
+                       ),
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_title'
+                       ),
+                       'conds' => array(
+                               'pl_namespace IS NULL',
+                               'page_namespace' => MWNamespace::getContentNamespaces(),
+                               'page_is_redirect' => 0,
+                               'tl_namespace IS NULL'
+                       ),
+                       'join_conds' => array(
+                               'pagelinks' => array(
+                                       'LEFT JOIN', array(
                                                'pl_namespace = page_namespace',
-                                               'pl_title = page_title' ) ),
-                                       'templatelinks' => array (
-                                               'LEFT JOIN', array (
+                                               'pl_title = page_title'
+                                       )
+                               ),
+                               'templatelinks' => array(
+                                       'LEFT JOIN', array(
                                                'tl_namespace = page_namespace',
-                                               'tl_title = page_title' ) ) )
+                                               'tl_title = page_title'
+                                       )
+                               )
+                       )
                );
        }
 
        function getOrderFields() {
                // For some crazy reason ordering by a constant
                // causes a filesort in MySQL 5
-               if( count( MWNamespace::getContentNamespaces() ) > 1 ) {
+               if ( count( MWNamespace::getContentNamespaces() ) > 1 ) {
                        return array( 'page_namespace', 'page_title' );
                } else {
                        return array( 'page_title' );
index c045f9e..d90d271 100644 (file)
@@ -26,7 +26,6 @@
  * @ingroup SpecialPage
  */
 class LongPagesPage extends ShortPagesPage {
-
        function __construct( $name = 'Longpages' ) {
                parent::__construct( $name );
        }
index c5a109d..7ff5d7b 100644 (file)
@@ -53,16 +53,20 @@ class MIMEsearchPage extends QueryPage {
        public function getQueryInfo() {
                return array(
                        'tables' => array( 'image' ),
-                       'fields' => array( 'namespace' => NS_FILE,
-                                       'title' => 'img_name',
-                                       'value' => 'img_major_mime',
-                                       'img_size',
-                                       'img_width',
-                                       'img_height',
-                                       'img_user_text',
-                                       'img_timestamp' ),
-                       'conds' => array( 'img_major_mime' => $this->major,
-                                       'img_minor_mime' => $this->minor )
+                       'fields' => array(
+                               'namespace' => NS_FILE,
+                               'title' => 'img_name',
+                               'value' => 'img_major_mime',
+                               'img_size',
+                               'img_width',
+                               'img_height',
+                               'img_user_text',
+                               'img_timestamp'
+                       ),
+                       'conds' => array(
+                               'img_major_mime' => $this->major,
+                               'img_minor_mime' => $this->minor
+                       )
                );
        }
 
@@ -74,24 +78,36 @@ class MIMEsearchPage extends QueryPage {
                $this->setHeaders();
                $this->outputHeader();
                $this->getOutput()->addHTML(
-                       Xml::openElement( 'form', array( 'id' => 'specialmimesearch', 'method' => 'get', 'action' => $wgScript ) ) .
-                       Xml::openElement( 'fieldset' ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-                       Xml::element( 'legend', null, $this->msg( 'mimesearch' )->text() ) .
-                       Xml::inputLabel( $this->msg( 'mimetype' )->text(), 'mime', 'mime', 20, $mime ) . ' ' .
-                       Xml::submitButton( $this->msg( 'ilsubmit' )->text() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' )
+                       Xml::openElement(
+                               'form',
+                               array( 'id' => 'specialmimesearch', 'method' => 'get', 'action' => $wgScript )
+                       ) .
+                               Xml::openElement( 'fieldset' ) .
+                               Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+                               Xml::element( 'legend', null, $this->msg( 'mimesearch' )->text() ) .
+                               Xml::inputLabel( $this->msg( 'mimetype' )->text(), 'mime', 'mime', 20, $mime ) .
+                               ' ' .
+                               Xml::submitButton( $this->msg( 'ilsubmit' )->text() ) .
+                               Xml::closeElement( 'fieldset' ) .
+                               Xml::closeElement( 'form' )
                );
 
                list( $this->major, $this->minor ) = File::splitMime( $mime );
+
                if ( $this->major == '' || $this->minor == '' || $this->minor == 'unknown' ||
-                       !self::isValidType( $this->major ) ) {
+                       !self::isValidType( $this->major )
+               ) {
                        return;
                }
+
                parent::execute( $par );
        }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
        function formatResult( $skin, $result ) {
                global $wgContLang;
 
@@ -108,8 +124,13 @@ class MIMEsearchPage extends QueryPage {
                $bytes = htmlspecialchars( $lang->formatSize( $result->img_size ) );
                $dimensions = $this->msg( 'widthheight' )->numParams( $result->img_width,
                        $result->img_height )->escaped();
-               $user = Linker::link( Title::makeTitle( NS_USER, $result->img_user_text ), htmlspecialchars( $result->img_user_text ) );
-               $time = htmlspecialchars( $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() ) );
+               $user = Linker::link(
+                       Title::makeTitle( NS_USER, $result->img_user_text ),
+                       htmlspecialchars( $result->img_user_text )
+               );
+
+               $time = $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() );
+               $time = htmlspecialchars( $time );
 
                return "$download $plink . . $dimensions . . $bytes . . $user . . $time";
        }
@@ -131,6 +152,7 @@ class MIMEsearchPage extends QueryPage {
                        'model',
                        'multipart'
                );
+
                return in_array( $type, $types );
        }
 
index 1476e15..2a86fca 100644 (file)
@@ -52,14 +52,14 @@ class SpecialMergeHistory extends SpecialPage {
                $this->mTargetID = intval( $request->getVal( 'targetID' ) );
                $this->mDestID = intval( $request->getVal( 'destID' ) );
                $this->mTimestamp = $request->getVal( 'mergepoint' );
-               if( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) {
+               if ( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) {
                        $this->mTimestamp = '';
                }
                $this->mComment = $request->getText( 'wpComment' );
 
                $this->mMerge = $request->wasPosted() && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
                // target page
-               if( $this->mSubmitted ) {
+               if ( $this->mSubmitted ) {
                        $this->mTargetObj = Title::newFromURL( $this->mTarget );
                        $this->mDestObj = Title::newFromURL( $this->mDest );
                } else {
@@ -75,7 +75,7 @@ class SpecialMergeHistory extends SpecialPage {
         */
        function preCacheMessages() {
                // Precache various messages
-               if( !isset( $this->message ) ) {
+               if ( !isset( $this->message ) ) {
                        $this->message['last'] = $this->msg( 'last' )->escaped();
                }
        }
@@ -89,20 +89,22 @@ class SpecialMergeHistory extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
 
-               if( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
+               if ( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
                        $this->merge();
+
                        return;
                }
 
                if ( !$this->mSubmitted ) {
                        $this->showMergeForm();
+
                        return;
                }
 
                $errors = array();
                if ( !$this->mTargetObj instanceof Title ) {
                        $errors[] = $this->msg( 'mergehistory-invalid-source' )->parseAsBlock();
-               } elseif( !$this->mTargetObj->exists() ) {
+               } elseif ( !$this->mTargetObj->exists() ) {
                        $errors[] = $this->msg( 'mergehistory-no-source', array( 'parse' ),
                                wfEscapeWikiText( $this->mTargetObj->getPrefixedText() )
                        )->parseAsBlock();
@@ -110,7 +112,7 @@ class SpecialMergeHistory extends SpecialPage {
 
                if ( !$this->mDestObj instanceof Title ) {
                        $errors[] = $this->msg( 'mergehistory-invalid-destination' )->parseAsBlock();
-               } elseif( !$this->mDestObj->exists() ) {
+               } elseif ( !$this->mDestObj->exists() ) {
                        $errors[] = $this->msg( 'mergehistory-no-destination', array( 'parse' ),
                                wfEscapeWikiText( $this->mDestObj->getPrefixedText() )
                        )->parseAsBlock();
@@ -126,7 +128,6 @@ class SpecialMergeHistory extends SpecialPage {
                } else {
                        $this->showHistory();
                }
-
        }
 
        function showMergeForm() {
@@ -138,25 +139,25 @@ class SpecialMergeHistory extends SpecialPage {
                        Xml::openElement( 'form', array(
                                'method' => 'get',
                                'action' => $wgScript ) ) .
-                       '<fieldset>' .
-                       Xml::element( 'legend', array(),
-                               $this->msg( 'mergehistory-box' )->text() ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                       Html::hidden( 'submitted', '1' ) .
-                       Html::hidden( 'mergepoint', $this->mTimestamp ) .
-                       Xml::openElement( 'table' ) .
-                       '<tr>
+                               '<fieldset>' .
+                               Xml::element( 'legend', array(),
+                                       $this->msg( 'mergehistory-box' )->text() ) .
+                               Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+                               Html::hidden( 'submitted', '1' ) .
+                               Html::hidden( 'mergepoint', $this->mTimestamp ) .
+                               Xml::openElement( 'table' ) .
+                               '<tr>
                                <td>' . Xml::label( $this->msg( 'mergehistory-from' )->text(), 'target' ) . '</td>
                                <td>' . Xml::input( 'target', 30, $this->mTarget, array( 'id' => 'target' ) ) . '</td>
                        </tr><tr>
                                <td>' . Xml::label( $this->msg( 'mergehistory-into' )->text(), 'dest' ) . '</td>
                                <td>' . Xml::input( 'dest', 30, $this->mDest, array( 'id' => 'dest' ) ) . '</td>
                        </tr><tr><td>' .
-                       Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) .
-                       '</td></tr>' .
-                       Xml::closeElement( 'table' ) .
-                       '</fieldset>' .
-                       '</form>'
+                               Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) .
+                               '</td></tr>' .
+                               Xml::closeElement( 'table' ) .
+                               '</fieldset>' .
+                               '</form>'
                );
        }
 
@@ -183,40 +184,40 @@ class SpecialMergeHistory extends SpecialPage {
                );
                $out->addHTML( $top );
 
-               if( $haveRevisions ) {
+               if ( $haveRevisions ) {
                        # Format the user-visible controls (comment field, submission button)
                        # in a nice little table
                        $table =
                                Xml::openElement( 'fieldset' ) .
-                               $this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(),
-                                       $this->mDestObj->getPrefixedText() )->parse() .
-                               Xml::openElement( 'table', array( 'id' => 'mw-mergehistory-table' ) ) .
+                                       $this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(),
+                                               $this->mDestObj->getPrefixedText() )->parse() .
+                                       Xml::openElement( 'table', array( 'id' => 'mw-mergehistory-table' ) ) .
                                        '<tr>
                                                <td class="mw-label">' .
-                                                       Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) .
-                                               '</td>
-                                               <td class="mw-input">' .
-                                                       Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
-                                               '</td>
+                                       Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) .
+                                       '</td>
+                                       <td class="mw-input">' .
+                                       Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
+                                       '</td>
                                        </tr>
                                        <tr>
                                                <td>&#160;</td>
                                                <td class="mw-submit">' .
-                                                       Xml::submitButton( $this->msg( 'mergehistory-submit' )->text(), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
-                                               '</td>
+                                       Xml::submitButton( $this->msg( 'mergehistory-submit' )->text(), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
+                                       '</td>
                                        </tr>' .
-                               Xml::closeElement( 'table' ) .
-                               Xml::closeElement( 'fieldset' );
+                                       Xml::closeElement( 'table' ) .
+                                       Xml::closeElement( 'fieldset' );
 
                        $out->addHTML( $table );
                }
 
                $out->addHTML(
                        '<h2 id="mw-mergehistory">' .
-                       $this->msg( 'mergehistory-list' )->escaped() . "</h2>\n"
+                               $this->msg( 'mergehistory-list' )->escaped() . "</h2>\n"
                );
 
-               if( $haveRevisions ) {
+               if ( $haveRevisions ) {
                        $out->addHTML( $revisions->getNavigationBar() );
                        $out->addHTML( '<ul>' );
                        $out->addHTML( $revisions->getBody() );
@@ -261,14 +262,14 @@ class SpecialMergeHistory extends SpecialPage {
                        array(),
                        array( 'oldid' => $rev->getId() )
                );
-               if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
                        $pageLink = '<span class="history-deleted">' . $pageLink . '</span>';
                }
 
                # Last link
-               if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                        $last = $this->message['last'];
-               } elseif( isset( $this->prevId[$row->rev_id] ) ) {
+               } elseif ( isset( $this->prevId[$row->rev_id] ) ) {
                        $last = Linker::linkKnown(
                                $rev->getTitle(),
                                $this->message['last'],
@@ -283,7 +284,7 @@ class SpecialMergeHistory extends SpecialPage {
                $userLink = Linker::revUserTools( $rev );
 
                $size = $row->rev_len;
-               if( !is_null( $size ) ) {
+               if ( !is_null( $size ) ) {
                        $stxt = Linker::formatRevisionSize( $size );
                }
                $comment = Linker::revComment( $rev );
@@ -298,10 +299,10 @@ class SpecialMergeHistory extends SpecialPage {
                # keep it consistent...
                $targetTitle = Title::newFromID( $this->mTargetID );
                $destTitle = Title::newFromID( $this->mDestID );
-               if( is_null( $targetTitle ) || is_null( $destTitle ) ) {
+               if ( is_null( $targetTitle ) || is_null( $destTitle ) ) {
                        return false; // validate these
                }
-               if( $targetTitle->getArticleID() == $destTitle->getArticleID() ) {
+               if ( $targetTitle->getArticleID() == $destTitle->getArticleID() ) {
                        return false;
                }
                # Verify that this timestamp is valid
@@ -317,8 +318,9 @@ class SpecialMergeHistory extends SpecialPage {
                        __METHOD__
                );
                # Destination page must exist with revisions
-               if( !$maxtimestamp ) {
+               if ( !$maxtimestamp ) {
                        $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+
                        return false;
                }
                # Get the latest timestamp of the source
@@ -329,12 +331,13 @@ class SpecialMergeHistory extends SpecialPage {
                        __METHOD__
                );
                # $this->mTimestamp must be older than $maxtimestamp
-               if( $this->mTimestamp >= $maxtimestamp ) {
+               if ( $this->mTimestamp >= $maxtimestamp ) {
                        $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+
                        return false;
                }
                # Update the revisions
-               if( $this->mTimestamp ) {
+               if ( $this->mTimestamp ) {
                        $timewhere = "rev_timestamp <= {$this->mTimestamp}";
                        $timestampLimit = wfTimestamp( TS_MW, $this->mTimestamp );
                } else {
@@ -354,12 +357,12 @@ class SpecialMergeHistory extends SpecialPage {
                $haveRevisions = $dbw->selectField(
                        'revision',
                        'rev_timestamp',
-                       array( 'rev_page' => $this->mTargetID  ),
+                       array( 'rev_page' => $this->mTargetID ),
                        __METHOD__,
                        array( 'FOR UPDATE' )
                );
-               if( !$haveRevisions ) {
-                       if( $this->mComment ) {
+               if ( !$haveRevisions ) {
+                       if ( $this->mComment ) {
                                $comment = $this->msg(
                                        'mergehistory-comment',
                                        $targetTitle->getPrefixedText(),
@@ -380,8 +383,8 @@ class SpecialMergeHistory extends SpecialPage {
                        if ( $redirectContent ) {
                                $redirectPage = WikiPage::factory( $targetTitle );
                                $redirectRevision = new Revision( array(
-                                       'title'   => $targetTitle,
-                                       'page'    => $this->mTargetID,
+                                       'title' => $targetTitle,
+                                       'page' => $this->mTargetID,
                                        'comment' => $comment,
                                        'content' => $redirectContent ) );
                                $redirectRevision->insertOn( $dbw );
@@ -392,9 +395,9 @@ class SpecialMergeHistory extends SpecialPage {
                                $dbw->delete( 'pagelinks', array( 'pl_from' => $this->mDestID ), __METHOD__ );
                                $dbw->insert( 'pagelinks',
                                        array(
-                                               'pl_from'      => $this->mDestID,
+                                               'pl_from' => $this->mDestID,
                                                'pl_namespace' => $destTitle->getNamespace(),
-                                               'pl_title'     => $destTitle->getDBkey() ),
+                                               'pl_title' => $destTitle->getDBkey() ),
                                        __METHOD__
                                );
                        } else {
@@ -405,8 +408,9 @@ class SpecialMergeHistory extends SpecialPage {
                }
                $destTitle->invalidateCache(); // update histories
                # Check if this did anything
-               if( !$count ) {
+               if ( !$count ) {
                        $this->getOutput()->addWikiMsg( 'mergehistory-fail' );
+
                        return false;
                }
                # Update our logs
@@ -462,9 +466,9 @@ class MergeHistoryPager extends ReverseChronologicalPager {
                        $batch->addObj( Title::makeTitleSafe( NS_USER_TALK, $row->user_name ) );
 
                        $rev_id = isset( $rev_id ) ? $rev_id : $row->rev_id;
-                       if( $rev_id > $row->rev_id ) {
+                       if ( $rev_id > $row->rev_id ) {
                                $this->mForm->prevId[$rev_id] = $row->rev_id;
-                       } elseif( $rev_id < $row->rev_id ) {
+                       } elseif ( $rev_id < $row->rev_id ) {
                                $this->mForm->prevId[$row->rev_id] = $rev_id;
                        }
 
@@ -475,6 +479,7 @@ class MergeHistoryPager extends ReverseChronologicalPager {
                $this->mResult->seek( 0 );
 
                wfProfileOut( __METHOD__ );
+
                return '';
        }
 
@@ -486,10 +491,11 @@ class MergeHistoryPager extends ReverseChronologicalPager {
                $conds = $this->mConds;
                $conds['rev_page'] = $this->articleID;
                $conds[] = "rev_timestamp < {$this->maxTimestamp}";
+
                return array(
                        'tables' => array( 'revision', 'page', 'user' ),
                        'fields' => array_merge( Revision::selectFields(), Revision::selectUserFields() ),
-                       'conds'  => $conds,
+                       'conds' => $conds,
                        'join_conds' => array(
                                'page' => Revision::pageJoinCond(),
                                'user' => Revision::userJoinCond() )
index 11f26bd..9b67f34 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class MostcategoriesPage extends QueryPage {
-
        function __construct( $name = 'Mostcategories' ) {
                parent::__construct( $name );
        }
@@ -44,22 +43,30 @@ class MostcategoriesPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'categorylinks', 'page' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'COUNT(*)' ),
-                       'conds' => array ( 'page_namespace' => MWNamespace::getContentNamespaces() ),
-                       'options' => array ( 'HAVING' => 'COUNT(*) > 1',
-                               'GROUP BY' => array( 'page_namespace', 'page_title' ) ),
-                       'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
-                                       'page_id = cl_from' ) )
+               return array(
+                       'tables' => array( 'categorylinks', 'page' ),
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'COUNT(*)'
+                       ),
+                       'conds' => array( 'page_namespace' => MWNamespace::getContentNamespaces() ),
+                       'options' => array(
+                               'HAVING' => 'COUNT(*) > 1',
+                               'GROUP BY' => array( 'page_namespace', 'page_title' )
+                       ),
+                       'join_conds' => array(
+                               'page' => array(
+                                       'LEFT JOIN',
+                                       'page_id = cl_from'
+                               )
+                       )
                );
        }
 
        /**
-        * @param $db DatabaseBase
-        * @param $res
+        * @param DatabaseBase $db
+        * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                # There's no point doing a batch check if we aren't caching results;
@@ -78,15 +85,22 @@ class MostcategoriesPage extends QueryPage {
        }
 
        /**
-        * @param $skin Skin
-        * @param $result
+        * @param Skin $skin
+        * @param object $result Result row
         * @return string
         */
        function formatResult( $skin, $result ) {
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( !$title ) {
-                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+                       return Html::element(
+                               'span',
+                               array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription(
+                                       $this->getContext(),
+                                       $result->namespace,
+                                       $result->title
+                               )
+                       );
                }
 
                if ( $this->isCached() ) {
index 78b2d91..98d8da3 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class MostimagesPage extends ImageQueryPage {
-
        function __construct( $name = 'Mostimages' ) {
                parent::__construct( $name );
        }
@@ -44,13 +43,17 @@ class MostimagesPage extends ImageQueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'imagelinks' ),
-                       'fields' => array ( 'namespace' => NS_FILE,
-                                       'title' => 'il_to',
-                                       'value' => 'COUNT(*)' ),
-                       'options' => array ( 'GROUP BY' => 'il_to',
-                                       'HAVING' => 'COUNT(*) > 1' )
+               return array(
+                       'tables' => array( 'imagelinks' ),
+                       'fields' => array(
+                               'namespace' => NS_FILE,
+                               'title' => 'il_to',
+                               'value' => 'COUNT(*)'
+                       ),
+                       'options' => array(
+                               'GROUP BY' => 'il_to',
+                               'HAVING' => 'COUNT(*) > 1'
+                       )
                );
        }
 
index 574a9af..98dd68e 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class MostinterwikisPage extends QueryPage {
-
        function __construct( $name = 'Mostinterwikis' ) {
                parent::__construct( $name );
        }
@@ -44,24 +43,24 @@ class MostinterwikisPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array (
+               return array(
+                       'tables' => array(
                                'langlinks',
                                'page'
-                       ), 'fields' => array (
+                       ), 'fields' => array(
                                'namespace' => 'page_namespace',
                                'title' => 'page_title',
                                'value' => 'COUNT(*)'
-                       ), 'conds' => array (
+                       ), 'conds' => array(
                                'page_namespace' => MWNamespace::getContentNamespaces()
-                       ), 'options' => array (
+                       ), 'options' => array(
                                'HAVING' => 'COUNT(*) > 1',
-                               'GROUP BY' => array (
+                               'GROUP BY' => array(
                                        'page_namespace',
                                        'page_title'
                                )
-                       ), 'join_conds' => array (
-                               'page' => array (
+                       ), 'join_conds' => array(
+                               'page' => array(
                                        'LEFT JOIN',
                                        'page_id = ll_from'
                                )
@@ -72,8 +71,8 @@ class MostinterwikisPage extends QueryPage {
        /**
         * Pre-fill the link cache
         *
-        * @param $db DatabaseBase
-        * @param $res
+        * @param DatabaseBase $db
+        * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                # There's no point doing a batch check if we aren't caching results;
@@ -100,8 +99,15 @@ class MostinterwikisPage extends QueryPage {
        function formatResult( $skin, $result ) {
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( !$title ) {
-                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+                       return Html::element(
+                               'span',
+                               array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription(
+                                       $this->getContext(),
+                                       $result->namespace,
+                                       $result->title
+                               )
+                       );
                }
 
                if ( $this->isCached() ) {
index 4b6e567..37593bf 100644 (file)
@@ -31,7 +31,6 @@
  * @ingroup SpecialPage
  */
 class MostlinkedPage extends QueryPage {
-
        function __construct( $name = 'Mostlinked' ) {
                parent::__construct( $name );
        }
@@ -45,33 +44,47 @@ class MostlinkedPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'pagelinks', 'page' ),
-                       'fields' => array ( 'namespace' => 'pl_namespace',
-                                       'title' => 'pl_title',
-                                       'value' => 'COUNT(*)',
-                                       'page_namespace' ),
-                       'options' => array ( 'HAVING' => 'COUNT(*) > 1',
-                               'GROUP BY' => array( 'pl_namespace', 'pl_title',
-                                               'page_namespace' ) ),
-                       'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
-                                       array ( 'page_namespace = pl_namespace',
-                                               'page_title = pl_title' ) ) )
+               return array(
+                       'tables' => array( 'pagelinks', 'page' ),
+                       'fields' => array(
+                               'namespace' => 'pl_namespace',
+                               'title' => 'pl_title',
+                               'value' => 'COUNT(*)',
+                               'page_namespace'
+                       ),
+                       'options' => array(
+                               'HAVING' => 'COUNT(*) > 1',
+                               'GROUP BY' => array(
+                                       'pl_namespace', 'pl_title',
+                                       'page_namespace'
+                               )
+                       ),
+                       'join_conds' => array(
+                               'page' => array(
+                                       'LEFT JOIN',
+                                       array(
+                                               'page_namespace = pl_namespace',
+                                               'page_title = pl_title'
+                                       )
+                               )
+                       )
                );
        }
 
        /**
         * Pre-fill the link cache
         *
-        * @param $db DatabaseBase
-        * @param $res
+        * @param DatabaseBase $db
+        * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                if ( $res->numRows() > 0 ) {
                        $linkBatch = new LinkBatch();
+
                        foreach ( $res as $row ) {
                                $linkBatch->add( $row->namespace, $row->title );
                        }
+
                        $res->seek( 0 );
                        $linkBatch->execute();
                }
@@ -86,25 +99,37 @@ class MostlinkedPage extends QueryPage {
         */
        function makeWlhLink( $title, $caption ) {
                $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedDBkey() );
+
                return Linker::linkKnown( $wlh, $caption );
        }
 
        /**
-        * Make links to the page corresponding to the item, and the "what links here" page for it
+        * Make links to the page corresponding to the item,
+        * and the "what links here" page for it
         *
-        * @param $skin Skin to be used
-        * @param $result Result row
+        * @param Skin $skin Skin to be used
+        * @param object $result Result row
         * @return string
         */
        function formatResult( $skin, $result ) {
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( !$title ) {
-                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+                       return Html::element(
+                               'span',
+                               array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription(
+                                       $this->getContext(),
+                                       $result->namespace,
+                                       $result->title )
+                       );
                }
+
                $link = Linker::link( $title );
-               $wlh = $this->makeWlhLink( $title,
-                       $this->msg( 'nlinks' )->numParams( $result->value )->escaped() );
+               $wlh = $this->makeWlhLink(
+                       $title,
+                       $this->msg( 'nlinks' )->numParams( $result->value )->escaped()
+               );
+
                return $this->getLanguage()->specialList( $link, $wlh );
        }
 
index a1bce45..0d4641b 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class MostlinkedCategoriesPage extends QueryPage {
-
        function __construct( $name = 'Mostlinkedcategories' ) {
                parent::__construct( $name );
        }
@@ -40,11 +39,11 @@ class MostlinkedCategoriesPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'category' ),
-                       'fields' => array ( 'title' => 'cat_title',
-                                       'namespace' => NS_CATEGORY,
-                                       'value' => 'cat_pages' ),
+               return array(
+                       'tables' => array( 'category' ),
+                       'fields' => array( 'title' => 'cat_title',
+                               'namespace' => NS_CATEGORY,
+                               'value' => 'cat_pages' ),
                );
        }
 
@@ -55,8 +54,8 @@ class MostlinkedCategoriesPage extends QueryPage {
        /**
         * Fetch user page links and cache their existence
         *
-        * @param $db DatabaseBase
-        * @param $res DatabaseResult
+        * @param DatabaseBase $db
+        * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                if ( !$res->numRows() ) {
@@ -74,8 +73,8 @@ class MostlinkedCategoriesPage extends QueryPage {
        }
 
        /**
-        * @param $skin Skin
-        * @param  $result
+        * @param Skin $skin
+        * @param object $result Result row
         * @return string
         */
        function formatResult( $skin, $result ) {
@@ -83,15 +82,20 @@ class MostlinkedCategoriesPage extends QueryPage {
 
                $nt = Title::makeTitleSafe( NS_CATEGORY, $result->title );
                if ( !$nt ) {
-                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-                               Linker::getInvalidTitleDescription( $this->getContext(), NS_CATEGORY, $result->title ) );
+                       return Html::element(
+                               'span',
+                               array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription(
+                                       $this->getContext(),
+                                       NS_CATEGORY,
+                                       $result->title )
+                       );
                }
 
                $text = $wgContLang->convert( $nt->getText() );
-
                $plink = Linker::link( $nt, htmlspecialchars( $text ) );
-
                $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
+
                return $this->getLanguage()->specialList( $plink, $nlinks );
        }
 
index 506e6b2..c90acb1 100644 (file)
@@ -29,7 +29,6 @@
  * @ingroup SpecialPage
  */
 class MostlinkedTemplatesPage extends QueryPage {
-
        function __construct( $name = 'Mostlinkedtemplates' ) {
                parent::__construct( $name );
        }
@@ -62,12 +61,14 @@ class MostlinkedTemplatesPage extends QueryPage {
        }
 
        public function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'templatelinks' ),
-                       'fields' => array ( 'namespace' => 'tl_namespace',
-                                       'title' => 'tl_title',
-                                       'value' => 'COUNT(*)' ),
-                       'conds' => array ( 'tl_namespace' => NS_TEMPLATE ),
+               return array(
+                       'tables' => array( 'templatelinks' ),
+                       'fields' => array(
+                               'namespace' => 'tl_namespace',
+                               'title' => 'tl_title',
+                               'value' => 'COUNT(*)'
+                       ),
+                       'conds' => array( 'tl_namespace' => NS_TEMPLATE ),
                        'options' => array( 'GROUP BY' => array( 'tl_namespace', 'tl_title' ) )
                );
        }
@@ -76,7 +77,7 @@ class MostlinkedTemplatesPage extends QueryPage {
         * Pre-cache page existence to speed up link generation
         *
         * @param $db DatabaseBase connection
-        * @param $res ResultWrapper
+        * @param ResultWrapper $res
         */
        public function preprocessResults( $db, $res ) {
                if ( !$res->numRows() ) {
@@ -95,15 +96,22 @@ class MostlinkedTemplatesPage extends QueryPage {
        /**
         * Format a result row
         *
-        * @param $skin Skin to use for UI elements
-        * @param $result Result row
-        * @return String
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
         */
        public function formatResult( $skin, $result ) {
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( !$title ) {
-                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+                       return Html::element(
+                               'span',
+                               array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription(
+                                       $this->getContext(),
+                                       $result->namespace,
+                                       $result->title
+                               )
+                       );
                }
 
                return $this->getLanguage()->specialList(
@@ -115,13 +123,14 @@ class MostlinkedTemplatesPage extends QueryPage {
        /**
         * Make a "what links here" link for a given title
         *
-        * @param $title Title to make the link for
-        * @param $result Result row
+        * @param Title $title Title to make the link for
+        * @param object $result Result row
         * @return String
         */
        private function makeWlhLink( $title, $result ) {
                $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
                $label = $this->msg( 'ntransclusions' )->numParams( $result->value )->escaped();
+
                return Linker::link( $wlh, $label );
        }
 
index 4adb037..2ba3c06 100644 (file)
  * @ingroup SpecialPage
  */
 class MovePageForm extends UnlistedSpecialPage {
-
        /**
+        * Objects
         * @var Title
         */
-       var $oldTitle, $newTitle; # Objects
-       var $reason; # Text input
-       var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared; # Checks
+       var $oldTitle, $newTitle;
+       // Text input
+       var $reason;
+       // Checks
+       var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared;
 
        private $watch = false;
 
@@ -55,10 +57,10 @@ class MovePageForm extends UnlistedSpecialPage {
                $oldTitleText = $request->getVal( 'wpOldTitle', $target );
                $this->oldTitle = Title::newFromText( $oldTitleText );
 
-               if( is_null( $this->oldTitle ) ) {
+               if ( is_null( $this->oldTitle ) ) {
                        throw new ErrorPageError( 'notargettitle', 'notargettext' );
                }
-               if( !$this->oldTitle->exists() ) {
+               if ( !$this->oldTitle->exists() ) {
                        throw new ErrorPageError( 'nopagetitle', 'nopagetext' );
                }
 
@@ -93,7 +95,8 @@ class MovePageForm extends UnlistedSpecialPage {
                $this->watch = $request->getCheck( 'wpWatch' ) && $user->isLoggedIn();
 
                if ( 'submit' == $request->getVal( 'action' ) && $request->wasPosted()
-                       && $user->matchEditToken( $request->getVal( 'wpEditToken' ) ) ) {
+                       && $user->matchEditToken( $request->getVal( 'wpEditToken' ) )
+               ) {
                        $this->doSubmit();
                } else {
                        $this->showForm( array() );
@@ -129,7 +132,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        # link, check for validity. We can then show some diagnostic
                        # information and save a click.
                        $newerr = $this->oldTitle->isValidMoveOperation( $newTitle );
-                       if( is_array( $newerr ) ) {
+                       if ( is_array( $newerr ) ) {
                                $err = $newerr;
                        }
                }
@@ -146,16 +149,26 @@ class MovePageForm extends UnlistedSpecialPage {
                                <tr>
                                        <td></td>
                                        <td class='mw-input'>" .
-                                               Xml::checkLabel( $this->msg( 'delete_and_move_confirm' )->text(), 'wpConfirm', 'wpConfirm' ) .
-                                       "</td>
+                               Xml::checkLabel(
+                                       $this->msg( 'delete_and_move_confirm' )->text(),
+                                       'wpConfirm',
+                                       'wpConfirm'
+                               ) .
+                               "</td>
                                </tr>";
                        $err = array();
                } else {
                        if ( $this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
-                               $out->wrapWikiMsg( "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>", 'moveuserpage-warning' );
+                               $out->wrapWikiMsg(
+                                       "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>",
+                                       'moveuserpage-warning'
+                               );
                        }
-                       $out->addWikiMsg( $wgFixDoubleRedirects ? 'movepagetext' :
-                               'movepagetext-noredirectfixer' );
+
+                       $out->addWikiMsg( $wgFixDoubleRedirects ?
+                               'movepagetext' :
+                               'movepagetext-noredirectfixer'
+                       );
                        $movepagebtn = $this->msg( 'movepagebtn' )->text();
                        $submitVar = 'wpMove';
                        $confirm = false;
@@ -205,6 +218,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        if ( count( $err ) == 1 ) {
                                $errMsg = $err[0];
                                $errMsgName = array_shift( $errMsg );
+
                                if ( $errMsgName == 'hookaborted' ) {
                                        $out->addHTML( "<p>{$errMsg[0]}</p>\n" );
                                } else {
@@ -212,8 +226,9 @@ class MovePageForm extends UnlistedSpecialPage {
                                }
                        } else {
                                $errStr = array();
-                               foreach( $err as $errMsg ) {
-                                       if( $errMsg[0] == 'hookaborted' ) {
+
+                               foreach ( $err as $errMsg ) {
+                                       if ( $errMsg[0] == 'hookaborted' ) {
                                                $errStr[] = $errMsg[1];
                                        } else {
                                                $errMsgName = array_shift( $errMsg );
@@ -238,7 +253,13 @@ class MovePageForm extends UnlistedSpecialPage {
                        }
                        $out->addHTML( "<div class='mw-warning-with-logexcerpt'>\n" );
                        $out->addWikiMsg( $noticeMsg );
-                       LogEventsList::showLogExtract( $out, 'protect', $this->oldTitle, '', array( 'lim' => 1 ) );
+                       LogEventsList::showLogExtract(
+                               $out,
+                               'protect',
+                               $this->oldTitle,
+                               '',
+                               array( 'lim' => 1 )
+                       );
                        $out->addHTML( "</div>\n" );
                }
 
@@ -256,13 +277,20 @@ class MovePageForm extends UnlistedSpecialPage {
                $handler = ContentHandler::getForTitle( $this->oldTitle );
 
                $out->addHTML(
-                       Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->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' ) ) .
-                       "<tr>
+                       Xml::openElement(
+                               'form',
+                               array(
+                                       'method' => 'post',
+                                       'action' => $this->getTitle()->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' ) ) .
+                               "<tr>
                                <td class='mw-label'>" .
-                                       $this->msg( 'movearticle' )->escaped() .
+                               $this->msg( 'movearticle' )->escaped() .
                                "</td>
                                <td class='mw-input'>
                                        <strong>{$oldTitleLink}</strong>
@@ -270,41 +298,54 @@ class MovePageForm extends UnlistedSpecialPage {
                        </tr>
                        <tr>
                                <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'newtitle' )->text(), 'wpNewTitleMain' ) .
+                               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(
+                               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() ) .
+                                               'maxlength' => 255
+                                       )
+                               ) .
+                               Html::hidden( 'wpOldTitle', $this->oldTitle->getPrefixedText() ) .
                                "</td>
                        </tr>
                        <tr>
                                <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
+                               Xml::label( $this->msg( 'movereason' )->text(), 'wpReason' ) .
                                "</td>
                                <td class='mw-input'>" .
-                                       Html::element( 'textarea', array( 'name' => 'wpReason', 'id' => 'wpReason', 'cols' => 60, 'rows' => 2,
-                                       'maxlength' => 200 ), $this->reason ) .
+                                       Xml::input( 'wpReason', 60, $this->reason, array(
+                                               'type' => 'text',
+                                               'id' => 'wpReason',
+                                               'maxlength' => 200,
+                                       ) ) .
                                "</td>
                        </tr>"
                );
 
-               if( $considerTalk ) {
+               if ( $considerTalk ) {
                        $out->addHTML( "
                                <tr>
                                        <td></td>
                                        <td class='mw-input'>" .
-                                               Xml::checkLabel( $this->msg( 'movetalk' )->text(), 'wpMovetalk', 'wpMovetalk', $this->moveTalk ) .
+                                       Xml::checkLabel(
+                                               $this->msg( 'movetalk' )->text(),
+                                               'wpMovetalk',
+                                               'wpMovetalk',
+                                               $this->moveTalk
+                                       ) .
                                        "</td>
                                </tr>"
                        );
@@ -315,8 +356,12 @@ class MovePageForm extends UnlistedSpecialPage {
                                <tr>
                                        <td></td>
                                        <td class='mw-input' >" .
-                                               Xml::checkLabel( $this->msg( 'move-leave-redirect' )->text(), 'wpLeaveRedirect',
-                                                       'wpLeaveRedirect', $this->leaveRedirect ) .
+                                       Xml::checkLabel(
+                                               $this->msg( 'move-leave-redirect' )->text(),
+                                               'wpLeaveRedirect',
+                                               'wpLeaveRedirect',
+                                               $this->leaveRedirect
+                                       ) .
                                        "</td>
                                </tr>"
                        );
@@ -327,32 +372,36 @@ class MovePageForm extends UnlistedSpecialPage {
                                <tr>
                                        <td></td>
                                        <td class='mw-input' >" .
-                                               Xml::checkLabel( $this->msg( 'fix-double-redirects' )->text(), 'wpFixRedirects',
-                                                       'wpFixRedirects', $this->fixRedirects ) .
+                                       Xml::checkLabel(
+                                               $this->msg( 'fix-double-redirects' )->text(),
+                                               'wpFixRedirects',
+                                               'wpFixRedirects',
+                                               $this->fixRedirects
+                                       ) .
                                        "</td>
                                </tr>"
                        );
                }
 
-               if( $canMoveSubpage ) {
+               if ( $canMoveSubpage ) {
                        $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' )
+                                       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( $wgMaximumMovedPages )->params( $wgMaximumMovedPages )->parse()
-                               ) .
+                                       ) .
                                        "</td>
                                </tr>"
                        );
@@ -361,14 +410,19 @@ class MovePageForm extends UnlistedSpecialPage {
                $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() ) {
+               if ( $user->isLoggedIn() ) {
                        $out->addHTML( "
                        <tr>
                                <td></td>
                                <td class='mw-input'>" .
-                                       Xml::checkLabel( $this->msg( 'move-watch' )->text(), 'wpWatch', 'watch', $watchChecked ) .
+                               Xml::checkLabel(
+                                       $this->msg( 'move-watch' )->text(),
+                                       'wpWatch',
+                                       'watch',
+                                       $watchChecked
+                               ) .
                                "</td>
-                       </tr>");
+                       </tr>" );
                }
 
                $out->addHTML( "
@@ -376,19 +430,18 @@ class MovePageForm extends UnlistedSpecialPage {
                        <tr>
                                <td>&#160;</td>
                                <td class='mw-submit'>" .
-                                       Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
+                               Xml::submitButton( $movepagebtn, array( 'name' => $submitVar ) ) .
                                "</td>
                        </tr>" .
-                       Xml::closeElement( 'table' ) .
-                       Html::hidden( 'wpEditToken', $user->getEditToken() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' ) .
-                       "\n"
+                               Xml::closeElement( 'table' ) .
+                               Html::hidden( 'wpEditToken', $user->getEditToken() ) .
+                               Xml::closeElement( 'fieldset' ) .
+                               Xml::closeElement( 'form' ) .
+                               "\n"
                );
 
                $this->showLogFragment( $this->oldTitle );
                $this->showSubpages( $this->oldTitle );
-
        }
 
        function doSubmit() {
@@ -406,6 +459,7 @@ class MovePageForm extends UnlistedSpecialPage {
                # don't allow moving to pages with # in
                if ( !$nt || $nt->getFragment() != '' ) {
                        $this->showForm( array( array( 'badtitletext' ) ) );
+
                        return;
                }
 
@@ -413,11 +467,11 @@ class MovePageForm extends UnlistedSpecialPage {
                if ( $nt->getNamespace() == NS_FILE
                        && !( $this->moveOverShared && $user->isAllowed( 'reupload-shared' ) )
                        && !RepoGroup::singleton()->getLocalRepo()->findFile( $nt )
-                       && wfFindFile( $nt ) )
-               {
+                       && wfFindFile( $nt )
+               {
                        $this->showForm( array( array( 'file-exists-sharedrepo' ) ) );
-                       return;
 
+                       return;
                }
 
                # Delete to make way if requested
@@ -426,6 +480,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        if ( count( $permErrors ) ) {
                                # Only show the first error
                                $this->showForm( $permErrors );
+
                                return;
                        }
 
@@ -444,6 +499,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        $deleteStatus = $page->doDeleteArticleReal( $reason, false, 0, true, $error, $user );
                        if ( !$deleteStatus->isGood() ) {
                                $this->showForm( $deleteStatus->getErrorsArray() );
+
                                return;
                        }
                }
@@ -462,6 +518,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $error = $ot->moveTo( $nt, true, $this->reason, $createRedirect );
                if ( $error !== true ) {
                        $this->showForm( $error );
+
                        return;
                }
 
@@ -502,7 +559,7 @@ class MovePageForm extends UnlistedSpecialPage {
                # Now we move extra pages we've been asked to move: subpages and talk
                # pages.  First, if the old page or the new page is a talk page, we
                # can't move any talk pages: cancel that.
-               if( $ot->isTalkPage() || $nt->isTalkPage() ) {
+               if ( $ot->isTalkPage() || $nt->isTalkPage() ) {
                        $this->moveTalk = false;
                }
 
@@ -524,24 +581,26 @@ class MovePageForm extends UnlistedSpecialPage {
 
                // @todo FIXME: Use Title::moveSubpages() here
                $dbr = wfGetDB( DB_MASTER );
-               if( $this->moveSubpages && (
+               if ( $this->moveSubpages && (
                        MWNamespace::hasSubpages( $nt->getNamespace() ) || (
                                $this->moveTalk &&
-                               MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
+                                       MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
                        )
                ) ) {
                        $conds = array(
                                'page_title' . $dbr->buildLike( $ot->getDBkey() . '/', $dbr->anyString() )
-                                       .' OR page_title = ' . $dbr->addQuotes( $ot->getDBkey() )
+                                       . ' OR page_title = ' . $dbr->addQuotes( $ot->getDBkey() )
                        );
                        $conds['page_namespace'] = array();
-                       if( MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
+                       if ( MWNamespace::hasSubpages( $nt->getNamespace() ) ) {
                                $conds['page_namespace'][] = $ot->getNamespace();
                        }
-                       if( $this->moveTalk && MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() ) ) {
+                       if ( $this->moveTalk &&
+                               MWNamespace::hasSubpages( $nt->getTalkPage()->getNamespace() )
+                       ) {
                                $conds['page_namespace'][] = $ot->getTalkPage()->getNamespace();
                        }
-               } elseif( $this->moveTalk ) {
+               } elseif ( $this->moveTalk ) {
                        $conds = array(
                                'page_namespace' => $ot->getTalkPage()->getNamespace(),
                                'page_title' => $ot->getDBkey()
@@ -552,7 +611,7 @@ class MovePageForm extends UnlistedSpecialPage {
                }
 
                $extraPages = array();
-               if( !is_null( $conds ) ) {
+               if ( !is_null( $conds ) ) {
                        $extraPages = TitleArray::newFromResult(
                                $dbr->select( 'page',
                                        array( 'page_id', 'page_namespace', 'page_title' ),
@@ -564,29 +623,31 @@ class MovePageForm extends UnlistedSpecialPage {
 
                $extraOutput = array();
                $count = 1;
-               foreach( $extraPages as $oldSubpage ) {
-                       if( $ot->equals( $oldSubpage ) ) {
+               foreach ( $extraPages as $oldSubpage ) {
+                       if ( $ot->equals( $oldSubpage ) ) {
                                # Already did this one.
                                continue;
                        }
 
                        $newPageName = preg_replace(
-                               '#^'.preg_quote( $ot->getDBkey(), '#' ).'#',
+                               '#^' . preg_quote( $ot->getDBkey(), '#' ) . '#',
                                StringUtils::escapeRegexReplacement( $nt->getDBkey() ), # bug 21234
                                $oldSubpage->getDBkey()
                        );
-                       if( $oldSubpage->isTalkPage() ) {
+
+                       if ( $oldSubpage->isTalkPage() ) {
                                $newNs = $nt->getTalkPage()->getNamespace();
                        } else {
                                $newNs = $nt->getSubjectPage()->getNamespace();
                        }
+
                        # Bug 14385: we need makeTitleSafe because the new page names may
                        # be longer than 255 characters.
                        $newSubpage = Title::makeTitleSafe( $newNs, $newPageName );
-                       if( !$newSubpage ) {
+                       if ( !$newSubpage ) {
                                $oldLink = Linker::linkKnown( $oldSubpage );
-                               $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink
-                                       )->params( Title::makeName( $newNs, $newPageName ) )->escaped();
+                               $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink     )
+                                       ->params( Title::makeName( $newNs, $newPageName ) )->escaped();
                                continue;
                        }
 
@@ -596,7 +657,8 @@ class MovePageForm extends UnlistedSpecialPage {
                                $extraOutput[] = $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped();
                        } else {
                                $success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect );
-                               if( $success === true ) {
+
+                               if ( $success === true ) {
                                        if ( $this->fixRedirects ) {
                                                DoubleRedirectJob::fixRedirects( 'move', $oldSubpage, $newSubpage );
                                        }
@@ -606,10 +668,12 @@ class MovePageForm extends UnlistedSpecialPage {
                                                array(),
                                                array( 'redirect' => 'no' )
                                        );
+
                                        $newLink = Linker::linkKnown( $newSubpage );
                                        $extraOutput[] = $this->msg( 'movepage-page-moved' )->rawParams( $oldLink, $newLink )->escaped();
                                        ++$count;
-                                       if( $count >= $wgMaximumMovedPages ) {
+
+                                       if ( $count >= $wgMaximumMovedPages ) {
                                                $extraOutput[] = $this->msg( 'movepage-max-pages' )->numParams( $wgMaximumMovedPages )->escaped();
                                                break;
                                        }
@@ -619,15 +683,14 @@ class MovePageForm extends UnlistedSpecialPage {
                                        $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped();
                                }
                        }
-
                }
 
-               if( $extraOutput !== array() ) {
+               if ( $extraOutput !== array() ) {
                        $out->addHTML( "<ul>\n<li>" . implode( "</li>\n<li>", $extraOutput ) . "</li>\n</ul>" );
                }
 
                # Deal with watches (we don't watch subpages)
-               if( $this->watch && $user->isLoggedIn() ) {
+               if ( $this->watch && $user->isLoggedIn() ) {
                        $user->addWatch( $ot );
                        $user->addWatch( $nt );
                } else {
@@ -638,7 +701,7 @@ class MovePageForm extends UnlistedSpecialPage {
                # Re-clear the file redirect cache, which may have been polluted by
                # parsing in messages above. See CR r56745.
                # @todo FIXME: Needs a more robust solution inside FileRepo.
-               if( $ot->getNamespace() == NS_FILE ) {
+               if ( $ot->getNamespace() == NS_FILE ) {
                        RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $ot );
                }
        }
@@ -651,8 +714,9 @@ class MovePageForm extends UnlistedSpecialPage {
        }
 
        function showSubpages( $title ) {
-               if( !MWNamespace::hasSubpages( $title->getNamespace() ) )
+               if ( !MWNamespace::hasSubpages( $title->getNamespace() ) ) {
                        return;
+               }
 
                $subpages = $title->getSubpages();
                $count = $subpages instanceof TitleArray ? $subpages->count() : 0;
@@ -663,13 +727,14 @@ class MovePageForm extends UnlistedSpecialPage {
                # No subpages.
                if ( $count == 0 ) {
                        $out->addWikiMsg( 'movenosubpage' );
+
                        return;
                }
 
                $out->addWikiMsg( 'movesubpagetext', $this->getLanguage()->formatNum( $count ) );
                $out->addHTML( "<ul>\n" );
 
-               foreach( $subpages as $subpage ) {
+               foreach ( $subpages as $subpage ) {
                        $link = Linker::link( $subpage );
                        $out->addHTML( "<li>$link</li>\n" );
                }
index 52cbc3a..8e92e4a 100644 (file)
@@ -21,7 +21,6 @@
  * @ingroup SpecialPage
  */
 class SpecialNewFiles extends IncludableSpecialPage {
-
        public function __construct() {
                parent::__construct( 'Newimages' );
        }
@@ -37,6 +36,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                        $form->prepareForm();
                        $form->displayForm( '' );
                }
+
                $this->getOutput()->addHTML( $pager->getBody() );
                if ( !$this->including() ) {
                        $this->getOutput()->addHTML( $pager->getNavigationBar() );
@@ -52,7 +52,6 @@ class SpecialNewFiles extends IncludableSpecialPage {
  * @ingroup SpecialPage Pager
  */
 class NewFilesPager extends ReverseChronologicalPager {
-
        /**
         * @var ImageGallery
         */
@@ -73,9 +72,10 @@ class NewFilesPager extends ReverseChronologicalPager {
                $conds = $jconds = array();
                $tables = array( 'image' );
 
-               if( !$this->showbots ) {
+               if ( !$this->showbots ) {
                        $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
-                       if( count( $groupsWithBotPermission ) ) {
+
+                       if ( count( $groupsWithBotPermission ) ) {
                                $tables[] = 'user_groups';
                                $conds[] = 'ug_group IS NULL';
                                $jconds['user_groups'] = array(
@@ -88,11 +88,15 @@ class NewFilesPager extends ReverseChronologicalPager {
                        }
                }
 
-               if( !$wgMiserMode && $this->like !== null ) {
+               if ( !$wgMiserMode && $this->like !== null ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        $likeObj = Title::newFromURL( $this->like );
-                       if( $likeObj instanceof Title ) {
-                               $like = $dbr->buildLike( $dbr->anyString(), strtolower( $likeObj->getDBkey() ), $dbr->anyString() );
+                       if ( $likeObj instanceof Title ) {
+                               $like = $dbr->buildLike(
+                                       $dbr->anyString(),
+                                       strtolower( $likeObj->getDBkey() ),
+                                       $dbr->anyString()
+                               );
                                $conds[] = "LOWER(img_name) $like";
                        }
                }
@@ -115,6 +119,7 @@ class NewFilesPager extends ReverseChronologicalPager {
                if ( !$this->gallery ) {
                        $this->gallery = new ImageGallery();
                }
+
                return '';
        }
 
@@ -128,11 +133,12 @@ class NewFilesPager extends ReverseChronologicalPager {
 
                $title = Title::makeTitle( NS_FILE, $name );
                $ul = Linker::link( $user->getUserpage(), $user->getName() );
+               $time = $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() );
 
                $this->gallery->add(
                        $title,
                        "$ul<br />\n<i>"
-                               . htmlspecialchars( $this->getLanguage()->userTimeAndDate( $row->img_timestamp, $this->getUser() ) )
+                               . htmlspecialchars( $time )
                                . "</i><br />\n"
                );
        }
@@ -150,7 +156,6 @@ class NewFilesPager extends ReverseChronologicalPager {
                                'type' => 'check',
                                'label' => $this->msg( 'showhidebots', $this->msg( 'show' )->plain() )->escaped(),
                                'name' => 'showbots',
-                       #       'default' => $this->getRequest()->getBool( 'showbots', 0 ),
                        ),
                        'limit' => array(
                                'type' => 'hidden',
@@ -164,7 +169,7 @@ class NewFilesPager extends ReverseChronologicalPager {
                        ),
                );
 
-               if( $wgMiserMode ) {
+               if ( $wgMiserMode ) {
                        unset( $fields['like'] );
                }
 
index ebb3021..ae04061 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialNewpages extends IncludableSpecialPage {
-
        // Stored objects
 
        /**
@@ -63,17 +62,19 @@ class SpecialNewpages extends IncludableSpecialPage {
 
                $this->customFilters = array();
                wfRunHooks( 'SpecialNewPagesFilters', array( $this, &$this->customFilters ) );
-               foreach( $this->customFilters as $key => $params ) {
+               foreach ( $this->customFilters as $key => $params ) {
                        $opts->add( $key, $params['default'] );
                }
 
                // Set values
                $opts->fetchValuesFromRequest( $this->getRequest() );
-               if ( $par ) $this->parseParams( $par );
+               if ( $par ) {
+                       $this->parseParams( $par );
+               }
 
                // Validate
                $opts->validateIntBounds( 'limit', 0, 5000 );
-               if( !$wgEnableNewpagesUserFilter ) {
+               if ( !$wgEnableNewpagesUserFilter ) {
                        $opts->setValue( 'username', '' );
                }
        }
@@ -113,7 +114,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                        }
                        if ( preg_match( '/^namespace=(.*)$/', $bit, $m ) ) {
                                $ns = $this->getLanguage()->getNsIndex( $m[1] );
-                               if( $ns !== false ) {
+                               if ( $ns !== false ) {
                                        $this->opts->setValue( 'namespace', $ns );
                                }
                        }
@@ -135,13 +136,14 @@ class SpecialNewpages extends IncludableSpecialPage {
                $this->showNavigation = !$this->including(); // Maybe changed in setup
                $this->setup( $par );
 
-               if( !$this->including() ) {
+               if ( !$this->including() ) {
                        // Settings
                        $this->form();
 
                        $feedType = $this->opts->getValue( 'feed' );
-                       if( $feedType ) {
+                       if ( $feedType ) {
                                $this->feed( $feedType );
+
                                return;
                        }
 
@@ -154,7 +156,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                $pager->mLimit = $this->opts->getValue( 'limit' );
                $pager->mOffset = $this->opts->getValue( 'offset' );
 
-               if( $pager->getNumRows() ) {
+               if ( $pager->getNumRows() ) {
                        $navigation = '';
                        if ( $this->showNavigation ) {
                                $navigation = $pager->getNavigationBar();
@@ -196,7 +198,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                foreach ( $filters as $key => $msg ) {
                        $onoff = 1 - $this->opts->getValue( $key );
                        $link = Linker::link( $self, $showhide[$onoff], array(),
-                                       array( $key => $onoff ) + $changed
+                               array( $key => $onoff ) + $changed
                        );
                        $links[$key] = $this->msg( $msg )->rawParams( $link )->escaped();
                }
@@ -236,55 +238,55 @@ class SpecialNewpages extends IncludableSpecialPage {
                        Xml::openElement( 'table', array( 'id' => 'mw-newpages-table' ) ) .
                        '<tr>
                                <td class="mw-label">' .
-                                       Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
-                               '</td>
-                               <td class="mw-input">' .
-                                       Html::namespaceSelector(
-                                               array(
-                                                       'selected' => $namespace,
-                                                       'all' => 'all',
-                                               ), array(
-                                                       'name'  => 'namespace',
-                                                       'id'    => 'namespace',
-                                                       'class' => 'namespaceselector',
-                                               )
-                                       ) . '&#160;' .
-                                       Xml::checkLabel(
-                                               $this->msg( 'invert' )->text(),
-                                               'invert',
-                                               'nsinvert',
-                                               $nsinvert,
-                                               array( 'title' => $this->msg( 'tooltip-invert' )->text() )
-                                       ) .
-                               '</td>
+                       Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
+                       '</td>
+                       <td class="mw-input">' .
+                       Html::namespaceSelector(
+                               array(
+                                       'selected' => $namespace,
+                                       'all' => 'all',
+                               ), array(
+                                       'name' => 'namespace',
+                                       'id' => 'namespace',
+                                       'class' => 'namespaceselector',
+                               )
+                       ) . '&#160;' .
+                       Xml::checkLabel(
+                               $this->msg( 'invert' )->text(),
+                               'invert',
+                               'nsinvert',
+                               $nsinvert,
+                               array( 'title' => $this->msg( 'tooltip-invert' )->text() )
+                       ) .
+                       '</td>
                        </tr>' . ( $tagFilter ? (
                        '<tr>
                                <td class="mw-label">' .
-                                       $tagFilterLabel .
+                               $tagFilterLabel .
                                '</td>
                                <td class="mw-input">' .
-                                       $tagFilterSelector .
+                               $tagFilterSelector .
                                '</td>
                        </tr>' ) : '' ) .
                        ( $wgEnableNewpagesUserFilter ?
-                       '<tr>
+                               '<tr>
                                <td class="mw-label">' .
                                        Xml::label( $this->msg( 'newpages-username' )->text(), 'mw-np-username' ) .
-                               '</td>
+                                       '</td>
                                <td class="mw-input">' .
                                        Xml::input( 'username', 30, $userText, array( 'id' => 'mw-np-username' ) ) .
-                               '</td>
+                                       '</td>
                        </tr>' : '' ) .
                        '<tr> <td></td>
                                <td class="mw-submit">' .
-                                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
-                               '</td>
-                       </tr>' .
+                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
+                       '</td>
+               </tr>' .
                        '<tr>
                                <td></td>
                                <td class="mw-input">' .
-                                       $this->filterLinks() .
-                               '</td>
+                       $this->filterLinks() .
+                       '</td>
                        </tr>' .
                        Xml::closeElement( 'table' ) .
                        Xml::closeElement( 'fieldset' ) .
@@ -295,9 +297,10 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        /**
-        * Format a row, providing the timestamp, links to the page/history, size, user links, and a comment
+        * Format a row, providing the timestamp, links to the page/history,
+        * size, user links, and a comment
         *
-        * @param $result Result row
+        * @param object $result Result row
         * @return String
         */
        public function formatRow( $result ) {
@@ -332,10 +335,14 @@ class SpecialNewpages extends IncludableSpecialPage {
                $query = array( 'redirect' => 'no' );
 
                if( $this->patrollable( $result ) ) {
-                       $query['rcid'] = $result->rc_id;
+                       // Tell Article.php that we want to patrol the first revision
+                       // and not the current one. Has effect if both recentchages and new page
+                       // patrolling are enabled, we set it everytime for link consistency though.
+                       $query['patrolpage'] = 1;
                }
 
-               // Linker::linkKnown() uses 'known' and 'noclasses' options. This breaks the colouration for stubs.
+               // Linker::linkKnown() uses 'known' and 'noclasses' options.
+               // This breaks the colouration for stubs.
                $plink = Linker::link(
                        $title,
                        null,
@@ -352,8 +359,12 @@ class SpecialNewpages extends IncludableSpecialPage {
                $hist = Html::rawElement( 'span', array( 'class' => 'mw-newpages-history' ),
                        $this->msg( 'parentheses' )->rawParams( $histLink )->escaped() );
 
-               $length = Html::element( 'span', array( 'class' => 'mw-newpages-length' ),
-                       $this->msg( 'brackets' )->params( $this->msg( 'nbytes' )->numParams( $result->length )->text() )
+               $length = Html::element(
+                       'span',
+                       array( 'class' => 'mw-newpages-length' ),
+                       $this->msg( 'brackets' )->params( $this->msg( 'nbytes' )
+                               ->numParams( $result->length )->text()
+                       )
                );
 
                $ulink = Linker::revUserTools( $rev );
@@ -369,8 +380,11 @@ class SpecialNewpages extends IncludableSpecialPage {
                }
 
                # Tags, if any.
-               if( isset( $result->ts_tags ) ) {
-                       list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow( $result->ts_tags, 'newpages' );
+               if ( isset( $result->ts_tags ) ) {
+                       list( $tagDisplay, $newClasses ) = ChangeTags::formatSummaryRow(
+                               $result->ts_tags,
+                               'newpages'
+                       );
                        $classes = array_merge( $classes, $newClasses );
                } else {
                        $tagDisplay = '';
@@ -381,8 +395,10 @@ class SpecialNewpages extends IncludableSpecialPage {
                # Display the old title if the namespace/title has been changed
                $oldTitleText = '';
                $oldTitle = Title::makeTitle( $result->rc_namespace, $result->rc_title );
+
                if ( !$title->equals( $oldTitle ) ) {
-                       $oldTitleText = $this->msg( 'rc-old-title' )->params( $oldTitle->getPrefixedText() )->escaped();
+                       $oldTitleText = $oldTitle->getPrefixedText();
+                       $oldTitleText = $this->msg( 'rc-old-title' )->params( $oldTitleText )->escaped();
                }
 
                return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
@@ -391,7 +407,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        /**
         * Should a specific result row provide "patrollable" links?
         *
-        * @param $result Result row
+        * @param object $result Result row
         * @return Boolean
         */
        protected function patrollable( $result ) {
@@ -408,18 +424,20 @@ class SpecialNewpages extends IncludableSpecialPage {
 
                if ( !$wgFeed ) {
                        $this->getOutput()->addWikiMsg( 'feed-unavailable' );
+
                        return;
                }
 
-               if( !isset( $wgFeedClasses[$type] ) ) {
+               if ( !isset( $wgFeedClasses[$type] ) ) {
                        $this->getOutput()->addWikiMsg( 'feed-invalid' );
+
                        return;
                }
 
                $feed = new $wgFeedClasses[$type](
                        $this->feedTitle(),
                        $this->msg( 'tagline' )->text(),
-                       $this->getTitle()->getFullUrl()
+                       $this->getTitle()->getFullURL()
                );
 
                $pager = new NewPagesPager( $this, $this->opts );
@@ -427,7 +445,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                $pager->mLimit = min( $limit, $wgFeedLimit );
 
                $feed->outHeader();
-               if( $pager->getNumRows() > 0 ) {
+               if ( $pager->getNumRows() > 0 ) {
                        foreach ( $pager->mResult as $row ) {
                                $feed->outItem( $this->feedItem( $row ) );
                        }
@@ -438,12 +456,13 @@ class SpecialNewpages extends IncludableSpecialPage {
        protected function feedTitle() {
                global $wgLanguageCode, $wgSitename;
                $desc = $this->getDescription();
+
                return "$wgSitename - $desc [$wgLanguageCode]";
        }
 
        protected function feedItem( $row ) {
                $title = Title::makeTitle( intval( $row->rc_namespace ), $row->rc_title );
-               if( $title ) {
+               if ( $title ) {
                        $date = $row->rc_timestamp;
                        $comments = $title->getTalkPage()->getFullURL();
 
@@ -466,7 +485,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 
        protected function feedItemDesc( $row ) {
                $revision = Revision::newFromId( $row->rev_id );
-               if( $revision ) {
+               if ( $revision ) {
                        //XXX: include content model/type in feed item?
                        return '<p>' . htmlspecialchars( $revision->getUserText() ) .
                                $this->msg( 'colon-separator' )->inContentLanguage()->escaped() .
@@ -474,6 +493,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                                "</p>\n<hr />\n<div>" .
                                nl2br( htmlspecialchars( $revision->getContent()->serialize() ) ) . "</div>";
                }
+
                return '';
        }
 
@@ -511,7 +531,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                $username = $this->opts->getValue( 'username' );
                $user = Title::makeTitleSafe( NS_USER, $username );
 
-               if( $namespace !== false ) {
+               if ( $namespace !== false ) {
                        if ( $this->opts->getValue( 'invert' ) ) {
                                $conds[] = 'rc_namespace != ' . $this->mDb->addQuotes( $namespace );
                        } else {
@@ -523,18 +543,22 @@ class NewPagesPager extends ReverseChronologicalPager {
                }
 
                # $wgEnableNewpagesUserFilter - temp WMF hack
-               if( $wgEnableNewpagesUserFilter && $user ) {
+               if ( $wgEnableNewpagesUserFilter && $user ) {
                        $conds['rc_user_text'] = $user->getText();
                        $rcIndexes = 'rc_user_text';
-               # If anons cannot make new pages, don't "exclude logged in users"!
-               } elseif( User::groupHasPermission( '*', 'createpage' ) && $this->opts->getValue( 'hideliu' ) ) {
+               } elseif ( User::groupHasPermission( '*', 'createpage' ) &&
+                       $this->opts->getValue( 'hideliu' )
+               ) {
+                       # If anons cannot make new pages, don't "exclude logged in users"!
                        $conds['rc_user'] = 0;
                }
+
                # If this user cannot see patrolled edits or they are off, don't do dumb queries!
-               if( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) {
+               if ( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) {
                        $conds['rc_patrolled'] = 0;
                }
-               if( $this->opts->getValue( 'hidebots' ) ) {
+
+               if ( $this->opts->getValue( 'hidebots' ) ) {
                        $conds['rc_bot'] = 0;
                }
 
@@ -546,7 +570,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                $tables = array( 'recentchanges', 'page' );
                $fields = array(
                        'rc_namespace', 'rc_title', 'rc_cur_id', 'rc_user', 'rc_user_text',
-                       'rc_comment', 'rc_timestamp', 'rc_patrolled','rc_id', 'rc_deleted',
+                       'rc_comment', 'rc_timestamp', 'rc_patrolled', 'rc_id', 'rc_deleted',
                        'length' => 'page_len', 'rev_id' => 'page_latest', 'rc_this_oldid',
                        'page_namespace', 'page_title'
                );
@@ -556,10 +580,10 @@ class NewPagesPager extends ReverseChronologicalPager {
                        array( &$this, $this->opts, &$conds, &$tables, &$fields, &$join_conds ) );
 
                $info = array(
-                       'tables'         => $tables,
-                       'fields'         => $fields,
-                       'conds'          => $conds,
-                       'options'        => array( 'USE INDEX' => array( 'recentchanges' => $rcIndexes ) ),
+                       'tables' => $tables,
+                       'fields' => $fields,
+                       'conds' => $conds,
+                       'options' => array( 'USE INDEX' => array( 'recentchanges' => $rcIndexes ) ),
                        'join_conds' => $join_conds
                );
 
@@ -593,6 +617,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                        $linkBatch->add( $row->rc_namespace, $row->rc_title );
                }
                $linkBatch->execute();
+
                return '<ul>';
        }
 
index 8f8c981..72a3476 100644 (file)
@@ -23,7 +23,6 @@
  * @author Brad Jorsch
  */
 
-
 /**
  * Special:PagesWithProp to search the page_props table
  * @ingroup SpecialPage
@@ -70,9 +69,8 @@ class SpecialPagesWithProp extends QueryPage {
                        ),
                ), $this->getContext() );
                $form->setMethod( 'get' );
-               $form->setAction( $this->getTitle()->getFullUrl() );
                $form->setSubmitCallback( array( $this, 'onSubmit' ) );
-               $form->setWrapperLegend( $this->msg( 'pageswithprop-legend' ) );
+               $form->setWrapperLegendMsg( 'pageswithprop-legend' );
                $form->addHeaderText( $this->msg( 'pageswithprop-text' )->parseAsBlock() );
                $form->setSubmitTextMsg( 'pageswithprop-submit' );
 
@@ -120,15 +118,20 @@ class SpecialPagesWithProp extends QueryPage {
                return array( 'page_id' );
        }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
        function formatResult( $skin, $result ) {
                $title = Title::newFromRow( $result );
                $ret = Linker::link( $title, null, array(), array(), array( 'known' ) );
                if ( $result->pp_value !== '' ) {
-                       $value = $this->msg( 'parentheses' )
-                               ->rawParams( Xml::span( $result->pp_value, 'prop-value' ) )
-                               ->escaped();
+                       $propValue = Html::element( 'span', array( 'class' => 'prop-value' ), $result->pp_value );
+                       $value = $this->msg( 'parentheses' )->rawParams( $propValue )->escaped();
                        $ret .= " $value";
                }
+
                return $ret;
        }
 
index 90b0ac8..3b67554 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialPasswordReset extends FormSpecialPage {
-
        /**
         * @var Message
         */
        private $email;
 
+       /**
+        * @var User
+        */
+       private $firstUser;
+
        /**
         * @var Status
         */
@@ -65,7 +69,8 @@ class SpecialPasswordReset extends FormSpecialPage {
                                'type' => 'text',
                                'label-message' => 'passwordreset-username',
                        );
-                       if( $this->getUser()->isLoggedIn() ) {
+
+                       if ( $this->getUser()->isLoggedIn() ) {
                                $a['Username']['default'] = $this->getUser()->getName();
                        }
                }
@@ -86,7 +91,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        );
                }
 
-               if( $this->getUser()->isAllowed( 'passwordreset' ) ) {
+               if ( $this->getUser()->isAllowed( 'passwordreset' ) ) {
                        $a['Capture'] = array(
                                'type' => 'check',
                                'label-message' => 'passwordreset-capture',
@@ -98,11 +103,8 @@ class SpecialPasswordReset extends FormSpecialPage {
        }
 
        public function alterForm( HTMLForm $form ) {
-               $form->setSubmitTextMsg( 'mailmypassword' );
-       }
-
-       protected function preText() {
                global $wgPasswordResetRoutes;
+
                $i = 0;
                if ( isset( $wgPasswordResetRoutes['username'] ) && $wgPasswordResetRoutes['username'] ) {
                        $i++;
@@ -113,7 +115,11 @@ class SpecialPasswordReset extends FormSpecialPage {
                if ( isset( $wgPasswordResetRoutes['domain'] ) && $wgPasswordResetRoutes['domain'] ) {
                        $i++;
                }
-               return $this->msg( 'passwordreset-pretext', $i )->parseAsBlock();
+
+               $message = ( $i > 1 ) ? 'passwordreset-text-many' : 'passwordreset-text-one';
+
+               $form->setHeaderText( $this->msg( $message, $i )->parseAsBlock() );
+               $form->setSubmitTextMsg( 'mailmypassword' );
        }
 
        /**
@@ -136,8 +142,9 @@ class SpecialPasswordReset extends FormSpecialPage {
                        }
                }
 
-               if( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
-                       // The user knows they don't have the passwordreset permission, but they tried to spoof the form.  That's naughty
+               if ( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
+                       // The user knows they don't have the passwordreset permission,
+                       // but they tried to spoof the form. That's naughty
                        throw new PermissionsError( 'passwordreset' );
                }
 
@@ -151,8 +158,8 @@ class SpecialPasswordReset extends FormSpecialPage {
                        $users = array( User::newFromName( $data['Username'] ) );
                } elseif ( isset( $data['Email'] )
                        && $data['Email'] !== ''
-                       && Sanitizer::validateEmail( $data['Email'] ) )
-               {
+                       && Sanitizer::validateEmail( $data['Email'] )
+               {
                        $method = 'email';
                        $res = wfGetDB( DB_SLAVE )->select(
                                'user',
@@ -160,9 +167,11 @@ class SpecialPasswordReset extends FormSpecialPage {
                                array( 'user_email' => $data['Email'] ),
                                __METHOD__
                        );
+
                        if ( $res ) {
                                $users = array();
-                               foreach( $res as $row ) {
+
+                               foreach ( $res as $row ) {
                                        $users[] = User::newFromRow( $row );
                                }
                        } else {
@@ -180,8 +189,8 @@ class SpecialPasswordReset extends FormSpecialPage {
                        return array( $error );
                }
 
-               if( count( $users ) == 0 ) {
-                       if( $method == 'email' ) {
+               if ( count( $users ) == 0 ) {
+                       if ( $method == 'email' ) {
                                // Don't reveal whether or not an email address is in use
                                return true;
                        } else {
@@ -204,9 +213,13 @@ class SpecialPasswordReset extends FormSpecialPage {
                foreach ( $users as $user ) {
                        if ( $user->isPasswordReminderThrottled() ) {
                                global $wgPasswordReminderResendTime;
+
                                # Round the time in hours to 3 d.p., in case someone is specifying
                                # minutes or seconds.
-                               return array( array( 'throttled-mailpassword', round( $wgPasswordReminderResendTime, 3 ) ) );
+                               return array( array(
+                                       'throttled-mailpassword',
+                                       round( $wgPasswordReminderResendTime, 3 )
+                               ) );
                        }
                }
 
@@ -239,8 +252,8 @@ class SpecialPasswordReset extends FormSpecialPage {
                        $password = $user->randomPassword();
                        $user->setNewpassword( $password );
                        $user->saveSettings();
-                       $passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password
-                               )->inLanguage( $userLanguage )->text(); // We'll escape the whole thing later
+                       $passwords[] = $this->msg( 'passwordreset-emailelement', $user->getName(), $password )
+                               ->inLanguage( $userLanguage )->text(); // We'll escape the whole thing later
                }
                $passwordBlock = implode( "\n\n", $passwords );
 
@@ -249,7 +262,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        $username,
                        $passwordBlock,
                        count( $passwords ),
-                       '<' . Title::newMainPage()->getCanonicalUrl() . '>',
+                       '<' . Title::newMainPage()->getCanonicalURL() . '>',
                        round( $wgNewPasswordExpiry / 86400 )
                );
 
@@ -257,31 +270,36 @@ class SpecialPasswordReset extends FormSpecialPage {
 
                $this->result = $firstUser->sendMail( $title->escaped(), $this->email->text() );
 
-               // Blank the email if the user is not supposed to see it
-               if( !isset( $data['Capture'] ) || !$data['Capture'] ) {
+               if ( isset( $data['Capture'] ) && $data['Capture'] ) {
+                       // Save the user, will be used if an error occurs when sending the email
+                       $this->firstUser = $firstUser;
+               } else {
+                       // Blank the email if the user is not supposed to see it
                        $this->email = null;
                }
 
                if ( $this->result->isGood() ) {
                        return true;
-               } elseif( isset( $data['Capture'] ) && $data['Capture'] ) {
+               } elseif ( isset( $data['Capture'] ) && $data['Capture'] ) {
                        // The email didn't send, but maybe they knew that and that's why they captured it
                        return true;
                } else {
-                       // @todo FIXME: The email didn't send, but we have already set the password throttle
-                       // timestamp, so they won't be able to try again until it expires...  :(
+                       // @todo FIXME: The email wasn't sent, but we have already set
+                       // the password throttle timestamp, so they won't be able to try
+                       // again until it expires...  :(
                        return array( array( 'mailerror', $this->result->getMessage() ) );
                }
        }
 
        public function onSuccess() {
-               if( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ) {
-                       // @todo: Logging
+               if ( $this->getUser()->isAllowed( 'passwordreset' ) && $this->email != null ) {
+                       // @todo Logging
 
-                       if( $this->result->isGood() ) {
+                       if ( $this->result->isGood() ) {
                                $this->getOutput()->addWikiMsg( 'passwordreset-emailsent-capture' );
                        } else {
-                               $this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture', $this->result->getMessage() );
+                               $this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture',
+                                       $this->result->getMessage(), $this->firstUser->getName() );
                        }
 
                        $this->getOutput()->addHTML( Html::rawElement( 'pre', array(), $this->email->escaped() ) );
@@ -292,12 +310,12 @@ class SpecialPasswordReset extends FormSpecialPage {
        }
 
        protected function canChangePassword( User $user ) {
-               global $wgPasswordResetRoutes, $wgAuth;
+               global $wgPasswordResetRoutes, $wgEnableEmail, $wgAuth;
 
                // Maybe password resets are disabled, or there are no allowable routes
                if ( !is_array( $wgPasswordResetRoutes ) ||
-                        !in_array( true, array_values( $wgPasswordResetRoutes ) ) )
-               {
+                       !in_array( true, array_values( $wgPasswordResetRoutes ) )
+               {
                        return 'passwordreset-disabled';
                }
 
@@ -306,6 +324,11 @@ class SpecialPasswordReset extends FormSpecialPage {
                        return 'resetpass_forbidden';
                }
 
+               // Maybe email features have been disabled
+               if ( !$wgEnableEmail ) {
+                       return 'passwordreset-emaildisabled';
+               }
+
                // Maybe the user is blocked (check this here rather than relying on the parent
                // method as we have a more specific error message to use here
                if ( $user->isBlocked() ) {
index 7ce8c13..2a80f65 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class PopularPagesPage extends QueryPage {
-
        function __construct( $name = 'Popularpages' ) {
                parent::__construct( $name );
        }
@@ -42,27 +41,37 @@ class PopularPagesPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
+               return array(
                        'tables' => array( 'page' ),
-                       'fields' => array( 'namespace' => 'page_namespace',
-                                       'title' => 'page_title',
-                                       'value' => 'page_counter' ),
-                       'conds' => array( 'page_is_redirect' => 0,
-                                       'page_namespace' => MWNamespace::getContentNamespaces() ) );
+                       'fields' => array(
+                               'namespace' => 'page_namespace',
+                               'title' => 'page_title',
+                               'value' => 'page_counter' ),
+                       'conds' => array(
+                               'page_is_redirect' => 0,
+                               'page_namespace' => MWNamespace::getContentNamespaces()
+                       )
+               );
        }
 
        /**
-        * @param $skin Skin
-        * @param $result
+        * @param Skin $skin
+        * @param object $result Result row
         * @return string
         */
        function formatResult( $skin, $result ) {
                global $wgContLang;
 
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
-               if( !$title ) {
-                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+               if ( !$title ) {
+                       return Html::element(
+                               'span',
+                               array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription(
+                                       $this->getContext(),
+                                       $result->namespace,
+                                       $result->title )
+                       );
                }
 
                $link = Linker::linkKnown(
@@ -70,6 +79,7 @@ class PopularPagesPage extends QueryPage {
                        htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
                );
                $nv = $this->msg( 'nviews' )->numParams( $result->value )->escaped();
+
                return $this->getLanguage()->specialList( $link, $nv );
        }
 
index a50e7c1..bb6bc95 100644 (file)
@@ -35,16 +35,21 @@ class SpecialPreferences extends SpecialPage {
                $this->setHeaders();
                $this->outputHeader();
                $out = $this->getOutput();
-               $out->disallowUserJs();  # Prevent hijacked user scripts from sniffing passwords etc.
+               $out->disallowUserJs(); # Prevent hijacked user scripts from sniffing passwords etc.
 
                $user = $this->getUser();
                if ( $user->isAnon() ) {
-                       throw new ErrorPageError( 'prefsnologin', 'prefsnologintext', array( $this->getTitle()->getPrefixedDBkey() ) );
+                       throw new ErrorPageError(
+                               'prefsnologin',
+                               'prefsnologintext',
+                               array( $this->getTitle()->getPrefixedDBkey() )
+                       );
                }
                $this->checkReadOnly();
 
                if ( $par == 'reset' ) {
                        $this->showResetForm();
+
                        return;
                }
 
@@ -52,7 +57,7 @@ class SpecialPreferences extends SpecialPage {
 
                if ( $this->getRequest()->getCheck( 'success' ) ) {
                        $out->wrapWikiMsg(
-                               "<div class=\"successbox\"><strong>\n$1\n</strong></div><div id=\"mw-pref-clear\"></div>",
+                               "<div class=\"successbox mw-sp-pref-successbox\">\n$1\n</div>",
                                'savedprefs'
                        );
                }
index 6affa73..1322d54 100644 (file)
@@ -62,11 +62,11 @@ class SpecialPrefixindex extends SpecialAllpages {
                );
 
                $showme = '';
-               if( isset( $par ) ) {
+               if ( isset( $par ) ) {
                        $showme = $par;
-               } elseif( $prefix != '' ) {
+               } elseif ( $prefix != '' ) {
                        $showme = $prefix;
-               } elseif( $from != '' && $ns === null ) {
+               } elseif ( $from != '' && $ns === null ) {
                        // For back-compat with Special:Allpages
                        // Don't do this if namespace is passed, so paging works when doing NS views.
                        $showme = $from;
@@ -98,37 +98,38 @@ class SpecialPrefixindex extends SpecialAllpages {
                $out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
                $out .= "<tr>
                                <td class='mw-label'>" .
-                               Xml::label( $this->msg( 'allpagesprefix' )->text(), 'nsfrom' ) .
-                               "</td>
+                       Xml::label( $this->msg( 'allpagesprefix' )->text(), 'nsfrom' ) .
+                       "</td>
                                <td class='mw-input'>" .
-                                       Xml::input( 'prefix', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
-                               "</td>
+                       Xml::input( 'prefix', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
+                       "</td>
                        </tr>
                        <tr>
-                               <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
-                               "</td>
+                       <td class='mw-label'>" .
+                       Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
+                       "</td>
                                <td class='mw-input'>" .
-                               Html::namespaceSelector( array(
-                                               'selected' => $namespace,
-                                       ), array(
-                                               'name'  => 'namespace',
-                                               'id'    => 'namespace',
-                                               'class' => 'namespaceselector',
-                               ) ) .
-                               Xml::checkLabel(
-                                       $this->msg( 'allpages-hide-redirects' )->text(),
-                                       'hideredirects',
-                                       'hideredirects',
-                                       $hideredirects
-                               ) . ' ' .
-                               Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
-                               "</td>
+                       Html::namespaceSelector( array(
+                               'selected' => $namespace,
+                       ), array(
+                               'name' => 'namespace',
+                               'id' => 'namespace',
+                               'class' => 'namespaceselector',
+                       ) ) .
+                       Xml::checkLabel(
+                               $this->msg( 'allpages-hide-redirects' )->text(),
+                               'hideredirects',
+                               'hideredirects',
+                               $hideredirects
+                       ) . ' ' .
+                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
+                       "</td>
                        </tr>";
                $out .= Xml::closeElement( 'table' );
                $out .= Xml::closeElement( 'fieldset' );
                $out .= Xml::closeElement( 'form' );
                $out .= Xml::closeElement( 'div' );
+
                return $out;
        }
 
@@ -178,8 +179,8 @@ class SpecialPrefixindex extends SpecialAllpages {
                                $conds,
                                __METHOD__,
                                array(
-                                       'ORDER BY'  => 'page_title',
-                                       'LIMIT'     => $this->maxPerPage + 1,
+                                       'ORDER BY' => 'page_title',
+                                       'LIMIT' => $this->maxPerPage + 1,
                                        'USE INDEX' => 'name_title',
                                )
                        );
@@ -187,34 +188,36 @@ class SpecialPrefixindex extends SpecialAllpages {
                        ### @todo FIXME: Side link to previous
 
                        $n = 0;
-                       if( $res->numRows() > 0 ) {
+                       if ( $res->numRows() > 0 ) {
                                $out = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-list-table' ) );
 
-                               while( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+                               while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
                                        $t = Title::makeTitle( $s->page_namespace, $s->page_title );
-                                       if( $t ) {
-                                               $link = ($s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
+                                       if ( $t ) {
+                                               $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
                                                        Linker::linkKnown(
                                                                $t,
                                                                htmlspecialchars( $t->getText() ),
                                                                $s->page_is_redirect ? array( 'class' => 'mw-redirect' ) : array()
                                                        ) .
-                                                       ($s->page_is_redirect ? '</div>' : '' );
+                                                       ( $s->page_is_redirect ? '</div>' : '' );
                                        } else {
                                                $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
                                        }
-                                       if( $n % 3 == 0 ) {
+                                       if ( $n % 3 == 0 ) {
                                                $out .= '<tr>';
                                        }
                                        $out .= "<td>$link</td>";
                                        $n++;
-                                       if( $n % 3 == 0 ) {
+                                       if ( $n % 3 == 0 ) {
                                                $out .= '</tr>';
                                        }
                                }
-                               if( ($n % 3) != 0 ) {
+
+                               if ( $n % 3 != 0 ) {
                                        $out .= '</tr>';
                                }
+
                                $out .= Xml::closeElement( 'table' );
                        } else {
                                $out = '';
@@ -230,32 +233,40 @@ class SpecialPrefixindex extends SpecialAllpages {
                        $out2 = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-nav-table' ) ) .
                                '<tr>
                                        <td>' .
-                                               $nsForm .
-                                       '</td>
-                                       <td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
+                               $nsForm .
+                               '</td>
+                               <td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
 
-                       if( isset( $res ) && $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+                       if ( isset( $res ) && $res && ( $n == $this->maxPerPage ) &&
+                               ( $s = $res->fetchObject() )
+                       ) {
                                $query = array(
                                        'from' => $s->page_title,
                                        'prefix' => $prefix,
                                        'hideredirects' => $hideredirects,
                                );
 
-                               if( $namespace || $prefix == '' ) {
+                               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;
                                }
+
                                $nextLink = Linker::linkKnown(
-                                               $self,
-                                               $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
-                                               array(),
-                                               $query
-                                       );
+                                       $self,
+                                       $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
+                                       array(),
+                                       $query
+                               );
+
                                $out2 .= $nextLink;
 
-                               $footer = "\n" . Html::element( "hr" )
-                                       . Html::rawElement( "div", array( "class" => "mw-prefixindex-nav" ), $nextLink );
+                               $footer = "\n" . Html::element( 'hr' ) .
+                                       Html::rawElement(
+                                               'div',
+                                               array( 'class' => 'mw-prefixindex-nav' ),
+                                               $nextLink
+                                       );
                        }
                        $out2 .= "</td></tr>" .
                                Xml::closeElement( 'table' );
index eb89bec..78931a0 100644 (file)
@@ -40,7 +40,7 @@ class SpecialProtectedpages extends SpecialPage {
                $this->outputHeader();
 
                // Purge expired entries on one in every 10 queries
-               if( !mt_rand( 0, 10 ) ) {
+               if ( !mt_rand( 0, 10 ) ) {
                        Title::purgeExpiredRestrictions();
                }
 
@@ -49,19 +49,37 @@ class SpecialProtectedpages extends SpecialPage {
                $level = $request->getVal( $this->IdLevel );
                $sizetype = $request->getVal( 'sizetype' );
                $size = $request->getIntOrNull( 'size' );
-               $NS = $request->getIntOrNull( 'namespace' );
+               $ns = $request->getIntOrNull( 'namespace' );
                $indefOnly = $request->getBool( 'indefonly' ) ? 1 : 0;
                $cascadeOnly = $request->getBool( 'cascadeonly' ) ? 1 : 0;
 
-               $pager = new ProtectedPagesPager( $this, array(), $type, $level, $NS, $sizetype, $size, $indefOnly, $cascadeOnly );
-
-               $this->getOutput()->addHTML( $this->showOptions( $NS, $type, $level, $sizetype, $size, $indefOnly, $cascadeOnly ) );
+               $pager = new ProtectedPagesPager(
+                       $this,
+                       array(),
+                       $type,
+                       $level,
+                       $ns,
+                       $sizetype,
+                       $size,
+                       $indefOnly,
+                       $cascadeOnly
+               );
 
-               if( $pager->getNumRows() ) {
+               $this->getOutput()->addHTML( $this->showOptions(
+                       $ns,
+                       $type,
+                       $level,
+                       $sizetype,
+                       $size,
+                       $indefOnly,
+                       $cascadeOnly
+               ) );
+
+               if ( $pager->getNumRows() ) {
                        $this->getOutput()->addHTML(
                                $pager->getNavigationBar() .
-                               '<ul>' . $pager->getBody() . '</ul>' .
-                               $pager->getNavigationBar()
+                                       '<ul>' . $pager->getBody() . '</ul>' .
+                                       $pager->getNavigationBar()
                        );
                } else {
                        $this->getOutput()->addWikiMsg( 'protectedpagesempty' );
@@ -78,20 +96,38 @@ class SpecialProtectedpages extends SpecialPage {
 
                static $infinity = null;
 
-               if( is_null( $infinity ) ) {
+               if ( is_null( $infinity ) ) {
                        $infinity = wfGetDB( DB_SLAVE )->getInfinity();
                }
 
                $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
+               if ( !$title ) {
+                       wfProfileOut( __METHOD__ );
+
+                       return Html::rawElement(
+                               'li',
+                               array(),
+                               Html::element(
+                                       'span',
+                                       array( 'class' => 'mw-invalidtitle' ),
+                                       Linker::getInvalidTitleDescription(
+                                               $this->getContext(),
+                                               $row->page_namespace,
+                                               $row->page_title
+                                       )
+                               )
+                       ) . "\n";
+               }
+
                $link = Linker::link( $title );
 
-               $description_items = array ();
+               $description_items = array();
 
                $protType = $this->msg( 'restriction-level-' . $row->pr_level )->escaped();
 
                $description_items[] = $protType;
 
-               if( $row->pr_cascade ) {
+               if ( $row->pr_cascade ) {
                        $description_items[] = $this->msg( 'protect-summary-cascade' )->text();
                }
 
@@ -99,7 +135,7 @@ class SpecialProtectedpages extends SpecialPage {
                $lang = $this->getLanguage();
 
                $expiry = $lang->formatExpiry( $row->pr_expiry, TS_MW );
-               if( $expiry != $infinity ) {
+               if ( $expiry != $infinity ) {
                        $user = $this->getUser();
                        $description_items[] = $this->msg(
                                'protect-expiring-local',
@@ -109,12 +145,13 @@ class SpecialProtectedpages extends SpecialPage {
                        )->escaped();
                }
 
-               if( !is_null( $size = $row->page_len ) ) {
+               if ( !is_null( $size = $row->page_len ) ) {
                        $stxt = $lang->getDirMark() . ' ' . Linker::formatRevisionSize( $size );
                }
 
-               # Show a link to the change protection form for allowed users otherwise a link to the protection log
-               if( $this->getUser()->isAllowed( 'protect' ) ) {
+               # Show a link to the change protection form for allowed users otherwise
+               # a link to the protection log
+               if ( $this->getUser()->isAllowed( 'protect' ) ) {
                        $changeProtection = Linker::linkKnown(
                                $title,
                                $this->msg( 'protect_change' )->escaped(),
@@ -134,14 +171,17 @@ class SpecialProtectedpages extends SpecialPage {
                        );
                }
 
-               $changeProtection = ' ' . $this->msg( 'parentheses' )->rawParams( $changeProtection )->escaped();
+               $changeProtection = ' ' . $this->msg( 'parentheses' )->rawParams( $changeProtection )
+                       ->escaped();
 
                wfProfileOut( __METHOD__ );
 
                return Html::rawElement(
                        'li',
                        array(),
-                       $lang->specialList( $link . $stxt, $lang->commaList( $description_items ), false ) . $changeProtection ) . "\n";
+                       $lang->specialList( $link . $stxt, $lang->commaList( $description_items ), false ) .
+                               $changeProtection
+               ) . "\n";
        }
 
        /**
@@ -154,9 +194,13 @@ class SpecialProtectedpages extends SpecialPage {
         * @param $cascadeOnly Boolean: only cascading protection
         * @return String: input form
         */
-       protected function showOptions( $namespace, $type = 'edit', $level, $sizetype, $size, $indefOnly, $cascadeOnly ) {
+       protected function showOptions( $namespace, $type = 'edit', $level, $sizetype,
+               $size, $indefOnly, $cascadeOnly
+       ) {
                global $wgScript;
+
                $title = $this->getTitle();
+
                return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
                        Xml::openElement( 'fieldset' ) .
                        Xml::element( 'legend', array(), $this->msg( 'protectedpages' )->text() ) .
@@ -190,8 +234,8 @@ class SpecialProtectedpages extends SpecialPage {
                                        'all' => '',
                                        'label' => $this->msg( 'namespace' )->text()
                                ), array(
-                                       'name'  => 'namespace',
-                                       'id'    => 'namespace',
+                                       'name' => 'namespace',
+                                       'id' => 'namespace',
                                        'class' => 'namespaceselector',
                                )
                        )
@@ -199,31 +243,54 @@ class SpecialProtectedpages extends SpecialPage {
        }
 
        /**
+        * @param bool $indefOnly
         * @return string Formatted HTML
         */
        protected function getExpiryCheck( $indefOnly ) {
-               return
-                       Xml::checkLabel( $this->msg( 'protectedpages-indef' )->text(), 'indefonly', 'indefonly', $indefOnly ) . "\n";
+               return Xml::checkLabel(
+                       $this->msg( 'protectedpages-indef' )->text(),
+                       'indefonly',
+                       'indefonly',
+                       $indefOnly
+               ) . "\n";
        }
 
        /**
+        * @param bool $cascadeOnly
         * @return string Formatted HTML
         */
        protected function getCascadeCheck( $cascadeOnly ) {
-               return
-                       Xml::checkLabel( $this->msg( 'protectedpages-cascade' )->text(), 'cascadeonly', 'cascadeonly', $cascadeOnly ) . "\n";
+               return Xml::checkLabel(
+                       $this->msg( 'protectedpages-cascade' )->text(),
+                       'cascadeonly',
+                       'cascadeonly',
+                       $cascadeOnly
+               ) . "\n";
        }
 
        /**
+        * @param string $sizetype "min" or "max"
+        * @param mixed $size
         * @return string Formatted HTML
         */
        protected function getSizeLimit( $sizetype, $size ) {
                $max = $sizetype === 'max';
 
-               return
-                       Xml::radioLabel( $this->msg( 'minimum-size' )->text(), 'sizetype', 'min', 'wpmin', !$max ) .
+               return Xml::radioLabel(
+                       $this->msg( 'minimum-size' )->text(),
+                       'sizetype',
+                       'min',
+                       'wpmin',
+                       !$max
+               ) .
                        '&#160;' .
-                       Xml::radioLabel( $this->msg( 'maximum-size' )->text(), 'sizetype', 'max', 'wpmax', $max ) .
+                       Xml::radioLabel(
+                               $this->msg( 'maximum-size' )->text(),
+                               'sizetype',
+                               'max',
+                               'wpmax',
+                               $max
+                       ) .
                        '&#160;' .
                        Xml::input( 'size', 9, $size, array( 'id' => 'wpsize' ) ) .
                        '&#160;' .
@@ -240,14 +307,14 @@ class SpecialProtectedpages extends SpecialPage {
                $options = array();
 
                // First pass to load the log names
-               foreach( Title::getFilteredRestrictionTypes( true ) as $type ) {
+               foreach ( Title::getFilteredRestrictionTypes( true ) as $type ) {
                        $text = $this->msg( "restriction-$type" )->text();
                        $m[$text] = $type;
                }
 
                // Third pass generates sorted XHTML content
-               foreach( $m as $text => $type ) {
-                       $selected = ($type == $pr_type );
+               foreach ( $m as $text => $type ) {
+                       $selected = ( $type == $pr_type );
                        $options[] = Xml::option( $text, $type, $selected ) . "\n";
                }
 
@@ -266,21 +333,22 @@ class SpecialProtectedpages extends SpecialPage {
        protected function getLevelMenu( $pr_level ) {
                global $wgRestrictionLevels;
 
-               $m = array( $this->msg( 'restriction-level-all' )->text() => 0 ); // Temporary array
+               // Temporary array
+               $m = array( $this->msg( 'restriction-level-all' )->text() => 0 );
                $options = array();
 
                // First pass to load the log names
-               foreach( $wgRestrictionLevels as $type ) {
+               foreach ( $wgRestrictionLevels as $type ) {
                        // Messages used can be 'restriction-level-sysop' and 'restriction-level-autoconfirmed'
-                       if( $type != '' && $type != '*' ) {
+                       if ( $type != '' && $type != '*' ) {
                                $text = $this->msg( "restriction-level-$type" )->text();
                                $m[$text] = $type;
                        }
                }
 
                // Third pass generates sorted XHTML content
-               foreach( $m as $text => $type ) {
-                       $selected = ($type == $pr_level );
+               foreach ( $m as $text => $type ) {
+                       $selected = ( $type == $pr_level );
                        $options[] = Xml::option( $text, $type, $selected );
                }
 
@@ -304,9 +372,9 @@ class ProtectedPagesPager extends AlphabeticPager {
        public $mForm, $mConds;
        private $type, $level, $namespace, $sizetype, $size, $indefonly;
 
-       function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype = '', $size = 0,
-               $indefonly = false, $cascadeonly = false )
-       {
+       function __construct( $form, $conds = array(), $type, $level, $namespace,
+               $sizetype = '', $size = 0, $indefonly = false, $cascadeonly = false
+       {
                $this->mForm = $form;
                $this->mConds = $conds;
                $this->type = ( $type ) ? $type : 'edit';
@@ -326,6 +394,7 @@ class ProtectedPagesPager extends AlphabeticPager {
                        $lb->add( $row->page_namespace, $row->page_title );
                }
                $lb->execute();
+
                return '';
        }
 
@@ -336,27 +405,31 @@ class ProtectedPagesPager extends AlphabeticPager {
        function getQueryInfo() {
                $conds = $this->mConds;
                $conds[] = '(pr_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() ) .
-                               'OR pr_expiry IS NULL)';
+                       'OR pr_expiry IS NULL)';
                $conds[] = 'page_id=pr_page';
                $conds[] = 'pr_type=' . $this->mDb->addQuotes( $this->type );
 
-               if( $this->sizetype == 'min' ) {
+               if ( $this->sizetype == 'min' ) {
                        $conds[] = 'page_len>=' . $this->size;
-               } elseif( $this->sizetype == 'max' ) {
+               } elseif ( $this->sizetype == 'max' ) {
                        $conds[] = 'page_len<=' . $this->size;
                }
 
-               if( $this->indefonly ) {
-                       $conds[] = "pr_expiry = {$this->mDb->addQuotes( $this->mDb->getInfinity() )} OR pr_expiry IS NULL";
+               if ( $this->indefonly ) {
+                       $infinity = $this->mDb->addQuotes( $this->mDb->getInfinity() );
+                       $conds[] = "pr_expiry = $infinity OR pr_expiry IS NULL";
                }
-               if( $this->cascadeonly ) {
+               if ( $this->cascadeonly ) {
                        $conds[] = 'pr_cascade = 1';
                }
 
-               if( $this->level )
+               if ( $this->level ) {
                        $conds[] = 'pr_level=' . $this->mDb->addQuotes( $this->level );
-               if( !is_null( $this->namespace ) )
+               }
+               if ( !is_null( $this->namespace ) ) {
                        $conds[] = 'page_namespace=' . $this->mDb->addQuotes( $this->namespace );
+               }
+
                return array(
                        'tables' => array( 'page_restrictions', 'page' ),
                        'fields' => array( 'pr_id', 'page_namespace', 'page_title', 'page_len',
index 6a94deb..21bdf02 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialProtectedtitles extends SpecialPage {
-
        protected $IdLevel = 'level';
        protected $IdType = 'type';
 
@@ -58,8 +57,8 @@ class SpecialProtectedtitles extends SpecialPage {
                if ( $pager->getNumRows() ) {
                        $this->getOutput()->addHTML(
                                $pager->getNavigationBar() .
-                               '<ul>' . $pager->getBody() . '</ul>' .
-                               $pager->getNavigationBar()
+                                       '<ul>' . $pager->getBody() . '</ul>' .
+                                       $pager->getNavigationBar()
                        );
                } else {
                        $this->getOutput()->addWikiMsg( 'protectedtitlesempty' );
@@ -69,6 +68,7 @@ class SpecialProtectedtitles extends SpecialPage {
        /**
         * Callback function to output a restriction
         *
+        * @param object $row Database row
         * @return string
         */
        function formatRow( $row ) {
@@ -76,22 +76,39 @@ class SpecialProtectedtitles extends SpecialPage {
 
                static $infinity = null;
 
-               if( is_null( $infinity ) ) {
+               if ( is_null( $infinity ) ) {
                        $infinity = wfGetDB( DB_SLAVE )->getInfinity();
                }
 
                $title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title );
-               $link = Linker::link( $title );
-
-               $description_items = array ();
+               if ( !$title ) {
+                       wfProfileOut( __METHOD__ );
+
+                       return Html::rawElement(
+                               'li',
+                               array(),
+                               Html::element(
+                                       'span',
+                                       array( 'class' => 'mw-invalidtitle' ),
+                                       Linker::getInvalidTitleDescription(
+                                               $this->getContext(),
+                                               $row->pt_namespace,
+                                               $row->pt_title
+                                       )
+                               )
+                       ) . "\n";
+               }
 
+               $link = Linker::link( $title );
+               $description_items = array();
                $protType = $this->msg( 'restriction-level-' . $row->pt_create_perm )->escaped();
-
                $description_items[] = $protType;
-
                $lang = $this->getLanguage();
-               $expiry = strlen( $row->pt_expiry ) ? $lang->formatExpiry( $row->pt_expiry, TS_MW ) : $infinity;
-               if( $expiry != $infinity ) {
+               $expiry = strlen( $row->pt_expiry ) ?
+                       $lang->formatExpiry( $row->pt_expiry, TS_MW ) :
+                       $infinity;
+
+               if ( $expiry != $infinity ) {
                        $user = $this->getUser();
                        $description_items[] = $this->msg(
                                'protect-expiring-local',
@@ -103,6 +120,7 @@ class SpecialProtectedtitles extends SpecialPage {
 
                wfProfileOut( __METHOD__ );
 
+               // @todo i18n: This should use a comma separator instead of a hard coded comma, right?
                return '<li>' . $lang->specialList( $link, implode( $description_items, ', ' ) ) . "</li>\n";
        }
 
@@ -118,6 +136,7 @@ class SpecialProtectedtitles extends SpecialPage {
                $action = htmlspecialchars( $wgScript );
                $title = $this->getTitle();
                $special = htmlspecialchars( $title->getPrefixedDBkey() );
+
                return "<form action=\"$action\" method=\"get\">\n" .
                        '<fieldset>' .
                        Xml::element( 'legend', array(), $this->msg( 'protectedtitles' )->text() ) .
@@ -142,42 +161,44 @@ class SpecialProtectedtitles extends SpecialPage {
                                'all' => '',
                                'label' => $this->msg( 'namespace' )->text()
                        ), array(
-                               'name'  => 'namespace',
-                               'id'    => 'namespace',
+                               'name' => 'namespace',
+                               'id' => 'namespace',
                                'class' => 'namespaceselector',
                        )
                );
        }
 
        /**
+        * @param string $pr_level Determines which option is selected as default
         * @return string Formatted HTML
         * @private
         */
        function getLevelMenu( $pr_level ) {
                global $wgRestrictionLevels;
 
-               $m = array( $this->msg( 'restriction-level-all' )->text() => 0 ); // Temporary array
+               // Temporary array
+               $m = array( $this->msg( 'restriction-level-all' )->text() => 0 );
                $options = array();
 
                // First pass to load the log names
-               foreach( $wgRestrictionLevels as $type ) {
+               foreach ( $wgRestrictionLevels as $type ) {
                        if ( $type != '' && $type != '*' ) {
                                $text = $this->msg( "restriction-level-$type" )->text();
                                $m[$text] = $type;
                        }
                }
+
                // Is there only one level (aside from "all")?
-               if( count( $m ) <= 2 ) {
+               if ( count( $m ) <= 2 ) {
                        return '';
                }
                // Third pass generates sorted XHTML content
-               foreach( $m as $text => $type ) {
-                       $selected = ($type == $pr_level );
+               foreach ( $m as $text => $type ) {
+                       $selected = ( $type == $pr_level );
                        $options[] = Xml::option( $text, $type, $selected );
                }
 
-               return
-                       Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . '&#160;' .
+               return Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . '&#160;' .
                        Xml::tags( 'select',
                                array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
                                implode( "\n", $options ) );
@@ -195,12 +216,14 @@ class SpecialProtectedtitles extends SpecialPage {
 class ProtectedTitlesPager extends AlphabeticPager {
        public $mForm, $mConds;
 
-       function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype = '', $size = 0 ) {
+       function __construct( $form, $conds = array(), $type, $level, $namespace,
+               $sizetype = '', $size = 0
+       ) {
                $this->mForm = $form;
                $this->mConds = $conds;
                $this->level = $level;
                $this->namespace = $namespace;
-               $this->size = intval($size);
+               $this->size = intval( $size );
                parent::__construct( $form->getContext() );
        }
 
@@ -216,6 +239,7 @@ class ProtectedTitlesPager extends AlphabeticPager {
 
                $lb->execute();
                wfProfileOut( __METHOD__ );
+
                return '';
        }
 
@@ -236,10 +260,14 @@ class ProtectedTitlesPager extends AlphabeticPager {
        function getQueryInfo() {
                $conds = $this->mConds;
                $conds[] = 'pt_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() );
-               if( $this->level )
+               if ( $this->level ) {
                        $conds['pt_create_perm'] = $this->level;
-               if( !is_null( $this->namespace ) )
+               }
+
+               if ( !is_null( $this->namespace ) ) {
                        $conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace );
+               }
+
                return array(
                        'tables' => 'protected_titles',
                        'fields' => array( 'pt_namespace', 'pt_title', 'pt_create_perm',
index ba5a4ac..e4f31f4 100644 (file)
@@ -42,7 +42,7 @@ class RandomPage extends SpecialPage {
        }
 
        public function setNamespace( $ns ) {
-               if( !$ns || $ns < NS_MAIN ) {
+               if ( !$ns || $ns < NS_MAIN ) {
                        $ns = NS_MAIN;
                }
                $this->namespaces = array( $ns );
@@ -62,17 +62,18 @@ class RandomPage extends SpecialPage {
 
                $title = $this->getRandomTitle();
 
-               if( is_null( $title ) ) {
+               if ( is_null( $title ) ) {
                        $this->setHeaders();
                        $this->getOutput()->addWikiMsg( strtolower( $this->getName() ) . '-nopages',
                                $this->getNsList(), count( $this->namespaces ) );
+
                        return;
                }
 
                $redirectParam = $this->isRedirect() ? array( 'redirect' => 'no' ) : array();
                $query = array_merge( $this->getRequest()->getValues(), $redirectParam );
                unset( $query['title'] );
-               $this->getOutput()->redirect( $title->getFullUrl( $query ) );
+               $this->getOutput()->redirect( $title->getFullURL( $query ) );
        }
 
        /**
@@ -83,13 +84,14 @@ class RandomPage extends SpecialPage {
        private function getNsList() {
                global $wgContLang;
                $nsNames = array();
-               foreach( $this->namespaces as $n ) {
-                       if( $n === NS_MAIN ) {
+               foreach ( $this->namespaces as $n ) {
+                       if ( $n === NS_MAIN ) {
                                $nsNames[] = $this->msg( 'blanknamespace' )->plain();
                        } else {
                                $nsNames[] = $wgContLang->getNsText( $n );
                        }
                }
+
                return $wgContLang->commaList( $nsNames );
        }
 
@@ -100,10 +102,14 @@ class RandomPage extends SpecialPage {
        public function getRandomTitle() {
                $randstr = wfRandom();
                $title = null;
-               if ( !wfRunHooks( 'SpecialRandomGetRandomTitle', array( &$randstr, &$this->isRedir, &$this->namespaces,
-                       &$this->extra, &$title ) ) ) {
+
+               if ( !wfRunHooks(
+                       'SpecialRandomGetRandomTitle',
+                       array( &$randstr, &$this->isRedir, &$this->namespaces, &$this->extra, &$title )
+               ) ) {
                        return $title;
                }
+
                $row = $this->selectRandomPageFromDB( $randstr );
 
                /* If we picked a value that was higher than any in
@@ -113,15 +119,15 @@ class RandomPage extends SpecialPage {
                 * any more bias than what the page_random scheme
                 * causes anyway.  Trust me, I'm a mathematician. :)
                 */
-               if( !$row ) {
+               if ( !$row ) {
                        $row = $this->selectRandomPageFromDB( "0" );
                }
 
-               if( $row ) {
+               if ( $row ) {
                        return Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-               } else {
-                       return null;
                }
+
+               return null;
        }
 
        protected function getQueryInfo( $randstr ) {
index 51783a2..7c36a28 100644 (file)
@@ -32,5 +32,4 @@ class SpecialRandomredirect extends RandomPage {
                parent::__construct( 'Randomredirect' );
                $this->isRedir = true;
        }
-
 }
index 008678f..1b406d1 100644 (file)
@@ -47,7 +47,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $opts->add( 'from', '' );
 
                $opts->add( 'hideminor', $this->getUser()->getBoolOption( 'hideminor' ) );
-               $opts->add( 'hidebots', true  );
+               $opts->add( 'hidebots', true );
                $opts->add( 'hideanons', false );
                $opts->add( 'hideliu', false );
                $opts->add( 'hidepatrolled', $this->getUser()->getBoolOption( 'hidepatrolled' ) );
@@ -60,44 +60,47 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $opts->add( 'categories', '' );
                $opts->add( 'categories_any', false );
                $opts->add( 'tagfilter', '' );
+
                return $opts;
        }
 
        /**
         * Create a FormOptions object with options as specified by the user
         *
-        * @param $parameters array
+        * @param array $parameters
         *
         * @return FormOptions
         */
        public function setup( $parameters ) {
                $opts = $this->getDefaultOptions();
 
-               foreach( $this->getCustomFilters() as $key => $params ) {
+               foreach ( $this->getCustomFilters() as $key => $params ) {
                        $opts->add( $key, $params['default'] );
                }
 
                $opts->fetchValuesFromRequest( $this->getRequest() );
 
                // Give precedence to subpage syntax
-               if( $parameters !== null ) {
+               if ( $parameters !== null ) {
                        $this->parseParameters( $parameters, $opts );
                }
 
                $opts->validateIntBounds( 'limit', 0, 5000 );
+
                return $opts;
        }
 
        /**
         * Get custom show/hide filters
         *
-        * @return Array Map of filter URL param names to properties (msg/default)
+        * @return array Map of filter URL param names to properties (msg/default)
         */
        protected function getCustomFilters() {
                if ( $this->customFilters === null ) {
                        $this->customFilters = array();
                        wfRunHooks( 'SpecialRecentChangesFilters', array( $this, &$this->customFilters ) );
                }
+
                return $this->customFilters;
        }
 
@@ -111,6 +114,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $opts = $this->getDefaultOptions();
                $opts->fetchValuesFromRequest( $this->getRequest() );
                $opts->validateIntBounds( 'limit', 0, $wgFeedLimit );
+
                return $opts;
        }
 
@@ -126,13 +130,14 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        }
                        $this->rcOptions = $isFeed ? $this->feedSetup() : $this->setup( $this->rcSubpage );
                }
+
                return $this->rcOptions;
        }
 
        /**
         * Main execution point
         *
-        * @param $subpage String
+        * @param string $subpage
         */
        public function execute( $subpage ) {
                $this->rcSubpage = $subpage;
@@ -142,7 +147,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $this->getOutput()->setSquidMaxage( 10 );
                # Check if the client has a cached version
                $lastmod = $this->checkLastModified( $feedFormat );
-               if( $lastmod === false ) {
+               if ( $lastmod === false ) {
                        return;
                }
 
@@ -154,24 +159,26 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                // Fetch results, prepare a batch link existence check query
                $conds = $this->buildMainQueryConds( $opts );
                $rows = $this->doMainQuery( $conds, $opts );
-               if( $rows === false ) {
-                       if( !$this->including() ) {
+               if ( $rows === false ) {
+                       if ( !$this->including() ) {
                                $this->doHeader( $opts );
                        }
+
                        return;
                }
 
-               if( !$feedFormat ) {
+               if ( !$feedFormat ) {
                        $batch = new LinkBatch;
-                       foreach( $rows as $row ) {
+                       foreach ( $rows as $row ) {
                                $batch->add( NS_USER, $row->rc_user_text );
                                $batch->add( NS_USER_TALK, $row->rc_user_text );
                                $batch->add( $row->rc_namespace, $row->rc_title );
                        }
                        $batch->execute();
                }
-               if( $feedFormat ) {
+               if ( $feedFormat ) {
                        list( $changesFeed, $formatter ) = $this->getFeedObject( $feedFormat );
+                       /** @var ChangesFeed $changesFeed */
                        $changesFeed->execute( $formatter, $rows, $lastmod, $opts );
                } else {
                        $this->webOutput( $rows, $opts );
@@ -183,7 +190,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Return an array with a ChangesFeed object and ChannelFeed object
         *
-        * @return Array
+        * @param string $feedFormat Feed's format (either 'rss' or 'atom')
+        * @return array
         */
        public function getFeedObject( $feedFormat ) {
                $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' );
@@ -192,6 +200,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $this->msg( 'recentchanges-feed-description' )->inContentLanguage()->text(),
                        $this->getTitle()->getFullURL()
                );
+
                return array( $changesFeed, $formatter );
        }
 
@@ -199,49 +208,49 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * Process $par and put options found if $opts
         * Mainly used when including the page
         *
-        * @param $par String
-        * @param $opts FormOptions
+        * @param string $par
+        * @param FormOptions $opts
         */
        public function parseParameters( $par, FormOptions $opts ) {
                $bits = preg_split( '/\s*,\s*/', trim( $par ) );
-               foreach( $bits as $bit ) {
-                       if( 'hidebots' === $bit ) {
+               foreach ( $bits as $bit ) {
+                       if ( 'hidebots' === $bit ) {
                                $opts['hidebots'] = true;
                        }
-                       if( 'bots' === $bit ) {
+                       if ( 'bots' === $bit ) {
                                $opts['hidebots'] = false;
                        }
-                       if( 'hideminor' === $bit ) {
+                       if ( 'hideminor' === $bit ) {
                                $opts['hideminor'] = true;
                        }
-                       if( 'minor' === $bit ) {
+                       if ( 'minor' === $bit ) {
                                $opts['hideminor'] = false;
                        }
-                       if( 'hideliu' === $bit ) {
+                       if ( 'hideliu' === $bit ) {
                                $opts['hideliu'] = true;
                        }
-                       if( 'hidepatrolled' === $bit ) {
+                       if ( 'hidepatrolled' === $bit ) {
                                $opts['hidepatrolled'] = true;
                        }
-                       if( 'hideanons' === $bit ) {
+                       if ( 'hideanons' === $bit ) {
                                $opts['hideanons'] = true;
                        }
-                       if( 'hidemyself' === $bit ) {
+                       if ( 'hidemyself' === $bit ) {
                                $opts['hidemyself'] = true;
                        }
 
-                       if( is_numeric( $bit ) ) {
+                       if ( is_numeric( $bit ) ) {
                                $opts['limit'] = $bit;
                        }
 
                        $m = array();
-                       if( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) {
+                       if ( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) {
                                $opts['limit'] = $m[1];
                        }
-                       if( preg_match( '/^days=(\d+)$/', $bit, $m ) ) {
+                       if ( preg_match( '/^days=(\d+)$/', $bit, $m ) ) {
                                $opts['days'] = $m[1];
                        }
-                       if( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) {
+                       if ( preg_match( '/^namespace=(\d+)$/', $bit, $m ) ) {
                                $opts['namespace'] = $m[1];
                        }
                }
@@ -252,25 +261,26 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * Don't use this if we are using the patrol feature, patrol changes don't
         * update the timestamp
         *
-        * @param $feedFormat String
-        * @return String or false
+        * @param string $feedFormat
+        * @return string|bool
         */
        public function checkLastModified( $feedFormat ) {
                $dbr = wfGetDB( DB_SLAVE );
                $lastmod = $dbr->selectField( 'recentchanges', 'MAX(rc_timestamp)', false, __METHOD__ );
-               if( $feedFormat || !$this->getUser()->useRCPatrol() ) {
-                       if( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
+               if ( $feedFormat || !$this->getUser()->useRCPatrol() ) {
+                       if ( $lastmod && $this->getOutput()->checkLastModified( $lastmod ) ) {
                                # Client cache fresh and headers sent, nothing more to do.
                                return false;
                        }
                }
+
                return $lastmod;
        }
 
        /**
         * Return an array of conditions depending of options set in $opts
         *
-        * @param $opts FormOptions
+        * @param FormOptions $opts
         * @return array
         */
        public function buildMainQueryConds( FormOptions $opts ) {
@@ -280,9 +290,9 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                # It makes no sense to hide both anons and logged-in users
                # Where this occurs, force anons to be shown
                $forcebot = false;
-               if( $opts['hideanons'] && $opts['hideliu'] ) {
+               if ( $opts['hideanons'] && $opts['hideliu'] ) {
                        # Check if the user wants to show bots only
-                       if( $opts['hidebots'] ) {
+                       if ( $opts['hidebots'] ) {
                                $opts['hideanons'] = false;
                        } else {
                                $forcebot = true;
@@ -292,11 +302,11 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                // Calculate cutoff
                $cutoff_unixtime = time() - ( $opts['days'] * 86400 );
-               $cutoff_unixtime = $cutoff_unixtime - ($cutoff_unixtime % 86400);
+               $cutoff_unixtime = $cutoff_unixtime - ( $cutoff_unixtime % 86400 );
                $cutoff = $dbr->timestamp( $cutoff_unixtime );
 
                $fromValid = preg_match( '/^[0-9]{14}$/', $opts['from'] );
-               if( $fromValid && $opts['from'] > wfTimestamp( TS_MW, $cutoff ) ) {
+               if ( $fromValid && $opts['from'] > wfTimestamp( TS_MW, $cutoff ) ) {
                        $cutoff = $dbr->timestamp( $opts['from'] );
                } else {
                        $opts->reset( 'from' );
@@ -308,27 +318,27 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $hideLoggedInUsers = $opts['hideliu'] && !$forcebot;
                $hideAnonymousUsers = $opts['hideanons'] && !$forcebot;
 
-               if( $opts['hideminor'] ) {
+               if ( $opts['hideminor'] ) {
                        $conds['rc_minor'] = 0;
                }
-               if( $opts['hidebots'] ) {
+               if ( $opts['hidebots'] ) {
                        $conds['rc_bot'] = 0;
                }
-               if( $hidePatrol ) {
+               if ( $hidePatrol ) {
                        $conds['rc_patrolled'] = 0;
                }
-               if( $forcebot ) {
+               if ( $forcebot ) {
                        $conds['rc_bot'] = 1;
                }
-               if( $hideLoggedInUsers ) {
+               if ( $hideLoggedInUsers ) {
                        $conds[] = 'rc_user = 0';
                }
-               if( $hideAnonymousUsers ) {
+               if ( $hideAnonymousUsers ) {
                        $conds[] = 'rc_user != 0';
                }
 
-               if( $opts['hidemyself'] ) {
-                       if( $this->getUser()->getId() ) {
+               if ( $opts['hidemyself'] ) {
+                       if ( $this->getUser()->getId() ) {
                                $conds[] = 'rc_user != ' . $dbr->addQuotes( $this->getUser()->getId() );
                        } else {
                                $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $this->getUser()->getName() );
@@ -336,13 +346,13 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                }
 
                # Namespace filtering
-               if( $opts['namespace'] !== '' ) {
+               if ( $opts['namespace'] !== '' ) {
                        $selectedNS = $dbr->addQuotes( $opts['namespace'] );
-                       $operator = $opts['invert'] ? '!='  : '=';
+                       $operator = $opts['invert'] ? '!=' : '=';
                        $boolean = $opts['invert'] ? 'AND' : 'OR';
 
                        # namespace association (bug 2429)
-                       if( !$opts['associated'] ) {
+                       if ( !$opts['associated'] ) {
                                $condition = "rc_namespace $operator $selectedNS";
                        } else {
                                # Also add the associated namespace
@@ -356,15 +366,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                        $conds[] = $condition;
                }
+
                return $conds;
        }
 
        /**
         * Process the query
         *
-        * @param $conds Array
-        * @param $opts FormOptions
-        * @return bool|ResultWrapper result or false (for Recentchangeslinked only)
+        * @param array $conds
+        * @param FormOptions $opts
+        * @return bool|ResultWrapper Result or false (for Recentchangeslinked only)
         */
        public function doMainQuery( $conds, $opts ) {
                $tables = array( 'recentchanges' );
@@ -390,7 +401,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                                'wl_user' => $uid,
                                'wl_title=rc_title',
                                'wl_namespace=rc_namespace'
-                       ));
+                       ) );
                }
                if ( $this->getUser()->isAllowed( 'rollback' ) ) {
                        $tables[] = 'page';
@@ -408,8 +419,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                );
 
                if ( !wfRunHooks( 'SpecialRecentChangesQuery',
-                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ) ) )
-               {
+                       array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$fields ) )
+               {
                        return false;
                }
 
@@ -418,17 +429,18 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                // (b) We want pages in more than one namespace (inverted/associated)
                // (c) There is a tag to filter on (use tag index instead)
                // (d) UNION + sort/limit is not an option for the DBMS
-               if( $namespace === ''
+               if ( $namespace === ''
                        || ( $invert || $associated )
                        || $opts['tagfilter'] != ''
-                       || !$dbr->unionSupportsOrderAndLimit() )
-               {
+                       || !$dbr->unionSupportsOrderAndLimit()
+               {
                        $res = $dbr->select( $tables, $fields, $conds, __METHOD__,
                                array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit ) +
-                               $query_options,
+                                       $query_options,
                                $join_conds );
-               // We have a new_namespace_time index! UNION over new=(0,1) and sort result set!
                } else {
+                       // We have a new_namespace_time index! UNION over new=(0,1) and sort result set!
+
                        // New pages
                        $sqlNew = $dbr->selectSQLText(
                                $tables,
@@ -442,6 +454,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                                ),
                                $join_conds
                        );
+
                        // Old pages
                        $sqlOld = $dbr->selectSQLText(
                                $tables,
@@ -455,6 +468,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                                ),
                                $join_conds
                        );
+
                        # Join the two fast queries, and sort the result set
                        $sql = $dbr->unionQueries( array( $sqlNew, $sqlOld ), false ) .
                                ' ORDER BY rc_timestamp DESC';
@@ -468,15 +482,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Send output to the OutputPage object, only called if not used feeds
         *
-        * @param array $rows of database rows
-        * @param $opts FormOptions
+        * @param array $rows Database rows
+        * @param FormOptions $opts
         */
        public function webOutput( $rows, $opts ) {
                global $wgRCShowWatchingUsers, $wgShowUpdatedMarker, $wgAllowCategorizedRecentChanges;
 
                $limit = $opts['limit'];
 
-               if( !$this->including() ) {
+               if ( !$this->including() ) {
                        // Output options box
                        $this->doHeader( $opts );
                }
@@ -489,11 +503,12 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $this->getOutput()->setFeedAppendQuery( false );
                }
 
-               if( $wgAllowCategorizedRecentChanges ) {
+               if ( $wgAllowCategorizedRecentChanges ) {
                        $this->filterByCategories( $rows, $opts );
                }
 
-               $showWatcherCount = $wgRCShowWatchingUsers && $this->getUser()->getOption( 'shownumberswatching' );
+               $showNumsWachting = $this->getUser()->getOption( 'shownumberswatching' );
+               $showWatcherCount = $wgRCShowWatchingUsers && $showNumsWachting;
                $watcherCache = array();
 
                $dbr = wfGetDB( DB_SLAVE );
@@ -502,22 +517,22 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $list = ChangesList::newFromContext( $this->getContext() );
 
                $s = $list->beginRecentChangesList();
-               foreach( $rows as $obj ) {
-                       if( $limit == 0 ) {
+               foreach ( $rows as $obj ) {
+                       if ( $limit == 0 ) {
                                break;
                        }
                        $rc = RecentChange::newFromRow( $obj );
                        $rc->counter = $counter++;
                        # Check if the page has been updated since the last visit
-                       if( $wgShowUpdatedMarker && !empty( $obj->wl_notificationtimestamp ) ) {
+                       if ( $wgShowUpdatedMarker && !empty( $obj->wl_notificationtimestamp ) ) {
                                $rc->notificationtimestamp = ( $obj->rc_timestamp >= $obj->wl_notificationtimestamp );
                        } else {
                                $rc->notificationtimestamp = false; // Default
                        }
                        # Check the number of users watching the page
                        $rc->numberofWatchingusers = 0; // Default
-                       if( $showWatcherCount && $obj->rc_namespace >= 0 ) {
-                               if( !isset( $watcherCache[$obj->rc_namespace][$obj->rc_title] ) ) {
+                       if ( $showWatcherCount && $obj->rc_namespace >= 0 ) {
+                               if ( !isset( $watcherCache[$obj->rc_namespace][$obj->rc_title] ) ) {
                                        $watcherCache[$obj->rc_namespace][$obj->rc_title] =
                                                $dbr->selectField(
                                                        'watchlist',
@@ -567,8 +582,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Return the text to be displayed above the changes
         *
-        * @param $opts FormOptions
-        * @return String: XHTML
+        * @param FormOptions $opts
+        * @return string XHTML
         */
        public function doHeader( $opts ) {
                global $wgScript;
@@ -592,24 +607,36 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $submit = ' ' . Xml::submitbutton( $this->msg( 'allpagessubmit' )->text() );
 
                $out = Xml::openElement( 'table', array( 'class' => 'mw-recentchanges-table' ) );
-               foreach( $extraOpts as $name => $optionRow ) {
+               foreach ( $extraOpts as $name => $optionRow ) {
                        # Add submit button to the last row only
                        ++$count;
                        $addSubmit = ( $count === $extraOptsCount ) ? $submit : '';
 
                        $out .= Xml::openElement( 'tr' );
-                       if( is_array( $optionRow ) ) {
-                               $out .= Xml::tags( 'td', array( 'class' => 'mw-label mw-' . $name . '-label' ), $optionRow[0] );
-                               $out .= Xml::tags( 'td', array( 'class' => 'mw-input' ), $optionRow[1] . $addSubmit );
+                       if ( is_array( $optionRow ) ) {
+                               $out .= Xml::tags(
+                                       'td',
+                                       array( 'class' => 'mw-label mw-' . $name . '-label' ),
+                                       $optionRow[0]
+                               );
+                               $out .= Xml::tags(
+                                       'td',
+                                       array( 'class' => 'mw-input' ),
+                                       $optionRow[1] . $addSubmit
+                               );
                        } else {
-                               $out .= Xml::tags( 'td', array( 'class' => 'mw-input', 'colspan' => 2 ), $optionRow . $addSubmit );
+                               $out .= Xml::tags(
+                                       'td',
+                                       array( 'class' => 'mw-input', 'colspan' => 2 ),
+                                       $optionRow . $addSubmit
+                               );
                        }
                        $out .= Xml::closeElement( 'tr' );
                }
                $out .= Xml::closeElement( 'table' );
 
                $unconsumed = $opts->getUnconsumedValues();
-               foreach( $unconsumed as $key => $value ) {
+               foreach ( $unconsumed as $key => $value ) {
                        $out .= Html::hidden( $key, $value );
                }
 
@@ -620,7 +647,11 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $panelString = implode( "\n", $panel );
 
                $this->getOutput()->addHTML(
-                       Xml::fieldset( $this->msg( 'recentchanges-legend' )->text(), $panelString, array( 'class' => 'rcoptions' ) )
+                       Xml::fieldset(
+                               $this->msg( 'recentchanges-legend' )->text(),
+                               $panelString,
+                               array( 'class' => 'rcoptions' )
+                       )
                );
 
                $this->setBottomText( $opts );
@@ -629,15 +660,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Get options to be displayed in a form
         *
-        * @param $opts FormOptions
-        * @return Array
+        * @param FormOptions $opts
+        * @return array
         */
        function getExtraOptions( $opts ) {
                $extraOpts = array();
                $extraOpts['namespace'] = $this->namespaceFilterForm( $opts );
 
                global $wgAllowCategorizedRecentChanges;
-               if( $wgAllowCategorizedRecentChanges ) {
+               if ( $wgAllowCategorizedRecentChanges ) {
                        $extraOpts['category'] = $this->categoryFilterForm( $opts );
                }
 
@@ -647,13 +678,14 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                }
 
                wfRunHooks( 'SpecialRecentChangesPanel', array( &$extraOpts, $opts ) );
+
                return $extraOpts;
        }
 
        /**
         * Send the text to be displayed above the options
         *
-        * @param $opts FormOptions
+        * @param FormOptions $opts Unused
         */
        function setTopText( FormOptions $opts ) {
                global $wgContLang;
@@ -675,16 +707,17 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         * Send the text to be displayed after the options, for use in
         * Recentchangeslinked
         *
-        * @param $opts FormOptions
+        * @param FormOptions $opts
         */
-       function setBottomText( FormOptions $opts ) {}
+       function setBottomText( FormOptions $opts ) {
+       }
 
        /**
         * Creates the choose namespace selection
         *
         * @todo Uses radio buttons (HASHAR)
-        * @param $opts FormOptions
-        * @return String
+        * @param FormOptions $opts
+        * @return string
         */
        protected function namespaceFilterForm( FormOptions $opts ) {
                $nsSelect = Html::namespaceSelector(
@@ -702,14 +735,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $opts['associated'],
                        array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
                );
+
                return array( $nsLabel, "$nsSelect $invert $associated" );
        }
 
        /**
         * Create a input to filter changes by categories
         *
-        * @param $opts FormOptions
-        * @return Array
+        * @param FormOptions $opts
+        * @return array
         */
        protected function categoryFilterForm( FormOptions $opts ) {
                list( $label, $input ) = Xml::inputLabelSep( $this->msg( 'rc_categories' )->text(),
@@ -724,21 +758,21 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Filter $rows by categories set in $opts
         *
-        * @param array $rows of database rows
-        * @param $opts FormOptions
+        * @param array $rows Database rows
+        * @param FormOptions $opts
         */
        function filterByCategories( &$rows, FormOptions $opts ) {
                $categories = array_map( 'trim', explode( '|', $opts['categories'] ) );
 
-               if( !count( $categories ) ) {
+               if ( !count( $categories ) ) {
                        return;
                }
 
                # Filter categories
                $cats = array();
-               foreach( $categories as $cat ) {
+               foreach ( $categories as $cat ) {
                        $cat = trim( $cat );
-                       if( $cat == '' ) {
+                       if ( $cat == '' ) {
                                continue;
                        }
                        $cats[] = $cat;
@@ -748,16 +782,16 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $articles = array();
                $a2r = array();
                $rowsarr = array();
-               foreach( $rows as $k => $r ) {
+               foreach ( $rows as $k => $r ) {
                        $nt = Title::makeTitle( $r->rc_namespace, $r->rc_title );
                        $id = $nt->getArticleID();
-                       if( $id == 0 ) {
+                       if ( $id == 0 ) {
                                continue; # Page might have been deleted...
                        }
-                       if( !in_array( $id, $articles ) ) {
+                       if ( !in_array( $id, $articles ) ) {
                                $articles[] = $id;
                        }
-                       if( !isset( $a2r[$id] ) ) {
+                       if ( !isset( $a2r[$id] ) ) {
                                $a2r[$id] = array();
                        }
                        $a2r[$id][] = $k;
@@ -765,7 +799,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                }
 
                # Shortcut?
-               if( !count( $articles ) || !count( $cats ) ) {
+               if ( !count( $articles ) || !count( $cats ) ) {
                        return;
                }
 
@@ -776,8 +810,8 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                # Filter
                $newrows = array();
-               foreach( $match as $id ) {
-                       foreach( $a2r[$id] as $rev ) {
+               foreach ( $match as $id ) {
+                       foreach ( $a2r[$id] as $rev ) {
                                $k = $rev;
                                $newrows[$k] = $rowsarr[$k];
                        }
@@ -788,10 +822,10 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        /**
         * Makes change an option link which carries all the other options
         *
-        * @param $title Title
-        * @param array $override options to override
-        * @param array $options current options
-        * @param $active Boolean: whether to show the link in bold
+        * @param string $title Title
+        * @param array $override Options to override
+        * @param array $options Current options
+        * @param bool $active Whether to show the link in bold
         * @return string
         */
        function makeOptionsLink( $title, $override, $options, $active = false ) {
@@ -810,14 +844,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                if ( $active ) {
                        $text = '<strong>' . $text . '</strong>';
                }
+
                return Linker::linkKnown( $this->getTitle(), $text, array(), $params );
        }
 
        /**
         * Creates the options panel.
         *
-        * @param $defaults Array
-        * @param $nondefaults Array
+        * @param array $defaults
+        * @param array $nondefaults
         * @return string
         */
        function optionsPanel( $defaults, $nondefaults ) {
@@ -827,13 +862,13 @@ class SpecialRecentChanges extends IncludableSpecialPage {
 
                $note = '';
                $msg = $this->msg( 'rclegend' );
-               if( !$msg->isDisabled() ) {
+               if ( !$msg->isDisabled() ) {
                        $note .= '<div class="mw-rclegend">' . $msg->parse() . "</div>\n";
                }
 
                $lang = $this->getLanguage();
                $user = $this->getUser();
-               if( $options['from'] ) {
+               if ( $options['from'] ) {
                        $note .= $this->msg( 'rcnotefrom' )->numParams( $options['limit'] )->params(
                                $lang->userTimeAndDate( $options['from'], $user ),
                                $lang->userDate( $options['from'], $user ),
@@ -841,22 +876,27 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                }
 
                # Sort data for display and make sure it's unique after we've added user data.
-               $wgRCLinkLimits[] = $options['limit'];
-               $wgRCLinkDays[] = $options['days'];
-               sort( $wgRCLinkLimits );
-               sort( $wgRCLinkDays );
-               $wgRCLinkLimits = array_unique( $wgRCLinkLimits );
-               $wgRCLinkDays = array_unique( $wgRCLinkDays );
+               $linkLimits = $wgRCLinkLimits;
+               $linkLimits[] = $options['limit'];
+               sort( $linkLimits );
+               $linkLimits = array_unique( $linkLimits );
+
+               $linkDays = $wgRCLinkDays;
+               $linkDays[] = $options['days'];
+               sort( $linkDays );
+               $linkDays = array_unique( $linkDays );
 
                // limit links
-               foreach( $wgRCLinkLimits as $value ) {
+               $cl = array();
+               foreach ( $linkLimits as $value ) {
                        $cl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'limit' => $value ), $nondefaults, $value == $options['limit'] );
                }
                $cl = $lang->pipeList( $cl );
 
                // day links, reset 'from' to none
-               foreach( $wgRCLinkDays as $value ) {
+               $dl = array();
+               foreach ( $linkDays as $value ) {
                        $dl[] = $this->makeOptionsLink( $lang->formatNum( $value ),
                                array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] );
                }
@@ -865,12 +905,12 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                // show/hide links
                $showhide = array( $this->msg( 'show' )->text(), $this->msg( 'hide' )->text() );
                $filters = array(
-                       'hideminor'     => 'rcshowhideminor',
-                       'hidebots'      => 'rcshowhidebots',
-                       'hideanons'     => 'rcshowhideanons',
-                       'hideliu'       => 'rcshowhideliu',
+                       'hideminor' => 'rcshowhideminor',
+                       'hidebots' => 'rcshowhidebots',
+                       'hideanons' => 'rcshowhideanons',
+                       'hideliu' => 'rcshowhideliu',
                        'hidepatrolled' => 'rcshowhidepatr',
-                       'hidemyself'    => 'rcshowhidemine'
+                       'hidemyself' => 'rcshowhidemine'
                );
                foreach ( $this->getCustomFilters() as $key => $params ) {
                        $filters[$key] = $params['msg'];
@@ -883,7 +923,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $links = array();
                foreach ( $filters as $key => $msg ) {
                        $link = $this->makeOptionsLink( $showhide[1 - $options[$key]],
-                               array( $key => 1-$options[$key] ), $nondefaults );
+                               array( $key => 1 - $options[$key] ), $nondefaults );
                        $links[] = $this->msg( $msg )->rawParams( $link )->escaped();
                }
 
@@ -894,13 +934,15 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                        $now, array( 'from' => $timestamp ), $nondefaults
                );
 
-               $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )->parse();
+               $rclinks = $this->msg( 'rclinks' )->rawParams( $cl, $dl, $lang->pipeList( $links ) )
+                       ->parse();
                $rclistfrom = $this->msg( 'rclistfrom' )->rawParams( $tl )->parse();
+
                return "{$note}$rclinks<br />$rclistfrom";
        }
 
        /**
-        * add javascript specific to the [[Special:RecentChanges]] page
+        * Add JavaScript to the page
         */
        function addRecentChangesJS() {
                $this->getOutput()->addModules( array(
index 391c4a7..062e09d 100644 (file)
@@ -56,7 +56,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        $this->msg( 'recentchangeslinked-title', $this->getTargetTitle()->getPrefixedText() )
                                ->inContentLanguage()->text(),
                        $this->msg( 'recentchangeslinked-feed' )->inContentLanguage()->text(),
-                       $this->getTitle()->getFullUrl()
+                       $this->getTitle()->getFullURL()
                );
                return array( $feed, $feedObj );
        }
@@ -71,7 +71,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                }
                $outputPage = $this->getOutput();
                $title = Title::newFromURL( $target );
-               if( !$title || $title->getInterwiki() != '' ) {
+               if ( !$title || $title->getInterwiki() != '' ) {
                        $outputPage->wrapWikiMsg( "<div class=\"errorbox\">\n$1\n</div><br style=\"clear: both\" />", 'allpagesbadtitle' );
                        return false;
                }
@@ -99,7 +99,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
                // left join with watchlist table to highlight watched rows
                $uid = $this->getUser()->getId();
-               if( $uid ) {
+               if ( $uid ) {
                        $tables[] = 'watchlist';
                        $select[] = 'wl_user';
                        $join_conds['watchlist'] = array( 'LEFT JOIN', array(
@@ -126,7 +126,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        return false;
                }
 
-               if( $ns == NS_CATEGORY && !$showlinkedto ) {
+               if ( $ns == NS_CATEGORY && !$showlinkedto ) {
                        // special handling for categories
                        // XXX: should try to make this less kludgy
                        $link_tables = array( 'categorylinks' );
@@ -135,12 +135,12 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        // for now, always join on these tables; really should be configurable as in whatlinkshere
                        $link_tables = array( 'pagelinks', 'templatelinks' );
                        // imagelinks only contains links to pages in NS_FILE
-                       if( $ns == NS_FILE || !$showlinkedto ) {
+                       if ( $ns == NS_FILE || !$showlinkedto ) {
                                $link_tables[] = 'imagelinks';
                        }
                }
 
-               if( $id == 0 && !$showlinkedto ) {
+               if ( $id == 0 && !$showlinkedto ) {
                        return false; // nonexistent pages can't link to any pages
                }
 
@@ -149,22 +149,22 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
                $subsql = array(); // SELECT statements to combine with UNION
 
-               foreach( $link_tables as $link_table ) {
+               foreach ( $link_tables as $link_table ) {
                        $pfx = $prefix[$link_table];
 
                        // imagelinks and categorylinks tables have no xx_namespace field, and have xx_to instead of xx_title
-                       if( $link_table == 'imagelinks' ) {
+                       if ( $link_table == 'imagelinks' ) {
                                $link_ns = NS_FILE;
-                       } elseif( $link_table == 'categorylinks' ) {
+                       } elseif ( $link_table == 'categorylinks' ) {
                                $link_ns = NS_CATEGORY;
                        } else {
                                $link_ns = 0;
                        }
 
-                       if( $showlinkedto ) {
+                       if ( $showlinkedto ) {
                                // find changes to pages linking to this page
-                               if( $link_ns ) {
-                                       if( $ns != $link_ns ) {
+                               if ( $link_ns ) {
+                                       if ( $ns != $link_ns ) {
                                                continue;
                                        } // should never happen, but check anyway
                                        $subconds = array( "{$pfx}_to" => $dbkey );
@@ -175,7 +175,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                        } else {
                                // find changes to pages linked from this page
                                $subconds = array( "{$pfx}_from" => $id );
-                               if( $link_table == 'imagelinks' || $link_table == 'categorylinks' ) {
+                               if ( $link_table == 'imagelinks' || $link_table == 'categorylinks' ) {
                                        $subconds["rc_namespace"] = $link_ns;
                                        $subjoin = "rc_title = {$pfx}_to";
                                } else {
@@ -183,7 +183,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                                }
                        }
 
-                       if( $dbr->unionSupportsOrderAndLimit()) {
+                       if ( $dbr->unionSupportsOrderAndLimit() ) {
                                $order = array( 'ORDER BY' => 'rc_timestamp DESC' );
                        } else {
                                $order = array();
@@ -198,16 +198,17 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                                $join_conds + array( $link_table => array( 'INNER JOIN', $subjoin ) )
                        );
 
-                       if( $dbr->unionSupportsOrderAndLimit())
+                       if ( $dbr->unionSupportsOrderAndLimit() ) {
                                $query = $dbr->limitResult( $query, $limit );
+                       }
 
                        $subsql[] = $query;
                }
 
-               if( count( $subsql ) == 0 ) {
+               if ( count( $subsql ) == 0 ) {
                        return false; // should never happen
                }
-               if( count( $subsql ) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
+               if ( count( $subsql ) == 1 && $dbr->unionSupportsOrderAndLimit() ) {
                        $sql = $subsql[0];
                } else {
                        // need to resort and relimit after union
@@ -217,7 +218,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
                $res = $dbr->query( $sql, __METHOD__ );
 
-               if( $res->numRows() == 0 ) {
+               if ( $res->numRows() == 0 ) {
                        $this->mResultEmpty = true;
                }
 
@@ -260,13 +261,13 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
 
        function setTopText( FormOptions $opts ) {
                $target = $this->getTargetTitle();
-               if( $target ) {
+               if ( $target ) {
                        $this->getOutput()->addBacklinkSubtitle( $target );
                }
        }
 
        function setBottomText( FormOptions $opts ) {
-               if( isset( $this->mResultEmpty ) && $this->mResultEmpty ) {
+               if ( isset( $this->mResultEmpty ) && $this->mResultEmpty ) {
                        $this->getOutput()->addWikiMsg( 'recentchangeslinked-noresult' );
                }
        }
diff --git a/includes/specials/SpecialRedirect.php b/includes/specials/SpecialRedirect.php
new file mode 100644 (file)
index 0000000..2681207
--- /dev/null
@@ -0,0 +1,232 @@
+<?php
+/**
+ * Implements Special:Redirect
+ *
+ * @section LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * A special page that redirects to: the user for a numeric user id,
+ * the file for a given filename, or the page for a given revision id.
+ *
+ * @ingroup SpecialPage
+ * @since 1.22
+ */
+class SpecialRedirect extends FormSpecialPage {
+
+       /**
+        * The type of the redirect (user/file/revision)
+        *
+        * @var string $mType
+        * @example 'user'
+        */
+       protected $mType;
+
+       /**
+        * The identifier/value for the redirect (which id, which file)
+        *
+        * @var string $mValue
+        * @example '42'
+        */
+       protected $mValue;
+
+       function __construct() {
+               parent::__construct( 'Redirect' );
+               $this->mType = null;
+               $this->mValue = null;
+       }
+
+       /**
+        * Set $mType and $mValue based on parsed value of $subpage.
+        */
+       function setParameter( $subpage ) {
+               // parse $subpage to pull out the parts
+               $parts = explode( '/', $subpage, 2 );
+               $this->mType = count( $parts ) > 0 ? $parts[0] : null;
+               $this->mValue = count( $parts ) > 1 ? $parts[1] : null;
+       }
+
+       /**
+        * Handle Special:Redirect/user/xxxx (by redirecting to User:YYYY)
+        *
+        * @return string|null url to redirect to, or null if $mValue is invalid.
+        */
+       function dispatchUser() {
+               if ( !ctype_digit( $this->mValue ) ) {
+                       return null;
+               }
+               $user = User::newFromId( (int)$this->mValue );
+               $username = $user->getName(); // load User as side-effect
+               if ( $user->isAnon() ) {
+                       return null;
+               }
+               $userpage = Title::makeTitle( NS_USER, $username );
+               return $userpage->getFullURL( '', false, PROTO_CURRENT );
+       }
+
+       /**
+        * Handle Special:Redirect/file/xxxx
+        *
+        * @return string|null url to redirect to, or null if $mValue is not found.
+        */
+       function dispatchFile() {
+               $title = Title::makeTitleSafe( NS_FILE, $this->mValue );
+
+               if ( ! $title instanceof Title ) {
+                       return null;
+               }
+               $file = wfFindFile( $title );
+
+               if ( !$file || !$file->exists() ) {
+                       return null;
+               }
+               // Default behavior: Use the direct link to the file.
+               $url = $file->getURL();
+               $request = $this->getRequest();
+               $width = $request->getInt( 'width', -1 );
+               $height = $request->getInt( 'height', -1 );
+
+               // If a width is requested...
+               if ( $width != -1 ) {
+                       $mto = $file->transform( array( 'width' => $width, 'height' => $height ) );
+                       // ... and we can
+                       if ( $mto && !$mto->isError() ) {
+                               // ... change the URL to point to a thumbnail.
+                               $url = $mto->getURL();
+                       }
+               }
+               return $url;
+       }
+
+       /**
+        * Handle Special:Redirect/revision/xxx
+        * (by redirecting to index.php?oldid=xxx)
+        *
+        * @return string|null url to redirect to, or null if $mValue is invalid.
+        */
+       function dispatchRevision() {
+               $oldid = $this->mValue;
+               if ( !ctype_digit( $oldid ) ) {
+                       return null;
+               }
+               $oldid = (int)$oldid;
+               if ( $oldid === 0 ) {
+                       return null;
+               }
+               return wfAppendQuery( wfScript( 'index' ), array(
+                       'oldid' => $oldid
+               ) );
+       }
+
+       /**
+        * Use appropriate dispatch* method to obtain a redirection URL,
+        * and either: redirect, set a 404 error code and error message,
+        * or do nothing (if $mValue wasn't set) allowing the form to be
+        * displayed.
+        *
+        * @return bool true if a redirect was successfully handled.
+        */
+       function dispatch() {
+               // the various namespaces supported by Special:Redirect
+               switch ( $this->mType ) {
+               case 'user':
+                       $url = $this->dispatchUser();
+                       break;
+               case 'file':
+                       $url = $this->dispatchFile();
+                       break;
+               case 'revision':
+                       $url = $this->dispatchRevision();
+                       break;
+               default:
+                       $this->getOutput()->setStatusCode( 404 );
+                       $url = null;
+                       break;
+               }
+               if ( $url ) {
+                       $this->getOutput()->redirect( $url );
+                       return true;
+               }
+               if ( !is_null( $this->mValue ) ) {
+                       $this->getOutput()->setStatusCode( 404 );
+                       $msg = $this->getMessagePrefix() . '-not-exists';
+                       return Status::newFatal( $msg );
+               }
+               return false;
+       }
+
+       protected function getFormFields() {
+               $mp = $this->getMessagePrefix();
+               $ns = array(
+                       // subpage => message
+                       'user' => $mp . '-user',
+                       'revision' => $mp . '-revision',
+                       'file' => $mp . '-file',
+               );
+               $a = array();
+               $a['type'] = array(
+                       'type' => 'select',
+                       'label-message' => $mp . '-lookup',
+                       'options' => array(),
+                       'default' => current( array_keys( $ns ) ),
+               );
+               foreach ( $ns as $n => $m ) {
+                       $m = $this->msg( $m )->text();
+                       $a['type']['options'][$m] = $n;
+               }
+               $a['value'] = array(
+                       'type' => 'text',
+                       'label-message' => $mp . '-value'
+               );
+               // set the defaults according to the parsed subpage path
+               if ( !empty( $this->mType ) ) {
+                       $a['type']['default'] = $this->mType;
+               }
+               if ( !empty( $this->mValue ) ) {
+                       $a['value']['default'] = $this->mValue;
+               }
+               return $a;
+       }
+
+       public function onSubmit( array $data ) {
+               if ( !empty( $data['type'] ) && !empty( $data['value'] ) ) {
+                       $this->setParameter( $data['type'] . '/' . $data['value'] );
+               }
+               /* if this returns false, will show the form */
+               return $this->dispatch();
+       }
+
+       public function onSuccess() {
+               /* do nothing, we redirect in $this->dispatch if successful. */
+       }
+
+       protected function alterForm( HTMLForm $form ) {
+               /* display summary at top of page */
+               $this->outputHeader();
+               /* tweak label on submit button */
+               $form->setSubmitTextMsg( $this->getMessagePrefix() . '-submit' );
+               /* submit form every time */
+               $form->setMethod( 'get' );
+       }
+
+       protected function getGroupName() {
+               return 'redirects';
+       }
+}
index 5a5f8ff..9f4b9da 100644 (file)
@@ -76,7 +76,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        'list-class'    => 'RevDel_ArchiveList',
                        'permission'    => 'deleterevision',
                ),
-               'oldimage'=> array(
+               'oldimage' => array(
                        'check-label'   => 'revdelete-hide-image',
                        'deletion-bits' => File::DELETED_FILE,
                        'success'               => 'revdelete-success',
@@ -175,7 +175,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                }
 
                # No targets?
-               if( !isset( self::$allowedTypes[$this->typeName] ) || count( $this->ids ) == 0 ) {
+               if ( !isset( self::$allowedTypes[$this->typeName] ) || count( $this->ids ) == 0 ) {
                        throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
                }
                $this->typeInfo = self::$allowedTypes[$this->typeName];
@@ -184,14 +184,14 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                # If we have revisions, get the title from the first one
                # since they should all be from the same page. This allows
                # for more flexibility with page moves...
-               if( $this->typeName == 'revision' ) {
+               if ( $this->typeName == 'revision' ) {
                        $rev = Revision::newFromId( $this->ids[0] );
                        $this->targetObj = $rev ? $rev->getTitle() : $this->targetObj;
                }
 
                $this->otherReason = $request->getVal( 'wpReason' );
                # We need a target page!
-               if( is_null( $this->targetObj ) ) {
+               if ( is_null( $this->targetObj ) ) {
                        $output->addWikiMsg( 'undelete-header' );
                        return;
                }
@@ -204,13 +204,13 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        array( 'revdelete-hide-comment', 'wpHideComment', Revision::DELETED_COMMENT ),
                        array( 'revdelete-hide-user', 'wpHideUser', Revision::DELETED_USER )
                );
-               if( $user->isAllowed( 'suppressrevision' ) ) {
+               if ( $user->isAllowed( 'suppressrevision' ) ) {
                        $this->checks[] = array( 'revdelete-hide-restricted',
                                'wpHideRestricted', Revision::DELETED_RESTRICTED );
                }
 
                # Either submit or create our form
-               if( $this->mIsAllowed && $this->submitClicked ) {
+               if ( $this->mIsAllowed && $this->submitClicked ) {
                        $this->submit( $request );
                } else {
                        $this->showForm();
@@ -223,7 +223,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                LogEventsList::showLogExtract( $output, 'delete',
                        $this->targetObj, '', array( 'lim' => 25, 'conds' => $qc ) );
                # Show relevant lines from the suppression log
-               if( $user->isAllowed( 'suppressionlog' ) ) {
+               if ( $user->isAllowed( 'suppressionlog' ) ) {
                        $suppressLogPage = new LogPage( 'suppress' );
                        $output->addHTML( "<h2>" . $suppressLogPage->getName()->escaped() . "</h2>\n" );
                        LogEventsList::showLogExtract( $output, 'suppress',
@@ -236,7 +236,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        protected function showConvenienceLinks() {
                # Give a link to the logs/hist for this page
-               if( $this->targetObj ) {
+               if ( $this->targetObj ) {
                        $links = array();
                        $links[] = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Log' ),
@@ -253,7 +253,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                        array( 'action' => 'history' )
                                );
                                # Link to deleted edits
-                               if( $this->getUser()->isAllowed( 'undelete' ) ) {
+                               if ( $this->getUser()->isAllowed( 'undelete' ) ) {
                                        $undelete = SpecialPage::getTitleFor( 'Undelete' );
                                        $links[] = Linker::linkKnown(
                                                $undelete,
@@ -296,8 +296,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        return;
                }
                $user = $this->getUser();
-               if( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
-                       if( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
+               if ( !$oimage->userCan( File::DELETED_FILE, $user ) ) {
+                       if ( $oimage->isDeleted( File::DELETED_RESTRICTED ) ) {
                                throw new PermissionsError( 'suppressrevision' );
                        } else {
                                throw new PermissionsError( 'deletedtext' );
@@ -312,10 +312,11 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->getOutput()->addHTML(
                                Xml::openElement( 'form', array(
                                        'method' => 'POST',
-                                       'action' => $this->getTitle()->getLocalUrl(
-                                               'target=' . urlencode( $this->targetObj->getPrefixedDBkey() ) .
-                                               '&file=' . urlencode( $archiveName ) .
-                                               '&token=' . urlencode( $user->getEditToken( $archiveName ) ) )
+                                       'action' => $this->getTitle()->getLocalURL( array(
+                                                       'target' => $this->targetObj->getPrefixedDBkey(),
+                                                       'file' => $archiveName,
+                                                       'token' => $user->getEditToken( $archiveName ),
+                                               ) )
                                        )
                                ) .
                                Xml::submitButton( $this->msg( 'revdelete-show-file-submit' )->text() ) .
@@ -370,7 +371,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                for ( $list->reset(); $list->current(); $list->next() ) {
                        $item = $list->current();
                        if ( !$item->canView() ) {
-                               if( !$this->submitClicked ) {
+                               if ( !$this->submitClicked ) {
                                        throw new PermissionsError( 'suppressrevision' );
                                }
                                $UserAllowed = false;
@@ -379,7 +380,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->getOutput()->addHTML( $item->getHTML() );
                }
 
-               if( !$numRevisions ) {
+               if ( !$numRevisions ) {
                        throw new ErrorPageError( 'revdelete-nooldid-title', 'revdelete-nooldid-text' );
                }
 
@@ -388,12 +389,14 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $this->addUsageText();
 
                // Normal sysops can always see what they did, but can't always change it
-               if( !$UserAllowed ) return;
+               if ( !$UserAllowed ) {
+                       return;
+               }
 
                // Show form if the user can submit
-               if( $this->mIsAllowed ) {
+               if ( $this->mIsAllowed ) {
                        $out = Xml::openElement( 'form', array( 'method' => 'post',
-                                       'action' => $this->getTitle()->getLocalUrl( array( 'action' => 'submit' ) ),
+                                       'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ),
                                        'id' => 'mw-revdel-form-revisions' ) ) .
                                Xml::fieldset( $this->msg( 'revdelete-legend' )->text() ) .
                                $this->buildCheckBoxes() .
@@ -432,10 +435,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                } else {
                        $out = '';
                }
-               if( $this->mIsAllowed ) {
+               if ( $this->mIsAllowed ) {
                        $out .= Xml::closeElement( 'form' ) . "\n";
                        // Show link to edit the dropdown reasons
-                       if( $this->getUser()->isAllowed( 'editinterface' ) ) {
+                       if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
                                $title = Title::makeTitle( NS_MEDIAWIKI, 'Revdelete-reason-dropdown' );
                                $link = Linker::link(
                                        $title,
@@ -455,10 +458,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        protected function addUsageText() {
                $this->getOutput()->addWikiMsg( 'revdelete-text' );
-               if( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+               if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-suppress-text' );
                }
-               if( $this->mIsAllowed ) {
+               if ( $this->mIsAllowed ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-confirm' );
                }
        }
@@ -470,17 +473,18 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $html = '<table>';
                // If there is just one item, use checkboxes
                $list = $this->getList();
-               if( $list->length() == 1 ) {
+               if ( $list->length() == 1 ) {
                        $list->reset();
                        $bitfield = $list->current()->getBits(); // existing field
-                       if( $this->submitClicked ) {
+                       if ( $this->submitClicked ) {
                                $bitfield = $this->extractBitfield( $this->extractBitParams(), $bitfield );
                        }
-                       foreach( $this->checks as $item ) {
+                       foreach ( $this->checks as $item ) {
                                list( $message, $name, $field ) = $item;
                                $innerHTML = Xml::checkLabel( $this->msg( $message )->text(), $name, $name, $bitfield & $field );
-                               if( $field == Revision::DELETED_RESTRICTED )
+                               if ( $field == Revision::DELETED_RESTRICTED ) {
                                        $innerHTML = "<b>$innerHTML</b>";
+                               }
                                $line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
                                $html .= "<tr>$line</tr>\n";
                        }
@@ -491,10 +495,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
                        $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
                        $html .= "<th></th></tr>\n";
-                       foreach( $this->checks as $item ) {
+                       foreach ( $this->checks as $item ) {
                                list( $message, $name, $field ) = $item;
                                // If there are several items, use third state by default...
-                               if( $this->submitClicked ) {
+                               if ( $this->submitClicked ) {
                                        $selected = $this->getRequest()->getInt( $name, 0 /* unchecked */ );
                                } else {
                                        $selected = -1; // use existing field
@@ -503,7 +507,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                $line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 0, $selected == 0 ) . '</td>';
                                $line .= '<td class="mw-revdel-checkbox">' . Xml::radio( $name, 1, $selected == 1 ) . '</td>';
                                $label = $this->msg( $message )->escaped();
-                               if( $field == Revision::DELETED_RESTRICTED ) {
+                               if ( $field == Revision::DELETED_RESTRICTED ) {
                                        $label = "<b>$label</b>";
                                }
                                $line .= "<td>$label</td>";
@@ -523,21 +527,21 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        protected function submit() {
                # Check edit token on submission
                $token = $this->getRequest()->getVal( 'wpEditToken' );
-               if( $this->submitClicked && !$this->getUser()->matchEditToken( $token ) ) {
+               if ( $this->submitClicked && !$this->getUser()->matchEditToken( $token ) ) {
                        $this->getOutput()->addWikiMsg( 'sessionfailure' );
                        return false;
                }
                $bitParams = $this->extractBitParams();
                $listReason = $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' ); // from dropdown
                $comment = $listReason;
-               if( $comment != 'other' && $this->otherReason != '' ) {
+               if ( $comment != 'other' && $this->otherReason != '' ) {
                        // Entry from drop down menu + additional comment
                        $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->otherReason;
-               } elseif( $comment == 'other' ) {
+               } elseif ( $comment == 'other' ) {
                        $comment = $this->otherReason;
                }
                # Can the user set this field?
-               if( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+               if ( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
                        throw new PermissionsError( 'suppressrevision' );
                }
                # If the save went through, go to success message...
@@ -578,15 +582,15 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        protected function extractBitParams() {
                $bitfield = array();
-               foreach( $this->checks as $item ) {
+               foreach ( $this->checks as $item ) {
                        list( /* message */, $name, $field ) = $item;
                        $val = $this->getRequest()->getInt( $name, 0 /* unchecked */ );
-                       if( $val < -1 || $val > 1) {
+                       if ( $val < -1 || $val > 1 ) {
                                $val = -1; // -1 for existing value
                        }
                        $bitfield[$field] = $val;
                }
-               if( !isset( $bitfield[Revision::DELETED_RESTRICTED] ) ) {
+               if ( !isset( $bitfield[Revision::DELETED_RESTRICTED] ) ) {
                        $bitfield[Revision::DELETED_RESTRICTED] = 0;
                }
                return $bitfield;
@@ -601,11 +605,11 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        public static function extractBitfield( $bitPars, $oldfield ) {
                // Build the actual new rev_deleted bitfield
                $newBits = 0;
-               foreach( $bitPars as $const => $val ) {
-                       if( $val == 1 ) {
+               foreach ( $bitPars as $const => $val ) {
+                       if ( $val == 1 ) {
                                $newBits |= $const; // $const is the *_deleted const
-                       } elseif( $val == -1 ) {
-                               $newBits |= ($oldfield & $const); // use existing
+                       } elseif ( $val == -1 ) {
+                               $newBits |= ( $oldfield & $const ); // use existing
                        }
                }
                return $newBits;
index 6c40148..94995db 100644 (file)
@@ -137,7 +137,7 @@ class SpecialSearch extends SpecialPage {
                if ( $profile === null ) {
                        // BC with old request format
                        $profile = 'advanced';
-                       foreach( $profiles as $key => $data ) {
+                       foreach ( $profiles as $key => $data ) {
                                if ( $nslist === $data['namespaces'] && $key !== 'advanced' ) {
                                        $profile = $key;
                                }
@@ -173,7 +173,7 @@ class SpecialSearch extends SpecialPage {
                # Try to go to page as entered.
                $t = Title::newFromText( $term );
                # If the string cannot be used to create a title
-               if( is_null( $t ) ) {
+               if ( is_null( $t ) ) {
                        $this->showResults( $term );
                        return;
                }
@@ -185,19 +185,19 @@ class SpecialSearch extends SpecialPage {
                        return;
                }
 
-               if( !is_null( $t ) ) {
+               if ( !is_null( $t ) ) {
                        $this->getOutput()->redirect( $t->getFullURL() );
                        return;
                }
                # No match, generate an edit URL
                $t = Title::newFromText( $term );
-               if( !is_null( $t ) ) {
+               if ( !is_null( $t ) ) {
                        global $wgGoToEdit;
                        wfRunHooks( 'SpecialSearchNogomatch', array( &$t ) );
                        wfDebugLog( 'nogomatch', $t->getText(), false );
 
                        # If the feature is enabled, go straight to the edit page
-                       if( $wgGoToEdit ) {
+                       if ( $wgGoToEdit ) {
                                $this->getOutput()->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) );
                                return;
                        }
@@ -253,18 +253,24 @@ class SpecialSearch extends SpecialPage {
                $rewritten = $search->replacePrefixes( $term );
 
                $titleMatches = $search->searchTitle( $rewritten );
-               if( !( $titleMatches instanceof SearchResultTooMany ) ) {
+               if ( !( $titleMatches instanceof SearchResultTooMany ) ) {
                        $textMatches = $search->searchText( $rewritten );
                }
 
+               $textStatus = null;
+               if ( $textMatches instanceof Status ) {
+                       $textStatus = $textMatches;
+                       $textMatches = null;
+               }
+
                // did you mean... suggestions
-               if( $textMatches && $textMatches->hasSuggestion() ) {
+               if ( $textMatches && !$textStatus && $textMatches->hasSuggestion() ) {
                        $st = SpecialPage::getTitleFor( 'Search' );
 
                        # mirror Go/Search behavior of original request ..
                        $didYouMeanParams = array( 'search' => $textMatches->getSuggestionQuery() );
 
-                       if( $this->fulltext != null ) {
+                       if ( $this->fulltext != null ) {
                                $didYouMeanParams['fulltext'] = $this->fulltext;
                        }
 
@@ -275,7 +281,7 @@ class SpecialSearch extends SpecialPage {
 
                        $suggestionSnippet = $textMatches->getSuggestionSnippet();
 
-                       if( $suggestionSnippet == '' ) {
+                       if ( $suggestionSnippet == '' ) {
                                $suggestionSnippet = null;
                        }
 
@@ -317,14 +323,14 @@ class SpecialSearch extends SpecialPage {
                );
 
                // Sometimes the search engine knows there are too many hits
-               if( $titleMatches instanceof SearchResultTooMany ) {
+               if ( $titleMatches instanceof SearchResultTooMany ) {
                        $out->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
                        wfProfileOut( __METHOD__ );
                        return;
                }
 
                $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
-               if( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
+               if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
                        $out->addHTML( $this->formHeader( $term, 0, 0 ) );
                        $out->addHtml( $this->getProfileForm( $this->profile, $term ) );
                        $out->addHTML( '</form>' );
@@ -347,10 +353,12 @@ class SpecialSearch extends SpecialPage {
 
                // get total number of results if backend can calculate it
                $totalRes = 0;
-               if( $titleMatches && !is_null( $titleMatches->getTotalHits() ) )
+               if ( $titleMatches && !is_null( $titleMatches->getTotalHits() ) ) {
                        $totalRes += $titleMatches->getTotalHits();
-               if( $textMatches && !is_null( $textMatches->getTotalHits() ) )
+               }
+               if ( $textMatches && !is_null( $textMatches->getTotalHits() ) ) {
                        $totalRes += $textMatches->getTotalHits();
+               }
 
                // show number of results and current offset
                $out->addHTML( $this->formHeader( $term, $num, $totalRes ) );
@@ -360,7 +368,7 @@ class SpecialSearch extends SpecialPage {
                $out->addHtml( "<div class='searchresults'>" );
 
                // prev/next links
-               if( $num || $this->offset ) {
+               if ( $num || $this->offset ) {
                        // Show the create link ahead
                        $this->showCreateLink( $t );
                        $prevnext = $this->getLanguage()->viewPrevNext( $this->getTitle(), $this->offset, $this->limit,
@@ -374,40 +382,46 @@ class SpecialSearch extends SpecialPage {
                }
 
                $out->parserOptions()->setEditSection( false );
-               if( $titleMatches ) {
-                       if( $numTitleMatches > 0 ) {
+               if ( $titleMatches ) {
+                       if ( $numTitleMatches > 0 ) {
                                $out->wrapWikiMsg( "==$1==\n", 'titlematches' );
                                $out->addHTML( $this->showMatches( $titleMatches ) );
                        }
                        $titleMatches->free();
                }
-               if( $textMatches ) {
+               if ( $textMatches && !$textStatus ) {
                        // output appropriate heading
-                       if( $numTextMatches > 0 && $numTitleMatches > 0 ) {
+                       if ( $numTextMatches > 0 && $numTitleMatches > 0 ) {
                                // if no title matches the heading is redundant
                                $out->wrapWikiMsg( "==$1==\n", 'textmatches' );
-                       } elseif( $totalRes == 0 ) {
+                       } elseif ( $totalRes == 0 ) {
                                # Don't show the 'no text matches' if we received title matches
                                # $out->wrapWikiMsg( "==$1==\n", 'notextmatches' );
                        }
                        // show interwiki results if any
-                       if( $textMatches->hasInterwikiResults() ) {
+                       if ( $textMatches->hasInterwikiResults() ) {
                                $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
                        }
                        // show results
-                       if( $numTextMatches > 0 ) {
+                       if ( $numTextMatches > 0 ) {
                                $out->addHTML( $this->showMatches( $textMatches ) );
                        }
 
                        $textMatches->free();
                }
-               if( $num === 0 ) {
-                       $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
-                       $this->showCreateLink( $t );
+               if ( $num === 0 ) {
+                       if ( $textStatus ) {
+                               $out->addHTML( '<div class="error">' .
+                                       htmlspecialchars( $textStatus->getWikiText( 'search-error' ) ) . '</div>' );
+                       } else {
+                               $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
+                                       array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
+                               $this->showCreateLink( $t );
+                       }
                }
                $out->addHtml( "</div>" );
 
-               if( $num || $this->offset ) {
+               if ( $num || $this->offset ) {
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
                wfRunHooks( 'SpecialSearchResultsAppend', array( $this, $out, $term ) );
@@ -421,16 +435,16 @@ class SpecialSearch extends SpecialPage {
                // show direct page/create link if applicable
 
                // Check DBkey !== '' in case of fragment link only.
-               if( is_null( $t ) || $t->getDBkey() === '' ) {
+               if ( is_null( $t ) || $t->getDBkey() === '' ) {
                        // invalid title
                        // preserve the paragraph for margins etc...
                        $this->getOutput()->addHtml( '<p></p>' );
                        return;
                }
 
-               if( $t->isKnown() ) {
+               if ( $t->isKnown() ) {
                        $messageName = 'searchmenu-exists';
-               } elseif( $t->userCan( 'create', $this->getUser() ) ) {
+               } elseif ( $t->userCan( 'create', $this->getUser() ) ) {
                        $messageName = 'searchmenu-new';
                } else {
                        $messageName = 'searchmenu-new-nocreate';
@@ -439,7 +453,7 @@ class SpecialSearch extends SpecialPage {
                wfRunHooks( 'SpecialSearchCreateLink', array( $t, &$params ) );
 
                // Extensions using the hook might still return an empty $messageName
-               if( $messageName ) {
+               if ( $messageName ) {
                        $this->getOutput()->wrapWikiMsg( "<p class=\"mw-search-createlink\">\n$1</p>", $params );
                } else {
                        // preserve the paragraph for margins etc...
@@ -452,9 +466,9 @@ class SpecialSearch extends SpecialPage {
         */
        protected function setupPage( $term ) {
                # Should advanced UI be used?
-               $this->searchAdvanced = ($this->profile === 'advanced');
+               $this->searchAdvanced = ( $this->profile === 'advanced' );
                $out = $this->getOutput();
-               if( strval( $term ) !== '' ) {
+               if ( strval( $term ) !== '' ) {
                        $out->setPageTitle( $this->msg( 'searchresults' ) );
                        $out->setHTMLTitle( $this->msg( 'pagetitle' )->rawParams(
                                $this->msg( 'searchresults-title' )->rawParams( $term )->text()
@@ -473,8 +487,8 @@ class SpecialSearch extends SpecialPage {
         */
        protected function powerSearch( &$request ) {
                $arr = array();
-               foreach( SearchEngine::searchableNamespaces() as $ns => $name ) {
-                       if( $request->getCheck( 'ns' . $ns ) ) {
+               foreach ( SearchEngine::searchableNamespaces() as $ns => $name ) {
+                       if ( $request->getCheck( 'ns' . $ns ) ) {
                                $arr[] = $ns;
                        }
                }
@@ -490,10 +504,10 @@ class SpecialSearch extends SpecialPage {
        protected function powerSearchOptions() {
                $opt = array();
                $opt['redirs'] = $this->searchRedirects ? 1 : 0;
-               if( $this->profile !== 'advanced' ) {
+               if ( $this->profile !== 'advanced' ) {
                        $opt['profile'] = $this->profile;
                } else {
-                       foreach( $this->namespaces as $n ) {
+                       foreach ( $this->namespaces as $n ) {
                                $opt['ns' . $n] = 1;
                        }
                }
@@ -515,12 +529,12 @@ class SpecialSearch extends SpecialPage {
 
                $out = "";
                $infoLine = $matches->getInfo();
-               if( !is_null( $infoLine ) ) {
+               if ( !is_null( $infoLine ) ) {
                        $out .= "\n<!-- {$infoLine} -->\n";
                }
                $out .= "<ul class='mw-search-results'>\n";
                $result = $matches->next();
-               while( $result ) {
+               while ( $result ) {
                        $out .= $this->showHit( $result, $terms );
                        $result = $matches->next();
                }
@@ -543,7 +557,7 @@ class SpecialSearch extends SpecialPage {
        protected function showHit( $result, $terms ) {
                wfProfileIn( __METHOD__ );
 
-               if( $result->isBrokenTitle() ) {
+               if ( $result->isBrokenTitle() ) {
                        wfProfileOut( __METHOD__ );
                        return "<!-- Broken link in search result -->\n";
                }
@@ -552,8 +566,9 @@ class SpecialSearch extends SpecialPage {
 
                $titleSnippet = $result->getTitleSnippet( $terms );
 
-               if( $titleSnippet == '' )
+               if ( $titleSnippet == '' ) {
                        $titleSnippet = null;
+               }
 
                $link_t = clone $t;
 
@@ -568,7 +583,7 @@ class SpecialSearch extends SpecialPage {
                //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( !$t->userCan( 'read', $this->getUser() ) ) {
+               if ( !$t->userCan( 'read', $this->getUser() ) ) {
                        wfProfileOut( __METHOD__ );
                        return "<li>{$link}</li>\n";
                }
@@ -576,7 +591,7 @@ class SpecialSearch extends SpecialPage {
                // If the page doesn't *exist*... our search index is out of date.
                // The least confusing at this point is to drop the result.
                // You may get less results, but... oh well. :P
-               if( $result->isMissingRevision() ) {
+               if ( $result->isMissingRevision() ) {
                        wfProfileOut( __METHOD__ );
                        return "<!-- missing page " . htmlspecialchars( $t->getPrefixedText() ) . "-->\n";
                }
@@ -588,9 +603,10 @@ class SpecialSearch extends SpecialPage {
                $sectionText = $result->getSectionSnippet( $terms );
                $redirect = '';
 
-               if( !is_null( $redirectTitle ) ) {
-                       if( $redirectText == '' )
+               if ( !is_null( $redirectTitle ) ) {
+                       if ( $redirectText == '' ) {
                                $redirectText = null;
+                       }
 
                        $redirect = "<span class='searchalttitle'>" .
                                $this->msg( 'search-redirect' )->rawParams(
@@ -600,9 +616,10 @@ class SpecialSearch extends SpecialPage {
 
                $section = '';
 
-               if( !is_null( $sectionTitle ) ) {
-                       if( $sectionText == '' )
+               if ( !is_null( $sectionTitle ) ) {
+                       if ( $sectionText == '' ) {
                                $sectionText = null;
+                       }
 
                        $section = "<span class='searchalttitle'>" .
                                $this->msg( 'search-section' )->rawParams(
@@ -616,7 +633,7 @@ class SpecialSearch extends SpecialPage {
                $lang = $this->getLanguage();
 
                // format score
-               if( is_null( $result->getScore() ) ) {
+               if ( is_null( $result->getScore() ) ) {
                        // Search engine doesn't report scoring info
                        $score = '';
                } else {
@@ -632,7 +649,7 @@ class SpecialSearch extends SpecialPage {
                $size = $this->msg( 'search-result-size', $lang->formatSize( $byteSize ) )
                        ->numParams( $wordCount )->escaped();
 
-               if( $t->getNamespace() == NS_CATEGORY ) {
+               if ( $t->getNamespace() == NS_CATEGORY ) {
                        $cat = Category::newFromTitle( $t );
                        $size = $this->msg( 'search-result-category-size' )
                                ->numParams( $cat->getPageCount(), $cat->getSubcatCount(), $cat->getFileCount() )
@@ -643,7 +660,7 @@ class SpecialSearch extends SpecialPage {
 
                // link to related articles if supported
                $related = '';
-               if( $result->hasRelated() ) {
+               if ( $result->hasRelated() ) {
                        $st = SpecialPage::getTitleFor( 'Search' );
                        $stParams = array_merge(
                                $this->powerSearchOptions(),
@@ -663,11 +680,11 @@ class SpecialSearch extends SpecialPage {
                }
 
                // Include a thumbnail for media files...
-               if( $t->getNamespace() == NS_FILE ) {
+               if ( $t->getNamespace() == NS_FILE ) {
                        $img = wfFindFile( $t );
-                       if( $img ) {
+                       if ( $img ) {
                                $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
-                               if( $thumb ) {
+                               if ( $thumb ) {
                                        $desc = $this->msg( 'parentheses' )->rawParams( $img->getShortDesc() )->escaped();
                                        wfProfileOut( __METHOD__ );
                                        // Float doesn't seem to interact well with the bullets.
@@ -693,7 +710,7 @@ class SpecialSearch extends SpecialPage {
 
                $html = null;
 
-               if ( wfRunHooks( 'ShowSearchHit', array (
+               if ( wfRunHooks( 'ShowSearchHit', array(
                        $this, $result, $terms,
                        &$link, &$redirect, &$section, &$extract,
                        &$score, &$size, &$date, &$related,
@@ -721,23 +738,23 @@ class SpecialSearch extends SpecialPage {
                wfProfileIn( __METHOD__ );
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
 
-               $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>".
+               $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>" .
                        $this->msg( 'search-interwiki-caption' )->text() . "</div>\n";
                $out .= "<ul class='mw-search-iwresults'>\n";
 
                // work out custom project captions
                $customCaptions = array();
                $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() ); // format per line <iwprefix>:<caption>
-               foreach( $customLines as $line ) {
+               foreach ( $customLines as $line ) {
                        $parts = explode( ":", $line, 2 );
-                       if( count( $parts ) == 2 ) { // validate line
+                       if ( count( $parts ) == 2 ) { // validate line
                                $customCaptions[$parts[0]] = $parts[1];
                        }
                }
 
                $prev = null;
                $result = $matches->next();
-               while( $result ) {
+               while ( $result ) {
                        $out .= $this->showInterwikiHit( $result, $prev, $terms, $query, $customCaptions );
                        $prev = $result->getInterwikiPrefix();
                        $result = $matches->next();
@@ -762,10 +779,10 @@ class SpecialSearch extends SpecialPage {
         *
         * @return string
         */
-       protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions) {
+       protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions ) {
                wfProfileIn( __METHOD__ );
 
-               if( $result->isBrokenTitle() ) {
+               if ( $result->isBrokenTitle() ) {
                        wfProfileOut( __METHOD__ );
                        return "<!-- Broken link in search result -->\n";
                }
@@ -774,8 +791,9 @@ class SpecialSearch extends SpecialPage {
 
                $titleSnippet = $result->getTitleSnippet( $terms );
 
-               if( $titleSnippet == '' )
+               if ( $titleSnippet == '' ) {
                        $titleSnippet = null;
+               }
 
                $link = Linker::linkKnown(
                        $t,
@@ -786,9 +804,10 @@ class SpecialSearch extends SpecialPage {
                $redirectTitle = $result->getRedirectTitle();
                $redirectText = $result->getRedirectSnippet( $terms );
                $redirect = '';
-               if( !is_null( $redirectTitle ) ) {
-                       if( $redirectText == '' )
+               if ( !is_null( $redirectTitle ) ) {
+                       if ( $redirectText == '' ) {
                                $redirectText = null;
+                       }
 
                        $redirect = "<span class='searchalttitle'>" .
                                $this->msg( 'search-redirect' )->rawParams(
@@ -798,8 +817,8 @@ class SpecialSearch extends SpecialPage {
 
                $out = "";
                // display project name
-               if( is_null( $lastInterwiki ) || $lastInterwiki != $t->getInterwiki() ) {
-                       if( array_key_exists( $t->getInterwiki(), $customCaptions ) ) {
+               if ( is_null( $lastInterwiki ) || $lastInterwiki != $t->getInterwiki() ) {
+                       if ( array_key_exists( $t->getInterwiki(), $customCaptions ) ) {
                                // captions from 'search-interwiki-custom'
                                $caption = $customCaptions[$t->getInterwiki()];
                        } else {
@@ -858,13 +877,13 @@ class SpecialSearch extends SpecialPage {
        protected function powerSearchBox( $term, $opts ) {
                // Groups namespaces into rows according to subject
                $rows = array();
-               foreach( SearchEngine::searchableNamespaces() as $namespace => $name ) {
+               foreach ( SearchEngine::searchableNamespaces() as $namespace => $name ) {
                        $subject = MWNamespace::getSubject( $namespace );
-                       if( !array_key_exists( $subject, $rows ) ) {
+                       if ( !array_key_exists( $subject, $rows ) ) {
                                $rows[$subject] = "";
                        }
                        $name = str_replace( '_', ' ', $name );
-                       if( $name == '' ) {
+                       if ( $name == '' ) {
                                $name = $this->msg( 'blanknamespace' )->text();
                        }
                        $rows[$subject] .=
@@ -885,12 +904,12 @@ class SpecialSearch extends SpecialPage {
                // Lays out namespaces in multiple floating two-column tables so they'll
                // be arranged nicely while still accommodating different screen widths
                $namespaceTables = '';
-               for( $i = 0; $i < $numRows; $i += 4 ) {
+               for ( $i = 0; $i < $numRows; $i += 4 ) {
                        $namespaceTables .= Xml::openElement(
                                'table',
                                array( 'cellpadding' => 0, 'cellspacing' => 0 )
                        );
-                       for( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
+                       for ( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
                                $namespaceTables .= Xml::tags( 'tr', null, $rows[$j] );
                        }
                        $namespaceTables .= Xml::closeElement( 'table' );
@@ -899,7 +918,7 @@ class SpecialSearch extends SpecialPage {
                $showSections = array( 'namespaceTables' => $namespaceTables );
 
                // Show redirects check only if backend supports it
-               if( $this->getSearchEngine()->supports( 'list-redirects' ) ) {
+               if ( $this->getSearchEngine()->supports( 'list-redirects' ) ) {
                        $showSections['redirects'] =
                                Xml::checkLabel( $this->msg( 'powersearch-redir' )->text(), 'redirs', 'redirs', $this->searchRedirects );
                }
@@ -908,12 +927,11 @@ class SpecialSearch extends SpecialPage {
 
                $hidden = '';
                unset( $opts['redirs'] );
-               foreach( $opts as $key => $value ) {
+               foreach ( $opts as $key => $value ) {
                        $hidden .= Html::hidden( $key, $value );
                }
                // Return final output
-               return
-                       Xml::openElement(
+               return Xml::openElement(
                                'fieldset',
                                array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
                        ) .
@@ -969,8 +987,10 @@ class SpecialSearch extends SpecialPage {
 
                wfRunHooks( 'SpecialSearchProfiles', array( &$profiles ) );
 
-               foreach( $profiles as &$data ) {
-                       if ( !is_array( $data['namespaces'] ) ) continue;
+               foreach ( $profiles as &$data ) {
+                       if ( !is_array( $data['namespaces'] ) ) {
+                               continue;
+                       }
                        sort( $data['namespaces'] );
                }
 
@@ -987,7 +1007,7 @@ class SpecialSearch extends SpecialPage {
                $out = Xml::openElement( 'div', array( 'class' => 'mw-search-formheader' ) );
 
                $bareterm = $term;
-               if( $this->startsWithImage( $term ) ) {
+               if ( $this->startsWithImage( $term ) ) {
                        // Deletes prefixes
                        $bareterm = substr( $term, strpos( $term, ':' ) + 1 );
                }
@@ -1081,7 +1101,7 @@ class SpecialSearch extends SpecialPage {
         */
        protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params = array() ) {
                $opt = $params;
-               foreach( $namespaces as $n ) {
+               foreach ( $namespaces as $n ) {
                        $opt['ns' . $n] = 1;
                }
                $opt['redirs'] = $this->searchRedirects;
@@ -1098,7 +1118,8 @@ class SpecialSearch extends SpecialPage {
                        'a',
                        array(
                                'href' => $this->getTitle()->getLocalURL( $stParams ),
-                               'title' => $tooltip),
+                               'title' => $tooltip
+                       ),
                        $label
                );
        }
@@ -1113,7 +1134,7 @@ class SpecialSearch extends SpecialPage {
                global $wgContLang;
 
                $p = explode( ':', $term );
-               if( count( $p ) > 1 ) {
+               if ( count( $p ) > 1 ) {
                        return $wgContLang->getNsIndex( $p[0] ) == NS_FILE;
                }
                return false;
@@ -1130,7 +1151,7 @@ class SpecialSearch extends SpecialPage {
                $allkeyword = $this->msg( 'searchall' )->inContentLanguage()->text();
 
                $p = explode( ':', $term );
-               if( count( $p ) > 1 ) {
+               if ( count( $p ) > 1 ) {
                        return $p[0] == $allkeyword;
                }
                return false;
index 1be7fbe..9b50875 100644 (file)
@@ -38,15 +38,15 @@ class ShortPagesPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'page' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
+               return array(
+                       'tables' => array( 'page' ),
+                       'fields' => array( 'namespace' => 'page_namespace',
                                        'title' => 'page_title',
                                        'value' => 'page_len' ),
-                       'conds' => array ( 'page_namespace' =>
+                       'conds' => array( 'page_namespace' =>
                                        MWNamespace::getContentNamespaces(),
                                        'page_is_redirect' => 0 ),
-                       'options' => array ( 'USE INDEX' => 'page_redirect_namespace_len' )
+                       'options' => array( 'USE INDEX' => 'page_redirect_namespace_len' )
                );
        }
 
@@ -56,8 +56,7 @@ class ShortPagesPage extends QueryPage {
 
        /**
         * @param $db DatabaseBase
-        * @param $res
-        * @return void
+        * @param ResultWrapper $res
         */
        function preprocessResults( $db, $res ) {
                # There's no point doing a batch check if we aren't caching results;
@@ -79,6 +78,11 @@ class ShortPagesPage extends QueryPage {
                return false;
        }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
        function formatResult( $skin, $result ) {
                $dm = $this->getLanguage()->getDirMark();
 
index 57fffb8..47c89d0 100644 (file)
@@ -53,17 +53,18 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 
                $pages = SpecialPageFactory::getUsablePages( $this->getUser() );
 
-               if( !count( $pages ) ) {
+               if ( !count( $pages ) ) {
                        # Yeah, that was pointless. Thanks for coming.
                        return false;
                }
 
                /** Put them into a sortable array */
                $groups = array();
+               /** @var SpecialPage $page */
                foreach ( $pages as $page ) {
                        if ( $page->isListed() ) {
                                $group = $page->getFinalGroupName();
-                               if( !isset( $groups[$group] ) ) {
+                               if ( !isset( $groups[$group] ) ) {
                                        $groups[$group] = array();
                                }
                                $groups[$group][$page->getDescription()] = array(
@@ -76,13 +77,13 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 
                /** Sort */
                if ( $wgSortSpecialPages ) {
-                       foreach( $groups as $group => $sortedPages ) {
+                       foreach ( $groups as $group => $sortedPages ) {
                                ksort( $groups[$group] );
                        }
                }
 
                /** Always move "other" to end */
-               if( array_key_exists( 'other', $groups ) ) {
+               if ( array_key_exists( 'other', $groups ) ) {
                        $other = $groups['other'];
                        unset( $groups['other'] );
                        $groups['other'] = $other;
@@ -104,12 +105,12 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 
                        $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( '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"
                        );
-                       foreach( $sortedPages as $desc => $specialpage ) {
+                       foreach ( $sortedPages as $desc => $specialpage ) {
                                list( $title, $restricted, $cached ) = $specialpage;
 
                                $pageClasses = array();
@@ -117,7 +118,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                                        $includesCachedPages = true;
                                        $pageClasses[] = 'mw-specialpagecached';
                                }
-                               if( $restricted ) {
+                               if ( $restricted ) {
                                        $includesRestrictedPages = true;
                                        $pageClasses[] = 'mw-specialpagerestricted';
                                }
@@ -127,7 +128,7 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
 
                                # Split up the larger groups
                                $count++;
-                               if( $total > 3 && $count == $middle ) {
+                               if ( $total > 3 && $count == $middle ) {
                                        $out->addHTML(
                                                Html::closeElement( 'ul' ) . Html::closeElement( 'td' ) .
                                                Html::element( 'td', array( 'style' => 'width:10%' ), '' ) .
index bc1b600..612ba84 100644 (file)
@@ -53,18 +53,18 @@ class SpecialStatistics extends SpecialPage {
 
                # Staticic - views
                $viewsStats = '';
-               if( !$wgDisableCounters ) {
+               if ( !$wgDisableCounters ) {
                        $viewsStats = $this->getViewsStats();
                }
 
                # Set active user count
-               if( !$wgMiserMode ) {
+               if ( !$wgMiserMode ) {
                        $key = wfMemcKey( 'sitestats', 'activeusers-updated' );
                        // Re-calculate the count if the last tally is old...
-                       if( !$wgMemc->get( $key ) ) {
+                       if ( !$wgMemc->get( $key ) ) {
                                $dbw = wfGetDB( DB_MASTER );
                                SiteStatsUpdate::cacheUpdate( $dbw );
-                               $wgMemc->set( $key, '1', 24*3600 ); // don't update for 1 day
+                               $wgMemc->set( $key, '1', 24 * 3600 ); // don't update for 1 day
                        }
                }
 
@@ -84,13 +84,13 @@ class SpecialStatistics extends SpecialPage {
                $text .= $viewsStats;
 
                # Statistic - popular pages
-               if( !$wgDisableCounters && !$wgMiserMode ) {
+               if ( !$wgDisableCounters && !$wgMiserMode ) {
                        $text .= $this->getMostViewedPages();
                }
 
                # Statistic - other
                $extraStats = array();
-               if( wfRunHooks( 'SpecialStatsAddExtra', array( &$extraStats ) ) ) {
+               if ( wfRunHooks( 'SpecialStatsAddExtra', array( &$extraStats ) ) ) {
                        $text .= $this->getOtherStats( $extraStats );
                }
 
@@ -111,15 +111,15 @@ class SpecialStatistics extends SpecialPage {
         * @param $number  Float: a statistical number
         * @param $trExtraParams  Array: params to table row, see Html::elememt
         * @param $descMsg  String: message key
-        * @param $descMsgParam  Array: message params
+        * @param array|string $descMsgParam Message parameters
         * @return string table row in HTML format
         */
        private function formatRow( $text, $number, $trExtraParams = array(), $descMsg = '', $descMsgParam = '' ) {
-               if( $descMsg ) {
+               if ( $descMsg ) {
                        $msg = $this->msg( $descMsg, $descMsgParam );
                        if ( $msg->exists() ) {
                                $descriptionText = $this->msg( 'parentheses' )->rawParams( $msg->parse() )->escaped();
-                               $text .= "<br />" . Xml::element( 'small', array( 'class' => 'mw-statistic-desc'),
+                               $text .= "<br />" . Xml::element( 'small', array( 'class' => 'mw-statistic-desc' ),
                                        " $descriptionText" );
                        }
                }
@@ -185,7 +185,7 @@ class SpecialStatistics extends SpecialPage {
        private function getGroupStats() {
                global $wgGroupPermissions, $wgImplicitGroups;
                $text = '';
-               foreach( $wgGroupPermissions as $group => $permissions ) {
+               foreach ( $wgGroupPermissions as $group => $permissions ) {
                        # Skip generic * and implicit groups
                        if ( in_array( $group, $wgImplicitGroups ) || $group == '*' ) {
                                continue;
@@ -217,7 +217,7 @@ class SpecialStatistics extends SpecialPage {
                        # Add a class when a usergroup contains no members to allow hiding these rows
                        $classZero = '';
                        $countUsers = SiteStats::numberingroup( $groupname );
-                       if( $countUsers == 0 ) {
+                       if ( $countUsers == 0 ) {
                                $classZero = ' statistics-group-zero';
                        }
                        $text .= $this->formatRow( $grouppage . ' ' . $grouplink,
@@ -233,11 +233,11 @@ class SpecialStatistics extends SpecialPage {
                        Xml::closeElement( 'tr' ) .
                                $this->formatRow( $this->msg( 'statistics-views-total' )->parse(),
                                        $this->getLanguage()->formatNum( $this->views ),
-                                               array ( 'class' => 'mw-statistics-views-total' ), 'statistics-views-total-desc' ) .
+                                               array( 'class' => 'mw-statistics-views-total' ), 'statistics-views-total-desc' ) .
                                $this->formatRow( $this->msg( 'statistics-views-peredit' )->parse(),
                                        $this->getLanguage()->formatNum( sprintf( '%.2f', $this->edits ?
                                                $this->views / $this->edits : 0 ) ),
-                                               array ( 'class' => 'mw-statistics-views-peredit' ) );
+                                               array( 'class' => 'mw-statistics-views-peredit' ) );
        }
 
        private function getMostViewedPages() {
@@ -260,13 +260,13 @@ class SpecialStatistics extends SpecialPage {
                                        'LIMIT' => 10,
                                )
                        );
-                       if( $res->numRows() > 0 ) {
+                       if ( $res->numRows() > 0 ) {
                                $text .= Xml::openElement( 'tr' );
                                $text .= Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-mostpopular' )->parse() );
                                $text .= Xml::closeElement( 'tr' );
                                foreach ( $res as $row ) {
                                        $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                                       if( $title instanceof Title ) {
+                                       if ( $title instanceof Title ) {
                                                $text .= $this->formatRow( Linker::link( $title ),
                                                                $this->getLanguage()->formatNum( $row->page_counter ) );
 
@@ -287,8 +287,7 @@ class SpecialStatistics extends SpecialPage {
        private function getOtherStats( array $stats ) {
                $return = '';
 
-               foreach( $stats as $header => $items ) {
-
+               foreach ( $stats as $header => $items ) {
                        // Identify the structure used
                        if ( is_array( $items ) ) {
 
@@ -298,8 +297,8 @@ class SpecialStatistics extends SpecialPage {
                                }
 
                                // Collect all items that belong to the same header
-                               foreach( $items as $key => $value ) {
-                                       $name = $this->msg( $key )->inContentLanguage()->parse();
+                               foreach ( $items as $key => $value ) {
+                                       $name = $this->msg( $key )->parse();
                                        $number = htmlspecialchars( $value );
 
                                        $return .= $this->formatRow( $name, $this->getLanguage()->formatNum( $number ), array( 'class' => 'mw-statistics-hook' ) );
index 6d16103..d87f263 100644 (file)
@@ -54,7 +54,7 @@ class SpecialTags extends SpecialPage {
                        $html .= $this->doTagRow( $row->ct_tag, $row->hitcount );
                }
 
-               foreach( ChangeTags::listDefinedTags() as $tag ) {
+               foreach ( ChangeTags::listDefinedTags() as $tag ) {
                        $html .= $this->doTagRow( $tag, 0 );
                }
 
@@ -68,20 +68,25 @@ class SpecialTags extends SpecialPage {
                        return '';
                }
 
+               $user = $this->getUser();
                $newRow = '';
                $newRow .= Xml::tags( 'td', null, Xml::element( 'code', null, $tag ) );
 
                $disp = ChangeTags::tagDescription( $tag );
-               $disp .= ' ';
-               $editLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), $this->msg( 'tags-edit' )->escaped() );
-               $disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
+               if ( $user->isAllowed( 'editinterface' ) ) {
+                       $disp .= ' ';
+                       $editLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), $this->msg( 'tags-edit' )->escaped() );
+                       $disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
+               }
                $newRow .= Xml::tags( 'td', null, $disp );
 
                $msg = $this->msg( "tag-$tag-description" );
                $desc = !$msg->exists() ? '' : $msg->parse();
-               $desc .= ' ';
-               $editDescLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), $this->msg( 'tags-edit' )->escaped() );
-               $desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
+               if ( $user->isAllowed( 'editinterface' ) ) {
+                       $desc .= ' ';
+                       $editDescLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), $this->msg( 'tags-edit' )->escaped() );
+                       $desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
+               }
                $newRow .= Xml::tags( 'td', null, $desc );
 
                $hitcount = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
index c4a53cf..4da5155 100644 (file)
@@ -56,8 +56,8 @@ class SpecialUnblock extends SpecialPage {
                $form->setSubmitTextMsg( 'ipusubmit' );
                $form->addPreText( $this->msg( 'unblockiptext' )->parseAsBlock() );
 
-               if( $form->show() ) {
-                       switch( $this->type ) {
+               if ( $form->show() ) {
+                       switch ( $this->type ) {
                                case Block::TYPE_USER:
                                case Block::TYPE_IP:
                                        $out->addWikiMsg( 'unblocked', wfEscapeWikiText( $this->target ) );
@@ -92,21 +92,21 @@ class SpecialUnblock extends SpecialPage {
                        )
                );
 
-               if( $this->block instanceof Block ) {
+               if ( $this->block instanceof Block ) {
                        list( $target, $type ) = $this->block->getTargetAndType();
 
                        # Autoblocks are logged as "autoblock #123 because the IP was recently used by
                        # User:Foo, and we've just got any block, auto or not, that applies to a target
                        # the user has specified.  Someone could be fishing to connect IPs to autoblocks,
                        # so don't show any distinction between unblocked IPs and autoblocked IPs
-                       if( $type == Block::TYPE_AUTO && $this->type == Block::TYPE_IP ) {
+                       if ( $type == Block::TYPE_AUTO && $this->type == Block::TYPE_IP ) {
                                $fields['Target']['default'] = $this->target;
                                unset( $fields['Name'] );
 
                        } else {
                                $fields['Target']['default'] = $target;
                                $fields['Target']['type'] = 'hidden';
-                               switch( $type ) {
+                               switch ( $type ) {
                                        case Block::TYPE_USER:
                                        case Block::TYPE_IP:
                                                $fields['Name']['default'] = Linker::link(
@@ -138,6 +138,8 @@ class SpecialUnblock extends SpecialPage {
 
        /**
         * Submit callback for an HTMLForm object
+        * @param array $data
+        * @param HTMLForm $form
         * @return Array( Array(message key, parameters)
         */
        public static function processUIUnblock( array $data, HTMLForm $form ) {
@@ -157,7 +159,7 @@ class SpecialUnblock extends SpecialPage {
                $target = $data['Target'];
                $block = Block::newFromTarget( $data['Target'] );
 
-               if( !$block instanceof Block ) {
+               if ( !$block instanceof Block ) {
                        return array( array( 'ipb_cant_unblock', $target ) );
                }
 
@@ -172,14 +174,14 @@ class SpecialUnblock extends SpecialPage {
                # If the specified IP is a single address, and the block is a range block, don't
                # unblock the whole range.
                list( $target, $type ) = SpecialBlock::getTargetAndType( $target );
-               if( $block->getType() == Block::TYPE_RANGE && $type == Block::TYPE_IP ) {
+               if ( $block->getType() == Block::TYPE_RANGE && $type == Block::TYPE_IP ) {
                        $range = $block->getTarget();
                        return array( array( 'ipb_blocked_as_range', $target, $range ) );
                }
 
                # If the name was hidden and the blocking user cannot hide
                # names, then don't allow any block removals...
-               if( !$performer->isAllowed( 'hideuser' ) && $block->mHideName ) {
+               if ( !$performer->isAllowed( 'hideuser' ) && $block->mHideName ) {
                        return array( 'unblock-hideuser' );
                }
 
@@ -189,7 +191,7 @@ class SpecialUnblock extends SpecialPage {
                }
 
                # Unset _deleted fields as needed
-               if( $block->mHideName ) {
+               if ( $block->mHideName ) {
                        # Something is deeply FUBAR if this is not a User object, but who knows?
                        $id = $block->getTarget() instanceof User
                                ? $block->getTarget()->getID()
index ebc32cf..1cc40a9 100644 (file)
@@ -34,8 +34,8 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
 
        /**
         * Formats the result
-        * @param $skin The current skin
-        * @param $result The query result
+        * @param Skin $skin The current skin
+        * @param object $result The query result
         * @return string The category link
         */
        function formatResult( $skin, $result ) {
index 53aa3f3..3bfcede 100644 (file)
@@ -47,7 +47,7 @@ class UncategorizedImagesPage extends ImageQueryPage {
        }
 
        function getQueryInfo() {
-               return array (
+               return array(
                        'tables' => array( 'page', 'categorylinks' ),
                        'fields' => array( 'namespace' => 'page_namespace',
                                        'title' => 'page_title',
index b518e6f..8bc9e48 100644 (file)
@@ -47,17 +47,17 @@ class UncategorizedPagesPage extends PageQueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'page', 'categorylinks' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
+               return array(
+                       'tables' => array( 'page', 'categorylinks' ),
+                       'fields' => array( 'namespace' => 'page_namespace',
                                        'title' => 'page_title',
                                        'value' => 'page_title' ),
                        // default for page_namespace is all content namespaces (if requestedNamespace is false)
                        // otherwise, page_namespace is requestedNamespace
-                       'conds' => array ( 'cl_from IS NULL',
+                       'conds' => array( 'cl_from IS NULL',
                                        'page_namespace' => ( $this->requestedNamespace !== false ? $this->requestedNamespace : MWNamespace::getContentNamespaces() ),
                                        'page_is_redirect' => 0 ),
-                       'join_conds' => array ( 'categorylinks' => array (
+                       'join_conds' => array( 'categorylinks' => array(
                                        'LEFT JOIN', 'cl_from = page_id' ) )
                );
        }
@@ -65,8 +65,9 @@ class UncategorizedPagesPage extends PageQueryPage {
        function getOrderFields() {
                // For some crazy reason ordering by a constant
                // causes a filesort
-               if( $this->requestedNamespace === false && count( MWNamespace::getContentNamespaces() ) > 1 )
+               if ( $this->requestedNamespace === false && count( MWNamespace::getContentNamespaces() ) > 1 ) {
                        return array( 'page_namespace', 'page_title' );
+               }
                return array( 'page_title' );
        }
 
index e036348..c49c3eb 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class PageArchive {
-
        /**
         * @var Title
         */
@@ -44,7 +43,7 @@ class PageArchive {
        protected $revisionStatus;
 
        function __construct( $title ) {
-               if( is_null( $title ) ) {
+               if ( is_null( $title ) ) {
                        throw new MWException( __METHOD__ . ' given a null title.' );
                }
                $this->title = $title;
@@ -67,14 +66,14 @@ class PageArchive {
         * given title prefix.
         * Returns result wrapper with (ar_namespace, ar_title, count) fields.
         *
-        * @param string $prefix title prefix
+        * @param string $prefix Title prefix
         * @return ResultWrapper
         */
        public static function listPagesByPrefix( $prefix ) {
                $dbr = wfGetDB( DB_SLAVE );
 
                $title = Title::newFromText( $prefix );
-               if( $title ) {
+               if ( $title ) {
                        $ns = $title->getNamespace();
                        $prefix = $title->getDBkey();
                } else {
@@ -82,36 +81,36 @@ class PageArchive {
                        // @todo handle bare namespace names cleanly?
                        $ns = 0;
                }
+
                $conds = array(
                        'ar_namespace' => $ns,
                        'ar_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
                );
+
                return self::listPages( $dbr, $conds );
        }
 
        /**
-        * @param $dbr DatabaseBase
-        * @param $condition
+        * @param DatabaseBase $dbr
+        * @param string|array $condition
         * @return bool|ResultWrapper
         */
        protected static function listPages( $dbr, $condition ) {
-               return $dbr->resultObject(
-                       $dbr->select(
-                               array( 'archive' ),
-                               array(
-                                       'ar_namespace',
-                                       'ar_title',
-                                       'count' => 'COUNT(*)'
-                               ),
-                               $condition,
-                               __METHOD__,
-                               array(
-                                       'GROUP BY' => array( 'ar_namespace', 'ar_title' ),
-                                       'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
-                                       'LIMIT' => 100,
-                               )
+               return $dbr->resultObject( $dbr->select(
+                       array( 'archive' ),
+                       array(
+                               'ar_namespace',
+                               'ar_title',
+                               'count' => 'COUNT(*)'
+                       ),
+                       $condition,
+                       __METHOD__,
+                       array(
+                               'GROUP BY' => array( 'ar_namespace', 'ar_title' ),
+                               'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
+                               'LIMIT' => 100,
                        )
-               );
+               ) );
        }
 
        /**
@@ -141,8 +140,8 @@ class PageArchive {
                                'ar_title' => $this->title->getDBkey() ),
                        __METHOD__,
                        array( 'ORDER BY' => 'ar_timestamp DESC' ) );
-               $ret = $dbr->resultObject( $res );
-               return $ret;
+
+               return $dbr->resultObject( $res );
        }
 
        /**
@@ -154,26 +153,28 @@ class PageArchive {
         * @todo Does this belong in Image for fuller encapsulation?
         */
        function listFiles() {
-               if( $this->title->getNamespace() == NS_FILE ) {
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $res = $dbr->select(
-                               'filearchive',
-                               ArchivedFile::selectFields(),
-                               array( 'fa_name' => $this->title->getDBkey() ),
-                               __METHOD__,
-                               array( 'ORDER BY' => 'fa_timestamp DESC' ) );
-                       $ret = $dbr->resultObject( $res );
-                       return $ret;
+               if ( $this->title->getNamespace() != NS_FILE ) {
+                       return null;
                }
-               return null;
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select(
+                       'filearchive',
+                       ArchivedFile::selectFields(),
+                       array( 'fa_name' => $this->title->getDBkey() ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'fa_timestamp DESC' )
+               );
+
+               return $dbr->resultObject( $res );
        }
 
        /**
         * Return a Revision object containing data for the deleted revision.
         * Note that the result *may* or *may not* have a null page ID.
         *
-        * @param $timestamp String
-        * @return Revision
+        * @param string $timestamp
+        * @return Revision|null
         */
        function getRevision( $timestamp ) {
                global $wgContentHandlerUseDB;
@@ -203,14 +204,15 @@ class PageArchive {
                $row = $dbr->selectRow( 'archive',
                        $fields,
                        array( 'ar_namespace' => $this->title->getNamespace(),
-                                       'ar_title' => $this->title->getDBkey(),
-                                       'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
+                               'ar_title' => $this->title->getDBkey(),
+                               'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
                        __METHOD__ );
-               if( $row ) {
+
+               if ( $row ) {
                        return Revision::newFromArchiveRow( $row, array( 'title' => $this->title ) );
-               } else {
-                       return null;
                }
+
+               return null;
        }
 
        /**
@@ -220,8 +222,8 @@ class PageArchive {
         * May produce unexpected results in case of history merges or other
         * unusual time issues.
         *
-        * @param $timestamp String
-        * @return Revision or null
+        * @param string $timestamp
+        * @return Revision|null Null when there is no previous revision
         */
        function getPreviousRevision( $timestamp ) {
                $dbr = wfGetDB( DB_SLAVE );
@@ -246,7 +248,7 @@ class PageArchive {
                                'page_title' => $this->title->getDBkey(),
                                'page_id = rev_page',
                                'rev_timestamp < ' .
-                                               $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
+                                       $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
                        __METHOD__,
                        array(
                                'ORDER BY' => 'rev_timestamp DESC',
@@ -254,38 +256,39 @@ class PageArchive {
                $prevLive = $row ? wfTimestamp( TS_MW, $row->rev_timestamp ) : false;
                $prevLiveId = $row ? intval( $row->rev_id ) : null;
 
-               if( $prevLive && $prevLive > $prevDeleted ) {
+               if ( $prevLive && $prevLive > $prevDeleted ) {
                        // Most prior revision was live
                        return Revision::newFromId( $prevLiveId );
-               } elseif( $prevDeleted ) {
+               } elseif ( $prevDeleted ) {
                        // Most prior revision was deleted
                        return $this->getRevision( $prevDeleted );
-               } else {
-                       // No prior revision on this page.
-                       return null;
                }
+
+               // No prior revision on this page.
+               return null;
        }
 
        /**
         * Get the text from an archive row containing ar_text, ar_flags and ar_text_id
         *
-        * @param $row Object: database row
-        * @return Revision
+        * @param object $row Database row
+        * @return string
         */
        function getTextFromRow( $row ) {
-               if( is_null( $row->ar_text_id ) ) {
+               if ( is_null( $row->ar_text_id ) ) {
                        // An old row from MediaWiki 1.4 or previous.
                        // Text is embedded in this row in classic compression format.
                        return Revision::getRevisionText( $row, 'ar_' );
-               } else {
-                       // New-style: keyed to the text storage backend.
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $text = $dbr->selectRow( 'text',
-                               array( 'old_text', 'old_flags' ),
-                               array( 'old_id' => $row->ar_text_id ),
-                               __METHOD__ );
-                       return Revision::getRevisionText( $text );
                }
+
+               // New-style: keyed to the text storage backend.
+               $dbr = wfGetDB( DB_SLAVE );
+               $text = $dbr->selectRow( 'text',
+                       array( 'old_text', 'old_flags' ),
+                       array( 'old_id' => $row->ar_text_id ),
+                       __METHOD__ );
+
+               return Revision::getRevisionText( $text );
        }
 
        /**
@@ -294,7 +297,7 @@ class PageArchive {
         *
         * If there are no archived revisions for the page, returns NULL.
         *
-        * @return String
+        * @return string|null
         */
        function getLastRevisionText() {
                $dbr = wfGetDB( DB_SLAVE );
@@ -304,17 +307,18 @@ class PageArchive {
                                'ar_title' => $this->title->getDBkey() ),
                        __METHOD__,
                        array( 'ORDER BY' => 'ar_timestamp DESC' ) );
-               if( $row ) {
+
+               if ( $row ) {
                        return $this->getTextFromRow( $row );
-               } else {
-                       return null;
                }
+
+               return null;
        }
 
        /**
         * Quick check if any archived revisions are present for the page.
         *
-        * @return Boolean
+        * @return boolean
         */
        function isDeleted() {
                $dbr = wfGetDB( DB_SLAVE );
@@ -323,6 +327,7 @@ class PageArchive {
                                'ar_title' => $this->title->getDBkey() ),
                        __METHOD__
                );
+
                return ( $n > 0 );
        }
 
@@ -331,11 +336,11 @@ class PageArchive {
         * Once restored, the items will be removed from the archive tables.
         * The deletion log will be updated with an undeletion notice.
         *
-        * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
-        * @param $comment String
-        * @param $fileVersions Array
-        * @param $unsuppress Boolean
-        * @param $user User doing the action, or null to use $wgUser
+        * @param array $timestamps Pass an empty array to restore all revisions, otherwise list the ones to undelete.
+        * @param string $comment
+        * @param array $fileVersions
+        * @param bool $unsuppress
+        * @param User $user User performing the action, or null to use $wgUser
         *
         * @return array(number of file revisions restored, number of image revisions restored, log message)
         * on success, false on failure
@@ -348,7 +353,7 @@ class PageArchive {
                $restoreText = $restoreAll || !empty( $timestamps );
                $restoreFiles = $restoreAll || !empty( $fileVersions );
 
-               if( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
+               if ( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
                        $img = wfLocalFile( $this->title );
                        $this->fileStatus = $img->restore( $fileVersions, $unsuppress );
                        if ( !$this->fileStatus->isOK() ) {
@@ -359,9 +364,9 @@ class PageArchive {
                        $filesRestored = 0;
                }
 
-               if( $restoreText ) {
+               if ( $restoreText ) {
                        $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
-                       if( !$this->revisionStatus->isOK() ) {
+                       if ( !$this->revisionStatus->isOK() ) {
                                return false;
                        }
 
@@ -372,13 +377,13 @@ class PageArchive {
 
                // Touch the log!
 
-               if( $textRestored && $filesRestored ) {
+               if ( $textRestored && $filesRestored ) {
                        $reason = wfMessage( 'undeletedrevisions-files' )
                                ->numParams( $textRestored, $filesRestored )->inContentLanguage()->text();
-               } elseif( $textRestored ) {
+               } elseif ( $textRestored ) {
                        $reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored )
                                ->inContentLanguage()->text();
-               } elseif( $filesRestored ) {
+               } elseif ( $filesRestored ) {
                        $reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored )
                                ->inContentLanguage()->text();
                } else {
@@ -386,7 +391,7 @@ class PageArchive {
                        return false;
                }
 
-               if( trim( $comment ) != '' ) {
+               if ( trim( $comment ) != '' ) {
                        $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
                }
 
@@ -413,12 +418,11 @@ class PageArchive {
         * to the cur/old tables. If the page currently exists, all revisions will
         * be stuffed into old, otherwise the most recent will go into cur.
         *
-        * @param array $timestamps pass an empty array to restore all revisions, otherwise list the ones to undelete.
-        * @param $unsuppress Boolean: remove all ar_deleted/fa_deleted restrictions of seletected revs
-        *
-        * @param $comment String
+        * @param array $timestamps Pass an empty array to restore all revisions, otherwise list the ones to undelete.
+        * @param bool $unsuppress Remove all ar_deleted/fa_deleted restrictions of seletected revs
+        * @param string $comment
         * @throws ReadOnlyError
-        * @return Status, containing the number of revisions restored on success
+        * @return Status Object containing the number of revisions restored on success
         */
        private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
                global $wgContentHandlerUseDB;
@@ -426,8 +430,8 @@ class PageArchive {
                if ( wfReadOnly() ) {
                        throw new ReadOnlyError();
                }
-               $restoreAll = empty( $timestamps );
 
+               $restoreAll = empty( $timestamps );
                $dbw = wfGetDB( DB_MASTER );
 
                # Does this page already exist? We'll have to update it...
@@ -443,7 +447,8 @@ class PageArchive {
                        __METHOD__,
                        array( 'FOR UPDATE' ) // lock page
                );
-               if( $page ) {
+
+               if ( $page ) {
                        $makepage = false;
                        # Page already exists. Import the history, and if necessary
                        # we'll update the latest revision field in the record.
@@ -455,7 +460,7 @@ class PageArchive {
                                array( 'rev_id' => $previousRevId ),
                                __METHOD__ );
 
-                       if( $previousTimestamp === false ) {
+                       if ( $previousTimestamp === false ) {
                                wfDebug( __METHOD__ . ": existing page refers to a page_latest that does not exist\n" );
 
                                $status = Status::newGood( 0 );
@@ -470,7 +475,7 @@ class PageArchive {
                        $previousTimestamp = 0;
                }
 
-               if( $restoreAll ) {
+               if ( $restoreAll ) {
                        $oldones = '1 = 1'; # All revisions...
                } else {
                        $oldts = implode( ',',
@@ -509,14 +514,15 @@ class PageArchive {
                        $fields,
                        /* WHERE */ array(
                                'ar_namespace' => $this->title->getNamespace(),
-                               'ar_title'     => $this->title->getDBkey(),
+                               'ar_title' => $this->title->getDBkey(),
                                $oldones ),
                        __METHOD__,
                        /* options */ array( 'ORDER BY' => 'ar_timestamp' )
                );
                $ret = $dbw->resultObject( $result );
                $rev_count = $dbw->numRows( $result );
-               if( !$rev_count ) {
+
+               if ( !$rev_count ) {
                        wfDebug( __METHOD__ . ": no revisions to restore\n" );
 
                        $status = Status::newGood( 0 );
@@ -544,9 +550,9 @@ class PageArchive {
                        return $status;
                }
 
-               if( $makepage ) {
+               if ( $makepage ) {
                        // Check the state of the newest to-be version...
-                       if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
+                       if ( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
                                return Status::newFatal( "undeleterevdel" );
                        }
                        // Safe to insert now...
@@ -554,9 +560,9 @@ class PageArchive {
                        $pageId = $newid;
                } else {
                        // Check if a deleted revision will become the current revision...
-                       if( $row->ar_timestamp > $previousTimestamp ) {
+                       if ( $row->ar_timestamp > $previousTimestamp ) {
                                // Check the state of the newest to-be version...
-                               if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
+                               if ( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
                                        return Status::newFatal( "undeleterevdel" );
                                }
                        }
@@ -570,10 +576,10 @@ class PageArchive {
 
                foreach ( $ret as $row ) {
                        // Check for key dupes due to shitty archive integrity.
-                       if( $row->ar_rev_id ) {
+                       if ( $row->ar_rev_id ) {
                                $exists = $dbw->selectField( 'revision', '1',
                                        array( 'rev_id' => $row->ar_rev_id ), __METHOD__ );
-                               if( $exists ) {
+                               if ( $exists ) {
                                        continue; // don't throw DB errors
                                }
                        }
@@ -616,7 +622,7 @@ class PageArchive {
 
                wfRunHooks( 'ArticleUndelete', array( &$this->title, $created, $comment ) );
 
-               if( $this->title->getNamespace() == NS_FILE ) {
+               if ( $this->title->getNamespace() == NS_FILE ) {
                        $update = new HTMLCacheUpdate( $this->title, 'imagelinks' );
                        $update->doUpdate();
                }
@@ -627,12 +633,16 @@ class PageArchive {
        /**
         * @return Status
         */
-       function getFileStatus() { return $this->fileStatus; }
+       function getFileStatus() {
+               return $this->fileStatus;
+       }
 
        /**
         * @return Status
         */
-       function getRevisionStatus() { return $this->revisionStatus; }
+       function getRevisionStatus() {
+               return $this->revisionStatus;
+       }
 }
 
 /**
@@ -664,10 +674,13 @@ class SpecialUndelete extends SpecialPage {
                } else {
                        $this->mTarget = $request->getVal( 'target' );
                }
+
                $this->mTargetObj = null;
+
                if ( $this->mTarget !== null && $this->mTarget !== '' ) {
                        $this->mTargetObj = Title::newFromURL( $this->mTarget );
                }
+
                $this->mSearchPrefix = $request->getText( 'prefix' );
                $time = $request->getVal( 'timestamp' );
                $this->mTimestamp = $time ? wfTimestamp( TS_MW, $time ) : '';
@@ -698,16 +711,16 @@ class SpecialUndelete extends SpecialPage {
                        $this->mRestore = false;
                }
 
-               if( $this->mRestore || $this->mInvert ) {
+               if ( $this->mRestore || $this->mInvert ) {
                        $timestamps = array();
                        $this->mFileVersions = array();
-                       foreach( $request->getValues() as $key => $val ) {
+                       foreach ( $request->getValues() as $key => $val ) {
                                $matches = array();
-                               if( preg_match( '/^ts(\d{14})$/', $key, $matches ) ) {
+                               if ( preg_match( '/^ts(\d{14})$/', $key, $matches ) ) {
                                        array_push( $timestamps, $matches[1] );
                                }
 
-                               if( preg_match( '/^fileid(\d+)$/', $key, $matches ) ) {
+                               if ( preg_match( '/^fileid(\d+)$/', $key, $matches ) ) {
                                        $this->mFileVersions[] = intval( $matches[1] );
                                }
                        }
@@ -747,13 +760,13 @@ class SpecialUndelete extends SpecialPage {
 
                if ( $this->mTimestamp !== '' ) {
                        $this->showRevision( $this->mTimestamp );
-               } elseif ( $this->mFilename !== null ) {
+               } elseif ( $this->mFilename !== null && $this->mTargetObj->inNamespace( NS_FILE ) ) {
                        $file = new ArchivedFile( $this->mTargetObj, '', $this->mFilename );
                        // Check if user is allowed to see this file
                        if ( !$file->exists() ) {
                                $out->addWikiMsg( 'filedelete-nofile', $this->mFilename );
                        } elseif ( !$file->userCan( File::DELETED_FILE, $user ) ) {
-                               if( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
+                               if ( $file->isDeleted( File::DELETED_RESTRICTED ) ) {
                                        throw new PermissionsError( 'suppressrevision' );
                                } else {
                                        throw new PermissionsError( 'deletedtext' );
@@ -776,22 +789,23 @@ class SpecialUndelete extends SpecialPage {
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'undelete-search-title' ) );
                $out->addHTML(
-                       Xml::openElement( 'form', array(
-                               'method' => 'get',
-                               'action' => $wgScript ) ) .
-                       Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
-                       Html::hidden( 'title',
-                               $this->getTitle()->getPrefixedDBkey() ) .
-                       Xml::inputLabel( $this->msg( 'undelete-search-prefix' )->text(),
-                               'prefix', 'prefix', 20,
-                               $this->mSearchPrefix ) . ' ' .
-                       Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' )
+                       Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
+                               Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
+                               Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+                               Xml::inputLabel(
+                                       $this->msg( 'undelete-search-prefix' )->text(),
+                                       'prefix',
+                                       'prefix',
+                                       20,
+                                       $this->mSearchPrefix
+                               ) . ' ' .
+                               Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
+                               Xml::closeElement( 'fieldset' ) .
+                               Xml::closeElement( 'form' )
                );
 
                # List undeletable articles
-               if( $this->mSearchPrefix ) {
+               if ( $this->mSearchPrefix ) {
                        $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
                        $this->showList( $result );
                }
@@ -800,13 +814,13 @@ class SpecialUndelete extends SpecialPage {
        /**
         * Generic list of deleted pages
         *
-        * @param $result ResultWrapper
+        * @param ResultWrapper $result
         * @return bool
         */
        private function showList( $result ) {
                $out = $this->getOutput();
 
-               if( $result->numRows() == 0 ) {
+               if ( $result->numRows() == 0 ) {
                        $out->addWikiMsg( 'undelete-no-results' );
                        return false;
                }
@@ -826,8 +840,15 @@ class SpecialUndelete extends SpecialPage {
                                );
                        } else {
                                // The title is no longer valid, show as text
-                               $item = Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
-                                       Linker::getInvalidTitleDescription( $this->getContext(), $row->ar_namespace, $row->ar_title ) );
+                               $item = Html::element(
+                                       'span',
+                                       array( 'class' => 'mw-invalidtitle' ),
+                                       Linker::getInvalidTitleDescription(
+                                               $this->getContext(),
+                                               $row->ar_namespace,
+                                               $row->ar_title
+                                       )
+                               );
                        }
                        $revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse();
                        $out->addHTML( "<li>{$item} ({$revs})</li>\n" );
@@ -839,7 +860,7 @@ class SpecialUndelete extends SpecialPage {
        }
 
        private function showRevision( $timestamp ) {
-               if( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
+               if ( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
                        return;
                }
 
@@ -852,31 +873,37 @@ class SpecialUndelete extends SpecialPage {
                $out = $this->getOutput();
                $user = $this->getUser();
 
-               if( !$rev ) {
+               if ( !$rev ) {
                        $out->addWikiMsg( 'undeleterevision-missing' );
                        return;
                }
 
-               if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-                       if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
-                               $out->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
+               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+                               $out->wrapWikiMsg(
+                                       "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                                       'rev-deleted-text-permission'
+                               );
                                return;
-                       } else {
-                               $out->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
-                               $out->addHTML( '<br />' );
-                               // and we are allowed to see...
                        }
+
+                       $out->wrapWikiMsg(
+                               "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                               'rev-deleted-text-view'
+                       );
+                       $out->addHTML( '<br />' );
+                       // and we are allowed to see...
                }
 
-               if( $this->mDiff ) {
+               if ( $this->mDiff ) {
                        $previousRev = $archive->getPreviousRevision( $timestamp );
-                       if( $previousRev ) {
+                       if ( $previousRev ) {
                                $this->showDiff( $previousRev, $rev );
-                               if( $this->mDiffOnly ) {
+                               if ( $this->mDiffOnly ) {
                                        return;
-                               } else {
-                                       $out->addHTML( '<hr />' );
                                }
+
+                               $out->addHTML( '<hr />' );
                        } else {
                                $out->addWikiMsg( 'undelete-nodiff' );
                        }
@@ -900,7 +927,7 @@ class SpecialUndelete extends SpecialPage {
 
                $isText = ( $content instanceof TextContent );
 
-               if( $this->mPreview || $isText ) {
+               if ( $this->mPreview || $isText ) {
                        $openDiv = '<div id="mw-undelete-revision" class="mw-warning">';
                } else {
                        $openDiv = '<div id="mw-undelete-revision">';
@@ -922,7 +949,7 @@ class SpecialUndelete extends SpecialPage {
                        return;
                }
 
-               if( $this->mPreview || !$isText ) {
+               if ( $this->mPreview || !$isText ) {
                        // NOTE: non-text content has no source view, so always use rendered preview
 
                        // Hide [edit]s
@@ -935,16 +962,21 @@ class SpecialUndelete extends SpecialPage {
 
                if ( $isText ) {
                        // source view for textual content
-                       $sourceView = Xml::element( 'textarea', array(
-                               'readonly' => 'readonly',
-                               'cols' => $user->getIntOption( 'cols' ),
-                               'rows' => $user->getIntOption( 'rows' ) ),
-                               $content->getNativeData() . "\n" );
+                       $sourceView = Xml::element(
+                               'textarea',
+                               array(
+                                       'readonly' => 'readonly',
+                                       'cols' => $user->getIntOption( 'cols' ),
+                                       'rows' => $user->getIntOption( 'rows' )
+                               ),
+                               $content->getNativeData() . "\n"
+                       );
 
                        $previewButton = Xml::element( 'input', array(
                                'type' => 'submit',
                                'name' => 'preview',
-                               'value' => $this->msg( 'showpreview' )->text() ) );
+                               'value' => $this->msg( 'showpreview' )->text()
+                       ) );
                } else {
                        $sourceView = '';
                        $previewButton = '';
@@ -957,36 +989,37 @@ class SpecialUndelete extends SpecialPage {
 
                $out->addHTML(
                        $sourceView .
-                       Xml::openElement( 'div', array(
-                               'style' => 'clear: both' ) ) .
-                       Xml::openElement( 'form', array(
-                               'method' => 'post',
-                               'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
-                       Xml::element( 'input', array(
-                               'type' => 'hidden',
-                               'name' => 'target',
-                               'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
-                       Xml::element( 'input', array(
-                               'type' => 'hidden',
-                               'name' => 'timestamp',
-                               'value' => $timestamp ) ) .
-                       Xml::element( 'input', array(
-                               'type' => 'hidden',
-                               'name' => 'wpEditToken',
-                               'value' => $user->getEditToken() ) ) .
-                       $previewButton .
-                       $diffButton .
-                       Xml::closeElement( 'form' ) .
-                       Xml::closeElement( 'div' ) );
+                               Xml::openElement( 'div', array(
+                                       'style' => 'clear: both' ) ) .
+                               Xml::openElement( 'form', array(
+                                       'method' => 'post',
+                                       'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
+                               Xml::element( 'input', array(
+                                       'type' => 'hidden',
+                                       'name' => 'target',
+                                       'value' => $this->mTargetObj->getPrefixedDBkey() ) ) .
+                               Xml::element( 'input', array(
+                                       'type' => 'hidden',
+                                       'name' => 'timestamp',
+                                       'value' => $timestamp ) ) .
+                               Xml::element( 'input', array(
+                                       'type' => 'hidden',
+                                       'name' => 'wpEditToken',
+                                       'value' => $user->getEditToken() ) ) .
+                               $previewButton .
+                               $diffButton .
+                               Xml::closeElement( 'form' ) .
+                               Xml::closeElement( 'div' )
+               );
        }
 
        /**
         * Build a diff display between this and the previous either deleted
         * or non-deleted edit.
         *
-        * @param $previousRev Revision
-        * @param $currentRev Revision
-        * @return String: HTML
+        * @param Revision $previousRev
+        * @param Revision $currentRev
+        * @return string HTML
         */
        function showDiff( $previousRev, $currentRev ) {
                $diffContext = clone $this->getContext();
@@ -995,20 +1028,19 @@ class SpecialUndelete extends SpecialPage {
 
                $diffEngine = $currentRev->getContentHandler()->createDifferenceEngine( $diffContext );
                $diffEngine->showDiffStyle();
-               $this->getOutput()->addHTML(
-                       "<div>" .
+               $this->getOutput()->addHTML( "<div>" .
                        "<table style='width: 98%;' cellpadding='0' cellspacing='4' class='diff'>" .
                        "<col class='diff-marker' />" .
                        "<col class='diff-content' />" .
                        "<col class='diff-marker' />" .
                        "<col class='diff-content' />" .
                        "<tr>" .
-                               "<td colspan='2' style='width: 50%; text-align: center' class='diff-otitle'>" .
-                               $this->diffHeader( $previousRev, 'o' ) .
-                               "</td>\n" .
-                               "<td colspan='2' style='width: 50%;  text-align: center' class='diff-ntitle'>" .
-                               $this->diffHeader( $currentRev, 'n' ) .
-                               "</td>\n" .
+                       "<td colspan='2' style='width: 50%; text-align: center' class='diff-otitle'>" .
+                       $this->diffHeader( $previousRev, 'o' ) .
+                       "</td>\n" .
+                       "<td colspan='2' style='width: 50%;  text-align: center' class='diff-ntitle'>" .
+                       $this->diffHeader( $currentRev, 'n' ) .
+                       "</td>\n" .
                        "</tr>" .
                        $diffEngine->generateContentDiffBody(
                                $previousRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ),
@@ -1019,13 +1051,13 @@ class SpecialUndelete extends SpecialPage {
        }
 
        /**
-        * @param $rev Revision
-        * @param $prefix
+        * @param Revision $rev
+        * @param string $prefix
         * @return string
         */
        private function diffHeader( $rev, $prefix ) {
                $isDeleted = !( $rev->getId() && $rev->getTitle() );
-               if( $isDeleted ) {
+               if ( $isDeleted ) {
                        /// @todo FIXME: $rev->getTitle() is null for deleted revs...?
                        $targetPage = $this->getTitle();
                        $targetQuery = array(
@@ -1037,30 +1069,34 @@ class SpecialUndelete extends SpecialPage {
                        $targetPage = $rev->getTitle();
                        $targetQuery = array( 'oldid' => $rev->getId() );
                }
+
                // Add show/hide deletion links if available
                $user = $this->getUser();
                $lang = $this->getLanguage();
                $rdel = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
-               if ( $rdel ) $rdel = " $rdel";
-               return
-                       '<div id="mw-diff-' . $prefix . 'title1"><strong>' .
-                               Linker::link(
-                                       $targetPage,
-                                       $this->msg(
-                                               'revisionasof',
-                                               $lang->userTimeAndDate( $rev->getTimestamp(), $user ),
-                                               $lang->userDate( $rev->getTimestamp(), $user ),
-                                               $lang->userTime( $rev->getTimestamp(), $user )
-                                       )->escaped(),
-                                       array(),
-                                       $targetQuery
-                               ) .
+
+               if ( $rdel ) {
+                       $rdel = " $rdel";
+               }
+
+               return '<div id="mw-diff-' . $prefix . 'title1"><strong>' .
+                       Linker::link(
+                               $targetPage,
+                               $this->msg(
+                                       'revisionasof',
+                                       $lang->userTimeAndDate( $rev->getTimestamp(), $user ),
+                                       $lang->userDate( $rev->getTimestamp(), $user ),
+                                       $lang->userTime( $rev->getTimestamp(), $user )
+                               )->escaped(),
+                               array(),
+                               $targetQuery
+                       ) .
                        '</strong></div>' .
                        '<div id="mw-diff-' . $prefix . 'title2">' .
-                               Linker::revUserTools( $rev ) . '<br />' .
+                       Linker::revUserTools( $rev ) . '<br />' .
                        '</div>' .
                        '<div id="mw-diff-' . $prefix . 'title3">' .
-                               Linker::revComment( $rev ) . $rdel . '<br />' .
+                       Linker::revComment( $rev ) . $rdel . '<br />' .
                        '</div>';
        }
 
@@ -1078,15 +1114,16 @@ class SpecialUndelete extends SpecialPage {
                        $lang->userTime( $file->getTimestamp(), $user ) );
                $out->addHTML(
                        Xml::openElement( 'form', array(
-                               'method' => 'POST',
-                               'action' => $this->getTitle()->getLocalURL(
-                                       'target=' . urlencode( $this->mTarget ) .
-                                       '&file=' . urlencode( $key ) .
-                                       '&token=' . urlencode( $user->getEditToken( $key ) ) )
+                                       'method' => 'POST',
+                                       'action' => $this->getTitle()->getLocalURL( array(
+                                               'target' => $this->mTarget,
+                                               'file' => $key,
+                                               'token' => $user->getEditToken( $key ),
+                                       ) ),
                                )
                        ) .
-                       Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
-                       '</form>'
+                               Xml::submitButton( $this->msg( 'undelete-show-file-submit' )->text() ) .
+                               '</form>'
                );
        }
 
@@ -1112,7 +1149,7 @@ class SpecialUndelete extends SpecialPage {
 
        private function showHistory() {
                $out = $this->getOutput();
-               if( $this->mAllowed ) {
+               if ( $this->mAllowed ) {
                        $out->addModules( 'mediawiki.special.undelete' );
                }
                $out->wrapWikiMsg(
@@ -1146,7 +1183,7 @@ class SpecialUndelete extends SpecialPage {
                $haveFiles = $files && $files->numRows() > 0;
 
                # Batch existence check on user and talk pages
-               if( $haveRevisions ) {
+               if ( $haveRevisions ) {
                        $batch = new LinkBatch();
                        foreach ( $revisions as $row ) {
                                $batch->addObj( Title::makeTitleSafe( NS_USER, $row->ar_user_text ) );
@@ -1155,7 +1192,7 @@ class SpecialUndelete extends SpecialPage {
                        $batch->execute();
                        $revisions->seek( 0 );
                }
-               if( $haveFiles ) {
+               if ( $haveFiles ) {
                        $batch = new LinkBatch();
                        foreach ( $files as $row ) {
                                $batch->addObj( Title::makeTitleSafe( NS_USER, $row->fa_user_text ) );
@@ -1168,7 +1205,10 @@ class SpecialUndelete extends SpecialPage {
                if ( $this->mAllowed ) {
                        $action = $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) );
                        # Start the form here
-                       $top = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' ) );
+                       $top = Xml::openElement(
+                               'form',
+                               array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' )
+                       );
                        $out->addHTML( $top );
                }
 
@@ -1178,59 +1218,60 @@ class SpecialUndelete extends SpecialPage {
                LogEventsList::showLogExtract( $out, 'delete', $this->mTargetObj );
                # Show relevant lines from the suppression log:
                $suppressLogPage = new LogPage( 'suppress' );
-               if( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
+               if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
                        $out->addHTML( Xml::element( 'h2', null, $suppressLogPage->getName()->text() ) . "\n" );
                        LogEventsList::showLogExtract( $out, 'suppress', $this->mTargetObj );
                }
 
-               if( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
+               if ( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
                        # Format the user-visible controls (comment field, submission button)
                        # in a nice little table
-                       if( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+                       if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
                                $unsuppressBox =
                                        "<tr>
                                                <td>&#160;</td>
                                                <td class='mw-input'>" .
-                                                       Xml::checkLabel( $this->msg( 'revdelete-unsuppress' )->text(),
-                                                               'wpUnsuppress', 'mw-undelete-unsuppress', $this->mUnsuppress ).
+                                               Xml::checkLabel( $this->msg( 'revdelete-unsuppress' )->text(),
+                                                       'wpUnsuppress', 'mw-undelete-unsuppress', $this->mUnsuppress ) .
                                                "</td>
                                        </tr>";
                        } else {
                                $unsuppressBox = '';
                        }
+
                        $table =
                                Xml::fieldset( $this->msg( 'undelete-fieldset-title' )->text() ) .
-                               Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
+                                       Xml::openElement( 'table', array( 'id' => 'mw-undelete-table' ) ) .
                                        "<tr>
                                                <td colspan='2' class='mw-undelete-extrahelp'>" .
-                                                       $this->msg( 'undeleteextrahelp' )->parseAsBlock() .
-                                               "</td>
-                                       </tr>
-                                       <tr>
-                                               <td class='mw-label'>" .
-                                                       Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
-                                               "</td>
-                                               <td class='mw-input'>" .
-                                                       Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
-                                               "</td>
-                                       </tr>
-                                       <tr>
-                                               <td>&#160;</td>
-                                               <td class='mw-submit'>" .
-                                                       Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
-                                                       Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
-                                               "</td>
-                                       </tr>" .
+                                       $this->msg( 'undeleteextrahelp' )->parseAsBlock() .
+                                       "</td>
+                               </tr>
+                               <tr>
+                                       <td class='mw-label'>" .
+                                       Xml::label( $this->msg( 'undeletecomment' )->text(), 'wpComment' ) .
+                                       "</td>
+                                       <td class='mw-input'>" .
+                                       Xml::input( 'wpComment', 50, $this->mComment, array( 'id' => 'wpComment' ) ) .
+                                       "</td>
+                               </tr>
+                               <tr>
+                                       <td>&#160;</td>
+                                       <td class='mw-submit'>" .
+                                       Xml::submitButton( $this->msg( 'undeletebtn' )->text(), array( 'name' => 'restore', 'id' => 'mw-undelete-submit' ) ) . ' ' .
+                                       Xml::submitButton( $this->msg( 'undeleteinvert' )->text(), array( 'name' => 'invert', 'id' => 'mw-undelete-invert' ) ) .
+                                       "</td>
+                               </tr>" .
                                        $unsuppressBox .
-                               Xml::closeElement( 'table' ) .
-                               Xml::closeElement( 'fieldset' );
+                                       Xml::closeElement( 'table' ) .
+                                       Xml::closeElement( 'fieldset' );
 
                        $out->addHTML( $table );
                }
 
                $out->addHTML( Xml::element( 'h2', null, $this->msg( 'history' )->text() ) . "\n" );
 
-               if( $haveRevisions ) {
+               if ( $haveRevisions ) {
                        # The page's stored (deleted) history:
                        $out->addHTML( '<ul>' );
                        $remaining = $revisions->numRows();
@@ -1246,7 +1287,7 @@ class SpecialUndelete extends SpecialPage {
                        $out->addWikiMsg( 'nohistory' );
                }
 
-               if( $haveFiles ) {
+               if ( $haveFiles ) {
                        $out->addHTML( Xml::element( 'h2', null, $this->msg( 'filehist' )->text() ) . "\n" );
                        $out->addHTML( '<ul>' );
                        foreach ( $files as $row ) {
@@ -1276,9 +1317,9 @@ class SpecialUndelete extends SpecialPage {
                $revTextSize = '';
                $ts = wfTimestamp( TS_MW, $row->ar_timestamp );
                // Build checkboxen...
-               if( $this->mAllowed ) {
-                       if( $this->mInvert ) {
-                               if( in_array( $ts, $this->mTargetTimestamp ) ) {
+               if ( $this->mAllowed ) {
+                       if ( $this->mInvert ) {
+                               if ( in_array( $ts, $this->mTargetTimestamp ) ) {
                                        $checkBox = Xml::check( "ts$ts" );
                                } else {
                                        $checkBox = Xml::check( "ts$ts", true );
@@ -1289,15 +1330,16 @@ class SpecialUndelete extends SpecialPage {
                } else {
                        $checkBox = '';
                }
-               $user = $this->getUser();
+
                // Build page & diff links...
-               if( $this->mCanView ) {
+               $user = $this->getUser();
+               if ( $this->mCanView ) {
                        $titleObj = $this->getTitle();
                        # Last link
-                       if( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                       if ( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
                                $pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
                                $last = $this->msg( 'diff' )->escaped();
-                       } elseif( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
+                       } elseif ( $remaining > 0 || ( $earliestLiveTime && $ts > $earliestLiveTime ) ) {
                                $pageLink = $this->getPageLink( $rev, $titleObj, $ts );
                                $last = Linker::linkKnown(
                                        $titleObj,
@@ -1317,28 +1359,35 @@ class SpecialUndelete extends SpecialPage {
                        $pageLink = htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) );
                        $last = $this->msg( 'diff' )->escaped();
                }
+
                // User links
                $userLink = Linker::revUserTools( $rev );
+
                // Revision text size
                $size = $row->ar_len;
-               if( !is_null( $size ) ) {
+               if ( !is_null( $size ) ) {
                        $revTextSize = Linker::formatRevisionSize( $size );
                }
+
                // Edit summary
                $comment = Linker::revComment( $rev );
+
                // Revision delete links
                $revdlink = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
 
-               $revisionRow = $this->msg( 'undelete-revisionrow' )->rawParams( $checkBox, $revdlink, $last, $pageLink, $userLink, $revTextSize, $comment )->escaped();
+               $revisionRow = $this->msg( 'undelete-revisionrow' )
+                       ->rawParams( $checkBox, $revdlink, $last, $pageLink, $userLink, $revTextSize, $comment )
+                       ->escaped();
+
                return "<li>$revisionRow</li>";
        }
 
        private function formatFileRow( $row ) {
                $file = ArchivedFile::newFromRow( $row );
-
                $ts = wfTimestamp( TS_MW, $row->fa_timestamp );
                $user = $this->getUser();
-               if( $this->mAllowed && $row->fa_storage_key ) {
+
+               if ( $this->mAllowed && $row->fa_storage_key ) {
                        $checkBox = Xml::check( 'fileid' . $row->fa_id );
                        $key = urlencode( $row->fa_storage_key );
                        $pageLink = $this->getFileLink( $file, $this->getTitle(), $ts, $key );
@@ -1348,15 +1397,18 @@ class SpecialUndelete extends SpecialPage {
                }
                $userLink = $this->getFileUser( $file );
                $data = $this->msg( 'widthheight' )->numParams( $row->fa_width, $row->fa_height )->text();
-               $bytes = $this->msg( 'parentheses' )->rawParams( $this->msg( 'nbytes' )->numParams( $row->fa_size )->text() )->plain();
+               $bytes = $this->msg( 'parentheses' )
+                       ->rawParams( $this->msg( 'nbytes' )->numParams( $row->fa_size )->text() )
+                       ->plain();
                $data = htmlspecialchars( $data . ' ' . $bytes );
                $comment = $this->getFileComment( $file );
 
                // Add show/hide deletion links if available
                $canHide = $user->isAllowed( 'deleterevision' );
-               if( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
-                       if( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
-                               $revdlink = Linker::revDeleteLinkDisabled( $canHide ); // revision was hidden from sysops
+               if ( $canHide || ( $file->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) ) {
+                       if ( !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
+                               // Revision was hidden from sysops
+                               $revdlink = Linker::revDeleteLinkDisabled( $canHide );
                        } else {
                                $query = array(
                                        'type' => 'filearchive',
@@ -1376,8 +1428,8 @@ class SpecialUndelete extends SpecialPage {
        /**
         * Fetch revision text link if it's available to all users
         *
-        * @param $rev Revision
-        * @param $titleObj Title
+        * @param Revision $rev
+        * @param Title $titleObj
         * @param string $ts Timestamp
         * @return string
         */
@@ -1385,95 +1437,105 @@ class SpecialUndelete extends SpecialPage {
                $user = $this->getUser();
                $time = $this->getLanguage()->userTimeAndDate( $ts, $user );
 
-               if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
+               if ( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                        return '<span class="history-deleted">' . $time . '</span>';
-               } else {
-                       $link = Linker::linkKnown(
-                               $titleObj,
-                               htmlspecialchars( $time ),
-                               array(),
-                               array(
-                                       'target' => $this->mTargetObj->getPrefixedText(),
-                                       'timestamp' => $ts
-                               )
-                       );
-                       if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $link = '<span class="history-deleted">' . $link . '</span>';
-                       }
-                       return $link;
                }
+
+               $link = Linker::linkKnown(
+                       $titleObj,
+                       htmlspecialchars( $time ),
+                       array(),
+                       array(
+                               'target' => $this->mTargetObj->getPrefixedText(),
+                               'timestamp' => $ts
+                       )
+               );
+
+               if ( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
+                       $link = '<span class="history-deleted">' . $link . '</span>';
+               }
+
+               return $link;
        }
 
        /**
         * Fetch image view link if it's available to all users
         *
-        * @param $file File
-        * @param $titleObj Title
+        * @param File|ArchivedFile $file
+        * @param Title $titleObj
         * @param string $ts A timestamp
         * @param string $key a storage key
         *
-        * @return String: HTML fragment
+        * @return string HTML fragment
         */
        function getFileLink( $file, $titleObj, $ts, $key ) {
                $user = $this->getUser();
                $time = $this->getLanguage()->userTimeAndDate( $ts, $user );
 
-               if( !$file->userCan( File::DELETED_FILE, $user ) ) {
+               if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
                        return '<span class="history-deleted">' . $time . '</span>';
-               } else {
-                       $link = Linker::linkKnown(
-                               $titleObj,
-                               htmlspecialchars( $time ),
-                               array(),
-                               array(
-                                       'target' => $this->mTargetObj->getPrefixedText(),
-                                       'file' => $key,
-                                       'token' => $user->getEditToken( $key )
-                               )
-                       );
-                       if( $file->isDeleted( File::DELETED_FILE ) ) {
-                               $link = '<span class="history-deleted">' . $link . '</span>';
-                       }
-                       return $link;
                }
+
+               $link = Linker::linkKnown(
+                       $titleObj,
+                       htmlspecialchars( $time ),
+                       array(),
+                       array(
+                               'target' => $this->mTargetObj->getPrefixedText(),
+                               'file' => $key,
+                               'token' => $user->getEditToken( $key )
+                       )
+               );
+
+               if ( $file->isDeleted( File::DELETED_FILE ) ) {
+                       $link = '<span class="history-deleted">' . $link . '</span>';
+               }
+
+               return $link;
        }
 
        /**
         * Fetch file's user id if it's available to this user
         *
-        * @param $file File
-        * @return String: HTML fragment
+        * @param File|ArchivedFile $file
+        * @return string HTML fragment
         */
        function getFileUser( $file ) {
-               if( !$file->userCan( File::DELETED_USER, $this->getUser() ) ) {
-                       return '<span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-               } else {
-                       $link = Linker::userLink( $file->getRawUser(), $file->getRawUserText() ) .
-                               Linker::userToolLinks( $file->getRawUser(), $file->getRawUserText() );
-                       if( $file->isDeleted( File::DELETED_USER ) ) {
-                               $link = '<span class="history-deleted">' . $link . '</span>';
-                       }
-                       return $link;
+               if ( !$file->userCan( File::DELETED_USER, $this->getUser() ) ) {
+                       return '<span class="history-deleted">' .
+                               $this->msg( 'rev-deleted-user' )->escaped() .
+                               '</span>';
                }
+
+               $link = Linker::userLink( $file->getRawUser(), $file->getRawUserText() ) .
+                       Linker::userToolLinks( $file->getRawUser(), $file->getRawUserText() );
+
+               if ( $file->isDeleted( File::DELETED_USER ) ) {
+                       $link = '<span class="history-deleted">' . $link . '</span>';
+               }
+
+               return $link;
        }
 
        /**
         * Fetch file upload comment if it's available to this user
         *
-        * @param $file File
-        * @return String: HTML fragment
+        * @param File|ArchivedFile $file
+        * @return string HTML fragment
         */
        function getFileComment( $file ) {
-               if( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
+               if ( !$file->userCan( File::DELETED_COMMENT, $this->getUser() ) ) {
                        return '<span class="history-deleted"><span class="comment">' .
                                $this->msg( 'rev-deleted-comment' )->escaped() . '</span></span>';
-               } else {
-                       $link = Linker::commentBlock( $file->getRawDescription() );
-                       if( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                               $link = '<span class="history-deleted">' . $link . '</span>';
-                       }
-                       return $link;
                }
+
+               $link = Linker::commentBlock( $file->getRawDescription() );
+
+               if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+                       $link = '<span class="history-deleted">' . $link . '</span>';
+               }
+
+               return $link;
        }
 
        function undelete() {
@@ -1498,7 +1560,7 @@ class SpecialUndelete extends SpecialPage {
                        $this->getUser()
                );
 
-               if( is_array( $ok ) ) {
+               if ( is_array( $ok ) ) {
                        if ( $ok[1] ) { // Undeleted file count
                                wfRunHooks( 'FileUndeleteComplete', array(
                                        $this->mTargetObj, $this->mFileVersions,
@@ -1513,13 +1575,13 @@ class SpecialUndelete extends SpecialPage {
 
                // Show revision undeletion warnings and errors
                $status = $archive->getRevisionStatus();
-               if( $status && !$status->isGood() ) {
+               if ( $status && !$status->isGood() ) {
                        $out->addWikiText( '<div class="error">' . $status->getWikiText( 'cannotundelete', 'cannotundelete' ) . '</div>' );
                }
 
                // Show file undeletion warnings and errors
                $status = $archive->getFileStatus();
-               if( $status && !$status->isGood() ) {
+               if ( $status && !$status->isGood() ) {
                        $out->addWikiText( '<div class="error">' . $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) . '</div>' );
                }
        }
index 6b91dd3..b686a5b 100644 (file)
@@ -39,15 +39,15 @@ class UnusedCategoriesPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'page', 'categorylinks' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
+               return array(
+                       'tables' => array( 'page', 'categorylinks' ),
+                       'fields' => array( 'namespace' => 'page_namespace',
                                        'title' => 'page_title',
                                        'value' => 'page_title' ),
-                       'conds' => array ( 'cl_from IS NULL',
+                       'conds' => array( 'cl_from IS NULL',
                                        'page_namespace' => NS_CATEGORY,
                                        'page_is_redirect' => 0 ),
-                       'join_conds' => array ( 'categorylinks' => array (
+                       'join_conds' => array( 'categorylinks' => array(
                                        'LEFT JOIN', 'cl_to = page_title' ) )
                );
        }
@@ -60,6 +60,11 @@ class UnusedCategoriesPage extends QueryPage {
                return false;
        }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
        function formatResult( $skin, $result ) {
                $title = Title::makeTitle( NS_CATEGORY, $result->title );
                return Linker::link( $title, htmlspecialchars( $title->getText() ) );
index 6955328..d332db7 100644 (file)
@@ -45,28 +45,28 @@ class UnusedimagesPage extends ImageQueryPage {
 
        function getQueryInfo() {
                global $wgCountCategorizedImagesAsUsed;
-               $retval = array (
-                       'tables' => array ( 'image', 'imagelinks' ),
-                       'fields' => array ( 'namespace' => NS_FILE,
+               $retval = array(
+                       'tables' => array( 'image', 'imagelinks' ),
+                       'fields' => array( 'namespace' => NS_FILE,
                                        'title' => 'img_name',
                                        'value' => 'img_timestamp',
                                        'img_user', 'img_user_text',
                                        'img_description' ),
-                       'conds' => array ( 'il_to IS NULL' ),
-                       'join_conds' => array ( 'imagelinks' => array (
+                       'conds' => array( 'il_to IS NULL' ),
+                       'join_conds' => array( 'imagelinks' => array(
                                        'LEFT JOIN', 'il_to = img_name' ) )
                );
 
                if ( $wgCountCategorizedImagesAsUsed ) {
                        // Order is significant
-                       $retval['tables'] = array ( 'image', 'page', 'categorylinks',
+                       $retval['tables'] = array( 'image', 'page', 'categorylinks',
                                        'imagelinks' );
                        $retval['conds']['page_namespace'] = NS_FILE;
                        $retval['conds'][] = 'cl_from IS NULL';
                        $retval['conds'][] = 'img_name = page_title';
-                       $retval['join_conds']['categorylinks'] = array (
+                       $retval['join_conds']['categorylinks'] = array(
                                        'LEFT JOIN', 'cl_from = page_id' );
-                       $retval['join_conds']['imagelinks'] = array (
+                       $retval['join_conds']['imagelinks'] = array(
                                        'LEFT JOIN', 'il_to = page_title' );
                }
                return $retval;
index 493e936..1dc9f42 100644 (file)
@@ -48,23 +48,23 @@ class UnusedtemplatesPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'page', 'templatelinks' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
+               return array(
+                       'tables' => array( 'page', 'templatelinks' ),
+                       'fields' => array( 'namespace' => 'page_namespace',
                                        'title' => 'page_title',
                                        'value' => 'page_title' ),
-                       'conds' => array ( 'page_namespace' => NS_TEMPLATE,
+                       'conds' => array( 'page_namespace' => NS_TEMPLATE,
                                        'tl_from IS NULL',
                                        'page_is_redirect' => 0 ),
-                       'join_conds' => array ( 'templatelinks' => array (
-                               'LEFT JOIN', array ( 'tl_title = page_title',
+                       'join_conds' => array( 'templatelinks' => array(
+                               'LEFT JOIN', array( 'tl_title = page_title',
                                        'tl_namespace = page_namespace' ) ) )
                );
        }
 
        /**
-        * @param $skin Skin
-        * @param $result
+        * @param Skin $skin
+        * @param object $result Result row
         * @return string
         */
        function formatResult( $skin, $result ) {
index 05ec6b0..954e3ff 100644 (file)
@@ -44,17 +44,17 @@ class UnwatchedpagesPage extends QueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'page', 'watchlist' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
+               return array(
+                       'tables' => array( 'page', 'watchlist' ),
+                       'fields' => array( 'namespace' => 'page_namespace',
                                        'title' => 'page_title',
                                        'value' => 'page_namespace' ),
-                       'conds' => array ( 'wl_title IS NULL',
+                       'conds' => array( 'wl_title IS NULL',
                                        'page_is_redirect' => 0,
                                        "page_namespace != '" . NS_MEDIAWIKI .
                                        "'" ),
-                       'join_conds' => array ( 'watchlist' => array (
-                               'LEFT JOIN', array ( 'wl_title = page_title',
+                       'join_conds' => array( 'watchlist' => array(
+                               'LEFT JOIN', array( 'wl_title = page_title',
                                        'wl_namespace = page_namespace' ) ) )
                );
        }
@@ -68,8 +68,8 @@ class UnwatchedpagesPage extends QueryPage {
        }
 
        /**
-        * @param $skin Skin
-        * @param $result
+        * @param Skin $skin
+        * @param object $result Result row
         * @return string
         */
        function formatResult( $skin, $result ) {
index 89c06b2..98d0c9a 100644 (file)
@@ -90,7 +90,7 @@ class SpecialUpload extends SpecialPage {
 
                // Guess the desired name from the filename if not provided
                $this->mDesiredDestName = $request->getText( 'wpDestFile' );
-               if( !$this->mDesiredDestName && $request->getFileName( 'wpUploadFile' ) !== null ) {
+               if ( !$this->mDesiredDestName && $request->getFileName( 'wpUploadFile' ) !== null ) {
                        $this->mDesiredDestName = $request->getFileName( 'wpUploadFile' );
                }
                $this->mComment = $request->getText( 'wpUploadDescription' );
@@ -135,19 +135,19 @@ class SpecialUpload extends SpecialPage {
                $this->outputHeader();
 
                # Check uploading enabled
-               if( !UploadBase::isEnabled() ) {
+               if ( !UploadBase::isEnabled() ) {
                        throw new ErrorPageError( 'uploaddisabled', 'uploaddisabledtext' );
                }
 
                # Check permissions
                $user = $this->getUser();
                $permissionRequired = UploadBase::isAllowed( $user );
-               if( $permissionRequired !== true ) {
+               if ( $permissionRequired !== true ) {
                        throw new PermissionsError( $permissionRequired );
                }
 
                # Check blocks
-               if( $user->isBlocked() ) {
+               if ( $user->isBlocked() ) {
                        throw new UserBlockedError( $user->getBlock() );
                }
 
@@ -172,7 +172,7 @@ class SpecialUpload extends SpecialPage {
                        $this->processUpload();
                } else {
                        # Backwards compatibility hook
-                       if( !wfRunHooks( 'UploadForm:initial', array( &$this ) ) ) {
+                       if ( !wfRunHooks( 'UploadForm:initial', array( &$this ) ) ) {
                                wfDebug( "Hook 'UploadForm:initial' broke output of the upload form" );
                                return;
                        }
@@ -229,7 +229,7 @@ class SpecialUpload extends SpecialPage {
                $form->setTitle( $this->getTitle() );
 
                # Check the token, but only if necessary
-               if(
+               if (
                        !$this->mTokenOk && !$this->mCancelUpload &&
                        ( $this->mUpload && $this->mUploadClicked )
                ) {
@@ -275,7 +275,7 @@ class SpecialUpload extends SpecialPage {
                $title = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
                $user = $this->getUser();
                // Show a subtitle link to deleted revisions (to sysops et al only)
-               if( $title instanceof Title ) {
+               if ( $title instanceof Title ) {
                        $count = $title->isDeleted();
                        if ( $count > 0 && $user->isAllowed( 'deletedhistory' ) ) {
                                $restorelink = Linker::linkKnown(
@@ -333,15 +333,15 @@ class SpecialUpload extends SpecialPage {
 
                $warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
                        . '<ul class="warning">';
-               foreach( $warnings as $warning => $args ) {
-                       if( $warning == 'badfilename' ) {
+               foreach ( $warnings as $warning => $args ) {
+                       if ( $warning == 'badfilename' ) {
                                $this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
                        }
-                       if( $warning == 'exists' ) {
+                       if ( $warning == 'exists' ) {
                                $msg = "\t<li>" . self::getExistsWarning( $args ) . "</li>\n";
-                       } elseif( $warning == 'duplicate' ) {
+                       } elseif ( $warning == 'duplicate' ) {
                                $msg = self::getDupeWarning( $args );
-                       } elseif( $warning == 'duplicate-archive' ) {
+                       } elseif ( $warning == 'duplicate-archive' ) {
                                $msg = "\t<li>" . $this->msg( 'file-deleted-duplicate',
                                                Title::makeTitle( NS_FILE, $args )->getPrefixedText() )->parse()
                                        . "</li>\n";
@@ -387,12 +387,12 @@ class SpecialUpload extends SpecialPage {
        protected function processUpload() {
                // Fetch the file if required
                $status = $this->mUpload->fetchFile();
-               if( !$status->isOK() ) {
+               if ( !$status->isOK() ) {
                        $this->showUploadError( $this->getOutput()->parse( $status->getWikiText() ) );
                        return;
                }
 
-               if( !wfRunHooks( 'UploadForm:BeforeProcessing', array( &$this ) ) ) {
+               if ( !wfRunHooks( 'UploadForm:BeforeProcessing', array( &$this ) ) ) {
                        wfDebug( "Hook 'UploadForm:BeforeProcessing' broke processing the file.\n" );
                        // This code path is deprecated. If you want to break upload processing
                        // do so by hooking into the appropriate hooks in UploadBase::verifyUpload
@@ -411,7 +411,7 @@ class SpecialUpload extends SpecialPage {
 
                // Verify permissions for this title
                $permErrors = $this->mUpload->verifyTitlePermissions( $this->getUser() );
-               if( $permErrors !== true ) {
+               if ( $permErrors !== true ) {
                        $code = array_shift( $permErrors[0] );
                        $this->showRecoverableUploadError( $this->msg( $code, $permErrors[0] )->parse() );
                        return;
@@ -420,15 +420,15 @@ class SpecialUpload extends SpecialPage {
                $this->mLocalFile = $this->mUpload->getLocalFile();
 
                // Check warnings if necessary
-               if( !$this->mIgnoreWarning ) {
+               if ( !$this->mIgnoreWarning ) {
                        $warnings = $this->mUpload->checkWarnings();
-                       if( $this->showUploadWarning( $warnings ) ) {
+                       if ( $this->showUploadWarning( $warnings ) ) {
                                return;
                        }
                }
 
                // Get the page text if this is not a reupload
-               if( !$this->mForReUpload ) {
+               if ( !$this->mForReUpload ) {
                        $pageText = self::getInitialPageText( $this->mComment, $this->mLicense,
                                $this->mCopyrightStatus, $this->mCopyrightSource );
                } else {
@@ -456,15 +456,14 @@ class SpecialUpload extends SpecialPage {
         */
        public static function getInitialPageText( $comment = '', $license = '', $copyStatus = '', $source = '' ) {
                global $wgUseCopyrightUpload, $wgForceUIMsgAsContentMsg;
-               $wgForceUIMsgAsContentMsg = (array) $wgForceUIMsgAsContentMsg;
 
                $msg = array();
                /* These messages are transcluded into the actual text of the description page.
                 * Thus, forcing them as content messages makes the upload to produce an int: template
                 * instead of hardcoding it there in the uploader language.
                 */
-               foreach( array( 'license-header', 'filedesc', 'filestatus', 'filesource' ) as $msgName ) {
-                       if ( in_array( $msgName, $wgForceUIMsgAsContentMsg ) ) {
+               foreach ( array( 'license-header', 'filedesc', 'filestatus', 'filesource' ) as $msgName ) {
+                       if ( in_array( $msgName, (array)$wgForceUIMsgAsContentMsg ) ) {
                                $msg[$msgName] = "{{int:$msgName}}";
                        } else {
                                $msg[$msgName] = wfMessage( $msgName )->inContentLanguage()->text();
@@ -505,13 +504,13 @@ class SpecialUpload extends SpecialPage {
         * @return Bool|String
         */
        protected function getWatchCheck() {
-               if( $this->getUser()->getOption( 'watchdefault' ) ) {
+               if ( $this->getUser()->getOption( 'watchdefault' ) ) {
                        // Watch all edits!
                        return true;
                }
 
                $local = wfLocalFile( $this->mDesiredDestName );
-               if( $local && $local->exists() ) {
+               if ( $local && $local->exists() ) {
                        // We're uploading a new version of an existing file.
                        // No creation, so don't watch it if we're not already.
                        return $this->getUser()->isWatched( $local->getTitle() );
@@ -530,7 +529,7 @@ class SpecialUpload extends SpecialPage {
        protected function processVerificationError( $details ) {
                global $wgFileExtensions;
 
-               switch( $details['status'] ) {
+               switch ( $details['status'] ) {
 
                        /** Statuses that only require name changing **/
                        case UploadBase::MIN_LENGTH_PARTNAME:
@@ -635,10 +634,10 @@ class SpecialUpload extends SpecialPage {
                $filename = $file->getTitle()->getPrefixedText();
                $warning = '';
 
-               if( $exists['warning'] == 'exists' ) {
+               if ( $exists['warning'] == 'exists' ) {
                        // Exact match
                        $warning = wfMessage( 'fileexists', $filename )->parse();
-               } elseif( $exists['warning'] == 'page-exists' ) {
+               } elseif ( $exists['warning'] == 'page-exists' ) {
                        // Page exists but file does not
                        $warning = wfMessage( 'filepageexists', $filename )->parse();
                } elseif ( $exists['warning'] == 'exists-normalized' ) {
@@ -681,7 +680,7 @@ class SpecialUpload extends SpecialPage {
         */
        public static function ajaxGetExistsWarning( $filename ) {
                $file = wfFindFile( $filename );
-               if( !$file ) {
+               if ( !$file ) {
                        // Force local file so we have an object to do further checks against
                        // if there isn't an exact match...
                        $file = wfLocalFile( $filename );
@@ -709,7 +708,7 @@ class SpecialUpload extends SpecialPage {
 
                $gallery = new ImageGallery;
                $gallery->setShowBytes( false );
-               foreach( $dupes as $file ) {
+               foreach ( $dupes as $file ) {
                        $gallery->add( $file->getTitle() );
                }
                return '<li>' .
@@ -843,10 +842,13 @@ class UploadForm extends HTMLForm {
                        'upload-type' => 'File',
                        'radio' => &$radio,
                        'help' => $this->msg( 'upload-maxfilesize',
-                                       $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
-                               )->parse() . ' ' . $this->msg( 'upload_source_file' )->escaped(),
+                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] ) )
+                               ->parse() .
+                               $this->msg( 'word-separator' )->escaped() .
+                               $this->msg( 'upload_source_file' )->escaped(),
                        'checked' => $selectedSourceType == 'file',
                );
+
                if ( $canUploadByUrl ) {
                        $this->mMaxUploadSize['url'] = UploadBase::getMaxUploadSize( 'url' );
                        $descriptor['UploadFileURL'] = array(
@@ -857,8 +859,10 @@ class UploadForm extends HTMLForm {
                                'upload-type' => 'url',
                                'radio' => &$radio,
                                'help' => $this->msg( 'upload-maxfilesize',
-                                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
-                                       )->parse() . ' ' . $this->msg( 'upload_source_url' )->escaped(),
+                                       $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] ) )
+                                       ->parse() .
+                                       $this->msg( 'word-separator' )->escaped() .
+                                       $this->msg( 'upload_source_url' )->escaped(),
                                'checked' => $selectedSourceType == 'url',
                        );
                }
@@ -884,8 +888,8 @@ class UploadForm extends HTMLForm {
                global $wgCheckFileExtensions, $wgStrictFileExtensions,
                $wgFileExtensions, $wgFileBlacklist;
 
-               if( $wgCheckFileExtensions ) {
-                       if( $wgStrictFileExtensions ) {
+               if ( $wgCheckFileExtensions ) {
+                       if ( $wgStrictFileExtensions ) {
                                # Everything not permitted is banned
                                $extensionsList =
                                        '<div id="mw-upload-permitted">' .
index ddf0c6d..e7f36ee 100644 (file)
@@ -88,19 +88,19 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                        } else {
                                return $this->outputLocalFile( $params['file'] );
                        }
-               } catch( UploadStashFileNotFoundException $e ) {
+               } catch ( UploadStashFileNotFoundException $e ) {
                        $code = 404;
                        $message = $e->getMessage();
-               } catch( UploadStashZeroLengthFileException $e ) {
+               } catch ( UploadStashZeroLengthFileException $e ) {
                        $code = 500;
                        $message = $e->getMessage();
-               } catch( UploadStashBadPathException $e ) {
+               } catch ( UploadStashBadPathException $e ) {
                        $code = 500;
                        $message = $e->getMessage();
-               } catch( SpecialUploadStashTooLargeException $e ) {
+               } catch ( SpecialUploadStashTooLargeException $e ) {
                        $code = 500;
                        $message = 'Cannot serve a file larger than ' . self::MAX_SERVE_BYTES . ' bytes. ' . $e->getMessage();
-               } catch( Exception $e ) {
+               } catch ( Exception $e ) {
                        $code = 500;
                        $message = $e->getMessage();
                }
@@ -222,7 +222,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
                global $wgUploadStashScalerBaseUrl;
                $scalerBaseUrl = $wgUploadStashScalerBaseUrl;
 
-               if( preg_match( '/^\/\//', $scalerBaseUrl ) ) {
+               if ( preg_match( '/^\/\//', $scalerBaseUrl ) ) {
                        // this is apparently a protocol-relative URL, which makes no sense in this context,
                        // since this is used for communication that's internal to the application.
                        // default to http.
@@ -311,6 +311,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * Note the stash has to be recreated since this is being called in a static context.
         * This works, because there really is only one stash per logged-in user, despite appearances.
         *
+        * @param array $formData
         * @return Status
         */
        public static function tryClearStashedUploads( $formData ) {
index eef6691..b147b83 100644 (file)
@@ -50,16 +50,22 @@ class LoginForm extends SpecialPage {
        var $mType, $mReason, $mRealName;
        var $mAbortLoginErrorMsg = 'login-abort-generic';
        private $mLoaded = false;
+       private $mSecureLoginUrl;
+       // TODO Remove old forms and mShowVForm gating after all WMF wikis have
+       // adapted messages and help links to new versions.
+       private $mShowVForm;
 
        /**
-        * @var ExternalUser
+        * @ var WebRequest
         */
-       private $mExtUser = null;
+       private $mOverrideRequest = null;
 
        /**
-        * @ var WebRequest
+        * Effective request; set at the beginning of load
+        *
+        * @var WebRequest $mRequest
         */
-       private $mOverrideRequest = null;
+       private $mRequest = null;
 
        /**
         * @param WebRequest $request
@@ -86,6 +92,7 @@ class LoginForm extends SpecialPage {
                } else {
                        $request = $this->mOverrideRequest;
                }
+               $this->mRequest = $request;
 
                $this->mType = $request->getText( 'type' );
                $this->mUsername = $request->getText( 'wpName' );
@@ -108,18 +115,18 @@ class LoginForm extends SpecialPage {
                $this->mReturnTo = $request->getVal( 'returnto', '' );
                $this->mReturnToQuery = $request->getVal( 'returntoquery', '' );
 
-               if( $wgEnableEmail ) {
+               if ( $wgEnableEmail ) {
                        $this->mEmail = $request->getText( 'wpEmail' );
                } else {
                        $this->mEmail = '';
                }
-               if( !in_array( 'realname', $wgHiddenPrefs ) ) {
+               if ( !in_array( 'realname', $wgHiddenPrefs ) ) {
                        $this->mRealName = $request->getText( 'wpRealName' );
                } else {
                        $this->mRealName = '';
                }
 
-               if( !$wgAuth->validDomain( $this->mDomain ) ) {
+               if ( !$wgAuth->validDomain( $this->mDomain ) ) {
                        $this->mDomain = $wgAuth->getDomain();
                }
                $wgAuth->setDomain( $this->mDomain );
@@ -128,7 +135,7 @@ class LoginForm extends SpecialPage {
                # 2. Do not return to PasswordReset after a successful password change
                #    but goto Wiki start page (Main_Page) instead ( bug 33997 )
                $returnToTitle = Title::newFromText( $this->mReturnTo );
-               if( is_object( $returnToTitle ) && (
+               if ( is_object( $returnToTitle ) && (
                        $returnToTitle->isSpecial( 'Userlogout' )
                        || $returnToTitle->isSpecial( 'PasswordReset' ) ) ) {
                        $this->mReturnTo = '';
@@ -137,22 +144,43 @@ class LoginForm extends SpecialPage {
        }
 
        function getDescription() {
-               return $this->msg( $this->getUser()->isAllowed( 'createaccount' ) ?
-                       'userlogin' : 'userloginnocreate' )->text();
+               if ( !$this->getUser()->isAllowed( 'createaccount' ) ) {
+                       return $this->msg( 'userloginnocreate' )->text();
+               }
+               if ( $this->mShowVForm ) {
+                       if ( $this->mType === 'signup' ) {
+                               return $this->msg( 'createaccount' )->text();
+                       } else {
+                               return $this->msg( 'login' )->text();
+                       }
+               } else {
+                       return $this->msg( 'userlogin' )->text();
+               }
        }
 
-       public function execute( $par ) {
+       /*
+        * @param $subPage string|null
+        */
+       public function execute( $subPage ) {
                if ( session_id() == '' ) {
                        wfSetupSession();
                }
 
                $this->load();
+
+               // Check for [[Special:Userlogin/signup]. This affects form display and
+               // page title.
+               if ( $subPage == 'signup' ) {
+                       $this->mType = 'signup';
+               }
+               $this->mShowVForm = $this->shouldShowVForm();
+
                $this->setHeaders();
 
+               // If logging in and not on HTTPS, either redirect to it or offer a link.
                global $wgSecureLogin;
                if (
                        $this->mType !== 'signup' &&
-                       $wgSecureLogin &&
                        WebRequest::detectProtocol() !== 'https'
                ) {
                        $title = $this->getFullTitle();
@@ -162,19 +190,24 @@ class LoginForm extends SpecialPage {
                                'wpStickHTTPS' => $this->mStickHTTPS
                        );
                        $url = $title->getFullURL( $query, false, PROTO_HTTPS );
-                       $this->getOutput()->redirect( $url );
-                       return;
-               }
-
-               if ( $par == 'signup' ) { # Check for [[Special:Userlogin/signup]]
-                       $this->mType = 'signup';
+                       if ( $wgSecureLogin ) {
+                               $this->getOutput()->redirect( $url );
+                               return;
+                       } else {
+                               // A wiki without HTTPS login support should set $wgServer to
+                               // http://somehost, in which case the secure URL generated
+                               // above won't actually start with https://
+                               if ( substr( $url, 0, 8 ) === 'https://' ) {
+                                       $this->mSecureLoginUrl = $url;
+                               }
+                       }
                }
 
                if ( !is_null( $this->mCookieCheck ) ) {
                        $this->onCookieRedirectCheck( $this->mCookieCheck );
                        return;
-               } elseif( $this->mPosted ) {
-                       if( $this->mCreateaccount ) {
+               } elseif ( $this->mPosted ) {
+                       if ( $this->mCreateaccount ) {
                                $this->addNewAccount();
                                return;
                        } elseif ( $this->mCreateaccountMail ) {
@@ -198,7 +231,7 @@ class LoginForm extends SpecialPage {
                }
 
                $status = $this->addNewaccountInternal();
-               if( !$status->isGood() ) {
+               if ( !$status->isGood() ) {
                        $error = $this->getOutput()->parse( $status->getWikiText() );
                        $this->mainLoginForm( $error );
                        return;
@@ -217,7 +250,7 @@ class LoginForm extends SpecialPage {
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'accmailtitle' ) );
 
-               if( !$result->isGood() ) {
+               if ( !$result->isGood() ) {
                        $this->mainLoginForm( $this->msg( 'mailerror', $result->getWikiText() )->text() );
                } else {
                        $out->addWikiMsg( 'accmailtext', $u->getName(), $u->getEmail() );
@@ -234,7 +267,7 @@ class LoginForm extends SpecialPage {
 
                # Create the account and abort if there's a problem doing so
                $status = $this->addNewAccountInternal();
-               if( !$status->isGood() ) {
+               if ( !$status->isGood() ) {
                        $error = $this->getOutput()->parse( $status->getWikiText() );
                        $this->mainLoginForm( $error );
                        return false;
@@ -246,7 +279,7 @@ class LoginForm extends SpecialPage {
                if ( $this->getUser()->isAnon() ) {
                        # If we showed up language selection links, and one was in use, be
                        # smart (and sensible) and save that language as the user's preference
-                       if( $wgLoginLanguageSelector && $this->mLanguage ) {
+                       if ( $wgLoginLanguageSelector && $this->mLanguage ) {
                                $u->setOption( 'language', $this->mLanguage );
                        } else {
 
@@ -263,9 +296,9 @@ class LoginForm extends SpecialPage {
                $out = $this->getOutput();
 
                # Send out an email authentication message if needed
-               if( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
+               if ( $wgEmailAuthentication && Sanitizer::validateEmail( $u->getEmail() ) ) {
                        $status = $u->sendConfirmationMail();
-                       if( $status->isGood() ) {
+                       if ( $status->isGood() ) {
                                $out->addWikiMsg( 'confirmemail_oncreate' );
                        } else {
                                $out->addWikiText( $status->getWikiText( 'confirmemail_sendfailed' ) );
@@ -278,7 +311,7 @@ class LoginForm extends SpecialPage {
                # If not logged in, assume the new account as the current one and set
                # session cookies then show a "welcome" message or a "need cookies"
                # message as needed
-               if( $this->getUser()->isAnon() ) {
+               if ( $this->getUser()->isAnon() ) {
                        $u->setCookies();
                        $wgUser = $u;
                        // This should set it for OutputPage and the Skin
@@ -287,7 +320,7 @@ class LoginForm extends SpecialPage {
                        $this->getContext()->setUser( $u );
                        wfRunHooks( 'AddNewAccount', array( $u, false ) );
                        $u->addNewUserLogEntry( 'create' );
-                       if( $this->hasSessionCookie() ) {
+                       if ( $this->hasSessionCookie() ) {
                                $this->successfulCreation();
                        } else {
                                $this->cookieRedirectCheck( 'new' );
@@ -314,7 +347,7 @@ class LoginForm extends SpecialPage {
                        $wgMinimalPasswordLength, $wgEmailConfirmToEdit;
 
                // If the user passes an invalid domain, something is fishy
-               if( !$wgAuth->validDomain( $this->mDomain ) ) {
+               if ( !$wgAuth->validDomain( $this->mDomain ) ) {
                        return Status::newFatal( 'wrongpassword' );
                }
 
@@ -323,8 +356,8 @@ class LoginForm extends SpecialPage {
                // cation server before they create an account (otherwise, they can
                // create a local account and login as any domain user). We only need
                // to check this for domains that aren't local.
-               if( 'local' != $this->mDomain && $this->mDomain != '' ) {
-                       if(
+               if ( 'local' != $this->mDomain && $this->mDomain != '' ) {
+                       if (
                                !$wgAuth->canCreateAccounts() &&
                                (
                                        !$wgAuth->userExists( $this->mUsername ) ||
@@ -422,7 +455,7 @@ class LoginForm extends SpecialPage {
                $u->setRealName( $this->mRealName );
 
                $abortError = '';
-               if( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
+               if ( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
                        // Hook point to add extra creation throttles and blocks
                        wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
                        return Status::newFatal( new RawMessage( $abortError ) );
@@ -445,7 +478,7 @@ class LoginForm extends SpecialPage {
                        }
                }
 
-               if( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
+               if ( !$wgAuth->addUser( $u, $this->mPassword, $this->mEmail, $this->mRealName ) ) {
                        return Status::newFatal( 'externaldberror' );
                }
 
@@ -480,14 +513,6 @@ class LoginForm extends SpecialPage {
 
                $wgAuth->initUser( $u, $autocreate );
 
-               if ( $this->mExtUser ) {
-                       $this->mExtUser->linkToLocal( $u->getId() );
-                       $email = $this->mExtUser->getPref( 'emailaddress' );
-                       if ( $email && !$this->mEmail ) {
-                               $u->setEmail( $email );
-                       }
-               }
-
                $u->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
                $u->saveSettings();
 
@@ -550,12 +575,8 @@ class LoginForm extends SpecialPage {
                        return self::SUCCESS;
                }
 
-               $this->mExtUser = ExternalUser::newFromName( $this->mUsername );
-
-               # TODO: Allow some magic here for invalid external names, e.g., let the
-               # user choose a different wiki name.
                $u = User::newFromName( $this->mUsername );
-               if( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
+               if ( !( $u instanceof User ) || !User::isUsableName( $u->getName() ) ) {
                        return self::ILLEGAL;
                }
 
@@ -568,28 +589,18 @@ class LoginForm extends SpecialPage {
                                $isAutoCreated = true;
                        }
                } else {
-                       global $wgExternalAuthType, $wgAutocreatePolicy;
-                       if ( $wgExternalAuthType && $wgAutocreatePolicy != 'never'
-                               && is_object( $this->mExtUser )
-                               && $this->mExtUser->authenticate( $this->mPassword )
-                       ) {
-                               # The external user and local user have the same name and
-                               # password, so we assume they're the same.
-                               $this->mExtUser->linkToLocal( $u->getID() );
-                       }
-
                        $u->load();
                }
 
                // Give general extensions, such as a captcha, a chance to abort logins
                $abort = self::ABORTED;
-               if( !wfRunHooks( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$this->mAbortLoginErrorMsg ) ) ) {
+               if ( !wfRunHooks( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$this->mAbortLoginErrorMsg ) ) ) {
                        return $abort;
                }
 
                global $wgBlockDisablesLogin;
                if ( !$u->checkPassword( $this->mPassword ) ) {
-                       if( $u->checkTemporaryPassword( $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-
@@ -606,7 +617,7 @@ class LoginForm extends SpecialPage {
                                // 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() ) {
+                               if ( !$u->isEmailConfirmed() ) {
                                        $u->confirmEmail();
                                        $u->saveSettings();
                                }
@@ -696,44 +707,26 @@ class LoginForm extends SpecialPage {
         * @return integer Status code
         */
        function attemptAutoCreate( $user ) {
-               global $wgAuth, $wgAutocreatePolicy;
+               global $wgAuth;
 
                if ( $this->getUser()->isBlockedFromCreateAccount() ) {
                        wfDebug( __METHOD__ . ": user is blocked from account creation\n" );
                        return self::CREATE_BLOCKED;
                }
-
-               /**
-                * If the external authentication plugin allows it, automatically cre-
-                * ate a new account for users that are externally defined but have not
-                * yet logged in.
-                */
-               if ( $this->mExtUser ) {
-                       # mExtUser is neither null nor false, so use the new ExternalAuth
-                       # system.
-                       if ( $wgAutocreatePolicy == 'never' ) {
-                               return self::NOT_EXISTS;
-                       }
-                       if ( !$this->mExtUser->authenticate( $this->mPassword ) ) {
-                               return self::WRONG_PLUGIN_PASS;
-                       }
-               } else {
-                       # Old AuthPlugin.
-                       if ( !$wgAuth->autoCreate() ) {
-                               return self::NOT_EXISTS;
-                       }
-                       if ( !$wgAuth->userExists( $user->getName() ) ) {
-                               wfDebug( __METHOD__ . ": user does not exist\n" );
-                               return self::NOT_EXISTS;
-                       }
-                       if ( !$wgAuth->authenticate( $user->getName(), $this->mPassword ) ) {
-                               wfDebug( __METHOD__ . ": \$wgAuth->authenticate() returned false, aborting\n" );
-                               return self::WRONG_PLUGIN_PASS;
-                       }
+               if ( !$wgAuth->autoCreate() ) {
+                       return self::NOT_EXISTS;
+               }
+               if ( !$wgAuth->userExists( $user->getName() ) ) {
+                       wfDebug( __METHOD__ . ": user does not exist\n" );
+                       return self::NOT_EXISTS;
+               }
+               if ( !$wgAuth->authenticate( $user->getName(), $this->mPassword ) ) {
+                       wfDebug( __METHOD__ . ": \$wgAuth->authenticate() returned false, aborting\n" );
+                       return self::WRONG_PLUGIN_PASS;
                }
 
                $abortError = '';
-               if( !wfRunHooks( 'AbortAutoAccount', array( $user, &$abortError ) ) ) {
+               if ( !wfRunHooks( 'AbortAutoAccount', array( $user, &$abortError ) ) ) {
                        // Hook point to add extra creation throttles and blocks
                        wfDebug( "LoginForm::attemptAutoCreate: a hook blocked creation: $abortError\n" );
                        $this->mAbortLoginErrorMsg = $abortError;
@@ -759,14 +752,14 @@ class LoginForm extends SpecialPage {
                        case self::SUCCESS:
                                # We've verified now, update the real record
                                $user = $this->getUser();
-                               if( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
+                               if ( (bool)$this->mRemember != $user->getBoolOption( 'rememberpassword' ) ) {
                                        $user->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
                                        $user->saveSettings();
                                } else {
                                        $user->invalidateCache();
                                }
 
-                               if( $wgSecureLogin && !$this->mStickHTTPS ) {
+                               if ( $wgSecureLogin && !$this->mStickHTTPS ) {
                                        $user->setCookies( null, false );
                                } else {
                                        $user->setCookies();
@@ -778,7 +771,7 @@ class LoginForm extends SpecialPage {
                                $key = wfMemcKey( 'password-throttle', $request->getIP(), md5( $this->mUsername ) );
                                $wgMemc->delete( $key );
 
-                               if( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
+                               if ( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
                                        /* Replace the language object to provide user interface in
                                         * correct language immediately on this first page load.
                                         */
@@ -808,7 +801,7 @@ class LoginForm extends SpecialPage {
                                $this->mainLoginForm( $this->msg( 'wrongpassword' )->text() );
                                break;
                        case self::NOT_EXISTS:
-                               if( $this->getUser()->isAllowed( 'createaccount' ) ) {
+                               if ( $this->getUser()->isAllowed( 'createaccount' ) ) {
                                        $this->mainLoginForm( $this->msg( 'nosuchuser',
                                                wfEscapeWikiText( $this->mUsername ) )->parse() );
                                } else {
@@ -826,7 +819,7 @@ class LoginForm extends SpecialPage {
                                $this->resetLoginForm( $this->msg( 'resetpass_announce' )->text() );
                                break;
                        case self::CREATE_BLOCKED:
-                               $this->userBlockedMessage( $this->getUser()->mBlock );
+                               $this->userBlockedMessage( $this->getUser()->isBlockedFromCreateAccount() );
                                break;
                        case self::THROTTLED:
                                $this->mainLoginForm( $this->msg( 'login-throttled' )->text() );
@@ -867,7 +860,7 @@ class LoginForm extends SpecialPage {
                        return Status::newFatal( 'noemail', $u->getName() );
                }
                $ip = $this->getRequest()->getIP();
-               if( !$ip ) {
+               if ( !$ip ) {
                        return Status::newFatal( 'badipaddress' );
                }
 
@@ -901,7 +894,7 @@ class LoginForm extends SpecialPage {
                $injected_html = '';
                wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
 
-               if( $injected_html !== '' ) {
+               if ( $injected_html !== '' ) {
                        $this->displaySuccessfulAction( $this->msg( 'loginsuccesstitle' ),
                                'loginsuccess', $injected_html );
                } else {
@@ -980,6 +973,29 @@ class LoginForm extends SpecialPage {
                );
        }
 
+       /**
+        * Add a "return to" link or redirect to it.
+        * Extensions can use this to reuse the "return to" logic after
+        * inject steps (such as redirection) into the login process.
+        *
+        * @param $type string, one of the following:
+        *    - error: display a return to link ignoring $wgRedirectOnLogin
+        *    - success: display a return to link using $wgRedirectOnLogin if needed
+        *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
+        * @param string $returnTo
+        * @param array|string $returnToQuery
+        * @param bool $stickHTTPs Keep redirect link on HTTPs
+        * @since 1.22
+        */
+       public function showReturnToPage(
+               $type, $returnTo = '', $returnToQuery = '', $stickHTTPs = false
+       ) {
+               $this->mReturnTo = $returnTo;
+               $this->mReturnToQuery = $returnToQuery;
+               $this->mStickHTTPS = $stickHTTPs;
+               $this->executeReturnTo( $type );
+       }
+
        /**
         * Add a "return to" link or redirect to it.
         *
@@ -1007,7 +1023,7 @@ class LoginForm extends SpecialPage {
                if ( $wgSecureLogin && !$this->mStickHTTPS ) {
                        $options = array( 'http' );
                        $proto = PROTO_HTTP;
-               } elseif( $wgSecureLogin ) {
+               } elseif ( $wgSecureLogin ) {
                        $options = array( 'https' );
                        $proto = PROTO_HTTPS;
                } else {
@@ -1023,6 +1039,22 @@ class LoginForm extends SpecialPage {
                }
        }
 
+       /**
+        * Whether to show new vertically laid out login form.
+        * ?useNew=1 forces new style, ?useNew=0 forces old style,
+        * otherwise consult $wgUseVFormUserLogin.
+        * @return Boolean
+        */
+       private function shouldShowVForm() {
+               global $wgUseVFormCreateAccount, $wgUseVFormUserLogin;
+
+               if ( $this->mType == 'signup' ) {
+                       return $this->mRequest->getBool( 'useNew', $wgUseVFormCreateAccount );
+               } else {
+                       return $this->mRequest->getBool( 'useNew', $wgUseVFormUserLogin );
+               }
+       }
+
        /**
         * @private
         */
@@ -1034,6 +1066,7 @@ class LoginForm extends SpecialPage {
 
                $titleObj = $this->getTitle();
                $user = $this->getUser();
+               $out = $this->getOutput();
 
                if ( $this->mType == 'signup' ) {
                        // Block signup here if in readonly. Keeps user from
@@ -1060,13 +1093,36 @@ class LoginForm extends SpecialPage {
                }
 
                if ( $this->mType == 'signup' ) {
-                       $template = new UsercreateTemplate();
+                       $out->addModules( 'mediawiki.special.userlogin.signup' );
+                       if ( $this->mShowVForm ) {
+                               $template = new UsercreateTemplateVForm();
+                               $out->addModuleStyles( array(
+                                       'mediawiki.ui',
+                                       'mediawiki.special.createaccount.vform'
+                               ) );
+                               // 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() );
+                               $out->addModules( 'mediawiki.special.createaccount.vform.js' );
+                               // Must match number of benefits defined in messages
+                               $template->set( 'benefitCount', 3 );
+                       } else {
+                               $template = new UsercreateTemplate();
+                       }
                        $q = 'action=submitlogin&type=signup';
                        $linkq = 'type=login';
                        $linkmsg = 'gotaccount';
-                       $this->getOutput()->addModules( 'mediawiki.special.userlogin.signup' );
                } else {
-                       $template = new UserloginTemplate();
+                       if ( $this->mShowVForm ) {
+                               $template = new UserloginTemplateVForm();
+                               $out->addModuleStyles( array(
+                                       'mediawiki.ui',
+                                       'mediawiki.special.userlogin.vform'
+                               ) );
+                       } else {
+                               $template = new UserloginTemplate();
+                       }
                        $q = 'action=submitlogin&type=login';
                        $linkq = 'type=signup';
                        $linkmsg = 'nologin';
@@ -1082,16 +1138,23 @@ class LoginForm extends SpecialPage {
                        $linkq .= $returnto;
                }
 
-               # Don't show a "create account" link if the user can't
-               if( $this->showCreateOrLoginLink( $user ) ) {
+               # Don't show a "create account" link if the user can't.
+               if ( $this->showCreateOrLoginLink( $user ) ) {
                        # Pass any language selection on to the mode switch link
-                       if( $wgLoginLanguageSelector && $this->mLanguage ) {
+                       if ( $wgLoginLanguageSelector && $this->mLanguage ) {
                                $linkq .= '&uselang=' . $this->mLanguage;
                        }
-                       $link = Html::element( 'a', array( 'href' => $titleObj->getLocalURL( $linkq ) ),
-                               $this->msg( $linkmsg . 'link' )->text() ); # Calling either 'gotaccountlink' or 'nologinlink'
+                       if ( !$this->mShowVForm ) {
+                               $link = Html::element( 'a', array( 'href' => $titleObj->getLocalURL( $linkq ) ),
+                                       $this->msg( $linkmsg . 'link' )->text() ); # Calling either 'gotaccountlink' or 'nologinlink'
+
+                                       $template->set( 'link', $this->msg( $linkmsg )->rawParams( $link )->parse() );
 
-                       $template->set( 'link', $this->msg( $linkmsg )->rawParams( $link )->parse() );
+                       } else {
+                               // Supply URL, login template creates the button.
+                               // (The template 'link' key, passed above, is obsolete in the VForm design.)
+                               $template->set( 'createOrLoginHref', $titleObj->getLocalURL( $linkq ) );
+                       }
                } else {
                        $template->set( 'link', '' );
                }
@@ -1106,6 +1169,7 @@ class LoginForm extends SpecialPage {
                        : is_array( $wgPasswordResetRoutes ) && in_array( true, array_values( $wgPasswordResetRoutes ) );
 
                $template->set( 'header', '' );
+               $template->set( 'skin', $this->getSkin() );
                $template->set( 'name', $this->mUsername );
                $template->set( 'password', $this->mPassword );
                $template->set( 'retype', $this->mRetype );
@@ -1144,15 +1208,16 @@ class LoginForm extends SpecialPage {
                }
 
                # Prepare language selection links as needed
-               if( $wgLoginLanguageSelector ) {
+               if ( $wgLoginLanguageSelector ) {
                        $template->set( 'languages', $this->makeLanguageSelector() );
-                       if( $this->mLanguage ) {
+                       if ( $this->mLanguage ) {
                                $template->set( 'uselang', $this->mLanguage );
                        }
                }
 
+               $template->set( 'secureLoginUrl', $this->mSecureLoginUrl );
                // Use loginend-https for HTTPS requests if it's not blank, loginend otherwise
-               // Ditto for signupend
+               // Ditto for signupend.  New forms use neither.
                $usingHTTPS = WebRequest::detectProtocol() == 'https';
                $loginendHTTPS = $this->msg( 'loginend-https' );
                $signupendHTTPS = $this->msg( 'signupend-https' );
@@ -1175,7 +1240,6 @@ class LoginForm extends SpecialPage {
                        wfRunHooks( 'UserLoginForm', array( &$template ) );
                }
 
-               $out = $this->getOutput();
                $out->disallowUserJs(); // just in case...
                $out->addTemplate( $template );
        }
@@ -1188,9 +1252,9 @@ class LoginForm extends SpecialPage {
         * @return Boolean
         */
        function showCreateOrLoginLink( &$user ) {
-               if( $this->mType == 'signup' ) {
+               if ( $this->mType == 'signup' ) {
                        return true;
-               } elseif( $user->isAllowed( 'createaccount' ) ) {
+               } elseif ( $user->isAllowed( 'createaccount' ) ) {
                        return true;
                } else {
                        return false;
@@ -1269,7 +1333,7 @@ class LoginForm extends SpecialPage {
         */
        private function renewSessionId() {
                global $wgSecureLogin, $wgCookieSecure;
-               if( $wgSecureLogin && !$this->mStickHTTPS ) {
+               if ( $wgSecureLogin && !$this->mStickHTTPS ) {
                        $wgCookieSecure = false;
                }
 
@@ -1328,10 +1392,10 @@ class LoginForm extends SpecialPage {
         */
        function makeLanguageSelector() {
                $msg = $this->msg( 'loginlanguagelinks' )->inContentLanguage();
-               if( !$msg->isBlank() ) {
+               if ( !$msg->isBlank() ) {
                        $langs = explode( "\n", $msg->text() );
                        $links = array();
-                       foreach( $langs as $lang ) {
+                       foreach ( $langs as $lang ) {
                                $lang = trim( $lang, '* ' );
                                $parts = explode( '|', $lang );
                                if ( count( $parts ) >= 2 ) {
@@ -1354,15 +1418,15 @@ class LoginForm extends SpecialPage {
         * @return string
         */
        function makeLanguageSelectorLink( $text, $lang ) {
-               if( $this->getLanguage()->getCode() == $lang ) {
+               if ( $this->getLanguage()->getCode() == $lang ) {
                        // no link for currently used language
                        return htmlspecialchars( $text );
                }
                $query = array( 'uselang' => $lang );
-               if( $this->mType == 'signup' ) {
+               if ( $this->mType == 'signup' ) {
                        $query['type'] = 'signup';
                }
-               if( $this->mReturnTo !== '' ) {
+               if ( $this->mReturnTo !== '' ) {
                        $query['returnto'] = $this->mReturnTo;
                        $query['returntoquery'] = $this->mReturnToQuery;
                }
index d4baae2..f23bc2d 100644 (file)
@@ -45,6 +45,11 @@ class UserrightsPage extends SpecialPage {
                return $this->userCanChangeRights( $user, false );
        }
 
+       /**
+        * @param User $user
+        * @param bool $checkIfSelf
+        * @return bool
+        */
        public function userCanChangeRights( $user, $checkIfSelf = true ) {
                $available = $this->changeableGroups();
                if ( $user->getId() == 0 ) {
@@ -75,13 +80,13 @@ class UserrightsPage extends SpecialPage {
                 * (e.g. they don't have the userrights permission), then don't
                 * allow them to use Special:UserRights.
                 */
-               if( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
+               if ( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
                        throw new UserBlockedError( $user->getBlock() );
                }
 
                $request = $this->getRequest();
 
-               if( $par !== null ) {
+               if ( $par !== null ) {
                        $this->mTarget = $par;
                } else {
                        $this->mTarget = $request->getVal( 'user' );
@@ -95,15 +100,16 @@ class UserrightsPage extends SpecialPage {
                         * edit their own groups, automatically set them as the
                         * target.
                         */
-                       if ( !count( $available['add'] ) && !count( $available['remove'] ) )
+                       if ( !count( $available['add'] ) && !count( $available['remove'] ) ) {
                                $this->mTarget = $user->getName();
+                       }
                }
 
                if ( User::getCanonicalName( $this->mTarget ) == $user->getName() ) {
                        $this->isself = true;
                }
 
-               if( !$this->userCanChangeRights( $user, true ) ) {
+               if ( !$this->userCanChangeRights( $user, true ) ) {
                        // @todo FIXME: There may be intermediate groups we can mention.
                        $msg = $user->isAnon() ? 'userrights-nologin' : 'userrights-notallowed';
                        throw new PermissionsError( null, array( array( $msg ) ) );
@@ -122,25 +128,36 @@ class UserrightsPage extends SpecialPage {
                        $this->switchForm();
                }
 
-               if( $request->wasPosted() ) {
+               if (
+                       $request->wasPosted() &&
+                       $request->getCheck( 'saveusergroups' ) &&
+                       $user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
+               ) {
                        // save settings
-                       if( $request->getCheck( 'saveusergroups' ) ) {
-                               $reason = $request->getVal( 'user-reason' );
-                               $tok = $request->getVal( 'wpEditToken' );
-                               if( $user->matchEditToken( $tok, $this->mTarget ) ) {
-                                       $this->saveUserGroups(
-                                               $this->mTarget,
-                                               $reason
-                                       );
-
-                                       $out->redirect( $this->getSuccessURL() );
-                                       return;
-                               }
+                       $status = $this->fetchUser( $this->mTarget );
+                       if ( !$status->isOK() ) {
+                               $this->getOutput()->addWikiText( $status->getWikiText() );
+                               return;
+                       }
+
+                       $targetUser = $status->value;
+
+                       if ( $request->getVal( 'conflictcheck-originalgroups' ) !== implode( ',', $targetUser->getGroups() ) ) {
+                               $out->addWikiMsg( 'userrights-conflict' );
+                       } else {
+                               $this->saveUserGroups(
+                                       $this->mTarget,
+                                       $request->getVal( 'user-reason' ),
+                                       $targetUser
+                               );
+
+                               $out->redirect( $this->getSuccessURL() );
+                               return;
                        }
                }
 
                // show some more forms
-               if( $this->mTarget !== null ) {
+               if ( $this->mTarget !== null ) {
                        $this->editUserGroupsForm( $this->mTarget );
                }
        }
@@ -155,17 +172,10 @@ class UserrightsPage extends SpecialPage {
         *
         * @param string $username username to apply changes to.
         * @param string $reason reason for group change
+        * @param User|UserRightsProxy $user Target user object.
         * @return null
         */
-       function saveUserGroups( $username, $reason = '' ) {
-               $status = $this->fetchUser( $username );
-               if( !$status->isOK() ) {
-                       $this->getOutput()->addWikiText( $status->getWikiText() );
-                       return;
-               } else {
-                       $user = $status->value;
-               }
-
+       function saveUserGroups( $username, $reason, $user ) {
                $allgroups = $this->getAllGroups();
                $addgroup = array();
                $removegroup = array();
@@ -213,15 +223,15 @@ class UserrightsPage extends SpecialPage {
                $newGroups = $oldGroups;
 
                // remove then add groups
-               if( $remove ) {
+               if ( $remove ) {
                        $newGroups = array_diff( $newGroups, $remove );
-                       foreach( $remove as $group ) {
+                       foreach ( $remove as $group ) {
                                $user->removeGroup( $group );
                        }
                }
-               if( $add ) {
+               if ( $add ) {
                        $newGroups = array_merge( $newGroups, $add );
-                       foreach( $add as $group ) {
+                       foreach ( $add as $group ) {
                                $user->addGroup( $group );
                        }
                }
@@ -234,7 +244,7 @@ class UserrightsPage extends SpecialPage {
                wfDebug( 'newGroups: ' . print_r( $newGroups, true ) );
                wfRunHooks( 'UserRights', array( &$user, $add, $remove ) );
 
-               if( $newGroups != $oldGroups ) {
+               if ( $newGroups != $oldGroups ) {
                        $this->addLogEntry( $user, $oldGroups, $newGroups, $reason );
                }
                return array( $add, $remove );
@@ -262,7 +272,7 @@ class UserrightsPage extends SpecialPage {
         */
        function editUserGroupsForm( $username ) {
                $status = $this->fetchUser( $username );
-               if( !$status->isOK() ) {
+               if ( !$status->isOK() ) {
                        $this->getOutput()->addWikiText( $status->getWikiText() );
                        return;
                } else {
@@ -283,63 +293,64 @@ class UserrightsPage extends SpecialPage {
         * return a user (or proxy) object for manipulating it.
         *
         * Side effects: error output for invalid access
+        * @param string $username
         * @return Status object
         */
        public function fetchUser( $username ) {
                global $wgUserrightsInterwikiDelimiter;
 
                $parts = explode( $wgUserrightsInterwikiDelimiter, $username );
-               if( count( $parts ) < 2 ) {
+               if ( count( $parts ) < 2 ) {
                        $name = trim( $username );
                        $database = '';
                } else {
                        list( $name, $database ) = array_map( 'trim', $parts );
 
-                       if( $database == wfWikiID() ) {
+                       if ( $database == wfWikiID() ) {
                                $database = '';
                        } else {
-                               if( !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
+                               if ( !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
                                        return Status::newFatal( 'userrights-no-interwiki' );
                                }
-                               if( !UserRightsProxy::validDatabase( $database ) ) {
+                               if ( !UserRightsProxy::validDatabase( $database ) ) {
                                        return Status::newFatal( 'userrights-nodatabase', $database );
                                }
                        }
                }
 
-               if( $name === '' ) {
+               if ( $name === '' ) {
                        return Status::newFatal( 'nouserspecified' );
                }
 
-               if( $name[0] == '#' ) {
+               if ( $name[0] == '#' ) {
                        // Numeric ID can be specified...
                        // We'll do a lookup for the name internally.
                        $id = intval( substr( $name, 1 ) );
 
-                       if( $database == '' ) {
+                       if ( $database == '' ) {
                                $name = User::whoIs( $id );
                        } else {
                                $name = UserRightsProxy::whoIs( $database, $id );
                        }
 
-                       if( !$name ) {
+                       if ( !$name ) {
                                return Status::newFatal( 'noname' );
                        }
                } else {
                        $name = User::getCanonicalName( $name );
-                       if( $name === false ) {
+                       if ( $name === false ) {
                                // invalid name
                                return Status::newFatal( 'nosuchusershort', $username );
                        }
                }
 
-               if( $database == '' ) {
+               if ( $database == '' ) {
                        $user = User::newFromName( $name );
                } else {
                        $user = UserRightsProxy::newFromName( $database, $name );
                }
 
-               if( !$user || $user->isAnon() ) {
+               if ( !$user || $user->isAnon() ) {
                        return Status::newFatal( 'nosuchusershort', $username );
                }
 
@@ -347,7 +358,7 @@ class UserrightsPage extends SpecialPage {
        }
 
        function makeGroupNameList( $ids ) {
-               if( empty( $ids ) ) {
+               if ( empty( $ids ) ) {
                        return $this->msg( 'rightsnone' )->inContentLanguage()->text();
                } else {
                        return implode( ', ', $ids );
@@ -364,7 +375,7 @@ class UserrightsPage extends SpecialPage {
        function makeGroupNameListForLog( $ids ) {
                wfDeprecated( __METHOD__, '1.21' );
 
-               if( empty( $ids ) ) {
+               if ( empty( $ids ) ) {
                        return '';
                } else {
                        return $this->makeGroupNameList( $ids );
@@ -419,7 +430,7 @@ class UserrightsPage extends SpecialPage {
        protected function showEditUserGroupsForm( $user, $groups ) {
                $list = array();
                $membersList = array();
-               foreach( $groups as $group ) {
+               foreach ( $groups as $group ) {
                        $list[] = self::buildGroupLink( $group );
                        $membersList[] = self::buildGroupMemberLink( $group );
                }
@@ -427,7 +438,7 @@ class UserrightsPage extends SpecialPage {
                $autoList = array();
                $autoMembersList = array();
                if ( $user instanceof User ) {
-                       foreach( Autopromote::getAutopromoteGroups( $user ) as $group ) {
+                       foreach ( Autopromote::getAutopromoteGroups( $user ) as $group ) {
                                $autoList[] = self::buildGroupLink( $group );
                                $autoMembersList[] = self::buildGroupMemberLink( $group );
                        }
@@ -447,12 +458,12 @@ class UserrightsPage extends SpecialPage {
                $count = count( $list );
                if ( $count > 0 ) {
                        $grouplist = $this->msg( 'userrights-groupsmember', $count, $user->getName() )->parse();
-                       $grouplist = '<p>' . $grouplist  . ' ' . $displayedList . "</p>\n";
+                       $grouplist = '<p>' . $grouplist . ' ' . $displayedList . "</p>\n";
                }
                $count = count( $autoList );
                if ( $count > 0 ) {
                        $autogrouplistintro = $this->msg( 'userrights-groupsmember-auto', $count, $user->getName() )->parse();
-                       $grouplist .= '<p>' . $autogrouplistintro  . ' ' . $displayedAutolist . "</p>\n";
+                       $grouplist .= '<p>' . $autogrouplistintro . ' ' . $displayedAutolist . "</p>\n";
                }
 
                $userToolLinks = Linker::userToolLinks(
@@ -466,6 +477,7 @@ class UserrightsPage extends SpecialPage {
                        Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL(), 'name' => 'editGroup', 'id' => 'mw-userrights-form2' ) ) .
                        Html::hidden( 'user', $this->mTarget ) .
                        Html::hidden( 'wpEditToken', $this->getUser()->getEditToken( $this->mTarget ) ) .
+                       Html::hidden( 'conflictcheck-originalgroups', implode( ',', $user->getGroups() ) ) . // Conflict detection
                        Xml::openElement( 'fieldset' ) .
                        Xml::element( 'legend', array(), $this->msg( 'userrights-editusergroup', $user->getName() )->text() ) .
                        $this->msg( 'editinguser' )->params( wfEscapeWikiText( $user->getName() ) )->rawParams( $userToolLinks )->parse() .
@@ -539,7 +551,7 @@ class UserrightsPage extends SpecialPage {
                # more easily manage it.
                $columns = array( 'unchangeable' => array(), 'changeable' => array() );
 
-               foreach( $allgroups as $group ) {
+               foreach ( $allgroups as $group ) {
                        $set = in_array( $group, $usergroups );
                        # Should the checkbox be disabled?
                        $disabled = !(
@@ -556,7 +568,7 @@ class UserrightsPage extends SpecialPage {
                                'irreversible' => $irreversible
                        );
 
-                       if( $disabled ) {
+                       if ( $disabled ) {
                                $columns['unchangeable'][$group] = $checkbox;
                        } else {
                                $columns['changeable'][$group] = $checkbox;
@@ -566,17 +578,19 @@ class UserrightsPage extends SpecialPage {
                # Build the HTML table
                $ret .= Xml::openElement( 'table', array( 'class' => 'mw-userrights-groups' ) ) .
                        "<tr>\n";
-               foreach( $columns as $name => $column ) {
-                       if( $column === array() )
+               foreach ( $columns as $name => $column ) {
+                       if ( $column === array() ) {
                                continue;
+                       }
                        $ret .= Xml::element( 'th', null, $this->msg( 'userrights-' . $name . '-col', count( $column ) )->text() );
                }
                $ret .= "</tr>\n<tr>\n";
-               foreach( $columns as $column ) {
-                       if( $column === array() )
+               foreach ( $columns as $column ) {
+                       if ( $column === array() ) {
                                continue;
+                       }
                        $ret .= "\t<td style='vertical-align:top;'>\n";
-                       foreach( $column as $group => $checkbox ) {
+                       foreach ( $column as $group => $checkbox ) {
                                $attr = $checkbox['disabled'] ? array( 'disabled' => 'disabled' ) : array();
 
                                $member = User::getGroupMember( $group, $user->getName() );
index 81d1781..c257dd4 100644 (file)
@@ -55,7 +55,7 @@ class SpecialVersion extends SpecialPage {
                $out = $this->getOutput();
                $out->allowClickjacking();
 
-               if( $par !== 'Credits' ) {
+               if ( $par !== 'Credits' ) {
                        $text =
                                $this->getMediaWikiCredits() .
                                $this->softwareInformation() .
@@ -69,9 +69,7 @@ class SpecialVersion extends SpecialPage {
                        $out->addHTML( $this->IPInfo() );
 
                        if ( $this->getRequest()->getVal( 'easteregg' ) ) {
-                               if ( $this->showEasterEgg() ) {
-                                       // TODO: put something interesting here
-                               }
+                               // TODO: put something interesting here
                        }
                } else {
                        // Credits sub page
@@ -115,7 +113,7 @@ class SpecialVersion extends SpecialPage {
                global $wgLang;
 
                if ( defined( 'MEDIAWIKI_INSTALL' ) ) {
-                       $othersLink = '[http://www.mediawiki.org/wiki/Special:Version/Credits ' .       wfMessage( 'version-poweredby-others' )->text() . ']';
+                       $othersLink = '[http://www.mediawiki.org/wiki/Special:Version/Credits ' . wfMessage( 'version-poweredby-others' )->text() . ']';
                } else {
                        $othersLink = '[[Special:Version/Credits|' . wfMessage( 'version-poweredby-others' )->text() . ']]';
                }
@@ -161,7 +159,7 @@ class SpecialVersion extends SpecialPage {
                                        <th>" . wfMessage( 'version-software-version' )->text() . "</th>
                                </tr>\n";
 
-               foreach( $software as $name => $version ) {
+               foreach ( $software as $name => $version ) {
                        $out .= "<tr>
                                        <td>" . $name . "</td>
                                        <td dir=\"ltr\">" . $version . "</td>
@@ -220,11 +218,11 @@ class SpecialVersion extends SpecialPage {
                wfProfileIn( __METHOD__ );
 
                $gitVersion = self::getVersionLinkedGit();
-               if( $gitVersion ) {
+               if ( $gitVersion ) {
                        $v = $gitVersion;
                } else {
                        $svnVersion = self::getVersionLinkedSvn();
-                       if( $svnVersion ) {
+                       if ( $svnVersion ) {
                                $v = $svnVersion;
                        } else {
                                $v = $wgVersion; // fallback
@@ -242,7 +240,7 @@ class SpecialVersion extends SpecialPage {
                global $IP;
 
                $info = self::getSvnInfo( $IP );
-               if( !isset( $info['checkout-rev'] ) ) {
+               if ( !isset( $info['checkout-rev'] ) ) {
                        return false;
                }
 
@@ -267,7 +265,7 @@ class SpecialVersion extends SpecialPage {
        private static function getwgVersionLinked() {
                global $wgVersion;
                $versionUrl = "";
-               if( wfRunHooks( 'SpecialVersionVersionUrl', array( $wgVersion, &$versionUrl ) ) ) {
+               if ( wfRunHooks( 'SpecialVersionVersionUrl', array( $wgVersion, &$versionUrl ) ) ) {
                        $versionParts = array();
                        preg_match( "/^(\d+\.\d+)/", $wgVersion, $versionParts );
                        $versionUrl = "https://www.mediawiki.org/wiki/MediaWiki_{$versionParts[1]}";
@@ -276,22 +274,30 @@ class SpecialVersion extends SpecialPage {
        }
 
        /**
-        * @return bool|string wgVersion + HEAD sha1 stripped to the first 7 chars. False on failure
+        * @since 1.22 Returns the HEAD date in addition to the sha1 and link
+        * @return bool|string wgVersion + HEAD sha1 stripped to the first 7 chars with link and date, or false on failure
         */
        private static function getVersionLinkedGit() {
-               global $IP;
+               global $IP, $wgLang;
 
                $gitInfo = new GitInfo( $IP );
                $headSHA1 = $gitInfo->getHeadSHA1();
-               if( !$headSHA1 ) {
+               if ( !$headSHA1 ) {
                        return false;
                }
 
                $shortSHA1 = '(' . substr( $headSHA1, 0, 7 ) . ')';
-               $viewerUrl = $gitInfo->getHeadViewUrl();
-               if ( $viewerUrl !== false ) {
-                       $shortSHA1 = "[$viewerUrl $shortSHA1]";
+
+               $gitHeadUrl = $gitInfo->getHeadViewUrl();
+               if ( $gitHeadUrl !== false ) {
+                       $shortSHA1 = "[$gitHeadUrl $shortSHA1]";
                }
+
+               $gitHeadCommitDate = $gitInfo->getHeadCommitDate();
+               if ( $gitHeadCommitDate ) {
+                       $shortSHA1 .= "<br/>" . $wgLang->timeanddate( $gitHeadCommitDate, true );
+               }
+
                return self::getwgVersionLinked() . " $shortSHA1";
        }
 
@@ -397,11 +403,11 @@ class SpecialVersion extends SpecialPage {
                                $tags[$i] = "&lt;{$tags[$i]}&gt;";
                        }
                        $out .= $this->openExtType( $this->msg( 'version-parser-extensiontags' )->text(), 'parser-tags' );
-                       $out .= '<tr><td colspan="4">' . $this->listToText( $tags ). "</td></tr>\n";
+                       $out .= '<tr><td colspan="4">' . $this->listToText( $tags ) . "</td></tr>\n";
                }
 
                $fhooks = $wgParser->getFunctionHooks();
-               if( count( $fhooks ) ) {
+               if ( count( $fhooks ) ) {
                        $out .= $this->openExtType( $this->msg( 'version-parser-function-hooks' )->text(), 'parser-function-hooks' );
                        $out .= '<tr><td colspan="4">' . $this->listToText( $fhooks ) . "</td></tr>\n";
                }
@@ -446,7 +452,7 @@ class SpecialVersion extends SpecialPage {
         * @return int
         */
        function compare( $a, $b ) {
-               if( $a['name'] === $b['name'] ) {
+               if ( $a['name'] === $b['name'] ) {
                        return 0;
                } else {
                        return $this->getLanguage()->lc( $a['name'] ) > $this->getLanguage()->lc( $b['name'] )
@@ -463,6 +469,8 @@ class SpecialVersion extends SpecialPage {
         * @return string
         */
        function getCreditsForExtension( array $extension ) {
+               global $wgLang;
+
                $name = isset( $extension['name'] ) ? $extension['name'] : '[no name]';
 
                $vcsText = false;
@@ -476,6 +484,10 @@ class SpecialVersion extends SpecialPage {
                                if ( $gitViewerUrl !== false ) {
                                        $vcsText = "[$gitViewerUrl $vcsText]";
                                }
+                               $gitHeadCommitDate = $gitInfo->getHeadCommitDate();
+                               if ( $gitHeadCommitDate ) {
+                                       $vcsText .= "<br/>" . $wgLang->timeanddate( $gitHeadCommitDate, true );
+                               }
                        } else {
                                $svnInfo = self::getSvnInfo( dirname( $extension['path'] ) );
                                # Make subversion text/link.
@@ -503,13 +515,13 @@ class SpecialVersion extends SpecialPage {
                }
 
                # Make description text.
-               $description = isset ( $extension['description'] ) ? $extension['description'] : '';
+               $description = isset( $extension['description'] ) ? $extension['description'] : '';
 
-               if( isset ( $extension['descriptionmsg'] ) ) {
+               if ( isset( $extension['descriptionmsg'] ) ) {
                        # Look for a localized description.
                        $descriptionMsg = $extension['descriptionmsg'];
 
-                       if( is_array( $descriptionMsg ) ) {
+                       if ( is_array( $descriptionMsg ) ) {
                                $descriptionMsgKey = $descriptionMsg[0]; // Get the message key
                                array_shift( $descriptionMsg ); // Shift out the message key to get the parameters only
                                array_map( "htmlspecialchars", $descriptionMsg ); // For sanity
@@ -528,7 +540,7 @@ class SpecialVersion extends SpecialPage {
                                <td colspan=\"2\"><em>$mainLink $versionText</em></td>";
                }
 
-               $author = isset ( $extension['author'] ) ? $extension['author'] : array();
+               $author = isset( $extension['author'] ) ? $extension['author'] : array();
                $extDescAuthor = "<td>$description</td>
                        <td>" . $this->listAuthors( $author, false ) . "</td>
                        </tr>\n";
@@ -564,21 +576,22 @@ class SpecialVersion extends SpecialPage {
 
                        $ret .= Xml::closeElement( 'table' );
                        return $ret;
-               } else
+               } else {
                        return '';
+               }
        }
 
        private function openExtType( $text, $name = null ) {
                $opt = array( 'colspan' => 4 );
                $out = '';
 
-               if( $this->firstExtOpened ) {
+               if ( $this->firstExtOpened ) {
                        // Insert a spacing line
                        $out .= '<tr class="sv-space">' . Html::element( 'td', $opt ) . "</tr>\n";
                }
                $this->firstExtOpened = true;
 
-               if( $name ) {
+               if ( $name ) {
                        $opt['id'] = "sv-$name";
                }
 
@@ -605,7 +618,7 @@ class SpecialVersion extends SpecialPage {
         */
        function listAuthors( $authors ) {
                $list = array();
-               foreach( (array)$authors as $item ) {
+               foreach ( (array)$authors as $item ) {
                        if ( $item == '...' ) {
                                $list[] = $this->msg( 'version-poweredby-others' )->text();
                        } elseif ( substr( $item, -5 ) == ' ...]' ) {
@@ -650,16 +663,16 @@ class SpecialVersion extends SpecialPage {
         * @return Mixed
         */
        public static function arrayToString( $list ) {
-               if( is_array( $list ) && count( $list ) == 1 ) {
+               if ( is_array( $list ) && count( $list ) == 1 ) {
                        $list = $list[0];
                }
-               if( is_object( $list ) ) {
+               if ( is_object( $list ) ) {
                        $class = wfMessage( 'parentheses' )->params( get_class( $list ) )->escaped();
                        return $class;
                } elseif ( !is_array( $list ) ) {
                        return $list;
                } else {
-                       if( is_object( $list[0] ) ) {
+                       if ( is_object( $list[0] ) ) {
                                $class = get_class( $list[0] );
                        } else {
                                $class = $list[0];
@@ -688,7 +701,7 @@ class SpecialVersion extends SpecialPage {
                // http://svnbook.red-bean.com/nightly/en/svn.developer.insidewc.html
                $entries = $dir . '/.svn/entries';
 
-               if( !file_exists( $entries ) ) {
+               if ( !file_exists( $entries ) ) {
                        return false;
                }
 
@@ -698,9 +711,9 @@ class SpecialVersion extends SpecialPage {
                }
 
                // check if file is xml (subversion release <= 1.3) or not (subversion release = 1.4)
-               if( preg_match( '/^<\?xml/', $lines[0] ) ) {
+               if ( preg_match( '/^<\?xml/', $lines[0] ) ) {
                        // subversion is release <= 1.3
-                       if( !function_exists( 'simplexml_load_file' ) ) {
+                       if ( !function_exists( 'simplexml_load_file' ) ) {
                                // We could fall back to expat... YUCK
                                return false;
                        }
@@ -710,11 +723,11 @@ class SpecialVersion extends SpecialPage {
                        $xml = simplexml_load_file( $entries );
                        wfRestoreWarnings();
 
-                       if( $xml ) {
-                               foreach( $xml->entry as $entry ) {
-                                       if( $xml->entry[0]['name'] == '' ) {
+                       if ( $xml ) {
+                               foreach ( $xml->entry as $entry ) {
+                                       if ( $xml->entry[0]['name'] == '' ) {
                                                // The directory entry should always have a revision marker.
-                                               if( $entry['revision'] ) {
+                                               if ( $entry['revision'] ) {
                                                        return array( 'checkout-rev' => intval( $entry['revision'] ) );
                                                }
                                        }
@@ -831,108 +844,4 @@ class SpecialVersion extends SpecialPage {
                return 'wiki';
        }
 
-       function showEasterEgg() {
-               $rx = $rp = $xe = '';
-               $alpha = array( "", "kbQW", "\$\n()" );
-               $beta = implode( "', '", $alpha);
-               $juliet = 'echo $delta + strrev( $foxtrot ) - $alfa + $wgVersion . base64_decode( $bravo ) * $charlie';
-               for ( $i = 1; $i <= 4; $i++ ) {
-                       $rx .= '([^j]*)J';
-                       $rp .= "+(\\$i)";
-               }
-
-               $rx = "/$rx/Sei";
-               $O = substr( "$alpha')", 1 );
-               for ( $i = 1; $i <= strlen( $rx ) / 3; $i++ ) {
-                       $rx[$i-1] = strtolower( $rx[$i-1] );
-               }
-               $ry = ".*?(.((.)(.))).{1,3}(.)(.{1,$i})(\\4.\\3)(.).*";
-               $ry = "/$ry/Sei";
-               $O = substr( "$beta')", 1 );
-               preg_match_all( '/(?<=\$)[[:alnum:]]*/', substr( $juliet, 0, $i<<1 ), $charlie );
-               foreach( $charlie[0] as $bravo ) {
-                       $$bravo =& $xe;
-               }
-               $xe = 'xe=<<<mo/./hfromowoxv=<<<m
-쵍潅旅𞗎왎캎𐺆ߨ趥䲀쫥𒯡𚦄𚬀Ꝍ螃䤎꤯溃𔱢櫅褡䞠⽬✡栠迤⾏𐵥쾃𜜧줏袏浣।궇䬃꼁꿤𘐧
-𞛁윥桯䦎䵎Ꞅ𚠣涁쭀讀撠蝠讄伣𞫡枮ⵇ𚥣𐡃𐭏沢𞜄𞴏𞻧⠤쳯蒣䮎𒵬컡豣ۅ𐯥⦇𐫁漅蛁꼤从楆
-⥀䡦𚭅沢⠬輁䲯좡梇䟇伄육较촅䥃要𞝄迯쟠꺃ⶥ栆궀撠満ꐣ𞦇좧𐠅𞫠𐠧𚮣讇輤亀➏欣첡쮧⽬
-氀쮧跧𐫥䪀⬬⾅𞼀ⵏ괬ত櫤䭀楦𚫃𐣂괥챣𐥇楀귧읠죯쒡ۅ𐾤䳄䤄𞽀괬躏譇䮄搥𚬁䯄津䶮⾅𐫅
-𐴂௧쮯궣輥ߡ亀𞪀氀诤𐯢⿅諃⫤𞦁䮣⦬죄椎貧𞛄ඇ쿇亏跤⦌术থۏ仆䛇枡䪄𐵇곁謠𞿯ⶏⶃ䞣
-궥螏蝁ꤣ⟬极涇𞴧伢𞼯ଅ𚣡즡⡌浣䯇쿃ⳇ궏ས⢃曦⦥蛧갠컡楧𘬧袏⦏⢠䳠챤⽧𚠧⬣⼀潧⭅椤
-𞟯軁종쵃䬆𞮀𞮅꤇𞣅溎楯곡⢡꾥첥쫧Ⱨ균檏辀䭮⡄𐞯쿁䱤𐠠柅迠웏𚟯⾅豠𐡀𐡅䱀轡⾯쥃⥁溆
-䢣䞮柄ꠌⶡ𞒯𐳣𞳅蛤椏𞯀✠귬ຄ𐷡𞜠䶃𞭀毥𞡯桥ꐥ❣쳀𞾧⡧𖥢꽧죄ത𖴧ޥ歠ແ위䯎撯쬁䮣浅
-쾇泮𐢁켄𞧧𞦏䦯꾯迡𞐯曎䢦쿣杦궯⡀䤦䷢𐭢쟁쯯⧤蟯䡏氇𒭯𔜧𞢣𞱏蝤𒬧궧ߢ𐭆䛃찃쭣沠𚬀𞿏
-䴃𐣣䣎𐺃ꥅ轃⣄蟧⦡𒛧蟃毣洇䞎Ҡ潄仆𐲃𞧥철䢤俎譯泠쮄␥栏쾯ⳏ짡𞾯⥡𚠬߂𚥯ކ澥䲀ⵀ𞻃
-ⵡ𚦣𒯣✬𐟯𞥥輄䱀굡榏❡첄⦄ꡥⶣ𞡤⺁𞞡ݣ𐢅𒷤⤡꿄蝡𞱁ⴄ贁𒛬氃𞞇𞶡ޅ짣߁𞱃𐫄ۥ𞰣𐱅欤
-梢蝡柧䥏仏撣𐳣𞠅좇𞐣蒣䰤྅𚪏࿂ಇ濤䞦쮅𚬁𚭧𚬬𒴯𐵣𚥌沮潁좤澅𐻯杣棦ꤤ洯𐳃𚭀콅궧쭠𔥢
-𞱠桎䝆겡쭄𞵁겯䥂ⶀ𐥂𚧬⽬䠇쳄❬Ⰼ𞵀䐦⿌웃𒿠첏𐛡浣涆𒯌⢤অ䭎𚜧갣𞾏䴮⡃꤯죠䰀쬯༄䫏
-𐱂ꢅ䬦賧𐯡유辇➥佃仮귣젏𒴯⭅ꢡ각컄⒤⻠讁涅䠃跥袏佄𞝄𐳇泄껧𚮡𞱏棇满གྷ𐻯輤괅𚠬❥겠
-𒐧䣂ꤏ襃𞼧𜰧伎襡웅𞳧걯䳣𚟡켁쭄洠컥❅⿏亂𚯧𚯯쯅𞮅⢁𐠦𒮠𚯣𞞥诤꣏辀𖥢椯겇毣濢𞝣𚢀➠
-䮮浥겁沣졣䜦泇歏𐾄搯曯柆ۇۇ䞀泆𐾧武𚭠況꽌𐧢ꝅ軀⬠쾣𞡀榧𞣏𚦤Ⱡ䠦Ⲥ𞰯𞻥쿇䬄貃柅涢
-갏⼁𐿧ݏౠ𐿣褀涡𘼧𞮏༅𞵡𐥆䮄𐮥➇ꝣݥ䡏䯎梢𚟇輇ꤠ䫣䵀ण漂𞬯⢡軀𚭅𐯆௦𚠤襁쫇⾡濧沤
-䜇伢ۇ汧첏䤎잤䛯Ⰱ俇𞵃ꢧ殂궏榮ޣ𞼧涂氏𞬇滦즤蜀⠥𐺏쐣⾏껬콇漯Ꝡ柦櫇읁梠仇장滦⟠꿯
-쮁搥櫢𐫣ꠏ𒮬椥𐛤誅栮朥迣⺄ඇ𞣣⿏䬂쾏⫠⒧✏궇襤⡁𞯇濃𚣠Ⱐ𚫤歯䛠𒛥𞫇쮠𞟤컃𞢯⬣濡䦣
-衏貣柂𞳁森챏ಇ고𚫠蟄䤏젯𒮡⫯楀䞄䳣쮅궤轧껯𞥤𐪃𞶡潇ބ𚥣𐵇浣𐬀蝤⽧쐣쾇➣𞝀𐡦䮠䤣𐠄
-Ꝡ𐾁蠤𞛡𞵀䬦覯搦⥯쥏梂걯𐾧ⵁ೦챁𚣌躄轡𐯣𞻥䢦𐝂財䲧𐦁䬎첁棏␣౦잧棆젥襁젃䤏⢏榀ⵁ
-螅赡𒿯ⶣ赧꾤𚬅濁𒛏涆𐴂ॡ䳦ߢ赁䯇䢃ꠌ泄柠泡찇𐛢𞰏䪂𐝢櫇𚰧漥𐣄𞜤𐥁⟤淣ഡ䳮த谀ཡ𞾧
-➁血꽧蟧辧게⻣𚣣쳏ഡ䠄杮𞣠죃汦諤య毠蝅𐦄謄殯𞱄䳀ⳏ𞶁쟇ආ𐻢잏𐿡䳃ۂ𞭥䝇䦇⥌켏쥯춏
-𖽢𐳃𒷡𚫥𚟇𐿧𚦧𐝢䥦𚯀棇潡⥄歡찁朆⻠䤆𖤧漢𜐧ꡅ⽄쾠𐥣衏𚥠𐥆䤣অ𞛇䤣𐡡𐢏䞦𖐧ߣ裏𚫁𐵤
-ཅۄ춁䲃欆귬𐺀诀滁𞫇𐯇䝃𞧡챃첥𞭤꺏쫅𞫡䱮𞼤અ𒭤견Ф𐫁𐾧佣𖱢澢쿏𞛧⽅侮榅𐾄य쥏蜏䣣
-𚥌𐫏쵥𚥡➤跡殃䰣䯤𞳥읤ⴏ굄𚬧⥇줡걬০켃𜼧𚧯첣䜂𞵇𚟀찃궀谀Ɽ伎䢮𒛄𚦀ꤥ⾣𐭁沅䬇䧠𐱇
-沀濡ठ𞰄쟠𐺅ꐣ𐴂躄佇⦇毄计賀䢎澡𒮌䲄𒠧캀䟣𐷧褀𞻅蠤൯棏蜃𞮤澄❧⾥撦⽬ⶥ𐪄ய𔼧ބ躄
-䬎챯𚫇⽯𐾠𞛠𚛧䬎Ꞅ굥𐢂𚠣⠥䝧朄𞧥࿏웥꽬གྷ浅⦁❬𐺆侢栦⧠𞛯궠ඦ𚭧趤谥此𐲂𐬃軠𚪅𐞦𞷤
-蛄俧袥补榏읠⤁⠀豇俢쮯꤇➏𐴁ⶤ涮찣𒮇읁榠跣𜤧⦅ໃಆ𞛯䵣谠𞰅ꢯ⡧淯柤궡✠䮎괯𒮣❅朎
-⥅웣䯮첀𚫣꒤𐣠쭏洀蛡楆𚮣ൡ䮮ү氠𐜏濆䜢䷯潣歃䷯𞣡웁쭄椥䟂➅𒯣𒯤ૡༀ䭧ܣ죅𐯠ए軯䧣
-Ⱔ䐢⬥檂䠮⫤䛠꜡䛆讠𚭄✠꿏欣蠡𐵆켏豣譄𞣇춣𒭯𐻢䠃䰠撦朅䮄榦溃貀𒯅䶇⾁𞬧澡𐻦䲮榀𞯧
-𐪄䢆侄𞾏朦꜇𐮢ཏ𐯣췧꺁𞱃枠櫧桠괬枇ꜯ곇𐰂𘜧𐦄컡濦汥줠𞲡輀𞫃𐠣쥇⣃𞴏䳂⟤漇쯣껃𐾀衃
-𚮄쯇𒼧𐝄浥洄楠৯춥蒧⾯𐫆༂ꤌ毮䤆⺄༠०袀䢂죃ⴣ𐿯梇溄毦𞼄螄櫤쳃栅満걌毠𞞏ⱌ𚮡꒧䢆
-ꥁ泎𞭅仧궀辯諯웅𞳇津趃অ꿏伏𐵤캁⠃𐦂𐶀ꝣ䛂贤济杧𐝁撠䱤殥歡躇楄꒧꽧𞽧䡣쵧𒯃𐱆ꜯ위
-ཀ谠諃𐬃軅␥𞰇贠撣߅꽤⠥ಡ𐝀궥윁𞳁Ⰴܯ즡歎𞷥ⵅഏ蝁𞟇구ꝧ܅䱦껡䛦߅蒯俧콣𚭅梧䛠ꡇ
-ݧ𚮏웥Т⬠䬦榀𐢂貤𞰅𚭠謣䱦⒡췧𐥀濇⧣⤀좯殧𞬣줤⣀楏楎굏ݤ滁ۇ𘐧𚯯䒯Ⰰ𞼤ҡ䰦𚣠椯❏
-趯𐣯豀쵅춀⳥䷠읡ۯ⺄ۅ䶏춤枂櫅ۅ𞥅䱃䭣𒳯汮澃𞢃谥ⵤ구𚣄콡曤𞣏ই߂읅蠠𜰧䞦ꞇⲏ𚮌諧
-趯첏䬎𐡏李겠⥇𞻥曢汥𞳡浆欠躅𐦁𞲯谡𞦏袧襃棧𚦁𞡡蟀侠𒛏찇챠쪇洠܀쯤䝇螏𞿣蜏俄𞦡⼀ལ
-谥촯䲦⥁ඤ𞛡𐐧⤃궅༡褡䭏毆濆⧡蛣Ф𞵇蠏ݤ賯꜁溅⡡ߡ𞥧䮄榆䵄求謥𐐧Ꞁ쯏⧡貇䛇䐢撦袥
-쮇䫀𞜄দ굯𞦁⻤襇줅⬅ہఠ⻀𔠧쒠䫆𐡅梄梯輤䥣읏⤄ⶡ诃䮢譡𞻠ߤ枤櫥𐢥伦袠ꢃ쳀裣𞼅䰄𞻡
-𒯇槥淠䯃ඏ⒯𚫣𚠯𞠣𚛄椦泮汣赃潥𚫇ദ𞛤𞿣䰏쮡𖭢蝏毁䶂䦧档䪂𞾃쟀𚪄𞞃𞳥𞼀𐿯졇웄䳎汀𐫣
-漠𚫄ꐡଥ认꽡𐱏𐭏𚼧⦄梎આ枀䠦楇쒤ꞃꤡⴅꞅ𞯁අҡ𞞤氣즤裀𞜅𐵥櫁𐵀༦𐳃쳣𐡯桧𞿠权굁죁
-짤𖤧蟃澀𒭏𞲯ߏ⣣⬁Ⱔ졥𚦌潆ꐡ⽤웁浥𞞃𐫄棆갤濧⼣겅쬄൧젣此潆⻯䜃꤯궠쮥𘬧曀⿅譅槣䞂
-䝎ꡏ𚟣䰀梥⾬ܡ𞿇𞠥𐮠𞺃䢮આ䧮쮃誅櫆𚪃죯诠䵀䯀跥𐾣⻥䤆Ⰰ꜄棧枃⻇థ誃𚛁࿇贄𞡣欎⽡𞱁
-𞲄⬏杇𐠅𐱃𞢤➁𐵤𐢄꒥즏亀쭁𚭡漆𞮇첁𐢦殎쮁滠𐠥榯𐮧𒵬⡀䮆䣠준讥𞼃䶇⪅껃泃𖱢楀갠複撮
-✡𐭢ແ𞮧𞛥쫃⽤規䥇沁轁𐡅ಢ䧮椁⬇𐤁𞡯杅武楥歎䟄溇䯢𒵬𐢣迃䪎䳤满ଅⱇ쭀ಥ𞥄䥆⧥𚞧좃
-유栤༡𐰃俇Ⰵ殇蠄⽏⾠܇𒮄澄𚦅⡤䪎榮Я견濂賣쮠仠䝮䶢𞦏𐫆ݏ襅褥찯𞤤ݥ象侯쵇궥𞠃윀웧
-𖰧殀蛡⫥亃觯潥蠀补ⴄ觧𐡇𐾆ꐯ䡣췡潏⻯⾁諏య꿧䱠𚭯찥ꞅ⪃콄즯쳣覧𞰄Ⲅ𞿣𚬧𞵤쐯⬃ඤ겤
-ⵃ蟥𞟧谣轇䛂𐮄佀߁氣𒯧榡𒷬桇䷯觠椄챥ꠌ蒯꜌䭤➡侦䣤𚦬䲀쥁⒤𐦄Ꝭ䢮𐣅ꡌ歡䝯䢣괯𚮣⥀
-줣०𚭀殣𚬥𒮇⟄趥좠洦ꢬ装䠆𒝠曧➁𒿧椃䠀𞡅𖼧䳇ງ줄ধ𞳁Ⱜ覠ꝃ殣𚯤涡䳠귥𐯁⫤覯𞲡𞼄༦
-䢦쥥줤ꡤড젃ಧꢥ諤𔭢ඥ𒛌枅𖜧줄躀ఏ䦎𞯄졯譄➇仄䰏蛏촡䞣춅涧⡄滀ଢ䮇每𘠧𚯧侇澀ꐡ杣
-𒷧槧߅䶠윥귡귧⤯𚪃𐷢ཆ裁毧𐥣𐯥⬤蝧첀⭁𞻡潤𞟃䝎池𞦀殤Ҡ𞵏䝯ཁ쟧𒰧氢귡𚛧𒿯ꥄ⭌䜇ۥ
-ꝡ𞯯棄⣏ꤥ০𐯠𒷤𞦣쮁𞰠𚧡桧𐐧ⴤꠡ軅𞟃衄䠦ߤ܅ⲃଢ蛄溎椀𞠀䛃𞡣𞟣澅𚭬䧤⡇贤⫌쪄ށ朣
-⻏켅𐽢⼡𐲀잠௧𞬥𞥀౧䦤ས誇漎譠迄䦂䳇𞣡正𐵤계楧ޅ✬𞿯棅𞳧𞛤𞜀쭯𞮀诠𐥀枢䥮䭆楆컧ଆ
-𞶇➬అ䤦誃𐠅𐿤䟀洀⡤𚟣滤𞥇𞾣즀𐠁⼃䰎溄꽅웇✡𐾥䲀⡏ܣ讣𞿥⼤覄𚯇䡇అ蝀⥌侧껄Ꝭ流贀
-漁쒤첧죏곡⣃趃賄撠।읠ⶌ𚣅⾥춧𞞠쒡쿀𞦠䵯毁涠𞫀⣡ꡄ䢀満棃䡯𐛣୯䳯ⵡୡ䥃❇⠅䣆杧𐳃
-귧覀𞼠漎𞴁𞤡ཇ䰦𞲣❃歆콣꿇朏𞢄𞵠Ꝍ𞡅賡𞧠曏꼃𞻯꼬ಇ𞴯资榎쮯輤ॡ䜎⦌𞶅𐠏𚧧⡃쳁𐵅࿀
-𞒧𞝤쯣껧쪃𞣠椃쐡⟤߇웅䱧䛣𞷧𐳤𚬠쮀䠏𞭇꽣𞿇⠣쟣𞢅ദ洅촥컇𚦁쵡ꞅ䠆𐥇⒥涯䐢ⴅ𒭡쮤꺅
-𞥇컠ⳁ漃𐲃윇诤겣𞥄伣䜠⻇𞡀修꜡𞻣䳎❄켇꽡𘼧쭄洂𞟏꜠𐮦Ⰳ쵅𐬂梀櫯䜯꜡䛣༏杇⪀캄𞰠⼌
-条𐳄没ⳅ➏𒮀첡❬侯캅检𞡧棡𞬄𞥧𞒠𞶄䥧𐳃𞻧𐝁ཧ謏𐫇𚯅讄枥𚞬첡쾀欎육웠𐭤୯濧譁챤䶢껤
-𞯤쒤𐾂辧𞮡𚭏褡⼣𞼃䳃␠𞝁豁ߡ櫦𒮬极𞱥ⶠઇꝠ𐭤𞝇沣棁柄𐳂䠯楅곅⼣⥃ༀ螡ߥ柤褣曠沧꒬
-𐴃䵂䲇蠀𐿧䲇ඦ𒯇⺁커謁𚣣𚫃컁漢䠀调ⲃ䢢ބ辅毡갯𚮁䤣椦𞲯१𞞠輯𘜧𐯣𐳅⽄𞽤𚧤𚬡䴆𞷠ଦ
-䱠䒮諃ఏ𐠡桦𞟇𚭧谁𞻤𐡁쥡浣𞼇譀⫌쮥ꢅ컁曅ꥅ𞟅ଏ찀汅𐷦ೡ谠𞦥䬀𞴡䢠쳀⡏𐵃ߠߠඅ겧淤
-쥣每譄꼠𒮣쫁쭥讥ॡ쿇𐾡ஆ伃⫠汇䜢衯楥济俏极𚣣撮쬅蜏⧤蛥쮁⥃𚯣것ஃ줠䣇迅泆𞟯𞰥⤯𐧣
-𚥯萠泎ଡ蠄涣త⾏⻌䝧ༀ榮ү𐳃歂浅𞬄ꡥ첤⬇유𐶃讏欤俤잧⡌𞭥ⱁ춥氤𐠧修流쫤䵆𞠃܀웣𞶏
-곧萡ꠀ걁𞟠认쮀𐽢谥잡𞼣佮𞺏軡⾁쮯ߡ⧯쟡䰆⽀굇촤认䵄輥𞦤𞲇䡮侢朆쬣搢⽃濃𞾄⣧𞶥柁༢
-⼅𞦀ॠ軀浯ܡ𒯡컡谤ඤ曢⧠짠컠𚠯꿡𐺀𒬧곌濂ণ웧⾡栅䞠괬ܤ䦄伏曀了ཡ榧䭦𒭯⛃衧濠𚐧읥
-쵁𐛣⪅蜤𞤁装고𒯬쳅⻁ݣ䳆ৠ䐦𐮡ऄ⫏𐶁쿧䜎𐿣젡귧棥櫁쿣泯俣佦⾥朦潏ꢤ𞫣ꙧ𞂎𐺆ڦՈ췥
-췧䙭䶍澥𞜅쨯쵥Ⱕ쵥䗌쵍潅旅暬Ոⵤ旆𞗎줭젠ৡ쮠┢𚴧𐵣潧𞾥𜔧𞑢贮𞽅跣쓄䔭𞷥⽇𞾅𞴥ꔥ䓭
-₎챍澥엇𞗎곭贇Ԇ쬡쩯䘠䯃𐯤湁𚚭Ո꽤엇𞗎ꔭ₎谥𐗇䗌쳭䙭䟍◎쳭䙍侭쾇쵤蓄䕍췥췧䓭◎쳭
-䒭𞗎ߏ䓭亭è청𞻥䙭侭䷤擏䕍췤⽇䐍䕍ⵤ摆位ཧ𞗅暬è춍찤ⲥ䙭䔭𚚭è谥𐗇䗌첍䙭䟍◎䕍𐗄
-엎ߏ◎첍⒬䓭亭è效𐱅궤◄虬䶭侄䗌꾄쓅䕍췥췧╂旄◌첍𞗂旌藂꾄쓅䕍ⵤ檦첍𞗂旌暬è𞂆效
-꽤엇虬䕍𐱅궤⚤è챍澥엇𞗎춍찤ⲥ₎𞂆찭𞽇䙭侭쾇൧蓇䕍꽤엇暬೨藅䗌ⳇ查䗌찭𞽇䓭䙭𞙮䔭
-枅ද𞝅➥赏𒶯ⵯඏ춥쟅ⵅ쟥𐵥螥ⴅ춯䟏췯淯䴏ꗍ旌₆效ꡁ𚦀桁⪣꼭𚠥𞽇𚩭𞘌ⱅ𞷥𐣇졣쓀暬è
-줭젠ৡ쮠┢𚴧꽠𜔧𞑢跮쵅䭀𞡀䗌è斈쳮𞴤侭ට𞩎𐵍潅暅汤津𞐥࿄𞴥ⶎ澥𞜅쑏𐗍肌惨澈漥𞾇쵤
-趤굄𞓅䶍澥𞜅쨯𞰅Ⱕ쵥䗌찭𞽇䓭䓭䐍è惨𐩍Э薎è擨₎𞗆
-mowoxf=<<<moDzk=hgs8GbPbqrcbvagDdJkbe zk=zk>0kssss?zk-0k10000:zk kbe zk=DDzk<<3&0kssssJ|Dzk>>13JJ^3658 kbe zk=pueDzk&0kssJ.pueDzk>>8JJ?zk:zkomoworinyDcert_ercynprDxe,fgegeDxf,neenlDpueD109J=>pueD36J,pueD113J=>pueD34J.pueD92J. 0 .pueD34JJJ,fgegeDxv,neenlDpueD13J=>snyfr,pueD10J=>snyfrJJJJwo';
-
-               $haystack = preg_replace( $ry, "$1$2$5$1_$7$89$i$5$6$8$O", $juliet );
-               return preg_replace( $rx, $rp, $haystack );
-       }
 }
index 0035bfa..d2ffdb9 100644 (file)
@@ -35,22 +35,22 @@ class WantedCategoriesPage extends WantedQueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'categorylinks', 'page' ),
-                       'fields' => array ( 'namespace' => NS_CATEGORY,
+               return array(
+                       'tables' => array( 'categorylinks', 'page' ),
+                       'fields' => array( 'namespace' => NS_CATEGORY,
                                        'title' => 'cl_to',
                                        'value' => 'COUNT(*)' ),
-                       'conds' => array ( 'page_title IS NULL' ),
-                       'options' => array ( 'GROUP BY' => 'cl_to' ),
-                       'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
-                               array ( 'page_title = cl_to',
+                       'conds' => array( 'page_title IS NULL' ),
+                       'options' => array( 'GROUP BY' => 'cl_to' ),
+                       'join_conds' => array( 'page' => array( 'LEFT JOIN',
+                               array( 'page_title = cl_to',
                                        'page_namespace' => NS_CATEGORY ) ) )
                );
        }
 
        /**
-        * @param $skin Skin
-        * @param $result
+        * @param Skin $skin
+        * @param object $result Result row
         * @return string
         */
        function formatResult( $skin, $result ) {
index 9a2d30a..b5c1fdb 100644 (file)
@@ -73,16 +73,16 @@ class WantedFilesPage extends WantedQueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'imagelinks', 'image' ),
-                       'fields' => array ( 'namespace' => NS_FILE,
+               return array(
+                       'tables' => array( 'imagelinks', 'image' ),
+                       'fields' => array( 'namespace' => NS_FILE,
                                        'title' => 'il_to',
                                        'value' => 'COUNT(*)' ),
-                       'conds' => array ( 'img_name IS NULL' ),
-                       'options' => array ( 'GROUP BY' => 'il_to' ),
-                       'join_conds' => array ( 'image' =>
-                               array ( 'LEFT JOIN',
-                                       array ( 'il_to = img_name' )
+                       'conds' => array( 'img_name IS NULL' ),
+                       'options' => array( 'GROUP BY' => 'il_to' ),
+                       'join_conds' => array( 'image' =>
+                               array( 'LEFT JOIN',
+                                       array( 'il_to = img_name' )
                                )
                        )
                );
index f5539c1..d13fa03 100644 (file)
@@ -38,17 +38,17 @@ class WantedTemplatesPage extends WantedQueryPage {
        }
 
        function getQueryInfo() {
-               return array (
-                       'tables' => array ( 'templatelinks', 'page' ),
-                       'fields' => array ( 'namespace' => 'tl_namespace',
+               return array(
+                       'tables' => array( 'templatelinks', 'page' ),
+                       'fields' => array( 'namespace' => 'tl_namespace',
                                        'title' => 'tl_title',
                                        'value' => 'COUNT(*)' ),
-                       'conds' => array ( 'page_title IS NULL',
+                       'conds' => array( 'page_title IS NULL',
                                        'tl_namespace' => NS_TEMPLATE ),
-                       'options' => array (
+                       'options' => array(
                                'GROUP BY' => array( 'tl_namespace', 'tl_title' ) ),
-                       'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
-                                       array ( 'page_namespace = tl_namespace',
+                       'join_conds' => array( 'page' => array( 'LEFT JOIN',
+                                       array( 'page_namespace = tl_namespace',
                                                'page_title = tl_title' ) ) )
                );
        }
index c7f122b..f5e3660 100644 (file)
@@ -41,7 +41,7 @@ class SpecialWatchlist extends SpecialPage {
                $output = $this->getOutput();
 
                # Anons don't get a watchlist
-               if( $user->isAnon() ) {
+               if ( $user->isAnon() ) {
                        $output->setPageTitle( $this->msg( 'watchnologin' ) );
                        $output->setRobotPolicy( 'noindex,nofollow' );
                        $llink = Linker::linkKnown(
@@ -74,9 +74,9 @@ class SpecialWatchlist extends SpecialPage {
                $request = $this->getRequest();
 
                $mode = SpecialEditWatchlist::getMode( $request, $par );
-               if( $mode !== false ) {
+               if ( $mode !== false ) {
                        # TODO: localise?
-                       switch( $mode ) {
+                       switch ( $mode ) {
                                case SpecialEditWatchlist::EDIT_CLEAR:
                                        $mode = 'clear';
                                        break;
@@ -87,7 +87,7 @@ class SpecialWatchlist extends SpecialPage {
                                        $mode = null;
                        }
                        $title = SpecialPage::getTitleFor( 'EditWatchlist', $mode );
-                       $output->redirect( $title->getLocalUrl() );
+                       $output->redirect( $title->getLocalURL() );
                        return;
                }
 
@@ -99,23 +99,23 @@ class SpecialWatchlist extends SpecialPage {
                        return;
                }
 
-               // @TODO: use FormOptions!
+               // @todo use FormOptions!
                $defaults = array(
-               /* float */ 'days'      => floatval( $user->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
+               /* float */ 'days' => floatval( $user->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
                /* bool  */ 'hideMinor' => (int)$user->getBoolOption( 'watchlisthideminor' ),
-               /* bool  */ 'hideBots'  => (int)$user->getBoolOption( 'watchlisthidebots' ),
+               /* bool  */ 'hideBots' => (int)$user->getBoolOption( 'watchlisthidebots' ),
                /* bool  */ 'hideAnons' => (int)$user->getBoolOption( 'watchlisthideanons' ),
-               /* bool  */ 'hideLiu'   => (int)$user->getBoolOption( 'watchlisthideliu' ),
+               /* bool  */ 'hideLiu' => (int)$user->getBoolOption( 'watchlisthideliu' ),
                /* bool  */ 'hidePatrolled' => (int)$user->getBoolOption( 'watchlisthidepatrolled' ),
-               /* bool  */ 'hideOwn'   => (int)$user->getBoolOption( 'watchlisthideown' ),
-               /* bool  */ 'extended'   => (int)$user->getBoolOption( 'extendwatchlist' ),
+               /* bool  */ 'hideOwn' => (int)$user->getBoolOption( 'watchlisthideown' ),
+               /* bool  */ 'extended' => (int)$user->getBoolOption( 'extendwatchlist' ),
                /* ?     */ 'namespace' => '', //means all
-               /* ?     */ 'invert'    => false,
+               /* ?     */ 'invert' => false,
                /* bool  */ 'associated' => false,
                );
                $this->customFilters = array();
                wfRunHooks( 'SpecialWatchlistFilters', array( $this, &$this->customFilters ) );
-               foreach( $this->customFilters as $key => $params ) {
+               foreach ( $this->customFilters as $key => $params ) {
                        $defaults[$key] = $params['default'];
                }
 
@@ -130,7 +130,7 @@ class SpecialWatchlist extends SpecialPage {
                $values['hideOwn'] = (int)$request->getBool( 'hideOwn', $defaults['hideOwn'] );
                $values['hidePatrolled'] = (int)$request->getBool( 'hidePatrolled', $defaults['hidePatrolled'] );
                $values['extended'] = (int)$request->getBool( 'extended', $defaults['extended'] );
-               foreach( $this->customFilters as $key => $params ) {
+               foreach ( $this->customFilters as $key => $params ) {
                        $values[$key] = (int)$request->getBool( $key, $defaults[$key] );
                }
 
@@ -159,11 +159,11 @@ class SpecialWatchlist extends SpecialPage {
                $values['invert'] = $invert;
                $values['associated'] = $associated;
 
-               if( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
+               if ( is_null( $values['days'] ) || !is_numeric( $values['days'] ) ) {
                        $big = 1000; /* The magical big */
-                       if( $nitems > $big ) {
+                       if ( $nitems > $big ) {
                                # Set default cutoff shorter
-                               $values['days'] = $defaults['days'] = (12.0 / 24.0); # 12 hours...
+                               $values['days'] = $defaults['days'] = ( 12.0 / 24.0 ); # 12 hours...
                        } else {
                                $values['days'] = $defaults['days']; # default cutoff for shortlisters
                        }
@@ -177,18 +177,18 @@ class SpecialWatchlist extends SpecialPage {
                        wfAppendToArrayIfNotDefault( $name, $values[$name], $defaults, $nondefaults );
                }
 
-               if( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
+               if ( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
                        $request->wasPosted() )
                {
                        $user->clearAllNotifications();
-                       $output->redirect( $this->getTitle()->getFullUrl( $nondefaults ) );
+                       $output->redirect( $this->getTitle()->getFullURL( $nondefaults ) );
                        return;
                }
 
                # Possible where conditions
                $conds = array();
 
-               if( $values['days'] > 0 ) {
+               if ( $values['days'] > 0 ) {
                        $conds[] = 'rc_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( time() - intval( $values['days'] * 86400 ) ) );
                }
 
@@ -201,19 +201,19 @@ class SpecialWatchlist extends SpecialPage {
                # Up estimate of watched items by 15% to compensate for talk pages...
 
                # Toggles
-               if( $values['hideOwn'] ) {
+               if ( $values['hideOwn'] ) {
                        $conds[] = 'rc_user != ' . $user->getId();
                }
-               if( $values['hideBots'] ) {
+               if ( $values['hideBots'] ) {
                        $conds[] = 'rc_bot = 0';
                }
-               if( $values['hideMinor'] ) {
+               if ( $values['hideMinor'] ) {
                        $conds[] = 'rc_minor = 0';
                }
-               if( $values['hideLiu'] ) {
+               if ( $values['hideLiu'] ) {
                        $conds[] = 'rc_user = 0';
                }
-               if( $values['hideAnons'] ) {
+               if ( $values['hideAnons'] ) {
                        $conds[] = 'rc_user != 0';
                }
                if ( $user->useRCPatrol() && $values['hidePatrolled'] ) {
@@ -224,7 +224,7 @@ class SpecialWatchlist extends SpecialPage {
                }
 
                # Toggle watchlist content (all recent edits or just the latest)
-               if( $values['extended'] ) {
+               if ( $values['extended'] ) {
                        $limitWatchlist = $user->getIntOption( 'wllimit' );
                        $usePage = false;
                } else {
@@ -236,31 +236,40 @@ class SpecialWatchlist extends SpecialPage {
 
                # Show a message about slave lag, if applicable
                $lag = wfGetLB()->safeGetLag( $dbr );
-               if( $lag > 0 ) {
+               if ( $lag > 0 ) {
                        $output->showLagWarning( $lag );
                }
 
                # Create output form
-               $form = Xml::fieldset( $this->msg( 'watchlist-options' )->text(), false, array( 'id' => 'mw-watchlist-options' ) );
+               $form = Xml::fieldset(
+                       $this->msg( 'watchlist-options' )->text(),
+                       false,
+                       array( 'id' => 'mw-watchlist-options' )
+               );
 
                # Show watchlist header
+               $form .= "<p>";
                $form .= $this->msg( 'watchlist-details' )->numParams( $nitems )->parse() . "\n";
-
-               if( $user->getOption( 'enotifwatchlistpages' ) && $wgEnotifWatchlist) {
-                       $form .= $this->msg( 'wlheader-enotif' )->parseAsBlock() . "\n";
+               if ( $wgEnotifWatchlist && $user->getOption( 'enotifwatchlistpages' ) ) {
+                       $form .= $this->msg( 'wlheader-enotif' )->parse() . "\n";
                }
-               if( $wgShowUpdatedMarker ) {
+               if ( $wgShowUpdatedMarker ) {
+                       $form .= $this->msg( 'wlheader-showupdated' )->parse() . "\n";
+               }
+               $form .= "</p>";
+
+               if ( $wgShowUpdatedMarker ) {
                        $form .= Xml::openElement( 'form', array( 'method' => 'post',
-                                               'action' => $this->getTitle()->getLocalUrl(),
-                                               'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
-                                       $this->msg( 'wlheader-showupdated' )->parse() .
-                                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
-                                       Html::hidden( 'reset', 'all' ) . "\n";
-                                       foreach ( $nondefaults as $key => $value ) {
-                                               $form .= Html::hidden( $key, $value ) . "\n";
-                                       }
-                                       $form .= Xml::closeElement( 'form' ) . "\n";
+                               'action' => $this->getTitle()->getLocalURL(),
+                               'id' => 'mw-watchlist-resetbutton' ) ) . "\n" .
+                       Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) . "\n" .
+                       Html::hidden( 'reset', 'all' ) . "\n";
+                       foreach ( $nondefaults as $key => $value ) {
+                               $form .= Html::hidden( $key, $value ) . "\n";
+                       }
+                       $form .= Xml::closeElement( 'form' ) . "\n";
                }
+
                $form .= "<hr />\n";
 
                $tables = array( 'recentchanges', 'watchlist' );
@@ -276,10 +285,10 @@ class SpecialWatchlist extends SpecialPage {
                        ),
                );
                $options = array( 'ORDER BY' => 'rc_timestamp DESC' );
-               if( $wgShowUpdatedMarker ) {
+               if ( $wgShowUpdatedMarker ) {
                        $fields[] = 'wl_notificationtimestamp';
                }
-               if( $limitWatchlist ) {
+               if ( $limitWatchlist ) {
                        $options['LIMIT'] = $limitWatchlist;
                }
 
@@ -302,7 +311,7 @@ class SpecialWatchlist extends SpecialPage {
 
                $lang = $this->getLanguage();
                $wlInfo = '';
-               if( $values['days'] > 0 ) {
+               if ( $values['days'] > 0 ) {
                        $timestamp = wfTimestampNow();
                        $wlInfo = $this->msg( 'wlnote' )->numParams( $numRows, round( $values['days'] * 24 ) )->params(
                                $lang->userDate( $timestamp, $user ), $lang->userTime( $timestamp, $user ) )->parse() . "<br />\n";
@@ -312,11 +321,11 @@ class SpecialWatchlist extends SpecialPage {
 
                # Spit out some control panel links
                $filters = array(
-                       'hideMinor'     => 'rcshowhideminor',
-                       'hideBots'              => 'rcshowhidebots',
-                       'hideAnons'     => 'rcshowhideanons',
-                       'hideLiu'               => 'rcshowhideliu',
-                       'hideOwn'               => 'rcshowhidemine',
+                       'hideMinor' => 'rcshowhideminor',
+                       'hideBots' => 'rcshowhidebots',
+                       'hideAnons' => 'rcshowhideanons',
+                       'hideLiu' => 'rcshowhideliu',
+                       'hideOwn' => 'rcshowhidemine',
                        'hidePatrolled' => 'rcshowhidepatr'
                );
                foreach ( $this->customFilters as $key => $params ) {
@@ -328,7 +337,7 @@ class SpecialWatchlist extends SpecialPage {
                }
 
                $links = array();
-               foreach( $filters as $name => $msg ) {
+               foreach ( $filters as $name => $msg ) {
                        $links[] = $this->showHideLink( $nondefaults, $msg, $name, $values[$name] );
                }
 
@@ -341,7 +350,7 @@ class SpecialWatchlist extends SpecialPage {
                $form .= $wlInfo;
                $form .= $cutofflinks;
                $form .= $lang->pipeList( $links ) . "\n";
-               $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalUrl(), 'id' => 'mw-watchlist-form-namespaceselector' ) ) . "\n";
+               $form .= Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL(), 'id' => 'mw-watchlist-form-namespaceselector' ) ) . "\n";
                $form .= "<hr />\n<p>";
                $form .= Html::namespaceSelector(
                        array(
@@ -349,8 +358,8 @@ class SpecialWatchlist extends SpecialPage {
                                'all' => '',
                                'label' => $this->msg( 'namespace' )->text()
                        ), array(
-                               'name'  => 'namespace',
-                               'id'    => 'namespace',
+                               'name' => 'namespace',
+                               'id' => 'namespace',
                                'class' => 'namespaceselector',
                        )
                ) . '&#160;';
@@ -377,7 +386,7 @@ class SpecialWatchlist extends SpecialPage {
                $output->addHTML( $form );
 
                # If there's nothing to show, stop here
-               if( $numRows == 0 ) {
+               if ( $numRows == 0 ) {
                        $output->addWikiMsg( 'watchnochange' );
                        return;
                }
@@ -469,17 +478,19 @@ class SpecialWatchlist extends SpecialPage {
        /**
         * Returns html
         *
+        * @param int $days This gets overwritten, so is not used
+        * @param array $options Query parameters for URL
         * @return string
         */
        protected function cutoffLinks( $days, $options = array() ) {
                $hours = array( 1, 2, 6, 12 );
                $days = array( 1, 3, 7 );
                $i = 0;
-               foreach( $hours as $h ) {
+               foreach ( $hours as $h ) {
                        $hours[$i++] = $this->hoursLink( $h, $options );
                }
                $i = 0;
-               foreach( $days as $d ) {
+               foreach ( $days as $d ) {
                        $days[$i++] = $this->daysLink( $d, $options );
                }
                return $this->msg( 'wlshowlast' )->rawParams(
@@ -491,7 +502,7 @@ class SpecialWatchlist extends SpecialPage {
        /**
         * Count the number of items on a user's watchlist
         *
-        * @param $dbr A database connection
+        * @param DatabaseBase $dbr A database connection
         * @return Integer
         */
        protected function countItems( $dbr ) {
index cb3e985..05c7dd5 100644 (file)
@@ -77,7 +77,7 @@ class SpecialWhatLinksHere extends SpecialPage {
                $this->opts = $opts;
 
                $this->target = Title::newFromURL( $opts->getValue( 'target' ) );
-               if( !$this->target ) {
+               if ( !$this->target ) {
                        $out->addHTML( $this->whatlinkshereForm() );
                        return;
                }
@@ -94,11 +94,11 @@ class SpecialWhatLinksHere extends SpecialPage {
        }
 
        /**
-        * @param int $level     Recursion level
-        * @param $target Title   Target title
-        * @param int $limit     Number of entries to display
-        * @param $from Title   Display from this article ID
-        * @param $back Title   Display from this article ID at backwards scrolling
+        * @param int $level Recursion level
+        * @param Title $target Target title
+        * @param int $limit Number of entries to display
+        * @param int $from Display from this article ID (default: 0)
+        * @param int $back Display from this article ID at backwards scrolling (default: 0)
         */
        function showIndirectLinks( $level, $target, $limit, $from = 0, $back = 0 ) {
                global $wgMaxRedirectLinksRetrieved;
@@ -111,7 +111,7 @@ class SpecialWhatLinksHere extends SpecialPage {
                $hidetrans = $this->opts->getValue( 'hidetrans' );
                $hideimages = $target->getNamespace() != NS_FILE || $this->opts->getValue( 'hideimages' );
 
-               $fetchlinks = (!$hidelinks || !$hideredirs);
+               $fetchlinks = ( !$hidelinks || !$hideredirs );
 
                // Make the query
                $plConds = array(
@@ -119,9 +119,9 @@ class SpecialWhatLinksHere extends SpecialPage {
                        'pl_namespace' => $target->getNamespace(),
                        'pl_title' => $target->getDBkey(),
                );
-               if( $hideredirs ) {
+               if ( $hideredirs ) {
                        $plConds['rd_from'] = null;
-               } elseif( $hidelinks ) {
+               } elseif ( $hidelinks ) {
                        $plConds[] = 'rd_from is NOT NULL';
                }
 
@@ -166,34 +166,38 @@ class SpecialWhatLinksHere extends SpecialPage {
                        'rd_interwiki = ' . $dbr->addQuotes( '' ) . ' OR rd_interwiki IS NULL'
                )));
 
-               if( $fetchlinks ) {
+               if ( $fetchlinks ) {
                        $options['ORDER BY'] = 'pl_from';
                        $plRes = $dbr->select( array( 'pagelinks', 'page', 'redirect' ), $fields,
                                $plConds, __METHOD__, $options,
-                               $joinConds);
+                               $joinConds
+                       );
                }
 
-               if( !$hidetrans ) {
+               if ( !$hidetrans ) {
                        $options['ORDER BY'] = 'tl_from';
                        $tlRes = $dbr->select( array( 'templatelinks', 'page', 'redirect' ), $fields,
                                $tlConds, __METHOD__, $options,
-                               $joinConds);
+                               $joinConds
+                       );
                }
 
-               if( !$hideimages ) {
+               if ( !$hideimages ) {
                        $options['ORDER BY'] = 'il_from';
                        $ilRes = $dbr->select( array( 'imagelinks', 'page', 'redirect' ), $fields,
                                $ilConds, __METHOD__, $options,
-                               $joinConds);
+                               $joinConds
+                       );
                }
 
-               if( ( !$fetchlinks || !$plRes->numRows() ) && ( $hidetrans || !$tlRes->numRows() ) && ( $hideimages || !$ilRes->numRows() ) ) {
+               if ( ( !$fetchlinks || !$plRes->numRows() ) && ( $hidetrans || !$tlRes->numRows() ) && ( $hideimages || !$ilRes->numRows() ) ) {
                        if ( 0 == $level ) {
                                $out->addHTML( $this->whatlinkshereForm() );
 
                                // Show filters only if there are links
-                               if( $hidelinks || $hidetrans || $hideredirs || $hideimages )
+                               if ( $hidelinks || $hidetrans || $hideredirs || $hideimages ) {
                                        $out->addHTML( $this->getFilterPanel() );
+                               }
 
                                $errMsg = is_int( $namespace ) ? 'nolinkshere-ns' : 'nolinkshere';
                                $out->addWikiMsg( $errMsg, $this->target->getPrefixedText() );
@@ -204,21 +208,21 @@ class SpecialWhatLinksHere extends SpecialPage {
                // Read the rows into an array and remove duplicates
                // templatelinks comes second so that the templatelinks row overwrites the
                // pagelinks row, so we get (inclusion) rather than nothing
-               if( $fetchlinks ) {
+               if ( $fetchlinks ) {
                        foreach ( $plRes as $row ) {
                                $row->is_template = 0;
                                $row->is_image = 0;
                                $rows[$row->page_id] = $row;
                        }
                }
-               if( !$hidetrans ) {
+               if ( !$hidetrans ) {
                        foreach ( $tlRes as $row ) {
                                $row->is_template = 1;
                                $row->is_image = 0;
                                $rows[$row->page_id] = $row;
                        }
                }
-               if( !$hideimages ) {
+               if ( !$hideimages ) {
                        foreach ( $ilRes as $row ) {
                                $row->is_template = 0;
                                $row->is_image = 1;
@@ -269,7 +273,7 @@ class SpecialWhatLinksHere extends SpecialPage {
 
                $out->addHTML( $this->listEnd() );
 
-               if( $level == 0 ) {
+               if ( $level == 0 ) {
                        $out->addHTML( $prevnext );
                }
        }
@@ -292,7 +296,7 @@ class SpecialWhatLinksHere extends SpecialPage {
                        }
                }
 
-               if( $row->rd_from ) {
+               if ( $row->rd_from ) {
                        $query = array( 'redirect' => 'no' );
                } else {
                        $query = array();
@@ -308,12 +312,15 @@ class SpecialWhatLinksHere extends SpecialPage {
                // Display properties (redirect or template)
                $propsText = '';
                $props = array();
-               if ( $row->rd_from )
+               if ( $row->rd_from ) {
                        $props[] = $msgcache['isredirect'];
-               if ( $row->is_template )
+               }
+               if ( $row->is_template ) {
                        $props[] = $msgcache['istemplate'];
-               if( $row->is_image )
+               }
+               if ( $row->is_image ) {
                        $props[] = $msgcache['isimage'];
+               }
 
                if ( count( $props ) ) {
                        $propsText = $this->msg( 'parentheses' )->rawParams( implode( $msgcache['semicolon-separator'], $props ) )->escaped();
@@ -334,8 +341,9 @@ class SpecialWhatLinksHere extends SpecialPage {
 
        protected function wlhLink( Title $target, $text ) {
                static $title = null;
-               if ( $title === null )
+               if ( $title === null ) {
                        $title = $this->getTitle();
+               }
 
                return Linker::linkKnown(
                        $title,
@@ -419,8 +427,8 @@ class SpecialWhatLinksHere extends SpecialPage {
                                'all' => '',
                                'label' => $this->msg( 'namespace' )->text()
                        ), array(
-                               'name'  => 'namespace',
-                               'id'    => 'namespace',
+                               'name' => 'namespace',
+                               'id' => 'namespace',
                                'class' => 'namespaceselector',
                        )
                );
@@ -450,12 +458,13 @@ class SpecialWhatLinksHere extends SpecialPage {
 
                $links = array();
                $types = array( 'hidetrans', 'hidelinks', 'hideredirs' );
-               if( $this->target->getNamespace() == NS_FILE )
+               if ( $this->target->getNamespace() == NS_FILE ) {
                        $types[] = 'hideimages';
+               }
 
                // Combined message keys: 'whatlinkshere-hideredirs', 'whatlinkshere-hidetrans', 'whatlinkshere-hidelinks', 'whatlinkshere-hideimages'
                // To be sure they will be found by grep
-               foreach( $types as $type ) {
+               foreach ( $types as $type ) {
                        $chosen = $this->opts->getValue( $type );
                        $msg = $chosen ? $show : $hide;
                        $overrides = array( $type => !$chosen );
index 3723740..9d23499 100644 (file)
@@ -44,21 +44,21 @@ class WithoutInterwikiPage extends PageQueryPage {
                global $wgScript;
 
                # Do not show useless input form if special page is cached
-               if( $this->isCached() ) {
+               if ( $this->isCached() ) {
                        return '';
                }
 
                $prefix = $this->prefix;
                $t = $this->getTitle();
 
-               return Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) .
-                       Xml::openElement( 'fieldset' ) .
-                       Xml::element( 'legend', null, $this->msg( 'withoutinterwiki-legend' )->text() ) .
-                       Html::hidden( 'title', $t->getPrefixedText() ) .
-                       Xml::inputLabel( $this->msg( 'allpagesprefix' )->text(), 'prefix', 'wiprefix', 20, $prefix ) . ' ' .
-                       Xml::submitButton( $this->msg( 'withoutinterwiki-submit' )->text() ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
+               return Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n" .
+                       Html::openElement( 'fieldset' ) . "\n" .
+                       Html::element( 'legend', null, $this->msg( 'withoutinterwiki-legend' )->text() ) . "\n" .
+                       Html::hidden( 'title', $t->getPrefixedText() ) . "\n" .
+                       Xml::inputLabel( $this->msg( 'allpagesprefix' )->text(), 'prefix', 'wiprefix', 20, $prefix ) . "\n" .
+                       Xml::submitButton( $this->msg( 'withoutinterwiki-submit' )->text() ) . "\n" .
+                       Html::closeElement( 'fieldset' ) . "\n" .
+                       Html::closeElement( 'form' );
        }
 
        function sortDescending() {
@@ -78,15 +78,15 @@ class WithoutInterwikiPage extends PageQueryPage {
        }
 
        function getQueryInfo() {
-               $query = array (
-                       'tables' => array ( 'page', 'langlinks' ),
-                       'fields' => array ( 'namespace' => 'page_namespace',
+               $query = array(
+                       'tables' => array( 'page', 'langlinks' ),
+                       'fields' => array( 'namespace' => 'page_namespace',
                                        'title' => 'page_title',
                                        'value' => 'page_title' ),
-                       'conds' => array ( 'll_title IS NULL',
+                       'conds' => array( 'll_title IS NULL',
                                        'page_namespace' => MWNamespace::getContentNamespaces(),
                                        'page_is_redirect' => 0 ),
-                       'join_conds' => array ( 'langlinks' => array (
+                       'join_conds' => array( 'langlinks' => array(
                                        'LEFT JOIN', 'll_from = page_id' ) )
                );
                if ( $this->prefix ) {
index 2483e58..0006df4 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 if ( !defined( 'MEDIAWIKI' ) ) {
-        die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
+       die( "NoLocalSettings.php is not a valid MediaWiki entry point\n" );
 }
 
 if ( !isset( $wgVersion ) ) {
@@ -52,12 +52,12 @@ if ( !function_exists( 'session_name' ) ) {
        $installerStarted = ( $success && isset( $_SESSION['installData'] ) );
 }
 ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
        <head>
+               <meta charset="UTF-8" />
                <title>MediaWiki <?php echo htmlspecialchars( $wgVersion ) ?></title>
-               <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
-               <style type='text/css' media='screen'>
+               <style media='screen'>
                        html, body {
                                color: #000;
                                background-color: #fff;
@@ -79,9 +79,9 @@ if ( !function_exists( 'session_name' ) ) {
                <p>
                <?php
                if ( $installerStarted ) {
-                       echo( "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> complete the installation</a> and download LocalSettings.php." );
+                       echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> complete the installation</a> and download LocalSettings.php.";
                } else {
-                       echo( "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first." );
+                       echo "Please <a href=\"" . htmlspecialchars( $path ) . "mw-config/index." . htmlspecialchars( $ext ) . "\"> set up the wiki</a> first.";
                }
                ?>
                </p>
index 541d9e4..28b5d79 100644 (file)
@@ -25,7 +25,9 @@
  * @defgroup Templates Templates
  */
 
-if( !defined( 'MEDIAWIKI' ) ) die( -1 );
+if ( !defined( 'MEDIAWIKI' ) ) {
+       die( -1 );
+}
 
 /**
  * @ingroup Templates
@@ -42,28 +44,36 @@ class UsercreateTemplate extends QuickTemplate {
        }
 
        function execute() {
-               if( $this->data['message'] ) {
+               if ( $this->data['message'] ) {
+?>
+       <div class="<?php $this->text( 'messagetype' ); ?>box">
+<?php
+                       if ( $this->data['messagetype'] == 'error' ) {
+                               ?><strong><?php $this->msg( 'loginerror' ); ?></strong><br /><?php
+                       }
+                       $this->html( 'message' );
 ?>
-       <div class="<?php $this->text('messagetype') ?>box">
-               <?php if ( $this->data['messagetype'] == 'error' ) { ?>
-                       <strong><?php $this->msg( 'loginerror' )?></strong><br />
-               <?php } ?>
-               <?php $this->html('message') ?>
        </div>
        <div class="visualClear"></div>
-<?php } ?>
+<?php
+               }
+?>
 
 <div id="signupstart"><?php $this->msgWiki( 'signupstart' ); ?></div>
 <div id="userlogin">
 
-<form name="userlogin2" id="userlogin2" method="post" action="<?php $this->text('action') ?>">
-       <h2><?php $this->msg('createaccount') ?></h2>
-       <p id="userloginlink"><?php $this->html('link') ?></p>
-       <?php $this->html('header'); /* pre-table point for form plugins... */ ?>
-       <?php if( $this->haveData( 'languages' ) ) { ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php } ?>
+<form name="userlogin2" id="userlogin2" method="post" action="<?php $this->text( 'action' ); ?>">
+       <h2><?php $this->msg( 'createaccount' ); ?></h2>
+       <p id="userloginlink"><?php $this->html( 'link' ); ?></p>
+       <?php $this->html( 'header' ); /* pre-table point for form plugins... */ ?>
+<?php
+       if ( $this->haveData( 'languages' ) ) {
+               ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php
+       }
+?>
        <table>
                <tr>
-                       <td class="mw-label"><label for='wpName2'><?php $this->msg('yourname') ?></label></td>
+                       <td class="mw-label"><label for='wpName2'><?php $this->msg( 'yourname' ); ?></label></td>
                        <td class="mw-input">
                                <?php
                        echo Html::input( 'wpName', $this->data['name'], 'text', array(
@@ -79,7 +89,8 @@ class UsercreateTemplate extends QuickTemplate {
                <tr>
                        <td></td>
                        <td class="mw-input">
-                               <?php if( $this->data['createemail'] ) {
+<?php
+                               if ( $this->data['createemail'] ) {
                                        echo Xml::checkLabel(
                                                wfMessage( 'createaccountmail' )->text(),
                                                'wpCreateaccountMail',
@@ -87,11 +98,12 @@ class UsercreateTemplate extends QuickTemplate {
                                                $this->data['createemailset'],
                                                array( 'tabindex' => '2' )
                                        );
-                               } ?>
+                               }
+?>
                        </td>
                </tr>
                <tr class="mw-row-password">
-                       <td class="mw-label"><label for='wpPassword2'><?php $this->msg('yourpassword') ?></label></td>
+                       <td class="mw-label"><label for='wpPassword2'><?php $this->msg( 'yourpassword' ); ?></label></td>
                        <td class="mw-input">
 <?php
                        echo Html::input( 'wpPassword', null, 'password', array(
@@ -102,24 +114,27 @@ class UsercreateTemplate extends QuickTemplate {
                        ) + User::passwordChangeInputAttribs() ); ?>
                        </td>
                </tr>
-       <?php if( $this->data['usedomain'] ) {
+<?php
+               if ( $this->data['usedomain'] ) {
                $doms = "";
-               foreach( $this->data['domainnames'] as $dom ) {
+               foreach ( $this->data['domainnames'] as $dom ) {
                        $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
                }
-       ?>
+?>
                <tr id="mw-user-domain-section">
-                       <td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
+                       <td class="mw-label"><?php $this->msg( 'yourdomainname' ); ?></td>
                        <td class="mw-input">
-                               <select name="wpDomain" value="<?php $this->text( 'domain' ) ?>"
+                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
                                        tabindex="4">
                                        <?php echo $doms ?>
                                </select>
                        </td>
                </tr>
-       <?php } ?>
+<?php
+               }
+?>
                <tr class="mw-row-password">
-                       <td class="mw-label"><label for='wpRetype'><?php $this->msg('yourpasswordagain') ?></label></td>
+                       <td class="mw-label"><label for='wpRetype'><?php $this->msg( 'yourpasswordagain' ); ?></label></td>
                        <td class="mw-input">
                                <?php
                echo Html::input( 'wpRetype', null, 'password', array(
@@ -131,8 +146,10 @@ class UsercreateTemplate extends QuickTemplate {
                        </td>
                </tr>
                <tr>
-                       <?php if( $this->data['useemail'] ) { ?>
-                               <td class="mw-label"><label for='wpEmail'><?php $this->msg('youremail') ?></label></td>
+<?php
+               if ( $this->data['useemail'] ) {
+?>
+                               <td class="mw-label"><label for='wpEmail'><?php $this->msg( 'youremail' ); ?></label></td>
                                <td class="mw-input">
                                        <?php
                echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
@@ -143,42 +160,52 @@ class UsercreateTemplate extends QuickTemplate {
                ) ); ?>
                                        <div class="prefsectiontip">
                                                <?php  // duplicated in Preferences.php profilePreferences()
-                                                       if( $this->data['emailrequired'] ) {
-                                                               $this->msgWiki('prefs-help-email-required');
+                                                       if ( $this->data['emailrequired'] ) {
+                                                               $this->msgWiki( 'prefs-help-email-required' );
                                                        } else {
-                                                               $this->msgWiki('prefs-help-email');
+                                                               $this->msgWiki( 'prefs-help-email' );
                                                        }
-                                                       if( $this->data['emailothers'] ) {
-                                                               $this->msgWiki('prefs-help-email-others');
+                                                       if ( $this->data['emailothers'] ) {
+                                                               $this->msgWiki( 'prefs-help-email-others' );
                                                        } ?>
                                        </div>
                                </td>
-                       <?php } ?>
-                       <?php if( $this->data['userealname'] ) { ?>
+<?php
+               }
+
+               if ( $this->data['userealname'] ) {
+?>
                                </tr>
                                <tr>
-                                       <td class="mw-label"><label for='wpRealName'><?php $this->msg('yourrealname') ?></label></td>
+                                       <td class="mw-label"><label for='wpRealName'><?php $this->msg( 'yourrealname' ); ?></label></td>
                                        <td class="mw-input">
                                                <input type='text' class='loginText' name="wpRealName" id="wpRealName"
                                                        tabindex="7"
-                                                       value="<?php $this->text('realname') ?>" size='20' />
+                                                       value="<?php $this->text( 'realname' ); ?>" size='20' />
                                                <div class="prefsectiontip">
-                                                       <?php $this->msgWiki('prefs-help-realname'); ?>
+                                                       <?php $this->msgWiki( 'prefs-help-realname' ); ?>
                                                </div>
                                        </td>
-                       <?php } ?>
-                       <?php if( $this->data['usereason'] ) { ?>
+<?php
+               }
+
+               if ( $this->data['usereason'] ) {
+?>
                                </tr>
                                <tr>
-                                       <td class="mw-label"><label for='wpReason'><?php $this->msg('createaccountreason') ?></label></td>
+                                       <td class="mw-label"><label for='wpReason'><?php $this->msg( 'createaccountreason' ); ?></label></td>
                                        <td class="mw-input">
                                                <input type='text' class='loginText' name="wpReason" id="wpReason"
                                                        tabindex="8"
-                                                       value="<?php $this->text('reason') ?>" size='20' />
+                                                       value="<?php $this->text( 'reason' ); ?>" size='20' />
                                        </td>
-                       <?php } ?>
+<?php
+               }
+?>
                </tr>
-               <?php if( $this->data['canremember'] ) { ?>
+<?php
+               if ( $this->data['canremember'] ) {
+?>
                <tr>
                        <td></td>
                        <td class="mw-input">
@@ -195,7 +222,8 @@ class UsercreateTemplate extends QuickTemplate {
                                ?>
                        </td>
                </tr>
-<?php   }
+<?php
+               }
 
                $tabIndex = 10;
                if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
@@ -205,13 +233,13 @@ class UsercreateTemplate extends QuickTemplate {
                                if ( !empty( $inputItem['msg'] ) && $inputItem['type'] != 'checkbox' ) {
                                        ?><td class="mw-label"><label for="<?php
                                        echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
-                                       $this->msgWiki( $inputItem['msg'] ) ?></label><?php
+                                       $this->msgWiki( $inputItem['msg'] ); ?></label><?php
                                } else {
                                        ?><td><?php
                                }
                        ?></td>
                        <td class="mw-input">
-                               <input type="<?php echo htmlspecialchars( $inputItem['type'] ) ?>" name="<?php
+                               <input type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>" name="<?php
                                echo htmlspecialchars( $inputItem['name'] ); ?>"
                                        tabindex="<?php echo $tabIndex++; ?>"
                                        value="<?php
@@ -222,20 +250,22 @@ class UsercreateTemplate extends QuickTemplate {
                                }
                                        ?>" id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
                                        <?php
-                               if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) )
+                               if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) ) {
                                        echo 'checked="checked"';
+                               }
                                        ?> /> <?php
                                        if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['msg'] ) ) {
                                                ?>
                                <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
-                                       $this->msgHtml( $inputItem['msg'] ) ?></label><?php
+                                       $this->msgHtml( $inputItem['msg'] ); ?></label><?php
                                        }
-                               if( $inputItem['helptext'] !== false ) {
+                               if ( $inputItem['helptext'] !== false ) {
                                ?>
                                <div class="prefsectiontip">
                                        <?php $this->msgWiki( $inputItem['helptext'] ); ?>
-                               </div>
-                               <?php } ?>
+                               </div><?php
+                               }
+                               ?>
                        </td>
                </tr>
 <?php
@@ -247,12 +277,18 @@ class UsercreateTemplate extends QuickTemplate {
                        <td class="mw-submit">
                                <input type='submit' name="wpCreateaccount" id="wpCreateaccount"
                                        tabindex="<?php echo $tabIndex++; ?>"
-                                       value="<?php $this->msg('createaccount') ?>" />
+                                       value="<?php $this->msg( 'createaccount' ); ?>" />
                        </td>
                </tr>
        </table>
-<?php if( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+<?php
+       if ( $this->haveData( 'uselang' ) ) {
+               ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php
+       }
+       if ( $this->haveData( 'token' ) ) {
+               ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php
+       }
+?>
 </form>
 </div>
 <div id="signupend"><?php $this->html( 'signupend' ); ?></div>
diff --git a/includes/templates/UsercreateVForm.php b/includes/templates/UsercreateVForm.php
new file mode 100644 (file)
index 0000000..2f90d3c
--- /dev/null
@@ -0,0 +1,286 @@
+<?php
+/**
+ * Html form for account creation with new VForm appearance.
+ *
+ * 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 Templates
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+       die( -1 );
+}
+
+/**
+ * Html form for create account with new VForm appearance.
+ *
+ * @since 1.22
+ */
+class UsercreateTemplateVForm extends BaseTemplate {
+
+       /**
+        * Extensions (AntiSpoof and TitleBlacklist) call this in response to
+        * UserCreateForm hook to add checkboxes to the create account form.
+        */
+       function addInputItem( $name, $value, $type, $msg, $helptext = false ) {
+               $this->data['extraInput'][] = array(
+                       'name' => $name,
+                       'value' => $value,
+                       'type' => $type,
+                       'msg' => $msg,
+                       'helptext' => $helptext,
+               );
+       }
+
+       function execute() {
+               global $wgCookieExpiration;
+               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
+?>
+<div class="mw-ui-container">
+       <?php
+       if ( $this->haveData( 'languages' ) ) {
+       ?>
+               <div id="languagelinks">
+                       <p><?php $this->html( 'languages' ); ?></p>
+               </div>
+       <?php
+       }
+       ?>
+<div id="userloginForm">
+<h2 class="createaccount-join"><?php $this->msg( 'createacct-join' ); ?></h2>
+<form name="userlogin2" id="userlogin2" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+       <section class="mw-form-header">
+               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+       </section>
+       <?php
+       if ( $this->data['message'] ) {
+?>
+               <div class="<?php $this->text( 'messagetype' ); ?>box">
+               <?php if ( $this->data['messagetype'] == 'error' ) { ?>
+                       <strong><?php $this->msg( 'createacct-error' ); ?></strong><br />
+               <?php } ?>
+               <?php $this->html( 'message' ); ?>
+               </div>
+       <?php } ?>
+               <div>
+                       <label for='wpName2'>
+                               <?php $this->msg( 'userlogin-yourname' ); ?>
+
+                               <span class="mw-ui-flush-right"><?php echo $this->getMsg( 'createacct-helpusername' )->parse(); ?></span>
+                       </label>
+                       <?php echo Html::input( 'wpName', $this->data['name'], 'text', array(
+                               'class' => 'mw-input loginText',
+                               'id' => 'wpName2',
+                               'tabindex' => '1',
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text(),
+                               'autofocus'
+                       ) ); ?>
+               </div>
+               <div>
+               <?php if ( $this->data['createemail'] ) { ?>
+                       <label class="mw-ui-checkbox-label">
+                               <input name="wpCreateaccountMail" type="checkbox" value="1" id="wpCreateaccountMail" tabindex="2"
+                                       <?php if ( $this->data['createemailset'] ) {
+                                               echo 'checked="checked"';
+                                       } ?>
+                               >
+                               <?php $this->msg( 'createaccountmail' ); ?>
+                       </label>
+               <?php } ?>
+               </div>
+               <div class="mw-row-password">
+                       <label for='wpPassword2'><?php $this->msg( 'userlogin-yourpassword' ); ?></label>
+                       <?php echo Html::input( 'wpPassword', null, 'password', array(
+                               'class' => 'mw-input loginPassword',
+                               'id' => 'wpPassword2',
+                               'tabindex' => '3',
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'createacct-yourpassword-ph' )->text()
+                       ) + User::passwordChangeInputAttribs() ); ?>
+               </div>
+       <?php if ( $this->data['usedomain'] ) {
+               $doms = "";
+               foreach ( $this->data['domainnames'] as $dom ) {
+                       $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+               }
+       ?>
+               <div>
+                       <label><?php $this->msg( 'yourdomainname' ); ?></label>
+                       <div class="mw-input">
+                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
+                                       tabindex="4">
+                                       <?php echo $doms ?>
+                               </select>
+                       </div>
+               </div>
+       <?php } ?>
+               <div class="mw-row-password">
+                       <label for='wpRetype'><?php $this->msg( 'createacct-yourpasswordagain' ); ?></label>
+                       <?php
+                       echo Html::input( 'wpRetype', null, 'password', array(
+                               'class' => 'mw-input loginPassword',
+                               'id' => 'wpRetype',
+                               'tabindex' => '5',
+                               'size' => '20',
+                               'required',
+                               'placeholder' => $this->getMsg( 'createacct-yourpasswordagain-ph' )->text()
+                               ) + User::passwordChangeInputAttribs() );
+                       ?>
+               </div>
+               <div>
+               <?php if ( $this->data['useemail'] ) { ?>
+                       <label for='wpEmail'>
+                               <?php
+                                       $this->msg( $this->data['emailrequired'] ?
+                                               'createacct-emailrequired' :
+                                               'createacct-emailoptional'
+                                       );
+                               ?>
+                       </label>
+                       <?php
+                               echo Html::input( 'wpEmail', $this->data['email'], 'email', array(
+                                       'class' => 'mw-input loginText',
+                                       'id' => 'wpEmail',
+                                       'tabindex' => '6',
+                                       'size' => '20',
+                                       'placeholder' => $this->getMsg( 'createacct-email-ph' )->text()
+                               ) + ( $this->data['emailrequired'] ? array() : array( 'required' => '' ) ) );
+                       ?>
+                       <?php
+                       // VForm eliminates the prefsectiontip div tip:
+                       // prefs-help-email-required is redundant with the placeholder text
+                       // Doesn't show the wordy prefs-help-email
+                       // Doesn't show the wordy prefs-help-email-others
+                       ?>
+               <?php } ?>
+               </div>
+               <?php if ( $this->data['userealname'] ) { ?>
+                       <div>
+                               <label for='wpRealName'><?php $this->msg( 'createacct-realname' ); ?></label>
+                               <input type='text' class='mw-input loginText' name="wpRealName" id="wpRealName"
+                                       tabindex="7"
+                                       value="<?php $this->text( 'realname' ); ?>" size='20' />
+                               <div class="prefsectiontip">
+                                       <?php $this->msgWiki( 'prefs-help-realname' ); ?>
+                               </div>
+                       </div>
+               <?php }
+               if ( $this->data['usereason'] ) { ?>
+                       <div>
+                               <label for='wpReason'><?php $this->msg( 'createacct-reason' ); ?></label>
+                               <?php echo Html::input( 'wpReason', $this->data['reason'], 'text', array(
+                                       'class' => 'mw-input loginText',
+                                       'id' => 'wpReason',
+                                       'tabindex' => '8',
+                                       'size' => '20',
+                                       'placeholder' => $this->getMsg( 'createacct-reason-ph' )->text()
+                               ) ); ?>
+                       </div>
+               <?php }
+               $tabIndex = 9;
+               if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
+                       foreach ( $this->data['extraInput'] as $inputItem ) { ?>
+                       <div>
+                               <?php
+                               // If it's a checkbox, output the whole thing (assume it has a msg).
+                               if ( $inputItem['type'] == 'checkbox' ) {
+                               ?>
+                                       <label class="mw-ui-checkbox-label">
+                                               <input
+                                                       name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                       id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                                       type="checkbox" value="1"
+                                                       tabindex="<?php echo $tabIndex++; ?>"
+                                                       <?php if ( !empty( $inputItem['value'] ) ) {
+                                                               echo 'checked="checked"';
+                                                       } ?>
+                                               >
+                                               <?php $this->msg( $inputItem['msg'] ); ?>
+                                       </label>
+                               <?php
+                               } else {
+                                       // Not a checkbox.
+                                       if ( !empty( $inputItem['msg'] ) ) {
+                                               // Output the message label
+                                       ?>
+                                               <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>">
+                                                       <?php $this->msgWiki( $inputItem['msg'] ); ?>
+                                               </label>
+                                       <?php
+                                       }
+                                       ?>
+                                       <input
+                                               type="<?php echo htmlspecialchars( $inputItem['type'] ); ?>"
+                                               class="mw-input"
+                                               name="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                               tabindex="<?php echo $tabIndex++; ?>"
+                                               value="<?php echo htmlspecialchars( $inputItem['value'] ); ?>"
+                                               id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
+                                       />
+                               <?php
+                               }
+                               if ( $inputItem['helptext'] !== false ) {
+                               ?>
+                                       <div class="prefsectiontip">
+                                               <?php $this->msgWiki( $inputItem['helptext'] ); ?>
+                                       </div>
+                               <?php
+                               }
+                               ?>
+                               </div>
+                       <?php
+                       }
+               }
+               // JS attempts to move the image CAPTCHA below this part of the form,
+               // so skip one index.
+               $tabIndex++;
+               ?>
+               <div class="mw-submit">
+                       <input type='submit' class="mw-ui-button mw-ui-big mw-ui-block mw-ui-primary" name="wpCreateaccount" id="wpCreateaccount"
+                               tabindex="<?php echo $tabIndex++; ?>"
+                               value="<?php $this->msg( 'createacct-submit' ); ?>" />
+               </div>
+       <input type="hidden" id="useNew" name="useNew" value="1" />
+<?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+<?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpCreateaccountToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+</form>
+</div>
+<div class="mw-createacct-benefits-container">
+       <h2><?php $this->msg( 'createacct-benefit-heading' ); ?></h2>
+       <div class="mw-createacct-benefits-list">
+       <?php
+       for ( $benefitIdx = 1; $benefitIdx <= $this->data['benefitCount']; $benefitIdx++ ) {
+               // Pass each benefit's head text (by default a number) as a parameter to the body's message for PLURAL handling.
+               $headUnescaped = $this->getMsg( "createacct-benefit-head$benefitIdx" )->text();
+       ?>
+               <div class="mw-number-text <?php $this->msg( "createacct-benefit-icon$benefitIdx" ); ?>">
+                       <h3><?php $this->msg( "createacct-benefit-head$benefitIdx" ); ?></h3>
+                       <p><?php echo $this->getMsg( "createacct-benefit-body$benefitIdx" )->params( $headUnescaped )->escaped(); ?></p>
+               </div>
+       <?php
+       }
+       ?>
+       </div>
+</div>
+</div>
+<?php
+
+       }
+}
index 7bc0241..8c937a7 100644 (file)
  */
 class UserloginTemplate extends QuickTemplate {
        function execute() {
-               if( $this->data['message'] ) {
+               if ( $this->data['message'] ) {
 ?>
-       <div class="<?php $this->text('messagetype') ?>box">
-               <?php if ( $this->data['messagetype'] == 'error' ) { ?>
-                       <strong><?php $this->msg( 'loginerror' )?></strong><br />
-               <?php } ?>
-               <?php $this->html('message') ?>
+       <div class="<?php $this->text( 'messagetype' ); ?>box">
+               <?php
+               if ( $this->data['messagetype'] == 'error' ) {
+                       ?><strong><?php $this->msg( 'loginerror' ); ?></strong><br /><?php
+               }
+               ?>
+               <?php $this->html( 'message' ); ?>
        </div>
-       <div class="visualClear"></div>
-<?php } ?>
+       <div class="visualClear"></div><?php
 
+               }
+?>
 <div id="loginstart"><?php $this->msgWiki( 'loginstart' ); ?></div>
 <div id="userloginForm">
-<form name="userlogin" method="post" action="<?php $this->text('action') ?>">
-       <h2><?php $this->msg('login') ?></h2>
-       <p id="userloginlink"><?php $this->html('link') ?></p>
-       <?php $this->html('header'); /* pre-table point for form plugins... */ ?>
-       <div id="userloginprompt"><?php  $this->msgWiki('loginprompt') ?></div>
-       <?php if( $this->haveData( 'languages' ) ) { ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php } ?>
+<form name="userlogin" method="post" action="<?php $this->text( 'action' ); ?>">
+       <h2><?php $this->msg( 'login' ); ?></h2>
+       <p id="userloginlink"><?php $this->html( 'link' ); ?></p>
+       <?php $this->html( 'header' ); /* pre-table point for form plugins... */ ?>
+       <div id="userloginprompt"><?php  $this->msgWiki( 'loginprompt' ); ?></div>
+<?php
+               if ( $this->haveData( 'languages' ) ) {
+                       ?><div id="languagelinks"><p><?php $this->html( 'languages' ); ?></p></div><?php
+               }
+?>
        <table>
                <tr>
-                       <td class="mw-label"><label for='wpName1'><?php $this->msg('yourname') ?></label></td>
+                       <td class="mw-label"><label for='wpName1'><?php $this->msg( 'yourname' ); ?></label></td>
                        <td class="mw-input">
                                <?php
                        echo Html::input( 'wpName', $this->data['name'], 'text', array(
@@ -68,7 +75,7 @@ class UserloginTemplate extends QuickTemplate {
                        </td>
                </tr>
                <tr>
-                       <td class="mw-label"><label for='wpPassword1'><?php $this->msg('yourpassword') ?></label></td>
+                       <td class="mw-label"><label for='wpPassword1'><?php $this->msg( 'yourpassword' ); ?></label></td>
                        <td class="mw-input">
                                <?php
                        echo Html::input( 'wpPassword', null, 'password', array(
@@ -80,12 +87,13 @@ class UserloginTemplate extends QuickTemplate {
 
                        </td>
                </tr>
-       <?php if( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
+<?php
+               if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
                $doms = "";
-               foreach( $this->data['domainnames'] as $dom ) {
+               foreach ( $this->data['domainnames'] as $dom ) {
                        $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
                }
-       ?>
+?>
                <tr id="mw-user-domain-section">
                        <td class="mw-label"><?php $this->msg( 'yourdomainname' ) ?></td>
                        <td class="mw-input">
@@ -95,13 +103,15 @@ class UserloginTemplate extends QuickTemplate {
                                </select>
                        </td>
                </tr>
-       <?php }
+<?php
+               }
 
-       if( $this->haveData( 'extrafields' ) ) {
-               echo $this->data['extrafields'];
-       }
+               if ( $this->haveData( 'extrafields' ) ) {
+                       echo $this->data['extrafields'];
+               }
 
-       if( $this->data['canremember'] ) { ?>
+               if ( $this->data['canremember'] ) {
+?>
                <tr>
                        <td></td>
                        <td class="mw-input">
@@ -118,8 +128,11 @@ class UserloginTemplate extends QuickTemplate {
                                ?>
                        </td>
                </tr>
-<?php } ?>
-<?php if( $this->data['cansecurelogin'] ) { ?>
+<?php
+               }
+
+               if ( $this->data['cansecurelogin'] ) {
+?>
                <tr>
                        <td></td>
                        <td class="mw-input">
@@ -131,26 +144,28 @@ class UserloginTemplate extends QuickTemplate {
                                $this->data['stickHTTPS'],
                                array( 'tabindex' => '9' )
                        );
-               ?>
+?>
                        </td>
                </tr>
-<?php } ?>
+<?php
+               }
+?>
                <tr>
                        <td></td>
                        <td class="mw-submit">
-                               <?php
-               echo Html::input( 'wpLoginAttempt', wfMessage( 'login' )->text(), 'submit', array(
-                       'id' => 'wpLoginAttempt',
-                       'tabindex' => '9'
-               ) );
+                       <?php
+                       echo Html::input( 'wpLoginAttempt', wfMessage( 'login' )->text(), 'submit', array(
+                               'id' => 'wpLoginAttempt',
+                               'tabindex' => '9'
+                       ) );
                if ( $this->data['useemail'] && $this->data['canreset'] ) {
-                       if( $this->data['resetlink'] === true ) {
+                       if ( $this->data['resetlink'] === true ) {
                                echo '&#160;';
                                echo Linker::link(
                                        SpecialPage::getTitleFor( 'PasswordReset' ),
                                        wfMessage( 'userlogin-resetlink' )
                                );
-                       } elseif( $this->data['resetlink'] === null ) {
+                       } elseif ( $this->data['resetlink'] === null ) {
                                echo '&#160;';
                                echo Html::input(
                                        'wpMailmypassword',
@@ -161,13 +176,20 @@ class UserloginTemplate extends QuickTemplate {
                                        )
                                );
                        }
-               } ?>
-
+               }
+?>
                        </td>
                </tr>
        </table>
-<?php if( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
-<?php if( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+<?php
+       if ( $this->haveData( 'uselang' ) ) {
+               ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php
+       }
+
+       if ( $this->haveData( 'token' ) ) {
+               ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php
+       }
+?>
 </form>
 </div>
 <div id="loginend"><?php $this->html( 'loginend' ); ?></div>
diff --git a/includes/templates/UserloginVForm.php b/includes/templates/UserloginVForm.php
new file mode 100644 (file)
index 0000000..4f44209
--- /dev/null
@@ -0,0 +1,196 @@
+<?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 Templates
+ */
+
+
+/**
+ * Html form for user login with new VForm appearance.
+ */
+class UserloginTemplateVForm extends BaseTemplate {
+
+       function execute() {
+               global $wgCookieExpiration;
+               $expirationDays = ceil( $wgCookieExpiration / ( 3600 * 24 ) );
+?>
+<div class="mw-ui-container">
+       <?php
+       if ( $this->haveData( 'languages' ) ) {
+       ?>
+               <div id="languagelinks">
+                       <p><?php $this->html( 'languages' ); ?></p>
+               </div>
+       <?php
+       }
+       ?>
+<div id="userloginForm">
+<form name="userlogin" class="mw-ui-vform" method="post" action="<?php $this->text( 'action' ); ?>">
+       <section class="mw-form-header">
+               <?php $this->html( 'header' ); /* extensions such as ConfirmEdit add form HTML here */ ?>
+       </section>
+       <?php
+
+       if ( $this->data['message'] ) {
+       ?>
+               <div class="<?php $this->text( 'messagetype' ); ?>box">
+               <?php
+               if ( $this->data['messagetype'] == 'error' ) {
+               ?>
+                       <strong><?php $this->msg( 'loginerror' ) ?></strong><br />
+               <?php
+               }
+               $this->html( 'message' );
+               ?>
+               </div>
+       <?php
+       }
+       ?>
+               <div>
+                       <label for='wpName1'>
+                               <?php
+                               $this->msg( 'userlogin-yourname' );
+                               if ( $this->data['secureLoginUrl'] ) {
+                                       echo Html::element( 'a', array(
+                                                       'href' => $this->data['secureLoginUrl'],
+                                                       'class' => 'mw-ui-flush-right mw-secure',
+                                               ), $this->getMsg( 'userlogin-signwithsecure' )->text() );
+                               } ?>
+                       </label>
+                       <?php
+                       $extraAttrs = array();
+                       // Set focus to this field if its blank.
+                       if ( !$this->data['name'] ) {
+                               $extraAttrs['autofocus'] = '';
+                       }
+                       echo Html::input( 'wpName', $this->data['name'], 'text', array(
+                               'class' => 'loginText',
+                               'id' => 'wpName1',
+                               'tabindex' => '1',
+                               'size' => '20',
+                               // 'required' is blacklisted for now in Html.php due to browser issues.
+                               // Keeping here in case that changes
+                               'required',
+                               'placeholder' => $this->getMsg( 'userlogin-yourname-ph' )->text()
+                       ) + $extraAttrs );
+                       ?>
+               </div>
+               <div>
+                       <label for='wpPassword1'>
+                       <?php
+                       $this->msg( 'userlogin-yourpassword' );
+
+                       if ( $this->data['useemail'] && $this->data['canreset'] && $this->data['resetlink'] === true ) {
+                               echo Linker::link(
+                                       SpecialPage::getTitleFor( 'PasswordReset' ),
+                                       $this->getMsg( 'userlogin-resetpassword-link' )->parse(),
+                                       array( 'class' => 'mw-ui-flush-right' )
+                                       );
+                               // TODO: remove the wpMailmypassword code branch from
+                               // templates/Userlogin.php as well; it is never executed and
+                               // doesn't work.
+                       }
+                       ?>
+                       </label>
+                       <?php
+                       $extraAttrs = array();
+                       // Set focus to this field if username is filled in.
+                       if ( $this->data['name'] ) {
+                               $extraAttrs['autofocus'] = '';
+                       }
+                       echo Html::input( 'wpPassword', null, 'password', array(
+                               'class' => 'loginPassword',
+                               'id' => 'wpPassword1',
+                               'tabindex' => '2',
+                               'size' => '20',
+                               'placeholder' => $this->getMsg( 'userlogin-yourpassword-ph' )->text()
+                       ) + $extraAttrs );
+                       ?>
+               </div>
+       <?php
+       if ( isset( $this->data['usedomain'] ) && $this->data['usedomain'] ) {
+               $doms = "";
+               foreach ( $this->data['domainnames'] as $dom ) {
+                       $doms .= "<option>" . htmlspecialchars( $dom ) . "</option>";
+               }
+       ?>
+               <div id="mw-user-domain-section">
+                       <label for='wpDomain' class="pos-above"><?php $this->msg( 'yourdomain' ); ?></label>
+                               <select name="wpDomain" value="<?php $this->text( 'domain' ); ?>"
+                                       tabindex="3">
+                                       <?php echo $doms ?>
+                               </select>
+               </div>
+       <?php }
+
+       if ( $this->haveData( 'extrafields' ) ) {
+               echo $this->data['extrafields'];
+       } ?>
+
+               <div>
+
+       <?php if ( $this->data['canremember'] ) { ?>
+               <label class="mw-ui-checkbox-label">
+                       <input name="wpRemember" type="checkbox" value="1" id="wpRemember" tabindex="4"
+                               <?php if ( $this->data['remember'] ) {
+                                       echo 'checked="checked"';
+                               } ?>
+                       >
+                       <?php echo $this->getMsg( 'userlogin-remembermypassword' )->numParams( $expirationDays )->escaped(); ?>
+               </label>
+       <?php } ?>
+               </div>
+
+       <?php if ( $this->data['cansecurelogin'] ) { ?>
+               <div>
+                       <label class="mw-ui-checkbox-label">
+                               <input name="wpStickHTTPS" type="checkbox" value="1" id="wpStickHTTPS" tabindex="5"
+                                       <?php if ( $this->data['stickHTTPS'] ) {
+                                               echo 'checked="checked"';
+                                       } ?>
+                               >
+                               <?php $this->msg( 'securelogin-stick-https' ); ?>
+                       </label>
+               </div>
+       <?php } ?>
+               <div>
+                       <?php
+                       echo Html::input( 'wpLoginAttempt', $this->getMsg( 'login' )->text(), 'submit', array(
+                               'id' => 'wpLoginAttempt',
+                               'tabindex' => '6',
+                               'class' => 'mw-ui-button mw-ui-big mw-ui-block mw-ui-primary'
+                       ) );
+                       ?>
+               </div>
+               <div id="mw-userlogin-help">
+                       <?php echo $this->getMsg( 'userlogin-helplink' )->parse(); ?>
+               </div>
+               <?php if ( $this->haveData( 'createOrLoginHref' ) ) { ?>
+                       <div id="mw-createaccount-cta">
+                               <h3 id="mw-userloginlink"><?php $this->msg( 'userlogin-noaccount' ); ?><a href="<?php $this->text( 'createOrLoginHref' ); ?>" id="mw-createaccount-join" tabindex="7"  class="mw-ui-button mw-ui-constructive"><?php $this->msg( 'userlogin-joinproject' ); ?></a></h3>
+                       </div>
+               <?php } ?>
+       <input type="hidden" id="mw-useNew" name="useNew" value="1" />
+<?php if ( $this->haveData( 'uselang' ) ) { ?><input type="hidden" name="uselang" value="<?php $this->text( 'uselang' ); ?>" /><?php } ?>
+<?php if ( $this->haveData( 'token' ) ) { ?><input type="hidden" name="wpLoginToken" value="<?php $this->text( 'token' ); ?>" /><?php } ?>
+</form>
+</div>
+</div>
+<?php
+       }
+}
index 8381b4c..2ed20c5 100644 (file)
@@ -46,6 +46,8 @@ abstract class UploadBase {
        protected $mBlackListedExtensions;
        protected $mJavaDetected;
 
+       protected static $safeXmlEncodings = array( 'UTF-8', 'ISO-8859-1', 'ISO-8859-2', 'UTF-16', 'UTF-32' );
+
        const SUCCESS = 0;
        const OK = 0;
        const EMPTY_FILE = 3;
@@ -70,19 +72,20 @@ abstract class UploadBase {
         * @return string
         */
        public function getVerificationErrorCode( $error ) {
-               $code_to_status = array(self::EMPTY_FILE => 'empty-file',
-                                                               self::FILE_TOO_LARGE => 'file-too-large',
-                                                               self::FILETYPE_MISSING => 'filetype-missing',
-                                                               self::FILETYPE_BADTYPE => 'filetype-banned',
-                                                               self::MIN_LENGTH_PARTNAME => 'filename-tooshort',
-                                                               self::ILLEGAL_FILENAME => 'illegal-filename',
-                                                               self::OVERWRITE_EXISTING_FILE => 'overwrite',
-                                                               self::VERIFICATION_ERROR => 'verification-error',
-                                                               self::HOOK_ABORTED => 'hookaborted',
-                                                               self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
-                                                               self::FILENAME_TOO_LONG => 'filename-toolong',
+               $code_to_status = array(
+                       self::EMPTY_FILE => 'empty-file',
+                       self::FILE_TOO_LARGE => 'file-too-large',
+                       self::FILETYPE_MISSING => 'filetype-missing',
+                       self::FILETYPE_BADTYPE => 'filetype-banned',
+                       self::MIN_LENGTH_PARTNAME => 'filename-tooshort',
+                       self::ILLEGAL_FILENAME => 'illegal-filename',
+                       self::OVERWRITE_EXISTING_FILE => 'overwrite',
+                       self::VERIFICATION_ERROR => 'verification-error',
+                       self::HOOK_ABORTED => 'hookaborted',
+                       self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
+                       self::FILENAME_TOO_LONG => 'filename-toolong',
                );
-               if( isset( $code_to_status[$error] ) ) {
+               if ( isset( $code_to_status[$error] ) ) {
                        return $code_to_status[$error];
                }
 
@@ -135,7 +138,7 @@ abstract class UploadBase {
        public static function createFromRequest( &$request, $type = null ) {
                $type = $type ? $type : $request->getVal( 'wpSourceType', 'File' );
 
-               if( !$type ) {
+               if ( !$type ) {
                        return null;
                }
 
@@ -148,18 +151,18 @@ abstract class UploadBase {
                if ( is_null( $className ) ) {
                        $className = 'UploadFrom' . $type;
                        wfDebug( __METHOD__ . ": class name: $className\n" );
-                       if( !in_array( $type, self::$uploadHandlers ) ) {
+                       if ( !in_array( $type, self::$uploadHandlers ) ) {
                                return null;
                        }
                }
 
                // Check whether this upload class is enabled
-               if( !call_user_func( array( $className, 'isEnabled' ) ) ) {
+               if ( !call_user_func( array( $className, 'isEnabled' ) ) ) {
                        return null;
                }
 
                // Check whether the request is valid
-               if( !call_user_func( array( $className, 'isValidRequest' ), $request ) ) {
+               if ( !call_user_func( array( $className, 'isValidRequest' ), $request ) ) {
                        return null;
                }
 
@@ -186,7 +189,9 @@ abstract class UploadBase {
         * @since 1.18
         * @return string
         */
-       public function getSourceType() { return null; }
+       public function getSourceType() {
+               return null;
+       }
 
        /**
         * Initialize the path information
@@ -251,7 +256,7 @@ abstract class UploadBase {
                wfProfileIn( __METHOD__ );
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
-                       // @TODO: just make uploads work with storage paths
+                       // @todo just make uploads work with storage paths
                        // UploadFromStash loads files via virtual URLs
                        $tmpFile = $repo->getLocalCopy( $srcPath );
                        $tmpFile->bind( $this ); // keep alive with $this
@@ -272,7 +277,7 @@ abstract class UploadBase {
                /**
                 * If there was no filename or a zero size given, give up quick.
                 */
-               if( $this->isEmptyFile() ) {
+               if ( $this->isEmptyFile() ) {
                        wfProfileOut( __METHOD__ );
                        return array( 'status' => self::EMPTY_FILE );
                }
@@ -281,7 +286,7 @@ abstract class UploadBase {
                 * Honor $wgMaxUploadSize
                 */
                $maxSize = self::getMaxUploadSize( $this->getSourceType() );
-               if( $this->mFileSize > $maxSize ) {
+               if ( $this->mFileSize > $maxSize ) {
                        wfProfileOut( __METHOD__ );
                        return array(
                                'status' => self::FILE_TOO_LARGE,
@@ -295,7 +300,7 @@ abstract class UploadBase {
                 * probably not accept it.
                 */
                $verification = $this->verifyFile();
-               if( $verification !== true ) {
+               if ( $verification !== true ) {
                        wfProfileOut( __METHOD__ );
                        return array(
                                'status' => self::VERIFICATION_ERROR,
@@ -307,13 +312,13 @@ abstract class UploadBase {
                 * Make sure this file can be created
                 */
                $result = $this->validateName();
-               if( $result !== true ) {
+               if ( $result !== true ) {
                        wfProfileOut( __METHOD__ );
                        return $result;
                }
 
                $error = '';
-               if( !wfRunHooks( 'UploadVerification',
+               if ( !wfRunHooks( 'UploadVerification',
                        array( $this->mDestName, $this->mTempPath, &$error ) ) )
                {
                        wfProfileOut( __METHOD__ );
@@ -330,11 +335,11 @@ abstract class UploadBase {
         * @return mixed true if valid, otherwise and array with 'status'
         * and other keys
         **/
-       protected function validateName() {
+       public function validateName() {
                $nt = $this->getTitle();
-               if( is_null( $nt ) ) {
+               if ( is_null( $nt ) ) {
                        $result = array( 'status' => $this->mTitleError );
-                       if( $this->mTitleError == self::ILLEGAL_FILENAME ) {
+                       if ( $this->mTitleError == self::ILLEGAL_FILENAME ) {
                                $result['filtered'] = $this->mFilteredName;
                        }
                        if ( $this->mTitleError == self::FILETYPE_BADTYPE ) {
@@ -351,8 +356,10 @@ abstract class UploadBase {
        }
 
        /**
-        * Verify the mime type
+        * Verify the mime type.
         *
+        * @note Only checks that it is not an evil mime. The does it have
+        *  correct extension given its mime type check is in verifyFile.
         * @param string $mime representing the mime
         * @return mixed true if the file is verified, an array otherwise
         */
@@ -360,19 +367,13 @@ abstract class UploadBase {
                global $wgVerifyMimeType;
                wfProfileIn( __METHOD__ );
                if ( $wgVerifyMimeType ) {
-                       wfDebug ( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
+                       wfDebug( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
                        global $wgMimeTypeBlacklist;
                        if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
                                wfProfileOut( __METHOD__ );
                                return array( 'filetype-badmime', $mime );
                        }
 
-                       # XXX: Missing extension will be caught by validateName() via getTitle()
-                       if ( $this->mFinalExtension != '' && !$this->verifyExtension( $mime, $this->mFinalExtension ) ) {
-                               wfProfileOut( __METHOD__ );
-                               return array( 'filetype-mime-mismatch', $this->mFinalExtension, $mime );
-                       }
-
                        # Check IE type
                        $fp = fopen( $this->mTempPath, 'rb' );
                        $chunk = fread( $fp, 256 );
@@ -393,17 +394,68 @@ abstract class UploadBase {
                return true;
        }
 
+
        /**
         * Verifies that it's ok to include the uploaded file
         *
         * @return mixed true of the file is verified, array otherwise.
         */
        protected function verifyFile() {
+               global $wgVerifyMimeType;
+               wfProfileIn( __METHOD__ );
+
+               $status = $this->verifyPartialFile();
+               if ( $status !== true ) {
+                       wfProfileOut( __METHOD__ );
+                       return $status;
+               }
+
+               if ( $wgVerifyMimeType ) {
+                       $this->mFileProps = FSFile::getPropsFromPath( $this->mTempPath, $this->mFinalExtension );
+                       $mime = $this->mFileProps['file-mime'];
+
+                       # XXX: Missing extension will be caught by validateName() via getTitle()
+                       if ( $this->mFinalExtension != '' && !$this->verifyExtension( $mime, $this->mFinalExtension ) ) {
+                               wfProfileOut( __METHOD__ );
+                               return array( 'filetype-mime-mismatch', $this->mFinalExtension, $mime );
+                       }
+               }
+
+
+               $handler = MediaHandler::getHandler( $mime );
+               if ( $handler ) {
+                       $handlerStatus = $handler->verifyUpload( $this->mTempPath );
+                       if ( !$handlerStatus->isOK() ) {
+                               $errors = $handlerStatus->getErrorsArray();
+                               wfProfileOut( __METHOD__ );
+                               return reset( $errors );
+                       }
+               }
+
+               wfRunHooks( 'UploadVerifyFile', array( $this, $mime, &$status ) );
+               if ( $status !== true ) {
+                       wfProfileOut( __METHOD__ );
+                       return $status;
+               }
+
+               wfDebug( __METHOD__ . ": all clear; passing.\n" );
+               wfProfileOut( __METHOD__ );
+               return true;
+       }
+
+       /**
+        * A verification routine suitable for partial files
+        *
+        * Runs the blacklist checks, but not any checks that may
+        * assume the entire file is present.
+        *
+        * @return Mixed true for valid or array with error message key.
+        */
+       protected function verifyPartialFile() {
                global $wgAllowJavaUploads, $wgDisableUploadScriptChecks;
                wfProfileIn( __METHOD__ );
 
-               # get the title, even though we are doing nothing with it, because
-               # we need to populate mFinalExtension
+               # getTitle() sets some internal parameters like $this->mFinalExtension
                $this->getTitle();
 
                $this->mFileProps = FSFile::getPropsFromPath( $this->mTempPath, $this->mFinalExtension );
@@ -418,12 +470,12 @@ abstract class UploadBase {
 
                # check for htmlish code and javascript
                if ( !$wgDisableUploadScriptChecks ) {
-                       if( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
+                       if ( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
                                wfProfileOut( __METHOD__ );
                                return array( 'uploadscripted' );
                        }
-                       if( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
-                               if( $this->detectScriptInSvg( $this->mTempPath ) ) {
+                       if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
+                               if ( $this->detectScriptInSvg( $this->mTempPath ) ) {
                                        wfProfileOut( __METHOD__ );
                                        return array( 'uploadscripted' );
                                }
@@ -457,23 +509,6 @@ abstract class UploadBase {
                        return array( 'uploadvirus', $virus );
                }
 
-               $handler = MediaHandler::getHandler( $mime );
-               if ( $handler ) {
-                       $handlerStatus = $handler->verifyUpload( $this->mTempPath );
-                       if ( !$handlerStatus->isOK() ) {
-                               $errors = $handlerStatus->getErrorsArray();
-                               wfProfileOut( __METHOD__ );
-                               return reset( $errors );
-                       }
-               }
-
-               wfRunHooks( 'UploadVerifyFile', array( $this, $mime, &$status ) );
-               if ( $status !== true ) {
-                       wfProfileOut( __METHOD__ );
-                       return $status;
-               }
-
-               wfDebug( __METHOD__ . ": all clear; passing.\n" );
                wfProfileOut( __METHOD__ );
                return true;
        }
@@ -529,7 +564,7 @@ abstract class UploadBase {
                 * to modify it by uploading a new revision.
                 */
                $nt = $this->getTitle();
-               if( is_null( $nt ) ) {
+               if ( is_null( $nt ) ) {
                        return true;
                }
                $permErrors = $nt->getUserPermissionsErrors( 'edit', $user );
@@ -539,7 +574,7 @@ abstract class UploadBase {
                } else {
                        $permErrorsCreate = array();
                }
-               if( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
+               if ( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
                        $permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsUpload, $permErrors ) );
                        $permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsCreate, $permErrors ) );
                        return $permErrors;
@@ -576,7 +611,7 @@ abstract class UploadBase {
                $comparableName = str_replace( ' ', '_', $this->mDesiredDestName );
                $comparableName = Title::capitalize( $comparableName, NS_FILE );
 
-               if( $this->mDesiredDestName != $filename && $comparableName != $filename ) {
+               if ( $this->mDesiredDestName != $filename && $comparableName != $filename ) {
                        $warnings['badfilename'] = $filename;
                }
 
@@ -599,7 +634,7 @@ abstract class UploadBase {
                }
 
                $exists = self::getExistsWarning( $localFile );
-               if( $exists !== false ) {
+               if ( $exists !== false ) {
                        $warnings['exists'] = $exists;
                }
 
@@ -609,11 +644,11 @@ abstract class UploadBase {
                $title = $this->getTitle();
                // Remove all matches against self
                foreach ( $dupes as $key => $dupe ) {
-                       if( $title->equals( $dupe->getTitle() ) ) {
+                       if ( $title->equals( $dupe->getTitle() ) ) {
                                unset( $dupes[$key] );
                        }
                }
-               if( $dupes ) {
+               if ( $dupes ) {
                        $warnings['duplicate'] = $dupes;
                }
 
@@ -651,7 +686,7 @@ abstract class UploadBase {
                        $user
                );
 
-               if( $status->isGood() ) {
+               if ( $status->isGood() ) {
                        if ( $watch ) {
                                $user->addWatch( $this->getLocalFile()->getTitle() );
                        }
@@ -672,7 +707,6 @@ abstract class UploadBase {
                if ( $this->mTitle !== false ) {
                        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.
                 */
@@ -698,7 +732,7 @@ abstract class UploadBase {
                $this->mFilteredName = wfStripIllegalFilenameChars( $this->mFilteredName );
                /* Normalize to title form before we do any further processing */
                $nt = Title::makeTitleSafe( NS_FILE, $this->mFilteredName );
-               if( is_null( $nt ) ) {
+               if ( is_null( $nt ) ) {
                        $this->mTitleError = self::ILLEGAL_FILENAME;
                        return $this->mTitle = null;
                }
@@ -710,7 +744,7 @@ abstract class UploadBase {
                 */
                list( $partname, $ext ) = $this->splitExtensions( $this->mFilteredName );
 
-               if( count( $ext ) ) {
+               if ( count( $ext ) ) {
                        $this->mFinalExtension = trim( $ext[count( $ext ) - 1] );
                } else {
                        $this->mFinalExtension = '';
@@ -758,13 +792,13 @@ abstract class UploadBase {
 
                # If there was more than one "extension", reassemble the base
                # filename to prevent bogus complaints about length
-               if( count( $ext ) > 1 ) {
-                       for( $i = 0; $i < count( $ext ) - 1; $i++ ) {
+               if ( count( $ext ) > 1 ) {
+                       for ( $i = 0; $i < count( $ext ) - 1; $i++ ) {
                                $partname .= '.' . $ext[$i];
                        }
                }
 
-               if( strlen( $partname ) < 1 ) {
+               if ( strlen( $partname ) < 1 ) {
                        $this->mTitleError = self::MIN_LENGTH_PARTNAME;
                        return $this->mTitle = null;
                }
@@ -778,7 +812,7 @@ abstract class UploadBase {
         * @return LocalFile|null
         */
        public function getLocalFile() {
-               if( is_null( $this->mLocalFile ) ) {
+               if ( is_null( $this->mLocalFile ) ) {
                        $nt = $this->getTitle();
                        $this->mLocalFile = is_null( $nt ) ? null : wfLocalFile( $nt );
                }
@@ -891,23 +925,24 @@ abstract class UploadBase {
        public static function verifyExtension( $mime, $extension ) {
                $magic = MimeMagic::singleton();
 
-               if ( !$mime || $mime == 'unknown' || $mime == 'unknown/unknown' )
+               if ( !$mime || $mime == 'unknown' || $mime == 'unknown/unknown' ) {
                        if ( !$magic->isRecognizableExtension( $extension ) ) {
                                wfDebug( __METHOD__ . ": passing file with unknown detected mime type; " .
                                        "unrecognized extension '$extension', can't verify\n" );
                                return true;
                        } else {
-                               wfDebug( __METHOD__ . ": rejecting file with unknown detected mime type; ".
+                               wfDebug( __METHOD__ . ": rejecting file with unknown detected mime type; " .
                                        "recognized extension '$extension', so probably invalid file\n" );
                                return false;
                        }
+               }
 
                $match = $magic->isMatchingExtension( $extension, $mime );
 
                if ( $match === null ) {
                        wfDebug( __METHOD__ . ": no file extension known for mime type $mime, passing file\n" );
                        return true;
-               } elseif( $match === true ) {
+               } elseif ( $match === true ) {
                        wfDebug( __METHOD__ . ": mime type $mime matches extension $extension, passing file\n" );
 
                        #TODO: if it's a bitmap, make sure PHP or ImageMagic resp. can handle it!
@@ -937,7 +972,7 @@ abstract class UploadBase {
                # ugly hack: for text files, always look at the entire file.
                # For binary field, just check the first K.
 
-               if( strpos( $mime, 'text/' ) === 0 ) {
+               if ( strpos( $mime, 'text/' ) === 0 ) {
                        $chunk = file_get_contents( $file );
                } else {
                        $fp = fopen( $file, 'rb' );
@@ -947,21 +982,21 @@ abstract class UploadBase {
 
                $chunk = strtolower( $chunk );
 
-               if( !$chunk ) {
+               if ( !$chunk ) {
                        wfProfileOut( __METHOD__ );
                        return false;
                }
 
                # decode from UTF-16 if needed (could be used for obfuscation).
-               if( substr( $chunk, 0, 2 ) == "\xfe\xff" ) {
+               if ( substr( $chunk, 0, 2 ) == "\xfe\xff" ) {
                        $enc = 'UTF-16BE';
-               } elseif( substr( $chunk, 0, 2 ) == "\xff\xfe" ) {
+               } elseif ( substr( $chunk, 0, 2 ) == "\xff\xfe" ) {
                        $enc = 'UTF-16LE';
                } else {
                        $enc = null;
                }
 
-               if( $enc ) {
+               if ( $enc ) {
                        $chunk = iconv( $enc, "ASCII//IGNORE", $chunk );
                }
 
@@ -976,6 +1011,15 @@ abstract class UploadBase {
                        return true;
                }
 
+               // Some browsers will interpret obscure xml encodings as UTF-8, while
+               // PHP/expat will interpret the given encoding in the xml declaration (bug 47304)
+               if ( $extension == 'svg' || strpos( $mime, 'image/svg' ) === 0 ) {
+                       if ( self::checkXMLEncodingMissmatch( $file ) ) {
+                               wfProfileOut( __METHOD__ );
+                               return true;
+                       }
+               }
+
                /**
                 * Internet Explorer for Windows performs some really stupid file type
                 * autodetection which can cause it to interpret valid image files as HTML
@@ -1002,12 +1046,12 @@ abstract class UploadBase {
                        '<table'
                );
 
-               if( !$wgAllowTitlesInSVG && $extension !== 'svg' && $mime !== 'image/svg' ) {
+               if ( !$wgAllowTitlesInSVG && $extension !== 'svg' && $mime !== 'image/svg' ) {
                        $tags[] = '<title';
                }
 
-               foreach( $tags as $tag ) {
-                       if( false !== strpos( $chunk, $tag ) ) {
+               foreach ( $tags as $tag ) {
+                       if ( false !== strpos( $chunk, $tag ) ) {
                                wfDebug( __METHOD__ . ": found something that may make it be mistaken for html: $tag\n" );
                                wfProfileOut( __METHOD__ );
                                return true;
@@ -1022,21 +1066,21 @@ abstract class UploadBase {
                $chunk = Sanitizer::decodeCharReferences( $chunk );
 
                # look for script-types
-               if( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
+               if ( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found script types\n" );
                        wfProfileOut( __METHOD__ );
                        return true;
                }
 
                # look for html-style script-urls
-               if( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
+               if ( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found html-style script urls\n" );
                        wfProfileOut( __METHOD__ );
                        return true;
                }
 
                # look for css-style script-urls
-               if( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
+               if ( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found css-style script urls\n" );
                        wfProfileOut( __METHOD__ );
                        return true;
@@ -1047,6 +1091,62 @@ abstract class UploadBase {
                return false;
        }
 
+
+       /**
+        * Check a whitelist of xml encodings that are known not to be interpreted differently
+        * by the server's xml parser (expat) and some common browsers.
+        *
+        * @param string $file pathname to the temporary upload file
+        * @return Boolean: true if the file contains an encoding that could be misinterpreted
+        */
+       public static function checkXMLEncodingMissmatch( $file ) {
+               global $wgSVGMetadataCutoff;
+               $contents = file_get_contents( $file, false, null, -1, $wgSVGMetadataCutoff );
+               $encodingRegex = '!encoding[ \t\n\r]*=[ \t\n\r]*[\'"](.*?)[\'"]!si';
+
+               if ( preg_match( "!<\?xml\b(.*?)\?>!si", $contents, $matches ) ) {
+                       if ( preg_match( $encodingRegex, $matches[1], $encMatch )
+                               && !in_array( strtoupper( $encMatch[1] ), self::$safeXmlEncodings )
+                       ) {
+                               wfDebug( __METHOD__ . ": Found unsafe XML encoding '{$encMatch[1]}'\n" );
+                               return true;
+                       }
+               } elseif ( preg_match( "!<\?xml\b!si", $contents ) ) {
+                       // Start of XML declaration without an end in the first $wgSVGMetadataCutoff
+                       // bytes. There shouldn't be a legitimate reason for this to happen.
+                       wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
+                       return true;
+               } elseif ( substr( $contents, 0, 4 ) == "\x4C\x6F\xA7\x94" ) {
+                       // EBCDIC encoded XML
+                       wfDebug( __METHOD__ . ": EBCDIC Encoded XML\n" );
+                       return true;
+               }
+
+               // It's possible the file is encoded with multi-byte encoding, so re-encode attempt to
+               // detect the encoding in case is specifies an encoding not whitelisted in self::$safeXmlEncodings
+               $attemptEncodings = array( 'UTF-16', 'UTF-16BE', 'UTF-32', 'UTF-32BE' );
+               foreach ( $attemptEncodings as $encoding ) {
+                       wfSuppressWarnings();
+                       $str = iconv( $encoding, 'UTF-8', $contents );
+                       wfRestoreWarnings();
+                       if ( $str != '' && preg_match( "!<\?xml\b(.*?)\?>!si", $str, $matches ) ) {
+                               if ( preg_match( $encodingRegex, $matches[1], $encMatch )
+                                       && !in_array( strtoupper( $encMatch[1] ), self::$safeXmlEncodings )
+                               ) {
+                                       wfDebug( __METHOD__ . ": Found unsafe XML encoding '{$encMatch[1]}'\n" );
+                                       return true;
+                               }
+                       } elseif ( $str != '' && preg_match( "!<\?xml\b!si", $str ) ) {
+                               // Start of XML declaration without an end in the first $wgSVGMetadataCutoff
+                               // bytes. There shouldn't be a legitimate reason for this to happen.
+                               wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
        /**
         * @param $filename string
         * @return bool
@@ -1068,77 +1168,77 @@ abstract class UploadBase {
                /*
                 * check for elements that can contain javascript
                 */
-               if( $strippedElement == 'script' ) {
+               if ( $strippedElement == 'script' ) {
                        wfDebug( __METHOD__ . ": Found script element '$element' in uploaded file.\n" );
                        return true;
                }
 
                # e.g., <svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
-               if( $strippedElement == 'handler' ) {
+               if ( $strippedElement == 'handler' ) {
                        wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
                        return true;
                }
 
                # SVG reported in Feb '12 that used xml:stylesheet to generate javascript block
-               if( $strippedElement == 'stylesheet' ) {
+               if ( $strippedElement == 'stylesheet' ) {
                        wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
                        return true;
                }
 
-               foreach( $attribs as $attrib => $value ) {
+               foreach ( $attribs as $attrib => $value ) {
                        $stripped = $this->stripXmlNamespace( $attrib );
                        $value = strtolower( $value );
 
-                       if( substr( $stripped, 0, 2 ) == 'on' ) {
+                       if ( substr( $stripped, 0, 2 ) == 'on' ) {
                                wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
                                return true;
                        }
 
                        # href with javascript target
-                       if( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
+                       if ( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
                                wfDebug( __METHOD__ . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
                                return true;
                        }
 
                        # href with embedded svg as target
-                       if( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
+                       if ( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
                                wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
                                return true;
                        }
 
                        # href with embedded (text/xml) svg as target
-                       if( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
+                       if ( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
                                wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
                                return true;
                        }
 
                        # use set/animate to add event-handler attribute to parent
-                       if( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
+                       if ( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
                                wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
                                return true;
                        }
 
                        # use set to add href attribute to parent element
-                       if( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
+                       if ( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
                                wfDebug( __METHOD__ . ": Found svg setting href attribute '$value' in uploaded file.\n" );
                                return true;
                        }
 
                        # use set to add a remote / data / script target to an element
-                       if( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+                       if ( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
                                wfDebug( __METHOD__ . ": Found svg setting attribute to '$value' in uploaded file.\n" );
                                return true;
                        }
 
                        # use handler attribute with remote / data / script
-                       if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+                       if ( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
                                wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
                                return true;
                        }
 
                        # use CSS styles to bring in remote code
                        # catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
-                       if( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
+                       if ( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
                                foreach ( $matches[1] as $match ) {
                                        if ( !preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
                                                wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
@@ -1148,7 +1248,7 @@ abstract class UploadBase {
                        }
 
                        # image filters can pull in url, which could be svg that executes scripts
-                       if( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
+                       if ( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
                                wfDebug( __METHOD__ . ": Found image filter with url: \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
                                return true;
                        }
@@ -1278,8 +1378,8 @@ abstract class UploadBase {
        private function checkOverwrite( $user ) {
                // First check whether the local file can be overwritten
                $file = $this->getLocalFile();
-               if( $file->exists() ) {
-                       if( !self::userCanReUpload( $user, $file ) ) {
+               if ( $file->exists() ) {
+                       if ( !self::userCanReUpload( $user, $file ) ) {
                                return array( 'fileexists-forbidden', $file->getName() );
                        } else {
                                return true;
@@ -1305,13 +1405,13 @@ abstract class UploadBase {
         * @return Boolean
         */
        public static function userCanReUpload( User $user, $img ) {
-               if( $user->isAllowed( 'reupload' ) ) {
+               if ( $user->isAllowed( 'reupload' ) ) {
                        return true; // non-conditional
                }
-               if( !$user->isAllowed( 'reupload-own' ) ) {
+               if ( !$user->isAllowed( 'reupload-own' ) ) {
                        return false;
                }
-               if( is_string( $img ) ) {
+               if ( is_string( $img ) ) {
                        $img = wfLocalFile( $img );
                }
                if ( !( $img instanceof LocalFile ) ) {
@@ -1333,11 +1433,11 @@ abstract class UploadBase {
         * @return mixed False if the file does not exists, else an array
         */
        public static function getExistsWarning( $file ) {
-               if( $file->exists() ) {
+               if ( $file->exists() ) {
                        return array( 'warning' => 'exists', 'file' => $file );
                }
 
-               if( $file->getTitle()->getArticleID() ) {
+               if ( $file->getTitle()->getArticleID() ) {
                        return array( 'warning' => 'page-exists', 'file' => $file );
                }
 
@@ -1345,7 +1445,7 @@ abstract class UploadBase {
                        return array( 'warning' => 'was-deleted', 'file' => $file );
                }
 
-               if( strpos( $file->getName(), '.' ) == false ) {
+               if ( strpos( $file->getName(), '.' ) == false ) {
                        $partname = $file->getName();
                        $extension = '';
                } else {
@@ -1364,7 +1464,7 @@ abstract class UploadBase {
                        $nt_lc = Title::makeTitle( NS_FILE, "{$partname}.{$normalizedExtension}" );
                        $file_lc = wfLocalFile( $nt_lc );
 
-                       if( $file_lc->exists() ) {
+                       if ( $file_lc->exists() ) {
                                return array(
                                        'warning' => 'exists-normalized',
                                        'file' => $file,
@@ -1388,7 +1488,7 @@ abstract class UploadBase {
                        # Check for filenames like 50px- or 180px-, these are mostly thumbnails
                        $nt_thb = Title::newFromText( substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension, NS_FILE );
                        $file_thb = wfLocalFile( $nt_thb );
-                       if( $file_thb->exists() ) {
+                       if ( $file_thb->exists() ) {
                                return array(
                                        'warning' => 'thumb',
                                        'file' => $file,
@@ -1404,7 +1504,7 @@ abstract class UploadBase {
                        }
                }
 
-               foreach( self::getFilenamePrefixBlacklist() as $prefix ) {
+               foreach ( self::getFilenamePrefixBlacklist() as $prefix ) {
                        if ( substr( $partname, 0, strlen( $prefix ) ) == $prefix ) {
                                return array(
                                        'warning' => 'bad-prefix',
@@ -1440,9 +1540,9 @@ abstract class UploadBase {
        public static function getFilenamePrefixBlacklist() {
                $blacklist = array();
                $message = wfMessage( 'filename-prefix-blacklist' )->inContentLanguage();
-               if( !$message->isDisabled() ) {
+               if ( !$message->isDisabled() ) {
                        $lines = explode( "\n", $message->plain() );
-                       foreach( $lines as $line ) {
+                       foreach ( $lines as $line ) {
                                // Remove comment lines
                                $comment = substr( trim( $line ), 0, 1 );
                                if ( $comment == '#' || $comment == '' ) {
@@ -1451,7 +1551,7 @@ abstract class UploadBase {
                                // Remove additional comments after a prefix
                                $comment = strpos( $line, '#' );
                                if ( $comment > 0 ) {
-                                       $line = substr( $line, 0, $comment-1 );
+                                       $line = substr( $line, 0, $comment - 1 );
                                }
                                $blacklist[] = trim( $line );
                        }
index e784e51..1746206 100644 (file)
@@ -31,7 +31,7 @@ class UploadFromChunks extends UploadFromFile {
        protected $mOffset, $mChunkIndex, $mFileKey, $mVirtualTempPath;
 
        /**
-        * Setup local pointers to stash, repo and user ( similar to UploadFromStash )
+        * Setup local pointers to stash, repo and user (similar to UploadFromStash)
         *
         * @param $user User
         * @param $stash UploadStash
@@ -41,16 +41,16 @@ class UploadFromChunks extends UploadFromFile {
                // user object. sometimes this won't exist, as when running from cron.
                $this->user = $user;
 
-               if( $repo ) {
+               if ( $repo ) {
                        $this->repo = $repo;
                } else {
                        $this->repo = RepoGroup::singleton()->getLocalRepo();
                }
 
-               if( $stash ) {
+               if ( $stash ) {
                        $this->stash = $stash;
                } else {
-                       if( $user ) {
+                       if ( $user ) {
                                wfDebug( __METHOD__ . " creating new UploadFromChunks instance for " . $user->getId() . "\n" );
                        } else {
                                wfDebug( __METHOD__ . " creating new UploadFromChunks instance with no user\n" );
@@ -70,9 +70,11 @@ class UploadFromChunks extends UploadFromFile {
                // Stash file is the called on creating a new chunk session:
                $this->mChunkIndex = 0;
                $this->mOffset = 0;
+
+               $this->verifyChunk();
                // Create a local stash target
                $this->mLocalFile = parent::stashFile();
-               // Update the initial file offset ( based on file size )
+               // Update the initial file offset (based on file size)
                $this->mOffset = $this->mLocalFile->getSize();
                $this->mFileKey = $this->mLocalFile->getFileKey();
 
@@ -112,7 +114,7 @@ class UploadFromChunks extends UploadFromFile {
                // Concatenate all the chunks to mVirtualTempPath
                $fileList = Array();
                // The first chunk is stored at the mVirtualTempPath path so we start on "chunk 1"
-               for( $i = 0; $i <= $this->getChunkIndex(); $i++ ) {
+               for ( $i = 0; $i <= $this->getChunkIndex(); $i++ ) {
                        $fileList[] = $this->getVirtualChunkLocation( $i );
                }
 
@@ -127,13 +129,22 @@ class UploadFromChunks extends UploadFromFile {
                $tStart = microtime( true );
                $status = $this->repo->concatenate( $fileList, $tmpPath, FileRepo::DELETE_SOURCE );
                $tAmount = microtime( true ) - $tStart;
-               if( !$status->isOk() ) {
+               if ( !$status->isOk() ) {
                        return $status;
                }
                wfDebugLog( 'fileconcatenate', "Combined $i chunks in $tAmount seconds.\n" );
-               // Update the mTempPath and mLocalFile
-               // ( for FileUpload or normal Stash to take over )
+
                $this->mTempPath = $tmpPath; // file system path
+               $this->mFileSize = filesize( $this->mTempPath ); //Since this was set for the last chunk previously
+               $ret = $this->verifyUpload();
+               if ( $ret['status'] !== UploadBase::OK ) {
+                       wfDebugLog( 'fileconcatenate', "Verification failed for chunked upload" );
+                       $status->fatal( $this->getVerificationErrorCode( $ret['status'] ) );
+                       return $status;
+               }
+
+               // Update the mTempPath and mLocalFile
+               // (for FileUpload or normal Stash to take over)
                $tStart = microtime( true );
                $this->mLocalFile = parent::stashFile( $this->user );
                $tAmount = microtime( true ) - $tStart;
@@ -182,15 +193,24 @@ class UploadFromChunks extends UploadFromFile {
                // Get the offset before we add the chunk to the file system
                $preAppendOffset = $this->getOffset();
 
-               if ( $preAppendOffset + $chunkSize > $this->getMaxUploadSize()) {
+               if ( $preAppendOffset + $chunkSize > $this->getMaxUploadSize() ) {
                        $status = Status::newFatal( 'file-too-large' );
                } else {
                        // Make sure the client is uploading the correct chunk with a matching offset.
                        if ( $preAppendOffset == $offset ) {
                                // Update local chunk index for the current chunk
                                $this->mChunkIndex++;
+                               try {
+                                       # For some reason mTempPath is set to first part
+                                       $oldTemp = $this->mTempPath;
+                                       $this->mTempPath = $chunkPath;
+                                       $this->verifyChunk();
+                                       $this->mTempPath = $oldTemp;
+                               } catch ( UploadChunkVerificationException $e ) {
+                                       return Status::newFatal( $e->getMessage() );
+                               }
                                $status = $this->outputChunk( $chunkPath );
-                               if( $status->isGood() ) {
+                               if ( $status->isGood() ) {
                                        // Update local offset:
                                        $this->mOffset = $preAppendOffset + $chunkSize;
                                        // Update chunk table status db
@@ -257,7 +277,7 @@ class UploadFromChunks extends UploadFromFile {
         * @return Integer index of the current chunk
         */
        private function getChunkIndex() {
-               if( $this->mChunkIndex !== null ) {
+               if ( $this->mChunkIndex !== null ) {
                        return $this->mChunkIndex;
                }
                return 0;
@@ -307,12 +327,31 @@ class UploadFromChunks extends UploadFromFile {
        }
 
        private function getChunkFileKey( $index = null ) {
-               if( $index === null ) {
+               if ( $index === null ) {
                        $index = $this->getChunkIndex();
                }
                return $this->mFileKey . '.' . $index;
        }
+
+       /**
+        * Verify that the chunk isn't really an evil html file
+        *
+        * @throws UploadChunkVerificationException
+        */
+       private function verifyChunk() {
+               // Rest mDesiredDestName here so we verify the name as if it were mFileKey
+               $oldDesiredDestName = $this->mDesiredDestName;
+               $this->mDesiredDestName = $this->mFileKey;
+               $this->mTitle = false;
+               $res = $this->verifyPartialFile();
+               $this->mDesiredDestName = $oldDesiredDestName;
+               $this->mTitle = false;
+               if( is_array( $res ) ) {
+                       throw new UploadChunkVerificationException( $res[0] );
+               }
+       }
 }
 
 class UploadChunkZeroLengthFileException extends MWException {};
 class UploadChunkFileException extends MWException {};
+class UploadChunkVerificationException extends MWException {};
index ab2a7a3..a00ed32 100644 (file)
@@ -40,7 +40,7 @@ class UploadFromFile extends UploadBase {
        function initializeFromRequest( &$request ) {
                $upload = $request->getUpload( 'wpUploadFile' );
                $desiredDestName = $request->getText( 'wpDestFile' );
-               if( !$desiredDestName ) {
+               if ( !$desiredDestName ) {
                        $desiredDestName = $upload->getName();
                }
 
index fd2416d..cb85fc6 100644 (file)
@@ -45,16 +45,16 @@ class UploadFromStash extends UploadBase {
                // user object. sometimes this won't exist, as when running from cron.
                $this->user = $user;
 
-               if( $repo ) {
+               if ( $repo ) {
                        $this->repo = $repo;
                } else {
                        $this->repo = RepoGroup::singleton()->getLocalRepo();
                }
 
-               if( $stash ) {
+               if ( $stash ) {
                        $this->stash = $stash;
                } else {
-                       if( $user ) {
+                       if ( $user ) {
                                wfDebug( __METHOD__ . " creating new UploadStash instance for " . $user->getId() . "\n" );
                        } else {
                                wfDebug( __METHOD__ . " creating new UploadStash instance with no user\n" );
@@ -137,14 +137,9 @@ class UploadFromStash extends UploadBase {
                return $this->mFileProps['sha1'];
        }
 
-       /**
-        * File has been previously verified so no need to do so again.
-        *
-        * @return bool
+       /*
+        * protected function verifyFile() inherited
         */
-       protected function verifyFile() {
-               return true;
-       }
 
        /**
         * Stash the file.
index 70b6903..c99feef 100644 (file)
@@ -77,7 +77,7 @@ class UploadFromUrl extends UploadBase {
                        return false;
                }
                $valid = false;
-               foreach( $wgCopyUploadsDomains as $domain ) {
+               foreach ( $wgCopyUploadsDomains as $domain ) {
                        // See if the domain for the upload matches this whitelisted domain
                        $whitelistedDomainPieces = explode( '.', $domain );
                        $uploadDomainPieces = explode( '.', $parsedUrl['host'] );
@@ -160,7 +160,9 @@ class UploadFromUrl extends UploadBase {
        /**
         * @return string
         */
-       public function getSourceType() { return 'url'; }
+       public function getSourceType() {
+               return 'url';
+       }
 
        /**
         * @return Status
@@ -170,7 +172,7 @@ class UploadFromUrl extends UploadBase {
                        return Status::newFatal( 'http-invalid-url' );
                }
 
-               if( !self::isAllowedHost( $this->mUrl ) ) {
+               if ( !self::isAllowedHost( $this->mUrl ) ) {
                        return Status::newFatal( 'upload-copy-upload-invalid-domain' );
                }
                if ( !$this->mAsync ) {
index 326d91d..8a6d766 100644 (file)
@@ -209,7 +209,7 @@ class UploadStash {
                list( $usec, $sec ) = explode( ' ', microtime() );
                $usec = substr( $usec, 2 );
                $key = wfBaseConvert( $sec . $usec, 10, 36 ) . '.' .
-                       wfBaseConvert( mt_rand(), 10, 36 ) . '.'.
+                       wfBaseConvert( mt_rand(), 10, 36 ) . '.' .
                        $this->userId . '.' .
                        $extension;
 
@@ -338,7 +338,7 @@ class UploadStash {
                        __METHOD__
                );
 
-               if( !$row ) {
+               if ( !$row ) {
                        throw new UploadStashNoSuchKeyException( "No such key ($key), cannot remove" );
                }
 
@@ -422,6 +422,7 @@ class UploadStash {
         * @return string
         */
        public static function getExtensionForPath( $path ) {
+               global $wgFileBlacklist;
                // Does this have an extension?
                $n = strrpos( $path, '.' );
                $extension = null;
@@ -441,7 +442,15 @@ class UploadStash {
                        throw new UploadStashFileException( "extension is null" );
                }
 
-               return File::normalizeExtension( $extension );
+               $extension = File::normalizeExtension( $extension );
+               if ( in_array( $extension, $wgFileBlacklist ) ) {
+                       // The file should already be checked for being evil.
+                       // However, if somehow we got here, we definitely
+                       // don't want to give it an extension of .php and
+                       // put it in a web accesible directory.
+                       return '';
+               }
+               return $extension;
        }
 
        /**
@@ -454,7 +463,7 @@ class UploadStash {
        protected function fetchFileMetadata( $key, $readFromDB = DB_SLAVE ) {
                // populate $fileMetadata[$key]
                $dbr = null;
-               if( $readFromDB === DB_MASTER ) {
+               if ( $readFromDB === DB_MASTER ) {
                        // sometimes reading from the master is necessary, if there's replication lag.
                        $dbr = $this->repo->getMasterDb();
                } else {
index 0e9676d..ff71c20 100644 (file)
--- a/index.php
+++ b/index.php
 # 5.1, respectively.
 if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
        // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
-       require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
+       require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
        wfPHPVersionError( 'index.php' );
 }
 
 # Initialise common code.  This gives us access to GlobalFunctions, the
 # AutoLoader, and the globals $wgRequest, $wgOut, $wgUser, $wgLang and
 # $wgContLang, amongst others; it does *not* load $wgTitle
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       require ( 'phase3/includes/WebStart.php' );
-} else {
-       require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 $mediaWiki = new MediaWiki();
 $mediaWiki->run();
index 9641a89..92ea75c 100644 (file)
@@ -32,7 +32,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 
 # Read language names
 global $wgLanguageNames;
-require_once( __DIR__ . '/Names.php' );
+require_once __DIR__ . '/Names.php';
 
 if ( function_exists( 'mb_strtoupper' ) ) {
        mb_internal_encoding( 'UTF-8' );
@@ -44,7 +44,6 @@ if ( function_exists( 'mb_strtoupper' ) ) {
  * @ingroup Language
  */
 class FakeConverter {
-
        /**
         * @var Language
         */
@@ -171,6 +170,14 @@ class Language {
                'seconds' => 1,
        );
 
+       /**
+        * Cache for language fallbacks.
+        * @see Language::getFallbacksIncludingSiteLanguage
+        * @since 1.21
+        * @var array
+        */
+       static private $fallbackLanguageCache = array();
+
        /**
         * Get a cached or new language object for a given language code
         * @param $code String
@@ -276,7 +283,7 @@ class Language {
                $alpha = '[a-z]';
                $digit = '[0-9]';
                $alphanum = '[a-z0-9]';
-               $x = 'x' ; # private use singleton
+               $x = 'x'; # private use singleton
                $singleton = '[a-wy-z]'; # other singleton
                $s = $lenient ? '[-_]' : '-';
 
@@ -327,13 +334,19 @@ class Language {
         * @return bool
         */
        public static function isValidCode( $code ) {
-               return
-                       // 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
+               static $cache = array();
+               if ( isset( $cache[$code] ) ) {
+                       return $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] =
                        strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
                        && !preg_match( Title::getTitleInvalidRegex(), $code );
+
+               return $cache[$code];
        }
 
        /**
@@ -358,7 +371,7 @@ class Language {
                        throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
                }
 
-               return (bool)preg_match( '/^[a-z0-9-]+$/i', $code );
+               return (bool)preg_match( '/^[a-z0-9-]{2,}$/i', $code );
        }
 
        /**
@@ -373,7 +386,7 @@ class Language {
                static $coreLanguageNames;
 
                if ( $coreLanguageNames === null ) {
-                       include( MWInit::compiledPath( 'languages/Names.php' ) );
+                       include MWInit::compiledPath( 'languages/Names.php' );
                }
 
                if ( isset( $coreLanguageNames[$tag] )
@@ -409,10 +422,8 @@ class Language {
                        return;
                }
 
-               if ( !defined( 'MW_COMPILED' ) ) {
-                       if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
-                               include_once( "$IP/languages/classes/$class.php" );
-                       }
+               if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
+                       include_once "$IP/languages/classes/$class.php";
                }
        }
 
@@ -483,6 +494,9 @@ class Language {
        }
 
        /**
+        * Returns an array of localised namespaces indexed by their numbers. If the namespace is not
+        * available in localised form, it will be included in English.
+        *
         * @return array
         */
        public function getNamespaces() {
@@ -743,20 +757,6 @@ class Language {
                return $this->getNsText( NS_SPECIAL ) . ':' . $name;
        }
 
-       /**
-        * @return array
-        */
-       function getQuickbarSettings() {
-               return array(
-                       $this->getMessage( 'qbsettings-none' ),
-                       $this->getMessage( 'qbsettings-fixedleft' ),
-                       $this->getMessage( 'qbsettings-fixedright' ),
-                       $this->getMessage( 'qbsettings-floatingleft' ),
-                       $this->getMessage( 'qbsettings-floatingright' ),
-                       $this->getMessage( 'qbsettings-directionality' )
-               );
-       }
-
        /**
         * @return array
         */
@@ -857,7 +857,7 @@ class Language {
                static $coreLanguageNames;
 
                if ( $coreLanguageNames === null ) {
-                       include( MWInit::compiledPath( 'languages/Names.php' ) );
+                       include MWInit::compiledPath( 'languages/Names.php' );
                }
 
                $names = array();
@@ -1033,8 +1033,8 @@ class Language {
         * internationalisation, a reduced set of format characters, and a better
         * escaping format.
         *
-        * Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrU. See the
-        * PHP manual for definitions. There are a number of extensions, which
+        * Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrUeIOPTZ. See
+        * the PHP manual for definitions. There are a number of extensions, which
         * start with "x":
         *
         *    xn   Do not translate digits of the next numeric format character
@@ -1080,22 +1080,25 @@ class Language {
         * Backslash escaping is also supported.
         *
         * Input timestamp is assumed to be pre-normalized to the desired local
-        * time zone, if any.
+        * time zone, if any. Note that the format characters crUeIOPTZ will assume
+        * $ts is UTC if $zone is not given.
         *
         * @param $format String
         * @param $ts String: 14-character timestamp
         *      YYYYMMDDHHMMSS
         *      01234567890123
+        * @param $zone DateTimeZone: Timezone of $ts
         * @todo handling of "o" format character for Iranian, Hebrew, Hijri & Thai?
         *
+        * @throws MWException
         * @return string
         */
-       function sprintfDate( $format, $ts ) {
+       function sprintfDate( $format, $ts, DateTimeZone $zone = null ) {
                $s = '';
                $raw = false;
                $roman = false;
                $hebrewNum = false;
-               $unix = false;
+               $dateTimeObj = false;
                $rawToggle = false;
                $iranian = false;
                $hebrew = false;
@@ -1103,6 +1106,15 @@ class Language {
                $thai = false;
                $minguo = false;
                $tenno = false;
+
+               if ( strlen( $ts ) !== 14 ) {
+                       throw new MWException( __METHOD__ . ": The timestamp $ts should have 14 characters" );
+               }
+
+               if ( !ctype_digit( $ts ) ) {
+                       throw new MWException( __METHOD__ . ": The timestamp $ts should be a number" );
+               }
+
                for ( $p = 0; $p < strlen( $format ); $p++ ) {
                        $num = false;
                        $code = $format[$p];
@@ -1134,15 +1146,21 @@ class Language {
                                        $s .= $this->getMonthNameGen( substr( $ts, 4, 2 ) );
                                        break;
                                case 'xjx':
-                                       if ( !$hebrew ) $hebrew = self::tsToHebrew( $ts );
+                                       if ( !$hebrew ) {
+                                               $hebrew = self::tsToHebrew( $ts );
+                                       }
                                        $s .= $this->getHebrewCalendarMonthNameGen( $hebrew[1] );
                                        break;
                                case 'd':
                                        $num = substr( $ts, 6, 2 );
                                        break;
                                case 'D':
-                                       if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
-                                       $s .= $this->getWeekdayAbbreviation( gmdate( 'w', $unix ) + 1 );
+                                       if ( !$dateTimeObj ) {
+                                               $dateTimeObj = DateTime::createFromFormat(
+                                                       'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+                                               );
+                                       }
+                                       $s .= $this->getWeekdayAbbreviation( $dateTimeObj->format( 'w' ) + 1 );
                                        break;
                                case 'j':
                                        $num = intval( substr( $ts, 6, 2 ) );
@@ -1166,35 +1184,12 @@ class Language {
                                        $num = $hebrew[2];
                                        break;
                                case 'l':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
+                                       if ( !$dateTimeObj ) {
+                                               $dateTimeObj = DateTime::createFromFormat(
+                                                       'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+                                               );
                                        }
-                                       $s .= $this->getWeekdayName( gmdate( 'w', $unix ) + 1 );
-                                       break;
-                               case 'N':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $w = gmdate( 'w', $unix );
-                                       $num = $w ? $w : 7;
-                                       break;
-                               case 'w':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'w', $unix );
-                                       break;
-                               case 'z':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'z', $unix );
-                                       break;
-                               case 'W':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'W', $unix );
+                                       $s .= $this->getWeekdayName( $dateTimeObj->format( 'w' ) + 1 );
                                        break;
                                case 'F':
                                        $s .= $this->getMonthName( substr( $ts, 4, 2 ) );
@@ -1244,30 +1239,12 @@ class Language {
                                        }
                                        $num = $hebrew[1];
                                        break;
-                               case 't':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 't', $unix );
-                                       break;
                                case 'xjt':
                                        if ( !$hebrew ) {
                                                $hebrew = self::tsToHebrew( $ts );
                                        }
                                        $num = $hebrew[3];
                                        break;
-                               case 'L':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'L', $unix );
-                                       break;
-                               case 'o':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $num = gmdate( 'o', $unix );
-                                       break;
                                case 'Y':
                                        $num = substr( $ts, 0, 4 );
                                        break;
@@ -1343,22 +1320,36 @@ class Language {
                                        $num = substr( $ts, 12, 2 );
                                        break;
                                case 'c':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
-                                       }
-                                       $s .= gmdate( 'c', $unix );
-                                       break;
                                case 'r':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
+                               case 'e':
+                               case 'O':
+                               case 'P':
+                               case 'T':
+                                       // Pass through string from $dateTimeObj->format()
+                                       if ( !$dateTimeObj ) {
+                                               $dateTimeObj = DateTime::createFromFormat(
+                                                       'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+                                               );
                                        }
-                                       $s .= gmdate( 'r', $unix );
+                                       $s .= $dateTimeObj->format( $code );
                                        break;
+                               case 'w':
+                               case 'N':
+                               case 'z':
+                               case 'W':
+                               case 't':
+                               case 'L':
+                               case 'o':
                                case 'U':
-                                       if ( !$unix ) {
-                                               $unix = wfTimestamp( TS_UNIX, $ts );
+                               case 'I':
+                               case 'Z':
+                                       // Pass through number from $dateTimeObj->format()
+                                       if ( !$dateTimeObj ) {
+                                               $dateTimeObj = DateTime::createFromFormat(
+                                                       'YmdHis', $ts, $zone ?: new DateTimeZone( 'UTC' )
+                                               );
                                        }
-                                       $num = $unix;
+                                       $num = $dateTimeObj->format( $code );
                                        break;
                                case '\\':
                                        # Backslash escaping
@@ -1673,7 +1664,7 @@ class Language {
        private static function hebrewYearStart( $year ) {
                $a = intval( ( 12 * ( $year - 1 ) + 17 ) % 19 );
                $b = intval( ( $year - 1 ) % 4 );
-               $m = 32.044093161144 + 1.5542417966212 * $a +  $b / 4.0 - 0.0031777940220923 * ( $year - 1 );
+               $m = 32.044093161144 + 1.5542417966212 * $a + $b / 4.0 - 0.0031777940220923 * ( $year - 1 );
                if ( $m < 0 ) {
                        $m--;
                }
@@ -1847,13 +1838,13 @@ class Language {
                }
                if ( strlen( $s ) == 2 ) {
                        $str = $s . "'";
-               } else  {
+               } else {
                        $str = substr( $s, 0, strlen( $s ) - 2 ) . '"';
                        $str .= substr( $s, strlen( $s ) - 2, 2 );
                }
                $start = substr( $str, 0, strlen( $str ) - 2 );
                $end = substr( $str, strlen( $str ) - 2 );
-               switch( $end ) {
+               switch ( $end ) {
                        case 'כ':
                                $str = $start . 'ך';
                                break;
@@ -1936,12 +1927,12 @@ class Language {
                # will normalize out-of-range values so we don't have to split $minDiff
                # into hours and minutes.
                $t = mktime( (
-                 (int)substr( $ts, 8, 2 ) ), # Hours
-                 (int)substr( $ts, 10, 2 ) + $minDiff, # Minutes
-                 (int)substr( $ts, 12, 2 ), # Seconds
-                 (int)substr( $ts, 4, 2 ), # Month
-                 (int)substr( $ts, 6, 2 ), # Day
-                 (int)substr( $ts, 0, 4 ) ); # Year
+                       (int)substr( $ts, 8, 2 ) ), # Hours
+                       (int)substr( $ts, 10, 2 ) + $minDiff, # Minutes
+                       (int)substr( $ts, 12, 2 ), # Seconds
+                       (int)substr( $ts, 4, 2 ), # Month
+                       (int)substr( $ts, 6, 2 ), # Day
+                       (int)substr( $ts, 0, 4 ) ); # Year
 
                $date = date( 'YmdHis', $t );
                wfRestoreWarnings();
@@ -1992,6 +1983,8 @@ class Language {
         * @param $type string May be date, time or both
         * @param $pref string The format name as it appears in Messages*.php
         *
+        * @since 1.22 New type 'pretty' that provides a more readable timestamp format
+        *
         * @return string
         */
        function getDateFormatString( $type, $pref ) {
@@ -2001,7 +1994,12 @@ class Language {
                                $df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
                        } else {
                                $df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
-                               if ( is_null( $df ) ) {
+
+                               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" );
                                }
@@ -2234,6 +2232,79 @@ class Language {
                return $this->internalUserTimeAndDate( 'both', $ts, $user, $options );
        }
 
+       /**
+        * Convert an MWTimestamp into a pretty human-readable timestamp using
+        * the given user preferences and relative base time.
+        *
+        * DO NOT USE THIS FUNCTION DIRECTLY. Instead, call MWTimestamp::getHumanTimestamp
+        * on your timestamp object, which will then call this function. Calling
+        * this function directly will cause hooks to be skipped over.
+        *
+        * @see MWTimestamp::getHumanTimestamp
+        * @param MWTimestamp $ts Timestamp to prettify
+        * @param MWTimestamp $relativeTo Base timestamp
+        * @param User $user User preferences to use
+        * @return string Human timestamp
+        * @since 1.21
+        */
+       public function getHumanTimestamp( MWTimestamp $ts, MWTimestamp $relativeTo, User $user ) {
+               $diff = $ts->diff( $relativeTo );
+               $diffDay = (bool)( (int)$ts->timestamp->format( 'w' ) - (int)$relativeTo->timestamp->format( 'w' ) );
+               $days = $diff->days ?: (int)$diffDay;
+               if ( $diff->invert || $days > 5 && $ts->timestamp->format( 'Y' ) !== $relativeTo->timestamp->format( 'Y' ) ) {
+                       // Timestamps are in different years: use full timestamp
+                       // Also do full timestamp for future dates
+                       /**
+                        * @FIXME Add better handling of future timestamps.
+                        */
+                       $format = $this->getDateFormatString( 'both', $user->getDatePreference() ?: 'default' );
+                       $ts = $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) );
+               } elseif ( $days > 5 ) {
+                       // Timestamps are in same year,  but more than 5 days ago: show day and month only.
+                       $format = $this->getDateFormatString( 'pretty', $user->getDatePreference() ?: 'default' );
+                       $ts = $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) );
+               } elseif ( $days > 1 ) {
+                       // Timestamp within the past week: show the day of the week and time
+                       $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+                       $weekday = self::$mWeekdayMsgs[$ts->timestamp->format( 'w' )];
+                       $ts = wfMessage( "$weekday-at" )
+                               ->inLanguage( $this )
+                               ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+                               ->text();
+               } elseif ( $days == 1 ) {
+                       // Timestamp was yesterday: say 'yesterday' and the time.
+                       $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+                       $ts = wfMessage( 'yesterday-at' )
+                               ->inLanguage( $this )
+                               ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+                               ->text();
+               } elseif ( $diff->h > 1 || $diff->h == 1 && $diff->i > 30 ) {
+                       // Timestamp was today, but more than 90 minutes ago: say 'today' and the time.
+                       $format = $this->getDateFormatString( 'time', $user->getDatePreference() ?: 'default' );
+                       $ts = wfMessage( 'today-at' )
+                               ->inLanguage( $this )
+                               ->params( $this->sprintfDate( $format, $ts->getTimestamp( TS_MW ) ) )
+                               ->text();
+
+               // From here on in, the timestamp was soon enough ago so that we can simply say
+               // XX units ago, e.g., "2 hours ago" or "5 minutes ago"
+               } elseif ( $diff->h == 1 ) {
+                       // Less than 90 minutes, but more than an hour ago.
+                       $ts = wfMessage( 'hours-ago' )->inLanguage( $this )->numParams( 1 )->text();
+               } elseif ( $diff->i >= 1 ) {
+                       // A few minutes ago.
+                       $ts = wfMessage( 'minutes-ago' )->inLanguage( $this )->numParams( $diff->i )->text();
+               } elseif ( $diff->s >= 30 ) {
+                       // Less than a minute, but more than 30 sec ago.
+                       $ts = wfMessage( 'seconds-ago' )->inLanguage( $this )->numParams( $diff->s )->text();
+               } else {
+                       // Less than 30 seconds ago.
+                       $ts = wfMessage( 'just-now' )->text();
+               }
+
+               return $ts;
+       }
+
        /**
         * @param $key string
         * @return array|null
@@ -2817,7 +2888,9 @@ class Language {
         * @since 1.20
         */
        function getDirMarkEntity( $opposite = false ) {
-               if ( $opposite ) { return $this->isRTL() ? '&lrm;' : '&rlm;'; }
+               if ( $opposite ) {
+                       return $this->isRTL() ? '&lrm;' : '&rlm;';
+               }
                return $this->isRTL() ? '&rlm;' : '&lrm;';
        }
 
@@ -2834,7 +2907,9 @@ class Language {
        function getDirMark( $opposite = false ) {
                $lrm = "\xE2\x80\x8E"; # LEFT-TO-RIGHT MARK, commonly abbreviated LRM
                $rlm = "\xE2\x80\x8F"; # RIGHT-TO-LEFT MARK, commonly abbreviated RLM
-               if ( $opposite ) { return $this->isRTL() ? $lrm : $rlm; }
+               if ( $opposite ) {
+                       return $this->isRTL() ? $lrm : $rlm;
+               }
                return $this->isRTL() ? $rlm : $lrm;
        }
 
@@ -2878,12 +2953,16 @@ class Language {
        }
 
        /**
+        * Get all magic words from cache.
         * @return array
         */
        function getMagicWords() {
                return self::$dataCache->getItem( $this->mCode, 'magicWords' );
        }
 
+       /**
+        * Run the LanguageGetMagic hook once.
+        */
        protected function doMagicHook() {
                if ( $this->mMagicHookDone ) {
                        return;
@@ -2900,17 +2979,16 @@ class Language {
         * @param $mw
         */
        function getMagic( $mw ) {
-               $this->doMagicHook();
+               // Saves a function call
+               if ( ! $this->mMagicHookDone ) {
+                       $this->doMagicHook();
+               }
 
                if ( isset( $this->mMagicExtensions[$mw->mId] ) ) {
                        $rawEntry = $this->mMagicExtensions[$mw->mId];
                } else {
-                       $magicWords = $this->getMagicWords();
-                       if ( isset( $magicWords[$mw->mId] ) ) {
-                               $rawEntry = $magicWords[$mw->mId];
-                       } else {
-                               $rawEntry = false;
-                       }
+                       $rawEntry = self::$dataCache->getSubitem(
+                               $this->mCode, 'magicWords', $mw->mId );
                }
 
                if ( !is_array( $rawEntry ) ) {
@@ -3058,7 +3136,7 @@ class Language {
                        $sign = "";
                        if ( intval( $number ) < 0 ) {
                                // For negative numbers apply the algorithm like positive number and add sign.
-                               $sign =  "-";
+                               $sign = "-";
                                $number = substr( $number, 1 );
                        }
                        $integerPart = array();
@@ -3066,20 +3144,20 @@ class Language {
                        $numMatches = preg_match_all( "/(#+)/", $digitGroupingPattern, $matches );
                        preg_match( "/\d+/", $number, $integerPart );
                        preg_match( "/\.\d*/", $number, $decimalPart );
-                       $groupedNumber = ( count( $decimalPart ) > 0 ) ? $decimalPart[0]:"";
-                       if ( $groupedNumber  === $number ) {
+                       $groupedNumber = ( count( $decimalPart ) > 0 ) ? $decimalPart[0] : "";
+                       if ( $groupedNumber === $number ) {
                                // the string does not have any number part. Eg: .12345
                                return $sign . $groupedNumber;
                        }
                        $start = $end = strlen( $integerPart[0] );
                        while ( $start > 0 ) {
-                               $match = $matches[0][$numMatches -1] ;
+                               $match = $matches[0][$numMatches - 1];
                                $matchLen = strlen( $match );
                                $start = $end - $matchLen;
                                if ( $start < 0 ) {
                                        $start = 0;
                                }
-                               $groupedNumber = substr( $number, $start, $end -$start ) . $groupedNumber ;
+                               $groupedNumber = substr( $number, $start, $end -$start ) . $groupedNumber;
                                $end = $start;
                                if ( $numMatches > 1 ) {
                                        // use the last pattern for the rest of the number
@@ -3256,9 +3334,9 @@ class Language {
                                # We got the first byte only of a multibyte char; remove it.
                                $string = substr( $string, 0, -1 );
                        } elseif ( $char >= 0x80 &&
-                                 preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
-                                                         '[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m ) )
-                       {
+                               preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
+                                       '[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m )
+                       {
                                # We chopped in the middle of a character; remove it
                                $string = $m[1];
                        }
@@ -3342,7 +3420,9 @@ class Language {
                                        break;
                                }
                        }
-                       if ( $pos >= $textLen ) break; // extra iteration just for above checks
+                       if ( $pos >= $textLen ) {
+                               break; // extra iteration just for above checks
+                       }
 
                        # Read the next char...
                        $ch = $text[$pos];
@@ -3475,7 +3555,7 @@ class Language {
        function getGrammarForms() {
                global $wgGrammarForms;
                if ( isset( $wgGrammarForms[$this->getCode()] ) && is_array( $wgGrammarForms[$this->getCode()] ) ) {
-                        return $wgGrammarForms[$this->getCode()];
+                       return $wgGrammarForms[$this->getCode()];
                }
                return array();
        }
@@ -3528,10 +3608,6 @@ class Language {
         * @return string Correct form of plural for $count in this language
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) {
-                       return '';
-               }
-
                // Handle explicit n=pluralform cases
                foreach ( $forms as $index => $form ) {
                        if ( preg_match( '/\d+=/i', $form ) ) {
@@ -3542,9 +3618,13 @@ class Language {
                                unset( $forms[$index] );
                        }
                }
+
                $forms = array_values( $forms );
+               if ( !count( $forms ) ) {
+                       return '';
+               }
 
-               $pluralForm = $this->getPluralForm( $count );
+               $pluralForm = $this->getPluralRuleIndexNumber( $count );
                $pluralForm = min( $pluralForm, count( $forms ) - 1 );
                return $forms[$pluralForm];
        }
@@ -3988,39 +4068,30 @@ class Language {
         * Get the ordered list of fallback languages, ending with the fallback
         * language chain for the site language.
         *
-        * @since 1.21
-        * @param $code string Language code
-        * @return array
+        * @since 1.22
+        * @param string $code Language code
+        * @return array array( fallbacks, site fallbacks )
         */
        public static function getFallbacksIncludingSiteLanguage( $code ) {
                global $wgLanguageCode;
 
                // Usually, we will only store a tiny number of fallback chains, so we
                // keep them in static memory.
-               static $fallbackLanguageCache = array();
                $cacheKey = "{$code}-{$wgLanguageCode}";
 
-               if ( !array_key_exists( $cacheKey, $fallbackLanguageCache ) ) {
+               if ( !array_key_exists( $cacheKey, self::$fallbackLanguageCache ) ) {
                        $fallbacks = self::getFallbacksFor( $code );
 
-                       // Take the final 'en' off of the array before splicing
-                       if ( end( $fallbacks ) === 'en' ) {
-                               array_pop( $fallbacks );
-                       }
-                       // Append the site's fallback chain
+                       // Append the site's fallback chain, including the site language itself
                        $siteFallbacks = self::getFallbacksFor( $wgLanguageCode );
+                       array_unshift( $siteFallbacks, $wgLanguageCode );
 
                        // Eliminate any languages already included in the chain
-                       $siteFallbacks = array_intersect( array_diff( $siteFallbacks, $fallbacks ), $siteFallbacks );
-                       if ( $siteFallbacks ) {
-                               $fallbacks = array_merge( $fallbacks, $siteFallbacks );
-                       }
-                       if ( end( $fallbacks ) !== 'en' ) {
-                               $fallbacks[] = 'en';
-                       }
-                       $fallbackLanguageCache[$cacheKey] = $fallbacks;
+                       $siteFallbacks = array_diff( $siteFallbacks, $fallbacks );
+
+                       self::$fallbackLanguageCache[$cacheKey] = array( $fallbacks, $siteFallbacks );
                }
-               return $fallbackLanguageCache[$cacheKey];
+               return self::$fallbackLanguageCache[$cacheKey];
        }
 
        /**
@@ -4123,15 +4194,14 @@ class Language {
         * @since 1.18
         */
        public function formatExpiry( $expiry, $format = true ) {
-               static $infinity, $infinityMsg;
+               static $infinity;
                if ( $infinity === null ) {
-                       $infinityMsg = wfMessage( 'infiniteblock' );
                        $infinity = wfGetDB( DB_SLAVE )->getInfinity();
                }
 
                if ( $expiry == '' || $expiry == $infinity ) {
                        return $format === true
-                               ? $infinityMsg
+                               ? $this->getMessageFromDB( 'infiniteblock' )
                                : $infinity;
                } else {
                        return $format === true
@@ -4410,7 +4480,7 @@ class Language {
        /**
         * Get the plural rules for the language
         * @since 1.20
-        * @return array Associative array with plural form, and plural rule as key-value pairs
+        * @return array Associative array with plural form number and plural rule as key-value pairs
         */
        public function getPluralRules() {
                $pluralRules = self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRules' );
@@ -4427,13 +4497,48 @@ class Language {
        }
 
        /**
-        * Find the plural form matching to the given number
-        * It return the form index.
-        * @return int The index of the plural form
+        * Get the plural rule types for the language
+        * @since 1.21
+        * @return array Associative array with plural form number and plural rule type as key-value pairs
+        */
+       public function getPluralRuleTypes() {
+               $pluralRuleTypes = self::$dataCache->getItem( strtolower( $this->mCode ), 'pluralRuleTypes' );
+               $fallbacks = Language::getFallbacksFor( $this->mCode );
+               if ( !$pluralRuleTypes ) {
+                       foreach ( $fallbacks as $fallbackCode ) {
+                               $pluralRuleTypes = self::$dataCache->getItem( strtolower( $fallbackCode ), 'pluralRuleTypes' );
+                               if ( $pluralRuleTypes ) {
+                                       break;
+                               }
+                       }
+               }
+               return $pluralRuleTypes;
+       }
+
+       /**
+        * Find the index number of the plural rule appropriate for the given number
+        * @return int The index number of the plural rule
         */
-       private function getPluralForm( $number ) {
+       public function getPluralRuleIndexNumber( $number ) {
                $pluralRules = $this->getCompiledPluralRules();
                $form = CLDRPluralRuleEvaluator::evaluateCompiled( $number, $pluralRules );
                return $form;
        }
+
+       /**
+        * Find the plural rule type appropriate for the given number
+        * For example, if the language is set to Arabic, getPluralType(5) should
+        * return 'few'.
+        * @since 1.21
+        * @return string The name of the plural rule type, e.g. one, two, few, many
+        */
+       public function getPluralRuleType( $number ) {
+               $index = $this->getPluralRuleIndexNumber( $number );
+               $pluralRuleTypes = $this->getPluralRuleTypes();
+               if ( isset( $pluralRuleTypes[$index] ) ) {
+                       return $pluralRuleTypes[$index];
+               } else {
+                       return 'other';
+               }
+       }
 }
index 43afe65..e13cb59 100644 (file)
@@ -258,7 +258,7 @@ class LanguageConverter {
                // Get language variant preference from logged in users
                // Don't call this on stub objects because that causes infinite
                // recursion during initialisation
-               if ( $wgUser->isLoggedIn() )  {
+               if ( $wgUser->isLoggedIn() ) {
                        $ret = $wgUser->getOption( 'variant' );
                } else {
                        // figure out user lang without constructing wgLang to avoid
@@ -344,7 +344,7 @@ class LanguageConverter {
                        }
                }
 
-               if( $this->guessVariant( $text, $toVariant ) ) {
+               if ( $this->guessVariant( $text, $toVariant ) ) {
                        wfProfileOut( __METHOD__ );
                        return $text;
                }
@@ -364,11 +364,11 @@ class LanguageConverter {
                // this one is needed when the text is inside an HTML markup
                $htmlfix = '|<[^>]+$|^[^<>]*>';
 
-               // disable convert to variants between <code></code> tags
+               // disable convert to variants between <code> tags
                $codefix = '<code>.+?<\/code>|';
-               // disable convertsion of <script type="text/javascript"> ... </script>
+               // disable conversion of <script> tags
                $scriptfix = '<script.*?>.*?<\/script>|';
-               // disable conversion of <pre xxxx> ... </pre>
+               // disable conversion of <pre> tags
                $prefix = '<pre.*?>.*?<\/pre>|';
 
                $reg = '/' . $codefix . $scriptfix . $prefix .
@@ -644,14 +644,14 @@ class LanguageConverter {
                        if ( $pos === false ) {
                                // No more markup, append final segment
                                $fragment = substr( $text, $startPos );
-                               $out .= $shouldConvert? $this->autoConvert( $fragment, $variant ): $fragment;
+                               $out .= $shouldConvert ? $this->autoConvert( $fragment, $variant ) : $fragment;
                                return $out;
                        }
 
                        // Markup found
                        // Append initial segment
                        $fragment = substr( $text, $startPos, $pos - $startPos );
-                       $out .= $shouldConvert? $this->autoConvert( $fragment, $variant ): $fragment;
+                       $out .= $shouldConvert ? $this->autoConvert( $fragment, $variant ) : $fragment;
 
                        // Advance position
                        $startPos = $pos;
@@ -687,7 +687,7 @@ class LanguageConverter {
 
                while ( $startPos < $length ) {
                        $m = false;
-                       preg_match( '/-\{|\}-/', $text, $m,  PREG_OFFSET_CAPTURE, $startPos );
+                       preg_match( '/-\{|\}-/', $text, $m, PREG_OFFSET_CAPTURE, $startPos );
                        if ( !$m ) {
                                // Unclosed rule
                                break;
@@ -833,7 +833,7 @@ class LanguageConverter {
         * @author Nikola Smolenski <smolensk@eunet.rs>
         * @since 1.19
         */
-       public function guessVariant($text, $variant) {
+       public function guessVariant( $text, $variant ) {
                return false;
        }
 
@@ -941,7 +941,7 @@ class LanguageConverter {
                $parsed[$key] = true;
 
                if ( $subpage === '' ) {
-                       $txt = MessageCache::singleton()->get( 'conversiontable', true, $code );
+                       $txt = MessageCache::singleton()->getMsgFromNamespace( $key, $code );
                } else {
                        $txt = false;
                        $title = Title::makeTitleSafe( NS_MEDIAWIKI, $key );
@@ -952,7 +952,7 @@ class LanguageConverter {
                                                $txt = $revision->getContent( Revision::RAW )->getNativeData();
                                        }
 
-                                       //@todo: in the future, use a specialized content model, perhaps based on json!
+                                       // @todo in the future, use a specialized content model, perhaps based on json!
                                }
                        }
                }
@@ -1259,14 +1259,14 @@ class ConverterRule {
                $choice = preg_split( $varsep_pattern, $rules );
 
                foreach ( $choice as $c ) {
-                       $v  = explode( ':', $c, 2 );
+                       $v = explode( ':', $c, 2 );
                        if ( count( $v ) != 2 ) {
                                // syntax error, skip
                                continue;
                        }
                        $to = trim( $v[1] );
-                       $v  = trim( $v[0] );
-                       $u  = explode( '=>', $v, 2 );
+                       $v = trim( $v[0] );
+                       $u = explode( '=>', $v, 2 );
                        // if $to is empty, strtr() could return a wrong result
                        if ( count( $u ) == 1 && $to && in_array( $v, $variants ) ) {
                                $bidtable[$v] = $to;
@@ -1357,6 +1357,37 @@ class ConverterRule {
                }
        }
 
+       /**
+        * Similar to getRuleConvertedStr(), but this prefers to use original
+        * page title if $variant === $this->mConverter->mMainLanguageCode
+        * and may return false in this case (so this title conversion rule
+        * will be ignored and the original title is shown).
+        *
+        * @since 1.21
+        * @param $variant The variant code to display page title in
+        * @return String|false The converted title or false if just page name
+        */
+       function getRuleConvertedTitle( $variant ) {
+               if ( $variant === $this->mConverter->mMainLanguageCode ) {
+                       // If a string targeting exactly this variant is set,
+                       // use it. Otherwise, just return false, so the real
+                       // page name can be shown (and because variant === main,
+                       // there'll be no further automatic conversion).
+                       $disp = $this->getTextInBidtable( $variant );
+                       if ( $disp ) {
+                               return $disp;
+                       }
+                       if ( array_key_exists( $variant, $this->mUnidtable ) ) {
+                               $disp = array_values( $this->mUnidtable[$variant] );
+                               $disp = $disp[0];
+                       }
+                       // Assigned above or still false.
+                       return $disp;
+               } else {
+                       return $this->getRuleConvertedStr( $variant );
+               }
+       }
+
        /**
         * Generate conversion table for all text.
         * @private
@@ -1439,7 +1470,7 @@ class ConverterRule {
                                   // then we check its fallback variants.
                                $variantFallbacks =
                                        $this->mConverter->getVariantFallbacks( $variant );
-                               if( is_array( $variantFallbacks ) ) {
+                               if ( is_array( $variantFallbacks ) ) {
                                        foreach ( $variantFallbacks as $variantFallback ) {
                                                // if current variant's fallback exist in flags
                                                if ( isset( $this->mVariantFlags[$variantFallback] ) ) {
@@ -1509,7 +1540,7 @@ class ConverterRule {
                                        $this->mRuleDisplay = $this->getRuleConvertedStr( $variant );
                                        break;
                                case 'T':
-                                       $this->mRuleTitle = $this->getRuleConvertedStr( $variant );
+                                       $this->mRuleTitle = $this->getRuleConvertedTitle( $variant );
                                        $this->mRuleDisplay = '';
                                        break;
                                default:
index bce1663..027c054 100644 (file)
  */
 
 /**
 * These determine things like interwikis, language selectors, and so on.
 * Safe to change without running scripts on the respective sites.
 *
 * \xE2\x80\x8E is the left-to-right marker and
 * \xE2\x80\x8F is the right-to-left marker.
 * They are required for ensuring the correct display of brackets in
 * mixed rtl/ltr environment.
 *
 * Some writing systems require some line-height fixes. This includes
 * most Indic scripts, like Devanagari.
 * If you are adding support for such a language, add it also to
 * the relevant section in skins/common/shared.css.
 *
 * @ingroup Language
 */
+ * These determine things like interwikis, language selectors, and so on.
+ * Safe to change without running scripts on the respective sites.
+ *
+ * \xE2\x80\x8E is the left-to-right marker and
+ * \xE2\x80\x8F is the right-to-left marker.
+ * They are required for ensuring the correct display of brackets in
+ * mixed rtl/ltr environment.
+ *
+ * Some writing systems require some line-height fixes. This includes
+ * most Indic scripts, like Devanagari.
+ * If you are adding support for such a language, add it also to
+ * the relevant section in skins/common/shared.css.
+ *
+ * @ingroup Language
+ */
 /* private */ $coreLanguageNames = array(
        'aa' => 'Qafár af',    # Afar
        'ab' => 'Аҧсшәа', # Abkhaz
@@ -54,7 +54,7 @@
        'arn' => 'mapudungun',  # Mapuche, Mapudungu, Araucanian (Araucano)
        'ary' => 'Maġribi',    # Moroccan Spoken Arabic
        'arz' => 'مصرى',    # Egyptian Spoken Arabic
-       'as' => 'à¦\85সমà§\80à§\9fা',   # Assamese
+       'as' => 'à¦\85সমà§\80য়া',        # Assamese
        'ast' => 'asturianu',   # Asturian
        'av' => 'авар',     # Avar
        'avk' => 'Kotava', # Kotava
@@ -64,6 +64,8 @@
        'ba' => 'башҡортса',   # Bashkir
        'bar' => 'Boarisch',    # Bavarian (Austro-Bavarian and South Tyrolean)
        'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
+       'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
+       'bbc-latn' => 'Batak Toba', # Batak Toba
        'bcc' => 'بلوچی مکرانی', # Southern Balochi
        'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
        'be' => 'беларуская', #  Belarusian normative
        'ho' => 'Hiri Motu',    # Hiri Motu
        'hr' => 'hrvatski',             # Croatian
        'hsb' => 'hornjoserbsce',       # Upper Sorbian
-       'ht'  => 'Kreyòl ayisyen',             # Haitian Creole French
+       'ht' => 'Kreyòl ayisyen',              # Haitian Creole French
        'hu' => 'magyar',               # Hungarian
        'hy' => 'Հայերեն',       # Armenian
        'hz' => 'Otsiherero',   # Herero
        'ks-arab' => 'کٲشُر',      # Kashmiri (Perso-Arabic script)
        'ks-deva' => 'कॉशुर', # Kashmiri (Devanagari script)
        'ksh' => 'Ripoarisch',  # Ripuarian
-       'ku'  => 'Kurdî',      # Kurdish (multiple scripts - defaults to Latin)
+       'ku' => 'Kurdî',       # Kurdish (multiple scripts - defaults to Latin)
        'ku-latn' => "Kurdî (latînî)\xE2\x80\x8E",   # Northern Kurdish (Latin script)
        'ku-arab' => "كوردي (عەرەبی)\xE2\x80\x8F",   # Northern Kurdish (Arabic script) (falls back to ckb)
        'kv' => 'коми',     # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
        'liv' => 'Līvõ kēļ',        # Livonian
        'lmo' => 'lumbaart',    # Lombard
        'ln' => 'lingála',             # Lingala
-       'lo' => 'ລາວ',# Laotian
+       'lo' => 'ລາວ',    # Laotian
        'loz' => 'Silozi', # Lozi
        'lt' => 'lietuvių',    # Lithuanian
        'ltg' => 'latgaļu',    # Latgalian
        'ny' => 'Chi-Chewa',    # Chichewa
        'oc' => 'occitan',              # Occitan
        'om' => 'Oromoo',               # Oromo
-       'or' => 'à¬\93à­\9cିà¬\86',         # Oriya
+       'or' => 'à¬\93ଡ଼ିà¬\86',              # Oriya
        'os' => 'Ирон', # Ossetic -- fixed per bug 29091
        'pa' => 'ਪੰਜਾਬੀ', # Eastern Punjabi (Gurmukhi script) (pan)
        'pag' => 'Pangasinan',  # Pangasinan
index b781d7a..6497b50 100644 (file)
@@ -46,13 +46,17 @@ class LanguageBe_tarask extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
 
                // If the actual number is not mentioned in the expression, then just two forms are enough:
                // singular for $count == 1
                // plural   for $count != 1
                // For example, "This user belongs to {{PLURAL:$1|one group|several groups}}."
-               if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+               if ( count( $forms ) === 2 ) {
+                       return $count == 1 ? $forms[0] : $forms[1];
+               }
 
                // @todo FIXME: CLDR defines 4 plural forms instead of 3
                //        http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
@@ -62,10 +66,10 @@ class LanguageBe_tarask extends Language {
                        return $forms[2];
                } else {
                        switch ( $count % 10 ) {
-                               case 1:  return $forms[0];
+                               case 1: return $forms[0];
                                case 2:
                                case 3:
-                               case 4:  return $forms[1];
+                               case 4: return $forms[1];
                                default: return $forms[2];
                        }
                }
index 2016a43..454ce34 100644 (file)
@@ -48,18 +48,19 @@ class LanguageCu extends Language {
                # join and array_slice instead mb_substr
                $ar = array();
                preg_match_all( '/./us', $word, $ar );
-               if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
+               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], -2 ) ) == 'ї' )
+                                       if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' ) ) {
+                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ї' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'їѩ';
+                                       }
                                        break;
                                case 'accusative': # винительный падеж
                                        # stub
                                        break;
                        }
+               }
                return $word;
        }
 
@@ -69,14 +70,16 @@ class LanguageCu extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 4 );
 
                switch ( $count % 10 ) {
-                       case 1:  return $forms[0];
-                       case 2:  return $forms[1];
+                       case 1: return $forms[0];
+                       case 2: return $forms[1];
                        case 3:
-                       case 4:  return $forms[2];
+                       case 4: return $forms[2];
                        default: return $forms[3];
                }
        }
index 8f84322..39bdfb5 100644 (file)
@@ -78,14 +78,14 @@ class LanguageEo extends Language {
         * @return string
         */
        function strrtuxCallback( $matches ) {
-               static $ux = array (
-                       'x' => 'xx' , 'X' => 'Xx' ,
-                       "\xc4\x88" => "Cx" , "\xc4\x89" => "cx" ,
-                       "\xc4\x9c" => "Gx" , "\xc4\x9d" => "gx" ,
-                       "\xc4\xa4" => "Hx" , "\xc4\xa5" => "hx" ,
-                       "\xc4\xb4" => "Jx" , "\xc4\xb5" => "jx" ,
-                       "\xc5\x9c" => "Sx" , "\xc5\x9d" => "sx" ,
-                       "\xc5\xac" => "Ux" , "\xc5\xad" => "ux"
+               static $ux = array(
+                       'x' => 'xx', 'X' => 'Xx',
+                       "\xc4\x88" => "Cx", "\xc4\x89" => "cx",
+                       "\xc4\x9c" => "Gx", "\xc4\x9d" => "gx",
+                       "\xc4\xa4" => "Hx", "\xc4\xa5" => "hx",
+                       "\xc4\xb4" => "Jx", "\xc4\xb5" => "jx",
+                       "\xc5\x9c" => "Sx", "\xc5\x9d" => "sx",
+                       "\xc5\xac" => "Ux", "\xc5\xad" => "ux",
                );
                return strtr( $matches[1], $ux );
        }
@@ -95,21 +95,21 @@ class LanguageEo extends Language {
         * @return string
         */
        function strrtxuCallback( $matches ) {
-               static $xu = array (
-                       'xx' => 'x' , 'xX' => 'x' ,
-                       'Xx' => 'X' , 'XX' => 'X' ,
-                       "Cx" => "\xc4\x88" , "CX" => "\xc4\x88" ,
-                       "cx" => "\xc4\x89" , "cX" => "\xc4\x89" ,
-                       "Gx" => "\xc4\x9c" , "GX" => "\xc4\x9c" ,
-                       "gx" => "\xc4\x9d" , "gX" => "\xc4\x9d" ,
-                       "Hx" => "\xc4\xa4" , "HX" => "\xc4\xa4" ,
-                       "hx" => "\xc4\xa5" , "hX" => "\xc4\xa5" ,
-                       "Jx" => "\xc4\xb4" , "JX" => "\xc4\xb4" ,
-                       "jx" => "\xc4\xb5" , "jX" => "\xc4\xb5" ,
-                       "Sx" => "\xc5\x9c" , "SX" => "\xc5\x9c" ,
-                       "sx" => "\xc5\x9d" , "sX" => "\xc5\x9d" ,
-                       "Ux" => "\xc5\xac" , "UX" => "\xc5\xac" ,
-                       "ux" => "\xc5\xad" , "uX" => "\xc5\xad"
+               static $xu = array(
+                       'xx' => 'x', 'xX' => 'x',
+                       'Xx' => 'X', 'XX' => 'X',
+                       "Cx" => "\xc4\x88", "CX" => "\xc4\x88",
+                       "cx" => "\xc4\x89", "cX" => "\xc4\x89",
+                       "Gx" => "\xc4\x9c", "GX" => "\xc4\x9c",
+                       "gx" => "\xc4\x9d", "gX" => "\xc4\x9d",
+                       "Hx" => "\xc4\xa4", "HX" => "\xc4\xa4",
+                       "hx" => "\xc4\xa5", "hX" => "\xc4\xa5",
+                       "Jx" => "\xc4\xb4", "JX" => "\xc4\xb4",
+                       "jx" => "\xc4\xb5", "jX" => "\xc4\xb5",
+                       "Sx" => "\xc5\x9c", "SX" => "\xc5\x9c",
+                       "sx" => "\xc5\x9d", "sX" => "\xc5\x9d",
+                       "Ux" => "\xc5\xac", "UX" => "\xc5\xac",
+                       "ux" => "\xc5\xad", "uX" => "\xc5\xad",
                );
                return strtr( $matches[1], $xu ) . strtr( $matches[2], $xu );
        }
@@ -127,9 +127,9 @@ class LanguageEo extends Language {
                if ( $ishigh and !$isutf ) {
                        # Assume Latin1
                        $s = utf8_encode( $s );
-               } else {
-                       if ( preg_match( '/(\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]' .
-                               '|\xc5[\x9c\x9d\xac\xad])/', $s ) )
+               } elseif ( preg_match( '/(\xc4[\x88\x89\x9c\x9d\xa4\xa5\xb4\xb5]' .
+                               '|\xc5[\x9c\x9d\xac\xad])/', $s )
+               ) {
                        return $s;
                }
 
index 6a2820d..ee1d1b5 100644 (file)
@@ -53,12 +53,14 @@ class LanguageFi extends Language {
                # The general case cannot be handled without a dictionary, but there's at least one notable
                # special case we should check for:
 
-               if ( preg_match( '/wiki$/i', $word ) )
+               if ( preg_match( '/wiki$/i', $word ) ) {
                        $aou = false;
+               }
 
                # append i after final consonant
-               if ( preg_match( '/[bcdfghjklmnpqrstvwxz]$/i', $word ) )
+               if ( preg_match( '/[bcdfghjklmnpqrstvwxz]$/i', $word ) ) {
                        $word .= 'i';
+               }
 
                switch ( $case ) {
                        case 'genitive':
index 2f58384..339ad4d 100644 (file)
@@ -46,19 +46,26 @@ class LanguageGa extends Language {
                case 'ainmlae':
                        switch ( $word ) {
                        case 'an Domhnach':
-                               $word = 'Dé Domhnaigh'; break;
+                               $word = 'Dé Domhnaigh';
+                               break;
                        case 'an Luan':
-                               $word = 'Dé Luain'; break;
+                               $word = 'Dé Luain';
+                               break;
                        case 'an Mháirt':
-                               $word = 'Dé Mháirt'; break;
+                               $word = 'Dé Mháirt';
+                               break;
                        case 'an Chéadaoin':
-                               $word = 'Dé Chéadaoin'; break;
+                               $word = 'Dé Chéadaoin';
+                               break;
                        case 'an Déardaoin':
-                               $word = 'Déardaoin'; break;
+                               $word = 'Déardaoin';
+                               break;
                        case 'an Aoine':
-                               $word = 'Dé hAoine'; break;
+                               $word = 'Dé hAoine';
+                               break;
                        case 'an Satharn':
-                               $word = 'Dé Sathairn'; break;
+                               $word = 'Dé Sathairn';
+                               break;
                        }
                }
                return $word;
index 0d652d4..d81574d 100644 (file)
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageZh.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageZh.php';
 
 /**
  * @ingroup Language
@@ -50,7 +50,7 @@ class GanConverter extends LanguageConverter {
                                                                        $flags,
                                                                        $manualLevel );
                $names = array(
-                       'gan'      => '原文',
+                       'gan' => '原文',
                        'gan-hans' => '简体',
                        'gan-hant' => '繁體',
                );
@@ -58,11 +58,11 @@ class GanConverter extends LanguageConverter {
        }
 
        function loadDefaultTables() {
-               require( __DIR__ . "/../../includes/ZhConversion.php" );
+               require __DIR__ . '/../../includes/ZhConversion.php';
                $this->mTables = array(
                        'gan-hans' => new ReplacementArray( $zh2Hans ),
                        'gan-hant' => new ReplacementArray( $zh2Hant ),
-                       'gan'      => new ReplacementArray
+                       'gan' => new ReplacementArray
                );
        }
 
@@ -89,12 +89,12 @@ class LanguageGan extends LanguageZh {
 
                $variants = array( 'gan', 'gan-hans', 'gan-hant' );
                $variantfallbacks = array(
-                       'gan'      => array( 'gan-hans', 'gan-hant' ),
+                       'gan' => array( 'gan-hans', 'gan-hant' ),
                        'gan-hans' => array( 'gan' ),
                        'gan-hant' => array( 'gan' ),
                );
                $ml = array(
-                       'gan'      => 'disable',
+                       'gan' => 'disable',
                );
 
                $this->mConverter = new GanConverter( $this, 'gan',
@@ -105,28 +105,6 @@ class LanguageGan extends LanguageZh {
                $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
-       /**
-        * this should give much better diff info
-        *
-        * @param $text string
-        * @return string
-        */
-       function segmentForDiff( $text ) {
-               return preg_replace(
-                       "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-                       "' ' .\"$1\"", $text );
-       }
-
-       /**
-        * @param $text string
-        * @return string
-        */
-       function unsegmentForDiff( $text ) {
-               return preg_replace(
-                       "/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-                       "\"$1\"", $text );
-       }
-
        /**
         * word segmentation
         *
@@ -139,15 +117,4 @@ class LanguageGan extends LanguageZh {
                return parent::normalizeForSearch( $string, $autoVariant );
        }
 
-       /**
-        * @param $termsArray array
-        * @return array
-        */
-       function convertForSearchResult( $termsArray ) {
-               $terms = implode( '|', $termsArray );
-               $terms = self::convertDoubleWidth( $terms );
-               $terms = implode( '|', $this->mConverter->autoConvertToAllVariants( $terms ) );
-               $ret = array_unique( explode( '|', $terms ) );
-               return $ret;
-       }
 }
index 70b80ad..ba8a53c 100644 (file)
@@ -35,7 +35,9 @@ class LanguageGv extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
 
                $forms = $this->preConvertPlural( $forms, 4 );
 
index 6a2302c..6f7edb4 100644 (file)
@@ -36,7 +36,9 @@ class LanguageHi extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 2 );
 
                return ( $count <= 1 ) ? $forms[0] : $forms[1];
index a0e9a87..910bc10 100644 (file)
@@ -34,7 +34,9 @@ class LanguageHr extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                // @todo FIXME: CLDR defines 4 plural forms instead of 3. Plural for for decimals is missing.
                //        http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
                $forms = $this->preConvertPlural( $forms, 3 );
@@ -43,10 +45,10 @@ class LanguageHr extends Language {
                        return $forms[2];
                } else {
                        switch ( $count % 10 ) {
-                               case 1:  return $forms[0];
+                               case 1: return $forms[0];
                                case 2:
                                case 3:
-                               case 4:  return $forms[1];
+                               case 4: return $forms[1];
                                default: return $forms[2];
                        }
                }
index 5079813..2406829 100644 (file)
@@ -49,17 +49,18 @@ class LanguageHy extends Language {
                # join and array_slice instead mb_substr
                $ar = array();
                preg_match_all( '/./us', $word, $ar );
-               if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
+               if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
                        switch ( $case ) {
                                case 'genitive': # սեռական հոլով
-                                       if ( join( '', array_slice( $ar[0], -1 ) ) == 'ա' )
+                                       if ( join( '', array_slice( $ar[0], -1 ) ) == 'ա' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'այի';
-                                       elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ո' )
+                                       } elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ո' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'ոյի';
-                                       elseif ( join( '', array_slice( $ar[0], -4 ) ) == 'գիրք' )
+                                       } elseif ( join( '', array_slice( $ar[0], -4 ) ) == 'գիրք' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -4 ) ) . 'գրքի';
-                                       else
+                                       } else {
                                                $word .= 'ի';
+                                       }
                                        break;
                                case 'dative':  # Տրական հոլով
                                        # stub
@@ -74,6 +75,7 @@ class LanguageHy extends Language {
                                        # stub
                                        break;
                        }
+               }
                return $word;
        }
 
index fe5cdf8..abd2e7c 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
 
 /**
  * Conversion script between Latin and Syllabics for Inuktitut.
@@ -92,7 +92,7 @@ class IuConverter extends LanguageConverter {
                        'lowercase' => new ReplacementArray( $this->mUpperToLowerCaseLatin ),
                        'ike-cans' => new ReplacementArray( $this->mToSyllabics ),
                        'ike-latn' => new ReplacementArray( $this->mToLatin ),
-                       'iu'    => new ReplacementArray()
+                       'iu' => new ReplacementArray()
                );
        }
 
@@ -144,17 +144,19 @@ class IuConverter extends LanguageConverter {
         * @param $ignoreOtherCond bool
         */
        function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
-                // check for user namespace
+               // check for user namespace
                if ( is_object( $nt ) ) {
                        $ns = $nt->getNamespace();
-                       if ( $ns == NS_USER || $ns == NS_USER_TALK )
+                       if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
                                return;
+                       }
                }
 
                $oldlink = $link;
                parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-               if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+               if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
                        $link = $oldlink;
+               }
        }
 
        /**
@@ -168,9 +170,11 @@ class IuConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
-                       if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+                       if ( preg_match( "/^$imagename:/", $text ) ) {
+                               return $text;
+                       }
                }
                return parent::autoConvert( $text, $toVariant );
        }
@@ -189,7 +193,7 @@ class IuConverter extends LanguageConverter {
                if ( trim( $text ) ) {
                        $this->loadTables();
                        // To syllabics, first translate uppercase to lowercase Latin
-                       if($toVariant == 'ike-cans') {
+                       if ( $toVariant == 'ike-cans' ) {
                                $text = $this->mTables['lowercase']->replace( $text );
                        }
                        $text = $this->mTables[$toVariant]->replace( $text );
index 0318fb1..6203b4b 100644 (file)
@@ -41,7 +41,7 @@ class LanguageKaa extends Language {
        function convertGrammar( $word, $case ) {
                global $wgGrammarForms;
                if ( isset( $wgGrammarForms['kaa'][$case][$word] ) ) {
-                    return $wgGrammarForms['kaa'][$case][$word];
+                       return $wgGrammarForms['kaa'][$case][$word];
                }
                /* Full code of function convertGrammar() is in development. Updates coming soon. */
                return $word;
index f6bbae7..f96b0d9 100644 (file)
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageKk_cyrl.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageKk_cyrl.php';
 
 define( 'KK_C_UC', 'АӘБВГҒДЕЁЖЗИЙКҚЛМНҢОӨПРСТУҰҮФХҺЦЧШЩЪЫІЬЭЮЯ' ); # Kazakh Cyrillic uppercase
 define( 'KK_C_LC', 'аәбвгғдеёжзийкқлмнңоөпрстуұүфхһцчшщъыіьэюя' ); # Kazakh Cyrillic lowercase
@@ -62,24 +62,24 @@ class KkConverter extends LanguageConverter {
        }
 
        function loadDefaultTables() {
-               // require( __DIR__."/../../includes/KkConversion.php" );
+               // require __DIR__."/../../includes/KkConversion.php";
                // Placeholder for future implementing. Remove variables declarations
                // after generating KkConversion.php
                $kk2Cyrl = array();
                $kk2Latn = array();
                $kk2Arab = array();
-               $kk2KZ   = array();
-               $kk2TR   = array();
-               $kk2CN   = array();
+               $kk2KZ = array();
+               $kk2TR = array();
+               $kk2CN = array();
 
                $this->mTables = array(
                        'kk-cyrl' => new ReplacementArray( $kk2Cyrl ),
                        'kk-latn' => new ReplacementArray( $kk2Latn ),
                        'kk-arab' => new ReplacementArray( $kk2Arab ),
-                       'kk-kz'   => new ReplacementArray( array_merge( $kk2Cyrl, $kk2KZ ) ),
-                       'kk-tr'   => new ReplacementArray( array_merge( $kk2Latn, $kk2TR ) ),
-                       'kk-cn'   => new ReplacementArray( array_merge( $kk2Arab, $kk2CN ) ),
-                       'kk'      => new ReplacementArray()
+                       'kk-kz' => new ReplacementArray( array_merge( $kk2Cyrl, $kk2KZ ) ),
+                       'kk-tr' => new ReplacementArray( array_merge( $kk2Latn, $kk2TR ) ),
+                       'kk-cn' => new ReplacementArray( array_merge( $kk2Arab, $kk2CN ) ),
+                       'kk' => new ReplacementArray()
                );
        }
 
@@ -173,9 +173,9 @@ class KkConverter extends LanguageConverter {
                        # # Punctuation -> Arabic
                        '/#|№|No\./u' => '؀', # &#x0600;
                        '/\,/' => '،', # &#x060C;
-                       '/;/'  => '؛', # &#x061B;
+                       '/;/' => '؛', # &#x061B;
                        '/\?/' => '؟', # &#x061F;
-                       '/%/'  => '٪', # &#x066A;
+                       '/%/' => '٪', # &#x066A;
                        '/\*/' => '٭', # &#x066D;
                        # # Digits -> Arabic
                        '/0/' => '۰', # &#x06F0;
@@ -259,14 +259,16 @@ class KkConverter extends LanguageConverter {
                // check for user namespace
                if ( is_object( $nt ) ) {
                        $ns = $nt->getNamespace();
-                       if ( $ns == NS_USER || $ns == NS_USER_TALK )
+                       if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
                                return;
+                       }
                }
 
                $oldlink = $link;
                parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-               if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+               if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
                        $link = $oldlink;
+               }
        }
 
        /**
@@ -280,9 +282,11 @@ class KkConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
-                       if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+                       if ( preg_match( "/^$imagename:/", $text ) ) {
+                               return $text;
+                       }
                }
                return parent::autoConvert( $text, $toVariant );
        }
@@ -299,7 +303,7 @@ class KkConverter extends LanguageConverter {
                global $wgLanguageCode;
                $text = parent::translate( $text, $toVariant );
 
-               switch( $toVariant ) {
+               switch ( $toVariant ) {
                        case 'kk-cyrl':
                        case 'kk-kz':
                                $letters = KK_L_UC . KK_L_LC . 'ʺʹ#0123456789';
@@ -343,7 +347,7 @@ class KkConverter extends LanguageConverter {
                        return $text;
                }
 
-               switch( $toVariant ) {
+               switch ( $toVariant ) {
                        case 'kk-arab':
                        case 'kk-cn':
                                $letters = KK_C_LC . KK_C_UC/*.KK_L_LC.KK_L_UC*/;
@@ -414,13 +418,13 @@ class LanguageKk extends LanguageKk_cyrl {
 
                $variants = array( 'kk', 'kk-cyrl', 'kk-latn', 'kk-arab', 'kk-kz', 'kk-tr', 'kk-cn' );
                $variantfallbacks = array(
-                       'kk'      => 'kk-cyrl',
+                       'kk' => 'kk-cyrl',
                        'kk-cyrl' => 'kk',
                        'kk-latn' => 'kk',
                        'kk-arab' => 'kk',
-                       'kk-kz'   => 'kk-cyrl',
-                       'kk-tr'   => 'kk-latn',
-                       'kk-cn'   => 'kk-arab'
+                       'kk-kz' => 'kk-cyrl',
+                       'kk-tr' => 'kk-latn',
+                       'kk-cn' => 'kk-arab'
                );
 
                $this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
index 081a20f..5a7bbf3 100644 (file)
@@ -115,14 +115,14 @@ class LanguageKk_cyrl extends Language {
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "а";
                                        }
-                               } elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "ге";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "ға";
                                        }
-                               } elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
-                                 if ( in_array( $wordLastVowel, $frontVowels ) ) {
+                               } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+                                       if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "не";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "на";
@@ -153,13 +153,13 @@ class LanguageKk_cyrl extends Language {
                                break;
                        case "dc31":
                        case "possessive accusative": # täweldık + tabıs
-                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "ді";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "ды";
                                        }
-                               } elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
                                                $word = $word . "н";
                                }
                                break;
@@ -181,13 +181,13 @@ class LanguageKk_cyrl extends Language {
                                break;
                        case "dc41":
                        case "possessive locative": # täweldık + jatıs
-                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "де";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "да";
                                        }
-                               } elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "нде";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -209,7 +209,7 @@ class LanguageKk_cyrl extends Language {
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "дан";
                                        }
-                               }  elseif ( in_array( $wordEnding, $Nasals ) ) {
+                               } elseif ( in_array( $wordEnding, $Nasals ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "нен";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -219,13 +219,13 @@ class LanguageKk_cyrl extends Language {
                                break;
                        case "dc51":
                        case "possessive ablative": # täweldık + şığıs
-                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson  ) ) {
+                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "нен";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "нан";
                                        }
-                               } elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "ден";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -340,14 +340,14 @@ class LanguageKk_cyrl extends Language {
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "a";
                                        }
-                               } elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "ge";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "ğa";
                                        }
-                               } elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
-                                 if ( in_array( $wordLastVowel, $frontVowels ) ) {
+                               } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+                                       if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "ne";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "na";
@@ -378,13 +378,13 @@ class LanguageKk_cyrl extends Language {
                                break;
                        case "dc31":
                        case "possessive accusative": # täweldık + tabıs
-                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "di";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "dı";
                                        }
-                               } elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
                                                $word = $word . "n";
                                }
                                break;
@@ -406,13 +406,13 @@ class LanguageKk_cyrl extends Language {
                                break;
                        case "dc41":
                        case "possessive locative": # täweldık + jatıs
-                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "de";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "da";
                                        }
-                               } elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "nde";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -434,7 +434,7 @@ class LanguageKk_cyrl extends Language {
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "dan";
                                        }
-                               }  elseif ( in_array( $wordEnding, $Nasals ) ) {
+                               } elseif ( in_array( $wordEnding, $Nasals ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "nen";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -444,13 +444,13 @@ class LanguageKk_cyrl extends Language {
                                break;
                        case "dc51":
                        case "possessive ablative": # täweldık + şığıs
-                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson  ) ) {
+                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "nen";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "nan";
                                        }
-                               } elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "den";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -499,7 +499,7 @@ class LanguageKk_cyrl extends Language {
                // Set up some constants...
                // Vowels in last syllable
                $frontVowels = array( "ە", "ٶ", "ٷ", "ٸ", "ٵ", "ە" );
-               $backVowels = array( "ا", "و", "ۇ", "ى"  );
+               $backVowels = array( "ا", "و", "ۇ", "ى" );
                $allVowels = array( "ە", "ٶ", "ٷ", "ٸ", "ٵ", "ە", "ا", "و", "ۇ", "ى" );
                // Preceding letters
                $Nasals = array( "م", "ن", "ڭ" );
@@ -565,14 +565,14 @@ class LanguageKk_cyrl extends Language {
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "ا";
                                        }
-                               } elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "گە";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "عا";
                                        }
-                               } elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
-                                 if ( in_array( $wordLastVowel, $frontVowels ) ) {
+                               } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
+                                       if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "نە";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "نا";
@@ -603,13 +603,13 @@ class LanguageKk_cyrl extends Language {
                                break;
                        case "dc31":
                        case "possessive accusative": # täweldık + tabıs
-                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "دٸ";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "دى";
                                        }
-                               } elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
                                                $word = $word . "ن";
                                }
                                break;
@@ -631,13 +631,13 @@ class LanguageKk_cyrl extends Language {
                                break;
                        case "dc41":
                        case "possessive locative": # täweldık + jatıs
-                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson  ) ) {
+                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "دە";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "دا";
                                        }
-                               } elseif ( in_array( $wordEnding, $thirdPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $thirdPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "ندە";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -659,7 +659,7 @@ class LanguageKk_cyrl extends Language {
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "دان";
                                        }
-                               }  elseif ( in_array( $wordEnding, $Nasals ) ) {
+                               } elseif ( in_array( $wordEnding, $Nasals ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "نەن";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
@@ -669,13 +669,13 @@ class LanguageKk_cyrl extends Language {
                                break;
                        case "dc51":
                        case "possessive ablative": # täweldık + şığıs
-                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson  ) ) {
+                               if ( in_array( $wordEnding, $firstPerson ) || in_array( $wordEnding, $thirdPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "نەن";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
                                                $word = $word . "نان";
                                        }
-                               } elseif ( in_array( $wordEnding, $secondPerson  ) ) {
+                               } elseif ( in_array( $wordEnding, $secondPerson ) ) {
                                        if ( in_array( $wordLastVowel, $frontVowels ) ) {
                                                $word = $word . "دەن";
                                        } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
index 074ad13..09c5727 100644 (file)
@@ -104,17 +104,17 @@ class LanguageKsh extends Language {
                        # däm WikiMaatplaz sing, dä Wikipeedija ier, däm Wikiwööterbooch sing
                        # dem/em WikiMaatplaz sing, de Wikipeedija ier, dem/em Wikiwööterbooch sing
                        $word = ( preg_match( '/ b/', $case )
-                                               ? ( $gender=='f' ? 'dä' : 'däm' )
-                                               : ( $gender=='f' ? 'de' : 'dem' )
+                                               ? ( $gender == 'f' ? 'dä' : 'däm' )
+                                               : ( $gender == 'f' ? 'de' : 'dem' )
                                        ) . ' ' . $word . ' ' .
-                                       ( $gender=='f' ? 'ier' : 'sing' ) .
+                                       ( $gender == 'f' ? 'ier' : 'sing' ) .
                                        ( preg_match( '/ m/', $case ) ? 'e' : ''
                                );
                } elseif ( preg_match( '/ e/', $case ) ) {
                        # en dämm WikiMaatPlaz, en dä Wikipeedija, en dämm Wikiwööterbooch
                        # em WikiMaatplaz, en de Wikipeedija, em Wikiwööterbooch
                        if ( preg_match( '/ b/', $case ) ) {
-                               $word = 'en '.( $gender == 'f' ? 'dä' : 'däm' ) . ' ' . $word;
+                               $word = 'en ' . ( $gender == 'f' ? 'dä' : 'däm' ) . ' ' . $word;
                        } else {
                                $word = ( $gender == 'f' ? 'en de' : 'em' ) . ' ' . $word;
                        }
@@ -124,13 +124,13 @@ class LanguageKsh extends Language {
                        if ( preg_match( '/ b/', $case ) ) {
                                $word = 'vun ' . ( $gender == 'f' ? 'dä' : 'däm' ) . ' ' . $word;
                        } else {
-                               $word = ( $gender== 'f' ? 'vun de' : 'vum' ) . ' ' . $word;
+                               $word = ( $gender == 'f' ? 'vun de' : 'vum' ) . ' ' . $word;
                        }
                } elseif ( preg_match( '/ [3d]/', $case ) ) {
                        # dämm WikiMaatPlaz, dä Wikipeedija, dämm Wikiwööterbooch
                        # dem/em WikiMaatplaz, de Wikipeedija, dem/em Wikiwööterbooch
                        if ( preg_match( '/ b/', $case ) ) {
-                               $word = ( $gender == 'f' ? 'dää' : 'dämm' ) .' ' . $word;
+                               $word = ( $gender == 'f' ? 'dää' : 'dämm' ) . ' ' . $word;
                        } else {
                                $word = ( $gender == 'f' ? 'de' : 'dem' ) . ' ' . $word;
                        }
@@ -141,7 +141,7 @@ class LanguageKsh extends Language {
                                switch ( $gender ) {
                                        case 'm':
                                                $lord = 'dä';
-                                               break ;
+                                               break;
                                        case 'f':
                                                $lord = 'di';
                                                break;
@@ -160,7 +160,7 @@ class LanguageKsh extends Language {
                                                $lord = 'et';
                                }
                        }
-                       $word = $lord.' '.$word;
+                       $word = $lord . ' ' . $word;
                }
                return $word;
        }
@@ -189,7 +189,9 @@ class LanguageKsh extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 3 );
 
                if ( $count == 1 ) {
index 56a52cc..75ac1c7 100644 (file)
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageKu_ku.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageKu_ku.php';
 
 /**
  * Kurdish converter routines
@@ -41,23 +41,23 @@ class KuConverter extends LanguageConverter {
 
                /* Doppel- und Halbvokale */
                'ڵ' => 'll', # ll
-               'ڕ'  => 'rr', # rr
-               'ا'  => 'a',
+               'ڕ' => 'rr', # rr
+               'ا' => 'a',
                # 'ئێ' => 'ê', # initial e
-               'ە'  => 'e',
-               'ه‌'  => 'e', # with one non-joiner
-               'ه‌‌'  => 'e', # with two non-joiner
-               'ة'  => 'e',
+               'ە' => 'e',
+               'ه‌' => 'e', # with one non-joiner
+               'ه‌‌' => 'e', # with two non-joiner
+               'ة' => 'e',
                'ێ' => 'ê',
-               'ي'  => 'î',
-               'ی'  => 'î', # U+06CC  db 8c  ARABIC LETTER FARSI YEH
-               'ى'  => 'î', # U+0649  d9 89  ARABIC LETTER ALEF MAKSURA
-               'ۆ'  => 'o',
-               'و'  => 'w',
-               'ئ'  => '', # initial hemze should not be shown
-               '،'  => ',',
-               'ع'  => '\'', # ayn
-               '؟'  => '?',
+               'ي' => 'î',
+               'ی' => 'î', # U+06CC  db 8c  ARABIC LETTER FARSI YEH
+               'ى' => 'î', # U+0649  d9 89  ARABIC LETTER ALEF MAKSURA
+               'ۆ' => 'o',
+               'و' => 'w',
+               'ئ' => '', # initial hemze should not be shown
+               '،' => ',',
+               'ع' => '\'', # ayn
+               '؟' => '?',
 
                # digits
                '٠' => '0', # &#x0660;
@@ -113,13 +113,13 @@ class KuConverter extends LanguageConverter {
                ' o' => 'ئۆ ',
                ' u' => 'ئو ',
                ' û' => 'ئوو ',
-               'A'  => 'ئا',
-               'E'  => 'ئە',
-               'Ê'  => 'ئێ',
-               'Î'  => 'ئی',
-               'O'  => 'ئۆ',
-               'U'  => 'ئو',
-               'Û'  => 'ئوو',
+               'A' => 'ئا',
+               'E' => 'ئە',
+               'Ê' => 'ئێ',
+               'Î' => 'ئی',
+               'O' => 'ئۆ',
+               'U' => 'ئو',
+               'Û' => 'ئوو',
                ' A' => 'ئا ',
                ' E' => 'ئە ',
                ' Ê' => 'ئێ ',
@@ -149,7 +149,7 @@ class KuConverter extends LanguageConverter {
                $this->mTables = array(
                        'ku-latn' => new ReplacementArray( $this->mArabicToLatin ),
                        'ku-arab' => new ReplacementArray( $this->mLatinToArabic ),
-                       'ku'      => new ReplacementArray()
+                       'ku' => new ReplacementArray()
                );
        }
 
@@ -167,14 +167,16 @@ class KuConverter extends LanguageConverter {
                // check for user namespace
                if ( is_object( $nt ) ) {
                        $ns = $nt->getNamespace();
-                       if ( $ns == NS_USER || $ns == NS_USER_TALK )
+                       if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
                                return;
+                       }
                }
 
                $oldlink = $link;
                parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-               if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+               if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
                        $link = $oldlink;
+               }
        }
 
        /**
@@ -188,9 +190,11 @@ class KuConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
-                       if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+                       if ( preg_match( "/^$imagename:/", $text ) ) {
+                               return $text;
+                       }
                }
                return parent::autoConvert( $text, $toVariant );
        }
@@ -253,7 +257,7 @@ class LanguageKu extends LanguageKu_ku {
 
                $variants = array( 'ku', 'ku-arab', 'ku-latn' );
                $variantfallbacks = array(
-                       'ku'      => 'ku-latn',
+                       'ku' => 'ku-latn',
                        'ku-arab' => 'ku-latn',
                        'ku-latn' => 'ku-arab',
                );
index ba0f140..9c77878 100644 (file)
@@ -49,54 +49,60 @@ class LanguageLa extends Language {
                switch ( $case ) {
                case 'genitive':
                        // only a few declensions, and even for those mostly the singular only
-                       $in  = array(   '/u[ms]$/',                     # 2nd declension singular
-                                       '/ommunia$/',                   # 3rd declension neuter plural (partly)
-                                       '/a$/',                         # 1st declension singular
-                                       '/libri$/', '/nuntii$/',        # 2nd declension plural (partly)
-                                       '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                                       '/es$/'                         # 5th declension singular
-                                       );
-                       $out = array(   'i',
-                                       'ommunium',
-                                       'ae',
-                                       'librorum', 'nuntiorum',
-                                       'tionis', 'ntis', 'atis',
-                                       'ei'
-                                       );
+                       $in = array(
+                               '/u[ms]$/',                     # 2nd declension singular
+                               '/ommunia$/',                   # 3rd declension neuter plural (partly)
+                               '/a$/',                         # 1st declension singular
+                               '/libri$/', '/nuntii$/',        # 2nd declension plural (partly)
+                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
+                               '/es$/'                         # 5th declension singular
+                       );
+                       $out = array(
+                               'i',
+                               'ommunium',
+                               'ae',
+                               'librorum', 'nuntiorum',
+                               'tionis', 'ntis', 'atis',
+                               'ei'
+                       );
                        return preg_replace( $in, $out, $word );
                case 'accusative':
                        // only a few declensions, and even for those mostly the singular only
-                       $in  = array(   '/u[ms]$/',                     # 2nd declension singular
-                                       '/a$/',                         # 1st declension singular
-                                       '/ommuniam$/',                  # 3rd declension neuter plural (partly)
-                                       '/libri$/', '/nuntii$/',        # 2nd declension plural (partly)
-                                       '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                                       '/es$/'                         # 5th declension singular
-                                       );
-                       $out = array(   'um',
-                                       'am',
-                                       'ommunia',
-                                       'libros', 'nuntios',
-                                       'tionem', 'ntem', 'atem',
-                                       'em'
-                                       );
+                       $in = array(
+                               '/u[ms]$/',                     # 2nd declension singular
+                               '/a$/',                         # 1st declension singular
+                               '/ommuniam$/',              # 3rd declension neuter plural (partly)
+                               '/libri$/', '/nuntii$/',        # 2nd declension plural (partly)
+                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
+                               '/es$/'                         # 5th declension singular
+                       );
+                       $out = array(
+                               'um',
+                               'am',
+                               'ommunia',
+                               'libros', 'nuntios',
+                               'tionem', 'ntem', 'atem',
+                               'em'
+                       );
                        return preg_replace( $in, $out, $word );
                case 'ablative':
                        // only a few declensions, and even for those mostly the singular only
-                       $in  = array(   '/u[ms]$/',                     # 2nd declension singular
-                                       '/ommunia$/',                   # 3rd declension neuter plural (partly)
-                                       '/a$/',                         # 1st declension singular
-                                       '/libri$/', '/nuntii$/',        # 2nd declension plural (partly)
-                                       '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
-                                       '/es$/'                         # 5th declension singular
-                                       );
-                       $out = array(   'o',
-                                       'ommunibus',
-                                       'a',
-                                       'libris', 'nuntiis',
-                                       'tione', 'nte', 'ate',
-                                       'e'
-                                       );
+                       $in = array(
+                               '/u[ms]$/',                     # 2nd declension singular
+                               '/ommunia$/',                   # 3rd declension neuter plural (partly)
+                               '/a$/',                         # 1st declension singular
+                               '/libri$/', '/nuntii$/',        # 2nd declension plural (partly)
+                               '/tio$/', '/ns$/', '/as$/',     # 3rd declension singular (partly)
+                               '/es$/'                         # 5th declension singular
+                       );
+                       $out = array(
+                               'o',
+                               'ommunibus',
+                               'a',
+                               'libris', 'nuntiis',
+                               'tione', 'nte', 'ate',
+                               'e'
+                       );
                        return preg_replace( $in, $out, $word );
                default:
                        return $word;
index ace0a4c..bf6800c 100644 (file)
@@ -36,7 +36,9 @@ class LanguageMg extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 2 );
 
                return ( $count <= 1 ) ? $forms[0] : $forms[1];
diff --git a/languages/classes/LanguageMk.php b/languages/classes/LanguageMk.php
deleted file mode 100644 (file)
index 968fe26..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Macedonian (Македонски) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Macedonian (Македонски)
- *
- * @ingroup Language
- */
-class LanguageMk extends Language {
-       /**
-        * Plural forms per
-        * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#mk
-        *
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 2 );
-               // TODO CLDR defines forms[0] for n != 11 and not for n%100 !== 11
-               if ( $count % 10 === 1 && $count % 100 !== 11 ) {
-                       return $forms[0];
-               } else {
-                       return $forms[1];
-               }
-       }
-}
index 68bd7ca..20213a8 100644 (file)
@@ -35,14 +35,21 @@ class LanguageMt extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
 
                $forms = $this->preConvertPlural( $forms, 4 );
 
-               if ( $count == 1 ) $index = 0;
-               elseif ( $count == 0 || ( $count % 100 > 1 && $count % 100 < 11 ) ) $index = 1;
-               elseif ( $count % 100 > 10 && $count % 100 < 20 ) $index = 2;
-               else $index = 3;
+               if ( $count == 1 ) {
+                       $index = 0;
+               } elseif ( $count == 0 || ( $count % 100 > 1 && $count % 100 < 11 ) ) {
+                       $index = 1;
+               } elseif ( $count % 100 > 10 && $count % 100 < 20 ) {
+                       $index = 2;
+               } else {
+                       $index = 3;
+               }
                return $forms[$index];
        }
 }
diff --git a/languages/classes/LanguageNso.php b/languages/classes/LanguageNso.php
deleted file mode 100644 (file)
index 0c08675..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * Northern Sotho (Sesotho sa Leboa) specific code.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Language
- */
-
-/**
- * Northern Sotho (Sesotho sa Leboa)
- *
- * @ingroup Language
- */
-class LanguageNso extends Language {
-       /**
-        * Use singular form for zero
-        *
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 2 );
-
-               return ( $count <= 1 ) ? $forms[0] : $forms[1];
-       }
-}
index a808840..f37e2d5 100644 (file)
@@ -81,27 +81,41 @@ class LanguageOs extends Language {
                # Checking if $word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
                # Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
                elseif ( preg_match( "/у$/u", $word ) ) {
-                       if ( !preg_match( "/[аæеёиоыэюя]$/u", mb_substr( $word, -2, 1 ) ) )
+                       if ( !preg_match( "/[аæеёиоыэюя]$/u", mb_substr( $word, -2, 1 ) ) ) {
                                $jot = 'й';
+                       }
                } elseif ( !preg_match( "/[бвгджзйклмнопрстфхцчшщьъ]$/u", $word ) ) {
                        $hyphen = '-';
                }
 
                switch ( $case ) {
-                       case 'genitive': $ending = $hyphen . $jot . 'ы'; break;
-                       case 'dative': $ending = $hyphen . $jot . 'æн'; break;
-                       case 'allative': $ending = $hyphen . $end_allative; break;
+                       case 'genitive':
+                               $ending = $hyphen . $jot . 'ы';
+                               break;
+                       case 'dative':
+                               $ending = $hyphen . $jot . 'æн';
+                               break;
+                       case 'allative':
+                               $ending = $hyphen . $end_allative;
+                               break;
                        case 'ablative':
                                if ( $jot == 'й' ) {
-                                       $ending = $hyphen . $jot . 'æ'; break;
+                                       $ending = $hyphen . $jot . 'æ';
+                               } else {
+                                       $ending = $hyphen . $jot . 'æй';
                                }
-                               else {
-                                       $ending = $hyphen . $jot . 'æй'; break;
-                               }
-                       case 'inessive': break;
-                       case 'superessive': $ending = $hyphen . $jot . 'ыл'; break;
-                       case 'equative': $ending = $hyphen . $jot . 'ау'; break;
-                       case 'comitative': $ending = $hyphen . 'имæ'; break;
+                               break;
+                       case 'inessive':
+                               break;
+                       case 'superessive':
+                               $ending = $hyphen . $jot . 'ыл';
+                               break;
+                       case 'equative':
+                               $ending = $hyphen . $jot . 'ау';
+                               break;
+                       case 'comitative':
+                               $ending = $hyphen . 'имæ';
+                               break;
                }
                return $word . $ending;
        }
index 68bf020..e15c9e2 100644 (file)
@@ -34,7 +34,9 @@ class LanguagePl extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 3 );
                $count = abs( $count );
                if ( $count == 1 ) {
index 1fcddfc..83c42cc 100644 (file)
@@ -34,10 +34,14 @@ class LanguageSh extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
 
                // if no number with word, then use $form[0] for singular and $form[1] for plural or zero
-               if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+               if ( count( $forms ) === 2 ) {
+                       return $count == 1 ? $forms[0] : $forms[1];
+               }
 
                // @todo FIXME: CLDR defines 4 plural forms. Form with decimals missing.
                // See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#sh
@@ -47,10 +51,10 @@ class LanguageSh extends Language {
                        return $forms[2];
                } else {
                        switch ( $count % 10 ) {
-                               case 1:  return $forms[0];
+                               case 1: return $forms[0];
                                case 2:
                                case 3:
-                               case 4:  return $forms[1];
+                               case 4: return $forms[1];
                                default: return $forms[2];
                        }
                }
index 5ddcfde..f4180cb 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
 
 /**
  * Conversion script between Latin and Tifinagh for Tachelhit.
@@ -42,25 +42,25 @@ class ShiConverter extends LanguageConverter {
        public $mToLatin = array(
                'ⴰ' => 'a', 'ⴱ' => 'b', 'ⴳ' => 'g', 'ⴷ' => 'd', 'ⴹ' => 'ḍ', 'ⴻ' => 'e',
                'ⴼ' => 'f', 'ⴽ' => 'k', 'ⵀ' => 'h', 'ⵃ' => 'ḥ', 'ⵄ' => 'ε', 'ⵅ' => 'x',
-               'ⵇ' => 'q', 'ⵉ' => 'i', 'ⵊ' => 'j',  'ⵍ' => 'l', 'ⵎ' => 'm', 'ⵏ' => 'n',
+               'ⵇ' => 'q', 'ⵉ' => 'i', 'ⵊ' => 'j', 'ⵍ' => 'l', 'ⵎ' => 'm', 'ⵏ' => 'n',
                'ⵓ' => 'u', 'ⵔ' => 'r', 'ⵕ' => 'ṛ', 'ⵖ' => 'γ', 'ⵙ' => 's', 'ⵚ' => 'ṣ',
                'ⵛ' => 'š', 'ⵜ' => 't', 'ⵟ' => 'ṭ', 'ⵡ' => 'w', 'ⵢ' => 'y', 'ⵣ' => 'z',
                'ⵥ' => 'ẓ', 'ⵯ' => 'ʷ', 'ⵖ' => 'ɣ', 'ⵠ' => 'v', 'ⵒ' => 'p',
        );
 
        public $mUpperToLowerCaseLatin = array(
-               'A' => 'a',     'B' => 'b',     'C' => 'c',     'D' => 'd',     'E' => 'e',
-               'F' => 'f',     'G' => 'g',     'H' => 'h',     'I' => 'i',     'J' => 'j',
-               'K' => 'k',     'L' => 'l',     'M' => 'm',     'N' => 'n',     'O' => 'o',
-               'P' => 'p',     'Q' => 'q',     'R' => 'r',     'S' => 's',     'T' => 't',
-               'U' => 'u',     'V' => 'v',     'W' => 'w',     'X' => 'x',     'Y' => 'y',
+               'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e',
+               'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j',
+               'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o',
+               'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't',
+               'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y',
                'Z' => 'z', 'Ɣ' => 'ɣ',
        );
 
        public $mToTifinagh = array(
                'a' => 'ⴰ', 'b' => 'ⴱ', 'g' => 'ⴳ', 'd' => 'ⴷ', 'ḍ' => 'ⴹ', 'e' => 'ⴻ',
                'f' => 'ⴼ', 'k' => 'ⴽ', 'h' => 'ⵀ', 'ḥ' => 'ⵃ', 'ε' => 'ⵄ', 'x' => 'ⵅ',
-               'q' => 'ⵇ', 'i' => 'ⵉ', 'j' => 'ⵊ',  'l' => 'ⵍ', 'm' => 'ⵎ', 'n' => 'ⵏ',
+               'q' => 'ⵇ', 'i' => 'ⵉ', 'j' => 'ⵊ', 'l' => 'ⵍ', 'm' => 'ⵎ', 'n' => 'ⵏ',
                'u' => 'ⵓ', 'r' => 'ⵔ', 'ṛ' => 'ⵕ', 'γ' => 'ⵖ', 's' => 'ⵙ', 'ṣ' => 'ⵚ',
                'š' => 'ⵛ', 't' => 'ⵜ', 'ṭ' => 'ⵟ', 'w' => 'ⵡ', 'y' => 'ⵢ', 'z' => 'ⵣ',
                'ẓ' => 'ⵥ', 'ʷ' => 'ⵯ', 'ɣ' => 'ⵖ', 'v' => 'ⵠ', 'p' => 'ⵒ',
@@ -71,7 +71,7 @@ class ShiConverter extends LanguageConverter {
                        'lowercase' => new ReplacementArray( $this->mUpperToLowerCaseLatin ),
                        'shi-tfng' => new ReplacementArray( $this->mToTifinagh ),
                        'shi-latn' => new ReplacementArray( $this->mToLatin ),
-                       'shi'    => new ReplacementArray()
+                       'shi' => new ReplacementArray()
                );
        }
 
@@ -123,17 +123,19 @@ class ShiConverter extends LanguageConverter {
         * @param $ignoreOtherCond bool
         */
        function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
-                // check for user namespace
+               // check for user namespace
                if ( is_object( $nt ) ) {
                        $ns = $nt->getNamespace();
-                       if ( $ns == NS_USER || $ns == NS_USER_TALK )
+                       if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
                                return;
+                       }
                }
 
                $oldlink = $link;
                parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-               if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+               if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
                        $link = $oldlink;
+               }
        }
 
        /**
@@ -147,9 +149,11 @@ class ShiConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
-                       if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+                       if ( preg_match( "/^$imagename:/", $text ) ) {
+                               return $text;
+                       }
                }
                return parent::autoConvert( $text, $toVariant );
        }
@@ -168,7 +172,7 @@ class ShiConverter extends LanguageConverter {
                if ( trim( $text ) ) {
                        $this->loadTables();
                        // To Tifinagh, first translate uppercase to lowercase Latin
-                       if( $toVariant == 'shi-tfng' ) {
+                       if ( $toVariant == 'shi-tfng' ) {
                                $text = $this->mTables['lowercase']->replace( $text );
                        }
                        $text = $this->mTables[$toVariant]->replace( $text );
@@ -190,7 +194,7 @@ class LanguageShi extends Language {
 
                $variants = array( 'shi', 'shi-tfng', 'shi-latn' );
                $variantfallbacks = array(
-                       'shi'    => 'shi-tfng',
+                       'shi' => 'shi-tfng',
                        'shi-tfng' => 'shi',
                        'shi-latn' => 'shi',
                );
index b1da70e..cd15f18 100644 (file)
@@ -34,7 +34,9 @@ class LanguageSk extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 3 );
 
                if ( $count == 1 ) {
index c075e51..06c75c9 100644 (file)
@@ -45,35 +45,14 @@ class LanguageSl extends Language {
 
                switch ( $case ) {
                        case 'mestnik': # locative
-                               $word = 'o ' . $word; break;
+                               $word = 'o ' . $word;
+                               break;
                        case 'orodnik': # instrumental
                                $word = 'z ' . $word;
+                               break;
                }
 
                return $word; # this will return the original value for 'imenovalnik' (nominativ) and all undefined case values
        }
 
-       /**
-        * @param $count int
-        * @param $forms array
-        *
-        * @return string
-        */
-       function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
-               $forms = $this->preConvertPlural( $forms, 5 );
-
-               if ( $count % 100 == 1 ) {
-                       $index = 0;
-               } elseif ( $count % 100 == 2 ) {
-                       $index = 1;
-               } elseif ( $count % 100 == 3 || $count % 100 == 4 ) {
-                       $index = 2;
-               } elseif ( $count != 0 ) {
-                       $index = 3;
-               } else {
-                       $index = 4;
-               }
-               return $forms[$index];
-       }
 }
index 55aec32..e8811ac 100644 (file)
@@ -21,9 +21,9 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageSr_ec.php' );
-require_once( __DIR__ . '/LanguageSr_el.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageSr_ec.php';
+require_once __DIR__ . '/LanguageSr_el.php';
 
 /**
  * There are two levels of conversion for Serbian: the script level
@@ -75,7 +75,7 @@ class SrConverter extends LanguageConverter {
                $this->mTables = array(
                        'sr-ec' => new ReplacementArray( $this->mToCyrillics ),
                        'sr-el' => new ReplacementArray( $this->mToLatin ),
-                       'sr'    => new ReplacementArray()
+                       'sr' => new ReplacementArray()
                );
        }
 
@@ -118,14 +118,16 @@ class SrConverter extends LanguageConverter {
                // check for user namespace
                if ( is_object( $nt ) ) {
                        $ns = $nt->getNamespace();
-                       if ( $ns == NS_USER || $ns == NS_USER_TALK )
+                       if ( $ns == NS_USER || $ns == NS_USER_TALK ) {
                                return;
+                       }
                }
 
                $oldlink = $link;
                parent::findVariantLink( $link, $nt, $ignoreOtherCond );
-               if ( $this->getPreferredVariant() == $this->mMainLanguageCode )
+               if ( $this->getPreferredVariant() == $this->mMainLanguageCode ) {
                        $link = $oldlink;
+               }
        }
 
        /**
@@ -139,9 +141,11 @@ class SrConverter extends LanguageConverter {
         */
        function autoConvert( $text, $toVariant = false ) {
                global $wgTitle;
-               if ( is_object( $wgTitle ) && $wgTitle->getNameSpace() == NS_FILE ) {
+               if ( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE ) {
                        $imagename = $wgTitle->getNsText();
-                       if ( preg_match( "/^$imagename:/", $text ) ) return $text;
+                       if ( preg_match( "/^$imagename:/", $text ) ) {
+                               return $text;
+                       }
                }
                return parent::autoConvert( $text, $toVariant );
        }
@@ -194,13 +198,13 @@ class SrConverter extends LanguageConverter {
         * @since 1.19
         */
        public function guessVariant( $text, $variant ) {
-               $numCyrillic = preg_match_all("/[шђчћжШЂЧЋЖ]/u", $text, $dummy);
-               $numLatin = preg_match_all("/[šđč枊ĐČĆŽ]/u", $text, $dummy);
+               $numCyrillic = preg_match_all( "/[шђчћжШЂЧЋЖ]/u", $text, $dummy );
+               $numLatin = preg_match_all( "/[šđč枊ĐČĆŽ]/u", $text, $dummy );
 
-               if( $variant == 'sr-ec' ) {
-                       return (boolean) ($numCyrillic > $numLatin);
-               } elseif( $variant == 'sr-el' ) {
-                       return (boolean) ($numLatin > $numCyrillic);
+               if ( $variant == 'sr-ec' ) {
+                       return (boolean) ( $numCyrillic > $numLatin );
+               } elseif ( $variant == 'sr-el' ) {
+                       return (boolean) ( $numLatin > $numCyrillic );
                } else {
                        return false;
                }
@@ -222,14 +226,14 @@ class LanguageSr extends LanguageSr_ec {
 
                $variants = array( 'sr', 'sr-ec', 'sr-el' );
                $variantfallbacks = array(
-                       'sr'    => 'sr-ec',
+                       'sr' => 'sr-ec',
                        'sr-ec' => 'sr',
                        'sr-el' => 'sr',
                );
 
                $flags = array(
                        'S' => 'S', 'писмо' => 'S', 'pismo' => 'S',
-                       'W' => 'W', 'реч'   => 'W', 'reč'   => 'W', 'ријеч' => 'W', 'riječ' => 'W'
+                       'W' => 'W', 'реч' => 'W', 'reč' => 'W', 'ријеч' => 'W', 'riječ' => 'W'
                );
                $this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
                $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
@@ -262,10 +266,10 @@ class LanguageSr extends LanguageSr_ec {
                        return $forms[2];
                } else {
                        switch ( $count % 10 ) {
-                               case 1:  return $forms[0];
+                               case 1: return $forms[0];
                                case 2:
                                case 3:
-                               case 4:  return $forms[1];
+                               case 4: return $forms[1];
                                default: return $forms[2];
                        }
                }
index 352e293..cb9e819 100644 (file)
@@ -34,17 +34,19 @@ class LanguageSr_ec extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 3 );
 
                if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
                        return $forms[2];
                } else {
                        switch ( $count % 10 ) {
-                               case 1:  return $forms[0];
+                               case 1: return $forms[0];
                                case 2:
                                case 3:
-                               case 4:  return $forms[1];
+                               case 4: return $forms[1];
                                default: return $forms[2];
                        }
                }
index 0e36d6c..99d1293 100644 (file)
@@ -34,17 +34,19 @@ class LanguageSr_el extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 3 );
 
                if ( $count > 10 && floor( ( $count % 100 ) / 10 ) == 1 ) {
                        return $forms[2];
                } else {
                        switch ( $count % 10 ) {
-                               case 1:  return $forms[0];
+                               case 1: return $forms[0];
                                case 2:
                                case 3:
-                               case 4:  return $forms[1];
+                               case 4: return $forms[1];
                                default: return $forms[2];
                        }
                }
index 3ec1476..10755b4 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
 
 /**
  * Converts Tajiki to latin orthography
@@ -108,7 +108,7 @@ class TgConverter extends LanguageConverter {
        function loadDefaultTables() {
                $this->mTables = array(
                        'tg-latn' => new ReplacementArray( $this->table ),
-                       'tg'      => new ReplacementArray()
+                       'tg' => new ReplacementArray()
                );
        }
 
index 27331cc..f17b4d1 100644 (file)
@@ -36,7 +36,9 @@ class LanguageTi extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 2 );
 
                return ( $count <= 1 ) ? $forms[0] : $forms[1];
index 15bce76..060d1e2 100644 (file)
@@ -36,7 +36,9 @@ class LanguageTl extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 2 );
 
                return ( $count <= 1 ) ? $forms[0] : $forms[1];
index 6d147c8..fc1e8a8 100644 (file)
@@ -150,7 +150,7 @@ class LanguageTyv extends Language {
                                                $word = implode( "", $ar[0] ) . "ты";
                                        } else {
                                        }
-                               } elseif ( $wordEnding === "л"  || $wordEnding === "l" ) {
+                               } elseif ( $wordEnding === "л" || $wordEnding === "l" ) {
                                        if ( in_array( $wordLastVowel, $roundFrontVowels ) ) {
                                                $word = implode( "", $ar[0] ) . "дү";
                                        } elseif ( in_array( $wordLastVowel, $unroundFrontVowels ) ) {
index ce9ed33..4ad272b 100644 (file)
@@ -48,32 +48,32 @@ class LanguageUk extends Language {
                # join and array_slice instead mb_substr
                $ar = array();
                preg_match_all( '/./us', $word, $ar );
-               if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
+               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 ) ) == 'ь' )
+                                       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 ) ) == 'ія' )
+                                       } 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 ) ) == 'ти' )
+                                       } 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], -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], -4 ) ) == 'вікі' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вікі' ) ) {
+                                       } elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ія' ) {
                                                $word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ію';
+                                       }
                                        break;
                                case 'instrumental':  # орудний відмінок
                                        # stub
@@ -82,6 +82,7 @@ class LanguageUk extends Language {
                                        # stub
                                        break;
                        }
+               }
                return $word;
        }
 
@@ -91,13 +92,17 @@ class LanguageUk extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
 
                // If the actual number is not mentioned in the expression, then just two forms are enough:
                // singular for $count == 1
                // plural   for $count != 1
                // For example, "This user belongs to {{PLURAL:$1|one group|several groups}}."
-               if ( count( $forms ) === 2 ) return $count == 1 ? $forms[0] : $forms[1];
+               if ( count( $forms ) === 2 ) {
+                       return $count == 1 ? $forms[0] : $forms[1];
+               }
 
                // @todo FIXME: CLDR defines 4 plural forms. Form for decimals is missing/
                // See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#uk
@@ -107,10 +112,10 @@ class LanguageUk extends Language {
                        return $forms[2];
                } else {
                        switch ( $count % 10 ) {
-                               case 1:  return $forms[0];
+                               case 1: return $forms[0];
                                case 2:
                                case 3:
-                               case 4:  return $forms[1];
+                               case 4: return $forms[1];
                                default: return $forms[2];
                        }
                }
index a2c917c..aa3e4f2 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
 
 /**
  * @ingroup Language
@@ -75,9 +75,9 @@ class UzConverter extends LanguageConverter {
                'f' => 'ф', 'F' => 'Ф',
                'g' => 'г', 'G' => 'Г',
                'g‘' => 'ғ', 'G‘' => 'Ғ', 'gʻ' => 'ғ', 'Gʻ' => 'Ғ',
-               'h'  => 'ҳ', 'H' => 'Ҳ',
+               'h' => 'ҳ', 'H' => 'Ҳ',
                'i' => 'и', 'I' => 'И',
-               'k'  => 'к', 'K' => 'К',
+               'k' => 'к', 'K' => 'К',
                'l' => 'л', 'L' => 'Л',
                'm' => 'м', 'M' => 'М',
                'n' => 'н', 'N' => 'Н',
@@ -108,7 +108,7 @@ class UzConverter extends LanguageConverter {
                $this->mTables = array(
                        'uz-cyrl' => new ReplacementArray( $this->toCyrillic ),
                        'uz-latn' => new ReplacementArray( $this->toLatin ),
-                       'uz'      => new ReplacementArray()
+                       'uz' => new ReplacementArray()
                );
        }
 
@@ -126,7 +126,7 @@ class LanguageUz extends Language {
 
                $variants = array( 'uz', 'uz-latn', 'uz-cyrl' );
                $variantfallbacks = array(
-                       'uz'    => 'uz-latn',
+                       'uz' => 'uz-latn',
                        'uz-cyrl' => 'uz',
                        'uz-latn' => 'uz',
                );
index 9e90c7f..fde8c53 100644 (file)
@@ -39,7 +39,9 @@ class LanguageWa extends Language {
         * @return string
         */
        function convertPlural( $count, $forms ) {
-               if ( !count( $forms ) ) { return ''; }
+               if ( !count( $forms ) ) {
+                       return '';
+               }
                $forms = $this->preConvertPlural( $forms, 2 );
 
                return ( $count <= 1 ) ? $forms[0] : $forms[1];
@@ -67,14 +69,14 @@ class LanguageWa extends Language {
                #
                # 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 );
-                      return $d;
+                       $d = substr( $ts, 0, 4 ) . '-' . substr( $ts, 4, 2 ) . '-' . substr( $ts, 6, 2 );
+                       return $d;
                }
 
                # dd/mm/YYYY format
                if ( $datePreference == 'walloon short' ) {
-                      $d = substr( $ts, 6, 2 ) . '/' . substr( $ts, 4, 2 ) . '/' . substr( $ts, 0, 4 );
-                      return $d;
+                       $d = substr( $ts, 6, 2 ) . '/' . substr( $ts, 4, 2 ) . '/' . substr( $ts, 0, 4 );
+                       return $d;
                }
 
                # Walloon format
@@ -83,17 +85,17 @@ class LanguageWa extends Language {
                $m = substr( $ts, 4, 2 );
                $n = substr( $ts, 6, 2 );
                if ( $n == 1 ) {
-                   $d = "1î d' " . $this->getMonthName( $m ) .
-                       " " .  substr( $ts, 0, 4 );
+                       $d = "1î d' " . $this->getMonthName( $m ) .
+                               " " . substr( $ts, 0, 4 );
                } elseif ( $n == 2 || $n == 3 || $n == 20 || $n == 22 || $n == 23 ) {
-                   $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
-                       " " .  substr( $ts, 0, 4 );
+                       $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
+                               " " . substr( $ts, 0, 4 );
                } elseif ( $m == 4 || $m == 8 || $m == 10 ) {
-                   $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
-                       " " .  substr( $ts, 0, 4 );
+                       $d = ( 0 + $n ) . " d' " . $this->getMonthName( $m ) .
+                               " " . substr( $ts, 0, 4 );
                } else {
-                   $d = ( 0 + $n ) . " di " . $this->getMonthName( $m ) .
-                       " " .  substr( $ts, 0, 4 );
+                       $d = ( 0 + $n ) . " di " . $this->getMonthName( $m ) .
+                               " " . substr( $ts, 0, 4 );
                }
                return $d;
        }
@@ -106,7 +108,9 @@ class LanguageWa extends Language {
         * @return string
         */
        function timeanddate( $ts, $adj = false, $format = true, $tc = false ) {
-               if ( $adj ) { $ts = $this->userAdjust( $ts, $tc ); }
+               if ( $adj ) {
+                       $ts = $this->userAdjust( $ts, $tc );
+               }
                $datePreference = $this->dateFormat( $format );
                if ( $datePreference == 'ISO 8601' ) {
                        return parent::timeanddate( $ts, $adj, $format, $tc );
index 04767f2..d413018 100644 (file)
@@ -21,8 +21,8 @@
  * @ingroup Language
  */
 
-require_once( __DIR__ . '/../LanguageConverter.php' );
-require_once( __DIR__ . '/LanguageZh_hans.php' );
+require_once __DIR__ . '/../LanguageConverter.php';
+require_once __DIR__ . '/LanguageZh_hans.php';
 
 /**
  * @ingroup Language
@@ -50,31 +50,31 @@ class ZhConverter extends LanguageConverter {
                                                                        $flags,
                                                                        $manualLevel );
                $names = array(
-                       'zh'      => '原文',
+                       'zh' => '原文',
                        'zh-hans' => '简体',
                        'zh-hant' => '繁體',
-                       'zh-cn'   => '大陆',
-                       'zh-tw'   => '台灣',
-                       'zh-hk'   => '香港',
-                       'zh-mo'   => '澳門',
-                       'zh-sg'   => '新加坡',
-                       'zh-my'   => '大马',
+                       'zh-cn' => '大陆',
+                       'zh-tw' => '台灣',
+                       'zh-hk' => '香港',
+                       'zh-mo' => '澳門',
+                       'zh-sg' => '新加坡',
+                       'zh-my' => '大马',
                );
                $this->mVariantNames = array_merge( $this->mVariantNames, $names );
        }
 
        function loadDefaultTables() {
-               require( __DIR__ . "/../../includes/ZhConversion.php" );
+               require __DIR__ . "/../../includes/ZhConversion.php";
                $this->mTables = array(
                        'zh-hans' => new ReplacementArray( $zh2Hans ),
                        'zh-hant' => new ReplacementArray( $zh2Hant ),
-                       'zh-cn'   => new ReplacementArray( array_merge( $zh2Hans, $zh2CN ) ),
-                       'zh-hk'   => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
-                       'zh-mo'   => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
-                       'zh-my'   => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
-                       'zh-sg'   => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
-                       'zh-tw'   => new ReplacementArray( array_merge( $zh2Hant, $zh2TW ) ),
-                       'zh'      => new ReplacementArray
+                       'zh-cn' => new ReplacementArray( array_merge( $zh2Hans, $zh2CN ) ),
+                       'zh-hk' => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
+                       'zh-mo' => new ReplacementArray( array_merge( $zh2Hant, $zh2HK ) ),
+                       'zh-my' => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
+                       'zh-sg' => new ReplacementArray( array_merge( $zh2Hans, $zh2SG ) ),
+                       'zh-tw' => new ReplacementArray( array_merge( $zh2Hant, $zh2TW ) ),
+                       'zh' => new ReplacementArray
                );
        }
 
@@ -111,18 +111,18 @@ class LanguageZh extends LanguageZh_hans {
                $variants = array( 'zh', 'zh-hans', 'zh-hant', 'zh-cn', 'zh-hk', 'zh-mo', 'zh-my', 'zh-sg', 'zh-tw' );
 
                $variantfallbacks = array(
-                       'zh'      => array( 'zh-hans', 'zh-hant', 'zh-cn', 'zh-tw', 'zh-hk', 'zh-sg', 'zh-mo', 'zh-my' ),
+                       'zh' => array( 'zh-hans', 'zh-hant', 'zh-cn', 'zh-tw', 'zh-hk', 'zh-sg', 'zh-mo', 'zh-my' ),
                        'zh-hans' => array( 'zh-cn', 'zh-sg', 'zh-my' ),
                        'zh-hant' => array( 'zh-tw', 'zh-hk', 'zh-mo' ),
-                       'zh-cn'   => array( 'zh-hans', 'zh-sg', 'zh-my' ),
-                       'zh-sg'   => array( 'zh-hans', 'zh-cn', 'zh-my' ),
-                       'zh-my'   => array( 'zh-hans', 'zh-sg', 'zh-cn' ),
-                       'zh-tw'   => array( 'zh-hant', 'zh-hk', 'zh-mo' ),
-                       'zh-hk'   => array( 'zh-hant', 'zh-mo', 'zh-tw' ),
-                       'zh-mo'   => array( 'zh-hant', 'zh-hk', 'zh-tw' ),
+                       'zh-cn' => array( 'zh-hans', 'zh-sg', 'zh-my' ),
+                       'zh-sg' => array( 'zh-hans', 'zh-cn', 'zh-my' ),
+                       'zh-my' => array( 'zh-hans', 'zh-sg', 'zh-cn' ),
+                       'zh-tw' => array( 'zh-hant', 'zh-hk', 'zh-mo' ),
+                       'zh-hk' => array( 'zh-hant', 'zh-mo', 'zh-tw' ),
+                       'zh-mo' => array( 'zh-hant', 'zh-hk', 'zh-tw' ),
                );
                $ml = array(
-                       'zh'      => 'disable',
+                       'zh' => 'disable',
                        'zh-hans' => 'unidirectional',
                        'zh-hant' => 'unidirectional',
                );
@@ -142,9 +142,7 @@ class LanguageZh extends LanguageZh_hans {
         * @return string
         */
        function segmentForDiff( $text ) {
-               return preg_replace(
-                       "/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-                       "' ' .\"$1\"", $text );
+               return preg_replace( '/[\xc0-\xff][\x80-\xbf]*/', ' $0', $text );
        }
 
        /**
@@ -152,9 +150,7 @@ class LanguageZh extends LanguageZh_hans {
         * @return string
         */
        function unsegmentForDiff( $text ) {
-               return preg_replace(
-                       "/ ([\\xc0-\\xff][\\x80-\\xbf]*)/e",
-                       "\"$1\"", $text );
+               return preg_replace( '/ ([\xc0-\xff][\x80-\xbf]*)/', '$1', $text );
        }
 
        /**
index 07e157a..70d45a3 100644 (file)
@@ -2,9 +2,16 @@
 <!DOCTYPE supplementalData SYSTEM "../../common/dtd/ldmlSupplemental.dtd">
 <supplementalData>
        <plurals>
+               <!--
+               The "one" and "two" rules are copied directly from CLDR.
+               The "many" rule overrides CLDR, because CLDR seems to have a mistake:
+               it's sometimes needed for multiples of 10, but not for 10 itself.
+               When the CLDR is fixed, this should be removed.
+               -->
                <pluralRules locales="he">
                        <pluralRule count="one">n is 1</pluralRule>
                        <pluralRule count="two">n is 2</pluralRule>
+                       <pluralRule count="many">n is not 0 AND n is not 10 AND n mod 10 is 0</pluralRule>
                </pluralRules>
                <pluralRules locales="dsb hsb">
                        <pluralRule count="one">n mod 100 is 1</pluralRule>
index 3bbee94..3d8be91 100644 (file)
@@ -186,11 +186,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Peuleumah jumeulah ureueng kalon',
 'tog-oldsig' => 'Tanda jaroe jinoe:',
 'tog-fancysig' => 'Peujeuet tanda jaroe sibagoe naseukah wiki (hana hubong keudroe)',
-'tog-externaleditor' => 'Nguy editor eksternal nyang ka na (keu nyang utoih khong, peureulee neuato kusuih bak kompute droeneuh.
-
-[//www.mediawiki.org/wiki/Manual:External_editors Haba leubeh leungkap.])',
-'tog-externaldiff' => 'Nguy diff eksternal nyang ka na (keu nyang utoih mantong, peureulee neuato kusuih bak kompute droeneuh
-[//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Peuudep hubong keu ngon bantu "langsong u"',
 'tog-uselivepreview' => 'Nguy peuleumah hase langsong (JavaScript) (baci)',
 'tog-forceeditsummary' => 'Peuingat lon meunyo plok neuringkaih neuandam mantong soh',
@@ -241,8 +236,8 @@ $messages = array(
 'august' => 'Buleuën Lapan',
 'september' => 'Buleuën Sikureuëng',
 'october' => 'Buleuën Siplôh',
-'november' => 'Buleuën Siblah',
-'december' => 'Buleuën Duwa Blah',
+'november' => 'Buleuën Siblaih',
+'december' => 'Buleuën Duwa Blaih',
 'january-gen' => 'Buleuën Sa',
 'february-gen' => 'Buleuën Duwa',
 'march-gen' => 'Buleuën Lhèë',
@@ -253,26 +248,26 @@ $messages = array(
 'august-gen' => 'Buleuën Lapan',
 'september-gen' => 'Buleuën Sikureuëng',
 'october-gen' => 'Buleuën Siplôh',
-'november-gen' => 'Buleuën Siblah',
-'december-gen' => 'Buleuën Duwa Blah',
+'november-gen' => 'Buleuën Siblaih',
+'december-gen' => 'Buleuën Duwa Blaih',
 'jan' => 'Sa',
 'feb' => 'Duwa',
 'mar' => 'Lhèë',
 'apr' => 'Peuët',
-'may' => 'Lim',
+'may' => 'Limong',
 'jun' => 'Nam',
-'jul' => 'Tuj',
-'aug' => 'Lap',
-'sep' => 'Sik',
-'oct' => 'Sip',
-'nov' => 'Sib',
-'dec' => 'Dub',
+'jul' => 'Tujôh',
+'aug' => 'Lapan',
+'sep' => 'Sikureuëng',
+'oct' => 'Siplôh',
+'nov' => 'Siblaih',
+'dec' => 'Duwa Blaih',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kawan|Kawan}}',
 'category_header' => 'Teunuléh lam kawan "$1"',
 'subcategories' => 'Aneuk kawan',
-'category-media-header' => 'Alat lam kawan "$1"',
+'category-media-header' => 'Peukakaih lam kawan "$1"',
 'category-empty' => "''Kawan nyoë jinoë hat hana teunuléh atawa media.''",
 'hidden-categories' => '{{PLURAL:$1|Kawan teusom|Kawan teusom}}',
 'hidden-category-category' => 'Kawan teusom',
@@ -287,7 +282,7 @@ $messages = array(
 'noindex-category' => 'On nyang hana geuindex',
 'broken-file-category' => 'On ngon gamba reuloh',
 
-'about' => 'Bhah',
+'about' => 'Bhaih',
 'article' => 'Teunuléh',
 'newwindow' => '(peuhah bak tingkap barô)',
 'cancel' => 'Peubateuë',
@@ -322,7 +317,7 @@ $messages = array(
 'vector-view-history' => 'Atra u likôt',
 'vector-view-view' => 'Beuët',
 'vector-view-viewsource' => 'Eu nè',
-'actions' => 'Buet',
+'actions' => 'Buët',
 'namespaces' => 'Ruweuëng nan',
 'variants' => 'Ragam',
 
@@ -338,7 +333,7 @@ $messages = array(
 'history' => 'Atra u likot',
 'history_short' => 'Atra u likôt',
 'updatedmarker' => 'geuubah yoh seunaweue keuneulheueh lon phon kon',
-'printableversion' => 'Seunalén citak',
+'printableversion' => 'Seunalén rakam',
 'permalink' => 'Neuhubông teutap',
 'print' => 'Rakam',
 'view' => 'Beuet',
@@ -359,7 +354,7 @@ $messages = array(
 'talkpage' => 'Peugah haba bhah ôn nyoë',
 'talkpagelinktext' => 'Marit',
 'specialpage' => 'Ôn kusuih',
-'personaltools' => 'Alat droë',
+'personaltools' => 'Peukakaih droë',
 'postcomment' => 'Beunagi baro',
 'articlepage' => 'Eu ôn asoë',
 'talk' => 'Peugah haba',
@@ -420,7 +415,7 @@ $1",
 
 'ok' => 'Ka göt',
 'retrievedfrom' => 'Geurumpok nibak "$1"',
-'youhavenewmessages' => 'Droëneuh   na $1 ($2).',
+'youhavenewmessages' => 'Droëneuh na $1 ($2).',
 'newmessageslink' => 'peusan barô',
 'newmessagesdifflink' => 'neuubah keuneulheuëh',
 'youhavenewmessagesfromusers' => "Droeneuh na $1 nibak {{PLURAL:$3|ureueng nguy la'en|$3 ureueng nguy}} ($2).",
@@ -459,7 +454,7 @@ $1",
 'nstab-media' => 'Ôn media',
 'nstab-special' => 'Kusuih',
 'nstab-project' => 'Buët ôn',
-'nstab-image' => 'Beureukah',
+'nstab-image' => 'Beureukaih',
 'nstab-mediawiki' => 'Peusan',
 'nstab-template' => 'Seunaleuëk',
 'nstab-help' => 'Beunantu',
@@ -578,21 +573,21 @@ Meunyo ureueng la\'en nyang peugot neulakee nyoe, atawa meunyo droeneuh ka neuin
 'retypenew' => 'Pasoë teuma lageuëm barô:',
 
 # Edit page toolbar
-'bold_sample' => 'Citak teubay naseukah nyoë',
+'bold_sample' => 'Rakam teubay naseukah nyoë',
 'bold_tip' => 'Citak teubay',
-'italic_sample' => 'Citak singèt naseukah nyoë',
-'italic_tip' => 'Citak singèt',
+'italic_sample' => 'Rakam singèt naseukah nyoë',
+'italic_tip' => 'Rakam singèt',
 'link_sample' => 'Nan hubông',
 'link_tip' => 'Hubông dalam',
-'extlink_sample' => 'http://www.example.com nan hubông',
+'extlink_sample' => 'http://www.example.com nan neuhubông',
 'extlink_tip' => 'Hubông luwa (bèk tuwoë bôh http:// bak away)',
 'headline_sample' => 'Naseukah nan',
 'headline_tip' => 'Aneuk beunagi tingkat 1',
 'nowiki_sample' => 'Bèk format naseukah nyoë',
 'nowiki_tip' => 'Bèk seutot beuntuk wiki',
-'image_tip' => 'Pasoë beureukah',
+'image_tip' => 'Pasoë beureukaih',
 'media_tip' => 'Hubông beureukah alat',
-'sig_tip' => 'Tanda jaroë Droëneuh  ngön tanda watèë',
+'sig_tip' => 'Tanda jaroë Droëneuh ngön tanda watèë',
 'hr_tip' => 'Garéh data',
 
 # Edit pages
@@ -648,9 +643,9 @@ Nyoë pat nakeuh log seunampôh nibak ôn nyoë:",
 Log seunampôh ngon log peuninah ôn nyoë geupeuseudiya di yup nyoe keu keuneubah.',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''Ingat:''' Seunipat seunaleuek nyang neunguy rayek that.
-Ladom seunaleuek hana geupeuroh",
-'post-expand-template-inclusion-category' => 'On ngon seunipat seunaleuek nyang leubeh bataih',
+'post-expand-template-inclusion-warning' => "'''Ingat:''' Seunipat seunaleuëk nyang neunguy rayek that.
+Ladôm seunaleuëk hana geupeurôh",
+'post-expand-template-inclusion-category' => 'Ôn ngön seunipat seunaleuëk nyang leubèh bataih',
 'post-expand-template-argument-warning' => "'''Ingat:''' On nyoe na paleng h'an saboh alasan seunaleuek nyang na sunipat ekspansi nyang raya that.
 Alasan-alasan nyan hana geupeureumeuen.",
 'post-expand-template-argument-category' => 'On ngon alasan seunaleuek nyang hana geupeureumeuen',
@@ -658,7 +653,7 @@ Alasan-alasan nyan hana geupeureumeuen.",
 # History pages
 'viewpagelogs' => 'Eu log ôn nyoë',
 'currentrev' => 'Geunantoë jinoë',
-'currentrev-asof' => 'Geunantoë paléng barô bak $1',
+'currentrev-asof' => 'Geunantoë barô bak $1',
 'revisionasof' => 'Gantoë tiëp $1',
 'revision-info' => 'Geunantoë tiëp $1; $2',
 'previousrevision' => '←Geunantoë sigohlomjih',
@@ -679,8 +674,8 @@ Alasan-alasan nyan hana geupeureumeuen.",
 
 # Revision deletion
 'rev-delundel' => 'peuleumah/peusom',
-'revdel-restore' => 'Ubah leumah',
-'revdel-restore-deleted' => 'geunantoe nyang ka geusampoh',
+'revdel-restore' => 'Ubah neuleumah',
+'revdel-restore-deleted' => 'geunantoe nyang ka geusampôh',
 'revdel-restore-visible' => 'geunantoe nyang leumah',
 
 # Merge log
@@ -704,14 +699,14 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'prevn' => '{{PLURAL:$1|$1}} sigohlomjih',
 'nextn' => '{{PLURAL:$1|$1}} lheuëh nyan',
 'prevn-title' => '$1 {{PLURAL:$1|hasé|hasé}} sigohlomjih',
-'nextn-title' => '$1 {{PLURAL:$1|hase|hase}} lheueh nyan',
-'shown-title' => 'Peuleumah $1 {{PLURAL:$1|hasé|hasé}} tiëp halaman',
+'nextn-title' => '$1 {{PLURAL:$1|hasé}} lheuëh nyan',
+'shown-title' => 'Peuleumah $1 {{PLURAL:$1|hasé}} tiëp ôn',
 'viewprevnext' => 'Eu ($1 {{int:pipe-separator}} $2)($3)',
 'searchmenu-exists' => "'''Na on ngon nan \"[[:\$1]]\" bak wiki nyoe.'''",
-'searchmenu-new' => "'''Peugot on \"[[:\$1]]\" bak wiki nyoe!'''",
+'searchmenu-new' => "'''Peugöt ôn \"[[:\$1]]\" bak wiki nyoë!'''",
 'searchhelp-url' => 'Help:Asoë',
-'searchprofile-articles' => 'On asoe',
-'searchprofile-project' => 'On Beunantu ngon Buet',
+'searchprofile-articles' => 'Ôn asoë',
+'searchprofile-project' => 'Ôn Beunantu ngön Buët',
 'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Ban dum',
 'searchprofile-advanced' => 'Tingkat lanjut',
@@ -719,11 +714,11 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'searchprofile-project-tooltip' => 'Mita bak $1',
 'searchprofile-images-tooltip' => 'Mita beureukaih',
 'searchprofile-everything-tooltip' => 'Mita ban dum ôn asoë (rôh ôn marit)',
-'searchprofile-advanced-tooltip' => 'Mita bak ruweueng nan meupat-pat',
+'searchprofile-advanced-tooltip' => 'Mita bak ruweuëng nan meupat-pat',
 'search-result-size' => '$1 ({{PLURAL:$2|1 narit|$2 narit}})',
 'search-result-category-size' => '{{PLURAL:$1|1 anggeeta|$1 anggeeta}} ({{PLURAL:$2|1 aneuk kawan|$2 aneuk kawan}}, {{PLURAL:$3|1 beureukaih|$3 beureukaih}})',
 'search-redirect' => '(peuninah $1)',
-'search-section' => '(bagian $1)',
+'search-section' => '(beunagi $1)',
 'search-suggest' => 'Kadang meukeusud Droëneuh nakeuh: $1',
 'search-interwiki-caption' => 'Buët la’én',
 'search-interwiki-default' => 'Hasé $1:',
@@ -749,7 +744,7 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'yourrealname' => 'Nan aseuli:',
 'prefs-help-realname' => '* Nan aseuli hana meucéh neupasoë.
 Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë nyang tuléh.',
-'prefs-help-email' => 'Alamat surat-e hana meuceh na, tapi geupeureulee keu peugot ulang lageuem, meunyo droeneuh tuwoe lageuem.',
+'prefs-help-email' => 'Alamat surat-e hana meuceh na, tapi geupeureulee keu seumeugot ulang lageuem, meunyo droeneuh tuwoe lageuem.',
 'prefs-help-email-others' => "Droeneuh jeuet cit neupileh neupubiyeue ureueng la'en geupeu'et surat keu droeneuh rot surat-e rot seunambat bak on ureueng nguy atawa on marit.
 Surat-e droeneuh h'an geupeugah keu ureueng nyan.",
 
@@ -774,12 +769,12 @@ Surat-e droeneuh h'an geupeugah keu ureueng nyan.",
 'recentchanges-summary' => "Di yup nyoë nakeuh neuubah barô nyang na bak Wikipèdia nyoë.
 Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô, '''u''' = neuandam ubeut, '''b''' = neuandam bot, (± ''bit'') = jumeulah asoë meutamah/meukureuëng, → = neuandam beunagi, ← = mohtasa otomatis.
 ----",
-'recentchanges-feed-description' => 'Peutumèë neu’ubah paléng barô lam wiki bak eumpeuën nyoë.',
+'recentchanges-feed-description' => 'Peuteumèë neu’ubah barô lam wiki bak umpeuën nyoë.',
 'recentchanges-label-newpage' => 'Neuandam nyoe jipeugot on baro',
 'recentchanges-label-minor' => 'Nyoe neuandam ubeut',
 'recentchanges-label-bot' => 'Neuandam nyoe geupubuet le bot',
 'recentchanges-label-unpatrolled' => 'Neuandam nyoe goh lom geukalon',
-'rcnote' => "Di yup nyoë nakeuh {{PLURAL:$1|nakeuh '''1''' neu’ubah paléng barô |nakeuh '''$1''' neu’ubah paléng barô}} lam {{PLURAL:$2|'''1''' uroë|'''$2''' uroë}} nyoë, trôk ‘an $5, $4.",
+'rcnote' => "Di yup nyoë nakeuh {{PLURAL:$1|nakeuh '''1''' neu’ubah barô |nakeuh '''$1''' neu’ubah barô}} lam {{PLURAL:$2|'''1''' uroë|'''$2''' uroë}} nyoë, trôk ‘an $5, $4.",
 'rcnotefrom' => 'Di yup nyoë nakeuh neu’ubah yôh <strong>$2</strong> (geupeuleumah trôh ‘an <strong>$1</strong> neu’ubah).',
 'rclistfrom' => 'Peuleumah neuubah paléng barô yôh $1 kön',
 'rcshowhideminor' => '$1 andam bacut',
@@ -824,19 +819,19 @@ Ceunatat: (bida) = neuubah, (riwayat) = riwayat teumuléh, '''B''' = ôn barô,
 'listfiles' => 'Dapeuta beureukah',
 
 # File description page
-'file-anchor-link' => 'Beureukah',
-'filehist' => 'Riwayat beureukah',
-'filehist-help' => 'Teugon bak tanggay/watèë keu eu beureukah nyoë ‘oh watèë nyan.',
+'file-anchor-link' => 'Beureukaih',
+'filehist' => 'Riwayat beureukaih',
+'filehist-help' => 'Teugon bak uroë buleuën/watèë keu eu beureukaih nyoë ‘oh watèë nyan.',
 'filehist-revert' => 'peuriwang',
 'filehist-current' => 'jinoë hat',
-'filehist-datetime' => 'Tanggay/Watèë',
+'filehist-datetime' => 'Uroë buleuën/Watèë',
 'filehist-thumb' => 'Beuntuk ubeut',
 'filehist-thumbtext' => 'Beuntuk ubeut keu seunalén tiëp $1',
 'filehist-user' => 'Ureuëng nguy',
 'filehist-dimensions' => 'Dimènsi',
 'filehist-filesize' => 'Rayek beureukah',
 'filehist-comment' => 'Tapeusé',
-'imagelinks' => 'Meuneunguy beureukaih',
+'imagelinks' => 'Neunguy beureukaih',
 'linkstoimage' => 'Ôn di yup nyoë na {{PLURAL:$1|hubông|$1 hubông}} u beureukah nyoë:',
 'nolinkstoimage' => 'Hana ôn nyang na hubông u beureukah nyoë.',
 'sharedupload' => 'Beureukah nyoë dari $1 ngön kadang geunguy lé buët-buët la’én.',
@@ -939,7 +934,7 @@ Teuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
 # Special:ListGroupRights
 'listgrouprights-members' => '(dapeuta anggèëta)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Surat-e ureuëng nguy',
 
 # Watchlist
@@ -1012,15 +1007,15 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'blanknamespace' => '(Keuë)',
 
 # Contributions
-'contributions' => 'Peuneugöt {{GENDER:$1|ureuëng nguy}}',
-'contributions-title' => 'Peuneugöt ureuëng nguy keu $1',
-'mycontris' => 'Peuneugöt',
+'contributions' => 'Beuneuri {{GENDER:$1|ureuëng nguy}}',
+'contributions-title' => 'Beuneuri ureuëng nguy keu $1',
+'mycontris' => 'Beuneuri',
 'contribsub2' => 'Keu $1 ($2)',
 'uctop' => '(ateuëh)',
 'month' => 'Yôh buleuën (ngön yôh goh lom nyan)',
 'year' => 'Yôh thôn (ngön yôh goh lom nyan)',
 
-'sp-contributions-newbies' => 'Keu ureuëng-ureuëng nyang ban nguy mantöng',
+'sp-contributions-newbies' => 'Keu ureuëng ban dapeuta mantöng',
 'sp-contributions-newbies-sub' => 'Keu ureuëng nguy barô',
 'sp-contributions-blocklog' => 'Log peutheun',
 'sp-contributions-uploads' => 'peunasoe',
@@ -1033,12 +1028,12 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 
 # What links here
 'whatlinkshere' => 'Neuhubông balék',
-'whatlinkshere-title' => 'Ôn nyang na hubông u $1',
+'whatlinkshere-title' => 'Ôn nyang na neuhubông u $1',
 'whatlinkshere-page' => 'Ôn:',
 'linkshere' => "Ôn-ôn nyoë meuhubông u '''[[:$1]]''':",
 'nolinkshere' => "Hana ôn nyang teuhubông u '''[[:$1]]'''.",
 'isredirect' => 'ôn peupinah',
-'istemplate' => 'deungön seunaleuëk',
+'istemplate' => 'ngön seunaleuëk',
 'isimage' => 'hubông beureukaih',
 'whatlinkshere-prev' => '$1 {{PLURAL:$1|sigohlomjih|sigohlomjih}}',
 'whatlinkshere-next' => '$1 {{PLURAL:$1|lheuëh nyan|lheuëh nyan}}',
@@ -1057,7 +1052,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'blocklink' => 'theun',
 'unblocklink' => 'peugadöh theun',
 'change-blocklink' => 'ubah theun',
-'contribslink' => 'peuneugöt',
+'contribslink' => 'beuneuri',
 'blocklogpage' => 'Log peutheun',
 'blocklogentry' => 'theun [[$1]] ngön watèë maté tanggay $2 $3',
 'unblocklogentry' => 'peugadöh theun "$1"',
@@ -1106,13 +1101,13 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugab
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ôn ureuëng nguy Droëneuh',
-'tooltip-pt-mytalk' => 'Ôn peugah haba Droëneuh',
+'tooltip-pt-mytalk' => 'Ôn marit Droëneuh',
 'tooltip-pt-preferences' => 'Atô',
 'tooltip-pt-watchlist' => 'Dapeuta ôn nyang lôn kalön',
-'tooltip-pt-mycontris' => 'Dapeuta peuneugöt Droëneuh',
+'tooltip-pt-mycontris' => 'Dapeuta beuneuri Droëneuh',
 'tooltip-pt-login' => 'Droëneuh geupadan keu tamong log, bah pih nyan hana geupeuwajéb.',
 'tooltip-pt-logout' => 'Teubiët',
-'tooltip-ca-talk' => 'Peugah haba ôn asoë',
+'tooltip-ca-talk' => 'Marit ôn asoë',
 'tooltip-ca-edit' => 'Droëneuh jeuët neuandam ôn nyoë. Neunguy tumbôy eu dilèë yôh goh neukeubah.',
 'tooltip-ca-addsection' => 'Puphôn beunagi barô',
 'tooltip-ca-viewsource' => 'Ôn nyoë geupeulindông.
@@ -1135,22 +1130,21 @@ Droëneuh cit jeuët neu’eu nèjih.',
 'tooltip-n-randompage' => 'Peuleumah beurangkari ôn',
 'tooltip-n-help' => 'Bak mita bantu.',
 'tooltip-t-whatlinkshere' => 'Dapeuta ban dum ôn wiki nyang na neuhubông u ôn nyoë',
-'tooltip-t-recentchangeslinked' => 'Neuubah barô ôn-ôn nyang na hubông u ôn nyoë',
+'tooltip-t-recentchangeslinked' => 'Neuubah barô ôn-ôn nyang na neuhubông u ôn nyoë',
 'tooltip-feed-rss' => 'Umpeuën RSS keu ôn nyoë',
 'tooltip-feed-atom' => 'Umpeuën Atom keu ôn nyoë',
 'tooltip-t-contributions' => 'Eu dapeuta nyang ka geutuléh lé ureuëng nguy nyoë',
-'tooltip-t-emailuser' => 'Kirém surat-e u ureuëng nguy nyoë',
+'tooltip-t-emailuser' => "Peu'ét surat-e u ureuëng nguy nyoë",
 'tooltip-t-upload' => 'Peutamong beureukaih',
 'tooltip-t-specialpages' => 'Dapeuta ban dum ôn kusuih',
-'tooltip-t-print' => 'Seunalén citak ôn nyoë',
-'tooltip-t-permalink' => '
-Hubông teutap keu revisi ôn nyoë',
+'tooltip-t-print' => 'Seunalén rakam ôn nyoë',
+'tooltip-t-permalink' => 'Neuhubông teutap keu geunantoë ôn nyoë',
 'tooltip-ca-nstab-main' => 'Eu ôn asoë',
 'tooltip-ca-nstab-user' => 'Eu ôn ureuëng nguy',
 'tooltip-ca-nstab-special' => 'Nyoë nakeuh ôn kusuih nyang h’an jeuët geu’andam.',
 'tooltip-ca-nstab-project' => 'Eu ôn buët',
-'tooltip-ca-nstab-image' => 'Eu ôn beureukah',
-'tooltip-ca-nstab-template' => 'Eu templat',
+'tooltip-ca-nstab-image' => 'Eu ôn beureukaih',
+'tooltip-ca-nstab-template' => 'Eu seunaleuëk',
 'tooltip-ca-nstab-help' => 'Eu ôn beunantu',
 'tooltip-ca-nstab-category' => 'Eu ôn kawan',
 'tooltip-minoredit' => 'Bôh tanda keu nyoë sibagoë andam bacut',
@@ -1161,14 +1155,14 @@ Hubông teutap keu revisi ôn nyoë',
 'tooltip-watch' => 'Peutamah ôn nyoë u dapeuta keunalön Droëneuh',
 'tooltip-rollback' => 'Peuriwang neu’andam-neu’andam bak ôn nyoë u nyang tuléh keuneulheuëh lam sigo teugön',
 'tooltip-undo' => 'Peuriwang geunantoë nyoë ngön peuhah plôk neu’andam ngön cara eu dilèë. Choë jeuët geupeutamah bak plôk ehtisa.',
-'tooltip-summary' => 'Pasoe ehtisa paneuk',
+'tooltip-summary' => 'Pasoë éhtisa paneuk',
 
 # Browsing diffs
 'previousdiff' => '← Bida away',
 'nextdiff' => 'Geunantoë lheuëh nyan →',
 
 # Media information
-'file-info-size' => '$1 × $2 piksel, rayek beureukah: $3, MIME jeunèh: $4',
+'file-info-size' => '$1 × $2 piksel, rayek beureukaih: $3, MIME jeunèh: $4',
 'file-nohires' => 'Hana resolusi nyang leubèh manyang.',
 'svg-long-desc' => 'Beureukah SVG, nominal $1 x $2 piksel, rayek beureukah: $3',
 'show-big-image' => 'Resolusi peunoh',
@@ -1180,8 +1174,8 @@ Hubông teutap keu revisi ôn nyoë',
 # Bad image list
 'bad_image_list' => 'Beuntukjih lagèë di miyub nyoë:
 
-Cit buté dapeuta (baréh nyang geupeuphôn ngon tanda *) nyang geukira. Hubông phôn bak saboh baréh beukeu hubông u beureukah nyang brôk.
-Hubông-hubông lheuëh nyan bak baréh nyang saban geukira sibagoë keucuali, nakeu teunuléh nyang jeuët peuleumah beureukah nyan.',
+Cit buté dapeuta (baréh nyang geupeuphôn ngon tanda *) nyang geukira. Hubông phôn bak saboh baréh beukeuh hubông u beureukaih nyang brôk.
+Hubông-hubông lheuëh nyan bak baréh nyang saban geukira sibagoë keucuali, nakeuh teunuléh nyang jeuët peuleumah beureukaih nyan.',
 
 # Metadata
 'metadata' => 'Metadata',
index dd485ef..580e52f 100644 (file)
@@ -46,8 +46,6 @@ $messages = array(
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبين',
 'tog-oldsig' => 'التوقيع الحالي:',
 'tog-fancysig' => 'عامل التوقيع كنص ويكي (بدون وصلة أوتوماتيكية)',
-'tog-externaleditor' => 'استخدم محررا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors مزيد من المعلومات.])',
-'tog-externaldiff' => 'استخدم فرقا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات.])',
 'tog-showjumplinks' => 'مكن وصلات "اذهب إلى" المساعدة',
 'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تعديل فارغ',
index 5536ded..66875a6 100644 (file)
@@ -15,6 +15,7 @@
  * @author Kaganer
  * @author Manie
  * @author Naudefj
+ * @author Nemo bis
  * @author Purodha
  * @author Reedy
  * @author SPQRobin
@@ -232,13 +233,11 @@ $messages = array(
 'tog-nocache' => 'Deaktiveer blaaier se bladsykas',
 'tog-enotifwatchlistpages' => "Stuur my e-pos as 'n bladsye of lêer op my dophoulys verander",
 'tog-enotifusertalkpages' => 'Stuur vir my e-pos as my eie besprekingsblad verander word',
-'tog-enotifminoredits' => 'Stuur my ook e-pos vir klein wysigings aan bladsye en lêers',
+'tog-enotifminoredits' => 'Stuur ook e-pos vir klein wysigings aan bladsye en lêers',
 'tog-enotifrevealaddr' => 'Stel my e-posadres bloot in kennisgewingspos',
 'tog-shownumberswatching' => 'Wys die aantal gebruikers wat dophou',
 'tog-oldsig' => 'Bestaande handtekening:',
-'tog-fancysig' => 'Hanteer handtekening as wikiteks (sonder outomatiese skakels)',
-'tog-externaleditor' => "Gebruik outomaties 'n eksterne redigeringsprogram (net vir kundiges - benodig spesiale verstellings op u rekenaar. [//www.mediawiki.org/wiki/Manual:External_editors Meer inligting.])",
-'tog-externaldiff' => "Gebruik outomaties 'n eksterne vergelykingsprogram (net vir kundiges - benodig spesiale verstellings op u rekenaar)",
+'tog-fancysig' => 'Doodgewone handtekening (sonder outomatiese skakel)',
 'tog-showjumplinks' => 'Wys "spring na"-skakels vir toeganklikheid',
 'tog-uselivepreview' => 'Gebruik lewendige voorskou (JavaScript) (eksperimenteel)',
 'tog-forceeditsummary' => "Let my daarop as ek nie 'n opsomming van my wysiging gee nie",
@@ -252,10 +251,11 @@ $messages = array(
 'tog-diffonly' => "Moenie 'n bladsy se inhoud onder die wysigingsverskil wys nie",
 'tog-showhiddencats' => 'Wys versteekte kategorië',
 'tog-norollbackdiff' => 'Laat verskille weg na terugrol',
+'tog-useeditwarning' => "Waarsku my as ek 'n gewysigde bladsy verlaat voordat dit gestoor is",
 
 'underline-always' => 'Altyd',
 'underline-never' => 'Nooit',
-'underline-default' => 'Standaard in u omslag of webblaaier',
+'underline-default' => 'Omslag of webblaaier se verstekwaarde',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Lettertipe vir wysigingsvenster:',
@@ -377,7 +377,7 @@ $messages = array(
 'navigation-heading' => 'Navigasie-keuseskerm',
 'errorpagetitle' => 'Fout',
 'returnto' => 'Keer terug na $1.',
-'tagline' => 'Vanuit {{SITENAME}}',
+'tagline' => 'in {{SITENAME}}',
 'help' => 'Hulp',
 'search' => 'Soek',
 'searchbutton' => 'Soek',
@@ -402,7 +402,7 @@ $messages = array(
 'protect_change' => 'wysig',
 'protectthispage' => 'Beskerm hierdie bladsy',
 'unprotect' => 'Wysig beskerming',
-'unprotectthispage' => 'Verander beskerming vir die bladsy',
+'unprotectthispage' => 'Wysig beskerming vir die bladsy',
 'newpage' => 'Nuwe bladsy',
 'talkpage' => 'Bespreek hierdie bladsy',
 'talkpagelinktext' => 'Besprekings',
@@ -424,7 +424,7 @@ $messages = array(
 'otherlanguages' => 'Ander tale',
 'redirectedfrom' => '(Aangestuur vanaf $1)',
 'redirectpagesub' => 'Aanstuurblad',
-'lastmodifiedat' => 'Laaste wysiging op $2, $1.',
+'lastmodifiedat' => 'Die bladsy is laas op $1 om $2 bygewerk.',
 'viewcount' => 'Hierdie bladsy is al {{PLURAL:$1|keer|$1 kere}} aangevra.',
 'protectedpage' => 'Beskermde bladsy',
 'jumpto' => 'Spring na:',
@@ -575,12 +575,12 @@ Geen verduideliking is verskaf nie.",
 'badtitletext' => "Die bladsytitel waarvoor gevra is, is ongeldig, leeg, of
 'n verkeerd geskakelde tussen-taal of tussen-wiki titel.",
 'perfcached' => "Die volgende inligting is gekas en mag dalk nie op datum wees nie. 'n Maksimum van {{PLURAL:$1|een resultaat|$1 resultate}} is in die kas beskikbaar.",
-'perfcachedts' => "Die volgende data is gekas en is laas op $1 bygewerk. 'n Maksimum van {{PLURAL:$4|een resultaat|$4 resultate}} is in die kas beskikbaar.",
+'perfcachedts' => "Die volgende data is gekas en is laas op $2 om $3 bygewerk. 'n Maksimum van {{PLURAL:$4|een resultaat|$4 resultate}} is in die kas beskikbaar.",
 'querypage-no-updates' => 'Opdatering van hierdie bladsy is huidiglik afgeskakel. Inligting hier sal nie tans verfris word nie.',
 'wrong_wfQuery_params' => 'Foutiewe parameters na wfQuery()<br />
 Funksie: $1<br />
 Navraag: $2',
-'viewsource' => 'Bekyk bronteks',
+'viewsource' => 'Wys bronteks',
 'viewsource-title' => 'Wys bron van $1',
 'actionthrottled' => 'Outo-rem op aksie uitgevoer',
 'actionthrottledtext' => "As 'n teen-strooi aksie, word u beperk om hierdie aksie te veel keer in 'n kort tyd uit te voer, en u het hierdie limiet oorskry.
@@ -605,7 +605,7 @@ Die rede hiervoor is "\'\'$3\'\'".',
 'invalidtitle-knownnamespace' => 'Ongeldige titel met naamruimte "$2" en teks "$3"',
 'invalidtitle-unknownnamespace' => 'Ongeldige titel met onbekende naamruimtenummer $1 en teks "$2"',
 'exception-nologin' => 'Nie aangeteken nie',
-'exception-nologin-text' => 'U moet eers op hierdie wiki aanteken alvorens u hierdie bladsy kan sien of handeling kan uitvoer.',
+'exception-nologin-text' => 'U moet eers op hierdie wiki aanmeld alvorens u hierdie bladsy kan sien of die handeling kan uitvoer.',
 
 # Virus scanner
 'virus-badscanner' => "Slegte konfigurasie: onbekende virusskandeerder: ''$1''",
@@ -615,45 +615,76 @@ Die rede hiervoor is "\'\'$3\'\'".',
 # Login and logout pages
 'logouttext' => "'''U is nou uitgeteken'''
 
-U kan aanhou om {{SITENAME}} anoniem te gebruik; of u kan weer <span class='plainlinks'>[$1 inteken]</span> as dieselfde of 'n ander gebruiker.
-Dit is moontlik dat sommige bladsye nog sal aandui dat u aangeteken is totdat u u webblaaier se kas skoonmaak.",
+U kan aanhou om {{SITENAME}} anoniem te gebruik; of u kan weer as dieselfde of 'n ander gebruiker <span class='plainlinks'>[$1 aanmeld]</span>.
+Dit is moontlik dat sommige bladsye nog sal aandui dat u steeds aangemeld is totdat u u webblaaier se kas skoonmaak.",
 'welcomeuser' => 'Welkom, $1!',
 'welcomecreation-msg' => 'U gebruiker is geskep.
 Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel nie.',
 'yourname' => 'Gebruikersnaam:',
+'userlogin-yourname' => 'Gebruikersnaam',
+'userlogin-yourname-ph' => 'Sleutel u gebruikersnaam in',
 'yourpassword' => 'Wagwoord:',
+'userlogin-yourpassword' => 'Wagwoord',
+'userlogin-yourpassword-ph' => 'Sleutel u wagwoord in',
+'createacct-yourpassword-ph' => "Sleutel 'n wagwoord in",
 'yourpasswordagain' => 'Herhaal wagwoord',
+'createacct-yourpasswordagain' => 'Bevestig wagwoord',
+'createacct-yourpasswordagain-ph' => 'Sleutel weer u wagwoord in',
 'remembermypassword' => 'Onthou dat ek op hierdie rekenaar ingeteken het (vir \'n maksimum van $1 {{PLURAL:$|dag|dae}})',
+'userlogin-remembermypassword' => 'Hou my aangemeld',
+'userlogin-signwithsecure' => 'Gebruik veilige verbinding',
 'securelogin-stick-https' => 'Bly verbind met HTTPS na aanmelding',
 'yourdomainname' => 'U domein:',
 'password-change-forbidden' => 'U kan nie wagwoorde op hierdie wiki verander nie.',
-'externaldberror' => "'n Databasisfout het voorgekom tydens aanmelding of u het nie toestemming om u eksterne rekening op te dateer nie.",
-'login' => 'Teken in',
-'nav-login-createaccount' => 'Teken in',
-'loginprompt' => 'U blaaier moet koekies toelaat om by {{SITENAME}} te kan aanteken.',
-'userlogin' => 'Teken in / registreer',
-'userloginnocreate' => 'Teken in',
+'externaldberror' => "'n Databasisfout het tydens aanmelding voorgekom of u het nie toestemming om u eksterne rekening op te dateer nie.",
+'login' => 'Meld aan',
+'nav-login-createaccount' => 'Meld aan / registreer',
+'loginprompt' => 'U blaaier moet koekies toelaat om op {{SITENAME}} te kan aanmeld.',
+'userlogin' => 'Meld aan / registreer',
+'userloginnocreate' => 'Meld aan',
 'logout' => 'Teken uit',
 'userlogout' => 'Teken uit',
 'notloggedin' => 'Nie ingeteken nie',
-'nologin' => "Nog nie geregistreer nie? '''$1'''.",
-'nologinlink' => "Skep gerus 'n rekening",
+'userlogin-noaccount' => 'Nog nie geregistreer nie?',
+'userlogin-joinproject' => 'Word lid van {{SITENAME}}',
+'nologin' => 'Nog nie geregistreer nie? $1.',
+'nologinlink' => "Skep gerus 'n gebruiker",
 'createaccount' => 'Skep nuwe rekening',
-'gotaccount' => "Het u reeds 'n rekening? '''$1'''.",
-'gotaccountlink' => 'Teken in',
-'userlogin-resetlink' => 'U aanmeld besonderhede vergeet?',
+'gotaccount' => "Het u reeds 'n rekening? $1.",
+'gotaccountlink' => 'Meld aan',
+'userlogin-resetlink' => 'U besonderhede vergeet?',
+'userlogin-resetpassword-link' => 'Herstel u wagwoord',
+'helplogin-url' => 'Help:Aanmelding',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulp met aanmelding]]',
+'createacct-join' => 'Verskaf u gegewens hieronder.',
+'createacct-emailrequired' => 'E-posadres',
+'createacct-emailoptional' => 'E-posadres (opsioneel)',
+'createacct-email-ph' => 'Sleutel u e-posadres in',
 'createaccountmail' => "Gebruik 'n tydelike lukrake wagwoord en stuur dit na die e-posadres hier onder",
+'createacct-realname' => 'Regte naam (opsioneel)',
 'createaccountreason' => 'Rede:',
+'createacct-reason' => 'Rede',
+'createacct-reason-ph' => "Hoekom u nog 'n rekening skep",
+'createacct-captcha' => 'Veiligheidskontrole',
+'createacct-imgcaptcha-ph' => 'Sleutel die teks hierbo in',
+'createacct-submit' => 'Skep u rekening',
+'createacct-benefit-heading' => '{{SITENAME}} word deur mense soos u geskep.',
+'createacct-benefit-body1' => '{{PLURAL:$1|wysiging|wysigings}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|bladsy|bladsye}}',
+'createacct-benefit-body3' => 'onlangse {{PLURAL:$1|bydraer|bydraers}}',
 'badretype' => 'Die ingetikte wagwoorde is nie dieselfde nie.',
-'userexists' => "Die gebruikersnaam wat u gekies het is reeds geneem.
+'userexists' => "Die gebruikersnaam wat u gekies het is beset.
 Kies asseblief 'n ander naam.",
 'loginerror' => 'Intekenfout',
+'createacct-error' => 'Fout tydens skep van gebruiker',
 'createaccounterror' => "Kon nie 'n rekening skep nie: $1",
-'nocookiesnew' => 'Die gebruikersrekening is geskep, maar u is nie ingeteken nie.
-{{SITENAME}} gebruik koekies om gebruikers in te teken.
+'nocookiesnew' => 'Die gebruiker is geregistreer, maar is nie aangemeld nie.
+{{SITENAME}} gebruik koekies vir die aanmeld van gebruikers.
 U rekenaar laat tans nie koekies toe nie.
-Stel u rekenaar om dit te aanvaar, dan kan u met u nuwe naam en wagwoord inteken.',
-'nocookieslogin' => '{{SITENAME}} gebruik koekies vir die aanteken van gebruikers, maar u blaaier laat dit nie toe nie. Skakel dit asseblief aan en probeer weer.',
+Stel u rekenaar om dit te aanvaar, dan sal u met u nuwe gebruiker en wagwoord kan aanmeld.',
+'nocookieslogin' => '{{SITENAME}} gebruik koekies vir die aanmeld van gebruikers.
+U blaaier laat nie koekies toe nie.
+Skakel dit asseblief aan en probeer weer.',
 'nocookiesfornew' => 'Die gebruiker is nie geskep nie omdat die oorsprong nie bevestig kon word nie.
 Maak seker dat u koekies aangeskakel het, herlaai die bladsy en probeer dan weer.',
 'noname' => 'Ongeldige gebruikersnaam.',
@@ -671,26 +702,26 @@ Intekening word verbied.',
 'passwordtooshort' => 'Wagwoorde moet ten minste {{PLURAL:$1|1 karakter|$1 karakters}} lank wees.',
 'password-name-match' => 'U wagwoord mag nie dieselfde as u gebruikersnaam wees nie.',
 'password-login-forbidden' => 'Die gebruik van hierdie gebruikersnaam en wagwoord is geweier.',
-'mailmypassword' => "E-pos my 'n nuwe wagwoord",
+'mailmypassword' => 'E-pos nuwe wagwoord',
 'passwordremindertitle' => 'Wagwoordwenk van {{SITENAME}}',
-'passwordremindertext' => 'Iemand (waarskynlik u vanaf IP-adres $1) het \'n nuwe wagwoord vir {{SITENAME}} ($4) gevra. \'n Tydelike wagwoord is vir gebruiker "$2" geskep. Die nuwe wagwoord is "$3". U kan met die tydelike wagwoord aanteken en \'n nuwe wagwoord stel. Die tydelike wagwoord sal na {{PLURAL:$5|een dag|$5 dae}} verval.
+'passwordremindertext' => 'Iemand (waarskynlik u vanaf IP-adres $1) het \'n nuwe wagwoord vir {{SITENAME}} ($4) aangevra. \'n Tydelike wagwoord is vir gebruiker "$2" geskep. Die nuwe wagwoord is "$3". U kan met die tydelike wagwoord aanmeld en \'n nuwe wagwoord stel. Die tydelike wagwoord sal na {{PLURAL:$5|een dag|$5 dae}} verval.
 
 Indien iemand anders hierdie navraag gerig het, of u het die wagwoord intussen onthou en wil nie meer die wagwoord wysig nie, kan u die boodskap ignoreer en voortgaan om die ou wagwoord te gebruik.',
 'noemail' => 'Daar is geen e-posadres vir gebruiker "$1" nie.',
 'noemailcreate' => "U moet 'n geldige e-posadres verskaf",
-'passwordsent' => 'Nuwe wagwoord gestuur na e-posadres vir "$1".
-Teken asseblief in na u dit ontvang het.',
+'passwordsent' => '\'n Nuwe wagwoord is na die e-posadres vir "$1" gestuur.
+Meld asseblief aan sodra u dit ontvang het.',
 'blocked-mailpassword' => 'U IP-adres is tans teen wysigings geblokkeer. Om verdere misbruik te voorkom is dit dus nie moontlik om die wagwoordherwinningfunksie te gebruik nie.',
 'eauthentsent' => "'n Bevestigingpos is gestuur na die gekose e-posadres.
 Voordat ander pos na die adres gestuur word,
 moet die instruksies in bogenoemde pos gevolg word om te bevestig dat die adres werklik u adres is.",
 'throttled-mailpassword' => "Daar is reeds 'n wagwoordwenk in die laaste {{PLURAL:$1|uur|$1 ure}} gestuur.
-Om misbruik te voorkom, word slegs een wagwoordwenk per {{PLURAL:$1|uur|$1 ure}} gestuur.",
+Om misbruik te voorkom, word slegs een E-pos per {{PLURAL:$1|uur|$1 ure}} gestuur.",
 'mailerror' => 'Fout tydens e-pos versending: $1',
 'acct_creation_throttle_hit' => "Besoekers aan hierdie wiki wat u IP-adres gebruik het reeds {{PLURAL:$1|'n rekening|$1 rekeninge}} in die laaste dag geskep, wat die maksimum toelaatbaar is vir die periode. Dus kan besoekers wat hierdie IP-adres gebruik tans nie meer nuwe gebruikers registreer nie.",
 'emailauthenticated' => 'U e-posadres is op $2 om $3 bevestig.',
 'emailnotauthenticated' => 'U e-poasadres is <strong>nog nie bevestig nie</strong>. Geen e-pos sal gestuur word vir die volgende funksies nie.',
-'noemailprefs' => "Spesifiseer 'n eposadres vir hierdie funksies om te werk.",
+'noemailprefs' => "Spesifiseer 'n e-posadres vir hierdie funksies om te werk.",
 'emailconfirmlink' => 'Bevestig u e-posadres',
 'invalidemailaddress' => "Die e-posadres is nie aanvaar nie, aangesien dit 'n ongeldige formaat blyk te hê.
 Voer asseblief 'n geldige e-posadres in, of laat die veld leeg.",
@@ -699,12 +730,13 @@ Voer asseblief 'n geldige e-posadres in, of laat die veld leeg.",
 'accountcreated' => 'Rekening geskep',
 'accountcreatedtext' => 'Die rekening vir gebruiker $1 is geskep.',
 'createaccount-title' => 'Rekeningskepping vir {{SITENAME}}',
-'createaccount-text' => 'Iemand het \'n rekening vir u e-posadres geskep by {{SITENAME}} ($4), met die naam "$2" en "$3". as die wagwoord.
-U word aangeraai om in te teken so gou as moontlik u wagwoord te verander.
+'createaccount-text' => 'Iemand het \'n gebruiker met die naam "$2" en u e-posadres op {{SITENAME}} ($4) geskep.
+Die wagwoord vir "$2" is "$3".
+U word aangeraai om so gou as moontlik aan te meld en u wagwoord te verander.
 
-Indien hierdie rekening foutief geskep is, kan u hierdie boodskap ignoreer.',
+Ignoreer die boodskap as die gebruiker sonder u medewete geskep is.',
 'usernamehasherror' => "'n Gebruikersnaam mag nie 'n hekkie-karakter (#) in hê nie",
-'login-throttled' => "U het al te veel kere met 'n ongeldige wagwoord probeer aanteken.
+'login-throttled' => "U het al te veel kere met 'n ongeldige wagwoord probeer aanmeld.
 Wag asseblief alvorens u weer probeer.",
 'login-abort-generic' => 'U is nie aangemeld nie. Die prosedure is gestaak.',
 'loginlanguagelabel' => 'Taal: $1',
@@ -724,8 +756,9 @@ Om voort te gaan moet u 'n nuwe wagwoord hier kies:",
 'oldpassword' => 'Ou wagwoord',
 'newpassword' => 'Nuwe wagwoord',
 'retypenew' => 'Tik nuwe wagwoord weer in',
-'resetpass_submit' => 'Stel wagwoord en teken in',
-'resetpass_success' => 'U wagwoord is suksesvol gewysig! Besig om u in te teken ...',
+'resetpass_submit' => 'Stel wagwoord en meld aan',
+'resetpass_success' => 'U wagwoord is suksesvol gewysig!
+Besig om u aan te meld...',
 'resetpass_forbidden' => 'Wagwoorde kannie gewysig word nie.',
 'resetpass-no-info' => 'U moet ingeteken wees om hierdie bladsy direk te kan gebruik.',
 'resetpass-submit-loggedin' => 'Verander wagwoord',
@@ -733,13 +766,13 @@ Om voort te gaan moet u 'n nuwe wagwoord hier kies:",
 'resetpass-wrong-oldpass' => "Die huidige of tydelike wagwoord is ongeldig.
 U het moontlik reeds u wagwoord gewysig of 'n nuwe tydelike wagwoord aangevra.",
 'resetpass-temp-password' => 'Tydelike wagwoord:',
+'resetpass-abort-generic' => "Wysiging van wagwoord is deur 'n uitbreiding gestop.",
 
 # Special:PasswordReset
 'passwordreset' => 'Wagwoord herstel',
-'passwordreset-text' => "Voltooi hierdie vorm om 'n e-pos herinnering van jou rekening besonderhede te ontvang.",
 'passwordreset-legend' => 'Kry nuwe wagwoord',
 'passwordreset-disabled' => 'Die herskik van U wagwoord is gedeaktiveer op hierdie wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Voer een van die onderstaande velde in}}',
+'passwordreset-emaildisabled' => 'E-posfunksies is afgeskakel op hierdie wiki.',
 'passwordreset-username' => 'Gebruiker:',
 'passwordreset-domain' => 'Domein:',
 'passwordreset-capture' => 'Wys resulterende e-pos?',
@@ -763,8 +796,8 @@ Meld asseblief aan en verander u wagwoord nou. As u dit nie versoek het nie, of
 'passwordreset-emailelement' => 'Gebruikersnaam: $1
 Tydelike wagwoord: $2',
 'passwordreset-emailsent' => "'n E-pos is gestuur om u wagwoord te herstel.",
-'passwordreset-emailsent-capture' => "'n E-pos ter herinnering is gestuur en word hieronder vertoon.",
-'passwordreset-emailerror-capture' => "'n E-pos ter herinnering is geskep en word hieronder vertoon. Die uitstuur daarvan het egter gefaal: $1",
+'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",
 
 # Special:ChangeEmail
 'changeemail' => 'Wysig E-posadres',
@@ -785,7 +818,7 @@ Tydelike wagwoord: $2',
 'italic_tip' => 'Skuinsdruk',
 'link_sample' => 'Skakelnaam',
 'link_tip' => 'Interne skakel',
-'extlink_sample' => 'http://www.example.com skakel se titel',
+'extlink_sample' => 'http://www.voorbeeld.org skakel se titel',
 'extlink_tip' => 'Eksterne skakel (onthou http:// vooraan)',
 'headline_sample' => 'Opskrif',
 'headline_tip' => 'Vlak 2-opskrif',
@@ -811,25 +844,25 @@ Tydelike wagwoord: $2',
 'anoneditwarning' => "'''Waarskuwing:''' Aangesien u nie aangeteken is nie, sal u IP-adres in dié blad se wysigingsgeskiedenis gestoor word.",
 'anonpreviewwarning' => "''U is nie aangeteken nie.''
 ''As u die bladsy stoor sal u IP-adres in die bladsy se geskeidenis aangeteken word.''",
-'missingsummary' => "'''Onthou:''' Geen opsomming van die wysiging is verskaf nie. As \"Stoor\" weer geklik word, word die wysiging sonder opsomming gestoor.",
+'missingsummary' => "'''Neem kennis''': Geen opsomming van die wysiging is verskaf nie. As \"Stoor\" weer gekliek word, word die wysiging sonder 'n opsomming gestoor.",
 'missingcommenttext' => 'Tik die opsomming onder.',
 'missingcommentheader' => "'''Let op:''' U het geen onderwerp/opskrif vir die opmerking verskaf nie. As u weer op \"{{int:savearticle}}\" klik, sal u wysiging sonder die onderwerp/opskrif gestoor word.",
-'summary-preview' => 'Opsomming nakijken:',
-'subject-preview' => 'Onderwerp/ opskrif voorskou:',
+'summary-preview' => 'Opsommingsvoorskou:',
+'subject-preview' => 'Onderwerp/opskrif voorskou:',
 'blockedtitle' => 'Gebruiker is geblokkeer',
-'blockedtext' => "'''U gebruikersnaam of IP-adres is geblokkeer.'''
+'blockedtext' => "'''U gebruiker of IP-adres is geblokkeer.'''
 
-Die blokkering is deur $1 gedoen.
-Die rede gegee is ''$2''.
+Die blokkade is deur $1 uitgevoer.
+Die rede verskaf is ''$2''.
 
 * Begin van blokkade: $8
 * Blokkade eindig: $6
-* Blokkering gemik op: $7
+* Blokkade gemik teen: $7
 
-U mag $1 of een van die ander [[{{MediaWiki:Grouppage-sysop}}|administreerders]] kontak om dit te bespreek.
-U kan nie die 'e-pos hierdie gebruiker'-opsie gebruik tensy 'n geldige e-pos adres gespesifiseer is in u [[Special:Preferences|rekening voorkeure]] en u nie geblokkeer is om dit te gebruik nie.
-U huidige IP-adres is $3, en die blokkering ID is #$5.
-Sluit asseblief een of albei hierdie verwysings in by enige navrae.",
+U mag $1 of een van die ander [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] kontak om dit te bespreek.
+U kan nie die 'e-pos hierdie gebruiker'-opsie gebruik nie, tensy 'n geldige e-posadres in u [[Special:Preferences|voorkeure]] gespesifiseer is en u nie geblokkeer is om dit te gebruik nie.
+U huidige IP-adres is $3 en die blokkadenommer is #$5.
+Sluit asseblief een of albei hierdie verwysings by enige navrae in.",
 'autoblockedtext' => "U IP-adres is outomaties geblok omdat dit deur 'n gebruiker gebruik was, wat deur $1 geblokkeer is.
 Die rede verskaf is:
 
@@ -851,8 +884,8 @@ Vermeld asseblief die bovermelde bloknommer as u die saak rapporteer,",
 'nosuchsectiontitle' => 'Kan nie die afdeling vind nie',
 'nosuchsectiontext' => "U het probeer om 'n afdeling wat nie bestaan nie te wysig.
 Dis was moontlik geskuif of verwyder terwyl u die bladsy gelees het.",
-'loginreqtitle' => 'Inteken Benodig',
-'loginreqlink' => 'teken in',
+'loginreqtitle' => 'Aanmelding is verpligtend',
+'loginreqlink' => 'meld aan',
 'loginreqpagetext' => 'U moet $1 om ander bladsye te bekyk.',
 'accmailtitle' => 'Wagwoord gestuur.',
 'accmailtext' => "'n Lukrake wagwoord vir [[User talk:$1|$1]] is na $2 gestuur.
@@ -862,7 +895,10 @@ Die wagwoord vir hierdie nuwe gebruiker kan op die ''[[Special:ChangePassword|ve
 'newarticletext' => "Hierdie bladsy bestaan nie.
 Tik iets in die invoerboks hier onder om 'n nuwe bladsy te skep. Meer inligting is op die [[{{MediaWiki:Helppage}}|hulpbladsy]] beskikbaar.
 As u per ongeluk hier uitgekom het, gebruik u blaaier se '''terug'''-knoppie.",
-'anontalkpagetext' => "----''Hierdie is die besprekingsblad vir 'n anonieme gebruiker wat nog nie 'n rekening geskep het nie of wat dit nie gebruik nie. Daarom moet ons sy/haar numeriese IP-adres gebruik vir identifikasie. Só 'n adres kan deur verskeie gebruikers gedeel word. Indien u 'n anonieme gebruiker is wat voel dat ontoepaslike kommentaar teen u gerig is, [[Special:UserLogin/signup|skep 'n rekening]] of [[Special:UserLogin|teken in]] om verwarring met ander anonieme gebruikers te voorkom.''",
+'anontalkpagetext' => "----''Hierdie is die besprekingsblad vir 'n anonieme gebruiker wat nog nie 'n gebruiker geskep het nie, of wat dit nie gebruik nie.
+Daarom moet ons sy/haar numeriese IP-adres vir identifikasie gebruik.
+Só 'n adres kan deur verskeie gebruikers gedeel word.
+Indien u 'n anonieme gebruiker is wat voel dat ontoepaslike kommentaar teen u gerig is, [[Special:UserLogin/signup|skep 'n gebruiker]] of [[Special:UserLogin|meld aan]] om verwarring met ander anonieme gebruikers te voorkom.''",
 'noarticletext' => 'Hierdie bladsy bevat geen teks nie.
 U kan [[Special:Search/{{PAGENAME}}|vir die bladsytitel in ander bladsye soek]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} die verwante logboeke deursoek]
@@ -878,7 +914,7 @@ Meer gegewens kan moontlik in die [{{fullurl:{{#Special:Log}}/delete|page={{FULL
 'userpage-userdoesnotexist-view' => 'Die gebruiker "$1" is nie geregistreer nie.',
 'blocked-notice-logextract' => 'Hierdie gebruiker is tans geblokkeer.
 Die laaste inskrywing in die blokkeerlogboek word hieronder vertoon:',
-'clearyourcache' => "'''Let wel''': Na die voorkeure gestoor is, moet u blaaier se kasgeheue verfris word om die veranderinge te sien:
+'clearyourcache' => "'''Neem kennis''': Na die wysiging is dit dalk nodig om u blaaier se kasgeheue verfris voordat u die veranderinge sal sien:
 * '''Firefox / Safari:''' hou ''Shift'' en kliek ''Reload'', of druk ''Ctrl-F5'' of ''Ctrl-R'' (''⌘-R'' op 'n Mac)
 * '''Google Chrome:''' druk ''Ctrl-Shift-R'' (''⌘-Shift-R'' op 'n Mac)
 * '''Internet Explorer:''' hou ''Ctrl'' en kliek ''Refresh'', of druk ''Ctrl-F5''
@@ -899,9 +935,9 @@ Onthou dat u eie .css- en .js-bladsye met 'n kleinletter begin, byvoorbeeld {{ns
 'previewnote' => "'''Onthou dat hierdie slegs 'n voorskou is.'''
 U teks is nog nie gestoor nie!",
 'continue-editing' => 'Wysig verder',
-'previewconflict' => 'Hierdie voorskou vertoon die teks in die boonste teksarea soos dit sou lyk indien u die bladsy stoor.',
+'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.
-Probeer asseblief weer. As dit steeds nie werk nie, probeer om [[Special:UserLogout|af te teken]] en dan weer aan te teken.'''",
+Probeer 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.'''
 
 ''Omrede rou HTML hier by {{SITENAME}} ingevoer kan word, kan die voorskou nie gesien word nie ter beskerming teen aanvalle met JavaScript.''
@@ -937,27 +973,28 @@ Deur enigiets hier te plaas, beloof u dat u dit self geskryf het, of dat dit gek
 '''MOENIE WERK WAT DEUR KOPIEREG BESKERM WORD HIER PLAAS SONDER TOESTEMMING NIE!'''",
 'longpageerror' => "'''Fout: die teks wat u bygevoeg het is {{PLURAL:$1|een kilogreep|$1 kilogrepe}} groot, wat groter is as die maksimum van {{PLURAL:$2|een kilogreep|$2 kilogrepe}}.'''
 Die bladsy kan nie gestoor word nie.",
-'readonlywarning' => "'''WAARSKUWING: Die databasis is gesluit vir onderhoud. Dus sal u nie nou u wysigings kan stoor nie. Dalk wil u die teks in 'n lêer plak en stoor vir later.'''
+'readonlywarning' => "'''WAARSKUWING: Die databasis is gesluit vir onderhoud. Dus sal u nie nou u wysigings kan stoor nie.'''
+Dit is miskien verstandig om die teks tydelik in 'n lêer plak en te stoor vir later wanneer die databasis weer oop is.
 
 Die administrateur wat dit gesluit het se verduideliking: $1",
 'protectedpagewarning' => "'''WAARSKUWING: Hierdie bladsy is beveilig sodat slegs administrateurs die inhoud sal kan verander.''' Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
-'semiprotectedpagewarning' => "'''Let wel:''' Hierdie artikel is beveilig sodat slegs ingetekende gebruikers dit sal kan wysig. Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
+'semiprotectedpagewarning' => "'''Let wel:''' Hierdie artikel is beskerm sodat slegs ingetekende gebruikers dit sal kan wysig. Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
 'cascadeprotectedwarning' => "'''Waarskuwing:''' Die bladsy was beveilig sodat dit slegs deur administrateurs gewysig kan word, omrede dit ingesluit is in die volgende {{PLURAL:$1|bladsy|bladsye}} wat kaskade-beskerming geniet:",
 'titleprotectedwarning' => "'''WAARSKUWING: Hierdie bladsy is beveilig. Slegs gebruikers met [[Special:ListGroupRights|spesiale regte]] sal dit kan skep.'''
 Die nuutste logboekinskrywing word hieronder ter verwysing vertoon:",
-'templatesused' => '{{PLURAL:$1|Sjabloon|Sjablone}} gebruik op hierdie blad:',
+'templatesused' => '{{PLURAL:$1|Sjabloon|Sjablone}} wat op hierdie bladsy gebruik word:',
 'templatesusedpreview' => '{{PLURAL:$1|Sjabloon|Sjablone}} gebruik in hierdie voorskou:',
 'templatesusedsection' => 'Die volgende {{PLURAL:$1|sjabloon|sjablone}} word in hierdie afdeling gebruik:',
 'template-protected' => '(beskermd)',
 'template-semiprotected' => '(half-beskerm)',
 'hiddencategories' => "Hierdie bladsy is 'n lid van {{PLURAL:$1|1 versteekte kategorie|$1 versteekte kategorië}}:",
 'edittools' => '<!-- Die teks hier sal onderaan wysiging- en oplaaivorms vertoon word. -->',
-'nocreatetext' => '{{SITENAME}} het die skep van nuwe bladsye beperk.
-U kan slegs bestaande bladsye wysig, of u kan [[Special:UserLogin|aanteken of registreer]].',
+'nocreatetext' => "{{SITENAME}} het die skep van nuwe bladsye beperk.
+U kan slegs bestaande bladsye wysig, of u kan [[Special:UserLogin|aanmeld of 'n gebruiker registreer]].",
 'nocreate-loggedin' => 'U het nie regte om nuwe blaaie te skep nie.',
 'sectioneditnotsupported-title' => 'Dit is nie moontlik om paragrawe te wysig nie',
 'sectioneditnotsupported-text' => 'Dit is nie moontlik om paragrawe op hierdie bladsy te wysig nie.',
-'permissionserrors' => 'Toestemmings Foute',
+'permissionserrors' => 'Toestemmingsfoute',
 'permissionserrorstext' => 'U het nie toestemming om hierdie te doen nie, om die volgende {{PLURAL:$1|rede|redes}}:',
 'permissionserrorstext-withaction' => 'U het geen regte om $2, vir die volgende {{PLURAL:$1|rede|redes}}:',
 'recreate-moveddeleted-warn' => "'''Waarskuwing: U herskep 'n bladsy wat vantevore verwyder is.'''
@@ -965,7 +1002,7 @@ U kan slegs bestaande bladsye wysig, of u kan [[Special:UserLogin|aanteken of re
 U moet besluit of dit wys is om voort te gaan om aan hierdie bladsy te werk.
 Die skrap- en skuiflogboeke vir die bladsy word vir u gerief hier onder vertoon:",
 'moveddeleted-notice' => 'Hierdie bladsy is verwyder.
-Die skrap- en skuif-logboeke word hieronder ter inligting weergegee.',
+Die skrap- en skuiflogboeke word hieronder ter inligting weergegee.',
 'log-fulllog' => 'Wys volledige logboek',
 'edit-hook-aborted' => "Die wysiging is deur 'n hoek gekanselleer.
 Geen verduideliking is verskaf nie.",
@@ -979,6 +1016,8 @@ Dit bestaan alreeds.',
 'content-failed-to-parse' => 'Dit was nie moontlik om die inhoud van die MIME-tipe $2 vir die model $1 te verwerk nie: $3.',
 '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.
+Indien u aangemeld is, kan u hierdie waarskuwing in die "{{int:prefs-editing}}"-afdeling van u voorkeure afskakel.',
 
 # Content models
 'content-model-wikitext' => 'Wikiteks',
@@ -1201,9 +1240,9 @@ Dit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n blad
 Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
 
 # Search results
-'searchresults' => 'soekresultate',
+'searchresults' => 'Soekresultate',
 'searchresults-title' => 'Soekresultate vir "$1"',
-'searchresulttext' => 'Vir meer inligting oor {{SITENAME}} soekresultate, lees [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchresulttext' => 'Vir meer inligting oor {{SITENAME}}-soekresultate, lees [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'U soek vir \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|alle bladsye wat met "$1" begin]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle bladsye wat aan "$1" skakel]])',
 'searchsubtitleinvalid' => 'Vir navraag "$1"',
 'toomanymatches' => "Te veel resultate. Probeer asseblief 'n ander soektog.",
@@ -1216,7 +1255,7 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 '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',
-'viewprevnext' => 'Kyk na ($1 {{int:pipe-separator}} $2) ($3).',
+'viewprevnext' => 'Wys ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Soekopsies',
 'searchmenu-exists' => "'''Daar is reeds 'n bladsy genaamd \"[[:\$1]]\" op die wiki'''",
 'searchmenu-new' => "'''Skep die bladsy \"[[:\$1]]\" op hierdie wiki'''",
@@ -1238,7 +1277,7 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'search-redirect' => '(aanstuur $1)',
 'search-section' => '(afdeling $1)',
 'search-suggest' => 'Het u $1 bedoel?',
-'search-interwiki-caption' => 'Suster projekte',
+'search-interwiki-caption' => 'Susterprojekte',
 'search-interwiki-default' => '$1 resultate:',
 'search-interwiki-more' => '(meer)',
 'search-relatedarticle' => 'Verwante',
@@ -1246,7 +1285,7 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'searcheverything-enable' => 'Soek in alle naamruimtes',
 'searchrelated' => 'verwante',
 'searchall' => 'alle',
-'showingresults' => "Hier volg {{PLURAL:$1|'''1''' resultaat|'''$1''' resultate}} wat met #'''$2''' begin.",
+'showingresults' => "Hier volg {{PLURAL:$1|'''1''' resultaat|'''$1''' resultate}} vanaf #'''$2'''.",
 'showingresultsnum' => "Hier onder {{PLURAL:$3|is '''1''' resultaat|is '''$3''' resultate}} vanaf #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Resultaat '''$1''' van '''$3'''|Resultate '''$1 - $2''' van '''$3'''}} vir '''$4'''",
 'nonefound' => "<strong>Opmerking</strong>: nie alle naamruimtes word by verstek deursoek nie.
@@ -1258,27 +1297,19 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
 'powersearch-ns' => 'Soek in naamruimtes:',
 'powersearch-redir' => 'Wys aanstuurbladsye',
 'powersearch-field' => 'Soek vir',
-'powersearch-togglelabel' => 'Kies',
-'powersearch-toggleall' => 'Alles',
+'powersearch-togglelabel' => 'Kies:',
+'powersearch-toggleall' => 'Alle',
 'powersearch-togglenone' => 'Geen',
 'search-external' => 'Eksterne soektog',
 'searchdisabled' => '{{SITENAME}} se soekfunksie is tans afgeskakel ter wille van werkverrigting. Gebruik gerus intussen Google of Yahoo! Let daarop dat hulle indekse van die {{SITENAME}}-inhoud verouderd mag wees.',
-
-# Quickbar
-'qbsettings' => 'Snelbalkvoorkeure',
-'qbsettings-none' => 'Geen',
-'qbsettings-fixedleft' => 'Links vas.',
-'qbsettings-fixedright' => 'Regs vas.',
-'qbsettings-floatingleft' => 'Dryf links.',
-'qbsettings-floatingright' => 'Dryf regs.',
-'qbsettings-directionality' => 'Vas, afhanklik van die skryfrigting van u taal',
+'search-error' => "'n Fout het tydens die soektog voorgekom: $1",
 
 # Preferences page
 'preferences' => 'Voorkeure',
 'mypreferences' => 'Voorkeure',
 'prefs-edits' => 'Aantal wysigings:',
 'prefsnologin' => 'Nie ingeteken nie',
-'prefsnologintext' => 'U moet <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aanteken]</span> om voorkeure te kan verander.',
+'prefsnologintext' => 'U moet <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aanmeld]</span> om voorkeure te kan verander.',
 'changepassword' => 'Verander wagwoord',
 'prefs-skin' => 'Omslag',
 'skin-preview' => 'Voorskou',
@@ -1340,7 +1371,7 @@ Hier volg 'n lukraak gegenereerde waarde wat u kan gebruik: $1",
 'allowemail' => 'Laat e-pos van ander toe',
 'prefs-searchoptions' => 'Soek',
 'prefs-namespaces' => 'Naamruimtes',
-'defaultns' => 'Anders soek in hierdie naamruimtes:',
+'defaultns' => 'Anders, soek in hierdie naamruimtes:',
 'default' => 'verstek',
 'prefs-files' => 'Lêers',
 'prefs-custom-css' => 'Persoonlike CSS',
@@ -1372,7 +1403,8 @@ Dit mag nie meer as $1 {{PLURAL:$1|karakter|karakters}} bevat nie.',
 'prefs-help-gender' => 'Opsioneel: dit word gebruik om gebruikers korrek aan te spreek in die sagteware.
 Die inligting is vir ander gebruikers sigbaar.',
 'email' => 'E-pos',
-'prefs-help-realname' => 'Regte naam (opsioneel): as u hierdie verskaf, kan dit gebruik word om erkenning vir u werk te gee.',
+'prefs-help-realname' => 'Regte naam is opsioneel.
+As u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.',
 'prefs-help-email' => 'E-posadres is opsioneel, maar is nodig om u wagwoord aan u te stuur sou u dit vergeet.',
 'prefs-help-email-others' => 'U kan ook kies om ander toe te laat om u deur u gebruikers- en besprekingsbladsy te kontak sonder om u identiteit te openbaar.',
 'prefs-help-email-required' => 'E-pos adres word benodig.',
@@ -1410,12 +1442,13 @@ Die inligting is vir ander gebruikers sigbaar.',
 * 'n Ongeselekteerde boks beteken dat die gebruiker nie 'n lid van die groep is nie.
 * 'n Ster (*) beteken dat u nie die gebruiker uit 'n groep kan verwyder as hy eers daaraan behoort nie, of vice versa.",
 'userrights-reason' => 'Rede:',
-'userrights-no-interwiki' => 'U het nie toestemming om gebruikersregte op ander wikis te verander nie.',
+'userrights-no-interwiki' => "U het nie toestemming om gebruikersregte op ander wiki's te verander nie.",
 'userrights-nodatabase' => 'Databasis $1 bestaan nie of is nie hier beskikbaar nie.',
-'userrights-nologin' => "U moet [[Special:UserLogin|aanteken]] as 'n administrateur om gebruikersregte te mag toeken.",
+'userrights-nologin' => "U moet as 'n administrateur [[Special:UserLogin|aanmeld]] om gebruikersregte te kan toeken.",
 'userrights-notallowed' => 'U het nie magtiging om gebruikersregte by te sit of weg te neem nie.',
 'userrights-changeable-col' => 'Groepe wat u kan verander',
 'userrights-unchangeable-col' => 'Groepe wat u nie kan verander nie',
+'userrights-conflict' => 'Konflik met gebruikersregte! Pas asseblief weer u wysigings toe.',
 
 # Groups
 'group' => 'Groep:',
@@ -1553,19 +1586,19 @@ Die inligting is vir ander gebruikers sigbaar.',
 'recentchanges' => 'Onlangse wysigings',
 'recentchanges-legend' => 'Opsies vir onlangse wysigings',
 'recentchanges-summary' => 'Volg die mees onlangse wysigings aan die wiki op die bladsy.',
-'recentchanges-feed-description' => 'Spoor die mees onlangse wysigings op die wiki na in die voer.',
+'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 was deur 'n bot uitgevoer",
 'recentchanges-label-unpatrolled' => 'Die wysiging is nog nie gekontroleer nie',
-'rcnote' => "Hier volg die laaste {{PLURAL:$1|'''$1''' wysiging|'''$1''' wysigings}} vir die afgelope {{PLURAL:$2|dag|'''$2''' dae}}, soos vanaf $4, $5.",
-'rcnotefrom' => 'Hier onder is die wysigings sedert <b>$2</b> (tot by <b>$1</b> word gewys).',
+'rcnote' => "Hier volg die laaste {{PLURAL:$1|'''$1''' wysiging|'''$1''' wysigings}} gedurende die afgelope {{PLURAL:$2|dag|'''$2''' dae}}, soos vanaf $4 om $5.",
+'rcnotefrom' => "Hier volg wysigings sedert '''$2''' (maksimum van '''$1''' word gewys).",
 'rclistfrom' => 'Vertoon wysigings vanaf $1',
 'rcshowhideminor' => '$1 klein wysigings',
 'rcshowhidebots' => '$1 robotte',
 'rcshowhideliu' => '$1 aangetekende gebruikers',
 'rcshowhideanons' => '$1 anonieme gebruikers',
-'rcshowhidepatr' => '$1 gepatrolleerde wysigings',
+'rcshowhidepatr' => '$1 gekontroleerde wysigings',
 'rcshowhidemine' => '$1 my wysigings',
 'rclinks' => 'Vertoon die laaste $1 wysigings in die afgelope $2 dae<br />$3',
 'diff' => 'verskil',
@@ -1601,8 +1634,7 @@ Bladsye op [[Special:Watchlist|u dophoulys]] word in '''vetdruk''' uitgewys.",
 'reuploaddesc' => 'Keer terug na die laaivorm.',
 'upload-tryagain' => 'Stuur gewysigde lêerbeskrywing',
 'uploadnologin' => 'Nie ingeteken nie',
-'uploadnologintext' => 'Teken eers in [[Special:UserLogin|logged in]]
-om lêers te laai.',
+'uploadnologintext' => 'U moet [[Special:UserLogin|aanmeld]] alvorens u lêers kan laai.',
 'upload_directory_missing' => 'Die oplaaigids ($1) bestaan nie en kon nie deur die webbediener geskep word nie.',
 'upload_directory_read_only' => 'Die webbediener kan nie na die oplaai gids ($1) skryf nie.',
 'uploaderror' => 'Laaifout',
@@ -1634,7 +1666,7 @@ Om die lêer in 'n artikel te gebruik, plaas 'n skakel in een van die volgende f
 'filedesc' => 'Opsomming',
 'fileuploadsummary' => 'Opsomming:',
 'filereuploadsummary' => 'Lêerwysigings:',
-'filestatus' => 'Outeursregsituasie:',
+'filestatus' => 'Outeursregstatus:',
 'filesource' => 'Bron:',
 'uploadedfiles' => 'Gelaaide lêers',
 'ignorewarning' => 'Ignoreer waarskuwings en stoor die lêer',
@@ -1698,8 +1730,8 @@ Dit word aanbeveel dat u die lêer se skrapgeskiedenis besigtig voor u poog om d
 'uploadwarning-text' => 'Verander die onderstaande lêerbeskrywing en probeer dan weer.',
 'savefile' => 'Stoor lêer',
 'uploadedimage' => 'het "[[$1]]" gelaai',
-'overwroteimage' => 'het een nuwe weergawe van "[[$1]]" gelaai',
-'uploaddisabled' => 'Laai is uitgeskakel',
+'overwroteimage' => 'het \'n nuwe weergawe van "[[$1]]" opgelaai',
+'uploaddisabled' => 'Die oplaai van lêers is afgeskakel.',
 'copyuploaddisabled' => 'Die oplaai van lêers per URL is afgeskakel.',
 'uploadfromurl-queued' => 'U oplaai is in die wagtou geplaas.',
 'uploaddisabledtext' => 'Die oplaai van lêers is afgeskakel.',
@@ -1710,7 +1742,7 @@ Kyk na die "file_uploads"-instelling.',
 'uploadjava' => "Die lêer is 'n ZIP wat 'n Java .class-lêer bevat.
 Die oplaai van Java-lêers word nie toegelaat nie, omdat dit sekuriteit kan omseil.",
 'upload-source' => 'Bronlêer',
-'sourcefilename' => 'Bronlêernaam:',
+'sourcefilename' => 'Oorspronklike lêernaam:',
 'sourceurl' => 'Bron-URL:',
 'destfilename' => 'Teikenlêernaam:',
 'upload-maxfilesize' => 'Maksimum lêer grootte: $1',
@@ -1832,7 +1864,6 @@ Vir veiligheidsredes is img_auth.php gedeaktiveer.",
 'http-read-error' => 'Fout met die lees van HTTP.',
 'http-timed-out' => 'HTTP-versoek se tyd is verstreke.',
 'http-curl-error' => 'Fout met die ophaal van URL: $1',
-'http-host-unreachable' => 'Die URL is nie bereikbaar nie.',
 'http-bad-status' => "Daar was 'n probleem tydens die HTTP-versoek: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1846,7 +1877,7 @@ U kan miskien selfs tydens 'n minder besige tyd weer probeer.",
 
 'license' => 'Lisensiëring:',
 'license-header' => 'Lisensiëring',
-'nolicense' => 'Niks gekies',
+'nolicense' => 'Niks gekies nie',
 'license-nopreview' => '(Voorskou nie beskikbaar)',
 'upload_source_url' => " ('n geldige, publiek toeganklike URL)",
 'upload_source_file' => " ('n lêer op u rekenaar)",
@@ -1965,8 +1996,8 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 
 # Statistics
 'statistics' => 'Statistieke',
-'statistics-header-pages' => 'Bladsy statistieke',
-'statistics-header-edits' => 'Wysig statistieke',
+'statistics-header-pages' => 'Bladsystatistiek',
+'statistics-header-edits' => 'Wysigingstatistiek',
 'statistics-header-views' => 'Wys statistieke',
 'statistics-header-users' => 'Gebruikerstatistiek',
 'statistics-header-hooks' => 'Ander statistieke',
@@ -1980,7 +2011,7 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 'statistics-views-total-desc' => 'Die wys van nie-bestaande bladsye en spesiale bladsye is nie ingesluit nie',
 'statistics-views-peredit' => 'Bladsye besigtig per wysiging',
 'statistics-users' => 'Geregistreerde [[Special:ListUsers|gebruikers]]',
-'statistics-users-active' => 'Aktiewe grbruikers',
+'statistics-users-active' => 'Aktiewe gebruikers',
 'statistics-users-active-desc' => "Gebruikers wat in die afgelope {{PLURAL:$1|dag|$1 dae}} 'n handeling uitgevoer het",
 'statistics-mostpopular' => 'Mees bekykte bladsye',
 
@@ -2036,8 +2067,8 @@ Elke ry bevat skakels na die eerste en die tweede aanstuur, asook die eerste re
 'unusedcategories' => 'Ongebruikte kategorieë',
 'unusedimages' => 'Ongebruikte lêers',
 'popularpages' => 'Gewilde bladsye',
-'wantedcategories' => 'Begeerde kategorieë',
-'wantedpages' => 'Begeerde bladsye',
+'wantedcategories' => 'Gesoekte kategorieë',
+'wantedpages' => 'Gesoekte bladsye',
 'wantedpages-badtitle' => 'Ongeldige bladsynaam in resultate: $1',
 'wantedfiles' => 'Begeerde lêers',
 'wantedfiletext-cat' => 'Die volgende lêers word gebruik, maar bestaan nie. Lêers van eksterne biblioteke kan, ondanks die feit dat hulle wel bestaan, ook hier gelys wees. Hierdie vals positiewes word as <del>deurgehaal aangedui</del>. Bladsye met lêers wat nie bestaan nie word aangegee by [[:$1]].',
@@ -2091,12 +2122,12 @@ Dit is dus moontlik dat 'n lêer hier gelys word terwyl dit tog in gebruik is.",
 'booksources' => 'Boekbronne',
 'booksources-search-legend' => 'Soek vir boekbronne',
 'booksources-go' => 'Soek',
-'booksources-text' => "Gevolg is 'n lys van skakels wat na ander webtuistes lei wat nuwe en gebruikte boeke verkoop, en wat dalk meer inligting kan bevat oor die boeke waarop u opsoek is:",
+'booksources-text' => "Hieronder is 'n lys van webtuistes wat nuwe en gebruikte boeke verkoop, en dalk meer inligting oor die boeke waarna u soek kan bevat:",
 'booksources-invalid-isbn' => 'Die ingevoerde ISBN-kode blyk asof dit ongeldig is; maak asseblief seker dat u dit sonder fout oorgekopiëer het vanaf die oorspronklike bron.',
 
 # Special:Log
 'specialloguserlabel' => 'Uitvoerende gebruiker:',
-'speciallogtitlelabel' => 'Doel (bladsynaam of gebruiker):',
+'speciallogtitlelabel' => 'Teiken (bladsy of gebruiker):',
 'log' => 'Logboeke',
 'all-logs-page' => 'Alle openbare logboeke',
 'alllogstext' => "Vertoon 'n samestelling van alle boekstawings van {{SITENAME}}.
@@ -2132,8 +2163,8 @@ Dit is moontlik dat die naam karakters bevat wat nie in titels gebruik mag word
 # Special:Categories
 'categories' => 'Kategorieë',
 'categoriespagetext' => 'Die volgende {{PLURAL:$1|kategorie|kategorieë}} bevat bladsye of media.
-[[Special:UnusedCategories|Ongebruikte kategorieë]] word nie hier weergegee nie.
-Sie ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].',
+[[Special:UnusedCategories|Ongebruikte kategorieë]] word nie gewys nie.
+Sien ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].',
 'categoriesfrom' => 'Wys kategorieë vanaf:',
 'special-categories-sort-count' => 'sorteer volgens getal',
 'special-categories-sort-abc' => 'sorteer alfabeties',
@@ -2144,7 +2175,7 @@ Sie ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].',
 'sp-deletedcontributions-contribs' => 'bydraes',
 
 # Special:LinkSearch
-'linksearch' => 'Eksterne skakels soek',
+'linksearch' => 'Soek eksterne skakels',
 'linksearch-pat' => 'Soekpatroon:',
 'linksearch-ns' => 'Naamruimte:',
 'linksearch-ok' => 'Soek',
@@ -2157,7 +2188,7 @@ Benodig ten minste een topvlakdomein, soos byvoorbeeld "*.org".<br />
 # Special:ListUsers
 'listusersfrom' => 'Wys gebruikers, beginnende by:',
 'listusers-submit' => 'Wys',
-'listusers-noresult' => 'Geen gebruiker gevind.',
+'listusers-noresult' => 'Geen gebruikers gevind nie.',
 'listusers-blocked' => '(geblokkeer)',
 
 # Special:ActiveUsers
@@ -2190,7 +2221,7 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
 
 # Email user
 'mailnologin' => 'Geen versendadres beskikbaar',
-'mailnologintext' => "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in die [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te stuur.",
+'mailnologintext' => "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in u [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te kan stuur.",
 'emailuser' => 'Stuur e-pos na hierdie gebruiker',
 'emailuser-title-target' => 'E-pos die {{GENDER:$1|gebruiker}}',
 'emailuser-title-notarget' => 'E-pos gebruiker',
@@ -2217,7 +2248,7 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
 'emailccme' => "E-pos vir my 'n kopie van my boodskap.",
 'emailccsubject' => 'Kopie van u boodskap aan $1: $2',
 'emailsent' => 'E-pos gestuur',
-'emailsenttext' => 'U e-pos is gestuur.',
+'emailsenttext' => 'Die e-pos is gestuur.',
 'emailuserfooter' => 'Hierdie e-pos is gestuur deur $1 aan $2 met behulp van die "Stuur e-pos aan die gebruiker"-funksie van {{SITENAME}}.',
 
 # User Messenger
@@ -2231,8 +2262,7 @@ Daar kan [[{{MediaWiki:Listgrouprights-helppage}}|extra inligting]] oor individu
 'nowatchlist' => 'U het geen items in u dophoulys nie.',
 'watchlistanontext' => '$1 is noodsaaklik om u dophoulys te sien of te wysig.',
 'watchnologin' => 'Nie ingeteken nie',
-'watchnologintext' => 'U moet [[Special:UserLogin|ingeteken]]
-wees om u dophoulys te verander.',
+'watchnologintext' => 'U moet [[Special:UserLogin|aangemeld]] wees om u dophoulys te verander.',
 'addwatch' => 'Voeg by dophoulys',
 'addedwatchtext' => 'Die bladsy "[[:$1]]" is by u [[Special:Watchlist|dophoulys]] bygevoeg.
 Toekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal hier gelys word.',
@@ -2246,11 +2276,11 @@ Toekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal h
 'notvisiblerev' => 'Weergawe is verwyder',
 'watchnochange' => 'Geen item op die dophoulys is geredigeer in die gekose periode nie.',
 'watchlist-details' => '{{PLURAL:$1|$1 bladsy|$1 bladsye}} in u dophoulys, besprekingsbladsye uitgesluit.',
-'wlheader-enotif' => 'E-pos notifikasie is aangeskakel.',
-'wlheader-showupdated' => "Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys",
+'wlheader-enotif' => 'E-pos notifikasie is aangeskakel.',
+'wlheader-showupdated' => "Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys",
 'watchmethod-recent' => 'Kontroleer onlangse wysigings aan bladsye op dophoulys',
 'watchmethod-list' => 'kontroleer bladsye op dophoulys vir wysigings',
-'watchlistcontains' => 'U dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.',
+'watchlistcontains' => 'Jou dophoulys bevat $1 {{PLURAL:$1|bladsy|bladsye}}.',
 'iteminvalidname' => "Probleem met item '$1', ongeldige naam...",
 'wlnote' => "Hier volg die laaste {{PLURAL:$1|verandering|'''$1''' veranderings}} binne die laaste {{PLURAL:$2|uur|'''$2''' ure}}, soos vanaf $3 om $4.",
 'wlshowlast' => 'Wys afgelope $1 ure, $2 dae of $3',
@@ -2310,19 +2340,19 @@ Terugvoer en verdere bystand:
 # Delete
 'deletepage' => 'Skrap bladsy',
 'confirm' => 'Bevestig',
-'excontent' => "inhoud was: '$1'",
-'excontentauthor' => "Inhoud was: '$1' ('[[Special:Contributions/$2|$2]]' was die enigste bydraer)",
+'excontent' => 'inhoud was: "$1"',
+'excontentauthor' => 'Inhoud was: "$1" (en die enigste bydraer was [[Special:Contributions/$2|$2]])',
 'exbeforeblank' => "Inhoud voor uitwissing was: '$1'",
 'exblank' => 'bladsy was leeg',
 'delete-confirm' => 'Skrap "$1"',
 'delete-legend' => 'Skrap',
 'historywarning' => "'''Waarskuwing:''' Die bladsy wat u wil verwyder het 'n geskiedenis met ongeveer $1 {{PLURAL:$1|weergawe|weergawes}}:",
-'confirmdeletetext' => "U staan op die punt om 'n bladsy of prent asook al hulle geskiedenis uit die databasis te skrap.
-Bevestig asseblief dat u dit wil doen, dat u die gevolge verstaan en dat u dit doen in ooreenstemming met die [[{{MediaWiki:Policy-url}}]].",
+'confirmdeletetext' => "U staan op die punt om 'n bladsy of prent, insluitende hul geskiedenis, uit die databasis te skrap.
+Bevestig asseblief dat u dit wil doen, dat u die gevolge verstaan en dat u dit doen in ooreenstemming met die [[{{MediaWiki:Policy-url}}|beleid]].",
 'actioncomplete' => 'Aksie uitgevoer',
 'actionfailed' => 'Aksie het gefaal',
 'deletedtext' => '"$1" is geskrap.
-Kyk na $2 vir \'n rekord van onlangse skrappings.',
+Sien die $2 vir \'n rekord van onlangse skrappings.',
 'dellogpage' => 'Skraplogboek',
 'dellogpagetext' => "Hier onder is 'n lys van die mees onlangse skrappings. Alle tye is bedienertyd (UGT).",
 'deletionlog' => 'skraplogboek',
@@ -2356,7 +2386,8 @@ Die mees onlangse wysiging is gemaak deur [[User:$3|$3]] ([[User talk:$3|besprek
 'editcomment' => "Die wysigsopsomming was: \"''\$1''\".",
 'revertpage' => 'Wysigings deur [[Special:Contributions/$2|$2]] teruggerol na laaste weergawe deur $1',
 'revertpage-nouser' => 'Rol wysigings deur (gebruikersnaam verwyder) terug na die laaste weergawe deur [[User:$1|$1]]',
-'rollback-success' => 'Wysigings deur $1 teruggerol; terugverander na laaste weergawe deur $2.',
+'rollback-success' => 'Wysigings deur $1 is teruggerol.
+Die laaste weergawe van $2 is teruggeplaas.',
 
 # Edit tokens
 'sessionfailure-title' => 'Sessie het gefaal',
@@ -2395,14 +2426,14 @@ Hier is die huidige verstellings vir bladsy '''$1''':",
 'protect-cascadeon' => 'Die bladsy word beskerm want dit is ingesluit by die volgende {{PLURAL:$1|blad|blaaie}} wat kaskade-beskerming geniet. U kan die veiligheidsvlak van die bladsy verander, maar dit sal nie die ander kaskade blaaie beïnvloed nie.',
 'protect-default' => 'Laat alle gebruikers toe',
 'protect-fallback' => 'Laat slegs gebruikers met "$1" regte toe',
-'protect-level-autoconfirmed' => 'Laat slegs "autoconfirmed" gebruikers toe',
+'protect-level-autoconfirmed' => 'Laat slegs outomaties bevestigde gebruikers toe',
 'protect-level-sysop' => 'Laat slegs administrateurs toe',
 'protect-summary-cascade' => 'kaskade',
 'protect-expiring' => 'verval op $2 om $3 (UTC)',
 'protect-expiring-local' => 'verval op $1',
 'protect-expiry-indefinite' => 'verval nie',
 'protect-cascade' => 'Beveilig bladsye insluitend die bladsy (kaskade effek)',
-'protect-cantedit' => 'U kan nie die veiligheidsvlak van die blad verander nie, want u het nie regte om dit te wysig nie.',
+'protect-cantedit' => 'U kan nie die veiligheidsvlak van die bladsy verander nie, want u het nie regte om dit te wysig nie.',
 'protect-othertime' => 'Ander tyd:',
 'protect-othertime-op' => 'ander tyd',
 'protect-existing-expiry' => 'Bestaande vervaldatum: $2 om $3',
@@ -2434,7 +2465,7 @@ Hier is die huidige verstellings vir bladsy '''$1''':",
 
 # Undelete
 'undelete' => 'Besigtig geskrapte bladsye',
-'undeletepage' => 'Kyk na en herstel geskrapte bladsye',
+'undeletepage' => 'Wys en herstel geskrapte bladsye',
 'undeletepagetitle' => "'''Hier onder is die verwyderde weergawes van [[:$1]]'''.",
 'viewdeletedpage' => 'Bekyk geskrapte bladsye',
 'undeletepagetext' => 'Die volgende {{PLURAL:$1|bladsy|$1 bladsye}} is geskrap, maar is nog in die argief en kan teruggeplaas word. Die argief van geskrapte blaaie kan periodiek skoongemaak word.',
@@ -2449,7 +2480,7 @@ In sulke gevalle, verwyder die mees onlangs verwyderde weergawe uit die seleksie
 'undeletehistorynoadmin' => 'Die bladsy is geskrap.
 Die rede hiervoor word onder in die opsomming aangedui, saam met besonderhede van die gebruikers wat die bladsy gewysig het voordat dit verwyder is.
 Die verwyderde inhoud is slegs vir administrateurs sigbaar.',
-'undelete-revision' => 'Verwyder weergawe van $1 (per $4 om $5) deur $3:',
+'undelete-revision' => 'Verwyderde weergawe van $1 (soos op $4 om $5) deur $3:',
 'undeleterevision-missing' => "Ongeldige of vermiste weergawe.
 U mag moontlik 'n foutiewe skakel hê, of die weergawe is reeds herstel of uit die argief verwyder.",
 'undelete-nodiff' => 'Geen vorige wysigings gevind.',
@@ -2519,11 +2550,11 @@ Die laaste inskrywing uit die blokkeerlogboek word hier ter inligting weergegee:
 'sp-contributions-search' => 'Soek na bydraes',
 'sp-contributions-username' => 'IP-adres of gebruikersnaam:',
 'sp-contributions-toponly' => 'Wys slegs die nuutste weergawes',
-'sp-contributions-submit' => 'Vertoon',
+'sp-contributions-submit' => 'Soek',
 
 # What links here
 'whatlinkshere' => 'Skakels hierheen',
-'whatlinkshere-title' => 'Bladsye wat verwys na "$1"',
+'whatlinkshere-title' => 'Bladsye wat na "$1" skakel',
 'whatlinkshere-page' => 'Bladsy:',
 'linkshere' => "Die volgende bladsye skakel na '''[[:$1]]''':",
 'nolinkshere' => "Geen bladsye skakel na '''[[:$1]]'''.",
@@ -2547,8 +2578,8 @@ Die laaste inskrywing uit die blokkeerlogboek word hier ter inligting weergegee:
 'blockip' => 'Blokkeer gebruiker',
 'blockip-title' => 'Blokkeer gebruiker',
 'blockip-legend' => 'Blokkeer gebruiker of IP-adres',
-'blockiptext' => "Gebruik die vorm hier onder om skryftoegang van 'n sekere IP-adres te blok.
-Dit moet net gedoen word om vandalisme te voorkom en in ooreenstemming met [[{{MediaWiki:Policy-url}}|{{SITENAME}}-beleid]].
+'blockiptext' => "Gebruik die vorm hier onder om skryftoegang vir 'n gebruiker of IP-adres in te trek.
+Dit mag slegs as beskerming teen vandalisme en in ooreenstemming met die [[{{MediaWiki:Policy-url}}|beleid]] gedoen word.
 Vul 'n spesifieke rede hier onder in (haal byvoorbeeld spesifieke bladsye wat gevandaliseer is, aan).",
 'ipadressorusername' => 'IP-adres of gebruikersnaam:',
 'ipbexpiry' => 'Duur:',
@@ -2666,6 +2697,7 @@ Kontak asseblief u internet-diensverskaffer of tegniese ondersteuning en lig hul
 'sorbsreason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word.",
 'sorbs_create_account_reason' => "U IP-adres is gelys as 'n oop instaanbediener (proxy) in die DNS-swartlys wat op {{SITENAME}} gebruik word.
 U kan nie 'n rekening skep nie.",
+'xffblockreason' => "'n IP-adres wat u gebruik is geblokkeer. Dit kom in die opskrif 'X-Forwarded-For' voor. Die oorspronklike rede vir die blokkade is: $1",
 'cant-block-while-blocked' => 'U kan nie ander gebruikers blokkeer terwyl u self geblokkeer is nie.',
 'cant-see-hidden-user' => "Die gebruiker wat u probeer blokkeer is reeds geblokkeer en weggesteek.
 Aangesien u nie die 'hideuser'-reg het nie, kan u nie die blokkade van die gebruiker sien of wysig nie.",
@@ -2915,14 +2947,14 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-pt-preferences' => 'My voorkeure',
 '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 in te teken. Dit is egter nie verpligtend nie.',
-'tooltip-pt-anonlogin' => 'U word aangemoedig om in te teken; dit is egter nie verpligtend nie.',
+'tooltip-pt-login' => 'U word aangemoedig om aan te meld. Dit is egter nie verpligtend nie.',
+'tooltip-pt-anonlogin' => 'U word aangemoedig om aan te meld. Dit is egter nie verpligtend nie',
 'tooltip-pt-logout' => 'Teken uit',
-'tooltip-ca-talk' => 'Bespreking oor die inhoudsbladsy',
-'tooltip-ca-edit' => 'U kan hierdie bladsy redigeer. Gebruik asseblief die voorskouknop vóór u dit stoor.',
-'tooltip-ca-addsection' => 'Nuwe afdeling',
+'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-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-ca-history' => 'Ouer weergawes van hierdie bladsy',
 'tooltip-ca-protect' => 'Beskerm hierdie bladsy',
 'tooltip-ca-unprotect' => 'Wysig beskerming van die bladsy',
 'tooltip-ca-delete' => 'Skrap hierdie bladsy',
@@ -2936,7 +2968,7 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-p-logo' => 'Besoek die tuisblad',
 'tooltip-n-mainpage' => 'Besoek die Tuisblad',
 'tooltip-n-mainpage-description' => 'Gaan na die tuisblad',
-'tooltip-n-portal' => 'Meer oor die projek, wat u kan doen, nuttige skakels',
+'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-recentchanges' => "'n Lys van onlangse wysigings",
 'tooltip-n-randompage' => "Laai 'n lukrake bladsye",
@@ -2947,7 +2979,7 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-feed-atom' => 'Atom-voed 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 lêers op',
+'tooltip-t-upload' => 'Laai beelde of ander medialê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",
@@ -2961,9 +2993,9 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-ca-nstab-template' => 'Bekyk die sjabloon',
 'tooltip-ca-nstab-help' => 'Bekyk die hulpbladsy',
 'tooltip-ca-nstab-category' => 'Bekyk die kategoriebladsy',
-'tooltip-minoredit' => "Dui aan hierdie is 'n klein wysiging",
+'tooltip-minoredit' => "Dui aan dat hierdie 'n klein wysiging is",
 'tooltip-save' => 'Stoor u wysigings',
-'tooltip-preview' => "Sien 'n voorskou van u wysigings, gebruik dit voor u die blad stoor!",
+'tooltip-preview' => "Sien 'n voorskou van u wysigings. Gebruik hierdie funksie vóór u die bladsy stoor!",
 'tooltip-diff' => 'Wys watter veranderinge u aan die teks gemaak het.',
 'tooltip-compareselectedversions' => 'Vergelyk die twee gekose weergawes van hierdie blad.',
 'tooltip-watch' => 'Voeg hierdie blad by u dophoulys',
@@ -2971,7 +3003,7 @@ Die lêer is slegs gedeeltelik opgelaai.',
 'tooltip-watchlistedit-raw-submit' => 'Opdateer dophoulys',
 'tooltip-recreate' => 'Herskep hierdie bladsy al is dit voorheen geskrap',
 'tooltip-upload' => 'Begin oplaai',
-'tooltip-rollback' => '"Terugrol" rol met een kliek wysiging(s) terug wat die laaste gebruiker aan hierdie bladsy aangebring het.',
+'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.
 U kan daar \'n wysigingsopsomming byvoeg.',
 'tooltip-preferences-save' => 'Stoor voorkeure',
@@ -2985,12 +3017,12 @@ U kan daar \'n wysigingsopsomming byvoeg.',
 
 # Attribution
 'anonymous' => 'Anonieme {{PLURAL:$1|gebruiker|gebruikers}} van {{SITENAME}}',
-'siteuser' => '{{SITENAME}} gebruiker $1',
+'siteuser' => '{{SITENAME}}-gebruiker $1',
 'anonuser' => 'Anonieme {{SITENAME}}-gebruiker $1',
 'lastmodifiedatby' => 'Hierdie bladsy is laas op $1 om $2 deur $3 gewysig.',
 'othercontribs' => 'Gebaseer op werk van $1.',
 'others' => 'ander',
-'siteusers' => '{{SITENAME}}-{{PLURAL:$2|gebruikers|gebruikers}} $1',
+'siteusers' => '{{SITENAME}}-{{PLURAL:$2|gebruiker|gebruikers}} $1',
 'anonusers' => 'Anonieme {{SITENAME}}-{{PLURAL:$2|gebruiker|gebruikers}} $1',
 'creditspage' => 'Outeursblad',
 'nocredits' => 'Geen outeursinligting is vir hierdie bladsy nie beskikbaar nie.',
@@ -3052,8 +3084,6 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
 'pageinfo-category-files' => 'Aantal lêers',
 
 # Skin names
-'skinname-standard' => 'Standaard',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keulen blou',
 
 # Patrolling
@@ -3114,7 +3144,7 @@ $1',
 'file-no-thumb-animation-gif' => "'''Let op: vanweë tegniese beperkinge, kan duimnaels met hoë resolusie GIF-lêers nie geanimeerd gewys word nie.'''",
 
 # Special:NewFiles
-'newimages' => 'Gallery van nuwe beelde',
+'newimages' => 'Galery van nuwe beelde',
 'imagelisttext' => "Hier onder is a lys van '''$1''' {{PLURAL:$1|lêer|lêers}}, $2 gesorteer.",
 'newimages-summary' => 'Die spesiale bladsy wys die nuutste lêers wat na die wiki opgelaai is.',
 'newimages-legend' => 'Filter',
@@ -3130,11 +3160,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuut|$1 minute}}',
 'hours' => '{{PLURAL:$1|$1 uur|$1 ure}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dae}}',
+'weeks' => '{{PLURAL: $1|één week|$1 weke}}',
 'months' => '{{PLURAL:$1|een maand|$1 maande}}',
 'years' => '{{PLURAL:$1|een jaar|$1 jaar}}',
 'ago' => '$1 gelede',
 'just-now' => 'Nou net',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|uur}} gelede',
+'minutes-ago' => '$1 {{PLURAL:$1|minuut|minute}} gelede',
+'seconds-ago' => '$1 {{PLURAL:$1|sekonde|sekondes}} gelede',
+'monday-at' => 'Maandag om $1',
+'tuesday-at' => 'Dinsdag om $1',
+'wednesday-at' => 'Woensdag om $1',
+'thursday-at' => 'Donderdag om $1',
+'friday-at' => 'Vrydag om $1',
+'saturday-at' => 'Saterdag om $1',
+'sunday-at' => 'Sondag om $1',
+'yesterday-at' => 'Gister om $1',
+
 # Bad image list
 'bad_image_list' => "Die formaat is as volg:
 
@@ -3147,7 +3191,7 @@ Enige opeenvolgende skakels op dieselfde lyn word as uitsonderings beskou, bv. b
 'metadata-help' => "Die lêer bevat aanvullende inligting wat moontlik deur 'n digitale kamera of skandeerder bygevoeg is.
 As die lêer verander is, mag sekere inligting nie meer ooreenkom met die van die gewysigde lêer nie.",
 'metadata-expand' => 'Wys uitgebreide gegewens',
-'metadata-collapse' => 'Steek uitgebreide gegewens weg',
+'metadata-collapse' => 'Versteek uitgebreide gegewens',
 'metadata-fields' => "Die velde in die boodskap word ook gewys op 'n beeldbladsy as die metadatatabel toegevou is.
 Ander velde sal versteek wees.
 * make
@@ -3164,7 +3208,7 @@ Ander velde sal versteek wees.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breedte',
 'exif-imagelength' => 'Hoogte',
 'exif-bitspersample' => 'Grepe per komponent',
@@ -3342,7 +3386,7 @@ Ander velde sal versteek wees.
 'exif-originalimageheight' => 'Hoogte van beeld voor dit besny is',
 'exif-originalimagewidth' => 'Wydte van beeld voor dit besny is',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ongekompakteerd',
 'exif-compression-2' => 'CCITT Groep 3 1-dimensionale aangepaste "Huffman run length"-kodering',
 'exif-compression-3' => 'CCITT Groep 3 fakskodering',
@@ -3579,7 +3623,8 @@ Kontroleer u e-posadres vir ongeldige karakters.
 Die e-posprogram meld: $1',
 'confirmemail_invalid' => 'Ongeldige bevestigingkode. Die kode het moontlik verval.',
 'confirmemail_needlogin' => 'U moet $1 om u e-posadres te bevestig.',
-'confirmemail_success' => 'U e-posadres is bevestig. U kan nou aanteken en die wiki gebruik.',
+'confirmemail_success' => 'U e-posadres is bevestig.
+U kan nou [[Special:UserLogin|aanmeld]] en die wiki gebruik.',
 'confirmemail_loggedin' => 'U e-posadres is nou bevestig.',
 'confirmemail_error' => 'Iets het foutgegaan met die stoor van u bevestiging.',
 'confirmemail_subject' => '{{SITENAME}}: E-posadres-bevestiging',
@@ -3630,14 +3675,15 @@ Die bevestigingskode sal om $4 verval.',
 
 # Delete conflict
 'deletedwhileediting' => "'''Let op''': die bladsy is verwyder terwyl u besig was om dit te wysig!",
-'confirmrecreate' => "Gebruiker [[User:$1|$1]] ([[User talk:$1|bespreek]]) het hierdie blad uitgevee ná u begin redigeer het met rede: : ''$2''
-Bevestig asseblief dat u regtig hierdie blad oor wil skep.",
+'confirmrecreate' => "Gebruiker [[User:$1|$1]] ([[User talk:$1|kontak]]) het hierdie bladsy uitgevee nádat u begin redigeer het met rede:
+:''$2''
+Bevestig asseblief dat u hierdie blad weer wil skep.",
 'confirmrecreate-noreason' => 'Gebruiker [[User:$1|$1]] ([[User talk:$1|bespreking]]) het die bladsy geskrap nadat u dit begin wysig het.
 Bevestig dat u die bladsy wil herskep.',
 'recreate' => 'Herskep',
 
 # action=purge
-'confirm_purge_button' => 'OK',
+'confirm_purge_button' => 'Regso',
 'confirm-purge-top' => 'Verwyder die kas van hierdie blad?',
 'confirm-purge-bottom' => "Die opruiming van die kas sorg daarvoor dat die mees onlangse weergawe van 'n bladsy vertoon word.",
 
@@ -3717,7 +3763,7 @@ U kan ook die [[Special:EditWatchlist|standaard opdaterigskerm gebruik]].',
 'watchlisttools-raw' => 'Wysig bronkode',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|bespreek]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kontak]])',
 
 # Core parser functions
 'unknown_extension_tag' => 'Onbekende etiket "$1"',
@@ -3756,12 +3802,17 @@ Saam met die program moes u \'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van van
 'version-entrypoints-header-entrypoint' => 'Ingang',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Lêerpad',
-'filepath-page' => 'Lêer:',
-'filepath-submit' => 'OK',
-'filepath-summary' => "Die spesiale bladsy wys die volledige pad vir 'n lêer.
-Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hulle MIME-geskakelde programme geopen.",
+# Special:Redirect
+'redirect' => 'Aanstuur volgens lêer, gebruiker 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).",
+'redirect-submit' => 'OK',
+'redirect-lookup' => 'Soek volgens:',
+'redirect-value' => 'Waarde:',
+'redirect-user' => 'Gebruiker-ID',
+'redirect-revision' => 'Bladsy-weergawe',
+'redirect-file' => 'Lêernaam',
+'redirect-not-exists' => 'Waarde nie gevind nie',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Soek duplikaat lêers',
@@ -3852,23 +3903,26 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'htmlform-submit' => 'Dien in',
 'htmlform-reset' => 'Maak wysigings ongedaan',
 'htmlform-selectorother-other' => 'Ander',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => "Kies 'n opsie",
 
 # SQLite database support
 'sqlite-has-fts' => 'Weergawe $1 met ondersteuning vir vol-teks soektogte ("full-text search")',
 'sqlite-no-fts' => 'Weergawe $1 sonder ondersteuning vir vol-teks soektogte ("full-text search")',
 
 # New logging system
-'logentry-delete-delete' => '$1 het bladsy $3 verwyder',
-'logentry-delete-restore' => '$1 het bladsy $3 teruggeplaas',
-'logentry-delete-event' => "$1 het die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
-'logentry-delete-revision' => "$1 het die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van bladsy $3 gewysig: $4",
-'logentry-delete-event-legacy' => '$1 het die sigbaarheid van logboekreëls van $3 gewysig',
-'logentry-delete-revision-legacy' => '$1 het die sigbaarheid van weergawes van die bladsy $3 gewysig.',
-'logentry-suppress-delete' => '$1 het die bladsy $3 onderdruk',
-'logentry-suppress-event' => "$1 het in die geheim die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
-'logentry-suppress-revision' => "$1 het in die geheim die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van die bladsy $3 gewysig: $4",
-'logentry-suppress-event-legacy' => '$1 het in die geheim die sigbaarheid van logboekreëls van $3 gewysig',
-'logentry-suppress-revision-legacy' => '$1 het in die geheim die sigbaarheid van weergawes van die bladsy $3 gewysig',
+'logentry-delete-delete' => '$1 {{GENDER:$2|het}} bladsy $3 verwyder',
+'logentry-delete-restore' => '$1 {{GENDER:$2|het}} bladsy $3 teruggeplaas',
+'logentry-delete-event' => "$1 {{GENDER:$2|het}} die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|het}} die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van bladsy $3 gewysig: $4",
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|het}} die sigbaarheid van logboekreëls van $3 gewysig',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|het}} die sigbaarheid van weergawes van bladsy $3 gewysig.',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|het}} die bladsy $3 onderdruk',
+'logentry-suppress-event' => "$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van {{PLURAL:$5|'n weergawe|$5 weergawes}} van die bladsy $3 gewysig: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van logboekreëls van $3 gewysig',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|het}} in die geheim die sigbaarheid van weergawes van die bladsy $3 gewysig',
 'revdelete-content-hid' => 'inhoud versteek',
 'revdelete-summary-hid' => 'wysigingsopsomming versteek',
 'revdelete-uname-hid' => 'gebruikersnaam versteek',
@@ -3877,20 +3931,20 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'revdelete-uname-unhid' => 'gebruikersnaam sigbaar gemaak',
 'revdelete-restricted' => 'beperkings is aan administrateurs opgelê',
 'revdelete-unrestricted' => 'beperkings vir administrateurs is opgehef',
-'logentry-move-move' => '$1 het bladsy $3 na $4 geskuif',
-'logentry-move-move-noredirect' => "$1 het bladsy $3 na $4 geskuif sonder om 'n aanstuur agter te laat",
-'logentry-move-move_redir' => "$1 het bladsy $3 na $4 oor 'n aanstuur geskuif",
-'logentry-move-move_redir-noredirect' => "$1 het bladsy $3 na $4 oor 'n bestaande aanstuur geskuif sonder om 'n aanstuur agter te laat",
-'logentry-patrol-patrol' => '$1 het weergawe $4 van bladsy $3 as gekontroleerd gemerk',
-'logentry-patrol-patrol-auto' => '$1 het weergawe $4 van bladsy $3 outomaties as gekontroleerd gemerk',
-'logentry-newusers-newusers' => 'Gebruiker $1 is geskep',
-'logentry-newusers-create' => 'Gebruiker $1 is geskep',
-'logentry-newusers-create2' => 'Gebruiker $3 is deur $1 geskep',
-'logentry-newusers-byemail' => 'Gebruiker $3 is deur $1 geskep en die wagwoord is per e-pos aangestuur',
-'logentry-newusers-autocreate' => 'Die gebruiker $1 is outomaties geskep',
-'logentry-rights-rights' => '$1 het groepslidmaatskap vir $3 van $4 na $5 gewysig',
-'logentry-rights-rights-legacy' => '$1 het groepslidmaatskap vir $3 gewysig',
-'logentry-rights-autopromote' => '$1 is outomaties gepromoveerd van $4 na $5',
+'logentry-move-move' => '$1 {{GENDER:$2|het}} bladsy $3 na $4 geskuif',
+'logentry-move-move-noredirect' => "$1 {{GENDER:$2|het}} bladsy $3 na $4 geskuif sonder om 'n aanstuur agter te laat",
+'logentry-move-move_redir' => "$1 {{GENDER:$2|het}} bladsy $3 na $4 oor 'n aanstuur geskuif",
+'logentry-move-move_redir-noredirect' => "$1 {{GENDER:$2|het}} bladsy $3 na $4 oor 'n bestaande aanstuur geskuif sonder om 'n aanstuur agter te laat",
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|het}} weergawe $4 van bladsy $3 as gekontroleerd gemerk',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|het}} weergawe $4 van bladsy $3 outomaties as gekontroleerd gemerk',
+'logentry-newusers-newusers' => 'Gebruiker $1 {{GENDER:$2|is}} geskep',
+'logentry-newusers-create' => 'Gebruiker $1 {{GENDER:$2|is}} geskep',
+'logentry-newusers-create2' => 'Gebruiker $3 {{GENDER:$2|is}} deur $1 geskep',
+'logentry-newusers-byemail' => 'Gebruiker $3 {{GENDER:$2|is}} deur $1 geskep en die wagwoord is per e-pos aangestuur',
+'logentry-newusers-autocreate' => 'Die gebruiker $1 {{GENDER:$2|is}} outomaties geskep',
+'logentry-rights-rights' => '$1 {{GENDER:$2|het}} groepslidmaatskap vir $3 van $4 na $5 gewysig',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|het}} groepslidmaatskap vir $3 gewysig',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|is}} outomaties van $4 na $5 gepromoveerd',
 'rightsnone' => '(geen)',
 
 # Feedback
index 7dd39e0..e9c406d 100644 (file)
@@ -97,8 +97,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Shfaqe numrin e përdoruesve mbikëqyrës',
 'tog-oldsig' => 'Parapamja e nënshkrimit ekzistues:',
 'tog-fancysig' => 'Trajto nënshkrimin si tekst (pa vegëz automatike)',
-'tog-externaleditor' => 'Përdor program të jashtëm për redaktim (vetëm për eksperta, lyp përcaktime speciale në kompjuterin tuej)',
-'tog-externaldiff' => 'Përdor program të jashtëm për dallime (vetëm për eksperta, lyp përcaktime speciale në kompjuterin tuej)',
 'tog-showjumplinks' => 'Lejo lidhjet é afrueshmerisë "kapërce tek"',
 'tog-uselivepreview' => 'Trego parapamjén meniheré (JavaScript) (Eksperimentale)',
 'tog-forceeditsummary' => 'Pyetem kur e le përmbledhjen e redaktimit zbrazt',
@@ -113,6 +111,7 @@ $messages = array(
 'tog-showhiddencats' => 'Trego kategoritë e mshefta',
 'tog-noconvertlink' => 'Mos lejo konvertimin e titullit vegëz',
 'tog-norollbackdiff' => 'Trego ndryshimin mbas procedurës së kthimit mbrapa',
+'tog-useeditwarning' => 'Paralajmëron mua kur unë të lë një redakto faqe me ndryshimet e para shpëtimit',
 
 'underline-always' => 'gjithmonë',
 'underline-never' => 'kurrë',
@@ -750,6 +749,7 @@ Duket se është grisur.',
 'edit-no-change' => 'Redaktimi juaj është anashkaluar pasi që asnjë ndryshim nuk u bë në tekst.',
 'edit-already-exists' => 'Faqja nuk mundej të hapet.
 Ajo tanimë ekziston.',
+'editwarning-warning' => 'Duke e lënë këtë faqe mund të bëjë që ju të humbni ndonjë ndryshim që keni bërë. Nëse ju jeni regjistruar, ju mund ta çaktivizoni këtë paralajmërim në "Tue redaktue" seksionin e preferencave tuaja.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.
@@ -947,14 +947,6 @@ Provoni me ia parashtue kërkesës tuej ''tâna:'' që me lypë tânë përmbajt
 Ndërkohë mundeni me lypë me Google.
 Vini re se indeksat e tyne të përmbajtjes së {{SITENAME}} munden me qenë të vjetëruem.',
 
-# Quickbar
-'qbsettings' => 'Vegla të shpejta',
-'qbsettings-none' => 'Asnji',
-'qbsettings-fixedleft' => 'Lidhun majtas',
-'qbsettings-fixedright' => 'Lidhun djathtas',
-'qbsettings-floatingleft' => 'Pezull majtas',
-'qbsettings-floatingright' => 'Pezull djathtas',
-
 # Preferences page
 'preferences' => 'Parapëlqimet',
 'mypreferences' => 'Parapëlqimet e mija',
@@ -1503,13 +1495,8 @@ Lejon dhânien e arsyes në përmbledhje.',
 
 # Stylesheets
 'common.css' => '/* CSSi i vendosun këtu ka me u zbatue në tâna dukjet */',
-'standard.css' => '/* CSSi i vendosun këtu ka me i prekë përdoruesit e dukjes standarde */',
-'nostalgia.css' => '/* CSS i vendosun këtu ka me i prekë shfrytëzuesit e dukjes Nostalgia */',
 'cologneblue.css' => '/* CSS i vendosun këtu ka me i prekë shfrytëzuesit e dukjes Cologne Blue */',
 'monobook.css' => '/* CSS i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Monobook */',
-'myskin.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes MySkin */',
-'chick.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Chick */',
-'simple.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Simple */',
 'modern.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Modern */',
 'vector.css' => '/* CSSi i vednosun këtu ka me i prekë shfrytëzuesit e dukjes Vector */',
 'print.css' => '/* CSSi i vednosun këtu ka me e prekë pamjen e shtypjes */',
@@ -1517,13 +1504,8 @@ Lejon dhânien e arsyes në përmbledhje.',
 
 # Scripts
 'common.js' => '/* Çdo JavaScript këtu ka me u ngarkue për të gjithë përdoruesit në secilën thirrje të faqes. */',
-'standard.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Standard */',
-'nostalgia.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Nostalgia */',
 'cologneblue.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Cologne Blue */',
 'monobook.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen MonoBook */',
-'myskin.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen MySkin */',
-'chick.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Chick */',
-'simple.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Simple */',
 'modern.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Modern */',
 'vector.js' => '/* Çdo JavaScript këtu ka me u ngarkue për shfrytëzuesit që përdorin dukjen Vector */',
 
@@ -1558,8 +1540,6 @@ Krejt vegzat tjera në të njejtin rresht do të bajnë përjashtim, d.m.th. faq
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
index f40de91..fb8e17b 100644 (file)
@@ -77,8 +77,6 @@ $messages = array(
 'tog-shownumberswatching' => 'የሚከታተሉ ተጠቃሚዎችን ቁጥር አሳይ',
 'tog-oldsig' => 'የቀድሞው ፊርማ ቅደመ እይታ',
 'tog-fancysig' => 'ጥሬ ፊርማ (ያለራስገዝ ማያያዣ)',
-'tog-externaleditor' => 'በቀዳሚነት ውጪያዊ አራሚን ተጠቀም',
-'tog-externaldiff' => 'በቀዳሚነት የውጭ ልዩነት-ማሳያን ተጠቀም',
 'tog-showjumplinks' => 'የ"ዝለል" አቅላይ መያያዣዎችን አስችል',
 'tog-uselivepreview' => 'ቀጥታ ቅድመ-ዕይታን ይጠቀሙ (JavaScript) (የሙከራ)',
 'tog-forceeditsummary' => 'ማጠቃለያው ባዶ ከሆነ ማስታወሻ ይስጠኝ',
@@ -846,13 +844,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'search-external' => 'አፍአዊ ፍለጋ',
 'searchdisabled' => '{{SITENAME}} ፍለጋ አሁን እንዳይሠራ ተደርጓል። ለጊዜው ግን በGoogle ላይ መፈልግ ይችላሉ። የ{{SITENAME}} ይዞታ ማውጫ በዚያ እንዳልታደሰ ማቻሉ ያስታውሱ።',
 
-# Quickbar
-'qbsettings-none' => ' ምንም',
-'qbsettings-fixedleft' => 'በግራ የተለጠፈ',
-'qbsettings-fixedright' => 'በቀኝ የተለጠፈ',
-'qbsettings-floatingleft' => 'በግራ ተንሳፋፊ',
-'qbsettings-floatingright' => 'በቀኝ ተንሳፋፊ',
-
 # Preferences page
 'preferences' => 'ምርጫዎች፤',
 'mypreferences' => 'ምርጫዎች፤',
@@ -1539,8 +1530,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'notvisiblerev' => 'ዕትሙ ጠፍቷል',
 'watchnochange' => 'ከተካከሉት ገጾች አንዳችም በተወሰነው ጊዜ ውስጥ አልተለወጠም።',
 'watchlist-details' => 'አሁን {{PLURAL:$1|$1 ገፅ|$1 ገፆች}} በምትከታተላቸው ገፆች ላይ አሉ (የውይይት ገፅ ሳይጨመር)።',
-'wlheader-enotif' => 'የ-ኢሜል ማስታወቂያ እንዲሠራ ተደርጓል።',
-'wlheader-showupdated' => "መጨረሻ ከጎበኟቸው ጀምሮ የተቀየሩት ገጾች በ'''ጉልህ ፊደላት''' ይታያሉ",
+'wlheader-enotif' => 'የ-ኢሜል ማስታወቂያ እንዲሠራ ተደርጓል።',
+'wlheader-showupdated' => "መጨረሻ ከጎበኟቸው ጀምሮ የተቀየሩት ገጾች በ'''ጉልህ ፊደላት''' ይታያሉ",
 'watchmethod-recent' => 'የቅርብ ለውጦችን ለሚከታተሉት ገጾች በመፈለግ',
 'watchmethod-list' => 'የሚከታተሉትን ገጾች ለቅርብ ለውጦች በመፈለግ',
 'watchlistcontains' => 'አሁን በሙሉ $1 ገጾች እየተከታተሉ ነው።',
@@ -2153,7 +2144,7 @@ $1',
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ስፋት',
 'exif-imagelength' => 'ቁመት',
 'exif-compression' => 'የመጨመቅ ዘዴ',
@@ -2260,7 +2251,7 @@ $1',
 'exif-cameraownername' => 'ባለ ካሜራ',
 'exif-personinimage' => 'የታየው ሰው',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ያልተጨመቀ',
 
 'exif-unknowndate' => 'ያልታወቀ ቀን',
@@ -2528,13 +2519,6 @@ $3
 'version-software-product' => 'ሶፍትዌር',
 'version-software-version' => 'ዝርያ',
 
-# Special:FilePath
-'filepath' => 'የፋይል መንገድ',
-'filepath-page' => 'ፋይሉ፦',
-'filepath-submit' => 'መንገድ',
-'filepath-summary' => 'ይህ ልዩ ገጽ ለ1 ፋይል ሙሉ መንገድ ይሰጣል።<br />
-ስዕል በሙሉ ማጉላት ይታያል፤ ሌላ አይነት ፋይል በሚገባው ፕሮግራም በቀጥታ ይጀመራል።',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ለቅጂ ፋይሎች መፈልግ',
 'fileduplicatesearch-legend' => 'ለቅጂ ለመፈልግ',
index 03fc479..d2512f9 100644 (file)
@@ -161,8 +161,6 @@ $messages = array(
 'tog-shownumberswatching' => "Amostrar o numero d'usuarios que cosiran un articlo",
 'tog-oldsig' => 'Sinyadura actual',
 'tog-fancysig' => 'Tratar as sinyaduras como wikitexto (sin de vinclo automatico)',
-'tog-externaleditor' => "Fer servir l'editor externo por defecto (nomás ta espiertos, cal que faiga achustes especials en o suyo ordenador.  [//www.mediawiki.org/wiki/Manual:External_editors Mas información.])",
-'tog-externaldiff' => 'Fer servir o visualizador de diferencias externo por defecto (nomás ta expertos, cal que faiga achustes especials en o suyo ordenador.  [//www.mediawiki.org/wiki/Manual:External_editors Mas información.])',
 'tog-showjumplinks' => 'Activar vinclos d\'accesibilidat "blincar enta"',
 'tog-uselivepreview' => 'Activar previsualización automatica (cal JavaScript) (Esperimental)',
 'tog-forceeditsummary' => 'Avisar-me quan o campo de resumen siga buedo.',
@@ -177,6 +175,7 @@ $messages = array(
 'tog-showhiddencats' => 'Amostrar categorías amagatas',
 'tog-noconvertlink' => 'Desactivar a conversión de titol de vinclo',
 'tog-norollbackdiff' => 'No amostrar as diferencias dimpués de revertir',
+'tog-useeditwarning' => "Alvertir-me quan salga d'una pachina d'edición sin alzar os cambios",
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
@@ -840,6 +839,7 @@ Pareix que la hesen borrau.",
 'edit-no-change' => "S'ha ignorato a suya edición, pos no s'ha feito garra cambeo ta o texto.",
 'edit-already-exists' => "No s'ha puesto creyar una pachina nueva.
 Ya existe.",
+'editwarning-warning' => "Si sale d'ista pachina perderá totz os cambios que haiga feito. Si tiene una cuenta d'usuario, puet eliminar ista alvertencia en a sección «Caixa d'edición» d'as suyas preferencies.",
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Pare cuenta: Ista pachina tiene masiadas cridas ta funcions de preproceso (parser functions) costosas.
@@ -1101,15 +1101,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'search-external' => 'Busca externa',
 'searchdisabled' => 'A busca en {{SITENAME}} ye temporalment desactivata. Entremistanto, puede mirar en {{SITENAME}} fendo servir buscadors externos, pero pare cuenta que os suyos endices de {{SITENAME}} puede no estar esviellatos.',
 
-# Quickbar
-'qbsettings' => 'Preferencias de "Quickbar"',
-'qbsettings-none' => 'Garra',
-'qbsettings-fixedleft' => 'Fixa a la zurda',
-'qbsettings-fixedright' => 'Fixa a la dreita',
-'qbsettings-floatingleft' => 'Flotant a la zurda',
-'qbsettings-floatingright' => 'Flotant a la dreita',
-'qbsettings-directionality' => "Fixato, pendendo en a direccionalidat d'o suyo script y o suyo luengache",
-
 # Preferences page
 'preferences' => 'Preferencias',
 'mypreferences' => 'Preferencias',
@@ -1646,7 +1637,6 @@ Por seguridat, s'ha desactivau img_auth.php.",
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'A requesta HTTP ha circumducito.',
 'http-curl-error' => 'Error en recuperar a URL: $1',
-'http-host-unreachable' => "No s'ha puesto acceder t'a URL.",
 'http-bad-status' => 'Ha habiu un problema en a requesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2030,8 +2020,8 @@ L\'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias
 'notvisiblerev' => "S'ha borrato a revisión",
 'watchnochange' => "Dengún d'os articlos d'a suya lista de seguimiento no s'ha editato en o periodo de tiempo amostrato.",
 'watchlist-details' => '{{PLURAL:$1|$1 pachina|$1 pachinas}} en a suya lista de seguimiento, sin contar-ie as pachinas de descusión.',
-'wlheader-enotif' => 'A notificación por correu electronico ye activata',
-'wlheader-showupdated' => "Las pachinas cambiadas dende a suya zaguer vesita s'amuestran en '''negreta'''",
+'wlheader-enotif' => 'A notificación por correu electronico ye activata',
+'wlheader-showupdated' => "Las pachinas cambiadas dende a suya zaguer vesita s'amuestran en '''negreta'''",
 'watchmethod-recent' => 'Mirando pachinas cosiratas en os zaguers cambeos',
 'watchmethod-list' => 'mirando edicions recients en as pachinas cosiratas',
 'watchlistcontains' => 'A suya lista de seguimiento tiene $1 {{PLURAL:$1|pachina|pachinas}}.',
@@ -2718,17 +2708,11 @@ Puede veyer-ne, manimenos, o codigo fuent.',
 
 # Stylesheets
 'common.css' => '/* Os estilos CSS definius aquí aplicarán a todas as apariencias (skins) */',
-'standard.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Standard */",
-'nostalgia.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Nostalgia */",
 'cologneblue.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Cologne Blue */",
 'monobook.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Monobook */",
-'myskin.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que que faigan servir l'apariencia MySkin */",
-'chick.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Chick */",
-'simple.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Simpla */",
 'modern.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Modern */",
 'vector.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que faigan servir l'apariencia Vector */",
 'print.css' => '/* Os estilos CSS colocaus aquí afectarán a la impresión */',
-'handheld.css' => '/* Os estilos CSS colocaus aquí afectarán a os dispositivos mobils basaus en as apariencias configuradas en $wgHandheldStyle */',
 'noscript.css' => "/* Os estilos CSS colocaus aquí s'aplicarán ta totz os usuarios que tiengan desactivato JavaScript */",
 'group-autoconfirmed.css' => "/* Os estilos CSS colocaus aquí s'aplicarán nomás a os usuarios autoconfirmatos*/",
 'group-bot.css' => "/* Os estilos CSS colocaus aquí s'aplicarán nomás a os bots*/",
@@ -2737,13 +2721,8 @@ Puede veyer-ne, manimenos, o codigo fuent.',
 
 # Scripts
 'common.js' => '/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios en cada carga de pachina */',
-'standard.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Estandar */",
-'nostalgia.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Nostalgia. */",
 'cologneblue.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Colonia azul */",
 'monobook.js' => "/* O codigo Javascript que se meta aquí será cargau por os usuarios faigan servir l'apariencia MonoBook */",
-'myskin.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia MySkin */",
-'chick.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Chick */",
-'simple.js' => "/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que faigan servir l'apariencia Simple */",
 'modern.js' => "/* O codigo Javascript que se meta aquí será cargau por os usuarios faigan servir l'apariencia Modern */",
 'vector.js' => '/* Qualsiquier codigo Javascript escrito aquí se cargará ta totz os usuarios que usen a piel Vector */',
 'group-autoconfirmed.js' => '/* Qualsiquier codigo Javascript escrito aquí se cargará nomás ta os usuarios autoconfirmatos */',
@@ -2783,13 +2762,8 @@ Puede veyer-ne, manimenos, o codigo fuent.',
 'pageinfo-authors' => "Numero d'autors diferents",
 
 # Skin names
-'skinname-standard' => 'Clasica (Classic)',
-'skinname-nostalgia' => 'Recosiros (Nostalgia)',
 'skinname-cologneblue' => 'Colonia Azul (Cologne Blue)',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'A mía aparencia (MySkin)',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Simpla (Simple)',
 'skinname-modern' => 'Moderna',
 'skinname-vector' => 'Vector',
 
@@ -2890,7 +2864,7 @@ Os campos de metadatos d'a imachen que amaneixen en iste mensache s'amostrarán
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Amplaria',
 'exif-imagelength' => 'Altaria',
 'exif-bitspersample' => 'Bits por component',
@@ -3068,7 +3042,7 @@ Os campos de metadatos d'a imachen que amaneixen en iste mensache s'amostrarán
 'exif-originalimageheight' => "Altaria d'a imachen antes d'estar retallada",
 'exif-originalimagewidth' => "Amplaria d'a imachen antes d'estar retallada",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sin de compresión',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'Codificación de fax CCITT grupo 3',
@@ -3470,13 +3444,6 @@ Con iste programa ha d'haber recibiu [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia
 'version-software-product' => 'Producto',
 'version-software-version' => 'Versión',
 
-# Special:FilePath
-'filepath' => "Camín d'o fichero",
-'filepath-page' => 'Fichero:',
-'filepath-submit' => 'Ir-ie',
-'filepath-summary' => "Ista pachina especial le retorna o camín completo d'un fichero.
-As imachens s'amuestran en resolución completa, a resta de fichers fan encetar dreitament os suyos programas asociatos.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Mirar fichers duplicatos',
 'fileduplicatesearch-summary' => 'Mirar archivos duplicatos basatos en a suya valura hash.',
index 87e3aaa..bc7d44c 100644 (file)
@@ -30,391 +30,397 @@ $namespaceNames = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Hlenċa undermearcian:',
-'tog-justify' => 'Macian cwidfloccas riht',
-'tog-hideminor' => 'Lytla ādihtas hȳdan in nīƿum hƿeorfum',
-'tog-hidepatrolled' => 'Ƿeardede ādihtas hȳdan in nīƿe hƿearfas',
-'tog-newpageshidepatrolled' => 'Ƿeardede sīdan hȳdan in nīƿe hƿearfas',
-'tog-extendwatchlist' => 'Ƿæccȝetale sprædan to scēaƿenne ealle hƿearfas, ne efne þā nīƿoste',
-'tog-usenewrc' => 'Benota forðod ȝetæl nīƿra hƿeorfunȝa (þis þearf JavaScript)',
-'tog-numberheadings' => 'Selffremmende-rīm hēafodingas',
-'tog-showtoolbar' => 'Þone tōlstæf scēaƿian (þearf JavaScript)',
-'tog-editondblclick' => 'Sīdan ādihtan bȳ tƿicnæppende (þearf JavaScript)',
-'tog-editsection' => 'Dǣla ādihtende þafian bȳ [ādihtan] hlenċum',
-'tog-editsectiononrightclick' => 'Þafa dǣla ādihtune þurh sƿenȝas þǣre sƿīðran healfe on dǣla titulum (þis þearf JavaScript)',
-'tog-showtoc' => 'Innoðes tæfle sēon (for sīdum þe mā þonne 3 hēafodingas habbaþ)',
-'tog-rememberpassword' => 'Mīne inmeldunge ȝemyndan on þissum spearcatelle (oþ $1 {{PLURAL:$1|dæȝ|dagas}})',
-'tog-watchcreations' => 'Sīdan þe iċ scieppe ēacian tō mīnre ƿæccȝetale',
-'tog-watchdefault' => 'Sīdan þe iċ ādihte ēacian tō mīnre ƿæccȝetale',
-'tog-watchmoves' => 'Sīdan þe iċ hƿeorfe ēacian tō mīnre ƿæccȝetale',
-'tog-watchdeletion' => 'Sīdan þe iċ forlēose ēacian tō mīnre ƿæccȝetale',
-'tog-minordefault' => 'Ealle ādihtende mearcian tōlas ȝeƿunelīċe',
-'tog-previewontop' => 'Forescēaƿe sēon fore ādihtbox',
-'tog-previewonfirst' => 'Forescēaƿe sēon on formestum ādihte',
-'tog-nocache' => 'Ne þafa trameta settunȝe',
-'tog-enotifwatchlistpages' => 'Send mē spearccræftiȝ ǣrend þǣr tramet on mīnum ƿæccȝetæle ƿierþ andƿended',
-'tog-enotifusertalkpages' => 'Send mē spearccræftiȝ ǣrend þǣr mīn brūcendtramet is andƿended',
-'tog-enotifminoredits' => 'Send mē spearccræftiȝ ǣrend þǣr trametas sind efne lytellīce andƿended',
-'tog-enotifrevealaddr' => 'Ēoƿa mīn spearccræftiȝra ǣrenda stōƿnaman on sprearccræftiȝum ȝecȳðendum ǣrendum',
-'tog-shownumberswatching' => 'Hū mæniȝ ƿæccende brūcendas sēon',
-'tog-oldsig' => 'Foresihþ þæs selftācnes þe is nū ȝenotod:',
-'tog-fancysig' => 'Dō mid þissum selftācne sƿā mid Ƿikitext (lēas ǣr ȝedōnes hlencan)',
-'tog-externaleditor' => 'Nota ūtƿeardne ādihttōl tō ȝeƿunelicre ȝesetednesse (synderlīce tō sƿīðe cræftiȝum mannum - þearf ānlica ȝesetednessa on þīnum spearctelle)',
-'tog-externaldiff' => 'Nota ūtƿearde scādunȝe tō ȝeƿunelicre ȝesetednesse (synderlīce tō sƿīðe cræftiȝum mannum - þearf ānlica ȝesetednesse on þīnum spearctelle)',
-'tog-showjumplinks' => 'Lǣt "ȝā tō" ȝefēre hlencan',
-'tog-uselivepreview' => 'Nota andefene foresihþe (þearf JavaScript) (tō costnunȝe)',
-'tog-forceeditsummary' => 'Scyhte mē þǣr ic inƿrīte nāne ādihtsceortnesse',
-'tog-watchlisthideown' => 'Mīna ādihtunga hȳdan ƿiþ þā ƿæccȝetale',
-'tog-watchlisthidebots' => 'Searuþrala ādihtas hȳdan ƿiþ þā ƿæccȝetale',
-'tog-watchlisthideminor' => 'Lȳtl ādihtas hȳdan ƿiþ þā ƿæccȝetale',
-'tog-watchlisthideliu' => 'Ādihtas bȳ inmeldedum brūcendum hȳdan ƿiþ þā ƿæccȝetale',
-'tog-watchlisthideanons' => 'Hȳd ādihtas fram uncūðum brūcendum ƿiþ þæt ƿæccȝetæl',
-'tog-watchlisthidepatrolled' => 'Hȳd ƿeardode ādihtas ƿiþ þæt ƿæccȝetæl',
-'tog-ccmeonemails' => 'Send mē ȝelīcnessa þāra spearcræftiȝena ǣrenda þe ic ōðrum brūcendum sende',
-'tog-diffonly' => 'Ne ēoƿa sīdan innunȝe under scādunȝum',
-'tog-showhiddencats' => 'Ēoƿa ȝehȳdede floccas',
+'tog-underline' => 'Mearc under hlencan:',
+'tog-justify' => 'Macian cwidfloccas rihte',
+'tog-hideminor' => 'Hȳdan lytela adihtunga in nīwra wendinga getæle',
+'tog-hidepatrolled' => 'Hȳdan weardoda adihtunga in nīwra andwendinga getæle',
+'tog-newpageshidepatrolled' => 'Hȳdan weardode trametas in nīwra andwendinga getæle',
+'tog-extendwatchlist' => 'Sprǣdan wæccgetæl tō īwenne ealla andwendinga, nā synderlīce þā nīwostan',
+'tog-usenewrc' => 'Settan andwendunge on hēapas æfter tramete on nīwra andwendunga getæle and wæccgetæle (þearf JavaScript)',
+'tog-numberheadings' => 'Settan rīm on fōrecwidas selflīce',
+'tog-showtoolbar' => 'Īwan þā adihtunge tōlmearce (þearf JavaScript)',
+'tog-editondblclick' => 'Adihtan trametas mid twifealdum mȳs swenge (þearf JavaScript)',
+'tog-editsection' => 'Þafian dǣla adihtunge mid [ādihtan] hlencum',
+'tog-editsectiononrightclick' => 'Þafian dǣla adihtunge þurh swīðran healfe mȳs swengas on dǣla titulum (þearf JavaScript)',
+'tog-showtoc' => 'Īwan innunge tabulan (for trametum þe mā þonne 3 fōrecwidas habbaþ)',
+'tog-rememberpassword' => 'Gemynan mīne inmeldunge on þissum spearctellende (oþ $1 {{PLURAL:$1|dæg|dagas}} lengest)',
+'tog-watchcreations' => 'Ēacnian mīn wæccgetæl mid trametum þā ic scieppe and ymelum þā ic hlade on nett.',
+'tog-watchdefault' => 'Ēacnian mīn wæccgetæl mid trametum and ymelum þā ic adihte.',
+'tog-watchmoves' => 'Ēacnian mīn wæccgetæl mid trametum and ymelum þā ic wege.',
+'tog-watchdeletion' => 'Ēacnian mīn wæccgetæl mid trametum and ymelum þā ic forlēose.',
+'tog-minordefault' => 'Mearcian ealla adihtunga lytela tō gewunan',
+'tog-previewontop' => 'Īwan fōrebysene ofer adihtunge mearce',
+'tog-previewonfirst' => 'Īwan fōrebysene on forman adihtunge',
+'tog-nocache' => 'Nā þafian þæt webbsēcend sette trametas on horde',
+'tog-enotifwatchlistpages' => 'Sendan mē spearcǣrend þǣr tramet oþþe ymele on mīnum wæccgetæle sīe andwended.',
+'tog-enotifusertalkpages' => 'Sendan mē spearcǣrend þǣr mīnes brūcendtrametes mōtung sī awended',
+'tog-enotifminoredits' => 'Sendan mē spearcǣrend þǣr trametas oþþe ymelan sīen efne lyt andwended.',
+'tog-enotifrevealaddr' => 'Īwan mīnne spearcǣrenda naman on gecȳðendum spearcǣrendum',
+'tog-shownumberswatching' => 'Īwan þæt rīm wæccendra brūcenda',
+'tog-oldsig' => 'Genge selfmearc:',
+'tog-fancysig' => 'Dōn selfmearce tō wikitexte (lēas ǣr gedōnes hlencan)',
+'tog-showjumplinks' => 'Þafian "gān tō" gefērra hlencena',
+'tog-uselivepreview' => 'Notian rihte īwde fōrebysene (þearf JavaScript) (on costnunge)',
+'tog-forceeditsummary' => 'Cȳðan mē þǣr ic ne wrīte ādihtunge sceortnesse',
+'tog-watchlisthideown' => 'Hȳdan mīna adihtunga wiþ þæt wæccgetæl',
+'tog-watchlisthidebots' => 'Hȳdan searuþrǣla adihtunga wiþ þæt wæccgetæl',
+'tog-watchlisthideminor' => 'Hȳdan lytela adihtunga wiþ þæt wæccgetæl',
+'tog-watchlisthideliu' => 'Hȳdan adihtungas fram inmeldedum brūcendum wiþ þæt wæccgetæl',
+'tog-watchlisthideanons' => 'Hȳdan adihtunga fram uncūðum brūcendum wiþ þæt wæccgetæl',
+'tog-watchlisthidepatrolled' => 'Hȳdan weardoda adihtunga wiþ þæt wæccgetæl',
+'tog-ccmeonemails' => 'Sendan mē gelīcnessa þāra spearcǣrenda þe ic ōðrum brūcendum sende',
+'tog-diffonly' => 'Nā īwan trametes innunge under scādungum',
+'tog-showhiddencats' => 'Īwan gehȳdede floccas',
 'tog-noconvertlink' => 'Ne lǣt hlencena titula āwendunge',
-'tog-norollbackdiff' => 'Forlǣt scādunȝe æfter edƿeorc is ȝedōn',
+'tog-norollbackdiff' => 'Forlǣtan scādunge siþþan edweorc sīe gedōn',
+'tog-useeditwarning' => 'Cȳðan mē þǣr ic afare fram adihtunge tramete þe gīet hæbbe unhordoda andwendunga.',
 
 'underline-always' => 'Ǣfre',
 'underline-never' => 'Nǣfre',
-'underline-default' => 'Ƿebbsēcendes ȝeƿunelic ȝesetedness',
+'underline-default' => 'Scinnes oþþe webbsēcendes gewuna',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Stæfcynd for þǣre ƿrītunȝe on þǣm ādihtearce:',
-'editfont-default' => 'Ƿebbsēcendes ȝeƿunelic ȝesetedness',
-'editfont-monospace' => 'Ānbrǣded stæfcynd',
-'editfont-sansserif' => 'Tæȝellēas stæfcynd',
-'editfont-serif' => 'Tæȝelbǣr stæfcynd',
+'editfont-style' => 'Stæfcynd for þǣre wrītunge on þǣre adihtunge mearce:',
+'editfont-default' => 'Webbsēcendes geƿunelicu gesetedness',
+'editfont-monospace' => 'Ānes gemetes gebrǣded stæfcynd',
+'editfont-sansserif' => 'Tægellēas stæfcynd',
+'editfont-serif' => 'Tægelbǣre stæfcynd',
 
 # Dates
-'sunday' => 'Sunnandæȝ',
-'monday' => 'Mōnandæȝ',
-'tuesday' => 'Tīƿesdæȝ',
-'wednesday' => 'Ƿēdnesdæȝ',
-'thursday' => 'Þunresdæȝ',
-'friday' => 'Frīȝedæȝ',
-'saturday' => 'Sæterndæȝ',
+'sunday' => 'Sunnandæg',
+'monday' => 'Mōnandæg',
+'tuesday' => 'Tīwesdæg',
+'wednesday' => 'Wēdnesdæg',
+'thursday' => 'Þunresdæg',
+'friday' => 'Frigedæg',
+'saturday' => 'Sæterndæg',
 'sun' => 'Sun',
 'mon' => 'Mōn',
-'tue' => 'Tīƿ',
-'wed' => 'Ƿēd',
+'tue' => 'Tīw',
+'wed' => 'Wēd',
 'thu' => 'Þun',
-'fri' => 'Frī',
+'fri' => 'Fri',
 'sat' => 'Sæt',
-'january' => 'Æfterra Ȝēola',
+'january' => 'Æfterra Gēola',
 'february' => 'Solmōnaþ',
 'march' => 'Hrēþmōnaþ',
-'april' => 'Ēostremōnaþ',
+'april' => 'Ēastermōnaþ',
 'may_long' => 'Þrimilcemōnaþ',
 'june' => 'Sēarmōnaþ',
 'july' => 'Mǣdmōnaþ',
-'august' => 'Ƿēodmōnaþ',
-'september' => 'Hāliȝmōnaþ',
-'october' => 'Ƿinterfylleþ',
+'august' => 'Wēodmōnaþ',
+'september' => 'Hāligmōnaþ',
+'october' => 'Winterfylleþ',
 'november' => 'Blōtmōnaþ',
-'december' => 'Ǣrra Ȝēola',
-'january-gen' => 'Æfterran Ȝēolan',
+'december' => 'Ǣrra Gēola',
+'january-gen' => 'Æfterran Gēolan',
 'february-gen' => 'Solmōnþes',
 'march-gen' => 'Hrēþmōnþes',
-'april-gen' => 'Ēostremōnþes',
+'april-gen' => 'Ēastermōnþes',
 'may-gen' => 'Þrimilcemōnþes',
 'june-gen' => 'Sēarmōnþes',
 'july-gen' => 'Mǣdmōnþes',
-'august-gen' => 'Ƿēodmōnþes',
-'september-gen' => 'Hāliȝmōnþes',
-'october-gen' => 'Ƿinterfylleðes',
+'august-gen' => 'Wēodmōnþes',
+'september-gen' => 'Hāligmōnþes',
+'october-gen' => 'Winterfylleðes',
 'november-gen' => 'Blōtmōnþes',
-'december-gen' => 'Ǣrran Ȝēolan',
+'december-gen' => 'Ǣrran Gēolan',
 'jan' => 'Ǣr Ȝē',
 'feb' => 'Sol',
 'mar' => 'Hrē',
-'apr' => 'Ēos',
+'apr' => 'Ēas',
 'may' => 'Þri',
-'jun' => 'Sēr',
+'jun' => 'Sēar',
 'jul' => 'Mǣd',
-'aug' => 'Ƿēo',
+'aug' => 'Wēo',
 'sep' => 'Hāl',
-'oct' => 'Ƿinfyl',
+'oct' => 'Winterf',
 'nov' => 'Blō',
-'dec' => 'Æf Ȝē',
+'dec' => 'Æf Gē',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Flocc|Floccas}}',
 'category_header' => 'Trametas in flocce "$1"',
 'subcategories' => 'Underfloccas',
 'category-media-header' => 'Missenmiddel in flocce "$1"',
-'category-empty' => "''Þes flocc hæfþ nū nǣnȝu ȝeƿritu oþþe missenmiddel.''",
-'hidden-categories' => '{{PLURAL:$1|Ȝehȳded flocc|$1 Ȝehȳdede floccas}}',
-'hidden-category-category' => 'Ȝehȳdede floccas',
-'category-subcat-count' => '{{PLURAL:$2|Þes flocc hæfþ efne þone folȝiendan underflocc.|Þes flocc hæfþ {{PLURAL:$1|þone folȝiendan underflocc|$1 þā folȝiendan underfloccas}}, þāra fullena $2.}}',
+'category-empty' => "''Þes flocc hæfþ nū nǣngu geƿritu oþþe missenmiddel.''",
+'hidden-categories' => '{{PLURAL:$1|Gehȳded flocc|$1 Gehȳdede floccas}}',
+'hidden-category-category' => 'Gehȳdede floccas',
+'category-subcat-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þone folgiendan underflocc.|Þes flocc hæfþ {{PLURAL:$1|þone folgiendan underflocc|þā folgiendan $1 underflocca}} - þæt fulle rīm is $2.}}',
 'category-subcat-count-limited' => 'Þes flocc hæfþ {{PLURAL:$1|þisne underflocc|$1 þās underfloccas}}.',
-'category-article-count' => '{{PLURAL:$2|Þes flocc hæfþ efne þā folȝiendan āne sīdan.|{{PLURAL:$1|Sēo folȝiende sīde is|$1 Þā folȝiendan sīdan sind}} in þissum flocce, þāra fullena $2.}}',
-'category-article-count-limited' => '{{PLURAL:$1|Se folȝienda tramet is|$1 Þā folȝiendan trametas sind}} on þissum flocce hēr.',
-'category-file-count' => ' {{PLURAL:$2|Þes flocc hæfþ efne þæt folȝiende ȝeƿithord.|{{PLURAL:$1|Þæt folȝiende ȝeƿithord is|$1 Þā folȝiendan ȝeƿithord sind}} in þissum flocce, þāra fullena $2.}}',
-'category-file-count-limited' => '{{PLURAL:$1|Þis ȝeƿithord is|$1 Þās ȝeƿithord sind}} in þissum flocce hēr.',
+'category-article-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þone folgiendan ānne tramet.|{{PLURAL:$1|Se folgienda tramet is|Þā folgiendan $1 trametaa sind}} in þissum flocce - þæt fulle rīm is $2.}}',
+'category-article-count-limited' => '{{PLURAL:$1|Se folgienda tramet is|$1 Þā folgiendan trametas sind}} on þissum flocce hēr.',
+'category-file-count' => '{{PLURAL:$2|Þes flocc hæfþ synderlīce þā folgiendan ymelan.|{{PLURAL:$1|Sēo folgiende ymele is|Þā folgiendan $1 ymelena sind}} in þissum flocce - þæt fulle rīm is $2.}}',
+'category-file-count-limited' => '{{PLURAL:$1|Þēos ymele is|$1 Þās ymelan sind}} in þissum flocce hēr.',
 'listingcontinuesabbrev' => 'mā',
-'index-category' => 'Ȝebēacniende trametas',
-'noindex-category' => 'Unȝebēacniende trametas',
-
-'about' => 'Ymbe',
-'article' => 'Innunȝsīde',
-'newwindow' => '(openaþ in nīƿum ēaȝþyrelum)',
-'cancel' => 'Undō',
+'index-category' => 'Getǣcnede trametas',
+'noindex-category' => 'Ungetǣcnede trametas',
+'broken-file-category' => 'Trametas þā habbaþ gebrocene hlencan mid ymelum',
+
+'about' => 'Gecȳþness',
+'article' => 'Innunge tramet',
+'newwindow' => '(openaþ in nīwum ēagþyrele)',
+'cancel' => 'Undōn',
 'moredotdotdot' => 'Mā...',
-'mypage' => 'Mīn sīde',
-'mytalk' => 'Mīnu ȝespreċ',
-'anontalk' => 'Þisses IP stōƿnaman talu',
+'morenotlisted' => 'Mā þe nis on getæle...',
+'mypage' => 'Mīn tramet',
+'mytalk' => 'Mīn mōtung',
+'anontalk' => 'Þisses IP naman mōtung',
 'navigation' => 'Þurhfōr',
 'and' => '&#32;and',
 
 # Cologne Blue skin
-'qbfind' => 'Find',
-'qbbrowse' => 'Onbirȝe',
-'qbedit' => 'Ādihte',
-'qbpageoptions' => 'Þēos sīde',
-'qbmyoptions' => 'Mīna sīdan',
-'qbspecialpages' => 'Syndriȝa sīdan',
-'faq' => 'Oftost ascoda ascunȝa',
+'qbfind' => 'Findan',
+'qbbrowse' => 'Þurhsēcan',
+'qbedit' => 'Adihtan',
+'qbpageoptions' => 'Þes tramet',
+'qbmyoptions' => 'Mīne trametas',
+'qbspecialpages' => 'Syndrige trametas',
+'faq' => 'Oftost ascoda ascunga',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-addsection' => 'Mearcunge ēacian',
-'vector-action-delete' => 'Forlēos',
-'vector-action-move' => 'Ƿeȝ',
-'vector-action-protect' => 'Beorȝa',
-'vector-action-undelete' => 'Sciepe tramet eft',
-'vector-action-unprotect' => 'Unbeorȝa',
-'vector-simplesearch-preference' => 'Lǣt forðoda sēcunge tōtyhtinga (synderlīce for Vector scinne)',
-'vector-view-create' => 'Sciepe',
-'vector-view-edit' => 'Ādihte',
+'vector-action-addsection' => 'Ēacnian mid mearcunge',
+'vector-action-delete' => 'Forlēosan',
+'vector-action-move' => 'Wegan',
+'vector-action-protect' => 'Beorgan',
+'vector-action-undelete' => 'Scieppan tramet eft',
+'vector-action-unprotect' => 'Andwendan beorgunge',
+'vector-simplesearch-preference' => 'Ānfealdlīc sēcunge mearc (synderlīce on Vector scinne)',
+'vector-view-create' => 'Scieppan',
+'vector-view-edit' => 'Adihtan',
 'vector-view-history' => 'Stǣr',
-'vector-view-view' => 'Rǣd',
-'vector-view-viewsource' => 'Sēo fruman',
+'vector-view-view' => 'Rǣdan',
+'vector-view-viewsource' => 'Sēon fruman',
 'actions' => 'Fremmunga',
 'namespaces' => 'Namstedas',
-'variants' => 'Missenlicnessa',
+'variants' => 'Missenlīcnessa',
 
-'errorpagetitle' => 'Ƿōh',
-'returnto' => 'Ȝā eft tō $1',
+'errorpagetitle' => 'Wōh',
+'returnto' => 'Gān eft tō $1',
 'tagline' => 'Fram {{SITENAME}}',
 'help' => 'Help',
-'search' => 'Sēc',
-'searchbutton' => 'Sēc',
-'go' => 'Gā',
+'search' => 'Sēcan',
+'searchbutton' => 'Sēcan',
+'go' => 'Gān',
 'searcharticle' => 'Gān',
-'history' => 'Sīdan stǣr',
+'history' => 'Trametes stǣr',
 'history_short' => 'Stǣr',
-'updatedmarker' => 'nīƿod æfter ic cōm hider ǣror',
-'printableversion' => 'Ūtmǣlendlicu fadunȝ',
-'permalink' => 'Fæst hlenċe',
-'print' => 'Ūtmǣl',
-'edit' => 'Ādiht',
-'create' => 'Sciepe',
-'editthispage' => 'Ādiht þās sīdan',
-'create-this-page' => 'Sciepe þās sīdan',
-'delete' => 'Forlēos',
-'deletethispage' => 'Forlēos þās sīdan',
-'undelete_short' => 'Maca {{PLURAL:$1|ānne ādiht|$1 ādihtas}} eft',
-'protect' => 'Beorȝa',
-'protect_change' => 'Hƿeorf',
-'protectthispage' => 'Beorȝa þās sīdan',
-'unprotect' => 'Unbeorgan',
-'unprotectthispage' => 'Unbeorȝa þās sīdan',
-'newpage' => 'Nīƿu sīde',
-'talkpage' => 'Sprec ymb þās sīdan',
-'talkpagelinktext' => 'ȝespreċ',
-'specialpage' => 'Syndriȝ sīde',
+'updatedmarker' => 'nīwod æfter mīnre lætestan sōcne',
+'printableversion' => 'Ūtmǣlendlicu fadung',
+'permalink' => 'Fæst hlenca',
+'print' => 'Ūtmǣlan',
+'view' => 'Sihþ',
+'edit' => 'Adihtan',
+'create' => 'Scieppan',
+'editthispage' => 'Adihtan þisne tramet',
+'create-this-page' => 'Scieppan þisne tramet',
+'delete' => 'Forlēosan',
+'deletethispage' => 'Forlēosan þisne tramet',
+'undelete_short' => 'Scieppan {{PLURAL:$1|āne adihtunge|$1 adihtunga}} eft',
+'viewdeleted_short' => 'Sēon {{PLURAL:$1|āne forlorene adihtunge|$1 forlorenra adihtunga}}',
+'protect' => 'Beorgan',
+'protect_change' => 'Wendan',
+'protectthispage' => 'Beorgan þisne tramet',
+'unprotect' => 'Andwendan beorgunge',
+'unprotectthispage' => 'Andwendan beorgune þisses trametes',
+'newpage' => 'Nīwe tramet',
+'talkpage' => 'Sprecan ymbe þisne tramet',
+'talkpagelinktext' => 'Mōtung',
+'specialpage' => 'Syndrig tramet',
 'personaltools' => 'Āgne tōlas',
-'postcomment' => 'Nīƿe dǣl',
-'articlepage' => 'Seoh innungsīdan',
-'talk' => 'Ȝespreċ',
-'views' => 'Ansīena',
-'toolbox' => 'Tōlearc',
-'userpage' => 'Seoh brūcendsīdan',
-'projectpage' => 'Seoh ƿeorcsīdan',
-'imagepage' => 'Seoh ȝeƿithordsīdan',
-'mediawikipage' => 'Ȝeƿritsīdan sēon',
-'templatepage' => 'Seoh bysensīdan',
-'viewhelppage' => 'Seoh helpsīdan',
-'categorypage' => 'Seoh floccsīdan',
-'viewtalkpage' => 'Seoh tæle',
-'otherlanguages' => 'On ōðrum sprǣċum',
+'postcomment' => 'Nīwe dǣl',
+'articlepage' => 'Sēon innunge tramet',
+'talk' => 'Mōtung',
+'views' => 'Sihþa',
+'toolbox' => 'Tōlmearc',
+'userpage' => 'Sēon brūcendes tramet',
+'projectpage' => 'Sēon weorces tramet',
+'imagepage' => 'Sēon ymelan tramet',
+'mediawikipage' => 'Sēon ǣrendgewrita tramet',
+'templatepage' => 'Sēon bysene tramet',
+'viewhelppage' => 'Sēon helpes tramet',
+'categorypage' => 'Sēon flocces tramet',
+'viewtalkpage' => 'Sēon mōtunge',
+'otherlanguages' => 'On ōðrum sprǣcum',
 'redirectedfrom' => '(Edlǣded fram $1)',
-'redirectpagesub' => 'Edlǣdsīde',
-'lastmodifiedat' => 'Man nīwanost þās sīdan hƿearf on þǣre $2 stunde þæs $1.',
-'viewcount' => 'Þēos sīde hæfþ ȝeƿorden ȝeseƿen {{PLURAL:$1|āne|$1 hwīlum}}.',
-'protectedpage' => 'Borȝod sīde',
-'jumpto' => 'Gā tō:',
+'redirectpagesub' => 'Edlǣdunge tramet',
+'lastmodifiedat' => 'Man nīwanost wende þisne tramet on þǣre $2 tīde þæs $1.',
+'viewcount' => 'Þes tramet wæs gesawen {{PLURAL:$1|āne|$1 mǣla}}.',
+'protectedpage' => 'Geborgen tramet',
+'jumpto' => 'Gān tō:',
 'jumptonavigation' => 'þurhfōr',
-'jumptosearch' => 'sēċan',
-'view-pool-error' => 'Ƿē sind sāriȝe for þǣm þe þās þeȝntōlas nū oferlīce ƿyrcaþ.
-Tō mæniȝe brūcendas ȝesēcaþ to sēonne þās sīdan.
-Ƿ̈ē biddaþ þæt þū abīde scortre tīde fore þū ȝesēce to sēonne þās sīdan eft.
+'jumptosearch' => 'sēcan',
+'view-pool-error' => 'Wālā, þā þegntōlas nū oferlīce wyrcaþ.
+Tō mænige brūcendas gesēcaþ tō sēonne þisne tramet.
+Wē biddaþ þæt þū abīde scortne tīman ǣr þū gesēce to sēonne þisne tramet eft.
 
 $1',
+'pool-errorunknown' => 'Uncūþ wōh',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Ymbe {{SITENAME}}',
-'aboutpage' => 'Project:Ymbe',
-'copyright' => 'Man mæȝ innunȝe under $1 findan.',
-'copyrightpage' => '{{ns:project}}:Ȝelīcnessriht',
-'currentevents' => 'Ȝelimpunȝa þisses tīman',
-'currentevents-url' => 'Project:Ȝelimpunga þisses tīman',
+'aboutsite' => 'Gecȳþness ymbe {{SITENAME}}',
+'aboutpage' => 'Project:Gecȳþness',
+'copyright' => 'Man mæg innunge under $1 findan.',
+'copyrightpage' => '{{ns:project}}:Gelīcnessriht',
+'currentevents' => 'Gelimpunga þisses tīman',
+'currentevents-url' => 'Project:Gelimpunga þisses tīman',
 'disclaimers' => 'Ætsacunga',
-'disclaimerpage' => 'Project:Ætsacunga',
-'edithelp' => 'Help mid ādihtunge',
-'edithelppage' => 'Help:Ādihtung',
-'helppage' => 'Help:Inn',
-'mainpage' => 'Hēafodsīde',
-'mainpage-description' => 'Hēafodsīde',
+'disclaimerpage' => 'Project:Gemǣne ætsacung',
+'edithelp' => 'Help on adihtunge',
+'edithelppage' => 'Help:Adihtung',
+'helppage' => 'Help:Innung',
+'mainpage' => 'Hēafodtramet',
+'mainpage-description' => 'Hēafodtramet',
 'policy-url' => 'Project:Rǣd',
-'portal' => 'Ȝemǣnscipes ingang',
-'portal-url' => 'Project:Ȝemǣnscipes inȝanȝ',
+'portal' => 'Gemǣnscipes ingang',
+'portal-url' => 'Project:Gemǣnscipes ingang',
 'privacy' => 'Ānlēpnesse rǣd',
 'privacypage' => 'Project:Ānlēpnesse rǣd',
 
-'badaccess' => 'Þafunȝe ƿōh',
-'badaccess-group0' => 'Þū ne mōst dōn þā dǣde þǣre þe þū hafast abeden.',
+'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.',
 
-'versionrequired' => '$1 fadunȝ of MediaǷiki is ȝeþorften',
-'versionrequiredtext' => 'Fadung $1 MediaǷiki is ȝeþorften tō notiennde þisne tramet.
-Sēoh þone [[Special:Version|fadunge tramet]].',
+'versionrequired' => '$1 fadung of MediaWiki is behēfe',
+'versionrequiredtext' => '$1 fadung MediaWiki is behēfe tō notienne þisne tramet.
+Seoh þone [[Special:Version|fadunge tramet]].',
 
-'ok' => 'OK',
-'retrievedfrom' => 'Fram "$1" beȝieten',
+'ok' => 'Gōd lā',
+'retrievedfrom' => 'Fram "$1" begeten',
 'youhavenewmessages' => 'Þū hæfst $1 ($2).',
-'newmessageslink' => 'nīƿu ǣrendȝeƿritu',
-'newmessagesdifflink' => 'nīƿost hƿearf',
-'youhavenewmessagesmulti' => 'Þū hæfst nīƿe ǣrende on $1',
-'editsection' => 'ādihtan',
-'editold' => 'ādihtan',
-'viewsourceold' => 'Sēon andweorc',
-'editlink' => 'ādihtan',
-'viewsourcelink' => 'Fruman sēon',
-'editsectionhint' => 'Dǣl ādihtan: $1',
-'toc' => 'Innoþ',
-'showtoc' => 'sēon',
+'newmessageslink' => 'nīwu ǣrendgewritu',
+'newmessagesdifflink' => 'nīwost andwendung',
+'youhavenewmessagesfromusers' => 'Þū hafast $1 fram {{PLURAL:$3|ōðrum brūcende|$3 brūcenda}} ($2).',
+'youhavenewmessagesmanyusers' => 'Þū hafast $1 fram manigum brūcendum ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|nīwe ǣrendgewrit|nīwra ǣrendgewrita}}',
+'youhavenewmessagesmulti' => 'Þū hæfst nīwu ǣrendu on $1',
+'editsection' => 'adihtan',
+'editold' => 'adihtan',
+'viewsourceold' => 'Sēon fruman',
+'editlink' => 'adihtan',
+'viewsourcelink' => 'Sēon fruman',
+'editsectionhint' => 'Adihtan dǣl: $1',
+'toc' => 'Innung',
+'showtoc' => 'īwan',
 'hidetoc' => 'hȳdan',
-'thisisdeleted' => '$1 sēon oþþe nīƿian?',
-'viewdeleted' => '$1 sēon?',
-'restorelink' => '{{PLURAL:$1|ān āfeorsed ādiht|$1 āfeorsed ādihtas}}',
-'feedlinks' => 'Flōd:',
-'feed-invalid' => 'Ungenge underƿrītunge inlāde ȝecynd.',
-'feed-unavailable' => 'Fruman inlāda ne sind ȝearƿa',
+'thisisdeleted' => 'Sēon oþþe nīwian $1?',
+'viewdeleted' => 'Sēon $1 lā?',
+'restorelink' => '{{PLURAL:$1|ān forloren ādihtung|$1 forlorenra adihtunga}}',
+'feedlinks' => 'Ǣrendstrēam:',
+'feed-invalid' => 'Ungenge underwrītunge ǣrendstrēames gecynd.',
+'feed-unavailable' => 'Fruman ǣrendstrēamas ne sind gearwa',
 'site-rss-feed' => '$1 RSS strēam',
 'site-atom-feed' => '$1 Atom strēam',
 'page-rss-feed' => '$1 RSS strēam',
 'page-atom-feed' => '$1 Atom strēam',
-'red-link-title' => '$1 (ne ȝiet ƿriten)',
+'red-link-title' => '$1 (tramet ne biþ)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Sīde',
-'nstab-user' => 'Brūcendsīde',
-'nstab-media' => 'Ȝemyndsīde',
-'nstab-special' => 'Syndriȝu sīde',
-'nstab-project' => 'Ƿeorces sīde',
-'nstab-image' => 'Fīl',
-'nstab-mediawiki' => 'Ǣrendȝeƿrit',
+'nstab-main' => 'Tramet',
+'nstab-user' => 'Brūcendes tramet',
+'nstab-media' => 'Missendendebyrdnesse tramet',
+'nstab-special' => 'Syndrig tramet',
+'nstab-project' => 'Weorces tramet',
+'nstab-image' => 'Ymele',
+'nstab-mediawiki' => 'Ǣrendgewrit',
 'nstab-template' => 'Bysen',
-'nstab-help' => 'Helpsīde',
+'nstab-help' => 'Helpes tramet',
 'nstab-category' => 'Flocc',
 
 # Main script and global functions
-'nosuchaction' => 'Nǣniȝ dǣd',
-'nosuchactiontext' => 'Þæt weorc þe se nettfrumfinded wile is ungenge.
-Þū meahtlīce miswrite þone nettfrumfindend, oþþe folgode unrihtne hlencan.
-Þis mæg ēac tācnian unrihtnesse on þǣre sōftware þe is gebrocen fram {{SITENAME}}.',
-'nosuchspecialpage' => 'Nǣniȝu syndriȝu sīde',
-'nospecialpagetext' => '<strong>Þū hafast abiden ungenges ānlices trametes.</strong>
+'nosuchaction' => 'Swilc dǣd ne biþ nā',
+'nosuchactiontext' => 'Sēo þe se nettfrumfinded wile dōn nis genge.
+Þū wēninga miswrite þone nettfrumfindend, oþþe folgode unrihtne hlencan.
+Þis mæg ēac tācnian wōh on þǣre weorcwrithyrste þe is gebrocen fram {{SITENAME}}.',
+'nosuchspecialpage' => 'Swilc syndrig tramet ne biþ nā',
+'nospecialpagetext' => '<strong>Þū hafast abiden ungenges syndriges trametes.</strong>
 
-Getæl gengra ānlicra trameta cann mann findand be [[Special:SpecialPages|{{int:specialpages}}]].',
+Getæl gengra syndrigra trameta cann man findan be [[Special:SpecialPages|þǣm syndrigra trameta getæle]].',
 
 # General errors
-'error' => 'Ƿōh',
-'databaseerror' => 'Cȳþþuhordes ƿōh',
-'dberrortext' => 'Cȳþþuhordes bēnes endebyrdnesse fremmode ƿōh.
-Þis mæȝe mǣnan regolƿōh on þǣre sōftƿare.
-Sēo nīƿoste ȝesōhte sōftƿare bēn ƿæs:
-<blockquote><tt>$1</tt></blockquote>
-fram innan ƿeorce "<tt>$2</tt>".
-Cȳþþuhord edƿende ƿōh "<tt>$3: $4</tt>"',
-'laggedslavemode' => "'''Ƿarnung:''' Sīde ne mihteliċ ne hæfþ nīƿa nīƿunga.",
-'enterlockreason' => 'Wrīt race þǣre forwiernunge and apunsunge be þǣm tīman on þǣm bēo sēo forwiernung forlǣten',
-'missingarticle-rev' => '(nīƿung#: $1)',
-'internalerror' => 'Innan ƿōh',
-'internalerror_info' => 'Innan ƿōh: $1',
-'fileappenderrorread' => 'Ne meahte "$1" rǣdan on ēacunge.',
-'fileappenderror' => 'Ne meahte "$1" to "$2" ēacian.',
-'filerenameerror' => 'Ne cúðe ednemnan þrǽd "$1" tó "$2".',
-'filenotfound' => 'Ne cūðe findan þrǣd "$1".',
-'formerror' => 'Ƿōh: ne meahte cȳþþuȝeƿrit forþsendan',
+'error' => 'Wōh',
+'databaseerror' => 'Cȳþþuhordes wōh',
+'dberrortext' => 'Cȳþþuhordes bēne endebyrdnesse wōh gelamp.
+Þis mæg mǣnan wōh on þǣre weorcwrithyrste.
+Sēo nīwoste gesōhte cȳþþuhordes bēn wæs:
+<blockquote><code>$1</code></blockquote>
+fram innan wyrcunge "<code>$2</code>".
+Cȳþþuhord ageaf wōh "<code>$3: $4</code>"',
+'laggedslavemode' => "'''Warnung:''' Wēnunga næbbe se tramet nīwlīca nīwunga.",
+'enterlockreason' => 'Wrīt race þǣre forwiernunge and apinsunge þæs tīman on þǣm bēo sēo forwiernung forlǣten',
+'missingarticle-rev' => '(nīwung#: $1)',
+'internalerror' => 'Inweard wōh',
+'internalerror_info' => 'Inweard wōh: $1',
+'fileappenderrorread' => 'Ne cūðe "$1" rǣdan under ēacnunge.',
+'fileappenderror' => 'Ne cūðe "$2" mid "$1" ēacnian.',
+'filerenameerror' => 'Ne cūðe ednemnan ymelan "$1" tō "$2".',
+'filenotfound' => 'Ne cūðe findan ymelan "$1".',
+'formerror' => 'Wōh: ne cūðe cȳþþugewrit forþsendan.',
 'badarticleerror' => 'Þēos dǣd ne cann bēon gefremed on þissum tramete.',
-'badtitle' => 'Unandfenge títul',
-'viewsource' => 'Fruman sēon',
-'cascadeprotected' => 'Þis trament hafaþ geworden gebeorgod wiþ ādihtunge, for þǣm þe hē is geinnod in þissum trament {{PLURAL:$1|tramente, þe is| tramentum, þe sind}} geborgod mid þǣre "cascading" cyre gesett wyrcende: $2',
+'badtitle' => 'Nā genge titul',
+'viewsource' => 'Sēon fruman',
+'cascadeprotected' => 'Þes trament wæs geborgen wiþ adihtunge, for þǣm þe hē is befangen in þissum {{PLURAL:$1|tramente, þe is| tramentum, þe sind}} geborgen settum wyrcende þǣm cyre "cascading": $2',
 
 # Login and logout pages
 'logouttext' => "'''Þū eart nū ūtmeldod.'''
 
-Þū canst ætfeolan tō brūcenne {{SITENAME}} ungecūðe, oþþe þū canst <span class='plainlinks'>[$1 inmeldian eft]</span> tō ylcan oþþe ōðrum brūcende.
-Cnāw þæt sume sīdan cunnon gelǣstende ēowod wesan swā þū wǣre gīet inmeldod, oþ þæt þū clǣnsie þīnes sēcendtōles gemynd.",
-'yourname' => 'Þīn brūcendnama',
-'yourpassword' => 'Þafungƿord:',
-'yourpasswordagain' => 'Þafungƿord edƿrītan:',
-'remembermypassword' => 'Mīne inmeldunge ȝemyndan on þissum spearcatelle (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'yourdomainname' => 'Þīn ȝeƿeald:',
+Þū canst ætfeolan þǣre nytte {{SITENAME}} tō ungecūðum, oþþe þū canst <span class='plainlinks'>[$1 inmeldian eft]</span> tō þǣm ylcan oþþe ōðrum brūcende.
+Cnāw þæt sume trametas mihten gīet wesan geīwde swā þū wǣre gīet inmeldod, oþ þæt þū clǣnsie þīnes sēcendtōles hord.",
+'yourname' => 'Þīn brūcendnama:',
+'yourpassword' => 'Þafungword:',
+'yourpasswordagain' => 'Wrītan þafungword eft:',
+'remembermypassword' => 'Gemynan mīne inmeldunge on þissum webbsēcende (oþ $1 {{PLURAL:$1|dæg|daga}} lengest)',
+'yourdomainname' => 'Þīn geweald:',
 'login' => 'Inmeldian',
-'nav-login-createaccount' => 'Nīƿne hordcleofan scieppan oþþe inmeldian',
-'userlogin' => 'Macian nīwne grīman oþþe grīman brūcan',
+'nav-login-createaccount' => 'Inmeldian / wyrcan reccinge',
+'userlogin' => 'Inmeldian / wyrcan reccinge',
 'userloginnocreate' => 'Inmeldian',
 'logout' => 'Ūtmeldian',
 'userlogout' => 'Ūtmeldian',
-'notloggedin' => 'Ne inȝemelded',
-'nologinlink' => 'Hordcleofan scieppan',
-'createaccount' => 'Hordcleofan scieppan',
+'notloggedin' => 'Nā ingemeldod',
+'nologinlink' => 'Scieppan reccinge',
+'createaccount' => 'Scieppan reccinge',
 'gotaccountlink' => 'Inmeldian',
-'createaccountmail' => 'Þurh spearcenaǣrend',
+'createaccountmail' => 'Notian sceortne tīman hlētlic þafungword and sendan hit to þǣm spearcǣrenda naman þe is niðer',
 'createaccountreason' => 'Racu:',
-'badretype' => 'Þā þafungƿord þe ƿrite þū, bēoþ unȝemæcca.',
-'userexists' => 'Hƿā hæfþ þæt brūcendnama.
-Bidde ōðer brūcendnama ċēosan.',
-'loginerror' => 'Inmeldunge ƿōh',
-'createaccounterror' => 'Ne cūðe macian reccend: $1',
-'nocookiesnew' => 'Se brūcendreccend wæs gemacod, ac þū neart inmedlod.
-{{SITENAME}} brȳcþ tācninclu tō inmeldienne brūcendas.
-Þū hafast forwierned tācninclu.
-Bidde þē, lǣt hīe tō twyrcenne, and þǣræfter inmelda þurh þīnne nīwan brūcendnaman and gelēafnessword.',
+'badretype' => 'Þā þafungword þe write þū, bēoþ ungelīc.',
+'userexists' => 'Se brūcendnama is ǣr gebrocen. Cēos lā ōðerne naman.',
+'loginerror' => 'Inmeldunge wōh',
+'createaccounterror' => 'Ne cūðe scieppan reccinge: $1',
+'nocookiesnew' => 'Sēo brūcendreccing wæs gemacod, ac þū neart inmeldod.
+{{SITENAME}} brȳcþ cȳþþu grētunga tō inmeldienne brūcendas.
+Þū hafast forwierned cȳþþu grētunga.
+Līef him lā, and siþþan inmelda þīnne nīwan brūcendnaman and þīn nīwe þafungword.',
 'loginsuccesstitle' => 'Inmeldung gesǣlde',
-'loginsuccess' => "'''Þu eart nū inmeldod tō {{SITENAME}} swā \"\$1\".'''",
-'nosuchuser' => 'Þǣr nis nān brūcere þe hæfþ þone naman "$1".
-Stafena micelnesse sind hefige and ānlica on brūcendnamum.
-Scēawa þīne wrītunge eft, oþþe brūc þā cartan þe is hērunder tō [[Special:UserLogin/signup|settene nīwne brūcendreccend]].',
-'nosuchusershort' => 'Þǣr is nān brūcend mid þǣm naman "$1".  Edscēawa on þīne wrītunge.',
-'passwordtooshort' => 'Gelēafword sculon habban læst {{PLURAL:$1|1 stafan|$1 stafan}}.',
-'mailmypassword' => 'Nīƿe þafungƿord bȳ e-mail sendan',
+'loginsuccess' => "'''Þu eart nū inmeldod tō {{SITENAME}}  \"\$1\".'''",
+'nosuchuser' => 'Þǣr nis nān brūcend þe hæfþ þone naman "$1".
+Stafena micelnessa sind hefiga and ānlica on brūcendnamum.
+Scēawa þīne wrītunge eft, oþþe [[Special:UserLogin/signup|sciepp nīwe reccinge]].',
+'nosuchusershort' => 'Þǣr nis nān brūcend mid þǣm naman "$1".  Scēawa þīne wrītunge.',
+'passwordtooshort' => 'Þafungword sculon habban læst {{PLURAL:$1|1 stafan|$1 stafena}}.',
+'mailmypassword' => 'Sendan nīwe þafungword on spearcǣrend',
 'acct_creation_throttle_hit' => 'Hwæt, þu hæfst gēo geseted {{PLURAL:$1|1 hordcleofan|$1 -}}. Þu ne canst settan ǣnige māran.',
-'accountcreated' => 'Hordcleofan ȝescapen',
-'loginlanguagelabel' => 'Sprǣċ: $1',
+'accountcreated' => 'Scōp reccinge',
+'loginlanguagelabel' => 'Sprǣc: $1',
 
 # Change password dialog
-'resetpass' => 'Þafungƿord hƿeorfan',
-'oldpassword' => 'Eald þafungƿord:',
-'newpassword' => 'Nīƿu þafungƿord:',
-'retypenew' => 'Nīƿe þafungƿord edƿrītan',
-'resetpass-submit-loggedin' => 'Þafungƿord hƿeorfan',
+'resetpass' => 'Andwendan þafungword',
+'oldpassword' => 'Eald þafungword:',
+'newpassword' => 'Nīwe þafungword:',
+'retypenew' => 'Wrīt nīwe þafungword eft:',
+'resetpass-submit-loggedin' => 'Andwendan þafungword',
 'resetpass-submit-cancel' => 'Undōn',
 
 # Edit page toolbar
 'bold_sample' => 'Þicce traht',
 'bold_tip' => 'Þicce traht',
-'italic_sample' => 'Flōƿende traht',
-'italic_tip' => 'Flōƿende traht',
-'link_sample' => 'Hlenċnama',
-'link_tip' => 'Innanƿeard hlenċe',
-'extlink_sample' => 'http://www.example.com hlenċnama',
-'extlink_tip' => 'Ūtanƿeard hlenċe (ȝemune http:// foredǣl)',
+'italic_sample' => 'Flōwende traht',
+'italic_tip' => 'Flōwende traht',
+'link_sample' => 'Hlencan nama',
+'link_tip' => 'Innanweard hlenca',
+'extlink_sample' => 'http://www.example.com hlencan nama',
+'extlink_tip' => 'Ūtanweard hlenca (beþenc þone http:// foredǣl)',
 'headline_sample' => 'Hēafodlīnan traht',
 'headline_tip' => 'Emnet 2 hēafodlīn',
 'nowiki_sample' => 'Unȝeƿorhtne traht hēr stellan',
@@ -430,83 +436,83 @@ Scēawa þīne wrītunge eft, oþþe brūc þā cartan þe is hērunder tō [[Sp
 'summary' => 'Scortnes:',
 'subject' => 'Ymbe/hēafodlīn:',
 'minoredit' => 'Þes is lȳtl ādiht',
-'watchthis' => 'Þās sīdan ƿæccan',
-'savearticle' => 'Sīdan sparian',
-'preview' => 'Forescēaƿian',
-'showpreview' => 'Forescēaƿian',
-'showlivepreview' => 'Līfe forescēaƿe',
-'showdiff' => 'Hƿearfas sēon',
-'summary-preview' => 'Scortnesse forescēaƿe:',
-'blockednoreason' => 'nānu racu ȝiefen',
-'whitelistedittext' => 'Þū scealt $1 to ādihtenne sīdan.',
-'nosuchsectiontitle' => 'Ne mæȝ dǣl findan',
+'watchthis' => 'Behealdan þisne tramet',
+'savearticle' => 'Hordian tramet',
+'preview' => 'Fōrebysen',
+'showpreview' => 'Īwan fōrebysene',
+'showlivepreview' => 'Rihte geīwed fōrebysen',
+'showdiff' => 'Īwan andwendunga',
+'summary-preview' => 'Scortnesse fōrebysen:',
+'blockednoreason' => 'nān racu gifen',
+'whitelistedittext' => 'Þū scealt $1 to adihtenne trametas.',
+'nosuchsectiontitle' => 'Ne cann dǣl findan',
 'loginreqtitle' => 'Inmeldung ābeden',
 'loginreqlink' => 'inmeldian',
-'loginreqpagetext' => 'Þū scealt $1 tō sēonne ōðre sīdan.',
-'accmailtitle' => 'Þafungƿord sended.',
+'loginreqpagetext' => 'Þū scealt $1 tō sēonne ōðre trametas.',
+'accmailtitle' => 'Þafungword wæs gesended.',
 'accmailtext' => "Hlīetemaced þafungƿord for [[User talk:$1|$1]] ƿæs to $2 sended.
 
 Þū meaht þæt þafungƿord hƿeorfan for þissum nīƿan hordcleofa on þǣre ''[[Special:ChangePassword|change password]]'' sīde æfter inmeldiende.",
-'newarticle' => '(Nīƿe)',
+'newarticle' => '(Nīwe)',
 'newarticletext' => "Þu hæfst bende tō tramete gefolgod þe nū gīet ne stendeþ.
 Tō scieppene þone tramet, onginn þyddan in þǣre boxe under (sēo þone [[{{MediaWiki:Helppage}}|helptramet]] for mā gefrǣge).
 Gif þu hider misfōn cōme, cnoca þā þīnne webbscēaweres '''on bæc''' cnæpp.",
-'usercssyoucanpreview' => "'''Rǣd:''' Brūc þone 'Forescēawian' cnæpp tō āfandienne þīne nīwe css/js beforan sparunge.",
+'usercssyoucanpreview' => "'''Rǣd:''' Brūc þone \"{{int:Forescēaƿian}}\" cnæpp tō costnienne þīne nīwan css/js wrītunge ǣr hit sīe hordod.",
 'userjsyoucanpreview' => "'''Rǣd:''' Brūc þone 'Forescēawian' cnæpp tō āfandienne þīne nīwe css/js beforan sparunge.",
-'updated' => '(Ednīƿed)',
-'note' => "'''Behielde:'''",
-'previewnote' => "'''Ȝemune þe þēos efne forescēaƿe is.'''
-Þīne hƿearfas ne ȝiet bēoþ spared!",
-'editing' => 'Ādihtende $1',
-'editingsection' => 'Ādihtende $1 (dǣl)',
-'editingcomment' => 'Ādihtende $1 (nīƿe dǣl)',
-'editconflict' => 'Ādihtes ƿiþfeoht: $1',
+'updated' => '(Ednīwed)',
+'note' => "'''Gewritincel:'''",
+'previewnote' => "'''Beþenc þe þis is gīet efne fōrebysen.'''
+Þīna andwendunga gīet ne sind hordoda!",
+'editing' => 'Adihtende $1',
+'editingsection' => 'Adihtende $1 (dǣl)',
+'editingcomment' => 'Adihtende $1 (nīwe dǣl)',
+'editconflict' => 'Adihtunge wiþdǣd: $1',
 'yourtext' => 'Þīn traht',
-'editingold' => "'''ǷARNUNG: Þū ādihtest ealde fadunge þisre sīdan.'''
-Ȝif þū hine sparie, ǣniȝ hƿearfas ȝemaced siþþan þisse fadunge bēoþ sōðes forloren.",
-'yourdiff' => 'Tōdǣlednessa',
+'editingold' => "'''WARNUNG: Þū adihtest ealde fadunge þisses trametes.'''
+Gif þū hine hordie, ǣnga andwendunga þā wǣron gedōn æfter þisse fadunge bēoþ sōðes forloren.",
+'yourdiff' => 'Fǣgnessa',
 'copyrightwarning2' => "Bidde behielde þæt man mæȝ ealla forðunga tō {{SITENAME}}
 ādihtan, hƿeorfan, oþþe forniman.
 Ȝif þū ne ƿille man þīn ȝeƿrit ādihtan unmildheorte, þonne hīe hēr ne forþsendan.<br />
 Þū behǣtst ēac þæt þū selfa þis ƿrite, oþþe efenlǣhtest of sumre
 folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 '''Ne forþsend efenlǣhtscielded ƿeorc būtan þafunge!'''",
-'templatesused' => '{{PLURAL:$1|Bysen|Bysena}} brocen on þisre sīdan:',
-'templatesusedpreview' => '{{PLURAL:$1|Bysen|Bysena}} brocen on þisre forescēaƿe:',
-'template-protected' => '(borgen)',
+'templatesused' => '{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þissum tramete:',
+'templatesusedpreview' => '{{PLURAL:$1|Þēos bysen is|Þās bysena sind}} gebrocen on þisre fōrebysene:',
+'template-protected' => '(geborgen)',
 'template-semiprotected' => '(sāmborgen)',
-'hiddencategories' => 'Þēos sīde is ȝesīþ {{PLURAL:$1|1 ȝehȳdedes flocces|$1 ȝehȳdeda flocca}}:',
-'nocreate-loggedin' => 'Þū ne hæfst þafunge to scieppenne nīƿa sīdan.',
-'permissionserrors' => 'Þafunga ƿōh',
-'permissionserrorstext-withaction' => 'Þū ne hæfst þafunge for $2, forþǣm þe {{PLURAL:$1|race|racum}}:',
+'hiddencategories' => 'Þes tramet is gesibb {{PLURAL:$1|1 gehȳdedum flocce|$1 gehȳdedra flocca}}:',
+'nocreate-loggedin' => 'Þū ne hæfst þafunge to scieppenne nīwe trametas.',
+'permissionserrors' => 'Þafunga wōh',
+'permissionserrorstext-withaction' => 'Þū ne hæfst þafunge tō $2, for {{PLURAL:$1|þisre race|þissum racum}}:',
 'recreate-moveddeleted-warn' => "'''Warnung: Þu edsciepst tramet þe wæs ǣr āfeorsod.'''
 
 Þu sceoldest smēagan, hwæðer hit gerādlic sīe, forþ tō gānne mid ādihtunge þisses trametes.
 Þæt āfeorsungbred þisses trametes is hēr geīeht for behēfnesse:",
 
 # History pages
-'viewpagelogs' => 'Ealdhordas sēon for þisse sīdan',
-'nohistory' => 'Nis nān ādihtungstǣr for þissum tramete.',
-'currentrev-asof' => 'Nīƿe fadung sƿā $1',
-'revisionasof' => 'Nīƿung fram',
-'previousrevision' => '← Ieldra fadung',
-'nextrevision' => 'Nīƿra fadung →',
-'currentrevisionlink' => 'Nīƿu fadung',
+'viewpagelogs' => 'Sēon þisses trametes ealdhold',
+'nohistory' => 'Nis nān ādihtungstǣr for þissum tramete.',
+'currentrev-asof' => 'Nīwost fadung on $1',
+'revisionasof' => 'Nīwung fram $1',
+'previousrevision' => '← Ieldre fadung',
+'nextrevision' => 'Nīwre fadung →',
+'currentrevisionlink' => 'Nīwost fadung',
 'cur' => 'nū',
 'next' => 'nīehst',
 'last' => 'ǣr',
-'history-fieldset-title' => 'Stǣr sēċan',
+'history-fieldset-title' => 'Sēcan stǣr',
 'histfirst' => 'Ǣrest',
-'histlast' => 'Nīƿost',
-'historyempty' => '(æmettiȝ)',
+'histlast' => 'Nīwost',
+'historyempty' => '(æmettig)',
 
 # Revision feed
-'history-feed-title' => 'Ednīƿunge stǣr',
+'history-feed-title' => 'Ednīwunge stǣr',
 'history-feed-description' => 'Ednīƿunge stǣr þisse sīdan on þǣre ƿiki',
 'history-feed-item-nocomment' => '$1 on $2',
 
 # Revision deletion
-'rev-deleted-comment' => '(cƿide fornōm)',
+'rev-deleted-comment' => '(fornōm cwide)',
 'rev-deleted-user' => '(brūcendnama fornōm)',
 'rev-delundel' => 'scēaƿian/hȳdan',
 'rev-showdeleted' => 'scēaƿan',
@@ -519,89 +525,86 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'revdelete-radio-set' => 'Ȝēa',
 'revdelete-radio-unset' => 'Nā',
 'revdel-restore' => 'scēaƿnesse hƿeorfan',
-'pagehist' => 'Sīdan stǣr',
+'pagehist' => 'Trametes stǣr',
 'revdelete-reasonotherlist' => 'Ōðru racu',
 
 # History merging
-'mergehistory-from' => 'Frumasīde:',
-'mergehistory-submit' => 'Ednīƿunga ȝeþēodian',
+'mergehistory-from' => 'Fruman tramet:',
+'mergehistory-submit' => 'Geānlǣcan ednīwunga',
 'mergehistory-reason' => 'Racu:',
 
 # Merge log
-'revertmerge' => 'Unȝeþēodan',
+'revertmerge' => 'Settan þā geānlǣcinge on bæc',
 
 # Diffs
-'history-title' => 'Ednīƿunge stǣr for "$1"',
-'lineno' => 'Līne $1:',
-'compareselectedversions' => 'Corena fadunga metan',
+'history-title' => 'Ednīwunga stǣr for "$1"',
+'lineno' => '$1. līne:',
+'compareselectedversions' => 'Bemetan gecorena ednīwunga',
 'editundo' => 'undōn',
 
 # Search results
-'searchresults' => 'Sōcne becymas',
-'searchresults-title' => 'Sōcne becymas for "$1"',
-'searchresulttext' => 'For mā cȳþþe ymbe {{SITENAME}} sēċan, sēo [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchresults' => 'Sōcne wæstmas',
+'searchresults-title' => 'Sōcne wæstmas for "$1"',
+'searchresulttext' => 'Gif þū wille mā leornian ymbe þā sēcunge on {{SITENAME}}, seoh [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => "Þū sōhtest '''[[:$1]]'''",
 'searchsubtitleinvalid' => "Þū sōhtest '''$1'''",
-'notitlematches' => 'Nān sīdenama mæccan',
-'notextmatches' => 'Nāne sīdetrahtes mæccan',
+'notitlematches' => 'Nis þǣr nǣnig swilc tramet mid þǣm naman',
+'notextmatches' => 'Nis þǣr nǣnig swilc traht on nǣngum trametum',
 'prevn' => 'ǣror {{PLURAL:$1|$1}}',
 'nextn' => 'nīehst {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Sēon ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-new' => "'''Þā sīdan \"[[:\$1]]\" scieppan on þisre ƿiki!'''",
-'searchhelp-url' => 'Help:Inn',
-'searchprofile-articles' => 'Innoþsīdan',
-'searchprofile-project' => 'Help and Ƿeorc sīdan',
-'searchprofile-images' => 'Mæniȝȝemyndisc',
-'searchprofile-everything' => 'Ȝehƿæt',
-'searchprofile-articles-tooltip' => 'In $1 sēċan',
-'searchprofile-project-tooltip' => 'In $1 sēċan',
-'searchprofile-images-tooltip' => 'Fīlan sēċan',
-'search-result-size' => '$1 ({{PLURAL:$2|1 ƿord|$2 ƿord}})',
-'search-redirect' => '(edlǣd $1)',
+'searchmenu-new' => "'''Scieppan þone tramet \"[[:\$1]]\" on þissum wiki!'''",
+'searchhelp-url' => 'Help:Innung',
+'searchprofile-articles' => 'Innunge trametas',
+'searchprofile-project' => 'Helpes and Weorca trametas',
+'searchprofile-images' => 'Missenendebyrdness',
+'searchprofile-everything' => 'Gehwæt',
+'searchprofile-articles-tooltip' => 'Sēcan in $1',
+'searchprofile-project-tooltip' => 'Sēcan in $1',
+'searchprofile-images-tooltip' => 'Sēcan ymelan',
+'search-result-size' => '$1 ({{PLURAL:$2|1 word|$2 worda}})',
+'search-redirect' => '(edlǣded fram "$1")',
 'search-section' => '(dǣl $1)',
 'search-suggest' => 'Mǣnst þū: $1',
-'search-interwiki-caption' => 'Sƿeostorƿeorc',
+'search-interwiki-caption' => 'Sweostorweorc',
 'search-interwiki-default' => '$1 becymas:',
 'search-interwiki-more' => '(mā)',
-'searchrelated' => 'ȝesibbed',
+'searchrelated' => 'gesibb',
 'searchall' => 'eall',
 'showingresults' => 'Īewan under oþ <b>$1</b> tōhīgunga onginnenda mid #<b>$2</b>.',
 'showingresultsnum' => 'Under sind <b>$3</b> tóhígunga onginnende mid #<b>$2</b>.',
-'powersearch' => 'Sēċan',
-'powersearch-legend' => 'Forþliċ sōcn',
-'powersearch-ns' => 'In namanstedum sēċan:',
-'powersearch-redir' => 'Edlǣdas scēaƿian',
-'powersearch-field' => 'Sēċan',
-'search-external' => 'Ūtan sōcn',
-
-# Quickbar
-'qbsettings-none' => 'Nān',
+'powersearch' => 'Sēcan forþ',
+'powersearch-legend' => 'Manigfeald sēcung',
+'powersearch-ns' => 'Sēcan in namstedum:',
+'powersearch-redir' => 'Settan edlǣdunge on getæle',
+'powersearch-field' => 'Sēcan',
+'search-external' => 'Ūtanweard sōcn',
 
 # Preferences page
-'preferences' => 'Foreberunga',
-'mypreferences' => 'Mīna foreberunga',
-'prefsnologin' => 'Ne inȝemelded',
+'preferences' => 'Fōreberunga',
+'mypreferences' => 'Mīna fōreberunga',
+'prefsnologin' => 'Nā inmeldod',
 'prefs-skin' => 'Scynn',
-'skin-preview' => 'Forescēaƿian',
+'skin-preview' => 'Fōrebysen',
 'prefs-datetime' => 'Tælmearc and tīd',
-'prefs-rc' => 'Nīƿe hƿearfas',
-'prefs-watchlist' => 'Ƿæccȝetalu',
-'saveprefs' => 'Sparian',
-'rows' => 'Rǣƿa',
+'prefs-rc' => 'Nīwa andwendunga',
+'prefs-watchlist' => 'Wæccgetæl',
+'saveprefs' => 'Hordian',
+'rows' => 'Rǣwa:',
 'columns' => 'Sȳla:',
-'searchresultshead' => 'Sōcnfintan',
-'resultsperpage' => 'Tōhīgunga tō īewenne for tramete',
-'recentchangescount' => 'Hū mæniȝ ādihtas to scēaƿenne ȝeþēaƿe:',
-'savedprefs' => 'Þīna foreberunga ƿurdon ȝespared.',
-'timezonelegend' => 'Tīdstell',
-'servertime' => 'Bryttantīma is nū',
-'defaultns' => 'Sēcan in þissum namstedum be frambyge:',
+'searchresultshead' => 'Sōcn',
+'resultsperpage' => 'Tōhrīgunga tō īewenne for ǣlcum tramete:',
+'recentchangescount' => 'Hū mæniga adihtunga to īwenne gewunelīce:',
+'savedprefs' => 'Þīna fōreberunga wurdon gehordod.',
+'timezonelegend' => 'Tīdgeard',
+'servertime' => 'Þegntōles tīd is nū:',
+'defaultns' => 'Elles sēcan on þissum namstedum:',
 'default' => 'gewunelic',
-'youremail' => 'E-ǣrende *',
-'username' => 'Brūcendnama:',
+'youremail' => 'Spearcǣrenda nama:',
+'username' => '{{GENDER:$1|Brūcendnama}}:',
 'yourrealname' => 'Þīn rihtnama*',
 'yourlanguage' => 'Brūcendofermearces sprǣc',
-'yourvariant' => 'Sprǣce wendung',
+'yourvariant' => 'Sprǣce wendung:',
 'yourgender' => 'Ȝecynd:',
 'gender-male' => 'Ƿer',
 'gender-female' => 'Frēo',
@@ -625,8 +628,8 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'group-all' => '(eall)',
 
 'group-user-member' => '{{GENDER:$1|brūcend}}',
-'group-bot-member' => 'searuþræl',
-'group-sysop-member' => 'beƿitend',
+'group-bot-member' => '{{GENDER:$1|searuþrǣl}}',
+'group-sysop-member' => '{{GENDER:$1|bewitend}}',
 'group-suppress-member' => 'oferȝesiht',
 
 'grouppage-sysop' => '{{ns:project}}:Beƿitendas',
@@ -638,315 +641,311 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'rightslog' => 'Brūcenda riht cranic',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'þās sīdan ādihtan',
+'action-edit' => 'adihtan þisne tramet',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|hƿearf|hƿeafas}}',
-'recentchanges' => 'Nīƿe hƿearfas',
-'recentchanges-legend' => 'Nīƿa hƿearfa forebearƿan',
-'recentchanges-feed-description' => 'Þā mǣst nīƿoste hƿearfan huntan to þisse ƿiki in þissum strēame',
-'recentchanges-label-newpage' => 'Þes ādiht macode nīƿa sīdan',
-'recentchanges-label-minor' => 'Þes is lȳtl ādiht',
-'recentchanges-label-bot' => 'Searuþræl fremmode þisne ādiht',
+'nchanges' => '$1 {{PLURAL:$1|andwendung|andwendunga}}',
+'recentchanges' => 'Nīwa andwendunga',
+'recentchanges-legend' => 'Nīwra andwendunga cyras',
+'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-bot' => 'Searuþrǣl fremede þās adihtunge',
 'rcnote' => "Under {{PLURAL:$1|... '''1''' ...|sind þā æftemestan '''$1''' hweorfunga}} in {{PLURAL:$2|...|þǣm æftemestum '''$2''' dagum}}, . . $5, $4.",
-'rcnotefrom' => 'Under sind þā hweorfunga siþþan <b>$2</b> (oþ <b>$1</b> geīewed).',
-'rclistfrom' => 'Nīƿe hƿeorfan sēon beȝinnende fram $1',
-'rcshowhideminor' => '$1 lȳtl ādihtas',
-'rcshowhidebots' => '$1 searuþralas',
+'rcnotefrom' => "Niðer sind þā andwendunga æfter '''$2''' (mǣst īweþ '''$1''').",
+'rclistfrom' => 'Īwan nīwa andwendunga fram $1 and siþþan',
+'rcshowhideminor' => '$1 lytela adihtunga',
+'rcshowhidebots' => '$1 searuþrǣlas',
 'rcshowhideliu' => '$1 inmeldede brūcendas',
-'rcshowhideanons' => '$1 uncūþ brūcendas',
-'rcshowhidemine' => '$1 mīne ādihtas',
-'rclinks' => 'Læste $1 hƿearfas sēon in læstum $2 dagum<br />$3',
-'diff' => 'scēa',
-'hist' => 'Stǣr',
+'rcshowhideanons' => '$1 uncūðe brūcendas',
+'rcshowhidemine' => '$1 mīna adihtunga',
+'rclinks' => 'Īwan þā nīwostan $1 andwendunga in þissum nīehstum $2 daga<br />$3',
+'diff' => 'scēad',
+'hist' => 'stǣr',
 'hide' => 'hȳdan',
-'show' => 'Scēaƿan',
-'minoreditletter' => 'm',
+'show' => 'Īwan',
+'minoreditletter' => 'ly',
 'newpageletter' => 'N',
-'boteditletter' => 'b',
-'rc_categories_any' => 'Ǣniȝ',
+'boteditletter' => 'þr',
+'rc_categories_any' => 'Ǣnig',
 'rc-enhanced-expand' => 'Ȝehanda sēon (þearf JavaScript)',
 'rc-enhanced-hide' => 'Ȝehanda hȳdan',
 
 # Recent changes linked
-'recentchangeslinked' => 'Sibbhƿearfas',
-'recentchangeslinked-feed' => 'Sibbhƿearfas',
-'recentchangeslinked-toolbox' => 'Sibbhƿearfas',
-'recentchangeslinked-title' => 'Hƿearfas ȝesibbed to "$1"',
-'recentchangeslinked-page' => 'Sīdenama:',
-'recentchangeslinked-to' => 'Hƿearfas to sīdan sēon þe hlenċan habbaþ to þǣre ȝiefen sīdan in stede',
+'recentchangeslinked' => 'Sibba andwendunga',
+'recentchangeslinked-feed' => 'Sibba andwendunga',
+'recentchangeslinked-toolbox' => 'Sibba andwendunga',
+'recentchangeslinked-title' => 'Andwendunga þā sind gesibba "$1"',
+'recentchangeslinked-page' => 'Trametes nama:',
+'recentchangeslinked-to' => 'Īwan andwendunga trameta þā habbaþ hlencan tō þissum tramete',
 
 # Upload
-'upload' => 'Fīl forþsendan',
-'uploadbtn' => 'Fīl forþsendan',
-'uploadnologin' => 'Ne inmeldod',
-'uploaderror' => 'Ƿōh on forþsendende',
-'upload-permitted' => 'Þafed fīlcynn: $1.',
-'upload-preferred' => 'Foreboren fīlcynn: $1.',
-'upload-prohibited' => 'Forboden fīlcynn: $1.',
-'uploadlogpage' => 'Forþsend ealdhord',
-'filename' => 'Fīlnama',
-'filedesc' => 'Scortnes',
+'upload' => 'Hladan ymelan forþ',
+'uploadbtn' => 'Hladan ymelan forþ',
+'uploadnologin' => 'Nā inmeldod',
+'uploaderror' => 'Wōh on forþhladunge',
+'upload-permitted' => 'Geþafod ymelena cynn: $1.',
+'upload-preferred' => 'Fōreboren ymelena cynn: $1.',
+'upload-prohibited' => 'Forboden ymelena cynn: $1.',
+'uploadlogpage' => 'Hladan ealdhord forþ',
+'filename' => 'Ymelan nama',
+'filedesc' => 'Scortness',
 'filesource' => 'Fruma:',
-'badfilename' => 'Onlīcnesnama wearþ gewend tō "$1(e/an)".',
-'savefile' => 'Þrǣd sparian',
-'uploadedimage' => 'forþsendode "[[$1]]"',
-'sourcefilename' => 'Fruman þrǣdnama:',
+'badfilename' => 'Ymelan nama wearþ gewend tō "$1".',
+'savefile' => 'Hordian ymelan',
+'uploadedimage' => 'forþhlōd "[[$1]]"',
+'sourcefilename' => 'Fruman ymelan nama:',
 
-'license' => 'Ȝelēaf:',
-'license-header' => 'Ȝelēaf:',
-'nolicense' => 'Nǣnne gecorenne',
-'license-nopreview' => '(Forescēaƿe nis ȝearu)',
+'license' => 'Lēaf:',
+'license-header' => 'Lēaf:',
+'nolicense' => 'Nān is gecoren',
+'license-nopreview' => '(Fōrebysen nis gearu)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Þēos syndriȝa sīde ēoƿaþ ealle forþsendede fīlas.
-Æfter ȝeƿuneliċum ƿīsum, þā nīƿostan fīlas sind ēoƿod be hēafde þæs ȝetæles.
-Cnæpp on sƿeorhēafde hƿeorfþ þā endebyrdnessa.',
-'listfiles_search_for' => 'Sēcan biliþnaman:',
-'imgfile' => 'fīl',
-'listfiles' => 'Biliþgetalu',
+'listfiles-summary' => 'Þes syndriga tramet īweþ ealla forþ gehladena ymelan.
+Gif se brūcend asifte hine. synderlīce sind ymelan geīwda þǣre þe se brūcend forþ hlōd þā nīwostan fadunge.',
+'listfiles_search_for' => 'Sēcan missenendebyrdnesse naman:',
+'imgfile' => 'ymele',
+'listfiles' => 'Ymelena getæl',
 'listfiles_date' => 'Tælmearc',
 'listfiles_name' => 'Nama',
 'listfiles_user' => 'Brūcend',
-'listfiles_size' => 'Miċelnes',
-'listfiles_description' => 'Tōƿritennes',
+'listfiles_size' => 'Micelness',
+'listfiles_description' => 'Tōwritenness',
 'listfiles_count' => 'Fadunga',
 
 # File description page
-'file-anchor-link' => 'Fīl',
-'filehist' => 'Fīlanstǣr',
+'file-anchor-link' => 'Ymele',
+'filehist' => 'Ymelan stǣr',
 'filehist-help' => 'Cnæpp on dæȝe/tīde to sēonne þā fīlan sƿā ƿæs hēo on þǣre tīde.',
-'filehist-deleteall' => 'eall āfeorsian',
-'filehist-deleteone' => 'āfeorsian',
+'filehist-deleteall' => 'forlēosan eall',
+'filehist-deleteone' => 'forlēosan',
 'filehist-revert' => 'undōn',
 'filehist-current' => 'nū',
-'filehist-datetime' => 'Dæȝ/Tīd',
-'filehist-thumb' => 'Lȳtlbiliþ',
-'filehist-thumbtext' => 'Lȳtlbiliþ for fadunge sƿā $1',
-'filehist-nothumb' => 'Nān biliþinċel',
+'filehist-datetime' => 'Dæg/Tīd',
+'filehist-thumb' => 'Lytelbiliþ',
+'filehist-thumbtext' => 'Lytelbiliþ for fadunge fram $1 and siþþan',
+'filehist-nothumb' => 'Nān lytelbiliþ',
 'filehist-user' => 'Brūcend',
 'filehist-dimensions' => 'Miċela',
 'filehist-filesize' => 'Fīlmiċelnes',
 'filehist-comment' => 'Ymbsprǣċ',
 'filehist-missing' => 'Fīl lēas',
-'imagelinks' => 'Fīlhlenċan',
-'linkstoimage' => 'Þā folgendan {{PLURAL:$1|sīde hæfþ hlenċe|sīdan habbaþ hlenċan}} for þissum fīle:',
-'nolinkstoimage' => 'Þǣr sind nāne trametas þe bindaþ tō þissum biliðe.',
-'morelinkstoimage' => '[[Special:WhatLinksHere/$1|Mā hlenċan]] sēon tō þissum fīle.',
-'duplicatesoffile' => '{{PLURAL:$1|Sēo folgende fīl is ȝelīċnes|Þā folgende fīlan sind ȝelīċnessa}} þisses fīles (sēo [[Special:FileDuplicateSearch/$2|mā ȝeƿitnesse hērymb]]):',
-'sharedupload' => 'Þēos fīl is fram $1 and man mæȝ hīe brūcan on ōðrum ƿeorcum.',
-'uploadnewversion-linktext' => 'Nīƿe fadunge þisse fīlan forþsendan',
+'imagelinks' => 'Hlencan tō ymelan',
+'linkstoimage' => '{{PLURAL:$1|Se folgienda tramet hæfþ|Þā folgiendan trametas habbaþ}} hlencan tō þisre ymelan:',
+'nolinkstoimage' => 'Þǣr ne sind nǣnge trametas þe habbaþ hlencan tō þisre ymelan.',
+'morelinkstoimage' => 'Sēon [[Special:WhatLinksHere/$1|mā hlencan]] tō þisre ymelan.',
+'duplicatesoffile' => '{{PLURAL:$1|Sēol folgiende ymele is gelīcnes|Þā folgiendan ymelan sind gelīcnessa}} þisse ymelan (seoh [[Special:FileDuplicateSearch/$2|mā cȳþþe ymbe þis]]):',
+'sharedupload' => 'Þēos ymele is fram $1 and man mæg hīe brūcan on ōðrum weorcum.',
+'uploadnewversion-linktext' => 'Hladan nīwe fadunge þisse ymelan forþ',
 
 # File reversion
-'filerevert-legend' => 'Fīlan eftdōn',
+'filerevert-legend' => 'Settan ymelan on bæc',
 
 # File deletion
-'filedelete-submit' => 'āfeorsian',
+'filedelete-submit' => 'Forlēosan',
 
 # Unused templates
-'unusedtemplateswlh' => 'ōðre hlenċan',
+'unusedtemplateswlh' => 'ōðre hlencan',
 
 # Random page
-'randompage' => 'Hlīetliċu sīde',
+'randompage' => 'Gelimplic tramet',
 
 # Statistics
 'statistics' => 'Cȳþþu',
-'statistics-articles' => 'Innungsīdan',
-'statistics-pages' => 'Sīdan',
-'statistics-users-active' => 'Hƿate brūcendas',
-'statistics-mostpopular' => 'Mǣst saƿen sīdan',
+'statistics-articles' => 'Innunge trametas',
+'statistics-pages' => 'Trametas',
+'statistics-users-active' => 'Hwate brūcendas',
+'statistics-mostpopular' => 'Gesawenoste trametas',
 
-'doubleredirects' => 'Tƿifealde ymblǣderas',
+'doubleredirects' => 'Twifealda edlǣdunga',
 
-'brokenredirects' => 'Brocene ymblǣderas',
-'brokenredirectstext' => 'Þā folgendan edlǣdunga bendaþ tō unedwistlicum trametum.',
-'brokenredirects-edit' => 'ādihtan',
-'brokenredirects-delete' => 'āfeorsian',
+'brokenredirects' => 'Gebrocena edlǣdunga',
+'brokenredirectstext' => 'Þā folgiendan edlǣdunga gāþ tō æfweardum trametum.',
+'brokenredirects-edit' => 'adihtan',
+'brokenredirects-delete' => 'forlēosan',
 
-'withoutinterwiki' => 'Trametas būtan sprǣcbendum',
-'withoutinterwiki-summary' => 'Þā folgendan trametas ne bindaþ tō ōðrum sprǣcfadungum:',
+'withoutinterwiki' => 'Trametas būtan sprǣchlencum',
+'withoutinterwiki-summary' => 'Þā folgiendan trametas nabbaþ hlencan tō ōðrum sprǣcfadungum.',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
-'ncategories' => '$1 {{PLURAL:$1|flocca|floccas}}',
-'nlinks' => '$1 bendas',
-'nmembers' => '$1 {{PLURAL:$1|ȝesīþ|ȝesīðas}}',
-'specialpage-empty' => 'Þēos sīde is ǣmtiȝ.',
+'nbytes' => '$1 {{PLURAL:$1|bita|bitena}}',
+'ncategories' => '$1 {{PLURAL:$1|flocca|flocca}}',
+'nlinks' => '$1 {{PLURAL:$1|hlenca|hlencena}}',
+'nmembers' => '$1 {{PLURAL:$1|gesīþ|gesīða}}',
+'specialpage-empty' => 'Nis þǣr nāht þe āh cȳðan þes tramet.',
 'lonelypages' => 'Ealdorlēase trametas',
-'unusedimages' => 'Unbrocene fīlan',
-'popularpages' => 'Dēore trametas',
+'unusedimages' => 'Īdela ymelan',
+'popularpages' => 'Folclīce trametas',
 'wantedcategories' => 'Gewilnode floccas',
 'wantedpages' => 'Gewilnode trametas',
-'mostlinked' => 'Gebundenostan trametas',
-'mostlinkedcategories' => 'Gebundenostan floccas',
-'mostlinkedtemplates' => 'Gebundenostan bysena',
-'prefixindex' => 'Ealla sīdan mid foredǣle',
+'mostlinked' => 'Trametas mid þǣm mǣstan rīme hlencena',
+'mostlinkedcategories' => 'Floccas mid þǣm mǣstan rīme hlencena',
+'mostlinkedtemplates' => 'Bysena mid þǣm mǣstan rīme hlencena',
+'prefixindex' => 'Ealle trametas mid fōredǣle',
 'shortpages' => 'Scorte trametas',
 'longpages' => 'Lange trametas',
-'listusers' => 'Brūcenda ȝetalu',
-'newpages' => 'Nīƿa sīdan',
-'newpages-username' => 'Brūcendnama:',
-'ancientpages' => 'Ieldestan Trametas',
-'move' => 'n',
-'movethispage' => 'Þās sīdan ȝeferan',
-'pager-newer-n' => '{{PLURAL:$1|nīƿra 1|nīƿra $1}}',
-'pager-older-n' => '{{PLURAL:$1|ieldra 1|ieldra $1}}',
+'listusers' => 'Brūcenda getæl',
+'newpages' => 'Nīwe trametas',
+'newpages-username' => 'Brūcendes nama:',
+'ancientpages' => 'Ieldestan trametas',
+'move' => 'Wegan',
+'movethispage' => 'Wegan þisne tramet',
+'pager-newer-n' => '{{PLURAL:$1|nīwran 1|nīwran $1}}',
+'pager-older-n' => '{{PLURAL:$1|ieldran 1|ieldran $1}}',
 
 # Book sources
 'booksources' => 'Bōcfruman',
 'booksources-search-legend' => 'Sēcan bōcfruman',
 'booksources-go' => 'Gān',
-'booksources-text' => 'Under is getalu benda tō ōðrum webstedum þe bebycgaþ nīwa and gebrocena bēc, and hæbben
-ēac mā āscunga ymbe bēc þe þu sēcst:',
+'booksources-text' => 'Niðer is getæl hlencena tō ōðrum webstedum þe cīpaþ nīwa and gebrocena bēc, and wēninga hæbben ēac mā cȳþþu ymbe bēc þe þu sēcst:',
 
 # Special:Log
-'specialloguserlabel' => 'Brūcend:',
-'speciallogtitlelabel' => 'Nama:',
+'specialloguserlabel' => 'Gelǣstende brūcend:',
+'speciallogtitlelabel' => 'Ende (trametes titul oþþe brūcendes nama):',
 'log' => 'Ealdhord',
 
 # Special:AllPages
-'allpages' => 'Ealla sīdan',
-'alphaindexline' => '$1  $2',
-'nextpage' => 'Nīehsta sīde ($1)',
-'prevpage' => 'Ǣror sīde ($1)',
-'allpagesfrom' => 'Sīdan scēaƿian beȝinnende æt:',
-'allpagesto' => 'Sīdan scēaƿian endende æt:',
-'allarticles' => 'Ealla sīdan',
-'allinnamespace' => 'Ealle trametas ($1 namanstede)',
-'allpagesprev' => 'Fore',
+'allpages' => 'Ealle trametas',
+'alphaindexline' => '$1  $2',
+'nextpage' => 'Nīehst tramet ($1)',
+'prevpage' => 'Ǣrra tramet ($1)',
+'allpagesfrom' => 'Īwan trametas fram:',
+'allpagesto' => 'Īwan trametas oþ:',
+'allarticles' => 'Ealle trametas',
+'allinnamespace' => 'Ealle trametas (namstede: $1)',
+'allpagesprev' => 'Ǣr',
 'allpagesnext' => 'Nīehst',
 'allpagessubmit' => 'Gān',
 
 # Special:Categories
 'categories' => 'Floccas',
-'categoriespagetext' => 'Þā folgendan floccas standaþ in þǣm wici.
-[[Special:UnusedCategories|Unused categories]] are not shown here.
-Also see [[Special:WantedCategories|wanted categories]].',
+'categoriespagetext' => '{{PLURAL:$1|Se folgienda flocc befēhþ|Þā folgiendan floccas befōþ}} trametas oþþe missenendebyrdmessa. [[Special:UnusedCategories|Nā gebrocene floccas]] ne sind geīwde hēr. Ēac seoh [[Special:WantedCategories|gewilnode floccas]].',
 
 # Special:DeletedContributions
 'sp-deletedcontributions-contribs' => 'forðunga',
 
 # Special:LinkSearch
-'linksearch' => 'Ūtanƿeard hlenċan',
+'linksearch' => 'Sēcung ūtanweardra hlencena',
 'linksearch-ok' => 'Sēċan',
 
 # Special:ListUsers
-'listusers-noresult' => 'Nǣnne brūcend gefundenne.',
+'listusers-noresult' => 'Nān brūcend wæs gefunden.',
 
 # Special:ActiveUsers
 'activeusers' => 'Hƿata brūcenda ȝetalu',
 
 # Special:ListGroupRights
-'listgrouprights-group' => 'Clīeƿen',
+'listgrouprights-group' => 'Hēap',
 'listgrouprights-rights' => 'Riht',
-'listgrouprights-helppage' => 'Help:Clīeƿenes riht',
-'listgrouprights-members' => '(ȝesīða ȝetalu)',
-'listgrouprights-removegroup' => '{{PLURAL:$2|Clīeƿen|Clīeƿenas}} forniman: $1',
-'listgrouprights-addgroup-all' => 'Eall clīeƿenas ēacian',
-'listgrouprights-removegroup-all' => 'Ealle clīeƿenas forniman',
-
-# E-mail user
-'emailuser' => 'To þissum brūcende ƿrītan',
-'emailfrom' => 'Fram',
+'listgrouprights-helppage' => 'Help:Hēapes riht',
+'listgrouprights-members' => '(getæl gesīða)',
+'listgrouprights-removegroup' => 'Animan {{PLURAL:$2|þisne hēap|þās hēapas}}: $1',
+'listgrouprights-addgroup-all' => 'Ēacnian mid eallum hēapum',
+'listgrouprights-removegroup-all' => 'Animan ealle hēapas',
+
+# Email user
+'emailuser' => 'Wrītan spearcǣrend þissum brūcende',
+'emailfrom' => 'Fram:',
 'emailto' => 'Tō:',
-'emailsubject' => 'Forþsetennes',
-'emailmessage' => 'Ǣrendȝeƿrit',
-'emailsend' => 'Ǣrendian',
-'emailsent' => 'Ǣrendȝeƿrit sended',
-'emailsenttext' => 'Þīn e-mail ǣrendȝeƿrit ƿearþ ȝesend.',
+'emailsubject' => 'Forþsetedness:',
+'emailmessage' => 'Ǣrendgewrit:',
+'emailsend' => 'Sendan',
+'emailsent' => 'Ǣrendgewrit wæs gesend',
+'emailsenttext' => 'Þīn ǣrendgewrit wæs gesend on spearcǣrende.',
 
 # Watchlist
-'watchlist' => 'Mīnu ƿæcceȝetalu',
-'mywatchlist' => 'Mīnu ƿæcceȝetalu',
-'removedwatchtext' => 'Sēo sīde "[[:$1]]" ƿæs fram [[Special:Watchlist|þīnre ƿæccȝetale]] fornōm.',
-'watch' => 'Ƿæccan',
-'watchthispage' => 'Þās sīdan ƿæccan',
-'unwatch' => 'Unƿæccan',
-'unwatchthispage' => 'Ƿæccende healtian',
-'watchlist-details' => '{{PLURAL:$1|$1 sīde|$1 sīdan}} on þīnre ƿæccȝetale, ne beinnende ȝespreċsīdan.',
-'watchlistcontains' => 'Þīn behealdnestalu hæfþ $1 {{PLURAL:$1|trameta|trametas}} inn.',
-'wlnote' => 'Under sind þā æftemestan $1 hweorfunga in þǣm æftemestum <b>$2</b> stundum.',
-'wlshowlast' => 'Īewan æftemestan $1 stunda $2 daga $3',
-'watchlist-options' => 'Ƿæccȝetale forebearƿan',
+'watchlist' => 'Mīn behealdunggetæl',
+'mywatchlist' => 'Mīn behealdunggetæl',
+'removedwatchtext' => 'Se tramet "[[:$1]]" wæs fram [[Special:Watchlist|þīnum behealdunggetæle]] anumen.',
+'watch' => 'Behealdan',
+'watchthispage' => 'Behealdan þisne tramet',
+'unwatch' => 'Ablinnan behealdunge',
+'unwatchthispage' => 'Ablinnan behealdunge',
+'watchlist-details' => '{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā arīmedum mōtungum.',
+'watchlistcontains' => 'Þīn behealdungtæl hæfþ $1 {{PLURAL:$1|tramet|trameta}}.',
+'wlnote' => "Niðer {{PLURAL:$1|is sēo nīwoste andwendung|sind þā nīwostan '''$1''' andwendunga}} in {{PLURAL:$2|þǣre latostan tīde|þǣm latostan '''$2''' tīda}}, fram: $3, $4.",
+'wlshowlast' => 'Īwan þā latostan $1 tīda $2 daga $3',
+'watchlist-options' => 'Behealdungtæles cyras',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Ƿæccende...',
-'unwatching' => 'Unƿæccende...',
+'watching' => 'Behealdende...',
+'unwatching' => 'Ablinnende behealdunge...',
 
 'enotif_impersonal_salutation' => '{{SITENAME}} brūcend',
-'enotif_lastvisited' => 'Sēo $1 for eall hƿearfas siþþan þīn læst cyme.',
-'enotif_lastdiff' => 'Sēo $1 to sēonne þisne hƿearf.',
+'enotif_lastvisited' => 'Sēon $1 for eallum andwendungum fram þīnum latostan cyme.',
+'enotif_lastdiff' => 'Sēon $1 to sēonne þās andwendunge.',
 'enotif_anon_editor' => 'uncūþ brūcend $1',
 'created' => 'ȝescapen',
 'changed' => 'hƿorfen',
 
 # Delete
-'deletepage' => 'Sīdan āfeorsian',
-'excontent' => "innung ƿæs: '$1'",
-'excontentauthor' => "innung ƿæs: '$1' (and se āna forðiend ƿæs '[[Special:Contributions/$2|$2]]')",
-'exblank' => 'tramet wæs ǣmtig',
-'historywarning' => 'Warnung: Se tramet, þone þu āfeorsian teohhast, hæfþ stǣre:',
-'actioncomplete' => 'Ƿeorcdǣd fuldōn',
-'dellogpage' => 'Āfeorsunge ƿīsbōc',
-'deletionlog' => 'āfeorsunge wisbōc',
+'deletepage' => 'Forlēosan tramet',
+'excontent' => 'innung wæs: "$1"',
+'excontentauthor' => 'innung wæs: \'$1\' (and se āna forðiend wæs "[[Special:Contributions/$2|$2]")',
+'exblank' => 'tramet wæs æmettig',
+'historywarning' => "'''Warnung''': Se tramet þe þū wilt forlēosan hafaþ stǣr mid nēan $1 {{PLURAL:$1|fadunge|fadunga}}:",
+'actioncomplete' => 'Dǣd  is fulfyled',
+'dellogpage' => 'Forlēosunge ealdhord',
+'deletionlog' => 'forlēosunge ealdhord',
 'deletecomment' => 'Racu:',
-'deleteotherreason' => 'Ōðra/ēaca racu:',
+'deleteotherreason' => 'Ōðra/nīehst racu:',
 'deletereasonotherlist' => 'Ōðru racu',
 
 # Rollback
-'rollback_short' => 'Edhƿeorfan',
-'rollbacklink' => 'Edhƿeorfan',
-'rollbackfailed' => 'Edhƿeorf misfangen',
-'editcomment' => "Sēo ādihtungymbsprǣc wæs: \"''\$1''\".",
-'revertpage' => 'Ācierde ādihtunga fram [[Special:Contributions/$2|$2]] ([[User talk:$2|Gesprec]]); wendede on bæc tō ǣrran fadunge fram [[User:$1|$1]]',
+'rollback_short' => 'Settan on bæc',
+'rollbacklink' => 'settan on bæc',
+'rollbackfailed' => 'Bæcsettung tōsǣlde',
+'editcomment' => "Þǣre adihtunge se cwide wæs: \"''\$1''\".",
+'revertpage' => 'Onhwearf adihtunga fram [[Special:Contributions/$2|$2]] ([[User talk:$2|mōtung]]); wendede on bæc tō ǣrran fadunge fram [[User:$1|$1]]',
 
 # Protect
-'protectlogpage' => 'Beorges ƿīsbōc',
-'protectedarticle' => 'borgen "[[$1]]"',
-'unprotectedarticle' => 'unborgen "[[$1]]"',
-'protect-title' => 'Beorges emnet hƿeorfan for "$1"',
-'prot_1movedto2' => '[[$1]] ȝefered tō [[$2]]',
+'protectlogpage' => 'Beorges ealdhord',
+'protectedarticle' => 'bearg "[[$1]]"',
+'unprotectedarticle' => 'anōm beorgunge fram "[[$1]]"',
+'protect-title' => 'Andwendan beorges emnet for "$1"',
+'prot_1movedto2' => 'Wæg [[$1]] tō [[$2]]',
 'protectcomment' => 'Racu:',
 'protectexpiry' => 'Endaþ:',
-'protect_expiry_invalid' => 'Endende tīde is unriht.',
-'protect_expiry_old' => 'Endende tīde is in ȝēara dagum.',
+'protect_expiry_invalid' => 'Endes tīd is unriht.',
+'protect_expiry_old' => 'Endes tīd is in gēardagum.',
 'protect-text' => "Þū meaht þæt beorges emnet sēon and hƿeorfan hēr for þǣre sīdan '''$1'''.",
 'protect-default' => 'Eall brūcendas þafian',
-'protect-fallback' => '"$1" þafunge ābiddan',
-'protect-level-autoconfirmed' => 'Nīƿe and unbōcen brūcendas fortȳnan',
-'protect-level-sysop' => 'Efne for beƿitendum',
+'protect-fallback' => 'Synderlīce līefan brūcendum þā habbaþ "$1" lēafe',
+'protect-level-autoconfirmed' => 'Līefan synderlīce selflīce afæstnodum brūcendum',
+'protect-level-sysop' => 'Līefan synderlīce bewitendum',
 'protect-summary-cascade' => 'beflōƿende',
 'protect-expiring' => 'endaþ $1 (UTC)',
-'protect-cascade' => 'Sīdan beorgan beinnodon þisse sīdan (flōƿende ȝebeorg)',
+'protect-cascade' => 'Beorgan ealle trametas þā sind befangen on þissum tramete (forþ brǣdende beorg)',
 'protect-cantedit' => 'Þū ne meaht þæt beorges emnet hƿeorfan þisre sīdan, forþǣm ne hæfst þū þafunge to ādihtenne hīe.',
 'protect-expiry-options' => '1 stund:1 hour,1 dæg:1 day,1 wucu:1 week,2 wuca:2 weeks,1 mōnaþ:1 month,3 mōnþas:3 months,6 mōnþas:6 months,1 gēar:1 year,unendiendlic:infinite',
 'restriction-type' => 'Þafung:',
 'restriction-level' => 'Ȝehæftes emnet:',
 
 # Restrictions (nouns)
-'restriction-edit' => 'Ādihtan',
-'restriction-move' => 'n',
+'restriction-edit' => 'Adihtan',
+'restriction-move' => 'Wegan',
 'restriction-create' => 'Scieppan',
-'restriction-upload' => 'Forþsendan',
+'restriction-upload' => 'Hladan forþ',
 
 # Restriction levels
-'restriction-level-sysop' => 'fulborgen',
+'restriction-level-sysop' => 'fulborgen',
 'restriction-level-autoconfirmed' => 'sāmborgen',
-'restriction-level-all' => 'ǣniȝ emnet',
+'restriction-level-all' => 'ǣnig emnet',
 
 # Undelete
 'undeletebtn' => 'Edstaðola!',
-'undeletelink' => 'sēon/nīƿian',
+'undeletelink' => 'sēon/nīwian',
 'undeleteviewlink' => 'sēon',
-'undelete-search-submit' => 'Sēċan',
+'undelete-search-submit' => 'Sēcan',
 
 # Namespace form on various pages
-'namespace' => 'Namanstede:',
+'namespace' => 'Namstede:',
 'invert' => 'Cyre edƿendan',
 'blanknamespace' => '(Hēafod)',
 
 # Contributions
-'contributions' => 'Brūcendforðunga',
+'contributions' => '{{GENDER:$1|Brūcendes}} forðunga',
 'contributions-title' => 'Brūcendforðunga for $1',
 'mycontris' => 'Mīna forðunga',
 'contribsub2' => 'For $1 ($2)',
@@ -961,73 +960,72 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 # What links here
 'whatlinkshere' => 'Hƿæt hæfþ hlenċan hider',
-'whatlinkshere-title' => 'Sīdan þe hlenċan habbaþ to "$1"',
-'whatlinkshere-page' => 'Sīde:',
-'linkshere' => "Þā folgenda sīdan habbaþ hlenċan þe to þisse sīdan lǣdan: '''[[:$1]]'''",
-'nolinkshere' => 'Nāne trametas bindaþ hider.',
-'isredirect' => 'edlǣdungtramet',
-'istemplate' => 'bysentraht',
-'isimage' => 'biliþhlenċ',
-'whatlinkshere-links' => '← hlenċan',
-'whatlinkshere-hideredirs' => '$1 edlǣdas',
-'whatlinkshere-hidetrans' => '$1 bysentraht',
-'whatlinkshere-hidelinks' => '$1 hlenċan',
-'whatlinkshere-filters' => 'Seohhunga',
+'whatlinkshere-title' => 'Trametas þā habbaþ hlencan tō "$1"',
+'whatlinkshere-page' => 'Tramet:',
+'linkshere' => "Þā folgiendan trametas habbaþ hlencan tō: '''[[:$1]]'''",
+'nolinkshere' => "Nǣnge trametas habbaþ hlencan tō '''[[:$1]]'''.",
+'isredirect' => 'edlǣdungtramet',
+'istemplate' => 'bysene nytt',
+'isimage' => 'ymelan hlenca',
+'whatlinkshere-links' => '← hlencan',
+'whatlinkshere-hideredirs' => '$1 edlǣdunga',
+'whatlinkshere-hidetrans' => '$1 bysene nytta',
+'whatlinkshere-hidelinks' => '$1 hlencan',
+'whatlinkshere-filters' => 'Sifan',
 
 # Block/unblock
-'blockip' => 'Brūcend fortȳnan',
+'blockip' => 'Fortȳnan brūcend',
 'ipbreason' => 'Racu:',
-'ipbreasonotherlist' => 'Ōðeru racu',
-'ipbreason-dropdown' => '*Gemǣna gǣlungraca
-** Insettung falses gefrǣges
-** Āfēorsung innunge of trametum
-** Spamming benda tō ūtanweardum webbstedum
-** Insettung gedofes/dwolunge intō trametum
-** Þrǣstiendlicu gebǣrnes/tirgung
-** Miswendung manigfealdra brūcendhorda
+'ipbreasonotherlist' => 'Ōðru racu',
+'ipbreason-dropdown' => '*Gemǣna fortȳnungraca
+** Insettung falsre cȳþþe
+** Animung innunge of trametum
+** Spammlice hlencab tō ūtweardum webbstedum
+** Insettung gedofes oþþe dwolunge in trametas
+** Hwōpende gebǣru oþþe tirgung
+** Miswendung manigra reccinga
 ** Uncwēme brūcendnama',
-'ipbsubmit' => 'Þisne brūcend gǣlan',
+'ipbsubmit' => 'Fortȳnan þisne brūcend',
 'ipbother' => 'Ōðeru tīd',
-'ipboptions' => '2 stunda:2 hours,1 dæȝ:1 day,3 dagas:3 days,1 ƿucu:1 week,2 ƿuca:2 weeks,1 mōnaþ:1 month,3 mōnþas:3 months,6 mōnþas:6 months,1 ȝēar:1 year,unendiend:infinite',
+'ipboptions' => '2 tīda:2 hours,1 dæg:1 day,3 dagas:3 days,1 wucu:1 week,2 wuca:2 weeks,1 mōnaþ:1 month,3 mōnðas:3 months,6 mōnðas:6 months,1 gēar:1 year,unendiende:infinite',
 'ipbotheroption' => 'ōðer',
-'ipbotherreason' => 'Ōðeru/geīecendlicu racu:',
-'ipblocklist-submit' => 'Sēċan',
+'ipbotherreason' => 'Ōðru oþþe nīehst racu:',
+'ipblocklist-submit' => 'Sēcan',
 'infiniteblock' => 'unendiende',
-'expiringblock' => 'forealdaþ $1 $2',
+'expiringblock' => 'forealdaþ on $1 on $2',
 'blocklink' => 'fortȳnan',
 'unblocklink' => 'unfortȳnan',
-'change-blocklink' => 'Fortȳne hƿeorfan',
+'change-blocklink' => 'Andwendan fortȳnunge',
 'contribslink' => 'forðunga',
-'unblocklogentry' => 'unfortȳnode $1',
-'block-log-flags-nocreate' => 'Hordcleofan scieppende forboden',
-'proxyblocksuccess' => 'Ȝedōn.',
+'unblocklogentry' => 'unfortȳnde $1',
+'block-log-flags-nocreate' => 'Forbēad tō scieppenne reccinge',
+'proxyblocksuccess' => 'Gedōn.',
 
 # Move page
-'movearticle' => 'Sīdan ȝeferan:',
-'newtitle' => 'To nīƿum name:',
-'move-watch' => 'Frumasīdan and endesīdan ƿæccan',
-'movepagebtn' => 'Sīdan ȝeferan',
-'pagemovedsub' => 'Ȝefōr spēdde',
-'movepage-moved' => '\'\'\'"$1" ƿæs to "$2"\'\'\' ȝefered',
-'articleexists' => 'Tramet on þǣm naman ǣr stendeþ, oþþe þone
-naman þu cēas nis andfenge.
-Bidde cēos ōðerne naman.',
-'movedto' => 'ȝefered to',
-'movetalk' => 'Ȝesibbed ȝespreċsīdan ȝeferan',
-'movelogpage' => 'Ȝeferan ealdhord',
+'movearticle' => 'Wegan tramet:',
+'newtitle' => 'Tō nīwum naman:',
+'move-watch' => 'Behealdan frumtramet and endetramet',
+'movepagebtn' => 'Wegan tramet',
+'pagemovedsub' => 'Wegung spēdde',
+'movepage-moved' => '\'\'\'"$1" wæs tō "$2"\'\'\' gewegen',
+'articleexists' => 'Tramet on þǣm naman ǣr is, oþþe se nama þe þū cure nis riht.
+Cēos ōðerne naman lā.',
+'movedto' => 'gewegen tō',
+'movetalk' => 'Wegan gesibbe mōtunge',
+'movelogpage' => 'Wegan ealdhord',
 'movereason' => 'Racu:',
-'revertmove' => 'Undōn',
+'revertmove' => 'settan on bæc',
 
 # Export
-'export' => 'Sīdan ūtsendan',
+'export' => 'Ūtsendan trametas',
 
 # Namespace 8 related
 'allmessagesname' => 'Nama',
-'allmessagesdefault' => 'Fūsliċ traht',
-'allmessagescurrent' => ' traht',
-'allmessages-filter-unmodified' => 'Unhƿorfen',
+'allmessagesdefault' => 'Gewunelic ǣrendgewrites traht',
+'allmessagescurrent' => 'Þisses tīman ǣrendgewrites traht',
+'allmessages-filter-unmodified' => 'Nā andwended',
 'allmessages-filter-all' => 'Eall',
-'allmessages-filter-modified' => 'Hƿorfen',
+'allmessages-filter-modified' => 'Andwended',
 'allmessages-language' => 'Sprǣċ:',
 'allmessages-filter-submit' => 'Gān',
 
@@ -1055,64 +1053,64 @@ Bidde cēos ōðerne naman.',
 'tooltip-pt-logout' => 'Ūtmeldian',
 'tooltip-ca-talk' => 'Ȝespreċ ymbe þǣre innoþsīdan',
 'tooltip-ca-edit' => 'Þū meaht þās sīdan ādihtan. Bidde brūc þone forescēaƿecnæpp fore spariende',
-'tooltip-ca-addsection' => 'Nīƿe dǣl beȝinnan',
-'tooltip-ca-viewsource' => 'Þēos sīde is borgen.
-Þū meaht hire fruman sēon.',
-'tooltip-ca-history' => 'Ǣror fadunga þisse sīdan',
-'tooltip-ca-protect' => 'Þās sīdan beorgan',
-'tooltip-ca-unprotect' => 'Þās sīdan unbeorgan',
-'tooltip-ca-delete' => 'Þās sīdan āfeorsian',
-'tooltip-ca-move' => 'Þās sīdan ȝeferan',
-'tooltip-ca-watch' => 'Þās sīdan ēacian to þīnre ƿæccȝetale',
-'tooltip-ca-unwatch' => 'Þās sīdan forniman ƿiþ þīne ƿæccȝetale',
+'tooltip-ca-addsection' => 'Beginnan nīwne dǣl',
+'tooltip-ca-viewsource' => 'Þes tramet is borgen.
+Þū canst his fruman sēon.',
+'tooltip-ca-history' => 'Ǣrram fadunga þisses trametes',
+'tooltip-ca-protect' => 'Beorgan þisne tramet',
+'tooltip-ca-unprotect' => 'Andwendan beorgune þisses trametes',
+'tooltip-ca-delete' => 'Forlēosan þisne tramet',
+'tooltip-ca-move' => 'Wegan þisne tramet',
+'tooltip-ca-watch' => 'Ēacnian þīn behealdungtæl mid þissum tramete',
+'tooltip-ca-unwatch' => 'Animan þisne tramet fram þīnum behealdungtæle',
 'tooltip-search' => 'Sēcan {{SITENAME}}',
-'tooltip-search-go' => 'To sīdan gān ȝif bēo þes rihtnama',
-'tooltip-search-fulltext' => 'Þā sīdan sēċan mid þissum trahte',
-'tooltip-p-logo' => 'Hēafodsīde',
-'tooltip-n-mainpage' => 'Þǣre hēafodsīdan gān',
-'tooltip-n-mainpage-description' => 'Þǣre hēafodsīdan gān',
-'tooltip-n-portal' => 'Ymbe þǣm ƿeorce, hƿæt meaht þū dōn, hƿǣr to findenne þing',
-'tooltip-n-currentevents' => 'Ieldran cȳþþe findan ymbe nīƿum ȝelimpum',
-'tooltip-n-recentchanges' => 'Sēo ȝetalu nīƿa hƿearfa in þǣre ƿiki',
-'tooltip-n-randompage' => 'Hlīeta sīdan hladan',
+'tooltip-search-go' => 'Gān tō tramete þe hæbbe þisne rihte syndigan naman, gif swilc tramet sīe',
+'tooltip-search-fulltext' => 'Sēcan þisne traht on þǣm trametum',
+'tooltip-p-logo' => 'Sēcan þone hēafodtramet',
+'tooltip-n-mainpage' => 'Sēcan þone hēafodtramet',
+'tooltip-n-mainpage-description' => 'Sēcan þone hēafodtramet',
+'tooltip-n-portal' => 'Ymbe þæt weorc, hwæt meaht þū dōn, hwǣr man finde þing',
+'tooltip-n-currentevents' => 'Findan ieldran cȳþþe ymbe nīwu gelimp',
+'tooltip-n-recentchanges' => 'Getæl nīwra andwendunga on þǣm wiki',
+'tooltip-n-randompage' => 'Hladan gelimplicne tramet',
 'tooltip-n-help' => 'Cunnunge stede',
-'tooltip-t-whatlinkshere' => 'Ȝetalu eallra ƿikisīdan þe mid hlenċum hider habbaþ',
-'tooltip-t-recentchangeslinked' => 'Nīƿe hƿearfas in sīdum mid hlenċum fram þisse sīdan',
-'tooltip-feed-rss' => 'RSS strēam for þisse sīdan',
-'tooltip-feed-atom' => 'Atom strēam for þisse sīdan',
-'tooltip-t-contributions' => 'Þā ȝetale sēon þāra forðunga þisses brūcendes',
-'tooltip-t-emailuser' => 'E-mail to þissum brūcende sendan',
-'tooltip-t-upload' => 'Fīlan forþsendan',
-'tooltip-t-specialpages' => 'Ȝetalu eallra syndriȝa sīdena',
-'tooltip-t-print' => 'Ȝemǣnendliċu fadung þisse sīdan',
-'tooltip-t-permalink' => 'Fæst hlenċe for þisse fadunge þǣre sīdan',
-'tooltip-ca-nstab-main' => 'Þā innoþsīdan sēon',
-'tooltip-ca-nstab-user' => 'Þā brūcendsīdan sēon',
-'tooltip-ca-nstab-special' => 'Þēos is syndriȝu sīde, þū ne meaht þā sīdan hireself ādihtan',
-'tooltip-ca-nstab-project' => 'Þā ƿeorces sīdan sēon',
-'tooltip-ca-nstab-image' => 'Þā fīlsīde sēon',
-'tooltip-ca-nstab-template' => 'Þæt bysen sēon',
-'tooltip-ca-nstab-category' => 'Þā floccsīdan sēon',
-'tooltip-minoredit' => 'Þis sƿā lȳtl ādiht mearcian',
-'tooltip-save' => 'Þīnne hƿearfas sparian',
-'tooltip-preview' => 'Forescēaƿe þīne hƿearfas, bidde brūc þis fore sparest þū!',
-'tooltip-diff' => 'Þā hƿearfas sēon þe dydest þū þǣm trahte',
+'tooltip-t-whatlinkshere' => 'Getæl eallra wiki trameta þā habbaþ hlencan hider',
+'tooltip-t-recentchangeslinked' => 'Nīwa andwendunga in trametum tō þǣm þes tramet hæbbe hlencan',
+'tooltip-feed-rss' => 'RSS strēam for þissum tramete',
+'tooltip-feed-atom' => 'Atom strēam for þissum tramete',
+'tooltip-t-contributions' => 'Getæl forðunga þisses brūcendes',
+'tooltip-t-emailuser' => 'Sendan spearcǣrend þissum brūcende',
+'tooltip-t-upload' => 'Hladan ymelan forþ',
+'tooltip-t-specialpages' => 'Getæl eallra syndrigra trameta',
+'tooltip-t-print' => 'Gemǣnendliċu fadung þisses trametes',
+'tooltip-t-permalink' => 'Fæst hlenca tō þisre fadunge þæs trametes',
+'tooltip-ca-nstab-main' => 'Sēon þone innunge tramet',
+'tooltip-ca-nstab-user' => 'Sēon þone brūcendes tramet',
+'tooltip-ca-nstab-special' => 'Þes is syndrig tramet; þū ne meaht þone tramet hine selfne adihtan',
+'tooltip-ca-nstab-project' => 'Sēon þone weorces tramet',
+'tooltip-ca-nstab-image' => 'Sēon þone ymelan tramet',
+'tooltip-ca-nstab-template' => 'Sēon þā bysene',
+'tooltip-ca-nstab-category' => 'Sēon þone flocces tramet',
+'tooltip-minoredit' => 'Mearcian þās tō lytelre adihtunge',
+'tooltip-save' => 'Hordian þīna andwendunga',
+'tooltip-preview' => 'Seoh fōrebysene þīna andwendunga. Brūc þīs lā ǣr þū hordie!',
+'tooltip-diff' => 'Īwan þā andwendunga þā þū dydest þone traht',
 'tooltip-compareselectedversions' => 'Þā tōdāl sēon betƿēonan þǣre tƿǣm coren fadungum þisse sīdan',
-'tooltip-watch' => 'Þās sīdan ēacian to þīnre ƿæccȝetale',
-'tooltip-undo' => '"Undōn" undēþ þisne ādiht and þæt ādihtcynd openaþ in forescēaƿemōde. Þis þafaþ race ēaciende in þǣre scortnesse.',
+'tooltip-watch' => 'Ēacnian þīn behealdungtæl mid þissum tramete',
+'tooltip-undo' => '"Undōn" undēþ þās adihtunge and openaþ þǣre adihtunge bysene tō fōrebysene. Man cann secgan race on þǣre sceortnesse.',
 
 # Attribution
-'anonymous' => 'Namcūþlēas(e) brūcend {{SITENAME}}n',
-'siteuser' => '{{SITENAME}}n brūcere $1',
+'anonymous' => '{{PLURAL:$1|uncūþ brūcend|uncūðra brūcenda}} of {{SITENAME}}',
+'siteuser' => '{{SITENAME}}n brūcend $1',
 'others' => 'ōðru',
-'anonusers' => '{{SITENAME}} {{PLURAL:$2|uncūþ brūcend|uncūðe brūcendas}} $1',
+'anonusers' => '{{SITENAME}} {{PLURAL:$2|uncūþ brūcend|uncūðra brūcenda}} $1',
 
 # Browsing diffs
-'previousdiff' => '← Ieldra ādiht',
-'nextdiff' => 'Nīƿra ādiht',
+'previousdiff' => '← Ieldre adihtung',
+'nextdiff' => 'Nīwre adihtung →',
 
 # Media information
-'imagemaxsize' => 'Settan biliðu on biliþgemearcungtrametum tō:',
+'imagemaxsize' => "Mǣst biliðes micelness:<br />''(for ymelena amearcunga trametum)''",
 'thumbsize' => 'Þumannæglmicelnes:',
 'file-info-size' => '$1 × $2 pixels, fīlmiċelu: $3, MIMEcynn: $4',
 'file-nohires' => 'Þǣr nis nǣniȝ mā miċelu.',
@@ -1120,7 +1118,7 @@ Bidde cēos ōðerne naman.',
 'show-big-image' => 'Fulmiċelu',
 
 # Special:NewFiles
-'imagelisttext' => 'Under is getalu $1 biliða gedæfted $2.',
+'imagelisttext' => "Niðer is getæl '''$1''' {{PLURAL:$1|ymelan|ymelena}}, endebyrded  on $2.",
 'noimages' => 'Nāht tō sēonne.',
 'ilsubmit' => 'Sēċan',
 'bydate' => 'be tælmearce',
@@ -1130,7 +1128,7 @@ Bidde cēos ōðerne naman.',
 'metadata-expand' => 'Oferȝehanda sēon',
 'metadata-collapse' => 'Oferȝehanda hȳdan',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ƿīdnes',
 'exif-imagelength' => 'Hīehþ',
 'exif-compression' => 'Ȝeþryccungmōd',
@@ -1139,7 +1137,7 @@ Bidde cēos ōðerne naman.',
 'exif-artist' => 'Fruma',
 'exif-usercomment' => 'Brūcendes trahtnunga',
 'exif-exposuretime' => 'Blicestīd',
-'exif-brightnessvalue' => 'Beorhtnes',
+'exif-brightnessvalue' => 'APEX beorhtness',
 'exif-lightsource' => 'Lēohtfruma',
 'exif-whitebalance' => 'Hƿītefnetta',
 'exif-sharpness' => 'Scearpnes',
@@ -1150,7 +1148,7 @@ Bidde cēos ōðerne naman.',
 'exif-gpsmeasuremode' => 'Mētungmōd',
 'exif-gpsimgdirection' => 'Rihtung þæs biliðes',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Unȝeþrycced',
 
 'exif-meteringmode-0' => 'Uncūþ',
@@ -1203,7 +1201,7 @@ Bidde cēos ōðerne naman.',
 'monthsall' => 'eall',
 'limitall' => 'eall',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail_body' => 'Hwilchwega, gewēne þu of IP stōwe $1, hæfþ in namanbēc gestt ǣnne hordcleofan
 "$2" mid þissum e-ǣrendes naman on {{SITENAME}}n.
 
@@ -1219,7 +1217,7 @@ $5
 Þēos āsēðungrūn forealdaþ æt $4.',
 
 # Scary transclusion
-'scarytranscludefailed' => '[Bisenfeccung getrucod for $1; sarig]',
+'scarytranscludefailed' => '[Bysene feccung trucode for $1]',
 'scarytranscludetoolong' => '[URL is tō lang]',
 
 # Multipage image navigation
@@ -1256,11 +1254,6 @@ $5
 'version-hook-name' => 'Angelnama',
 'version-version' => '(Fadung $1)',
 
-# Special:FilePath
-'filepath' => 'Fīlpæþ',
-'filepath-page' => 'Fīl:',
-'filepath-submit' => 'Gān',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Fīlnama:',
 'fileduplicatesearch-submit' => 'Sēċan',
index 8d82e18..a62f021 100644 (file)
@@ -316,6 +316,9 @@ Hindi (hi)फ़िलहाल इस पन्ने पर कोई सा
 
 'grouppage-sysop' => '{{ns:project}}:प्रचालक',
 
+# Special:Log/newusers
+'newuserlogpage' => 'नया सदस्यॊ के सूची',
+
 # User rights log
 'rightslog' => 'सदस्य अधिकार सूची',
 
@@ -406,13 +409,10 @@ Hindi (hi)फ़िलहाल इस पन्ने पर कोई सा
 # Special:LinkSearch
 'linksearch' => 'बाहरी कड़ी',
 
-# Special:Log/newusers
-'newuserlogpage' => 'नया सदस्यॊ के सूची',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(सदस्य सूची)',
 
-# E-mail user
+# Email user
 'emailuser' => 'इ सदस्य कॆ ई-मेल भेजॊ',
 
 # Watchlist
index 92ad4ae..14e12f3 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author ;Hiba;1
  * @author Abanima
+ * @author Achraf94
  * @author AhmadSherif
  * @author Aiman titi
  * @author Alexknight12
@@ -39,6 +40,7 @@
  * @author Mido
  * @author Mimouni
  * @author Mo7amedsalim
+ * @author Nemo bis
  * @author Obayd
  * @author OsamaK
  * @author Ouda
@@ -475,10 +477,10 @@ $messages = array(
 'tog-justify' => 'حاذ الفقرات',
 'tog-hideminor' => 'أخف التحريرات الطفيفة في أحدث التغييرات',
 'tog-hidepatrolled' => 'أخف التحريرات المراجعة في أحدث التغييرات',
-'tog-newpageshidepatrolled' => 'أخÙ\81 Ø§Ù\84صÙ\81حات Ø§Ù\84Ù\85راجعة من قائمة الصفحات الجديدة',
-'tog-extendwatchlist' => 'Ù\85دد Ù\82ائÙ\85Ø© Ø§Ù\84Ù\85راÙ\82بة Ù\84عرض Ù\83Ù\84 Ø§Ù\84تغÙ\8aÙ\8aراتØ\8c Ù\88Ù\84Ù\8aس Ø§Ù\84أحدث Ù\81Ù\82Ø·',
+'tog-newpageshidepatrolled' => 'أخÙ\81 Ø§Ù\84صÙ\81حات Ø§Ù\84Ù\85عاÙ\8aÙ\86ة من قائمة الصفحات الجديدة',
+'tog-extendwatchlist' => 'Ù\85دد Ù\82ائÙ\85Ø© Ø§Ù\84Ù\85راÙ\82بة Ù\84تعرض Ù\83Ù\84 Ø§Ù\84تغÙ\8aÙ\8aرات Ù\84ا Ø£Ø­Ø¯Ø«Ù\87ا Ù\88 Ø­Ø³Ø¨',
 'tog-usenewrc' => 'جمّع التغييرات حسب الصفحة في أحدث التغييرات وقائمة المراقبة (يتطلب جافاسكربت)',
-'tog-numberheadings' => 'رÙ\82Ù\85 Ø§Ù\84عÙ\86اÙ\88Ù\8aÙ\86 ØªÙ\84Ù\82ائÙ\8aاÙ\8b',
+'tog-numberheadings' => 'رÙ\82Ù\91Ù\85 Ø§Ù\84عÙ\86اÙ\88Ù\8aÙ\86 ØªÙ\84Ù\82ائÙ\8aÙ\8bا',
 'tog-showtoolbar' => 'أظهر شريط التحرير (يتطلب جافاسكربت)',
 'tog-editondblclick' => 'تحرير الصفحات بالنقر المزدوج (جافاسكربت)',
 'tog-editsection' => 'مكن تحرير الأقسام بروابط [عدل]',
@@ -490,40 +492,39 @@ $messages = array(
 'tog-watchmoves' => 'أضف الصفحات والملفات التي أنقلها إلى قائمة مراقبتي',
 'tog-watchdeletion' => 'أضف الصفحات والملفات التي أحذفها إلى قائمة مراقبتي',
 'tog-minordefault' => 'أشِّر كل التعديلات على أنها طفيفة مبدئيا',
-'tog-previewontop' => 'أظهر العرض المسبق قبل صندوق التحرير',
+'tog-previewontop' => 'أظهر معاينة النّصّ فوق صندوق التحرير',
 'tog-previewonfirst' => 'أظهر معاينة مع أول تحرير',
-'tog-nocache' => 'عطÙ\91Ù\84 ØªØ®Ø²Ù\8aÙ\86 المتصفح للصفحة',
+'tog-nocache' => 'عطÙ\91Ù\84 ØªØ®Ø¨Ø¦Ø© المتصفح للصفحة',
 'tog-enotifwatchlistpages' => 'أرسل لي رسالة إلكترونية عندما تتغيّر صفحة أو ملف في قائمة مراقبتي',
-'tog-enotifusertalkpages' => 'أرسل لي رسالة إلكترونية عندما تعدل صفحة نقاشي',
+'tog-enotifusertalkpages' => 'أرسل إليّ بريدا كلّما عُدّلت صفحة نقاشي',
 'tog-enotifminoredits' => 'أرسل لي رسالة إلكترونية بشأن التحريرات الطفيفة للصفحات والملفات',
 'tog-enotifrevealaddr' => 'أظهر عنوان بريدي الإلكتروني في رسائل الإخطار',
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبِين',
 'tog-oldsig' => 'التوقيع الحالي:',
-'tog-fancysig' => 'عامل التوقيع كنص ويكي (بدون وصلة أوتوماتيكية)',
-'tog-externaleditor' => 'استخدم محررًا خارجيًا مبدئيا (للخبراء فقط، يتطلب إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors لمزيد من المعلومات].)',
-'tog-externaldiff' => 'استخدم مستعرض فروقات خارجيًا مبدئيا (للخبراء فقط، يتطلّب إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات].)',
-'tog-showjumplinks' => 'مكن وصلات "اذهب إلى" المساعدة',
-'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت) (تجريبي)',
+'tog-fancysig' => 'عامل التوقيع كنصّ ويكي (بلا رابط تلقائي)',
+'tog-showjumplinks' => 'فعّل روابط "اذهب إلى" المعاونة',
+'tog-uselivepreview' => 'استخدم المعاينة السريعة (تتطلب جافاسكريبت) (تجريبية)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تحرير فارغ',
 'tog-watchlisthideown' => 'أخف تحريراتي من قائمة المراقبة',
 'tog-watchlisthidebots' => 'أخف تحريرات الروبوتات من قائمة المراقبة',
-'tog-watchlisthideminor' => 'أخف التعديلات الطفيفة من قائمة المراقبة',
-'tog-watchlisthideliu' => 'أخف تعديلات المستخدمين المسجلين من قائمة المراقبة',
-'tog-watchlisthideanons' => 'أخف تعديلات المستخدمين المجهولين من قائمة المراقبة',
-'tog-watchlisthidepatrolled' => 'أخف التعديلات المراجعة من قائمة المراقبة',
-'tog-ccmeonemails' => 'أرسل لي نسخا من رسائل البريد الإلكتروني التي أرسلها للمستخدمين الآخرين',
+'tog-watchlisthideminor' => 'في قائمة المراقبة أخف التعديلات الطفيفة',
+'tog-watchlisthideliu' => 'في قائمة المراقبة أخف تعديلات المستخدمين الوالجين',
+'tog-watchlisthideanons' => 'في قائمة المراقبة أخف تعديلات المستخدمين المجهولين',
+'tog-watchlisthidepatrolled' => 'في قائمة المراقبة أخف التعديلات المعاينة',
+'tog-ccmeonemails' => 'أرسل إليّ نسخا من رسائل البريد التي أرسلها إل مستخدمين آخرين',
 'tog-diffonly' => 'لا تعرض محتوى الصفحة أسفل الفروقات',
 'tog-showhiddencats' => 'أظهر التصنيفات المخفية',
 'tog-noconvertlink' => 'عطل تحويل عناوين الروابط',
-'tog-norollbackdiff' => 'أزل الفرق بعد القيام باسترجاع',
+'tog-norollbackdiff' => 'أزل الفرق بعد إحداث استرجاع',
+'tog-useeditwarning' => 'حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها',
 
 'underline-always' => 'دائما',
 'underline-never' => 'أبدا',
-'underline-default' => 'تبعا لإعدادات الواجهة أو المتصفح',
+'underline-default' => 'وفق الكسوة أو المتصفّح',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'نمط خط منطقة التحرير:',
-'editfont-default' => 'تبعا لإعدادات المتصفح',
+'editfont-style' => 'طراز خط منطقة التحرير:',
+'editfont-default' => 'وفق إعدادات المتصفح',
 'editfont-monospace' => 'خط ثابت العرض',
 'editfont-sansserif' => 'خط بلا زوائد',
 'editfont-serif' => 'خط بزوائد',
@@ -579,27 +580,39 @@ $messages = array(
 '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',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|لا تصنيف|تصنيف|تصنيفان|تصنيفات}}',
+'pagecategories' => '{{PLURAL:$1|بلا تصنيف|تصنيف|تصنيفان|تصنيفات}}',
 'category_header' => 'الصفحات في التصنيف "$1"',
-'subcategories' => 'اÙ\84تصÙ\86Ù\8aÙ\81ات Ø§Ù\84فرعية',
+'subcategories' => 'تصÙ\86Ù\8aÙ\81ات فرعية',
 'category-media-header' => 'الوسائط في التصنيف "$1"',
 'category-empty' => "''هذا التصنيف لا يحتوي حاليا على صفحات و لا وسائط.''",
-'hidden-categories' => '{{PLURAL:$1|لا تصنيف مخفيا|تصنيف مخفي|تصنيفان مخفيان|تصنيفات مخفية}}',
+'hidden-categories' => '{{PLURAL:$1|لا تصنيفات مخفية|تصنيف مخفي|تصنيفان مخفيان|تصنيفات مخفية}}',
 'hidden-category-category' => 'تصنيفات مخفية',
-'category-subcat-count' => '{{PLURAL:$2|Ù\84ا ØªØµØ§Ù\86Ù\8aÙ\81 Ù\81رعÙ\8aØ© Ù\81Ù\8a Ù\87ذا Ø§Ù\84تصÙ\86Ù\8aÙ\81\87ذا Ø§Ù\84تصÙ\86Ù\8aÙ\81 Ù\81Ù\8aÙ\87 Ø§Ù\84تصÙ\86Ù\8aÙ\81 Ø§Ù\84Ù\81رعÙ\8a Ø§Ù\84تاÙ\84Ù\8a Ù\81Ù\82Ø·.|Ù\87ذا Ø§Ù\84تصÙ\86Ù\8aÙ\81 Ù\81Ù\8aÙ\87 {{PLURAL:$1||Ù\87ذا Ø§Ù\84تصÙ\86Ù\8aÙ\81 Ø§Ù\84Ù\81رعÙ\8a\87Ø°Ù\8aÙ\86 Ø§Ù\84تصÙ\86Ù\8aÙ\81Ù\8aÙ\86 Ø§Ù\84Ù\81رعÙ\8aÙ\8aÙ\86\87Ø°Ù\87 Ø§Ù\84$1 ØªØµØ§Ù\86Ù\8aÙ\81 Ø§Ù\84Ù\81رعÙ\8aØ©|Ù\87Ø°Ù\87 Ø§Ù\84$1 ØªØµÙ\86Ù\8aÙ\81ا Ù\81رعÙ\8aا|Ù\87Ø°Ù\87 Ø§Ù\84$1 ØªØµÙ\86Ù\8aÙ\81 Ù\81رعÙ\8a}}، من إجمالي $2.}}',
-'category-subcat-count-limited' => 'Ù\87ذا Ø§Ù\84تصÙ\86Ù\8aÙ\81 Ù\81Ù\8aÙ\87 {{PLURAL:$1||اÙ\84تصÙ\86Ù\8aÙ\81 Ø§Ù\84Ù\81رعÙ\8a Ø§Ù\84تاÙ\84Ù\8a|اÙ\84تصÙ\86Ù\8aÙ\81Ù\8aÙ\86 Ø§Ù\84Ù\81رعÙ\8aÙ\8aÙ\86 Ø§Ù\84تاÙ\84Ù\8aÙ\8aÙ\86|$1 ØªØµØ§Ù\86Ù\8aÙ\81 Ù\81رعÙ\8aØ© ØªØ§Ù\84Ù\8aØ©|$1 ØªØµÙ\86Ù\8aÙ\81ا Ù\81رعÙ\8aا ØªØ§Ù\84Ù\8aا|$1 ØªØµÙ\86Ù\8aÙ\81 Ù\81رعÙ\8a ØªØ§Ù\84Ù\8a}}.',
-'category-article-count' => '{{PLURAL:$2|لا يحتوي هذا التصنيف أي صفحات.|هذا التصنيف يحتوي على الصفحة التالية فقط.|{{PLURAL:$1||الصفحة التالية|الصفحتان التاليتان|ال$1 صفحات التالية|ال$1 صفحة التالية|ال$1 صفحة التالية}} في هذا التصنيف، من إجمالي $2.}}',
-'category-article-count-limited' => '{{PLURAL:$1||الصفحة التالية|الصفحتان التاليتان|ال$1 صفحات التالية|ال$1 صفحة التالية|ال$1 صفحة التالية}} في التصنيف الحالي.',
-'category-file-count' => '{{PLURAL:$2||هذا التصنيف يحتوي الملف التالي فقط.|{{PLURAL:$1||الملف التالي|الملفان التاليان|الملفات ال$1 التالية}} في هذا التصنيف من إجمالي $2.}}',
-'category-file-count-limited' => '{{PLURAL:$1|الملف التالي|الملفان التاليان|ال$1 ملفات التالية|ال$1 ملفًا تاليًا|ال$1 ملف تالٍ}} في التصنيف الحالي.',
-'listingcontinuesabbrev' => 'Ù\85تابعة',
+'category-subcat-count' => '{{PLURAL:$2|Ù\87ذا Ø§Ù\84تصÙ\86Ù\8aÙ\81 Ù\8aØ­Ù\88Ù\8a Ø§Ù\84تصÙ\86Ù\8aÙ\81 Ø§Ù\84Ù\81رعÙ\8a Ø§Ù\84تاÙ\84Ù\8a\87ذا Ø§Ù\84تصÙ\86Ù\8aÙ\81 Ù\8aØ­Ù\88Ù\8a {{PLURAL:$1||اÙ\84تصÙ\86Ù\8aÙ\81 Ø§Ù\84Ù\81رعÙ\8a|تصÙ\86Ù\8aÙ\81Ù\8aÙ\86 Ù\81رعÙ\8aÙ\8aÙ\86|$1 ØªØµÙ\86Ù\8aÙ\81ات Ù\81رعÙ\8aØ©}}، من إجمالي $2.}}',
+'category-subcat-count-limited' => 'Ù\87ذا Ø§Ù\84تصÙ\86Ù\8aÙ\81 Ù\8aØ­Ù\88Ù\8a {{PLURAL:$1||اÙ\84تصÙ\86Ù\8aÙ\81 Ø§Ù\84Ù\81رعÙ\8a Ø§Ù\84تاÙ\84Ù\8a|اÙ\84تصÙ\86Ù\8aÙ\81Ù\8aÙ\86 Ø§Ù\84Ù\81رعÙ\8aÙ\8aÙ\86 Ø§Ù\84تاÙ\84Ù\8aÙ\8aÙ\86|اÙ\84تصÙ\86Ù\8aÙ\81ات Ø§Ù\84Ù\81رعÙ\8aØ© $1  Ø§Ù\84تاÙ\84Ù\8aØ©}}.',
+'category-article-count' => '{{PLURAL:$2|لا صفحات بهذا التصنيف سوى التالية.|{{PLURAL:$1||الصفحة التالية مصنّفة|الصفحتان التاليتان مصنّفتان|الصفحات $1 التالية مصنّفة}} بهذا التصنيف، من إجمالي $2.}}',
+'category-article-count-limited' => '{{PLURAL:$1||الصفحة التالية|الصفحتان التاليتان|الصفحات $1 التالية}} مصنّفة بهذا التصنيف.',
+'category-file-count' => '{{PLURAL:$2|لا ملفات مصنّفة بهذا التصنيف سوى التالي.|{{PLURAL:$1||الملف التالي مصنّف|الملفان التاليان مصنّفان|الملفات $1 التالية مصنّفة}} بهذا التصنيف من إجمالي $2.}}',
+'category-file-count-limited' => '{{PLURAL:$1|الملف التالي مصنّف|الملفان التاليان مصنّفان|الملفات $1 التالية مصنّفة}} بهذا التصنيف.',
+'listingcontinuesabbrev' => 'Ù\8aÙ\8fتبع',
 'index-category' => 'صفحات مفهرسة',
 'noindex-category' => 'صفحات غير مفهرسة',
 'broken-file-category' => 'صفحات تحتوي روابط ملفات معطوبة',
 
-'about' => 'عن',
+'about' => 'عن هذه الويكي',
 'article' => 'صفحة محتوى',
 'newwindow' => '(تفتح في نافذة جديدة)',
 'cancel' => 'ألغِ',
@@ -607,7 +620,7 @@ $messages = array(
 'morenotlisted' => 'يوجد المزيد غير مسرود...',
 'mypage' => 'صفحة',
 'mytalk' => 'نقاش',
-'anontalk' => 'النقاش لعنوان الأيبي هذا',
+'anontalk' => 'نقاش عنوان آي‌بي هذا',
 'navigation' => 'إبحار',
 'and' => '&#32;و',
 
@@ -623,95 +636,95 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'أضف موضوعا',
-'vector-action-delete' => 'حذف',
+'vector-action-delete' => 'احذÙ\81',
 'vector-action-move' => 'انقل',
 'vector-action-protect' => 'احم',
-'vector-action-undelete' => 'استرجع الحذف',
-'vector-action-unprotect' => 'غير الحماية',
-'vector-simplesearch-preference' => 'Ù\85Ù\83Ù\91Ù\86 شريط البحث المبسط (لواجهة فكتور فقط)',
+'vector-action-undelete' => 'تدارÙ\83 الحذف',
+'vector-action-unprotect' => 'غيّر الحماية',
+'vector-simplesearch-preference' => 'Ù\81عÙ\91Ù\84 شريط البحث المبسط (لواجهة فكتور فقط)',
 'vector-view-create' => 'أنشئ',
-'vector-view-edit' => 'تعدÙ\8aل',
+'vector-view-edit' => 'عدÙ\91ل',
 'vector-view-history' => 'اعرض التاريخ',
-'vector-view-view' => 'اÙ\82رأ',
+'vector-view-view' => 'طاÙ\84ع',
 'vector-view-viewsource' => 'طالع المصدر',
 'actions' => 'أفعال',
 'namespaces' => 'فضاءات التسمية',
 'variants' => 'المتغيرات',
 
 'navigation-heading' => 'قائمة التصفح',
-'errorpagetitle' => 'خطأ',
+'errorpagetitle' => 'عطÙ\84',
 'returnto' => 'ارجع إلى $1.',
 'tagline' => 'من {{SITENAME}}',
 'help' => 'مساعدة',
-'search' => 'بحث',
+'search' => 'ابحث',
 'searchbutton' => 'ابحث',
 'go' => 'اذهب',
 'searcharticle' => 'اذهب',
 'history' => 'تاريخ الصفحة',
 'history_short' => 'تاريخ',
 'updatedmarker' => 'حُدِّثَت منذ زيارتي الأخيرة',
-'printableversion' => 'نسخة للطباعة',
+'printableversion' => 'بتنسق للطباعة',
 'permalink' => 'رابط دائم',
 'print' => 'اطبع',
 'view' => 'مطالعة',
 'edit' => 'تحرير',
 'create' => 'إنشاء',
 'editthispage' => 'حرِّر هذه الصفحة',
-'create-this-page' => 'أنشئ هذه الصفحة',
+'create-this-page' => 'أنشئ صفحة بهذا العنوان',
 'delete' => 'حذف',
 'deletethispage' => 'احذف هذه الصفحة',
-'undelete_short' => 'استرجاع {{PLURAL:$1|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديلا}}',
-'viewdeleted_short' => 'استعرض {{PLURAL:$1|تعديل محذوف|$1 تعديلات محذوفة}}',
-'protect' => 'احÙ\85',
-'protect_change' => 'غير',
+'undelete_short' => 'استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
+'viewdeleted_short' => 'استعرض {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
+'protect' => 'Ø­Ù\85اÙ\8aØ©',
+'protect_change' => 'غيّر',
 'protectthispage' => 'احم هذه الصفحة',
-'unprotect' => 'غير الحماية',
-'unprotectthispage' => 'غير حماية هذه الصفحة',
+'unprotect' => 'غيّر الحماية',
+'unprotectthispage' => 'غيّر حماية هذه الصفحة',
 'newpage' => 'صفحة جديدة',
 'talkpage' => 'ناقش هذه الصفحة',
 'talkpagelinktext' => 'نقاش',
 'specialpage' => 'صفحة خاصة',
 'personaltools' => 'أدوات شخصية',
 'postcomment' => 'قسم جديد',
-'articlepage' => 'عرض صفحة المحتوى',
+'articlepage' => 'طاÙ\84ع صفحة المحتوى',
 'talk' => 'نقاش',
 'views' => 'معاينة',
 'toolbox' => 'صندوق الأدوات',
-'userpage' => 'عرض صفحة المستخدم',
-'projectpage' => 'عرض صفحة المشروع',
-'imagepage' => 'عرض صفحة الملف',
-'mediawikipage' => 'عرض صفحة الرسالة',
-'templatepage' => 'عرض صفحة القالب',
-'viewhelppage' => 'عرض صفحة المساعدة',
-'categorypage' => 'عرض صفحة التصنيف',
-'viewtalkpage' => 'عرض النقاش',
+'userpage' => 'طاÙ\84ع صفحة المستخدم',
+'projectpage' => 'طاÙ\84ع صفحة المشروع',
+'imagepage' => 'طاÙ\84ع صفحة الملف',
+'mediawikipage' => 'طاÙ\84ع صفحة الرسالة',
+'templatepage' => 'طاÙ\84ع صفحة القالب',
+'viewhelppage' => 'طاÙ\84ع صفحة المساعدة',
+'categorypage' => 'طاÙ\84ع صفحة التصنيف',
+'viewtalkpage' => 'طاÙ\84ع النقاش',
 'otherlanguages' => 'بلغات أخرى',
-'redirectedfrom' => '(تÙ\85 التحويل من $1)',
+'redirectedfrom' => '(بالتحويل من $1)',
 'redirectpagesub' => 'صفحة تحويل',
-'lastmodifiedat' => 'آخر ØªØ¹Ø¯Ù\8aÙ\84 Ù\84Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة Ù\81Ù\8a $2Ø\8c $1.',
+'lastmodifiedat' => 'آخر ØªØ¹Ø¯Ù\8aÙ\84 Ù\84Ù\87Ø°Ù\87 Ø§Ù\84صÙ\81حة Ù\83اÙ\86 Ù\8aÙ\88Ù\85 $1 Ø§Ù\84ساعة $2.',
 'viewcount' => '{{PLURAL:$1|لم تعرض هذه الصفحة أبدا|تم عرض هذه الصفحة مرة واحدة|تم عرض هذه الصفحة مرتين|تم عرض هذه الصفحة $1 مرات|تم عرض هذه الصفحة $1 مرة}}.',
 'protectedpage' => 'صفحة محمية',
 'jumpto' => 'اذهب إلى:',
 'jumptonavigation' => 'تصفح',
-'jumptosearch' => 'بحث',
-'view-pool-error' => 'عذرا، الخوادم منهكة حاليا.
+'jumptosearch' => 'ابحث',
+'view-pool-error' => 'عذراØ\8c Ø§Ù\84Ø®Ù\88ادÙ\8aÙ\85 Ù\85Ù\86Ù\87Ù\83Ø© Ø­Ø§Ù\84Ù\8aا.
 يحاول مستخدمون كثر الوصول إلى هذه الصفحة.
\85Ù\86 Ù\81ضÙ\84Ù\83 Ø§Ù\86تظر Ù\82Ù\84Ù\8aÙ\84ا Ù\82بÙ\84 Ø£Ù\86 ØªØ­Ø§Ù\88Ù\84 الوصول إلى هذه الصفحة مجددا.
\85Ù\86 Ù\81ضÙ\84Ù\83 ØªÙ\85Ù\87Ù\91Ù\84 Ù\82Ù\84Ù\8aÙ\84ا Ù\82بÙ\84 Ù\85حاÙ\88Ù\84Ø© الوصول إلى هذه الصفحة مجددا.
 
 $1',
-'pool-timeout' => 'اÙ\86تÙ\87اء Ø§Ù\84اÙ\86تظار Ù\84لقفل',
-'pool-queuefull' => 'طابÙ\88ر Ø§Ù\84اÙ\82تراع Ù\85Ù\84ئ',
-'pool-errorunknown' => 'خطأ غير معروف',
+'pool-timeout' => 'اÙ\86تÙ\87ت Ù\85Ù\87Ù\84Ø© Ø§لقفل',
+'pool-queuefull' => 'اÙ\84طابÙ\88ر Ù\85Ù\84Ø¢Ù\86',
+'pool-errorunknown' => 'عطÙ\84 غير معروف',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'عن {{SITENAME}}',
 'aboutpage' => 'Project:عن',
-'copyright' => 'المحتوى متوفر تحت $1.',
+'copyright' => 'المحتوى منشور وفق $1.',
 'copyrightpage' => '{{ns:project}}:حقوق النسخ',
 'currentevents' => 'الأحداث الجارية',
 'currentevents-url' => 'Project:الأحداث الجارية',
-'disclaimers' => 'عدÙ\85 مسؤولية',
-'disclaimerpage' => 'Project:عدÙ\85 مسؤولية عام',
+'disclaimers' => 'إخÙ\84اء مسؤولية',
+'disclaimerpage' => 'Project:إخÙ\84اء مسؤولية عام',
 'edithelp' => 'مساعدة التحرير',
 'edithelppage' => 'Help:تحرير',
 'helppage' => 'Help:محتويات',
@@ -723,54 +736,54 @@ $1',
 'privacy' => 'سياسة الخصوصية',
 'privacypage' => 'Project:سياسة الخصوصية',
 
-'badaccess' => 'خطأ Ù\81Ù\8a Ø§Ù\84سÙ\85اح',
-'badaccess-group0' => 'ليس من المسموح لك تنفيذ الفعل الذي طلبته.',
-'badaccess-groups' => 'اÙ\84Ù\81عÙ\84 Ø§Ù\84Ø°Ù\8a Ø·Ù\84بتÙ\87 Ù\85Ù\82صÙ\88ر Ø¹Ù\84Ù\89 Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ù\81Ù\8a {{PLURAL:$2||Ù\85جÙ\85Ù\88عة|Ù\88احدة Ù\85Ù\86 Ù\85جÙ\85Ù\88عتÙ\8a\88احدة Ù\85Ù\86 مجموعات}}: $1.',
+'badaccess' => 'عطÙ\84 Ù\81Ù\8a Ø§Ù\84صÙ\84احÙ\8aات',
+'badaccess-group0' => 'غير مصرّح لك بتنفيذ الفعل الذي اعتزمته.',
+'badaccess-groups' => 'اÙ\84Ù\81عÙ\84 Ø§Ù\84Ø°Ù\8a Ø§Ø¹ØªØ²Ù\85تÙ\87 Ù\85Ù\82صÙ\88ر Ø¹Ù\84Ù\89 Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø£Ø¹Ø¶Ø§Ø¡ {{PLURAL:$2||اÙ\84Ù\85جÙ\85Ù\88عة|إحدÙ\89 Ø§Ù\84Ù\85جÙ\85Ù\88عتÙ\8aÙ\86|إحدÙ\89 Ø§Ù\84مجموعات}}: $1.',
 
-'versionrequired' => 'تلزم نسخة $1 من ميدياويكي',
-'versionrequiredtext' => 'تلزم النسخة $1 من ميدياويكي لاستعمال هذه الصفحة. انظر [[Special:Version|صفحة النسخة]]',
+'versionrequired' => 'تلزم الإصدارة $1 من ميدياويكي',
+'versionrequiredtext' => 'تلزم الإصدارة $1 من ميدياويكي لاستعمال هذه الصفحة. طالع [[Special:Version|صفحة معلومات الإصدارة]]',
 
 'ok' => 'موافق',
-'retrievedfrom' => 'تم الاسترجاع من "$1"',
-'youhavenewmessages' => 'توجد لديك $1 ($2).',
+'retrievedfrom' => 'مجلوبة من "$1"',
+'youhavenewmessages' => 'لك $1 ($2).',
 'newmessageslink' => 'رسائل جديدة',
-'newmessagesdifflink' => 'آخر تغيير',
-'youhavenewmessagesfromusers' => 'لديك $1 من {{PLURAL:$3||مستخدم واحد|مستخدمين اثنين|$3 مستخدمين|$3 مستخدماً|$3 مستخدم}} ($2).',
-'youhavenewmessagesmanyusers' => 'لديك $1 من مستخدمين كثر ($2).',
+'newmessagesdifflink' => 'أحدث تغيير',
+'youhavenewmessagesfromusers' => 'لك $1 من {{PLURAL:$3||مستخدم واحد|مستخدمين اثنين|$3 مستخدمين|$3 مستخدماً|$3 مستخدم}} ($2).',
+'youhavenewmessagesmanyusers' => 'لك $1 من مستخدمين كثُر ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|رسالة جديدة|رسائل جديدة}}',
-'newmessagesdifflinkplural' => 'آخر {{PLURAL:$1|تغيير|تغييرات}}',
-'youhavenewmessagesmulti' => 'لديك رسائل جديدة على $1',
-'editsection' => 'تعدÙ\8aل',
+'newmessagesdifflinkplural' => 'أحدث {{PLURAL:$1|تغيير|تغييرات}}',
+'youhavenewmessagesmulti' => 'لديك رسائل جديدة في $1',
+'editsection' => 'عدÙ\91ل',
 'editold' => 'تعديل',
-'viewsourceold' => 'اعرض المصدر',
+'viewsourceold' => 'استعرض Ø§Ù\84Ù\85صدر',
 'editlink' => 'تعديل',
-'viewsourcelink' => 'اعرض المصدر',
+'viewsourcelink' => 'استعرض Ø§Ù\84Ù\85صدر',
 'editsectionhint' => 'حرر القسم: $1',
 'toc' => 'محتويات',
-'showtoc' => 'اعرض',
+'showtoc' => 'أظÙ\87ر',
 'hidetoc' => 'أخف',
 'collapsible-collapse' => 'اطو',
-'collapsible-expand' => 'Ù\88سع',
-'thisisdeleted' => 'أأعرض أو أسترجع $1؟',
+'collapsible-expand' => 'Ù\85دÙ\91د',
+'thisisdeleted' => 'هل أعرض أو أسترجع $1؟',
 'viewdeleted' => 'أأعرض $1؟',
 'restorelink' => '{{PLURAL:$1|$1 تعديل محذوف|تعديلا واحدا محذوفا|تعديلين محذوفين|$1 تعديلات محذوفة|$1 تعديلا محذوفا|$1 تعديل محذوف}}',
-'feedlinks' => 'التغذية:',
-'feed-invalid' => 'نوع اشتراك التلقيم غير صحيح.',
+'feedlinks' => 'التلقيمة:',
+'feed-invalid' => 'نوع التلقيمة غير صحيح.',
 'feed-unavailable' => 'التلقيمات غير متوفرة',
-'site-rss-feed' => '$1 تلقيم أر إس إس',
-'site-atom-feed' => '$1 تلقيم أتوم',
-'page-rss-feed' => '"$1" تلقيم أر إس إس',
-'page-atom-feed' => '"$1" تلقيم أتوم',
+'site-rss-feed' => 'تلقيمة آر‌إس‌إس $1',
+'site-atom-feed' => 'تلقيمة أتوم $1',
+'page-rss-feed' => 'تلقيمة آر‌إس‌إس "$1"',
+'page-atom-feed' => 'تلقيمة أتوم "$1"',
 'feed-atom' => 'أتوم',
 'feed-rss' => 'أر إس إس',
 'red-link-title' => '$1 (الصفحة غير موجودة)',
-'sort-descending' => 'ترتيب تنازلي',
-'sort-ascending' => 'ترتÙ\8aب ØªØµØ§Ø¹Ø¯Ù\8a',
+'sort-descending' => 'تنازليا',
+'sort-ascending' => 'تصاعدÙ\8aا',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'الصفحة',
-'nstab-user' => 'صفحة {{GENDER:{{BASEPAGENAME}}|مستخدم|مستخدمة}}',
-'nstab-media' => 'صÙ\81حة Ù\88سÙ\8aØ·',
+'nstab-user' => 'صفحة {{GENDER:{{BASEPAGENAME}}|المستخدم|المستخدمة}}',
+'nstab-media' => 'صÙ\81حة Ù\85Ù\8aدÙ\8aا',
 'nstab-special' => 'صفحة خاصة',
 'nstab-project' => 'صفحة مشروع',
 'nstab-image' => 'ملف',
@@ -780,80 +793,80 @@ $1',
 'nstab-category' => 'تصنيف',
 
 # Main script and global functions
-'nosuchaction' => 'لا يوجد فعل كهذا',
+'nosuchaction' => 'لا يوجد فعل كالذي طلبت',
 'nosuchactiontext' => 'الفعل المحدد بواسطة المسار غير صحيح.
-ربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت وصلة غير صحيحة.
\87ذا Ø±Ø¨Ù\85ا Ù\8aØ´Ù\8aر Ø£Ù\8aضا Ø¥Ù\84Ù\89 علة في {{SITENAME}}.',
+ربما تكون قد كتبت المسار بطريقة غير صحيحة، أو اتبعت رابطا غير صحيح.
\88 Ù\82د Ù\8aÙ\83Ù\88Ù\86 Ù\85رجع Ù\87ذا علة في {{SITENAME}}.',
 'nosuchspecialpage' => 'لا توجد صفحة خاصة بهذا الاسم',
 'nospecialpagetext' => '<strong>لقد طلبت صفحة خاصة غير صحيحة.</strong>
 
\82ائÙ\85Ø© Ø¨Ø§Ù\84صÙ\81حات Ø§Ù\84خاصة Ø§Ù\84صحÙ\8aحة Ù\8aÙ\85Ù\83Ù\86 Ø¥Ù\8aجادÙ\87ا في [[Special:SpecialPages|{{int:specialpages}}]].',
\82ائÙ\85Ø© Ø§Ù\84صÙ\81حات Ø§Ù\84خاصة Ù\85Ù\88جÙ\88دة في [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'خطأ',
-'databaseerror' => 'خطأ في قاعدة البيانات',
-'dberrortext' => 'حدث Ø®Ø·Ø£ Ù\81Ù\8a ØµÙ\8aغة Ø£ستعلام قاعدة البيانات.
-قد يدل هذا الخطأ على عيب في البرنامج.
-آخر Ø£Ø³ØªØ¹Ù\84اÙ\85 ØªÙ\85 Ø·Ù\84بÙ\87 Ù\85Ù\86 Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ù\83اÙ\86 :
+'error' => 'عطÙ\84',
+'databaseerror' => 'عطÙ\84 في قاعدة البيانات',
+'dberrortext' => 'حدث Ø¹Ø·Ù\84 Ù\81Ù\8a Ù\86Ø­Ù\88 Ø§ستعلام قاعدة البيانات.
+قد يكون مرجع هذا علّة في البرمجية.
+آخر Ø§Ø³ØªØ¹Ù\84اÙ\85 Ø£Ø¬Ø±Ù\8a Ù\81Ù\8a Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ù\83اÙ\86:
 <blockquote><tt>$1</tt></blockquote>
\85Ù\86 Ø¯Ø§Ø®Ù\84 Ø§Ù\84داÙ\84Ø© "<tt>$2</tt>".
­Ø¯Ø¯Øª Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ø§Ù\84خطأ  "<tt>$3: $4</tt>".',
+من الدالة "<tt>$2</tt>".
£Ø±Ø¬Ø¹Øª Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ø§Ù\84عطÙ\84 "<tt>$3: $4</tt>".',
 'dberrortextcl' => 'حدث خطأ في صيغة استعلام قاعدة البيانات.
 آخر استعلام طلب من قاعدة البيانات كان:
 "$1"
 من داخل الدالة "$2".
 أرجعت قاعدة البيانات الخطأ "$3: $4"',
 'laggedslavemode' => "'''تحذير:''' الصفحة قد لا تحتوي على أحدث التحديثات.",
-'readonly' => 'قاعدة البيانات مغلقة',
-'enterlockreason' => 'أدخل سببا للغلق، متضمنا تقديرا لوقت رفع الغلق',
-'readonlytext' => 'قاعدة البيانات مغلقة حاليا أمام المدخلات الجديدة والتعديلات الأخرى، السبب غالبا ما يكون الصيانة، وستعود قاعدة البيانات للوضع الطبيعي قريبا.
+'readonly' => 'قاعدة البيانات مقفلة',
+'enterlockreason' => 'أدخل سببا للقفل ذاكرا تقديرا لوقت إزالة الغلق',
+'readonlytext' => 'قاعدة البيانات مقفلة حاليا أمام المدخلات الجديدة و التعديلات الأخرى. السبب غالبا ما يكون الصيانة، و ستعود قاعدة البيانات للعمل الطبيعي قريبا.
 
 الإداري الذي أغلق قاعدة البيانات أعطى التفسير التالي: $1',
-'missing-article' => 'لم تجد قاعدة البيانات النص الخاص بصفحة كان يجب أن تجدها، واسمها "$1" $2.
+'missing-article' => 'لم تجد قاعدة البيانات نصّ صفحة كان يجب أن يوجد، الصفحة هي "$1" $2.
 
-عادة ما يحدث هذا عند اتباع فرق قديم أو وصلة تاريخ تؤدي إلى صفحة حذفت.
+عادة ما يحدث هذا عند اتباع فرق قديم أو رابط تأريخ صفحة محذوفة.
 
-إذا لم تكن هذه هي الحالة، فالمحتمل أنك وجدت خللا في البرنامج.
-من فضلك أبلغ أحد [[Special:ListUsers/sysop|الإداريين]]، وأعطه وصلة إلى مسار هذه الصفحة.',
+إذا لم تكن هذه هي الحال فمن المحتمل أنك قد وقعت على علّة في البرمجية.
+من فضلك أبلغ أحد [[Special:ListUsers/sysop|الإداريين]]، و أعطه مسار هذه الصفحة.',
 'missingarticle-rev' => '(رقم المراجعة: $1)',
 'missingarticle-diff' => '(فرق: $1، $2)',
-'readonly_lag' => 'تم إغلاق قاعدة البيانات تلقائيا حتى تستطيع الخواديم التابعة ملاحقة الخادوم الرئيسي',
+'readonly_lag' => 'تم قفل قاعدة البيانات تلقائيا حتى تستطيع الخواديم التابعة ملاحقة الخادوم الرئيسي',
 'internalerror' => 'عطل داخلي',
-'internalerror_info' => 'خطأ داخلي: $1',
+'internalerror_info' => 'عطÙ\84 داخلي: $1',
 'fileappenderrorread' => 'تعذرت قراءة "$1" أثناء الإضافة.',
 'fileappenderror' => 'تعذرت إضافة "$1" إلى "$2".',
-'filecopyerror' => 'لم يمكن نسخ الملف "$1" إلى "$2".',
-'filerenameerror' => 'لم يمكن إعادة تسمية الملف "$1" إلى "$2".',
-'filedeleteerror' => 'لم يمكن حذف الملف "$1".',
-'directorycreateerror' => 'لم يمكن إنشاء المجلد "$1".',
-'filenotfound' => 'لم يمكن إيجاد الملف "$1".',
-'fileexistserror' => 'غÙ\8aر Ù\82ادر Ø¹Ù\84Ù\89 Ø§Ù\84Ù\83تابة Ù\84لملف "$1": الملف موجود',
+'filecopyerror' => 'تعذّر نسخ الملف "$1" إلى "$2".',
+'filerenameerror' => 'تعذّر تغيير اسم الملف "$1" إلى "$2".',
+'filedeleteerror' => 'تعذّر حذف الملف "$1".',
+'directorycreateerror' => 'تعذّر إنشاء الدليل "$1".',
+'filenotfound' => 'تعذّر إيجاد الملف "$1".',
+'fileexistserror' => 'تعذÙ\91رت Ù\83تابة Ø§لملف "$1": الملف موجود',
 'unexpected' => 'قيمة غير متوقعة: "$1"="$2".',
-'formerror' => 'خطأ: Ù\84Ù\85 Ù\8aÙ\85Ù\83Ù\86 ØªÙ\86Ù\81Ù\8aØ° الاستمارة',
+'formerror' => 'عطÙ\84: ØªØ¹Ø°Ù\91ر Ø¥Ù\8aداع الاستمارة',
 'badarticleerror' => 'لا يمكن إجراء هذا الفعل على هذه الصفحة.',
-'cannotdelete' => 'تعذر حذف الصفحة أو الملف "$1".
-ربÙ\85ا Ø­Ø°Ù\81Ù\87ا Ø´Ø­Øµ Ø¢Ø®Ø±.',
-'cannotdelete-title' => 'لا يمكن حذف الصفحة "$1"',
-'delete-hook-aborted' => 'إحباط Ø§Ù\84حذÙ\81 Ù\85Ù\86 Ù\82بÙ\84 Ù\87Ù\88Ù\83.
+'cannotdelete' => 'تعذّر حذف الصفحة أو الملف "$1".
+ربÙ\85ا Ø­Ø°Ù\81Ù\87ا Ø´Ø®Øµ Ø¢Ø®Ø± Ø¨Ø§Ù\84Ù\81عÙ\84.',
+'cannotdelete-title' => 'تعذّر حذف الصفحة "$1"',
+'delete-hook-aborted' => 'أجÙ\87ض Ø®Ø·Ù\91اÙ\81 Ø§Ù\84حذÙ\81.
 لم يقدم أي توضيح.',
 'badtitle' => 'عنوان سيء',
-'badtitletext' => 'عنوان الصفحة المطلوب إما غير صحيح أو فارغ، وربما الوصلة بين اللغات أو بين المشاريع خاطئة.
-ومن الممكن وجود رموز لا تصلح للاستخدام في العناوين.',
-'perfcached' => 'اÙ\84بÙ\8aاÙ\86ات Ø§Ù\84تاÙ\84Ù\8aØ© Ù\85ختزÙ\86Ø© Ù\88Ù\82د Ù\84ا ØªÙ\83Ù\88Ù\86 Ù\85حدثة. {{PLURAL:$1||Ù\86تÙ\8aجة Ù\88احدة|Ù\86تÙ\8aجتاÙ\86|$1 Ù\86تائج|$1 Ù\86تÙ\8aجة}} Ø¹Ù\84Ù\89 Ø§Ù\84Ø£Ù\83ثر {{PLURAL:$1||Ù\85ختزÙ\86Ø©|Ù\85ختزÙ\86تاÙ\86\85ختزÙ\86ة}}.',
-'perfcachedts' => 'اÙ\84بÙ\8aاÙ\86ات Ø§Ù\84تاÙ\84Ù\8aØ© Ù\85ختزÙ\86Ø© Ù\88Ù\83اÙ\86 Ø¢Ø®Ø± ØªØ­Ø¯Ù\8aØ« Ù\84Ù\87ا Ù\81Ù\8a $1. {{PLURAL:$4||Ù\86تÙ\8aجة Ù\88احدة|Ù\86تÙ\8aجتاÙ\86|$4 Ù\86تائج|$4 Ù\86تÙ\8aجة}} Ø¹Ù\84Ù\89 Ø§Ù\84Ø£Ù\83ثر {{PLURAL:$4||Ù\85ختزÙ\86Ø©|Ù\85ختزÙ\86تاÙ\86\85ختزÙ\86ة}}.',
-'querypage-no-updates' => 'اÙ\84تحدÙ\8aثات Ù\84هذه الصفحة معطلة حاليا.
+'badtitletext' => 'عنوان الصفحة المطلوب إما غير صحيح أو فارغ، وربما الرابط بين اللغات أو بين المشاريع خاطئ.
+ربما يحوي محارف لا تصلح للاستخدام في العناوين.',
+'perfcached' => 'اÙ\84بÙ\8aاÙ\86ات Ø§Ù\84تاÙ\84Ù\8aØ© Ù\85خبأة Ù\88 Ù\82د Ù\84ا ØªÙ\83Ù\88Ù\86 Ù\85حدثة. {{PLURAL:$1||Ù\86تÙ\8aجة Ù\88احدة|Ù\86تÙ\8aجتاÙ\86|$1 Ù\86تائج|$1 Ù\86تÙ\8aجة}} Ø¹Ù\84Ù\89 Ø§Ù\84Ø£Ù\83ثر {{PLURAL:$1||Ù\85خبÙ\91أة|Ù\85خبÙ\91أتاÙ\86\85خبÙ\91Ø£ة}}.',
+'perfcachedts' => 'اÙ\84بÙ\8aاÙ\86ات Ø§Ù\84تاÙ\84Ù\8aØ© Ù\85خبÙ\91أة Ù\88Ù\83اÙ\86 Ø¢Ø®Ø± ØªØ­Ø¯Ù\8aØ« Ù\84Ù\87ا Ù\81Ù\8a $1. {{PLURAL:$4||Ù\86تÙ\8aجة Ù\88احدة|Ù\86تÙ\8aجتاÙ\86|$4 Ù\86تائج|$4 Ù\86تÙ\8aجة}} Ø¹Ù\84Ù\89 Ø§Ù\84Ø£Ù\83ثر {{PLURAL:$4||Ù\85خبÙ\91أة|Ù\85خبÙ\91أتاÙ\86\85خبÙ\91Ø£ة}}.',
+'querypage-no-updates' => 'تحدÙ\8aثات هذه الصفحة معطلة حاليا.
 البيانات هنا لن يتم تحديثها حاليا.',
-'wrong_wfQuery_params' => 'Ù\85حددات خاطئة في wfQuery()<br />
+'wrong_wfQuery_params' => 'Ù\85عاÙ\85Ù\84ات خاطئة في wfQuery()<br />
 الدالة: $1<br />
 الاستعلام: $2',
-'viewsource' => 'اعرض المصدر',
-'viewsource-title' => 'إظÙ\87ار مصدر $1',
-'actionthrottled' => 'لا يمكن عمل المزيد من هذا الفعل',
-'actionthrottledtext' => 'كإجراء ضد السبام، أنت ممنوع من إجراء هذا الفعل عدد كبير من المرات في فترة زمنية قصيرة، ولقد تجاوزت هذا الحد.
\85Ù\86 Ù\81ضÙ\84Ù\83 Ø­Ø§Ù\88Ù\84 Ù\85رة Ø«Ø§Ù\86Ù\8aØ© Ø®Ù\84اÙ\84 عدة دقائق.',
+'viewsource' => 'استعرض Ø§Ù\84Ù\85صدر',
+'viewsource-title' => 'استعرض مصدر $1',
+'actionthrottled' => 'تم كبح الفعل',
+'actionthrottledtext' => 'احترازا من السُّخام، يُحظر إجراء هذا الفعل مرات كثيرة في فترة زمنية قصيرة، و لقد تجاوزت هذا الحد.
\85Ù\86 Ù\81ضÙ\84Ù\83 Ø­Ø§Ù\88Ù\84 Ù\85جددا Ø¨Ø¹Ø¯ عدة دقائق.',
 'protectedpagetext' => 'هذه الصفحة تمت حمايتها لمنع التعديل أو أية عمليات أخرى.',
-'viewsourcetext' => 'يمكنك رؤية ونسخ مصدر هذه الصفحة:',
-'viewyourtext' => "Ù\8aÙ\85Ù\83Ù\86Ù\83 Ø±Ø¤Ù\8aØ© Ù\88نسخ مصدر ''' تعديلاتك ''' في هذه الصفحة:",
+'viewsourcetext' => 'تمكنك مطالعة و نسخ مصدر هذه الصفحة:',
+'viewyourtext' => "Ù\8aÙ\85Ù\83Ù\86Ù\83 Ø§Ø³ØªØ¹Ø±Ø§Ø¶ Ù\88 نسخ مصدر ''' تعديلاتك ''' في هذه الصفحة:",
 'protectedinterface' => 'توفر هذه الصفحة نص الواجهة للبرنامج على هذا الويكي، وهي محمية لمنع سوء أستخدامها.
 لإضافة أو تغيير الترجمات لجميع مشاريع الويكي، رجاءً أستخدم [//translatewiki.net/ translatewiki.net]، مشروع الترجمة الخاص بميدياويكي.',
 'editinginterface' => "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.
@@ -890,9 +903,18 @@ $2',
 'welcomecreation-msg' => 'تم إنشاء حسابك.
 لا تنس تعديل [[Special:Preferences|تفضيلاتك في {{SITENAME}}]].',
 'yourname' => 'اسم المستخدم:',
+'userlogin-yourname' => 'اسم المستخدم',
+'userlogin-yourname-ph' => 'أدخل اسم المستخدم الخاص بك',
 'yourpassword' => 'كلمة السر:',
+'userlogin-yourpassword' => 'كلمة السر',
+'userlogin-yourpassword-ph' => 'أدخل كلمة السر الخاصة بك',
+'createacct-yourpassword-ph' => 'أدخل كلمة السر',
 'yourpasswordagain' => 'أعد كتابة كلمة السر:',
+'createacct-yourpasswordagain' => 'أكد كلمة السر',
+'createacct-yourpasswordagain-ph' => 'أدخل كلمة المرور مرة أخرى',
 'remembermypassword' => 'تذكر دخولي بهذا المتصفح (لمدة أقصاها {{PLURAL:$1||يوم واحد|يومان|$1 أيام|$1 يوما|$1 يوم}})',
+'userlogin-remembermypassword' => 'أبقني مسجلا للدخول',
+'userlogin-signwithsecure' => 'الولوج باتصّال مؤمّن',
 'securelogin-stick-https' => 'ابقَ في اتصال HTTPS بعد الدخول.',
 'yourdomainname' => 'نطاقك:',
 'password-change-forbidden' => 'أنت لا يمكنك تغيير كلمات السر على هذا الويكي.',
@@ -905,18 +927,38 @@ $2',
 'logout' => 'تسجيل الخروج',
 'userlogout' => 'اخرج',
 'notloggedin' => 'غير مسجل الدخول',
+'userlogin-noaccount' => 'ليس لديك حساب؟',
+'userlogin-joinproject' => 'انضم إلى {{SITENAME}}',
 'nologin' => "ليس لديك حساب؟ '''$1'''.",
 'nologinlink' => 'أنشئ حسابا',
 'createaccount' => 'أنشئ حسابا',
 'gotaccount' => "لديك حساب؟ '''$1'''.",
 'gotaccountlink' => 'تسجيل الدخول',
 'userlogin-resetlink' => 'نسيت تفاصيل الدخول؟',
+'userlogin-resetpassword-link' => 'صفّر كلمة سرّك',
+'helplogin-url' => 'Help:تسجيل الدخول',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|المساعدة في تسجيل الدخول]]',
+'createacct-join' => 'قم بإدخال المعلومات الخاصة بك أدناه.',
+'createacct-emailrequired' => 'عنوان البريد الإلكتروني',
+'createacct-emailoptional' => 'البريد الإلكتروني (اختياري)',
+'createacct-email-ph' => 'أدخل عنوان بريدك الإلكتروني',
 'createaccountmail' => 'استخدم كلمة سر عشوائية مؤقتة وارسلها إلى عنوان البريد الإلكتروني المحدد أدناه',
+'createacct-realname' => 'الاسم الحقيقي (اختياري)',
 'createaccountreason' => 'السبب:',
+'createacct-reason' => 'السبب',
+'createacct-reason-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|مساهم|مساهمين}}',
 'badretype' => 'كلمات السر التي أدخلتها لا تتطابق.',
 'userexists' => 'اسم المستخدم الذي تم إدخاله مستعمل بالفعل.
 الرجاء اختيار اسم مختلف.',
 'loginerror' => 'خطأ في الدخول',
+'createacct-error' => 'خطأ في إنشاء حساب',
 'createaccounterror' => 'تعذر إنشاء حساب المستخدم: $1',
 'nocookiesnew' => 'تم إنشاء حساب المستخدم، ولكنك لست مسجل الدخول بعد.
 يستخدم {{SITENAME}} كوكيز لتسجيل الدخول.
@@ -983,7 +1025,7 @@ $2',
 'usernamehasherror' => 'لا يمكن أن يحتوي اسم المستخدم على محارف هاش',
 'login-throttled' => 'لقد قمت بمحاولات دخول كثيرة جدا مؤخرا.
 من فضلك انتظر قبل المحاولة مرة أخرى.',
-'login-abort-generic' => 'Ù\84Ù\85 Ù\8aÙ\86جح Ù\88Ù\84Ù\88جÙ\83 - Ø¥Ø¬Ù\87اض',
+'login-abort-generic' => 'Ù\84Ù\85 Ù\8aÙ\86جح Ù\88Ù\84Ù\88جÙ\83 - ØªÙ\85 Ø¥Ø¬Ù\87اضÙ\87',
 'loginlanguagelabel' => 'اللغة: $1',
 'suspicious-userlogout' => 'رفض طلب خروجك لأنه يبدو كأنه أرسل عن طريق متصفح معطوب أو وسيط تخزين.',
 
@@ -1010,38 +1052,36 @@ $2',
 'resetpass-wrong-oldpass' => 'كلمة سر حالية أو مؤقتة غير صحيحة.
 ربما تكون غيرت كلمة السر الخاصة بك بنجاح أو طلبت كلمة سر مؤقتة جديدة.',
 'resetpass-temp-password' => 'كلمة سر مؤقتة:',
+'resetpass-abort-generic' => 'منعت مُلحقة إتمام صيرورة تغيير كلمة السّر.',
 
 # Special:PasswordReset
 'passwordreset' => 'إعادة ضبط كلمة السر',
-'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتفاصيل حسابك.',
 'passwordreset-legend' => 'إعادة تعيين كلمة السر',
 'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
-'passwordreset-pretext' => '{{PLURAL:$1||أدخل أحد أجزاء البيانات أدناه}}',
+'passwordreset-emaildisabled' => 'تم تعطيل ميزات البريد الإلكتروني على هذه الويكي.',
 'passwordreset-username' => 'اسم المستخدم:',
 'passwordreset-domain' => 'النطاق:',
 'passwordreset-capture' => 'أأعرض البريد الإلكتروني الناتج؟',
 'passwordreset-capture-help' => 'إذا علّمت هذا الصندوق فسيعرض لك البريد الإلكتروني (الذي يحتوي كلمة سر مؤقتة) وسيرسل أيضا للمستخدم.',
 'passwordreset-email' => 'عنوان البريد الإلكتروني:',
 'passwordreset-emailtitle' => 'تفاصيل حساب {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'احد Ù\85ا (Ù\82د Ù\8aÙ\83Ù\88Ù\86 Ø§Ù\86ت$1)Ø·Ù\84ب Ù\85Ø°Ù\83رة ØªÙ\81اصÙ\8aÙ\84 Ø§Ù\84حساب Ù\84{{SITENAME}} ($4).اÙ\84Ù\85ستخدÙ\85 Ø§Ù\84اتÙ\8a {{PLURAL:$3|اÙ\84حساب Ù\87Ù\88|اÙ\84حسابات Ù\87Ù\8a}} Ù\82د Ù\82رÙ\86 Ø¨Ù\87ذا Ø§Ù\84عÙ\86Ù\88اÙ\86 :
+'passwordreset-emailtext-ip' => 'أحد Ù\85ا (Ù\82د Ù\8aÙ\83Ù\88Ù\86 Ø£Ù\86تØ\8c Ù\85Ù\86 Ø§Ù\84عÙ\86Ù\88اÙ\86 $1)  Ø·Ù\84ب Ø¥Ø¹Ø§Ø¯Ø© Ø¶Ø¨Ø· Ù\83Ù\84Ù\85Ø© Ø³Ø± Ø­Ø³Ø§Ø¨Ù\83 Ø¹Ù\84Ù\89 {{SITENAME}} ($4). {{PLURAL:$3||اÙ\84حساب|اÙ\84حساباÙ\86| Ø§Ù\84حسابات}} Ø£Ø¯Ù\86اÙ\87 Ù\82د Ø§Ù\82ترÙ\86ت Ø¨Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a :
 
 $2
 
-{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}
-من الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .
-إذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.',
-'passwordreset-emailtext-user' => 'احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :
+{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}
+يمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.',
+'passwordreset-emailtext-user' => 'المستخدم $1 على {{SITENAME}} طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :
 
 $2
 
-{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}
-من الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .
-إذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.',
+{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}
+يمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.',
 'passwordreset-emailelement' => 'اسم {{GENDER:$1|المستخدم|المستخدمة}}: $1
 كلمة السر المؤقتة: $2',
-'passwordreset-emailsent' => 'أرسل بريد إلكتروني تذكيري',
-'passwordreset-emailsent-capture' => 'أرسل بريد إلكتروني تذكيري وهو معروض بالأسفل.',
-'passwordreset-emailerror-capture' => 'ولّد بريد إلكتروني تذكيري وهو معروض بالأسفل لكن فشل إرساله للمستخدم: $1',
+'passwordreset-emailsent' => 'أُرسل بريد إلكتروني لإعادة ضبط كلمة السر.',
+'passwordreset-emailsent-capture' => 'أُرسل بريد إلكتروني لإعادة ضبط كلمة السر، وهو معروض بالأسفل.',
+'passwordreset-emailerror-capture' => 'تم توليد رسالة بريد إلكتروني لتصفير كلمة السر نصّه التالي، إلا أنه تعذّر إرسال الرّسالة إلى {{GENDER:$2|المستخدم|المستخدمة}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'تغيير عنوان البريد الإلكتروني',
@@ -1268,6 +1308,8 @@ $2
 'content-failed-to-parse' => 'فشل في تحليل $2 محتوى لـ $1 نموذج: $3',
 'invalid-content-data' => 'بيانات المحتوى غير صالحة',
 'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صفحة [[$2]]',
+'editwarning-warning' => 'قد تتسبب مغادرة هذه الصفحة بخسارتك لأي تغييرات قمت بها.
+يمكنك تعطيل هذا التحذير إذا كنت والجلًا في قسم "{{int:prefs-editing}}" في تفضيلاتك.',
 
 # Content models
 'content-model-wikitext' => 'نص ويكي',
@@ -1556,15 +1598,7 @@ $1",
 'searchdisabled' => 'البحث في {{SITENAME}} معطل.
 يمكنك البحث من خلال جوجل في الوقت الحالي.
 لاحظ أن فهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.',
-
-# Quickbar
-'qbsettings' => 'لوح سريع',
-'qbsettings-none' => 'بلا تحديد',
-'qbsettings-fixedleft' => 'مثبت لليسار',
-'qbsettings-fixedright' => 'مثبت لليمين',
-'qbsettings-floatingleft' => 'حر لليسار',
-'qbsettings-floatingright' => 'حر لليمين',
-'qbsettings-directionality' => 'ثابت، بناءً على اتجاه كتابة لغتك',
+'search-error' => 'حدث خطأ ما أثناء البحث: $1',
 
 # Preferences page
 'preferences' => 'تفضيلات',
@@ -1708,6 +1742,7 @@ $1",
 'userrights-notallowed' => 'حسابك لا يمتلك إذنا لإضافة أو إزالة صلاحيات المستخدمين.',
 'userrights-changeable-col' => 'المجموعات التي يمكنك تغييرها',
 'userrights-unchangeable-col' => 'المجموعات التي لا يمكنك تغييرها',
+'userrights-conflict' => 'تضارب في صلاحيات المستخدمين. طبّق تغييراتك مجدّدا',
 
 # Groups
 'group' => 'المجموعة:',
@@ -2126,7 +2161,6 @@ $1',
 'http-read-error' => 'خطأ قراءة HTTP.',
 'http-timed-out' => 'انتهت مهلة طلب HTTP.',
 'http-curl-error' => 'فشل جلب المسار: $1',
-'http-host-unreachable' => 'تعذر الوصول إلى المسار.',
 'http-bad-status' => 'ثمة مشكلة أثناء طلب HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2544,8 +2578,8 @@ $1',
 'notvisiblerev' => 'المراجعة تم حذفها',
 'watchnochange' => 'لم تُعدّل أي صفحة في قائمة مراقبتك خلال الفترة الزمنية المحددة.',
 'watchlist-details' => '{{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} في قائمة مراقبتك، بدون عد صفحات النقاش.',
-'wlheader-enotif' => '* الإخطار بالبريد الإلكتروني مفعل.',
-'wlheader-showupdated' => "* الصفحات التي تم تحريرها بعد زيارتك لها لآخر مرة معروضة بالخط '''الغليظ'''",
+'wlheader-enotif' => 'الإخطار بالبريد الإلكتروني مُفعّل.',
+'wlheader-showupdated' => "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
 'watchmethod-recent' => 'فحص التعديلات الأخيرة للصفحات المراقبة',
 'watchmethod-list' => 'فحص الصفحات المراقبة للتعديلات الحديثة',
 'watchlistcontains' => 'تحتوي قائمة مراقبتك على {{PLURAL:$1|لا صفحات|صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}}.',
@@ -2643,8 +2677,8 @@ $UNWATCHURL
 'rollback' => 'استرجاع التعديلات',
 'rollback_short' => 'استرجع',
 'rollbacklink' => 'استرجع',
-'rollbacklinkcount' => 'استرجع {{PLURAL:$1|لا تعديلات|تعديلا واحدا|تعديلين|$1 تعديلات|$1 تعديل}}',
-'rollbacklinkcount-morethan' => 'استرجاع أكثر من $1 {{PLURAL:$1|تعديل|تعديلات}}',
+'rollbacklinkcount' => 'استرجع {{PLURAL:$1|لا تعديلات|تعديلا واحدا|تعديلين|$1 تعديلات|$1 تعديلاً|تعديل}}',
+'rollbacklinkcount-morethan' => 'استرجاع أكثر من {{PLURAL:$1||تعديل|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}',
 'rollbackfailed' => 'لم ينجح الاسترجاع',
 'cantrollback' => 'لم يمكن استرجاع التعديل؛
 آخر مساهم هو المؤلف الوحيد لهذه الصفحة.',
@@ -2761,7 +2795,7 @@ $UNWATCHURL
 'undeletereset' => 'أعد الضبط',
 'undeleteinvert' => 'اعكس الاختيار',
 'undeletecomment' => 'السبب:',
-'undeletedrevisions' => 'تم استرجاع {{PLURAL:$1|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديلا}}',
+'undeletedrevisions' => 'تم استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلا|$1 تعديل}}',
 'undeletedrevisions-files' => 'أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}  و{{PLURAL:$2||ملف واحد|ملفان|$2 ملفات|$2 ملفًا|$2 ملف}}',
 'undeletedfiles' => 'أسترجع {{PLURAL:$1||ملف واحد|ملفان|$1 ملفات|$1 ملفًا|$1 ملف}}',
 'cannotundelete' => 'فشل الاسترجاع؛
@@ -2968,6 +3002,7 @@ $1',
 'sorbsreason' => 'عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.',
 'sorbs_create_account_reason' => 'عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.
 لا يمكنك إنشاء حساب.',
+'xffblockreason' => 'عنوان آي‌بي مذكور في ترويسة X-Forwarded-For، الذي ربما يخصّك أو يخصّ خادوما وسيطا تستخدمه، قد حُظِر. السبب الأصلي للحظر كان: $1',
 'cant-block-while-blocked' => 'أنت لا يمكنك منع المستخدمين الآخرين بينما أنت ممنوع.',
 'cant-see-hidden-user' => 'المستخدم الذي تحاول منعه تم منعه سابقاً وإخفاؤه. بما أنك لا تمتلك صلاحية إخفاء المستخدم، لا يمكنك مشاهدة المنع أو تعديله.',
 'ipbblocked' => 'لا يمكنك منع أو رفع منع مستخدمين آخرين لأنك ممنوع',
@@ -3134,6 +3169,8 @@ $1',
 'thumbnail-more' => 'كبّر',
 'filemissing' => 'الملف مفقود',
 'thumbnail_error' => 'خطأ في إنشاء صورة مصغرة: $1',
+'thumbnail_error_remote' => 'رسالة عطل من $1:
+$2',
 'djvu_page_error' => 'صفحة DjVu خارج النطاق',
 'djvu_no_xml' => 'لا يمكن جلب XML لملف DjVu',
 'thumbnail-temp-create' => 'تعذر إنشاء ملف الصورة المصغرة المؤقت',
@@ -3286,17 +3323,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/* ستؤثر الأنماط المتراصة (CSS) المعروضة هنا على كل الواجهات */',
-'standard.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة ستاندرد */',
-'nostalgia.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة نوستالشيا */',
 'cologneblue.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة كولون بلو */',
 'monobook.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مونوبوك */',
-'myskin.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة ماي سكين */',
-'chick.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة تشيك */',
-'simple.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة سيمبل */',
 'modern.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مودرن */',
 'vector.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة فكتور */',
 'print.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */',
-'handheld.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الأجهزة المحمولة بالاعتماد على الواجهة المضبوطة في $wgHandheldStyle */',
 'noscript.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين الذين الجافاسكريبت لديهم معطلة */',
 'group-autoconfirmed.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين المؤكدين تلقائيا فقط */',
 'group-bot.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على البوتات فقط */',
@@ -3305,13 +3336,8 @@ $1',
 
 # Scripts
 'common.js' => '/* الجافاسكريبت الموضوع هنا سيتم تحميله لكل المستخدمين مع كل تحميل للصفحة. */',
-'standard.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة ستاندرد */',
-'nostalgia.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة نوستالشيا */',
 'cologneblue.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة كولون بلو */',
 'monobook.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مونوبوك */',
-'myskin.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة ماي سكين */',
-'chick.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة تشيك */',
-'simple.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة سيمبل */',
 'modern.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة مودرن */',
 'vector.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين الذين يستعملون واجهة فكتور */',
 'group-autoconfirmed.js' => '/* أي جافاسكريبت هنا سيتم تحميلها للمستخدمين المؤكدين تلقائيا فقط */',
@@ -3391,13 +3417,8 @@ $1',
 'pageinfo-category-files' => 'عدد الملفات',
 
 # Skin names
-'skinname-standard' => 'كلاسيك',
-'skinname-nostalgia' => 'نوستالجيا',
 'skinname-cologneblue' => 'كولون بلو',
 'skinname-monobook' => 'مونوبوك',
-'skinname-myskin' => 'ماي سكين',
-'skinname-chick' => 'تشيك',
-'skinname-simple' => 'سيمبل',
 'skinname-modern' => 'مودرن',
 'skinname-vector' => 'فكتور',
 
@@ -3480,11 +3501,25 @@ $1',
 'minutes' => '{{PLURAL:$1||دقيقة واحدة|دقيقتين|$1 دقائق|$1 دقيقة}}',
 'hours' => '{{PLURAL:$1||ساعة واحدة|ساعتين|$1 ساعات|$1 ساعة}}',
 'days' => '{{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}}',
+'weeks' => '{{PLURAL:$1|أسبوع|$1 أسابيع}}',
 'months' => '{{PLURAL:$1||شهر واحد|شهرين|$1 شهور|$1 شهرا|$1 شهر}}',
 'years' => '{{PLURAL:$1||سنة واحدة|سنتين|$1 سنين|$1 سنة}}',
 'ago' => 'قبل $1',
 'just-now' => 'الآن فقط',
 
+# Human-readable timestamps
+'hours-ago' => 'منذ {{PLURAL:$1|ساعة|$1 ساعات}}',
+'minutes-ago' => 'منذ {{PLURAL:$1|دقيقة|$1 دقائق}}',
+'seconds-ago' => 'منذ {{PLURAL:$1|ثانية|$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
 'bad_image_list' => 'الصيغة كالتالي:
 
@@ -3514,7 +3549,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'العرض',
 'exif-imagelength' => 'الارتفاع',
 'exif-bitspersample' => 'بت لكل مكونة',
@@ -3697,7 +3732,7 @@ $1',
 # Make & model, can be wikified in order to link to the camera and model name
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'غير مضغوط',
 'exif-compression-2' => 'CCITT المجموعة 3 -1 تعديل طول تشغيل ترميز هوفمان البعدي',
 'exif-compression-3' => 'ترميز فاكس المجموعة 3 CCITT',
@@ -4231,12 +4266,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسار المقالات]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسار السكريبت]',
 
-# Special:FilePath
-'filepath' => 'مسار ملف',
-'filepath-page' => 'الملف:',
-'filepath-submit' => 'اذهب',
-'filepath-summary' => 'هذه الصفحة الخاصة تعرض المسار الكامل لملف.
-ستعرض الصور بأقصى دقة، ستعمل أنواع الملفات الأخرى بالبرنامج المخصص لهم مباشرة.',
+# Special:Redirect
+'redirect' => 'تحويل باسم ملف أو اسم مستخدم أو رقم مراجعة',
+'redirect-legend' => 'تحويل إلى ملف أو صفحة',
+'redirect-summary' => 'هذه الصفحة الخاصة تحوّل إلى ملف (باسمه) أو صفحة (برقم إحدى مراجعاتها) أو إلى صفحة مستخدم (برقمه التعريفي).',
+'redirect-submit' => 'حوّل',
+'redirect-lookup' => 'ابحث في:',
+'redirect-value' => 'الوجهة',
+'redirect-user' => 'رقم مستخدم',
+'redirect-revision' => 'مراجعة صفحة',
+'redirect-file' => 'اسم ملف',
+'redirect-not-exists' => 'المطلوب غير موجود',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'بحث عن ملفات مكررة',
@@ -4327,23 +4367,26 @@ $5
 'htmlform-submit' => 'إرسال',
 'htmlform-reset' => 'الرجوع عن التغييرات',
 'htmlform-selectorother-other' => 'أخرى',
+'htmlform-no' => 'لا',
+'htmlform-yes' => 'نعم',
+'htmlform-chosen-placeholder' => 'اختر',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 بدعم البحث في كامل النص',
 'sqlite-no-fts' => '$1 بدون دعم البحث في كامل النص',
 
 # New logging system
-'logentry-delete-delete' => '$1 حذف الصفحة $3',
-'logentry-delete-restore' => 'استعاد $1 صفحة $3',
-'logentry-delete-event' => '$1 غير خاصية العرض لـ {{PLURAL:$5|مدخل السجل|$5 مدخلات السجل}} في $3: $4',
-'logentry-delete-revision' => 'غيّر $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4',
-'logentry-delete-event-legacy' => 'غيّر $1 إمكانية رؤية أحداث سجل $3',
-'logentry-delete-revision-legacy' => 'غيّر $1 إمكانية رؤية مراجعات صفحة $3',
-'logentry-suppress-delete' => '$1 suppressed صفحة $3',
-'logentry-suppress-event' => 'غيّر $1 بسرية إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4',
-'logentry-suppress-revision' => 'غيّر $1 بسرية إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4',
-'logentry-suppress-event-legacy' => 'غيّر $1 بسرية إمكانية رؤية أحداث سجل $3',
-'logentry-suppress-revision-legacy' => 'غيّر $1 بسرية إمكانية رؤية مراجعات صفحة $3',
+'logentry-delete-delete' => '{{GENDER:$2|حذف|حذفت}} $1 صفحة $3',
+'logentry-delete-restore' => '{{GENDER:$2|استعاد|استعادت}} $1 صفحة $3',
+'logentry-delete-event' => '{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4',
+'logentry-delete-revision' => 'غيّر{{GENDER:$2||ت}} $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4',
+'logentry-delete-event-legacy' => '{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية رؤية أحداث في سجل $3',
+'logentry-delete-revision-legacy' => '{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية رؤية مراجعات من صفحة $3',
+'logentry-suppress-delete' => '{{GENDER:$2|أخفى|أخفت}} $1 صفحة $3',
+'logentry-suppress-event' => 'غيّر{{GENDER:$2||ت}} $1 بسرية إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4',
+'logentry-suppress-revision' => 'غيّر{{GENDER:$2||ت}} $1 سراً إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4',
+'logentry-suppress-event-legacy' => '{{GENDER:$2|غيّر|غيّرت}} $1 علانية سِجِلّ $3',
+'logentry-suppress-revision-legacy' => '{{GENDER:$2|غيّر|غيّرت}} $1 علانية مراجعات صفحة $3',
 'revdelete-content-hid' => 'محتوى مخفي',
 'revdelete-summary-hid' => 'ملخص التحرير مخفي',
 'revdelete-uname-hid' => 'اسم المستخدم مخفي',
@@ -4352,20 +4395,20 @@ $5
 'revdelete-uname-unhid' => 'اسم المستخدم غير مخفي',
 'revdelete-restricted' => 'طبق الضوابط لمديري النظام',
 'revdelete-unrestricted' => 'أزال الضوابط لمديري النظام',
-'logentry-move-move' => 'نقل $1 صفحة $3 إلى $4',
-'logentry-move-move-noredirect' => 'نقل $1 صفحة $3 إلى $4 دون ترك تحويلة',
-'logentry-move-move_redir' => 'نقل $1 صفحة $3 إلى التحويلة $4',
-'logentry-move-move_redir-noredirect' => 'نقل $1 صفحة $3 إلى التحويلة $4 دون ترك تحويلة',
-'logentry-patrol-patrol' => '$1 مراجعة معلمة $4 للصفحة $3 تم معاينتها',
-'logentry-patrol-patrol-auto' => '$1 مراجعة معلمة تلقائيا $4 للصفحة $3 تم مراجعتها',
-'logentry-newusers-newusers' => 'تم إنشاء الحساب $1',
-'logentry-newusers-create' => 'تم إنشاء الحساب $1',
-'logentry-newusers-create2' => 'Ø£Ù\86شأ $1 Ø§Ù\84حساب $3',
+'logentry-move-move' => '{{GENDER:$2|نقل|نقلت}} $1 صفحة $3 إلى $4',
+'logentry-move-move-noredirect' => '{{GENDER:$2|نقل|نقلت}} $1 صفحة $3 إلى $4 دون ترك تحويلة',
+'logentry-move-move_redir' => '{{GENDER:$2|نقل|نقلت}} $1 صفحة $3 إلى $4 على تحويلة',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$2|نقل|نقلت}} $1 صفحة $3 إلى $4 على تحويلة دون ترك تحويلة',
+'logentry-patrol-patrol' => '{{GENDER:$2|عاين|عاين}} $1 المراجعة $4 للصفحة $3',
+'logentry-patrol-patrol-auto' => '{{GENDER:$2|عاين|عاينت}} $1 تلقائيا المراجعة $4 للصفحة $3',
+'logentry-newusers-newusers' => 'تم فتح حساب {{GENDER:$2|المستخدم|المستخدمة}} $1',
+'logentry-newusers-create' => 'تم فتح حساب {{GENDER:$2|المستخدم|المستخدمة}} $1',
+'logentry-newusers-create2' => 'Ø£Ù\86شأ $1 Ø­Ø³Ø§Ø¨Ø§ {{GENDER:$2|Ù\84Ù\84Ù\85ستخدÙ\85\84Ù\84Ù\85ستخدÙ\85Ø©}} $3',
 'logentry-newusers-byemail' => 'ُ{{GENDER:$2|أنشأ|أنشأت}} $1 حساب المستخدم $3 وأُرسلت كلمة السر بالبريد الإلكتروني',
-'logentry-newusers-autocreate' => 'أنشئ حساب $1 تلقائياً',
-'logentry-rights-rights' => 'غير $1 صلاحيات $3 من $4 إلى $5',
-'logentry-rights-rights-legacy' => 'غير $1 صلاحيات $3',
-'logentry-rights-autopromote' => 'تمت ترقية $1 تلقائياً من  $4 إلى $5',
+'logentry-newusers-autocreate' => 'أنشئ حساب {{GENDER:$2|المستخدم|المستخدمة}} $1 تلقائيًا',
+'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',
 'rightsnone' => '(لا شيء)',
 
 # Feedback
index 03416b1..28619a6 100644 (file)
@@ -159,6 +159,7 @@ $messages = array(
 'tog-watchlisthideanons' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܕܡܦܠܚܢ̈ܐ ܠܐ ܝܕ̈ܝܥܐ ܡܢ ܪ̈ܗܝܬܐ',
 'tog-ccmeonemails' => 'ܫܕܪ ܠܝ ܨܚܚ̈ܐ ܕܒܝܠܕܪ̈ܐ ܐܠܩܛܪ̈ܘܢܝܐ ܕܫܕܪ ܐܢܐ ܠܡܦܠܚܢ̈ܐ ܐܚܪ̈ܢܐ',
 'tog-showhiddencats' => 'ܚܘܝ ܣܕܪ̈ܐ ܛܘܫܝ̈ܐ',
+'tog-useeditwarning' => 'ܙܗܪ ܠܝ ܐܡܬܝ ܫܒܩ ܐܢܐ ܦܐܬܐ ܕܫܘܚܠܦܐ ܕܐܝܬ ܒܗ ܫܘܚܠܦ̈ܐ ܠܐ ܠܒܝܟ̈ܐ',
 
 'underline-always' => 'ܐܡܝܢ',
 'underline-never' => 'ܠܐ ܡܡܬܘܡ',
@@ -287,7 +288,7 @@ $messages = array(
 'edit' => 'ܫܚܠܦ',
 'create' => 'ܒܪܝ',
 'editthispage' => 'ܫܚܠܦ ܦܐܬܐ ܗܕܐ',
-'create-this-page' => 'Ü\92ܪÜ\9d Ü¦Ü\90ܬÜ\90 Ü\97Ü\95ܐ',
+'create-this-page' => 'Ü\92ܪÜ\9d Ü\97Ü\95Ü\90 Ü¦Ü\90ܬܐ',
 'delete' => 'ܫܘܦ',
 'deletethispage' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
 'undelete_short' => 'ܠܐ ܫܘܦ {{PLURAL:$1|ܚܕ ܫܘܚܠܦܐ|$1 ܫܘܚܠܦ̈ܐ}}',
@@ -432,6 +433,7 @@ $1',
 ܡܨܬ ܐܦܠܚܬ {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܬ ܕ<span class='plainlinks'>[$1 ܬܥܘܠ]</span> ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
 
 ܚܕ ܟܡܐ ܡܢ ܦܐܬܬ̈ܐ ܡܬܚܙܝܢ ܐܝܟ ܕܗܘ ܐܢܬ ܥܠܝܠܐ ܐܝܬܝܟ ܥܕܡܐ ܕܐܣܦܩܬ ܠܦܐܬܬ̈ܐ ܠܒܝܟܬ̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ.",
+'welcomeuser' => 'ܒܫܝܢܐ $1!',
 'yourname' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'yourpassword' => 'ܡܠܬܐ ܕܥܠܠܐ:',
 'yourpasswordagain' => 'ܟܬܘܒ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܬܐ ܐܚܪܬܐ:',
@@ -490,7 +492,6 @@ $1',
 # Special:PasswordReset
 'passwordreset' => 'ܣܘܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
 'passwordreset-legend' => 'ܣܘܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ',
-'passwordreset-pretext' => '{{PLURAL:$1||ܐܥܠ ܚܕ ܡܢ ܡܢܘܬ̈ܐ ܕܝܕ̈ܥܬܐ ܠܬܬܚܬ}}',
 'passwordreset-username' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'passwordreset-domain' => 'ܪܘܚܬܐ:',
 'passwordreset-email' => 'ܡܘܢܥܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
@@ -534,8 +535,8 @@ $1',
 'accmailtitle' => 'ܡܠܬܐ ܕܥܠܠܐ ܫܕܪܬ',
 'newarticle' => '(ܚܕܬܐ)',
 'newarticletext' => "ܐܬܬ ܒܬܪ ܐܣܪܐ ܕܦܐܬܐ ܕܠܐ ܐܬܬܣܝܡܬ ܥܕܡܫ.
-ܠܣܘܝܡܐ ܕܦܐܬܐ ܗܕܐ, ܫܪܝ ܠܟܬܒܬܐ ܒܣܢܕܘܩܐ ܠܬܚܬ (ܚܙܝ [[{{MediaWiki:Helppage}}|ܦܐܬܐ ܕܥܘܕܪܢܐ]] ܠܐܚܪܢܐ ܝܕ̈ܥܬܐ).
-ܐܢ ܐܬܬ ܠܗܪܟܐ ܦܘܕܐܝܬ, ܕܘܫ ܠܦܪܡܝܬܐ ܕ '''ܠܒܣܬܪ back''' ܒܡܦܐܬܢܐ ܕܝܠܟ.",
+ܠܣܘܝܡܐ ܕܦܐܬܐ ܗܕܐ، ܫܪܝ ܠܟܬܒܬܐ ܒܣܢܕܘܩܐ ܠܬܚܬ (ܚܙܝ [[{{MediaWiki:Helppage}}|ܦܐܬܐ ܕܥܘܕܪܢܐ]] ܠܐܚܪܢܐ ܝܕ̈ܥܬܐ).
+ܐܢ ܐܬܬ ܠܗܪܟܐ ܦܘܕܐܝܬ، ܟܒܘܫ ܥܠ ܦܪܡܝܬܐ ܕ '''ܠܒܣܬܪ back''' ܒܡܦܐܬܢܐ ܕܝܠܟ.",
 'updated' => '(ܐܬܚܕܬ)',
 'note' => "'''ܡܥܝܪܢܘܬܐ:'''",
 'previewnote' => "'''ܕܟܪ ܕܗܢܘ ܚܝܪܐ ܩܕܡܝܐ ܒܠܚܘܕ'''.
@@ -559,6 +560,8 @@ $1',
 'log-fulllog' => 'ܚܙܝ ܣܓܠܐ ܓܡܝܪܐ',
 'edit-already-exists' => 'ܒܪܝܐ ܕܦܐܬܐ ܚܕܬܐ ܠܐ ܡܬܡܨܝܢܐ.
 ܗܕܐ ܦܐܬܐ ܐܝܬ ܡܢ ܟܕܘ.',
+'editwarning-warning' => 'ܐܢ ܫܒܩܬ ܦܐܬܐ ܗܕܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗ ܕܚܣܪܬ ܟܠ ܫܘܚܠܦ̈ܐ ܕܥܒܝܕܬ ܗܪܟܐ.
+ܡܨܬ ܕܬܒܛܠ ܙܘܗܪܐ ܗܢܐ ܐܢ ܥܠܝܠܐ ܐܝܬܝܟ ܒܡܢܬܐ ܕ"ܫܚܠܦܬܐ" ܒܨܒܝܢܝܘܬ̈ܐ.',
 
 # "Undo" feature
 'undo-summary' => 'ܠܐ ܬܥܒܕ $1 ܒܝܕ [[Special:Contributions/$2|$2]] ([[User talk:$2|ܡܡܠܠܐ]])',
@@ -702,9 +705,6 @@ $1',
 'powersearch-togglenone' => 'ܠܐ ܡܕܡ',
 'search-external' => 'ܒܨܝܐ ܒܪܝܐ',
 
-# Quickbar
-'qbsettings-none' => 'ܠܐ ܡܕܡ',
-
 # Preferences page
 'preferences' => 'ܨܒܝܢܝܘܬ̈ܐ',
 'mypreferences' => 'ܨܒܝܢܝܘܬ̈ܐ',
@@ -873,6 +873,7 @@ $1',
 'recentchanges-label-newpage' => 'ܫܘܚܠܦܐ ܗܢܐ ܐܬܬܣܝܡ ܦܐܬܐ ܚܕܬܐ',
 'recentchanges-label-minor' => 'ܗܢܘ ܫܘܚܠܦܐ ܙܥܘܪܐ',
 'recentchanges-label-bot' => 'ܒܘܬ (bot) ܥܒܕ ܗܢܐ ܫܘܚܠܦܐ',
+'recentchanges-label-unpatrolled' => 'ܫܘܚܠܦܐ ܗܢܐ ܠܐ ܗܘ ܟܪܝܟܐ ܠܗܫܐ',
 'rcnotefrom' => "ܠܬܚܬ ܫܘܚܠܦ̈ܐ ܕܡܢ '''$2''' (ܥܕ '''$1''' ܡܬܚܙܝܢ̈ܐ).",
 'rclistfrom' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $1',
 'rcshowhideminor' => '$1 ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ',
@@ -889,6 +890,8 @@ $1',
 'minoreditletter' => 'ܙ',
 'newpageletter' => 'ܚ',
 'boteditletter' => 'ܒ',
+'rc_categories_any' => 'ܐܝܢܐ ܕܗܘ',
+'rc-change-size-new' => '$1 {{PLURAL:$1|ܒܐܝܛ|ܒܐܝܛ̈ܐ}} ܒܬܪ ܫܘܚܠܦܐ',
 'newsectionsummary' => '/* $1 */ ܡܢܬܐ ܚܕܬܐ',
 'rc-enhanced-expand' => 'ܚܘܝ ܐܪ̈ܝܟܬܐ (ܒܥܐ ܠܟ JavaScript)',
 'rc-enhanced-hide' => 'ܛܫܝ ܐܪ̈ܝܟܬܐ',
@@ -951,6 +954,9 @@ $1',
 'upload_source_file' => ' (ܠܦܦܐ ܥܠ ܚܫܘܒܬܐ ܕܝܠܟ)',
 
 # Special:ListFiles
+'listfiles-summary' => 'ܦܐܬܐ ܕܝܠܢܝܬܐ ܗܕܐ ܬܓܠܚ ܟܠ ܠܦܦ̈ܐ ܡܣܩ̈ܐ.
+ܐܡܬܝ ܕܬܨܦܐ ܒܝܕ ܡܦܠܚܢܐ ܬܓܠܚ ܨܚܚܐ ܐܚܪܝܐ ܒܠܚܘܕ ܕܠܦܦ̈ܐ ܡܣܩ̈ܐ ܒܝܕ ܗܢܐ ܡܦܠܚܢܐ.',
+'listfiles_search_for' => 'ܒܨܝ ܥܠ ܫܡܐ ܕܡܝܕܝܐ:',
 'imgfile' => 'ܠܦܦܐ',
 'listfiles' => 'ܡܟܬܒܘܬܐ ܕܠܦܦ̈ܐ',
 'listfiles_thumb' => 'ܙܘܥܪܐ',
@@ -1038,6 +1044,11 @@ $1',
 'disambiguations' => 'ܦܐܬܬ̈ܐ ܐܣܝܪ̈ܬܐ ܒܦܐܬܬ̈ܐ ܕܬܘܚܡܐ ܐܚܪܢܐ',
 'disambiguationspage' => 'Template:ܬܘܚܡܐ ܐܚܪܢܐ',
 
+'pageswithprop' => 'ܦܐܬܬ̈ܐ ܥܡ ܕܝܠܝܬܐ ܕܦܐܬܐ',
+'pageswithprop-legend' => 'ܦܐܬܬ̈ܐ ܥܡ ܕܝܠܝܬܐ ܕܦܐܬܐ',
+'pageswithprop-prop' => 'ܫܡܐ ܕܕܝܠܝܬܐ',
+'pageswithprop-submit' => 'ܙܠ',
+
 'doubleredirects' => 'ܨܘܝܒ̈ܐ ܥܦܝܦ̈ܐ',
 'double-redirect-fixed-move' => '[[$1]] ܐܫܬܢܝܬ.
 ܗܫܐ ܐܝܬܝܗܝ  ܨܘܝܒܐ ܠ [[$2]].',
@@ -1229,7 +1240,7 @@ $1',
 'unwatchthispage' => 'ܟܠܝ ܪܗܝܐ',
 'watchnochange' => 'ܐܦܠܐ ܚܕ ܡܢ ܦܐܬܬ̈ܐ ܒܪ̈ܗܝܬܟ ܐܫܬܚܠܦܬ ܒܡܬܚܐ ܕܙܒܢܐ ܓܠܝܚܐ.',
 'watchlist-details' => '{{PLURAL:$1|$1 ܦܐܬܐ|$1 ܦܐܬܬ̈ܐ}} ܒܪ̈ܗܝܬܟ, ܫܒܘܩ ܡܢ ܦܐܬܬ̈ܐ ܕܡܡܠܠܐ.',
-'wlheader-showupdated' => "ܦܐܬܬ̈ܐ ܕܐܫܬܚܠܦܢ ܡܢ ܒܬܪ ܣܘܥܪܢܟ ܐܚܪܝܐ ܡܬܓܠܚܢ ܒܣܪܛܐ '''ܚܠܝܡܐ'''",
+'wlheader-showupdated' => "ܦܐܬܬ̈ܐ ܕܐܫܬܚܠܦܢ ܡܢ ܒܬܪ ܣܘܥܪܢܟ ܐܚܪܝܐ ܡܬܓܠܚܢ ܒܣܪܛܐ '''ܚܠܝܡܐ'''",
 'wlnote' => "ܠܬܚܬ {{PLURAL:$1|ܫܘܚܠܦܐ ܐܚܪܝܐ| '''$1''' ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ}} {{PLURAL:$2|ܒܫܥܬܐ ܐܚܪܝܬܐ|'''$2''' ܒܫܥܬ̈ܐ ܐܚܪ̈ܝܬܐ}}, ܠܦܘܬ $3, $4.",
 'wlshowlast' => 'ܚܘܝ $1 ܫܥܬ̈ܐ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ $3',
 'watchlist-options' => 'ܨܒܝܢܝܘܬ̈ܐ ܕܪ̈ܗܝܬܐ',
@@ -1343,7 +1354,7 @@ $1',
 'blanknamespace' => '(ܪܫܝܬܐ)',
 
 # Contributions
-'contributions' => 'ܫܘܬܦܘ̈ܬܐ ܕܡܦܠܚܢܐ',
+'contributions' => 'ܫܘܬܦܘ̈ܬܐ {{GENDER:$1|ܕܡܦܠܚܢܐ|ܕܡܦܠܚܢܬܐ}}',
 'contributions-title' => 'ܫܘܬܦܘ̈ܬܐ ܕܡܦܠܚܢܐ ܠ$1',
 'mycontris' => 'ܫܘܬܦܘ̈ܬܐ',
 'contribsub2' => 'ܕ $1 ($2)',
@@ -1425,6 +1436,9 @@ $1',
 'contribslink' => 'ܫܘܬܦܘ̈ܬܐ',
 'blocklogpage' => 'ܣܓܠܐ ܕܚܪܡܐ',
 'blocklogentry' => 'ܚܪܡ [[$1]] ܠܡܬܚܐ ܕ $2 $3',
+'blocklogtext' => 'ܗܢܘ ܣܓܠܐ ܕܥܡܠܝܬ̈ܐ ܕܚܪܡܐ ܘܫܩܠ ܚܪܡܐ.
+ܡܘܢܥ̈ܐ ܕܐܝ ܦܝ (IP) ܚܪ̈ܝܡܐ ܝܬܐܝܬ ܠܐ ܓܠܝܚܝܢ ܐܢܘܢ.
+ܚܙܝ [[Special:BlockList|ܡܟܬܒܘܬܐ ܕܚܪܡܐ ܕܐܝ ܦܝ (IP)]]ܠܚܙܝܐ ܕܥܡܠܝܬ̈ܐ ܕܚܪܡܐ ܬܘܦܥܠ̈ܐ ܗܫܐܝܬ.',
 'unblocklogentry' => 'ܫܩܠ ܚܪܡܐ ܡܢ $1',
 'block-log-flags-anononly' => 'ܡܦܠܚܢ̈ܐ ܠܐ ܝܕ̈ܝܥܐ ܒܠܚܘܕ',
 'block-log-flags-nocreate' => 'ܒܪܝܬܐ ܕܚܘ̈ܫܒܢܐ ܠܐ ܐܝܬܝܗ ܡܬܩܒܠܢܐ',
@@ -1628,7 +1642,7 @@ $1',
 'metadata-expand' => 'ܚܘܝ ܐܪ̈ܝܟܬܐ ܪ̈ܘܝܚܬܐ',
 'metadata-collapse' => 'ܛܫܝ ܐܪ̈ܝܟܬܐ ܪ̈ܘܝܚܬܐ',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ܦܬܘܐ',
 'exif-imagelength' => 'ܐܘܪܟܐ',
 'exif-xresolution' => 'ܢܩܕܘܬܐ ܐܘܦܩܝܬܐ',
@@ -1758,11 +1772,6 @@ $1',
 'version-poweredby-others' => 'ܐܚܪ̈ܢܐ',
 'version-software-version' => 'ܨܚܚܐ',
 
-# Special:FilePath
-'filepath' => 'ܫܒܝܠܐ ܕܠܦܦܐ',
-'filepath-page' => 'ܠܦܦܐ',
-'filepath-submit' => 'ܙܠ',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ܒܨܝ ܥܠ ܠܦܦ̈ܐ ܥܦܝܦ̈ܐ',
 'fileduplicatesearch-legend' => 'ܒܨܝܐ ܥܠ ܥܘܦܦܐ',
@@ -1795,7 +1804,11 @@ $1',
 'tag-filter' => 'ܡܨܦܝܢܝܬܐ ܕ[[Special:Tags|ܪܘܫܡܐ]]:',
 'tag-filter-submit' => 'ܡܨܦܝܢܝܬܐ',
 'tags-title' => 'ܪ̈ܘܫܡܐ',
+'tags-intro' => 'ܦܐܬܐ ܗܕܐ ܬܓܠܚ ܪ̈ܘܫܡܐ ܕܬܚܪܙܬܐ ܪܒܬ ܫܘܕܥ ܫܘܚܠܦܐ ܒܗ، ܘܣܘܟܠܝܗܝܢ.',
 'tags-tag' => 'ܫܡܐ ܕܪܘܫܡܐ',
+'tags-display-header' => 'ܡܬܓܠܝܢܘܬܐ ܒܡܟܬܒܘܬ̈ܐ ܕܫܘܚܠܦܐ',
+'tags-description-header' => 'ܫܘܡܗܐ ܓܡܝܪܐ ܕܣܘܟܠܐ',
+'tags-hitcount-header' => 'ܫܘܚܠܦ̈ܐ ܪ̈ܫܝܡܐ',
 'tags-edit' => 'ܫܚܠܦ',
 'tags-hitcount' => '$1 {{PLURAL:$1|ܫܘܚܠܦܐ|ܫܘܚܠܦ̈ܐ}}',
 
@@ -1814,17 +1827,17 @@ $1',
 'htmlform-selectorother-other' => 'ܐܚܪܢܐ',
 
 # New logging system
-'logentry-delete-delete' => '$1 ܫܦ ܦܐܬܐ ܕ $3',
-'logentry-move-move' => '$1 ܫܢܐ ܦܐܬܐ ܕ $3 ܠ $4',
-'logentry-move-move-noredirect' => '$1 ܫܢܐ ܦܐܬܐ ܕ $3 ܠ $4 ܕܠܐ ܫܒܩܐ ܦܐܬܐ ܕܨܘܝܒܐ',
-'logentry-move-move_redir' => '$1 ܫܢܐ ܦܐܬܐ ܕ $3 ܠ $4 ܕܐܝܬܘܗܝ ܦܐܬܐ ܕܨܘܝܒܐ',
-'logentry-move-move_redir-noredirect' => '$1 ܫܢܐ ܦܐܬܐ ܕ $3 ܠ $4 ܕܐܝܬܘܗܝ ܦܐܬܐ ܕܨܘܝܒܐ ܘܕܠܐ ܫܒܩܐ ܦܐܬܐ ܕܨܘܝܒܐ',
-'logentry-patrol-patrol' => '$1 ܫܘܕܥ ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
-'logentry-patrol-patrol-auto' => '$1 ܝܬܐܝܬ ܫܘܕܥ ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
-'logentry-newusers-newusers' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 ܐܬܬܟܝܢ',
-'logentry-newusers-create' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 ܐܬܬܟܝܢ',
-'logentry-newusers-create2' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3 ܐܬܬܟܝܢ ܒܝܕ $1',
-'logentry-newusers-autocreate' => 'ܚܘܫܒܢܐ $1 ܐܬܒܪܝ ܝܬܐܝܬ',
+'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-move-move_redir-noredirect' => '$1 {{GENDER:$2|ܫܢܐ}} ܦܐܬܐ ܕ $3 ܠ $4 ܕܐܝܬܘܗܝ ܦܐܬܐ ܕܨܘܝܒܐ ܘܠܐ ܫܒܩ ܦܐܬܐ ܕܨܘܝܒܐ',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|ܫܘܕܥ}} ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
+'logentry-patrol-patrol-auto' => '$1 ܝܬܐܝܬ {{GENDER:$2|ܫܘܕܥ}} ܬܢܝܬܐ $4 ܕܦܐܬܐ $3 ܟܪܝܟܬܐ',
+'logentry-newusers-newusers' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 {{GENDER:$2|ܐܬܬܟܝܢ}}',
+'logentry-newusers-create' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 {{GENDER:$2|ܐܬܬܟܝܢ}}',
+'logentry-newusers-create2' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3 {{GENDER:$2|ܐܬܬܟܝܢ}} ܒܝܕ $1',
+'logentry-newusers-autocreate' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 {{GENDER:$2|ܐܬܬܣܝܡ}} ܝܬܐܝܬ',
 'rightsnone' => '(ܠܐ ܡܕܡ)',
 
 # Feedback
index 7ece867..fd69d9e 100644 (file)
@@ -636,7 +636,7 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
 # Special:ListGroupRights
 'listgrouprights-members' => '(koneltulu kellufe ñi wif)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Amulün werküwe tüfachi kellufe',
 'emailsubject' => 'Dungu',
 'emailmessage' => 'Dungu',
@@ -888,7 +888,7 @@ Ka dungu ellkangeay wünedullin reke.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-artist' => 'Che llitun mew',
 'exif-exposuretime-format' => '$1 sek ($2)',
 
index c8eb750..73fb16f 100644 (file)
@@ -46,8 +46,6 @@ $messages = array(
 'tog-shownumberswatching' => 'biyn aadad lmostakhdimin lmoraqibin',
 'tog-oldsig' => 'moaayana litawqia lmawjod',
 'tog-fancysig' => 'aaml nass bhal nass wiki (bla wsla otomatikia)',
-'tog-externaleditor' => 'stakhdm moharrir khariji iftiradiyan(faqat lilkhobaraa, kaybghi iaadadat khassa f lordinator dyalk)',
-'tog-externaldiff' => 'stakhdm farq khariji iftiradiyan(faqat lilkhobaraa, kaybghi iaadadat khassa f lordinator dyalk)',
 'tog-showjumplinks' => 'mkkn wassalat "sir l" lmossaaida',
 'tog-uselivepreview' => 'staml listiarad saria (khasso javascipt) (tjribi)',
 'tog-forceeditsummary' => 'nbhni ila kandkhl molkhass taadil khawi',
@@ -976,15 +974,6 @@ Jerreb be l-préfiks \"all:\" baċ ṫqelleb ĝla l-meḍmon kollo (o ḫṫa 
 Imken lik ṫqeleb fe google.
 Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫin.',
 
-# Quickbar
-'qbsettings' => "L-lawḫa 's-sariĝa",
-'qbsettings-none' => 'Ma kaynċ',
-'qbsettings-fixedleft' => "Meḫbos fe 'ċ-ċmal",
-'qbsettings-fixedright' => "Meḫbos fe 'l-limin",
-'qbsettings-floatingleft' => "Ḫor fe 'ċ-ċmal",
-'qbsettings-floatingright' => "Ḫor fe 'l-limen",
-'qbsettings-directionality' => 'ṫabṫ, ĝla ḫasab ṫṫijah l-kṫaba b-loġṫk',
-
 # Preferences page
 'preferences' => 'ṫfḍilaṫ',
 'mypreferences' => 'Ḫajaṫ li kanfeḍḍel',
@@ -1374,7 +1363,6 @@ $1',
 'http-read-error' => "khata' qira'at HTTP.",
 'http-timed-out' => 'salat moddat mohlat talab dyal HTTp.',
 'http-curl-error' => "khata' f jalb lmassar: $1",
-'http-host-unreachable' => 'manqdroch nwslo l had lmassar.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'manqdroch nwslo l had lmassar.',
@@ -1676,8 +1664,8 @@ L-Kṫaba dyal had ṣ-ṣefḫa ġaṫban '''ġliḍa''' fe [[Special:RecentCha
 'unwatchthispage' => 'hiyd mn list dyal s-suivi dyali',
 'notanarticle' => 'Hadi maċi ṣefḫaṫ meḍmon',
 'watchlist-details' => '{{PLURAL:$1|ṣefḫa weḫda|$1 de ṣ-ṣefḫaṫ}} kaynin fe l-lista dyal s-suivi dyalṫek, bla ma nḫesbo ṣ-ṣefḫaṫ dyal n-niqaċ.',
-'wlheader-enotif' => 'l-iĝlam bl-email mtloq.',
-'wlheader-showupdated' => "ṣ-ṣfaḫi lli ṫġyyeraṫ mn aĥir ẓiyaṛa ṫaĝk mkṫoba b-ĥatt '''ġliḍ'''",
+'wlheader-enotif' => 'l-iĝlam bl-email mtloq.',
+'wlheader-showupdated' => "ṣ-ṣfaḫi lli ṫġyyeraṫ mn aĥir ẓiyaṛa ṫaĝk mkṫoba b-ĥatt '''ġliḍ'''",
 'iteminvalidname' => "moċkil mĝa l-madda '$1', smia ma ṣḫiḫa-ċ...",
 'wlshowlast' => 'Werri  l-$1 de s-swayeĝ o l-$2 iyam l-leĥĥrin, ola werri $3',
 'watchlist-options' => 'Lé-Opsyon de l-lista dyal s-suivi',
@@ -2167,8 +2155,6 @@ L-lyanaṫ l-ĥrin l-li fe nefs ṣ-ṣter ka-nĝṫabrohom bḫal sṫiṫna'a
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'Kṫaba',
@@ -2222,7 +2208,7 @@ Ila ṫbeddel l-fiċyé men ḫalṫo l-'aṣliya, kaynin ċi ṫafaṣil ma mna
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'laard',
 'exif-imagelength' => 'lirtifaa',
 'exif-bitspersample' => 'bit lkol mokawwin',
@@ -2626,11 +2612,6 @@ jrreb l-ĝṛḍ l-ĝadi.',
 'version-software-product' => 'lmntoj',
 'version-software-version' => 'noskha',
 
-# Special:FilePath
-'filepath' => 'massar lfichier',
-'filepath-page' => 'mileff:',
-'filepath-submit' => 'Sir',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'qlleb ĝla milffaṫ mḍoḅla',
 'fileduplicatesearch-summary' => 'qlleb ĝla milffaṫ mḍoḅla ĝla asas l-qyam dl-haċ.',
index 35e7368..46bf2f8 100644 (file)
@@ -333,8 +333,6 @@ $messages = array(
 'tog-shownumberswatching' => 'بين عدد اليوزرز المراقبين',
 'tog-oldsig' => 'الامضا دلوقتى:',
 'tog-fancysig' => 'امضا خام (من غير لينك أوتوماتيك)',
-'tog-externaleditor' => 'استخدم محرر خارجى بشكل افتراضى (للخبرا بس، يحتاج إعدادات خاصة على كومبيوترك) ([//www.mediawiki.org/wiki/Manual:External_editors لمزيد من المعلومات].)',
-'tog-externaldiff' => 'استخدم فرق خارجى بشكل افتراضى (للخبرا بس، يحتاج إعدادات خاصة على كومبيوترك) ([//www.mediawiki.org/wiki/Manual:External_editors لمعلومات اكتر].)',
 'tog-showjumplinks' => 'خلى وصلات "روح لـ" تكون شغالة.',
 'tog-uselivepreview' => 'استخدم البروفة السريعة (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهنى عند تدخيل ملخص للتعديل  فاضي',
@@ -349,6 +347,7 @@ $messages = array(
 'tog-showhiddencats' => 'بين التّصنيفات المستخبية',
 'tog-noconvertlink' => 'عطل تحويل عناوين الوصلات',
 'tog-norollbackdiff' => 'الغى الاختلافات بعد ما تعمل الرول باك',
+'tog-useeditwarning' => 'حذّرنى لما اسيب صفحة تعديل فيها تغييرات مش متسييڤه',
 
 'underline-always' => 'دايما',
 'underline-never' => 'ابدا',
@@ -980,6 +979,8 @@ $2',
 'edit-no-change' => 'تعديلك تم تجاهله، لأن ما حصلش أى تعديل للنص.',
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
 هى موجودة بالفعل.',
+'editwarning-warning' => 'لو سيبت الصفحه دى ممكن يخلّيك تضيّع اى تغييرات عملتها.
+لو انت مسجّل دخولك, ممكن تعطّل التحذير ده من الجزء بتاع "تعديل" فى تفضيلاتك.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'تحذير: الصفحه دى فيهااستدعاءات دالة محلل كثيرة مكلفة.
@@ -1245,14 +1246,6 @@ $1",
 ممكن تدور فى جوجل دلوقتي.
 لاحظ أن فهارسه لمحتوى {{SITENAME}} يمكن تكون مش متحدثة.',
 
-# Quickbar
-'qbsettings' => 'البار السريع',
-'qbsettings-none' => 'ما فى ش',
-'qbsettings-fixedleft' => 'متثبت فى الشمال',
-'qbsettings-fixedright' => 'متثبت فى اليمين',
-'qbsettings-floatingleft' => 'عايم على الشمال',
-'qbsettings-floatingright' => 'عايم على اليمين',
-
 # Preferences page
 'preferences' => 'تفضيلات',
 'mypreferences' => 'تفضيلاتى',
@@ -1716,7 +1709,6 @@ PICT # misc.
 'http-read-error' => 'فى غلط فى قراية ال HTTP',
 'http-timed-out' => 'طلب ال HTTP خلص وقته',
 'http-curl-error' => 'حصل غلط و احنا بنجيب الURL : $1',
-'http-host-unreachable' => 'ما قدرناش نوصل لل URL.',
 'http-bad-status' => 'HTTP : حصلت مشكله وقت طلب ال $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2089,7 +2081,7 @@ PICT # misc.
 'watchnochange' => 'مافيش ولا صفحة اتعدلت فى لستة مراقبتك فى الفترة الزمنية اللى حددتها.',
 'watchlist-details' => '{{PLURAL:$1|$1 صفحه|$1 صفحه}} فى قايمه مراقبتك، بدون عد صفحات المناقشه.',
 'wlheader-enotif' => '*خاصية الاعلام بالايميل متفعلة',
-'wlheader-showupdated' => "الصفحات اللى اتغيرت  بعد زيارتك ليها اخر مرة معروضة بالخط '''العريض'''",
+'wlheader-showupdated' => "الصفحات اللى اتغيرت  بعد زيارتك ليها اخر مرة معروضة بالخط '''العريض'''",
 'watchmethod-recent' => 'التشييك على التعديلات الاخيرة للصفحات المتراقبة',
 'watchmethod-list' => 'التشييك فى الصفحات المتراقبة على التعديلات الاخيرة',
 'watchlistcontains' => 'لستة المراقبة بتاعتك فيها $1 {{PLURAL:$1|صفحة|صفحات}}.',
@@ -2318,7 +2310,7 @@ $1',
 'blanknamespace' => '(رئيسى)',
 
 # Contributions
-'contributions' => 'تعديلات اليوزر',
+'contributions' => 'تعديلات اليوزر {{GENDER:$1|اليوزر|اليوزره}}',
 'contributions-title' => 'مساهمات اليوزر ل$1',
 'mycontris' => 'تعديلاتى',
 'contribsub2' => 'لليوزر $1 ($2)',
@@ -2738,27 +2730,16 @@ $1',
 
 # Stylesheets
 'common.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */',
-'standard.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة ستاندرد */',
-'nostalgia.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة نوستالشيا */',
 'cologneblue.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة كولون بلو */',
 'monobook.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مونوبوك */',
-'myskin.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة ماى سكين */',
-'chick.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة تشيك */',
-'simple.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة سيمبل */',
 'modern.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مودرن */',
 'vector.css' => '/* CSS اللى هنا حتأثر على اليوزرز اللى بيستخدموا واجهة فكتور */',
 'print.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */',
-'handheld.css' => '/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على الأجهزة المحمولة بالاعتماد على الواجهة المضبوطة فى $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/*  أى جافاسكريبت  هناح يتحمل لكل اليوزرز مع كل تحميل للصفحة. */',
-'standard.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة ستاندرد */',
-'nostalgia.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة نوستالجيا */',
 'cologneblue.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة كولون بلو */',
 'monobook.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مونوبوك */',
-'myskin.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة ماى سكين */',
-'chick.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة تشيك */',
-'simple.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة سيمبل */',
 'modern.js' => '/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مودرن */',
 'vector.js' => '/* اى جافاسكريبت هنا حتتحمل لكل يوزر بيستخدم واجهة فكتور */',
 
@@ -2787,13 +2768,8 @@ $1',
 'spam_blanking' => 'كل النسخ فيها لينكات ل $1، فضيها',
 
 # Skin names
-'skinname-standard' => 'كلاسيك',
-'skinname-nostalgia' => 'نوستالجيا',
 'skinname-cologneblue' => 'كولون بلو',
 'skinname-monobook' => 'مونوبوك',
-'skinname-myskin' => 'ماى سكين',
-'skinname-chick' => 'تشيك',
-'skinname-simple' => 'سيمبل',
 'skinname-modern' => 'مودرن',
 
 # Patrolling
@@ -2888,7 +2864,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'العرض',
 'exif-imagelength' => 'الطول',
 'exif-bitspersample' => 'بتس لكل مكون',
@@ -3004,7 +2980,7 @@ $1',
 'exif-gpsdatestamp' => 'تاريخ GPS',
 'exif-gpsdifferential' => 'تصحيح GPS التفاضلي',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'مش مضغوط',
 'exif-compression-6' => 'جيه بى إى جي',
 
@@ -3385,13 +3361,6 @@ $5
 'version-software-product' => 'المنتج',
 'version-software-version' => 'النسخه',
 
-# Special:FilePath
-'filepath' => 'مسار ملف',
-'filepath-page' => 'الملف:',
-'filepath-submit' => 'المسار',
-'filepath-summary' => 'الصفحة المخصوصة دى بتعرض المسار الكامل  بتاع ملف.
-الصور بتتعرض  بدقة كاملة، أنواع الملفات التانية ح تشتغل فى البرنامج بتاعهم مباشرة.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'دور على الملفات المتكررة',
 'fileduplicatesearch-summary' => 'دور على الملفات المتكررة على اساس قيمة الهاش بتاعتها.',
index f4f242e..bcd7646 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Assamese (à¦\85সমà§\80à§\9fা)
+/** Assamese (à¦\85সমà§\80য়া)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -183,7 +183,7 @@ $digitGroupingPattern = "##,##,###";
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'সংযোগ সমূহ অধোৰেখিত কৰক:',
+'tog-underline' => 'সংযোগসমূহ অধোৰেখিত কৰক:',
 'tog-justify' => 'দফাৰ সীমা সমান কৰাক',
 'tog-hideminor' => 'সাম্প্ৰতিক সাল-সলনিত অগুৰুত্বপূৰ্ণ সম্পাদনা নেদেখুৱাব',
 'tog-hidepatrolled' => 'সাম্প্ৰতিক সাল-সলনিত তহলদাৰী সম্পাদনা নেদেখুৱাব',
@@ -212,8 +212,6 @@ $messages = array(
 'tog-shownumberswatching' => 'লক্ষ্য কৰি থকা সদস্য সমূহৰ সংখ্যা দেখুৱাওক',
 'tog-oldsig' => 'বৰ্তমানৰ স্বাক্ষৰ:',
 'tog-fancysig' => 'স্বাক্ষৰ ৱিকিটেক্সট হিচাপে ব্যৱহাৰ কৰক (স্বয়ংক্ৰিয় সংযোগ অবিহনে)',
-'tog-externaleditor' => 'ডিফ’ল্ট ভাবে বাহ্যিক সম্পাদন-সঁজুলি ব্যৱহাৰ কৰক (দক্ষ জনৰ বাবেহে, আপোনাৰ কম্পিউটাৰত বিশেষ ব্যৱস্থা থাকিব লাগিব । [//www.mediawiki.org/wiki/Manual:External_editors সবিশেষ ।])',
-'tog-externaldiff' => 'ডিফ’ল্ট ভাবে বাহ্যিক তফাৎ (diff) ব্যৱহাৰ কৰক (দক্ষ জনৰ বাবেহে, আপোনাৰ কম্পিউটাৰত বিশেষ ব্যৱস্থা থাকিব লাগিব । [//www.mediawiki.org/wiki/Manual:External_editors সবিশেষ ।])',
 'tog-showjumplinks' => '"জঁপিয়াই যাওক" সংযোগ সক্ৰিয় কৰক',
 'tog-uselivepreview' => 'সম্পাদনাৰ লগে লগে খচৰা দেখুৱাওক (জাভাস্ক্ৰিপ্টৰ প্ৰয়োজন) (পৰীক্ষামূলক)',
 'tog-forceeditsummary' => 'সম্পাদনাৰ সাৰাংশ নিদিলে মোক জনাব',
@@ -227,6 +225,7 @@ $messages = array(
 'tog-diffonly' => 'পার্থক্যৰ তলত পৃষ্ঠাৰ বিষয়বস্তু নেদেখুৱাব',
 'tog-showhiddencats' => 'নিহিত শ্ৰেণী সমূহ দেখুৱাওক',
 'tog-norollbackdiff' => 'পূৰ্বৱত কৰা পাছত পাৰ্থক্য নেদেখুৱাব',
+'tog-useeditwarning' => 'সালসলনি সংৰক্ষণ নকৰাকৈ সম্পাদনা পৃষ্ঠা ত্যাগৰ সময়ত মোক সাৱধান কৰক',
 
 'underline-always' => 'সদায়',
 'underline-never' => 'কেতিয়াও নহয়',
@@ -240,14 +239,14 @@ $messages = array(
 'editfont-serif' => 'চেৰিফ ফন্ট',
 
 # Dates
-'sunday' => 'দà§\87à¦\93à¦\81বাৰ',
+'sunday' => 'দেওবাৰ',
 'monday' => 'সোমবাৰ',
 'tuesday' => 'মঙ্গলবাৰ',
 'wednesday' => 'বুধবাৰ',
 'thursday' => 'বৃহস্পতিবাৰ',
 'friday' => 'শুক্ৰবাৰ',
 'saturday' => 'শণিবাৰ',
-'sun' => 'দেও',
+'sun' => 'দেও',
 'mon' => 'সোম',
 'tue' => 'মংগল',
 'wed' => 'বুধ',
@@ -282,7 +281,7 @@ $messages = array(
 'feb' => 'ফেব্ৰুৱাৰী:',
 'mar' => 'মাৰ্চ',
 'apr' => 'এপ্ৰিল',
-'may' => 'মে',
+'may' => "মে'",
 'jun' => 'জুন',
 'jul' => 'জুলাই',
 'aug' => 'আগষ্ট',
@@ -290,6 +289,18 @@ $messages = array(
 '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',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|শ্ৰেণী|শ্ৰেণীসমূহ}}',
@@ -358,16 +369,16 @@ $messages = array(
 'searchbutton' => 'সন্ধান কৰক',
 'go' => 'যাওক',
 'searcharticle' => 'যাওক',
-'history' => 'à¦\96তিয়ান',
-'history_short' => 'à¦\96তিয়ান',
-'updatedmarker' => 'মà§\8bৰ à¦¶à§\87হতà§\80য়া à¦\86à¦\97মনৰ à¦ªà¦¾à¦\9bৰ à¦ªà§°à¦¿à§±à§°à§\8dতনবিলাà¦\95',
-'printableversion' => 'পà§\8dৰà¦\95াশনযà§\8bà¦\97à§\8dয à¦¸à¦\82সà§\8dà¦\95ৰন',
+'history' => 'পà§\83ষà§\8dঠা à¦\87তিহাস',
+'history_short' => 'à¦\87তিহাস',
+'updatedmarker' => 'মà§\8bৰ à¦¶à§\87হতà§\80য়া à¦ªà§°à¦¿à¦¦à§°à§\8dশনৰ à¦ªà¦¾à¦\9bৰ à¦¸à¦¾à¦²à¦¸à¦²à¦¨à¦¿à¦¬à§\8bৰ',
+'printableversion' => 'পà§\8dৰà¦\95াশযà§\8bà¦\97à§\8dয à¦¸à¦\82সà§\8dà¦\95ৰণ',
 'permalink' => 'স্থায়ী সূত্ৰ (লিংক)',
 'print' => 'প্ৰিণ্ট কৰিবলৈ',
 'view' => 'দেখুৱাওক',
 'edit' => 'সম্পাদনা',
 'create' => 'সৃষ্টি কৰক',
-'editthispage' => 'বৰ্তমান পৃষ্ঠাটো সম্পাদন কৰিবলৈ',
+'editthispage' => 'বৰ্তমান পৃষ্ঠাটো সম্পাদন কৰিবলৈ',
 'create-this-page' => 'নতুন পৃষ্ঠা সৃষ্টি কৰক',
 'delete' => 'বিলোপ',
 'deletethispage' => 'এই পৃষ্ঠাখন বিলোপ কৰক',
@@ -527,7 +538,7 @@ $1',
 'missingarticle-rev' => '(সংস্কৰণ#: $1)',
 'missingarticle-diff' => '(তফাৎ: $1, $2)',
 'readonly_lag' => 'তথ্যকোষ স্বয়ংক্ৰিয়ভাৱে বন্ধ হৈছে যাতে দ্বিতীয় শ্ৰেণীৰ তথ্যকোষৰ চাৰ্ভাৰ প্ৰধান তথ্যকোষৰ চাৰ্ভাৰৰ অৱস্থালৈ আহিব পাৰে ।',
-'internalerror' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ à¦\95্ৰুটি',
+'internalerror' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ à¦¤্ৰুটি',
 'internalerror_info' => 'আভ্যন্তৰীণ ত্ৰুটি: $1',
 'fileappenderrorread' => 'যোৰা দিয়াৰ সময়ত "$1" পাঠ্য কৰা নহ\'ল ।',
 'fileappenderror' => '"$2"ৰ লগত "$1"ৰ সংযোগ কৰা নহ\'ল ।',
@@ -538,10 +549,10 @@ $1',
 'filenotfound' => '"$1" নামৰ ফাইলটো বিচাৰি পোৱা নগ’ল।',
 'fileexistserror' => '"$1" ফাইলটোত লিখিব নোৱাৰি: ফাইলটো আগৰ পৰাই আছে',
 'unexpected' => 'অনাকাংক্ষিত মূল্য: "$1"="$2".',
-'formerror' => 'ভà§\81ল: à¦«à§°à§\8dম খন জমা দিব পৰা নগ’ল',
-'badarticleerror' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bত এই কামটো কৰিব নোৱাৰি ।',
+'formerror' => 'তà§\8dৰà§\81à¦\9fি: à¦ªà§\8dৰপতà§\8dৰখন জমা দিব পৰা নগ’ল',
+'badarticleerror' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96নত এই কামটো কৰিব নোৱাৰি ।',
 'cannotdelete' => '"$1" পৃষ্ঠা বা নথিখন বিলোপ কৰা অসম্ভৱ ।
-সম্ভৱ আনে আগেই বিলোপ কৰিছে ।',
+সমà§\8dভৱ à¦\86নà§\87 à¦\86à¦\97তà§\87à¦\87 à¦¬à¦¿à¦²à§\8bপ à¦\95ৰিà¦\9bà§\87 à¥¤',
 'cannotdelete-title' => '"$1" পৃষ্ঠা বিলোপ কৰিব নোৱাৰি',
 'delete-hook-aborted' => 'হুকৰ দ্বাৰা সম্পাদনা প্ৰত্যাখ্যান কৰা হৈছে ।
 ইয়াৰ কোনো ব্যাখ্যা নাই ।',
@@ -596,9 +607,18 @@ $2',
 আপোনাৰ সদস্যভুক্তি হৈ গ’ল ।
 [[Special:Preferences|{{SITENAME}}ৰ পছন্দসমূহ]]ত আপোনাৰ পছন্দমতে ব্যক্তিগতকৰণ কৰি ল’বলৈ নাপাহৰে যেন ।',
 'yourname' => 'সদস্যনাম:',
+'userlogin-yourname' => 'সদস্যনাম',
+'userlogin-yourname-ph' => 'আপোনাৰ সদস্যনাম লিখক',
 'yourpassword' => 'আপোনাৰ গুপ্তশব্দ',
+'userlogin-yourpassword' => 'গুপ্তশব্দ',
+'userlogin-yourpassword-ph' => 'আপোনাৰ গুপ্তশব্দ লিখক',
+'createacct-yourpassword-ph' => 'এটা গুপ্তশব্দ লিখক',
 'yourpasswordagain' => 'গুপ্তশব্দ আকৌ এবাৰ লিখক',
+'createacct-yourpasswordagain' => 'গুপ্তশব্দ নিশ্চিত কৰক',
+'createacct-yourpasswordagain-ph' => 'গুপ্তশব্দ আকৌ লিখক',
 'remembermypassword' => 'মোৰ প্ৰৱেশ এই কম্পিউটাৰত মনত ৰাখিব (সৰ্বাধিক $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
+'userlogin-remembermypassword' => 'মোক লগ্‌-ইন কৰাই ৰাখক',
+'userlogin-signwithsecure' => 'নিৰাপদ সংযোগ ব্যৱহাৰ কৰক',
 'securelogin-stick-https' => 'প্ৰৱেশ কৰা পাছত HTTPS-ৰ দ্বাৰা সংযোগ ৰাখক',
 'yourdomainname' => 'আপোনাৰ ডমেইন:',
 'password-change-forbidden' => 'আপুনি এই ৱিকিত গুপ্তশব্দ সলাব নোৱাৰে।',
@@ -611,18 +631,38 @@ $2',
 'logout' => 'প্ৰস্থান',
 'userlogout' => 'প্ৰস্থান',
 'notloggedin' => 'প্ৰৱেশ কৰা নাই',
+'userlogin-noaccount' => 'কোনো একাউণ্ট নাই?',
+'userlogin-joinproject' => '{{SITENAME}}ত যোগদান কৰক',
 'nologin' => "ৱিকিপিডিয়াত আপোনাৰ একাউণ্ট নাই নেকি? তেনে '''$1'''।",
 'nologinlink' => 'নতুন একাউণ্ট খোলক',
 'createaccount' => 'সভ্যভুক্ত হবলৈ',
 'gotaccount' => "আপুনি সদস্য হয়নে? '''$1'''",
 'gotaccountlink' => 'প্ৰৱেশ',
 'userlogin-resetlink' => 'আপোনাৰ প্ৰৱেশ তথ্য পাহৰিছে?',
+'userlogin-resetpassword-link' => 'আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাওক',
+'helplogin-url' => 'Help:প্ৰৱেশ/লগ্‌-ইন',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|প্ৰৱেশ সম্পৰ্কীয় সাহায্য]]',
+'createacct-join' => 'আপোনাৰ তথ্যসমূহ তলত লিখক।',
+'createacct-emailrequired' => 'ই-মেইল ঠিকনা',
+'createacct-emailoptional' => 'ই-মেইল ঠিকনা (বৈকল্পিক)',
+'createacct-email-ph' => 'আপোনাৰ ই-মেইল ঠিকনা লিখক',
 'createaccountmail' => 'যিকোনো এটা অস্থায়ী গুপ্তশব্দ ব্যৱহাৰ কৰক আৰু ইয়াক তলত দিয়া ইমেইল ঠিকনাটোলৈ পঠিয়াই দিয়ক',
+'createacct-realname' => 'প্ৰকৃত নাম (বৈকল্পিক)',
 'createaccountreason' => 'কাৰণ:',
+'createacct-reason' => 'কাৰণ',
+'createacct-reason-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|অৱদানকাৰী|অৱদানকাৰীসকল}}',
 'badretype' => 'আপুনি দিয়া গুপ্ত শব্দ দুটা মিলা নাই।',
 'userexists' => 'আপুনি দিয়া সদস্যনাম আগৰে পৰাই ব্যৱহাৰ হৈ আছে।
 অনুগ্ৰহ কৰি বেলেগ সদস্যনাম এটা নিৰ্বাচন কৰক।',
 'loginerror' => 'প্ৰৱেশ সমস্যা',
+'createacct-error' => 'একাউণ্ট সৃষ্টিত ত্ৰুটি',
 'createaccounterror' => "একাউন্ট সৃষ্টি কৰা নহ'ল: $1",
 'nocookiesnew' => 'আপোনাৰ সদস্যভুক্তি হৈ গৈছে, কিন্তু আপুনি প্ৰৱেশ কৰা নাই।
 {{SITENAME}}ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।
@@ -665,7 +705,7 @@ $2',
 আৰু অন্যান্য ই-মেইল পঠোৱাৰ আগতে, আপোনাৰ সদস্যতাৰ নিশ্চিত কৰিবলৈ সেই ই-মেইলত দিয়া নিৰ্দেশনা আপুনি অনু্সৰণ কৰিব লাগিব।',
 'throttled-mailpassword' => "যোৱা {{PLURAL:$1|এঘণ্টাত|$1 ঘণ্টাত}} এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে।
 অবৈধ ব্যৱহাৰ ৰোধ কৰিবলৈ প্ৰতি {{PLURAL:$1|এঘণ্টাত|$1 ঘণ্টাত}} এবাৰহে গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হ'ব।",
-'mailerror' => 'à¦\87-মà§\87à¦\87ল à¦ªà¦ à§\8bৱাত সমস্যা হৈছে: $1',
+'mailerror' => 'à¦\87-মà§\87à¦\87ল à¦ªà¦ à¦¿à¦\93ৱাত সমস্যা হৈছে: $1',
 'acct_creation_throttle_hit' => 'যোৱা ২৪ ঘন্টাত আপোনাৰ আই-পি ঠিকনাৰ পৰা এই ৱিকিৰ পঢ়োঁতাই  {{PLURAL:$1|১-টা একাউন্ট|$1-টা একাউন্ট}} সৃষ্টি কৰিলে, যিটো সৰ্বোচ্চ অনুমোদনকৃত ।
 এতেকে, এই আই-পি ঠিকনাৰ পৰা এই মূহুৰ্তত একাউন্ট সৃষ্টি কৰিব নোৱাৰিব ।',
 'emailauthenticated' => 'আপোনাৰ ই-মেইল ঠিকনাটো $2 তাৰিখৰ $3 বজাত নিশ্চিত কৰা হৈছিল ।',
@@ -703,7 +743,7 @@ $2',
 'oldpassword' => 'পুৰণি গুপ্তশব্দ:',
 'newpassword' => 'নতুন গুপ্তশব্দ:',
 'retypenew' => 'নতুন গুপ্তশব্দ আকৌ লিখক',
-'resetpass_submit' => 'গুপ্তশব্দ বহাওক আৰু প্ৰৱেশ কৰক',
+'resetpass_submit' => 'à¦\97à§\81পà§\8dতশবà§\8dদ à¦¬à¦¹à§\81ৱাà¦\93à¦\95 à¦\86ৰà§\81 à¦ªà§\8dৰৱà§\87শ à¦\95ৰà¦\95',
 'resetpass_success' => 'আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে, এতিয়া আপুনি প্ৰৱেশ কৰি আছে...',
 'resetpass_forbidden' => 'গুপ্তশব্দ সলনি কৰিব নোৱাৰি',
 'resetpass-no-info' => 'এই পৃষ্ঠা প্ৰত্যক্ষ ভাৱে ঢুকি পাবলৈ আপুনি প্ৰৱেশ কৰিব লাগিব ।',
@@ -712,17 +752,17 @@ $2',
 'resetpass-wrong-oldpass' => 'অস্থায়ী বা সাম্প্ৰতিক গুপ্তশব্দ গ্ৰহণযোগ্য নহয় ।
 হয়টো আপুনি ইতিমধ্যেই সফলভাবে আপুনাৰ গুপ্তশব্দ সলনি কৰিছিল বা এটা নতুন অস্থায়ী গুপ্তশব্দৰ বাবে অনুৰোধ কৰিছিল ।',
 'resetpass-temp-password' => 'অস্থায়ী গুপ্তশব্দ:',
+'resetpass-abort-generic' => 'এটা এক্সটেন্‌ছনৰদ্বাৰা গুপ্তশব্দ সলনি কাৰ্য বাতিল কৰা হৈছে।',
 
 # Special:PasswordReset
-'passwordreset' => 'গুপ্তশব্দ ন-কৈ বহাওক',
-'passwordreset-text' => ' আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ তলৰ প্ৰপত্ৰ সম্পূৰ্ণ কৰক।',
+'passwordreset' => 'গুপ্তশব্দ ন-কৈ বহুৱাওক',
 'passwordreset-legend' => 'গুপ্তশব্দ ন-কৈ বহাওক',
 'passwordreset-disabled' => 'এই ৱিকিত গুপ্তশব্দ নবীকৰণ নিষ্ক্ৰিয় কৰা হৈছে ।',
-'passwordreset-pretext' => '{{PLURAL:$1||তলত উল্লেখ কৰা তথ্যৰ কোনো অংশ ভৰাওক}}',
+'passwordreset-emaildisabled' => 'এই ৱিকিত ই-মেইল বৈশিষ্টসমূহ নিষ্ক্ৰিয় কৰা হৈছে।',
 'passwordreset-username' => 'সদস্যনাম',
 'passwordreset-domain' => 'ডমেইন :',
-'passwordreset-capture' => 'ফলাফল à¦\87-মà§\87à¦\87লà¦\96ন à¦\9aাà¦\93à¦\95 ?',
-'passwordreset-capture-help' => "à¦\86পà§\81নি à¦\8fà¦\87 à¦\98ৰà¦\9fà§\8b à¦\9aিহà§\8dনিত à¦\95ৰিলà§\87 à¦\8fà¦\87 à¦\87-মà§\87à¦\87ল (à¦\86ৰà§\81 à¦\85সà§\8dথায়à§\80 à¦\97à§\81পà§\8dতশবà§\8dদ) à¦\86পà§\81নি à¦¦à§\87à¦\96া à¦ªà§\8bৱাৰ à¦²à¦\97তà§\87 à¦¸à¦¦à¦¸à§\8dযà¦\9cনলà§\88à¦\93 à¦ªà¦ à§\8bৱা হ'ব।",
+'passwordreset-capture' => 'ফলাফল à¦\87-মà§\87à¦\87লà¦\96ন à¦\9aাবলà§\88 à¦¬à¦¿à¦\9aাৰিà¦\9bà§\87 ?',
+'passwordreset-capture-help' => "à¦\86পà§\81নি à¦\8fà¦\87 à¦\98ৰà¦\9fà§\8b à¦\9aিহà§\8dনিত à¦\95ৰিলà§\87 à¦\8fà¦\87 à¦\87-মà§\87à¦\87ল (à¦\86ৰà§\81 à¦\85সà§\8dথায়à§\80 à¦\97à§\81পà§\8dতশবà§\8dদ) à¦\86পà§\81নি à¦¦à§\87à¦\96া à¦ªà§\8bৱাৰ à¦²à¦\97তà§\87 à¦¸à¦¦à¦¸à§\8dযà¦\9cনলà§\88à¦\93 à¦ªà¦ à¦¿à¦\93ৱা হ'ব।",
 'passwordreset-email' => 'ই-মেইল ঠিকনা:',
 'passwordreset-emailtitle' => '{{SITENAME}}ত একাউণ্টৰ সবিশেষ তথ্য আছে ।',
 'passwordreset-emailtext-ip' => 'কোনোবাই (IP ঠিকনা $1 ৰ পৰা সম্ভৱতঃ আপুনিয়েই) {{SITENAME}} ($4) ৰ বাবে আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ অনুৰোধ জনাইছিল। ইমেইল ঠিকনাটোৰ লগত এই সদস্যৰ {{PLURAL:$3|একাউণ্ট|একাউণ্টবোৰ}} জড়িত হৈ আছে ।
@@ -739,7 +779,7 @@ $2
 অস্থায়ী গুপ্তশব্দ: $2',
 'passwordreset-emailsent' => 'এখন গুপ্তশব্দ উদ্ধাৰ ই-মেইল পঠিওৱা হৈছে।',
 'passwordreset-emailsent-capture' => 'এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল পঠিওৱা হৈছে, এইখন তলত দেখা পাব।',
-'passwordreset-emailerror-capture' => "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল কিন্তু সদস্যজনলৈ পঠিয়াব পৰা নগ'ল, এইখন তলত দেখুওৱা হৈছে: $1",
+'passwordreset-emailerror-capture' => "এখন গুপ্তশব্দ উদ্ধাৰ ইমেইল সৃষ্টি কৰা হ'ল, কিন্তু {{GENDER:$2|সদস্যজনলৈ}} পঠিয়াব পৰা নগ'ল। সেইখন তলত দেখুওৱা হৈছে: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
@@ -775,7 +815,7 @@ $2
 'summary' => 'সাৰাংশ:',
 'subject' => 'বিষয় / শীৰ্ষক:',
 'minoredit' => 'এইটো এটা অগুৰুত্বপূৰ্ণ সম্পাদনা',
-'watchthis' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b লক্ষ্য কৰক',
+'watchthis' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন লক্ষ্য কৰক',
 'savearticle' => 'পৃষ্ঠা সাঁচক',
 'preview' => 'খচৰা',
 'showpreview' => 'খচৰা চাওক',
@@ -791,7 +831,7 @@ $2
 যদি আকৌ এবাৰ যদি \"{{int:savearticle}}\" টিপে, তেনেহলে সম্পাদনা শিৰোনামা অবিহনে সংৰক্ষিত হব।",
 'summary-preview' => 'সাৰাংশৰ খচৰা:',
 'subject-preview' => 'বিষয়/শিৰোনামাৰ খচৰা:',
-'blockedtitle' => 'সদসà§\8dযà¦\9cনà¦\95 à¦\85বৰোধ কৰা হৈছে',
+'blockedtitle' => 'সদসà§\8dযà¦\9cনà¦\95 à¦\85ৱৰোধ কৰা হৈছে',
 'blockedtext' => "'''আপোনাৰ সদস্যনাম অথবা আই-পি ঠিকনা অৱৰোধ কৰা হৈছে ।'''
 
 $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
@@ -897,7 +937,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'creating' => '$1 পৃষ্ঠাখন আপুনি সৃষ্টি কৰি আছে',
 'editingsection' => '$1 (অনুচ্ছেদ) সম্পাদনা কৰি আছে',
 'editingcomment' => '$1 (নতুন অনুচ্ছেদ) সম্পাদনা কৰি আছে',
-'editconflict' => 'সম্পাদনা দ্বন্দ: $1',
+'editconflict' => 'সম্পাদনা দ্বন্দ্ব: $1',
 'explainconflict' => "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পাছত আন কোনোবাই এই পৃষ্ঠাখন সলনি কৰিলে।
 পাঠ্য-স্থানৰ উপৰ ভাগত এই পৃষ্ঠাৰ প্ৰচলিত পাঠ্য দিয়া হৈছে।
 আপোনাৰ সলনিসমূহ পাঠ্য-স্থানৰ তলৰ ভাগত দেখুওৱা হৈছে।
@@ -958,7 +998,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 ইয়াৰ কোনো ব্যাখ্যা নাই ।',
 'edit-gone-missing' => 'পৃষ্ঠাখন নবীকৰণ কৰিব পৰা নগ’ল ।
 সম্ভৱতঃ পৃষ্ঠাখন বিলোপ কৰা হৈছে ।',
-'edit-conflict' => 'সম্পাদনা দ্বন্দ ।',
+'edit-conflict' => 'সম্পাদনা দ্বন্দ্ব ।',
 'edit-no-change' => 'আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই',
 'edit-already-exists' => "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল ।
 পৃষ্ঠাখন ইতিমধ্যে আছেই ।",
@@ -966,11 +1006,12 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'content-failed-to-parse' => '$1 মডেলৰ বাবে $2ৰ তথ্য নিকা কৰিব পৰা নগ’ল: $3',
 'invalid-content-data' => 'অবৈধ সমল তথ্য',
 'content-not-allowed-here' => '[[$2]] পৃষ্ঠাত "$1" সমল অনুমোদিত নহয়',
+'editwarning-warning' => 'এই পৃষ্ঠাটো এৰিলে আপুনি কৰা পৰিবৰ্তনসমূহ হেৰাব পাৰে। যদি আপুনি প্ৰৱেশ কৰা অৱস্থাত আছে, আপুনি এই সতৰ্কবাৰ্তাক আপোনাৰ পছন্দসমূহৰ "সম্পাদনা" অংশত অসামৰ্থবান কৰিব পাৰিব।',
 
 # Content models
 'content-model-wikitext' => 'ৱিকিপাঠ্য',
 'content-model-text' => 'সাধাৰণ পাঠ্য',
-'content-model-javascript' => 'à¦\9cাভাসà§\8dà¦\95à§\8dৰà§\80প্ট',
+'content-model-javascript' => 'à¦\9cাভাসà§\8dà¦\95à§\8dৰিপ্ট',
 'content-model-css' => 'চি.এচ.এচ.',
 
 # Parser/template warnings
@@ -1073,7 +1114,7 @@ $3 য়ে আগবঢ়োৱা ইয়াৰ কাৰণ হৈছে
 আপুনি এই পাৰ্থক্য চাব পাৰে; সবিশেষ পাব [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} নিবাৰণ অভিলেখত] ।",
 'rev-delundel' => 'দেখুৱাওক/নেদেখুৱাব',
 'rev-showdeleted' => 'দেখুৱাওক',
-'revisiondelete' => 'সà¦\82à¦\95লন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰà¦\95 / à¦ªà§\81ণৰ স্থাপন কৰক',
+'revisiondelete' => 'সà¦\82à¦\95লন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰà¦\95 / à¦ªà§\81নৰ স্থাপন কৰক',
 'revdelete-nooldid-title' => 'লক্ষ্য সংশোধন যুক্তিসংগত নহয়',
 'revdelete-nooldid-text' => 'কামটো কৰাৰ বাবে আপুনি লক্ষ্য সংশোধন নিৰ্বাচন কৰা নাই, নিৰ্বাচিত সংশোধন নাই, অথবা আপুনি বৰ্তমানৰ সংশোধন লুকুৱাব বিচাৰিছে ।',
 'revdelete-nologtype-title' => 'কোনো অভিলেখ প্ৰকাৰ দিয়া হোৱা নাই',
@@ -1096,7 +1137,7 @@ $3 য়ে আগবঢ়োৱা ইয়াৰ কাৰণ হৈছে
 'revdelete-hide-text' => 'সংশোধিত পাঠ গোপন কৰক',
 'revdelete-hide-image' => 'ফাইলৰ বিষয়বস্তু গোপন কৰক',
 'revdelete-hide-name' => 'কাৰ্য আৰু লক্ষ্য গোপন কৰক',
-'revdelete-hide-comment' => 'সমà§\8dপাদনা à¦®à¦¨à§\8dতবà§\8dয à¦\86তৰাà¦\87 à¦¥à¦\93ক',
+'revdelete-hide-comment' => 'সমà§\8dপাদনা à¦¸à¦¾à§°à¦¾à¦\82শ à¦\97à§\8bপন à¦\95ৰক',
 'revdelete-hide-user' => 'সম্পাদকৰ সদস্যনাম/আই-পি ঠিকনা গোপন কৰক',
 'revdelete-hide-restricted' => 'প্ৰশাসকবৃন্দৰ লগতে আনৰ পৰাও তথ্য ৰোধ কৰক',
 'revdelete-radio-same' => '(সলনি নকৰিব)',
@@ -1171,7 +1212,7 @@ $1",
 # Merge log
 'mergelog' => 'অভিলেখ একত্ৰীকৰণ',
 'pagemerge-logentry' => "[[$1]] [[$2]]-ত মিলোৱা হ'ল (সংশোধনসমূহ $3-লৈ)",
-'revertmerge' => 'à¦\8fà¦\95তà§\8dৰিকৰণ বাতিল কৰক',
+'revertmerge' => 'à¦\8fà¦\95তà§\8dৰà§\80কৰণ বাতিল কৰক',
 'mergelogpagetext' => 'এখন পৃষ্ঠাৰ ইতিহাস আন এখনৰ লগত কৰা একত্ৰীকৰণৰ সকলোতকৈ শেহতীয়া তালিকা তলত দিয়া হ’ল ।',
 
 # Diffs
@@ -1199,7 +1240,7 @@ $1",
 'searchsubtitleinvalid' => "আপোনাৰ অনুসন্ধান হ'ল '''$1'''",
 'toomanymatches' => "বহুত বেছি মিল পোৱা গৈছে, সন্ধান-শব্দ সলনি কৰিবলৈ অনুৰোধ কৰা হ'ল",
 'titlematches' => 'পৃষ্ঠাৰ শিৰোনামা মিলিছে',
-'notitlematches' => 'à¦\8fà¦\9fাà¦\93 à¦ªà§\83ষà§\8dঠাৰ শিৰোনামা মিলা নাই',
+'notitlematches' => 'à¦\8fà¦\96ন à¦ªà§\83ষà§\8dঠাৰà§\8b শিৰোনামা মিলা নাই',
 'textmatches' => 'পৃষ্ঠাৰ পাঠ মিলিছে',
 'notextmatches' => 'কোনো পৃষ্ঠাৰ পাঠ মিলা নাই',
 'prevn' => 'পূৰ্বৱৰ্তী {{PLURAL:$1|$1}}টা',
@@ -1255,15 +1296,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} ত অনুসন্ধান কৰা সাময়িক ভাবে নিষ্ক্ৰিয় কৰা হৈছে।
 তেতিয়ালৈকে গুগলত অনুসন্ধান কৰক।
 মনত ৰাখিব যে তেঁওলোকৰ {{SITENAME}}ৰ ইণ্ডেক্স পুৰণি হব পাৰে।',
-
-# Quickbar
-'qbsettings' => 'শীঘ্ৰদণ্ডিকা',
-'qbsettings-none' => 'একেবাৰে নহয়',
-'qbsettings-fixedleft' => 'বাঁওফাল স্থিৰ',
-'qbsettings-fixedright' => 'সোঁফাল স্থিৰ',
-'qbsettings-floatingleft' => 'বাঁওফাল অস্থিৰ',
-'qbsettings-floatingright' => 'সোঁফাল অস্থিৰ',
-'qbsettings-directionality' => 'আপোনাৰ ভাষাৰ আৰু লিপিৰ দিশৰ ওপৰত নিৰ্ভৰ কৰি ঠিক কৰা হ’ল',
+'search-error' => 'অনুসন্ধানৰ সময়ত এটা ত্ৰুটি হৈছে: $1',
 
 # Preferences page
 'preferences' => 'পছন্দসমূহ',
@@ -1272,7 +1305,7 @@ $1",
 'prefsnologin' => 'প্ৰৱেশ কৰা নাই',
 'prefsnologintext' => 'আপোনাৰ পছন্দ সলনি কৰিবলৈ হ’লে <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} প্ৰৱেশ]</span> কৰাতো আৱশ্যক।',
 'changepassword' => 'গুপ্তশব্দ সলনি কৰক',
-'prefs-skin' => 'à¦\86ৱৰন',
+'prefs-skin' => 'à¦\86ৱৰণ',
 'skin-preview' => 'খচৰা',
 'datedefault' => 'কোনো পছন্দ নাই',
 'prefs-beta' => 'বিটা বৈশিষ্টসমূহ',
@@ -1372,14 +1405,14 @@ $1",
 'prefs-signature' => 'স্বাক্ষৰ',
 'prefs-dateformat' => 'তাৰিখ বিন্যাস',
 'prefs-timeoffset' => 'সময় অফচেট',
-'prefs-advancedediting' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦\89পায়ানà§\8dতৰ সমূহ',
-'prefs-advancedrc' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦\89পায়ানà§\8dতৰ সমূহ',
-'prefs-advancedrendering' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦\89পায়ানà§\8dতৰ সমূহ',
-'prefs-advancedsearchoptions' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦\89পায়ানà§\8dতৰ সমূহ',
-'prefs-advancedwatchlist' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦\89পায়ানà§\8dতৰ সমূহ',
-'prefs-displayrc' => 'প্ৰদৰ্শনী উপায়ান্তৰ সমূহ',
-'prefs-displaysearchoptions' => 'বিকল্প প্ৰদৰ্শন কৰক',
-'prefs-displaywatchlist' => 'বিকল্প প্ৰদৰ্শন কৰক',
+'prefs-advancedediting' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦¬à¦¿à¦\95লà§\8dপসমূহ',
+'prefs-advancedrc' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦¬à¦¿à¦\95লà§\8dপসমূহ',
+'prefs-advancedrendering' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦¬à¦¿à¦\95লà§\8dপসমূহ',
+'prefs-advancedsearchoptions' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦¬à¦¿à¦\95লà§\8dপসমূহ',
+'prefs-advancedwatchlist' => 'à¦\89à¦\9aà§\8dà¦\9aতৰ à¦¬à¦¿à¦\95লà§\8dপসমূহ',
+'prefs-displayrc' => 'প্ৰদৰ্শন বিকল্পসমূহ',
+'prefs-displaysearchoptions' => 'বিকল্পসমূহ প্ৰদৰ্শন কৰক',
+'prefs-displaywatchlist' => 'বিকল্পসমূহ প্ৰদৰ্শন কৰক',
 'prefs-diffs' => 'পাৰ্থক্য',
 
 # User preference: email validation using jQuery
@@ -1407,6 +1440,7 @@ $1",
 'userrights-notallowed' => 'সদস্যৰ অধিকাৰ যোগ কৰিবলৈ বা আঁতৰ কৰিবলৈ আপোনাৰ একাউণ্টৰ অনুমতি নাই ।',
 'userrights-changeable-col' => 'আপুনি সলনি কৰিব পৰা গোটসমূহ',
 'userrights-unchangeable-col' => 'আপুনি সলনি কৰিব নোৱাৰা গোটসমূহ',
+'userrights-conflict' => 'সদস্য অধিকাৰ দ্বন্দ্ব! অনুগ্ৰহ কৰি আপোনাৰ সালসলনি আকৌ এবাৰ প্ৰয়োগ কৰক।',
 
 # Groups
 'group' => 'গোট:',
@@ -1451,7 +1485,7 @@ $1",
 'right-upload_by_url' => "ইউ-আৰ-এলৰ পৰা ফাইল আপল'ড কৰক",
 'right-purge' => 'চাইট কেচৰ পৰা নিশ্চয়তা নোহোৱা পৃষ্ঠা মচি পেলাওক ।',
 'right-autoconfirmed' => 'অৰ্দ্ধ-সুৰক্ষিত পৃষ্ঠা সম্পাদনা কৰক',
-'right-bot' => 'সà§\8dবয়à¦\82à¦\95à§\8dৰিয় à¦ªà§\8dৰà¦\95à§\8dৰিয়া à¦¹à¦¿à¦\9bাপে ব্যৱহৃত হওক',
+'right-bot' => 'সà§\8dবয়à¦\82à¦\95à§\8dৰিয় à¦ªà§\8dৰà¦\95à§\8dৰিয়া à¦¹à¦¿à¦\9aাপে ব্যৱহৃত হওক',
 'right-nominornewtalk' => 'আলোচনা পৃষ্ঠাৰ লঘূ সম্পাদনা হওঁতে নতুন সদস্য বাৰ্তা নালাগে',
 'right-apihighlimits' => 'API প্ৰশ্নৰ বাবে উচ্চতৰ সীমা ব্যৱহাৰ কৰক',
 'right-writeapi' => 'ৰাইট এ.পি.আই.ৰ ব্যৱহাৰ',
@@ -1816,7 +1850,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'http-read-error' => 'HTTP পঠন ত্ৰুটি ।',
 'http-timed-out' => 'HTTP অনুৰোধৰ সময় পাৰ হৈছে ।',
 'http-curl-error' => 'URL অনাত ত্ৰুটি হৈছে: $1',
-'http-host-unreachable' => 'URL পাব পৰা নগ’ল ।',
 'http-bad-status' => 'HTTP অনুৰোধৰ সময়ত কোনো সমস্যা হৈছে: $1, $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1976,6 +2009,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 তাৰ সলনি সেইবোৰত উপযুক্ত পৃষ্ঠাৰ লগত সংযোগ থাকিব পাৰে।
 [[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাঁচ ব্যৱহাৰ কৰিলে এখন পৃষ্ঠাক দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা হিছাপে গণ্য কৰা হয়।",
 
+'pageswithprop' => 'পৃষ্ঠা উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-legend' => 'পৃষ্ঠা উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-text' => 'বিশেষ পৃষ্ঠা উপাদান ব্যৱহাৰ কৰা পৃষ্ঠাসমূহ ইয়াত তালিকাভুক্ত কৰা হৈছে।',
+'pageswithprop-prop' => 'উপাদান নাম:',
 'pageswithprop-submit' => 'যাওক',
 
 'doubleredirects' => 'দ্বি-পুনঃনিৰ্দেশিত',
@@ -2142,9 +2179,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'listusers-blocked' => '(বাৰণ কৰা)',
 
 # Special:ActiveUsers
-'activeusers' => 'সà¦\95à§\8dৰিয় à¦¬à§\8dযবহাৰকাৰীৰ তালিকা',
+'activeusers' => 'সà¦\95à§\8dৰিয় à¦¬à§\8dযৱহাৰকাৰীৰ তালিকা',
 'activeusers-intro' => 'যোৱা  {{PLURAL:$1|দিন|দিন}}ৰ ভিতৰত অৱদান আগবঢ়োৱা ব্যৱহাৰকাৰীৰ তালিকা',
-'activeusers-count' => 'যোৱা {{PLURAL:$3|দিনত|$3 দিনত}} সৰ্বমুঠ {{PLURAL:$1|কামৰ|কামৰ}} সংখ্যা $1',
+'activeusers-count' => 'যোৱা {{PLURAL:$3|দিনত|$3 দিনত}} সৰ্বমুঠ $1 {{PLURAL:$1|টা কাম}}',
 'activeusers-from' => 'ইয়াৰে আৰম্ভ হোৱা ব্যৱহাৰকাৰী সকল দেখুৱাওক:',
 'activeusers-hidebots' => 'বট নেদেখুৱাব',
 'activeusers-hidesysops' => 'প্ৰশাসক নেদেখুৱাব',
@@ -2227,8 +2264,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'notvisiblerev' => 'অন্য কোনো সদস্যই কৰা সংশোধনী বিলোপ কৰা হৈছে',
 'watchnochange' => 'আপুনি চকু ৰখা আইটেমসমূহ প্ৰদৰ্শিত সময়সীমাৰ ভিতৰত সম্পাদনা কৰা হোৱা নাই ।',
 'watchlist-details' => 'আলোচনা পৃষ্ঠা সমূহ লেখত নধৰি {{PLURAL:$1|$1 খন পৃষ্ঠা|$1 খন পৃষ্ঠা}} আপোনাৰ লক্ষ্য-তালিকাত আছে ।',
-'wlheader-enotif' => '* ই-পত্ৰ জাননী সক্ৰিয় কৰা হৈছে ।',
-'wlheader-showupdated' => "* আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত হোৱা পৰিৱৰ্তনসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে",
+'wlheader-enotif' => 'ইমেইল জাননী সক্ৰিয় কৰা হৈছে।',
+'wlheader-showupdated' => "আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত সলনি হোৱা পৃষ্ঠাসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে।",
 'watchmethod-recent' => 'লক্ষ্য কৰা পৃষ্ঠাসমূহ শেহতীয়া সম্পাদনাৰ বাবে পৰীক্ষা কৰা হৈছে',
 'watchmethod-list' => 'লক্ষ্য কৰা পৃষ্ঠাসমূহ শেহতীয়া সম্পাদনাৰ বাবে পৰীক্ষা কৰা হৈছে',
 'watchlistcontains' => 'আপোনাৰ লক্ষ্য-তালিকাত $1 খন {{PLURAL:$1|পৃষ্ঠা|পৃষ্ঠা}} আছে ।',
@@ -2816,6 +2853,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'thumbnail-more' => 'ডাঙৰকৈ চাওক',
 'filemissing' => 'ফাইল বিচাৰি পোৱা নগ’ল',
 'thumbnail_error' => 'ক্ষুদ্ৰ প্ৰতিকৃতি সৃষ্টি কৰাত অসুবিধা হৈছে: $1',
+'thumbnail_error_remote' => '$1ৰপৰা ত্ৰুটি বাৰ্তা:
+$2',
 'djvu_page_error' => 'DjVu পৃষ্ঠা পৰিসীমাৰ বাহিৰত',
 'djvu_no_xml' => "DjVu ফাইলৰ বাবে XML আনিব পৰা নগ'ল",
 'thumbnail-temp-create' => 'অস্থায়ী থাম্বনেইল নথিপত্ৰ সৃষ্টি কৰিবলে অক্ষম',
@@ -2874,6 +2913,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'import-error-interwiki' => '"$1" পৃষ্ঠাখন আমদানি কৰা নহ\'ল কাৰণ ইয়াৰ নামটো বাহিৰা সংযোগৰ (আন্তঃৱিকি) বাবে সংৰক্ষিত।',
 'import-error-special' => '"$1" পৃষ্ঠাখন আমদানি কৰা নহ\'ল কাৰণ ই পৃষ্ঠা অনুমোদন নকৰা এটা বিশেষ নামস্থানৰ অন্তৰ্গত।',
 'import-error-invalid' => '"$1" পৃষ্ঠাখন আমদানি কৰা নহ\'ল কাৰণ ইয়াৰ নামটো অবৈধ।',
+'import-error-unserialize' => ' "$1" পৃষ্ঠাৰ $2 সংশোধনৰ ক্ৰম আঁতৰ কৰিব পৰা নগ\'ল। এই সংশোধনে $4 ক্ৰমৰ সমল মডেল $3 ব্যৱহাৰ কৰা বুলি জনোৱা হৈছিল।',
 'import-options-wrong' => 'ভুল {{PLURAL:$2|বিকল্প|বিকল্পসমূহ}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'মূল পৃষ্ঠাৰ শিৰোনামা অবৈধ।',
 'import-rootpage-nosubpage' => 'মূল পৃষ্ঠাৰ "$1" নামস্থানে উপপৃষ্ঠা অনুমোদন নকৰে।',
@@ -3007,6 +3047,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'pageinfo-robot-noindex' => 'ইনডেক্সৰ অনুপযোগী',
 'pageinfo-views' => 'দৰ্শনৰ সংখ্যা',
 'pageinfo-watchers' => 'পৃষ্ঠা নিৰীক্ষকৰ সংখ্যা',
+'pageinfo-few-watchers' => '$1 {{PLURAL:$1|তকৈ কম নিৰীক্ষক}}',
 'pageinfo-redirects-name' => 'পৃষ্ঠালৈ থকা পুনৰ্নিৰ্দেশ',
 'pageinfo-subpages-name' => 'এই পৃষ্ঠাৰ উপপৃষ্ঠাসমূহ',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|পুনৰ্নিৰ্দেশ|পুনৰ্নিৰ্দেশসমূহ}}; $3 {{PLURAL:$3|অপুনৰ্নিৰ্দেশ নাই|অপুনৰ্নিৰ্দেশসমূহ}})',
@@ -3029,6 +3070,10 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'pageinfo-protect-cascading' => 'সুৰক্ষাসমূহ ইয়াৰ পৰা প্ৰপাতাকাৰ হৈছে',
 'pageinfo-protect-cascading-yes' => 'হয়',
 'pageinfo-protect-cascading-from' => 'সুৰক্ষাসমূহ প্ৰপাতাকাৰ হৈছে',
+'pageinfo-category-info' => 'শ্ৰেণী তথ্য',
+'pageinfo-category-pages' => 'পৃষ্ঠাৰ সংখ্যা',
+'pageinfo-category-subcats' => 'উপশ্ৰেণীৰ সংখ্যা',
+'pageinfo-category-files' => 'ফাইলৰ সংখ্যা',
 
 # Patrolling
 'markaspatrolleddiff' => 'নিৰীক্ষিত বুলি চিহ্নিত কৰক',
@@ -3105,9 +3150,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
 'hours' => '{{PLURAL:$1|$1 ঘন্টা|$1 ঘন্টা}}',
 'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
+'weeks' => '{{PLURAL:$1|$1 সপ্তাহ}}',
+'months' => '{{PLURAL:$1|$1 মাহ}}',
+'years' => '{{PLURAL:$1|$1বছৰ|$1 বছৰ}}',
 'ago' => '$1 আগেয়ে',
 'just-now' => 'এইমাত্ৰ',
 
+# Human-readable timestamps
+'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’ত',
+
 # Bad image list
 'bad_image_list' => 'The format is as follows:
 
@@ -3137,7 +3198,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'প্ৰস্থ',
 'exif-imagelength' => 'উচ্চতা',
 'exif-bitspersample' => 'প্ৰতি অংশৰ বিট',
@@ -3315,7 +3376,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-originalimageheight' => "ক্ৰ'প কৰাৰ আগত ছবিৰ উচ্চতা",
 'exif-originalimagewidth' => "ক্ৰ'প কৰাৰ আগত ছবিৰ প্ৰস্থতা",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'অসংকুচিত',
 'exif-compression-2' => "CCITT দল ৩ ১-পৰিসৰ পৰিৱৰ্তীত Huffman চলন দৈৰ্ঘ্য এনক'ডিং",
 'exif-compression-3' => "CCITT দল ৩ ফেক্স এনক'ডিং",
@@ -3735,12 +3796,16 @@ $5
 'version-entrypoints-header-entrypoint' => 'প্ৰৱেশ পইণ্ট',
 'version-entrypoints-header-url' => 'ইউআৰএল',
 
-# Special:FilePath
-'filepath' => 'নথিৰ পথ',
-'filepath-page' => 'নথি:',
-'filepath-submit' => 'যাওক',
-'filepath-summary' => 'এই বিশেষ পৃষ্ঠায় এটা নথিপত্ৰৰ বাবে সম্পূৰ্ণ পথ ঘুৰাই পঠায়।
-ছবিসমূহক সম্পূৰ্ণ বিভেদনত দেখুৱা হয়, অন্য নথিপত্ৰ ধৰণসমূহ সিহতৰ সংলঘ্ন প্ৰগ্ৰামৰ সৈতে প্ৰত্যক্ষভাৱে আৰম্ভ হয়।',
+# Special:Redirect
+'redirect' => 'ফাইল, সদস্য, বা সংশোধন আই ডিৰে পুনঃনিৰ্দেশ',
+'redirect-legend' => 'এটা ফাইল বা এখন এখন পৃষ্ঠালৈ পুনঃনিৰ্দেশ',
+'redirect-submit' => 'যাওক',
+'redirect-lookup' => 'চাওক:',
+'redirect-value' => 'মূল্য:',
+'redirect-user' => 'সদস্য আই ডি',
+'redirect-revision' => 'পৃষ্ঠা সংশোধন',
+'redirect-file' => 'ফাইলৰ নাম',
+'redirect-not-exists' => "মূল্য পোৱা নগ'ল",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'প্ৰতিলিপি পৃষ্ঠাসমূহ অনুসন্ধান কৰক',
@@ -3832,17 +3897,20 @@ $5
 'htmlform-submit' => 'দাখিল কৰক',
 'htmlform-reset' => 'সাল-সলনি বাতিল কৰক',
 'htmlform-selectorother-other' => 'অন্য',
+'htmlform-no' => 'নহয়',
+'htmlform-yes' => 'হয়',
+'htmlform-chosen-placeholder' => 'এটা বিকল্প বাছনি কৰক',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন সহ',
 'sqlite-no-fts' => '$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন অবিহনে',
 
 # New logging system
-'logentry-delete-delete' => '$1’ৰ দ্বাৰা $3 পৃষ্ঠাখন বিলোপ কৰা হ’ল',
-'logentry-delete-restore' => '$1 পুনৰ সংৰক্ষণ কৰা হ’ল পৃষ্ঠা $3',
+'logentry-delete-delete' => " $3 পৃষ্ঠাখন $1ৰদ্বাৰা {{GENDER:$2|বিলোপ কৰা হ'ল}}",
+'logentry-delete-restore' => "$3 পৃষ্ঠাখন $1 ৰদ্বাৰা {{GENDER:$2|পুনৰ্সংৰক্ষণ কৰা হ'ল}}",
 'logentry-delete-event' => '$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা দৃশ্যমানতা',
 'logentry-delete-revision' => 'পৃষ্ঠা $3: $4ত {{PLURAL:$5|এটা পুনৰীক্ষন|$5 পুনৰীক্ষনসমূহ}}ৰ $1 দৃশ্যমানতা পৰিৱৰ্তন কৰা হ’ল',
-'logentry-delete-event-legacy' => '$3ত অভিলেখ ঘটনামসমূহৰ $1 দৃশ্যমানতা পৰিৱৰ্তন কৰা হ’ল',
+'logentry-delete-event-legacy' => "$3ত ল'গ ঘটনাসমূহৰ দৃশ্যমানতা $1 {{GENDER:$2|ৰদ্বাৰা সলোৱা হ'ল}}",
 'logentry-delete-revision-legacy' => 'পৃষ্ঠা $3ত পুনৰীক্ষনসমূহৰ $1 দৃশ্যমানতা পৰিৱৰ্তন কৰা হল',
 'logentry-suppress-delete' => '$1 সংকোচিত পৃষ্ঠা $3',
 'logentry-suppress-event' => '$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 গোপন পৰিৱৰ্তন কৰা হ’ল দৃশ্যমানতা',
@@ -3864,9 +3932,10 @@ $5
 'logentry-patrol-patrol' => "পৃষ্ঠা $3 -ৰ $1 চিহ্নিত সংশোধন $4 নিৰীক্ষণ কৰা হ'ল",
 'logentry-patrol-patrol-auto' => "পৃষ্ঠা $3 -ৰ $1 চিহ্নিত সংশোধন $4 স্বচালিতভাৱে নিৰীক্ষণ কৰা হ'ল",
 'logentry-newusers-newusers' => "ব্যৱহাৰকাৰী একাউণ্ট $1 সৃষ্টি কৰা হ'ল",
-'logentry-newusers-create' => "ব্যৱহাৰকাৰী একাউণ্ট $1 সৃষ্টি কৰা হ'ল",
-'logentry-newusers-create2' => "$1ৰ দ্বাৰা এটা ব্যৱহাৰকাৰী একাউণ্ট $3 সৃষ্টি কৰা হ'ল",
-'logentry-newusers-autocreate' => '$1’ৰ একাউণ্ট স্বয়ংক্ৰিয়ভাৱে সৃষ্টি কৰা হৈছিল',
+'logentry-newusers-create' => "ব্যৱহাৰকাৰী একাউণ্ট $1 {{GENDER:$2|সৃষ্টি কৰা হ'ল}}",
+'logentry-newusers-create2' => "$1ৰ দ্বাৰা এটা ব্যৱহাৰকাৰী একাউণ্ট $3 {{GENDER:$2|সৃষ্টি কৰা হ'ল}}",
+'logentry-newusers-byemail' => "$1 ৰদ্বাৰা ব্যৱহাৰকাৰী একাউণ্ট $3 {{GENDER:$2|সৃষ্টি কৰা হ'ল}} আৰু ইমেইলৰ যোগেদি গুপ্তশব্দ পঠিওৱা হ'ল",
+'logentry-newusers-autocreate' => "সদস্য একাউণ্ট $1 স্বয়ংক্ৰিয়ভাৱে {{GENDER:$2|সৃষ্টি কৰা হ'ল}}",
 'logentry-rights-rights' => "$1ৰ গোট সদস্যপদ $3ৰ পৰা $4লৈ $5 লৈ সলনি কৰা হ'ল",
 'logentry-rights-rights-legacy' => "$1-ৰ গোট সদস্যপদ $3-লৈ সলনি কৰা হ'ল",
 'logentry-rights-autopromote' => '$1ক  $4ৰ পৰা $5লৈ স্বয়ংক্ৰিয়ভাৱে পদোন্নীত কৰা হ’ল',
@@ -3924,6 +3993,7 @@ $5
 'api-error-ok-but-empty' => 'আভ্যন্তৰীণ ত্ৰুটি: চাৰ্ভাৰে কোনো সঁহাৰি জনোৱা নাই।',
 'api-error-overwrite' => 'এতিয়া থকা ফাইলৰ ওপৰত লিখা নিষেধ।',
 'api-error-stashfailed' => 'আভ্যন্তৰীণ ত্ৰুটি: অস্থায়ী ফাইল সাঁচি ৰখাত চাৰ্ভাৰ অসমৰ্থ হৈছে।',
+'api-error-publishfailed' => "আভ্যন্তৰীণ ত্ৰুটি: অস্থায়ী ফাইল প্ৰকাশ কৰাত চাৰ্ভাৰ অসমৰ্থ হ'ল।",
 'api-error-timeout' => 'আশা কৰা সময়ৰ ভিতৰত চাৰ্ভাৰটোৱে সঁহাৰি নজনালে।',
 'api-error-unclassified' => 'এক অজ্ঞাত সমস্যাই দেখা দিছে।',
 'api-error-unknown-code' => 'অজ্ঞাত সমস্যা: "$1"।',
@@ -3944,4 +4014,7 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
 'duration-millennia' => '$1 {{PLURAL:$1|সহস্ৰাব্দ|সহস্ৰাব্দ}}',
 
+# Image rotation
+'rotate-comment' => 'ছবিখন ঘড়ীৰ কাটাৰ দিশত $1 {{PLURAL:$1|ডিগ্ৰী}} ঘূৰোৱা হৈছে।',
+
 );
index 8dd9dba..d540b12 100644 (file)
@@ -53,14 +53,15 @@ $namespaceAliases = array(
 
 $specialPageAliases = array(
        'Block'                     => array( 'Bloquiar', 'BloquiarIP', 'BloquiarUsuariu' ),
-       'Log'                       => array( 'Rexistru' ),
+       'Log'                       => array( 'Rexistru', 'Rexistros' ),
+       'Search'                    => array( 'Gueta' ),
        'Statistics'                => array( 'Estadístiques' ),
 );
 
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Sorrayar enllaces:',
-'tog-justify' => 'Xustificar parágrafos',
+'tog-justify' => 'Xustificar párrafos',
 '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',
@@ -77,9 +78,9 @@ $messages = array(
 'tog-watchdefault' => "Amestar les páxines y ficheros qu'edito a la mio llista de vixilancia",
 'tog-watchmoves' => 'Amestar les páxines y ficheros que muevo a la mio llista de vixilancia',
 'tog-watchdeletion' => 'Amestar les páxines y ficheros que desanicio a la mio llista de vixilancia',
-'tog-minordefault' => 'Marcar toles ediciones como menores por defeutu',
-'tog-previewontop' => "Amosar previsualización enantes de la caxa d'edición",
-'tog-previewonfirst' => 'Amosar previsualización na primer edición',
+'tog-minordefault' => 'Marcar toles ediciones como menores de mou predetermináu',
+'tog-previewontop' => "Amosar previsualización enantes del cuadru d'edición",
+'tog-previewonfirst' => 'Amosar previsualización na primera edición',
 'tog-nocache' => 'Desactivar la caché de páxines del restolador',
 'tog-enotifwatchlistpages' => 'Mandame un corréu cuando camude una páxina o ficheru de la mio llista de vixilancia',
 'tog-enotifusertalkpages' => "Mandame un corréu cuando camude la mio páxina d'alderique",
@@ -88,8 +89,6 @@ $messages = array(
 'tog-shownumberswatching' => "Amosar el númberu d'usuarios que tán vixilando la páxina",
 'tog-oldsig' => 'Firma esistente:',
 'tog-fancysig' => 'Tratar la firma como testu wiki (ensin enllaz automáticu)',
-'tog-externaleditor' => 'Usar un editor esternu por defeutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-externaldiff' => 'Usar un diff esternu por defutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
 'tog-showjumplinks' => 'Activar los enllaces d\'accesibilidá "saltar a"',
 'tog-uselivepreview' => 'Usar vista previa en tiempu real (necesita JavaScript) (en pruebes)',
 'tog-forceeditsummary' => "Avisame cuando grabe col resume d'edición en blanco",
@@ -104,6 +103,7 @@ $messages = array(
 'tog-showhiddencats' => 'Amosar categoríes anubríes',
 'tog-noconvertlink' => 'Desactivar la conversión del títulu del enllaz',
 'tog-norollbackdiff' => 'Desaniciar les diferencies depués de facer una restauración',
+'tog-useeditwarning' => "Avisame cuando salga d'una páxina d'edición con cambios ensin guardar",
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
@@ -111,7 +111,7 @@ $messages = array(
 
 # Font style option in Special:Preferences
 'editfont-style' => "Estilu de fonte de l'área d'edición:",
-'editfont-default' => 'Restolador por defeutu',
+'editfont-default' => 'Predeterminao del restolador',
 'editfont-monospace' => 'Tipu de lletra monoespaciada',
 'editfont-sansserif' => 'Tipu de lletra Sans-serif',
 'editfont-serif' => 'TIpu de lletra Serif',
@@ -167,6 +167,18 @@ $messages = array(
 'oct' => 'och',
 'nov' => 'pay',
 'dec' => 'avi',
+'january-date' => '$1 de xineru',
+'february-date' => '$1 de febreru',
+'march-date' => '$1 de marzu',
+'april-date' => "$1 d'abril",
+'may-date' => '$1 de mayu',
+'june-date' => '$1 de xunu',
+'july-date' => '$1 de xunetu',
+'august-date' => "$1 d'agostu",
+'september-date' => '$1 de setiembre',
+'october-date' => "$1 d'ochobre",
+'november-date' => '$1 de payares',
+'december-date' => "$1 d'avientu",
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoría|Categoríes}}',
@@ -200,14 +212,14 @@ $messages = array(
 'and' => '&#32;y',
 
 # Cologne Blue skin
-'qbfind' => 'Guetar',
-'qbbrowse' => 'Restolar',
+'qbfind' => 'Alcontrar',
+'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta páxina',
 'qbmyoptions' => 'Les mios páxines',
 'qbspecialpages' => 'Páxines especiales',
 'faq' => 'EMF (entrugues más frecuentes)',
-'faqpage' => 'Project:EMF',
+'faqpage' => 'Project:FAQ',
 
 # Vector skin
 'vector-action-addsection' => 'Amestar seición',
@@ -268,7 +280,7 @@ $messages = array(
 'userpage' => "Ver la páxina d'usuariu",
 'projectpage' => 'Ver la páxina del proyeutu',
 'imagepage' => 'Ver la páxina del ficheru',
-'mediawikipage' => 'Ver la páxina de mensaxes',
+'mediawikipage' => 'Ver la páxina del mensaxe',
 'templatepage' => 'Ver la páxina de plantía',
 'viewhelppage' => "Ver la páxina d'ayuda",
 'categorypage' => 'Ver la páxina de la categoría',
@@ -282,11 +294,11 @@ $messages = array(
 'jumpto' => 'Saltar a:',
 'jumptonavigation' => 'navegación',
 'jumptosearch' => 'guetar',
-'view-pool-error' => 'Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.
-Hai demasiaos usuarios faciendo por ver esta páxina.
-Por favor espera un cachín enantes de volver intentar acceder a esta páxina.
+'view-pool-error' => "Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.
+Hai demasiaos usuarios intentando ver esta páxina.
+Por favor espera un ratu enantes d'intentar otra vuelta entrar a esta páxina.
 
-$1',
+$1",
 'pool-timeout' => 'Tiempu escosáu esperando pal bloquéu',
 'pool-queuefull' => 'La cola de trabayu ta enllena',
 'pool-errorunknown' => 'Fallu desconocíu',
@@ -294,10 +306,10 @@ $1',
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Tocante a {{SITENAME}}',
 'aboutpage' => 'Project:Tocante a',
-'copyright' => 'El conteníu ta disponible baxo los términos de llicencia  $1.',
+'copyright' => 'El conteníu ta disponible baxo los términos de la $1.',
 'copyrightpage' => "{{ns:project}}:Drechos d'autor",
-'currentevents' => 'Actualidá',
-'currentevents-url' => 'Project:Actualidá',
+'currentevents' => 'Fechos actuales',
+'currentevents-url' => 'Project:Fechos actuales',
 'disclaimers' => 'Avisu llegal',
 'disclaimerpage' => 'Project:Avisu xeneral',
 'edithelp' => "Ayuda d'edición",
@@ -313,7 +325,7 @@ $1',
 
 'badaccess' => 'Fallu de permisos',
 'badaccess-group0' => "Nun tienes permisu pa executar l'aición solicitada.",
-'badaccess-groups' => "L'aición solicitada ta acutada pa usuarios {{PLURAL:$2|del grupu|d'ún d'estos grupos}}: $1.",
+'badaccess-groups' => "L'aición solicitada ta acutada pa usuarios {{PLURAL:$2|del grupu|d'unu d'estos grupos}}: $1.",
 
 'versionrequired' => 'Necesítase la versión $1 de MediaWiki',
 'versionrequiredtext' => 'Necesítase la versión $1 de MediaWiki pa usar esta páxina. Ver la [[Special:Version|páxina de versión]].',
@@ -343,11 +355,11 @@ $1',
 'viewdeleted' => '¿Ver $1?',
 'restorelink' => '{{PLURAL:$1|una edición desaniciada|$1 ediciones desaniciaes}}',
 'feedlinks' => 'Canal:',
-'feed-invalid' => 'Suscripción non válida a la triba de canal.',
+'feed-invalid' => 'Tipu inválidu de canal de suscripción.',
 'feed-unavailable' => 'Les canales de sindicación nun tán disponibles',
-'site-rss-feed' => 'Canal RSS $1',
+'site-rss-feed' => 'Canal RSS de $1',
 'site-atom-feed' => 'Canal Atom $1',
-'page-rss-feed' => 'Canal RSS «$1»',
+'page-rss-feed' => 'Canal RSS de «$1»',
 'page-atom-feed' => 'Canal Atom «$1»',
 'red-link-title' => '$1 (la páxina nun esiste)',
 'sort-descending' => 'Orde descendente',
@@ -384,11 +396,11 @@ La postrer consulta a la base de datos que s'intentó foi:
 <blockquote><code>$1</code></blockquote>
 dende la función «<code>$2</code>».
 La base datos dio'l fallu «<samp>$3: $4</samp>».",
-'dberrortextcl' => "Hebo un fallu de sintaxis nuna consulta a la base de datos.
-La postrer consulta de la base de datos que s'intentó foi:
+'dberrortextcl' => "Hebo un error de sintaxis nuna consulta a la base de datos.
+La última consulta a la base de datos que s'intentó foi:
 «$1»
 dende la función «$2».
-La base de datos dio'l fallu «$3: $4».",
+La base de datos devolvió l'error «$3: $4».",
 'laggedslavemode' => "'''Avisu:''' Esta páxina pue que nun tenga actualizaciones recientes.",
 'readonly' => 'Base de datos candada',
 'enterlockreason' => 'Introduz un motivu pal candáu, amestando una estimación de cuándo va tener llugar el descandáu',
@@ -402,7 +414,7 @@ Esto débese davezu a siguir una \"dif\" caducada o un enllaz d'historial a una
 Si esti nun ye'l casu, seique tengas atopao un bug nel software.
 Por favor informa d'esto a un [[Special:ListUsers/sysop|alministrador]], anotando la URL.",
 'missingarticle-rev' => '(núm. revisión: $1)',
-'missingarticle-diff' => '(dif: $1, $2)',
+'missingarticle-diff' => '(Diff: $1, $2)',
 'readonly_lag' => 'La base de datos candóse automáticamente mentes los sirvidores de la base de datos esclava se sincronicen cola maestra',
 'internalerror' => 'Fallu internu',
 'internalerror_info' => 'Fallu internu: $1',
@@ -412,8 +424,8 @@ Por favor informa d'esto a un [[Special:ListUsers/sysop|alministrador]], anotand
 'filerenameerror' => 'Nun se pudo renomar el ficheru «$1» como «$2».',
 'filedeleteerror' => 'Nun se pudo desaniciar el ficheru «$1».',
 'directorycreateerror' => 'Nun se pudo crear el direutoriu «$1».',
-'filenotfound' => 'Nun se pudo atopar el ficheru «$1».',
-'fileexistserror' => 'Nun se pue escribir nel archivu «$1»: yá esiste',
+'filenotfound' => "Nun pudo atopase'l ficheru «$1».",
+'fileexistserror' => 'Nun se pue escribir nel ficheru «$1»: yá esiste',
 'unexpected' => 'Valor inesperáu: «$1»=«$2».',
 'formerror' => 'Fallu: Nun se pudo unviar el formulariu.',
 'badarticleerror' => 'Esta aición nun pue facese nesta páxina.',
@@ -424,16 +436,16 @@ Seique daquién yá lo desaniciara.",
 Nun conseñó esplicación.',
 'badtitle' => 'Títulu incorreutu',
 'badtitletext' => 'El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces interllingua o interwiki incorreutos.
-Pue contener un caráuter o más que nun se puen usar nos títulos.',
+Pue contener un caráuter o más que nun puen usase nos títulos.',
 'perfcached' => "Los datos siguientes tán na caché y seique nun tean anovaos. Hai un máximu {{PLURAL:$1|d'un resultáu disponible|de $1 resultaos disponibles}} na caché.",
-'perfcachedts' => "Los datos siguientes tán na caché y anováronse per postrer vegada'l $1. Hai un máximu {{PLURAL:$4|d'un resultáu disponible|de $4 resultaos disponibles}} na caché.",
+'perfcachedts' => "Los datos siguientes tán na caché y anovaronse por última vegada'l $1. Hai un máximu {{PLURAL:$4|d'un resultáu disponible|de $4 resultaos disponibles}} na caché.",
 'querypage-no-updates' => "Anguaño los anovamientos d'esta páxina tán desactivaos.
 Estos datos nun van refrescase nestos momentos.",
 'wrong_wfQuery_params' => 'Parámetros incorreutos pa wfQuery()<br />
 Función: $1<br />
 Consulta: $2',
 'viewsource' => 'Ver fonte',
-'viewsource-title' => 'Ver la fonte de «$1»',
+'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.
 Por favor vuelvi intentalo nunos minutos.',
@@ -446,19 +458,19 @@ P'amestar o cambiar les traducciones de toles wikis, por favor usa [//translatew
 Los cambeos nesta páxina van afeutar l'apariencia de la interfaz pa otros usuarios d'esta wiki.
 P'amestar o camudar traducciones pa toles wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyeutu de traducción de MediaWiki.",
 'sqlhidden' => '(consulta SQL anubrida)',
-'cascadeprotected' => "Esta páxina ta protexida d'ediciones porque ta enxerta {{PLURAL:$1|na siguiente páxina|nes siguientes páxines}}, que {{PLURAL:$1|ta protexida|tán protexíes}} cola opción «en cascada» activada:
+'cascadeprotected' => "Esta páxina ta protexida d'ediciones porque ta inxerta {{PLURAL:$1|na siguiente páxina, protexida|nes siguientes páxines, protexíes}} cola opción «en cascada» activada:
 $2",
 'namespaceprotected' => "Nun tienes permisu pa editar páxines nel espaciu de nomes '''$1'''.",
 'customcssprotected' => "Nun tienes permisu pa editar esta páxina CSS porque contién preferencies personales d'otru usuariu.",
 'customjsprotected' => "Nun tienes permisu pa editar esta páxina de JavaScript porque contién preferencies personales d'otru usuariu.",
 'ns-specialprotected' => 'Les páxines especiales nun se puen editar.',
-'titleprotected' => "Esti títulu foi protexíu de la so creación por [[User:$1|$1]].
+'titleprotected' => "Esti títulu ta protexíu escontra creación por [[User:$1|$1]].
 El motivu conseñáu ye «''$2''».",
-'filereadonlyerror' => "Nun se pudo camudar el ficheru «$1» porque'l repositoriu de ficheros «$2» ta en mou de namái llectura.
+'filereadonlyerror' => "Nun pudo camudase'l ficheru «$1» porque'l depósitu de ficheros «$2» ta en mou de sólo llectura.
 
 L'alministrador que lu bloquió dio esti motivu: «$3».",
-'invalidtitle-knownnamespace' => 'Títulu non válidu col espaciu de nomes «$2» y el testu «$3»',
-'invalidtitle-unknownnamespace' => "Titulu non válidu col númberu $1 d'espaciu de nomes desconocíu y el testu «$2»",
+'invalidtitle-knownnamespace' => "Títulu inválidu col espaciu de nomes «$2» ya'l testu «$3»",
+'invalidtitle-unknownnamespace' => "Títulu inválidu col númberu $1 d'espaciu de nomes desconocíu ya'l testu «$2»",
 'exception-nologin' => 'Non identificáu',
 'exception-nologin-text' => "Esta páxina o aición necesita qu'anicies sesión nesta wiki.",
 
@@ -474,12 +486,21 @@ Pues siguir usando {{SITENAME}} de forma anónima, o pues <span class='plainlink
 Ten en cuenta que dalgunes páxines puen siguir apaeciendo como si tovía tuvieres coneutáu, hasta que llimpies la caché del restolador.",
 'welcomeuser' => '¡Bienllegáu, $1!',
 'welcomecreation-msg' => "Creóse la to cuenta.
-Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAME}}]].",
+Nun t'escaezas de camudar les tos [[Special:Preferences|preferencies de {{SITENAME}}]].",
 'yourname' => "Nome d'usuariu:",
+'userlogin-yourname' => "Nome d'usuariu",
+'userlogin-yourname-ph' => "Escriba'l so nome d'usuariu",
 'yourpassword' => 'Contraseña:',
+'userlogin-yourpassword' => 'Contraseña',
+'userlogin-yourpassword-ph' => 'Escriba la so contraseña',
+'createacct-yourpassword-ph' => 'Escriba una contraseña',
 'yourpasswordagain' => 'Escribi otra vuelta la contraseña:',
+'createacct-yourpasswordagain' => 'Confirmar la contraseña',
+'createacct-yourpasswordagain-ph' => 'Escriba nuevamente la contraseña',
 'remembermypassword' => "Recordar la mio identificación nesti restolador (un máximu {{PLURAL:$1|d'un día|de $1 díes}})",
-'securelogin-stick-https' => "Siguir coneutáu al HTTPS dempués d'identificase",
+'userlogin-remembermypassword' => 'Caltener abierta la sesión',
+'userlogin-signwithsecure' => 'Usar una conexón segura',
+'securelogin-stick-https' => "Siguir coneutáu con HTTPS dempués d'aniciar sesión",
 'yourdomainname' => 'El to dominiu:',
 'password-change-forbidden' => 'Nun se pueden camudar les contraseñes nesta wiki.',
 'externaldberror' => "O hebo un fallu d'autenticación de la base de datos o nun tienes permisu p'anovar la to cuenta esterna.",
@@ -487,162 +508,180 @@ Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAM
 'nav-login-createaccount' => 'Identificase / crear una cuenta',
 'loginprompt' => 'Has tener les «cookies» activaes pa identificate en {{SITENAME}}.',
 'userlogin' => 'Identificase / crear una cuenta',
-'userloginnocreate' => 'Identificase',
-'logout' => 'Dexar de tar identificáu',
+'userloginnocreate' => 'Aniciar sesión',
+'logout' => 'Colar',
 'userlogout' => 'Colar',
 'notloggedin' => 'Non identificáu',
+'userlogin-noaccount' => '¿Nun tien una cuenta?',
+'userlogin-joinproject' => 'Xunise a {{SITENAME}}',
 'nologin' => '¿Nun tienes una cuenta? $1.',
 'nologinlink' => 'Crear una cuenta',
 'createaccount' => 'Crear una cuenta',
 'gotaccount' => '¿Ya tienes una cuenta? $1.',
 'gotaccountlink' => 'Identificase',
 'userlogin-resetlink' => "¿Escaecisti los datos d'identificación?",
+'userlogin-resetpassword-link' => 'Reaniciar la contraseña',
+'helplogin-url' => 'Help:Aniciar sesión',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Ayuda p'aniciar sesión]]",
+'createacct-join' => 'Escriba abaxo la so información.',
+'createacct-emailrequired' => 'Direición de corréu electrónicu',
+'createacct-emailoptional' => 'Direición de corréu electrónicu (opcional)',
+'createacct-email-ph' => 'Escriba la so direición de corréu electrónicu',
 'createaccountmail' => 'Usar una contraseña al debalu temporal y unviala a la direición de corréu electrónicu conseñada más abaxo',
+'createacct-realname' => 'Nome real (opcional)',
 'createaccountreason' => 'Motivu:',
-'badretype' => "Les claves qu'escribisti nun concuayen.",
+'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-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.",
 'userexists' => "El nome d'usuariu conseñáu yá ta usándose.
 Por favor escueyi un nome diferente.",
-'loginerror' => "Fallu d'identificación",
+'loginerror' => "Error d'aniciu de sesión",
+'createacct-error' => 'Error de creación de cuenta',
 'createaccounterror' => 'Nun se pudo crear la cuenta: $1',
-'nocookiesnew' => "La cuenta d'usuariu ta creada, pero nun tas identificáu.
+'nocookiesnew' => "La cuenta d'usuariu ta creada, pero nun aniciasti sesión.
 {{SITENAME}} usa «cookies» pa identificar a los usuarios.
 Tienes les «cookies» desactivaes.
 Por favor activales y depués entra col to nome d'usuariu y clave nuevos.",
 'nocookieslogin' => '{{SITENAME}} usa «cookies» pa identificar a los usuarios.
 Tienes les «cookies» desactivaes.
-Por favor actívales y vuelvi intentalo.',
+Por favor activales y vuelvi a intentalo.',
 'nocookiesfornew' => "La cuenta nun se creó porque nun pudimos confirmar l'orixe.
-Asegúrate de tener activaes les «cookies», recarga esta páxina y vuelvi intentalo.",
+Comprueba que tienes activaes les «cookies», recarga esta páxina y vuelvi a intentalo.",
 'noname' => "Nun conseñasti un nome d'usuariu válidu.",
-'loginsuccesstitle' => 'Identificación correuta',
-'loginsuccess' => "'''Quedasti identificáu en {{SITENAME}} como «$1».'''",
+'loginsuccesstitle' => 'Aniciu de sesión correutu',
+'loginsuccess' => "'''Aniciasti sesión en {{SITENAME}} como «$1».'''",
 'nosuchuser' => "Nun hai nengún usuariu col nome «$1».
 Los nomes d'usuariu distinguen mayúscules y minúscules.
 Mira que tea bien escritu o [[Special:UserLogin/signup|crea una cuenta nueva]].",
 'nosuchusershort' => 'Nun hai nengún usuariu col nome «$1».
 Mira que tea bien escritu.',
-'nouserspecified' => "Has especificar un nome d'usuariu.",
-'login-userblocked' => 'Esti usuariu ta bloquiáu. Nun se permite la so identificación.',
-'wrongpassword' => 'La clave escrita ye incorreuta.
-Vuelvi intentalo.',
-'wrongpasswordempty' => 'La clave taba en blanco.
-Vuelvi intentalo.',
-'passwordtooshort' => 'Les claves han tener a lo menos {{PLURAL:$1|1 caráuter|$1 carauteres}}.',
-'password-name-match' => "La clave ha ser distinta del nome d'usuariu.",
-'password-login-forbidden' => "Ta torgao usar esti nome d'usuariu y clave.",
+'nouserspecified' => "Has d'especificar un nome d'usuariu.",
+'login-userblocked' => "Esti usuariu ta bloquiáu. Nun se permite l'aniciu de sesión.",
+'wrongpassword' => 'Escribisti una contraseña incorreuta.
+Vuelvi intentalo.',
+'wrongpasswordempty' => 'La contraseña taba en blanco.
+Vuelvi intentalo.',
+'passwordtooshort' => 'Les contraseñes han de tener polo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}}.',
+'password-name-match' => "La contraseña tien de ser distinta del nome d'usuariu.",
+'password-login-forbidden' => "Ta torgao usar esti nome d'usuariu y contraseña.",
 'mailmypassword' => 'Unviar la clave nueva per corréu',
-'passwordremindertitle' => 'Clave nueva provisional pa {{SITENAME}}',
-'passwordremindertext' => "Daquién (seique tu, dende la direición IP $1) solicitó una clave
-nueva pa {{SITENAME}} ($4). Creóse una clave provisional pal usuariu
-«$2» que ye «$3». Si fuisti tu, necesites identificate y escoyer
-una clave nueva agora. La clave provisional caduca {{PLURAL:$5|nun día|en $5 díes}}.
-
-Si esta solicitú la fizo otra persona, o si recuerdes la clave y
-nun quies volver camudala, pues escaecete d'esti mensaxe y siguir
-usando la clave antigua.",
+'passwordremindertitle' => 'Nueva contraseña provisional pa {{SITENAME}}',
+'passwordremindertext' => "Daquién (seique tu, dende la direición IP $1) solicitó una contraseña
+nueva pa {{SITENAME}} ($4). Creóse una contraseña provisional
+pal usuariu «$2» que ye «$3». Si fuisti tu, necesites aniciar
+sesión y escoyer una contraseña nueva agora.
+La contraseña provisional caducará {{PLURAL:$5|nun día|en $5 díes}}.
+
+Si esta solicitú fizola otra persona, o si recordasti la contraseña,
+y nun quies camudala, pues escaecete d'esti mensaxe y siguir
+usando la contraseña antigua.",
 'noemail' => "L'usuariu «$1» nun tien rexistrada nenguna direición de corréu.",
-'noemailcreate' => 'Has conseñar una direición de corréu válida',
-'passwordsent' => 'Univóse una clave nueva a la direición de corréu rexistrada pa «$1».
-Por favor vuelvi identificate depués de recibila.',
-'blocked-mailpassword' => 'Ta bloquiada la edición dende la to direición IP, polo que pa evitar abusos nun se pue usar la función de recuperación de clave.',
+'noemailcreate' => 'Tienes de conseñar una direición de corréu válida.',
+'passwordsent' => 'Unvióse una contraseña nueva a la direición de corréu rexistrada pa «$1».
+Por favor vuelvi a aniciar sesión depués de recibila.',
+'blocked-mailpassword' => 'Ta bloquiada la edición dende la to direición IP, polo que pa evitar abusos nun se pue usar la función de recuperación de contraseña.',
 'eauthentsent' => "Unvióse un corréu electrónicu de confirmación a la direición indicada.
-Enantes de que s'unvie nengún otru corréu a la cuenta, has siguir les instrucciones del corréu electrónicu pa confirmar que la cuenta ye de to.",
-'throttled-mailpassword' => "Yá s'unvió un recordatoriu de la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
-Pa evitar abusos, namái s'unviará un recordatoriu cada {{PLURAL:$1|hora|$1 hores}}.",
+Enantes de que s'unvie nengún otru corréu a la cuenta, has de siguir les instrucciones del corréu electrónicu pa confirmar que la cuenta ye de to.",
+'throttled-mailpassword' => "Yá s'unvió un corréu de reaniciu la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
+Pa evitar abusos, namái s'unviará un corréu de reaniciu cada {{PLURAL:$1|hora|$1 hores}}.",
 'mailerror' => 'Fallu al unviar el corréu: $1',
 'acct_creation_throttle_hit' => "Los visitantes d'esta wiki qu'usen la to direición IP yá crearon güei {{PLURAL:$1|1 cuenta|$1 cuentes}}, que ye'l máximu almitíu nesti periodu de tiempu.
 Poro, los visitantes qu'usen esta direición IP nun puen crear más cuentes de momentu.",
 'emailauthenticated' => "La to direición de corréu electrónicu confirmóse'l $2 a les $3.",
-'emailnotauthenticated' => 'La to direición de corréu electrónicu nun se comprobó entá.
-Nun va unviase nengún corréu pa nenguna de les funciones siguientes.',
+'emailnotauthenticated' => "La to direición de corréu electrónicu inda nun se comprobó.
+Nun s'unviará corréu pa nenguna de les funciones siguientes.",
 'noemailprefs' => 'Conseña una direición de corréu electrónicu nes tos preferencies pa que funcionen eses carauterístiques.',
 'emailconfirmlink' => 'Confirmar la direición de corréu electrónicu',
-'invalidemailaddress' => "La direición de corréu electrónicu nun se pue aceutar yá que paez tener un formatu non válidu.
+'invalidemailaddress' => "La direición de corréu electrónicu nun pue aceutase yá que paez tener un formatu inválidu.
 Por favor conseña una direición con formatu afayadizu o dexa baleru'l campu.",
 'cannotchangeemail' => 'Les direiciones de corréu electrónicu de la cuenta nun puen camudase nesta wiki.',
 'emaildisabled' => 'Esti sitiu nun pue unviar correos electrónicos.',
 'accountcreated' => 'Cuenta creada',
 'accountcreatedtext' => "Creóse la cuenta d'usuariu de $1.",
 'createaccount-title' => 'Creación de cuenta pa {{SITENAME}}',
-'createaccount-text' => 'Daquién creó una cuenta cola to direición de corréu electrónicu en {{SITENAME}} ($4) col nome «$2», asociada a la clave «$3».
-Habríes identificte y camudar la clave agora.
+'createaccount-text' => "Daquién creó una cuenta cola to direición de corréu electrónicu en {{SITENAME}} ($4) col nome «$2», y cola contraseña «$3».
+Agora tendríes d'aniciar sesión y camudar la contraseña.
 
-Pues escaecer esti mensaxe si esta cuenta se creó por error.',
-'usernamehasherror' => "El nome d'usuariu nun pue contener carauteres «hash»",
-'login-throttled' => "Ficisti demasiaos intentos recientes d'identificación.
+Pues escaecer esti mensaxe si esta cuenta creóse por error.",
+'usernamehasherror' => "El nome d'usuariu nun pue contener caráuteres «hash»",
+'login-throttled' => "Ficisti demasiaos intentos d'aniciu de sesión recientes.
 Por favor espera enantes d'intentalo otra vuelta.",
 'login-abort-generic' => 'Falló la to identificación - Encaboxao',
 'loginlanguagelabel' => 'Llingua: $1',
-'suspicious-userlogout' => "Negósete'l pidimientu de desconexón porque paez que vien d'un restolador frañíu o d'un proxy de caché.",
+'suspicious-userlogout' => "La to solicitú de zarrar sesión refugose porque paez qu'unvióla un restolador frañíu o un proxy de caché.",
 
 # Email sending
 'php-mail-error-unknown' => 'Fallu desconocíu na función mail() de PHP.',
-'user-mail-no-addy' => 'Intentasti unviar un corréu electrónicu ensin direición.',
+'user-mail-no-addy' => 'Intentasti unviar un corréu electrónicu ensin direición de corréu.',
 'user-mail-no-body' => "Trató d'unviar un corréu electrónicu con un cuerpu baleru o curtiu enforma.",
 
 # Change password dialog
-'resetpass' => 'Camudar la clave',
-'resetpass_announce' => "Identificástite con una clave provisional unviada per corréu electrónicu.
-P'acabar d'identificate, has conseñar equí una clave nueva:",
+'resetpass' => 'Camudar la contraseña',
+'resetpass_announce' => "Aniciasti sesión con un códigu provisional unviáu per corréu electrónicu.
+P'acabar d'aniciar sesión, tienes de configurar equí una contraseña nueva:",
 'resetpass_text' => '<!-- Amestar testu equí -->',
-'resetpass_header' => 'Camudar la clave de la cuenta',
-'oldpassword' => 'Clave antigua:',
-'newpassword' => 'Clave nueva:',
-'retypenew' => 'Escribi otra vuelta la clave nueva:',
-'resetpass_submit' => 'Conseñar una clave y identificase',
-'resetpass_success' => '¡Camudóse correutamente la to clave!
-Pasando a identificate...',
-'resetpass_forbidden' => 'Les claves nun se puen camudar',
-'resetpass-no-info' => "Has tar identificáu p'acceder direutamente a esta páxina.",
-'resetpass-submit-loggedin' => 'Camudar la clave',
+'resetpass_header' => 'Camudar la contraseña de la cuenta',
+'oldpassword' => 'Contraseña antigua:',
+'newpassword' => 'Contraseña nueva:',
+'retypenew' => 'Vuelvi a escribir la contraseña nueva:',
+'resetpass_submit' => 'Configurar la contraseña y aniciar sesión',
+'resetpass_success' => '¡Camudóse la contraseña correutamente!
+Aniciando sesión agora...',
+'resetpass_forbidden' => 'Nun puen camudase les contraseñes',
+'resetpass-no-info' => "Tienes d'aniciar sesión pa entrar direutamente a esta páxina.",
+'resetpass-submit-loggedin' => 'Camudar la contraseña',
 'resetpass-submit-cancel' => 'Encaboxar',
-'resetpass-wrong-oldpass' => 'Clave provisional o actual non válida.
-Seique yá camudaras correutamente la clave o que pidieras una nueva clave provisional.',
-'resetpass-temp-password' => 'Clave provisional:',
+'resetpass-wrong-oldpass' => 'Contraseña temporal o actual inválida.
+Seique yá camudaras correutamente la contraseña o que pidieras una nueva contraseña temporal.',
+'resetpass-temp-password' => 'Contraseña temporal:',
+'resetpass-abort-generic' => "Una estensión encaboxó'l cambiu de la contraseña.",
 
 # Special:PasswordReset
-'passwordreset' => 'Reaniciar clave',
-'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu electrónicu que te recuerde los detalles de la to cuenta.',
-'passwordreset-legend' => 'Reaniciar clave',
-'passwordreset-disabled' => 'Los reanicios de clave tán desactivaos nesta wiki.',
-'passwordreset-pretext' => "{{PLURAL:$1||Escribi ún de los elementos de los datos d'abaxo}}",
+'passwordreset' => 'Reaniciar contraseña',
+'passwordreset-text-one' => 'Complete esti formulariu pa reaniciar la contraseña.',
+'passwordreset-text-many' => '{{PLURAL:$1|Escriba una de les partes de los datos pa reaniciar la contraseña.}}',
+'passwordreset-legend' => 'Reaniciar contraseña',
+'passwordreset-disabled' => 'Los reanicios de contraseña tán desactivaos nesta wiki.',
+'passwordreset-emaildisabled' => 'Les funciones de corréu electrónicu tan desactivaes nesta wiki.',
 'passwordreset-username' => "Nome d'usuariu:",
 'passwordreset-domain' => 'Dominiu:',
 'passwordreset-capture' => '¿Ver el corréu electrónicu resultante?',
-'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola clave provisional) amás d'unvialu al usuariu.",
+'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola contraseña temporal) amás d'unvialu al usuariu.",
 'passwordreset-email' => 'Direición de corréu electrónicu:',
 'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Daquién (seique tu, dende la direición IP $1)solicitó un recordatoriu de los
-detalles de la to cuenta de {{SITENAME}} ($4).
+'passwordreset-emailtext-ip' => "Dalguién (seique vusté, dende la direición IP $1)solicitó'l 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}}
 a esta direición de corréu electrónicu:
 
 $2
 
-{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nún día|en $5 díes}}.
-Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona,
-o si recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir
-usando la to clave antigua.",
-'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} solicitó un recordatoriu de los detalles de la to cuenta de {{SITENAME}} ($4).
-{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
-a esta direición de corréu electrónicu:
+{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Tendrí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-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:
 
 $2
 
-{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
-Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona, o si
-recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir usando
-la to clave antigua.",
+{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Tendrí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
-Clave provisional: $2",
-'passwordreset-emailsent' => 'Unvióse un corréu electrónicu de recordatoriu.',
-'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu de recordatoriu, que s'amuesa abaxo.",
-'passwordreset-emailerror-capture' => "Xeneróse un corréu electrónicu de recordatoriu, que s'amuesa abaxo, pero falló'l so unviu al usuariu: $1",
+Contraseña temporal: $2",
+'passwordreset-emailsent' => 'Unvióse un corréu electrónicu 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",
 
 # Special:ChangeEmail
 'changeemail' => 'Camudar la direición de corréu electrónicu',
 'changeemail-header' => 'Camudar la direición de corréu electrónicu de la cuenta',
-'changeemail-text' => 'Rellena esti formulariu pa camudar la to direición de corréu electrónicu. Habrás escribir la to clave pa confirmar esti cambéu.',
+'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-no-info' => "Has tar identificáu p'acceder 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:',
@@ -659,8 +698,8 @@ Clave provisional: $2",
 'link_sample' => 'Títulu del enllaz',
 'link_tip' => 'Enllaz internu',
 'extlink_sample' => 'http://www.example.com títulu del enllaz',
-'extlink_tip' => 'Enllaz esternu (alcuérdate del prefixu http://)',
-'headline_sample' => 'Testu de cabecera',
+'extlink_tip' => "Enllaz esternu (recuerda'l prefixu http://)",
+'headline_sample' => 'Testu del titular',
 'headline_tip' => 'Cabecera de nivel 2',
 'nowiki_sample' => 'Pon equí testu ensin formatu',
 'nowiki_tip' => 'Inorar el formatu wiki',
@@ -673,7 +712,7 @@ Clave provisional: $2",
 
 # Edit pages
 'summary' => 'Resume:',
-'subject' => 'Asuntu/cabecera:',
+'subject' => 'Asuntu/titular:',
 'minoredit' => 'Esta ye una edición menor',
 'watchthis' => 'Vixilar esta páxina',
 'savearticle' => 'Guardar la páxina',
@@ -683,69 +722,67 @@ Clave provisional: $2",
 'showdiff' => 'Amosar cambeos',
 'anoneditwarning' => "'''Avisu:''' Nun tas identificáu.
 La to direición IP va quedar grabada nel historial d'edición d'esta páxina.",
-'anonpreviewwarning' => "''Nun tas identificáu. Al guardar va queda rexistrada la to direición IP nel historial d'edición d'esta páxina.''",
+'anonpreviewwarning' => "''Nun aniciasti sesión. Al guardar quedará rexistrada la to direición IP nel historial d'edición d'esta páxina.''",
 'missingsummary' => "'''Recordatoriu:''' Nun conseñasti un resume d'edición.
-Si vuelves calcar en \"{{int:savearticle}}\", la to edición va guardase ensin nengún resume.",
-'missingcommenttext' => 'Por favor, escribi un comentariu embaxo.',
-'missingcommentheader' => "'''Recordatoriu:''' Nun-y conseñasti asuntu/cabecera a esti comentariu.
-Si vuelves calcar en \"{{int:savearticle}}\", la to edición va guardase ensin nengún comentariu.",
-'summary-preview' => 'Previsualización del resume:',
-'subject-preview' => 'Previsualización del asuntu/cabecera:',
+Si calques nuevamente \"{{int:savearticle}}\", la to edición guardaráse ensin nengún resume.",
+'missingcommenttext' => 'Por favor, escribi un comentariu abaxo.',
+'missingcommentheader' => "'''Recordatoriu:''' Nun conseñasti un asuntu/titular pa esti comentariu.
+Si calques nuevamente \"{{int:savearticle}}\", la to edición guardaráse ensin dengún.",
+'summary-preview' => 'Vista previa del resume:',
+'subject-preview' => 'Vista previa del asuntu/titular:',
 'blockedtitle' => "L'usuariu ta bloquiáu",
-'blockedtext' => "'''Bloquióse'l to nome d'usuariu o la to direición IP.'''
+'blockedtext' => "'''El to nome d'usuariu o direición IP ta bloquiáu.'''
 
-El bloquéu féxolu $1.
+El bloquéu fexolu $1.
 El motivu conseñáu ye ''$2''.
 
-* Entamu del bloquéu: $8
+* Principiu del bloquéu: $8
 * Caducidá del bloquéu: $6
 * Usuariu a bloquiar: $7
 
-Pues ponete en contautu con $1 o con cualesquier otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p'aldericar sobre'l bloquéu.
-Nun pues usar la funcionalidá 'manda-y un corréu electrónicu a esti usuariu' a nun ser que tea especificada una direición de
-corréu electrónicu válida na to [[Special:Preferences|páxina de preferencies]] y que nun te tengan bloquiao'l so usu.
-La to direición IP actual ye $3, y el númberu d'identificación del bloquéu ye $5.
-Por favor, amiesta tolos detalles nes consultes que faigas.",
-'autoblockedtext' => 'Bloquióse automáticamente la to direición IP porque la usó otru usuariu que foi bloquiáu por $1.
+Pues ponete'n contautu con $1 o con otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p'aldericar sobre'l bloquéu.
+Nun 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
+corréu electrónicu válida nes tos [[Special:Preferences|preferencies de cuenta]] y que nun tengas torgao usala.
+La to direición IP actual ye $3, y la ID del bloquéu ye #$5.
+Por favor, incluye tolos detalles anteriores nes consultes que faigas.",
+'autoblockedtext' => "La to direición IP bloquióse automáticamente porque usóla otru usuariu que foi bloquiáu por $1.
 El motivu conseñáu ye:
 
-:\'\'$2\'\'
+:''$2''
 
-* Entamu del bloquéu: $8
+* Principiu del bloquéu: $8
 * Caducidá del bloquéu: $6
 * Usuariu a bloquiar: $7
 
-Pues ponete en contautu con $1 o con cualesquier otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p\'aldericar sobre\'l bloquéu.
-
-Fíxate en que nun pues usar la funcionalidá "manda-y un corréu electrónicu a esti usuariu" a nun se que tea rexistrada una direición de corréu electrónicu válida na to [[Special:Preferences|páxina de preferencies]] y que nun te tengan bloquiao\'l so usu.
+Pues ponete'n contautu con $1 o con otru de los [[{{MediaWiki:Grouppage-sysop}}|alministradores]] p'aldericar sobre'l bloquéu.
 
-La to direición IP actual ye $3, y el númberu d\'identificación del bloquéu ye $5.
-Por favor, amiesta tolos detalles nes consultes que faigas.
+Ten en cuenta que nun pues usar la función «manda-y un corréu electrónicu a esti usuariu» a nun ser que tengas rexistrada una direición de corréu electrónicu válida nes [[Special:Preferences|preferencies d'usuariu]] y que nun tengas torgao usala.
 
-La to direición IP actual ye $3, y el númberu d\'identificación del bloquéu ye $5.
-Por favor, amiesta tolos detalles nes consultes que faigas.',
+La to direición IP actual ye $3, y la ID del bloquéu ye #$5.
+Por favor, incluye tolos detalles anteriores nes consultes que faigas.",
 'blockednoreason' => 'nun se dio nengún motivu',
-'whitelistedittext' => 'Has $1 pa editar páxines.',
-'confirmedittext' => "Has confirmar la to direición de corréu electrónicu enantes d'editar páxines.
-Por favor, defínila y valídala nes tos [[Special:Preferences|preferencies d'usuariu]].",
-'nosuchsectiontitle' => 'Nun se pue atopar la seición',
+'whitelistedittext' => "Tienes d'$1 pa editar páxines.",
+'confirmedittext' => "Tienes de confirmar la direición de corréu electrónicu enantes d'editar páxines.
+Por favor, configura y valida la direición de corréu nes [[Special:Preferences|preferencies d'usuariu]].",
+'nosuchsectiontitle' => 'Nun pue atopase la seición',
 'nosuchsectiontext' => 'Intentasti editar una seición que nun esiste.
 Seique se treslladara o desaniciara mientres víes la páxina.',
-'loginreqtitle' => 'Necesítase identificación',
-'loginreqlink' => 'identificate',
-'loginreqpagetext' => 'Has $1 pa ver otres páxines.',
-'accmailtitle' => 'Clave unviada.',
-'accmailtext' => "Unvióse a $2 una clave xenerada al debalu pal usuariu [[User talk:$1|$1]].
+'loginreqtitle' => 'Ye necesario aniciar sesión',
+'loginreqlink' => 'aniciar sesión',
+'loginreqpagetext' => "Tienes d'$1 pa ver otres páxines.",
+'accmailtitle' => 'Clave unviada',
+'accmailtext' => "Unvióse a $2 una contraseña xenerada al debalu pal usuariu [[User talk:$1|$1]].
 
-La clave d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|camudar clave]]'' depués d'identificate.",
+La contraseña d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|camudar contraseña]]'' depués d'aniciar sesión.",
 'newarticle' => '(Nuevu)',
 'newarticletext' => "Siguisti un enllaz a un artículu qu'inda nun esiste.
 Pa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [[{{MediaWiki:Helppage}}|páxina d'ayuda]] pa más información).
 Si llegasti equí por enquivocu, calca nel botón '''atrás''' del to restolador.",
-'anontalkpagetext' => "----''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.
+'anontalkpagetext' => "----
+''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''
 Pola mor d'ello ha usase la direición numbérica IP pa identificalu/la.
 Tala IP pue ser compartida por varios usuarios.
-Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.''",
+Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.",
 'noarticletext' => 'Nestos momentos nun hai testu nesta páxina.
 Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos],
@@ -759,42 +796,43 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'userpage-userdoesnotexist' => "La cuenta d'usuariu «$1» nun ta rexistrada.
 Por favor comprueba si quies crear/editar esta páxina.",
 'userpage-userdoesnotexist-view' => "La cuenta d'usuariu «$1» nun ta rexistrada.",
-'blocked-notice-logextract' => 'Nestos momentos esti usuariu ta bloquiáu.
-La postrer entrada del rexistru de bloqueos úfrese darréu pa referencia:',
+'blocked-notice-logextract' => 'Anguaño esti usuariu ta bloquiáu.
+Más abaxo ufrese la entrada del rexistru de bloqueos pa referencia:',
 'clearyourcache' => "'''Nota:''' Llueu de guardar, seique tengas que llimpiar la caché del restolador pa ver los cambeos.
 *'''Firefox / Safari:''' Caltén ''Mayús'' mentes calques en ''Recargar'', o calca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' nun Mac)
 * '''Google Chrome:''' Calca ''Ctrl-Mayús-R'' (''⌘-Mayús-R'' nun Mac)
 * '''Internet Explorer:''' Caltén ''Ctrl'' mentes calques ''Refrescar'', o calca ''Ctrl-F5''
 * '''Opera:''' llimpia la caché en ''Ferramientes → Preferencies''",
-'usercssyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to CSS nuevu enantes de guardalu.",
-'userjsyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to JavaScript nuevu enantes de guardalu.",
-'usercsspreview' => "'''Recuerda que namái tas previsualizando'l to CSS d'usuariu.'''
-'''¡Tovía nun ta guardáu!'''",
-'userjspreview' => "'''¡Recuerda que namái tas probando/previsualizando'l to JavaScript d'usuariu.'''
-'''¡Tovía nun ta guardáu!'''",
+'usercssyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el CSS nuevu enantes de guardalu.",
+'userjsyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el JavaScript nuevu enantes de guardalu.",
+'usercsspreview' => "'''Recuerda que namái ye la vista previa del CSS d'usuariu.'''
+'''¡Inda nun ta guardáu!'''",
+'userjspreview' => "'''Recuerda que namái ye la prueba/vista previa del JavaScript d'usuariu.'''
+'''¡Inda nun ta guardáu!'''",
 'sitecsspreview' => "'''Recuerda que namái tas previsualizando esti CSS.'''
 '''¡Tovía nun ta guardáu!'''",
-'sitejspreview' => "'''¡Recuerda que namái tas probando esti códigu JavaScript.'''
-'''¡Tovía nun tá guardáu!'''",
-'userinvalidcssjstitle' => "'''Avisu:''' Nun hai apariencia «$1».
-Les páxines personalizaes .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
-'updated' => '(Actualizao)',
+'sitejspreview' => "'''Recuerda que namái tas probando esti códigu JavaScript.'''
+'''¡Inda nun tá guardáu!'''",
+'userinvalidcssjstitle' => "'''Avisu:''' Nun esiste'l tema «$1».
+Les páxines personalizaes de .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css y non {{ns:user}}:Foo/Vector.css.",
+'updated' => '(Anovao)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Alcuerdate de qu'esto ye sólo una vista previa.'''
 ¡Los cambios entá nun se guardaron!",
 'continue-editing' => "Dir al área d'edición",
 'previewconflict' => "Esta vista previa amuesa'l testu del área d'edición d'arriba tal como apaecerá si escueyes guardar.",
-'session_fail_preview' => "'''¡Sentímoslo muncho! Nun se pudo procesar la to edición porque hebo una perda de datos de la sesión.
-Inténtalo otra vuelta. Si nun se t'arregla, intenta salir y volver a rexistrate.'''",
-'session_fail_preview_html' => "'''¡Sentímoslo! Nun se pudo procesar la to edición pola mor d'una perda de datos de sesión.'''
+'session_fail_preview' => "'''¡Sentímoslo muncho! Nun pudimos procesar la to edición por aciu d'una perda de datos de la sesión.'''
+Por favor, vuelvi a intentalo.
+Si inda nun funciona, intenta [[Special:UserLogout|colar]] y volver a aniciar sesión.",
+'session_fail_preview_html' => "'''¡Sentímoslo! Nun pudo procesase la to edición por aciu d'una perda de datos de la sesión.'''
 
-''Como {{SITENAME}} tien activáu'l HTML puru, la previsualización nun s'amosará como precaución escontra ataques en JavaScript.''
+''Como {{SITENAME}} tien el HTML puru activáu, la vista previa ta tapecida como precaución escontra ataques en JavaScript.''
 
-'''Si esti ye un intentu llexítimu d'edición, por favor inténtalo otra vuelta. Si tovía asina nun furrula, intenta [[Special:UserLogout|desconeutate]] y volver a identificate.'''",
+'''Si esti ye un intentu llexítimu d'edición, por favor vuelvi a intentalo.''' Si inda nun funciona, intenta [[Special:UserLogout|colar]] y volver a aniciar sesión.",
 'token_suffix_mismatch' => "'''La to edición nun s'aceutó porque'l to navegador mutiló los caráuteres de puntuación nel editor.'''
 La edición nun foi aceutada pa prevenir corrupciones na páxina de testu.
 Dacuando esto pasa por usar un serviciu proxy anónimu basáu en web que tenga fallos.",
-'edit_form_incomplete' => "'''Delles partes del formulariu d'edición nun llegaron al sirvidor; comprueba que les ediciones tean intactes y vuelve a tentalo.'''",
+'edit_form_incomplete' => "'''Delles partes del formulariu d'edición nun llegaron al sirvidor; comprueba que les ediciones tean intactes y vuelvi a tentalo.'''",
 'editing' => 'Editando $1',
 'creating' => 'Creando $1',
 'editingsection' => 'Editando $1 (seición)',
@@ -807,12 +845,12 @@ Vas tener que fusionar los tos cambios dientro del testu esistente.
 '''Namái''' va guardase'l testu del área d'arriba cuando calques \"{{int:savearticle}}\".",
 'yourtext' => 'El to testu',
 'storedversion' => 'Versión almacenada',
-'nonunicodebrowser' => "'''AVISU: El to navegador nun cumple la norma unicode. Hai un sistema alternativu que te permite editar páxines de forma segura: los carauteres non-ASCII apaecerán na caxa d'edición como códigos hexadecimales.'''",
+'nonunicodebrowser' => "'''Avisu: El to navegador nun cumple la norma Unicode.''' Hai un sistema alternativu que te permite editar páxines de forma segura: los caráuteres non-ASCII apaecerán nel cuadru d'edición como códigos hexadecimales.",
 'editingold' => "'''AVISU: Tas editando una revisión vieya d'esta páxina. Si la grabes, los cambios que se ficieron dende esta revisión van perdese.'''",
 'yourdiff' => 'Diferencies',
-'copyrightwarning' => "Por favor, ten en cuenta que toles contribuciones de {{SITENAME}} se consideren espublizaes baxo la $2 (ver $1 pa más detalles). Si nun quies que'l to trabayu s'edite ensin midida y se distribuya al debalu, nun lu pongas equí.<br />
-Amás tas dexándonos afitao qu'escribisti esto tu mesmu o que lo copiasti d'una fonte llibre de dominiu públicu o asemeyao.
-'''¡NUN PONGAS TRABAYOS CON DERECHOS D'AUTOR ENSIN PERMISU!'''",
+'copyrightwarning' => "Por favor, ten en cuenta que toles collaboraciones de {{SITENAME}} considerense espublizaes baxo la $2 (ver $1 pa más detalles). Si nun quies que'l to trabayu s'edite ensin midida y se distribuya al debalu, nun lu pongas equí.<br />
+Amás tas prometiendonos qu'escribisti esto tu mesmu o que copiastilo d'una fonte llibre de dominiu públicu o asemeyao.
+'''¡Nun unvies obres con drechos d'autor ensin permisu!'''",
 'copyrightwarning2' => "Por favor, ten en cuenta que toles contribuciones de {{SITENAME}} se puen editar, alterar o desaniciar por otros usuarios. Si nun quies que'l to trabayu s'edite ensin midida, nun lu pongas equí.<br />
 Amás tas dexándonos afitao qu'escribisti esto tu mesmu, o que lo copiasti d'una fonte llibre de dominiu públicu o asemeyao (ver $1 pa más detalles).
 '''¡Nun pongas trabayos con drechos d'autor ensin permisu!'''",
@@ -826,7 +864,7 @@ L'alministrador que la candó dio esta esplicación: $1",
 La cabera entrada del rexistru s'ufre darréu pa referencia:",
 'semiprotectedpagewarning' => "'''Nota:''' Esta páxina ta candada pa que nun puean editala namái que los usuarios rexistraos.
 La cabera entrada del rexistru s'ufre darréu pa referencia:",
-'cascadeprotectedwarning' => "'''Avisu:''' Esta páxina ta candada pa que namái los alministradores la puean editar porque ta enxerta {{PLURAL:$1|na siguiente páxina protexida|nes siguientes páxines protexíes}} en cascada:",
+'cascadeprotectedwarning' => "'''Avisu:''' Esta páxina ta candada pa que namái los alministradores puedan editala porque ta incluída {{PLURAL:$1|na siguiente páxina protexida|nes siguientes páxines protexíes}} en cascada:",
 'titleprotectedwarning' => "'''Avisu: Esta páxina ta candada pa que necesite [[Special:ListGroupRights|permisos especiales]] pa creala.'''
 La cabera entrada del rexistru s'ufre darréu pa referencia:",
 'templatesused' => '{{PLURAL:$1|Plantía usada|Plantíes usaes}} nesta páxina:',
@@ -836,8 +874,8 @@ La cabera entrada del rexistru s'ufre darréu pa referencia:",
 'template-semiprotected' => '(semi-protexida)',
 'hiddencategories' => 'Esta páxina pertenez a {{PLURAL:$1|una categoría anubrida|$1 categoríes anubríes}}:',
 'edittools' => "<!-- Esti testu apaecerá baxo los formularios d'edición y xuba. -->",
-'nocreatetext' => '{{SITENAME}} tien restrinxida la capacidá de crear páxines nueves.
-Pues volver atrás y editar una páxina esistente, o bien [[Special:UserLogin|identificate o crear una cuenta]].',
+'nocreatetext' => '{{SITENAME}} tien torgada la posibilidá de crear páxines nueves.
+Pues volver atrás y editar una páxina esistente, o bien [[Special:UserLogin|aniciar sesión o crear una cuenta]].',
 'nocreate-loggedin' => 'Nun tienes permisu pa crear páxines nueves.',
 'sectioneditnotsupported-title' => 'Nun hai sofitu pa editar seición',
 'sectioneditnotsupported-text' => 'La edición de seición nun tien sofitu nesta páxina.',
@@ -852,17 +890,20 @@ Equí tienes el rexistru de desanicios y tresllaos d'esta páxina:",
 Como referencia, embaxo s'ufre'l rexistru de desanicios y tresllaos de la páxina.",
 'log-fulllog' => 'Ver el rexistru ensembre',
 'edit-hook-aborted' => 'Edición albortada pol hook.
-Nun conseñó esplicación.',
+Nun dio esplicación.',
 'edit-gone-missing' => 'Nun se pudo actualizar la páxina.
 Paez que se desanició.',
 'edit-conflict' => "Conflictu d'edición.",
 'edit-no-change' => "S'inoró la to edición, porque nun se fizo nengún cambéu nel testu.",
-'edit-already-exists' => 'Nun se pudo crear una páxina nueva.
-Yá esiste.',
+'postedit-confirmation' => 'Guardose la edición.',
+'edit-already-exists' => 'Nun pudo crease una páxina nueva.
+Esta yá esiste.',
 'defaultmessagetext' => 'Testu predetermináu',
 'content-failed-to-parse' => 'Fallu al analizar el conteníu $2 pal modelu $1: $3',
 'invalid-content-data' => 'Datos del conteníu inválidos',
 'content-not-allowed-here' => 'El conteníu «$1» nun se permite na páxina [[$2]]',
+'editwarning-warning' => 'Salir d\'esta páxina pue causar la perda de cualesquier cambiu fechu.
+Si aniciasti sesión, pue desactivase esti avisu na seición "Edición" de les tos preferencies.',
 
 # Content models
 'content-model-wikitext' => 'testu wiki',
@@ -874,14 +915,14 @@ Yá esiste.',
 'expensive-parserfunction-warning' => "'''Avisu:''' Esta páxina contién demasiaes llamaes costoses a funciones d'análisis sintáuticu.
 
 Habría tener menos de $2 {{PLURAL:$2|llamada|llamaes}}, y agora tien $1 {{PLURAL:$1|llamada|llamaes}}.",
-'expensive-parserfunction-category' => "Páxines con demasiaes llamaes costoses a funciones d'análisis sintáuticu",
+'expensive-parserfunction-category' => 'Páxines con demasiaes llamaes costoses a funciones analítiques',
 'post-expand-template-inclusion-warning' => "'''Avisu:''' El tamañu de les plantíes incluyíes ye demasiao grande.
 Delles plantíes nun se van incluir.",
 'post-expand-template-inclusion-category' => "Páxines con escesu d'inclusiones de plantíes",
 'post-expand-template-argument-warning' => "'''Avisu:''' Esta páxina contién polo menos un parámetru de plantía que tien un tamañu d'espansión demasiao llargu.
 Estos parámetros s'omitieron.",
 'post-expand-template-argument-category' => 'Páxines con parámetros de plantía omitíos',
-'parser-template-loop-warning' => 'Hai una rueda de plantíes: [[$1]]',
+'parser-template-loop-warning' => 'Deteutóse un bucle de plantíes: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Se pasó la llende de fondura recursiva de les plantíes ($1)',
 'language-converter-depth-warning' => 'Se pasó la llende de fondura del convertidor de llingües ($1)',
 'node-count-exceeded-category' => 'Páxines onde se pasó la cuenta de nodios',
@@ -889,18 +930,18 @@ Estos parámetros s'omitieron.",
 'expansion-depth-exceeded-category' => "Páxines onde se pasó la fondura d'espansión",
 'expansion-depth-exceeded-warning' => "La páxina pasó la fondura d'espansión",
 'parser-unstrip-loop-warning' => 'Deteutóse un bucle "unstrip"',
-'parser-unstrip-recursion-limit' => 'Superóse\'l llímite de recursión d\'"unstrip" ($1)',
+'parser-unstrip-recursion-limit' => "Pasóse la llende de recursividá d'unstrip ($1)",
 'converter-manual-rule-error' => 'Detectóse un error na regla de conversión manual de llingua',
 
 # "Undo" feature
 'undo-success' => "La edición se pue esfacer.
 Por favor comprueba la comparanza d'abaxo pa confirmar que ye eso lo que quies facer, y depués guarda los cambios p'acabar d'esfacer la edición.",
-'undo-failure' => "Nun se pudo esfacer la edición pola mor d'ediciones intermedies conflictives.",
+'undo-failure' => "Nun pudo esfacese la edición por aciu d'ediciones intermedies conflictives.",
 'undo-norev' => 'Nun se pudo esfacer la edición porque nun esiste o se desanició.',
 'undo-summary' => 'Esfacer la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]])',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Nun se pue crear la cuenta',
+'cantcreateaccounttitle' => 'Nun pue crease la cuenta',
 'cantcreateaccount-text' => "La creación de cuentes dende esta direición IP ('''$1''') foi bloquiada por [[User:$3|$3]].
 
 El motivu dau por $3 ye ''$2''",
@@ -916,7 +957,7 @@ El motivu dau por $3 ye ''$2''",
 'nextrevision' => 'Revisión siguiente→',
 'currentrevisionlink' => 'Revisión actual',
 'cur' => 'act',
-'next' => 'próximu',
+'next' => 'siguiente',
 'last' => 'cab',
 'page_first' => 'primera',
 'page_last' => 'cabera',
@@ -970,7 +1011,7 @@ Pues ver el diff; los detalles s'alcuentren nel [{{fullurl:{{#Special:Log}}/supr
 'rev-delundel' => 'amosar/anubrir',
 'rev-showdeleted' => 'amosar',
 'revisiondelete' => 'Desaniciar/restaurar revisiones',
-'revdelete-nooldid-title' => 'Revisión de destín non válida',
+'revdelete-nooldid-title' => 'Revisión de destín inválida',
 'revdelete-nooldid-text' => 'Nun especificasti una revisión o revisiones destín sobre les que realizar esta función, la revisión especificada nun esiste, o tas intentando anubrir la revisión actual.',
 'revdelete-nologtype-title' => 'Nun se dio la triba de rexistru',
 'revdelete-nologtype-text' => 'Nun conseñasti una triba de rexistru nel que facer esta aición.',
@@ -980,7 +1021,7 @@ Pues ver el diff; los detalles s'alcuentren nel [{{fullurl:{{#Special:Log}}/supr
 'revdelete-show-file-confirm' => '¿Tas seguru de que quies ver una versión desaniciada del ficheru "<nowiki>$1</nowiki>" del $2 a les $3?',
 'revdelete-show-file-submit' => 'Sí',
 'revdelete-selected' => "'''{{PLURAL:$2|Revisión seleicionada|Revisiones seleicionaes}} de [[:$1]]:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|Seleicionáu un eventu de rexistru|Seleicionaos eventos de rexistru}}:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Socesu del rexistru seleicionáu|Socesos del rexistru seleicionaos}}:'''",
 'revdelete-text' => "'''Les revisiones y socesos desaniciaos van siguir apaeciendo nel historial de la páxina y nos rexistros, pero parte del so conteníu nun va ser accesible pal públicu.'''
 Otros alministradores de {{SITENAME}} van siguir pudiendo acceder al conteníu anubríu y puen restauralu de nuevo al traviés d'esta mesma interfaz, a nun ser que s'establezan otres restricciones.",
 'revdelete-confirm' => "Confirma que quies facer esto, qu'entiendes les consecuencies, y que vas facer esto d'alcuerdo [[{{MediaWiki:Policy-url}}|cola política]].",
@@ -988,18 +1029,18 @@ Otros alministradores de {{SITENAME}} van siguir pudiendo acceder al conteníu a
 * Información que pudiere ser bilordiosa
 * Información personal non apropiada
 *: ''direiciones de llares y númberos de teléfonu, númberos de seguridá social, etc.''",
-'revdelete-legend' => 'Establecer restricciones de visibilidá',
-'revdelete-hide-text' => 'Esconder testu de revisión',
-'revdelete-hide-image' => 'Esconder el conteníu del archivu',
-'revdelete-hide-name' => 'Esconder aición y oxetivu',
-'revdelete-hide-comment' => "Esconder comentariu d'edición",
-'revdelete-hide-user' => "Esconder el nome d'usuariu/IP del editor",
+'revdelete-legend' => 'Establecer torgues de visibilidá',
+'revdelete-hide-text' => 'Tapecer testu de la revisión',
+'revdelete-hide-image' => 'Tapecer el conteníu del ficheru',
+'revdelete-hide-name' => 'Tapecer aición y oxetivu',
+'revdelete-hide-comment' => "Tapecer el resume d'edición",
+'revdelete-hide-user' => "Tapecer el nome d'usuariu/IP del editor",
 'revdelete-hide-restricted' => "Desaniciar datos de los alministradores y d'otros",
 'revdelete-radio-same' => '(ensin cambeos)',
 'revdelete-radio-set' => 'Sí',
 'revdelete-radio-unset' => 'Non',
-'revdelete-suppress' => 'Eliminar datos de los alministradores lo mesmo que los de los demás',
-'revdelete-unsuppress' => 'Eliminar restricciones de revisiones restauraes',
+'revdelete-suppress' => "Desaniciar datos de los alministradores igual que d'otros",
+'revdelete-unsuppress' => 'Desaniciar les torgues nes revisiones restauraes',
 'revdelete-log' => 'Motivu:',
 'revdelete-submit' => 'Aplicar a {{PLURAL:$1|la revisión seleicionada|les revisiones seleicionaes}}',
 'revdelete-success' => "'''Visibilidá de revisiones anovada correutamente.'''",
@@ -1145,15 +1186,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'powersearch-togglenone' => 'Dengún',
 'search-external' => 'Busca esterna',
 'searchdisabled' => "La busca en {{SITENAME}} ta desactivada. Mentanto, pues buscar en Google. Has fixate en que'l conteníu de los sos índices de {{SITENAME}} pue tar desfasáu.",
-
-# Quickbar
-'qbsettings' => 'Barra rápida',
-'qbsettings-none' => 'Nenguna',
-'qbsettings-fixedleft' => 'Fixa a manzorga',
-'qbsettings-fixedright' => 'Fixa a mandrecha',
-'qbsettings-floatingleft' => 'Flotante a manzorga',
-'qbsettings-floatingright' => 'Flotante a mandrecha',
-'qbsettings-directionality' => "Fixa, según la direición d'escritura de la to llingua",
+'search-error' => 'Hebo un error al guetar: $1',
 
 # Preferences page
 'preferences' => 'Preferencies',
@@ -1222,7 +1255,7 @@ Equí tienes un valor al debalu que pues usar: $1",
 'allowemail' => 'Dexar a los otros usuarios mandate correos',
 'prefs-searchoptions' => 'Guetar',
 'prefs-namespaces' => 'Espacios de nome',
-'defaultns' => "D'otra miente, guetar nestos espacios de nome:",
+'defaultns' => 'Sinón, buscar nestos espacios de nome:',
 'default' => 'predetermináu',
 'prefs-files' => 'Ficheros',
 'prefs-custom-css' => 'CSS personalizada',
@@ -1297,6 +1330,7 @@ Esta información sedrá pública.",
 'userrights-notallowed' => "La to cuenta nun tien permisu p'amestar o desaniciar permisos d'usuariu.",
 'userrights-changeable-col' => 'Grupos que pues camudar',
 'userrights-unchangeable-col' => 'Grupos que nun pues camudar',
+'userrights-conflict' => "¡Hai un conflictu de permisos d'usuariu! Por favor, vuelva a aplicar los cambios.",
 
 # Groups
 'group' => 'Grupu:',
@@ -1719,7 +1753,6 @@ Pa una meyor seguridá, img_auth.php ta desactiváu.",
 'http-read-error' => 'Error de llectura HTTP.',
 'http-timed-out' => "La llamada HTTP escosó'l tiempu.",
 'http-curl-error' => 'Error al baxar la URL: $1',
-'http-host-unreachable' => 'Nun se pudo acceder a la URL.',
 'http-bad-status' => 'Hebo un problema demientres la llamada HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2072,9 +2105,7 @@ Pue haber [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] toca
 
 # Email user
 'mailnologin' => "Ensin direición d'unviu",
-'mailnologintext' => 'Has tar [[Special:UserLogin|identificáu]]
-y tener una direición de corréu válida nes tos [[Special:Preferences|preferencies]]
-pa poder unviar correos a otros usuarios.',
+'mailnologintext' => 'Has tener [[Special:UserLogin|sesión aniciada]] y una direición de corréu válida nes tos [[Special:Preferences|preferencies]] pa poder unviar correos a otros usuarios.',
 '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',
@@ -2102,7 +2133,7 @@ La direición de corréu electrónicu qu\'especificasti nes [[Special:Preference
 'emailccme' => 'Unviame per corréu una copia del mio mensaxe.',
 'emailccsubject' => 'Copia del to mensaxe a $1: $2',
 'emailsent' => 'Corréu unviáu',
-'emailsenttext' => 'El to corréu foi unviáu.',
+'emailsenttext' => "Unviose'l to mensaxe de corréu.",
 'emailuserfooter' => 'Esti corréu electrónicu unviolu $1 a $2 per aciu de la función "Manda-y un corréu a un usuariu" de {{SITENAME}}.',
 
 # User Messenger
@@ -2130,8 +2161,8 @@ Los futuro cambeos nesta páxina y na so páxina d\'alderique asociada apaecerá
 'notvisiblerev' => 'Esborróse la revisión',
 'watchnochange' => 'Nenguna de les tos páxines vixilaes foi editada nel periodu escoyíu.',
 'watchlist-details' => "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de vixilancia ensin cuntar les páxines d'alderique.",
-'wlheader-enotif' => 'La notificación per corréu electrónicu ta activada.',
-'wlheader-showupdated' => "* Les páxines camudaes dende la to última visita amuésense en '''negrina'''",
+'wlheader-enotif' => 'La notificación per corréu electrónicu ta activada.',
+'wlheader-showupdated' => "Les páxines que camudaron dende que les visitasti anteriormente amuesense en '''negrina'''",
 'watchmethod-recent' => 'comprobando páxines vixilaes nos cambios recientes',
 'watchmethod-list' => 'comprobando ediciones recientes nes páxines vixilaes',
 'watchlistcontains' => 'La to llista de vixilancia tien $1 {{PLURAL:$1|páxina|páxines}}.',
@@ -2472,9 +2503,9 @@ Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'unblockip' => 'Desbloquiar usuariu',
 'unblockiptext' => "Usa'l formulariu d'abaxo pa restablecer l'accesu d'escritura a una direicion IP o a un nome d'usuariu previamente bloquiáu.",
 'ipusubmit' => 'Desaniciar esti bloquéu',
-'unblocked' => '[[User:$1|$1]] foi desbloquiáu',
+'unblocked' => '[[User:$1|$1]] desbloquióse.',
 'unblocked-range' => '$1 se desbloquió',
-'unblocked-id' => 'El bloquéu $1 foi elimináu',
+'unblocked-id' => "Desaniciose'l bloquéu $1.",
 'blocklist' => 'Usuarios bloquiaos',
 'ipblocklist' => 'Usuarios bloquiaos',
 'ipblocklist-legend' => 'Atopar un usuariu bloquiáu',
@@ -2496,7 +2527,7 @@ Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'anononlyblock' => 'namái anón.',
 'noautoblockblock' => 'bloquéu automáticu desactiváu',
 'createaccountblock' => 'bloquiada la creación de cuentes',
-'emailblock' => 'corréu electrónicu bloquiáu',
+'emailblock' => 'corréu electrónicu desactiváu',
 'blocklist-nousertalk' => "nun pue editar la so páxina d'alderique",
 'ipblocklist-empty' => 'La llista de bloqueos ta vacia.',
 'ipblocklist-no-results' => "La direición IP o nome d'usuariu solicitáu nun ta bloquiáu.",
@@ -2520,7 +2551,7 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl
 'block-log-flags-anononly' => 'namái usuarios anónimos',
 'block-log-flags-nocreate' => 'creación de cuentes desactivada',
 'block-log-flags-noautoblock' => 'bloquéu automáticu deshabilitáu',
-'block-log-flags-noemail' => 'corréu electrónicu bloquiáu',
+'block-log-flags-noemail' => 'corréu electrónicu desactiváu',
 'block-log-flags-nousertalk' => "nun pue editar la páxina d'alderique propia",
 'block-log-flags-angry-autoblock' => 'autobloquéu ameyoráu activáu',
 'block-log-flags-hiddenname' => "nome d'usuariu anubríu",
@@ -2543,6 +2574,7 @@ Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bl
 'proxyblocksuccess' => 'Fecho.',
 'sorbsreason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}.',
 'sorbs_create_account_reason' => 'La to direición IP sal na llista de proxys abiertos en DNSBL usada por {{SITENAME}}. Nun pues crear una cuenta',
+'xffblockreason' => "Una direición IP presente na testera X-Forwarded-For, o suya o d'un sirvidor proxy que ta usando, ta bloquiada. El motivu orixinal del bloquéu foi: $1",
 'cant-block-while-blocked' => 'Nun pues bloquiar a otros usuarios mentes tu teas bloquiáu.',
 'cant-see-hidden-user' => "L'usuariu que tentes bloquiar yá ta bloquiáu y anubríu.
 Como nun tienes permisos p'anubrir usuarios, nun pues ver o editar el bloquéu del usuariu.",
@@ -2695,7 +2727,7 @@ Por favor visita [//www.mediawiki.org/wiki/Localisation Llocalización de MediaW
 'allmessagesnotsupportedDB' => "Nun pue usase '''{{ns:special}}:Allmessages''' porque '''\$wgUseDatabaseMessages''' ta deshabilitáu.",
 'allmessages-filter-legend' => 'Peñerar',
 'allmessages-filter' => 'Peñerar por estáu de personalización:',
-'allmessages-filter-unmodified' => 'Ensin cambéos',
+'allmessages-filter-unmodified' => 'Ensin cambeos',
 'allmessages-filter-all' => 'Toos',
 'allmessages-filter-modified' => 'Camudaos',
 'allmessages-prefix' => 'Peñerar pol prefixu:',
@@ -2706,6 +2738,8 @@ Por favor visita [//www.mediawiki.org/wiki/Localisation Llocalización de MediaW
 'thumbnail-more' => 'Agrandar',
 'filemissing' => 'Falta archivu',
 'thumbnail_error' => 'Error al crear la miniatura: $1',
+'thumbnail_error_remote' => "Mensaxe d'error de $1:
+$2",
 'djvu_page_error' => 'Páxina DjVu fuera de llímites',
 'djvu_no_xml' => 'Nun se pudo obtener el XML pal archivu DjVu',
 'thumbnail-temp-create' => 'Nun se pudo crear el ficheru temporal de miniatura',
@@ -2855,17 +2889,11 @@ Pues ver el so códigu fonte.',
 
 # Stylesheets
 'common.css' => "/* Los CSS allugaos equí s'aplicarán a tolos aspeutos */",
-'standard.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Standard */',
-'nostalgia.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Nostalgia */',
 'cologneblue.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Cologne Blue */',
 'monobook.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Monobook */',
-'myskin.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu MySkin */',
-'chick.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Chick */',
-'simple.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Simple */',
 'modern.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Modern */',
 'vector.css' => '/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Vector */',
 'print.css' => '/* Los CSS allugaos equí afeutarán a la salida pola imprentadora */',
-'handheld.css' => '/* Los CSS allugaos equí afeutarán a los preseos portátiles basaos nel aspeutu configuráu en $wgHandheldStyle */',
 'noscript.css' => '/* Los CSS allugaos equí afeutarán a los usuarios col JavaScript desactiváu */',
 'group-autoconfirmed.css' => '/* Los CSS allugaos equí afeutarán a los usuarios autoconfirmaos namái */',
 'group-bot.css' => '/* Los CSS allugaos equí afeutarán a los bots namái */',
@@ -2874,13 +2902,8 @@ Pues ver el so códigu fonte.',
 
 # Scripts
 'common.js' => '/* Cualesquier JavaScript que tea equí se cargará pa tolos usuarios en cada carga de páxina. */',
-'standard.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Standard */',
-'nostalgia.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Nostalgia */',
 'cologneblue.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Cologne Blue */',
 'monobook.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MonoBook */',
-'myskin.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MySkin */',
-'chick.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Chick */',
-'simple.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Simple */',
 'modern.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Modern */',
 'vector.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Vector */',
 'group-autoconfirmed.js' => '/* Cualesquier JavaScript que tea equí se cargará pa los usuarios autoconfirmaos namái */',
@@ -2960,10 +2983,7 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 'pageinfo-category-files' => 'Númberu de ficheros',
 
 # Skin names
-'skinname-standard' => 'Clásicu',
-'skinname-nostalgia' => 'Señardá',
 'skinname-cologneblue' => 'Azul Colonia',
-'skinname-myskin' => 'MySkin',
 'skinname-modern' => 'Modernu',
 
 # Patrolling
@@ -3041,11 +3061,25 @@ Al executalu pues comprometer el to sistema.",
 'minutes' => '{{PLURAL:$1|$1 minutu|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
 'days' => '{{PLURAL:$1|$1 día|$1 díes}}',
+'weeks' => '{{PLURAL: $1|$1 selmana|$1 selmanes}}',
 'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 añu|$1 años}}',
 'ago' => 'hai $1',
 'just-now' => 'agora mesmo',
 
+# Human-readable timestamps
+'hours-ago' => 'hai $1 {{PLURAL:$1|hora|hores}}',
+'minutes-ago' => 'hai $1 {{PLURAL:$1|minutu|minutos}}',
+'seconds-ago' => 'hai $1 {{PLURAL:$1|segundu|segundos}}',
+'monday-at' => 'El llunes a les $1',
+'tuesday-at' => 'El martes a les $1',
+'wednesday-at' => 'El miércoles a les $1',
+'thursday-at' => 'El xueves a les $1',
+'friday-at' => 'El vienres a les $1',
+'saturday-at' => 'El sábadu a les $1',
+'sunday-at' => 'El domingu a les $1',
+'yesterday-at' => 'Ayeri a les $1',
+
 # Bad image list
 'bad_image_list' => "El formatu ye'l que sigue:
 
@@ -3075,7 +3109,7 @@ Los demás tarán anubríos de mou predetermináu.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Anchor',
 'exif-imagelength' => 'Altor',
 'exif-bitspersample' => 'Bits por componente',
@@ -3253,7 +3287,7 @@ Los demás tarán anubríos de mou predetermináu.
 'exif-originalimageheight' => 'Altor de la imaxe enantes de cortase',
 'exif-originalimagewidth' => 'Anchor de la imaxe enantes de cortase',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Non comprimida',
 'exif-compression-2' => 'CCITT Grupu 3 codificación Huffman RLE con Modificación 1-Dimensional',
 'exif-compression-3' => 'Codificación de fax CCITT Grupu 3',
@@ -3481,16 +3515,14 @@ Los demás tarán anubríos de mou predetermináu.
 # Email address confirmation
 'confirmemail' => 'Confirmar direición de corréu',
 'confirmemail_noemail' => "Nun tienes una direición de corréu válida nes tos [[Special:Preferences|preferencies d'usuariu]].",
-'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les
-funcionalidaes de mensaxes. Da-y al botón que tienes equí embaxo pa unviar un avisu de
-confirmación a la to direición. Esti avisu va incluyir un enllaz con un códigu; carga
-l'enllaz nel to navegador pa confirmar la to direición de corréu electrónicu.",
+'confirmemail_text' => "{{SITENAME}} requier que valides la to direición de corréu enantes d'usar les carauterístiques de corréu.
+Da-y al botón que tienes equí embaxo pa unviar un corréu de confirmación a la to direición.
+El corréu va incluyir un enllaz con un códigu; carga l'enllaz nel to navegador pa confirmar que la to direición de corréu electrónicu ye válida.",
 'confirmemail_pending' => "Yá s'unvió un códigu de confirmación a la to direición de corréu; si creasti hai poco la to cuenta, pues esperar dellos minutos a que-y de tiempu a llegar enantes de pidir otru códigu nuevu.",
 'confirmemail_send' => 'Unviar códigu de confirmación',
 'confirmemail_sent' => 'Corréu de confirmación unviáu.',
 'confirmemail_oncreate' => "Unvióse un códigu de confirmación a la to direición de corréu.
-Esti códigu nun se necesita pa identificase, pero tendrás que lu conseñar enantes
-d'activar cualesquier funcionalidá de la wiki que tea rellacionada col corréu.",
+Esti códigu nun se necesita p'aniciar sesión, pero tendrás que conseñalu enantes d'activar cualesquier carauterística de la wiki que tea rellacionada col corréu.",
 'confirmemail_sendfailed' => '{{SITENAME}} nun pudo unviar el to corréu de confirmación.
 Por favor comprueba que nun punxeras carauteres non válidos na to direición de corréu.
 
@@ -3502,15 +3534,15 @@ Agora yá pues [[Special:UserLogin|coneutate]] y esfrutar de la wiki.',
 'confirmemail_loggedin' => 'Quedó confirmada la to direición de corréu.',
 'confirmemail_error' => 'Hebo un problema al guardar la to confirmación.',
 'confirmemail_subject' => 'Confirmación de la direición de corréu de {{SITENAME}}',
-'confirmemail_body' => 'Daquién, seique tu dende la IP $1, rexistró la cuenta "$2" con
+'confirmemail_body' => 'Daquién, seique tu, dende la IP $1, rexistró la cuenta "$2" con
 esta direición de corréu en {{SITENAME}}.
 
-Pa confirmar qu\'esta cuenta ye tuya daveres y asina activar les funcionalidaes
+Pa confirmar qu\'esta cuenta ye tuya daveres y asina activar les carauterístiques
 de corréu en {{SITENAME}}, abri esti enllaz nel to navegador:
 
 $3
 
-Si *nun* rexistrasti tu la cuenta, da-y a esti enllaz pa cancelar
+Si *nun* rexistrasti tu la cuenta, sigui esti enllaz pa encaboxar
 la confirmación de la direición de corréu electrónicu:
 
 $5
@@ -3544,8 +3576,8 @@ la confirmación de les señes de corréu electrónicu:
 $5
 
 Esti códigu de confirmación caduca\'l $4.',
-'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu cancelada',
-'invalidateemail' => 'Cancelar confirmación de corréu electrónicu',
+'confirmemail_invalidated' => 'Confirmación de direición de corréu electrónicu encaboxada',
+'invalidateemail' => 'Encaboxar confirmación de corréu electrónicu',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[La tresclusión interwiki ta desactivada]',
@@ -3554,7 +3586,7 @@ Esti códigu de confirmación caduca\'l $4.',
 'scarytranscludetoolong' => '[La URL ye demasiao llarga]',
 
 # Delete conflict
-'deletedwhileediting' => "'''Avisu''': ¡Esta páxina foi esborrada depués de qu'entamaras a editala!",
+'deletedwhileediting' => "'''Avisu''': ¡Esta páxina desanicióse depués de qu'entamaras a editala!",
 'confirmrecreate' => "L'usuariu [[User:$1|$1]] ([[User talk:$1|alderique]]) esborró esta páxina depués de qu'empecipiaras a editala pol siguiente motivu:
 : ''$2''
 Por favor confirma que daveres quies volver a crear esta páxina.",
@@ -3591,7 +3623,7 @@ Por favor confirma que daveres quies volver a crear esta páxina.",
 'table_pager_empty' => 'Nun hai resultaos',
 
 # Auto-summaries
-'autosumm-blank' => 'Páxina dexada en blanco',
+'autosumm-blank' => 'Desaniciáu el conteníu de la páxina',
 'autosumm-replace' => "Sustituyendo la páxina por '$1'",
 'autoredircomment' => 'Redirixendo a [[$1]]',
 'autosumm-new' => "Páxina creada con '$1'",
@@ -3675,12 +3707,17 @@ Tendría d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Llic
 'version-entrypoints-header-entrypoint' => "Puntu d'entrada",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => "Ruta d'archivu",
-'filepath-page' => 'Ficheru:',
-'filepath-submit' => 'Dir',
-'filepath-summary' => "Esta páxina especial devuelve la ruta completa d'un archivu.
-Les imáxenes amuésense a resolución completa; les demás tribes d'archivu execútense direutamente col so programa asociáu.",
+# Special:Redirect
+'redirect' => "Redireición por nome de ficheru, o ID d'usuariu o de revisión",
+'redirect-legend' => 'Redirixir a un ficheru o una páxina',
+'redirect-summary' => "Esta páxina especial redirixe a un ficheru (dando'l nome), una páxina (dando una ID de revisión) o una páxina d'usuariu (dando una ID d'usuariu).",
+'redirect-submit' => 'Dir',
+'redirect-lookup' => 'Buscar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => "ID d'usuariu:",
+'redirect-revision' => 'Revisión de páxina',
+'redirect-file' => 'Nome del ficheru',
+'redirect-not-exists' => "Nun s'alcontró'l valor",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Buscar archivos duplicaos',
@@ -3771,23 +3808,26 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'htmlform-submit' => 'Unviar',
 'htmlform-reset' => 'Desfacer los cambios',
 'htmlform-selectorother-other' => 'Otros',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Sí',
+'htmlform-chosen-placeholder' => 'Seleicione una opción',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con sofitu pa gueta en testu completu',
 'sqlite-no-fts' => '$1 ensin sofitu pa gueta en testu completu',
 
 # New logging system
-'logentry-delete-delete' => '$1 desanició la páxina $3',
-'logentry-delete-restore' => '$1 restauró la páxina $3',
-'logentry-delete-event' => "$1 camudó la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-delete-revision' => "$1 camudó la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-delete-event-legacy' => '$1 camudó la visibilidá de los socesos del rexistru en $3',
-'logentry-delete-revision-legacy' => '$1 camudó la visibilidá de les revisiones na páxina $3',
-'logentry-suppress-delete' => '$1 suprimió la páxina $3',
-'logentry-suppress-event' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
-'logentry-suppress-revision' => "$1 camudó en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
-'logentry-suppress-event-legacy' => '$1 camudó en secretu la visibilidá de los socesos del rexistru en $3',
-'logentry-suppress-revision-legacy' => '$1 camudó en secretu la visibilidá de les revisiones na páxina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|desanició}} la páxina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restauró}} la páxina $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|camudó}} la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de los socesos del rexistru en $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|camudó}} la visibilidá de les revisiones na páxina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|suprimió}} la páxina $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'un socesu del rexistru|de $5 socesos del rexistru}} en $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|camudó}} en secretu la visibilidá {{PLURAL:$5|d'una revisión|de $5 revisiones}} na páxina $3: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de los socesos del rexistru en $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|camudó}} en secretu la visibilidá de les revisiones na páxina $3',
 'revdelete-content-hid' => 'conteníu tapecíu',
 'revdelete-summary-hid' => "resume d'edición tapecíu",
 'revdelete-uname-hid' => "nome d'usuariu anubríu",
@@ -3796,20 +3836,20 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'revdelete-uname-unhid' => "nome d'usuariu non anubríu",
 'revdelete-restricted' => 'aplicaes les restricciones a los alministradores',
 'revdelete-unrestricted' => 'eliminaes les restricciones a los alministradores',
-'logentry-move-move' => '$1 treslladó la páxina "$3" a "$4"',
-'logentry-move-move-noredirect' => '$1 treslladó la páxina "$3" a "$4" ensin dexar una redireición',
-'logentry-move-move_redir' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición',
-'logentry-move-move_redir-noredirect' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
-'logentry-patrol-patrol' => '$1 marcó la revisión $4 de la páxina "$3" como patrullada',
-'logentry-patrol-patrol-auto' => '$1 marcó automaticamente la revisión $4 de la páxina "$3" como patrullada',
-'logentry-newusers-newusers' => "Creóse la cuenta d'usuariu $1",
-'logentry-newusers-create' => "Creóse la cuenta d'usuariu $1",
-'logentry-newusers-create2' => "$1 creó la cuenta d'usuariu $3",
-'logentry-newusers-byemail' => "$1 creó la cuenta d'usuariu $3 y la contraseña uviose per corréu electrónicu",
-'logentry-newusers-autocreate' => 'La cuenta $1 creóse automáticamente',
-'logentry-rights-rights' => '$1 camudó la pertenencia a grupos de $3 dende $4 a $5',
-'logentry-rights-rights-legacy' => '$1 camudó la pertenencia a grupos de $3',
-'logentry-rights-autopromote' => '$1 promocionó automáticamente de $4 a $5',
+'logentry-move-move' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4"',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" ensin dexar una redireición',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|treslladó}} la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcó}} la revisión $4 de la páxina "$3" como patrullada',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|marcó}} automáticamente la revisión $4 de la páxina "$3" como patrullada',
+'logentry-newusers-newusers' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'logentry-newusers-create' => "{{GENDER:$2|Creóse}} la cuenta d'usuariu $1",
+'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-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',
 'rightsnone' => '(nengún)',
 
 # Feedback
index 7895ca4..fb2aa4d 100644 (file)
@@ -129,8 +129,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Va ota va rupes favesik nedir !',
 'tog-oldsig' => 'Tisa sugdara',
 'tog-fancysig' => 'Krafiara va sugdaks wetce wikitext (a mivaskafi gluyasiki)',
-'tog-externaleditor' => 'Favera va divefi betasiki (anton gan aptacik, moe vusiko va yona aptafa vertara olegar)',
-'tog-externaldiff' => 'Omavafa favera va divefa "diff" xeka (anton gan aptacik, moe vusiko va yona aptafa vertara olegar)',
 'tog-showjumplinks' => 'Tutegirara va "grablera" vansarafi gluyasiki',
 'tog-uselivepreview' => 'Favera va abdiwira (JavaScript) (bagalon)',
 'tog-forceeditsummary' => 'Zo walzé viele betaravildeks tir vlardaf !',
@@ -864,14 +862,6 @@ Kan ''all:'' laganeyal ta varafa exulera (gon keyaksexo is teza ikz-), oke wetce
 'search-external' => 'Divafa aneyara',
 'searchdisabled' => "<p>La fonction de recherche sur l'intégralité du texte a été temporairement désactivée à cause de la grande charge que cela impose au serveur. Nous espérons la rétablir prochainement lorsque nous disposerons d'un serveur plus puissant. En attendant, vous pouvez faire la recherche avec Google:</p>",
 
-# Quickbar
-'qbsettings' => 'Tuweltara va xekobla',
-'qbsettings-none' => 'Mek',
-'qbsettings-fixedleft' => 'Roneon titickanaf',
-'qbsettings-fixedright' => 'Talteon titickanaf',
-'qbsettings-floatingleft' => 'Roneon ezas',
-'qbsettings-floatingright' => 'Talteon ezas',
-
 # Preferences page
 'preferences' => 'Lodamaceem',
 'mypreferences' => 'Jinaf lodamaceem',
@@ -943,7 +933,7 @@ Gotir le $1 {{PLURAL:$1|staa|staa}}.',
 Rinafe e-mail mane me zo razdar viele ar webesik uzerar.',
 'prefs-help-email-required' => 'E-mail mane zo kucilar.',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-invalid' => 'Va enafe e-mail mane bazel',
 
 # User rights
@@ -1427,7 +1417,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listgrouprights-addgroup-all' => 'Va kota lospa roloplekur',
 'listgrouprights-removegroup-all' => 'Va kota lospa rosular',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Meke mane',
 'mailnologintext' => 'Rin gotil [[Special:UserLogin|dogluyarakiraf]]
 is bazeyes va wadafe internetmane ko rinaf [[Special:Preferences|lodamaceem]]
@@ -1472,8 +1462,8 @@ Ta sulara va batu bu div rinafi suzdasiki, koe grablexo va « Mea suzdá » vule
 'notvisiblerev' => 'Betaks sulayan',
 'watchnochange' => 'Nedoyu rinafu suzdanu bu al zo betar bak bazena rekola',
 'watchlist-details' => '{{PLURAL:$1|$1 bu|$1 bu}} koe rinafi suzdasiki rade prilarabueem.',
-'wlheader-enotif' => 'Email walzera tir tegisa.',
-'wlheader-showupdated' => "Bu betayanu vielu rin ironokon worayal tir '''sulatcalakorafu'''.",
+'wlheader-enotif' => 'Email walzera tir tegisa.',
+'wlheader-showupdated' => "Bu betayanu vielu rin ironokon worayal tir '''sulatcalakorafu'''.",
 'watchmethod-recent' => 'ageltara va noeltaf betakseem va suzdan bueem',
 'watchmethod-list' => 'ageltara va suzdan bueem icde noeltafa betara',
 'watchlistcontains' => 'Rinafi suzdasiki va $1 bu ruldar',
@@ -2046,7 +2036,7 @@ Kotari milconyafi gluyasiki roklon zo krafiar.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Mantuca',
 'exif-imagelength' => 'Ontinuca',
 'exif-compression' => 'Raxivaracave',
@@ -2121,7 +2111,7 @@ Kotari milconyafi gluyasiki roklon zo krafiar.',
 'exif-gpsdestdistance' => 'Kofa soluma',
 'exif-gpsdatestamp' => 'GPS evla',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Raxivariskafa',
 
 'exif-unknowndate' => 'Megrupena evla',
@@ -2230,7 +2220,7 @@ Kotari milconyafi gluyasiki roklon zo krafiar.',
 'namespacesall' => 'koto',
 'monthsall' => 'kot',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Va e-mail gruyel',
 'confirmemail_noemail' => 'Bazene "email" mane koe rinaf [[Special:Preferences|favesikaf lodamaceem]] me tir enafe.',
 'confirmemail_text' => "Ce wiki nécessite la vérification de votre adresse email avant de pouvoir utiliser toute fonction de messagerie. Utilisez le bouton ci dessous pour envoyer un email de confirmation à votre adresse. L'email contiendra un lien contenant un code, chargez ce lien dans votre navigateur pour valider votre adresse.",
@@ -2351,11 +2341,6 @@ This confirmation code will expire at $4.',
 'version-software-product' => 'Warzeks',
 'version-software-version' => 'Siatos',
 
-# Special:FilePath
-'filepath' => 'Iyeltakkelda',
-'filepath-page' => 'Iyeltak :',
-'filepath-submit' => 'Kelda',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Aneyara va jontolaf iyeltak',
 'fileduplicatesearch-legend' => 'Aneyara va jontolaca',
index 7fc3558..3e90308 100644 (file)
@@ -111,8 +111,6 @@ $messages = array(
 'tog-shownumberswatching' => 'İzləyən istifadəçilərin sayını göstər',
 'tog-oldsig' => 'Hazırkı imza:',
 'tog-fancysig' => 'Vikimətn şəklində imza (avtomatik keçid yaratmadan)',
-'tog-externaleditor' => 'Susmaya görə xarici müqayisə proqramlarından istifadə et',
-'tog-externaldiff' => 'Susmaya görə xarici müqayisə proqramlarından istifadə et',
 'tog-showjumplinks' => '"Keçid et:" linklərini aktivləşdir',
 'tog-uselivepreview' => 'Canlı sınaq baxışı xüsusiyyətindən istifadə et (JavaScript tələb edir, sınaq mərhələsindədir)',
 'tog-forceeditsummary' => 'Qısa məzmunu boş saxladıqda mənə bildir',
@@ -952,14 +950,6 @@ $1",
 'powersearch-togglenone' => 'Heç biri',
 'search-external' => 'Xarici axtarış',
 
-# Quickbar
-'qbsettings' => 'Naviqasiya paneli',
-'qbsettings-none' => 'Heç biri',
-'qbsettings-fixedleft' => 'Sola sabitləndi',
-'qbsettings-fixedright' => 'Sağa sabitləndi',
-'qbsettings-floatingleft' => 'Sola əyilir',
-'qbsettings-floatingright' => 'Sağa əyilir',
-
 # Preferences page
 'preferences' => 'Nizamlamalar',
 'mypreferences' => 'Nizamlamalar',
@@ -1393,7 +1383,6 @@ $1',
 'http-read-error' => 'HTTP oxuma xətası',
 'http-timed-out' => 'HTTP istəyinin vaxtı bitdi.',
 'http-curl-error' => 'URL-ə yanlış müraciət: $1',
-'http-host-unreachable' => 'URL-ə çatmaq olmadı.',
 'http-bad-status' => 'HTTP müraciətin yoxlanması zamanı problem aşkarlanmışdır: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1728,8 +1717,8 @@ Fərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-help
 'notvisiblerev' => 'Başqa istifadıçinin son dəyişikliyi silinib',
 'watchnochange' => 'Verilən vaxt ərzində heç bir izlədiyiniz səhifə redaktə edilməmişdir.',
 'watchlist-details' => 'Müzakirə səhifələrini çıxmaq şərtilə {{PLURAL:$1|$1 səhifəni|$1 səhifəni}} izləyirsiniz.',
-'wlheader-enotif' => ' E-məktubla bildiriş aktivdir.',
-'wlheader-showupdated' => "Son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlərlə''' göstərilmişdir.",
+'wlheader-enotif' => ' E-məktubla bildiriş aktivdir.',
+'wlheader-showupdated' => "Son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlərlə''' göstərilmişdir.",
 'watchmethod-recent' => 'yeni dəyişikliklər izlənilən səhifələr üçün yoxlanılır',
 'watchmethod-list' => 'izlənilən səhifələr yeni dəyişikliklər üçün yoxlanılır',
 'watchlistcontains' => 'İzləmə siyahınızda $1 {{PLURAL:$1|səhifə|səhifə}} var.',
@@ -2281,13 +2270,8 @@ Zəhmət olmasa başqa ad seçin.',
 
 # Stylesheets
 'common.css' => '/* Burada yerləşən CSS bütün skinlərə tətbiq olunur */',
-'standard.css' => '/* Burada yerləşən CSS Standard skin istifadəçilərinə tətbiq olunur */',
-'nostalgia.css' => '/* Burada yerləşən CSS Nostalgia skin istifadəçilərinə tətbiq olunur */',
 'cologneblue.css' => '/* Burada yerləşən CSS Cologne Blue skin istifadəçilərinə tətbiq olunur */',
 'monobook.css' => '/* Burada yerləşən CSS Monobook skin istifadəçilərinə tətbiq olunur */',
-'myskin.css' => '/* Burada yerləşən CSS MySkin skin istifadəçilərinə tətbiq olunur */',
-'chick.css' => '/* Burada yerləşən CSS Chick skin istifadəçilərinə tətbiq olunur */',
-'simple.css' => '/* Burada yerləşən CSS Simple skin istifadəçilərinə tətbiq olunur */',
 'modern.css' => '/* Burada yerləşən CSS Modern skin istifadəçilərinə tətbiq olunur */',
 'vector.css' => '/* Burada yerləşən CSS Vector istifadəçilərinə tətbiq olunur */',
 'group-autoconfirmed.css' => '/* Burada yerləşən CSS yalnız avtotəsdiqlənmiş istifadəçilərə şamil olunur */',
@@ -2297,13 +2281,8 @@ Zəhmət olmasa başqa ad seçin.',
 
 # Scripts
 'common.js' => '/* Burada istifadəçilərin hamısı üçün bütün səhifələrdə istənilən JavaScript yüklənəcək */',
-'standard.js' => '/* Burada Standard skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
-'nostalgia.js' => '/* Burada Nostalgia skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'cologneblue.js' => '/* Burada Cologne Blue skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'monobook.js' => '/* Burada MonoBook skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
-'myskin.js' => '/* Burada MySkin skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
-'chick.js' => '/* Burada Chick skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
-'simple.js' => '/* Burada Simple skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'modern.js' => '/* Burada Modern skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'vector.js' => '/* Burada Vector skin istifadəçiləri üçün istənilən JavaScript yüklənəcək */',
 'group-autoconfirmed.js' => '/* Burada istənilən JavaScript yalnız avtotəsdiqlənmiş istifadəçilər üçün yüklənəcək */',
@@ -2344,13 +2323,8 @@ Zəhmət olmasa başqa ad seçin.',
 'pageinfo-authors' => 'Fərqli müəlliflərin sayı',
 
 # Skin names
-'skinname-standard' => 'Classic',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -2430,8 +2404,6 @@ Həmin sətirdəki növbəti keçidlər istisna hesab olunur. Məsələn, fayl m
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -2475,7 +2447,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Genişlik',
 'exif-imagelength' => 'Hündürlük',
 'exif-compression' => 'Sıxılmamış',
@@ -2601,7 +2573,7 @@ Variants for Chinese language
 'exif-organisationinimage' => 'Təsvir edilmiş təşkilat',
 'exif-personinimage' => 'Təsvir edilmiş şəxs',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sıxılmış',
 
 'exif-copyrighted-true' => 'Müəlliflik hüququ ilə qorunur',
@@ -2905,11 +2877,6 @@ Variants for Chinese language
 'version-software-version' => 'Versiya',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Fayl yolu',
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Get',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dublikat fayl axtarışı',
 'fileduplicatesearch-legend' => 'Dublikatı axtar',
index 4a5a91d..31e7d99 100644 (file)
@@ -115,8 +115,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ایزله‌ين ایستیفاده‌چیلرین سایینی گؤستر',
 'tog-oldsig' => 'ایندی‌کی ایمضا:',
 'tog-fancysig' => 'ویکی متن کیمی ایمضا (اوتوماتیک باغلانتی‌سیز)',
-'tog-externaleditor' => 'دَییشدیرمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
-'tog-externaldiff' => 'موقاییسه ائتمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
 'tog-showjumplinks' => '«آتلان:» یاردیم باغلانتیلارینی آچ',
 'tog-uselivepreview' => 'دیری اؤن‌گؤستریش ایشلد (جاوااسکریپت لازیم‌دیر)(تست مرحله‌سینده)',
 'tog-forceeditsummary' => 'دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر',
@@ -130,6 +128,7 @@ $messages = array(
 'tog-diffonly' => 'موقاییسه‌لر آلیتندا صحیفه‌لرین ایچینده‌کیلرینی گؤسترمه',
 'tog-showhiddencats' => 'گیزلی بؤلمه‌لری گؤستر',
 'tog-norollbackdiff' => 'قایتاراندان سونرا موقاییسه گؤسترمه',
+'tog-useeditwarning' => 'دَییشدیرمه صحیفه‌سینده چیخیش زامانی، آچیق و قئید اولمایان دَییشدیرمه صحیفه وارسا منه هشدار وئریلسین',
 
 'underline-always' => 'همیشه',
 'underline-never' => 'هئچ واخت',
@@ -567,8 +566,8 @@ $2',
 'blocked-mailpassword' => 'سیزین آی‌پی آدرسینیز دَییشیک وئرمه‌یه باغلانیب و سوءاستفاده قاباغی آلماق اوچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوخدور.',
 'eauthentsent' => 'سیزین سئچیلمیش ایمیل آدرسینه، دوغرولاماق اوچون بیر ایمیل گؤندریلدی.
 هر یئنی بیر ایمیل گؤندرمک‌دن اؤنجه، بو حسابین دوغرودان سیزین اولدوغونو گؤسترمک اوچون، او ایمیل‌ده‌کی ایشلری گؤرمه‌لیسینیز.',
-'throttled-mailpassword' => 'سÙ\88Ù\86 {{PLURAL:$1|ساعات|$1 Ø³Ø§Ø¹Ø§Øª}}â\80\8cدا Ø³Û\8cزÙ\87 Ø¨Û\8cر Ø±Ù\85ز Û\8cادا Ø³Ø§Ù\84Ù\85ا گؤندریلیب‌دیر.
-سÙ\88ءاستÙ\81ادÙ\87 Ù\82اباغÛ\8cÙ\86 Ø¢Ù\84Ù\85اÙ\82 Ø§Ù\88Ú\86Ù\88Ù\86Ø\8c Ù\87ر {{PLURAL:$1|ساعات|$1 Ø³Ø§Ø¹Ø§Øª}}â\80\8cدا Û\8cاÙ\84Ù\86Û\8cز Ø¨Û\8cر Ø±Ù\85ز Û\8cادا Ø³Ø§Ù\84Ù\85ا گؤندریلر.',
+'throttled-mailpassword' => 'سÙ\88Ù\86 {{PLURAL:$1|ساعات|$1 Ø³Ø§Ø¹Ø§Øª}}â\80\8cدا Ø³Û\8cزÙ\87 Ø¨Û\8cر Ø±Ù\85ز Û\8cئÙ\86Û\8cÙ\84Ù\87â\80\8cÙ\85Ù\87 Ø§Û\8cÙ\85Û\8cÙ\84Û\8c گؤندریلیب‌دیر.
+سÙ\88ءاستÙ\81ادÙ\87 Ù\82اباغÛ\8cÙ\86 Ø¢Ù\84Ù\85اÙ\82 Ø§Ù\88Ú\86Ù\88Ù\86Ø\8c Ù\87ر {{PLURAL:$1|ساعات|$1 Ø³Ø§Ø¹Ø§Øª}}â\80\8cدا Û\8cاÙ\84Ù\86Û\8cز Ø¨Û\8cر Ø±Ù\85ز Û\8cئÙ\86Û\8cÙ\84Ù\87â\80\8cÙ\85Ù\87 Ø§Û\8cÙ\85Û\8cÙ\84Û\8c گؤندریلر.',
 'mailerror' => 'ایمیل گؤندرمه خطاسی: $1',
 'acct_creation_throttle_hit' => 'سیزین آی‌پی آدرسینیزی ایشلدن زیارتچیلر، سون گون‌ده {{PLURAL:$1|بیر حساب|$1 حساب}} یارادیبلار کی ان چون ایجازه وئریلن‌دیر.
 اونا باخاراق، بو آی‌پی آدرسی ایشلدن زیارتچیلر، بو زامان‌دا، داها آرتیق حساب یارادابیلمزلر.',
@@ -619,7 +618,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'رمزی یئنی‌له',
-'passwordreset-text' => 'حسابÛ\8cÙ\86Û\8cزا Ø¨Û\8cÙ\84Ú¯Û\8cÙ\84رÛ\8cÙ\86Ù\87 Ú¯Ø¤Ø±Ù\87 Û\8cادا Ø³Ø§Ù\84Ù\85ا Ø§Û\8cÙ\85Û\8cÙ\84Û\8c Ø¢Ù\84Ù\85اÙ\82 Ø§Ù\88Ú\86Ù\88Ù\86Ø\8c بو فورمو دولدورون.',
+'passwordreset-text' => 'رÙ\85زÛ\8cÙ\86Û\8cزÛ\8c Û\8cئÙ\86Û\8cÙ\84Ù\87â\80\8cÙ\85Ú© Ø§Ù\88Ú\86Ù\88Ù\86 بو فورمو دولدورون.',
 'passwordreset-legend' => 'رمزی یئنی‌له',
 'passwordreset-disabled' => 'بو ویکی‌ده رمزی یئنی‌له‌مک باغلانیب‌دیر.',
 'passwordreset-pretext' => '{{PLURAL:$1|آشاغیداکی وئری پارچالارینین بیرینی وئرین}}',
@@ -629,13 +628,13 @@ $2',
 'passwordreset-capture-help' => 'بو قوطویا علامت قویساز، (گئچیجی رمزی اولان) ایمیل ایستیفاده‌چی‌یه گؤندریلن کیمی بوردا سیزه گؤستریله‌جکدیر.',
 'passwordreset-email' => 'ایمیل آدرسی:',
 'passwordreset-emailtitle' => '{{SITENAME}}-ده حساب بیلگیلری',
-'passwordreset-emailtext-ip' => 'بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)، {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون یادا سالما بیلگیلری ایسته‌ییب‌دیر. آشاغیداکی ایستیفاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:
+'passwordreset-emailtext-ip' => 'بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)، {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون رمزی یئنیله‌مک ایسته‌ییب‌دیر. آشاغیداکی ایستیفاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:
 
 $2
 
 بو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر گون|$5 گون}}‌ده {{PLURAL:$3|واختی|واختلاری}} قورتاراجاق‌دیر.
 سیز گرک ایندی سایتا گیریب و یئنی بیر رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.',
-'passwordreset-emailtext-user' => '{{SITENAME}} سایتیندا، $1 ایستیفاده‌چی، سیزین اوردا ($4) حسابینیز بیلگیلری اوچون بیر یادا سالما ایستگی وئریب‌دیر. آشاغیداکی {{PLURAL:$3|ایستیفاده‌چی|ایستیفاده‌چیلر}} بو ایمیل ایله ایلگیلیدیرلر:
+'passwordreset-emailtext-user' => '{{SITENAME}} سایتیندا، $1 ایستیفاده‌چی، سیزین اوردا ($4) حسابینیزین رمزینی یئنیله‌مک ایستگی وئریب‌دیر. آشاغیداکی {{PLURAL:$3|ایستیفاده‌چی|ایستیفاده‌چیلر}} بو ایمیل ایله ایلگیلیدیرلر:
 
 $2
 
@@ -643,9 +642,9 @@ $2
 سیز گرک ایندی گیریب و بیر یئنی رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.',
 'passwordreset-emailelement' => 'ایستیفاده‌چی آدی: $1
 گئچیجی رمز: $2',
-'passwordreset-emailsent' => 'بیر یادا سالما ایمیلی گؤندریلیب‌دیر.',
-'passwordreset-emailsent-capture' => 'آشاغیدا گؤستریلن کیمی بیر یادا سالما ایمیلی گؤندریلیب‌دیر.',
-'passwordreset-emailerror-capture' => 'آشاغیدا گؤستریلن کیمی بیر یادا سالما ایمیل یارادیلیب‌دیر، اما ایستیفاده‌چی‌یه گؤندرمگی باشاریلی اولمادی: $1',
+'passwordreset-emailsent' => 'بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
+'passwordreset-emailsent-capture' => 'آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.',
+'passwordreset-emailerror-capture' => 'آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی یارادیلیب‌دیر، اما ایستیفاده‌چی‌یه گؤندرمگی باشاریلی اولمادی: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ایمیل آدرسینی دَییشدیر',
@@ -1138,15 +1137,6 @@ $1",
 ایندی گوگل ایله آختارا بیلرسینیز.
 دیقت ائدین کی اونون {{SITENAME}} ایندئکسی، کؤهنه اولا بیلر.',
 
-# Quickbar
-'qbsettings' => 'سورعت پانئلی',
-'qbsettings-none' => 'هئچ بیری',
-'qbsettings-fixedleft' => 'سولا ثابیت',
-'qbsettings-fixedright' => 'ساغا ثابیت',
-'qbsettings-floatingleft' => 'سولا اوزن',
-'qbsettings-floatingright' => 'ساغا اوزن',
-'qbsettings-directionality' => 'ثابیت، سیزین دیل یازینیزین یولویلا',
-
 # Preferences page
 'preferences' => 'ترجیحلر',
 'mypreferences' => 'ترجیحلر',
@@ -1697,7 +1687,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سین
 'http-read-error' => 'اچ‌تی‌تی‌پی اوخوما ختاسی',
 'http-timed-out' => 'اچ‌تی‌تی‌پی ایستیی‌نین واختی بیتدی.',
 'http-curl-error' => 'مراجعت نشانی ده یانلیش : $1',
-'http-host-unreachable' => 'آدرسه چاتماق اولمادی (خطا).',
 'http-bad-status' => 'اچ‌تی‌تی‌پی مراجعتین یوخلانماسی زامانی پروبلئم آشکارلانمیش‌دیر: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2115,8 +2104,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization صحیفه‌‌سین
 'notvisiblerev' => 'باشقا ایستیفادی‌چی‌نین سون دییشیک‌لیگی سیلینیب',
 'watchnochange' => 'گؤستریلن واخت‌دا هئچ بیر ایزله‌دیگینیز صحیفه دَییشدیریلمه‌ییبدیر.',
 'watchlist-details' => 'دانیشیق صفحه‌لرینی سایمایاراق، {{PLURAL:$1|$1 صفحه‌نی}} ایزله‌ییرسینیز.',
-'wlheader-enotif' => 'ایمیل مکتوبلا بیلدیریش اولا بیلر.',
-'wlheader-showupdated' => "سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
+'wlheader-enotif' => 'ایمیل مکتوبلا بیلدیریش اولا بیلر.',
+'wlheader-showupdated' => "سون گؤروشونوزدن سونرا ائدیلن دییشیکلیکلر '''قالین''' گؤستریلیبدیلر.",
 'watchmethod-recent' => 'یئنی دییشیک‌لیک‌لر ایزلنیلن صحیفه‌لر اوچون یوخلانیلیر',
 'watchmethod-list' => 'ایزلنیلن صحیفه‌لر یئنی دییشیک‌لیک‌لر اوچون یوخلانیلیر',
 'watchlistcontains' => 'ایزلمه سیاهینیزدا $1 {{PLURAL:$11|صحیفه}} وار.',
@@ -2525,6 +2514,7 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'sorbsreason' => 'ای پی عنوانینیز، {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.',
 'sorbs_create_account_reason' => 'ایپ اونوانینیز {{SITENAME}} سایتی طرفین‌دن ایستیفاده ائدیلن DNSBL آچیق پروکسی اولا‌راق اولونموش.
 حساب میدانا گتیره بیلمز',
+'xffblockreason' => 'X-Forwarded-For باشلیغیندا، سیزین یا بیر ایشلتدیگینیز پروکسی خیدمتچی‌نین بلوکلانمیش آی‌پی آدرسی وار. ایلکین بلوکلاما سببی: $1',
 'cant-block-while-blocked' => 'سیز ائنگئللیيکئن باشقا ایستیفاده‌چیلری مانعه تؤره‌ده بیلمزسینیز.',
 'cant-see-hidden-user' => 'قارشیسینی آلماق ایسته‌دیگینیز ایستیفاده‌چی اونسوز دا مانعه تؤره‌دیلمیش و گیزلنمیش. کوللانیجیگیزلئ ایجازه‌نیز اولمادیغی اوچون، ایستیفاده‌چی‌نین قارشیسی‌نین آلینماسینی گؤره بیلمز يا دا ديَیشدیره.',
 'ipbblocked' => 'دیگر ایستیفاده‌چیلری مانعه تؤره‌ده بیلمز يا دا مانعه تؤرتمه‌سینی قالدیرا بیلمز، چونکی اؤزونوز ائنگئللئنمیشسیز',
@@ -2875,7 +2865,7 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'pageinfo-robot-noindex' => 'ایندِکسله‌نه بیلمز',
 'pageinfo-views' => 'گؤسترمه صحیفه‌سی',
 'pageinfo-watchers' => 'صحیفه‌نین تاماشا‌چی سایی',
-'pageinfo-few-watchers' => '$1-دن آز {{PLURAL:$1|ایزله‌ین|ایزله‌ین}}',
+'pageinfo-few-watchers' => '$1-دن آز {{PLURAL:$1|ایزله‌ین}}',
 'pageinfo-redirects-name' => 'بو صحیفه‌یه یول‌لاندیرمالار',
 'pageinfo-subpages-name' => 'بو صحیفه‌نین آلت‌صحیفه‌لری',
 'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|بیر|$2}} یول‌لاندیرما؛ {{PLURAL:$3|بیر|$3}} قِیری-یول‌لاندیرما)',
@@ -2904,9 +2894,6 @@ $1 آدلی ایستیفاده‌چی‌نین باغلانما سببی: "$2"',
 'pageinfo-category-subcats' => 'آلت‌بؤلمه‌لرین سایی',
 'pageinfo-category-files' => 'فایل‌لارین سایی',
 
-# Skin names
-'skinname-myskin' => 'منیم قابیغیم',
-
 # Patrolling
 'markaspatrolleddiff' => 'ایداره ائدیلمیش اولا‌راق ایشاره‌له',
 'markaspatrolledtext' => 'صحیفنی پاتروللانمیش کیمی ایشاره‌له',
@@ -3014,7 +3001,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'گئنیش‌لیک',
 'exif-imagelength' => 'اوزوناسی',
 'exif-bitspersample' => 'هر جز دا نقطه',
@@ -3192,7 +3179,7 @@ $1',
 'exif-originalimageheight' => 'شکیلین کسیلمه دن اوولکی اوجالیقی',
 'exif-originalimagewidth' => 'شکیلین کسیلمه دن اوولکی گئنیش‌لیگی',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'سیخیلمامیش',
 'exif-compression-2' => 'پسوورد قویماق سی‌سی‌آی‌تی‌تی ۳  گروه دا بیر بعدی هافمن روشی ایله اوزوناسی اوستونده دییشیلیب',
 'exif-compression-3' => 'رمز قرار وئرمک سی‌سی‌آی‌تی‌تی قروپ ۳',
@@ -3604,13 +3591,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'گیریش نقطه‌‌سی',
 'version-entrypoints-header-url' => 'اینترنت آدرسی',
 
-# Special:FilePath
-'filepath' => 'فايل يولو',
-'filepath-page' => 'فایل:',
-'filepath-submit' => 'گئت',
-'filepath-summary' => 'بو اؤزل صحیفه‌‌ بیر فايل اوچون تام يولو گتیرر. 
-شکیللر تام تصویرین گؤستریلیر، دیگر فايل نؤولری ایله باغلی پروقراملاری بیرباشا ایشه باشلايیر.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'دوبلیکات فايل آختاریشی',
 'fileduplicatesearch-summary' => 'تعمین ائتمک ديَری دؤشه‌مه‌سینده بنزر فايللاری آختار.',
@@ -3706,17 +3686,17 @@ $5
 'sqlite-no-fts' => '$1 بوتون یازی آختارماماق‌لا',
 
 # New logging system
-'logentry-delete-delete' => '$1، $3 صحیفه‌سینی سیلدی',
-'logentry-delete-restore' => '$1، $3 صحیفه‌سینی قایتاردی',
-'logentry-delete-event' => '$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} دَییشدیردی: $4',
-'logentry-delete-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} دَییشدیردی: $4',
-'logentry-delete-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی دَییشدیردی',
-'logentry-delete-revision-legacy' => '$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی دَییشدیردی',
-'logentry-suppress-delete' => '$1، $3 صحیفه‌سینی یاتیردی',
-'logentry-suppress-event' => '$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه دَییشدیردی: $4',
-'logentry-suppress-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه دَییشدیردی: $4',
-'logentry-suppress-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی گیزلینجه دَییشدیردی',
-'logentry-suppress-revision-legacy' => '$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی گیزلینجه دَییشدیردی',
+'logentry-delete-delete' => '$1، $3 صحیفه‌سینی {{GENDER:$2|سیلدی}}',
+'logentry-delete-restore' => '$1، $3 صحیفه‌سینی {{GENDER:$2|قایتاردی}}',
+'logentry-delete-event' => '$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-delete-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-delete-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی {{GENDER:$2|دَییشدیردی}}',
+'logentry-delete-revision-legacy' => '$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی {{GENDER:$2|دَییشدیردی}}',
+'logentry-suppress-delete' => '$1، $3 صحیفه‌سینی {{GENDER:$2|یاتیردی}}',
+'logentry-suppress-event' => '$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-suppress-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه {{GENDER:$2|دَییشدیردی}}: $4',
+'logentry-suppress-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی گیزلینجه {{GENDER:$2|دَییشدیردی}}',
+'logentry-suppress-revision-legacy' => '$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی گیزلینجه {{GENDER:$2|دَییشدیردی}}',
 'revdelete-content-hid' => 'ایچینده‌کیلر گیزلی‌دیر',
 'revdelete-summary-hid' => 'دَییشیکلیک قیساسی گیزلی‌دیر',
 'revdelete-uname-hid' => 'ایستیفاده‌چی آدی گیزلی‌دیر',
@@ -3725,20 +3705,20 @@ $5
 'revdelete-uname-unhid' => 'ایستیفاده‌چی آدی گیزلیلیک‌دن چیخدی',
 'revdelete-restricted' => 'ایداره‌چیلره محدودیت قویدو',
 'revdelete-unrestricted' => 'ایداره‌چیلرین محدودیتلرینی گؤتوردو',
-'logentry-move-move' => '$1، $3 صحیفه‌سینی $4-ه آپاردی',
-'logentry-move-move-noredirect' => '$1، $3 صحیفه‌سینی، یول‌لاندیرما قویماماق‌لا، $4-ه آپاردی',
-'logentry-move-move_redir' => '$1، $3 صحیفه‌سینی، $4-ده یول‌لاندیرما اوستونه آپاردی',
-'logentry-move-move_redir-noredirect' => '$1، $3 صحیفه‌سینی، یول‌لاندیرما قویماماق‌لا، یول‌لاندیرما اولان $4 اوستونه آپاردی',
-'logentry-patrol-patrol' => '$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، نظارتلنمیش نیشانلادی',
-'logentry-patrol-patrol-auto' => '$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، اوتوماتیک اولاراق نظارتلنمیش نیشانلادی',
-'logentry-newusers-newusers' => ' بیر ایستیفاده‌چی حسابی $1 یاراتدی',
-'logentry-newusers-create' => 'بیر ایستیفاده‌چی حسابی $1 یاراتدی',
-'logentry-newusers-create2' => 'بیر ایستیفاده‌چی $1 حسابی $3 یاراتدی',
-'logentry-newusers-byemail' => '$3 ایستیفاده‌چی حسابی، $1 ایله یارادیلیب و رمز، ایمیل ایله گؤندریلیب‌دیر',
-'logentry-newusers-autocreate' => '$1 Ø­Ø³Ø§Ø¨Û\8c Ø§Ù\88تÙ\88Ù\85اتÛ\8cÚ© Û\8cارادÛ\8cÙ\84دÛ\8c',
-'logentry-rights-rights' => '$1 $3-ین قروپ عوضولوگونو $4-دن $5-ه دَییشدیردی',
-'logentry-rights-rights-legacy' => '$1، $3-ین قروپ عوضولوگونو دَییشدیردی',
-'logentry-rights-autopromote' => '$1-ین مقامی اوتوماتیک $4-دن $5-ه آرتیریلدی',
+'logentry-move-move' => '$1، $3 صحیفه‌سینی $4-ه {{GENDER:$2|آپاردی}}',
+'logentry-move-move-noredirect' => '$1، $3 صحیفه‌سینی، یول‌لاندیرما قویماماق‌لا، $4-ه {{GENDER:$2|آپاردی}}',
+'logentry-move-move_redir' => '$1، $3 صحیفه‌سینی، $4-ده یول‌لاندیرما اوستونه {{GENDER:$2|آپاردی}}',
+'logentry-move-move_redir-noredirect' => '$1، $3 صحیفه‌سینی، یول‌لاندیرما قویماماق‌لا، یول‌لاندیرما اولان $4 اوستونه {{GENDER:$2|آپاردی}}',
+'logentry-patrol-patrol' => '$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، نظارتلنمیش {{GENDER:$2|نیشانلادی}}',
+'logentry-patrol-patrol-auto' => '$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، اوتوماتیک اولاراق نظارتلنمیش {{GENDER:$2|نیشانلادی}}',
+'logentry-newusers-newusers' => ' بیر ایستیفاده‌چی حسابی $1 {{GENDER:$2|یاراتدی}}',
+'logentry-newusers-create' => 'بیر ایستیفاده‌چی حسابی $1 {{GENDER:$2|یاراتدی}}',
+'logentry-newusers-create2' => '$1 ایستیفاده‌چی، $3 حسابی {{GENDER:$2|یاراتدی}}',
+'logentry-newusers-byemail' => '$3 ایستیفاده‌چی حسابی، $1 ایله {{GENDER:$2|یارادیلیب}} و رمز، ایمیل ایله گؤندریلیب‌دیر',
+'logentry-newusers-autocreate' => '$1 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø­Ø³Ø§Ø¨Û\8c Ø§Ù\88تÙ\88Ù\85اتÛ\8cÚ© {{GENDER:$2|Û\8cارادÛ\8cÙ\84دÛ\8c}}',
+'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|آرتیریلدی}}',
 'rightsnone' => '(هئچ)',
 
 # Feedback
index 85246aa..ba1bc8d 100644 (file)
@@ -11,6 +11,7 @@
  * @author Comp1089
  * @author Haqmar
  * @author Kaganer
+ * @author Matma Rex
  * @author Reedy
  * @author Roustammr
  * @author Sagan
@@ -176,8 +177,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Битте күҙәтеү исемлегенә өҫтәгән ҡулланыусылар һанын күрһәтергә',
 'tog-oldsig' => 'Хәҙерге имза:',
 'tog-fancysig' => 'Имзаның үҙ вики-тамғаһы (автоматик һылтанмаһыҙ)',
-'tog-externaleditor' => 'Махсус билдәләнмәһә, тышҡы мөхәррирләүсе ҡулланырға (белгестәр өсөн генә, компьютер махсус көйләнгән булырға тейеш)',
-'tog-externaldiff' => 'Махсус билдәләнмәһә, версияларҙы сағыштырыу өсөн тышҡы программа ҡулланырға (белгестәр өсөн генә, компьютер махсус көйләнгән булырға тейеш)',
 'tog-showjumplinks' => '«Күс» ярҙамсы һылтанмалары асылһын',
 'tog-uselivepreview' => 'Тиҙ ҡарап алыуҙы ҡулланырға (JavaScript, эксперименталь)',
 'tog-forceeditsummary' => 'Төҙәтеүҙе тасуирлау юлы тултырылмаһа, мине киҫәт',
@@ -191,6 +190,7 @@ $messages = array(
 'tog-diffonly' => 'Версия сағыштырыу аҫтында бит эстәлеге күрһәтелмәһен',
 'tog-showhiddencats' => 'Йәшерен категорияларҙы күрһәтергә',
 'tog-norollbackdiff' => 'Кире ҡайтарыуҙан һуң версия айырмалары күрһәтелмәһен',
+'tog-useeditwarning' => 'Мөхәррирләү битенән үҙгәртеүҙәрҙе һаҡламайынса сыҡҡан ваҡытта мине киҫәтергә',
 
 'underline-always' => 'Һәр ваҡыт',
 'underline-never' => 'Бер ҡасан да',
@@ -562,9 +562,13 @@ $2',
 'welcomecreation-msg' => 'Иҫәп яҙыуығыҙ яһалды.
 Шәхси [[Special:Preferences|{{SITENAME}} көйләүҙәрен]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
 'yourname' => 'Ҡатнашыусы исеме',
+'userlogin-yourname' => 'Ҡулланыусы исеме',
 'yourpassword' => 'Һеҙҙең пароль',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Яңы паролде яҙығыҙ',
 'yourpasswordagain' => 'Паролде ҡабаттан яҙыу',
 'remembermypassword' => 'Был компьютерҙа паролемде иҫләргә ($1 {{PLURAL:$1|көндән|көндән}} күп түгел)',
+'userlogin-remembermypassword' => 'Хәтерҙә ҡалдырырға',
 'securelogin-stick-https' => 'Танылғандан һуң HTTPS менән бәйләнеште ҡалдырырға',
 'yourdomainname' => 'Һеҙҙең домен',
 'password-change-forbidden' => 'Был викила паролегеҙҙе үҙгәртә алмайһығыҙ.',
@@ -668,10 +672,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Паролде ташлатыу',
-'passwordreset-text' => 'Иҫәп яҙыуығыҙ мәғлүмәттәрен хат аша алыу өсөн киләһе форманы тултырығыҙ.',
 'passwordreset-legend' => 'Паролде ташлатыу',
 'passwordreset-disabled' => 'Был викила паролде ташлатыу ғәмәлдә түгел',
-'passwordreset-pretext' => '{{PLURAL:$1||аҫта күрһәтелгән мәғлүмәттәрҙең бер киҫәген керетегеҙ}}',
 'passwordreset-username' => 'Ҡулланыусы исеме:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Хәбәрҙең һуңғы хәлен ҡарарғамы?',
@@ -911,6 +913,8 @@ $2
 'content-failed-to-parse' => '$2 эстәлеге $1 төрөнә тура килмәй: $3.',
 'invalid-content-data' => 'Ярамаған мәғлүмәт',
 'content-not-allowed-here' => '"$1" эстәлеге [[$2]] бит өсөн ярамай',
+'editwarning-warning' => 'Икенсе биткә күсеү һеҙ индергән үҙгәрештәрҙең юғалыуына килтереүе мөмкин.
+Әгәр системала танылыу үтһәгеҙ, көйләүҙәрегеҙ битенең "Мөхәррирләү" бүлегендә был киҫәтеүҙе һүндерә алаһығыҙ.',
 
 # Content models
 'content-model-wikitext' => 'викияҙма',
@@ -958,7 +962,7 @@ $3 белдергән сәбәп: ''$2''",
 'currentrev' => 'Ағымдағы версия',
 'currentrev-asof' => '$1, ағымдағы версия',
 'revisionasof' => '$1 версияһы',
-'revision-info' => '<div id="viewingold-warning" style="background: #FFBDBD; border: 1px solid #BB7979; color: #000000; margin: 1em 0 .5em; padding: .5em 1em; vertical-align: middle; font-weight: bold; font-family: Palatino Linotype, Microsoft Sans Serif, Arial Unicode MS, Droid Sans; clear: both;">Хәҙер һеҙ был биттең иҫке, <span id="mw-revision-name">$2</span> тарафынан <span id="mw-revision-date">$1</span> һаҡланған версияһын ҡарайһығыҙ. Уның <span class="plainlinks">[{{fullurl:{{FULLPAGENAME}}}} ағымдағы версиянан] айырмаһы булыуы мөмкин</span>.</div>',
+'revision-info' => 'Версия: $1; $2',
 'previousrevision' => '← Алдағы',
 'nextrevision' => 'Киләһе →',
 'currentrevisionlink' => 'Ағымдағы версия',
@@ -1195,15 +1199,6 @@ $1",
 Хәҙергә эҙләүҙе Google менән үтәй алаһығыҙ.
 Тик унда {{SITENAME}} өсөн индекслауҙың иҫке булыуы мөмкинлеген онотмағыҙ.',
 
-# Quickbar
-'qbsettings' => 'Тиҙ күсеү',
-'qbsettings-none' => 'Һис бере',
-'qbsettings-fixedleft' => 'Һулда нығытылған',
-'qbsettings-fixedright' => 'Уңда нығытылған',
-'qbsettings-floatingleft' => 'Һулда күсеүсе',
-'qbsettings-floatingright' => 'Уңда күсеүсе',
-'qbsettings-directionality' => 'Беркетелгән, телегеҙҙең яҙыу йүнәлешенә бәйле',
-
 # Preferences page
 'preferences' => 'Көйләүҙәр',
 'mypreferences' => 'Көйләүҙәр',
@@ -1752,7 +1747,6 @@ $1',
 'http-read-error' => 'HTTP уҡыу хатаһы.',
 'http-timed-out' => 'HTTP-һорауҙы көтөү ваҡыты үтте.',
 'http-curl-error' => 'URL адрес буйынса мөрәжәғәт итеү хатаһы: $1',
-'http-host-unreachable' => 'URL адрес буйынса мөрәжәғәт итеү мөмкин түгел.',
 'http-bad-status' => 'HTTP-һорауҙы эшкәрткән ваҡытта ҡыйынлыҡтар тыуҙы: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2161,8 +2155,8 @@ $1',
 'notvisiblerev' => 'Башҡа ҡатнашыусы тарафынан керетелгән һуңғы өлгө юйылған',
 'watchnochange' => 'Күрһәтелгән арауыҡта күҙәтеүҙәр исемлегенән бер ни ҙә үҙгәрмәгән.',
 'watchlist-details' => 'Һеҙҙең күҙәтеү исемлегегеҙҙә, фекер алышыу биттәрен һанамағанда, {{PLURAL:$1|$1 бит|$1 бит}} бар.',
-'wlheader-enotif' => 'Электрон почта аша белдереү һайланған',
-'wlheader-showupdated' => "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
+'wlheader-enotif' => 'Электрон почта аша белдереү һайланған',
+'wlheader-showupdated' => "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
 'watchmethod-recent' => 'күҙәтелгән биттәр өсөн аҙаҡҡы үҙгәртеүҙәрҙе ҡарау',
 'watchmethod-list' => 'аҙаҡҡы үҙгәртеүҙәр өсөн күҙәтелгән биттәрҙе ҡарау',
 'watchlistcontains' => 'Һеҙҙең күҙәтеү исемлегендә $1 {{PLURAL:$1|бит|бит}}бар.',
@@ -2959,11 +2953,7 @@ The wiki server cannot provide data in a format your client can read.',
 'pageinfo-protect-cascading-from' => 'Бынан башлап һикәлтәле һаҡлау',
 
 # Skin names
-'skinname-standard' => 'Классик',
 'skinname-cologneblue' => 'Кёльн һағышы',
-'skinname-myskin' => 'Шәхси',
-'skinname-chick' => 'Себеш',
-'skinname-simple' => 'Ябай',
 'skinname-modern' => 'Заманса',
 'skinname-vector' => 'Векторлы',
 
@@ -3073,7 +3063,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Киңлек',
 'exif-imagelength' => 'Бейеклек',
 'exif-bitspersample' => 'Төҫтәрҙең тәрәнлеге',
@@ -3251,7 +3241,7 @@ $1',
 'exif-originalimageheight' => 'Кадрлауға тиклемге рәсем бейеклеге',
 'exif-originalimagewidth' => 'Кадрлауға тиклемге рәсем киңлеге',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ҡыҫылмаған',
 'exif-compression-2' => 'CCITT Group 3, Хаффман сериялары оҙонлоҡтарын кодлауҙың 1 үлсәмле модификацияһы',
 'exif-compression-3' => 'CCITT Group 3, факслы кодлау',
@@ -3666,13 +3656,6 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'version-entrypoints-header-entrypoint' => 'Инеш урыны',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файлға юл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күсеү',
-'filepath-summary' => 'Был махсус бит файлдың тулы юлын ҡайтара.
-Рәсемдәр тулы асыҡлыҡта күрһәтелә, башҡа файлдар билдәләнгән программалары аша турана-тура асыла.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Бер иш файлдарҙы эҙләү',
 'fileduplicatesearch-summary' => 'Бер иш файлдарҙы хэш-кодтары буйынса эҙләү.',
index 3132f72..50a9e92 100644 (file)
@@ -88,8 +88,6 @@ $messages = array(
 'tog-shownumberswatching' => "D' Åzoi voh dé beówochterden Benutzer åzoang",
 'tog-oldsig' => 'Existente Unterschrift',
 'tog-fancysig' => 'Unterschrift ois Wikitext bhåndln (óne autómaatische Valinkung)',
-'tog-externaleditor' => "An externen Editor ois Standard bnutzen (netter fyr Experten, braucht spezielle Eihstellungen auf'm eigernen Computer)",
-'tog-externaldiff' => "A externs Programm fyr Versionsunterschiad ois Standard bnutzen (netter fyr Experten, dafordert spezielle Eihstellungen auf'm eiganen Computer)",
 'tog-showjumplinks' => '„Wexeln zu“-Links aktivirn',
 'tog-uselivepreview' => 'Live-Vurschau nutzen (dodafyr braucht ma JavaScript) (experimentoy)',
 'tog-forceeditsummary' => 'Warnen, wånn ban Speichern dé Zåmmerfossung fööd',
@@ -103,6 +101,7 @@ $messages = array(
 'tog-diffonly' => "Zoag beim Versiónsvagleich netter dé Unterschiad und néd d' voiständige Seiten",
 'tog-showhiddencats' => 'Vasteckte Kategorien åzoang',
 'tog-norollbackdiff' => "Unterschiad noch'm Zrucksetzen unterdrucker",
+'tog-useeditwarning' => ' A Warung geem, sofern a zur da Beorweitung geffnate Seiten valossen werd, de ned gspeicherde Änderrungen enthoit.',
 
 'underline-always' => 'oiwei',
 'underline-never' => 'nia',
@@ -614,6 +613,8 @@ Bittschee ibaleg da genau, obs sinnvoi is de Seitn ozlegn.
 Des Lesch- und Vaschiab-Logbuach dazua findsd do:",
 'moveddeleted-notice' => 'De Seitn do is glescht worn. Es foigt a Auszug ausm Lesch- und Vaschiabungs-Logbuch vo dea Seitn.',
 'edit-conflict' => 'Konflikt ban Beorwaten.',
+'editwarning-warning' => "'s Valossen vo derer Seiten kå dodazua fyrn, daas d' Änderrungen valurn geengan.
+Ois ågmödter Benutzer kå's Åzoang vo derer Warnung im \"Beorweiten\"-Bereich vo de Eistellungen obgschoiden wern.",
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => 'Obocht: De Gress vo eibundne Vorlong is z gross.
@@ -1101,7 +1102,7 @@ Zuasätzlige Informaziónen ywer dé oahzelnen Rechtt kennan [[{{MediaWiki:Listg
 'listgrouprights-removegroup-self' => "'s oagerne Benutzerkóntó aus {{PLURAL:$2|derer Gruppm|dé Gruppm}} entferner: $1",
 'listgrouprights-addgroup-self-all' => 'Kauh olle Gruppm zum oagern Kóntó dazuadoah',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Du bist néd auhgmödt',
 'emailuser' => 'Mail an den Nutza',
 'emailpage' => 'E-Mail aun Benutzer',
@@ -1144,8 +1145,8 @@ Waunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, dru
 'notvisiblerev' => 'Versión is gléschd worn',
 'watchnochange' => 'Koahne dé voh dir beówochterden Seiten san wärnd dém auhzoagten Zeidraum beorwatt worn.',
 'watchlist-details' => 'Du beoochst {{PLURAL:$1|$1 Seitn}}, Dischkriaseitn ned mitgrechnad',
-'wlheader-enotif' => 'Da E-Mail-Benoochrichtigungsdeanst is aktivierd.',
-'wlheader-showupdated' => "Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
+'wlheader-enotif' => 'Da E-Mail-Benoochrichtigungsdeanst is aktivierd.',
+'wlheader-showupdated' => "Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
 'watchmethod-recent' => "Ywerpriaff d' létzden Beorwatungen fyr d' Beówochtungslisten",
 'watchmethod-list' => 'Ywerpriaffm voh da Beówochtungslisten auf létzde Beorwatungen',
 'watchlistcontains' => 'Deih Beówochtungslisten enthoitt $1 {{PLURAL:$1|Seiten|Seiten}}.',
@@ -1580,7 +1581,7 @@ Weidane wean standardmassi ned ozoagt.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-gpsspeed' => 'Gschwindigkeid vom GPS-Empfänger',
 
 'exif-componentsconfiguration-0' => 'Gibts néd',
@@ -1594,7 +1595,7 @@ Weidane wean standardmassi ned ozoagt.
 'namespacesall' => 'olle',
 'monthsall' => 'olle',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'E-Post-Adressn bestäting (Authentifiziarung)',
 'confirmemail_noemail' => 'Du håst ka güitige E-Post-Adressn in deine [[Special:Preferences|persönlichn Eistellungen]] eitrång.',
 'confirmemail_send' => 'Bstätigungscode zuaschicker',
diff --git a/languages/messages/MessagesBbc.php b/languages/messages/MessagesBbc.php
new file mode 100644 (file)
index 0000000..e5072e9
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+/** Batak Toba (Batak Toba)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ * @comment falls back to Batak Toba (Latin)
+ */
+
+$fallback = 'bbc-latn';
diff --git a/languages/messages/MessagesBbc_latn.php b/languages/messages/MessagesBbc_latn.php
new file mode 100644 (file)
index 0000000..da966b2
--- /dev/null
@@ -0,0 +1,737 @@
+<?php
+/** Batak Toba (Batak Toba)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Daniel Harahap
+ * @author Marvel manalu
+ * @author Naval Scene
+ * @author Stephensuleeman
+ * @author WBT001Erin
+ * @author WBT003Bugari
+ * @author WBT004Togu
+ * @author WBT006Hendra
+ * @author WBT009Anju
+ */
+
+$fallback = 'id';
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Ondolhon panait',
+'tog-justify' => 'Padasip paragrap',
+'tog-hideminor' => 'Tabunihon editing na metmet di parubaan na imbaru',
+'tog-hidepatrolled' => 'Bunihon panotaan na metmet di parubaan na imbaru',
+'tog-numberheadings' => 'Bahen nomor judul otomatis',
+'tog-showtoolbar' => 'Pataridahon molo ula-ula haubaon',
+'tog-editondblclick' => 'Klik dua hali laho patotahon alaman (ringkot do JavaScript)',
+'tog-minordefault' => 'Tandai sude panotaan na metmet songon naung dipamasa',
+'tog-previewontop' => 'Patuduon preview andorang so kotak edit',
+'tog-previewonfirst' => 'Patudu pratayang di panotaan na parjolo',
+'tog-enotifwatchlistpages' => 'Tongoshon tu ahu surat elektronik molo muba sada alaman na humanat-manati',
+'tog-enotifusertalkpages' => 'Tongoshon tu ahu surat elektronik molo muba alaman panghataionku',
+'tog-enotifminoredits' => 'Tong ma tongoshon surat elektronik tu ahu diparubaan na metmet',
+'tog-enotifrevealaddr' => 'Papatar alamat surat elektronikku tikki notifikasi surat elektronik',
+'tog-shownumberswatching' => 'Patuduhon godang ni pamareso',
+'tog-oldsig' => 'Tandatangani saonari:',
+'tog-forceeditsummary' => 'Paingot ahu molo bongot tu poti panotaan na rumar',
+'tog-watchlisthideown' => 'Bunihon na hupatota sian pamareso',
+'tog-showhiddencats' => 'Papatar angka kategori na buni',
+
+'underline-always' => 'Tongtong',
+'underline-never' => 'Ndang hea masa',
+
+# Dates
+'sunday' => 'Ari Minggu',
+'monday' => 'Ari Senen',
+'tuesday' => 'Ari Selasa',
+'wednesday' => 'Ari Rabu',
+'thursday' => 'Ari Kamis',
+'friday' => 'Ari Jumat',
+'saturday' => 'Ari Sabtu',
+'sun' => 'Mgg',
+'mon' => 'Snn',
+'tue' => 'Sls',
+'wed' => 'Rb',
+'thu' => 'Kms',
+'fri' => 'Jmt',
+'sat' => 'Sbt',
+'january' => 'Sipaha Sampulu',
+'february' => 'Li',
+'march' => 'Hurung',
+'april' => 'Sipaha Sada',
+'may_long' => 'Sipaha Dua',
+'june' => 'Sipaha Tolu',
+'july' => 'Sipaha Opat',
+'august' => 'Sipaha Lima',
+'september' => 'Sipaha Onom',
+'october' => 'Sipaha Pitu',
+'november' => 'Sipaha Uwalu',
+'december' => 'Sipaha Sia',
+'january-gen' => 'Sipaha Sampulu',
+'february-gen' => 'Li',
+'march-gen' => 'Hurung',
+'april-gen' => 'Sipaha Sada',
+'may-gen' => 'Sipaha Dua',
+'june-gen' => 'Sipaha Tolu',
+'july-gen' => 'Sipaha Opat',
+'august-gen' => 'Sipaha Lima',
+'september-gen' => 'Sipaha Onom',
+'october-gen' => 'Sipaha Pitu',
+'november-gen' => 'Sipaha Uwalu',
+'december-gen' => 'Sipaha Sia',
+'jan' => 'Sipaha Sampulu',
+'feb' => 'Li',
+'mar' => 'Hurung',
+'apr' => 'Sipaha Sada',
+'may' => 'Sipaha Dua',
+'jun' => 'Sipaha Tolu',
+'jul' => 'Sipaha Opat',
+'aug' => 'Sipaha Lima',
+'sep' => 'Sipaha Onom',
+'oct' => 'Sipaha Pitu',
+'nov' => 'Sipaha Uwalu',
+'dec' => 'Sipaha Sia',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Horong|Angka horong}}',
+'category_header' => 'Angka alaman di horong "$1"',
+'subcategories' => 'Horong na metmet',
+'category-media-header' => 'Media dibagasan horong  "$1"',
+'category-empty' => '"Ndang adong alaman manang media di horong on nuaeng."',
+'hidden-categories' => '{{PLURAL:$1|Horong na buni|Angka horong na buni}}',
+'hidden-category-category' => 'Kategori na buni',
+'category-subcat-count' => '{{PLURAL:$2|Horong on marisi {{PLURAL:$1|$1 horong na metmet}} sian sude $2.}}',
+'category-article-count' => '{{PLURAL:$2|Horong on marisi {{PLURAL:$1|$1 alaman}}, sian sude $2.}}',
+'category-file-count' => '{{PLURAL:$2|Horong on holan marisi berkas{{PLURAL:$1|$1 alaman}}, sian sude $2.}}',
+'listingcontinuesabbrev' => 'udut.',
+'broken-file-category' => 'Alaman dohot gombaran na sega',
+
+'about' => 'Taringot',
+'article' => 'alaman isi',
+'newwindow' => '(ungkap ni pandiloi na imbaru)',
+'cancel' => 'Sundati',
+'moredotdotdot' => 'Tambai',
+'mypage' => 'Alaman',
+'mytalk' => 'Pangkataion',
+'navigation' => 'Angka ula-ula laho patuduhon dalan dohot luat',
+'and' => '&#32;dohot',
+
+# Cologne Blue skin
+'qbfind' => 'Jumpangi',
+'qbedit' => 'Patota',
+'qbpageoptions' => 'Alaman on',
+'qbmyoptions' => 'Alaman niiba',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => 'Bagian na imbaru',
+'vector-action-delete' => 'Sesa',
+'vector-action-move' => 'Pahusor',
+'vector-action-protect' => 'Ramoti',
+'vector-action-undelete' => 'unang sesa',
+'vector-action-unprotect' => 'Uba parlindungan',
+'vector-view-create' => 'Tompa',
+'vector-view-edit' => 'Paubah',
+'vector-view-history' => 'Patudu andorang na',
+'vector-view-view' => 'Jaha',
+'vector-view-viewsource' => 'Ida haroanna',
+'actions' => 'Pangulahonon',
+'namespaces' => 'Inganan ni goar',
+'variants' => 'Angka ragam',
+
+'errorpagetitle' => 'Sega',
+'returnto' => 'Mulak tu $1.',
+'tagline' => 'Sian {{SITENAME}}',
+'help' => 'Urupi',
+'search' => 'Diori',
+'searchbutton' => 'Diori',
+'go' => 'Laho tu',
+'searcharticle' => 'Laho tu',
+'history' => 'Alaman turiturian',
+'history_short' => 'Angka siingoton',
+'printableversion' => 'versi na boi dicetak',
+'permalink' => 'Pangait na togu',
+'view' => 'Ida',
+'edit' => 'Patota',
+'create' => 'Tompa',
+'editthispage' => 'Patota alaman on',
+'create-this-page' => 'Bahen alaman on',
+'delete' => 'Sesa',
+'deletethispage' => 'Sesa alaman on',
+'undelete_short' => 'Sundat sesa $1 {{PLURAL:$1|panotaan|panotaan}}',
+'protect' => 'Ramoti',
+'protect_change' => 'Pauba',
+'newpage' => 'Alaman na imbaru',
+'talkpage' => 'Hatahon alaman on',
+'talkpagelinktext' => 'Pangkataion',
+'personaltools' => 'Ula-ula ni sasahalak',
+'postcomment' => 'Bagian imbaru',
+'talk' => 'Panghataion',
+'views' => 'Hataridaan',
+'toolbox' => 'Poti ulaula',
+'userpage' => 'Ida alaman ni pamangke',
+'viewhelppage' => 'Ida alaman pangurupion',
+'viewtalkpage' => 'Ida alaman panghataion',
+'otherlanguages' => 'Di bagasan parhataan na asing',
+'redirectedfrom' => '(Ulanghon sian $1)',
+'lastmodifiedat' => 'Alaman on parpudi di uba ari $2, topet $1.',
+'viewcount' => 'Alaman on nungga dibongoti {{PLURAL:$1|sahali|$1 hali}}',
+'protectedpage' => 'Alaman na di jaga',
+'jumpto' => 'Manimbung tu:',
+'jumptonavigation' => 'angka ula-ula laho patuduhon dalan dohot luat',
+'jumptosearch' => 'Diori',
+'pool-timeout' => 'Suda tingki paimahon hincu',
+'pool-errorunknown' => 'Hasalaan na so binoto',
+
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutsite' => 'Taringot {{SITENAME}}',
+'aboutpage' => 'Project:Taringot tu',
+'copyright' => 'Sude siguriton rade saguru tu $1.',
+'copyrightpage' => '{{ns:project}}:Hak manopa',
+'currentevents' => 'Na tongon masa',
+'currentevents-url' => 'Project:Na masa nuaeng',
+'disclaimers' => 'Panyakalon',
+'disclaimerpage' => 'Project:Pamorsoon umum',
+'edithelp' => 'Pangurupion laho patotahon',
+'edithelppage' => 'Help:Panotaan',
+'helppage' => 'Help:Isi',
+'mainpage' => 'Pogu ni Alaman',
+'mainpage-description' => 'Pogu ni alaman',
+'portal' => 'Harbangan ni punguan',
+'portal-url' => 'Project:Harbangan ni punguan',
+
+'badaccess-group0' => 'Dang diloas hamu laho mangulahon na pinangidomu',
+
+'ok' => 'OK',
+'retrievedfrom' => 'Dijalo sian "$1"',
+'youhavenewmessages' => 'Adong di ho $1 ($2).',
+'newmessageslink' => 'Tona na imbaru',
+'newmessagesdifflink' => 'Parubaan na parpudi',
+'youhavenewmessagesmulti' => 'Adong tu ho tona na imbaru di $1',
+'editsection' => 'Patota',
+'editold' => 'patota',
+'viewsourceold' => 'Bereng harorona',
+'editlink' => 'Patota',
+'viewsourcelink' => 'Ida ma mual',
+'editsectionhint' => 'Patota ponggol: $1',
+'toc' => 'Isi',
+'showtoc' => 'Papatar',
+'hidetoc' => 'Bunihon',
+'collapsible-collapse' => 'Pagelleng',
+'collapsible-expand' => 'Paherbang',
+'thisisdeleted' => 'Ida manang Paulak $1?',
+'viewdeleted' => 'Ida $1?',
+'page-atom-feed' => 'Pele atom "$1"',
+'red-link-title' => '$1 (alaman naso adong dope)',
+'sort-descending' => 'Pajojor lam toru',
+'sort-ascending' => 'Pajojor lam timbo',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Alaman',
+'nstab-user' => 'Pamangke',
+'nstab-special' => 'Alaman na marhasurungan',
+'nstab-project' => 'Alaman ulaon',
+'nstab-image' => 'Berkas',
+'nstab-mediawiki' => 'Tona',
+'nstab-template' => 'Templat',
+'nstab-help' => 'Alaman pangurupion',
+'nstab-category' => 'Hategori',
+
+# General errors
+'error' => 'Hasesega',
+'fileappenderror' => 'Ndang boi pamasuhon "$1" tu "$2".',
+'badarticleerror' => 'Ulaon on dang boi i ulahon di alaman on',
+'cannotdelete-title' => 'Ndang boi manesa alaman "$1"',
+'badtitle' => 'Ulu ni surat na rumar',
+'viewsource' => 'Ida haroanna',
+'namespaceprotected' => "Ndang diloas hamu laho patotahon alaman di '''$1''' inganan ni goar",
+
+# Virus scanner
+'virus-unknownscanner' => 'Antivirus ndang ditanda:',
+
+# Login and logout pages
+'welcomeuser' => 'Horas, $1 !',
+'yourname' => 'Goar pamangke',
+'userlogin-yourname' => 'Siparhaseang',
+'userlogin-yourname-ph' => 'Pamasuk goarmu',
+'yourpassword' => 'Hata hincu:',
+'userlogin-yourpassword' => 'HAta hinsu',
+'userlogin-yourpassword-ph' => 'Pamasuk hata hinsu',
+'yourpasswordagain' => 'Ulanghon surat hata hincu:',
+'userlogin-remembermypassword' => 'Paingot ahu',
+'password-change-forbidden' => 'Ndang boi ubaonmu hata hincu di wiki on',
+'login' => 'Bongot tu log',
+'nav-login-createaccount' => 'Bongot tu log/ bahen akun',
+'loginprompt' => 'Ikkon dipangolu do "cookies" laho bongot log tu {{SINTENAME}}.',
+'userlogin' => 'Bongot tu log/ bahen akun',
+'userlogout' => 'Haruar log',
+'userlogin-noaccount' => 'Ndang adong akun',
+'userlogin-joinproject' => 'Parsidohot',
+'nologin' => 'Ndang adong akun? $1.',
+'nologinlink' => 'Bahen sada akun',
+'createaccount' => 'Bahen akun na imbaru',
+'gotaccount' => 'Nungga adong akunmu? $1',
+'gotaccountlink' => 'Bongot tu log',
+'helplogin-url' => 'Pangurupion: Masuk tu bagasan',
+'userlogin-helplink' => 'MediaWiki:pangurupion bongot tu bagas',
+'createaccountreason' => 'Alanan',
+'createaccounterror' => 'Ndang boi manopa akun: $1',
+'nouserspecified' => 'Ingkon pamasukonmuna goar ni pamangke',
+'mailmypassword' => 'Tongoshon hata hincu na imbaru',
+'emailnotauthenticated' => 'Alamat ni surat elektronikmuna ndang dope dipareso. Andorang so dipareso ndang boi pangkeonmuna rumang surat elektronik.',
+'emailconfirmlink' => 'Tolopi alamat surat elektronikmuna',
+'emaildisabled' => 'Ndang boi situs on manongos surat elekronik',
+'accountcreated' => 'Akun nunga ditopa',
+'login-abort-generic' => 'Ndang marhasil bongot - Dipaso ma',
+'loginlanguagelabel' => 'Hata: $1',
+
+# Change password dialog
+'resetpass' => 'Pauba hata hinsu',
+'oldpassword' => 'Hata hinsu na leleng',
+'newpassword' => 'Password naimbaru',
+'resetpass-submit-loggedin' => 'Pauba hata hinsu',
+'resetpass-submit-cancel' => 'Sundati',
+'resetpass-temp-password' => 'Hata hinsu parsatongkinan',
+
+# Special:PasswordReset
+'passwordreset-username' => 'Goar pamangke',
+'passwordreset-domain' => 'Domain:',
+
+# Special:ChangeEmail
+'changeemail-none' => '(Ndada)',
+'changeemail-cancel' => 'Sundati',
+
+# Edit page toolbar
+'bold_sample' => 'Surat tobal',
+'bold_tip' => 'Surat na hapal',
+'italic_sample' => 'Guratan Italic',
+'italic_tip' => 'surat teleng',
+'link_sample' => 'Goar ni pangait',
+'link_tip' => 'Pangait di bagasan',
+'extlink_sample' => 'http://www.example.com goar ni pangait',
+'extlink_tip' => 'Pangait parduru (ingot mulai dohot http:// )',
+'headline_sample' => 'Ulu ni surat',
+'nowiki_sample' => 'Pamasuk siguraton na so boi ubaon',
+'media_tip' => 'Pangait ni berkas',
+'sig_tip' => 'Tanda tangan pake pananda tingki',
+'hr_tip' => 'Garis na adar',
+
+# Edit pages
+'minoredit' => 'Panotaan na metmet',
+'watchthis' => 'Parrohahon alaman on',
+'savearticle' => 'Simpan alaman',
+'preview' => 'Andorang pataridahon',
+'showpreview' => 'Patudu pratayang',
+'showdiff' => 'Ida parubahan',
+'anoneditwarning' => "'''Paminsangon:''' Ndang bongot tu log dope hamu.
+Di surathon do alamat IP mu di turiturian ni alaman on.",
+'blockednoreason' => 'ndang adong alana na dilehon',
+'loginreqpagetext' => 'Ingkon $1 do hamu laho mamereng alaman na asing.',
+'accmailtitle' => 'Hata hincu nunga ditongos.',
+'newarticle' => '(Imbaru)',
+'noarticletext' => 'Ndang adong siguriton di alaman on saonari. Parhaseang ma[[Special:Search/{{PAGENAME}}|laho mandiori judul ni alaman on]] di alaman na asing, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mandiori log na mardomu], manang [{{fullurl:{{FULLPAGENAME}}|action=edit}} laho manota alaman on]</span>.',
+'noarticletext-nopermission' => 'Ndang adong siguriton di alaman on saonari. Parhaseang ma[[Special:Search/{{PAGENAME}}|laho mandiori goar ni alaman on]] di alaman na asing, manang <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mandiori angka log na mardomu]</span>, alai dang diloas hamu lahon mamungka alaman on.',
+'previewnote' => "'''Ingot ma holan sada andoramg pataridahon do on.'''
+Parubaan na binahenmu dang di simpan dope!",
+'editing' => 'Manota $1',
+'creating' => 'mambahen',
+'editingsection' => 'Manota $1 (ponggol)',
+'templatesused' => '{{PLURAL:$1|Templat|Angka templat}} na diparhaseang di alaman on:',
+'template-protected' => '(dijaga)',
+'template-semiprotected' => '(ndang apala sude diramoti)',
+'hiddencategories' => 'Alaman on ima sada sian {{PLURAL:$1|1 horong na buni|$1 horong na buni}}:',
+'moveddeleted-notice' => 'Alaman on nungnga disesa.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => 'Pinsangpinsang: Lobi do balga ni templat on. Pigapiga templat gabe dipasiding.',
+'post-expand-template-inclusion-category' => 'Angka alaman na balgana lobi',
+
+# History pages
+'viewpagelogs' => 'Pataridahon angka log ni alaman on',
+'currentrev-asof' => 'Panotaan parpudi ni $1',
+'revisionasof' => 'Panotaan songon $1',
+'revision-info' => 'Parubaan ni $1; $2',
+'previousrevision' => '←Revisi andorang na',
+'nextrevision' => 'Panotaan na mangihut→',
+'currentrevisionlink' => 'Panotaan na parpudi',
+'cur' => 'nuaeng',
+'next' => 'udutna',
+'last' => 'andorang',
+'page_first' => 'parjolo',
+'page_last' => 'parpudi',
+'history-show-deleted' => 'Holan na disesa',
+'histfirst' => 'Parjolo sahali',
+'histlast' => 'parpudi sahali',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 di $2',
+
+# Revision deletion
+'rev-delundel' => 'patarida/tabunihon',
+'rev-showdeleted' => 'Paida',
+'revdelete-log' => 'Alana',
+'revdel-restore' => 'Pauba pardompahan',
+'revdel-restore-deleted' => 'Patota naung di sesa',
+'revdel-restore-visible' => 'revisi na tarbereng',
+
+# Merge log
+'revertmerge' => 'Sundati Pardomuan',
+
+# Diffs
+'lineno' => 'Baris $1:',
+'editundo' => 'Paulak',
+
+# Search results
+'searchresults' => 'Hasil na niluluan',
+'searchresults-title' => 'Hasil mandiori tu "$1"',
+'prevn' => 'andorang so {{PLURAL:$1|$1}}',
+'nextn' => 'Ulaon na naen sitoruson {{PLURAL:$1|$1}}',
+'prevn-title' => 'Andorang so $1 {{PLURAL:$1|hasil|angka hasil}}',
+'nextn-title' => 'Ulaon na naen sitoruson tu $1 {{PLURAL:$1|result|results}}',
+'shown-title' => 'Patuduhon $1 {{PLURAL:$1|hasil|angka hasil}} ganup alaman',
+'viewprevnext' => 'Bereng ($1{{int:pipe-separator}}$2)($3)',
+'searchmenu-exists' => "'''Adong sada alaman na digoari \"[[:\$1]]\" di wiki on.'''",
+'searchmenu-new' => "'''Bahen alaman \"[[:\$1]]\" di wiki on!'''",
+'searchprofile-articles' => 'Alaman isi',
+'searchprofile-project' => 'Alaman pangurupion dohot proyek',
+'searchprofile-images' => 'Akat na godang gunana',
+'searchprofile-everything' => 'Sasude',
+'searchprofile-advanced' => 'Timbul',
+'searchprofile-articles-tooltip' => 'Mandiori di $1',
+'searchprofile-project-tooltip' => 'Mandiori di $1',
+'searchprofile-images-tooltip' => 'Mandiori berkas',
+'searchprofile-everything-tooltip' => 'Mandiori di sude inganan (dohot di alaman panghataion)',
+'searchprofile-advanced-tooltip' => 'Mandiori pake inganan ni goar',
+'search-result-size' => '$1 ({{PLURAL:$2|1 hata|$2 hata}})',
+'search-redirect' => '(ualanghon $1)',
+'search-section' => '(ponggol $1)',
+'search-suggest' => 'On do ra maksudmu: $1',
+'searchrelated' => 'marpandomuan',
+'searchall' => 'sude',
+'showingresultsheader' => "{{PLURAL:$5|Hasil '''$1''' sian '''$3'''|Hasil '''$1 - $2''' sian '''$3'''}} tu '''$4'''",
+'search-nonefound' => 'Ndang adong hasil na suman tu pangidoan',
+'powersearch-toggleall' => 'Sude',
+'powersearch-togglenone' => 'Ndang adong',
+
+# Preferences page
+'mypreferences' => 'Preferensi',
+'searchresultshead' => 'diori',
+'youremail' => 'Tongos surel:',
+'yourrealname' => 'Goar na toho',
+'gender-male' => 'Baoa',
+'gender-female' => 'borua',
+
+# Rights
+'right-read' => 'Manjaha alaman',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Log pamarhaseang na imbaru',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'Patota alaman on',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|parubaan}}',
+'recentchanges' => 'Parubahan naimbaru',
+'recentchanges-legend' => 'sipilliton sian parubaan na imbaru',
+'recentchanges-label-newpage' => 'Panotaan on mamungka alaman na imbaru',
+'recentchanges-label-minor' => 'Sada panotaan na metmet',
+'recentchanges-label-bot' => 'Panotaan on diulahon bot',
+'recentchanges-label-unpatrolled' => 'Panotaan on ndang dipamanat dope',
+'rcnote' => "Na di toru on ima {{PLURAL:$1|'''1'''|'''$1'''}} perubaan  di bagasan {{PLURAL:$2|'''1''' ari|'''$2''' ari}} na parpudi, olat ni $4 pukul $5.",
+'rclistfrom' => 'Patuduhon parubaan na imbaru mamungka sian $1',
+'rcshowhideminor' => '$1 panotaan na metmet',
+'rcshowhidebots' => '$1 bot',
+'rcshowhideliu' => '$1 pamarhaseang bongot tu log',
+'rcshowhideanons' => '$1 pamarhaseang ndang margoar',
+'rcshowhidepatr' => '$1 panotaan na dipamanat',
+'rcshowhidemine' => '$1 na hupatota',
+'rclinks' => 'Patuduhon $1 parubaan na imbaru dibagasan na $2 ari on<br />$3',
+'diff' => 'duru',
+'hist' => 'turi',
+'hide' => 'Bunihon',
+'show' => 'Patuduhon',
+'minoreditletter' => 'm',
+'newpageletter' => 'I',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Pataridahon panjamotan (ringkot do JavaScript)',
+'rc-enhanced-hide' => 'Bunihon panjamotan',
+
+# Recent changes linked
+'recentchangeslinked' => 'Angka parubaan na mardomu tu',
+'recentchangeslinked-toolbox' => 'Angka parubaan na mardomu tu',
+'recentchangeslinked-title' => 'Parubaan na mardomu tu "$1"',
+'recentchangeslinked-page' => 'Goar ni alaman:',
+'recentchangeslinked-to' => 'Pataridahon parubaan ni angka alaman na marpandomuan dohot alaman on',
+
+# Upload
+'upload' => 'Tambahon berkas',
+'filedesc' => 'Panimpulan',
+
+'license' => 'Ragam ni lisensi:',
+'license-header' => 'Ragam ni lisensi',
+'nolicense' => 'Ndang adong na i pillit',
+
+# File description page
+'file-anchor-link' => 'Berkas',
+'filehist' => 'Turiturian ni berkas',
+'filehist-help' => 'Piltik di sada tanggal/tingki laho mamereng berkas on di tingki i.',
+'filehist-revert' => 'Sundati',
+'filehist-current' => 'masa nuaeng',
+'filehist-datetime' => 'Pukkul',
+'filehist-thumb' => 'Thumbnail',
+'filehist-thumbtext' => 'Ganaganaan tu versi songon $1',
+'filehist-user' => 'Pamangke',
+'filehist-dimensions' => 'Dimensi',
+'filehist-comment' => 'Hata panambai',
+'imagelinks' => 'Parhaseangon ni berkas',
+'linkstoimage' => '{{PLURAL:$1|alaman pangait|$1 angka alaman na marpangait}} tu berkas on:',
+'nolinkstoimage' => 'Ndang adong alaman na marpangait tu berkas on.',
+'sharedupload-desc-here' => 'Berkas on sian $1 jala olo do diparhaseang angka proyek na asing. Hatorangan na ima [$2 alaman hatoranganna] dipatorang di toru on.',
+
+# Random page
+'randompage' => 'Alaman sursar',
+
+# Statistics
+'statistics' => 'Statistik',
+
+'disambiguationspage' => 'Template:Disambig',
+
+'pageswithprop-submit' => 'Laho tu',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|byte|bites}}',
+'nmembers' => '$1 {{PLURAL:$1|isi|angka isi}}',
+'usercreated' => '{{GENDER:$3|Dipungka}} ari $1 topet $2',
+'newpages' => 'Angka alaman na imbaru',
+'move' => 'Paorot',
+'pager-newer-n' => '{{PLURAL:$1|na imbaru|na imbaru $1}}',
+'pager-older-n' => '{{PLURAL:$1|na leleng|$1 na lumeleng}}',
+
+# Book sources
+'booksources-go' => 'Torushon',
+
+# Special:Log
+'log' => 'Angka log',
+
+# Special:AllPages
+'allpages' => 'Sude alaman',
+'alphaindexline' => '$1 tu $2',
+'allarticles' => 'Sude alaman',
+'allpagessubmit' => 'Torushon',
+
+# Special:Categories
+'categories' => 'Angka horong',
+
+# Special:LinkSearch
+'linksearch-line' => '$1 marpangait sian $2',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(daftar ni parsidohot)',
+
+# Email user
+'emailuser' => 'Surel pamarhaseang on',
+'emailfrom' => 'Sian',
+'emailto' => 'Tu',
+
+# Watchlist
+'watchlist' => 'Daftar na pinarrohahon',
+'mywatchlist' => 'Daftar na pinarrohahon',
+'watchlistfor2' => 'Laho tu $1 $2',
+'watch' => 'Parrohahon',
+'unwatch' => 'Sundat mamarrohahon',
+'wlshowlast' => 'Pataridahon $1 jom $2 ari $3 na parpudi',
+
+# Delete
+'actioncomplete' => 'Sae ulaon',
+'actionfailed' => 'Ulaon sundat',
+'dellogpage' => 'Log pasesaan',
+
+# Rollback
+'rollbacklink' => 'Paundur',
+
+# Protect
+'protectlogpage' => 'Log panghokhop',
+'protectedarticle' => 'manjaga "[[$1]]"',
+
+# Undelete
+'undeletelink' => 'Ida/paulak',
+'undeleteviewlink' => 'Ida',
+'undelete-show-file-submit' => 'Olo',
+
+# Namespace form on various pages
+'namespace' => 'Inganan ni goar:',
+'invert' => 'Paulak napinillit',
+'blanknamespace' => '(Rumingkot)',
+
+# Contributions
+'contributions' => 'Na niula {{GENDER:$1|pamarhaseang}}',
+'mycontris' => 'Angka silua',
+'contribsub2' => 'Laho tu $1 ($2)',
+'uctop' => 'di ginjang',
+'month' => 'Sian bulan (dohot andorang na)',
+'year' => 'Sian taon (dohot andorang na):',
+
+'sp-contributions-blocklog' => 'olati log',
+'sp-contributions-logs' => 'log',
+'sp-contributions-talk' => 'Pangkataion',
+'sp-contributions-username' => 'Alamat IP manang goar:',
+'sp-contributions-toponly' => 'Pataridahon holan panotaan parginjang',
+'sp-contributions-submit' => 'Diori',
+
+# What links here
+'whatlinkshere-title' => 'Angka alaman na marpangait tu "$1"',
+'whatlinkshere-page' => 'Alaman:',
+'linkshere' => "Angka alaman on marpangait tu '''[[:$1]]''':",
+'nolinkshere' => "Ndang adong alaman na marpangait tu '''[[:$1]]'''.",
+'isimage' => 'pangait berkas',
+'whatlinkshere-prev' => '{{PLURAL:$1|andorang so $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|udut na|udut na $1}}',
+'whatlinkshere-links' => '← angka pangait',
+'whatlinkshere-hideredirs' => '$1 manguba dalan',
+'whatlinkshere-hidelinks' => '$1 pangait',
+'whatlinkshere-hideimages' => '$1 pangait berkas',
+'whatlinkshere-filters' => 'Saringan',
+
+# Block/unblock
+'ipboptions' => '2 jom:2 hours,1 ari:1 day,3 ari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taon:1 year,salelengna:infinite',
+'ipblocklist' => 'Angka pamarhaseang na diolati',
+'blocklink' => 'ambati',
+'unblocklink' => 'Pamago Blokir',
+'change-blocklink' => 'Paubah blokir',
+'contribslink' => 'silehon-lehon',
+'blocklogpage' => 'Olati log',
+'block-log-flags-nocreate' => 'Ndang boi mamungka akun',
+
+# Move page
+'move-page-legend' => 'Papinda alaman',
+'movelogpage' => 'Log paorothon',
+'revertmove' => 'Sundati',
+
+# Export
+'export' => 'Ekspor alaman',
+
+# Namespace 8 related
+'allmessagesname' => 'Goar',
+'allmessages-filter-submit' => 'Laho tu',
+
+# Thumbnails
+'thumbnail-more' => 'Paheba',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Alaman ni na marparhaseang',
+'tooltip-pt-mytalk' => 'Alaman Pangkataionmuna',
+'tooltip-pt-preferences' => 'Pinillit ni hamu',
+'tooltip-pt-watchlist' => 'punguan angka goar ni alaman',
+'tooltip-pt-mycontris' => 'Daftar ni silua mu',
+'tooltip-pt-login' => 'Disosoi do hamu asa bongot tu log, alai dang pola di gogohon.',
+'tooltip-pt-logout' => 'Haruar Log',
+'tooltip-ca-talk' => 'Panghataion taringot tu alaman isi',
+'tooltip-ca-edit' => 'Boi do patotaonmu alaman on. Parhaseang tombol pratayang andorang so manimpan.',
+'tooltip-ca-addsection' => 'Mamungka bogas na imbaru',
+'tooltip-ca-viewsource' => 'Alaman on dijaga. Holan haroanna do boi berengon mu',
+'tooltip-ca-history' => 'Parubaan na parpudi di alaman on',
+'tooltip-ca-protect' => 'Hophop alamana on',
+'tooltip-ca-delete' => 'Sesa alaman on',
+'tooltip-ca-move' => 'Pindahon alaman on',
+'tooltip-ca-watch' => 'Tambahon alaman on tu daftar pamberengan hamu',
+'tooltip-ca-unwatch' => 'Sesa alaman on sian daftar na diparrohahon',
+'tooltip-search' => 'lului di bagasan wiki on',
+'tooltip-search-go' => 'Diori alaman na marnampunahon goar na tangkas molo adong',
+'tooltip-search-fulltext' => 'diori alaman na margurithon songonon',
+'tooltip-p-logo' => 'Duloi pogu ni alaman',
+'tooltip-n-mainpage' => 'Duloi pogu ni alaman',
+'tooltip-n-mainpage-description' => 'Duloi pogu ni alaman',
+'tooltip-n-portal' => 'Taringot tu ulaon, aha na boi ulaonmu,ima namandiori na adong',
+'tooltip-n-currentevents' => 'Dapoti informasi taringot tu na masa nuaeng',
+'tooltip-n-recentchanges' => 'Angka parubaan na imbaru di wiki',
+'tooltip-n-randompage' => 'Patudu Alaman na Asing',
+'tooltip-n-help' => 'Inganan mandiori alus',
+'tooltip-t-whatlinkshere' => 'Daftar ni sude alaman  wiki na marnampunahon pangait tu alaman on',
+'tooltip-t-recentchangeslinked' => 'Angka parubaan ni alaman na imbaru na marpangait tu alaman on',
+'tooltip-feed-atom' => 'Pele Atom hu alaman on',
+'tooltip-t-contributions' => 'Daftar ni tumpak ni pamarhaseang on',
+'tooltip-t-emailuser' => 'Tongoshon sada surel tu pamarhaseang on',
+'tooltip-t-upload' => 'Tambahaon angka berkas',
+'tooltip-t-specialpages' => 'Sude Alaman na Istimewa',
+'tooltip-t-permalink' => 'Pangait na togu tu parubaan ni alaman on',
+'tooltip-ca-nstab-main' => 'Dulo alaman isi',
+'tooltip-ca-nstab-user' => 'Bereng alaman ni pamarhaseang',
+'tooltip-ca-nstab-special' => 'On alaman na marhasurungan, ndang boi dipatota',
+'tooltip-ca-nstab-project' => 'Bereng alaman proyek',
+'tooltip-ca-nstab-image' => 'Bereng alaman berkas',
+'tooltip-ca-nstab-template' => 'Ida templat',
+'tooltip-ca-nstab-category' => 'Bereng alaman horong',
+'tooltip-minoredit' => 'Tandai on songon sada panotaan na metmet',
+'tooltip-save' => 'Simpan parubaan mu',
+'tooltip-preview' => 'Parrohahon parubaan mu, parhaseang on andorang so manimpan',
+'tooltip-diff' => 'Bereng parubaan na binahenmu tu siguraton',
+'tooltip-compareselectedversions' => 'Bereng aha ubana sian na dua ragam ni alaman na dipillit.',
+'tooltip-watch' => 'Tambahon alaman on tu daftar na diparrohahonmu',
+'tooltip-summary' => 'Pamasuk ringkasan pendek',
+
+# Browsing diffs
+'previousdiff' => '← Panotaan na salpu',
+'nextdiff' => 'Parubaan na imbaru →',
+
+# Media information
+'file-info-size' => '$1 × $2 piksel, balga ni berkas: $3, rumang na MIME: $4',
+'file-nohires' => 'Ndang adong resolusi natumimbo.',
+'svg-long-desc' => 'Berkas SVG, nominal $1 × $2 piksel, balga ni berkas: $3',
+'show-big-image' => 'Resolusi na umbalga',
+
+# Special:NewFiles
+'noimages' => 'Ndang adong na ni ida',
+'ilsubmit' => 'Diori',
+
+# Bad image list
+'bad_image_list' => 'Songon on ma rumangna:
+
+Holan daftar (baris na dimulai dohot tanda *) na masuk etongan. Pangait na parjolo di sada-sada baris ikkon do gabe pangait tu berkas na buruk. Pangait na manghihut di nasabaris i dietong do i pulik,ima alaman na patuduhon berkas i.',
+
+# Metadata
+'metadata' => 'Metadata',
+'metadata-help' => 'Berkas on marnampunahon informasi na asing, olo do sian kamera digital manang sian ula-ula na asing. Molo nungga dipauneune berkas on, hatoranganna olo do ndang apala toho songon informasi siang gombaran naung dipauneune on.',
+'metadata-fields' => 'Angka bidang metadata gombar na dipajojor di bagasan tona on naeng dipamasuk di hataridaan ni alaman gombar tingki tabel metadata dipametmet. Data na asing gabe dibunihon songon naung ditontuhon.
+ * make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
+# Exif tags
+'exif-imagewidth' => 'Bolak',
+'exif-imagelength' => 'Timbo',
+
+# External editor support
+'edit-externally' => 'Patota berkas on mamarhaseanghon ulaula parduru',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'Sasude',
+'namespacesall' => 'sude',
+'monthsall' => 'Sasude',
+
+# Watchlist editing tools
+'watchlisttools-edit' => 'Pataridahon jala patota daftar siparrohahonon',
+
+# Special:SpecialPages
+'specialpages' => 'Alaman na marhasurungan',
+
+# Special:Tags
+'tag-filter' => 'Saringan [[Special:Tags|tag]]:',
+
+);
index 2a6074c..b4747a5 100644 (file)
@@ -171,8 +171,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'منی ایمیل پیش دار ته ایمیل أن هوژاری',
 'tog-shownumberswatching' => 'پیش دار تعداد کاربرانی که چارگتن',
 'tog-fancysig' => 'امضاءَ په داب ویکی متنی بزان(بی اتوماتیکی لینک)',
-'tog-externaleditor' => 'به طور پیش فرض اصلاح کنوک حارجی استفاده کن',
-'tog-externaldiff' => 'به طور پیش فرض چه حارجی تمایز استفاده کن',
 'tog-showjumplinks' => 'فعال کن "jump to" لینکان دست رسی آ',
 'tog-uselivepreview' => 'چه زنده این بازبین استفاده کن(جاوا)(تجربی)',
 'tog-forceeditsummary' => 'من آ هال دی وهدی وارد کتن یک هالیکین خلاصه ی اصلاح',
@@ -1001,14 +999,6 @@ $1",
 شما نونیت بگردیت چه طرق گوگل هم زمان.
 توجه که اندیکس آن {{SITENAME}} محتوا شاید تاریح گوستگین بنت.',
 
-# Quickbar
-'qbsettings' => 'میله سریع',
-'qbsettings-none' => 'هچ یک',
-'qbsettings-fixedleft' => 'چپ ثابت',
-'qbsettings-fixedright' => 'راست ثابت',
-'qbsettings-floatingleft' => 'چپ شناور',
-'qbsettings-floatingright' => 'راست شناور',
-
 # Preferences page
 'preferences' => 'ترجیحات',
 'mypreferences' => 'منی ترجیحات',
@@ -1767,8 +1757,8 @@ PICT # misc.
 'notvisiblerev' => 'بازبینی حذف بوتت',
 'watchnochange' => 'هچ یک چه شمی چارتگین آیتم اصلاح نه بوتت ته ای دوره زمانی که پیش دارگ بیت.',
 'watchlist-details' => '{{PLURAL:$1|$1 صفحه|$1 صفحات}} چارتگ بیت صفحات گپ حساب نه بیگن',
-'wlheader-enotif' => 'اخطار ایمیل فعالنت.',
-'wlheader-showupdated' => "صفحات که عوض بوتگنت چه شمی آهری چارتن '''پررنگ''' پیش دراگ بنت.",
+'wlheader-enotif' => 'اخطار ایمیل فعالنت.',
+'wlheader-showupdated' => "صفحات که عوض بوتگنت چه شمی آهری چارتن '''پررنگ''' پیش دراگ بنت.",
 'watchmethod-recent' => 'کنترل نوکین اصلاحات په صفحاتی که چارگ بنت',
 'watchmethod-list' => 'کنترل صفحاتی که چارگ بنت په نوکین اصلاحات',
 'watchlistcontains' => 'شمی لیست چارگ شامل  $1 {{PLURAL:$1|صفحه|صفحات}}.',
@@ -2409,13 +2399,8 @@ $1',
 'spam_blanking' => 'کل بازبینی آن شامل لینکان په $1, بوتت  هالیکی',
 
 # Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'نوستالجیک',
 'skinname-cologneblue' => 'نیلی کولاجن',
 'skinname-monobook' => 'منوبوک',
-'skinname-myskin' => 'منی جلد',
-'skinname-chick' => 'شیک',
-'skinname-simple' => 'ساده',
 'skinname-modern' => 'مدرن',
 
 # Patrolling
@@ -2486,8 +2471,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'هانس',
@@ -2544,7 +2527,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'پهنات',
 'exif-imagelength' => 'بلندی',
 'exif-bitspersample' => 'بیت ته جز',
@@ -2660,7 +2643,7 @@ Variants for Chinese language
 'exif-gpsdatestamp' => 'تاریح جی پی اس',
 'exif-gpsdifferential' => 'اصلاح متفاوت جی پی اس',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'کمپرس نه بوتت',
 'exif-compression-6' => 'جیی پی ای جی',
 
@@ -3038,13 +3021,6 @@ $5
 'version-software-product' => 'محصول',
 'version-software-version' => 'نسخه',
 
-# Special:FilePath
-'filepath' => 'مسیر فایل',
-'filepath-page' => 'فایل:',
-'filepath-submit' => 'مسیر',
-'filepath-summary' => 'ای حاصین صفحه مسیر کامل په یک فایل پیش داریت.
-تصاویر گون وضوح کامل پیش دارگ بنت و دگه نوع فایلان گون وتی برنامه یانش مستقیما پچ بنت.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'گردگ په کپی  فایلان',
 'fileduplicatesearch-summary' => 'گردگ په کپی فایلان په اساس درهمین ارزش.',
index 35d80f0..9d4f761 100644 (file)
@@ -126,10 +126,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ihayag an numero kan nagbabantay na mga parágamit',
 'tog-oldsig' => 'Tugmadong pirma',
 'tog-fancysig' => 'Trataron an pirma na wiki-teksto (mayo nin awtomatikong kilyaw)',
-'tog-externaleditor' => 'Gamiton an pirmihan na panluwas na editor (para sa mga eksperto sana, minakaipo nin espesyal na mga panuytoy sa saimong kompyuter.
-[//www.mediawiki.org/wiki/Manual:External_editors Mga dagdag na impormasyon.])',
-'tog-externaldiff' => 'Gamíta an panluwas na diff nguna (para sa mga eksperto sana, minakaipo nin espesyal na mga panuytoy (settings) sa saimong kompyuter.
-[//www.mediawiki.org/wiki/Manual:External_editors Kadagdagang impormasyon.])',
 'tog-showjumplinks' => 'Paganaha an "luksó sa" kilyaw nin kalangkayan',
 'tog-uselivepreview' => 'Gamíta an buhay na patànaw (minakaipo nin JavaScript) (eksperimental)',
 'tog-forceeditsummary' => 'Ibunyaw sako kun maglalaog sa blangkong kalanyang nin paghirá',
@@ -143,6 +139,7 @@ $messages = array(
 'tog-diffonly' => 'Dai tabi ihayag an laog kan pahina sa ibaba nin mga diffs',
 'tog-showhiddencats' => 'Ihayag an nakatagong mga kategorya',
 'tog-norollbackdiff' => 'Omidohon an diff matapos himoon an pagbalikot',
+'tog-useeditwarning' => 'Patanidan ako kunsoarin na ako nagbaya sa pahinang pigliliwat na dae naitatagama an mga kaliwatan',
 
 'underline-always' => 'Pirmi',
 'underline-never' => 'Nungka',
@@ -206,6 +203,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nob',
 'dec' => 'Des',
+'january-date' => 'Enero $1',
+'february-date' => 'Pebrero $1',
+'march-date' => 'Marso $1',
+'april-date' => 'Abril $1',
+'may-date' => 'Mayo $1',
+'june-date' => 'Hunyo $1',
+'july-date' => 'Hulyo $1',
+'august-date' => 'Agosto $1',
+'september-date' => 'Septiyembre $1',
+'october-date' => 'Oktubre $1',
+'november-date' => 'Nobyembre $1',
+'december-date' => 'Disyembre $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorya|Mga kategorya}}',
@@ -514,9 +523,18 @@ Giromdoma na an ibang mga pahina mapuwedeng padagos na magpapahiling siring baga
 'welcomecreation-msg' => 'An saimong panindog pinagmukna na.
 Dae malingaw na liwaton an saimong [[Special:Preferences|{{SITENAME}} mga kamuyahan]].',
 'yourname' => 'Pangaran kan paragamit:',
+'userlogin-yourname' => 'Paragamit-na-Ngaran',
+'userlogin-yourname-ph' => 'Ikaag an saimong paragamit-na-ngaran',
 'yourpassword' => 'Pasa-taramon:',
+'userlogin-yourpassword' => 'Sikretong panlaog',
+'userlogin-yourpassword-ph' => 'Ikaag an saimong sekretong panlaog',
+'createacct-yourpassword-ph' => 'Ikaag an sekretong panlaog',
 'yourpasswordagain' => 'Pakilaog giraray kan sekretong panlaog:',
+'createacct-yourpasswordagain' => 'Kumpirmaron an sekretong panlaog',
+'createacct-yourpasswordagain-ph' => 'Pakikaag otro an sekretong panlaog',
 'remembermypassword' => 'Giromdoma an sakong paglaog sa kilyaw (browser) na ini (para sa maksimum na $1 {{PLURAL:$1|aldaw|mga aldaw}})',
+'userlogin-remembermypassword' => 'Dagos mo akong giromdomon na nakalaog',
+'userlogin-signwithsecure' => 'Gamiton an seguradong koneksyon',
 'securelogin-stick-https' => 'Magpirmeng konektado sa HTTPS matapos kang maglaog',
 'yourdomainname' => 'An saimong kasakupan:',
 'password-change-forbidden' => 'Ika dae makapagliwat nin sekretong panlaog sa wiking ini.',
@@ -529,18 +547,38 @@ Dae malingaw na liwaton an saimong [[Special:Preferences|{{SITENAME}} mga kamuya
 'logout' => 'Magluwas',
 'userlogout' => 'Magluwás',
 'notloggedin' => 'Dae ka nakalaog',
+'userlogin-noaccount' => 'Mayo ka nin panindog?',
+'userlogin-joinproject' => 'Mag-ayon{{SITENAME}}',
 'nologin' => 'Mayò ka pa nin panindog (account)? $1.',
 'nologinlink' => 'Magmukna nin panindog',
 'createaccount' => 'Magmukna nin panindog',
 'gotaccount' => 'Igwa ka na tabi nin panindog? $1.',
 'gotaccountlink' => 'Maglaog',
 'userlogin-resetlink' => 'Nakalingaw ka sa panlaog mong detalye?',
-'createaccountmail' => 'Sa paagi nin e-koreo',
+'userlogin-resetpassword-link' => 'Pakibaguha an saimong sekretong panlaog',
+'helplogin-url' => 'Help:Paglalaog',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Tabang sa paglalaog]]',
+'createacct-join' => 'Pakikaag an saimong impormasyon sa ibaba.',
+'createacct-emailrequired' => 'Estada kan e-surat',
+'createacct-emailoptional' => 'E-surat na estada (opsyonal)',
+'createacct-email-ph' => 'Pakikaag an saimong e-surat na estada',
+'createaccountmail' => 'Gumamit nin sarong random na temporaryong sekretong panlaog asin ipadara ini sa adres kan e-surat na pinaghaya sa ibaba',
+'createacct-realname' => 'Totoong pangaran (opsyonal)',
 'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => 'Tadaw ta ika magmumukna nin ibang panindog',
+'createacct-captcha' => 'Rikisang panseguridad',
+'createacct-imgcaptcha-ph' => 'Pakikaag an tekstong nahihiling mo sa ibabaw',
+'createacct-submit' => 'Muknaon an saimong panindog',
+'createacct-benefit-heading' => '{{SITENAME}} pinaghimo kan mga tawong siring mo.',
+'createacct-benefit-body1' => '{{PLURAL:$1|niliwat|mga niliwat}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pahina|mga pahina}}',
+'createacct-benefit-body3' => 'pinakahuring {{PLURAL:$1|paraambag|mga paraambag}}',
 'badretype' => 'An mga sekretong panlaog mong pinagtatak bakong pareho.',
 'userexists' => 'Paragamit na ngarang piglaog may naggagamit na.
 Pakipili nin ibang ngaran tabi.',
 'loginerror' => 'An paglaog napasalâ',
+'createacct-error' => 'Kasalaan sa pagmumukna nin panindog',
 'createaccounterror' => 'Dae tabi maimukna an panindog: $1.',
 'nocookiesnew' => 'An panindog kan paragamit namukna na, pero ika dae pa tabi nakalaog.
 {{SITENAME}} naggagamit nin cookies tanganing makalaog an mga paragamit.
@@ -581,8 +619,8 @@ Tabi maglaog giraray matapos mong maresibe ini.',
 'blocked-mailpassword' => 'An saimong IP address pinagkubkob na magliwat, asin kaya dae tinutugutan na gumamit kan pambawi nin sekretong panlaog na punksyon tanganing makalikay sa abuso.',
 'eauthentsent' => 'Sarong e-koreong pankumpirmasyon an ipinadara sa nominadong e-koreong address.
 Bago an ibang e-koreo ipinadara sa panindog, ika igwang pagsunudong na mga instruksyon na yaon sa e-koreo, tanganing kumpirmaron na an panindog tunay talagang saimo.',
-'throttled-mailpassword' => 'Sarong pagiromdom kan sekretong panlaog an ipinadara na, sa laog nin {{PLURAL:$1|hour|$1 hours}}.
-Tangarig malikayan an abuso, saro sanang pagiromdom kan sekretong panlaog an ipinapadara sa lambang {{PLURAL:$1|hour|$1 hours}}.',
+'throttled-mailpassword' => 'Sarong e-surat sa pagliliwat kan sekretong panlaog an ipinadara na, sa laog nin {{PLURAL:$1|hour|$1 hours}}.
+Tangarig malikayan an abuso, saro sanang e-surat sa pagliliwat kan sekretong panlaog an ipinapadara sa lambang {{PLURAL:$1|hour|$1 hours}}.',
 'mailerror' => 'Salâ an pagpadará kan koreo: $1',
 'acct_creation_throttle_hit' => 'Mga bisita kaining wiki na ginagamit an saimong IP address nagmukna nin {{PLURAL:$1|1 panindog|$1 mga panindog}} sa nakaaging aldaw, na iyo ngani an maximum na pinagtutugot sa laog kan peryodong panahon.
 Bilang resulta, an mga bisita na naggagamit kaining IP address dae nguna makakamukna nin mga panindog.',
@@ -628,25 +666,25 @@ Tanganing tapuson an paglalaog, ika kaipong magkaag nin sarong baguhon na sekret
 'resetpass-wrong-oldpass' => 'Saláng temporaryo o presenteng sekretong panlaog.
 Matriumpo mo nang nailaog an sekretong panlaog o nakua an bàgong temporaryong sekretong panlaog.',
 'resetpass-temp-password' => 'Temporaryong sekretong panlaog:',
+'resetpass-abort-generic' => 'Pagliwat kan sikretong panlaog ipinagpauntok kan sarong ekstensyon.',
 
 # Special:PasswordReset
 'passwordreset' => 'Pakibago kan sekretong panlaog',
-'passwordreset-text' => 'Kumpletoha ining porma tanganing makaresibe nin pampagiromdom na e-koreo kan detalye nin saimong panindog.',
 'passwordreset-legend' => 'Pakibago kan sekretong panlaog',
 'passwordreset-disabled' => 'An pagbago kan sekretong panlaog pinagpundo sa wiking ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Pakilaog kan saro sa mga pedaso nin datos sa ibaba}}',
+'passwordreset-emaildisabled' => 'E-surat na mga estima pinag-uruntok sa wiking ini.',
 'passwordreset-username' => 'Paragamit-ngaran:',
 'passwordreset-domain' => 'Kasakupan:',
 'passwordreset-capture' => 'Hilngon an kinaluwasang e-koreo?',
 'passwordreset-capture-help' => 'Kun saimong i-tsek ini box, an e-koreo (na igwang temporaryong sekretong panlaog) ipapahiling saimo siring na ini ipagpapadara sa paragamit.',
 'passwordreset-email' => 'E-koreong address:',
 'passwordreset-emailtitle' => 'Mga detalye kan panindog sa {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'May sarong tawo (pwedeng ika gayod, gikan sa IP address na $1) naghagad nin sarong pagiromdom kan detalye kan saimong panindog para sa {{SITENAME}} ($4). An minasunod na paragamit {{PLURAL:$3|panindog iyo an|mga panindog iyo an}} na asosyado kaining e-koreong address:
+'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:
 
 $2
 
-{{PLURAL:$3|Ining temporaryong sekretong panlaog|Ining mga temporaryong panlaog}} mapapaso sa {{PLURAL:$5|sarong aldaw|$5 mga aldaw}}.
-Ika 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.',
+{{PLURAL:$3|Ining temporaryong sekretong panlaog|Ining mga temporaryong sekretong panlaog}} mapapaso sa laog nin {{PLURAL:$5|sarong aldaw|$5 mga aldaw}}.
+Dapat 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}}
 ($4). An minasunod na paragamit {{PLURAL:$3|panindog iyo an|mga panindog iyo an}} na asosyado kaining e-koreong address:
 
@@ -657,9 +695,9 @@ $2
 Ika 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
 Temporaryong sekretong panlaog: $2',
-'passwordreset-emailsent' => 'Sarong pampagiromdom na e-koreo ipinadara na.',
-'passwordreset-emailsent-capture' => 'Sarong pampagiromdom na e-koreo ipinadara na, ipinapahiling sa may ibaba.',
-'passwordreset-emailerror-capture' => 'Sarong pampagiromdom na e-koreo pinaghimo na, ipinapahiling sa may ibaba, alagad an pagpapadara kaini sa paragamit nagpalya: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Ribayan an e-koreong address',
@@ -834,8 +872,8 @@ Pigpropromesa mo man samuyà na ika an kagsurat kaini, o kinopya mo ini sa domin
 Pigpapangakò mo man samuyà na ika an nagsurat kaini, o pigkopya mo ini sa dominiong panpubliko o sarong parehong libreng rekurso (hilingon an $1 para sa mga detalye). '''DAI TABÌ MAGSUMITIR NIN MGA GIBONG IPINAPANGALAD NA KOPYAHON NIN MAYONG PERMISO!'''",
 'longpageerror' => "'''Ay Sala: An teksto na saimong pinagsumite {{PLURAL:$1|sarong kilobyte|$1 kilobytes}} an laba, mas halaba kesa maksimum na {{PLURAL:$2|sarong kilobyte|$2 kilobytes}}.'''
 Ini dae tabi maitatagama.",
-'readonlywarning' => "'''Patanid tabi: An datos-sarayan nakakandado para sa maintenance, kay ika dae makakapagtagama kan saimong mga pinagriliwat sa ngunyan.'''
-Ika mapuwedeng maikopya an teksto pasiring sa sarong sagunson kan teksto asin para itagama ini sa huri.
+'readonlywarning' => "'''Patanid tabi: An datos-sarayan nakakandado para sa maintenance, kaya ika dae makakapagtagama kan saimong mga pinagriliwat sa ngunyan.'''
+Ika mapuwedeng makakopya asin idukot an saimong teksto pasiring sa sarong sagunson kan teksto asin itagama ini sa bandang huri.
 
 An administrador na iyo an nagkandado kaini naghayag kaining kapaliwanagan: $1",
 'protectedpagewarning' => "'''Patanid tabi: Ining pahina pinagprotektaran tanganing an mga paragamit sana na igwang pribilihiyo bilang administrador an makakapagliwat kaini.'''
@@ -879,6 +917,7 @@ Igwa na kaini.',
 'content-failed-to-parse' => 'Nagpalya sa paglunhay an $2 na laman para sa $1 na modelo: $3',
 'invalid-content-data' => 'Imbalidong datos nin laman',
 'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
+'editwarning-warning' => 'Sa pagbaya kaining pahina magkakausa saimo na mawara an anuman na mga kaliwatan na saimong ginibo. Kun ika maglaog, mapuwede mong untukon ining patanid sa "Pagliliwat" na seksyon kan saimong mga kamuyahan.',
 
 # Content models
 'content-model-wikitext' => 'wiki-teksto',
@@ -1144,7 +1183,7 @@ An mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page
 'search-interwiki-default' => '$1 na mga resulta:',
 'search-interwiki-more' => '(dakol pa)',
 'search-relatedarticle' => 'Kauyon',
-'mwsuggest-disable' => 'Pundohon an AJAX na mga suhestiyon',
+'mwsuggest-disable' => 'Untokon an suhestiyon nin paghahanap',
 'searcheverything-enable' => 'Maghanap sa gabos na mga espasyong-ngaran',
 'searchrelated' => 'kauyon',
 'searchall' => 'gabós',
@@ -1164,15 +1203,7 @@ Prubaran na panigmitan an saimong kahaputan nin ''all:'' sa paghanap kan gabos n
 'powersearch-togglenone' => 'Wara',
 'search-external' => 'Panluwas na paghahanap',
 'searchdisabled' => 'Pigpopogolan mûna an paghanap sa {{SITENAME}}. Mientras tanto, pwede ka man maghanap sa Google. Giromdomon tabî na an mga indise kan laog ninda sa {{SITENAME}} pwede ser na lumâ na.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Mayô',
-'qbsettings-fixedleft' => 'Nakatakód sa walá',
-'qbsettings-fixedright' => 'Nakatakód sa tûo',
-'qbsettings-floatingleft' => 'Naglálatáw sa walá',
-'qbsettings-floatingright' => 'Naglálatáw sa tûo',
-'qbsettings-directionality' => 'Nakadukot, minadepende sa skrip panukdoan kan saimong lengguwahe',
+'search-error' => 'May salang nangyari habang naghahanap:$1',
 
 # Preferences page
 'preferences' => 'Mga kabòtan',
@@ -1317,6 +1348,7 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'userrights-notallowed' => 'An saimong panindog mayo tabi nin permiso na magdagdag o maghale nin karapatan kan mga paragamit.',
 'userrights-changeable-col' => 'Mga grupo na mapuwede mong baguhon',
 'userrights-unchangeable-col' => 'Mga grupo na dae mo mapuwedeng baguhon',
+'userrights-conflict' => 'Kumplikto sa katanosan nin paragamit! Pakigibo giraray kan saimong mga kaliwatan.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1719,7 +1751,6 @@ Para sa pinakamakusog na seguridad, img_auth.php nganay pinagpundo.',
 'http-read-error' => 'HTTP na pagbabasa nasasala.',
 'http-timed-out' => 'HTTP na kahagadan naubos na an oras.',
 'http-curl-error' => 'An kasalaan nagsusungko sa kilyawan: $1',
-'http-host-unreachable' => 'Dae nakakaabot sa kilyawan.',
 'http-bad-status' => 'Igwa nin sarong problema habang yaon sa HTTP na kahagadan: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1874,6 +1905,12 @@ Giromdoma baya na mag-tsek para sa iba pang kasugpon sa mga templato bago mo pag
 Sinda mapuwedeng makipagsugpon pasiring sa sarong mas manigong pahina nanggad.<br />
 An sarong pahina tratado bilang pampalinaw na pahina kun ini minagamit nin sarong templato na nakasugpon gikan sa [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Mga pahina na igwang pahina nin kagrugaring',
+'pageswithprop-legend' => 'Mga pahina na igwang pahina nin kagrugaring',
+'pageswithprop-text' => 'Ining mahina naglilista kan mga pahina na minagamit nin partikular na pahina nin kagrugaring.',
+'pageswithprop-prop' => 'Kagrugaring na pangaran:',
+'pageswithprop-submit' => 'Larga',
+
 'doubleredirects' => 'Dobleng mga redirekta',
 'doubleredirectstext' => 'Ining pahina minalista nin mga pahina na minatukdo liwat pasiring sa pinagtukdong-liwat na mga pahina.
 Kada palunpon igwang laog na minasugpon pasiring sa enot asin ikaduwang pagtukdo-liwat, siring man sa target kan ikaduwang pagtukdo-liwat, na pirme nanggad an "tunay" na pahinang target, na an enot na pagtukdong-liwat dapat na iyo an pagtutukdoon.
@@ -2040,7 +2077,7 @@ Suportadong {{PLURAL:$2|protokol|mga protokol}}: <code>$1</code> (defaults to ht
 # Special:ActiveUsers
 'activeusers' => 'Listahan kan aktibong paragamit',
 'activeusers-intro' => 'Iyo in an listahan kan mga paragamit na nagkaigwa nin mga ginibo sa laog kan nakaaging $1 {{PLURAL:$1|aldaw|mga aldaw}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|pigliwat|mga pigliwat}} sa nakaaging {{PLURAL:$3|aldaw|$3 mga aldaw}}',
+'activeusers-count' => '$1 {{PLURAL:$1|aksyon|mga aksyon}} sa nakaaging {{PLURAL:$3|aldaw|$3 mga aldaw}}',
 'activeusers-from' => 'Ipahiling an mga paragamit magpoon sa:',
 'activeusers-hidebots' => 'Itago an mga panalnga',
 'activeusers-hidesysops' => 'Itago an mga administrador',
@@ -2105,7 +2142,7 @@ An e-surat na estada sa saimong pinaglaog sa [[Special:Preferences|saimong parag
 'usermessage-editor' => 'Pansistemang mensahero',
 
 # Watchlist
-'watchlist' => 'Pigbabantayan ko',
+'watchlist' => 'Bantay-listahan',
 'mywatchlist' => 'Bantay-listahan',
 'watchlistfor2' => 'Para ki $1 $2',
 'nowatchlist' => 'Mayo ka man na mga bagay saimong lista nin pigbabantayan.',
@@ -2125,8 +2162,8 @@ An maabot na mga pagbabâgo sa páhinang ini asin sa asosyadong páhina nin olay
 'notvisiblerev' => 'An huring rebisyon kan ibang paragamit pinagpura na',
 'watchnochange' => 'Mayo sa saimong mga pigbabantayan an nahira sa laog nin pinahiling na pagkalawig.',
 'watchlist-details' => '{{PLURAL:$1|$1 pahina|$1 mga pahina}} sa saimong bantay-listahan, dae binibilang an mga pahina nin orolayan.',
-'wlheader-enotif' => "* Nakaandar an paising ''e''-surat.",
-'wlheader-showupdated' => "* An mga páhinang pigbâgo poon kan huri mong bisita nakasurat nin '''mahîbog'''",
+'wlheader-enotif' => 'E-surat na paisi pinagpaandar na.',
+'wlheader-showupdated' => "Mga pahina na pinagriliwat poon kaidtong huri kang nagbisita sainda ipinapatanaw na '''mahîbog'''",
 'watchmethod-recent' => 'Pigsososog an mga kaaagi pa sanang hirá sa mga pigbabantayan na páhina',
 'watchmethod-list' => 'Pigsososog an mga pigbabantayan na páhina para mahiling an mga kaaagi pa sanan paghirá',
 'watchlistcontains' => 'An saimong lista nin pigbabantayan igwang $1 na {{PLURAL:$1|páhina|mga páhina}}.',
@@ -2540,6 +2577,7 @@ Ini, baya, pinagkubkob bilang parte kan hidwas $2, na mapuwedeng daemakukubkob.'
 'sorbsreason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa lang kan DNSBL na ginagamit kan {{SITENAME}}.',
 'sorbs_create_account_reason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa laog kan DNSBL na ginagamit kan {{SITENAME}}.
 Ika dae makakamukna nin sarong panindog.',
+'xffblockreason' => 'An yaong IP adres sa laog nin X-Pinagtulod-Para sa kapamayuhan, dawa saimo o idtong proksing serbidor na saimong ginagamit, pinagkubkob. An orihinal na rason sa pagkubkob iyo na:$1',
 'cant-block-while-blocked' => 'Ika dae makakakubkob kan ibang mga paragamit mantang ika nakukubkob pa.',
 'cant-see-hidden-user' => 'An paragamit na pinagpubaran mong kubkubon pinagkubkob asin pinagtago na. Mala ta ika mayo nin karapatan na magtago nin paragamit, ika dae makakahiling or makakaliwat kan kinubkob na paragamit.',
 'ipbblocked' => 'Ika da makakakubkob or maghale nin kubkob sa ibang mga paragamit, nin huli ta ika mismo sa sadiri mo pinagkubkob na',
@@ -2567,13 +2605,14 @@ Ika dae makakamukna nin sarong panindog.',
 # Move page
 'move-page' => 'Ibalyo an $1',
 'move-page-legend' => 'Ibalyó an páhina',
-'movepagetext' => "Sa paggagamit kan porma na yaon sa ibaba mariribayan nin pangaran an sarong pahina, maibabalyo an gabos kaining historiya pasiring sa baguhon na titulo.
-Ika makakapagsumpay kan mga panlikwat na magtutukdo awtomatiko pasiring sa orihinal na titulo.
-Kun saimong pinili na dae, seguraduhon na ma-tsek para sa [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|nabaak namga panlikwat]].
-Ika an responsable para himoong segurado na an mga kilyaw padagos na minatukdo kun saen sinda dapat na magduman.
+'movepagetext' => "Sa paggagamit kan porma na yaon sa ibaba mariribayan nin pangaran an sarong pahina, maibabalyo an gabos kaining historiya pasiring sa baguhong pangaran.
+An lumang titulo magigin sarong panlikwat na pahina sa baguhong titulo.
+Ika makakapagsumpay kan mga panlikwat na magtutukdong awtomatiko pasiring sa orihinal na titulo.
+Kun saimong pinili na dae, seguraduhon na marikisa para sa [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|nabaak na mga panlikwat]].
+Ika an responsable para himoong segurado na an mga kasugpon padagos na minatukdo kun saen sinda dapat na magduman.
 
 Giromdoma 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.
-Ini minapasabot na ika makakapagliwat nin pangaran nin sarong pahina pabalik sa kun saen ini pinagliwatan nin pangaran kun ika nakahimo nin kasalaan, asin ika dae makakasalambaw nin sarong eksistido nang pahina.
+Ini 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.
 
 '''Patanid!'''
 Ini 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.",
@@ -2697,6 +2736,8 @@ Pakibisita an [//www.mediawiki.org/wiki/Localisation Mediawiki Lokalisasyon] asi
 'thumbnail-more' => 'Padakuláon',
 'filemissing' => "Nawawarâ an ''file''",
 'thumbnail_error' => 'Error sa paggigibo kan retratito: $1',
+'thumbnail_error_remote' => 'Mensahe nin kasalaan gikan sa $1: 
+$2',
 'djvu_page_error' => 'luwas sa serye an páhina kan DjVu',
 'djvu_no_xml' => 'Dai makua an XML para sa DjVu file',
 'thumbnail-temp-create' => 'Dae nakamukna nin temporaryong sagunson kan retrato',
@@ -2897,6 +2938,7 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
 'pageinfo-robot-noindex' => 'Dae maihuhukdo',
 'pageinfo-views' => 'Numero kan mga patanaw',
 'pageinfo-watchers' => 'Numero kan parabantay nin pahina',
+'pageinfo-few-watchers' => 'Kadikiton kesa $1{{PLURAL:$1|parabantay|mga parabantay}}',
 'pageinfo-redirects-name' => 'Maipalikwat pasiring sa pahina ini',
 'pageinfo-subpages-name' => 'Mga sub-pahina kaining pahina',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|panlikwat|mga panlikwat}}; $3 {{PLURAL:$3|bakong panlikwat|bakong mga panlikwat}})',
@@ -2926,8 +2968,6 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
 'pageinfo-category-files' => 'Bilang nin mga sagunson',
 
 # Skin names
-'skinname-standard' => 'Klasiko',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Bago',
 
 # Patrolling
@@ -3005,11 +3045,25 @@ Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 oras|$1 oras}}',
 'days' => '{{PLURAL:$1|$1 aldaw|$1 mga aldaw}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 mga semana}}',
 'months' => '{{PLURAL:$1|$1 bulan|$1 mga bulan}}',
 'years' => '{{PLURAL:$1|$1 taon|$1 mga taon}}',
 'ago' => '$1 nakaagi',
 'just-now' => 'ngunyan sana',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|oras|mga oras}} na nakaagi pa sana',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minutos}} na nakaagi pa sana',
+'seconds-ago' => '$1 {{PLURAL:$1|segundo|mga segundo}} na nakaagi pa sana',
+'monday-at' => 'Lunes mga $1',
+'tuesday-at' => 'Martes mga $1',
+'wednesday-at' => 'Miyerkules mga $1',
+'thursday-at' => 'Huwebes mga $1',
+'friday-at' => 'Biyernes mga $1',
+'saturday-at' => 'Sabado mga $1',
+'sunday-at' => 'Domingo mga $1',
+'yesterday-at' => 'Kasuodma mga $1',
+
 # Bad image list
 'bad_image_list' => 'An pormat iyo ining minasunod:
 
@@ -3039,7 +3093,7 @@ An mga iba pagtatagoon sa paagi nin pirmehan.
 * gpspalaba
 * gpspalangkaw',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lakbáng',
 'exif-imagelength' => 'Langkáw',
 'exif-bitspersample' => 'Panaradit kada komponente',
@@ -3218,7 +3272,7 @@ Sublokas kan siyudad na ipinahiling',
 'exif-originalimageheight' => 'Langkaw kan imahe bago ini pinagkrap',
 'exif-originalimagewidth' => 'Lakbang kan imahe bago ini pinagkrap',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Pinaghalugaan',
 'exif-compression-2' => 'CCITT Grupong 3 1-Dimensyonal na pagbabago ni Huffman nagdadalagan nin halawig na pag-enkod',
 'exif-compression-3' => 'CCITT Grupong 3 pinag-enkod sa fax',
@@ -3631,12 +3685,17 @@ Ika dapat na nakapagresibe na kan [{{SERVER}}{{SCRIPTPATH}}/COPYING sarong kopya
 'version-entrypoints-header-entrypoint' => 'Puntong pan-entrada',
 'version-entrypoints-header-url' => 'Kilyawan',
 
-# Special:FilePath
-'filepath' => 'Pansagunsong agihan',
-'filepath-page' => 'Sagunson:',
-'filepath-submit' => 'Magduman',
-'filepath-summary' => 'Ining espesyal na pahina minapabalik kan kumpletong agihan para sa sarong sagunson.
-Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunson pinagpapoon nin direkta kan saindang asosyadong programa.',
+# Special:Redirect
+'redirect' => 'Palikwatong sa paagi nin sagunson, paragamit, or rebisyon kan ID',
+'redirect-legend' => 'Palikwatong pasiring sa sarong sagunson o pahina',
+'redirect-summary' => 'Ining espesyal na pahina minalikwat pasiring sa sarong sagunson (ipinagtao an ngaran kan sagunson), sarong pahina (ipinagtao an sarong rebisyon kan ID), o sarong pahina nin paragamit (ipinagtao an numerikong ID nin paragamit).',
+'redirect-submit' => 'Dumani',
+'redirect-lookup' => 'Hanapon mo',
+'redirect-value' => 'Halaga:',
+'redirect-user' => 'ID nin Paragamit',
+'redirect-revision' => 'Rebisyon kan Pahina',
+'redirect-file' => 'Ngaran nin Sagunson',
+'redirect-not-exists' => 'Halaga dae nanagboan',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Maghanap kan duplikadong mga sagunson',
@@ -3663,7 +3722,7 @@ Mga imahe ipinapahiling sa bilog na resolusyon, an iba pang tipo nin mga sagunso
 'specialpages-group-highuse' => 'Halangkawong gamit na mga pahina',
 'specialpages-group-pages' => 'Mga listahan kan mga pahina',
 'specialpages-group-pagetools' => 'Mga kagamitan sa pahina',
-'specialpages-group-wiki' => 'Wiking datos asin mga kagamitan',
+'specialpages-group-wiki' => 'Datos asin mga palindô',
 'specialpages-group-redirects' => 'Panukdo sa espesyal na mga pahina',
 'specialpages-group-spam' => 'Pan-spam na mga kagamitan',
 
@@ -3727,23 +3786,26 @@ Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.',
 'htmlform-submit' => 'Sumitiron',
 'htmlform-reset' => 'Dae idagos an mga kaliwatan',
 'htmlform-selectorother-other' => 'An iba',
+'htmlform-no' => 'Habó',
+'htmlform-yes' => 'Iyo',
+'htmlform-chosen-placeholder' => 'Magpili nin sarong opsyon',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 na igwang suporta sa kabilogang-teksto nin paghahanap',
 'sqlite-no-fts' => '$1 na mayong suporta sa kabilogang-teksto nin paghahanap',
 
 # New logging system
-'logentry-delete-delete' => '$1 pinagpurang pahina $3',
-'logentry-delete-restore' => '$1 pinagbalik na pahina $3',
-'logentry-delete-event' => '$1 pinagliwat an bisibilidad kan {{PLURAL:$5|sarong talaan nin pangyayari|%5 talaan nin mga pangyayari}} kan $3: $4',
-'logentry-delete-revision' => '$1 pinagliwat an bisibilidad kan {{PLURAL:$5|sarong rebisyon|$5 na mga rebisyon}} na yaon sa pahina $3: $4',
-'logentry-delete-event-legacy' => '$1 pinagliwat an bisibilidad kan talaan nin mga pangyayari sa $3',
-'logentry-delete-revision-legacy' => '$1 pinagliwat an bisibilidad kan mga rebisyon sa pahina $3',
-'logentry-suppress-delete' => '$1 pinaglubog na pahina $3',
-'logentry-suppress-event' => '$1 pasikretong pinagliwat an bisibilidad kan {{PLURAL:$5|talaan nin pangyayari|$5 mga talaan nin pangyayari}} sa $3: $4',
-'logentry-suppress-revision' => '$1 pasikretong pinagliwat an bisibilidad kan {{PLURAL:$5|rebisyon|$5 mga rebisyon}} sa pahina $3: $4',
-'logentry-suppress-event-legacy' => '$1 pasikretong pinagliwat an bisibilidad kan talaan nin mga pangyayari sa $3',
-'logentry-suppress-revision-legacy' => '$1 pasikretong pinagliwat an bisibilidad kan mga rebisyon sa pahina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|pinagpura na}} pahina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|pinagbalik}} na pahina $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|pinagliwat}}an bisibilidad kan {{PLURAL:$5|sarong talaan nin pangyayari|$5 talaan nin mga pangyayari}} kan $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|pinagliwat}} an bisibilidad kan {{PLURAL:$5|sarong rebisyon|$5 na mga rebisyon}} na yaon sa pahina $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|pinagliwat}} an bisibilidad kan talaan nin mga pangyayari sa $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|pinagliwat}} an bisibilidad kan mga rebisyon sa pahina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|pinaglubog}} na pahina $3',
+'logentry-suppress-event' => '$1 pasikretong {{GENDER:$2|pinagliwat}} an bisibilidad kan {{PLURAL:$5|talaan nin pangyayari|$5 mga talaan nin pangyayari}} sa $3: $4',
+'logentry-suppress-revision' => '$1 pasikretong {{GENDER:$2|pinagliwat}} an bisibilidad kan {{PLURAL:$5|rebisyon|$5 mga rebisyon}} sa pahina $3: $4',
+'logentry-suppress-event-legacy' => '$1 pasikretong {{GENDER:$2|pinagliwat}} an bisibilidad kan talaan nin mga pangyayari sa $3',
+'logentry-suppress-revision-legacy' => '$1 pasikretong {{GENDER:$2|pinagliwat}} an bisibilidad kan mga rebisyon sa pahina $3',
 'revdelete-content-hid' => 'an laog pinagtago',
 'revdelete-summary-hid' => 'Sumaryo nin pagliwat itinago',
 'revdelete-uname-hid' => 'pangaran nin paragamit itinago',
@@ -3752,19 +3814,20 @@ Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.',
 'revdelete-uname-unhid' => 'pangaran nin paragamit ipinaghaya',
 'revdelete-restricted' => 'Pinag-aplikar an mga restriksyon sa mga administrador',
 'revdelete-unrestricted' => 'Pinaghale an mga restriksyon para sa mga administrador',
-'logentry-move-move' => '$1 pinagbalyo an pahina $3 paduman sa $4',
-'logentry-move-move-noredirect' => 'S1 pinagbalyo an pahina $3 paduman sa $4 na mayong iwinalat na panlikwat',
-'logentry-move-move_redir' => '$1 pinagbalyo an pahina $3 paduman sa $4 sa paagi kan panlikwat',
-'logentry-move-move_redir-noredirect' => '$1 pinagbalyo an pahina $3 paduman sa $4 sa paagi kan panlikwat na mayong iwinawalat na sarong panlikwat',
-'logentry-patrol-patrol' => '$1 pinagmarkahan an rebisyon $4 kan pahina $3 na patrolyado',
-'logentry-patrol-patrol-auto' => '$1 awtomatikong pinagmarkahan an rebisyonn $4 kan pahina $3 na patrolyado',
-'logentry-newusers-newusers' => 'An paragamit na panindog $1 pinagmukna na',
-'logentry-newusers-create' => 'An paragamit na panindog $1 pinagmukna na',
-'logentry-newusers-create2' => 'An paragamit na panindog $3 pinagmukna na ni $1',
-'logentry-newusers-autocreate' => 'An paragamit na panindog $1 awtomatikong pinagmukna na',
-'logentry-rights-rights' => '$1 nagliwat kan pangrupong pagkamiyembro para sa $3 gikan sa $4 pasiring sa $5',
-'logentry-rights-rights-legacy' => '$1 nagliwat kan pangrupong pagkamiyembro para sa $3',
-'logentry-rights-autopromote' => '$1 awtomatikong pinagpalangkaw gikan sa $4 pasiring sa $5',
+'logentry-move-move' => '$1 {{GENDER:$2|pinagbalyo}} an pahina $3 pasiring sa $4',
+'logentry-move-move-noredirect' => 'S1 {{GENDER:$2|pinagbalyo}} an pahina $3 pasiring sa $4 na dae iwinalat an sarong panlikwat',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|pinagbalyo}} an pahina $3 pasiring sa $4 sa paagi kan panlikwat',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|pinagbalyo}} an pahina $3 pasiring sa $4 sa paagi kan panlikwat na dae iwinawalat na sarong panlikwat',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|pinagmarkahan}} an rebisyon $4 kan pahina $3 na patrolyado',
+'logentry-patrol-patrol-auto' => '$1 awtomatikong {{GENDER:$2|pinagmarkahan}} an rebisyon $4 kan pahina $3 na patrolyado',
+'logentry-newusers-newusers' => 'An panindog kan paragamit $1 {{GENDER:$2|pinagmukna}} na',
+'logentry-newusers-create' => 'An panindog kan paragamit $1 {{GENDER:$2|pinagmukna}} na',
+'logentry-newusers-create2' => 'An panindog kan paragamit $3 {{GENDER:$2|pinagmukna}} na ni $1',
+'logentry-newusers-byemail' => 'An panindog kan paragamit $3 {{GENDER:$2|pinagmukna}} ni $1 asin an sekretong panlaog ipinadara na sa paagi nin e-surat',
+'logentry-newusers-autocreate' => 'An panindong kan paragamit $1 awtomatikong {{GENDER:$2|pinagmukna}} na',
+'logentry-rights-rights' => '$1 {{GENDER:$2|pinagliwat}} kan pangrupong pagkamiyembro para sa $3 gikan sa $4 pasiring sa $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|nagliwat}} kan pangrupong pagkamiyembro para sa $3',
+'logentry-rights-autopromote' => '$1 awtomatikong {{GENDER:$2|pinagpalangkaw}} gikan sa $4 pasiring sa $5',
 'rightsnone' => '(mayô)',
 
 # Feedback
@@ -3819,6 +3882,7 @@ Kun bako man, ika makakagamit nin sayon na porma sa ibaba. An saimong komento id
 'api-error-ok-but-empty' => 'Panlaog na kasalaan: Mayong simbag gikan sa serbidor.',
 'api-error-overwrite' => 'An salambawan na sarong eksistido nang sagunson dae pinagtutugutan.',
 'api-error-stashfailed' => 'Panlaog na kasalaan: An serbidor nagpalya sa pagsaray kan temporaryong sagunson.',
+'api-error-publishfailed' => 'Panlaog na kasalaan: An serbidor nagpalya na ipublikar an temporaryong sagunson.',
 'api-error-timeout' => 'An serbidor dae nakapagsimbag sa laog kan pinaghunang panahon.',
 'api-error-unclassified' => 'May dae midbid na kasalaan an nangyari.',
 'api-error-unknown-code' => 'Dae midbid na kasalaan: "$1".',
@@ -3839,4 +3903,7 @@ Kun bako man, ika makakagamit nin sayon na porma sa ibaba. An saimong komento id
 'duration-centuries' => '$1 {{PLURAL:$1|siglo|mga siglo}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenyo|mga millenyo}}',
 
+# Image rotation
+'rotate-comment' => 'An imahe pinagbirik ni $1 {{PLURAL:$1|grado|mga grado}} hitsado',
+
 );
index ec98157..1ba82be 100644 (file)
@@ -119,8 +119,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Паказваць колькасць назіральнікаў',
 'tog-oldsig' => 'Існуючы подпіс:',
 'tog-fancysig' => 'Апрацоўваць подпіс як вікі-тэкст (без аўтаматычнай спасылкі)',
-'tog-externaleditor' => "Карыстацца вонкавай праграмай для праўкі (edit); рэкамендуецца толькі для спецыялістаў, бо патрабуе адмысловых настаўленняў на камп'ютары; [//www.mediawiki.org/wiki/Manual:External_editors гл. падрабязна.]",
-'tog-externaldiff' => "Карыстацца вонкавай праграмай для параўнання (diff); рэкамендуецца толькі для спецыялістаў, бо патрабуе адмысловых настаўленняў на камп'ютары; [//www.mediawiki.org/wiki/Manual:External_editors гл. падрабязна.]",
 'tog-showjumplinks' => 'Дазволіць дапаможныя спасылкі "jump to"',
 'tog-uselivepreview' => 'Жывы перадпаказ (Яваскрыпт, эксперыментальн.)',
 'tog-forceeditsummary' => 'Папярэджваць пра пустое поле тлумачэння праўкі',
@@ -134,6 +132,7 @@ $messages = array(
 'tog-diffonly' => 'Не паказваць рэшты старонкі пад розніцай',
 'tog-showhiddencats' => 'Паказаць схаваныя катэгорыі',
 'tog-norollbackdiff' => 'Не паказваць розніцу ў выніку адкату',
+'tog-useeditwarning' => 'Папярэдзіць мяне, калі я пакідаю старонку з незахаванымі праўкамі',
 
 'underline-always' => 'Заўсёды',
 'underline-never' => 'Ніколі',
@@ -588,10 +587,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Выслаць мне новы пароль',
-'passwordreset-text' => 'Запоўніце гэтую форму, каб атрымаць па электроннай пошце напамін вашага акаўнта.',
 'passwordreset-legend' => 'Пераўстанавіць пароль',
 'passwordreset-disabled' => 'Функцыя пераўсталёўкі пароля адключаная на гэтай вікі.',
-'passwordreset-pretext' => '{{PLURAL:$1||Калі ласка, увядзіце адзін з фрагментаў дадзеных ніжэй}}',
 'passwordreset-username' => 'Імя ўдзельніка',
 'passwordreset-domain' => 'Дамен:',
 'passwordreset-capture' => 'Праглядзець напісаны ліст?',
@@ -813,8 +810,11 @@ $2
 Здаецца, што яна была сцёртая.',
 'edit-conflict' => 'Канфлікт правак.',
 'edit-no-change' => 'Вашая праўка была праігнараваная, таму што не мяняўся тэкст.',
+'postedit-confirmation' => 'Вашая праўка была захаваная.',
 'edit-already-exists' => 'Не ўдалося стварыць новую старонку.
 Такая ўжо існуе.',
+'editwarning-warning' => 'Выхад з гэтай старонкі прывядзе да страты правак, якія вы зрабілі. 
+Калі Вы зарэгістраваныя ў сістэме, Вы можаце адключыць гэта папярэджанне ў закладцы "Праца" Вашых настаўленняў.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Увага: На старонцы занадта шмат працаёмістых зваротаў да парсера.
@@ -1075,15 +1075,6 @@ $1",
 'search-external' => 'Вонкавы пошук',
 'searchdisabled' => 'Функцыя пошуку {{SITENAME}} не працуе. Тымчасова можна шукаць з дапамогай Google. Заўважце, што тамтэйшыя індэксы зместу {{SITENAME}} могуць не быць актуальнымі.',
 
-# Quickbar
-'qbsettings' => 'Хуткая стужка',
-'qbsettings-none' => 'Няма',
-'qbsettings-fixedleft' => 'Прымацавана злева',
-'qbsettings-fixedright' => 'Прымацавана справа',
-'qbsettings-floatingleft' => 'Плавае злева',
-'qbsettings-floatingright' => 'Плавае справа',
-'qbsettings-directionality' => 'Фіксаваная, у залежнасці ад накіравання вашай мовы',
-
 # Preferences page
 'preferences' => 'Настаўленні',
 'mypreferences' => 'Настáўленні',
@@ -1125,7 +1116,7 @@ $1",
 'recentchangesdays' => 'За колькі дзён паказваць {{lc:{{:{{ns:mediawiki}}:recentchanges/be}}}}:',
 'recentchangesdays-max' => '(найбольш $1 {{PLURAL:$1|дзень|дзён}})',
 'recentchangescount' => 'Прадвызначаная колькасць правак дзеля паказу:',
-'prefs-help-recentchangescount' => 'Ð\93Ñ\8dÑ\82а Ñ\9eклÑ\8eÑ\87ае Ñ\9e Ñ\81Ñ\8fбе Ð½Ñ\8fдаÑ\9eнÑ\96Ñ\8f Ð·Ð¼Ñ\8fненнÑ\96, гісторыі старонак, журналы.',
+'prefs-help-recentchangescount' => 'Ð\93Ñ\8dÑ\82а Ñ\9eклÑ\8eÑ\87ае Ñ\9e Ñ\81Ñ\8fбе Ð°Ð¿Ð¾Ñ\88нÑ\96Ñ\8f Ð·Ð¼ÐµÐ½Ñ\8b, гісторыі старонак, журналы.',
 'prefs-help-watchlist-token' => 'Упісанне сакрэтнага ключа ў гэтае поле створыць RSS-струмень з вашага спісу назіранага. 
 Кожны, каму вядомы гэты ключ, зможа чытаць ваш спіс назіранага, таму выбірайце бяспечныя ключы. 
 Вось аўта-згенераваны ключ, які можна выкарыстаць: $1',
@@ -1356,7 +1347,7 @@ $1",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|змена|змены|зменаў}}',
-'recentchanges' => 'Ð\9dÑ\8fдаÑ\9eнÑ\96Ñ\8f Ð·Ð¼Ñ\8fненнÑ\96',
+'recentchanges' => 'Ð\90поÑ\88нÑ\96Ñ\8f Ð·Ð¼ÐµÐ½Ñ\8b',
 'recentchanges-legend' => 'Магчымасці паказу',
 'recentchanges-summary' => 'Гэта апошнія мены на пляцоўцы {{SITENAME}}.',
 'recentchanges-feed-description' => 'Сачыць за найбольш актуальнымі змяненнямі ў віксе праз гэты струмень навін.',
@@ -1600,7 +1591,6 @@ $1',
 'http-read-error' => 'Памылка чытання HTTP',
 'http-timed-out' => 'Мінуў час чакання HTTP-запыту.',
 'http-curl-error' => 'Памылка звароту да URL: $1',
-'http-host-unreachable' => 'Не ўдалося адкрыць URL',
 'http-bad-status' => 'Пад час апрацоўкі HTTP-запыту выяўлена праблема: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1987,8 +1977,8 @@ $1',
 'notvisiblerev' => 'Версія сцёртая',
 'watchnochange' => 'Ніводзін з назіраных складнікаў не быў зменены за паказаны перыяд.',
 'watchlist-details' => 'Назіраю {{PLURAL:$1|$1 старонку|$1 старонак}} без уліку размоўных.',
-'wlheader-enotif' => 'Працуе апавяшчанне праз эл.пошту.',
-'wlheader-showupdated' => "Старонкі, якія былі зменены пасля вашага апошняга іх наведвання, паказаны '''абрысам шрыфту'''.",
+'wlheader-enotif' => 'Працуе апавяшчанне праз эл.пошту.',
+'wlheader-showupdated' => "Старонкі, якія былі зменены пасля вашага апошняга іх наведвання, паказаны '''абрысам шрыфту'''.",
 'watchmethod-recent' => 'правяраем нядаўнія праўкі ў назіраных старонках',
 'watchmethod-list' => 'правяраем наяўнасць нядаўніх правак ў назіраных старонках',
 'watchlistcontains' => 'У вашым спісе назіранага $1 {{PLURAL:$1|старонка|старонак}}.',
@@ -2224,7 +2214,7 @@ $1',
 'sp-contributions-newbies' => 'Паказваць толькі ўклады з новых рахункаў',
 'sp-contributions-newbies-sub' => 'З новых рахункаў',
 'sp-contributions-newbies-title' => 'Уклады ўдзельнікаў з новых рахункаў',
-'sp-contributions-blocklog' => 'Ð\96Ñ\83Ñ\80нал Ð·Ð°Ð±Ð°Ñ\80онаÑ\9e',
+'sp-contributions-blocklog' => 'блакÑ\96Ñ\80оÑ\9eкÑ\96',
 'sp-contributions-deleted' => 'сцёрты ўклад удзельніка',
 'sp-contributions-uploads' => 'Загрузкі',
 'sp-contributions-logs' => 'журналы',
@@ -2717,13 +2707,8 @@ $1',
 'pageinfo-authors' => 'Колькасць розных аўтараў',
 
 # Skin names
-'skinname-standard' => 'Класіка',
-'skinname-nostalgia' => 'Настальгія',
 'skinname-cologneblue' => 'Сіні Кёльн',
 'skinname-monobook' => 'Манабук',
-'skinname-myskin' => 'Майскін',
-'skinname-chick' => 'Чык',
-'skinname-simple' => 'Проста',
 'skinname-modern' => 'Сучаснасць',
 
 # Patrolling
@@ -2823,7 +2808,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шырыня',
 'exif-imagelength' => 'Вышыня',
 'exif-bitspersample' => 'Бітаў на кампанент',
@@ -3002,7 +2987,7 @@ $1',
 'exif-originalimageheight' => 'Вышыня малюнка да кадравання',
 'exif-originalimagewidth' => 'Шырыня малюнка да кадравання',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Нясціснута',
 'exif-compression-2' => 'CCITT Group 3, 1-мерная мадыфікацыя кадзіравання даўжынь серый Хафмана',
 'exif-compression-3' => 'CCITT Group 3, факсавае кадзіраванне',
@@ -3396,13 +3381,6 @@ MediaWiki распаўсюджваецца, спадзеючыся на прыд
 'version-software-product' => 'Прадукт',
 'version-software-version' => 'Версія',
 
-# Special:FilePath
-'filepath' => 'Шлях да файла',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Пуск',
-'filepath-summary' => 'Гэтая адмысловая старонка вяртае поўны шлях да файла.
-Выявы паказваюцца ў поўным памеры, іншыя тыпы файлаў адкрываюцца ў прыпісаных да іх праграмах.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пошук дублікатных файлаў',
 'fileduplicatesearch-summary' => 'Пошук дублікатных файлах на падставе іх хэшаў.',
@@ -3423,7 +3401,7 @@ MediaWiki распаўсюджваецца, спадзеючыся на прыд
 'specialpages-group-maintenance' => 'Звесткі аб працы',
 'specialpages-group-other' => 'Іншыя адмысловыя старонкі',
 'specialpages-group-login' => 'Прадстаўленне / рэгістрацыя',
-'specialpages-group-changes' => 'Ð\9dÑ\8fдаÑ\9eнÑ\96Ñ\8f Ð·Ð¼Ñ\8fненнÑ\96 і журналы',
+'specialpages-group-changes' => 'Ð\90поÑ\88нÑ\96Ñ\8f Ð·Ð¼ÐµÐ½Ñ\8b і журналы',
 'specialpages-group-media' => 'Укладзеныя файлы і звесткі пра іх',
 'specialpages-group-users' => 'Удзельнікі і дазволы',
 'specialpages-group-highuse' => 'Старонкі частага карыстання',
index eb2f411..ad817a5 100644 (file)
@@ -12,6 +12,7 @@
  * @author EugeneZelenko
  * @author Jim-by
  * @author Kaganer
+ * @author Nemo bis
  * @author Red Winged Duck
  * @author Renessaince
  * @author Wizardist
@@ -289,8 +290,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Паказваць колькасьць назіральнікаў',
 'tog-oldsig' => 'Цяперашні подпіс:',
 'tog-fancysig' => 'Апрацоўваць подпіс як вікі-тэкст (без аўтаматычнай спасылкі)',
-'tog-externaleditor' => 'Выкарыстоўваць вонкавы рэдактар па змоўчваньні (толькі для адмыслоўцаў, патрабуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
-'tog-externaldiff' => 'Выкарыстоўваць вонкавую праграму параўнаньня вэрсіяў па змоўчваньні (толькі для адмыслоўцаў, патрабуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
 'tog-showjumplinks' => 'Актываваць дапаможныя спасылкі «перайсьці да»',
 'tog-uselivepreview' => 'Выкарыстоўваць хуткі папярэдні прагляд (патрабуе JavaScript) (экспэрымэнтальна)',
 'tog-forceeditsummary' => 'Папярэджваць пра адсутнасьць кароткага апісаньня зьменаў',
@@ -305,6 +304,7 @@ $messages = array(
 'tog-showhiddencats' => 'Паказваць схаваныя катэгорыі',
 'tog-noconvertlink' => 'Забараніць канвэртацыю назваў спасылак',
 'tog-norollbackdiff' => 'Не паказваць зьмены пасьля выкарыстаньня функцыі адкату',
+'tog-useeditwarning' => 'Папярэджваць мяне, калі я буду пакідаць старонку рэдагаваньня зь незахаванымі зьменамі',
 
 'underline-always' => 'Заўсёды',
 'underline-never' => 'Ніколі',
@@ -368,6 +368,18 @@ $messages = array(
 '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 сьнежня',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Катэгорыя|Катэгорыі|Катэгорыі}}',
@@ -674,9 +686,18 @@ $2',
 'welcomecreation-msg' => 'Ваш рахунак быў створаны.
 Не забудзьцеся зьмяніць Вашыя [[Special:Preferences|налады ў {{GRAMMAR:месны|{{SITENAME}}}}]].',
 'yourname' => 'Імя ўдзельніка:',
+'userlogin-yourname' => 'Імя ўдзельніка',
+'userlogin-yourname-ph' => 'Увядзіце вашае імя ўдзельніка',
 'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Увядзіце ваш пароль',
+'createacct-yourpassword-ph' => 'Увядзіце пароль',
 'yourpasswordagain' => 'Паўтарыце пароль:',
+'createacct-yourpasswordagain' => 'Пацьвердзіце пароль',
+'createacct-yourpasswordagain-ph' => 'Увядзіце пароль зноў',
 'remembermypassword' => 'Запомніць мяне на гэтым кампутары (ня больш за $1 {{PLURAL:$1|дзень|дні|дзён}})',
+'userlogin-remembermypassword' => 'Запамятаць мяне',
+'userlogin-signwithsecure' => 'Скарыстацца бясьпечным злучэньнем',
 'securelogin-stick-https' => 'Утрымліваць злучэньне праз HTTPS пасьля ўваходу ў сыстэму',
 'yourdomainname' => 'Ваш дамэн:',
 'password-change-forbidden' => 'Вы ня можаце зьмяняць паролі ў гэтай вікі.',
@@ -689,18 +710,38 @@ $2',
 'logout' => 'Выйсьці',
 'userlogout' => 'Выйсьці',
 'notloggedin' => 'Вы не ўвайшлі ў сыстэму',
+'userlogin-noaccount' => 'Ня маеце рахунку?',
+'userlogin-joinproject' => 'Далучайцеся да {{GRAMMAR:родны|{{SITENAME}}}}',
 'nologin' => 'Ня маеце рахунку? $1.',
 'nologinlink' => 'Стварыце рахунак',
 'createaccount' => 'Стварэньне рахунку',
 'gotaccount' => 'Ужо маеце рахунак? $1.',
 'gotaccountlink' => 'Увайдзіце',
 'userlogin-resetlink' => 'Забыліся на зьвесткі для ўваходу?',
+'userlogin-resetpassword-link' => 'Забылі пароль?',
+'helplogin-url' => 'Help:Уваход у сыстэму',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Дапамога па ўваходзе ў сыстэму]]',
+'createacct-join' => 'Увядзіце свае зьвесткі ніжэй.',
+'createacct-emailrequired' => 'E-mail адрас',
+'createacct-emailoptional' => 'E-mail адрас (неабавязкова)',
+'createacct-email-ph' => 'Увядзіце ваш e-mail адрас',
 'createaccountmail' => 'Стварыць часовы адвольны пароль і даслаць яго на e-mail адрас, пазначаны ніжэй',
+'createacct-realname' => 'Сапраўднае імя (неабавязкова)',
 'createaccountreason' => 'Прычына:',
+'createacct-reason' => 'Прычына',
+'createacct-reason-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|удзельнік|удзельніка|удзельнікаў}} за апошні час',
 'badretype' => 'Уведзеныя Вамі паролі не супадаюць.',
 'userexists' => 'Уведзенае Вамі імя ўдзельніка ўжо выкарыстоўваецца кімсьці іншым. 
 Калі ласка, выберыце іншае імя.',
 'loginerror' => 'Памылка ўваходу',
+'createacct-error' => 'Памылка стварэньня рахунку',
 'createaccounterror' => 'Немагчыма стварыць рахунак: $1',
 'nocookiesnew' => 'Рахунак быў створаны, але ў сыстэму Вы не ўвайшлі.
 {{SITENAME}} выкарыстоўвае cookie для ўваходу ў сыстэму.
@@ -786,13 +827,15 @@ $2',
 'resetpass-wrong-oldpass' => 'Няслушны часовы альбо цяперашні пароль.
 Магчыма Вы ўжо пасьпяхова зьмянілі Ваш пароль альбо запыталі новы часовы пароль.',
 'resetpass-temp-password' => 'Часовы пароль:',
+'resetpass-abort-generic' => 'Зьмяненьне паролю было скасаванае пашырэньнем.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ачыстка паролю',
-'passwordreset-text' => 'Запоўніце гэтую форму, каб скінуць пароль.',
+'passwordreset-text-one' => 'Запоўніце гэтую форму, каб скінуць пароль.',
+'passwordreset-text-many' => '{{PLURAL:$1|Увядзіце гэтыя зьвесткі, каб скінуць пароль.}}',
 'passwordreset-legend' => 'Ачысьціць пароль',
 'passwordreset-disabled' => 'Магчымасьць ачысткі паролю была забароненая ў {{GRAMMAR:месны|{{SITENAME}}}}.',
-'passwordreset-pretext' => '{{PLURAL:$1||Увядзіце ніжэй частку зьвестак}}',
+'passwordreset-emaildisabled' => 'Функцыі e-mail у гэтай вікі былі адключаныя.',
 'passwordreset-username' => 'Імя ўдзельніка:',
 'passwordreset-domain' => 'Дамэн:',
 'passwordreset-capture' => 'Паказаць канчатковы электронны ліст?',
@@ -807,7 +850,7 @@ $2
 Цяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт,
 ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць,
 Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.',
-'passwordreset-emailtext-user' => 'Удзельнік $1 зрабіў запыт на атрыманьне падрабязнасьцяў Вашага рахунку ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|Наступны рахунак удзельніка зьвязаны|Наступныя рахункі удзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:
+'passwordreset-emailtext-user' => 'Удзельнік $1 зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:
 
 $2
 
@@ -819,7 +862,7 @@ $2
 Часовы пароль: $2',
 'passwordreset-emailsent' => 'Ліст пра скіданьне паролю быў дасланы.',
 'passwordreset-emailsent-capture' => 'Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.',
-'passwordreset-emailerror-capture' => 'Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго карыстальніку: $1',
+'passwordreset-emailerror-capture' => 'Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Зьмяніць адрас электроннай пошты',
@@ -1027,12 +1070,15 @@ $2
 Падобна, што яна была выдаленая.',
 'edit-conflict' => 'Канфлікт рэдагаваньняў.',
 'edit-no-change' => 'Вашае рэдагаваньне было праігнараванае, таму што ў тэкст не былі ўнесеныя зьмены.',
+'postedit-confirmation' => 'Вашая праўка была захаваная.',
 'edit-already-exists' => 'Немагчыма стварыць новую старонку.
 Яна ўжо існуе.',
 'defaultmessagetext' => 'Перадвызначаны тэкст паведамленьня',
 'content-failed-to-parse' => 'Зьмест «$2» не адпавядае тыпу $1: $3.',
 'invalid-content-data' => 'Няслушныя зьвесткі',
 'content-not-allowed-here' => 'Зьмест тыпу «$1» на старонцы [[$2]] не дазволены',
+'editwarning-warning' => 'Пакінуўшы гэтую старонку, вы можаце страціць усе ўнесеныя зьмены.
+Калі вы ўвайшлі ў сыстэму, Вы можаце адключыць гэтае папярэджаньне ў сэкцыі «Рэдагаваньне» вашых наладаў.',
 
 # Content models
 'content-model-wikitext' => 'вікі-тэкст',
@@ -1316,15 +1362,7 @@ $1",
 'search-external' => 'Вонкавы пошук',
 'searchdisabled' => 'Функцыя пошуку ў {{GRAMMAR:месны|{{SITENAME}}}} адключаная.
 Вы можаце пашукаць з дапамогай Google, але заўважце, што там інфармацыя пра старонкі {{GRAMMAR:родны|{{SITENAME}}}} можа быць састарэлай.',
-
-# Quickbar
-'qbsettings' => 'Панэль хуткага доступу',
-'qbsettings-none' => 'Не паказваць',
-'qbsettings-fixedleft' => 'Замацаваная зьлева',
-'qbsettings-fixedright' => 'Замацаваная справа',
-'qbsettings-floatingleft' => 'Плавае зьлева',
-'qbsettings-floatingright' => 'Плавае справа',
-'qbsettings-directionality' => 'Замацаваная, у залежнасьці ад накірунку напісаньня ў Вашай мове',
+'search-error' => 'Узьнікла памылка пры пошуку: $1',
 
 # Preferences page
 'preferences' => 'Налады',
@@ -1468,6 +1506,7 @@ $1",
 'userrights-notallowed' => 'Ваш рахунак ня мае права прызначаць ці выдаляць правы ўдзельнікам.',
 'userrights-changeable-col' => 'Групы, якія Вы можаце мяняць',
 'userrights-unchangeable-col' => 'Групы, якія Вы ня можаце мяняць',
+'userrights-conflict' => 'Канфлікт правоў удзельнікаў! Калі ласка, захавайце зьмены яшчэ раз.',
 
 # Groups
 'group' => 'Група:',
@@ -1867,7 +1906,6 @@ $1',
 'http-read-error' => 'Памылка чытаньня HTTP.',
 'http-timed-out' => 'Скончыўся час чаканьня HTTP-запыту.',
 'http-curl-error' => 'Памылка выбаркі URL-адрасу: $1',
-'http-host-unreachable' => 'Немагчыма дасягнуць URL-адрас',
 'http-bad-status' => 'Адбылася памылка пад час выкананьня HTTP-запыту: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2281,8 +2319,8 @@ $1',
 'notvisiblerev' => 'Вэрсія была выдаленая',
 'watchnochange' => 'Нічога з Вашага сьпісу назіраньня не зьмянілася за паказаны пэрыяд.',
 'watchlist-details' => 'У Вашым сьпісе назіраньня $1 {{PLURAL:$1|старонка|старонкі|старонак}} за выключэньнем старонак абмеркаваньня.',
-'wlheader-enotif' => '* Дасылка паведамленьняў па электроннай пошце ўключаная.',
-'wlheader-showupdated' => "* Старонкі, якія былі зьмененыя пасьля Вашага апошняга візыту, вылучаныя '''тоўстым''' шрыфтам",
+'wlheader-enotif' => 'Апавяшчэньне па e-mail уключанае.',
+'wlheader-showupdated' => "Старонкі, зьмененыя з часу вашага апошняга візыту, вылучаныя '''тоўстым''' шрыфтам.",
 'watchmethod-recent' => 'прагляд апошніх зьменаў у старонках са сьпісу назіраньня',
 'watchmethod-list' => 'прагляд старонак са сьпісу назіраньня дзеля апошніх зьменах',
 'watchlistcontains' => 'Ваш сьпіс назіраньня зьмяшчае $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
@@ -2695,6 +2733,7 @@ $1',
 'sorbsreason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Ваш IP-адрас знаходзіцца ў сьпісе адкрытых проксі ў DNSBL, якім карыстаецца {{SITENAME}}.
 Вы ня зможаце стварыць рахунак',
+'xffblockreason' => 'IP-адрас, прыведзены ў загалоўку X-Forwarded-For, які належыць або вам, або проксі-сэрвэру, быў заблякаваны. Прычынай блякаваньня было: $1',
 'cant-block-while-blocked' => 'Вы ня можаце блякаваць іншых удзельнікаў, пакуль Вы самі заблякаваныя.',
 'cant-see-hidden-user' => 'Удзельнік, якога Вы спрабуеце заблякаваць, ужо заблякаваны і схаваны. З-за таго, што Вы ня маеце правоў хаваньня ўдзельнікаў, Вы ня можаце бачыць альбо зьмяняць блякаваньне удзельніка.',
 'ipbblocked' => 'Вы ня можаце блякаваць ці раблякоўваць іншых удзельнікаў, таму што заблякаваныя самі',
@@ -2858,6 +2897,8 @@ $1',
 'thumbnail-more' => 'Павялічыць',
 'filemissing' => 'Файл адсутны',
 'thumbnail_error' => 'Памылка стварэньня мініятуры: $1',
+'thumbnail_error_remote' => 'Паведамленьне пра памылку з {{GRAMMAR:родны|$1}}:
+$2',
 'djvu_page_error' => 'Старонка DjVu па-за прамежкам',
 'djvu_no_xml' => 'Немагчыма атрымаць XML для DjVu-файла',
 'thumbnail-temp-create' => 'Немагчыма стварыць часовы файл мініятуры',
@@ -3081,13 +3122,8 @@ $1',
 'pageinfo-category-files' => 'Колькасьць файлаў',
 
 # Skin names
-'skinname-standard' => 'Клясычнае',
-'skinname-nostalgia' => 'Настальгія',
 'skinname-cologneblue' => 'Кёльнскі смутак',
 'skinname-monobook' => 'Монакніга',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Цыпа',
-'skinname-simple' => 'Простае',
 'skinname-modern' => 'Сучаснае',
 'skinname-vector' => 'Вэктар',
 
@@ -3169,11 +3205,25 @@ $1',
 'minutes' => '$1 {{PLURAL:$1|хвіліна|хвіліны|хвілінаў}}',
 'hours' => '$1 {{PLURAL:$1|гадзіна|гадзіны|гадзінаў}}',
 'days' => '$1 {{PLURAL:$1|дзень|дні|дзён}}',
+'weeks' => '{{PLURAL:$1|$1 тыдзень|$1 тыдні|$1 тыдняў}}',
 'months' => '{{PLURAL:$1|$1 месяц|$1 месяцы|$1 месяцаў}}',
 'years' => '{{PLURAL:$1|$1 год|$1 гады|$1 гадоў}}',
 'ago' => '$1 таму',
 'just-now' => 'толькі што',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => 'Фармат наступны:
 
@@ -3202,7 +3252,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шырыня',
 'exif-imagelength' => 'Вышыня',
 'exif-bitspersample' => 'Глыбіня колеру',
@@ -3381,7 +3431,7 @@ $1',
 'exif-originalimageheight' => 'Вышыня выявы да кадраваньня',
 'exif-originalimagewidth' => 'Шырыня выявы да кадраваньня',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Нясьціснуты',
 'exif-compression-2' => 'CCITT Група 3 аднамернае абноўленае кадаваньне адлегласьці Хафмана',
 'exif-compression-3' => 'CCITT Група 3 факсымільнае кадаваньне',
@@ -3806,12 +3856,17 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях да артыкула]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Пуць да скрыпту]',
 
-# Special:FilePath
-'filepath' => 'Шлях да файла',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Перайсьці',
-'filepath-summary' => 'Гэтая спэцыяльная старонка вяртае поўны шлях да файла.
-Выявы паказаныя ў поўным выглядзе, астатнія тыпы файлаў адкрываюцца прыпісанымі да іх праграмамі.',
+# Special:Redirect
+'redirect' => 'Перанакіраваньне да файла, удзельніка або вэрсіі старонкі',
+'redirect-legend' => 'Перанакіраваньне да файла або старонкі',
+'redirect-summary' => 'Гэтая спэцыяльная старонка перанакіруе да файла (паводле імя файла), старонкі (паводле нумара вэрсіі) або старонкі ўдзельніка (паводле нумара ўдзельніка).',
+'redirect-submit' => 'Перайсьці',
+'redirect-lookup' => 'Шукаць паводле:',
+'redirect-value' => 'Значэньне:',
+'redirect-user' => 'Ідэнтыфікатара ўдзельніка',
+'redirect-revision' => 'Вэрсіі старонкі',
+'redirect-file' => 'Імя файла',
+'redirect-not-exists' => 'Значэньне ня знойдзена',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пошук дублікатаў файлаў',
@@ -3902,6 +3957,9 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'htmlform-submit' => 'Захаваць',
 'htmlform-reset' => 'Адмяніць зьмены',
 'htmlform-selectorother-other' => 'Іншае',
+'htmlform-no' => 'Не',
+'htmlform-yes' => 'Так',
+'htmlform-chosen-placeholder' => 'Выберыце варыянт',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з падтрымкай поўнатэкстнага пошуку',
index 370c8b1..9e10dd4 100644 (file)
  * @author Daggerstab
  * @author Dimi z
  * @author Kaganer
+ * @author Simona
  * @author Spiritia
  * @author Stanqo
+ * @author Termininja
  * @author Turin
  * @author Urhixidur
  * @author Vladimir Penov
@@ -266,10 +268,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Показване на броя на потребителите, наблюдаващи дадена страница',
 'tog-oldsig' => 'Текущ подпис:',
 'tog-fancysig' => 'Без превръщане на подписа в препратка към потребителската страница',
-'tog-externaleditor' => 'Използване на външен редактор по подразбиране (само за експерти, необходими са специални настройки на компютъра.
-[//www.mediawiki.org/wiki/Manual:External_editors Повече информация.])',
-'tog-externaldiff' => 'Използване на външна програма за разлики по подразбиране (само за експерти, необходими са специални настройки на компютъра.
-[//www.mediawiki.org/wiki/Manual:External_editors Повече информация.])',
 'tog-showjumplinks' => 'Показване на препратки за достъпност от типа „Към…“',
 'tog-uselivepreview' => 'Използване на бърз предварителен преглед (изисква Джаваскрипт; експериментално)',
 'tog-forceeditsummary' => 'Предупреждаване при празно поле за резюме на редакцията',
@@ -283,6 +281,7 @@ $messages = array(
 'tog-diffonly' => 'Без показване на съдържанието на страницата при преглед на разлики',
 'tog-showhiddencats' => 'Показване на скритите категории',
 'tog-norollbackdiff' => 'Пропускане на разликовата връзка след извършване на отмяна на редакции',
+'tog-useeditwarning' => 'Предупреждаване при опит за напускане на страница, отворена в режим на редактиране, без да са запазени промените',
 
 'underline-always' => 'Винаги',
 'underline-never' => 'Никога',
@@ -346,6 +345,18 @@ $messages = array(
 '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 декември',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категории}}',
@@ -644,8 +655,15 @@ $2',
 'welcomecreation-msg' => 'Вашата сметка беше създадена.
 Можете да промените [[Special:Preferences|настройките на {{SITENAME}}]] според предпочитанията си.',
 'yourname' => 'Потребителско име:',
+'userlogin-yourname' => 'Потребителско име',
+'userlogin-yourname-ph' => 'Въведете вашето потребителско име',
 'yourpassword' => 'Парола:',
+'userlogin-yourpassword' => 'Парола',
+'userlogin-yourpassword-ph' => 'Въведете вашата парола',
+'createacct-yourpassword-ph' => 'Въведете парола',
 'yourpasswordagain' => 'Парола (повторно):',
+'createacct-yourpasswordagain' => 'Потвърждаване на паролата',
+'createacct-yourpasswordagain-ph' => 'Въведете паролата отново',
 'remembermypassword' => 'Запомняне на паролата на този компютър (най-много за $1 {{PLURAL:$1|ден|дни}})',
 'securelogin-stick-https' => 'Запазване на връзката през HTTPS след влизане',
 'yourdomainname' => 'Домейн:',
@@ -661,14 +679,18 @@ $2',
 'logout' => 'Излизане',
 'userlogout' => 'Излизане',
 'notloggedin' => 'Не сте влезли',
+'userlogin-joinproject' => 'Присъединяване към {{SITENAME}}',
 'nologin' => "Нямате потребителско име? '''$1'''.",
 'nologinlink' => 'Създаване на сметка',
 'createaccount' => 'Регистриране',
 'gotaccount' => "Имате ли вече сметка? '''$1'''.",
 'gotaccountlink' => 'Влизане',
 'userlogin-resetlink' => 'Забравени данни за влизане в системата?',
+'createacct-emailrequired' => 'Адрес за електронна поща',
 'createaccountmail' => 'Използване на временна парола, която се изпраща по електронната поща, посочена по-долу',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-imgcaptcha-ph' => 'Въведете текста, който виждате по-горе',
 'badretype' => 'Въведените пароли не съвпадат.',
 'userexists' => 'Въведеното потребителско име вече се използва.
 Изберете друго име.',
@@ -755,10 +777,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Възстановяване на парола',
-'passwordreset-text' => 'Попълването на формуляра ще доведе до възстановяване на паролата.',
 'passwordreset-legend' => 'Възстановяване на парола',
 'passwordreset-disabled' => 'Възстановяването на паролата е изключено в това уики.',
-'passwordreset-pretext' => '{{PLURAL:$1||Въведете някоя от информациите по-долу}}',
 'passwordreset-username' => 'Потребителско име:',
 'passwordreset-domain' => 'Домейн:',
 'passwordreset-capture' => 'Преглеждане на електронното писмо?',
@@ -772,20 +792,20 @@ $2
 
 {{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.
 Сега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.',
-'passwordreset-emailtext-user' => 'Ð\9fоÑ\82Ñ\80ебиÑ\82ел $1 Ð¾Ñ\82 {{SITENAME}} Ð¿Ð¾Ð¸Ñ\81ка Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñ\8fне Ð·Ð° Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð¾Ñ\82 сметката в {{SITENAME}}
+'passwordreset-emailtext-user' => 'Ð\9fоÑ\82Ñ\80ебиÑ\82ел $1 Ð¾Ñ\82 {{SITENAME}} Ð¿Ð¾Ð¸Ñ\81ка Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а Ð·Ð° сметката в {{SITENAME}}
 ($4). За {{PLURAL:$3|следната сметка|следните сметки}} е посочен този адрес за електронна поща:
 
 $2
 
 {{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.
-Сега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена 
+Сега би трябвало да влезете в системата и да изберете нова парола. Ако заявката е направена 
 от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете 
 това съобщение и да продължите да използвате старата си парола.',
 'passwordreset-emailelement' => 'Потребителско име: $1
 Временна парола: $2',
 'passwordreset-emailsent' => 'На електронната поща беше испратено писмо за възстановяване на паролата.',
-'passwordreset-emailsent-capture' => 'Ð\9fо-долÑ\83 Ðµ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\82о Ð¿Ð¸Ñ\81мо Ð·Ð° Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñ\8fне, което беше изпратено.',
-'passwordreset-emailerror-capture' => 'Ð\9fо-долÑ\83 Ðµ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ Ñ\81Ñ\8aздадено ÐµÐ»ÐµÐºÑ\82Ñ\80онно Ð¿Ð¸Ñ\81мо Ð·Ð° Ð½Ð°Ð¿Ð¾Ð¼Ð½Ñ\8fне, което не беше изпратено на потребителя: $1',
+'passwordreset-emailsent-capture' => 'Ð\9fо-долÑ\83 Ðµ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\82о Ð¿Ð¸Ñ\81мо Ð·Ð° Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а, което беше изпратено.',
+'passwordreset-emailerror-capture' => 'Ð\9fо-долÑ\83 Ðµ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ Ñ\81Ñ\8aздадено ÐµÐ»ÐµÐºÑ\82Ñ\80онно Ð¿Ð¸Ñ\81мо Ð·Ð° Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а, което не беше изпратено на потребителя: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Промяна на адреса за е-поща',
@@ -990,6 +1010,7 @@ $2
 Вероятно междувременно е била изтрита.',
 'edit-conflict' => 'Редакционен конфликт.',
 'edit-no-change' => 'Вашата редакция беше игнорирана, тъй като не съдържа промени по текста.',
+'postedit-confirmation' => 'Вашата редакция беше съхранена',
 'edit-already-exists' => 'Не можа да се създаде нова страница.
 Такава вече съществува.',
 'defaultmessagetext' => 'Текст на съобщението по подразбиране',
@@ -997,6 +1018,8 @@ $2
 'invalid-content-data' => 'Невалидни данни за съдържание',
 'content-not-allowed-here' => '
 На страницата [[$2]] не е позволено използването на $1',
+'editwarning-warning' => 'Ако излезете от тази страница, може да загубите всички незапазени промени, които сте направили. 
+Ако сте влезли в системата, можете да изключите това предупреждение през меню "Редактиране" във вашите лични настройки.',
 
 # Content models
 'content-model-wikitext' => 'уикитекст',
@@ -1272,15 +1295,6 @@ $1",
 'search-external' => 'Външно търсене',
 'searchdisabled' => 'Търсенето в {{SITENAME}} е временно изключено. Междувременно можете да търсите чрез Google. Обърнете внимание, че съхранените при тях страници най-вероятно са остарели.',
 
-# Quickbar
-'qbsettings' => 'Лента за бърз избор',
-'qbsettings-none' => 'Без меню',
-'qbsettings-fixedleft' => 'Неподвижно вляво',
-'qbsettings-fixedright' => 'Неподвижно вдясно',
-'qbsettings-floatingleft' => 'Плаващо вляво',
-'qbsettings-floatingright' => 'Плаващо вдясно',
-'qbsettings-directionality' => 'Фиксирана, в зависимост от посоката на писане на вашия език',
-
 # Preferences page
 'preferences' => 'Настройки',
 'mypreferences' => 'Настройки',
@@ -1780,7 +1794,6 @@ $1',
 'http-read-error' => 'HTTP грешка при четене.',
 'http-timed-out' => 'Пресрочено време за HTTP заявка.',
 'http-curl-error' => 'Грешка при извличането на URL: $1',
-'http-host-unreachable' => 'Недостъпен URL.',
 'http-bad-status' => 'Настъпи проблем по време на HTTP заявката: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2165,8 +2178,8 @@ $1',
 'notvisiblerev' => 'Версията беше изтрита',
 'watchnochange' => 'Никоя от наблюдаваните страници не е била редактирана в показаното време.',
 'watchlist-details' => '{{PLURAL:$1|Една наблюдавана страница|$1 наблюдавани страници}} от списъка ви за наблюдение (без беседи).',
-'wlheader-enotif' => 'Известяването по електронна поща е включено.',
-'wlheader-showupdated' => "Страниците, които са били променени след последния път, когато сте ги посетили, са показани с '''получер''' шрифт.",
+'wlheader-enotif' => 'Известяването по електронна поща е включено.',
+'wlheader-showupdated' => "Страниците, които са били променени след последния път, когато сте ги посетили, са показани с '''получер''' шрифт.",
 'watchmethod-recent' => 'проверка на последните редакции за наблюдавани страници',
 'watchmethod-list' => 'проверка на наблюдаваните страници за скорошни редакции',
 'watchlistcontains' => 'Списъкът ви за наблюдение съдържа {{PLURAL:$1|една страница|$1 страници}}.',
@@ -2183,14 +2196,19 @@ $1',
 'enotif_mailer' => 'Известяване по пощата на {{SITENAME}}',
 'enotif_reset' => 'Отбелязване на всички страници като посетени',
 'enotif_impersonal_salutation' => 'Потребител на {{SITENAME}}',
+'enotif_subject_deleted' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} от $2',
+'enotif_subject_created' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|създадена}} от $2',
+'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|изтрита}} на $PAGEEDITDATE от $2. Вижте $3.',
+'enotif_body_intro_created' => 'Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|създадена}} на $PAGEEDITDATE от $2. За текущата версия, вижте $3',
 'enotif_lastvisited' => 'Преглед на всички промени след последното ви посещение: $1.',
 'enotif_lastdiff' => 'Преглед на тази промяна: $1.',
 'enotif_anon_editor' => 'анонимен потребител $1',
 'enotif_body' => 'Уважаеми(а) $WATCHINGUSERNAME,
 
-Страницата $PAGETITLE в {{SITENAME}} е била $CHANGEDORCREATED на $PAGEEDITDATE от $PAGEEDITOR. За текущата версия на страницата, вижте $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Резюме на редакцията: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2201,16 +2219,16 @@ $NEWPAGE
 Няма да получавате други известия за последващи промени, докато не посетите страницата.
 Можете да актуализиране настройките си за този вид известия за всички страници от вашия списък за наблюдение.
 
-             Системата за известяване на {{SITENAME}}
+Системата за известяване на {{SITENAME}}
 
 --
\97а Ð´Ð° Ð¿Ñ\80омениÑ\82е Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ñ\81и Ð·Ð° Ð¸Ð·Ð²ÐµÑ\81Ñ\82Ñ\8fваниÑ\8f Ñ\87Ñ\80ез ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а, Ð¿Ð¾Ñ\81еÑ\82еÑ\82е
\9fÑ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ð¸Ð·Ð²ÐµÑ\81Ñ\82Ñ\8fваниÑ\8f Ñ\87Ñ\80ез ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88и Ð½Ð°
 {{canonicalurl:{{#special:Preferences}}}}
 
\97а Ð´Ð° Ð¿Ñ\80омениÑ\82е Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ñ\81и Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение, Ð¿Ð¾Ñ\81еÑ\82еÑ\82е
\9fÑ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð½Ð° Ñ\81пиÑ\81Ñ\8aка Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение Ñ\81е Ð¸Ð·Ð²Ñ\8aÑ\80Ñ\88ва Ð½Ð°
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
\97а Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ñ\81и Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение, Ð¿Ð¾Ñ\81еÑ\82еÑ\82е
\98зÑ\82Ñ\80иванеÑ\82о Ð½Ð° Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение Ñ\81Ñ\82ава Ñ\87Ñ\80ез 
 $UNWATCHURL
 
 За обратна връзка и помощ:
@@ -2887,6 +2905,7 @@ $1',
 'pageinfo-header-basic' => 'Основна информация',
 'pageinfo-header-edits' => 'История на редакциите',
 'pageinfo-header-restrictions' => 'Защита на страницата',
+'pageinfo-default-sort' => 'Ключ за сортиране по подразбиране',
 'pageinfo-article-id' => 'Номер на страницата',
 'pageinfo-views' => 'Брой прегледи',
 'pageinfo-watchers' => 'Брой наблюдаващи страницата',
@@ -2909,13 +2928,8 @@ $1',
 'pageinfo-category-files' => 'Брой файлове',
 
 # Skin names
-'skinname-standard' => 'Класика',
-'skinname-nostalgia' => 'Носталгия',
 'skinname-cologneblue' => 'Кьолнско синьо',
 'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Моят облик',
-'skinname-chick' => 'Пиленце',
-'skinname-simple' => 'Семпъл',
 'skinname-modern' => 'Модерен',
 
 # Patrolling
@@ -3021,7 +3035,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Височина',
 'exif-bitspersample' => 'Дълбочина на цвета (битове)',
@@ -3176,7 +3190,7 @@ $1',
 'exif-originalimageheight' => 'Височина на изображението преди намаляването',
 'exif-originalimagewidth' => 'Ширина на изображението преди намаляването',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Некомпресиран',
 
 'exif-copyrighted-true' => 'С авторски права',
@@ -3561,13 +3575,6 @@ MediaWiki се разпространява с надеждата, че ще б
 'version-entrypoints-header-entrypoint' => 'Входна точка',
 'version-entrypoints-header-url' => 'Адрес',
 
-# Special:FilePath
-'filepath' => 'Път към файл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Отваряне',
-'filepath-summary' => 'Тази специална страница връща пълния път до даден файл.
-Изображенията се показват в пълната им разделителна способност, а други типове файлове се отварят направо с приложенията, с които са асоциирани.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Търсене на повтарящи се файлове',
 'fileduplicatesearch-summary' => 'Търсене на повтарящи се файлове на база хеш стойности.',
index 91a73c4..3775f4c 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Anshumangupta21
  * @author Ganesh
+ * @author Nepaboy
  * @author Rajivkurjee
  */
 
@@ -49,11 +50,32 @@ $messages = array(
 'tog-underline' => 'लिंक के नीचे रेखा',
 'tog-justify' => 'पैराग्राफ जस्टीफाई',
 'tog-hideminor' => 'हाल के परिवर्तन में मामूली संपादन छुपाईं',
+'tog-hidepatrolled' => 'हाल के परिवर्तन में मामूली संपादन छुपाईं',
+'tog-newpageshidepatrolled' => 'नयका पृष्ठ के सूची में से जाँचल पृष्क के छुपाँई',
+'tog-extendwatchlist' => 'मात्र हाल के परिवर्तन ही नाही,बल्कि सब परिवर्तन के देखावे खातिर ध्यान सूची के विस्तारित करीं',
+'tog-usenewrc' => 'तुरंत भईल परिवर्तन आ ध्यानसूची परिवर्तनों के पन्ना के अनुसार समूह में बाँटी (जावास्क्रिप्ट आवश्यक)',
 'tog-numberheadings' => 'स्वयं-सांख्यिकी शिर्षक',
 'tog-showtoolbar' => 'सम्पादन औजार् बक्सा के दिखाइल् जाए',
+'tog-editondblclick' => 'दुई क्लिक पर पृष्ठ संपादित करीं (जावास्क्रिप्ट आवश्यक बा)',
+'tog-editsection' => '[संपादित करीं] कड़ि द्वारा अनुभाग संपादन सक्षम करीं',
+'tog-editsectiononrightclick' => 'अनुभाग शीर्षक पर दायाँ क्लिक कर अनुभाग सम्पादित करीं (जावास्क्रिप्ट आवश्यक बा)',
+'tog-showtoc' => 'अनुक्रम दिखाईं (जे पृष्ठ पर तीन से अधिक अनुभाग होखे)',
 'tog-rememberpassword' => 'इ ब्राउजर पर हमार प्रवेश जारी रहे (अधिकतम $1 {{PLURAL:$1|दिन|दिन}})',
+'tog-watchcreations' => 'हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी',
+'tog-watchdefault' => 'हमरा द्वारा निर्मित पृष्ठ आ हमरा द्वारा लादल फ़ाइलन के हमार ध्यानसूची में जोड़ी',
+'tog-watchmoves' => 'हमरा द्वारा स्थानांतरित पृष्ठ आ लादल फाईल के हमरा ध्यानसूची में जोड़ी',
+'tog-watchdeletion' => 'हमरा द्वारा मिटावल पृष्ठ फ़ाइलन के हमार ध्यानसूची में जोड़ी',
+'tog-minordefault' => 'सारा सम्पादन के छोट सम्पादन के रुप में चिन्हित करीं',
 'tog-previewontop' => 'सम्पादन बक्सा से पहिले पुर्वदर्शन दिखाईं।',
 'tog-previewonfirst' => 'पहिलका सम्पादन पर पूर्वावलोकन देखीं',
+'tog-nocache' => 'ब्राउजर पन्ना के कैशिंग अक्षम करींरें',
+'tog-enotifwatchlistpages' => 'हमार ध्यानसूची में दर्ज कौनो भी पन्ना या फाईल में परिवर्तन होखला पर हमके ई-मेल करल जाव',
+'tog-enotifusertalkpages' => 'यदि हमार वार्तालाप पन्ना पर कौनो परिवर्तन होखे त हमके ई मेल करल जाव',
+'tog-enotifminoredits' => 'पन्ना आ फाईल पर छोटो परिवर्तन होखे त हमके ई मेल करल जाव',
+'tog-enotifrevealaddr' => 'अधिसूचना ई-मेल में हमार ई मेल पता दिखावल जाव',
+'tog-shownumberswatching' => 'ध्यान रखे वालन सदस्यन के देखावल जाव',
+'tog-oldsig' => 'वर्तमान हस्ताक्षर:',
+'tog-fancysig' => 'हस्ताक्षर के विकी पाठ के रुप में उपयोग करीं (बिना स्वचालित कड़ी के)',
 
 'underline-always' => 'हमेशा',
 'underline-never' => 'कभी ना',
@@ -119,7 +141,7 @@ $messages = array(
 'article' => 'सामग्री पन्ना',
 'newwindow' => '(नया विंडो में खोलीं)',
 'cancel' => 'निरस्त',
-'mytalk' => 'हमार बात',
+'mytalk' => 'राà¤\89र बात',
 'navigation' => 'परिभ्रमण',
 
 # Cologne Blue skin
@@ -215,7 +237,7 @@ $1',
 'disclaimerpage' => 'Project:सामान्य अस्विकरण',
 'edithelp' => 'मदद सम्पादन',
 'edithelppage' => 'Help:सम्पादन',
-'helppage' => 'मदद:सामग्री',
+'helppage' => 'Help:सामग्री',
 'mainpage' => 'मुख्य पन्ना',
 'mainpage-description' => 'पहिलका पन्ना',
 'portal' => 'सामुदायिक पन्ना',
@@ -430,7 +452,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'compareselectedversions' => 'चुनल गईल संशोधन में अन्तर देखीं',
 'showhideselectedversions' => 'चुनल गईल संशोधन दिखाईं/छुपाईं',
 'editundo' => 'पूर्ववत',
-'diff-multi' => '({{PLURAL:$1|एगो मध्यम संशोधन|$1 गो मध्यम संशोधन}} नईखे दिखावल)',
+'diff-multi' => '({{PLURAL:$2|एगो योगदानकर्ता|$2 योगदानकर्ताओं}} द्वारा {{PLURAL:$1|कियल गईल बीच के एगो|कियल गईल बीच के $1}} अवतरण नईखे दर्शावल बा।)',
 
 # Search results
 'searchresults' => 'खोज परिणाम',
@@ -489,12 +511,9 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'powersearch-togglenone' => 'कउनो ना',
 'search-external' => 'बाहरी खोज',
 
-# Quickbar
-'qbsettings-none' => 'कउनो ना',
-
 # Preferences page
 'preferences' => 'वरीयता',
-'mypreferences' => 'हमार पसन्द',
+'mypreferences' => 'राà¤\89र पसन्द',
 'prefs-edits' => 'सम्पादन संख्या',
 'prefsnologin' => 'खाता में प्रवेश नईखीं कईले',
 'changepassword' => 'गुप्त शब्द बदलीं',
@@ -538,7 +557,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'filehist-filesize' => 'फाईल के आकार',
 'filehist-comment' => 'टिप्पणी',
 'filehist-missing' => 'गायब फाईल',
-'imagelinks' => 'फाà¤\88ल à¤²à¤¿à¤\82à¤\95',
+'imagelinks' => 'फाà¤\88ल à¤\95à¥\87 à¤\89पयà¥\8bà¤\97',
 'nolinkstoimage' => 'इ फाईल जोड़े कौनो फाइल लिंक नईखे।',
 'morelinkstoimage' => 'इ फाइल संगे जुड़ल [[Special:WhatLinksHere/$1|सब लिंक]] देखीं।',
 'sharedupload' => 'इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा।',
@@ -585,8 +604,8 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'emailuser' => 'ई प्रयोगकर्ता के ईमेल करीं',
 
 # Watchlist
-'watchlist' => 'हमार à¤§à¥\8dयानसूची',
-'mywatchlist' => 'हमार à¤§à¥\8dयानसूची',
+'watchlist' => 'राà¤\89र à¤§à¥\8dयान à¤¦à¤¿à¤¯à¤² à¤ªà¤¨à¥\8dना à¤\95à¥\87 सूची',
+'mywatchlist' => 'राà¤\89र à¤§à¥\8dयान à¤¦à¤¿à¤¯à¤² à¤ªà¤¨à¥\8dना à¤\95à¥\87 सूची',
 'watch' => 'ध्यानसूची में डालीं',
 'watchthispage' => 'ई पन्ना ध्यानसूची में डालीं',
 'unwatch' => 'ध्यानसूची से हटाईं',
@@ -609,9 +628,9 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'blanknamespace' => '(मुख्य)',
 
 # Contributions
-'contributions' => 'प्रयोगकर्ता योगदान',
+'contributions' => '{{GENDER:$1|सदस्य}} योगदान',
 'contributions-title' => ' $1 खातिर प्रयोगकर्ता योगदान',
-'mycontris' => 'हमार à¤¯à¥\8bà¤\97दान',
+'mycontris' => 'राà¤\89र à¤¯à¥\8bà¤\97दान à¤\95à¥\87 à¤¸à¥\82à¤\9aà¥\80',
 'nocontribs' => 'ई मानदंड से मिलत जुलत कौनो बदलाव ना मिलल।',
 'uctop' => '(शीर्ष)',
 'month' => 'महिना से (आ उ से पहिले):',
@@ -636,17 +655,18 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'nolinkshere' => "'''[[:$1]]''' से कौनो पन्ना नईखे जुड़ल।",
 'nolinkshere-ns' => "चुनल गईल सन्दर्भ में '''[[:$1]]''' से कौनो पन्ना ना जुड़ेला।",
 'isredirect' => 'पुन: निर्दिष्ट पन्ना',
-'isimage' => 'तसà¥\8dवà¥\80र लिंक',
+'isimage' => 'फाà¤\88ल लिंक',
 'whatlinkshere-prev' => '{{PLURAL:$1|पिछला|पिछला $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|अगला|अगला $1}}',
 'whatlinkshere-links' => '← लिंक',
 'whatlinkshere-hideredirs' => '$1 पुन: निर्देशित',
 'whatlinkshere-hidelinks' => '$1 लिंक',
-'whatlinkshere-hideimages' => '$1 à¤¤à¤¸à¥\8dवà¥\80र लिंक',
+'whatlinkshere-hideimages' => '$1 à¤«à¤¼à¤¾à¤\87ल लिंक',
 'whatlinkshere-filters' => 'फिल्टर',
 
 # Block/unblock
 'blockip' => 'प्रतिबंधित प्रयोगकर्ता',
+'ipboptions' => '२ घंटे:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ते:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ साल:1 year,हमेशा खातिर:infinite',
 'blocklink' => 'निष्क्रिय',
 'unblocklink' => 'ताला खोलीं',
 'change-blocklink' => 'ब्लॉक बदलीं',
@@ -731,7 +751,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'metadata-expand' => 'विस्तृत विवरण देखाईं',
 'metadata-collapse' => 'विस्तृत विवरण छुपाँईं',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौड़ाई',
 'exif-imagelength' => 'ऊँचाई',
 'exif-bitspersample' => 'अवयव प्रति बीट',
index 23ea245..83cebd4 100644 (file)
@@ -146,11 +146,11 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Garisi di bawah tautan',
 'tog-justify' => 'Ratakan paragraf',
-'tog-hideminor' => 'Sungkupakan babakan sapalih dalam parubahan tahanyar',
-'tog-hidepatrolled' => 'Sungkupakan babakan taawasi dalam parubahan tahanyar',
+'tog-hideminor' => 'Sungkupakan babakan sapalih dalam paubahan pahanyarnya',
+'tog-hidepatrolled' => 'Sungkupakan babakan taawasi dalam paubahan pahanyarnya',
 'tog-newpageshidepatrolled' => 'Sungkupakan tungkaran nang diitihi matan daptar tungkaran hanyar',
-'tog-extendwatchlist' => 'Singkaiakan daptar itihan hagan manampaiakan samunyaan parubahan, kada nang hanyar haja.',
-'tog-usenewrc' => 'Purukakan panampaian parubahan tahanyar tingkat tinggi (parlu ada JavaScript)',
+'tog-extendwatchlist' => 'Singkaiakan daptar itihan hagan manampaiakan samunyaan paubahan, kada nang hanyar haja.',
+'tog-usenewrc' => 'Purukakan panampaian paubahan pahanyarnya tingkat tinggi (parlu ada JavaScript)',
 'tog-numberheadings' => 'Bari numur judul utumatis',
 'tog-showtoolbar' => 'Tampaiakan bilah-pakakas babak (parlu ada JavaScript)',
 'tog-editondblclick' => 'Babak tutungkaran wan klik ganda (parlu ada JavaScript)',
@@ -173,11 +173,9 @@ $messages = array(
 'tog-shownumberswatching' => 'Tampaiakan barapa pamakai nang maitihi',
 'tog-oldsig' => 'Tandateken nang sudah ada:',
 'tog-fancysig' => 'Tapsirakan tandatangan sawagai naskah wiki (kada batautan utumatis)',
-'tog-externaleditor' => 'Puruk pambabak luar sawagai default (hagan nang harat haja, musti ada setélan istimiwa pada komputer Pian.[//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Puruk palainan luar sawagai default (hagan nang harat haja, musti ada setélan istimiwa pada komputer Pian. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Kawa\'akan "lacung ka" tautan kakawaan-masuk',
 'tog-uselivepreview' => 'Puruk titilikan langsung (parlu ada JavaScript) (cacubaan)',
-'tog-forceeditsummary' => 'Ingatakan ulun wayah babuat sabuah kasimpulan babakan kusung',
+'tog-forceeditsummary' => 'Ingatakan ulun wayah babuat sabuting kasimpulan babakan puang',
 'tog-watchlisthideown' => 'Sungkupakan babakan ulun di daptar itihan',
 'tog-watchlisthidebots' => 'Sungkupakan babakan bot di daptar itihan',
 'tog-watchlisthideminor' => 'Sungkupakan babakan sapalih di daptar itihan',
@@ -188,6 +186,7 @@ $messages = array(
 'tog-diffonly' => 'Kada usah manampaiakan isi tungkaran di bawah balain',
 'tog-showhiddencats' => 'Tampaiakan tutumbung tasungkup',
 'tog-norollbackdiff' => 'Kada usah manampaiakan lainan imbah mambulikakan',
+'tog-useeditwarning' => 'Ingatakan ulun pabila maninggalakan tungkaran pambabakan sabalum manyimpan parubahan',
 
 'underline-always' => 'Tarus',
 'underline-never' => 'Kada suah',
@@ -264,8 +263,8 @@ $messages = array(
 'category-subcat-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut.',
 'category-article-count' => '{{PLURAL:$2|Tumbung ni baisi asa tungkaran barikut haja.|Tutumbung ngini baisi {{PLURAL:$1|tungkaran|$1 tutungkaran}}, matan $2 sabarataan.}}',
 'category-article-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|asa tungkaran|$1 tutungkaran}} barikut.',
-'category-file-count' => '{{PLURAL:$2|Tumbung ngini hanya baisi asa barakas barikut.|Tumbung ngini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
-'category-file-count-limited' => 'Tumbung ini baisi {{PLURAL:$1|barakas|$1 barakas}} barikut.',
+'category-file-count' => '{{PLURAL:$2|Tumbung ngini wastu baisi satu barakas barikut.|Tumbung ngini baisi {{PLURAL:$1|barakas|$1 babarakas}} barikut, matan $2 sabarataan.}}',
+'category-file-count-limited' => 'Tumbung ngini baisi {{PLURAL:$1|barakas|$1 barakas}} barikut.',
 'listingcontinuesabbrev' => 'samb.',
 'index-category' => 'Tungkaran tasusun bapadalakan kata',
 'noindex-category' => 'Tungkaran kada tasusun bapadalakan kata',
@@ -276,6 +275,7 @@ $messages = array(
 'newwindow' => '(buka di lalungkang hanyar)',
 'cancel' => 'Walangi',
 'moredotdotdot' => 'Lainnya...',
+'morenotlisted' => 'Salanjutnya...',
 'mypage' => 'Tungkaran ulun',
 'mytalk' => 'Pamandiran ulun',
 'anontalk' => 'Pamandiran hagan alamat IP ini',
@@ -309,6 +309,7 @@ $messages = array(
 'namespaces' => 'Ngarankamar',
 'variants' => 'Macam',
 
+'navigation-heading' => 'Menu napigasi',
 'errorpagetitle' => 'Kasalahan',
 'returnto' => 'Bulik ka $1.',
 'tagline' => 'Matan {{SITENAME}}',
@@ -355,10 +356,10 @@ $messages = array(
 'viewhelppage' => 'Tiringi tungkaran patulung',
 'categorypage' => 'Tiringi tungkaran tumbung',
 'viewtalkpage' => 'Tiringi tungkaran pamandiran',
-'otherlanguages' => 'Dalam bahasa lain',
+'otherlanguages' => 'Dalam basa lain',
 'redirectedfrom' => '(Diugahakan matan $1)',
 'redirectpagesub' => 'Tungkaran paugahan',
-'lastmodifiedat' => 'Tungkaran ngini tauncit diubah pada $1, $2.',
+'lastmodifiedat' => 'Tungkaran ngini pauncitnya diubah pada $1, $2.',
 'viewcount' => 'Tungkaran ini sudah diungkai {{PLURAL:$1|kali|$1 kali}}.',
 'protectedpage' => 'Tungkaran nang dilindungi',
 'jumpto' => 'Malacung ka',
@@ -378,8 +379,8 @@ $1",
 'aboutpage' => 'Project:Pasal',
 'copyright' => 'Isi tasadia sasuai lawan $1.',
 'copyrightpage' => '{{ns:project}}:Hak cipta',
-'currentevents' => 'Paristiwa damini',
-'currentevents-url' => 'Project:Paristiwa damini',
+'currentevents' => 'Kajadian wayahini',
+'currentevents-url' => 'Project:Kajadian wayahini',
 'disclaimers' => 'Panyangkalan',
 'disclaimerpage' => 'Project:Panyangkalan umum',
 'edithelp' => 'Patulung mambabak',
@@ -405,7 +406,11 @@ Lihati [[Special:Version|Tungkaran mudil]]',
 'retrievedfrom' => 'Dijumput matan "$1"',
 'youhavenewmessages' => 'Pian baisi $1 ($2)',
 'newmessageslink' => 'pasan hanyar',
-'newmessagesdifflink' => 'parubahan tauncit',
+'newmessagesdifflink' => 'paubahan pauncitnya',
+'youhavenewmessagesfromusers' => 'Pian baisi $1 matan {{PLURAL:$3|$3 pamakai lain}} ($2).',
+'youhavenewmessagesmanyusers' => 'Pian baisi $1 matan pamakai lain ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|pasan hanyar}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|paubahan}} pahabisnya',
 'youhavenewmessagesmulti' => 'Pian baisi pasan hanyar dalam $1',
 'editsection' => 'babak',
 'editold' => 'babak',
@@ -446,8 +451,8 @@ Lihati [[Special:Version|Tungkaran mudil]]',
 
 # Main script and global functions
 'nosuchaction' => 'Kadada palakuan nangkaitu',
-'nosuchactiontext' => 'Palakuan nang diminta URL kada sah.
-Pian pinanya salah katik URL, atawa maumpati sabuah tautan nang kada bujur.
+'nosuchactiontext' => 'Tindakan nang diminta URL kada sah.
+Pian tagasnya salah katik URL, atawa maumpati sabuting tautan nang kada bujur.
 Ngini jua bisa ai ada bug di parangkat lunak nang dipuruk {{SITENAME}}.',
 'nosuchspecialpage' => 'Kadada tungkaran istimiwa nangitu',
 'nospecialpagetext' => '<strong>Pian maminta tungkaran istimiwa nang kada sah.</strong>
@@ -457,7 +462,7 @@ Daptar tungkaran istimiwa sah kawa diugai pada [[Special:SpecialPages|{{int:spec
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan Basisdata',
 'dberrortext' => 'Ada kasalahan sintaks pada parmintaan basisdata.
-Kasalahan ngini pina manandai adanya sabuah bug dalam parangkat lunak.
+Kasalahan ngini pina manandai adanya sabuting bug dalam parangkat lunak.
 Parmintaan basisdata yang tadudi adalah:
 <blockquote><tt>$1</tt></blockquote>
 matan dalam pungsi "<tt>$2</tt>".
@@ -467,15 +472,15 @@ Parmintaan basisdata nang tadudi adalah:
 "$1"
 matan dalam pungsi "$2".
 Basisdata kasalahan  babulik "$3: $4".',
-'laggedslavemode' => "'''Paringatan:''' Tungkaran ngini pinanya kada baisi parubahan tahanyar.",
+'laggedslavemode' => "'''Paringatan:''' Tungkaran ngini tagasnya kada baisi paubahan pahanyarnya.",
 'readonly' => 'Basisdata tasunduk',
-'enterlockreason' => 'Buati sabuah alasan manyunduk, tamasuk jua wayah apa handak dibuka pulang sundukannya.',
-'readonlytext' => 'Basisdata lagi basunduk hagan masukan hanyar wan parubahan lain, pinanya pang lagi ada jadwal paharaguan basis data, imbah ini akan babulik nangkaya biasa.
+'enterlockreason' => 'Buati sabuting alasan manyunduk, tamasuk jua wayah kapan handak dibuka pulang sundukannya.',
+'readonlytext' => 'Basisdata lagi disunduk hagan masukan hanyar wan paubahan lain, pinanya pang lagi ada jadwal paharaguan basis data, limbah ngini akan babulik nangkaya biasa.
 
 Pambakal nang manyunduk mamadahi nangkaini: $1',
 'missing-article' => 'Basisdata kada ulihan manggagai kata matan tungkaran nang saharusnya ada, bangaran "$1" $2.
 
-Nangkaini biasanya dimargakan tautan lawas ka sabuah tungkaran nang halamnya sudah dihapus.
+Nangkaini biasanya dimargakan tautan lawas ka sabuting tungkaran nang halamnya sudah dihapus.
 
 Munnya lainan ngini pasalnya, Pian mungkin batamu bug dalam perangkat lunak.
 Silakan lapurakan ngini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah catatan URL nang ditulaki',
@@ -497,9 +502,11 @@ Silakan lapurakan ngini ka saurang [[Special:ListUsers/sysop|pambakal]], ulah ca
 'badarticleerror' => 'Palakuan ngini kada kawa dicungulakan pada tungkaran ngini.',
 'cannotdelete' => "Tungkaran atawa barakas ''$1'' kada kawa dihapus. Pinanya sudah dihapus urang lain badahulu.",
 'cannotdelete-title' => 'Kada kawa mahapus tungkaran "$1"',
+'delete-hook-aborted' => 'Pahapusan diwalangakan ulih kait parser.
+Kadada katarangan.',
 'badtitle' => 'Judul buruk',
-'badtitletext' => 'Judul tungkaran nang diminta kada sah, kada baisi, atawa kada pasnya tautan judul antar-bahasa atawa antar-wiki.
-Nangini bisa baisi satu atawa labih hurup nang saharusnya kadada di judul.',
+'badtitletext' => 'Judul tungkaran nang diminta kada sah, kada baisi, atawa kada pasnya tautan judul antar-basa atawa antar-wiki.
+Nangini kawa baisi satu atawa labih hurup nang saharusnya kadada di judul.',
 'perfcached' => 'Data barikut adalah timbuluk wan pina kada mutakhir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
 'perfcachedts' => 'Data nang dudi ni adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
 'querypage-no-updates' => 'Pamugaan matan tungkaran ngini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.',
@@ -509,15 +516,15 @@ Parmintaan: $2',
 'viewsource' => 'Tiringi asal mulanya',
 'viewsource-title' => 'Tiringi asalmula matan $1',
 'actionthrottled' => 'Kalakuan dikiripi',
-'actionthrottledtext' => 'Sawagai sabuah takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ngini.
+'actionthrottledtext' => 'Sawagai sabuting takaran anti-spam, Pian dibabatasi hagan balalaku kababanyakan dalam parhatan handap, wan Pian sudah limpuari batasan ngini.
 Muhun cubai pulang dalam babarapa minit.',
 'protectedpagetext' => 'Tungkaran ngini sudah dilindungi hagan mancagah babakan.',
 'viewsourcetext' => 'Pian kawa maniringi wan manyalin asal mula tungkaran ngini:',
 'viewyourtext' => "Pian kawa maniringi wan salain asalmula matan '''babakan pian''' ka tungkaran ngini:",
 'protectedinterface' => 'Tungkaran ini manyadiakan naskah antarmuha gasan parangkat lunak, wan dilindungi hagan mancagah tasalah puruk.',
-'editinginterface' => "'''Paringatan:''' Pian mambabak sabuah tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
-Parubahan ka tungkaran ngini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
-Gasan tarjamahan, muhun puruk [//translatewiki.net/wiki/Main_Page?setlang=bjn translatewiki.net], rangka gawian palokalan MediaWiki.",
+'editinginterface' => "'''Paringatan:''' Pian mambabak sabuting tungkaran nang dipuruk hagan manyadiakan naskah antarmuha gasan parangkat lunak.
+Paubahan ka tungkaran ngini akan bapangaruh matan tampaian antarmuha gasan pamakai lain.
+Gasan tarjamahan, muhun pakai [//translatewiki.net/wiki/Main_Page?setlang=bjn translatewiki.net], rangka gawian palokalan MediaWiki.",
 'sqlhidden' => '(Parmintaan SQL disungkupakan)',
 'cascadeprotected' => 'Tungkaran ini sudah dilindungi matan pambabakan, marga nangini tamasuk dalam {{PLURAL:$1|tungkaran|tutungkaran}} dudi nang dilindungi "barénténg": $2',
 'namespaceprotected' => "Pian kada baisi ijin hagan mambabak tutungkaran dalam ngaran kamar '''$1'''.",
@@ -529,6 +536,10 @@ Alasan nang dibariakan adalah ''$2''.",
 'filereadonlyerror' => 'Kada kawa mamudipikasi data "$1" marga repositori data "$2" ada di modus read-only.
 
 Administrator nang takunci nintu manawarakan panjalasan: "$3".',
+'invalidtitle-knownnamespace' => 'Judul nang kada sah lawan ruang-ngaran "$2" wan teks "$3"',
+'invalidtitle-unknownnamespace' => 'Judul nang kada sah lawan numur ruang ngaran kada dikatahui $1 wan teks "$2"',
+'exception-nologin' => 'Balum babuat log',
+'exception-nologin-text' => 'Tungkaran atawa tindakan ngini maharusakan Pian babuat log di wiki ngini.',
 
 # Virus scanner
 'virus-badscanner' => "Konpigurasi buruk: pamindai virus kada dipinandui: ''$1''",
@@ -540,12 +551,17 @@ Administrator nang takunci nintu manawarakan panjalasan: "$3".',
 
 Pian kawa manyambung hagan mangguna'akan {{SITENAME}} kada bangaran, atawa Pian kawa <span class='plainlinks'>[$1 babuat log pulang]</span> sawagai pamakai nang sama atawa sawagai pamakai balain.
 Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masih babuat log, sampai Pian mahabisakan timbuluk panjalajah web Pian.",
+'welcomeuser' => 'Salamat datang,  $1 !',
+'welcomecreation-msg' => '==Salamat datang, $1!==
+Akun Pian sudah diulah.
+Jangan kada ingat hagan maubah [[Special:Preferences|kakatujuan {{SITENAME}}]] Pian.',
 'yourname' => 'Ngaran pamakai:',
 'yourpassword' => 'Katasunduk:',
 'yourpasswordagain' => 'Katik pulang katasunduk:',
 'remembermypassword' => 'Ingatakan log babuat ulun dalam komputer naya (salawas $1 {{PLURAL:$1|hari|hari}})',
 'securelogin-stick-https' => 'Tatap tasambung awan HTTPS imbah babuat-log',
 'yourdomainname' => 'Domain Pian:',
+'password-change-forbidden' => 'Pian kada kawa ma-ubah kata sunduk pada wiki ngini.',
 'externaldberror' => 'Ada kasalahan apakah kacucukan basis data atawa Pian kada bulih mamutakhirakan akun luar.',
 'login' => 'Babuat',
 'nav-login-createaccount' => 'Babuat log / ulah akun',
@@ -555,7 +571,7 @@ Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masi
 'logout' => 'Kaluar',
 'userlogout' => 'Kaluar',
 'notloggedin' => 'Balum babuat log',
-'nologin' => 'Kada baisi sabuah akun? $1.',
+'nologin' => "Balum baisi akun? '''$1'''.",
 'nologinlink' => 'Ulah sabuting akun',
 'createaccount' => 'Ulah akun',
 'gotaccount' => 'Hudah baisi sabuting akun? $1.',
@@ -600,13 +616,13 @@ Muhun cubai pulang.',
 
 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 mamakai katasunduk lawas Pian.',
 'noemail' => 'Kadada alamat suril tarakam gasan pamakai "$1".',
-'noemailcreate' => 'Pian parlu manyadiakan sabuah alamat suril nang sah',
+'noemailcreate' => 'Pian parlu manyadiakan sabuting alamat suril nang sah',
 'passwordsent' => 'Sabuting kata sunduk hanyar sudah dikirim ka suril tadaptar gasan "$1".
 Muhun babuat log pulang habis Pian manarima nangini.',
 'blocked-mailpassword' => 'Alamat IP Pian diblukir hagan mambabak, wan kada dibulihakan mamakai pungsi pamulihan kata sunduk hagan mancagah salah puruk.',
 'eauthentsent' => 'Sabuting suril payakinan hudah dikirim ka alamat suril.
 Sabalum ada suril lain nang takirim ka akun, Pian akan parlu maumpati anjuran dalam suril nangitu, hagan mayakinakan bahwasanya akun nangitu bujur-bujur ampun Pian.',
-'throttled-mailpassword' => 'Sabuting pangingat kata sunduk hudah takirim, dalam {{PLURAL:$1|jam|$1 jam}} tauncit. Hagan mancagah salah puruk, asa pangingat kata sunduk haja nang dikirim saban {{PLURAL:$1|jam|$1 jam}}.',
+'throttled-mailpassword' => 'Sabuting pangingat kata sunduk hudah takirim, dalam {{PLURAL:$1|jam|$1 jam}} pauncitnya. Hagan mancagah salah puruk, asa pangingat kata sunduk haja nang dikirim saban {{PLURAL:$1|jam|$1 jam}}.',
 'mailerror' => 'Kasalahan pangiriman suril: $1',
 'acct_creation_throttle_hit' => "Pa'ilang wiki nangini mamuruk alamat IP Pian hudah maulah {{PLURAL:$1|1 akun|$1 akun}} dalam asa harian ini, dimana nangitu jumlah paling banyak nang diijinakan. Sawagai hasilnya, pa'ilang awan alamat IP nangini kada kawa maulah akun pulang gasan pahadangan.",
 'emailauthenticated' => 'Alamat suril Pian rasuk pada  $2, $3',
@@ -629,17 +645,18 @@ Pian kawa kada mahual pasan ngini, amun paulahan akun ini adalah kasalahan.',
 'login-throttled' => 'Pian sudah kabanyakan mancuba babuat log.
 Muhun hadangi dahulu sapandang hanyar cubai pulang.',
 'login-abort-generic' => 'Pian kada ruhui babuat  log - Diwalangi',
-'loginlanguagelabel' => 'Bahasa: $1',
-'suspicious-userlogout' => 'Parmintaan Pian hagan kaluar log kada ditarima karana nangkaya dikirim matan panjalajah web rakai atawa tatangkap proxy.',
+'loginlanguagelabel' => 'Basa: $1',
+'suspicious-userlogout' => 'Pamintaan Pian hagan kaluar log kada ditarima marga nangkaya dikirim matan panjalajah web rakai atawa tatangkap proxy.',
 
 # Email sending
 'php-mail-error-unknown' => 'Kasalahan kada dipinandui dalam pungsi surat () PHP',
 'user-mail-no-addy' => 'Mancuba mangirim suril kada baalamat suril.',
+'user-mail-no-body' => 'Manarai hagan mangirim suril puang atawa talalu handap.',
 
 # Change password dialog
 'resetpass' => 'Ubah katasunduk',
-'resetpass_announce' => 'Pian babuat log awan sabuah kudi samantara nang disurili.
-Hagan manuntungakan babuat log, Pian musti manyetel sabuah katasunduk hanyar di sia:',
+'resetpass_announce' => 'Pian babuat log awan sabuting kode samantara nang disurili.
+Hagan manuntungakan babuat log, Pian musti manyetel sabuting katasunduk hanyar di sia:',
 'resetpass_header' => 'Ubah katasunduk akun',
 'oldpassword' => 'Katasunduk lawas:',
 'newpassword' => 'Katasunduk hanyar:',
@@ -652,12 +669,12 @@ Wayah ni Pian sudah babuat log...',
 'resetpass-submit-loggedin' => 'Ubah katasunduk',
 'resetpass-submit-cancel' => 'Walangi',
 'resetpass-wrong-oldpass' => 'Katasunduk samantara atawa wayah ni kada sah.
-Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasunduk samantara hanyar.',
+Pian pinanya sudah barhasil maubah katasunduk Pian atawa maminta sabuting katasunduk samantara hanyar.',
 'resetpass-temp-password' => 'Katasunduk samantara:',
 
 # Special:PasswordReset
 'passwordreset' => 'Bulikakan setelan katasunduk',
-'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuah suril pangingat rarincian akun Pian.',
+'passwordreset-text' => 'Tuntungakan purmulir ngini gasan manarima sabuting suril pangingat rarincian akun Pian.',
 'passwordreset-legend' => 'Bulikakan setelan katasunduk',
 'passwordreset-disabled' => 'Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.',
 'passwordreset-pretext' => '{{PLURAL:$1||Buati asa data di bawah ngini}}',
@@ -667,7 +684,7 @@ Pian pinanya sudah bahasil maubah katasunduk Pian atawa maminta sabuah katasundu
 'passwordreset-capture-help' => 'Amun Pian cintang kutak ngini, suril (awan katasunduk pahadangan) akan ditampaiakan ka Pian bahwasa lagi dikirim ka pamakai.',
 'passwordreset-email' => 'Alamat suril:',
 'passwordreset-emailtitle' => 'Rarincian akun pada {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuah pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). pPamakai barikut {{PLURAL:$3|akun|akun}}
+'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}}
 tarait awan suril:
 
 $2
@@ -683,18 +700,19 @@ $2
 Pian 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
 Katasunduk pahadangan: $2',
-'passwordreset-emailsent' => 'Sabuah suril pangingat sudah takirim.',
-'passwordreset-emailsent-capture' => 'Sabuah suril pangingat sudah dikirim, nangkaya ditampaiakan di bawah.',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Ganti alamat suril',
 'changeemail-header' => 'Ganti akun alamat suril',
-'changeemail-text' => 'Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan parubahan ngini.',
+'changeemail-text' => 'Manuntungakan purmulir ngini hagan mangganti alamat suril Pian. Pian akan parlu mamasukakan katasunduk Pian hagan mayakinakan paubahan ngini.',
 'changeemail-no-info' => 'Pian musti babuat log hagan babuat ka tungkaran ngini langsung.',
 'changeemail-oldemail' => 'Alamat suril wayah ni:',
 'changeemail-newemail' => 'Alamat suril puga:',
 'changeemail-none' => '(kadada)',
+'changeemail-password' => 'Sandi {{SITENAME}} Pian:',
 'changeemail-submit' => 'Ganti suril',
 'changeemail-cancel' => 'Walangi',
 
@@ -725,14 +743,14 @@ Katasunduk pahadangan: $2',
 'preview' => 'Tilik',
 'showpreview' => 'Tampaiakan titilikan',
 'showlivepreview' => 'Titilikan langsung',
-'showdiff' => 'Tampaiakan parubahan',
+'showdiff' => 'Tampaiakan paubahan',
 'anoneditwarning' => "'''Paringatan:''' Pian baluman babuat log.
 Alamat IP Pian akan dirakam dalam tungkaran babakan halam",
 'anonpreviewwarning' => "''Pian baluman babuat log. Manyimpan akan tarakam alamat IP Pian pada sajarah bahari tungkaran ngini.''",
-'missingsummary' => "'''Pangingat:''' Pian kada manyadiakan sabuah kasimpulan babakan.
+'missingsummary' => "'''Pangingat:''' Pian kada manyadiakan sabuting kasimpulan babakan.
 Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada bakasimpulan.",
-'missingcommenttext' => 'Muhun buati sabuah kumintar di bawah ngini.',
-'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuah subjek/judul gasan kumin ngini.
+'missingcommenttext' => 'Muhun buati sabuting kumintar di bawah ngini.',
+'missingcommentheader' => "'''Pangingat:''' Pian kada manyadiakan sabuting subjek/judul gasan kumin ngini.
 Amun Pian klik \"{{int:savearticle}}\" pulang, babakan Pian tasimpan kada basubjek/bajudul.",
 'summary-preview' => 'Tilikan kasimpulan:',
 'subject-preview' => 'Titilikan subyek/judul:',
@@ -773,7 +791,7 @@ Pinanya ini sudah diugahakan atawa dihapus parhatan Pian maniringi tungkaran nan
 'loginreqlink' => 'Babuat log',
 'loginreqpagetext' => 'Pian musti $1 hagan maniringi rungkaran-tungkaran lain.',
 'accmailtitle' => 'Katasunduk takirim.',
-'accmailtext' => "Sabuah katasunduk babarang gasan [[User talk:$1|$1]] sudah dikirim ka $2.
+'accmailtext' => "Sabuting katasunduk babarang gasan [[User talk:$1|$1]] sudah dikirim ka $2.
 
 Katasunduk gasan pamakai hanyar nangini kawa diubah pintang tungkaran ''[[Special:ChangePassword|ubah katasunduk]]'' wayah babuat log.",
 'newarticle' => '(Hanyar)',
@@ -788,16 +806,16 @@ atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} mambabak tungkaran ngini]</span>
 'noarticletext-nopermission' => 'Parhatan ni kadada naskah di tungkaran ngini.
 Pian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul ngini]] pintang tungkaran lain,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log barait].</span>.',
-'userpage-userdoesnotexist' => 'Akun pamuruk "<nowiki>$1</nowiki>" kada tadaptar.
-Muhun pariksa amun Pian handak maulah/mambabak tungkaran ini.',
-'userpage-userdoesnotexist-view' => 'Akun pamuruk "$1" kada tadaptar.',
-'blocked-notice-logextract' => 'Pamuruk nangini parhatan ini diblukir.
-Log blukir pahabisannya tasadia di bawah ini gasan rujukan:',
-'clearyourcache' => "'''Catatan: Habis manyimpan, Pian harus malingarakan cache panjalajah web Pian hagan malihat parubahan.'''
-*'''Firefox/Safari:''' tahan ''Shift'' parhatan klik ''Reload'', atawa picik ''Ctrl-F5'' atawa ''Ctrl-R'' (''Command-R'' pada sabuah Mac);
-* '''Google Chrome:''' picik ''Ctrl-Shift-R'' (''Command-Shift-R''  pada sabuah Mac)
+'userpage-userdoesnotexist' => 'Akun pamakai "<nowiki>$1</nowiki>" kada tadaptar.
+Muhun pariksa/ditukui amun Pian handak maulah/mambabak tungkaran ngini.',
+'userpage-userdoesnotexist-view' => 'Akun pamakai "$1" kada tadaptar.',
+'blocked-notice-logextract' => 'Pamakai nangini parhatan diblukir.
+Log blukir pahabisannya tasadia di bawah ngini gasan rujukan:',
+'clearyourcache' => "x'''Catatan: Habis manyimpan, Pian harus malingarakan cache panjalajah web Pian hagan malihat paubahan.'''
+*'''Firefox/Safari:''' tahan ''Shift'' parhatan klik ''Reload'', atawa picik ''Ctrl-F5'' atawa ''Ctrl-R'' (''Command-R'' pada sabuting Mac);
+* '''Google Chrome:''' picik ''Ctrl-Shift-R'' (''Command-Shift-R''  pada sabuting Mac)
 *'''Internet Explorer:''' tahan ''Ctrl'' parhatan klik ''Refresh,'' atawa picik ''Ctrl-F5''
-* '''Konqueror:''' klik ''Reload'' atawa picik ''F5''
+* '''Konqueror:''' kalik ''Reload'' atawa picik ''F5''
 *'''Opera:''' barasihakan cache pada ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Tip:''' Puruk picikan \"{{int:showpreview}}\" hagan tis CSS hanyar Pian sabalum manyimpan.",
 'userjsyoucanpreview' => "'''Tip:''' Puruk picikan \"{{int:showpreview}}\" hagan tis JavaScript hanyar Pian sabalum manyimpan.",
@@ -813,38 +831,38 @@ Log blukir pahabisannya tasadia di bawah ini gasan rujukan:',
 Inatakan bahwasa saragam  tungkaran-tungkaran .css wan .js mamuruk aksara halus, cuntuh {{ns:user}}:Foo/vector.css sawagai tandingan {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Dihanyarakan)',
 'note' => "'''Catatan:'''",
-'previewnote' => "'''Ingatakanlah bahwasa ngini titilikan haja''' Parubahan Pian nang baluman disimpan!",
+'previewnote' => "'''Ingatakanlah bahwasa ngini titilikan haja''' Paubahan Pian baluman disimpan!",
 'continue-editing' => 'Lanjutakan mambabak',
 'previewconflict' => 'Titilikan ini mancarminakan naskah dalam naskah wilayah atas babakan sawagai mana ini akan mancungul amun disimpan.',
 'session_fail_preview' => "'''Ampun! Kami kada kawa manarusakan babakan Pian karana kahilangan sési data.'''
 Cubai pang sa'asa pulang.
 Amun magun kada kulihan, cubai [[Special:UserLogout|kaluar log]] wan imbah itu babuat log pulang.",
-'session_fail_preview_html' => "'''Kami kada kawa manarusakan babakan Pian karana kahilangan wayah data.'''
+'session_fail_preview_html' => "'''Kami kada kawa manarusakan babakan Pian marga kahilangan wayah data.'''
 
-''Marga {{SITENAME}} mangkawa'akan HTML mantah, titilikan disungkupakan sawagai pancahagahan sarangan Javascript.''
+''Marga {{SITENAME}} mangkawa'akan HTML mantah, titilikan disungkupakan sawagai pancagahan sarangan Javascript.''
 
-'''Amun nangini adalah sabuah parcubaan babakan nang sabujurnya, muhun cubai lagi.'''
-Amun ini masih haja kada bagawi, cubai [[Special:UserLogout|kaluar log]] wan babuat log pulang.",
-'token_suffix_mismatch' => "'''Babakan Pian sudah kada ditarima karana aplikasi Pian mahancuri tanda baca pada babakan token.'''
+'''Amun nangini adalah sabuting parcubaan babakan nang sabujurnya, muhun cubai lagi.'''
+Amun ngini masih haja kada bagawi, cubai [[Special:UserLogout|kaluar log]] wan babuat log pulang.",
+'token_suffix_mismatch' => "'''Babakan Pian sudah kada ditarima marga aplikasi Pian mahancuri tanda baca pada babakan token.'''
 Babakan ini kada ditarima hagan mancagah kasalahan pada naskah tungkaran.
-Nangini ambahanu tajadi amun Pian mamuruk sabuah layanan proxy buggy bapandal web kada bangaran.",
+Nangini bahanu tajadi amun Pian mamuruk sabuting layanan proxy buggy bapandal web kada bangaran.",
 'edit_form_incomplete' => "'''Babarapa hagian matan purmulir babakan kada sampai server; pariksa pulang apakah babakan Pian tatap utuh wan cubai lagi.'''",
 'editing' => 'Mambabak $1',
 'creating' => 'Ma-ulah $1',
 'editingsection' => 'Mambabak $1 (hagian)',
 'editingcomment' => 'Mambabak $1 (hagian hanyar)',
 'editconflict' => 'Babakan bacakut: $1',
-'explainconflict' => "Ada urang lain nang sudah maubah tungkaran ini parhatan Pian mula mambabak ini.
-Naskah atas baisi naskah tungkaran sawagai dimapa ini ada hahanyaran ini.
-Parubahan Pian ditampaiakan pada naskah di bawah.
-Pian pinanya harus manggabungakan parubahan Pian ka dalam naskah nang ada.
-Naskah nang di atas '''haja''' nang akan tasimpan amung Pian manikin \"{{int:savearticle}}\".",
+'explainconflict' => "Ada urang lain nang sudah maubah tungkaran ini parhatan Pian bamula mambabak ngini.
+Naskah atas baisi naskah tungkaran wayah ini.
+Paubahan Pian ditampaiakan pada naskah di bawah.
+Pinanya Pian harus manggabungakan paubahan Pian ka dalam naskah nang ada.
+Naskah nang di atas '''haja''' nang akan tasimpan lamun Pian manikin \"{{int:savearticle}}\".",
 'yourtext' => 'Naskah Pian',
 'storedversion' => 'Ralatan tasimpan',
 'nonunicodebrowser' => "'''Paringatan: Panjalajah web Pian kada manyukung unicode.'''
 Sabuah pambulatan gawian di wadah ini mambulihakan Pian aman mambabak tutungkaran: karaktir non-ASCII akan cungul pada kutak babakan sawagai kudi hiksadisimal.",
 'editingold' => "'''Paringatan: Pian lagi mambabak ralatan lawas matan tungkaran ini.'''
-Amun Pian manyimpan ini, babarapa paparubahan dulah imbah ralatan nangini akan tanggal.",
+Amun Pian manyimpan ini, babarapa paubahan diulah limbah ralatan nangini akan tanggal.",
 'yourdiff' => 'Nang balain',
 'copyrightwarning' => "Muhun dicatat bahwasanya samunyaan sumbangan ka {{SITENAME}} adalah sudah dipartimbangkan disabarakan di bawah $2 (lihati $1 gasan rincian). Amun Pian kada handak tulisan Pian dibabak wan disabarakan, kada usah mangirim ini ka sia. <br />
 Pian jua bajanji ka kami amun Pian manulis ini saurangan, atawa manjumput ini matan sabuah asal mula ampun umum atawa asal mula lainnya nang samacam.
@@ -859,15 +877,15 @@ Nangini kada kawa disimpan.",
 Pian kawa amun handak cut-n-paste naskah ka sabuah barakas naskah wan simpan ini gasan kaina.
 
 Pambakal nang manyunduk manjalasakan kaini: $1",
-'protectedpagewarning' => "'''Paringatan: Tungkaran ini sudah dilindungi laluai pamuruk awan hak istimiwa pambakal nang kawa mambabak ini.'''
-Log masuk pauncitan disadiakan di bawah gasan rujukan:",
-'semiprotectedpagewarning' => "'''Catatan:''' Tungkaran ini sudah dilindungi laluai pamuruk tadaptar haja nang kawa mambabak.
-Log masuk pauncitan disadiakan di bawah gasan rujukan:",
-'cascadeprotectedwarning' => "'''Paringatan:''' Tungkaran ini sudah dilindungi laluai pamuruk awan hak istimiwa pambakal haja nang kawa mambabak, karana ini tamasuk dalam baumpat parlindungan barénténg {{PLURAL: $1|tungkaran|tutungkaran}}:",
-'titleprotectedwarning' => "'''Paringatan: Tungkaran ini sudah dilindungi laluai [[Special:ListGroupRights|hak khas]] diparluakan hagan maulah ini.'''
-Log masuk pauncitan disadiakan di bawah gasan rujukan:",
-'templatesused' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di tungkaran ini:',
-'templatesusedpreview' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di titilikan ini:',
+'protectedpagewarning' => "'''Paringatan: Tungkaran ngini sudah dilindungi nang akibatnya pamakai awan hak istimiwa pambakal nang kawa mambabak ini.'''
+Log masuk pauncitnya disadiakan di bawah gasan rujukan:",
+'semiprotectedpagewarning' => "'''Catatan:''' Tungkaran ngini sudah dilindungi nang akibatnya pamakai tadaptar haja nang kawa mambabak.
+Log masuk pauncitnya disadiakan di bawah gasan rujukan:",
+'cascadeprotectedwarning' => "'''Paringatan:''' Tungkaran ngini sudah dilindungi nang akibatnya pamakai awan hak istimiwa pambakal haja nang kawa mambabak, sualnya ngini tamasuk dalam baumpat parlindungan barénténg {{PLURAL: $1|tungkaran|tutungkaran}}:",
+'titleprotectedwarning' => "'''Paringatan: Tungkaran ngini sudah dilindungi nang akibatnya [[Special:ListGroupRights|hak khas]] diparluakan hagan maulah ngini.'''
+Log masuk pauncitnya disadiakan di bawah gasan rujukan:",
+'templatesused' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di tungkaran ngini:',
+'templatesusedpreview' => '{{PLURAL:$1|Citakan|Citakan}} nang digunakan di titilikan ngini:',
 'templatesusedsection' => "{{PLURAL:$1|Citakan|Cicitakan}} nang diguna'akan di hagian ini:",
 'template-protected' => '(dilindungi)',
 'template-semiprotected' => '(semi-dilindungi)',
@@ -892,10 +910,19 @@ Ini kadada panjalasan.',
 'edit-gone-missing' => 'Kada kawa mamutakhirakan tungkaran ini.
 Ini cungul pinanya sudah tahapus.',
 'edit-conflict' => 'Babakan bacakut.',
-'edit-no-change' => 'Babakan Pian diabaiakan, karana kadada parubahan diulah ka naskah ini.',
-'edit-already-exists' => 'Kada kawa maulah sabuah tungkaran hanyar.
+'edit-no-change' => 'Babakan Pian diabaiakan, karana kadada paubahan diulah ka naskah ngini.',
+'edit-already-exists' => 'Kada kawa maulah sabuting tungkaran hanyar.
 Nangini sudah ada.',
 'defaultmessagetext' => 'Naskah baku pasan',
+'content-failed-to-parse' => 'Gagal manjabarakan isi $2 gasan model $1: $3',
+'invalid-content-data' => 'Data isi kada sah',
+'content-not-allowed-here' => 'Isi "$1" kada diijinakan di tungkaran [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'teks wiki',
+'content-model-text' => 'teks polos',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Paringatan:''' Tungkaran ini mangandung kabanyakan pungsi parser kiauan.
@@ -905,11 +932,11 @@ Nangini harusnya takurang matan $2 {{PLURAL:$2|kiauan|kiauan-kiauan}}, ada {{PLU
 'post-expand-template-inclusion-warning' => "'''Paringatan:''' Citakan nang diumpatakan takarannya kaganalan.
 Babarapa citakan akan kada taumpatakan.",
 'post-expand-template-inclusion-category' => 'Tungkaran-tungkaran nang citakan baumpat limpuar',
-'post-expand-template-argument-warning' => "'''Paringatan:''' Tungkaran ini mangandung paling kada sabuah kalimat citakan wan ukuran panyingkaiannya kaganalan. Kalimat-kalimat nangitu sudah diabaiakan.",
+'post-expand-template-argument-warning' => "'''Paringatan:''' Tungkaran ngini mangandung paling kada sabuting kalimat citakan wan ukuran panyingkaiannya kaganalan. Kalimat-kalimat nangitu sudah diabaiakan.",
 'post-expand-template-argument-category' => 'Tungkaran-tungkaran nang mangandung kalimat-kalimat citakan diabaiakan',
 'parser-template-loop-warning' => 'Citakan baulang takantup: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Citakan batas kadalaman recursi limpuar ($1)',
-'language-converter-depth-warning' => 'Batas kadalaman pakonversi bahasa limpuar ($1)',
+'language-converter-depth-warning' => 'Batas kadalaman pangonversi basa limpuar ($1)',
 'node-count-exceeded-category' => 'Tungkaran di mana node-count tarlalui',
 'node-count-exceeded-warning' => 'Tungkaran malabihi node-count',
 'expansion-depth-exceeded-category' => 'Tungkaran dimana kadalaman ikspansi talalui',
@@ -918,7 +945,7 @@ Babarapa citakan akan kada taumpatakan.",
 
 # "Undo" feature
 'undo-success' => 'Babakan kawa diwalangi.
-Muhun pariksa panandingan di bawah hagan mayakinakan ini apa nang Pian handak gawi, wan imbah itu simpan parubahan di bawah hagan manuntungakan pawalangan babakan.',
+Tulung dipariksa panandingan di bawah hagan mayakinakan ngini apa nang Pian handak gawi, wan limbah itu simpan paubahan di bawah hagan manuntungakan pawalangan babakan.',
 'undo-failure' => 'Babakan ini kada kawa diwalangi karana ada cakutan di tangah babakan-babakan.',
 'undo-norev' => 'Babakan kada kawa diwalangi karana ini kadada atawa tahapus.',
 'undo-summary' => '←Mawalangakan ralatan $1 ulih [[Special:Contributions/$2|$2]] ([[User talk:$2|Pandir]])',
@@ -1036,7 +1063,7 @@ $1",
 'revdel-restore-visible' => 'Ralatan-ralatan kalihatan',
 'pagehist' => 'Sajarah tungkaran',
 'deletedhist' => 'Halam tahapus',
-'revdelete-hide-current' => 'Tasalah manyungkupakan nang batanggal $1, $2: ini adalah ralatan tahanyar.
+'revdelete-hide-current' => 'Tasalah manyungkupakan nang batanggal $1, $2: ngini adalah ralatan pahanyarnya.
 Ini kada kawa disungkupakan.',
 'revdelete-show-no-access' => 'Tasalah manampaiakan nang batanggal $1, $2: nangini sudah ditandai "tabatas".
 Pian kada kawa malihati ini.',
@@ -1058,12 +1085,12 @@ Muhun pariksa lolog.',
 
 # Suppression log
 'suppressionlog' => 'Log panikinan',
-'suppressionlogtext' => 'Nang di bawah adalah sabuting daptar matan pahapusan wan pamblukiran tamasuk isi tasungkup matan pambakal. Lihati [[Special:BlockList|Daptar diblukir]] gasan daptar matan uprasi tahanyar tatangatan wan blukir.',
+'suppressionlogtext' => 'Nang di bawah adalah sabuting daptar matan pahapusan wan pamblukiran tamasuk isi tasungkup matan pambakal. Lihati [[Special:BlockList|Daptar diblukir]] gasan daptar matan uprasi pahanyarnya tatangatan wan blukir.',
 
 # History merging
 'mergehistory' => 'Gabungakan hahalam tungkaran',
-'mergehistory-header' => 'Tungkaran ngini mambulihakan Pian manggabungakan raralatan matan asa tungkaran asal mula ka sabuah tungkaran tahanyar.
-Yakini bahwasa parubahan ngini masih maharagu tarus halam lawas tungkaran.',
+'mergehistory-header' => 'Tungkaran ngini mambulihakan Pian manggabungakan raralatan matan asa tungkaran asal mula ka sabuting tungkaran pahanyarnya.
+Yakini bahwasa paubahan ngini masih maharagu tarus halam lawas tungkaran.',
 'mergehistory-box' => 'Gabungakan raralatan matan dua tungkaran:',
 'mergehistory-from' => 'Tungkaran asal mula:',
 'mergehistory-into' => 'Tungkaran tatuju:',
@@ -1166,15 +1193,6 @@ Tarai pamintaan Pian lawan ''all:'' gasan manggagai samunyaan isi (tamasuk tungk
 Pian kawa manggagai lung Google parhatan ini.
 Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 
-# Quickbar
-'qbsettings' => 'Bilahhancap',
-'qbsettings-none' => 'Kadada',
-'qbsettings-fixedleft' => 'Tatap di kiwa',
-'qbsettings-fixedright' => 'Tatap di kanan',
-'qbsettings-floatingleft' => 'Mangambang sabalah kiwa',
-'qbsettings-floatingright' => 'Mangambang sabalah kanan',
-'qbsettings-directionality' => 'Tatap, tagantung pada ampah skrip matan bahasa Pian',
-
 # Preferences page
 'preferences' => 'Kakatujuan',
 'mypreferences' => 'Nang ulun katuju',
@@ -1189,11 +1207,11 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 'prefs-datetime' => 'Tanggal wan waktu',
 'prefs-labs' => 'Fitur Labs',
 'prefs-personal' => 'Data awak',
-'prefs-rc' => 'Parubahan tahanyar',
+'prefs-rc' => 'Paubahan pahanyarnya',
 'prefs-watchlist' => 'Paitihan',
 'prefs-watchlist-days' => 'Rikinan hari-hari ditampaiakan di daptar itihan:',
 'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|hari|hahari}}',
-'prefs-watchlist-edits' => 'Rikinan paningginya matan parubahan hagan ditampaiakan pada singkaian daptar itihan:',
+'prefs-watchlist-edits' => 'Rikinan paningginya matan paubahan hagan ditampaiakan pada singkaian daptar itihan:',
 'prefs-watchlist-edits-max' => 'Rikinan paningginya:1000',
 'prefs-watchlist-token' => 'Token itihan:',
 'prefs-misc' => 'Balalain',
@@ -1203,7 +1221,7 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 'prefs-email' => 'Pipilihan suril',
 'prefs-rendering' => 'Pancungulan',
 'saveprefs' => 'Simpan',
-'resetprefs' => 'Kusungakan paparubahan kada tasimpan',
+'resetprefs' => 'Walangakan paubahan',
 'restoreprefs' => 'Bulikakan samunyaan sesetélan default',
 'prefs-editing' => 'Pambabakan',
 'prefs-edit-boxsize' => 'Ukuran lalungkang babakan',
@@ -1213,10 +1231,10 @@ Catatan nang dihaharnya matan isi {{SITENAME}} kawa-ai sudah kadaluarsa.',
 'resultsperpage' => 'Hantukan par tungkaran:',
 'stub-threshold' => 'Ambang watas gasan pormat <a href="#" class="stub">taautan rintisan</a>:',
 'stub-threshold-disabled' => 'Kada kawa-akan',
-'recentchangesdays' => 'Hahari nang manampaiakan parubahan tahanyar:',
+'recentchangesdays' => 'Jumlah hari nang manampaiakan paubahan pahanyarnya:',
 'recentchangesdays-max' => 'Paling lawas $1 {{PLURAL:$1|hari|hahari}}',
 'recentchangescount' => 'Rikinan babakan nang ditampaiakan default:',
-'prefs-help-recentchangescount' => 'Ini tamasuk parubahan tahanyar, halam-halam tungkaran, wan log-log.',
+'prefs-help-recentchangescount' => 'Ngini tamasuk paubahan pahanyarnya, sajarah halam tungkaran, wan log-log.',
 'prefs-help-watchlist-token' => 'Maisi kutak ngini lawan kunci rahasia (PIN) akan mahasilakan sindikasi RSS hagan daptar pantauan Anda. Siapa gin nang tahu kunci ngini kawa mambaca daptar itihan Pian, jadi pilihi nilainya bahati-hati
 Barikut ngini adalah nilai acak nang kawa Pian puruk: $1',
 'savedprefs' => 'Kakatujuan Pian sudah ham disimpan.',
@@ -1345,7 +1363,7 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'right-edit' => 'Mambaiki tungkaran',
 'right-createpage' => 'Ulah tutungkaran (nang lainan tutungkaran pamandiran)',
 'right-createtalk' => 'Maulah tutungkaran pamandiran',
-'right-createaccount' => 'Ulah akun pamuruk hanyar',
+'right-createaccount' => 'Ulah akun pamakai hanyar',
 'right-minoredit' => 'Tandai bababakan sawagai sapalih',
 'right-move' => 'Mamindahakan tungkaran',
 'right-move-subpages' => 'Ugahakan tutungkaran awan subtumgkaran-nya',
@@ -1357,7 +1375,7 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'right-reupload-own' => 'Manulistindih barakas nang ada unggahan ulih urang nang sama',
 'right-reupload-shared' => 'Manulak babarakas pada panyimpanan media lokal basamaan',
 'right-upload_by_url' => 'Hunggahakan babarakas matan sabuah URL',
-'right-purge' => 'Limpuarakan timbuluk situs gasan asa tungkaran kada pambaritahuan',
+'right-purge' => 'Limpuarakan timbuluk situs gasan asa tungkaran kada pamadahan',
 'right-autoconfirmed' => 'Mambabak tutungkaran sami-dilindungi',
 'right-bot' => 'Ditindak sawagai sabuah proses utumatis',
 'right-nominornewtalk' => 'Kadada babakan sapalih di tutungkaran pamandiran nang mancungulakan tampaian pasan puga',
@@ -1365,9 +1383,10 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'right-writeapi' => 'Puruk panulisan API',
 'right-delete' => 'Mahapus tungkaran',
 'right-bigdelete' => 'Hapus tutungkaran awan hahalam ganal',
+'right-deletelogentry' => 'Hapus wan walangakan pahapusan masukan log tartantu',
 'right-deleterevision' => 'Mahapus wan mawalangi hapus raralatan tatantu matan tutungkaran',
 'right-deletedhistory' => 'Tiringi mamasukan halam tahapus, kada banaskah tarait',
-'right-deletedtext' => 'Tiringi naskah tahapus wan parubahan antar raralatan tahapus',
+'right-deletedtext' => 'Tiringi naskah tahapus wan paubahan antar raralatan nang tahapus',
 'right-browsearchive' => 'Manggagai tungkaran nang sudah dihapus',
 'right-undelete' => 'Mambulikakan sabuah tungkaran tahapus',
 'right-suppressrevision' => 'Maniring pulang wan mambulikakan raralatan matan papambakal',
@@ -1391,7 +1410,7 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'right-importupload' => 'Iimpur tutungkaran matan sabuah barakas hunggahan',
 'right-patrol' => "Tandai bababakan nang lain sawagai ta'awasi",
 'right-autopatrol' => "Babakan ampun surang utumatis ditandai sawagai ta'awasi",
-'right-patrolmarks' => 'Tiringi tanda parubahan tahanyar',
+'right-patrolmarks' => 'Tiringi tanda paubahan pahanyarnya',
 'right-unwatchedpages' => 'Tiringi sabuah daptar tutungkaran nang kada diitihi',
 'right-mergehistory' => 'Gabungakan halam matan tutungkaran',
 'right-userrights' => 'Babak sabarataan hak pamuruk',
@@ -1406,8 +1425,8 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'newuserlogpagetext' => 'Ngini adalah sabuah log paulahan pamuruk.',
 
 # User rights log
-'rightslog' => 'Log parubahan hak masuk',
-'rightslogtext' => 'Nangini adalah sabuah log paparubahan ka hahak pamuruk.',
+'rightslog' => 'Log paubahan hak masuk',
+'rightslogtext' => 'Nangini sabuting log paubahan ka hak pamakai.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'baca tungkaran ini',
@@ -1447,17 +1466,17 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'action-sendemail' => 'Kirim suril',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|parubahan|parubahan}}',
+'nchanges' => '$1 {{PLURAL:$1|paubahan|paubahan}}',
 'recentchanges' => 'Paubahan pahanyarnya',
 'recentchanges-legend' => 'Pilihan paubahan pahanyarnya',
-'recentchanges-summary' => 'Jajak parubahan wiki pahanyarnya pada tungkaran ngini',
-'recentchanges-feed-description' => 'Susuri parubahan pahanyarnya dalam wiki di kitihan ini',
-'recentchanges-label-newpage' => 'Babakan ngini maulah sabuah tungkaran hanyar',
-'recentchanges-label-minor' => 'Ngini adalah sabuah babakan sapalih',
+'recentchanges-summary' => 'Jajak paubahan wiki pahanyarnya pada tungkaran ngini',
+'recentchanges-feed-description' => 'Susuri paubahan pahanyarnya dalam wiki di kitihan ini',
+'recentchanges-label-newpage' => 'Babakan ngini maulah sabuting tungkaran hanyar',
+'recentchanges-label-minor' => 'Ngini sabuting babakan sapalih',
 'recentchanges-label-bot' => 'Babakan ngini digawi ulih saikung bot',
 'recentchanges-label-unpatrolled' => "Babakan ngini baluman ta'awasi",
 'rcnote' => "Di bawah ni {{PLURAL:$1|'''1'''|'''$1'''}} paubahan pahanyarnya dalam {{PLURAL:$2|'''1''' hari|'''$2''' hari}} tauncit, sampai $4 pukul $5.",
-'rcnotefrom' => "Di bawah ngini parubahan tumatan '''$2''' (ditampaiakan sampai '''$1''' parubahan)",
+'rcnotefrom' => "Di bawah ngini paubahan tumatan '''$2''' (ditampaiakan sampai '''$1''' paubahan)",
 'rclistfrom' => 'Tampaiakan paubahan pahanyarnya matan $1',
 'rcshowhideminor' => '$1 pambabakan sapalih',
 'rcshowhidebots' => '$1 bot',
@@ -1483,15 +1502,15 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 'rc-old-title' => 'aslinya diulah sawagai "$1"',
 
 # Recent changes linked
-'recentchangeslinked' => 'Parubahan tarait',
-'recentchangeslinked-feed' => 'Parubahan tarait',
-'recentchangeslinked-toolbox' => 'Parubahan tarait',
-'recentchangeslinked-title' => 'Parubahan nang tarait lawan "$1"',
-'recentchangeslinked-noresult' => 'Kadada parubahan pada tautan tutungkaran salawas wayah ditantuakan',
-'recentchangeslinked-summary' => "Ngini adalah sabuah daptar parubahan nang diulah hahanyar ngini pada tungkaran batautan matan sabuah tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
+'recentchangeslinked' => 'Paubahan tarait',
+'recentchangeslinked-feed' => 'Paubahan tarait',
+'recentchangeslinked-toolbox' => 'Paubahan tarait',
+'recentchangeslinked-title' => 'Paubahan nang tarait lawan "$1"',
+'recentchangeslinked-noresult' => 'Kadada paubahan pada tautan tutungkaran salawas wayah ditantuakan',
+'recentchangeslinked-summary' => "Ngini sabuting daptar paubahan nang diulah hahanyar ngini pada tungkaran batautan matan sabuting tungkaran tartantu (atawa ka angguta matan sabuah tumbung tartantu).
 Tutungkaran dalam [[Special:Watchlist|daptar itihan Pian]] ditandai '''kandal'''.",
 'recentchangeslinked-page' => 'Ngaran tungkaran:',
-'recentchangeslinked-to' => 'Tampaiakan parubahan matan tungkaran-tungkaran nang tataut lawan tungkaran nang disurungakan',
+'recentchangeslinked-to' => 'Tampaiakan paubahan matan tutungkaran nang bataut lawan tungkaran nang disurungakan',
 
 # Upload
 'upload' => 'Hunggahakan barakas',
@@ -1522,7 +1541,7 @@ Janaki [[Special:NewFiles|galeri babarakas hanyar]] gasan  tampaian visual.',
 'filename' => 'Ngaran barakas',
 'filedesc' => 'Kasimpulan',
 'fileuploadsummary' => 'Kasimpulan:',
-'filereuploadsummary' => 'Parubahan barakas:',
+'filereuploadsummary' => 'Paubahan barakas:',
 'filestatus' => 'Status hak-rekap:',
 'filesource' => 'Asal mula:',
 'uploadedfiles' => 'Babarakas tahunggah',
@@ -1546,7 +1565,7 @@ Nang diijinakan {{PLURAL:$3|adalah macam barakas|adalah mamacam barakas}} $2.',
 'filename-tooshort' => 'Ngaran barakas kahandapan.',
 'filetype-banned' => 'Macam barakas ini ditangati.',
 'verification-error' => 'Barakas nangini kada lulus paitihan.',
-'hookaborted' => 'Parubahan nang Pian cuba ulah sudah digagalakan ulih unjun ekstensi.',
+'hookaborted' => 'Paubahan nang Pian cuba ulah sudah digagalakan ulih unjun ekstensi.',
 'illegal-filename' => 'Ngaranbarakas kada dibulihakan.',
 'overwrite' => 'Manindih tulis sabuah barakas nang ada kada dibulihakan.',
 'unknown-error' => 'Kasalahan kada dipinandui tajadi.',
@@ -1706,11 +1725,10 @@ Gasan kaamanan baik, img_auth.php dipajahakan.',
 # HTTP errors
 'http-invalid-url' => 'URL kada sah: $1',
 'http-invalid-scheme' => 'URL lawan skema "$1" kada disukung.',
-'http-request-error' => 'Parmintaan HTTP gagal karana kasalah kada dikatahui.',
+'http-request-error' => 'Maminta HTTP gagal karana kasalah kada dikatahui.',
 'http-read-error' => 'Kasalahan baca HTTP.',
-'http-timed-out' => 'Parmintaan HTTP habis wayahnya.',
+'http-timed-out' => 'Maminta HTTP habis waktunya.',
 'http-curl-error' => 'Kasalahan pas maambil URL: $1',
-'http-host-unreachable' => 'Kada kawa mancapai URL.',
 'http-bad-status' => 'Ada sabuah masalah pas maminta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1883,11 +1901,12 @@ Ngini wayah ini sudah diugahakan ka [[$2]].',
 'withoutinterwiki-legend' => 'Mulaan',
 'withoutinterwiki-submit' => 'Tampaiakan',
 
-'fewestrevisions' => 'Tutungkaran lawan parubahan paling sadikit',
+'fewestrevisions' => 'Tutungkaran lawan paubahan panyadikitnya',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bit|bit}}',
 'ncategories' => '{{PLURAL:$1|tumbung|tutumbung}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|tautan|tautan}}',
 'nmembers' => '$1 {{PLURAL:$1|angguta|angguta}}',
 'nrevisions' => '$1 {{PLURAL:$1|ralatan|raralatan}}',
@@ -1916,15 +1935,16 @@ File-file berikut digunakan tapi tidak ada. File dari repositori asing dapat ter
 'mostlinkedtemplates' => 'Cicitakan tatuju tautan pambanyaknya',
 'mostcategories' => 'Tutungkaran lawan pambanyaknya tutumbung',
 'mostimages' => "Barakas nang rancak diguna'akan",
-'mostrevisions' => 'Tutungkaran lawan parubahan paling banyak',
+'mostinterwikis' => 'Tutungkaran lawan interwiki pambanyaknya',
+'mostrevisions' => 'Tutungkaran lawan paubahan pambanyaknya',
 'prefixindex' => 'Samunyaan tungkaran wan awalan',
-'prefixindex-namespace' => 'Samunyaan tutungkaran baawalan ($1 ngaran-kamar)',
+'prefixindex-namespace' => 'Samunyaan tutungkaran nang ba-awalan (ruang-ngaran $1)',
 'shortpages' => 'Tutungkaran handap',
 'longpages' => 'Tutungkaran panjang',
 'deadendpages' => 'Tutungkaran buntu',
 'deadendpagestext' => 'Tutungkaran barikut kada bataut ka tutungkaran lain pada {{SITENAME}}.',
 'protectedpages' => 'Tutungkaran nang dilindungi',
-'protectedpages-indef' => 'Hanya gasan palindungan lawan jangka waktu kada tabatas',
+'protectedpages-indef' => 'Wastu gasan palindungan lawan jangka waktu kada bawatas',
 'protectedpages-cascade' => 'Palindungan barénténg haja',
 'protectedpagestext' => 'Tutungkaran barikut dilindungi matan pamindahan atawa pambabakan',
 'protectedpagesempty' => 'Kadada tutungkaran nang masih dilindungi awan paramitir ngitu.',
@@ -1937,7 +1957,7 @@ File-file berikut digunakan tapi tidak ada. File dari repositori asing dapat ter
 'usereditcount' => '$1 {{PLURAL:$1|babakan|bababakan}}',
 'usercreated' => '{{GENDER:$3|Diulah}} pada $1 pukul $2',
 'newpages' => 'Tungkaran hanyar',
-'newpages-username' => 'Ngaran pamuruk:',
+'newpages-username' => 'Ngaran pamakai:',
 'ancientpages' => 'Tutungkaran panuhanya',
 'move' => 'Pindahakan',
 'movethispage' => 'Pindahakan tungkaran ini',
@@ -1948,7 +1968,7 @@ Muhun catat bahwasa situs web lain pina-ai bataut ka sabuah barakas awan sabuah
 'notargettext' => 'Pian kada maajuakan sabuah tungkaran atawa pamuruk sasaran malakuakan palakuan ini.',
 'nopagetitle' => 'Kadada tungkaran sasaran',
 'nopagetext' => 'Tungkaran sasaran nang Pian ajuakan kadada.',
-'pager-newer-n' => '{{PLURAL:$1|tahanyar 1|tahanyar $1}}',
+'pager-newer-n' => '{{PLURAL:$1|labih hanyar 1|labih hanyar $1}}',
 'pager-older-n' => '{{PLURAL:$1|talawas 1|talawas $1}}',
 'suppress' => 'Pangawasan',
 'querypage-disabled' => 'Tungkaran istimiwa ngini dikada-kawakan gasan alasan ginawi.',
@@ -1969,6 +1989,7 @@ Muhun catat bahwasa situs web lain pina-ai bataut ka sabuah barakas awan sabuah
 Pian kada mawatasi tiringan lawan mamilih sabuah macam log, ngaran-pamuruk (sansitip kapital), atawa tungkaran tapangaruh (sansitip kapital jua).',
 'logempty' => 'Kadada barang nang parsis pintang log.',
 'log-title-wildcard' => 'Gagai judul ba-awalan awan naskah ngini',
+'showhideselectedlogentries' => 'Tampaiakan/sungkupakan masukan log tapilih',
 
 # Special:AllPages
 'allpages' => 'Samunyaan tungkaran',
@@ -1979,18 +2000,18 @@ Pian kada mawatasi tiringan lawan mamilih sabuah macam log, ngaran-pamuruk (sans
 'allpagesto' => 'Manampaiakan ujung pahabisan tungkaran:',
 'allarticles' => 'Samunyaan tungkaran',
 'allinnamespace' => 'Sabarataan tutungkaran (ngaran-kamar $1)',
-'allnotinnamespace' => 'Sabarataan tutungkaran (lainan di ngaran-kamar $1)',
+'allnotinnamespace' => 'Sabarataan tutungkaran (lainan di ruang-ngaran $1)',
 'allpagesprev' => 'Sabalumnya',
 'allpagesnext' => 'Dudi',
 'allpagessubmit' => 'Tulak',
 'allpagesprefix' => 'Tampilakan tutungkaran bamula lawan:',
 'allpagesbadtitle' => 'Judul tungkaran nang dibari kada sah atawa baisi sabuah awalan antar-bahasa atawa antar-wiki.
 Nangini bisa baisi satu atawa labih karaktir nang saharusnya kadada di judul.',
-'allpages-bad-ns' => '{{SITENAME}} kada baisi ngaran-kamar "$1".',
-'allpages-hide-redirects' => 'Sambunyiakan paalihan',
+'allpages-bad-ns' => '{{SITENAME}} kada baisi ruang-ngaran "$1".',
+'allpages-hide-redirects' => 'Sungkupakan paugahan',
 
 # SpecialCachedPage
-'cachedspecial-refresh-now' => 'Itihi tahanyar.',
+'cachedspecial-refresh-now' => 'Itihi ralatan pahanyarnya.',
 
 # Special:Categories
 'categories' => 'Tutumbung',
@@ -2009,7 +2030,7 @@ Janaki jua [[Special:WantedCategories|tutumbung nang dihandaki]].',
 # Special:LinkSearch
 'linksearch' => 'Manggagai tautan luar',
 'linksearch-pat' => 'Gagai bapola:',
-'linksearch-ns' => 'Ngaran-kamar:',
+'linksearch-ns' => 'Ruang-ngaran:',
 'linksearch-ok' => 'Gagai',
 'linksearch-text' => 'Kartu liar nangkaya "*.wikipedia.org" hingkat diguna\'akan.
 Mamarlukan sadikitnya asa ranah tingkat atas, misalnya "*.org".<br />
@@ -2095,22 +2116,22 @@ Alamat sril Pian pintang [[Special:Preferences|kakatujuan pamuruk Pian]] akan cu
 'watchnologin' => 'Baluman babuat log',
 'watchnologintext' => 'Pian musti [[Special:UserLogin|babuat log]] amun handak magaganti daptar itihan Pian.',
 'addwatch' => 'Tambahi ka daptar itihan',
-'addedwatchtext' => "Tungkaran \"[[:\$1]]\" sudah ditambahakan ke [[Special:Watchlist|daptar itihan]] Pian.
-Parubahan-parubahan salanjutnya pada tungkaran ini dan tungkaran pamandiran taraitnya akan takambit di sia, wan tungkaran itu akan ditampaiakan '''kandal''' pada [[Special:RecentChanges|daptar parubahan tahanyar]] cagar labih mudah diitihi.",
+'addedwatchtext' => "Tungkaran \"[[:\$1]]\" sudah ditambahakan ka [[Special:Watchlist|daptar itihan]] Pian.
+Paubahan-paubahan salanjutnya pada tungkaran ngini dan tungkaran pamandiran taraitnya akan takambit di sini, wan tungkaran itu akan ditampaiakan '''kandal''' pada [[Special:RecentChanges|daptar paubahan pahanyarnya]] cagar labih mudah diitihi.",
 'removewatch' => 'Buang matan daptar itihan',
 'removedwatchtext' => 'Tungkaran "[[:$1]]" sudah dihapus matan [[Special:Watchlist|daptar itihan]] Pian.',
 'watch' => 'Itih',
 'watchthispage' => 'Itihi tungkaran ini',
 'unwatch' => 'walang maitihi',
 'unwatchthispage' => 'Mandak maitihi',
-'notanarticle' => 'Lainan sabuah tungkaran isi',
+'notanarticle' => 'Lainan sabuting tungkaran isi',
 'notvisiblerev' => 'Ralatan tauncit ulih saurang pamuruk babida sudah dihapus',
 'watchnochange' => 'Kadada nang Pian itihi dibabak parhatan jangka wayah ngitu.',
 'watchlist-details' => '{{PLURAL:$1|$1 tungkaran|$1 tungkaran}} dalam daptar itihan Pian, kada mahitung tungkaran pamandiran.',
 'wlheader-enotif' => 'Suril pamadahan dipajahi.',
-'wlheader-showupdated' => "Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
-'watchmethod-recent' => 'pariksa bababakan tahanyar gasan tungkaran nang diitihi.',
-'watchmethod-list' => 'pariksa tutungkaran nang diitihi gasan bababakan tahanyar',
+'wlheader-showupdated' => "Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
+'watchmethod-recent' => 'pariksa bababakan pahanyarnya gasan tungkaran nang diitihi.',
+'watchmethod-list' => 'pariksa tutungkaran nang diitihi gasan bababakan pahanyarnya',
 'watchlistcontains' => 'Paitihan Pian mangandung $1 {{PLURAL:$1|tungkaran|tutungkaran}}.',
 'iteminvalidname' => "Masalah awan barang '$1', bangaran kada sah...",
 'wlnote' => "Di bawah naya adalah {{PLURAL:$1|paubahan|'''$1''' paubahan}} tauncit dalam '''$2''' jam tauncit, par $3, $4.",
@@ -2120,14 +2141,24 @@ Parubahan-parubahan salanjutnya pada tungkaran ini dan tungkaran pamandiran tara
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Maitihi...',
 'unwatching' => 'Kada jadi maitihi...',
-'watcherrortext' => 'Sabuah kasalahan tajadi parhatan setelan paitihan Pian diubah gasan "$1".',
+'watcherrortext' => 'Sabuting kasalahan tajadi parhatan setelan paitihan Pian diubah gasan "$1".',
 
 'enotif_mailer' => 'Panyurili pamadahan {{SITENAME}}',
 'enotif_reset' => 'Tandai samunyaan tutungkaran sudah diilangi',
 'enotif_impersonal_salutation' => 'Pamuruk {{SITENAME}}',
-'enotif_lastvisited' => 'Janaki $1 gasan samunyaan parubahan mula Pian pauncitan tadi bailang.',
-'enotif_lastdiff' => 'Janaki $1 hagaan maniringi parubahan ngini.',
-'enotif_anon_editor' => 'pamuruk kada-bangaran $1',
+'enotif_subject_deleted' => 'Tungkaran $1 di {{SITENAME}} hudah dihapus ulih {{gender:$2|$2}}',
+'enotif_subject_created' => 'Tungkaran $1 di {{SITENAME}} hudah diulah ulih {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Tungkaran $1 di {{SITENAME}} hudah dipindahakan ulih {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Tungkaran $1 di {{SITENAME}} hudah dibulikakan ulih {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Tungkaran $1 di {{SITENAME}} hudah diubah ulih {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Tungkaran $1 di {{SITENAME}} hudah dihapus pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3.',
+'enotif_body_intro_created' => 'Tungkaran $1 di {{SITENAME}} hudah diulah pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_body_intro_moved' => 'Tungkaran $1 di {{SITENAME}} hudah dipindahakan pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_body_intro_restored' => 'Tungkaran $1 di {{SITENAME}} hudah dibulikakan pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_body_intro_changed' => 'Tungkaran $1 di {{SITENAME}} hudah diubah pada $PAGEEDITDATE ulih {{gender:$2|$2}}, lihat $3 gasan ralatan damini.',
+'enotif_lastvisited' => 'Janaki $1 gasan samunyaan paubahan mula Pian pauncitan tadi bailang.',
+'enotif_lastdiff' => 'Janaki $1 hagan maniringi paubahan ngini.',
+'enotif_anon_editor' => 'pamakai kada-bangaran $1',
 'enotif_body' => 'Halo $WATCHINGUSERNAME,
 
 
@@ -2141,13 +2172,13 @@ Hubungi pambabak:
 suril: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Kami kada akan mangirim pambaritahuan lain amun ada parubahan labih lanjut sampai Pian mailangi tungkaran ngini.
-Pian kawa jua manyetel-pulang bandira pambaritahuan hagan samunyaan tungkaran nang Pian itihi dalam paitihan Pian.
+Kami kada akan mangirim pamadahan lain amun ada paubahan labih lanjut sampai Pian mailangi tungkaran ngini.
+Pian kawa jua manyetel-pulang bandira pamadahan hagan samunyaan tungkaran nang Pian itihi dalam paitihan Pian.
 
-Sistem kakawalan pambaritahuan {{SITENAME}} Pian
+Sistem kakawalan pamadahan {{SITENAME}} Pian
 
 --
-Hagan maubah setelan suril pambaritahuan Piann, ilangi
+Hagan maubah setelan suril pamadahan Piann, ilangi
 {{canonicalurl:{{#special:Preferences}}}}
 
 Hagan maubah setelan paitihan Pian, ilangi
@@ -2167,14 +2198,14 @@ kitihan-bulik wan pangganian labih jauh:
 'exblank' => 'tungkaran dikusungakan',
 'delete-confirm' => 'Hapus "$1"',
 'delete-legend' => 'Hapus',
-'historywarning' => "'''Paringatan:''' Tungkaran nang Pian pasal hagan hapus baisi sabuah halam sakitar $1 {{PLURAL:$1|ralatan|raralatan}}:",
-'confirmdeletetext' => 'Pian handak mahapus sabuah tungkaran awan samunyaan halamnya.
-Muhun mamastiakan amun Pian handak manggawi ini, bahwasa Pian paham akibatnya, wan apa nang Pian gawi ini sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan {{SITENAME}}]].',
+'historywarning' => "'''Paringatan:''' Tungkaran nang akan Pian hapus baisi sabuting sajarah lawan $1 {{PLURAL:$1|ralatan|raralatan}}:",
+'confirmdeletetext' => 'Pian handak mahapus sabuting tungkaran awan samunyaan sajarahnya.
+Pastiakan amun Pian handak manggawi ngini, bahwasa Pian paham akibatnya, wan apa nang Pian gawi ini sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan {{SITENAME}}]].',
 'actioncomplete' => 'Pa-ulahan tuntung',
 'actionfailed' => 'Palakuan luput',
-'deletedtext' => '"$1" sudah tahapus. Lihati $2 sabuah rakaman gasan nang hanyar ni tahapus.',
+'deletedtext' => '"$1" sudah dihapus. Lihati $2 gasan log pahanyarnya tungkaran nang sudah hapus.',
 'dellogpage' => 'Log pahapusan',
-'dellogpagetext' => 'Di bawah ngini adalah sabuah daptar matan pahapusan hahanyar ni.',
+'dellogpagetext' => 'Di bawah ngini sabuting daptar matan pahapusan pahanyarnya.',
 'deletionlog' => 'log pahapusan',
 'reverted' => 'Dibulikakan ka raralatan tadamini',
 'deletecomment' => 'Alasan:',
@@ -2185,8 +2216,8 @@ Muhun mamastiakan amun Pian handak manggawi ini, bahwasa Pian paham akibatnya, w
 ** Parumpakan hak rekap
 ** Vandalisma',
 'delete-edit-reasonlist' => 'Babak alasan pahapusan',
-'delete-toobig' => 'Tungkaran ngini baisi sabuah halam ganal, labih pada $1 {{PLURAL:$1|ralatan|raralatan}}.
-Pahapusan tutungkaran kaini dibatasi hagan mancagah parusakan mandadak di {{SITENAME}}.',
+'delete-toobig' => 'Tungkaran ngini baisi sabuting sajarah pambabakan nang panjang, labih pada $1 {{PLURAL:$1|ralatan|raralatan}}.
+Pahapusan tutungkaran kaini dibatasi hagan mancagah parakaian bakajutan di {{SITENAME}}.',
 'delete-warning-toobig' => 'Tungkaran ngini baisi halam babakan ganal, labih pada $1 {{PLURAL:$1|ralatan|raralatan}}.
 Mahapus ngini kawa mangaruhi databasis oparasi {{SITENAME}};
 jalanakan awan ba-a-awas.',
@@ -2210,14 +2241,14 @@ diubah bulik ka ralatan tauncit ulih $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Sesi luput',
-'sessionfailure' => 'Pinanya ada sabuah masalah awan sesi babuat loh Pian;
-Palakuan ngini sudah diwalangi sawagai pra-awasan malawan sesi pambajakan.
+'sessionfailure' => 'Pinanya ada sabuting masalah awan sesi babuat log Pian;
+Tindakan ngini sudah diwalangi sawagai pra-awasan malawan sesi pambajakan.
 Tulak babulik ka tungkaran sabalumnya, muat-pulang tungkaran ngitu wan lalu-ai cuba pulang.',
 
 # Protect
 'protectlogpage' => 'Log palindungan',
-'protectlogtext' => 'Di bawah adalah sabuah daptar parubahan ka parlindungan tungkaran.
-Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar parlindungan tungkaran tadamini.',
+'protectlogtext' => 'Di bawah adalah sabuting daptar paubahan ka palindungan tungkaran.
+Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar palindungan tungkaran tadamini.',
 'protectedarticle' => "malindungi ''[[$1]]''",
 'modifiedarticleprotection' => 'maubah tingkat perlindungan "[[$1]]"',
 'unprotectedarticle' => 'mahilangakan palindungan "[[$1]]"',
@@ -2225,8 +2256,10 @@ Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar parli
 'protect-title' => 'Malindungi "$1"',
 'protect-title-notallowed' => 'Tiringi tingkat parlindungan matan "$1"',
 'prot_1movedto2' => '[[$1]] dipindahakan ka [[$2]]',
-'protect-badnamespace-title' => 'Ngaran-kamar nang kada-dilindungi',
-'protect-badnamespace-text' => 'Tutungkaran dalam ngaran-kamar ngini kada kawa dilindungi.',
+'protect-badnamespace-title' => 'Ruang-ngaran nang kada-dilindungi',
+'protect-badnamespace-text' => 'Tutungkaran dalam ruang-ngaran ngini kada kawa dilindungi.',
+'protect-norestrictiontypes-text' => 'Tungkaran ngini kada kawa dilindungi marga kadada janis pambatasan nang tasadia.',
+'protect-norestrictiontypes-title' => 'Tungkaran kada-dilindungi',
 'protect-legend' => 'Konpirmasi palindungan',
 'protectcomment' => 'Alasan:',
 'protectexpiry' => 'Kadaluwarsa:',
@@ -2236,16 +2269,16 @@ Janaki [[Special:ProtectedPages|daptar tungkaran talindungi]] gasan daptar parli
 'protect-text' => "Pian kawa maniring atawa mangganti tingkatan palindungan gasan tungkaran '''$1''' di sia.",
 'protect-locked-blocked' => "Pian kada kawa maubah tingkat parlindungan parhatan diblukir.
 Di sia adalah setelan tadamini gasan tungkaran '''$1''':",
-'protect-locked-dblock' => "Tingkat parlindungan kada kawa diubah karana ada sabuah sunduk databasis aktip.
-Di sia adalah setelan tadamini gasan tungkaran '''$1''':",
+'protect-locked-dblock' => "Tingkat palindungan kada kawa diubah marga ada sabuting sunduk databasis aktip.
+Di sia adalah setelan pahanyarnya gasan tungkaran '''$1''':",
 'protect-locked-access' => "Akun Pian kada baisi ijin gasan maubah tingkatan palindungan tungkaran.
 Di sia adalah pangaturan wayah ini gasan tungkaran '''$1''':",
 'protect-cascadeon' => 'Tungkaran ini rahatan dilindungi lantaran diumpatakan dalam {{PLURAL:$1|tungkaran|tungkaran-tungkaran}} barikut nang sudah aktip palindungan barénténgnya.
 Pian kawa maubah tingkatan palindungan gasan tungkaran ini, tagal ini kada pacang mangaruhi palindungan barénténg.',
 'protect-default' => 'Bulihakan samua pamuruk',
-'protect-fallback' => 'Mamarluakan ijin "$1"',
-'protect-level-autoconfirmed' => 'Blukir pamuruk hanyar wan kada tadaptar',
-'protect-level-sysop' => 'Hanya pambakal',
+'protect-fallback' => 'Wastu gasan pamakai lawan ijin "$1"',
+'protect-level-autoconfirmed' => 'Blukir pamakai hanyar wan kada tadaptar',
+'protect-level-sysop' => 'Wastu pambakal',
 'protect-summary-cascade' => 'barénténg',
 'protect-expiring' => 'kadaluwarsa $1 (UTC)',
 'protect-expiring-local' => 'kadaluwarsa $1',
@@ -2286,15 +2319,14 @@ Pian kawa maubah tingkatan palindungan gasan tungkaran ini, tagal ini kada pacan
 'undeletepage' => 'Tiringi wan bulikakan tutungkaran tahapus',
 'undeletepagetitle' => "'''Barikut mangandung raralatan tahapus matan [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Tiringi tutungkaran tahapus',
-'undeletepagetext' => 'Barikut {{PLURAL:$1|tungkaran sudah dihapus tagal|$1 tutungkaran sudah dihapus tagal}} masih dalam arkip wan kawa disimpan-pulang.
-Arkip kawa dibarasihakan bajangka.',
+'undeletepagetext' => 'Barikut {{PLURAL:$1|tungkaran sudah dihapus tagal|$1 tutungkaran sudah dihapus tagal}} masih dalam arsip wan kawa dibulikakan.
+Arsip kawa dibarasihakan bajangka.',
 'undelete-fieldset-title' => 'Mambulikakan ralatan',
-'undeleteextrahelp' => "Hagan manyimpan-pulang sabarataan halam tungkaran, tingalakan samunyaan kutak-pariksa kada-dipilih wan klik '''''{{int:undeletebtn}}'''''.
-Hagan manggawi sabuah simpan-pulang, pariksa kukutak tahubung ka raralatan nang handak disimpan-pulang, wan klik
-'''''{{int:undeletebtn}}'''''.",
+'undeleteextrahelp' => "Hagan mambulikakan sabarataan sajarah halam tungkaran, tinggalakan samunyaan kutak-pariksa kada-dipilih wan klik '''''{{int:undeletebtn}}'''''.
+Hagan manggawi sabuting pambulikan, pariksa kukutak tahubung ka raralatan nang handak dibulikakan, wan klik '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => "$1 {{PLURAL:$1|ralatan|raralatan}} ta'arsip",
-'undeletehistory' => 'Amun Pian manyimpan-pulang tungkaran ngini, samunyaan raralatan akan tasimpan-pulang ka halamnya.
-Amun sabuah tungkaran puga awan ngaran sama diulah parhatan pahapusan, raralatan nang disimpan-pulang akan cungul dalam halam sabalumnya.',
+'undeletehistory' => 'Amun Pian mambulikakan tungkaran ngini, samunyaan raralatan akan dibulikakan ka sajarah ralatannya.
+Amun sabuting tungkaran hanyar awan ngaran sama diulah parhatan pahapusan, raralatan nang dibulikakan akan cungul dalam sajarah ralatan sabalumnya.',
 'undeleterevdel' => 'Lapas-hapusan kada akan digawi amun ngini akan kulihan di tungkaran atas atawa barakas ralatan sapalih tahapus.
 Dalam kasus kaini, Pian musti malapas-pariksa atawa lapas-sambunyi pahapusan ralatan pahanyarnya.',
 'undeletehistorynoadmin' => 'Tungkaran ngini sudah tahapus.
@@ -2302,7 +2334,7 @@ Alasan pahapusan ditampaiakan dalam kasimpulan di bawah, baimbai awan rarincian
 Naskah aktual pada raralatan pahapusan ngini ada hagan pambakal haja.',
 'undelete-revision' => 'Ralatan tahapus matan $1 (pada $4, $5) ulih $3:',
 'undeleterevision-missing' => 'Raralatan kada sah atawa hilang.
-Pian kalu-ai baisi tautan buruk, atawa ralatan sudah disimpan-pulang atau dibuang matan arkip.',
+Pian kalu-ai baisi tautan buruk, atawa ralatan sudah dibulikakan atau dibuang matan arsip.',
 'undelete-nodiff' => 'Kadada ralatan sabalumnya tatamu.',
 'undeletebtn' => 'Bulikakan',
 'undeletelink' => 'tiring/bulikakan',
@@ -2315,8 +2347,8 @@ Pian kalu-ai baisi tautan buruk, atawa ralatan sudah disimpan-pulang atau dibuan
 'undeletedfiles' => '$1 {{PLURAL:$1|barakas|babarakas}} dibulikakan',
 'cannotundelete' => 'Walang mahapus gagal;
 ada urang lain nang badahulu mawalangi pahapusan tungkaran ngini.',
-'undeletedpage' => "'''$1 sudah disimpan-pulang'''
-Janaki [[Special:Log/delete|log pahapusan]] gasan sabuah rakaman matan pahapusan wan panyimpanan-pulang.",
+'undeletedpage' => "'''$1 sudah dibulikakan'''
+Janaki [[Special:Log/delete|log pahapusan]] gasan sabuting rakaman matan pahapusan wan pambulikakan.",
 'undelete-header' => 'Janaki [[Special:Log/delete|log pahapusan]] gasan tutungkaran hanyar tahapus.',
 'undelete-search-title' => 'Gagai tutungkaran tahapus',
 'undelete-search-box' => 'Gagai tutungkaran tahapus',
@@ -2337,11 +2369,11 @@ $1',
 'undelete-show-file-submit' => 'Iya-ai',
 
 # Namespace form on various pages
-'namespace' => 'Ngaran-kamar:',
+'namespace' => 'Ruang-ngaran:',
 'invert' => 'Bulikakan pilihan',
-'tooltip-invert' => 'Pariksa kutak ngini hagan manyungkupakan parubahan tutungkaran dalam ngaran-kamar tapilih (wan ngaran-kamar tarait anub dipariksa)',
-'namespace_association' => 'Ngaran-kamat tarait',
-'tooltip-namespace_association' => 'Pariksa kutak ngini hagan maumpatakan jua ngarn-kamar pamandiran atawa judul tarait awan ngaran-kamar tapilih',
+'tooltip-invert' => 'Pariksa kutak ngini hagan manyungkupakan paubahan tutungkaran dalam ruang-ngaran tapilih (wan ruang-ngaran tarait jaka dipariksa)',
+'namespace_association' => 'Ruang-ngaran tarait',
+'tooltip-namespace_association' => 'Pariksa kutak ngini hagan maumpatakan jua ruang-ngaran pamandiran atawa judul tarait awan ruang-ngaran tapilih',
 'blanknamespace' => '(Tatambaian)',
 
 # Contributions
@@ -2349,14 +2381,14 @@ $1',
 'contributions-title' => 'Sumbangan pamakai gasan $1',
 'mycontris' => 'Sumbangan ulun',
 'contribsub2' => 'Gasan $1 ($2)',
-'nocontribs' => 'Kadada parubahan taugai parsis awan karitaria ngini.',
+'nocontribs' => 'Kadada paubahan nang rasuk lawan syarat itu.',
 'uctop' => ' (atas)',
 'month' => 'Matan bulan (wan sabalumnya):',
 'year' => 'Matan tahun (wan sabalumnya):',
 
 'sp-contributions-newbies' => 'Tampaiakan sumbangan papamakai hanyar haja',
 'sp-contributions-newbies-sub' => 'Gasan akun hanyar',
-'sp-contributions-newbies-title' => 'Sumbangan pamuruk gasan akun hanyar',
+'sp-contributions-newbies-title' => 'Sumbangan pamakai gasan akun hanyar',
 'sp-contributions-blocklog' => 'Log blukir',
 'sp-contributions-deleted' => 'Tahapus sumbangan pamuruk',
 'sp-contributions-uploads' => 'hunggahan',
@@ -2369,7 +2401,7 @@ Log blukir pahabisannya tasadia di bawah ni gasan rujukan:',
 Log blukir pahabisannya tasadia di bawah ngini gasan rujukan:',
 'sp-contributions-search' => 'Gagai gasan sumbangan',
 'sp-contributions-username' => 'Alamat IP atawa ngaran-pamakai:',
-'sp-contributions-toponly' => 'Tampaiakan hanya ralatan tauncit',
+'sp-contributions-toponly' => 'Tampaiakan wastu ralatan nang paling atas (pauncitnya)',
 'sp-contributions-submit' => 'Gagai',
 
 # What links here
@@ -2378,7 +2410,7 @@ Log blukir pahabisannya tasadia di bawah ngini gasan rujukan:',
 'whatlinkshere-page' => 'Tungkaran:',
 'linkshere' => "Tungkaran-tungkaran barikut batautan ka '''[[:$1]]''':",
 'nolinkshere' => "Kadada tutungkaran tataut ka '''[[:$1]]'''.",
-'nolinkshere-ns' => "Kadada tutungkaran tataut ka '''[[:$1]]''' dalam ngaran-kamar nang dipilih.",
+'nolinkshere-ns' => "Kadada tutungkaran tataut ka '''[[:$1]]''' dalam ruang-ngaran nang dipilih.",
 'isredirect' => 'tungkaran paugahan',
 'istemplate' => 'transklusi',
 'isimage' => 'tautan barakas',
@@ -2547,21 +2579,21 @@ Hagan manyunduk atawa malapas-sunduk data basis, parlu dkawa-akan manulis ulih w
 # Move page
 'move-page' => 'Pindahakan $1',
 'move-page-legend' => 'Pindahakan tungkaran',
-'movepagetext' => "Mamuruk purmulir di bawah akan mangganti ngaran sabuah tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar. Judul lawas akan jadi sabuah 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.
+'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.
 
-Catatan 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.
+Catatan 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.
 
 '''Paringatan!'''
-Ini kawa maakibatakan parubahan kada taduga wan drastis gasan sabuah tungkaran rami; muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
-'movepagetext-noredirectfixer' => "Mamuruk purmulir di bawah akan mangganti ngaran sabuah tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar.
-Judul lawas akan jadi sabuah tungkaran paugahan ka judul hanyar.
+Ini 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.
+Judul lawas akan jadi sabuting tungkaran paugahan ka judul hanyar.
 Pastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]].
 Pian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.
 
 Catatan 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.
 
 '''Paringatan!'''
-Ini kawa maakibatakan parubahan kada taduga wan drastis gasan sabuah tungkaran rami; 
+Ini kawa maakibatakan paubahan kada taduga wan drastis gasan sabuah tungkaran rami; 
 muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
 'movepagetalktext' => "Tungkaran pamandiran tarait akan langsung dipindahakan baimbai wan ini '''kacuali amun:'''
 *Sabuah tungkaran pamandiran nang kada puang sudah baisi awan judul hanyar, atawa
@@ -2577,7 +2609,7 @@ muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
 'newtitle' => 'Ka judul hanyar:',
 'move-watch' => 'Itihi tungkaran asal mula wan tungkaran tujuan',
 'movepagebtn' => 'Pindahakan tungkaran',
-'pagemovedsub' => 'Pamindahan ruhui',
+'pagemovedsub' => 'Sudah dipindah',
 'movepage-moved' => '\'\'\'"$1" sudah dipindahakan ka "$2"\'\'\'',
 'movepage-moved-redirect' => 'Tungkaran paugahan sudah diulah.',
 'movepage-moved-noredirect' => 'Paulahan sabuah paugahan ditikin.',
@@ -2612,6 +2644,7 @@ kada kawa mamindah sabuah tungkaran ka tungkaran ngitu jua.',
 'immobile-target-namespace-iw' => 'Tautan interwiki adalah lainan sabuah tujuan sah gasan mamindahakan tungkaran.',
 'immobile-source-page' => 'Tungkaran ngini kada kawa dipindahakan.',
 'immobile-target-page' => 'Kada kawa mamindahakan ka judul tujuan ngitu.',
+'bad-target-model' => "Tujuan nang dihandaki mengguna'akan model konten nang babida. Kada kawa mamindah matan $1 gasan $2 .",
 'imagenocrossnamespace' => 'Kada kawa mamindahakan barakas ka ngaran-kamar lainan-barakas.',
 'nonfile-cannot-move-to-file' => 'Kada kawa mamindahakan lainan-barakas ka ngaran-kamar barakas',
 'imagetypemismatch' => 'Ekstensi barakas hanyar kada cucuk lawa macamnya.',
@@ -2634,7 +2667,7 @@ Ngini kawa di-impur dalam wiki lain mamuruk MediaWiki lung [[Special:Import|tung
 
 Hagan ma-ikspur tutungkaran, buati judul dalam kutak naskah di bawah, asa judul par garis, wan pilihi nang mana Pian handak ralatan tadamini nangkaitu jua samunyaan raralatan lawas, awan garis tungkaran halam, atawa ralatan tadamini awan panjalasan pasal babakan ta-uncit.
 
-Dalam kasus tahanyar Pian kawa jua mamuruk sabuah tautanm gasan cuntuh [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] gasan tungkaran "[[{{MediaWiki:Mainpage}}]]".',
+Dalam kasus pahanyarnya Pian kawa jua mamuruk sabuah tautanm gasan cuntuh [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] gasan tungkaran "[[{{MediaWiki:Mainpage}}]]".',
 'exportall' => 'Ekspor samunyaan tungkaran.',
 'exportcuronly' => 'Tamasuk ralatan tadamini haja, kada sahibakan halam',
 'exportnohistory' => "----
@@ -2643,7 +2676,7 @@ Dalam kasus tahanyar Pian kawa jua mamuruk sabuah tautanm gasan cuntuh [[{{#Spec
 'export-submit' => 'Pangaluar',
 'export-addcattext' => 'Tambahi tutungkaran matan tumbung:',
 'export-addcat' => 'Tambahi',
-'export-addnstext' => 'Tambahi tutungkaran matan ngaran-kamar:',
+'export-addnstext' => 'Tambahi tutungkaran matan ruang-ngaran:',
 'export-addns' => 'Tambahi',
 'export-download' => 'Simpan sawagai barakas',
 'export-templates' => 'Tamasuk cicitakan',
@@ -2654,8 +2687,8 @@ Dalam kasus tahanyar Pian kawa jua mamuruk sabuah tautanm gasan cuntuh [[{{#Spec
 'allmessagesname' => 'Ngaran',
 'allmessagesdefault' => 'Naskah baku pasan',
 'allmessagescurrent' => 'Naskah pasan wayahini.',
-'allmessagestext' => 'Ngini adalah sabuah daptar pasan sistem tasadia dalam ngaran-kamar MediaWiki.
-Muhun ilangi [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] wan [//translatewiki.net translatewiki.net] amun Pian hakun manyumbang palukalan ganarik MediaWiki.',
+'allmessagestext' => 'Ngini adalah sabuah daptar pasan sistem tasadia dalam ruang-ngaran MediaWiki.
+Muhun ilangi [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] wan [//translatewiki.net translatewiki.net] amun Pian hakun manyumbang palukalan umum MediaWiki.',
 'allmessagesnotsupportedDB' => "Tungkaran ngini kada kawa dipuruk karana '''\$wgUseDatabaseMessages''' sudah dipajahakan.",
 'allmessages-filter-legend' => 'Saringan',
 'allmessages-filter' => 'Saringan lawan kaadaan kustom:',
@@ -2683,14 +2716,15 @@ Muhun ilangi [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] wan
 # Special:Import
 'import' => 'Pamasuk tungkaran',
 'importinterwiki' => 'Impur transwiki',
-'import-interwiki-text' => 'Pilihi sabuah wiki wan judul tungkaran hagan di-impur.
+'import-interwiki-text' => 'Pilihi sabuting wiki wan judul tungkaran hagan di-impor.
 Tanggal raralatan wan ngaran pambabak akan di partahanakan.
 Samunyaan gawi impur transwiki akan dicatat pada [[Special:Log/import|log impur]].',
 'import-interwiki-source' => 'Wiki/tungkaran asal mula:',
 'import-interwiki-history' => 'Salin sabarataan halam raralatan gasan tungkaran ngini',
 'import-interwiki-templates' => 'Tamasuk samunyaan cicitakan',
 'import-interwiki-submit' => 'Impur',
-'import-interwiki-namespace' => 'Ngaran-kamar tujuan:',
+'import-interwiki-namespace' => 'Ruang-ngaran tujuan:',
+'import-interwiki-rootpage' => 'Tungkaran turunan tujuan (opsional):',
 'import-upload-filename' => 'Ngaran barakas:',
 'import-comment' => 'Kumintar:',
 'importtext' => 'Muhun ma-ikspur tungkaran matan asal mula wiki mamuruk [[Special:Export|sarana ikspur]].
@@ -2743,7 +2777,7 @@ Muhun cubai pulang.',
 'tooltip-pt-mytalk' => 'Tungkaran pamandiran Pian',
 'tooltip-pt-anontalk' => 'Pamandiran pasal bababakan matan alamat IP ngini',
 'tooltip-pt-preferences' => 'Nang Pian katuju',
-'tooltip-pt-watchlist' => 'Daptar tungkaran-tungkaran nang Pian itihi parubahannya',
+'tooltip-pt-watchlist' => 'Daptar tungkaran-tungkaran nang Pian itihi paubahannya',
 'tooltip-pt-mycontris' => 'Daptar sumbangan Pian',
 'tooltip-pt-login' => 'Pian sabaiknya babuat ka dalam log; tagal ngini kada kawajiban pang',
 'tooltip-pt-anonlogin' => 'Pian sabaiknya babuat ka dalam log; tagal ini kada kawajiban pang',
@@ -2792,11 +2826,13 @@ Muhun cubai pulang.',
 'tooltip-ca-nstab-help' => 'Tiringi tungkaran patulung',
 'tooltip-ca-nstab-category' => 'Lihati tungkaran tumbung',
 'tooltip-minoredit' => 'Tandai ini sabagai sabuah pambabakan sapalih',
-'tooltip-save' => 'Simpan parubahan Pian',
-'tooltip-preview' => 'Tilik parubahan Pian, muhun pakai ngini sabalum manyimpan!',
-'tooltip-diff' => 'Tampaiakan nang apa parubahan nang Pian ulah',
+'tooltip-save' => 'Simpan paubahan Pian',
+'tooltip-preview' => 'Tilik paubahan Pian, muhun pakai ngini sabalum manyimpan!',
+'tooltip-diff' => 'Tampaiakan nang apa paubahan nang Pian ulah',
 'tooltip-compareselectedversions' => 'Lihati nang balain antara dua ralatan tungkaran tapilih ngini',
 'tooltip-watch' => 'Tambahakan tungkaran ini ka daptar itihan Pian',
+'tooltip-watchlistedit-normal-submit' => 'Hapus judul',
+'tooltip-watchlistedit-raw-submit' => 'Hanyari daptar itihan',
 'tooltip-recreate' => 'Ulah pulang tungkaran biar gin suah dihapus',
 'tooltip-upload' => 'Mulai pangunggahan',
 'tooltip-rollback' => 'Bulikakan ka babakan-babakan tungkaran ngini matan panyumbang tauncit dalam sakali klik.',
@@ -2827,25 +2863,66 @@ Ngini pinanya dikaranakan ulih sabuah tautan ka sabuah situs daptar-hirang luar.
 'spambot_username' => 'Pambarasihan spam MediaWiki',
 'spam_reverting' => 'Mambulikakan ka ralatan tauncit nang kada mangandung tatautan ka $1',
 'spam_blanking' => 'Samunyaan raralatan mangandung tatautan ka $1, dikusungakan',
+'spam_deleting' => 'Samunyaan raralatan nang isinya tatautan ka $1, dipuangakan',
 
 # Info page
 'pageinfo-title' => "Panjalasan gasan ''$1''",
-'pageinfo-header-edits' => 'Babakan',
+'pageinfo-not-current' => 'Maaf, kada mungkin mambariakan maklumat ngini ka ralatan lawas.',
+'pageinfo-header-basic' => 'Maklumat pandal',
+'pageinfo-header-edits' => 'Sajarah babakan',
+'pageinfo-header-restrictions' => 'Palindungan tungkaran',
+'pageinfo-header-properties' => 'Properti tungkaran',
+'pageinfo-display-title' => 'Judul tampilan',
+'pageinfo-default-sort' => 'Kunci urut baku',
+'pageinfo-length' => 'Panjang tungkaran (dalam bita)',
+'pageinfo-article-id' => 'ID Tungkaran',
+'pageinfo-language' => 'Bahasa isi tungkaran',
+'pageinfo-robot-policy' => 'Status masin panggagai',
+'pageinfo-robot-index' => 'Kawa diindeks',
+'pageinfo-robot-noindex' => 'Kada kawa diindeks',
 'pageinfo-views' => 'Rikinan titiringan',
-'pageinfo-watchers' => 'Jumlah papaitih',
+'pageinfo-watchers' => 'Jumlah pa-itih tungkaran',
+'pageinfo-few-watchers' => 'Kurang matan $1 {{PLURAL:$1|pa-ilang}}',
+'pageinfo-redirects-name' => 'Paugahan ka tungkaran ngini',
+'pageinfo-subpages-name' => 'Subtungkaran tungkaran ngini',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|paugahan|paugahan}}; $3 {{PLURAL:$3|non-paugahan|non-paugahan}})',
+'pageinfo-firstuser' => 'Pa-ulah tungkaran',
+'pageinfo-firsttime' => 'Tanggal paulahan tungkaran',
+'pageinfo-lastuser' => 'Pambabak pauncitnya',
+'pageinfo-lasttime' => 'Tanggal babakan pauncitnya',
 'pageinfo-edits' => 'Rikinan babakan',
-'pageinfo-authors' => 'Rikinan panulis balain',
+'pageinfo-authors' => 'Rikinan panulis nang balain',
+'pageinfo-recent-edits' => 'Jumlah babakan damini (dalam $1 pauncitnya)',
+'pageinfo-recent-authors' => 'Jumlah panulis nang babida damini',
+'pageinfo-magic-words' => '{{PLURAL:$1|Kata|Kata}} ajaib ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|tumbung|tutumbung}}',
+'pageinfo-templates' => '{{PLURAL:$1|Citakan|Citakan}} nang ditransklusi ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Tungkaran|Tutungkaran}} ditransklusikan pada ( $1 )',
+'pageinfo-toolboxlink' => 'Maklumat tungkaran',
+'pageinfo-redirectsto' => 'Ba-ugah ka',
+'pageinfo-redirectsto-info' => 'Maklumat',
+'pageinfo-contentpage' => 'Dirikin sabagai tungkaran isi',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading' => 'Palindungan baurutan matan sini',
+'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-protect-cascading-from' => 'Palindungan mulai matan',
+'pageinfo-category-info' => 'Tumbung maklumat',
+'pageinfo-category-pages' => 'Jumlah tungkaran',
+'pageinfo-category-subcats' => 'Jumlah subtumbung',
+'pageinfo-category-files' => 'Jumlah babarakas',
 
 # Patrolling
 'markaspatrolleddiff' => 'Ciri-i sawagai ta-awasi',
 'markaspatrolledtext' => 'Ciri-i tungkaran ngini sawagai ta-awasi',
 'markedaspatrolled' => 'taciri-i sawagai ta-awasi',
 'markedaspatrolledtext' => 'Ralatan tapilih matan [[:$1]] sudah diciri-i sawagai ta-awasi.',
-'rcpatroldisabled' => 'Parubahan pangawasan tadamini dipajahakan.',
-'rcpatroldisabledtext' => 'Pitur parubahan pangawasan tadamini parhatan ni dipajahakan.',
+'rcpatroldisabled' => 'Pangawasan paubahan pahanyarnya dipajahakan.',
+'rcpatroldisabledtext' => 'Fitur paubahan pangawasan pahanyarnya parhatan ni dipajahakan.',
 'markedaspatrollederror' => 'Kada kawa diciri-i sawagai ta-awasi',
 'markedaspatrollederrortext' => 'Pian parlu manantuakan sabuah ralatan hagan diciri-i sawagai ta-awasi.',
-'markedaspatrollederror-noautopatrol' => 'Pian kada dibulihakan manyiri-i parubahan Pian surang sawagai ta-awasi.',
+'markedaspatrollederror-noautopatrol' => 'Pian kada dibulihakan manyiri-i paubahan Pian surang sawagai ta-awasi.',
+'markedaspatrollednotify' => 'Paubahan ngini gasan $1 hudah ditandai ta-itihi.',
+'markedaspatrollederrornotify' => 'Manandai sabagai paitihan nang gagal.',
 
 # Patrol log
 'patrol-log-page' => 'Log pa-awasan',
@@ -2865,7 +2942,7 @@ $1',
 
 # Browsing diffs
 'previousdiff' => '← Ralatan talawas',
-'nextdiff' => 'Ralatan tahanyar →',
+'nextdiff' => 'Ralatan labih hanyar →',
 
 # Media information
 'mediawarning' => "'''Paringatan''': Barakas ngini pinanya mangandung kudi babahaya.
@@ -2934,7 +3011,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Libar',
 'exif-imagelength' => 'Pancau',
 'exif-bitspersample' => 'Bit par kumpunin',
@@ -2956,7 +3033,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 'exif-primarychromaticities' => 'Krumatisitas matan warna primar',
 'exif-ycbcrcoefficients' => 'Kuipisian kamar kelir transpurmasi matriks',
 'exif-referenceblackwhite' => 'Nilai rujukan sapasang hirang wan putih',
-'exif-datetime' => 'Tanggal wan wayah parubahan barakas',
+'exif-datetime' => 'Tanggal wan wayah paubahan barakas',
 'exif-imagedescription' => 'Judul gambar',
 'exif-make' => 'Pabrikan kudakan',
 'exif-model' => 'Mudil kudakan',
@@ -3112,7 +3189,7 @@ Tautan-tautan abis tu pada baris sama dipartimbangkan sabagai pangacualian, nang
 'exif-originalimageheight' => 'Pancau gambar sabalum dihandapi',
 'exif-originalimagewidth' => 'Lingai gambar sabalum dihandapi',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Kada dikumpris',
 'exif-compression-2' => 'Galambang CCITT 3 1-Dimensional Modified Huffman manjalankan panjang encoding',
 'exif-compression-3' => 'Galambang CCITT 3 paks encoding',
@@ -3460,8 +3537,8 @@ Cubai titilikan nurmal.',
 Cubai titilikan nurmal.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Parubahan tahanyar pada $1 {{PLURAL:$1|ditik|diditik}} pinanya kada cungul di daptar ngini.',
-'lag-warn-high' => 'Karana pancaunya kalambatan sarvar databasis, parubahan tahanyar pada {{PLURAL:$1|datik|dadatik}} pina kada ditampaiakan dalam daptar ngini.',
+'lag-warn-normal' => 'Paubahan pahanyarnya pada $1 {{PLURAL:$1|ditik|diditik}} pinanya kada cungul di daptar ngini.',
+'lag-warn-high' => 'Marga pancaunya kalambatan server databasis, paubahan pahanyarnya pada {{PLURAL:$1|datik|dadatik}} pina kada ditampaiakan dalam daptar ngini.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Daptar itihan Pian baisi {{PLURAL:$1|1 judul|$1 judul}}, kada tabuat tutungkaran pamandiran.',
@@ -3486,7 +3563,7 @@ Pian kawa jua [[Special:EditWatchlist|mamuruk si pambabak standar]].',
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 judul|$1 jujudul}} dibuangi:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'Tampaiakan parubahan tarait',
+'watchlisttools-view' => 'Tampaiakan paubahan tarait',
 'watchlisttools-edit' => 'Tiringi wan babak daptar itihan',
 'watchlisttools-raw' => 'Babak daptar itihan mantah',
 
@@ -3517,23 +3594,17 @@ Pian kawa jua [[Special:EditWatchlist|mamuruk si pambabak standar]].',
 'version-license' => 'Lisansi',
 'version-poweredby-credits' => "Wiki ngini disukung ulih '''[//www.mediawiki.org/ MediaWiki]''', hak salin © 2001-$1 $2.",
 'version-poweredby-others' => 'lainnya',
-'version-license-info' => 'MediaWiki adalah parangkat lunak bibas; Pian kawa manyabarakan wan/atawa maubahi ngini di bawah syarat Lisansi Publik Umum sawagai tarbitan ulih Free Software Foundation; apakah Lisansi virsi 2, atawa (pilihan Pian) tahanyar.
+'version-credits-summary' => 'Kami ingin ma-akui urang-urang ini atas sumbangan pikiran-tanaga kapada [[Special:Version|MediaWiki]].',
+'version-license-info' => 'MediaWiki adalah parangkat lunak bibas; Pian kawa manyabarakan wan/atawa maubahi ngini di bawah syarat Lisansi Publik Umum sawagai tarbitan ulih Free Software Foundation; apakah Lisansi virsi 2, atawa (pilihan Pian) pahanyarnya.
 
 MediaWiki disabarakan awan harapan akan baguna, tagal KADA BAJAMINAN; kada jaminan PANIAGAAN atawa KATAPATAN HAGAN TUJUAN TARTANTU. Janaki Lisansi Publik Umum GNU gasan panjalasan rinci.
 
-Pian saharusnya [{{SERVER}}{{SCRIPTPATH}}/COPYING sabuah salinan Lisansi Publik Umum GNU] baimbai awan prugram ngini; amun kada, tulis ka Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA atawa [//www.gnu.org/licenses/old-licenses/gpl-2.0.html baca ngini daring].',
+Pian saharusnya [{{SERVER}}{{SCRIPTPATH}}/COPYING sabuting salinan Lisansi Publik Umum GNU] baimbai awan prugram ngini; amun kada, tulis ka Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA atawa [//www.gnu.org/licenses/old-licenses/gpl-2.0.html baca ngini daring].',
 'version-software' => 'Parangkat lunak tapasang',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Virsi',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Wadah barakas',
-'filepath-page' => 'Barakas:',
-'filepath-submit' => 'Gagai',
-'filepath-summary' => 'Tungkaran istimiwa ngini mambulikakan jalur panuntungan sabuah barakas.
-Gambar ditampaiakan dalam risulusi hibak, janis barakas lain dimula lawan prugram taraitnya langsung.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Gagai gasan babarakas baganda',
 'fileduplicatesearch-summary' => 'Gagai gasan babarakas baganda bapandal nilai hash.',
@@ -3554,7 +3625,7 @@ Gambar ditampaiakan dalam risulusi hibak, janis barakas lain dimula lawan prugra
 'specialpages-group-maintenance' => 'Lapuran pamaliharaan',
 'specialpages-group-other' => 'Tungkaran istimiwa lainnya',
 'specialpages-group-login' => 'Babuat log / mandaptar',
-'specialpages-group-changes' => 'Parubahan tahanyar wan log',
+'specialpages-group-changes' => 'Paubahan pahanyarnya wan log',
 'specialpages-group-media' => 'Lapuran wan pamuatan barakas',
 'specialpages-group-users' => 'Pamuruk wan hak pamuruk',
 'specialpages-group-highuse' => 'Tungkaran pamakaian tinggi',
@@ -3579,17 +3650,17 @@ Gambar ditampaiakan dalam risulusi hibak, janis barakas lain dimula lawan prugra
 #Handak samunyaan fragmen regex di atas baris ngini. Tinggalakan baris ngini parsis kaya ngini haja </pre>',
 
 # Special:Tags
-'tags' => 'Tag parubahan sah',
+'tags' => 'Tag paubahan sah',
 'tag-filter' => 'Saringan [[Special:Tags|Tag]]:',
 'tag-filter-submit' => 'Saringan',
 'tags-title' => 'Gantungan',
 'tags-intro' => 'Tungkaran ngini mandaptar gantungan nang diciri-i parangkat lunak sabuah babakan, wan artinya.',
 'tags-tag' => 'Gantungan ngaran',
-'tags-display-header' => 'Pancungulan pada daptar parubahan.',
+'tags-display-header' => 'Pancungulan pada daptar paubahan.',
 'tags-description-header' => 'Diskripsi hibak matan arti',
 'tags-hitcount-header' => 'Gantungan diganti',
 'tags-edit' => 'babak',
-'tags-hitcount' => '$1 {{PLURAL:$1|parubahan|paparubahan}}',
+'tags-hitcount' => '$1 {{PLURAL:$1|paubahan|paubahan}}',
 
 # Special:ComparePages
 'comparepages' => 'Bandingakan tutungkaran',
@@ -3622,7 +3693,7 @@ Situs ngini mangalami kangalihan teknik.',
 'htmlform-int-toohigh' => 'Nilai nang Pian ajuakan kapancauan pada maksimal $1',
 'htmlform-required' => 'Nilai ngini nang diparluakan',
 'htmlform-submit' => 'Kirim',
-'htmlform-reset' => 'Walangi parubahan',
+'htmlform-reset' => 'Walangi paubahan',
 'htmlform-selectorother-other' => 'Lain-lain',
 
 # SQLite database support
index c4fa254..f1ae1a5 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Aftab1995
  * @author Ali Haidar Khan
  * @author Bellayet
  * @author Ehsanulhb
@@ -78,11 +79,11 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো',
 'tog-extendwatchlist' => 'শুধু সাম্প্রতিক পরিবর্তনই নয়, সকল পরিবর্তন দেখতে নজর তালিকা সম্প্রসারণ করুন।',
 'tog-usenewrc' => 'সাম্প্রতিক পরিবর্তনসমূহ এবং নজরতালিকা পাতায় পরিবর্তনগুলো একত্রে প্রদর্শন (জাভাস্ক্রিপ্ট প্রয়োজন)',
-'tog-numberheadings' => 'শিরà§\8bনামà¦\97à§\81লà§\8bà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦\95à§\8dরমাà¦\99à§\8dà¦\95িত à¦\95রা à¦¹à§\8bà¦\95',
-'tog-showtoolbar' => 'সমà§\8dপাদনা à¦\9fà§\81লবার à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dরিপà§\8dà¦\9f)',
-'tog-editondblclick' => 'দুইবার ক্লিক করে পাতা সম্পাদনা করার ক্ষমতা দেয়া হোক (জাভাস্ক্রিপ্ট)',
+'tog-numberheadings' => 'শিরà§\8bনামà¦\97à§\81লà§\8bà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦\95à§\8dরমিà¦\95 à¦¨à¦®à§\8dবর à¦¦à¦¾à¦\93',
+'tog-showtoolbar' => 'সমà§\8dপাদনা à¦\9fà§\81লবার à¦¦à§\87à¦\96াà¦\93 (à¦\9cাভাসà§\8dà¦\95à§\8dরিপà§\8dà¦\9f à¦ªà§\8dরয়à§\8bà¦\9cন)',
+'tog-editondblclick' => 'দুইবার ক্লিক করে পাতা সম্পাদনা (জাভাস্ক্রিপ্ট প্রয়োজন)',
 'tog-editsection' => '[সম্পাদনা] সংযোগের সাহায্যে পরিচ্ছেদ সম্পাদনা করার ক্ষমতা দেয়া হোক',
-'tog-editsectiononrightclick' => 'পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে <br />পরিচ্ছেদ সম্পাদনা করার ক্ষমতা দেয়া হোক (জাভাস্ক্রিপ্ট)',
+'tog-editsectiononrightclick' => 'পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে সম্পাদনা করার ক্ষমতা দেয়া হোক (জাভাস্ক্রিপ্ট)',
 'tog-showtoc' => 'সূচিপত্র দেখানো হোক (৩টির বেশি পরিচ্ছেদের শিরোনামবিশিষ্ট পাতার জন্য)',
 'tog-rememberpassword' => 'এই ব্রাউজারে আমার লগ ইন তথ্য (শব্দচাবি) মনে রাখো (সর্বোচ্চ $1 {{PLURAL:$1|দিনের|দিনের}} জন্য)',
 'tog-watchcreations' => 'আমার তৈরি পাতা এবং আপলোড করা ফাইলগুললো আমার নজরতালিকায় যোগ করা হোক',
@@ -100,8 +101,6 @@ $messages = array(
 'tog-shownumberswatching' => 'নজরদারী করছে, এমন ব্যবহারকারীর সংখ্যা দেখানো হোক',
 'tog-oldsig' => 'বর্তমান স্বাক্ষর:',
 'tog-fancysig' => 'স্বাক্ষরকে উইকিটেক্সট হিসেবে মনে করুন (কোন সয়ংক্রিয় লিঙ্ক ছাড়া)',
-'tog-externaleditor' => 'শুরুতেই বহিঃস্থ সম্পাদক ব্যবহার করা হোক (শুধুমাত্র দক্ষ ব্যবহারকারীদের জন্য, কম্পিউটারে বিশেষ সেটিংস এর প্রয়জোন। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত তথ্য।])',
-'tog-externaldiff' => 'শুরুতেই বহিঃস্থ পার্থক্য ব্যবহার করা হোক (শুধুমাত্র দক্ষ ব্যবহারকারীদের জন্য, কম্পিউটারে বিশেষ সেটিংস এর প্রয়জোন। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত তথ্য।])',
 'tog-showjumplinks' => '"ঝাঁপ দিন" বৈশিষ্ট্যের সংযোগ চালু করা হোক',
 'tog-uselivepreview' => 'তাৎক্ষণিক প্রাকদর্শনের ক্ষমতা চালু করা হোক (জাভাস্ক্রিপ্ট) (পরীক্ষামূলক)',
 'tog-forceeditsummary' => 'খালি সম্পাদনা সারাংশ প্রবেশ করানোর সময় আমাকে জানানো হোক',
@@ -115,6 +114,7 @@ $messages = array(
 'tog-diffonly' => 'পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক',
 'tog-showhiddencats' => 'লুকায়িত বিষয়শ্রেণীসমূহ দেখাও',
 'tog-norollbackdiff' => 'রোলব্যাকের পরে পার্থক্য দেখিও না',
+'tog-useeditwarning' => 'অসংরক্ষিত পরিবর্তন সহ কোনো পাতা ত্যাগের সময় সাবধান করো',
 
 'underline-always' => 'সব সময়',
 'underline-never' => 'কখনো নয়',
@@ -135,13 +135,13 @@ $messages = array(
 'thursday' => 'বৃহস্পতিবার',
 'friday' => 'শুক্রবার',
 'saturday' => 'শনিবার',
-'sun' => 'রবিবার',
-'mon' => 'সোমবার',
-'tue' => 'মঙ্গলবার',
-'wed' => 'বুধবার',
-'thu' => 'বৃহস্পতিবার',
-'fri' => 'শুক্রবার',
-'sat' => 'শনিবার',
+'sun' => 'রবি',
+'mon' => 'সোম',
+'tue' => 'মঙ্গল',
+'wed' => 'বুধ',
+'thu' => 'বৃহস্পতি',
+'fri' => 'শুক্র',
+'sat' => 'শনি',
 'january' => 'জানুয়ারি',
 'february' => 'ফেব্রুয়ারি',
 'march' => 'মার্চ',
@@ -166,18 +166,30 @@ $messages = array(
 'october-gen' => 'অক্টোবর',
 'november-gen' => 'নভেম্বর',
 'december-gen' => 'ডিসেম্বর',
-'jan' => 'জানুয়ারি',
-'feb' => 'ফেব্রুয়ারি',
+'jan' => 'জানু',
+'feb' => 'ফেব্রু',
 'mar' => 'মার্চ',
 'apr' => 'এপ্রিল',
 'may' => 'মে',
 'jun' => 'জুন',
 'jul' => 'জুলাই',
 'aug' => 'আগস্ট',
-'sep' => 'সেপ্টেম্বর',
-'oct' => 'অক্টোবর',
-'nov' => 'নভেম্বর',
-'dec' => 'ডিসেম্বর',
+'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',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|বিষয়শ্রেণী|বিষয়শ্রেণীসমূহ}}',
@@ -211,11 +223,11 @@ $messages = array(
 'and' => '&#32;এবং',
 
 # Cologne Blue skin
-'qbfind' => 'অনুসন্ধান করুন',
+'qbfind' => 'অনুসন্ধান',
 'qbbrowse' => 'ব্রাউজ',
 'qbedit' => 'সম্পাদনা',
-'qbpageoptions' => 'এ পাতার বিকল্পসমূহ',
-'qbmyoptions' => 'à¦\86মার à¦ªà¦\9bনà§\8dদ',
+'qbpageoptions' => 'এই পাতা',
+'qbmyoptions' => 'à¦\86মার à¦ªà¦¾à¦¤à¦¾à¦¸à¦®à§\82হ',
 'qbspecialpages' => 'বিশেষ পাতাসমূহ',
 'faq' => 'সম্ভাব্য প্রশ্নসমূহ',
 'faqpage' => 'Project:প্রাজিপ্র',
@@ -228,18 +240,18 @@ $messages = array(
 'vector-action-undelete' => 'পুনরুদ্ধার',
 'vector-action-unprotect' => 'সুরক্ষা পরিবর্তন',
 'vector-simplesearch-preference' => 'সরল অনুসন্ধান সক্রিয় করুন (শুধুমাত্র ভেক্টর স্কিনের জন্য)',
-'vector-view-create' => 'তৈরি করুন',
+'vector-view-create' => 'তৈরি',
 'vector-view-edit' => 'সম্পাদনা',
 'vector-view-history' => 'ইতিহাস',
 'vector-view-view' => 'পড়ুন',
-'vector-view-viewsource' => 'সà§\8bরà§\8dস দেখুন',
+'vector-view-viewsource' => 'à¦\89à§\8eস দেখুন',
 'actions' => 'কার্যক্রম',
 'namespaces' => 'নামস্থান',
 'variants' => 'বিকল্পসমূহ',
 
 'navigation-heading' => 'পরিভ্রমণ মেনু',
 'errorpagetitle' => 'ত্রুটি',
-'returnto' => '$1 à¦¶à¦¿à¦°à§\8bনামà§\87র à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦«à§\87রত à¦¯à¦¾à¦¨à¥¤',
+'returnto' => '$1 পাতায় ফেরত যান।',
 'tagline' => '{{SITENAME}} থেকে',
 'help' => 'সাহায্য',
 'search' => 'অনুসন্ধান',
@@ -254,7 +266,7 @@ $messages = array(
 'print' => 'মুদ্রণ',
 'view' => 'দেখাও',
 'edit' => 'সম্পাদনা',
-'create' => 'তৈরি করো',
+'create' => 'তৈরি',
 'editthispage' => 'সম্পাদনা করুন',
 'create-this-page' => 'পাতাটি তৈরি করো',
 'delete' => 'অপসারণ',
@@ -331,13 +343,13 @@ $1',
 
 'ok' => 'ঠিক আছে',
 'retrievedfrom' => "'$1' থেকে আনীত",
-'youhavenewmessages' => 'আপনার $1 ($2) এসেছে৷',
+'youhavenewmessages' => 'আপনার $1 এসেছে ($2)৷',
 'newmessageslink' => 'নতুন বার্তা',
 'newmessagesdifflink' => 'সর্বশেষ পরিবর্তন',
-'youhavenewmessagesfromusers' => 'আপনি  {{PLURAL:$3|অন্য ব্যবহারকারী|$3 ব্যবহারকারী}} ($2) থেকে $1পেয়েছেন।',
-'youhavenewmessagesmanyusers' => 'আপনি অনেক ব্যবহারকারী ($2) থেকে $1 পেয়েছেন।',
+'youhavenewmessagesfromusers' => 'আপনি {{PLURAL:$3|অন্য ব্যবহারকারীর|$3 ব্যবহারকারীর}} কাছ থেকে $1 পেয়েছেন ($2)।',
+'youhavenewmessagesmanyusers' => 'আপনি অনেক ব্যবহারকারীর কাছ থেকে $1 পেয়েছেন ($2)।',
 'newmessageslinkplural' => '{{PLURAL:$1|একটি নতুন বার্তা|নতুন বার্তা}}',
-'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
+'newmessagesdifflinkplural' => 'সর্বশেষ {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
 'youhavenewmessagesmulti' => 'আপনার $1টি নতুন বার্তা এসেছে',
 'editsection' => 'সম্পাদনা',
 'editold' => 'সম্পাদনা',
@@ -465,8 +477,8 @@ $2',
 'filereadonlyerror' => '"$1" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন "$2" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।
 
 একজন প্রশাসক যিনি এটাকে লকড করেছেন তার যৌক্তিকতা দেওয়া হল: "$3"',
-'invalidtitle-knownnamespace' => 'অবৈধ শিরনাম, যেখানে নামস্থান "$2" এবং লেখা হয়েছে "$3"',
-'invalidtitle-unknownnamespace' => 'অবৈধ শিরনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে "$2"',
+'invalidtitle-knownnamespace' => 'à¦\85বà§\88ধ à¦¶à¦¿à¦°à§\8bনাম, à¦¯à§\87à¦\96ানà§\87 à¦¨à¦¾à¦®à¦¸à§\8dথান "$2" à¦\8fবà¦\82 à¦²à§\87à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 "$3"',
+'invalidtitle-unknownnamespace' => 'à¦\85বà§\88ধ à¦¶à¦¿à¦°à§\8bনাম, à¦¯à§\87à¦\96ানà§\87 à¦¬à§\8dযবহà§\83ত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\85পরিà¦\9aিত à¦¨à¦¾à¦®à¦¸à§\8dথান à¦¸à¦\82à¦\96à§\8dযা $1 à¦\8fবà¦\82 à¦²à§\87à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 "$2"',
 'exception-nologin' => 'লগইন করা হয়নি',
 'exception-nologin-text' => 'এই কাজটি করার জন্য উইকিতে লগইন করা প্রয়োজন।',
 
@@ -484,9 +496,18 @@ $2',
 'welcomecreation-msg' => 'আপনার অ্যাকাউন্ট তৈরী হয়েছে।
 আপনার [[Special:Preferences|{{SITENAME}} পছন্দসমূহ]]  পরিবর্তন করে নিতে ভুলবেন না।',
 'yourname' => 'ব্যবহারকারী নাম:',
+'userlogin-yourname' => 'ব্যবহারকারী নাম',
+'userlogin-yourname-ph' => 'আপনার ব্যবহাকারী নাম প্রবেশ করান',
 'yourpassword' => 'শব্দচাবি:',
+'userlogin-yourpassword' => 'শব্দচাবি (Password)',
+'userlogin-yourpassword-ph' => 'আপনার শব্দচাবি (পাসওয়ার্ড) লিখুন',
+'createacct-yourpassword-ph' => 'শব্দচাবি প্রদান করুন',
 'yourpasswordagain' => 'শব্দচাবিটি (password) আবার লিখুন',
+'createacct-yourpasswordagain' => 'শব্দচাবি নিশ্চিত করুন',
+'createacct-yourpasswordagain-ph' => 'আবারও শব্দচাবি প্রদান করুন',
 'remembermypassword' => 'একাধিক সেশনের জন্য শব্দচাবি মনে রাখা হোক (সর্বোচ্চ $1 {{PLURAL:$1|দিনের|দিনের}} জন্য)',
+'userlogin-remembermypassword' => 'আমাকে প্রবেশ অবস্থায় রাখো',
+'userlogin-signwithsecure' => 'নিরাপদ সংযোগ ব্যবহার করুন',
 'securelogin-stick-https' => 'লগইনের পর এইচটিটিপিএস-এর সাথে সংযোগকৃত থাকুন',
 'yourdomainname' => 'আপনার ডোমেইন',
 'password-change-forbidden' => 'আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।',
@@ -499,18 +520,38 @@ $2',
 'logout' => 'প্রস্থান করুন',
 'userlogout' => 'প্রস্থান',
 'notloggedin' => 'আপনি সংযুক্ত নন',
+'userlogin-noaccount' => 'কোনও অ্যাকাউন্ট নেই?',
+'userlogin-joinproject' => '{{SITENAME}}-এ অংশগ্রহন করুন',
 'nologin' => "আপনার কি উইকিপিডিয়াতে অ্যাকাউন্ট নেই? তাহলে '''$1'''।",
 'nologinlink' => 'অ্যাকাউন্ট তৈরি করুন',
 'createaccount' => 'নতুন অ্যাকাউন্ট খুলুন',
 'gotaccount' => "আপনার কি ইতিমধ্যে একটি অ্যাকাউন্ট তৈরি করা আছে? '''$1''' করুন।",
 'gotaccountlink' => 'প্রবেশ',
 'userlogin-resetlink' => 'আপনার লগইনের বিস্তারিত তথ্যাদি ভুলে গেছেন?',
+'userlogin-resetpassword-link' => 'শব্দচাবি পুনরায় ধার্য করুন',
+'helplogin-url' => 'Help:প্রবেশ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|লগইন সংক্রান্ত সাহায্য]]',
+'createacct-join' => 'আপনার সম্পর্কিত তথ্য নিচে যোগ করুন।',
+'createacct-emailrequired' => 'ইমেইল ঠিকানা',
+'createacct-emailoptional' => 'ইমেইল ঠিকানা (ঐচ্ছিক)',
+'createacct-email-ph' => 'আপনার ইমেইল ঠিকানা যোগ করুন',
 'createaccountmail' => 'একটি র‌্যান্ডম পাসওয়ার্ড নির্বাচন করুন এবং নিচের নির্ধারিত ইমেইল ঠিকানায় পাঠিয়ে দিন',
+'createacct-realname' => 'আসল নাম (ঐচ্ছিক)',
 'createaccountreason' => 'কারণ:',
+'createacct-reason' => 'কারণ',
+'createacct-reason-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|অবদানকারী|অবদানকারীগণ}}',
 'badretype' => "আপনার প্রবেশ করানো শব্দচাবি'টি মিলছেনা।",
 'userexists' => 'এই ব্যবহারকারী নামটি ইতমধ্যে ব্যবহার করা হয়েছে।
 অনুগ্রহ করে অন্য নাম বেছে নিন।',
 'loginerror' => 'লগ-ইন করতে সমস্যা হয়েছে',
+'createacct-error' => 'অ্যাকাউন্ট তৈরি ত্রুটি',
 'createaccounterror' => 'অ্যাকাউন্ট তৈরি হয়নি: $1',
 'nocookiesnew' => 'ব্যবহারকারীর অ্যাকাউন্টটি সৃষ্টি করা হয়েছে, কিন্তু আপনি এখনও অ্যাকাউন্টে প্রবেশ করেননি। {{SITENAME}}-তে কুকি ব্যবহার করে ব্যবহারকারীদের অ্যাকাউন্টে প্রবেশ করানো হয়। আপনার ব্রাউজারে কুকিগুলি নিষ্ক্রিয় করা আছে। অনুগ্রহ করে কুকিগুলি সক্রিয় করুন এবং আপনার নতুন ব্যবহারকারী নাম ও শব্দচাবি ব্যবহার করে অ্যাকাউন্টে প্রবেশ করুন।',
 'nocookieslogin' => '{{SITENAME}} এ কুকি (cookies) এর মাধ্যমে ব্যবহারকারীদের লগ-ইন সম্পন্ন করা হয়। আপনার ব্রাঊজারে কুকি বন্ধ করে দেওয়া আছে। কুকি চালু করে আবার চেষ্টা করুন।',
@@ -589,13 +630,13 @@ $2',
 'resetpass-wrong-oldpass' => 'ভুল অস্থায়ী অথবা বর্তমান শব্দচাবি।
 সম্ভবতঃ আপনি ইতোমধ্যেই সফলভাবে আপনার শব্দচাবিটি পরিবর্তন করেছেন অথবা একটি নতুন অস্থায়ী শব্দচাবির জন্য অনুরোধ করেছেন।',
 'resetpass-temp-password' => 'অস্থায়ী শব্দচাবি:',
+'resetpass-abort-generic' => 'শব্দচাবি পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।',
 
 # Special:PasswordReset
 'passwordreset' => 'শব্দচাবি রিসেট',
-'passwordreset-text' => 'আপনার অ্যাকাউন্টের বিস্তারিত তথ্য ই-মেইলের মাধ্যমে পেতে নিচের ফর্মটি পূরণ করুন।',
 'passwordreset-legend' => 'শব্দচাবি রিসেট',
 'passwordreset-disabled' => 'এই উইকিতে শব্দচাবি রিসেটের সুবিধা নিষ্ক্রিয় রয়েছে।',
-'passwordreset-pretext' => '{{PLURAL:$1||নিচে উল্লেখিত ডেটাগুলোর কোনো একটি প্রবেশ করান}}',
+'passwordreset-emaildisabled' => 'এই উইকিতে ইমেইল অপশনটি বন্ধ করা হয়েছে।',
 'passwordreset-username' => 'ব্যবহারকারী নাম:',
 'passwordreset-domain' => 'ডোমেইন:',
 'passwordreset-capture' => 'অনুসন্ধানের ফলাফলের ইমেইল দেখুন?',
@@ -603,7 +644,7 @@ $2',
 'passwordreset-email' => 'ইমেইল ঠিকানা:',
 'passwordreset-emailtitle' => '{{SITENAME}} সাইটে ব্যবহারকারীর বিস্তারিত তথ্যাদি',
 'passwordreset-emailtext-ip' => 'কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার
-à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¬à¦¿à¦¸à§\8dতারিত à¦¤à¦¥à§\8dয à¦\9cানতà§\87 à¦\9aà§\87য়েছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}
+শবà§\8dদà¦\9aাবি à¦¬à¦¦à¦²à§\87র à¦\9cনà§\8dয à¦\85নà§\81রà§\8bধ à¦\95রেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}
 এই ই-মেইল ঠিকানার সাথে সংযুক্ত:
 
 $2
@@ -612,8 +653,7 @@ $2
 আপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,
 অথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে
 আপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।',
-'passwordreset-emailtext-user' => 'কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার
-অ্যাকাউন্টের একটি পাসওয়ার্ড রিমাইন্ডার চেয়ে পাঠিয়েছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}
+'passwordreset-emailtext-user' => 'ব্যবহারকারী $1 {{SITENAME}} ($4) সাইটের জন্য আপনার শব্দচাবি বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}
 এই ই-মেইল ঠিকানার সাথে সংযুক্ত:
 
 $2
@@ -624,9 +664,9 @@ $2
 আপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।',
 'passwordreset-emailelement' => 'ব্যবহারকারী নাম: $1
 অস্থায়ী শব্দচাবি: $2',
-'passwordreset-emailsent' => 'à¦\8fà¦\95à¦\9fি à¦°à¦¿à¦®à¦¾à¦\87নà§\8dডার ই-মেইল পাঠানো হয়েছে।',
+'passwordreset-emailsent' => 'শবà§\8dদà¦\9aাবি à¦¬à¦¦à¦²à§\87র à¦\8fà¦\95à¦\9fি ই-মেইল পাঠানো হয়েছে।',
 'passwordreset-emailsent-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।',
-'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 ব্যবহারকারীকে এটি পাঠানো যায়নি',
+'passwordreset-emailerror-capture' => 'স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!',
 
 # Special:ChangeEmail
 'changeemail' => 'ই-মেইল ঠিকানা পরিবর্তন',
@@ -671,7 +711,7 @@ $2
 'anoneditwarning' => 'আপনি লগ ইন করেননি। এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি সংখ্যা সংরক্ষিত হবে।',
 'anonpreviewwarning' => 'আপনি লগ ইন করেননি। এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি সংখ্যা সংরক্ষিত হবে।',
 'missingsummary' => "'''খেয়াল করুন''':  আপনি কিন্তু সম্পাদনার সারাংশ দেননি। আবার যদি \"সংরক্ষণ\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
-'missingcommenttext' => 'দয়াকরে নিচে মন্তব্য যোগ করুন।',
+'missingcommenttext' => 'দয়া করে নিচে মন্তব্য যোগ করুন।',
 'missingcommentheader' => "'''খেয়াল করুন:''' আপনি এই মন্তব্যের জন্য কোন বিষয়/শিরোনাম দেননি। সংরক্ষণ বোতামে ক্লিক করলে, আপনার এই সম্পাদনা কোন বিষয়/শিরোনাম ছাড়াই সংরক্ষিত হবে।",
 'summary-preview' => 'সারাংশ প্রাকদর্শন:',
 'subject-preview' => 'বিষয়/শিরোনাম প্রাকদর্শন:',
@@ -707,7 +747,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 আপনার বর্তমান IP ঠিকানা হচ্ছে $3, এবং যা বাধা দানের আইডি হল $5।
 যেকোন প্রশ্ন করার সময় উপরের সকল তথ্য উল্লেখ করুন।',
 'blockednoreason' => 'কোন কারণ দেওয়া হয়নি',
-'whitelistedittext' => 'পাতায় à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦\86পশ্যই $1 করতে হবে।',
+'whitelistedittext' => 'পাতায় à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦\86বশ্যই $1 করতে হবে।',
 'confirmedittext' => 'কোন সম্পাদনা করার আগে আপনার ই-মেইল ঠিকানাটি অবশ্যই নিশ্চিত করতে হবে। দয়া করে আপনার ই-মেইল ঠিকানাটি [[Special:Preferences|ব্যবহারকারীর পছন্দতালিকায়]] ঠিকমত দিন।',
 'nosuchsectiontitle' => 'অনুচ্ছেদ পাওয়া যায়নি',
 'nosuchsectiontext' => 'আপনি এমন একটি অনুচ্ছেদ সম্পাদনার চেষ্টা করেছেন, যার কোন অস্তিত্ব নেই।
@@ -806,6 +846,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'template-protected' => '(সুরক্ষিত)',
 'template-semiprotected' => '(অর্ধ-সুরক্ষিত)',
 'hiddencategories' => 'এ পাতাটি যে {{PLURAL:$1|1 লুকায়িত বিষয়শ্রেণীর|$1 লুকায়িত বিষয়শ্রেণীসমূহের}} সদস্য:',
+'edittools-upload' => '-',
 'nocreatetext' => '{{SITENAME}}-এ নতুন পাতা সৃষ্টি করার ক্ষমতা সীমাবদ্ধ করা হয়েছে।
 আপনি ফিরে গিয়ে ইতিমধ্যে বিদ্যমান কোন পাতা সম্পাদনা করতে পারেন, অথবা [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ কিংবা অ্যাকাউন্ট সৃষ্টি করতে পারেন]]।',
 'nocreate-loggedin' => 'নতুন পাতা তৈরিতে আপনাকে অনুমোতি দেওয়া হয়নি।',
@@ -827,12 +868,15 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 সম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।',
 'edit-conflict' => 'সম্পাদনা সংঘাত।',
 'edit-no-change' => 'আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।',
+'postedit-confirmation' => 'আপনার সম্পাদনা সংরক্ষিত হয়েছে।',
 'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
 পাতাটি ইতিমধ্যেই বিদ্যমান।',
 'defaultmessagetext' => 'আদি টেক্সট',
 'content-failed-to-parse' => '$1 মডেলের জন্য $2 কন্টেন্ট পার্স করা যাচ্ছে না: $3',
 'invalid-content-data' => 'ভুল কন্টেন্ট ডাটা',
 'content-not-allowed-here' => '"$1" কন্টেন্টটি [[$2]] পাতায় অনুমোদিত নয়',
+'editwarning-warning' => 'এই পাতাটি ত্যাগ করলে আপনার আপনার করা পরিবর্তনগুলো হারিয়ে যেতে পারে।
+আপনি যদি লগইন করা থাকেন, আপনি এই সতর্কীকরণ বার্তাটি আপনার পছন্দের "সম্পাদনা" অনুচ্ছেদ থেকে নিস্ক্রিয় করতে পারেন।',
 
 # Content models
 'content-model-wikitext' => 'উইকিটেক্সট',
@@ -851,9 +895,9 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'post-expand-template-argument-warning' => "' ' ' সাবধান: ' ' ' এই পাতাটিতে অন্তত একটি ফর্মা যুক্তি আছে যা একটি খুব বড় বিস্তার আকার ধারণ করেছে।
 তাই এই আর্গুমেন্টটি বাদ দেওয়া হয়েছে।",
 'post-expand-template-argument-category' => 'বাদ ফর্মা আর্গুমেন্ট ধারণকারী পাতা',
-'parser-template-loop-warning' => 'à¦\9fà§\87মà§\8dপলেট লুপ সনাক্ত হয়েছে: [[$1]]',
-'parser-template-recursion-depth-warning' => 'টেমপ্লেট  পুনরাবৃত্তি (রিকার্শন)  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
-'language-converter-depth-warning' => 'ভাষা পরিবর্তন  ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
+'parser-template-loop-warning' => 'à¦\9fà§\87মপà§\8dলেট লুপ সনাক্ত হয়েছে: [[$1]]',
+'parser-template-recursion-depth-warning' => 'টেমপ্লেট পুনরাবৃত্তি (রিকার্শন) ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
+'language-converter-depth-warning' => 'ভাষা পরিবর্তন ডেপথ্‌ সীমা অতক্রম করেছে ($1)',
 'node-count-exceeded-category' => 'যে সকল পাতার নোড কাউন্ট সীমানা পার হয়েছে',
 'node-count-exceeded-warning' => 'পাতাটি নোড কাউন্ট সীমানা পার করেছে',
 'expansion-depth-exceeded-category' => 'যে সকল পাতার এক্সেপশন সীমানা অতিক্রম করেছে',
@@ -889,7 +933,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'last' => 'পূর্ববর্তী',
 'page_first' => 'প্রথম',
 'page_last' => 'শেষ',
-'histlegend' => 'পার্থক্য (Diff) নির্বাচন: যে সংস্করণগুলো তুলনা করতে চান, সেগুলো চিহ্নিত করে এন্টার বা নিচের বোতামটি টিপুন।<br />
+'histlegend' => 'পার্থক্য নির্বাচন: যে সংস্করণগুলো তুলনা করতে চান, সেগুলো চিহ্নিত করে এন্টার বা নিচের বোতামটি টিপুন।<br />
 নির্দেশিকা: (বর্তমান) = বর্তমান সংস্করণের সাথে পার্থক্য, (পূর্ববর্তী) =  পূর্বের সংস্করণের সাথে পার্থক্য, অ = অনুল্লেখ্য সম্পাদনা।',
 'history-fieldset-title' => 'ব্রাউজ ইতিহাস',
 'history-show-deleted' => 'শুধুমাত্র অপসারণ',
@@ -1116,15 +1160,7 @@ $1",
 'powersearch-togglenone' => 'কিছু নয়',
 'search-external' => 'বহিঃস্থ অনুসন্ধান',
 'searchdisabled' => '{{SITENAME}} অনুসন্ধান এখন নিষ্ক্রিয় আছে। আপনি গুগলের মাধ্যমে অনুসন্ধান চালাতে পারেন। লক্ষ্য করুন যে {{SITENAME}}-এর বিষয়বস্তুর উপর গুগলের ইন্ডেক্সগুলি হালনাগাদ না-ও করা থাকতে পারে।',
-
-# Quickbar
-'qbsettings' => 'কুইকবার',
-'qbsettings-none' => 'কিছুই না',
-'qbsettings-fixedleft' => 'স্থায়ী বাম',
-'qbsettings-fixedright' => 'স্থায়ী ডান',
-'qbsettings-floatingleft' => 'ভাসমান বাম',
-'qbsettings-floatingright' => 'ভাসমান ডান',
-'qbsettings-directionality' => 'ফিক্সড, আপনার ভাষার লেখা শুরুর দিকের উপর ভিত্তি করে',
+'search-error' => 'অনুসন্ধানের সময় একটি ত্রুটি হয়েছে: $1',
 
 # Preferences page
 'preferences' => 'আমার পছন্দ',
@@ -1209,6 +1245,7 @@ $1",
 'yourrealname' => 'আসল নাম *',
 'yourlanguage' => 'ভাষা:',
 'yourvariant' => 'বিষয়বস্তুর ভাষার বিকল্প:',
+'prefs-help-variant' => 'উইকিতে কন্টেন্ট পাতা দেখার জন্য আপনার পছন্দের বৈশিষ্ট।',
 'yournick' => 'স্বাক্ষর:',
 'prefs-help-signature' => 'আলাপ পাতায় আপনার মন্তব্য অবশ্যই "<nowiki>~~~~</nowiki>" চিহ্ন দ্বারা স্বাক্ষরিত হতে হবে, যা স্বয়ংক্রিয়ভাবে আপনার স্বাক্ষর ও সময় সংযুক্ত করবে।',
 'badsig' => 'অবৈধ স্বাক্ষর; এইচটিএমএল ট্যাগ পরীক্ষা করুন।',
@@ -1265,6 +1302,7 @@ $1",
 'userrights-notallowed' => 'আপনার অ্যাকাউন্ট থেকে ব্যবহারকারী অধিকার যুক্ত বা অপসারণ করার অনুমতি নেই।',
 'userrights-changeable-col' => 'দল যা আপনি পরিবর্তন করতে পারেন',
 'userrights-unchangeable-col' => 'দল যা আপনি পরিবর্তন করতে পারবেন না',
+'userrights-conflict' => 'ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে পুনরায় চেষ্টা করুন।',
 
 # Groups
 'group' => 'দল:',
@@ -1310,6 +1348,7 @@ $1",
 'right-purge' => 'নিশ্চিতকরণ ছাড়াই সাইটের ক্যাশ পার্জ করুন',
 'right-autoconfirmed' => 'অর্ধ-সুরক্ষিত পাতা সম্পাদনা',
 'right-bot' => 'সয়ংক্রিয় পদ্ধতি হিসাবে চিহ্নিত করণ',
+'right-nominornewtalk' => 'বার্তা লেখার মত আলাপ পাতায় কোনো অনুল্লেখ্য সম্পাদনা নেই',
 'right-apihighlimits' => 'API কোয়েরি হিসাবে আরও উচ্চ লিমিট ব্যবহার করুন',
 'right-writeapi' => 'write API এর ব্যবহার',
 'right-delete' => 'পাতা মুছে ফেলুন',
@@ -1665,7 +1704,6 @@ $1',
 'http-read-error' => 'HTTP পঠন ত্রুটি।',
 'http-timed-out' => 'HTTP অনুরোধের সময় পার হয়েছে।',
 'http-curl-error' => 'ইউআরএল নিয়ে আসার ক্ষেত্রে ত্রুটি: $1',
-'http-host-unreachable' => 'URL-এ পৌঁছানো যায়নি',
 'http-bad-status' => 'HTTP অনুরোধের সময় কোন সমস্যা হয়েছে: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1735,6 +1773,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'uploadnewversion-linktext' => 'এই ফাইলটির একটি নতুন সংস্করণ আপলোড করুন',
 'shared-repo-from' => '$1 থেকে',
 'shared-repo' => 'শেয়ার্ড রিপোজিটরী',
+'shared-repo-name-wikimediacommons' => 'উইকিমিডিয়া কমন্স',
 'upload-disallowed-here' => 'আপনি এই ফাইলটি প্রতিস্থাপন করতে পারবেন না।',
 
 # File reversion
@@ -1819,6 +1858,10 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 এর পরিবর্তে এগুলি থেকে একটি উপযুক্ত বিষয়ে সংযোগ থাকা আবশ্যক।<br />
 যদি কোন পাতায় এমন কোন টেমপ্লেট থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে একটি দ্ব্যর্থতা নিরসন পাতা হিসেবে গণ্য করা হয়।",
 
+'pageswithprop' => 'পাতার উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-legend' => 'পাতার উপাদান সম্বলিত পৃষ্ঠাসমূহ',
+'pageswithprop-text' => 'একটি নির্দিষ্ট পাতার বৈশিষ্ট রয়েছে এমন পাতাসমূহের তালিকা।',
+'pageswithprop-prop' => 'বৈশিষ্টের নাম:',
 'pageswithprop-submit' => 'চলো',
 
 'doubleredirects' => 'দুইবার করা পুনর্নির্দেশনাগুলি',
@@ -1914,6 +1957,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 # Book sources
 'booksources' => 'বইয়ের উৎস',
 'booksources-search-legend' => 'বইয়ের উৎসের জন্য অনুসন্ধান করা হোক',
+'booksources-isbn' => 'আইএসবিএন:',
 'booksources-go' => 'চলো',
 'booksources-text' => 'নতুন ও পুরাতন ব্যবহৃত বই বিক্রি করে, এমন কতগুলি সাইটের সংযোগের তালিকা নিচে দেওয়া হল, যে সাইটগুলিতে আপনার অনুসন্ধানকৃত বইগুলির উপর আরও তথ্য থাকতে পারে:',
 'booksources-invalid-isbn' => 'উল্লেখিত ISBN সঠিক নয়; অনুগ্রহ করে মূল উৎস থেকে আবার পরীক্ষা করুন।',
@@ -1986,7 +2030,7 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 # Special:ActiveUsers
 'activeusers' => 'সক্রিয় ব্যবহারকারী তালিকা',
 'activeusers-intro' => 'এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।',
-'activeusers-count' => 'গত {{PLURAL:$3|দিনে|$3 দিনে}} সর্বমোট {{PLURAL:$1|সম্পাদনার|সম্পাদনার}} সংখ্যা $1',
+'activeusers-count' => 'গত {{PLURAL:$3|দিনে}} সর্বমোট {{PLURAL:$1|পদ}} সংখ্যা $1',
 'activeusers-from' => 'ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:',
 'activeusers-hidebots' => 'বট লুকাও',
 'activeusers-hidesysops' => 'প্রশাসক লুকাও',
@@ -2070,8 +2114,8 @@ Maybe you want to edit the description on its [$2 file description page] there.'
 'notvisiblerev' => 'অপর একজন ব্যবহারকারী কর্তৃক প্রণীত সর্বশেষ সংস্করণটি অপসারিত হয়েছে',
 'watchnochange' => 'প্রদর্শিত সময়সীমার মধ্যে আপনার নজরতালিকায় রাখা কোন পাতায় কোন রকম সম্পাদনা ঘটেনি।',
 'watchlist-details' => 'নজরতালিকাতে {{PLURAL:$1|$1টি পাতা|$1টি পাতা}} আছে (আলাপ পাতাগুলি গণনায় না ধরে)।',
-'wlheader-enotif' => '* ই-মেইল এর মাধমে নির্দেশনার ব্যবস্থা চালু করা আছে।',
-'wlheader-showupdated' => "* আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে",
+'wlheader-enotif' => 'ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।',
+'wlheader-showupdated' => "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
 'watchmethod-recent' => 'নজরে রাখা পাতাগুলিতে সাম্প্রতিক পরিবর্তন পরীক্ষা করা হচ্ছে',
 'watchmethod-list' => 'নজরে রাখা পাতাগুলিতে সাম্প্রতিক পরিবর্তন পরীক্ষা করা হচ্ছে',
 'watchlistcontains' => 'আপনার নজরতালিকায় $1 টি {{PLURAL:$1|পাতা|পাতা}} রয়েছে।',
@@ -2199,6 +2243,7 @@ $UNWATCHURL
 'prot_1movedto2' => '[[$1]]-কে [[$2]]-এ সরিয়ে নেওয়া হয়েছে',
 'protect-badnamespace-title' => 'নামস্থানটি সুরক্ষিত করা সম্ভব নয়',
 'protect-badnamespace-text' => 'এই নামস্থানের পাতাগুলো সুরক্ষিত করা সম্ভব নয়।',
+'protect-norestrictiontypes-text' => 'এই পাতাটি সুরক্ষিত করা যাচ্ছে না কারণ এখানে সুরক্ষার কোনো বেশিষ্ট নেই।',
 'protect-norestrictiontypes-title' => 'সুরক্ষা প্রযোজ্য নয় এমন পাতা',
 'protect-legend' => 'সুরক্ষা নিশ্চিত করুন',
 'protectcomment' => 'কারণ:',
@@ -2478,7 +2523,9 @@ $1',
 'proxyblocksuccess' => 'নিষ্পন্ন হয়েছে।',
 'sorbsreason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে।',
 'sorbs_create_account_reason' => 'আপনার আইপি ঠিকানাটি {{SITENAME}}-এর ব্যবহার করা DNSBL-এ উন্মুক্ত প্রক্সি হিসেবে তালিকাভুক্ত আছে। আপনি কোন অ্যাকাউন্ট সৃষ্টি করতে পারবেন না।',
+'xffblockreason' => 'X-Forwarded-For হেডারে থাকা আইপি ঠিকানাটি ব্লক করা হয়েছে, হয় এটি আপনার নিজের অথবা আপনার ব্যবহৃত প্রক্সি সার্ভারের আইপি ঠিকানা। ব্লক করার কারণ হল: $1',
 'cant-block-while-blocked' => 'আপনি নিজে ব্লক থাকা অবস্থায় অন্যন্য ব্যবহারকারীকে ব্লক করতে পারবেন না।',
+'cant-see-hidden-user' => 'আপনি যে ব্যবহারকারীকে ব্লক বা লুকিয়ে রাখতে চাচ্ছেন তাকে আগে থেকেই ব্লক বা লুকিয়ে রাখা হয়েছে। এছাড়া আপনার Hideuser অধিকার নেই, তাই আপনি ব্যবহারকারীর অবস্থা পরিবর্তন করতে পারবেন না।',
 'ipbblocked' => 'আপনি অন্য কোন ব্যবহারকরীকে ব্লক বা আনব্লক করতে পারবেন না, কারণ আপনি নিজেই ব্লক রয়েছেন',
 'ipbnounblockself' => 'আপনি নিজেকে আনব্লক করতে পারবেন না',
 
@@ -2517,6 +2564,17 @@ $1',
 
 '''সতর্কীকরণ!'''
 কোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে; অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
+'movepagetext-noredirectfixer' => "নিচের ফর্মটি ব্যবহার করে একটি পাতার শিরোনাম পরিবর্তন করা যাবে, এবং সেই সাথে নতুন শিরোনামে এর সমগ্র ইতিহাস স্থানান্তর করা যাবে।
+পুরনো শিরোনামটি নতুন শিরোনামটির প্রতি একটি পুনর্নির্দেশনা ধারণ করবে।
+[[Special:DoubleRedirects|দ্বি-পুনর্নির্দেশনা]] বা [[Special:BrokenRedirects|অচল পুনর্নির্দেশনাগুলি]] পরীক্ষা করে দেখতে ভুলবেন না।
+সংযোগগুলি যাতে তাদের লক্ষ্যে পৌঁছায়, তা নিশ্চিত করার দায়িত্ব আপনার।
+
+লক্ষ্য করুন যে যদি নতুন শিরোনামে ইতিমধ্যেই একটি পাতা থেকে থাকে, তবে উৎস পাতাটি সেই শিরোনামে স্থানান্তর করা হবে '''না''', যদি না নতুন শিরোনামের পাতাটি খালি থাকে বা একটি পুননির্দেশনা হয় এবং এর কোন অতীত সম্পাদনা ইতিহাস না থাকে। 
+অর্থাৎ আপনি ভুল করে নাম পরিবর্তন করলে সহজেই পুরনো নামে ফেরত যেতে পারবেন, কিন্তু ইতিমধ্যে বিদ্যমান কোন পাতার উপরে লিখতে পারবেন না।
+
+'''সতর্কীকরণ!'''
+কোন জনপ্রিয় পাতার ক্ষেত্রে এই পরিবর্তনটি খুবই আকস্মিক হতে পারে;
+অগ্রসর হবার আগে এই কাজটির ফলাফল কী হতে পারে, সে ব্যাপারে অনুগ্রহ করে নিশ্চিত হোন।",
 'movepagetalktext' => "পাতাটির সাথে সাথে সংশ্লিষ্ট আলোচনা পাতাটিও স্বয়ংক্রিয়ভাবে সরানো হবে '''যদি না:'''
 *খালি নয় এমন একটি আলাপ পাতা নতুন শিরোনামটির অধীনে ইতিমধ্যেই বিদ্যমান থাকে, অথবা
 *আপনি নিচের বাক্সটি থেকে টিক সরিয়ে নিতে পারেন।
@@ -2567,6 +2625,7 @@ $1',
 'immobile-target-namespace-iw' => 'পাতা স্থানান্তরের ক্ষেত্রে ইন্টারউইকি লিংক ব্যবহার করা যাবে না।',
 'immobile-source-page' => 'এই পাতাটির স্থানান্তর সম্ভব নয়।',
 'immobile-target-page' => 'গন্তব্য শিরোনামে স্থানান্তর করা যাবে না।',
+'bad-target-model' => 'আপনার উল্লেখিত কন্টেন্ট মডেলটি আলাদা। $1 থেকে $2 কনভার্ট করা যাচ্ছে না।',
 'imagenocrossnamespace' => 'কোনো ফাইল ফাইলনয় এমন নামস্থানে স্থানান্তর সম্ভব নয়',
 'nonfile-cannot-move-to-file' => 'কোনো ফাইলনয় এমন কোনো পাতা ফাইল নামস্থানে স্থানান্তর সম্ভব নয়',
 'imagetypemismatch' => 'নতুন ফাইল এক্সটেনশনটি ফাইলের ধরনের সাথে মিলছে না',
@@ -2601,6 +2660,7 @@ $1',
 'export-addns' => 'যোগ',
 'export-download' => 'ফাইল হিসেবে সংরক্ষণ করা হোক',
 'export-templates' => 'টেম্পলেট অন্তর্ভুক্তি',
+'export-pagelinks' => 'সম্পর্কিত পাতাগুলো এই ধাপ পর্যন্ত যুক্ত করো:',
 
 # Namespace 8 related
 'allmessages' => 'সিস্টেম বার্তাসমূহ',
@@ -2611,6 +2671,7 @@ $1',
 আপনি যদি সাধারণ মিডিয়াউইকির স্থানীয়করণে অবদান রাখতে আগ্রহী হন, অনুগ্রহ করে [//www.mediawiki.org/wiki/Localisation মিডিয়াউইকি স্থানীয়করণ] এবং [//translatewiki.net translatewiki.net] দেখুন।',
 'allmessagesnotsupportedDB' => "এই পাতা ব্যবহার করা যাবে না কারণ '''\$wgUseDatabaseMessages''' বন্ধ করে রাখা আছে।",
 'allmessages-filter-legend' => 'ছাকনী',
+'allmessages-filter' => 'Filter by customization state:',
 'allmessages-filter-unmodified' => 'অপরিবর্তিত',
 'allmessages-filter-all' => 'সমস্ত',
 'allmessages-filter-modified' => 'পরিবর্তিত',
@@ -2622,6 +2683,8 @@ $1',
 'thumbnail-more' => 'বড় করো',
 'filemissing' => 'ফাইল হারিয়ে গেছে',
 'thumbnail_error' => 'থাম্বনেইল সৃষ্টি করতে গিয়ে ত্রুটি: $1',
+'thumbnail_error_remote' => '$1 থেকে ত্রুটির বার্তা:
+$2',
 'djvu_page_error' => 'DjVu পাতা সীমার বাইরে',
 'djvu_no_xml' => 'DjVu ফাইলের জন্য XML আনতে পারা যায়নি।',
 'thumbnail-temp-create' => 'অস্থায়ী থাম্বনেইল ফাইল তৈরী করা সম্ভব নয়',
@@ -2629,6 +2692,7 @@ $1',
 'thumbnail_invalid_params' => 'থাম্বনেইল প্যারামিটারগুলি অবৈধ',
 'thumbnail_dest_directory' => 'গন্তব্য ডিরেক্টরি তৈরি করা যায়নি',
 'thumbnail_image-type' => 'চিত্রের ধরন সমর্থন করে না',
+'thumbnail_gd-library' => 'অসম্পূর্ণ জিডি লাইব্রেরী কনফিগারেশন: $1 ফাংশন নেই',
 'thumbnail_image-missing' => 'ফাইলটি খুজে পাওয়া যাচ্ছে না: $1',
 
 # Special:Import
@@ -2642,6 +2706,7 @@ $1',
 'import-interwiki-templates' => 'সকল টেম্পলেট অন্তর্ভুক্ত',
 'import-interwiki-submit' => 'আমদানি',
 'import-interwiki-namespace' => 'গন্তব্য নামস্থান:',
+'import-interwiki-rootpage' => 'মূল পাতা (ঐচ্ছিক):',
 'import-upload-filename' => 'ফাইলনাম:',
 'import-comment' => 'মন্তব্য:',
 'importtext' => 'অনুগ্রহ করে ফাইলটি উৎস উইকি থেকে [[Special:Export|এক্সপোর্ট ইউটিলিটি]] ব্যবহার করে এক্সপোর্ট করুন।
@@ -2675,6 +2740,7 @@ $1',
 'import-error-interwiki' => '"$1" পাতাটি ইম্পোর্ট করা যায়নি কারণ এই নামটি বহিঃসংযোগর জন্য নির্ধারিত (ইন্টারউইকি)।',
 'import-error-special' => '"$1" পাতাটি ইম্পোর্ট করা যায়নি কারণ এটি একটি বিশেষ নামস্থানকে নির্দেশ করে যেটি সম্পাদনার জন্য অনুমোদিত নয়।',
 'import-error-invalid' => '"$1" পাতাটি ইম্পোর্ট করা যায়নি কারণ নামটি সঠিক নয়।',
+'import-error-unserialize' => '$1 পাতার $2 সংস্করণটি সিরিয়ালাইজ করা যাচ্ছে না। এই রিভিশনে $4 হিসাবে $3 কন্টেন্ট মডেলে সিরিয়ালাইজ করা আছে।',
 'import-options-wrong' => 'ভুল {{PLURAL:$2|অপশন|অপশনসমূহ}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'মূল পাতার ভুল শিরনাম দেয়া হয়েছে।',
 'import-rootpage-nosubpage' => 'মূল পাতার "$1" নামস্থানে উপপাতা তৈরী অনুমোদিত নয়।',
@@ -2792,6 +2858,7 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" এর তথ্য',
+'pageinfo-not-current' => 'দুঃখিত, পুরাতন সংস্করণের জন্য এই তথ্য প্রদর্শন সম্ভব নয়।',
 'pageinfo-header-basic' => 'সাধারণ তথ্য',
 'pageinfo-header-edits' => 'সম্পাদনা ইতিহাস',
 'pageinfo-header-restrictions' => 'পাতা সুরক্ষা',
@@ -2806,6 +2873,7 @@ $1',
 'pageinfo-robot-noindex' => 'ইনডেক্সের অনুপযোগী',
 'pageinfo-views' => 'পরিদর্শন সংখ্যা',
 'pageinfo-watchers' => 'পাতাটি প্রদর্শনের সংখ্যা',
+'pageinfo-few-watchers' => '$1 জন {{PLURAL:$1|নজরকারীও}} কম',
 'pageinfo-redirects-name' => 'এই পাতার রিডাইরেক্ট সমূহ',
 'pageinfo-subpages-name' => 'এই পাতার উপপাতাসমূহ',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|পুনর্নির্দেশ|পুনর্নির্দেশসমূহ}}; $3 {{PLURAL:$3|পুনর্নির্দেশ নেই|পুনর্নির্দেশ নেই}})',
@@ -2820,17 +2888,26 @@ $1',
 'pageinfo-magic-words' => 'ম্যাজিক {{PLURAL:$1|শব্দ|শব্দসমূহ}} ($1)',
 'pageinfo-hidden-categories' => 'লুকানো {{PLURAL:$1|বিষয়শ্রেণী|বিষয়শ্রেণীসমূহ}} ($1)',
 'pageinfo-templates' => 'সংযুক্ত {{PLURAL:$1|টেমপ্লেট|টেমপ্লেটসমূহ}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|পাতা|পাতাসমূহ}} ট্রান্সক্লুড করার সময় ($1)',
 'pageinfo-toolboxlink' => 'পাতার তথ্য',
 'pageinfo-redirectsto' => 'পুননির্দেশিত হয়েছে',
 'pageinfo-redirectsto-info' => 'তথ্য',
 'pageinfo-contentpage' => 'তথ্য পাতা হিসাবে বিবেচিত হয়েছে',
 'pageinfo-contentpage-yes' => 'হ্যাঁ',
+'pageinfo-protect-cascading' => 'ক্যাসকেডিং সুরক্ষা পদ্ধতি চালু রয়েছে',
 'pageinfo-protect-cascading-yes' => 'হ্যাঁ',
+'pageinfo-protect-cascading-from' => 'ক্যাসকেডিং সুরক্ষা পদ্ধতি',
 'pageinfo-category-info' => 'বিষয়শ্রেণী তথ্য',
 'pageinfo-category-pages' => 'পাতার সংখ্যা',
 'pageinfo-category-subcats' => 'উপবিষয়শ্রেণীর সংখ্যা',
 'pageinfo-category-files' => 'ফাইলের সংখ্যা',
 
+# Skin names
+'skinname-cologneblue' => 'কলোন ব্লু',
+'skinname-monobook' => 'মনোবুক',
+'skinname-modern' => 'মডার্ন',
+'skinname-vector' => 'ভেক্টর',
+
 # Patrolling
 'markaspatrolleddiff' => 'পরীক্ষিত বলে চিহ্নিত করুন',
 'markaspatrolledtext' => 'এই নিবন্ধটিকে পরীক্ষিত বলে চিহ্নিত করুন',
@@ -2841,6 +2918,8 @@ $1',
 'markedaspatrollederror' => 'পরীক্ষিত বলে চিহ্নিত করা যাবে না',
 'markedaspatrollederrortext' => 'পরীক্ষিত বলে চিহ্নিত করতে আপনাকে একটি সংস্করণ নির্দিষ্ট  করতে হবে।',
 'markedaspatrollederror-noautopatrol' => 'আপনার নিজের পাতাকে পরীক্ষিত বলে চিহ্নিত করার অনুমতি আপনার নেই।',
+'markedaspatrollednotify' => '$1 এর পরিবর্তন পরীক্ষিত হিসাবে চিহ্নিত করা হয়েছে।',
+'markedaspatrollederrornotify' => 'পরীক্ষিত হিসাবে চিহ্নিত করতে ব্যর্থ।',
 
 # Patrol log
 'patrol-log-page' => 'পরীক্ষণ লগ',
@@ -2899,15 +2978,30 @@ $1',
 'sp-newimages-showfrom' => '$2, $1 এর পরের নতুন ছবিগুলো দেখাও',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'minutes-abbrev' => '$1 মিনিট',
 'seconds' => '{{PLURAL:$1|$1 সেকেন্ড|$1 সেকেন্ড}}',
 'minutes' => '{{PLURAL:$1|$1 মিনিট|$1 মিনিট}}',
 'hours' => '{{PLURAL:$1|$1 ঘণ্টা|$1 ঘণ্টা}}',
 'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
+'weeks' => '{{PLURAL:$1|$1 সপ্তাহ}}',
 'months' => '{{PLURAL:$1|$1 মাস}}',
 'years' => '{{PLURAL:$1|$1 বছর}}',
 'ago' => '$1 আগে',
 'just-now' => 'এখনই',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => 'ফরম্যাটটি এরকম:
 
@@ -2934,7 +3028,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'চওড়া',
 'exif-imagelength' => 'লম্বা',
 'exif-bitspersample' => 'উপাদানপ্রতি বিট',
@@ -3112,8 +3206,11 @@ $1',
 'exif-originalimageheight' => 'ক্রপ করার পূর্বে চিত্রটির উচ্চতা',
 'exif-originalimagewidth' => 'ক্রপ করার পূর্বে চিত্রটির প্রস্থ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'অসংকুচিত',
+'exif-compression-2' => 'সিসিআইটিটি গ্রুপ ৩ ১-ডাইমেনশনাম মডিফাইড হাফম্যান রান লেংক্থ এনকোডিং',
+'exif-compression-3' => 'সিসিআইটিটি গ্রুপ ৩ ফ্যাক্স এনকোডিং',
+'exif-compression-4' => 'সিসিআইটিটি গ্রুপ ৪ ফ্যাক্স এনকোডিং',
 
 'exif-copyrighted-true' => 'কপিরাইটকৃত',
 'exif-copyrighted-false' => 'পাবলিক ডোমেইন',
@@ -3182,6 +3279,7 @@ $1',
 'exif-flash-return-2' => 'স্ট্রোবের আলো চিহ্নিত করা যায়নি',
 'exif-flash-return-3' => 'স্ট্রোবের আলো চিহ্নিত হয়েছে',
 'exif-flash-mode-1' => 'বাধ্যতামূলকভাবে ফ্ল্যাশ ব্যবহৃত হয়েছে',
+'exif-flash-mode-2' => 'বাধ্যতামূলক ফ্ল্যাশ নিষ্ক্রিয়',
 'exif-flash-mode-3' => 'স্বয়ংক্রিয় মোড',
 'exif-flash-function-1' => 'ফ্ল্যাশ ব্যবহৃত হয়নি',
 'exif-flash-redeye-1' => 'রেড-আই হ্রাস মোড',
@@ -3284,6 +3382,7 @@ $1',
 'exif-ycbcrpositioning-2' => 'কো-সাইটেড',
 
 'exif-dc-contributor' => 'অবদানকারী',
+'exif-dc-coverage' => 'মিডিয়া ফাইলের বিশেষ অথবা অস্থায়ী ক্ষেত্র',
 'exif-dc-date' => 'তারিখ',
 'exif-dc-publisher' => 'প্রকাশক',
 'exif-dc-relation' => 'সম্পর্কিত মিডিয়া',
@@ -3357,13 +3456,38 @@ $3
 
 $5
 
+$4-এ নিশ্চিতকরণ কোডটি মেয়াদোত্তীর্ণ হয়ে যাবে।',
+'confirmemail_body_changed' => 'কেউ একজন, সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে,
+{{SITENAME}}-এ "$2" নামে অ্যাকাউন্টের ইমেরইল ঠিকানা পরিবর্তন করেছেন।
+
+এই অ্যাকাউন্টটি যে আসলেই আপনার তা নিশ্চিত করার জন্য এবং {{SITENAME}}-এ ই-মেইল বৈশিষ্ট্যগুলো সক্রিয় করার জন্য আপনার ব্রাউজারে এই সংযোগটি খুলুন:
+
+$3
+
+যদি আপনি এই ব্যক্তি *না* হন, তাহলে ইমেইল ঠিকানা নিশ্চিতকরণ বাতিল করতে এই লিঙ্কটি অনুসরণ করুন"
+
+$5
+
+$4-এ নিশ্চিতকরণ কোডটি মেয়াদোত্তীর্ণ হয়ে যাবে।',
+'confirmemail_body_set' => 'কেউ একজন, সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে,
+{{SITENAME}}-এ "$2" অ্যকাউন্টের ইমেইল ঠিকানা নির্ধারণ করেছেন।
+
+এই অ্যাকাউন্টটি যে আসলেই আপনার তা নিশ্চিত করার জন্য এবং {{SITENAME}}-এ ই-মেইল বৈশিষ্ট্যগুলো সক্রিয় করার জন্য আপনার ব্রাউজারে এই সংযোগটি খুলুন:
+
+$3
+
+যদি আপনি এই ব্যক্তি *না* হন, তাহলে ইমেইল ঠিকানা নিশ্চিতকরণ বাতিল করতে এই লিঙ্কটি অনুসরণ করুন"
+
+$5
+
 $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত্তীর্ণ হয়ে যাবে।',
 'confirmemail_invalidated' => 'ইমেইল ঠিকানা নিশ্চিতকরণ বাতিল হয়েছে',
 'invalidateemail' => 'ইমেইল নিশ্চিতকরণ বাতিল করুন',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[আন্তঃউইকি আন্তঃভুক্তি নিষ্ক্রিয়]',
-'scarytranscludefailed' => '[$1 এর জন্য টেম্পলেট আনা অসফল হয়েছে]',
+'scarytranscludefailed' => '[$1 এর জন্য টেমপ্লেট আনা অসফল হয়েছে]',
+'scarytranscludefailed-httpstatus' => '[$1: HTTP $2 এর জন্য টেমপ্লেট আনা বিফল হয়েছে]',
 'scarytranscludetoolong' => '[URL অতিরিক্ত দীর্ঘ]',
 
 # Delete conflict
@@ -3415,6 +3539,14 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'size-megabytes' => '$1 মেগাবাইট',
 'size-gigabytes' => '$1 গিগাবাইট',
 
+# Bitrate units
+'bitrate-kilobits' => '$1 কেবিপিএস',
+'bitrate-megabits' => '$1 এমবিপিএস',
+'bitrate-gigabits' => '$1 জিবিপিএস',
+'bitrate-terabits' => '$1 টিবিপিএস',
+'bitrate-petabits' => '$1 পিবিপিএস',
+'bitrate-exabits' => '$1 ইবিপিএস',
+
 # Live preview
 'livepreview-loading' => 'লোডিং...',
 'livepreview-ready' => 'লোডিং… প্রস্তুত!',
@@ -3452,6 +3584,39 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'watchlisttools-edit' => 'নজর তালিকা দেখুন এবং সম্পাদনা করুন',
 'watchlisttools-raw' => 'অশোধিত নজরতালিকা সম্পাদনা করুন',
 
+# Iranian month names
+'iranian-calendar-m1' => 'ফারওয়ারদিন',
+'iranian-calendar-m2' => 'অর্দিবেহেশ্‌ত',
+'iranian-calendar-m3' => 'খোরদাদ',
+'iranian-calendar-m4' => 'তির',
+'iranian-calendar-m5' => 'মোরদাদ',
+'iranian-calendar-m6' => 'শাহ্‌রিওয়ার',
+'iranian-calendar-m7' => 'মেহ্‌র',
+'iranian-calendar-m8' => 'আবান',
+'iranian-calendar-m9' => 'আজার',
+'iranian-calendar-m10' => 'দেই',
+'iranian-calendar-m11' => 'বাহ্‌মান',
+'iranian-calendar-m12' => 'এসফান্দ',
+
+# Hijri month names
+'hijri-calendar-m1' => 'মুহররম',
+'hijri-calendar-m2' => 'সফর',
+'hijri-calendar-m3' => 'রবিউল আউয়াল',
+'hijri-calendar-m4' => 'রবিউস সানি',
+'hijri-calendar-m5' => 'জমাদিউল আউয়াল',
+'hijri-calendar-m6' => 'জমাদিউস সানি',
+'hijri-calendar-m7' => 'রজব',
+'hijri-calendar-m8' => "শা'বান",
+'hijri-calendar-m9' => 'রমজান',
+'hijri-calendar-m10' => 'শাওয়াল',
+'hijri-calendar-m11' => 'জ্বিলকদ',
+'hijri-calendar-m12' => 'জ্বিলহজ্জ',
+
+# Hebrew month names
+'hebrew-calendar-m10' => 'তামুয',
+'hebrew-calendar-m11' => 'আভ',
+'hebrew-calendar-m12' => 'এলুল',
+
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|আলাপ]])',
 
@@ -3479,6 +3644,12 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-license' => 'লাইসেন্স',
 'version-poweredby-credits' => "এইক উইকিটি পরিচালিত হচ্ছে '''[//www.mediawiki.org/ মিডিয়াউইকি]'''-এর মাধ্যমে, কপিরাইট © ২০০১-$1 $2।",
 'version-poweredby-others' => 'অন্যান্য',
+'version-credits-summary' => '[[Special:Version|মিডিয়াউইকি]] সফটওয়্যারে অবদানের জন্য আমরা এই ব্যক্তিকে স্বীকৃতি দিতে চাই।',
+'version-license-info' => 'মিডিয়াউইকি এ++++কটি ফ্রি সফটওয়্যার, আপনি এটি বিতরণ করতে পারবেন এবং/অথবা সম্পদানা করতে পারবেন, এক্ষেত্রে ফ্রি সফটওয়্যার ফাউন্ডেশনের প্রকাশিত গনু জেনারেল পাবলিক লাইসেন্সের ২য় অথবা সাম্প্রতিকতম কোনো সংস্করণ মেনে চলতে হবে। 
+
+সকলের উপকারের লক্ষ্যে এটি বিতরণ করা হয়ে থাকে, কিন্তু এক্ষেত্রে কোনো ওয়ারেন্টি দেয়া হয় না, এমনকি বিশেষ কোনো কার্যক্ষেত্রে ব্যবহারের জন্যও তথাকথিত ওয়ারেন্টি দেয়া হয় না। বিস্তারিত জানতে দেখুন গনু জেনারেল পাবলিক লাইসেন্স। 
+
+এই সফটওয়্যারের সাথে [{{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' => 'সংস্করণ',
@@ -3486,12 +3657,17 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-entrypoints-header-entrypoint' => 'শুরু',
 'version-entrypoints-header-url' => 'ইউআরএল',
 
-# Special:FilePath
-'filepath' => 'ফাইলের পাথ',
-'filepath-page' => 'ফাইল:',
-'filepath-submit' => 'চলো',
-'filepath-summary' => 'এই বিশেষ পাতায় ফাইলের পূর্ণাঙ্গ পাথ দেখা যাবে।
-চিত্রগুলো পূর্ণ রেজ্যুলেশনে প্রদর্শিত হবে, অন্যান্য ধরনের ফাইলগুলো তার নির্ধারিত প্রোগ্রামের মাধ্যমে ওপেন হবে।',
+# Special:Redirect
+'redirect' => 'ফাইল, ব্যবহারকরী, অথবা রিভিশন আইডি দ্বারা পুনঃনির্দেশ করা হয়েছে',
+'redirect-legend' => 'একটি ফাইল অথবা পাতায় পুনঃনির্দেশ করা হয়েছে',
+'redirect-summary' => 'এই বিশেষ পাতাটি পুনঃনির্দেশিত হয়েছে একটি ফাইলে (ফাইলের নাম), একটি পাতা (রিভিশন আইডি), অথবা একটি ব্যবহারকরী পাতায় (সংখ্যায় লেখা ব্যবহারকারী আইডি)।',
+'redirect-submit' => 'যাও',
+'redirect-lookup' => 'দেখুন:',
+'redirect-value' => 'মান:',
+'redirect-user' => 'ব্যবহারকারী আইডি',
+'redirect-revision' => 'পাতা সংস্করণ',
+'redirect-file' => 'ফাইলের নাম',
+'redirect-not-exists' => 'মান পাওয়া যায়নি',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ডুপ্লিকেট ফাইলের জন্য অনুসন্ধান',
@@ -3541,7 +3717,9 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'tag-filter' => '[[Special:Tags|ট্যাগ]] ছাকনী:',
 'tag-filter-submit' => 'ছাকনী',
 'tags-title' => 'ট্যাগসমূহ',
+'tags-intro' => 'এই পাতায় সফটওয়্যারটি একটি সম্পাদনা চিহ্নিত করার জন্য যে সকল ট্যাগ ব্যবহার করে তার তালিকা ও বর্ণনা রয়েছে।',
 'tags-tag' => 'ট্যাগ নাম',
+'tags-display-header' => 'পরিনর্তন পাতার বৈশিষ্ট',
 'tags-description-header' => 'অর্থের পূর্ণ বণনা',
 'tags-hitcount-header' => 'ট্যাগকৃত পরিবর্সতনমূহ',
 'tags-edit' => 'সম্পাদনা',
@@ -3580,6 +3758,9 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'htmlform-submit' => 'জমা দাও',
 'htmlform-reset' => 'পরিবর্তন বাতিল',
 'htmlform-selectorother-other' => 'অন্য',
+'htmlform-no' => 'না',
+'htmlform-yes' => 'হ্যাঁ',
+'htmlform-chosen-placeholder' => 'অপশন নির্বাচন করুন',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 সহ পূর্ণ টেক্সট সার্চ সমর্থন',
@@ -3587,15 +3768,16 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 
 # New logging system
 'logentry-delete-delete' => '$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে',
-'logentry-delete-restore' => '$1 কর্তৃক $3 পাতাটি ফিরিয়ে আনা হয়েছে',
-'logentry-delete-event' => '$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
-'logentry-delete-revision' => '$1 {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
-'logentry-delete-event-legacy' => '$1 $3টায় লগ ইভেন্টসমূহরে ভিজিবিলিটি পরিবর্তন করেছেন',
-'logentry-delete-revision-legacy' => '$1 $3টায় সংস্করণসমূহরে ভিজিবিলিটি পরিবর্তন করেছেন',
-'logentry-suppress-event' => '$1 গোপনে {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
-'logentry-suppress-revision' => '$1 গোপনে {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহর}} ভিজিবিলিটি পরিবর্তন করেছেন $3: $4',
-'logentry-suppress-event-legacy' => '$1 গোপনে $3টায় লগ ইভেন্টসমূহরে ভিজিবিলিটি পরিবর্তন করেছেন',
-'logentry-suppress-revision-legacy' => '$1 গোপনে $3টায় সংস্করণসমূহরে ভিজিবিলিটি পরিবর্তন করেছেন',
+'logentry-delete-restore' => '$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে',
+'logentry-delete-event' => '$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4',
+'logentry-delete-revision' => '$1 {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4',
+'logentry-delete-event-legacy' => '$1 $3টায় লগ ইভেন্টসমূহের ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন',
+'logentry-delete-revision-legacy' => '$1 $3টায় সংস্করণসমূহের ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন',
+'logentry-suppress-delete' => '$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে',
+'logentry-suppress-event' => '$1 গোপনে {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4',
+'logentry-suppress-revision' => '$1 গোপনে {{PLURAL:$5|একটি সংস্করণের|$5 সংস্করণসমূহের}} ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4',
+'logentry-suppress-event-legacy' => '$1 গোপনে $3টায় লগ ইভেন্টসমূহের ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন',
+'logentry-suppress-revision-legacy' => '$1 গোপনে $3টায় সংস্করণসমূহের ভিজিবিলিটি {{GENDER:$2|পরিবর্তন}} করেছেন',
 'revdelete-content-hid' => 'বিষয়বস্তু লুকায়িত',
 'revdelete-summary-hid' => 'সম্পাদনা সারাংশ লুকায়িত',
 'revdelete-uname-hid' => 'ব্যবহারকারী নাম লুকায়িত',
@@ -3604,21 +3786,25 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'revdelete-uname-unhid' => 'ব্যবহারকারী নাম প্রদর্শিত',
 'revdelete-restricted' => 'এই সীমাবদ্ধতা প্রশাসকের ক্ষেত্রে প্রয়োগ করো',
 'revdelete-unrestricted' => 'এই সীমাবদ্ধতা প্রশাসকের ক্ষেত্রে তুলে নাও',
-'logentry-move-move' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে স্থানান্তর করেছেন',
-'logentry-move-move-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
-'logentry-move-move_redir' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার ওপর দিয়ে স্থানান্তর করেছেন',
-'logentry-move-move_redir-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনার ওপর দিয়ে কোনো পুনর্নির্দেশনা ছাড়াই স্থানান্তর করেছেন',
-'logentry-patrol-patrol' => '$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
-'logentry-patrol-patrol-auto' => '$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে চিহ্নিত করেছেন',
-'logentry-newusers-newusers' => '$1 অ্যাকাউন্টটি তৈরি করা হয়েছে',
-'logentry-newusers-create' => '$1 অ্যাকাউন্টটি তৈরী করা হয়েছে',
-'logentry-newusers-create2' => '$1 ব্যবহারকারী $3 নামের অ্যাকাউন্টটি তৈরী করেছেন',
-'logentry-newusers-autocreate' => '$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে তৈরি হয়েছে',
-'logentry-rights-rights' => '$1 ব্যবহারকারী, $3 এর দলগত সদস্যপদ $4 থেকে $5 এ পরিবর্তন করেছেন',
-'logentry-rights-autopromote' => '$1 সয়ংক্রিয়ভাবে $4 থেকে $5 এ উন্নীত হয়েছে',
+'logentry-move-move' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন',
+'logentry-move-move-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন',
+'logentry-move-move_redir' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার মাধ্যমে {{GENDER:$2|স্থানান্তর}} করেছেন',
+'logentry-move-move_redir-noredirect' => '$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন',
+'logentry-patrol-patrol' => '$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন',
+'logentry-patrol-patrol-auto' => '$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন',
+'logentry-newusers-newusers' => '$1 ব্যবহারকারী অ্যাকাউন্টটি {{GENDER:$2|তৈরি করা}} হয়েছে',
+'logentry-newusers-create' => '$1 অ্যাকাউন্টটি {{GENDER:$2|তৈরী করা}} হয়েছে',
+'logentry-newusers-create2' => '$1 ব্যবহারকারী $3 নামের অ্যাকাউন্টটি {{GENDER:$2|তৈরী}} করেছেন',
+'logentry-newusers-byemail' => '$1, $3 ব্যবহারকরী অ্যাকাউন্টটি {{GENDER:$2|তৈরী করেছেন}} এবং পাসওয়ার্ড ইমেইলের মাধ্যমে পাঠানো হয়েছে',
+'logentry-newusers-autocreate' => '$1 অ্যাকাউন্টটি স্বয়ংক্রিয়ভাবে {{GENDER:$2|তৈরি}} হয়েছে',
+'logentry-rights-rights' => '$1 ব্যবহারকারী, $3 এর দলগত সদস্যপদ $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন',
+'logentry-rights-rights-legacy' => '$1 দলের সদস্যপদ পরিবর্তন করেছেন {{GENDER:$2|changed}} এর জন্য $3',
+'logentry-rights-autopromote' => '$1 সয়ংক্রিয়ভাবে $4 থেকে $5 এ {{GENDER:$2|উন্নীত}} হয়েছে',
 'rightsnone' => '(কিছু নাই)',
 
 # Feedback
+'feedback-bugornote' => 'কারিগরী ত্রুটির বিস্তারিত বর্ণনা জানতে [$1 বাগ রিপোর্ট করুন]।
+অথবা নিচের এই সরল ফর্মটি ব্যবহার করতে পারেন। "[$3 $2]" পাতায় আপনার ব্যবহারকারী নাম সহ মন্তব্যটি প্রকাশিত হবে।',
 'feedback-subject' => 'বিষয়:',
 'feedback-message' => 'বার্তা:',
 'feedback-cancel' => 'বাতিল',
@@ -3668,6 +3854,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'api-error-ok-but-empty' => 'অভ্যন্তরীণ ত্রুটি: সার্ভার হতে কোন সাড়া পাওয়া যাচ্ছে না।',
 'api-error-overwrite' => 'ইতিমধ্যেই রয়েছে এমন কোনো ফাইলের প্রতিস্থাপন গ্রহণযোগ্য নয়।',
 'api-error-stashfailed' => 'অভ্যন্তরীণ ত্রুটি: সার্ভার অস্থায়ী ফাইলটি সংরক্ষণ করতে ব্যর্থ হয়েছে।',
+'api-error-publishfailed' => 'অভ্যন্তরীন ত্রুটি: সার্ভার অস্থায়ী ফাইলটি প্রকাশ করতে ব্যর্থ হয়েছে।',
 'api-error-timeout' => 'কাঙ্খিত সময়ের মধ্যে সার্ভারের কোন সাড়া পাওয়া যায়নি।',
 'api-error-unclassified' => 'একটি অজানা ত্রুটি দেখা দিয়েছে',
 'api-error-unknown-code' => 'অজানা ত্রুটি: "$1"',
@@ -3688,4 +3875,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
 'duration-millennia' => '$1 {{PLURAL:$1|সহস্রাব্দ|সহস্রাব্দ}}',
 
+# Image rotation
+'rotate-comment' => 'ছবিটি ঘড়ির কাটার দিকে  $1 {{PLURAL:$1|ডিগ্রি}} ঘুরানো হয়েছে',
+
 );
index 21f2d27..d6ff3db 100644 (file)
@@ -680,7 +680,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => 'ཁོངས་མིའི་ཐོ་ཡིག',
 
-# E-mail user
+# Email user
 'emailuser' => 'སྤྱོད་མི་འདིར་གློག་འཕྲིན་སྐུར་བ།',
 'emailmessage' => 'སྐད་ཆ།',
 
index 6b088db..f5b2db4 100644 (file)
@@ -76,8 +76,6 @@ $messages = array(
 'tog-shownumberswatching' => 'চাকুরার সংখ্যাহান দেহাদে',
 'tog-oldsig' => 'আগেত্তর আসে স্বাক্ষররহান:',
 'tog-fancysig' => 'স্বাক্ষরহানরে উইকিটেক্সট বুলিয়া নিংকর (নিজেত্ত লিঙ্ক নেইকরিয়া)',
-'tog-externaleditor' => 'অকরাতই বারেদের সম্পাদক ব্যবহার কর (হুদ্দা দক্ষ ব্যবহারকারীরকা, কম্পিউটারর মা বিশেষ সেটিংস দরকার। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত পৌ।])',
-'tog-externaldiff' => 'অকরাতই বারেদের সম্পাদক ব্যবহার কর (হুদ্দা দক্ষ ব্যবহারকারীরকা, কম্পিউটারর মা বিশেষ সেটিংস দরকার। [//www.mediawiki.org/wiki/Manual:External_editors বিস্তারিত পৌ।])',
 'tog-showjumplinks' => '"চঙদে" বুলতারা মিলাপর য়্যাথাঙদে',
 'tog-uselivepreview' => 'লগে লগে মিল্লেঙ আহান দেহাদে (জাভাস্ক্রিপ্ট) (লইনাসে)',
 'tog-forceeditsummary' => 'খালি পতা সারমর্ম হমিলে মরে হারপুৱাদে',
@@ -91,6 +89,7 @@ $messages = array(
 'tog-diffonly' => 'ফারাকর তলে পাতাহানর বিষয়বস্তু নাদেখাদি',
 'tog-showhiddencats' => 'আরুমে আসে থাকহানি ফংকর',
 'tog-norollbackdiff' => 'রোলব্যাকর পিসে ফারাক না দেখাদি',
+'tog-useeditwarning' => 'পতানির সময় ইতু নাকরিয়া বেলিয়া গেলেগা মরে সিঙকরেদিস',
 
 'underline-always' => 'হারি সময়',
 'underline-never' => 'সুপৌনা',
@@ -711,6 +710,8 @@ $2',
 'edit-conflict' => 'পতানিত বেসেপ ইসে',
 'edit-already-exists' => 'নুৱা পাতাহান হঙকরানি নাইল।
 পাতাএহান আগেত্তর আসে।',
+'editwarning-warning' => 'পাতা এহান বেলিয়া গেলেগা তি সিলকরিসত অতা মাঙুইতে পারে।
+তি লগইন করিসতগ ইলে, এরে সিঙকরানির পৌ এহান তর "পতানি" থাকেত্ত আরুম করানি পারর।',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''সিঙুইস:''' টেমপ্লেটের ইনক্লুড অংতাহান ডাঙর অসে। টেমপ্লেট কতহান তিলকরানি নুওয়ারতে পারে।",
@@ -880,14 +881,6 @@ $2',
 'powersearch-togglenone' => 'কিত্তাউ নেই',
 'search-external' => 'বারেদে বিসারা',
 
-# Quickbar
-'qbsettings' => 'কুইকবার',
-'qbsettings-none' => 'কিত্তাউ নেই',
-'qbsettings-fixedleft' => 'লেপ্পা বিঙ',
-'qbsettings-fixedright' => 'লেপ্পা বাত',
-'qbsettings-floatingleft' => 'বাহের বিঙ',
-'qbsettings-floatingright' => 'বাহের বাত',
-
 # Preferences page
 'preferences' => 'পছনহানি',
 'mypreferences' => 'মর পছন',
@@ -1676,11 +1669,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'version-software-product' => 'পণ্য',
 'version-software-version' => 'সংস্করণ',
 
-# Special:FilePath
-'filepath' => 'ফাইলর পথহান:',
-'filepath-page' => 'ফাইল:',
-'filepath-submit' => 'পথ',
-
 # Special:SpecialPages
 'specialpages' => 'বিশেষ পাতাহানি',
 'specialpages-group-login' => 'একাউন্টহাত হমানি/মিহানি',
index b0f1d7e..d0ac8c4 100644 (file)
@@ -45,8 +45,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'نشودادن امیل مو درامیلهای آگاهی-خبری',
 'tog-shownumberswatching' => 'نشودادن شماره کاربران درحال کار یاتماشا',
 'tog-fancysig' => 'امضاهای ناتمام - بدون لینکهای اتوماتیک',
-'tog-externaleditor' => 'بی دقتی در استفاده از اصلاح کننده های خارجی',
-'tog-externaldiff' => 'استفاده زه برنامه های مختلف خارجی بوسیله پیش نمایش(سی تجربه کردن فقط نیاز به تنظیم خاص کامپیوترتان دارین)',
 'tog-showjumplinks' => 'قادر ساختن "پرش به" لینکهای دردسترس',
 'tog-uselivepreview' => 'استفاده زه پیش نمایش زنده(جاوااسکریپ) (تجربی )',
 'tog-forceeditsummary' => 'یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه',
@@ -548,7 +546,7 @@ $2',
 # Special:Categories
 'categories' => 'دسته ها',
 
-# E-mail user
+# Email user
 'emailuser' => 'امیل ای کاربر',
 
 # Watchlist
index 60264ba..1f4f430 100644 (file)
@@ -15,6 +15,7 @@
  * @author Gwenn-Ael
  * @author Kaganer
  * @author Malafaya
+ * @author Nemo bis
  * @author VIGNERON
  * @author Y-M D
  * @author לערי ריינהארט
@@ -208,8 +209,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Diskouez an niver a lennerien',
 'tog-oldsig' => 'Ar sinadur zo evit poent :',
 'tog-fancysig' => 'Ober gant ar sinadur evel pa vefe wikitestenn (hep liamm emgefre)',
-'tog-externaleditor' => "Ober gant ur skridaozer diavaez dre ziouer (evit arbennigourien hepken rak ezhomm zo arventenniñ hoc'h urzhiataer evit se. [//www.mediawiki.org/wiki/Manual:External_editors Titouroù all.])",
-'tog-externaldiff' => "Ober gant ur c'heñverier diavaez dre ziouer (evit arbennigourien hepken rak ezhomm zo arventenniñ hoc'h urzhiataer evit se. [//www.mediawiki.org/wiki/Manual:External_editors Titouroù all.])",
 'tog-showjumplinks' => 'Gweredekaat al liammoù moned "lammat da"',
 'tog-uselivepreview' => 'Implijout Rakwelet prim (JavaScript) (taol-arnod)',
 'tog-forceeditsummary' => 'Kemenn din pa ne skrivan netra er stern diverrañ',
@@ -224,6 +223,7 @@ $messages = array(
 'tog-showhiddencats' => 'Diskouez ar rummadoù kuzhet',
 'tog-noconvertlink' => 'Diweredekaat amdroadur an titloù',
 'tog-norollbackdiff' => 'Na ziskouez an diff goude un distaoladenn',
+'tog-useeditwarning' => 'Kas keloù din pa guitaan ur bajenn degaset kemmoù enni hep enrollañ',
 
 'underline-always' => 'Atav',
 'underline-never' => 'Morse',
@@ -590,9 +590,15 @@ Notit mat e c'hallo pajennoù zo kenderc'hel da vezañ diskwelet evel pa vefec'h
 'welcomecreation-msg' => 'Krouet eo bet ho kont implijer.
 Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}}]].',
 'yourname' => 'Anv implijer :',
+'userlogin-yourname' => 'Anv implijer',
+'userlogin-yourname-ph' => "Merkit hoc'h anv implijer",
 'yourpassword' => 'Ger-tremen :',
+'userlogin-yourpassword' => 'Ger-tremen',
+'userlogin-yourpassword-ph' => 'Merkit ho ker-tremen',
 'yourpasswordagain' => 'Skrivit ho ker-tremen en-dro',
 'remembermypassword' => "Derc'hel soñj eus ma ger-tremen war an urzhiataer-mañ (evit $1 devezh{{PLURAL:$1||}} d'ar muiañ)",
+'userlogin-remembermypassword' => "Derc'hel soñj ac'hanon",
+'userlogin-signwithsecure' => 'Kevreañ gant ur servijer suraet',
 'securelogin-stick-https' => 'Chom kevreet da HTTPS goude bezañ bet kevreet',
 'yourdomainname' => 'Ho tomani',
 'password-change-forbidden' => "Ne c'hallit ket kemmañ ar gerioù-tremen er wiki-mañ.",
@@ -605,12 +611,16 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'logout' => 'Digevreañ',
 'userlogout' => 'Digevreañ',
 'notloggedin' => 'Digevreet',
+'userlogin-noaccount' => "Kont ebet ganeoc'h c'hoazh ?",
+'userlogin-joinproject' => 'Kemer perzh e {{SITENAME}}',
 'nologin' => "N'hoc'h eus kont ebet ? '''$1'''.",
 'nologinlink' => 'Krouiñ ur gont',
 'createaccount' => 'Krouiñ ur gont nevez',
 'gotaccount' => "Ur gont zo ganeoc'h dija ? '''$1'''.",
 'gotaccountlink' => 'Kevreañ',
 'userlogin-resetlink' => "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
+'helplogin-url' => 'Skoazell : Kevreañ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Skoazell evit kevreañ]]',
 'createaccountmail' => 'Dre bostel',
 'createaccountreason' => 'Abeg :',
 'badretype' => 'Ne glot ket ar gerioù-tremen an eil gant egile.',
@@ -652,8 +662,8 @@ Trugarez deoc\'h da gevreañ kerkent ha ma vo bet resevet ganeoc\'h.',
 'blocked-mailpassword' => "N'haller ket kemmañ pajennoù gant ar chomlec'h IP-mañ ken rak stanket eo bet. Gant se n'hallit ket implijout an arc'hwel adtapout gerioù-tremen, kuit m'en em ledfe gwallimplijoù.",
 'eauthentsent' => "Kaset ez eus bet ur postel kadarnaat war-du ar chomlec'h postel spisaet.
 A-raok na vije kaset postel ebet d'ar gont-se e vo ret deoc'h heuliañ ar c'huzulioù merket er postel resevet evit kadarnaat ez eo mat ho kont deoc'h.",
-'throttled-mailpassword' => "Kaset ez eus bet deoc'h ur postel degas soñj e-kerzh an
-{{PLURAL:$1|eurvezh|$1 eurvezh}} ziwezhañ. Evit mirout ouzh nep gaou ne gaser nemet ur postel a-seurt-se dre {{PLURAL:$1|eurvezh|$1 eurvezh}}.",
+'throttled-mailpassword' => "Kaset ez eus bet deoc'h ur postel adderaouekaat e-kerzh an
+{{PLURAL:$1|eurvezh|$1 eurvezh}} tremenet. Evit mirout ouzh nep gaou ne gaser ket ouzhpenn ur postel a seurt-se bep {{PLURAL:$1|eurvezh|$1 eurvezh}}.",
 'mailerror' => 'Fazi en ur gas ar postel : $1',
 'acct_creation_throttle_hit' => "{{PLURAL:$1|1 gont|$1 kont}} zo bet krouet c'hoazh nevez zo dre ho chomlec'h IP gant gweladennerien d'ar wiki-mañ, ar pezh zo an niver brasañ aotreet. Dre se, n'hall ket ket ar weladennerien a implij an IP-mañ krouiñ kontoù mui evit ar mare.",
 'emailauthenticated' => "Gwiriet eo bet ho chomlec'h postel d'an $2 da $3.",
@@ -701,10 +711,8 @@ Gortozit a-raok klask en-dro.",
 
 # Special:PasswordReset
 'passwordreset' => 'Adderaouekaat ar ger-tremen',
-'passwordreset-text' => "Leuniañ ar furmskrid-mañ da resev ur postel da zegas soñj deoc'h eus titouroù ho kont.",
 'passwordreset-legend' => 'Adsevel ar ger-tremen',
 'passwordreset-disabled' => 'Diweredekaet eo bet an adsevel gerioù-tremen war ar wiki-mañ.',
-'passwordreset-pretext' => '{{PLURAL:$1||Merkit unan eus an tammoù roadennoù dindan}}',
 'passwordreset-username' => 'Anv implijer :',
 'passwordreset-domain' => 'Domani :',
 'passwordreset-capture' => 'Gwelet ar postel ?',
@@ -938,12 +946,15 @@ Abeg dianav.",
 Diverket eo bet evit doare.',
 'edit-conflict' => 'Tabut kemmañ.',
 'edit-no-change' => "N'eo ket bet kemeret ho tegasadenn e kont rak ne oa ket bet kemmet netra en destenn.",
+'postedit-confirmation' => 'Enrollet eo bet ho kemmoù.',
 'edit-already-exists' => "N'eus ket bet gallet krouiñ ur bajenn nevez.
 Krouet e oa bet c'hoazh.",
 'defaultmessagetext' => 'Testenn dre ziouer',
 'content-failed-to-parse' => "C'hwitet eo dielfennadur endalc'had $2 evit ar patrom $1: $3",
 'invalid-content-data' => "n'eo ket mat roadennoù an endalc'had",
 'content-not-allowed-here' => 'N\'eo ket aotreet an endalc\'had "$1" er bajenn [[$2]]',
+'editwarning-warning' => "Mar kuitait ar bajenn-mañ e c'hallit koll ar c'hemmoù degaset ganeoc'h.
+Ma'z oc'h kevreet e c'hallit diweredekaat ar c'hemenn-diwall-mañ e rann \"{{int:prefs-editing}}\" ho penndibaboù.",
 
 # Content models
 'content-model-wikitext' => 'wikitestenn',
@@ -1224,15 +1235,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-external' => 'Klask diavaez',
 'searchdisabled' => "<p>Diweredekaet eo bet an arc'hwel klask war an destenn a-bezh evit ur frapad rak ur samm re vras e oa evit ar servijer. Emichañs e vo tu d'e adlakaat pa vo ur servijer galloudusoc'h ganeomp. Da c'hortoz e c'hallit klask gant Google:</p>",
 
-# Quickbar
-'qbsettings' => 'Personelaat ar varrenn ostilhoù',
-'qbsettings-none' => 'Hini ebet',
-'qbsettings-fixedleft' => 'Kleiz',
-'qbsettings-fixedright' => 'Dehou',
-'qbsettings-floatingleft' => 'War-neuñv a-gleiz',
-'qbsettings-floatingright' => 'War-neuñv a-zehou',
-'qbsettings-directionality' => 'Difiñv, hervez an tu ma vez skrivet ho yezh',
-
 # Preferences page
 'preferences' => 'Penndibaboù',
 'mypreferences' => 'Penndibaboù',
@@ -1560,7 +1562,7 @@ E '''tev''' emañ ar pajennoù zo war ho [[Special:Watchlist|roll evezhiañ]].",
 'reuploaddesc' => "Distreiñ d'ar furmskrid.",
 'upload-tryagain' => 'Kas deskrivadur ar restr kemmet',
 'uploadnologin' => 'Digevreet',
-'uploadnologintext' => "Ret eo deoc'h bezañ [[Special:UserLogin|kevreetet]] a-benn gellout enporzhiañ restroù war ar servijer.",
+'uploadnologintext' => "Ret eo deoc'h bezañ [[Special:UserLogin|kevreet]] evit gallout enporzhiañ restroù war ar servijer.",
 'upload_directory_missing' => "Mankout a ra ar c'havlec'h enporzhiañ ($1) ha n'eo ket bet ar servijer Web evit e grouiñ.",
 'upload_directory_read_only' => "N'hall ket ar servijer skrivañ e renkell ar c'hargadennoù ($1).",
 'uploaderror' => 'Fazi enporzhiañ',
@@ -1787,7 +1789,6 @@ Diweredekaet eo bet img_auth.php evit ur surentez eus ar gwellañ",
 'http-read-error' => 'Fazi lenn HTTP.',
 'http-timed-out' => 'Erru eo termen ar reked HTTP.',
 'http-curl-error' => 'Fazi adtapout an URL : $1',
-'http-host-unreachable' => "N'eus ket bet gallet tizhout an URL.",
 'http-bad-status' => 'Ur gudenn a zo bet e-pad ar reked HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2197,8 +2198,8 @@ Amañ e vo rollet ar c\'hemmoù da zont evit ar bajenn-mañ hag ar bajenn gaozea
 'notvisiblerev' => 'Stumm diverket',
 'watchnochange' => "N'ez eus elfenn ebet eus ar re evezhiet ganeoc'h a zo bet kemmet e-pad ar prantad spisaet",
 'watchlist-details' => "Lakaet hoc'h eus {{PLURAL:$1|$1 bajenn|$1 pajenn}} dindan evezh, anez kontañ ar pajennoù kaozeal.",
-'wlheader-enotif' => "War enaou emañ ar c'has posteloù.",
-'wlheader-showupdated' => "E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
+'wlheader-enotif' => "War enaou emañ ar c'has posteloù.",
+'wlheader-showupdated' => "E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
 'watchmethod-recent' => "Gwiriañ ar c'hemmoù diwezhañ er pajennoù dindan evezh",
 'watchmethod-list' => "Gwiriañ ar c'hemmoù diwezhañ evit ar pajennoù evezhiet",
 'watchlistcontains' => '$1 {{PLURAL:$1|pajenn|pajenn}} zo en ho rollad evezhiañ',
@@ -2467,8 +2468,8 @@ Dindan emañ merket enmont diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
 'isredirect' => 'pajenn adkas',
 'istemplate' => 'enframmet',
 'isimage' => 'Liamm war-zu ar restr',
-'whatlinkshere-prev' => '{{PLURAL:$1|kent|kent $1}}',
-'whatlinkshere-next' => "{{PLURAL:$1|war-lerc'h|war-lerc'h $1}}",
+'whatlinkshere-prev' => '{{PLURAL:$1|kent|$1 kent}}',
+'whatlinkshere-next' => "{{PLURAL:$1|war-lerc'h|$1 war-lerc'h}}",
 'whatlinkshere-links' => '← liammoù',
 'whatlinkshere-hideredirs' => '$1 adkas',
 'whatlinkshere-hidetrans' => '$1 treuzkluzadur',
@@ -2904,17 +2905,11 @@ Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
 
 # Stylesheets
 'common.css' => '/** Talvezout a raio ar CSS lakaet amañ evit an holl wiskadurioù */',
-'standard.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Standard */',
-'nostalgia.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Melkoni */',
 'cologneblue.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Glaz Kologn */',
 'monobook.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Monobook */',
-'myskin.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur MySkin */',
-'chick.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Plogig */',
-'simple.css' => '/* Talvezout a raio ar CSS lakaet amañ implijerien ar gwiskadur Eeun */',
 'modern.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Modern */',
 'vector.css' => '/* Talvezout a raio ar CSS lakaet amañ evit implijerien ar gwiskadur Vektor */',
 'print.css' => '/* Talvezout a raio ar CSS lakaet amañ evit ar moullañ */',
-'handheld.css' => '/* Talvezout a raio ar CSS lakaet amañ evit an ardivinkoù hezoug diouzh ar gwiskadur kefluniet e $wgHandheldStyle */',
 'noscript.css' => '/* Talvezout a raio ar CSS lakaet amañ evit an implijerien o deus diweredekaet JavaScript */',
 'group-autoconfirmed.css' => '/* Talvezout a raio ar CSS lakaet amañ evit an impjerien bet kadarnaet ent emgefre hepken */',
 'group-bot.css' => '/* Talvezout a raio ar CSS lakaet amañ evit ar robotoù hepken */',
@@ -2923,13 +2918,8 @@ Talvezout a ra da ouzhpennañ un displegadenn er c\'hombod diverrañ.',
 
 # Scripts
 'common.js' => '/* Kement JavaScript amañ a vo karget evit an holl implijerien war kement pajenn lennet ganto. */',
-'standard.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Standard */',
-'nostalgia.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Melkoni */',
 'cologneblue.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Glaz Kologn */',
 'monobook.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MonoBook */',
-'myskin.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur MySkin */',
-'chick.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Plogig */',
-'simple.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Eeun */',
 'modern.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Modern */',
 'vector.js' => '/* Kement JavaScript amañ a vo karget evit an implijerien a ra gant ar gwiskadur Vektor */',
 
@@ -2975,6 +2965,7 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-robot-noindex' => "Ne c'haller ket menegeriñ",
 'pageinfo-views' => 'Niver a weladennoù',
 'pageinfo-watchers' => 'Niver a dud o heuliañ',
+'pageinfo-few-watchers' => "Nebeutoc'h eget $1 {{PLURAL:$1|lenner}}",
 'pageinfo-redirects-name' => 'Adkas war-zu ar bajenn-mañ',
 'pageinfo-subpages-name' => 'Ispajennoù eus ar bajenn-mañ',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|kasadur|kasadurioù}}; $3 {{PLURAL:$3|nann kasaduri|nann kasadurioù}})',
@@ -2989,6 +2980,7 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-magic-words' => '{{PLURAL:$1|Ger hud |Gerioù hud}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Rumm kuzh|Rummoù kuzh}} ($1)',
 'pageinfo-templates' => "{{PLURAL:$1|Patrom endalc'het|Patromoù endalc'het}} ($1)",
+'pageinfo-transclusions' => '{{PLURAL:$1|Pajenn|Pajennoù}} treuzkludet war ($1)',
 'pageinfo-toolboxlink' => 'Titouroù ar bajenn',
 'pageinfo-redirectsto' => 'Adkas a ra da',
 'pageinfo-redirectsto-info' => 'Titouroù',
@@ -3000,13 +2992,8 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-category-files' => 'Niver a restroù',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Melkoni',
 'skinname-cologneblue' => 'Glaz Kologn',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Plogig',
-'skinname-simple' => 'Eeun',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3083,8 +3070,8 @@ Ma vez erounezet ganeoc'h e c'hallje tagañ ho reizhiad.",
 'minutes' => '{{PLURAL:$1|$1 vunutenn|$1 munutenn}}',
 'hours' => '{{PLURAL:$1|$1 eurvezh|$1 eurvezh}}',
 'days' => '{{PLURAL:$1|$1 deiz|$1 deiz}}',
-'months' => '{{PLURAL: $1|$1 miz|$1 miz}}',
-'years' => '{{PLURAL: $1|$1 bloaz|$1 bloaz}}',
+'months' => '{{PLURAL:$1|$1 miz|$1 miz}}',
+'years' => '{{PLURAL:$1|$1 bloaz|$1 bloaz}}',
 'ago' => '$1 zo',
 'just-now' => 'bremañ diouzhtu',
 
@@ -3115,7 +3102,7 @@ Kuzhet e vo ar re all dre ziouer.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ledander',
 'exif-imagelength' => 'Hed',
 'exif-bitspersample' => 'Niv. a vitoù dre barzhioù',
@@ -3293,7 +3280,7 @@ Kuzhet e vo ar re all dre ziouer.
 'exif-originalimageheight' => 'Sav ar skeudenn a-raok na vije bet krennet',
 'exif-originalimagewidth' => 'Ledander ar skeudenn a-raok na vije bet krennet',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Hep gwaskañ',
 'exif-compression-2' => 'CCITT Strollad 3 1 Hirder kodañ Huffman kemmet a vent 1',
 'exif-compression-3' => 'CCITT Strollad 3 kodañ ar pelleiler',
@@ -3724,13 +3711,6 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
 'version-entrypoints-header-entrypoint' => 'Poent mont e-barzh',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Hent moned ur restr',
-'filepath-page' => 'Restr :',
-'filepath-submit' => 'Mont',
-'filepath-summary' => 'Diskouez a ra ar bajenn-mañ hent moned klok ur restr.
-Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all war-eeun gant o frogramm stag.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Klask ar restroù e doubl',
 'fileduplicatesearch-summary' => 'Klask restroù e doubl war diazez talvoudennoù krennet.',
@@ -3820,6 +3800,8 @@ Diskouezet eo ar skeudennoù gant ur pizhder uhel, erounit a ra ar restroù all
 'htmlform-submit' => 'Kas',
 'htmlform-reset' => "Dizober ar c'hemmoù",
 'htmlform-selectorother-other' => 'Unan all',
+'htmlform-no' => 'Ket',
+'htmlform-yes' => 'Ya',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 gant enklask eus an destenn a-bezh embreget',
index d3a942e..089112c 100644 (file)
@@ -331,6 +331,9 @@ Ná radbadal ák deskáne atíko matano.",
 
 'grouppage-sysop' => '{{ns:project}}:Amaldár ák',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Kárband joŕ kanning ná hisáb',
+
 # User rights log
 'rightslog' => 'Kárband hakk hisáb',
 
@@ -434,13 +437,10 @@ Ná radbadal ák deskáne atíko matano.",
 # Special:LinkSearch
 'linksearch' => 'Darí gańđ',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Kárband joŕ kanning ná hisáb',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(básk átá ridoband)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Dá kárband e girokŧapál as mon et',
 
 # Watchlist
index 1b91967..00f2f32 100644 (file)
@@ -16,6 +16,7 @@
  * @author Kaganer
  * @author Kal-El
  * @author Malafaya
+ * @author Nemo bis
  * @author Palapa
  * @author Seha
  * @author Smooth O
@@ -308,8 +309,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji prate',
 'tog-oldsig' => 'Postojeći potpis:',
 'tog-fancysig' => 'Smatraj potpis kao wikitekst (bez automatskog linka)',
-'tog-externaleditor' => 'Koristi vanjski program za uređivanje po postavkama (samo za naprednije korisnike, potrebne su posebne postavke na vašem računaru)',
-'tog-externaldiff' => 'Koristi vanjski (diff) program po pretpostavljenom za prikaz razlika (samo za naprednije korisnike, potrebne su posebne postavke na vašem računaru)',
 'tog-showjumplinks' => 'Omogući "skoči na" linkove',
 'tog-uselivepreview' => 'Koristite pregled uživo (JavaScript) (Eksperimentalno)',
 'tog-forceeditsummary' => 'Opomeni me pri unosu praznog sažetka',
@@ -324,6 +323,7 @@ $messages = array(
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-noconvertlink' => 'Onemogući konverziju naslova linkova',
 'tog-norollbackdiff' => 'Nakon vraćanja zanemari prikaz razlika',
+'tog-useeditwarning' => 'Upozori me kada napustim stranicu za izmjene bez spašenih promjena',
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
@@ -430,14 +430,14 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'Dodaj temu',
-'vector-action-delete' => 'Brisanje',
+'vector-action-delete' => 'Izbriši',
 'vector-action-move' => 'Pomjeri',
 'vector-action-protect' => 'Zaštiti',
 'vector-action-undelete' => 'Vrati obrisano',
 'vector-action-unprotect' => 'Promijeni zaštitu',
 'vector-simplesearch-preference' => 'Omogući pojednostavljenu traku pretrage (samo vektorski izgled)',
 'vector-view-create' => 'Napravi',
-'vector-view-edit' => 'Uređivanje',
+'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Pregled historije',
 'vector-view-view' => 'Čitanje',
 'vector-view-viewsource' => 'Pogledaj izvor',
@@ -526,7 +526,7 @@ $1',
 'mainpage-description' => 'Početna strana',
 'policy-url' => 'Project:Pravila',
 'portal' => 'Portal zajednice',
-'portal-url' => 'Project:Portal_zajednice',
+'portal-url' => 'Project:Portal zajednice',
 'privacy' => 'Politika privatnosti',
 'privacypage' => 'Project:Pravila o anonimnosti',
 
@@ -537,7 +537,7 @@ $1',
 'versionrequired' => 'Potrebna je verzija $1 MediaWikija',
 'versionrequiredtext' => 'Potrebna je verzija $1 MediaWikija da bi se koristila ova strana. Pogledaj [[Special:Version|verziju]].',
 
-'ok' => 'da',
+'ok' => 'U redu',
 'retrievedfrom' => 'Dobavljeno iz "$1"',
 'youhavenewmessages' => 'Imate $1 ($2).',
 'newmessageslink' => 'novih poruka',
@@ -545,7 +545,7 @@ $1',
 'youhavenewmessagesfromusers' => 'Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika}} ($2).',
 'youhavenewmessagesmanyusers' => 'Imate $1 od mnogo korisnika ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|novu poruku|nove poruke}}',
-'newmessagesdifflinkplural' => '{{PLURAL:$1|zadnja izmjena|zadnje izmjene}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|posljednja izmjena|posljednje izmjene}}',
 'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
 'editsection' => 'uredi',
 'editsection-brackets' => '[$1]',
@@ -557,7 +557,7 @@ $1',
 'toc' => 'Sadržaj',
 'showtoc' => 'pokaži',
 'hidetoc' => 'sakrij',
-'collapsible-collapse' => 'Sakrij',
+'collapsible-collapse' => 'sklopi',
 'collapsible-expand' => 'Proširi',
 'thisisdeleted' => 'Pogledaj ili vrati $1?',
 'viewdeleted' => 'Pogledaj $1?',
@@ -690,9 +690,16 @@ Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još
 'welcomecreation-msg' => 'Vaš nalog je napravljen.
 Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podešavanja]].',
 'yourname' => 'Korisničko ime:',
+'userlogin-yourname' => 'Korisničko ime',
+'userlogin-yourname-ph' => 'Unesite Vaše korisničko ime',
 'yourpassword' => 'Šifra:',
+'userlogin-yourpassword' => 'Šifra',
+'userlogin-yourpassword-ph' => 'Unesite Vašu šifru/lozinku',
+'createacct-yourpassword-ph' => 'Unesite šifru/lozinku',
 'yourpasswordagain' => 'Ponovite šifru:',
+'createacct-yourpasswordagain-ph' => 'Unesite šifru/lozinku opet',
 'remembermypassword' => 'Zapamti moju šifru na ovom računaru (najviše $1 {{PLURAL:$1|dan|dana|dana}})',
+'userlogin-signwithsecure' => 'Koristite sigurnu konekciju',
 'securelogin-stick-https' => 'Ostani povezan na HTTPS nakon prijave',
 'yourdomainname' => 'Vaš domen:',
 'password-change-forbidden' => 'Ne možete da promjenite lozinku na ovom wikiju.',
@@ -705,14 +712,25 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} pode
 'logout' => 'Odjavi me',
 'userlogout' => 'Odjavi me',
 'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate korisničko ime?',
+'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
 'nologin' => "Nemate korisničko ime? '''$1'''.",
 'nologinlink' => 'Napravite nalog',
 'createaccount' => 'Napravi nalog',
 'gotaccount' => "Imate nalog? '''$1'''.",
 'gotaccountlink' => 'Prijavi se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
-'createaccountmail' => 'e-poštom',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
+'createacct-join' => 'Unesite svoje podatke ispod.',
+'createacct-emailrequired' => 'Adresa e-pošte',
+'createacct-emailoptional' => 'Adresa e-pošte (opcionalno)',
+'createaccountmail' => 'Koristite privremenu, slučajno stvorenu šifru/lozinku i pošaljite na dole navedenu adrеsu e-pošte',
+'createacct-realname' => 'Pravo ime (opcionalno)',
 'createaccountreason' => 'Razlog:',
+'createacct-reason' => 'Razlog',
+'createacct-captcha' => 'Sigurnosna provjera',
+'createacct-imgcaptcha-ph' => 'Unesite tekst koji vidite iznad',
+'createacct-submit' => 'Napravite svoj korisnički račun',
 'badretype' => 'Šifre koje ste unijeli se ne poklapaju.',
 'userexists' => 'Korisničko ime koje ste unijeli je već u upotrebi.
 Molimo Vas da izaberete drugo ime.',
@@ -805,26 +823,20 @@ Možda ste već uspješno promijenili Vašu šifru ili ste tražili novu privrem
 
 # Special:PasswordReset
 'passwordreset' => 'Poništavanje šifre',
-'passwordreset-text' => 'Ispunite ovaj obrazac da biste dobili e-mail podsjetnik o vašim detaljima računa.',
 'passwordreset-legend' => 'Poništi šifru',
 'passwordreset-disabled' => 'Poništavanje šifre  je onemogućeno na ovoj wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan dio podataka ispod}}',
 'passwordreset-username' => 'Korisničko ime:',
 'passwordreset-domain' => 'Domen:',
 'passwordreset-capture' => 'Pogledati krajnji e-mail?',
 'passwordreset-capture-help' => 'Ako označite ovu kućicu, e-poruka (s privremenom lozinkom) će biti prikazana i poslata korisniku.',
 'passwordreset-email' => 'E-mail adresa:',
 'passwordreset-emailtitle' => 'Detalji računa na {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Neto (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:
+'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:
 
 $2
 
 {{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.
-Trebate 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.',
+Trebate 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:
 
@@ -1062,6 +1074,8 @@ Izgleda da je obrisana.',
 'edit-already-exists' => 'Stranica nije mogla biti kreirana.
 Izgleda da već postoji.',
 'defaultmessagetext' => 'Uobičajeni tekst poruke',
+'editwarning-warning' => 'Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.
+Ako ste prijavljeni, možete isključiti ovo upozorenje u "{{int:prefs-editing}}" dijelu vaših opcija.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1342,15 +1356,6 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'search-external' => 'Vanjska pretraga',
 'searchdisabled' => '<p>Izvinjavamo se!  Puno pretraga teksta je privremeno onemogućena.  U međuvremenu, možete koristiti Google za pretragu.  Indeks može biti stariji.',
 
-# Quickbar
-'qbsettings' => 'Podešavanja brze palete',
-'qbsettings-none' => 'Nikakva',
-'qbsettings-fixedleft' => 'Pričvršćena lijevo',
-'qbsettings-fixedright' => 'Pričvršćena desno',
-'qbsettings-floatingleft' => 'Plutajuća lijevo',
-'qbsettings-floatingright' => 'Plutajući desno',
-'qbsettings-directionality' => 'Čvrsto, u zavisnosti od usmjerenosti pisma Vašeg jezika',
-
 # Preferences page
 'preferences' => 'Podešavanja',
 'mypreferences' => 'Postavke',
@@ -1895,7 +1900,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'http-read-error' => 'Greška pri čitanju HTTP.',
 'http-timed-out' => 'Istekao HTTP zahtjev.',
 'http-curl-error' => 'Greška pri otvaranju URLa: $1',
-'http-host-unreachable' => 'Ovaj URL nije bilo moguće otvoriti',
 'http-bad-status' => 'Nastao je problem tokom HTTP zahtjeva: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2306,8 +2310,8 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
 'notvisiblerev' => 'Revizija je obrisana',
 'watchnochange' => 'Ništa što pratite nije promjenjeno u prikazanom vremenu.',
 'watchlist-details' => '{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući 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'''",
+'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'''",
 'watchmethod-recent' => 'provjerava se da li ima praćenih stranica u nedavnim izmjenama',
 'watchmethod-list' => 'provjerava se da li ima nedavnih izmjena u praćenim stranicama',
 'watchlistcontains' => 'Vaš spisak praćenih članaka sadrži $1 {{PLURAL:$1|stranicu|stranica}}.',
@@ -3035,26 +3039,15 @@ Dopušta unos razloga u sažetak.',
 
 # Stylesheets
 'common.css' => '/* CSS umetnut ovdje primijenit će se na sve skinove */',
-'standard.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Standard skin */',
-'nostalgia.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Nostalgia skin */',
 'cologneblue.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Cologne Blue skin */',
 'monobook.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Monobook skin */',
-'myskin.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste MySkin skin */',
-'chick.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Chick skin */',
-'simple.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Simple skin */',
 'modern.css' => '/* CSS umetnut ovdje uticat će na korisnike koji koriste Modern skin */',
 'print.css' => '/* CSS umetnut ovdje uticat će na izgled isprintane stranice */',
-'handheld.css' => '/* CSS umetnut ovdje uticat će na ručne sprave koji rade na skinu konfigurisanom u $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike pri svakom učitavanju stranice. */',
-'standard.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Standard skin */',
-'nostalgia.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Nostalgia skin */',
 'cologneblue.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Cologne Blue skin */',
 'monobook.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste MonoBook skin */',
-'myskin.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste MySkin skin */',
-'chick.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Chick skin */',
-'simple.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Simple skin */',
 'modern.js' => '/* Bilo koja JavaScript će biti učitana za sve korisnike koji koriste Modern skin */',
 
 # Metadata
@@ -3116,15 +3109,11 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-contentpage-yes' => 'Da',
 'pageinfo-protect-cascading-yes' => 'Da',
 'pageinfo-category-pages' => 'Broj stranica',
+'pageinfo-category-files' => 'Broj datoteka',
 
 # Skin names
-'skinname-standard' => 'Klasično',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kelnsko plavo',
 'skinname-monobook' => 'MonoKnjiga',
-'skinname-myskin' => 'MojaKoža',
-'skinname-chick' => 'Pile (chick)',
-'skinname-simple' => 'Jednostavna',
 'skinname-modern' => 'Moderna',
 
 # Patrolling
@@ -3232,7 +3221,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Visina',
 'exif-bitspersample' => 'Bita po komponenti',
@@ -3410,7 +3399,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 'exif-originalimageheight' => 'Visina slike prije nego što je odrezana',
 'exif-originalimagewidth' => 'Širina slike prije nego što je odrezana',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nekompresovano',
 'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeo Huffmanovo šifriranje po dužini',
 'exif-compression-3' => 'CCITT Grupa 3 faks šifriranje',
@@ -3882,13 +3871,6 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'version-entrypoints-header-entrypoint' => 'Ulazna tačka',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica prikazuje potpunu putanju za datoteku.
-Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktno sa, s njima povezanim, programom.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pretraga za duplim datotekama',
 'fileduplicatesearch-summary' => 'Pretraga za duplim datotekama na bazi njihove haš vrijednosti.',
@@ -3983,17 +3965,17 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'sqlite-no-fts' => '$1 bez podrške pretrage cijelog teksta',
 
 # New logging system
-'logentry-delete-delete' => '$1 je obrisao stranicu $3',
-'logentry-delete-restore' => '$1 je vratio stranicu $3',
-'logentry-delete-event' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4',
-'logentry-delete-revision' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici  $3: $4',
-'logentry-delete-event-legacy' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost događaja u evidenciji na $3',
-'logentry-delete-revision-legacy' => '$1 je {{GENDER:|promijenio|promijenila}} vidljivost izmjena na stranici $3',
-'logentry-suppress-delete' => '$1 {{GENDER:|je potisnuo|je potisnula}} stranicu $3',
-'logentry-suppress-event' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4',
-'logentry-suppress-revision' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici  $3: $4',
-'logentry-suppress-event-legacy' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost događaja u evidenciji na $3',
-'logentry-suppress-revision-legacy' => '$1 je tajno {{GENDER:|promijenio|promijenila}} vidljivost izmjena na stranici $3',
+'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|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-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 je {{GENDER:$2|potisnuo|potisnula}} stranicu $3',
+'logentry-suppress-event' => '$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4',
+'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-summary-hid' => 'sažetak izmjene je sakriven',
 'revdelete-uname-hid' => 'sažetak izmjene je sakriven',
@@ -4002,20 +3984,20 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'revdelete-uname-unhid' => 'korisničko ime je otkriveno',
 'revdelete-restricted' => 'primijenjena ograničenja za administratore',
 'revdelete-unrestricted' => 'uklonjena ograničenja za administratore',
-'logentry-move-move' => '$1 je premjestio stranicu $3 na $4',
-'logentry-move-move-noredirect' => '$1 je premjestio stranicu $3 na $4 bez ostavljanja preusmjerenja',
-'logentry-move-move_redir' => '$1 je premjestio stranicu $3 na $4 preko preusmjeravanja',
-'logentry-move-move_redir-noredirect' => '$1 je premjestio stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja',
-'logentry-patrol-patrol' => '$1 je označio izmjenu $4 stranice $3 pregledanim',
-'logentry-patrol-patrol-auto' => '$1 je automatski označio izmjenu $4 stranice $3 pregledanim',
-'logentry-newusers-newusers' => 'Korisnički račun $1 je napravljen',
-'logentry-newusers-create' => 'Korisnički račun $1 je napravljen',
+'logentry-move-move' => '$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4',
+'logentry-move-move-noredirect' => '$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 bez ostavljanja preusmjerenja',
+'logentry-move-move_redir' => '$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja',
+'logentry-move-move_redir-noredirect' => '$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja',
+'logentry-patrol-patrol' => '$1 je {{GENDER:$2|označio|označila}} izmjenu $4 stranice $3 pregledanim',
+'logentry-patrol-patrol-auto' => '$1 je automatski {{GENDER:$2|označio|označila}} izmjenu $4 stranice $3 pregledanim',
+'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' => '$3 je {{GENDER:$2|napravio|napravila}} korisnički račun $1',
-'logentry-newusers-byemail' => 'Korisnički račun $3 je napravio $1 i lozinka/šifra je poslana putem e-maila',
-'logentry-newusers-autocreate' => 'Korisnički račun $1 je automatski napravljen',
-'logentry-rights-rights' => '$1 {{GENDER:$1|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3 iz $4 u $5',
+'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-rights-rights-legacy' => '$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3',
-'logentry-rights-autopromote' => 'Korisničkom računu $1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5',
+'logentry-rights-autopromote' => '$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5',
 'rightsnone' => '(nema)',
 
 # Feedback
index 8a797d3..a8d0f1d 100644 (file)
@@ -73,7 +73,6 @@ $messages = array(
 'qbbrowse' => 'Berowoso',
 'qbedit' => 'Padécéŋ',
 'qbpageoptions' => 'Édé leppa',
-'qbpageinfo' => 'Konteks',
 'qbmyoptions' => "Leppana iya'",
 'qbspecialpages' => 'Leppa spésiala',
 'faq' => 'FAQ',
@@ -249,9 +248,6 @@ $messages = array(
 'search-result-size' => '$1 ({{PLURAL:$2|1 ada|$2 ada}})',
 'search-redirect' => '(redirect $1)',
 
-# Quickbar
-'qbsettings-none' => 'Dégaga',
-
 # Preferences page
 'mypreferences' => 'Bérékkeŋeŋna iyya',
 'prefsnologin' => "Déppa ma'log attama'",
diff --git a/languages/messages/MessagesBxr.php b/languages/messages/MessagesBxr.php
new file mode 100644 (file)
index 0000000..215061c
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+/** Buryat (Russia) (буряад)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ * @comment falls back to Russian
+ *
+ */
+
+$fallback = 'ru';
\ No newline at end of file
index 020c424..d6431ac 100644 (file)
  * @author Gemmaa
  * @author Grondin
  * @author Iradigalesc
+ * @author Jmarchn
  * @author Jordi Roqué
  * @author Juanpabl
  * @author Kaganer
  * @author Marcmpujol
  * @author Martorell
  * @author McDutchie
+ * @author Nemo bis
  * @author Pasqual (ca)
  * @author Paucabot
  * @author PerroVerd
+ * @author Pintor Smeargle
  * @author Pitort
  * @author Pérez
  * @author Qllach
+ * @author QuimGil
  * @author SMP
  * @author Smeira
  * @author Solde
@@ -226,8 +230,6 @@ $messages = array(
 'tog-shownumberswatching' => "Mostra el nombre d'usuaris que hi vigilen",
 'tog-oldsig' => 'Signatura actual:',
 'tog-fancysig' => 'Tractar la signatura com a text wiki (sense enllaç automàtic)',
-'tog-externaleditor' => "Utilitza per defecte un editor extern (opció per a experts, requereix la configuració adient de l'ordinador, [//www.mediawiki.org/wiki/Manual:External_editors consulteu-ho al manual])",
-'tog-externaldiff' => "Utilitza per defecte un altre visualitzador de diferències (opció per a experts, requereix la configuració adient de l'ordinador, [//www.mediawiki.org/wiki/Manual:External_editors consulteu-ho al manual])",
 'tog-showjumplinks' => "Habilita els enllaços de dreceres d'accessibilitat",
 'tog-uselivepreview' => 'Utilitza la previsualització automàtica (cal JavaScript) (experimental)',
 'tog-forceeditsummary' => "Avisa'm en deixar el resum de la modificació en blanc",
@@ -242,6 +244,7 @@ $messages = array(
 'tog-showhiddencats' => 'Mostra les categories ocultes',
 'tog-noconvertlink' => 'Inhabilita la conversió dels títols dels enllaços',
 'tog-norollbackdiff' => 'Omet la pàgina de diferències després de realitzar una reversió',
+'tog-useeditwarning' => "Avisa'm quan surti d'una pàgina d'edició amb canvis sense desar",
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mai',
@@ -329,7 +332,7 @@ $messages = array(
 'about' => 'Quant a',
 'article' => 'Pàgina de contingut',
 'newwindow' => '(obre en una nova finestra)',
-'cancel' => 'Anuŀla',
+'cancel' => 'Cancel·la',
 'moredotdotdot' => 'Més...',
 'morenotlisted' => 'Més no en la llista...',
 'mypage' => 'Pàgina',
@@ -441,7 +444,7 @@ $1",
 'disclaimerpage' => 'Project:Avís general',
 'edithelp' => 'Ajuda',
 'edithelppage' => "Help:Com s'edita una pàgina",
-'helppage' => 'Help:Ajuda',
+'helppage' => 'Help:Índex',
 'mainpage' => 'Pàgina principal',
 'mainpage-description' => 'Pàgina principal',
 'policy-url' => 'Project:Polítiques',
@@ -609,9 +612,18 @@ Tingueu en compte que algunes pàgines poden continuar mostrant-se com si encara
 'welcomecreation-msg' => 'El vostre compte ha estat creat.
 No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITENAME}}]].',
 'yourname' => "Nom d'usuari",
+'userlogin-yourname' => 'Usuari',
+'userlogin-yourname-ph' => "Introduïu el vostre nom d'usuari",
 'yourpassword' => 'Contrasenya',
+'userlogin-yourpassword' => 'Contrasenya',
+'userlogin-yourpassword-ph' => 'Introduïu la vostra contrasenya',
+'createacct-yourpassword-ph' => 'Introduïu una contrasenya',
 'yourpasswordagain' => 'Escriviu una altra vegada la contrasenya',
+'createacct-yourpasswordagain' => 'Confirmeu la contrasenya',
+'createacct-yourpasswordagain-ph' => 'Introduïu de nou la contrasenya',
 'remembermypassword' => 'Recorda la contrasenya entre sessions (per un màxim de $1 {{PLURAL:$1|dia|dies}})',
+'userlogin-remembermypassword' => 'Mantén-me connectat',
+'userlogin-signwithsecure' => 'Connexió segura',
 'securelogin-stick-https' => "Roman connectat via HTTPS desprès d'autenticar-se",
 'yourdomainname' => 'El vostre domini',
 'password-change-forbidden' => 'No podeu canviar les contrasenyes en aquest wiki.',
@@ -624,18 +636,38 @@ No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITEN
 'logout' => 'Finalitza la sessió',
 'userlogout' => 'Finalitza la sessió',
 'notloggedin' => 'No us heu identificat',
+'userlogin-noaccount' => 'No teniu cap compte?',
+'userlogin-joinproject' => 'Uniu-vos a {{SITENAME}}',
 'nologin' => "No teniu un compte? '''$1'''.",
 'nologinlink' => 'Crea un compte',
 'createaccount' => 'Crea un compte',
 'gotaccount' => 'Ja teniu un compte? $1.',
 'gotaccountlink' => 'Inicia una sessió',
 'userlogin-resetlink' => "Heu oblidat les vostres dades d'accés?",
-'createaccountmail' => 'per correu electrònic',
+'userlogin-resetpassword-link' => 'Reinicia la contrasenya',
+'helplogin-url' => 'Help:Registrar-se',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda]]',
+'createacct-join' => 'Introduïu les vostres dades.',
+'createacct-emailrequired' => 'Adreça de correu electrònic',
+'createacct-emailoptional' => 'Adreça de correu electrònic (opcional)',
+'createacct-email-ph' => 'Introduïu la vostra adreça de correu electrònic',
+'createaccountmail' => "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu  especificada a continuació.",
+'createacct-realname' => 'Nom real (opcional)',
 '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-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.',
 'userexists' => 'El nom que heu entrat ja és en ús.
 Escolliu-ne un de diferent.',
 'loginerror' => "Error d'inici de sessió",
+'createacct-error' => 'Error de creació de compte',
 'createaccounterror' => "No s'ha pogut crear el compte: $1",
 'nocookiesnew' => "S'ha creat el compte d'usuari, però no esteu enregistrat. El projecte {{SITENAME}} usa galetes per enregistrar els usuaris. Si us plau activeu-les, per a poder enregistrar-vos amb el vostre nom d'usuari i la clau.",
 'nocookieslogin' => 'El programari {{SITENAME}} utilitza galetes per enregistrar usuaris. Teniu les galetes desactivades. Activeu-les i torneu a provar.',
@@ -668,13 +700,14 @@ la vostra antiga contrasenya.",
 Inicieu una sessió després que la rebeu.",
 'blocked-mailpassword' => 'La vostra adreça IP ha estat blocada. 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'envïi cap altre correu electrònic a aquesta adreça, cal verificar que és realment vostra. Per tant, cal que seguiu les instruccions presents en el correu electrònic que se us ha enviat.",
-'throttled-mailpassword' => "Ja se us ha enviat un recordatori de contrasenya en {{PLURAL:$1|l'última hora|les últimes $1 hores}}. Per a prevenir abusos, només s'envia un recordatori de contrasenya cada {{PLURAL:$1|hora|$1 hores}}.",
+'throttled-mailpassword' => "Ja se us ha enviat un correu electrònic de reinicialització de contrasenya en {{PLURAL:$1|l'última hora|les últimes $1 hores}}.
+Per a prevenir abusos, només s'envia un correu electrònic de reinicialització de contrasenya cada {{PLURAL:$1|hora|$1 hores}}.",
 'mailerror' => "S'ha produït un error en enviar el missatge: $1",
 'acct_creation_throttle_hit' => "Des de la vostra adreça IP ja {{PLURAL:$1|s'ha creat un compte|s'han creat $1 comptes}} en l'últim dia i aquest és el màxim permès en aquest wiki per aquest període de temps.
 Així, des d'aquesta adreça IP no es poden crear més comptes actualment.",
 'emailauthenticated' => "S'ha autenticat la vostra adreça electrònica el $2 a les $3.",
 'emailnotauthenticated' => 'La vostra adreça de correu electrònic <strong>encara no està autenticada</strong>. No rebrà cap missatge de correu electrònic per a cap de les següents funcionalitats.',
-'noemailprefs' => 'Especifiqueu una adreça electrònica per a activar aquestes característiques.',
+'noemailprefs' => 'Especifiqueu una adreça electrònica per activar aquestes característiques.',
 'emailconfirmlink' => 'Confirmeu la vostra adreça electrònica',
 'invalidemailaddress' => "No es pot acceptar l'adreça electrònica perquè sembla que té un format no vàlid.
 Introduïu una adreça amb un format adequat o bé buideu el camp.",
@@ -716,36 +749,36 @@ Si us plau, esperi abans de tornar-ho a intentar.",
 'resetpass-wrong-oldpass' => 'Contrasenya actual o temporal no vàlida.
 Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya temporal.',
 'resetpass-temp-password' => 'Contrasenya temporal:',
+'resetpass-abort-generic' => 'Una extensió ha interromput el canvi de contrasenya.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restablir contrasenya',
-'passwordreset-text' => 'Completeu el següent formulari per rebre un recordatori per correu electrònic amb els detalls del vostre compte.',
 'passwordreset-legend' => 'Restablir contrasenya',
 'passwordreset-disabled' => "S'ha desactivat el restabliment de contranyes en aquest wiki.",
-'passwordreset-pretext' => '{{PLURAL:$1||Introduïu un dels elements de dades següents}}',
+'passwordreset-emaildisabled' => 'Les opcions de correu electrònic no estan habilitades en aquest wiki.',
 'passwordreset-username' => "Nom d'usuari:",
 'passwordreset-domain' => 'Domini',
 'passwordreset-capture' => 'Veure el missatge de correu electrònic?',
 'passwordreset-capture-help' => "Si marqueu aquesta casella, el missatge de correu electrònic (amb la contrasenya temporal) es mostrarà al mateix moment que sigui enviat a l'usuari.",
 'passwordreset-email' => 'Adreça de correu electrònic:',
 'passwordreset-emailtitle' => 'Detalls del compte a {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat un recordatori dels detalls dels vostres comptes 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:
+'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:
 
 $2
 
 {{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.
 Haurí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 un recordatori dels detalls dels vostres comptes 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:
+'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:
 
 $2
 
 {{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.
-Hauríeu d'entrar {{PLURAL:$3|al compte per a fixar-hi una nova contrasenya|als comptes per a fixar-hi noves contrasenyes}} 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.",
+Haurí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
 Contrasenya temporal: $2",
-'passwordreset-emailsent' => "S'ha enviat un correu de recordatori.",
-'passwordreset-emailsent-capture' => "S'ha enviat un recordatori per correu electrònic, tal com es mostra a continuació.",
-'passwordreset-emailerror-capture' => "S'ha generat un missatge recordatori de correu electrònic, que es mostra a continuació, però ha fallat l'enviament a l'usuari: $1",
+'passwordreset-emailsent' => "S'ha enviat un correu de reinicialització 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",
 
 # Special:ChangeEmail
 'changeemail' => 'Canvi de correu electrònic',
@@ -833,7 +866,7 @@ El número d'identificació de la vostra adreça IP és $3, i l'ID del bloqueig
 Potser ha estat moguda o eliminada mentre estàveu veient la pàgina.',
 'loginreqtitle' => 'Cal que inicieu una sessió',
 'loginreqlink' => 'inicia una sessió',
-'loginreqpagetext' => 'Heu de ser $1 per a visualitzar altres pàgines.',
+'loginreqpagetext' => "Cal que seguiu l'enllaç «$1» per a visualitzar altres pàgines.",
 'accmailtitle' => "S'ha enviat una contrasenya.",
 'accmailtext' => "S'ha enviat una contrasenya aleatòria a $2 per a l'{{GENDER:$1|usuari|usuària}} [[User talk:$1|$1]].
 
@@ -914,11 +947,10 @@ A més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o b
 '''No feu servir textos amb drets d'autor sense permís!'''",
 'longpageerror' => "'''Error: El text que heu introduït és {{PLURAL:$1|d'un kilobyte|de $1 kilobytes}} i sobrepassa el màxim permès de {{PLURAL:$2|one kilobyte|$2 kilobytes}}.'''
 No es pot desar.",
-'readonlywarning' => "'''ADVERTÈNCIA: La base de dades està tancada per manteniment
-i no podeu desar les vostres contribucions en aquests moments. Podeu retallar i enganxar el codi
-en un fitxer de text i desar-lo més tard.'''
+'readonlywarning' => "'''Avís: La base de dades està tancada per manteniment, de manera que no podreu desar els canvis ara mateix.'''
+És possible que vulgueu copiar i enganxar el text en un arxiu de text i desar-ho més tard.
 
-L'administrador que l'ha tancada n'ha donat aquesta justificació: $1",
+L'administrador que l'ha bloquejada ha donat la següent explicació: $1",
 'protectedpagewarning' => "'''ATENCIÓ: Aquesta pàgina està bloquejada i només els usuaris amb drets d'administrador la poden modificar.
 A continuació es mostra la darrera entrada del registre com a referència:",
 'semiprotectedpagewarning' => "'''Avís:''' Aquesta pàgina està bloquejada i només pot ser modificada per usuaris registrats.
@@ -954,12 +986,15 @@ No s'ha donat cap explicació.",
 Sembla haver estat esborrada.",
 'edit-conflict' => "Conflicte d'edició.",
 'edit-no-change' => 'La vostra modificació ha estat ignorada perquè no feia cap canvi al text.',
+'postedit-confirmation' => 'La modificació ha estat desada.',
 'edit-already-exists' => "No s'ha pogut crear una pàgina.
 Ja existeix.",
 'defaultmessagetext' => 'Missatge per defecte',
 'content-failed-to-parse' => "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
 'invalid-content-data' => 'Dades de contingut no vàlides',
 'content-not-allowed-here' => 'No és permés el contingut "$1" a la pàgina [[$2]]',
+'editwarning-warning' => "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.
+Si teniu un compte d'usuari, podeu eliminar aquest avís a la secció «Caixa d'edició» de les vostres preferències.",
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1222,7 +1257,7 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-default' => '$1 resultats:',
 'search-interwiki-more' => '(més)',
 'search-relatedarticle' => 'Relacionat',
-'mwsuggest-disable' => 'Inhabilita els suggeriments en AJAX',
+'mwsuggest-disable' => 'Desactivar suggeriments de cerca',
 'searcheverything-enable' => 'Cerca a tots els espais de noms',
 'searchrelated' => 'relacionat',
 'searchall' => 'tots',
@@ -1241,15 +1276,7 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'powersearch-togglenone' => 'Cap',
 'search-external' => 'Cerca externa',
 'searchdisabled' => 'La cerca dins el projecte {{SITENAME}} està inhabilitada. Mentrestant, podeu cercar a través de Google, però tingueu en compte que la seua base de dades no estarà actualitzada.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Cap',
-'qbsettings-fixedleft' => "Fixa a l'esquerra",
-'qbsettings-fixedright' => 'Fixa a la dreta',
-'qbsettings-floatingleft' => "Surant a l'esquerra",
-'qbsettings-floatingright' => 'Surant a la dreta',
-'qbsettings-directionality' => "Fix, segons la direcció d'escriptura del vostre idioma",
+'search-error' => "S'ha produït un error durant la recerca: $1",
 
 # Preferences page
 'preferences' => 'Preferències',
@@ -1522,7 +1549,7 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'action-userrights' => "modificar tots els permisos d'usuari",
 'action-userrights-interwiki' => "modificar permisos d'usuari en altres wikis",
 'action-siteadmin' => 'bloquejar o desbloquejar la base de dades',
-'action-sendemail' => 'envia missatges de correu',
+'action-sendemail' => 'enviar missatges de correu',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|canvi|canvis}}',
@@ -1784,7 +1811,6 @@ Per seguretat, img_auth.php està desactivat.",
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'La petició HTTP ha expirat.',
 'http-curl-error' => "Error en recuperar l'URL: $1",
-'http-host-unreachable' => "No s'ha pogut accedir a l'URL.",
 'http-bad-status' => 'Hi ha hagut un problema durant la petició HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1796,7 +1822,7 @@ Per seguretat, img_auth.php està desactivat.",
 'license' => 'Llicència:',
 'license-header' => 'Llicència',
 'nolicense' => "No se n'ha seleccionat cap",
-'license-nopreview' => '(La previsualització no està disponible)',
+'license-nopreview' => '(Previsualització no disponible)',
 'upload_source_url' => ' (un URL vàlid i accessible públicament)',
 'upload_source_file' => ' (un fitxer en el vostre ordinador)',
 
@@ -1938,6 +1964,12 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 És possible que hagin d'enllaçar a una altra pàgina més apropiada.<br />
 Una pàgina es tracta com de desambiguació si utilitza una plantilla que està enllaçada a [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Pàgines amb una propietat de pàgina',
+'pageswithprop-legend' => 'Pàgines amb una propietat de pàgina',
+'pageswithprop-text' => 'Aquesta pàgina llista les pàgines que utilitzen una propietat de pàgina en particular.',
+'pageswithprop-prop' => 'Nom de la propietat:',
+'pageswithprop-submit' => 'Vés',
+
 'doubleredirects' => 'Redireccions dobles',
 'doubleredirectstext' => 'Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.
 Cada fila conté enllaços a la primera i segona redireccions, així com el destí de la segona redirecció, què generalment és la pàgina destí "real", a la què hauria d\'apuntar la primera redirecció.
@@ -2103,7 +2135,7 @@ Es necessita com a mínim un domini de primer nivell, per exemple "*.org".<br />
 # Special:ActiveUsers
 'activeusers' => "Llista d'usuaris actius",
 'activeusers-intro' => "Aquí hi ha una llista d'usuaris que han tingut algun tipus d'activitat en {{PLURAL:$1|el darrer dia|els darrers $1 dies}}.",
-'activeusers-count' => '$1 {{PLURAL:$1|modificació|modificacions}} en {{PLURAL:$3|el darrer dia|els $3 darrers dies}}',
+'activeusers-count' => '$1 {{PLURAL:$1|acció|accions}} en {{PLURAL:$3|el darrer dia|els $3 darrers dies}}',
 'activeusers-from' => 'Mostra els usuaris començant per:',
 'activeusers-hidebots' => 'Amaga bots',
 'activeusers-hidesysops' => 'Amaga administradors',
@@ -2129,10 +2161,8 @@ Pot ser que hi hagi més informació sobre drets individuals [[{{MediaWiki:Listg
 'listgrouprights-removegroup-self-all' => 'Abandona tots els grups',
 
 # Email user
-'mailnologin' => "No enviïs l'adreça",
-'mailnologintext' => "Heu d'haver [[Special:UserLogin|entrat]]
-i tenir una direcció electrònica vàlida en les vostres [[Special:Preferences|preferències]]
-per enviar un correu electrònic a altres usuaris.",
+'mailnologin' => 'Cap adreça de remitent',
+'mailnologintext' => "Heu d'[[Special:UserLogin|iniciar una sessió]] i tenir una adreça electrònica vàlida en les vostres [[Special:Preferences|preferències]] per poder enviar correus a altres usuaris.",
 'emailuser' => 'Envia un missatge de correu electrònic a aquest usuari',
 'emailuser-title-target' => 'Enviar un correu electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}',
 'emailuser-title-notarget' => 'Enviar un correu electrònic a un usuari',
@@ -2189,8 +2219,8 @@ S\'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corre
 'notvisiblerev' => 'La versió ha estat esborrada',
 'watchnochange' => "No s'ha editat cap dels elements que vigileu en el període de temps que es mostra.",
 'watchlist-details' => 'Teniu $1 {{PLURAL:$1|pàgina vigilada|pàgines vigilades}}, sense comptar les pàgines de discussió.',
-'wlheader-enotif' => "* S'ha habilitat la notificació per correu electrònic.",
-'wlheader-showupdated' => "* Les pàgines que s'han canviat des de la vostra darrera visita es mostren '''en negreta'''",
+'wlheader-enotif' => 'La notificació per correu electrònic està habilitada.',
+'wlheader-showupdated' => "Les pàgines que s'han canviat des de la vostra darrera visita es mostren en '''negreta'''.",
 'watchmethod-recent' => "s'està comprovant si hi ha pàgines vigilades en les edicions recents",
 'watchmethod-list' => "s'està comprovant si hi ha edicions recents en les pàgines vigilades",
 'watchlistcontains' => 'La vostra llista de seguiment conté {{PLURAL:$1|una única pàgina|$1 pàgines}}.',
@@ -2295,7 +2325,7 @@ de l'usuari [[User:$2|$2]] ([[User talk:$2|Discussió]]{{int:pipe-separator}}[[S
 
 La darrera modificació ha estat feta per l'usuari [[User:$3|$3]] ([[User talk:$3|Discussió]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
 'editcomment' => "El resum d'edició ha estat: «$1».",
-'revertpage' => "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]). S'ha recuperat la darrera versió de l'usuari [[User:$1|$1]]",
+'revertpage' => "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]",
 'revertpage-nouser' => "Desfetes les edicions de (nom d'usuari eliminat) a l'última revisió feta per [[User:$1|$1]]",
 'rollback-success' => "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
 
@@ -2333,9 +2363,9 @@ Ací hi ha els paràmetres actuals de la pàgina '''$1''':",
 Ací es troben els paràmetres actuals de la pàgina '''$1''':",
 'protect-cascadeon' => "Aquesta pàgina es troba protegida perquè està inclosa en {{PLURAL:$1|la següent pàgina que té|les següents pàgines que tenen}} activada una protecció en cascada. Podeu canviar el nivell de protecció d'aquesta pàgina però això no afectarà la protecció en cascada.",
 'protect-default' => 'Permet tots els usuaris',
-'protect-fallback' => 'Cal el permís de «$1»',
-'protect-level-autoconfirmed' => 'Bloca els usuaris novells i no registrats',
-'protect-level-sysop' => 'Bloqueja tots els usuaris excepte administradors',
+'protect-fallback' => 'Permetre només a usuaris amb permisos de "$1"',
+'protect-level-autoconfirmed' => 'Permetre només usuaris autoconfirmats',
+'protect-level-sysop' => 'Permetre només administradors',
 'protect-summary-cascade' => 'en cascada',
 'protect-expiring' => 'expira el dia $1 (UTC)',
 'protect-expiring-local' => 'caduca el $1',
@@ -2462,7 +2492,7 @@ Per més detalls, la última entrada del registre es mostra a continuació:',
 
 # What links here
 'whatlinkshere' => 'Què hi enllaça',
-'whatlinkshere-title' => 'Pàgines que enllacen amb $1',
+'whatlinkshere-title' => 'Pàgines que enllacen amb «$1»',
 'whatlinkshere-page' => 'Pàgina:',
 'linkshere' => "Les següents pàgines enllacen amb '''[[:$1]]''':",
 'nolinkshere' => "Cap pàgina no enllaça amb '''[[:$1]]'''.",
@@ -2603,6 +2633,7 @@ Per més detalls, a sota es mostra el registre de supressions:',
 'proxyblocksuccess' => 'Fet.',
 'sorbsreason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.",
 'sorbs_create_account_reason' => "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte",
+'xffblockreason' => "Una adreça IP present en la capçalera X-Forwarded-For, ja sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
 'cant-block-while-blocked' => 'No podeu blocar altres usuaris quan esteu bloquejat.',
 'cant-see-hidden-user' => "L'usuari que esteu intentant blocar ja ha estat blocat i ocultat. Com que no teniu el permís hideuser no podeu veure ni modificar el seu blocatge.",
 'ipbblocked' => 'No podeu blocar o desblocar altres usuaris, perquè vós {{GENDER:|mateix|mateixa|mateix}} esteu {{GENDER:|blocat|blocada|blocat}}.',
@@ -2632,33 +2663,34 @@ Recordeu-vos de [[Special:UnlockDB|treure el bloqueig]] quan hàgiu acabat el ma
 'lockedbyandtime' => '(per $1 el $2 a les $3)',
 
 # Move page
-'move-page' => 'Mou $1',
+'move-page' => 'Reanomena $1',
 'move-page-legend' => 'Reanomena la pàgina',
 'movepagetext' => "Amb el formulari següent reanomenareu una pàgina, movent tot el seu historial al nou nom.
-El títol anterior es convertirà en una redirecció al títol que hàgiu creat.
-Podeu actualitzar automàticament els enllaços a l'antic títol de la pàgina.
-Si no ho feu, assegureu-vos de verificar que no deixeu redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].
-Serà de la vostra responsabilitat verificar que els enllaços seguirien apuntant cap a on se suposa que ho han de fer.
+El títol anterior es convertirà en una pàgina de redirecció al nou títol.
+Podeu actualitzar automàticament les redireccions que apuntin al títol original.
+Si no ho feu, assegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].
+Serà de la vostra responsabilitat verificar que els enllaços segueixin apuntant cap a on se suposa que ho han de fer.
 
-Tingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou, a no ser que sigui una pàgina buida o una ''redirecció'' sense historial.
+Tingueu 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.
 Això 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.
 
-'''ADVERTÈNCIA!'''
-Açò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; assegureu-vos d'entendre les conseqüències que comporta abans de seguir endavant.",
-'movepagetext-noredirectfixer' => "El títol anterior es convertirà en un redireccionament al nou títol. 
-
-Assegureu-vos de verificar els redireccionaments [[Special:DoubleRedirects|doble]]s i els [[Special:BrokenRedirects|trencat]]s.
-
-Sigueu responsable de fer que els enllaços continuen apuntant cap a on se suposa que han d'anar. 
-
-Tingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou proposat, tret del cas que la pàgina és buida o no n'hi ha un historial de redireccionaments. 
+'''Atenció!'''
+Açò pot ser un canvi dràstic i inesperat en una pàgina que sigui popular; 
+assegureu-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.
+El títol anterior es convertirà en una pàgina de redirecció al nou títol. 
+Assegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].
+És responsabilitat vostra assegurar que els enllaços continuen apuntant cap a on se suposa que han d'anar. 
 
-Això significa que si reanomeneu per equivocació una pàgina amb el seu nom anterior no ho podreu fer, ja que no es pot sobreescriure una pàgina existent.
+Tingueu 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. 
+Això 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.
  
-'''Avís:''' Això pot ser un canvi dràstic i inesperat per una pàgina popular; si us plau, assegureu-vos que sabeu el que feu abans de continuar.",
-'movepagetalktext' => "La pàgina de discussió associada, si existeix, serà traslladada automàticament '''tret dels següents casos''':
-* Ja hi existeix una pàgina de discussió no buida amb el nou nom, o si
-* la opció de davall es troba desactivada
+'''Atenció!''' 
+Això pot ser un canvi dràstic i inesperat per una pàgina popular; 
+assegureu-vos que sabeu el que feu abans de continuar.",
+'movepagetalktext' => "La pàgina de discussió associada també serà traslladada automàticament '''tret que''':
+* Ja existeix una pàgina de discussió no buida amb el nou nom, o
+* Desactiveu la opció de més avall.
 
 En aquests casos, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
 'movearticle' => 'Reanomena la pàgina',
@@ -2962,6 +2994,7 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'pageinfo-robot-noindex' => 'No indexable',
 'pageinfo-views' => 'Número de visites',
 'pageinfo-watchers' => "Número d'usuaris que vigilen la pàgina",
+'pageinfo-few-watchers' => 'Menys de $1 {{PLURAL:$1|observador|observadors}}',
 'pageinfo-redirects-name' => 'Redireccions a aquesta pàgina',
 'pageinfo-subpages-name' => "Subpàgines d'aquesta pàgina",
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecció|redireccions}}; $3 {{PLURAL:$3|no redireció|no redireccions}})',
@@ -2976,6 +3009,7 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'pageinfo-magic-words' => '{{PLURAL:$1|Paraula clau|Paraules clau}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categories ocultes}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|plantilla inclosa|plantilles incloses}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pàgina|Pàgines}} incloses en ($1)',
 'pageinfo-toolboxlink' => 'Informació de la pàgina',
 'pageinfo-redirectsto' => 'Redirigeix a',
 'pageinfo-redirectsto-info' => 'info',
@@ -2984,10 +3018,12 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'pageinfo-protect-cascading' => "Proteccions en cascada des d'aquí",
 'pageinfo-protect-cascading-yes' => 'Sí',
 'pageinfo-protect-cascading-from' => 'Proteccions en cascada des de',
+'pageinfo-category-info' => 'Informació de categoria',
+'pageinfo-category-pages' => 'Nombre de pàgines',
+'pageinfo-category-subcats' => 'ombre de subcategories',
+'pageinfo-category-files' => "Nombre d'arxius",
 
 # Skin names
-'skinname-standard' => 'Clàssic',
-'skinname-nostalgia' => 'Nostàlgia',
 'skinname-cologneblue' => 'Colònia blava',
 
 # Patrolling
@@ -3066,9 +3102,18 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minuts}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
 'days' => '{{PLURAL:$1|$1 dia|$1 dies}}',
+'weeks' => '{{PLURAL:$1|$1 setmana|$1 setmanes}}',
+'months' => '{{PLURAL:$1|$1 mes|$1 mesos}}',
+'years' => '{{PLURAL:$1|$1 any|$1 anys}}',
 'ago' => 'fa $1',
 'just-now' => 'ara mateix',
 
+# Human-readable timestamps
+'hours-ago' => 'fa $1 {{PLURAL:$1|hora|hores}}',
+'minutes-ago' => 'fa $1 {{PLURAL:$1|minut|minuts}}',
+'seconds-ago' => 'fa $1 {{PLURAL:$1|segon|segons}}',
+'monday-at' => 'Dilluns a les $1',
+
 # Bad image list
 'bad_image_list' => "El format ha de ser el següent:
 
@@ -3095,7 +3140,7 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Amplada',
 'exif-imagelength' => 'Alçada',
 'exif-bitspersample' => 'Octets per component',
@@ -3273,7 +3318,7 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
 'exif-originalimageheight' => 'Alçada de la imatge abans que fos retallada',
 'exif-originalimagewidth' => 'Amplada de la imatge abans que fos retallada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sense compressió',
 'exif-compression-2' => 'Codificació CCITT Grup 3 longitud monodimensional de Huffman modificat',
 'exif-compression-3' => 'Codificació de fax CCITT grup 3',
@@ -3693,13 +3738,6 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 'version-entrypoints-header-entrypoint' => "Punt d'entrada",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Camí del fitxer',
-'filepath-page' => 'Fitxer:',
-'filepath-submit' => 'Vés-hi',
-'filepath-summary' => "Aquesta pàgina especial retorna un camí complet d'un fitxer.
-Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien directament amb el seu programa associat.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cerca fitxers duplicats',
 'fileduplicatesearch-summary' => "Cerca fitxers duplicats d'acord amb el seu valor de resum.",
@@ -3726,7 +3764,7 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 'specialpages-group-highuse' => "Pàgines d'alt ús",
 'specialpages-group-pages' => 'Llistes de pàgines',
 'specialpages-group-pagetools' => "Pàgines d'eines",
-'specialpages-group-wiki' => 'Eines i dades del wiki',
+'specialpages-group-wiki' => 'Dades i eines',
 'specialpages-group-redirects' => 'Pàgines especials de redirecció',
 'specialpages-group-spam' => 'Eines de spam',
 
@@ -3789,23 +3827,25 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 'htmlform-submit' => 'Tramet',
 'htmlform-reset' => 'Desfés els canvis',
 'htmlform-selectorother-other' => 'Altres',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sí',
 
 # SQLite database support
 'sqlite-has-fts' => '$1, amb suport de búsqueda de text íntegre',
 'sqlite-no-fts' => '$1, sense supor de búsqueda de text íntegre',
 
 # New logging system
-'logentry-delete-delete' => '$1 ha esborrat la pàgina $3',
-'logentry-delete-restore' => '$1 ha restaurat la pàgina $3',
-'logentry-delete-event' => "$1 ha canviat la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
-'logentry-delete-revision' => "$1 ha canviat la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
-'logentry-delete-event-legacy' => "$1 ha canviat la visibilitat d'esdeveniments al registre de $3",
-'logentry-delete-revision-legacy' => '$1 ha canviat la visibilitat de revisions a la pàgina $3',
-'logentry-suppress-delete' => '$1 ha suprimit la pàgina $3',
-'logentry-suppress-event' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
-'logentry-suppress-revision' => "$1 secretament ha canviat la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
-'logentry-suppress-event-legacy' => "$1 secretament ha canviat la visibilitat d'esdeveniments al registre de $3",
-'logentry-suppress-revision-legacy' => '$1 secretament ha canviat la visibilitat de revisions a la pàgina $3',
+'logentry-delete-delete' => '$1 ha esborrat $3',
+'logentry-delete-restore' => '$1 ha restaurat $3',
+'logentry-delete-event' => "$1 {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
+'logentry-delete-revision' => "$1 {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
+'logentry-delete-event-legacy' => "$1 {{GENDER:$2|ha canviat}} la visibilitat d'esdeveniments al registre de $3",
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ha canviat}} la visibilitat de revisions a la pàgina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|ha suprimit}} la pàgina $3',
+'logentry-suppress-event' => "$1 secretament {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
+'logentry-suppress-revision' => "$1 secretament {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'una revisió|de $5 revisions}} a la pàgina $3: $4",
+'logentry-suppress-event-legacy' => "$1 secretament {{GENDER:$2|ha canviat}} la visibilitat d'esdeveniments al registre de $3",
+'logentry-suppress-revision-legacy' => '$1 secretament {{GENDER:$2|ha canviat}} la visibilitat de revisions a la pàgina $3',
 'revdelete-content-hid' => 'ha ocultat contingut',
 'revdelete-summary-hid' => "ha ocultat el resum d'edició",
 'revdelete-uname-hid' => "ha ocultat el nom d'usuari",
@@ -3814,19 +3854,20 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 '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-move-move' => '$1 ha desplaçat la pàgina $3 a $4',
-'logentry-move-move-noredirect' => '$1 ha desplaçat la pàgina $3 a $4 sense deixar cap redirecció',
-'logentry-move-move_redir' => '$1 ha desplaçat la pàgina $3 a $4, on hi havia una redirecció',
-'logentry-move-move_redir-noredirect' => '$1 ha desplaçat la pàgina $3 a $4 on hi havia una redirecció i sense crear una nova redirecció',
-'logentry-patrol-patrol' => '$1 ha marcat la versió $4 de la pàgina $3 com a patrullada',
-'logentry-patrol-patrol-auto' => '$1 ha marcat automàticament la versió $4 de la pàgina $3 com a patrullada',
-'logentry-newusers-newusers' => "S'ha creat el compte d'usuari $1",
-'logentry-newusers-create' => "S'ha creat el compte d'usuari $1",
-'logentry-newusers-create2' => "$1 ha creat el compte d'usuari $3",
-'logentry-newusers-autocreate' => "El compte d'usuari $1 ha estat creat de manera automàtica",
-'logentry-rights-rights' => '$1 ha canviat la pertinença de grups per $3 de $4 a $5',
-'logentry-rights-rights-legacy' => '$1 ha canviat la pertinença de grups per $3',
-'logentry-rights-autopromote' => '$1 ha estat promogut automàticament de $4 a $5',
+'logentry-move-move' => '$1 ha mogut $3 a $4',
+'logentry-move-move-noredirect' => '$1 ha mogut $3 a $4 sense deixar una redirecció',
+'logentry-move-move_redir' => '$1 ha mogut $3 a $4 sobre una redirecció',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|ha desplaçat}} la pàgina $3 a $4 on hi havia una redirecció i sense crear una nova redirecció',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|ha marcat}} la revisió $4 de la pàgina «$3» com a patrullada',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|ha marcat}} automàticament la versió $4 de la pàgina $3 com a patrullada',
+'logentry-newusers-newusers' => "El compte d'usuari $1 {{GENDER:$2|ha estat creat}}",
+'logentry-newusers-create' => "El compte d'usuari $1 {{GENDER:$2|ha estat creat}}",
+'logentry-newusers-create2' => "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1",
+'logentry-newusers-byemail' => "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1 i la contrasenya ha estat enviada per correu electrònic",
+'logentry-newusers-autocreate' => "El compte d'usuari $1 {{GENDER:$2|ha estat creat}} automàticament",
+'logentry-rights-rights' => '$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3 de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3',
+'logentry-rights-autopromote' => '$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5',
 'rightsnone' => '(cap)',
 
 # Feedback
@@ -3881,6 +3922,7 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'api-error-ok-but-empty' => 'Error intern: no hi ha resposta del servidor.',
 'api-error-overwrite' => 'No està permès sobreescriure un fitxer existent.',
 'api-error-stashfailed' => 'Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.',
+'api-error-publishfailed' => 'Error intern: el servidor no ha pogut publicar el fitxer temporal.',
 'api-error-timeout' => 'El servidor no ha respost en el temps esperat.',
 'api-error-unclassified' => "S'ha produït un error desconegut",
 'api-error-unknown-code' => 'Error desconegut: «$1»',
@@ -3901,4 +3943,7 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'duration-centuries' => '$1 {{PLURAL:$1|segle|segles}}',
 'duration-millennia' => '$1 {{PLURAL:$1|mil·leni|mil·lenis}}',
 
+# Image rotation
+'rotate-comment' => 'Imatge girada $1 {{PLURAL:$1|grau|graus}} en el sentit de les agulles del rellotge',
+
 );
index 4f0a236..f3dc6a5 100644 (file)
@@ -570,7 +570,7 @@ Siók-mìng: (dāng) = gâe̤ng dék sĭng bēng-buōng bī-piâng, (sèng) = g
 # Special:LinkSearch
 'linksearch-ok' => 'Sìng-tō̤',
 
-# E-mail user
+# Email user
 'emailuser' => 'Gié diêng-piĕ ké̤ṳk ĭ',
 'emailpage' => 'Gié diêng-piĕ ké̤ṳk ĭ',
 'defemailsubject' => '{{SITENAME}} diêng-piĕ',
@@ -830,7 +830,7 @@ Nâ cūng-kuāng, nṳ̄ â̤-sāi cê-gă iè-dông hĕ̤k-ciā sê hăk-biáng
 'namespacesall' => 'sū-iū',
 'monthsall' => 'gó̤-lòng nièng',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Káuk-nêng diêng-piĕ dê-cī',
 'confirmemail_invalid' => 'Káuk-nêng mā mò̤-hâu, kō̤-nèng ī-gĭng guó-gĭ lāu.',
 'confirmemail_needlogin' => 'Chiāng nṳ̄ sĕng $1 nṳ̄ gì diêng-piĕ dê-cī.',
@@ -888,9 +888,6 @@ Nâ-sāi ĭ *ng-sê* nṳ̄, chiāng mŏ̤h chák ĭ. Gáu $4, káuk-nêng-mā 
 'watchlisttools-edit' => 'Káng gâe̤ng siŭ-gāi gáng-sê-dăng',
 'watchlisttools-raw' => 'Siŭ-gāi nguòng-sṳ̄ gáng-sê-dăng',
 
-# Special:FilePath
-'filepath-page' => 'Ùng-giông:',
-
 # Special:SpecialPages
 'specialpages' => 'Dĕk-sṳ̀ hiĕk',
 
index 452ada1..4fc6e46 100644 (file)
@@ -12,6 +12,7 @@
  * @author Girdi
  * @author Mega programmer
  * @author Sasan700
+ * @author Умар
  */
 
 $fallback = 'ru';
@@ -217,12 +218,12 @@ $messages = array(
 'tog-extendwatchlist' => 'Шорбина тlехьажарна могlам, ша беригге а хийцамаш чубогlуш, тlяхьабина боцурш а',
 'tog-usenewrc' => 'Лелабе дика могlам керла чу хийцамашна (оьшу JavaScript)',
 'tog-numberheadings' => 'Ша шех хlитто терахь корташна',
-'tog-showtoolbar' => 'Ð\93айÑ\82а Ð»Ð°ÐºÑ\85аÑ\80а Ð³lиÑ\80Ñ\81ан Ð´Ð°ÐºÑ\8aа Ð½Ð¸Ñ\81йеÑ\88 Ð°Ñ\82Ñ\82он Ð¾Ñ\86 Ñ\80едаккÑ\85ар чохь (JavaScript)',
+'tog-showtoolbar' => 'Ð\93айÑ\82а Ð»Ð°ÐºÑ\85аÑ\80а Ð³lиÑ\80Ñ\81ан Ð´Ð°ÐºÑ\8aа Ð½Ð¸Ñ\81йеÑ\88 Ð°Ñ\82Ñ\82он Ð¾Ñ\86 Ñ\82адар чохь (JavaScript)',
 'tog-editondblclick' => 'Нисйе агlонаш шозза тlетаlийча (JavaScript)',
 'tog-editsection' => 'Гайта хьажориг «нисйе» аьлла хlора агlона',
 'tog-editsectiononrightclick' => 'Нисде дакъа шозза бакъехьар дахка тlетаlийча оцу кортан (JavaScript)',
 'tog-showtoc' => 'Гойти коьртнаш (оцу агlонашна лаххара 3 коьртнашца)',
-'tog-rememberpassword' => 'Даглаца сан дlавазвалар хlокху гlулкхдечу гlирса тlяхь (цхьан $1 {{PLURAL:$1|де|ден|динахь}})',
+'tog-rememberpassword' => 'Даглаца сан дlавазвалар/ялар хlокху гlулкхдечу гlирса тlяхь (цхьан $1 {{PLURAL:$1|де|ден|динахь}})',
 'tog-watchcreations' => 'Тlетоха ас кхоллина агlонаш тергаме могlам чу',
 'tog-watchdefault' => 'Тlетоха ас нисйина агlонаш тергаме могlам чу',
 'tog-watchmoves' => 'Тlетоха ас цlераш хийцина агlонаш тергаме могlам чу',
@@ -238,8 +239,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Гайта декъашхойн терахь, агlо латийна болу шай тергаме могlам юкъа',
 'tog-oldsig' => 'Хьалххьажар долучу куьгтаlорна:',
 'tog-fancysig' => 'Шен вики-къастаман куьгтаlдар (ша шех хьажориг йоцуш)',
-'tog-externaleditor' => 'Лелайан арахьара рéдаккхар (гlулкхдириг леррина нисйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
-'tog-externaldiff' => 'Лелабан арахьара диллагlарам башхо тарйо гlирс (гlулкхдириг леррина нисйина хила йеза, [//www.mediawiki.org/wiki/Manual:External_editors кхин дlа.])',
 'tog-showjumplinks' => 'Латайе гlодарна хьажоригаш «дехьа вала оцу»',
 'tog-uselivepreview' => 'Лелайа чехка хьалха хьажа (JavaScript, муха ю хьажарна)',
 'tog-forceeditsummary' => 'Дага даийта, нагахь нисйарх лаьцна чохь язъйина язахь',
@@ -251,16 +250,17 @@ $messages = array(
 'tog-watchlisthidepatrolled' => 'Къайладаха хьаьжина волу нисдарш оцу тергаме могlам чура',
 'tog-ccmeonemails' => 'Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.',
 'tog-diffonly' => 'Ма гайта агlон чулацам шина башхонца цхьатерра йолуш',
-'tog-showhiddencats' => 'Гайта къайлаха йолу кадегарш',
+'tog-showhiddencats' => 'Гайта къайлаха йолу категореш',
 'tog-noconvertlink' => 'Хааман хьажориг кхуллу гlирс дlабайа',
 'tog-norollbackdiff' => 'Йух яккхиначул тlаьхьа ма гайта къастаман башхо',
+'tog-useeditwarning' => 'Хаамбе бина хийцамаш дӀаязцабеш ара волучу хенахь',
 
 'underline-always' => 'Даимна',
 'underline-never' => 'Цкъа а',
 'underline-default' => 'Лелайа хьажгlодириг нисйарца',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'РéдоккÑ\85Ñ\83чохь долу йозан тайп:',
+'editfont-style' => 'ТадаÑ\80 чохь долу йозан тайп:',
 'editfont-default' => 'Йоза оцу хьажгlодириг нисйинчура',
 'editfont-monospace' => 'Цхьатерра доцу йоза',
 'editfont-sansserif' => 'Аьтта доцу йоза',
@@ -281,60 +281,74 @@ $messages = array(
 'thu' => 'Еа',
 'fri' => 'Пle',
 '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' => 'январь',
+'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',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Кадегар|Кадегарш}}',
-'category_header' => 'Агlонаш оц кадегаршчохь «$1»',
-'subcategories' => 'Бухаркадегарш',
-'category-media-header' => 'Хlумнаш оцу кадегар чохь «$1»',
-'category-empty' => "''Хlара кадегар хlинца йаьсса ю.''",
-'hidden-categories' => '{{PLURAL:$1|Къайлаха кадегар|Къайлаха йолу кадегарш}}',
-'hidden-category-category' => 'Къайлаха йолу кадегарш',
-'category-subcat-count' => '{{PLURAL:$2|Хlокх кадегар чохь ю хlокхуьна бухар кадегар.|{{PLURAL:$1|Гойташ $1 бухар кадегар|Гойту $1 бухар кадегар|Гойту $1 бухар кадегар}} оцу $2.}}',
-'category-subcat-count-limited' => 'Хlокх кадегар чохь {{PLURAL:$1|$1 бухар кадегар|$1 бухар кадегарша|$1 бухар кадегарш}}.',
-'category-article-count' => '{{PLURAL:$2|Хlокх кадегар чохь яц цхьа агlо бе.|{{PLURAL:$1|Гойташ $1 агlо|Гойту $1 агlонаш|Гойту $1 агlонаш}} хlокх кадегарца кху $2.}}',
-'category-article-count-limited' => 'Хlокх кадегар чохь {{PLURAL:$1|$1 агlо|$1 агlонаш|$1 агlонаш}}.',
-'category-file-count' => '{{PLURAL:$2|Хlокх кадегар чохь цхьа хlум бе яц.|{{PLURAL:$1|Гойта $1 хlум|Гойту $1 хlума|Гойту $1 хlумнаш}} хlокх кадегарца кху $2.}}',
-'category-file-count-limited' => 'Хlокх кадегар чохь {{PLURAL:$1|$1 хlум|$1 хlума|$1 хlумнаш}}.',
+'pagecategories' => '{{PLURAL:$1|Категори|Категореш}}',
+'category_header' => 'Агlонаш оц категоречохь «$1»',
+'subcategories' => 'Бухаркатегореш',
+'category-media-header' => 'ХӀумнаш оцу категори чохь «$1»',
+'category-empty' => "''ХӀара категори хӀинца йаьсса ю.''",
+'hidden-categories' => '{{PLURAL:$1|Къайлаха категори|Къайлаха йолу категореш}}',
+'hidden-category-category' => 'Къайлаха йолу категореш',
+'category-subcat-count' => '{{PLURAL:$2|ХӀокх категори чохь ю хӀокхуьна бухар категори.|{{PLURAL:$1|Гойташ $1 бухар категори|Гойту $1 бухар категори|Гойту $1 бухар категори}} оцу $2.}}',
+'category-subcat-count-limited' => 'Хlокх категори чохь {{PLURAL:$1|$1 бухар категори|$1 бухар категореша|$1 бухар категореш}}.',
+'category-article-count' => '{{PLURAL:$2|ХӀокх категори чохь яц цхьа агӀо бе.|{{PLURAL:$1|Гойташ $1 агӀо|Гойту $1 агӀонаш|Гойту $1 агӀонаш}} хӀокх категорешца кху $2.}}',
+'category-article-count-limited' => 'Хlокх категори чохь {{PLURAL:$1|$1 агlо|$1 агlонаш|$1 агlонаш}}.',
+'category-file-count' => '{{PLURAL:$2|ХӀокх категори чохь цхьа файл бе яц.|{{PLURAL:$1|Гойта $1 файл|Гойту $1 файл|Гойту $1 файлаш}} хӀокх категорешца кху $2.}}',
+'category-file-count-limited' => 'ХӀокх категори чохь {{PLURAL:$1|$1 файл|$1 файл|$1 файлаш}}.',
 'listingcontinuesabbrev' => '(кхин дlа)',
 'index-category' => 'Меттигтерахьйо агlонаш',
-'noindex-category' => 'Дlахьушйоцу агlонаш',
+'noindex-category' => 'ДӀахьушйоцу агӀонаш',
+'broken-file-category' => '{{#switch:{{NAMESPACE}}
+ |{{ns:0}}=Болх цабеш файланши хьажоригаш йолу агӀонаш}}',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
@@ -342,11 +356,11 @@ $messages = array(
 'article' => 'Яззам',
 'newwindow' => '(керлачу корехь)',
 'cancel' => 'Цаоьшу',
-'moredotdotdot' => 'Кхин дlа…',
-'mypage' => 'Долахь йолу агlо',
-'mytalk' => 'Сан дийцаре агlо',
-'anontalk' => 'Дийцаре хlара IP-долуметтиг',
-'navigation' => 'ШавигаÑ\80',
+'moredotdotdot' => 'Кхин дӀа…',
+'mypage' => 'Долахь йолу агӀо',
+'mytalk' => 'Сан дийцаре агӀо',
+'anontalk' => 'Дийцаре хӀара IP-долуметтиг',
+'navigation' => 'Ð\9dавигаÑ\86и',
 'and' => '&#32;а',
 
 # Cologne Blue skin
@@ -361,7 +375,7 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'Тlетоха хьедар',
-'vector-action-delete' => 'Дlадайá',
+'vector-action-delete' => 'ДӀаяккха',
 'vector-action-move' => 'Цlе хийца',
 'vector-action-protect' => 'Гlаролла дé',
 'vector-action-undelete' => 'Меттахlоттадé',
@@ -369,25 +383,26 @@ $messages = array(
 'vector-simplesearch-preference' => 'Шуьйра лахаран хьехар лата де (декъа «Хьушйерг» кечйарца)',
 'vector-view-create' => 'Кхоллар',
 'vector-view-edit' => 'Нисйé',
-'vector-view-history' => 'Ð¥Ñ\8cажа Ð¸Ñ\81Ñ\82оÑ\80е',
+'vector-view-history' => 'Ð¥Ñ\8cажа Ð¸Ñ\81Ñ\82оÑ\80и',
 'vector-view-view' => 'Éшар',
 'vector-view-viewsource' => 'Билглонашка хьажа',
 'actions' => 'Дийраш',
 'namespaces' => 'Цlерийн ана',
 'variants' => 'Кепараш',
 
+'navigation-heading' => 'Навигацин меню',
 'errorpagetitle' => 'Гlалат',
 'returnto' => 'Юхагlо оцу агlоне $1.',
 'tagline' => 'Гlирс хlокхуьна бу {{grammar:genitive|{{SITENAME}}}}',
-'help' => 'Нисвохаам',
+'help' => 'Нийсвохаам',
 'search' => 'Лаха',
 'searchbutton' => 'Лаха',
 'go' => 'Дехьа вала',
 'searcharticle' => 'Дехьа вала',
-'history' => 'Ð\98Ñ\81Ñ\82оÑ\80е',
-'history_short' => 'Ð\98Ñ\81Ñ\82оÑ\80е',
+'history' => 'Ð\98Ñ\81Ñ\82оÑ\80и',
+'history_short' => 'Ð\98Ñ\81Ñ\82оÑ\80и',
 'updatedmarker' => 'Керла яккхина со чуваьллачултlаьхьа',
-'printableversion' => 'Ð\97оÑ\80ба Ñ\82Ñ\83Ñ\85Ñ\83 Ð²Ð°рси',
+'printableversion' => 'Ð\97оÑ\80ба Ñ\82Ñ\83Ñ\85Ñ\83 Ð²Ðµрси',
 'permalink' => 'Даиман йолу хьажориг',
 'print' => 'Зорба тоха',
 'view' => 'Хьажа',
@@ -395,15 +410,15 @@ $messages = array(
 'create' => 'Кхолла',
 'editthispage' => 'Нисйé хlара агlо',
 'create-this-page' => 'Кхолла хlара агlо',
-'delete' => 'Дlадайá',
-'deletethispage' => 'Дlайайá хlара агlо',
+'delete' => 'ДӀаяккха',
+'deletethispage' => 'ДӀаяккха хӀара агӀо',
 'undelete_short' => 'Меттахlоттайé $1 {{PLURAL:$1|нисйинарг|нисйинарш|нисйинарш}}',
 'viewdeleted_short' => 'Хьажар {{PLURAL:$1|$1 дlадаьккхина нийсдар|$1 дlадаьхна нийсдарш|$1 дlадаьхна нийсдарш}}',
 'protect' => 'Гlаролла дé',
 'protect_change' => 'хийца',
 'protectthispage' => 'Гlаролла дé хlокху агlон',
-'unprotect' => 'Гlароллех къаста',
-'unprotectthispage' => 'Гlароллех къаста',
+'unprotect' => 'ГӀароллех къаста',
+'unprotectthispage' => 'ГӀароллех къаста',
 'newpage' => 'Керла агlо',
 'talkpage' => 'Дийцаре йила хlара агlо',
 'talkpagelinktext' => 'Дийцаре',
@@ -419,8 +434,8 @@ $messages = array(
 'imagepage' => 'Хьажа хlуман агlоне',
 'mediawikipage' => 'Хьагайта хааман агlо',
 'templatepage' => 'Хьажа куцкепа агlоне',
-'viewhelppage' => 'Схьаэца нисвохаам',
-'categorypage' => 'Хьажа кадегарши агlоне',
+'viewhelppage' => 'Схьаэца нийсвохаам',
+'categorypage' => 'Хьажа категореши агӀоне',
 'viewtalkpage' => 'Хьажа дийцаре',
 'otherlanguages' => 'Кхечу маттахь дерш',
 'redirectedfrom' => '(Дlасахьажийна кху $1)',
@@ -429,7 +444,7 @@ $messages = array(
 'viewcount' => 'Хlокху агlонга хьойсина $1 {{PLURAL:$1|за|за|за}}.',
 'protectedpage' => 'Гlароллийца йолу агlо',
 'jumpto' => 'Дехьавала оцу:',
-'jumptonavigation' => 'шавигар',
+'jumptonavigation' => 'навигаци',
 'jumptosearch' => 'лаха',
 'view-pool-error' => 'Бехк цабиллар доьха, хlинц гlулкхдириг йоьттина йу.
 Каьчна дуккха дехарш хlокху агlонтlе хьажарца.
@@ -449,10 +464,10 @@ $1',
 'currentevents-url' => 'Project:Хlинцлера хилларш',
 'disclaimers' => 'Бехк тlе ца эцар',
 'disclaimerpage' => 'Project:Бяхк тlецалацар',
-'edithelp' => 'Нисвохаам оцу редаккхарна',
-'edithelppage' => 'Help:Нисвохаам оцу редаккхарна',
+'edithelp' => 'Нийсвохаам оцу тадарна',
+'edithelppage' => '{{ns:project}}:Нийсвохаам_оцу_тадарна',
 'helppage' => 'Help:Чулацам',
-'mainpage' => 'Коьрта агlо',
+'mainpage' => 'Коьрта агӀо',
 'mainpage-description' => 'Коьрта агlо',
 'policy-url' => 'Project:Бакъо',
 'portal' => 'Юкъаралла',
@@ -474,6 +489,7 @@ $1',
 'youhavenewmessages' => 'Хьуна кхечи $1 ($2).',
 'newmessageslink' => 'керла хаамаш',
 'newmessagesdifflink' => 'тlаьххьара хийцамаш',
+'youhavenewmessagesfromusers' => 'Хьуна кхачанна $1 {{PLURAL:$3|$3 декъашхочунгара|$3 декъашхошкара|$3 декъашхошкара}} ($2).',
 'youhavenewmessagesmulti' => 'Хьуна кхаьчна керла хаам оцу $1',
 'editsection' => 'нисйé',
 'editsection-brackets' => '[$1]',
@@ -489,7 +505,7 @@ $1',
 'collapsible-expand' => 'хьайаста',
 'thisisdeleted' => 'Хьажа йа меттахlоттайé $1?',
 'viewdeleted' => 'Хьалххьожи $1?',
-'restorelink' => '{{PLURAL:$1|$1 дlайайина йолу нисйинарг|$1 дlайайина йолу нисйинарш|$1 дlайайина йолу нисйинарш}}',
+'restorelink' => '{{PLURAL:$1|$1 дӀадяккхина нийсдар|$1 дӀадяхна нийсдарш|$1 дӀадяхна нийсдарш}}',
 'feedlinks' => 'Оцу хатlаьхь:',
 'feed-invalid' => 'Тайпан нийсадоцу талол оцу куьгтаlорна.',
 'feed-unavailable' => 'Хаитарца йолу асанаш тlекхочучехь яц',
@@ -504,13 +520,14 @@ $1',
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Яззам',
 'nstab-user' => 'Декъашхо',
+'nstab-media' => 'Медиа агӀо',
 'nstab-special' => 'Белха агlо',
 'nstab-project' => 'Кхолламех',
-'nstab-image' => 'Ð¥lÑ\83м',
+'nstab-image' => 'Файл',
 'nstab-mediawiki' => 'Хаам',
-'nstab-template' => 'Куцкеп',
-'nstab-help' => 'Нисвохаам',
-'nstab-category' => 'Кадегар',
+'nstab-template' => 'Кеп',
+'nstab-help' => 'Нийсвохаам',
+'nstab-category' => 'Категори',
 
 # Main script and global functions
 'nosuchaction' => 'Ишта дийриг дац',
@@ -519,53 +536,72 @@ $1',
 # General errors
 'error' => 'Гlалат',
 'databaseerror' => 'Гlалат хаамийн бухера',
-'readonly' => 'СаÑ\86ийна Ð´lайаздар хаамийн бухе',
+'readonly' => 'Ð\91локÑ\82оÑ\8cÑ\85на Ð´Ó\80айаздар хаамийн бухе',
 'missing-article' => 'Хlокху чохь кароезаш йолу хьан дехарца йозан агlонаш цакарийна «$1» $2.
 
 Иштнарг наггахь хуьлу хьажориг дlайаьккхина йалхь йа хийцам бина тиша хьажоригца дехьа вала гlоьртича.
 
 Нагахьсан гlулкх цуьнах доьзна дацахь, хьуна карийна гlирс латточехь гlалат.
 Дехар до, хаам бе оцуьнах [[Special:ListUsers/sysop|адаманкуьйгалхога]], гойтуш URL.',
-'missingarticle-rev' => '(варси № $1)',
+'missingarticle-rev' => '(верси № $1)',
 'missingarticle-diff' => '(тейп тайпнара: $1, $2)',
 'internalerror' => 'Чоьхьара гlалат',
 'internalerror_info' => 'Чоьхьара гlалат: $1',
+'filedeleteerror' => 'ДӀаяккха цатарло файл «$1».',
+'cannotdelete' => 'Цатарло дӀаяккха я цӀе хийца «$1».
+АгӀо хьалхо дӀаяккхина хила тарло',
+'cannotdelete-title' => 'Цатарло агӀо дӀаяккха «$1»',
 'badtitle' => 'Цамегаш йолу цlе',
 'badtitletext' => 'Дехарца йолу агlонан цlе нийса яц, йаьсса ю, хила мега нийса ца хlоттийна меттаюкъар йа юкъарвики цlе. Хила мега, цlарца цамагош йолу саберг.',
+'perfcachedts' => 'Лахара хаам схьаэца кэша чура иза тӀаьхьара цӀинялла $1. Кэша чохь латтаё оцул $4 кӀезиг {{PLURAL:$4|дӀаяздарш|дӀаяздарш|дӀаяздарш}}.',
 'viewsource' => 'Хьажар',
-'protectedpagetext' => 'Хlара агlо дlакъойлина йу рé цадаккхийта.',
+'protectedpagetext' => 'ХӀара агӀо дӀакъойлина йу рé цадаккхийта.',
 'viewsourcetext' => 'Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:',
-'protectedinterface' => 'Хlара схьгайтарна гlирса хаамаш латтош йолу агlо йу. Гlуо лелачаьрга гал ца яккхийта, оцун хийцам ба магийна дац.',
+'protectedinterface' => 'ХӀара схьгайтарна гӀирса хаамаш латтош йолу агӀо йу. Адаманкуьйгалхошна бен иза хийца цало.',
+'exception-nologin' => 'Ахьа хӀой вовзийтина/йовзийтина вац/яц',
 
 # Login and logout pages
+'welcomeuser' => 'Марша ДогӀийла, $1!',
 'yourname' => 'Декъашхон цlе:',
+'userlogin-yourname' => 'Декъашхон цӀе',
+'userlogin-yourname-ph' => 'Язъе декъашхон цӀе',
 'yourpassword' => 'Ишар:',
+'userlogin-yourpassword' => 'Ишар',
+'userlogin-yourpassword-ph' => 'Язъе ишар',
+'createacct-yourpassword-ph' => 'Язъе ишар',
 'yourpasswordagain' => 'Юха язъйе ишар:',
-'remembermypassword' => 'Даглаца сан дlавазвалар хlокху гlулкхдечу гlирса тlяхь (цхьан $1 {{PLURAL:$1|ден|динахь|динахь}})',
+'createacct-yourpasswordagain' => 'Бакъе ишар',
+'createacct-yourpasswordagain-ph' => 'Кхин цкъа язъе ишар',
+'remembermypassword' => 'Даглаца сан дlавазвалар/ялар хlокху гlулкхдечу гlирса тlяхь (цхьан $1 {{PLURAL:$1|ден|динахь|динахь}})',
+'userlogin-remembermypassword' => 'Дагахь латт ве со',
 'yourdomainname' => 'Хьан машан меттиг:',
-'login' => 'Ð\92овзийÑ\82а Ñ\85Ñ\8cой Ð³lиÑ\80Ñ\81ан',
-'nav-login-createaccount' => 'Вовзийта хьой / дlавазло',
+'login' => 'ЧÑ\83 Ð²Ð°Ð»Ð°Ñ\80\8fлаÑ\80',
+'nav-login-createaccount' => 'Вовзийта/Йовзийта хьой / дӀавазло/дӀаязло',
 'loginprompt' => 'Ахьа бакъо йала йеза оцу «cookies» хьайна вовзийта лаахь гlирсан.',
-'userlogin' => 'Чу вала йа дlавазло',
-'userloginnocreate' => 'Ð\92овзийÑ\82а Ñ\85Ñ\8cой',
-'logout' => 'Ара валар',
-'userlogout' => 'Ара валар',
-'notloggedin' => 'Хьо вовзита веза гlирсан',
-'nologin' => "Хlинца дlа вазвин вац? '''$1'''.",
-'nologinlink' => 'Ð\9aÑ\85олла ÐºÐµÑ\80ла Ð´lавазвалар',
-'createaccount' => 'Ð\94lавазве ÐºÐµÑ\80ла Ð´ÐµÐºÑ\8aаÑ\88Ñ\85о',
+'userlogin' => 'Чу валар/ялар я декъашхон дӀаяздар кхоллар',
+'userloginnocreate' => 'ЧÑ\83валаÑ\80\8fлаÑ\80',
+'logout' => 'Аравалар/ялар',
+'userlogout' => 'Аравалар/ялар',
+'notloggedin' => 'Хьо вовзийта/йовзийта гlирсан',
+'nologin' => "Хlинца дlа вазвина/язйина вац/яц? '''$1'''.",
+'nologinlink' => 'Ð\9aÑ\85олла Ð´ÐµÐºÑ\8aаÑ\88Ñ\85он Ð´Ó\80аÑ\8fздар',
+'createaccount' => 'Ð\9aÑ\85олла Ð´ÐµÐºÑ\8aаÑ\88Ñ\85он Ð´Ó\80аÑ\8fздаÑ\80',
 'gotaccount' => "Дlавазвелла вуй хьо? '''$1'''.",
-'gotaccountlink' => 'Ð\92овзийÑ\82а Ñ\85Ñ\8cой',
+'gotaccountlink' => 'ЧÑ\83валаÑ\80\8fлаÑ\80',
 'createaccountmail' => 'хааман зlене хула',
-'loginerror' => 'Гlалат ду декъашхо вовзарехь',
+'createaccountreason' => 'Бахьан:',
+'createacct-reason' => 'Бахьна',
+'createacct-reason-ph' => '{{PLURAL:$1|агӀо|агӀонаш}}‎',
+'loginerror' => 'Гlалат ду декъашхо вовзарехь/йовзарехь',
 'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'loginsuccesstitle' => 'Хьо вовзар хаз чакхдели',
 'loginsuccess' => 'Хlинца ахьа болх бó оцу цlарца $1.',
-'nosuchuser' => 'Ð\94екÑ\8aаÑ\88Ñ\85о Ñ\86lаÑ\80Ñ\86а $1 Ð²Ð¾Ñ\86аÑ\88 Ð²Ñ\83.
-Декъашхой цlераш хаалуш йу дlайазвалрца элраш.
-Нийса юьй хьажа цlе йа [[Special:UserLogin/signup|дlайазвалар кхолла керла]].',
+'nosuchuser' => 'ЦlаÑ\80Ñ\86а $1 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85о Ð²Ð°Ñ\86\8fÑ\86.
+Декъашхой цlераш хаалуш йу дlайазвалрца/яларца элраш.
+Нийса юьй хьажа цlе йа [[Special:UserLogin/signup|дlаяздар кхолла керла]].',
 'wrongpassword' => 'Ахьа язъйина йолу ишар нийса яц. Хьажа йуху цхьаъз.',
 'mailmypassword' => 'Схьаэца керла ишар',
+'emailauthenticated' => 'Хьан почтан адрес бакъдина $2 $3.',
 'accountcreated' => 'Дlавазвар кхоллина дели',
 'accountcreatedtext' => 'Кхоллина декъашхо дlавазвар $1.',
 'loginlanguagelabel' => 'Мотт: $1',
@@ -580,6 +616,14 @@ $1',
 'resetpass-submit-loggedin' => 'Хийца ишар',
 'resetpass-submit-cancel' => 'Цаоьшу',
 
+# Special:PasswordReset
+'passwordreset-username' => 'Декъашхочун цӀе:',
+
+# Special:ChangeEmail
+'changeemail' => 'Хийца электрони почт',
+'changeemail-submit' => 'Хийца email',
+'changeemail-cancel' => 'Цаоьшу',
+
 # Edit page toolbar
 'bold_sample' => 'Дерстино до йоза',
 'bold_tip' => 'Дерстино до йоза',
@@ -594,7 +638,7 @@ $1',
 'nowiki_sample' => 'Чудиллийша кхузе барамхlоттонза йоза.',
 'nowiki_tip' => 'Тергал ца бо вики-бáрамхlоттор',
 'image_sample' => 'Example.jpg',
-'image_tip' => 'ЧоÑ\85Ñ\8c Ð¹Ð¾Ð»Ñ\83 Ñ\85\83м',
+'image_tip' => 'ЧоÑ\85Ñ\8c Ð¹Ð¾Ð»Ñ\83 Ñ\84айл',
 'media_sample' => 'Example.ogg',
 'media_tip' => 'Хьажориг оцу медиа-хlуман',
 'sig_tip' => 'Хьан куьгтаlор аъ хlоттина хан',
@@ -609,9 +653,10 @@ $1',
 'preview' => 'Хьалха муха ю хьажа',
 'showpreview' => 'Хьалха муха ю хьажар',
 'showdiff' => 'Хlоттина болу хийцам',
-'anoneditwarning' => "'''ТеÑ\80гам Ð±Ðµ''': Ð\90Ñ\85Ñ\8cа Ñ\85Ñ\8cо Ð²Ð¾Ð²Ð·Ð¸Ñ\82ина Ð²Ð°Ñ\86 Ð³lиÑ\80Ñ\81ан. Ð¥Ñ\8cан IP-долÑ\83 Ð¼ÐµÑ\82Ñ\82иг Ð´lаÑ\8fзйина Ñ\85иÑ\80а Ñ\8e Ñ\85lокÑ\85Ñ\83 Ð°Ð³lон Ð¸Ñ\81Ñ\82оÑ\80е чу.",
+'anoneditwarning' => "'''ТеÑ\80гам Ð±Ðµ''': Ð\90Ñ\85Ñ\8cа Ñ\85Ñ\8cо Ð²Ð¾Ð²Ð·Ð¸Ñ\82ина Ð²Ð°Ñ\86 Ð³lиÑ\80Ñ\81ан. Ð¥Ñ\8cан IP-долÑ\83 Ð¼ÐµÑ\82Ñ\82иг Ð´lаÑ\8fзйина Ñ\85иÑ\80а Ñ\8e Ñ\85lокÑ\85Ñ\83 Ð°Ð³lон Ð¸Ñ\81Ñ\82оÑ\80и чу.",
 'summary-preview' => 'Цуьнах лаьцна хирду:',
-'blockedtitle' => 'Декъашхо сацийна',
+'blockedtitle' => 'Декъашхон блоктоьхана',
+'loginreqlink' => 'Логин',
 'accmailtitle' => 'Ишар дlаяхьийтина.',
 'accmailtext' => "Ишар декъашхочуьна [[User talk:$1|$1]], йина ша шех хитта делла чу элпашах, дlаяхийтина хьокху хааман зlен чу $2.
 
@@ -620,25 +665,31 @@ $1',
 'newarticletext' => "Хьо веана хьажоригци хlокху агlон тlе, хlара агlо хlинца йоцаш ю.
 Нагахь иза кхолла лаахь, хlотта де лахо гуш долу корехь йоза (мадарра хьажа. [[{{MediaWiki:Helppage}}|гlон агlон чу]]).
 Нагахь гlалат даьлла нисвелляхь кхузе, атта тlе тlаlа йе '''юха йоккхуриг''' хьай гlирса тlяхь.",
-'anontalkpagetext' => "----''Хlара дийцаре агIо къайлаха волу декъашхочуьна  ю, хlинца дlавазвина воцуш, йа лелош воцуш.
-Цундела иза вовзийта лелош ду терахьца IP-долу метаг.
+'anontalkpagetext' => "----''Хlара дийцаре агIо къайлаха волу декъашхочуьна  ю, хlинца дӀавазвина/дӀаязйина воцуш/йоцуш, я лелош воцуш/йоцуш.
+Цундела иза вовзийта/йовзийта лелош ду терахьца IP-долу метаг.
 Иза терахь долу меттиг хила мега кхечу декъашхойчух терра.
-Нагахь хьо къайлах волу декъашхо валахь хьайна хаам кхаьчна аьлла хеташн, хьуна хьажийна доцуш, дехар до, кхолла хьай меттиг кху чохь[[Special:UserLogin/signup|дlавазло]] йа [[Special:UserLogin|хьой вовзийта]],",
+Нагахь хьо къайлах волу декъашхо валахь хьайна хаам кхаьчна аьлла хеташн, хьуна хьажийна доцуш, дехар до, кхолла хьай меттиг кху чохь[[Special:UserLogin/signup|дlавазло]] йа [[Special:UserLogin|хьой вовзийта/йовзийта]],",
 'noarticletext' => "Хlокх хан чохь кху агlонца йоза дац.
 Шуьга далундерг [[Special:Search/{{PAGENAME}}|лахар ишта хьехош йолу цlе]] кхечу яззамашкахь,
 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} лахар кхечу тептаршкахь],
 йа '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} кхолла ишта цlе йолу агlо]'''</span>.",
-'noarticletext-nopermission' => 'Хlокх хан чохь кху агlонца йоза дац.
-Шуьга далундерг [[Special:Search/{{PAGENAME}}|лахар ишта хьехош йолу цlе]] кхечу яззамашкахь,
+'noarticletext-nopermission' => 'ХӀокх хан чохь кху агӀонца йоза дац.
+Шуьга далундерг [[Special:Search/{{PAGENAME}}|лахар ишта хьехош йолу цӀе]] кхечу яззамашкахь,
 йа <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} лаха оцуьнах терадерг кхечу тептаршкахь].</span>',
 'userpage-userdoesnotexist' => 'Ишта дlайазвар «<nowiki>$1</nowiki>» хlинца дац. Хьажа билгал, хьуна бакъалла лаьи кхолла йа хийцам ба хlокху агlон.',
+'sitecsspreview' => "'''ХӀара хьалх хьажар ду, хӀара CSS.'''
+'''хӀинца Ӏалашдина дац!'''",
+'sitejspreview' => "'''ХӀара хьалх хьажар ду, хӀара JavaScript-ишар.'''
+'''хӀинца Ӏалашдина дац!'''",
 'updated' => '(Карла йаькхина)',
 'note' => "'''Билгалдаккхар:'''",
 'previewnote' => "'''Хlара хьалх хьажар ду, йоза хlинца язданза ду!'''",
-'editing' => 'Редаккхар: $1',
-'editingsection' => 'Редаккхар $1 (даакъа)',
-'editingcomment' => 'Редаккхар $1 (керла даакъа)',
-'editconflict' => 'Редаккхарна дойнаш: $1',
+'continue-editing' => 'Кхин дӀа тадар',
+'editing' => 'Тадар: $1',
+'creating' => 'АгӀо кхоллар «$1»',
+'editingsection' => 'Тадар $1 (даакъа)',
+'editingcomment' => 'Тадар $1 (керла даакъа)',
+'editconflict' => 'Тадарна дойнаш: $1',
 'yourtext' => 'Хьан йоза',
 'yourdiff' => 'Башхаллаш',
 'copyrightwarning' => "Тергаме хьажа, массо яззаман чутухуш долу йозан хийцам хьажарехь бу, арахоьцушсанна оцу бакъойалар хьоляхь $2 (хьаж. $1).
@@ -646,43 +697,49 @@ $1',
 Ишта чlагlо йой ахьа, айхьа далош долучуьн хьо куьг да ву аьлла, йа хьаэцна цхьан
 хьостера, хийцам ба а дlаса даржада а чулацам болуш.<br />
 '''МАТОХИЙШ БАКЪО ЙОЦУ ГlИРСАШ КХУ ЧУ, КУЬГ ДЕ БАКЪО ЛАР ЙЕШ ЙОЛУ!'''",
-'readonlywarning' => "'''ДlАХЬЕДО. Гlирса бух сацийна оьшуш долучу хьаштан, цундера хlинц хьоьга дlа ца йазло хийцам. 
-Хила мега, ахьа lалаш дан дезаш хьайн йоза, йуха тlаьхьо леладан иза йоза.'''
+'readonlywarning' => "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.
+Хила мега, ахьа Ӏалаш дан дезаш хьайн йоза, йуха тӀаьхьо леладан иза йоза.'''
 
\90даманкÑ\83Ñ\8cйгалÑ\85оÑ\87о Ñ\81аÑ\86ийна Ð³lиÑ\80Ñ\81а Ð±Ñ\83Ñ\85, Ñ\86о Ð±Ð¸Ñ\82ина ÐºÑ\85еÑ\82оÑ\88 Ñ\85lара хаам: $1",
\9aÑ\83Ñ\8cйгалÑ\85оÑ\87о Ð±Ð»Ð¾ÐºÑ\82оÑ\8cÑ\85на Ð³Ó\80иÑ\80Ñ\81а Ð±Ñ\83Ñ\85, Ñ\86о Ð±Ð¸Ñ\82ина ÐºÑ\85еÑ\82оÑ\88 Ñ\85Ó\80ара хаам: $1",
 'protectedpagewarning' => "'''Дlахьедар. Хlара агlо гlаролла дина ю хийцам цабайта, иза хийца йа нисйа а бакъо йолуш адаманкуьйгалла лелош болу декъашхой бе бац.'''
 Лахахьа гойту хаамаш тlаьхьара бина болу хийцамна тептар чура:",
-'cascadeprotectedwarning' => "'''Дlахьедар:''' Хlокху агlонна редаккха бакъо йолуш хlара тоба йу «Адаманкуьйгалхой», хlунда аьлча иза латийна {{PLURAL:$1|кхечу агlонца|кхечу агlонашца}} хlоттделлачу гlароллийца:",
-'templatesused' => '{{PLURAL:$1|Куцкеп, лелийна|Куцкепаш, лелош ду}} хlокху агlон башхонца:',
-'templatesusedpreview' => '{{PLURAL:$1|Куцкеп, лелошдолу|Куцкепаш, лелошдолу}} оцу хьалх хьожучу агlонца:',
+'cascadeprotectedwarning' => '<div id="cascadeprotectedwarning" style="border:1px solid #ee0; padding:10px; background:#ffa; margin-bottom:1em">[[file:Padlock.svg|left|25px|ДовгӀа|link=]]
+ХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:</div>',
+'templatesused' => '{{PLURAL:$1|Кеп, лелийна|Кепаш, лелош ду}} хlокху агlон башхонца:',
+'templatesusedpreview' => '{{PLURAL:$1|Кеп, лелошдолу|Кепаш, лелошдолу}} оцу хьалх хьожучу агlонца:',
 'template-protected' => '(гlароллийца)',
 'template-semiprotected' => '(дуьззина доцуш гlаролла)',
 'hiddencategories' => 'Хlара агlо чуйогlуш ю оцу $1 {{PLURAL:$1|къайлаха кадегарчу|къайлаха кадегаршчу|къайлаха кадегаршчу}}:',
 'edittools' => '<!-- Кхузе буха диллина йоза гуш хир ду редоккхуче бухахь а хlума чуйоккхуче бухахь. -->',
 'permissionserrorstext' => 'Хьан бакъо яц кхочуш хилийта хийцам оцу {{PLURAL:$1|шолгlа бахьанца|шолгlа бахьанашца}}:',
 'permissionserrorstext-withaction' => "Хьан бакъо яц хlумда «'''$2'''» оцу {{PLURAL:$1|шолгlа бахьанца|шолгlа бахьанашца}}:",
-'recreate-moveddeleted-warn' => "'''Тидам бе. Хьо ву (ле йу) йуха кхолла гlерташ яззам, хьалхо дlадайина долу.'''
+'recreate-moveddeleted-warn' => "'''Тидам бе. Хьо ву (ле йу) йуха кхолла гӀерташ агӀо, хьалхо дӀаяккхина йолу.'''
 
-Хьажа, билгалла оьши хьуна хlара яззам йуха кхолла.
-Лахахь далина ду дlадайарш тlяхь долу тептарш а хlокх яззам цlера бина хийцамаш.",
+Хьажа, билгалла оьши хьуна хӀара яззам йуха кхолла.
+Лахахь далина ду дӀаяхарш тӀяхь долу тептарш а хӀокх яззам цӀера бина хийцамаш.",
 'moveddeleted-notice' => 'Иза агlо дlайайина йара.
 Хаийтарна лахахьа гойту, цуьнца долу дlаяздарш кху дlадайина тептар чура а цlе хийцарш а.',
 'log-fulllog' => 'Хьажа деригге тептаре',
 
+# Content models
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
-'parser-template-loop-warning' => 'Карийна куцкепаш юкъахь хилла шад: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Дозанал хьалаваьлла кlоргенца йух йуха дина куцкеп ($1)',
+'parser-template-loop-warning' => 'Карийна кепаш юкъахь хилла шад: [[$1]]',
+'parser-template-recursion-depth-warning' => 'Дозанал хьалаваьлла кlоргенца йух йуха дина кеп ($1)',
 
 # "Undo" feature
 'undo-success' => 'Нисйинарг а тlе цалаца мега. Дехар до, хьажа цхьатерра йуй башхо, тешна хила, баккъалла иза хийцам буйте хьуна безарг, тlакха тlе таlайе «дlайазйе агlо», хийцам хlотта ба.',
+'undo-summary' => 'Юхадаьккхина {{GENDER:$2|декъашхочун|декъашхочун}} [[Special:Contributions/$2|$2]] ([[User talk:$2|дийц.]]) нисдар $1',
 
 # History pages
 'viewpagelogs' => 'Гайта хlокху агlонан тептар',
-'currentrev-asof' => 'Хlинцлера варси оцу $1',
-'revisionasof' => 'Ð\92арси $1',
+'currentrev-asof' => 'ХӀинцлера верси оцу $1',
+'revisionasof' => 'Ð\92ерси $1',
 'previousrevision' => '← Хьалха йоьдург',
 'nextrevision' => 'Тlаьхьайогlург →',
-'currentrevisionlink' => 'Ð¥lинÑ\86леÑ\80а Ð²Ð°рси',
+'currentrevisionlink' => 'Ð¥lинÑ\86леÑ\80а Ð²Ðµрси',
 'cur' => 'карара.',
 'next' => 'кхин',
 'last' => 'хьалх.',
@@ -690,11 +747,14 @@ $1',
 'page_last' => 'тlаьххьара',
 'histlegend' => "Кхетор: (хlинцлера.) — йолучу башхон къастам; (хьалх.) — хьалхлерачу башхон къастам; '''ж''' — жимо бозалца болу хийцам.",
 'history-fieldset-title' => 'Хьажа исцlарерачу',
-'histfirst' => 'къена',
-'histlast' => 'хьалхо',
+'history-show-deleted' => 'ДӀаяхинарш',
+'histfirst' => 'ширниш',
+'histlast' => 'хьалхарниш',
+'historysize' => '({{PLURAL:$1|1 байт|$1 байташ}})',
 'historyempty' => '(йаьсса)',
 
 # Revision feed
+'history-feed-title' => 'Хийцаман истори',
 'history-feed-item-nocomment' => '$1 оцу $2',
 
 # Revision deletion
@@ -709,13 +769,14 @@ $1',
 'revdelete-reasonotherlist' => 'Кхин бахьан',
 
 # History merging
+'mergehistory-from' => 'Дуьххьарлера агӀоно',
 'mergehistory-reason' => 'Бахьан:',
 
 # Merge log
 'revertmerge' => 'Йекъа',
 
 # Diffs
-'history-title' => '$1 â\80\94 Ñ\85ийÑ\86аман Ð¸Ñ\81Ñ\82оÑ\80е',
+'history-title' => '$1 â\80\94 Ñ\85ийÑ\86аман Ð¸Ñ\81Ñ\82оÑ\80и',
 'lineno' => 'Могlа $1:',
 'compareselectedversions' => 'Хаьржиначуьна башхо муха ю хьажа',
 'showhideselectedversions' => 'Гайта/къайлайаха хаьржина башхонаш',
@@ -744,7 +805,7 @@ $1',
 'searchprofile-advanced' => 'Шуьйра',
 'searchprofile-articles-tooltip' => 'Лаха оцу $1',
 'searchprofile-project-tooltip' => 'Лаха оцу $1',
-'searchprofile-images-tooltip' => 'Ð¥lÑ\83мнаш лахар',
+'searchprofile-images-tooltip' => 'Файлаш лахар',
 'searchprofile-everything-tooltip' => 'Лаха массо агlонашкахь (дийцаре агlонашцани)',
 'searchprofile-advanced-tooltip' => 'Лаха дехарца хlокху ана цlерашкахь',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 дош|$2 дешнаш|$2 дешнаш}})',
@@ -759,73 +820,134 @@ $1',
 'searchall' => 'массо',
 'showingresults' => 'Лахахьа {{PLURAL:$1|гойта|гойту|гойту}} <strong>$1</strong> {{PLURAL:$1|хилам|хиламаш|хиламаш}}, дlаболало кху № <strong>$2</strong>.',
 'showingresultsheader' => "{{PLURAL:$5|Хилам '''$1''' кху '''$3'''|Хиламаш '''$1 — $2''' кху '''$3'''}} оцун '''$4'''",
-'nonefound' => "'''Билгалдаккхар.''' Хlумма цадеш lад йитича массо цlеран энахь цалоху. Лела йе тlехуттург ''all:'', лахийта массо цlеран энахь (юкъадалош декъашхойн дийцарш а куцкепаш а кхин дерг.), йа хlотта йе оьшуш йолу цlеран эна.",
+'nonefound' => "'''Билгалдаккхар.''' ХӀумма цадеш Ӏад йитича массо цӀеран энахь цалоху. Лела йе тӀехуттург ''all:'', лахийта массо цӀеран энахь (юкъадалош декъашхойн дийцарш а кепаш а кхин дерг.), йа хӀотта йе оьшуш йолу цӀеран эна.",
 'search-nonefound' => 'Дехарар терра цхьа хlума цакарийна.',
 'powersearch' => 'Шуьйра лахар',
 'powersearch-legend' => 'Шуьро лахар',
 'powersearch-ns' => 'Цlераши анахь лахар:',
 'powersearch-redir' => 'Схьагайта дlасахьажийнарш',
 'powersearch-field' => 'Лаха',
+'powersearch-togglelabel' => 'Билгалдан:',
 'powersearch-toggleall' => 'Массо',
 'powersearch-togglenone' => 'Хlумма цаоьшу',
+'search-external' => 'Арахула лахар',
 
 # Preferences page
 'preferences' => 'Гlирс нисбан',
-'mypreferences' => 'Гlирс нисбан',
+'mypreferences' => 'ГӀирс нисбан',
+'prefs-edits' => 'Нисдарши дукхалла:',
 'changepassword' => 'Хийцамба ишарна',
+'prefs-skin' => 'Кечяран тема',
 'skin-preview' => 'Хьалха муха ю хьажа',
+'datedefault' => 'Хьан гlирс нисбар',
 'prefs-beta' => 'Гlоле таронаш',
 'prefs-datetime' => 'Терахь а хан',
 'prefs-labs' => 'Муха ю хьажарна таронаш',
+'prefs-user-pages' => 'Декъашхочун агӀо',
 'prefs-personal' => 'Долахь болу хаамаш',
 'prefs-rc' => 'Керла нисдарш',
 'prefs-watchlist' => 'Тергаме могlам',
 'prefs-misc' => 'Кхин гlирсаш',
 'prefs-resetpass' => 'Хийца ишар',
+'prefs-changeemail' => 'Хийца электрони почт',
+'prefs-email' => 'Электронан почтан параметрш',
 'prefs-rendering' => 'Арахьара хатl',
 'saveprefs' => 'lалашдан',
-'prefs-editing' => 'Редаккхар',
+'restoreprefs' => 'МеттахӀоттабе гӀирс дуьхӀар сана',
+'prefs-editing' => 'Тадар',
+'rows' => 'МогӀанаш:',
+'columns' => 'БӀогӀамаш:',
 'searchresultshead' => 'Лаха',
 'timezonelegend' => 'Сахьатан аса:',
-'prefs-searchoptions' => 'Лахарна гlирс нисба',
-'prefs-files' => 'Хlумнаш',
+'localtime' => 'Меттигера хан:',
+'servertime' => 'Сервера хан:',
+'allowemail' => 'Магийта декъашхошна хьайга электрони почтехула кехат кхехьийта',
+'prefs-searchoptions' => 'Лаха',
+'prefs-files' => 'Файлаш',
+'prefs-emailconfirm-label' => 'Бакъ яр электрони почт:',
+'prefs-textboxsize' => 'Тадаран коран барам',
 'youremail' => 'Кехат яздо зlе цlе:',
-'username' => 'Дlаязвиначуьна цlе:',
+'username' => 'Декъашхон цlе:',
+'uid' => 'Декъашхочун {{GENDER:$1|код}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Тобана|Тобана}} {{PLURAL:$1|декъашхо|декъашхо}}:',
+'prefs-registration' => '{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} хан:',
 'yourrealname' => 'Хьан бакъ цlе:',
-'yourlanguage' => 'ЮкÑ\8aаÑ\80декÑ\8aа Ð¼отт:',
+'yourlanguage' => 'Ð\9cотт:',
 'yourvariant' => 'Метта башхо',
+'yournick' => 'Керла куьгтаӀор:',
 'yourgender' => 'Ву/Йу:',
 'gender-unknown' => 'хlоттийна яц',
 'gender-male' => 'борша',
 'gender-female' => 'сте',
+'email' => 'Email',
 'prefs-help-email' => 'Кехат яздо зlен цlе цахlоттийча аъ хlумма дац, амма иза оьшар ю, нагахь хьуна хьай ишар йицлахь.',
-'prefs-diffs' => 'Башхон варси',
+'prefs-info' => 'Коьрта хаам',
+'prefs-i18n' => 'Юкъардекъа мотт',
+'prefs-signature' => 'КуьгтаӀор',
+'prefs-advancedediting' => 'Кхин гӀирс нисбар',
+'prefs-advancedrc' => 'Кхин гӀирс нисбар',
+'prefs-advancedrendering' => 'Кхин гӀирс нисбар',
+'prefs-advancedsearchoptions' => 'Кхин гӀирс нисбар',
+'prefs-advancedwatchlist' => 'Кхин гӀирс нисбар',
+'prefs-displayrc' => 'Гуш болу гӀирсаш',
+'prefs-displaysearchoptions' => 'Гуш болу гӀирсаш',
+'prefs-displaywatchlist' => 'Гуш болу гӀирсаш',
+'prefs-diffs' => 'Башхон верси',
 
 # User rights
 'userrights' => 'Декъашхочуьн бакъона урхалладар',
+'userrights-user-editname' => 'Язъе цӀе:',
+'editusergroup' => 'Хийца декъашхон бакъо',
 'editinguser' => "Хийца декъашхочуьна бакъо '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'userrights-editusergroup' => 'Хийца декъашхон бакъо',
+'userrights-groupsmember' => 'Декъашхо:',
+'userrights-reason' => 'Бахьан:',
+'userrights-no-interwiki' => 'Хьан бакъо яц декъашхой бакъо хийца кхечу википеди чохь.',
+'userrights-nologin' => 'Куьйгалхочунна бакъо йолу [[Special:UserLogin|д1аяздарца]] ло декъашхон бакъо.',
+'userrights-notallowed' => 'Хьан дӀаяздарца магийна дац декъашхошна бакъо яла а дӀаяккха а.',
+'userrights-changeable-col' => 'Хьона хийца луш йолу бакъонаш',
+'userrights-unchangeable-col' => 'Хьона хийца луш йоцу бакъонаш',
 
 # Groups
 'group' => 'Тоба:',
 'group-user' => 'Декъашхой',
+'group-autoconfirmed' => 'Бакъонаш йолу декъашхой',
 'group-bot' => 'Шаболххой',
-'group-sysop' => 'Ð\90даманкуьйгалхой',
+'group-sysop' => 'Ð\9aуьйгалхой',
 'group-bureaucrat' => 'Даржахой',
 'group-suppress' => 'Левисорхой',
 'group-all' => '(массо)',
 
 'group-user-member' => '{{GENDER:$1|декъашхо}}',
 'group-bot-member' => 'шаболххо',
-'group-sysop-member' => 'адманкуьйгалхо',
+'group-sysop-member' => '{{GENDER:$1|куьйгалхо}}',
 'group-bureaucrat-member' => 'даржахо',
 'group-suppress-member' => 'левисорхо',
 
 'grouppage-user' => '{{ns:project}}:Декъашхой',
+'grouppage-autoconfirmed' => '{{ns:project}}:Бакъонаш йолу декъашхой',
 'grouppage-bot' => '{{ns:project}}:Шаболххой',
-'grouppage-sysop' => '{{ns:project}}:Ð\90даманкуьйгалхой',
+'grouppage-sysop' => '{{ns:project}}:Ð\9aуьйгалхой',
 'grouppage-bureaucrat' => '{{ns:project}}:Даржахой',
 'grouppage-suppress' => '{{ns:project}}:Левисорхой',
 
+# Rights
+'right-edit' => 'АгӀоаш нисяр',
+'right-createpage' => 'АгӀонаш кхоллар (дийцарш дац)',
+'right-createtalk' => 'Дийцаре агӀонаш кхоллар',
+'right-createaccount' => 'декъашхошна керла дӀаяздарш кхоллар',
+'right-move' => 'АгӀонашан цӀераш хийцар',
+'right-move-subpages' => 'АгӀонашан цӀераш хийцар цера бухара агӀонашцан',
+'right-movefile' => 'Файланши цӀе хийцар',
+'right-upload' => 'Файлаш чуйаьхар',
+'right-delete' => 'агӀош дӀаяхар',
+'right-bigdelete' => 'еха хийцаман истори йолу агӀонаш дӀаяхар',
+'right-browsearchive' => 'ДӀаяхна агӀонаш лахар',
+'right-undelete' => 'АгӀонаш меттахӀоттор',
+'right-blockemail' => 'Цамагдо декъашхошка хааман кехаташ кхехьийта',
+'right-unblockself' => 'Ша шин блокдӀаяккхар',
+'right-protect' => 'АгӀона гӀоралла хийцар а гӀоралла дина агӀо нисяр а',
+
 # Special:Log/newusers
 'newuserlogpage' => 'Декъашхой дlабазбина тептар',
 
@@ -834,11 +956,13 @@ $1',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'нисйа хlара агlо',
+'action-delete' => 'дӀаяккха хӀара агӀо',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|хийцам|хийцамаш|хийцамаш}}',
 'recentchanges' => 'Керла нисдарш',
 'recentchanges-legend' => 'Гlирс нисбарна керла нисдарш',
+'recentchanges-summary' => 'Лахахь гайтина хене хьаьжна Википедин агӀонашкахь тӀаьхьара бина хийцамаш',
 'recentchanges-feed-description' => 'Тергам бе тlаьхьара вики хийцаман хlокху ларца.',
 'recentchanges-label-newpage' => 'Оцу нисдарца кхоллина керла агlо.',
 'recentchanges-label-minor' => 'Хlара нисдинарг къастийна жимо долушсан',
@@ -848,10 +972,11 @@ $1',
 'rcshowhidebots' => '$1 шабелхалой',
 'rcshowhideliu' => '$1 вовзитар долу декъашхой',
 'rcshowhideanons' => '$1 хьулбелларш',
+'rcshowhidepatr' => '$1 хьажжина нисдарш',
 'rcshowhidemine' => '$1 айхьа нисдинарш',
 'rclinks' => 'Гайта тlаьхьара $1 хийцамаш оцу $2 ден<br />$3',
 'diff' => 'тейп тайпнара',
-'hist' => 'иÑ\81Ñ\82оÑ\80е',
+'hist' => 'иÑ\81Ñ\82оÑ\80и',
 'hide' => 'Къайлаяккха',
 'show' => 'Гайта',
 'minoreditletter' => 'ж',
@@ -867,17 +992,20 @@ $1',
 'recentchangeslinked-feed' => 'Кхуьнца долу нисдарш',
 'recentchangeslinked-toolbox' => 'Кхуьнца долу нисдарш',
 'recentchangeslinked-title' => 'Кхуьнца долу нисдарш $1',
-'recentchangeslinked-summary' => "Хlара хийцам биначу агlонашан могlам бу, тlетовжар долуш хьагучу агlон (йа хьагойтуш йолучу кадегарна).
+'recentchangeslinked-summary' => "Хlара хийцам биначу агlонашан могlам бу, тlетовжар долуш хьагучу агlон (йа хьагойтуш йолучу категорена).
 Агlонаш юькъайогlуш йолу хьан [[Special:Watchlist|тергаме могlам чохь]] '''къастийна йу'''.",
 'recentchangeslinked-page' => 'Агlон цlе:',
 'recentchangeslinked-to' => 'Кхечу агlор, гайта хийцамаш агlонашца, хlоттийначу агlонтlе хьажориг йолуш',
 
 # Upload
-'upload' => 'ЧÑ\83йаккÑ\85а Ñ\85\83м',
-'uploadbtn' => 'ЧÑ\83йаккÑ\85а Ñ\85\83м',
+'upload' => 'Файл Ñ\87Ñ\83Ñ\8fккÑ\85аÑ\80',
+'uploadbtn' => 'Файл Ñ\87Ñ\83Ñ\8fккÑ\85аÑ\80',
 'uploadlogpage' => 'Чуйахаран тéптар',
-'uploadlogpagetext' => 'Лахахьа гойтуш бу могlам тlаьххьара чуяхна хlумнаши. Ишта хьажа. [[Special:ImageList|хlумнаши могlам]] йа [[Special:NewImages|галеларе хlумнаши]].',
-'filename' => 'Хlуман цlе',
+'uploadlogpagetext' => 'Лахахьа гойтуш бу могlам тlаьххьара чуяхна файлаши. Ишта хьажа. [[Special:ImageList|файлаши могlам]] йа [[Special:NewImages|галеларе файлаши]].',
+'filename' => 'Файлан цӀе',
+'filedesc' => 'Файлах лаьцна',
+'fileuploadsummary' => 'Файлах лаьцна:',
+'filereuploadsummary' => 'Файлан хийцамаш:',
 'uploadwarning' => 'Дlахьедар',
 'uploadedimage' => 'чуяккхина «[[$1]]»',
 'filename-prefix-blacklist' => '#<!-- битийша хlара могlа ша мабарра --> <pre>
@@ -898,41 +1026,58 @@ PICT # тайп тайпан
 'license' => 'Бакъойалар:',
 
 # Special:ListFiles
+'listfiles-summary' => 'Лахахь гойтуш ю ерриг файлаш.
+Декъашхо къастичи, цун керла файлаш гойту.',
 'listfiles_search_for' => 'Лаха хIуман цIарца:',
-'imgfile' => 'Ñ\85\83м',
-'listfiles' => 'Ð¥lÑ\83мнаÑ\88и Ð¼Ð¾Ð³lам',
-'listfiles_name' => 'Ð¥lÑ\83ман Ñ\86lе',
+'imgfile' => 'Ñ\84айл',
+'listfiles' => 'ФайлаÑ\88и Ð¼Ð¾Ð³Ó\80ам',
+'listfiles_name' => 'Файлан Ñ\86Ó\80е',
 'listfiles_user' => 'Декъашхо',
 'listfiles_size' => 'Барам',
 'listfiles_description' => 'Цуьнах лаьцна',
 
 # File description page
-'file-anchor-link' => ' Хlум',
-'filehist' => 'Ð¥lÑ\83ман Ð¸Ñ\81Ñ\82оÑ\80е',
-'filehist-help' => 'ТlеÑ\82аlаде Ñ\82еÑ\80аÑ\85Ñ\8c\85ан, Ð¼Ñ\83Ñ\85а Ñ\85илла Ñ\85Ñ\8cажаÑ\80на Ð¸ Ñ\85\83м.',
-'filehist-deleteall' => 'дlадайá Ð¼Ð°Ñ\81Ñ\81о',
-'filehist-deleteone' => 'дlадайá',
+'file-anchor-link' => 'Файл',
+'filehist' => 'Файлан Ð¸Ñ\81Ñ\82оÑ\80и',
+'filehist-help' => 'ТlеÑ\82аlаде Ñ\82еÑ\80аÑ\85Ñ\8c\85ан, Ð¼Ñ\83Ñ\85а Ñ\85илла Ñ\85Ñ\8cажаÑ\80на Ð¸ Ñ\84айл.',
+'filehist-deleteall' => 'маÑ\81Ñ\81о Ð´Ó\80аÑ\8fккÑ\85а',
+'filehist-deleteone' => 'дӀаяккха',
 'filehist-current' => 'карара',
 'filehist-datetime' => 'Терахь/Хан',
 'filehist-thumb' => 'Жима',
 'filehist-thumbtext' => 'Жимо башхо оцу $1',
 'filehist-user' => 'Декъашхо',
-'filehist-dimensions' => 'Ð¥lÑ\83ман барам',
+'filehist-dimensions' => 'Файлан барам',
 'filehist-comment' => 'Билгалдаккхар',
-'imagelinks' => 'Хьажоригаш оцу хlуман',
-'linkstoimage' => '{{PLURAL:$1|Тlаьхьайогlу $1 агlо тlетойжина|Тlаьхьайогlу $1 агlонаш тlетойжина|Тlаьхьайогlу $1 агlонаш тlетойжина}} хlокху хlуман:',
+'imagelinks' => 'Хьажоригаш оцу файлан',
+'linkstoimage' => '{{PLURAL:$1|Тlаьхьайогlу $1 агlо тlетойжина|Тlаьхьайогlу $1 агlонаш тlетойжина|Тlаьхьайогlу $1 агlонаш тlетойжина}} хlокху файлан:',
+'nolinkstoimage' => 'АгӀонашчохь файл лелош яц.',
 'sharedupload' => 'Хlара хlума оцун $1 чура ю иза хила мега лелош кхечу кхолламашкахь.',
-'uploadnewversion-linktext' => 'Чуяккха керла башхо хlокху хlуман',
+'sharedupload-desc-here' => 'ХӀара файл $1 чура ю и лело йиш ю массо проекташи.
+Цунна хаам гайтина лахахь. [$2 Файл ВикидӀайуьллуче чохь]',
+'uploadnewversion-linktext' => 'Чуяккха керла верси хӀокху файлан',
 'shared-repo-name-wikimediacommons' => 'Викидlайуллуче',
 
 # File reversion
+'filerevert-comment' => 'Бахьан:',
 'filerevert-submit' => 'Юхаяккха',
 
 # File deletion
-'filedelete-legend' => 'Дlайайá и хlум',
-'filedelete-submit' => 'Дlадайá',
+'filedelete-legend' => 'ДӀаяккха и файл',
+'filedelete-intro' => "<div class=\"plainlinks\">
+Хьо  дӀаяккха лууш ву '''[[Media:\$1|\$1]]''' ([{{fullurl:{{FULLPAGENAME}}|action=history}} истори])
+
+* '''Тешна хила, и файл [{{fullurl:Special:WhatLinksHere/File:\$1|hidetrans=1&hideredirs=1&hidelinks=1}} лелош цахиларна]''' (йа [[:commons:File:{{PAGENAME}}|оцуьнах терра файл ю]] оц ВикидӀайуьллуче чохь)
+* Хьажа [{{fullurl:Special:WhatLinksHere/File:\$1|hideimages=1}} гуттаралера хьажориг йуй] оц файлан тӀе
+
+{{#ifexist:{{TALKPAGENAME}}|ХӀокху агӀона ю '''[[{{TALKPAGENAME}}|дийцаре агӀо]].'''}}
+</div>",
+'filedelete-comment' => 'Бахьан:',
+'filedelete-submit' => 'ДӀаяккха',
+'filedelete-success' => '$1 дӀаяккхи.',
 'filedelete-otherreason' => 'Кхин бахьан:',
 'filedelete-reason-otherlist' => 'Кхин бахьан',
+'filedelete-edit-reasonlist' => 'Бахьанин список нисяр',
 
 # MIME search
 'mimesearch' => 'MIME хула лаха',
@@ -944,7 +1089,7 @@ PICT # тайп тайпан
 'listredirects' => 'ДIасахьажоран могIам',
 
 # Unused templates
-'unusedtemplates' => 'Лелош доцу куцкепаш',
+'unusedtemplates' => 'Лелош доцу кепаш',
 
 # Random page
 'randompage' => 'Цахуаш нисйелла агlо',
@@ -960,20 +1105,22 @@ PICT # тайп тайпан
 'statistics-articles' => 'Яззамаш',
 'statistics-pages' => 'Агlонаш',
 'statistics-pages-desc' => 'Массо вики агlонаш, дийцаре агlонашцани, дlасахьаждарш а кхин дерш.',
-'statistics-files' => 'ЧÑ\83йаÑ\8cÑ\85на Ñ\85\83мнаш',
+'statistics-files' => 'ЧÑ\83йаÑ\8cÑ\85на Ñ\84айлаш',
 'statistics-edits' => 'Нисдаран дукхалла {{grammar:genitive|{{SITENAME}}}} дlа йолайаларца',
 'statistics-edits-average' => 'Йукъера агlонан нисдаран терхь',
+'statistics-users' => '[[ВП:Дlаязвалар|Дlаязбелларш]] шаберигге декъашхой чохь болу [[Special:ListUsers|(могlам)]]',
 'statistics-users-active' => 'Жигар декъашхой',
 'statistics-users-active-desc' => 'Декъашхой, муьлха цхьа хlум дина болу, кху {{PLURAL:$1|тlаьххьара $1 динахь|тlаьххьара $1 дийнахь}}',
 
 'disambiguations' => 'Дуккха маьIнаш долу хьажорца йолу агIонаш',
+'disambiguationspage' => 'Кеп:цхьатера маьӀна доцуш',
 
 'doubleredirects' => 'ШалгIа дIасахьажийнарш',
 'double-redirect-fixed-move' => 'Агlон [[$1]] цlе хийцна, хlинца иза дlахьажийна оцу [[$2]]',
 
 'brokenredirects' => 'ДIахаьдна долу дIасахьажораш',
 'brokenredirects-edit' => 'нисйé',
-'brokenredirects-delete' => 'дlадайá',
+'brokenredirects-delete' => 'дӀаяккха',
 
 'withoutinterwiki' => 'Кхечу меттанашан хьажориг йоцу агIонаш',
 'withoutinterwiki-submit' => 'Гайта',
@@ -981,41 +1128,49 @@ PICT # тайп тайпан
 'fewestrevisions' => 'ЧIогIа кIезиг башхонаш йолу агIонаш',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|цlинцl|цlинцlа|цlинацl}}',
-'ncategories' => '$1 {{PLURAL:$1|кадегар|кадегарш|кадегарш}}',
-'nmembers' => '$1 {{PLURAL:$1|хlум|хlума|хlумнаш}}',
+'nbytes' => '$1 {{PLURAL:$1|байт|байташ|байт}}',
+'ncategories' => '$1 {{PLURAL:$1|категори|категореш|категореш}}',
+'nmembers' => '$1 {{PLURAL:$1|файл|файл|файлаш}}',
+'nimagelinks' => 'Лелош ю $1 {{PLURAL:$1|агӀоначохь|агӀонашкахь|агӀонашкахь}}',
+'ntransclusions' => 'лелош ю $1 {{PLURAL:$1|агӀоначохь|агӀонашкахь|агӀонашкахь}}',
 'specialpage-empty' => 'Дехаро хlумма ца елла.',
 'lonelypages' => 'Байлахь йисина агIонаш',
-'uncategorizedpages' => 'Кадегар йоцу агIонаш',
-'uncategorizedcategories' => 'Кадегар йоцу кадегарш',
-'uncategorizedimages' => 'Кадегар йоцу хIумнаш',
-'uncategorizedtemplates' => 'Кадегар йоцу куцкепаш',
-'unusedcategories' => 'Йаьсса кадегарш',
-'wantedcategories' => 'Оьшуш йолу кадегарш',
+'uncategorizedpages' => 'Категори йоцу агIонаш',
+'uncategorizedcategories' => 'Категори йоцу категореш',
+'uncategorizedimages' => 'Категори йоцу хIумнаш',
+'uncategorizedtemplates' => 'Категори йоцу кепаш',
+'unusedcategories' => 'Йаьсса категореш',
+'wantedcategories' => 'Оьшуш йолу категореш',
 'wantedpages' => 'Оьшуш йолу агIонаш',
 'wantedfiles' => 'Оьшуш йолу хIумнаш',
-'wantedtemplates' => 'Оьшуш долу куцкепаш',
+'wantedtemplates' => 'Оьшуш долу кепаш',
 'mostlinked' => 'Дуккха хьажоригаш тIе тоьхна йолу агIонаш',
-'mostlinkedcategories' => 'Дуккха тIе хьажораш йолу кадегарш',
-'mostlinkedtemplates' => 'Массарел дуккха а леладо куцкепаш',
-'mostcategories' => 'Дуккха кадегарш тIе тоьхна йолу агIонаш',
-'mostimages' => 'Ð\9cаÑ\81Ñ\81аÑ\80ел Ð´Ñ\83ккÑ\85а Ð»ÐµÐ»Ð°Ð¹Ð¾ Ñ\85\83мнаш',
+'mostlinkedcategories' => 'Дуккха тӀе хьажораш йолу категореш',
+'mostlinkedtemplates' => 'Массарел дуккха а леладо кепаш',
+'mostcategories' => 'Дуккха категореш тӀе тоьхна йолу агӀонаш',
+'mostimages' => 'Ð\9cаÑ\81Ñ\81аÑ\80ел Ð´Ñ\83ккÑ\85а Ð»ÐµÐ»Ð°Ð¹Ð¾ Ñ\84айлаш',
 'mostrevisions' => 'Сих сиха нисйина йолу агIонаш',
 'prefixindex' => 'Хьалха агlонашан цlераш хlотто йеза',
+'prefixindex-namespace' => 'Хьалха агӀонашан цӀераш хӀотто еза («{{ns:$1}}»)',
 'shortpages' => 'Боцоа яззамаш',
 'longpages' => 'Беха яззамаш',
 'deadendpages' => 'Дика йоцу агIонаш',
 'protectedpages' => 'ГIаролла дина агIонаш',
 'protectedtitles' => 'Ца магийна йолу цIераш',
 'listusers' => 'Декъашхой могlам',
+'listusers-editsonly' => 'Цхаъ мукъане а хийцам бина декъашхой гайта',
+'listusers-creationsort' => 'Кхолларан хене хьаьжна нисъяр',
+'usercreated' => '{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2',
 'newpages' => 'Керла агlонаш',
 'newpages-username' => 'Декъашхо:',
-'ancientpages' => 'ЯззамаÑ\88 Ð¾Ñ\86Ñ\83 Ñ\82еÑ\80аÑ\85Ñ\8cÑ\86а Ñ\82Ñ\8fÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\80едаккÑ\85ар дина долу',
+'ancientpages' => 'ЯззамаÑ\88 Ð¾Ñ\86Ñ\83 Ñ\82еÑ\80аÑ\85Ñ\8cÑ\86а Ñ\82Ñ\8fÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\82адар дина долу',
 'move' => 'Цlе хийца',
 'movethispage' => 'Хlокху агlон цlе хийца',
 'unusedimagestext' => 'Дехар до, тидаме эца, кхин йолу дуьнана машан-меттигаш а лелош хила мега нисса йогlу хьажориг (URL) хlокху хlуман, хlокху могlаме йогlуш ялахь яцахь а иза хила мега жигара лелош.',
+'nopagetitle' => 'Ишта агӀо яц',
+'nopagetext' => 'Ишта агӀо яц.',
 'pager-newer-n' => '{{PLURAL:$1|алсамо керла|алсамо керланаш|алсамо керлачарех}} $1',
-'pager-older-n' => '{{PLURAL:$1|алсамо къена|алсамо къенанаш|алсамо къеначарех}} $1',
+'pager-older-n' => '{{PLURAL:$1|алсамо шира|алсамо ширниш|алсамо ширачарех}} $1',
 
 # Book sources
 'booksources' => 'Жайнан хьосташ',
@@ -1029,10 +1184,12 @@ PICT # тайп тайпан
 'all-logs-page' => 'Деригге тléкхочучéхь долу тéптарш',
 'alllogstext' => 'Массо тéптар могlам. {{SITENAME}}.
 Шуьга харжалур бу хилам оцу тептаре хьаьжжина, декъашхон цlе (дlаязвар диц а цадеш) йа иза хьакхавелла агlонаш (ишта дlаязвар а диц цадеш).',
+'logempty' => 'Тептарш чохь хӀокху агӀона дӀаяздарш дац.',
 
 # Special:AllPages
 'allpages' => 'Массо агlонаш',
 'alphaindexline' => 'оцу $1 кху $2',
+'nextpage' => 'Тlаьхьа йогlу агlо ($1)',
 'prevpage' => 'Хьалхалера агlо ($1)',
 'allpagesfrom' => 'Гучé яха агlонаш, йуьлалуш йолу оцу:',
 'allpagesto' => 'Арайахар сацадé оцу:',
@@ -1043,12 +1200,14 @@ PICT # тайп тайпан
 'allpagesprefix' => 'Лаха агlонаш, дlайуьлалуш йолу:',
 'allpagesbadtitle' => 'Цамагош йолу агlон цlе. Коьрта могlан юкъах ю юкъарвики меттанашан юкъе тlечlагlйина йолу хьаьрк йа магийна доцу оцу коьрта моlанца сабол элп йа кхин.',
 'allpages-bad-ns' => '{{SITENAME}} кху чохь ана цlераш яц «$1».',
+'allpages-hide-redirects' => 'Къайлаяха дӀасахьажийнарш',
 
 # Special:Categories
-'categories' => 'Кадегарш',
+'categories' => 'Категореш',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'Декъашхочуьн дlабайина къинхьегам',
+'deletedcontributions-title' => 'ДӀабаьккхина къинхьегам',
 'sp-deletedcontributions-contribs' => 'къинхьегам',
 
 # Special:LinkSearch
@@ -1057,10 +1216,12 @@ PICT # тайп тайпан
 'linksearch-line' => '$2 — хьажориг кху $1',
 
 # Special:ListUsers
+'listusersfrom' => 'ТӀера волавелла декъашхой гайта:',
 'listusers-submit' => 'Гайта',
 
 # Special:ActiveUsers
 'activeusers' => 'Жигар декъашхой могlам',
+'activeusers-from' => 'ТӀера волавелла декъашхой гайта:',
 
 # Special:ListGroupRights
 'listgrouprights' => 'Декъашхойн тобанаши бакъонаш',
@@ -1068,15 +1229,15 @@ PICT # тайп тайпан
 'listgrouprights-helppage' => 'Help:Тобан бакъонаш',
 'listgrouprights-members' => '(тобан могlам)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Декъашхочун хааман кехат',
 'defemailsubject' => 'Хаам {{grammar:genitive|{{SITENAME}}}} чура бу',
 'emailmessage' => 'Хаам:',
 
 # Watchlist
 'watchlist' => 'Тергаме могlам',
-'mywatchlist' => 'Тергаме могlам',
-'watchnologin' => 'Хьо вовзита веза гlирсан',
+'mywatchlist' => 'Тергаме могӀам',
+'watchnologin' => 'Хьо вовзийта/йовзийта гlирсан',
 'addedwatchtext' => 'Хlар агlо «[[:$1]]» тlетоьхна хьан [[Special:Watchlist|тидаме могlам чу]].
 Тlаьхьабогlу хийцамаш хlокх агlонна а кхунца дозуш долу дийцаре агlо а дlаяздийра ду кху могlамашкахь, ишта къастина хирду уьш шуьрочу элпашца хlокх агlон чохь [[Special:RecentChanges|керла хийцаме могlамашкахь]], бгlаьран га атту болуш.',
 'removedwatchtext' => 'Агlо «[[:$1]]» дlаяккхина йара хьан [[Special:Watchlist|тергаме могlам юкъар]].',
@@ -1085,6 +1246,7 @@ PICT # тайп тайпан
 'unwatch' => 'Тергамах къаста',
 'notanarticle' => 'Бац яззам',
 'watchlist-details' => 'Хьан тергаме могlамца $1 {{PLURAL:$1|агlо|агlонаш|агlонаш}} ю, дийцаре агlонаша йоцуш.',
+'wlheader-showupdated' => "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
 'wlnote' => 'Лахахьа {{PLURAL:$1|тlаьхьа богlу $1 хийцам|тlаьхьа богlу $1 хийцамаш|тlаьхьа богlу $1 хийцамаш}} хlокху {{PLURAL:$2|тlаьхьар|тlаьхьара|тlаьхьара}} <strong>$2</strong> {{plural:$2|сохьт|сохьатехь|сохьташкахь}}.',
 'wlshowlast' => 'Гайта тlаьххьара $1 сахьташ $2 денош $3',
 'watchlist-options' => 'Тергаме могlаман гlирс нисбар',
@@ -1094,49 +1256,65 @@ PICT # тайп тайпан
 'unwatching' => 'Тергаме мlогаман чура дlайаккха…',
 
 # Delete
-'deletepage' => 'Дlайайá агlо',
-'confirm' => 'Ð\9aÑ\8aобалде',
+'deletepage' => 'ДӀаяккха агӀо',
+'confirm' => 'Ð\91акÑ\8aдан',
 'excontent' => 'чуьраниг: «$1»',
 'excontentauthor' => 'чуьраниг: «$1» (дуьххьара кхоллина да вара иза [[Special:Contributions/$2|$2]])',
 'exbeforeblank' => 'чуьраниг дlацlанйале хьалха: «$1»',
 'exblank' => 'агlо йаьсса йара',
-'delete-legend' => 'Дlадайáр',
-'confirmdeletetext' => 'Хьан дехар ду хlара агlо ше бухци дlабайа аьлла (йа сурт) а массо цуьнан исторе оцу бух чура. Дехар до, бакъде, билгала хьайна иза лаахь, кхеташ хира ву хьо тlаьхьа хир долу чун, иза деш ду ахьа бакъонца догlуш, вахьа дехкина долучу дакъанца [[{{MediaWiki:Policy-url}}]].',
+'delete-confirm' => '$1 — дӀаяккхар',
+'delete-legend' => 'ДӀаяккхар',
+'historywarning' => "'''Тергам:''' хӀокху агӀона герггарчу хьесапехь $1 {{PLURAL:$1|версеш|верси|верси}} ю:",
+'confirmdeletetext' => 'Хьан дехар ду хlара агlо ше бухци дlабайа аьлла (йа сурт) а массо цуьнан истори оцу бух чура. Дехар до, бакъде, билгала хьайна иза лаахь, кхеташ хира ву хьо тlаьхьа хир долу чун, иза деш ду ахьа бакъонца догlуш, вахьа дехкина долучу дакъанца [[{{MediaWiki:Policy-url}}]].',
 'actioncomplete' => 'Дешдерг кхочушди',
-'deletedtext' => '«$1» дlаяккхина йара.
-Хьажа. $2 хьажарна оцу тlаьхьара дlадайаран могlаме.',
-'dellogpage' => 'Дlадайарш долу тéптар',
-'deletionlog' => 'дlадайарш долу тéптар',
+'deletedtext' => '«$1» дӀаяккхина яра.
+Хьажа. $2 хьажарна оцу тӀаьхьара дӀаяхначара могӀаме.',
+'dellogpage' => 'ДӀадяхнарш долу тéптар',
+'deletionlog' => 'дӀадяхнарш долу тéптар',
 'deletecomment' => 'Бахьан:',
 'deleteotherreason' => 'Кхин бахьан/тlетохар:',
 'deletereasonotherlist' => 'Кхин бахьан',
+'delete-edit-reasonlist' => 'Бахьанин список нисяр',
 
 # Rollback
-'rollbacklink' => 'йухаяккха',
+'rollback' => 'Юхабаккха хийцам',
+'rollbacklink' => 'юхаяккха',
+'rollbacklinkcount' => 'юхадаккха $1 {{PLURAL:$1|нисдар|нисдарш}}',
+'rollbacklinkcount-morethan' => 'Юхадаккха $1 дукха {{PLURAL:$1|нисдар|нисдарш|нисдарш}}',
 'revertpage' => 'Нисдарш [[Special:Contributions/$2|$2]] ([[User talk:$2|дийцаре]]) йуха йаьхна башхаллийн [[User:$1|$1]]',
+'rollback-success' => 'Юха даьхна $1; нисдарш, $2 версен.',
 
 # Protect
 'protectlogpage' => 'Гlаролли тептар',
 'protectedarticle' => 'гlаролла дина агlо «[[$1]]»',
 'modifiedarticleprotection' => 'агlонан гlаролли локхалла хийцина «[[$1]]»',
+'unprotectedarticle' => 'ГӀоролла дӀадаьстина «[[$1]]»',
+'movedarticleprotection' => '«[[$2]]» гӀаролла сехьадаккха «[[$1]]»',
+'protect-title' => 'Оцунна «$1» гӀоралла дар',
 'prot_1movedto2' => '«[[$1]]» цlе хийцина оцу «[[$2]]»',
+'protect-legend' => 'Бакъде гӀоралла дар',
 'protectcomment' => 'Бахьан:',
 'protectexpiry' => 'Чекхйолу:',
 'protect_expiry_invalid' => 'Нийса йоцу хан гlаролла дlайаларехь.',
 'protect_expiry_old' => 'Хан чаккхе — хьалхалера.',
+'protect-unchain-permissions' => 'Схьабелла кхин гӀорралин гӀирс',
 'protect-text' => "Кхузéхь хьо хьажало хийцалуш гlаролли локхалла оцу агlонашна '''$1'''.",
 'protect-locked-access' => "Хьан дlаязваларéхь тоъал бакъо яц гlароллийн локхаллéхь агlон хийцам бá. Дlадоьлху хlоттийнарш оцу агlонна '''$1''':",
 'protect-cascadeon' => 'Хlара агlо гlароллийца ю, хlунд аьлча иза латийна {{PLURAL:$1|лахахьа гойтучу агlонца, цуьнца хlоттийна|лахахьа гойтучу агlоншца, цаьрца хlоттийна}} чахчарийца гlаролла. Хьога хийцалур ю гlаролли локхалла хlокху агlон, амма оцо хийцам бийра бац чахчарехь йолучу гlароллийна.',
 'protect-default' => 'Гlаролла йоцуш',
 'protect-fallback' => 'Бакъо оьшу «$1»',
 'protect-level-autoconfirmed' => 'Гlаролла дé оцу керла а дlабазбина боцучу декъашхойх',
-'protect-level-sysop' => 'Ð\90дманкÑ\83Ñ\8cйгалÑ\85ой Ð±Ã©',
+'protect-level-sysop' => 'Ð\9aÑ\83Ñ\8cйгалÑ\85оÑ\88на Ð±Ã© Ñ\86амагдо',
 'protect-summary-cascade' => 'чахчареца',
 'protect-expiring' => 'чакхйолу $1 (UTC)',
 'protect-expiry-indefinite' => 'хан чаккхе йоцуш',
 'protect-cascade' => 'Гlаролла йé агlонаш, хlокху агlонца хlоттайелларш (чахчарé гlаролла)',
 'protect-cantedit' => 'Хьéга хийцам цабало хlокху агlон гlаролли локхалан, хlуд аьлча хьан бакъо яц оцун рéдаккха.',
+'protect-othertime' => 'Кхин хан:',
+'protect-othertime-op' => 'кхин хан',
+'protect-otherreason' => 'Кхин бахьна/тӀетохар:',
 'protect-otherreason-op' => 'Кхин бахьан',
+'protect-edit-reasonlist' => 'Бахьанин список нисяр',
 'restriction-type' => 'Бакъо:',
 'restriction-level' => 'Тlевитарна локхалла:',
 
@@ -1144,19 +1322,35 @@ PICT # тайп тайпан
 'restriction-upload' => 'Чуйолуш',
 
 # Restriction levels
+'restriction-level-autoconfirmed' => 'дуьззина доцуш гӀаролла',
 'restriction-level-all' => 'массо барам',
 
 # Undelete
 'undelete' => 'ДIайайина йолу агIонашка хьажар',
+'undeletepage' => 'ДӀаяхина агӀонашка хьажар а меттахӀоттор а',
+'undeletepagetitle' => "'''Лахахь гайтина хӀокху [[:$1]] агӀона дӀаяхина версеш'''.",
 'viewdeletedpage' => 'ДIайайина йолу агIонашка хьажар',
+'undelete-fieldset-title' => 'МеттахӀоттае версеш',
+'undeleteextrahelp' => "Ерриге агӀонан истори меттахӀоттая массо а билгалонаш еса а йити '''«{{int:undeletebtn}}»''' тӀетаӀае.
+ЦхӀайолу агӀонан версиш меттахӀоттая цкъахьалха меттахӀоттош йолу версиш билгалъяхна тӀетагӀе '''«{{int:undeletebtn}}»'''.",
 'undeleterevdel' => 'Метта хlоттор хира дац, нагахь иза дакъошкахь дlадайина далахь а тlаьххьара кисак башхо йа хlума.
 Иштнарг хилча ахьа дlабаккха беза хlоттийна болу къастам йа хьагайта тlаьххьара дlайайина башхо.',
-'undeletelink' => 'хьажа/метта хlоттаде',
+'undeletebtn' => 'МеттахӀоттае',
+'undeletelink' => 'хьажа/меттахӀоттае',
+'undeleteviewlink' => 'хьажа',
+'undeleteinvert' => 'Къастае массо',
+'undeletecomment' => 'Бахьан:',
+'undeletedrevisions' => '$1 {{PLURAL:$1|хийцамаш|хийцамаш|хийцамаш}} меттахӀоттайина',
+'undeletedfiles' => '$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина|файлаш меттахӀоттайина}}',
+'undeletedpage' => "'''МеттахӀоттайина агӀо «$1».'''
+
+ДӀадяхнарш долу могӀане [[Special:Log/delete|тéптаре хьажа]].",
 'undelete-search-submit' => 'Лаха',
 
 # Namespace form on various pages
 'namespace' => 'Цlерийн ана:',
 'invert' => 'Хаьржинарг хилийта',
+'namespace_association' => 'Йихкина меттиг',
 'blanknamespace' => '(Коьрта)',
 
 # Contributions
@@ -1169,12 +1363,15 @@ PICT # тайп тайпан
 'year' => 'Шерачохь (йа хьалхе):',
 
 'sp-contributions-newbies' => 'Гайта бекъ къинхьегам, керла дlабазбиначара бина болу',
-'sp-contributions-blocklog' => 'сацораш',
+'sp-contributions-blocklog' => 'блоктоьхарш',
+'sp-contributions-deleted' => 'дӀадяхна нийсдарш',
+'sp-contributions-uploads' => 'Файлаш',
 'sp-contributions-logs' => 'тéптарш',
 'sp-contributions-talk' => 'дийцаре',
 'sp-contributions-userrights' => 'декъашхочуьн бакъона урхалладар',
 'sp-contributions-search' => 'Къинхьегам лахар',
 'sp-contributions-username' => 'IP-долу меттиг йа декъашхон цlе:',
+'sp-contributions-toponly' => 'ТӀаьхьара бина хийцамаш гайта',
 'sp-contributions-submit' => 'Лаха',
 
 # What links here
@@ -1182,6 +1379,8 @@ PICT # тайп тайпан
 'whatlinkshere-title' => 'Агlонаш, хьажоригца оцу «$1»',
 'whatlinkshere-page' => 'Агlо:',
 'linkshere' => "Тlаьхьайогlу агlонаш хьажоригца ю оцу '''[[:$1]]''':",
+'nolinkshere' => "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашчохь хьажоригаш яц",
+'nolinkshere-ns' => "Хаьржинчу анахь яц '''[[:$1]]''' цӀе йолу агӀонаш",
 'isredirect' => 'агlо-дlасахьажайар',
 'istemplate' => 'лата йe',
 'isimage' => 'Оцу суьртан хьажориг',
@@ -1194,40 +1393,83 @@ PICT # тайп тайпан
 'whatlinkshere-filters' => 'Литтарш',
 
 # Block/unblock
-'blockip' => 'Сацаве',
+'block' => 'Декъашхон блоктохар',
+'blockip' => 'Блоктоха',
+'blockip-legend' => 'Декъашхон блоктохар',
 'ipadressorusername' => 'IP-долу меттиг йа декъашхон цlе:',
+'ipbexpiry' => 'Хан чекхйолу:',
+'ipbreason' => 'Бахьан:',
 'ipbreasonotherlist' => 'Кхин бахьан',
+'ipbreason-dropdown' => '* Белхан некъ дӀакъовлар бахьанаш:
+** Харца хаам бар
+** АгӀонан чураниг дӀаяккхар
+** Спам-хьажорагаш арахьара сайташна
+** МаьӀна доцу текст тӀетохар
+** Декъашхой хьийзабар, кхерамаш тиссар
+** Масийтта лараман яздар зуламан лелаяр
+** Магитина йоцу декъашхон цӀе',
+'ipbcreateaccount' => 'Цамагдо дӀаязвалар',
+'ipbemailban' => 'Цамагдо декъашхошка хааман кехаташ кхехьийта',
+'ipbenableautoblock' => 'Сацае декъашхочо лелош йолу IP-адресаш',
+'ipbsubmit' => 'Блоктоха декъашхон',
+'ipbother' => 'Кхин хан:',
 'ipboptions' => '2 сахьат:2 hours,1 де:1 day,3 де:3 days,1 кlиран:1 week,2 кlиран:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шо:1 year,цlкъа:infinite',
-'blockipsuccesssub' => 'Сацавар чакхдели',
-'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] сацийна ву.<br />
-Хьажа. [[Special:BlockList|могlам сацийна IP-долу меттигаш]].',
+'ipbwatchuser' => 'ТӀетоха тергаме могӀам юкъа цуьнан долахь йолу агӀо а цуьнан дийцаре агӀо а',
+'ipb-disableusertalk' => 'Цамагдо шин дийцаре агӀо та я блоктоьхна волучу хенахь',
+'ipb-confirm' => 'Бакъде блоктохар',
+'blockipsuccesssub' => 'Блоктохар чакхдели',
+'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] блоктоьхна ву.<br />
+Хьажа. [[Special:BlockList|могlам блоктоьхна IP-долу меттигаш]].',
+'ipb-blockingself' => 'Хьо хьайна блоктухуш ву (ю)! Лууш вуй (йуй) хьо и кхочуш дан?',
+'ipb-edit-dropdown' => 'Бахьанин список нисяр',
+'ipb-unblock-addr' => 'ДӀаякхаблок $1',
+'ipb-unblock' => 'дӀаякхаблок декъашхонтӀера я IP-адрес тӀера',
+'ipb-blocklist' => 'Блоктоьхнарш',
 'ipb-blocklist-contribs' => 'Декъашхон къинхьегам $1',
+'unblockip' => 'ДӀаякхаблок декъашхонтӀера',
 'unblocked' => '[[User:$1|$1]] хьайаьстина.',
-'ipblocklist' => 'Сацийна IP-долу меттиг а дlалаьрра язбаларш',
+'ipblocklist' => 'Блоктоьхна IP-долу меттиг а дlалаьрра язбаларш',
+'blocklist-reason' => 'Бахьан:',
 'ipblocklist-submit' => 'Лаха',
-'blocklink' => 'сацаве',
-'unblocklink' => 'хьаваста',
-'change-blocklink' => 'хийцам бе сацорна',
+'infiniteblock' => 'хан чаккхе йоцуш',
+'blocklink' => 'блоктоха',
+'unblocklink' => 'дӀаякхаблок',
+'change-blocklink' => 'хийцам бе блоктохарна',
 'contribslink' => 'къинхьегам',
-'blocklogpage' => 'Сацораш долу тептар',
-'blocklogentry' => 'сацийна [[$1]] цхьана ханна $2 $3',
-'unblocklogentry' => 'схьаваьстина $1',
+'blocklogpage' => 'Блоктоьхарш болу тептар',
+'blocklogentry' => 'блоктоьхна [[$1]] цхьана ханна $2 $3',
+'reblock-logentry' => 'Хийцина  блоктоьхна хан [[$1]] $2 $3',
+'unblocklogentry' => 'дӀаякхинаблок $1',
 'block-log-flags-nocreate' => 'цамагдо дlаязвалар дlаязбаларшца',
 
 # Move page
 'move-page' => '$1 — цlе хийцар',
+'move-page-legend' => 'ЦӀe хийца яр',
 'movepagetext' => "Леладан лахар хатlаьхь, хьо агlон цlе хуьйцуш ву, цхьатерра дехьа а докхуш цуьнан хийцаман тептар.
 Тиша цlе хира ю дlасахьажйарехь керлачун тlе хьажийна.
 Хьега далур ду ша шех дlасахьажор керла яккхар, хьалхалерачуьна метта йиллина йолу.
 Нагахь ахьа иза цадинехь, дехар до, хьажа йуйла [[Special:DoubleRedirects|шалгlа]] а [[Special:BrokenRedirects|хадийначу дlасахьажориш]].
 Ахьа жоп лур ду кхин дlа а хьажориг хьажийна хилийта, хила йезаче.
 
-ТеÑ\80гамбеÑ\88 Ñ\85ила, Ð¸Ð·Ð° Ð°Ð³lо '''Ñ\85иÑ\80а Ñ\8fÑ\86''' Ñ\86lе Ñ\85ийÑ\86ина, Ð½Ð°Ð³Ð°Ñ\85Ñ\8c Ð¸Ð·Ð° Ñ\86lе Ð¹Ð¾Ð»Ñ\83Ñ\88 ÐºÐµÑ\80ла Ð°Ð³lо Ð¹Ð°Ð»Ð°Ñ\85Ñ\8c, Ñ\86Ñ\85Ñ\8cа Ð¹Ð¾Ð»Ñ\83 Ñ\85енаÑ\85Ñ\8c, Ð½Ð°Ð³Ð°Ñ\85Ñ\8c Ð¸Ð·Ð° Ð¹Ð°Ð»Ð°Ñ\85Ñ\8c Ñ\86Ñ\85Ñ\8cан Ñ\82lе Ñ\85Ñ\8cажийна Ð¹Ð° Ð¹Ð°Ñ\8cÑ\81Ñ\81а Ð° Ð½Ð¸Ñ\81йаÑ\80Ñ\86а Ð¸Ñ\81Ñ\82оÑ\80е йоцуш.
+ТеÑ\80гамбеÑ\88 Ñ\85ила, Ð¸Ð·Ð° Ð°Ð³lо '''Ñ\85иÑ\80а Ñ\8fÑ\86''' Ñ\86lе Ñ\85ийÑ\86ина, Ð½Ð°Ð³Ð°Ñ\85Ñ\8c Ð¸Ð·Ð° Ñ\86lе Ð¹Ð¾Ð»Ñ\83Ñ\88 ÐºÐµÑ\80ла Ð°Ð³lо Ð¹Ð°Ð»Ð°Ñ\85Ñ\8c, Ñ\86Ñ\85Ñ\8cа Ð¹Ð¾Ð»Ñ\83 Ñ\85енаÑ\85Ñ\8c, Ð½Ð°Ð³Ð°Ñ\85Ñ\8c Ð¸Ð·Ð° Ð¹Ð°Ð»Ð°Ñ\85Ñ\8c Ñ\86Ñ\85Ñ\8cан Ñ\82lе Ñ\85Ñ\8cажийна Ð¹Ð° Ð¹Ð°Ñ\8cÑ\81Ñ\81а Ð° Ð½Ð¸Ñ\81йаÑ\80Ñ\86а Ð¸Ñ\81Ñ\82оÑ\80и йоцуш.
 Иза бохург ду, хьега хийцалур ю оцу агlон цlе оцу цlарца, хlинц цуьна хилла йолу, нагахь ахьа гlалатонца цlе хийцанехь, йолуш йолу агlо цахууш йа мега хьа.
 
 '''ДlАХЬЕДАР!'''
 Цlе хийцарца хила тарло барамашкахь а цамётту хийцам ''гlар йойлачу'' агlонашна.
 Дехар до, кхин дlа хьо вахале, дика ойла йе, хьо кхеташ хиларехь тlаьхьа хиндолучунах.",
+'movepagetext-noredirectfixer' => "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман журнал кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.
+
+Хьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажорагаш]] юй техь аьлла.
+
+Шу жоьпехь ду хьажорагаш нийса некъ гойтуш хиларан.
+
+Тидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хьийцаме истори яцахь а.
+
+И бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.
+
+'''ДӀАХЬЕДАР!'''
+
+ЦӀе хийцар бахьнехь гӀаръялла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
 'movepagetalktext' => "Тlе хlоьттина йолу дийцаре агlо ишта цlе хийцина хира ю, '''цхьа йолу ханчохь, маца:'''
 
 *Йаьсса йоцу дийцаре агlо йолуш ю оцу цlарца йа
@@ -1240,16 +1482,28 @@ PICT # тайп тайпан
 'movepagebtn' => 'Агlон цlе хийца',
 'pagemovedsub' => 'Агlон цlе хийцина',
 'movepage-moved' => "'''Агlон цlе «$1» хийцина хlокху «$2»'''",
+'movepage-moved-redirect' => 'Кхоьллина дӀасахьажориг.',
+'movepage-moved-noredirect' => 'ДӀасхьажориг кхоллар дохина.',
 'articleexists' => 'Хlарасанна цlе йолу агlо йолуш ю йа ахьа гойтуш йолу цlе магош яц.
 Дехар до, харжа кхин цlе.',
 'talkexists' => "'''Агlон цlе хийцина йара, амма дийцаре агlон цlе хийца цало, хlунда аьльча иза санна цlе йолу агlо йолуш ю. Дехар до, куьйга хlотта уьш.'''",
 'movedto' => 'цlе хийцина оцу',
 'movetalk' => 'Цуьнца йогlуш йолу дийцаре агlон цlе хийцар',
+'move-subpages' => 'ЦӀeрш хийцае бухара агӀонаши ($1 кхаччалц)',
+'move-talk-subpages' => 'ЦӀе хийца бухара агӀонаши а агӀонашан дийцаре а ($1  кхаччалц)',
+'movepage-page-moved' => 'АгӀона $1 цӀе хийцина оцу $2.',
 'movelogpage' => 'Цlераш хийцаран тептар',
+'movesubpage' => '{{PLURAL:$1|Бухара агӀо|Бухара агӀонаш}}',
+'movenosubpage' => 'ХӀокху агӀона бухара агӀонаш яц.',
 'movereason' => 'Бахьан:',
-'revertmove' => 'йухаяккха',
-'delete_and_move' => 'Цle а хуьйцуш дlадайá',
-'delete_and_move_confirm' => 'Хlаъ, дlайайъа хlара агlо',
+'revertmove' => 'юхаяккха',
+'delete_and_move' => 'Цle а хуьйцуш дӀаяккха',
+'delete_and_move_text' => '== ДӀаяккха хьокъ ю ==
+И цӀе йолу аг1о «[[:$1]]» йолуш ю. 
+Лаьий хьуна и дӀаяккха, цӀе хийца таро хилийта?',
+'delete_and_move_confirm' => 'Хlаъ, дӀаяккха хlара агlо',
+'delete_and_move_reason' => 'ДӀаяккхина цӀе хийца я таро хилийта  «[[$1]]»',
+'move-leave-redirect' => 'Ӏадйита дӀасахьажориг',
 'protectedpagemovewarning' => "'''Дlахьедар.''' Хlара агlо гlаролла йина йу; цlе хийца йа нисйа а бакъо йолуш адаманкуьйгалхой бе бац.
 Лахахьа тептаро балийна тlаьхьаралера дlаязбина хаам:",
 'semiprotectedpagemovewarning' => "'''Дlахьедо.''' Хlара агlо гlаролла йина йу; дlабазбиначу декъашхошка бе цlе хийцалуш яц.
@@ -1259,10 +1513,10 @@ PICT # тайп тайпан
 'export' => 'Яззамаш кхечу меттиган арадахар',
 'exporttext' => 'Шуьга далур ду кхечу меттера чудахарш, йоза а хийцаме тептарш билгалла йолу агlонаш йа гулдина йолу агlонаш хlокх XML барамца, йуха тlяхьа чура [[Special:Import|хьаэцалурдолш]] кхечу вики-хьалхен, болх беш йолу хlокху MediaWiki гlирсаца.
 
\9aÑ\85еÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82еÑ\80а Ñ\8fззамаÑ\88 Ñ\87Ñ\83йаÑ\85а, Ñ\87Ñ\83Ñ\8fзйе Ñ\86lе Ñ\80едокÑ\85Ñ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82е, Ñ\86\85Ñ\8cа Ð¼Ð¾Ð³lан Ñ\86lе Ð¼Ð¾Ð³lаÑ\80Ñ\88каÑ\85Ñ\8c, Ð¹Ñ\83Ñ\85а Ñ\85аÑ\80жа Ð»Ð°Ñ\8cи Ñ\88Ñ\83на Ð\9aÑ\85еÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82еÑ\80 Ñ\87Ñ\83йаÑ\85а Ð¼Ð°Ñ\81Ñ\81о Ñ\8fззамаÑ\88на Ð¸Ñ\81Ñ\82оÑ\80е хийцамбарш йа тlяхьаралера яззамна башхо.
\9aÑ\85еÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82еÑ\80а Ñ\8fззамаÑ\88 Ñ\87Ñ\83йаÑ\85а, Ñ\87Ñ\83Ñ\8fзйе Ñ\86lе Ñ\80едокÑ\85Ñ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82е, Ñ\86\85Ñ\8cа Ð¼Ð¾Ð³lан Ñ\86lе Ð¼Ð¾Ð³lаÑ\80Ñ\88каÑ\85Ñ\8c, Ð¹Ñ\83Ñ\85а Ñ\85аÑ\80жа Ð»Ð°Ñ\8cи Ñ\88Ñ\83на Ð\9aÑ\85еÑ\87Ñ\83 Ð¼ÐµÑ\82Ñ\82еÑ\80 Ñ\87Ñ\83йаÑ\85а Ð¼Ð°Ñ\81Ñ\81о Ñ\8fззамаÑ\88на Ð¸Ñ\81Ñ\82оÑ\80и хийцамбарш йа тlяхьаралера яззамна башхо.
 
 Шуьга кхи даландерг, лелаеш йолу меттиг къастаман машан хьажориг кхечу меттер чудаха тlяхьарлера башхон яззамаш. Массала оцу яззамна [[{{MediaWiki:Mainpage}}]] хlара хира йу хьажориг [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
-'export-templates' => 'Латадé куцкепаш',
+'export-templates' => 'Латадé кепаш',
 
 # Namespace 8 related
 'allmessages' => 'Гlирса хаамаш',
@@ -1284,8 +1538,8 @@ PICT # тайп тайпан
 # Special:Import
 'import' => 'Кхин яззам агlонаш чуяхар',
 'import-interwiki-source' => 'Вики-хьост/агlо:',
-'import-interwiki-templates' => 'Лата де массо куцкепаш',
-'import-upload-filename' => 'Ð¥lÑ\83ман Ñ\86lе:',
+'import-interwiki-templates' => 'Лата де массо кепаш',
+'import-upload-filename' => 'Файлан Ñ\86Ó\80е:',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Декъашхочуьна агlо',
@@ -1293,7 +1547,7 @@ PICT # тайп тайпан
 'tooltip-pt-preferences' => 'Хьан гlирс нисбар',
 'tooltip-pt-watchlist' => 'Ахьа тергам бо агlонаши хийцаман могlам',
 'tooltip-pt-mycontris' => 'Хьан нисдаран могlам',
-'tooltip-pt-login' => 'Хlокху гlирса чохь дlавазвала мега, амма иза тlедожош дац.',
+'tooltip-pt-login' => 'Хlокху гlирса чохь дlавазвала/яла мега, амма иза тlедожош дац.',
 'tooltip-pt-logout' => 'Дlадерзадо болх бар',
 'tooltip-ca-talk' => 'Дийцаре агlон чулацам',
 'tooltip-ca-edit' => 'Хlара агlо хийцалур ю. Лелайе, дехар до, хьалххьажар айхьа чутохале lалашан',
@@ -1302,7 +1556,7 @@ PICT # тайп тайпан
 'tooltip-ca-history' => 'Хlокху агlон хийцамаш болу тептар',
 'tooltip-ca-protect' => 'Гlаролла дé хlокху агlон хийцам цабайта',
 'tooltip-ca-unprotect' => 'Дlадаккха хlокху агlонна долу гаролла',
-'tooltip-ca-delete' => 'Дlайайá хlара агlо',
+'tooltip-ca-delete' => 'ДӀаяккха хӀара агӀо',
 'tooltip-ca-move' => 'Агlон цlе хийца',
 'tooltip-ca-watch' => 'Тlетоха хlара агlо сан тергаме могlам юкъа',
 'tooltip-ca-unwatch' => 'Дlайаккха хlара агlо хьай тергаме могlам юкъар',
@@ -1323,19 +1577,19 @@ PICT # тайп тайпан
 'tooltip-feed-atom' => 'Хьагайтар оцу Atom цани хlокху агlон',
 'tooltip-t-contributions' => 'Хlокху декъашхочо хийцина йолу агlонашан могlам',
 'tooltip-t-emailuser' => 'Дlабахьийта хаам оцу декъашхона',
-'tooltip-t-upload' => 'ЧÑ\83даÑ\85а Ñ\81Ñ\83Ñ\8cÑ\80Ñ\82аÑ\88 Ð¹Ð° Ñ\88агойÑ\82Ñ\83Ñ\88 Ð¹Ð¾Ð»Ñ\83 Ñ\85\83мнаш',
+'tooltip-t-upload' => 'ЧÑ\83йаÑ\85а Ñ\84айлаш',
 'tooltip-t-specialpages' => 'Белха агlонаши могlам',
 'tooltip-t-print' => 'Хlокху агlонна зорба туху башхо',
 'tooltip-t-permalink' => 'Даимна йолу хьажориг хlокху башха агlонна',
 'tooltip-ca-nstab-main' => 'Яззамна чулацам',
 'tooltip-ca-nstab-user' => 'Хlора декъашхон долахь йолу агlо',
-'tooltip-ca-nstab-media' => 'Ð\9cедиа-Ñ\85\83м',
+'tooltip-ca-nstab-media' => 'Ð\9cедиа-Ñ\84айл',
 'tooltip-ca-nstab-special' => 'Хlара белха агlо йу, хlара рéдаккхалуш яц',
 'tooltip-ca-nstab-project' => 'Кхолламан дакъа',
 'tooltip-ca-nstab-image' => 'Хlуман агlо',
 'tooltip-ca-nstab-mediawiki' => 'Хааман агlо MediaWiki',
 'tooltip-ca-nstab-template' => 'Куцкепа агlо',
-'tooltip-ca-nstab-category' => 'Кадегарши агlо',
+'tooltip-ca-nstab-category' => 'Категореши агӀо',
 'tooltip-minoredit' => 'Къастам бé хlокху хийцамна кlеззиг боуш санна',
 'tooltip-save' => 'Хьан хийцамаш lалашбой',
 'tooltip-preview' => 'Дехар до, агlо lалаш йарал хьалха хьажа муха йу яз!',
@@ -1349,7 +1603,6 @@ PICT # тайп тайпан
 'common.css' => '/** Чуйиллина йолу кхузе CSS хир йу лелош масхьа кечйечу чохь */',
 'monobook.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош масхьа Monobook чохь */',
 'print.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош масхьа зорба тухучуче чохь */',
-'handheld.css' => '/* Чуйиллина йолу кхузе CSS хир йу лелош масхьа койнаш чохь, дукхах ерг хатl нисдеш оцу $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Чуйиллина йолу кхузе JavaScript ишар гучу ерайу массо декъашхошна оцара схьаелларца хlора агlо */',
@@ -1364,19 +1617,25 @@ PICT # тайп тайпан
 # Spam protection
 'spamprotectiontitle' => 'Совбиларна литтар',
 
-# Skin names
-'skinname-standard' => 'Лела ма ярра',
+# Info page
+'pageinfo-language' => 'АгӀона мотт',
+'pageinfo-toolboxlink' => 'Агlонах болу бовзам',
 
 # Browsing diffs
 'previousdiff' => '← Хьалхдоьда нисдинарг',
 'nextdiff' => 'Тlяхьа догlа нисдинарг →',
 
 # Media information
+'imagemaxsize' => "Суьртан бараман доза тохар:<br />''(Файла агӀона куц дийцар)''",
+'thumbsize' => 'Жима дина суьртан барам:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|агlо|агlонаш|агlонаш}}',
-'file-info-size' => '$1 × $2 сиртакх, хlуман барам: $3, MIME-тайп: $4',
+'file-info-size' => '$1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}, файлан барам: $3, MIME-тайп: $4',
 'file-nohires' => 'Кхи йоккха гlоле башхо яц.',
-'svg-long-desc' => 'SVG-Ñ\85\83ма, Ñ\85lоÑ\82Ñ\82амÑ\86а $1 Ã\97 $2 Ñ\86инÑ\82аÑ\88, Ñ\85\83ман барам: $3',
+'svg-long-desc' => 'SVG-Ñ\84айл, Ð»Ð°Ñ\80Ñ\82Ó\80аÑ\85Ñ\8c Ñ\8e $1 Ã\97 $2 {{PLURAL:$2|пикÑ\81елÑ\8c|пикÑ\81елÑ\88|пикÑ\81елÑ\88}}, Ñ\84айлан барам: $3',
 'show-big-image' => 'Сурт цlанал лаккхара бакъонца',
+'show-big-image-preview' => 'Барам хьажале: $1.',
+'show-big-image-other' => '{{PLURAL:$2|Кхин шоралла|Кхин шоралла}}: $1.',
+'show-big-image-size' => '$1 × $2 пикселш',
 
 # Special:NewFiles
 'newimages' => 'Керлачу хlумни галеларе',
@@ -1395,7 +1654,7 @@ PICT # тайп тайпан
 
 # Metadata
 'metadata' => 'Метахаамаш',
-'metadata-help' => 'Хlокху хlуманца кхин тlе хаам бу, даиман чуйоккхуш йолу терахьца чоьнашца йа тlейоккхучуьнца. Нагахь хlуман тlаьхьа хийцам биняхь, тlаккха цlхьаболу барам цlхьаьна ца ба мега хlинцлера суртаца.',
+'metadata-help' => 'ХӀокху файлаца кхин тӀе хаам бу, даиман чуйоккхуш йолу терахьца чоьнашца йа тӀейоккхучуьнца. Нагахь файлан тӀаьхьа хийцам биняхь, тӀаккха цӀхьаболу барам цӀхьаьна ца ба мега хӀинцалера суьртаца.',
 'metadata-expand' => 'Гайта кхин тlе болу хаам',
 'metadata-collapse' => 'Къайла баккха кхин тlе болу хаам',
 'metadata-fields' => 'Метахааман майда, хьахийна йолу хlокху могlамца, lад-йитича гойтур ю суьрти агlонца, йисинарш хира ю къайлаха.
@@ -1413,9 +1672,10 @@ PICT # тайп тайпан
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-datetime' => 'Хlума хийцина терахь а хан',
 'exif-datetimeoriginal' => 'Дуьххьарлера терахь а хан',
+'exif-languagecode' => 'Мотт',
 
 'exif-scenetype-1' => 'Сурт даьккхина нис дуьххьал',
 
@@ -1446,11 +1706,13 @@ PICT # тайп тайпан
 'table_pager_first' => 'Дуьххьаралера агlо',
 'table_pager_last' => 'Тlаьххьаралера агlо',
 'table_pager_limit' => 'Гайта $1 хlумнаш агlон тlаьхь',
+'table_pager_limit_label' => 'АгӀона чохь гойтуш ю оццул:',
 'table_pager_limit_submit' => 'Кхочушдé',
 'table_pager_empty' => 'Цакарийна',
 
 # Auto-summaries
 'autosumm-blank' => 'Агlон чулацам дlабайина',
+'autosumm-replace' => 'АгӀона чуьраниг хийцина оцу «$1»',
 'autosumm-new' => 'Керла агlо: «$1»',
 
 # Live preview
@@ -1465,17 +1727,17 @@ PICT # тайп тайпан
 'watchlisttools-edit' => 'Хьажа/нисбé могlам',
 'watchlisttools-raw' => 'Йоза санна нисдé',
 
-# Special:Version
-'version' => 'Варси MediaWiki',
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])',
 
-# Special:FilePath
-'filepath' => 'ХIуман тIе болу некъ',
-'filepath-page' => 'Хlум:',
-'filepath-submit' => 'Дехьавала',
+# Special:Version
+'version' => 'Верси MediaWiki',
+'version-other' => 'Кхин',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Лаха цхьатера йолу хIумнаш',
 'fileduplicatesearch-submit' => 'Лаха',
+'fileduplicatesearch-info' => '$1 × $2 {{PLURAL:$2|пиксель|пикселш|пикселш}}<br />Файлан барам: $3<br />MIME-тайп: $4',
 
 # Special:SpecialPages
 'specialpages' => 'Леррина агlонаш',
@@ -1484,7 +1746,7 @@ PICT # тайп тайпан
 * <strong class="mw-specialpagerestricted">Кlеззиг таронаш йолу леррина агlонаш.</strong>',
 'specialpages-group-maintenance' => 'Жамlаш гlирса хьашташ кхочушдар',
 'specialpages-group-other' => 'Кхин гlуллакхан агlонаш',
-'specialpages-group-login' => 'Хьой вовзийта / Дlавазло',
+'specialpages-group-login' => 'Хьой вовзийта/йовзийта / дӀавазло/дӀаязло',
 'specialpages-group-changes' => 'Керла нисдарш а тéптарш',
 'specialpages-group-media' => 'Жамlаш оцу медиа-гlирсашан а чуяхарш',
 'specialpages-group-users' => 'Декъашхой а бакъонаш',
@@ -1514,4 +1776,20 @@ PICT # тайп тайпан
 'dberr-usegoogle' => 'Цlачун хьо хьажа лаха гlонца Google.',
 'dberr-outofdate' => 'Хьуна хаалахь, цуьна йолу меттиг хила мега тишйелла черахь.',
 
+# HTML forms
+'htmlform-selectorother-other' => 'Кхин',
+
+# New logging system
+'logentry-delete-delete' => '$1 {{GENDER:$2|дӀаякхина|дӀаякхина}} агӀо $3',
+'logentry-delete-restore' => '$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-move-move_redir-noredirect' => '$1 {{GENDER:$2|цӀе хийцина|цӀе хийцина}} $3 оцу $4 дӀасахьажоран тӀохул а дӀасахьажийнарг цаюьтуш а',
+'logentry-newusers-newusers' => '{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1',
+'logentry-newusers-create' => '{{GENDER:$2|ДӀавазвелла|ДӀаязелла}} керла декъашхо $1',
+
+# Search suggestions
+'searchsuggest-search' => 'Лаха',
+
 );
index b01dfc1..a217035 100644 (file)
@@ -97,8 +97,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang gidaghanon sa mga gumagamit nga nagbantay usab',
 'tog-oldsig' => 'Paunang tan-aw sa eksisting nga pirma:',
 'tog-fancysig' => 'Hilaw nga pirma (walay awtomatikong sumpay)',
-'tog-externaleditor' => 'Gamita ang eksternal nga editor isip default (para sa mga eksperto lamang, kinahanglan og espesyal nga setting sa imong kompyuter)',
-'tog-externaldiff' => 'Gamita ang eksternal nga diff isip default (para sa mga eksperto lamang, kinahanglan og espesyal nga setting sa imong kompyuter)',
 'tog-showjumplinks' => 'I-enable ang "ambak sa" nga sumpay sa aksesibilidad',
 'tog-uselivepreview' => 'Gamita ang live nga paunang tan-aw (JavaScript kinahanglan) (Eksperimental)',
 'tog-forceeditsummary' => 'Pahibaloi ako kon blangko ang mubong sugid alang sa pag-usab',
@@ -737,14 +735,6 @@ Sulayi'g prefix ang imong gipangita gamit ang ''all:'' alang mangita sa tanang s
 Puyde ka mangita gamit ang Google sa kasamtangan.
 Hinumdomi nga ang ilang indeks sa sulod sa {{SITENAME}} mahimong dugay-dugay na.',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Naka-fix sa wala',
-'qbsettings-fixedright' => 'Naka-fix sa tuo',
-'qbsettings-floatingleft' => 'Floating sa wala',
-'qbsettings-floatingright' => 'Floating sa tuo',
-
 # Preferences page
 'preferences' => 'Mga preperensiya',
 'mypreferences' => 'Akong preperensiya',
@@ -978,7 +968,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:ListGroupRights
 'listgrouprights-members' => '(talaan sa mga miyembro)',
 
-# E-mail user
+# Email user
 'emailuser' => 'I-email kaning gumagamit',
 
 # Watchlist
index d461fa8..0305638 100644 (file)
@@ -657,13 +657,6 @@ Fanapunta na para u na'nuebu i kolumna anggen un usa i inachetton nabegasion.",
 Siña hao manaligao gi Google gi entretanto.
 Fanapunta na fana'an ti gus nuebu i listan-ñiha i guinahan {{SITENAME}}.",
 
-# Quickbar
-'qbsettings-none' => "Tåya'",
-'qbsettings-fixedleft' => 'Maplanta gi akague',
-'qbsettings-fixedright' => "Maplanta gi agapa'",
-'qbsettings-floatingleft' => "Mamå'ya gi akague",
-'qbsettings-floatingright' => "Mamå'ya gi agapa'",
-
 # Preferences page
 'preferences' => "I ga'ña-mu",
 'mypreferences' => "I ga'ña-hu",
@@ -875,7 +868,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:LinkSearch
 'linksearch-ok' => 'Aligao',
 
-# E-mail user
+# Email user
 'emailuser' => "Na'e-mail i muna'sesetbi este",
 
 # Watchlist
index dad9157..45accad 100644 (file)
@@ -150,11 +150,11 @@ $messages = array(
 'tog-underline' => 'ھێڵ ھێنان بەژێر بەستەرەکان:',
 'tog-justify' => 'پەرەگرافەکان پڕاوپر نیشان بدە',
 'tog-hideminor' => 'دەستکارییە بچووکەکان لە دوایین گۆڕانکارییەکاندا بشارەوە',
-'tog-hidepatrolled' => 'Ù\84Û\95 Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\95کاÙ\86Ø\8c Ø¯Û\95ستکارÛ\8cÛ\95 Ù¾Ø§Ø±Û\8eزراÙ\88Û\95کاÙ\86 Ø¯Ø§Ø´Ø§Ø±ە',
-'tog-newpageshidepatrolled' => 'Ù\84Û\95 Ù\84Û\8cستÛ\8c Ù\84اپÛ\95Ú\95Û\95 Ù\86Ù\88Û\8eکاÙ\86Ø\8c Ù\84اپÛ\95Ú\95Û\95 Ù¾Ø§Ø±Û\8eزراÙ\88Û\95کاÙ\86 Ø¯Ø§Ø´Ø§Ø±ە',
+'tog-hidepatrolled' => 'Ù\84Û\95 Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86دا Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95 Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88Û\95کاÙ\86 Ø¨Ø´Ø§Ø±Û\95Ù\88ە',
+'tog-newpageshidepatrolled' => 'Ù\84Û\95 Ù¾Û\8eرستÛ\8c Ù¾Û\95Ú\95Û\95 Ù\86Ù\88Û\8eکاÙ\86دا Ù¾Û\95Ú\95Û\95 Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88Û\95کاÙ\86 Ø¨Ø´Ø§Ø±Û\95Ù\88ە',
 'tog-extendwatchlist' => 'لیستی چاودێری درێژبکەرەوە بۆ نیشان دانی ھەموو گۆڕانکارییەکان، نەک تەنھا دوایینەکان.',
 'tog-usenewrc' => 'گۆڕانکارییەکان لە دوایین گۆڕانکارییەکان و لیستی چاودێریدا بە پێی پەڕە پۆلێن بکە (پێویستی بە جاڤاسکریپتە)',
-'tog-numberheadings' => 'Ú\98Ù\85ارÛ\95کردÙ\86Û\8c Ø®Û\86کاری سەردێڕەکان',
+'tog-numberheadings' => 'Ú\98Ù\85ارÛ\95کردÙ\86Û\8c Ø®Û\86Ú¯Û\95Ú\95ی سەردێڕەکان',
 'tog-showtoolbar' => 'شریتی ئامرازەکانی دەستکاری نیشان بدە (JavaScript پێویستە)',
 'tog-editondblclick' => 'دەستکاریی پەڕە بە دووکلیک لەسەر دەق (JavaScript پێویستە)',
 'tog-editsection' => 'ڕێگە بدە بۆ دەستکاری کردنی بەشەکان لە ڕێگەی بەستەرەکانی [دەستکاری]',
@@ -169,29 +169,28 @@ $messages = array(
 'tog-previewontop' => 'پێشبینین بەرلە چوارچێوەی دەستکاری نیشان بدە‌',
 'tog-previewonfirst' => 'لە یەکەم دەستکاری دا پێشبینین نیشان بدە',
 'tog-nocache' => 'کاشکردنی پەڕەکانی وێبگەڕەکە لەکاربخە',
-'tog-enotifwatchlistpages' => 'ئÛ\8cÙ\85Û\95Û\8cÙ\84Ù\85 Ø¨Û\86 Ø¨Ù\86Û\8eرÛ\95 Ú©Ø§ØªÛ\8eÚ© Ù¾Û\95Ú\95Û\95Û\8cÛ\95Ú© Û\8cاÙ\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95Ú© Ù\84Û\95 Ù\84Û\8cستÛ\8c Ú\86اÙ\88دÛ\8eÚ\95Û\8cÛ\8cÛ\95کاÙ\86Ù\85دا Ú¯Û\86Ú\95درا',
-'tog-enotifusertalkpages' => 'ئÛ\95Ú¯Û\95ر Ù¾Û\95Ú\95Û\95Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98ەکەم گۆڕدرا ئیمەیلم بۆ بنێرە',
+'tog-enotifwatchlistpages' => 'ئÛ\95Ú¯Û\95ر Ù¾Û\95Ú\95Û\95 Û\8cاÙ\86 Ù¾Û\95Ú\95Ú¯Û\95Û\8cÛ\95Ú© Ù\84Û\95 Ù¾Û\8eرستÛ\8c Ú\86اÙ\88دÛ\8eÛ\8cÛ\8cÛ\8cÛ\95کاÙ\86Ù\85دا Ú¯Û\86Ú\95درا Ø¦Û\8cÙ\85Û\95Û\8cÙ\84Ù\85 Ø¨Û\86 Ø¨Ù\86Û\8eرÛ\95',
+'tog-enotifusertalkpages' => 'ئÛ\95Ú¯Û\95ر Ù¾Û\95Ú\95Û\95Û\8c Ù\84Û\8eدÙ\88اÙ\86ەکەم گۆڕدرا ئیمەیلم بۆ بنێرە',
 'tog-enotifminoredits' => 'بۆ گۆڕانکارییە بچووکەکانی پەڕەکان و پەڕگەکانیش ئیمەیلم بۆ بنێرە',
 'tog-enotifrevealaddr' => 'ئەدرەسی ئیمەیلەکەم لە ئیمەیلە ئاگاداریدەرەکان دا نیشان بدە',
 'tog-shownumberswatching' => 'ژمارەی بەکارھێنەرە چاودێڕەکان نیشان بدە',
 'tog-oldsig' => 'واژووی ئێستا:',
 'tog-fancysig' => 'وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)',
-'tog-externaleditor' => 'دەستکاریکەری دەرەکی بەکاربێنە لە حاڵەتی دیفاڵتدا (تەنھا بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە لە سەر کۆمپیوتەرەکەت [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
-'tog-externaldiff' => 'لە پرۆگرامێکی دەرەکی بۆ بینینی جیاوازیەکان کەڵک وەرگرە لە دیفاڵتدا (تەنها بۆ شارەزایان، ڕێکخستنی تایبەتی پێویستە لە سەر کۆمپیوتەرەکەت. [//www.mediawiki.org/wiki/Manual:External_editors زانیاریی زۆرتر.])',
 'tog-showjumplinks' => 'ڕێگە بدە بۆ بەستەرەکانی «{{int:jumpto}}»',
 'tog-uselivepreview' => 'لە پێشبینینی زیندوو کەڵک وەرگرە (جاڤاسکریپت پێویستە) (تاقیکاری‌)',
-'tog-forceeditsummary' => 'ئەگەر پوختەی دەستکاریم نەنووسی پێم بڵێ',
-'tog-watchlisthideown' => 'دÛ\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86Ù\85 Ø¨Ø´Ø§Ø±Û\95Ù\88Û\95 Ù\84Û\95 Ù\84Û\8cستی چاودێری',
+'tog-forceeditsummary' => 'ئەگەر کورتەی دەستکاریم نەنووسی پێم بڵێ',
+'tog-watchlisthideown' => 'دÛ\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86Ù\85 Ø¨Ø´Ø§Ø±Û\95Ù\88Û\95 Ù\84Û\95 Ù¾Û\8eرستی چاودێری',
 'tog-watchlisthidebots' => 'دەستکارییەکانی بات بشارەوە لە لیستی چاودێری',
 'tog-watchlisthideminor' => 'دەستکارییە بچووکەکان لە لیستی چاودێریدا بشارەوە',
 'tog-watchlisthideliu' => 'دەستکارییەکانی ئەو بەکارهێنەرانەی لە ژوورەوەن بشارەوە لە لیستی چاودێری',
 'tog-watchlisthideanons' => 'دەستکارییەکانی بەکارهێنەرانی نەناسراو بشارەوە لە لیستی چاودێری',
-'tog-watchlisthidepatrolled' => 'Ù\84Û\95 Ù\84Û\8cستÛ\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\95کاÙ\86Ø\8c Ø¯Û\95ستکارÛ\8cÛ\95 Ù¾Ø§Ø±Û\8eزراÙ\88Û\95کاÙ\86 Ø¯Ø§Ø´Ø§Ø±ە',
-'tog-ccmeonemails' => 'کۆپییەکانی ئەو ئیمەیلانە کە بۆ بەکارھێنەرانی ترم ناردووە بۆ خۆشم بنێرە',
-'tog-diffonly' => 'ناوەڕۆکی پەڕە لەژێر جیاوازییەکان نیشان مەدە',
-'tog-showhiddencats' => 'ھاوپۆلە شاراوەکان نیشان بدە',
+'tog-watchlisthidepatrolled' => 'Ù\84Û\95 Ù¾Û\8eرستÛ\8c Ú\86اÙ\88دÛ\8eرÛ\8cÛ\8cÛ\95کاÙ\86دا Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95 Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88Û\95کاÙ\86 Ø¨Ø´Ø§Ø±Û\95Ù\88ە',
+'tog-ccmeonemails' => 'کۆپییەک لەو ئیمەیلانە کە بۆ بەکارھێنەرانی تر دەنێرم بۆ خۆشم بنێرە',
+'tog-diffonly' => 'ناوەرۆکی پەڕە لە ژێرەوەی جیاوازییەکاندا نیشان مەدە',
+'tog-showhiddencats' => 'پۆلە شاردراوەکان نیشان بدە',
 'tog-noconvertlink' => 'لەکارخستنی ئاڵوگۆڕی سەرناوی بەستەر',
 'tog-norollbackdiff' => 'لە دوای گەڕاندنەوە جیاوازی نیشان مەدە',
+'tog-useeditwarning' => 'ھۆشیارم بکەوە کاتێک لە پەڕەیەکی دەستکاری بە گۆڕانکاریی پاشەکەوت‌نەکراو دەردەچم',
 
 'underline-always' => 'ھەمیشە',
 'underline-never' => 'قەت',
@@ -263,7 +262,7 @@ $messages = array(
 'category-media-header' => 'میدیای پۆلی «$1»',
 'category-empty' => "''ئەم پۆلە ھەنووکە ھیچ پەڕە یان پەڕگەیەک لە خۆ ناگرێت.‌''",
 'hidden-categories' => '{{PLURAL:$1|پۆلی شاراوە|پۆلی شاراوە}}',
-'hidden-category-category' => 'پۆلە شاراوەکان',
+'hidden-category-category' => 'Ù¾Û\86Ù\84Û\95 Ø´Ø§Ø±Ø¯Ø±Ø§Ù\88Û\95کاÙ\86',
 'category-subcat-count' => '{{PLURAL:$2|ئەم پۆلە تەنھا ژێرپۆلی خوارەوەی تێدایە.| ئەم پۆلە ئەم {{PLURAL:$1|ژێرپۆلەی|$1 ژێرپۆلانەی}} خوارەوەی تێدایە، لە کۆی سەرجەم $2 دانە.}}',
 'category-subcat-count-limited' => 'ئەم هاوپۆلە {{PLURAL:$1|ژێرهاوپۆلی}} لەخۆ گرتووە.',
 'category-article-count' => '{{PLURAL:$2|ئەم پۆلە تەنھا ئەم پەڕەی لەخۆگرتووە.|{{PLURAL:$1|پەڕە|$1 پەڕە}} لەم پۆلەدا، لە سەرجەم $2 پەڕە.}}',
@@ -363,7 +362,7 @@ $messages = array(
 'categorypage' => 'په‌ڕه‌ی هاوپۆل نیشانبده‌',
 'viewtalkpage' => 'بینینی لێدوان',
 'otherlanguages' => 'بە زمانەکانی تر',
-'redirectedfrom' => '(ڕەوانەکراوە لە $1 ەوە)',
+'redirectedfrom' => '(ڕەوانەکراوە لە $1ەوە)',
 'redirectpagesub' => 'پەڕەی ڕەوانەکردن',
 'lastmodifiedat' => 'ئەم پەڕەیە دواجار لە $2ی $1 نوێ کراوەتەوە.',
 'viewcount' => 'ئەم پەڕەیە {{PLURAL:$1|یەکجار|$1 جار}} بینراوە.',
@@ -665,7 +664,6 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'دووبارە ڕێکخستنەوەی تێپەڕوشە',
-'passwordreset-text' => 'ئەم فۆرمە پڕ بکەوە بۆ گرتنی ئیمەیلێکی بیرخەرەوەی وردەکارییەکانی ھەژمارەکەت.',
 'passwordreset-legend' => 'دووبارە ڕێکخستنەوەی تێپەڕوشە',
 'passwordreset-username' => 'ناوی بەکارھێنەری:',
 'passwordreset-domain' => 'پاوان:',
@@ -906,10 +904,11 @@ $2
 لەوە دەچی سڕدرابێتەوه.‌',
 'edit-conflict' => 'کێشەی دەستکاری.',
 'edit-no-change' => 'دەستکاریەکەت بەرچاو نەخرا، لەبەر ئەوەی هیچ گۆڕانکارییەکت لەسەر دەقەکە نەکردووە.',
-'edit-already-exists' => 'توانای درووست‌کردنی لاپەڕەی نوێ نیە.<br />
-ئÛ\95Ù\88Û\95 Ù\84Û\95Ù¾Û\8eØ´â\80\8cدا Ù\87Û\95بÙ\88Ù\88.',
+'edit-already-exists' => 'تواناییی دروستکردنی پەڕەی نوێ نییە.
+ئÛ\95Ù\85Û\95 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù¾Û\8eشتر Ù\87Û\95بÙ\88Ù\88Û\95.',
 'defaultmessagetext' => 'دەقی پەیامی هەمیشەیی',
 'invalid-content-data' => 'دراوەی ناوەرۆکی نادروست',
+'editwarning-warning' => 'بەجێ‌هێشتنی ئەم لاپەڕەیە دەبێتە هۆی لە‌دەست چوونی هەموو ئەو گۆڕانکاریانەی کردووتە.',
 
 # Content models
 'content-model-wikitext' => 'ویکیدەق',
@@ -975,7 +974,7 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 بۆ لاپەڕەی وەک ئەوە هەوڵی [[Special:Search|گەڕان لەسەر ویکی]] بدە.',
 
 # Revision deletion
-'rev-deleted-comment' => '(پوختەی دەستکاری سڕایەوە)',
+'rev-deleted-comment' => '(کورتەی دەستکاری سڕایەوە)',
 'rev-deleted-user' => '(ناوی بەکارهێنەر سڕایەوە)',
 'rev-deleted-event' => '(لۆگی کردەوە سڕایەوە)',
 'rev-deleted-text-permission' => "ئەم پێداچوونەوەیە لەم پەڕەیە '''سڕدراوەتەوە'''.
@@ -1003,7 +1002,7 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 ئێستا دەتوانی بیبینی؛ وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.",
 'rev-suppressed-diff-view' => "یەکێک لە پێداچوونەوەکانی ئەم جیاوازییە '''بەرگری لێ‌کراوە'''.
 ئێستا دەتوانی بیبینی؛ وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری]دا دەست دەکەوێت.",
-'rev-delundel' => 'نیشانبدە/بشارەوە',
+'rev-delundel' => 'نیشان بدە/بشارەوە',
 'rev-showdeleted' => 'نیشان بدە',
 'revisiondelete' => 'سڕینەوە/ھێنانەوەی پێداچوونەوەکان',
 'revdelete-nooldid-title' => 'مەبەستی پێداچوونەوەی نادیار',
@@ -1101,7 +1100,7 @@ $1",
 'mergehistory-reason' => 'هۆکار:',
 
 # Merge log
-'mergelog' => 'لۆگی یەککردن',
+'mergelog' => 'لۆگی کردنەیەک',
 'pagemerge-logentry' => '[[$1]] خرایە سەر [[$2]] (پێداچوونەوەکان تا $3)',
 'revertmerge' => 'لەیەک جیاکردنەوە',
 'mergelogpagetext' => 'لە خوارەوە دوایین مێژووی‌لاپەڕە خستنە سەر لاپەڕەیەکی‌تر، دەبینی.',
@@ -1160,7 +1159,7 @@ $1",
 'search-interwiki-more' => '(زیاتر)',
 'search-relatedarticle' => 'پەیوەست',
 'mwsuggest-disable' => 'پێشنیارەکانی گەڕان ناچالاک بکە',
-'searcheverything-enable' => 'لە ھەموو بۆشایی‌‌ناوەکان دا بگەڕێ',
+'searcheverything-enable' => 'لە ھەموو بۆشاییی ناوەکاندا بگەڕێ',
 'searchrelated' => 'پەیوەست',
 'searchall' => 'ھەموو',
 'showingresults' => "لە خوارەوە {{PLURAL:$1|'''یەک''' ئەنجام|'''$1''' ئەنجام}} نیشان دراوە، بە دەست پێ کردن لە ژمارەی '''$2'''ەوە.",
@@ -1182,14 +1181,6 @@ $1",
 دەتوانی بۆ ئێستا لە گەڕانی گووگڵ کەڵک وەرگری.
 لەیادت بێت لەوانەیە پێرستەکانیان بۆ گەڕانی ناو {{SITENAME}}، کات‌بەسەرچوو بێت.',
 
-# Quickbar
-'qbsettings' => 'خێرا-تووڵ',
-'qbsettings-none' => 'هیچ',
-'qbsettings-fixedleft' => 'چەپ‌ سەپێندراو',
-'qbsettings-fixedright' => 'ڕاست سەپێندراو',
-'qbsettings-floatingleft' => 'سەراوی چەپ',
-'qbsettings-floatingright' => 'سەراوی ڕاست',
-
 # Preferences page
 'preferences' => 'ھەڵبەژاردەکان',
 'mypreferences' => 'ھەڵبژاردەکان',
@@ -1257,7 +1248,7 @@ $1",
 'allowemail' => 'ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن',
 'prefs-searchoptions' => 'گەڕان',
 'prefs-namespaces' => 'بۆشایی‌ناوەکان',
-'defaultns' => 'ئÛ\95Ú¯Û\95رÙ\86ا Ù\84Û\95Ù\85 Ø¨Û\86شاÛ\8cÛ\8câ\80\8cناوانەدا بگەڕێ:',
+'defaultns' => 'دÛ\95Ù\86ا Ù\84Û\95Ù\85 Ø¨Û\86شاÛ\8cÛ\8cÛ\8c ناوانەدا بگەڕێ:',
 'default' => 'بنچینەیی',
 'prefs-files' => 'پەڕگەکان',
 'prefs-custom-css' => 'CSSی دڵخواز',
@@ -1278,8 +1269,8 @@ $1",
 'yournick' => 'واژووی نوێ:',
 'prefs-help-signature' => 'بۆچوونەکان لە لاپەڕەکانی وتووێژدا دەبێ بە "<nowiki>~~~~</nowiki>" دیاری بکرێن، کە دواتر خۆکار دەگۆڕێ بە واژۆکەت و مۆری کاتی.',
 'badsig' => 'ئیمزاكه‌ هه‌ڵه‌یه‌، ته‌ماشای كۆدی HTML بكه‌‌',
-'badsiglength' => 'واژۆکەت زۆر درێژە.
-واژۆ نابێ لە $1 {{PLURAL:$1|نووسە|نووسە}} درێژتر بێت.',
+'badsiglength' => 'واژووەکەت زۆر درێژە.
+واژوو نابێ لە $1 {{PLURAL:$1|نووسە}} درێژتر بێت.',
 'yourgender' => 'زایەند:',
 'gender-unknown' => 'ئاشکرا نەکراو',
 'gender-male' => 'پیاو',
@@ -1294,7 +1285,7 @@ $1",
 'prefs-help-email-required' => 'ناونیشانی ئیمەیل پێویستە.',
 'prefs-info' => 'زانیاریی سەرەتایی',
 'prefs-i18n' => 'نێونەتەویی کردن',
-'prefs-signature' => 'واژۆ',
+'prefs-signature' => 'واژوو',
 'prefs-dateformat' => 'ڕازاندنەوەی ڕێکەوت',
 'prefs-timeoffset' => 'قەرەبووکەری کات',
 'prefs-advancedediting' => 'ھەڵبژاردەکانی پێشکەوتوو',
@@ -1320,10 +1311,11 @@ $1",
 'userrights-editusergroup' => 'دەستکاریی گرووپەکانی بەکارهێنەر',
 'saveusergroups' => 'گرووپەکانی بەکارھێنەر پاشەکەوت بکە',
 'userrights-groupsmember' => 'ئەندامە لە:',
-'userrights-groups-help' => 'دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە بگۆڕیت:
-* چوارچێوەی نیشان‌کراو مانای ئەوەیە لەو گرووپەدا هەیە.
-* چوارچێوەی نیشان‌نەکراو مانای ئەوەیە لەو گرووپەدا نیە.
-* A * پێت‌دەڵێ ناتوانی ئەو گرووپی جارێکی دی زیادت کردووە لای‌بەری.',
+'userrights-groupsmember-auto' => 'ئەندامی ناڕاشکاوە لە:',
+'userrights-groups-help' => 'دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە ئاڵوگۆڕ بکەی:
+* چوارچێوەی نیشان‌کراو یانی بەکارھێنەر لەو گرووپەدا هەیە.
+* چوارچێوەی نیشان‌نەکراو یانی بەکارھێنەر لەو گرووپەدا نییە.
+* ئەستێرەیەک (*) نیشان دەدا ناتوانی ئەو گرووپەی جارێکی تر زیادت کردووە لای‌بەری، و بە پێچەوانە.',
 'userrights-reason' => 'هۆکار:',
 'userrights-no-interwiki' => 'دەسەڵاتی گۆڕینی مافەکانی بەکارهێنەر لە ویکی‌یەکانی دیکەت نیە.',
 'userrights-nodatabase' => 'بنکەدراوی $1 بوونی نیە یا لەم شوێنە نیە.',
@@ -1386,7 +1378,7 @@ $1",
 'right-browsearchive' => 'گەڕانی پەڕە سڕاوەکان',
 'right-undelete' => 'هاوەردنەوەی لاپەڕەیەک',
 'right-suppressrevision' => 'چاوپێداخشان و هاردنوەی ئەو لاپەڕانەی لە بەڕێوبەران داشاردرابوو.',
-'right-suppressionlog' => 'دیتنی لۆگە ئەهلیەکان',
+'right-suppressionlog' => 'دیتنی لۆگە نھێنییەکان',
 'right-block' => 'بەربەستنی بەکارھێنەرانی تر لە دەستکاری کردن',
 'right-blockemail' => 'بەرگری بەکارهێنەرێک بکە لە ناردنی ئیمەیل',
 'right-hideuser' => 'بەربەست‌کردنی ناوێکی بەکارهێنەری، داشاردنی لە بەرچاوی هەموان',
@@ -1402,17 +1394,17 @@ $1",
 'right-markbotedits' => 'نیشان‌کردنی دەستکاریە گەڕێنراوەکان وەک دەستکاریەکانی بۆت (bot)',
 'right-noratelimit' => 'کاریگەری وەرنەگرتن لە سنوورەکانی ئاست',
 'right-import' => 'هێنانەناوەی لاپەڕە لە ویکی‌یەکانی دیکە',
-'right-importupload' => 'هێنانەناوەی لاپەڕە لە پەڕگەیەکی بارکراو',
-'right-patrol' => 'Ù\84Û\95Ú\98Û\8eرÚ\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\8cشاÙ\86â\80\8cکردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95ساÙ\86Û\8câ\80\8cتر',
-'right-autopatrol' => 'Ø®Û\86کار Ù\84Û\95Ú\98Û\8eرÚ\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\8cشاÙ\86â\80\8cکردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95سÛ\8eÚ© Ø¨Û\86Ø®Û\86Û\8c',
-'right-patrolmarks' => 'دیتنی دوایین دەستکاریەکان وا لەژێرچاودێری نیشان‌کراون',
-'right-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù\84Û\8cستÛ\8eÚ© Ù\84Û\95Ù\88 Ù\84اپÛ\95Ú\95اÙ\86Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8c Ù\86اکرÛ\8eن',
-'right-mergehistory' => 'سەریەک‌خستنی میژووی لاپەڕەکان',
+'right-importupload' => 'ھاوردنی پەڕەکان لە پەڕگەیەکی بارکراو',
+'right-patrol' => 'Ù\86Û\8cشاÙ\86کردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95ساÙ\86Û\8c ØªØ± Ù\88Û\95Ú© Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88',
+'right-autopatrol' => 'دÛ\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95سÛ\8eÚ© Ø¨Û\95 Ø´Û\8eÙ\88Û\95Û\8c Ø®Û\86Ú¯Û\95Ú\95 Ù\88Û\95Ú© Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88 Ù\86Û\8cشاÙ\86 Ø¨Ú©Ø±Û\8e',
+'right-patrolmarks' => 'دیتنی نیشان کراوەکان وەک پاس دراو لە دوایین گۆڕانکارییەکاندا',
+'right-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù¾Û\8eرستÛ\8eÚ© Ù\84Û\95 Ù¾Û\95Ú\95Û\95 Ú\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\95کراÙ\88Û\95کان',
+'right-mergehistory' => 'میژووی پەڕەکان بکە یەک',
 'right-userrights' => 'دەستکاری مافەکانی هەموو بەکارهێنەران',
 'right-userrights-interwiki' => 'دەستکاری مافەکانی بەکارهێنەریی بەکارهێنەران لە ویکی‌یەکانی دیکە‌دا',
 'right-siteadmin' => 'داخستن و کردنەوەی بنکەدراو',
 'right-override-export-depth' => 'هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت',
-'right-sendemail' => 'ئەمەیل بنێرە بۆ بەکارھێنەرانی تر',
+'right-sendemail' => 'ناردنی ئیمەیل بۆ بەکارھێنەرانی تر',
 
 # Special:Log/newusers
 'newuserlogpage' => 'لۆگی دروستکردنی بەکارھێنەر',
@@ -1449,25 +1441,25 @@ $1",
 'action-protect' => 'گۆڕانی ئاستی پارێزراوی بۆ ئەم لاپەڕە',
 'action-import' => 'هێنانەناوەی ئەم لاپەڕە لە ویکی‌یەکی دیکە',
 'action-importupload' => 'هێنانەناوەی ئەم لاپەڕە لە پەڕگەیەکی بارکراو',
-'action-patrol' => 'Ù\84Û\95Ú\98Û\8eرÚ\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\8cشاÙ\86â\80\8cکردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95ساÙ\86Û\8câ\80\8cتر',
-'action-autopatrol' => 'دÛ\95ستکارÛ\8cÛ\95کاÙ\86ت Ù\88Û\95Ú© Ù\84Û\95Ú\98Û\8eرÚ\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\8cشاÙ\86 Ú©Ø±Ø§Ù\88Ù\86',
-'action-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù¾Û\8eرستÛ\8c Ø¦Û\95Ù\88 Ù¾Û\95Ú\95اÙ\86Û\95Û\8c Ú\86اÙ\88دÛ\8eرÛ\8c Ù\86اکرÛ\8eن',
-'action-mergehistory' => 'سەریەک‌خستنی میژووی ئەم لاپەڕە',
-'action-userrights' => 'دەستکاری مافەکانی هەموو بەکارهێنەران',
+'action-patrol' => 'Ù\86Û\8cشاÙ\86کردÙ\86Û\8c Ø¯Û\95ستکارÛ\8cÛ\95کاÙ\86Û\8c Ú©Û\95ساÙ\86Û\8c ØªØ± Ù\88Û\95Ú© Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88',
+'action-autopatrol' => 'دÛ\95ستکارÛ\8cÛ\8cÛ\95کاÙ\86ت Ù\88Û\95Ú© Ù¾Ø§Ø³ Ø¯Ø±Ø§Ù\88 Ù\86Û\8cشاÙ\86 Ø¨Ú©Ø±Û\8e',
+'action-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù¾Û\8eرستÛ\8eÚ© Ù\84Û\95 Ù¾Û\95Ú\95Û\95 Ú\86اÙ\88دÛ\8eرÛ\8c Ù\86Û\95کراÙ\88Û\95کان',
+'action-mergehistory' => 'میژووی پەڕەکان بکە یەک',
+'action-userrights' => 'دەستکاریی مافەکانی ھەموو بەکارھێنەران',
 'action-userrights-interwiki' => 'دەستکاری مافەکانی بەکارهێنەریی بەکارهێنەران لە ویکی‌یەکانی دیکە‌دا',
 'action-siteadmin' => 'داخستن یا کردنەوەی بنکەدراو',
 'action-sendemail' => 'ناردنی ئیمەیلەکان',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|گۆڕانکاری|گۆڕانکاری}}',
+'nchanges' => '$1 {{PLURAL:$1|گۆڕانکاری}}',
 'recentchanges' => 'دوایین گۆڕانکارییەکان',
 'recentchanges-legend' => 'ھەڵبژاردەکانی دوایین گۆڕانکارییەکان',
-'recentchanges-summary' => 'دوایین گۆڕانکارییەکانیی ویکی لەم پەڕەیەدا ببینە.',
+'recentchanges-summary' => 'لەم پەڕەیەدا شوێنی دوایین گۆڕانکارییەکانی ویکی بکەوە.',
 'recentchanges-feed-description' => 'دوای دوایین گۆڕانکارییەکانی ئەم ویکیە بکەوە لەم «فید»ەوە.',
 'recentchanges-label-newpage' => 'ئەم دەستکارییە لاپەڕەیەکی نوێی دروستکرد',
-'recentchanges-label-minor' => 'ئەمە دەستکاریەکی بچووکە',
+'recentchanges-label-minor' => 'ئÛ\95Ù\85Û\95 Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95Ú©Û\8c Ø¨Ú\86Ù\88Ù\88Ú©Û\95',
 'recentchanges-label-bot' => 'ئەم دەستکاریە لە لایەن بۆتەوە پێک هاتووە',
-'recentchanges-label-unpatrolled' => 'ئÛ\95Ù\85 Ø¯Û\95ستکارÛ\8cÛ\95 Ù\87Û\8eشتا Ù\86Û\95Ú\95Û\86شتÛ\95تÛ\95 Ú\98Û\8eر Ú\86اÙ\88دÛ\8eرÛ\8c',
+'recentchanges-label-unpatrolled' => 'ئÛ\95Ù\85 Ø¯Û\95ستکارÛ\8cÛ\8cÛ\95 Ú¾Û\8eشتا Ù¾Ø§Ø³ Ù\86Û\95دراÙ\88Û\95',
 'rcnote' => "لە خوارەوەدا {{PLURAL:$1|'''۱''' گۆڕانکاری |دوایین '''$1''' گۆڕانکارییەکان}} لە دوایین {{PLURAL:$2|ڕۆژ|'''$2''' ڕۆژەوە}} ، تا $5، $4 دەبینن.",
 'rcnotefrom' => "ئەوی‌ خوارەوە گۆڕانکارییەکانە لە '''$2'''ەوە (ھەتا '''$1''' نیشاندراو).",
 'rclistfrom' => 'گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $1',
@@ -1475,8 +1467,8 @@ $1",
 'rcshowhidebots' => 'بۆتەکان $1',
 'rcshowhideliu' => 'بەکارھێنەرە تۆمارکراوەکان $1',
 'rcshowhideanons' => 'بەکارھێنەرە نەناسراوەکان $1',
-'rcshowhidepatr' => 'گۆرانکارییە چاودێریکراوەکان $1',
-'rcshowhidemine' => 'دەستکارییەکانی من $1',
+'rcshowhidepatr' => 'گۆرانکارییە پاس دراوەکان $1',
+'rcshowhidemine' => 'دەستکارییەکانم $1',
 'rclinks' => 'دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە<br />$3',
 'diff' => 'جیاوازی',
 'hist' => 'مێژوو',
@@ -1485,8 +1477,8 @@ $1",
 'minoreditletter' => 'ب',
 'newpageletter' => 'ن',
 'boteditletter' => '.بۆت',
-'number_of_watching_users_pageview' => '[$1 چاودێر لەسەر {{PLURAL:$1|بەکارهێنەر|بەکارهێنەر}}]',
-'rc_categories' => 'بەرتەسک‌کردنەوە بە هاوپۆلەکان (به "|" جودای بکەوە‌)',
+'number_of_watching_users_pageview' => '[$1 چاودێر لەسەر {{PLURAL:$1|بەکارھێنەر}}]',
+'rc_categories' => 'بەرتەسک‌کردنەوە بە هاوپۆلەکان (به «|» جیای بکەوە‌)',
 'rc_categories_any' => 'هەرکام',
 'rc-change-size-new' => '$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری',
 'newsectionsummary' => '/* $1 */ بەشی نوێ',
@@ -1533,8 +1525,8 @@ $1",
 'uploadlogpagetext' => 'لەخوارەوە لیستی دوایین بارکراوەکان دەبینی.
 بۆ ئەوەی چاوێکیان لێ بکەی، [[Special:NewFiles|گالەری پەڕگە نوێکان]] ببینە.',
 'filename' => 'ناوی پەڕگە',
-'filedesc' => 'پوختە',
-'fileuploadsummary' => 'پوختە:',
+'filedesc' => 'کورتە',
+'fileuploadsummary' => 'کورتە:',
 'filereuploadsummary' => 'گۆرانکارییەکانی پەڕگە:',
 'filestatus' => 'بارودۆخی مافی لەبەرگرتنەوە:',
 'filesource' => 'سەرچاوە:',
@@ -1653,9 +1645,6 @@ $1',
 'img-auth-nofile' => 'فایلی "$1" بوونی نیه‌',
 'img-auth-isdir' => 'هه‌وڵ ده‌ده‌ی بۆ کردنه‌وه‌ی بوخچه‌ی "$1" له‌ کاتێکدا ته‌نیا کردنه‌وه‌ی فایل رێپێدراوه‌',
 
-# HTTP errors
-'http-host-unreachable' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
-
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'توانای دەست‌پێ‌گەیشتنی URL نیە',
 'upload-curl-error6-text' => 'ئەو URL کە ڕاچاوت کردووە توانای دەست‌پێ‌گەیشتنی نییە.
@@ -1799,12 +1788,18 @@ $1',
 'statistics-users-active-desc' => 'ئەو بەکارھێنەرانە کە لە {{PLURAL:$1|ڕۆژ|$1 ڕۆژ}}ی ڕابردوودا کارێکیان جێبەجێ کردبێت.',
 'statistics-mostpopular' => 'زۆرترین لاپەڕە بینراوەکان',
 
-'disambiguations' => 'ئەو پەڕانە لینکیان ھەیە بۆ پەڕەکانی ڕوونکردنەوە',
+'disambiguations' => 'پەڕەکانی بەستەردراو بۆ پەڕەکانی ڕوونکردنەوە',
 'disambiguationspage' => 'Template:ڕوونکردنەوە',
 'disambiguations-text' => "ئەم پەڕانە لانی کەم یەک بەستەریان بۆ '''پەڕەی ڕوونکردنەوە''' ھەیە.
 لەوانەیە لە جیاتی ئەو، بەستەریان ھەبێت  بۆ بابەتەکانیی گونجاو.<br />
 ئەگەر پەڕەیەک لە داڕێژەیەک کەڵک وەرگرێت کە بەستەری ھەبێت بۆ [[MediaWiki:Disambiguationspage]]، وەک پەڕەی ڕوونکردنەوە لەبەر چاو دەگیرێت.",
 
+'pageswithprop' => 'پەڕەکان بە تایبەتمەندیی پەڕە',
+'pageswithprop-legend' => 'پەڕەکان بە تایبەتمەندیی پەڕە',
+'pageswithprop-text' => 'ئەم پەڕەیە ئەو پەڕانەی تایبەتمەندییەکی پەرەیەکی دیاریکراو بەکاردەھێنن پێرست دەکا.',
+'pageswithprop-prop' => 'ناوی تایبەتمەندی:',
+'pageswithprop-submit' => 'بڕۆ',
+
 'doubleredirects' => 'دووجار ڕەوانەکراوەکان',
 'doubleredirectstext' => 'ئەم پەڕە لیستی ئەو پەڕانەیە کە ڕەوانەکراون بۆ پەڕەیەکی ڕەوانەکراوی دیکە.
 هەر ڕیزێک، بەستەرەکانی ڕەوانەکردنەوەی یەکەم و دووەم و ھەروەھا ئامانجی ڕەوانەکراوی دووەمی تێدایە کە حاڵەتی ئاساییدا مەبەستی «ڕاستی»ی ڕەوانەکراوی یەکەمیش دەبێ بۆ ئەوێ بێت.
@@ -1818,7 +1813,7 @@ $1',
 'brokenredirects-edit' => 'دەستکاری',
 'brokenredirects-delete' => 'سڕینەوە',
 
-'withoutinterwiki' => 'پەڕەکانی بێ بەستەرەکانی زمان',
+'withoutinterwiki' => 'پەڕەکان بەبێ بەستەرەکانی زمان',
 'withoutinterwiki-summary' => 'ئەم پەڕانە بەستەریان بۆ وەشانەکانی زمانەکانی تر نیە.',
 'withoutinterwiki-legend' => 'پێشگر',
 'withoutinterwiki-submit' => 'پیشاندان',
@@ -1909,6 +1904,7 @@ $1',
 بینینەکە سنووردار بکەیتەوە.',
 'logempty' => 'هیچ بابەتێکی هاوتا لە لۆگەکاندا نەدۆزرایەوە.',
 'log-title-wildcard' => 'گەڕانی ئەو سەرناوانە بەم دەقەوە دەست پێدەکەن',
+'showhideselectedlogentries' => 'بابەتەکانی ھەڵبژێردراوی لۆگ نیشان بدە/بشارەوە',
 
 # Special:AllPages
 'allpages' => 'ھەموو پەڕەکان',
@@ -1976,11 +1972,11 @@ $1',
 'listgrouprights-summary' => 'ئەمە لیستێکە لە گرووپەکانی بەکارهێنەر لەسەر ئەم ویکی‌یە، دەگەڵ مافەکانی دەست‌پێ‌گەیشتنی هاوپەیوەندیان.
 لێرەدا لەوانەیە [[{{MediaWiki:Listgrouprights-helppage}}|زانیاری زیاترت]] دەست‌کەوێت سەبارەت بە مافە تاکەکەسیەکان.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">مافی دراوە</span>
-* <span class="listgrouprights-granted">Ù\85اÙ\81Û\8c Ø³Û\95Ù\86دراÙ\88Û\95</span>',
+* <span class="listgrouprights-granted">مافی سەنراوە</span>',
 'listgrouprights-group' => 'گرووپ',
 'listgrouprights-rights' => 'مافەکان',
 'listgrouprights-helppage' => 'Help:مافەکانی گرووپ',
-'listgrouprights-members' => '(Ù\84Û\8cستی ئەندامەکان)',
+'listgrouprights-members' => '(Ù¾Û\8eرستی ئەندامەکان)',
 'listgrouprights-addgroup' => 'زیادکردنی {{PLURAL:$2|گرووپ|گرووپ}}: $1',
 'listgrouprights-removegroup' => 'لابردنی {{PLURAL:$2|گرووپ|گرووپ}}: $1',
 'listgrouprights-addgroup-all' => 'زیادکردنی هەموو گرووپەکان',
@@ -1999,7 +1995,7 @@ $1',
 'emailpage' => 'ئیمەیل بۆ بەکارھێنەر',
 'emailpagetext' => 'دەتوانی لەم فۆرمەی ژێرەوە بۆ ناردنی ئیمەیلێک بۆ ئەم {{GENDER:$1|بەکارھێنەر}}ە کەڵک وەربگریت.
 ئەو ناونیشانە ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر‌یتدا]] نووسیوتە، لە ناونیشانی «لەلایەن»ی (From) ئیمەیلەکەدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.',
-'defemailsubject' => 'ئیمەیڵی {{SITENAME}} لە بەکارھێنەر «$1»ەوە',
+'defemailsubject' => 'ئیمەیلی {{SITENAME}} لە بەکارھێنەر «$1»ەوە',
 'usermaildisabled' => 'ئیمەیڵی بەکارهێنەر لەکاردانیە',
 'noemailtitle' => 'هیچ ناونیشانێکی ئی‌مەیل نییە',
 'noemailtext' => 'ئەم بەکارهێنەرە ناونێشانێکی بڕوا پێکراوی ئی‌مەیلی دانەناوە.',
@@ -2008,13 +2004,13 @@ $1',
 'emailtarget' => 'ناوی بەکارھێنەریی وەرگر بنووسە',
 'emailusername' => 'ناوی به‌كارھێنه‌ر:',
 'emailusernamesubmit' => 'بینێرە',
-'email-legend' => 'ناردنی ئیمەیلێک بۆ بەکارهێنەرێکی دیکەی {{SITENAME}}',
+'email-legend' => 'ناردنی ئیمەیلێک بۆ بەکارھێنەرێکی تری {{SITENAME}}',
 'emailfrom' => 'لە:',
 'emailto' => 'بۆ:',
 'emailsubject' => 'بابەت:',
 'emailmessage' => 'پەیام:',
 'emailsend' => 'بینێرە',
-'emailccme' => 'Ú©Û\86Ù¾Û\8cÛ\8cÛ\95Ú© Ù\84Û\95 Ù\86امەکە بنێرە بۆ ئیمەیلەکەم.',
+'emailccme' => 'Ú©Û\86Ù¾Û\8cÛ\8cÛ\95Ú© Ù\84Û\95 Ù¾Û\95Û\8cامەکە بنێرە بۆ ئیمەیلەکەم.',
 'emailccsubject' => 'کۆپیی نامەکەت بۆ $1: $2',
 'emailsent' => 'نامەکەت ناردرا',
 'emailsenttext' => 'نامەکەت ناردرا',
@@ -2045,14 +2041,14 @@ $1',
 'notvisiblerev' => 'پیاچوونەوە سڕاوەتەوە',
 'watchnochange' => 'ھیچکام لەو بابەتانە چاودێڕییان دەکەیت، لە ماوەی نیشاندراودا دەستکاری نەکراون.',
 'watchlist-details' => '{{PLURAL:$1|$1 پەڕە|$1 پەڕە}} لە لیستی چاودێریەکەتدایە، بێجگە پەڕەکانی لێدوان.',
-'wlheader-enotif' => 'ئەکرێ بە E-mail ئاگاداری بدەی',
-'wlheader-showupdated' => "‏ئەو پەڕانە کە لە پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
+'wlheader-enotif' => 'ئەکرێ بە E-mail ئاگاداری بدەی',
+'wlheader-showupdated' => "‏ئەو پەڕانە کە لە پاش دواین سەردانت دەستکاری کراون بە '''ئەستوور''' نیشان دراون",
 'watchmethod-recent' => 'سەرنج‌دانی دوایین دەستکاریەکان بۆ لاپەڕە چاودێری‌کراوەکان',
 'watchmethod-list' => 'سەرنج‌دانی لاپەڕە چاودێری‌کراوەکان بۆ دوایین دەستکاریەکان',
 'watchlistcontains' => 'لیستی چاودێڕییەکانت $1 {{PLURAL:$1|پەڕە|پەڕە}}ی تێدایە.',
 'iteminvalidname' => "ھەڵە لەگەڵ بابەتی '$1'، ناوی نادروست...",
 'wlnote' => "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین '''$1''' گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|'''$2''' کاتژمێر}}دا ھەتا $4 لە $3.",
-'wlshowlast' => 'دوایین $1 کاتژمێر  $2 ڕۆژی $3 نیشانبدە',
+'wlshowlast' => 'دوایین $1 کاتژمێر $2 ڕۆژی $3 نیشان بدە',
 'watchlist-options' => 'ھەڵبژاردەکانی لیستی چاودێری',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2151,10 +2147,10 @@ $UNWATCHURL
 
 دوایین دەستکاری ئەم لاپەڕە [[User:$3|$3]] کردوویە ([[User talk:$3|وتووێژ]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "پوختەی دەستکاری \"''\$1''\" بوو.",
-'revertpage' => 'گەڕاندنەوەی دەستکارییەکانی [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین دەستکاریی [[User:$1|$1]]',
+'revertpage' => 'گەڕاندنەوەی دەستکارییەکانی [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]]) بۆ دوایین پێداچوونەوەی [[User:$1|$1]]',
 'revertpage-nouser' => 'دەستکارییەکانی (ناوی بەکارھێنەر سڕاوەتەوە) بۆ دوایین پێداچوونەوەی [[User:$1|$1]] گەڕێنراوە.',
 'rollback-success' => 'دەستکارییەکانی $1 وەرگێرایەوە؛<br />
-گۆڕدرا بۆ دوایین دەستکاریی $2.',
+گۆڕدرا بۆ دوایین پێداچوونەوەی $2.',
 
 # Edit tokens
 'sessionfailure' => 'لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.
@@ -2187,8 +2183,8 @@ $UNWATCHURL
 'protect-cascadeon' => 'ھەنووکە ئەم پەڕە پارێزراوە بۆ ئەوەی کە لە نێو ئەم {{PLURAL:$1|پەڕە کە پاراستنی تاڤگەییی|پەڕانە کە پاراستنی تاڤگەیییان}} بۆ چالاککراوە، ھێنراوە.
 دەتوانی ئاستی پاراستنی ئەم پەڕە بگۆڕی، بەڵام ھیچ کاریگەرییەکی نابێت لە سەر پاراستنی تاڤگەیی',
 'protect-default' => 'بە ھەموو بەکارھێنەران ڕێگە بدە',
-'protect-fallback' => 'پێویستی بە ئیزنی «$1» ھەیە',
-'protect-level-autoconfirmed' => 'بÛ\95کارھÛ\8eÙ\86Û\95راÙ\86Û\8c Ù\86Ù\88Û\8e Ù\88 ØªÛ\86Ù\85ارÙ\86Û\95کراÙ\88 Ø¦Ø§Ø³ØªÛ\95Ù\86Ú¯ Ø¨Ú©ە',
+'protect-fallback' => 'تەنیا بە بەکارھێنەران بە مافی «$1» ڕێگە بدە',
+'protect-level-autoconfirmed' => 'تÛ\95Ù\86Û\8cا Ø¨Û\95 Ø¨Û\95کارھÛ\8eÙ\86Û\95راÙ\86Û\8c Ù¾Û\95سÙ\86دکراÙ\88 Ú\95Û\8eÚ¯Û\95 Ø¨Ø¯ە',
 'protect-level-sysop' => 'تەنیا بەڕێوەبەران',
 'protect-summary-cascade' => 'تاڤگەیی',
 'protect-expiring' => 'بەسەردەچێ لە ڕێکەوتی $1 (UTC)',
@@ -2305,7 +2301,7 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'ھەنووکە ئەم ناونیشانەی IPیە بەربەست کراوە.
 دوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:',
 'sp-contributions-search' => 'گەڕان بۆ بەشدارییەکان',
-'sp-contributions-username' => 'ناونیشانی ئای‌پی یان ناوی‌ بەکارھێنەری:',
+'sp-contributions-username' => 'ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:',
 'sp-contributions-toponly' => 'تەنیا ئەو دەستکارییانە نیشانبدە کە دوایین پیاچوونەوەن',
 'sp-contributions-submit' => 'بگەڕێ',
 
@@ -2337,7 +2333,7 @@ $1',
 'blockiptext' => 'لەم فۆرمەی خوارەوە دەتوانی بۆ بەربەست‌کردنی دەست‌پێ‌گەیشتنی نووسین لە ناونیشانێکی ئای‌پی تایبەت یا ناوی بەکارهێنەریەک، کەڵک وەرگریت.
 ئەمە تەنها دەبێ بۆ بەرگری لە خراپکاری بەکاربێت و ڕێکەوتنی هەبێ دەگەڵ [[{{MediaWiki:Policy-url}}|سیاسەتەکان]].
 لە خوارەوە هۆکارێک بە ڕوونی بنووسە (بۆ نموونە بە وردی ئەو لاپەڕانە و خراپکاری تێدا کراوە وەک، وەک بەڵگە، بنووسە).',
-'ipadressorusername' => 'ناونیشانی ئای‌پی یان ناوی‌ بەکارهێنەری:',
+'ipadressorusername' => 'ناونیشانی ئایپی یان ناوی‌ بەکارھێنەر:',
 'ipbexpiry' => 'بەسەرچوون:',
 'ipbreason' => 'هۆکار:',
 'ipbreasonotherlist' => 'هۆکاری تر',
@@ -2364,8 +2360,8 @@ $1',
 'ipb-change-block' => 'دیسان بەربەست‌کردنەوەی ئەم بەکارهێنەرە بەم هەڵبژاردانە',
 'badipaddress' => 'ناونیشانی ئای‌پی نەگونجاو',
 'blockipsuccesssub' => 'بەربەست کردن سەرکەوتوو بوو',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بەربەستکراوە.<br />
³Û\95Û\8cرÛ\8c [[Special:BlockList|Ù\84Û\8cستÛ\8c Ø¨Û\95ربÛ\95ستÙ\86]] Ø¨Ú©Û\95 Ø¨Û\86 Ø¨Û\8cÙ\86Û\8cنەوەی بەربەستنەکان.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بەربەست کرا.<br />
¨Ú\95Ù\88اÙ\86Û\95 [[Special:BlockList|Ù¾Û\8eرستÛ\8c Ø¨Û\95ربÛ\95ستÙ\86]] Ø¨Û\86 Ø¨Û\95سÛ\95رداÚ\86Ù\88Ù\88نەوەی بەربەستنەکان.',
 'ipb-edit-dropdown' => 'دەستکاری هۆکارەکانی بەربەست',
 'ipb-unblock-addr' => 'لە بەربەست‌دەرهێنانی $1',
 'ipb-unblock' => 'لە بەربەست‌دەرهێنانی ناوی بەکارهێنەریەک یا ناونیشانێکی ئای‌پی',
@@ -2585,9 +2581,9 @@ $1',
 تکایە سەردانی [//www.mediawiki.org/wiki/Localisation ناوچەیی‌کردنی میدیاویکی] و [//translatewiki.net translatewiki.net] بکە ئەگەر دەتەوێ لە ناوچەیی‌کردنی میدیاویکی بە گشتی بەشداری بکەیت.',
 'allmessagesnotsupportedDB' => "ئەم لاپەڕە ناتوانی بەکاربێت لەبەر ئەوەی '''\$wgUseDatabaseMessages''' لەکار خستراوە.",
 'allmessages-filter-legend' => 'پاڵێو',
-'allmessages-filter-unmodified' => 'چاکسازی نەکراو',
+'allmessages-filter-unmodified' => 'نەگۆڕدراو',
 'allmessages-filter-all' => 'هەموو',
-'allmessages-filter-modified' => 'Ú\86اکسازÛ\8câ\80\8cÚ©راو',
+'allmessages-filter-modified' => 'Ú¯Û\86Ú\95دراو',
 'allmessages-prefix' => 'پاڵێو بە پێشگر:',
 'allmessages-language' => 'زمان:',
 'allmessages-filter-submit' => 'بڕۆ',
@@ -2607,9 +2603,9 @@ $1',
 # Special:Import
 'import' => 'ھاوردنی پەڕەکان',
 'importinterwiki' => 'هێنانەناوەی ترانس‌ویکی',
-'import-interwiki-text' => 'بۆ هێنانە‌ناوە ویکی‌یەک و سەردێڕێکی لاپەڕە هەڵبژێرە.
-ڕێکەوتەکانی پێداچوونەوە و ناوی دەستکاری‌کەرەکان دەپارێزدرێت.
-هەموو کردوەکانی هێنانەناوەی ترانس‌ویکی لە [[Special:Log/import|لۆگی هێنانەناوە]] لۆگ دەکرێت.',
+'import-interwiki-text' => 'بۆ ھاوردن ویکییەک و سەردێڕێکی پەڕە ھەڵبژێرە.
+ڕێکەوتەکانی پێداچوونەوە و ناوی دەستکاریکەرەکان دەپارێزرێت.
+هەموو کردەوەکانی ھاوردنی ترانسویکی لە [[Special:Log/import|لۆگی ھاوردن]]دا تۆمار دەکرێت.',
 'import-interwiki-source' => 'سەرچاوەی ویکی\\لاپەڕە :',
 'import-interwiki-history' => 'ڕوونووس‌کردنی هەموو مێژووی پێداچوونەوەکانی ئەم لاپەڕە',
 'import-interwiki-templates' => 'لەخۆگرتنی هەموو داڕێژەکان',
@@ -2647,7 +2643,7 @@ $1',
 'import-invalid-interwiki' => 'لە ویکی‌ دیاری‌کراوە ناهێنڕێتەوە ناوە.',
 
 # Import log
-'importlogpage' => 'Ù\87Û\8eÙ\86اÙ\86Û\95Ù\86اÙ\88Û\95Û\8c Ù\84Û\86Ú¯',
+'importlogpage' => 'Ù\84Û\86Ú¯Û\8c Ú¾Ø§Ù\88ردÙ\86',
 'importlogpagetext' => 'ھاوردنی پەڕەکان لەگەڵ مێژووی دەستکاری لە ویکییەکانی ترەوە.',
 'import-logentry-upload' => 'ھاوردنی [[$1]] بە بارکردنی پەڕگە',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}',
@@ -2722,7 +2718,7 @@ $1',
 'tooltip-watchlistedit-raw-submit' => 'نوێکردنەوەی لیستی چاودێری',
 'tooltip-recreate' => 'درووست‌کردنەوەی لاپەڕە ئەگەرچی سڕاوەتەوە',
 'tooltip-upload' => 'دەستپێکردنی بارکردن',
-'tooltip-rollback' => '«گەڕاندنەوە» بە یەک کرتە گۆڕانکاریی/گۆڕانکارییەکانی ئەم پەڕەیە دەگەڕێنێتەوە بۆ دواین بەشداربوو',
+'tooltip-rollback' => '«گەڕاندنەوە» بە یەک کرتە گۆڕانکاریی/گۆڕانکارییەکانی ئەم پەڕەیە دەگەڕێنێتەوە بۆ دوایین بەشداربوو',
 'tooltip-undo' => '«پووچەڵکردنەوە» ئەم گۆڕانکارییە دەگەڕێنێتەوە و فۆرمی دەستکاریکردن لە شێوەی پێشبینیندا دەکاتەوە. بەم جۆرە دەکرێ ھۆکارێک لە کورتەی دەستکاریدا بنووسرێ.',
 'tooltip-preferences-save' => 'هەڵبژاردنەکانت بپارێزە',
 'tooltip-summary' => 'پوختەیەکی کورتی تێبخە',
@@ -2766,7 +2762,7 @@ $1',
 'pageinfo-robot-noindex' => 'نەشیاو بۆ پێرستکردن',
 'pageinfo-views' => 'ژمارەی بینینەکان',
 'pageinfo-watchers' => 'ژمارەی چاودێرانی پەڕە',
-'pageinfo-few-watchers' => 'کەمتر لە $1 {{PLURAL:$1|چاوەدێر}}',
+'pageinfo-few-watchers' => 'کەمتر لە $1 {{PLURAL:$1|چاودێر}}',
 'pageinfo-redirects-name' => 'ڕەوانەکەرەکان بۆ ئەم پەڕەیە',
 'pageinfo-subpages-name' => 'ژێرپەڕەکانی ئەم پەڕەیە',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ڕەوانەکەر}}; $3 {{PLURAL:$3|ڕەوانەنەکەر}})',
@@ -2784,32 +2780,33 @@ $1',
 'pageinfo-contentpage' => 'ھەژمارکراو وەک پەڕەی بەناوەرۆک',
 'pageinfo-contentpage-yes' => 'بەڵێ',
 'pageinfo-protect-cascading-yes' => 'بەڵێ',
+'pageinfo-category-pages' => 'ژمارەی پەڕەکان',
+'pageinfo-category-subcats' => 'ژمارەی ژێرپەڕەکان',
+'pageinfo-category-files' => 'ژمارەی پەڕگەکان',
 
 # Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'غەریبی',
 'skinname-cologneblue' => 'شینی کۆلۆن',
 'skinname-monobook' => 'مۆنۆ',
-'skinname-myskin' => 'پێستی خۆم',
-'skinname-chick' => 'جووچک',
-'skinname-simple' => 'ساکار',
 'skinname-modern' => 'مۆدێڕن',
 'skinname-vector' => 'ڤێکتۆر',
 
 # Patrolling
-'markaspatrolleddiff' => 'وەک چاودێری‌کراو نیشان‌کردن',
-'markaspatrolledtext' => 'ئەم لاپەڕە وەک چاودێری‌کراو نیشان بکە',
-'markedaspatrolled' => 'وەک چاودێری‌کراو نیشان‌کرا',
-'markedaspatrolledtext' => 'پێداچوونەوەی هەڵبژێراوی [[:$1]] وەک چاودێریکراو نیشان‌کرا.',
-'rcpatroldisabled' => 'چاودێری دوایین گۆڕانکاریەکان لەکار خسترا',
-'rcpatroldisabledtext' => 'تایبەتمەندی چاودێری دوایین گۆڕانکاریەکان ئێستا لەکار خستراوە.',
-'markedaspatrollederror' => 'ناکرێ وه‌ک چاودێری‌کراو نیشان بکرێت',
-'markedaspatrollederror-noautopatrol' => 'ڕێگەت پێ‌نەدراوە گۆڕانکاریەکانی خۆت وەک چاودێری‌کراو نیشان بکەیت.',
+'markaspatrolleddiff' => 'وەک پاس دراو نشان بکە',
+'markaspatrolledtext' => 'ئەم پەڕەیە وەک پاس دراو نیشان بکە',
+'markedaspatrolled' => 'وەک پاس دراو نیشان کرا',
+'markedaspatrolledtext' => 'پێداچوونەوەی هەڵبژێردراوی [[:$1]] وەک پاس دراو نیشان کرا.',
+'rcpatroldisabled' => 'پاسدەریی دوایین گۆڕانکاریەکان ناچالاک کرا',
+'rcpatroldisabledtext' => 'تایبەتمەندیی پاسدەریی دوایین گۆڕانکارییەکان ئێستا ناچالاک کراوە.',
+'markedaspatrollederror' => 'وه‌ک پاس دراو نیشان نەکرا',
+'markedaspatrollederrortext' => 'دەبێ پێداچوونەوەیەک دەستنیشان بکەی ھەتا وەک پاس دراو نیشان بکرێ.',
+'markedaspatrollederror-noautopatrol' => 'ناتوانی گۆڕانکارییەکانی خۆت وەک پاس دراو نیشان بکەی.',
+'markedaspatrollednotify' => 'ئەم گۆڕانکارییە لەسەر $1 وەک پاس دراو نیشان کرا.',
+'markedaspatrollederrornotify' => 'نیشانکردن وەک پاس دراو سەرکەوتوو نەبوو.',
 
 # Patrol log
-'patrol-log-page' => 'لۆگی چاودێری',
-'patrol-log-header' => 'ئەمە لۆگێکی چاودێری پێداچوونەوەکانە.',
-'log-show-hide-patrol' => 'لۆگی چاودێری $1',
+'patrol-log-page' => 'لۆگی پاسدەری',
+'patrol-log-header' => 'ئەمە لۆگێکی پێداچوونەوە پاس دراوەکانە.',
+'log-show-hide-patrol' => 'لۆگی پاسدەری $1',
 
 # Image deletion
 'deletedrevision' => 'پێداچوونەوەی کۆنی سڕاوە $1',
@@ -2895,7 +2892,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'پانی',
 'exif-imagelength' => 'بەرزی',
 'exif-ycbcrpositioning' => 'شوێنی Y و C',
@@ -2962,7 +2959,7 @@ $1',
 # Make & model, can be wikified in order to link to the camera and model name
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'نەپەستێنراو',
 
 'exif-copyrighted-true' => 'خاوەنی مافی بڵاوکردنەوە',
@@ -3304,7 +3301,7 @@ $5
 'hijri-calendar-m3' => 'ڕەبیعەلئەووەڵ',
 'hijri-calendar-m4' => 'ڕەبیعەلئاخیر',
 'hijri-calendar-m5' => 'جومادەلئوولا',
-'hijri-calendar-m6' => 'جومادەسسانی',
+'hijri-calendar-m6' => 'جومادەلئاخیر',
 'hijri-calendar-m7' => 'ڕەجەب',
 'hijri-calendar-m8' => 'شەعبان',
 'hijri-calendar-m9' => 'ڕەمەزان',
@@ -3346,13 +3343,6 @@ $5
 'version-software-version' => 'وەشان',
 'version-entrypoints-header-url' => 'ناونیشانی ئینتەرنێتی',
 
-# Special:FilePath
-'filepath' => 'ڕێڕەوی پەڕگە',
-'filepath-page' => 'پەڕگە:',
-'filepath-submit' => 'بڕۆ',
-'filepath-summary' => 'ئەم لاپەڕە تایبەتە ڕێڕەوی تەواو بۆ پەڕگەیەک دەگەڕێنێتەوە.
-وێنەکان لە قەبارەی تەواو‌دا نیشان‌ دەدرێن و جۆرە پەڕگەکانی دیکە بە پڕۆگرامی هاوپەیوەندی خۆی ڕاستەوخۆ دەست‌پێ‌دەکات.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'گەڕان بۆ پەڕگە دووپات کراوەکان',
 'fileduplicatesearch-summary' => 'گەڕان بۆ پەڕگە دووبارەکراوەکان لەسەر بنەمای نرخی hash.',
@@ -3440,10 +3430,10 @@ $5
 'htmlform-selectorother-other' => 'دیکە',
 
 # New logging system
-'logentry-delete-delete' => '$1 پەڕەی $3ی سڕییەوە',
-'logentry-delete-restore' => '$1 پەڕەی $3ی ھێنایەوە',
-'logentry-delete-revision' => '$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی گۆڕیی: $4',
-'logentry-suppress-delete' => '$1 پەڕەی $3 بەرگری کرد.',
+'logentry-delete-delete' => '$1 پەڕەی $3ی {{GENDER:$2|سڕییەوە}}',
+'logentry-delete-restore' => '$1 پەڕەی $3ی {{GENDER:$2|ھێنایەوە}}',
+'logentry-delete-revision' => '$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی {{GENDER:$2|گۆڕیی}}: $4',
+'logentry-suppress-delete' => '$1 پەڕەی $3 {{GENDER:$2|بەرگری کرد}}.',
 'revdelete-content-hid' => 'ناوەرۆک شاردراوە',
 'revdelete-summary-hid' => 'کورتەی دەستکاری شاردراوە',
 'revdelete-uname-hid' => 'ناوی بەکارهێنەری شاراوە',
@@ -3452,14 +3442,16 @@ $5
 'revdelete-uname-unhid' => 'ناوی بەکارهێنەری نیشان درا',
 'revdelete-restricted' => 'ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران',
 'revdelete-unrestricted' => 'ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران',
-'logentry-move-move' => '$1 پەڕەی $3ی گواستەوە بۆ $4',
-'logentry-move-move-noredirect' => '$1 پەڕەی $3 بەبێ بەجێھشتنی ڕەوانەکەرێک گواستەوە بۆ $4',
-'logentry-move-move_redir' => '$1 پەڕەی $3 گواستەوە بۆ $4 کە پێشتر ڕەوانەکەر بوو',
-'logentry-move-move_redir-noredirect' => '$1 پەڕەی $3 بەبێ بەجێھشتنی ڕەوانەکەرێک گواستەوە بۆ $4 کە پێشتر ڕەوانەکەر بوو',
-'logentry-newusers-newusers' => 'ھەژماری بەکارھێنەریی $1 دروست کرا',
-'logentry-newusers-create' => 'ھەژماری بەکارھێنەریی $1 دروست کرا',
-'logentry-newusers-create2' => 'ھەژماری بەکارھێنەریی $3 لە لایەن $1 دروست کرا',
-'logentry-newusers-autocreate' => 'ھەژماری $1 بە شێوەی خۆگەڕ دروستکرا',
+'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 کە پێشتر ڕەوانەکەر بوو',
+'logentry-move-move_redir-noredirect' => '$1 پەڕەی $3 بەبێ بەجێھشتنی ڕەوانەکەرێک {{GENDER:$2|گواستەوە}} بۆ $4 کە پێشتر ڕەوانەکەر بوو',
+'logentry-patrol-patrol' => '$1 پێداچوونەوەی $4ی پەڕەی $3 وەک پاس دراو {{GENDER:$2|نیشان کرد}}',
+'logentry-patrol-patrol-auto' => '$1 بە شێوەی خۆگەڕ پێداچوونەوەی $4ی پەڕەی $3 وەک پاس دراو {{GENDER:$2|نیشان کرد}}',
+'logentry-newusers-newusers' => 'ھەژماری بەکارھێنەریی $1 {{GENDER:$2|دروست کرا}}',
+'logentry-newusers-create' => 'ھەژماری بەکارھێنەریی $1 {{GENDER:$2|دروست کرا}}',
+'logentry-newusers-create2' => 'ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}}',
+'logentry-newusers-autocreate' => 'ھەژماری بەکارھێنەریی $1 بە شێوەی خۆگەڕ {{GENDER:$2|دروست کرا}}',
 'rightsnone' => '(ھیچ)',
 
 # Feedback
index c4cad31..198345f 100644 (file)
@@ -83,7 +83,6 @@ $messages = array(
 
 # Cologne Blue skin
 'qbpageoptions' => 'Issa pagina',
-'qbpageinfo' => 'Cuntestu',
 'qbmyoptions' => 'E mo pagine',
 'qbspecialpages' => 'Pagine spiciale',
 
@@ -201,7 +200,6 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'yourdiff' => 'Differenze',
 'template-protected' => '(prutettu)',
 'template-semiprotected' => '(mezu prutettu)',
-'nocreatetitle' => 'Creazione di pagina limitata',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Registramentu micca pussibile',
@@ -361,7 +359,7 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 # Special:ListUsers
 'listusers-submit' => 'Mustrà',
 
-# E-mail user
+# Email user
 'emailto' => 'À:',
 'emailsubject' => 'Sughjettu:',
 'emailmessage' => 'Messaghju:',
@@ -373,9 +371,8 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'watch' => 'Seguità',
 
 'enotif_reset' => 'Marcà tutte e pagine visitate',
-'enotif_newpagetext' => 'Ista hè una pagina nova.',
-'changed' => 'cambiatu',
 'created' => 'creatu',
+'changed' => 'cambiatu',
 
 # Delete
 'deletepage' => 'Supprimà a pagina',
@@ -494,7 +491,7 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'ilsubmit' => 'Ricerca',
 'bydate' => 'per data',
 
-# EXIF tags
+# Exif tags
 'exif-orientation' => 'Orientazione',
 'exif-imagedescription' => "Titulu di l'imagine",
 'exif-artist' => 'Autore',
@@ -535,9 +532,6 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 # Special:Version
 'version' => 'Versione',
 
-# Special:FilePath
-'filepath-page' => 'Schedariu:',
-
 # Special:SpecialPages
 'specialpages' => 'Pagine spiciale',
 
index 1184b13..0bfb361 100644 (file)
@@ -43,9 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang mga numero sang mga gatan-aw nga manug-usar',
 'tog-oldsig' => 'Nagkayara nga pirma:',
 'tog-fancysig' => 'Ituring ang pirma bilang teksto sang wiki (wala sang automatik nga link)',
-'tog-externaleditor' => 'Maggamit sang panggwa nga manug-ilis paagi sa default ( para sa mga ekspeto lang, kinanglan ang espesyal nga mga setting sa imo kompyuter)',
-'tog-externaldiff' => 'Maggamit sang panggwa nga kinala-in paagi sa default ( para sa mga ekspeto lang, kinanglan ang espesyal nga setting sa imo kumpyuter.
-[//www.mediawiki.org/wiki/Manual:External_editors Mas madamu pa nga impormasyon.])',
 'tog-showjumplinks' => 'Pasugtan ang mga "tumbo sa" kadali-an nga mga link',
 'tog-uselivepreview' => 'Maggamit sang buhi nga prebyu (kinanglan ang Javascript) (Eksperimental)',
 'tog-forceeditsummary' => 'Hambalan ako kung nagapasulod sang wala unod nga pag-ilis kabilugan',
@@ -720,7 +717,7 @@ Ang paglarawan nga yara sa ibabaw sang [$2 pahina sang paglarawan sang akta] sin
 # Special:ListGroupRights
 'listgrouprights-members' => '(lista sang mga myembro)',
 
-# E-mail user
+# Email user
 'emailuser' => 'I-email mini nga naga-usar',
 
 # Watchlist
index 774bddd..3d20866 100644 (file)
@@ -135,8 +135,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Козеткен къулланыджы сайысыны косьтер',
 'tog-oldsig' => 'Шимдики имза:',
 'tog-fancysig' => 'Имза викиметин киби олсун (автоматик багъланты олмаз)',
-'tog-externaleditor' => 'Тыш тюрлендиргич (редактор) къуллан (теджрибели къулланыджылар ичюн; компьютеринъизни махсус сазламакъ керек. [ //www.mediawiki.org/wiki/Manual:External_editors тафсилятлы малюмат мында])',
-'tog-externaldiff' => 'Тенъештирмек ичюн тыш бир программа къуллан (теджрибели къулланыджылар ичюн; компьютеринъизни махсус сазламакъ керек. [ //www.mediawiki.org/wiki/Manual:External_editors тафсилятлы малюмат мында])',
 'tog-showjumplinks' => '«Бар» багълантысыны фааллештир',
 'tog-uselivepreview' => 'Джанлы бакъып чыкъув хусусиетини къуллан (JavaScript) (даа денъеме алында)',
 'tog-forceeditsummary' => 'Денъиштирменинъ къыскъа тарифини бош ташласам мени тенбиле',
@@ -893,9 +891,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'search-external' => 'Тыш къыдырув',
 'searchdisabled' => '{{SITENAME}} сайтында къыдырув япма вакътынджа токътатылды. Бу арада Google къулланып {{SITENAME}} ичинде къыдырув япып оласынъыз. Къыдырув сайтларында индекслемелерининъ бираз эски къалгъан ола биледжегини козь огюне алынъыз.',
 
-# Quickbar
-'qbsettings' => 'Вызлы иришим сутун сазламалары',
-
 # Preferences page
 'preferences' => 'Сазламалар',
 'mypreferences' => 'Сазламалар',
@@ -1044,7 +1039,7 @@ $3 мына бу себепни бильдирди: ''$2''",
 'nchanges' => '$1 {{PLURAL:$1|денъиштирме}}',
 'recentchanges' => 'Сонъки денъиштирмелер',
 'recentchanges-legend' => 'Сонъки денъиштирмелер сазламалары',
-'recentchanges-summary' => 'Япылгъан энъ сонъки денъишикликлерни бу саифеде корип оласынъыз.',
+'recentchanges-summary' => 'Япылгъан энъ сонъки денъиштирмелерни бу саифеде корип оласынъыз.',
 'recentchanges-feed-description' => 'Бу лента вастасынен викиде сонъки денъиштирмелерни козет.',
 'recentchanges-label-newpage' => 'Бу денъиштирме янъы бир саифе яратты',
 'recentchanges-label-minor' => 'Бу, кичик бир денъиштирме',
@@ -1428,8 +1423,8 @@ $3 мына бу себепни бильдирди: ''$2''",
 'notanarticle' => 'Малюмат саифеси дегиль',
 'watchnochange' => 'Косьтерильген заман аралыгъында козетюв джедвелинъиздеки саифелернинъ ич бири денъиштирильмеген.',
 'watchlist-details' => 'Музакере саифелерини эсапкъа алмайып, козетюв джедвелинъизде {{PLURAL:$1|1|$1}} саифе бар.',
-'wlheader-enotif' => 'E-mail иле хабер берюв ачылды.',
-'wlheader-showupdated' => "Сонъки зияретинъизден сонъ денъиштирильген саифелер '''къалын арифлернен''' косьтерильди.",
+'wlheader-enotif' => 'E-mail иле хабер берюв ачылды.',
+'wlheader-showupdated' => "Сонъки зияретинъизден сонъ денъиштирильген саифелер '''къалын арифлернен''' косьтерильди.",
 'watchmethod-recent' => 'сонъки денъиштирмелер арасында козеткен саифелеринъиз къыдырыла',
 'watchmethod-list' => 'козетюв джедвелиндеки саифелер тешкериле',
 'watchlistcontains' => 'Сизинъ козетюв джедвелинъизде {{PLURAL:$1|1|$1}} саифе бар.',
@@ -1818,13 +1813,8 @@ MediaWiki интерфейсининъ чешит тиллерге терджи
 'spam_blanking' => 'Бар олгъан версияларда $1 сайтына багълантылар бар, темизлев',
 
 # Skin names
-'skinname-standard' => 'Стандарт',
-'skinname-nostalgia' => 'Ностальгия',
 'skinname-cologneblue' => 'Кёльн асретлиги',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Озь ресимлеме',
-'skinname-chick' => 'Чипче',
-'skinname-simple' => 'Адий',
 
 # Patrol log
 'patrol-log-page' => 'Тешкерюв журналы',
@@ -1897,7 +1887,7 @@ MediaWiki интерфейсининъ чешит тиллерге терджи
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-make' => 'Камера маркасы',
 'exif-model' => 'Камера модели',
 'exif-artist' => 'Яратыджысы',
@@ -1922,7 +1912,7 @@ MediaWiki интерфейсининъ чешит тиллерге терджи
 'exif-gpstimestamp' => 'GPS сааты (атом сааты)',
 'exif-gpssatellites' => 'Ольчемек ичюн къуллангъаны спутниклер',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Сыкъыштырылмагъан',
 
 'exif-orientation-3' => '180° айландырылгъан',
index 28185d4..8791d0f 100644 (file)
@@ -129,8 +129,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Közetken qullanıcı sayısını köster',
 'tog-oldsig' => 'Şimdiki imza:',
 'tog-fancysig' => 'İmza vikimetin kibi olsun (avtomatik bağlantı olmaz)',
-'tog-externaleditor' => 'Tış türlendirgiç (redaktor) qullan (tecribeli qullanıcılar içün; kompyuteriñizni mahsus sazlamaq kerek. [ //www.mediawiki.org/wiki/Manual:External_editors tafsilâtlı malümat mında])',
-'tog-externaldiff' => 'Teñeştimek içün tış bir programma qullan (tecribeli qullanıcılar içün; kompyuteriñizni mahsus sazlamaq kerek. [ //www.mediawiki.org/wiki/Manual:External_editors tafsilâtlı malümat mında])',
 'tog-showjumplinks' => '"Bar" bağlantısını faalleştir',
 'tog-uselivepreview' => 'Canlı baqıp çıquv hususiyetini qullan (JavaScript) (daa deñeme alında)',
 'tog-forceeditsummary' => 'Deñiştirmeniñ qısqa tarifini boş taşlasam meni tenbile',
@@ -889,9 +887,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'search-external' => 'Tış qıdıruv',
 'searchdisabled' => '{{SITENAME}} saytında qıdıruv yapma vaqtınca toqtatıldı. Bu arada Google qullanıp {{SITENAME}} içinde qıdıruv yapıp olasıñız. Qıdıruv saytlarında indekslemeleriniñ biraz eski qalğan ola bilecegini köz ögüne alıñız.',
 
-# Quickbar
-'qbsettings' => 'Vızlı irişim sutun sazlamaları',
-
 # Preferences page
 'preferences' => 'Sazlamalar',
 'mypreferences' => 'Sazlamalar',
@@ -1040,7 +1035,7 @@ Eger bildirseñiz, saifelerdeki deñiştirmelerni kimniñ yapqanını köstermek
 'nchanges' => '$1 {{PLURAL:$1|deñiştirme}}',
 'recentchanges' => 'Soñki deñiştirmeler',
 'recentchanges-legend' => 'Soñki deñiştirmeler sazlamaları',
-'recentchanges-summary' => 'Yapılğan eñ soñki deñişikliklerni bu saifede körip olasıñız.',
+'recentchanges-summary' => 'Yapılğan eñ soñki deñişitirmelerni bu saifede körip olasıñız.',
 'recentchanges-feed-description' => 'Bu lenta vastasınen vikide soñki deñiştirmelerni közet.',
 'recentchanges-label-newpage' => 'Bu deñiştirme yañı bir saife yarattı',
 'recentchanges-label-minor' => 'Bu, kiçik bir deñiştirme',
@@ -1423,8 +1418,8 @@ Bundan soñ, bu saifede ve onıñ muzakere saifesinde yapılacaq deñiştirmeler
 'notanarticle' => 'Malümat saifesi degil',
 'watchnochange' => 'Kösterilgen zaman aralığında közetüv cedveliñizdeki saifelerniñ iç biri deñiştirilmegen.',
 'watchlist-details' => 'Muzakere saifelerini esapqa almayıp, közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.',
-'wlheader-enotif' => 'E-mail ile haber berüv açıldı.',
-'wlheader-showupdated' => "Soñki ziyaretiñizden soñ deñiştirilgen saifeler '''qalın ariflernen''' kösterildi.",
+'wlheader-enotif' => 'E-mail ile haber berüv açıldı.',
+'wlheader-showupdated' => "Soñki ziyaretiñizden soñ deñiştirilgen saifeler '''qalın ariflernen''' kösterildi.",
 'watchmethod-recent' => 'soñki deñiştirmeler arasında közetken saifeleriñiz qıdırıla',
 'watchmethod-list' => 'közetüv cedvelindeki saifeler teşkerile',
 'watchlistcontains' => 'Siziñ közetüv cedveliñizde {{PLURAL:$1|1|$1}} saife bar.',
@@ -1812,13 +1807,8 @@ MediaWiki interfeysiniñ çeşit tillerge tercime etüvde iştirak etmege istese
 'spam_blanking' => 'Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev',
 
 # Skin names
-'skinname-standard' => 'Standart',
-'skinname-nostalgia' => 'Nostalgiya',
 'skinname-cologneblue' => 'Köln asretligi',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Öz resimleme',
-'skinname-chick' => 'Çipçe',
-'skinname-simple' => 'Adiy',
 
 # Patrol log
 'patrol-log-page' => 'Teşkerüv jurnalı',
@@ -1891,7 +1881,7 @@ Er satır * işaretinen başlamalı. Satırnıñ birinci bağlantısı qоşmağ
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-make' => 'Kamera markası',
 'exif-model' => 'Kamera modeli',
 'exif-artist' => 'Yaratıcısı',
@@ -1916,7 +1906,7 @@ Er satır * işaretinen başlamalı. Satırnıñ birinci bağlantısı qоşmağ
 'exif-gpstimestamp' => 'GPS saatı (atom saatı)',
 'exif-gpssatellites' => 'Ölçemek içün qullanğanı sputnikler',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sıqıştırılmağan',
 
 'exif-orientation-3' => '180° aylandırılğan',
@@ -2100,6 +2090,11 @@ Bitirgen soñ "{{int:Watchlistedit-raw-submit}}" yazısına basıñız.
 'blankpage' => 'Bоş saife',
 'intentionallyblankpage' => 'Bu saife aselet boş qaldırılğan',
 
+# Special:ComparePages
+'comparepages' => 'Saifelerni teñeştirüv',
+'compare-selector' => 'Saifelerniñ versiyalarını teñeştirüv',
+'compare-submit' => 'Teñeştir',
+
 # HTML forms
 'htmlform-reset' => 'Deñişikliklerni keri al',
 
index 6a054af..2d908af 100644 (file)
@@ -17,6 +17,7 @@
  * @author Kaganer
  * @author Kuvaly
  * @author Li-sung
+ * @author Littledogboy
  * @author Martin Kozák
  * @author Matěj Grabovský
  * @author Mercy
@@ -390,8 +391,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zobrazovat počet sledujících uživatelů',
 'tog-oldsig' => 'Stávající podpis:',
 'tog-fancysig' => 'Používat v podpisu wikitext (bez automatického odkazu)',
-'tog-externaleditor' => 'Implicitně používat externí editor (pouze pro pokročilé, vyžaduje speciální nastavení počítače; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
-'tog-externaldiff' => 'Implicitně používat externí porovnávací program (pouze pro pokročilé, vyžaduje speciální nastavení počítače; [//www.mediawiki.org/wiki/Manual:External_editors další informace])',
 'tog-showjumplinks' => 'Používat odkazy „skočit na“ pro vyšší přístupnost',
 'tog-uselivepreview' => 'Používat rychlý náhled (JavaScript) (Experimentální)',
 'tog-forceeditsummary' => 'Upozornit, když nevyplním shrnutí editace',
@@ -406,6 +405,7 @@ $messages = array(
 'tog-showhiddencats' => 'Zobrazit skryté kategorie',
 'tog-noconvertlink' => 'Vypnout konverzi názvů',
 'tog-norollbackdiff' => 'Po vrácení změny nezobrazovat porovnání rozdílů',
+'tog-useeditwarning' => 'Upozornit, když budu opouštět editaci bez uložení změn',
 
 'underline-always' => 'Vždy',
 'underline-never' => 'Nikdy',
@@ -469,6 +469,18 @@ $messages = array(
 'oct' => '10.',
 'nov' => '11.',
 'dec' => '12.',
+'january-date' => '$1. ledna',
+'february-date' => '$1. února',
+'march-date' => '$1. března',
+'april-date' => '$1. dubna',
+'may-date' => '$1. května',
+'june-date' => '$1. června',
+'july-date' => '$1. července',
+'august-date' => '$1. srpna',
+'september-date' => '$1. září',
+'october-date' => '$1. října',
+'november-date' => '$1. listopadu',
+'december-date' => '$1. prosince',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorie|Kategorie}}',
@@ -506,7 +518,7 @@ $messages = array(
 'qbbrowse' => 'Listování',
 'qbedit' => 'Editování',
 'qbpageoptions' => 'Tato stránka',
-'qbmyoptions' => 'Moje volby',
+'qbmyoptions' => 'Moje stránky',
 'qbspecialpages' => 'Speciální stránky',
 'faq' => 'Často kladené otázky',
 'faqpage' => 'Project:Často kladené otázky',
@@ -773,9 +785,18 @@ Uvědomte si, že některé stránky se mohou i nadále zobrazovat, jako byste b
 'welcomecreation-msg' => 'Váš účet byl vytvořen.
 Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SITENAME}}}}]].',
 'yourname' => 'Uživatelské jméno:',
-'yourpassword' => 'Vaše heslo',
+'userlogin-yourname' => 'Uživatelské jméno',
+'userlogin-yourname-ph' => 'Zadejte své uživatelské jméno',
+'yourpassword' => 'Heslo:',
+'userlogin-yourpassword' => 'Heslo',
+'userlogin-yourpassword-ph' => 'Zadejte své heslo',
+'createacct-yourpassword-ph' => 'Zadejte heslo',
 'yourpasswordagain' => 'Zopakujte heslo:',
+'createacct-yourpasswordagain' => 'Potvrzení hesla',
+'createacct-yourpasswordagain-ph' => 'Zadejte heslo ještě jednou',
 'remembermypassword' => 'Zapamatovat si mé přihlášení na tomto počítači (maximálně $1 {{PLURAL:$1|den|dny|dní}})',
+'userlogin-remembermypassword' => 'Přihlásit trvale',
+'userlogin-signwithsecure' => 'Používat zabezpečené připojení',
 'securelogin-stick-https' => 'Zůstat po přihlášení připojen přes HTTPS',
 'yourdomainname' => 'Vaše doména',
 'password-change-forbidden' => 'Na této wiki nemůžete měnit hesla.',
@@ -788,25 +809,45 @@ Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SI
 'logout' => 'Odhlásit se',
 'userlogout' => 'Odhlášení',
 'notloggedin' => 'Nejste přihlášen(a)',
+'userlogin-noaccount' => 'Nemáte účet?',
+'userlogin-joinproject' => 'Přidejte se k {{grammar:3sg|{{SITENAME}}}}',
 'nologin' => "Dosud nemáte účet? '''$1'''.",
 'nologinlink' => 'Zaregistrujte se',
 'createaccount' => 'Vytvořit účet',
 'gotaccount' => "Už jste registrováni? '''$1'''.",
 'gotaccountlink' => 'Přihlaste se',
 'userlogin-resetlink' => 'Zapomněli jste přihlašovací údaje?',
+'userlogin-resetpassword-link' => 'Obnovit heslo',
+'helplogin-url' => 'Help:Přihlášení',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Nápověda k přihlašování]]',
+'createacct-join' => 'Níže zadejte své údaje.',
+'createacct-emailrequired' => 'E-mailová adresa',
+'createacct-emailoptional' => 'E-mailová adresa (nepovinné)',
+'createacct-email-ph' => 'Zadejte svou e-mailovou adresu',
 'createaccountmail' => 'Použít dočasné náhodné heslo a odeslat ho na níže uvedenou e-mailovou adresu',
+'createacct-realname' => 'Skutečné jméno (nepovinné)',
 '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-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í.',
 'userexists' => 'Zadané uživatelské jméno se již používá.
 Zvolte si prosím jiné jméno.',
 'loginerror' => 'Chyba při přihlašování',
+'createacct-error' => 'Chyba při zakládání účtu',
 'createaccounterror' => 'Nepodařilo se vytvořit uživatelský účet: $1',
 'nocookiesnew' => 'Uživatelský účet byl vytvořen, ale nejste přihlášeni. {{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a přihlaste se znovu s vaším novým uživatelským jménem a heslem.',
 'nocookieslogin' => '{{SITENAME}} používá cookies k přihlášení uživatelů. Vy máte cookies vypnuty. Prosím zapněte je a zkuste znovu.',
 'nocookiesfornew' => 'Uživatelský účet nebyl založen, neboť jsme nebyli schopni potvrdit jeho původ.
 Ujistěte se, že máte povoleny cookies, obnovte tuto stránku a zkuste to znovu.',
 'noname' => 'Musíte uvést jméno svého účtu.',
-'loginsuccesstitle' => 'Přihlášení uspělo',
+'loginsuccesstitle' => 'Přihlášení bylo úspěšné',
 'loginsuccess' => 'Nyní jste přihlášen na {{grammar:6sg|{{SITENAME}}}} jako uživatel „$1“.',
 'nosuchuser' => 'Neexistuje uživatel se jménem „$1“. U uživatelských jmen se rozlišují malá/velká písmena. Zkontrolujte zápis, nebo si [[Special:UserLogin/signup|vytvořte nový účet]].',
 'nosuchusershort' => 'Neexistuje uživatel se jménem „$1“. Zkontrolujte zápis.',
@@ -883,21 +924,20 @@ Počkejte chvíli, než to zkusíte znovu.',
 'resetpass-wrong-oldpass' => 'Nesprávné dočasné nebo aktuální heslo.
 Možná jste si již úspěšně heslo změnili, nebo jste si vyžádali nové dočasné heslo.',
 'resetpass-temp-password' => 'Dočasné heslo:',
+'resetpass-abort-generic' => 'Změna hesla byla zablokována rozšířením.',
 
 # Special:PasswordReset
 'passwordreset' => 'Reset hesla',
-'passwordreset-text' => 'Pro obdržení e-mailu s připomenutím detailů vašeho účtu vyplňte tento formulář.',
 'passwordreset-legend' => 'Znovu nastavit heslo',
 'passwordreset-disabled' => 'Znovunastavení hesla je na této wiki zakázáno.',
-'passwordreset-pretext' => '{{PLURAL:$1||Zadejte jeden z údajů níže}}',
+'passwordreset-emaildisabled' => 'E-mailové funkce byly na této wiki vypnuty.',
 'passwordreset-username' => 'Uživatelské jméno:',
 'passwordreset-domain' => 'Doména:',
 'passwordreset-capture' => 'Prohlédnout si výsledný e-mail?',
 'passwordreset-capture-help' => 'Pokud zaškrtnete toto políčko, bude e-mail (s dočasným heslem) kromě zaslání uživateli zobrazen i vám.',
 'passwordreset-email' => 'E-mailová adresa:',
 'passwordreset-emailtitle' => 'Informace k účtu na {{grammar:6sg|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Někdo (patrně vy, z IP adresy $1) zažádal o připomenutí informací k vašemu
-účtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:
+'passwordreset-emailtext-ip' => 'Někdo (patrně vy, z IP adresy $1) zažádal o nastavení nového hesla k vašemu účtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:
 
 $2
 
@@ -905,7 +945,7 @@ $2
 Nyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek
 poslal někdo jiný nebo jste si na své staré heslo vzpomněl(a), 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|Uživatel}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala|zažádal}} o připomenutí informací k vašemu
+'passwordreset-emailtext-user' => '{{gender:$1|Uživatel|Uživatelka}} $1 na {{grammar:6sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala}} o nastavení nového hesla k vašemu
 účtu na {{grammar:6sg|{{SITENAME}}}} ($4). K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:
 
 $2
@@ -916,9 +956,9 @@ poslal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete h
 tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.',
 'passwordreset-emailelement' => 'Uživatelské jméno: $1
 Dočasné heslo: $2',
-'passwordreset-emailsent' => 'E-mail s heslem byl odeslán.',
-'passwordreset-emailsent-capture' => 'Byl vygenerován připomínací e-mail, který je zobrazen níže.',
-'passwordreset-emailerror-capture' => 'Byl vygenerován připomínací e-mail, který je zobrazen níže, ale nepodařilo se ho odeslat uživateli: $1',
+'passwordreset-emailsent' => 'E-mail pro získání nového hesla byl odeslán.',
+'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 nepodařilo se ho odeslat {{GENDER:$2|uživateli|uživatelce}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Změna e-mailové adresy',
@@ -1122,11 +1162,14 @@ Podrobnosti si můžete prohlédnout v níže zobrazeném seznamu provedených p
 Zřejmě byla smazána.',
 'edit-conflict' => 'Editační konflikt.',
 'edit-no-change' => 'Vaše editace byla ignorována, protože nedošlo k žádné změně textu.',
+'postedit-confirmation' => 'Vaše změny byly uloženy.',
 'edit-already-exists' => 'Nepodařilo se vytvořit novou stránku, protože již existuje.',
 'defaultmessagetext' => 'Výchozí text hlášení',
 'content-failed-to-parse' => 'Nepodařilo se zpracovat data $2 do modelu $1: $3',
 'invalid-content-data' => 'Obsažená data jsou chybná',
 'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
+'editwarning-warning' => 'Opuštěním této stránky se mohou veškeré provedené změny ztratit.
+Pokud jste {{GENDER:|přihlášen|přihlášena|přihlášeni}}, můžete si toto varování vypnout na záložce „Editace“ v uživatelském nastavení.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1332,7 +1375,7 @@ Ujistěte se, že tato změna udrží souvislost a posloupnost verzí v historii
 'mergelogpagetext' => 'Níže je seznam nejnovějších sloučení historie jedné stránky s jinou.',
 
 # Diffs
-'history-title' => '$1: Historie verzí',
+'history-title' => 'Historie verzí stránky „$1“',
 'difference-title' => '$1: Porovnání verzí',
 'difference-title-multipage' => '$1 a $2: Porovnání stránek',
 'difference-multipage' => '(Rozdíly mezi stránkami)',
@@ -1409,15 +1452,7 @@ Pokud na začátek dotazu přidáte ''all:'', bude se hledat všude (včetně di
 'powersearch-togglenone' => 'Nic',
 'search-external' => 'Externí hledání',
 'searchdisabled' => '<p>Omlouváme se. Plnotextové vyhledávání je dočasně nedostupné. Zatím můžete zkusit vyhledávání Googlem; je ale možné, že jeho výsledky nemusí být aktuální.</p>',
-
-# Quickbar
-'qbsettings' => 'Nastavení lišty nástrojů',
-'qbsettings-none' => 'Žádný',
-'qbsettings-fixedleft' => 'Leží vlevo',
-'qbsettings-fixedright' => 'Leží vpravo',
-'qbsettings-floatingleft' => 'Plovoucí vlevo',
-'qbsettings-floatingright' => 'Plovoucí vpravo',
-'qbsettings-directionality' => 'Pevný v závislosti na směrovosti vašeho písma',
+'search-error' => 'Při hledání došlo k chybě: $1',
 
 # Preferences page
 'preferences' => 'Nastavení',
@@ -1496,7 +1531,7 @@ Můžete použít tuto náhodně vygenerovanou hodnotu: $1',
 Tuto operaci nelze vrátit zpět.',
 'prefs-emailconfirm-label' => 'Ověření e-mailu:',
 'prefs-textboxsize' => 'Velikost editačního okna',
-'youremail' => 'Vaše e-mailová adresa:',
+'youremail' => 'E-mail:',
 'username' => '{{GENDER:$1|Uživatelské jméno}}:',
 'uid' => '{{GENDER:$1|Uživatelské}} ID:',
 'prefs-memberingroups' => '{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupin}}:',
@@ -1505,7 +1540,7 @@ Tuto operaci nelze vrátit zpět.',
 'yourlanguage' => 'Jazyk rozhraní:',
 'yourvariant' => 'Varianta jazyka obsahu:',
 'prefs-help-variant' => 'Vámi preferovaná varianta nebo pravopis, jak se mají na této wiki zobrazovat obsahové stránky.',
-'yournick' => 'Podpis:',
+'yournick' => 'Nový podpis:',
 'prefs-help-signature' => 'Komentáře v diskusích by se měly podepisovat pomocí „<nowiki>~~~~</nowiki>“, což se změní na váš podpis a aktuální čas.',
 'badsig' => 'Chybný podpis, zkontrolujte syntaxi HTML.',
 'badsiglength' => 'Váš podpis je příliš dlouhý. Musí být kratší než $1 {{PLURAL:$1|znak|znaky|znaků}}.',
@@ -1517,7 +1552,8 @@ Tuto operaci nelze vrátit zpět.',
 'email' => 'E-mail',
 'prefs-help-realname' => 'Skutečné jméno (volitelné): pokud ho zadáte, bude použito pro označení autorství vaší práce.',
 'prefs-help-email' => 'Uvedení e-mailu není povinné, ale umožní zaslání nového hesla v případě, že své heslo zapomenete.',
-'prefs-help-email-others' => 'Také můžete dovolit ostatním uživatelům vás prostřednictvím uživatelské stránky kontaktovat, aniž by byla vaše adresa prozrazena.',
+'prefs-help-email-others' => 'Také můžete dovolit ostatním uživatelům vás prostřednictvím uživatelské stránky kontaktovat.
+Vaše adresa v takovém případě není prozrazena.',
 'prefs-help-email-required' => 'Je vyžadována e-mailová adresa.',
 'prefs-info' => 'Základní údaje',
 'prefs-i18n' => 'Lokalizace',
@@ -1559,6 +1595,7 @@ Tuto operaci nelze vrátit zpět.',
 'userrights-notallowed' => 'Váš účet nemá oprávnění měnit uživatelská práva.',
 'userrights-changeable-col' => 'Skupiny, které můžete měnit',
 'userrights-unchangeable-col' => 'Skupiny, které nemůžete měnit',
+'userrights-conflict' => 'Konflikt uživatelských práv! Proveďte požadované změny ještě jednou.',
 
 # Groups
 'group' => 'Skupina:',
@@ -1741,7 +1778,7 @@ $3',
 # Upload
 'upload' => 'Načíst soubor',
 'uploadbtn' => 'Načíst soubor',
-'reuploaddesc' => 'Vrátit se k načtení.',
+'reuploaddesc' => 'Zrušit načítání a vrátit se do formuláře.',
 'upload-tryagain' => 'Uložit upravený popis souboru',
 'uploadnologin' => 'Nejste přihlášen(a)',
 'uploadnologintext' => 'Pro načtení souboru se musíte [[Special:UserLogin|přihlásit]].',
@@ -1965,7 +2002,6 @@ Z bezpečnostních důvodů je img_auth.php vypnuto.',
 'http-read-error' => 'Chyba při čtení HTTP.',
 'http-timed-out' => 'Čas pro HTTP požadavek vypršel.',
 'http-curl-error' => 'Chyba při čtení z URL: $1',
-'http-host-unreachable' => 'Nepodařilo se kontaktovat URL',
 'http-bad-status' => 'Při provádění HTTP požadavku nastal problém: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2152,7 +2188,7 @@ Každý řádek obsahuje odkaz na první a druhé přesměrování a k tomu cíl
 'ncategories' => '$1 {{PLURAL:$1|kategorie|kategorie|kategorií}}',
 'ninterwikis' => '$1 {{PLURAL:$1|mezijazykový odkaz|mezijazykové odkazy|mezijazykových odkazů}}',
 'nlinks' => '$1 {{PLURAL:$1|odkaz|odkazy|odkazů}}',
-'nmembers' => '$1 {{PLURAL:$1|stránka|stránky|stránek}}',
+'nmembers' => '$1 {{PLURAL:$1|položka|položky|položek}}',
 'nrevisions' => '$1 {{PLURAL:$1|revize|revize|revizí}}',
 'nviews' => '$1 {{PLURAL:$1|návšteva|návštevy|návštev}}',
 'nimagelinks' => 'Použit na $1 {{PLURAL:$1|stránce|stránkách}}',
@@ -2347,7 +2383,7 @@ E-mailová adresa, kterou máte uvedenu v [[Special:Preferences|nastavení]], se
 'emailsend' => 'Odeslat',
 'emailccme' => 'Poslat kopii zprávy na můj e-mail',
 'emailccsubject' => 'Kopie Vaší zprávy pro uživatele $1: $2',
-'emailsent' => 'Zpráva odeslána',
+'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 „Poslat e-mail“; odeslal ho uživatel $1 uživateli $2',
 
@@ -2376,8 +2412,8 @@ Ve [[Special:Watchlist|sledovaných stránkách]] se tak budou objevovat budouc
 'notvisiblerev' => 'Verze byla smazána',
 'watchnochange' => 'Žádná ze sledovaných položek nebyla editována v době, která je zobrazena.',
 'watchlist-details' => 'Na svém seznamu sledovaných stránek máte $1 {{PLURAL:$1|stránku|stránky|stránek}}, nepočítají se diskusní stránky.',
-'wlheader-enotif' => 'Upozorňování e-mailem je zapnuto.',
-'wlheader-showupdated' => "* Stránky, které se změnily od vaší poslední návštěvy, jsou zobrazeny '''tučně'''",
+'wlheader-enotif' => 'Upozorňování e-mailem je zapnuto.',
+'wlheader-showupdated' => "Stránky, které se změnily od vaší poslední návštěvy, jsou zobrazeny '''tučně'''.",
 'watchmethod-recent' => 'hledají se sledované stránky mezi posledními změnami',
 'watchmethod-list' => 'hledají se nejnovější editace sledovaných stránek',
 'watchlistcontains' => 'Na svém seznamu sledovaných stránek máte $1 {{PLURAL:$1|položku|položky|položek}}.',
@@ -2485,7 +2521,7 @@ Poslední editaci této stránky provedl(a) [[User:$3|$3]] ([[User talk:$3|disku
 'sessionfailure-title' => 'Chyba sezení',
 'sessionfailure' => 'Zřejmě je nějaký problém s vaším přihlášením;
 vámi požadovaná činnost byla stornována jako prevence před neoprávněným přístupem.
-Stiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli a zkuste činnost znovu.',
+Stiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.',
 
 # Protect
 'protectlogpage' => 'Kniha zamčení',
@@ -2777,6 +2813,7 @@ Vizte též [[Special:BlockList|seznam všech probíhajících bloků]].',
 'proxyblocksuccess' => 'Hotovo.',
 'sorbsreason' => 'Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server.',
 'sorbs_create_account_reason' => 'Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server. Z této adresy si nemůžete založit účet',
+'xffblockreason' => 'IP adresa uvedená v hlavičce X-Forwarded-For, ať už vaše, nebo patřící proxy serveru, který používáte, byla zablokována. Zdůvodnění tohoto zablokování: $1',
 'cant-block-while-blocked' => 'Nemůžete blokovat jiné uživatele, když jste zablokován(a).',
 'cant-see-hidden-user' => 'Uživatel, kterého se snažíte blokovat, už byl zablokován a skryt. Jelikož nemáte oprávnění hideuser, nemůžete si nastavení bloku tohoto uživatele prohlédnout ani ho změnit.',
 'ipbblocked' => 'Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}',
@@ -2934,6 +2971,8 @@ Pokud si přejete přispívat k lokalizaci softwaru MediaWiki, navštivte [//www
 'thumbnail-more' => 'Zvětšit',
 'filemissing' => 'Chybějící soubor',
 'thumbnail_error' => 'Chyba při vytváření náhledu: $1',
+'thumbnail_error_remote' => 'Chybové hlášení z {{grammar:2sg|$1}}:
+$2',
 'djvu_page_error' => 'Stránka DjVu mimo rozsah',
 'djvu_no_xml' => 'Vytvoření XML pro soubor DjVu se nezdařilo.',
 'thumbnail-temp-create' => 'Dočasný soubor náhledu nelze vytvořit.',
@@ -3080,17 +3119,11 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 
 # Stylesheets
 'common.css' => '/* Zde uvedené CSS bude ovlivňovat všechny styly */',
-'standard.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Klasický“  */',
-'nostalgia.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Nostalgie“  */',
 'cologneblue.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Kolínská modř“  */',
 'monobook.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Monobook“ */',
-'myskin.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Můj vzhled“ */',
-'chick.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Kuře“ */',
-'simple.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Jednoduchý“ */',
 'modern.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Moderní“ */',
 'vector.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „Vektor“ */',
 'print.css' => '/* Zde uvedené CSS bude ovlivňovat tiskový výstup */',
-'handheld.css' => '/* Zde uvedené CSS bude ovlivňovat přenosná zařízení vycházející ze stylu nastaveného v proměnné $wgHandheldStyle */',
 'noscript.css' => '/* Zde uvedené CSS bude ovlivňovat uživatele s vypnutým JavaScriptem */',
 'group-autoconfirmed.css' => '/* Zde uvedené CSS bude ovlivňovat pouze automaticky schválené uživatele */',
 'group-bot.css' => '/* Zde uvedené CSS bude ovlivňovat pouze boty */',
@@ -3099,13 +3132,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 
 # Scripts
 'common.js' => '/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky.  */',
-'standard.js' => '/* JavaScript pro uživatele používající vzhled „Klasický“ */',
-'nostalgia.js' => '/* JavaScript pro uživatele používající vzhled „Nostalgie“  */',
 'cologneblue.js' => '/* JavaScript pro uživatele používající vzhled „Kolínská modř“  */',
 'monobook.js' => '/* JavaScript pro uživatele používající vzhled MonoBook */',
-'myskin.js' => '/* JavaScript pro uživatele používající vzhled „Můj vzhled“ */',
-'chick.js' => '/* JavaScript pro uživatele používající vzhled „Kuře“ */',
-'simple.js' => '/* JavaScript pro uživatele používající vzhled „Jednoduchý“ */',
 'modern.js' => '/* JavaScript pro uživatele používající vzhled „Moderní“ */',
 'vector.js' => '/* JavaScript pro uživatele používající vzhled „Vektor“ */',
 'group-autoconfirmed.js' => '/* Zde uvedený JavaScript bude použit pouze pro automaticky schválené uživatele */',
@@ -3184,12 +3212,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-category-files' => 'Počet souborů',
 
 # Skin names
-'skinname-standard' => 'Klasický',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Kolínská modř',
-'skinname-myskin' => 'Můj vzhled',
-'skinname-chick' => 'Kuře',
-'skinname-simple' => 'Jednoduchý',
 'skinname-modern' => 'Moderní',
 'skinname-vector' => 'Vektor',
 
@@ -3269,11 +3292,25 @@ Otevřením souboru můžete ohrozit svůj počítač.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuty|$1 minut}}',
 'hours' => '{{PLURAL:$1|$1 hodina|$1 hodiny|$1 hodin}}',
 'days' => '{{PLURAL:$1|$1 den|$1 dny|$1 dní}}',
-'months' => '{{PLURAL:$1|$1 měsícem|$1 měsíci}}',
-'years' => '{{PLURAL:$1|$1 rokem|$1 roky}}',
+'weeks' => '{{PLURAL:$1|$1 týden|$1 týdny|$1 týdnů}}',
+'months' => '{{PLURAL:$1|$1 měsíc|$1 měsíce|$1 měsíců}}',
+'years' => '{{PLURAL:$1|$1 rok|$1 roky|$1 let}}',
 'ago' => 'před $1',
 'just-now' => 'právě teď',
 
+# Human-readable timestamps
+'hours-ago' => 'před $1 {{PLURAL:$1|hodinou|hodinami}}',
+'minutes-ago' => 'před $1 {{PLURAL:$1|minutou|minutami}}',
+'seconds-ago' => 'před $1 {{PLURAL:$1|sekundou|sekundami}}',
+'monday-at' => 'v pondělí v $1',
+'tuesday-at' => 'v úterý v $1',
+'wednesday-at' => 've středu v $1',
+'thursday-at' => 've čtvrtek v $1',
+'friday-at' => 'v pátek v $1',
+'saturday-at' => 'v sobotu v $1',
+'sunday-at' => 'v neděli v $1',
+'yesterday-at' => 'včera v $1',
+
 # Bad image list
 'bad_image_list' => 'Tato stránka má následující formát:
 
@@ -3299,7 +3336,7 @@ Obsahuje pouze seznam s odrážkami (řádka začíná s *). První odkaz na ř
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šířka',
 'exif-imagelength' => 'Výška',
 'exif-bitspersample' => 'Bitů na složku',
@@ -3477,7 +3514,7 @@ Obsahuje pouze seznam s odrážkami (řádka začíná s *). První odkaz na ř
 'exif-originalimageheight' => 'Výška obrázku před oříznutím',
 'exif-originalimagewidth' => 'Šířka obrázku před oříznutím',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nekomprimovaný',
 'exif-compression-2' => '1-rozměrné modifikované Huffmanovo kódování délky běhu CCITT Group 3',
 'exif-compression-3' => 'Kódování faxů CCITT Group 3',
@@ -3813,7 +3850,7 @@ Opravdu si přejete znovu tuto stránku založit?',
 'autosumm-blank' => 'Stránka vyprázdněna',
 'autosumm-replace' => 'Obsah stránky nahrazen textem „$1“',
 'autoredircomment' => 'Přesměrování na [[$1]]',
-'autosumm-new' => 'Založena nová stránka: $1',
+'autosumm-new' => 'Založena nová stránka s textem „$1“',
 
 # Size units
 'size-kilobytes' => '$1 KB',
@@ -3951,12 +3988,17 @@ MediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOL
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cesta k článkům]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cesta ke skriptům]',
 
-# Special:FilePath
-'filepath' => 'Cesta k souboru',
-'filepath-page' => 'Soubor:',
-'filepath-submit' => 'Přejít',
-'filepath-summary' => 'Tato speciální stránka vrátí úplnou cestu k souboru.
-Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v přiřazených programech.',
+# Special:Redirect
+'redirect' => 'Přesměrování podle souboru, uživatele nebo ID revize',
+'redirect-legend' => 'Přesměrování na soubor či stránku',
+'redirect-summary' => 'Tato speciální stránka přesměrovává na soubor (podle názvu), stránku (podle ID revize) nebo uživatele (podle číselného uživatelského ID).',
+'redirect-submit' => 'Přejít',
+'redirect-lookup' => 'Najít:',
+'redirect-value' => 'Hodnota:',
+'redirect-user' => 'Uživatelské ID',
+'redirect-revision' => 'Revizi stránky',
+'redirect-file' => 'Jméno souboru',
+'redirect-not-exists' => 'Hodnota nenalezena',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Hledání duplicitních souborů',
@@ -4046,23 +4088,26 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'htmlform-submit' => 'Odeslat',
 'htmlform-reset' => 'Vrátit změny',
 'htmlform-selectorother-other' => 'Jiná hodnota',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Ano',
+'htmlform-chosen-placeholder' => 'Zvolte možnost',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podporou plnotextového vyhledávání',
 'sqlite-no-fts' => '$1 bez podpory plnotextového vyhledávání',
 
 # New logging system
-'logentry-delete-delete' => '$1 smazal stránku $3',
-'logentry-delete-restore' => '$1 obnovil stránku $3',
-'logentry-delete-event' => '$1 změnil viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
-'logentry-delete-revision' => '$1 změnil viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
-'logentry-delete-event-legacy' => '$1 změnil viditelnost protokolovacích záznamů ke stránce $3',
-'logentry-delete-revision-legacy' => '$1 změnil viditelnost revizí na stránce $3',
-'logentry-suppress-delete' => '$1 utajil stránku $3',
-'logentry-suppress-event' => '$1 utajeně změnil viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
-'logentry-suppress-revision' => '$1 utajeně změnil viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
-'logentry-suppress-event-legacy' => '$1 utajeně změnil viditelnost protokolovacích záznamů ke stránce $3',
-'logentry-suppress-revision-legacy' => '$1 utajeně změnil viditelnost revizí na stránce $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|smazal|smazala}} stránku $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|obnovil|obnovila}} stránku $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|změnil|změnila}} viditelnost revizí na stránce $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|utajil|utajila}} stránku $3',
+'logentry-suppress-event' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4',
+'logentry-suppress-revision' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} na stránce $3: $4',
+'logentry-suppress-event-legacy' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3',
+'logentry-suppress-revision-legacy' => '$1 utajeně {{GENDER:$2|změnil|změnila}} viditelnost revizí na stránce $3',
 'revdelete-content-hid' => 'skryt obsah',
 'revdelete-summary-hid' => 'skryto shrnutí editace',
 'revdelete-uname-hid' => 'skryto uživatelské jméno',
@@ -4071,20 +4116,20 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'revdelete-uname-unhid' => 'odkryto uživatelské jméno',
 'revdelete-restricted' => 'omezení správců použito',
 'revdelete-unrestricted' => 'omezení správců odstraněno',
-'logentry-move-move' => '$1 přesunul stránku $3 na $4',
-'logentry-move-move-noredirect' => '$1 přesunul stránku $3 na $4 bez založení přesměrování',
-'logentry-move-move_redir' => '$1 přesunul stránku $3 na $4 s výměnou přesměrování',
-'logentry-move-move_redir-noredirect' => '$1 přesunul stránku $3 na $4 místo přesměrování bez založení přesměrování',
-'logentry-patrol-patrol' => '$1 označil revizi $4 stránky $3 jako prověřenou',
-'logentry-patrol-patrol-auto' => '$1 automaticky označil revizi $4 stránky $3 jako prověřenou',
-'logentry-newusers-newusers' => 'Byl založen uživatelský účet $1',
-'logentry-newusers-create' => 'Byl založen uživatelský účet $1',
-'logentry-newusers-create2' => '$1 založil uživatelský účet $3',
+'logentry-move-move' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 bez založení přesměrování',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 s výměnou přesměrování',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 místo přesměrování bez založení přesměrování',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|označil|označila}} revizi $4 stránky $3 jako prověřenou',
+'logentry-patrol-patrol-auto' => '$1 automaticky {{GENDER:$2|označil|označila}} revizi $4 stránky $3 jako prověřenou',
+'logentry-newusers-newusers' => 'Byl {{GENDER:$2|založen}} uživatelský účet $1',
+'logentry-newusers-create' => 'Byl {{GENDER:$2|založen}} uživatelský účet $1',
+'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 založen účet $1',
+'logentry-newusers-autocreate' => 'Automaticky byl {{GENDER:$2|založen}} účet $1',
 'logentry-rights-rights' => '$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách z $4 na $5',
-'logentry-rights-rights-legacy' => '$1 změnil členství $3 ve skupinách',
-'logentry-rights-autopromote' => '$1 byl automaticky povýšen 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',
 'rightsnone' => '(žádné)',
 
 # Feedback
index ae8744a..ef63944 100644 (file)
@@ -68,8 +68,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pòkażë lëczba ùzérającëch brëkòwników',
 'tog-oldsig' => 'Pòdzérk wëzdrzatkù twòjegò pòdpisënka',
 'tog-fancysig' => 'Wzérôj na pòdpisënk jakno na wikikòd (bez aùtomatnych lënków)',
-'tog-externaleditor' => 'Brëkùjë domëslno bùtnowégò editora (blós dlô ekspertów, je nót ekstra nastôwów w twòjim kòmpùtrze)',
-'tog-externaldiff' => 'Brëkùjë domëslno bùtnowégò nôrzãdza diff (blós dlô ekspertów.je nót ekstra nastôwów w twòjim kòmpùtrze)',
 'tog-showjumplinks' => 'Włączë lënczi przëstãpù "òbaczë téż"',
 'tog-uselivepreview' => 'Brëkùjë wtimczasnegò pòdzérkù (JavaScript) (eksperimentalné)',
 'tog-forceeditsummary' => 'Pëtôj przed wéńdzenim do pùstégò pòdrechòwania edicëji',
@@ -583,9 +581,6 @@ Spróbùjë szëkbë z przëdôwkã ''all:'' dlô całowny zamkłoscë starnów
 'powersearch-redir' => 'Lësta przeczerowaniów',
 'powersearch-field' => 'Szëkba za',
 
-# Quickbar
-'qbsettings' => 'Sztrépk chùtczégò przistãpù',
-
 # Preferences page
 'preferences' => 'Preferencëje',
 'mypreferences' => 'Mòje nastôwë',
@@ -890,7 +885,7 @@ Mòżesz zawãżëc wëszłosc przez wëbranié ôrtu registru, miona brëkòwni
 # Special:ListGroupRights
 'listgrouprights-members' => '(lësta nôlëżników karna)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Wëslë e-maila do negò brëkòwnika',
 'emailpage' => 'Sélajë e-mail do brëkòwnika',
 'defemailsubject' => 'E-mail òd {{SITENAME}}',
@@ -917,7 +912,7 @@ Czej chcesz remôc starnã z lëste ùzéronëch artiklów, klikni ''Òprzestôj
 'unwatchthispage' => 'Òprzestôj ùzerac ną starnã',
 'notanarticle' => 'To nie je artikel',
 'watchlist-details' => 'Ùzérôsz {{PLURAL:$1|$1 artikel|$1 artikle/-ów}}, nie rechùjąc diskùsëjów.',
-'wlheader-showupdated' => "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
+'wlheader-showupdated' => "Artiklë jakczé òsta zmienioné òd Twòji slédny wizytë są wëapratnioné '''pògrëbieniém'''",
 'watchmethod-list' => 'szëkba ùzérónëch artiklów westrzód pòslédnëch edicëjów',
 'watchlistcontains' => 'Na twòji lësce ùzérónëch artiklów {{PLURAL:$1|je 1 strana|są $1 starnë|je $1 starnów}}.',
 'wlnote' => "Niżi môsz wëskrzënioné {{PLURAL:$1|slédną zmianã|'''$1''' slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|'''$2''' gòdzënë/gòdzënów}}.",
@@ -1227,7 +1222,7 @@ Jinszé pòla bãdą domëslno zataconé.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-source' => 'Zdrój',
 'exif-languagecode' => 'Jãzëk',
 
@@ -1243,7 +1238,7 @@ Jinszé pòla bãdą domëslno zataconé.
 'monthsall' => 'wszëtczé',
 'limitall' => 'wszëtczé',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail_loggedin' => 'Twòjô adresa e-mail òsta pòcwierdzona.',
 
 # action=purge
index 89e0d8f..7223552 100644 (file)
@@ -760,7 +760,7 @@ $messages = array(
 # Special:NewFiles
 'ilsubmit' => 'ищи',
 
-# EXIF tags
+# Exif tags
 'exif-artist' => 'творьць',
 
 # 'all' in various places, this might be different for inflected languages
@@ -792,9 +792,6 @@ $messages = array(
 'version-license' => 'прощєниѥ',
 'version-software-version' => 'обраꙁъ',
 
-# Special:FilePath
-'filepath-page' => 'дѣло :',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'ищи',
 
index 377a32c..0be8a21 100644 (file)
@@ -71,8 +71,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Страницăна миçе хутшăнакан сăнав списокне кĕртнине кăтартмалла',
 'tog-oldsig' => 'Хальхи алӑ пусни:',
 'tog-fancysig' => 'Хăвăр тунă алă пуснин вики-паллисем',
-'tog-externaleditor' => 'Палăртман чухне тулашри редактора усă курмалла',
-'tog-externaldiff' => 'Палăртман чухне версисене танлаштарма тулашри программăна усă курмалла',
 'tog-showjumplinks' => '«... патне куç» хушма каçăсене усă курмалла',
 'tog-uselivepreview' => 'Хăвăрт кăтартакан малтанхи курăнăва усă курмалла (JavaScript, экспериментлă)',
 'tog-forceeditsummary' => 'Тӳрлетӳсен кĕске ăнлантарăвне кăтартман чухне асăрхаттармалла',
@@ -587,9 +585,6 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
 'powersearch' => 'Анлă шырав',
 'powersearch-legend' => 'Анлă шырав',
 
-# Quickbar
-'qbsettings' => 'Навигаци хăми',
-
 # Preferences page
 'preferences' => 'Ĕнерлевсем',
 'mypreferences' => 'Ман ĕнерлевсем',
@@ -888,7 +883,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listgrouprights-group' => 'Ушкăн',
 'listgrouprights-helppage' => 'Help:Ушкăн прависем',
 
-# E-mail user
+# Email user
 'emailuser' => 'Хутшăнакана çыру яр... (Письмо участнику)',
 'usermailererror' => 'Электронлă почта урлă пĕлтерӳ янă чухне йăнăш тухрĕ:',
 'noemailtitle' => 'Электронлă почта адресĕ çук',
@@ -1128,7 +1123,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Metadata
 'metadata' => 'Метаданнăйсем:',
 
-# EXIF tags
+# Exif tags
 'exif-exifversion' => 'Exif версийĕ',
 'exif-flashpixversion' => 'Ĕçлеме пултаракан FlashPix версийĕ',
 'exif-gpsversionid' => 'GPS-информаци блокĕн версийĕ',
@@ -1147,7 +1142,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchlistall2' => 'пурте',
 'namespacesall' => 'пурте',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail_sent' => 'Çирĕплетмелли ыйтуллă çырăва ятăмăр.',
 'confirmemail_success' => 'Сирĕн электронлă почтăн адресне çирĕплентĕ.',
 'confirmemail_loggedin' => 'Сирĕн электронлă почтăн адресне çирĕплетрĕмĕр.',
@@ -1193,10 +1188,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:Version
 'version' => 'MediaWiki версийĕ',
 
-# Special:FilePath
-'filepath' => 'Файл çулĕ',
-'filepath-submit' => 'Çул',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пĕр пек файлсен шыравĕ',
 'fileduplicatesearch-legend' => 'Дубликатсен шыравĕ',
index 6d0156c..a7e2343 100644 (file)
@@ -122,7 +122,7 @@ $messages = array(
 'tog-justify' => 'Unioni paragraffau',
 'tog-hideminor' => 'Cuddio golygiadau bychain yn rhestr y newidiadau diweddar',
 'tog-hidepatrolled' => 'Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr newidiadau diweddar',
-'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag y rhestr dudalennau newydd',
+'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag rhestr y tudalennau newydd',
 'tog-extendwatchlist' => "Ehangu'r rhestr wylio i ddangos pob golygiad yn hytrach na'r diweddaraf yn unig",
 'tog-usenewrc' => "Yn dangos newidiadau i un dudalen gyda'i gilydd - ar 'newidiadau diweddar' a'r 'rhestr wylio' (angen JavaScript)",
 'tog-numberheadings' => "Rhifo penawdau'n awtomatig",
@@ -147,8 +147,6 @@ $messages = array(
 'tog-shownumberswatching' => "Dangos y nifer o ddefnyddwyr sy'n gwylio",
 'tog-oldsig' => 'Y llofnod cyfredol:',
 'tog-fancysig' => 'Trin y llofnod fel testun wici (heb gyswllt wici awtomatig)',
-'tog-externaleditor' => 'Defnyddio golygydd allanol trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
-'tog-externaldiff' => 'Defnyddio "external diff" trwy ragosodiad (ar gyfer arbenigwyr yn unig; mae arno angen gosodiadau arbennig ar eich cyfrifiadur. [//www.mediawiki.org/wiki/Manual:External_editors Rhagor o wybodaeth.])',
 'tog-showjumplinks' => 'Galluogi dolenni hygyrchedd "neidio i"',
 'tog-uselivepreview' => 'Defnyddio rhagolwg byw (JavaScript) (Arbrofol)',
 'tog-forceeditsummary' => 'Tynnu fy sylw pan adawaf flwch crynodeb golygu yn wag',
@@ -158,10 +156,11 @@ $messages = array(
 'tog-watchlisthideliu' => 'Cuddio golygiadau gan ddefnyddwyr mewngofnodedig rhag y rhestr wylio',
 'tog-watchlisthideanons' => 'Cuddio golygiadau gan ddefnyddwyr anhysbys rhag y rhestr wylio',
 'tog-watchlisthidepatrolled' => 'Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr wylio',
-'tog-ccmeonemails' => 'Anfoner copi ataf pan anfonaf e-bost at ddefnyddiwr arall',
+'tog-ccmeonemails' => 'Anfon copi ataf pan anfonaf e-bost at ddefnyddiwr arall',
 'tog-diffonly' => "Peidio â dangos cynnwys y dudalen islaw'r gymhariaeth ar dudalennau cymharu",
 'tog-showhiddencats' => 'Dangos categorïau cuddiedig',
 'tog-norollbackdiff' => 'Hepgor dangos cymhariaeth ar ôl gwrthdroi golygiad',
+'tog-useeditwarning' => "Tynnwch fy sylw pan wyf ar fin gadael tudalen olygu heb roi'r newidiadau ar gadw",
 
 'underline-always' => 'Bob amser',
 'underline-never' => 'Byth',
@@ -225,6 +224,18 @@ $messages = array(
 'oct' => 'Hyd',
 'nov' => 'Tach',
 'dec' => 'Rhag',
+'january-date' => '$1 Ionawr',
+'february-date' => '$1 Chwefror',
+'march-date' => '$1 Mawrth',
+'april-date' => '$1 Ebrill',
+'may-date' => '$1 Mai',
+'june-date' => '$1 Mehefin',
+'july-date' => '$1 Gorffennaf',
+'august-date' => '$1 Awst',
+'september-date' => '$1 Medi',
+'october-date' => '$1 Hydref',
+'november-date' => '$1 Tachwedd',
+'december-date' => '$1 Rhagfyr',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categori|Categori|Categorïau|Categorïau|Categorïau|Categorïau}}',
@@ -301,12 +312,12 @@ $messages = array(
 'print' => 'Argraffu',
 'view' => 'Darllen',
 'edit' => 'Golygu',
-'create' => 'Creu',
+'create' => 'Dechrau',
 'editthispage' => 'Golygwch y dudalen hon',
 'create-this-page' => "Creu'r dudalen",
 'delete' => 'Dileu',
 'deletethispage' => 'Dileer y dudalen hon',
-'undelete_short' => 'Adfer $1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad|golygiad|golygiad}}',
+'undelete_short' => 'Adfer $1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}}',
 'viewdeleted_short' => "Edrych ar y {{PLURAL:$1|golygiad sydd wedi'i ddileu|golygiad sydd wedi'i ddileu|$1 olygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu|$1 golygiad sydd wedi'u dileu}}",
 'protect' => 'Diogelu',
 'protect_change' => 'newid',
@@ -528,11 +539,20 @@ Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddec
 'welcomeuser' => 'Croeso, $1!',
 'welcomecreation-msg' => 'Peidiwch ag anghofio newid eich [[Special:Preferences|{{SITENAME}} preferences]].',
 'yourname' => 'Eich enw defnyddiwr:',
-'yourpassword' => 'Eich cyfrinair:',
+'userlogin-yourname' => 'Enw Defnyddiwr',
+'userlogin-yourname-ph' => 'Rhowch eich enw defnyddiwr',
+'yourpassword' => 'Cyfrinair:',
+'userlogin-yourpassword' => 'Cyfrinair',
+'userlogin-yourpassword-ph' => 'Teipiwch eich cyfrinair',
+'createacct-yourpassword-ph' => 'Rhowch gyfrinair',
 'yourpasswordagain' => 'Ail-deipiwch y cyfrinair:',
-'remembermypassword' => "Y porwr hwn i gofio'r manylion mewngofnodi (am hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})",
+'createacct-yourpasswordagain' => 'Gwirwch eich cyfrinair',
+'createacct-yourpasswordagain-ph' => 'Rhowch eich cyfrinair eto',
+'remembermypassword' => "Y porwr hwn i gofio'r manylion mewngofnodi (am hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod}})",
+'userlogin-remembermypassword' => "Cadw'r sesiwn yn fyw tan i mi allgofnodi",
+'userlogin-signwithsecure' => 'Defnyddio cysylltiad diogel',
 'securelogin-stick-https' => "Cadw'r cyswllt â HTTPS ar ôl mewngofnodi",
-'yourdomainname' => 'Eich parth',
+'yourdomainname' => 'Eich parth:',
 'password-change-forbidden' => 'Ni allwch newid cyfrineiriau ar y wici hwn.',
 'externaldberror' => "Naill ai: cafwyd gwall dilysu allanol ar databas neu: ar y llaw arall efallai nad oes hawl gennych chi i ddiwygio'ch cyfrif allanol.",
 'login' => 'Mewngofnodi',
@@ -543,18 +563,38 @@ Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddec
 'logout' => 'Allgofnodi',
 'userlogout' => 'Allgofnodi',
 'notloggedin' => 'Nid ydych wedi mewngofnodi',
+'userlogin-noaccount' => 'Dim cyfrif gennych?',
+'userlogin-joinproject' => 'Ymuno â {{SITENAME}}',
 'nologin' => "Dim cyfrif gennych? '''$1'''.",
 'nologinlink' => 'Crëwch gyfrif',
 'createaccount' => 'Creu cyfrif newydd',
 'gotaccount' => "Oes cyfrif gennych eisoes? '''$1'''.",
 'gotaccountlink' => 'Mewngofnodwch',
 'userlogin-resetlink' => 'Ydych chi wedi anghofio eich manylion mewngofnodi?',
+'userlogin-resetpassword-link' => 'Ailosod eich cyfrinair',
+'helplogin-url' => 'Help:Mewngofnodi',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Cymorth i fewngofnodi]]',
+'createacct-join' => 'Rhowch eich manylion isod',
+'createacct-emailrequired' => 'Cyfeiriad ebost',
+'createacct-emailoptional' => 'Cyfeiriad ebost (dewisol)',
+'createacct-email-ph' => 'Rhowch eich cyfeiriad ebost',
 'createaccountmail' => "Defnyddier cyfrinair ar hap dros dro a'i anfon i'r cyfeiriad e-bost isod",
+'createacct-realname' => 'Enw cywir (dewisiol)',
 'createaccountreason' => 'Rheswm:',
+'createacct-reason' => 'Rheswm',
+'createacct-reason-ph' => 'Pam ydych yn creu cyfrif arall?',
+'createacct-captcha' => 'Gwiriad diogelwch',
+'createacct-imgcaptcha-ph' => 'Nodwch y testun a welwch uchod',
+'createacct-submit' => 'Creer y cyfrif',
+'createacct-benefit-heading' => 'Ffrwyth llafur pobl fel chi yw {{SITENAME}}.',
+'createacct-benefit-body1' => '{{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|tudalen|dudalen|dudalen|tudalen|thudalen|tudalen}}',
+'createacct-benefit-body3' => "{{PLURAL:$1|cyfranwyr yn|wedi cyfrannu'n}} ddiweddar",
 'badretype' => "Nid yw'r cyfrineiriau'n union yr un fath.",
 'userexists' => 'Mae rhywun arall wedi dewis yr enw defnyddiwr hwn. 
 Dewiswch un arall os gwelwch yn dda.',
 'loginerror' => 'Problem mewngofnodi',
+'createacct-error' => 'Nam wrth greu cyfrif',
 'createaccounterror' => "Ni lwyddwyd i greu'r cyfrif: $1",
 'nocookiesnew' => "Mae'r cyfrif defnyddiwr wedi cael ei greu, ond nid ydych wedi mewngofnodi. Mae {{SITENAME}} yn defnyddio cwcis wrth i ddefnyddwyr fewngofnodi. Rydych chi wedi analluogi cwcis. Mewngofnodwch eto gyda'ch enw defnyddiwr a'ch cyfrinair newydd os gwelwch yn dda, ar ôl galluogi cwcis.",
 'nocookieslogin' => 'Mae {{SITENAME}} yn defnyddio cwcis wrth i ddefnyddwyr fewngofnodi. Rydych chi wedi analluogi cwcis. Trïwch eto os gwelwch yn dda, ar ôl galluogi cwcis.',
@@ -586,8 +626,8 @@ Os mai rhywun arall a holodd am y cyfrinair, ynteu eich bod wedi cofio\'r hen gy
 'blocked-mailpassword' => 'Gan fod eich cyfeiriad IP wedi ei atal rhag golygu, ni ellir adfer y cyfrinair.',
 'eauthentsent' => 'Anfonwyd e-bost o gadarnhâd at y cyfeiriad a benwyd.
 Cyn y gellir anfon unrhywbeth arall at y cyfeiriad hwnnw rhaid i chi ddilyn y cyfarwyddiadau yn yr e-bost hwnnw er mwyn cadarnhau bod y cyfeiriad yn un dilys.',
-'throttled-mailpassword' => "Anfonwyd e-bost atoch i'ch atgoffa o'ch cyfrinair eisoes, yn ystod y $1 {{PLURAL:$1|awr|awr|awr|awr|awr|awr}} diwethaf.
-Er mwyn rhwystro camddefnydd, dim ond un e-bost i'ch atgoffa o'ch cyfrinair gaiff ei anfon bob yn $1 {{PLURAL:$1|awr|awr|awr|awr|awr|awr}}.",
+'throttled-mailpassword' => "Anfonwyd e-bost atoch eisoes i'ch atgoffa o'ch cyfrinair, a hynny yn ystod y $1 {{PLURAL:$1|awr}} diwethaf.
+Er mwyn rhwystro camddefnydd, dim ond un e-bost i'ch atgoffa o'ch cyfrinair gaiff ei anfon bob yn $1 {{PLURAL:$1|awr}}.",
 'mailerror' => 'Gwall wrth ddanfon yr e-bost: $1',
 'acct_creation_throttle_hit' => "Mae ymwelwyr sy'n defnyddio'ch cyfeiriad IP wedi creu $1 {{PLURAL:$1|cyfrif|cyfrif|gyfrif|chyfrif|chyfrif|cyfrif}} yn ystod y diwrnod diwethaf, sef y mwyafswm a ganiateir mewn diwrnod.
 Felly ni chaiff defnyddwyr sy'n defnyddio'r cyfeiriad IP hwn greu rhagor o gyfrifon ar hyn o bryd.",
@@ -633,36 +673,38 @@ Er mwyn cwblhau'r mewngofnodi, rhaid i chi osod cyfrinair newydd fel hyn:",
 'resetpass-wrong-oldpass' => "Mae'r cyfrinair dros dro neu gyfredol yn annilys.
 Gall fod eich bod wedi llwyddo newid eich cyfrinair eisoes neu eich bod wedi gofyn am gyfrinair dros dro newydd.",
 'resetpass-temp-password' => 'Cyfrinair dros dro:',
+'resetpass-abort-generic' => 'Mae estyniad wedi atal newid y cyfrinair.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ailosod cyfrinair',
-'passwordreset-text' => "Cwblhewch y ffurflen hon er mwyn derbyn e-bost i'ch atgoffa o fanylion eich cyfrif.",
+'passwordreset-text-one' => 'Cwblhewch y ffurflen hon er mwyn ailosod eich cyfrinair.',
+'passwordreset-text-many' => "{{PLURAL:$1|Rhowch un o'r dewis o fanylion derbyniol er mwyn ailosod eich cyfrinair.}}",
 'passwordreset-legend' => 'Ailosod y cyfrinair',
 'passwordreset-disabled' => 'Analluogwyd ailosod cyfrineiriau ar y wici hwn.',
-'passwordreset-pretext' => "{{PLURAL:$1|||Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod|Rhowch un o'r darnau o ddata isod}}",
+'passwordreset-emaildisabled' => 'Analluogwyd offer e-bost ar y wici hwn.',
 'passwordreset-username' => 'Eich enw defnyddiwr:',
 'passwordreset-domain' => 'Parth:',
 'passwordreset-capture' => 'Gweld yr e-bost a gaiff ei anfon?',
 'passwordreset-capture-help' => "Os y ticiwch y blwch hwn, bydd yr e-bost (gyda'r cyfrinair dros dro) yn cael ei ddangos i chi yn ogystal a chael ei anfon at y defnyddiwr.",
 'passwordreset-email' => 'Eich cyfeiriad e-bost:',
 'passwordreset-emailtitle' => 'Manylion eich cyfrif ar {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Mae rhywun (chi yn ôl pob tebyg, o'r cyfeiriad IP $1) wedi gofyn am nodyn atgoffa o fanylion eich cyfrif ar {{SITENAME}} ($4). Mae'r {{PLURAL:$3|cyfrif|cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
+'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:
 
 $2
 
-Bydd y {{PLURAL:$3||cyfrinair dros dro hwn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn|cyfrineiriau dros dro hyn}} yn dod i ben ymhen {{PLURAL:$5||diwrnod |deuddydd|tridiau|$5 diwrnod|$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 ei atgoffa o fanylion eich cyfrif ar {{SITENAME}}
-($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon|cyfrifon|cyfrifon|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
+Bydd 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}}
+($4). Mae'r {{PLURAL:$3||cyfrif|cyfrifon}} canlynol ynghlwm wrth y cyfeiriad e-bost hwn:
 
 $2
 
-Bydd y {{PLURAL:$3||cyfrinair|cyfrineiriau|cyfrineiriau|cyfrineiriau|cyfrineiriau}} dros dro hyn yn dod i ben ymhen {{PLURAL:$5||diwrnod|deuddydd|tridiau|$5 diwrnod|$5 diwrnod}}.
+Bydd y {{PLURAL:$3||cyfrinair|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-emailelement' => "Enw'r defnyddiwr: $1
 Y cyfrinair dros dro: $2",
-'passwordreset-emailsent' => 'Anfonwyd nodyn atgoffa drwy e-bost.',
-'passwordreset-emailsent-capture' => 'Anfonwyd e-bost atgoffa, a ddangosir isod.',
-'passwordreset-emailerror-capture' => "Lluniwyd e-bost atgoffa fel ag a welir isod, ond ni lwyddwyd i'w anfon at y defnyddiwr: $1",
+'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",
 
 # Special:ChangeEmail
 'changeemail' => 'Newid y cyfeiriad e-bost',
@@ -868,12 +910,15 @@ Ni roddodd eglurhad.',
 Ymddengys iddi gael ei dileu.",
 'edit-conflict' => 'Cyd-ddigwyddiad golygu.',
 'edit-no-change' => 'Anwybyddwyd eich golygiad, gan na newidiwyd y testun.',
+'postedit-confirmation' => 'Rhoddwyd eich golygiad ar gadw.',
 'edit-already-exists' => 'Ni ellid creu tudalen newydd.
 Mae ar gael yn barod.',
 'defaultmessagetext' => 'Y testun rhagosodedig',
 'content-failed-to-parse' => "Ni lwyddwyd i ddosrannu'r cynnwys sydd ar ffurf $2 yn ôl y model $1: $3",
 'invalid-content-data' => "Data annilys i'r cynnwys",
 'content-not-allowed-here' => 'Nid yw cynnwys ar ffurf "$1" yn cael ei ganiatau ar y dudalen [[$2]]',
+'editwarning-warning' => 'Os y gadewch y dudalen hon mae\'n bosib y collwch eich newidiadau iddi.
+Os ydych wedi mewngofnodi gallwch ddiddymu\'r rhybudd hwn yn yr adran "Golygu" yn eich dewisiadau.',
 
 # Content models
 'content-model-wikitext' => 'cystrawen wici',
@@ -1157,15 +1202,7 @@ Mae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'searchdisabled' => "Mae'r teclyn chwilio ar {{SITENAME}} wedi'i analluogi dros dro.
 Yn y cyfamser gallwch chwilio drwy Google.
 Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
-
-# Quickbar
-'qbsettings' => 'Panel llywio',
-'qbsettings-none' => 'Dim',
-'qbsettings-fixedleft' => 'Sefydlog ar y chwith',
-'qbsettings-fixedright' => 'Sefydlog ar y dde',
-'qbsettings-floatingleft' => 'Yn arnofio ar y chwith',
-'qbsettings-floatingright' => 'Yn arnofio ar y dde',
-'qbsettings-directionality' => "Yn sefydlog, ar yr ochr o'r ddalen lle rydych yn dechrau ysgrifennu eich iaith",
+'search-error' => 'Cafwyd gwall wrth chwilio: $1',
 
 # Preferences page
 'preferences' => 'Dewisiadau',
@@ -1309,6 +1346,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'userrights-notallowed' => 'Nid oes gan eich cyfrif y caniatâd priodol i ychwanegu neu dynnu hawliau defnyddwyr.',
 'userrights-changeable-col' => 'Grwpiau y gallwch eu newid',
 'userrights-unchangeable-col' => 'Grwpiau na allwch eu newid',
+'userrights-conflict' => 'Gwrthdaro gyda hawliau defnyddiwr! Gwnewch eich newidiadau eto.',
 
 # Groups
 'group' => 'Grŵp:',
@@ -1463,8 +1501,8 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'rclinks' => 'Dangos y $1 newid diweddaraf yn ystod y(r) $2 diwrnod diwethaf<br />$3',
 'diff' => 'gwahan',
 'hist' => 'hanes',
-'hide' => 'Cuddio',
-'show' => 'Dangos',
+'hide' => 'Cuddier',
+'show' => 'Dangoser',
 'minoreditletter' => 'B',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
@@ -1709,7 +1747,6 @@ Er mwyn sicrhau'r diogelwch gorau posib, analluogwyd img_auth.php.",
 'http-read-error' => 'Cafwyd gwall wrth ddarllen yr HTTP.',
 'http-timed-out' => 'Goroedi wedi digwydd ar y cais HTTP.',
 'http-curl-error' => 'Cafwyd gwall wrth nôl yr URL: $1',
-'http-host-unreachable' => 'Wedi methu cyrraedd yr URL.',
 'http-bad-status' => 'Cafwyd trafferth yn ystod y cais HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2122,8 +2159,8 @@ Pan fydd y dudalen hon, neu ei thudalen sgwrs, yn newid, fe fyddant yn ymddangos
 'notvisiblerev' => 'Y diwygiad wedi cael ei ddileu',
 'watchnochange' => "Ni olygwyd dim o'r erthyglau yr ydych yn cadw golwg arnynt yn ystod y cyfnod uchod.",
 'watchlist-details' => '{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio, heb gynnwys tudalennau sgwrs.',
-'wlheader-enotif' => 'Galluogwyd hysbysiadau trwy e-bost.',
-'wlheader-showupdated' => "* Mae tudalennau sydd wedi newid ers i chi ymweld ddiwethaf wedi'u '''hamlygu'''.",
+'wlheader-enotif' => 'Galluogwyd hysbysiadau trwy e-bost.',
+'wlheader-showupdated' => "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
 'watchmethod-recent' => "yn chwilio'r diwygiadau diweddar am dudalennau ar y rhestr wylio",
 'watchmethod-list' => "yn chwilio'r tudalennau ar y rhestr wylio am ddiwygiadau diweddar",
 'watchlistcontains' => '{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio.',
@@ -2535,6 +2572,7 @@ Gallwch weld rhestr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o br
 'sorbsreason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Mae eich cyfeiriad IP wedi cael ei osod ymhlith y dirprwyon agored ar y Rhestr DNS Gwaharddedig a ddefnyddir gan {{SITENAME}}.
 Ni allwch greu cyfrif',
+'xffblockreason' => "Mae un o'r cyfeiriadau IP yn y pennyn 'X-Forwarded-For' wedi cael ei atal; naill ai eich cyfeiriad chi neu un o'r gweinyddion dirprwyol a ddefnyddiwyd gennych. Y rheswm gwreiddiol dros atal oedd: $1",
 'cant-block-while-blocked' => 'Ni allwch flocio defnyddwyr eraill tra bod rhwystr arnoch chithau.',
 'cant-see-hidden-user' => "Mae'r defnyddiwr yr ydych yn ceisio'i rwystro wedi ei rwystro a'i guddio'n barod.
 Gan nad yw'r gallu i guddio defnyddwyr gennych, ni allwch weld y rhwystr sydd ar y defnyddiwr na'i olygu.",
@@ -2699,6 +2737,8 @@ Os ydych am gyfrannu at y gwaith o gyfieithu ar gyfer holl prosiectau MediaWiki
 'thumbnail-more' => 'Chwyddo',
 'filemissing' => 'Ffeil yn eisiau',
 'thumbnail_error' => "Cafwyd gwall wrth greu'r mân-lun: $1",
+'thumbnail_error_remote' => 'Neges am y gwall o $1:
+$2',
 'djvu_page_error' => 'Y dudalen DjVu allan o amrediad',
 'djvu_no_xml' => 'Ddim yn gallu mofyn XML ar gyfer ffeil DjVu',
 'thumbnail-temp-create' => 'Wedi methu gwneud ffeil mân-lun dros dro',
@@ -2755,6 +2795,7 @@ Mae ffolder dros dro yn eisiau.',
 'import-error-interwiki' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni wedi ei neilltuo at ddiben cysylltu\'n allanol (rhyngwici).',
 'import-error-special' => 'Ni fewnforiwyd y dudalen "$1" oherwydd ei bod yn perthyn i barth arbennig lle nad oes tudalennau i\'w cael.',
 'import-error-invalid' => 'Ni fewnforwyd y dudalen "$1" oherwydd bod yr enw arni yn annilys.',
+'import-error-unserialize' => "Ni allwyd ddad-gyfresu'r diwygiad $2 o'r dudalen '$1'. Adroddwyd bod y diwygiad yn defnyddio'r model cynnwys $3, wedi ei gyfresu fel $4.",
 'import-options-wrong' => '{{PLURAL:$2|Dewis|Dewis|Dewisiadau}} annilys: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Mae teitl y dudalen wraidd a roddir yn annilys.',
 'import-rootpage-nosubpage' => 'Nid yw\'r parth "$1", sef parth y brif dudalen y mewnforir iddi, yn caniatau is-dudalennau.',
@@ -2919,8 +2960,6 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
 'pageinfo-category-files' => 'Nifer y ffeiliau',
 
 # Skin names
-'skinname-standard' => 'Safonol',
-'skinname-nostalgia' => 'Hiraeth',
 'skinname-cologneblue' => 'Glas Cwlen',
 
 # Patrolling
@@ -3001,11 +3040,25 @@ Mae'n bosib y bydd eich cyfrifiadur yn cael ei danseilio wrth ddefnyddio'r ffeil
 'minutes' => '{{PLURAL:$1||$1 munud|$1 funud|$1 munud|$1 munud|$1 munud}}',
 'hours' => '{{PLURAL:$1|$1 awr}}',
 'days' => '{{PLURAL:$1||$1 diwrnod|$1 ddiwrnod|$1 diwrnod|$1 diwrnod|$1 diwrnod}}',
+'weeks' => '{{PLURAL:$1|$1 wythnos|$1 wythnosau}}',
 'months' => '{{PLURAL:$1|$1 mis|mis|deufis|$1 mis}}',
 'years' => '{{PLURAL:$1|$1 blwyddyn|blwyddyn|$1 flynedd|$1 blynedd|$1 blynedd|$1 mlynedd}}',
 'ago' => '$1 yn ôl',
 'just-now' => 'nawr',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|awr}} yn ôl',
+'minutes-ago' => '$1 {{PLURAL:$1|munud|munud|funud|munud}} yn ôl',
+'seconds-ago' => '$1 {{PLURAL:$1|eiliad}} yn ôl',
+'monday-at' => 'Dydd Llun am $1',
+'tuesday-at' => 'Dydd Mawrth am $1',
+'wednesday-at' => 'Dydd Mercher am $1',
+'thursday-at' => 'Dydd Iau am $1',
+'friday-at' => 'Dydd Gwener am $1',
+'saturday-at' => 'Dydd Sadwrn am $1',
+'sunday-at' => 'Dydd Sul am $1',
+'yesterday-at' => 'Ddoe am $1',
+
 # Bad image list
 'bad_image_list' => "Dyma'r fformat:
 
@@ -3034,7 +3087,7 @@ Cuddir y meysydd eraill trwy ragosodiad.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lled',
 'exif-imagelength' => 'Uchder',
 'exif-bitspersample' => 'Nifer y didau i bob cydran',
@@ -3212,7 +3265,7 @@ Cuddir y meysydd eraill trwy ragosodiad.
 'exif-originalimageheight' => 'Uchder y ddelwedd cyn iddi gael ei thocio',
 'exif-originalimagewidth' => 'Lled y ddelwedd cyn iddi gael ei thocio',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Heb ei gywasgu',
 'exif-compression-2' => 'Amgodio hyd rhediad Huffman Addasedig 1-Dimensiwn Grŵp 3 y CCITT',
 'exif-compression-3' => 'Amgodio ffacs Grŵp 3 CCITT',
@@ -3613,12 +3666,17 @@ Dylech fod wedi derbyn [{{SERVER}}{{SCRIPTPATH}}/COPYING gopi o GNU General Publ
 'version-entrypoints-header-entrypoint' => 'Man cyflwyno',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Llwybr y ffeil',
-'filepath-page' => 'Ffeil:',
-'filepath-submit' => 'Eler',
-'filepath-summary' => "Mae'r dudalen arbennig hon yn adrodd llwybr ffeil yn gyfan.
-Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn uniongyrchol gan y rhaglen gysylltiedig.",
+# Special:Redirect
+'redirect' => 'Ailgyfeirio yn ôl enw ffeil, ID defnyddiwr neu ID diwygiad tudalen',
+'redirect-legend' => 'Ailgyfeirio i ffeil neu dudalen',
+'redirect-summary' => "Mae'r dudalen arbennig hon yn arwain at ffeil (o roi enw'r ffeil), at dudalen (o roi ID rhyw ddidwygiad o'r dudalen), neu at dudalen defnyddiwr (o roi rhif y defnyddiwr).",
+'redirect-submit' => 'Ati',
+'redirect-lookup' => 'Chwilio drwy:',
+'redirect-value' => 'Chwilio am:',
+'redirect-user' => 'ID defnyddwyr',
+'redirect-revision' => 'Rhifau diwygiadau tudalennau',
+'redirect-file' => 'Enwau ffeiliau',
+'redirect-not-exists' => "Heb lwyddo i'w ganfod",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Chwilio am ffeiliau dyblyg',
@@ -3709,6 +3767,9 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'htmlform-submit' => 'Gosoder',
 'htmlform-reset' => 'Datod y newidiadau',
 'htmlform-selectorother-other' => 'Arall',
+'htmlform-no' => 'Na/Nac ydw/Na fydd...',
+'htmlform-yes' => 'Ie/Iawn/Ydw/Oes...',
+'htmlform-chosen-placeholder' => 'Dewiswch opsiwn',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 gyda chymorth chwilio yr holl destun',
@@ -3718,14 +3779,14 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'logentry-delete-delete' => 'Dileodd $1 y dudalen $3',
 'logentry-delete-restore' => 'Adferodd $1 y dudalen $3',
 'logentry-delete-event' => 'Newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-delete-revision' => "Newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
-'logentry-delete-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3',
-'logentry-delete-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3",
-'logentry-suppress-delete' => 'Cuddiodd $1 y dudalen $3',
-'logentry-suppress-event' => 'Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
-'logentry-suppress-revision' => "Yn y dirgel, newidiodd $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad|$5 diwygiad|$5 diwygiad}} o'r dudalen $3: $4",
-'logentry-suppress-event-legacy' => 'Newidiodd $1 welededd cofnodion lòg ar $3, yn y dirgel',
-'logentry-suppress-revision-legacy' => "Newidiodd $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
+'logentry-delete-revision' => "{{GENDER:$2|Newidiodd}} $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-delete-event-legacy' => '{{GENDER:$2|Newidiodd}} $1 welededd cofnodion lòg ar $3',
+'logentry-delete-revision-legacy' => "{{GENDER:$2|Newidiodd}} $1 welededd diwygiadau o'r dudalen $3",
+'logentry-suppress-delete' => '{{GENDER:$2|Cuddiodd}} $1 y dudalen $3',
+'logentry-suppress-event' => 'Yn y dirgel, {{GENDER:$2|newidiodd}} $1 ymddangosiad {{PLURAL:$5||cofnod lòg|$5 gofnod lòg|$5 chofnod lòg|$5 chofnod lòg|$5 cofnod lòg}} ar $3: $4',
+'logentry-suppress-revision' => "Yn y dirgel, {{GENDER:$2|newidiodd}} $1 ymddangosiad {{PLURAL:$5||diwygiad|$5 ddiwygiad|$5 diwygiad}} o'r dudalen $3: $4",
+'logentry-suppress-event-legacy' => '{{GENDER:$2|Newidiodd}} $1 welededd cofnodion lòg ar $3, yn y dirgel',
+'logentry-suppress-revision-legacy' => "{{GENDER:$2|Newidiodd}} $1 welededd diwygiadau o'r dudalen $3, yn y dirgel",
 'revdelete-content-hid' => 'cuddiwyd y cynnwys',
 'revdelete-summary-hid' => 'cuddiwyd y crynodeb golygu',
 'revdelete-uname-hid' => 'cuddiwyd yr enw defnyddiwr',
@@ -3734,20 +3795,20 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'revdelete-uname-unhid' => 'datguddiwyd yr enw defnyddiwr',
 'revdelete-restricted' => 'cyfyngwyd ar allu gweinyddwyr i weld',
 'revdelete-unrestricted' => 'tynnwyd y cyfyngiadau ar allu gweinyddwyr i weld',
-'logentry-move-move' => 'Symudwyd y dudalen $3 i $4 gan $1',
-'logentry-move-move-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 heb adael dolen ailgyfeirio',
-'logentry-move-move_redir' => 'Symudwyd y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
+'logentry-move-move' => 'Symudodd $1 y dudalen $3 i $4',
+'logentry-move-move-noredirect' => 'Symudodd $1 y dudalen $3 i $4 heb adael dolen ailgyfeirio',
+'logentry-move-move_redir' => '{{GENDER:$2|Symudwyd}} y dudalen $3 i $4 gan $1 dros y ddolen ailgyfeirio',
 'logentry-move-move_redir-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 dros ddolen ailgyfeirio heb adael dolen ailgyfeirio newydd',
-'logentry-patrol-patrol' => "Rhoddodd $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
-'logentry-patrol-patrol-auto' => "Rhoddodd $1 nod yn awtomatig ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
-'logentry-newusers-newusers' => 'Dechreuwyd y cyfrif defnyddiwr $1',
+'logentry-patrol-patrol' => "{{GENDER:$2|Rhoddodd}} $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
+'logentry-patrol-patrol-auto' => "{{GENDER:$2|Rhoddodd}} $1 nod yn awtomatig ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
+'logentry-newusers-newusers' => '{{GENDER:$2|Dechreuwyd}} y cyfrif defnyddiwr $1',
 'logentry-newusers-create' => 'Dechreuwyd y cyfrif defnyddiwr $1',
 'logentry-newusers-create2' => 'Dechreuwyd y cyfrif defnyddiwr $3 gan $1',
-'logentry-newusers-byemail' => 'Dechreuodd $1 y cyfrif defnyddiwr $3 ac anfonodd gyfrinair drwy e-bost',
-'logentry-newusers-autocreate' => 'Crëwyd y cyfrif $1 yn awtomatig',
-'logentry-rights-rights' => 'Newidiodd $1 y grwpiau y mae $3 yn aelod ohonynt o $4 i $5',
-'logentry-rights-rights-legacy' => 'Newidiodd $1 y grwpiau y mae $3 yn aelod ohonynt',
-'logentry-rights-autopromote' => 'Dyrchafwyd $1 yn awtomatig o $4 i $5',
+'logentry-newusers-byemail' => '{{GENDER:$2|Dechreuodd}} $1 y cyfrif defnyddiwr $3 ac anfonodd gyfrinair drwy e-bost',
+'logentry-newusers-autocreate' => '{{GENDER:$2|Crëwyd}} y cyfrif $1 yn awtomatig',
+'logentry-rights-rights' => '{{GENDER:$2|Newidiodd}} $1 y grwpiau y mae $3 yn aelod ohonynt o $4 i $5',
+'logentry-rights-rights-legacy' => '{{GENDER:$2|Newidiodd}} $1 y grwpiau y mae $3 yn aelod ohonynt',
+'logentry-rights-autopromote' => '{{GENDER:$2|Dyrchafwyd}} $1 yn awtomatig o $4 i $5',
 'rightsnone' => '(dim)',
 
 # Feedback
index 88ffe6f..eadb9ac 100644 (file)
@@ -18,6 +18,7 @@
  * @author Froztbyte
  * @author Gorbi
  * @author H92
+ * @author HenrikKbh
  * @author Hylle
  * @author Jan Friberg
  * @author Jon Harald Søby
@@ -219,8 +220,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis antal brugere, der overvåger',
 'tog-oldsig' => 'Nuværende signatur:',
 'tog-fancysig' => 'Behandl signatur som wikitekst uden automatisk henvisning',
-'tog-externaleditor' => 'Brug ekstern editor automatisk (kun for rutinerede brugere, da det kræver særlige indstillinger på din computer. [//www.mediawiki.org/wiki/Manual:External_editors Flere oplysninger.])',
-'tog-externaldiff' => 'Brug ekstern forskelsvisning automatisk (kun for rutinerede brugere, da det kræver særlige indstillinger på din computer. [//www.mediawiki.org/wiki/Manual:External_editors Flere oplysninger.])',
 'tog-showjumplinks' => 'Vis tilgængeligheds-henvisninger',
 'tog-uselivepreview' => 'Brug automatisk forhåndsvisning (kræver JavaScript og er på forsøgsstadiet)',
 'tog-forceeditsummary' => 'Advar mig hvis jeg ikke udfylder beskrivelsesfeltet',
@@ -235,6 +234,7 @@ $messages = array(
 'tog-showhiddencats' => 'Vis skjulte kategorier',
 'tog-noconvertlink' => 'Slå konvertering af sidetitler fra',
 'tog-norollbackdiff' => 'Vis ikke forskel efter tilbagerulning',
+'tog-useeditwarning' => 'Advar mig, hvis jeg forlader en redigeringsside med ændringer, der ikke er gemt.',
 
 'underline-always' => 'Altid',
 'underline-never' => 'Aldrig',
@@ -298,6 +298,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. marts',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. december',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
@@ -486,15 +498,15 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Side',
-'nstab-user' => 'brugerside',
-'nstab-media' => 'medie',
-'nstab-special' => 'speciel',
+'nstab-user' => 'Brugerside',
+'nstab-media' => 'Medieside',
+'nstab-special' => 'Specialside',
 'nstab-project' => 'Projektside',
 'nstab-image' => 'Fil',
-'nstab-mediawiki' => 'besked',
-'nstab-template' => 'skabelon',
-'nstab-help' => 'hjælp',
-'nstab-category' => 'kategori',
+'nstab-mediawiki' => 'Besked',
+'nstab-template' => 'Skabelon',
+'nstab-help' => 'Hjælp',
+'nstab-category' => 'Kategori',
 
 # Main script and global functions
 'nosuchaction' => 'Funktionen findes ikke',
@@ -602,9 +614,18 @@ Bemærk, at nogle sider stadigvæk kan vises som om du var logget på, indtil du
 'welcomecreation-msg' => 'Din konto er blevet oprettet.
 Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
 'yourname' => 'Dit brugernavn:',
+'userlogin-yourname' => 'Brugernavn',
+'userlogin-yourname-ph' => 'Indtast dit brugernavn',
 'yourpassword' => 'Din adgangskode:',
+'userlogin-yourpassword' => 'Adgangskode',
+'userlogin-yourpassword-ph' => 'Indtast din adgangskode',
+'createacct-yourpassword-ph' => 'Indtast kodeord',
 'yourpasswordagain' => 'Gentag adgangskode',
+'createacct-yourpasswordagain' => 'Bekræft kodeord',
+'createacct-yourpasswordagain-ph' => 'Indtast kodeord igen',
 'remembermypassword' => 'Husk mit brugernavn i denne browser (højst $1 {{PLURAL:$1|dag|dage}})',
+'userlogin-remembermypassword' => 'Husk mig',
+'userlogin-signwithsecure' => 'Brug sikker forbindelse',
 'securelogin-stick-https' => 'Behold forbindelsen til HTTPS efter login',
 'yourdomainname' => 'Dit domænenavn:',
 'password-change-forbidden' => 'Du kan ikke ændre adgangskoder på denne wiki.',
@@ -617,18 +638,38 @@ Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
 'logout' => 'Log af',
 'userlogout' => 'Log af',
 'notloggedin' => 'Ikke logget på',
+'userlogin-noaccount' => 'Har du ikke en konto?',
+'userlogin-joinproject' => 'Slut dig til {{SITENAME}}',
 'nologin' => 'Har du ingen konto? $1.',
 'nologinlink' => 'Opret en ny brugerkonto',
 'createaccount' => 'Opret en ny brugerkonto',
 'gotaccount' => 'Har du allerede en konto? $1.',
 'gotaccountlink' => 'Log på',
 'userlogin-resetlink' => 'Har du glemt dine login oplysninger?',
+'userlogin-resetpassword-link' => 'Nulstil din adgangskode',
+'helplogin-url' => 'Help:Logge på',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjælp til at logge på]]',
+'createacct-join' => 'Indtast dine oplysninger nedenfor.',
+'createacct-emailrequired' => 'Mailadresse',
+'createacct-emailoptional' => 'Mailadresse (valgfri)',
+'createacct-email-ph' => 'Indtast din mailadresse',
 'createaccountmail' => 'Brug en midlertidig tilfældig adgangskode og send den til e-mailadressen angivet nedenfor',
+'createacct-realname' => 'Dit rigtige navn',
 'createaccountreason' => 'Begrundelse:',
+'createacct-reason' => 'Årsag',
+'createacct-reason-ph' => 'Hvorfor vil du oprette endnu en konto',
+'createacct-captcha' => 'Sikkerhedskontrol',
+'createacct-imgcaptcha-ph' => 'Indtast venligst ovenstående tekst',
+'createacct-submit' => 'Opret din 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.',
 'userexists' => 'Det brugernavn, du har valgt, er allerede i brug.
 Vælg venligst et andet brugernavn.',
 'loginerror' => 'Logon mislykket',
+'createacct-error' => 'Fejl ved kontooprettelse',
 'createaccounterror' => 'Kunne ikke oprette brugerkonto: $1',
 'nocookiesnew' => 'Din brugerkonto er nu oprettet, men du er ikke logget på. {{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Vær venlig at slå cookies til, og derefter kan du logge på med dit nye brugernavn og kodeord.',
 'nocookieslogin' => '{{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Slå dem venligst til og prøv igen.',
@@ -667,7 +708,7 @@ Du bør logge på og ændre din adgangskode straks efter du har modtaget e-maile
 'eauthentsent' => 'En bekræftelsesmail er sendt til den angivne e-mail-adresse.
 
 Før en e-mail kan modtages af andre brugere af {{SITENAME}}-mailfunktionen, skal adressen og dens tilhørsforhold til denne bruger bekræftes. Følg venligst anvisningerne i denne mail.',
-'throttled-mailpassword' => 'Indenfor {{PLURAL:$1|den sidste time|de sidste $1 timer}} er der allerede sendt et nyt password. For at forhindre misbrug af funktionen, kan der kun bestilles et nyt password en gang for hver {{PLURAL:$1|time|$1 timer}}.',
+'throttled-mailpassword' => 'Indenfor {{PLURAL:$1|den sidste time|de sidste $1 timer}} er der allerede sendt en ny adgangskode. For at forhindre misbrug af funktionen, kan der kun bestilles en ny adgangskode én gang for hver {{PLURAL:$1|time|$1 timer}}.',
 'mailerror' => 'Fejl ved afsendelse af e-mail: $1',
 'acct_creation_throttle_hit' => 'Besøgende med samme IP-adresse som dig har oprettet {{PLURAL:$1|en konto|$1 kontoer}} det sidste døgn, og det er ikke tilladt at oprette flere.
 Derfor kan besøgende ikke oprette flere kontoer fra denne IP-adresse i øjeblikket.',
@@ -714,36 +755,36 @@ Vent venligst før du prøver igen.',
 'resetpass-wrong-oldpass' => 'Ugyldig midlertidig eller gældende adgangskode.
 Du har muligvis allerede skiftet din adgangskode eller anmodet om en ny midlertidig kode.',
 'resetpass-temp-password' => 'Midlertidig adgangskode',
+'resetpass-abort-generic' => 'Ændring af kodeord er blevet afbrudt af udvidelse',
 
 # Special:PasswordReset
 'passwordreset' => 'Nulstil adgangskode',
-'passwordreset-text' => 'Udfyld denne formular for at modtage en påmindelse om dine kontooplysninger som e-mail.',
 'passwordreset-legend' => 'Nulstil adgangskode',
 'passwordreset-disabled' => 'Nulstilling af kodeord er slået fra på denne wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Indtast en af de nedenstående oplysninger}}',
+'passwordreset-emaildisabled' => 'E-mailfunktioner er slået fra på denne wiki.',
 'passwordreset-username' => 'Brugernavn:',
 'passwordreset-domain' => 'Domæne:',
 'passwordreset-capture' => 'Se den resulterende email?',
 'passwordreset-capture-help' => 'Hvis du krydser dette felt af, vil emailen (med den midlertidige adgangskode) blive vist til dig i tillæg til at blive sendt til brugeren.',
 'passwordreset-email' => 'E-mail adresse:',
 'passwordreset-emailtitle' => 'Kontooplysninger på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om en påmindelse om dine kontooplysninger for {{SITENAME}} ($4). Følgende {{PLURAL:$3|brugerkonto|brugerkonti}} er associerede med denne e-mail-adresse:
+'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-mail-adresse:
 
 $2
 
 {{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.
-Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har anmodet om denne påmindelse, 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 har anmodet om en påmindelse om dine kontooplysninger for {{SITENAME}} ($4). Følgende {{PLURAL:$3|brugerkonto|brugerkonti}} er associerede med denne e-mail-adresse:
+Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har gjort 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-mail-adresse:
 
 $2
 
 {{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.
-Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har anmodet om denne påmindelse, 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.',
+Du bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har gjort 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
 Midlertidig adgangskode: $2',
-'passwordreset-emailsent' => 'En påmindelse er blevet sendt som e-mail.',
-'passwordreset-emailsent-capture' => 'En påmindelsesemail, som vist nedenfor, er blevet sendt.',
-'passwordreset-emailerror-capture' => 'En påmindelsesemail, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til brugeren: $1',
+'passwordreset-emailsent' => 'En e-mail om nulstilling af adgangskode er blevet 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',
 
 # Special:ChangeEmail
 'changeemail' => 'Ændr email-adresse',
@@ -780,7 +821,7 @@ Midlertidig adgangskode: $2',
 # Edit pages
 'summary' => 'Beskrivelse:',
 'subject' => 'Emne/overskrift:',
-'minoredit' => 'Dette er en mindre ændring.',
+'minoredit' => 'Dette er en mindre ændring',
 'watchthis' => 'Overvåg denne side',
 'savearticle' => 'Gem side',
 'preview' => 'Forhåndsvisning',
@@ -960,6 +1001,8 @@ Den ser du til at være slettet.',
 'content-failed-to-parse' => 'Kunne ikke fortolke $2-indholdet af $1-modellen: $3',
 'invalid-content-data' => 'Ugyldig indholdsdata',
 'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
+'editwarning-warning' => 'Hvis du forlader siden nu, risikerer du at miste alle ændringer, som du har lavet.
+Denne advarsel kan slås fra under "Redigering" i dine indstillinger.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1238,15 +1281,7 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
 'powersearch-togglenone' => 'Ingen',
 'search-external' => 'Brug anden søgemaskine',
 'searchdisabled' => '<p>Beklager! Fuldtekstsøgningen er midlertidigt afbrudt på grund af for stor belastning på serverne. I mellemtidem kan du anvende Google- eller Yahoo!-søgefelterne herunder. Bemærk at deres kopier af {{SITENAME}}s indhold kan være forældet.</p>',
-
-# Quickbar
-'qbsettings' => 'Hurtigmenu',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast venstre',
-'qbsettings-fixedright' => 'Fast højre',
-'qbsettings-floatingleft' => 'Flydende venstre',
-'qbsettings-floatingright' => 'Flydende højre',
-'qbsettings-directionality' => 'Fast, afhængigt af dit sprogs skriveretning',
+'search-error' => 'Der opstod en fejl under søgning: $1',
 
 # Preferences page
 'preferences' => 'Indstillinger',
@@ -1378,8 +1413,8 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'saveusergroups' => 'Gem brugergrupper',
 'userrights-groupsmember' => 'Medlem af:',
 'userrights-groupsmember-auto' => 'Implicit medlem af:',
-'userrights-groups-help' => 'Du kan ændre denne brugers gruppermedlemsskaber:
-* Et markeret afkrydsningsfelt betyder at brugeren er medlen af den pågældende gruppe..
+'userrights-groups-help' => 'Du kan ændre denne brugers gruppemedlemsskaber:
+* Et markeret afkrydsningsfelt betyder at brugeren er medlen af den pågældende gruppe.
 * Et umarkeret felt betyder at brugeren ikke er medlem af gruppen.
 * En * betyder at du ikke kan fravælge gruppen, når den først er tilføjet og omvendt.',
 'userrights-reason' => 'Årsag:',
@@ -1389,6 +1424,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'userrights-notallowed' => 'Din konto har ikke adgang til at tilføje eller fjerne brugerrettigheder.',
 'userrights-changeable-col' => 'Redigerbare grupper',
 'userrights-unchangeable-col' => 'Uredigerbare grupper',
+'userrights-conflict' => 'Brugerrettighedskonflikt. Tilføj venligst dine ændringer påny.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1798,7 +1834,6 @@ For optimal sikkerhed er img_auth.php deaktiveret.",
 'http-read-error' => 'HTTP-læsefejl.',
 'http-timed-out' => 'HTTP-forespørgslen tog for lang tid.',
 'http-curl-error' => 'Fejl under hentning af URL: $1',
-'http-host-unreachable' => 'Webadresse er ikke tilgængelig.',
 'http-bad-status' => 'Der opstod et problem under HTTP-forespørgslen: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1956,9 +1991,9 @@ En side behandles som en side med en flertydig titel hvis den bruger en skabelon
 
 'pageswithprop' => 'Sider med en sideegenskab',
 'pageswithprop-legend' => 'Sider med en sideegenskab',
-'pageswithprop-text' => 'Denne side viser en liste over sider, der bruger en bestemt sideegenskaben.',
+'pageswithprop-text' => 'Denne side viser en liste over sider, der har en bestemt sideegenskab.',
 'pageswithprop-prop' => 'Egenskabsnavn:',
-'pageswithprop-submit' => '',
+'pageswithprop-submit' => 'Vis',
 
 'doubleredirects' => 'Dobbelte omdirigeringer',
 'doubleredirectstext' => 'Dette er en liste over sider som omdirigerer til andre omdirigeringssider.
@@ -2101,7 +2136,7 @@ Se også [[Special:WantedCategories|ønskede kategorier]].',
 'special-categories-sort-abc' => 'sorter alfabetisk',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'slettede brugerbidrag',
+'deletedcontributions' => 'Slettede brugerbidrag',
 'deletedcontributions-title' => 'Slettede brugerbidrag',
 'sp-deletedcontributions-contribs' => 'bidrag',
 
@@ -2209,13 +2244,13 @@ Fremtidige ændringer af denne side og dens tilknyttede diskussionsside vil bliv
 'notvisiblerev' => 'Versionen er blevet slettet',
 'watchnochange' => 'Ingen af siderne i din overvågningsliste er ændret i den valgte periode.',
 'watchlist-details' => 'Du har $1 {{PLURAL:$1|side|sider}} på din overvågningsliste (ekskl. diskussionssider).',
-'wlheader-enotif' => 'E-mail-underretning er slået til.',
-'wlheader-showupdated' => "* Sider der er ændret siden dit sidste besøg, er '''fremhævet'''",
+'wlheader-enotif' => 'E-mail-underretning er slået til.',
+'wlheader-showupdated' => "Sider, der er ændret siden dit sidste besøg, er vist med '''fed skrift'''.",
 'watchmethod-recent' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
 'watchmethod-list' => 'Tjekker seneste ændringer for sider i din overvågningsliste',
 'watchlistcontains' => 'Din overvågningsliste indeholder $1 {{PLURAL:$1|side|sider}}.',
 'iteminvalidname' => "Problem med '$1', ugyldigt navn...",
-'wlnote' => "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste '''$1''' ændringer}} i {{PLURAL:$2|den sidste time|'''de sidste $2 timer}}''' fra den $3, kl. $4.",
+'wlnote' => "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste '''$1''' ændringer}} i {{PLURAL:$2|den sidste time|'''de sidste $2 timer}}''' op til den $3 kl. $4.",
 'wlshowlast' => 'Vis de seneste $1 timer $2 dage $3',
 'watchlist-options' => 'Indstillinger for overvågningslisten',
 
@@ -2617,6 +2652,7 @@ Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med aktuelle
 'proxyblocksuccess' => 'Færdig.',
 'sorbsreason' => 'IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY.',
 'sorbs_create_account_reason' => 'IP-adressen er opført i DNSBL på {{SITENAME}} som åben PROXY. Oprettelse af nye brugere er ikke mulig.',
+'xffblockreason' => 'En IP-adresse der er indeholdt i X-Fremsendt-Til hovedet, enten din egen eller en på en proxy-server, du bruger, er blevet blokeret. Den oprindelige grund til blokeringen var:$1',
 'cant-block-while-blocked' => 'Du kan ikke blokkere andre brugere mens du selv er blokkeret.',
 'cant-see-hidden-user' => 'Brugeren du prøver at blokerer er allerede blokeret og skjult. Siden du ikke har rettigheden til at skjule brugere, kan du ikke se eller ændre brugerens blokering.',
 'ipbblocked' => 'Du kan ikke ændre blokeringer, da du selv er blokeret',
@@ -2774,6 +2810,8 @@ Besøg venligst [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisering] o
 'thumbnail-more' => 'Forstør',
 'filemissing' => 'Filen mangler',
 'thumbnail_error' => 'Fejl ved oprettelse af thumbnail: $1',
+'thumbnail_error_remote' => 'Fejlbesked fra $1:
+$2',
 'djvu_page_error' => 'DjVu-side udenfor sideområdet',
 'djvu_no_xml' => 'XML-data kan ikke hentes til DjVu-filen',
 'thumbnail-temp-create' => 'Kunne ikke oprette midlertidig miniaturefil',
@@ -2898,7 +2936,7 @@ Du kan se på kildeteksten.',
 'tooltip-ca-nstab-main' => 'Se indholdet',
 'tooltip-ca-nstab-user' => 'Se brugersiden',
 'tooltip-ca-nstab-media' => 'Se mediasiden',
-'tooltip-ca-nstab-special' => 'Dette er en speciel side; man kan ikke redigere sådanne sider',
+'tooltip-ca-nstab-special' => 'Dette er en specialside; man kan ikke redigere sådanne sider',
 'tooltip-ca-nstab-project' => 'Vis projektsiden',
 'tooltip-ca-nstab-image' => 'Se filsiden',
 'tooltip-ca-nstab-mediawiki' => 'Se systembeskeden',
@@ -3001,13 +3039,8 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'pageinfo-category-files' => 'Antal filer',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Kølnerblå',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Eget udseende',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkelt',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3086,11 +3119,25 @@ Du kan beskadige dit system hvis du udfører den.",
 'minutes' => '{{PLURAL: $1|$1 minut|$1 minutter}}',
 'hours' => '{{PLURAL: $1|$1 time|$1 timer}}',
 'days' => '{{PLURAL: $1|$1 dag|$1 dage}}',
+'weeks' => '{{PLURAL:$1|$1 uge|$1 uger}}',
 'months' => '{{PLURAL:$1|$1 måned|$1 måneder}}',
 'years' => '{{PLURAL:$1|$1 år}}',
 'ago' => '$1 siden',
 'just-now' => 'lige nu',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|time|timer}} siden',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minutter}} siden',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekunder}} siden',
+'monday-at' => 'Mandag kl. $1',
+'tuesday-at' => 'Tirsdag kl. $1',
+'wednesday-at' => 'Onsdag  kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Lørdag kl. $1',
+'sunday-at' => 'Søndag kl. $1',
+'yesterday-at' => 'Igår kl. $1',
+
 # Bad image list
 'bad_image_list' => 'Formatet er:
 
@@ -3117,7 +3164,7 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bredde',
 'exif-imagelength' => 'Længde',
 'exif-bitspersample' => 'Bits pr. farvekomponent',
@@ -3295,7 +3342,7 @@ Kun indholdet af lister (linjer startende med *) bliver brugt. Den første henvi
 'exif-originalimageheight' => 'Højden af billedet inden det blev beskåret',
 'exif-originalimagewidth' => 'Bredden af billedet inden det blev beskåret',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ukomprimeret',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensionel modificeret Huffman run length encoding',
 'exif-compression-3' => 'CCITT Gruppe 3 fax-kodning',
@@ -3702,12 +3749,17 @@ Du skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General
 'version-entrypoints-header-entrypoint' => 'Indgangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Vis sti',
-'filepath-summary' => 'Denne specialside giver et direkte link til en fil.
-Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med deres tilhørende program.',
+# Special:Redirect
+'redirect' => 'Omdirigering pga. fil, bruger eller udgave ID',
+'redirect-legend' => 'Omstilling til en fil eller en side',
+'redirect-summary' => "Denne side omdirigerer en (hvis filnavnet er angivet), en side (hvis udgave ID'et er angivet) eller en brugerside (hvis et numerisk brugernummer er angivet).",
+'redirect-submit' => 'Kør',
+'redirect-lookup' => 'Slå op:',
+'redirect-value' => 'Værdi:',
+'redirect-user' => 'Bruger ID',
+'redirect-revision' => 'Sideversion',
+'redirect-file' => 'Filnavn',
+'redirect-not-exists' => 'Værdi ej fundet',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Find dubletfiler',
@@ -3754,7 +3806,7 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 
 # Special:Tags
 'tags' => 'Tags til sideversioner',
-'tag-filter' => '[[Special:Tags|tag]]filter:',
+'tag-filter' => '[[Special:Tags|Tag]]filter:',
 'tag-filter-submit' => 'Filtrér',
 'tags-title' => 'Tags',
 'tags-intro' => 'Denne side oplister de tags som programmet kan mærke en redigering med, og deres betydning.',
@@ -3797,23 +3849,26 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 'htmlform-submit' => 'Gem',
 'htmlform-reset' => 'Annuller ændringer',
 'htmlform-selectorother-other' => 'Anden',
+'htmlform-no' => 'Nej',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Vælg en mulighed',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med fuld-tekst søgnings support',
 'sqlite-no-fts' => '$1 uden fuld-tekst søgnings support',
 
 # New logging system
-'logentry-delete-delete' => '$1 slettede siden $3',
-'logentry-delete-restore' => '$1 gendannede siden $3',
-'logentry-delete-event' => '$1 ændrede synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
-'logentry-delete-revision' => '$1 ændrede synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
-'logentry-delete-event-legacy' => '$1 ændrede synligheden af loghændelser for siden $3',
-'logentry-delete-revision-legacy' => '$1 ændrede synligheden af versioner af siden $3',
-'logentry-suppress-delete' => '$1 skjulte hændelser for siden $3',
-'logentry-suppress-event' => '$1 ændrede hemmeligt synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
-'logentry-suppress-revision' => '$1 ændrede hemmeligt synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
-'logentry-suppress-event-legacy' => '$1 ændrede hemmeligt synligheden af loghændelser for siden $3',
-'logentry-suppress-revision-legacy' => '$1 ændrede hemmeligt synligheden af versioner af siden $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|slettede}} siden $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|gendannede}} siden $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ændrede}} synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ændrede}} synligheden af loghændelser for siden $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ændrede}} synligheden af versioner af siden $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|skjulte}} hændelser for siden $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af {{PLURAL:$5|en loghændelse|$5 loghændelser}} for siden $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af {{PLURAL:$5|en version|$5 versioner}} af siden $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af loghændelser for siden $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ændrede}} hemmeligt synligheden af versioner af siden $3',
 'revdelete-content-hid' => 'indhold skjult',
 'revdelete-summary-hid' => 'redigeringsbeskrivelse skjult',
 'revdelete-uname-hid' => 'brugernavnet er skjult',
@@ -3822,20 +3877,20 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 'revdelete-uname-unhid' => 'brugernavnet er ikke længere skjult',
 'revdelete-restricted' => 'tilføjede begrænsninger for administratorer',
 'revdelete-unrestricted' => 'fjernede begrænsninger for administratorer',
-'logentry-move-move' => '$1 flyttede siden $3 til $4',
-'logentry-move-move-noredirect' => '$1 flyttede siden $3 til $4 uden at efterlade en omdirigering',
-'logentry-move-move_redir' => '$1 flyttede siden $3 til $4 hen over en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttede siden $3 til $4 hen over en omdirigering og uden at efterlade en omdirigering',
-'logentry-patrol-patrol' => '$1 markerede version $4 af siden $3 som patruljeret',
-'logentry-patrol-patrol-auto' => '$1 markerede automatisk version $4 af siden $3 som patruljeret',
-'logentry-newusers-newusers' => 'Brugerkontoen $1 blev oprettet',
-'logentry-newusers-create' => 'Brugerkontoen $1 blev oprettet',
-'logentry-newusers-create2' => 'Brugerkontoen $3 blev oprettet af $1',
-'logentry-newusers-byemail' => 'Brugerkonto  $3  blev oprettet af  $1  og adgangskode er sendt via e-mail',
-'logentry-newusers-autocreate' => 'Kontoen $1 blev automatisk oprettet',
-'logentry-rights-rights' => '$1 ændrede gruppemedlemskabet for $3 fra $4 til $5',
-'logentry-rights-rights-legacy' => '$1 ændrede gruppemedlemskabet for $3',
-'logentry-rights-autopromote' => '$1 blev automatisk forfremmet fra $4 til $5',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4 uden at efterlade en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4 hen over en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttede}} siden $3 til $4 hen over en omdirigering og uden at efterlade en omdirigering',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerede}} version $4 af siden $3 som patruljeret',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerede automatisk}} version $4 af siden $3 som patruljeret',
+'logentry-newusers-newusers' => 'Brugerkontoen $1 blev {{GENDER:$2|oprettet}}',
+'logentry-newusers-create' => 'Brugerkontoen $1 blev {{GENDER:$2|oprettet}}',
+'logentry-newusers-create2' => 'Brugerkontoen $3 blev {{GENDER:$2|oprettet}} af $1',
+'logentry-newusers-byemail' => 'Brugerkontoen $3 blev {{GENDER:$2|oprettet}} af $1, og adgangskoden er sendt via e-mail',
+'logentry-newusers-autocreate' => 'Brugerkontoen $1 blev automatisk {{GENDER:$2|oprettet}}',
+'logentry-rights-rights' => '$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3 fra $4 til $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|ændrede}} gruppemedlemskabet for $3',
+'logentry-rights-autopromote' => '$1 blev automatisk {{GENDER:$2|forfremmet}} fra $4 til $5',
 'rightsnone' => '(-)',
 
 # Feedback
index 9c58c96..99c2da5 100644 (file)
@@ -13,6 +13,7 @@
  * @author Church of emacs
  * @author DaSch
  * @author Das Schäfchen
+ * @author DerHexer
  * @author Dschwen
  * @author Duesentrieb
  * @author Filzstift
@@ -162,6 +163,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'Meine_hochgeladenen_Dateien' ),
        'Newimages'                 => array( 'Neue_Dateien' ),
        'Newpages'                  => array( 'Neue_Seiten' ),
+       'PagesWithProp'             => array( 'Seiten_mit_Eigenschaften' ),
        'PasswordReset'             => array( 'Passwort_neu_vergeben' ),
        'PermanentLink'             => array( 'Permanenter_Link', 'Permalink' ),
        'Popularpages'              => array( 'Beliebteste_Seiten' ),
@@ -173,6 +175,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'Zufällige_Weiterleitung' ),
        'Recentchanges'             => array( 'Letzte_Änderungen' ),
        'Recentchangeslinked'       => array( 'Änderungen_an_verlinkten_Seiten' ),
+       'Redirect'                  => array( 'Weiterleitung' ),
        'Revisiondelete'            => array( 'Versionslöschung' ),
        'Search'                    => array( 'Suche' ),
        'Shortpages'                => array( 'Kürzeste_Seiten' ),
@@ -253,6 +256,8 @@ $magicWords = array(
        'fullpagenamee'             => array( '1', 'VOLLER_SEITENNAME_URL', 'FULLPAGENAMEE' ),
        'subpagename'               => array( '1', 'UNTERSEITE', 'SUBPAGENAME' ),
        'subpagenamee'              => array( '1', 'UNTERSEITE_URL', 'SUBPAGENAMEE' ),
+       'rootpagename'              => array( '1', 'STAMMSEITE', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', 'STAMMSEITE_URL', 'ROOTPAGENAMEE' ),
        'basepagename'              => array( '1', 'OBERSEITE', 'BASEPAGENAME' ),
        'basepagenamee'             => array( '1', 'OBERSEITE_URL', 'BASEPAGENAMEE' ),
        'talkpagename'              => array( '1', 'DISKUSSIONSSEITE', 'DISK', 'TALKPAGENAME' ),
@@ -439,8 +444,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Anzahl der beobachtenden Benutzer anzeigen',
 'tog-oldsig' => 'Vorhandene Signatur:',
 'tog-fancysig' => 'Signatur als Wikitext behandeln (ohne automatische Verlinkung)',
-'tog-externaleditor' => 'Externen Editor standardmäßig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
-'tog-externaldiff' => 'Externes Programm standardmäßig für Versionsunterschiede nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
 'tog-showjumplinks' => '„Wechseln-zu“-Links aktivieren',
 'tog-uselivepreview' => 'Vorschau sofort anzeigen (benötigt JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Warnen, sofern beim Speichern die Zusammenfassung fehlt',
@@ -455,6 +458,7 @@ $messages = array(
 'tog-showhiddencats' => 'Anzeige versteckter Kategorien',
 'tog-noconvertlink' => 'Konvertierung des Titels deaktivieren',
 'tog-norollbackdiff' => 'Unterschied nach dem Zurücksetzen unterdrücken',
+'tog-useeditwarning' => 'Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält',
 
 'underline-always' => 'immer',
 'underline-never' => 'nie',
@@ -518,6 +522,18 @@ $messages = array(
 'oct' => 'Okt.',
 'nov' => 'Nov.',
 'dec' => 'Dez.',
+'january-date' => '$1. Januar',
+'february-date' => '$1. Februar',
+'march-date' => '$1. März',
+'april-date' => '$1. April',
+'may-date' => '$1. Mai',
+'june-date' => '$1. Juni',
+'july-date' => '$1. Juli',
+'august-date' => '$1. August',
+'september-date' => '$1. September',
+'october-date' => '$1. Oktober',
+'november-date' => '$1. November',
+'december-date' => '$1. Dezember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
@@ -825,9 +841,18 @@ Beachte, dass einige Seiten noch anzeigen können, dass du angemeldet bist, sola
 'welcomecreation-msg' => 'Dein Benutzerkonto wurde erstellt.
 Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ändern.',
 'yourname' => 'Benutzername:',
+'userlogin-yourname' => 'Benutzername',
+'userlogin-yourname-ph' => 'Gib deinen Benutzernamen ein',
 'yourpassword' => 'Passwort:',
+'userlogin-yourpassword' => 'Passwort',
+'userlogin-yourpassword-ph' => 'Gib dein Passwort ein',
+'createacct-yourpassword-ph' => 'Gib dein Passwort ein',
 'yourpasswordagain' => 'Passwort wiederholen:',
+'createacct-yourpasswordagain' => 'Passwort bestätigen',
+'createacct-yourpasswordagain-ph' => 'Gib das Passwort erneut ein',
 'remembermypassword' => 'Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})',
+'userlogin-remembermypassword' => 'Angemeldet bleiben',
+'userlogin-signwithsecure' => 'Sichere Verbindung verwenden',
 'securelogin-stick-https' => 'Nach dem Anmelden mit HTTPS verbunden bleiben',
 'yourdomainname' => 'Deine Domain:',
 'password-change-forbidden' => 'Du kannst auf diesem Wiki keine Passwörter ändern.',
@@ -840,18 +865,38 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ände
 'logout' => 'Abmelden',
 'userlogout' => 'Abmelden',
 'notloggedin' => 'Nicht angemeldet',
+'userlogin-noaccount' => 'Du hast noch kein Benutzerkonto?',
+'userlogin-joinproject' => '{{SITENAME}} beitreten',
 'nologin' => "Du hast kein Benutzerkonto? '''$1'''.",
 'nologinlink' => 'Neues Benutzerkonto anlegen',
 'createaccount' => 'Benutzerkonto anlegen',
 'gotaccount' => "Du hast bereits ein Benutzerkonto? '''$1'''.",
 'gotaccountlink' => 'Anmelden',
 'userlogin-resetlink' => 'Die Anmeldedaten vergessen?',
+'userlogin-resetpassword-link' => 'Passwort zurücksetzen',
+'helplogin-url' => 'Help:Anmelden',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hilfe beim Anmelden]]',
+'createacct-join' => 'Gib unten deine Informationen ein.',
+'createacct-emailrequired' => 'E-Mail-Adresse',
+'createacct-emailoptional' => 'E-Mail-Adresse (optional)',
+'createacct-email-ph' => 'Gib deine E-Mail-Adresse ein',
 'createaccountmail' => 'Ein temporäres Zufallspasswort verwenden und an die unten angegebene E-Mail-Adresse versenden',
+'createacct-realname' => 'Bürgerlicher Name (optional)',
 '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' => 'Dein Benutzerkonto erstellen',
+'createacct-benefit-heading' => '{{SITENAME}} wird von Leuten wie dir erstellt.',
+'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.',
 'userexists' => 'Dieser Benutzername ist schon vergeben.
 Bitte wähle einen anderen.',
 'loginerror' => 'Fehler bei der Anmeldung',
+'createacct-error' => 'Fehler beim Erstellen des Benutzerkontos',
 'createaccounterror' => 'Benutzerkonto konnte nicht erstellt werden: $1',
 'nocookiesnew' => 'Der Benutzerzugang wurde erstellt, aber du bist nicht angemeldet. {{SITENAME}} benötigt für diese Funktion Cookies, bitte aktiviere diese und melde dich dann mit deinem neuen Benutzernamen und dem zugehörigen Passwort an.',
 'nocookieslogin' => '{{SITENAME}} benutzt Cookies zur Anmeldung der Benutzer. Du hast Cookies deaktiviert, bitte aktiviere diese und versuche es erneut.',
@@ -935,21 +980,23 @@ Bitte warte, bevor du es erneut probierst.',
 'resetpass-wrong-oldpass' => 'Ungültiges temporäres oder aktuelles Passwort.
 Möglicherweise hast du dein Passwort bereits erfolgreich geändert oder ein neues temporäres Passwort beantragt.',
 'resetpass-temp-password' => 'Temporäres Passwort:',
+'resetpass-abort-generic' => 'Die Passwortänderung wurde durch eine Erweiterung abgebrochen.',
 
 # Special:PasswordReset
 'passwordreset' => 'Passwort zurücksetzen',
-'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um dein Passwort zurückzusetzen.',
+'passwordreset-text-one' => 'Fülle dieses Formular aus, um dein Passwort zurückzusetzen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Gib eines der Daten ein, um dein Passwort zurückzusetzen.}}',
 'passwordreset-legend' => 'Passwort zurücksetzen',
 'passwordreset-disabled' => 'Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert.',
-'passwordreset-pretext' => '{{PLURAL:$1||Gib eines der folgenden Daten ein.}}',
+'passwordreset-emaildisabled' => 'Die E-Mail-Funktionen wurden auf diesem Wiki deaktiviert.',
 'passwordreset-username' => 'Benutzername:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Die E-Mail-Nachricht ansehen?',
-'passwordreset-capture-help' => 'Sofern Du dieses Kästchen ankreuzt, wird die E-Mail-Nachricht mit dem temporären Passwort, sowohl dir angezeigt, als auch dem Benutzer zugesandt.',
+'passwordreset-capture-help' => 'Wenn du dieses Kästchen ankreuzt, wird die E-Mail-Nachricht mit dem temporären Passwort sowohl dir angezeigt als auch dem Benutzer zugesandt.',
 'passwordreset-email' => 'E-Mail-Adresse:',
 'passwordreset-emailtitle' => 'Benutzerkontoinformationen auf {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat eine Zurücksetzung deines
-Passworts für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}}
+Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}}
 mit dieser E-Mail-Adresse verknüpft:
 
 $2
@@ -959,7 +1006,7 @@ Du solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes
 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 auf {{SITENAME}} hat eine Zurücksetzung deines Passworts für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
+'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:
 
 $2
 
@@ -968,7 +1015,7 @@ $2
 Temporäres Passwort: $2',
 'passwordreset-emailsent' => 'Eine Passwortzurücksetzungs-E-Mail wurde 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 den Benutzer gescheitert: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'E-Mail-Adresse ändern',
@@ -1012,7 +1059,7 @@ Temporäres Passwort: $2',
 'showpreview' => 'Vorschau zeigen',
 'showlivepreview' => 'Sofortige Vorschau',
 'showdiff' => 'Änderungen zeigen',
-'anoneditwarning' => "Du bearbeitest diese Seite unangemeldet. Wenn du sie speicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
+'anoneditwarning' => "Du bearbeitest diese Seite unangemeldet. Wenn du sie abspeicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
 '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.",
 'missingcommenttext' => 'Dein Abschnitt enthält keinen Text.',
@@ -1176,11 +1223,14 @@ Zu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begrü
 Sie wurde anscheinend gelöscht.',
 'edit-conflict' => 'Bearbeitungskonflikt.',
 'edit-no-change' => 'Deine Bearbeitung wurde ignoriert, da keine Änderung an dem Text vorgenommen wurde.',
+'postedit-confirmation' => 'Deine Bearbeitung wurde gespeichert.',
 'edit-already-exists' => 'Die neue Seite konnte nicht erstellt werden, da sie bereits vorhanden ist.',
 'defaultmessagetext' => 'Standardtext',
 'content-failed-to-parse' => 'Parsen des Inhalts $2 für Modell $1 fehlgeschlagen: $3',
 'invalid-content-data' => 'Ungültige Inhaltsdaten',
 'content-not-allowed-here' => 'Der Inhalt „$1“ ist auf der Seite [[$2]] nicht erlaubt',
+'editwarning-warning' => 'Das Verlassen dieser Seite kann dazu führen, dass deine Änderungen verloren gehen.
+Wenn du angemeldet bist, kannst du das Anzeigen dieser Warnung im Bereich „Bearbeiten“ deiner Einstellungen abschalten.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1427,7 +1477,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchprofile-advanced' => 'Erweitert',
 'searchprofile-articles-tooltip' => 'Suchen in $1',
 'searchprofile-project-tooltip' => 'Suchen in $1',
-'searchprofile-images-tooltip' => 'Nach Bildern suchen',
+'searchprofile-images-tooltip' => 'Nach Dateien suchen',
 'searchprofile-everything-tooltip' => 'Gesamten Inhalt durchsuchen (inklusive Diskussionsseiten)',
 'searchprofile-advanced-tooltip' => 'Suche in weiteren Namensräumen',
 'search-result-size' => '$1 ({{PLURAL:$2|1 Wort|$2 Wörter}})',
@@ -1459,15 +1509,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'powersearch-togglenone' => 'Keine',
 'search-external' => 'Externe Suche',
 'searchdisabled' => 'Die {{SITENAME}}-Suche ist deaktiviert. Du kannst unterdessen mit Google suchen. Bitte bedenke, dass der Suchindex von {{SITENAME}} veraltet sein kann.',
-
-# Quickbar
-'qbsettings' => 'Seitenleiste',
-'qbsettings-none' => 'Keine',
-'qbsettings-fixedleft' => 'Links, fest',
-'qbsettings-fixedright' => 'Rechts, fest',
-'qbsettings-floatingleft' => 'Links, schwebend',
-'qbsettings-floatingright' => 'Rechts, schwebend',
-'qbsettings-directionality' => 'Fest, abhängig von der Schreibrichtung der gewählten Sprache',
+'search-error' => 'Bei der Suche ist ein Fehler aufgetreten: $1',
 
 # Preferences page
 'preferences' => 'Einstellungen',
@@ -1612,6 +1654,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'userrights-notallowed' => 'Du verfügst nicht über die erforderlichen Berechtigungen, um Benutzerrechte vergeben oder entziehen zu können.',
 'userrights-changeable-col' => 'Gruppenzugehörigkeit, die du ändern kannst',
 'userrights-unchangeable-col' => 'Gruppenzugehörigkeit, die du nicht ändern kannst',
+'userrights-conflict' => 'Benutzerrechtekonflikt! Bitte führe deine Änderungen erneut durch.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1735,7 +1778,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'action-rollback' => 'die Änderungen des letzten Bearbeiters einer bestimmten Seite schnell zurückzusetzen',
 'action-import' => 'Seiten aus einem anderen Wiki zu importieren',
 'action-importupload' => 'Seiten über das Hochladen einer Datei zu importieren',
-'action-patrol' => 'die Bearbeitungen andere Benutzer zu kontrollieren',
+'action-patrol' => 'Bearbeitungen anderer Benutzer als kontrolliert zu markieren',
 'action-autopatrol' => 'eigene Bearbeitungen als kontrolliert zu markieren',
 'action-unwatchedpages' => 'die Liste der unbeobachteten Seiten einzusehen',
 'action-mergehistory' => 'die Versionengeschichten von Seiten zu vereinen',
@@ -1778,8 +1821,8 @@ Stand: $4, $5 Uhr.",
 'rc-change-size' => '$1 {{PLURAL:$1|Byte|Bytes}}',
 'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung',
 'newsectionsummary' => 'Neuer Abschnitt /* $1 */',
-'rc-enhanced-expand' => 'Details anzeigen (benötigt JavaScript)',
-'rc-enhanced-hide' => 'Details verstecken',
+'rc-enhanced-expand' => 'Einzelheiten anzeigen (benötigt JavaScript)',
+'rc-enhanced-hide' => 'Einzelheiten verstecken',
 'rc-old-title' => 'ursprünglich erstellt als „$1“',
 
 # Recent changes linked
@@ -2025,7 +2068,6 @@ Aus Sicherheitsgründen ist img_auth.php deaktiviert.',
 'http-read-error' => 'HTTP-Lesefehler.',
 'http-timed-out' => 'Zeitüberschreitung bei der HTTP-Anfrage.',
 'http-curl-error' => 'Fehler beim Abruf der URL: $1',
-'http-host-unreachable' => 'URL konnte nicht erreicht werden.',
 'http-bad-status' => 'Während der HTTP-Anfrage ist ein Fehler aufgetreten: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2381,7 +2423,7 @@ Zusätzliche Informationen über einzelne Rechte können [[{{MediaWiki:Listgroup
 '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.
-Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit {{GENDER:$1|der Benutzer|die Benutzerin}} dir antworten kann.',
+Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit {{GENDER:$1|der Benutzer|die Benutzerin}} dir direkt antworten kann.',
 'usermailererror' => 'Das E-Mail-Objekt gab einen Fehler zurück:',
 'defemailsubject' => '{{SITENAME}} – E-Mail von Benutzer „$1“',
 'usermaildisabled' => 'E-Mail-Empfang deaktiviert',
@@ -2431,9 +2473,9 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
 'notanarticle' => 'Keine Seite',
 'notvisiblerev' => 'Version wurde gelöscht',
 'watchnochange' => 'Keine der von dir beobachteten Seiten wurde während des angezeigten Zeitraums bearbeitet.',
-'watchlist-details' => 'Du beobachtest {{PLURAL:$1|1 Seite|$1 Seiten}}.',
-'wlheader-enotif' => 'Der E-Mail-Benachrichtigungsdienst ist aktiviert.',
-'wlheader-showupdated' => "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
+'watchlist-details' => 'Du beobachtest {{PLURAL:$1|eine Seite|$1 Seiten}}, ohne dass Diskussionsseiten gezählt werden.',
+'wlheader-enotif' => 'Der E-Mail-Benachrichtigungsdienst ist aktiviert.',
+'wlheader-showupdated' => "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
 'watchmethod-recent' => 'Überprüfen der letzten Bearbeitungen für die Beobachtungsliste',
 'watchmethod-list' => 'Überprüfen der Beobachtungsliste nach letzten Bearbeitungen',
 'watchlistcontains' => 'Deine Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seiten}}.',
@@ -2473,16 +2515,16 @@ Kontakt zum Bearbeiter:
 E-Mail: $PAGEEDITOR_EMAIL
 Wiki: $PAGEEDITOR_WIKI
 
-Es werden dir solange keine weiteren Benachrichtigungs-E-Mails gesendet, bis du die Seite wieder besucht hast. Auf deiner Beobachtungsliste kannst du alle Benachrichtigungsmarkierungen zusammen zurücksetzen.
+Bei weiterer Aktivität auf der Seite werden dir so lange keine weiteren Benachrichtigungs-E-Mails gesendet, bis du die Seite wieder besucht hast. Auf deiner Beobachtungsliste kannst du alle Benachrichtigungsmarkierungen zusammen zurücksetzen.
 
-             Dein freundliches {{SITENAME}}-Benachrichtigungssystem
+Dein freundliches {{SITENAME}}-Benachrichtigungssystem
 
 --
-Um die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuche {{canonicalurl:{{#special:Preferences}}}}
+Um die Einstellungen der E-Mail-Benachrichtigung anzupassen, besuche {{canonicalurl:{{#special:Preferences}}}}.
 
-Um die Einstellungen deiner Beobachtungsliste anzupassen, besuche {{canonicalurl:{{#special:EditWatchlist}}}}
+Um die Einstellungen deiner Beobachtungsliste anzupassen, besuche {{canonicalurl:{{#special:EditWatchlist}}}}.
 
-Um die Seite von deiner Beobachtungsliste herunterzunehmen, besuche $UNWATCHURL
+Um die Seite von deiner Beobachtungsliste herunterzunehmen, besuche $UNWATCHURL.
 
 Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => 'erstellt',
@@ -2739,7 +2781,7 @@ Bitte gib den Grund für die Sperre an.',
 'ipbenableautoblock' => 'Sperre die aktuell von diesem Benutzer genutzte IP-Adresse sowie automatisch alle folgenden, von denen aus er Bearbeitungen oder das Anlegen von Benutzerkonten versucht',
 'ipbsubmit' => 'IP-Adresse/Benutzer sperren',
 'ipbother' => 'Andere Dauer (englisch):',
-'ipboptions' => '2 Stunden:2 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year,Unbeschränkt:infinite',
+'ipboptions' => '2 Stunden:2 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year,unbeschränkt:infinite',
 'ipbotheroption' => 'Andere Dauer',
 'ipbotherreason' => 'Anderer/ergänzender Grund:',
 'ipbhidename' => 'Benutzername in Bearbeitungen und Listen verstecken',
@@ -2831,6 +2873,7 @@ Siehe die [[Special:BlockList|Liste der gesperrten IP-Adressen und Benutzernamen
 'proxyblocksuccess' => 'Erledigt.',
 'sorbsreason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet.',
 'sorbs_create_account_reason' => 'Die IP-Adresse ist in der DNSBL von {{SITENAME}} als offener PROXY gelistet. Das Anlegen neuer Benutzer ist nicht möglich.',
+'xffblockreason' => 'Eine IP-Adresse im X-Forwarded-For-Header wurde gesperrt, entweder deine oder die des benutzten Proxyservers. Der ursprüngliche Sperrgrund war: $1',
 'cant-block-while-blocked' => 'Du kannst keine anderen Benutzer sperren, während du selbst gesperrt bist.',
 'cant-see-hidden-user' => 'Der Benutzer, den du versuchst zu sperren, wurde bereits gesperrt und verborgen. Da du das „hideuser“-Recht nicht hast, kannst du die Benutzersperre nicht sehen und nicht bearbeiten.',
 'ipbblocked' => 'Du kannst keine anderen Benutzer sperren oder entsperren, da du selbst gesperrt bist',
@@ -2863,7 +2906,7 @@ Du kannst Weiterleitungen, die auf den Originaltitel verlinken, automatisch korr
 Stelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.
 Du bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.
 
-Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese eine Weiterleitung ohne Versionsgeschichte.
+Die Seite wird '''nicht''' verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.
 Dies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.
 
 '''Warnung!'''
@@ -2992,6 +3035,8 @@ Bitte besuche die Seiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Lokali
 'thumbnail-more' => 'vergrößern',
 'filemissing' => 'Datei fehlt',
 'thumbnail_error' => 'Fehler beim Erstellen des Vorschaubildes: $1',
+'thumbnail_error_remote' => 'Fehlermeldung von $1:
+$2',
 'djvu_page_error' => 'DjVu-Seite außerhalb des Seitenbereichs',
 'djvu_no_xml' => 'XML-Daten können für die DjVu-Datei nicht abgerufen werden',
 'thumbnail-temp-create' => 'Die Datei für die temporäre Miniaturansicht konnte nicht erstellt werden',
@@ -3140,17 +3185,11 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 
 # Stylesheets
 'common.css' => '/* Das folgende CSS wird für alle Benutzeroberflächen geladen. */',
-'standard.css' => '/* Das folgende CSS wird für Benutzer der Klassik-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'nostalgia.css' => '/* Das folgende CSS wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'cologneblue.css' => '/* Das folgende CSS wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'monobook.css' => '/* Das folgende CSS wird für Benutzer der MonoBook-Benutzeroberfläche geladen */',
-'myskin.css' => '/* Das folgende CSS wird für Benutzer der MySkin-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'chick.css' => '/* Das folgende CSS wird für Benutzer der Küken-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'simple.css' => '/* Das folgende CSS wird für Benutzer der Einfach-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'modern.css' => '/* Das folgende CSS wird für Benutzer der Modern-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte MediaWiki:Common.css bearbeiten. */',
 'vector.css' => '/* Das folgende CSS wird für Benutzer der Vector-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'print.css' => '/* Das folgende CSS wird in der Druckausgabe geladen. */',
-'handheld.css' => '/* Das folgende CSS wird für Handheld-Geräte, basierend auf der in $wgHandheldStyle konfigurierten Benutzeroberfläche, geladen. */',
 'noscript.css' => '/* Das folgende CSS wirkt sich für Benutzer aus, die JavaScript deaktiviert haben */',
 'group-autoconfirmed.css' => '/* CSS an dieser Stelle wirkt sich nur auf automatisch bestätigte Benutzer aus */',
 'group-bot.css' => '/* CSS an dieser Stelle wirkt sich nur auf Bots aus */',
@@ -3159,13 +3198,8 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 
 # Scripts
 'common.js' => '/* Das folgende JavaScript wird für alle Benutzer geladen. */',
-'standard.js' => '/* Das folgende JavaScript wird für Benutzer der Klassik-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'nostalgia.js' => '/* Das folgende JavaScript wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'cologneblue.js' => '/* Das folgende JavaScript wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'monobook.js' => '/* Das folgende JavaScript wird für Benutzer der MonoBook-Benutzeroberfläche geladen */',
-'myskin.js' => '/* Das folgende JavaScript wird für Benutzer der MySkin-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'chick.js' => '/* Das folgende JavaScript wird für Benutzer der Küken-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'simple.js' => '/* Das folgende JavaScript wird für Benutzer der Einfach-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'modern.js' => '/* Das folgende JavaScript wird für Benutzer der Modern-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'vector.js' => '/* Das folgende JavaScript wird für Benutzer der Vector-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'group-autoconfirmed.js' => '/* Das folgende JavaScript wird nur für automatisch bestätigte Benutzer geladen. */',
@@ -3246,13 +3280,8 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'pageinfo-category-files' => 'Anzahl der Dateien',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Kölnisch Blau',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Küken',
-'skinname-simple' => 'Einfach',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3329,13 +3358,27 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'seconds' => '{{PLURAL:$1|$1 Sekunde|$1 Sekunden}}',
 'minutes' => '{{PLURAL:$1|$1 Minute|$1 Minuten}}',
-'hours' => '{{PLURAL:$1|einer Stunde|$1 Stunden}}',
+'hours' => '{{PLURAL:$1|1 Stunde|$1 Stunden}}',
 'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
-'months' => '{{PLURAL:$1|Ein Monat|$1 Monate}}',
-'years' => '{{PLURAL:$1|Ein Jahr|$1 Jahre}}',
+'weeks' => '{{PLURAL:$1|$1 Woche|$1 Wochen}}',
+'months' => '{{PLURAL:$1|1 Monat|$1 Monate}}',
+'years' => '{{PLURAL:$1|1 Jahr|$1 Jahre}}',
 'ago' => 'vor $1',
 'just-now' => 'Gerade eben',
 
+# Human-readable timestamps
+'hours-ago' => 'vor {{PLURAL:$1|einer Stunde|$1 Stunden}}',
+'minutes-ago' => 'vor {{PLURAL:$1|einer Minute|$1 Minuten}}',
+'seconds-ago' => 'vor {{PLURAL:$1|einer Sekunde|$1 Sekunden}}',
+'monday-at' => 'Montag um $1',
+'tuesday-at' => 'Dienstag um $1',
+'wednesday-at' => 'Mittwoch um $1',
+'thursday-at' => 'Donnerstag um $1',
+'friday-at' => 'Freitag um $1',
+'saturday-at' => 'Samstag um $1',
+'sunday-at' => 'Sonntag um $1',
+'yesterday-at' => 'Gestern um $1',
+
 # Bad image list
 'bad_image_list' => 'Format:
 
@@ -3363,7 +3406,7 @@ Weitere werden standardmäßig nicht angezeigt.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breite',
 'exif-imagelength' => 'Höhe',
 'exif-bitspersample' => 'Bits pro Farbkomponente',
@@ -3541,7 +3584,7 @@ Weitere werden standardmäßig nicht angezeigt.
 'exif-originalimageheight' => 'Bildhöhe vor dem Zuschneiden',
 'exif-originalimagewidth' => 'Bildbreite vor dem Zuschneiden',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Unkomprimiert',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensionale modifizierte Huffman-Lauflängenkodierung',
 'exif-compression-3' => 'CCITT Gruppe 3 Faxcodierung',
@@ -3783,30 +3826,28 @@ Rückmeldung des Mailservers: $1',
 'confirmemail_subject' => '[{{SITENAME}}] Bestätigung der E-Mail-Adresse',
 'confirmemail_body' => 'Hallo,
 
-jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat das Benutzerkonto „$2“ in {{SITENAME}} registriert.
+jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat das Benutzerkonto „$2“ bei {{SITENAME}} registriert.
 
-Um die E-Mail-Funktion von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
-dass dieses Benutzerkonto wirklich zu deiner E-Mail-Adresse und damit zu dir gehört, öffne bitte die folgende Web-Adresse:
+Um die E-Mail-Funktionen von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
+dass dieses Benutzerkonto wirklich zu deiner E-Mail-Adresse und damit zu dir gehört, öffne bitte folgenden Link in deinem Browser:
 
 $3
 
-Sollte die vorstehende Adresse in deinem E-Mail-Programm über mehrere Zeilen gehen, musst du sie eventuell per Hand in die Adresszeile deines Web-Browsers einfügen.
-
 Wenn du das genannte Benutzerkonto *nicht* registriert hast, folge diesem Link, um den Bestätigungsprozess abzubrechen:
 
 $5
 
-Dieser Bestätigungscode ist gültig bis $6, $7 Uhr.',
+Dieser Bestätigungscode ist gültig bis zum $6, $7 Uhr.',
 'confirmemail_body_changed' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst,
-hat die E-Mail-Adresse des Benutzerkontos „$2“ zu dieser Adresse auf {{SITENAME}} geändert.
+hat die E-Mail-Adresse des Benutzerkontos „$2“ zu dieser Adresse bei {{SITENAME}} geändert.
 
-Um zu bestätigen, dass dieses Benutzerkonto wirklich dir gehört
-und um die E-Mail-Features auf {{SITENAME}} zu reaktivieren, öffne diesen Link in deinem Browser:
+Um zu bestätigen, dass dieses Benutzerkonto wirklich dir gehört,
+und um die E-Mail-Features bei {{SITENAME}} zu reaktivieren, öffne diesen Link in deinem Browser:
 
 $3
 
 Falls das Konto *nicht* dir gehört, folge diesem Link,
-um die E-Mail-Adress-Bestätigung abzubrechen:
+um die E-Mail-Bestätigung abzubrechen:
 
 $5
 
@@ -3825,7 +3866,7 @@ um die Bestätigung der E-Mail-Adresse abzubrechen:
 $5
 
 Dieser Bestätigungscode ist gültig bis $4.',
-'confirmemail_invalidated' => 'E-Mail-Adressbestätigung abbrechen',
+'confirmemail_invalidated' => 'Die E-Mail-Adressbestätigung wurde abgebrochen.',
 'invalidateemail' => 'E-Mail-Adressbestätigung abbrechen',
 
 # Scary transclusion
@@ -3977,11 +4018,17 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikelpfad]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skriptpfad]',
 
-# Special:FilePath
-'filepath' => 'Dateipfad',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Los',
-'filepath-summary' => 'Mit dieser Spezialseite lässt sich der komplette Pfad der aktuellen Version einer Datei ohne Umweg abfragen. Die angefragte Datei wird direkt dargestellt bzw. mit der verknüpften Anwendung gestartet.',
+# Special:Redirect
+'redirect' => 'Weiterleitung auf Benutzerseite, Seitenversion oder Datei',
+'redirect-legend' => 'Weiterleitung auf eine Benutzerseite, Seitenversion oder Datei',
+'redirect-summary' => 'Diese Spezialseite leitet auf eine Benutzerseite (numerische Benutzerkennung angegeben), Seitenversion (Versionskennung angegeben) oder Datei (Dateiname angegeben) weiter.',
+'redirect-submit' => 'Los',
+'redirect-lookup' => 'Suchen:',
+'redirect-value' => 'Kennung oder Dateiname:',
+'redirect-user' => 'Benutzerseite',
+'redirect-revision' => 'Seitenversion',
+'redirect-file' => 'Datei',
+'redirect-not-exists' => 'Der Wert wurde nicht gefunden',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dateiduplikatsuche',
@@ -4072,6 +4119,9 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'htmlform-submit' => 'Speichern',
 'htmlform-reset' => 'Änderungen rückgängig machen',
 'htmlform-selectorother-other' => 'Andere',
+'htmlform-no' => 'Nein',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Wähle eine Option',
 
 # SQLite database support
 'sqlite-has-fts' => 'Version $1 mit Unterstützung für die Volltextsuche',
@@ -4100,13 +4150,13 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'logentry-move-move' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4',
 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen',
 'logentry-move-move_redir' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4 und überschrieb dabei eine Weiterleitung',
-'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4 und überschrieb dabei eine Weiterleitung ohne selbst eine Weiterleitung anzulegen',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|verschob}} Seite $3 nach $4 und überschrieb dabei eine Weiterleitung, ohne selbst eine Weiterleitung anzulegen',
 'logentry-patrol-patrol' => '$1 {{GENDER:$2|markierte}} Version $4 von Seite $3 als kontrolliert',
 'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markierte}} automatisch Version $4 von Seite $3 als kontrolliert',
 'logentry-newusers-newusers' => 'Benutzerkonto $1 wurde {{GENDER:$2|erstellt}}',
 'logentry-newusers-create' => 'Benutzerkonto $1 wurde {{GENDER:$2|erstellt}}',
 'logentry-newusers-create2' => 'Benutzerkonto $3 wurde von $1 {{GENDER:$2|erstellt}}',
-'logentry-newusers-byemail' => 'Das Benutzerkonto $3 wurde von $1 {{GENDER:$2|erstellt}} und das Passwort wurde per E-Mail zugesandt',
+'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-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',
index 0920527..07d224b 100644 (file)
@@ -12,6 +12,7 @@
  * @author Belekvor
  * @author Erdemaslancan
  * @author George Animal
+ * @author Gorizon
  * @author Kaganer
  * @author Mirzali
  * @author Nemo bis
@@ -59,15 +60,15 @@ $specialPageAliases = array(
        'Blockme'                   => array( 'BloqeyêMe' ),
        'Booksources'               => array( 'KıtabeÇıme' ),
        'BrokenRedirects'           => array( 'HetênayışoXırab' ),
-       'Categories'                => array( 'Kategoriy' ),
+       'Categories'                => array( 'Kategoriyan' ),
        'ChangeEmail'               => array( 'EpostaVurnayış' ),
        'ChangePassword'            => array( 'ParolaBıvurnê', 'ParolaResetke' ),
        'ComparePages'              => array( 'PelaPêverke' ),
        'Confirmemail'              => array( 'EpostayAraştke' ),
-       'Contributions'             => array( 'İştiraqi' ),
+       'Contributions'             => array( 'Dekerdışi' ),
        'CreateAccount'             => array( 'HesabVırazê' ),
        'Deadendpages'              => array( 'PelaBıgirê' ),
-       'DeletedContributions'      => array( 'İştıraqêkeBesterneyayê' ),
+       'DeletedContributions'      => array( 'DekerdışêkeBesterneyayê' ),
        'Disambiguations'           => array( 'Arêzekerdış' ),
        'DoubleRedirects'           => array( 'HetanayışoDılet' ),
        'EditWatchlist'             => array( 'ListeyaSeyrkerdışiVurnayış' ),
@@ -308,12 +309,12 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Bınê gırey de xete bıance:',
+'tog-underline' => 'Bınê gırey de xete bance:',
 'tog-justify' => 'Paragrafan eyar ke',
 'tog-hideminor' => 'Vurnayışanê şenıkan pela vurnayışanê peyênan de bınımne',
 'tog-hidepatrolled' => 'Vurnayışanê qontrolkerdeyan pela vurnayışê peyêni de bınımne',
 'tog-newpageshidepatrolled' => 'Pelanê qontrolkerdeyan lista pelanê neweyan de bınımne',
-'tog-extendwatchlist' => 'Lista seyrkerdışi hera bıke ke vurnayışi pêro bıasê, tenya tewr peyêni nê',
+'tog-extendwatchlist' => 'Lista seyrkerdışi hera bıke ke vurnayışi pêro basê, tenya tewr peyêni nê',
 'tog-usenewrc' => 'Pele be vurnayışanê grube de vurnayışê peyêni u lista seyrkerdışi (JavaScript lazımo)',
 'tog-numberheadings' => 'Sernuşteyan be xo numre cı şane',
 'tog-showtoolbar' => 'Goceganê hacetanê vurnayışi bımocne (JavaScript lazımo)',
@@ -330,15 +331,13 @@ $messages = array(
 'tog-previewontop' => 'Verqayti pela nuştışi ser de bımocne',
 'tog-previewonfirst' => 'Vurnayışo verên de verqayti tım bımocne',
 'tog-nocache' => 'Pelanê cıgeyrayoği meya xo viri',
-'tog-enotifwatchlistpages' => ' pele ya zi dosyaya ke lista mına seyrkerdışi de vurnayê mı rê e-poste bırışe',
+'tog-enotifwatchlistpages' => 'Yew pele ya zi dosyaya ke lista mına seyrkerdışi de vurnayê mı rê e-poste bırışe',
 'tog-enotifusertalkpages' => 'Pela mına werênayışi ke vurnayê mı rê e-poste bırışe',
 'tog-enotifminoredits' => 'Vurnayışanê qıckekanê pelan u dosyeyan de zi mı rê e-poste bırışe',
 'tog-enotifrevealaddr' => 'Adresa e-posteyê mı posteyê xeberan de bımocne',
 'tog-shownumberswatching' => 'Amarê karberanê seyrkerdoğan bımocne',
 'tog-oldsig' => 'İmzaya mewcude:',
 'tog-fancysig' => 'İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)',
-'tog-externaleditor' => 'Editorê teberi standard bıxebetne (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
-'tog-externaldiff' => 'Têverşanayışan pê programê teberi vıraze (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
 'tog-showjumplinks' => 'Gıreyê "şo"y aktif ke',
 'tog-uselivepreview' => 'Verqayto cınde bıxebetne (JavaScript lazımo) (hewna cerrebnayış dero)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
@@ -347,16 +346,17 @@ $messages = array(
 'tog-watchlisthideminor' => 'Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne',
 'tog-watchlisthideliu' => 'Lista seyrkerdışi ra vurnayışanê karberanê cıkewteyan bınımne',
 'tog-watchlisthideanons' => 'Lista seyrkerdışi ra vurnayışanê karberanê anoniman bınımne',
-'tog-watchlisthidepatrolled' => 'Lista seyrkerdışi ra vurnayışanê qontrol kerdeyan bınımne',
+'tog-watchlisthidepatrolled' => 'Lista seyrkerdışi ra vurnayışanê qontrolkerdeyan bınımne',
 'tog-ccmeonemails' => 'E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe',
 'tog-diffonly' => 'Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê',
-'tog-showhiddencats' => 'Kategoriyanê dızdine bımocne',
+'tog-showhiddencats' => 'Kategoriyanê dızdiye bımocne',
 'tog-noconvertlink' => 'Greyê sernami çerx kerdışi bıqefılne',
 'tog-norollbackdiff' => 'Peyserardışi ra dıme ferqi caverde',
+'tog-useeditwarning' => 'Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de',
 
 'underline-always' => 'Tım',
 'underline-never' => 'Qet',
-'underline-default' => 'Cild ya zi cıgeyrayoğo hesıbyaye',
+'underline-default' => 'Cild ya zi cıgeyrayoğo hesebiyaye',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Cayê vurnayışi de terzê nuştışi:',
@@ -381,7 +381,7 @@ $messages = array(
 'fri' => 'Êne',
 'sat' => 'Şem',
 'january' => 'Çele',
-'february' => 'Şıbate',
+'february' => 'Sıbate',
 'march' => 'Adar',
 'april' => 'Nisane',
 'may_long' => 'Gulane',
@@ -393,7 +393,7 @@ $messages = array(
 'november' => 'Tışrino Peyên',
 'december' => 'Kanun',
 'january-gen' => 'Çele',
-'february-gen' => 'Şıbate',
+'february-gen' => 'Sıbate',
 'march-gen' => 'Adar',
 'april-gen' => 'Nisane',
 'may-gen' => 'Gulane',
@@ -405,7 +405,7 @@ $messages = array(
 'november-gen' => 'Tışrino Peyên',
 'december-gen' => 'Kanun',
 'jan' => 'Çel',
-'feb' => 'Şbt',
+'feb' => 'Sbt',
 'mar' => 'Adr',
 'apr' => 'Nsn',
 'may' => 'Gln',
@@ -421,11 +421,11 @@ $messages = array(
 'pagecategories' => '{{PLURAL:$1|Kategoriye|Kategoriy}}',
 'category_header' => 'Pelê ke kategoriya "$1" derê',
 'subcategories' => 'Kategoriyê bınêni',
-'category-media-header' => 'Dosyeyê ke kategoriya da "$1" deyê',
+'category-media-header' => 'Dosyeyê ke kategoriya "$1" derê',
 'category-empty' => "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
 'hidden-categories' => '{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}',
 'hidden-category-category' => 'Kategoriyê nımıtey',
-'category-subcat-count' => '{{PLURAL:$2|Na kategoriye de ena kategoriya bınêne esta.|Na kategoriye de $2 ra pêro pia, {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê.}}, be $2 ra pêro pia.}}',
+'category-subcat-count' => '{{PLURAL:$2|Na kategoriya de $1 bınkategoriyay estê.|$2 kategoriyan ra $1 bınkategoriyay asenê.}}',
 'category-subcat-count-limited' => 'Na kategoriye de {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê}}.',
 'category-article-count' => '{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Na kategoriye de $2 ra pêro pia, {{PLURAL:$1|ena pele esta|enê $1 peli estê.}}, be $2 ra pêro pia}}',
 'category-article-count-limited' => '{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.',
@@ -434,8 +434,8 @@ $messages = array(
 'category-file-count-limited' => '{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.',
 'listingcontinuesabbrev' => '(dewam)',
 'index-category' => 'Pelê endeksıni',
-'noindex-category' => 'Perê ke ratnena cı çinıya',
-'broken-file-category' => 'Peleye ke linkê Dosyayandê xelata muhtewa kenê',
+'noindex-category' => 'Pelê ke zerrekê cı çıniyo',
+'broken-file-category' => 'Peleye ke gıreyê dosyeyanê ğeletan muhtewa kenê',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'linkprefix' => "'''MediaWiki niya ro.'''",
@@ -445,7 +445,8 @@ $messages = array(
 'newwindow' => '(pençereyê newey de beno a)',
 'cancel' => 'Bıtexelne',
 'moredotdotdot' => 'Vêşi...',
-'mypage' => 'Per',
+'morenotlisted' => 'Vêşêri lista nêbi...',
+'mypage' => 'Pele',
 'mytalk' => 'Werênayış',
 'anontalk' => 'Pela werênayışê nê IPy',
 'navigation' => 'Geyrayış',
@@ -475,7 +476,7 @@ $messages = array(
 'vector-view-view' => 'Bıwane',
 'vector-view-viewsource' => 'Çımey bıvêne',
 'actions' => 'Kerdışi',
-'namespaces' => 'Cayê namam',
+'namespaces' => 'Cayê namey',
 'variants' => 'Varyanti',
 
 'navigation-heading' => 'Menuya Navigasyoni',
@@ -598,7 +599,7 @@ $1',
 'collapsible-expand' => 'Hera ke',
 'thisisdeleted' => 'Bıvêne ya zi $1 peyser bia?',
 'viewdeleted' => '$1 bıvêne?',
-'restorelink' => '{{PLURAL:$1|yew vurnayışo esterıte|$1 vurnayışê esterıtey}}',
+'restorelink' => '{{PLURAL:$1|jew vurnayış besteriya|$1 vurnayışi besteriyaye}}',
 'feedlinks' => 'Warikerdış:',
 'feed-invalid' => 'Qeydey cıresnayışê  beğşi nêvêreno.',
 'feed-unavailable' => 'Cıresnayışê şebekey çıniyê',
@@ -713,7 +714,7 @@ Sebeb: "\'\'$2\'\'".',
 Xızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: "$3".',
 'invalidtitle-knownnamespace' => 'Canemey "$2" u metnê "$3" xırabo',
 'invalidtitle-unknownnamespace' => 'Sernameye nêşınasiya yana amraiya canameyo  $1 u metno "$2" xırab',
-'exception-nologin' => 'Tı cı nêkewtê',
+'exception-nologin' => 'Şıma cıkewtış nêvıraşto',
 'exception-nologin-text' => 'Na pele ya zi nê karkerdışi rê nê wiki de cıkewtış icab keno.',
 
 # Virus scanner
@@ -729,10 +730,19 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'welcomeuser' => 'Xeyr ameyê $1',
 'welcomecreation-msg' => 'Hesabê şıma abiyo.
 [[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.',
-'yourname' => 'Namey karberi',
+'yourname' => 'Nameyê karberi:',
+'userlogin-yourname' => 'Nameyê karberi',
+'userlogin-yourname-ph' => 'Nameyê xoye karberi cıkewe',
 'yourpassword' => 'Parola',
+'userlogin-yourpassword' => 'Parola',
+'userlogin-yourpassword-ph' => 'Parolaya xo cıkewe',
+'createacct-yourpassword-ph' => 'Parola cıkewe',
 'yourpasswordagain' => 'Parola reyna bınusne:',
+'createacct-yourpasswordagain' => 'Parola tesdiq ke',
+'createacct-yourpasswordagain-ph' => 'Parola fına cıkewe',
 'remembermypassword' => 'Parola mı nê cıgeyrayoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}})',
+'userlogin-remembermypassword' => 'Mı biya xo viri',
+'userlogin-signwithsecure' => 'Ebe teqdimkerê asayişın cıkewe',
 'securelogin-stick-https' => "Dekewtış kerdışi dıma HTTPS'i dı grêdaye bıman",
 'yourdomainname' => 'Nameyê şıma yo meydani',
 'password-change-forbidden' => 'Şıma na wiki de nêşenê parola bıvurnê.',
@@ -744,19 +754,38 @@ Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de he
 'userloginnocreate' => 'Cı kewe',
 'logout' => 'Bıveciye',
 'userlogout' => 'Bıveciye',
-'notloggedin' => 'Hesab akerde niyo',
+'notloggedin' => 'Şıma cıkewtış nêvıraşto',
+'userlogin-noaccount' => 'Hesabê şıma çıniyo?',
+'userlogin-joinproject' => 'Cıkewe {{SITENAME}}',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
 'createaccount' => 'Hesab vıraze',
 'gotaccount' => "Hesabê şıma esto? '''$1'''.",
 'gotaccountlink' => 'Cı kewe',
 'userlogin-resetlink' => 'Melumatê cıkewtışi xo vira kerdê?',
-'createaccountmail' => 'mı rê e-mail sera parola bırışe',
+'userlogin-resetpassword-link' => 'Parolaya xo reset ke',
+'helplogin-url' => 'Help:Qeydbiyayış',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Desteg be qeydbiyayış ra]]',
+'createacct-join' => 'Cêr melumatê xo cı ke',
+'createacct-emailrequired' => 'Adresa e-postey',
+'createacct-emailoptional' => 'Adresa e-postey (mecburi niya)',
+'createacct-email-ph' => 'Adresa e-posteyê xo cıkewe',
+'createaccountmail' => 'Yew parolaya rastameyiya ravêrdiye bıgurene û parola ena adresa e-postey rê bırışe',
+'createacct-realname' => 'Nameyo raştıkên (mecburi niyo)',
 'createaccountreason' => 'Sebeb:',
+'createacct-reason' => 'Sebeb',
+'createacct-reason-ph' => 'Şımaye çı xo re zewbi hesab vırazeni?',
+'createacct-captcha' => 'Qontrolê asayişi',
+'createacct-imgcaptcha-ph' => 'Nuşteyo ke cor aseno ey cı ke',
+'createacct-submit' => 'Hesabê xo vıraze',
+'createacct-benefit-body1' => '{{PLURAL:$1|vurnayış|vurnayışi}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pele|peli}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|iştıraqkerdoğo nıkayên|iştıraqkerdoğê nıkayêni}}',
 'badretype' => 'Parolayê ke şıma nuşti yewbini nêtepışneni.',
 'userexists' => 'Jewna karber enê nami karneno.
 Mara reca xorê jewna name bınusnê.',
 'loginerror' => 'Xetayê hesab ekerdışi',
+'createacct-error' => 'Xetaya vıraştışê hesabi',
 'createaccounterror' => 'Hesab nêvırazyeno: $1',
 'nocookiesnew' => 'Hesabê karberi vıraziya, labelê şıma nêşay cı kewê.
 Semedê akerdışê hesabi çerezê {{SITENAME}}i gurêniyenê.
@@ -793,8 +822,8 @@ Eke vurnayişê parolayi, şıma nêwaşt ya zi parolayê şıma ameyo şıma vi
 'blocked-mailpassword' => 'Cıkewetışê na keyepel de şıma qedexe biye, ey ra newe yew şifre nêerşawyeno.',
 'eauthentsent' => 'Adreso ke şıma dayo ma, ma yew e-posta rışt uca, o e-posta de kodê araşt kerdış esto.
 Heta ke şıma o e-postaaraşt nêkeri ma yewna e-posta şıma ri nêrışêno.',
-'throttled-mailpassword' => 'Parola vir ardış, zerreyê {{PLURAL:$1|yew seet|$1 seet}} de erşawiya.
-Parola her {{PLURAL:$1|yew seete|$1 seete}} de yew rey erşawiyena.',
+'throttled-mailpassword' => 'Eyarkerdışê parola xora zerreyê {{PLURAL:$1|yew saete|$1 saetan}} erşawiya.
+Seba xırabgurenayışê xızmete ra, her {{PLURAL:$1|yew saete|$1 saetan}} de rey tenya yew eyarkerdışê parola erşawiyeno.',
 'mailerror' => 'Erşawıtışe xetayê e-posta: $1',
 'acct_creation_throttle_hit' => 'Yew ten IP adresê şıma xebıtnayo u kewto no wiki, roco peyin de {{PLURAL:$1|1 hesab|$1 hesab}} vıraşto.
 xulasa ney kesê ke IP adresê şıma xebıtneni hini nêeşkeni ney ra zêdêr hesab akeri.',
@@ -839,14 +868,13 @@ Bıne vındere u newe ra dest pê bıkere.',
 'resetpass-wrong-oldpass' => 'parolayo parola maqbul niyo.
 şıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.',
 'resetpass-temp-password' => 'parolayo muweqet:',
+'resetpass-abort-generic' => 'Parola vurnayış jew derganey ra tepya ibtal biyo',
 
 # Special:PasswordReset
 'passwordreset' => 'Parola reset ke',
-'passwordreset-text' => 'Nê formi melumatê hesab dê şıma birê şıma viri deye pırkerê.',
 'passwordreset-legend' => 'Parola reset ke',
 'passwordreset-disabled' => 'Parola reset kerdış ena viki sera qefılneyayo.',
-'passwordreset-pretext' => '{{PLURAL:$1||Enê cerenan ra jeweri defiye de}}',
-'passwordreset-username' => 'Namey karberi:',
+'passwordreset-username' => 'Nameyê karberi:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'neticey e-postay bımocne?',
 'passwordreset-capture-help' => 'Şıma na dorek morkerê se, e-posta (idareten eposta ya) şıma rê yana karbera rê rışêno.',
@@ -866,9 +894,9 @@ $2
 Ena 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
 Parola vêrdiye: $2',
-'passwordreset-emailsent' => 'E-postay xo vira kerdışi rışiyê.',
-'passwordreset-emailsent-capture' => 'Zey cêri e-postay xo vira kerdışi rışiyê.',
-'passwordreset-emailerror-capture' => 'ey cêri e-postay xo vira kerdışi vıraziyê lakin merdum dê $1 rê nêrışiyê.',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'E-posta adresa xo bıvurnê',
@@ -878,6 +906,7 @@ Parola vêrdiye: $2',
 'changeemail-oldemail' => 'E-postay şımaya newki:',
 'changeemail-newemail' => 'E-posta adresiyo newe:',
 'changeemail-none' => '(Çıno)',
+'changeemail-password' => 'Parolaya şımaya {{SITENAME}}i:',
 'changeemail-submit' => 'E-postay xo bıvurne',
 'changeemail-cancel' => 'Bıtexelne',
 
@@ -1033,7 +1062,7 @@ Fına zi qayılê ke  iştıraq kewê, Şıma qayılê kê şar vaco eno nuşte
 'copyrightwarning2' => 'Ney bızane ke nuşteyê ke şıma ruşneni (şaweni) keyepelê {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niye kes bıvurno, nuşetyanê xo meerze ita. <br />
 Wexta ke şıma nuşte zi erzeni ita; şıma gani taahhud bıde koti ra ardo (qey teferruati referans: $1).',
 'longpageerror' => "'''Xırab: Dergeya nuşte dê şıma nezdi {{PLURAL:$1|kilobayto|$1 kilobayto}}, feqet {{PLURAL:$2|kilobayt|$2 kilobayt}} ra vêşiyo. Qeyd biyayişê cı nêbeno'''",
-'readonlywarning' => "'''DİQET: Semedê mıqayti, database kılit biyo. No sebeb ra vurnayişê şıma qayd nêbeno. Nuşteyanê şıma yewna serkar eşkeno wedaro u pey ra şıma eşkeni reyna ita de qayd bıker'''
+'readonlywarning' => "'''Diqet: Semedê mıqayti, database kılit biyo. No sebeb ra vurnayişê şıma qayd nêbeno. Nuşteyanê şıma yewna serkar eşkeno wedaro u pey ra şıma eşkeni reyna ita de qayd bıker'''
 
 Serkar o ke kılit kerdo; no beyanat dayo: $1",
 'protectedpagewarning' => "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''
@@ -1077,6 +1106,8 @@ Pel ca ra esto.',
 'content-failed-to-parse' => 'Qandê madela $3 zereyê $1, $2 sero nêagozyayo',
 'invalid-content-data' => 'Zerrey malumati nêravêrdeyo',
 'content-not-allowed-here' => '"$1" sero per da [[$2]] rê mısade nêdeyêno',
+'editwarning-warning' => 'ihtimal o ke wexta şıma peli ra bıveci, vurnayiş o ke şıma kerdo, hewna şiyêro .
+eke şıma kewtê hesabê xo, no hişyari tercihanê xo ra şıma eşkeni "{{int:prefs-editing}}" bıvındarnî .',
 
 # Content models
 'content-model-wikitext' => 'wikimetin',
@@ -1191,7 +1222,7 @@ Eke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
 'revdelete-nologid-text' => 'Şıma vıraştışê nê fonksiyoni rê ya yew cıkewtışo waşte diyar nêkerdo, ya ki çıkewtışo diyarkerde çıniyo.',
 'revdelete-no-file' => 'Dosya diyarkerdiye çıniya.',
 'revdelete-show-file-confirm' => 'Şıma eminê ke wazenê çımraviyarnayışê esterıtey na dosya "<nowiki>$1</nowiki>" $2 ra $3 de bıvênê?',
-'revdelete-show-file-submit' => 'E',
+'revdelete-show-file-submit' => 'Eya',
 'revdelete-selected' => "'''[[:$1]]: ra {{PLURAL:$2|çımraviyarnayışo weçinıte|çımraviyarnayışê weçinıtey}}'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Qeydbiyayışo weçinıte|Qeydbiyayışê weçinıtey}}:'''",
 'revdelete-text' => "'''Çımraviyarnayışê esterıtey u kerdışi hewna tarixê pele u qeydan de asenê, hema parçeyê zerrekê dinan areze nêbenê.'''
@@ -1209,7 +1240,7 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşenê h
 'revdelete-hide-user' => 'Karber u IP ê ke vurnayiş kerdo bınım.',
 'revdelete-hide-restricted' => 'Malumatan pa serkaran u karberan ra bınım.',
 'revdelete-radio-same' => '(mevurne)',
-'revdelete-radio-set' => 'E',
+'revdelete-radio-set' => 'Eya',
 'revdelete-radio-unset' => 'Nê',
 'revdelete-suppress' => 'Hem ê binan ra hem zi serkaran ra malumatan bınım',
 'revdelete-unsuppress' => 'reizyonê ke tepiya anciye serbest ker',
@@ -1360,15 +1391,6 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'search-external' => 'Cıgeyrayışê teberi',
 'searchdisabled' => '{{SITENAME}} no keyepel de cıgerayiş muweqqet bıryayo. no benatê de şıma pê Google eşkeni zerreyê {{SITENAME}} de cıgerayiş bıkeri.',
 
-# Quickbar
-'qbsettings' => 'Çûwo pêt',
-'qbsettings-none' => 'Çıniyo',
-'qbsettings-fixedleft' => 'Rêcaene çhep',
-'qbsettings-fixedright' => 'Rêcaene raşt',
-'qbsettings-floatingleft' => 'rêcaene çhep',
-'qbsettings-floatingright' => 'rêcaene raşt',
-'qbsettings-directionality' => 'Sabito, hereket de dosya da zıwan de şımaya gıredayeyo',
-
 # Preferences page
 'preferences' => 'Tercihi',
 'mypreferences' => 'Tercihi',
@@ -1435,7 +1457,7 @@ Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê:
 'timezoneregion-pacific' => 'Okyanuso Pasifik',
 'allowemail' => 'Karberê bini wa bışê mı rê e-posta bırışê.',
 'prefs-searchoptions' => 'Cı geyre',
-'prefs-namespaces' => 'Cayê namam',
+'prefs-namespaces' => 'Cayê namey',
 'defaultns' => 'Eke heni, enê cayanê namey de cı geyre (sae ke):',
 'default' => 'qısur',
 'prefs-files' => 'Dosyey',
@@ -1447,9 +1469,9 @@ Na game tepeya nêerziyena.',
 'prefs-emailconfirm-label' => 'Tesdiqiya E-posta:',
 'prefs-textboxsize' => 'Ebatê pencerey vurnayışi',
 'youremail' => 'E-Mail (mecbur niyo) *:',
-'username' => 'Namey karberi:',
-'uid' => 'Namey karberi:',
-'prefs-memberingroups' => 'Ezayê {{PLURAL:$1|grube|gruban}}:',
+'username' => '{{GENDER:$1|Nameyê karberi}}:',
+'uid' => 'Kamiya {{GENDER:$1|karberi}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|gruban}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Wextê qeydbiyayışi',
 'prefs-registration-date-time' => '$1',
@@ -1664,7 +1686,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'rcshowhideminor' => 'Vurnayışanê werdiyan $1',
 'rcshowhidebots' => 'Botan $1',
 'rcshowhideliu' => 'Karberanê qeydınan $1',
-'rcshowhideanons' => 'Karberanê anoniman $1',
+'rcshowhideanons' => 'Karberê bênamey $1',
 'rcshowhidepatr' => '$1 vurnayışê ke dewriya geyrayê',
 'rcshowhidemine' => 'Vurnayışanê mı $1',
 'rclinks' => 'Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3',
@@ -1692,8 +1714,8 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'recentchangeslinked-toolbox' => 'Vurnayışê elaqeyıni',
 'recentchangeslinked-title' => 'vurnayışan ser "$1"',
 'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
-'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdaoğan de lista de vurnayışê peyênana.
-[[Special:Watchlist|Lista şımawa seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
+'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdayoğan de lista de vurnayışê peyênana.
+[[Special:Watchlist|Lista şımaya seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
 'recentchangeslinked-page' => 'Nameyê pele:',
 'recentchangeslinked-to' => 'Pelayan ke ena pela ri gire bi, ser ayi vurnayışi bımoc',
 
@@ -1702,7 +1724,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'uploadbtn' => 'Dosya bar ke',
 'reuploaddesc' => 'Barkerdışi iptal ke u peyser şo formê barkerdışi',
 'upload-tryagain' => 'Deskripyonê dosyayî ke vurîya ey qeyd bike',
-'uploadnologin' => 'Nicikewte',
+'uploadnologin' => 'Şıma cıkewtış nêvıraşto',
 'uploadnologintext' => 'Ti gani [[Special:UserLogin|cikewte]] biyo ke dosya bar bike.',
 'upload_directory_missing' => 'Direktorê dosyayê ($1)î biyo vînî u webserver de nieşkeno viraziye.',
 'upload_directory_read_only' => 'Direktorê dosyayê ($1)î webserver de nieşkeno binuse.',
@@ -1903,7 +1925,7 @@ Kontrolê emeleyey oyo veş nêbeno.',
 'img-auth-accessdenied' => 'Cıresnayış vındarnayo.',
 'img-auth-nopathinfo' => 'PATH_INFO kemiyo.
 Teqdimkerê şıma seba ravurnayışê nê melumati eyar nêkerdo.
-Beno ke be CGI-bıngeyın bo u img_auth rê destek nêbeno.
+Beno ke be CGI-bıngeyın bo u img_auth rê desteg nêbeno.
 https://www.mediawiki.org/wiki/Manual:Image_Authorization Selahiyetê resımi bıvêne.',
 'img-auth-notindir' => 'Patikayê ke ti wazeno direktorê bar biyayişî de çin o.',
 'img-auth-badtitle' => '"$1" ra nieşkeno yew seroğê raştî virazî.',
@@ -1925,7 +1947,6 @@ qey pawıtışi, img_auth.php battal verdiyayo.",
 'http-read-error' => 'Wendişê HTTP de xeta esta.',
 'http-timed-out' => 'Waştişê HTTP qediya.',
 'http-curl-error' => 'Xetayê URLi: $1',
-'http-host-unreachable' => 'URL rê niresa.',
 'http-bad-status' => 'Waştişê tu HTTP yew problem biya: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2079,6 +2100,11 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'disambiguationspage' => 'Template:Maneo bin',
 'disambiguations-text' => "Peleyê ke satır da sıteyên dı pelanê '''maneo bin'''i rê esteyina zeregri mocnenê. Nara satırda dıdın dı zi <br />tiya de [[MediaWiki:Disambiguationspage|Pelaya Maneo do bini ]] gani heme gıreyê şablonê ciya-manayan re gıre dayış icab keno.",
 
+'pageswithprop' => 'Peli be yew xısusiyetê pele',
+'pageswithprop-legend' => 'Peli be yew xısusiyetê pele',
+'pageswithprop-prop' => 'Nameyo xısusi:',
+'pageswithprop-submit' => 'Şo',
+
 'doubleredirects' => 'Hetenayışê dıletıni',
 'doubleredirectstext' => 'no pel pelê ray motışani liste keno.
 gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
@@ -2092,12 +2118,12 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'brokenredirects-edit' => 'bıvurne',
 'brokenredirects-delete' => 'bestere',
 
-'withoutinterwiki' => 'Peleyê ke zıwanan de bina re gırey cı çınyo',
+'withoutinterwiki' => 'Pelê ke zıwananê binan rê gıreyê cı çıniyo',
 'withoutinterwiki-summary' => 'Enê pelî ke versiyonê ziwanî binî ra link nidano.',
 'withoutinterwiki-legend' => 'Verole',
 'withoutinterwiki-submit' => 'Bımocne',
 
-'fewestrevisions' => 'Peleyê ke cı sero tewr tayn timaryayış vıraziyayo',
+'fewestrevisions' => 'Pelê be senık çımraviyarnayışi',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|bayti}}',
@@ -2115,17 +2141,17 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'uncategorizedpages' => 'Pelayanê ke kategorî nibiye',
 'uncategorizedcategories' => 'Kategoriyê ke bê kategorîyê',
 'uncategorizedimages' => 'Dosyayê ke bê kategoriyê',
-'uncategorizedtemplates' => 'Şablonê ke bê kategoriyê',
+'uncategorizedtemplates' => 'Şablonê ke bêkategoriyê',
 'unusedcategories' => 'Kategoriyê ke nê xebtênê',
 'unusedimages' => 'Dosyeyê ke nê xebtênê',
 'popularpages' => 'Pelî ke populer o.',
 'wantedcategories' => 'Kategoriye ke waştênê',
 'wantedpages' => 'Peleye ke waştênê',
 'wantedpages-badtitle' => 'sernuşte meqbul niyo: $1',
-'wantedfiles' => 'Dosyeye ke waştênê',
+'wantedfiles' => 'Dosyeyê cıgeyriyayey',
 'wantedfiletext-cat' => 'Dosyaya cêrên karvıstedeya lakin çınya. Mewcud dosyayan de xeriba miyan de liste bena. Xırabiya wınisin dana <del>ateber</del>. Zewbi zi, şırê pela da dosyeyê ke çınyaya [[:$1]].',
 'wantedfiletext-nocat' => 'Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>',
-'wantedtemplates' => 'Şablonê ke waştênê',
+'wantedtemplates' => 'Şablonê ke waziyenê',
 'mostlinked' => 'Pelî ke tewr zafî lînk bîy.',
 'mostlinkedcategories' => 'Kategorî ke tewr zafî lînk bîy.',
 'mostlinkedtemplates' => 'Şablonê ke tewr zafî pela re gıre bîye.',
@@ -2137,14 +2163,14 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'prefixindex-namespace' => 'Peleyê Veroleyıni ($1 cay nami)',
 'shortpages' => 'Pelê kılmeki',
 'longpages' => 'Peleyê dergeki',
-'deadendpages' => 'pelê ke pelê binan re gırey nêeşto',
+'deadendpages' => 'Pelê nêgıredayey',
 'deadendpagestext' => 'Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.',
-'protectedpages' => 'Pelayê ke biyê star',
+'protectedpages' => 'Pelê pawıtiyey',
 'protectedpages-indef' => 'têna pawıteyê bêmuddeti',
 'protectedpages-cascade' => 'Kilit biyaye ke teyna cascadiye',
 'protectedpagestext' => 'pelê cêrınî pawiyenê',
 'protectedpagesempty' => 'pê ney parametreyan pelê pawiteyi çinî',
-'protectedtitles' => 'Sernameyê ke starênê',
+'protectedtitles' => 'Sernameyê pawıtiyey',
 'protectedtitlestext' => 'sernameyê cêrıni pawıte yî',
 'protectedtitlesempty' => 'pê ney parametreyan sernuşteyê pawite çinê',
 'listusers' => 'Listeyê Karberan',
@@ -2228,11 +2254,11 @@ hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
 # Special:LinkSearch
 'linksearch' => 'Gıreyê teberi cı geyrê',
 'linksearch-pat' => 'bıgêr motif:',
-'linksearch-ns' => 'Cayênameyî:',
+'linksearch-ns' => 'Cayê namey:',
 'linksearch-ok' => 'Cı geyre',
 'linksearch-text' => 'Jokeri ê zey "*.wikipedia.org"i benê ke bıgureniyê.
 Tewr senık yew sewiya serêna cayê tesiri lazıma, mesela "*.org".<br />
-Qeydeyê destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).',
+Qeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).',
 'linksearch-line' => '$1, $2 ra link biya',
 'linksearch-error' => 'jokeri têna nameyê makina ya serekini de aseni/eseni.',
 
@@ -2245,7 +2271,7 @@ Qeydeyê destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke n
 # Special:ActiveUsers
 'activeusers' => 'Listey karberan de aktivan',
 'activeusers-intro' => 'Ena yew listeya karberê ke $1 {{PLURAL:$1|roc|rocan}} ra tepya iştiraq kerdo ênan mocneno.',
-'activeusers-count' => 'Karberi {{PLURAL:$3|roce peyni de|$3 roca peyni de}} $1 {{PLURAL:$1|vurnayış|vurnayışi}} kerdê',
+'activeusers-count' => '$1 peyni {{PLURAL:$3|roz de|$3 rozan de}} $1 {{PLURAL:$1|hereket|hereketi}} kerdê',
 'activeusers-from' => 'Enê karberi ra tepya bımocne:',
 'activeusers-hidebots' => 'Botan bınımne',
 'activeusers-hidesysops' => 'İdarekerdoğan bınımne',
@@ -2311,16 +2337,16 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
-'watchlist' => 'Lista mına seyrkerdışi',
+'watchlist' => 'Lista seyrkerdışi',
 'mywatchlist' => 'Lista seyrkerdışi',
 'watchlistfor2' => 'Qandê $1 ($2)',
 'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
 'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
-'watchnologin' => 'Şıma de nêkewtê',
+'watchnologin' => 'Şıma cıkewtış nêvıraşto',
 'watchnologintext' => 'qey vurnayişê listeya temaşakerdışi [[Special:UserLogin|gani şıma hesab akeri]].',
 'addwatch' => 'Listeyê seyri deke',
 'addedwatchtext' => 'Ma pele "[[:$1]]" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.
-Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem ma tu ri heber dun, zerri [[Special:RecentChanges|list of recent changes]] name pele beno qalın. Tı ri beno qolay çıta vurnaye biyo.',
+Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.',
 'removewatch' => 'Listedê mınê seyr kerdışi ra hewad',
 'removedwatchtext' => 'Ena pela "[[:$1]]" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].',
 'watch' => 'Temaşe ke',
@@ -2331,8 +2357,8 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem
 'notvisiblerev' => 'Revizyon esteriyayo',
 'watchnochange' => 'pelê listeya temaşakerdışê şıma ye wextê nişane biyaye de rocane nêbiyo.',
 'watchlist-details' => '{{PLURAL:$1|$1 pele|$1 peleyan}} listeyê seyr-kerdışi şıma dı, peleyanê vurnayışi dahil niyo.',
-'wlheader-enotif' => 'pê E-mail xeber dayiş biyo a.',
-'wlheader-showupdated' => "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
+'wlheader-enotif' => 'pê E-mail xeber dayiş biyo a.',
+'wlheader-showupdated' => "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
 'watchmethod-recent' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
 'watchmethod-list' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
 'watchlistcontains' => 'listeya seyrkerdışê şıma de $1 tene {{PLURAL:$1|peli|peli}} estî.',
@@ -2351,10 +2377,10 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem
 'enotif_impersonal_salutation' => '{{SITENAME}} karber',
 'enotif_subject_deleted' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} esterıt.',
 'enotif_subject_created' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} vıraşt',
-'enotif_subject_moved' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} berde',
+'enotif_subject_moved' => '{{SITENAME}} de  pera $1 {{gender:$2|$2}} berd',
 'enotif_subject_restored' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} timar ke',
 'enotif_subject_changed' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} vurne',
-'enotif_body_intro_deleted' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i esterıt, rewizyonê $3 bıvin.',
+'enotif_body_intro_deleted' => 'Pela {{SITENAME}} terefê $1, $2 ra roca $PAGEEDITDATE de {{GENDER:$2|esteriye}}, bıvênên: $3.',
 'enotif_body_intro_created' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i vıraşt, rewizyonê $3 bıvin.',
 'enotif_body_intro_moved' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i berd, rewizyonê $3 bıvin.',
 'enotif_body_intro_restored' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i timar ke, rewizyonê $3 bıvin.',
@@ -2396,8 +2422,8 @@ Qey hemkari u pêşniyazi:
 # Delete
 'deletepage' => 'Pele bestere',
 'confirm' => 'Testiq ke',
-'excontent' => "behso kêm: '$1'",
-'excontentauthor' => "behso kêm: '$1' no/na ('[[Special:Contributions/$2|$2]]'  teyna iştıraq kerdo)",
+'excontent' => "Zerrey cı: '$1'",
+'excontentauthor' => "Zerrey cı: '$1' no/na ('[[Special:Contributions/$2|$2]]'  teyna iştıraq kerdo)",
 'exbeforeblank' => "behsê verê esteriyayişi: '$1'",
 'exblank' => 'zerreyê peli vengo',
 'delete-confirm' => '"$1" bestere',
@@ -2480,9 +2506,9 @@ Hesıbyayê sazê pela da '''$1''' enêyê:",
 'protect-cascadeon' => 'Ena pele nıka kılit biya. Çınki ena pele zerre listeyê {{PLURAL:$1|pele, ki|peleyan, which li}} bınê "cascading protection"iyo.
 Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading protection"i bıvurno.',
 'protect-default' => 'Destur bıde karberan pêrune',
-'protect-fallback' => 'Desturê "$1" lazımo',
+'protect-fallback' => 'Tenya karberanê be izna "$1" rê destur bıde',
 'protect-level-autoconfirmed' => 'Karberanê neweyan u qeyd-nêbiyaoğan kılit ke',
-'protect-level-sysop' => 'Tenya idarekeri',
+'protect-level-sysop' => 'Tenya idarekeran rê destur bıde',
 'protect-summary-cascade' => 'çırrayış',
 'protect-expiring' => 'qediyeno $1 (UTC)',
 'protect-expiring-local' => '$1 do bı qedyo',
@@ -2511,12 +2537,12 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 'restriction-edit' => 'Bıvurne',
 'restriction-move' => 'Berê',
 'restriction-create' => 'Vıraze',
-'restriction-upload' => 'Barke',
+'restriction-upload' => 'Bar ke',
 
 # Restriction levels
-'restriction-level-sysop' => 'pawıtışê tamamîye',
-'restriction-level-autoconfirmed' => 'nêm-pawıtış',
-'restriction-level-all' => 'seviye ya ke raşt ame',
+'restriction-level-sysop' => 'tam pawiyayo',
+'restriction-level-autoconfirmed' => 'nêm pawiyayo',
+'restriction-level-all' => 'heme yew sewiya',
 
 # Undelete
 'undelete' => 'Peleyê ke besterneyayê enê bımocnê',
@@ -2574,7 +2600,7 @@ $1',
 'namespace' => 'Cayê namey:',
 'invert' => 'Weçinıtışo peyserki',
 'tooltip-invert' => 'nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê',
-'namespace_association' => 'Cayê nameyanê eleqedaran',
+'namespace_association' => 'Cayê nameyanê elaqedaran',
 'tooltip-namespace_association' => 'Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê',
 'blanknamespace' => '(Ser)',
 
@@ -2591,12 +2617,12 @@ $1',
 'sp-contributions-newbies' => 'Tenya iştıraqanê karberanê neweyan bımocne',
 'sp-contributions-newbies-sub' => 'Qe hesebê newe',
 'sp-contributions-newbies-title' => 'Îştîrakê karberî ser hesabê neweyî',
-'sp-contributions-blocklog' => 'Qeydê kılit-kerdışi',
-'sp-contributions-deleted' => 'vurnayîşê karberî wedariyayê',
+'sp-contributions-blocklog' => 'Qeydê kılitkerdışi',
+'sp-contributions-deleted' => 'iştırakê karberiê esterıtey',
 'sp-contributions-uploads' => 'barkerdey',
 'sp-contributions-logs' => 'qeydi',
-'sp-contributions-talk' => 'mesac',
-'sp-contributions-userrights' => 'Îdarayê heqqanê karberan',
+'sp-contributions-talk' => 'werênayış',
+'sp-contributions-userrights' => 'İdareyê heqanê karberan',
 'sp-contributions-blocked-notice' => 'verniyê no/na karber/e geriyayo/a
 qê referansi qeydê vernigrewtışi cêr de eşkera biyo:',
 'sp-contributions-blocked-notice-anon' => 'Eno adresê IPi bloke biyo.
@@ -2702,8 +2728,8 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'ipblocklist-empty' => 'Lista kılitkerdışi venga.',
 'ipblocklist-no-results' => 'Adresa IPya waştiye ya zi namey karberi kılit nêbiyo.',
 'blocklink' => 'kılit ke',
-'unblocklink' => 'bloqi hewad',
-'change-blocklink' => 'kılit-kerdışi bıvurne',
+'unblocklink' => 'a ke',
+'change-blocklink' => 'kılitkerdışi bıvurne',
 'contribslink' => 'iştıraqi',
 'emaillink' => 'e-poste bırışe',
 'autoblocker' => 'Şıma otomatikmen kılit biy, çıke adresa şımawa \'\'IP\'\'y terefê "[[User:$1|$1]]" gureniyena.
@@ -2808,7 +2834,7 @@ Ma tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
 Oturse, 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''.",
-'movenologin' => 'Şıma de nêkewtê',
+'movenologin' => 'Şıma cıkewtış nêvıraşto',
 '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',
 'movenotallowedfile' => 'desturê şıma çino, şıma pelan bıkırışi',
@@ -2844,8 +2870,8 @@ Yewna name bınus.',
 'delete_and_move_text' => '==gani hewn a bıbıo/bıesteriyo==
 
 " no [[:$1]]" name de yew pel ca ra esto. şıma wazeni pê hewn a kerdışê ey peli vurnayişê nameyi bıkeri?',
-'delete_and_move_confirm' => 'Heya, na pele bestere',
-'delete_and_move_reason' => '"[[$1]]" qey vurnayişê nameyi esteriya',
+'delete_and_move_confirm' => 'Eya, na pele bestere',
+'delete_and_move_reason' => '"[[$1]]" qande nami re ca akerdışi re besteriyaye',
 'selfmove' => 'name yo ke şıma wazeni bıbo, ın name û name yo ke ca ra esto eyni yê /zepê yê. vurnayiş mumkin niyo.',
 'immobile-source-namespace' => '"$1" pelê cayi de nameyi nêkırışyenî',
 'immobile-target-namespace' => 'peli nêkırışiyeni "$1" cayê nameyan',
@@ -2881,8 +2907,8 @@ ma vaci: qey pelê "[[{{MediaWiki:Mainpage}}]]i " [[{{#Special:Export}}/{{MediaW
 '''Not:''' pê no form teberdayişê verê (tarix) pelan battal biyo",
 'exportlistauthors' => 'zerre de qandê her pela listey iştiraxkara esto',
 'export-submit' => 'Teber de',
-'export-addcattext' => 'kategoriya cerıni ra maddeyan têare ker',
-'export-addcat' => 'têare ker',
+'export-addcattext' => 'Kategoriye ra pelan têare ke',
+'export-addcat' => 'Têare ke',
 'export-addnstext' => 'pelan cayê nameyan ra têare ker',
 'export-addns' => 'têare ker',
 'export-download' => 'yewna qaydeyi de qeydker',
@@ -2997,7 +3023,7 @@ dosyaya emaneti vindbiyo',
 'tooltip-pt-watchlist' => 'Lista pelanê ke to gırewtê seyrkerdış',
 'tooltip-pt-mycontris' => 'Yew lista iştıraqanê şıma',
 'tooltip-pt-login' => 'Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo',
-'tooltip-pt-anonlogin' => 'Seba cıkewtışi şıma rê dewato; labelê, no zeruri niyo',
+'tooltip-pt-anonlogin' => 'Seba cıkewtışê şıma rê dewato; labelê, no zeruri niyo',
 'tooltip-pt-logout' => 'Bıveciye',
 'tooltip-ca-talk' => 'Zerrey pela sero werênayış',
 'tooltip-ca-edit' => 'Tı şenay na pele bıvurnê.
@@ -3104,6 +3130,7 @@ Tı eşkeno yew sebeb bınus.',
 'pageinfo-robot-noindex' => 'İndeksnêbiyayen',
 'pageinfo-views' => 'Amarina mocnayışan',
 'pageinfo-watchers' => 'Amariya pela serykeran',
+'pageinfo-few-watchers' => '$1 ra tayê {{PLURAL:$1|seyrker|seyrkeri}}',
 'pageinfo-redirects-name' => 'Hetenayışê na pela',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Bınpelê na pela',
@@ -3118,24 +3145,24 @@ Tı eşkeno yew sebeb bınus.',
 'pageinfo-recent-authors' => 'Amarina nuştekaran pêro',
 'pageinfo-magic-words' => '{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne',
-'pageinfo-templates' => '{{PLURAL:$1|Şablon|Şabloni}} ($1) açarneyayê',
+'pageinfo-templates' => '{{PLURAL:$1|Şablono|Şablonê}} ke mocniyenê ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|1 Pele|$1 Pelan}} de bestiya pıra',
 'pageinfo-toolboxlink' => 'Melumatê pele',
 'pageinfo-redirectsto' => 'Beno hetê',
 'pageinfo-redirectsto-info' => 'melumat',
 'pageinfo-contentpage' => 'Zey jû pela zerreki hesebiyena',
-'pageinfo-contentpage-yes' => 'Heya',
+'pageinfo-contentpage-yes' => 'Eya',
 'pageinfo-protect-cascading' => 'Sıtarkerdey tiya cı ra yenê war',
-'pageinfo-protect-cascading-yes' => 'Heya',
+'pageinfo-protect-cascading-yes' => 'Eya',
 'pageinfo-protect-cascading-from' => 'Sıtarkerdey cı ra yenê war',
+'pageinfo-category-info' => 'Şınasiya kategoriye',
+'pageinfo-category-pages' => 'Amarê pelan',
+'pageinfo-category-subcats' => 'Amarê bınkategoriyan',
+'pageinfo-category-files' => 'Amarê dosyeyan',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalciya',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Şıq',
-'skinname-simple' => 'Rehat',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3212,19 +3239,33 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1, $2 × $3',
-'seconds-abbrev' => '$1s',
-'minutes-abbrev' => '$1m',
+'seconds-abbrev' => '$1 san',
+'minutes-abbrev' => '$1 deq',
 'hours-abbrev' => '$1h',
 'days-abbrev' => '$1d',
-'seconds' => 'verdê {{PLURAL:$1|$1 saniya|$1 saniya}}',
-'minutes' => 'verdê {{PLURAL:$1|$1 daka|$1 daka}}',
-'hours' => 'Verdê {{PLURAL:$1|$1 seata|$1 seata}}',
-'days' => 'Verdê {{PLURAL:$1|$1 rocan|$1 rocan}}',
-'months' => '{{PLURAL:$1|aşme|$1 aşmi}}',
-'years' => '{{PLURAL:$1|$1 serre|$1 serri}}',
-'ago' => 'Verdê $1',
+'seconds' => '{{PLURAL:$1|$1 saniya|$1 saniyeyan}}',
+'minutes' => '{{PLURAL:$1|$1 deqa|$1 deqan}}',
+'hours' => '{{PLURAL:$1|$1 saete|$1 saetan}}',
+'days' => '{{PLURAL:$1|$1 roce|$1 rocan}}',
+'weeks' => '{{PLURAL:$1|$1 hefte|$1 hefteyan}}',
+'months' => '{{PLURAL:$1|aşme|$1 aşman}}',
+'years' => '{{PLURAL:$1|$1 serre|$1 serran}}',
+'ago' => 'Verê $1',
 'just-now' => 'Hema newke',
 
+# Human-readable timestamps
+'hours-ago' => 'Verê $1 {{PLURAL:$1|saete|saetan}}',
+'minutes-ago' => 'Verê $1 {{PLURAL:$1|deqa|deqan}}',
+'seconds-ago' => 'Verê $1 {{PLURAL:$1|saniya|saniyeyan}}',
+'monday-at' => 'Dışeme $1 de',
+'tuesday-at' => 'Sêşeme $1 de',
+'wednesday-at' => 'Çarşeme $1 de',
+'thursday-at' => 'Pancşeme $1 de',
+'friday-at' => 'Êne $1 de',
+'saturday-at' => 'Şeme $1 de',
+'sunday-at' => 'Kırê $1 de',
+'yesterday-at' => 'Vızêri $1 de',
+
 # Bad image list
 'bad_image_list' => 'Şeklo umumi wınayo:
 
@@ -3234,8 +3275,6 @@ Na rêze de her gırêyo bin zey istisna vêniyeno, yanê pelê ke dosya beno ke
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3311,7 +3350,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Herayey',
 'exif-imagelength' => 'Dergi',
 'exif-bitspersample' => 'yew parçe de biti',
@@ -3341,7 +3380,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-artist' => 'Nuştoğ',
 'exif-copyright' => 'Wahirê copyrighti',
 'exif-exifversion' => 'Versiyonê Exif',
-'exif-flashpixversion' => 'Versiyonê Flashpix destek bike',
+'exif-flashpixversion' => 'Versiyonê Flashpix rê biyo desteg',
 'exif-colorspace' => 'Cayê rengi',
 'exif-componentsconfiguration' => 'manayê qisimê hemi',
 'exif-compressedbitsperpixel' => 'Modê komprasyonê resimi',
@@ -3504,7 +3543,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nêdegusneyayo',
 'exif-compression-2' => 'CCITT Grube 3 1-ebadın kodkerdışê dergiya gurenayışê Huffmanio modifiyekerde',
 'exif-compression-3' => 'CCITT Group 3 fax kodkerdış',
@@ -3772,7 +3811,7 @@ Wextê kod ê konfirmasyonî viyerto.',
 'confirmemail_needlogin' => ' $1 lazimo ke ti adresê emaîl ê xo konfirme bike.',
 'confirmemail_success' => 'Email adresê tu konfirme biy.
 Ti eşkeno [[Special:UserLogin|ci kewt]].',
-'confirmemail_loggedin' => 'Eka email adresê tu konfirme biy.',
+'confirmemail_loggedin' => 'E-posta adresiya şıma hendana tesdiq biya.',
 'confirmemail_error' => 'Konfirmasyon ni biy, yew ğelet esto.',
 'confirmemail_subject' => '{{SITENAME}} konfirmasyonê adres ê emalî',
 'confirmemail_body' => 'Brayo delal, mara ke şıma no IP-adresi ra,
@@ -4040,12 +4079,16 @@ enê programiya piya [{{SERVER}}{{SCRIPTPATH}}/COPYING jew kopyay lisans dê GNU
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
 
-# Special:FilePath
-'filepath' => 'Heruna dosyayer',
-'filepath-page' => 'Dosya:',
-'filepath-submit' => 'Şo',
-'filepath-summary' => 'Na pela xısusiye raya temame jû dosya rê ana.
-Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqedar direkt dest keno pê.',
+# Special:Redirect
+'redirect' => "Hetenayışa dosyay, karberi yana  rewizyona ID'i",
+'redirect-legend' => 'Hetenayışa dosya yana pela',
+'redirect-submit' => 'Şo',
+'redirect-lookup' => 'Bewni',
+'redirect-value' => 'Erc:',
+'redirect-user' => "ID'ê Karberi",
+'redirect-revision' => 'Rewizyona pela',
+'redirect-file' => 'Namey dosya',
+'redirect-not-exists' => 'Erc nêvineyê',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dosyayanê zey pêyan cı geyrê',
@@ -4064,16 +4107,16 @@ Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqed
 * Xısusi pelaya normal
 * <span class="mw-specialpagerestricted">Xısusi peleyê keı rê ray nê deyaya.</span>
 * <strong class="mw-specialpagerestricted">Peleya xısusiya ke grota verhefıza.</strong>',
-'specialpages-group-maintenance' => 'Raporê pak tepiştîşî',
+'specialpages-group-maintenance' => 'Raporê tepıştışi',
 'specialpages-group-other' => 'Pelê xasiyê bini',
 'specialpages-group-login' => 'Cı kewe / hesab vıraze',
 'specialpages-group-changes' => 'Vurnayişê peni u logan',
 'specialpages-group-media' => 'Raporê medya u bar kerdîşî',
 'specialpages-group-users' => 'Karber u heqqî',
 'specialpages-group-highuse' => 'Peleyê ke vêşi karênê',
-'specialpages-group-pages' => 'listeyanê pelan',
+'specialpages-group-pages' => 'Listeyê pelan',
 'specialpages-group-pagetools' => 'Haletê pelan',
-'specialpages-group-wiki' => 'Malumatê wiki u haceti',
+'specialpages-group-wiki' => 'Melumat u haceti',
 'specialpages-group-redirects' => 'Pela xasîyê ke heteneyayê',
 'specialpages-group-spam' => 'haletê spami',
 
@@ -4137,44 +4180,47 @@ Ena sita dı newke xırabiya teknik esta.',
 'htmlform-submit' => 'Bişirav',
 'htmlform-reset' => 'Vurnayişî reyna biyar',
 'htmlform-selectorother-other' => 'Bin',
+'htmlform-no' => 'Nê',
+'htmlform-yes' => 'Eya',
+'htmlform-chosen-placeholder' => 'Opsiyon weçine',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 tam-metn destegê cı geyrayışiya piya',
 'sqlite-no-fts' => '$1 tam-metn bê destegê cı geyrayışi',
 
 # New logging system
-'logentry-delete-delete' => "Karber $1' pelay $3' besternê",
-'logentry-delete-restore' => "Karber $1' pelay $3' peyser grot",
-'logentry-delete-event' => '$1 asaneyaışê {{PLURAL:$5|weqey roceke|$5 weqey rocekan}} kerdi het de $3: $4 vurna',
-'logentry-delete-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı vurna',
-'logentry-delete-event-legacy' => '$1 Asayışê vurnayışê $3 dekerde de',
-'logentry-delete-revision-legacy' => '$1 revizyonê pela da $3 asayışê cı vurna',
-'logentry-suppress-delete' => '$1  $3 rê pıloxneyê',
-'logentry-suppress-event' => '$1 asayışê  {{PLURAL:$5|weqey rocaka|$5 weqey rocekan}}  $3: $4 miyanıki vurna',
-'logentry-suppress-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı xısusiye vurna',
-'logentry-suppress-event-legacy' => '$1 Asayışê vurnayışê ciyo xısusiyeta cı $3 dekerde de',
-'logentry-suppress-revision-legacy' => '$1 revizyonê pela da $3 asayışê cıyo xısuiye vurna',
-'revdelete-content-hid' => 'zerreko nımte',
-'revdelete-summary-hid' => 'xulusaya vurnayışa nımneyê',
-'revdelete-uname-hid' => 'namey karberi nımteyo',
-'revdelete-content-unhid' => 'errek mocneya',
-'revdelete-summary-unhid' => 'Xulusaya vurnayışa mucneyê',
-'revdelete-uname-unhid' => 'namey karberi ne nımteyo',
-'revdelete-restricted' => 'verger (vergırewtış) ê ke qey xızmkaran biye',
-'revdelete-unrestricted' => 'verger (ver gırewtış) ê ke qey xızmkaran diyê wera (wedariyê)',
-'logentry-move-move' => "Karber $1' pelay $3' berd $4",
-'logentry-move-move-noredirect' => "$1'i pelay $3 raçarnayış neker dı u berd $4",
-'logentry-move-move_redir' => '$1 pela $3 pela da $4 sera hetenayış ra ahulnê',
-'logentry-move-move_redir-noredirect' => '$1 hetenayışê qeydê pela da  $3 ahulnê $4 sero hetenayış vıraşt',
-'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 ke kontrol',
-'logentry-patrol-patrol-auto' => "$1 pelay $3'i rewizyon dê $4 ya kontrol ke",
-'logentry-newusers-newusers' => 'Hesabê karberi $1 vıraziya',
-'logentry-newusers-create' => 'Hesabê karberi $1 vıraziya',
-'logentry-newusers-create2' => 'Hesabê karberi $1 terefê $3 ra vıraziya',
-'logentry-newusers-autocreate' => 'Hesabê $1 Otomatikmen vıraziya',
-'logentry-rights-rights' => '$1 qandê $3 rê ezayina grube $4 ra $5 vuriye',
-'logentry-rights-rights-legacy' => '$1 qandê $3 rê ezayina grube vuriye',
-'logentry-rights-autopromote' => '$1 otomatikmen $4 ra terfi bi ra $5',
+'logentry-delete-delete' => '$1 pera $3 {{GENDER:$2|besternê}}',
+'logentry-delete-restore' => '$1 pela $3 {{GENDER:$2|peyser arde}}',
+'logentry-delete-event' => '$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}',
+'logentry-delete-revision' => '$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}',
+'logentry-delete-event-legacy' => '$1 Asayışê {{GENDER:$2|vurnayışê}} $3 dekerde de',
+'logentry-delete-revision-legacy' => '$1 pela $3 de asayışê revizyonan {{GENDER:$2|vurna}}',
+'logentry-suppress-delete' => '$1 Pela $3 {{GENDER:$2|dewosiyayiye}}',
+'logentry-suppress-event' => '$1 pela $3: $4 de dızdêni asayışê {{PLURAL:$5|yew weqeyo rocane|$5 weqeyê rocaney}} {{GENDER:$2|vurnay}}',
+'logentry-suppress-revision' => '$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} dızdêni {{GENDER:$2|vurna}}',
+'logentry-suppress-event-legacy' => '$3 asayışê cıyo xısusi $1 dızdêni {{GENDER:$2|vurna}}',
+'logentry-suppress-revision-legacy' => '$3 asayışê cıyo xısusi $1 dızdêni {{GENDER:$2|vurna}}',
+'revdelete-content-hid' => 'zerrek nımıteyo',
+'revdelete-summary-hid' => 'xulasaya vurnayışi nımıtiya',
+'revdelete-uname-hid' => 'nameyê karberi nımıteyo',
+'revdelete-content-unhid' => 'zerrek nênımıteyo',
+'revdelete-summary-unhid' => 'xulasaya vurnayışi nênımıtiya',
+'revdelete-uname-unhid' => 'nameyê karberi nênımıteyo',
+'revdelete-restricted' => 'vergırewtışê ke xızmekaran rê biye',
+'revdelete-unrestricted' => 'vergırewtışê ke xızmekaran rê dariyê we',
+'logentry-move-move' => '$1 pela $3 {{GENDER:$2|berd}} $4',
+'logentry-move-move-noredirect' => 'Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4',
+'logentry-move-move_redir' => 'Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4',
+'logentry-move-move_redir-noredirect' => 'Hetenayışi sera pela $3 ra $1 {{GENDER:$2|berd}} pela $4',
+'logentry-patrol-patrol' => '$1 versiyono $4 ke {{GENDER:$2|nişan biyo}} pela $3 ra qontrol kerd',
+'logentry-patrol-patrol-auto' => 'Çımraviyarnayışê $4 pela $3 ke $1 otomatikman {{GENDER:$2|nişan biyo}} qontrol kerd',
+'logentry-newusers-newusers' => 'Hesabê karberê $1 {{GENDER:$2|vıraziya}}',
+'logentry-newusers-create' => 'Hesabê karberi $1 {{GENDER:$2|vıraziya}}',
+'logentry-newusers-create2' => 'Hesabê karberi $1 terefê $3 ra {{GENDER:$2|vıraziya}}',
+'logentry-newusers-autocreate' => 'Hesabê karberi $1 otomatikmen {{GENDER:$2|vıraşt}}',
+'logentry-rights-rights' => '$1 qandê $3 rê ezayiya grube $4 ra $5 {{GENDER:$2|vuriye}}',
+'logentry-rights-rights-legacy' => '$1 qandê $3 rê ezayiya grube {{GENDER:$2|vuriye}}',
+'logentry-rights-autopromote' => '$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}',
 'rightsnone' => '(çino)',
 
 # Feedback
@@ -4228,6 +4274,7 @@ Ena sita dı newke xırabiya teknik esta.',
 'api-error-ok-but-empty' => 'Xırabiya zerrek:Wastero cıwan nêdano.',
 'api-error-overwrite' => 'Ser yew dosyayê ke hama esta, ser ey qeyd nibena.',
 'api-error-stashfailed' => 'Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.',
+'api-error-publishfailed' => 'Xetaya zerrey: Cıgeyrayoği nêşiya dosyaya rocaniye akero.',
 'api-error-timeout' => 'Cıwab dayışê wasteri peyra mend.',
 'api-error-unclassified' => 'Yew xeteyê nizanyeni biya.',
 'api-error-unknown-code' => "$1'dı jew xeta vıciye",
index 00c9dcb..33f3516 100644 (file)
@@ -14,6 +14,7 @@
  * @author Kaganer
  * @author Michawiki
  * @author Murjarik
+ * @author Nemo bis
  * @author Nepl1
  * @author Pe7er
  * @author Qualia
@@ -188,8 +189,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Licbu wobglědujucych wužywarjow pokazaś',
 'tog-oldsig' => 'Eksistěrujuca signatura:',
 'tog-fancysig' => 'Ze signaturu kaž z wikitekstom wobchadaś (bźez awtomatiskego wótkaza)',
-'tog-externaleditor' => 'Eksterny editor ako standard wužywaś (jano za ekspertow, pomina sebje specialne nastajenja na wašom licadle. [//www.mediawiki.org/wiki/Manual:External_editors Dalšne informacije.])',
-'tog-externaldiff' => 'Eksterny diff ako standard wužywaś (jano za ekspertow, pomina sebje specialne nastajenja na wašom licadle. [//www.mediawiki.org/wiki/Manual:External_editors Dalšne informacije.])',
 'tog-showjumplinks' => 'Wótkaze typa „źi do” zmóžniś',
 'tog-uselivepreview' => 'Live-pśeglěd wužywaś (JavaScript) (eksperimentelnje)',
 'tog-forceeditsummary' => 'Warnowaś, gaž pśi składowanju zespominanje felujo',
@@ -203,6 +202,7 @@ $messages = array(
 'tog-diffonly' => 'Pśi pśirownowanju wersijow jano rozdźěle pokazaś',
 'tog-showhiddencats' => 'Schowane kategorije pokazaś',
 'tog-norollbackdiff' => 'Rozdźěl pó slědkstajenju zanjechaś',
+'tog-useeditwarning' => 'Warnowaś, gaž bok spušća se z njeskłaźonymi změnami',
 
 'underline-always' => 'pśecej',
 'underline-never' => 'žednje',
@@ -674,10 +674,8 @@ Sy snaź swójo gronidło južo wuspěšnje změnił abo nowe nachylne gronidło
 
 # Special:PasswordReset
 'passwordreset' => 'Gronidło slědk stajiś',
-'passwordreset-text' => 'Wupołni toś ten formular, aby swójo gronidło anulěrował.',
 'passwordreset-legend' => 'Gronidło slědk stajiś',
 'passwordreset-disabled' => 'Slědkstajenja gronidłow su se znjemóžnili na toś tom wikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Zapódaj dołojce jadne ze slědujucych datowych podaśow}}',
 'passwordreset-username' => 'Wužywarske mě:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'E-mail se woglědaś?',
@@ -896,12 +894,14 @@ Njejo žedno wujasnjenje.',
 Zda sem až jo wulašowany.',
 'edit-conflict' => 'Wobźěłański konflikt.',
 'edit-no-change' => 'Wašo wobźěłanje jo se ignorěrowało, dokulaž tekst njejo se změnił.',
+'postedit-confirmation' => 'Twója změna jo se składła.',
 'edit-already-exists' => 'Njejo móžno było nowy bok napóraś.
 Eksistěrujo južo.',
 'defaultmessagetext' => 'Standardny tekst powěźeńki',
 'content-failed-to-parse' => 'Parsowanje wopśimjeśa $2 za model $1 jo se njeraźiło: $3',
 'invalid-content-data' => 'Njepłaśiwe wopśimjeśowe daty',
 'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
+'editwarning-warning' => 'Gaž toś ten bok se spušća, mógu se změny zgubiś, kótarež sy pśewjadł. Jolic sy pśizjawjeny, móžoš toś to warnowanje we wótrězku {{int:prefs-editing}} swójich nastajenjow znjemóžniś.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1182,15 +1182,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-external' => 'Eksterne pytanje',
 'searchdisabled' => 'Pytanje we {{SITENAME}} jo se deaktiwěrowało. Tak dłujko móžoš w googlu pytaś. Pšosym wobmysli, až móžo pytanski indeks za {{SITENAME}} njeaktualny byś.',
 
-# Quickbar
-'qbsettings' => 'Bocna lejstwa',
-'qbsettings-none' => 'Žedne',
-'qbsettings-fixedleft' => 'nalěwo fiksěrowane',
-'qbsettings-fixedright' => 'napšawo fiksěrowane',
-'qbsettings-floatingleft' => 'nalěwo se znosujuce',
-'qbsettings-floatingright' => 'napšawo se znosujuce',
-'qbsettings-directionality' => 'Kšuty, wótwisny wót pisańskego směra twójeje rěcy',
-
 # Preferences page
 'preferences' => 'Nastajenja',
 'mypreferences' => 'Nastajenja',
@@ -1739,7 +1730,6 @@ Za optimalnu wěstotu img_auth.php jo znjemóžnjony.',
 'http-read-error' => 'Cytańska zmólka HTTP.',
 'http-timed-out' => 'HTTP-napšašowanje jo cas pśekšocyło.',
 'http-curl-error' => 'Zmólka pśi wótwółowanju URL: $1',
-'http-host-unreachable' => 'URL njejo był pśistupny.',
 'http-bad-status' => 'Wob cas HTTP-napšašowanje jo problem był: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2142,8 +2132,8 @@ Pózdźejšne změny na toś tom boku a w pśisłušecej diskusiji se tam nalicu
 'notvisiblerev' => 'Wersija bu wulašowana',
 'watchnochange' => 'Žeden wót tebje wobglědowany bok njejo se we wótpowědujucem casu wobźěłał.',
 'watchlist-details' => 'Wobglědujoš {{PLURAL:$1|$1 bok|$1 boka|$1 boki|$1 bokow}}, bźez diskusijnych bokow.',
-'wlheader-enotif' => 'E-mailowe powěsće su aktiwizěrowane.',
-'wlheader-showupdated' => "Boki, kótarež su wót twójogo slědnego woglěda se změnili, pokazuju se '''tucnje'''.",
+'wlheader-enotif' => 'E-mailowe powěsće su aktiwizěrowane.',
+'wlheader-showupdated' => "Boki, kótarež su wót twójogo slědnego woglěda se změnili, pokazuju se '''tucnje'''.",
 'watchmethod-recent' => 'Kontrolěrowanje aktualnych změnow we wobglědowańce',
 'watchmethod-list' => 'Pśepytanje wobglědowanych bokow za aktualnymi změnami',
 'watchlistcontains' => 'Twója wobglědowańka wopśimujo $1 {{PLURAL:$1|bok|boka|boki|bokow}}.',
@@ -2537,6 +2527,7 @@ Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśe
 'proxyblocksuccess' => 'Gótowe.',
 'sorbsreason' => 'Twója IP-adresa jo w DNSBL we {{GRAMMAR:lokatiw|{{SITENAME}}}} zapisana ako wócynjony proxy.',
 'sorbs_create_account_reason' => 'Twója IP-adresa jo w DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} ako wócynjony proxy zapisana. Njejo móžno, nowe wužywarske konta załožowaś.',
+'xffblockreason' => 'IP-adresa w header X-Forwarded-For, pak twója pak ta proksy-serwera, kótaryž wužywaš, jo se zablokěrowała. Spócetna pśicyna za blokěrowanje jo była: $1',
 'cant-block-while-blocked' => 'Njesmějoš žednych drugich wužywarjow blokěrowaś, mjaztym až ty sy blokěrowany.',
 'cant-see-hidden-user' => 'Wužywaŕ, kótaregož wopytujoš blokěrowaś, jo južo zablokěrowany a schowany. Dokulaž njamaš pšawo wužywarja schowaś, njamóžoš blokěrowanje wužywarja wiźeś abo wobźěłaś.',
 'ipbblocked' => 'Njamóžoš drugich wužywarjow blokěrowaś abo wótblokěrowaś, dokulaž ty sam jo zablokěrowany',
@@ -2920,13 +2911,8 @@ W zespominanju dajo se pśicyna pódaś.',
 'pageinfo-category-files' => 'Licba datajow',
 
 # Skin names
-'skinname-standard' => 'Klasiski',
-'skinname-nostalgia' => 'Nostalgiski',
 'skinname-cologneblue' => 'Kölnski Módry',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mój šat',
-'skinname-chick' => 'Kurjetko',
-'skinname-simple' => 'Jadnorje',
 'skinname-modern' => 'Moderny',
 
 # Patrolling
@@ -3034,7 +3020,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šyrokosć',
 'exif-imagelength' => 'Wusokosć',
 'exif-bitspersample' => 'Bity na komponentu',
@@ -3212,7 +3198,7 @@ Slědujuce wótkaze w tej samej smužce se za wuwześa naglědaju, w kótarychž
 'exif-originalimageheight' => 'Wusokosć wobraza pśed pśirězowanim',
 'exif-originalimagewidth' => 'Šyrokosć wobraza pśed pśirězowanim',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Njekompriměrowany',
 'exif-compression-2' => 'CCITT kupka 3 jadnodimensionalne modificěrowane koděrowanje Huffman běgoweje dłujkosći',
 'exif-compression-3' => 'CCITT kupka 3 faksowe koděrowanje',
@@ -3627,13 +3613,6 @@ Ty by dejał [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licence GNU General Public
 'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Datajowa droga',
-'filepath-page' => 'Dataja:',
-'filepath-submit' => 'Pytaś',
-'filepath-summary' => 'Toś ten specialny bok wróśa dopołnu drogu za dataju.
-Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwězanym programom direktnje startuju.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Za duplikatnymi datajami pytaś',
 'fileduplicatesearch-summary' => 'Za datajowymi duplikatami na zakłaźe gótnoty hash pytaś.',
index 436c90a..5cd073a 100644 (file)
@@ -44,8 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pokitono ginumu do momomoguno minongintong',
 'tog-oldsig' => 'Sain poinsandad:',
 'tog-fancysig' => 'Pokitono sain sobaagi do tikwiki (ingaa oporian toput )',
-'tog-externaleditor' => 'Pomoguno pongigidit poinlabus sobaagi do pongoiso (montok di angasampin nopo, mongoguno do nuludan pointantu id kompiutonu. [//www.mediawiki.org/wiki/Manual:External_editors Lobi pomoilaan.])',
-'tog-externaldiff' => 'Pomoguno pongigidit poinlabus sobaagi do pongoiso (montok di angasampin nopo, mongoguno do nuludan pointantu id kompiutonu. [//www.mediawiki.org/wiki/Manual:External_editors Lobi pomoilaan.])',
 'tog-showjumplinks' => 'Pasagao "tumopik hilo" noputan awayaan',
 'tog-uselivepreview' => 'Momoguno pongingintong poimpasi (momoguno JawaSikrip) (pogumbalan)',
 'tog-forceeditsummary' => 'Posoroho oku no nung awu nosuangan kutak koinibaan niditan',
@@ -993,14 +991,6 @@ Umbalai momogonop it ihumonnu miampai do ''all:'' mooi do oihum ot oinsanan suan
 Milo ko mogihum maya Googol do daamot.
 Imurai no do indik suang diti {{SITENAME}} nopo nga nokolipas.',
 
-# Quickbar
-'qbsettings' => 'Barposikap',
-'qbsettings-none' => 'Ingaa',
-'qbsettings-fixedleft' => 'Pogolibango',
-'qbsettings-fixedright' => 'Pawanano',
-'qbsettings-floatingleft' => 'Posoibaho gibang',
-'qbsettings-floatingright' => 'Posoibaho wanan',
-
 # Preferences page
 'preferences' => 'Pipilion',
 'mypreferences' => 'Pipilion',
index a7dafad..233963f 100644 (file)
@@ -37,27 +37,45 @@ $namespaceNames = array(
 );
 
 $specialPageAliases = array(
-       'Allpages'                  => array( 'ހުރިހާ ސަފްޙާއެއް' ),
+       'Activeusers'               => array( 'ހަރަކާތްތެރި_މެމްބަރުން' ),
+       'Allmessages'               => array( 'ހުރިހާ_މެސެޖެއް' ),
+       'Allpages'                  => array( 'ހުރިހާ_ޞަފްޙާއެއް' ),
+       'Ancientpages'              => array( 'ބާ_ޞަފްޙާތައް' ),
+       'Blankpage'                 => array( 'ހުސް_ޞަފްޙާ' ),
        'Contributions'             => array( 'ޙިއްސާ' ),
-       'CreateAccount'             => array( 'މެމްބަރުކަން ހާސިލްކުރައްވާ' ),
-       'Emailuser'                 => array( 'މެމްބަރަށް އީ-މެއިލް ފޮނުވާ' ),
-       'BlockList'                 => array( 'ބްލޮކް ކުރެވިފައިވާ ލިސްޓް' ),
-       'Listfiles'                 => array( 'ފައިލް ލިސްޓް' ),
-       'Longpages'                 => array( 'ދިގު ސަފްޙާތައް' ),
-       'Newimages'                 => array( 'އާ ފައިލް' ),
-       'Newpages'                  => array( 'އާ ސަފްހާތައް' ),
+       'CreateAccount'             => array( 'މެމްބަރުކަން_ހާސިލްކުރައްވާ' ),
+       'Emailuser'                 => array( 'މެމްބަރަށް_އީ-މެއިލް_ފޮނުވާ' ),
+       'BlockList'                 => array( 'ބްލޮކް_ކުރެވިފައިވާ_ލިސްޓް' ),
+       'Listfiles'                 => array( 'ފައިލް_ލިސްޓް' ),
+       'Log'                       => array( 'ލޮގު' ),
+       'Longpages'                 => array( 'ދިގު_ސަފްޙާތައް' ),
+       'Mypage'                    => array( 'މަގޭ_ޞަފްޙާ' ),
+       'Mytalk'                    => array( 'މަގޭ_ވާހަކަ' ),
+       'Myuploads'                 => array( 'މަގޭ_ފައިލުތައް' ),
+       'Newimages'                 => array( 'އާ_ފައިލް' ),
+       'Newpages'                  => array( 'އާ_ސަފްހާތައް' ),
        'Preferences'               => array( 'ތަރުޖީހުތައް' ),
-       'Protectedpages'            => array( 'ދިފާޢުކުރެވިފައިވާ ސަފްޙާތައް' ),
-       'Randompage'                => array( 'ކޮންމެވެސް ސަފްޙާއެއް' ),
-       'Recentchanges'             => array( 'އެންމެ ފަހުގެ ބަދަލްތައް' ),
-       'Shortpages'                => array( 'ކުރު ސަފްޙާތައް' ),
-       'Specialpages'              => array( 'ޙާއްސަ ސަފްޙާތައް' ),
-       'Uncategorizedtemplates'    => array( 'ޤިސްމުކުރެވިފައި ނުވާ ފަންވަތް' ),
-       'Unusedcategories'          => array( 'ބޭނުން ނުކުރާ ޤިސްމުތައް' ),
-       'Unusedimages'              => array( 'ބޭނުން ނުކުރާ ފައިލް' ),
+       'Protectedpages'            => array( 'ދިފާޢުކުރެވިފައިވާ_ސަފްޙާތައް' ),
+       'Protectedtitles'           => array( 'ދިފާޢުކުރެވިފައިވާ_ނަންތައް' ),
+       'Randompage'                => array( 'ކޮންމެވެސް_ސަފްޙާއެއް' ),
+       'Recentchanges'             => array( 'އެންމެ_ފަހުގެ_ބަދަލުތައް' ),
+       'Search'                    => array( 'ހޯއްދަވާ' ),
+       'Shortpages'                => array( 'ކުރު_ސަފްޙާތައް' ),
+       'Specialpages'              => array( 'ޙާއްސަ_ސަފްޙާތައް' ),
+       'Statistics'                => array( 'ތަފާސްހިސާބު' ),
+       'Uncategorizedpages'        => array( 'ޤިސްމުކުރެވިފައިނުވާ_ޞަފްޙާތައް' ),
+       'Uncategorizedtemplates'    => array( 'ޤިސްމުކުރެވިފައިނުވާ_ފަންވަތް' ),
+       'Unusedcategories'          => array( 'ބޭނުން_ނުކުރާ_ޤިސްމުތައް' ),
+       'Unusedimages'              => array( 'ބޭނުން_ނުކުރާ_ފައިލް' ),
+       'Unusedtemplates'           => array( 'ބޭނުންނުކުރާ_ފަންވަތްތައް' ),
        'Upload'                    => array( 'ފޮނުއްވާ' ),
        'Userlogin'                 => array( 'ވަދެވަޑައިގަންނަވާ' ),
-       'Userlogout'                => array( 'ބޭރަށް ވަޑައިގަންނަވާ' ),
+       'Userlogout'                => array( 'ބޭރަށް_ވަޑައިގަންނަވާ' ),
+       'Wantedcategories'          => array( 'ބޭނުންވާ_ޤިސްމުތައް' ),
+       'Wantedfiles'               => array( 'ބޭނުންވާ_ފައިލުތައް' ),
+       'Wantedpages'               => array( 'ބޭނުންވާ_ޞަފްޙާތައް' ),
+       'Wantedtemplates'           => array( 'ބޭނުންވާ_ފަންވަތްތައް' ),
+       'Watchlist'                 => array( 'މަގޭ_ނަޒަރު' ),
 );
 
 $messages = array(
@@ -444,7 +462,9 @@ $1',
 'revisionasof' => '$1ގެ ނުސްހާ',
 'previousrevision' => '→ ކުރީގެ ނުސްހާ',
 'nextrevision' => 'ފަހުގެ ނުސްހާ ←',
+'cur' => 'އެންމެ ފަހުގެ',
 'next' => 'ކުރިޔަށް',
+'last' => 'ފަރަޤު',
 'histfirst' => 'އެންމެ ކުރީގެ',
 'histlast' => 'އެންމެ ފަހުގެ',
 
@@ -453,8 +473,10 @@ $1',
 'revdel-restore-visible' => 'ފާޅު ނުސްހާތައް',
 
 # Diffs
+'history-title' => '"$1"ގެ ތާރީޚް',
 'lineno' => 'ފޮޅުވަތް $1:',
 'compareselectedversions' => 'އިހުތިޔާރު ކުރެވިފައިވާ ނުސްހާތައް އަޅައިކިޔުއްވާ',
+'editundo' => 'ކުރީގެ ނުސްހާއަށް ބަދަލުކުރައްވާ',
 
 # Search results
 'searchresults' => 'ހޯދުމުގެ ނަތީޖާ',
@@ -638,7 +660,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:ListGroupRights
 'listgrouprights-members' => '(މެމްބަރުންގެ ލިސްޓު)',
 
-# E-mail user
+# Email user
 'emailuser' => 'މި މެންބަރަށް އީމޭލު ފޮނުއްވާ',
 
 # Watchlist
@@ -780,6 +802,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'tooltip-preview' => 'ބަދަލުތައް ދައްކަވާ، ރައްކާކުރެއްވުމުގެ ކުރިން މި ބޭނުންކުރައްވާ!',
 'tooltip-watch' => 'މިޞަފްޙާއަށް ނަޒަރުބަހައްޓަވާ',
 'tooltip-rollback' => '"ކުރީގެ ނުސްހާ އަކަށް ބަދަލުކުރައްވާ" އިން މި ޞަފްޙާއަށް އެންމެ ފަހުން އުނިއިތުރު ގެންނެވި މެމްބަރުގެ އުނިއިތުރު(އުނިއިތުރުތައް) ފޮހެލެވޭނެއެވެ.',
+'tooltip-undo' => '"ކުރީގެ ނުސްހާއަށް ބަދަލުކުރައްވާ" އިން މި ނުސްހާގެ ކުރީގައި އިން ނުސްހާއަށް ބަދަލުކޮށްދޭނެއެވެ. އަދި އުނިއިތުރުގެ ޚުލާސާ ލިޔުމުގެ ފުރުސަތު ދޭނެއެވެ.',
 'tooltip-summary' => 'ކުރު ޚުލާސާއެއް ލިޔުއްވާ',
 
 # Info page
@@ -796,7 +819,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Metadata
 'metadata' => 'މެޓަޑޭޓާ',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ފުޅާމިން',
 'exif-imagelength' => 'އުސްމިން',
 'exif-imagedescription' => 'ތަސްވީރުގެ ސުރުހީ',
@@ -824,7 +847,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchlistall2' => 'ހުރިހާ',
 'namespacesall' => 'ހުރިހާ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'އީމޭލު އެޑްރެސް ޔަގީންކުރައްވާ',
 
 # action=purge
index 8afc106..cd4bc63 100644 (file)
@@ -456,7 +456,7 @@ $messages = array(
 # Special:Categories
 'categories' => 'དབྱེ་རིམ།',
 
-# E-mail user
+# Email user
 'emailuser' => 'ལག་ལེན་པ་ལུ་ གློག་འཕྲིན་གཏང་',
 
 # Watchlist
index 5be1194..5c7c89e 100644 (file)
@@ -305,6 +305,9 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
 'group-sysop' => 'Dɔdzikpɔlawo',
 'group-all' => '(wokatã)',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Ŋkɔŋlɔla yeyewo ƒe xexlẽme',
+
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'xlẽ axa sia',
 'action-edit' => 'trɔ asi le axa sia ŋu',
@@ -406,9 +409,6 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
 # Special:LinkSearch
 'linksearch-ok' => 'Dii',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Ŋkɔŋlɔla yeyewo ƒe xexlẽme',
-
 # Special:ListGroupRights
 'listgrouprights-group' => 'Hame',
 
@@ -588,9 +588,6 @@ Wòateŋu akpɔ alesi woŋlɔe.',
 # Special:Version
 'version' => 'Tata',
 
-# Special:FilePath
-'filepath-submit' => 'Yi',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Dii',
 
index 9b0552e..0d97e11 100644 (file)
@@ -322,14 +322,6 @@ Cancellä',
 'powersearch-toggleall' => 'Tütt',
 'powersearch-togglenone' => 'Ansöin',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Ansöin',
-'qbsettings-fixedleft' => 'Fiss a sinistar',
-'qbsettings-fixedright' => 'Fiss a destar',
-'qbsettings-floatingleft' => 'Fluttuant a sinistar',
-'qbsettings-floatingright' => 'Fluttuant a destar',
-
 # Preferences page
 'preferences' => 'Prefereinz',
 'mypreferences' => 'Al me prefereinz',
@@ -390,9 +382,6 @@ Cancellä',
 'right-read' => "Legg' pàgin",
 'right-edit' => 'Mudifich pàgin',
 
-# User rights log
-'rightsnone' => '(ansöin)',
-
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => "legg' custa pàgina ché",
 'action-edit' => 'mudifch custa pàgina ché',
@@ -465,7 +454,7 @@ Cancellä',
 # Special:ListGroupRights
 'listgrouprights-group' => 'Grüpp',
 
-# E-mail user
+# Email user
 'emailfrom' => 'Da:',
 'emailto' => 'A:',
 'emailsubject' => 'Uggett:',
@@ -479,8 +468,8 @@ Cancellä',
 'watchthispage' => 'Vadä custa pàgina ché',
 'unwatch' => "N'la vadär piö",
 
-'changed' => 'mudifegat',
 'created' => 'creät',
+'changed' => 'mudifegat',
 
 # Delete
 'delete-confirm' => 'Cancellä "$1"',
@@ -613,7 +602,7 @@ Vadä la pàgina dal file',
 # Metadata
 'metadata' => 'Metadat',
 
-# EXIF tags
+# Exif tags
 'exif-exposuretime-format' => '$1 s ($2)',
 'exif-gpsareainformation' => "Nom d'la zona GPS",
 'exif-gpsdatestamp' => 'Data GPS',
@@ -660,10 +649,6 @@ Vadä la pàgina dal file',
 'version-license' => 'Licinza',
 'version-poweredby-others' => 'ätar',
 
-# Special:FilePath
-'filepath-page' => 'Immàgin:',
-'filepath-submit' => 'Vé',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Nom dal file:',
 'fileduplicatesearch-submit' => 'Cercä',
@@ -684,6 +669,9 @@ Vadä la pàgina dal file',
 'htmlform-reset' => 'Turna indré cul la mudifich',
 'htmlform-selectorother-other' => 'Ätar',
 
+# New logging system
+'rightsnone' => '(ansöin)',
+
 # Feedback
 'feedback-subject' => 'Uggett:',
 'feedback-message' => "Messagg':",
index a425530..a4f2da1 100644 (file)
@@ -384,8 +384,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Εμφάνιση του αριθμού των συνδεδεμένων χρηστών',
 'tog-oldsig' => 'Υπάρχουσα υπογραφή:',
 'tog-fancysig' => 'Μεταχείριση υπογραφής ως κώδικα wiki (χωρίς αυτόματο σύνδεσμο)',
-'tog-externaleditor' => 'Χρήση εξωτερικού επεξεργαστή από προεπιλογή (για προχωρημένους μόνο, χρειάζεται ειδικές ρυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors Περισσότερες πληροφορίες.])',
-'tog-externaldiff' => 'Χρήση εξωτερικού diff από προεπιλογή (για προχωρημένους μόνο, χρειάζεται ειδικές ρυθμίσεις του υπολογιστή σας. [//www.mediawiki.org/wiki/Manual:External_editors Περισσότερες πληροφορίες.])',
 'tog-showjumplinks' => 'Ενεργοποίησε τους συνδέσμους προσβασιμότητας του τύπου "μετάβαση σε"',
 'tog-uselivepreview' => 'Χρήση ζωντανής προεπισκόπησης (απαιτεί JavaScript) (πειραματικό)',
 'tog-forceeditsummary' => 'Να ειδοποιούμαι κατά την εισαγωγή κενής σύνοψης επεξεργασίας',
@@ -400,6 +398,7 @@ $messages = array(
 'tog-showhiddencats' => 'Εμφάνιση κρυμμένων κατηγοριών',
 'tog-noconvertlink' => 'Απενεργοποίησε την μετατροπή τίτλου συνδέσμου',
 'tog-norollbackdiff' => 'Παράλειψη διαφοράς μετά την εκτέλεση επαναφοράς',
+'tog-useeditwarning' => 'Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές',
 
 'underline-always' => 'Πάντα',
 'underline-never' => 'Ποτέ',
@@ -463,6 +462,18 @@ $messages = array(
 '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',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Κατηγορία|Κατηγορίες}}',
@@ -767,9 +778,18 @@ $2',
 'welcomecreation-msg' => 'Ο λογαριασμός σας έχει δημιουργηθεί.
 Μην ξεχάσετε να αλλάξετε τις [[Special:Preferences|{{SITENAME}} προτιμήσεις]] σας.',
 'yourname' => 'Όνομα χρήστη:',
+'userlogin-yourname' => 'Όνομα χρήστη',
+'userlogin-yourname-ph' => 'Εισάγετε το όνομα χρήστη σας',
 'yourpassword' => 'Κωδικός:',
+'userlogin-yourpassword' => 'Κωδικός',
+'userlogin-yourpassword-ph' => 'Εισάγετε τον κωδικό σας',
+'createacct-yourpassword-ph' => 'Εισαγωγή κωδικού',
 'yourpasswordagain' => 'Πληκτρολογήστε ξανά τον κωδικό',
+'createacct-yourpasswordagain' => 'Επιβεβαίωση κωδικού',
+'createacct-yourpasswordagain-ph' => 'Εισαγωγή κωδικού ξανά',
 'remembermypassword' => 'Διατήρηση του κωδικού πρόσβασης σε αυτόν τον υπολογιστή (για μέγιστο $1 {{PLURAL:$1|ημέρα|ημέρες}})',
+'userlogin-remembermypassword' => 'Διατηρήστε με σε σύνδεση',
+'userlogin-signwithsecure' => 'Χρησιμοποιείστε ασφαλή σύνδεση',
 'securelogin-stick-https' => 'Μείνετε συνδεδεμένοι με HTTPS μετά την είσοδο',
 'yourdomainname' => 'Το domain σας:',
 'password-change-forbidden' => 'Δεν μπορείτε να αλλάξετε τους κωδικούς πρόσβασης σε αυτό το βίκι.',
@@ -782,18 +802,38 @@ $2',
 'logout' => 'Έξοδος',
 'userlogout' => 'Έξοδος',
 'notloggedin' => 'Δεν έχετε συνδεθεί.',
+'userlogin-noaccount' => 'Δεν έχετε λογαριασμό;',
+'userlogin-joinproject' => 'Συνδεθείτε σε {{SITENAME}}',
 'nologin' => "Δεν έχετε λογαριασμό; '''$1'''.",
 'nologinlink' => 'Δημιουργήστε έναν λογαριασμό',
 'createaccount' => 'Δημιουργία νέου λογαριασμού',
 'gotaccount' => "Έχετε ήδη έναν λογαριασμό; '''$1'''.",
 'gotaccountlink' => 'Είσοδος',
 'userlogin-resetlink' => 'Ξεχάσατε τα στοιχεία σύνδεσής σας;',
+'userlogin-resetpassword-link' => 'Έκδοση νέου κωδικού πρόσβασης',
+'helplogin-url' => 'Help:Σύνδεση',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Βοήθεια για τη σύνδεσή σας]]',
+'createacct-join' => 'Εισάγετε τα στοιχεία σας παρακάτω.',
+'createacct-emailrequired' => 'Διεύθυνση ηλεκτρονικού ταχυδρομείου',
+'createacct-emailoptional' => 'Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικό)',
+'createacct-email-ph' => 'Εισάγετε το email σας',
 'createaccountmail' => 'Χρήση τυχαίου προσωρινού κωδικού πρόσβασης και αποστολή του στη διεύθυνση ηλεκτρονικού ταχυδρομείου που καθορίζεται παρακάτω',
+'createacct-realname' => 'Πραγματικό όνομα (προαιρετικό)',
 'createaccountreason' => 'Αιτία:',
+'createacct-reason' => 'Λόγος',
+'createacct-reason-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|συνεισφέρων|συνεισφέροντες}}',
 'badretype' => 'Οι κωδικοί που έχετε δηλώσει δεν συμφωνούν μεταξύ τους.',
 'userexists' => 'Το όνομα χρήστη που εισαγάγατε βρίσκεται ήδη σε χρήση.
 Παρακαλούμε, διαλέξτε ένα διαφορετικό.',
 'loginerror' => 'Σφάλμα σύνδεσης',
+'createacct-error' => 'Σφάλμα δημιουργίας λογαριασμού',
 'createaccounterror' => 'Δεν ήταν δυνατή η δημιουργία λογαριασμού: $1',
 'nocookiesnew' => 'Ο λογαριασμός χρήστη έχει δημιουργηθεί, αλλά δεν έχετε ακόμα συνδεθεί. Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και στη συνέχεια συνδεθείτε χρησιμοποιώντας το νέο όνομα χρήστη σας και τον κωδικό σας.',
 'nocookieslogin' => 'Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και ξαναδοκιμάστε!',
@@ -873,13 +913,13 @@ $2',
 'resetpass-wrong-oldpass' => 'Λάθος προσωρινός ή κανονικός κωδικός.
 Μπορεί να έχετε ήδη αλλάξει επιτυχώς τον κωδικό σας ή να έχετε ζητήσει έναν νέο προσωρινό κωδικό.',
 'resetpass-temp-password' => 'Προσωρινός κωδικός:',
+'resetpass-abort-generic' => 'Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.',
 
 # Special:PasswordReset
 'passwordreset' => 'Κωδικός επαναφοράς',
-'passwordreset-text' => 'Συμπληρώστε αυτή τη φόρμα για να επαναφέρετε τον κωδικό σας.',
 'passwordreset-legend' => 'Επαναφορά κωδικού πρόσβασης',
 'passwordreset-disabled' => 'Η επαναφορά κωδικού πρόσβασης έχει απενεργοποιηθεί σε αυτό το wiki',
-'passwordreset-pretext' => '{{PLURAL:$1||Εισάγεται ένα από τα στοιχεία δεδομένων που βλέπετε παρακάτω}}',
+'passwordreset-emaildisabled' => "Τα χαρακτηριστικά ηλεκτρονικού ταχυδρομείου έχουν απενεργοποιηθεί σ' αυτό το wiki.",
 'passwordreset-username' => 'Όνομα χρήστη:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Προβολή του μηνύματος ηλεκτρονικού ταχυδρομείου που δημιουργήθηκε;',
@@ -902,7 +942,7 @@ $2
 Προσωρινός κωδικός πρόσβασης:$2',
 'passwordreset-emailsent' => 'Έχει αποσταλεί email επαναφοράς κωδικού.',
 'passwordreset-emailsent-capture' => 'Έχει αποσταλεί email επαναφοράς κωδικού, το οποίο φαίνεται πιο κάτω.',
-'passwordreset-emailerror-capture' => 'Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο χρήστη: $1',
+'passwordreset-emailerror-capture' => 'Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο  {{GENDER:$2|χρήστη}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Αλλαγή της διεύθυνσης ηλεκτρονικού ταχυδρομείου',
@@ -1109,8 +1149,11 @@ $2
 'edit-already-exists' => 'Δεν ήταν εφικτό να δημιουργηθεί η νέα σελίδα.
 Υπάρχει ήδη.',
 'defaultmessagetext' => 'Προεπιλεγμένο κείμενο μηνύματος',
+'content-failed-to-parse' => 'Απέτυχε η ανάλυση  περιεχομένου του $2 για το μοντέλο $1:$3',
 'invalid-content-data' => 'Μη έγκυρα δεδομένα περιεχομένου',
 'content-not-allowed-here' => 'Το περιεχόμενο «$1» δεν επιτρέπεται στη σελίδα [[$2]]',
+'editwarning-warning' => 'Αφήνοντας αυτή τη σελίδα μπορεί να σας κάνει να χάσετε κάποιες αλλαγές που έχετε κάνει.
+Αν έχετε συνδεθεί, μπορείτε να απενεργοποιήσετε αυτή την προειδοποίηση στην  ενότητα "Επεξεργασία" των προτιμήσεών σας.',
 
 # Content models
 'content-model-wikitext' => 'βικικείμενο',
@@ -1132,6 +1175,10 @@ $2
 'parser-template-loop-warning' => 'Εντοπίστηκε πρότυπο σε βρόχο: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Το όριο του μάκρους της αναδρομής του πρότυπου έχει ξεπεραστεί ($1)',
 'language-converter-depth-warning' => 'Το όριο βάθους του μετατροπέα γλώσσας έχει ξεπεραστεί ($1)',
+'node-count-exceeded-category' => 'Σελίδες υπέρβασης του αριθμού κόμβων',
+'node-count-exceeded-warning' => 'Η σελίδα έχει υπερβεί τον αριθμό κόμβων',
+'expansion-depth-exceeded-category' => 'Σελίδες υπέρβασης της επέκτασης σε βάθος',
+'expansion-depth-exceeded-warning' => 'Η σελίδα υπερέβη το βάθος επέκτασης',
 'converter-manual-rule-error' => 'Εντοπίστηκε σφάλμα σε μη αυτόματο κανόνα μετατροπής γλώσσας',
 
 # "Undo" feature
@@ -1385,15 +1432,7 @@ $1",
 'powersearch-togglenone' => 'Καμία',
 'search-external' => 'Εξωτερική αναζήτηση',
 'searchdisabled' => 'Η αναζήτηση για τον ιστότοπο "{{SITENAME}}" είναι απενεργοποιημένη. Μπορείτε να αναζητήσετε μέσω του Google εν τω μεταξύ. Σημειώστε ότι οι κατάλογοί τους για το περιεχόμενο του ιστοτόπου "{{SITENAME}}" μπορεί να είναι απαρχαιωμένοι.',
-
-# Quickbar
-'qbsettings' => 'Γρήγορη πρόσβαση',
-'qbsettings-none' => 'Καμία',
-'qbsettings-fixedleft' => 'Σταθερά αριστερά',
-'qbsettings-fixedright' => 'Σταθερά δεξιά',
-'qbsettings-floatingleft' => 'Πλανώμενα αριστερά',
-'qbsettings-floatingright' => 'Πλανώμενα δεξιά',
-'qbsettings-directionality' => 'Διορθώθηκε, ανάλογα με τις κατευθύνσεις του σεναρίου εντολών της γλώσσας σας',
+'search-error' => 'Παρουσιάστηκε σφάλμα κατά την αναζήτηση:$1',
 
 # Preferences page
 'preferences' => 'Προτιμήσεις',
@@ -1884,10 +1923,15 @@ $1',
 'backend-fail-contenttype' => 'Δεν μπόρεσε να προσδιοριστεί ο τύπος περιεχομένου του αρχείου για την αποθήκευση σε "$1".',
 'backend-fail-usable' => 'Δεν ήταν δυνατή η ανάγνωση ή εγγραφή του αρχείου "$1" λόγω ανεπαρκών δικαιωμάτων ή απουσίας καταλόγων/φακέλων.',
 
+# File journal errors
+'filejournal-fail-dbconnect' => 'Δεν ήταν δυνατή η σύνδεση με τη βάση δεδομένων εγγραφών για αποθηκευτικό σύστημα υποστήριξης "$1".',
+'filejournal-fail-dbquery' => 'Δεν ήταν δυνατή η ενημέρωση της βάσης δεδομένων εγγραφών για αποθηκευτικό σύστημα υποστήριξης "$1".',
+
 # Lock manager
 'lockmanager-notlocked' => 'Δεν μπορέσατε να  ξεκλειδώσετε το " $1 ". Δεν είναι κλειδωμένο.',
 'lockmanager-fail-closelock' => 'Δεν μπόρεσε να κλείσει το κλειδωμένο αρχείο για "$1".',
 'lockmanager-fail-deletelock' => 'Δεν μπόρεσε να διαγράψει το αρχείο κλειδώματος για το "$1".',
+'lockmanager-fail-acquirelock' => 'Δεν ήταν δυνατή η απόκτηση κλειδώματος για "$1".',
 'lockmanager-fail-openlock' => 'Δεν μπόρεσε να ανοίξει το αρχείο κλειδώματος για το "$1".',
 
 # ZipDirectoryReader
@@ -1932,7 +1976,6 @@ $1',
 'http-read-error' => 'Σφάλμα ανάγνωσης HTTP.',
 'http-timed-out' => 'Ο χρόνος του αιτήματος HTTP έληξε.',
 'http-curl-error' => 'Σφάλμα κατά τη λήψη του URL: $1',
-'http-host-unreachable' => 'Το URL δεν ήταν προσβάσιμο.',
 'http-bad-status' => 'Υπήρξε πρόβλημα κατά τη διάρκεια του αιτήματος HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2087,6 +2130,12 @@ $1',
 Αντιθέτως θα έπρεπε να κατευθύνουν στο κατάλληλο θέμα.<br />
 Μια σελίδα αντιμετωπίζεται ως σελίδα αποσαφήνισης αν χρησιμοποιεί ένα πρότυπο το οποίο συνδέεται από το [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Σελίδες με ιδιότητα σελίδας',
+'pageswithprop-legend' => 'Σελίδες με ιδιότητα σελίδας',
+'pageswithprop-text' => 'Αυτή η σελίδα ταξινομεί σελίδες που χρησιμοποιούν μια συγκεκριμένη ιδιότητα σελίδας.',
+'pageswithprop-prop' => 'Όνομα ιδιότητας:',
+'pageswithprop-submit' => 'Μετάβαση',
+
 'doubleredirects' => 'Διπλές ανακατευθύνσεις',
 'doubleredirectstext' => 'Αυτή η σελίδα συγκαταλέγει σελίδες οι οποίες ανακατευθύνουν σε άλλες σελίδες ανακατεύθυνσης. Κάθε σειρά περιέχει συνδέσμους προς την πρώτη και τη δεύτερη σελίδα ανακατεύθυνσης, όπως επίσης και την πρώτη αράδα του κειμένου στη δεύτερη σελίδα ανακατεύθυνσης η οποία και είναι, κανονικά, ο πραγματικός προορισμός της ανακατεύθυνσης -εκεί δηλαδή όπου θα έπρεπε να είχατε οδηγηθεί από την αρχή. Τα <del>διεγραμμένα</del> λήμματα έχουν επιλυθεί.',
 'double-redirect-fixed-move' => 'Η [[$1]] έχει μετακινηθεί, τώρα είναι ανακατεύθυνση στην [[$2]]',
@@ -2336,8 +2385,8 @@ $1',
 'notvisiblerev' => 'Η έκδοση έχει διαγραφεί',
 'watchnochange' => 'Δεν υπήρξε δραστηριότητα επεξεργασίας στις σελίδες που παρακολουθείτε κατά την εμφανιζόμενη χρονική περίοδο.',
 'watchlist-details' => '{{PLURAL:$1|$1 σελίδα|$1 σελίδες}} είναι στη λίστα παρακολούθησης σας, χωρίς τις σελίδες συζήτησης.',
-'wlheader-enotif' => '* Η ειδοποίηση με ηλεκτρονικό ταχυδρομείο έχει ενεργοποιηθεί.',
-'wlheader-showupdated' => "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
+'wlheader-enotif' => 'Η ειδοποίηση ηλεκτρονικού ταχυδρομείου ενεργοποιήθηκε.',
+'wlheader-showupdated' => "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
 'watchmethod-recent' => 'Έλεγχος πρόσφατων αλλαγών σε σελίδες υπό παρακολούθηση',
 'watchmethod-list' => 'Έλεγχος σελίδων υπό παρακολούθηση για πρόσφατες αλλαγές',
 'watchlistcontains' => 'Η λίστα παρακολούθησής σας περιέχει $1 {{PLURAL:$1|σελίδα|σελίδες}}.',
@@ -3050,27 +3099,16 @@ $1',
 
 # Stylesheets
 'common.css' => '/* Το τοποθετημένο εδώ CSS θα εφαρμοστεί σε όλα τα skins */',
-'standard.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Standard skin */',
-'nostalgia.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Nostalgia skin */',
 'cologneblue.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Cologne Blue skin */',
 'monobook.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Monobook skin */',
-'myskin.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του MySkin skin */',
-'chick.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Chick skin */',
-'simple.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Simple skin */',
 'modern.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Modern skin */',
 'vector.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Vector skin */',
 'print.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει το αποτέλεσμα της εκτύπωσης */',
-'handheld.css' => '/* Το τοποθετημένο εδώ CSS θα επηρεάσει συσκευές χειρός βάση του skin ρυθμισμένου στο $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για όλους τους χρήστες σε κάθε φόρτωση σελίδας. */',
-'standard.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Standard skin */',
-'nostalgia.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Nostalgia skin */',
 'cologneblue.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Cologne Blue skin */',
 'monobook.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το MonoBook skin */',
-'myskin.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το MySkin skin */',
-'chick.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Chick skin */',
-'simple.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Simple skin */',
 'modern.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Modern skin */',
 'vector.js' => '/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Vector skin */',
 
@@ -3146,10 +3184,6 @@ $1',
 'pageinfo-category-files' => 'Αριθμός αρχείων',
 
 # Skin names
-'skinname-standard' => 'Κλασσικό',
-'skinname-nostalgia' => 'Νοσταλγία',
-'skinname-myskin' => 'ΤοSkinΜου',
-'skinname-simple' => 'Απλό',
 'skinname-modern' => 'Μοντέρνο',
 
 # Patrolling
@@ -3227,11 +3261,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 λεπτό|$1 λεπτά}}',
 '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' => 'μόλις τώρα',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => 'Η σύνταξη είναι ως εξής:
 
@@ -3259,7 +3307,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Πλάτος',
 'exif-imagelength' => 'Υψος',
 'exif-bitspersample' => 'Bits ανά στοιχείο',
@@ -3437,7 +3485,7 @@ $1',
 'exif-originalimageheight' => 'Ύψος εικόνας πριν από την περικοπή της',
 'exif-originalimagewidth' => 'Πλάτος της εικόνας πριν από την περικοπή της',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Έχει αποσυμπιεστεί.',
 'exif-compression-2' => 'Εκτέλεση μήκους κωδικοποίησης CCITT Ομάδα 3 Μιας-Διαστάσεως Modified Huffman',
 'exif-compression-3' => 'Κωδικοποίηση Φαξ CCITT Ομάδας 3',
@@ -3853,12 +3901,14 @@ $5
 'version-entrypoints-header-entrypoint' => 'Σημείο εισόδου',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Διαδρομή αρχείου',
-'filepath-page' => 'Αρχείο:',
-'filepath-submit' => 'Μετάβαση',
-'filepath-summary' => 'Αυτή η ειδική σελίδα επιστρέφει την πλήρη διαδρομή ενός αρχείου.
-Οι εικόνες εμφανίζονται σε πλήρη ανάλυση, ενώ άλλοι τύποι αρχείων ανοίγονται απευθείας με το αντίστοιχο πρόγραμμα.',
+# Special:Redirect
+'redirect-legend' => 'Ανακατεύθυνση σε ένα αρχείο ή μια σελίδα',
+'redirect-submit' => 'Μετάβαση',
+'redirect-value' => 'Τιμή:',
+'redirect-user' => 'Αναγνωριστικό χρήση',
+'redirect-revision' => 'Αναθεώρηση σελίδας',
+'redirect-file' => 'Όνομα αρχείου',
+'redirect-not-exists' => 'Η τιμή δε βρέθηκε',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Αναζήτηση για διπλά αρχεία',
@@ -3948,6 +3998,8 @@ $5
 'htmlform-submit' => 'Υποβολή',
 'htmlform-reset' => 'Αναστροφή αλλαγών',
 'htmlform-selectorother-other' => 'Άλλο',
+'htmlform-no' => 'Όχι',
+'htmlform-yes' => 'Ναι',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 με υποστήριξη αναζήτησης πλήρους κειμένου',
@@ -3955,8 +4007,8 @@ $5
 
 # New logging system
 'logentry-delete-delete' => '{{GENDER:$1|Ο|Η}} $1 διέγραψε τη σελίδα $3',
-'logentry-delete-restore' => 'Î\9f· $1 αποκατέστησε τη σελίδα $3',
-'logentry-delete-event' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την ορατότητα σε {{PLURAL:$5|ένα γεγονός καταγραφής|$5 log events}} στο $3: $4',
+'logentry-delete-restore' => 'Î\9f\97 $1 αποκατέστησε τη σελίδα $3',
+'logentry-delete-event' => ' $1 {{GENDER:$1|άλλαξε}} την ορατότητα σε {{PLURAL:$5|ένα γεγονός καταγραφής|$5 γεγονότα καταγραφής}} στο $3: $4',
 'logentry-delete-revision' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την ορατότητα {{PLURAL:$5|μιας έκδοσης|$5 εκδόσεων}} στη σελίδα $3: $4',
 'logentry-delete-event-legacy' => '{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα των καταγραφόμενων συμβάντων στη σελίδα $3',
 'logentry-delete-revision-legacy' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την  ορατότητα των αναθεωρήσεων στη σελίδα $3',
@@ -3976,17 +4028,17 @@ $5
 'logentry-move-move' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4',
 'logentry-move-move-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 χωρίς να αφήσει ανακατεύθυνση',
 'logentry-move-move_redir' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε τη σελίδα $3 στη $4 πάνω από την ανανακατεύθυνση',
-'logentry-move-move_redir-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από ανακατεύθυνση χωρίς να αφήσει ανακατεύθυνση',
-'logentry-patrol-patrol' => '{{GENDER:$1|Ο|Η}} $1 σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$2|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από μια ανακατεύθυνση χωρίς να αφήσει ανακατεύθυνση',
+'logentry-patrol-patrol' => '{{GENDER:$2|Ο|Η}} $1 επισήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
 'logentry-patrol-patrol-auto' => '{{GENDER:$1|Ο|Η}} $1 αυτόματα σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
-'logentry-newusers-newusers' => 'Ο λογαριασμός χρήστη $1 δημιουργήθηκε',
-'logentry-newusers-create' => 'Ο λογαριασμός χρήστη $1 δημιουργήθηκε',
-'logentry-newusers-create2' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από {{GENDER:$1|τον|την}} $1',
+'logentry-newusers-newusers' => 'Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}',
+'logentry-newusers-create' => 'Ο λογαριασμός χρήστη $1 {{GENDER:$2|δημιουργήθηκε}}',
+'logentry-newusers-create2' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από {{GENDER:$2|τον|την}} $1',
 'logentry-newusers-byemail' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από τον $1  και ο κωδικός πρόσβασης εστάλη μέσω ηλεκτρονικού ταχυδρομείου',
 'logentry-newusers-autocreate' => 'Ο λογαριασμός $1 δημιουργήθηκε αυτόματα',
 'logentry-rights-rights' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας για {{GENDER:$3|τον|την}} $3 από $4 σε $5',
 'logentry-rights-rights-legacy' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας {{GENDER:$1|του|της}} $3',
-'logentry-rights-autopromote' => '$1 προωθήθηκε αυτόματα από το $4 στο $5',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|προωθήθηκε}} αυτόματα από το $4 στο $5',
 'rightsnone' => '(κανένα)',
 
 # Feedback
index 6260f23..ee4a533 100644 (file)
@@ -162,18 +162,22 @@ $dateFormats = array(
        'mdy time' => 'H:i',
        'mdy date' => 'F j, Y',
        'mdy both' => 'H:i, F j, Y',
+       'mdy pretty' => 'F j',
 
        'dmy time' => 'H:i',
        'dmy date' => 'j F Y',
        'dmy both' => 'H:i, j F Y',
+       'dmy pretty' => 'j F',
 
        'ymd time' => 'H:i',
        'ymd date' => 'Y F j',
        '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 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+       'ISO 8601 pretty' => 'xnm-xnd'
 );
 
 /**
@@ -249,6 +253,8 @@ $magicWords = array(
        'fullpagenamee'           => array( 1,    'FULLPAGENAMEE' ),
        'subpagename'             => array( 1,    'SUBPAGENAME' ),
        'subpagenamee'            => array( 1,    'SUBPAGENAMEE' ),
+       'rootpagename'            => array( 1,    'ROOTPAGENAME' ),
+       'rootpagenamee'           => array( 1,    'ROOTPAGENAMEE' ),
        'basepagename'            => array( 1,    'BASEPAGENAME' ),
        'basepagenamee'           => array( 1,    'BASEPAGENAMEE' ),
        'talkpagename'            => array( 1,    'TALKPAGENAME' ),
@@ -442,6 +448,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'RandomRedirect' ),
        'Recentchanges'             => array( 'RecentChanges' ),
        'Recentchangeslinked'       => array( 'RecentChangesLinked', 'RelatedChanges' ),
+       'Redirect'                  => array( 'Redirect' ),
        'Revisiondelete'            => array( 'RevisionDelete' ),
        'Search'                    => array( 'Search' ),
        'Shortpages'                => array( 'ShortPages' ),
@@ -622,8 +629,8 @@ The sidebar for MonoBook is generated from this message, lines that do not
 begin with * or ** are discarded, furthermore lines that do begin with ** and
 do not contain | are also discarded, but do not depend on this behavior for
 future releases. Also note that since each list value is wrapped in a unique
-XHTML id it should only appear once and include characters that are legal
-XHTML id names.
+(X)HTML id it should only appear once and include characters that are legal
+(X)HTML id names.
 */
 'sidebar' => '
 * navigation
@@ -667,8 +674,6 @@ XHTML id names.
 'tog-shownumberswatching'     => 'Show the number of watching users',
 'tog-oldsig'                  => 'Existing signature:',
 'tog-fancysig'                => 'Treat signature as wikitext (without an automatic link)',
-'tog-externaleditor'          => 'Use external editor by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff'            => 'Use external diff by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks'           => 'Enable "jump to" accessibility links',
 'tog-uselivepreview'          => 'Use live preview (requires JavaScript) (experimental)',
 'tog-forceeditsummary'        => 'Prompt me when entering a blank edit summary',
@@ -683,6 +688,7 @@ XHTML id names.
 'tog-showhiddencats'          => 'Show hidden categories',
 'tog-noconvertlink'           => 'Disable link title conversion', # only translate this message to other languages if you have to change it
 'tog-norollbackdiff'          => 'Omit diff after performing a rollback',
+'tog-useeditwarning'          => 'Warn me when I leave an edit page with unsaved changes',
 
 'underline-always'  => 'Always',
 'underline-never'   => 'Never',
@@ -696,56 +702,68 @@ XHTML id names.
 'editfont-serif'     => 'Serif font',
 
 # Dates
-'sunday'        => 'Sunday',
-'monday'        => 'Monday',
-'tuesday'       => 'Tuesday',
-'wednesday'     => 'Wednesday',
-'thursday'      => 'Thursday',
-'friday'        => 'Friday',
-'saturday'      => 'Saturday',
-'sun'           => 'Sun',
-'mon'           => 'Mon',
-'tue'           => 'Tue',
-'wed'           => 'Wed',
-'thu'           => 'Thu',
-'fri'           => 'Fri',
-'sat'           => 'Sat',
-'january'       => 'January',
-'february'      => 'February',
-'march'         => 'March',
-'april'         => 'April',
-'may_long'      => 'May',
-'june'          => 'June',
-'july'          => 'July',
-'august'        => 'August',
-'september'     => 'September',
-'october'       => 'October',
-'november'      => 'November',
-'december'      => 'December',
-'january-gen'   => 'January',
-'february-gen'  => 'February',
-'march-gen'     => 'March',
-'april-gen'     => 'April',
-'may-gen'       => 'May',
-'june-gen'      => 'June',
-'july-gen'      => 'July',
-'august-gen'    => 'August',
-'september-gen' => 'September',
-'october-gen'   => 'October',
-'november-gen'  => 'November',
-'december-gen'  => 'December',
-'jan'           => 'Jan',
-'feb'           => 'Feb',
-'mar'           => 'Mar',
-'apr'           => 'Apr',
-'may'           => 'May',
-'jun'           => 'Jun',
-'jul'           => 'Jul',
-'aug'           => 'Aug',
-'sep'           => 'Sep',
-'oct'           => 'Oct',
-'nov'           => 'Nov',
-'dec'           => 'Dec',
+'sunday'         => 'Sunday',
+'monday'         => 'Monday',
+'tuesday'        => 'Tuesday',
+'wednesday'      => 'Wednesday',
+'thursday'       => 'Thursday',
+'friday'         => 'Friday',
+'saturday'       => 'Saturday',
+'sun'            => 'Sun',
+'mon'            => 'Mon',
+'tue'            => 'Tue',
+'wed'            => 'Wed',
+'thu'            => 'Thu',
+'fri'            => 'Fri',
+'sat'            => 'Sat',
+'january'        => 'January',
+'february'       => 'February',
+'march'          => 'March',
+'april'          => 'April',
+'may_long'       => 'May',
+'june'           => 'June',
+'july'           => 'July',
+'august'         => 'August',
+'september'      => 'September',
+'october'        => 'October',
+'november'       => 'November',
+'december'       => 'December',
+'january-gen'    => 'January',
+'february-gen'   => 'February',
+'march-gen'      => 'March',
+'april-gen'      => 'April',
+'may-gen'        => 'May',
+'june-gen'       => 'June',
+'july-gen'       => 'July',
+'august-gen'     => 'August',
+'september-gen'  => 'September',
+'october-gen'    => 'October',
+'november-gen'   => 'November',
+'december-gen'   => 'December',
+'jan'            => 'Jan',
+'feb'            => 'Feb',
+'mar'            => 'Mar',
+'apr'            => 'Apr',
+'may'            => 'May',
+'jun'            => 'Jun',
+'jul'            => 'Jul',
+'aug'            => 'Aug',
+'sep'            => 'Sep',
+'oct'            => 'Oct',
+'nov'            => 'Nov',
+'dec'            => 'Dec',
+'january-date'   => 'January $1',
+'february-date'  => 'February $1',
+'march-date'     => 'March $1',
+'april-date'     => 'April $1',
+'may-date'       => 'May $1',
+'june-date'      => 'June $1',
+'july-date'      => 'July $1',
+'august-date'    => 'August $1',
+'september-date' => 'September $1',
+'october-date'   => 'October $1',
+'november-date'  => 'November $1',
+'december-date'  => 'December $1',
 
 # Categories related messages
 'pagecategories'                 => '{{PLURAL:$1|Category|Categories}}',
@@ -775,9 +793,9 @@ XHTML id names.
 'newwindow'     => '(opens in new window)',
 'cancel'        => 'Cancel',
 'moredotdotdot' => 'More...',
+'morenotlisted' => 'More not listed...',
 'mypage'        => 'Page',
 'mytalk'        => 'Talk',
-'morenotlisted' => 'More not listed...',
 'anontalk'      => 'Talk for this IP address',
 'navigation'    => 'Navigation',
 'and'           => '&#32;and',
@@ -833,6 +851,7 @@ XHTML id names.
 'create-this-page'   => 'Create this page',
 'delete'             => 'Delete',
 'deletethispage'     => 'Delete this page',
+'undeletethispage'   => 'Undelete this page',
 'undelete_short'     => 'Undelete {{PLURAL:$1|one edit|$1 edits}}',
 'viewdeleted_short'  => 'View {{PLURAL:$1|one deleted edit|$1 deleted edits}}',
 'protect'            => 'Protect',
@@ -1067,73 +1086,110 @@ The administrator who locked it offered this explanation: "$3".',
 'virus-unknownscanner' => 'unknown antivirus:',
 
 # Login and logout pages
-'logouttext'                 => "'''You are now logged out.'''
+'logouttext'                      => "'''You are now logged out.'''
 
 You can continue to use {{SITENAME}} anonymously, or you can <span class='plainlinks'>[$1 log in again]</span> as the same or as a different user.
 Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomeuser'                => 'Welcome, $1!',
-'welcomecreation-msg'        => 'Your account has been created.
+'welcomeuser'                     => 'Welcome, $1!',
+'welcomecreation-msg'             => 'Your account has been created.
 Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
-'yourname'                   => 'Username:',
-'yourpassword'               => 'Password:',
-'yourpasswordagain'          => 'Retype password:',
-'remembermypassword'         => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'securelogin-stick-https'    => 'Stay connected to HTTPS after login',
-'yourdomainname'             => 'Your domain:',
-'password-change-forbidden'  => 'You cannot change passwords on this wiki.',
-'externaldberror'            => 'There was either an authentication database error or you are not allowed to update your external account.',
-'login'                      => 'Log in',
-'nav-login-createaccount'    => 'Log in / create account',
-'loginprompt'                => 'You must have cookies enabled to log in to {{SITENAME}}.',
-'userlogin'                  => 'Log in / create account',
-'userloginnocreate'          => 'Log in',
-'logout'                     => 'Log out',
-'userlogout'                 => 'Log out',
-'userlogout-summary'         => '', # do not translate or duplicate this message to other languages
-'notloggedin'                => 'Not logged in',
-'nologin'                    => "Don't have an account? $1.",
-'nologinlink'                => 'Create an account',
-'createaccount'              => 'Create account',
-'gotaccount'                 => 'Already have an account? $1.',
-'gotaccountlink'             => 'Log in',
-'userlogin-resetlink'        => 'Forgotten your login details?',
-'createaccountmail'          => 'Use a temporary random password and send it to the email address specified below',
-'createaccountreason'        => 'Reason:',
-'badretype'                  => 'The passwords you entered do not match.',
-'userexists'                 => 'Username entered already in use.
+'yourname'                        => 'Username:',
+'userlogin-yourname'              => 'Username',
+'userlogin-yourname-ph'           => 'Enter your username',
+'createacct-helpusername'         => '', # do not translate or duplicate this message to other languages
+'yourpassword'                    => 'Password:',
+'userlogin-yourpassword'          => 'Password',
+'userlogin-yourpassword-ph'       => 'Enter your password',
+'createacct-yourpassword-ph'      => 'Enter a password',
+'yourpasswordagain'               => 'Retype password:',
+'createacct-yourpasswordagain'    => 'Confirm password',
+'createacct-yourpasswordagain-ph' => 'Enter password again',
+'remembermypassword'              => 'Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'userlogin-remembermypassword'    => 'Keep me logged in',
+'userlogin-signwithsecure'        => 'Use secure connection',
+'securelogin-stick-https'         => 'Stay connected to HTTPS after login',
+'yourdomainname'                  => 'Your domain:',
+'password-change-forbidden'       => 'You cannot change passwords on this wiki.',
+'externaldberror'                 => 'There was either an authentication database error or you are not allowed to update your external account.',
+'login'                           => 'Log in',
+'nav-login-createaccount'         => 'Log in / create account',
+'loginprompt'                     => 'You must have cookies enabled to log in to {{SITENAME}}.',
+'userlogin'                       => 'Log in / create account',
+'userloginnocreate'               => 'Log in',
+'logout'                          => 'Log out',
+'userlogout'                      => 'Log out',
+'userlogout-summary'              => '', # do not translate or duplicate this message to other languages
+'notloggedin'                     => 'Not logged in',
+'userlogin-noaccount'             => "Don't have an account?",
+'userlogin-joinproject'           => 'Join {{SITENAME}}',
+'nologin'                         => "Don't have an account? $1.",
+'nologinlink'                     => 'Create an account',
+'createaccount'                   => 'Create account',
+'gotaccount'                      => 'Already have an account? $1.',
+'gotaccountlink'                  => 'Log in',
+'userlogin-resetlink'             => 'Forgotten your login details?',
+'userlogin-resetpassword-link'    => 'Reset your password',
+'helplogin-url'                   => 'Help:Logging in',
+'userlogin-helplink'              => '[[{{MediaWiki:helplogin-url}}|Help with logging in]]',
+'createacct-join'                 => 'Enter your information below.',
+'createacct-emailrequired'        => 'Email address',
+'createacct-emailoptional'        => 'Email address (optional)',
+'createacct-email-ph'             => 'Enter your email address',
+'createaccountmail'               => 'Use a temporary random password and send it to the email address specified below',
+'createacct-realname'             => 'Real name (optional)',
+'createaccountreason'             => 'Reason:',
+'createacct-reason'               => 'Reason',
+'createacct-reason-ph'            => 'Why you are creating another account',
+'createacct-captcha'              => 'Security check',
+'createacct-imgcaptcha-help'      => '', # do not translate or duplicate this message to other languages
+'createacct-imgcaptcha-ph'        => 'Enter the text you see above',
+'createacct-submit'               => 'Create your account',
+'createacct-benefit-heading'      => '{{SITENAME}} is made by people like you.',
+'createacct-benefit-icon1'        => 'icon-edits', # do not translate or duplicate this message to other languages
+'createacct-benefit-head1'        => '{{NUMBEROFEDITS}}', # do not translate or duplicate this message to other languages
+'createacct-benefit-body1'        => '{{PLURAL:$1|edit|edits}}',
+'createacct-benefit-icon2'        => 'icon-pages', # do not translate or duplicate this message to other languages
+'createacct-benefit-head2'        => '{{NUMBEROFARTICLES}}', # do not translate or duplicate this message to other languages
+'createacct-benefit-body2'        => '{{PLURAL:$1|page|pages}}',
+'createacct-benefit-icon3'        => 'icon-contributors', # do not translate or duplicate this message to other languages
+'createacct-benefit-head3'        => '{{NUMBEROFACTIVEUSERS}}', # do not translate or duplicate this message to other languages
+'createacct-benefit-body3'        => 'recent {{PLURAL:$1|contributor|contributors}}',
+'badretype'                       => 'The passwords you entered do not match.',
+'userexists'                      => 'Username entered already in use.
 Please choose a different name.',
-'loginerror'                 => 'Login error',
-'createaccounterror'         => 'Could not create account: $1',
-'nocookiesnew'               => 'The user account was created, but you are not logged in.
+'loginerror'                      => 'Login error',
+'createacct-error'                => 'Account creation error',
+'createaccounterror'              => 'Could not create account: $1',
+'nocookiesnew'                    => 'The user account was created, but you are not logged in.
 {{SITENAME}} uses cookies to log in users.
 You have cookies disabled.
 Please enable them, then log in with your new username and password.',
-'nocookieslogin'             => '{{SITENAME}} uses cookies to log in users.
+'nocookieslogin'                  => '{{SITENAME}} uses cookies to log in users.
 You have cookies disabled.
 Please enable them and try again.',
-'nocookiesfornew'            => 'The user account was not created, as we could not confirm its source.
+'nocookiesfornew'                 => 'The user account was not created, as we could not confirm its source.
 Ensure you have cookies enabled, reload this page and try again.',
-'nocookiesforlogin'          => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
-'noname'                     => 'You have not specified a valid username.',
-'loginsuccesstitle'          => 'Login successful',
-'loginsuccess'               => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
-'nosuchuser'                 => 'There is no user by the name "$1".
+'nocookiesforlogin'               => '{{int:nocookieslogin}}', # only translate this message to other languages if you have to change it
+'noname'                          => 'You have not specified a valid username.',
+'loginsuccesstitle'               => 'Login successful',
+'loginsuccess'                    => "'''You are now logged in to {{SITENAME}} as \"\$1\".'''",
+'nosuchuser'                      => 'There is no user by the name "$1".
 Usernames are case sensitive.
 Check your spelling, or [[Special:UserLogin/signup|create a new account]].',
-'nosuchusershort'            => 'There is no user by the name "$1".
+'nosuchusershort'                 => 'There is no user by the name "$1".
 Check your spelling.',
-'nouserspecified'            => 'You have to specify a username.',
-'login-userblocked'          => 'This user is blocked. Login not allowed.',
-'wrongpassword'              => 'Incorrect password entered.
+'nouserspecified'                 => 'You have to specify a username.',
+'login-userblocked'               => 'This user is blocked. Login not allowed.',
+'wrongpassword'                   => 'Incorrect password entered.
 Please try again.',
-'wrongpasswordempty'         => 'Password entered was blank.
+'wrongpasswordempty'              => 'Password entered was blank.
 Please try again.',
-'passwordtooshort'           => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
-'password-name-match'        => 'Your password must be different from your username.',
-'password-login-forbidden'   => 'The use of this username and password has been forbidden.',
-'mailmypassword'             => 'Email new password',
-'passwordremindertitle'      => 'New temporary password for {{SITENAME}}',
-'passwordremindertext'       => 'Someone (probably you, from IP address $1) requested a new
+'passwordtooshort'                => 'Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.',
+'password-name-match'             => 'Your password must be different from your username.',
+'password-login-forbidden'        => 'The use of this username and password has been forbidden.',
+'mailmypassword'                  => 'Email new password',
+'passwordremindertitle'           => 'New temporary password for {{SITENAME}}',
+'passwordremindertext'            => 'Someone (probably you, from IP address $1) requested a new
 password for {{SITENAME}} ($4). A temporary password for user
 "$2" has been created and was set to "$3". If this was your
 intent, you will need to log in and choose a new password now.
@@ -1142,53 +1198,53 @@ Your temporary password will expire in {{PLURAL:$5|one day|$5 days}}.
 If someone else made this request, or if you have remembered your password,
 and you no longer wish to change it, you may ignore this message and
 continue using your old password.',
-'noemail'                    => 'There is no email address recorded for user "$1".',
-'noemailcreate'              => 'You need to provide a valid email address',
-'passwordsent'               => 'A new password has been sent to the email address registered for "$1".
+'noemail'                         => 'There is no email address recorded for user "$1".',
+'noemailcreate'                   => 'You need to provide a valid email address.',
+'passwordsent'                    => 'A new password has been sent to the email address registered for "$1".
 Please log in again after you receive it.',
-'blocked-mailpassword'       => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
-'eauthentsent'               => 'A confirmation email has been sent to the nominated email address.
+'blocked-mailpassword'            => 'Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.',
+'eauthentsent'                    => 'A confirmation email has been sent to the nominated email address.
 Before any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.',
-'throttled-mailpassword'     => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
+'throttled-mailpassword'          => 'A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.
 To prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.',
-'loginstart'                 => '', # do not translate or duplicate this message to other languages
-'loginend'                   => '', # do not translate or duplicate this message to other languages
-'loginend-https'             => '', # do not translate or duplicate this message to other languages
-'signupstart'                => '{{int:loginstart}}', # do not translate or duplicate this message to other languages
-'signupend'                  => '{{int:loginend}}', # do not translate or duplicate this message to other languages
-'signupend-https'            => '', # do not translate or duplicate this message to other languages
-'mailerror'                  => 'Error sending mail: $1',
-'acct_creation_throttle_hit' => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
+'loginstart'                      => '', # do not translate or duplicate this message to other languages
+'loginend'                        => '', # do not translate or duplicate this message to other languages
+'loginend-https'                  => '', # do not translate or duplicate this message to other languages
+'signupstart'                     => '{{int:loginstart}}', # do not translate or duplicate this message to other languages
+'signupend'                       => '{{int:loginend}}', # do not translate or duplicate this message to other languages
+'signupend-https'                 => '', # do not translate or duplicate this message to other languages
+'mailerror'                       => 'Error sending mail: $1',
+'acct_creation_throttle_hit'      => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
 As a result, visitors using this IP address cannot create any more accounts at the moment.',
-'emailauthenticated'         => 'Your email address was authenticated on $2 at $3.',
-'emailnotauthenticated'      => 'Your email address is not yet authenticated.
+'emailauthenticated'              => 'Your email address was authenticated on $2 at $3.',
+'emailnotauthenticated'           => 'Your email address is not yet authenticated.
 No email will be sent for any of the following features.',
-'noemailprefs'               => 'Specify an email address in your preferences for these features to work.',
-'emailconfirmlink'           => 'Confirm your email address',
-'invalidemailaddress'        => 'The email address cannot be accepted as it appears to have an invalid format.
+'noemailprefs'                    => 'Specify an email address in your preferences for these features to work.',
+'emailconfirmlink'                => 'Confirm your email address',
+'invalidemailaddress'             => 'The email address cannot be accepted as it appears to have an invalid format.
 Please enter a well-formatted address or empty that field.',
-'cannotchangeemail'          => 'Account email addresses cannot be changed on this wiki.',
-'emaildisabled'              => 'This site cannot send emails.',
-'accountcreated'             => 'Account created',
-'accountcreatedtext'         => 'The user account for $1 has been created.',
-'createaccount-title'        => 'Account creation for {{SITENAME}}',
-'createaccount-text'         => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
+'cannotchangeemail'               => 'Account email addresses cannot be changed on this wiki.',
+'emaildisabled'                   => 'This site cannot send emails.',
+'accountcreated'                  => 'Account created',
+'accountcreatedtext'              => 'The user account for $1 has been created.',
+'createaccount-title'             => 'Account creation for {{SITENAME}}',
+'createaccount-text'              => 'Someone created an account for your email address on {{SITENAME}} ($4) named "$2", with password "$3".
 You should log in and change your password now.
 
 You may ignore this message, if this account was created in error.',
-'usernamehasherror'          => 'Username cannot contain hash characters',
-'login-throttled'            => 'You have made too many recent login attempts.
+'usernamehasherror'               => 'Username cannot contain hash characters',
+'login-throttled'                 => 'You have made too many recent login attempts.
 Please wait before trying again.',
-'login-abort-generic'        => 'Your login was unsuccessful - Aborted',
-'loginlanguagelabel'         => 'Language: $1',
-'loginlanguagelinks'         => '* {{#language:de}}|de
+'login-abort-generic'             => 'Your login was unsuccessful - Aborted',
+'loginlanguagelabel'              => 'Language: $1',
+'loginlanguagelinks'              => '* {{#language:de}}|de
 * {{#language:en}}|en
 * {{#language:eo}}|eo
 * {{#language:fr}}|fr
 * {{#language:es}}|es
 * {{#language:it}}|it
 * {{#language:nl}}|nl', # do not translate or duplicate this message to other languages
-'suspicious-userlogout'      => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
+'suspicious-userlogout'           => 'Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.',
 
 # Email sending
 'pear-mail-error'        => '$1', # do not translate or duplicate this message to other languages
@@ -1216,13 +1272,15 @@ Now logging you in...',
 'resetpass-wrong-oldpass'   => 'Invalid temporary or current password.
 You may have already successfully changed your password or requested a new temporary password.',
 'resetpass-temp-password'   => 'Temporary password:',
+'resetpass-abort-generic'   => 'Password change has been aborted by an extension.',
 
 # Special:PasswordReset
 'passwordreset'                    => 'Reset password',
-'passwordreset-text'               => 'Complete this form to reset your password.',
+'passwordreset-text-one'           => 'Complete this form to reset your password.',
+'passwordreset-text-many'          => '{{PLURAL:$1|Enter one of the pieces of data to reset your password.}}',
 'passwordreset-legend'             => 'Reset password',
 'passwordreset-disabled'           => 'Password resets have been disabled on this wiki.',
-'passwordreset-pretext'            => '{{PLURAL:$1||Enter one of the pieces of data below}}',
+'passwordreset-emaildisabled'      => 'Email features have been disabled on this wiki.',
 'passwordreset-username'           => 'Username:',
 'passwordreset-domain'             => 'Domain:',
 'passwordreset-capture'            => 'View the resulting email?',
@@ -1254,7 +1312,7 @@ password.',
 Temporary password: $2',
 'passwordreset-emailsent'          => 'A password reset email has been 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 user failed: $1',
+'passwordreset-emailerror-capture' => 'A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1',
 
 # Special:ChangeEmail
 'changeemail'          => 'Change email address',
@@ -1485,6 +1543,7 @@ It gave no explanation.',
 It appears to have been deleted.',
 'edit-conflict'                    => 'Edit conflict.',
 'edit-no-change'                   => 'Your edit was ignored because no change was made to the text.',
+'postedit-confirmation'            => 'Your edit was saved.',
 'edit-already-exists'              => 'Could not create a new page.
 It already exists.',
 'addsection-preload'               => '', # do not translate or duplicate this message to other languages
@@ -1493,6 +1552,8 @@ It already exists.',
 'content-failed-to-parse'          => 'Failed to parse $2 content for $1 model: $3',
 'invalid-content-data'             => 'Invalid content data',
 'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
+'editwarning-warning'              => 'Leaving this page may cause you to lose any changes you have made.
+If you are logged in, you can disable this warning in the "Editing" section of your preferences.',
 
 # Content models
 'content-model-wikitext'   => 'wikitext',
@@ -1802,19 +1863,11 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
        <input type="radio" name="sitesearch" id="gWWW" value="" /><label for="gWWW">WWW</label>
   </div>
 </form>', # do not translate or duplicate this message to other languages
+'search-error'                     => 'An error has occurred while searching: $1',
 
 # OpenSearch description
 'opensearch-desc' => '{{SITENAME}} ({{CONTENTLANGUAGE}})', # do not translate or duplicate this message to other languages
 
-# Quickbar
-'qbsettings'                => 'Quickbar',
-'qbsettings-none'           => 'None',
-'qbsettings-fixedleft'      => 'Fixed left',
-'qbsettings-fixedright'     => 'Fixed right',
-'qbsettings-floatingleft'   => 'Floating left',
-'qbsettings-floatingright'  => 'Floating right',
-'qbsettings-directionality' => 'Fixed, depending on the script directionality of your language',
-
 # Preferences page
 'preferences'                   => 'Preferences',
 'preferences-summary'           => '', # do not translate or duplicate this message to other languages
@@ -1967,6 +2020,7 @@ Your email address is not revealed when other users contact you.',
 'userrights-changeable-col'      => 'Groups you can change',
 'userrights-unchangeable-col'    => 'Groups you cannot change',
 'userrights-irreversible-marker' => '$1*', # only translate this message to other languages if you have to change it
+'userrights-conflict'            => 'User rights conflict! Please apply your changes again.',
 
 # Groups
 'group'               => 'Group:',
@@ -2392,14 +2446,13 @@ For optimal security, img_auth.php is disabled.',
 'img-auth-bad-query-string' => 'The URL has an invalid query string.',
 
 # HTTP errors
-'http-invalid-url'      => 'Invalid URL: $1',
-'http-invalid-scheme'   => 'URLs with the "$1" scheme are not supported.',
-'http-request-error'    => 'HTTP request failed due to unknown error.',
-'http-read-error'       => 'HTTP read error.',
-'http-timed-out'        => 'HTTP request timed out.',
-'http-curl-error'       => 'Error fetching URL: $1',
-'http-host-unreachable' => 'Could not reach URL.',
-'http-bad-status'       => 'There was a problem during the HTTP request: $1 $2',
+'http-invalid-url'    => 'Invalid URL: $1',
+'http-invalid-scheme' => 'URLs with the "$1" scheme are not supported.',
+'http-request-error'  => 'HTTP request failed due to unknown error.',
+'http-read-error'     => 'HTTP read error.',
+'http-timed-out'      => 'HTTP request timed out.',
+'http-curl-error'     => 'Error fetching URL: $1',
+'http-bad-status'     => 'There was a problem during the HTTP request: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6'       => 'Could not reach URL',
@@ -2415,8 +2468,8 @@ You may want to try at a less busy time.',
 'nolicense'          => 'None selected',
 'licenses'           => '-', # do not translate or duplicate this message to other languages
 'license-nopreview'  => '(Preview not available)',
-'upload_source_url'  => ' (a valid, publicly accessible URL)',
-'upload_source_file' => ' (a file on your computer)',
+'upload_source_url'  => '(a valid, publicly accessible URL)',
+'upload_source_file' => '(a file on your computer)',
 
 # Special:ListFiles
 'listfiles-summary'     => 'This special page shows all uploaded files.
@@ -2872,8 +2925,8 @@ Future changes to this page and its associated talk page will be listed there.',
 'notvisiblerev'        => 'The last revision by a different user has been deleted',
 'watchnochange'        => 'None of your watched items were edited in the time period displayed.',
 'watchlist-details'    => '{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.',
-'wlheader-enotif'      => 'Email notification is enabled.',
-'wlheader-showupdated' => "* Pages that have been changed since you last visited them are shown in '''bold'''",
+'wlheader-enotif'      => 'Email notification is enabled.',
+'wlheader-showupdated' => "Pages that have been changed since you last visited them are shown in '''bold'''.",
 'watchmethod-recent'   => 'checking recent edits for watched pages',
 'watchmethod-list'     => 'checking watched pages for recent edits',
 'watchlistcontains'    => 'Your watchlist contains $1 {{PLURAL:$1|page|pages}}.',
@@ -3307,6 +3360,7 @@ Please contact your Internet service provider or technical support of your organ
 'sorbsreason'                     => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.',
 'sorbs_create_account_reason'     => 'Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.
 You cannot create an account',
+'xffblockreason'                  => 'An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1',
 'cant-block-while-blocked'        => 'You cannot block other users while you are blocked.',
 'cant-see-hidden-user'            => "The user you are trying to block has already been blocked and hidden.
 Since you do not have the hideuser right, you cannot see or edit the user's block.",
@@ -3476,6 +3530,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'thumbnail-more'           => 'Enlarge',
 'filemissing'              => 'File missing',
 'thumbnail_error'          => 'Error creating thumbnail: $1',
+'thumbnail_error_remote'   => 'Error message from $1:
+$2',
 'djvu_page_error'          => 'DjVu page out of range',
 'djvu_no_xml'              => 'Unable to fetch XML for DjVu file',
 'thumbnail-temp-create'    => 'Unable to create temporary thumbnail file',
@@ -3702,17 +3758,11 @@ You can view its source',
 
 # Stylesheets
 'common.css'              => '/* CSS placed here will be applied to all skins */', # only translate this message to other languages if you have to change it
-'standard.css'            => '/* CSS placed here will affect users of the Standard skin */', # only translate this message to other languages if you have to change it
-'nostalgia.css'           => '/* CSS placed here will affect users of the Nostalgia skin */', # only translate this message to other languages if you have to change it
 'cologneblue.css'         => '/* CSS placed here will affect users of the Cologne Blue skin */', # only translate this message to other languages if you have to change it
 'monobook.css'            => '/* CSS placed here will affect users of the MonoBook skin */', # only translate this message to other languages if you have to change it
-'myskin.css'              => '/* CSS placed here will affect users of the MySkin skin */', # only translate this message to other languages if you have to change it
-'chick.css'               => '/* CSS placed here will affect users of the Chick skin */', # only translate this message to other languages if you have to change it
-'simple.css'              => '/* CSS placed here will affect users of the Simple skin */', # only translate this message to other languages if you have to change it
 'modern.css'              => '/* CSS placed here will affect users of the Modern skin */', # only translate this message to other languages if you have to change it
 'vector.css'              => '/* CSS placed here will affect users of the Vector skin */', # only translate this message to other languages if you have to change it
 'print.css'               => '/* CSS placed here will affect the print output */', # only translate this message to other languages if you have to change it
-'handheld.css'            => '/* CSS placed here will affect handheld devices based on the skin configured in $wgHandheldStyle */', # only translate this message to other languages if you have to change it
 'noscript.css'            => '/* CSS placed here will affect users with JavaScript disabled */', # only translate this message to other languages if you have to change it
 'group-autoconfirmed.css' => '/* CSS placed here will affect autoconfirmed users only */', # only translate this message to other languages if you have to change it
 'group-bot.css'           => '/* CSS placed here will affect bots only */', # only translate this message to other languages if you have to change it
@@ -3721,13 +3771,8 @@ You can view its source',
 
 # Scripts
 'common.js'              => '/* Any JavaScript here will be loaded for all users on every page load. */', # only translate this message to other languages if you have to change it
-'standard.js'            => '/* Any JavaScript here will be loaded for users using the Standard skin */', # only translate this message to other languages if you have to change it
-'nostalgia.js'           => '/* Any JavaScript here will be loaded for users using the Nostalgia skin */', # only translate this message to other languages if you have to change it
 'cologneblue.js'         => '/* Any JavaScript here will be loaded for users using the Cologne Blue skin */', # only translate this message to other languages if you have to change it
 'monobook.js'            => '/* Any JavaScript here will be loaded for users using the MonoBook skin */', # only translate this message to other languages if you have to change it
-'myskin.js'              => '/* Any JavaScript here will be loaded for users using the MySkin skin */', # only translate this message to other languages if you have to change it
-'chick.js'               => '/* Any JavaScript here will be loaded for users using the Chick skin */', # only translate this message to other languages if you have to change it
-'simple.js'              => '/* Any JavaScript here will be loaded for users using the Simple skin */', # only translate this message to other languages if you have to change it
 'modern.js'              => '/* Any JavaScript here will be loaded for users using the Modern skin */', # only translate this message to other languages if you have to change it
 'vector.js'              => '/* Any JavaScript here will be loaded for users using the Vector skin */', # only translate this message to other languages if you have to change it
 'group-autoconfirmed.js' => '/* Any JavaScript here will be loaded for autoconfirmed users only */', # only translate this message to other languages if you have to change it
@@ -3794,8 +3839,8 @@ This is probably caused by a link to a blacklisted external site.',
 'pageinfo-magic-words'            => 'Magic {{PLURAL:$1|word|words}} ($1)',
 'pageinfo-hidden-categories'      => 'Hidden {{PLURAL:$1|category|categories}} ($1)',
 'pageinfo-templates'              => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
-'pageinfo-footer'                 => '-', # do not translate or duplicate this message to other languages
 'pageinfo-transclusions'          => '{{PLURAL:$1|Page|Pages}} transcluded on ($1)',
+'pageinfo-footer'                 => '-', # do not translate or duplicate this message to other languages
 'pageinfo-toolboxlink'            => 'Page information',
 'pageinfo-redirectsto'            => 'Redirects to',
 'pageinfo-redirectsto-info'       => 'info',
@@ -3810,13 +3855,8 @@ This is probably caused by a link to a blacklisted external site.',
 'pageinfo-category-files'         => 'Number of files',
 
 # Skin names
-'skinname-standard'    => 'Classic', # only translate this message to other languages if you have to change it
-'skinname-nostalgia'   => 'Nostalgia', # only translate this message to other languages if you have to change it
 'skinname-cologneblue' => 'Cologne Blue', # only translate this message to other languages if you have to change it
 'skinname-monobook'    => 'MonoBook', # only translate this message to other languages if you have to change it
-'skinname-myskin'      => 'MySkin', # only translate this message to other languages if you have to change it
-'skinname-chick'       => 'Chick', # only translate this message to other languages if you have to change it
-'skinname-simple'      => 'Simple', # only translate this message to other languages if you have to change it
 'skinname-modern'      => 'Modern', # only translate this message to other languages if you have to change it
 'skinname-vector'      => 'Vector', # only translate this message to other languages if you have to change it
 
@@ -3902,11 +3942,26 @@ By executing it, your system may be compromised.",
 'minutes'        => '{{PLURAL:$1|$1 minute|$1 minutes}}',
 'hours'          => '{{PLURAL:$1|$1 hour|$1 hours}}',
 'days'           => '{{PLURAL:$1|$1 day|$1 days}}',
+'weeks'          => '{{PLURAL:$1|$1 week|$1 weeks}}',
 'months'         => '{{PLURAL:$1|$1 month|$1 months}}',
 'years'          => '{{PLURAL:$1|$1 year|$1 years}}',
 'ago'            => '$1 ago',
 'just-now'       => 'just now',
 
+# Human-readable timestamps
+'hours-ago'    => '$1 {{PLURAL:$1|hour|hours}} ago',
+'minutes-ago'  => '$1 {{PLURAL:$1|minute|minutes}} ago',
+'seconds-ago'  => '$1 {{PLURAL:$1|seconds|seconds}} ago',
+'monday-at'    => 'Monday at $1',
+'tuesday-at'   => 'Tuesday at $1',
+'wednesday-at' => 'Wednesday at $1',
+'thursday-at'  => 'Thursday at $1',
+'friday-at'    => 'Friday at $1',
+'saturday-at'  => 'Saturday at $1',
+'sunday-at'    => 'Sunday at $1',
+'today-at'     => '$1', # do not translate or duplicate this message to other languages
+'yesterday-at' => 'Yesterday at $1',
+
 # Bad image list
 'bad_image_list' => 'The format is as follows:
 
@@ -3916,8 +3971,6 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans', # only translate this message to other languages if you have to change it
@@ -3993,7 +4046,7 @@ Others will be hidden by default.
 'metadata-langitem'         => "'''$2:''' $1", # only translate this message to other languages if you have to change it
 'metadata-langitem-default' => '$1', # only translate this message to other languages if you have to change it
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth'                  => 'Width',
 'exif-imagelength'                 => 'Height',
 'exif-bitspersample'               => 'Bits per component',
@@ -4190,7 +4243,7 @@ $4, $5, $6 $7
 $8', # only translate this message to other languages if you have to change it
 'exif-subjectnewscode-value'  => '$2 ($1)', # only translate this message to other languages if you have to change it
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1'     => 'Uncompressed',
 'exif-compression-2'     => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
 'exif-compression-3'     => 'CCITT Group 3 fax encoding',
@@ -4764,12 +4817,18 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'version-entrypoints-api-php'           => '[https://www.mediawiki.org/wiki/Manual:api.php api.php]', # do not translate or duplicate this message to other languages
 'version-entrypoints-load-php'          => '[https://www.mediawiki.org/wiki/Manual:load.php load.php]', # do not translate or duplicate this message to other languages
 
-# Special:FilePath
-'filepath'         => 'File path',
-'filepath-page'    => 'File:',
-'filepath-submit'  => 'Go',
-'filepath-summary' => 'This special page returns the complete path for a file.
-Images are shown in full resolution, other file types are started with their associated program directly.',
+# Special:Redirect
+'redirect'            => 'Redirect by file, user, or revision ID',
+'redirect-legend'     => 'Redirect to a file or page',
+'redirect-text'       => '', # do not translate or duplicate this message to other languages
+'redirect-summary'    => 'This special page redirects to a file (given the file name), a page (given a revision ID), or a user page (given a numeric user ID).',
+'redirect-submit'     => 'Go',
+'redirect-lookup'     => 'Lookup:',
+'redirect-value'      => 'Value:',
+'redirect-user'       => 'User ID',
+'redirect-revision'   => 'Page revision',
+'redirect-file'       => 'File name',
+'redirect-not-exists' => 'Value not found',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch'           => 'Search for duplicate files',
@@ -4863,6 +4922,9 @@ This site is experiencing technical difficulties.',
 'htmlform-submit'              => 'Submit',
 'htmlform-reset'               => 'Undo changes',
 'htmlform-selectorother-other' => 'Other',
+'htmlform-no'                  => 'No',
+'htmlform-yes'                 => 'Yes',
+'htmlform-chosen-placeholder'  => 'Select an option',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 with full-text search support',
@@ -5002,7 +5064,7 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
-#Rotation
+# Image rotation
 'rotate-comment' => 'Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise',
 
 );
index 071c7fc..eb6a385 100644 (file)
@@ -28,6 +28,7 @@
  * @author Michawiki
  * @author Mihxil
  * @author MinuteElectron
+ * @author Nemo bis
  * @author Objectivesea
  * @author Omnipaedista
  * @author Pedroca cerebral
@@ -79,11 +80,17 @@ $namespaceAliases = array(
        'Kategoria_diskuto'    => NS_CATEGORY_TALK,
 );
 
+$namespaceGenderAliases = array(
+       NS_USER => array( 'male' => 'Uzanto', 'female' => 'Uzantino' ),
+       NS_USER_TALK => array( 'male' => 'Uzanto-Diskuto', 'female' => 'Uzantino-Diskuto' ),
+);
+
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktivaj_uzantoj' ),
        'Allmessages'               => array( 'Ĉiuj_mesaĝoj' ),
        'Allpages'                  => array( 'Ĉiuj_paĝoj' ),
        'Ancientpages'              => array( 'Malnovaj_paĝoj' ),
+       'Badtitle'                  => array( 'Malbona_titolo' ),
        'Blankpage'                 => array( 'Malplena_paĝo' ),
        'Block'                     => array( 'Forbari_IP-adreson' ),
        'Blockme'                   => array( 'Forbari_min' ),
@@ -92,7 +99,7 @@ $specialPageAliases = array(
        'Categories'                => array( 'Kategorioj' ),
        'ChangeEmail'               => array( 'Ŝanĝi_retpoŝton' ),
        'ChangePassword'            => array( 'Ŝanĝi_pasvorton' ),
-       'ComparePages'              => array( 'Komparu_paĝojn' ),
+       'ComparePages'              => array( 'Kompari_paĝojn', 'Komparu_paĝojn' ),
        'Confirmemail'              => array( 'Konfirmi_per_retpoŝto' ),
        'Contributions'             => array( 'Kontribuoj' ),
        'CreateAccount'             => array( 'Krei_konton' ),
@@ -100,27 +107,27 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'Forigitaj_kontribuoj' ),
        'Disambiguations'           => array( 'Apartigiloj' ),
        'DoubleRedirects'           => array( 'Duoblaj_alidirektiloj' ),
-       'EditWatchlist'             => array( 'Redakti_atenatron' ),
+       'EditWatchlist'             => array( 'Redakti_atentaron' ),
        'Emailuser'                 => array( 'Retpoŝti_uzanton' ),
-       'Export'                    => array( 'Eksporti' ),
+       'Export'                    => array( 'Elporti', 'Eksporti' ),
        'Fewestrevisions'           => array( 'Plej_malmultaj_revizioj' ),
        'FileDuplicateSearch'       => array( 'Serĉi_pri_duoblaj_dosieroj' ),
-       'Filepath'                  => array( 'Dosiero-pado' ),
-       'Import'                    => array( 'Importi' ),
+       'Filepath'                  => array( 'Pado_de_dosiero', 'Dosiero-pado' ),
+       'Import'                    => array( 'Enporti', 'Importi' ),
        'Invalidateemail'           => array( 'Malvalidigi_retpoŝton' ),
        'BlockList'                 => array( 'Forbarlisto_de_IP-adresoj', 'IP-adresa_forbarlisto' ),
        'LinkSearch'                => array( 'Serĉi_ligilon' ),
        'Listadmins'                => array( 'Listigi_administrantojn' ),
        'Listbots'                  => array( 'Listigi_robotojn' ),
-       'Listfiles'                 => array( 'Bildolisto' ),
+       'Listfiles'                 => array( 'Listigi_dosierojn', 'Listigi_bildojn', 'Bildolisto' ),
        'Listgrouprights'           => array( 'Gruprajtoj_de_uzantoj' ),
-       'Listredirects'             => array( 'Listigi_alidirektojn' ),
+       'Listredirects'             => array( 'Listigi_alidirektilojn', 'Listigi_alidirektojn' ),
        'Listusers'                 => array( 'Listo_de_uzantoj' ),
        'Lockdb'                    => array( 'Ŝlosi_datumbazon' ),
        'Log'                       => array( 'Protokolo', 'Protokoloj' ),
        'Lonelypages'               => array( 'Neligitaj_paĝoj' ),
        'Longpages'                 => array( 'Longaj_paĝoj' ),
-       'MergeHistory'              => array( 'Kunigi_historion' ),
+       'MergeHistory'              => array( 'Unuigi_kronologion', 'Kunigi_kronologion', 'Kunigi_historion' ),
        'MIMEsearch'                => array( 'MIME-Serĉo' ),
        'Mostcategories'            => array( 'Plej_multaj_kategorioj' ),
        'Mostimages'                => array( 'Plej_ligitaj_bildoj' ),
@@ -130,7 +137,7 @@ $specialPageAliases = array(
        'Mostrevisions'             => array( 'Plej_multaj_revizioj' ),
        'Movepage'                  => array( 'Alinomigi_paĝon' ),
        'Mycontributions'           => array( 'Miaj_kontribuoj', 'MiajKontribuoj' ),
-       'Mypage'                    => array( 'MiaPaĝo', 'Mia_paĝo' ),
+       'Mypage'                    => array( 'Mia_paĝo', 'MiaPaĝo' ),
        'Mytalk'                    => array( 'Mia_diskutpaĝo', 'MiaDiskutpaĝo' ),
        'Myuploads'                 => array( 'Miaj_alŝutaĵoj' ),
        'Newimages'                 => array( 'Novaj_bildoj' ),
@@ -143,7 +150,7 @@ $specialPageAliases = array(
        'Protectedpages'            => array( 'Protektitaj_paĝoj' ),
        'Protectedtitles'           => array( 'Protektitaj_titoloj' ),
        'Randompage'                => array( 'Hazarda_paĝo' ),
-       'Randomredirect'            => array( 'Hazarda_alidirekto' ),
+       'Randomredirect'            => array( 'Hazarda_alidirektilo', 'Hazarda_alidirekto' ),
        'Recentchanges'             => array( 'Lastaj_ŝanĝoj' ),
        'Recentchangeslinked'       => array( 'Rilataj_ŝanĝoj' ),
        'Revisiondelete'            => array( 'Forigi_revizion' ),
@@ -178,7 +185,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#ALIDIREKTU', '#ALIDIREKTI', '#AL', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#ALIDIREKTI', '#ALIDIREKTU', '#AL', '#REDIRECT' ),
        'notoc'                     => array( '0', '__NI__', '__NEINDEKSO__', '__NT__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__NG__', '__SENBILDARO__', '__SB__', '__SG__', '__SENGALERIO__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__FI__', '__FORTUINDEKSON__', '__FT__', '__FORCETOC__' ),
@@ -217,6 +224,7 @@ $magicWords = array(
        'pagenamee'                 => array( '1', 'PAĜONOMOO', 'PAGXONOMOO', 'PAĜNOMOO', 'PAGXNOMOO', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'NOMSPACO', 'NAMESPACE' ),
        'namespacee'                => array( '1', 'NOMSPACOO', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'NUMERODENOMSPACO', 'NOMSPACNUMERO', 'NAMESPACENUMBER' ),
        'talkspace'                 => array( '1', 'DISKUTNOMSPACO', 'TALKSPACE' ),
        'talkspacee'                => array( '1', 'DISKUTNOMSPACOO', 'TALKSPACEE' ),
        'fullpagename'              => array( '1', 'TUTAPAĜONOMO', 'TUTAPAGXONOMO', 'TUTAPAĜNOMO', 'TUTAPAGXNOMO', 'FULLPAGENAME' ),
@@ -252,12 +260,14 @@ $magicWords = array(
        'img_text_bottom'           => array( '1', 'suba-teksto', 'text-bottom' ),
        'img_link'                  => array( '1', 'ligilo=$1', 'link=$1' ),
        'img_alt'                   => array( '1', 'alternative=$1', 'alt=$1' ),
+       'img_class'                 => array( '1', 'klaso=$1', 'class=$1' ),
        'int'                       => array( '0', 'ENE:', 'INT:' ),
        'sitename'                  => array( '1', 'TTT-NOMO', 'RETPAĜNOMO', 'RETPAGXNOMO', 'RETEJNOMO', 'SITENAME' ),
        'nse'                       => array( '0', 'NSS:', 'NSO:', 'NSE:' ),
        'localurl'                  => array( '0', 'LOKATTT:', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'LOKATTTT:', 'LOCALURLE:' ),
        'articlepath'               => array( '0', 'ARTIKOLAPADO', 'ARTIKOLAVOJO', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'IDENTIGILODEPAĜO', 'PAĜID', 'PAGEID' ),
        'server'                    => array( '0', 'SERVILO', 'SERVER' ),
        'servername'                => array( '0', 'NOMODESERVILO', 'SERVILANOMO', 'SERVILONOMO', 'SERVERNAME' ),
        'scriptpath'                => array( '0', 'SKRIPTO-VOJO', 'SKRIPTOVOJO', 'SKRIPTVOJO', 'SCRIPTPATH' ),
@@ -343,8 +353,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Montri la nombron da priatentaj uzantoj',
 'tog-oldsig' => 'Ekzistanta subskribo:',
 'tog-fancysig' => 'Trakti subskribon kiel vikitekston (sen aŭtomata ligo)',
-'tog-externaleditor' => 'Defaŭlte uzi eksteran tekstprilaborilon (nur por ekspertoj, ĉar tio necesigas specialajn agordojn en via komputilo. [//www.mediawiki.org/wiki/Manual:External_editors Pliaj informoj.])',
-'tog-externaldiff' => 'Defaŭlte uzi eksteran ŝanĝmontrilon (nur por ekspertoj, ĉar tio necesigas specialajn agordojn en via komputilo. [//www.mediawiki.org/wiki/Manual:External_editors Pliaj informoj.])',
 'tog-showjumplinks' => 'Ebligi alirligojn "salti al"
 <!-- Bonvolu kontroli ĉu ĝustas la traduko de : Enable "jump to" accessibility links -->',
 'tog-uselivepreview' => 'Uzi tujan antaŭrigardon (ĜavaSkripto) (Eksperimenta)',
@@ -359,6 +367,7 @@ $messages = array(
 'tog-diffonly' => 'Ne montri paĝan enhavon sub la ŝanĝoj',
 'tog-showhiddencats' => 'Montri kaŝitajn kategoriojn',
 'tog-norollbackdiff' => 'Preterlasi ŝanĝoelmontron post malfaro',
+'tog-useeditwarning' => 'Averti min kiam mi forlasas redaktan paĝon kun nekonservitaj ŝanĝoj',
 
 'underline-always' => 'Ĉiam',
 'underline-never' => 'Neniam',
@@ -469,7 +478,7 @@ $messages = array(
 'vector-action-move' => 'Alinomigi',
 'vector-action-protect' => 'Protekti',
 'vector-action-undelete' => 'Malforigi',
-'vector-action-unprotect' => 'Ŝanĝi protekadon',
+'vector-action-unprotect' => 'Ŝanĝi protektadon',
 'vector-simplesearch-preference' => 'Ebligi simpligitan serĉan strion (nur Vektora etoso)',
 'vector-view-create' => 'Krei',
 'vector-view-edit' => 'Redakti',
@@ -731,9 +740,14 @@ Notu ke iuj paĝoj daŭre ŝajnos kvazaŭ vi ankoraŭ estus ensalutinta, ĝis vi
 'welcomecreation-msg' => 'Via konto estas kreita.
 Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'yourname' => 'Salutnomo:',
+'userlogin-yourname' => 'Uzantonomo',
+'userlogin-yourname-ph' => 'Enigu vian uzantonomon',
 'yourpassword' => 'Pasvorto:',
+'userlogin-yourpassword' => 'Pasvorto',
+'userlogin-yourpassword-ph' => 'Enigu vian pasvorton',
 'yourpasswordagain' => 'Retajpu pasvorton',
 'remembermypassword' => 'Memori mian ensalutadon ĉe ĉi tiu komputilo (daŭrante maksimume $1 {{PLURAL:$1|tagon|tagojn}})',
+'userlogin-remembermypassword' => 'Memoru mian ensaluton',
 'securelogin-stick-https' => 'Resti konektita al HTTPS post ensalutado',
 'yourdomainname' => 'Via domajno',
 'password-change-forbidden' => 'Ve ne povas ŝanĝi pasvortojn en ĉi tiu vikio.',
@@ -746,12 +760,14 @@ Ne forgesu ŝanĝi viajn [[Special:Preferences|{{SITENAME}}-preferojn]]',
 'logout' => 'Elsaluti',
 'userlogout' => 'Elsaluti',
 'notloggedin' => 'Ne ensalutinta',
+'userlogin-noaccount' => 'Ĉu vi ne havas konton?',
 'nologin' => "Ĉu vi ne havas konton? '''$1'''.",
 'nologinlink' => 'Krei konton',
 'createaccount' => 'Krei novan konton',
 'gotaccount' => "Ĉu vi jam havas konton? '''$1'''.",
 'gotaccountlink' => 'Ensaluti',
 'userlogin-resetlink' => 'Ĉu vi forgesis ensalutajn detalojn?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Helpo pri ensalutado]]',
 'createaccountmail' => 'Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝto suben',
 'createaccountreason' => 'Kialo:',
 'badretype' => 'La pasvortojn kiujn vi tajpis ne egalas.',
@@ -823,6 +839,7 @@ Bonvolu ĝisatendi antaŭ retrovi.',
 # Email sending
 'php-mail-error-unknown' => 'Nekonata eraro en la funkcio mail() de PHP',
 'user-mail-no-addy' => 'Provis sendi retpoŝton sen retpoŝtadreso.',
+'user-mail-no-body' => 'Provo sendi malplenan aŭ sensence mallongan retpošton.',
 
 # Change password dialog
 'resetpass' => 'Ŝanĝi pasvorton',
@@ -844,10 +861,9 @@ Vi eble jam ŝanĝis vian pasvorton aŭ petis novan provizoran pasvorton.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restarigo de pasvorto',
-'passwordreset-text' => 'Plenumigu ĉi tiun formularon por ricevi retpoŝtan memoraĵon de viaj kontaj detaloj.',
 'passwordreset-legend' => 'Refari pasvorton',
 'passwordreset-disabled' => 'Pasvortaj restarigoj estis malŝaltitaj en ĉi tiu vikio.',
-'passwordreset-pretext' => '{{PLURAL:$1||Enigi unu el la jenaj datenoj}}',
+'passwordreset-emaildisabled' => 'Retpoŝtaj funkcioj estas malfunkciigitaj en tiu ĉi vikio.',
 'passwordreset-username' => 'Salutnomo:',
 'passwordreset-domain' => 'Domajno:',
 'passwordreset-capture' => 'Vidi la rezultan retpoŝton?',
@@ -876,9 +892,9 @@ aŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ŝanĝi
 ĝin, vi povas ignori ĉi tiun mesaĝon kaj uzi vian malnovan pasvorton.',
 'passwordreset-emailelement' => 'Salutnomo: $1
 Provizora pasvorto: $2',
-'passwordreset-emailsent' => 'Rememoriga retpoŝto estis sendita.',
-'passwordreset-emailsent-capture' => 'Memoriga retpoŝto estis sendita, kiu estas montrata sube.',
-'passwordreset-emailerror-capture' => 'Memoriga retpoŝto estis generita, montrata sube, sed sendado al uzanto malsukcesis: $1',
+'passwordreset-emailsent' => 'Renovigita pasvorto estis retpoŝte sendita.',
+'passwordreset-emailsent-capture' => 'Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata sube.',
+'passwordreset-emailerror-capture' => 'Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al uzanto malsukcesis: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ŝanĝi retpoŝtadreson',
@@ -922,7 +938,8 @@ Provizora pasvorto: $2',
 'showpreview' => 'Antaŭrigardo',
 'showlivepreview' => 'Aktiva antaŭvido',
 'showdiff' => 'Montri ŝanĝojn',
-'anoneditwarning' => 'Vi ne estas ensalutinta. Via IP-adreso enregistriĝos en la ŝango-historio de tiu ĉi paĝo.',
+'anoneditwarning' => "'''Averto:''' Vi ne estas ensalutinta.
+Via IP-adreso enregistriĝos en la redakta historio de tiu ĉi paĝo.",
 'anonpreviewwarning' => "''Vi ne estas ensalutita. La konservo de la paĝo registros vian IP-adreson en kronologio de ĉi tiu paĝo.''",
 'missingsummary' => "'''Rememorigilo:''' Vi ne provizis redaktan resumon. Se vi alklakos denove la konservan butonon, via redaktaĵo estos konservita sen resumo.",
 'missingcommenttext' => 'Bonvolu entajpi komenton malsupre.',
@@ -1090,12 +1107,15 @@ Jen la protokolo pri forigado kaj alinomigado por via referenco.',
 Verŝajne ĝi estis forigita.',
 'edit-conflict' => 'Redakto-konflikto.',
 'edit-no-change' => 'Via redakto estis ignorita, ĉar neniu ŝanĝo estis farita al la teksto.',
+'postedit-confirmation' => 'Via redakto estis konservita.',
 'edit-already-exists' => 'Ne eblis krei novan paĝon.
 Ĝi jam ekzistas.',
 'defaultmessagetext' => 'Defaŭlta teksto',
 'content-failed-to-parse' => 'Oni malsukcesis analizi $2-entenon laŭ la $1-modelo: $3',
 'invalid-content-data' => 'Enhavo estas malvalida',
 'content-not-allowed-here' => 'Enhavo de $1 ne estas permesita en paĝo [[$2]]',
+'editwarning-warning' => 'Forlasante ĉi tiun paĝon kaŭzos al vi perdi iun ajn ŝanĝojn kiujn vi faris.
+Se vi ensalutas, vi povas malŝalti ĉi tiun averton en la sekcio "{{int:prefs-editing}}" de viaj preferoj.',
 
 # Content models
 'content-model-wikitext' => 'vikiteksto',
@@ -1358,7 +1378,7 @@ Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'search-interwiki-default' => '$1 rezultoj:',
 'search-interwiki-more' => '(plu)',
 'search-relatedarticle' => 'Relataj',
-'mwsuggest-disable' => 'Malŝalti AJAX-sugestojn',
+'mwsuggest-disable' => 'Malŝalti serĉajn sugestojn',
 'searcheverything-enable' => 'Traserĉi ĉiujn nomspacojn',
 'searchrelated' => 'rilataj',
 'searchall' => 'ĉiuj',
@@ -1379,15 +1399,7 @@ Provu prefiksi vian mendon kun ''all:'' por serĉi ĉiun enhavon (inkluzivante d
 'search-external' => 'Ekstera serĉo',
 'searchdisabled' => '<p>Oni provizore malŝaltis serĉadon per la plenteksta
 indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> aŭ per <i>jahu!</i>:</p>',
-
-# Quickbar
-'qbsettings' => 'Preferoj pri ilaro',
-'qbsettings-none' => 'Neniu',
-'qbsettings-fixedleft' => 'Fiksiĝas maldekstre',
-'qbsettings-fixedright' => 'Fiksiĝas dekstre',
-'qbsettings-floatingleft' => 'Ŝvebas maldekstre',
-'qbsettings-floatingright' => 'Ŝvebas dekstre',
-'qbsettings-directionality' => 'Fiksita, laŭ la teksto-direkteco de via lingvo',
+'search-error' => 'Okazis eraro dum serĉado: $1',
 
 # Preferences page
 'preferences' => 'Preferoj',
@@ -1929,7 +1941,6 @@ Por optimuma sekureco, img_auth.php estas malŝalta.',
 'http-read-error' => 'HTTP-legeraro.',
 'http-timed-out' => 'HTTP-peto eltempiĝis.',
 'http-curl-error' => 'Eraro venigante URL-on: $1',
-'http-host-unreachable' => 'URL-o ne estis atingebla.',
 'http-bad-status' => 'Estis problemo dum la HTTP-peto: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2336,8 +2347,8 @@ La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel
 'notvisiblerev' => 'Versio estis forigita',
 'watchnochange' => 'Neniu artikolo en via atentaro redaktiĝis dum la prispektita tempoperiodo.',
 'watchlist-details' => '{{PLURAL:$1|$1 paĝon|$1 paĝojn}} en via atentaro, krom diskutpaĝoj.',
-'wlheader-enotif' => 'Retpoŝta sciigo estas ebligita',
-'wlheader-showupdated' => "Montriĝas per '''dikaj literoj''' tiuj paĝoj, kiujn oni ŝanĝis ekde kiam vi laste vizitis ilin",
+'wlheader-enotif' => 'Retpoŝta sciigo estas ebligita',
+'wlheader-showupdated' => "Montriĝas per '''dikaj literoj''' tiuj paĝoj, kiujn oni ŝanĝis ekde kiam vi laste vizitis ilin",
 'watchmethod-recent' => 'traserĉas lastajn redaktojn',
 'watchmethod-list' => 'traserĉas priatentitajn',
 'watchlistcontains' => 'Via atentaro enhavas $1 {{PLURAL:$1|paĝon|paĝojn}}.',
@@ -2465,6 +2476,7 @@ Vidu [[Special:ProtectedPages|liston de protektitaj paĝoj]] por listo de aktual
 'prot_1movedto2' => '[[$1]] movita al [[$2]]',
 'protect-badnamespace-title' => 'Ne-protektebla nomspaco',
 'protect-badnamespace-text' => 'Paĝoj en ĉi tiu datumbazo ne povas esti protektita.',
+'protect-norestrictiontypes-title' => 'Neprotektebla paĝo',
 'protect-legend' => 'Konfirmi protektadon',
 'protectcomment' => 'Kialo:',
 'protectexpiry' => 'Eksvalidiĝas:',
@@ -2480,9 +2492,9 @@ Jen la aktualaj valoroj por la paĝo '''$1''':",
 'protect-cascadeon' => 'Ĉi paĝo estas nun protektita kontraŭ redaktado ĉar ĝi estas inkluzivita en {{PLURAL:$1|jena paĝo, kiu mem estas protektita|jenaj paĝoj, kiuj mem estas protektitaj}} per kaskada protekto.
 Vi povas ŝanĝi ties protektnivelon, sed tio ne ŝanĝos la kaskadan protekton.',
 'protect-default' => 'Permesigi ĉiujn uzantojn',
-'protect-fallback' => 'Rajto "$1" nepras.',
+'protect-fallback' => 'Permesi nur uzantojn kun la rajto  "$1"',
 'protect-level-autoconfirmed' => 'Bloki novajn kaj neregistritajn uzantojn',
-'protect-level-sysop' => 'Nur administrantoj',
+'protect-level-sysop' => 'Permesi nur administrantojn',
 'protect-summary-cascade' => 'kaskada',
 'protect-expiring' => 'finiĝas je $1 (UTC)',
 'protect-expiring-local' => 'eksdatiĝas $1',
@@ -3059,17 +3071,11 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 
 # Stylesheets
 'common.css' => '/* La jena CSS influos la aspekton de ĉiaj temoj. */',
-'standard.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Klasika temo. */',
-'nostalgia.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Nostalgia temo. */',
 'cologneblue.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Kolonja Blua temo. */',
 'monobook.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Libreja temo. */',
-'myskin.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Miŝela temo. */',
-'chick.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Kokida temo. */',
-'simple.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Simpla temo. */',
 'modern.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Moderna temo. */',
 'vector.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Vektora temo. */',
 'print.css' => '/* La jena CSS influos la prezentadon de la presaĵo. */',
-'handheld.css' => '/* La jena CSS influos manpremitajn komputilojn sur bazo de la temo kiu arangiĝis en $wgHandheldStyle. */',
 'noscript.css' => '/* La jena CSS influos uzantojn, kiuj desebligis Ĝavaskripton. */',
 'group-autoconfirmed.css' => '/* La jena CSS sole influos auxtokonfirmatajn uzantojn. */',
 'group-bot.css' => '/* La jena CSS sole influos robotojn. */',
@@ -3078,13 +3084,8 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 
 # Scripts
 'common.js' => '/* La jena Ĝavaskripto ŝargiĝos por ĉiaj uzantoj ĉe ĉiu paĝoŝargado. */',
-'standard.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Klasika temo. */',
-'nostalgia.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Nostalgia temo. */',
 'cologneblue.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kolonja Blua temo. */',
 'monobook.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Libreja temo. */',
-'myskin.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Miŝela temo. */',
-'chick.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kokida temo. */',
-'simple.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Simpla temo. */',
 'modern.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Moderna temo. */',
 'vector.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Vektora temo. */',
 'group-autoconfirmed.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por auxtokonfirmataj uzantoj. */',
@@ -3134,6 +3135,7 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'pageinfo-robot-noindex' => 'Ne indeksebla',
 'pageinfo-views' => 'Nombro de rigardoj',
 'pageinfo-watchers' => 'Nombro de paĝatentantoj',
+'pageinfo-few-watchers' => 'Malpli ol $1 {{PLURAL:$1|atentanto|atentantoj}}',
 'pageinfo-redirects-name' => 'Alidirektoj al ĉi tiu paĝo',
 'pageinfo-subpages-name' => 'Subpaĝoj de ĉi tiu paĝo',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|alidirektilo|alidirektiloj}}; $3 {{PLURAL:$3|ne-alidirektilo|ne-alidirektiloj}})',
@@ -3162,13 +3164,8 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'pageinfo-category-files' => 'Nombro de dosieroj',
 
 # Skin names
-'skinname-standard' => 'Klasiko',
-'skinname-nostalgia' => 'Nostalgio',
 'skinname-cologneblue' => 'Kolonja Bluo',
 'skinname-monobook' => 'Librejo',
-'skinname-myskin' => 'Miŝelo',
-'skinname-chick' => 'Kokido',
-'skinname-simple' => 'Simplo',
 'skinname-modern' => 'Moderno',
 'skinname-vector' => 'Vektoro',
 
@@ -3246,11 +3243,17 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutoj}}',
 'hours' => '{{PLURAL:$1|$1 horo|$1 horoj}}',
 'days' => '{{PLURAL:$1|$1 tago|$1 tagoj}}',
+'weeks' => '{{PLURAL:$1|$1 semajno|$1 semajnoj}}',
 'months' => '{{PLURAL:$1|$1 monato|$1 monatoj}}',
 'years' => '{{PLURAL:$1|$1 jaro|$1 jaroj}}',
 'ago' => 'antaŭ $1',
 'just-now' => 'ĵus nune',
 
+# Human-readable timestamps
+'hours-ago' => 'antaŭ $1 {{PLURAL:$1|horo|horoj}}',
+'minutes-ago' => 'antaŭ $1 {{PLURAL:$1|minuto|minutoj}}',
+'seconds-ago' => 'antaŭ $1 {{PLURAL:$1|sekundo|sekundoj}}',
+
 # Bad image list
 'bad_image_list' => 'La formato estas jen:
 
@@ -3279,7 +3282,7 @@ Aliaj estos kaŝitaj defaŭlte.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larĝeco',
 'exif-imagelength' => 'Alteco',
 'exif-bitspersample' => 'Bitokoj en komponanto',
@@ -3457,7 +3460,7 @@ Aliaj estos kaŝitaj defaŭlte.
 'exif-originalimageheight' => 'Alto de bildo antaŭ stuco',
 'exif-originalimagewidth' => 'Larĝo de bildo antaŭ stuco',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nedensigita',
 'exif-compression-2' => 'CCITT-Grupo 3 modifita ciferado laŭ Huffman Dimensio-1',
 'exif-compression-3' => 'CCITT Grupo-3 ĉifrado por faksilo',
@@ -3926,13 +3929,6 @@ Oni devis doni al vi [{{SERVER}}{{SCRIPTPATH}}/COPYING ekzempleron de la GNU Gen
 'version-entrypoints-header-entrypoint' => 'Eniropunkto',
 'version-entrypoints-header-url' => 'Retadreso',
 
-# Special:FilePath
-'filepath' => 'Vojo al dosiero',
-'filepath-page' => 'Dosiero:',
-'filepath-submit' => 'Vojo',
-'filepath-summary' => 'Ĉi tiu speciala paĝo liveras kompletan vojon al dosiero.
-Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte per ties asociita programo.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Serĉu duplikatajn dosierojn',
 'fileduplicatesearch-summary' => 'Serĉi duplikatajn dosierojn bazite de haketvaloro.',
@@ -4022,6 +4018,8 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 'htmlform-submit' => 'Ek!',
 'htmlform-reset' => 'Malfari ŝanĝojn',
 'htmlform-selectorother-other' => 'Alia',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Jes',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 kun tut-teksta subteno',
@@ -4032,13 +4030,13 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 'logentry-delete-restore' => '$1 restarigis paĝon $3',
 'logentry-delete-event' => '$1 ŝanĝis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4',
 'logentry-delete-revision' => '$1 ŝanĝis videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paĝo $3: $4',
-'logentry-delete-event-legacy' => '$1 ŝanĝis vidiblecon de protokolaj eventoj en $3',
-'logentry-delete-revision-legacy' => '$1 ŝanĝis vidiblecon de revizioj en $3',
+'logentry-delete-event-legacy' => '$1 ŝanĝis videblecon de protokolaj eventoj en $3',
+'logentry-delete-revision-legacy' => '$1 ŝanĝis videblecon de revizioj en $3',
 'logentry-suppress-delete' => '$1 kaŝis paĝon $3',
 'logentry-suppress-event' => '$1 kaŝite ŝanĝis videblecon de {{PLURAL:$5|protokola evento|$5 protokolaj eventoj}} je $3: $4',
 'logentry-suppress-revision' => '$1 kaŝite ŝanĝis videblecon de {{PLURAL:$5|revizio|$5 reviziojn}} je paĝo $3: $4',
-'logentry-suppress-event-legacy' => '$1 kaŝite ŝanĝis vidiblecon de protokolaj eventoj en $3',
-'logentry-suppress-revision-legacy' => '$1 kaŝite ŝanĝis vidiblecon de revizioj en paĝo $3',
+'logentry-suppress-event-legacy' => '$1 kaŝite ŝanĝis videblecon de protokolaj eventoj en $3',
+'logentry-suppress-revision-legacy' => '$1 kaŝite ŝanĝis videblecon de revizioj en paĝo $3',
 'revdelete-content-hid' => 'enhavo kaŝita',
 'revdelete-summary-hid' => 'resumo de redakto kaŝita',
 'revdelete-uname-hid' => 'salutnomo kaŝita',
@@ -4048,15 +4046,16 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 'revdelete-restricted' => 'aplikis limojn al administrantoj',
 'revdelete-unrestricted' => 'forigis limojn por administrantoj',
 'logentry-move-move' => '$1 movis paĝon $3 al $4',
-'logentry-move-move-noredirect' => '$1 movis paĝon $3 al $4 sen lasante alidirektilon',
+'logentry-move-move-noredirect' => '$1 movis paĝon $3 al $4 ne lasante alidirektilon',
 'logentry-move-move_redir' => '$1 movis paĝon $3 al $4 anstataŭigante alidirektilon',
-'logentry-move-move_redir-noredirect' => '$1 movis paĝon $3 al $4 anstataŭigante alidirektilon sen lasante alidirektilon',
-'logentry-patrol-patrol' => '$1 markis revizion $4 de paĝo $3 kiel patrolita',
-'logentry-patrol-patrol-auto' => '$1 aŭtomate markis revizion $4 de paĝo $3 kiel patrolita',
-'logentry-newusers-newusers' => '$1 kreis konton',
-'logentry-newusers-create' => '$1 kreis konton',
-'logentry-newusers-create2' => '$1 kreis uzanton $3',
-'logentry-newusers-autocreate' => 'Konto $1 estis kreita aŭtomate',
+'logentry-move-move_redir-noredirect' => '$1 movis paĝon $3 al $4 anstataŭigante alidirektilon ne lasante alidirektilon',
+'logentry-patrol-patrol' => '$1 markis revizion $4 de paĝo $3 patrolita',
+'logentry-patrol-patrol-auto' => '$1 aŭtomate markis revizion $4 de paĝo $3 patrolita',
+'logentry-newusers-newusers' => 'Konto de uzanto $1 estis kreita',
+'logentry-newusers-create' => 'Konto de uzanto $1 estis kreita',
+'logentry-newusers-create2' => 'Konto de uzanto $3 estis kreita de $1',
+'logentry-newusers-byemail' => 'Konto de uzanto $3 estis kreita de $1 kaj pasvorto estis sendita per retpoŝto',
+'logentry-newusers-autocreate' => 'Uzantokonto $1 estis kreita aŭtomate',
 'logentry-rights-rights' => '$1 ŝanĝis grupan membrecon por $3 de $4 al $5',
 'logentry-rights-rights-legacy' => '$1 ŝanĝis grupan membrecon por $3',
 'logentry-rights-autopromote' => '$1 estis aŭtomate {{GENDER:$2|altrangigita}} de $4 al $5',
index 16d82a5..9404ffb 100644 (file)
  * @author Fibonacci
  * @author Fitoschido
  * @author Fluence
+ * @author Fortega
  * @author Gustronico
  * @author Gwickwire
+ * @author Hahc21
  * @author Hazard-SJ
  * @author Hercule
  * @author Icvav
  * @author Lin linao
  * @author Linterweb
  * @author Locos epraix
+ * @author Luckas
  * @author Mahadeva
  * @author Manuelt15
  * @author Maor X
+ * @author MarcoAurelio
  * @author McDutchie
  * @author Muro de Aguas
  * @author Omnipaedista
  * @author Orgullomoore
  * @author Paucabot
+ * @author Penarc
  * @author PerroVerd
  * @author Pertile
  * @author Piolinfax
  * @author Platonides
  * @author PoLuX124
+ * @author QuimGil
  * @author Ralgis
  * @author Remember the dot
+ * @author Remux
  * @author Richard Wolf VI
  * @author Sanbec
  * @author Savh
@@ -135,10 +142,10 @@ $specialPageAliases = array(
        'Booksources'               => array( 'FuentesDeLibros', 'Fuentes_de_libros' ),
        'BrokenRedirects'           => array( 'RedireccionesRotas', 'Redirecciones_rotas' ),
        'Categories'                => array( 'Categorías' ),
-       'ChangeEmail'               => array( 'CambiarEmail', 'CambiarCorreo' ),
+       'ChangeEmail'               => array( 'Cambiar_correo_electrónico', 'CambiarEmail', 'CambiarCorreo' ),
        'ChangePassword'            => array( 'Cambiar_contraseña', 'CambiarContraseña', 'ResetearContraseña', 'Resetear_contraseña' ),
-       'ComparePages'              => array( 'CompararPáginas' ),
-       'Confirmemail'              => array( 'ConfirmarEmail', 'Confirmar_correo_electrónico' ),
+       'ComparePages'              => array( 'Comparar_páginas', 'CompararPáginas' ),
+       'Confirmemail'              => array( 'Confirmar_correo_electrónico', 'ConfirmarEmail' ),
        'Contributions'             => array( 'Contribuciones' ),
        'CreateAccount'             => array( 'Crear_una_cuenta', 'CrearCuenta' ),
        'Deadendpages'              => array( 'PáginasSinSalida', 'Páginas_sin_salida' ),
@@ -146,7 +153,7 @@ $specialPageAliases = array(
        'Disambiguations'           => array( 'Desambiguaciones', 'Desambiguación' ),
        'DoubleRedirects'           => array( 'RedireccionesDobles', 'Redirecciones_dobles' ),
        'EditWatchlist'             => array( 'EditarSeguimiento' ),
-       'Emailuser'                 => array( 'MandarEmailUsuario' ),
+       'Emailuser'                 => array( 'Enviar_correo_electrónico', 'MandarEmailUsuario' ),
        'Export'                    => array( 'Exportar' ),
        'Fewestrevisions'           => array( 'MenosEdiciones', 'Menos_ediciones' ),
        'FileDuplicateSearch'       => array( 'BuscarArchivosDuplicados', 'Buscar_archivos_duplicados' ),
@@ -392,8 +399,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar el número de usuarios que la vigilan',
 'tog-oldsig' => 'Firma actual:',
 'tog-fancysig' => 'Tratar la firma como wikitexto (sin un enlace automático)',
-'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
-'tog-externaldiff' => "Utilizar ''diferencia'' externa por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])",
 'tog-showjumplinks' => 'Habilitar los enlaces de accesibilidad «saltar a»',
 'tog-uselivepreview' => 'Usar previsualización en vivo (requiere JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avisarme cuando grabe la página sin introducir un resumen de edición',
@@ -408,6 +413,7 @@ $messages = array(
 'tog-showhiddencats' => 'Mostrar las categorías escondidas',
 'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
 'tog-norollbackdiff' => "Omitir la ''diferencia'' después de revertir",
+'tog-useeditwarning' => 'Advertirme cuando abandone una página editada con cambios sin grabar',
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
@@ -471,6 +477,18 @@ $messages = array(
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'dic',
+'january-date' => '$1 de enero',
+'february-date' => '$1 de febrero',
+'march-date' => '$1 de marzo',
+'april-date' => '$1 de abril',
+'may-date' => '$1 de mayo',
+'june-date' => '$1 de junio',
+'july-date' => '$1 de julio',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de septiembre',
+'october-date' => '$1 de octubre',
+'november-date' => '$1 de noviembre',
+'december-date' => '$1 de diciembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoría|Categorías}}',
@@ -659,7 +677,7 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Página',
-'nstab-user' => 'Página de usuario',
+'nstab-user' => 'Página {{GENDER:{{ROOTPAGENAME}}|del usuario|de la usuaria}}',
 'nstab-media' => 'Media',
 'nstab-special' => 'Página especial',
 'nstab-project' => 'Página del proyecto',
@@ -776,9 +794,18 @@ Ten en cuenta que las páginas que tengas abiertas en otras ventanas o pestañas
 'welcomecreation-msg' => 'Tu cuenta ha sido creada.
 No olvides cambiar tus [[Special:Preferences|preferencias de {{SITENAME}} ]].',
 'yourname' => 'Nombre de usuario:',
+'userlogin-yourname' => 'Usuario',
+'userlogin-yourname-ph' => 'Escribe tu nombre de usuario',
 'yourpassword' => 'Contraseña:',
+'userlogin-yourpassword' => 'Contraseña',
+'userlogin-yourpassword-ph' => 'Escribe tu contraseña',
+'createacct-yourpassword-ph' => 'Escribe una contraseña',
 'yourpasswordagain' => 'Confirma la contraseña:',
+'createacct-yourpasswordagain' => 'Confirma la contraseña',
+'createacct-yourpasswordagain-ph' => 'Repite la contraseña',
 'remembermypassword' => 'Mantenerme conectado en este navegador (hasta $1 {{PLURAL:$1|día|días}})',
+'userlogin-remembermypassword' => 'Mantener mi sesión',
+'userlogin-signwithsecure' => 'Usar conexión segura',
 'securelogin-stick-https' => 'Permanecer conectado a HTTPS después de iniciar sesión',
 'yourdomainname' => 'Dominio',
 'password-change-forbidden' => 'No puedes cambiar las contraseñas de este wiki.',
@@ -791,18 +818,38 @@ No olvides cambiar tus [[Special:Preferences|preferencias de {{SITENAME}} ]].',
 'logout' => 'Cerrar sesión',
 'userlogout' => 'Cerrar sesión',
 'notloggedin' => 'No has iniciado sesión',
+'userlogin-noaccount' => '¿No tienes una cuenta?',
+'userlogin-joinproject' => 'Únete a {{SITENAME}}',
 'nologin' => '¿No tienes una cuenta? $1.',
 'nologinlink' => 'Crear una cuenta',
 'createaccount' => 'Crear una cuenta',
 'gotaccount' => '¿Ya tienes una cuenta? $1.',
 'gotaccountlink' => 'Entrar',
 'userlogin-resetlink' => '¿Olvidaste tus datos de acceso?',
+'userlogin-resetpassword-link' => 'Restablecer la contraseña',
+'helplogin-url' => 'Help:Inicio de sesión',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ayuda]]',
+'createacct-join' => 'Introduce tus datos debajo.',
+'createacct-emailrequired' => 'Dirección de correo electrónico',
+'createacct-emailoptional' => 'Dirección de correo electrónico (opcional)',
+'createacct-email-ph' => 'Escribe tu dirección de correo electrónico',
 'createaccountmail' => 'Usar una contraseña aleatoria temporal y enviarla a la siguiente dirección de correo electrónico',
+'createacct-realname' => 'Nombre real (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-benefit-heading' => '{{SITENAME}} lo construye gente como tú.',
+'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.',
 'userexists' => 'El nombre de usuario indicado ya está en uso.
 Por favor escoge un nombre diferente.',
 'loginerror' => 'Error de inicio de sesión',
+'createacct-error' => 'Error al crear la cuenta',
 'createaccounterror' => 'No se pudo crear la cuenta: $1',
 'nocookiesnew' => 'La cuenta de usuario ha sido creada, pero no has iniciado sesión.
 {{SITENAME}} usa <em>cookies</em> para identificar a los usuarios registrados.
@@ -841,8 +888,8 @@ Por favor, identifícate de nuevo tras recibirla.',
 'blocked-mailpassword' => 'Tu dirección IP está bloqueada, y no se te permite el uso de la función de recuperación de contraseñas para prevenir abusos.',
 'eauthentsent' => 'Se ha enviado un correo electrónico de confirmación a la dirección especificada.
 Antes de que se envíe cualquier otro correo a la cuenta tienes que seguir las instrucciones enviadas en el mensaje para así confirmar que la dirección te pertenece.',
-'throttled-mailpassword' => 'Ya se ha enviado un recordatorio de password en {{PLURAL:$1|la última hora|las últimas $1 horas}}.
-Para evitar los abusos, solo se enviará un recordatorio de password cada {{PLURAL:$1|hora|$1 horas}}.',
+'throttled-mailpassword' => 'Ya se ha enviado un recordatorio de contraseña en {{PLURAL:$1|la última hora|las últimas $1 horas}}.
+Para evitar los abusos, solo se enviará un recordatorio de contraseña cada {{PLURAL:$1|hora|$1 horas}}.',
 'mailerror' => 'Error al enviar correo: $1',
 'acct_creation_throttle_hit' => 'Los visitantes a este wiki usando tu dirección IP han creado {{PLURAL:$1|una cuenta|$1 cuentas}} en el último día, lo cual es lo máximo permitido en este periodo de tiempo.
 Como resultado, los visitantes usando esta dirección IP no pueden crear más cuentas en este momento.',
@@ -892,28 +939,27 @@ Iniciando sesión...',
 'resetpass-wrong-oldpass' => 'La contraseña antigua no es correcta.
 Puede que ya hayas cambiado la contraseña o que hayas pedido una temporal.',
 'resetpass-temp-password' => 'Contraseña temporal:',
+'resetpass-abort-generic' => 'Una extensión ha cancelado el cambio de la contraseña.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restablecimiento de contraseña',
-'passwordreset-text' => 'Completa este formulario para recibir un recordatorio por correo electrónico de los detalles de tu cuenta.',
 'passwordreset-legend' => 'Restablecer contraseña',
 'passwordreset-disabled' => 'Se ha desactivado el restablecimiento de contraseñas en este wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduce uno de los elementos de datos siguientes}}',
+'passwordreset-emaildisabled' => 'Las funciones de correo electrónico han sido desactivadas en esta wiki.',
 'passwordreset-username' => 'Nombre de usuario:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => '¿Ver el mensaje resultante?',
 'passwordreset-capture-help' => 'Si marcas esta casilla, se te mostrará el correo electrónico (con la contraseña temporal) además de enviarse al usuario.',
 'passwordreset-email' => 'Dirección de correo electrónico:',
 'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Alguien (probablemente tú, desde la dirección IP $1) pidió un recordatorio de tus
-datos de cuenta para {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}
+'passwordreset-emailtext-ip' => 'Alguien (probablemente tú, desde la dirección IP $1) ha solicitado la renovación de tu clave para {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}
 con esta dirección de correo electrónico:
 
 $2
 
-{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} expirarán en {{PLURAL:$5|un día|$5 días}}.
-Deberías iniciar sesión y establecer una contraseña nueva ahora. Si alguien más hizo este pedido,
-o recuerdas tu contraseña original, y no deseas cambiarla, puedes
+{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.
+Deberías iniciar sesión y establecer una contraseña nueva ahora. Si otra persona ha realizado este solicitud
+o si recuerdas tu contraseña original y no deseas cambiarla, puedes
 ignorar este mensaje y continuar usando tu contraseña anterior.',
 'passwordreset-emailtext-user' => 'El usuario $1 en {{SITENAME}} pidió un recordatorio de tus datos de cuenta para {{SITENAME}}
 ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} con esta dirección de correo electrónico:
@@ -926,9 +972,9 @@ o recuerdas tu contraseña original, y no deseas cambiarla, puedes
 ignorar este mensaje y continuar usando tu contraseña anterior.',
 'passwordreset-emailelement' => 'Nombre de usuario: $1
 Contraseña temporal: $2',
-'passwordreset-emailsent' => 'Se ha enviado un correo electrónico de recordatorio.',
-'passwordreset-emailsent-capture' => 'Un recordatorio por correo electrónico ha sido enviado, que se muestra a continuación.',
-'passwordreset-emailerror-capture' => 'Un recordatorio por correo electrónico fue generado, que se muestra a continuación, pero el envío al usuario falló: $1',
+'passwordreset-emailsent' => 'Se ha enviado 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 generó un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero el envío {{GENDER:$2|al usuario|a la usuaria}} falló. $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Cambiar la dirección de correo electrónico',
@@ -1137,12 +1183,15 @@ No se aportaron explicaciones.',
 Parece que ha sido borrada.',
 'edit-conflict' => 'Conflicto de edición.',
 'edit-no-change' => 'Se ignoró tu revisión, porque no se hizo ningún cambio al texto.',
+'postedit-confirmation' => 'Se ha guardado tu edición.',
 'edit-already-exists' => 'No se pudo crear una página nueva.
 Ya existe.',
 'defaultmessagetext' => 'Texto de mensaje predeterminado',
 'content-failed-to-parse' => 'No se pudo analizar el contenido $2 del modelo $1: $3',
 'invalid-content-data' => 'Datos de contenido inválidos',
 'content-not-allowed-here' => 'El contenido "$1" no está permitido en la página [[$2]]',
+'editwarning-warning' => 'Si abandonas esta página perderás tus cambios.
+Si estás identificado, puedes deshabilitar esta advertencia en la sección "Edición" de tus preferencias.',
 
 # Content models
 'content-model-wikitext' => 'texto wiki',
@@ -1428,15 +1477,7 @@ Prueba a usar el prefijo ''all:'' para buscar en todo el contenido (incluyendo p
 'search-external' => 'Búsqueda externa',
 'searchdisabled' => 'Las búsquedas en {{SITENAME}} están temporalmente desactivadas.
 Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índices relativos a {{SITENAME}} pueden estar desactualizados.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Ninguna',
-'qbsettings-fixedleft' => 'Fija a la izquierda',
-'qbsettings-fixedright' => 'Fija a la derecha',
-'qbsettings-floatingleft' => 'Flotante a la izquierda',
-'qbsettings-floatingright' => 'Flotante a la derecha',
-'qbsettings-directionality' => 'Fijos, dependiendo de la direccionalidad de la escritura de su idioma',
+'search-error' => 'Ha ocurrido un error al buscar: $1',
 
 # Preferences page
 'preferences' => 'Preferencias',
@@ -1445,7 +1486,7 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
 'prefsnologin' => 'No has iniciado sesión',
 'prefsnologintext' => 'Necesitas <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} iniciar sesión]</span> para establecer las preferencias del usuario.',
 'changepassword' => 'Cambiar contraseña',
-'prefs-skin' => 'Skin',
+'prefs-skin' => 'Apariencia',
 'skin-preview' => 'Previsualizar',
 'datedefault' => 'Sin preferencia',
 'prefs-beta' => 'Características de prueba',
@@ -1578,6 +1619,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'userrights-notallowed' => 'Tu cuenta no tiene permiso para añadir o retirar permisos de usuario.',
 'userrights-changeable-col' => 'Grupos que puedes cambiar',
 'userrights-unchangeable-col' => 'Grupos que no puedes cambiar',
+'userrights-conflict' => 'Hay un conflicto de permisos de usuario. Aplica tus cambios de nuevo.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1988,7 +2030,6 @@ Para óptima seguridad, img_auth.php está desactivado.',
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'La solicitud HTTP ha expirado.',
 'http-curl-error' => 'Error al recuperar el URL: $1',
-'http-host-unreachable' => 'No fue posible acceder a la URL.',
 'http-bad-status' => 'Ha habido un problema durante la solicitud HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2146,6 +2187,10 @@ Entrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.',
 En lugar de ello deberían enlazar a una página más apropiada.<br />
 Una página es considerada página de desambiguación si utiliza la plantilla que está enlazada desde [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Páginas con una propiedad de página',
+'pageswithprop-legend' => 'Páginas con una propiedad de página',
+'pageswithprop-text' => 'Esta página muestra las páginas que usan la propiedad de una página en particular',
+'pageswithprop-prop' => 'Nombre de la propiedad',
 'pageswithprop-submit' => 'Ir',
 
 'doubleredirects' => 'Redirecciones dobles',
@@ -2395,8 +2440,8 @@ La dirección de correo electrónico que indicaste en [[Special:Preferences|tus
 'notvisiblerev' => 'La última revisión de un usuario diferente ha sido borrada',
 'watchnochange' => 'Ninguno de los artículos de tu lista de seguimiento fue editado en el periodo de tiempo mostrado.',
 'watchlist-details' => '{{PLURAL:$1|$1 página|$1 páginas}} en su lista de seguimiento, sin contar las de discusión.',
-'wlheader-enotif' => '* La notificación por correo electrónico está activada.',
-'wlheader-showupdated' => "* Las páginas modificadas desde su última visita aparecen en '''negrita'''",
+'wlheader-enotif' => 'La notificación por correo está activada.',
+'wlheader-showupdated' => "Las páginas modificadas desde su última visita aparecen en '''negrita'''.",
 'watchmethod-recent' => 'revisando cambios recientes en páginas vigiladas',
 'watchmethod-list' => 'revisando las páginas vigiladas en busca de cambios recientes',
 'watchlistcontains' => 'Tu lista de seguimiento posee $1 {{PLURAL:$1|página|páginas}}.',
@@ -2623,7 +2668,7 @@ Puede que ya haya sido restaurado.',
 'undelete-error-long' => 'Se encontraron errores mientras se restauraba el archivo:
 
 $1',
-'undelete-show-file-confirm' => '¿Estás seguro que quieres ver una revisión borrada del archivo «<nowiki>$1</nowiki>» del $2 a las $3?',
+'undelete-show-file-confirm' => '¿Estás seguro de que quieres ver una revisión borrada del archivo «<nowiki>$1</nowiki>» del $2 a las $3?',
 'undelete-show-file-submit' => 'Sí',
 
 # Namespace form on various pages
@@ -2740,7 +2785,7 @@ Véase la [[Special:BlockList|lista de bloqueos]] para revisarlo.',
 'blocklist-tempblocks' => 'Ocultar bloqueos temporales',
 'blocklist-addressblocks' => 'Ocultar bloqueos de una sola dirección IP',
 'blocklist-rangeblocks' => 'Ocultar bloqueos de rango',
-'blocklist-timestamp' => 'Marca de tiempo',
+'blocklist-timestamp' => 'Fecha y hora',
 'blocklist-target' => 'Destino',
 'blocklist-expiry' => 'Caduca',
 'blocklist-by' => 'Administrador bloqueante',
@@ -2800,6 +2845,7 @@ Sin embargo, está bloqueada como parte del rango $2, que puede ser desbloqueado
 'proxyblocksuccess' => 'Hecho.',
 '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',
 'cant-block-while-blocked' => 'No puedes bloquear a otros usuarios mientras estás bloquead{{GENDER:|o|a}}.',
 'cant-see-hidden-user' => 'El usuario que está intentando bloquear ya ha sido bloqueado y oculto. Puesto que usted no tiene el derecho hideuser, usted no puede ver o editar los bloqueos del usuario.',
 'ipbblocked' => 'No puedes bloquear o desbloquear a otros usuarios porque estás bloqueado',
@@ -3112,18 +3158,12 @@ Permite añadir una razón al resumen de edición.',
 'tooltip-summary' => 'Introduce un breve resumen',
 
 # Stylesheets
-'common.css' => '/* El CSS colocado en esta página sera aplicado a todas las pieles (skins) */',
-'standard.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Standard" */',
-'nostalgia.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Nostalgia" */',
+'common.css' => '/* El CSS colocado en esta página será aplicado a todas las apariencias */',
 'cologneblue.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Cologne Blue" */',
 'monobook.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "MonoBook" */',
-'myskin.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "MySkin" */',
-'chick.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel ""Chick" */',
-'simple.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Simple" */',
 'modern.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Modern" */',
 'vector.css' => '/* El CSS colocado en esta página afectará a los usuarios que usen la piel "Vector" */',
 'print.css' => '/* Los estilos CSS colocados aquí afectarán la impresión */',
-'handheld.css' => '/* Los estilos CSS colocados aquí afectarán a los dispositivos móviles basados en las pieles configuradas en $wgHandheldStyle */',
 'noscript.css' => '/* Los estilos CSS colocados aquí se aplicarán a los usuarios que hayan desactivado el JavaScript en su navegador */',
 'group-autoconfirmed.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Usuarios autoconfirmados */',
 'group-bot.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Bots */',
@@ -3132,13 +3172,8 @@ Permite añadir una razón al resumen de edición.',
 
 # Scripts
 'common.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */',
-'standard.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Estandar */',
-'nostalgia.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Nostalgia. */',
 'cologneblue.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Colonia azul */',
 'monobook.js' => '/* El código JavaScript que se ponga aquí será cargado por los usuarios de la piel MonoBook */',
-'myskin.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Mi piel */',
-'chick.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Pollito */',
-'simple.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Simple */',
 'modern.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Moderna */',
 'vector.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Vector */',
 'group-autoconfirmed.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */',
@@ -3219,13 +3254,8 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'pageinfo-category-files' => 'Número de archivos',
 
 # Skin names
-'skinname-standard' => 'Estándar',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Colonia azul',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mi piel',
-'skinname-chick' => 'Pollito',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Moderna',
 'skinname-vector' => 'Vector',
 
@@ -3309,11 +3339,25 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
 'minutes' => '{{PLURAL:$1|un minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|una hora|$1 horas}}',
 'days' => '{{PLURAL:$1|un día|$1 días}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
 'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 año|$1 años}}',
 'ago' => 'hace $1',
 'just-now' => 'Ahora mismo',
 
+# Human-readable timestamps
+'hours-ago' => 'hace $1 {{PLURAL:$1|hora|horas}}',
+'minutes-ago' => 'hace {{PLURAL:$1|un minuto|$1 minutos}}',
+'seconds-ago' => 'hace $1 {{PLURAL:$1|segundo|segundos}}',
+'monday-at' => 'El lunes a las $1',
+'tuesday-at' => 'El martes a las $1',
+'wednesday-at' => 'El miércoles a las $1',
+'thursday-at' => 'El jueves a las $1',
+'friday-at' => 'El viernes a las $1',
+'saturday-at' => 'El sábado a las $1',
+'sunday-at' => 'El domingo a las $1',
+'yesterday-at' => 'Ayer a las $1',
+
 # Bad image list
 'bad_image_list' => 'El formato es el siguiente:
 
@@ -3342,7 +3386,7 @@ Existen otros campos que se mantendrán ocultos por defecto.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Anchura',
 'exif-imagelength' => 'Altura',
 'exif-bitspersample' => 'Bits por componente',
@@ -3520,7 +3564,7 @@ Existen otros campos que se mantendrán ocultos por defecto.
 'exif-originalimageheight' => 'Altura de la imagen antes de que fuera recortada',
 'exif-originalimagewidth' => 'Ancho de la imagen antes de que fuera recortada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sin comprimir',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'Codificación de fax CCITT grupo 3',
@@ -3904,7 +3948,7 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
 'version-parserhooks' => 'Extensiones del analizador sintáctico',
 'version-variables' => 'Variables',
 'version-antispam' => 'Prevención de spam',
-'version-skins' => 'Pieles',
+'version-skins' => 'Apariencias',
 'version-other' => 'Otro',
 'version-mediahandlers' => 'Manejadores multimedia',
 'version-hooks' => 'Extensiones',
@@ -3918,11 +3962,11 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
 'version-poweredby-credits' => "Este wiki funciona gracias a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otros',
 'version-credits-summary' => 'Queremos reconocer a las siguientes personas por su contribución a [[Special:Version|MediaWiki]].',
-'version-license-info' => 'MediaWiki es software libre; puedes redistribuírlo y/o modificarlo bajo los términos de la Licencia General Pública GNU publicada por la Fundación del Software Libre; ya sea la versión 2 de la licencia, o (a tu elección) cualquier versión posterior.
+'version-license-info' => 'MediaWiki es software libre; puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia General Pública de GNU como la publica la Free Software Foundation; ya sea la versión 2 de la licencia, o (a tu elección) cualquier versión posterior.
 
-MediaWiki es distribuído con la esperanza de que será útil, pero SIN NINGUNA GARANTÍA; ni siquiera con la garantía implícita de COMERCIALIZACIÓN ó ADAPTACIÓN A UN PROPÓSITO PARTICULAR. Véase la Licencia Pública General GNU para mayores detalles.
+MediaWiki se distribuye con la esperanza de que será útil, pero SIN NINGUNA GARANTÍA; sin siquiera con la garantía implícita de COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulta la Licencia Pública General de GNU para más detalles.
 
-Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública General GNU] junto a este programa; si no es así, escríbale a la Fundación del Software Libre, Inc., Calle Franklin 51, Quinto Piso, Boston, MA 02110-1301, EE.UU. ó [//www.gnu.org/licenses/old-licenses/gpl-2.0.html léela en línea].',
+Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública General de GNU] junto a este programa; si no es así, escríbele a la Free Software Foundation, Inc., Calle Franklin 51, quinto piso, Boston, MA 02110-1301, EE. UU. o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html léela en línea].',
 'version-software' => 'Software instalado',
 'version-software-product' => 'Producto',
 'version-software-version' => 'Versión',
@@ -3932,12 +3976,17 @@ Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta del artículo]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]',
 
-# Special:FilePath
-'filepath' => 'Ruta de archivo',
-'filepath-page' => 'Archivo:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página devuelve la ruta completa de un archivo.
-Las imágenes se muestran en resolución máxima, otros tipos de archivo se inician directamente con su programa asociado.',
+# Special:Redirect
+'redirect' => 'Redirigir por archivo, usuario o ID de revisión',
+'redirect-legend' => 'Redirigir a un archivo o página',
+'redirect-summary' => 'Esta página especial redirige a un fichero (dado un nombre de fichero), a una página (dado un identificador de revisión) o a una página de usuario (dado en identificador numérico de usuario).',
+'redirect-submit' => 'Ir',
+'redirect-lookup' => 'Buscar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID del usuario',
+'redirect-revision' => 'Revisión de página',
+'redirect-file' => 'Nombre de fichero',
+'redirect-not-exists' => 'No se encontró el valor',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Búsqueda de archivos duplicados',
@@ -4029,23 +4078,26 @@ Este sitio está experimentando dificultades técnicas.',
 'htmlform-submit' => 'Enviar',
 'htmlform-reset' => 'Deshacer cambios',
 'htmlform-selectorother-other' => 'Otro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sí',
+'htmlform-chosen-placeholder' => 'Selecciona una opción',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con soporte para búsqueda de texto completo',
 'sqlite-no-fts' => '$1 sin soporte para búsqueda de texto completo',
 
 # New logging system
-'logentry-delete-delete' => '$1 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 modificó la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
+'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 modificó la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-delete-event-legacy' => '$1 modificó la visibilidad de los eventos del registro en $3',
-'logentry-delete-revision-legacy' => '$1 modificó la visibilidad de las ediciones en la página $3',
-'logentry-suppress-delete' => '$1 borró (restricciones para administradores aplicadas) la página $3',
+'logentry-delete-revision-legacy' => '$1 modificó la visibilidad de varias ediciones 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 modificó secretamente la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
 'logentry-suppress-revision' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-suppress-event-legacy' => '$1 modificó secretamente la visibilidad de los eventos del registro en $3',
-'logentry-suppress-revision-legacy' => '$1 modificó secretamente la visibilidad de las ediciones en la página $3',
+'logentry-suppress-revision-legacy' => '$1 modificó secretamente la visibilidad de varias ediciones 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',
@@ -4057,17 +4109,17 @@ Este sitio está experimentando dificultades técnicas.',
 'logentry-move-move' => '$1 movió la página $3 a $4',
 'logentry-move-move-noredirect' => '$1 movió la página $3 a $4 sin dejar una redirección',
 'logentry-move-move_redir' => '$1 movió la página $3 a $4 sobre una redirección',
-'logentry-move-move_redir-noredirect' => '$1 movió la página $3 a $4 sobre una redirección, sin dejar redirección',
-'logentry-patrol-patrol' => '$1 marcó la edición $4 de la página $3 como patrullada',
+'logentry-move-move_redir-noredirect' => '$1 movió la página $3 a $4 sobre una redirección y sin dejar una redirección',
+'logentry-patrol-patrol' => '$1 marcó como patrullada la edición $4 de la página $3',
 'logentry-patrol-patrol-auto' => '$1 marcó automáticamente la edición $4 de la página $3 como patrullada',
-'logentry-newusers-newusers' => 'Se ha creado la cuenta de usuario $1',
-'logentry-newusers-create' => 'Se ha creado la cuenta de usuario $1',
-'logentry-newusers-create2' => '$1 ha creado la cuenta de usuario $3',
-'logentry-newusers-byemail' => '$1 creó la cuenta de usuario $3 y la contraseña se envió por correo electrónico',
+'logentry-newusers-newusers' => 'La cuenta de usuario $1 ha sido {{GENDER:$2|creada}}',
+'logentry-newusers-create' => 'La cuenta de usuario $1 ha sido creada',
+'logentry-newusers-create2' => 'La cuenta de usuario $3 ha sido creada por $1',
+'logentry-newusers-byemail' => 'la cuenta de usuario $3 ha sido creada por $1 y la contraseña ha sido enviada por correo',
 'logentry-newusers-autocreate' => 'La cuenta $1 fue creada automáticamente',
 'logentry-rights-rights' => '$1 modificó los grupos a los que pertenece $3: de $4 a $5',
-'logentry-rights-rights-legacy' => '$1 ha cambiado la pertenencia a grupos de $3',
-'logentry-rights-autopromote' => '$1 fue promocionado automáticamente de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 modificó los grupos a los que pertenece $3',
+'logentry-rights-autopromote' => '$1 ha sido {{GENDER:$2|promocionado|promocionada}} automáticamente de $4 a $5',
 'rightsnone' => '(ninguno)',
 
 # Feedback
@@ -4144,4 +4196,7 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'duration-centuries' => '$1 {{PLURAL:$1|siglo|siglos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
 
+# Image rotation
+'rotate-comment' => 'Imagen girada por $1 {{PLURAL:$1|grado|grados}} en el sentido de las agujas del reloj',
+
 );
index aadb5b5..9e98e47 100644 (file)
@@ -18,6 +18,7 @@
  * @author Ker
  * @author Kyng
  * @author Morel
+ * @author Nemo bis
  * @author Oop
  * @author Pikne
  * @author Silvar
@@ -320,8 +321,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Näita jälgivate kasutajate hulka',
 'tog-oldsig' => 'Praegune allkiri:',
 'tog-fancysig' => 'Kasuta vikiteksti vormingus allkirja (ilma automaatse lingita kasutajalehele)',
-'tog-externaleditor' => 'Kasuta vaikimisi välist redaktorit (ainult asjatundjatele, tarvis arvuti eriseadistust – [//www.mediawiki.org/wiki/Manual:External_editors lisateave])',
-'tog-externaldiff' => 'Kasuta vaikimisi välist võrdlusvahendit (ainult asjatundjatele, tarvis arvuti eriseadistust – [//www.mediawiki.org/wiki/Manual:External_editors lisateave])',
 'tog-showjumplinks' => 'Kuva lehekülje ülaservas "mine"-lingid',
 'tog-uselivepreview' => 'Kasuta elavat eelvaadet (vaja JavaScripti) (katseline)',
 'tog-forceeditsummary' => 'Nõua redigeerimisel resümee välja täitmist',
@@ -335,6 +334,7 @@ $messages = array(
 'tog-diffonly' => 'Ära näita erinevuste vaate all lehe sisu',
 'tog-showhiddencats' => 'Näita peidetud kategooriaid',
 'tog-norollbackdiff' => 'Ära näita erinevusi pärast tühistamist',
+'tog-useeditwarning' => 'Hoiata mind, kui lahkun redigeerimisleheküljelt muudatusi salvestamata',
 
 'underline-always' => 'Alati',
 'underline-never' => 'Mitte kunagi',
@@ -703,9 +703,18 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ
 'welcomecreation-msg' => 'Sinu konto on loodud.
 Ära unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]].',
 'yourname' => 'Kasutajanimi:',
+'userlogin-yourname' => 'Kasutajanimi',
+'userlogin-yourname-ph' => 'Sisesta oma kasutajanimi',
 'yourpassword' => 'Parool:',
+'userlogin-yourpassword' => 'Parool',
+'userlogin-yourpassword-ph' => 'Sisesta oma parool',
+'createacct-yourpassword-ph' => 'Sisesta parool',
 'yourpasswordagain' => 'Sisesta parool uuesti:',
+'createacct-yourpasswordagain' => 'Parooli kinnitus',
+'createacct-yourpasswordagain-ph' => 'Sisesta uuesti parool',
 'remembermypassword' => 'Jäta parool meelde (kuni $1 {{PLURAL:$1|päevaks|päevaks}})',
+'userlogin-remembermypassword' => 'Jää sisseloginuks',
+'userlogin-signwithsecure' => 'Logi sisse turvaserveri kaudu',
 'securelogin-stick-https' => 'Jätka pärast sisselogimist HTTPS-ühenduse kasutamist',
 'yourdomainname' => 'Sinu domeen:',
 'password-change-forbidden' => 'Selles vikis ei saa paroole muuta.',
@@ -718,18 +727,37 @@ Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võ
 'logout' => 'Logi välja',
 'userlogout' => 'Logi välja',
 'notloggedin' => 'Sisse logimata',
+'userlogin-noaccount' => 'Kas sul pole kontot?',
+'userlogin-joinproject' => 'Ühine projektiga {{SITENAME}}',
 'nologin' => "Sul pole kontot? '''$1'''.",
 'nologinlink' => 'Registreeru siin',
 'createaccount' => 'Loo uus konto',
 'gotaccount' => "Kui sul on juba konto, '''$1'''.",
 'gotaccountlink' => 'logi sisse',
 'userlogin-resetlink' => 'Kas oled unustanud oma sisselogimisandmed?',
+'helplogin-url' => 'Help:Sisselogimine',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Sisselogimisabi]]',
+'createacct-join' => 'Sisesta allapoole oma andmed.',
+'createacct-emailrequired' => 'E-posti aadress',
+'createacct-emailoptional' => 'E-posti aadress (valikuline)',
+'createacct-email-ph' => 'Sisesta oma e-posti aadress',
 'createaccountmail' => 'Kasuta juhuslikku parooli ja saada see allpool määratud e-posti aadressile',
+'createacct-realname' => 'Pärisnimi (valikuline)',
 '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 oma konto',
+'createacct-benefit-heading' => '{{SITENAME}} on sinusuguste inimeste tehtud.',
+'createacct-benefit-body1' => 'muudatust',
+'createacct-benefit-body2' => 'lehekülge',
+'createacct-benefit-body3' => 'hiljutist kaastöölist',
 'badretype' => 'Sisestatud paroolid ei lange kokku.',
 'userexists' => 'Sisestatud kasutajanimi on juba kasutusel.
 Palun valige uus nimi.',
 'loginerror' => 'Viga sisselogimisel',
+'createacct-error' => 'Tõrge konto loomisel',
 'createaccounterror' => 'Kasutajakonto loomine ebaõnnestus: $1',
 'nocookiesnew' => 'Kasutajakonto loodi, aga sa ei ole sisse logitud, sest {{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja logi siis oma vastse kasutajanime ning parooliga sisse.',
 'nocookieslogin' => '{{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja proovi siis uuesti.',
@@ -761,8 +789,8 @@ Pärast parooli saamist logige palun sisse.',
 'blocked-mailpassword' => 'Sinu IP-aadressi jaoks on toimetamine blokeeritud, seetõttu ei saa sa kasutada ka parooli meeldetuletamise funktsiooni.',
 'eauthentsent' => 'Sisestatud e-posti aadressile on saadetud kinnituse e-kiri.
 Enne kui su kontole ükskõik milline muu e-kiri saadetakse, pead sa e-kirjas olevat juhist järgides kinnitama, et konto on tõepoolest sinu.',
-'throttled-mailpassword' => 'Parooli meeldetuletus lähetatud viimase {{PLURAL:$1|tunni|$1 tunni}} jooksul.
-Väärtarvitamise vältimiseks saadetakse {{PLURAL:$1|tunni|$1 tunni}} jooksul ainult üks meeldetuletus.',
+'throttled-mailpassword' => 'Parooli lähtestamise e-kiri saadetud viimase {{PLURAL:$1|tunni|$1 tunni}} jooksul.
+Väärtarvitamise vältimiseks saadetakse {{PLURAL:$1|tunni|$1 tunni}} jooksul ainult üks lähtestamise e-kiri.',
 'mailerror' => 'Viga kirja saatmisel: $1',
 'acct_creation_throttle_hit' => 'Selle viki külastajad, kes kasutavad sinu IP-aadressi, on viimase ööpäeva jooksul loonud {{PLURAL:$1|ühe konto|$1 kontot}}, mis on selles ajavahemikus ülemmääraks.
 Seetõttu ei saa seda IP-aadressi kasutades hetkel rohkem kontosid luua.',
@@ -790,6 +818,7 @@ Palun pea nüüd pisut vahet.',
 # Email sending
 'php-mail-error-unknown' => 'Tundmatu tõrge PHP funktsioonis mail().',
 'user-mail-no-addy' => 'Püüdsid saata e-kirja ilma meiliaadressita.',
+'user-mail-no-body' => 'Püüti saata tühja või ebamõistlikult lühikese sisuosaga e-kirja.',
 
 # Change password dialog
 'resetpass' => 'Parooli muutmine',
@@ -801,7 +830,8 @@ Sisselogimise lõpetamiseks pead siia uue parooli sisestama:',
 'newpassword' => 'Uus parool:',
 'retypenew' => 'Sisesta uus parool uuesti:',
 'resetpass_submit' => 'Sisesta parool ja logi sisse',
-'resetpass_success' => 'Sinu parool on edukalt muudetud! Sisselogimine...',
+'resetpass_success' => 'Sinu parool on edukalt muudetud!
+Sisselogimine...',
 'resetpass_forbidden' => 'Paroole ei saa muuta',
 'resetpass-no-info' => 'Pead olema sisselogitud, et sellele lehele pääseda.',
 'resetpass-submit-loggedin' => 'Muuda parool',
@@ -809,26 +839,26 @@ Sisselogimise lõpetamiseks pead siia uue parooli sisestama:',
 'resetpass-wrong-oldpass' => 'Vigane ajutine või praegune salasõna.
 Võib-olla oled juba edukalt muudnud oma salasõna või taotlenud uut ajutist salasõna.',
 'resetpass-temp-password' => 'Ajutine parool:',
+'resetpass-abort-generic' => 'Tarkvaralisa on paroolimuudatuse abortinud.',
 
 # Special:PasswordReset
 'passwordreset' => 'Parooli lähtestamine',
-'passwordreset-text' => 'Täida see vorm, et saada e-kiri oma konto andmetega.',
 'passwordreset-legend' => 'Parooli lähtestamine',
 'passwordreset-disabled' => 'Selles vikis on paroolide lähtestamine keelatud.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sisesta üks järgmistest andmeüksustest}}',
+'passwordreset-emaildisabled' => 'E-posti funktsioonid on selles vikis keelatud.',
 'passwordreset-username' => 'Kasutajanimi:',
 'passwordreset-domain' => 'Domeen:',
 'passwordreset-capture' => 'Näita lähetatavat e-kirja?',
 'passwordreset-capture-help' => 'Kui valid selle märkeruudu, näidatakse sulle ajutist parooli sisaldavat e-kirja, mis ühtlasi kasutajale saadetakse.',
 'passwordreset-email' => 'E-posti aadress:',
 'passwordreset-emailtitle' => '{{GRAMMAR:genitive|{{SITENAME}}}} konto andmed',
-'passwordreset-emailtext-ip' => 'Keegi, arvatavasti sina ise, IP-aadressilt $1 palus meelde tuletada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) konto üksikasjad. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
+'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}}:
 
 $2
 
 {{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.
 Peaksid 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 meelde tuletada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) konto üksikasjad. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:
+'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}}:
 
 $2
 
@@ -836,9 +866,9 @@ $2
 Peaksid 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
 Ajutine parool: $2',
-'passwordreset-emailsent' => 'Meeldetuletuskiri on saadetud.',
-'passwordreset-emailsent-capture' => 'E-kirjatsi on saadetud allpool näidatav meeldetuletus.',
-'passwordreset-emailerror-capture' => 'Koostati allpool näidatav meeldetuletus, aga selle e-kirjatsi kasutajale saatmine ebaõnnestus: $1',
+'passwordreset-emailsent' => 'Parooli lähtestamise e-kiri on saadetud.',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'E-posti aadressi muutmine',
@@ -870,7 +900,7 @@ Ajutine parool: $2',
 'media_sample' => 'Näidis.ogg',
 'media_tip' => 'Link failile',
 'sig_tip' => 'Sinu allkiri ajatempliga',
-'hr_tip' => 'Horisontaalkriips (kasuta säästlikult)',
+'hr_tip' => 'Rõhtkriips (kasuta liialdamata)',
 
 # Edit pages
 'summary' => 'Resümee:',
@@ -931,7 +961,7 @@ Võimalik, et see teisaldati või kustutati, sellal kui lehekülge vaatasid.',
 'loginreqtitle' => 'Vajalik on sisselogimine',
 'loginreqlink' => 'sisse logima',
 'loginreqpagetext' => 'Lehekülgede vaatamiseks pead $1.',
-'accmailtitle' => 'Parool saadetud.',
+'accmailtitle' => 'Parool saadetud',
 'accmailtext' => "Kasutajale '$1' genereeritud juhuslik parool saadeti aadressile $2.
 
 Seda parooli on võimalik muuta ''[[Special:ChangePassword|parooli muutmise lehel]]'' peale uuele kontole sisse logimist.",
@@ -1049,11 +1079,14 @@ Allpool on esitatud lehekülje kustutamis- ja teisaldamislogi.',
 Tundub, et see on kustutatud.',
 'edit-conflict' => 'Redigeerimiskonflikt.',
 'edit-no-change' => 'Sinu redigeerimist ignoreeriti, sest tekstile ei olnud tehtud muudatusi.',
+'postedit-confirmation' => 'Sinu muudatus on salvestatud.',
 'edit-already-exists' => 'Ei saanud alustada uut lehekülge.
 See on juba olemas.',
 'defaultmessagetext' => 'Sõnumi vaiketekst',
 'invalid-content-data' => 'Vigased sisuandmed',
 'content-not-allowed-here' => 'Lehekülg [[$2]] ei või sisaldada $1.',
+'editwarning-warning' => 'Sellelt leheküljelt lahkumise tõttu võivad tehtud muudatused kaotsi minna.
+Kui oled sisse loginud, saad selle hoiatuse eelistuste alaosas "{{int:prefs-editing}}" keelata.',
 
 # Content models
 'content-model-wikitext' => 'vikiteksti',
@@ -1169,7 +1202,7 @@ Saad seda muudatust vaadata. [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAG
 * Sobimatu isiklik teave
 *: ''kodune aadress ja telefoninumber, sotsiaalhoolekandenumber jne''",
 'revdelete-legend' => 'Nähtavuse piirangute seadmine',
-'revdelete-hide-text' => 'Peida redigeerimise tekst',
+'revdelete-hide-text' => 'Peida redaktsiooni tekst',
 'revdelete-hide-image' => 'Peida faili sisu',
 'revdelete-hide-name' => 'Peida toiming ja sihtmärk',
 'revdelete-hide-comment' => 'Peida resümee',
@@ -1332,15 +1365,6 @@ päringu ees prefiksit ''all:''. Konkreetsest nimeruumist otsimiseks kasuta pref
 Vahepeal saad otsimiseks Google'it kasutada.
 Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võib olla iganenud.",
 
-# Quickbar
-'qbsettings' => 'Kiirriba sätted',
-'qbsettings-none' => 'Ei_ole',
-'qbsettings-fixedleft' => 'Püsivalt_vasakul',
-'qbsettings-fixedright' => 'Püsivalt paremal',
-'qbsettings-floatingleft' => 'Ujuvalt vasakul',
-'qbsettings-floatingright' => 'Ujuvalt paremal',
-'qbsettings-directionality' => 'Fikseeritud, tulenevalt sinu keeles kasutatava kirja suunast',
-
 # Preferences page
 'preferences' => 'Eelistused',
 'mypreferences' => 'Eelistused',
@@ -1463,9 +1487,9 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'email-address-validity-invalid' => 'Sisesta sobiv e-posti aadress.',
 
 # User rights
-'userrights' => 'Kasutaja õiguste muutmine',
+'userrights' => 'Kasutajaõiguste haldus',
 'userrights-lookup-user' => 'Kasutajarühma muutmine',
-'userrights-user-editname' => 'Sisesta kasutajatunnus:',
+'userrights-user-editname' => 'Sisesta kasutajanimi:',
 'editusergroup' => 'Muuda kasutajarühma',
 'editinguser' => "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
 'userrights-editusergroup' => 'Kasutajarühma valik',
@@ -1479,10 +1503,11 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'userrights-reason' => 'Põhjus:',
 'userrights-no-interwiki' => 'Sul ei ole luba muuta kasutajaõigusi teistes vikides.',
 'userrights-nodatabase' => 'Andmebaasi $1 ei ole olemas või pole see kohalik.',
-'userrights-nologin' => 'Kasutaja õiguste muutmiseks, pead sa administraatori õigustega kontoga [[Special:UserLogin|sisse logima]].',
+'userrights-nologin' => 'Et kasutajaõigusi jagada, pead administraatori kontoga [[Special:UserLogin|sisse logima]].',
 'userrights-notallowed' => 'Sinu kontole pole antud luba lisada või eemaldada kasutajaõigusi.',
 'userrights-changeable-col' => 'Rühmad, mida sa saad muuta',
 'userrights-unchangeable-col' => 'Rühmad, mida sa ei saa muuta',
+'userrights-conflict' => 'Kasutajaõiguste konflikt! Palun tee muudatused uuesti.',
 
 # Groups
 'group' => 'Rühm:',
@@ -1510,7 +1535,7 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 
 # Rights
 'right-read' => 'Lugeda lehekülgi',
-'right-edit' => 'Redigeerida lehekülje sisu',
+'right-edit' => 'Redigeerida lehekülgi',
 'right-createpage' => 'Luua lehekülgi (mis pole aruteluleheküljed)',
 'right-createtalk' => 'Luua arutelulehekülgi',
 'right-createaccount' => 'Luua uusi kasutajakontosid',
@@ -1550,9 +1575,9 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'right-protect' => 'Muuta kaitsetasemeid ja redigeerida kaitstud lehekülgi',
 'right-editprotected' => 'Muuta kaitstud lehekülgi, millel ei ole kaskaadkaitset',
 'right-editinterface' => 'Muuta kasutajaliidest',
-'right-editusercssjs' => 'Redigeerida teiste kasutajate CSS ja JS faile',
-'right-editusercss' => 'Redigeerida teiste kasutajate CSS faile',
-'right-edituserjs' => 'Redigeerida teiste kasutajate JS faile',
+'right-editusercssjs' => 'Redigeerida teiste kasutajate CSS- ja JS-faile',
+'right-editusercss' => 'Redigeerida teiste kasutajate CSS-faile',
+'right-edituserjs' => 'Redigeerida teiste kasutajate JS-faile',
 'right-rollback' => 'Tühistada otsekohe lehekülje viimase redigeerija muudatused',
 'right-markbotedits' => 'Märkida muudatuse tühistamine robotimuudatusena',
 'right-noratelimit' => 'Mööduda toimingumäära limiitidest',
@@ -1575,7 +1600,7 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'newuserlogpagetext' => 'See logi sisaldab infot äsja loodud uute kasutajate kohta.',
 
 # User rights log
-'rightslog' => 'Kasutaja õiguste logi',
+'rightslog' => 'Kasutajaõiguste logi',
 'rightslogtext' => 'See on logi kasutajate õiguste muutuste kohta.',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1628,17 +1653,17 @@ See ei tohi olla pikem kui {{PLURAL:$1|üks märk|$1 märki}}.',
 'rcnote' => "Allpool on esitatud {{PLURAL:$1|'''1''' muudatus|viimased '''$1''' muudatust}} viimase {{PLURAL:$2|päeva|'''$2''' päeva}} jooksul seisuga $4, kell $5.",
 'rcnotefrom' => "Allpool on toodud muudatused alates: '''$2''' (näidatakse kuni '''$1''' muudatust)",
 'rclistfrom' => 'Näita muudatusi alates: $1',
-'rcshowhideminor' => '$1 pisiparandused',
-'rcshowhidebots' => '$1 robotid',
-'rcshowhideliu' => '$1 sisseloginud kasutajad',
-'rcshowhideanons' => '$1 anonüümsed kasutajad',
-'rcshowhidepatr' => '$1 kontrollitud muudatused',
-'rcshowhidemine' => '$1 minu parandused',
+'rcshowhideminor' => 'Pisiparandused ($1)',
+'rcshowhidebots' => 'Robotid ($1)',
+'rcshowhideliu' => 'Sisseloginud kasutajad ($1)',
+'rcshowhideanons' => 'Anonüümsed kasutajad ($1)',
+'rcshowhidepatr' => 'Kontrollitud muudatused ($1)',
+'rcshowhidemine' => 'Minu parandused ($1)',
 'rclinks' => 'Näita viimast $1 muudatust viimase $2 päeva jooksul<br />$3',
 'diff' => 'erin',
 'hist' => 'ajal',
-'hide' => 'Peida',
-'show' => 'Näita',
+'hide' => 'peida',
+'show' => 'näita',
 'minoreditletter' => 'P',
 'newpageletter' => 'U',
 'boteditletter' => 'R',
@@ -1871,7 +1896,6 @@ Turvakaalutlustel on img_auth.php kasutus keelatud.',
 'http-read-error' => 'HTTP-lugemistõrge.',
 'http-timed-out' => 'HTTP-päring aegus.',
 'http-curl-error' => 'Tõrge URL-i $1 lugemisel',
-'http-host-unreachable' => 'Internetiaadress pole kättesaadav.',
 'http-bad-status' => 'HTTP-päringu ajal ilmnes tõrge: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2247,12 +2271,12 @@ Toetatud {{PLURAL:$2|protokoll|protokollid}}: <code>$1</code> (määramata proto
 'email-legend' => 'Saada e-kiri {{GRAMMAR:genitive|{{SITENAME}}}} kasutajale',
 'emailfrom' => 'Kellelt:',
 'emailto' => 'Kellele:',
-'emailsubject' => 'Pealkiri:',
+'emailsubject' => 'Teema:',
 'emailmessage' => 'Sõnum:',
 'emailsend' => 'Saada',
 'emailccme' => 'Saada mulle koopia.',
 'emailccsubject' => 'Koopia sinu sõnumist kasutajale $1: $2',
-'emailsent' => 'E-post saadetud',
+'emailsent' => 'E-kiri saadetud',
 'emailsenttext' => 'Sinu teade on e-kirjaga saadetud.',
 'emailuserfooter' => 'Selle e-kirja saatis $1 {{GRAMMAR:elative|{{SITENAME}}}} kasutajale $2 toimingu "Saada sellele kasutajale e-kiri" abil.',
 
@@ -2281,8 +2305,8 @@ Edasised muudatused sellel leheküljel ja seotud aruteluleheküljel tuuakse ära
 'notvisiblerev' => 'Redaktsioon on kustutatud',
 'watchnochange' => 'Valitud ajavahemiku jooksul pole ühelgi jälgitaval leheküljel muudatusi tehtud.',
 'watchlist-details' => 'Jälgimisloendis on {{PLURAL:$1|$1 lehekülg|$1 lehekülge}} (ei arvestata arutelulehekülgi).',
-'wlheader-enotif' => 'E-posti teel teavitamine on aktiveeritud.',
-'wlheader-showupdated' => "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
+'wlheader-enotif' => 'E-posti teel teavitamine on aktiveeritud.',
+'wlheader-showupdated' => "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
 'watchmethod-recent' => 'jälgitud lehekülgedel tehtud viimaste muudatuste läbivaatamine',
 'watchmethod-list' => 'jälgitavate lehekülgede viimased muudatused',
 'watchlistcontains' => 'Sinu jälgimisloendis on $1 {{PLURAL:$1|lehekülg|lehekülge}}.',
@@ -2357,8 +2381,7 @@ Palun kinnita, et tahad seda tõepoolest teha, et sa mõistad tagajärgi ja et s
 'actionfailed' => 'Toiming ebaõnnestus',
 'deletedtext' => '"$1" on kustutatud. Kustutatud leheküljed on ära toodud eraldi loendis ($2).',
 'dellogpage' => 'Kustutamislogi',
-'dellogpagetext' => 'Allpool on esitatud nimekiri viimastest kustutamistest.
-Kõik toodud kellaajad järgivad serveriaega.',
+'dellogpagetext' => 'Allpool on viimaste kustutamiste loend.',
 'deletionlog' => 'kustutamislogi',
 'reverted' => 'Pöörduti tagasi varasemale versioonile',
 'deletecomment' => 'Põhjus:',
@@ -2366,7 +2389,7 @@ Kõik toodud kellaajad järgivad serveriaega.',
 'deletereasonotherlist' => 'Muu põhjus',
 'deletereason-dropdown' => '*Harilikud kustutamise põhjused
 ** Autori palve
-** Autoriõiguste rikkumine
+** Autoriõiguse rikkumine
 ** Vandalism',
 'delete-edit-reasonlist' => 'Redigeeri kustutamise põhjuseid',
 'delete-toobig' => 'See lehekülg on pika redigeerimisajalooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.
@@ -2409,6 +2432,8 @@ Mine tagasi eelmisele leheküljele ja taaslaadi see, seejärel proovi uuesti.',
 'prot_1movedto2' => 'Lehekülg "[[$1]]" teisaldatud pealkirja "[[$2]]" alla',
 'protect-badnamespace-title' => 'Kaitstamatu nimeruum',
 'protect-badnamespace-text' => 'Selles nimeruumis olevaid lehekülgi ei saa kaitsta.',
+'protect-norestrictiontypes-text' => 'Seda lehekülge ei saa kaitsta, sest ühtki piirangutüüpi pole saadaval.',
+'protect-norestrictiontypes-title' => 'Kaitstamatu lehekülg',
 'protect-legend' => 'Kaitse kinnitamine',
 'protectcomment' => 'Põhjus:',
 'protectexpiry' => 'Aegub:',
@@ -2543,7 +2568,7 @@ $1',
 'sp-contributions-uploads' => 'üleslaadimised',
 'sp-contributions-logs' => 'logid',
 'sp-contributions-talk' => 'arutelu',
-'sp-contributions-userrights' => 'kasutaja õiguste muutmine',
+'sp-contributions-userrights' => 'kasutajaõiguste muutmine',
 'sp-contributions-blocked-notice' => 'See kasutaja on parajasti blokeeritud. Allpool on toodud kõige hilisem blokeerimislogi sissekanne:',
 'sp-contributions-blocked-notice-anon' => 'See IP-aadress on parajasti blokeeritud.
 Allpool on toodud viimane blokeerimislogi sissekanne:',
@@ -2584,7 +2609,7 @@ Täida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.',
 'ipadressorusername' => 'IP-aadress või kasutajanimi:',
 'ipbexpiry' => 'Kehtivus:',
 'ipbreason' => 'Põhjus:',
-'ipbreasonotherlist' => 'Muul põhjusel',
+'ipbreasonotherlist' => 'Muu põhjusel',
 'ipbreason-dropdown' => '*Tavalised blokeerimise põhjused
 ** Valeandmete lisamine
 ** Lehekülgedelt sisu kustutamine
@@ -2760,7 +2785,7 @@ Neil juhtudel saad lehekülje soovi korral käsitsi teisaldada või liita.",
 'movenotallowedfile' => 'Sul ei ole failide teisaldamise õigust.',
 'cant-move-user-page' => 'Sul ei ole õigust teisaldada kasutajalehti (erandiks on kasutajate alamlehed).',
 'cant-move-to-user-page' => 'Sul ei ole õigust teisaldada lehekülge kasutajaleheks (ei käi kasutaja alamlehe kohta).',
-'newtitle' => 'Uue pealkirja alla',
+'newtitle' => 'Uue pealkirja alla:',
 'move-watch' => 'Jälgi seda lehekülge',
 'movepagebtn' => 'Teisalda lehekülg',
 'pagemovedsub' => 'Lehekülg on teisaldatud',
@@ -3008,7 +3033,6 @@ Samuti võimaldab see resümee reale põhjenduse lisamist.',
 
 # Stylesheets
 'common.css' => '/* Siin olevat CSS-i kasutavad kõik kujundused. */',
-'standard.css' => '/* Siin olev CSS puudutab Standard-kujunduse kasutajaid. */',
 
 # Scripts
 'common.js' => '/* Siinne JavaScript laaditakse igale kasutajatele igal laaditud leheküljel. */',
@@ -3084,13 +3108,8 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
 'pageinfo-category-files' => 'Failide arv',
 
 # Skin names
-'skinname-standard' => 'Algeline',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Kölni sinine',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Minu kujundus',
-'skinname-chick' => 'Tibu',
-'skinname-simple' => 'Lihtne',
 'skinname-modern' => 'Uudne',
 'skinname-vector' => 'Vektor',
 
@@ -3153,7 +3172,7 @@ Selle avamine võib su arvutit kahjustada.",
 'file-no-thumb-animation-gif' => "'''Märkus: Tehniliste piirangute tõttu on nii suure eraldusega GIF-piltide pisipildid animeerimata.'''",
 
 # Special:NewFiles
-'newimages' => 'Uute meediafailide galerii',
+'newimages' => 'Uute failide galerii',
 'imagelisttext' => "
 Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.",
 'newimages-summary' => 'Sellel erilehel on viimati üles laaditud failid.',
@@ -3170,11 +3189,17 @@ Järgnevas loendis, mis on sorteeritud $2, on '''$1''' {{PLURAL:$1|fail|faili}}.
 'minutes' => '{{PLURAL:$1|üks minut|$1 minutit}}',
 'hours' => '{{PLURAL:$1|üks tund|$1 tundi}}',
 'days' => '{{PLURAL:$1|üks 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}}',
 'ago' => '$1 tagasi',
 'just-now' => 'just nüüd',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|tund|tundi}} tagasi',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minutit}} tagasi',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekundit}} tagasi',
+
 # Bad image list
 'bad_image_list' => 'Arvesse võetakse ainult nimekirja ühikud (read, mis algavad sümboliga *).
 Esimene link real peab olema link kõlbmatule failile.
@@ -3208,7 +3233,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Laius',
 'exif-imagelength' => 'Kõrgus',
 'exif-bitspersample' => 'Bitti komponendi kohta',
@@ -3235,7 +3260,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-model' => 'Kaamera mudel',
 'exif-software' => 'Kasutatud tarkvara',
 'exif-artist' => 'Autor',
-'exif-copyright' => 'Autoriõiguste omanik',
+'exif-copyright' => 'Autoriõiguse omanik',
 'exif-exifversion' => 'Exif-versioon',
 'exif-flashpixversion' => 'Toetatud Flashpixi versioon',
 'exif-colorspace' => 'Värviruum',
@@ -3282,13 +3307,13 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-saturation' => 'Küllastus',
 'exif-sharpness' => 'Teravus',
 'exif-devicesettingdescription' => 'Seadme seadistuste kirjeldus',
-'exif-imageuniqueid' => 'Üksiku pildi ID',
+'exif-imageuniqueid' => 'Pildi ainuline identifikaator',
 'exif-gpsversionid' => 'GPS-tähise versioon',
 'exif-gpslatituderef' => 'Põhja- või lõunalaius',
 'exif-gpslatitude' => 'Laius',
 'exif-gpslongituderef' => 'Ida- või läänepikkus',
 'exif-gpslongitude' => 'Pikkus',
-'exif-gpsaltituderef' => 'Viide kõrgusele merepinnast',
+'exif-gpsaltituderef' => 'Kõrgusreferents',
 'exif-gpsaltitude' => 'Kõrgus merepinnast',
 'exif-gpstimestamp' => 'GPS aeg (aatomikell)',
 'exif-gpssatellites' => 'Mõõtmiseks kasutatud satelliidid',
@@ -3368,7 +3393,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-originalimageheight' => 'Pildi kõrgus enne kärpimist',
 'exif-originalimagewidth' => 'Pildi laius enne kärpimist',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Pakkimata',
 
 'exif-copyrighted-true' => 'Kaitstud',
@@ -3735,11 +3760,11 @@ Sa võid [[Special:EditWatchlist|kasutada ka harilikku tekstiredaktorit]].',
 'version-skins' => 'Kujundused',
 'version-other' => 'Muu',
 'version-mediahandlers' => 'Meediatöötlejad',
-'version-hooks' => 'Redaktsioon',
+'version-hooks' => 'Haagid',
 'version-extension-functions' => 'Lisafunktsioonid',
 'version-parser-extensiontags' => 'Parseri lisamärgendid',
 'version-parser-function-hooks' => 'Parserifunktsioonid',
-'version-hook-name' => 'Redaktsiooni nimi',
+'version-hook-name' => 'Haagi nimi',
 'version-hook-subscribedby' => 'Tellijad',
 'version-version' => '(Versioon $1)',
 'version-license' => 'Litsents',
@@ -3758,12 +3783,17 @@ GNU Üldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks
 'version-entrypoints-header-entrypoint' => 'Sisendpunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Failitee',
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Mine',
-'filepath-summary' => 'See erileht määrab otsitava failini viiva tee.
-Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva programmiga.',
+# Special:Redirect
+'redirect' => 'Ümbersuunamine faili, kasutaja või redaktsiooni identifikaatori järgi',
+'redirect-legend' => 'Ümbersuunamine faili juurde või leheküljele',
+'redirect-summary' => 'See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni identifikaator) või kasutajalehekülje (toodud numbriline kasutaja identfikaator) juurde.',
+'redirect-submit' => 'Mine',
+'redirect-lookup' => 'Leia:',
+'redirect-value' => 'Väärtus:',
+'redirect-user' => 'Kasutaja identifikaator',
+'redirect-revision' => 'Lehekülje redaktsioon',
+'redirect-file' => 'Failinimi',
+'redirect-not-exists' => 'Väärtust ei leitud',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Faili duplikaatide otsimine',
@@ -3854,23 +3884,26 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
 'htmlform-submit' => 'Saada',
 'htmlform-reset' => 'Tühista muudatused',
 'htmlform-selectorother-other' => 'Muu',
+'htmlform-no' => 'Ei',
+'htmlform-yes' => 'Jah',
+'htmlform-chosen-placeholder' => 'Vali säte',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 koos täistekstiotsingu toega',
 'sqlite-no-fts' => '$1 ilma täistekstiotsingu toeta',
 
 # New logging system
-'logentry-delete-delete' => '$1 kustutas lehekülje $3',
-'logentry-delete-restore' => '$1 taastas lehekülje $3',
-'logentry-delete-event' => '$1 muutis leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
-'logentry-delete-revision' => '$1 muutis leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
-'logentry-delete-event-legacy' => '$1 muutis leheküljel $3 logisündmuste nähtavust',
-'logentry-delete-revision-legacy' => '$1 muutis leheküljel $3 redaktsioonide nähtavust',
-'logentry-suppress-delete' => '$1 varjas lehekülje $3',
-'logentry-suppress-event' => '$1 muutis salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
-'logentry-suppress-revision' => '$1 muutis salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
-'logentry-suppress-event-legacy' => '$1 muutis salaja leheküljel $3 logisündmuste nähtavust',
-'logentry-suppress-revision-legacy' => '$1 muutis salaja leheküljel $3 redaktsioonide nähtavust',
+'logentry-delete-delete' => '$1 {{GENDER:$2|kustutas}} lehekülje $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|taastas}} lehekülje $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|muutis}} leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|muutis}} leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|muutis}} leheküljel $3 logisündmuste nähtavust',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|muutis}} leheküljel $3 redaktsioonide nähtavust',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|varjas}} lehekülje $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} logisündmuse nähtavust: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 {{PLURAL:$5|ühe|$5}} redaktsiooni nähtavust: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 logisündmuste nähtavust',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|muutis}} salaja leheküljel $3 redaktsioonide nähtavust',
 'revdelete-content-hid' => 'peideti sisu',
 'revdelete-summary-hid' => 'peideti resümee',
 'revdelete-uname-hid' => 'peideti kasutajanimi',
@@ -3879,16 +3912,18 @@ Pilt kuvatakse algupärases suuruses, muu fail avatakse koheselt seostuva progra
 'revdelete-uname-unhid' => 'nähtavaks tehti kasutajanimi',
 'revdelete-restricted' => 'kehtestati piirangud administraatoritele',
 'revdelete-unrestricted' => 'eemaldati administraatoritelt piirangud',
-'logentry-move-move' => '$1 teisaldas lehekülje $3 pealkirja $4 alla',
-'logentry-move-move-noredirect' => '$1 teisaldas lehekülje $3 pealkirja $4 alla ümbersuunamist maha jätmata',
-'logentry-move-move_redir' => '$1 teisaldas lehekülje $3 ümbersuunamise $4 asemele',
-'logentry-move-move_redir-noredirect' => '$1 teisaldas lehekülje $3 ümbersuunamise $4 asemele ümbersuunamist maha jätmata',
-'logentry-patrol-patrol' => '$1 märkis lehekülje $3 redaktsiooni $4 kontrollituks',
-'logentry-patrol-patrol-auto' => '$1 märkis automaatselt lehekülje $3 redaktsiooni $4 kontrollituks',
-'logentry-newusers-newusers' => 'Loodud kasutajakonto $1',
-'logentry-newusers-create' => 'Loodud kasutajakonto $1',
-'logentry-newusers-create2' => '$1 lõi kasutajakonto $3',
-'logentry-newusers-autocreate' => 'Konto $1 loodi automaatselt',
+'logentry-move-move' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla ümbersuunamist maha jätmata',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 ümbersuunamise $4 asemele',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|teisaldas}} lehekülje $3 ümbersuunamise $4 asemele ümbersuunamist maha jätmata',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|märkis}} lehekülje $3 redaktsiooni $4 kontrollituks',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|märkis}} automaatselt lehekülje $3 redaktsiooni $4 kontrollituks',
+'logentry-newusers-newusers' => '{{GENDER:$2|Loodud}} kasutajakonto $1',
+'logentry-newusers-create' => '{{GENDER:$2|Loodud}} kasutajakonto $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|lõi}} kasutajakonto $3',
+'logentry-newusers-autocreate' => 'Konto $1 {{GENDER:$2|loodi}} automaatselt',
+'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',
 'rightsnone' => '(puudub)',
 
 # Feedback
@@ -3954,15 +3989,15 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
 'api-error-verification-error' => 'See fail võib olla rikutud või vale laiendiga.',
 
 # Durations
-'duration-seconds' => '$1 {{PLURAL:$1|sekundi}}',
-'duration-minutes' => '$1 {{PLURAL:$1|minuti}}',
-'duration-hours' => '$1 {{PLURAL:$1|tunni}}',
-'duration-days' => '$1 {{PLURAL:$1|päeva}}',
-'duration-weeks' => '$1 {{PLURAL:$1|nädala}}',
-'duration-years' => '$1 {{PLURAL:$1|aasta}}',
-'duration-decades' => '$1 {{PLURAL:$1|kümnendi}}',
-'duration-centuries' => '$1 {{PLURAL:$1|sajandi}}',
-'duration-millennia' => '$1 {{PLURAL:$1|aastatuhande}}',
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekundit}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minutit}}',
+'duration-hours' => '$1 {{PLURAL:$1|tund|tundi}}',
+'duration-days' => '$1 {{PLURAL:$1|päev|päeva}}',
+'duration-weeks' => '$1 {{PLURAL:$1|nädal|nädalat}}',
+'duration-years' => '$1 {{PLURAL:$1|aasta|aastat}}',
+'duration-decades' => '$1 {{PLURAL:$1|kümnend|kümnendit}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sajand|sajandit}}',
+'duration-millennia' => '$1 {{PLURAL:$1|aastatuhat|aastatuhandet}}',
 
 # Image rotation
 'rotate-comment' => 'Pilti pööratud $1 {{PLURAL:$1|kraad|kraadi}} päripäeva',
index 70329a1..94354cb 100644 (file)
@@ -14,6 +14,7 @@
  * @author Kaustubh
  * @author Kobazulo
  * @author Malafaya
+ * @author Nemo bis
  * @author Reedy
  * @author Theklan
  * @author Unai Fdz. de Betoño
@@ -155,8 +156,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Jarraitzen duen erabiltzaile kopurua erakutsi',
 'tog-oldsig' => 'Egungo sinadura:',
 'tog-fancysig' => 'Sinadura wikitestu gisa tratatu (lotura automatikorik gabe)',
-'tog-externaleditor' => 'Lehenetsi bezala kanpoko editore bat erabili (adituentzako bakarrik, zure ordenagailuak konfigurazio berezia izan behar du. [//www.mediawiki.org/wiki/Manual:External_editors Informazio gehiago.])',
-'tog-externaldiff' => 'Lehenetsi bezala kanpoko diff erreminta erabili (adituentzako bakarrik, zure ordenagailuak konfigurazio berezia izan behar du. [//www.mediawiki.org/wiki/Manual:External_editors Informazio gehiago.])',
 'tog-showjumplinks' => '"Hona jo" irisgarritasun loturak gaitu',
 'tog-uselivepreview' => 'Zuzeneko aurrebista erakutsi (JavaScript) (Proba fasean)',
 'tog-forceeditsummary' => 'Aldaketaren laburpena zuri uzterakoan ohartarazi',
@@ -170,6 +169,7 @@ $messages = array(
 'tog-diffonly' => "''Diff''-ak agertzen direnean, orrialdearen edukiera ezkutatu",
 'tog-showhiddencats' => 'Ikusi kategoria ezkutuak',
 'tog-norollbackdiff' => 'Rollback bat egin ondoren ezberdintasunak ez hartu aintzat',
+'tog-useeditwarning' => 'Abisa nazazu gorde gabeko aldaketak eginez orrialde bat uzten dudanean',
 
 'underline-always' => 'Beti',
 'underline-never' => 'Inoiz ez',
@@ -244,9 +244,9 @@ $messages = array(
 'hidden-category-category' => 'Kategoria ezkutuak',
 'category-subcat-count' => '{{PLURAL:$2|Kategoria honek beste honako azpikategoria baino ez du.|Kategoria honek honako {{PLURAL:$1|azpikategoria du|$1 azpikategoriak ditu}}, guztira dauden $2tik.}}',
 'category-subcat-count-limited' => 'Kategoria honek {{PLURAL:$1|azpikategoria hau du|$1 azpikategoria hauek ditu}}.',
-'category-article-count' => '{{PLURAL:$2|Kategoria honek ondorengo orri hau baino ez du.|Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago|$1 orriak kategoria honetan daude}}. Guztira $2 orri dira kategoria honetan.}}',
+'category-article-count' => '{{PLURAL:$2|Kategoria honek ondorengo orri hau baino ez du.|Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago|$1 orriak kategoria honetan daude}}, eta guztira $2 orri dira kategoria honetan.}}',
 'category-article-count-limited' => 'Ondorengo {{PLURAL:$1|orri hau kategoria honetan dago.|$1 orri hauek kategoria honetan daude.}}',
-'category-file-count' => '{{PLURAL:$2|Kategoria honek ondorengo fitxategi hau baino ez du.|Ondorengo {{PLURAL:$1|fitxategi hau kategoria honetan dago|$1 fitxategiak kategoria honetan daude}}. Guztira $2 fitxategi dira kategoria honetan.}}',
+'category-file-count' => '{{PLURAL:$2|Kategoria honek ondorengo fitxategi hau baino ez du.|Ondorengo {{PLURAL:$1|fitxategi hau kategoria honetan dago|$1 fitxategiak kategoria honetan daude}}, eta guztira $2 fitxategi dira kategoria honetan.}}',
 'category-file-count-limited' => 'Ondorengo {{PLURAL:$1|fitxategia kategoria honetan dago.|$1 fitxategiak kategoria honetan daude.}}',
 'listingcontinuesabbrev' => 'jarr.',
 'index-category' => 'Indexatutako orrialdeak',
@@ -852,6 +852,8 @@ Ez du azalpenik eman.',
 'edit-no-change' => 'Zure edizioa baztertu da testua aldatu ez duzulako.',
 'edit-already-exists' => 'Ezin izan da orri berria sortu.
 Jada existitzen da.',
+'editwarning-warning' => 'Orrialde honetatik irteten bazara, egindako aldaketak galdu egingo dira.
+Saioa hasi baduzu, mezu hau kendu dezakezu zure hobespenen orrialdeko "{{int:prefs-editing}}" atalean.',
 
 # Content models
 'content-model-wikitext' => 'wikitestua',
@@ -971,7 +973,7 @@ Administratzailea zarenez, diff hau ikus dezakezu. Xehetasunak ikusgai daude [{{
 'revdelete-legend' => 'Berrikuspen mugapenak ezarri:',
 'revdelete-hide-text' => 'Berrikuspenaren testua ezkutatu',
 'revdelete-hide-image' => 'Fitxategiaren edukia ezkutatu',
-'revdelete-hide-name' => 'Helburua eta ekintza izkutatu',
+'revdelete-hide-name' => 'Ezkutatu ekintza eta helburua',
 'revdelete-hide-comment' => 'Aldaketaren iruzkina ezkutatu',
 'revdelete-hide-user' => 'Egilearen erabiltzaile izena/IPa ezkutatu',
 'revdelete-hide-restricted' => 'Mugapen hauek administratzaileei zein besteei aplikatu',
@@ -1055,7 +1057,7 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 'difference-multipage' => '(Orrialdeen arteko ezberdintasunak)',
 'lineno' => '$1. lerroa:',
 'compareselectedversions' => 'Hautatutako bertsioak alderatu',
-'showhideselectedversions' => 'Erakutsi/izkutatu aukeratutako berrikuspenak',
+'showhideselectedversions' => 'Erakutsi/ezkutatu aukeratutako berrikuspenak',
 'editundo' => 'desegin',
 'diff-multi' => '({{PLURAL:$1|Ez da tarteko berrikuspen bat|Ez dira tarteko $1 berrikuspen}} erakusten {{PLURAL:$2|lankide batena|$2 lankiderena}}.)',
 
@@ -1122,14 +1124,6 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 'search-external' => 'Kanpo bilaketa',
 'searchdisabled' => '{{SITENAME}}(e)n ezgaituta dago bilaketa. Dena dela, Google erabiliz ere egin dezakezu bilaketa. Kontuan izan bertan dituzten {{SITENAME}}(e)ko emaitzak zaharkituta egon daitezkeela.',
 
-# Quickbar
-'qbsettings' => 'Laster-barra',
-'qbsettings-none' => 'Ezein ere',
-'qbsettings-fixedleft' => 'Eskuinean',
-'qbsettings-fixedright' => 'Ezkerrean',
-'qbsettings-floatingleft' => 'Ezkerrean mugikor',
-'qbsettings-floatingright' => 'Eskubian flotatzen',
-
 # Preferences page
 'preferences' => 'Hobespenak',
 'mypreferences' => 'Hobespenak',
@@ -1582,7 +1576,6 @@ Fitxategien sarbidea baino ez da onartzen.',
 'http-read-error' => 'HTTP irakurketa-akatsa.',
 'http-timed-out' => 'HTTP eskaera iraungi da.',
 'http-curl-error' => 'Errorea URLa bilatzerakoan: $1',
-'http-host-unreachable' => 'Ezin da URL-a atzeman.',
 'http-bad-status' => 'Arazo bat egon da HTTP eskaera bitartean: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1953,8 +1946,8 @@ Jarraipen zerrendatik artikulua kentzeko, artikuluan ''ez jarraitu''ri eman.",
 'notvisiblerev' => 'Berrikusketa desegin da',
 'watchnochange' => 'Hautatutako denbora tartean ez da aldaketarik izan zure jarraipen zerrendako orrialdeetan.',
 'watchlist-details' => '{{PLURAL:$1|Orrialde $1|$1 orrialde}} jarraitzen, eztabaida orrialdeak kontuan hartu gabe.',
-'wlheader-enotif' => 'Posta bidezko ohartarazpena gaituta dago.',
-'wlheader-showupdated' => "Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude",
+'wlheader-enotif' => 'Posta bidezko ohartarazpena gaituta dago.',
+'wlheader-showupdated' => "Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude",
 'watchmethod-recent' => 'Aldaketa berriak aztertzen jarraipen zerrendako orrialdeen bila',
 'watchmethod-list' => 'jarraipen zerrendako orrialdeak aldaketa berrien bila aztertzen',
 'watchlistcontains' => 'Zure jarraipen zerrendak {{PLURAL:$1|orrialde $1 du|$1 orrialde ditu}}.',
@@ -2657,10 +2650,7 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
 'pageinfo-protect-cascading-from' => 'Serieko babesak aktibatuta. Sorburua:',
 
 # Skin names
-'skinname-standard' => 'Lehenetsia',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
-'skinname-simple' => 'Arrunta',
 'skinname-modern' => 'Modernoa',
 
 # Patrolling
@@ -2761,7 +2751,7 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Zabalera',
 'exif-imagelength' => 'Altuera',
 'exif-bitspersample' => 'Bit osagaiko',
@@ -2906,7 +2896,7 @@ Zerrenda elementuak (hasieran * duten lerroak) baino ez dira kontuan hartzen. Le
 'exif-copyrightowner' => 'Copyright-aren jabea',
 'exif-usageterms' => 'Erabilera baldintzak',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Konprimatu gabe',
 'exif-compression-6' => 'JPEG',
 
@@ -3262,13 +3252,6 @@ Halaber [[Special:EditWatchlist|aldatzaile estandarra]] erabil dezakezu.',
 'version-software-version' => 'Bertsioa',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Fitxategi bidea',
-'filepath-page' => 'Fitxategia:',
-'filepath-submit' => 'Joan',
-'filepath-summary' => 'Orri berezi honek fitxategiaren ibilbidea itzultzen du.
-Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutako programarekin hasiko dira zuzenean.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Artxibo bikoiztuen bilaketa',
 'fileduplicatesearch-summary' => 'Bikoiztutako fitxategiak bilatu bere hash balioaren arabera.',
index 61a1b3a..c8ff7ab 100644 (file)
@@ -49,8 +49,6 @@ $messages = array(
 'tog-shownumberswatching' => "Muestral el númeru d'usuárius que la vehilan",
 'tog-oldsig' => 'Firma dessistenti:',
 'tog-fancysig' => 'Tratal la firma cumu testu wiki (sin atiju automáticu)',
-'tog-externaleditor' => 'Gastal eitol esternu pol defeutu (solu pa sabihondus, es mestel una configuración especial nel ordinaol)',
-'tog-externaldiff' => 'Gastal def esternu pol defeutu (solu pa sabihondus, es mestel una configuración especial nel ordinaol)',
 'tog-showjumplinks' => 'Premitil los atihus d\'acesibiliá "sartal a"',
 'tog-uselivepreview' => 'Gastal "live preview" (JavaScript) (en prebas)',
 'tog-forceeditsummary' => 'Avisalmi cuandu nu escreba una síntesis dun chambu',
@@ -797,14 +795,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
 'search-external' => 'Landeu estelnu',
 'searchdisabled' => 'Los landeus en {{SITENAME}} están temporalmenti desativaus. Mentris tantu, pueis landeal meyanti landerus esternus, inque ten en cuenta que los sus éndicis concernientis a {{SITENAME}} puein nu estal atualizaus.',
 
-# Quickbar
-'qbsettings' => 'Preferéncias la "Quickbar"',
-'qbsettings-none' => 'Dengunu',
-'qbsettings-fixedleft' => 'Asiahau a la gocha',
-'qbsettings-fixedright' => 'Asiahau a la derecha',
-'qbsettings-floatingleft' => 'Frotanti ena gocha',
-'qbsettings-floatingright' => 'Frotanti ena derecha',
-
 # Preferences page
 'preferences' => 'Preferéncias',
 'mypreferences' => 'Las mis preferéncias',
@@ -1398,8 +1388,8 @@ Si quieis ehal de vehilal la páhina, pursa sobri \"Ehal de vehilal\".",
 'notvisiblerev' => 'La revisión á siu esborrá',
 'watchnochange' => 'Nu s´eitó denguna e las tus páhinas vehilás nel períu lihiu.',
 'watchlist-details' => '{{PLURAL:$1|$1 artículu|$1 artículus}} vehilaus (sin contal las carabas).',
-'wlheader-enotif' => 'Se premitin notificacionis pol email.',
-'wlheader-showupdated' => "Las páhinas que s'án emburacau dendi la úrtima vezi que las visoreasti son muestrás en '''negrina'''",
+'wlheader-enotif' => 'Se premitin notificacionis pol email.',
+'wlheader-showupdated' => "Las páhinas que s'án emburacau dendi la úrtima vezi que las visoreasti son muestrás en '''negrina'''",
 'watchmethod-recent' => 'comprebandu las úrtimas eicionis en páhinas vehilás',
 'watchmethod-list' => 'Revisandu las páhinas vehilás en cata los úrtimus chambus',
 'watchlistcontains' => 'Ai $1 {{PLURAL:$1|páhina|páhinas}} ena tu lista e seguimientu.',
@@ -2009,7 +1999,7 @@ Cualisquiel otru atihu ena mesma línia se consierará ececión, p.s. páhinas o
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Anchón',
 'exif-imagelength' => 'Artura',
 'exif-bitspersample' => 'Bits pol componenti',
@@ -2093,7 +2083,7 @@ Cualisquiel otru atihu ena mesma línia se consierará ececión, p.s. páhinas o
 'exif-gpsdatestamp' => 'Fecha el GPS',
 'exif-gpsdifferential' => 'Correción diferencial de GPS',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Descomprimiu',
 
 'exif-unknowndate' => 'Fecha andarria',
@@ -2364,13 +2354,6 @@ Pol favol, confirma si rialmenti quieis gorvel a crial la páhina.",
 'version-software-product' => 'Proutu',
 'version-software-version' => 'Velsión',
 
-# Special:FilePath
-'filepath' => "Ruta d'archivu",
-'filepath-page' => 'Archivu:',
-'filepath-submit' => 'Ruta',
-'filepath-summary' => "Esta páhina especial degüervi la ruta compreta dun archivu.
-Las imahin se muestran a resolución compreta; las demas crasis d'archivu s'ehecutan diretamenti con el su pograma asociau.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Landeal archivus dupricaus',
 'fileduplicatesearch-legend' => 'Landeal dupricaus',
index 423d9db..4431246 100644 (file)
@@ -39,6 +39,7 @@
  * @author Zack90
  * @author ZxxZxxZ
  * @author לערי ריינהארט
+ * @author جواد
  * @author محک
  */
 
@@ -74,34 +75,35 @@ $namespaceAliases = array(
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'کاربران_فعال' ),
-       'Allmessages'               => array( 'تÙ\85اÙ\85_Ù¾Û\8cغاÙ\85â\80\8cÙ\87ا' ),
-       'Allpages'                  => array( 'تÙ\85اÙ\85µÙ\81Ø­ه‌ها' ),
-       'Ancientpages'              => array( 'صÙ\81Ø­ه‌های_قدیمی' ),
+       'Allmessages'               => array( 'تمام_پیام‌ها' ),
+       'Allpages'                  => array( 'تÙ\85اÙ\85¨Ø±Ú¯ه‌ها' ),
+       'Ancientpages'              => array( 'برگه‌های_قدیمی' ),
        'Badtitle'                  => array( 'عنوان_بد' ),
-       'Blankpage'                 => array( 'صÙ\81Ø­Ù\87_خالی' ),
+       'Blankpage'                 => array( 'برگÙ\87â\80\8cÛ\8c_خالی' ),
        'Block'                     => array( 'بستن_نشانی_آی‌پی' ),
        'Blockme'                   => array( 'بستن_من' ),
        'Booksources'               => array( 'منابع_کتاب' ),
        'BrokenRedirects'           => array( 'تغییرمسیرهای_خراب' ),
-       'Categories'                => array( 'رده‌ها' ),
+       'Categories'                => array( 'دسته‌ها' ),
        'ChangeEmail'               => array( 'تغییر_رایانامه' ),
        'ChangePassword'            => array( 'از_نو_کردن_گذرواژه' ),
-       'ComparePages'              => array( 'مقایسه_صفحات' ),
-       'Confirmemail'              => array( 'تایید_رایانامه' ),
+       'ComparePages'              => array( 'مقایسه‌ی_برگه‌ها' ),
+       'Confirmemail'              => array( 'پذیرش_رایانامه' ),
        'Contributions'             => array( 'مشارکت‌ها' ),
        'CreateAccount'             => array( 'ایجاد_حساب_کاربری' ),
-       'Deadendpages'              => array( 'صÙ\81Ø­ه‌های_بن‌بست' ),
-       'DeletedContributions'      => array( 'مشارکت‌های_حذف_شده' ),
+       'Deadendpages'              => array( 'برگه‌های_بن‌بست' ),
+       'DeletedContributions'      => array( 'مشارکت‌های_پاک_شده' ),
        'Disambiguations'           => array( 'ابهام‌زدایی' ),
        'DoubleRedirects'           => array( 'تغییرمسیرهای_دوتایی' ),
        'EditWatchlist'             => array( 'ویرایش_فهرست_پی‌گیری‌ها' ),
        'Emailuser'                 => array( 'نامه_به_کاربر' ),
-       'Export'                    => array( 'برÙ\88Ù\86_برÛ\8cµÙ\81Ø­ه' ),
+       'Export'                    => array( 'برÙ\88Ù\86_برÛ\8c¨Ø±Ú¯ه' ),
        'Fewestrevisions'           => array( 'کمترین_نسخه' ),
        'FileDuplicateSearch'       => array( 'جستجوی_پرونده_تکراری' ),
        'Filepath'                  => array( 'مسیر_پرونده' ),
        'Import'                    => array( 'درون_ریزی_صفحه' ),
        'Invalidateemail'           => array( 'باطل_کردن_رایانامه' ),
+       'JavaScriptTest'            => array( 'تست_جاوا_اسکریپت' ),
        'BlockList'                 => array( 'فهرست_بستن_نشانی_آی‌پی' ),
        'LinkSearch'                => array( 'جستجوی_پیوند' ),
        'Listadmins'                => array( 'فهرست_مدیران' ),
@@ -112,60 +114,60 @@ $specialPageAliases = array(
        'Listusers'                 => array( 'فهرست_کاربران' ),
        'Lockdb'                    => array( 'قفل_کردن_پایگاه_داده' ),
        'Log'                       => array( 'سیاهه‌ها' ),
-       'Lonelypages'               => array( 'صÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8c\8cتÛ\8cÙ\85' ),
-       'Longpages'                 => array( 'صÙ\81Ø­ه‌های_بلند' ),
+       'Lonelypages'               => array( 'برگÙ\87â\80\8cÙ\87اÛ\8c_بÛ\8câ\80\8cÙ\86اÙ\85â\80\8cÙ\88Ù\86شاÙ\86' ),
+       'Longpages'                 => array( 'برگه‌های_بلند' ),
        'MergeHistory'              => array( 'ادغام_تاریخچه' ),
        'MIMEsearch'                => array( 'جستجوی_MIME' ),
-       'Mostcategories'            => array( 'بÛ\8cشترÛ\8cÙ\86±Ø¯ه' ),
+       'Mostcategories'            => array( 'بÛ\8cشترÛ\8cÙ\86¯Ø³Øªه' ),
        'Mostimages'                => array( 'بیشترین_تصویر' ),
        'Mostlinked'                => array( 'بیشترین_پیوند' ),
        'Mostlinkedcategories'      => array( 'رده_با_بیشترین_پیوند' ),
        'Mostlinkedtemplates'       => array( 'الگو_با_بیشترین_پیوند' ),
        'Mostrevisions'             => array( 'بیشترین_نسخه' ),
-       'Movepage'                  => array( 'اÙ\86تÙ\82اÙ\84_صÙ\81Ø­ه' ),
+       'Movepage'                  => array( 'جابجاÛ\8cÛ\8c_برگه' ),
        'Mycontributions'           => array( 'مشارکت‌های_من' ),
-       'Mypage'                    => array( 'صÙ\81Ø­Ù\87_من' ),
-       'Mytalk'                    => array( 'بحث_من' ),
+       'Mypage'                    => array( 'برگÙ\87â\80\8cÛ\8c_من' ),
+       'Mytalk'                    => array( 'گفتگوی_من' ),
        'Myuploads'                 => array( 'بارگذاری‌های_من' ),
-       'Newimages'                 => array( 'تصاÙ\88Û\8cر_جدÛ\8cد' ),
-       'Newpages'                  => array( 'صÙ\81Ø­ه‌های_تازه' ),
+       'Newimages'                 => array( 'تصاÙ\88Û\8cر_تازÙ\87' ),
+       'Newpages'                  => array( 'برگه‌های_تازه' ),
        'PasswordReset'             => array( 'بازنشاندن_گذرواژه' ),
        'PermanentLink'             => array( 'پیوند_دائمی' ),
-       'Popularpages'              => array( 'صÙ\81Ø­ه‌های_محبوب' ),
+       'Popularpages'              => array( 'برگه‌های_محبوب' ),
        'Preferences'               => array( 'ترجیحات' ),
        'Prefixindex'               => array( 'نمایه_پیشوندی' ),
-       'Protectedpages'            => array( 'صÙ\81Ø­ه‌های_محافظت_شده' ),
+       'Protectedpages'            => array( 'برگه‌های_محافظت_شده' ),
        'Protectedtitles'           => array( 'عنوان‌های_محافظت_شده' ),
-       'Randompage'                => array( 'صÙ\81Ø­Ù\87_تصادفی' ),
+       'Randompage'                => array( 'برگÙ\87â\80\8cÛ\8c_تصادفی' ),
        'Randomredirect'            => array( 'تغییرمسیر_تصادفی' ),
        'Recentchanges'             => array( 'تغییرات_اخیر' ),
        'Recentchangeslinked'       => array( 'تغییرات_مرتبط' ),
-       'Revisiondelete'            => array( 'حذف_نسخه' ),
+       'Revisiondelete'            => array( 'پاک_کردن_نسخه' ),
        'Search'                    => array( 'جستجو' ),
-       'Shortpages'                => array( 'صÙ\81Ø­ه‌های_کوتاه' ),
-       'Specialpages'              => array( 'صÙ\81Ø­ه‌های_ویژه' ),
+       'Shortpages'                => array( 'برگه‌های_کوتاه' ),
+       'Specialpages'              => array( 'برگه‌های_ویژه' ),
        'Statistics'                => array( 'آمار' ),
        'Tags'                      => array( 'برچسب‌ها' ),
        'Unblock'                   => array( 'باز_کردن' ),
-       'Uncategorizedcategories'   => array( 'رده‌های_رده‌بندی_نشده' ),
+       'Uncategorizedcategories'   => array( 'دسته‌های_رده‌بندی_نشده' ),
        'Uncategorizedimages'       => array( 'تصویرهای_رده‌بندی_‌نشده' ),
        'Uncategorizedpages'        => array( 'صفحه‌های_رده‌بندی_نشده' ),
        'Uncategorizedtemplates'    => array( 'الگوهای_رده‌بندی_نشده' ),
-       'Undelete'                  => array( 'احیای_صفحهٔ_حذف‌شده' ),
+       'Undelete'                  => array( 'احیای_صفحهٔ_پاک‌شده' ),
        'Unlockdb'                  => array( 'باز_کردن_پایگاه_داده' ),
-       'Unusedcategories'          => array( 'رده‌های_استفاده_نشده' ),
+       'Unusedcategories'          => array( 'دسته‌های_استفاده_نشده' ),
        'Unusedimages'              => array( 'تصاویر_استفاده_نشده' ),
        'Unusedtemplates'           => array( 'الگوهای_استفاده_نشده' ),
-       'Unwatchedpages'            => array( 'صÙ\81Ø­ه‌های_پی‌گیری_نشده' ),
+       'Unwatchedpages'            => array( 'دسته‌های_پی‌گیری_نشده' ),
        'Upload'                    => array( 'بارگذاری_پرونده' ),
        'UploadStash'               => array( 'بارگذاری_انبوه' ),
        'Userlogin'                 => array( 'ورود_به_سامانه' ),
        'Userlogout'                => array( 'خروج_از_سامانه' ),
        'Userrights'                => array( 'اختیارات_کاربر' ),
-       'Version'                   => array( 'نسخه' ),
-       'Wantedcategories'          => array( 'رده‌های_مورد_نیاز' ),
+       'Version'                   => array( 'نگارش' ),
+       'Wantedcategories'          => array( 'دسته‌های_مورد_نیاز' ),
        'Wantedfiles'               => array( 'پرونده‌های_مورد_نیاز' ),
-       'Wantedpages'               => array( 'صÙ\81Ø­ه‌های_مورد_نیاز' ),
+       'Wantedpages'               => array( 'برگه‌های_مورد_نیاز' ),
        'Wantedtemplates'           => array( 'الگوهای_مورد_نیاز' ),
        'Watchlist'                 => array( 'فهرست_پی‌گیری' ),
        'Whatlinkshere'             => array( 'پیوند_به_این_صفحه' ),
@@ -458,8 +460,6 @@ $messages = array(
 'tog-shownumberswatching' => 'شمار کاربران پی‌گیری‌کننده نمایش یابد',
 'tog-oldsig' => 'امضای کنونی:',
 'tog-fancysig' => 'امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)',
-'tog-externaleditor' => 'استفاده از ویرایشگر خارجی به‌طور پیش‌فرض (فقط برای کاربران حرفه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
-'tog-externaldiff' => 'استفاده از تفاوت‌گیر (diff) خارجی به‌طور پیش‌فرض (فقط برای کاربران حرفه‌ای؛ نیازمند تنظیمات ویژه در رایانهٔ شما است. [//www.mediawiki.org/wiki/Manual:External_editors اطلاعات بیشتر].)',
 'tog-showjumplinks' => 'پیوندهای دسترسی‌پذیری «پرش به» فعال باشد',
 'tog-uselivepreview' => 'استفاده از پیش‌نمایش زنده (نیازمند جاوااسکریپت) (آزمایشی)',
 'tog-forceeditsummary' => 'هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع داده شود',
@@ -473,7 +473,8 @@ $messages = array(
 'tog-diffonly' => 'محتوای صفحه، زیر تفاوت نمایش داده نشود',
 'tog-showhiddencats' => 'رده‌های پنهان نمایش داده شود',
 'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
-'tog-norollbackdiff' => 'بعد از واگردانی تفاوت نشان داده نشود',
+'tog-norollbackdiff' => 'بعد از واگردانی تفاوت نشان داده شود',
+'tog-useeditwarning' => 'زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود',
 
 'underline-always' => 'همیشه',
 'underline-never' => 'هرگز',
@@ -537,6 +538,18 @@ $messages = array(
 '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 دسامبر',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|رده|رده‌ها}}',
@@ -852,9 +865,18 @@ $2',
 'welcomecreation-msg' => 'حساب کاربری شما ایجاد شده است.
 فراموش نکنید که [[Special:Preferences|ترجیحات {{SITENAME}}]] خود را تغییر دهید.',
 'yourname' => 'نام کاربری:',
+'userlogin-yourname' => 'نام کاربری',
+'userlogin-yourname-ph' => 'نام کاربریتان را وارد کنید',
 'yourpassword' => 'گذرواژه:',
+'userlogin-yourpassword' => 'گذرواژه',
+'userlogin-yourpassword-ph' => 'گذرواژه را وارد کنید',
+'createacct-yourpassword-ph' => 'یک گذرواژه وارد کنید',
 'yourpasswordagain' => 'تکرار گذرواژه:',
+'createacct-yourpasswordagain' => 'گذرواژه را دوباره وارد کنید',
+'createacct-yourpasswordagain-ph' => 'گذرواژه را وارد کنید برای بار دوم',
 'remembermypassword' => 'گذرواژه را (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) در این رایانه به خاطر بسپار',
+'userlogin-remembermypassword' => 'من را واردشده نگه‌دار',
+'userlogin-signwithsecure' => 'از ارتباط امن استفاده کن',
 'securelogin-stick-https' => 'پس از ورود به سامانه به HTTPS متصل بمان',
 'yourdomainname' => 'دامنهٔ شما:',
 'password-change-forbidden' => 'شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید.',
@@ -867,14 +889,32 @@ $2',
 'logout' => 'خروج از سامانه',
 'userlogout' => 'خروج از سامانه',
 'notloggedin' => 'به سامانه وارد نشده‌اید',
+'userlogin-noaccount' => 'آیا حسابی ندارید؟',
+'userlogin-joinproject' => 'به {{SITENAME}} بپیوندید',
 'nologin' => 'حساب کاربری ندارید؟ $1.',
 'nologinlink' => 'یک حساب کاربری جدید بسازید',
 'createaccount' => 'ایجاد حساب کاربری',
 'gotaccount' => 'حساب کاربری دارید؟ $1.',
 'gotaccountlink' => 'به سامانه وارد شوید',
 'userlogin-resetlink' => 'جزئیات ورود را فراموش کرده‌اید؟',
+'userlogin-resetpassword-link' => 'گذرواژه را ریست کن',
+'helplogin-url' => 'Help:ورود به سامانه',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|راهنمای ورود به سامانه]]',
+'createacct-join' => 'اطلاعاتتان را در زیر وارد کنید',
+'createacct-emailrequired' => 'آدرس رایانامه',
+'createacct-emailoptional' => 'آدرس رایانامه (اختیاری)',
+'createacct-email-ph' => 'آدرس رایانامه را وارد کنید',
 'createaccountmail' => 'استفاده از رمز عبور موقت تصادفی و ارسال آن به آدرس ایمیل مشخص شده در زیر',
+'createacct-realname' => 'نام واقعی (اختیاری)',
 'createaccountreason' => 'دلیل:',
+'createacct-reason' => 'دلیل',
+'createacct-reason-ph' => 'چرا شما حساب دیگری می‌سازید؟',
+'createacct-captcha' => 'بررسی امنیتی',
+'createacct-imgcaptcha-ph' => 'متن تصویری که در بالا می‌بینید، وارد کنید',
+'createacct-submit' => 'حسابتان را بسازید',
+'createacct-benefit-heading' => '{{SITENAME}} توسط افرادی مانند شما ساخته شده‌است',
+'createacct-benefit-body1' => '{{PLURAL:$1|ویرایش|ویرایش‌ها}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|صفحه|صفحه‌ها}}',
 'badretype' => 'گذرواژه‌هایی که وارد کرده‌اید یکسان نیستند.',
 'userexists' => 'نام کاربری‌ای که وارد کردید قبلاً استفاده شده‌است.
 لطفاً یک نام دیگر انتخاب کنید.',
@@ -976,10 +1016,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'بازنشانی گذرواژه',
-'passwordreset-text' => 'این فرم را برای دریافت نامهٔ یادآور جزئیات حسابتان کامل کنید.',
 'passwordreset-legend' => 'بازنشانی گذرواژه',
 'passwordreset-disabled' => 'بازنشانی گذرواژه در این ویکی غیرفعال شده است.',
-'passwordreset-pretext' => '{{PLURAL:$1||یکی از قطعه‌های داده را در زیر وارد کنید}}',
 'passwordreset-username' => 'نام کاربری:',
 'passwordreset-domain' => 'دامنه:',
 'passwordreset-capture' => 'رایانامهٔ نهایی نشان داده شود؟',
@@ -1229,6 +1267,8 @@ $2
 'content-failed-to-parse' => 'عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3',
 'invalid-content-data' => 'داده محتوای نامعتبر',
 'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
+'editwarning-warning' => 'خروج از این صفحه ممکن است باعث از دست رفتن هرچه نوشته‌اید شود.
+اگر شما با نام کاربری وارد شده‌اید می‌توانید این هشدار را در بخش «در حال ویرایش» ترجیحاتتان بیابید.',
 
 # Content models
 'content-model-wikitext' => 'ویکی‌متن',
@@ -1514,15 +1554,6 @@ $1",
 موقتاً می‌توانید از جستجوی Google استفاده کنید.
 توجه کنید که نتایج حاصل از جستجو با آن روش ممکن است به‌روز نباشند.',
 
-# Quickbar
-'qbsettings' => 'نوار سریع',
-'qbsettings-none' => 'نباشد',
-'qbsettings-fixedleft' => 'ثابت چپ',
-'qbsettings-fixedright' => 'ثابت راست',
-'qbsettings-floatingleft' => 'شناور چپ',
-'qbsettings-floatingright' => 'شناور راست',
-'qbsettings-directionality' => 'ثابت، بسته به جهت نگارش زبان شما',
-
 # Preferences page
 'preferences' => 'ترجیحات',
 'mypreferences' => 'ترجیحات',
@@ -2078,7 +2109,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'http-read-error' => 'خطای خواندن اچ‌تی‌تی‌پی.',
 'http-timed-out' => 'مهلت درخواست اچ‌تی‌تی‌پی به سر رسید.',
 'http-curl-error' => 'خطا در آوردن نشانی اینترنتی: $1',
-'http-host-unreachable' => 'دسترسی به نشانی اینترنتی ممکن نشد.',
 'http-bad-status' => 'در حین درخواست اچ‌تی‌تی‌پی خطایی رخ داد: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2644,7 +2674,7 @@ $PAGEINTRO $NEWPAGE
 شما می‌توانید سطح محافظت این صفحه را تغییر بدهید اما این کار تاثیری بر محافظت آبشاری صفحه نخواهد گذاشت.',
 'protect-default' => 'همهٔ کاربرها',
 'protect-fallback' => 'فقط به کاربرهایی که دسترسی «$1» دارند، اجازه داده می‌شود',
-'protect-level-autoconfirmed' => 'اجازÙ\87 Ù\81Ù\82Ø· Ø¨Ø±Ø§Û\8c Ø¨Ù\87 Ú©Ø§Ø±Ø¨Ø±Ù\87اÛ\8c تائیدشده',
+'protect-level-autoconfirmed' => 'تÙ\86Ù\87ا Ú©Ø§Ø±Ø¨Ø±Ø§Ù\86 تائیدشده',
 'protect-level-sysop' => 'فقط مدیران',
 'protect-summary-cascade' => 'آبشاری',
 'protect-expiring' => 'زمان سرآمدن $1 (UTC)',
@@ -2750,7 +2780,7 @@ $1',
 'mycontris' => 'مشارکت‌ها',
 'contribsub2' => 'برای $1 ($2)',
 'nocontribs' => 'هیچ تغییری با این مشخصات یافت نشد.',
-'uctop' => ' (بالا)',
+'uctop' => '(بالا)',
 'month' => 'در این ماه (و پیش از آن):',
 'year' => 'در این سال (و پیش از آن):',
 
@@ -3307,13 +3337,8 @@ $1',
 'pageinfo-category-files' => 'تعداد پرونده‌ها',
 
 # Skin names
-'skinname-standard' => 'کلاسیک',
-'skinname-nostalgia' => 'نوستالژی',
 'skinname-cologneblue' => 'آبی کلن',
 'skinname-monobook' => 'مونوبوک',
-'skinname-myskin' => 'پوستهٔ من',
-'skinname-chick' => 'شیک',
-'skinname-simple' => 'ساده',
 'skinname-modern' => 'مدرن',
 'skinname-vector' => 'برداری',
 
@@ -3398,6 +3423,19 @@ $1',
 'ago' => '$1 پیش',
 'just-now' => 'هم‌اکنون',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => 'اطلاعات را باید اینگونه وارد کنید:
 
@@ -3425,7 +3463,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'عرض',
 'exif-imagelength' => 'طول',
 'exif-bitspersample' => 'نقطه در هر جزء',
@@ -3604,7 +3642,7 @@ $1',
 'exif-originalimageheight' => 'بلندی تصویر قبل از برش دادن',
 'exif-originalimagewidth' => 'پهنای تصویر قبل از برش دادن',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'غیرفشرده',
 'exif-compression-2' => 'رمزگذاری سی‌سی‌آی‌تی‌تی گروه ۳ یک بعدی به روش هافمن تغییریافته روی طول',
 'exif-compression-3' => 'رمزگذاری نمابر سی‌سی‌آی‌تی‌تی گروه ۳',
@@ -4083,12 +4121,6 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath مسیر مقاله]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath مسیر اسکریپت]',
 
-# Special:FilePath
-'filepath' => 'مسیر پرونده',
-'filepath-page' => 'پرونده:',
-'filepath-submit' => 'برو',
-'filepath-summary' => 'این صفحهٔ ویژه نشانی کامل برای یک پرونده را نشان می‌دهد. تصاویر با کیفیت وضوح کامل نشان داده می‌شوند، سایر انواع پرونده با برنامه مخصوص به خودشان باز می‌شوند.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'جستجو برای پرونده‌های تکراری',
 'fileduplicatesearch-summary' => 'جستجو برای پرونده‌های تکراری بر اساس مقدار درهم‌شدهٔ آن‌ها صورت می‌گیرد.',
index 45ce3eb..cae4c8d 100644 (file)
@@ -94,15 +94,22 @@ $messages = array(
 'listingcontinuesabbrev' => 'jokku',
 'noindex-category' => 'Kello njoopaaka',
 
-'mytalk' => 'kaldigal am',
+'newwindow' => '(udditata e henorde hesere)',
+'cancel' => 'Haaytu',
+'mytalk' => 'Yeewtere',
 'navigation' => 'Peeragol',
 
+# Cologne Blue skin
+'faq' => 'FAQ',
+
 # Vector skin
 'vector-action-addsection' => 'Ɓeydi toɓɓere',
 'vector-action-move' => 'Dirtin',
+'vector-view-create' => 'Sos',
 'vector-view-edit' => 'Taƴto',
 'vector-view-history' => 'Yiyto aslol',
 'vector-view-view' => 'Tar',
+'vector-view-viewsource' => 'Yiyto ɗaɗol',
 'actions' => 'Baɗe',
 'namespaces' => 'Boowal inɗe',
 'variants' => 'Lomtooɗe',
@@ -254,6 +261,7 @@ So wonaa ɗuum, maataw ko a kawruɗo e buggere e topirde ndee.
 Tiiɗno jaŋto ɗum to [[Special:ListUsers/sysop|jiiloowo]] mbaasaa yejjitde URL jokkol ngol.',
 'badtitle' => 'Tiitoonde moƴƴaani',
 'badtitletext' => 'Tiitoonde ello ɗaɓɓitaango ngoo moƴƴaani, ko mehre, walla ko hakkude-ɗemɗe jokkoraade no feewaani walla tiitoonde hakkude-wiki',
+'viewsource' => 'Yiyto ɗaɗol',
 
 # Login and logout pages
 'yourname' => 'Innde Kuutoro',
@@ -263,13 +271,32 @@ Tiiɗno jaŋto ɗum to [[Special:ListUsers/sysop|jiiloowo]] mbaasaa yejjitde URL
 'nav-login-createaccount' => 'Seŋo / uddit konte',
 'loginprompt' => 'Alaa e sago kurminaa kukiije ngam seŋaade e {{SITENAME}}.',
 'userlogin' => 'Seŋo / uddit konte',
+'userlogout' => 'Seŋto',
 'nologin' => 'A alaa konte tawo? $1.',
 'nologinlink' => 'Uddit konte',
 'mailmypassword' => 'Neldu finnde hesere e iimeel',
 'loginlanguagelabel' => 'Ɗemngal: $1',
 
+# Edit page toolbar
+'bold_sample' => 'Binndol ɓuutol',
+'italic_sample' => 'Binndol italic',
+'italic_tip' => 'Binndol italic',
+'extlink_sample' => 'http://www.yeru.com tiitoonde jokkol',
+'extlink_tip' => 'Jokkol boowbowal (siiftor puɗɗol http://)',
+'headline_sample' => 'Binndol tiitoonde',
+'nowiki_sample' => 'Naatnu binndol ngol mbaydinaaka',
+'nowiki_tip' => 'Faalkiso mbaydingol wiki',
+'image_tip' => 'Fiilde soomtoraande',
+'sig_tip' => 'Ciifol maa kañum e ñalngu',
+'hr_tip' => 'Diidol lelingol (huutoro seeɗa)',
+
 # Edit pages
+'minoredit' => 'Ɗuum ko taƴtol pamarol',
+'watchthis' => 'Rewindo ngoo hello',
+'savearticle' => 'Danndu hello',
 'preview' => 'Yiytindo',
+'showpreview' => 'Hollu jiytol',
+'showdiff' => 'Hollu bayle',
 'newarticle' => '(Kesi)',
 'newarticletext' => 'A rewii e jokkol feewde e hello ngo woodaani tawo.
 Ngam sosde hello ngoo, fuɗɗo tappude e gallol les ngol (Yah to [[{{MediaWiki:Helppage}}|help page]] ngam ɓeydude humpito).',
@@ -284,13 +311,19 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'hiddencategories' => 'Ngoo hello jeyaa ko e {{PLURAL:$1|1 fedde suuɗiinde|$1 pelle cuuɗiiɗe}}:',
 
 # Parser/template warnings
+'post-expand-template-inclusion-warning' => '""Reentino"."" Ɓetol tuugnorde ɓurtii.',
+'post-expand-template-inclusion-category' => 'Kelle baɗɗe tuugnorɗe ɓurtuɗe',
 'post-expand-template-argument-warning' => "'''Warning:''' Ngoo hello ena jogii daliilu tiimtorde jogiiɗo ɓetol layo mawngol haa ɓurti.
 Ɗiin dalillaaji nduulaama.",
 'post-expand-template-argument-category' => 'Kelle jogiiɗe dalillaaji tiimtorde jejjitaaɗe',
 
 # History pages
 'viewpagelogs' => 'Yiyto loge ngoo hello',
+'currentrev-asof' => 'Yamre sakkitiinde nde $1',
 'revisionasof' => 'Waylitannde $1',
+'previousrevision' => '← Baylital ɓennungal',
+'cur' => 'gon',
+'last' => 'ɓenn',
 'histlegend' => 'Cifol : ({{int:cur}}) = ko seerti e yamre wonaande ndee, ({{int:last}}) = ko seerti e yamre ɓennunde ndee, <b>{{int:minoreditletter}}</b> = baylital pamaral',
 'history-fieldset-title' => 'Feero e aslol',
 'history-show-deleted' => 'Momtaaɗi tan',
@@ -298,6 +331,7 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 
 # Revision deletion
 'revdel-restore' => 'waylu jiyagol',
+'revdel-restore-deleted' => 'baylitte momtaaɗe',
 'revdel-restore-visible' => 'baylitte jiyotooɗe',
 
 # Merge log
@@ -319,6 +353,7 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'shown-title' => 'Hollu $1 {{PLURAL:$1|njaltudi|jaltuɗe}} e hello fof',
 'viewprevnext' => 'Yiyto ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Ena woodi hello ena wiyee \"[[:\$1]]\" e oo wiki.'''",
+'searchmenu-new' => "'''Sos hello \"[[:\$1]]\" e oo wiki!'''",
 'searchprofile-articles' => 'Kello loowdi',
 'searchprofile-project' => 'Hello ballal e Eɓɓoore',
 'searchprofile-images' => 'Sawmejaajo',
@@ -332,8 +367,13 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'search-result-size' => '$1 ({{PLURAL:$2|helmere 1|kelme$ 2}})',
 'search-redirect' => '(yiiltu $1)',
 'search-section' => '(taƴre $1)',
+'search-suggest' => 'Maa taw njiɗ-ɗaa wiyde ko: $1',
 'searchall' => 'fof',
 'showingresultsheader' => "{{PLURAL:$5|Njaltudi'''$1''' of '''$3'''|Jaltuɗe'''$1 - $2''' of '''$3'''}} for '''$4'''",
+'search-nonefound' => 'Alaa njaltudi arti e ndee ɗaɓɓitannde.',
+
+# Preferences page
+'mypreferences' => 'Cuɓoraade',
 
 # Recent changes
 'recentchanges' => 'Wailitooji kesi',
@@ -345,6 +385,8 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'rclinks' => 'Hollu bayle $1 cakkitiiɗe baɗaaɗe e balɗe $2 ɓannuɗe ɗee<br />$3',
 'diff' => 'ceer',
 'hist' => 'aslol',
+'hide' => 'Suuɗ',
+'show' => 'Hollu',
 'rc-enhanced-expand' => 'Hollu cariiɗe (ena naamnii JavaScript)',
 'rc-enhanced-hide' => 'Suuɗ cariiɗe',
 
@@ -353,6 +395,8 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'recentchangeslinked-toolbox' => 'Bayle toɗɗiiɗe ɗee',
 'recentchangeslinked-title' => 'Bayle toɗɗiiɗe "$1"',
 'recentchangeslinked-noresult' => 'Alaa bayle ngoni e hello jokkiingo ngoo e dumunna joopaaɗo oo.',
+'recentchangeslinked-summary' => 'Ɗuum ko doggol bayle baɗaaɗe sakket e kelle jokkiiɗe e hello heeriingo (walla e terɗe fedde heeriinde).
+Kelle e [[Special:Watchlist|your watchlist]] ko ngoni ko e ""ɓuutol"".',
 'recentchangeslinked-page' => 'Innde hello:',
 'recentchangeslinked-to' => 'Hollu bayle kelle jokkaaɗe e hello toɗɗaango ngoo kisa',
 
@@ -362,9 +406,21 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'filedesc' => 'Tonngol',
 
 # File description page
+'file-anchor-link' => 'Fiilde',
 'filehist' => 'Aslol fiilde',
+'filehist-help' => 'Dobo e ñalngu/waktu ngam yiyde fiilde ndee no nde yaltirta e oon waktu nih.',
+'filehist-current' => 'gonaaɗo',
+'filehist-datetime' => 'Ñalngu/Waktu',
+'filehist-thumb' => 'Dooɓre',
+'filehist-thumbtext' => 'Dooɓre yamre $1',
+'filehist-user' => 'Kuutoro',
+'filehist-dimensions' => 'Ɓete',
+'filehist-comment' => 'Yowre',
 'imagelinks' => 'Kuutorgol fiilde',
+'linkstoimage' => '{{PLURAL:$1|page links|$1 pages link}} dewɗe e ngoo hello:',
 'nolinkstoimage' => 'Alaa kelle jokkiiɗe e ndee fiilde.',
+'sharedupload-desc-here' => 'Ndee fiilde ummii ko e $1 tee ena waawi huutoreede e eɓɓooje koɗe.
+Cifol gonngol e [$2 file description page] makko ena holliraa les ɗoo.',
 
 # Random page
 'randompage' => 'Ɗerewol kawral',
@@ -383,13 +439,16 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'log' => 'Loge',
 
 # Special:AllPages
+'alphaindexline' => '$1 haa $2',
 'allarticles' => 'Winndannde hesere',
+'allpagessubmit' => 'Yah',
 
 # Special:LinkSearch
 'linksearch-line' => '$1 ko-ko jokkaa e $2',
 
 # Watchlist
 'watchlist' => 'Doggol ndeenka am',
+'mywatchlist' => 'Doggol rewindo',
 'watch' => 'Rewindaande',
 'unwatch' => 'Darin rewindo',
 
@@ -403,12 +462,15 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 
 # Undelete
 'undeletelink' => 'yiyto/artir',
+'undeleteviewlink' => 'yiyto',
 
 # Namespace form on various pages
+'namespace' => 'Boowal inɗe',
 'blanknamespace' => '(Dowrowo)',
 
 # Contributions
 'contributions' => 'Ballitte kuutoro',
+'mycontris' => 'Ballitte',
 'month' => 'Tuggi nduu lewru (e ɓennuɗi):',
 'year' => 'Tuggi ndee hitaande (e ɓennuɗe):',
 
@@ -431,6 +493,7 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'whatlinkshere-filters' => 'Ceɗe',
 
 # Block/unblock
+'ipboptions' => 'waktuuji 2:waktuuji 2,ñalawma 1:ñalawma 1,balɗe 3:balɗe 3,yontere 1:yontere 1,jonte 2:jonte 2,lewru 1:lewru 1,lebbi 3:lebbi 3,lebbi 6:lebbi 6,hitaande 1:hitaande 1,gasataa:haa badaa',
 'blocklink' => 'daaƴ',
 'unblocklink' => 'daaƴtu',
 'change-blocklink' => 'wayli daaƴo',
@@ -440,6 +503,9 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'movelogpage' => 'Dirtin loge',
 'revertmove' => 'firlit',
 
+# Export
+'export' => 'Jiggito kello',
+
 # Namespace 8 related
 'allmessagesname' => 'Innde',
 'allmessagesdefault' => 'Binndo ɓatakuru goowangol',
@@ -458,11 +524,14 @@ walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
 'tooltip-pt-logout' => 'Seŋto',
 'tooltip-ca-talk' => 'Yeewtere baɗte hello loowdi ngoo',
 'tooltip-ca-edit' => 'Aɗa waawi taƴtaade ngoo hello. Tiiɗno huutoro butoŋ yiytindo oo hade maa danndude',
+'tooltip-ca-addsection' => 'Fuɗɗo taƴre hesere',
 'tooltip-ca-viewsource' => 'Ngoo hello ko hisnaango.
 Aɗa waawi yiytaade ɗaɗol maggo.',
 'tooltip-ca-history' => 'Baylitte ɓennuɗe e  ngoo hello',
 'tooltip-ca-protect' => 'Hisnu ngoo hello',
 'tooltip-ca-delete' => 'Momtu ngoo hello',
+'tooltip-ca-move' => 'Dirtin ngoo hello',
+'tooltip-ca-watch' => 'Ɓeydu ngoo hello e dewindaaɗe maa',
 'tooltip-ca-unwatch' => 'Momtu ngoo hello e doggol ndeenka maa',
 'tooltip-search' => 'Yiylo e {{SITENAME}}',
 'tooltip-search-fulltext' => 'Yiylo ndii loowdi e kelle ɗee',
@@ -476,6 +545,7 @@ Aɗa waawi yiytaade ɗaɗol maggo.',
 'tooltip-n-help' => 'Ko ɗoo yiytetee',
 'tooltip-t-whatlinkshere' => 'Doggol kelle Wiki jokkaaɗe ɗoo ɗee fof',
 'tooltip-t-recentchangeslinked' => 'Bayle cakkitiiɗe e kelle jokkaaɗe e ngoo hello',
+'tooltip-feed-atom' => 'Balal Atom ngoo hello',
 'tooltip-t-contributions' => 'Doggol ballitte oo kuutoro',
 'tooltip-t-upload' => 'Yollu piille',
 'tooltip-t-specialpages' => 'Doggol kelle keeriiɗe fof',
@@ -485,16 +555,22 @@ Aɗa waawi yiytaade ɗaɗol maggo.',
 'tooltip-ca-nstab-user' => 'Yiyto hello kuutoro',
 'tooltip-ca-nstab-project' => 'Yiyto hello eɓɓoore ngoo',
 'tooltip-ca-nstab-image' => 'Yiyto hello fiilde ngoo',
+'tooltip-ca-nstab-template' => 'Yiyto tuugnorde ndee',
+'tooltip-ca-nstab-category' => 'Yiyto hello fedde ndee',
 'tooltip-minoredit' => 'Maanto ɗum ko taƴto famaro',
+'tooltip-save' => 'Danndu bayle maa',
+'tooltip-preview' => 'Yiytindo bayle maa, tiiɗno huutoro ɗuum hade maa danndude!',
 'tooltip-compareselectedversions' => 'Ƴeew ko seerndi hakkunde baylitte ɗiɗi ngoo hello labaaɗe ɗee',
 'tooltip-watch' => 'Ɓeydu ngoo hello e doggol ndeenka maa',
 'tooltip-rollback' => '"Riiwtude" firlittu taƴte  ngoo hello ruttoo to battindiiɗo waylude ngo e dobannde wootere',
 'tooltip-undo' => '"Firtu" artirtu ngol taƴtol tee uddita gallol taƴto ngol e mbaydi yiytindo. Nafata ko ɓeydude daliilu e tonngol ngol.',
+'tooltip-summary' => 'Naatnu tonngol daɓɓol',
 
 # Browsing diffs
 'previousdiff' => 'Taƴte ɓennungol',
 
 # Media information
+'file-info-size' => '$1 × $2 piksele, ɓetol fiilde: $3, mbaydi MIME: $4',
 'file-nohires' => 'Werngo ɓurngo ɗoo toowde alaa.',
 'svg-long-desc' => 'Fiilde SVG, werngo mum ko $1 × $2 pikelle, ɓetol fiildee: $3',
 
@@ -509,6 +585,7 @@ Jokkol gadanol e gorol foti wonde ko jokkol fiilde nde moƴƴaani.
 Kala jokkol dewngol e ngool gorol nanngiraa ko paltooje, wano kelle ɗo fiilde ndee waawi yaltude.',
 
 # Metadata
+'metadata' => 'Metaakeɓe',
 'metadata-help' => 'Ngoo hello ena waɗi humpito woɗngo, tawata ko ummii ko e kameraa numerik walla niiwtorde huutoraande ngam sosde walla ngaanndinde nde.',
 'metadata-fields' => 'Galli metaakeɓe natal gongal nde nduu ɓaakuru maa naatine e jaytinol hello natal tuma nde haatumeere metaakeɓe ndee taggitaa.
 Goɗɗe maa cuuɗe e sahaa kala.
@@ -531,6 +608,7 @@ Goɗɗe maa cuuɗe e sahaa kala.
 'edit-externally-help' => '(Yah to [//www.mediawiki.org/wiki/Manual:External_editors/ff tinndinoore teelto] ngam ɓeydude humpito)',
 
 # 'all' in various places, this might be different for inflected languages
+'namespacesall' => 'fof',
 'monthsall' => 'fof',
 
 # Special:SpecialPages
index 745aca1..53168b0 100644 (file)
@@ -313,7 +313,7 @@ $linkTrail = '/^([a-zäö]+)(.*)$/sDu';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Linkkien alleviivaus',
+'tog-underline' => 'Linkkien alleviivaus:',
 'tog-justify' => 'Tasaa kappaleet',
 'tog-hideminor' => 'Piilota pienet muutokset tuoreet muutokset -listasta',
 'tog-hidepatrolled' => 'Piilota tarkastetut muutokset tuoreet muutokset -listasta',
@@ -342,8 +342,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Näytä sivua tarkkailevien käyttäjien määrä',
 'tog-oldsig' => 'Nykyinen allekirjoitus',
 'tog-fancysig' => 'Muotoilematon allekirjoitus ilman automaattista linkkiä',
-'tog-externaleditor' => 'Käytä ulkoista tekstieditoria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
-'tog-externaldiff' => 'Käytä oletuksena ulkoista työkalua sivun eri versioiden välisten erojen tarkasteluun. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
 'tog-showjumplinks' => 'Lisää loikkaa-käytettävyyslinkit sivun alkuun',
 'tog-uselivepreview' => 'Käytä pikaesikatselua (JavaScript) (kokeellinen)',
 'tog-forceeditsummary' => 'Huomauta, jos yhteenvetoa ei ole annettu',
@@ -358,6 +356,7 @@ $messages = array(
 'tog-showhiddencats' => 'Näytä piilotetut luokat',
 'tog-noconvertlink' => 'Älä muunna linkkien otsikoita toiseen kirjoitusjärjestelmään',
 'tog-norollbackdiff' => 'Älä näytä eroavaisuuksia palauttamisen jälkeen',
+'tog-useeditwarning' => 'Varoita minua, kun poistun muokkaussivulta tallentamatta muutoksia',
 
 'underline-always' => 'Aina',
 'underline-never' => 'Ei koskaan',
@@ -421,6 +420,18 @@ $messages = array(
 'oct' => 'lokakuu',
 'nov' => 'marraskuu',
 'dec' => 'joulukuu',
+'january-date' => '$1. tammikuuta',
+'february-date' => '$1. helmikuuta',
+'march-date' => '$1. maaliskuuta',
+'april-date' => '$1. huhtikuuta',
+'may-date' => '$1. toukokuuta',
+'june-date' => '$1. kesäkuuta',
+'july-date' => '$1. heinäkuuta',
+'august-date' => '$1. elokuuta',
+'september-date' => '$1. syyskuuta',
+'october-date' => '$1. lokakuuta',
+'november-date' => '$1. marraskuuta',
+'december-date' => '$1. joulukuuta',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Luokka|Luokat}}',
@@ -721,9 +732,18 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'welcomecreation-msg' => 'Käyttäjätunnuksesi on luotu.
 Älä unohda virittää {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|asetuksiasi]].',
 'yourname' => 'Käyttäjätunnus',
+'userlogin-yourname' => 'Käyttäjätunnus',
+'userlogin-yourname-ph' => 'Kirjoita käyttäjätunnus',
 'yourpassword' => 'Salasana',
+'userlogin-yourpassword' => 'Salasana',
+'userlogin-yourpassword-ph' => 'Kirjoita salasana',
+'createacct-yourpassword-ph' => 'Kirjoita salasana',
 'yourpasswordagain' => 'Salasana uudelleen',
+'createacct-yourpasswordagain' => 'Vahvista salasana',
+'createacct-yourpasswordagain-ph' => 'Kirjoita salasana uudelleen',
 'remembermypassword' => 'Muista minut (enintään $1 {{PLURAL:$1|päivä|päivää}})',
+'userlogin-remembermypassword' => 'Pidä minut kirjautuneena',
+'userlogin-signwithsecure' => 'Käytä salattua yhteyttä',
 'securelogin-stick-https' => 'Jatka salatun yhteyden käyttämistä sisäänkirjautumisen jälkeen',
 'yourdomainname' => 'Verkkonimi',
 'password-change-forbidden' => 'Et voi muuttaa salasanoja tässä wikissä.',
@@ -736,17 +756,37 @@ Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut si
 'logout' => 'Kirjaudu ulos',
 'userlogout' => 'Kirjaudu ulos',
 'notloggedin' => 'Et ole kirjautunut',
+'userlogin-noaccount' => 'Eikö sinulla vielä ole käyttäjätunnusta?',
+'userlogin-joinproject' => 'Liity {{GRAMMAR:illative|{{SITENAME}}}}',
 'nologin' => "Jos sinulla ei ole vielä käyttäjätunnusta, '''$1'''.",
 'nologinlink' => 'voit luoda sellaisen',
 'createaccount' => 'Luo uusi käyttäjätunnus',
 'gotaccount' => "Jos sinulla on jo tunnus, voit '''$1'''.",
 'gotaccountlink' => 'kirjautua sisään',
 'userlogin-resetlink' => 'Unohditko salasanasi?',
+'userlogin-resetpassword-link' => 'Salasanan alustus',
+'helplogin-url' => 'Help:Sisäänkirjautuminen',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Auta sisäänkirjautumisessa]]',
+'createacct-join' => 'Kirjoita tietosi alle.',
+'createacct-emailrequired' => 'Sähköpostiosoite',
+'createacct-emailoptional' => 'Sähköpostiosoite (vapaaehtoinen)',
+'createacct-email-ph' => 'Anna sähköpostiosoitteesi',
 'createaccountmail' => 'Käytä satunnaista väliaikaissalasanaa ja lähetä se alla määritettyyn sähköpostiosoitteeseen',
+'createacct-realname' => 'Oikea nimi (valinnainen)',
 'createaccountreason' => 'Syy',
+'createacct-reason' => 'Syy',
+'createacct-reason-ph' => 'Tunnuksen luomisen syy',
+'createacct-captcha' => 'Turvatarkastus',
+'createacct-imgcaptcha-ph' => 'Kirjoita teksti, jonka näet edellä',
+'createacct-submit' => 'Luo tunnus',
+'createacct-benefit-heading' => '{{SITENAME}} on sinun kaltaisesi 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 erilaiset.',
 'userexists' => 'Pyytämäsi käyttäjänimi on jo käytössä. Valitse toinen käyttäjänimi.',
 'loginerror' => 'Sisäänkirjautumisvirhe',
+'createacct-error' => 'Tunnuksen luontivirhe',
 'createaccounterror' => 'Tunnuksen luonti ei onnistunut: $1',
 'nocookiesnew' => 'Käyttäjä luotiin, mutta et ole kirjautunut sisään. {{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. Selaimesi ei salli evästeistä. Kytke ne päälle, ja sitten kirjaudu sisään juuri luomallasi käyttäjänimellä ja salasanalla.',
 'nocookieslogin' => '{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. Selaimesi ei salli evästeitä. Ota ne käyttöön, ja yritä uudelleen.',
@@ -773,7 +813,7 @@ Jos joku muu on tehnyt tämän pyynnön, tai jos olet muistanut salasanasi ja et
 'passwordsent' => 'Uusi salasana on lähetetty käyttäjän <b>$1</b> sähköpostiosoitteeseen.',
 'blocked-mailpassword' => 'Osoitteellesi on asetettu muokkausesto, joka estää käyttämästä salasanamuistutustoimintoa.',
 'eauthentsent' => 'Varmennussähköposti on lähetetty annettuun sähköpostiosoitteeseen. Muita viestejä ei lähetetä, ennen kuin olet toiminut viestin ohjeiden mukaan ja varmistanut, että sähköpostiosoite kuuluu sinulle.',
-'throttled-mailpassword' => 'Salasanamuistutus on lähetetty {{PLURAL:$1|kuluvan|kuluvien $1}} tunnin aikana. Salasanamuistutuksia lähetään enintään {{PLURAL:$1|tunnin|$1 tunnin}} välein.',
+'throttled-mailpassword' => 'Salasananpalautusviesti on lähetetty {{PLURAL:$1|kuluvan|kuluvien $1}} tunnin aikana. Salasananpalautusviestejä lähetetään enintään {{PLURAL:$1|tunnin|$1 tunnin}} välein.',
 'mailerror' => 'Virhe lähetettäessä sähköpostia: $1',
 'acct_creation_throttle_hit' => 'IP-osoitteestasi on luotu tähän wikiin jo {{PLURAL:$1|yksi tunnus|$1 tunnusta}} päivän aikana, joka suurin sallittu määrä tälle ajalle.
 Tästä johtuen tästä IP-osoitteesta ei voi tällä hetkellä luoda uusia tunnuksia.',
@@ -820,27 +860,29 @@ Odota ennen kuin yrität uudelleen.',
 'resetpass-wrong-oldpass' => 'Virheellinen väliaikainen tai nykyinen salasana.
 Olet saattanut jo onnistuneesti vaihtaa salasanasi tai pyytää uutta väliaikaista salasanaa.',
 'resetpass-temp-password' => 'Väliaikainen salasana:',
+'resetpass-abort-generic' => 'Lisäosa hylkäsi salasanan vaihdon.',
 
 # Special:PasswordReset
 'passwordreset' => 'Salasanan alustus',
-'passwordreset-text' => 'Saat sähköpostimuistutuksen tunnuksesi tiedoista, kun täytät tämän lomakkeen.',
+'passwordreset-text-one' => 'Täytä tämä lomake vaihtaaksesi salasanasi.',
 'passwordreset-legend' => 'Salasanan vaihto',
 'passwordreset-disabled' => 'Salasanojen alustus ei ole mahdollista tässä wikissä.',
-'passwordreset-pretext' => '{{PLURAL:$1||Kirjoita jokin jäljempänä pyydetty tieto}}',
+'passwordreset-emaildisabled' => 'Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.',
 'passwordreset-username' => 'Käyttäjätunnus',
 'passwordreset-domain' => 'Verkkotunnus',
 'passwordreset-capture' => 'Näytä lähetettävä sähköpostiviesti',
 'passwordreset-capture-help' => 'Jos valitset tämän, sähköposti (tilapäisellä salasanalla) näytetään sinulle sekä lähetetään käyttäjälle.',
 'passwordreset-email' => 'Sähköpostiosoite',
 'passwordreset-emailtitle' => 'Tunnuksen tiedot {{GRAMMAR:inessive|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).
-{{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}} liitetty tähän sähköpostiosoitteeseen:
+'passwordreset-emailtext-ip' => 'Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi salasanasi
+palautusta sivustolla {{SITENAME}} ($4). {{PLURAL:$3|Seuraava käyttäjätili on|Seuraavat käyttäjätilit ovat}}
+yhdistettynä tähän sähköpostiosoitteeseen:
 
 $2
 
-{{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.
-Sinun kannattaa kirjautua sisään ja valita uusi salasana. Jos joku toinen teki tämän
-pyynnön, tai muistat sittenkin vanhan salasanasi, etkä halua muuttaa sitä,
+{{PLURAL:$3|Tämä väliaikainen salasana vanhenee|Nämä väliaikaiset salasanat vanhenevat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.
+Ole hyvä ja kirjaudu sisään nyt ja valitse uusi salasana. Jos joku toinen pyysi tätä,
+tai jos muistit jo vanhan salasanasi, etkä halua enää muuttaa sitä
 voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.',
 'passwordreset-emailtext-user' => 'Käyttäjä $1 pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).
 {{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}} liitetty tähän sähköpostiosoitteeseen:
@@ -853,9 +895,9 @@ pyynnön, tai muistat sittenkin vanhan salasanasi, etkä halua muuttaa sitä,
 voit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.',
 'passwordreset-emailelement' => 'Käyttäjätunnus: $1
 Väliaikainen salasana: $2',
-'passwordreset-emailsent' => 'Sähköpostimuistutus on lähetetty.',
-'passwordreset-emailsent-capture' => 'Muistutussähköposti on lähetetty. Se näkyy myös alla.',
-'passwordreset-emailerror-capture' => 'Alla näytettävä sähköpostiviesti luotiin, mutta sen lähettäminen käyttäjälle epäonnistui: $1',
+'passwordreset-emailsent' => 'Salasananpalautusviesti on lähetetty.',
+'passwordreset-emailsent-capture' => 'Salasananpalautusviesti on lähetetty, 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',
 
 # Special:ChangeEmail
 'changeemail' => 'Muuta sähköpostiosoitetta',
@@ -1049,12 +1091,15 @@ Harkitse, kannattaako sivua luoda uudelleen. Alla on tämän sivun poisto- ja si
 Se on ilmeisesti poistettu.',
 'edit-conflict' => 'Päällekkäinen muokkaus.',
 'edit-no-change' => 'Muokkauksesi sivuutettiin, koska tekstiin ei tehty mitään muutoksia.',
+'postedit-confirmation' => 'Muokkauksesi on tallennettu.',
 'edit-already-exists' => 'Uuden sivun luominen ei onnistunut.
 Se on jo olemassa.',
 'defaultmessagetext' => 'Viestin oletusteksti',
 'content-failed-to-parse' => 'Sisältö tyypiltään $2 ei jäsenny tyypiksi $1: $3',
 'invalid-content-data' => 'Virheellinen sisältö',
 'content-not-allowed-here' => 'Sivun [[$2]] sisältö ei voi olla tyyppiä $1.',
+'editwarning-warning' => 'Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.
+Jos olet kirjautuneena sisään, voit poistaa tämän varoituksen käytöstä asetuksissa osiossa »Muokkaus».',
 
 # Content models
 'content-model-wikitext' => 'wikiteksti',
@@ -1333,15 +1378,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'powersearch-togglenone' => 'Poista valinnat',
 'search-external' => 'Ulkoinen haku',
 'searchdisabled' => 'Tekstihaku on poistettu toistaiseksi käytöstä suuren kuorman vuoksi. Voit käyttää alla olevaa Googlen hakukenttää sivujen etsimiseen, kunnes haku tulee taas käyttöön. <small>Huomaa, että ulkopuoliset kopiot {{GRAMMAR:genitive|{{SITENAME}}}} sisällöstä eivät välttämättä ole ajan tasalla.</small>',
-
-# Quickbar
-'qbsettings' => 'Pikavalikko',
-'qbsettings-none' => 'Ei mitään',
-'qbsettings-fixedleft' => 'Tekstin mukana, vasen',
-'qbsettings-fixedright' => 'Tekstin mukana, oikea',
-'qbsettings-floatingleft' => 'Pysyen vasemmalla',
-'qbsettings-floatingright' => 'Pysyen oikealla',
-'qbsettings-directionality' => 'Kiinteä, riippuen käyttämäsi kielen kirjoitusjärjestelmän suunnasta',
+'search-error' => 'Virhe ilmaantui haettaessa: $1',
 
 # Preferences page
 'preferences' => 'Asetukset',
@@ -1482,6 +1519,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'userrights-notallowed' => 'Tunnuksellasi ei ole lupaa lisätä tai poistaa käyttöoikeuksia.',
 'userrights-changeable-col' => 'Ryhmät, joita voit muuttaa',
 'userrights-unchangeable-col' => 'Ryhmät, joita et voi muuttaa',
+'userrights-conflict' => 'Päällekkäinen käyttöoikeuksien muutos! Ole hyvä ja tee muutoksesi uudestaan.',
 
 # Groups
 'group' => 'Ryhmä',
@@ -1880,7 +1918,6 @@ Parhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.',
 'http-read-error' => 'HTTP-lukuvirhe.',
 'http-timed-out' => 'HTTP-pyyntö aikakatkaistiin.',
 'http-curl-error' => 'Virhe noudettaessa verkko-osoitetta: $1',
-'http-host-unreachable' => 'Ei voitu tavoittaa verkko-osoitetta',
 'http-bad-status' => 'HTTP-pyynnön aikana oli ongelma: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2289,8 +2326,8 @@ Tulevaisuudessa sivuun ja sen keskustelusivuun tehtävät muutokset listataan t
 'notvisiblerev' => 'Versio on poistettu',
 'watchnochange' => 'Valittuna ajanjaksona yhtäkään tarkkailemistasi sivuista ei muokattu.',
 'watchlist-details' => 'Tarkkailulistalla on {{PLURAL:$1|$1 sivu|$1 sivua}} keskustelusivuja mukaan laskematta.',
-'wlheader-enotif' => '* Sähköposti-ilmoitukset ovat käytössä.',
-'wlheader-showupdated' => "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
+'wlheader-enotif' => 'Sähköposti-ilmoitus on käytössä.',
+'wlheader-showupdated' => "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
 'watchmethod-recent' => 'tarkistetaan tuoreimpia muutoksia tarkkailluille sivuille',
 'watchmethod-list' => 'tarkistetaan tarkkailtujen sivujen tuoreimmat muutokset',
 'watchlistcontains' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
@@ -2474,9 +2511,8 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 Voit palauttaa versioita valikoivasti valitsemalla vain niiden versioiden valintalaatikot, jotka haluat palauttaa.",
 'undeleterevisions' => '{{PLURAL:$1|Versio|$1 versiota}} arkistoitu.',
 '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. 
-Tässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus.<br />
-Tiedostoversioita, joihin sinulla ei ole katseluoikeutta (''häivytetyt versiot''), ei palauteta.",
+'undeleterevdel' => 'Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. 
+Tässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus.',
 'undeletehistorynoadmin' => 'Tämä sivu on poistettu. Syy sivun poistamiseen näkyy yhteenvedossa, jossa on myös tiedot, ketkä ovat muokanneet tätä sivua ennen poistamista. Sivujen varsinainen sisältö on vain ylläpitäjien luettavissa.',
 'undelete-revision' => 'Poistettu sivu $1 hetkellä $4 kello $5. Tekijä: $3.',
 'undeleterevision-missing' => 'Virheellinen tai puuttuva versio. Se on saatettu palauttaa tai poistaa arkistosta.',
@@ -2839,6 +2875,8 @@ Jos haluat muokata MediaWikin yleistä kotoistusta, käy [//www.mediawiki.org/wi
 'thumbnail-more' => 'Suurenna',
 'filemissing' => 'Tiedosto puuttuu',
 'thumbnail_error' => 'Pienoiskuvan luominen epäonnistui: $1',
+'thumbnail_error_remote' => 'Virheilmoitus kohteesta $1:
+$2',
 'djvu_page_error' => 'DjVu-tiedostossa ei ole pyydettyä sivua',
 'djvu_no_xml' => 'DjVu-tiedoston XML-vienti epäonnistui',
 'thumbnail-temp-create' => 'Väliaikaisen esikatselukuvan luonti epäonnistui',
@@ -2984,13 +3022,8 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 
 # Stylesheets
 'common.css' => '/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */',
-'standard.css' => '/* Tämä sivu sisältää Perus-ulkoasua muuttavia tyylejä. */',
-'nostalgia.css' => '/* Tämä sivu sisältää Nostalgia-ulkoasua muuttavia tyylejä. */',
 'cologneblue.css' => '/* Tämä sivu sisältää Kölnin sininen -ulkoasua muuttavia tyylejä. */',
 'monobook.css' => '/* Tämä sivu sisältää Monobook-ulkoasua muuttavia tyylejä. */',
-'myskin.css' => '/* Tämä sivu sisältää Oma tyylisivu -ulkoasua muuttavia tyylejä. */',
-'chick.css' => '/* Tämä sivu sisältää Chick-ulkoasua muuttavia tyylejä. */',
-'simple.css' => '/* Tämä sivu sisältää Yksinkertainen-ulkoasua muuttavia tyylejä. */',
 'modern.css' => '/* Tämä sivu sisältää Moderni-ulkoasua muuttavia tyylejä. */',
 'vector.css' => '/* Tämä sivu sisältää Vector-ulkoasua muuttavia tyylejä. */',
 'print.css' => '/* Tämä sivu sisältää tulostettua sivua muuttavia tyylejä */',
@@ -3002,13 +3035,8 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 
 # Scripts
 'common.js' => '/* Tämän sivun JavaScript-koodi liitetään jokaiseen sivulataukseen */',
-'standard.js' => '/* Tämän sivun JavaScript-koodi liitetään Perus-tyyliin */',
-'nostalgia.js' => '/* Tämän sivun JavaScript-koodi liitetään Nostalgia-tyyliin */',
 'cologneblue.js' => '/* Tämän sivun JavaScript-koodi liitetään Kölnin sininen -tyyliin */',
 'monobook.js' => '/* Tämän sivun JavaScript-koodi liitetään Monobook-tyyliin */',
-'myskin.js' => '/* Tämän sivun JavaScript-koodi liitetään Oma tyylisivu -tyyliin */',
-'chick.js' => '/* Tämän sivun JavaScript-koodi liitetään Chick-tyyliin */',
-'simple.js' => '/* Tämän sivun JavaScript-koodi liitetään Yksinkertaistettuun tyyliin */',
 'modern.js' => '/* Tämän sivun JavaScript-koodi liitetään Moderni-tyyliin */',
 'vector.js' => '/* Tämän sivun JavaScript-koodi liitetään Vector-tyyliin */',
 'group-autoconfirmed.js' => '/* Tämän sivun JavaScript-koodi liitetään vain automaattisesti hyväksytyille käyttäjille */',
@@ -3057,6 +3085,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'pageinfo-robot-noindex' => 'Ei indeksoitava',
 'pageinfo-views' => 'Katselukertojen määrä',
 'pageinfo-watchers' => 'Sivun tarkkailijoiden lukumäärä',
+'pageinfo-few-watchers' => 'Vähemmän kuin $1 {{PLURAL:$1|tarkkailija|tarkkailijaa}}',
 'pageinfo-redirects-name' => 'Sivulle johtavat ohjaukset',
 'pageinfo-subpages-name' => 'Sivun alasivut',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ohjaus|ohjausta}}; $3 {{PLURAL:$3|ei-ohjausta}})',
@@ -3077,20 +3106,17 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'pageinfo-redirectsto-info' => 'tiedot',
 'pageinfo-contentpage' => 'Lasketaan sisältösivuksi',
 'pageinfo-contentpage-yes' => 'Kyllä',
+'pageinfo-protect-cascading' => 'Tämä on laajennetun suojauksen lähdesivu',
 'pageinfo-protect-cascading-yes' => 'Kyllä',
+'pageinfo-protect-cascading-from' => 'Laajennettu suojaus tulee sivulta',
 'pageinfo-category-info' => 'Luokkatiedot',
 'pageinfo-category-pages' => 'Sivujen määrä',
 'pageinfo-category-subcats' => 'Alaluokkien määrä',
 'pageinfo-category-files' => 'Tiedostojen määrä',
 
 # Skin names
-'skinname-standard' => 'Perus',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Kölnin sininen',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Oma tyylisivu',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Yksinkertainen',
 'skinname-modern' => 'Moderni',
 
 # Patrolling
@@ -3168,11 +3194,25 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
 'minutes' => '{{PLURAL:$1|$1 minuutti|$1 minuuttia}}',
 'hours' => '{{PLURAL:$1|$1 tunti|$1 tuntia}}',
 'days' => '{{PLURAL:$1|$1 päivä|$1 päivää}}',
+'weeks' => '{{PLURAL:$1|viikko|$1 viikkoa}}',
 'months' => '{{PLURAL:$1|$1 kuukausi|$1 kuukautta}}',
 'years' => '{{PLURAL:$1|$1 vuosi|$1 vuotta}}',
 'ago' => '$1 sitten',
 'just-now' => 'juuri nyt',
 
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|tunti|$1 tuntia}} sitten',
+'minutes-ago' => '{{PLURAL:$1|minuutti|$1 minuuttia}} sitten',
+'seconds-ago' => '{{PLURAL:$1|sekunti|$1 sekuntia}} sitten',
+'monday-at' => 'Maanantaina klo $1',
+'tuesday-at' => 'Tiistaina klo $1',
+'wednesday-at' => 'Keskiviikkona klo $1',
+'thursday-at' => 'Torstaina klo $1',
+'friday-at' => 'Perjantaina klo $1',
+'saturday-at' => 'Lauantaina klo $1',
+'sunday-at' => 'Sunnuntaina klo $1',
+'yesterday-at' => 'Eilen klo $1',
+
 # Bad image list
 'bad_image_list' => 'Listan muoto on seuraava:
 
@@ -3200,7 +3240,7 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Leveys',
 'exif-imagelength' => 'Korkeus',
 'exif-bitspersample' => 'Bittiä komponentissa',
@@ -3378,7 +3418,7 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
 'exif-originalimageheight' => 'Kuvan korkeus ennen kuin sitä rajattiin',
 'exif-originalimagewidth' => 'Kuvan leveys ennen kuin sitä rajattiin',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Pakkaamaton',
 'exif-compression-2' => 'CCITT:n Group 3 -yksiulotteinen muokattu Huffman-ajopituuskoodaus',
 'exif-compression-3' => 'CCITT:n Group 3 -faksipakkaus',
@@ -3790,12 +3830,17 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
 'version-entrypoints-header-entrypoint' => 'Aloituskohta',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Tiedoston osoite',
-'filepath-page' => 'Tiedosto',
-'filepath-submit' => 'Siirry',
-'filepath-summary' => 'Tämä toimintosivu palauttaa tiedoston URL-osoitteen.
-Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyssä ohjelmassa.',
+# Special:Redirect
+'redirect' => 'Ohjaus tiedostonimen, käyttäjänumeron tai versionumeron mukaan',
+'redirect-legend' => 'Uudelleenohjaa tiedostoon tai sivulle',
+'redirect-summary' => 'Tämä toimintosivu ohjaa tiedostoon (tiedoston nimen mukaan), sivulle (sivun versionumeron mukaan) tai käyttäjäsivulle (käyttäjätunnuksen numeron mukaan).',
+'redirect-submit' => 'Siirry',
+'redirect-lookup' => 'Hae:',
+'redirect-value' => 'Arvo:',
+'redirect-user' => 'Käyttäjän tunnusnumero',
+'redirect-revision' => 'Sivun versio',
+'redirect-file' => 'Tiedostonimi',
+'redirect-not-exists' => 'Arvoa ei löytynyt',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Kaksoiskappaleiden haku',
@@ -3885,23 +3930,26 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 'htmlform-submit' => 'Lähetä',
 'htmlform-reset' => 'Kumoa muutokset',
 'htmlform-selectorother-other' => 'Muu',
+'htmlform-no' => 'Ei',
+'htmlform-yes' => 'Kyllä',
+'htmlform-chosen-placeholder' => 'Valitse vaihtoehto',
 
 # SQLite database support
 'sqlite-has-fts' => '$1, jossa on tuki kokotekstihaulle',
 'sqlite-no-fts' => '$1, jossa ei ole tukea kokotekstihaulle',
 
 # New logging system
-'logentry-delete-delete' => '$1 poisti sivun $3',
-'logentry-delete-restore' => '$1 palautti sivun $3',
-'logentry-delete-event' => '$1 muutti {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
-'logentry-delete-revision' => '$1 muutti {{PLURAL:$5|version|$5 version}} näkyvyyttä sivulla $3: $4',
-'logentry-delete-event-legacy' => '$1 muutti kohteen $3 lokitapahtumien näkyvyyttä',
-'logentry-delete-revision-legacy' => '$1 muutti sivun $3 versioiden näkyvyyttä',
-'logentry-suppress-delete' => '$1 häivytti sivun $3',
-'logentry-suppress-event' => '$1 muutti salaa {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
-'logentry-suppress-revision' => '$1 muutti salaa {{PLURAL:$5|muutoksen|$5 muutoksen}} näkyvyyttä sivulla $3: $4',
-'logentry-suppress-event-legacy' => '$1 muutti salaa kohteen $3 lokitapahtumien näkyvyyttä',
-'logentry-suppress-revision-legacy' => '$1 muutti salaa sivun $3 versioiden näkyvyyttä',
+'logentry-delete-delete' => '$1 {{GENDER:$2|poisti}} sivun $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|palautti}} sivun $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|muutti}} {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|muutti}} {{PLURAL:$5|version|$5 version}} näkyvyyttä sivulla $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|muutti}} kohteen $3 lokitapahtumien näkyvyyttä',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|muutti}} sivun $3 versioiden näkyvyyttä',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|häivytti}} sivun $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|muutti}} salaa {{PLURAL:$5|lokitapahtuman|$5 lokitapahtuman}} näkyvyyttä kohteessa $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|muutti}} salaa {{PLURAL:$5|muutoksen|$5 muutoksen}} näkyvyyttä sivulla $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|muutti}} salaa kohteen $3 lokitapahtumien näkyvyyttä',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|muutti}} salaa sivun $3 versioiden näkyvyyttä',
 'revdelete-content-hid' => 'sisältö piilotettu',
 'revdelete-summary-hid' => 'muokkausyhteenveto piilotettu',
 'revdelete-uname-hid' => 'käyttäjätunnus piilotettu',
@@ -3910,20 +3958,20 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 'revdelete-uname-unhid' => 'käyttäjätunnus palautettu näkyviin',
 'revdelete-restricted' => 'asetti rajoitukset ylläpitäjille',
 'revdelete-unrestricted' => 'poisti rajoitukset ylläpitäjiltä',
-'logentry-move-move' => '$1 siirsi sivun $3 uudelle nimelle $4',
-'logentry-move-move-noredirect' => '$1 siirsi sivun $3 uudelle nimelle $4 luomatta ohjausta',
-'logentry-move-move_redir' => '$1 siirsi sivun $3 ohjauksen $4 päälle',
-'logentry-move-move_redir-noredirect' => '$1 siirsi sivun $3 ohjauksen $4 päälle luomatta ohjausta',
-'logentry-patrol-patrol' => '$1 merkitsi sivun $3 muutoksen $4 tarkastetuksi',
-'logentry-patrol-patrol-auto' => '$1 merkitsi automaattisesti sivun $3 muutoksen $4 tarkastetuksi',
-'logentry-newusers-newusers' => 'Käyttäjätunnus $1 luotiin',
-'logentry-newusers-create' => 'Käyttäjätunnus $1 luotiin',
-'logentry-newusers-create2' => '$1 loi käyttäjätunnuksen $3',
-'logentry-newusers-byemail' => '$1 loi käyttäjätunnuksen $3 ja salasana lähetettiin sähköpostitse',
-'logentry-newusers-autocreate' => 'Käyttäjätunnus $1 luotiin automaattisesti',
-'logentry-rights-rights' => '$1 muutti käyttäjän $3 oikeudet ryhmistä $4 ryhmiin $5',
-'logentry-rights-rights-legacy' => '$1 muutti käyttäjän $3 jäsenyyttä ryhmässä',
-'logentry-rights-autopromote' => '$1 ylennettiin automaattisesti ryhmistä $4 ryhmiin $5',
+'logentry-move-move' => '$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4 luomatta ohjausta',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|siirsi}} sivun $3 ohjauksen $4 päälle',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|siirsi}} sivun $3 ohjauksen $4 päälle luomatta ohjausta',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|merkitsi}} sivun $3 muutoksen $4 tarkastetuksi',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|merkitsi}} automaattisesti sivun $3 muutoksen $4 tarkastetuksi',
+'logentry-newusers-newusers' => 'Käyttäjätunnus $1 {{GENDER:$2|luotiin}}',
+'logentry-newusers-create' => 'Käyttäjätunnus $1 {{GENDER:$2|luotiin}}',
+'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-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' => '$1 {{GENDER:$2|muutettiin}} automaattisesti ryhmistä $4 ryhmiin $5',
 'rightsnone' => '(ei oikeuksia)',
 
 # Feedback
@@ -3999,4 +4047,7 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'duration-centuries' => '$1 {{PLURAL:$1|vuosisata|vuosisataa}}',
 'duration-millennia' => '$1 {{PLURAL:$1|vuosituhat|vuosituhatta}}',
 
+# Image rotation
+'rotate-comment' => 'Kuvaa käännettiin $1 aste{{PLURAL:$1||tta}} myötäpäivään',
+
 );
index 5f838b8..7c9a726 100644 (file)
@@ -44,7 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Näytä kuinka moni käyttäjä valvoo sivua',
 'tog-oldsig' => 'Nykynen allekirjotus',
 'tog-fancysig' => 'Mookkaamaton allekirjotus ilman auttomaattista linkkiä',
-'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. ([//www.mediawiki.org/wiki/Manual:External_editors Ohje])',
 
 # Dates
 'sunday' => 'pyhä',
@@ -378,6 +377,9 @@ Merkinät: (nyk.) = eroavaisuuet nykyisheen versuunhiin, (eel.) = eroavaisuuet e
 'prefs-help-email' => 'E-postin atressi on vapa, mutta tekkee maholiseks ette lähättää sulle salasanan meilissä, jos unhoutat sen.',
 'prefs-help-email-others' => 'Saatat kans antaa muitten käyttäjitten ottaa ottaa yhteyttä sinhuun sähköpostila. Sin atressi ei näy toisen käyttäjän ottaessa sinhuun yhteyttä.',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Uuitten käyttäjitten loki',
+
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'mookkaa tätä sivua',
 
@@ -486,13 +488,10 @@ Tiot [$2 fiilin kuvvaussivulta] näkyvät tässä alla.',
 # Special:LinkSearch
 'linksearch-line' => '$1 on linkattu sivulta $2',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Uuitten käyttäjitten loki',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(jäsenlista)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Lähätä e-posti tälle käyttäjälle',
 
 # Watchlist
index ed66796..e9738ea 100644 (file)
@@ -112,58 +112,57 @@ $linkTrail = '/^([áðíóúýæøa-z]+)(.*)$/sDu';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Undurstrika ávísingar',
-'tog-justify' => 'Stilla greinpart',
-'tog-hideminor' => 'Goym minni broytingar í seinast broytt listanum',
-'tog-hidepatrolled' => 'Goym eftirkannaðar rættingar í seinastu broytingum',
+'tog-underline' => 'Undirstrika leinki:',
+'tog-justify' => 'Lat tekstin fáa javnan kant til høgru',
+'tog-hideminor' => 'Krógva minni broytingar í seinastu broytingum',
+'tog-hidepatrolled' => 'Krógva eftirkannaðar rættingar í seinastu broytingum',
 'tog-newpageshidepatrolled' => 'Goym eftirkannaðar síður frá listanum yvir nýggjar síður',
 'tog-extendwatchlist' => 'Víðka eftirlitslistan fyri at vísa allar broytingar, ikki bara tær seinastu',
 'tog-usenewrc' => 'Bólkað broytingar eftir síðu í seinastu rættingar og eftirlitslita (krevur JavaScript)',
-'tog-numberheadings' => 'Sjálvtalmerking av yvirskrift',
-'tog-showtoolbar' => 'Vís amboðslinju í rætting',
-'tog-editondblclick' => 'Rætta síðu við at tvíklikkja (JavaScript)',
-'tog-editsection' => 'Rætta greinpart við hjálp av [rætta]-ávísing',
-'tog-editsectiononrightclick' => 'Rætta greinpart við at høgraklikkja á yvirskrift av greinparti (JavaScript)',
-'tog-showtoc' => 'Vís innihaldsyvurlit (Til greinir við meira enn trimun greinpartum)',
-'tog-rememberpassword' => 'Minst til loyniorð á hesum kaga (í mesta lagi $1 {{PLURAL:$1|dag|dagar}})',
+'tog-numberheadings' => 'Sjálvvirkandi talmerking av yvirskriftum',
+'tog-showtoolbar' => 'Vís rættingar tóllinju (krevur JavaScript)',
+'tog-editondblclick' => 'Rætta síður við at tvíklikkja (krevur JavaScript)',
+'tog-editsection' => 'Rætta greinpart við hjálp av [rætta] leinkjum',
+'tog-editsectiononrightclick' => 'Rætta greinpart við at høgraklikkja á yvirskrift av greinparti (krevur JavaScript)',
+'tog-showtoc' => 'Vís innihaldsyvirlit (fyri síður við meira enn trimun yvirskriftum)',
+'tog-rememberpassword' => 'Minst til mítt loyniorð á hesum kaga (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})',
 'tog-watchcreations' => 'Legg síður, sum eg stovni og fílur sum eg leggi út, afturat mínum eftirlitslista',
 'tog-watchdefault' => 'Legg síður sum eg rætti afturat mínum eftirlitslista',
 'tog-watchmoves' => 'Legg síður og fílur, sum eg flyti, afturat mínum eftirlitslista',
 'tog-watchdeletion' => 'Legg síður og fílur, sum eg striki, afturat mínum eftirlitslista',
 'tog-minordefault' => 'Merk sum standard allar broytingar sum smærri',
 'tog-previewontop' => 'Vís forhondsvísning áðren rættingarkassan',
-'tog-previewonfirst' => 'Sýn forskoðan við fyrstu broyting',
+'tog-previewonfirst' => 'Vís forskoðan við fyrstu rætting',
 'tog-nocache' => 'Deaktivera síðu "caching" í brovsaranum',
 'tog-enotifwatchlistpages' => 'Send mær teldupost, tá ein síða ella fíla á mínum eftirlitslista er broytt',
-'tog-enotifusertalkpages' => 'Send mær teldubræv, tá mín brúarasíða er broytt',
+'tog-enotifusertalkpages' => 'Send mær teldubræv, tá mín brúkarasíða er broytt',
 'tog-enotifminoredits' => 'Send mær eisini ein teldupost viðvíkjandi smærri broytingum á síðum og fílum',
 'tog-enotifrevealaddr' => 'Avdúkað mína teldupost adressu í fráboðanar teldupostum',
 'tog-shownumberswatching' => 'Vís tal av brúkarum sum fylgja við',
 'tog-oldsig' => 'Verandi undirskrift:',
 'tog-fancysig' => 'Viðgerð undirskriftina sum wikitekstur (uttan sjálvvirkandi leinkju)',
-'tog-externaleditor' => 'Nýt útvortis ritil sum fyrimynd (bert fyri fólk við serkunnleika, tað er tørvur á serligum innstillingum á tínari teldu. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Nýt útvortis diff sum fyrimynd (bert fyri serfrøðingar, tín telda tørvar serligar innstillingar. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-showjumplinks' => 'Ger "far til"-tilgongd virkna',
+'tog-showjumplinks' => 'Ger leinkuna "far til" virknað',
 'tog-uselivepreview' => 'Nýt "live preview" (tørvar JavaScript) (á royndarstøði)',
 'tog-forceeditsummary' => 'Gev mær boð, um eg ikki havi skrivað ein samandrátt um mína rætting',
 'tog-watchlisthideown' => 'Fjal mínar rættingar frá eftirliti',
-'tog-watchlisthidebots' => 'Fjal bot rættingar frá eftirliti',
-'tog-watchlisthideminor' => 'Fjal minni rættingar frá eftirliti',
+'tog-watchlisthidebots' => 'Vís ikki rættingar frá botti í eftirlitslistanum',
+'tog-watchlisthideminor' => 'Fjal minni rættingar frá eftirlitslita',
 'tog-watchlisthideliu' => 'Goym broytingar sum eru gjørdar av brúkarum, sum eru loggaðir á, frá hyggjaralistanum',
-'tog-watchlisthideanons' => 'Goym broytingar sum eru gjørdar av dulnevndum brúkarum frá hyggjaralistanum',
+'tog-watchlisthideanons' => 'Krógva broytingar sum eru gjørdar av dulnevndum brúkarum frá eftirlitslistanum',
 'tog-watchlisthidepatrolled' => 'Fjal eftirhugdar broytingar frá eftirlitslistanum',
-'tog-ccmeonemails' => 'Send mær avrit av teldubrøvum, sum eg sendi til aðrir brúkarar',
-'tog-diffonly' => 'Vís ikki innihaldið av síðuni undir diffs',
+'tog-ccmeonemails' => 'Send mær avrit av teldubrøvum, sum eg sendi til aðrar brúkarar',
+'tog-diffonly' => 'Vís ikki innihaldið av síðuni undir broytingum',
 'tog-showhiddencats' => 'Vís goymdir bólkar',
-'tog-norollbackdiff' => 'Síggj burtur frá diff eftir eina afturrulling',
+'tog-norollbackdiff' => 'Vís ikki munin eftir eina afturrulling',
+'tog-useeditwarning' => 'Ávara meg, tá ið eg fari frá einari rættingarsíðu, sum hevur broytingar ið ikki eru goymdar.',
 
 'underline-always' => 'Altíð',
 'underline-never' => 'Ongantíð',
-'underline-default' => 'Standard fyri útsjónd og kaga',
+'underline-default' => 'Standard fyri útsjónd ella kaga',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Rættað økið typografi:',
-'editfont-default' => 'Kagi (brovsari) standard',
+'editfont-style' => 'Skriftstílur við rætting:',
+'editfont-default' => 'Standard kagi',
 'editfont-monospace' => 'Føst breidd (monospaced font)',
 'editfont-sansserif' => 'Sans-serif skrift',
 'editfont-serif' => 'Serif skrift',
@@ -222,11 +221,11 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Bólkur|Bólkar}}',
-'category_header' => 'Greinir í bólki "$1"',
-'subcategories' => 'Undirbólkur',
-'category-media-header' => 'Media í bólkur "$1"',
+'category_header' => 'Síður í bólki "$1"',
+'subcategories' => 'Undirbólkar',
+'category-media-header' => 'Miðlar í bólki "$1"',
 'category-empty' => "''Hesin bólkur inniheldur ongar greinir ella miðlar í løtuni.''",
-'hidden-categories' => '{{PLURAL:$1|Hidden category|Fjaldir bólkar}}',
+'hidden-categories' => '{{PLURAL:$1|Fjaldur bólkur|Fjaldir bólkar}}',
 'hidden-category-category' => 'Fjaldir bólkar',
 'category-subcat-count' => '{{PLURAL:$2|Hesin bólkur hevur bert henda undirbólk.|Hesin bólkur hevur fylgjandi {{PLURAL:$1|undirbólk|$1 undirbólkar}}, av $2 í alt.}}',
 'category-subcat-count-limited' => 'Hesin bólkur hevur fylgjandi {{PLURAL:$1|undirbólk|$1 undirbólkar}}.',
@@ -244,16 +243,16 @@ $messages = array(
 'newwindow' => '(kemur í nýggjan glugga)',
 'cancel' => 'Ógilda',
 'moredotdotdot' => 'Meira...',
-'morenotlisted' => 'Meira, ið ikki verður víst',
+'morenotlisted' => 'Meira, sum ikki er nevnt her...',
 'mypage' => 'Síða',
 'mytalk' => 'Kjak',
-'anontalk' => 'Kjak til hesa ip-adressuna',
+'anontalk' => 'Kjak til hesa IP-adressuna',
 'navigation' => 'Navigatión',
 'and' => '&#32;og',
 
 # Cologne Blue skin
 'qbfind' => 'Finn',
-'qbbrowse' => 'Kaga',
+'qbbrowse' => 'Leita',
 'qbedit' => 'Rætta',
 'qbpageoptions' => 'Henda síðan',
 'qbmyoptions' => 'Mínar síður',
@@ -267,11 +266,11 @@ $messages = array(
 'vector-action-move' => 'Flyt',
 'vector-action-protect' => 'Friða',
 'vector-action-undelete' => 'Endurstovna',
-'vector-action-unprotect' => 'Broyt friðing',
+'vector-action-unprotect' => 'Broyt verju',
 'vector-simplesearch-preference' => 'Ger lættari leititeig virknan (bert Vector útsjónd)',
 'vector-view-create' => 'Stovna',
 'vector-view-edit' => 'Rætta',
-'vector-view-history' => 'Søga',
+'vector-view-history' => 'Vís søgu',
 'vector-view-view' => 'Les',
 'vector-view-viewsource' => 'Vís keldu',
 'actions' => 'Gerningar',
@@ -285,22 +284,22 @@ $messages = array(
 'help' => 'Hjálp',
 'search' => 'Leita',
 'searchbutton' => 'Leita',
-'go' => 'Far til',
+'go' => 'Far',
 'searcharticle' => 'Far',
-'history' => 'Síðusøga',
+'history' => 'Søgan hjá síðuni',
 'history_short' => 'Søga',
 'updatedmarker' => 'dagført síðan mína seinastu vitjan',
 'printableversion' => 'Prentvinarlig útgáva',
 'permalink' => 'Støðug slóð',
 'print' => 'Prenta',
-'view' => 'Les',
+'view' => 's',
 'edit' => 'Rætta',
 'create' => 'Stovna',
 'editthispage' => 'Rætta hesa síðuna',
 'create-this-page' => 'Stovna hesa síðuna',
 'delete' => 'Strika',
 'deletethispage' => 'Strika hesa síðuna',
-'undelete_short' => 'Ógilda striking av {{PLURAL:$1|broyting|$1 broytingar}}',
+'undelete_short' => 'Ógilda striking av {{PLURAL:$1|einari rætting|$1 broytingum}}',
 'viewdeleted_short' => 'Vís {{PLURAL:$1|eina strikaða broyting|$1 strikaðar broytingar}}',
 'protect' => 'Friða',
 'protect_change' => 'broyt',
@@ -310,22 +309,22 @@ $messages = array(
 'newpage' => 'Nýggj síða',
 'talkpage' => 'Kjakast um hesa síðuna',
 'talkpagelinktext' => 'Kjak',
-'specialpage' => 'Serlig síða',
+'specialpage' => 'Serstøk síða',
 'personaltools' => 'Persónlig amboð',
 'postcomment' => 'Nýtt brot',
-'articlepage' => 'Skoða innihaldssíðuna',
+'articlepage' => 'Vís síðu við innihaldi',
 'talk' => 'Kjak',
 'views' => 'Skoðanir',
-'toolbox' => 'Amboð',
-'userpage' => 'Vís brúkarisíðu',
+'toolbox' => 'Amboðskassi',
+'userpage' => 'Vís brúkarasíðu',
 'projectpage' => 'Vís verkætlanarsíðu',
-'imagepage' => 'Vís síðu við fílum',
-'mediawikipage' => 'Vís kervisboðsíðu',
-'templatepage' => 'Vís fyrimyndsíðu',
-'viewhelppage' => 'Vís hjálpsíðu',
-'categorypage' => 'Vís bólkursíðu',
+'imagepage' => 'Vís fílusíðuna',
+'mediawikipage' => 'Vís síðu við boðum',
+'templatepage' => 'Vís fyrimyndasíðu',
+'viewhelppage' => 'Vís hjálparsíðu',
+'categorypage' => 'Vís bólkasíðu',
 'viewtalkpage' => 'Vís kjak',
-'otherlanguages' => 'Onnur mál',
+'otherlanguages' => 'Á øðrum málum',
 'redirectedfrom' => '(Ávíst frá $1)',
 'redirectpagesub' => 'Ávísingarsíða',
 'lastmodifiedat' => 'Hendan síðan var seinast broytt $2, $1.',
@@ -339,7 +338,7 @@ Ov nógvir brúkarir royna at síggja hesa síðuna.
 Vinarliga bíða eina løtu, áðrenn tú roynir enn einaferð at fáa atgongd til hesa síðuna.
 
 $1',
-'pool-timeout' => 'Støðgur bíða verður eftir lásinum',
+'pool-timeout' => 'Støðgur, bíða verður eftir lásinum',
 'pool-queuefull' => 'Køin til "hylin" er full',
 'pool-errorunknown' => 'Ókend villa',
 
@@ -347,19 +346,19 @@ $1',
 'aboutsite' => 'Um {{SITENAME}}',
 'aboutpage' => 'Project:Um',
 'copyright' => 'Innihald er tøkt undir $1.',
-'copyrightpage' => '{{ns:project}}:Útgávurættur',
-'currentevents' => 'Núverandi hendingar',
-'currentevents-url' => 'Project:Núverandi hendingar',
+'copyrightpage' => '{{ns:project}}:Upphavsrættur',
+'currentevents' => 'Aktuellar hendingar',
+'currentevents-url' => 'Project:Aktuellar hendingar',
 'disclaimers' => 'Fyrivarni',
-'disclaimerpage' => 'Project:Fyrivarni',
-'edithelp' => 'Rættihjálp',
-'edithelppage' => 'Help:Rættihjálp',
+'disclaimerpage' => 'Project:Generelt fyrivarni',
+'edithelp' => 'Rættingarhjálp',
+'edithelppage' => 'Help:Rætting',
 'helppage' => 'Help:Innihald',
 'mainpage' => 'Forsíða',
 'mainpage-description' => 'Forsíða',
 'policy-url' => 'Project:Handfaring av persónligum upplýsingum',
-'portal' => 'Forsíða fyri høvundar',
-'portal-url' => 'Project:Forsíða fyri høvundar',
+'portal' => 'Brúkaraportalur',
+'portal-url' => 'Project:Brúkaraportalur',
 'privacy' => 'Handfaring av persónligum upplýsingum',
 'privacypage' => 'Project:Handfaring av persónligum upplýsingum',
 
@@ -372,7 +371,7 @@ $1',
 Sí [[Special:Version|versjón síða]].',
 
 'ok' => 'Í lagi',
-'retrievedfrom' => 'Heinta frá "$1"',
+'retrievedfrom' => 'Heintað frá "$1"',
 'youhavenewmessages' => 'Tú hevur $1 ($2).',
 'newmessageslink' => 'nýggj boð',
 'newmessagesdifflink' => 'seinasta broyting',
@@ -407,7 +406,7 @@ Sí [[Special:Version|versjón síða]].',
 'sort-ascending' => 'Bólkað hækkandi',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Grein',
+'nstab-main' => 'Síða',
 'nstab-user' => 'Brúkarasíða',
 'nstab-media' => 'Miðil',
 'nstab-special' => 'Serstøk síða',
@@ -528,9 +527,18 @@ Legg til merkis, at summar síður framvegis vera vístar, sum um tú enn vart l
 'welcomecreation-msg' => 'Tín konta er nú stovnað.
 Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].',
 'yourname' => 'Títt brúkaranavn:',
+'userlogin-yourname' => 'Brúkaranavn',
+'userlogin-yourname-ph' => 'Skriva títt brúkaranavn',
 'yourpassword' => 'Títt loyniorð:',
+'userlogin-yourpassword' => 'Loyniorð',
+'userlogin-yourpassword-ph' => 'Skriva títt loyniorð',
+'createacct-yourpassword-ph' => 'Skrivað eitt loyniorð',
 'yourpasswordagain' => 'Skriva loyniorð umaftur:',
+'createacct-yourpasswordagain' => 'Váttað loyniorðið',
+'createacct-yourpasswordagain-ph' => 'Skrivað loyniorðið enn einaferð',
 'remembermypassword' => 'Minst til logg inn hjá mær á hesum kaganum (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})',
+'userlogin-remembermypassword' => 'Minst til mín',
+'userlogin-signwithsecure' => 'Rita inn við tryggum ambætara',
 'securelogin-stick-https' => 'Varðveit sambandið við HTTPS eftir logg inn',
 'yourdomainname' => 'Títt domene:',
 'password-change-forbidden' => 'Tú kanst ikki broyta loyniorð á hesi wiki.',
@@ -543,18 +551,35 @@ Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].'
 'logout' => 'Útrita',
 'userlogout' => 'Rita út',
 'notloggedin' => 'Ikki ritað inn',
+'userlogin-noaccount' => 'Hevur tú ikki nakra kontu?',
+'userlogin-joinproject' => 'Meldað teg til {{SITENAME}}',
 'nologin' => "Hevur tú ikki eina kontu? '''$1'''.",
 'nologinlink' => 'Stovna eina kontu',
 'createaccount' => 'Stovna nýggja kontu',
 'gotaccount' => "Hevur tú longu eina kontu? '''$1'''.",
 'gotaccountlink' => 'Rita inn',
 'userlogin-resetlink' => 'Hevur tú gloymt tínar logg inn upplýsingar',
+'helplogin-url' => 'Help:Innritan',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjálp til innritan]]',
+'createacct-join' => 'Skrivað tínar upplýsingar niðanfyri.',
+'createacct-emailrequired' => 'Teldupost adressa',
+'createacct-emailoptional' => 'Teldupost adressa (valfrítt)',
+'createacct-email-ph' => 'Skrivað tína email adressu',
 'createaccountmail' => 'Nýt eitt fyribils tilvildarligt loyniorð og send tað til t-post adressuna niðanfyri',
+'createacct-realname' => 'Veruligt navn (valfrítt)',
 'createaccountreason' => 'Orsøk:',
+'createacct-reason' => 'Orsøk',
+'createacct-captcha' => 'Trygdarkekk',
+'createacct-imgcaptcha-ph' => 'Skriva tekstin ið tú sært omanfyri',
+'createacct-benefit-heading' => '{{SITENAME}} er gjørd av fólki sum tær.',
+'createacct-benefit-body1' => 'rættingar',
+'createacct-benefit-body2' => 'síður',
+'createacct-benefit-body3' => 'seinastu høvundar',
 'badretype' => 'Loyniorðið tú hevur skriva er ikki rætt.',
 'userexists' => 'Brúkaranavnið sum tú valdi er longu í nýtslu.
 Vinarliga vel eitt annað navn.',
 'loginerror' => 'Innritanarbrek',
+'createacct-error' => 'Feilur við skapan av konto',
 'createaccounterror' => 'Kundi ikki skapa kontu: $1',
 'nocookiesnew' => 'Brúkarakontan er nú gjørd, men tú ert ikki loggaður inn. 
 {{SITENAME}} brúkar "cookies" fyri at innrita brúkarar.
@@ -595,8 +620,8 @@ Vinarliga rita inn eftir at tú hevur fingið hana.',
 'blocked-mailpassword' => 'Tín IP adressa er stongd fyri at gera rættingar á síðum, og tí er tað ikki loyvt at brúka funkuna fyri endurskapan av loyniorði, hetta fyri at forða fyri misnýtslu.',
 'eauthentsent' => '↓ Ein váttanar t-postur er sendur til givna t-post bústaðin.
 Áðrenn aðrir teldupostar verða sendir til kontuna, mást tú fylgja leiðbeiningunum í t-postinum, fyri at vátta at kontoin veruliga er tín.',
-'throttled-mailpassword' => 'Ein teldupost við áminning um loyniorði er longu sendur fyri bert {{PLURAL:$1|tíma|$1 tímum}}.
-Fyri at fyribyrja misnýtslu, verður bert ein teldupostur við áminning um loyniorði sendur fyri hvønn/hvørjir {{PLURAL:$1|tíma|$1 tímar}}.',
+'throttled-mailpassword' => 'Ein teldupostur har loyniorðið verður nullstillað er longu sendur fyri bert {{PLURAL:$1|tíma|$1 tímum}} síðan.
+Fyri at fyribyrja misnýtslu, verður bert ein teldupostur við nullstillaðum loyniorði sendur fyri pr. {{PLURAL:$1|tíma|$1 tímar}}.',
 'mailerror' => 'Villa tá t-postur var sendur: $1',
 'acct_creation_throttle_hit' => 'Vitjandi á hesi wiki, sum nýta tína IP addressu, hava stovnað {{PLURAL:$1|1 kontu|$1 kontur}} seinastu dagarnar, sum er mest loyvda hetta tíðarskeið.
 Sum eitt úrslit av hesum, kunnu vitjandi sum brúka hesa IP adressuna ikki stovna fleiri kontur í løtuni.',
@@ -649,9 +674,10 @@ Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyri
 
 # Special:PasswordReset
 'passwordreset' => 'Nullstilla loyniorðið',
-'passwordreset-text' => 'Útfyll hetta skjalið fyri at fáa eina áminning við t-posti við tínum konto upplýsingum.',
+'passwordreset-text' => 'Útfyll hetta skjalið fyri at nullstilla títt loyniorð.',
 'passwordreset-legend' => 'Nulstilla loyniorðið',
 'passwordreset-disabled' => 'Tað ber ikki til at nullstilla loyniorðið á hesi wiki.',
+'passwordreset-emaildisabled' => 'Teldupost funksjónir eru óvirknar á hesi wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Skriva ein av upplýsingunum niðanfyri}}',
 'passwordreset-username' => 'Brúkaranavn:',
 'passwordreset-domain' => 'Umdømi (domain):',
@@ -659,29 +685,25 @@ Møguliga hevur tú longu broytt títt loyniorð ella biðið um eitt nýtt fyri
 'passwordreset-capture-help' => 'Um tú setir kross við henda teigin, so verður t-posturin (við fyribils loyniorðinum) vístur fyri tær og verður harumframt sendur til brúkaran.',
 'passwordreset-email' => 'T-post adressur:',
 'passwordreset-emailtitle' => 'konto upplýsingar á {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Onkur (óiva tú, frá IP adressu $1) hevur biðið um eina áminning av tínum konto upplýsingum fyri {{SITENAME}} ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}}
-sett í samband við hesa t-post adressu:
+'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}}
+settar í samband við hesa t-post adressu:
 
 $2
 
 {{PLURAL:$3|Hetta fyribils loyniorðið|Hesi fyribils loyniorðini}} ganga út um {{PLURAL:$5|ein dag|$5 dagar}}.
-Tú 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 áminning av tínum konto upplýsingum fyri {{SITENAME}}
+Tú 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}} 
 ($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}} settar í samband við hesa t-post adressuna:
 
 $2
 
 {{PLURAL:$3|Hetta fyribils loyniorðið|Hesi fyribils loyniorðini}} ganga út um {{PLURAL:$5|ein dag|$5 dagar}}.
-Tú 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ð.',
+Tú 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
 Fyribils loyniorð: $2',
-'passwordreset-emailsent' => 'Ein áminningar teldupostur er blivin sendur.',
-'passwordreset-emailsent-capture' => 'Ein áminningar teldupostur er blivin sendur, sum víst niðanfyri.',
-'passwordreset-emailerror-capture' => 'Ein áminningar teldupostur var gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til brúkaran: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Broyt teldupost adressu',
@@ -901,10 +923,14 @@ Tað sær út til at hon er blivin strikað.',
 'edit-already-exists' => 'Tað var ikki møguligt at upprætta nýggja síðu.
 Síðan er longu til.',
 'defaultmessagetext' => 'Standard boðtekstur',
+'content-failed-to-parse' => 'Kláraði ikki at tulka $2 innihaldi fyri $1 modell: $3',
 'invalid-content-data' => 'Ógyldug innihalds dáta',
 'content-not-allowed-here' => '"$1" innihald er ikki loyvt á síðu [[$2]]',
+'editwarning-warning' => 'Um tú fert frá hesi síðuni, so kanst tú missa tær broytingar ið tú hevur gjørt.
+Um tú hevur ritað inn, so kanst tú sláa hesa ávaring frá í "Rættingar" partinum í tínum innstillingum.',
 
 # Content models
+'content-model-wikitext' => 'wikitekst',
 'content-model-text' => 'simpul tekstur',
 'content-model-javascript' => 'JavaScript',
 'content-model-css' => 'CSS',
@@ -1134,14 +1160,6 @@ Tú kanst royna at brúka ''all:'' sum fyrsta stavilsi fyri at søkja í øllum
 Tú kanst leita via Google ímeðan.
 Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og ikki dagført.',
 
-# Quickbar
-'qbsettings' => 'Skundfjøl innstillingar',
-'qbsettings-none' => 'Eingin',
-'qbsettings-fixedleft' => 'Fast vinstru',
-'qbsettings-fixedright' => 'Fast høgru',
-'qbsettings-floatingleft' => 'Flótandi vinstru',
-'qbsettings-floatingright' => 'Flótandi høgra',
-
 # Preferences page
 'preferences' => 'Innstillingar',
 'mypreferences' => 'Innstillingar',
@@ -1150,7 +1168,10 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'changepassword' => 'Broyt loyniorð',
 'prefs-skin' => 'Hamur',
 'skin-preview' => 'Forskoðan',
+'datedefault' => 'Ongi serlig ynskir',
+'prefs-beta' => 'Betafunktiónir',
 'prefs-datetime' => 'Dato og tíð',
+'prefs-labs' => 'Testfunktiónir',
 'prefs-user-pages' => 'Brúkarasíður',
 'prefs-personal' => 'Brúkaradáta',
 'prefs-rc' => 'Nýkomnar broytingar og stubbaskoðan',
@@ -1175,14 +1196,17 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 'columns' => 'Teigar:',
 'searchresultshead' => 'Leita',
 'resultsperpage' => 'Úrslit fyri hvørja síðu:',
+'stub-threshold' => 'Avmarkað til <a href="#" class="stub">stubba leinki</a> formatering (bytes):',
 'stub-threshold-disabled' => 'Er gjørt óvirki',
 'recentchangesdays' => 'Dagar av vísa í seinastu broytingum:',
 'recentchangesdays-max' => 'Í mesta lagi $1 {{PLURAL:$1|dagur|dagar}}',
 'recentchangescount' => 'Tal av rættingum at vísa í standard:',
+'prefs-help-recentchangescount' => 'Íroknað seinastu broytingar, søgur hjá síðum og loggar.',
 'savedprefs' => 'Tínar innstillingar eru goymdar.',
 'timezonelegend' => 'Tíðar sona:',
 'localtime' => 'Lokal tíð:',
 'timezoneuseserverdefault' => 'Nýt wiki standard: ($1)',
+'timezoneuseoffset' => 'Annað (skrivað munin)',
 'timezoneoffset' => 'Offset¹:',
 'servertime' => 'Servara tíð:',
 'guesstimezone' => 'Fyll út við kagara',
@@ -1218,6 +1242,8 @@ Tú kanst ikki angra, tá tað fyrst er gjørt.',
 'yourlanguage' => 'Mál til brúkaraflatu:',
 'yournick' => 'Nýggj undirskrift:',
 'prefs-help-signature' => 'Viðmerkingar á kjaksíðum eiga at vera undirskrivaðar við "<nowiki>~~~~</nowiki>", sum verður gjørt um til tína undirskrift og eitt dagfestingarmerki.',
+'badsig' => 'Ógyldug ráð undirskrift.
+Eftirkannað HTML.',
 'badsiglength' => 'Tín undirskrift er ov long. 
 Hon má ikki hava meira enn $1 {{PLURAL:$1|tekn|tekn}}',
 'yourgender' => 'Kyn:',
@@ -1268,9 +1294,11 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'userrights-reason' => 'Orsøk:',
 'userrights-no-interwiki' => 'Tú hevur ikki loyvi til at rætta brúkara rættindi á øðrum wikium.',
 'userrights-nodatabase' => 'Dátugrunnurin $1 er ikki til ella er hann ikki lokalur.',
+'userrights-nologin' => 'Tú mást [[Special:UserLogin|rita inn]] sum administrator fyri at kunna áseta brúkararættindi.',
 'userrights-notallowed' => 'Tín konto hevur ikki loyvi til at seta ella taka burtur brúkara rættindi.',
 'userrights-changeable-col' => 'Bólkar sum tú kanst broyta',
 'userrights-unchangeable-col' => 'Bólkar, ið tú ikki kanst broyta',
+'userrights-conflict' => 'Ósamsvar viðvíkjandi brúkararættindum! Vinarliga royn aftur at goyma tínar broytingar.',
 
 # Groups
 'group' => 'Bólkur:',
@@ -1307,6 +1335,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'right-move-subpages' => 'Flyt síður saman við undirsíðum teirra',
 'right-move-rootuserpages' => 'Flyta høvuðs brúkarasíður',
 'right-movefile' => 'Flyt fílur',
+'right-suppressredirect' => 'Flyta síður uttan at upprætta víðaristilling frá tí gomlu síðuni.',
 'right-upload' => 'Legg upp fílur',
 'right-reupload' => 'Yvirskriva verandi fílur',
 'right-reupload-own' => 'Yvirskriva verandi fílur, sum tú hevur lagt upp',
@@ -1316,6 +1345,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'right-bigdelete' => 'Strika síður við nógvum versjónum',
 'right-browsearchive' => 'Leita í strikaðum síðum',
 'right-undelete' => 'Endurstovnað eina síðu',
+'right-suppressionlog' => 'Vís privatar loggar',
 'right-block' => 'Nokta øðrum brúkarum at rætta (blokka)',
 'right-blockemail' => 'Nokta einum brúkara at senda teldupost',
 'right-hideuser' => 'Sperra eitt brúkaranavn og goyma tað burtur fyri almenninginum',
@@ -1361,6 +1391,8 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'action-undelete' => 'endurstovnað hesa síðu',
 'action-block' => 'noktað hesum brúkara at rætta',
 'action-protect' => 'broyt verjustøðuna hjá hesi síðu',
+'action-patrol' => 'markað rætting hjá øðrum sum eftirhugda',
+'action-autopatrol' => 'fá tina rætting merkta sum eftirhugda',
 'action-unwatchedpages' => 'Síggj listan yvir síður sum ikki eru eftiransaðar',
 'action-mergehistory' => 'samanflætta søguna hjá hesi síðu',
 'action-userrights' => 'broyt øll brúkaraloyvi',
@@ -1390,13 +1422,14 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'rclinks' => 'Sýn seinastu $1 broytingarnar seinastu $2 dagarnar<br />$3',
 'diff' => 'munur',
 'hist' => 'søga',
-'hide' => 'Fjal',
-'show' => 'Skoða',
+'hide' => 'Goym',
+'show' => 'Vís',
 'minoreditletter' => 's',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'number_of_watching_users_pageview' => '[$1 ansar eftir {{PLURAL:$1|brúkara|brúkarum}}]',
 'rc_categories_any' => 'Nakar',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} eftir broyting',
 'newsectionsummary' => '/* $1 */ nýtt innlegg',
 'rc-enhanced-expand' => 'Vís smálutir (krevur JavaScript)',
 'rc-enhanced-hide' => 'Goym smálutir',
@@ -1473,11 +1506,18 @@ henda fílin er $2.',
 Frágreiðingin sum tú hevur skrivað kemur ikki at síggjast á síðuni.
 Fyri at tín frágreiðing skal síggjast á síðuni, noyðist tú at skriva tað manuelt.
 [[$1|thumb]]',
+'fileexists-extension' => 'Ein fíla við líknandi navni finst longu: [[$2|thumb]]
+* Heitið á fíluni tú leggur út: <strong>[[:$1]]</strong>
+* Heitið á fílu ið longu finst: <strong>[[:$2]]</strong>
+Vinarliga vel eitt annað navn.',
 'file-deleted-duplicate' => 'Ein fíla, sum er líka sum henda ([[:$1]]) er fyrr blivin strikað.
 Tú eigur at kanna eftir strikingarsøguna hjá hesi fílu, áðrenn tú heldur áframm við at leggja hana út enn einaferð.',
 'uploadwarning' => 'Ávaring',
 'savefile' => 'Goym fílu',
 'uploadedimage' => 'sent "[[$1]]" upp',
+'uploadvirus' => 'Fílan inniheldur ein virus!
+Smálutir: $1',
+'upload-source' => 'Keldufíla',
 'sourcefilename' => 'Kelda fílunavn:',
 'sourceurl' => 'Kelda URL:',
 'destfilename' => 'Destinatión fílunavn:',
@@ -1487,13 +1527,32 @@ Tú eigur at kanna eftir strikingarsøguna hjá hesi fílu, áðrenn tú heldur
 'watchthisupload' => 'Halt eyga við hesi fílu',
 'filewasdeleted' => 'Ein fíla við hesum heitinum hevur fyrr verið upplóta og er seinni blivin strikað.
 Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn einaferð.',
+'filename-bad-prefix' => "Navnið á fíluni ið tú leggur út byrjar við '''\"\$1\"''', sum er eitt ikki-frágreiðandi navn, slík verða ofta givin sjálvvirkandi av talgildm myndatólum.
+Vinarliga vel eitt navn ið greiður eitt sindur frá til tína fílu.",
 'upload-success-subj' => 'Upplegging væleydnað',
+'upload-success-msg' => 'Tín útlegging frá [$2] eydnaðist væl. Hon er tøk her: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Trupulleiki við útlegging',
+'upload-failure-msg' => 'Har var ein trupulleiki við tínari útleggin frá [$2]:
+
+$1',
+'upload-warning-subj' => 'Ávaring um upplótan',
 
 'upload-file-error' => 'Innvortis brek',
+'upload-misc-error' => 'Ókend villa tá tú legði út',
+'upload-misc-error-text' => "Ein ókend villa fór fram meðan tú legði út.
+Vinariga vátta, at URL'urin er gyldugur og atkomuligur og royn aftur.
+Um trupulleikin heldur fram, set teg so vinarliga í samband við ein [[Special:ListUsers/sysop|administrator]].",
+'upload-too-many-redirects' => "URL'urin innihelt ov nógvar umdirigeringar",
 'upload-unknown-size' => 'Ókend stødd',
+'upload-http-error' => 'Ein HTTP villa hendi: $1',
+'upload-copy-upload-invalid-domain' => 'Upplótan av avritum ber ikki til frá hesum domeninum.',
 
 # File backend
+'backend-fail-stream' => 'Tað bar ikki til at stroyma fílu "$1".',
+'backend-fail-backup' => 'Tað bar ikki til at taka backup av fílu "$1".',
 'backend-fail-notexists' => 'Fílan $1 er ikki til.',
+'backend-fail-notsame' => 'Ein ikki-eins fíla finst longu á "$1".',
+'backend-fail-alreadyexists' => 'Fílan "$1" finst longu.',
 'backend-fail-store' => 'Kundi ikki goyma fílu $1 á $2.',
 'backend-fail-copy' => 'Kundi ikki avrita fílu $1 til $2.',
 'backend-fail-move' => 'Kundi ikki flyta fílu $1 til $2.',
@@ -1502,6 +1561,7 @@ Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn e
 'backend-fail-closetemp' => 'Kundi ikki aftur fyribils fílu.',
 'backend-fail-read' => 'Kundi ikki lesa fílu $1.',
 'backend-fail-create' => 'Kundi ikki skriva fílu $1.',
+'backend-fail-maxsize' => 'Tað bar ikki til at lesa fíluna "$1" tí hon er størri enn {{PLURAL:$2|eitt byte|$2 bytes}}.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Kundi ikki lata upp "$1"; hon er ikki stongd.',
@@ -1511,6 +1571,9 @@ Tú eigur at eftirkanna $1 áðrenn tú heldur á við at upplóta fíluna enn e
 'lockmanager-fail-openlock' => 'Kundi ikki læsa upp fíluna til: "$1".',
 'lockmanager-fail-releaselock' => 'Kundi ikki læsa upp læsingina fyri: "$1".',
 
+# Special:UploadStash
+'uploadstash-refresh' => 'Uppfrískað listan við fílum',
+
 # img_auth script messages
 'img-auth-accessdenied' => 'Atgongd noktað',
 'img-auth-nologinnWL' => 'Tú ert ikki ritað/ur inn, og "$1" er ikki á hvítalista.',
@@ -1528,7 +1591,6 @@ Bert fílu atgongd er loyvd.',
 'http-read-error' => 'HTTP lesifeilur.',
 'http-timed-out' => 'HTTP fyrispurningurin tók ov langa tíð.',
 'http-curl-error' => 'Feilur meðan vit heintaðu URL: $1',
-'http-host-unreachable' => 'Internetadressan er ikki atkomulig.',
 'http-bad-status' => 'Tað hendi ein feilur undir viðgerðini av HTTP fyrispurnininum: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1561,7 +1623,7 @@ Tú kanst eisini royna aftur, tá tað ikki eru so nógv í gongd her í senn.',
 
 # File description page
 'file-anchor-link' => 'Mynd',
-'filehist' => 'Søga fílu',
+'filehist' => 'Søgan hjá fíluni',
 'filehist-help' => 'Trýst á dato/tíð fyri at síggja fíluna, sum hon sá út tá.',
 'filehist-deleteall' => 'strika alt',
 'filehist-deleteone' => 'strika',
@@ -1584,17 +1646,33 @@ Ein [[Special:WhatLinksHere/$2|fullur listi]] er tøkur.',
 'nolinkstoimage' => 'Ongar síður slóða til hesa myndina.',
 'morelinkstoimage' => 'Sí [[Special:WhatLinksHere/$1|fleiri leinkjur]] til hesa fílu.',
 'linkstoimage-redirect' => '$1 (fílu víðaristilling) $2',
+'duplicatesoffile' => 'Henda {{PLURAL:$1|fílan er eitt avrit|$1 fílur eru avrit}} av hesi fílu ([[Special:FileDuplicateSearch/$2|meira kunning]]):',
+'sharedupload' => 'Henda fílan er frá $1 og kann verða brúkt av øðrum verkætlanum.',
+'sharedupload-desc-there' => 'Henda fílan er frá $1 og kann verða brúkt av øðrum verkætlanum.
+Vinarliga hygg at [$2 fílu frágreiðingarsíðu] fyri nærri kunning.',
 'sharedupload-desc-here' => 'Henda fíla er frá $1 og kann verða brúka í øðrum verkætlanum.
 Frágreiðingin á [$2 fílu frágreiðingar síðu] er víst her niðanfyri.',
+'filepage-nofile' => 'Ongin fíla við hesum navninum finst.',
+'filepage-nofile-link' => 'Ongin fíla við hesum navninum finst, men tú kanst [$1 leggja hana út].',
+'uploadnewversion-linktext' => 'Legg eina nýggja versjón av hesi fílu út',
 'shared-repo-from' => 'frá $1',
+'shared-repo' => 'eitt felags fíluarkiv',
+'upload-disallowed-here' => 'Tú kanst ikki yvirskriva hesa fílu.',
+
+# File reversion
+'filerevert-comment' => 'Orsøk:',
 
 # File deletion
 'filedelete' => 'Strika $1',
+'filedelete-legend' => 'Sletta fílu',
+'filedelete-intro' => "Tú ert í ferð við at sletta fíluna '''[[Media:$1|$1]]''' saman við allari søguni.",
+'filedelete-intro-old' => "Tú slettar versjón '''[[Media:$1|$1]]''' hin [$4 $3, $2].",
 'filedelete-comment' => 'Orsøk:',
 'filedelete-submit' => 'Strika',
 'filedelete-success' => "'''$1''' er blivin strikað.",
 'filedelete-success-old' => "Versjónin av '''[[Media:$1|$1]]''' frá kl. $3, hin $2 er blivið strikað.",
 'filedelete-nofile' => "'''$1''' er ikki til.",
+'filedelete-maintenance-title' => 'Ógjørligt at sletta fílu',
 
 # MIME search
 'mimesearch' => 'MIME-leit',
@@ -1650,7 +1728,7 @@ Víðaristilling verður nú gjørd til [[$2]].',
 'fewestrevisions' => 'Greinir við minstum útgávum',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|být|být}}',
+'nbytes' => '$1 {{PLURAL:$1|beit}}',
 'ncategories' => '$1 {{PLURAL:$1|bólkur|bólkar}}',
 'nlinks' => '$1 {{PLURAL:$1|slóð|slóðir}}',
 'nmembers' => '$1 {{PLURAL:$1|limur|limir}}',
@@ -1691,6 +1769,7 @@ Vinarliga legg merki til, at vevsíður kunnu slóða til eina fílu við beinle
 'notargettitle' => 'Onki mál',
 'pager-newer-n' => '{{PLURAL:$1|nýggjari 1|nýggjari $1}}',
 'pager-older-n' => '{{PLURAL:$1|eldri 1|eldri $1}}',
+'suppress' => 'Yvirlit',
 
 # Book sources
 'booksources' => 'Bókakeldur',
@@ -1767,7 +1846,7 @@ og hava virkandi teldupostadressu í [[Special:Preferences|innstillingum]] tínu
 fyri at senda teldupost til aðrar brúkarar.',
 'emailuser' => '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 brúkaran.
+'emailpagetext' => 'Tú kanst brúka skjalið niðanfyri til at senda ein teldupost til henda {{GENDER:$1|brúkara}}.
 Teldupost 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',
@@ -1792,13 +1871,10 @@ Teldupost adressan sum tú skrivaði í [[Special:Preferences|tíni brúkara yns
 'watchlistfor2' => 'Fyri $1 $2',
 'nowatchlist' => 'Tú hevur ongar lutir í eftirlitinum.',
 'watchnologin' => 'Tú hevur ikki ritað inn',
-'addedwatchtext' => "Síðan \"<nowiki>\$1</nowiki>\" er løgd undir [[Special:Watchlist|eftirlit]] hjá tær.
-Framtíðar broytingar á hesi síðu og tilknýttu kjaksíðuni verða at síggja her.
-Tá sæst síðan sum '''feit skrift''' í [[Special:RecentChanges|broytingaryvirlitinum]] fyri at gera hana lættari at síggja.
-
-Vilt tú flyta síðuna undan tínum eftirliti, kanst tú trýsta á \"Strika eftirlit\" á síðuni.",
+'addedwatchtext' => 'Síðan  "[[:$1]]" er løgd undir [[Special:Watchlist|eftirlitslistan]] hjá tær.
+Framtíðar broytingar á hesi síðu og tilknýttu kjaksíðuni verða at síggja har.',
 'removedwatchtext' => 'Síðan "[[:$1]]" er strikað úr [[Special:Watchlist|tínum eftirliti]].',
-'watch' => 'Eftirlit',
+'watch' => 'Eygleið',
 'watchthispage' => 'Hav eftirlit við hesi síðuni',
 'unwatch' => 'strika eftirlit',
 'notanarticle' => 'Ongin innihaldssíða',
@@ -1871,9 +1947,9 @@ broytti tað aftur til seinastu versjón hjá $2.',
 'protectcomment' => 'Orsøk:',
 'protectexpiry' => 'Gongur út:',
 'protect-default' => 'Loyv øllum brúkarum',
-'protect-fallback' => 'Krevur "$1" loyvi',
-'protect-level-autoconfirmed' => 'Sperra fyri nýggjum og ikki skrásettum brúkarum',
-'protect-level-sysop' => 'Bert umboðsstjórar',
+'protect-fallback' => 'Loyv bert brúkarum við "$1" loyvi',
+'protect-level-autoconfirmed' => 'Loyv bert autováttaðum brúkarum',
+'protect-level-sysop' => 'Loyv bert umboðsstjórum',
 'protect-expiring' => 'gongur út $1 (UTC)',
 'protect-expiry-options' => '1 tími:1 hour,1 dagur:1 day,1 vika:1 week,2 vikur:2 weeks,1 mánaður:1 month,3 mánaðir:3 months,6 mánaðir:6 months,1 ár:1 year,óendaligt:infinite',
 'restriction-type' => 'Verndstøða:',
@@ -1992,10 +2068,10 @@ at læsa dátugrunnin upp aftur tá ið viðgerðin er liðug.',
 Gamla navnið verður ein tilvísingarsíða til ta nýggju.
 Tú kanst dagføra tilvísingarsíður sum vísa til uppruna tittulin sjálvvirkandi.
 Um tú velur ikki at gera tað, ver so vís/ur í at eftirkanna [[Special:DoubleRedirects|dupultar]]  ella [[Special:BrokenRedirects|brotnar tilvísingarsíður]].
-Tú hevur ábyrgdina fyri at ansa eftir at slóðir framvegis fara hagar, tær skulu.
+Tú hevur ábyrgdina fyri at ansa eftir at slóðir framvegis peika hagar, tær skulu.
 
 Legg 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.
-Hetta 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.
+Hetta 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.
 
 '''ÁVARING!'''
 Hetta kann vera ein ógvuslig og óvæntað broyting av einari vældámdari síðu.
@@ -2035,7 +2111,7 @@ Grein við navninum "[[:$1]]" finst longu. Ynskir tú at strika hana til tess at
 'immobile-target-namespace' => 'Tað ber ikki til at flyta síður inn til navnaøkið "$1"',
 
 # Export
-'export' => 'Útflutningssíður',
+'export' => 'Útflyt síður',
 
 # Namespace 8 related
 'allmessages' => 'Øll kervisboð',
@@ -2065,10 +2141,10 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
 'tooltip-pt-preferences' => 'Tínar innstillingar',
 'tooltip-pt-watchlist' => 'Ein listi við síðum sum tú eftiransar fyri broytingum',
 'tooltip-pt-mycontris' => 'Yvirlit yvir títt íkast',
-'tooltip-pt-login' => 'Vit mæla til at tú ritar inn, men tað er ikki neyðugt.',
+'tooltip-pt-login' => 'Vit mæla til at tú ritar inn, tað er tó ikki eitt krav.',
 'tooltip-pt-anonlogin' => 'Vit mæla til at tú ritar inn, tað er tó ikki eitt krav',
 'tooltip-pt-logout' => 'Rita út',
-'tooltip-ca-talk' => 'Umrøða av innihaldssíðuni',
+'tooltip-ca-talk' => 'Kjak um innihaldssíðuna',
 'tooltip-ca-edit' => 'Tú kanst broyta hesa síðuna. Vinarliga nýt forskoðanarknøttin áðrenn tú goymir.',
 'tooltip-ca-addsection' => 'Byrja eitt nýtt brot',
 'tooltip-ca-viewsource' => 'Henda síðan er friðað. Tú kanst síggja keldukotuna.',
@@ -2077,19 +2153,19 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
 'tooltip-ca-delete' => 'Strika hesa síðuna',
 'tooltip-ca-undelete' => 'Endurnýggja skrivingina á hesi síðu áðrenn hon varð strikað',
 'tooltip-ca-move' => 'Flyt hesa síðuna',
-'tooltip-ca-watch' => 'Legg hesa síðuna undir mítt eftirlit',
+'tooltip-ca-watch' => 'Legg hesa síðuna til tín eftirlitslista',
 'tooltip-ca-unwatch' => 'Fá hesa síðuna úr mínum eftirliti',
 'tooltip-search' => 'Leita í {{SITENAME}}',
 'tooltip-search-go' => 'Far til síðu við júst hesum heiti, um hon er til',
 'tooltip-search-fulltext' => 'Leita eftir síðum sum innihalda henda  tekstin',
-'tooltip-p-logo' => 'Forsíða',
+'tooltip-p-logo' => 'Vitja forsíðuna',
 'tooltip-n-mainpage' => 'Vitja forsíðuna',
 'tooltip-n-mainpage-description' => 'Vitja forsíðuna',
 'tooltip-n-portal' => 'Um verkætlanina, hvat tú kanst gera, hvar tú finnur ymiskt',
 'tooltip-n-currentevents' => 'Finn bakgrundsupplýsingar um aktuellar hendingar',
-'tooltip-n-recentchanges' => 'Listi av teimum seinastu broytingunum í wikinum.',
+'tooltip-n-recentchanges' => 'Listi við teimum seinastu broytingunum í hesi wiki.',
 'tooltip-n-randompage' => 'Far til tilvildarliga síðu',
-'tooltip-n-help' => 'Staðurin at finna út.',
+'tooltip-n-help' => 'Staðið har tú fært hjálp',
 'tooltip-t-whatlinkshere' => 'Yvirlit yvir allar wikisíður, ið slóða higar',
 'tooltip-t-recentchangeslinked' => 'Broytingar á síðum, ið slóða higar, í seinastuni',
 'tooltip-feed-rss' => 'RSS-fóðurið til hesa síðuna',
@@ -2097,7 +2173,7 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
 'tooltip-t-contributions' => 'Skoða yvirlit yvir íkast hjá hesum brúkara',
 'tooltip-t-emailuser' => 'Send teldupost til henda brúkaran',
 'tooltip-t-upload' => 'Legg myndir ella miðlafílur upp',
-'tooltip-t-specialpages' => 'Yvirlit yvir serliga síður',
+'tooltip-t-specialpages' => 'Yvirlit yvir allar serliga síður',
 'tooltip-t-print' => 'Printvinarlig útgáva av hesi síðu',
 'tooltip-t-permalink' => 'Varandi ávísing til hesa útgávuna av hesi síðu',
 'tooltip-ca-nstab-main' => 'Skoða innihaldssíðuna',
@@ -2109,7 +2185,7 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
 'tooltip-ca-nstab-mediawiki' => 'Skoða kervisamboðini',
 'tooltip-ca-nstab-template' => 'Brúka formin',
 'tooltip-ca-nstab-help' => 'Skoða hjálparsíðuna',
-'tooltip-ca-nstab-category' => 'Skoða bólkasíðuna',
+'tooltip-ca-nstab-category' => 'Vís bólkasíðuna',
 'tooltip-minoredit' => 'Merk hetta sum eina lítil rætting',
 'tooltip-save' => 'Goym broytingar mínar',
 'tooltip-preview' => 'Nýt forskoðan fyri at síggja tínar broytingar, vinarliga nýt hetta áðrenn tú goymir!',
@@ -2131,15 +2207,13 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
 
 # Info page
 'pageinfo-title' => 'Kunning um "$1"',
-'pageinfo-header-edits' => 'Rættingar',
+'pageinfo-header-edits' => 'Rættingarsøga',
 'pageinfo-views' => 'Tal av skoðanum',
-'pageinfo-watchers' => 'Tal av fólkum sum hava eftirlit',
-'pageinfo-edits' => 'Tal av rættingum',
-'pageinfo-authors' => 'Tal av ymiskum høvundum',
+'pageinfo-watchers' => 'Tal av síðu eygleiðarum',
+'pageinfo-edits' => 'Tal av rættingum í alt',
+'pageinfo-authors' => 'Tal av ymiskum høvundum í alt',
 
 # Skin names
-'skinname-standard' => 'Standardur',
-'skinname-nostalgia' => 'Nostalgiskur',
 'skinname-cologneblue' => 'Cologne-bláur',
 
 # Patrolling
@@ -2202,7 +2276,7 @@ Onnur metadáta verða fjald sum standard.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-artist' => 'Rithøvundur',
 'exif-copyright' => 'Upphavsrætt haldari',
 'exif-headline' => 'Yvirskrift',
@@ -2281,9 +2355,6 @@ Hendan váttanarkoda fer úr gildi tann $4.',
 'version-version' => '(Útgáva $1)',
 'version-software-version' => 'Útgáva',
 
-# Special:FilePath
-'filepath-page' => 'Fíla:',
-
 # Special:SpecialPages
 'specialpages' => 'Serligar síður',
 
index 55eccf6..92f5b4f 100644 (file)
@@ -10,6 +10,7 @@
  * @author Agzennay
  * @author Amqui
  * @author Arkanosis
+ * @author Ayack
  * @author Boniface
  * @author Brunoperel
  * @author Cedric31
@@ -30,6 +31,7 @@
  * @author Erkethan
  * @author Esbardu
  * @author Fabrice Ferrer
+ * @author François Melchior
  * @author Fryed-peach
  * @author Geoleplubo
  * @author Giro720
@@ -59,6 +61,7 @@
  * @author Lucyin
  * @author McDutchie
  * @author Meithal
+ * @author Metroitendo
  * @author Moyg
  * @author Nicolas NALLET
  * @author Nicolas Raoul
@@ -415,8 +418,6 @@ $messages = array(
 'tog-shownumberswatching' => "Afficher le nombre d'utilisateurs qui suivent cette page",
 'tog-oldsig' => 'Signature existante :',
 'tog-fancysig' => 'Traiter la signature comme du wikitexte (sans lien automatique)',
-'tog-externaleditor' => "Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
-'tog-externaldiff' => "Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
 'tog-showjumplinks' => 'Activer les liens « navigation » et « recherche » en haut de page',
 'tog-uselivepreview' => "Utiliser l'aperçu rapide (nécessite JavaScript) (expérimental)",
 'tog-forceeditsummary' => "M'avertir lorsque je n'ai pas spécifié de résumé de modification",
@@ -431,6 +432,7 @@ $messages = array(
 'tog-showhiddencats' => 'Afficher les catégories cachées',
 'tog-noconvertlink' => 'Désactiver la conversion des titres',
 'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
+'tog-useeditwarning' => "M'avertir quand je quitte une page de modification sans publier les changements",
 
 'underline-always' => 'Toujours',
 'underline-never' => 'Jamais',
@@ -494,6 +496,18 @@ $messages = array(
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'déc',
+'january-date' => '$1 janvier',
+'february-date' => '$1 février',
+'march-date' => '$1 mars',
+'april-date' => '$1 avril',
+'may-date' => '$1 mai',
+'june-date' => '$1 juin',
+'july-date' => '$1 juillet',
+'august-date' => '$1 août',
+'september-date' => '$1 septembre',
+'october-date' => '$1 octobre',
+'november-date' => '$1 novembre',
+'december-date' => '$1 décembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Catégorie|Catégories}}',
@@ -780,7 +794,7 @@ $2",
 Le motif avancé est « ''$2'' ».",
 'filereadonlyerror' => "Impossible de modifier le fichier « $1 » parce que le répertoire de fichiers « $2 » est en lecture seule.
 
-L'administrateur qui l'a verrouillé a fourni ce motif: « $3 ».",
+L'administrateur qui l'a verrouillé a fourni ce motif : « $3 ».",
 'invalidtitle-knownnamespace' => "Titre invalide avec l'espace de noms « $2 » et l'intitulé « $3 »",
 'invalidtitle-unknownnamespace' => "Titre invalide avec le numéro d'espace de noms $1 et l'intitulé « $2 » inconnus",
 'exception-nologin' => 'Non connecté',
@@ -800,9 +814,18 @@ Notez que certaines pages peuvent être encore affichées comme si vous étiez t
 'welcomecreation-msg' => "Votre compte a été créé.
 N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAME}}]].",
 'yourname' => "Nom d'utilisateur :",
+'userlogin-yourname' => "Nom d'utilisateur",
+'userlogin-yourname-ph' => "Entrez votre nom d'utilisateur",
 'yourpassword' => 'Mot de passe&nbsp;:',
+'userlogin-yourpassword' => 'Mot de passe',
+'userlogin-yourpassword-ph' => 'Entrez votre mot de passe',
+'createacct-yourpassword-ph' => 'Entrez un mot de passe',
 'yourpasswordagain' => 'Confirmez le mot de passe :',
-'remembermypassword' => 'Me reconnecter automatiquement aux prochaines visites avec ce navigateur (au maximum $1&nbsp;{{PLURAL:$1|jour|jours}})',
+'createacct-yourpasswordagain' => 'Confirmez le mot de passe',
+'createacct-yourpasswordagain-ph' => 'Entrez à nouveau le mot de passe',
+'remembermypassword' => 'Me reconnecter automatiquement lors des prochaines visites avec ce navigateur (au maximum $1&nbsp;{{PLURAL:$1|jour|jours}})',
+'userlogin-remembermypassword' => 'Garder ma session active',
+'userlogin-signwithsecure' => 'Utiliser une connexion sécurisée',
 'securelogin-stick-https' => 'Rester connecté en HTTPS après la connexion',
 'yourdomainname' => 'Votre domaine :',
 'password-change-forbidden' => 'Vous ne pouvez pas modifier les mots de passe sur ce wiki.',
@@ -815,18 +838,38 @@ N'oubliez pas de modifier [[Special:Preferences|vos préférences pour {{SITENAM
 'logout' => 'Se déconnecter',
 'userlogout' => 'Déconnexion',
 'notloggedin' => 'Non connecté',
+'userlogin-noaccount' => "Vous n'avez pas de compte ?",
+'userlogin-joinproject' => 'Rejoignez {{SITENAME}}',
 'nologin' => "Vous n'êtes pas encore inscrit ? $1.",
 'nologinlink' => 'Créer un compte',
 'createaccount' => 'Créer un compte',
 'gotaccount' => "Vous avez déjà un compte ? '''$1'''.",
 'gotaccountlink' => 'Connectez-vous',
 'userlogin-resetlink' => 'Vous avez oublié vos détails de connexion ?',
-'createaccountmail' => 'Utiliser un mot de passe aléatoire temporaire et l’envoyer à l’adresse de courriel spécifiée ci-dessous',
+'userlogin-resetpassword-link' => 'Réinitialiser le mot de passe',
+'helplogin-url' => 'Help:Connexion',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aide à la connexion]]',
+'createacct-join' => 'Entrez vos informations ci-dessous.',
+'createacct-emailrequired' => 'Adresse de courriel',
+'createacct-emailoptional' => 'Adresse de courriel (facultative)',
+'createacct-email-ph' => 'Entrez votre adresse de courriel',
+'createaccountmail' => "Utiliser un mot de passe aléatoire temporaire et l'envoyer à l'adresse de courriel spécifiée ci-dessous",
+'createacct-realname' => 'Nom réel (facultatif)',
 '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-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.',
 'userexists' => "Nom d'utilisateur entré déjà utilisé.
 Veuillez choisir un nom différent.",
 'loginerror' => 'Erreur de connexion',
+'createacct-error' => 'Erreur lors de la création du compte',
 'createaccounterror' => 'Impossible de créer le compte : $1',
 'nocookiesnew' => "Le compte utilisateur a été créé, mais vous n'êtes pas connecté{{GENDER:||e|(e)}}. {{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
 'nocookieslogin' => '{{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter.',
@@ -911,13 +954,15 @@ Veuillez attendre avant d'essayer à nouveau.",
 'resetpass-wrong-oldpass' => 'Mot de passe actuel ou temporaire invalide.
 Vous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mot de passe temporaire.',
 'resetpass-temp-password' => 'Mot de passe temporaire :',
+'resetpass-abort-generic' => 'La modification du mot de passe a été annulée par une extension.',
 
 # Special:PasswordReset
 'passwordreset' => 'Remise à zéro du mot de passe',
-'passwordreset-text' => 'Remplissez ce formulaire pour réinitialiser votre mot de passe.',
+'passwordreset-text-one' => 'Remplissez ce formulaire pour réinitialiser votre mot de passe.',
+'passwordreset-text-many' => '{{PLURAL:$1|Entrez une de ces données pour réinitialiser votre mot de passe.}}',
 'passwordreset-legend' => 'Remise à zéro du mot de passe',
 'passwordreset-disabled' => 'La réinitialisation des mots de passe a été désactivée sur ce wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Entrez un élément de données ci-dessous}}',
+'passwordreset-emaildisabled' => 'Les fonctionnalités e-mail ont été désactivées sur ce wiki.',
 'passwordreset-username' => "Nom d'utilisateur :",
 'passwordreset-domain' => 'Domaine :',
 'passwordreset-capture' => 'Voir le courriel résultant?',
@@ -938,7 +983,7 @@ $2
 Mot de passe temporaire : $2",
 'passwordreset-emailsent' => 'Un courriel de réinitialisation de mot de passe a été 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'utilisateur a échoué : $1",
+'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}} a échoué : $1",
 
 # Special:ChangeEmail
 'changeemail' => "Changer l'adresse de courriel",
@@ -948,7 +993,7 @@ Mot de passe temporaire : $2",
 'changeemail-oldemail' => 'Adresse de courriel actuelle :',
 'changeemail-newemail' => 'Nouvelle adresse de courriel :',
 'changeemail-none' => '(aucune)',
-'changeemail-password' => 'Votre mot de passe sur {{SITENAME}}:',
+'changeemail-password' => 'Votre mot de passe sur {{SITENAME}} :',
 'changeemail-submit' => "Changer l'adresse de courriel",
 'changeemail-cancel' => 'Annuler',
 
@@ -1053,7 +1098,7 @@ Vous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|
 'userpage-userdoesnotexist-view' => "Le compte utilisateur « $1 » n'est pas enregistré.",
 'blocked-notice-logextract' => "Cet utilisateur est actuellement bloqué.
 La dernière entrée du journal des blocages est indiquée ci-dessous à titre d'information :",
-'clearyourcache' => "'''Note :''' après avoir enregistré vos préférences, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
+'clearyourcache' => "'''Note :''' après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
 * '''Firefox / Safari :''' Maintenez la touche ''Maj'' (''Shift'') en cliquant sur le bouton ''Actualiser'' ou pressez ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' sur un Mac) ;
 * '''Google Chrome :''' Appuyez sur ''Ctrl-Maj-R'' (''⌘-Shift-R'' sur un Mac) ;
 * '''Internet Explorer :''' Maintenez la touche ''Ctrl'' en cliquant sur le bouton ''Actualiser'' ou pressez ''Ctrl-F5'' ;
@@ -1112,7 +1157,7 @@ Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l'av
 'longpageerror' => "'''Erreur: Le texte que vous avez soumis fait {{PLURAL:$1|un Kio|$1 Kio}}, ce qui dépasse la limite fixée à {{PLURAL:$2|un Kio|$2 Kio}}.'''
 Il ne peut pas être sauvegardé.",
 'readonlywarning' => "'''AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l'instant.'''
-Vous pouvez copier et coller votre texte dans un fichier texte et lenregistrer pour plus tard.
+Vous pouvez copier et coller votre texte dans un fichier texte et l'enregistrer pour plus tard.
 
 L'administrateur ayant verrouillé la base de données a donné l'explication suivante: $1",
 'protectedpagewarning' => "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs ayant le statut d'administrateur peuvent la modifier.'''<br />
@@ -1146,12 +1191,15 @@ Cause inconnue',
 Il semble qu'elle ait été supprimée.",
 'edit-conflict' => 'Conflit de modification.',
 'edit-no-change' => "Votre modification a été ignorée car aucun changement n'a été fait au texte.",
+'postedit-confirmation' => 'Votre modification a été sauvegardée.',
 'edit-already-exists' => "La nouvelle page n'a pas pu être créée.
 Elle existe déjà.",
 'defaultmessagetext' => 'Message par défaut',
 'content-failed-to-parse' => "Échec de l'analyse du contenu de $2 pour le modèle $1: $3",
 'invalid-content-data' => 'Données du contenu non valides',
 'content-not-allowed-here' => 'Le contenu "$1" n\'est pas autorisé sur la page [[$2]]',
+'editwarning-warning' => 'Quitter cette page vous fera perdre toutes les modifications que vous avez faites.
+Si vous êtes connecté, vous pouvez désactiver cet avertissement dans la section « Modification » de vos préférences.',
 
 # Content models
 'content-model-wikitext' => 'wikitexte',
@@ -1224,9 +1272,9 @@ Essayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en r
 
 # Revision deletion
 'rev-deleted-comment' => '(résumé de modification retiré)',
-'rev-deleted-user' => '(nom d’utilisateur retiré)',
+'rev-deleted-user' => "(nom d'utilisateur retiré)",
 'rev-deleted-event' => '(entrée retirée)',
-'rev-deleted-user-contribs' => '[nom d’utilisateur ou adresse IP retiré - modification masquée sur les contributions]',
+'rev-deleted-user-contribs' => "[nom d'utilisateur ou adresse IP retiré - modification masquée sur les contributions]",
 'rev-deleted-text-permission' => "Cette version de la page a été '''effacée'''.
 Des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
 'rev-deleted-text-unhide' => "Cette version de la page a été '''effacée'''.
@@ -1429,15 +1477,7 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'powersearch-togglenone' => 'Aucune',
 'search-external' => 'Recherche externe',
 'searchdisabled' => 'La recherche sur {{SITENAME}} est désactivée. En attendant la réactivation, vous pouvez effectuer une recherche via Google. Attention, leur indexation du contenu de {{SITENAME}} peut ne pas être à jour.',
-
-# Quickbar
-'qbsettings' => "Barre d'outils",
-'qbsettings-none' => 'Aucune',
-'qbsettings-fixedleft' => 'Gauche',
-'qbsettings-fixedright' => 'Droite',
-'qbsettings-floatingleft' => 'Flottante à gauche',
-'qbsettings-floatingright' => 'Flottante à droite',
-'qbsettings-directionality' => "Fixe, en fonction de la directivité d'écriture de votre langue",
+'search-error' => "Une erreur s'est produite en recherchant : $1",
 
 # Preferences page
 'preferences' => 'Préférences',
@@ -1516,7 +1556,7 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
 'prefs-emailconfirm-label' => 'Confirmation du courriel :',
 'prefs-textboxsize' => 'Taille de la fenêtre de modification',
 'youremail' => 'Courriel :',
-'username' => "{{GENDER:$1|Nom d'utilisateur|Nom d'utilisatrice}}:",
+'username' => "{{GENDER:$1|Nom d'utilisateur|Nom d'utilisatrice}} :",
 'uid' => "Numéro d'{{GENDER:$1|utilisateur|utilisatrice}}:",
 'prefs-memberingroups' => '{{GENDER:$2|Membre}} {{PLURAL:$1|du groupe|des groupes}}:',
 'prefs-registration' => "Date d'inscription :",
@@ -1569,10 +1609,10 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'saveusergroups' => "Enregistrer les groupes de l'utilisateur",
 'userrights-groupsmember' => 'Membre de :',
 'userrights-groupsmember-auto' => 'Membre implicite de :',
-'userrights-groups-help' => "Vous pouvez modifier les groupes auxquels appartient cet utilisateur:
-* Une case cochée signifie que l'utilisateur se trouve dans ce groupe.
-* Une case non cochée signifie qu'{{GENDER:$1|il|elle}} ne s'y trouve pas.
-* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l'avez ajouté, ou vice-versa.",
+'userrights-groups-help' => 'Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :
+* Une case cochée signifie que l’utilisat{{GENDER:$1|eur|rice}} se trouve dans ce groupe.
+* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.
+* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.',
 'userrights-reason' => 'Motif :',
 'userrights-no-interwiki' => "Vous n'avez pas la permission de modifier des droits d'utilisateurs sur d'autres wikis.",
 'userrights-nodatabase' => "La base de donnée « $1 » n'existe pas ou n'est pas locale.",
@@ -1580,6 +1620,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'userrights-notallowed' => "Votre compte n'a pas la permission de modifier des droits d'utilisateur.",
 'userrights-changeable-col' => 'Les groupes que vous pouvez modifier',
 'userrights-unchangeable-col' => 'Les groupes que vous ne pouvez pas modifier',
+'userrights-conflict' => 'Conflit de droits utilisateur ! Veuillez appliquer de nouveau vos modifications.',
 
 # Groups
 'group' => 'Groupe :',
@@ -1989,12 +2030,11 @@ Pour une sécurité optimale, img_auth.php est désactivé.",
 
 # HTTP errors
 'http-invalid-url' => 'URL incorrecte : $1',
-'http-invalid-scheme' => 'Les URL avec le schéma « $1 » ne sont pas supportées.',
+'http-invalid-scheme' => 'Les URL avec le schéma « $1 » ne sont pas prises en charge.',
 'http-request-error' => "Erreur inconnue lors de l'envoi de la requête.",
 'http-read-error' => 'Erreur de lecture HTTP.',
 'http-timed-out' => 'La requête HTTP a expiré.',
 'http-curl-error' => "Erreur lors de la récupération de l'URL : $1",
-'http-host-unreachable' => "Impossible d'atteindre l'URL.",
 'http-bad-status' => 'Il y a eu un problème lors de la requête HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2407,8 +2447,8 @@ Les prochaines modifications de cette page et de la page de discussion associée
 'notvisiblerev' => 'La version a été supprimée',
 'watchnochange' => "Aucun des éléments que vous suivez n'a été modifié durant la période affichée.",
 'watchlist-details' => 'Votre liste de suivi référence $1 page{{PLURAL:$1||s}}, sans compter les pages de discussion.',
-'wlheader-enotif' => 'La notification par courriel est activée.',
-'wlheader-showupdated' => "Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
+'wlheader-enotif' => 'La notification par courriel est activée.',
+'wlheader-showupdated' => "Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
 'watchmethod-recent' => 'vérification des modifications récentes pour y trouver des pages suivies',
 'watchmethod-list' => 'vérification des pages suivies pour y trouver des modifications récentes',
 'watchlistcontains' => 'Votre liste de suivi référence $1 page{{PLURAL:$1||s}}.',
@@ -2735,7 +2775,7 @@ Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont ét
 'ipbotherreason' => 'Motif différent ou supplémentaire :',
 'ipbhidename' => "Masquer le nom d'utilisateur des modifications et des listes",
 'ipbwatchuser' => 'Suivre les pages utilisateur et de discussion de cet utilisateur',
-'ipb-disableusertalk' => 'Empêcher l’utilisateur de modifier sa page de discussion pendant le blocage',
+'ipb-disableusertalk' => "Empêcher l'utilisateur de modifier sa page de discussion pendant le blocage",
 'ipb-change-block' => 'Bloquer à nouveau cet utilisateur avec ces paramètres',
 'ipb-confirm' => 'Confirmer le blocage',
 'badipaddress' => 'Adresse IP incorrecte',
@@ -2826,6 +2866,7 @@ Veuillez contacter votre fournisseur d'accès Internet ou votre support techniqu
 'sorbsreason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.
 Vous ne pouvez pas créer un compte.',
+'xffblockreason' => "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
 'cant-block-while-blocked' => "Vous ne pouvez pas bloquer d'autres utilisateurs tant que vous êtes bloqué{{GENDER:||e|(e)}}.",
 'cant-see-hidden-user' => "L'utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N'ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
 'ipbblocked' => "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué",
@@ -2981,6 +3022,8 @@ Veuillez visiter la [//www.mediawiki.org/wiki/Localisation Localisation de Media
 'thumbnail-more' => 'Agrandir',
 'filemissing' => 'Fichier manquant',
 'thumbnail_error' => 'Erreur lors de la création de la miniature : $1',
+'thumbnail_error_remote' => "Message d'erreur de $1 :
+$2",
 'djvu_page_error' => 'Page DjVu hors limites',
 'djvu_no_xml' => 'Impossible de récupérer le XML pour le fichier DjVu',
 'thumbnail-temp-create' => 'Impossible de créer le fichier de vignette temporaire',
@@ -3002,7 +3045,7 @@ Toutes les actions d'importation inter-wiki sont consignées dans l'[[Special:Lo
 'import-interwiki-templates' => 'Inclure tous les modèles',
 'import-interwiki-submit' => 'Importer',
 'import-interwiki-namespace' => 'Espace de noms de destination :',
-'import-interwiki-rootpage' => 'Page racine de destination (optionnelle):',
+'import-interwiki-rootpage' => 'Page racine de destination (optionnelle) :',
 'import-upload-filename' => 'Nom du fichier :',
 'import-comment' => 'Commentaire :',
 'importtext' => "Veuillez exporter le fichier depuis le wiki d'origine en utilisant son [[Special:Export|outil d'exportation]].
@@ -3036,12 +3079,12 @@ Un dossier temporaire est manquant.",
 'import-error-edit' => "La page « $1 » n'a pas été importée parce que vous n'êtes pas autorisés à la modifier.",
 'import-error-create' => "La page « $1 » n'a pas été importée parce que vous n'êtes pas autorisés à la créer.",
 'import-error-interwiki' => "La page « $1 » n'est pas importée parce que son nom est réservé pour un lien externe (interwiki).",
-'import-error-special' => 'La page " $1 " n\'est pas importée parce qu\'elle appartient à un espace de noms special qui n\'en autorise aucune.',
+'import-error-special' => "La page « $1 » n'est pas importée parce qu'elle appartient à un espace de noms spécial qui n'en autorise aucune.",
 'import-error-invalid' => "Page « $1 » n'est pas importée parce que son nom n'est pas valide.",
-'import-error-unserialize' => 'La révision $2 de la page "$1" ne peut pas être désérialisée. La révision est indiquée comme utilisant le modèle de contenu $3 sérialisé en $4.',
-'import-options-wrong' => '{{PLURAL:$2|Mauvaise option|Mauvaises options}}: <nowiki>$1</nowiki>',
+'import-error-unserialize' => 'La révision $2 de la page « $1 » ne peut pas être désérialisée. La révision est indiquée comme utilisant le modèle de contenu $3 sérialisé en $4.',
+'import-options-wrong' => '{{PLURAL:$2|Mauvaise option|Mauvaises options}} : <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'La page racine fournie est un titre non valide.',
-'import-rootpage-nosubpage' => 'L\'espace de noms "$1" de la page racine n\'autorise pas les sous-pages.',
+'import-rootpage-nosubpage' => "L'espace de noms « $1 » de la page racine n'autorise pas les sous-pages.",
 
 # Import log
 'importlogpage' => 'Journal des importations',
@@ -3055,7 +3098,7 @@ Un dossier temporaire est manquant.",
 'javascripttest' => 'Test de JavaScript',
 'javascripttest-title' => 'Exécution des tests $1',
 'javascripttest-pagetext-noframework' => "Cette page est réservée pour l'exécution des tests JavaScript.",
-'javascripttest-pagetext-unknownframework' => 'Structure "$1" inconnue.',
+'javascripttest-pagetext-unknownframework' => 'Structure « $1 » inconnue.',
 'javascripttest-pagetext-frameworks' => "Veuillez choisir l'une des structures de test suivantes : $1",
 'javascripttest-pagetext-skins' => 'Choisissez un habillage avec lequel lancer les tests :',
 'javascripttest-qunit-intro' => 'Voir [$1 la documentation de test] sur mediawiki.org.',
@@ -3135,17 +3178,11 @@ Permet de rétablir la version précédente et d'ajouter un motif dans la boîte
 
 # Stylesheets
 'common.css' => '/* Le CSS placé ici sera appliqué à tous les habillages. */',
-'standard.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Standard. */',
-'nostalgia.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Nostalgia. */',
 'cologneblue.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Cologne Blue. */',
 'monobook.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Monobook. */',
-'myskin.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage MySkin. */',
-'chick.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Chick. */',
-'simple.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Simple. */',
 'modern.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Modern. */',
 'vector.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Vector. */',
 'print.css' => '/* Le CSS placé ici affectera les impressions */',
-'handheld.css' => '/* Le CSS placé ici affectera les appareils mobiles en fonction de l\'habillage configuré $wgHandheldStyle */',
 'noscript.css' => '/* Le CSS placé ici affectera les utilisateurs ayant désactivé Javascript. */',
 'group-autoconfirmed.css' => '/* Le CSS placé ici affectera les utilisateurs auto-confirmés seulement. */',
 'group-bot.css' => '/* Le CSS placé ici affectera les robots seulement. */',
@@ -3154,13 +3191,8 @@ Permet de rétablir la version précédente et d'ajouter un motif dans la boîte
 
 # Scripts
 'common.js' => '/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */',
-'standard.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Standard uniquement */',
-'nostalgia.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Nostalgie uniquement */',
 'cologneblue.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Bleu de cologne uniquement */',
 'monobook.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage MonoBook uniquement. */',
-'myskin.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Mon habillage uniquement */',
-'chick.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Poussin uniquement */',
-'simple.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Simple uniquement */',
 'modern.js' => '/* Tout JavaScript ici sera chargé avec les pages accédées par les utilisateurs de l’habillage Moderne uniquement */',
 'vector.js' => '/* Tout code JavaScript placé ici sera chargé pour les utilisateurs de l’habillage Vector */',
 'group-autoconfirmed.js' => '/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */',
@@ -3239,13 +3271,8 @@ Permet de rétablir la version précédente et d'ajouter un motif dans la boîte
 'pageinfo-category-files' => 'Nombre de fichiers',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Bleu de Cologne',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mon Interface',
-'skinname-chick' => 'Poussin',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Moderne',
 'skinname-vector' => 'Vector',
 
@@ -3290,7 +3317,7 @@ Si vous l'exécutez, votre système peut être compromis.",
 'widthheightpage' => '$1 × $2, $3 page{{PLURAL:$3||s}}',
 'file-info' => 'Taille du fichier : $1, type MIME : $2',
 'file-info-size' => '$1 × $2 pixels, taille du fichier : $3, type MIME : $4',
-'file-info-size-pages' => '$1 × $2 pixels, taille de fichier: $3, type MIME: $4, $5 {{PLURAL:$5|page|pages}}',
+'file-info-size-pages' => '$1 × $2 pixels, taille de fichier : $3, type MIME : $4, $5 page{{PLURAL:$5||s}}',
 'file-nohires' => 'Pas de plus haute résolution disponible.',
 'svg-long-desc' => 'Fichier SVG, résolution de $1 × $2 pixels, taille : $3',
 'svg-long-desc-animated' => 'Fichier SVG animé, taille $1 x $2 pixels, taille du fichier: $3',
@@ -3302,10 +3329,10 @@ Si vous l'exécutez, votre système peut être compromis.",
 'file-info-gif-looped' => 'en boucle',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|image|images}}',
 'file-info-png-looped' => 'en boucle',
-'file-info-png-repeat' => 'joué $1 {{PLURAL:$1|fois|fois}}',
+'file-info-png-repeat' => 'joué $1 {{PLURAL:$1|fois}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|image|images}}',
-'file-no-thumb-animation' => "'''Remarque: En raison de limitations techniques, les vignettes de ce fichier ne seront pas animées.'''",
-'file-no-thumb-animation-gif' => "'''Remarque: En raison de limitations techniques, les vignettes d'images GIF en haute résolution telles que celle-ci ne seront pas animées.'''",
+'file-no-thumb-animation' => "'''Remarque : En raison de limitations techniques, les vignettes de ce fichier ne seront pas animées.'''",
+'file-no-thumb-animation-gif' => "'''Remarque : En raison de limitations techniques, les vignettes d'images GIF en haute résolution telles que celle-ci ne seront pas animées.'''",
 
 # Special:NewFiles
 'newimages' => 'Galerie des nouveaux fichiers',
@@ -3325,11 +3352,25 @@ Si vous l'exécutez, votre système peut être compromis.",
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
 'hours' => '{{PLURAL:$1|$1 heure|$1 heures}}',
 'days' => '{{PLURAL:$1|$1 jour|$1 jours}}',
+'weeks' => '{{PLURAL:$1|$1 semaine|$1 semaines}}',
 'months' => '{{PLURAL:$1|$1 mois}}',
 'years' => '{{PLURAL:$1|$1 an|$1 ans}}',
 'ago' => 'Il y a $1',
 'just-now' => "à l'instant",
 
+# Human-readable timestamps
+'hours-ago' => 'il y a $1 {{PLURAL:$1|heure|heures}}',
+'minutes-ago' => 'il y a $1 {{PLURAL:$1|minute|minutes}}',
+'seconds-ago' => 'il y a $1 {{PLURAL:$1|seconde|secondes}}',
+'monday-at' => 'Lundi à $1',
+'tuesday-at' => 'Mardi à $1',
+'wednesday-at' => 'Mercredi à $1',
+'thursday-at' => 'Jeudi à $1',
+'friday-at' => 'Vendredi à $1',
+'saturday-at' => 'Samedi à $1',
+'sunday-at' => 'Dimanche à $1',
+'yesterday-at' => 'Hier à $1',
+
 # Bad image list
 'bad_image_list' => "Le format est le suivant :
 
@@ -3357,7 +3398,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 * gpsaltitude",
 'metadata-langitem' => "'''$2&nbsp;:''' $1",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largeur',
 'exif-imagelength' => 'Hauteur',
 'exif-bitspersample' => 'Bits par composante',
@@ -3535,7 +3576,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-originalimageheight' => "Hauteur de l'image avant qu'elle ait été recadrée",
 'exif-originalimagewidth' => "Largeur de l'image avant qu'elle ait été recadrée",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Non compressé',
 'exif-compression-2' => 'CCITT Groupe 3 Longueur du codage Huffman modifié de dimension 1',
 'exif-compression-3' => 'CCITT Groupe 3 codage du fax',
@@ -4031,12 +4072,17 @@ Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licen
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin d’article]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Chemin de script]',
 
-# Special:FilePath
-'filepath' => "Chemin d'accès du fichier",
-'filepath-page' => 'Fichier :',
-'filepath-submit' => 'Aller',
-'filepath-summary' => "Cette page spéciale retourne le chemin d'accès complet d'un fichier.
-Les images sont montrées dans leur pleine résolution, les autres fichiers sont chargés et démarrés directement avec leur programme associé.",
+# Special:Redirect
+'redirect' => 'Redirigé par fichier, utilisateur, ou ID de révision',
+'redirect-legend' => 'Rediriger vers une page ou un fichier',
+'redirect-summary' => "Cette page spéciale redirige vers un fichier (nom donné au fichier), une page (ID attribuée à la révision) ou une page d'utilisateur (identifiant numérique attribué à l'utilisateur).",
+'redirect-submit' => 'Valider',
+'redirect-lookup' => 'Recherche :',
+'redirect-value' => 'Valeur :',
+'redirect-user' => "ID de l'utilisateur",
+'redirect-revision' => 'Révision de la page',
+'redirect-file' => 'Nom du fichier',
+'redirect-not-exists' => 'Valeur non trouvée',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Recherche de doublons',
@@ -4070,7 +4116,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 
 # Special:BlankPage
 'blankpage' => 'Page vide',
-'intentionallyblankpage' => 'Cette page est laissée intentionellement vide.',
+'intentionallyblankpage' => 'Cette page est laissée intentionnellement (presque) vide.',
 
 # External image whitelist
 'external_image_whitelist' => " #Laisser cette ligne exactement telle quelle.<pre>
@@ -4127,6 +4173,9 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'htmlform-submit' => 'Soumettre',
 'htmlform-reset' => 'Défaire les modifications',
 'htmlform-selectorother-other' => 'Autre',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Oui',
+'htmlform-chosen-placeholder' => 'Choisir une option',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 avec recherche en texte intégral supportée',
@@ -4136,36 +4185,36 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'logentry-delete-delete' => '$1 {{GENDER:$2|a supprimé}} la page $3',
 'logentry-delete-restore' => '$1 {{GENDER:$2|a restauré}} la page $3',
 'logentry-delete-event' => "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
-'logentry-delete-revision' => '$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d’une révision|de $5 révisions}} sur la page $3: $4',
-'logentry-delete-event-legacy' => '$1 a modifié la visibilité des événements du journal sur $3',
-'logentry-delete-revision-legacy' => '$1 a modifié la visibilité des révisions sur la page $3',
-'logentry-suppress-delete' => '$1 a supprimé la page $3',
-'logentry-suppress-event' => "$1 a secrètement modifié la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
-'logentry-suppress-revision' => "$1 a secrètement modifié la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
-'logentry-suppress-event-legacy' => '$1 a secrètement modifié la visibilité des événements du journal sur $3',
-'logentry-suppress-revision-legacy' => '$1 a secrètement modifié la visibilité des révisions sur la page $3',
+'logentry-delete-revision' => "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|a modifié}} la visibilité des événements du journal sur $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|a modifié}} la visibilité des révisions sur la page $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|a supprimé}} la page $3',
+'logentry-suppress-event' => "$1 {{GENDER:$2|a secrètement modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
+'logentry-suppress-revision' => "$1 {{GENDER:$2|a secrètement modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|a secrètement modifié}} la visibilité des événements du journal sur $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|a secrètement modifié}} la visibilité des révisions sur la page $3',
 'revdelete-content-hid' => 'contenu masqué',
 'revdelete-summary-hid' => 'résumé de modification masqué',
-'revdelete-uname-hid' => 'nom d’utilisateur masqué',
+'revdelete-uname-hid' => "nom d'utilisateur masqué",
 'revdelete-content-unhid' => 'contenu affiché',
 'revdelete-summary-unhid' => 'résumé de modification affiché',
-'revdelete-uname-unhid' => 'nom d’utilisateur affiché',
+'revdelete-uname-unhid' => "nom d'utilisateur affiché",
 'revdelete-restricted' => 'restrictions appliquées aux administrateurs',
 'revdelete-unrestricted' => 'restrictions retirées pour les administrateurs',
-'logentry-move-move' => '$1 a déplacé la page $3 vers $4',
-'logentry-move-move-noredirect' => '$1 a déplacé la page $3 vers $4 sans laisser de redirection',
-'logentry-move-move_redir' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection',
-'logentry-move-move_redir-noredirect' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection sans laisser de redirection',
-'logentry-patrol-patrol' => '$1 a marqué la révision $4 de la page $3 comme relue',
-'logentry-patrol-patrol-auto' => '$1 a automatiquement marqué la révision $4 de la page $3 comme relue',
-'logentry-newusers-newusers' => 'Le compte utilisateur $1 a été créé',
-'logentry-newusers-create' => 'Le compte utilisateur $1 a été créé',
-'logentry-newusers-create2' => 'Le compte utilisateur $3 a été créé par $1',
-'logentry-newusers-byemail' => 'Le compte utilisateur $3 a été créé par $1 et le mot de passe a été envoyé par courriel',
-'logentry-newusers-autocreate' => 'Le compte $1 a été créé automatiquement',
-'logentry-rights-rights' => "$1 a modifié l'appartenance au groupe pour $3 de $4 à $5",
-'logentry-rights-rights-legacy' => "$1 a modifié l'appartenance au groupe pour $3",
-'logentry-rights-autopromote' => '$1 a été promu automatiquement de $4 à $5',
+'logentry-move-move' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 sans laisser de redirection',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 par-dessus une redirection',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 par-dessus une redirection sans laisser de redirection',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|a marqué}} la révision $4 de la page $3 comme relue',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|a automatiquement marqué}} la révision $4 de la page $3 comme relue',
+'logentry-newusers-newusers' => 'Le compte utilisateur $1 {{GENDER:$2|a été créé}}',
+'logentry-newusers-create' => 'Le compte utilisateur $1 {{GENDER:$2|a été créé}}',
+'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-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',
 'rightsnone' => '(aucun)',
 
 # Feedback
@@ -4176,7 +4225,7 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'feedback-cancel' => 'Annuler',
 'feedback-submit' => 'Envoyer vos commentaires',
 'feedback-adding' => 'Ajout de vos commentaires à la page...',
-'feedback-error1' => "Erreur : Résultat de l'API non reconnu",
+'feedback-error1' => "Erreur : Résultat de l'IPA non reconnu",
 'feedback-error2' => 'Erreur : la modification a échoué',
 'feedback-error3' => "Erreur : aucune réponse de l'API",
 'feedback-thanks' => 'Merci ! Votre commentaire a été publié sur la page "[$2 $1]".',
@@ -4220,7 +4269,7 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'api-error-ok-but-empty' => "Erreur interne : Le serveur n'a pas répondu.",
 'api-error-overwrite' => "Écraser un fichier existant n'est pas autorisé.",
 'api-error-stashfailed' => "Erreur interne : le serveur n'a pas pu enregistrer le fichier temporaire.",
-'api-error-publishfailed' => 'Erreur interne: Le serveur n’a pas pu publier le fichier temporaire.',
+'api-error-publishfailed' => "Erreur interne: Le serveur n'a pas pu publier le fichier temporaire.",
 'api-error-timeout' => "Le serveur n'a pas répondu dans le délai imparti.",
 'api-error-unclassified' => "Une erreur inconnue s'est produite",
 'api-error-unknown-code' => 'Erreur inconnue : « $1 »',
@@ -4242,6 +4291,6 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'duration-millennia' => '$1 millénaire{{PLURAL:$1||s}}',
 
 # Image rotation
-'rotate-comment' => 'Image pivotée de $1 {{PLURAL:$1|degré|degrés}} dans le sens des aiguilles d’une montre',
+'rotate-comment' => "Image pivotée de $1 {{PLURAL:$1|degré|degrés}} dans le sens des aiguilles d'une montre",
 
 );
index c5dd402..03e022f 100644 (file)
@@ -49,8 +49,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Montrer le montant de guetteurs',
 'tog-oldsig' => '↓ Preview du signature existant:',
 'tog-fancysig' => 'Signature brute (sans liens préparés)',
-'tog-externaleditor' => 'Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur)',
-'tog-externaldiff' => 'User un autre comparateur comme réglage ordinaire',
 'tog-showjumplinks' => 'Mettre les "liens vites" en haut de la page',
 'tog-uselivepreview' => "User la vue d'avance vite (JavaScript) (En assai)",
 'tog-forceeditsummary' => "M'avertir quand j'ai laissé la boëte de commentaires vide",
@@ -141,7 +139,6 @@ $messages = array(
 'qbbrowse' => 'Regarder',
 'qbedit' => 'Changer',
 'qbpageoptions' => 'Page de choix',
-'qbpageinfo' => "Page d'information",
 'qbmyoptions' => 'Mes options',
 'qbspecialpages' => 'Pages espéciales',
 'faq' => 'Questions Communes',
@@ -327,9 +324,6 @@ $2',
 
 Vous pouvez continuer à user {{SITENAME}} sans nom ou vous pouvez connecter encore une fois avec le même nom ou un autre nom.
 Notez: certaines pages pourriont être vues comme si vous êtes connecté, jusqu'à vous videz l'information de votre navigateur.",
-'welcomecreation' => '== Bonjour, $1! ==
-
-Votre compte a été créé.  Oubliez pas de changer votre réglage sus {{SITENAME}}.',
 'yourname' => "Nom d'useur:",
 'yourpassword' => 'Mot de passe:',
 'yourpasswordagain' => 'Mot de passe encore:',
@@ -517,7 +511,6 @@ Il foudra que vous mettez vos changements dans le texte qu'est là asteur.
 'template-protected' => '(protégé)',
 'template-semiprotected' => '(demi-protégé)',
 'edittools' => "<!-- Le texte que vous mettez ici va être montré sous les boëttes de changements ou d'import de dossier. -->",
-'nocreatetitle' => 'Création de page limitée',
 'nocreatetext' => "La création des pages est limitée.  Vous pouvez changer une page qu'a été déjà créée ou [[Special:UserLogin|connecter ou créer un compte]].",
 'nocreate-loggedin' => 'Vous avez pas la permission de créer des nouvelles pages.',
 'permissionserrors' => 'Erreur de permissions',
@@ -651,7 +644,7 @@ Des autres administrateurs sus ce wiki ont la permission de voir et de rétablir
 # Special:Categories
 'categories' => 'Classes',
 
-# E-mail user
+# Email user
 'emailuser' => 'E-mail cet useur',
 
 # Watchlist
index c80258d..35ee834 100644 (file)
@@ -338,8 +338,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Montrar lo nombro d’utilisators que siuvont na pâge',
 'tog-oldsig' => 'Signatura ègzistenta :',
 'tog-fancysig' => 'Trètar la signatura coment de vouiquitèxto (sen lim ôtomatico)',
-'tog-externaleditor' => 'Empleyér per dèfôt un changior de tèxto de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
-'tog-externaldiff' => 'Empleyér per dèfôt un comparator de defôr (solament por los utilisators avanciês, at fôta d’una configuracion spèciâla sur voutron ordenator. [//www.mediawiki.org/wiki/Manual:External_editors Més d’enformacions.])',
 'tog-showjumplinks' => 'Activar los lims d’accèssibilitât « {{int:jumpto}} »',
 'tog-uselivepreview' => 'Empleyér l’apèrçu rapido (at fôta de JavaScript) (èxpèrimentâl)',
 'tog-forceeditsummary' => 'Mè balyér na semonce quand j’é pas buchiê de rèsumâ de changement',
@@ -354,6 +352,7 @@ $messages = array(
 'tog-showhiddencats' => 'Montrar les catègories cachiêes',
 'tog-noconvertlink' => 'Dèsactivar la convèrsion des titros des lims',
 'tog-norollbackdiff' => 'Pas fâre vêre la dif pendent na rèvocacion',
+'tog-useeditwarning' => 'M’avèrtir quand quito una pâge de changement sen sôvar los changements',
 
 'underline-always' => 'Tojorn',
 'underline-never' => 'Jamés',
@@ -1114,6 +1113,8 @@ Semble que seye étâye suprimâye.',
 'content-failed-to-parse' => 'Falyita de l’analisa du contegnu de $2 por lo modèlo $1 : $3',
 'invalid-content-data' => 'Balyês du contegnu pas justes',
 'content-not-allowed-here' => 'Lo contegnu « $1 » est pas ôtorisâ sur la pâge [[$2]]',
+'editwarning-warning' => 'Quitar ceta pâge vos farat pèrdre tôs los changements que vos éd fêts.
+Se vos éte branchiê, vos pouede enlevar ceti avèrtissement dens la sèccion « Fenétra d’èdicion » de voutres prèferences.',
 
 # Content models
 'content-model-wikitext' => 'vouiquitèxto',
@@ -1403,15 +1404,6 @@ Vos pouede trovar més de dètalys sur lo [{{fullurl:{{#Special:Log}}/delete|pag
 Pendent cél temps, vos pouede fâre na rechèrche avouéc Google.
 Notâd que lor endèxacion du contegnu de {{SITENAME}} pôt pas étre a jorn.',
 
-# Quickbar
-'qbsettings' => 'Bârra rapida',
-'qbsettings-none' => 'Pas yona',
-'qbsettings-fixedleft' => 'Fix’a gôche',
-'qbsettings-fixedright' => 'Fix’a drêta',
-'qbsettings-floatingleft' => 'Fllotent’a gôche',
-'qbsettings-floatingright' => 'Fllotent’a drêta',
-'qbsettings-directionality' => 'Fixa, d’aprés la dirèccionalitât d’ècritura de voutra lengoua',
-
 # Preferences page
 'preferences' => 'Prèferences',
 'mypreferences' => 'Prèferences',
@@ -1980,7 +1972,6 @@ Por na sècuritât pèrfèta, img_auth.php est dèsactivâ.',
 'http-read-error' => 'Fôta de lèctura HTTP.',
 'http-timed-out' => 'La demanda HTTP at èxpirâ.',
 'http-curl-error' => 'Fôta pendent la rècupèracion de l’URL : $1',
-'http-host-unreachable' => 'Y at pas moyen d’avengiér l’URL.',
 'http-bad-status' => 'Y at avu un problèmo pendent la demanda HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2398,8 +2389,8 @@ Los changements que vegnont de ceta pâge et de la sina pâge de discussion y se
 'notvisiblerev' => 'La dèrriére vèrsion per un ôtr’utilisator est étâye suprimâye',
 'watchnochange' => 'Pas yona de les piéces que vos siude est étâye changiêe pendent lo temps fêt vêre.',
 'watchlist-details' => 'Y at $1 pâge{{PLURAL:$1||s}} dedens voutra lista de siuvu, sen comptar les pâges de discussion.',
-'wlheader-enotif' => 'La notificacion per mèssageria èlèctronica est activâye.',
-'wlheader-showupdated' => "Les pâges que sont étâyes changiêes dês voutra dèrriére visita sont montrâyes en '''grâs'''.",
+'wlheader-enotif' => 'La notificacion per mèssageria èlèctronica est activâye.',
+'wlheader-showupdated' => "Les pâges que sont étâyes changiêes dês voutra dèrriére visita sont montrâyes en '''grâs'''.",
 'watchmethod-recent' => 'contrôlo des novéls changements por y trovar des pâges siuvues',
 'watchmethod-list' => 'contrôlo de les pâges siuvues por y trovar des novéls changements',
 'watchlistcontains' => 'Voutra lista de siuvu contint $1 pâge{{PLURAL:$1||s}}.',
@@ -2619,10 +2610,10 @@ Pôt-étre vos éd un crouyo lim ou ben la vèrsion at possu étre refêta ou en
 'undeletedfiles' => '$1 {{PLURAL:$1|fichiér refêt|fichiérs refêts}}',
 'cannotundelete' => 'Falyita de la rèstoracion :
 $1',
-'undeletedpage' => "'''La pâge $1 est étâye refêta.'''
+'undeletedpage' => "'''$1 est étâye refêta'''
 
-Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr la lista de les novèles suprèssions et rèstoracions.",
-'undelete-header' => 'Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr la lista de les pâges suprimâyes dèrriérement.',
+Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr na lista de les novèles suprèssions et rèstoracions.",
+'undelete-header' => 'Vêde lo [[Special:Log/delete|jornal de les suprèssions]] por avêr les pâges suprimâyes dês pou.',
 'undelete-search-title' => 'Rechèrchiér des pâges suprimâs',
 'undelete-search-box' => 'Rechèrchiér des pâges suprimâs',
 'undelete-search-prefix' => 'Montrar les pâges que començont per :',
@@ -3133,17 +3124,11 @@ Pèrmèt de rètablir la vèrsion devant et pués d’apondre una rêson dens la
 
 # Stylesheets
 'common.css' => '/* Lo code CSS betâ ique serat aplicâ a tôs los habelyâjos. */',
-'standard.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Estandârd ». */',
-'nostalgia.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Cafârd ». */',
 'cologneblue.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Blu de Cologne ». */',
 'monobook.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « MonoBook ». */',
-'myskin.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « MonHabelyâjo ». */',
-'chick.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Pugin ». */',
-'simple.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Simplo ». */',
 'modern.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Modèrno ». */',
 'vector.css' => '/* Lo code CSS betâ ique afècterat los usanciérs de l’habelyâjo « Vèctor ». */',
 'print.css' => '/* Lo code CSS betâ ique afècterat les emprèssions. */',
-'handheld.css' => '/* Lo code CSS betâ ique afècterat los aparèlys mobilos d’aprés l’habelyâjo configurâ dedens « $wgHandheldStyle ». */',
 'noscript.css' => '/* Lo code CSS betâ ique afècterat los usanciérs qu’ont dèsactivâ lo code JavaScript. */',
 'group-autoconfirmed.css' => '/* Lo code CSS betâ ique afècterat ren que los usanciérs encartâs. */',
 'group-bot.css' => '/* Lo code CSS betâ ique afècterat ren que los bots. */',
@@ -3152,13 +3137,8 @@ Pèrmèt de rètablir la vèrsion devant et pués d’apondre una rêson dens la
 
 # Scripts
 'common.js' => '/* Tot code JavaScript betâ ique serat chargiê per tôs los usanciérs avouéc châque chargement de pâge. */',
-'standard.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Estandârd ». */',
-'nostalgia.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Cafârd ». */',
 'cologneblue.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Blu de Cologne ». */',
 'monobook.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « MonoBook ». */',
-'myskin.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « MonHabelyâjo ». */',
-'chick.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Pugin ». */',
-'simple.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Simplo ». */',
 'modern.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Modèrno ». */',
 'vector.js' => '/* Tot code JavaScript betâ ique serat chargiê per los usanciérs de l’habelyâjo « Vèctor ». */',
 'group-autoconfirmed.js' => '/* Tot code JavaScript betâ ique serat chargiê ren que por los usanciérs encartâs. */',
@@ -3229,13 +3209,8 @@ O est probâblament diu a un lim de vers un seto de defôr qu’aparêt sur la l
 'pageinfo-protect-cascading-yes' => 'Ouè',
 
 # Skin names
-'skinname-standard' => 'Estandârd',
-'skinname-nostalgia' => 'Cafârd',
 'skinname-cologneblue' => 'Blu de Cologne',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MonHabelyâjo',
-'skinname-chick' => 'Pugin',
-'skinname-simple' => 'Simplo',
 'skinname-modern' => 'Modèrno',
 'skinname-vector' => 'Vèctor',
 
@@ -3343,7 +3318,7 @@ Los ôtros champs seront cachiês per dèfôt.
 * gpsaltitude',
 'metadata-langitem' => "'''$2 :''' $1",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largior',
 'exif-imagelength' => 'Hôtior',
 'exif-bitspersample' => 'Bits per composenta',
@@ -3521,7 +3496,7 @@ Los ôtros champs seront cachiês per dèfôt.
 'exif-originalimageheight' => 'Hôtior de l’émâge devant qu’el èye étâ tornâ cadrar',
 'exif-originalimagewidth' => 'Largior de l’émâge devant qu’el èye étâ tornâ cadrar',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Pas comprèssâ',
 'exif-compression-2' => 'CCITT tropa 3 longior du codâjo Huffman changiê de dimension 1',
 'exif-compression-3' => 'CCITT tropa 3 codâjo du faxe',
@@ -4014,13 +3989,6 @@ Vos devriâd avêr reçu un [{{SERVER}}{{SCRIPTPATH}}/COPYING ègzemplèro de la
 'version-entrypoints-header-entrypoint' => 'Pouent d’entrâ',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Chemin d’accès du fichiér',
-'filepath-page' => 'Fichiér :',
-'filepath-submit' => 'Alar trovar',
-'filepath-summary' => 'Ceta pâge spèciâla montre lo chemin d’accès complèt d’un fichiér.
-Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs sont chargiês et dèmarrâs tot drêt avouéc lor programo associyê.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Rechèrche des fichiérs en doblo',
 'fileduplicatesearch-summary' => 'Rechèrche des fichiérs en doblo d’aprés lor mârca de chaplâjo.',
index 9d71f03..ef80edf 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Inkowik
  * @author Maartenvdbent
  * @author Merlissimo
  * @author Murma174
@@ -19,62 +20,60 @@ $linkTrail = '/^([a-zäöüßåāđē]+)(.*)$/sDu';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Linke unerstrike:',
-'tog-justify' => 'Täkst ås blokseeting',
-'tog-hideminor' => 'Latje änringe fersteege',
-'tog-hidepatrolled' => 'Latje änringe fersteege',
-'tog-newpageshidepatrolled' => 'Kontroliirde side aw e list "Naie side" fersteege',
-'tog-extendwatchlist' => 'Ütwidede wåchelist tun wisen foon åle änringe',
+'tog-underline' => 'Ferwisangen onerstrik:',
+'tog-justify' => 'Tekst üs blook saat',
+'tog-hideminor' => 'Letj anrangen fersteeg',
+'tog-hidepatrolled' => 'Letj anrangen fersteeg',
+'tog-newpageshidepatrolled' => 'Kontroliaret sidjen bi a "Nei sidjen" fersteeg',
+'tog-extendwatchlist' => "Ütjwidjet list faan sidjen, diar dü uun't uug behual wel",
 'tog-usenewrc' => "Ütwidede deerstaling foon da ''Leeste Änringe'' än aw da ''Eefterkiikliste'' (brükt JavaScript)",
-'tog-numberheadings' => 'Ouerschrafte automatisch numeriire',
-'tog-showtoolbar' => 'Beårbe-wärktjüch wise',
-'tog-editondblclick' => 'Side ma dööweltklik beårbe (brükt JavaScript)',
-'tog-editsection' => 'Ferbininge tun wisen foon änkelte oufsnaase',
-'tog-editsectiononrightclick' => 'Änkelte stöögne ma ruchts kliken beårbe (brükt JavaScript)',
-'tog-showtoc' => 'Wis en inhåltsferteeknis for side ma mäs ås trii ouerschrafte',
-'tog-rememberpassword' => 'Aw diheere komputer foon duur önjmälde (maksimool for $1 {{PLURAL:$1|däi|deege}})',
-'tog-watchcreations' => "Salew maaget sidjen an huuchlooset dateien leewen uun't uug behual",
-'tog-watchdefault' => "Salew feranert sidjen an dateien leewen uun't uug behual",
-'tog-watchmoves' => "Salew fersköwen sidjen an dateien leewen uun't uug behual",
-'tog-watchdeletion' => "Salew stregen sidjen an dateien leewen uun't uug behual",
-'tog-minordefault' => 'Äine änringe gewöönlik ås latj mårkiire',
-'tog-previewontop' => 'Forbekiiken boowen dåt beårbingswaning wise',
-'tog-previewonfirst' => 'Bai dåt jarst beårben åltens dåt forbekiiken wise',
-'tog-nocache' => 'Sidecache foon e browser deaktiwiire',
-'tog-enotifwatchlistpages' => "Sjüür mi en E-Mail, wan sidjen of dateien feranert wurd, diar ik uun't uug behual wal",
-'tog-enotifusertalkpages' => 'Bai änringe tu min brüker-diskusjoonssid E-Maile siinje',
-'tog-enotifminoredits' => 'Sjüür mi uk bi letj feranrangen faan sidjen an dateien en E-Mail',
-'tog-enotifrevealaddr' => 'Min E-mail-adräs önj tising-E-maile wise',
-'tog-shownumberswatching' => 'Wis di tål foon wåchende brükere',
+'tog-numberheadings' => 'Auerskraften automaatisk numeriare',
+'tog-showtoolbar' => 'Werktjüch tu bewerkin wise (brükt JavaScript)',
+'tog-editondblclick' => 'Sidjen mä dobelklik bewerke (brükt JavaScript)',
+'tog-editsection' => "Ferwisangen tu't bewerkin faan enkelt kirwer",
+'tog-editsectiononrightclick' => 'Enkelt kirwer mä rochtsklik bewerke (brükt JavaScript)',
+'tog-showtoc' => 'Üüb sidjen mä muar üs trii auerskraften en indeks uunwise',
+'tog-rememberpassword' => 'Üüb diheer reegner üüb düür uunmelde (maksimaal för $1 {{PLURAL:$1|dai|daar}})',
+'tog-watchcreations' => "Salew maaget sidjen an huuchlooset datein leewen uun't uug behual",
+'tog-watchdefault' => "Salew feranert sidjen an datein leewen uun't uug behual",
+'tog-watchmoves' => "Salew fersköwen sidjen an datein leewen uun't uug behual",
+'tog-watchdeletion' => "Salew stregen sidjen an datein leewen uun't uug behual",
+'tog-minordefault' => 'Aanj feranrangen üs "letjen" kääntiakne',
+'tog-previewontop' => '"Iarst ans luke" boowen faan\'t wönang tu bewerkin',
+'tog-previewonfirst' => 'Bi\'t iarst bewerkin "iarst ans luke" uunwise',
+'tog-nocache' => 'Sidjencache faan di browser deaktiwiare',
+'tog-enotifwatchlistpages' => "Schüür mi en e-mail, wan sidjen of datein feranert wurd, diar ik uun't uug behual wal",
+'tog-enotifusertalkpages' => 'Bi fernarangen üüb min brüker-diskusjuunssidj en e-mail sjüür',
+'tog-enotifminoredits' => 'Schüür mi uk bi letj feranrangen faan sidjen an datein en e-mail',
+'tog-enotifrevealaddr' => 'Min e-mail adres uun e-mail noorachten uunwise',
+'tog-shownumberswatching' => "Taal faan brükern uunwise, diar det sidj uun't uug haa",
 'tog-oldsig' => 'Aktuel signatuur:',
-'tog-fancysig' => 'Signatuur behoonle ås wikitäkst',
-'tog-externaleditor' => 'Gewöönlik äksterne ediitor for färsjoonsunerschiise brüke (bloot for ekspärte, deer mönje spetsjäle önjstalinge aw di äine kompjuuter fornümen wårde
-[//www.mediawiki.org/wiki/Manual:External_editors Mör informatsjoone.])',
-'tog-externaldiff' => 'Gewöönlik äkstern program for färsjoonsunerschiise brüke (bloot for ekspärte, deer mönje spetsjäle önjstalinge aw di äine kompjuuter fornümen wårde[//www.mediawiki.org/wiki/Manual:External_editors Mör informatsjoone.])',
-'tog-showjumplinks' => '"Schafte tu"-ferbininge aktiwiire',
-'tog-uselivepreview' => 'Live-forbekiik ferwiinje (brükt JavaScript) (äksperimentäl)',
-'tog-forceeditsummary' => 'Woorschoue, wan bai dåt spiikern jü tuhuupefooting breecht',
-'tog-watchlisthideown' => 'Äine beårbinge önj e bekiiklist fersteege',
-'tog-watchlisthidebots' => 'Beårbinge döör bots önj e bekiiklist fersteege',
-'tog-watchlisthideminor' => 'Latje beårbinge önj e bekiiklist fersteege',
-'tog-watchlisthideliu' => 'Beårbinge foon önjmäldede brükere önj e bekiikliste fersteege',
-'tog-watchlisthideanons' => 'Beårbinge foon ai önjmäldede brükere önj e bekiikliste fersteege',
-'tog-watchlisthidepatrolled' => 'Eefterkiikede beårbinge önj e bekiiklist fersteege',
-'tog-ccmeonemails' => 'Siinje me kopiie foon e-maile, da ik tu oudere brükere siinje',
-'tog-diffonly' => 'Wis bai di fersjoonsferglik bloot da unerschiise, ai jü hiilj sid',
-'tog-showhiddencats' => 'Wis ferstäägene kategoriie',
-'tog-norollbackdiff' => 'Unerschiis eefter dåt tübäägseeten unerdrüke',
-
-'underline-always' => 'Åltens',
-'underline-never' => 'uler',
+'tog-fancysig' => 'Signatuur üs wikitekst uunsä (saner ferwisangen)',
+'tog-showjumplinks' => '"Waksle tu"-ferwisangen aktiwiare',
+'tog-uselivepreview' => 'Live-"iarst ans luke" funktjuun brük (brükt JavaScript, eksperimentel)',
+'tog-forceeditsummary' => "Wäärne, wan bi't seekrin nian tuupfaadang uunden woort",
+'tog-watchlisthideown' => "Aanj feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
+'tog-watchlisthidebots' => "Feranrangen faan bots bi a sidjen, diar ik uun't uug behual wal, fersteeg",
+'tog-watchlisthideminor' => "Letj feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
+'tog-watchlisthideliu' => "Feranrangen faan uunmeldet brükern bi sidjen, diar ik uun't uug behual wal, fersteeg",
+'tog-watchlisthideanons' => "Feranrangen faan anonüüm brükern (IPs) bi sidjen, diar ik uun't uug behual wal, fersteeg",
+'tog-watchlisthidepatrolled' => "Kontroliaret feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
+'tog-ccmeonemails' => 'Schüür mi kopiin faan e-mails, diar ik tu ööder brükern schüür',
+'tog-diffonly' => 'Bi en werjuunsferglik bluas di ferskeel uunwise, ei det hialer sidj',
+'tog-showhiddencats' => 'Ferbürgen kategoriin uunwise',
+'tog-norollbackdiff' => "Ferskeel efter't turagsaaten fersteeg",
+'tog-useeditwarning' => 'Waarskaue mi, wan en sidj slööden woort, huar noch ünseekert feranrangen maaget wurden san',
+
+'underline-always' => 'Leewen',
+'underline-never' => 'Nimer',
 'underline-default' => 'Komt üüb dan browser uun',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Schraftfamiili for di takst onj dåt beårbingswaning:',
-'editfont-default' => 'oufhingi foon browser-önjstaling',
-'editfont-monospace' => 'Schraft ma fååst tiikenbrååtj',
-'editfont-sansserif' => 'Seriifen-lüüse grotäskschraft',
-'editfont-serif' => 'Schraft ma seriife',
+'editfont-style' => "Skraftoort för di tekst uun't werkfial:",
+'editfont-default' => 'Hinget faan browser-iinstelangen uf',
+'editfont-monospace' => 'Skraft mä en fääst tiakenbreetje',
+'editfont-sansserif' => 'Skraft saner seriifen (fiin onerstreger)',
+'editfont-serif' => 'Skraft mä seriifen (fiin onerstreger)',
 
 # Dates
 'sunday' => 'Saandi',
@@ -127,124 +126,136 @@ $messages = array(
 'oct' => 'Okt.',
 'nov' => 'Now.',
 'dec' => 'Det.',
+'january-date' => '$1. Janewoore',
+'february-date' => '$1. Febrewoore',
+'march-date' => '$1. Maarts',
+'april-date' => '$1. April',
+'may-date' => '$1. Mei',
+'june-date' => '$1. Jüüne',
+'july-date' => '$1. Jüüle',
+'august-date' => '$1. August',
+'september-date' => '$1. September',
+'october-date' => '$1. Oktuuber',
+'november-date' => '$1. Nofember',
+'december-date' => '$1. Detsember',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategorii|Kategoriie}}',
-'category_header' => 'Side önj e kategorii "$1"',
-'subcategories' => 'Unerkategoriie',
-'category-media-header' => 'Meedia önj e kategorii "$1"',
-'category-empty' => '"Jüdeer kategorii önjhüült nütutids niinj side unti meedie."',
-'hidden-categories' => '{{PLURAL:$1|Ferstäägen Kategorii|Ferstäägene Kategoriie}}',
-'hidden-category-category' => 'Ferstäägene kategoriie',
-'category-subcat-count' => '{{PLURAL:$2|Jüdeer kategorii önjthålt füliend unerkategorii:|{{PLURAL:$1|Füliend unerkategorii as iinj foon inåål $2 unerkategoriie önj jüdeer kategorii:|Deer wårde $1 foon inåål $2 unerkategoriie önj jüdeer kategorii wised:}}}}',
-'category-subcat-count-limited' => 'Jüdeer kategorii önjthålt füliende {{PLURAL:$1|unerkategorii|$1 unerkategoriie}}:',
-'category-article-count' => '{{PLURAL:$2|Jüdeer kategorii önjthålt füliende sid:|{{PLURAL:$1|Füliende sid as iinj foon inåål $2 side önj jüdeer kategorii:|Deer wårde $1 foon inåål $2 side önj jüdeer kategorii wised:}}}}',
-'category-article-count-limited' => 'Füliende {{PLURAL:$1|sid as|$1 side san}} önj jüheer kategorii önjthülen:',
-'category-file-count' => '{{PLURAL:$2|Jüdeer kategorii önjthålt füliende dootäi:|{{PLURAL:$1|Füliende dootäi as iinj foon inåål $2 side önj jüdeer kategorii:|Deer wårde $1 foon inåål $2 dootäie önj jüdeer kategorii wised:}}}}',
-'category-file-count-limited' => 'Füliende {{PLURAL:$1|Dootäi as|$1 Dootäie san}} önj jüdeer kategorii önjthülen:',
-'listingcontinuesabbrev' => '(fortseeting)',
-'index-category' => 'Indisiirde side',
-'noindex-category' => 'Ai indisiirde side',
+'pagecategories' => '{{PLURAL:$1|Kategorii|Kategoriin}}',
+'category_header' => 'Sidjen uun kategorii "$1"',
+'subcategories' => 'Onerkategoriin',
+'category-media-header' => 'Meedien uun kategorii "$1"',
+'category-empty' => '"Uun detdiar kategorii san uun uugenblak nian sidjen of meedien."',
+'hidden-categories' => '{{PLURAL:$1|Ferbürgen kategorii|Ferbürgen kategoriin}}',
+'hidden-category-category' => 'Ferbürgen kategoriin',
+'category-subcat-count' => "{{PLURAL:$2|Detdiar kategorii hää ian onerkategorii.|Uun detdiar kategorii {{PLURAL:$1|stäänt ian onerkategorii|stun $1 onerkategoriin}} faan $2 uun't gehial.}}",
+'category-subcat-count-limited' => 'Detdiar kategorii hää {{PLURAL:$1|ian onerkategorii|$1 onerkategoriin}}:',
+'category-article-count' => "{{PLURAL:$2|Uun detdiar kategorii stäänt ian sidj.|Uun detdiar kategorii {{PLURAL:$1|stäänt ian sidj|stun jodiar $1 sidjen}} faan $2 uun't gehial.}}",
+'category-article-count-limited' => '{{PLURAL:$1|Detdiar sidj stäänt|Jodiar $1 sidjen stun}} uun detdiar kategorii.',
+'category-file-count' => "{{PLURAL:$2|Uun detdiar kategorii stäänt ian datei.|Uun detdiar kategorii {{PLURAL:$1|stäänt ian datei|stun jodiar $1 datein}} faan $2 uun't gehial.}}",
+'category-file-count-limited' => '{{PLURAL:$1|Detdiar datei stäänt|Jodiar $1 datein stun}} uun detdiar kategorii.',
+'listingcontinuesabbrev' => '(gongt widjer)',
+'index-category' => 'Indisiaret sidjen',
+'noindex-category' => 'Ei indisiaret sidjen',
 'broken-file-category' => 'Sid ma önjstöögne ferwisinge',
 
-'about' => 'Ouer',
-'article' => 'Sid',
-'newwindow' => '(wårt önj en nai waning ääm mååged)',
-'cancel' => 'Oufbreege',
-'moredotdotdot' => 'Mör ...',
+'about' => 'Auer',
+'article' => 'Artiikel',
+'newwindow' => '(woort uun en nei wönang eeben maaget)',
+'cancel' => 'Ufbreeg',
+'moredotdotdot' => 'Muar ...',
 'morenotlisted' => 'Öödern, ei apfeerd ...',
 'mypage' => 'Sidj',
 'mytalk' => 'Diskusjuun',
-'anontalk' => 'Diskusjoonssid foon jüdeer IP',
-'navigation' => 'Navigasjoon',
-'and' => '&#32;än',
+'anontalk' => 'Diskusjuunssidj faan detdiar IP',
+'navigation' => 'Nawigatjuun',
+'and' => '&#32;an',
 
 # Cologne Blue skin
-'qbfind' => 'Fine',
-'qbbrowse' => 'Bleese',
-'qbedit' => 'Änre',
-'qbpageoptions' => 'Jüdeer sid',
-'qbmyoptions' => 'Min side',
-'qbspecialpages' => 'Spetsjåålside',
+'qbfind' => 'Finj',
+'qbbrowse' => 'Schük',
+'qbedit' => 'Bewerke',
+'qbpageoptions' => 'Detdiar sidj',
+'qbmyoptions' => 'Min sidjen',
+'qbspecialpages' => 'Spezial-sidjen',
 'faq' => 'FAQ',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-addsection' => 'Stuk haanetufoue',
+'vector-action-addsection' => 'Nei kirew began',
 'vector-action-delete' => 'Strike',
-'vector-action-move' => 'Ferschüwe',
+'vector-action-move' => 'Fersküüw',
 'vector-action-protect' => 'Sääkere',
-'vector-action-undelete' => 'Wi mååge',
-'vector-action-unprotect' => 'Frijeewe unti späre',
+'vector-action-undelete' => 'Weder iinstel',
+'vector-action-unprotect' => 'Sidjenseekerhaid',
 'vector-simplesearch-preference' => 'Ianfacher sjüklist iinstel (bluas bi Vector)',
-'vector-view-create' => 'Mååge',
-'vector-view-edit' => 'Beårbe',
-'vector-view-history' => 'Dootäifärsjoone',
+'vector-view-create' => 'Maage',
+'vector-view-edit' => 'Bewerke',
+'vector-view-history' => 'Ferluup uunluke',
 'vector-view-view' => 'Lees',
-'vector-view-viewsource' => 'Kwältäkst önjkiike',
-'actions' => 'Aksjoone',
+'vector-view-viewsource' => 'Kweltekst uunluke',
+'actions' => 'Aktjuunen',
 'namespaces' => 'Noomerüme',
-'variants' => 'Fariante',
+'variants' => 'Warianten',
 
 'navigation-heading' => 'Nawigatsjuun',
-'errorpagetitle' => 'Fäägel',
-'returnto' => 'Tubääg tu jü side $1.',
-'tagline' => 'Üt {{SITENAME}}',
-'help' => 'Heelp',
-'search' => 'Säk',
-'searchbutton' => 'Säke',
-'go' => 'Ütfääre',
-'searcharticle' => 'Sid',
-'history' => 'Färsjoone',
-'history_short' => 'Färsjoone/autoore',
-'updatedmarker' => 'änred sunt man leest besäk',
-'printableversion' => 'Prantfärsjoon',
-'permalink' => 'Permanänten link',
-'print' => 'Prante',
+'errorpagetitle' => 'Diar as wat skiaf gingen',
+'returnto' => 'Turag tu sidj $1.',
+'tagline' => 'Faan {{SITENAME}}',
+'help' => 'Halep',
+'search' => 'Schük',
+'searchbutton' => 'Schük',
+'go' => 'Widjer',
+'searcharticle' => 'Sidj',
+'history' => 'Werjuunen',
+'history_short' => 'Ferluup',
+'updatedmarker' => 'feranert sant man leetst beschük',
+'printableversion' => 'Ütjdrük maage',
+'permalink' => 'Permanent link',
+'print' => 'Drük',
 'view' => 'Lees',
-'edit' => 'Beårbe',
-'create' => 'Mååge',
-'editthispage' => 'Sid beårbe',
-'create-this-page' => 'Sid mååge',
-'delete' => 'Strike',
-'deletethispage' => 'Jüdeer sid strike',
-'undelete_short' => '{{PLURAL:$1|1 färsjoon|$1 färsjoone}} widermååge',
-'viewdeleted_short' => '$1 {{PLURAL:$1|iinj sträägen färsjoon|$1 sträägene färsjoone}} önjkiike',
+'edit' => 'Bewerke',
+'create' => 'Maage',
+'editthispage' => 'Sidj bewerke',
+'create-this-page' => 'Nei sidj maage',
+'delete' => 'Strik',
+'deletethispage' => 'Detdiar sidj strik',
+'undelete_short' => '{{PLURAL:$1|1 werjuun|$1 werjuunen}} weder iinstel',
+'viewdeleted_short' => '{{PLURAL:$1|Ian stregen werjuun|$1 stregen werjuunen}} uunluke',
 'protect' => 'Sääkere',
-'protect_change' => 'änre',
-'protectthispage' => 'Sid önj ferbading hüülje',
-'unprotect' => 'Frijeewe unti späre',
+'protect_change' => 'feranre',
+'protectthispage' => 'Sidj seekre',
+'unprotect' => 'Sidjenseekerhaid',
 'unprotectthispage' => 'Sääkering aphääwe',
-'newpage' => 'Nai sid',
-'talkpage' => 'Jüdeer sid diskutiire',
-'talkpagelinktext' => 'diskusjoon',
-'specialpage' => 'Spetsjåålsid',
-'personaltools' => 'Persöönlike räischupe',
-'postcomment' => 'Nai oufsnaas',
-'articlepage' => 'Inhåltsid wise',
-'talk' => 'Diskusjoon',
-'views' => 'Önjsichte',
-'toolbox' => 'Räischape',
-'userpage' => 'Brükersid wise',
-'projectpage' => 'Prujäktsid wise',
-'imagepage' => 'Dååtäisid wise',
-'mediawikipage' => 'Mäldingssid wise',
-'templatepage' => 'Forlåågesid wise',
-'viewhelppage' => 'Heelpsid wise',
-'categorypage' => 'Kategoriisid wise',
-'viewtalkpage' => 'Diskusjoon',
-'otherlanguages' => 'Önj oudere spräke',
-'redirectedfrom' => '(Widerliidjet foon $1)',
-'redirectpagesub' => 'Widerliidjing',
-'lastmodifiedat' => 'Jüdeer sid wörd tuleest aw $1 am jü klook $2 änred.',
+'newpage' => 'Nei sidj',
+'talkpage' => 'Detdiar sidj diskutiare',
+'talkpagelinktext' => 'Diskusjuun',
+'specialpage' => 'Spezial-sidj',
+'personaltools' => 'Min werktjüügen',
+'postcomment' => 'Nei kirew',
+'articlepage' => 'Artiikel wise',
+'talk' => 'Diskusjuun',
+'views' => 'Uunsichten',
+'toolbox' => 'Werktjüügen',
+'userpage' => 'Brükersidj uunwise',
+'projectpage' => 'Projektsidj wise',
+'imagepage' => 'Dateisidj uunwise',
+'mediawikipage' => 'Mädialangssidj uunwise',
+'templatepage' => 'Föörlaagensidj uunwise',
+'viewhelppage' => 'Halepsidj uunwise',
+'categorypage' => 'Kategoriisidj uunwise',
+'viewtalkpage' => 'Diskusjuun uunluke',
+'otherlanguages' => 'Uun ööder spriaken',
+'redirectedfrom' => '(Widjerfeerd faan $1)',
+'redirectpagesub' => 'Widjerfeerang',
+'lastmodifiedat' => 'Detdiar sidj as tuleetst di $1, am a klook $2 anert wurden.',
 'viewcount' => 'Aw jüdeer sid as  {{PLURAL:$1|iinjsen|$1 tunge}} tugram wörden.',
 'protectedpage' => 'Sääkerd sid',
-'jumpto' => 'Schaft tu:',
-'jumptonavigation' => 'Navigasjoon',
-'jumptosearch' => 'k',
-'view-pool-error' => 'Önjschüliing, da särwere san nütutids ouerlååsted.
-Tufoole brükere fersäke, jüdeer sid tu besäken.
-Wees sü gödj än täiw hu minuute, iir dü dåt nuch iinjsen ferseechst.
+'jumpto' => 'Waksle tu:',
+'jumptonavigation' => 'Navigatsjuun',
+'jumptosearch' => 'Schük',
+'view-pool-error' => 'Det dää üs iarag, a servers san auerläästet.
+Tuföl brükern ferschük, det sidj tu beschüken.
+Wees so gud an teew en uugenblak, iar dü det noch ans ferschükst.
 
 $1',
 'pool-timeout' => "Tidj uflepen bi't teewen üüb't sperang",
@@ -252,140 +263,141 @@ $1',
 'pool-errorunknown' => 'Ünbekäänd feeler',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Ouer {{SITENAME}}',
-'aboutpage' => 'Project:Ouer',
-'copyright' => 'Inhålt stoont tu rädj uner jü $1.',
-'copyrightpage' => '{{ns:project}}:Uurhiiwerruchte',
-'currentevents' => 'Aktuäle schaiinge',
-'currentevents-url' => 'Project:Aktuäle schaiinge',
-'disclaimers' => 'Impressum',
-'disclaimerpage' => 'Project:Impressum',
-'edithelp' => 'Beårbingsheelp',
-'edithelppage' => 'Help:Beårbe',
-'helppage' => 'Help:Inhåltsfertiiknis',
-'mainpage' => 'Wikipedia:Hoodsid',
-'mainpage-description' => 'Hoodsid',
-'policy-url' => 'Project:Ruchtliinje',
-'portal' => 'Gemiinschaps-portåål',
-'portal-url' => 'Project:Gemiinschaps-portåål',
-'privacy' => 'Dootenschuts',
-'privacypage' => 'Project:Dootenschuts',
-
-'badaccess' => 'Niinj tulingende ruchte',
-'badaccess-group0' => 'Dü hääst ai jü nüsie beruchtiging for jüdeer aksjoon',
-'badaccess-groups' => 'Jüdeer aksjoon as begränsed aw brükere, da tu {{PLURAL:$2|di grupe|åån foon da grupe}} „$1“ hiire.',
-
-'versionrequired' => 'Färsjoon $1 foon MediaWiki as nüsi.',
-'versionrequiredtext' => 'Färsjoon $1 foon MediaWiki as nüsi, am jüdeer sid tu brüken.
-Sii jü [[Special:Version|Färsjoonssid]]',
+'aboutsite' => 'Auer {{SITENAME}}',
+'aboutpage' => 'Project:Auer',
+'copyright' => 'Det stäänt oner det lisens $1.',
+'copyrightpage' => '{{ns:project}}:Copyrights',
+'currentevents' => 'Aktuels',
+'currentevents-url' => 'Project:Aktuels',
+'disclaimers' => 'Disclaimers',
+'disclaimerpage' => 'Project:Disclaimers',
+'edithelp' => "Halep bi't bewerkin",
+'edithelppage' => 'Help:Bewerke',
+'helppage' => 'Help:Auersicht',
+'mainpage' => 'Hoodsidj',
+'mainpage-description' => 'Hoodsidj',
+'policy-url' => 'Project:Reegeln',
+'portal' => 'Gemianskap',
+'portal-url' => 'Project:Gemianskap',
+'privacy' => 'Persöönelk dooten',
+'privacypage' => 'Project:Persöönelk dooten',
+
+'badaccess' => 'Brükerrochten ling ei',
+'badaccess-group0' => 'För detdiar aktjuun heest dü ei nooch brükerrochten.',
+'badaccess-groups' => 'Detdiar aktjuun mut bluas faan brükern uun {{PLURAL:$2|det skööl|ian faan jodiar sköölen}} „$1“ ütjfeerd wurd.',
+
+'versionrequired' => 'Werjuun $1 faan MediaWiki woort brükt.',
+'versionrequiredtext' => "Werjuun $1 faan MediaWiki woort brükt, am detdiar sidj tu brüken.
+Luke efter bi't [[Special:Version|werjuunssidj]]",
 
 'ok' => 'OK',
 'pagetitle' => '$1 – {{SITENAME}}',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
 'backlinksubtitle' => '← $1',
-'retrievedfrom' => 'Foon „$1“',
-'youhavenewmessages' => 'Dü hääst $1 aw din diskusjoonssid ($2).',
-'newmessageslink' => 'naie tisinge',
+'retrievedfrom' => 'Faan „$1“',
+'youhavenewmessages' => 'Dü heest $1 ($2).',
+'newmessageslink' => 'nei bööd',
 'newmessagesdifflink' => 'Leest änring',
 'youhavenewmessagesfromusers' => 'Dü heest $1 faan {{PLURAL:$3|en öödern brüker|$3 ööder brükern}} ($2).',
 'youhavenewmessagesmanyusers' => 'Dü heest $1 faan flook ööder brükern ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|ian nei nooracht|nei noorachten}}',
 'newmessagesdifflinkplural' => 'leetst {{PLURAL:$1|feranrang|feranrangen}}',
-'youhavenewmessagesmulti' => 'Dü hääst nai tisinge aw $1',
-'editsection' => 'Beårbe',
+'youhavenewmessagesmulti' => 'Dü heest nei bööd üüb $1',
+'editsection' => 'Bewerke',
 'editsection-brackets' => '[$1]',
-'editold' => 'Beårbe',
-'viewsourceold' => 'kwältakst wise',
-'editlink' => 'beårbe',
-'viewsourcelink' => 'kwältakst wise',
-'editsectionhint' => 'Säksjoon beårbe: $1',
+'editold' => 'Bewerke',
+'viewsourceold' => 'kweltekst uunwise',
+'editlink' => 'bewerke',
+'viewsourcelink' => 'kweltekst uunwise',
+'editsectionhint' => 'Kirew bewerke: $1',
 'toc' => 'Inhåltsfertiiknis',
 'showtoc' => 'Wise',
 'hidetoc' => 'Ferbärje',
 'collapsible-collapse' => 'Tuupdoble',
 'collapsible-expand' => 'Ütjenööderdoble',
-'thisisdeleted' => '$1 önjkiike unti widermååge?',
-'viewdeleted' => '$1 wise?',
-'restorelink' => '$1 {{PLURAL:$1|sträägen Färsjoon|sträägene Färsjoone}}',
+'thisisdeleted' => '$1 uunluke of weder iinstel',
+'viewdeleted' => '$1 uunluke?',
+'restorelink' => '$1 {{PLURAL:$1|stregen werjuun|stregen werjuunen}}',
 'feedlinks' => 'Feed:',
-'feed-invalid' => 'Üngülti feed-abonemänt-typ.',
-'feed-unavailable' => 'Deer stönje niinj feeds tu rädj.',
-'site-rss-feed' => 'RSS-feed for $1',
-'site-atom-feed' => 'Atom-feed for $1',
-'page-rss-feed' => 'RSS-feed for „$1“',
-'page-atom-feed' => 'Atom-feed for „$1“',
+'feed-invalid' => 'Feed-abonement-typ as ferkiard.',
+'feed-unavailable' => 'Diar san nian feeds.',
+'site-rss-feed' => 'RSS-feed för $1',
+'site-atom-feed' => 'Atom-feed för $1',
+'page-rss-feed' => 'RSS-feed för „$1“',
+'page-atom-feed' => 'Atom-feed för „$1“',
 'feed-atom' => 'Atom',
 'feed-rss' => 'RSS',
-'red-link-title' => '$1 (sid ai deer)',
+'red-link-title' => '$1 (sidj ei diar)',
 'sort-descending' => 'Sortiare faan boowen tu onern',
 'sort-ascending' => 'Sortiare faan onern tu boowen',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Sid',
-'nstab-user' => 'Brükersid',
-'nstab-media' => 'Meediesid',
-'nstab-special' => 'Spetsjåålsid',
-'nstab-project' => 'Prujäktsid',
-'nstab-image' => 'Dååtäi',
-'nstab-mediawiki' => 'Berucht',
-'nstab-template' => 'Forlååge',
-'nstab-help' => 'Heelpsid',
+'nstab-user' => 'Brükersidj',
+'nstab-media' => 'Meediensidj',
+'nstab-special' => 'Spezial-sidj',
+'nstab-project' => 'Projektsidj',
+'nstab-image' => 'Datei',
+'nstab-mediawiki' => 'Bööd',
+'nstab-template' => 'Föörlaag',
+'nstab-help' => 'Halepsidj',
 'nstab-category' => 'Kategorii',
 
 # Main script and global functions
-'nosuchaction' => "Ai sü'n aksjoon",
-'nosuchactiontext' => 'Jü aksjoon spesifisiird döör di URL jült ai.
-Dü koost di URL ferkiird tipt hääwe, unti dü hääst en ferkiirden link fülied.
-Dåt koon uk en fäägel önjjeewe önj e software, jü {{SITENAME}} brúkt.',
-'nosuchspecialpage' => "Ai sü'n spetsjäl sid",
-'nospecialpagetext' => '<strong>Jü önjfrååged spetsjåålsid as ai deer.</strong>
+'nosuchaction' => 'Son aktjuun jaft at ei',
+'nosuchactiontext' => 'Son aktjuun jaft at üüb MediaWiki ei.
+Ferlicht heest dü det URL ferkiard apskrewen, of dü beest en ferkiard ferwisang fulagt.
+Ferlicht as det uk en feeler uun det software faan {{SITENAME}}.',
+'nosuchspecialpage' => 'Son spezial-sidj jaft at ei.',
+'nospecialpagetext' => '<strong>Son spezial-sidj jaft at ei.</strong>
 
-Åle ferfäigboore spetsjåålside san önj e [[Special:SpecialPages|List foon da spetsjåålside]] tu finen.',
+En list mä aal a spezial-sidjen fanjst dü üüb [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Fäägel',
-'databaseerror' => 'Dootebånkfäägel',
+'error' => 'Feeler',
+'databaseerror' => 'Dootenbeenkfeeler',
 'dberrortext' => 'Diar as wat skiaf gingen mä det dootenbeenk.
 Ferlicht as det software ei bi a rä.
 Det leetst uunfraag tu\'t dootenbeenk wiar:
 <blockquote><code>$1</code></blockquote>
 faan det funktsjuun "<code>$2</code>".
 Det dootenbeenk swaaret mä "<samp>$3: $4</samp>".',
-'dberrortextcl' => 'Dåt jäif en süntaksfäägel önj e dootebånk-ouffrååch.
-Jü leest dootebånkouffrååch wus  „$1“ üt e funksjoon „<tt>$2</tt>“.
-Jü dootebånk mälded jü fäägel: „<tt>$3: $4</tt>“.',
-'laggedslavemode' => "''''Woarschauing:''' Jü wised sid köö uner amstånde ai da leeste beåarbinge önjthüülje.",
-'readonly' => 'Dootebånk späred',
-'enterlockreason' => 'Wees swü gödj än jeew en grün önj, weeram jü dootebånk späred wårde schal än en schåting ouer e duur foon jü späre',
-'readonlytext' => 'Jü dootebånk as forluupi späred for naie önjdreege än änringe. Wees sü gödj än fersäk dåt lääser nuch iinjsen.
-
-Grün foon e späre: $1',
+'dberrortextcl' => "Bi't uffraagin faan a dootenbeenk as wat skiaf gingen. Det leetst uffraag wiar:
+„$1“
+ütj det funktjuun „$2“.
+At dootebeenk swaaret: „$3: $4“.",
+'laggedslavemode' => "'''Paase üüb:''' Ferlicht wiset detdiar sidj ei a leetst stant.",
+'readonly' => 'Dootenbeenk speret.',
+'enterlockreason' => 'Wees so gud an du en grünj uun, huaram det dootenbeenk speret wurd skal, an hü loong det (amanbi) speret wurd skal.',
+'readonlytext' => "Det dootenbeenk as iarst ans speret för nei iindracher an feranrangen, woorskiinelk, auer diar jüst apredet woort. Ferschük det leeder man noch ans.
+
+Grünj för't sperin: $1",
 'missing-article' => 'Di täkst for „$1“ $2 wörd ai önj e dååtenbånk fünen.
 
 Jü sid as möölikerwise tuninte mååged unti ferschääwen wörden.
 
 Wan dåt ai di fål as, hääst dü eewäntuäl en fäägel önj e software fünen. Mäld dåt hål en  [[Special:ListUsers/sysop|administrator]] unner nååming foon jü URL.',
-'missingarticle-rev' => '(Färsjoonsnumer: $1)',
-'missingarticle-diff' => '(Ferschääl twasche färsjoone: $1, $2)',
+'missingarticle-rev' => '(Werjuunsnumer: $1)',
+'missingarticle-diff' => '(Ferskeel tesken $1 an $2)',
 'readonly_lag' => 'Jü dootebånk wörd automaatisch for schriwtugraawe späred, deerma da ferdiiljde dootebånke (slaves) jam ma di hooddootebånksärwer (master) oufglike koone.',
-'internalerror' => 'Intärn fäägel',
-'internalerror_info' => 'Intärne fäägel: $1',
+'internalerror' => 'Süsteemfeeler',
+'internalerror_info' => 'Süsteemfeeler: $1',
 'fileappenderrorread' => '"$1" köö wilert dåt baitufäigen ai leesen wårde.',
 'fileappenderror' => 'Köö ai "$1" tu "$2" önjhinge.',
-'filecopyerror' => 'Jü dootäi "$1" köö ai eefter "$2" kopiiird wårde.',
-'filerenameerror' => 'Jü dootäi "$1" köö ai eefter "$2" amnååmd wårde.',
-'filedeleteerror' => 'Jü dootäi "$1" köö ai straagen wårde.',
+'filecopyerror' => 'Det datei $1 küd ei efter $2 kopiaret wurd.',
+'filerenameerror' => 'Det datei $1 küd ei efter $2 amnäämd wurd.',
+'filedeleteerror' => 'Det datei $1 küd ei stregen wurd.',
 'directorycreateerror' => 'Dåt fertiiknis "$1" köö ai mååged wårde.',
-'filenotfound' => 'Köö dootäi "$1" ai fine.',
-'fileexistserror' => 'Ai möölik, eefter dootäi "$1" tu schriwen: dootäi bestoont ål',
+'filenotfound' => 'Det datei $1 küd ei fünjen wurd.',
+'fileexistserror' => 'Uun det datei "$1" küd ei skrewen wurd: Hat as al diar.',
 'unexpected' => 'Ünfermousene wjart: "$1"="$2".',
 'formerror' => 'Fäägel: köö jü form ai lääwere',
 'badarticleerror' => 'Jüdeer aksjoon koon ai aw jüdeer sid mååged wårde.',
-'cannotdelete' => 'Jü sid unti dootäi "$1" köö ai straagen wårde.
-Dåt as flicht ål straagen foon huum ouders.',
+'cannotdelete' => 'Det sidj of datei "$1" küd ei stregen wurd.
+Det as ferlicht al faan hoker ööders stregen wurden.',
 'cannotdelete-title' => 'Sidj „$1“ koon ei stregen wurd.',
 'delete-hook-aborted' => 'Det striken as faan en software-feranerang faan MediaWiki ferhanert wurden. Di grünj as ei bekäänd.',
-'badtitle' => 'Ferkiirde tiitel',
+'badtitle' => 'Ferkiard tiitel',
 'badtitletext' => 'Di tiitel foon jü anfrååged sid as üngülti, lääsi unti n üngültigen spräklink foon en ouder wiki.',
 'perfcached' => 'Jodiar dooten kem faan a cache an san ferlicht ei muar aktuel. Huuchstens {{PLURAL:$1|ian resultoot as|$1 resultooten san}} uun a cache.',
 'perfcachedts' => 'Jodiar dooten kem faan a cache, leetst tooch nei: $1. Huuchstens {{PLURAL:$4|ian resultoot as|$4 resultooten san}} uun a cache.',
@@ -393,9 +405,9 @@ Dåt as flicht ål straagen foon huum ouders.',
 'wrong_wfQuery_params' => 'Ferkiirde parameetere for wfQuery()<br />
 Funksjoon: $1<br />
 Ouffrååch: $2',
-'viewsource' => 'Kwältäkst önjkiike',
+'viewsource' => 'Kweltekst uunluke',
 'viewsource-title' => 'Code faan sidj $1 uunluke',
-'actionthrottled' => 'Aksjoonstål limitiird',
+'actionthrottled' => 'Taal faan aktjuunen limitiaret',
 'actionthrottledtext' => 'Dü hääst jüdeer aksjoon tu oofding bane en kort tidrüm ütfjard. Wees sü gödj än täiw en påår minuute än fersäk dåt et dan foon naien.',
 'protectedpagetext' => 'Detdiar sidj as seekert wurden, am dat diar näämen wat feranert.',
 'viewsourcetext' => 'Dü koost jü kwäle foon jüdeer sid bekiike än kopiire.',
@@ -404,14 +416,14 @@ Ouffrååch: $2',
 Dü könst [//translatewiki.net/ translatewiki.net] faan MediaWiki brük, am auersaatangen för ale wiki projekten tu maagin.',
 'editinginterface' => "'''Paase üüb:''' Üü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 Nuurdfresk Wikipedia.
 Wan dü wat auersaat wel, maage det mä [//translatewiki.net/ translatewiki.net], det as det MediaWiki lokalisiarangsprojekt.",
-'sqlhidden' => 'SCL-ouffrååg ferstäägen',
-'cascadeprotected' => 'Jüdeer sid as for beårbing spärd. Jü as önj {{PLURAL:$1|e füliende sid|da füliende side}}
-önjbünen, {{PLURAL:$1|jü|da}} madels e kaskaadespäropsjoon önj febading hüüljen {{PLURAL:$1|as|san}}:
+'sqlhidden' => 'SQL-uffraag as ferbürgen',
+'cascadeprotected' => 'Detdiar sidj koon ei bewerket wurd. Hat as uun {{PLURAL:$1|detdiar sidj|jodiar sidjen}}
+iinbünjen, diar auer kaskaadenseekerhaid seekert {{PLURAL:$1|as|san}}:
 $2',
-'namespaceprotected' => "Dü hääst niinj beruchtiging, jü sid önj di '''$1'''-noomerüm tu beårben.",
+'namespaceprotected' => "Dü heest ei det brükerrocht, am sidjen uun di nöömrüm '''$1''' tu bewerkin.",
 'customcssprotected' => 'Dü mutst detheer CSS sidj ei bewerke, auer det hoker ööders hiart.',
 'customjsprotected' => 'Dü mutst detheer JavaScript sidj ei bewerke, auer det hoker ööders hiart.',
-'ns-specialprotected' => 'Spetsjåålside koone ai beårbed wårde.',
+'ns-specialprotected' => 'Spezial-sidjen kön ei bewerket wurd.',
 'titleprotected' => 'En sid ma dideer noome koon ai önjläid wårde.
 Jü späre wörd döör [[User:$1|$1]] ma grün "$2" inruchted.',
 'filereadonlyerror' => 'Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluas leesen wurd koon.
@@ -422,56 +434,85 @@ Di grünj faan di administraator as: „$3“.',
 'exception-nologin-text' => 'Det könst dü bluas bewerke, wan dü uunmeldet beest.',
 
 # Virus scanner
-'virus-badscanner' => "Hiinje konfigurasjoon: ünbekånde fiirusscanner: ''$1''",
-'virus-scanfailed' => 'scan fäägelsloin (code $1)',
-'virus-unknownscanner' => 'Ã\9cnbekÃ¥nde fiirusscanner:',
+'virus-badscanner' => "Ferkiard iinstelang: Ünbekäänd wiirenscanner: ''$1''",
+'virus-scanfailed' => 'scan ging skiaf (code $1)',
+'virus-unknownscanner' => 'Ã\9cnbekäänd wiirenscanner:',
 
 # Login and logout pages
-'logouttext' => "'''Dü bast nü oufmälded.'''
+'logouttext' => "'''Dü beest nü ufmeldet.'''
 
-Dü koost {{SITENAME}} nü anonüüm widerbrüke, unti de wider uner diseelew unti en oudern brükernoome <span class='plainlinks'>[$1 önjmälde]</span>.
-Påås aw, dåt hu side nuch wise koone, dåt dü önjmälded bast, sülung dü ai dan browsercache lääsimååged heest.",
+Dü könst {{SITENAME}} nü anonüüm widjerbrük, of di weder <span class='plainlinks'>[$1 uunmelde]</span>.
+Enkelt sidjen wise ferlicht noch uun, dat dü uunmeldet beest, so loong dü dan browser-cache ei leesag maaget heest.",
 'welcomeuser' => 'Welkimen, $1!',
 'welcomecreation-msg' => 'Din brükerkonto as iinracht wurden.
 Ferjid det ei, an aachte üüb din [[Special:Preferences|{{SITENAME}} iinstelangen]].',
-'yourname' => 'Brükernoome:',
-'yourpassword' => 'Pååsuurd:',
+'yourname' => 'Brükernööm:',
+'userlogin-yourname' => 'Brükernööm',
+'userlogin-yourname-ph' => 'Du dan Brükernööm iin',
+'yourpassword' => 'Paaswurd:',
+'userlogin-yourpassword' => 'Paaswurd',
+'userlogin-yourpassword-ph' => 'Paaswurd iindu',
+'createacct-yourpassword-ph' => 'Paaswurd iindu',
 'yourpasswordagain' => 'Schriw pååsuurd nuch iinjsen:',
-'remembermypassword' => 'Aw diheere komputer foon duur önjmälde (maksimool for $1 {{PLURAL:$1|däi|deege}})',
+'createacct-yourpasswordagain' => 'Paaswurd gudkään',
+'createacct-yourpasswordagain-ph' => 'Du det paaswurd noch ans iin',
+'remembermypassword' => 'Üüb diheer reegner üüb düür uunmelde (maksimaal för $1 {{PLURAL:$1|dai|daar}})',
+'userlogin-remembermypassword' => 'Uunmeldet bliiw',
+'userlogin-signwithsecure' => 'Seeker ferbinjang brük',
 'securelogin-stick-https' => 'Eefter önjmälding ma HTTPS ferbünen bliwe',
 'yourdomainname' => 'Din domain:',
 'password-change-forbidden' => 'Üüb detheer wiki könst dü nian paaswurden feranre.',
 'externaldberror' => 'Deer läit en fäägel bai jü äkstärn autentifisiiring for, unti dü möist din äkstärn brükerkonto äi aktualisiire.',
-'login' => 'Önjmälde',
-'nav-login-createaccount' => 'Önjmälde',
+'login' => 'Uunmelde',
+'nav-login-createaccount' => 'Melde di uun of skriiw di iin',
 'loginprompt' => 'For jü önjmälding monje cookies aktiwiird weese.',
-'userlogin' => 'Önjmälde / brükerkonte mååge',
-'userloginnocreate' => 'Önjmälde',
-'logout' => 'Oufmälde',
-'userlogout' => 'Oufmälde',
-'notloggedin' => 'Ai önjmälded',
+'userlogin' => 'Melde di uun of skriiw di iin',
+'userloginnocreate' => 'Uunmelde',
+'logout' => 'Ufmelde',
+'userlogout' => 'Ufmelde',
+'notloggedin' => 'Ei uunmeldet',
+'userlogin-noaccount' => 'Dü heest noch nään brükerkonto ?',
+'userlogin-joinproject' => 'Bi {{SITENAME}} mämaage',
 'nologin' => "Dü hääst niinj brükerkonto? '''$1'''.",
 'nologinlink' => 'Nai brükerkonto inruchte',
 'createaccount' => 'Brükerkonto inruchte',
 'gotaccount' => "Dü hääst ål en brükerkonto? '''$1'''.",
-'gotaccountlink' => 'Önjmälde',
+'gotaccountlink' => 'Uunmelde',
 'userlogin-resetlink' => 'Heest dü din login dooten ferjiden?',
-'createaccountmail' => 'E-mail tu det adres oner fersjüür mä en tufelag paaswurd',
-'createaccountreason' => 'Grün:',
-'badretype' => 'Da biise pååsuurde stime ai oueriinj.',
+'userlogin-resetpassword-link' => 'Paaswurd turagsaat',
+'helplogin-url' => 'Help:Uunmelde',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Halep bi't uunmeldin]]",
+'createacct-join' => 'Du oner din dooten iin.',
+'createacct-emailrequired' => 'E-mail adres',
+'createacct-emailoptional' => 'E-mail adres (optional)',
+'createacct-email-ph' => 'Du din e-mail adres iin',
+'createaccountmail' => 'E-mail tu det adres oner ferschüür mä en tufelag paaswurd',
+'createacct-realname' => 'Rocht nööm (optional)',
+'createaccountreason' => 'Grünj:',
+'createacct-reason' => 'Grünj',
+'createacct-reason-ph' => 'Huaram dü en ööder brükerkonto iinrachtst',
+'createacct-captcha' => 'Seekerhaidspreew',
+'createacct-imgcaptcha-ph' => 'Skriiw di tekst, diar dü boowen schochst',
+'createacct-submit' => 'Din brükerkonto iinracht',
+'createacct-benefit-heading' => '{{SITENAME}} woort faan lidj üs di maaget.',
+'createacct-benefit-body1' => '{{PLURAL:$1|feranrang|feranrangen}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|sidj|sidjen}}',
+'createacct-benefit-body3' => 'aktiif {{PLURAL:$1|skriiwer|skriiwern}}',
+'badretype' => 'Jo tau paaswurden san ei likedenang.',
 'userexists' => 'Dideer brükernoome as ål ferjääwen.
 Wees sü gödj en kiis en ouderen.',
-'loginerror' => 'Fäägel bai önjmälding',
-'createaccounterror' => 'Brükerkonto köö ai mååged wårde: $1',
+'loginerror' => "Bi't uunmeldin as wat skiaf gingen",
+'createacct-error' => "Bi't iinrachten faan det brükerkonto as wat skiaf gingen",
+'createaccounterror' => 'Brükerkonto küd ei iinracht wurd: $1',
 'nocookiesnew' => 'Di benjütertugung wörd mååged, ouers dü bast ai önjmälded. {{SITENAME}} brükt for jüdeer funksjoon cookies.
 Wees sü gödj än aktiwiir da än mäld de dan ma dan naien benjüternoome än dåt tuhiirend pååsuurd önj.',
 'nocookieslogin' => '{{SITENAME}} benjütet cookies tu e önjmälding foon da benjütere. Dü heest Cookis deaktiwiird.
 Wees sü gödj än aktiwiir da än fersäk dåt wider.',
 'nocookiesfornew' => 'Det brükerkonto as ei iinracht wurden, auer wi ei witj, huar a dooten faan kem.
 Üüb dan kompjuuter skel cookies aktiwiaret wees. Do rep detheer sidj noch ans nei ap.',
-'noname' => 'Dü möist en gültigen brükernooem önjjeewe.',
-'loginsuccesstitle' => 'Önjmälding erfolchrik',
-'loginsuccess' => "'''Dü bast nü ås „$1“ bai {{SITENAME}} önjmälded.'''",
+'noname' => 'Dü skel en rochten brükernööm uundu.',
+'loginsuccesstitle' => 'Uunmeldin hää löket.',
+'loginsuccess' => "'''Dü beest nü üs „$1“ bi {{SITENAME}} uunmeldet.'''",
 'nosuchuser' => 'Di brükernoome „$1“ bestoont ai.
 Präiw jü schriwwise (grut-/latjschriwing beåchte) unti [[Special:UserLogin/signup|mäld de ås naie brüker önj]].',
 'nosuchusershort' => 'Deer as nåån brüker ma noome  "$1".
@@ -482,7 +523,7 @@ Präiw din ruchtschriwing.',
 Wees sü gödje än fersäk dåt nuch iinjsen.',
 'wrongpasswordempty' => 'Deer wörd niinj pååsuurd önjjääwen. Fersäk dåt foon naien.',
 'passwordtooshort' => 'Pååsuurde mönje tu t manst {{PLURAL:$1|1 tiiken|$1 tiikne}} lung weese.',
-'password-name-match' => 'Din pååsuurd mätj ferschääle foon dan brükernoome.',
+'password-name-match' => 'Dü könst dan brükernööm ei üs paaswurd nem.',
 'password-login-forbidden' => 'Jüdeer brükernoome än paasuurd as ferbin.',
 'mailmypassword' => 'Nai pååsuurd tusiinje',
 'passwordremindertitle' => 'Nai tidwise pååsuurd for {{SITENAME}}',
@@ -492,20 +533,20 @@ En nei paaswurd för di brüker "$2" as maaget wurden an het nü "$3".
 Wan dü det würelk so haa wel, do melde di nü uun an feranere det paaswurd. Det nei paaswurd täält för {{PLURAL:$5|ään dai|$5 daar}}.
 
 Wan dü ei salew am en nei paaswurd fraaget heest, do säärst dü di am niks widjer komre. Do könst dü din ual paaswurd widjer brük.',
-'noemail' => 'Deer as niinj E-mail-adräs bekånd for brüker "$1".',
-'noemailcreate' => 'Dü möist en gülti E-mail-adräs önjjeewe',
-'passwordsent' => 'En nai pååsuurd as sånd tu jü E-mail-adräs registriird for "$1".
+'noemail' => 'Diar as nian e-mail adres bekäänd för di brüker "$1".',
+'noemailcreate' => 'Dü skel en rocht e-mail adres uundu.',
+'passwordsent' => 'En nai pååsuurd as sånd tu jü e-mail-adräs registriird for "$1".
 Mälde wi önj eefter dü jü füngen heest.',
-'blocked-mailpassword' => 'Jü foon de ferwånde IP-adräs as for dåt änren foon side späred. Am en masbrük tu ferhanern, wórd jü möölikhäid tu dåt önjfråågen foon en nai pååsuurd uk späred.',
-'eauthentsent' => 'En bestääsiings-E-mail wörd önj jü önjjääwen adräs sånd.
+'blocked-mailpassword' => 'Det IP-adres, wat dü brükst, as speret wurden. Am dat diar nian dom tjüch mä maaget woort, as uk det uffraagin faan paaswurden speret wurden.',
+'eauthentsent' => 'En bestääsiings-e-mail wörd önj jü önjjääwen adräs sånd.
 
-Iir en E-mail foon oudere brükere ouer jü E-mail-funksjoon emfångd wårde koon, mötj jü adräs än har wörklike tuhiirihäid tu dåtheer brükerkonto jarst bestääsied wårde. Wees sü gödj än befülie da haanewisinge önj di bestääsiings-E-mail.',
+Iir en e-mail foon oudere brükere ouer jü e-mail-funksjoon emfångd wårde koon, mötj jü adräs än har wörklike tuhiirihäid tu dåtheer brükerkonto jarst bestääsied wårde. Wees sü gödj än befülie da haanewisinge önj di bestääsiings-e-mail.',
 'throttled-mailpassword' => 'Deer wörd önj da leeste {{PLURAL:$1|stün|$1 stüne}} ål en nai pååsuurd önjfrååged. Am en masbrük foon jüdeer funksjoon tu ferhanren, koon bloot {{PLURAL:$1|iinjsen pro stün|åle $1 stüne}} en nai pååsuurd önjfrååged wårde.',
-'mailerror' => 'Fäägel bai dåt siinjen foon e E-mail: $1',
+'mailerror' => 'Fäägel bai dåt siinjen foon e e-mail: $1',
 'acct_creation_throttle_hit' => 'Besäkere foon jüheer Wiki, da din IP-adräse brüke, heewe önj e leeste däi {{PLURAL:$1|1 brükerkonto|$1 brükerkontos}} mååged, wat jü maksimool tuleet tål önj jüdeer tidperioode as.
 
 Besäkere, da jüheer IP-adräse brüke, koone tutids niinj brükerkonto mör inruchte.',
-'emailauthenticated' => 'Din E-mail-adräs word di $2 am e klook $3 bestääsied.',
+'emailauthenticated' => 'Din e-mail-adräs word di $2 am e klook $3 bestääsied.',
 'emailnotauthenticated' => 'Din E-mail-adräs as nuch ai bestääsied. Da füliende E-mail-funksjoone stönje jarst eefter erfolchrike bestääsiing tu ferfäiging.',
 'noemailprefs' => 'Jeew en E-mail-adräs önj da önjstalinge önj, deerma da füliende funksjoone tu ferfäiging stönje.',
 'emailconfirmlink' => 'E-mail-adräs bestääsie (autäntifisiire).',
@@ -524,7 +565,7 @@ Fåls dåt benjüterkonto üt fersiinj önjläid wörd, koost dü jüdeer tising
 'login-throttled' => 'Dü heest tu oofding fersoocht, di önjtumälden.
 Wees sü gödj än täif, bit dü wider ferseechst.',
 'login-abort-generic' => 'Din önjmälding wus ei erfolchrik - Oufbräägen',
-'loginlanguagelabel' => 'Spräke: $1',
+'loginlanguagelabel' => 'Spriak: $1',
 'suspicious-userlogout' => 'Dan Oufmäldönjfrååge wörd ferwaigred, deer ja fermouslik foon en defäkte browser unti en cache-proxy sånd wörd.',
 
 # Email sending
@@ -545,17 +586,19 @@ Nü wårst dü önjmälded...',
 'resetpass_forbidden' => 'Pååsuurde koone ai änred wårde',
 'resetpass-no-info' => 'Dü möist önjmälded weese am ju sid diräkt tu tu gripen.',
 'resetpass-submit-loggedin' => 'Pååsuurd änre',
-'resetpass-submit-cancel' => 'Oufbreege',
+'resetpass-submit-cancel' => 'Ufbreeg',
 'resetpass-wrong-oldpass' => 'Üngülti tämporäär unti antuäl pååsuurd.
 Möölikerwise heest dü din pååsuurd ål ma erfolch änred heest unti en nai tämporäär pååsuurd beönjdräägen.',
 'resetpass-temp-password' => 'Tidwise pååsuurd:',
+'resetpass-abort-generic' => 'Det paaswurd-anerang as ferhanert wurden.',
 
 # Special:PasswordReset
 'passwordreset' => 'Paasuurd tubääg seete',
-'passwordreset-text' => 'Fal detheer formulaar ütj, am din paaswurd turag tu saaten.',
+'passwordreset-text-one' => 'Fal detheer formulaar ütj, am din paaswurd turag tu saaten.',
+'passwordreset-text-many' => '{{PLURAL:$1|Du ian stak faan a dooten iin, am din paaswurd turag tu saaten.}}',
 'passwordreset-legend' => 'Paasuurd tubääg seete',
 'passwordreset-disabled' => 'Dü koost din paasuurd aw jüdeer wiki ai tubääg seete',
-'passwordreset-pretext' => '{{PLURAL:$1||Du ian faan jo dooten oner iin}}',
+'passwordreset-emaildisabled' => 'E-mail as üüb detheer Wiki ufknipset wurden.',
 'passwordreset-username' => 'Brükernoome:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Wel dü det e-mail nooracht uunluke?',
@@ -577,7 +620,7 @@ $2
 Tidwis paasuurd: $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 ufsjüürd wurd: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Feranre det E-Mail-adres',
@@ -628,7 +671,7 @@ Wan dü wider aw \"Sid spiikre\" klikst, wårt din änring suner tuhuupefooting
 Wan dü wider aw \"{{int:savearticle}}\" klakst, wårt din beårbing suner ouerschaft spiikerd.",
 'summary-preview' => 'Forlök foon jü tuhuupfootingssid:',
 'subject-preview' => 'Forkiik foon dåt subjäkt:',
-'blockedtitle' => 'Brüker as späred',
+'blockedtitle' => 'Brüker as speret',
 'blockedtext' => "'''Dan brükernööm of IP adres as speret wurden.'''
 
 Det as maaget wurden faan $1.
@@ -660,14 +703,14 @@ Dü könst ei det E-Mail-funktsjuun 'E-mail tu dideere brüker' brük, so loong
 Uugenblakelk as din IP addres $3, an det sper ID as #$5.
 För arke uunfraag wurd aal jo informatsjuunen boowen brükt.",
 'blockednoreason' => 'niinj grün önjjääwen',
-'whitelistedittext' => 'Dü möist de $1, am side beårbe tu koonen.',
+'whitelistedittext' => 'Dü skel di $1, am sidjen tu bewerkin.',
 'confirmedittext' => 'Dü möist din E-mail-adräs jarst bestääsie, iir dü beårbinge döörfääre koost. Mååg din årbe radi än bestääsie din E-mail önj da  [[Special:Preferences|önjstalinge]].',
 'nosuchsectiontitle' => 'Stuk ai fünen',
 'nosuchsectiontext' => 'Dü fersoochst en stuk tu änren, dåt dåt ai jeeft.
 Dåt koon ferschääwen unti wächhååld weese, wilt dü jü sid bekiikedest.',
-'loginreqtitle' => 'Önjmälden nüsi.',
-'loginreqlink' => 'Önjmälde',
-'loginreqpagetext' => 'Dü möist $1 am oudere side tu bekiiken.',
+'loginreqtitle' => 'Dü skel di uunmelde.',
+'loginreqlink' => 'Uunmelde',
+'loginreqpagetext' => 'Dü skel di $1, am ööder sidjen uuntulukin.',
 'accmailtitle' => 'Pååsuurd sånd.',
 'accmailtext' => "En tufäli generiird pååsuurd for [[User talk:$1|$1]] wörd tu $2 fersånd.
 
@@ -678,11 +721,11 @@ Am jü sid tu måågen, dreeg dan täkst önj e unerstönjene box in (sii jü
 [[{{MediaWiki:Helppage}}|heelpsid]] for mör informasjoon).
 Bast üt fersiien heer, klik di '''tubääg'''-klänkfläche foon dan browser.",
 'anontalkpagetext' => "----''Üüb detheer sidj könst dü en ünbekäänden brüker en nooracht du. Det lääpt auer sin IP adres. IP adresen kön faan flook brükern brükt wurd. Wan dü mä detheer nooracht niks began könst, do as det ferlicht för hoker ööders mend weesen. Dü säärst niks widjer onernem. Wan dü en aanj [[Special:UserLogin/signup|brükerkonto iinrachst]] of di [[Special:UserLogin|uunmeldest]], komt sowat ei weder föör.",
-'noarticletext' => 'Jüdeer sid önjhålt uugenblaklik nuch nån täkst.
-Dü koost dideere tiitel aw da ouder side [[Special:Search/{{PAGENAME}}|säke]],
-<span class="plainlinks">önj da deertuhiirende [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logböke säke] unti jüdeer sid [{{fullurl:{{FULLPAGENAME}}|action=edit}} beårbe]</span>.',
+'noarticletext' => 'Üüb detdiar sidj stäänt noch niks.
+Dü könst didiar tiitel üüb ööder sidjen [[Special:Search/{{PAGENAME}}|schük]],
+<span class="plainlinks">uun [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logbuken schük] of detdiar sidj [{{fullurl:{{FULLPAGENAME}}|action=edit}} bewerke]</span>.',
 'noarticletext-nopermission' => 'Üüb detdiar sidj stäänt noch niks, oober dü mutst diar uk niks iinskriiw.
-Dü könst diar üüb ööder sidjen efter [[Special:Search/{{PAGENAME}}|sjük]] of a <span class="plainlinks">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAME}}}} logbuken uunluke].</span>',
+Dü könst diar üüb ööder sidjen efter [[Special:Search/{{PAGENAME}}|schük]] of a <span class="plainlinks">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAME}}}} logbuken uunluke].</span>',
 'missing-revision' => 'Det werjuun #$1 faan det sidj "{{PAGENAME}}" jaft at ei.
 
 Det komt diar miast faan, dat en ual ferwisang stregen wurden as.
@@ -707,7 +750,9 @@ For informasjoon füliet di leeste üttooch üt dåt benjüterspär-logbök:',
 '''Dåt as nuch ai spiikerd!'''",
 'sitejspreview' => "'''Påås aw dåt dü jüdeer JavaScript code bloot forbekiikest.'''
 '''Dåt as nuch ai spiikerd!'''",
-'userinvalidcssjstitle' => "''Woorschauing:''' Skin \"\$1\"jeeft dåt ai. Betånk, dåt brükerspetsiifische .css- än .js-side ma en latj bökstääw önjfånge mönje, ålsü biispelswise ''{{ns:user}}:Münsterkjarl/vector.css'' önj stää foon ''{{ns:user}}:Münsterkjarl/Vector.css''.",
+'userinvalidcssjstitle' => "''Paase üüb:''' Skak \"\$1\" jaft at ei.
+Seenk diaram, dat faan en brüker iinracht .css- an .js-sidjen mä en letjen buksteew began skel. Bispal:
+''{{ns:user}}:Münsterkjarl/vector.css'' uunsteed faan ''{{ns:user}}:Münsterkjarl/Vector.css''.",
 'updated' => '(Änred)',
 'note' => "'''Påås aw:'''",
 'previewnote' => "'''Heer könst dü sä, hü det sidj wurd skal.'''
@@ -728,7 +773,7 @@ Wan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun.",
 Det komt flooksis föör, wan Dan anonym Proxy-siinst ei rocht werket.",
 'edit_form_incomplete' => "'''Enkelt dialen faan det formulaar san ei rocht uunkimen.'''
 Wees so gud an kontroliare ales noch ans.",
-'editing' => 'Beårbe foon $1',
+'editing' => 'Bewerkin faan $1',
 'creating' => 'Maage $1',
 'editingsection' => 'Beårben foon $1 (oufsnaas)',
 'editingcomment' => 'Beårben foon $1 (naien oufsnaas)',
@@ -737,14 +782,16 @@ Wees so gud an kontroliare ales noch ans.",
 Boowen könst dü di aktuel stant sä. Oner stun din fernanrangen.
 Bluas wat '''boowen''' stäänt, woort seekert. Diaram kopiare din feranrangen boowen iin.
 An do trak „{{int:savearticle}}“.",
-'yourtext' => 'Din täkst',
-'storedversion' => 'Spiikerd färsjoon',
-'nonunicodebrowser' => "'''Påås aw:''' Dan browser koon unicode-tiikne ai rucht ferårbe. Brük hål en oudern browser am side tu ferårben.",
-'editingold' => "'''PÅÅS AW: Dü beårbest en üülj färsjoon foon jüdeer sid. \"
-Wan dü spiikerst, wårde åle naiere färsjoone ouerschraawen.",
-'yourdiff' => 'Ferschääle',
-'copyrightwarning' => "''' Hål kopiir niinj webside, da ai din äine san, brük niinj uurhääwerruchtlik schütsede wärke suner ferloof foon di uurhääwer!'''<br />
-Dü jeefst üs heerma dan tusååge, dåt dü di täkst '''seelew ferfooted''' hääst, dåt di täkst ålgemiingödj '''(public domain)''' as, unti dåt di '''uurhääwer''' sin '''tustiming''' jääwen heet. For di fål jüdeer täkst ål ouersweer ütdänj wörd, wis hål aw jü diskusjoonssid deeraw haane. <i>Beåcht hål, dåt åle {{SITENAME}}-tujeefte automaatisch uner jü „$2“ stönje (sii $1 for detaile). For di fål dü ai mååst, dåt diin årbe heer foon oudere feränred än språåt wårt, dan kröög ai aw „sid spikre“.</i>",
+'yourtext' => 'Dan tekst',
+'storedversion' => 'Seekert werjuun',
+'nonunicodebrowser' => "'''Paase üüb:''' Dan browser komt ei mä unicode-tiakens turocht. Wees so gud an brük en öödern browser.",
+'editingold' => "'''Paase üüb: Dü bewerkest en ual werjuun faan detdiar sidj.
+Wan dü det seekerst, wurd aal a nei werjuunen auerskrewen.'''",
+'yourdiff' => 'Ferskeeler',
+'copyrightwarning' => "Seenk diaram, dat bidracher tu {{SITENAME}} oner det \$1 ütjden wurd (muar stäänt bi \$2).
+Wan dü ei wel, dat öödern dan bidrach widjer bewerke, do trak ei üüb \"Seekre\".<br />
+Dü ferspräächst, dat dü di tekst salew skrewen heest of dat diar nian kopiarrochten üüb lei.
+'''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! 
 
 Wan 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.)
@@ -763,36 +810,38 @@ Uun't logbuk stäänt muar diartu:",
 '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.'''
 Uun't logbuk stäänt muar diartu:",
 'templatesused' => '{{PLURAL:$1|Jü füliend forlååg wårt|Da füliende forlååge wårde}} foon jüdeer sid ferwånd:',
-'templatesusedpreview' => '{{PLURAL:$1|Jü füliend forlååg wårt|Da füliende forlååge wårde}} foon diheere sideforlök ferwånd:',
+'templatesusedpreview' => '{{PLURAL:$1|Detdiar föörlaag woort|Jodiar föörlaagen wurd}} uun detdiar sidjenföörskau brükt:',
 'templatesusedsection' => '{{PLURAL:$1|Jü füliend forlååg wårt|Da füliende forlååge wårde}} foon dideer oufsnaas ferwånd:',
 'template-protected' => '(seekert)',
 'template-semiprotected' => '(hualew-seekert)',
 'hiddencategories' => 'Jüdeer sid as lasmoot foon {{PLURAL:$1|1 ferstäägen kategorii|$1 ferstäägene kategoriie}}:',
-'nocreatetext' => 'Aw {{SITENAME}} wörd dåt måågen foon naie side begränsed.
-Dü koost bestönjene side änre unti de [[Special:UserLogin|önjmälde unti mååg en account]].',
-'nocreate-loggedin' => 'Dü heest niinj beruchtiging, naie side tu måågen.',
+'nocreatetext' => 'Üüb {{SITENAME}} könst dü nian nei sidjen maage, oober dü könst sidjen feranre. [[Special:UserLogin|Melde di uun of racht en brükerkonto iin]].',
+'nocreate-loggedin' => 'Dü mutst nian nei sidjen maage.',
 'sectioneditnotsupported-title' => 'Jü beårbing foon oufsnaase wårt ai unerstüted',
 'sectioneditnotsupported-text' => 'Jü beårbing foon oufsnaase wårt aw jüdeer beårbingssid ai stiped.',
 'permissionserrors' => 'Beruchtigingsfäägel',
 'permissionserrorstext' => 'Dü bast ai beruchted, jü aksjoon üttufäären. {{PLURAL:$1|grün|grüne}}:',
-'permissionserrorstext-withaction' => 'Dü bast ai beruchtit, $2.
-{{PLURAL:$1|grün|grüne}}:',
+'permissionserrorstext-withaction' => 'Dü heest ei det rocht, $2.
+{{PLURAL:$1|Grünj|Grünjer}}:',
 'recreate-moveddeleted-warn' => "'''Paase üüb: Dü wel en artiikel maage, diar iar al ans stregen wurden as.'''
 Auerlei di det gud, amdat dü niks ferkiard maagest.
 Uun't logbuk stäänt muar diartu:",
 'moveddeleted-notice' => 'Jüheer sid wörd sleeked. Deer füliet en üttooch üt dåt sleek- än ferschüwingslogbök for jüheer sid.',
-'log-fulllog' => 'Åle logbük-önjdrååge önjkiike',
+'log-fulllog' => 'Logbuk-iindracher uunluke',
 'edit-hook-aborted' => 'Jü beårbing wörd suner ferklååring döör en snaasstää oufbräägen.',
 'edit-gone-missing' => 'Jü sid köö ai aktualisiird wårde.
 Jü wörd önjscheened sleeked.',
 'edit-conflict' => 'Beårbingskonflikt.',
 'edit-no-change' => 'Din beårbing wörd ignoriird, deer niinj änring an e täkst fornümen wörd.',
+'postedit-confirmation' => 'Din feranrang as seekert wurden.',
 'edit-already-exists' => 'Köö niinj nai sid mååge.
 Dåt bestöö ål.',
 'defaultmessagetext' => 'Standard tekst',
 'content-failed-to-parse' => "Parsing faan $2 för't model $1 ging skiaf: $3",
 'invalid-content-data' => 'Diar stäänt wat uun, wat diar ei hen hiart',
 'content-not-allowed-here' => '„$1“ mut ei skrewen wurd üüb sidj [[$2]]',
+'editwarning-warning' => 'Wan dü detheer sidj slotst, kön feranrangen ferleesen gung.
+Üs uunmeldet brüker könst dü detheer wäärnang bi din iinstelangen oner „Bewerke“ wechknipse.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -804,14 +853,14 @@ Dåt bestöö ål.',
 'expensive-parserfunction-warning' => 'Woorschauing: Jüdeer sid önjthålt tu fool apteele foon widluftie parserfunksjoone.
 
 Deer {{PLURAL:$2|mötj ai mör ås 1 apteel|mönje ai mör ås $1 apteele}} weese.',
-'expensive-parserfunction-category' => 'Side, da widluftie parserfunksjoone tu oofding apteele',
+'expensive-parserfunction-category' => 'Sidjen mä tuföl parser-funktjuunen.',
 'post-expand-template-inclusion-warning' => "'''Woorschauing:''' Jü grutelse foon da önjbünene forlååge as tu grut, hu forlååge koone ai önjbünen wårde.",
-'post-expand-template-inclusion-category' => 'Side, önj da jü maksimoole grutelse foon önjbünene forlååge ouerschran as',
+'post-expand-template-inclusion-category' => 'Sidjen mä muar üs det maksimaal taal faan iinbünjen föörlaagen.',
 'post-expand-template-argument-warning' => 'Påås aw: Jüdeer sid enthålt tumanst en argumänt önj en forlååge, dåt äkspandiird tu grut as. Dadeere argumänte wårde ignoriird.',
-'post-expand-template-argument-category' => 'Side, da ignoriirde forlååge-argumänte önjthüülje',
+'post-expand-template-argument-category' => 'Sidjen mä föörlaagen, huar ei arke iindrach brükt wurd koon.',
 'parser-template-loop-warning' => 'Forlåågesloif önjtdäkt: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Forloagerekursjoonsdiipgränse ouerschran ($1)',
-'language-converter-depth-warning' => 'Spräkekonwärsjoonsdiipdegränse ouerschren ($1)',
+'language-converter-depth-warning' => 'Spriakenkonwerter auerläästet ($1)',
 'node-count-exceeded-category' => 'Jodiar sidjen haa tuföl ferbinjangen (nodes)',
 'node-count-exceeded-warning' => 'Detdiar sidj hää tuföl ferbinjangen (nodes)',
 'expansion-depth-exceeded-category' => 'Jodiar sidjen haa tuföl ütjwidjangen (expansion)',
@@ -834,25 +883,24 @@ Luke oner, of dü det uk würelk du wel, an do seekre din feranrangen.',
 Grün foon jü späre: ''$2''",
 
 # History pages
-'viewpagelogs' => 'Logböke for jüdeer sid wise',
+'viewpagelogs' => 'Logbuken faan detdiar sidj uunwise',
 'nohistory' => 'Deer as niinj beårbingshistoori for jüdeer sid.',
-'currentrev' => 'Aktäle färsjoon.',
-'currentrev-asof' => 'Aktuäl färsjoon foon $2 am e klook $3',
-'revisionasof' => 'Färsjoon foon e klook $2, $3',
-'revision-info' => 'Färsjoon foon di $4 am e klook $5 foon $2',
-'previousrevision' => '← Näistålere färsjoon',
-'nextrevision' => 'Näistjunger färsjoon →',
-'currentrevisionlink' => 'Aktuäle färsjoon',
+'currentrev' => 'Leetst werjuun',
+'currentrev-asof' => 'Leetst werjuun faan di $2, am e klook $3',
+'revisionasof' => 'Werjuun faan $2, klook $3',
+'revision-info' => 'Werjuun faan di $4 am a klook $5 faan $2',
+'previousrevision' => '← Naistääler werjuun',
+'nextrevision' => 'Naistjonger werjuun →',
+'currentrevisionlink' => 'Leetst werjuun',
 'cur' => 'aktuäl',
 'next' => 'näist',
 'last' => 'leest',
 'page_first' => 'Began',
 'page_last' => 'Iinje',
-'histlegend' => 'Tu wising foon da änringe iinjfåch da tu ferglikene Färsjoone ütwääle än di klänkfläche „{{int:compareselectedversions}}“ klikke.<br />
-* (Aktuäl) = unerschiis tu e aktuäle färsjoon, (Leeste) = unerschiis tu e leeste färsjoon
-* Klook/dootem = färsjoon tu jüdeer tid, brükernoome/IP-adräs foon di beårber, L = latje änring.',
-'history-fieldset-title' => 'Säk önj e färsjoonshistoori',
-'history-show-deleted' => 'bloot straagene färsjoone',
+'histlegend' => "Am a feranrangen uuntuwisin, schük tau werjuunen ütj an trak üüb „{{int:compareselectedversions}}“.<br />
+* '''({{int:cur}})''' = ferskeel tu't aktuel werjuun, '''({{int:last}})''' = ferskeel tu't leetst werjuun, '''{{int:minoreditletter}}''' = letj feranrang.",
+'history-fieldset-title' => 'Schük uun a ferluup',
+'history-show-deleted' => 'Bluas stregen werjuunen',
 'histfirst' => 'Ålste',
 'histlast' => 'Naiste',
 'historysize' => '({{PLURAL:$1|1 Byte|$1 Bytes}})',
@@ -862,62 +910,59 @@ Grün foon jü späre: ''$2''",
 'history-feed-title' => 'Färsjoonshistoori',
 'history-feed-description' => 'Färsjoonshistoori for jüdeer sid önj {{SITENAME}}',
 'history-feed-item-nocomment' => '$1 bit $2',
-'history-feed-empty' => 'Jü önjfordied sid bestoont ai. Flicht wörd jü sleeked unti ferschääwen.  [[Special:Search|Döörsäk]] {{SITENAME}} aw pååsende naie side.',
+'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.',
 
 # Revision deletion
 'rev-deleted-comment' => '(Tuhuupefooting wächnümen)',
 'rev-deleted-user' => '(Brükernoome wächhååld)',
 'rev-deleted-event' => '(Logbökaksjoon wächhååld)',
 'rev-deleted-user-contribs' => '[Benjüternoome unti IP-adräs wächhååld - beårbing üt baidråge ferstäägen]',
-'rev-deleted-text-permission' => "Judeer Färsjoon wörd '''straagen'''.
-Näre önjgoowen tu di strikforgung ås uk en begrüning fant huum önj dåt [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbök].",
-'rev-deleted-text-unhide' => "Jüdeer färsjoon as '''straagen''' wörden.
-Ainkelthäide fant huum önj dåt [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbök].
-Dü koost nuch [$1 jüdeer färsjoon bekiike], wan dü wider gunge mååst.",
-'rev-suppressed-text-unhide' => "Jüdeer färsjoon as '''unerdrükt''' wörden.
-Ainkelthäide fant huum önj dåt [{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} strik-logbök].
-Dü koost nuch [$1 jüdeer färsjoon bekiike], wan dü wider gunge mååst.",
-'rev-deleted-text-view' => "Jüdeer Färsjoon as '''straagen''' wörden.
-Dü koost da wider önjkiike. Näre önjgoowen tu di sleekforgung ås uk en begrüning fant huum önj dåt [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbök].",
-'rev-suppressed-text-view' => "Jüdeer färsjoon as '''unerdrükd''' wörden.
-Dü koost da önjkiike. Ainkelthäide stönje önj dåt [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} unerdrukings-logbök].",
-'rev-deleted-no-diff' => "Dü koost jüdeer ferschääl ai bekiike, dan iinj foon da änringe wörd '''straagen'''. Näre önjgoowen tu di strikforgung ås uk en begrüning fant huum önj dåt [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbök].",
-'rev-suppressed-no-diff' => "Dü koost jüdeer ferschääl ai bekiike, dan iinj foon da änringe wörd '''straagen'''.",
-'rev-deleted-unhide-diff' => "Iinj foon da änringe doon jüdeer ferschääl as '''straagen''' wörden.
-Ainkelthäide fant huum önj dåt [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbök].
-Dü koost nuch [$1 jüdeer färsjoon bekiike], wan dü wider gunge mååst.",
-'rev-suppressed-unhide-diff' => "Iinj foon da färsjoone foon dåtdeer ferschääl wörd '''unerdrükd'''.
-Ainkelthäide fant huum önj dåt [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} unerdruk-logbök].
-Dü koost nuch [$1 dåtdeer ferschääl bekiike], wan dü wider gunge mååst.",
-'rev-deleted-diff-view' => "En Färsjoon foon dåtdeer färsjoonsferschääl wörd '''straagen'''.
-Dü koost dåt färsjoonsferschääl siinj.
-Näre önjgoowen fant huum önj dåt [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbök].",
-'rev-suppressed-diff-view' => "Iinj foon da färsjoone foon dåtdeer färsjoonsferschääl wörd '''unerdrükd'''.
-Dü koost dåtheer färsjoonsferschääl siinj. Ainkelthäide stönje önj dåt [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} unerdrukings-logbök].",
+'rev-deleted-text-permission' => "Detdiar werjuun as '''stregen''' wurden.
+Uun't [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbuk] stäänt muar diartu.",
+'rev-deleted-text-unhide' => "Detdiar werjuun as '''stregen''' wurden.
+Uun't [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbuk] stäänt muar diartu.
+Dü könst [$1 detdiar werjuun uunluke], wan dü wel.",
+'rev-suppressed-text-unhide' => "Detdiar werjuun as '''ferbürgen''' wurden.
+Uun't [{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} fersteeg-logbuk] stäänt muar diartu.
+Dü könst [$1 detdiar werjuun uunluke], wan dü wel.",
+'rev-deleted-text-view' => "Detdiar werjuun as '''stregen''' wurden.
+Dü könst det noch uunluke. Uun't [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbuk] stäänt muar diartu.",
+'rev-suppressed-text-view' => "Detdiar werjuun as '''ferbürgen''' wurden.
+Dü könst det noch uunluke. Uun't [{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} fersteeg-logbuk] stäänt muar diartu.",
+'rev-deleted-no-diff' => "Dü könst di ferskeel ei uunluke, auer ian werjuun '''stregen''' wurden as.
+Wan dü muar wed wel, luke iin uun't [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbuk].",
+'rev-suppressed-no-diff' => "Dü könst di ferskeel ei uunluke, auer ian werjuun '''stregen''' wurden as.",
+'rev-deleted-unhide-diff' => "Ian faan jodiar werjuunen as '''stregen''' wurden. Wan dü muar wed wel, luke iin uun't [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbuk].
+Dü könst [$1 di ferskeel uunluke], wan dü wel.",
+'rev-suppressed-unhide-diff' => "Ian faan jodiar werjuunen as '''ferbürgen''' wurden. Wan dü muar wed wel, luke iin uun't [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} fersteeg-logbuk].
+Dü könst [$1 di ferskeel uunluke], wan dü wel.",
+'rev-deleted-diff-view' => "Ian faan jodiar werjuunen as '''stregen''' wurden.
+Dü könst di ferskeel uunluke. Wan dü muar wed wel, luke iin uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} strik-logbuk].",
+'rev-suppressed-diff-view' => "Ian faan jodiar werjuunen as '''ferbürgen''' wurden. Dü könst di ferskeel uunluke. Wan dü muar wed wel, luke iin uun't [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} fersteeg-logbuk].",
 'rev-delundel' => 'wis/fersteeg',
 'rev-showdeleted' => 'wise',
-'revisiondelete' => 'Färsjoone strike/wider mååge',
-'revdelete-nooldid-title' => 'Niinj färsjoon önjjääwen',
-'revdelete-nooldid-text' => 'Dü heest nian wersjuun för detheer aktsjuun uunden, of det wersjuun jaft at ei, of dü fersjükst, en aktuel wersjuun tu striken.',
+'revisiondelete' => 'Werjuunen strik of weder iinstel',
+'revdelete-nooldid-title' => 'Nian werjuun uunden',
+'revdelete-nooldid-text' => 'Dü heest nian werjuun för detheer aktjuun uunden, of det werjuun jaft at ei, of dü ferschükst, en aktuel werjuun tu striken.',
 'revdelete-nologtype-title' => 'Niinj logtüüp önjjääwen',
 'revdelete-nologtype-text' => 'Deer wörd niinj logtüüp for jüheer aksjoon önjjääwen.',
 'revdelete-nologid-title' => 'Üngülti logönjdråch',
 'revdelete-nologid-text' => 'Deer wör niinj logtüüp ütkiisd unti di kiisde logtüüp bestoont ai.',
-'revdelete-no-file' => 'Jü önjjääwen dootäi bestoont ai.',
-'revdelete-show-file-confirm' => 'Bast dü sääker, dåt de jü sleeked färsjoon foon e dootäi „<nowiki>$1</nowiki>“ foon e $2 am e klook $3 önjsiinj wäät?',
+'revdelete-no-file' => 'Son dateinööm as ei diar.',
+'revdelete-show-file-confirm' => 'Wel dü würelk det stregen werjuun faan det datei „<nowiki>$1</nowiki>“ faan di $2, am a klook $3 uunluke?',
 'revdelete-show-file-submit' => 'Jåå',
-'revdelete-selected' => "'''{{PLURAL:$2|Ütjsoocht wersjuun|Ütjsoocht wersjuunen}} faan [[:$1]]:'''",
+'revdelete-selected' => "'''{{PLURAL:$2|Ütjsoocht werjuun|Ütjsoocht werjuunen}} faan [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Ütjsoocht logbukiindrach|Ütjsoocht logbukiindracher}}:'''",
-'revdelete-text' => "'''Stregen wersjuunen an aktsjuunen bliiw uun det wersjuunshistoore an uun a logbuken, man det koon ei arken efterlees.'''
+'revdelete-text' => "'''Stregen werjuunen an aktjuunen bliiw uun di ferluup an uun a logbuken, man det koon ei arken efterlees.'''
 
-Ööder administratooren üüb {{SITENAME}} kön oober üüb det ferstäächt histoore tugrip an tu nuad en ual wersjuun weder iinstel.",
+Ööder administratooren üüb {{SITENAME}} kön oober üüb di ferbürgen ferluup tugrip an tu nuad en ual werjuun weder iinstel.",
 'revdelete-confirm' => 'Ferseekre noch ans, dat dü det würelk du wel, dat dü witjst, wat dü dääst, an dat det mä a [[{{MediaWiki:Policy-url}}|bestemangen]] auerian stemet.',
 'revdelete-suppress-text' => "Det skul '''bluas''' onertrakt wurd bi:
 * Persöönelk informatsjuunen, diar näämen wat uungung
 *: ''Adresen, Tilefoonnumern, Ferseekerangsnumern an sowat''",
 'revdelete-legend' => 'Seeten foon da sachtboorhäids-gränse',
-'revdelete-hide-text' => 'Täkst foon e färsjoon fersteege',
-'revdelete-hide-image' => 'Fersteege wat önj e Dootäi stoont',
+'revdelete-hide-text' => 'Tekst faan det werjuun fersteeg',
+'revdelete-hide-image' => 'Fersteeg, wat uun det datei stäänt',
 'revdelete-hide-name' => 'Logbök-aksjoon fersteege',
 'revdelete-hide-comment' => 'Beårbingskomäntoor fersteege',
 'revdelete-hide-user' => 'Benjüternoome//IP-adräse foon e beårber fersteege',
@@ -926,9 +971,9 @@ Dü koost dåtheer färsjoonsferschääl siinj. Ainkelthäide stönje önj dåt
 'revdelete-radio-set' => 'Jåå',
 'revdelete-radio-unset' => 'Nåån',
 'revdelete-suppress' => 'Grün foon dåt striken uk for administratoore fersteege',
-'revdelete-unsuppress' => 'Gränse for wi måågede färsjoone wächnaame',
+'revdelete-unsuppress' => 'Weder iinsteld werjuunen luasmaage',
 'revdelete-log' => 'Begrüning:',
-'revdelete-submit' => 'Aw {{PLURAL:$1|kiisd färsjoon|kiisde färsjoone}} önjwiinje',
+'revdelete-submit' => 'Widjer för {{PLURAL:$1|ütjsoocht werjuun|ütjsoocht werjuunen}}',
 'revdelete-success' => "'''Jü färsjoonsönjsicht wörd aktualisiird.'''",
 'revdelete-failure' => "'''Jü färsjoonsönjsicht köö ai aktualisiird wårde:'''
 $1",
@@ -936,10 +981,10 @@ $1",
 'logdelete-failure' => "'''Logböksachtboorhäid köö ai änred wårde:'''
 $1",
 'revdel-restore' => 'sichtboorhäid änre',
-'revdel-restore-deleted' => 'sleekede färsjoone',
-'revdel-restore-visible' => 'sachtboore färsjoone',
+'revdel-restore-deleted' => 'stregen werjuunen',
+'revdel-restore-visible' => 'sichtboor werjuunen',
 'pagehist' => 'Färsjoonshistoori',
-'deletedhist' => 'Straagene färsjoone',
+'deletedhist' => 'Stregen werjuunen',
 'revdelete-hide-current' => 'Fäägel bai t fersteegen foon di önjdråch foon e klook $1, $2; ditheer as jü aktuäl färsjoon,
 jü koon ai ferstäägen wårde.',
 'revdelete-show-no-access' => 'Fäägel bai t wisen foon di önjdråch foon $1, e klook $2: diheer önjdråch wörd ås "begränsed" markiird.
@@ -956,7 +1001,7 @@ Dü heest deeraw nåån tugraawe.',
 ** Fülk informatsjuunen",
 'revdelete-otherreason' => 'Ouderen/tubaikaamenden grün:',
 'revdelete-reasonotherlist' => 'Ouderen grün',
-'revdelete-edit-reasonlist' => 'Strikgrüne beårbe',
+'revdelete-edit-reasonlist' => "Grünjer för't striken bewerke",
 'revdelete-offender' => 'Autoor foon jüdeer färsjoon:',
 
 # Suppression log
@@ -968,18 +1013,18 @@ Luke bi [[Special:BlockList|List faan speret IP-adresen an brükernöömer]] fö
 'mergehistory' => 'Fersjoonshistoorie feriine',
 'mergehistory-header' => 'Ma jüdeer spetsjåålsid koost dü jü färsjoonshistoori foon en jurtkamstsid ma jü färsjoonshistoori foon en müüljsid feriine.
 Stal sääker, dåt jü färsjoonshistoori foon en sid histoorisch koräkt as.',
-'mergehistory-box' => 'Rewisjoone foon tou side feriine:',
+'mergehistory-box' => 'Ferluup faan tau sidjen tuupfeer:',
 'mergehistory-from' => 'Jurtkamstsid:',
 'mergehistory-into' => 'Müüljsid:',
-'mergehistory-list' => 'Färsjoone, da feriind wårde koone',
-'mergehistory-merge' => 'Jodiar wersjuunen faan „[[:$1]]“ kön efter „[[:$2]]“ auerdraanj wurd.
-Markiare det wersjuun, wat üs leetst mä auerdraanj wurd skal.
-A nawigatsjuun links saat ales weder turag üüb di ual stant.',
-'mergehistory-go' => 'Wis färsjoone da feriind wårde koone',
-'mergehistory-submit' => 'Feriinde färsjoone',
-'mergehistory-empty' => 'Niinj färsjoone koone feriind wårde.',
-'mergehistory-success' => '$3 {{PLURAL:$3|färsjoon|färsjoone}} foon [[:$1]] ma erfolch feriind tu [[:$2]].',
-'mergehistory-fail' => 'Färsjoone koone ai feriind wårde, wees sü gödj än kontroliir jü sid än da tidönjgoowe.',
+'mergehistory-list' => 'Werjuunen, diar tuupfeerd wurd kön.',
+'mergehistory-merge' => 'Jodiar werjuunen faan „[[:$1]]“ kön efter „[[:$2]]“ auerdraanj wurd.
+Kääntiakne det wersjuun, wat üs leetst mä auerdraanj wurd skal.
+A nawigatjuun links saat ales weder turag üüb di ual stant.',
+'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-fail' => 'Werjuunen kön ei tuupfeerd wurd. Luke noch ans efter at sidj an a tidjen.',
 'mergehistory-no-source' => 'Jurtkamstsid "$1" as ai deer.',
 'mergehistory-no-destination' => 'Müüljsid „$1“ bestoont ai.',
 'mergehistory-invalid-source' => 'Jurtkamstsid mötj en gülti sidnoome heewe.',
@@ -991,35 +1036,35 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 
 # Merge log
 'mergelog' => 'Feriin-logbök',
-'pagemerge-logentry' => 'feriind [[$1]] eefter [[$2]] (färsjoonen bit $3)',
+'pagemerge-logentry' => '[[$1]] efter [[$2]] tuupfeerd (werjuunen bit $3)',
 'revertmerge' => 'Feriining tuninte mååge',
 'mergelogpagetext' => 'Dåtheer as dåt logbök foon da feriinde färsjoonshistoorie.',
 
 # Diffs
-'history-title' => '$1: Ferluup faan a wersjuunen',
-'difference-title' => 'Ferskeel tesken a wersjuunen faan "$1"',
+'history-title' => '$1: Ferluup faan a werjuunen',
+'difference-title' => 'Ferskeel tesken a werjuunen faan "$1"',
 'difference-title-multipage' => 'Ferskeel tesken a sidjen "$1" an "$2"',
-'difference-multipage' => '(Ferschääl twasche side)',
+'difference-multipage' => '(Ferskeel tesken sidjen)',
 'lineno' => 'Ra $1:',
-'compareselectedversions' => 'Wäälde färsjoone ferglike',
-'showhideselectedversions' => 'Wäälde färsjoone wise/fersteege',
+'compareselectedversions' => 'Werjuunen ferglik',
+'showhideselectedversions' => 'Werjuunen wise of fersteeg',
 'editundo' => 'tunintemååge',
-'diff-multi' => '({{PLURAL:$1|Ian wersjuun diartesken|$1 wersjuunen diartesken}} faan {{PLURAL:$2|ään brüker|$2 brükern}} {{PLURAL:$1|woort|wurd}} ei uunwiset)',
-'diff-multi-manyusers' => '({{PLURAL:$1|Ian wersjuun diartesken|$1 wersjuunen diartesken}} faan muar üs $2 {{PLURAL:$2|brüker|brükern}} wurd ei uunwiset)',
+'diff-multi' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan {{PLURAL:$2|ään brüker|$2 brükern}} {{PLURAL:$1|woort|wurd}} ei uunwiset)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Ian werjuun diartesken|$1 werjuunen diartesken}} faan muar üs $2 {{PLURAL:$2|brüker|brükern}} wurd ei uunwiset)',
 'difference-missing-revision' => "{{PLURAL:$2|Ian werjuun|$2 werjuunen}} faan di ferskeel ($1) {{PLURAL:$2|as|san}} ei fünjen wurden.
 
 Det komt diar miast faan, dat en ual ferwisang stregen wurden as.
 Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.",
 
 # Search results
-'searchresults' => 'Säkjresultoote',
-'searchresults-title' => 'Säkjresultoote for „$1“',
-'searchresulttext' => 'For mör informasjoon tu jü säkj sii jü [[{{MediaWiki:Helppage}}|heelpsid]].',
-'searchsubtitle' => 'Din säkönjfrååg: „[[:$1|$1]]“ ([[Special:Prefixindex/$1|åle ma „$1“ beganende side]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|åle side, da eefter „$1“ ferlinke]])',
+'searchresults' => 'Fünjen sidjen',
+'searchresults-title' => 'Fünjen sidjen för „$1“',
+'searchresulttext' => "Wan dü muar auer't schüken uun {{SITENAME}} wed wel, luke efter bi [[{{MediaWiki:Helppage}}|{{int:help}}]].",
+'searchsubtitle' => 'Din uunfraag: „[[:$1|$1]]“ ([[Special:Prefixindex/$1|sidjen, diar mä „$1“ began]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|sidjen, diar efter „$1“ ferwise]])',
 'searchsubtitleinvalid' => 'Din säkönjfrååg: "$1".',
 'toomanymatches' => 'Diar kaam tuföl resultooten üüb din uunfraag. Fersjük det ööders.',
-'titlematches' => 'Oueriinjstiminge ma sidetiitle',
-'notitlematches' => 'Niinj oueriinjstiming ma sidetiitle',
+'titlematches' => 'Auerianstemangen mä sidjennöömer',
+'notitlematches' => 'Nian auerianstemangen mä sidjennöömer',
 'textmatches' => 'Oueriinjstiminge ma inhålte',
 'notextmatches' => 'Niinj oueriinjstiming ma inhålte',
 'prevn' => '{{PLURAL:$1|leesten|leeste $1}}',
@@ -1033,18 +1078,18 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchmenu-new' => "'''Mååg jü sid „[[:$1|$1]]“ önj jüdeer Wiki.'''",
 'searchhelp-url' => 'Help:Inhåltsfertiiknis',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Wise aal jo sidjen, diar so began]]',
-'searchprofile-articles' => 'Artiikle',
-'searchprofile-project' => 'Heelp än Prujäktside',
+'searchprofile-articles' => 'Artiikler',
+'searchprofile-project' => 'Halep- an Projektsidjen',
 'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Ales',
-'searchprofile-advanced' => 'Ütwided',
-'searchprofile-articles-tooltip' => 'Säk önj $1',
-'searchprofile-project-tooltip' => 'Säk önj $1',
-'searchprofile-images-tooltip' => 'Bilen sjük',
-'searchprofile-everything-tooltip' => 'Sjük aueraal (uk diskusjuunssidjen)',
-'searchprofile-advanced-tooltip' => 'Onj mör noomerüme säke',
+'searchprofile-advanced' => 'Ütjwidjet',
+'searchprofile-articles-tooltip' => 'Schük uun $1',
+'searchprofile-project-tooltip' => 'Schük uun $1',
+'searchprofile-images-tooltip' => 'Bilen schük',
+'searchprofile-everything-tooltip' => 'Schük aueraal (uk diskusjuunssidjen)',
+'searchprofile-advanced-tooltip' => 'Uun ööder nöömrümer schük',
 'search-result-size' => '$1 ({{PLURAL:$2|1 uurd|$2 uurde}})',
-'search-result-category-size' => '{{PLURAL:$1|1 sidj|$1 sidjen}} ({{PLURAL:$2|1 onerkategorii|$2 onerkategoriin}}, {{PLURAL:$3|1 datei|$3 dateien}})',
+'search-result-category-size' => '{{PLURAL:$1|1 sidj|$1 sidjen}} ({{PLURAL:$2|1 onerkategorii|$2 onerkategoriin}}, {{PLURAL:$3|1 datei|$3 datein}})',
 'search-result-score' => 'Relevans: $1 %',
 'search-redirect' => '(widerliidjing foon „$1“)',
 'search-section' => '(oufsnaas $1)',
@@ -1054,39 +1099,31 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'search-interwiki-more' => '(widere)',
 'search-relatedarticle' => 'früne',
 'mwsuggest-disable' => "Föörslacher för't sjüken deaktiwiare",
-'searcheverything-enable' => 'Onj ål noomerüme säke',
+'searcheverything-enable' => 'Uun arke nöömrüm schük',
 'searchrelated' => 'früne',
-'searchall' => 'åle',
+'searchall' => 'aaltumaal',
 'showingresults' => "Heer {{PLURAL:$1|as '''1''' resultoot|san '''$1''' resultoote}}, beganend ma numer '''$2.'''",
 'showingresultsnum' => "Heer {{PLURAL:$3|as '''1''' resultoot|san '''$3''' resultoote}}, beganend ma numer '''$2.'''",
 'showingresultsheader' => "{{PLURAL:$5|resultoot '''$1''' foon '''$3'''|resultoote '''$1-$2''' foon '''$3'''}}, for '''$4.'''",
-'nonefound' => "'''Haanewising:''' Deer wårde ståndardmääsi man ainkelde noomerüme döörsoocht. Seet ''all:'' for din Säkbegrip, am åle side (inkl. diskusjoonside, forlååge, äsw.) tu döörsäken unti gesiilt di noome foon di tu döörsäkende noomerüm.",
+'nonefound' => "'''Paase üüb:''' Diar wurd man enkelt nöömrümer trochsoocht. Wan dü ''all:'' föör din wurd skraft, do woort uk uun aal a nöömrümer (datein, kategoriin, föörlaagen asw.) soocht. Dü könst uk en wasen nöömrüm föörwechstel.",
 'search-nonefound' => 'For din säkanfrååg würden niinj resultoote fünen.',
-'powersearch' => 'ütwided säkj',
-'powersearch-legend' => 'ütwided säkj',
-'powersearch-ns' => 'Säkj önj noomerüme:',
+'powersearch' => 'Ã\9ctjwidjet schüken',
+'powersearch-legend' => 'Ã\9ctjwidjet schüken',
+'powersearch-ns' => 'Schük uun nöömrümer:',
 'powersearch-redir' => 'Widerliidjinge anwise',
-'powersearch-field' => 'Säk eefter:',
-'powersearch-togglelabel' => 'Wääl üt:',
-'powersearch-toggleall' => 'Åle',
-'powersearch-togglenone' => 'Niinj',
-'search-external' => 'Extern säkj',
-'searchdisabled' => 'Jü {{SITENAME}}-säkj as deaktiviird. Dü koost intwasche ma Google säke. Betånk, dåt di säkindäks for {{SITENAME}} ferüüljet weese koon.',
-
-# Quickbar
-'qbsettings' => 'Sidjenliist',
-'qbsettings-none' => 'Niinj',
-'qbsettings-fixedleft' => 'Lachts, fääst',
-'qbsettings-fixedright' => 'Rochts, fääst',
-'qbsettings-floatingleft' => 'Lachts, auergung',
-'qbsettings-floatingright' => 'Rochts, auergung',
-'qbsettings-directionality' => 'Fääst, hinget faan di skriiwwai faan det spriak uf',
+'powersearch-field' => 'Schük efter:',
+'powersearch-togglelabel' => 'Schük ütj:',
+'powersearch-toggleall' => 'Aaltumaal',
+'powersearch-togglenone' => 'Nianen',
+'search-external' => 'Schük ekstern',
+'searchdisabled' => 'Det schüken üüb {{SITENAME}} as ei aktiif. Dü könst uuntesken mä Google schük. Seenk diaram, dat Google sin steegwurden miast ei üüb a leetst stant san.',
+'search-error' => "Diar as wat skiaf gingen bi't schüken: $1",
 
 # Preferences page
 'preferences' => 'Önjstalinge',
 'mypreferences' => 'Iinstelangen',
 'prefs-edits' => 'Taal faan feranrangen:',
-'prefsnologin' => 'Ai önjmälded',
+'prefsnologin' => 'Ei uunmeldet',
 'prefsnologintext' => 'Dü skel <span class="plainlinks">[{{fullurl:{{#special:UserLogin}}|returnto=$1}} uunmeldet]</span> wees, am din iinstelangen tu feranrin.',
 'changepassword' => 'Pååsuurd änre',
 'prefs-skin' => 'Skak',
@@ -1097,7 +1134,7 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'prefs-labs' => 'Alpha mögelkhaiden',
 'prefs-user-pages' => 'Brükersidjen',
 'prefs-personal' => 'Brüker dooten',
-'prefs-rc' => 'Leeste änringe',
+'prefs-rc' => 'Leetst feranrangen',
 'prefs-watchlist' => "Uun't uug behual",
 'prefs-watchlist-days' => "So föl daar uun't uug behual:",
 'prefs-watchlist-days-max' => 'Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}',
@@ -1117,14 +1154,14 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'prefs-edit-boxsize' => "Grate faan't wönang tu't bewerkin:",
 'rows' => 'Räen:',
 'columns' => 'Spleder:',
-'searchresultshead' => 'Sjük',
+'searchresultshead' => 'Schük',
 'resultsperpage' => 'So fölsis komt det föör per sidj:',
 'stub-threshold' => 'Formatiarang faan links <a href="#" class="stub">för letj sidjen</a> (uun Byte):',
 'stub-threshold-disabled' => 'Ufsteld',
 'recentchangesdays' => 'Soföl daar skel a „leetst feranrangen“ uunwise:',
 'recentchangesdays-max' => 'Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}',
 'recentchangescount' => 'Soföl feranrangen skel uunwiset wurd:',
-'prefs-help-recentchangescount' => 'Det san a leetst feranrangen, wersjuunen an logbuken.',
+'prefs-help-recentchangescount' => 'Det san a leetst feranrangen, werjuunen an logbuken.',
 'prefs-help-watchlist-token' => "Wan dü detdiar fial mä en hiamelken code ütjfalst, woort en RSS-feed iinracht. Arken mä didiar code koon do sä, wat dü uun't uug behual wel. Diaram skul hi ei so ianfach wees, nem dach didiar: $1",
 'savedprefs' => 'Din iinstelangen san seekert wurden.',
 'timezonelegend' => 'Tidjsoon:',
@@ -1145,9 +1182,9 @@ Dü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'timezoneregion-indian' => 'Indik',
 'timezoneregion-pacific' => 'Pasiifik',
 'allowemail' => 'E-Mail foon oudere brükere tulätje',
-'prefs-searchoptions' => 'Sjük',
+'prefs-searchoptions' => 'Schük',
 'prefs-namespaces' => 'Noomerüme',
-'defaultns' => 'Ouers säk önj jüheer noomerüme:',
+'defaultns' => 'Ööders schük uun jodiar nöömrümer:',
 'default' => 'Forinstaling',
 'prefs-files' => 'Dååtäie',
 'prefs-custom-css' => 'Salew maaget CSS',
@@ -1163,7 +1200,7 @@ Do san jo ual iinstelangen wech.',
 'prefs-memberingroups' => '{{GENDER:$2|Lasmoot}} faan {{PLURAL:$1|brükerskööl|brükersköölen}}:',
 'prefs-registration' => 'Uunmelde-tidj',
 'yourrealname' => 'Rocht nööm:',
-'yourlanguage' => 'Spräke:',
+'yourlanguage' => 'Spriak:',
 'yourvariant' => 'Spriak:',
 'prefs-help-variant' => 'Uun hün skriiwwiis skel a sidjen uunwiset wurd:',
 'yournick' => 'Nai signatuur:',
@@ -1185,11 +1222,11 @@ Do san jo ual iinstelangen wech.',
 'prefs-signature' => 'Signatuur',
 'prefs-dateformat' => "Formaat faan't dootem",
 'prefs-timeoffset' => 'Ferskeel faan a klooktidj',
-'prefs-advancedediting' => 'Ütwided möölikhäide',
-'prefs-advancedrc' => 'Ütwided möölikhäide',
-'prefs-advancedrendering' => 'Ütwided möölikhäide',
-'prefs-advancedsearchoptions' => 'Ütwided möölikhäide',
-'prefs-advancedwatchlist' => 'Ütwided möölikhäide',
+'prefs-advancedediting' => 'Ütjwidjet mögelkhaiden',
+'prefs-advancedrc' => 'Ütjwidjet mögelkhaiden',
+'prefs-advancedrendering' => 'Ütjwidjet mögelkhaiden',
+'prefs-advancedsearchoptions' => 'Ütjwidjet mögelkhaiden',
+'prefs-advancedwatchlist' => 'Ütjwidjet mögelkhaiden',
 'prefs-displayrc' => "Mögelkhaiden för't uunwisin",
 'prefs-displaysearchoptions' => "Mögelkhaiden för't uunwisin",
 'prefs-displaywatchlist' => "Mögelkhaiden för't uunwisin",
@@ -1220,6 +1257,7 @@ Do san jo ual iinstelangen wech.',
 'userrights-notallowed' => 'Dü heest ei det rocht, am brükerrochten tu feranrin.',
 'userrights-changeable-col' => 'Lasmootskapen, diar dü feranre könst',
 'userrights-unchangeable-col' => 'Lasmootskapen, diar dü ei feranre könst',
+'userrights-conflict' => 'Brükerrochten konflikt! Du din feranrangen noch ans iin.',
 
 # Groups
 'group' => 'Skööl:',
@@ -1255,13 +1293,13 @@ Do san jo ual iinstelangen wech.',
 'right-move' => 'Sidjen fersküüw',
 'right-move-subpages' => 'Sidjen mä onersidjen fersküüw',
 'right-move-rootuserpages' => 'Hood-brükersidj fersküüw',
-'right-movefile' => 'Dateien fersküüw',
+'right-movefile' => 'Datein fersküüw',
 'right-suppressredirect' => "Bi't fersküüwen nian widjerfeerang iinracht",
-'right-upload' => 'Dateien huuchsjüür',
-'right-reupload' => 'Dateien auerskriiw',
+'right-upload' => 'Datein huuchschüür',
+'right-reupload' => 'Datein auerskriiw',
 'right-reupload-own' => 'En datei auerskriiw, diar dü salew huuchsjüürd heest',
 'right-reupload-shared' => 'En datei auerskriiw, diar uun en gemiansoom archiif leit',
-'right-upload_by_url' => 'Dateien faan en URL-adress huuchsjüür',
+'right-upload_by_url' => 'Datein faan en URL-adres huuchschüür',
 'right-purge' => 'Sidjen-cache leesag maage saner efterfraagin',
 'right-autoconfirmed' => 'Hualew-seekert sidjen bewerke',
 'right-bot' => 'Automatisiaret bewerke',
@@ -1269,36 +1307,92 @@ Do san jo ual iinstelangen wech.',
 'right-apihighlimits' => 'Huuger taalen für API-uunfraagen brük',
 'right-writeapi' => 'Write-API brük',
 'right-delete' => 'Sidjen strik',
-'right-bigdelete' => 'Sidjen mä föl wersjuunen strik',
-'right-deleterevision' => 'Enkelt wersjuunen faan en sidj strik of turaghaale',
-'right-browsearchive' => 'Sjük stregen sidjen',
+'right-bigdelete' => 'Sidjen mä föl werjuunen strik',
+'right-deletelogentry' => 'Enkelt werjuunen faan en logbuk-iindrach strik of turaghaale',
+'right-deleterevision' => 'Enkelt werjuunen faan en sidj strik of turaghaale',
+'right-deletedhistory' => 'Stregen iindracher uun a ferluup uunluke, saner di tekst, di diartu hiart',
+'right-deletedtext' => 'Stregen tekst an feranrangen tesken stregen werjuunen uunluke',
+'right-browsearchive' => 'Schük stregen sidjen',
+'right-undelete' => 'Stregen sidjen turaghaale',
+'right-suppressrevision' => 'Werjuunen uunluke an turaghaale, diar uk för administratooren ei tu sen san',
+'right-suppressionlog' => 'Priwoot logbuken uunluke',
+'right-block' => "Brükern spere (för't skriiwen)",
+'right-blockemail' => "Brüker spere för't E-Mail sjüüren",
+'right-hideuser' => 'Brükernööm spere an fersteeg',
+'right-ipblock-exempt' => 'Ütjnoom faan IP-speren, automaatisk speren an range-speren',
+'right-proxyunbannable' => 'Ütjnoom faan automaatisk proxy-speren',
+'right-unblockself' => 'Sper apheew för ään salew',
+'right-protect' => 'Det seekerhaid faan sidjen feranre an seekerd sidjen bewerke',
+'right-editprotected' => 'Seekerd sidjen bewerke (saner kaskaaden-seekerhaid)',
+'right-editinterface' => 'Brüker-skak bewerke',
+'right-editusercssjs' => 'CSS- an JavaScript-datein faan ööder brükern bewerke',
+'right-editusercss' => 'CSS-datein faan ööder brükern bewerke',
+'right-edituserjs' => 'JavaScript-datein faan ööder brükern bewerke',
+'right-rollback' => 'Feranrangen faan di leetst brüker gau turagsaat',
+'right-markbotedits' => 'Gau turagsaatangen üs bot-iindracher kääntiakne',
+'right-noratelimit' => 'Ei troch limits beskäären',
+'right-import' => 'Bilen faan ööder Wikis importiare',
+'right-importupload' => 'Sidjen auer det huuchschüüren faan datein importiare',
+'right-patrol' => 'Werk faan ööder brükern üs kontroliaret kääntiakne',
+'right-autopatrol' => 'Aanj werk aleewen üs kontroliaret kääntiakne',
+'right-patrolmarks' => 'Kontrolkääntiaken uun a leetst feranrangen uunwise',
+'right-unwatchedpages' => 'List faan sidjen uunluke, diar näämen üüb aachtet',
+'right-mergehistory' => 'Ferluup faan sidjen tuupfeer',
+'right-userrights' => 'Brükerrochten bewerke',
+'right-userrights-interwiki' => 'Brükerrochten uun ööder Wikis bewerke',
+'right-siteadmin' => 'Dootenbeenk spere an eebenmaage',
+'right-override-export-depth' => 'Sidjen an onersidjen bit tu en jipde faan 5 eksportiare',
 'right-sendemail' => 'E-mails tu oudere brükere schake',
+'right-passwordreset' => 'Paaswurd faan en brüker turagsaat an det E-Mail diartu uunluke',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Nai-önjmäldings-logbök',
+'newuserlogpagetext' => 'Detheer as en logbuk faan nei iinracht brükerkonten.',
 
 # User rights log
 'rightslog' => 'Ruchte-logbök',
+'rightslogtext' => 'Det as det logbuk auer feranrangen faan brükerrochten.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'jüdeer sid leese',
-'action-edit' => 'jüdeer sid beårbe',
-'action-createpage' => 'side mååge',
-'action-createtalk' => 'diskusjoonside mååge',
+'action-edit' => 'detdiar sidj tu bewerkin',
+'action-createpage' => 'nei sidjen tu maagin',
+'action-createtalk' => 'diskusjuunssidjen maage',
 'action-createaccount' => 'jüdeer brükerkonto mååge',
 'action-minoredit' => 'detdiar feranrang üs letj kääntiakne',
 'action-move' => 'jüdeer sid ferschüwe',
 'action-move-subpages' => 'jüdeer sid än unerside ferschüwe',
 'action-move-rootuserpages' => 'hood-brükersidj fersküüw',
 'action-movefile' => 'jüdeer sid ferschüwe',
+'action-upload' => 'Datein huuchschüür',
+'action-reupload' => 'det datei auerskriiw',
+'action-reupload-shared' => 'det datei auerskriiw, diar uun en gemiansoom archiif leit',
+'action-upload_by_url' => 'detdiar datei faan en URL-adres huuchtusjüüren',
+'action-writeapi' => 'iin uun det API tu skriiwen',
 'action-delete' => 'detdiar sidj strik',
-'action-browsearchive' => 'sjük stregen sidjen',
+'action-deleterevision' => 'werjuunen tu striken',
+'action-deletedhistory' => 'det list mä stregen werjuunen uuntulukin',
+'action-browsearchive' => 'schük stregen sidjen',
 'action-undelete' => 'detdiar sidj weder iinstel',
+'action-suppressrevision' => 'det ferbürgen werjuun uuntulukin an weder turagtuhaalin',
+'action-suppressionlog' => 'iin uun det priwoot logbuk tu lukin',
+'action-block' => 'di brüker tu sperin',
+'action-protect' => 'det seekerhaid faan sidjen tu feranrin',
+'action-rollback' => 'feranrangen faan di leetst brüker gau turagtusaaten',
+'action-import' => 'sidjen faan en ööder Wiki tu importiarin',
+'action-importupload' => 'sidjen auer det huuchschüüren faan datein tu importiarin',
+'action-patrol' => 'det werk faan ööder brükern üs kontroliaret tu kääntiaknin',
+'action-autopatrol' => 'aanj feranrangen üs kontroliaret tu kääntiaknin',
+'action-unwatchedpages' => 'det list faan sidjen uuntulukin, diar näämen üüb aachtet',
+'action-mergehistory' => 'werjuunshistoorin faan sidjen tuuptufeeren',
+'action-userrights' => 'brükerrochten tu bewerkin',
+'action-userrights-interwiki' => 'brükerrochten uun ööder Wikis tu bewerkin',
+'action-siteadmin' => 'det dootenbeenk tu sperin an eebentumaagin',
 'action-sendemail' => 'e-mails sjüür',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|änring|änringe}}',
-'recentchanges' => 'Leeste änringe',
+'recentchanges' => 'Leetst feranrangen',
 'recentchanges-legend' => 'Wis-opsjoone',
 'recentchanges-summary' => "Üüb detdiar sidj könst dü a leetst feranrangen faan't Nuurdfresk Wikipedia ferfulge.",
 'recentchanges-feed-description' => 'Ferfülie ma dåtheer feed da leeste änringe önj {{SITENAME}}.',
@@ -1309,20 +1403,25 @@ Do san jo ual iinstelangen wech.',
 'rcnote' => "Wised {{PLURAL:\$1|wård '''1''' änring|wårde da leeste '''\$''' änringe}} {{PLURAL:\$2|foon e leest däi|foon da leeste '''\$2''' deege}}. Stånd: \$4, am e klook \$5.",
 'rcnotefrom' => "Diar wurd a feranrangen sant '''$2'''uunwiset (ei muar üs '''$1''' feranrangen).",
 'rclistfrom' => 'Bloot änringe sunt $1 wise.',
-'rcshowhideminor' => 'Latje änringe $1',
+'rcshowhideminor' => 'Letj feranrangen $1',
 'rcshowhidebots' => 'Bots $1',
-'rcshowhideliu' => 'Önjmäldede brükere $1',
+'rcshowhideliu' => '$1 uunmeldet brükern',
 'rcshowhideanons' => 'Anonymen brüker $1',
-'rcshowhidepatr' => '$1 efterluket feranrangen',
-'rcshowhidemine' => 'Äine tujeefte $1',
+'rcshowhidepatr' => 'Efterluket feranrangen $1',
+'rcshowhidemine' => 'Min bidracher $1',
 'rclinks' => 'Wis da leeste $1 änringe foon da leeste $2 deege.<br />$3',
-'diff' => 'ferschääl',
-'hist' => 'färsjoone',
-'hide' => 'ütbläne',
-'show' => 'önjbläne',
+'diff' => 'ferskeel',
+'hist' => 'werjuunen',
+'hide' => 'Fersteeg',
+'show' => 'Wise',
 'minoreditletter' => 'L',
 'newpageletter' => 'N',
 '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-change-size-new' => "$1 {{PLURAL:$1|byte|bytes}} efter't feranrin",
+'newsectionsummary' => 'Nei ufdialang /* $1 */',
 'rc-enhanced-expand' => 'Detaile wise (JavaScript as nüsi)',
 'rc-enhanced-hide' => 'Detaile fersteege',
 'rc-old-title' => 'tuiarst maaget üs „$1“',
@@ -1333,156 +1432,699 @@ Do san jo ual iinstelangen wech.',
 'recentchangeslinked-toolbox' => 'Feranrangen bi ferlinket sidjen',
 'recentchangeslinked-title' => 'Feranrangen bi sidjen, diar faan "$1" ferlinket san',
 'recentchangeslinked-noresult' => 'Uun detdiar tidj san jo ferlinket sidjen ei feranert wurden.',
-'recentchangeslinked-summary' => "Jüdeer speetsjoolsid listet da leeste änringe bai da ferlinked side ap (btw. bai kategoriie tu da lasmoote foon jüdeer kategorii). Side aw din [[Special:Watchlist|eefterkiikliste]] san '''fåt''' deerstald.",
+'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' => 'Sid:',
-'recentchangeslinked-to' => 'Wis änringe aw side, da heerjurt ferlinke',
+'recentchangeslinked-to' => 'Wise feranrangen üüb sidjen, diar heerhen ferwise.',
 
 # Upload
-'upload' => 'Huuchschake',
+'upload' => 'Datei huuchschüür',
 'uploadbtn' => 'Datei huuchsjüür',
-'uploadnologin' => 'Ai önjmälded',
-'uploadnologintext' => 'Dü möist [[Special:UserLogin|önjmälded weese]], am dat dü dootäie huuchsiinje koost.',
+'reuploaddesc' => "Ufbreeg an turag tu't sidj för't huuchsjüüren",
+'upload-tryagain' => 'Feranert dateibeskriiwang ufsjüür',
+'uploadnologin' => 'Ei uunmeldet',
+'uploadnologintext' => 'Dü skel [[Special:UserLogin|uunmeldet]] wees, amdat dü datein huuchschüür könst.',
 'upload_directory_missing' => 'Dåt aplees-fertiiknis ($1) breecht än köö ai foon di wäbsärwer mååged wårde.',
 'upload_directory_read_only' => 'Dåt aplees-fertiiknis ($1) koon ai foon e wäbsärver beschraawen wårde.',
 'uploaderror' => 'Aplees-fäägel',
+'upload-recreate-warning' => "'''Paase üüb: En datei mä didiar nööm as al ans stregen of fersköwen wurden.'''
+
+Wat nü komt, as ütj det logbuk för't striken an fersküüwen faan detdiar datei.",
+'uploadtext' => "Brük detdiar formulaar, am nei datein huuchtuschüüren.
+
+Gung tu det [[Special:FileList|list faan huuchschüürd datein]], am datein tu schüken of uuntuwisin. Luke uk iin uun't logbuk för't [[Special:Log/upload|huuchschüüren]] of [[Special:Log/delete|striken]] faan datein.
+
+Am en '''bil''' uun en artiikel tu brüken, brük en link faan det furem:
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.jpg]]</nowiki></code>''' – för en grat bil
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.png|200px|thumb|left|alternatiif tekst]]</nowiki></code>''' – för en 200px briad bil uun en box, mä „alternatiif tekst“ üs beskriiwang faan det bil
+*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datei.ogg]]</nowiki></code>''' – för en direkt ferwisang üüb det datei, saner det datei uuntuwisin",
+'upload-permitted' => 'Tuläät slacher faan datein: $1.',
+'upload-preferred' => 'Slacher faan datein, diar dü brük skulst: $1.',
+'upload-prohibited' => 'Ei tuläät slacher faan datein: $1.',
 'uploadlog' => 'datei logbuk',
 'uploadlogpage' => 'Dåtäi-logbök',
+'uploadlogpagetext' => 'Detheer as det logbuk för huuchschüürd datein. Dü könst uk det [[Special:NewFiles|galerii faan nei datein]] uunluke.',
+'filename' => 'Dateinööm',
 'filedesc' => 'Beskriiwang',
 'fileuploadsummary' => 'Beskriiwang',
+'filereuploadsummary' => 'Feranrangen faan det datei:',
+'filestatus' => 'Copyright-Status:',
 'filesource' => 'Kwel',
-'uploadedfiles' => 'Huuchsjüürd dateien',
+'uploadedfiles' => 'Huuchschüürd datein',
+'ignorewarning' => 'Ei üüb wäärnangen aachte an det datei seekre',
+'ignorewarnings' => 'Ei am wäärnangen komre',
+'minlength1' => 'Dateinöömer skel tumanst ään buksteew lung wees.',
+'illegalfilename' => 'Uun di dateinööm „$1“ stäänt tumanst ian tiaken, wat dü ei brük mutst. Wees so gud an du det datei en öödern nööm.',
+'filename-toolong' => 'Dateinöömer mut ei linger üs 240 bytes wees.',
+'badfilename' => 'Det datei hää en neien nööm füngen an het nü „$1“.',
+'filetype-mime-mismatch' => 'Det dateiaanj „.$1“ paaset ei tu di MIME-Typ ($2).',
+'filetype-badmime' => 'Datein faan di MIME-Typ „$1“ mut ei huuchschüürd wurd.',
+'filetype-bad-ie-mime' => 'Detdiar datei koon ei huuchsjüürd wurd, auer di Internet Explorer det för en „$1“ häält, an di slach as ei tuläät, auer hi gefeerelk wees küd.',
+'filetype-unwanted-type' => "'''„.$1“''' as üs dateiformaat ei tuläät. Tuläät {{PLURAL:$3|as detdiar formaat|san jodiar formaaten}}: $2.",
+'filetype-banned-type' => "'''„.$1“''' {{PLURAL:$4|as nään tuläät slach faan datein|san nian tuläät slacher faan datein}}.
+{{PLURAL:$3|En tuläät slach as|Tuläät slacher san}} $2.",
+'filetype-missing' => 'Det datei, wat dü huuchsjüür wel, hää nian aanj (t.b. „.jpg“).',
+'empty-file' => 'Det datei, wat dü huuchsjüürd heest, as leesag.',
+'file-too-large' => 'Det datei, wat dü huuchsjüürd heest, as tu grat.',
+'filename-tooshort' => 'Di dateinööm as tu kurt.',
+'filetype-banned' => 'Son slach faan datei as ei tuläät.',
+'verification-error' => 'Det datei hää det seekerhaidspreew ei bestenen.',
+'hookaborted' => 'Det feranerang, wat dü maage wulst, as ufbreegen wurden.',
+'illegal-filename' => 'Didiar dateinööm as ei tuläät.',
+'overwrite' => 'Dü könst nian datei auerskriiw, wat al diar as.',
+'unknown-error' => 'Diar as irgentwat skiaf gingen.',
+'tmp-create-error' => 'Det tidjwiis datei küd ei maaget wurd.',
+'tmp-write-error' => "Bi't skriiwen faan det tidjwiis datei as wat skiaf gingen.",
+'large-file' => 'Datein skul ei grater wees üs $1, wan mögelk. Detdiar datei as $2 grat.',
+'largefileserver' => 'Detdiar datei as grater, üs di server üüb iinsteld as.',
+'emptyfile' => 'Det datei, wat dü huuchsjüürd heest, as leesag. Ferlicht heest dü di ferskrewen. Luke noch ans, of dü würelk detdiar datei huuchsjüür wel.',
+'windows-nonascii-filename' => 'Detheer Wiki läät nian dateinöömer mä sondertiaken tu.',
+'fileexists' => 'En datei mä didiar nööm jaft at al. Luke noch ans efter <strong>[[:$1]]</strong>, wan dü ei gans seeker beest, of dü det anre wel.
+[[$1|thumb]]',
+'filepageexists' => "En beskriiwangssidj för <strong>[[:$1]]</strong> as al diar, oober nian datei. Din beskriiwang woort ei apnimen. Det beskriiwangssidj mut do man efter't huuchsjüüren noch ans efterluket wurd.
+[[$1|thumb]]",
+'fileexists-extension' => 'Diar as al en datei mä di nööm: [[$2|thumb]]
+* Nööm faan det nei datei: <strong>[[:$1]]</strong>
+* Nööm faan det ual datei: <strong>[[:$2]]</strong>
+Wees so gud an nem en öödern nööm.',
+'fileexists-thumbnail-yes' => "Detdiar datei as was en letjer maaget bil ''(thumbnail)''. [[$1|thumb]]
+Luke di det datei <strong>[[:$1]]</strong> noch ans uun.
+Wan det det originaal bil as, säärst dü nään letjer maaget bil huuchsjüür.",
+'file-thumbnail-no' => "Di dateinööm begant mä <strong>$1</strong>. Det as was en letjer maaget bil ''(thumbnail)''.
+Luke noch ans efter, of dü det bil uun fol grate diar heest, an do sjüür det huuch.",
+'fileexists-forbidden' => 'En datei mä didiar nööm jaft at al an koon ei auerskrewen wurd. Gung noch ans turag an sjüür det datei mä en öödern nööm huuch. [[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => "En datei mä didiar nööm stäänt al uun't gemiansoom archiif. Wan dü det bil likes huuchsjüür wel, gung turag nem en öödern nööm.
+[[File:$1|thumb|center|$1]]",
+'file-exists-duplicate' => 'Detdiar datei as en duplikaat faan {{PLURAL:$1|detdiar datei|$1 datein}}:',
+'file-deleted-duplicate' => "En duplikaat faan detdiar datei ([[:$1]]) as al ans stregen wurden. Luke iin uun logbuk för't striken, iar dü det noch ans huuchsjüürst.",
+'uploadwarning' => 'Wäärnang',
+'uploadwarning-text' => 'Feranre det datei-beskriiwang an fersjük det noch ans nei.',
+'savefile' => 'Datei seekre',
 'uploadedimage' => 'heet "[[$1]]" huuchsånd',
+'overwroteimage' => 'hää en nei werjuun faan „[[$1]]“ huuchsjüürd',
+'uploaddisabled' => 'Huuchsjüüren as ei aktiwiaret',
+'copyuploaddisabled' => 'Huuchsjüüren faan URLs as ei aktiwiaret.',
+'uploadfromurl-queued' => 'Din huuchsjüürd datei teewt.',
+'uploaddisabledtext' => 'Det huuchschüüren faan datein as ei aktiwiaret.',
+'php-uploaddisabledtext' => 'Det huuchschüüren faan datein as uun PHP ei aktiwiaret.
+Luke 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.',
+'uploadvirus' => 'Uun detdiar datei as en wiirus! Details: $1',
+'uploadjava' => 'Detdiar as en ZIP-datei mä en CLASS-datei faan Java.
+Java-datein kön ei tuläät wurd, auer jo det seekerhaid uun fraag stel küd.',
+'upload-source' => 'Kweldatei',
+'sourcefilename' => 'Kweldateinööm:',
+'sourceurl' => 'Kwel-URL:',
+'destfilename' => 'Nei dateinööm:',
+'upload-maxfilesize' => 'Datei ei grater üs: $1',
+'upload-description' => 'Dateibeskriiwang',
+'upload-options' => "Mögelkhaiden för't huuchsjüüren",
 'watchthisupload' => 'Luke efter detdiar datei',
+'filewasdeleted' => 'En datei mä didiar nööm as al ans huuchsjüürd an leederhen weder stregen wurden. Luke iarst ans iin uun $1, iar dü det datei würelk seekerst.',
+'filename-bad-prefix' => "Di dateinööm begant mä '''„$1“'''. Sok nöömer kem miast faan digitaalkameras an sai ei föl ütj.
+Nem en beedern nööm för det datei.",
+'upload-success-subj' => 'Det huuchsjüüren hää loket.',
+'upload-success-msg' => 'Det huuchsjüüren faan [$2] hää loket an stäänt nü diar: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => "Bi't huuchsjüüren as wat skiaf gingen.",
+'upload-failure-msg' => "Diar as wat skiaf gingen bi't huuchsjüüren faan [$2]:
+
+$1",
+'upload-warning-subj' => 'Wäärnang',
+'upload-warning-msg' => "Diar as wat skiaf gingen bi't huuchsjüüren faan [$2]. Gung turag tu't  [[Special:Upload/stash/$1|sidj för't huuchsjüüren]], am det üüb a rä tu fun.",
 
+'upload-proto-error' => 'Ferkiard protokol',
+'upload-proto-error-text' => 'Det URL skal mä <code>http://</code> of <code>ftp://</code> began.',
 'upload-file-error' => 'Diar as wat skiaf gingen',
+'upload-file-error-text' => "Bi't maagin faan det tidjwiis datei as wat skiaf gingen. Wees so gud an skriiw det tu en [[Special:ListUsers/sysop|administraator]].",
+'upload-misc-error' => "Bi't huuchsjüüren as wat skiaf gingen.",
+'upload-misc-error-text' => "Bi't huuchsjüüren as wat skiaf gingen. Luke di det URL noch ans uun, an of det sidj uk würelk diar as.
+Wan det goorei wal, do skriiw tu en [[Special:ListUsers/sysop|administraator]].",
+'upload-too-many-redirects' => 'Det URL hää tuföl widjerfeerangen.',
+'upload-unknown-size' => 'Ünbekäänd grate',
+'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.',
 
 # File backend
 '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.',
+'backend-fail-hashes' => 'Küd nään hash-wäärs tu fergliken finj.',
+'backend-fail-notsame' => 'Diar as al en ööder datei mä di nööm $1.',
+'backend-fail-invalidpath' => '$1 as nian tuläät steed tu seekrin.',
 'backend-fail-delete' => 'Det datei $1 küd ei stregen wurd.',
+'backend-fail-describe' => 'A metadooten för det datei „$1“ küd ei anert wurd.',
+'backend-fail-alreadyexists' => 'Det sidj $1 jaft at al.',
 'backend-fail-store' => 'Det datei $1 küd ei oner $2 seekert wurd.',
 'backend-fail-copy' => 'Det datei $1 küd ei efter $2 kopiaret wurd.',
 'backend-fail-move' => 'Det datei $1 küd ei efter $2 fersköwen wurd.',
+'backend-fail-opentemp' => 'Det tidjwiis datei küd ei eeben maaget wurd.',
+'backend-fail-writetemp' => 'Det tidjwiis datei küd ei skrewen wurd.',
+'backend-fail-closetemp' => 'Det tidjwiis datei küd ei sacht maaget wurd.',
 'backend-fail-read' => 'Det datei $1 küd ei leesen wurd.',
 'backend-fail-create' => 'Det datei $1 küd ei seekert wurd.',
+'backend-fail-maxsize' => 'Det datei $1 küd ei seekert wurd, auer det grater üs {{PLURAL:$2|1 byte|$2 bytes}} as.',
+'backend-fail-readonly' => 'Det süsteem „$1“ koon uun uugenblak bluas lees. Di grünj as: „$2“',
+'backend-fail-synced' => "Det datei „$1“ woort jüst faan't süsteem bewerket.",
+'backend-fail-connect' => "Küd ei mä't süsteem „$1“ ferbinj.",
+'backend-fail-internal' => "Uun't süsteem „$1“ as wat skiaf gingen.",
+'backend-fail-contenttype' => "Di slach faan det datei uun't steed „$1“ küd ei bestemet wurd.",
+'backend-fail-batchsize' => "En batch uun't süsteem koon ei {{PLURAL:$1|1 apgoow|$1 apgoowen}} bewerke. Det mut ei muar üs {{PLURAL:$2|1 apgoow|$2 apgowen}} tu tidj wees.",
+'backend-fail-usable' => 'Det datei „$1“ küd ei ufrepen of seekert wurd, auer diar eder det fertiaknis waant of a brükerrochten ei ling.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => "Küd ei ferbinj mä't jurnaal-dootenbeenk uun't süsteem „$1“.",
+'filejournal-fail-dbquery' => "Det jurnaal-dootenbeenk faan't süsteem „$1“ küd ei aktualisiaret wurd.",
+
+# Lock manager
+'lockmanager-notlocked' => 'Küd det sper faan „$1“ ei apliase, auer diar goor nian sper wiar.',
+'lockmanager-fail-closelock' => 'Det sperdatei för „$1“ küd ei slööden wurd.',
+'lockmanager-fail-deletelock' => 'Det sperdatei för „$1“ küd ei stregen wurd.',
+'lockmanager-fail-acquirelock' => 'Det sper för „$1“ küd ei ufrepen  wurd.',
+'lockmanager-fail-openlock' => 'Det sperdatei för „$1“ küd ei eeben maaget wurd.',
+'lockmanager-fail-releaselock' => 'Det sper för „$1“ küd ei apliaset wurd.',
+'lockmanager-fail-db-bucket' => 'Mä $1 küd ei nooch ferbinjangen tu sperdootenbeenken iinracht wurd.',
+'lockmanager-fail-db-release' => "A speren uun't dootenbeenk $1 küd ei apliaset wurd.",
+'lockmanager-fail-svr-acquire' => 'A speren üüb server $1 küd ei ufrepen wurd.',
+'lockmanager-fail-svr-release' => 'A speren üüb server $1 küd ei apliaset wurd.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => "Diar as wat skiaf gingen bi't leesen faan det datei tu't ZIP-preew.",
+'zip-wrong-format' => 'Detdiar datei as nian ZIP-datei.',
+'zip-bad' => 'Det ZIP-datei as uunstaken of koon ütj irgent en öödern grünj ei leesen wurd. Diaram koon det uk ei üüb seekerhaid preewet wurd.',
+'zip-unsupported' => 'Detdiar ZIP-datei as faan en slach, diar MediaWiki ei lees koon. Diaram koon det uk ei üüb seekerhaid preewet wurd.',
+
+# Special:UploadStash
+'uploadstash' => "Teskenseekerang bi't huuchsjüüren",
+'uploadstash-summary' => 'Üüb detdiar sidj kem datein föör, diar man jüst huuchschüürd wurden san. Bluas, hoker jo huuchschüürd hää, koon jo sä.',
+'uploadstash-clear' => 'Teskenseekert datein wechnem',
+'uploadstash-nofiles' => 'Diar san nian teskenseekert datein.',
+'uploadstash-badtoken' => 'Teskenseekert datein küd ei wechnimen wurd. Ferlicht beest dü ei muar uunmeldet. Ferschük det man noch ans.',
+'uploadstash-errclear' => 'Teskenseekert datein küd ei wechnimen wurd.',
+'uploadstash-refresh' => 'List mä datein aktualisiare.',
+'invalid-chunk-offset' => 'Di began as diar ei tuläät.',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'Tugrip ei mögelk',
+'img-auth-nopathinfo' => 'Diar as nään PATH_INFO.
+Di server koon detdiar informatsjuun ei widjerdu.
+Ferlicht as det uun CGI iinbünjen an komt diaram uk ei mä „img_auth“ turocht.
+Üüb det sidj https://www.mediawiki.org/wiki/Manual:Image_Authorization (ingelsk) stäänt diar muar auer.',
+'img-auth-notindir' => 'Detdiar fertiaknis as ei föörsen tu huuchsjüüren.',
+'img-auth-badtitle' => 'Mä „$1“ küd nään tiitel maaget wurd.',
+'img-auth-nologinnWL' => "Dü beest ei uunmeldet, an „$1“ stäänt ei uun't whitelist.",
+'img-auth-nofile' => 'Diar as nään datei „$1“.',
+'img-auth-isdir' => 'Dü wel üüb en fertiaknis „$1“ tugrip. Dü mutst bluas üüb datein tugrip.',
+'img-auth-streaming' => '„$1“ woort iinleesen.',
+'img-auth-public' => 'Mä img_auth.php wurd datein faan en priwoot Wiki ütjden.
+Detheer as oober en öfentelk Wiki.
+För a seekerhaid as img_auth.php ei aktiwiaret.',
+'img-auth-noread' => 'Di brüker hää nian rocht, „$1“ tu leesen.',
+'img-auth-bad-query-string' => 'Uun det URL san ei tuläät uffraagtiakens.',
+
+# HTTP errors
+'http-invalid-url' => 'Ei tuläät URL: $1',
+'http-invalid-scheme' => 'URLs mä det münster „$1“ kön ei brükt wurd.',
+'http-request-error' => "HTTP-feeler bi't uffraagin.",
+'http-read-error' => "HTTP-feeler bi't leesen.",
+'http-timed-out' => 'Det HTTP-uffraag hää tu loong düüret (time-out).',
+'http-curl-error' => "Feeler bi't ufrepen faan det URL: $1",
+'http-bad-status' => "Feeler bi't HTTP-uffraag: $1 $2",
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'URL küd ei fünjen wurd',
+'upload-curl-error6-text' => 'Det URL küd ei fünjen wurd. Luke di det URL noch ans uun, an of det sidj uk würelk diar as.',
+'upload-curl-error28' => 'Det huuchsjüüren hää tu loong düüret (time-out).',
+'upload-curl-error28-text' => 'Det sidj hää tu loong ei swaaret (time-out). Luke noch ans efter, of det sidj uk würelk diar as. Fersjük det beeder leeder noch ans weder.',
 
 'license' => 'Lisens:',
 'license-header' => 'Lisens',
+'nolicense' => 'Nian ütjwool',
+'license-nopreview' => '(Diar as noch niks tu sen)',
+'upload_source_url' => '(en tuläät URL)',
+'upload_source_file' => '(en datei üüb dan computer)',
+
+# Special:ListFiles
+'listfiles-summary' => 'Üüb detdiar spezialsidj wurd aal a huuchschüürd datein uunwiset. Dü könst uk efter brükern filtre, diar datein tuleetst bewerket haa.',
+'listfiles_search_for' => 'Schük efter det datei:',
+'imgfile' => 'datei',
+'listfiles' => 'List faan datein',
+'listfiles_thumb' => 'Letjer bil',
+'listfiles_date' => 'Dootem',
+'listfiles_name' => 'Nööm',
+'listfiles_user' => 'Brüker',
+'listfiles_size' => 'Grate',
+'listfiles_description' => 'Beskriiwang',
+'listfiles_count' => 'Werjuunen',
 
 # File description page
 'file-anchor-link' => 'Datei',
 'filehist' => 'Dååtäifärsjoone',
-'filehist-help' => 'Klik aw en tidpunkt, am jüdeer färsjoon önjiinjtunaamen.',
-'filehist-deleteall' => 'åle färsjoone strike',
+'filehist-help' => 'Klike üüb en tidjponkt, am detdiar werjuun uuntulukin.',
+'filehist-deleteall' => 'aal a werjuunen strik',
 'filehist-deleteone' => 'jüdeer färsjoon strike',
 'filehist-revert' => 'tubääg seete',
 'filehist-current' => 'aktuäl',
-'filehist-datetime' => 'Färsjoon foon e',
+'filehist-datetime' => 'Werjuun faan di',
 'filehist-thumb' => 'Forlökbil',
-'filehist-thumbtext' => 'Forlökbil for Färsjoon foon $2, am e klook $3',
+'filehist-thumbtext' => 'Föörskau för det werjuun faan $2, klook $3',
 'filehist-nothumb' => 'Niinj forlökbil deer',
 'filehist-user' => 'brüker',
 'filehist-dimensions' => 'Mätje',
+'filehist-filesize' => 'Dateigrate',
 'filehist-comment' => 'Komentoor',
+'filehist-missing' => 'Datei ei diar',
 'imagelinks' => 'Hü det datei brükt woort',
-'linkstoimage' => '{{PLURAL:$1|Jü füliend sid ferwånt|Da füliende $1 side ferwiinje}} jüdeer dååtäi:',
+'linkstoimage' => '{{PLURAL:$1|Detdiar sidj brükt|Jodiar $1 sidjen brük}} detdiar datei:',
+'linkstoimage-more' => 'Muar üs $1 {{PLURAL:$1|sidj ferwiset|sidjen ferwise}} üüb detdiar datei.
+Det list wiset {{PLURAL:$1|at iarst ferwisang|a iarst $1 ferwisangen}} üüb detdiar datei.
+Dü könst uk det [[Special:WhatLinksHere/$2|hial list]] uunluke.',
 'nolinkstoimage' => 'Nään artiikel brükt detheer datei',
+'morelinkstoimage' => 'Dü könst [[Special:WhatLinksHere/$1|muar ferwisangen]] üüb detdiar datei uunwise läät.',
+'linkstoimage-redirect' => '$1 (widjerfeerang) $2',
+'duplicatesoffile' => '{{PLURAL:$1|Detdiar datei as en kopii|$1 datein san kopiin}} faan det datei ([[Special:FileDuplicateSearch/$2|muar diartu]]):',
 'sharedupload' => 'Jüdeer dååtäi ståmt üt $1 än mötj foon ouder prujäkte brükt wårde.',
+'sharedupload-desc-there' => 'Detdiar datei as faan $1 an koon faan ööder projekten brükt wurd.
+Üüb det [$2 beskriiwangssidj] stäänt muar diartu.',
 'sharedupload-desc-here' => "Detheer bil as faan $1 an koon faan ööder projekten brükt wurd. 
 Det beskriiwang faan't [$2 beskriiwangssidj] woort oner uunwiset.",
-'uploadnewversion-linktext' => 'En nai färsjoon foon jüdeer dåtäi huuchsiinje',
+'sharedupload-desc-edit' => 'Detdiar datei as faan $1 an koon faan ööder projekten brükt wurd.
+Ferlicht wel dü det [$2 beskriiwangssidj] feranre.',
+'sharedupload-desc-create' => 'Detdiar datei as faan $1 an koon faan ööder projekten brükt wurd.
+Ferlicht wel dü det [$2 beskriiwangssidj] feranre.',
+'filepage-nofile' => 'En datei mä didiar nööm jaft at ei.',
+'filepage-nofile-link' => 'En datei mä didiar nööm jaft at ei, man dü könst det [$1 huuchsjüür].',
+'uploadnewversion-linktext' => 'En nei werjuun faan detdiar datei huuchschüür',
 'shared-repo-from' => 'foon $1',
+'shared-repo' => 'en gemiansoom archiif',
+'upload-disallowed-here' => 'Dü könst detdiar datei ei auerskriiw.',
+
+# File reversion
+'filerevert' => '"$1" turagsaat',
+'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-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.',
+
+# File deletion
+'filedelete' => 'Strik "$1"',
+'filedelete-legend' => 'Strik datei',
+'filedelete-intro' => "Dü strikst det datei '''„[[Media:$1|$1]]“''' an uk aal a werjuunen.",
+'filedelete-intro-old' => "Dü strikst faan det datei '''[[Media:$1|$1]]''' det [$4 werjuun faan $2, klook $3].",
+'filedelete-comment' => 'Grünj:',
+'filedelete-submit' => 'Strik',
+'filedelete-success' => "'''„$1“''' as stregen wurden.",
+'filedelete-success-old' => "Faan det datei '''„[[Media:$1|$1]]“''' as det werjuun faan $2, klook $3 stregen wurden.",
+'filedelete-nofile' => "'''$1''' jaft at ei.",
+'filedelete-nofile-old' => "Diar as nian werjuun faan '''$1''' mä sok kääntiaken uun't archiif.",
+'filedelete-otherreason' => 'Ööder/noch en grünj:',
+'filedelete-reason-otherlist' => 'Ööder grünj:',
+'filedelete-reason-dropdown' => "*Grünjer för't striken
+** Kopiarrochten ei beaachtet
+** Kopii faan en datei",
+'filedelete-edit-reasonlist' => "Grünjer för't striken bewerke",
+'filedelete-maintenance' => 'Det striken of turaghaalin faan datein gongt uun uugenblak ei.',
+'filedelete-maintenance-title' => 'Det datei koon ei stregen wurd',
+
+# MIME search
+'mimesearch' => 'Efter MIME-Typ schük',
+'mimesearch-summary' => 'Üüb detheer sidj könst dü datein efter hör MIME-Typ filtre.
+Det formoot as leewen slach/onerslach üs uun det bispal: <code>image/jpeg</code>.',
+'mimetype' => 'MIME-Typ:',
+'download' => 'Deelloose',
+
+# Unwatched pages
+'unwatchedpages' => "Sidjen, diar näämen uun't uug hää",
+
+# List redirects
+'listredirects' => 'Widjerfeerangen',
+
+# Unused templates
+'unusedtemplates' => 'Ei iinbünjen föörlaagen',
+'unusedtemplatestext' => 'Sidjen uun a {{ns:template}}-nöömrüm, diar ei uun ööder sidjen iinbünjen san.
+Iar dü ian strikst, stel seeker, dat diar nian ferwisangen üüb detdetdiar föörlag saan.',
+'unusedtemplateswlh' => 'Ööder ferwisangen',
 
 # Random page
 'randompage' => 'Tufali sid',
+'randompage-nopages' => 'Diar san nian sidjen uun {{PLURAL:$2|nöömrüm|nöömrümer}}: $1.',
+
+# Random redirect
+'randomredirect' => 'Tufelag widjerfeerang',
+'randomredirect-nopages' => 'Uun di nöömrüm „$1“ san nian widjerfeerangen.',
 
 # Statistics
 'statistics' => 'Statistik',
-
+'statistics-header-pages' => 'Sidjenstatistik',
+'statistics-header-edits' => 'Statistik faan bewerkangen',
+'statistics-header-views' => 'Statistik faan kliks üüb sidjen',
+'statistics-header-users' => 'Brükerstatistik',
+'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-files' => 'Huuchschüürd datein',
+'statistics-edits' => 'Bewerkangen, sant det sidj {{SITENAME}} maaget wurden as',
+'statistics-edits-average' => "Bewerkangen per sidj uun't madel",
+'statistics-views-total' => 'Kliks üüb det sidj',
+'statistics-views-total-desc' => 'Kliks üüb sidjen, diar\'t goorei jaft of "Spezial-"sidjen wurd ei mätääld.',
+'statistics-views-peredit' => 'Kliks per bewerkang',
+'statistics-users' => 'Registriaret [[Special:ListUsers|brükern]]',
+'statistics-users-active' => 'Aktiif brükern',
+'statistics-users-active-desc' => 'Brükern, diar wat bewerket haa uun a leetst {{PLURAL:$1|dai|$1 daar}}',
+'statistics-mostpopular' => 'Sidjen mä a miast kliks',
+
+'disambiguations' => 'Sidjen, diar üüb muardüüdag artiikler ferwise',
 'disambiguationspage' => 'Template:Muardüüdag artiikel',
+'disambiguations-text' => "Jodiar sidjen haa tumanst ian ferwisang üüb en '''muardüüdagen artiikel'''. Ferlicht skul jo beeder direkt üüb det mend sidj ferwise.
+
+En sidj täält üs '''muardüüdag artiikel''', wan hat tumanst ian föörlaag faan det [[MediaWiki:Disambiguationspage|Disambiguationspage]] häält.",
+
+'pageswithprop' => 'Sidjen mä en sidjeneegenoort',
+'pageswithprop-legend' => 'Sidjen mä en sidjeneegenoort',
+'pageswithprop-text' => 'Detheer Spezial-sidj feert sidjen mä was sidjeneegenoorten ap.',
+'pageswithprop-prop' => 'Sidjeneegenoort:',
+'pageswithprop-submit' => 'Widjer',
+
+'doubleredirects' => 'Dobelt widjerfeerangen',
+'doubleredirectstext' => "Detheer list feert widjerfeerangen ap, diar üüb widjerfeerangen widjer feer.
+Uun arke rä stun ferwisangen tu't iarst an ööder widjerfeerang an uk tu det sidj, huar det ööder widjerfeerang üüb ferwiset. <del>Trochstregen</del> iindracher san al bewerket wurden.",
+'double-redirect-fixed-move' => '[[$1]] as fersköwen wurden an feert nü widjer tu [[$2]].',
+'double-redirect-fixed-maintenance' => 'Dobelt widjerfeerang faan [[$1]] tu [[$2]] as apredet wurden.',
+'double-redirect-fixer' => 'Bot för widjerfeerangen',
+
+'brokenredirects' => 'Uunstaken widjerfeerangen',
+'brokenredirectstext' => "Jodiar widjerfeerangen ferwise üüb en sidj, diar't goorei jaft:",
+'brokenredirects-edit' => 'bewerke',
+'brokenredirects-delete' => 'strik',
+
+'withoutinterwiki' => 'Sidjen saner ferwisangen tu ööder spriaken',
+'withoutinterwiki-summary' => 'Jodiar sidjen haa nian ferwisangen tu ööder spriaken.',
+'withoutinterwiki-legend' => 'Prefix',
+'withoutinterwiki-submit' => 'Wise',
+
+'fewestrevisions' => 'Sidjen mä manst feranrangen',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '{{PLURAL:$1|kategorii|kategoriie}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|link|links}}',
 'nmembers' => '{{PLURAL:$1|1 önjdraag|$1 önjdraage}}',
-'prefixindex' => 'Åle side (ma prefiks)',
+'nrevisions' => '$1 {{PLURAL:$1|feranrang|feranrangen}}',
+'nviews' => '$1 {{PLURAL:$1|klik|kliks}}',
+'nimagelinks' => 'Brükt üüb $1 {{PLURAL:$1|sidj|sidjen}}',
+'ntransclusions' => 'brükt üüb $1 {{PLURAL:$1|sidj|sidjen}}',
+'specialpage-empty' => 'Diar san tu tidj nian iindracher.',
+'lonelypages' => 'Sidjen, diar ei üüb ferwiset woort',
+'lonelypagestext' => 'Jodiar sidjen san ei uun ööder sidjen iinbünjen an diar woort uun {{SITENAME}} uk ei üüb ferwiset.',
+'uncategorizedpages' => 'Sidjen saner kategorii',
+'uncategorizedcategories' => 'Kategoriin saner kategorii',
+'uncategorizedimages' => 'Datein saner kategorii',
+'uncategorizedtemplates' => 'Föörlaagen saner kategorii',
+'unusedcategories' => 'Kategoriin, diar ei brükt wurd',
+'unusedimages' => 'Datein, diar ei brükt wurd',
+'popularpages' => 'Miats uunluket sidjen',
+'wantedcategories' => 'Kategoriin, diar brükt wurd',
+'wantedpages' => 'Sidjen, diar brükt wurd',
+'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]].',
+'wantedfiletext-nocat' => 'Jodiar datein wurd brükt, oober san ei diar. Datein faan ööder archiiwen wurd apfeerd, san oober <del>trochstregen</del>.',
+'wantedtemplates' => 'Föörlaagen, diar brükt wurd',
+'mostlinked' => 'Sidjen, huar a miast ööder sidjen üüb ferwise',
+'mostlinkedcategories' => 'Miast brükt kategoriin',
+'mostlinkedtemplates' => 'Miast brükt föörlaagen',
+'mostcategories' => 'Sidjen mä a miast kategoriin',
+'mostimages' => 'Datein, huar a miast sidjen üüb ferwise',
+'mostinterwikis' => 'Sidjen mä a miast ferwisangen tu ööder spriaken',
+'mostrevisions' => 'Sidjen mä miast feranrangen',
+'prefixindex' => 'Aal a sidjen (mä prefix)',
+'prefixindex-namespace' => 'Aal a sidjen mä prefix (nöömrüm $1)',
+'shortpages' => 'Kurt sidjen',
+'longpages' => 'Lung sidjen',
+'deadendpages' => 'Sidjen saner ferwisangen',
+'deadendpagestext' => 'Jodiar sidjen ferwise ei üüb ööder sidjen uun {{SITENAME}}.',
+'protectedpages' => 'Seekert sidjen',
+'protectedpages-indef' => 'Bluas permanent seekert sidjen uunwise',
+'protectedpages-cascade' => 'Bluas sidjen mä kaskaaden-seekerhaid',
+'protectedpagestext' => 'Jodiar spezial-sidjen san jin feranrin an fersküüwen seekert.',
+'protectedpagesempty' => 'Uun uugenblak san sok sidjen ei seekert.',
+'protectedtitles' => 'Seekert sidjennöömer',
+'protectedtitlestext' => 'Jodiar sidjennöömer kön ei brükt wurd.',
+'protectedtitlesempty' => 'Uun uugenblak san sok sidjen ei speret.',
+'listusers' => 'Brükerfertiaknis',
+'listusers-editsonly' => 'Wise bluas aktiif brükern',
+'listusers-creationsort' => 'Sortiare efter dootem',
+'usereditcount' => '{{PLURAL:$1|feranrang|$1 feranrangen}}',
 'usercreated' => '{{GENDER:$3|Maaget}} di $1 am a klook $2',
-'newpages' => 'Naie side',
+'newpages' => 'Nei sidjen',
 'newpages-username' => 'Brükernoome:',
+'ancientpages' => 'Al loong ei muar bewerket sidjen',
 'move' => 'Ferschüwe',
 'movethispage' => 'Sid ferschüwe',
+'unusedimagestext' => "Jodiar datein san uun nään artiikel iinbünjen. Det koon oober lacht wees, dat ööder wääbsidjen diarüüb ferwise. Sodenang wurd jo heer apfeerd, uk wan's huarööders brükt wurd.",
+'unusedcategoriestext' => "Jodiar kategorii-sidjen san diar, likes dat's leesag san an uun uugenblak ei brükt wurd.",
+'notargettitle' => 'Nian sidj uunden',
+'notargettext' => 'Dü heest nian sidj uunden, huar det funktjuun werke skal.',
+'nopagetitle' => 'Kwelsidj as ei diar',
+'nopagetext' => 'Det sidj, wat fersköwen wurd skal, as ei diar.',
 'pager-newer-n' => '{{PLURAL:$1|näisten|näiste $1}}',
 'pager-older-n' => '{{PLURAL:$1|åleren|ålere $1}}',
 'suppress' => 'Oversight',
+'querypage-disabled' => 'Detdiar spezial-sidj as ei aktiif, am det süsteem ei tu auerläästin.',
 
 # Book sources
-'booksources' => 'ISBN-säkj',
-'booksources-search-legend' => 'Säk eefter betii-kwäle for böke',
-'booksources-go' => 'Säke',
+'booksources' => 'Schük efter ISBN-numer',
+'booksources-search-legend' => 'Schük efter bukloodens',
+'booksources-go' => 'Widjer',
+'booksources-text' => 'Detdiar list ferwiset üüb wääbsteeden, diar nei an brükt buken ferkuupe. Diar feist dü uk muar tu weden. {{SITENAME}} hää mo jodiar kuuplidj oober niks tu dun.',
+'booksources-invalid-isbn' => 'Detdiar ISBN as woorskiinelk ferkiard. Luke noch ans efter, of det rocht auerdraanj wurden as.',
 
 # Special:Log
 'specialloguserlabel' => 'Brüker:',
-'log' => 'Logböke',
+'speciallogtitlelabel' => 'Mual (sidjennööm of brüker):',
+'log' => 'Logbuken',
+'all-logs-page' => 'Aal a öfentelk logbuken',
+'alllogstext' => 'Diar wuad aal a logbuken faan {{SITENAME}} uunwiset.
+Det woort efter logbukslach, brüker of sidjennööm uunwiset. Grat- an letjskriiwang skel beaachtet wurd.',
+'logempty' => 'Diar as niks uun.',
+'log-title-wildcard' => 'Sidjennööm begant mä ...',
+'showhideselectedlogentries' => 'Wise/fersteeg jodiar logbukiindracher',
 
 # Special:AllPages
-'allpages' => 'Åle side',
+'allpages' => 'Aal a sidjen',
 'alphaindexline' => '$1 bit $2',
 'nextpage' => 'Näist sid ($1)',
 'prevpage' => 'Leest sid ($1)',
-'allpagesfrom' => 'Side wise sunt:',
-'allpagesto' => 'Side wise bit:',
-'allarticles' => 'Åle side',
+'allpagesfrom' => 'Sidjen wise sant:',
+'allpagesto' => 'Sidjen wise bit:',
+'allarticles' => 'Aal a sidjen',
+'allinnamespace' => 'Aal a sidjen (nöömrüm: $1)',
+'allnotinnamespace' => 'Aal a sidjen (saner nöömrüm $1)',
 'allpagesprev' => 'Leest',
 'allpagesnext' => 'Näist',
 'allpagessubmit' => 'Önjwiinje',
+'allpagesprefix' => 'Sidjen uunwise mä prefix:',
+'allpagesbadtitle' => 'Didiar sidjennööm gongt ei. Hi hed ferlicht en spriak-prefix of diar san ei tuläät tiakens uun.',
+'allpages-bad-ns' => 'Di nöömrüm „$1“ komt uun {{SITENAME}} ei föör.',
+'allpages-hide-redirects' => 'Widjerfeerangen fersteeg',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Dü lukest en werjuun uun a cache uun. Det koon al $1 ual wees.',
+'cachedspecial-viewing-cached-ts' => 'Dü lukest en werjuun uun a cache uun. Det as ferlicht ei üüb a leetst stant.',
+'cachedspecial-refresh-now' => 'Neist werjuun uunluke.',
 
 # Special:Categories
 'categories' => 'Kategoriin',
+'categoriespagetext' => '{{PLURAL:$1|Detdiar kategorii häält|Jodiar kategoriin hual}} sidjen of datein.
+[[Special:UnusedCategories|Leesag kategoriin]] wurd heer ei uunwiset.
+Luke uk bi det list faan [[Special:WantedCategories|nuadag kategoriin]].',
+'categoriesfrom' => 'Wise kategoriin mä began üüb:',
+'special-categories-sort-count' => 'Efter taalen sortiaret',
+'special-categories-sort-abc' => "Efter't alfabeet sortiaret",
+
+# Special:DeletedContributions
+'deletedcontributions' => 'Stregen bidracher',
+'deletedcontributions-title' => 'Stregen bidracher',
+'sp-deletedcontributions-contribs' => 'Bidracher',
 
 # Special:LinkSearch
-'linksearch' => "Sjük efter ferwisangen uun't näät",
+'linksearch' => "Schük efter ferwisangen uun't näät",
+'linksearch-pat' => 'Schükmünster:',
 'linksearch-ns' => 'Noomerüm:',
-'linksearch-ok' => 'Säk',
+'linksearch-ok' => 'Schük',
+'linksearch-text' => 'Diar kön wariaabeln üs t.b. "*.bispal.de" brükt wurd. Tumanst ian TLD üs t.b. "*.org" skal uunden wurd.<br />{{PLURAL:$2|Protokol|Protokolen}}: <code>$1</code> (Diar woort http nimen, wan niks ööders uunden as.)',
 'linksearch-line' => '$2 ferwiset üüb $1',
+'linksearch-error' => 'Wariaabeln ("*") mut bluas bi a began faan en URL uunden wurd.',
+
+# Special:ListUsers
+'listusersfrom' => 'Wise brükern mä began üüb:',
+'listusers-submit' => 'Wise',
+'listusers-noresult' => 'Nään brüker fünjen.',
+'listusers-blocked' => '(speret)',
+
+# Special:ActiveUsers
+'activeusers' => 'Aktiif brükern',
+'activeusers-intro' => 'Jodiar brükern wiar {{PLURAL:$1|di leetst dai| a leetst $1 daar}} aktiif.',
+'activeusers-count' => '$1 {{PLURAL:$1|aktjuun|aktjuunen}} uun a {{PLURAL:$3|leetst 24 stünj|leetst $3 daar}}',
+'activeusers-from' => 'Wise brükern mä began üüb:',
+'activeusers-hidebots' => 'Bots fersteeg',
+'activeusers-hidesysops' => 'Administratooren fersteeg',
+'activeusers-noresult' => 'Nään brükern fünjen.',
 
 # Special:ListGroupRights
-'listgrouprights-members' => '(lasmoote-list)',
+'listgrouprights' => 'Brükersköölrochten',
+'listgrouprights-summary' => 'Jodiar brükersköölen an hör rochten san uun detheer Wiki fäästlaanj wurden.
+Muar diartu fanjst dü üüb  [[{{MediaWiki:Listgrouprights-helppage}}|detdiar sidj]].',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">Tugestenen rocht</span>
+* <span class="listgrouprights-revoked">Wechnimen rocht</span>',
+'listgrouprights-group' => 'Skööl',
+'listgrouprights-rights' => 'Rochten',
+'listgrouprights-helppage' => 'Help:Brükersköölrochten',
+'listgrouprights-members' => '(lasmooten)',
+'listgrouprights-addgroup' => 'Brüker tu {{PLURAL:$2|detdiar skööl|jodiar sköölen}} tuwise: $1',
+'listgrouprights-removegroup' => 'Brüker ütj {{PLURAL:$2|detdiar skööl|jodiar sköölen}} ütjnem: $1',
+'listgrouprights-addgroup-all' => 'Brüker tu aal a sköölen tuwise',
+'listgrouprights-removegroup-all' => 'Brüker ütj aal a sköölen wechnem',
+'listgrouprights-addgroup-self' => 'Aanj brükerkonto tu {{PLURAL:$2|detdiar skööl|jodiar sköölen}} tuwise: $1',
+'listgrouprights-removegroup-self' => 'Aanj brükerkonto faan {{PLURAL:$2|detdiar skööl|jodiar sköölen}} wechnem: $1',
+'listgrouprights-addgroup-self-all' => "Koon aal a sköölen tu't aanj brükerkonto tuwise",
+'listgrouprights-removegroup-self-all' => "Koon aal a sköölen faan't aanj brükerkonto wechnem",
 
 # Email user
-'emailuser' => 'E-mail tu dideere brüker',
+'mailnologin' => "Bi't e-mail ferschüüren as wat skiaf gingen",
+'mailnologintext' => 'Dü skel [[Special:UserLogin|uunmeldet wees]] an en gudkäänd e-mail-adres uun din [[Special:Preferences|iinstelangen]] haa, am dat dü ööder brükern en e-mail schüür könst.',
+'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.
+Din 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.',
+'usermailererror' => 'Det e-mail objekt wiset en feeler uun.',
+'defemailsubject' => '{{SITENAME}} e-mail faan brüker „$1“',
+'usermaildisabled' => 'E-mail fun as ei aktiif',
+'usermaildisabledtext' => 'Dü könst nian e-mail tu ööder brükern schüür.',
+'noemailtitle' => 'Nian e-mail adres',
+'noemailtext' => 'Didiar brüker hää nian gudkäänd e-mail adres uunden.',
+'nowikiemailtitle' => 'E-mail koon ei sjüürd wurd',
+'nowikiemailtext' => 'Didiar brüker maad nian e-mails faan ööder brükern fu.',
+'emailnotarget' => 'Didiar brükernööm as ei bekäänd of ei gudkäänd, am ham en e-mail tu schüüren',
+'emailtarget' => 'Brükernööm faan di ööder brüker iindu',
+'emailusername' => 'Brükernööm:',
+'emailusernamesubmit' => 'Widjer',
+'email-legend' => 'E-mail tu en öödern {{SITENAME}}-brüker schüür',
+'emailfrom' => 'Faan:',
+'emailto' => 'Tu:',
+'emailsubject' => 'Teemo:',
+'emailmessage' => 'Mädialang:',
+'emailsend' => 'Schüür',
+'emailccme' => 'Sjüür mi en kopii faan det e-mail',
+'emailccsubject' => 'Kopii faan din mädialang tu $1: $2',
+'emailsent' => 'E-mail as wechschüürd wurden',
+'emailsenttext' => 'Din e-mail as wechsjüürd wurden.',
+'emailuserfooter' => 'Detdiar e-mail as faan di {{SITENAME}}-brüker „$1“ tu „$2“ schüürd wurden.',
+
+# User Messenger
+'usermessage-summary' => 'Süsteemnooracht seekert.',
+'usermessage-editor' => 'Süsteemnoorachten siinst',
 
 # Watchlist
 'watchlist' => "Uun't uug behual",
 'mywatchlist' => "Uun't uug behual",
 'watchlistfor2' => 'Foon $1 $2',
+'nowatchlist' => "Diar as nään iindrach, diar dü uun't uug behual wel.",
+'watchlistanontext' => "Dü skel di $1, am iindracher tu leesen of tu bewerkin, diar dü uun't uug behual wel.",
+'watchnologin' => 'Ei uunmeldet',
+'watchnologintext' => "Dü skel [[Special:UserLogin|uunmeldet]] wees, am iindracher tu bewerkin, diar dü uun't uug behual wel.",
+'addwatch' => "Uk uun't uug behual",
 'addedwatchtext' => "Det sidj „[[:$1]]“ wel dü [[Special:Watchlist|uun't uug behual]].
-Feranerangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
+Feranrangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
+'removewatch' => "Ei muar uun't uug behual",
 'removedwatchtext' => 'Jü sid „[[:$1]]“ wörd foon din [[Special:Watchlist|eefterkiiklist]] wächhååld.',
 'watch' => 'Kiike eefter',
-'watchthispage' => 'Side eefterkiike',
+'watchthispage' => "Detdiar sidj uun't uug behual",
 'unwatch' => 'ai mör eefter kiike',
-'watchlist-details' => 'Dü kiikst eefter {{PLURAL:$1|1 sid|$1 side}}.',
+'unwatchthispage' => "Ei muar uun't uug behual",
+'notanarticle' => 'Nään artiikel',
+'notvisiblerev' => 'Det werjuun faan en öödern brüker as stregen wurden.',
+'watchnochange' => "A sidjen, diar dü uun't uug heest, san uun di uunwiset tidjrüm ei bewerket wurden.",
+'watchlist-details' => "Dü heest {{PLURAL:$1|1 sidj|$1 sidjen}} uun't uug.",
+'wlheader-enotif' => 'Di e-mail siinst as aktiif.',
+'wlheader-showupdated' => "Nei feranert sidjen wurd '''fäät''' uunwiset.",
+'watchmethod-recent' => "Leetst feranrangen faan sidjen, diar dü uun't uug heest",
+'watchmethod-list' => "Sidjen, diar dü uun't uug heest, am a leetst feranrangen beluke",
+'watchlistcontains' => "Dü häälst $1 {{PLURAL:$1|sidj|sidjen}} uun't uug.",
+'iteminvalidname' => 'Mä di iindrach „$1“ stemet wat ei, di nööm as ferkiard.',
+'wlnote' => "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst '''$1''' feranrangen}} faan a leetst {{PLURAL:$2|stünj|'''$2''' stünjen}}. Stant: $3, klook $4.",
 'wlshowlast' => 'Wis da änringe foon da leeste $1 stüne, $2 deege unti $3.',
 'watchlist-options' => 'Wis-opsjoone',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Eefter kiike...',
 'unwatching' => 'Ai eefter kiike...',
+'watcherrortext' => "Bi't anrin faan iinstelangen för „$1“ as wat skiaf gingen.",
+
+'enotif_mailer' => '{{SITENAME}}-e-mail-noorachten siinst',
+'enotif_reset' => 'Aal a sidjen üs besoocht kääntiakne',
+'enotif_impersonal_salutation' => '{{SITENAME}}-brüker',
+'enotif_subject_deleted' => '{{SITENAME}}-sidj $1 as faan {{GENDER:$2|$2}} stregen wurden.',
+'enotif_subject_created' => '{{SITENAME}}-sidj $1 as faan {{GENDER:$2|$2}} nei maaget wurden',
+'enotif_subject_moved' => '{{SITENAME}}-sidj $1 as faan {{GENDER:$2|$2}} fersköwen wurden.',
+'enotif_subject_restored' => '{{SITENAME}}-sidj $1 as faan {{GENDER:$2|$2}} turaghaalet wurden',
+'enotif_subject_changed' => '{{SITENAME}}-sidj $1 as faan {{GENDER:$2|$2}} feranert wurden',
+'enotif_body_intro_deleted' => 'Det {{SITENAME}}-sidj $1 as di $PAGEEDITDATE faan {{GENDER:$2|$2}} stregen wurden. Luke uk bi $3.',
+'enotif_body_intro_created' => 'Det {{SITENAME}}-sidj $1 as di $PAGEEDITDATE faan {{GENDER:$2|$2}} nei maaget wurden. Luke uk bi $3 am en nei werjuun.',
+'enotif_body_intro_moved' => 'Det {{SITENAME}}-sidj $1 as di $PAGEEDITDATE faan {{GENDER:$2|$2}} fersköwen wurden. Luke uk bi $3 am en nei werjuun.',
+'enotif_body_intro_restored' => 'Det {{SITENAME}}-sidj $1 as di $PAGEEDITDATE faan {{GENDER:$2|$2}} turaghaalet wurden. Luke uk bi $3 am en nei werjuun.',
+'enotif_body_intro_changed' => 'Det {{SITENAME}}-sidj $1 as di $PAGEEDITDATE faan {{GENDER:$2|$2}} feranert wurden. Luke uk bi $3 am en nei werjuun.',
+'enotif_lastvisited' => 'Luke bi $1 am aal a feranrangen sant dan leetst beschük.',
+'enotif_lastdiff' => 'Luke bi $1 am det feranrang.',
+'enotif_anon_editor' => 'Anonüüm brüker $1',
+'enotif_body' => 'Gud dai $WATCHINGUSERNAME,
+
+$PAGEINTRO $NEWPAGE
+
+Tuupfaadet faan: $PAGESUMMARY $PAGEMINOREDIT
+
+Kontakt tu di bewerker:
+E-mail: $PAGEEDITOR_EMAIL
+Wiki: $PAGEEDITOR_WIKI
+
+Di wurd iarst ans nian e-mails muar tu detdiar sidj schüürd, bit dü det sidj weder beschükst. Üüb din list faan sidjen, diar dü uun\'t uug behual wel, könst dü a noorachtenkääntiaken weder turagsaat.
+
+Dan frinjelk {{SITENAME}}-noorachten siinst
+
+--
+Am iinstelangen tu e-mail noorachten tu feranrin, gung tu {{canonicalurl:{{#special:Preferences}}}}.
+
+Am iinstelangen am sidjen, diar dü uun\'t uug behual wel, gung tu {{canonicalurl:{{#special:EditWatchlist}}}}.
+
+Am det sidj ei linger uun\'t uug tu behualen, gung tu $UNWATCHURL.
+
+Halep an muar diartu: {{canonicalurl:{{MediaWiki:Helppage}}}}',
+'created' => 'maaget',
+'changed' => 'feranert',
 
 # Delete
 'deletepage' => 'Sid tunintemååge',
+'confirm' => 'Gudkään',
+'excontent' => 'diar sted: „$1“',
+'excontentauthor' => 'diar sted: „$1“ (iansagst bewerker: [[Special:Contributions/$2|$2]])',
+'exbeforeblank' => "diar sted föör't leesag maagin: „$1“",
 'exblank' => 'sidj wiar leesag',
 'delete-confirm' => 'Strik "$1"',
 'delete-legend' => 'Strike',
-'historywarning' => "'''Paase üüb:''' Det sidj, wat dü strik wel, hää amanbi $1 {{PLURAL:$1|wersjuun|wersjuunen}}:",
-'confirmdeletetext' => 'Dü bast deerbai, en sid ma åle tuhiirende ålere färsjoone tuninte tu måågen. Bestääsie hål deertu, dåt dü de foon da konsekwänse bewust bast, än dåt dü önj oueriinjstiming ma da [[{{MediaWiki:Policy-url}}|ruchtliinjen]] hoonelst.',
+'historywarning' => "'''Paase üüb:''' Det sidj, wat dü strik wel, hää amanbi $1 {{PLURAL:$1|werjuun|werjuunen}}:",
+'confirmdeletetext' => 'Dü wel en sidj mä aal sin werjuunen strik. Dü skel gudkään, dat dü witjst, wat dü dääst an dat din dun mä a [[{{MediaWiki:Policy-url}}|brükerreegeln]] auerian stemet.',
 'actioncomplete' => 'Aksjoon beånd',
 'actionfailed' => 'Diar ging wat skiaf',
-'deletedtext' => '„$1“ wörd tunintemååged. In e $2 fanst dü en list foon da tuleest tunintemåågede side.',
+'deletedtext' => "„$1“ as stregen wurden. Uun't $2 fanjst dü a sidjen, diar tuleetst stregen wurden san.",
 'dellogpage' => 'Tunintemååg-Logbök',
 'dellogpagetext' => 'Diar stun a leetst stregen sidjen an datein.',
 'deletionlog' => "logbuk faan't striken",
-'reverted' => 'Tu en ual wersjuun turagsaat',
+'reverted' => 'Üüb en ual werjuun turagsaat',
 'deletecomment' => 'Grün:',
 'deleteotherreason' => 'Ouderen/tubaikaamenden grün:',
 'deletereasonotherlist' => 'Ouderen grün',
@@ -1491,32 +2133,82 @@ Feranerangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
 ** Copyright as ei beaachtet
 ** Wandaalen onerwais",
 'delete-edit-reasonlist' => "Grünjer för't striken bewerke",
-'delete-toobig' => 'Detdiar sidj hää muar üs $1 {{PLURAL:$1|wersjuun|wersjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.',
-'delete-warning-toobig' => "Detdiar sidj hää muar üs $1 {{PLURAL:$1|wersjuun|wersjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
+'delete-toobig' => 'Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.',
+'delete-warning-toobig' => "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
 
 # Rollback
+'rollback' => 'Feranrangen turagsaat',
+'rollback_short' => 'Turagsaat',
 'rollbacklink' => 'tubäägseete',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|feranrang|feranrangen}} turagsaat',
+'rollbacklinkcount-morethan' => 'Muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} turagsaat',
+'rollbackfailed' => "Bi't turagsaaten as wat skiaf gingen.",
+'cantrollback' => 'Det feranrang koon ei turagsaat wurd, diar san nian ööder skriiwern weesen.',
+'alreadyrolled' => 'A anrangen faan [[User:$2|$2]] ([[User talk:$2|Diskusjuun]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) bi [[:$1]] kön ei turagsaat wurd. Diar hää uuntesken en öödern brüker det sidj feranert.
+
+Det leetst feranrang as faan [[User:$3|$3]] ([[User talk:$3|Diskusjuun]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+'editcomment' => "Tuupfaadet feranrang: ''„$1“''.",
+'revertpage' => 'Feranrangen faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjuun]]) san üüb di leetst stant faan [[User:$1|$1]] turagsaat wurden.',
+'revertpage-nouser' => 'Feranrangen faan (brükernööm wechnimen) turagsaat an leetst werjuun faan [[User:$1|$1]] weder iinsteld.',
+'rollback-success' => 'Feranrangen faan $1 turagsaat an det leetst werjuun faan $2 weder iinsteld.',
+
+# Edit tokens
+'sessionfailure-title' => 'session feeler',
+'sessionfailure' => "Diar as wat skiaf gingen bi't auerdreegen faan din brükerdooten.
+Am dat diar ei noch muar skiaf gongt, as det aktjuun ufbreegen wurden.
+Gung turag, an began faan föören.",
 
 # Protect
-'protectlogpage' => 'Sideschütse-logbök',
+'protectlogpage' => 'Sidjenseekerangs-logbuk',
+'protectlogtext' => 'Detheer as det logbuk mä seekert sidjen.
+Üüb [[Special:ProtectedPages|detdiar list]] stun a seekert sidjen.',
 'protectedarticle' => 'schütsed „[[$1]]“',
 'modifiedarticleprotection' => 'änred e schüts for "[[$1]]"',
+'unprotectedarticle' => 'Seekerang faan „[[$1]]“ apheewen',
+'movedarticleprotection' => 'hää det seekerang faan „[[$2]]“ üüb „[[$1]]“ auerdraanj',
+'protect-title' => 'Seekerang feranre för „$1“',
+'protect-title-notallowed' => 'Seekerang uunluke för „$1“',
 'prot_1movedto2' => 'hää „[[$1]]“ efter „[[$2]]“ fersköwen',
+'protect-badnamespace-title' => 'Nöömrüm koon ei seekert wurd',
+'protect-badnamespace-text' => 'Sidjen uun didiar nöömrüm kön ei seekert wurd.',
+'protect-norestrictiontypes-text' => 'Detdiar sidj koon ei seekert wurd, auer diar nian mögelkhaiden san.',
+'protect-norestrictiontypes-title' => 'Sidj koon ei seekert wurd',
+'protect-legend' => 'Sidjenseekerang feranre',
 'protectcomment' => 'Grün:',
 'protectexpiry' => 'Spärduur:',
 'protect_expiry_invalid' => 'Jü önjjääwen duur as üngülti.',
 'protect_expiry_old' => 'Jü spärtid lait in jü jütid.',
+'protect-unchain-permissions' => 'Separaat speren aktiwiare',
 'protect-text' => 'Heer koost dü e schütsstatus for jü sid "$1" önjkiike än änre.',
-'protect-locked-access' => "Din brükerkonto ferfäiget ai ouer da nüsie ruchte tu jü änring foon e sideschüts. Heer san da aktuäle sideschütsönjstalinge fon jü sid '''„$1“:'''",
-'protect-cascadeon' => 'Jüdeer sid as nütutids diilj foon e kaskaadenspäre. Jü as önj {{PLURAL:$1|jü füliende sid|da füliende side}} önjbünen, huk döör jü kaskaadenspäropsjoon schütsed {{PLURAL:$1|as|san}}. Di sideschütsstatus koon for jüdeer sid änred wårde, dåtdeer heet ouers nån influs aw jü kaskaadenspäre:',
-'protect-default' => 'Åle brükere',
-'protect-fallback' => 'Jü "$1"-beruchtiging as nüsi.',
-'protect-level-autoconfirmed' => 'Späring for naie än ai registriirde brükere',
-'protect-level-sysop' => 'Bloot administratoore',
+'protect-locked-blocked' => "Dü könst det sidjenseekerang ei feranre, auer din brükerkonto speret as. So as det sidj '''„$1“:''' seekert wurden.",
+'protect-locked-dblock' => "Det dootenbeenk as speret, det sidjenseekerang koon ei feranert wurd. So as det sidj '''„$1“:''' seekert wurden.",
+'protect-locked-access' => "Dü heest ei det brükerrocht, am det sidjenseekerhaid tu feranrin.
+Det sidj '''„$1“:''' as sodenang seekert wurden:",
+'protect-cascadeon' => 'Detdiar sidj as auer en kaskaadensper seekert wurden. Hat as uun {{PLURAL:$1|detdiar seekert sidj|jodiar seekert sidjen}} iinbünjen.
+Dü könst det seekerhaid feranre, det feranert oober ei det seekerhaid faan jo ööder sidjen.',
+'protect-default' => 'Arke brüker',
+'protect-fallback' => 'Ferloof bluas för brükern mä "$1"-rochten.',
+'protect-level-autoconfirmed' => 'Ferloof bluas för registriaret brükern.',
+'protect-level-sysop' => 'Ferloof bluas för administratooren.',
 'protect-summary-cascade' => 'kaskadiirend',
 'protect-expiring' => 'bit $2, am e klook $3 (UTC)',
+'protect-expiring-local' => 'bit $1',
+'protect-expiry-indefinite' => 'saner aanj',
 'protect-cascade' => 'Kaskadiirende späre - åle önj jüdeer sid önjbünene forlååge wårde uk spärd.',
 'protect-cantedit' => 'Dü koost jü späre foon jüheer sid ai änre, deer dü niinj beruchtiging tu beårben foon jü sid hääst.',
+'protect-othertime' => 'Ööder sperdüür:',
+'protect-othertime-op' => 'ööder sperdüür',
+'protect-existing-expiry' => 'Sidjenseekerang lääpt uf: $2, klook $3',
+'protect-otherreason' => 'Ööder/noch en grünj:',
+'protect-otherreason-op' => 'Ööder grünj:',
+'protect-dropdown' => '* Miast brükt grünjer
+** Edit-War
+** Wandaalen onerwais
+** Tuföl rekloome
+** Flooksis brükt föörlaag
+** Sidj mä föl beschük',
+'protect-edit-reasonlist' => "Grünjer för't seekrin bewerke",
+'protect-expiry-options' => '1 stünj:1 hour,1 dai:1 day,1 weg:1 week,2 wegen:2 weeks,1 muun:1 month,3 muuner:3 months,6 muuner:6 months,1 juar:1 year,saner aanj:infinite',
 'restriction-type' => 'Schütsstatus',
 'restriction-level' => 'Schütshöögde',
 'minimum-size' => 'Minimaal grate:',
@@ -1537,82 +2229,95 @@ Feranerangen faan detdiar sidj wurd üüb detdiar list fäästhäälen.",
 # Undelete
 'undelete' => 'Stregen sidjen uunwise',
 'undeletepage' => 'Stregen sidjen uunwise an weder iinstel',
-'undeletepagetitle' => "'''Detdiar wiset a stregen wersjuunen faan [[:$1|$1]]'''.",
+'undeletepagetitle' => "'''Detdiar wiset a stregen werjuunen faan [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Stregen sidjen uunwise',
 '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 wersjuunen weder iintustelen, sjük nian enkelt wersjuun ütj, du en grünj uun an trak do üüb „{{int:undeletebtn}}“.*
-* Am en was wersjuun weder iintustelen, sjük det wersjuun ütj, du en grünj uun an trak do üüb „{{int:undeletebtn}}“.',
-'undeleterevisions' => '{{PLURAL:$1|1 wersjuun|$1 wersjuunen}} archiwiaret',
-'undeletehistory' => 'Wan dü detdiar sidj weder iinstelst, wurd uk jo ual wersjuunen weder iinsteld. 
-Wan sant det striken en nei sidj mä di salew nööm iinsteld wurden as, wurd jo ual wersjuunen bi det nei sidj mä iinwerket.',
-'undeleterevdel' => 'Det weder iinstelen woort ei maaget, wan det leetst wersjuun ferstäächt as.
-Wan det so as, skal det leetst wersjuun iarst weder üüb normool steld wurd.',
+'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}}“.*
+* 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',
+'undeletehistory' => 'Wan dü detdiar sidj weder iinstelst, wurd uk jo ual werjuunen weder iinsteld. 
+Wan 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.
+Wan det so as, skal det leetst werjuun iarst weder üüb normool steld wurd.',
 'undeletehistorynoadmin' => 'Detdiar sidj as stregen wurden.
 Oner könst dü sä, hoker det maaget hää an huaram.
 Di tekst faan det stregen sidj fu bluas administratooren uunwiset.',
-'undelete-revision' => 'Stregen wersjuun faan $1 (di $4 am a klook $5 ), $3:',
-'undeleterevision-missing' => 'Mä detdiar wersjuun stemet wat ei. Ferlicht as di link ferkiard of det wersjuun as ei muar diar.',
-'undelete-nodiff' => 'Nian föörgunger wersjuun diar.',
+'undelete-revision' => 'Stregen werjuun faan $1 (di $4 am a klook $5 ), $3:',
+'undeleterevision-missing' => 'Mä detdiar werjuun stemet wat ei. Ferlicht as di link ferkiard of det werjuun as ei muar diar.',
+'undelete-nodiff' => 'Nian föörgunger-werjuun diar.',
 'undeletebtn' => 'Weder iinstel',
 'undeletelink' => 'wise/widermååge',
 'undeleteviewlink' => 'Uunluke',
 'undeletereset' => 'Turag saat',
 'undeleteinvert' => 'Ütjwool amdrei',
 'undeletecomment' => 'Grünj:',
-'undeletedrevisions' => '{{PLURAL:$1|1 wersjuun|$1 wersjuunen}} weder iinsteld',
-'undeletedrevisions-files' => '{{PLURAL:$1|1 wersjuun|$1 wersjuunen}} an {{PLURAL:$2|1 datei|$2 datein}} weder iinsteld',
+'undeletedrevisions' => '{{PLURAL:$1|1 werjuun|$1 werjuunen}} weder iinsteld',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 werjuun|$1 werjuunen}} an {{PLURAL:$2|1 datei|$2 datein}} weder iinsteld',
 'undeletedfiles' => '{{PLURAL:$1|1 datei|$1 datein }} weder iinsteld',
 'cannotundelete' => 'Weder iinstelen hää ei loket:
 $1',
 'undeletedpage' => "'''„$1“''' as weder iinsteld wurden.
 Uun't [[Special:Log/delete|logbuk faan stregen sidjen]] stun a stregen an weder iinsteld sidjen.",
 'undelete-header' => "Luke uun't [[Special:Log/delete|logbuk för stregen sidjen]] efter stregen sidjen faan a leetst tidj.",
-'undelete-search-title' => 'Sjük stregen sidjen',
-'undelete-search-box' => 'Sjük stregen sidjen',
-'undelete-search-prefix' => 'Sjük sidjen, diar began mä:',
-'undelete-search-submit' => 'Sjük',
+'undelete-search-title' => 'Schük stregen sidjen',
+'undelete-search-box' => 'Schük stregen sidjen',
+'undelete-search-prefix' => 'Schük sidjen, diar began mä:',
+'undelete-search-submit' => 'Schük',
 'undelete-no-results' => "Uun't archiif wiar nian paasen sidjen.",
-'undelete-filename-mismatch' => 'Det wersjuun faan $1 koon ei weder iinsteld wurd. Di dateinööm paaset ei.',
+'undelete-filename-mismatch' => 'Det werjuun faan $1 koon ei weder iinsteld wurd. Di dateinööm paaset ei.',
 'undelete-bad-store-key' => "Det dateiwersjuun faan $1 koon ei weder iinsteld wurd. Det datei wiar al föör't striken ei muar diar.",
+'undelete-cleanup-error' => 'Det ei brükt archiif-werjuun $1 küd ei stregen wurd.',
+'undelete-missing-filearchive' => "Det datei mä det archiif-ID $1 koon ei weder iinsteld wurd, auer hat ei uun't dootenbeenk as. Ferlicht as't al ans weder iinsteld wurden?",
 'undelete-error' => "Bi't weder iinstelen faan det sidj as wat skiaf gingen.",
 'undelete-error-short' => "Bi't weder iinstelen faan det datei $1 as wat skiaf gingen.",
 'undelete-error-long' => "Bi't weder iinstelen faan en datei as wat skiaf gingen:
 
 $1",
-'undelete-show-file-confirm' => 'Wel dü würelk det stregen wersjuun faan det datei „<nowiki>$1</nowiki>“ faan di $2, am a klook $3 uunluke?',
+'undelete-show-file-confirm' => 'Wel dü würelk det stregen werjuun faan det datei „<nowiki>$1</nowiki>“ faan di $2, am a klook $3 uunluke?',
 'undelete-show-file-submit' => 'Ja',
 
 # Namespace form on various pages
 'namespace' => 'Noomerüm:',
 'invert' => 'Ütwool amkiire',
-'blanknamespace' => '(Side)',
+'tooltip-invert' => 'Saat diar en tiaken, am feranrangen faan sidjen uun didiar nöömrüm ei uuntuwisin.',
+'namespace_association' => 'Ferbünjen nöömrüm',
+'tooltip-namespace_association' => 'Saat diar en tiaken, am di ferbünjen nöömrüm of diskusjuunsnöömrüm mä iintubetjin.',
+'blanknamespace' => '(Sidjen)',
 
 # Contributions
 'contributions' => '{{GENDER:$1|Brüker}} bidracher',
 'contributions-title' => 'Brükertujeefte foon "$1"',
 'mycontris' => 'Bidracher',
 'contribsub2' => 'For $1 ($2)',
+'nocontribs' => 'Diar wiar nian paasin brükerbidracher',
 'uctop' => '(aktuäl)',
 'month' => 'än moune:',
 'year' => 'bit iir:',
 
-'sp-contributions-newbies' => 'Wis bloot tujeefte foon naie brükere',
+'sp-contributions-newbies' => 'Wise bluas bidracher faan nei brükern',
+'sp-contributions-newbies-sub' => 'Faan nei brükern',
+'sp-contributions-newbies-title' => 'Brükerbidracher faan nei brükern',
 'sp-contributions-blocklog' => 'Spär-logbök',
+'sp-contributions-deleted' => 'Stregen bidracher',
 'sp-contributions-uploads' => 'Huuchsjüürd bilen',
 'sp-contributions-logs' => 'logbuken',
 'sp-contributions-talk' => 'diskusjuun',
-'sp-contributions-search' => 'Säkj eefter brükertujeefte',
+'sp-contributions-userrights' => 'Brükerrochten',
+'sp-contributions-blocked-notice' => "Didiar brüker as speret. Det stäänt uun't sperlogbuk:",
+'sp-contributions-blocked-notice-anon' => "Detdiar IP-adres as speret. Det stäänt uun't sperlogbuk:",
+'sp-contributions-search' => 'Schük efter brükerbidracher',
 'sp-contributions-username' => 'IP-adräs unti brükernoome',
-'sp-contributions-toponly' => 'Bluas aktuel wersjuunen wise',
+'sp-contributions-toponly' => 'Bluas aktuel werjuunen wise',
 'sp-contributions-submit' => 'Säike',
 
 # What links here
-'whatlinkshere' => 'Links aw jüdeer sid',
-'whatlinkshere-title' => 'Side, da aw "$1" ferlinke',
+'whatlinkshere' => 'Ferwisangen üüb detdiar sidj',
+'whatlinkshere-title' => 'Sidjen, diar üüb "$1" ferwise',
 'whatlinkshere-page' => 'sid:',
-'linkshere' => "Da füliende side ferlinke aw '''„[[:$1]]“''':",
+'linkshere' => "Jodiar sidjen ferwise üüb '''„[[:$1]]“''':",
 'nolinkshere' => 'Nian sidj ferwiset üüb [[:$1]]',
+'nolinkshere-ns' => "Nian sidj ferwiset üüb '''„[[:$1]]“''' uun di ütjsoocht nöömrüm.",
 'isredirect' => 'widerliidjingssid',
 'istemplate' => 'forlåågeninbining',
 'isimage' => 'Dåtäilink',
@@ -1622,59 +2327,178 @@ $1",
 'whatlinkshere-hideredirs' => 'Widerliidjinge $1',
 'whatlinkshere-hidetrans' => 'Forlåågenönjbininge $1',
 'whatlinkshere-hidelinks' => 'Links $1',
-'whatlinkshere-hideimages' => 'Ferwisangen tu dateien $1',
+'whatlinkshere-hideimages' => 'Ferwisangen tu datein $1',
 'whatlinkshere-filters' => 'Filtere',
 
 # Block/unblock
-'blockip' => 'IP-adräs/brüker späre',
+'autoblockid' => 'Automaatisk sper #$1',
+'block' => 'Brüker spere',
+'unblock' => 'Brüker ei muar spere',
+'blockip' => 'IP-adres/brüker spere',
+'blockip-title' => 'Brüker spere',
+'blockip-legend' => 'IP-adres/brüker spere',
+'blockiptext' => 'Mä detdiar formulaar sperest dü en IP-adres of en brükernööm, so dat faan diar nian feranrangen muar maaget wurd kön. 
+Det skul bluas föörnimen wurd, am jin wandaalen föörtugungen an uun auerianstemang mä a [[{{MediaWiki:Policy-url}}|brükerreegeln]].
+Skriiw en guden grünj för det sper ap.',
+'ipadressorusername' => 'IP-adres of brükernööm:',
+'ipbexpiry' => 'Sperdüür:',
+'ipbreason' => 'Grünj:',
+'ipbreasonotherlist' => 'Ööder grünj',
+'ipbreason-dropdown' => '* Mist brükt spergrünjer
+** Skraft wat ferkiards
+** Maaget sidjen leesag
+** Maaget tuföl ferwisangen üüb frääm sidjen
+** Maaget dom tschüch
+** Koon ham ei skake
+** Masbrükt brükerkontos
+** Hää en brükernööm, diar ei tuläät as',
+'ipb-hardblock' => 'Ferhanre, dat en uunmeldeten brüker mä detdiar IP-adres sidjen feranre koon.',
+'ipbcreateaccount' => 'Ferhanre, dat en brükerkonto iinracht woort.',
+'ipbemailban' => 'Ferhanre, dat e-mails ferschüürd wurd',
+'ipbenableautoblock' => 'Spere det IP-adres faan di brüker, an automaatisk uk aal a öödern, huar di brüker mä werket.',
+'ipbsubmit' => 'IP-adres/brüker spere',
+'ipbother' => 'Ööder sperdüür (ingelsk):',
 'ipboptions' => '2 stüne:2 hours,1 däi:1 day,3 deege:3 days,1 wääg:1 week,2 wääge:2 weeks,1 moune:1 month,3 moune:3 months,6 moune:6 months,1 iir:1 year,suner iinje:infinite',
+'ipbotheroption' => 'Ööder sperdüür',
+'ipbotherreason' => 'Ööder/noch en grünj:',
+'ipbhidename' => 'Brükernööm uun bewerkangen an listen fersteeg',
+'ipbwatchuser' => "Hual di brüker sin brüker- an diskusjuunssidj uun't uug",
+'ipb-disableusertalk' => 'Ferhanre, dat di brüker sin diskusjuunssidj bewerket, so loong hi speret as.',
+'ipb-change-block' => 'Mä jodiar iinstelangen widjer spere',
+'ipb-confirm' => 'Sper gudkään',
+'badipaddress' => 'Det IP-adres as ferkiard.',
+'blockipsuccesssub' => 'Det sper hää loket.',
+'blockipsuccesstext' => "Di brüker/det IP-adres [[Special:Contributions/$1|$1]] as speret wurden.<br />
+Am det aptuheewen, gung tu't [[Special:BlockList|sperlist]].",
+'ipb-blockingself' => 'Wel dü würelk di salew spere?',
+'ipb-confirmhideuser' => 'Dü beest diarbi, en brüker uun det muude „brüker fersteeg“ tu sperin. Do woort di brükernööm uun aal a logbuken an listen ferbürgen. Wel dü det würelk du?',
+'ipb-edit-dropdown' => "Grünjer för't sperin bewerke",
+'ipb-unblock-addr' => '„$1“ ei muar spere',
+'ipb-unblock' => 'IP-adres/brüker ei muar spere',
+'ipb-blocklist' => 'Speren uunwise',
+'ipb-blocklist-contribs' => 'Bidracher faan „$1“',
+'unblockip' => 'Brüker ei muar spere',
+'unblockiptext' => 'Mä detdiar formulaar könst dü det sper faan en IP-adres of en brüker apheew.',
+'ipusubmit' => 'Ei muar spere',
+'unblocked' => '[[User:$1|$1]] woort ei muar speret.',
+'unblocked-range' => 'Sper för $1 as apheewen wurden.',
 'unblocked-id' => 'Sperang $1 as apheewen',
 'blocklist' => 'Spärd brükere',
 'ipblocklist' => 'Spärd brükere',
 'ipblocklist-legend' => 'Spärd brükere fine',
+'blocklist-userblocks' => 'Brükersperen ei uunwise',
+'blocklist-tempblocks' => 'Tidjwiis speren ei uunwise',
+'blocklist-addressblocks' => 'Speren faan enkelt IP-adresen ei uunwise',
+'blocklist-rangeblocks' => 'Widjloftag speren ei uunwise',
+'blocklist-timestamp' => 'Tidjstempel',
+'blocklist-target' => 'IP of brüker',
+'blocklist-expiry' => 'Sperdüür bit',
+'blocklist-by' => 'Speret faan',
+'blocklist-params' => 'Speriinstelangen',
+'blocklist-reason' => 'Grünj',
+'ipblocklist-submit' => 'Schük',
+'ipblocklist-localblock' => 'Lokaal sper',
+'ipblocklist-otherblocks' => 'Ööder {{PLURAL:$1|sper|speren}}',
+'infiniteblock' => 'saner aanj',
 'expiringblock' => 'iinjet aw e $1 am e klook $2',
-'blocklink' => 'späre',
+'anononlyblock' => 'bluas anonüümen',
+'noautoblockblock' => 'autoblock ei aktiif',
+'createaccountblock' => 'brükerkontos kön ei iinracht wurd.',
+'emailblock' => 'e-mail fersjüüren ufsteld',
+'blocklist-nousertalk' => 'koon sin aanj diskusjuunssidj ei bewerke',
+'ipblocklist-empty' => 'Det sperlist as leesag',
+'ipblocklist-no-results' => 'Detdiar IP-adres/di brükernööm as ei speret.',
+'blocklink' => 'Spere',
 'unblocklink' => 'frijeewe',
 'change-blocklink' => 'Späring änre',
-'contribslink' => 'tujeefte',
+'contribslink' => 'bidracher',
 'emaillink' => 'e-mail schake',
 'autoblocker' => 'Automatische spär, deer dü en gemiinsoom IP-adräs ma [[User:$1|brüker:$1]] brükst. Grün foon brükerspär: „$2“.',
 'blocklogpage' => 'Brükerspär-logbök',
+'blocklog-showlog' => "Didiar brüker as al ans speret wurden.
+Uun't sperlogbuk stäänt:",
+'blocklog-showsuppresslog' => "Didiar brüker as al ans speret an ferbürgen wurden.
+Uun't logbuk stäänt:",
 'blocklogentry' => 'spärd „[[$1]]“ for di tidrüm: $2 $3',
 'reblock-logentry' => 'änerd jü spär for „[[$1]]“ for di tidrüm: $2 $3',
 'blocklogtext' => "Detdiar as det logbuk auer sperangen an apheewen sperangen faan brükernöömer an IP-adresen.
 Automaatisk sperd IP-adresen wurd ei uunwiset.
 Luke bi't [[Special:BlockList|sperlist]] för aal jo aktuel speren.",
-'unblocklogentry' => 'heet jü späre foon „$1“ aphääwen',
+'unblocklogentry' => 'hää det sper faan „$1“ apheewen',
 'block-log-flags-anononly' => 'bloot anonyme',
 'block-log-flags-nocreate' => 'Måågen foon brükerkonte spärd',
 'block-log-flags-noautoblock' => 'autoblock deaktiviird',
 'block-log-flags-noemail' => 'e-mail-fersiinjing spärd',
-'block-log-flags-nousertalk' => 'mötj äine diskusjoonssid ai beårbe',
+'block-log-flags-nousertalk' => 'koon sin aanj diskusjuunssidj ei bewerke',
 'block-log-flags-angry-autoblock' => 'ütbrååt autoblock aktiviird',
 'block-log-flags-hiddenname' => 'brükernoome ferstäägen',
 'range_block_disabled' => 'Jü möölikhäid, hiilj adräsrüme tu spären, as ai aktiviird.',
 'ipb_expiry_invalid' => 'Jü önjjääwen duur as üngülti.',
 'ipb_expiry_temp' => 'Ferstäägen brükernoome-späre schan pärmanänt weese.',
 'ipb_hide_invalid' => 'Ditheer konto koon ai unerdrükd wårde, deer dåt tufoole beårbinge apwist.',
+'ipb_already_blocked' => '„$1“ as al speret',
+'ipb-needreblock' => '$1 as al speret. Wel dü a speriinstelangen feranre?',
+'ipb-otherblocks-header' => 'Ööder {{PLURAL:$1|sper|speren}}',
+'unblock-hideuser' => 'Det sper faan didiar brüker koon ei apheewen wurd, auer san brükernööm ferbürgen wurden as.',
+'ipb_cant_unblock' => 'Feeler: Sper-ID $1 küd ei fünjen wurd. Det sper as al apheewen.',
+'ipb_blocked_as_range' => 'Feeler: Det IP-adres $1 as auer det widjloftag sper $2 speret. Det sper faan $1 alian koon ei apheewen wurd.',
+'ip_range_invalid' => 'Ferkiard IP-adresrüm',
+'ip_range_toolarge' => 'Adresrümen mut ei grater üs /$1 wees.',
+'blockme' => 'Spere mi',
+'proxyblocker' => 'Proxy blocker',
+'proxyblocker-disabled' => 'Detdiar funktjuun as ei aktiif',
+'proxyblockreason' => 'Din IP-adres as speret wurden, auer det tu en eebenen proxy hiart.
+Fertel det dan ISP of dan süsteemsiinst. Eeben proxys stel det seekerhaid uun fraag.',
+'proxyblocksuccess' => 'Klaar.',
+'sorbsreason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd.',
+'sorbs_create_account_reason' => 'Din IP-adres as uun det DNSBL faan {{SITENAME}} üs eeben proxy apfeerd. Dü könst nian brükerkonto maage.',
+'xffblockreason' => 'En IP-adres uun di X-Forwarded-For-Header as speret wurden, det as din aanj of det faan dan proxy server. Di spergrünj as: $1',
+'cant-block-while-blocked' => 'Dü könst nian ööder brükern spere, so loong dü salew speret beest.',
+'cant-see-hidden-user' => 'Di brüker, diar dü spere wel, as al speret an ferbürgen. Dü heest oober ei det "hideuser"-rocht an könst det sper ei bewerke.',
+'ipbblocked' => 'Dü könst ööder brükern ei spere an uk nian speren apheew, auer dü salew speret beest.',
+'ipbnounblockself' => 'Dü könst din aanj sper ei apheew.',
+
+# Developer tools
+'lockdb' => 'Dootenbeenk spere',
+'unlockdb' => 'Dootenbeenk ei muar spere',
+'lockdbtext' => 'Wan det dootenbeenk speret as, koon rian goor niks muar maaget wurd. Wees so gud an kään det sper gud.',
+'unlockdbtext' => 'Wan det sper faan det dootenbeenk apheewen woort, koon weder ales bewerket wurd. Wees so gud an kään det apheewen gud.',
+'lockconfirm' => 'Ja, ik wal det dootenbeenk würelk spere.',
+'unlockconfirm' => 'Ja, det dootenbeenk skal ei muar speret wees.',
+'lockbtn' => 'Dootenbeenk spere',
+'unlockbtn' => 'Dootenbeenk ei muar spere',
+'locknoconfirm' => 'Dü heest det ei gudkäänd.',
+'lockdbsuccesssub' => 'Det dootenbeenk as nü speret.',
+'unlockdbsuccesssub' => 'Det dootenbeenk as nü ei muar speret.',
+'lockdbsuccesstext' => 'Det {{SITENAME}}-dootenbeenk as speret wurden.<br />Heew det sper [[Special:UnlockDB|weder ap]], wan dü mä din werk klaar beest.',
+'unlockdbsuccesstext' => 'Det {{SITENAME}}-dootenbeenk as ei muar speret.',
+'lockfilenotwritable' => 'Uun det dootenbeenk-sperdatei koon ei skrewen wurd. Am en dootenbeenk tu sperin of en sper aptuheewen, skal det sperdatei för di webserver tu beskriiwen wees.',
+'databasenotlocked' => 'Det dootenbeenk as ei speret.',
+'lockedbyandtime' => '(faan $1 di $2 am a klook $3)',
 
 # Move page
 'move-page' => 'Ferschüw $1',
 'move-page-legend' => 'Sid ferschüwe',
-'movepagetext' => "Ma dideere formulaar koost de en sid ambenååme (masamt åle färsjoone).
-Di üülje tiitel wårt tu di naie widerliidje.
-Dü koost widerliidjinge, da ap e originooltiitel ferlinke, automatisch korrigiire lätje.
-For di fål dåt dü dåt ai dääst, präiw aw [[Special:DoubleRedirects|dööwelte]] unti [[Special:BrokenRedirects|önjstööge widerliidjinge]].
-Dü bast deerfor feroontuurdlik, dåt links fortönj ap dåt koräkt muul wise.
-
-Jü sid wårt '''ai''' ferschääwen, wan dåt ål en sid ma di seelew noome jeeft,
-süwid jüdeer ai lääsi unti en widerliidjing suner färsjoonshistoori as. Dåtdeer bedjüset,
-dåt dü jü sid tubääg ferschüwe koost, wan dü en fäägel mååged heest. Dü koost
-deeriinj niinj sid ouerschriwe.
-
-'''Woorschouing!'''
-Jü ferschüwing koon widlingende än ünfermousene fülie for beliifte side heewe.
-Dü schöist deerfor da konsekwänse ferstönjen heewe, iir dü baiblafst.",
+'movepagetext' => "Mä detdiar formulaar könst dü en sidj mä aal sin werjuunen amnääm.
+Di ual tiitel woort üüb di nei widjerfeerd.
+Dü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjer feer läät.
+Wan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.
+Bluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.
+
+Det 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.
+
+'''Paase üüb!'''
+Det 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.
+Di ual tiitel woort üüb di nei widjerfeerd.
+Dü könst widjerfeerangen, diar üüb di ual tiitel wise, automaatisk üüb di nei tiitel widjer feer läät.
+Wan dü det oober ei dääst, paase üüb, dat dü aal a [[Special:DoubleRedirects|dobelt]] of [[Special:BrokenRedirects|breegen]] widjerfeerangen noch ans efterlukest.
+Bluas dü könst diarför surge, dat ferwisangen widjerhen rocht werke.
+
+Det 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.
+
+'''Paase üüb!'''
+Det fersküüwen hää widjloftag fulgen för ööder sidjen. Dü skulst begreben haa, wat dü diar maage wel.",
 'movepagetalktext' => "Jü deertu hiirende diskusjoonssid wård, süwid deer, maferschääwen, '''unti dåt moost weese:'''
 *Deer bestoont ål en diskusjoonssid ma dideere noome, unti
 *dü wäälst jü uner stönjene opsjoon ouf.
@@ -1683,112 +2507,422 @@ Dü schöist deerfor da konsekwänse ferstönjen heewe, iir dü baiblafst.",
 
 Hål di '''naie''' tiitel uner '''muul''' önjdreege, deeruner jü ambenååming hål '''begrüne.'''",
 'movearticle' => 'Sid ferschüwe:',
+'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.",
+'movenologin' => 'Ei uunmeldet',
+'movenologintext' => 'Dü skel registriaret an [[Special:UserLogin|uunmeldet]] wees, am en sidj tu fersküüwen.',
+'movenotallowed' => 'Dü mutst nian sidjen fersküüw.',
+'movenotallowedfile' => 'Dü mutst nian datein fersküüw.',
+'cant-move-user-page' => 'Dü mutst nian brükersidjen fersküüw (bluas onersidjen).',
+'cant-move-to-user-page' => 'Dü mutst nian sidjen üüb en brükersidj fersküüw (bluas üüb onersidjen).',
 'newtitle' => 'Müülj:',
 'move-watch' => 'Lök eefter jüdeer sid',
 'movepagebtn' => 'Sid ferschüwe',
 'pagemovedsub' => 'Ferschüwing luket',
 'movepage-moved' => "'''Jü sid „$1“ wörd eefter „$2“ ferschääwen.'''",
+'movepage-moved-redirect' => 'En widjerfeerang as iinracht wurden.',
+'movepage-moved-noredirect' => 'Det maagin faan en widjerfeerang as ferhanert wurden.',
 'articleexists' => 'Uner dideere noome bestoont ål en sid. Wääl hål en nai noome.',
+'cantmove-titleprotected' => 'Dü könst det sidj ei so fersküüw, auer di nei nööm speret as.',
 'talkexists' => 'Jü sid seelew wörd erfolchrik ferschääwen, ouers jü deertu hiirende diskusjoonssid ai, deer ål iinj ma di nai tiitel bestoont. Glik hål da önjhålte foon hönj ouf.',
 'movedto' => 'ferschääwen eefter',
-'movetalk' => 'Jü diskusjoonssid maferschüwe, wan möölik',
+'movetalk' => "Uk det diskusjuunssidj fersküüw, wan't gongt",
+'move-subpages' => 'Onersidjen fersküüw (bit $1)',
+'move-talk-subpages' => "Onersidjen faan't diskusjuunssidj fersküüw (bit $1)",
+'movepage-page-exists' => 'Det sidj „$1“ as al diar an koon ei automaatisk auerskrewen wurd.',
 'movepage-page-moved' => 'Det sidj $1 as efter $2 fersköwen wurden.',
 'movepage-page-unmoved' => 'Det sidj $1 küd ei efter $2 fersköwen wurd.',
 'movepage-max-pages' => 'Diar kön ei muar üs {{PLURAL:$1|sidj|sidjen}} fersköwen wurd. Muar sidjen kön ei automaatisk fersköwen wurd.',
 'movelogpage' => 'Ferschüwingslogbök',
+'movelogpagetext' => 'Det as en list mä fersköwen sidjen.',
+'movesubpage' => '{{PLURAL:$1|onersidj|onersidjen}}',
+'movesubpagetext' => 'Det sidj hää {{PLURAL:$1|detdiar $1 onersidj|jodiar $1 onersidjen}}.',
+'movenosubpage' => 'Det sidj hää nian onersidjen.',
 'movereason' => 'Begrüning:',
 'revertmove' => 'tubääg ferschüwe',
+'delete_and_move' => 'Strik an fersküüw',
+'delete_and_move_text' => '== Striken nuadag  ==
+
+Det sidj „[[:$1]]“ as al diar. Wel dü det strik, am det sidj tu fersküüwen?',
+'delete_and_move_confirm' => 'Ja, sidj strik',
+'delete_and_move_reason' => 'Stregen, am steeds för det fersküüwen faan „[[$1]]“ tu maagin.',
+'selfmove' => 'A nöömer san likedenang. Dü könst nian sidj üüb ham salew fersküüw.',
+'immobile-source-namespace' => 'Sidjen uun di nöömrüm "$1" kön ei fersköwen wurd.',
+'immobile-target-namespace' => 'Sidjen kön ei iin uun di nöömrüm "$1" fersköwen wurd.',
+'immobile-target-namespace-iw' => 'Dü könst nian sidj üüb en interwiki-link fersküüw.',
+'immobile-source-page' => 'Detdiar sidj koon ei fersköwen wurd.',
+'immobile-target-page' => 'Üüb detdiar sidj koon ei fersköwen wurd.',
+'bad-target-model' => 'Det nei sidj hää en ööder münster üs det ual. Det münster faan $1 koon ei tu det münster faan $2 feranert wurd.',
+'imagenocrossnamespace' => 'Datein kön ei ütj di {{ns:file}}-nöömrüm ütj fersköwen wurd.',
+'nonfile-cannot-move-to-file' => 'Det as nian datei, wat dü iin uun di {{ns:file}}-nöönmrüm fersküüw wel. Det gongt ei.',
+'imagetypemismatch' => 'Det nei dateiaanj as ei detsalew üs det ual.',
+'imageinvalidfilename' => 'Didiar dateinööm gongt ei.',
+'fix-double-redirects' => "Efter't fersküüwen aal a widjerfeerangen hen tu det ual sidj ferbeedre",
+'move-leave-redirect' => 'Widjerfeerang iinracht',
+'protectedpagemovewarning' => "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det fersküüw.'''
+Uun't logbuk stäänt muar diartu:",
+'semiprotectedpagemovewarning' => "'''Paase üüb:''' Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det fersküüw.
+Uun't logbuk stäänt muar diartu:",
+'move-over-sharedrepo' => '== Datei as al diar ==
+[[:$1]] stäänt uun en gemiansoom brükt archiif. Det fersküüwen üüb didiar nööm auerskraft det gemiansoom brükt datei.',
+'file-exists-sharedrepo' => 'Didiar dateinööm woort al uun en gemiansoom archiif brükt. Wees so gud, an nem en öödern nööm.',
 
 # Export
-'export' => 'Side äksportiire',
+'export' => 'Sidjen eksportiare',
+'exporttext' => 'Mä detdiar spezial-sidj könst dü di tekst mä aal sin werjuunen tu en XML-datei eksportiare. Det nei datei koon do faan en ööder MediaWiki-Wiki [[Special:Import|importiaret]] wurd.
+
+Skriiw a sidjennöömer iin uun det tekstfial (man bluas ään noom uun arke rä).
+
+Di eksport as uk mä [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] mögelk, tun bispal för det [[{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Aal a sidjen eksportiare',
+'exportcuronly' => 'Bluas det aktuel werjuun eksportiare, ei jo ual werjuunen',
+'exportnohistory' => "----
+'''Paase üüb:''' Di eksport faan di hial ferluup as uun uugenblak ei mögelk.",
+'exportlistauthors' => 'För arke sidj det hial list faan bewerkern mänem',
+'export-submit' => 'Eksport',
+'export-addcattext' => 'Sidjen faan detdiar kategorii diartunem:',
+'export-addcat' => 'Diartunem',
+'export-addnstext' => 'Sidjen faan didiar nöömrüm diartunem:',
+'export-addns' => 'Diartunem',
+'export-download' => 'Üs XML-datei seekre',
+'export-templates' => 'Mä föörlaagen',
+'export-pagelinks' => 'Ferwiset sidjen mänem bit tu en jipde faan:',
 
 # Namespace 8 related
+'allmessages' => 'MediaWiki-Süsteemnoorachten',
 'allmessagesname' => 'Nööm',
 'allmessagesdefault' => 'Standard tekst',
+'allmessagescurrent' => 'Aktuel tekst',
+'allmessagestext' => "Det as en list mä MediaWiki-süsteemteksten.
+Wees so gud an beschük a sidjen [//www.mediawiki.org/wiki/Localisation MediaWiki-auersaatang] an [//translatewiki.net translatewiki.net], wan dü bi't auersaaten mähalep meest.",
+'allmessagesnotsupportedDB' => 'Detdiar spezial-sidj koon ei brükt wurd, auer <tt>$wgUseDatabaseMessages</tt> ei aktiif as.',
+'allmessages-filter-legend' => 'Filter',
+'allmessages-filter' => 'Filter för di uunpaaset stant:',
+'allmessages-filter-unmodified' => 'Ünferanert',
+'allmessages-filter-all' => 'Aaltumaal',
+'allmessages-filter-modified' => 'Feranert',
+'allmessages-prefix' => 'Filter mä prefix:',
+'allmessages-language' => 'Spriak:',
+'allmessages-filter-submit' => 'Widjer',
 
 # Thumbnails
 'thumbnail-more' => 'fergrutre',
-'thumbnail_error' => "Bi't maagin faan't sümnaielbil ging wat skiaf: $1",
+'filemissing' => 'Datei ei diar',
+'thumbnail_error' => "Bi't skriiwen faan det sümnaielbil as wat skiaf gingen: $1",
+'thumbnail_error_remote' => 'Feeler faan $1:
+$2',
+'djvu_page_error' => 'DjVu-sidj as bütjen faan a sidjenrüm',
+'djvu_no_xml' => 'XML-dooten för det DjVu-datei kön ei ufrepen wurd',
+'thumbnail-temp-create' => 'Det datei för det tidjwiis sümnaielbil küd ei skrewen wurd',
+'thumbnail-dest-create' => 'Det sümnaielbil küd diar ei seekert wurd.',
+'thumbnail_invalid_params' => 'Sümnaieldooten steme ei',
+'thumbnail_dest_directory' => 'Det fertiaknis koon ei skrewen wurd.',
+'thumbnail_image-type' => 'Sok bilen kön ei brükt wurd',
+'thumbnail_gd-library' => 'GD-bibleteek ei gans diar: Det funktjuun $1 waant',
+'thumbnail_image-missing' => 'Det datei as wel ei diar: $1',
 
 # Special:Import
-'import' => 'Side importiire',
+'import' => 'Sidjen importiare',
 'importinterwiki' => 'Transwiki import',
+'import-interwiki-text' => "Schük en Wiki an en sidj tu importiarin ütj. A werjuunen an brükernöömer bliiw erhäälen.
+Transwiki-import-aktjuunen wurd uun't [[Special:Log/import|Import-logbuk]] fäästhäälen.",
+'import-interwiki-source' => 'Faan hün Wiki/sidj:',
+'import-interwiki-history' => 'Aal a werjuunen faan det sidj importiare',
+'import-interwiki-templates' => 'Mä aal a föörlaagen',
 'import-interwiki-submit' => 'Import',
+'import-interwiki-namespace' => 'Tu hün nöömrüm:',
+'import-interwiki-rootpage' => 'Tu hün sidj (optional):',
+'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.',
+'importstart' => 'Importiare sidjen ...',
+'import-revision-count' => '$1 {{PLURAL:$1|werjuun|werjuunen}}',
+'importnopages' => 'Diar san nian sidjen tu importiarin.',
+'imported-log-entries' => '$1 {{PLURAL:$1|logbukiindrach|logbukiindracher}} importiaret.',
+'importfailed' => 'Import as skiaf gingen: <nowiki>$1</nowiki>',
+'importunknownsource' => 'Ünbekäänd importkwel',
+'importcantopen' => 'Det import-datei küd ei eeben maaget wurd.',
+'importbadinterwiki' => 'Ferkiard interwiki-link',
+'importnotext' => 'Leesag of nään tekst',
+'importsuccess' => 'Import klaar!',
+'importhistoryconflict' => 'Diar san al ääler werjuunen diar. Ferlicht as det sidj al ans importiaret wurden.',
+'importnosources' => 'För di transwiki-import san nian kwelen uunden. Dü könst werjuunen ei direkt huuchschüür.',
+'importnofile' => 'Diar as nian importdatei bestemet wurden.',
+'importuploaderrorsize' => "Bi't huuchschüüren faan det importdatei as wat skiaf gingen. Det datei as tu grat.",
+'importuploaderrorpartial' => "Bi't huuchschüüren faan det importdatei as wat skiaf gingen. Det datei as bluas dialwiis huuchschüürd wurden.",
+'importuploaderrortemp' => "Bi't huuchschüüren faan det importdatei as wat skiaf gingen. Diar as nian tidjwiis fertiaknis.",
+'import-parse-failure' => "Bi't importiarin faan det XML-datei as wat skiaf gingen.",
+'import-noarticle' => 'Diar as nian sidj tu importiarin bestemet wurden.',
+'import-nonewrevisions' => 'Aal jodiar werjuunen san al ans importiaret wurden.',
+'xml-error-string' => '$1 uun rä $2, türn $3 (byte $4): $5',
+'import-upload' => 'XML-datein importiare',
+'import-token-mismatch' => 'Session dooten san wech. Ferschük det noch ans weder.',
+'import-invalid-interwiki' => 'Faan detdiar Wiki koon ik ei importiare.',
+'import-error-edit' => 'Det sidj „$1“ as ei importiaret wurden, auer dü det ei bewerke mutst.',
+'import-error-create' => 'Det sidj „$1“ as ei importiaret wurden, auer dü det ei maage mutst.',
+'import-error-interwiki' => 'Det sidj „$1“ as ei importiaret wurden, auer di nööm för ferwisangen (interwiki) föörsen as.',
+'import-error-special' => 'Det sidj „$1“ as ei importiaret wurden, auer hat tu en nöömrüm hiart, huar nian sidjen mögelk san.',
+'import-error-invalid' => 'Det sidj „$1“ as ei importiaret wurden, auer di nööm ei stemet.',
+'import-error-unserialize' => 'Det werjuun $2 faan det sidj „$1“ küd ei deserialisiaret wurd. Det werjuun woort mä det münster $3 brükt, an det as mä $4 serialisiaret.',
+'import-options-wrong' => 'Ferkiard {{PLURAL:$2|iinstelang|iinstelangen}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Didiar sidjennööm as ferkiard.',
+'import-rootpage-nosubpage' => 'Uun di nöömrüm „$1“ jaft at nian onersidjen.',
+
+# Import log
+'importlogpage' => 'Import-logbuk',
+'importlogpagetext' => 'Administratiif import faan sidjen mä aal a werjuunen faan ööder Wikis.',
+'import-logentry-upload' => '„[[$1]]“ faan en datei importiaret',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|werjuun|werjuunen}}',
+'import-logentry-interwiki' => '„$1“ mä transwiki importiaret',
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|werjuun|werjuunen}} faan $2',
+
+# JavaScriptTest
+'javascripttest' => 'JavaScript-test',
+'javascripttest-title' => '$1-tests wurd ütjfeerd.',
+'javascripttest-pagetext-noframework' => 'Detdiar sidj as för JavaScript-tests föörsen.',
+'javascripttest-pagetext-unknownframework' => 'Ünbekäänd test-framework „$1“.',
+'javascripttest-pagetext-frameworks' => 'Schük ian faan jodiar test-frameworks ütj: $1',
+'javascripttest-pagetext-skins' => 'Schük en brüker-skak ütj, am di test ütjtufeeren:',
+'javascripttest-qunit-intro' => 'Luke efter bi [$1 test dokumentatjuun] üüb mediawiki.org',
+'javascripttest-qunit-heading' => 'JavaScript-QUnit-tester faan MediaWiki',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Din brükersid',
-'tooltip-pt-mytalk' => 'Din diskusjoonssid',
+'tooltip-pt-anonuserpage' => 'Brükersidj faan det IP-adres, faan huar ütj dü werkest',
+'tooltip-pt-mytalk' => 'Din diskusjuunssidj',
+'tooltip-pt-anontalk' => 'Diskusjuun auer feranrangen faan detdiar IP-adres',
 'tooltip-pt-preferences' => 'Äine önjstalinge',
-'tooltip-pt-watchlist' => 'List foon eefterkiikede side',
-'tooltip-pt-mycontris' => 'List foon din tujeefte',
-'tooltip-pt-login' => 'Ham önjmälde wårt wälj hål sänj, ouers as niinj plächt.',
-'tooltip-pt-anonlogin' => 'Ham önjmälde wårt wälj hål sänj, ouers as niinj plächt.',
-'tooltip-pt-logout' => 'Oufmälde',
-'tooltip-ca-talk' => 'Diskusjoon ouer jü sidinhålt',
-'tooltip-ca-edit' => 'Sid beårbe. Hål for dåt spikern jü forlökfunksjoon brüke.',
+'tooltip-pt-watchlist' => "Sidjen, diar dü uun't uug behual wel",
+'tooltip-pt-mycontris' => 'List mä aanj bidracher',
+'tooltip-pt-login' => 'Wan dü di uunmeldest, heest dü muar mögelkhaiden. Dü säärst det oober ei.',
+'tooltip-pt-anonlogin' => 'Wan dü di uunmeldest, heest dü muar mögelkhaiden. Dü säärst det oober ei.',
+'tooltip-pt-logout' => 'Ufmelde',
+'tooltip-ca-talk' => 'Diskusjuun auer di artiikel',
+'tooltip-ca-edit' => 'Sidj bewerke. Luke di det iarst ans uun, iar dü det seekerst.',
 'tooltip-ca-addsection' => 'Nai oufsnaas begane',
 'tooltip-ca-viewsource' => 'Jüdeer sid wårt uner ferbading hülen. Di kwältäkst koon önjkiiked wårde.',
-'tooltip-ca-history' => 'Iire färsjoone foon jüdeer sid',
+'tooltip-ca-history' => 'Ääler werjuunen faan detdiar sidj',
 'tooltip-ca-protect' => 'Jüdeer sid schütse',
 'tooltip-ca-unprotect' => 'Seekerang feranere',
 'tooltip-ca-delete' => 'Jüdeer sid tunintemååge',
+'tooltip-ca-undelete' => 'Iindracher faan det sidj turaghaale, iar det stregen wurden as.',
 'tooltip-ca-move' => 'Jüdeer sid ferschüwe',
 'tooltip-ca-watch' => 'Jüdeer sid tu jü persöönlike eefterkiiksid baitufäige',
 'tooltip-ca-unwatch' => 'Jüdeer sid foon jü persöönlike eefterkiikliste wächnaame',
 'tooltip-search' => '{{SITENAME}} döörsäke',
 'tooltip-search-go' => 'Gung matiinjs tu jü sid, jü äksakt di injääwen noome önjtspreecht.',
-'tooltip-search-fulltext' => 'Säk eefter side, da dideere täkst öjnthüülje',
-'tooltip-p-logo' => 'Besäk jü hoodsid',
-'tooltip-n-mainpage' => 'Hoodsid wise',
-'tooltip-n-mainpage-description' => 'Hoodsid besäke',
+'tooltip-search-fulltext' => 'Schük efter sidjen mä didiar tekst',
+'tooltip-p-logo' => 'Hoodsidj beschük',
+'tooltip-n-mainpage' => 'Hoodsidj wise',
+'tooltip-n-mainpage-description' => 'Hoodsidj beschük',
 'tooltip-n-portal' => 'Ouer dåt portåål, wat dü düünj koost, weer wat tu finen as',
 'tooltip-n-currentevents' => 'Äädergrüninformasjoone tu aktuäle schaiinge',
-'tooltip-n-recentchanges' => 'List foon da leeste änringe önj {{SITENAME}}',
+'tooltip-n-recentchanges' => 'Leetst feranrangen faan {{SITENAME}}',
 'tooltip-n-randompage' => 'Tufali sid',
 'tooltip-n-help' => 'Heelpsid wise',
-'tooltip-t-whatlinkshere' => 'List foon ål da side, da heer jurt wise',
-'tooltip-t-recentchangeslinked' => 'Leest änringen bai side, da foon heer ferlinkd san',
+'tooltip-t-whatlinkshere' => 'Aal a sidjen, diar heerhen ferwise',
+'tooltip-t-recentchangeslinked' => 'Leetst feranrangen faan sidjen, huar faan heer üüb ferwiset woort',
 'tooltip-feed-rss' => 'RSS-feed for jüdeer sid',
 'tooltip-feed-atom' => 'Atom-feed for jüdeer sid',
-'tooltip-t-contributions' => 'List foon tujeefte foon dideere brüker önjkiike',
+'tooltip-t-contributions' => 'List mä bidracher faan didiar brüker uunluke',
 'tooltip-t-emailuser' => 'En e-mail tu dideere brüker siinje',
-'tooltip-t-upload' => 'Bile huuchschake',
+'tooltip-t-upload' => 'Datein huuchschüür',
 'tooltip-t-specialpages' => 'List foon ål da spesjåålside',
 'tooltip-t-print' => 'Prantönjsacht foon jüdeer sid',
 'tooltip-t-permalink' => 'Wååri link tu jüdeer sidfärsjoon',
 'tooltip-ca-nstab-main' => 'Sidinhålt wise',
 'tooltip-ca-nstab-user' => 'Brükersid wise',
+'tooltip-ca-nstab-media' => 'Mediendateisidj uunwise',
 'tooltip-ca-nstab-special' => 'Jüdeer sid as en spetsjåålsid. Jü koon ai beåarbed wårde.',
 'tooltip-ca-nstab-project' => 'Portoolsid wise',
 'tooltip-ca-nstab-image' => 'Dååtäisid wise',
+'tooltip-ca-nstab-mediawiki' => 'MediaWiki-süsteemtekst uunwise',
 'tooltip-ca-nstab-template' => 'Forlååge wise',
 'tooltip-ca-nstab-help' => 'Heelpsid wise',
 'tooltip-ca-nstab-category' => 'Kategoriisid wise',
 'tooltip-minoredit' => 'Jüdeer änring as latj markiire.',
-'tooltip-save' => 'Feranerangen seekre',
+'tooltip-save' => 'Feranrangen seekre',
 'tooltip-preview' => 'Forlök foon da änringe bai jüdeer sid. Hål for dåt spikern brüke!',
 'tooltip-diff' => 'Änringe bai di täkst wise',
-'tooltip-compareselectedversions' => 'Ferschääl twasche tou ütwäälde färsjoone foon jüdeer sid wise.',
+'tooltip-compareselectedversions' => 'Ferskeel tesken tau werjuunen faan detdiar sidj uunwise.',
 'tooltip-watch' => 'Fäig jüdeer sid foon din eefterkiikliste tubai',
+'tooltip-watchlistedit-normal-submit' => 'Iindracher wechnem',
+'tooltip-watchlistedit-raw-submit' => "List mä sidjen, diar dü uun't uug behual wel, aktualisiare",
+'tooltip-recreate' => 'Sidj nei maage, likes dat det al ans stregen wurden as',
+'tooltip-upload' => 'Huuchsjüüren began',
 'tooltip-rollback' => 'Mååget åle leeste änringe foon jü sid, da foon di lik brüker fornümen wörden san, döör iinj klik tuninte.',
 'tooltip-undo' => 'Mååget bloot jüdeer iinje änring tuninte än wist dåt resultoot önj e forlöksid önj, deerma önj e tukuupefootingssid en begrüning önjjääwen wårde koon.',
+'tooltip-preferences-save' => 'Iinstelangen seekre',
 'tooltip-summary' => 'Faade det kurt tuup',
 
+# Metadata
+'notacceptable' => 'Di Wiki-server koon a dooten ei för dan aperoot apwerke.',
+
+# Attribution
+'anonymous' => '{{PLURAL:$1|anonüümen brüker|anonüüm brükern}} üüb {{SITENAME}}',
+'siteuser' => '{{SITENAME}}-brüker $1',
+'anonuser' => 'Anonüüm {{SITENAME}}-brüker $1',
+'lastmodifiedatby' => 'Det sidj as tuleetst di $1 am a klook $2 faan $3 feranert wurden.',
+'othercontribs' => 'Üüb grünjlaag faan det werk faan $1.',
+'others' => 'öödern',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|brüker|brükern}} $1',
+'anonusers' => '{{PLURAL:$2|anonüümen|anonüüm}} {{SITENAME}}-{{PLURAL:$2|brüker|brükern}} $1',
+'creditspage' => 'Sidjeninformatsjuunen',
+'nocredits' => 'Diar san nian sidjeninformatsjuunen',
+
+# Spam protection
+'spamprotectiontitle' => 'Spam-filter',
+'spamprotectiontext' => 'Di tekst, diar dü seekre wulst, as ei troch a spam-filter kimen. Det leit was uun en ferwisang üüb en sidj efter bütjen.',
+'spamprotectionmatch' => "'''Didiar tekst as faan a spam-filter fünjen wurden: ''$1'''''",
+'spambot_username' => 'MediaWiki-spam apklaarin',
+'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.',
+
+# Info page
+'pageinfo-title' => 'Informatsjuun tu „$1“',
+'pageinfo-not-current' => 'Det informatsjuun jaft at ei för ual werjuunen.',
+'pageinfo-header-basic' => 'Grünjdooten',
+'pageinfo-header-edits' => 'Ferluup bewerke',
+'pageinfo-header-restrictions' => 'Sidjenseekerhaid',
+'pageinfo-header-properties' => 'Sidjeniinstelangen',
+'pageinfo-display-title' => 'Uunwiset sidjennööm',
+'pageinfo-default-sort' => 'Normool sortiariinstelang',
+'pageinfo-length' => 'Sidjenlengde (uun bytes)',
+'pageinfo-article-id' => 'Sidjenkäännumer (ID)',
+'pageinfo-language' => 'Sidjenspriak',
+'pageinfo-robot-policy' => 'Schükmaskiin-stant',
+'pageinfo-robot-index' => 'Koon indisiaret wurd',
+'pageinfo-robot-noindex' => 'Koon ei indisiaret wurd',
+'pageinfo-views' => 'Taal faan kliks üüb det sidj',
+'pageinfo-watchers' => "Taal faan brükern, diar det sidj uun't uug haa",
+'pageinfo-few-watchers' => "Maner üs {{PLURAL:$1|ään brüker|$1 brükern}}, diar det sidj uun't uug haa",
+'pageinfo-redirects-name' => '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-firstuser' => 'Hoker det sidj maaget hää',
+'pageinfo-firsttime' => 'Wan det sidj maaget wurden as',
+'pageinfo-lastuser' => 'Leetst skriiwer',
+'pageinfo-lasttime' => "Dootem faan't leetst feranrang",
+'pageinfo-edits' => 'Taal faan feranrangen',
+'pageinfo-authors' => 'Taal faan skriiwern',
+'pageinfo-recent-edits' => 'Taal faan a leetst feranrangen (uun a leetst $1)',
+'pageinfo-recent-authors' => 'Taal faan skriiwern',
+'pageinfo-magic-words' => 'Maagisk {{PLURAL:$1|wurd|wurden}} ($1)',
+'pageinfo-hidden-categories' => 'Ferbürgen {{PLURAL:$1|kategorii|kategoriin}} ($1)',
+'pageinfo-templates' => 'Iinbünjen {{PLURAL:$1|föörlaag|föörlaagen}} ($1)',
+'pageinfo-transclusions' => 'Iinbünjen uun {{PLURAL:$1|1 sidj|$1 sidjen}}',
+'pageinfo-toolboxlink' => 'Sidjendooten',
+'pageinfo-redirectsto' => 'Widjerfeerangen tu',
+'pageinfo-redirectsto-info' => 'informatsjuun',
+'pageinfo-contentpage' => 'Üs artiikel tääld',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Sidjen mä kaskaadenseekerhaid faan heer',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Sidjen mä kaskaadenseekerhaid faan',
+'pageinfo-category-info' => 'Kategorii-informatjuun',
+'pageinfo-category-pages' => 'Taal faan sidjen',
+'pageinfo-category-subcats' => 'Taal faan onerkategoriin',
+'pageinfo-category-files' => 'Taal faan datein',
+
+# Patrolling
+'markaspatrolleddiff' => 'Üs kontroliaret kääntiakne',
+'markaspatrolledtext' => 'Sidj üs kontroliaret kääntiakne',
+'markedaspatrolled' => 'Üs kontroliaret kääntiakne',
+'markedaspatrolledtext' => 'Detdiar werjuun faan [[:$1]] as üs kontroliaret kääntiakent wurden.',
+'rcpatroldisabled' => 'A leetst feranrangen kön ei kontroliaret wurd.',
+'rcpatroldisabledtext' => 'A leetst feranrangen kön tu tidj ei kontroliaret wurd.',
+'markedaspatrollederror' => "Koon ei üs '''kontroliaret''' kääntiakent wurd.",
+'markedaspatrollederrortext' => 'Dü mutst en werjuun besteme, diar dü üs köntroliaret kääntiakne wel.',
+'markedaspatrollederror-noautopatrol' => 'Dü könst ei din aanj feranrangen üs kontroliaret kääntiakne.',
+'markedaspatrollednotify' => 'Det feranrang faan $1 as üs kontroliaret kääntiakent wurden.',
+'markedaspatrollederrornotify' => 'Det werjuun küd ei üs kontroliaret kääntiakent wurd.',
+
+# Patrol log
+'patrol-log-page' => 'Kontrol-logbuk',
+'patrol-log-header' => 'Det as det kontrol-logbuk.',
+'log-show-hide-patrol' => 'Kontrol-logbuk $1',
+
+# Image deletion
+'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:
+
+$1",
+'filedelete-missing' => 'Det datei „$1“ koon ei stregen wurd, auer hat goorei diar as.',
+'filedelete-old-unregistered' => 'Det datei-werjuun „$1“ as ei diar uun a dootenbeenk.',
+'filedelete-current-unregistered' => 'Det datei „$1“ as ei diar uun a dootenbeenk.',
+'filedelete-archive-read-only' => 'Det archiif-fertiaknis "$1" koon faan a webserver ei beskrewen wurd.',
+
 # Browsing diffs
 'previousdiff' => '← Tu di leest färsjoonsferschääl',
 'nextdiff' => 'Tu di näist färsjoonsferschääl →',
 
 # Media information
+'mediawarning' => "'''Paase üüb:''' Son datei koon fülk programcode haa. Bi't deelloosin an eeben maagin koon dan reegner komer fu.",
+'imagemaxsize' => "Bil mut ei grater wees üs:<br />''(för datei-beskriiwangen)''",
+'thumbsize' => 'Grate faan sümnaielbilen:',
+'widthheightpage' => '$1 × $2, {{PLURAL:$3|1 sidj|$3 sidjen}}',
+'file-info' => 'Dateigrate: $1, MIME-typ: $2',
 'file-info-size' => '$1 × $2 pixele, dååtäigrutelse: $3, MIME-typ: $4',
+'file-info-size-pages' => '$1 × $2 pixel, dateigrate: $3, MIME-typ: $4, $5 {{PLURAL:$5|sidj|sidjen}}',
 'file-nohires' => 'Niinj huuger apliising as deer.',
-'svg-long-desc' => 'SVG-dåtäi, basisgrutelse: $1 × $2 pixel, dåtäigrutelse: $3',
+'svg-long-desc' => 'SVG-datei, grate: $1 × $2 pixel, dateigrate: $3',
+'svg-long-desc-animated' => 'Animiaret SVG-datei, grate $1 × $2 pixel, dateigrate: $3',
+'svg-long-error' => 'Ferkiard SVG-datei: $1',
 'show-big-image' => 'Färsjon önj huuger apliising',
+'show-big-image-preview' => 'Grate faan det sümnaielbil: $1.',
+'show-big-image-other' => 'Ööder {{PLURAL:$2|apliasang|apliasangen}}: $1.',
+'show-big-image-size' => '$1 × $2 pixel',
+'file-info-gif-looped' => 'sleuf saner aanj',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|bil|bilen}}',
+'file-info-png-looped' => 'sleuf saner aanj',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|-sis}} ufspelet',
+'file-info-png-frames' => '$1 {{PLURAL:$1|bil|bilen}}',
+'file-no-thumb-animation' => "'''Paase üüb: Ütj technisk grünjer wurd sümnaielbilen ei animiaret uunwiset.'''",
+'file-no-thumb-animation-gif' => "'''Paase üüb: Ütj technisk grünjer wurd sümnaielbilen faan huuchapliasin GIF-datein ei animiaret uunwiset.'''",
+
+# Special:NewFiles
+'newimages' => 'Nei datein',
+'imagelisttext' => "Diar as en list faan '''$1''' {{PLURAL:$1|datei|datein}}, sortiaret $2.",
+'newimages-summary' => 'Detdiar spezial-sidj wiset a tuleetst huuchsjüürd datein uun.',
+'newimages-legend' => 'Filter',
+'newimages-label' => 'Dateinööm (of en dial diarfaan):',
+'showhidebots' => '(Bots $1)',
+'noimages' => 'Niks tu sen.',
+'ilsubmit' => 'Schük',
+'bydate' => 'efter dootem',
+'sp-newimages-showfrom' => 'Wise nei datein efter $1, klook $2',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekund|$1 sekunden}}',
+'minutes' => '{{PLURAL:$1|$1 minüüt|$1 minüüten}}',
+'hours' => '{{PLURAL:$1|$1 stünj|$1 stünjen}}',
+'days' => '{{PLURAL:$1|$1 dai|$1 daar}}',
+'weeks' => '{{PLURAL:$1|$1 weg|$1 wegen}}',
+'months' => '{{PLURAL:$1|$1 muun|$1 muuner}}',
+'years' => '{{PLURAL:$1|$1 juar|$1 juaren}}',
+'ago' => 'föör $1',
+'just-now' => 'jüst nü',
+
+# Human-readable timestamps
+'hours-ago' => 'föör {{PLURAL:$1|ian stünj|$1 stünjen}}',
+'minutes-ago' => 'föör {{PLURAL:$1|ian minüüt|$1 minüüten}}',
+'seconds-ago' => 'föör {{PLURAL:$1|ian sekund|$1 sekunden}}',
+'monday-at' => 'Mundai am a klook $1',
+'tuesday-at' => 'Teisdai am a klook $1',
+'wednesday-at' => 'Wäärnsdai am a klook $1',
+'thursday-at' => 'Süürsdai am a klook $1',
+'friday-at' => 'Freidai am a klook $1',
+'saturday-at' => 'Saninj am a klook $1',
+'sunday-at' => 'Söndai am a klook $1',
+'yesterday-at' => 'Jister am a klook $1',
 
 # Bad image list
-'bad_image_list' => 'Formååt:
+'bad_image_list' => 'Formaat:
 
-Bloot rae, da ma en * begane, wårde ütwjarted. As jarste eefter dåt * mötj en link aw en ai wansched dååtäi stönje.
-Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kontäkst weerfoon jü dååtäi duch tu schüns kaame mötj.',
+Bluas räen, diar mä en * began, wurd mätääld.
+Det skal bääft di * began mä en ferwisang üüb en ferkiard datei. 
+Ferwisangen uun det salew rä wurd üs ütjnoomen uunsen, huar det datei dach uunwiset wurd mut.',
 
 # Metadata
 'metadata' => 'Metadååte',
@@ -1810,19 +2944,506 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 * gpslongitude
 * gpsaltitude',
 
+# Exif tags
+'exif-imagewidth' => 'Breetje',
+'exif-imagelength' => 'Hööchde',
+'exif-bitspersample' => 'Bits per klöör',
+'exif-compression' => 'Komprimiarang',
+'exif-photometricinterpretation' => 'Pixel bonk',
+'exif-orientation' => 'Perspektiiw',
+'exif-samplesperpixel' => 'Taal faan komponenten',
+'exif-planarconfiguration' => 'Dooten skak',
+'exif-ycbcrsubsampling' => 'subsampling rate faan Y bit C',
+'exif-ycbcrpositioning' => 'Y an C positjuun',
+'exif-xresolution' => 'Wairocht apliasang',
+'exif-yresolution' => 'Luadrocht apliasang',
+'exif-stripoffsets' => 'Image data location',
+'exif-rowsperstrip' => 'Taal faan rän per strimel',
+'exif-stripbytecounts' => 'Bytes per komprimiaret strimel',
+'exif-jpeginterchangeformat' => 'Offset tu JPEG SOI',
+'exif-jpeginterchangeformatlength' => 'Bytes faan JPEG-dooten',
+'exif-whitepoint' => 'White point chromaticity',
+'exif-primarychromaticities' => 'Chromaticities of primarities',
+'exif-ycbcrcoefficients' => 'Color space transformation matrix coefficients',
+'exif-referenceblackwhite' => 'Suart/witj referens ponkter',
+'exif-datetime' => "Dootem an klooktidj faan't seekrin",
+'exif-imagedescription' => "Nööm faan't bil",
+'exif-make' => 'Knipser onernemen',
+'exif-model' => 'Knipser marke/model',
+'exif-software' => 'Software',
+'exif-artist' => 'Fotogroof',
+'exif-copyright' => 'Bilrochten',
+'exif-exifversion' => 'Stant faan Exif',
+'exif-flashpixversion' => 'Flashpix-werjuun',
+'exif-colorspace' => 'Klöörenrüm',
+'exif-componentsconfiguration' => 'Enkelt komponenten',
+'exif-compressedbitsperpixel' => 'Komprimiaret bits per pixel',
+'exif-pixelydimension' => 'Bilbreetje',
+'exif-pixelxdimension' => 'Bilhööchde',
+'exif-usercomment' => 'Brüker komentaaren',
+'exif-relatedsoundfile' => 'Ferbünjen tuundatei',
+'exif-datetimeoriginal' => "Dootem an klooktidj faan't knipsin",
+'exif-datetimedigitized' => "Dootem an klooktidj faan't digitalisiarin",
+'exif-subsectime' => 'Tidjponkt faan seekrin (1/100 s)',
+'exif-subsectimeoriginal' => "Tidjponkt faan't knipsin (1/100 s)",
+'exif-subsectimedigitized' => "Tidjponkt faan't digitalisiarin (1/100 s)",
+'exif-exposuretime' => 'Belaachtangstidj',
+'exif-exposuretime-format' => '$1 sekunden ($2)',
+'exif-fnumber' => 'F numer (blend)',
+'exif-exposureprogram' => 'Belaachtangsprogram',
+'exif-spectralsensitivity' => 'Spectral sensitivity',
+'exif-isospeedratings' => 'ISO emfintelkhaid',
+'exif-shutterspeedvalue' => 'APEX shutter speed',
+'exif-aperturevalue' => 'APEX aperture',
+'exif-brightnessvalue' => 'APEX brightness',
+'exif-exposurebiasvalue' => 'APEX exposure bias',
+'exif-maxaperturevalue' => 'Gratst blend',
+'exif-subjectdistance' => "Wai tu't subjekt",
+'exif-meteringmode' => 'Meed muude',
+'exif-lightsource' => 'Laachtkwel',
+'exif-flash' => 'Laid',
+'exif-focallength' => 'Braanwidjens',
+'exif-subjectarea' => 'Rüm',
+'exif-flashenergy' => 'Laidmäächt',
+'exif-focalplanexresolution' => 'Focal plane X resolution',
+'exif-focalplaneyresolution' => 'Focal plane Y resolution',
+'exif-focalplaneresolutionunit' => 'Focal plane resolution unit',
+'exif-subjectlocation' => "Steed faan't motiif",
+'exif-exposureindex' => 'Belaachtangsindex',
+'exif-sensingmethod' => 'Meed muude',
+'exif-filesource' => 'Dateikwel',
+'exif-scenetype' => 'Scene type',
+'exif-customrendered' => 'Custom image processing',
+'exif-exposuremode' => 'Belaachtangsmuude',
+'exif-whitebalance' => 'Witjufglik',
+'exif-digitalzoomratio' => 'Digital zoom ratio',
+'exif-focallengthin35mmfilm' => 'Braanwidjens bi en 35 mm film',
+'exif-scenecapturetype' => 'Scene capture type',
+'exif-gaincontrol' => 'Scene control',
+'exif-contrast' => 'Kontrast',
+'exif-saturation' => 'Intensiteet faan klöören',
+'exif-sharpness' => 'Skarepens',
+'exif-devicesettingdescription' => 'Iinstelangen',
+'exif-subjectdistancerange' => "Wai uf faan't motiif",
+'exif-imageuniqueid' => 'Bil-ID',
+'exif-gpsversionid' => 'GPS tag werjuun',
+'exif-gpslatituderef' => 'Nuurdelk of süüdelk breetje',
+'exif-gpslatitude' => 'Geograafisk Breetje',
+'exif-gpslongituderef' => 'Uastelk of waastelk lengde',
+'exif-gpslongitude' => 'Geograafisk lengde',
+'exif-gpsaltituderef' => 'Hööchde uun ferglik mä',
+'exif-gpsaltitude' => 'Hööchde',
+'exif-gpstimestamp' => 'GPS-tidj',
+'exif-gpssatellites' => "För't meeden brükt sateliten",
+'exif-gpsstatus' => 'Receiver status',
+'exif-gpsmeasuremode' => "Muude för't meeden",
+'exif-gpsdop' => "Nauhaid faan't meeden",
+'exif-gpsspeedref' => "Ianhaid faan't faard",
+'exif-gpsspeed' => 'Faard faan a GPS-aperoot',
+'exif-gpstrackref' => "Referens för di kurs faan't faard",
+'exif-gpstrack' => "Kurs faan't faard",
+'exif-gpsimgdirectionref' => "Referens för't ütjrachtang",
+'exif-gpsimgdirection' => "Ütjrachtang faan't bil",
+'exif-gpsmapdatum' => 'Geodeetisk referens-süsteem',
+'exif-gpsdestlatituderef' => "Referens för't geograafisk breetje",
+'exif-gpsdestlatitude' => "Geograafisk breetje faan't aanj",
+'exif-gpsdestlongituderef' => "Referens för't geograafisk lengde",
+'exif-gpsdestlongitude' => "Geograafisk lengde faan't aanj",
+'exif-gpsdestbearingref' => "Referens för di kurs faan't aanj",
+'exif-gpsdestbearing' => "Kurs faan't aanj",
+'exif-gpsdestdistanceref' => "Referens för di wai tu't motiif",
+'exif-gpsdestdistance' => "Wai tu't motiif",
+'exif-gpsprocessingmethod' => 'GPS muude',
+'exif-gpsareainformation' => 'GPS rüm',
+'exif-gpsdatestamp' => 'GPS dootem',
+'exif-gpsdifferential' => 'GPS diferential korektuur',
+'exif-jpegfilecomment' => 'JPEG dateikomentaar',
+'exif-keywords' => 'Steegwurden',
+'exif-worldregioncreated' => 'Weltregiuun, huar det bil apnimen wurden as',
+'exif-countrycreated' => 'Lun, huar det bil apnimen wurden as',
+'exif-countrycodecreated' => 'ISO-code faan det lun',
+'exif-provinceorstatecreated' => 'Prowins of federaalstoot, huar det bil aonimen wurden as',
+'exif-citycreated' => 'Stääd, huar det bil apnimen wurden as',
+'exif-sublocationcreated' => 'Stäädregiuun, huar det bil apnimen wurden as',
+'exif-worldregiondest' => 'Uunwiset weltregiuun',
+'exif-countrydest' => 'Uunwiset lun',
+'exif-countrycodedest' => 'ISO-code för det uunwiset lun',
+'exif-provinceorstatedest' => 'Prowins of federaalstoot',
+'exif-citydest' => 'Uunwiset stääd',
+'exif-sublocationdest' => 'Uunwiset stäädregiuun',
+'exif-objectname' => 'Kurt tiitel',
+'exif-specialinstructions' => 'Ekstra uunwisangen',
+'exif-headline' => 'Auerskraft',
+'exif-credit' => 'Faan hoker',
+'exif-source' => 'Faan huar',
+'exif-editstatus' => 'Hüwidj bewerket',
+'exif-urgency' => 'Hü nuadag',
+'exif-fixtureidentifier' => 'Ööders wat',
+'exif-locationdest' => 'Steed üüb det bil',
+'exif-locationdestcode' => "ISO-code faan det steed üüb't bil",
+'exif-objectcycle' => "Tidj üüb a dai för't iinstelen",
+'exif-contact' => 'Kontaktdooten',
+'exif-writer' => 'Skriiwer',
+'exif-languagecode' => 'Spriak',
+'exif-iimversion' => 'IIM werjuun',
+'exif-iimcategory' => 'Kategorii',
+'exif-iimsupplementalcategory' => 'Muar kategooriin',
+'exif-datetimeexpires' => 'Ei muar tu brüken efter',
+'exif-datetimereleased' => 'Ütjden di',
+'exif-originaltransmissionref' => 'ISO-code faan det steed, huar det bil auerdraanj wurden as',
+'exif-identifier' => 'Käänang',
+'exif-lens' => 'Hün objektiif',
+'exif-serialnumber' => 'Luupen numer faan a knipser',
+'exif-cameraownername' => 'Hoker di knipser hiart',
+'exif-label' => 'Betiaknang',
+'exif-datetimemetadata' => 'Leetst feranrang faan meta-dooten',
+'exif-nickname' => 'Nööm för det bil',
+'exif-rating' => 'Wäärdaghaid (1 tu 5, 5 as best)',
+'exif-rightscertificate' => 'Rights management certificate',
+'exif-copyrighted' => 'Copyright-Status:',
+'exif-copyrightowner' => 'Bilrochten lei bi',
+'exif-usageterms' => 'Brükerreegeln',
+'exif-webstatement' => 'Online copyright statement',
+'exif-originaldocumentid' => "Iandüüdag käänang (ID) faan't dokument",
+'exif-licenseurl' => 'URL for copyright license',
+'exif-morepermissionsurl' => 'Muar lisensen',
+'exif-attributionurl' => 'Wan dü det bil brük wel, saat en ferwisang üüb:',
+'exif-preferredattributionname' => 'Wan dü det bil brük wel, nääm:',
+'exif-pngfilecomment' => 'PNG dateikomentaar',
+'exif-disclaimer' => 'Disclaimer',
+'exif-contentwarning' => 'Wäärnang',
+'exif-giffilecomment' => 'GIF dateikomentaar',
+'exif-intellectualgenre' => 'Slach faan bil',
+'exif-subjectnewscode' => 'Motiif-code',
+'exif-scenecode' => 'IPTC-code',
+'exif-event' => 'Begeebenhaid',
+'exif-organisationinimage' => 'Organisatjuun',
+'exif-personinimage' => 'Persuun',
+'exif-originalimageheight' => "Hööchde faan't bil föör't beklapen",
+'exif-originalimagewidth' => "Breetje faan't bil föör't beklapen",
+
+# Exif attributes
+'exif-compression-1' => 'Ünkomprimiaret',
+'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
+'exif-compression-3' => 'CCITT Group 3 fax encoding',
+'exif-compression-4' => 'CCITT Group 4 fax encoding',
+
+'exif-copyrighted-true' => 'Mä kopiarrocht',
+'exif-copyrighted-false' => 'Saner kopiarrocht',
+
+'exif-unknowndate' => 'Ünbekäänd dootem',
+
+'exif-orientation-1' => 'Normool',
+'exif-orientation-2' => 'Wairocht speegelt',
+'exif-orientation-3' => 'Am 180° dreid',
+'exif-orientation-4' => 'Luadrocht speegelt',
+'exif-orientation-5' => 'Jin a klook am 90° dreid an luadrocht speegelt.',
+'exif-orientation-6' => 'Jin a klook am 90° dreid',
+'exif-orientation-7' => 'Mä a klook am 90° dreid an luadrocht speegelt.',
+'exif-orientation-8' => 'Mä a klook am 90° dreid',
+
+'exif-planarconfiguration-1' => 'Grööw formaat',
+'exif-planarconfiguration-2' => 'Planaar formaat',
+
+'exif-colorspace-65535' => 'Ei kalibriaret',
+
+'exif-componentsconfiguration-0' => 'as ei diar',
+
+'exif-exposureprogram-0' => 'ei bekäänd',
+'exif-exposureprogram-1' => 'Manuel',
+'exif-exposureprogram-2' => 'Normool program',
+'exif-exposureprogram-3' => 'Tidjautomaatik',
+'exif-exposureprogram-4' => 'Blendenautomaatik',
+'exif-exposureprogram-5' => 'Kreatiifprogram mä jip skarepens',
+'exif-exposureprogram-6' => 'Aktjuunsprogram mä kurt belaachtangstidj',
+'exif-exposureprogram-7' => 'Portree-muude mä skarepen föörgrünj',
+'exif-exposureprogram-8' => 'Loonskap-muude mä skarepen bääftgrünj',
+
+'exif-subjectdistance-value' => '$1 meetern',
+
+'exif-meteringmode-0' => 'Ünbekäänd',
+'exif-meteringmode-1' => 'Madel',
+'exif-meteringmode-2' => 'Skarep maden',
+'exif-meteringmode-3' => 'Spot',
+'exif-meteringmode-4' => 'Multi-Spot',
+'exif-meteringmode-5' => 'Münster',
+'exif-meteringmode-6' => 'Bil-dial',
+'exif-meteringmode-255' => 'Ööder',
+
+'exif-lightsource-0' => 'Ünbekäänd',
+'exif-lightsource-1' => 'Dailaacht',
+'exif-lightsource-2' => 'Fluorescent',
+'exif-lightsource-3' => 'Konstlaacht',
+'exif-lightsource-4' => 'Laid',
+'exif-lightsource-9' => 'Smok weder',
+'exif-lightsource-10' => 'Betaanj',
+'exif-lightsource-11' => 'Skaad',
+'exif-lightsource-12' => 'Daylight fluorescent (D 5700 – 7100K)',
+'exif-lightsource-13' => 'Day white fluorescent (N 4600 – 5400K)',
+'exif-lightsource-14' => 'Cool white fluorescent (W 3900 – 4500K)',
+'exif-lightsource-15' => 'White fluorescent (WW 3200 – 3700K)',
+'exif-lightsource-17' => 'Standard light A',
+'exif-lightsource-18' => 'Standard light B',
+'exif-lightsource-19' => 'Standard light C',
+'exif-lightsource-24' => 'ISO studio konstlaacht',
+'exif-lightsource-255' => 'Ööder laacht',
+
+# Flash modes
+'exif-flash-fired-0' => 'Nään laid',
+'exif-flash-fired-1' => 'Laid ütjliaset',
+'exif-flash-return-0' => 'Laid schüürt nian dooten',
+'exif-flash-return-2' => 'Nään laid tu sen',
+'exif-flash-return-3' => 'Laid wiar tu sen',
+'exif-flash-mode-1' => 'Mä twüngen laid',
+'exif-flash-mode-2' => 'Laid ufsteld',
+'exif-flash-mode-3' => 'Automaatik',
+'exif-flash-function-1' => 'Nään laid mögelk',
+'exif-flash-redeye-1' => 'Nian ruad uugen muude',
+
+'exif-focalplaneresolutionunit-2' => 'tol',
+
+'exif-sensingmethod-1' => 'Ei bekäänd',
+'exif-sensingmethod-2' => 'One-chip color area sensor',
+'exif-sensingmethod-3' => 'Two-chip color area sensor',
+'exif-sensingmethod-4' => 'Three-chip color area sensor',
+'exif-sensingmethod-5' => 'Color sequential area sensor',
+'exif-sensingmethod-7' => 'Trilinear sensor',
+'exif-sensingmethod-8' => 'Color sequential linear sensor',
+
+'exif-filesource-3' => 'Digitaal stunbilknipser',
+
+'exif-scenetype-1' => 'Normool',
+
+'exif-customrendered-0' => 'Normool',
+'exif-customrendered-1' => 'Brüker-iinsteld',
+
+'exif-exposuremode-0' => 'Automaatisk belaachtang',
+'exif-exposuremode-1' => 'Manuel belaachtang',
+'exif-exposuremode-2' => 'Belaachtangsrä',
+
+'exif-whitebalance-0' => 'Automaatisk',
+'exif-whitebalance-1' => 'Manuel',
+
+'exif-scenecapturetype-0' => 'Normool',
+'exif-scenecapturetype-1' => 'Loonskap',
+'exif-scenecapturetype-2' => 'Portree',
+'exif-scenecapturetype-3' => 'Naacht',
+
+'exif-gaincontrol-0' => 'Nian',
+'exif-gaincontrol-1' => 'Letjet ap',
+'exif-gaincontrol-2' => 'Föl ap',
+'exif-gaincontrol-3' => 'Letjet deel',
+'exif-gaincontrol-4' => 'Föl deel',
+
+'exif-contrast-0' => 'Normool',
+'exif-contrast-1' => 'Swaak',
+'exif-contrast-2' => 'Stark',
+
+'exif-saturation-0' => 'Normool',
+'exif-saturation-1' => 'Letjet',
+'exif-saturation-2' => 'Huuch',
+
+'exif-sharpness-0' => 'Normool',
+'exif-sharpness-1' => 'Swaak',
+'exif-sharpness-2' => 'Stark',
+
+'exif-subjectdistancerange-0' => 'Ünbekäänd',
+'exif-subjectdistancerange-1' => 'Makro',
+'exif-subjectdistancerange-2' => 'Nai bi',
+'exif-subjectdistancerange-3' => 'Widj wech',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'Nuurdelk breetje',
+'exif-gpslatitude-s' => 'Süüdelk breetje',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'Uastelk lengde',
+'exif-gpslongitude-w' => 'Waastelk lengde',
+
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '{{PLURAL:$1|Ään meeter|$1 meetern}} auer siapeegel',
+'exif-gpsaltitude-below-sealevel' => '{{PLURAL:$1|Ään meeter|$1 meetern}} oner siapeegel',
+
+'exif-gpsstatus-a' => 'Measurement in progress',
+'exif-gpsstatus-v' => 'Measurement interoperability',
+
+'exif-gpsmeasuremode-2' => '2-dimensional measurement',
+'exif-gpsmeasuremode-3' => '3-dimensional measurement',
+
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'km/h',
+'exif-gpsspeed-m' => 'mph',
+'exif-gpsspeed-n' => 'kn',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Kilomeetern',
+'exif-gpsdestdistance-m' => 'Miilen',
+'exif-gpsdestdistance-n' => 'Siamiilen',
+
+'exif-gpsdop-excellent' => 'Auer a miaten ($1)',
+'exif-gpsdop-good' => 'Gud ($1)',
+'exif-gpsdop-moderate' => 'Madel ($1)',
+'exif-gpsdop-fair' => 'Gongt so ($1)',
+'exif-gpsdop-poor' => 'Ei so dol ($1)',
+
+'exif-objectcycle-a' => 'Bluas am maarlem',
+'exif-objectcycle-p' => 'Bluas am injem',
+'exif-objectcycle-b' => 'Eder am maarlam an am injem',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'Rochtwisin kurs',
+'exif-gpsdirection-m' => 'Magneetisk kurs',
+
+'exif-ycbcrpositioning-1' => 'Sentriaret',
+'exif-ycbcrpositioning-2' => 'Uun naiberskap',
+
+'exif-dc-contributor' => 'Bidracher faan',
+'exif-dc-coverage' => 'Spatial or temporal scope of media',
+'exif-dc-date' => 'Dootem',
+'exif-dc-publisher' => 'Ütjden faan',
+'exif-dc-relation' => 'Ferbünjen meedien',
+'exif-dc-rights' => 'Rochten',
+'exif-dc-source' => 'Meeedienkwel',
+'exif-dc-type' => 'Meedienslach',
+
+'exif-rating-rejected' => 'Turagwiset',
+
+'exif-isospeedratings-overflow' => 'Grater üs 65535',
+
+'exif-iimcategory-ace' => 'Konst, kultüür an onerhualang',
+'exif-iimcategory-clj' => 'Rocht an ferbreegen',
+'exif-iimcategory-dis' => 'Katastroofen an ünfaaler',
+'exif-iimcategory-fin' => 'Wiartskap an bedriiwer',
+'exif-iimcategory-edu' => 'Onerracht',
+'exif-iimcategory-evn' => 'Natüür an amwelt',
+'exif-iimcategory-hth' => 'Sünjhaid',
+'exif-iimcategory-hum' => 'Persöönelk intresen',
+'exif-iimcategory-lab' => 'Werk',
+'exif-iimcategory-lif' => 'Freitidj an muude',
+'exif-iimcategory-pol' => 'Politik',
+'exif-iimcategory-rel' => 'Religioon an gluuw',
+'exif-iimcategory-sci' => 'Wedenskap an technologii',
+'exif-iimcategory-soi' => 'Mäenööder',
+'exif-iimcategory-spo' => 'Sport',
+'exif-iimcategory-war' => 'Kriich, stridj an ünrau',
+'exif-iimcategory-wea' => 'Weder',
+
+'exif-urgency-normal' => 'Normool ($1)',
+'exif-urgency-low' => 'Liach ($1)',
+'exif-urgency-high' => 'Huuch ($1)',
+'exif-urgency-other' => 'Faan a brüker fäästlaanj prioriteet ($1)',
+
 # External editor support
-'edit-externally' => 'Jüdeer dåtäi ma en äkstärn prugram beårbe',
+'edit-externally' => 'Detdiar datei mä en ekstern program bewerke',
 'edit-externally-help' => '(Sii da [//www.mediawiki.org/wiki/Manual:External_editors Installationsanweisungen] for widere Informasjoon)',
 
 # 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'åle',
-'namespacesall' => 'åle',
-'monthsall' => 'åle',
+'watchlistall2' => 'aaltumaal',
+'namespacesall' => 'aaltumaal',
+'monthsall' => 'aaltumaal',
 'limitall' => 'åle',
 
+# Email address confirmation
+'confirmemail' => 'E-mail-adres gudkään',
+'confirmemail_noemail' => 'Dü heest nian gud e-mail-adres uun din [[Special:Preferences|persöönelk iinstelangen]] iindraanj.',
+'confirmemail_text' => '{{SITENAME}} ferlangt, dat dü din e-mail-adres gudkäänst, iar dü a ütjwidjet e-mail-funktjuunen brük könst. Trak üüb det fial „E-mail-code tusjüür“, am dat dü en e-mail tuschüürd feist, huar di code uun stäänt an en URL, am din adres gudtukäänen.',
+'confirmemail_pending' => 'Dü heest al en e-mail mä di e-mail-code tuschüürd füngen. Teew noch en uugenblak, det komt wel noch. Bluas wan det goorei loket, ferlang efter en neien code.',
+'confirmemail_send' => 'E-mail-code tuschüür',
+'confirmemail_sent' => 'E-mail-code as wechschüürd wurden.',
+'confirmemail_oncreate' => "En e-mail mä di e-mail-code as tu din e-mail-adres schüürd wurden. Hi as ei nuadag tu uunmeldin, oober hi woort brükt för ütjwidjet e-mail-funktjuunen uun't Wiki.",
+'confirmemail_sendfailed' => '{{SITENAME}} küd det e-mail mä di e-mail-code ei wechschüür.
+Luke noch ans, of dü det e-mail-adres rocht apskrewen heest.
+
+Di mail-server swaaret: $1',
+'confirmemail_invalid' => 'Di e-mail-code as ei gud. Ferlicht as hi tu ual.
+Ferschük det man noch ans.',
+'confirmemail_needlogin' => 'Dü skel di $1, am din e-mail-adres gudtukäänen.',
+'confirmemail_success' => 'Din e-mail-adres as gudkäänd wurden.
+Dü könst di nü [[Special:UserLogin|uunmelde]].',
+'confirmemail_loggedin' => 'Din e-mail-adres as gudkäänd wurden.',
+'confirmemail_error' => "Bi't gudkäänen faan din e-mail-adres as wat skiaf gingen.",
+'confirmemail_subject' => '[{{SITENAME}}] E-mail-adres gudkään',
+'confirmemail_body' => 'Gud dai,
+
+hoker mä det IP-adres $1 (woorskiinelk dü salew) hää det brükerkonto „$2“ bi {{SITENAME}} iinracht.
+
+Am a e-mail-funktjuunen faan {{SITENAME}} (weder) aktiif tu fun, an am seeker tu stelen, dat det brükerkonto uk würelk mä din e-mail-adres tuuphiart, gung tu detdiar ferwisang:
+
+$3
+
+Wan dü det brükerkonto *ei* iinracht hast, do gung tu detdiar ferwisang, am det gudkäänen uftubreegen:
+
+$5
+
+Didiar code täält bit $6, am a klook $7.',
+'confirmemail_body_changed' => 'Hoker mä det IP-adres $1 (woorskiinelk dü salew) hää det e-mail-adres faan det brükerkonto „$2“ bi {{SITENAME}} feranert.
+
+Am seeker tu stelen, dat det brükerkonto uk würelk di hiart, an am a e-mail-funktjuunen bi {{SITENAME}} weder uun a gang tu fun, gung tu detdiar ferwisang:
+
+$3
+
+Wan det *ei* din brükerkonto as, do gung tu detdiar ferwisang, am det gudkäänen uftubreegen:
+
+$5
+
+Didiar code täält bit $4.',
+'confirmemail_body_set' => "Hoker mä det IP-adres $1 (woorskiinelk dü salew) hää det e-mail-adres faan't brükerkonto „$2“ üüb {{SITENAME}} tu detdiar e-mail-adres amanert.
+
+Am seeker tu stelen, dat det brükerkonto würelk di hiart, an am a e-mail-funktjuunen üüb {{SITENAME}} weder uun a gang tu fun, gung tu detdiar ferwisang:
+
+$3
+
+Wan det *ei* din konto as, do gung tu detdiar ferwisang, am det gudkäänen uftubreegen:
+
+$5
+
+Didiar code täält bit $4.",
+'confirmemail_invalidated' => "Det gudkäänen faan't e-mail-adres as ufbreegen wurden.",
+'invalidateemail' => "Breeg gudkäänen faan't e-mail-adres uf",
+
+# Scary transclusion
+'scarytranscludedisabled' => '[Iinbinjen faan interwikis as ei aktiif]',
+'scarytranscludefailed' => '[Iinbinjen faan föörlaagen för $1 as skiaf gingen]',
+'scarytranscludefailed-httpstatus' => '[Ufrepen faan föörlaagen för $1 as skiaf gingen: HTTP  $2]',
+'scarytranscludetoolong' => '[URL as tu lung]',
+
+# Delete conflict
+'deletedwhileediting' => "'''Paase üüb:''' Det sidj as stregen wurden, üs dü diar jüst bi werket heest!
+Uun't [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Strik-logbuk] fanjst dü di grünj för't striken. Wan dü det sidj seekerst, woort det nei uunlaanj.",
+'confirmrecreate' => "Di brüker [[User:$1|$1]] ([[User talk:$1|Diskusjuun]]) hää det sidj stregen, üs dü diar jüst bi werket heest. Di grünj wiar:
+:''$2''
+Ferseekre, dat dü det sidj würelk nei maage wel.",
+'confirmrecreate-noreason' => 'Di brüker [[User:$1|$1 ]] ([[User talk:$1|Diskusjuun]]) hää det sidj stregen, huar dü jüst bi werket heest. Ferseekre, dat dü det sidj würelk nei maage wel.',
+'recreate' => 'Nei maage',
+
+# action=purge
+'confirm_purge_button' => 'OK',
+'confirm-purge-top' => 'Det sidj ütj a cache strik?',
+'confirm-purge-bottom' => 'Maaget di cache leesag an wiset det neist werjuun uun.',
+
+# action=watch/unwatch
+'confirm-watch-button' => 'OK',
+'confirm-watch-top' => "Wel dü detdiar sidj uun't uug behual?",
+'confirm-unwatch-button' => 'OK',
+'confirm-unwatch-top' => "Wel dü detdiar sidj ei muar uun't uug behual?",
+
+# Multipage image navigation
+'imgmultipageprev' => '← leetst sidj (turag)',
+'imgmultipagenext' => 'naist sidj →',
+'imgmultigo' => 'Widjer',
+'imgmultigoto' => 'Gung tu sidj $1',
+
 # Table pager
 'ascending_abbrev' => 'ap',
 'descending_abbrev' => 'deel',
+'table_pager_next' => 'Naist sidj',
+'table_pager_prev' => 'Leetst sidj (turag)',
+'table_pager_first' => 'Iarst sidj',
+'table_pager_last' => 'Leetst sidj',
+'table_pager_limit' => 'Wise $1 iindracher per sidj',
+'table_pager_limit_label' => 'Iindracher per sidj:',
+'table_pager_limit_submit' => 'Widjer',
+'table_pager_empty' => 'Diar wiar niks',
 
 # Auto-summaries
 'autosumm-blank' => 'Det sidj as leesag maaget wurden.',
@@ -1830,21 +3451,127 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 'autoredircomment' => 'Sidj tu [[$1]] widjerfeerd',
 'autosumm-new' => 'Det sidj as nei uunlaanj wurden: "$1"',
 
+# Live preview
+'livepreview-loading' => 'Loose ...',
+'livepreview-ready' => 'Loosin ... Klaar!',
+'livepreview-failed' => 'Live-preview wul ei!
+Ferschük det üüb di normool wai.',
+'livepreview-error' => 'Küd ei ferbinj: $1 "$2".
+Ferschük det üüb di normool wai.',
+
+# Friendlier slave lag warnings
+'lag-warn-normal' => 'Feranrangen faan {{PLURAL:$1|at leetst sekund|a leetst $1 sekunden}} kön noch ei uunwiset wurd.',
+'lag-warn-high' => 'Auer det huuch dootenbeenklääst kön a feranrangen faan {{PLURAL:$1|at leetst sekund|a leetst $1 sekunden}} noch ei uunwiset wurd.',
+
+# Watchlist editor
+'watchlistedit-numitems' => "Dü heest {{PLURAL:$1|ian sidj|$1 sidjen}} uun't uug. A diskusjuunssidjen wurd ei mätääld.",
+'watchlistedit-noitems' => "Dü heest nian sidjen, diar dü uun't uug behual wel.",
+'watchlistedit-normal-title' => "List mä sidjen, diar dü uun't uug behual wel, bewerke",
+'watchlistedit-normal-legend' => "Ei muar uun't uug behual",
+'watchlistedit-normal-explain' => "Jodiar sidjen wel dü uun't uug behual. Am iindracher tu striken, kääntiakne a kaschin üüb sidj faan di iindrach an trak oner üüb „{{int:Watchlistedit-normal-submit}}“. Dü könst det list uk uun't [[Special:EditWatchlist/raw|listenformoot]] bewerke.",
+'watchlistedit-normal-submit' => 'Iindracher wechnem',
+'watchlistedit-normal-done' => '{{PLURAL:$1|Ään iindrach as|$1 iindracher san}} faan det list wechnimen wurden:',
+'watchlistedit-raw-title' => "Uun't listenformoot bewerke",
+'watchlistedit-raw-legend' => "Uun't listenformoot bewerke",
+'watchlistedit-raw-explain' => "Jodiar sidjen, diar dü uun't uug behual wel, san uun't listenformoot apskrewen. A iindracher kön räwiis stregen of ütjwidjet wurd.
+Uun arke rä mut ään iindrach stun. Wan dü klaar beest, trak oner üüb „{{int:Watchlistedit-raw-submit}}“.
+Dü könst uk det [[Special:EditWatchlist|normool sidj]] tu bewerkin nem.",
+'watchlistedit-raw-titles' => 'Iindracher:',
+'watchlistedit-raw-submit' => "List mä sidjen, diar dü uun't uug behual wel, aktualisiare",
+'watchlistedit-raw-done' => "Det list mä sidjen, diar dü uun't uug behual wel, as nü üüb di neist stant.",
+'watchlistedit-raw-added' => '{{PLURAL:$1|Ään iindrach as|$1 iindracher san}} diartu skrewen wurden:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|Ään iindrach as|$1 iindracher san}} wechnimen wurden:',
+
 # Watchlist editing tools
 'watchlisttools-view' => 'Eefterkiiklist: änringe',
-'watchlisttools-edit' => 'normåål beårbe',
-'watchlisttools-raw' => 'Listeformoot beårbe (import/äksport)',
+'watchlisttools-edit' => 'Normool bewerke',
+'watchlisttools-raw' => "Uun't listenformoot bewerke",
+
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskusjuun]])',
 
 # Core parser functions
+'unknown_extension_tag' => "Ünbekäänd ''tag'' „$1“",
 'duplicate-defaultsort' => '\'\'\'Paase üüb:\'\'\' Di sortiarkai "$2" auerskraft di ual sortiarkai "$1"',
 
 # Special:Version
+'version' => 'Werjuun',
+'version-extensions' => 'Instaliaret ütjwidjangen',
+'version-specialpages' => 'Spezial-sidjen',
+'version-parserhooks' => 'Ütjwidjet parserfunktjuunen',
+'version-variables' => 'Wariaabeln',
+'version-antispam' => "''Spam''seekerangen",
+'version-skins' => 'Brükerskaker',
+'version-other' => 'Ööders wat',
+'version-mediahandlers' => 'Ütjwidjet medien-funktjuunen',
+'version-hooks' => 'Hooks',
+'version-extension-functions' => 'Ütjwidjet funktjuunen',
+'version-parser-extensiontags' => 'Parser extension tags',
+'version-parser-function-hooks' => 'Parser function hooks',
+'version-hook-name' => 'Hook nööm',
+'version-hook-subscribedby' => 'Aprepen faan',
+'version-version' => '(Werjuun $1)',
+'version-license' => 'Lisens',
+'version-poweredby-credits' => "Detheer wääbsteed werket mä '''[//www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
+'version-poweredby-others' => 'öödern',
+'version-credits-summary' => 'Wi besoonke üs bi jodiar persuunen för hör bidracher tu [[Special:Version|MediaWiki]].',
+'version-license-info' => 'MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+MediaWiki 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 [{{SERVER}}{{SCRIPTPATH}}/COPYING 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 or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].',
 'version-software' => 'Instaliird software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Färsjoon',
+'version-entrypoints' => 'URLs faan hüsdörsidjen',
+'version-entrypoints-header-entrypoint' => 'Hüsdörsidj',
+'version-entrypoints-header-url' => 'URL',
+
+# Special:Redirect
+'redirect' => 'Widjerfeerang üüb en brükersidj, sidjenwerjuun of datei.',
+'redirect-legend' => 'Widjerfeerang üüb en sidjenwerjuun of datei.',
+'redirect-summary' => 'Det spezial-sidj feert widjer üüb en brükersidj, sidjenwerjuun of datei.',
+'redirect-submit' => 'Widjer',
+'redirect-lookup' => 'Schük:',
+'redirect-value' => 'Käänang of dateinööm:',
+'redirect-user' => 'Brüker-ID',
+'redirect-revision' => 'Sidjenwerjuun',
+'redirect-file' => 'Dateinööm',
+'redirect-not-exists' => 'Wäärs ei fünjen',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Schük dobelt datein',
+'fileduplicatesearch-summary' => 'Dobelt datein schük üüb grünjlaag faan hör hash-wäärs',
+'fileduplicatesearch-legend' => 'Dobelt datein schük',
+'fileduplicatesearch-filename' => 'Dateinööm:',
+'fileduplicatesearch-submit' => 'Schük',
+'fileduplicatesearch-info' => '$1 × $2 pixel<br />Dateigrate: $3<br />MIME-typ: $4',
+'fileduplicatesearch-result-1' => 'Diar san nian dobelt datein faan „$1“.',
+'fileduplicatesearch-result-n' => 'Det datei „$1“ hää {{PLURAL:$2|1 dobelt ütjfeerang|$2 dobelt ütjfeerangen}}.',
+'fileduplicatesearch-noresults' => 'Nian datei mä di nööm „$1“ fünjen.',
 
 # Special:SpecialPages
-'specialpages' => 'Spetsjåålside',
+'specialpages' => 'Spezial-sidjen',
+'specialpages-note' => '----
+* Normool spezial-sidjen
+* <span class="mw-specialpagerestricted">Spezial-sidjen mä tugripsrochten</span>
+* <span class="mw-specialpagecached">Spezial-sidjen uun a cache (As ferlicht ei muar aktuel.)</span>',
+'specialpages-group-maintenance' => 'Werksteedsidjen',
+'specialpages-group-other' => 'Ööder spezial-sidjen',
+'specialpages-group-login' => 'Melde di uun of skriiw di iin',
+'specialpages-group-changes' => 'Leetst feranrangen an logbuken',
+'specialpages-group-media' => 'Medien',
+'specialpages-group-users' => 'Brükern an rochten',
+'specialpages-group-highuse' => 'Flooksis brükt sidjen',
+'specialpages-group-pages' => 'Sidjen',
+'specialpages-group-pagetools' => 'Sidjenwerktjüch',
+'specialpages-group-wiki' => 'Dooten an werktjüch',
+'specialpages-group-redirects' => 'Spezial-sidjen, diar widjer feer',
+'specialpages-group-spam' => "''Spam'' werktjüch",
+
+# Special:BlankPage
+'blankpage' => 'Leesag sidj',
+'intentionallyblankpage' => 'Det sidj as mä walem leesag. Hat woort för benchmarks brükt.',
 
 # External image whitelist
 'external_image_whitelist' => " #Feranere detheer rä ei<pre>
@@ -1857,33 +3584,157 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 #Skriiw dialen faan reguleer ütjdrüker auer detheer rä. Feranere detheer rä ei</pre>",
 
 # Special:Tags
+'tags' => 'Feranrangskääntiaken',
 'tag-filter' => '[[Special:Tags|Kääntiaken]] filter:',
+'tag-filter-submit' => 'Filter',
+'tags-title' => 'Kääntiaken',
+'tags-intro' => "Det sidj wiset kääntiaken, diar för't bewerkin brükt wurd, an wat jo men.",
+'tags-tag' => 'Kääntiaken-nööm',
+'tags-display-header' => 'Nööm üüb feranrangslisten',
+'tags-description-header' => 'Widjloftag beskriiwang',
+'tags-hitcount-header' => 'Kääntiakent feranrangen',
+'tags-edit' => 'bewerke',
+'tags-hitcount' => '$1 {{PLURAL:$1|feranrang|feranrangen}}',
+
+# Special:ComparePages
+'comparepages' => 'Sidjen ferglik',
+'compare-selector' => 'Sidjenwerjuunen ferglik',
+'compare-page1' => 'Sidj 1',
+'compare-page2' => 'Sidj 2',
+'compare-rev1' => 'Werjuun 1',
+'compare-rev2' => 'Werjuun 2',
+'compare-submit' => 'Ferglik',
+'compare-invalid-title' => 'Didiar sidjennööm gongt ei.',
+'compare-title-not-exists' => 'Son sidjennööm as diar ei.',
+'compare-revision-not-exists' => 'Son werjuun as diar ei.',
+
+# Database error messages
+'dberr-header' => 'Det Wiki hää komer.',
+'dberr-problems' => 'Dää mi iarag! Det sidj hää technisk komer.',
+'dberr-again' => 'Teew en uugenblak an ferschük det noch ans.',
+'dberr-info' => '(Koon ei mä a dootenbeenk-server ferbinj: $1)',
+'dberr-usegoogle' => 'Uun a teskentidj küdst dü det mä Google ferschük.',
+'dberr-outofdate' => 'Seenk diaram, dat Google ferlicht ual dooten uunwiset.',
+'dberr-cachederror' => 'Detheer komt ütj en cache an as ferlicht ei muar aktuel.',
 
 # HTML forms
+'htmlform-invalid-input' => 'Diar as wat skiaf gingen mä din uunfraag.',
+'htmlform-select-badoption' => 'Didiar wäärs as ei tuläät.',
+'htmlform-int-invalid' => 'Didiar wäärs as nian hial taal.',
+'htmlform-float-invalid' => 'Didiar wäärs as nian taal.',
+'htmlform-int-toolow' => 'Didiar wäärs as letjer üs det minimum faan $1.',
+'htmlform-int-toohigh' => 'Didiar wäärs as grater üs det maximum faan $1.',
+'htmlform-required' => 'Di wäärs woort brükt.',
+'htmlform-submit' => 'Auerdreeg',
+'htmlform-reset' => 'Feranrangen turagsaat.',
 'htmlform-selectorother-other' => 'Oudere',
+'htmlform-no' => 'Naan',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Schük ütj',
+
+# SQLite database support
+'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.",
 
 # New logging system
-'logentry-delete-delete' => '$1 hää det sidj $3 stregen',
-'logentry-delete-restore' => '$1 hää det sidj $3 weder iinsteld',
-'logentry-delete-event' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
-'logentry-delete-revision' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
-'logentry-delete-event-legacy' => '$1 hää det uunlukin feranert faan logbuk iindracher üüb $3',
-'logentry-delete-revision-legacy' => '$1 hää det uunlukin feranert faan wersjuunen faan det sidj $3',
-'logentry-suppress-delete' => '$1 hää det sidj $3 wechtrakt',
-'logentry-suppress-event' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
-'logentry-suppress-revision' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
-'logentry-suppress-event-legacy' => '$1 hää stalswigin det uunlukin fernanert faan logbuk iindracher üüb $3',
-'logentry-suppress-revision-legacy' => '$1 hää stalswigin det uunlukin feranert faan wersjuunen faan det sidj $3',
+'logentry-delete-delete' => '$1 {{Gender:$2}} hää det sidj $3 stregen',
+'logentry-delete-restore' => '$1 {{GENDER:$2}} hää det sidj $3 weder iinsteld',
+'logentry-delete-event' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|ian werjuun|$5 werjuunen}} faan det sidj $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan logbuk iindracher üüb $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2}} hää det uunsicht feranert faan werjuunen faan det sidj $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2}} hää det sidj $3 wechtrakt',
+'logentry-suppress-event' => '$1 {{GENDER:$2}} hää stalswigin det uunsicht feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2}} hää stalswigin det uunsicht feranert faan {{PLURAL:$5|ian werjuun|$5 werjuunen}} faan det sidj $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2}} hää stalswigin det uunsicht feranert faan logbuk iindracher üüb $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2}} hää stalswigin det uunlukin feranert faan werjuunen faan det sidj $3',
+'revdelete-content-hid' => 'Ferbürgen',
+'revdelete-summary-hid' => 'Ferbürgen tuupfaadang',
 'revdelete-uname-hid' => 'brükernoome ferstäägen',
+'revdelete-content-unhid' => 'Ei muar ferberag',
+'revdelete-summary-unhid' => 'Tuupfaadang ei muar ferberag',
 'revdelete-uname-unhid' => 'brükernoome frijääwen',
 'revdelete-restricted' => 'gränse jüle uk for administratoore',
 'revdelete-unrestricted' => 'gränse for administratoore wächnümen',
-'logentry-move-move' => '$1 hää det sidj $3 efter $4 fersköwen.',
-'logentry-move-move-noredirect' => '$1 hää det sidj $3 efter $4 saner widjerfeerang fersköwen.',
-'logentry-move-move_redir' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen.',
-'logentry-move-move_redir-noredirect' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen saner salew en widjerfeerang uuntuleien.',
+'logentry-move-move' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen.',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 saner widjerfeerang fersköwen.',
+'logentry-move-move_redir' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen.',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen saner salew en widjerfeerang uuntuleien.',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|hää}} det werjuun $4 faan sidj $3 üs kontroliaret kääntiakent.',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|hää}} det werjuun $4 faan sidj $3 automaatisk üs kontroliaret kääntiakent.',
+'logentry-newusers-newusers' => 'Brükerkonto $1 as {{GENDER:$2|iinracht}} wurden',
+'logentry-newusers-create' => 'Brükerkonto as faan $1 {{GENDER:$2|iinracht}} wurden.',
+'logentry-newusers-create2' => 'Brükerkonto $3 as faan $1 {{GENDER:$2|iinracht}} wurden',
+'logentry-newusers-byemail' => 'Brükerkonto $3 as faan $1 {{GENDER:$2|iinracht}} wurden, an det paaswurd as per e-mail tuschüürd wurden.',
+'logentry-newusers-autocreate' => 'Brükerkonto $1 as automaatisk {{GENDER:$2|iinracht}} wurden',
+'logentry-rights-rights' => '$1 {{GENDER:$2|hää}} det brükerskööl för $3 faan $4 tu $5 feranert.',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|hää}} det brükerskööl för $3 feranert.',
+'logentry-rights-autopromote' => '$1 as automaatisk faan $4 tu $5 {{GENDER:$2|tuwiset}} wurden.',
 'rightsnone' => '(-)',
 
+# Feedback
+'feedback-bugornote' => 'Wan dü en technisk probleem beskriiw wel, wees so gud an skriiw [$1 am di feeler].
+Ööders könst dü uk det formulaar oner brük. Dan komentaar woort tuup mä dan brükernööm an det werjuun faan dan browser üüb det sidj „[$3 $2]“ skrewen.',
+'feedback-subject' => 'Teemo:',
+'feedback-message' => 'Mädialang:',
+'feedback-cancel' => 'Ufbreeg',
+'feedback-submit' => 'Komentaar ufsjüür',
+'feedback-adding' => 'Komentaar woort tu det sidj skrewen ...',
+'feedback-error1' => 'Feeler: Ünbekäänd API-bööd',
+'feedback-error2' => 'Feeler: Bewerkin as skiaf gingen.',
+'feedback-error3' => 'Feeler: Nian API-oonswaar',
+'feedback-thanks' => 'Föl soonk. Dan komentaar as üüb det sidj „[$2 $1]“ skrewen wurden.',
+'feedback-close' => 'Klaar',
+'feedback-bugcheck' => 'Gud! Luke noch ans efter, of det ei ferlicht en [$1 bekäänden feeler] as.',
+'feedback-bugnew' => 'Haa ik efterluket. Nei feeler melde.',
+
+# Search suggestions
+'searchsuggest-search' => 'Schük',
+'searchsuggest-containing' => 'diar banen as ...',
+
+# API errors
+'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-empty-file' => 'Det datei, wat dü huuchsjüürd heest, as leesag.',
+'api-error-emptypage' => 'Dü mutst nian leesag sidjen nei iinstel.',
+'api-error-fetchfileerror' => "Intern feeler: Bi't ufrepen faan det datei as wat skiaf gingen.",
+'api-error-fileexists-forbidden' => 'En datei mä di nööm „$1“ as al diar. Hat koon ei auerskrewen wurd.',
+'api-error-fileexists-shared-forbidden' => "En date mä di nööm „$1“ as al uun't gemiansoom archiif an koon ei auerskrewen wurd.",
+'api-error-file-too-large' => 'Det datei, wat dü huuchsjüürd heest, as tu grat.',
+'api-error-filename-tooshort' => 'Di dateinööm as tu kurt.',
+'api-error-filetype-banned' => 'Son slach faan datei as ei tuläät.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|as nään tuläät slach faan datein|san nian tuläät slacher faan datein}}.
+{{PLURAL:$3|En tuläät slach as|Tuläät slacher san}} $2.',
+'api-error-filetype-missing' => 'Det datei, wat dü huuchschüür wel, hää nian dateiaanj.',
+'api-error-hookaborted' => 'Det feranerang, wat dü maage wulst, as ufbreegen wurden.',
+'api-error-http' => 'Intern feeler: Ferbinjang tu a server as skiaf gingen.',
+'api-error-illegal-filename' => 'Didiar dateinööm as ei tuläät.',
+'api-error-internal-error' => "Intern feeler: diar as wat skiaf gingen bi't huuchschüüren faan det datei tu det Wiki.",
+'api-error-invalid-file-key' => 'Intern feeler: Det datei as uun det tidjwiis archiif ei fünjen wurden.',
+'api-error-missingparam' => 'Intern feeler: Det uunfraag as ei hial uunkimen.',
+'api-error-missingresult' => 'Intern feeler: Küd ei luke, of det kopiarin loket hää.',
+'api-error-mustbeloggedin' => 'Dü skel di uunmelde, am datein huuchtuschüüren.',
+'api-error-mustbeposted' => 'Intern feeler: Ferkiard HTTP-muude.',
+'api-error-noimageinfo' => 'Det huuchschüüren hää loket, oober di server hää nian datei-dooten.',
+'api-error-nomodule' => 'Intern feeler: Diar as nian modul tu huuchsjüüren fäästlaanj wurden.',
+'api-error-ok-but-empty' => 'Intern feeler: Di server sait niks.',
+'api-error-overwrite' => 'Dü könst nian datei auerskriiw, wat al diar as.',
+'api-error-stashfailed' => 'Intern feeler: Di server küd nian tidjwiis datei seekre.',
+'api-error-publishfailed' => 'Intern feeler: Di server küd det tidjwiis datei ei widjer schüür.',
+'api-error-timeout' => 'Di server hää ei rochttidjag swaaret (time-out).',
+'api-error-unclassified' => 'Diar as irgentwat skiaf gingen.',
+'api-error-unknown-code' => 'Ünbekäänd feeler: „$1“',
+'api-error-unknown-error' => "Intern feeler: Bi't huuchschüüren faan det datei as wat skiaf gingen.",
+'api-error-unknown-warning' => 'Ünbekäänd wäärnang: $1',
+'api-error-unknownerror' => 'Ünbekäänd feeler: „$1“',
+'api-error-uploaddisabled' => 'Uun detdiar Wiki könst dü niks huuchschüür.',
+'api-error-verification-error' => 'Det datei, wat dü huuchschüür wel, as uunstaken of hää en ferkiard dateiaanj.',
+
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunden}}',
 'duration-minutes' => '$1 {{PLURAL:$1|minüüt|minüüten}}',
@@ -1895,4 +3746,7 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 'duration-centuries' => '$1 {{PLURAL:$1|juarhunert|juarhunerten}}',
 'duration-millennia' => '$1 {{PLURAL:$1|juardüüsen|juardüüsenen}}',
 
+# Image rotation
+'rotate-comment' => 'Bil am $1 {{PLURAL:$1|graad}} mä a klook dreid.',
+
 );
index 15a1cfd..93ce1c3 100644 (file)
@@ -141,11 +141,10 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Distapone fûr il gno recapit email tai messaçs di notifiche',
 'tog-shownumberswatching' => 'Mostre il numar di utents che a stan tignint di voli',
 'tog-fancysig' => 'Interprete lis firmis come test wiki (cence un leam automatic)',
-'tog-externaleditor' => 'Dopre un editôr esterni come opzion predeterminade (dome par utents esperts, a coventin impuestazions specifichis, [//www.mediawiki.org/wiki/Manual:External_editors cjale culì par altris informazions.])',
-'tog-externaldiff' => 'Dopre editôr difarencis esterni come opzion predeterminade',
 'tog-watchlisthideown' => 'Plate i miei cambiaments inte liste des pagjinis tignudis di voli',
 'tog-ccmeonemails' => 'Mandimi une copie dai messaçs che o mandi ai altris utents',
 'tog-showhiddencats' => 'Mostre categoriis platadis',
+'tog-useeditwarning' => 'Visimi cuant che o stoi par lassâ une pagjine dulà che a son cambiaments no salvâts',
 
 'underline-always' => 'Simpri',
 'underline-never' => 'Mai',
@@ -229,7 +228,7 @@ $messages = array(
 'cancel' => 'Scancele',
 'moredotdotdot' => 'Plui...',
 'mypage' => 'Mê pagjine',
-'mytalk' => 'Mês discussions',
+'mytalk' => 'Discussions',
 'anontalk' => 'Discussion par chest IP',
 'navigation' => 'somari',
 'and' => '&#32;e',
@@ -546,12 +545,13 @@ La password par cheste identitât e pues jessi cambiade su la pagjine ''[[Specia
 Tu puedis [[Special:Search/{{PAGENAME}}|cirî chest titul]] in altris pagjinis o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirî i regjistris leâts],
 o ben [{{fullurl:{{FULLPAGENAME}}|action=edit}} cambiâ cheste pagjine]</span>.',
 'noarticletext-nopermission' => 'Par cumò nol è nuie in cheste pagjine.
-Tu puedis [[Special:Search/{{PAGENAME}}|cirî chest titul]] in altris pagjinis o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirî i regjistris leâts].',
+Tu puedis [[Special:Search/{{PAGENAME}}|cirî chest titul]] in altris pagjinis o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirî i regjistris leâts]</span>, ma no tu âs a vonde permès par creâ cheste pagjine.',
 'userpage-userdoesnotexist' => 'La identitât "<nowiki>$1</nowiki>" no je di un utent regjistrât. Controle che tu vuelis pardabon creâ o modificâ cheste pagjine.',
 'clearyourcache' => "'''Ocjo: dopo vê salvât, tu podaressis scugnî netâ la cache dal to sgarfadôr par viodi i cambiaments.''' Par '''Mozilla / Firefox / Safari''': frache ''Torne a cjamâ'' tignint jù ancje il tast des maiusculis, o se no frache ''Ctrl-F5'' o ''Ctrl-R'' (''Command-R'' su Mac); par '''Konqueror''': frache ''Reload'' o il tast ''F5''; par '''Opera''' al pues jessi necessari disvuedâ dal dut la cache doprant il menù ''Tools → Preferencis''; par '''Internet Explorer:''' ten fracât il tast ''Ctrl'' cuant che tu cjalcjis su ''Aggiorna'' o frache ''Ctrl-F5''.",
 'updated' => '(Inzornât)',
 'note' => "'''Note:'''",
-'previewnote' => "'''Visiti che cheste e je dome une anteprime, e no je stade ancjemò salvade!'''",
+'previewnote' => "'''Visiti che cheste e je dome une anteprime.'''
+I tiei cambiaments no son stâts ancjemò salvâts!",
 'editing' => 'Cambiament di $1',
 'editingsection' => 'Cambiament di $1 (sezion)',
 'editingcomment' => 'Cambiament di $1 (gnove sezion)',
@@ -703,17 +703,9 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 'search-external' => 'Ricercje esterne',
 'searchdisabled' => 'La ricercje in {{SITENAME}} no je ative. Tu puedis doprâ Google intant. Sta atent che lis lôr tabelis sul contignût di {{SITENAME}} a puedin jessi pôc inzornadis.',
 
-# Quickbar
-'qbsettings' => 'Sbare svelte',
-'qbsettings-none' => 'Nissune',
-'qbsettings-fixedleft' => 'Fis a Çampe',
-'qbsettings-fixedright' => 'Fis a Drete',
-'qbsettings-floatingleft' => 'Flutuant a çampe',
-'qbsettings-floatingright' => 'Flutuant a diestre',
-
 # Preferences page
 'preferences' => 'Preferencis',
-'mypreferences' => 'mês preferencis',
+'mypreferences' => 'Preferencis',
 'prefs-edits' => 'Numar di cambiaments fats:',
 'prefsnologin' => 'No tu sês jentrât',
 'changepassword' => 'Gambie peraule clâf',
@@ -936,7 +928,7 @@ Par includi une figure intune pagjine, dopre un leam inte form
 'filehist-dimensions' => 'Dimensions',
 'filehist-filesize' => 'Dimension dal file',
 'filehist-comment' => 'Coment',
-'imagelinks' => 'Leams ae figure',
+'imagelinks' => 'Ûs dal file',
 'linkstoimage' => '{{PLURAL:$1|La pagjine ca sot e je leade|Lis $1 pagjinis ca sot a son leadis}} a cheste figure:',
 'nolinkstoimage' => 'No son pagjinis leadis a chest file.',
 'sharedupload' => 'Chest file al è ven di $1 e al pues jessi doprât di altris progjets.',
@@ -1043,7 +1035,7 @@ La descrizion su la sô [$2 pagjine di descrizion] e je mostrade ca sot.',
 'protectedtitles' => 'Titui protezûts',
 'listusers' => 'Liste dai utents',
 'usereditcount' => '$1 {{PLURAL:$1|contribût|contribûts}}',
-'usercreated' => 'Creât ai $1 a lis $2',
+'usercreated' => '{{GENDER:$3|Creât|Creade}} ai $1 a lis $2',
 'newpages' => 'Gnovis pagjinis',
 'newpages-username' => 'Non utent:',
 'ancientpages' => 'Pagjinis plui vecjis',
@@ -1122,7 +1114,7 @@ Cjale ancje lis [[Special:WantedCategories|categoriis desideradis]].',
 'listgrouprights-rights' => 'Dirits',
 'listgrouprights-members' => '(liste dai membris)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Messaç di pueste a chest utent',
 'emailpage' => 'Mande un messaç di pueste eletroniche al utent',
 'defemailsubject' => 'Messaç di {{SITENAME}}',
@@ -1140,7 +1132,7 @@ Cjale ancje lis [[Special:WantedCategories|categoriis desideradis]].',
 
 # Watchlist
 'watchlist' => 'Tignûts di voli',
-'mywatchlist' => 'Tignûts di voli',
+'mywatchlist' => 'Tignudis di voli',
 'watchlistfor2' => 'Par $1 $2',
 'nowatchlist' => 'Nissun element al è tignût di voli.',
 'watchnologin' => 'No tu sês jentrât',
@@ -1158,8 +1150,8 @@ e la pagjine e sarà '''gruessute''' te [[Special:RecentChanges|liste dai ultins
 'notanarticle' => 'Cheste pagjine no je une vôs',
 'watchnochange' => 'Nissun element di chei tignûts di voli al è stât cambiât tal periodi mostrât.',
 'watchlist-details' => '{{PLURAL:$1|E je $1 pagjine tignude|A son $1 pagjinis tignudis}} di voli, cence contâ lis pagjinis di discussion.',
-'wlheader-enotif' => 'Notifiche par pueste eletroniche ativade.',
-'wlheader-showupdated' => "Lis pagjinis gambiadis de ultime volte che tu lis âs cjaladis a son mostradis in '''gruessut'''",
+'wlheader-enotif' => 'Notifiche par pueste eletroniche ativade.',
+'wlheader-showupdated' => "Lis pagjinis gambiadis de ultime volte che tu lis âs cjaladis a son mostradis in '''gruessut'''",
 'watchlistcontains' => 'Tu stâs tignint di voli $1 {{PLURAL:$1|pagjine|pagjinis}}.',
 'wlnote' => "Ca sot {{PLURAL:$1|al è il cambiament plui recent|a son i '''$1''' cambiaments plui recents}} {{PLURAL:$2|inte ultime ore|intes '''$2''' oris passadis}}.",
 'wlshowlast' => 'Mostre ultimis $1 oris $2 zornadis $3',
@@ -1254,9 +1246,9 @@ Tu puedis cambiâ il nivel di protezion di cheste pagjine, ma chest nol varà ef
 'blanknamespace' => '(Principâl)',
 
 # Contributions
-'contributions' => 'Contribûts dal utent',
+'contributions' => 'Contribûts {{GENDER:$1|dal utent|de utente}}',
 'contributions-title' => 'Contribûts di $1',
-'mycontris' => 'Miei contribûts',
+'mycontris' => 'Contribûts',
 'contribsub2' => 'Par $1 ($2)',
 'nocontribs' => 'Nissun cambiament che al rispiete chescj criteris cjatât.',
 'uctop' => ' (su)',
@@ -1291,7 +1283,7 @@ Tu puedis cambiâ il nivel di protezion di cheste pagjine, ma chest nol varà ef
 'whatlinkshere-hideredirs' => '$1 re-indreçaments',
 'whatlinkshere-hidetrans' => '$1 inclusions',
 'whatlinkshere-hidelinks' => '$1 leams',
-'whatlinkshere-hideimages' => '$1 leams da figuris',
+'whatlinkshere-hideimages' => '$1 leams di files',
 'whatlinkshere-filters' => 'Filtris',
 
 # Block/unblock
@@ -1481,8 +1473,6 @@ Par plasê va su [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
 'nocredits' => 'Nissune informazion sui ricognossiments disponibil par cheste pagjine.',
 
 # Skin names
-'skinname-standard' => 'Classiche',
-'skinname-nostalgia' => 'Nostalgjie',
 'skinname-modern' => 'Moderne',
 
 # Browsing diffs
@@ -1534,7 +1524,7 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largjece',
 'exif-imagelength' => 'Altece',
 'exif-orientation' => 'Orientament',
@@ -1552,7 +1542,7 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
 'exif-contrast' => 'Control contrast',
 'exif-gpsaltitude' => 'Altitudin',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Cence compression',
 
 'exif-unknowndate' => 'Date no cognossude',
@@ -1568,7 +1558,7 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
 'namespacesall' => 'ducj',
 'monthsall' => 'ducj',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Conferme direzione di pueste',
 'confirmemail_noemail' => 'No tu âs metût une direzion di pueste eletroniche valide intes tôs [[Special:Preferences|preferencis]].',
 'confirmemail_text' => 'Cheste wiki ti domande di valid la to direzion di pueste eletroniche prime di doprâ lis funzions di email. Ative il boton ca sot par inviâ un codiç di conferme ae to direzion. Chest messaç al includarà un leam cuntun codiç; cjame il leam tal to sgarfadôr par confermâ la validitât de tô direzion.',
@@ -1637,9 +1627,6 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
 'version-license' => 'Licence',
 'version-software-version' => 'Version',
 
-# Special:FilePath
-'filepath-page' => 'Non dal file:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Non dal file:',
 'fileduplicatesearch-submit' => 'Cîr',
index a2ac05e..756e74a 100644 (file)
@@ -171,8 +171,6 @@ $messages = array(
 'tog-shownumberswatching' => 'It tal brûkers sjen litte dat dizze side folget',
 'tog-oldsig' => 'Hûdige sinjatuerprintallyk:',
 'tog-fancysig' => 'Sinjatuer as wikitekst behannelje (sûnder automatyske keppeling)',
-'tog-externaleditor' => 'Standert in eksterne tekstbewurker brûke (allinne foar experts - foar dizze funksje binne spesjale ynstellings nedich)',
-'tog-externaldiff' => 'Standert in ekstern ferlikingsprogramma brûke (allinne foar experts - foar dizze funksje binne spesjale ynstellings nedich)',
 'tog-showjumplinks' => '"gean nei"-tapaslikens-links ynskeakelje',
 'tog-uselivepreview' => '"live proefbyld" brûke (JavaScript nedich - eksperimenteel)',
 'tog-forceeditsummary' => 'Warskôgje at ik de gearfetting leech lit.',
@@ -960,14 +958,6 @@ Jo kinne ek in nammerûmte as foarheaksel brûke.",
 'search-external' => 'Utwindich sykje',
 'searchdisabled' => '<p>Op it stuit stiet it trochsykjen fan tekst út omdat dizze funksje tefolle kompjûterkapasiteit ferget. As we nije apparatuer krije, en dy is ûnderweis, dan wurdt dizze funksje wer aktyf. Oant salang kinne jo sykje fia Google:</p>',
 
-# Quickbar
-'qbsettings' => 'Menu',
-'qbsettings-none' => 'Ut',
-'qbsettings-fixedleft' => 'Lofts fêst',
-'qbsettings-fixedright' => 'Rjochts fêst',
-'qbsettings-floatingleft' => 'Lofts sweevjend',
-'qbsettings-floatingright' => 'Rjochts sweevjend',
-
 # Preferences page
 'preferences' => 'Ynstellings',
 'mypreferences' => 'Myn foarkarynstellings',
@@ -2117,10 +2107,6 @@ Sjoch: [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation], [//transl
 'spamprotectiontext' => "De side dy't jo fêstlizze woene is blokkearre troch in spam filter. Dit wurdt wierskynlik feroarsake troch in ferwizing nei in ekstern webstee.",
 'spamprotectionmatch' => 'De neikommende tekst hat it spam filter aktivearre: $1',
 
-# Skin names
-'skinname-standard' => 'Standert',
-'skinname-nostalgia' => 'Nostalgy',
-
 # Patrolling
 'markaspatrolleddiff' => 'Markearje as kontroleare',
 'markaspatrolledtext' => 'Markearje dizze side as kontrolearre',
@@ -2178,7 +2164,7 @@ Alle folgjende links dy't op deselde rigel steane, wurde behannele as útsûnder
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-samplesperpixel' => 'Oantal komponinten',
 'exif-xresolution' => 'Horizontale resolúsje',
 'exif-yresolution' => 'Fertikale resolúsje',
@@ -2316,11 +2302,6 @@ Wolle jo de side wier op 'e nij skriuwe?",
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Ferzje',
 
-# Special:FilePath
-'filepath' => 'Triempad',
-'filepath-page' => 'Triem:',
-'filepath-submit' => 'Pad',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sykje op duplikaten',
 'fileduplicatesearch-legend' => 'Sykje op duplikaten',
index 7139033..2fbaa9d 100644 (file)
@@ -124,8 +124,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Taispeán an méid úsáideoirí atá ag faire',
 'tog-oldsig' => 'Réamhamharc ar an síniú atá ann:',
 'tog-fancysig' => 'Sínithe bunúsacha mar vicítéacs (gan nasc uathoibríoch)',
-'tog-externaleditor' => 'Bain úsáid as eagarthóir seachtrach mar réamhshocrú (saineolaithe amháin, tá socrú speisialta de dhíth ort. [//www.mediawiki.org/wiki/Manual:External_editors Tuilleadh eolais.])',
-'tog-externaldiff' => 'Bain úsáid as difríocht sheachtrach mar réamhshocrú (saineolaithe amháin, tá socrú speisialta de dhíth ort. [//www.mediawiki.org/wiki/Manual:External_editors Tuilleadh eolais.])',
 'tog-showjumplinks' => 'Cumasaigh naisc insroichteachta “léim go dtí”',
 'tog-uselivepreview' => 'Bain úsáid as réamhamharc beo (JavaScript) (Turgnamhach)',
 'tog-forceeditsummary' => 'Cuir in iúl dom nuair a chuirim isteach achoimre eagair folamh',
@@ -823,14 +821,6 @@ Bain triail as ''all:'' a chur roimh d'iarratas chun an t-inneachar ar fad (leat
 'powersearch-togglenone' => 'Tada',
 'searchdisabled' => "Tá brón orainn! Mhíchumasaíodh an cuardach téacs iomlán go sealadach chun luas an tsuímh a chosaint. Idir an dá linn, is féidir leat an cuardach Google anseo thíos a úsáid - b'fhéidir go bhfuil sé as dáta.",
 
-# Quickbar
-'qbsettings' => 'Sainroghanna an bosca uirlisí',
-'qbsettings-none' => 'Faic',
-'qbsettings-fixedleft' => 'Greamaithe ar chlé',
-'qbsettings-fixedright' => 'Greamaithe ar dheis',
-'qbsettings-floatingleft' => 'Ag faoileáil ar chlé',
-'qbsettings-floatingright' => 'Ag faoileáil ar dheis',
-
 # Preferences page
 'preferences' => 'Sainroghanna',
 'mypreferences' => 'Sainroghanna',
@@ -1297,8 +1287,8 @@ agus beidh '''cló trom''' ar a theideal san [[Special:RecentChanges|liosta de n
 'watchnochange' => 'Níor athraíodh ceann ar bith de na leathanaigh atá ar do liosta faire,
 taobh istigh den tréimhse atá roghnaithe agat.',
 'watchlist-details' => 'Tá tú ag faire ar {{PLURAL:$1|leathanach amháin|$1 leathanaigh}}, gan leathanaigh phlé a chur san áireamh.',
-'wlheader-enotif' => 'Cumasaíodh fógraí riomhphoist.',
-'wlheader-showupdated' => "Tá '''cló trom''' ar leathanaigh a athraíodh ón uair is deireanaí a d'fhéach tú orthu.",
+'wlheader-enotif' => 'Cumasaíodh fógraí riomhphoist.',
+'wlheader-showupdated' => "Tá '''cló trom''' ar leathanaigh a athraíodh ón uair is deireanaí a d'fhéach tú orthu.",
 'watchmethod-recent' => 'ag seiceáil na athruithe deireanacha ar do chuid leathanaigh faire',
 'watchmethod-list' => 'ag seiceáil na leathanaigh faire ar do chuid athruithe deireanacha',
 'watchlistcontains' => 'Tá {{PLURAL:$1|leathanach amháin|$1 leathanaigh}} ar do liosta faire.',
@@ -1780,13 +1770,8 @@ iarradh sábháil. Is dócha gur nasc chuig suíomh seachtrach ba chúis leis.',
 'spambot_username' => 'MediaWiki turscar glanadh',
 
 # Skin names
-'skinname-standard' => 'Clasaiceach',
-'skinname-nostalgia' => 'Sean-nós',
 'skinname-cologneblue' => 'Gorm Köln',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MoChraiceann',
-'skinname-chick' => 'Sicín',
-'skinname-simple' => 'Simplí',
 'skinname-modern' => 'Nua-aimseartha',
 'skinname-vector' => 'Veicteoir',
 
@@ -1860,7 +1845,7 @@ Beidh na cinn eile ceilte de réir réamhshocraithe.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Leithead',
 'exif-imagelength' => 'Airde',
 'exif-bitspersample' => 'Gíotáin sa chomhpháirt',
@@ -1977,7 +1962,7 @@ Beidh na cinn eile ceilte de réir réamhshocraithe.
 'exif-languagecode' => 'Teanga',
 'exif-iimcategory' => 'Catagóir',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Neamh-chomhbhrúite',
 
 'exif-unknowndate' => 'Dáta anaithnid',
@@ -2209,11 +2194,6 @@ Rachaidh an cód deimhnithe seo as feidhm ag $4.',
 'version-software-version' => 'Leagan',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Cosán comhaid',
-'filepath-page' => 'Comhad:',
-'filepath-submit' => 'Gabh',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Ainm comhaid:',
 'fileduplicatesearch-submit' => 'Cuardaigh',
index 2a20940..a52e9a3 100644 (file)
@@ -124,8 +124,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Bildirmää maillerinde e-mail adresimi göster.',
 'tog-shownumberswatching' => 'İzlään kullanıcı sayısın göster',
 'tog-fancysig' => 'Çii imza (İmzanız görüner nesoy onu yukarda belirttiniz. Sayfanıza avtomatik baalantı yaratılmaycêk)',
-'tog-externaleditor' => 'Düzmää başka editor programmasılan yap',
-'tog-externaldiff' => 'Karşılaştırmakları dış programmalan yap.',
 'tog-showjumplinks' => '"Git" baalantısın işlet',
 'tog-uselivepreview' => 'Tez cannı ön siiri kullan (JavaScript) (êksperimental)',
 'tog-forceeditsummary' => 'Bana haber ver ne zaman ani kısa annatmanı boş braacam',
@@ -797,7 +795,7 @@ Sizin bakmaa [[Special:Watchlist|listasındaki]] sayfalar verildi '''kalın''' b
 # Special:ListGroupRights
 'listgrouprights-members' => '(azaların listası)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Gönder bu kullanıcıya bir e-mail',
 
 # Watchlist
index 983559c..3456d6e 100644 (file)
@@ -63,8 +63,6 @@ $messages = array(
 'tog-shownumberswatching' => '显示有几多人监视',
 'tog-oldsig' => '现有𠮶签名:',
 'tog-fancysig' => '搦签名以维基字对待(冇自动连结)',
-'tog-externaleditor' => '默认用外部编辑器(专家用𠮶功能,要到倷𠮶电脑上头特别𠮶设置一下)',
-'tog-externaldiff' => '默认用外部差异比较器(专家用𠮶功能,要到汝𠮶电脑上头特别𠮶设置下。[//www.mediawiki.org/wiki/Manual:External_editors 别𠮶信息])',
 'tog-showjumplinks' => '启用“跳到”访问链接',
 'tog-uselivepreview' => '使用即时预览(JavaScript)(实验中)',
 'tog-forceeditsummary' => '冇改动注解时要同偶话',
@@ -776,14 +774,6 @@ $2',
 'powersearch-field' => '寻',
 'searchdisabled' => '{{SITENAME}}𠮶搜索功能已经关闭。倷可以用Google寻吖。但系佢𠮶索引可能系早先𠮶。',
 
-# Quickbar
-'qbsettings' => '快捷导航条',
-'qbsettings-none' => '冇',
-'qbsettings-fixedleft' => '左首固定',
-'qbsettings-fixedright' => '右首固定',
-'qbsettings-floatingleft' => '左首漂移',
-'qbsettings-floatingright' => '左首漂移',
-
 # Preferences page
 'preferences' => '参数设置',
 'mypreferences' => '偶𠮶参数设置',
@@ -1271,8 +1261,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'notanarticle' => '伓系文章',
 'watchnochange' => '一径到显示𠮶时间之内,倷眏到𠮶页面冇改动。',
 'watchlist-details' => '$1只页面(伓算讨论页) 拖眏到哩',
-'wlheader-enotif' => '启动嘞email通知功能。',
-'wlheader-showupdated' => "上回倷眵𠮶页面改动𠮶部分用'''粗体'''显到",
+'wlheader-enotif' => '启动嘞email通知功能。',
+'wlheader-showupdated' => "上回倷眵𠮶页面改动𠮶部分用'''粗体'''显到",
 'watchmethod-recent' => '眵吖拖眏到𠮶页面𠮶最近编辑',
 'watchmethod-list' => '望吖监视页里头最晏𠮶改动',
 'watchlistcontains' => '倷𠮶监视列表包含$1只页面。',
@@ -1858,7 +1848,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '阔',
 'exif-imagelength' => '高',
 'exif-bitspersample' => '每像素byte数',
@@ -1972,7 +1962,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS日期',
 'exif-gpsdifferential' => 'GPS差动修正',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '冇压缩',
 
 'exif-unknowndate' => '未知𠮶日期',
@@ -2234,11 +2224,6 @@ $3
 'version-software' => '装正𠮶软件',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件:',
-'filepath-submit' => '路径',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => '文件名:',
 'fileduplicatesearch-submit' => '寻',
index 95b292c..158f01f 100644 (file)
@@ -58,14 +58,14 @@ $messages = array(
 # User preference toggles
 'tog-underline' => '下劃連結',
 'tog-justify' => '對到段落',
-'tog-hideminor' => '該æ\9c\9då­\90å\97°æ\94¹å\8b\95å¼\86å\88°å\97°ç´°ä¿®æ\94¹',
+'tog-hideminor' => '該æ\99\9då­\90å\97°æ\94¹å\8b\95å¼\86å\88°å\97°ç´°ä¿®æ\94¹',
 'tog-hidepatrolled' => '到箇晝子嗰修改裡頭弆到巡查過嗰編輯',
 'tog-newpageshidepatrolled' => '到新頁清單裡頭弆到巡查過嗰頁面',
 'tog-extendwatchlist' => '增加監視清單來顯示全部改動,不淨係最晏嗰',
 'tog-usenewrc' => '用強化版最晏嗰改動(需要JavaScript)',
 'tog-numberheadings' => '標題自動編號',
 'tog-showtoolbar' => '顯示編輯工具欄(JavaScript)',
-'tog-editondblclick' => 'æ\8c\89å\85©ä¸\8bæ\94¹å\90\96(JavaScript)',
+'tog-editondblclick' => 'æ\8dºå\85©ä¸\8bä¾\86æ\94¹ä¸\8b(JavaScript)',
 'tog-editsection' => '可以用[編寫]連結來編寫個別段落',
 'tog-editsectiononrightclick' => '可以按右鍵來編寫隻把子段落(JavaScript)',
 'tog-showtoc' => '超過三隻標題就顯到目錄',
@@ -85,8 +85,6 @@ $messages = array(
 'tog-shownumberswatching' => '顯示有幾多人監視',
 'tog-oldsig' => '現有嗰簽名:',
 'tog-fancysig' => '搦簽名以維基字對待(冇自動連結)',
-'tog-externaleditor' => '默認用外部編輯器(專家用嗰功能,要到倷嗰電腦上頭特別嗰設置一下)',
-'tog-externaldiff' => '默認用外部差異比較器(專家用嗰功能,要到汝嗰電腦上頭特別嗰設置下。[//www.mediawiki.org/wiki/Manual:External_editors 別嗰信息])',
 'tog-showjumplinks' => '啟用“跳到”訪問連結',
 'tog-uselivepreview' => '使用即時預覽(JavaScript)(實驗中)',
 'tog-forceeditsummary' => '冇改動注解時要同我話',
@@ -229,7 +227,7 @@ $messages = array(
 'searcharticle' => '去',
 'history' => '文章歷史',
 'history_short' => '歷史',
-'updatedmarker' => '最末道瀏覽後嗰改動',
+'updatedmarker' => '頂晏嗰許到瀏覽後嗰改動',
 'printableversion' => '可打印版本',
 'permalink' => '永久連結',
 'print' => '打印',
@@ -255,8 +253,8 @@ $messages = array(
 'postcomment' => '話滴想法',
 'articlepage' => '看吖文章',
 'talk' => '談詑',
-'views' => '望',
-'toolbox' => 'å·¥å\85·盒',
+'views' => '望',
+'toolbox' => '家業盒',
 'userpage' => '眵吖用戶頁',
 'projectpage' => '眵吖計劃頁',
 'imagepage' => '眵吖媒體頁',
@@ -268,10 +266,10 @@ $messages = array(
 'otherlanguages' => '別嗰話',
 'redirectedfrom' => '(從$1跳過來)',
 'redirectpagesub' => '跳轉頁',
-'lastmodifiedat' => '箇頁晏嗰改動係:$1 $2。',
-'viewcount' => 'ç®\87é \81æ\8b\95人ç\9cµå\98\9e$1回。',
+'lastmodifiedat' => '箇頁晏嗰改動係:$1 $2。',
+'viewcount' => 'ç®\87é \81æ\8b\95人ç\9cµå\93©$1回。',
 'protectedpage' => '拕保護頁',
-'jumpto' => 'è·³å\88°:',
+'jumpto' => 'è½\89å\8e»:',
 'jumptonavigation' => '導航',
 'jumptosearch' => '尋',
 'view-pool-error' => '不過意,箇隻伺服器到箇時間超吥最大負荷。
@@ -311,13 +309,13 @@ $1',
 'retrievedfrom' => '版本頁「$1」',
 'youhavenewmessages' => '汝有 $1 ($2).',
 'newmessageslink' => '新消息',
-'newmessagesdifflink' => '晏嗰改動',
+'newmessagesdifflink' => '晏嗰改動',
 'youhavenewmessagesmulti' => '$1 上有倷嗰新消息',
 'editsection' => '編寫',
 'editold' => '編寫',
-'viewsourceold' => '望原碼',
+'viewsourceold' => '望原碼',
 'editlink' => '編輯',
-'viewsourcelink' => '望原碼',
+'viewsourcelink' => '望原碼',
 'editsectionhint' => '編寫段落:$1',
 'toc' => '目錄',
 'showtoc' => '敨開',
@@ -371,7 +369,7 @@ MySQL回到錯誤 "<tt>$3: $4</tt>"。',
 來自函數“$2”。
 MySQL回到錯誤“$3: $4”。',
 'laggedslavemode' => '警告:頁面可能冇有新近內容。',
-'readonly' => 'è³\87æ\96\99庫ä¸\8aæ­£é\8e\96å\9b\89',
+'readonly' => 'è³\87æ\96\99庫ä¸\8aæ­£é\8e\96å\93©',
 'enterlockreason' => '請輸入鎖到資料庫嗰理由,包括預計幾時間解鎖',
 'readonlytext' => '資料庫上嘞鎖改伓正,可能佢正維修中,搞正嘞仰上會還原。管理員嗰解釋: $1',
 'missing-article' => '資料庫冇尋到倷要嗰版面,「$1」 $2。
@@ -474,8 +472,8 @@ $2',
 'noemailprefs' => '話正隻email來用箇隻功能',
 'emailconfirmlink' => '確認倷嗰email',
 'invalidemailaddress' => '電子郵件地址嗰格式伓對,請輸隻對嗰電子郵件地址或者清吥箇隻輸入框。',
-'accountcreated' => '帳戶扤正嘍',
-'accountcreatedtext' => '扤正嘍$1嗰帳戶。',
+'accountcreated' => '帳戶舞正哩',
+'accountcreatedtext' => '舞正哩$1嗰帳戶。',
 'createaccount-title' => '到{{SITENAME}}創建嗰帳戶',
 'createaccount-text' => '有人到{{SITENAME}}用倷嗰電子郵件地址開設嘍隻名字係 "$2" 嗰新帳戶($4),密碼係 "$3" 。請倷仰上登錄同到修改密碼。
 
@@ -529,8 +527,8 @@ $2',
 'missingcommentheader' => "''提示:''' 汝嗰評論冇提供標題。若係汝捺過到{{int:savearticle}}嗰話,汝保存嗰編輯就會冇標題。",
 'summary-preview' => '摘要預覽:',
 'subject-preview' => '主題/頭條預覽:',
-'blockedtitle' => 'ç\94¨æ\88¶å°\81å\88°å\98\9e',
-'blockedtext' => "倷嗰用戶名或IP地址拕$1封到嘞
+'blockedtitle' => 'ç\94¨æ\88¶å°\81å\88°å\93©',
+'blockedtext' => "汝嗰用戶名或IP地址拕$1封到哩
 
 箇道封鎖係$1封嗰。個中原因係''$2''。
 
@@ -538,7 +536,7 @@ $2',
 * 箇回封鎖嗰到期時間係:$6
 * 對於拕查封嗰人:$7
 
-倷聯繫得正$1或別嗰[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論箇回封鎖。除非倷到倷嗰[[Special:Preferences|帳號參數設置]]裡度設正嘞有效嗰email,伓然嗰話倷係用伓正「email到箇隻用戶」嗰功能。設正嘞有效嗰email後,箇隻功能係伓會拕封到嗰。倷嗰IP地址係$3,許拕封到嗰ID係 #$5。請倷到全部嗰查詢裡度注明箇隻地址同/或查封ID。",
+汝聯繫得正$1或別嗰[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論箇回封鎖。除吥到汝嗰[[Special:Preferences|帳號參數設置]]裡度設正哩有效嗰email,伓然嗰話汝係用伓正「email到箇隻用戶」嗰功能。設正哩有效嗰email後,箇隻功能係伓會拕封到嗰。汝嗰IP地址係$3,許拕封到嗰ID係 #$5。請汝到全部嗰查詢裡度注明箇隻地址同/或查封ID。",
 'autoblockedtext' => '別嗰人用過倷嗰IP地址,故係佢拕自動鎖到嘞。封佢嗰人係$1.
 下首係封鎖嗰理由:
 
@@ -568,7 +566,7 @@ $2',
 若係汝伓係特事來到箇首,捺吖瀏覽器嗰「去還」鍵即得去還。',
 'anontalkpagetext' => "---- ''箇係匿名用戶嗰討論頁,話伓定佢哈冇開隻帳戶。別人單用得正IP地址同佢聯繫。箇隻IP地址可能有好幾隻用戶共用。如果倷係匿名用戶,覺得箇頁嗰內容同倷冇關,歡迎去[[Special:UserLogin|開隻新帳戶或登入]],省得同別嗰匿名用戶扤混來。''",
 'noarticletext' => '眼下箇頁哈冇內容,汝到別嗰頁面[[Special:Search/{{PAGENAME}}|尋得正箇頁嗰標題]],
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 尋有關日誌]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編寫箇頁]</span>。',
+<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>。',
 'clearyourcache' => "'''注意:''' 保存之後, 倷要清吥瀏覽器嗰緩存才眵得正改嗰內容。 '''Mozilla / Firefox / Safari:''' 按到 ''Shift'' 接到按''刷新''(或按吖''Ctrl-Shift-R'',到蘋果Mac上按''Cmd-Shift-R'');'''IE:''' 按到 ''Ctrl''接到按''刷新'',或按吖''Ctrl-F5'';'''Konqueror:''' 單只要按 ''刷新'';'''Opera:''' 用戶要到 ''工具-設置'' 完全嗰清除緩存。",
@@ -577,7 +575,7 @@ $2',
 'usercsspreview' => "'''注意倷單係到預覽倷個人嗰 CSS,內容哈冇保存!'''",
 'userjspreview' => "'''注意倷單係到測試/預覽倷個人嗰 JavaScript,內容哈冇保存!'''",
 'userinvalidcssjstitle' => "'''警告:''' 冇\"\$1\"嗰皮膚。請記到自定義嗰 .css 同 .js 頁要用小寫。就話,{{ns:user}}:Foo/vector.css 伓等同 {{ns:user}}:Foo/Vector.css。",
-'updated' => 'ï¼\88æ\9b´æ\96°æ­£å\98\8d)',
+'updated' => 'ï¼\88æ\9b´æ\96°æ­£å\93©)',
 'note' => "'''注意:'''",
 'previewnote' => "'''請記到箇光係預覽,內容哈冇保存!'''",
 'previewconflict' => '箇隻預覽係上首文字編輯區嗰內容。倷選擇保存嗰話佢才會保存到。',
@@ -635,7 +633,7 @@ $2',
 
 汝要想下接得編輯箇頁嗰必要性。
 為到方便,箇頁嗰刪除記錄已經提供嘚下首:",
-'moveddeleted-notice' => 'ç®\87é\9a»ç\89\88é\9d¢å·²ç¶\93æ\8b\95å\88ªå\90¥å\98\8d
+'moveddeleted-notice' => 'ç®\87é\9a»ç\89\88é\9d¢å·²ç¶\93æ\8b\95å\88ªå\90¥å\93©
 下頭提供箇隻版面嗰刪除日誌,以供參考。',
 'edit-conflict' => '編輯仗。',
 
@@ -669,14 +667,14 @@ $2',
 'cur' => '箇下',
 'next' => '之後',
 'last' => '先頭',
-'page_first' => '早',
-'page_last' => '晏',
+'page_first' => '早',
+'page_last' => '晏',
 'histlegend' => "差異選擇:標到伓共樣版本嗰單選鍵,接到捺吖督上嗰鍵對比吖。<br />
-說明:'''({{int:cur}})'''係跟得眼前版本嗰比較,'''({{int:last}})'''係跟到先頭修改版本嗰比較,細 = 細修改。",
+說明:'''({{int:cur}})'''係跟得如今版本嗰比較,'''({{int:last}})'''係跟到先頭修改版本嗰比較,細 = 細修改。",
 'history-fieldset-title' => '瀏覽歷史',
-'history-show-deleted' => '係刪吥嗰',
-'histfirst' => '早嗰版本',
-'histlast' => '晏嗰版本',
+'history-show-deleted' => '係刪吥嗰',
+'histfirst' => '早嗰版本',
+'histlast' => '晏嗰版本',
 'historysize' => '({{PLURAL:$1|1 字節|$1 字節}})',
 'historyempty' => '(空)',
 
@@ -688,8 +686,8 @@ $2',
 
 # Revision deletion
 'rev-deleted-comment' => '(注釋挪吥嘞)',
-'rev-deleted-user' => 'ï¼\88ç\94¨æ\88¶å\90\8dæ\8cªå\90¥å\98\9e)',
-'rev-deleted-event' => 'ï¼\88é \85ç\9b®æ\8cªå\90¥å\98\9e)',
+'rev-deleted-user' => 'ï¼\88ç\94¨æ\88¶å\90\8dæ\8cªå\90¥å\93©)',
+'rev-deleted-event' => 'ï¼\88é \85ç\9b®æ\8cªå\90¥å\93©)',
 'rev-deleted-text-permission' => '箇頁嗰改動從共用文檔挪吥嘞。到[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 刪除日誌] 裡度倷話伓定有詳細嗰資料。',
 'rev-deleted-text-view' => '箇頁嗰改動從共用文檔挪吥嘞。作為本站嗰管理員,倷查看得正;到[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 刪除日誌] 裡度有詳細嗰資料。',
 'rev-delundel' => '顯示/弆到',
@@ -714,7 +712,7 @@ $2',
 'revdelete-log' => '原因:',
 'revdelete-submit' => '應用到選正嗰修改',
 'revdelete-success' => "'''修訂嗰可見性設置正嘍。'''",
-'logdelete-success' => "'''äº\8b件å\97°å\8f¯è¦\8bæ\80§è¨­ç½®æ­£å\98\8d。'''",
+'logdelete-success' => "'''äº\8b件å\97°å\8f¯è¦\8bæ\80§è¨­ç½®æ­£å\93©。'''",
 'revdel-restore' => '改動可見性',
 'revdel-restore-deleted' => '刪吥嗰修訂版',
 'revdel-restore-visible' => '相得到嗰修訂版',
@@ -752,7 +750,7 @@ $2',
 'searchresulttext' => '有關嗰{{SITENAME}}嗰更多資料,請參看[[{{MediaWiki:Helppage}}|{{int:help}}]]。',
 'searchsubtitle' => "用'''[[:$1]]'''",
 'searchsubtitleinvalid' => "用'''$1'''尋",
-'toomanymatches' => 'è¿\94å\9b\9eå¤\9aå\82·å\98\8då\97°çµ\90æ\9e\9cï¼\8cè«\8b試å\90\96用別嗰詞語尋過',
+'toomanymatches' => 'è¿\94å\9b\9eå¤\9aå\82·å\93©å\97°çµ\90æ\9e\9cï¼\8cè«\8bè¼\83ä¸\8b用別嗰詞語尋過',
 'titlematches' => '文章標題符合',
 'notitlematches' => '冇頁面同文章標題符合',
 'textmatches' => '頁面內容符合',
@@ -762,9 +760,9 @@ $2',
 'prevn-title' => '頭$1隻{{PLURAL:$1|結果}}',
 'nextn-title' => '後$1隻結果',
 'shown-title' => '每頁顯示$1隻{{PLURAL:$1|結果}}',
-'viewprevnext' => '望($1 {{int:pipe-separator}} $2) ($3)',
+'viewprevnext' => '望($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''箇隻wiki已有一隻叫「[[:$1]]」嗰頁。'''",
-'searchmenu-new' => "'''å\98\9a箇隻wiki上建立「[[:$1]]」頁!'''",
+'searchmenu-new' => "'''å\88°箇隻wiki上建立「[[:$1]]」頁!'''",
 'searchhelp-url' => 'Help:説明',
 'searchprofile-articles' => '內容頁',
 'searchprofile-project' => '幫助同得計劃頁',
@@ -798,14 +796,6 @@ $2',
 'powersearch-field' => '尋',
 'searchdisabled' => '{{SITENAME}}嗰搜索功能已經關閉。倷可以用Google尋吖。但係佢嗰索引可能係早先嗰。',
 
-# Quickbar
-'qbsettings' => '快捷導航條',
-'qbsettings-none' => '冇',
-'qbsettings-fixedleft' => '左首固定',
-'qbsettings-fixedright' => '右首固定',
-'qbsettings-floatingleft' => '左首漂移',
-'qbsettings-floatingright' => '左首漂移',
-
 # Preferences page
 'preferences' => '參數設置',
 'mypreferences' => '我嗰參數設置',
@@ -818,10 +808,10 @@ $2',
 'datedefault' => '默認項目',
 'prefs-datetime' => '日期同到時間',
 'prefs-personal' => '用戶介紹',
-'prefs-rc' => '最近更改',
+'prefs-rc' => '頂晏嗰改動',
 'prefs-watchlist' => '監視列表',
-'prefs-watchlist-days' => '監視列表顯示久嗰日數:',
-'prefs-watchlist-edits' => '加強版嗰監視列表顯示多更改數目:',
+'prefs-watchlist-days' => '監視列表顯示久嗰日數:',
+'prefs-watchlist-edits' => '加強版嗰監視列表顯示多更改數目:',
 'prefs-misc' => '雜項',
 'saveprefs' => '存到參數',
 'resetprefs' => '設過參數',
@@ -831,9 +821,9 @@ $2',
 'searchresultshead' => '設置尋到嗰結果',
 'resultsperpage' => '設置尋到嗰連結數',
 'stub-threshold' => '<a href="#" class="stub">細文連結</a>格式門檻:',
-'recentchangesdays' => '最近更改中嗰顯示日數:',
+'recentchangesdays' => '頂晏嗰改動嗰顯示日數:',
 'recentchangescount' => '最近更改中嗰編輯數:',
-'savedprefs' => 'å\80·å\97°å\80\8b人å\8f\83æ\95¸è¨­ç½®ä¿\9då­\98æ­£å\98\9e。',
+'savedprefs' => 'å\80·å\97°å\80\8b人å\8f\83æ\95¸è¨­ç½®ä¿\9då­\98æ­£å\93©。',
 'timezonelegend' => '時區:',
 'localtime' => '當地時區',
 'timezoneoffset' => '時差¹',
@@ -901,10 +891,10 @@ $2',
 
 # Recent changes
 'nchanges' => '$1道改動',
-'recentchanges' => '晏嗰改動',
+'recentchanges' => '晏嗰改動',
 'recentchanges-legend' => '箇晝子嗰更改選項',
-'recentchanges-summary' => '跟到箇隻wiki上嗰æ\9c\80æ\96°æ\94¹å\8b\95ã\80\82',
-'recentchanges-feed-description' => '跟到箇隻 wiki 上集合嗰最後改動。',
+'recentchanges-summary' => '跟到箇隻wiki上嗰é \82æ\99\8få\97°æ\94¹å\8b\95ã\80\82',
+'recentchanges-feed-description' => '跟到箇隻 wiki 上集合嗰頂晏嗰改動。',
 'recentchanges-label-newpage' => '箇隻編輯會建立隻新頁',
 'recentchanges-label-minor' => '箇係隻細修改',
 'recentchanges-label-bot' => '箇隻編輯係機器人舞嗰',
@@ -918,7 +908,7 @@ $2',
 'rcshowhideanons' => '$1匿名用戶嗰編輯',
 'rcshowhidepatr' => '$1檢查過嗰編輯',
 'rcshowhidemine' => '$1我嗰編輯',
-'rclinks' => '顯示最晏$2日之內最新嗰$1回改動。<br />$3',
+'rclinks' => '顯示頂晏$2日之內頂新嗰$1回改動。<br />$3',
 'diff' => '差異',
 'hist' => '歷史',
 'hide' => '弆到',
@@ -939,8 +929,8 @@ $2',
 'recentchangeslinked-toolbox' => '連結頁嗰更改',
 'recentchangeslinked-title' => '連結頁嗰改動到 "$1"',
 'recentchangeslinked-noresult' => '箇段時間嗰連結頁冇更改。',
-'recentchangeslinked-summary' => "箇隻特殊頁列出箇頁連出去頁面嗰最晏改動(或係某隻分類嗰頁面)。
-[[Special:Watchlist|嗰監視列表]]頁面會用'''粗體'''顯到。",
+'recentchangeslinked-summary' => "箇隻特殊頁列出箇頁連出去頁面嗰頂晏嗰改動(或係某隻分類嗰頁面)。
+[[Special:Watchlist|嗰監視列表]]頁面會用'''粗體'''顯到。",
 'recentchangeslinked-page' => '頁面名子:',
 'recentchangeslinked-to' => '顯示連到搦出來嗰頁面',
 
@@ -995,7 +985,7 @@ $2',
 'uploadwarning' => '上傳警告',
 'savefile' => '保存檔案',
 'uploadedimage' => '上傳正哩"[[$1]]"',
-'overwroteimage' => 'ä¸\8aå\82³æ­£å\98\9e"[[$1]]"嗰新版本',
+'overwroteimage' => 'ä¸\8aå\82³æ­£å\93©"[[$1]]"嗰新版本',
 'uploaddisabled' => '上傳伓正',
 'uploaddisabledtext' => '上傳伓正文件到{{SITENAME}}。',
 'uploadscripted' => '箇隻檔案包到可能會誤導網絡瀏覽器錯誤解釋嗰 HTML 或腳本代碼。',
@@ -1005,7 +995,7 @@ $2',
 'watchthisupload' => '眏到箇頁',
 'filewasdeleted' => '先前有隻同名檔案上傳後又拕刪吥嘞。上傳箇隻檔案之前倷非要檢查$1。',
 'filename-bad-prefix' => "倷上傳嗰檔案名係以'''\"\$1\"'''做開頭嗰,通常箇種冇意義嗰名字係數碼相機度嗰自動編排。請到倷嗰檔案揀過隻更加有意義嗰名字。",
-'upload-success-subj' => 'ä¸\8aå\82³æ­£å\98\9e',
+'upload-success-subj' => 'ä¸\8aå\82³æ­£å\93©',
 
 'upload-proto-error' => '協定錯誤',
 'upload-proto-error-text' => '遠程上傳要求 URL 用 <code>http://</code> 或 <code>ftp://</code> 開頭。',
@@ -1043,7 +1033,7 @@ $2',
 'filehist-help' => '按到日期/時間去眵吖許時間有過嗰檔案。',
 'filehist-deleteall' => '全部刪掉',
 'filehist-deleteone' => '刪吥箇隻',
-'filehist-revert' => '還原',
+'filehist-revert' => '還原',
 'filehist-current' => '眼前',
 'filehist-datetime' => '日期/時間',
 'filehist-thumb' => '縮圖',
@@ -1067,9 +1057,9 @@ $2',
 'filerevert-legend' => '恢復檔案',
 'filerevert-intro' => "眼下倷恢復嘚'''[[Media:$1|$1]]'''到[$4 於$2 $3嗰版本]。",
 'filerevert-comment' => '理由:',
-'filerevert-defaultcomment' => '恢復到嘞$1, $2嗰版本',
+'filerevert-defaultcomment' => '還原到哩$1, $2嗰版本',
 'filerevert-submit' => '恢復',
-'filerevert-success' => "'''[[Media:$1|$1]]'''恢復到嘞[$4 於$2 $3嗰版本]。",
+'filerevert-success' => "'''[[Media:$1|$1]]'''還原到哩[$4 於$2 $3嗰版本]。",
 'filerevert-badversion' => '箇隻檔案所提供嗰時間標記並冇早先嗰本地版本。',
 
 # File deletion
@@ -1079,8 +1069,8 @@ $2',
 'filedelete-intro-old' => "倷正刪吥'''[[Media:$1|$1]]'''到[$4 $2 $3]嗰版本。",
 'filedelete-comment' => '原因:',
 'filedelete-submit' => '刪吥',
-'filedelete-success' => "'''$1'''å\88ªå\90¥å\98\9e。",
-'filedelete-success-old' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'æ\96¼ $2 $3 å\97°ç\89\88æ\9c¬å\88ªå\90¥å\98\9e。</span>',
+'filedelete-success' => "'''$1'''å\88ªå\90¥å\93©。",
+'filedelete-success-old' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'æ\96¼ $2 $3 å\97°ç\89\88æ\9c¬å\88ªå\90¥å\93©。</span>',
 'filedelete-nofile' => "{{SITENAME}}箇隻網站伓存在'''$1'''。",
 'filedelete-nofile-old' => "按到指定屬性嗰情況,箇首冇'''$1'''到嗰版本。",
 'filedelete-otherreason' => '別嗰/附加緣故:',
@@ -1132,10 +1122,10 @@ $2',
 'statistics-users' => '註冊過嗰[[Special:ListUsers|用戶]]',
 'statistics-users-active' => '活躍用戶',
 'statistics-users-active-desc' => '頭$1日操作過嗰用戶',
-'statistics-mostpopular' => '眵嗰人多嗰頁面',
+'statistics-mostpopular' => '眵嗰人多嗰頁面',
 
 'disambiguations' => '扤清楚頁',
-'disambiguationspage' => 'Template:清楚',
+'disambiguationspage' => 'Template:清楚',
 'disambiguations-text' => "底下嗰頁面都有到'''扤清楚頁'''嗰連結, 但係佢俚應當係連到正當嗰標題。<br />
 如果一隻頁面係連結自[[MediaWiki:Disambiguationspage]],佢會拕當成扤清楚頁。",
 
@@ -1154,7 +1144,7 @@ $2',
 'withoutinterwiki-legend' => '前綴',
 'withoutinterwiki-submit' => '顯到',
 
-'fewestrevisions' => '改得少嗰文章',
+'fewestrevisions' => '改得少嗰文章',
 
 # Miscellaneous special pages
 'nbytes' => '$1字節',
@@ -1175,12 +1165,12 @@ $2',
 'popularpages' => '熱門頁面',
 'wantedcategories' => '等撰嗰分類',
 'wantedpages' => '等撰嗰頁面',
-'mostlinked' => '多連結嗰頁面',
-'mostlinkedcategories' => '多連結嗰分類',
-'mostlinkedtemplates' => '多連結嗰模板',
-'mostcategories' => '多分類嗰文章',
-'mostimages' => '連結多嗰圖像',
-'mostrevisions' => '最常改動嗰文章',
+'mostlinked' => '多連結嗰頁面',
+'mostlinkedcategories' => '多連結嗰分類',
+'mostlinkedtemplates' => '多連結嗰模板',
+'mostcategories' => '多分類嗰文章',
+'mostimages' => '連結多嗰圖像',
+'mostrevisions' => '頂多改動嗰文章',
 'prefixindex' => '首碼索引',
 'shortpages' => '短文章',
 'longpages' => '長文章',
@@ -1206,7 +1196,7 @@ $2',
 
 # Book sources
 'booksources' => '書籍來源',
-'booksources-search-legend' => '尋書籍來源',
+'booksources-search-legend' => '尋書籍來源',
 'booksources-go' => '跳到',
 'booksources-text' => '底下係一部分網絡書店嗰連結列表,可以提供到倷要找嗰書籍嗰更多資料:',
 
@@ -1273,8 +1263,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'emailsend' => '發出',
 'emailccme' => '搦我嗰消息嗰副本發到我嗰郵箱。',
 'emailccsubject' => '拿倷嗰消息複製到 $1: $2',
-'emailsent' => 'emailç\99¼å\8d\9få\98\9e',
-'emailsenttext' => '倷嗰email發卟嘞。',
+'emailsent' => 'emailç\99¼å\87ºå\93©',
+'emailsenttext' => '汝嗰email發出哩。',
 
 # Watchlist
 'watchlist' => '監視列表',
@@ -1293,14 +1283,14 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'notanarticle' => '伓係文章',
 'watchnochange' => '一徑到顯示嗰時間之內,倷眏到嗰頁面冇改動。',
 'watchlist-details' => '$1隻頁面(伓算討論頁) 拕眏到哩',
-'wlheader-enotif' => '* 啟動嘞email通知功能。',
-'wlheader-showupdated' => "上回倷眵嗰頁面改動嗰部分用'''粗體'''顯到",
-'watchmethod-recent' => '眵吖拕眏到嗰頁面嗰最近編輯',
-'watchmethod-list' => '望吖監視頁裡頭晏嗰改動',
+'wlheader-enotif' => '啟動哩email通知功能。',
+'wlheader-showupdated' => "上回倷眵嗰頁面改動嗰部分用'''粗體'''顯到",
+'watchmethod-recent' => '眵吖拕眏到嗰頁面嗰頂晏嗰編輯',
+'watchmethod-list' => '望吖監視頁裡頭晏嗰改動',
 'watchlistcontains' => '倷嗰監視列表包含$1隻頁面。',
 'iteminvalidname' => "頁面'$1'出錯,無效命名...",
 'wlnote' => "下底係最近'''$2'''鐘頭內嗰最晏'''$1'''道修改:",
-'wlshowlast' => '顯示近來$1鐘頭$2日$3嗰改動',
+'wlshowlast' => '顯示箇日子$1鐘頭$2日$3嗰改動',
 'watchlist-options' => '監視清單選項',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -1342,13 +1332,13 @@ $NEWPAGE
 'confirmdeletetext' => '仰上倷就要永久刪卟資料庫嗰一隻頁面或圖像同佢嗰歷史。請確定倷要噉做,哈要曉得佢嗰後果,更加伓能違反[[{{MediaWiki:Policy-url}}]]。',
 'actioncomplete' => '舞正哩',
 'actionfailed' => '操作冇舞正',
-'deletedtext' => '"$1"å\88ªå\8d\9få\98\9eã\80\82æ\9c\80晏嗰刪除記錄請望$2。',
+'deletedtext' => '"$1"å\88ªå\90¥å\93©ã\80\82é \82晏嗰刪除記錄請望$2。',
 'dellogpage' => '刪除日誌',
-'dellogpagetext' => '下底係晏刪除嗰記錄列表:',
+'dellogpagetext' => '下底係晏刪除嗰記錄列表:',
 'deletionlog' => '刪除日誌',
-'reverted' => '恢復到早先嗰版本',
-'deletecomment' => '原因:',
-'deleteotherreason' => '別嗰/附加理由:',
+'reverted' => '還原到早先嗰版本',
+'deletecomment' => '原因',
+'deleteotherreason' => '別嗰/附加理由',
 'deletereasonotherlist' => '別嗰理由',
 'deletereason-dropdown' => '*常用刪除嗰理由
 ** 寫嗰人自家嗰要求
@@ -1360,14 +1350,14 @@ $NEWPAGE
 'rollback_short' => '還原',
 'rollbacklink' => '還原',
 'rollbackfailed' => '還原失敗',
-'cantrollback' => '還原伓正;最末嗰貢獻人係文章嗰唯一作者。',
+'cantrollback' => '還原伓正;頂晏嗰貢獻人係文章嗰唯一作者。',
 'alreadyrolled' => '還原伓正由[[User:$2|$2]] ([[User talk:$2|討論]])做嗰[[$1]]嗰最晏編寫;
 別嗰人編輯過或係恢復嘞箇頁。
 
 最晏編輯人: [[User:$3|$3]] ([[User talk:$3|討論]])。',
 'editcomment' => "編輯介紹: \"''\$1''\"。",
 'revertpage' => '返回由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])嗰編輯;恢復到[[User:$1|$1]]嗰最末一隻版本',
-'rollback-success' => '返回由$1嗰編輯;恢復到$2嗰最末一隻版本。',
+'rollback-success' => '返回由$1嗰編輯;恢復到$2嗰頂晏一隻版本。',
 
 # Edit tokens
 'sessionfailure' => '倷嗰登入好像有嚸問題,為到防範未然,箇隻動作拕取消嘞。
@@ -1378,7 +1368,7 @@ $NEWPAGE
 'protectlogpage' => '保護日誌',
 'protectlogtext' => '下底係頁面鎖定同到解除鎖定嗰列表。請望下[[Special:ProtectedPages|保護頁面列表]]來監察目前嗰頁面保護情況。',
 'protectedarticle' => '保護正哩“[[$1]] ”',
-'modifiedarticleprotection' => 'æ\94¹è®\8aå\98\9eâ\80\9c[[$1]] â\80\9d 嗰保護等級',
+'modifiedarticleprotection' => 'æ\94¹è®\8aå\93©â\80\9c[[$1]]â\80\9d嗰保護等級',
 'unprotectedarticle' => '撤銷保護“[[$1]] ”',
 'protect-title' => '保護“$1”中',
 'prot_1movedto2' => '[[$1]]移到[[$2]]',
@@ -1405,8 +1395,8 @@ $NEWPAGE
 'protect-expiry-options' => '兩個鍾頭:2 hours,一日:1 day,三日:3 days,一個禮拜:1 week,兩個禮拜:2 weeks,一個月:1 month,三個月:3 months,六個月:6 months,一年:1 year,一世:infinite',
 'restriction-type' => '許可權:',
 'restriction-level' => '限制級別:',
-'minimum-size' => 'æ\9c\80細碼å­\90',
-'maximum-size' => '最大碼子:',
+'minimum-size' => 'é \82ç´°å\97°ç¢¼å­\90',
+'maximum-size' => '頂大嗰碼子:',
 'pagesize' => '(字節)',
 
 # Restrictions (nouns)
@@ -1437,17 +1427,17 @@ $NEWPAGE
 'undeleteviewlink' => '望吖',
 'undeletereset' => '設過',
 'undeletecomment' => '評論:',
-'undeletedrevisions' => '$1隻修改版本恢復正嘞',
-'undeletedrevisions-files' => '$1隻修改版本同$2隻檔案恢復正嘞',
-'undeletedfiles' => '$1隻檔案恢復正嘞',
+'undeletedrevisions' => '$1隻修改版本還原正哩',
+'undeletedrevisions-files' => '$1隻修改版本同$2隻檔案還原正哩',
+'undeletedfiles' => '$1隻檔案還原正哩',
 'cannotundelete' => '反刪除伓正;話伓定別嗰人先倷恢復嘞箇隻頁面。',
-'undeletedpage' => "'''$1恢復正嘞'''
+'undeletedpage' => "'''$1還原正哩'''
 
 望吖[[Special:Log/delete|刪除日誌]]嗰刪除同恢復記錄。",
-'undelete-header' => '要查晏嗰記錄嗰話請望[[Special:Log/delete|刪除日誌]]。',
-'undelete-search-box' => '尋吖刪卟嗰頁面',
+'undelete-header' => '要查晏嗰記錄嗰話請望[[Special:Log/delete|刪除日誌]]。',
+'undelete-search-box' => '尋下刪吥嗰頁面',
 'undelete-search-prefix' => '顯示以下底開頭嗰頁面:',
-'undelete-search-submit' => '尋',
+'undelete-search-submit' => '尋',
 'undelete-no-results' => '刪卟記錄冇合到嗰結果。',
 'undelete-filename-mismatch' => '刪伓正帶到時間標記嗰檔案修訂 $1: 檔案伓匹配',
 'undelete-bad-store-key' => '刪伓正帶到時間標記嗰檔案修訂 $1: 檔案刪卟之前就跌卟嘞。',
@@ -1460,7 +1450,7 @@ $1',
 
 # Namespace form on various pages
 'namespace' => '空間名:',
-'invert' => '倒得',
+'invert' => '倒得',
 'blanknamespace' => '(主要)',
 
 # Contributions
@@ -1482,7 +1472,7 @@ $1',
 'sp-contributions-userrights' => '用戶許可權管理',
 'sp-contributions-search' => '尋貢獻',
 'sp-contributions-username' => 'IP地址或用戶名:',
-'sp-contributions-toponly' => '光顯示最晏修訂版本嗰編輯',
+'sp-contributions-toponly' => '獨顯示頂晏嗰修訂版本嗰編輯',
 'sp-contributions-submit' => '尋',
 
 # What links here
@@ -1529,7 +1519,7 @@ $1',
 'ipbotherreason' => '別嗰/附加原因:',
 'ipbhidename' => '封鎖日誌、活躍封鎖列表同用戶列表裡頭弆到用戶名',
 'badipaddress' => 'IP位置伓對。',
-'blockipsuccesssub' => 'å°\81é\8e\96æ­£å\98\9e',
+'blockipsuccesssub' => 'å°\81é\8e\96æ­£å\93©',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]封卟嘞。 <br />望吖[[Special:BlockList|拕封IP列表]]來審過封鎖。',
 'ipb-edit-dropdown' => '編寫封鎖原因',
 'ipb-unblock-addr' => '解封$1',
@@ -1538,8 +1528,8 @@ $1',
 'unblockip' => '解封IP地址',
 'unblockiptext' => '用下底嗰表格去恢復早先拕封嗰IP嗰編寫權。',
 'ipusubmit' => '解封箇隻地址',
-'unblocked' => '[[User:$1|$1]]解å°\81å\98\9e',
-'unblocked-id' => 'å°\81ç¦\81$1æ\8b\95å\88ªå\8d\9få\98\9e',
+'unblocked' => '[[User:$1|$1]]解å°\81å\93©',
+'unblocked-id' => 'å°\81ç¦\81$1æ\8b\95å\88ªå\90¥å\93©',
 'ipblocklist' => '拕封用戶嗰名單',
 'ipblocklist-legend' => '尋吖拕封鎖嗰用戶',
 'ipblocklist-submit' => '尋',
@@ -1559,23 +1549,23 @@ $1',
 'blocklogpage' => '封鎖日誌',
 'blocklogentry' => '[[$1]]拕封到$3 ,結束時間到$2',
 'blocklogtext' => '箇係用戶封鎖同解封操作嗰日誌。拕自動封鎖嗰IP冇列出。請參看[[Special:BlockList|拕封IP地址列表]]。',
-'unblocklogentry' => '$1 æ\8b\95解å°\81å\98\9e',
+'unblocklogentry' => '$1 æ\8b\95解å°\81å\93©',
 'block-log-flags-anononly' => '單限制匿名用戶',
 'block-log-flags-nocreate' => '禁止箇隻IP/用戶新開帳戶',
 'block-log-flags-noautoblock' => '禁用自動封禁',
 'block-log-flags-noemail' => '禁止email',
 'range_block_disabled' => '就管理員建得正禁止封鎖嗰範圍。',
 'ipb_expiry_invalid' => '冇用嗰結束時間。',
-'ipb_already_blocked' => 'é\8e\96å\88°å\98\9e"$1"',
-'ipb_cant_unblock' => 'é\8c¯èª¤: å\86\87ç\99¼ç\8f¾Block ID $1ã\80\82ç®\87é\9a»IP話ä¼\93å®\9aæ\8b\95解å°\81å\98\8d。',
+'ipb_already_blocked' => 'é\8e\96å\88°å\93©"$1"',
+'ipb_cant_unblock' => 'é\8c¯èª¤: å\86\87ç\99¼ç\8f¾Block ID $1ã\80\82ç®\87é\9a»IP話ä¼\93å®\9aæ\8b\95解å°\81å\93©。',
 'ip_range_invalid' => '冇用嗰IP範圍。',
 'blockme' => '封吥我去',
 'proxyblocker' => '代理封鎖器',
-'proxyblocker-disabled' => 'ç®\87é\9a»å\8a\9fè\83½ç\94¨ä¼\93æ­£å\98\8d。',
-'proxyblockreason' => '倷嗰IP係一隻公開嗰代理,佢拕封到嘞。請聯絡倷嗰Internet服務提供商或技術幫助再告誦佢俚箇隻嚴重嗰安全問題。',
-'proxyblocksuccess' => '扤正囉。',
-'sorbsreason' => '{{SITENAME}}用嗰 DNSBL 查到嗰IP地址係隻公開代理服務器。',
-'sorbs_create_account_reason' => '{{SITENAME}}用嗰 DNSBL 檢查到倷嗰IP地址係隻公開代理服務器,倷也就新開伓正帳戶。',
+'proxyblocker-disabled' => 'ç®\87é\9a»å\8a\9fè\83½ç\94¨ä¼\93æ­£å\93©。',
+'proxyblockreason' => '汝嗰IP係一隻公開嗰代理,佢拕封到哩。請聯絡汝嗰Internet服務提供商或技術幫助再告誦佢俚箇隻嚴重嗰安全問題。',
+'proxyblocksuccess' => '舞正哩。',
+'sorbsreason' => '{{SITENAME}}用嗰 DNSBL 查到嗰IP地址係隻公開代理服務器。',
+'sorbs_create_account_reason' => '{{SITENAME}}用嗰 DNSBL 檢查到汝嗰IP地址係隻公開代理服務器,汝也就新開伓正帳戶。',
 
 # Developer tools
 'lockdb' => '鎖到資料庫',
@@ -1587,7 +1577,7 @@ $1',
 'lockbtn' => '鎖到資料庫',
 'unlockbtn' => '莫鎖到資料庫',
 'locknoconfirm' => '倷冇選正確認鍵。',
-'lockdbsuccesssub' => 'è³\87æ\96\99庫é\8e\96æ­£å\98\9e',
+'lockdbsuccesssub' => 'è³\87æ\96\99庫é\8e\96æ­£å\93©',
 'unlockdbsuccesssub' => '資料庫解鎖',
 'lockdbsuccesstext' => '{{SITENAME}}資料庫鎖正嘞。 <br />請記得維護正後重新開到資料庫。',
 'unlockdbsuccesstext' => '{{SITENAME}}資料庫重新開放。',
@@ -1619,7 +1609,7 @@ $1',
 'newtitle' => '新標題:',
 'move-watch' => '眏到箇頁',
 'movepagebtn' => '換卟箇頁',
-'pagemovedsub' => '移正å\98\9e',
+'pagemovedsub' => '移正å\93©',
 'movepage-moved' => "'''「$1」拕移到「$2」'''",
 'articleexists' => '已經有頁面叫箇隻名字,要伓倷揀嗰名字冇用。請揀過隻名字。',
 'cantmove-titleprotected' => '倷移伓正一隻頁面到箇隻位置,箇隻新題目已經拕保護起來嘞,新建伓正。',
@@ -1627,9 +1617,9 @@ $1',
 'movedto' => '移到',
 'movetalk' => '移動相關嗰討論頁',
 'movelogpage' => '移動日誌',
-'movelogpagetext' => 'ä¸\8båº\95ä¿\82移å\8b\95å\98\9e嗰頁面列表:',
+'movelogpagetext' => 'ä¸\8båº\95ä¿\82移å\8b\95å\93©嗰頁面列表:',
 'movereason' => '原因:',
-'revertmove' => '恢復',
+'revertmove' => '舞還原',
 'delete_and_move' => '刪除跟到移動',
 'delete_and_move_text' => '==需要刪除==
 
@@ -1687,7 +1677,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'importcantopen' => '開伓正導入檔案',
 'importbadinterwiki' => '扤壞嗰內部wiki連結',
 'importnotext' => '空白或冇字',
-'importsuccess' => 'å°\8eé\80²å\8e»å\98\8d!',
+'importsuccess' => 'å°\8eé\80²å\8e»å\93©!',
 'importhistoryconflict' => '挭過仗嗰修改歷史(之前就話伓定導過箇隻頁面)',
 'importnosources' => '跨Wiki導入源冇定義,哈伓準直接嗰歷史上傳。',
 'importnofile' => '冇上傳導入檔案。',
@@ -1696,7 +1686,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'importuploaderrortemp' => '導入文件上傳嗰時間冇扤正。冇尋到臨時文件夾。',
 'import-parse-failure' => 'XML 導進分析失敗',
 'import-noarticle' => '冇頁面導入!',
-'import-nonewrevisions' => '早先嗰改動全部扤進去嘍。',
+'import-nonewrevisions' => '早先嗰改動全部舞進去哩。',
 'xml-error-string' => '$1 位到 $2 行,$3 列 ($4字節):$5',
 
 # Import log
@@ -1721,7 +1711,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-ca-talk' => '內容頁嗰討論',
 'tooltip-ca-edit' => '汝編得正箇頁,但勞為汝望多一眼起,再存到佢。',
 'tooltip-ca-addsection' => '開隻新嗰討論',
-'tooltip-ca-viewsource' => '箇頁已拕保護。但倷能望吖佢嗰原始碼。',
+'tooltip-ca-viewsource' => '箇頁已拕保護。但汝望得正佢嗰原始碼。',
 'tooltip-ca-history' => '箇頁早先嗰版本',
 'tooltip-ca-protect' => '護到箇頁',
 'tooltip-ca-unprotect' => '改吥箇頁嗰保護',
@@ -1730,15 +1720,15 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-ca-move' => '移動箇頁',
 'tooltip-ca-watch' => '拿箇頁加到監視列表',
 'tooltip-ca-unwatch' => '拿箇頁從監視列表移走',
-'tooltip-search' => '尋{{SITENAME}}',
+'tooltip-search' => '尋{{SITENAME}}',
 'tooltip-search-go' => '要係一樣嗰標題存在嗰話就直接去箇一版',
 'tooltip-search-fulltext' => '尋箇隻文字嗰頁面',
 'tooltip-p-logo' => '封面',
-'tooltip-n-mainpage' => '望封面',
-'tooltip-n-mainpage-description' => '望封面',
-'tooltip-n-portal' => 'å°\8dæ\96¼ç®\87é\9a»è¨\88å\8a\83ï¼\8cæ±\9då¾\97å\81\9aä»\80å\93©ï¼\8cå\8f\88å\95·å\81\9a',
-'tooltip-n-currentevents' => '提供目前嗰事嗰背景',
-'tooltip-n-recentchanges' => '列出箇隻網站該朝子嗰改動',
+'tooltip-n-mainpage' => '望封面',
+'tooltip-n-mainpage-description' => '望封面',
+'tooltip-n-portal' => 'å°\8dæ\96¼ç®\87é\9a»è¨\88å\8a\83ï¼\8cæ±\9då\81\9aå¾\97ä»\80å\93©æ­£ï¼\8cå\95·å\81\9aå¾\97æ­£',
+'tooltip-n-currentevents' => '去曉得眼下新聞嗰頭腦',
+'tooltip-n-recentchanges' => '列出箇隻網站頂晏嗰改動',
 'tooltip-n-randompage' => '隨機載進一隻頁面',
 'tooltip-n-help' => '尋人幫',
 'tooltip-t-whatlinkshere' => '列出全部同箇頁連到嗰頁面',
@@ -1748,22 +1738,22 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-t-contributions' => '望吖箇隻用戶嗰貢獻',
 'tooltip-t-emailuser' => '發封郵件到箇隻用戶',
 'tooltip-t-upload' => '上傳圖像或多媒體文件',
-'tooltip-t-specialpages' => 'å\85¨é\83¨ç\89¹æ®\8aé \81å\88\97表',
+'tooltip-t-specialpages' => 'å\85¨é\83¨ç\89¹æ®\8aé \81å\97°æ¸\85å\96®',
 'tooltip-t-print' => '箇隻頁面嗰打印版',
 'tooltip-t-permalink' => '箇隻頁面嗰永久連結',
-'tooltip-ca-nstab-main' => '望內容頁',
-'tooltip-ca-nstab-user' => '望用戶頁',
+'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-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-preview' => '望汝嗰改動起,存到佢之前勞為汝咁舞吖!',
 'tooltip-diff' => '顯示汝對文章嗰改動。',
 'tooltip-compareselectedversions' => '望吖箇頁兩隻選定版本之間嗰伓同之處。',
 'tooltip-watch' => '搦箇頁加到汝嗰監視列表',
@@ -1788,7 +1778,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'anonymous' => '{{SITENAME}}嗰匿名用戶',
 'siteuser' => '{{SITENAME}}用戶$1',
 'anonuser' => '{{SITENAME}}匿名用戶$1',
-'lastmodifiedatby' => '箇頁由$3對$1 $2晏嗰改動。',
+'lastmodifiedatby' => '箇頁由$3對$1 $2晏嗰改動。',
 'othercontribs' => '以$1為基礎。',
 'others' => '別嗰',
 'siteusers' => '{{SITENAME}}用戶$1',
@@ -1801,7 +1791,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'spamprotectiontext' => '倷想存嗰頁面拕垃圾廣告隔離器測到。噉可能係外部連結扤得。',
 'spamprotectionmatch' => '下底係觸發垃圾廣告隔離器嗰內容: $1',
 'spambot_username' => 'MediaWiki 廣告清除',
-'spam_reverting' => '去歸冇包連到$1晏嗰版本',
+'spam_reverting' => '去歸冇包連到$1晏嗰版本',
 'spam_blanking' => '全部包含連到$1嗰改動,留空',
 
 # Patrolling
@@ -1810,7 +1800,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'markedaspatrolled' => '標到係檢查過嗰',
 'markedaspatrolledtext' => '選正嗰版本標到係檢查過嗰。',
 'rcpatroldisabled' => '近來修改檢查拕關閉',
-'rcpatroldisabledtext' => '該朝子改動檢查嗰功能拕關閉嘞。',
+'rcpatroldisabledtext' => '該朝子改動檢查嗰功能拕關吥哩。',
 'markedaspatrollederror' => '標伓正佢係檢查過嗰',
 'markedaspatrollederrortext' => '倷要指正某隻版本才標得正佢係檢查過嗰。',
 'markedaspatrollederror-noautopatrol' => '倷標伓正倷自家嗰修改係檢查過嗰。',
@@ -1819,12 +1809,12 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'patrol-log-page' => '巡查記錄',
 
 # Image deletion
-'deletedrevision' => 'å\88ªå\8d\9få\98\9e舊版本$1。',
+'deletedrevision' => 'å\88ªå\8d\9få\93©舊版本$1。',
 'filedeleteerror-short' => '刪卟檔案出錯: $1',
-'filedeleteerror-long' => 'å\88ªå\8d\9fæª\94æ¡\88å\87ºå\98\9eé\8c¯:
+'filedeleteerror-long' => 'å\88ªå\8d\9fæª\94æ¡\88å\87ºå\93©é\8c¯ï¼\9a
 
 $1',
-'filedelete-missing' => 'æª\94æ¡\88 "$1" ä¼\93å­\98å\9c¨ï¼\8cæ\89\80以刪佢伓正。',
+'filedelete-missing' => 'æª\94æ¡\88 "$1" ä¼\93å­\98å\9c¨ï¼\8cæ\95\85ä¿\82刪佢伓正。',
 'filedelete-old-unregistered' => '指正嗰檔案修改 "$1" 資料庫裡伓存在。',
 'filedelete-current-unregistered' => '指正嗰檔案 "$1" 資料庫裡伓存在。',
 'filedelete-archive-read-only' => '存檔目錄 "$1" 服務器裡寫伓正。',
@@ -1880,7 +1870,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '闊',
 'exif-imagelength' => '高',
 'exif-bitspersample' => '每像素byte數',
@@ -1933,7 +1923,7 @@ $1',
 'exif-aperturevalue' => '光圈',
 'exif-brightnessvalue' => '亮度',
 'exif-exposurebiasvalue' => '曝光補償',
-'exif-maxaperturevalue' => '最大陸地光圈',
+'exif-maxaperturevalue' => '頂大嗰陸地光圈',
 'exif-subjectdistance' => '物距',
 'exif-meteringmode' => '測量模式',
 'exif-lightsource' => '光源',
@@ -1994,7 +1984,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS日期',
 'exif-gpsdifferential' => 'GPS差動修正',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '冇壓縮',
 
 'exif-unknowndate' => '未知嗰日期',
@@ -2141,15 +2131,15 @@ $1',
 'confirmemail_pending' => '一隻確認代碼發到倷嗰郵箱,噉可能要等幾分鐘。
 要係冇收到,請申請過新嗰確認碼!',
 'confirmemail_send' => '寄出確認碼',
-'confirmemail_sent' => '確èª\8dé\83µä»¶ç\99¼å\87ºå\98\9e。',
-'confirmemail_oncreate' => '一隻確認碼發到倷嗰郵箱。箇隻代碼伓係話倷要仰上登入,但要係倷想用 wiki 嗰任何email嗰相關功能,就非要先提交箇隻代碼。',
+'confirmemail_sent' => '確èª\8dé\83µä»¶ç\99¼å\87ºå\93©。',
+'confirmemail_oncreate' => '一隻確認碼發到汝嗰郵箱。箇隻代碼伓係話汝要仰上登入,但要係汝想用 wiki 嗰任何email嗰相關功能,就要提交箇隻代碼起。',
 'confirmemail_sendfailed' => '發送伓正確認郵件,請檢查email地址係否含到伓合字符。
 
 郵件發送人回應: $1',
-'confirmemail_invalid' => 'ç\84¡æ\95\88å\97°ç¢ºèª\8d碼ï¼\8cç®\87é\9a»ä»£ç¢¼é\81\8eå\98\9e期。',
-'confirmemail_needlogin' => '倷要$1去確認倷嗰email地址。',
-'confirmemail_success' => '倷嗰郵箱已得到嘞確認。嘎倷能登得正入同到使用箇隻網站。',
-'confirmemail_loggedin' => '嗰email地址已得到確認。',
+'confirmemail_invalid' => 'ç\84¡æ\95\88å\97°ç¢ºèª\8d碼ï¼\8cç®\87é\9a»ä»£ç¢¼é\81\8eå\93©期。',
+'confirmemail_needlogin' => '汝要$1去確認汝嗰email地址。',
+'confirmemail_success' => '汝嗰郵箱已得到哩確認。如今汝能登得正入同到使用箇隻網站。',
+'confirmemail_loggedin' => '嗰email地址已得到確認。',
 'confirmemail_error' => '確認過程出錯。',
 'confirmemail_subject' => '{{SITENAME}}電子郵件地址確認',
 'confirmemail_body' => 'IP地址$1嗰用戶(可能係倷)到{{SITENAME}}註冊嘞帳戶"$2",並一同用嘞倷嗰email地址。
@@ -2166,11 +2156,11 @@ $3
 'scarytranscludetoolong' => '[對伓住,URL 太長]',
 
 # Delete conflict
-'deletedwhileediting' => '警告: 倷編輯嗰時間有人刪卟嘞箇頁!',
-'confirmrecreate' => "倷編輯嗰時間,用戶[[User:$1|$1]]([[User talk:$1|對話]])因為下底原因刪卟嘞箇頁:
+'deletedwhileediting' => '警告: 汝編輯嗰時間有人刪吥哩箇頁!',
+'confirmrecreate' => "汝編輯嗰時間,用戶[[User:$1|$1]]([[User talk:$1|對話]])因為下底原因刪吥哩箇頁:
 : ''$2''
-請想正後再重建頁面。",
-'recreate' => '重建',
+請想正後再建過頁面。",
+'recreate' => '建過',
 
 # action=purge
 'confirm_purge_button' => '做得',
@@ -2214,23 +2204,23 @@ $3
 
 # Watchlist editor
 'watchlistedit-numitems' => '倷嗰監視列表攏共有$1隻標題,佢伓包括對話頁。',
-'watchlistedit-noitems' => '嗰監視列表冇標題。',
+'watchlistedit-noitems' => '嗰監視列表冇標題。',
 'watchlistedit-normal-title' => '編寫監視列表',
 'watchlistedit-normal-legend' => '到監視列表移卟標題',
 'watchlistedit-normal-explain' => '倷嗰監視列表嗰標題會到下底顯到。想移卟隻標題,到佢前頭勾吖,跟到按吖移除標題。倷也能[[Special:EditWatchlist/raw|編輯原始監視列表]]或[[Special:Watchlist/clear|移除所全部標題]]。',
 'watchlistedit-normal-submit' => '移除標題',
-'watchlistedit-normal-done' => '$1隻標題從倷嗰監視列表移卟嘞:',
+'watchlistedit-normal-done' => '$1隻標題從汝嗰監視列表移吥哩:',
 'watchlistedit-raw-title' => '編寫原始監視列表',
 'watchlistedit-raw-legend' => '編寫原始監視列表',
 'watchlistedit-raw-explain' => '倷嗰監視列表嗰標題會到下底顯到,哈能利用箇隻表去加進同到移除標題;一行一隻標題。扤完後,按更新監視列表。倷也能[[Special:EditWatchlist|標準編輯器]]。',
 'watchlistedit-raw-titles' => '標題:',
 'watchlistedit-raw-submit' => '更新監視列表',
-'watchlistedit-raw-done' => '倷嗰監視列表更新正嘞。',
-'watchlistedit-raw-added' => 'å\8a å\98\9e$1é\9a»æ¨\99é¡\8c:',
-'watchlistedit-raw-removed' => '移å\98\9e$1é\9a»æ¨\99é¡\8c:',
+'watchlistedit-raw-done' => '汝嗰監視列表更新正哩。',
+'watchlistedit-raw-added' => 'å\8a å\93©$1é\9a»æ¨\99é¡\8cï¼\9a',
+'watchlistedit-raw-removed' => '移å\93©$1é\9a»æ¨\99é¡\8cï¼\9a',
 
 # Watchlist editing tools
-'watchlisttools-view' => '望相關更改',
+'watchlisttools-view' => '望相關更改',
 'watchlisttools-edit' => '望吖同到編寫監視列表',
 'watchlisttools-raw' => '編寫原始監視列表',
 
@@ -2256,11 +2246,6 @@ $3
 'version-software' => '裝正嗰軟件',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路徑',
-'filepath-page' => '文件:',
-'filepath-submit' => '路徑',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => '文件名:',
 'fileduplicatesearch-submit' => '尋',
index 07775cb..03d5744 100644 (file)
@@ -65,8 +65,6 @@ $messages = array(
 'tog-shownumberswatching' => "Nochd àireamh nan cleachdaichean a tha a' cumail sùil air",
 'tog-oldsig' => 'An t-earr-sgrìobhadh làithreach:',
 'tog-fancysig' => 'Làimhsich an t-earr-sgrìobhadh mar wikitext (gun cheangal leis fhèin)',
-'tog-externaleditor' => "Cleachd deasaichear on taobh a-muigh a ghnàth (do shàr-eòlaichean a-mhàin, feumaidh seo roghainnean sònraichte air a' choimpiutair agad [//www.mediawiki.org/wiki/Manual:External_editors Barrachd fiosrachaidh.])",
-'tog-externaldiff' => "Cleachd diff on taobh a-muigh a ghnàth (do shàr-eòlaichean a-mhàin, feumaidh seo roghainnean sònraichte air a' choimpiutair agad. [//www.mediawiki.org/wiki/Manual:External_editors Barrachd fiosrachaidh.])",
 'tog-showjumplinks' => 'Cuir an comas ceanglaichean so-inntrigeachd "gearr leum gu"',
 'tog-uselivepreview' => 'Cleachd an ro-shealladh beò (feumaidh seo JavaScript) (deuchainneach)',
 'tog-forceeditsummary' => "Cuir ceist nuair a dh'fhàgas mi gearr-chunntas an deasachaidh bàn",
@@ -80,6 +78,7 @@ $messages = array(
 'tog-diffonly' => 'Na seall susbaint nan duilleagan fo na diofaichean',
 'tog-showhiddencats' => 'Seall na roinnean falaichte',
 'tog-norollbackdiff' => 'Na dèan diof às dèidh roiligeadh air ais',
+'tog-useeditwarning' => 'Thoir rabhadh dhomh ma bhios mi an impis duilleag deasachaidh fhàgail mus do shàbhail mi na mùthaidhean agam',
 
 'underline-always' => 'An-còmhnaidh',
 'underline-never' => 'Na dèan seo idir',
@@ -282,7 +281,7 @@ $1",
 'mainpage' => 'Prìomh dhuilleag',
 'mainpage-description' => 'Prìomh dhuilleag',
 'policy-url' => 'Project:Poileasaidh',
-'portal' => 'Doras na Coimhearsnachd',
+'portal' => 'Doras na coimhearsnachd',
 'portal-url' => 'Project:Doras na coimhearsnachd',
 'privacy' => 'Am polasaidh prìobhaideachd',
 'privacypage' => 'Project:Am polasaidh prìobhaideachd',
@@ -520,7 +519,7 @@ Clàraich a-steach a-rithist nuair a gheibh thu e.',
 'blocked-mailpassword' => "Chaidh bacadh a chur air an t-seòladh IP agad 's chan eil cead deasachaidh agad agus chan urrainn dhut an gleus a chum aiseag an fhacail-fhaire a chleachdadh gus casg a chur air mì-ghnàthachadh.",
 'eauthentsent' => 'Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.
 Mus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an treòrachadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.',
-'throttled-mailpassword' => 'Chaidh cuimhneachan facail-fhaire a chur mu thràth san {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.
+'throttled-mailpassword' => 'Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde air ais.
 Gus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.',
 'mailerror' => "Mearachd a' cur post: $1",
 'acct_creation_throttle_hit' => "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
@@ -573,7 +572,7 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
 
 # Special:PasswordReset
 'passwordreset' => 'Ath-shuidhich am facal-faire',
-'passwordreset-text' => "Lìon am foirm seo gus post-d fhaighinn sa bheil mion-fhiosrachadh a' chunntais agad.",
+'passwordreset-text' => 'Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.',
 'passwordreset-legend' => 'Ath-shuidhich am facal-faire',
 'passwordreset-disabled' => 'Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicipeid seo.',
 'passwordreset-pretext' => '{{PLURAL:$1||Cuir a-steach aon dhe na pìosan dàta gu h-ìosal}}',
@@ -583,13 +582,13 @@ Saoil an do dh'atharraich thu am facal-faire agad mu thràth no an do dh'iarr th
 'passwordreset-capture-help' => 'Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.',
 'passwordreset-email' => 'Seòladh puist-d:',
 'passwordreset-emailtitle' => "Dàta a' chunntais air {{SITENAME}}",
-'passwordreset-emailtext-ip' => "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:
+'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|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:
 
 $2
 
 Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.
 Bu chòir dhut clàradh 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}} cuimhneachan air an fhiosrachadh a tha co-cheangailte ris a' chunntas agad air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
+'passwordreset-emailtext-user' => "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:
 
 $2
 
@@ -597,9 +596,9 @@ Falbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 fac
 Bu chòir dhut clàradh 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
 Facal-faire sealach: $2',
-'passwordreset-emailsent' => "Chaidh cuimhneachan a chur air a' phost-d.",
-'passwordreset-emailsent-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal.",
-'passwordreset-emailerror-capture' => "Chaidh cuimhneachan a chur air a' phost-d agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
+'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",
 
 # Special:ChangeEmail
 'changeemail' => 'Atharraich am post-d',
@@ -826,6 +825,8 @@ Tha e ann mu thràth.",
 'content-failed-to-parse' => "Dh'fhàillig parsadh susbaint $2 airson modail $1: $3",
 'invalid-content-data' => 'Dàta susbaint a tha mì-dhligheach',
 'content-not-allowed-here' => 'Chan eil susbaint "$1" ceadaichte air an duilleag [[$2]]',
+'editwarning-warning' => 'Ma dh\'fhàgas tu an duilleag seo, faodaidh gun caill thu mùthadh sam bith a rinn thu.
+Ma tha thu air logadh a-steach, \'s urrainn dhut an rabhadh seo a chur dheth san roinn "Deasachadh" sna roghainnean agad.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -888,8 +889,14 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'rev-deleted-event' => '(chaidh gnìomh an loga a thoirt air falbh)',
 'rev-delundel' => 'seall/falaich',
 'rev-showdeleted' => 'seall',
+'revdelete-selected' => "'''{{PLURAL:$2|Lèirmheas|Lèirmheasan}} de [[:$1]] a thagh thu:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:'''",
 'revdelete-hide-user' => 'Falaich ainm-cleachdaiche/seòladh IP an deasaiche',
+'revdelete-radio-same' => '(na atharraich)',
+'revdelete-radio-set' => 'Dèan seo',
+'revdelete-radio-unset' => 'Na dèan seo',
 'revdelete-log' => 'Adhbhar:',
+'revdelete-submit' => 'Cuir air {{PLURAL:$1|an lèirmheas|na lèirmheasan}} a thagh thu',
 'revdel-restore' => 'mùth follaiseachd',
 'revdel-restore-deleted' => 'mùthaidhean a chaidh a sguabadh às',
 'revdel-restore-visible' => 'mùthaidhean faicsinneach',
@@ -908,10 +915,13 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 
 # Diffs
 'history-title' => 'Eachdraidh nam mùthaidhean aig "$1"',
+'difference-multipage' => '(An diofar eadar na duilleagan)',
 'lineno' => 'Loidhne $1:',
 'compareselectedversions' => 'Dèan coimeas eadar na mùthaidhean a thagh thu',
+'showhideselectedversions' => 'Seall/Falaich na lèirmheasan a thagh thu',
 'editundo' => 'neo-dhèan',
 'diff-multi' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)',
 
 # Search results
 'searchresults' => 'Toraidhean rannsachaidh',
@@ -929,9 +939,11 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'nextn-title' => 'An ath $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}}',
 'shown-title' => 'Seall $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} air gach duilleag',
 'viewprevnext' => 'Seall ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'Roghainnean luirg',
 'searchmenu-exists' => "'''Tha duilleag air a bheil \"[[:\$1]]\" air an uicipeid seo.'''",
 'searchmenu-new' => "'''Cruthaich an duilleag \"[[:\$1]]\" air an uicipeid seo!'''",
 'searchhelp-url' => 'Help:Cuideachadh',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rùraich duilleagan aig a bheil an ro-leasachan seo]]',
 'searchprofile-articles' => 'Duilleagan susbainte',
 'searchprofile-project' => "Duilleagan nan cobharach 's nam pròiseactan",
 'searchprofile-images' => 'Ioma-mheadhanan',
@@ -952,6 +964,8 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'search-interwiki-default' => 'Toraidhean $1:',
 'search-interwiki-more' => '(barrachd)',
 'search-relatedarticle' => 'Co-cheangailte',
+'mwsuggest-disable' => 'Cuir na molaidhean luirg à comas',
+'searcheverything-enable' => 'Seall anns na namespaces air fad',
 'searchrelated' => 'co-cheangailte',
 'searchall' => 'a h-uile',
 'showingresults' => "A' nochdadh suas gu $1 {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
@@ -965,22 +979,33 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'powersearch-ns' => 'Lorg ann an namespaces:',
 'powersearch-redir' => 'Seall ath-sheòlaidhean',
 'powersearch-field' => 'Lorg',
-
-# Quickbar
-'qbsettings-none' => 'Chan eil gin',
+'powersearch-togglelabel' => 'Sgrùd:',
+'powersearch-toggleall' => 'Na h-uile',
+'powersearch-togglenone' => 'Chan eil gin',
+'search-external' => 'Lorg air an taobh a-muigh',
+'searchdisabled' => "Tha lorg air {{SITENAME}} à comas.
+'S urrainn dhut lorg a dhèanamh air Google san eadar-àm.
+Faodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
 
 # Preferences page
 'preferences' => 'Roghainnean',
 'mypreferences' => 'Na roghainnean agam',
+'prefs-edits' => 'Co mheud deasachadh:',
+'prefsnologin' => 'Chan eil thu air clàradh a-steach',
+'prefsnologintext' => 'Feumaidh tu <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} clàradh a-steach]</span> mus urrainn dhut roghainnean cleachdaiche a chur air gleus.',
 'changepassword' => 'Atharraich facal-faire',
 'prefs-skin' => 'Bian',
 'skin-preview' => 'Ro-shealladh',
+'datedefault' => 'Gun roghainnean',
 'prefs-beta' => 'Feartan Beta',
 'prefs-datetime' => 'Ceann-là is àm',
 'prefs-labs' => 'Feartan nan deuchainn-lannan',
+'prefs-user-pages' => "Duilleagan a' chleachdaiche",
 'prefs-personal' => "Pròifil a' chleachdaiche",
 'prefs-rc' => 'Mùthaidhean ùra',
 'prefs-watchlist' => 'An clàr-faire',
+'prefs-watchlist-days' => "Co mheud latha a sheallar air a' chlàr-fhaire:",
+'prefs-watchlist-days-max' => "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
 'prefs-resetpass' => 'Atharraich am facal-faire',
 'prefs-changeemail' => 'Atharraich am post-d',
 'prefs-setemail' => 'Suidhich seòladh puist-d',
@@ -1009,13 +1034,30 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'timezoneregion-europe' => 'An Roinn-Eòrpa',
 'timezoneregion-indian' => 'An Cuan Innseanach',
 'timezoneregion-pacific' => 'An Cuan Sèimh',
+'prefs-namespaces' => 'Namespaces',
 'default' => 'an roghainn bhunaiteach',
+'prefs-files' => 'Faidhlichean',
 'prefs-custom-css' => 'CSS gnàthaichte',
+'prefs-custom-js' => 'JavaScript gnàthaichte',
+'prefs-common-css-js' => 'CSS/JavaScript ann an coitcheann do gach craiceann:',
+'prefs-reset-intro' => "'S urrainn dhut bun-roghainnean na làraich ath-shuidheachadh air an duilleag seo. Cha ghabh seo a neo-dhèanamh.",
+'prefs-emailconfirm-label' => 'Dearbhadh puist-d:',
+'prefs-textboxsize' => 'Meud na h-uinneige deasachaidh',
 'youremail' => 'Post-dealain:',
 'username' => '{{GENDER:$1|Ainm-cleachdaiche}}:',
+'uid' => "ID {{GENDER:$1|a' chleachdaiche}}:",
+'prefs-memberingroups' => '{{GENDER:$2|Ball}} ann an {{PLURAL:$1|bhuidheann|bhuidheann|buidhnean|buidheann}}:',
+'prefs-registration' => 'Àm clàraidh:',
 'yourrealname' => "An dearbh ainm a th' ort:",
 'yourlanguage' => 'Cànan:',
+'yourvariant' => 'Eug-samhail cànan na susbaint:',
+'prefs-help-variant' => 'Do roghainn eug-samhail sgrìobhaidh a thèid duilleagan na h-uicipeid seo a shealltainn innte.',
 'yournick' => 'Earr-sgrìobhadh ùr:',
+'prefs-help-signature' => "Bu chòir dhut d' ainm a chur ri beachdan air duilleagan deasbaireachd le \"<nowiki>~~~~</nowiki>\" agus chithear d' ainm agus stampa ama 'na àite an uairsin.",
+'badsig' => 'Tha co-chàradh an t-soidhnidh mì-dhligheach.
+Thoir sùil air na tagaichean HTML.',
+'badsiglength' => 'Tha an t-earr-sgrìobhadh agad ro fhada.
+Chan fhaod e a bhith nas fhaide na $1 {{PLURAL:$1|charactar|charactar|caractaran|caractar}}.',
 'yourgender' => 'Gnè:',
 'gender-unknown' => 'Gun innse',
 'gender-male' => 'Fireann',
@@ -1024,17 +1066,48 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 'prefs-help-email' => "Chan leig thu leas post-dealain a chur ann ach bidh feum air ma dhìochuimhnicheas tu am facal-faire agad 's ma dh'iarras tu fear ùr.",
 'prefs-help-email-others' => "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air an duilleag agad.
 Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
+'prefs-help-email-required' => 'Tha feum air seòladh puist-d.',
+'prefs-info' => 'Fiosrachadh bunasach',
+'prefs-i18n' => 'Cànan',
+'prefs-signature' => 'Earr-sgrìobhadh',
+'prefs-dateformat' => "Fòrmat a' chinn-là",
+'prefs-timeoffset' => 'Diofar ama',
 'prefs-advancedediting' => 'Roghainnean adhartach',
 'prefs-advancedrc' => 'Roghainnean adhartach',
 'prefs-advancedrendering' => 'Roghainnean adhartach',
 'prefs-advancedsearchoptions' => 'Roghainnean adhartach',
 'prefs-advancedwatchlist' => 'Roghainnean adhartach',
+'prefs-displayrc' => 'Roghainnean taisbeanaidh',
+'prefs-displaysearchoptions' => 'Roghainnean taisbeanaidh',
+'prefs-displaywatchlist' => 'Roghainnean taisbeanaidh',
+'prefs-diffs' => 'Diffs',
+
+# User preference: email validation using jQuery
+'email-address-validity-valid' => 'Tha coltas gu bheil am post-d dligheach',
+'email-address-validity-invalid' => 'Cuir a-steach post-d dligheach',
 
 # User rights
+'userrights' => "Stiùireadh ceadan a' chleachdaiche",
+'userrights-lookup-user' => 'Stiùirich na buidhnean chleachdaichean',
+'userrights-user-editname' => 'Cuir a-steach ainm-cleachdaiche:',
+'editusergroup' => 'Deasaich na buidhnean chleachdaichean',
+'editinguser' => "Ag atharrachadh ceadan a' chleachdaiche '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Deasaich na buidhnean chleachdaichean',
+'saveusergroups' => 'Sàbhail na buidhnean chleachdaichean',
+'userrights-groupsmember' => 'Ball de:',
+'userrights-groupsmember-auto' => 'Ball fèin-obrachail de:',
+'userrights-reason' => 'Adhbhar:',
+'userrights-no-interwiki' => 'Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicipeidean eile.',
+'userrights-nodatabase' => 'Chan eil an stòr-dàta $1 ann no chan e fear ionadail a tha ann.',
 'userrights-changeable-col' => 'Buidhnean as urrainn dhut atharrachadh',
 
 # Groups
+'group' => 'Buidheann:',
+'group-user' => 'Cleachdaichean',
+'group-bot' => 'Bots',
 'group-sysop' => 'Rianadairean',
+'group-bureaucrat' => 'Biurocratan',
+'group-all' => '(na h-uile)',
 
 'group-user-member' => '{{GENDER:$1|cleachdaiche}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
@@ -1042,7 +1115,24 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
 'group-bureaucrat-member' => '{{GENDER:$1|biùrocrat}}',
 
 'grouppage-user' => '{{ns:project}}:Cleachdaichean',
+'grouppage-autoconfirmed' => '{{ns:project}}:Cleachdaichean fèin-dearbhte',
+'grouppage-bot' => '{{ns:project}}:Bots',
 'grouppage-sysop' => '{{ns:project}}:Rianadairean',
+'grouppage-bureaucrat' => '{{ns:project}}:Biurocratan',
+
+# Rights
+'right-read' => 'Cead-leughaidh',
+'right-edit' => 'Cead-deasachaidh',
+'right-createpage' => "Cead-cruthachaidh (de dhuilleagan nach eil 'nan duilleagan deasbaireachd)",
+'right-createtalk' => 'Cead duilleagan deasbaireachd a chruthachadh',
+'right-createaccount' => 'Cead cunntasan ùra a chruthachadh',
+'right-move' => 'Cead duilleagan a ghluasad',
+'right-move-subpages' => 'Cead duilleagan a ghluasad leis na fo-dhuilleagan aca',
+'right-move-rootuserpages' => 'Cead duilleagan chleachdaichean root a ghluasad',
+'right-movefile' => 'Cead faidhlichean a ghluasad',
+'right-upload' => 'Cead faidhlichean a luchdadh suas',
+'right-reupload' => 'Cead sgrìobhadh thairis air duilleagan a tha ann',
+'right-upload_by_url' => 'Faidhlichean a luchdadh suas o URL',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Loga cruthachaidh de chleachdaichean',
@@ -1112,6 +1202,7 @@ Tha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''tr
 
 'license' => 'Ceadachadh:',
 'license-header' => 'Ceadachadh',
+'nolicense' => 'Cha deach gin a thaghadh',
 
 # Special:ListFiles
 'listfiles' => 'Liosta nan ìomhaigh',
@@ -1123,7 +1214,7 @@ Tha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''tr
 'filehist-revert' => 'till',
 'filehist-current' => 'làithreach',
 'filehist-datetime' => 'Ceann-là/Àm',
-'filehist-thumb' => 'Meabh-dhealbh',
+'filehist-thumb' => 'Meanbh-dhealbh',
 'filehist-thumbtext' => 'Meanbh-dhealbh airson an tionndaidh on $1',
 'filehist-user' => 'Neach-cleachdaidh',
 'filehist-dimensions' => 'Meud',
@@ -1175,11 +1266,13 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
 # Book sources
 'booksources' => "Tùsan a tha 'nan leabhraichean",
 'booksources-search-legend' => "Lorg tùsan a tha 'nan leabhraichean",
-'booksources-go' => 'Rach',
+'booksources-go' => 'Siuthad',
 
 # Special:Log
 'log' => 'Logaichean',
 'all-logs-page' => 'A h-uile loga poblach',
+'logempty' => "Chan eil rud sam bith san loga a tha 'ga mhaidseadh.",
+'showhideselectedlogentries' => 'Seall/Falaich innteartan an loga a thagh thu',
 
 # Special:AllPages
 'allpages' => 'A h-uile duilleag',
@@ -1197,8 +1290,12 @@ Chithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu
 Chan fhaicear [[Special:UnusedCategories|roinntean-seòrsa gun chleachdadh an-seo]].
 Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan iarraidh cuideachd]].",
 
+# Special:DeletedContributions
+'deletedcontributions' => "Obair a' chleachdaiche a chaidh a sguabadh às",
+
 # Special:LinkSearch
 'linksearch' => 'Lorg sna ceanglaichean dhan taobh a-muigh',
+'linksearch-ns' => 'Namespace:',
 'linksearch-line' => "Tha $1 a' ceangal an-seo o $2",
 
 # Special:ListGroupRights
@@ -1206,6 +1303,8 @@ Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan i
 
 # Email user
 'emailuser' => 'Cuir post-dealain dhan chleachdaiche seo',
+'emailusername' => 'Ainm-cleachdaiche:',
+'emailusernamesubmit' => 'Air adhart',
 'emailfrom' => 'O:',
 'emailto' => 'Gu:',
 'emailsubject' => 'Cuspair:',
@@ -1215,16 +1314,21 @@ Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan i
 # Watchlist
 'watchlist' => 'An clàr-faire',
 'mywatchlist' => 'An clàr-faire',
-'watchlistfor2' => 'Do $1 $2',
+'watchlistfor2' => 'aig $1 $2',
 'nowatchlist' => "Chan eil rud sam bith air a' chlàr-fhaire agad.",
+'addwatch' => "Cuir air a' chlàr-fhaire",
 'addedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a chur ri [[Special:Watchlist|do chlàr-faire]].
 Nochdaidh mùthaidhean a nithear air an duilleag seo \'s air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.',
+'removewatch' => 'Thoir air falbh on chlàr-fhaire',
 'removedwatchtext' => 'Chaidh an duilleag "[[:$1]]" a thoirt air falbh o [[Special:Watchlist|do chlàr-faire]].',
 'watch' => 'Cum sùil air',
 'watchthispage' => 'Cum sùil air an duilleag seo',
 'unwatch' => 'Na cum sùil tuilleadh',
+'unwatchthispage' => 'Na cum sùil tuilleadh',
+'notanarticle' => 'Chan e duilleag susbaint a tha ann',
 'watchnochange' => "Cha deach na duilleagan air d' fhaire a dheasachadh anns a' chuairt ùine taisbeanta.",
 'watchlist-details' => 'Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.',
+'wlheader-showupdated' => "Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
 'watchmethod-recent' => "A' sgrùdadh deasachaidhean ùra airson duilleagan air d' fhaire",
 'watchmethod-list' => "A' sgrùdadh duilleagan air d' fhaire airson deasachaidhean ùra",
 'watchlistcontains' => 'Tha $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} air do chlàr-faire.',
@@ -1263,7 +1367,7 @@ Seall air $2 airson clàr de dhuilleagan a chaidh a sguabadh às o chionn ghoiri
 # Rollback
 'rollbacklink' => 'roilig air ais',
 'editcomment' => "Seo gearr-chunntas an deasachaidh: \"''\$1''\".",
-'revertpage' => 'Deasachaidhean a chaidh a thilleadh le [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]',
+'revertpage' => 'Deasachaidhean a chaidh a thilleadh le [[Special:Contributions/$2|$2]] ([[User talk:$2|deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]',
 
 # Protect
 'protectlogpage' => 'Loga an dìon',
@@ -1274,6 +1378,7 @@ Cuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson
 'unprotectedarticle' => 'a neo-dhìon "[[$1]]"',
 'protect-title' => 'A\' dìonadh "$1"',
 'prot_1movedto2' => '[[$1]] gluaiste ri [[$2]]',
+'protect-norestrictiontypes-title' => 'Cha ghabh an duilleag seo a dhìon',
 'protect-legend' => 'Daingnich dìonadh',
 'protectcomment' => 'Adhbhar:',
 'protectexpiry' => 'Falbhaidh an ùine air:',
@@ -1290,8 +1395,12 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'protect-level-sysop' => 'Na ceadaich ach rianadairean',
 'protect-summary-cascade' => 'mar eas',
 'protect-expiring' => 'falbhaidh an ùine air $1 (UTC)',
+'protect-expiring-local' => 'falbhaidh an ùine air $1',
+'protect-expiry-indefinite' => 'buan',
 'protect-cascade' => "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon mar eas)",
 'protect-cantedit' => "Chan urrainn dhut ìre dìon na duilleige seo atharrachadh a chionn 's nach eil cead deasachaidh agad air.",
+'protect-othertime' => 'Àm eile:',
+'protect-othertime-op' => 'àm eile',
 'restriction-type' => 'Cead:',
 'restriction-level' => 'Ìre bacaidh:',
 
@@ -1303,6 +1412,7 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 # Namespace form on various pages
 'namespace' => 'Namespace:',
 'invert' => 'Cuir na thagh mi bun os cionn',
+'namespace_association' => 'Namespace co-cheangailte ris',
 'blanknamespace' => '(Prìomh)',
 
 # Contributions
@@ -1572,7 +1682,7 @@ Bidh an fheadhainn eile falaichte a ghnàth.
 #Cuir gach mì regex os cionn na loidhne seo. Fàg an loidhne seo dìreach mar a tha e</pre>",
 
 # Special:Tags
-'tag-filter' => 'Criathrag [[Special:Tags|Tag]]:',
+'tag-filter' => 'Criathrag [[Special:Tags|thagaichean]]:',
 
 # New logging system
 'rightsnone' => '(chan eil gin)',
index 5b4e3d9..82e2b23 100644 (file)
@@ -94,6 +94,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'Ruta_do_ficheiro' ),
        'Import'                    => array( 'Importar' ),
        'Invalidateemail'           => array( 'Invalidar_o_enderezo_de_correo_electrónico' ),
+       'JavaScriptTest'            => array( 'Proba_do_JavaScript' ),
        'BlockList'                 => array( 'Lista_de_bloqueos', 'Lista_dos_bloqueos_a_enderezos_IP' ),
        'LinkSearch'                => array( 'Buscar_ligazóns_web' ),
        'Listadmins'                => array( 'Lista_de_administradores' ),
@@ -110,6 +111,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'Procura_MIME' ),
        'Mostcategories'            => array( 'Páxinas_con_máis_categorías' ),
        'Mostimages'                => array( 'Ficheiros_máis_ligados' ),
+       'Mostinterwikis'            => array( 'Páxinas_con_máis_interwikis' ),
        'Mostlinked'                => array( 'Páxinas_máis_ligadas' ),
        'Mostlinkedcategories'      => array( 'Categorías_máis_ligadas' ),
        'Mostlinkedtemplates'       => array( 'Modelos_máis_ligados' ),
@@ -121,6 +123,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'As_miñas_subidas' ),
        'Newimages'                 => array( 'Imaxes_novas' ),
        'Newpages'                  => array( 'Páxinas_novas' ),
+       'PagesWithProp'             => array( 'Páxinas_con_propiedades' ),
        'PasswordReset'             => array( 'Restablecer_o_contrasinal' ),
        'PermanentLink'             => array( 'Ligazón_permanente' ),
        'Popularpages'              => array( 'Páxinas_populares' ),
@@ -278,8 +281,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar o número de usuarios que están a vixiar',
 'tog-oldsig' => 'Sinatura actual:',
 'tog-fancysig' => 'Tratar a sinatura como se fose texto wiki (sen ligazón automática)',
-'tog-externaleditor' => 'Usar un editor externo por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
-'tog-externaldiff' => 'Usar as diferenzas externas por defecto (só para expertos; cómpre configurar o computador. [//www.mediawiki.org/wiki/Manual:External_editors Máis información.])',
 'tog-showjumplinks' => 'Permitir as ligazóns de accesibilidade "ir a"',
 'tog-uselivepreview' => 'Usar a vista previa en tempo real (cómpre JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avisádeme cando o campo resumo estea baleiro',
@@ -294,6 +295,7 @@ $messages = array(
 'tog-showhiddencats' => 'Mostrar as categorías ocultas',
 'tog-noconvertlink' => 'Desactivar a conversión dos títulos de ligazón',
 'tog-norollbackdiff' => 'Omitir as diferenzas despois de levar a cabo unha reversión de edicións',
+'tog-useeditwarning' => 'Avisádeme cando deixe unha páxina de edición cos cambios sen gardar',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
@@ -357,6 +359,18 @@ $messages = array(
 'oct' => 'out',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 de xaneiro',
+'february-date' => '$1 de febreiro',
+'march-date' => '$1 de marzo',
+'april-date' => '$1 de abril',
+'may-date' => '$1 de maio',
+'june-date' => '$1 de xuño',
+'july-date' => '$1 de xullo',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de setembro',
+'october-date' => '$1 de outubro',
+'november-date' => '$1 de novembro',
+'december-date' => '$1 de decembro',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoría|Categorías}}',
@@ -603,7 +617,7 @@ Por favor, comuníquello a un [[Special:ListUsers/sysop|administrador]] tomando
 'filedeleteerror' => 'Non se deu borrado o ficheiro "$1".',
 'directorycreateerror' => 'Non se puido crear o directorio "$1".',
 'filenotfound' => 'Non se deu atopado o ficheiro "$1".',
-'fileexistserror' => 'Resultou imposíbel escribir no ficheiro "$1": O ficheiro xa existe.',
+'fileexistserror' => 'Non se pode escribir no ficheiro "$1": O ficheiro xa existe.',
 'unexpected' => 'Valor inesperado: "$1"="$2".',
 'formerror' => 'Erro: Non se pode enviar o formulario.',
 'badarticleerror' => 'Non pode efectuarse esa acción nesta páxina.',
@@ -665,9 +679,18 @@ Teña en conta que mentres non se limpa a memoria caché do seu navegador algunh
 'welcomecreation-msg' => 'A súa conta foi creada correctamente.
 Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENAME}}]].',
 'yourname' => 'Nome de usuario:',
+'userlogin-yourname' => 'Nome de usuario',
+'userlogin-yourname-ph' => 'Insira o seu nome de usuario',
 'yourpassword' => 'Contrasinal:',
+'userlogin-yourpassword' => 'Contrasinal',
+'userlogin-yourpassword-ph' => 'Insira o seu contrasinal',
+'createacct-yourpassword-ph' => 'Insira un contrasinal',
 'yourpasswordagain' => 'Insira o contrasinal outra vez:',
+'createacct-yourpasswordagain' => 'Confirme o contrasinal',
+'createacct-yourpasswordagain-ph' => 'Insira o contrasinal outra vez',
 'remembermypassword' => 'Lembrar o meu contrasinal neste ordenador (ata $1 {{PLURAL:$1|día|días}})',
+'userlogin-remembermypassword' => 'Manter a miña conexión',
+'userlogin-signwithsecure' => 'Utilizar a conexión segura',
 'securelogin-stick-https' => 'Permanecer conectado mediante as HTTPS despois de acceder',
 'yourdomainname' => 'O seu dominio:',
 'password-change-forbidden' => 'Non pode mudar os contrasinais neste wiki.',
@@ -680,18 +703,38 @@ Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENA
 'logout' => 'Saír ao anonimato',
 'userlogout' => 'Saír ao anonimato',
 'notloggedin' => 'Non accedeu ao sistema',
-'nologin' => "Non está rexistrado? '''$1'''.",
+'userlogin-noaccount' => 'Non está rexistrado?',
+'userlogin-joinproject' => 'Únase a {{SITENAME}}',
+'nologin' => 'Non está rexistrado? $1.',
 'nologinlink' => 'Cree unha conta',
 'createaccount' => 'Crear unha conta nova',
-'gotaccount' => "Xa ten unha conta? '''$1'''.",
+'gotaccount' => 'Xa ten unha conta? $1.',
 'gotaccountlink' => 'Acceda ao sistema',
 'userlogin-resetlink' => 'Esqueceu os seus datos de rexistro?',
+'userlogin-resetpassword-link' => 'Restablecer o seu contrasinal',
+'helplogin-url' => 'Help:Rexistro',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Axuda co rexistro]]',
+'createacct-join' => 'Insira a súa información embaixo.',
+'createacct-emailrequired' => 'Enderezo de correo electrónico',
+'createacct-emailoptional' => 'Enderezo de correo electrónico (opcional)',
+'createacct-email-ph' => 'Insira o seu enderezo de correo electrónico',
 'createaccountmail' => 'Utilizar un contrasinal aleatorio temporal e envialo ao enderezo de correo electrónico especificado embaixo',
+'createacct-realname' => 'Nome real (opcional)',
 '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-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.',
 'userexists' => 'O nome de usuario que inseriu xa está en uso.
 Escolla un nome diferente.',
 'loginerror' => 'Erro ao acceder ao sistema',
+'createacct-error' => 'Erro ao crear a conta',
 'createaccounterror' => 'Non se puido crear a conta: $1',
 'nocookiesnew' => 'A conta de usuario foi creada, pero non accedeu ao sistema.
 {{SITENAME}} para rexistrar os usuarios.
@@ -777,8 +820,9 @@ Por favor, agarde antes de probar outra vez.',
 'oldpassword' => 'Contrasinal antigo:',
 'newpassword' => 'Contrasinal novo:',
 'retypenew' => 'Insira outra vez o novo contrasinal:',
-'resetpass_submit' => 'Poñer o contrasinal e entrar',
-'resetpass_success' => 'O cambio do contrasinal realizouse con éxito! Agora pode entrar...',
+'resetpass_submit' => 'Establecer o contrasinal e acceder ao sistema',
+'resetpass_success' => 'A modificación do contrasinal realizouse correctamente!
+Accedendo ao sistema...',
 'resetpass_forbidden' => 'Non se poden mudar os contrasinais',
 'resetpass-no-info' => 'Debe rexistrarse para acceder directamente a esta páxina.',
 'resetpass-submit-loggedin' => 'Cambiar o contrasinal',
@@ -786,13 +830,15 @@ Por favor, agarde antes de probar outra vez.',
 'resetpass-wrong-oldpass' => 'O contrasinal temporal ou actual é incorrecto.
 Pode ser que xa cambiase o seu contrasinal ou que solicitase un novo contrasinal temporal.',
 'resetpass-temp-password' => 'Contrasinal temporal:',
+'resetpass-abort-generic' => 'Unha extensión cancelou a modificación do contrasinal.',
 
 # Special:PasswordReset
 'passwordreset' => 'Restablecer o contrasinal',
-'passwordreset-text' => 'Encha este formulario para restablecer o seu contrasinal.',
+'passwordreset-text-one' => 'Encha este formulario para restablecer o seu contrasinal.',
+'passwordreset-text-many' => '{{PLURAL:$1|Insira un dos datos para restablecer o seu contrasinal.}}',
 'passwordreset-legend' => 'Restablecer o contrasinal',
 'passwordreset-disabled' => 'O restablecemento de contrasinais está desactivado neste wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza un dos datos a continuación}}',
+'passwordreset-emaildisabled' => 'As funcións do correo electrónico están desactivadas neste wiki.',
 'passwordreset-username' => 'Nome de usuario:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => 'Quere ollar o correo electrónico?',
@@ -823,7 +869,7 @@ ignore esta mensaxe e continúe empregando o seu contrasinal vello.',
 Contrasinal temporal: $2',
 'passwordreset-emailsent' => 'Enviouse o correo electrónico de restablecemento do 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 ao usuario fallou: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Cambiar o enderezo de correo electrónico',
@@ -915,7 +961,7 @@ Poida que a movesen ou borrasen mentres ollaba a páxina.',
 'loginreqtitle' => 'Cómpre acceder ao sistema',
 'loginreqlink' => 'acceder ao sistema',
 'loginreqpagetext' => 'Debe $1 para ver outras páxinas.',
-'accmailtitle' => 'O contrasinal foi enviado.',
+'accmailtitle' => 'Enviouse o contrasinal',
 'accmailtext' => 'Un contrasinal xerado ao chou para "[[User talk:$1|$1]]" foi enviado a "$2".
 
 O contrasinal para esta conta nova pode ser modificado na páxina especial \'\'[[Special:ChangePassword|Cambiar o contrasinal]]\'\' tras acceder ao sistema.',
@@ -971,7 +1017,7 @@ Se segue sen funcionar, probe a [[Special:UserLogout|saír do sistema]] e volver
 Se segue sen funcionar, probe a [[Special:UserLogout|saír do sistema]] e volver entrar.'''",
 'token_suffix_mismatch' => "'''Rexeitouse a súa edición porque o seu cliente confundiu os signos de puntuación na edición.'''
 Rexeitouse a edición para evitar que se corrompa o texto do artigo.
-Isto pode acontecer porque estea a empregar un servizo de ''proxy'' anónimo defectuoso baseado na web.",
+Isto pode acontecer porque estea a empregar un servizo de proxy anónimo defectuoso baseado na web.",
 'edit_form_incomplete' => "'''Algunhas partes do formulario de edición non chegaron ao servidor; comprobe que a súa modificación está intacta e inténteo de novo.'''",
 'editing' => 'Editando "$1"',
 'creating' => 'Creando "$1"',
@@ -1037,12 +1083,15 @@ Este non deu ningunha explicación.',
 Semella que foi borrada.',
 'edit-conflict' => 'Conflito de edición.',
 'edit-no-change' => 'A súa edición foi ignorada dado que non fixo ningún cambio no texto.',
+'postedit-confirmation' => 'Gardouse a súa edición.',
 'edit-already-exists' => 'Non se pode crear a nova páxina.
 Esta xa existe.',
 'defaultmessagetext' => 'Texto predeterminado',
 'content-failed-to-parse' => 'Erro ao analizar o contido de "$2" para o modelo de $1: $3',
 'invalid-content-data' => 'Datos de contido inválidos',
 'content-not-allowed-here' => 'O contido "$1" non está permitido na páxina "[[$2]]"',
+'editwarning-warning' => 'Deixar esta páxina pode causar a perda de calquera cambio feito.
+Se accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección "Edición" das súas preferencias.',
 
 # Content models
 'content-model-wikitext' => 'texto wiki',
@@ -1226,7 +1275,7 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
 'mergehistory-box' => 'Fusionar as revisións de dúas páxinas:',
 'mergehistory-from' => 'Páxina de orixe:',
 'mergehistory-into' => 'Páxina de destino:',
-'mergehistory-list' => 'Historial de edicións fusionábeis',
+'mergehistory-list' => 'Historial de edicións fusionables',
 'mergehistory-merge' => 'As revisións seguintes de [[:$1]] pódense fusionar con [[:$2]]. Use a columna de botóns de selección para fusionar só as revisións creadasen e antes da hora indicada. Teña en conta que se usa as ligazóns de navegación a columna limparase.',
 'mergehistory-go' => 'Mostrar as edicións que se poden fusionar',
 'mergehistory-submit' => 'Fusionar as revisións',
@@ -1328,15 +1377,7 @@ Probe a fixar a súa petición con ''all:'' para procurar en todo o contido (inc
 'searchdisabled' => 'As procuras en {{SITENAME}} están deshabilitadas por cuestións de rendemento.
 Mentres tanto pode procurar usando o Google.
 Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados.',
-
-# Quickbar
-'qbsettings' => 'Opcións da barra rápida',
-'qbsettings-none' => 'Ningunha',
-'qbsettings-fixedleft' => 'Fixa á esquerda',
-'qbsettings-fixedright' => 'Fixa á dereita',
-'qbsettings-floatingleft' => 'Flotante á esquerda',
-'qbsettings-floatingright' => 'Flotante á dereita',
-'qbsettings-directionality' => 'Fixa, segundo a dirección de escritura da súa lingua',
+'search-error' => 'Produciuse un erro durante a procura: $1',
 
 # Preferences page
 'preferences' => 'Preferencias',
@@ -1479,6 +1520,7 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 'userrights-notallowed' => 'A súa conta non dispón dos permisos necesarios para asignar ou retirar dereitos de usuario.',
 'userrights-changeable-col' => 'Os grupos que pode cambiar',
 'userrights-unchangeable-col' => 'Os grupos que non pode cambiar',
+'userrights-conflict' => 'Hai un conflito cos dereitos de usuario! Aplique de novo os seus cambios.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1520,7 +1562,7 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 'right-reupload' => 'Sobrescribir ficheiros existentes',
 'right-reupload-own' => 'Sobrescribir un ficheiro existente cargado polo mesmo usuario',
 'right-reupload-shared' => 'Sobrescribir localmente ficheiros do repositorio multimedia',
-'right-upload_by_url' => 'Cargar un ficheiro dende un enderezo URL',
+'right-upload_by_url' => 'Cargar ficheiros desde un enderezo URL',
 'right-purge' => 'Purgar a caché dunha páxina do wiki sen a páxina de confirmación',
 'right-autoconfirmed' => 'Editar páxinas semiprotexidas',
 'right-bot' => 'Ser tratado coma un proceso automatizado',
@@ -1679,8 +1721,8 @@ Para incluír un ficheiro nunha páxina, use unha ligazón do seguinte xeito:
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|texto alternativo]]</nowiki></code>''' para usar unha resolución de 200 píxeles de ancho nunha caixa na marxe esquerda cunha descrición (\"texto alternativo\")
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' para ligar directamente co ficheiro sen que este saia na páxina",
 'upload-permitted' => 'Tipos de ficheiro permitidos: $1.',
-'upload-preferred' => 'Tipos de arquivos preferidos: $1.',
-'upload-prohibited' => 'Tipos de arquivos prohibidos: $1.',
+'upload-preferred' => 'Tipos de ficheiro preferidos: $1.',
+'upload-prohibited' => 'Tipos de ficheiro prohibidos: $1.',
 'uploadlog' => 'rexistro de cargas',
 'uploadlogpage' => 'Rexistro de cargas',
 'uploadlogpagetext' => 'A continuación está a lista cos últimos ficheiros cargados no servidor.
@@ -1691,9 +1733,9 @@ Vexa a [[Special:NewFiles|galería de imaxes novas]] para ollar unha visión má
 'filereuploadsummary' => 'Cambios no ficheiro:',
 'filestatus' => 'Estado dos dereitos de autor:',
 'filesource' => 'Fonte:',
-'uploadedfiles' => 'Ficheiros cargados en {{SITENAME}}',
+'uploadedfiles' => 'Ficheiros cargados',
 'ignorewarning' => 'Ignorar a advertencia e gardar o ficheiro de calquera xeito',
-'ignorewarnings' => 'Ignorar os avisos',
+'ignorewarnings' => 'Ignorar as advertencias',
 'minlength1' => 'Os nomes dos ficheiros deben ter cando menos unha letra.',
 'illegalfilename' => 'O nome de ficheiro "$1" contén caracteres que non están permitidos nos títulos das páxinas.
 Por favor, cambie o nome do ficheiro e intente cargalo de novo.',
@@ -1758,7 +1800,7 @@ Se aínda quere cargar o seu ficheiro, volva atrás e use outro nome.
 'uploadfromurl-queued' => 'A súa carga púxese á cola.',
 'uploaddisabledtext' => 'A carga de ficheiros está desactivada.',
 'php-uploaddisabledtext' => 'As cargas de ficheiros PHP están desactivadas. Por favor, comprobe a característica file_uploads.',
-'uploadscripted' => 'Este ficheiro contén HTML ou código (script code) que pode producir erros ao ser interpretado polo navegador.',
+'uploadscripted' => 'Este ficheiro contén código HTML ou script que pode producir erros ao ser interpretado polo navegador.',
 'uploadvirus' => 'O ficheiro contén un virus! Detalles: $1',
 'uploadjava' => 'O ficheiro é un ZIP que contén un ficheiro .class de Java.
 Non están permitidas as cargas de ficheiros Java, dado que poden causar restricións de seguridade.',
@@ -1797,8 +1839,8 @@ $1',
 'upload-warning-subj' => 'Advertencia ao cargar',
 'upload-warning-msg' => 'Houbo un problema durante a carga desde [$2]. Pode volver ao [[Special:Upload/stash/$1|formulario de subidas]] para corrixilo.',
 
-'upload-proto-error' => 'Protocolo erróneo',
-'upload-proto-error-text' => 'A carga remota require URLs que comecen por <code>http://</code> ou <code>ftp://</code>.',
+'upload-proto-error' => 'Protocolo incorrecto',
+'upload-proto-error-text' => 'A carga remota require enderezos URL que comecen por <code>http://</code> ou <code>ftp://</code>.',
 'upload-file-error' => 'Erro interno',
 'upload-file-error-text' => 'Produciuse un erro interno ao intentar crear un ficheiro temporal no servidor.
 Por favor, contacte cun [[Special:ListUsers/sysop|administrador]] do sistema.',
@@ -1898,12 +1940,12 @@ Para unha seguridade óptima, img_auth.php está desactivado.',
 'http-read-error' => 'Erro de lectura HTTP.',
 'http-timed-out' => 'O pedido HTTP expirou.',
 'http-curl-error' => 'Ocorreu un erro ao acceder ao URL: $1',
-'http-host-unreachable' => 'Non se puido acceder ao URL.',
 'http-bad-status' => 'Houbo un problema durante a solicitude HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => 'Non se logrou acceder a ese URL',
-'upload-curl-error6-text' => 'Non se logrou acceder ao URL que indicou. Comprobe que ese URL é correcto e que o sitio está activo.',
+'upload-curl-error6' => 'Non se puido acceder ao enderezo URL',
+'upload-curl-error6-text' => 'Non se puido acceder ao enderezo URL especificado.
+Comprobe que ese enderezo URL é correcto e que o sitio está activo.',
 'upload-curl-error28' => 'Rematou o tempo de espera',
 'upload-curl-error28-text' => 'O sitio tardou demasiado en responder.
 Por favor, comprobe que está activo, agarde un anaco e inténteo de novo.
@@ -1921,7 +1963,7 @@ Tamén pode reintentalo cando haxa menos actividade.',
 Ao filtrar a lista por usuario, soamente se mostran as últimas versións dos ficheiros cargados polo usuario.',
 'listfiles_search_for' => 'Buscar polo nome do ficheiro multimedia:',
 'imgfile' => 'ficheiro',
-'listfiles' => 'Lista de imaxes',
+'listfiles' => 'Lista de ficheiros',
 'listfiles_thumb' => 'Miniatura',
 'listfiles_date' => 'Data',
 'listfiles_name' => 'Nome',
@@ -1974,7 +2016,7 @@ Poida que queira editar a descrición da [$2 páxina de descrición do ficheiro]
 'upload-disallowed-here' => 'Non pode sobrescribir este ficheiro.',
 
 # File reversion
-'filerevert' => 'Reverter $1',
+'filerevert' => 'Reverter "$1"',
 '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:',
@@ -2076,7 +2118,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'brokenredirects-edit' => 'editar',
 'brokenredirects-delete' => 'borrar',
 
-'withoutinterwiki' => 'Páxinas sen ligazóns interwiki',
+'withoutinterwiki' => 'Páxinas sen ligazóns interlingüísticas',
 'withoutinterwiki-summary' => 'As seguintes páxinas non ligan con ningunha versión noutra lingua.',
 'withoutinterwiki-legend' => 'Prefixo',
 'withoutinterwiki-submit' => 'Mostrar',
@@ -2098,8 +2140,8 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'lonelypagestext' => 'As seguintes páxinas non teñen ningunha ligazón que apunte cara a elas desde outra páxina de {{SITENAME}}.',
 'uncategorizedpages' => 'Páxinas sen categorías',
 'uncategorizedcategories' => 'Categorías sen categorías',
-'uncategorizedimages' => 'Ficheiros sen categorizar',
-'uncategorizedtemplates' => 'Modelos sen categorizar',
+'uncategorizedimages' => 'Ficheiros sen categorías',
+'uncategorizedtemplates' => 'Modelos sen categorías',
 'unusedcategories' => 'Categorías sen uso',
 'unusedimages' => 'Imaxes sen uso',
 'popularpages' => 'Páxinas populares',
@@ -2112,7 +2154,7 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'wantedtemplates' => 'Modelos requiridos',
 'mostlinked' => 'Páxinas máis ligadas',
 'mostlinkedcategories' => 'Categorías máis ligadas',
-'mostlinkedtemplates' => 'Modelos máis enlazados',
+'mostlinkedtemplates' => 'Modelos máis ligados',
 'mostcategories' => 'Páxinas con máis categorías',
 'mostimages' => 'Ficheiros máis usados',
 'mostinterwikis' => 'Páxinas con máis interwikis',
@@ -2127,10 +2169,10 @@ As entradas <del>riscadas</del> xa foron resoltas.',
 'protectedpages-indef' => 'Só as proteccións indefinidas',
 'protectedpages-cascade' => 'Só as proteccións en serie',
 'protectedpagestext' => 'As seguintes páxinas están protexidas fronte á edición ou traslado',
-'protectedpagesempty' => 'Non hai páxinas protexidas neste momento',
+'protectedpagesempty' => 'Actualmente non hai ningunha páxina protexida con eses parámetros.',
 'protectedtitles' => 'Títulos protexidos',
 'protectedtitlestext' => 'Os seguintes títulos están protexidos da creación',
-'protectedtitlesempty' => 'Actualmente non están protexidos títulos con eses parámetros.',
+'protectedtitlesempty' => 'Actualmente non hai ningún título protexido con eses parámetros.',
 'listusers' => 'Lista de usuarios',
 'listusers-editsonly' => 'Mostrar só os usuarios con edicións',
 'listusers-creationsort' => 'Ordenar por data de creación',
@@ -2312,8 +2354,8 @@ Os cambios futuros nesta páxina e na súa páxina de conversa asociada serán l
 'notvisiblerev' => 'A revisión foi borrada',
 'watchnochange' => 'Ningún dos elementos baixo vixilancia foi editado no período de tempo indicado.',
 'watchlist-details' => 'Hai {{PLURAL:$1|unha páxina|$1 páxinas}} na súa lista de vixilancia, sen contar as de conversa.',
-'wlheader-enotif' => 'A notificación por correo electrónico está activada.',
-'wlheader-showupdated' => "* As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''",
+'wlheader-enotif' => 'A notificación por correo electrónico está activada.',
+'wlheader-showupdated' => "As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''.",
 'watchmethod-recent' => 'comprobando as edicións recentes na procura de páxinas vixiadas',
 'watchmethod-list' => 'comprobando as páxinas vixiadas na procura de edicións recentes',
 'watchlistcontains' => 'A súa lista de vixilancia ten $1 {{PLURAL:$1|páxina|páxinas}}.',
@@ -2329,7 +2371,7 @@ Os cambios futuros nesta páxina e na súa páxina de conversa asociada serán l
 
 'enotif_mailer' => 'Sistema de notificacións por correo de {{SITENAME}}',
 'enotif_reset' => 'Marcar todas as páxinas como visitadas',
-'enotif_impersonal_salutation' => 'usuario de {{SITENAME}}',
+'enotif_impersonal_salutation' => 'Usuario de {{SITENAME}}',
 'enotif_subject_deleted' => '{{GENDER:$2|$2}} borrou a páxina chamada "$1" en {{SITENAME}}',
 'enotif_subject_created' => '{{GENDER:$2|$2}} creou a páxina chamada "$1" en {{SITENAME}}',
 'enotif_subject_moved' => '{{GENDER:$2|$2}} trasladou a páxina chamada "$1" en {{SITENAME}}',
@@ -2417,8 +2459,8 @@ proceda con coidado.',
 'cantrollback' => 'Non se pode desfacer a edición; o último colaborador é o único autor desta páxina.',
 'alreadyrolled' => 'Non se pode desfacer a edición en "[[:$1]]" feita por [[User:$2|$2]] ([[User talk:$2|conversa]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); alguén máis editou ou desfixo os cambios desta páxina.
 
-A última edición fíxoa [[User:$3|$3]] ([[User talk:$3|conversa]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).',
-'editcomment' => "O resumo de edición era: \"''\$1''\".",
+A última edición fíxoa [[User:$3|$3]] ([[User talk:$3|conversa]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+'editcomment' => "O resumo de edición foi: \"''\$1''\".",
 'revertpage' => 'Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]',
 'revertpage-nouser' => 'Desfixéronse as edicións de (nome eliminado); cambiado á última versión feita por [[User:$1|$1]]',
 'rollback-success' => 'Desfixéronse as edicións de $1;
@@ -2495,7 +2537,7 @@ Pode mudar o nivel de protección da páxina pero iso non afectará á protecci
 
 # Restriction levels
 'restriction-level-sysop' => 'protección completa',
-'restriction-level-autoconfirmed' => 'semiprotexida',
+'restriction-level-autoconfirmed' => 'semiprotección',
 'restriction-level-all' => 'todos',
 
 # Undelete
@@ -2533,14 +2575,14 @@ $1',
 'undeletedpage' => "'''A páxina \"\$1\" foi restaurada'''
 
 Comprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas recentes no rexistro de páxinas eliminadas e restauradas.",
-'undelete-header' => 'Vexa [[Special:Log/delete|no rexistro de borrados]] as páxinas eliminadas recentemente.',
+'undelete-header' => 'Consulte [[Special:Log/delete|no rexistro de borrados]] as páxinas borradas recentemente.',
 'undelete-search-title' => 'Procurar páxinas borradas',
 'undelete-search-box' => 'Procurar páxinas borradas',
 'undelete-search-prefix' => 'Mostrar as páxinas que comecen por:',
 'undelete-search-submit' => 'Procurar',
 'undelete-no-results' => 'Non se atoparon páxinas coincidentes no arquivo de eliminacións.',
-'undelete-filename-mismatch' => 'Non se pode desfacer a eliminación da revisión do ficheiro datada en $1: non corresponde o nome do ficheiro',
-'undelete-bad-store-key' => 'Non se pode desfacer o borrado da revisión do ficheiro datada en $1: o ficheiro faltaba antes de proceder a borralo.',
+'undelete-filename-mismatch' => 'Non se pode restaurar a revisión do ficheiro datada en $1: Non corresponde o nome do ficheiro.',
+'undelete-bad-store-key' => 'Non se pode restaurar a revisión do ficheiro datada en $1: O ficheiro faltaba antes de proceder a borralo.',
 'undelete-cleanup-error' => 'Erro ao eliminar o ficheiro do arquivo sen usar "$1".',
 'undelete-missing-filearchive' => 'Non foi posible restaurar o arquivo do ficheiro co ID $1 porque non figura na base de datos.
 Poida que xa se restaurase con anterioridade.',
@@ -2624,10 +2666,10 @@ Explique a razón específica do bloqueo (por exemplo, citando as páxinas concr
 ** Inserir información falsa
 ** Eliminar o contido de páxinas
 ** Ligazóns lixo a sitios externos
-** Inserir textos sen sentido ou inintelixíbeis
+** Inserir textos sen sentido ou inintelixibles
 ** Comportamento intimidatorio/acoso
 ** Abuso de múltiples contas de usuario
-** Nome de usuario inaceptábel',
+** Nome de usuario inaceptable',
 'ipb-hardblock' => 'Impedir que usuarios rexistrados editen desde este enderezo IP',
 'ipbcreateaccount' => 'Previr a creación de contas',
 'ipbemailban' => 'Impedir que o usuario envíe correos electrónicos',
@@ -2725,9 +2767,10 @@ Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixent
 'proxyblockreason' => 'O seu enderezo IP foi bloqueado porque é un proxy aberto.
 Por favor, contacte co seu fornecedor de acceso á Internet ou co seu soporte técnico e informe deste grave problema de seguridade.',
 'proxyblocksuccess' => 'Feito.',
-'sorbsreason' => "O seu enderezo IP está rexistrado como un ''proxy'' aberto na lista DNSBL usada por {{SITENAME}}.",
-'sorbs_create_account_reason' => "O seu enderezo IP está rexistrado como un ''proxy'' aberto na lista DNSBL usada por {{SITENAME}}.
-Polo tanto, non pode crear unha conta",
+'sorbsreason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.',
+'sorbs_create_account_reason' => 'O seu enderezo IP está rexistrado como un proxy aberto na lista DNSBL usada por {{SITENAME}}.
+Polo tanto, non pode crear unha conta',
+'xffblockreason' => 'Un enderezo IP presente na cabeceira X-Forwarded-For, ou ben seu ou ben dun servidor proxy que está utilizando, foi bloqueado. O motivo do bloqueo orixinal é: $1',
 'cant-block-while-blocked' => 'Non pode bloquear outros usuarios mentres vostede estea bloqueado.',
 'cant-see-hidden-user' => 'O usuario que intenta bloquear xa foi bloqueado e agochado. Dado que non ten o dereito necesario para agochar usuarios, non pode ver ou editar o bloqueo do usuario.',
 'ipbblocked' => 'Non pode bloquear ou desbloquear outros usuarios porque vostede está bloqueado',
@@ -2761,7 +2804,7 @@ Lembre [[Special:UnlockDB|eliminar o bloqueo]] unha vez completado o seu manteme
 O título vello vaise converter nunha páxina de redirección ao novo título.
 Pode actualizar automaticamente as redireccións que van dar ao título orixinal.
 Se escolle non facelo, asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].
-Vostede é responsábel de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
+Vostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
 
 Teñ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.
 Isto 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.
@@ -2772,7 +2815,7 @@ por 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.
 O título vello vaise converter nunha páxina de redirección ao novo título.
 Asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].
-Vostede é responsábel de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
+Vostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.
 
 Teñ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.
 Isto 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.
@@ -2890,6 +2933,8 @@ Por favor, visite a [//www.mediawiki.org/wiki/Localisation localización MediaWi
 'thumbnail-more' => 'Ampliar',
 'filemissing' => 'O ficheiro non se dá atopado',
 'thumbnail_error' => 'Erro ao crear a miniatura: $1',
+'thumbnail_error_remote' => 'Mensaxe de erro de $1:
+$2',
 'djvu_page_error' => 'A páxina DjVu está fóra do rango',
 'djvu_no_xml' => 'Non se puido obter o XML para o ficheiro DjVu',
 'thumbnail-temp-create' => 'Non se puido crear o ficheiro de miniatura temporal',
@@ -3039,17 +3084,11 @@ Pode ver o código fonte.',
 
 # Stylesheets
 'common.css' => '/** O CSS que se coloque aquí será aplicado a todas as aparencias */',
-'standard.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Clásica */',
-'nostalgia.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Morriña */',
 'cologneblue.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Azul colonial */',
 'monobook.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Monobook */',
-'myskin.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia A miña aparencia */',
-'chick.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Parrulo */',
-'simple.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Sinxela */',
 'modern.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Moderna */',
 'vector.css' => '/* O CSS que se coloque aquí afectará a quen use a aparencia Vector */',
 'print.css' => '/* O CSS que se coloque aquí afectará ás impresións */',
-'handheld.css' => '/* O CSS que se coloque aquí afectará aos dispositivos móbiles baseados na aparencia configurada en $wgHandheldStyle */',
 'noscript.css' => '/* O CSS que se coloque aquí afectará aos usuarios co JavaScript desactivado */',
 'group-autoconfirmed.css' => '/* O CSS que se coloque aquí afectará soamente aos usuarios autoconfirmados */',
 'group-bot.css' => '/* O CSS que se coloque aquí afectará soamente aos bots */',
@@ -3058,13 +3097,8 @@ Pode ver o código fonte.',
 
 # Scripts
 'common.js' => '/* Calquera JavaScript que haxa aquí será cargado para todos os usuarios en cada páxina que vexan. */',
-'standard.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Clásica */',
-'nostalgia.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Morriña */',
 'cologneblue.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Azul colonial */',
 'monobook.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia MonoBook */',
-'myskin.js' => '/* O JavaScript que se coloque aquí afectará a quen use a aparencia A miña aparencia */',
-'chick.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Parrulo */',
-'simple.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Sinxela */',
 'modern.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Moderna */',
 'vector.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Vector */',
 'group-autoconfirmed.js' => '/* Calquera JavaScript que haxa aquí será cargado soamente para os usuarios autoconfirmados */',
@@ -3144,13 +3178,8 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 'pageinfo-category-files' => 'Número de ficheiros',
 
 # Skin names
-'skinname-standard' => 'Clásica',
-'skinname-nostalgia' => 'Morriña',
 'skinname-cologneblue' => 'Azul colonial',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'A miña aparencia',
-'skinname-chick' => 'Parrulo',
-'skinname-simple' => 'Sinxela',
 'skinname-modern' => 'Moderna',
 
 # Patrolling
@@ -3229,11 +3258,25 @@ O seu sistema pode quedar comprometido se o executa.",
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
 'days' => '{{PLURAL:$1|$1 día|$1 días}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
 'months' => '{{PLURAL:$1|$1 mes|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 ano|$1 anos}}',
 'ago' => 'hai $1',
 'just-now' => 'agora mesmo',
 
+# Human-readable timestamps
+'hours-ago' => 'hai {{PLURAL:$1|unha hora|$1 horas}}',
+'minutes-ago' => 'hai {{PLURAL:$1|un minuto|$1 minutos}}',
+'seconds-ago' => 'hai {{PLURAL:$1|un segundo|$1 segundos}}',
+'monday-at' => 'O luns ás $1',
+'tuesday-at' => 'O martes ás $1',
+'wednesday-at' => 'O mércores ás $1',
+'thursday-at' => 'O xoves ás $1',
+'friday-at' => 'O venres ás $1',
+'saturday-at' => 'O sábado ás $1',
+'sunday-at' => 'O domingo ás $1',
+'yesterday-at' => 'Onte ás $1',
+
 # Bad image list
 'bad_image_list' => 'O formato é o seguinte:
 
@@ -3262,7 +3305,7 @@ Os demais agocharanse por omisión.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ancho',
 'exif-imagelength' => 'Alto',
 'exif-bitspersample' => 'Bits por compoñente',
@@ -3440,7 +3483,7 @@ Os demais agocharanse por omisión.
 'exif-originalimageheight' => 'Altura da imaxe antes de ser cortada',
 'exif-originalimagewidth' => 'Ancho da imaxe antes de ser cortada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sen comprimir',
 'exif-compression-2' => 'CCITT Grupo 3 Lonxitude de codificación unidimensional Huffman modificada',
 'exif-compression-3' => 'CCITT Grupo 3 codificación de fax',
@@ -3684,7 +3727,7 @@ Pode ser que caducase.',
 'confirmemail_success' => 'Confirmouse o seu enderezo de correo electrónico. Agora xa pode [[Special:UserLogin|acceder ao sistema]] e facer uso do wiki.',
 'confirmemail_loggedin' => 'Xa se confirmou o seu enderezo de correo electrónico.',
 'confirmemail_error' => 'Houbo un problema ao gardar a súa confirmación.',
-'confirmemail_subject' => '{{SITENAME}} - Verificación do enderezo de correo electrónico',
+'confirmemail_subject' => 'Confirmación do enderezo de correo electrónico de {{SITENAME}}',
 'confirmemail_body' => 'Alguén, probablemente vostede, desde o enderezo IP $1,
 rexistrou a conta "$2" con este enderezo de correo electrónico en {{SITENAME}}.
 
@@ -3864,12 +3907,17 @@ Debería recibir [{{SERVER}}{{SCRIPTPATH}}/COPYING unha copia da licenza públic
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta dos artigos]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta das escrituras]',
 
-# Special:FilePath
-'filepath' => 'Ruta do ficheiro',
-'filepath-page' => 'Ficheiro:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta páxina especial devolve a ruta completa dun ficheiro.
-As imaxes móstranse na súa resolución completa; outros tipos de ficheiros inícianse directamente co seu programa asociado.',
+# Special:Redirect
+'redirect' => 'Redirixir por nome de ficheiro, ID de usuario ou ID de revisión',
+'redirect-legend' => 'Redirixir a un ficheiro ou unha páxina',
+'redirect-summary' => 'Esta páxina especial redirixe cara a un ficheiro (dado o nome), unha páxina (dado o ID dunha revisión) ou unha páxina de usuario (dado o ID dun usuario).',
+'redirect-submit' => 'Continuar',
+'redirect-lookup' => 'Procurar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID de usuario',
+'redirect-revision' => 'Revisión de páxina',
+'redirect-file' => 'Nome de ficheiro',
+'redirect-not-exists' => 'Non se atopou o valor',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Procurar ficheiros duplicados',
@@ -3959,6 +4007,9 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros in
 'htmlform-submit' => 'Enviar',
 'htmlform-reset' => 'Desfacer os cambios',
 'htmlform-selectorother-other' => 'Outro',
+'htmlform-no' => 'Non',
+'htmlform-yes' => 'Si',
+'htmlform-chosen-placeholder' => 'Seleccione unha opción',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con soporte para procuras de texto completo',
index 06af738..08e925c 100644 (file)
@@ -420,7 +420,7 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
 # Special:ListUsers
 'listusers-submit' => 'Hechauka',
 
-# E-mail user
+# Email user
 'emailuser' => "Tojeguerahauka ñe'ẽveve ko puruhárape",
 'emailpage' => 'Pareha eleytrónico',
 'emailmessage' => 'Marandu',
@@ -540,11 +540,6 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
 # Special:Version
 'version' => "Mba'ereko",
 
-# Special:FilePath
-'filepath' => 'Ruta de archivo',
-'filepath-page' => 'Archivo:',
-'filepath-submit' => 'Ruta',
-
 # Special:SpecialPages
 'specialpages' => 'Kuatiarogue hekochĩchĩva',
 
index bd03044..6023729 100644 (file)
@@ -67,8 +67,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Δεικνύναι τὸν ἀριθμὸν τῶν παρακολουθούντων χρωμένων',
 'tog-oldsig' => 'Προθεώρησις τῆς ὑπαρχούσης ὑπογραφῆς:',
 'tog-fancysig' => 'Ἀκατέργασται ὑπογραφαί ἐν εἴδει βικι-κειμένου (ἄνευ αὐτομάτου συνδέσμου)',
-'tog-externaleditor' => 'Χρῆσθαι ἐξωτέρῳ προγράμματι ἐπεξεργασίας κειμένων κατὰ προεπιλογήν (πρὸς εἰδικοὺς μόνον· ἀπαραίτητοι εἰσὶν εἰδικαὶ ῥυθμίσεις τινὲς ἐν τῇ σῇ ὑπολογιστικῇ μηχανῇ)',
-'tog-externaldiff' => 'Χρῆσθαι ἐξωτέρῳ λογισμικῷ ἀντιπαραβολῆς κατὰ προεπιλογὴν (πρὸς εἰδικοὺς μόνον· ἀπαραίτητοι εἰσὶν εἰδικαὶ ῥυθμίσεις τινες ἐν τῇ σῇ ὑπολογιστικῇ μηχανῇ)',
 'tog-showjumplinks' => 'Ἐνεργοποιεῖν τοὺς "ἅλμα πρὸς" συνδέσμους προσβασιμότητος',
 'tog-uselivepreview' => 'Χρῆσθαι ἀμέσῳ προθεωρήσει (JavaScript) (Πειραστικόν)',
 'tog-forceeditsummary' => 'Προμήνυσόν με εἰ εἰσάγω κενὴν σύνοψιν μεταγραφῆς',
@@ -839,14 +837,6 @@ $1",
 'powersearch-togglenone' => 'Οὐδέν',
 'search-external' => 'Ἐξωτέρα ἀναζήτησις',
 
-# Quickbar
-'qbsettings' => 'Ταχεῖα πρόσβασις',
-'qbsettings-none' => 'Οὐδέν',
-'qbsettings-fixedleft' => 'Σταθερὰ ἀριστερώς',
-'qbsettings-fixedright' => 'Σταθερὰ δεξιώς',
-'qbsettings-floatingleft' => 'Πλανώμενα αριστερώς',
-'qbsettings-floatingright' => 'Πλανώμενα δεξιώς',
-
 # Preferences page
 'preferences' => 'Προαιρέσεις',
 'mypreferences' => 'Αἱ προαιρέσεις μου',
@@ -1544,7 +1534,7 @@ $1",
 'notvisiblerev' => 'Ἀναθεώρησις διαγεγραμμένη',
 'watchnochange' => 'Οὐδὲν ἐκ τῶν ἐφορωμένων τεμαχίων σου μετεγράφη τῷ δεικνυμένῳ χρόνῳ.',
 'watchlist-details' => '{{PLURAL:$1|$1 δέλτος|$1 δέλτοι}} ἐφορωμέναι, ἄνευ τῶν δέλτων διαλέξεως περιλαμβανομένων.',
-'wlheader-enotif' => 'Σύστημα εἰδήσεως μέσῳ ἠλ-ἐπιστολῶν ἐνεργόν.',
+'wlheader-enotif' => 'Σύστημα εἰδήσεως μέσῳ ἠλ-ἐπιστολῶν ἐνεργόν.',
 'watchmethod-recent' => 'ἐλέγχειν προσφάτους μεταγραφὰς περὶ ἐφορωμένων δέλτων',
 'watchmethod-list' => 'ἐλέγχειν ἐφορωμένας δέλτους περὶ μεταγραφὰς προσφάτους',
 'watchlistcontains' => 'Ἡ ἐφοροδιαλογὴ σου περιέχει $1 {{PLURAL:$1|δέλτον|δέλτους}}.',
@@ -2197,7 +2187,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Πλάτος',
 'exif-imagelength' => 'Ὕψος',
 'exif-bitspersample' => 'Δυφία ἀνὰ συνιστῶσαν',
@@ -2319,7 +2309,7 @@ $1',
 'exif-label' => 'Ἐπιγραφή',
 'exif-disclaimer' => 'Ἀποποίησις εὐθύνης',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ἀσυμπίεστος',
 
 'exif-copyrighted-true' => 'Ὑποκείμενον έν δικαιώμασιν',
@@ -2614,11 +2604,6 @@ $5
 'version-software-product' => 'Προϊόν',
 'version-software-version' => 'Ἔκδοσις',
 
-# Special:FilePath
-'filepath' => 'Διαδρομὴ ἀρχείου',
-'filepath-page' => 'Ἀρχεῖον:',
-'filepath-submit' => 'Ἰέναι',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ζήτησις διπλότυπων ἀρχείων',
 'fileduplicatesearch-summary' => 'Ζητεῖν διπλότυπα ἀρχεῖα βάσει κερματιζομένων τιμῶν.',
index e38cb95..5bb714f 100644 (file)
@@ -16,6 +16,7 @@
  * @author MaxSem
  * @author Melancholie
  * @author MichaelFrey
+ * @author Nemo bis
  * @author Purodha
  * @author Remember the dot
  * @author Spacebirdy
@@ -162,8 +163,6 @@ $messages = array(
 '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-externaleditor' => 'Externe Editor als Standard bruche (nume fir Experte, doderzue brucht s speziälli Yystellige uf em Computer. [//www.mediawiki.org/wiki/Manual:External_editors Wyteri Informatione doderzue.])',
-'tog-externaldiff' => 'Extern Programm fir Versionsunterschid als Standard bruche (nume fir Experte, doderzue brucht s speziälli Yystellige uf em Computer. [//www.mediawiki.org/wiki/Manual:External_editors Wyteri Informatione doderzue.])',
 'tog-showjumplinks' => '«Wächsle-zu»-Links ermügleche',
 'tog-uselivepreview' => 'Live-Vorschau bruche (JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Sag mer s, wänn i s Zämmefassigsfeld läär loss',
@@ -178,6 +177,7 @@ $messages = array(
 'tog-showhiddencats' => 'Zeig di versteckte Kategorie',
 'tog-noconvertlink' => 'Konvertierig vum Titel deaktiviere',
 'tog-norollbackdiff' => 'Unterschid noch em Zrucksetze unterdrucke',
+'tog-useeditwarning' => 'Warn mi, wänn I ne Syte verloss mit Bearbeitige, wu nonig gspycheret sin',
 
 'underline-always' => 'immer',
 'underline-never' => 'nie',
@@ -654,10 +654,8 @@ Villicht hesch Dyy Passwort scho gänderet oder e nej temporär Passwort aagford
 
 # Special:PasswordReset
 'passwordreset' => 'Passwort zruggsetze',
-'passwordreset-text' => 'Bitte des Formular uusfille, ass De E-Mail e Erinnerig zue dr Aamäldeinformatione vu Dyym Benutzerkonto iberchunnsch.',
 'passwordreset-legend' => 'Passwort zrucksetze',
 'passwordreset-disabled' => 'S Zrucksetze vu Passwerter isch in däm Wiki deaktiviert wore.',
-'passwordreset-pretext' => '{{PLURAL:$1||Gib eis vu däne Daten aa}}',
 'passwordreset-username' => 'Benutzername:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Die E-Mail aaluege?',
@@ -893,6 +891,8 @@ Si isch schyns glescht wore.',
 'content-failed-to-parse' => 'Parse vum Inhalt $2 fir Modell $1 fählgschlaa: $3',
 'invalid-content-data' => 'Uugiltigi Inhaltsdate',
 'content-not-allowed-here' => 'Dr Inhalt „$1“ isch uf dr Syte [[$2]] nit erlaubt',
+'editwarning-warning' => 'Wänn Du die Syte verlosch, cha s syy, ass Du alli Bearbeitige verliersch, wu Du do dra gmacht hesch.
+Wänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „{{int:prefs-editing}}“-Beryych vu Dyyne Yystelligen abstelle.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1170,15 +1170,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 '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.',
 
-# Quickbar
-'qbsettings' => 'Syteleischte',
-'qbsettings-none' => 'Keini',
-'qbsettings-fixedleft' => 'Links, fescht',
-'qbsettings-fixedright' => 'Rächts, fescht',
-'qbsettings-floatingleft' => 'Links, in dr Schwebi',
-'qbsettings-floatingright' => 'Rächts, in dr Schwebi',
-'qbsettings-directionality' => 'Fescht, abhängig vu dr Schrybrichtig vu dr gwehlte Sproch',
-
 # Preferences page
 'preferences' => 'Yystellige',
 'mypreferences' => 'Yystellige',
@@ -1717,7 +1708,6 @@ Us Sicherheitsgrinde isch img_auth.php deaktiviert.',
 'http-read-error' => 'Fähler bim Läse vu HTTP.',
 'http-timed-out' => 'Uuszyt bim HTTP-Versuech.',
 'http-curl-error' => 'Fähler bim Ufsueche vu dr URL: $1',
-'http-host-unreachable' => 'URL isch nit z verwitsche',
 'http-bad-status' => 'Bi dr HTTP-Aafrog isch e Fähler ufdrätte: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2117,8 +2107,8 @@ Wänn Du d Syte speter wider vu dr Lischt witt stryyche, deno druck eifach uf 
 'notvisiblerev' => 'Version isch glescht wore',
 'watchnochange' => 'Vo den Artikle, wo du beobachtisch, isch im aazeigte Zytruum kene veränderet worde.',
 '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.",
+'wlheader-enotif' => 'Dr E-Mail-Benochrichtigungsdienscht isch aktiviert.',
+'wlheader-showupdated' => "Syte mit Anderige, wu no nit aagluegt sin, sin '''fett''' dargstellt.",
 'watchmethod-recent' => 'Iberpriefe vu dr letschte Bearbeitige fir d Beobachtigslischt',
 'watchmethod-list' => 'Iberpriefe vu dr Beobachtigslischt no letschte Bearbeitige',
 'watchlistcontains' => 'In Dyynere Beobachtigslischt het s $1 {{PLURAL:$1|Syte|Syte}}.',
@@ -2964,7 +2954,7 @@ Andri wäre standardmäßig nit aazeigt.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breiti',
 'exif-imagelength' => 'Längi',
 'exif-bitspersample' => 'Bit pro Farbkomponente',
@@ -3142,7 +3132,7 @@ Andri wäre standardmäßig nit aazeigt.
 'exif-originalimageheight' => 'Bildhechi vor em Zueschnyde',
 'exif-originalimagewidth' => 'Bildbreiti vor em Zueschnyde',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Uukomprimiert',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensionali modifizierti Huffman-Lauflengekodierig',
 'exif-compression-3' => 'CCITT Gruppe 3 Faxkodierig',
@@ -3551,13 +3541,6 @@ E [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopi vu dr GNU General Public-Lizänz] sott
 'version-entrypoints-header-entrypoint' => 'Yygangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Dateipfad',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Gang',
-'filepath-summary' => 'Mit däre Spezialsyte losst sich dr komplett Pfad vu dr aktuälle Version vun ere Datei ohni Umwäg abfroge.
-Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gstartet.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Datei-Duplikat sueche',
 'fileduplicatesearch-summary' => 'Suech no Datei-Duplikat uf dr Grundlag vu ihrem Hash-Wärt.',
index ae6b140..0f5594c 100644 (file)
@@ -148,6 +148,8 @@ $digitTransformTable = array(
 
 $digitGroupingPattern = "##,##,###";
 
+$linkTrail = '/^((?:[a-z]|ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|ક્ષ્|જ્ઞ્|અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|અં|અઃ|અઁ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ઁ|ૅ|ૉ|ૃ)+)(.*)$/sDu';
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'કડીઓની નીચે લીટી (અંડરલાઇન) ઉમેરો:',
@@ -179,8 +181,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ધ્યાનમાં રાખતા સભ્યોની સંખ્યા બતાવો',
 'tog-oldsig' => 'હાલના હસ્તાક્ષર',
 'tog-fancysig' => 'હસ્તાક્ષરનો વિકિલખાણ તરીકે ઉપયોગ કરો (સ્વચાલિત કડી વગર)',
-'tog-externaleditor' => 'બીજું એડીટર વાપરો. (ફક્ત એકસપર્ટ માટે, તમારા કમ્પ્યુટરમાં સેટીંગ્સ બદલવા પડશે. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Use external diff by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => "''આના પર જાવ'' કડીને સક્રીય કરો.",
 'tog-uselivepreview' => 'લાઇવ પ્રિવ્યુ જુઓ (જાવાસ્ક્રીપ્ટ જરૂરી) (પ્રાયોગીક)',
 'tog-forceeditsummary' => "કોરો 'ફેરફાર સારાંશ' ઉમેરતા પહેલા મને ચેતવો",
@@ -195,6 +195,7 @@ $messages = array(
 'tog-showhiddencats' => 'છુપી શ્રેણીઓ દર્શાવો',
 'tog-noconvertlink' => 'Disable link title conversion',
 'tog-norollbackdiff' => 'રોલબેક કર્યા પછીના તફાવતો છુપાવો',
+'tog-useeditwarning' => 'સાચવ્યા વગર જો હું પૃષ્ઠ છોડું તો મને ચેતવણી આપો',
 
 'underline-always' => 'હંમેશાં',
 'underline-never' => 'કદી નહિ',
@@ -258,6 +259,18 @@ $messages = array(
 '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',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|શ્રેણી|શ્રેણીઓ}}',
@@ -278,13 +291,14 @@ $messages = array(
 'noindex-category' => 'અનુક્રમણિકા નહી બનાવેલા પાનાં',
 'broken-file-category' => 'ફાઇલોની ત્રૂટક કડીઓવાળાં પાનાં',
 
-'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
+'linkprefix' => '/^(.*?)((?:[a-zA-Z\\x80-\\xff]|ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|ક્ષ્|જ્ઞ્|અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|અં|અઃ|અઁ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ૅ|ૉ|ૃ)+)$/sD',
 
 'about' => 'વિષે',
 'article' => 'લેખનું પાનું',
 'newwindow' => '(નવા પાનામાં ખુલશે)',
 'cancel' => 'રદ કરો',
 'moredotdotdot' => 'વધારે...',
+'morenotlisted' => 'વધુ યાદી કરેલી નથી...',
 'mypage' => 'પાનું',
 'mytalk' => 'ચર્ચા',
 'anontalk' => 'આ IP માટેનું ચર્ચા પાનું',
@@ -518,6 +532,8 @@ $1',
 'cannotdelete' => 'ફાઇલ કે પાનું "$1" હટાવી શકાયું નથી.
 શક્ય છે કે અન્ય કોઈએ પહેલેથી હટાવી દીધું હોય.',
 'cannotdelete-title' => '"$1" પાનું કાઢી શકતા નથી',
+'delete-hook-aborted' => 'દૂર કરવાનું હૂક વડે રોકી રાખવામાં આવ્યું.
+તે કોઇ કારણ આપતું નથી.',
 'badtitle' => 'ખરાબ નામ',
 'badtitletext' => 'આપનું ઈચ્છિત શીર્ષક અમાન્ય છે, ખાલી છે, અથવાતો અયોગ્ય રીતે આંતર-ભાષિય કે આંતર-વિકિ સાથે જોડાયેલું શીર્ષક છે.
 શક્ય છે કે તેમાં એક કે વધુ એવા અક્ષર કે ચિહ્નો છે કે જે પાનાનાં શીર્ષક માટે અવૈધ છે.',
@@ -568,9 +584,18 @@ $2',
 'welcomecreation-msg' => 'તમારૂં ખાતું ખુલી ગયું છે.
 તમારી [[Special:Preferences|{{SITENAME}} પસંદ]] બદલવાનું ભૂલશો નહીં.',
 'yourname' => 'સભ્ય નામ:',
+'userlogin-yourname' => 'સભ્ય નામ',
+'userlogin-yourname-ph' => 'તમારૂં સભ્ય નામ દાખલ કરો',
 'yourpassword' => 'ગુપ્ત સંજ્ઞા:',
+'userlogin-yourpassword' => 'ગુપ્ત સંજ્ઞા',
+'userlogin-yourpassword-ph' => 'ગુપ્ત સંજ્ઞા લખો',
+'createacct-yourpassword-ph' => 'પાસવર્ડ દાખલ કરો',
 'yourpasswordagain' => 'ગુપ્ત સંજ્ઞા (પાસવર્ડ) ફરી લખો',
+'createacct-yourpasswordagain' => 'પાસવર્ડની ખાતરી કરો',
+'createacct-yourpasswordagain-ph' => 'પાસવર્ડ ફરીથી દાખલ કરો',
 'remembermypassword' => 'આ કોમ્યૂટર પર મારી લૉગ ઇન વિગતો ધ્યાનમાં રાખો (વધુમાં વધુ $1 {{PLURAL:$1|દિવસ|દિવસ}} માટે)',
+'userlogin-remembermypassword' => 'મને પ્રવેશિત રાખો',
+'userlogin-signwithsecure' => 'સલામત જોડાણ વાપરો',
 'securelogin-stick-https' => 'લોગ-ઈન કર્યા પછી  HTTPS સાથે જોડાયેલા રહો.',
 'yourdomainname' => 'તમારૂં ડોમેઇન:',
 'password-change-forbidden' => 'તમે આ વિકિ માટે પાસવર્ડ્સ બદલી શકતા નથી.',
@@ -583,18 +608,38 @@ $2',
 'logout' => 'બહાર નીકળો',
 'userlogout' => 'બહાર નીકળો/લૉગ આઉટ',
 'notloggedin' => 'પ્રવેશ કરેલ નથી',
+'userlogin-noaccount' => 'શું તમારૂં ખાતું નથી ?',
+'userlogin-joinproject' => '{{SITENAME}} સાથે જોડાવ',
 'nologin' => "શું તમારૂં ખાતું નથી? તો નવું '''$1'''.",
 'nologinlink' => 'ખાતું ખોલો',
 'createaccount' => 'નવું ખાતું ખોલો',
 'gotaccount' => "પહેલેથી ખાતું ખોલેલું છે? '''$1'''.",
 'gotaccountlink' => 'પ્રવેશ કરો',
 'userlogin-resetlink' => 'પોતાની પ્રવેશ માહિતી ભૂલી ગયા છો?',
-'createaccountmail' => 'ઇ-મેઇલ દ્વારા',
+'userlogin-resetpassword-link' => 'તમારો પાસવર્ડ બદલો',
+'helplogin-url' => 'Help:પ્રવેશ માટે',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|પ્વેશવા માટેની મદદ]]',
+'createacct-join' => 'તમારી માહિતી નીચે દાખલ કરો.',
+'createacct-emailrequired' => 'ઇમેલ સરનામું',
+'createacct-emailoptional' => 'ઇમેલ સરનામું (વૈકલ્પિક)',
+'createacct-email-ph' => 'તમારું ઇમેલ સરનામું દાખલ કરો',
+'createaccountmail' => 'કામચલાઉ ગમે-તેમ પાસવર્ડ વાપરો અને તેને નીચે આપેલ ઇમેલ સરનામા પર મોકલો',
+'createacct-realname' => 'સાચું નામ (વૈકલ્પિક)',
 'createaccountreason' => 'કારણ:',
+'createacct-reason' => 'કારણ',
+'createacct-reason-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|યોગદાનકર્તા|યોગદાનકર્તાઓ}}',
 'badretype' => 'તમે દાખલ કરેલ ગુપ્તસંજ્ઞા મળતી આવતી નથી.',
 'userexists' => 'દાખલ કરેલું સભ્ય નુ નામ વપરાશમાં છે.</br>
 કૃપયા અન્ય નામ પસંદ કરો.',
 'loginerror' => 'પ્રવેશ ત્રુટિ',
+'createacct-error' => 'ખાતું બનાવવામાં ક્ષતિ આવી',
 'createaccounterror' => 'ખાતું ખોલી શકાયું નથી: $1',
 'nocookiesnew' => 'તમારુ સભ્ય ખાતું બની ગયું છે પણ તમે પ્રવેશ (લોગ ઇન) કર્યો નથી.
 
@@ -638,8 +683,8 @@ $2',
 ફેરફાર કરવા માટે તમારું IP એડ્રેસ  સ્થગિત કરી દેવાયું છે તેથી દૂરુપયોગ ટાળવા માટે તમને ગુપ્તસંજ્ઞા રીકવરી કરવાની છૂટ નથી.',
 'eauthentsent' => 'પુષ્ટિ કરવા માટે તમે આપેલા સરનામાં પર ઇમેઇલ મોકલવામાં આવ્યો છે.
 એ જ સરનામે બીજો ઇમેઇલ થતાં પહેલાં તમારે ઇમેઇલમાં લખેલી સૂચનાઓ પ્રમાણે કરવું પડશે જેથી એ પુષ્ટિ થઇ શકે કે આપેલું સરનામું તમારું છે.',
-'throttled-mailpassword' => 'ગુપ્ત સંજ્ઞા યાદ અપાવતી ઇમેઇલ છેલ્લા {{PLURAL:$1|કલાક|$1 કલાકમાં}} મોકલેલી છે.
-દૂરુપયોગ રોકવા માટે, {{PLURAL:$1|કલાક|$1 કલાકમાં}} ફક્ત એક જ આવી મેઇલ કરવામાં આવે છે.',
+'throttled-mailpassword' => 'ગુપ્ત સંજ્ઞા યાદ અપાવતી ઇમેઇલ છેલ્લા {{PLURAL:$1|કલાકમાં|$1 કલાકોમાં}} મોકલેલી છે.
+દૂરુપયોગ રોકવા માટે, {{PLURAL:$1|કલાકમાં|$1 કલાકોમાં}} ફક્ત એક જ આવી મેઇલ કરવામાં આવે છે.',
 'mailerror' => 'મેઇલ મોકલવામાં ત્રુટિ: $1',
 'acct_creation_throttle_hit' => 'આ વિકિના મુલાકાતીઓએ તમારું IP વાપરીને ગઈ કાલે {{PLURAL:$1|1 ખાતું |$1 ખાતા}} ખોલ્યાં છે,જે પ્રવાનગીની મહત્તમ સંખ્યા છે. આને પરિણામે મુલાકાતી આ ક્ષણેવધુ ખાતા નહીં ખોલી શકે.',
 'emailauthenticated' => 'તમારૂં ઇ-મેઇલ સરનામું $2 ના $3 સમયે પ્રમાણિત કરેલું છે.',
@@ -689,36 +734,36 @@ $2',
 'resetpass-wrong-oldpass' => 'અવૈધ હંગામે કે કાયમી ગુપ્તસંજ્ઞા.
 કદાચ તમે પહેલેથી સફળતા પૂર્વક તમારી ગુપ્ત સંજ્ઞા બદલી દીધી હોય કે નવી ગુપ્ત સંંજ્ઞામાટે વિનંતિ કરી હોય',
 'resetpass-temp-password' => 'કામચલાવ ગુપ્તસંજ્ઞા:',
+'resetpass-abort-generic' => 'વિસ્તારક વડે પાસવર્ડ બદલવાનું રોકી રખાયું છે.',
 
 # Special:PasswordReset
 'passwordreset' => 'પાસવર્ડ રીસેટ કરો',
-'passwordreset-text' => 'આપના ઈ મેલ ખાતા ની માહિતી મેળવવા માટે આ ફોર્મ માં વિગતો ભરો.',
 'passwordreset-legend' => 'પાસવર્ડ રીસેટ કરો',
 'passwordreset-disabled' => 'આ વિકી પર પાસવર્ડ રીસેટ કરવા પર પ્રતિબંધ છે.',
-'passwordreset-pretext' => '{{PLURAL: $1| | એક નીચે માહિતીના ટુકડાઓ દાખલ}}',
+'passwordreset-emaildisabled' => 'આ વિકિ પર ઇમેઇલ સગવડ બંધ છે.',
 'passwordreset-username' => 'સભ્ય નામ:',
 'passwordreset-domain' => 'ડોમેઈન:',
 'passwordreset-capture' => 'પરિણામી ઈ મેલ જોવો છે ?',
 'passwordreset-capture-help' => 'જો તમે આ ઓપ્શન સિલેક્ટ કરશો, તો તમને અને યુઝર ને ઈ મેલ (કામચલાઉ પાસવર્ડ સાથે) દેખાડવામાં આવશે.',
 'passwordreset-email' => 'ઇ મેલ સરનામું:',
 'passwordreset-emailtitle' => '{{SITENAME}} માટે ખાતુ બનાવ્યું',
-'passwordreset-emailtext-ip' => 'કોઈક (કદાચ તમો , $1 IP એડ્રેસ થી) એ તમારી વેબસાઈટ {{SITENAME}}  ($4) ના ખાતા ની વિગત અંગે યાદ દેવડાવાની રજૂઆત કરી છે. આ ઈ-મેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલા છે.
+'passwordreset-emailtext-ip' => 'કોઈકે (કદાચ તમોએ , $1 IP એડ્રેસ થી) તમારી વેબસાઈટ {{SITENAME}}  ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલા છે.
 .
 .
 
 $2
 
-{{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસ}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો.',
-'passwordreset-emailtext-user' => 'વેબસાઈટ  {{SITENAME}} ($4) ના વપરાશકર્તા $1 એ તમારી ના ખાતા ની વિગત અંગે યાદ દેવડાવાની રજૂઆત કરી છે. આ ઈ-મેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલા છે.
+{{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસ}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો.',
+'passwordreset-emailtext-user' => 'વેબસાઈટ  {{SITENAME}} ના વપરાશકર્તા $1 એ તમારા {{SITENAME}} ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલ છે.
 
 $2
 
 {{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસ}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો..',
 'passwordreset-emailelement' => 'વપરાશકર્તા નામ: $1
 કામચલાઉ પાસવર્ડ: $2',
-'passwordreset-emailsent' => 'àª\8fàª\95 àª¸à«\8dમà«\83તિપતà«\8dર àª\88 મેલ મોકલવામાં આવ્યો છે.',
-'passwordreset-emailsent-capture' => 'àª\8fàª\95 àª¸à«\8dમà«\83તિપતà«\8dર àª\88 àª®à«\87લ àª®à«\8bàª\95લવામાàª\82 àª\86વà«\8dયà«\8b àª\9bà«\87, àª\9cà«\87 àª\86 પ્રમાણે છે.',
-'passwordreset-emailerror-capture' => 'àª\8fàª\95 àª¸à«\8dમà«\83તિપતà«\8dર àª\88 àª®à«\87લ àª¬àª¨àª¾àªµàªµàª¾ àª®àª¾àª\82 àª\86વà«\8dયà«\8b àª\9bà«\87, àª\9cà«\87 àª\86 àªªà«\8dરમાણà«\87 àª\9bà«\87, àªªàª°àª\82તà«\81 àª¤à«\87 àª¯à«\81àª\9dર àª¨à«\87 àª®à«\8bàª\95લવા માં નિષ્ફળ થયો છે: $1',
+'passwordreset-emailsent' => 'પાસવરà«\8dડ àª¬àª¦àª²àªµàª¾àª¨à«\8b àª\87મેલ મોકલવામાં આવ્યો છે.',
+'passwordreset-emailsent-capture' => 'પાસવરà«\8dડ àª¬àª¦àª²àªµàª¾àª¨à«\8b àª\87મà«\87લ àª®à«\8bàª\95લવામાàª\82 àª\86વà«\8dયà«\8b àª\9bà«\87, àª\9cà«\87 àª¨à«\80àª\9aà«\87 પ્રમાણે છે.',
+'passwordreset-emailerror-capture' => 'પાસવરà«\8dડ àª«àª°à«\80 àª\97à«\8bઠવવા àª®àª¾àª\9fà«\87નà«\8b àª\87મà«\87લ àª¬àª¨àª¾àªµàªµàª¾àª®àª¾àª\82 àª\86વà«\8dયà«\8b àª\9bà«\87, àª\9cà«\87 àª¨à«\80àª\9aà«\87 àªªà«\8dરમાણà«\87 àª\9bà«\87, àªªàª°àª\82તà«\81 àª¤à«\87 {{GENDER:$2|સભà«\8dય}}નà«\87 àª®à«\8bàª\95લવામાં નિષ્ફળ થયો છે: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ઈ મેલ ખાતુ બદલવા માટે',
@@ -894,7 +939,7 @@ $2
 'longpageerror' => "ત્રુટિ: તમે લખેલ લેખ {{PLURAL:$1|એક કિલોબાઈટ|$1 કિલોબાઈટ્સ}} કિલોબાઇટ લાંબો છે, જે {{PLURAL:$1|એક કિલોબાઈટ|$2 કિલોબાઈટ્સ}}  કિલોબાઇટની મહત્તમ સીમા કરતાં વધુ છે.'''
 તેને સાચવી ન શકાયા.",
 'readonlywarning' => "'''ચેતવણી: માહિતીસંચ સમારકામ માટે બંધ કરાયો છે, તમે તમારા ફેરફારો હમણા સાચવી નહીં શકો.'''
-તમà«\87 àª¤àª®àª¾àª°à«\81àª\82 àª²à«\87àª\96 àª\95à«\8bàª\87 àª\9fà«\87àª\95à«\8dસà«\8dàª\9f àª«àª¾àª\87લ àª®àª¾àª\82 àª¸à«\87વ àª\95રà«\80 àª®à«\82àª\95à«\80 àª¦à«\8b àª\85નà«\87 àª®àª¾àª¹àª¿àª¤à«\80 સંચ ખુલતા વિકિ પર સાચવી શકશો. 
+તમà«\87 àª¤àª®àª¾àª°à«\81àª\82 àª²àª\96ાણ àª\95à«\8bàª\87 àª\9fà«\87àª\95à«\8dસà«\8dàª\9f àª«àª¾àª\87લ àª®àª¾àª\82 àª¸à«\87વ àª\95રà«\80 àª®à«\82àª\95à«\80 àª¦à«\8b àª\85નà«\87 àª®àª¾àª¹àª¿àª¤à«\80સંચ ખુલતા વિકિ પર સાચવી શકશો. 
 
 જે પ્રબંધકે માહિતીસંચ બંધ કર્યો છે તેણે આ કારણ આપ્યું છે: $1",
 'protectedpagewarning' => "'''ચેતવણી : આ પાના પર સંરક્ષણ વિકલ્પ સક્રીય છે અને માત્ર પ્રબંધકો જ આમાં ફેરફાર કરી શકે.'''
@@ -935,6 +980,8 @@ $2
 તે પહેલેથી હાજર છે.',
 'defaultmessagetext' => 'મૂળભૂત સંદેશ લખાણ',
 'invalid-content-data' => 'અયોગ્ય વિગત માહિતી',
+'editwarning-warning' => 'આ પાનું છોડી દેશો તો તમારા ફેરફારો સચવાશે નહીં.
+જો તમે પ્રવેશ કરેલો હોય તો તમે આ ચેતવણીને તમારી પસંદના "ફેરફાર" વિભાગના વિકલ્પો બદલીને બંધ કરી શકો છો.',
 
 # Content models
 'content-model-wikitext' => 'વિકિલખાણ',
@@ -1190,7 +1237,7 @@ $1",
 'search-interwiki-default' => '$1 પરીણામો:',
 'search-interwiki-more' => '(વધુ)',
 'search-relatedarticle' => 'શોધ સંબંધિત',
-'mwsuggest-disable' => 'AJAX સુઝાવો નિષ્ક્રીય કરો',
+'mwsuggest-disable' => 'શોધ સુઝાવો નિષ્ક્રીય કરો',
 'searcheverything-enable' => 'નામસ્થળોમાં શોધો:',
 'searchrelated' => 'શોધ સંબંધિત',
 'searchall' => 'બધા',
@@ -1212,15 +1259,7 @@ $1",
 'searchdisabled' => "{{SITENAME}} ઉપર શોધ બંધ કરી દેવામાં આવી છે.
 ત્યાં સુધી તમે ગુગલ દ્વારા શોધ કરી શકો.
 '''નોંધઃ'''{{SITENAME}}નાં તેમના (ગુગલના) ઈન્ડેક્સ જુના હોઇ શકે.",
-
-# Quickbar
-'qbsettings' => 'શીઘ્રપટ્ટ',
-'qbsettings-none' => 'કોઇપણ નહીં',
-'qbsettings-fixedleft' => 'અચળ ડાબે',
-'qbsettings-fixedright' => 'અચળ જમણે',
-'qbsettings-floatingleft' => 'ચલિત ડાબે',
-'qbsettings-floatingright' => 'ચલિત જમણે',
-'qbsettings-directionality' => 'નિશ્ચિત, તમારી ભાષા સ્ક્રિપ્ટ directionality પર આધાર રાખીને',
+'search-error' => 'શોધ કરતી વખતે ક્ષતિ આવી: $1',
 
 # Preferences page
 'preferences' => 'પસંદ',
@@ -1764,7 +1803,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'http-read-error' => 'HTTP વાચન ત્રુટિ.',
 'http-timed-out' => ' HTTP અરજી કાલાતિત થઇ ગઇ.',
 'http-curl-error' => 'URL: $1 ખેંચી લાવવામાં ત્રુટિ',
-'http-host-unreachable' => 'URL સુધી ન પહોંચી શકાયું.',
 'http-bad-status' => 'HTTP અરજી વખતે કોઈ અડચણ આવી : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1833,6 +1871,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'uploadnewversion-linktext' => 'આ ફાઇલની નવી આવૃત્તિ ચઢાવો',
 'shared-repo-from' => '$1 થી',
 'shared-repo' => 'સાંઝો ભંડાર',
+'upload-disallowed-here' => 'તમે આ ફાઇલ ઉપર લખી શકતા નથી.',
 
 # File reversion
 'filerevert' => '$1 હતું તેવું કરો',
@@ -1918,6 +1957,11 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 તેઓ વધુ યોગ્ય પાનાં સાથે જોડાયેલા હોવા જોઇએ.<br />
 પાનાને સંદિગ્ધ વાક્યો વાળું પાનું ત્યારે કહી શકાય જ્યારે તે [[MediaWiki:Disambiguationspage]] નામના માળખા સાથે જોડાયેલું હોય.",
 
+'pageswithprop' => 'પાનાં ગુણધર્મ સાથેનાં પાનાંઓ',
+'pageswithprop-legend' => 'પાનાં ગુણધર્મ સાથેનાં પાનાંઓ',
+'pageswithprop-prop' => 'ગુણધર્મ નામ:',
+'pageswithprop-submit' => 'જાઓ',
+
 'doubleredirects' => 'બમણું દિશાનિર્દેશન',
 'doubleredirectstext' => 'આ પાનું દિશા નિર્દેશિત પાના પર થયેલા દિશા નિર્દેશિત પાનાની યાદિ બતાવે છે.
 દરેક લિટીમાં પાના પ્રથમ અને દ્વીતીય દિશા નિર્દેશન ક્ડી બતાવે છે, તે સિવાય દ્વીતીય દિશા નિર્દેશનનું લક્ષ્ય પણ બતાવે છે કે મોટે ભાગે મૂળ પાનું હોઇ શકે છેૢ જેના પર પ્રથમ દિશા નિર્દેશન લક્ષિત છે. <del>Crossed out</del> લિટીઓ  નો ઉત્તર મેળવાયો છે.',
@@ -2069,7 +2113,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'linksearch-ok' => 'શોધ',
 'linksearch-text' => 'વાઇલ્ડ કાર્ડ જેવા કે "*.wikipedia.org" અહીં વપરાયા હોઈ શકે છે.
 ઓછામાં ઓછું ઉચ્ચસ્તરનું ડોમેઇન જરૂરી છે, દા.ત. \'\'*.org".<br />
-માન્ય પ્રોટોકોલ્સ: <code>$1</code> (જો કોઇ પ્રોટોકોલ આપેલ નહી હોય તો http:// એ મૂળભૂત ગણાશે).',
+માન્ય {{PLURAL:$2|પ્રોટોકોલ|પ્રોટોકોલ્સ}}: <code>$1</code> (જો કોઇ પ્રોટોકોલ આપેલ નહી હોય તો http:// એ મૂળભૂત ગણાશે).',
 'linksearch-line' => '$1 એ $2થી જોડાયેલ છે',
 'linksearch-error' => 'યજમાન નામની શરૂઆતમાં જ વાઈલ્ડકાર્ડ પ્રકટ થશે',
 
@@ -2145,7 +2189,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'usermessage-editor' => 'તંત્ર સંદેશાઓ',
 
 # Watchlist
-'watchlist' => 'મારà«\80 àª§à«\8dયાનસà«\82àª\9aà«\80',
+'watchlist' => 'ધ્યાનસૂચી',
 'mywatchlist' => 'ધ્યાનસૂચિ',
 'watchlistfor2' => 'ધ્યાન સૂચિ $1 $2',
 'nowatchlist' => 'તમારી ધ્યાન સૂચિ ખાલી છે',
@@ -2165,8 +2209,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'notvisiblerev' => 'અન્ય સભ્ય દ્વારા થયેલું સંપાદન ભૂંસી નખાયું છે.',
 'watchnochange' => 'તમારા દ્વારા નિરીક્ષિત પાના આપેલ સમય ગાળામાં ફેરફારીત થયા',
 'watchlist-details' => 'ચર્ચાનાં પાનાં ન ગણતા {{PLURAL:$1|$1 પાનું|$1 પાનાં}} ધ્યાનસૂચીમાં છે.',
-'wlheader-enotif' => '*ઈ-મેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.',
-'wlheader-showupdated' => "*તમારી મુલાકાત લીધા પછી બદલાયેલા પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે",
+'wlheader-enotif' => 'મેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.',
+'wlheader-showupdated' => "તમારી છેલ્લી મુલાકાત પછી બદલાયેલાં પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે.",
 'watchmethod-recent' => 'હાલમાં ફેરફાર થયેલ પાનાની ચકાસણી જારી',
 'watchmethod-list' => 'હાલમાં થયેલ ફેરફાર માટે નીરીક્ષીત પાના તપાસાય છે',
 'watchlistcontains' => 'તમારી ધ્યાનસૂચીમાં $1 {{PLURAL:$1|પાનું|પાનાં}} છે.',
@@ -2300,6 +2344,7 @@ Deleting it may disrupt database operations of {{SITENAME}};',
 'prot_1movedto2' => '[[$1]]નું નામ બદલીને [[$2]] કરવામાં આવ્યું છે.',
 'protect-badnamespace-title' => 'સંરક્ષિત ન કરી શકાતું નામસ્થળ',
 'protect-badnamespace-text' => 'આ નામસ્થળમાં પાના સુરક્ષિત કરી શકાતા નથી.',
+'protect-norestrictiontypes-title' => 'અસુરક્ષિત પાનું',
 'protect-legend' => 'સંરક્ષણ બહાલી આપો',
 'protectcomment' => 'કારણ:',
 'protectexpiry' => 'સમાપ્તિ:',
@@ -2317,9 +2362,9 @@ Deleting it may disrupt database operations of {{SITENAME}};',
 
 તમે આ પાનાઓનું સંરક્ષણ સ્તર બદલી શકો છો, પરંતુ તેની અસર ધોધાકાર સંરક્ષણ પર પડવી જોઇએ નહીં.',
 'protect-default' => 'બધા સભ્યોને પરવાનગી',
-'protect-fallback' => '"$1" પરવાનગી જરૂરી',
-'protect-level-autoconfirmed' => 'નવા àª\85નà«\87 àª¨àª¹à«\80 àª¨à«\8bàª\82ધાયà«\87લા àª¸àª­à«\8dયà«\8b àªªàª° àªªà«\8dરતિબàª\82ધ',
-'protect-level-sysop' => 'માત્ર પ્રબંધકો',
+'protect-fallback' => 'માત્ર "$1" પરવાનગી સાથેના સભ્યોને માન્ય રાખો',
+'protect-level-autoconfirmed' => 'માતà«\8dર àª\86પમà«\87ળà«\87 àª\96ાતરà«\80 àª¥àª¯à«\87લા àª¸àª­à«\8dયà«\8bનà«\87 àª®àª¾àª¨à«\8dય àª°àª¾àª\96à«\8b',
+'protect-level-sysop' => 'માત્ર પ્રબંધકોને માન્ય રાખો',
 'protect-summary-cascade' => 'ધોધાકાર',
 'protect-expiring' => '$1 (UTC) એ સમાપ્ત થાય છે',
 'protect-expiring-local' => '$1ના નિવૃત્ત થશે',
@@ -2627,7 +2672,7 @@ $1',
 જો તમે તેમ કરવા ના ઇચ્છતા હોવ તો, [[Special:DoubleRedirects|બેવડા]] અથવા [[Special:BrokenRedirects|ત્રુટક કડી વાળા]] અન્યત્ર વાળેલા પાનાઓની યાદી ચકાસીને ખાતરી કરી લેશો.
 કડી જે પાના પર લઈ જવી જોઈએ તે જ પાના સાથે જોડે તેની ખાતરી કરી લેવી તે તમારી જવાબદારી છે.
 
-àª\8f àªµàª¾àª¤àª¨à«\80 àª¨à«\8bàª\82ધ àª²à«\87શà«\8b àª\95à«\87, àª\9cà«\8b àª¤àª®à«\87 àªªàª¸àª\82દ àª\95રà«\87લા àª¨àªµàª¾ àª¨àª¾àª® àªµàª¾àª³à«\81àª\82 àªªàª¾àª¨à«\81àª\82 àª\85સà«\8dતિતà«\8dવમાàª\82 àª¹àª¶à«\87 àª¤à«\8b àª\9cà«\81નà«\81àª\82 àªªàª¾àª¨à«\81àª\82 '''નહà«\80 àª\96સà«\87''', àª¸àª¿àªµàª¾àª¯àª\95à«\87 àª¤à«\87 àªªàª¾àª¨à«\81àª\82 àª\96ાલà«\80 àª¹à«\8bય àª\85થવા àª¤à«\87 àªªàª£ àª\85નà«\8dયતà«\8dર àªµàª¾àª³àª¤à«\81àª\82 àªªàª¾àª¨à«\81àª\82 àª¹à«\8bય àª\85નà«\87 àª¤à«\87નà«\8b àª\95à«\8bàª\88 àª\87તિહાસ àª¨àª¾ àª¹à«\8bય.
+એ વાતની નોંધ લેશો કે, જો તમે પસંદ કરેલા નવા નામ વાળું પાનું અસ્તિત્વમાં હશે તો જુનું પાનું '''નહી ખસે''', સિવાયકે તે પણ અન્યત્ર વાળતું પાનું હોય અને તેનો કોઈ ઇતિહાસ ના હોય.
 આનો અર્થ એમ થાય છે કે જો તમે કોઈ તબક્કે ભુલ કરશો તો જે પાનાનું નામ બદલવાનો પ્રયત્ન કરતા હોવ તેને તમે ફરી પાછા જુના નામ પર જ પાછું વાળી શકશો, અને બીજું કે પહેલેથી બનેલા પાનાનું નામ તમે નામફેર કરવા માટે ના વાપરી શકો.
 
 '''ચેતવણી!'''
@@ -2930,12 +2975,20 @@ $1',
 'pageinfo-title' => ' $1 પાના ની માહિતી નૂ મથાડૂ',
 'pageinfo-header-basic' => 'સામાન્ય માહિતી',
 'pageinfo-header-edits' => 'ઇતિહાસ સંપાદન',
+'pageinfo-header-restrictions' => 'પાનાંની સુરક્ષા',
 'pageinfo-header-properties' => 'પાનાંના ગુણધર્મો',
 'pageinfo-display-title' => 'દેખાવ શિર્ષક',
+'pageinfo-default-sort' => 'મૂળભૂત ગોઠવણી કળ',
 'pageinfo-length' => 'પૃષ્ઠની લંબાઇ (બાઇટમાં)',
+'pageinfo-article-id' => 'પાનાં ઓળખ',
+'pageinfo-language' => 'પાનાંની વિગતની ભાષા',
 'pageinfo-robot-policy' => 'શોધ એન્જિન સ્થિતિ',
+'pageinfo-robot-index' => 'અનુક્રમિય',
+'pageinfo-robot-noindex' => 'અનુક્રમિય નહી',
 'pageinfo-views' => 'જોનારાની સંખ્યા',
 'pageinfo-watchers' => 'પાના નીરીક્ષકોની સંખ્યા',
+'pageinfo-redirects-name' => 'આ પાનાં પર વાળો',
+'pageinfo-subpages-name' => 'આ પાનાંનું ઉપપાનું',
 'pageinfo-firstuser' => 'પૃષ્ઠ સર્જક',
 'pageinfo-firsttime' => 'પૃષ્ઠ સર્જનની તારીખ',
 'pageinfo-lastuser' => 'છેલ્લો ફેરફાર કરનાર',
@@ -2943,10 +2996,16 @@ $1',
 'pageinfo-edits' => 'કુલ સંપાદનોની સંખ્યા',
 'pageinfo-authors' => 'ક્ષેત્રના લેખકોની કુલ સંખ્યા',
 'pageinfo-recent-edits' => 'તાજા ફેરફારોની સંખ્યા (છેલ્લા $1 દરમ્યાન)',
+'pageinfo-hidden-categories' => 'છુપી {{PLURAL:$1|શ્રેણી|શ્રેણીઓ}} ($1)',
+'pageinfo-templates' => 'પ્રયુક્ત {{PLURAL:$1|ઢાંચો|ઢાંચાઓ}} ($1)',
 'pageinfo-toolboxlink' => 'પૃષ્ઠમાહિતી',
 'pageinfo-redirectsto-info' => 'માહિતી',
 'pageinfo-contentpage-yes' => 'હા',
 'pageinfo-protect-cascading-yes' => 'હા',
+'pageinfo-category-info' => 'શ્રેણી માહિતી',
+'pageinfo-category-pages' => 'પાનાંઓની સંખ્યા',
+'pageinfo-category-subcats' => 'ઉપશ્રેણીઓની સંખ્યા',
+'pageinfo-category-files' => 'ફાઇલ્સની સંખ્યા',
 
 # Patrolling
 'markaspatrolleddiff' => 'નિરીક્ષીત અંકિત કરો',
@@ -3019,6 +3078,16 @@ $1',
 'ago' => '$1 પહેલાં',
 'just-now' => 'હમણાં',
 
+# Human-readable timestamps
+'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
 'bad_image_list' => 'ફોર્મેટ નીચે મુજબ છે:
 
@@ -3048,7 +3117,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'પહોળાઈ',
 'exif-imagelength' => 'ઊંચાઈ',
 'exif-bitspersample' => 'બીટ્સ પ્રતિ ભાગ',
@@ -3226,7 +3295,7 @@ $1',
 'exif-originalimageheight' => 'છબી પર ફેરફાર કર્યા પહેલા ની ઊંચાઈ',
 'exif-originalimagewidth' => 'છબી પર ફેરફાર કર્યા પહેલા ની પહોળાઈ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'અસંકોચિત',
 'exif-compression-2' => 'CCITT સમુદાય ૩ ૧-પરિમાણિય ફેરફાર કરેલુ Huffman રન લંબઈ એન્કોડિંગ',
 'exif-compression-3' => 'CCITT સમૂહ 3 ફેક્સ ઍનકોડિંગ',
@@ -3634,12 +3703,13 @@ $5
 'version-entrypoints-header-entrypoint' => 'પ્રવેશ સ્થળ',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'ફાઈલ પથ',
-'filepath-page' => 'ફાઇલ:',
-'filepath-submit' => 'કરો',
-'filepath-summary' => 'આ ખાસ પાનું કોઇ ફાઇલનો સંપૂર્ણ પથ બતાવે છે.
-ચિત્રોને તેમના પૂર્ણ ઘનત્વ સાથે બતાવાય છે, અન્ય ફાઈલો તેમને તેમના સંલગ્ન પ્રોગ્રામ દ્વારા સીધી ખોલવામાં આવશે.',
+# Special:Redirect
+'redirect-submit' => 'જાઓ',
+'redirect-value' => 'કિંમત:',
+'redirect-user' => 'સભ્ય નામ',
+'redirect-revision' => 'પાનાંની આવૃત્તિ',
+'redirect-file' => 'ફાઇલ નામ',
+'redirect-not-exists' => 'કિંમત મળી નહી',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'નકલ ફાઇલ શોધો',
@@ -3666,7 +3736,7 @@ $5
 'specialpages-group-highuse' => 'વધુ વપરાશ ધરાવતા પાના',
 'specialpages-group-pages' => 'પાનાની યાદીઓ',
 'specialpages-group-pagetools' => 'પાના સાધનો',
-'specialpages-group-wiki' => 'વિàª\95િ àª®àª¾àª¹àª¿àª¤à«\80સàª\82àª\9a અને સાધનો',
+'specialpages-group-wiki' => 'માહિતà«\80 અને સાધનો',
 'specialpages-group-redirects' => 'ખાસ પાના પરના સમૂહ દિશાનિર્દેશન',
 'specialpages-group-spam' => 'સ્પેમ સાધનો',
 
@@ -3730,23 +3800,26 @@ $5
 'htmlform-submit' => 'જમા કરો',
 'htmlform-reset' => 'ફેરફાર ઉલટાવો',
 'htmlform-selectorother-other' => 'અન્ય',
+'htmlform-no' => 'ના',
+'htmlform-yes' => 'હા',
+'htmlform-chosen-placeholder' => 'વિકલ્પ પસંદ કરો',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 પૂર્ણ શબ્દ શોધ સહીત',
 'sqlite-no-fts' => '$1 પૂર્ણ શબ્દ  શોધ વિકલ્પ વગર',
 
 # New logging system
-'logentry-delete-delete' => '$1 દ્વારા પાનું $3 દૂર કરવામાં આવ્યું',
-'logentry-delete-restore' => '$1 પુનઃસંગ્રહ પાનું $3',
-'logentry-delete-event' => '$1 àª¬àª¦àª²àª¾àª\88 àª¨àª¾ àª¦à«\83શà«\8dયતા {{PLURAL: $5 | àª²à«\8bàª\97 àª\98àª\9fના | $5 àª²à«\8bàª\97}} $3 àª\98àª\9fનાàª\93 àªªàª° $4',
-'logentry-delete-revision' => '$1 બદલાઈ ના દૃશ્યતા {{PLURAL: $5 | સુધારણા | $5 આવૃત્તિઓ}} $3 પાનાં પર: $4',
-'logentry-delete-event-legacy' => '$1 બદલાઈ $3 પર લોગ ઘટનાઓ દૃશ્યતા',
-'logentry-delete-revision-legacy' => '$1 બદલાઈ પાનાં પર આવૃત્તિઓની દૃશ્યતા $3',
-'logentry-suppress-delete' => '$1 àª¦àª¬àª¾àªµà«\80 àªªàª¾àª¨à«\81àª\82 $3',
-'logentry-suppress-event' => '$1  (છાની માહિતી) બદલાઈ {{PLURAL: $5 | લોગ ઘટના | $5 લોગ}} ની દ્રશ્યતા $3 : $4',
-'logentry-suppress-revision' => '$1 બદલાઈ ના દૃશ્યતા {{PLURAL: $5 | આવૃત્તિ એ | $5 આવૃત્તિઓ}}: $4 $3 પાનાં પર',
-'logentry-suppress-event-legacy' => '$1 ગુપ્ત બદલો $3 પર લોગ ઘટનાઓ દૃશ્યતા',
-'logentry-suppress-revision-legacy' => '$1 ગુપ્ત બદલાઈ પાનાં પર આવૃત્તિઓની દૃશ્યતા $3',
+'logentry-delete-delete' => '$1 દ્વારા પાનું $3 {{GENDER:$2|દૂર કરવામાં આવ્યું}}',
+'logentry-delete-restore' => '$1 {{GENDER:$2|પુનઃસંગ્રહ}} પાનું $3',
+'logentry-delete-event' => '$1 àª\8f {{PLURAL:$5|લà«\89àª\97 àª\98àª\9fના|$5 àª²à«\89àª\97 àª\98àª\9fનાàª\93}} àª¨à«\80 àª¦à«\8dરશà«\8dયતા $3 àªªàª° {{GENDER:$2|બદલà«\87લ}} àª\9bà«\87: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|બદલેલ}} બદલાઈ ના દૃશ્યતા {{PLURAL: $5 | સુધારણા | $5 આવૃત્તિઓ}} $3 પાનાં પર: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|બદલેલ}} બદલાઈ $3 પર લોગ ઘટનાઓ દૃશ્યતા',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|બદલેલ}} બદલાઈ પાનાં પર આવૃત્તિઓની દૃશ્યતા $3',
+'logentry-suppress-delete' => '$1 àª\8f $3 àªªàª¾àª¨à«\81àª\82 {{GENDER:$2|દબાવà«\8dયà«\81àª\82}}',
+'logentry-suppress-event' => '$1  (છાની માહિતી) {{GENDER:$2|બદલેલ}} બદલાઈ {{PLURAL: $5 | લોગ ઘટના | $5 લોગ}} ની દ્રશ્યતા $3 : $4',
+'logentry-suppress-revision' => '$1 àª\9bાનà«\80 àª®àª¾àª¹àª¿àª¤à«\80 {{GENDER:$2|બદલà«\87લ}} àª¬àª¦àª²àª¾àª\88 àª¨àª¾ àª¦à«\83શà«\8dયતા {{PLURAL: $5 | àª\86વà«\83તà«\8dતિ àª\8f | $5 àª\86વà«\83તà«\8dતિàª\93}}: $4 $3 àªªàª¾àª¨àª¾àª\82 àªªàª°',
+'logentry-suppress-event-legacy' => '$1 ગુપ્ત {{GENDER:$2|બદલેલ}} બદલો $3 પર લોગ ઘટનાઓ દૃશ્યતા',
+'logentry-suppress-revision-legacy' => '$1 ગુપ્ત {{GENDER:$2|બદલેલ}} બદલાઈ પાનાં પર આવૃત્તિઓની દૃશ્યતા $3',
 'revdelete-content-hid' => 'સામગ્રી છુપાયેલા',
 'revdelete-summary-hid' => 'ફેરફાર સાર છુપાયેલા',
 'revdelete-uname-hid' => 'વપરાશકર્તા નામ છુપાયેલા',
@@ -3755,16 +3828,16 @@ $5
 'revdelete-uname-unhid' => 'વપરાશકર્તા નામ છુપાવેલ નથીં',
 'revdelete-restricted' => 'પ્રબઁધકોના ફેરફાર કરવા પર પ્રતિબંધ મુકાયો',
 'revdelete-unrestricted' => 'પ્રબંધકોના ફેરફાર કરવા પર પ્રતિબંધ હટાવાયો.',
-'logentry-move-move' => '$1એ પાના $3ને $4 પર ખસેડ્યું',
+'logentry-move-move' => '$1એ {{GENDER:$2|ખસેડાયું }} પાના $3ને $4 પર ખસેડ્યું',
 'logentry-move-move-noredirect' => '$1એ દિશાનિર્દેશન છોડ્યા વગર પાના $3ને $4 પર વાળ્યું',
 'logentry-move-move_redir' => '$1એ દિશાનિર્દેશન કરીને પાના $3ને $4 પર ખસેડ્યું',
 'logentry-move-move_redir-noredirect' => '$1એ દિશાનિર્દેશન કરીને પાના $3ને $4 પર વાળ્યું પણ પાછળ દિશાનિર્દેશન છોડ્યું નહી',
 'logentry-patrol-patrol' => '$1 આવૃત્તિ ચિહ્નિત થયેલ પાનાં $4 $3 ચોકી કરવા ફરવા નીકળવું',
 'logentry-patrol-patrol-auto' => '$1 આપોઆપ ચિહ્નિત ચોકી પહેરો કરવા લાગ્યા આવૃત્તિ પાનું $4 $3',
-'logentry-newusers-newusers' => 'સભ્ય ખાતું $1 બનાવવામાં આવ્યું',
-'logentry-newusers-create' => 'સભ્ય ખાતું $1 બનાવવામાં આવ્યું',
-'logentry-newusers-create2' => 'સભ્ય ખાતું $3 $1 વડે બનાવવામાં આવ્યું',
-'logentry-newusers-autocreate' => 'àª\8fàª\95ાàª\89નà«\8dàª\9f $1 àª¬àª¨àª¾àªµàª¨àª¾àª° àª\86પà«\8bàª\86પ',
+'logentry-newusers-newusers' => 'સભ્ય ખાતું $1 {{GENDER:$2|બનાવવામાં આવ્યું}}',
+'logentry-newusers-create' => 'સભ્ય ખાતું $1 {{GENDER:$2|બનાવવામાં આવ્યું}}',
+'logentry-newusers-create2' => 'સભ્ય ખાતું $3 $1 વડે {{GENDER:$2|બનાવવામાં આવ્યું હતું}}',
+'logentry-newusers-autocreate' => 'વપરાશàª\95રà«\8dતા àª\96ાતà«\81àª\82 $1 àª\86પમà«\87ળà«\87 {{GENDER:$2|બનાવવામાàª\82 àª\86વà«\8dયà«\81àª\82 àª¹àª¤à«\81àª\82}}',
 'rightsnone' => '(કંઈ નહી)',
 
 # Feedback
@@ -3798,6 +3871,7 @@ $5
 'api-error-empty-file' => 'તમે ચડાવેલ ફાઈલ ખાલી છે',
 'api-error-emptypage' => 'નવા ખાલી પાનાં બનાવવાની પરવાનગી નથી.',
 'api-error-fetchfileerror' => 'આંતરીક ત્રુટી: ફાઈલ લાવતી વખતે અમુક ગડબડ થઈ',
+'api-error-fileexists-forbidden' => '"$1" નામે ફાઇલ અસ્તિત્વમાં છે, અને તે અધિલેખિત થઈ શકશે નહિ.',
 'api-error-file-too-large' => 'તમે ચડાવેલી ફાઈલ ખૂબ મોટી છે',
 'api-error-filename-tooshort' => 'ફાઇલ નામ ખૂબ ટૂંકું છે',
 'api-error-filetype-banned' => 'આ પ્રકારની ફાઈલ પ્રતિબંધિત છે.',
@@ -3817,6 +3891,7 @@ $5
 'api-error-ok-but-empty' => 'આંતરીક ત્રુટી: સર્વર તરફથી કોઈ પ્રત્યુત્તર નથી',
 'api-error-overwrite' => 'વિહરમાન ફાઇલ પર પુનર્લેખન કરવાની પરવાનગી નથી',
 'api-error-stashfailed' => 'આંતરીક ક્ષતિ: હંગામી ફાઈલ સંચયમાં સર્વર નિષ્ફળ',
+'api-error-publishfailed' => 'આંતરીક ક્ષતિ: હંગામી ફાઈલ સંચયમાં સર્વર નિષ્ફળ.',
 'api-error-timeout' => 'અપેક્ષિત સમય સુધી સર્વરે પ્રત્યુત્તર ન આપ્યો.',
 'api-error-unclassified' => 'અજ્ઞાત ચૂક થઈ.',
 'api-error-unknown-code' => 'અજ્ઞાત ક્ષતિ: "$1".',
index e94c0db..bc75fe0 100644 (file)
@@ -66,6 +66,7 @@ $messages = array(
 'tog-watchlisthidepatrolled' => 'Follee arraghyn er nyn scrutaghey er my rolley arrey',
 'tog-ccmeonemails' => 'Cur coip dou jeh dagh post-l verrym da ymmydeyr elley',
 'tog-showhiddencats' => 'Taishbyn ny ronnaghyn follit',
+'tog-useeditwarning' => 'Cur raaue dou my ta mee faagail duillag reaghey gyn sauail yn obbyr jeant aym',
 
 'underline-always' => 'Dagh keayrt',
 'underline-never' => 'Ny jean eh arragh',
@@ -500,6 +501,8 @@ Foddee shiu goll er ash as reaghey duillag t'ayn nish, ny [[Special:UserLogin|lo
 
 By chair dhyt smooinagh vel eh kiart goll er oai lesh reaghey yn duillag shoh.<br />
 Ta lioar ny scryssaghyn magh kiarit ayns shoh rere dty chaays hene:",
+'editwarning-warning' => "My faagys oo y duillag, hed caghlaaghyn erbee er coayl, foddee.
+My t'ou uss loggalt stiagh, foddee oo lhiettal y raaue shoh 'sy tosheeaghtyn ayd, 'sy rheynn \"Reaghey\".",
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Cha nod coontys y chroo',
@@ -594,9 +597,6 @@ My t'ou uss son ronsaghey dagh cooid (as shen goaill stiagh duillagyn resooney,
 'powersearch-field' => 'Ronsee er son',
 'search-external' => 'Ronsaghey mooie',
 
-# Quickbar
-'qbsettings-none' => 'Veg',
-
 # Preferences page
 'preferences' => 'Tosheeaghtyn',
 'mypreferences' => 'My hosheeaghtyn',
@@ -1353,7 +1353,7 @@ Bee adsyn elley follit dy seyr-obbragh.<br />
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lheead',
 'exif-imagelength' => 'Yrjid',
 'exif-ycbcrpositioning' => 'Soie Y as C',
@@ -1451,9 +1451,6 @@ Bee adsyn elley follit dy seyr-obbragh.<br />
 'version-license' => 'Kiedoonys',
 'version-software-version' => 'Lhieggan',
 
-# Special:FilePath
-'filepath-page' => 'Coadan:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Ennym y choadan:',
 'fileduplicatesearch-submit' => 'Ronsee',
index 0eaceca..c6883f7 100644 (file)
@@ -41,8 +41,6 @@ $messages = array(
 'tog-shownumberswatching' => "A nuna adadin ma'aikata masu bin sawun wannan shafi",
 'tog-oldsig' => 'Rigya-ganin sa-hannu da ake da shi',
 'tog-fancysig' => 'A ɗauki matanin sa-hannu a matsayin matanin Wiki (ba tare da mahaɗin otomatik ba)',
-'tog-externaleditor' => 'Bisa manufa, a yi amfani da editan matani daban (zuwa ga ƙwararri: kuna buƙatar sauya saitin kwamfyutarku)',
-'tog-externaldiff' => 'Bisa manufa, a yi amfani da kwatantau daban (zuwa ga ƙwararri: kuna buƙatar sauya saitin kwamfyutarku)',
 'tog-showjumplinks' => 'A lamunta mahaɗan "a tsallaka zuwa"',
 'tog-uselivepreview' => 'A yi amfani da rigya-gani mai sauƙi (ana buƙatar JavaScript) (hajar gwaji)',
 'tog-forceeditsummary' => 'A gargaɗe ni idan na ajiye kangon fili na taƙaitawa',
@@ -489,7 +487,7 @@ Ku gwada tare da amfani da \"all:\" don bincikar duka shafunan (har da shafunan
 # Special:ListGroupRights
 'listgrouprights-members' => '(jerin mambobi)',
 
-# E-mail user
+# Email user
 'emailuser' => "Aika wa wannan ma'aikaci imel",
 
 # Watchlist
index 1031e4d..adbc5cc 100644 (file)
  * @ingroup Language
  * @file
  *
+ * @author Anson2812
+ * @author Dream hot
  * @author Hakka
+ * @author Jetlag
+ * @author Mnemonic kek
  * @author Urhixidur
  */
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Hâ-va̍k lièn-chiap:',
-'tog-justify' => 'Thon-lo̍k tui-chhè',
-'tog-hideminor' => 'Chui-khiûn ke kiên-kói chûng yún-chhòng séu siû-kói',
-'tog-extendwatchlist' => 'Chen-kâ kam-sṳ chhîn-tân yî-khi̍p hién-sṳ só-yû khó chhái-yung ke kiên-kói',
-'tog-usenewrc' => 'Chen-khiòng chui-khiûn ke kiên-kói (JavaScript)',
-'tog-numberheadings' => 'Phêu-thì chhṳ-thung phiên-ho',
-'tog-showtoolbar' => 'Hién-sṳ phiên-cho kûng-khí-làn (JavaScript)',
-'tog-editondblclick' => 'Sûng-kit phiên-cho hong-mien (JavaScript)',
-'tog-editsection' => 'Yún-chún thûng-ko tiám-kit [phiên-siá] lièn-kiet phiên-cho thon-lo̍k',
-'tog-editsectiononrightclick' => 'Yún-chún yu-kit phêu-thì phiên-chho thon-lo̍k (JavaScript)',
-'tog-showtoc' => 'Hién-sṳ muk-liu̍k (chṳ̂m-tui yit-chông chhêu-ko sâm-ke phêu-thì ke vùn-chông)',
-'tog-rememberpassword' => 'Hâ-yit-chhṳ tên-ngi̍p ki-he̍t me̍t-me̍t (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations' => 'Chiông ngô chhóng-chho ke vùn-chông kâ-thiâm to ngô-ke kam-sṳ lie̍t-péu chûng',
-'tog-watchdefault' => 'Chiông ngô kiên-kói ke vùn-chông kâ-thiâm to ngô-ke kam-sṳ lie̍t-péu chûng',
-'tog-watchmoves' => 'Chiông ngô yì-thung ke vùn-chông kâ-ngi̍p ngô-ke kam-sṳ lie̍t-péu',
-'tog-watchdeletion' => 'Chiông ngô chhù-thet ke vùn-chông kâ-ngi̍p ngô-ke kam-sṳ lie̍t-péu chûng',
-'tog-minordefault' => 'Yi-siên chiông phiên-chho sat-thin vi séu phiên-cho',
-'tog-previewontop' => 'Chhai phiên-cho khiông ke song-fông hién-sṳ yi-ko',
-'tog-previewonfirst' => 'Thi-yit-chhṳ phiên-siá sṳ̀ hién-sṳ ngièn-vùn nui-yùng ke yi-ko',
-'tog-nocache' => 'Thìn-chṳ́ yung hong-mien ke khoai-chhí',
-'tog-enotifwatchlistpages' => 'Tông ngô kam-sṳ ke hong-mien kói-pien sṳ̀ fat-chhut E-mail thûng-tî ngô.',
-'tog-enotifusertalkpages' => 'Tông ngô-ke tui-fa-hong fat-sên kói-pien sṳ̀ fat E-mail thûng-tî ngô.',
-'tog-enotifminoredits' => 'Chit-sṳ́ he hong-mien ke séu siù-chho ya hiong ngô fat-chhut E-mail',
-'tog-enotifrevealaddr' => 'Chhai thûng-tî E-mail chûng hién-sṳ ngô-ke email thi-tiám',
-'tog-shownumberswatching' => 'Hién-sṳ kam-sṳ yung-fu ke su-muk',
-'tog-fancysig' => 'Sṳ́-yung ngièn-sṳ́ chhiâm-miàng (Put sán-sên chhṳ-thung lièn-kiet)',
-'tog-externaleditor' => 'Yi-thin sṳ́-yung ngoi-phu phiên-cho hi-khí',
-'tog-externaldiff' => 'Sat-thin sṳ́-yung ngoi-phu chhâ-yi fun-sak',
-'tog-showjumplinks' => 'Khí-yung "thiàu chón-to" fóng-mun lièn-kiet',
-'tog-uselivepreview' => 'Sṳ́-yung sṳ̍t-sṳ̀ yi-ko (JavaScript) (Sṳ-ngiam chûng)',
-'tog-forceeditsummary' => 'Tông hàn-mò sû-ngi̍p-chak yeu sṳ̀-sòng thì-siáng ngô.',
-'tog-watchlisthideown' => 'Kam-sṳ lie̍t-péu chûng yún-chhòng ngô-ke phiên-cho',
-'tog-watchlisthidebots' => 'Kam-sṳ lie̍t-péu chûng yún-chhòng kî-hi-ngìn ke phiên-chho',
-'tog-watchlisthideminor' => 'Kam-sṳ lie̍t-péu chûng yún-chhòng séu-siû-kói',
-'tog-ccmeonemails' => 'Tông ngô-ki email pûn khì-thâ yung-fu sṳ̀, ya-ki yit-fun fuk-pún to ngô-ke sin-siông.',
-'tog-diffonly' => 'Chhai pí-káu lióng-ke siû-thin pán-pún chhâ-yi sṳ̀ put hién-sṳ vùn-chông nui-yùng.',
-
-'underline-always' => 'Chúng-he sṳ́-yung',
-'underline-never' => 'Chhiùng put sṳ́-yung',
-'underline-default' => 'Hi-khí yi-thin',
+'tog-underline' => '鏈接加底線:',
+'tog-justify' => '段落對齊',
+'tog-hideminor' => '隱藏最近更改肚嘅細微編寫',
+'tog-hidepatrolled' => '隱藏最近更改肚巡查過嘅編寫',
+'tog-newpageshidepatrolled' => '隱藏新頁面清單肚巡查過嘅頁面',
+'tog-extendwatchlist' => '展開監視列表來顯示所有更改,毋單淨係最近嘅',
+'tog-usenewrc' => '在最近更改與監視列表中整合同一頁嘅修改 (愛有JavaScript)',
+'tog-numberheadings' => '標題自動編號',
+'tog-showtoolbar' => '顯示編寫工具欄 (愛有JavaScript)',
+'tog-editondblclick' => '雙撳編寫頁面 (愛有JavaScript)',
+'tog-editsection' => '允許通過點撳[編寫]鏈接編寫段落',
+'tog-editsectiononrightclick' => '允許右撳標題編寫段落 (愛有JavaScript)',
+'tog-showtoc' => '顯示目錄(針對一頁超過3隻標題嘅頁面)',
+'tog-rememberpassword' => '在邇隻瀏覽器記下亻厓嘅登入狀態(最多$1日)',
+'tog-watchcreations' => '加亻厓建立嘅頁面撈上傳嘅文件加入亻厓嘅監視列表',
+'tog-watchdefault' => '將亻厓編寫嘅頁面撈檔案加入亻厓嘅監視列表',
+'tog-watchmoves' => '將亻厓移動嘅頁面撈檔案加入亻厓嘅監視列表',
+'tog-watchdeletion' => '加亻厓刪除嘅頁面撈文件入亻厓嘅監視列表',
+'tog-minordefault' => '默認標記全部編寫為細微修改',
+'tog-previewontop' => '在編寫框上頭顯示預覽',
+'tog-previewonfirst' => '第一擺編寫時顯示預覽',
+'tog-nocache' => '停用瀏覽器嘅頁面緩存',
+'tog-enotifwatchlistpages' => '亻厓監視列表肚嘅頁面或文件有更動時,發電子郵件分亻厓',
+'tog-enotifusertalkpages' => '亻厓嘅交流頁有更改時,發電子郵件分亻厓',
+'tog-enotifminoredits' => '頁面撈文件嘅細修改也發電子郵件分我',
+'tog-enotifrevealaddr' => '在通知電子郵件肚顯示亻厓嘅電子郵件地址',
+'tog-shownumberswatching' => '展示監視中嘅使用人數目',
+'tog-oldsig' => '現有簽名:',
+'tog-fancysig' => '將簽名看做維基文字(毋會自動產生鏈接)',
+'tog-showjumplinks' => '啟用“跳轉到”訪問鏈接',
+'tog-uselivepreview' => '使用即時預覽(愛有 JavaScript)(實驗中)',
+'tog-forceeditsummary' => '還吂輸入編寫摘要時提醒亻厓',
+'tog-watchlisthideown' => '監視列表肚隱藏亻厓嘅編寫',
+'tog-watchlisthidebots' => '監視列表肚隱藏機器人嘅編寫',
+'tog-watchlisthideminor' => '監視列表肚隱藏細微編寫',
+'tog-watchlisthideliu' => '監視列表肚隱藏登入用戶嘅編輯',
+'tog-watchlisthideanons' => '監視列表肚隱藏匿名用戶嘅編輯',
+'tog-watchlisthidepatrolled' => '監視清單肚隱藏已巡查嘅編寫',
+'tog-ccmeonemails' => '當亻厓寄電子郵件分其他用戶時,也寄一份副本到亻厓嘅信箱',
+'tog-diffonly' => '對比版本毋同時下背毋展示頁面內容',
+'tog-showhiddencats' => '展示隱藏分類',
+'tog-norollbackdiff' => '执行回退後毋顯示差別',
+'tog-useeditwarning' => '當離開頁面之時變更還吂儲存,請提醒𠊎',
+
+'underline-always' => '總係使用',
+'underline-never' => '從來毋用',
+'underline-default' => '外皮或瀏覽器默認',
 
 # Font style option in Special:Preferences
-'editfont-default' => 'Hi-khí yi-thin',
+'editfont-style' => '編寫區字型樣式:',
+'editfont-default' => '瀏覽器默認',
+'editfont-monospace' => '等距字型',
+'editfont-sansserif' => '無襯線字型',
+'editfont-serif' => '襯線字型',
 
 # Dates
-'sunday' => 'Lî-pai-ngit',
-'monday' => 'Lî-pai-yit',
-'tuesday' => 'Lî-pai-ngi',
-'wednesday' => 'Lî-pai-sâm',
-'thursday' => 'Lî-pai-si',
-'friday' => 'Lî-pai-ńg',
-'saturday' => 'Lî-pai-liuk',
-'sun' => 'Lî-pai-ngit',
-'mon' => 'Lî-pai-yit',
-'tue' => 'Lî-pai-ngi',
-'wed' => 'Lî-pai-sâm',
-'thu' => 'Lî-pai-si',
-'fri' => 'Lî-pai-ńg',
-'sat' => 'Lî-pai-liuk',
-'january' => 'Yit-ngie̍t',
-'february' => 'Ngi-ngie̍t',
-'march' => 'Sâm-ngie̍t',
-'april' => 'Si-ngie̍t',
-'may_long' => 'Ńg-ngie̍t',
-'june' => 'Liuk-ngie̍t',
-'july' => 'Chhit-ngie̍t',
-'august' => 'Pat-ngie̍t',
-'september' => 'Kiú-ngie̍t',
-'october' => 'Sṳ̍p-ngie̍t',
-'november' => 'Sṳ̍p-yit-ngie̍t',
-'december' => 'Sṳ̍p-ngi-ngie̍t',
-'january-gen' => 'Yit-ngie̍t',
-'february-gen' => 'Ngi-ngie̍t',
-'march-gen' => 'Sâm-ngie̍t',
-'april-gen' => 'Si-ngie̍t',
-'may-gen' => 'Ńg-ngie̍t',
-'june-gen' => 'Liuk-ngie̍t',
-'july-gen' => 'Chhit-ngie̍t',
-'august-gen' => 'Pat-ngie̍t',
-'september-gen' => 'Kiú-ngie̍t',
-'october-gen' => 'Sṳ̍p-ngie̍t',
-'november-gen' => 'Sṳ̍p-yit-ngie̍t',
-'december-gen' => 'Sṳ̍p-ngi-ngie̍t',
-'jan' => 'Yit-ngie̍t',
-'feb' => 'Ngi-ngie̍t',
-'mar' => 'Sâm-ngie̍t',
-'apr' => 'Si-ngie̍t',
-'may' => 'Ńg-ngie̍t',
-'jun' => 'Liuk-ngie̍t',
-'jul' => 'Chhit-ngie̍t',
-'aug' => 'Pat-ngie̍t',
-'sep' => 'Kiú-ngie̍t',
-'oct' => 'Sṳ̍p-ngie̍t',
-'nov' => 'Sṳ̍p-yit-ngie̍t',
-'dec' => 'Sṳ̍p-ngi-ngie̍t',
+'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' => '1月',
+'feb' => '2月',
+'mar' => '3月',
+'apr' => '4月',
+'may' => '5月',
+'jun' => '6月',
+'jul' => '7月',
+'aug' => '8月',
+'sep' => '9月',
+'oct' => '10月',
+'nov' => '11月',
+'dec' => '12月',
 
 # Categories related messages
-'pagecategories' => '$1-ke fûn-lui',
-'category_header' => 'Lui-phe̍t "$1" chûng ke vùn-chông',
-'subcategories' => 'Fu-su̍k fûn-lui',
-'category-media-header' => '"$1" fûn-lui chûng ke kî-thí tóng-on',
-'hidden-categories' => '$1-ke Yún-chhòng fûn-lui',
-'listingcontinuesabbrev' => 'Chhṳ̀-siu̍k',
-
-'about' => 'Kôan-yî',
-'article' => 'Vùn-chông',
-'newwindow' => '(chhai sîn sṳ-chhûng chûng tá-khôi)',
-'cancel' => 'Chhí-sêu',
-'moredotdotdot' => 'Kien-tô...',
-'mypage' => 'Ngô-ke hong-mien',
-'mytalk' => 'Ngài-ke tui-fa ya̍p',
-'anontalk' => 'Ke-IP ke tui-fa hong',
-'navigation' => 'Thô-hòng',
-'and' => '&#32;lâu',
+'pagecategories' => '$1隻分類',
+'category_header' => '“$1”分類肚嘅頁面',
+'subcategories' => '子分類',
+'category-media-header' => '“$1”分類肚嘅媒體',
+'category-empty' => "''邇隻分類目前還吂包含頁面或者媒體文件。''",
+'hidden-categories' => '$1隻隱藏分類',
+'hidden-category-category' => '隱藏分類',
+'category-subcat-count' => '{{PLURAL:$2|邇隻分類有以下一隻子分類。|邇隻分類有$2隻子分類,以下列出矣$1隻。}}',
+'category-subcat-count-limited' => '邇隻分類有以下 $1 隻子分類。',
+'category-article-count' => '{{PLURAL:$2|本分類有以下一隻頁面。|本分類有$2隻頁面,以下列出矣$1隻。}}',
+'category-article-count-limited' => '邇隻分類有以下 $1 隻頁面。',
+'category-file-count' => '{{PLURAL:$2|邇隻分類有以下一隻文件。|邇隻分類有$2隻文件,以下列出矣$1隻。}}',
+'category-file-count-limited' => '邇隻分類有 $1 隻文件。',
+'listingcontinuesabbrev' => '續',
+'index-category' => '既索引嘅頁面',
+'noindex-category' => '還無索引嘅頁面',
+'broken-file-category' => '含有損壞文件鏈接嘅頁面',
+
+'about' => '關於',
+'article' => '內容頁面',
+'newwindow' => '(在新視窗肚打開)',
+'cancel' => '取消',
+'moredotdotdot' => '還較多...',
+'morenotlisted' => '有較多還吂列出嘅項目...',
+'mypage' => '頁面',
+'mytalk' => '交流',
+'anontalk' => '本IP地址嘅交流',
+'navigation' => '導航',
+'and' => '&#32;撈',
 
 # Cologne Blue skin
-'qbfind' => 'Chhìm-cháu',
-'qbbrowse' => 'Chhà-khon',
-'qbedit' => 'Phiên-siá',
-'qbpageoptions' => 'Vùn-chông sién-hong',
-'qbmyoptions' => 'Ngô-ke sién-hong',
-'qbspecialpages' => 'Thi̍t-sû hong-mien',
-'faq' => 'Sòng-kien mun-thì kié-tap',
-'faqpage' => 'Project:Sòng-kien mun-thì kié-tap',
+'qbfind' => '找尋',
+'qbbrowse' => '瀏覽',
+'qbedit' => '編寫',
+'qbpageoptions' => '頁面選項',
+'qbmyoptions' => '𠊎嘅頁面',
+'qbspecialpages' => '特殊頁面',
+'faq' => '常見問題解答',
+'faqpage' => 'Project:常見問題解答',
 
 # Vector skin
-'vector-action-delete' => 'Chhù-thet',
-'vector-action-move' => 'Yì-thung',
-'vector-action-protect' => 'Pó-fu',
-'vector-action-unprotect' => 'Kié-chhù pó-fu',
-'vector-view-create' => 'Tshóng-kien',
-'vector-view-edit' => 'Phiên-siá',
-'vector-view-viewsource' => 'Ngièn-sṳ́-tóng',
-
-'errorpagetitle' => 'Chho-ngu',
-'returnto' => 'Fán-fì to $1.',
-'tagline' => 'Chhut-chhṳ {{SITENAME}}',
-'help' => 'Pông-chhu',
-'search' => 'Chhìm-cháu',
-'searchbutton' => 'Chhìm-cháu',
-'go' => 'Chin-ngi̍p',
-'searcharticle' => 'Chin-ngi̍p',
-'history' => 'Vùn-chông li̍t-sṳ́',
-'history_short' => 'Li̍t-sṳ́',
-'updatedmarker' => 'Ngô song-chhṳ fóng-mun yî-lòi ke siû-kói',
-'printableversion' => 'Khó-lie̍t yin-pán',
-'permalink' => 'Yún-kiú lièn-kiet',
-'print' => 'Lie̍t-yin',
-'edit' => 'Phiên-chho',
-'create' => 'Tshóng-kien',
-'editthispage' => 'Phiên-siá pún-chông',
-'create-this-page' => 'Tshóng-kien liá-ke vùn-tsông',
-'delete' => 'Chhù-thet',
-'deletethispage' => 'Chhù-thet pún-chông',
-'undelete_short' => 'Fî-fu̍k yî-chhièn $1-ke pán-pún',
-'protect' => 'Pó-fu',
-'protect_change' => 'kiên-kói',
-'protectthispage' => 'Pó-fu pún-chông',
-'unprotect' => 'Kié-chhù pó-fu',
-'unprotectthispage' => 'Kié-chhù chhṳ́-chông pó-fu',
-'newpage' => 'Sîn vùn-chông',
-'talkpage' => 'Thó-lun pún-chông',
-'talkpagelinktext' => 'Tui-fa',
-'specialpage' => 'Thi̍t-sû hong-mien',
-'personaltools' => 'Ke-ngìn kûng-khí',
-'postcomment' => 'Fat-péu phìn-lun',
-'articlepage' => 'Chhà-khon vùn-chông',
-'talk' => 'Thó-lun',
-'views' => 'Kiám-sṳ',
-'toolbox' => 'Kûng-khí-siông',
-'userpage' => 'Chhà-khon yung-fu hong-mien',
-'projectpage' => 'Chhà-khon kie-va̍k hong-mien',
-'imagepage' => 'Chhà-khon thù-hiong hong-mien',
-'mediawikipage' => 'Kiám-sṳ sin-sit hong-mien',
-'templatepage' => 'Kiám-sṳ mù-pán hong-mien',
-'viewhelppage' => 'Kiám-sṳ sot-mìn hong-mien',
-'categorypage' => 'Kiám-ngiam fûn-lui hong-mien',
-'viewtalkpage' => 'Kiám-sṳ thó-lun hong-mien',
-'otherlanguages' => 'Khì-thâ ngî-ngièn',
-'redirectedfrom' => '(Chhùng-thin-hiong chhṳ $1)',
-'redirectpagesub' => 'Chhùng-thin-hiong hong-mien',
-'lastmodifiedat' => 'Liá-chông ke chui-heu siû-thin chhai $1 $2.',
-'viewcount' => 'Pún-chông yí-kîn pûn-ngìn khon-kien $1-chhṳ.',
-'protectedpage' => 'Pûn pó-fu ke vùn-chông',
-'jumpto' => 'Thiàu-chón to:',
-'jumptonavigation' => 'thô-hòng',
-'jumptosearch' => 'Chhìm-cháu',
+'vector-action-addsection' => '加入話題',
+'vector-action-delete' => '刪除',
+'vector-action-move' => '移動',
+'vector-action-protect' => '保護',
+'vector-action-undelete' => '恢復',
+'vector-action-unprotect' => '更改保護',
+'vector-simplesearch-preference' => '啟用簡化搜尋欄(僅限Vector外皮)',
+'vector-view-create' => '建立',
+'vector-view-edit' => '編寫',
+'vector-view-history' => '查看歷史',
+'vector-view-view' => '閱讀',
+'vector-view-viewsource' => '查看源碼',
+'actions' => '動作',
+'namespaces' => '名字空間',
+'variants' => '變換',
+
+'navigation-heading' => '導航菜單',
+'errorpagetitle' => '差錯',
+'returnto' => '轉頭到$1。',
+'tagline' => '從{{SITENAME}}來',
+'help' => '幫手',
+'search' => '搜尋',
+'searchbutton' => '搜尋',
+'go' => '入',
+'searcharticle' => '入',
+'history' => '頁面歷史',
+'history_short' => '歷史',
+'updatedmarker' => '亻厓上擺訪問以來嘅更新',
+'printableversion' => '做得印刷嘅版本',
+'permalink' => '永久鏈接',
+'print' => '印刷',
+'view' => '查看',
+'edit' => '編寫',
+'create' => '建立',
+'editthispage' => '編寫本頁',
+'create-this-page' => '建立本頁',
+'delete' => '刪除',
+'deletethispage' => '刪除本頁',
+'undelete_short' => '恢復$1隻分删除嘅编寫',
+'viewdeleted_short' => '查看$1項已刪除嘅修訂',
+'protect' => '保護',
+'protect_change' => '更改',
+'protectthispage' => '保護本頁',
+'unprotect' => '更改保護',
+'unprotectthispage' => '更改本頁保護',
+'newpage' => '新頁面',
+'talkpage' => '討論本頁',
+'talkpagelinktext' => '交流',
+'specialpage' => '特殊頁面',
+'personaltools' => '私人工具',
+'postcomment' => '新段落',
+'articlepage' => '查看內容頁面',
+'talk' => '討論',
+'views' => '查看數',
+'toolbox' => '工具箱',
+'userpage' => '查看用戶頁面',
+'projectpage' => '查看項目頁面',
+'imagepage' => '查看文件頁面',
+'mediawikipage' => '查看消息頁面',
+'templatepage' => '查看模板頁面',
+'viewhelppage' => '查看幫手頁面',
+'categorypage' => '查看分類頁面',
+'viewtalkpage' => '查看討論',
+'otherlanguages' => '其他語言',
+'redirectedfrom' => '(重定向自$1)',
+'redirectpagesub' => '重定向頁',
+'lastmodifiedat' => '邇隻頁面最近修訂於$1 $2。',
+'viewcount' => '邇隻頁面已經分人瀏覽過$1次。',
+'protectedpage' => '受保護頁面',
+'jumpto' => '跳轉到:',
+'jumptonavigation' => '導航',
+'jumptosearch' => '搜尋',
+'view-pool-error' => '好抱歉,太多用戶嘗試緊流覽邇頁,使服務器超出負擔。請等多一刻再嘗試。
+
+$1',
+'pool-timeout' => '等待鎖定超時',
+'pool-queuefull' => '請求隊列满矣',
+'pool-errorunknown' => '毋知得嘅差錯',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Yû-kôan {{SITENAME}}',
-'aboutpage' => 'Project:Kôan-yî',
-'copyright' => 'Pún-chham ke chhiòn-phu vùn-pún nui-yùng chhai $1 chṳ̂ thiàu-khóan hâ thì-kiûng.',
-'copyrightpage' => '{{ns:project}}:Pán-khièn sin-sit',
-'currentevents' => 'Hien-sṳ̀ sṳ-khien',
-'currentevents-url' => 'Project:Hien-sṳ̀ sṳ-khien',
-'disclaimers' => 'Miên-chit sâng-mìn',
-'disclaimerpage' => 'Project:Yit-pân ke miên-chit sâng-mìn',
-'edithelp' => 'Phiên-siá pông-chhu',
-'edithelppage' => 'Help:Phiên-cho hong-mien',
-'helppage' => 'Help:Pông-chhu',
-'mainpage' => 'Thèu Ya̍p',
-'mainpage-description' => 'Thèu-chông',
-'policy-url' => 'Project:Fông-chṳ̂m',
-'portal' => 'Sa-khî',
-'portal-url' => 'Project:Sa-khî',
-'privacy' => 'Yún-sṳ̂ chṳn-chhet',
-'privacypage' => 'Project:Yún-sṳ̂ chṳn-chhet',
-
-'badaccess' => 'Khièn-han chho-ngu',
-'badaccess-group0' => 'Ngì kông-chhòi ke chhiáng-khiù mò yún-chún chṳp-hàng.',
-'badaccess-groups' => 'Ngì kông-chhòi ke chhiáng-khiù chṳ́-yû $1 yung-fu-chû ke yung-fu chhòi-nèn sṳ́-yung.',
-
-'versionrequired' => 'Sî-yeu MediaWiki $1-pán',
-'versionrequiredtext' => 'Sî-yeu pán-pún $1-ke MediaWiki chhòi-nèn sṳ́-yung chhṳ́-chông. Chhâm-cheu [[Special:Version|Pán-pún]].',
-
-'ok' => 'OK',
-'retrievedfrom' => 'Chhí-chhṳ "$1"',
-'youhavenewmessages' => 'Ngì yû $1($2)。',
-'newmessageslink' => 'Sîn sin-sit',
-'newmessagesdifflink' => 'Sông-chhṳ kiên-kói',
-'youhavenewmessagesmulti' => 'Ngì chhai $1 yû yit-thiàu sîn sêu-sit',
-'editsection' => 'phiên-siá',
-'editold' => 'phiên-cho',
-'viewsourceold' => 'Tshà-khon Kîn-ngièn',
-'editlink' => 'piên-sip',
-'viewsourcelink' => 'tshà-khon kîn-ngièn',
-'editsectionhint' => 'Phiên-siá thon-lo̍k: $1',
-'toc' => 'Muk-liu̍k',
-'showtoc' => 'Hién-sṳ',
-'hidetoc' => 'yún-chhòng',
-'thisisdeleted' => 'Chhà-khon fe̍t-chá fî-fu̍k $1?',
-'viewdeleted' => 'Kiám-sṳ $1?',
-'restorelink' => '$1-ke pûn chhù-hi ke pán-pún',
-'feedlinks' => 'Só-thin:',
-'feed-invalid' => 'Mò-háu ke só-thin lui-hìn.',
-'site-rss-feed' => '$1 ke RSS thin-ye̍t',
-'site-atom-feed' => '$1 ke Atom thin-ye̍t',
-'page-rss-feed' => '"$1" ke RSS thin-ye̍t',
-'page-atom-feed' => '"$1" ke Atom thin-ye̍t',
-'red-link-title' => '$1 (Liá-ya̍p hàn-mò chhùn-chhai)',
+'aboutsite' => '關於 {{SITENAME}}',
+'aboutpage' => 'Project:關於',
+'copyright' => '本站內容使用$1條款授權。',
+'copyrightpage' => '{{ns:project}}:版權信息',
+'currentevents' => '新聞動態',
+'currentevents-url' => 'Project:新聞動態',
+'disclaimers' => '免責聲明',
+'disclaimerpage' => 'Project:一般免責聲明',
+'edithelp' => '編寫幫手',
+'edithelppage' => 'Help:編寫',
+'helppage' => 'Help:目錄',
+'mainpage' => '頭頁',
+'mainpage-description' => '頭頁',
+'policy-url' => 'Project:方針',
+'portal' => '社區主頁',
+'portal-url' => 'Project:社區主頁',
+'privacy' => '隱私政策',
+'privacypage' => 'Project:隱私政策',
+
+'badaccess' => '權限差錯',
+'badaccess-group0' => '系統毋准汝執行頭先講求嘅操作。',
+'badaccess-groups' => '汝正先請求嘅操作單淨有{{PLURAL:$2|邇隻|邇兜}}用戶群組嘅用戶做得使用:$1',
+
+'versionrequired' => '愛有MediaWiki $1版',
+'versionrequiredtext' => '愛有版本$1嘅MediaWiki正做得使用本頁。
+參詳[[Special:Version|版本頁面]]。',
+
+'ok' => '做得',
+'retrievedfrom' => '來自"$1"',
+'youhavenewmessages' => '汝有$1($2)。',
+'newmessageslink' => '新消息',
+'newmessagesdifflink' => '上擺更改',
+'youhavenewmessagesfromusers' => '汝有來自{{PLURAL:$3|另一位用戶|$3位用戶}}嘅$1($2)。',
+'youhavenewmessagesmanyusers' => '汝有來自多位用戶嘅$1( $2 )。',
+'newmessageslinkplural' => '{{PLURAL:$1|一條新信息|新信息}}',
+'newmessagesdifflinkplural' => '最新{{PLURAL:$1|更改|更改}}',
+'youhavenewmessagesmulti' => '汝在$1肚有新消息',
+'editsection' => '編寫',
+'editold' => '編寫',
+'viewsourceold' => '查看源碼',
+'editlink' => '編寫',
+'viewsourcelink' => '查看源碼',
+'editsectionhint' => '編寫章節: $1',
+'toc' => '目錄',
+'showtoc' => '展示',
+'hidetoc' => '隱藏',
+'collapsible-collapse' => '摺叠',
+'collapsible-expand' => '展開',
+'thisisdeleted' => '查看或者恢復$1?',
+'viewdeleted' => '查看$1?',
+'restorelink' => '$1隻分人刪除嘅版本',
+'feedlinks' => '訂閱:',
+'feed-invalid' => '無效嘅訂閱類型。',
+'feed-unavailable' => '毋提供聯合訂閱源',
+'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' => '升序',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Vùn-chông',
-'nstab-user' => 'Yung-fu thiàu-muk',
-'nstab-media' => 'Chhiòn-thí hong-mien',
-'nstab-special' => 'Thi̍t-sû-ya̍p',
-'nstab-project' => 'Kie-va̍k hong-mien',
-'nstab-image' => 'Tóng-on',
-'nstab-mediawiki' => 'Sin-sit',
-'nstab-template' => 'Mù-pán',
-'nstab-help' => 'Pông-chhu sot-mìn',
-'nstab-category' => 'Fûn-lui',
+'nstab-main' => '頁面',
+'nstab-user' => '用戶頁面',
+'nstab-media' => '媒體頁面',
+'nstab-special' => '特殊頁面',
+'nstab-project' => '項目頁面',
+'nstab-image' => '文件',
+'nstab-mediawiki' => '信息',
+'nstab-template' => '模板',
+'nstab-help' => '幫手頁面',
+'nstab-category' => '分類',
 
 # Main script and global functions
-'nosuchaction' => 'Mò-yû liá-ke min-lin',
-'nosuchactiontext' => 'URL chhiáng-khiù ke min-lin mò-fap pûn liá-ke wiki sṳt-phe̍t',
-'nosuchspecialpage' => 'Mò-yû liá-ke thi̍t-sû hong-mien',
-'nospecialpagetext' => 'Ngì chhiáng-khiù ke vùn-chông mò-fap pûn liá-ke wiki sṳt-phe̍t.',
+'nosuchaction' => '無邇條命令',
+'nosuchactiontext' => '邇URL所指定嘅動作無效。
+汝可能打錯URL,或撳到錯誤鏈接。
+還可能係{{SITENAME}}所使用嘅軟件出現矣錯誤。',
+'nosuchspecialpage' => '邇隻特殊页面毋存在',
+'nospecialpagetext' => '<strong>汝請求嘅特殊頁面無效。</strong>
+
+[[Special:SpecialPages|{{int:specialpages}}]]肚列出矣所有效特殊頁面嘅列表。',
 
 # General errors
-'error' => 'Chho-ngu',
-'databaseerror' => 'Chṳ̂-liau-khu ke chho-ngu',
-'dberrortext' => 'Fat-sên chṳ̂-liau-khu chhà-chhìm fa-ngî chho-ngu. Khó-nèn he ngiôn-thí chhṳ-sṳ̂n ke chho-ngu só yîn-hí. Chui-heu yit-chhṳ chṳ̂-liau-khu chhà-chhìm chṳ́-lin he: <blockquote><tt>$1</tt></blockquote> lòi-chhṳ "<tt>$2</tt>"。 MySQL fán-fì chho-ngu "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Fat-sên liáu yit-ke chṳ̂-liau-khu thiàu-chhà fa-ngî chho-ngu. Chui-heu yit-chhṳ ke chṳ̂-liau-khu thiàu-chhà he: "$1" lòi-ngièn "$2". MySQL fì-chón chho-ngu "$3: $4".',
-'laggedslavemode' => 'Kín-ko: Vùn-chông khó-nèn put pâu-hàm chui-khiûn ke kiên-kói.',
-'readonly' => 'Chṳ̂-liau-khu kim-chṳ́ fóng-mun',
-'enterlockreason' => 'Chhiáng sû-ngi̍p kim-chṳ́ fóng-mun ke ngièn-yîn, pâu-hàm kû-kie chhùng-sîn khôi-fong ke sṳ̀-kiên',
-'readonlytext' => 'Chṳ̂-liau-khu muk-chhièn kim-chṳ́ sû-ngi̍p sîn nui-yùng khi̍p kiên-kói, liá-hàn khó-nèn he chhut-yì chṳ̂-liau-khu chang-chhai vì-chhṳ̀ chhùng-siû, chṳ̂-heu hí-khó fî-fu̍k. Kón-lî-yèn yû yî-ha ke kié-sṳt: <p>$1</p>',
-'missing-article' => 'Chṳ̂-liau-khù cháu-put-chhok vùn-sṳ "$1" $2.
-
-<p>Thûng-sòng liá-he yîn-vi siù-thin li̍t-sṳ́-ya̍p sông ko-sṳ̀ ke lièn-kiet to yí-kîn pûn chhù-thet ke ya̍p só thô-chṳ ke.</p>
-
-<p>Na-he chhìn-khóng m-hè liá-yong, ngì khó-nèn cháu-táu liáu ngiôn-thí nui ke yit-ke chhu-chhùng.
-Chhiáng ki-liu̍k hâ URL thi-chí, pin hiong [[Special:ListUsers/sysop|Kón-lî-yèn]] po-ko.</p>',
-'missingarticle-rev' => '(siù-thin #: $1)',
-'missingarticle-diff' => '(Tshâ-phe̍t: $1, $2)',
-'readonly_lag' => 'Fu-su̍k chṳ̂-liau-khu fu̍k-vu-hi chang-chhai chiông khoai-chhí kiên-sîn to chú fu̍k-vu-hi, chṳ̂-liau-khu yí-kîn pûn chhṳ-thung fûng-só',
-'internalerror' => 'Nui-phu chho-ngu',
-'internalerror_info' => 'Nui-phu tsho-ngu: $1',
-'filecopyerror' => 'Mò-fap fuk-chṳ vùn-khien "$1" to "$2".',
-'filerenameerror' => 'Mò-fap chhùng min-miàng vùn-khien "$1" to "$2".',
-'filedeleteerror' => 'Mò-fap chhù-thet vùn-khien "$1".',
-'filenotfound' => 'Put-nèn chhìm-cháu to vùn-khien "$1".',
-'fileexistserror' => 'Mò-fap siá-ngi̍p tóng-on "$1": tóng-on yí-kîn tshùn-tshai',
-'unexpected' => 'Put-chṳn-sòng chhṳ̍t: "$1"="$2".',
-'formerror' => 'Chho-ngu: mò-fap thì-kâu péu-tân',
-'badarticleerror' => 'Vù-fap chhai pún-hong song chin-hàng chhṳ́-hong ke chhâu-chok.',
-'cannotdelete' => 'Mò-fap chhù-thet sién-thin ke vùn-chông fe̍t-he thù-chhiong (Kí khó-nèn yí-kîn pûn khì-thâ-ngìn chhù-hi liáu).',
-'badtitle' => 'Chho-ngu ke phêu-thì',
-'badtitletext' => 'Só chhiáng-khiù hong-mien ke phêu-thì he mò-háu ke, mò-chhùn-chhai, khiam-ko ngî-ngièn fe̍t-chá khiam-ko wiki lièn-kiet ke phêu-thì chho-ngu.',
-'perfcached' => 'Yî-ha chṳ̂-liau lòi-chhṳ khoai-chhí, khó-nèn yû chho-ngu. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Yî-ha he khoai-chhí chṳ̂-liau, chui-heu kiên-sîn sṳ̀-kiên he $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
-'querypage-no-updates' => 'Tông-chhièn  kim-chṳ́ tui chhṳ́-chông chin-hàng kiên-sîn. Chhṳ́-chhu ke chṳ̂-liau chiông put-nèn pûn chhùng-sîn chṳ́n-lî.',
-'wrong_wfQuery_params' => 'Chho-ngu ke chhâm-su thô-chṳ wfQuery()<br />
-Chhṳ-su: $1<br />
-Chhà-khon: $2',
-'viewsource' => 'Ngièn-sṳ́-tóng',
-'actionthrottled' => 'Thung-tsok yí-kîn ap-tsṳ',
-'protectedpagetext' => 'Pún-chông yí-kîn pûn fûng-só put yún-chún phiên-cho.',
-'viewsourcetext' => 'Ngì khó-yî chhà-khon pin fuk-chṳ pún vùn-chông ke kîn-ngièn.',
-'protectedinterface' => 'Ke-chông thì-kiûng liáu ngiôn-thí ke kie-mien vùn-sṳ, kí yí-kîn pûn fûng-só fòng-chṳ́ sùi-yi ke siû-kói.',
-'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
-Changes to this page will affect the appearance of the user interface for other users.
-For translations, please consider using [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
-'sqlhidden' => '(Yún-chhòng SQL ke chhà-chhìm)',
-'cascadeprotected' => 'Liá-ke vùn-chông yí-kîn pûn pó-fu, yîn-vi liá-ke hong-mien pûn yî-ha phêu-chu "lièn-só pó-fu" ke {{PLURAL:$1|yit-ke|tô-ke}} pûn pó-fu vùn-chông pâu-hàm:',
-'ns-specialprotected' => 'Chhai thi̍t-sû miàng-sṳ khúng-kiên tsûng ke vùn-thí he vù-nèn piên-sip ke.',
+'error' => '差錯',
+'databaseerror' => '數據庫差錯',
+'dberrortext' => '發生數據庫查詢語法錯誤。
+可能係由於軟體自身嘅錯誤所引起。
+最後一次數據庫查詢指令係:
+<blockquote><code>$1</code></blockquote>
+來自於函數“<code>$2</code>”。
+數據庫返回錯誤“<samp>$3: $4</samp>”。',
+'dberrortextcl' => '發生數據庫查詢語法錯誤。
+最後一次嘅數據庫查詢是:
+「$1」
+來自於函數「$2」。
+數據庫返回錯誤「$3: $4」。',
+'laggedslavemode' => "'''警告:'''頁面可能毋包含最近嘅更新。",
+'readonly' => '數據庫分人鎖定',
+'enterlockreason' => '請撳入禁止訪問原因, 包括估計重新開放嘅時間',
+'readonlytext' => '數據庫今下禁止輸入新內容撈更改,
+邇好有可能係由於數據庫維修緊,完成後就會恢復。
+
+管理員有下背嘅解釋:$1',
+'missing-article' => '數據庫尋毋到文字“$1”$2。
+
+邇通常係由於點撳矣鏈向過期毋同或曆史頁面嘅鏈接,但原有修訂已分刪除所導致嘅。
+
+假使情況毋係恁樣,汝可能尋到矣軟件嘅一隻臭蟲(bug)。請錄下URL地址,並向[[Special:ListUsers/sysop|管理員]]報告。',
+'missingarticle-rev' => '(修訂版本號#: $1)',
+'missingarticle-diff' => '(差別: $1,$2)',
+'readonly_lag' => '附屬數據庫服務器正在將緩存更新到主服務器肚,數據庫已分自動鎖定',
+'internalerror' => '內部差錯',
+'internalerror_info' => '內部差錯:$1',
+'fileappenderrorread' => '附加當時無辦法讀取「$1」。',
+'fileappenderror' => '無辦法附加“$1”到“$2”。',
+'filecopyerror' => '文件“$1”無辦法複製到“$2”。',
+'filerenameerror' => '文件“$1”到無辦法重新命名到“$2”。',
+'filedeleteerror' => '刪除毋到“$1”文件。',
+'directorycreateerror' => '無辦法建立目錄“$1”。',
+'filenotfound' => '尋毋到“$1”文件。',
+'fileexistserror' => '無法寫入文件“$1”:文件已存在',
+'unexpected' => '毋正常數值:"$1"="$2"。',
+'formerror' => '差錯:無法提交表單',
+'badarticleerror' => '無法在邇頁進行邇隻操作。',
+'cannotdelete' => '無辦法刪除頁面或圖片「$1」。
+其可能已經分其他人刪除訖矣。',
+'cannotdelete-title' => '無辦法刪除頁面「$1」',
+'delete-hook-aborted' => '刪除分勾仔中止。
+其毋曾提供任何解釋。',
+'badtitle' => '有錯嘅標題',
+'badtitletext' => '所請求頁面嘅標題是無效嘅、毋存在嘅,跨語言或跨wiki鏈接嘅標題有錯。其可能包含一隻或還較多做毋得用於標題嘅字符。',
+'perfcached' => '下列係緩存數據,因此可能毋係最新嘅。最多{{PLURAL:$1|單淨有1嘅結果|$1嘅結果}}可用。',
+'perfcachedts' => '下列係緩存數據,其最後更新時間係$1。單淨有{{PLURAL:$4|一嘅結果|$4嘅結果}}會畀顯示。',
+'querypage-no-updates' => '當前禁止對邇頁面進行更新。
+邇位嘅數據將做毋得分立即重新整理。',
+'wrong_wfQuery_params' => '有錯嘅參數分傳遞到wfQuery()<br />
+函數:$1<br />
+查詢:$2',
+'viewsource' => '查看源碼',
+'viewsource-title' => '查看$1嘅源代碼',
+'actionthrottled' => '動作已經壓制',
+'actionthrottledtext' => '基於反垃圾嘅考量,短時間內毋可以多次重複某操作,今下汝已經超過邇隻上限。
+請在數分鐘後再嘗試。',
+'protectedpagetext' => '邇隻頁面已經分人保護以防止編輯或其他操作。',
+'viewsourcetext' => '汝做得查看並複製本頁面嘅源碼:',
+'viewyourtext' => "汝可以查看並複製'''汝對邇隻頁面作出編寫後'''嘅源代碼:",
+'protectedinterface' => '邇頁提供此wiki軟體嘅介面文字,其已畀保護以防止惡意修改。
+假使想修改所有wiki嘅翻譯,請到[//translatewiki.net/ translatewiki.net]上嘅MediaWiki本地化計畫。',
+'editinginterface' => "'''警告:'''汝今下編寫緊嘅頁面係用於提供軟件嘅界面文字。
+改變邇頁將影響其他在邇隻wiki上嘅用戶界面外觀。
+假使愛修改所有wiki嘅翻譯,請到[//translatewiki.net/ translatewiki.net]上嘅MediaWiki本地化計劃。",
+'sqlhidden' => '(隱藏SQL查詢)',
+'cascadeprotected' => '邇隻頁面已經畀保護,因為邇隻頁面被以下已標註"聯鎖保護"嘅{{PLURAL:$1|一個|多個}}畀保護頁面包含:
+$2',
+'namespaceprotected' => "汝還無權限編輯'''$1'''名字空間嘅頁面。",
+'customcssprotected' => '汝還無權限編輯邇隻CSS頁面,因為其包含矣其他用戶嘅個人設置。',
+'customjsprotected' => '汝還無權限去編輯邇隻JavaScript頁面,因為其包含矣另一用戶嘅個人設定。',
+'ns-specialprotected' => '邇兜特殊頁面係毋做得編輯嘅。',
+'titleprotected' => "邇隻標題已經分[[User:$1|$1]]保護來防止建立。理由係''$2''。",
+'filereadonlyerror' => '無辦法修改文件「$1」因為文件庫「$2」處於唯讀模式。 !
+管理員鎖定其嘅解釋係:「$3」。',
+'invalidtitle-knownnamespace' => '使用名字空間「$2」與文本「$3」嘅無效標題',
+'invalidtitle-unknownnamespace' => '使用未知名字空間編號$1與文本“$2”嘅無效標題',
+'exception-nologin' => '還吂登入',
+'exception-nologin-text' => '你愛登入本wiki正做得查閲邇頁或進行操作。',
 
 # Virus scanner
-'virus-unknownscanner' => 'vù-tî ke fòng phiang-thu̍k:',
+'virus-badscanner' => "損壞設定: 未知嘅病毒掃瞄器: ''$1''",
+'virus-scanfailed' => '掃瞄失敗 (代碼 $1)',
+'virus-unknownscanner' => '還吂知嘅反病毒軟件:',
 
 # Login and logout pages
-'logouttext' => "'''Ngì hien-chhai yí-kîn thui-chhut.'''
-
-Ngì khó-yî ki-siu̍k yî ngia̍k-miàng fông-sṳt sṳ́-yung {{SITENAME}}, fe̍t-chá chai-chhṳ yî siông-thùng fe̍t-he mò-thùng yung-fu sṳ̂n-fun tên-ngi̍p.",
-'yourname' => 'Yung-fu-miàng',
-'yourpassword' => 'Me̍t-ma:',
-'yourpasswordagain' => 'Chai-chhṳ sû-ngi̍p me̍t-ma:',
-'remembermypassword' => 'Hâ-chhṳ tên-ngi̍p ki-he̍t pi-me̍t (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'yourdomainname' => 'Ngì ke mióng',
-'externaldberror' => 'Liá-ke khó-nèn he chhut-yì ngoi-phu ngiam-chṳn chṳ̂-liau-khu chho-ngu fe̍t-chá ngì pûn-ngìn kim-chṳ́ kiên-sîn ngì-ke ngoi-phu chong-ho.',
-'login' => 'Tên-ngi̍p',
-'nav-login-createaccount' => 'Tên-ngi̍p / Kien-li̍p sîn chong-ho',
-'loginprompt' => 'Yeu tên-ngi̍p to {{SITENAME}}, ngì pit-sî khí-yung cookie kûng-nèn',
-'userlogin' => 'Tên-ngi̍p / Kien-li̍p sîn chong-ho',
-'userloginnocreate' => 'Tên-ngi̍p',
-'logout' => 'Tên-chhut',
-'userlogout' => 'Tên-chhut',
-'notloggedin' => 'Hàn-mò tên-ngi̍p',
-'nologin' => "Ngì hàn-mò chong-ho mâ? '''$1'''.",
-'nologinlink' => 'Kien-li̍p sîn chong-ho',
-'createaccount' => 'Kien-li̍p sîn-ke chong-ho',
-'gotaccount' => "Yí-kîn yúng-yû chong-ho? '''$1'''.",
-'gotaccountlink' => 'Tên-ngi̍p',
-'createaccountmail' => 'thûng-ko e-mail',
-'createaccountreason' => 'Ngièn-yîn:',
-'badretype' => 'Ngì só sû-ngi̍p ke pi-me̍t pin mò siông-thùng.',
-'userexists' => 'Ngì sû-ngi̍p ke yung-fu miàng-chhṳ̂n yí-kîn chhùn-chhai, chhiáng nang-ngoi sién yit-ke.',
-'loginerror' => 'Tên-liu̍k chho-ngu',
-'nocookiesnew' => 'Yí-kîn sṳ̀n-kûng chhóng-li̍p sîn yung-fu! chṳ̂n-chhet to ngì yí-kîn kôan-pit Cookies, chhiáng khôi-khí kí pin tên-ngi̍p.',
-'nocookieslogin' => '{{SITENAME}} li-yung Cookies chin-hàng yung-fu tên-ngi̍p, chṳ̂n-chhet to ngì yí-kîn kôan-pit Cookies, chhiáng khôi-khí kí pin chhùng-sîn tên-ngi̍p.',
-'noname' => 'Ngì hàn-mò sû-ngi̍p yit-ke yû-háu ke yung-fu miàng.',
-'loginsuccesstitle' => 'Tên-ngi̍p sṳ̀n-kûng',
-'loginsuccess' => "'''Ngì hien-chhai yî \"\$1\" ke sṳ̂n-fun tên-ngi̍p {{SITENAME}}.'''",
-'nosuchuser' => 'Chhìm-cháu put-to yung-fu "$1". Kiám-chhà ngì-ke piang-siá, fe̍t-chá yung ha-mien ke péu-kak kien-li̍p yit-ke sîn chong-ho.',
-'nosuchusershort' => 'Mò-yû yit-ke miàng vi "$1" ke yung-fu. Chhiáng kiám-chhà ngì-ke sû-ngi̍p ke vùn-sṳ he-féu yû chho-ngu.',
-'nouserspecified' => 'Ngì sî-yeu chṳ́-thin yit-ke yung-fu-miàng.',
-'wrongpassword' => 'Ngì sû-ngi̍p ke me̍t-me̍t chho-ngu, chhiáng chai chhṳ yit-chhṳ.',
-'wrongpasswordempty' => 'Hàn-mò sû-ngi̍p me̍t-me̍t! chhiáng chhûng-chhṳ.',
-'passwordtooshort' => 'Ngì-ke me̍t-me̍t put chṳn-khok fe̍t-he thai-tón, put-nèn séu-yî $1-ke sṳ-ngièn, song-chhiá pit-sî lâu yung-fu-miàng put-thùng.',
-'mailmypassword' => 'Chiông sîn me̍t-ma ki-pûn ngô',
-'passwordremindertitle' => '{{SITENAME}} me̍t-me̍t thì-siáng',
-'passwordremindertext' => 'Yû-ngìn (khó-nèn he ngì, lòi-chhṳ IP thi-tiám $1) yêu-khiù chiông sîn-ke{{SITENAME}} ($4) ke tên-ngi̍p me̍t-me̍t ki-kî. Yung-fu "$2" ke me̍t-me̍t hien-chhai he "$3". Chhiáng chhṳ-li̍p tên-ngi̍p pin kiên-kói me̍t-me̍t. Kó-yèn he khì-thâ ngìn  fat-chhut ke-chhiáng-khiù, fe̍t-chá ngì yí-kîn ki-tet me̍t-me̍t pin put chún-phi kói-pien kí, khó-yî fut-lio̍k chhṳ́ sêu-sit khi̍p ki-siu̍k sṳ́-yung ngì-ke khiu me̍t-me̍t.',
-'noemail' => 'Yung-fu "$1" hàn-mò tên-ki email thi-tiám.',
-'passwordsent' => 'Yung-fu "$1" ke sîn me̍t-me̍t yí-kîn ki-vông só tên-ki ke email thi-tiám. Chhiáng chhai sû-tó heu chai-hi tên-ngi̍p.',
-'blocked-mailpassword' => 'Chhai-yî liá-ke yung-fu pûn fûng-kim, chhiam-sṳ̀ kim-chṳ́ ngì chhiáng-khiù sṳ̂n-chhiáng sîn pi-me̍t. Chho-sṳ̀n mò phien-kin chhiáng kien-liong.',
-'eauthentsent' => 'Yit-fûng khok-ngin sin yí-kîn fat-sung to só-sṳ ke thi-tiám. Chhai fat-sung khì-thâ email to chhṳ́ chong-fu chhièn, ngì pit-sî chui-siên yî-cheu liá-fûng sin chûng ke chṳ́-thô khok-ngin liá-ke email sin-siông chṳ̂n-sṳ̍t yû-háu.',
-'throttled-mailpassword' => 'Me̍t-me̍t thì-siáng yí-kîn chhai-chhièn $1 séu-sṳ̀ nui fat-sung. Yîn-vi fòng-chṳ́ lam-yung, han-thin chhai $1 séu-sṳ̀ nui fat-sung yit-chhṳ me̍t-me̍t thì-siáng.',
-'mailerror' => 'Fat-sung email chho-ngu: $1',
-'acct_creation_throttle_hit' => 'Tui-put-hí, ngì yí-kîn chu-chhak liáu $1 chong-ho. Ngì put-nèn chai chu-chhak liáu.',
-'emailauthenticated' => 'Ngì-ke email thi-tiám yí-kîn chhai-yî $1 khok-ngin yû-háu.',
-'emailnotauthenticated' => 'Ngì-ke email thi-tiám <strong> hàn-mò pûn ngin-chṳn </strong>. Yî-ha kûng-nèn chiông put-voi fat-sung ngim-hò email.',
-'noemailprefs' => 'Chṳ́-thin yit-ke email thi-tiám yî-khi̍p sṳ́-yung chhṳ́ kûng-yung.',
-'emailconfirmlink' => 'Khok-ngin ngì-ke email thi-tiám',
-'invalidemailaddress' => 'Email thi-tiám kak-sṳt put chṳn-khok, chhiáng sû-ngi̍p chṳn-khok ke email chhai-vi fe̍t-chá chhîn-khûng ke-sû-ngi̍p  khiông.',
-'accountcreated' => 'Yí-kîn kien-li̍p chong-fu.',
-'accountcreatedtext' => '$1 ke chong-fu yí-kîn chhong-kien.',
-'createaccount-title' => 'Chhai {{SITENAME}} tsûng-kiên kien-li̍p sîn tsong-ho',
-'loginlanguagelabel' => 'Ngî-ngièn: $1',
+'logouttext' => "汝已經登出。
+
+汝做得用匿名方式繼續使用{{SITENAME}},或用相同或毋同用戶身份<span class='plainlinks'>[$1 登入]</span>。
+請注意,假使汝再次登入,本頁可能會繼續顯示,直到汝清除瀏覽器緩存。",
+'welcomeuser' => '歡迎,$1!',
+'welcomecreation-msg' => '汝嘅賬號已經建立。
+莫添忘訖設置[[Special:Preferences|{{SITENAME}}嘅個人參數]]。',
+'yourname' => '用戶名:',
+'userlogin-yourname' => '用戶名',
+'userlogin-yourname-ph' => '輸入汝嘅用戶名',
+'yourpassword' => '密碼:',
+'userlogin-yourpassword' => '密碼',
+'userlogin-yourpassword-ph' => '輸入汝嘅密碼',
+'createacct-yourpassword-ph' => '輸入汝嘅密碼',
+'yourpasswordagain' => '再一擺輸入密碼:',
+'createacct-yourpasswordagain' => '確認密碼',
+'createacct-yourpasswordagain-ph' => '再一擺輸入密碼',
+'remembermypassword' => '在邇隻瀏覽器上記下𠊎嘅登入狀態(最長$1日)',
+'userlogin-remembermypassword' => '保持𠊎嘅登入狀態',
+'userlogin-signwithsecure' => '使用安全連線',
+'securelogin-stick-https' => '登入後繼續用HTTPS連接',
+'yourdomainname' => '汝嘅域名:',
+'password-change-forbidden' => '汝做毋得更改本wiki上嘅密碼。',
+'externaldberror' => '邇可能係由於驗證數據庫差錯或者汝分系統禁止更新汝嘅外部賬號。',
+'login' => '登入',
+'nav-login-createaccount' => '登入/建立新帳號',
+'loginprompt' => '汝必須啟用Cookies正做得成功登入{{SITENAME}}。',
+'userlogin' => '登入/建立新帳號',
+'userloginnocreate' => '登入',
+'logout' => '登出',
+'userlogout' => '登出',
+'notloggedin' => '還吂登入',
+'userlogin-noaccount' => '還無帳戶係無?',
+'userlogin-joinproject' => '參與 {{SITENAME}}',
+'nologin' => '還無帳號係無?$1。',
+'nologinlink' => '建立帳號',
+'createaccount' => '建立帳號',
+'gotaccount' => '已經擁有帳號係無?$1。',
+'gotaccountlink' => '登入',
+'userlogin-resetlink' => '毋記得汝嘅登入信息?',
+'userlogin-resetpassword-link' => '重置爾嘅密碼',
+'helplogin-url' => 'Help:登入',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入説明]]',
+'createacct-join' => '輸入汝嘅基本資料:',
+'createacct-emailrequired' => '電郵地址:',
+'createacct-emailoptional' => '電郵地址(可選)',
+'createacct-email-ph' => '設置電郵地址',
+'createaccountmail' => '使用一隻臨時嘅隨機密碼,並發送其到以下指定嘅電子郵件地址',
+'createacct-realname' => '實名(可選)',
+'createaccountreason' => '原因:',
+'createacct-reason' => '原因',
+'createacct-reason-ph' => '汝做麽嘅愛創建另一隻帳號',
+'createacct-captcha' => '安全檢查',
+'createacct-imgcaptcha-ph' => '輸入汝在上背看到嘅字符',
+'createacct-submit' => '建立帳號',
+'createacct-benefit-heading' => '{{SITENAME}}是由撈您共樣嘅人建立。',
+'createacct-benefit-body1' => '$1次編寫',
+'createacct-benefit-body2' => '$1頁',
+'createacct-benefit-body3' => '近期$1隻貢獻人',
+'badretype' => '汝所撳入嘅密碼並無相同',
+'userexists' => '汝所填入嘅用戶名稱已經存在。
+請另選一隻名稱。',
+'loginerror' => '登入差錯',
+'createacct-error' => '帳戶建立差錯',
+'createaccounterror' => '無辦法建立帳號:$1',
+'nocookiesnew' => '本用戶賬號已分建立,但係汝登入失敗。{{SITENAME}}使用cookie登入。汝已停用cookie。請啓用cookie,之後使用汝嘅新用戶名和密碼登入。',
+'nocookieslogin' => '{{SITENAME}}用cookie登入。汝已停用cookie。請啓用cookie後再試一擺。',
+'nocookiesfornew' => '邇隻用戶嘅賬戶未建立,亻厓兜無法度確認其嘅來源。
+請確定汝已經開啟cookies,重新載入後再試一擺。',
+'noname' => '汝還吂輸入一隻有效嘅用戶名。',
+'loginsuccesstitle' => '登入成功',
+'loginsuccess' => '汝今下以"$1"嘅身份在{{SITENAME}}登入。',
+'nosuchuser' => '尋毋到用戶 "$1"。
+用戶名稱係有大小寫區分嘅。
+檢查汝嘅拼寫,或者用下面嘅表格[[Special:UserLogin/signup|建立一隻新賬號]]。',
+'nosuchusershort' => '無有喊做“$1”嘅用戶。請檢查汝輸入嘅文字係毋係有差錯。',
+'nouserspecified' => '汝愛指定一隻用戶名。',
+'login-userblocked' => '邇隻用戶已畀封鎖。毋做得登入。',
+'wrongpassword' => '汝輸入嘅密碼有錯,請再試一擺。',
+'wrongpasswordempty' => '還無輸入密碼!請重試。',
+'passwordtooshort' => '汝嘅密碼毋得少過$1隻字符。',
+'password-name-match' => '汝嘅密碼必須撈汝嘅用戶名毋相同。',
+'password-login-forbidden' => '邇隻用戶名稱及密碼嘅使用係畀禁止嘅。',
+'mailmypassword' => '用電郵寄新密碼分亻厓',
+'passwordremindertitle' => '{{SITENAME}}嘅新臨時密碼',
+'passwordremindertext' => '有人(可能係汝本人,來自IP地址$1)已請求{{SITENAME}}嘅新密碼 ($4)。
+用戶"$2"嘅一隻新臨時密碼今下已分設定好為"$3"。
+係話邇隻動作係汝所指示嘅,汝就愛立即登入並選擇一隻新嘅密碼。
+汝嘅臨時密碼將於{{PLURAL:$5|一|$5}}日之內過期。
+
+如果係其他人發出邇隻請求,或者汝已經回想起汝嘅密碼,故所毋準備改變其,
+汝可以忽略略邇條消息並且繼續使用汝嘅舊密碼。',
+'noemail' => '用戶“$1”無登記電子郵件地址。',
+'noemailcreate' => '汝愛提供一隻有效嘅電子郵件地址。',
+'passwordsent' => '用戶“$1”嘅新密碼已經寄到所登記嘅電子郵件地址。
+請在收到後再登入。',
+'blocked-mailpassword' => '汝嘅IP地址處於查封狀態故所毋允許編輯,為矣安全起見,密碼恢復功能已分禁用。',
+'eauthentsent' => '一封確認信已經發送到推薦地址。在發送其它郵件到邇隻賬戶前,汝必須首先按照邇封信肚嘅指導確認邇隻電子郵件信箱真實有效。',
+'throttled-mailpassword' => '密碼提醒已經在最近$1小時內發送。
+為防止濫用,限定在$1小時內僅發送一次密碼提醒。',
+'mailerror' => '發送郵件出差錯:$1',
+'acct_creation_throttle_hit' => '在邇隻wiki上係話訪客利用汝个IP地址在昨天創建矣$1個賬戶,係在邇段時間肚的上限。
+結果利用這個IP地址个訪客在邇段時間中無辦法創建更多个賬戶。',
+'emailauthenticated' => '汝嘅電郵地址已經於$2 $3確認有效。',
+'emailnotauthenticated' => '汝嘅郵箱地址<strong>還無分認証</strong>。以下功能將毋會發送任何郵件。',
+'noemailprefs' => '在嘅嘅偏好設定肚指定一隻電子郵件地址來使用邇隻功能。',
+'emailconfirmlink' => '確認汝嘅郵箱地址',
+'invalidemailaddress' => '郵箱地址格式不正確,請輸入正確个郵箱位址或清空該輸入框。',
+'emaildisabled' => '邇隻網站毋可以發送電子郵件。',
+'accountcreated' => '已建立賬戶',
+'accountcreatedtext' => '$1嘅賬戶已經分建立。',
+'createaccount-title' => '在{{SITENAME}}肚建立新賬戶',
+'createaccount-text' => '有人在{{SITENAME}}肚利用汝嘅電郵創建矣一隻喊做 "$2" 嘅新賬戶($4),密碼係 "$3" 。汝應該立即登入並更改密碼。
+
+如果該賬戶建立錯誤嘅話,汝可以忽略邇條訊息。',
+'usernamehasherror' => '用戶名毋可以包含Hash字符',
+'login-throttled' => '汝已經嘗試多次登入動作。
+請等陣再試。',
+'login-abort-generic' => '登入錯誤 - 中止',
+'loginlanguagelabel' => '語言:$1',
+'suspicious-userlogout' => '汝登出嘅要求已經分拒絕,因為其可能係由已損壞嘅瀏覽器或者緩存代理傳送。',
+
+# Email sending
+'php-mail-error-unknown' => '在PHP嘅mail()參數肚嘅未知錯誤',
+'user-mail-no-addy' => '嘗試毋帶電郵地址發送電郵。',
+'user-mail-no-body' => '試圖發送空嘅或主體毋合理短嘅電子郵件。',
 
 # Change password dialog
-'resetpass' => 'Kiên-kói me̍t-me̍t',
-'resetpass_announce' => 'Ngì he theu-ko yit-ke lìm-sṳ̀ ke fat-sung to email chûng ke chhí-me̍t tên-ngi̍p ke. Yeu vàn-sṳ̀n tên-ngi̍p,  ngì pit-sî chhai liá-piên sat-thin yit-ke sîn me̍t-me̍t:',
-'resetpass_text' => '<!-- Chhai chhṳ́-chhu kâ-ngi̍p vùn-sṳ -->',
-'resetpass_header' => 'Chhùng-sat me̍t-me̍t',
-'oldpassword' => 'Khiu pi-me̍t:',
-'newpassword' => 'Sîn pi-me̍t:',
-'retypenew' => 'Khok-ngin me̍t-me̍t:',
-'resetpass_submit' => 'Sat-thin  me̍t-me̍t pin tên-ngi̍p',
-'resetpass_success' => 'Ngì-ke me̍t-me̍t yí-kîn pûn sṳ̀n-kûng kiên-kói! Hien-ha chang vi ngì tên-ngi̍p...',
-'resetpass_forbidden' => 'Mò-fap chhai chhṳ́ wiki sông kiên-kói me̍t-me̍',
-'resetpass-submit-loggedin' => 'Kiên-kói me̍t-me̍t',
-'resetpass-submit-cancel' => 'Chhí-sêu',
+'resetpass' => '更改密碼',
+'resetpass_announce' => '汝係通過一隻發送到電子郵件肚嘅臨時代碼登入的。愛完成登入,汝必須在邇位設定一隻新密碼:',
+'resetpass_text' => '<!-- 在邇處加入文字 -->',
+'resetpass_header' => '更改賬戶密碼',
+'oldpassword' => '舊密碼:',
+'newpassword' => '舊密碼:',
+'retypenew' => '再一擺輸入密碼:',
+'resetpass_submit' => '設定密碼並登入',
+'resetpass_success' => '汝成功更改矣汝嘅密碼!
+今下為汝登入緊...',
+'resetpass_forbidden' => '無辦法更改密碼',
+'resetpass-no-info' => '汝必須登入後直接進入邇隻頁面。',
+'resetpass-submit-loggedin' => '更改密碼',
+'resetpass-submit-cancel' => '取消',
+'resetpass-wrong-oldpass' => '無效嘅臨時或現有嘅密碼。
+汝可能已成功地更改矣汝嘅密碼,或者已經請求一隻新嘅臨時密碼。',
+'resetpass-temp-password' => '臨時密碼:',
+'resetpass-abort-generic' => '擴充插件已中止矣更改密碼操作。',
 
 # Special:PasswordReset
-'passwordreset-username' => 'Yung-fu-miàng',
+'passwordreset' => '重設密碼',
+'passwordreset-legend' => '重置密码',
+'passwordreset-disabled' => '邇隻維基上已禁止矣重設密碼。',
+'passwordreset-emaildisabled' => '電子郵件功能在此 wiki 上已禁用。',
+'passwordreset-username' => '用戶名:',
+'passwordreset-domain' => '域名:',
+'passwordreset-capture' => '查看生成嘅電子郵件係無?',
+'passwordreset-capture-help' => '係講汝選中邇隻框,電子郵件(包括臨時密碼)將顯示,並發送分用戶。',
+'passwordreset-email' => '電郵地址:',
+'passwordreset-emailtitle' => '在{{SITENAME}}上嘅詳細信息',
+'passwordreset-emailsent' => '密碼重置電子郵件已發送。',
+
+# Special:ChangeEmail
+'changeemail' => '更改電子郵件地址',
+'changeemail-header' => '更改電子郵件帳戶',
+'changeemail-no-info' => '汝必須登入後直接進入邇隻頁面。',
+'changeemail-oldemail' => '當前電郵地址:',
+'changeemail-newemail' => '新嘅電郵地址:',
+'changeemail-none' => '(無)',
+'changeemail-submit' => '更改電郵地址',
+'changeemail-cancel' => '取消',
 
 # Edit page toolbar
-'bold_sample' => 'Chhû-thí vùn-sṳ',
-'bold_tip' => 'Chhû-thí vùn-sṳ',
-'italic_sample' => 'Chhià-thí vùn-sṳ',
-'italic_tip' => 'Chhià-thí vùn-sṳ',
-'link_sample' => 'Lièn-kiet phêu-thì',
-'link_tip' => 'Nui-phu lièn-kiet',
-'extlink_sample' => 'http://www.example.com lièn-kiet phêu-thì',
-'extlink_tip' => 'Ngoi-phu lièn-kiet (ki-tet http://)',
-'headline_sample' => 'Thai-phêu-thì vùn-sṳ',
-'headline_tip' => 'Ngi-khi̍p phêu-thì vùn-sṳ',
-'nowiki_sample' => 'Chhai-chhṳ́ chhap-ngi̍p fui kak-sṳt vùn-sṳ',
-'nowiki_tip' => 'Chhap-ngi̍p fui kak-sṳt vùn-sṳ',
-'image_tip' => 'Chhṳ̀m-ngi̍ thù-hiong',
-'media_tip' => 'Kî-thí tóng-on lièn-kiet',
-'sig_tip' => 'Tai yû sṳ̀-kiên ke chhiâm-miàng',
-'hr_tip' => 'Súi-phiàng sien  (séu-sîm sṳ́-yung)',
+'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' => '水平線 (小心使用)',
 
 # Edit pages
-'summary' => 'Chak-yeu:',
-'subject' => 'Chú-thì/phêu-thì:',
-'minoredit' => 'Liá-he yit-ke séu siû-kói',
-'watchthis' => 'Kam-sṳ pún-chông',
-'savearticle' => 'Pó-chhùn pún-chông',
-'preview' => 'Yi-liau',
-'showpreview' => 'Hién-sṳ yi-ko',
-'showlivepreview' => 'Chit-sṳ̀ yi-ko',
-'showdiff' => 'Hién-sṳ chhâ-phe̍t',
-'anoneditwarning' => "'''Kín-ko:''' ngì hàn-mò tên-liu̍k, ngì-ke IP thi-tiám chiông-voi ki-liu̍k chhai chhṳ́-chông ke phiên-siá li̍t-sṳ́ chûng.",
-'missingsummary' => "'''Thì-sṳ:''' Kgì hàn-mò thì-kiûng yit-ke phiên-siá chak-yeu. Kó-yèn ngì chai-chhṳ tân-kit tú-chhùn, ngì-ke phiên-siá chiông put-tai phiên-siá chak-yeu tú-chhùn.",
-'missingcommenttext' => 'Chhiáng chhai ha-mien sû-ngi̍p phìn-lun.',
-'missingcommentheader' => "'''Thì-sṳ:''' ngì hàn-mò vi-chhṳ́ phìn-lun thì-kiûng yit-ke phêu-thì. Kó-yèn ngì chai-chhṳ tân-kit tú-chhùn, ngì-ke phiên-siá chiông put-tai phêu-thì tú-chhùn.",
-'summary-preview' => 'Chak-yeu yi-ko:',
-'subject-preview' => 'Chú-thì/phêu-thì yi-ko:',
-'blockedtitle' => 'Yung-fu pûn chhà-fûng',
+'summary' => '摘要:',
+'subject' => '標題:',
+'minoredit' => '邇係一隻細微修改',
+'watchthis' => '監視本頁',
+'savearticle' => '保存本頁',
+'preview' => '預覽',
+'showpreview' => '展示預覽',
+'showlivepreview' => '即時預覽',
+'showdiff' => '展示差別',
+'anoneditwarning' => "'''警告:'''汝還吂登入。
+汝嘅IP地址將記錄在邇頁嘅編寫歷史肚。",
+'anonpreviewwarning' => '“警告:汝還吂登入。汝嘅IP地址將會記錄在邇頁嘅編輯歷史中”',
+'missingsummary' => "'''提示:''' 汝無提供一隻編寫摘要。假使汝再次單擊「{{int:savearticle}}」,汝嘅編寫將毋帶編寫摘要保存。",
+'missingcommenttext' => '請在下背輸入評論。',
+'missingcommentheader' => "'''提示:''' 汝還無為邇條評論提供一隻標題。假使汝再次單擊「{{int:savearticle}}」,您嘅編寫將毋帶標題保存。",
+'summary-preview' => '摘要預覽:',
+'subject-preview' => '主題/標題預覽:',
+'blockedtitle' => '用戶分查封',
 'blockedtext' => "Ngì-ke yung-fu-miàng fe̍t-chá IP thi-tiám yí-kîn pûn $1 chhà-fûng.
 
 Liá-chhṳ chhà-fûng he yù $1 só fûng ke. Tông-chûng ke ngièn-yîn he ''$2''. Ngì khó-yî lièn-lo̍k $1 fe̍t-chá khì-thâ ke [[{{MediaWiki:Grouppage-sysop}}|Kón-lî-yèn]], thó-lun liá-chhṳ ke chhà-fûng. Chhù-fî ngì yí-kîn chhai ngì-ke [[Special:Preferences|Chong-ho chhâm-su sat-chṳ]] chûng sat-thin liáu yit-ke yû-háu ke email, féu-chet ngì-he put-nèn sṳ́-yung “email liá-vi yung-fu” ke kûng-yung. Ngì-ke IP thi-tiám he $3, yì-yèn ke chhà-fûng ID he #$5. Chhiáng ngì chhai só-yû chhà-chhìm chûng chu-mìn liá-ke thi-tiám khi̍p/fe̍t-he chhà-fûng ID.",
 'autoblockedtext' => 'Ngì-ke IP thi-tiám yí-kîn pûn chhṳ-thung chhà-fûng, lî-yù he siên-chhièn ke nang yit-vi yung-fu pûn $1 só chhà-fûng. Yì-yèn chhà-fûng ke ngièn-yîn he: \'\'$2\'\' liá-chhṳ chhà-fûng ke khì-kiên he: $6 ngì khó-yî lièn-lo̍k $1 fe̍t-chá khì-thâ ke [[{{MediaWiki:Grouppage-sysop}}|kón-lî-yèn]], thó-lun liá-chhṳ chhà-fûng. Chhù-fî ngì yí-kîn chhai ngì-ke [[Special:Preferences|chong-ho chhâm-su sat-chṳ]] chûng sat-thin yit-ke yû-háu ke email thi-tiám, féu-chet ngì-he put-nèn sṳ́-yung "email liá-vi yung-fu" ke kûng-nèn. Ngì-ke chhà-fûng ID he $5. Chhiáng ngì chhai só-yû thiàu-chhà chûng chu-mìn liá-ke chhà-fûng ID.',
-'whitelistedittext' => 'Ngì pit-sî siên $1 chhòi-nèn phiên-siá vùn-chông.',
-'confirmedittext' => 'Chhai phiên-cho chhṳ́-chông chṳ̂-chhièn pit-sî khok-ngin ngì-ke email thi-tiám. Chhiáng theu-ko [[Special:Preferences|chhâm-su sat-thin]] sat-thin pin ngiam-chṳn ngì-ke email thi-tiám.',
+'whitelistedittext' => '汝必須先$1正做得編寫頁面。',
+'confirmedittext' => '在編寫邇頁之前汝必須確認汝嘅郵箱地址。請通過[[Special:Preferences|偏好設定]]設定並驗證汝嘅郵箱地址。',
 'nosuchsectiontitle' => 'Mò-yû liá-ke thon-lo̍k',
 'nosuchsectiontext' => 'Ngì sòng-chhṳ phiên-cho ke thon-lo̍k pin-put chhùn-chhai.',
-'loginreqtitle' => 'Sî-yeu Tên-ngi̍p',
-'loginreqlink' => 'tên-ngi̍p',
-'loginreqpagetext' => 'Ngì pit-sî $1 chhòi-nèn kiám-sṳ khì-thâ vùn-chông.',
-'accmailtitle' => 'Pi-Me̍t yí-kîn ki-chhut.',
+'loginreqtitle' => '愛登入',
+'loginreqlink' => '登入',
+'loginreqpagetext' => '汝必須$1正做得查看其他頁面。',
+'accmailtitle' => '密碼已經寄出',
 'accmailtext' => "'$1' ke pi-me̍t yí-kîn ki-kî to $2.",
-'newarticle' => '(Sîn)',
-'newarticletext' => 'Ngì hien-chhai chin-ngi̍p yit-ke hàn-mò chhóng-kien ke vùn-chông.
-Yeu kien-chho ke vùn-chông, chhiáng chhai ha-mien ke phiên-cho-khiông chûng sû-ngi̍p nui-yùng (Chhâm-siòng [[{{MediaWiki:Helppage}}|Pông-chhu]]).
-Kó-yèn ngì-he put-séu-sîm to chhṳ́ hong-mien, chhṳ̍t-chiap tiám-kit ngì hi-khí chûng ke "fì-chón" on-néu fán-fì.',
+'newarticle' => '()',
+'newarticletext' => '汝入到矣一隻還吂建立嘅頁面。
+愛建立本頁面,請在下面嘅編寫框肚輸入內容(詳情參詳[[{{MediaWiki:Helppage}}|幫手]])。
+係講汝係毋小心來到本頁面,直接點擊汝嘅瀏覽器肚嘅“轉頭”撳掣轉頭。',
 'anontalkpagetext' => "---- ''Liá-he yit-ke hàn-mò kien-li̍p chong-ho ke ngia̍k-miàng yung-fu ke tui-fa-hong. Só-yî chṳ́-nèn yung IP thi-tiám lòi lâu kí lièn-lo̍k. Ke-IP thi-tiám khó-nèn yù-chhai kí-miàng yung-fu khiung-hióng. Kó-yèn ngì-he yit-miàng ngia̍k-miàng yung-fu ngin-vì pún-hong song ke phìn-lî kiên ngì mò-kôan, chhiáng [[Special:UserLogin|Chhóng-kien sîn chong-ho fe̍t-chá Tên-ngi̍p]] khó-yî phit-miên lòi-yì khì-thâ ngia̍k-miàng yung-fu ke fun-lon.''",
-'noarticletext' => 'Chhṳ́-chông muk-chhièn hàn-mò nui-yùng, ngì khó-yî chhai khì-thâ hong [[Special:Search/{{PAGENAME}}|sêu-chhà chhṳ́-chông phêu-thì]] fe̍t-chá [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} phiên-chho chhṳ́-chông].',
-'userpage-userdoesnotexist' => 'Sṳ́-yung-tsá tsong-ho "<nowiki>$1</nowiki>" hàn-mò kien-li̍p.
-Tshiáng chhai kien-li̍p/piên-sip liá-ke vùn-tsông tshièn siên kiám-tshà yit-ha-é.',
+'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>,但汝無權限建立邇頁。',
+'userpage-userdoesnotexist' => '用戶帳號“$1:還吂註冊。
+請在建立/編寫邇隻頁面前先檢查一下。',
 'clearyourcache' => "'''Chu-yi:''' Chhai tú-chhùn yî-heu, ngì pit-sî khoai chhái-chhí chhîn-chhù hi-khí chhòi-nèn khon-tó chok-chhut ke kói-pien. '''Mozilla / Firefox / Safari:''' on-tén ''Shift'' chai tiám-kit '' Chhùng-sîn chṳ́n-lî ''(fe̍t-chá on-hâ ''Ctrl-Shift-R'', chhai Phìn-kó Mac song on-hâ ''Cmd-Shift-R''); '''IE:''' on-tén ''Ctrl'' chai tiám-kit ''Chhùng-sîn chṳ́n-lî'', fe̍t-he on-hâ ''Ctrl-F5'';'''Konqueror:''' chak  sî-yeu tiám-kit ''Chhùng-sîn chṳ́n-lî''; '''Opera:''' yung-fu sî-yeu chhai ''kûng-khí-sat-thin'' chûng vàn-cháng-thi chhîn-chhù ke khoai-chhí.",
 'usercssyoucanpreview' => "'''Thì-sṳ:''' Chhai pó-chhùn chhièn chhiáng yung 'hién-sṳ yi-ko' on-néu lòi chhet-chhṳ ngì sîn-ke CSS.",
 'userjsyoucanpreview' => "'''Thì-sṳ:''' Chhai pó-chhùn chhièn chhiáng yung 'hién-sṳ yi-ko' on-néu lòi chhet-chhṳ ngì sîn-ke JS.",
 'usercsspreview' => "'''Chu-yi ngì chak-he chhai yi-liau ngì ke-ngìn CSS, hàn-mò tú-chhùn!'''",
-'userjspreview' => "'''Chu-yi ngì chak-he chhai chhet-chhṳ / yi-liau ngì ke-ngìn JavaScript, hàn-mò tú-chhùn!'''",
-'userinvalidcssjstitle' => "'''Kín-ko:''' Put chhùn-chhai mien-pán \"\$1\". chu-yi chhṳ-thin ke .css lâu .js hong yeu sṳ́-yung séu-siá phêu-thì, yì-yi, {{ns:user}}:Foo/vector.css put-thùng yî  {{ns:user}}:Foo/Vector.css.",
-'updated' => '(Yí-kîn kiên-sîn)',
-'note' => "'''Chu-yi:'''",
-'previewnote' => "'''Chhiáng ki-he̍t liá-ke chak-he yi-liau, nui-yùng hàn-mò pó-chhùn!'''",
-'previewconflict' => 'Liá-ke yi-liau hién-sṳ liáu song-mien vùn-sṳ phiên-siá khî-chûng ke nui-yùng. Chiông-voi chhai ngì sién-chet pó-chhùn heu chhut-hien.',
-'session_fail_preview' => "'''Chṳ̂n-he tui-put-hí! Lî-yù he phu-fun chṳ̂-yì-sṳt, mò-fap chhú-lî ngì-ke phiên-siá. Chhiáng chai-chhṳ yit-chhṳ, kó-yèn yìn-yèn sṳt-phai, chhiáng tên-chhut heu chhùng-sîn tên-ngi̍p.'''",
+'userjspreview' => "'''記緊汝單單係在測試/預覽汝嘅用戶JavaScript。'''
+'''還吂保存!'''",
+'userinvalidcssjstitle' => "'''警告:''' 毋存在外皮“$1”。
+注意自定嘅.css撈.js頁愛使用小寫標題,例如,{{ns:user}}:Foo/vector.css撈 {{ns:user}}:Foo/Vector.css毋同。",
+'updated' => '(已經更新)',
+'note' => "'''注意:'''",
+'previewnote' => "'''請記到邇單淨係預覽。'''
+汝嘅更改還吂保存!",
+'previewconflict' => '邇隻預覽展示矣上片文字編寫區肚嘅內容。其將在汝選擇保存後出現。',
+'session_fail_preview' => "'''好抱歉!由於部份數據遺失,𠊎兜無辦法處理汝嘅編寫。'''
+請試多一擺。
+係講還係失敗,請[[Special:UserLogout|登出]]後重新登入。",
 'session_fail_preview_html' => "'''Chṳ̂n tui-put-hí! Phu-fun chṳ̂-liau yí-kîn yì-sṳt, mò-fap chhú-lî ngì-ke phiên-siá.'''
 
 '''Kó-yèn liá-ke phiên-siá ko-chhàng mò-yû mun-thì, chhiáng chai-chhṳ yit-chhṳ. Yìn-yèn yû mun-thì, chhiáng tên-chhut heu chhùng-sîn tên-ngi̍p yit-chhṳ.'''",
-'editing' => 'Chang-chhai phiên-siá $1',
-'editingsection' => 'Chang-chhai phiên-siá $1 (thon-lo̍k)',
+'editing' => '編寫 $1',
+'creating' => '創建 $1',
+'editingsection' => '編寫 $1 (段落)',
 'editingcomment' => 'Chang-chhai phiên-siá $1 (phìn-lun)',
-'editconflict' => 'phiên-cho chhûng-thu̍t: $1',
-'explainconflict' => "Yû-ngìn chhai ngì khôi-sṳ́ phiên-siá heu kiên-kói liáu vùn-chông.
-Song-mien ke vùn-sṳ khiông-nui he hién-sṳ muk-chhièn pún-chông ke nui-yùng.
-Ngì só-cho ke siù-chho hién-sṳ chhai ha-mien ke vùn-sṳ khiông-chûng.
-Ngì yin-tông chiông ngì só-cho ke siù-chho kâ-ngi̍p hien-yû ke nui-yùng chûng.
-'''Chṳ́-yû''' chhai song-mien vùn-sṳ khiông-chûng ke nui-yùng chiông-voi chhai ngì tiám-kit \"{{int:savearticle}}\" heu pûn pó-chhùn.",
-'yourtext' => 'Ngì-ke vùn-sṳ',
-'storedversion' => 'Yí-kîn pó-chhùn ke pán-pún',
-'nonunicodebrowser' => "'''Kín-ko: Ngì-ke hi-khí put-nèn kiâm-yùng Unicode phiên-ho. Liá-piên yû yit-ke kûng-chok-khî chiông-voi hó-sṳ́ ngì nèn ôn-chhiòn-thi phiên-siá vùn-chông: fi ASCII sṳ-kûng chiông-yung sṳ̍p-liuk chin-chṳ phiên-ho mù-hìn chhut-hien chhai phiên-siá khiông-chûng.'''",
-'editingold' => "'''Kín-ko: Ngì chang-chhai phiên-siá-ke he pún-chông ke khiu pán-pún. Ngì pó-chhùn kí sṳ̀, chhai pún pán-pún chṳ̂-hei ke ngim-hò chhùng-siû tû-voi tiû-sṳt.'''",
-'yourdiff' => 'chhâ-yi',
+'editconflict' => '編寫衝突:$1',
+'explainconflict' => "有人在汝開始編寫後更改矣頁面。
+上片嘅文字框內展示嘅是當前本頁嘅內容。
+汝所做嘅修改展示在下背嘅文字框肚。
+汝應該將汝所做嘅修改加入現有嘅內容肚。
+'''單淨'''在上片文字框肚嘅內容會在汝點擊「{{int:savearticle}}」後分保存。",
+'yourtext' => '汝嘅文字',
+'storedversion' => '已保存嘅修訂版本',
+'nonunicodebrowser' => "'''警告: 汝嘅瀏覽器毋兼容Unicode編碼。'''邇位有一隻工作區將使汝做得安全編寫頁面: 非ASCII字符將以十六進製編碼模式出現在編輯框肚。",
+'editingold' => "'''警告:汝在編輯中嘅係本頁嘅舊版本。'''
+係講汝保存其嘅話,在本版本之後嘅任何更改都會遺失。",
+'yourdiff' => '差別',
 'copyrightwarning' => "Chhiáng chu-yi ngì tui {{SITENAME}} ke só-yû kung-hien tû pûn-ngìn ngin-vì he chhai $2-hâ fat-phu, chhiáng chhà-khon chhai $1-ke se-chiet. Kó-yèn ngì chhin-mò hî-mong ngì-ke vùn-sṳ pûn-ngìn ngim-yi siù-chho lâu chai san-pu, chhiáng mò-yeu thì-kâu.<br /> Ngì thùng-sṳ̀ ya-yeu hiong Wikimedia pó-chṳn ngì só thì-kâu ke nui-yùng he chhṳ-kí só chok, fe̍t-chá lòi-chhṳ yit-ke mò-su pán-khièn pó-fu fe̍t-he siông-thùng chhṳ-yù ke lòi-ngièn. '''Mò-yeu chhai hàn-mò su-khièn ke chhìn-khóng-hâ fat-péu!'''<br />",
-'copyrightwarning2' => "Chhiáng chu-yi ngì tui {{SITENAME}} ke só-yû kung-hien tû khó-nèn pûn khì-thâ kung-hien-chá phiên-cho, siû-kói fe̍t-he chhù-thet.
-Kó-yèn ngì chhin-mò hî-mong ngì-ke ngì-ke vùn-sṳ pûn-ngìn ngim-yi chhùng-siû lâu chai san-pu, chhiáng mò-yeu thì-kâu.<br />
-Ngì thùng-sṳ̀ ya-yeu hiong Wikimedia pó-chṳn ngì só thì-kâu ke nui-yùng he chhṳ-kí só chok,fe̍t-chá lòi-chhṳ yit-ke mò-su pán-khièn pó-fu fe̍t-he he siông-thùng chhṳ-yù ke lòi-ngièn (Chhâm-siòng $1 ke se-chiet).
-''' Mò-yeu chhai hàn-mò su-khièn ke chhìn-khóng-hâ fat-péu!'''",
+'copyrightwarning2' => "請注意汝對{{SITENAME}}嘅所有貢獻
+都可能分其他貢獻人編寫、修改或刪除。
+係講汝毋希望您嘅文字分任意修改撈再散佈,請毋好提交。<br />
+汝同時也愛向𠊎兜保證汝所提交嘅內容係自家所作,或得自一隻毋受版權保護或相似自由嘅來源(參閱$1的細節)。
+'''毋好在未獲授權嘅情況下發表!'''",
 'longpageerror' => "'''Chho-ngu: Ngì só thì-kâu ke vùn-sṳ chhòng-thu yû $1KB, liá thai-yî $2KB ke chui-thai chhṳ̍t, ke-vùn-chông put-nèn pûn tú-chhùn.'''",
 'readonlywarning' => "'''Kín-ko: chṳ̂-liau-khu pûn-ngìn fûng-só yîn-vi chin-hàng vì-fu, só-yî muk-chhièn mò-fap pó-chhùn ngì-ke siù-chho. Ngì fe̍t-hí hî-mong chhai-siên chiông pún-thon vùn-sṳ fu̍k-chṳ pin pó-chhùn to vùn-sṳ vùn-khien, yèn-heu tén-yit-ha chai siù-chho.'''",
 'protectedpagewarning' => "'''Kín-ko: Pún-chông yí-kîn pûn pó-fu, chṳ́-yû yúng-yû Kón-lî-yèn hí-khó-khièn ke yung-fu chhòi-nèn siù-chho.'''",
 'semiprotectedpagewarning' => "'''Chu-yi:''' Pún vùn-chông pûn só-thin, tên-ki ke yung-fu hí-khó phiên-siá.",
-'cascadeprotectedwarning' => "'''Kín-ko''': Pún-chông yí-kîn pûn pó-fu, chṳ́-yû yúng-yû Kón-lî-yèn khièn-han ke yung-fu chhòi-nèn siù-chho, yîn-vi pún-chông yí-kîn pûn yî-ha lièn-só pó-fu ke {{PLURAL:$1|yit-ke|tô-ke}} vùn-chông só pâu-hàm:",
-'templatesused' => 'Chhai liá-ke hong-mien song sṳ́-yung ke mù-pán yû:',
+'cascadeprotectedwarning' => "'''警告:'''本頁已經分保護,單淨係擁有管理員權限嘅用戶正做得修改,因為本頁已分下背連鎖保護嘅{{PLURAL:$1|一隻|多隻}}頁面所包含:",
+'templatesused' => '邇頁面包含下背{{PLURAL:$1|模板|模板}}:',
 'templatesusedpreview' => 'Chhṳ́-chhṳ yi-siên chûng sṳ́-yung ke mù-pán yû:',
 'templatesusedsection' => 'Chhai liá-ke thon-lo̍k song sṳ́-yung ke mù-pán yû:',
-'template-protected' => '(Pó-fu)',
-'template-semiprotected' => '(pan-pó-fu)',
-'hiddencategories' => 'Liá-ya̍p he su̍k-yî $1-ke yún-chhòng fûn-lui ke sṳ̀n-yèn:',
-'edittools' => '<!-- Chhṳ́-chhu ke vùn-sṳ chiông-voi pûn hién-sṳ chhai yî-ha phiên-cho lâu song-chhòn péu-tân chûng. -->',
+'template-protected' => '(保護)',
+'template-semiprotected' => '(半保護)',
+'hiddencategories' => '邇頁屬於$1隻隱藏分類嘅成員:',
+'edittools' => '<!-- 邇肚嘅文字將分展示在編寫撈上傳表單以下。 -->',
 'nocreatetext' => 'Chhṳ́ mióng-chham han-chṳ chhóng-chho sîn hong-mien ke kûng-yung. ngì khó-yî fán-fì pin phiên-cho yí-kîn yû ke hong-mien, fe̍t-chá [[Special:UserLogin|tên-liu̍k fe̍t-he chhóng-kien sîn chong-fu]].',
-'nocreate-loggedin' => 'Ngì chhai liá-ke wiki-tsûng hàn-mò hí-khó-khièn kien-li̍p sîn vùn-tsông.',
-'permissionserrors' => 'Khièn-han Tsho-ngu',
+'nocreate-loggedin' => '汝並無權限去創建新頁面。',
+'permissionserrors' => '權限差錯',
 'permissionserrorstext' => 'Kîn-kí yî-ha ke ngièn-yîn, ngì vù-yû khièn-han hi-tso yî-ha ke thung-tsok:',
-'permissionserrorstext-withaction' => 'Kîn-kí yî-ha ke ngièn-yîn, Ngì mò-fap khièn-han hi siá-chok $2:',
-'edit-gone-missing' => 'Vù-nèn kiên-sîn vùn-tsông. Khó-nèn kông pûn-ngìn tshù-thet.',
-'edit-conflict' => 'Piên-sip tshûng-thu̍t.',
-'edit-no-change' => 'Piên-sip yí-kîn pûn fut-lio̍k, yîn-vi vùn-sṳ mò ngim-hò kói-pien.',
-'edit-already-exists' => 'Put-nèn kien-li̍p yit-ke sîn vùn-tsông. Têu yí-kîn tshùn-tshai.',
+'permissionserrorstext-withaction' => '根據下背嘅{{PLURAL:$1|原因|原因}},汝並無權限去做$2:',
+'recreate-moveddeleted-warn' => "'''警告:汝今下重新建立一隻先前曾經刪除過嘅頁面。'''
+
+汝應該愛考慮一下繼續編寫邇一隻頁面係毋係合適。
+為到方便,邇一個頁面嘅刪除日誌已經在下背提供:",
+'moveddeleted-notice' => '邇隻頁面已經刪除。
+邇隻頁面嘅刪除撈移動日誌已經在下背提供來參考。',
+'log-fulllog' => '查看完整日誌',
+'edit-hook-aborted' => '編寫分鈎取消。
+其並無分出解釋。',
+'edit-gone-missing' => '毋做得更新頁面。
+其可能正正分刪除。',
+'edit-conflict' => '編寫衝突。',
+'edit-no-change' => '汝嘅編寫已經略過,因為文字無任何改動。',
+'edit-already-exists' => '毋做得建立一隻新頁面。
+其已經存在。',
+'defaultmessagetext' => '默認消息文字',
+'invalid-content-data' => '無效嘅數據內容',
+
+# Content models
+'content-model-wikitext' => 'wiki語法',
+'content-model-text' => '純文字',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => '警告: 包含模板大小過大。
+一兜模板將毋會包含。',
+'post-expand-template-inclusion-category' => '模板包含上限已經超過嘅頁面',
+'post-expand-template-argument-warning' => '警告: 邇隻頁面有最少一隻模參數有過大擴展大細。
+邇兜參數會分略過。',
+'post-expand-template-argument-category' => '包含緊略過模板參數嘅頁面',
 
 # "Undo" feature
-'undo-success' => 'Ke phiên-cho khó-yî pûn chhat-sêu. Chhiáng kiám-chhà yî-ha tui-pí fu̍t-sṳ̍t liá chang-he ngì sióng-cho ke, yèn-heu tú-chhùn yî-ha kiên-kói vàn-sṳ̀n chhat-sêu phiên-siá.',
-'undo-failure' => 'Chhut-yì chûng-thù ke phiên-chho put yit-chṳ, chhṳ́ phiên-siá put-nèn chhat-sêu.',
-'undo-norev' => 'Liá-ke siù-tsho pán-pún hàn-mò tshùn-tshai fe̍t-tsá yí-kîn tshù-tshiang, piên-sip put-nèn tshat-sêu.',
+'undo-success' => '邇次編寫可以分撤銷。請檢查下背對比來核實邇確實係汝想做嘅,之後保存下背更改來完成撤銷編寫。',
+'undo-failure' => '由於中途嘅編寫毋一致,本編輯毋做得撤銷。',
+'undo-norev' => '由於其嘅修訂版本毋存在或已刪除,本編寫毋做得撤銷。',
 'undo-summary' => 'Chhí-sêu yù [[Special:Contributions/$2|$2]] ([[User talk:$2|tui-fa]]) só chok-chhut ke siû-thin $1',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Mò-fap chhóng-li̍p chong-ho',
-'cantcreateaccount-text' => "Tshiùng liá-ke IP thi-tiám (<b>$1</b>) kien-li̍p tsong-ho yí-kîn pûn [[User:$3|$3]] kim-tsṳ́ .
+'cantcreateaccounttitle' => '無法建立帳號',
+'cantcreateaccount-text' => "從邇隻IP地址('''$1''')建立帳號已經分[[User:$3|$3]]禁止。
 
-Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
+當中分$3封禁嘅原因是''$2''",
 
 # History pages
-'viewpagelogs' => 'Chhà-khon liá-ke vùn-chông ke ngit-ki.',
-'nohistory' => 'Mò-yû pún-chông ke siû-thin ki-liu̍k.',
-'currentrev' => 'Tông-chhièn siû-thin pán-pún',
-'currentrev-asof' => 'Chhai $1-ke tông-sṳ̀   siù-tsho pán-pún.',
-'revisionasof' => 'Chhai $1 só-cho ke siû-thin pán-pún',
-'revision-info' => 'Chhai $1 yù $2 só-cho ke siû-thin pán-pún',
-'previousrevision' => '←Sông yit siû-thin',
-'nextrevision' => 'Hâ-yit-ke siû-cháng →',
-'currentrevisionlink' => 'Tông-chhièn siû-thin pán-pún',
-'cur' => 'tông-chhièn',
-'next' => 'hâ yit-ke',
-'last' => 'siên-chhièn',
-'page_first' => 'Chui-chhièn',
-'page_last' => 'Chui-heu',
-'histlegend' => 'Chhâ-phe̍t sién-chet: phêu-ki yeu pí-káu pán-pún ke tân-sién on-néu pin tiám-kit tí-phu ke on-néu chin-hàng pí-káu.<br /> Sot-mìn: (Tông-chhièn) chṳ́-chit lâu tông-chhièn pán-pún pí-káu, (Siên-chhièn) chṳ́-chit lâu chhièn yit-ke siû-thin pán-pún pí-káu, séu = séu siû-kói.',
-'history-fieldset-title' => 'Liù-lám li̍t-sṳ́',
-'histfirst' => 'Chui-chó pán-pún',
-'histlast' => 'Chui-sîn pán-pún',
-'historysize' => '($1-vi kûng-chû)',
-'historyempty' => '(khûng)',
+'viewpagelogs' => '查看邇隻頁面嘅日誌',
+'nohistory' => '無本頁嘅修訂版本記錄。',
+'currentrev' => '最新版本',
+'currentrev-asof' => '$1嘅最新修訂版本',
+'revisionasof' => '$1嘅修訂版本',
+'revision-info' => '在$1由$2所做嘅修訂版本',
+'previousrevision' => '←上隻版本',
+'nextrevision' => '下隻版本→',
+'currentrevisionlink' => '最新版本',
+'cur' => '當前',
+'next' => '下一隻',
+'last' => '上一隻',
+'page_first' => '最早',
+'page_last' => '最尾',
+'histlegend' => "差別選擇:標記愛比較修訂版本嘅單選按鈕並點擊底部嘅按鈕進行比較。<br />
+說明:'''({{int:cur}})''' 指撈最新修訂版本比較,'''({{int:last}})''' 指撈上隻修訂版本比較,'''{{int:minoreditletter}}''' = 細微修改。",
+'history-fieldset-title' => '瀏覽歷史',
+'history-show-deleted' => '單淨係已刪除嘅',
+'histfirst' => '最早',
+'histlast' => '最新',
+'historysize' => '($1字節)',
+'historyempty' => '(空)',
 
 # Revision feed
-'history-feed-title' => 'Siû-thin li̍t-sṳ́',
-'history-feed-description' => 'Pún-chham song chhṳ́-chông ke siû-thin li̍t-sṳ́',
-'history-feed-item-nocomment' => '$1 chhai-yî $2',
-'history-feed-empty' => 'Só chhiáng-khiù ke vùn-chông put-chhùn-chhai. Khó-nèn yí-kîn pûn-ngìn chhù-thet fe̍t-chá chhùng-sîn min-miàng. Sòng-chhṳ [[Special:Search|Sêu-chhà pún-chham]] siong-kôan ke sîn-kien vùn-chông.',
+'history-feed-title' => '修訂歷史',
+'history-feed-description' => '本wiki站上邇頁嘅修訂歷史',
+'history-feed-item-nocomment' => '$1在$2',
+'history-feed-empty' => '所請求嘅頁面毋存在。其可能已分刪除或重新命名。
+嘗試[[Special:Search|搜尋本站]]獲得相關嘅新建頁面。',
 
 # Revision deletion
 'rev-deleted-comment' => '(chu-sṳt yí-kîn yì-chhù)',
-'rev-deleted-user' => '(Yung-fu-miàng yí-kîn yì-chhù)',
-'rev-deleted-event' => '(hong-muk yí-kîn yì-chhù)',
+'rev-deleted-user' => '(用戶名已移除)',
+'rev-deleted-event' => '(日誌已刪除)',
 'rev-deleted-text-permission' => 'Ke-vùn-chông siû-thin yí-kîn pûn-chhiùng kûng-khiung vùn-tóng chûng yì-chhù. Chhai [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} chhù-thet ngit-ki] chûng khó-nèn kiám-chhà to siòng-se ke sin-sit.',
 'rev-deleted-text-view' => 'Ke-vùn-chông siû-thin yí-kîn pûn-chhiùng kûng-khiung vùn-tóng chûng yì-chhù. Chok-vi mióng-chham ke kón-lî-yèn, khó-yî kiám-chhà; Chhai[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} chhù-thet ngit-ki] chûng khó-nèn kiám-chhà to siòng-se ke sin-sit.',
-'rev-delundel' => 'Hién-sṳ/yún-chhòng',
-'revisiondelete' => 'Chhù-thet/fî-fu̍k chhù-hi ke siû-thin',
-'revdelete-nooldid-title' => 'Mò-yû muk-phêu siû-thin',
-'revdelete-nooldid-text' => 'Mò-yû chṳ́-thin chhṳ́chhâu-chok ke muk-phêu siû-thin.',
-'revdelete-selected' => "'''Sién-chhí [[:$1]] ke  $2-chhṳ siû-thin:'''",
+'rev-delundel' => '展現/隱藏',
+'rev-showdeleted' => '展現',
+'revisiondelete' => '刪除/恢復刪除修訂版本',
+'revdelete-nooldid-title' => '無效嘅目標修訂版本',
+'revdelete-nooldid-text' => '汝還吂指定一隻目標修訂版本去進行邇隻功能、
+所指定嘅修訂版本毋存在,或者汝嘗試去隱藏今下嘅修訂版本。',
+'revdelete-no-file' => '指定嘅文件毋存在',
+'revdelete-show-file-submit' => '係',
+'revdelete-selected' => "'''選取[[:$1]]嘅$2次修訂:'''",
 'logdelete-selected' => "'''Chhí-chhṳ '''$1''' ke $2-ke ngit-ki hong-muk:'''",
 'revdelete-text' => "'''Chhù-thet ke siû-thin yìn-yèn chiông-voi hién-sṳ chhai vùn-chông li̍t-sṳ́ chûng, than vùn-sṳ nui-yùng yí-kîn put-nèn pûn chung-ngìn fóng-mun.''' Chhai chhṳ́ miong-chham ke khì-thâ kón-lî-yèn chiông chhòi-nèn fóng-mun yún-chhòng ke nui-yùng pin theu-ko siông-thùng ke kie-mien fî-fu̍k chhù-hi, chhù-fî miong-chham kûng-chok-chá chin-hàng han-chṳ.",
 'revdelete-legend' => 'Sat-thin siû-thin han-chṳ:',
-'revdelete-hide-text' => 'Yún-chhòng siû-thin vùn-sṳ',
-'revdelete-hide-image' => 'Yún-chhòng tóng-on nui-yùng',
-'revdelete-hide-name' => 'Yún-chhòng thung-chok khi̍p muk-phêu',
-'revdelete-hide-comment' => 'Yún-chhòng phiên-chho sot-mìn',
-'revdelete-hide-user' => 'Yún-chhòng phiên-siá-chá ke yung-fu-miàng/IP',
+'revdelete-hide-text' => '隱藏修訂版本文字',
+'revdelete-hide-image' => '隱藏文件內容',
+'revdelete-hide-name' => '隱藏動作撈目標',
+'revdelete-hide-comment' => '隱藏編寫摘要',
+'revdelete-hide-user' => '隱藏編寫人嘅用戶名/IP地址',
 'revdelete-hide-restricted' => 'Chiông han-chṳ khiung-thùng yin-yung yî kón-lî-yèn',
-'revdelete-suppress' => 'Thùng-sṳ̀ ap-chṳ chhâu-chok-yèn yî-khi̍p khì-thâ yung-fu ke chṳ̂-liau',
-'revdelete-unsuppress' => 'Chhai yí-kîn fî-fu̍k ke siû-thin chûng yì-chhù han-chṳ',
-'revdelete-log' => 'Ngièn-yîn:',
+'revdelete-suppress' => '同時廢止由操作員撈其他用戶嘅數據',
+'revdelete-unsuppress' => '在已恢復嘅修訂肚移除限制',
+'revdelete-log' => '原因:',
 'revdelete-submit' => 'Yin-yung chhut-yì sién-chhí ke siû-thin',
 'revdelete-success' => "'''Siû-thin ke khó-kien-sin yí-kîn sṳ̀n-kûng sat-thin.'''",
-'logdelete-success' => "'''Sṳ-khien ke khó-kien-sin yí-kîn sṳ̀n-kûng sat-thin.'''",
-'revdel-restore' => 'Kiên-kói khó-kien-sin',
-'pagehist' => 'Vùn-tsông li̍t-sṳ́',
-'deletedhist' => 'Yí-kîn tshù-me̍t ke li̍t-sṳ́',
+'logdelete-success' => "'''事件嘅可見性已經成功設定。'''",
+'revdel-restore' => '更改可見性',
+'revdel-restore-deleted' => '已刪除嘅修訂版本',
+'revdel-restore-visible' => '見得到嘅修訂版本',
+'pagehist' => '頁面歷史',
+'deletedhist' => '已刪除嘅歷史',
 
 # Suppression log
-'suppressionlog' => 'Fi-tsṳ́  ngit-péu',
+'suppressionlog' => '監督日誌',
 
 # History merging
-'mergehistory' => 'Ha̍p-yit siû-tsáng ki-liu̍k',
-'mergehistory-from' => 'Lòi-ngièn vùn-tsông:',
-'mergehistory-into' => 'Muk-tit vùn-tsông:',
-'mergehistory-list' => 'Khó-yî ha̍p-yit ke piên-sip li̍t-sṳ́',
+'mergehistory' => '合併頁面歷史',
+'mergehistory-from' => '來源頁面:',
+'mergehistory-into' => '目的頁面:',
+'mergehistory-list' => '做得合併嘅編寫歷史',
+'mergehistory-merge' => '以下[[:$1]]嘅修訂可以合併到[[:$2]]。用邇選項按鈕欄去合併單淨有在指定時間以前所創建嘅修訂。愛留意嘅係使用導航連接就會重設邇一欄。',
 
 # Merge log
-'revertmerge' => 'Kié-tshù pìn-ha̍p',
+'revertmerge' => '解除合併',
 
 # Diffs
-'history-title' => '"$1" ke siû-thin li̍t-sṳ́',
-'lineno' => 'Thi $1-hàng:',
-'compareselectedversions' => 'Pí-káu sién-thin ke pán-pún',
-'editundo' => 'Chhat-sêu',
-'diff-multi' => '($1-ke chûng-thù ke siû-thin pán-pún mò-yû hién-sṳ.)',
+'history-title' => '“$1”嘅修訂歷史',
+'lineno' => '第$1行:',
+'compareselectedversions' => '比較選定嘅修訂版本',
+'editundo' => '撤銷',
+'diff-multi' => '(吂展示$2隻用戶嘅$1嘅中間版本)',
 
 # Search results
-'searchresults' => 'Chhìm-cháu kiet-kó',
-'searchresults-title' => 'Tui "$1" ke sêu-chhà kiet-kó',
-'searchresulttext' => 'Yû-kôan chhìm-cháu {{SITENAME}} ke kien-tô siòng-se chhìn-khóng, chhâm-kháu [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchresults' => '搜尋結果',
+'searchresults-title' => '搜尋"$1"嘅結果',
+'searchresulttext' => '有關搜尋{{SITENAME}}嘅又較多詳情,參詳[[{{MediaWiki:Helppage}}|{{int:help}}]]。',
 'searchsubtitle' => 'Chhà-sûn $1 (só-yû yî "$1" khôi-thèu ke ya̍p • só-yû lièn-chiap to "$1" ke ya̍p)',
-'searchsubtitleinvalid' => 'Chhà-chhìm "$1"',
-'titlematches' => 'Vùn-chông thì-muk siông-fù',
-'notitlematches' => 'Mò-yû chhìm-cháu to phit-phi vùn-chông thì-muk',
-'textmatches' => 'Vùn-chông nui-yùng fù-ha̍p',
-'notextmatches' => 'Mò-yû vùn-chông nui-yùng phit-phi',
-'prevn' => 'Chhièn {{PLURAL:$1|$1}}-ke',
-'nextn' => 'hâ {{PLURAL:$1|$1}}-ke',
-'viewprevnext' => 'Kiám-sṳ ($1)  ($2)  ($3).',
-'searchhelp-url' => 'Help:Pông-chhu',
-'search-result-size' => '$1 ($2 ke sṳ)',
-'search-redirect' => '(chhùng-thin-hiong $1)',
-'search-section' => '(thon-lo̍k $1)',
-'search-suggest' => 'Ngì shì-féu kié: $1',
-'search-interwiki-caption' => 'Chí-moi kie-va̍k',
-'search-interwiki-default' => '$1 kiet-kó:',
-'search-interwiki-more' => '(kien-tô)',
+'searchsubtitleinvalid' => "搜尋'''$1'''",
+'titlematches' => '頁面標題相符',
+'notitlematches' => '找毋到配得上嘅頁面題目',
+'textmatches' => '頁面內容配得上',
+'notextmatches' => '無頁面內容配上',
+'prevn' => '前頭$1隻',
+'nextn' => '後背$1隻',
+'prevn-title' => '前頭$1隻結果',
+'nextn-title' => '後背$1隻結果',
+'shown-title' => '每頁展示$1項結果',
+'viewprevnext' => '查看($1 {{int:pipe-separator}} $2)($3)',
+'searchmenu-exists' => "'''在邇隻wiki上已經有一頁喊做“[[:$1]]”。'''",
+'searchmenu-new' => "'''在本wiki上建立邇隻頁面“[[:$1]]”!'''",
+'searchhelp-url' => 'Help:目錄',
+'searchprofile-articles' => '內容頁面',
+'searchprofile-project' => '幫助撈計劃頁面',
+'searchprofile-images' => '多媒體',
+'searchprofile-everything' => '全部',
+'searchprofile-advanced' => '高級',
+'searchprofile-articles-tooltip' => '在$1肚搜尋',
+'searchprofile-project-tooltip' => '在$1肚搜尋',
+'searchprofile-images-tooltip' => '搜尋文件',
+'searchprofile-everything-tooltip' => '搜索全部(包括討論頁面)',
+'searchprofile-advanced-tooltip' => '在用戶安名空間肚搜尋',
+'search-result-size' => '$1 ($2隻字)',
+'search-result-category-size' => '$1隻成員($2隻子分類,$3隻文件)',
+'search-redirect' => '(重定向 $1)',
+'search-section' => '(段落 $1)',
+'search-suggest' => '汝係毋係尋:$1',
+'search-interwiki-caption' => '姊妹計劃',
+'search-interwiki-default' => '$1項結果:',
+'search-interwiki-more' => '(還較多)',
+'searchrelated' => '相關',
+'searchall' => '全部',
 'showingresults' => "Ha-mien hién-sṳ chhiùng thi-'''$2'''-thiàu khôi-sṳ́ ke '''$1'''-thiàu kiet-kó:",
-'showingresultsnum' => "Ha-mien hién-sṳ chhiùng thi-'''$2'''-thiàu khôi-sṳ́ ke '''$3'''-thiàu kiet-kó:",
+'showingresultsnum' => "下背展示從第'''$2'''條開始嘅'''{{PLURAL:$3|1|$3}}'''條結果。",
+'showingresultsheader' => "對'''$4'''嘅{{PLURAL:$5|第'''$1'''到第'''$3'''隻結果|第'''$1 - $2'''隻,共'''$3'''隻結果}}",
 'nonefound' => '<strong>Chu-yi:</strong> Sṳt-phai ke sêu-chhà vông-vông he chhut-yì chhṳ-thù sêu-chhà chû-yì "ke" fe̍t-chá "lâu" chṳ̂-lui ke sòng-kien-sṳ só yîn-hí.',
-'powersearch' => 'Chin-kiê sêu-chhà',
-'powersearch-legend' => 'Chin-kiê sêu-chhà',
-'powersearch-ns' => 'Chhai yî-ha ke miàng-sṳ khûng-kiên chûng sêu-chhà:',
-'powersearch-redir' => 'Chhùng-sîn thin-hiong chhîn-tân',
-'powersearch-field' => 'Sêu-chhà',
-'powersearch-togglelabel' => 'Kiám-chhà:',
-'searchdisabled' => '{{SITENAME}} sin-nèn fông-mien ke ngièn-yîn, chhiòn-vùn chhìm-cháu yí-kîn pûn chhiam-sṳ̀ thìn-yung. Ngì khó-yî chhiam-sṳ̀ theu-ko Google chhà-chhìm. Chhiáng liù-yi sok-yîn khó-nèn voi ko-sṳ̀.',
-
-# Quickbar
-'qbsettings' => 'Khoai-suk thô-hòng-thiàu',
-'qbsettings-none' => 'Mò',
-'qbsettings-fixedleft' => 'Hiong-chó ku-thin',
-'qbsettings-fixedright' => 'Hiong-yu ku-thin',
-'qbsettings-floatingleft' => 'Phêu-yì chhai chó',
-'qbsettings-floatingright' => 'Phêu-yì chhai yu',
+'search-nonefound' => '在查詢肚無結果相符。',
+'powersearch' => '高級搜尋',
+'powersearch-legend' => '高級搜尋',
+'powersearch-ns' => '在下背嘅名字空間肚搜尋:',
+'powersearch-redir' => '重定向清單',
+'powersearch-field' => '搜尋',
+'powersearch-togglelabel' => '監查:',
+'searchdisabled' => '{{SITENAME}}由於性能方面嘅原因,全文搜已分暫時停用。汝做得暫時通過Google搜尋。請留意佢兜嘅索引可能會過時。',
 
 # Preferences page
-'preferences' => 'Chhâm-su sat-chṳ',
-'mypreferences' => 'Ngài-ke chhâm-su sat-chṳ',
-'prefsnologin' => 'Hàn-mò tên-ngi̍p',
+'preferences' => '偏好設定',
+'mypreferences' => '偏好設定',
+'prefsnologin' => '還吂登入',
 'prefsnologintext' => 'Ngì pit-sî chhai-siên [[Special:UserLogin|tên-ngi̍p]] chhòi-nèn sat-chṳ ke-ngìn chhâm-su.',
-'changepassword' => 'Kiên-kói me̍t-me̍t',
-'prefs-skin' => 'Mien-pán',
-'skin-preview' => 'Yi-ko',
-'datedefault' => 'Yi-sat-chhṳ̍t',
-'prefs-datetime' => 'Ngit-khì khi̍p sṳ̀-kiên',
-'prefs-personal' => 'Yung-fu chṳ̂-liau',
-'prefs-rc' => 'Chui-khiûn kiên-kói',
-'prefs-watchlist' => 'Kam-sṳ lie̍t-péu',
+'changepassword' => '更改密碼',
+'prefs-skin' => '外皮',
+'skin-preview' => '預覽',
+'datedefault' => '預設值',
+'prefs-datetime' => '日期撈時間',
+'prefs-personal' => '用戶資料',
+'prefs-rc' => '最近更改',
+'prefs-watchlist' => '監視列表',
 'prefs-watchlist-days' => 'Kam-sṳ lie̍t-péu chûng hién-sṳ ki-liu̍k ke thiên-su:',
-'prefs-watchlist-edits' => 'Chhai chen-khiòng ke Kam-sṳ lie̍t-péu chûng hién-sṳ ke phiên-chho chhṳ-su:',
-'prefs-misc' => 'Khì-thâ sat-chṳ',
-'saveprefs' => 'Pó-chhùn',
+'prefs-watchlist-edits' => '擴展監視列表肚顯示更改次數上限:',
+'prefs-misc' => '雜項',
+'saveprefs' => '保存',
 'resetprefs' => 'Sat-thin',
-'prefs-editing' => 'Phiên-cho',
-'rows' => 'Phài-lie̍t',
-'columns' => 'Lie̍t-su:',
-'searchresultshead' => 'Chhìm-cháu kiet-kó sat-thin',
-'resultsperpage' => 'Mî-chông hién-sṳ lièn-kiet su:',
-'stub-threshold' => 'Tón vùn-chông hién-sṳ kî-pún han-chṳ',
-'recentchangesdays' => 'Chui-khiûn kiên-kói chûng ke hién-sṳ ngit-su:',
+'restoreprefs' => '恢復所有默認設定',
+'prefs-editing' => '編寫緊',
+'rows' => '行:',
+'columns' => '列:',
+'searchresultshead' => '搜尋',
+'resultsperpage' => '每頁顯示鏈接數:',
+'stub-threshold' => '<a href="#" class="stub">短頁面鏈接</a>格式門檻值(字節):',
+'recentchangesdays' => '最近更改肚嘅顯示日數:',
 'recentchangescount' => 'Chui-khiûn kiên-kói chûng ke phiên-siá chúng-su:',
-'savedprefs' => 'Ngì-ke ke-ngìn chhâm-su sat-chṳ yí-kîn pó-chhùn.',
+'savedprefs' => '汝嘅個人偏好設定已經保存。',
 'timezonelegend' => 'Sṳ̀-khî',
 'localtime' => 'Tông-thi sṳ̀-kiên',
 'timezoneoffset' => 'Sṳ̀-chhâ¹',
 'servertime' => 'Fu̍k-vu hi-khí sṳ̀-kiên',
-'guesstimezone' => 'Chhiùng hi-khí thiàm-mân',
-'allowemail' => 'Chiap-su lòi-chhṳ̀ khì-thâ yung-fu ke email',
+'guesstimezone' => '從瀏覽器填寫',
+'allowemail' => '接受來自其他用戶嘅郵件',
 'defaultns' => 'Yi-sat sêu-sok ke miàng-sṳ khûng-kiên:',
-'default' => 'Yi-sat',
-'prefs-files' => 'Tóng-on',
-'youremail' => 'Thien-chṳ́ yù-khien:',
+'default' => '默認',
+'prefs-files' => '文件',
+'youremail' => '電子郵件:',
 'username' => 'Yung-fu miàng-chhṳ̂n:',
 'uid' => 'Yung-fu ID:',
-'yourrealname' => 'Chṳ̂n-sṳ̍t siang-miàng *:',
-'yourlanguage' => 'Kie-mien ngî-ngièn:',
+'yourrealname' => '真名:',
+'yourlanguage' => '語言:',
 'yourvariant' => 'Sṳ-thí pien-von:',
 'yournick' => 'Kién-chhṳ̂n:',
-'badsig' => 'Chho-ngu ke ngièn-sṳ́ chhiâm-miàng; chhiáng kiám-chhà HTML phêu-chhiâm.',
+'badsig' => '錯誤嘅原始簽名。請檢查HTML標籤。',
 'badsiglength' => 'Tshiâm-miàng ko-liong.
 Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
-'email' => 'Email',
-'prefs-help-realname' => '* Chṳ̂n-sṳ̍t siang-miàng (khó-sién): yung-lòi tui-cheu ngì-ke kung-hien miàng.',
-'prefs-help-email' => 'Hí-khó sién: ngiong phe̍t-ngìn thûng-ko mióng-chham chhai vù-tî ngì-ke email thi-tiám ke chhìn-khóng hâ thûng-ko email lâu ngì lièn-lo̍k, yî-khi̍p thûng-ko email chhái-chhí vì-mong ke me̍t-me̍t.',
+'email' => '電子郵件',
+'prefs-help-realname' => '真名係做得選嘅。
+假使汝選擇提供其,其會用在貢獻署名。',
+'prefs-help-email' => '電郵地址係選填項目,但係,假使汝毋記得汝嘅密碼,其做得用於重設密碼。',
+'prefs-help-email-others' => '汝也做得選擇分其他用戶通過汝嘅用戶頁或交流頁上嘅鏈接用電子郵件聯繫汝。
+其他用戶聯繫汝時汝嘅電子郵件毋會顯示出來。',
 
 # User rights
-'userrights' => 'Yung-fu khièn-han kón-lî',
-'userrights-lookup-user' => 'Kón-lî yung-fu khiùn-chung',
-'userrights-user-editname' => 'Sû-ngi̍p yung-fu-miàng:',
-'editusergroup' => 'Phiên-cho yung-fu khiùn-chû',
+'userrights' => '用戶權限管理',
+'userrights-lookup-user' => '管理用戶群組',
+'userrights-user-editname' => '輸入用戶名:',
+'editusergroup' => '編寫用戶群組',
 'editinguser' => "Chang-chhai phiên-siá yung-fu '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
-'userrights-editusergroup' => 'Phiên-chho yung-fu khiùn-chung',
-'saveusergroups' => 'Pó-chhùn yung-fu khiùn-chû',
-'userrights-groupsmember' => 'Su̍k-yî:',
-'userrights-reason' => 'Ngièn-yîn:',
+'userrights-editusergroup' => '編寫用戶群組',
+'saveusergroups' => '保存用戶群組',
+'userrights-groupsmember' => '屬於:',
+'userrights-reason' => '原因:',
 
 # Groups
-'group' => 'Khiùn-chû:',
-'group-bot' => 'Kî-hi-ngìn',
-'group-sysop' => 'Kón-lî-yèn',
-'group-bureaucrat' => 'Hàng-chṳn-yèn',
-'group-all' => '(chhiòn-phu)',
+'group' => '群組:',
+'group-bot' => '機器人',
+'group-sysop' => '管理員',
+'group-bureaucrat' => '行政員',
+'group-all' => '(全部)',
 
 'group-bot-member' => 'Kî-hi-ngìn',
-'group-sysop-member' => 'Kón-lî-yèn',
-'group-bureaucrat-member' => 'Hàng-chṳn-yèn',
+'group-sysop-member' => '{{GENDER:$1|管理員}}',
+'group-bureaucrat-member' => '行政員',
+
+'grouppage-bot' => '{{ns:project}}:機器人',
+'grouppage-sysop' => '{{ns:project}}:管理員',
 
-'grouppage-bot' => '{{ns:project}}:Kî-hi-ngìn',
-'grouppage-sysop' => '{{ns:project}}:Kón-lî-yèn',
+# Rights
+'right-upload' => '上傳文件',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Sîn-chin yung-fu miàng-chhak',
-'newuserlogpagetext' => 'Liá-he yit-ke chui-khiun pûn chhóng-kien yung-fu ke ngit-ki.',
+'newuserlogpage' => '新建用戶名冊',
+'newuserlogpagetext' => '邇係一隻最近人創建用戶嘅新日誌',
 
 # User rights log
-'rightslog' => 'Yung-fu khièn-han ngit-ki',
-'rightslogtext' => 'Yî-ha ki-liu̍k yung-fu khièn-han ke kiên-kói ki-liu̍k.',
+'rightslog' => '用戶權限日誌',
+'rightslogtext' => '下背記錄矣用戶權限嘅更改日誌。',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'phiên-siá pún-chông',
+'action-edit' => '編寫本頁',
 
 # Recent changes
-'nchanges' => '$1-chhṳ kiên-kói',
-'recentchanges' => 'Chui-khiûn ke kiên-kói',
-'recentchanges-legend' => 'Chui-khiun kiên-kói sién-chet',
-'recentchanges-summary' => 'Kiên-chiûng liá-ke wiki song ke chui-sîn kiên-kói.',
-'recentchanges-feed-description' => 'Kiên-chiûng chhṳ-thin chhai wiki song chui-khiûn ke kiên-kói.',
-'rcnote' => "Yî-ha he chhai $3, chui-khiûn '''$2''' thiên-nui ke '''$1'''-chhṳ chui-khiûn ke kiên-kói ki-liu̍k:",
-'rcnotefrom' => "Ha-mien he chhṳ '''$2''' (Chui-tô hién-sṳ '''$1'''):",
-'rclistfrom' => 'Hién-sṳ chhṳ $1 yî-lòi ke sîn kiên-kói',
-'rcshowhideminor' => '$1 séu phiên-cho',
-'rcshowhidebots' => '$1 kî-hi-ngìn ke phiên-cho',
-'rcshowhideliu' => '$1 yí-kîn tên-ngi̍p yung-fu ke phiên-cho',
-'rcshowhideanons' => '$1 ngia̍k-miàng yung-fu ke phiên-cho',
-'rcshowhidepatr' => '$1 kiám-chhà-ko ke phiên-siá',
-'rcshowhidemine' => '$1 ngô-ke phiên-siá',
-'rclinks' => 'Hién-sṳ chui-khiûn $2 thiên-nui ke chui-sîn ke $1-chhṳ kói-thung. <br />$3',
-'diff' => 'chhâ-yi',
-'hist' => 'Li̍t-sṳ́',
-'hide' => 'Yún-chhòng',
-'show' => 'Hién-sṳ',
-'minoreditletter' => 'séu',
-'newpageletter' => 'Sîn',
-'boteditletter' => 'Kî-hi',
-'number_of_watching_users_pageview' => '[$1-ke kôan-chu yung-fu]',
-'rc_categories' => 'Fûn-lui kie-han (yî "|" fûn-kot)',
-'rc_categories_any' => 'Ngim-yi',
-'rc-enhanced-expand' => 'Hién-sṳ se-chiet (sî-yeu JavaScript)',
-'rc-enhanced-hide' => 'Yún-chhòng se-chiet',
+'nchanges' => '$1次更改',
+'recentchanges' => '最近更改',
+'recentchanges-legend' => '最近更改選項',
+'recentchanges-summary' => '跟蹤本wiki上嘅最新更改。',
+'recentchanges-feed-description' => '跟蹤本訂閱在wiki上嘅最近更改。',
+'recentchanges-label-newpage' => '邇次編輯建立起一隻新頁面',
+'recentchanges-label-minor' => '邇係一隻細微修改',
+'recentchanges-label-bot' => '邇次編寫係由機器人進行',
+'recentchanges-label-unpatrolled' => '邇次編寫還吂巡查過',
+'rcnote' => "下背係在$4 $5,最近'''$2'''日內嘅'''$1'''次最近更改記錄。",
+'rcnotefrom' => "下背係從'''$2'''起嘅更改(最多展示'''$1'''):",
+'rclistfrom' => '展示從$1以來嘅新更改',
+'rcshowhideminor' => '$1細微編寫',
+'rcshowhidebots' => '$1機器人嘅編寫',
+'rcshowhideliu' => '$1已登入用戶嘅編寫',
+'rcshowhideanons' => '$1匿名用戶嘅編寫',
+'rcshowhidepatr' => '$1巡查過嘅編寫',
+'rcshowhidemine' => '$1亻厓嘅編寫',
+'rclinks' => '展示最近$2日內最新嘅$1次改動。<br />$3',
+'diff' => '差別',
+'hist' => '歷史',
+'hide' => '隱藏',
+'show' => '展示',
+'minoreditletter' => '細微',
+'newpageletter' => '新',
+'boteditletter' => '機',
+'number_of_watching_users_pageview' => '[$1隻用戶關注]',
+'rc_categories' => '分類界限(以“|”分割)',
+'rc_categories_any' => '任意',
+'rc-enhanced-expand' => '展示細節 (愛有JavaScript)',
+'rc-enhanced-hide' => '隱藏細節',
 
 # Recent changes linked
-'recentchangeslinked' => 'Lièn-chhut kiên-kói',
-'recentchangeslinked-feed' => 'Lièn-chhut kiên-kói',
-'recentchangeslinked-toolbox' => 'Lièn-chhut kiên-kói',
-'recentchangeslinked-title' => 'Tui-yî  "$1" yû-kôan ke lièn-chhut kiên-kói',
-'recentchangeslinked-noresult' => 'Chhai liá yit-thon sṳ̀-kiên chûng lièn-kiet ke hong-mien pin-mò kiên-kói.',
-'recentchangeslinked-summary' => "Liá-ke thi̍t-sû-ya̍p lie̍t-sṳ ''yù'' só pûn-chhut ke yit-ke ya̍p chṳ̂ lièn-kiet to ya̍p ke chui-khiûn kiên-kói (fe̍t-chá he tui-yî chṳ́-thin fûn-lui ke  sṳ̀n-yèn).
-Chhai [[Special:Watchlist|ngì-ke kam-sṳ lie̍t-péu]] chûng ke ya̍p fi hién-sṳ '''chhû-thí'''.",
-'recentchangeslinked-page' => 'Ya̍p-miàng:',
-'recentchangeslinked-to' => 'Hién-sṳ lièn-to só pûn-chhut  ke  ya̍p',
+'recentchangeslinked' => '相關更改',
+'recentchangeslinked-feed' => '相關更改',
+'recentchangeslinked-toolbox' => '相關更改',
+'recentchangeslinked-title' => '撈“$1”有關嘅更改',
+'recentchangeslinked-noresult' => '在邇一段時間肚鏈接嘅頁面並無更改。',
+'recentchangeslinked-summary' => "邇一隻特殊頁面列示''由''所分出嘅一隻頁面之鏈接到頁面嘅最近更改(或者是對於指定分類嘅成員)。
+在[[Special:Watchlist|汝嘅監視列表]]肚嘅頁面會用'''粗體'''顯示。",
+'recentchangeslinked-page' => '頁面名:',
+'recentchangeslinked-to' => '展示連到所分出嘅頁面',
 
 # Upload
-'upload' => 'Sông-chhòn tóng-on',
-'uploadbtn' => 'Song-chhòn tóng-on',
-'reuploaddesc' => 'Fán-fì song-chai péu-tân.',
-'uploadnologin' => 'Hàn-mò tên-ngi̍p',
-'uploadnologintext' => 'Ngì pit-sî chó-siên [[Special:UserLogin|tên-ngi̍p]] chhòi-nèn sông-chai vùn-khien.',
-'upload_directory_read_only' => 'Song-chhòn muk-liu̍k ($1) put-chhùn-chhai fe̍t-chá mò siá khièn-han.',
-'uploaderror' => 'Song-chhòn chho-ngu',
+'upload' => '上傳文件',
+'uploadbtn' => '上傳文件',
+'reuploaddesc' => '取消上載並返回上載表單',
+'uploadnologin' => '還吂登入',
+'uploadnologintext' => '汝必須先[[Special:UserLogin|登入]]
+正做得上傳文件。',
+'upload_directory_read_only' => '上傳目錄($1)毋存在或無寫權限。',
+'uploaderror' => '上傳差錯',
 'uploadtext' => "Sṳ́-yung ha-mien ke péu-tân lòi song-chhòn yung-chhai vùn-chông nui sîn-ke thù-hìn tóng-on. Yeu kiám-sṳ fe̍t-chá sêu-chhà yî-chhièn song-chhòn ke thù-phién khó-yî chin-ngi̍p [[Special:FileList|Thù-hìn chhîn-tân]], song-chhòn lâu chhù-hi chiông-chhai [[Special:Log/upload|Song-chhòn ngit-ki]] chûng ki-liu̍k. Yeu-chhai vùn-chông chûng kâ-ngi̍p thù-hiong, sṳ́-yung yî-ha hìn-sṳt ke lièn-chiap: '''<nowiki>[[{{ns:file}}:file.jpg]]</nowiki>''', '''<nowiki>[[{{ns:file}}:file.png|Thi-von vùn-sṳ]]</nowiki>''' fe̍t-he '''<nowiki>[[{{ns:media}}:file.ogg]]</nowiki>'''.",
-'uploadlog' => 'Song-chhòn ki-liu̍k',
-'uploadlogpage' => 'Song-chhòn ki-liu̍k',
+'uploadlog' => '上傳日誌',
+'uploadlogpage' => '上傳日誌',
 'uploadlogpagetext' => 'Yî-ha he chui-khiûn song-chhòn vùn-khien ke chúng-péu.',
-'filename' => 'Tóng-on miàng',
-'filedesc' => 'Tóng-on mèu-siá',
-'fileuploadsummary' => 'Tóng-on mèu-siá:',
-'filestatus' => 'Pán-khièn chhong-thai:',
-'filesource' => 'Lòi-ngièn:',
-'uploadedfiles' => 'Yí-kîn Song-chhòn ke vùn-khien',
-'ignorewarning' => 'Fut-lio̍k kín-ko pin tú-chhùn tóng-on',
-'ignorewarnings' => 'Fut-lio̍k só-yû kín-ko',
-'illegalfilename' => 'Tóng-on miàng "$1" pâu-hàm yû hong-mien phêu-thì só kim-chṳ́ ke sṳ-fù. Chhiáng kói-miàng-heu chhùng-sîn song-chhòn.',
-'badfilename' => 'Tóng-on miàng yí-kîn pûn-ngìn kói-cho "$1"。',
-'filetype-badmime' => 'MIME lui-phe̍t "$1" put-he yùng-hí ke tóng-on kak-sṳt.',
-'filetype-missing' => 'Ke tóng-on miàng-chhṳ̂n pin mò-yû fu tóng-miàng (hiong ".jpg").',
-'large-file' => 'Kien-ngi tóng-on thai-séu put-nèn chhêu-ko $1; pún tóng-on thai-séu he $2.',
-'largefileserver' => 'Liá-ke tóng-on ke thai-séu fu̍k-chhiùng-hi fûn-phi yún-chún ke thai-séu hàn-yeu thai.',
-'emptyfile' => 'Ngì só song-chhòn ke tóng-on put chhùn-chhai. Liá khó-nèn he chhut-yì tóng-on miàng chho-ngu. Chhiáng kiám-chhà ngì he-feu chṳ̂n yeu song-chhòn chhṳ́ tóng-on.',
-'fileexists' => 'Yí-kîn chhùn-chhai siông-thùng miàng-chhṳ̂n ke tóng-on, kó-yèn ngì mò-fap khok-thin ngì he-feu yeu kói-pien kì, chhiáng kiám-chhà <strong>[[:$1]]</strong>.
-[[$1|thumb]]',
-'fileexists-extension' => 'Yit-ke siông-sṳ tóng-miàng ke tóng-on yí-kîn chhùn-chhai: [[$2|thumb]]
-* Song-chhòn tóng-on ke tóng-miàng: <strong>[[:$1]]</strong>
-* Hien-chhai yû tóng-on ke tóng-miàng: <strong>[[:$2]]</strong>
-Chhiáng sién-chet yit-ke put-thùng ke miàng-sṳ.',
-'fileexists-thumbnail-yes' => "Liá-ke tóng-on chhin-chhiong he yit-pu thù-hìn ke suk-thù pán-pún ''(suk-thù)''. [[$1|thumb]]
-Chhiáng kiám-chhà chhîn-chhú ke tóng-on <strong>[[:$1]]</strong>.
-Kó-yèn kiám-chhà heu ke tóng-on he khiung-thùng ngièn-pún thù-hiong ke thai-séu he yit-yong, chhiu put-yung song-chhòn tô yit-puk suk-thù.",
-'file-thumbnail-no' => "Ke tóng-on he yî <strong>$1</strong> khôi-sṳ́.
-Hó-chhiong yit-puk thù-hìn ke suk-thù pán-pún ''(thù-hìn)''.
-Kó-yèn ngì yû liá-ke thù-hìn ke vàn-cháng thai-séu.",
-'fileexists-forbidden' => 'Yí-kîn chhùn-chhai ke siông-thùng miàng-chhṳ̂n ke tóng-on; chhiáng fì-chón pin yung yit-ke sîn-ke  miàng-chhṳ̂n lòi song-chhòn chhṳ́ tóng-on.[[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Chhai khiung-hióng tóng-on-khu chûng yí-kîn chhùn-chhai chhṳ́ miàng-chhṳ̂n ke tóng-on; Chhiáng fì-chón pin yung yit-ke sîn-ke miàng-chhṳ̂n lòi song-chhòn chhṳ́ tóng-on. [[File:$1|thumb|center|$1]]',
-'uploadwarning' => 'Sông-chai kín-ko',
-'savefile' => 'Pó-chhùn vùn-khien',
-'uploadedimage' => 'yí-kîn song-chhòn "[[$1]]"',
-'uploaddisabled' => 'Mò-fap song-chhòn',
+'filename' => '文件名',
+'filedesc' => '文件說明',
+'fileuploadsummary' => '文件摘要:',
+'filestatus' => '版權狀態:',
+'filesource' => '來源:',
+'uploadedfiles' => '已上傳文件',
+'ignorewarning' => '忽略警告並保存文件',
+'ignorewarnings' => '忽略所有警告',
+'illegalfilename' => '文件名“$1”包含有頁面標題所禁止嘅字符。請改名後重新上傳。',
+'badfilename' => '文件名已分改做“$1”。',
+'filetype-badmime' => 'MIME類別“$1”毋係准許嘅文件格式。',
+'filetype-missing' => '邇隻文件名並無擴展名(像“.jpg”)。',
+'large-file' => '建議文件大細毋超過$1;本文件大細係$2。',
+'largefileserver' => '邇隻文件大細比服務器配置允許嘅大細還愛大。',
+'emptyfile' => '汝所上傳嘅文件毋存在。邇可能係由於文件名鍵入錯誤。請檢查汝係毋係真嘅愛上傳邇隻文件。',
+'fileexists' => '已存在同名嘅文件,假使汝無法確定汝係毋係愛改變其,請檢查<strong>[[:$1]]</strong>。 [[$1|thumb]]',
+'fileexists-extension' => '一隻相似名稱嘅文件已經存在: [[$2|thumb]]
+* 上傳文件嘅名: <strong>[[:$1]]</strong>
+* 現有文件嘅名: <strong>[[:$2]]</strong>
+請選擇一隻毋同嘅名。',
+'fileexists-thumbnail-yes' => "邇隻文件好像係一張圖片嘅縮圖版本''(縮圖)''。 [[$1|thumb]]
+請檢查清楚邇文件<strong>[[:$1]]</strong>。
+假使檢查後嘅文件係撈原本圖片嘅大細係共樣嘅話,就毋用再上傳多一張縮圖。",
+'file-thumbnail-no' => "文件名以<strong>$1</strong>開始。其好像某張圖片嘅縮細版本''(縮圖)''。
+假使汝有邇圖片嘅完整大細版本,請上傳其;否則請修改文件名。",
+'fileexists-forbidden' => '既存在同名嘅文件,且毋可以覆蓋;請返回並用一隻新名來上傳邇隻文件。[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => '在共享文件庫中既存在同名文件。
+係話汝仍然想愛上載其嘅話,請返回並用一隻新名來上傳邇隻文件。[[File:$1|thumb|center|$1]]',
+'uploadwarning' => '上傳警告',
+'savefile' => '保存文件',
+'uploadedimage' => '已上傳“[[$1]]”',
+'uploaddisabled' => '上傳己停用。',
 'uploaddisabledtext' => 'Tóng-on song-chhòn chhai chhṳ́ miong-chham put hí-khó yung.',
-'uploadscripted' => 'Ke tóng-on pâu-hàm khó-nèn pûn mióng-lu-hi chho-ngu kié-sṳt ke HTML fe̍t-chá kiok-pún thoi-me̍t.',
-'uploadvirus' => 'Ke-tóng-on yû pâu-hàm phiang-thu̍k! Siòng-se chhìn-khóng: $1',
-'sourcefilename' => 'Kòi-ngièn ke tóng-on miàng',
-'destfilename' => 'Muk-phêu tóng-on miàng',
-'watchthisupload' => 'Kam-sṳ pún tóng-on',
-'filewasdeleted' => 'Chṳ̂-chhièn yí-kîn yû yit-ke thùng-miàng tóng-on pûn song-chhòn heu yu-pûn chhù-thet. Chhai song-chhòn  chhṳ́ tóng-on chṳ̂-chhièn sî-yeu kiám-chhà $1.',
-'upload-success-subj' => 'Sông-chhòn sṳ̀n-kûng',
-
-'upload-proto-error' => 'Hia̍p-ngi chho-ngu',
-'upload-proto-error-text' => 'Yén-chhàng song-chhòn yêu-khiù URL yung <code>http://</code> fe̍t-chá  <code>ftp://</code> khôi-thèu.',
-'upload-file-error' => 'Nui-phu chho-ngu',
-'upload-file-error-text' => 'Tông chhṳ-thù chhai fu̍k-vu-hi song kien-li̍p lìm-sṳ̀ tóng-on sṳ̀ fat-sên nui-phu chho-ngu. Chhiáng-mun ne-thúng kón-lî-yèn lièn-kiê.',
-'upload-misc-error' => 'Vù-tî ke song-chhòn chho-ngu',
-'upload-misc-error-text' => 'Chhai song-chhòn sṳ̀ fat-sên vù-tî ke chho-ngu. Chhiáng ngiam-chṳn sṳ́-yung chṳn-khok pin hí-khó fóng-mun ke URL, yèn-heu chin-hàng chhùng-chhṳ. Kó-yèn mun-thì yìn-yèn chhùn-chhai, Chhiáng-mun ne-thúng kón-lî-yèn lièn-kiê.',
+'php-uploaddisabledtext' => 'PHP文件上傳已經停用。請檢查file_uploads設定。',
+'uploadscripted' => '邇文件包含可能分網絡瀏覽器錯誤解釋嘅HTML或腳本代碼。',
+'uploadvirus' => '邇文件包含有病毒!
+詳情:$1',
+'sourcefilename' => '來源文件名',
+'destfilename' => '目標文件名',
+'watchthisupload' => '監視本文件',
+'filewasdeleted' => '早先已經有一隻同名文件分上傳後又分刪除矣。在上傳邇文件之前汝愛檢查$1。',
+'upload-success-subj' => '上傳成功',
+
+'upload-proto-error' => '協議毋著',
+'upload-proto-error-text' => '遠程上傳要求URL以<code>http://</code>或 <code>ftp://</code>開頭。',
+'upload-file-error' => '內部差錯',
+'upload-file-error-text' => '當嘗試在服務器上建立臨時檔案時發生內部差錯。請撈[[Special:ListUsers/sysop|管理員]]聯繫。',
+'upload-misc-error' => '吂知嘅上傳差錯',
+'upload-misc-error-text' => '在上傳時發生還吂知嘅錯誤。請驗証使用矣正確並可訪問嘅 URL,然後重新嘗試。假使問題還係存在,請撈[[Special:ListUsers/sysop|管理員]]聯繫。',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => 'Mò-fap fóng-mun URL',
-'upload-curl-error6-text' => 'Mò-fap fóng-mun só thì-kiûng ke URL.  Chhiáng chai-chhṳ kiám-chhà ke-URL he-féu chṳn-khok, pin mióng-chham ke fóng-mun he-féu chṳn-sòng.',
-'upload-curl-error28' => 'Sông-chhòn chhêu-ko sṳ̀-kiên',
-'upload-curl-error28-text' => 'Mióng-chham fì-yin sṳ̀-kiên ko-chhòng. Chhiáng kiám-chhà chhṳ́ mióng-chham ke fóng-mun he-feu chṳn-sòng, chai chin-hàng sòng-chhṳ. Ngì khó-nèn sî-yeu chhai mióng-lu fóng-mun khûng-hàn sṳ̀-kiên chai-lòi chin-hàng sòng-chhṳ.',
+'upload-curl-error6' => '無法訪問URL',
+'upload-curl-error6-text' => '無法訪問所提供嘅URL。請再次檢查邇URL係毋係正確,並且網站嘅訪問係毋係正常。',
+'upload-curl-error28' => '上傳超時',
+'upload-curl-error28-text' => '網站回應時間過長。請檢查邇網站嘅訪問係毋係正常,過一陣再試。汝可能愛在網路訪問有閒時節再試。',
 
-'license' => 'Su-khièn',
-'license-header' => 'Su-khièn',
-'nolicense' => 'Mò-yû sién-thin',
-'upload_source_url' => '(Yit-ke yû-háu ke, hí-khó kûng-khôi fóng-mun ke URL)',
-'upload_source_file' => '(ngì thien-nó chûng ke tóng-on)',
+'license' => '授權:',
+'license-header' => '授權',
+'nolicense' => '無有選定',
+'upload_source_url' => ' (一隻有效、做得公開訪問嘅URL)',
+'upload_source_file' => ' (在汝電腦上嘅一隻文件)',
 
 # Special:ListFiles
-'listfiles_search_for' => 'On-cheu thù-chhiong miàng-chhṳ̂n sêu-chhà:',
-'imgfile' => 'tóng-on',
-'listfiles' => 'Tóng-on lie̍t-péu',
-'listfiles_date' => 'Ngit-khì',
-'listfiles_name' => 'Miàng-chhṳ̂n',
-'listfiles_user' => 'Yung-fu',
-'listfiles_size' => 'Thai-séu',
-'listfiles_description' => 'Mèu-sut',
+'listfiles_search_for' => '按媒體名搜尋:',
+'imgfile' => '文件',
+'listfiles' => '文件列表',
+'listfiles_date' => '日期',
+'listfiles_name' => '',
+'listfiles_user' => '用戶',
+'listfiles_size' => '大細',
+'listfiles_description' => '描述',
 
 # File description page
-'file-anchor-link' => 'Tóng-on',
-'filehist' => 'Tóng-on li̍t-sṳ́',
-'filehist-help' => 'Tiám-kit ngit-khì/sṳ̀-kiên yî kiám-sṳ tông-sṳ̀ chhut-hien-ko ke ke tóng-on.',
-'filehist-deleteone' => 'chhù-thet',
-'filehist-current' => 'muk-chhièn',
-'filehist-datetime' => 'Ngit-khì/Sṳ̀-kiên',
-'filehist-thumb' => 'Sok-thù',
-'filehist-thumbtext' => 'Yî $1-ke suk-thù pán-pún',
-'filehist-user' => 'Yung-fu',
-'filehist-dimensions' => 'Vì-thu',
-'filehist-comment' => 'Chu-kié',
-'imagelinks' => 'Tóng-on lièn-kiet',
-'linkstoimage' => 'Yî-ha vùn-chông lièn-chiap to pún tóng-on:',
-'nolinkstoimage' => 'Mò-yû vùn-chông lièn-chiap to pún tóng-on.',
-'sharedupload' => 'Ke tóng-on he yit-ke khiung-hióng song-chhòn, khó-nèn chhai khì-thâ hong-muk chûng pûn-ngìn yin-yung.',
-'uploadnewversion-linktext' => 'Song-chhòn tóng-on ke sîn pán-pún',
+'file-anchor-link' => '文件',
+'filehist' => '文件歷史',
+'filehist-help' => '點撳日期/時間來查看當時出現過嘅文件。',
+'filehist-deleteone' => '刪除',
+'filehist-revert' => '恢復',
+'filehist-current' => '當前',
+'filehist-datetime' => '日期/時間',
+'filehist-thumb' => '縮略圖',
+'filehist-thumbtext' => '$1嘅版本嘅縮略圖',
+'filehist-user' => '用戶',
+'filehist-dimensions' => '維度',
+'filehist-comment' => '意見',
+'imagelinks' => '文件用處',
+'linkstoimage' => '下背嘅$1隻頁面鏈接到本文件:',
+'nolinkstoimage' => '無頁面鏈接到本文件。',
+'sharedupload' => '本檔案來自於$1,渠可能在其它計劃項目肚分人應用。',
+'sharedupload-desc-here' => '邇文件來自於$1,其可能在其它計劃項目肚分應用。
+其在[$2文件描述頁面]介片上嘅描述在下背展示。',
+'uploadnewversion-linktext' => '上傳邇隻文件嘅新版本',
 
 # File deletion
-'filedelete-submit' => 'Chhù-thet',
+'filedelete-submit' => '刪除',
 
 # MIME search
-'mimesearch' => 'MIME chhà-chhìm',
-'mimesearch-summary' => 'Pún vùn-chông sṳ-yung tóng-on MIME lui-hìn ko-li-hi. Sû-ngi̍p: nui-yùng lui-hìn yì-yi <code>image/jpeg</code>.',
-'mimetype' => 'MIME lui-hìn:',
-'download' => 'hâ-chai',
+'mimesearch' => 'MIME搜尋',
+'mimesearch-summary' => '本頁面啟用文件MIME類型過濾器。撳入︰內容類型/子類型,如 <code>image/jpeg</code>。',
+'mimetype' => 'MIME 類型:',
+'download' => '下載',
 
 # Unwatched pages
-'unwatchedpages' => 'Hàn-mò pûn kam-sṳ ke vùn-chông',
+'unwatchedpages' => '吂分監視嘅頁面',
 
 # List redirects
-'listredirects' => 'Chhùng-thin hiong-mien chhîn-tân',
+'listredirects' => '重定向頁面清單',
 
 # Unused templates
-'unusedtemplates' => 'Hàn-mò sṳ́-yung ke mù-pán',
+'unusedtemplates' => '吂使用嘅模板',
 'unusedtemplatestext' => '<p>Chhiáng chu-yi khì-thâ mióng-chham khó-nèn chhṳ̍t-chiap theu-ko URL lièn-chiap chhṳ́ thù-hìn, só-yî liá-piên clie̍t-chhut ke thù-hìn yû khó-nèn pûn sṳ́-yung.</p>',
-'unusedtemplateswlh' => 'Khì-thâ lièn-kiet',
+'unusedtemplateswlh' => '其他鏈接',
 
 # Random page
-'randompage' => 'Sùi-kî thiàu-muk',
+'randompage' => '隨機頁面',
 'randompage-nopages' => 'Chhai liá-ke miàng-sṳ khûng-kiên chûng mò-yû hong-mien.',
 
 # Random redirect
-'randomredirect' => 'Sùi-kî chhùng-thin hong-mien',
+'randomredirect' => '隨機重定向頁',
 'randomredirect-nopages' => 'Chhai liá-ke miàng-sṳ khûng-kiên mò-yû chhùng-thin hong-mien.',
 
 # Statistics
-'statistics' => 'Thúng-kie',
-'statistics-header-users' => 'Yung-fu thúng-kie',
-'statistics-mostpopular' => 'Pûn-ngìn chhà-khon chhṳ-su chui-tô ke vùn-chông',
+'statistics' => '統計',
+'statistics-header-users' => '用戶統計',
+'statistics-mostpopular' => '分查閱次數最多嘅頁面',
 
 'disambiguations' => 'Sêu-hàm fù-chông',
+'disambiguationspage' => 'Template:消歧義',
 'disambiguations-text' => 'Yî-ha ke hong-mien tû-yû to <b> sêu-hàm fù-chông </b> ke lièn-chiap, than yin-kôi he lièn-to sṳt-tông ke phêu-thì. <br /> Yit-ke hong-mien chiông-voi pûn-ngìn sṳ-vi Sêu-hàm fù-chông kó-yèn kí he lièn-chhṳ [[MediaWiki:disambiguationspage]].',
 
-'doubleredirects' => 'Sûng chhûng-chhûng thin-hiong',
+'doubleredirects' => '雙重重定向頁',
 'doubleredirectstext' => 'Mî yit-hàng pâu-hàm to thi-yit lâu thi-ngi-ke chhûng-thin hong-mien ke lièn-chiap, yî-khi̍p thi-ngi ke chhûng-thin hong-mien ke thi-yit-hàng vùn-sṳ, thûng-sòng hién-sṳ ke he "chṳ̂n-chṳn" ke muk-phêu vùn-chông, ye-he thi-yit-ke chhûng-thin hong-mien  yin-kôi chṳ́-hiong ke vùn-chông.',
 
-'brokenredirects' => 'Sún-fái ke chhûng-thin hiong-hong',
+'brokenredirects' => '損壞嘅重定向頁',
 'brokenredirectstext' => 'Yî-ha ke chhûng-thin hiong-hong chṳ́-hiong-ke he mò chhùn-chhai ke hong-mien:',
-'brokenredirects-edit' => 'phiên-chho',
-'brokenredirects-delete' => 'Chhù-thet',
+'brokenredirects-edit' => '編寫',
+'brokenredirects-delete' => '刪除',
 
-'withoutinterwiki' => 'Mò-yû ngî-ngièn lièn-chiap ke vùn-chông',
-'withoutinterwiki-summary' => 'Yî-ha ke vùn-chông he hàn-mò ngî-ngièn lièn-chiap to khì-thâ ngî-ngièn pán-pún:',
+'withoutinterwiki' => '無有語言鏈接頁面',
+'withoutinterwiki-summary' => '下背嘅頁面還吂有語言鏈接到其它語言版本。',
 
-'fewestrevisions' => 'Chui-séu siù-chho ke vùn-chông',
+'fewestrevisions' => '最少修訂嘅頁面',
 
 # Miscellaneous special pages
-'nbytes' => '$1-vi ngièn-chû',
-'ncategories' => '$1-ke fûn-lui',
-'nlinks' => '$1-ke lièn-kiet',
-'nmembers' => '$1-ke sṳ̀n-yèn',
-'nrevisions' => '$1-ke siù-chho',
-'nviews' => '$1-chhṳ khon-kien',
-'specialpage-empty' => 'Pún hong-mien mò-yû nui-yùng .',
-'lonelypages' => 'Kû-yì vùn-chông',
+'nbytes' => '$1字節',
+'ncategories' => '$1隻分類',
+'nlinks' => '$1隻鏈接',
+'nmembers' => '$1隻成員',
+'nrevisions' => '$1隻修訂版本',
+'nviews' => '$1次瀏覽',
+'specialpage-empty' => '本報告無結果。',
+'lonelypages' => '孤立頁面',
 'lonelypagestext' => 'Yî-ha vùn-chông mò-yû lièn-kiet liá-ke wiki chûng ke khì-thâ vùn-chông.',
-'uncategorizedpages' => 'Thai fûn-lui vùn-chông',
-'uncategorizedcategories' => 'Thai fûn-lui lui-phe̍t',
+'uncategorizedpages' => '吂分類頁面',
+'uncategorizedcategories' => '吂歸類分類',
 'uncategorizedimages' => 'Thai fûn-lui thù-phién',
-'unusedcategories' => 'Hàn-mò sṳ́-yung ke fûn-lui',
-'unusedimages' => 'Hàn-mò sṳ́-yung thù-hìn',
-'popularpages' => 'Ngie̍t-tiám vùn-chông',
-'wantedcategories' => 'Sî-yeu ke fûn-lui',
-'wantedpages' => 'Thai-yeu hong-mien',
-'mostlinked' => 'Chui-tô lièn-kiet hong-mien',
-'mostlinkedcategories' => 'Chui-tô lièn-kiet fûn-lui',
-'mostcategories' => 'Chui-tô fûn-lui vùn-chông',
+'unusedcategories' => '吂用分類',
+'unusedimages' => '吂用圖片',
+'popularpages' => '熱點頁面',
+'wantedcategories' => '想愛嘅分類',
+'wantedpages' => '等寫頁面',
+'mostlinked' => '最多鏈接頁面',
+'mostlinkedcategories' => '最多鏈接分類',
+'mostcategories' => '最多分類頁面',
 'mostimages' => 'Chui-tô lièn-kiet thù-chhiong',
-'mostrevisions' => 'Chui-tô siû-thin vùn-chông',
-'prefixindex' => 'Chhièn-chhàng sok-yîn',
-'shortpages' => 'Tón vùn-chông',
-'longpages' => 'Chhòng vùn-chông',
-'deadendpages' => 'Thôn-lièn vùn-chông',
+'mostrevisions' => '最多修訂版本頁面',
+'prefixindex' => '全部有前綴嘅頁面',
+'shortpages' => '短頁面',
+'longpages' => '長頁面',
+'deadendpages' => '斷鏈頁面',
 'deadendpagestext' => 'Yî-ha vùn-chông mò-yû pûn lièn-kiet to liá-ke wiki chûng ke khì-thâ vùn-chông:',
-'protectedpages' => 'Pûn pó-fu ke vùn-chông',
-'protectedpagestext' => 'Yî-ha vùn-chông yí-kîn Pûn pó-fu yî fòng-chṳ́ yì-thung fe̍t-chá sîn-phiên',
-'protectedpagesempty' => 'Chhai liá-ke chhâm-su hâ mò-yû vùn-chông chang-chhai pó-fu.',
-'listusers' => 'Yung-fu lie̍t-péu',
-'newpages' => 'Chui-sîn ke vùn-chông',
-'newpages-username' => 'Yung-fu-miàng:',
-'ancientpages' => 'Chui-khiu ke hong-mien',
-'move' => 'Yì-thung',
-'movethispage' => 'Yì-thung pún-chông',
+'protectedpages' => '受保護頁面',
+'protectedpagestext' => '以下頁面已經受保護以防止移動或編寫',
+'protectedpagesempty' => '在邇兜參數下無頁面保護緊。',
+'listusers' => '用戶列表',
+'usercreated' => '$1 $2{{GENDER:$3|建立}}',
+'newpages' => '新頁面',
+'newpages-username' => '用戶名:',
+'ancientpages' => '最舊頁面',
+'move' => '移動',
+'movethispage' => '移動本頁',
 'unusedimagestext' => 'Chhiáng chu-yi khì-thâ mióng-chham khó-nèn chhṳ̍t-chiap theu-ko URL lièn-chiap thù-chhiong, só-yî liá-piên lie̍t-chhut ke thù-chhiong khó-nèn pûn-ngìn sṳ́-yung.',
-'unusedcategoriestext' => 'Sûi-yèn mò-yû pûn khì-thâ vùn-chông fe̍t-chá fûn-lui só chhái-yung, than lie̍t-péu chûng ke fûn-lui chông chhùn-chhai.',
-'notargettitle' => 'Mò muk-phêu',
-'notargettext' => 'Ngì hàn-mò chṳ́-thin yit-ke muk-phêu vùn-chông fe̍t-chá yung-fu chin-hàng chhṳ́-hong chhâu-chok.',
-'pager-newer-n' => 'sîn $1-chhṳ',
-'pager-older-n' => 'khiu $1-chhṳ',
+'unusedcategoriestext' => '雖然無分其他頁面或者分類所採用,毋過列表肚嘅分類頁依然存在。',
+'notargettitle' => '無目標',
+'notargettext' => '汝還吂指定一隻目標頁面或用戶來進行邇項操作。',
+'pager-newer-n' => '新$1次',
+'pager-older-n' => '舊$1次',
 
 # Book sources
-'booksources' => 'Chham-ngoi sû-ngièn',
-'booksources-search-legend' => 'Chhìm-cháu chham-ngoi sû-ngièn',
-'booksources-go' => 'Sung-chhut',
-'booksources-text' => 'Yî-ha he yit-fun sîn-sû fe̍t-chá ngi-sú-sû ke lie̍t-péu, pin khó-nèn yû ngì chang-hó chhìm-cháu ke sû ke chin-yit-phu sêu-sit:',
+'booksources' => '網絡書源',
+'booksources-search-legend' => '尋找網絡書源',
+'booksources-go' => '送出',
+'booksources-text' => '下背係一份銷售新書或二手書嘅列表,並可能有汝尋找緊嘅書嘅進一步信息:',
 
 # Special:Log
 'specialloguserlabel' => 'Yung-fu:',
 'speciallogtitlelabel' => 'Phêu-thì:',
-'log' => 'Ngit-ki',
+'log' => '日誌',
 'alllogstext' => 'Lièn-ha̍p hién-sṳ song-chhòn, chhù-chhiang, pó-fu, chhà-fûng yî-khi̍p chham-vu',
-'logempty' => 'Mò-yû siông-thùng ki-liu̍k.',
-'log-title-wildcard' => 'Chhà-chhìm liá-ke vùn-sṳ khôi-sṳ́ ke phêu-thì',
+'logempty' => '在日誌肚無匹配項。',
+'log-title-wildcard' => '搜尋以邇隻文字開頭嘅標題',
 
 # Special:AllPages
-'allpages' => 'Só-yû ke hong-mian',
-'alphaindexline' => '$1 to $2',
-'nextpage' => 'Hâ yit-chông ($1)',
-'prevpage' => 'Song yit-chông ($1)',
-'allpagesfrom' => 'Hién-sṳ chhiùng chhṳ́-chhu khôi-sṳ́ ke hong-mien:',
-'allpagesto' => 'Hién-sṳ chhiùng-chhṳ́ kiet-suk ke ya̍p:',
-'allarticles' => 'Só-yû ke vùn-chông',
-'allinnamespace' => 'Só-yû ke hong-mien (su̍k-yî $1 miàng-sṳ khûng-kiên)',
-'allnotinnamespace' => 'Só-yû ke hong-mien (put su̍k-yî $1 miàng-sṳ khûng-kiên)',
-'allpagesprev' => 'Chhièn',
-'allpagesnext' => 'Heu',
-'allpagessubmit' => 'Thì-kâu',
-'allpagesprefix' => 'Hién-sṳ khí--yû chhṳ́ miàng-sṳ khûng-kiên ke hong-mien:',
-'allpagesbadtitle' => 'Pûn-thin ke hong-mien phêu-thì he fî-fap ke, fe̍t-chá yung-khí yû yit-ke nui-phu ngî-ngièn fe̍t-he nui-phu wiki. Kí khó-nèn pâu-hàm yit-ke fe̍t kien-tô ke put-nèn yung chhai-yî phêu-thì ke sṳ-ngièn.',
+'allpages' => '全部頁面',
+'alphaindexline' => '$1$2',
+'nextpage' => '下一頁($1)',
+'prevpage' => '上一頁($1)',
+'allpagesfrom' => '顯示從邇處開始嘅頁面:',
+'allpagesto' => '顯示從邇位結束嘅頁面:',
+'allarticles' => '全部頁面',
+'allinnamespace' => '所有頁面(屬於$1名字空間)',
+'allnotinnamespace' => '所有頁面(毋屬於$1名字空間)',
+'allpagesprev' => '',
+'allpagesnext' => '',
+'allpagessubmit' => '提交',
+'allpagesprefix' => '顯示有邇前綴(名字空間)嘅頁面:',
+'allpagesbadtitle' => '分定嘅頁面標題係非法嘅,或者有一隻內部語言或內部wiki嘅前綴。其可能包含一隻或還較多毋做得用於標題嘅字符。',
 
 # Special:Categories
-'categories' => 'Hong-mien fûn-lui',
+'categories' => '分類',
 'categoriespagetext' => 'Yî-ha lie̍t-chhut só-yû ke hong-mien fûn-lui.
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
 # Special:LinkSearch
 'linksearch' => 'Ngoi-phu lièn-chiap',
-'linksearch-ok' => 'Chhìm-cháu',
+'linksearch-ok' => '搜尋',
+'linksearch-line' => '$1連自$2',
 
 # Special:ListUsers
-'listusersfrom' => 'Hién-sṳ yung-fu lie̍t-péu chhiùng:',
-'listusers-submit' => 'Hién-sṳ',
-'listusers-noresult' => 'Cháu put-to yung-fu.',
+'listusersfrom' => '顯示用戶列表從:',
+'listusers-submit' => '展示',
+'listusers-noresult' => '尋毋到用戶',
 
 # Special:ListGroupRights
-'listgrouprights-members' => '(sṳ̀n-yèn chhîn-tân)',
+'listgrouprights-members' => '(成員列表)',
 
 # Email user
-'mailnologin' => 'Mò email thi-tiám',
-'mailnologintext' => 'Ngì pit-sî siên [[Special:UserLogin|tên-ngi̍p]] pin-chhai [[Special:Preferences|chhâm-su sat-chṳ]] chûng yû yit-ke yû-háu ke e-mail thi-tiám chhòi-nèn email khì-thâ yung-fu.',
-'emailuser' => 'Email ke-yung-fu',
-'emailpage' => 'Email yung-fu',
+'mailnologin' => '無電郵地址',
+'mailnologintext' => '汝必須先[[Special:UserLogin|登入]]
+並在[[Special:Preferences|偏好設定]]
+肚有一隻有效嘅電郵地址正做得發郵件分其他用戶。',
+'emailuser' => '電郵聯繫邇隻用戶',
+'emailpage' => '電郵聯繫用戶',
 'emailpagetext' => 'Kó-yèn ke-yung-fu yí-kîn chhai chhâm-su sat-chṳ chông chûng sû-ngi̍p yû-háu ke e-mail thi-tiám, yî-ha ke péu-kak chiông-ki yit-ke sêu-sit pûn ke-yung-fu. Ngì chhai chhâm-su sat-chṳ chûng só sû-ngi̍p ke e-mail thi-tiám chiông chhut-hien chhai email "fat-khien-ngìn" yit-làn-chûng, liá-yong ke-yung-fu chhiu khó-yî fì-fu̍k.',
-'usermailererror' => 'Muk-phêu e-mail thi-tiám fán-fì chho-ngu:',
+'usermailererror' => '目標郵件地址轉頭差錯:',
 'defemailsubject' => '{{SITENAME}} Email',
-'noemailtitle' => 'Mò e-mail thi-tiám',
+'noemailtitle' => '電郵地址:',
 'noemailtext' => 'Ke-yung-fu hàn-mò chṳ́-thin yit-ke yû-háu ke e-mail thi-tiám, fe̍t-chá sién-chet put chiap-su chhṳ̀-lòi khì-thâ yung-fu ke e-mail.',
 'emailfrom' => 'Fat-khien-ngìn',
 'emailto' => 'Sû-khien-ngìn',
 'emailsubject' => 'Chú-thì',
-'emailmessage' => 'Sin-sit',
-'emailsend' => 'Fat-sung',
-'emailccme' => 'Chiông sêu-sit fat-sung yit-fun to ngô-ke email sin-siông.',
-'emailccsubject' => 'Chiông ngì-ke sêu-sit fu̍k-chṳ to $1: $2',
-'emailsent' => 'Email yí-kîn fat-sung',
-'emailsenttext' => 'Ngì-ke email yí-kîn fat-chhut.',
+'emailmessage' => '消息',
+'emailsend' => '發送',
+'emailccme' => '發送吾消息嘅一份副本到吾電郵信箱。',
+'emailccsubject' => '汝發送分$1嘅消息副本:$2',
+'emailsent' => '電子郵件已發送',
+'emailsenttext' => '汝嘅電子郵件已經發出。',
 
 # Watchlist
-'watchlist' => 'Kam-sṳ lie̍t-péu',
-'mywatchlist' => 'Ngài-ke kam-sṳ lie̍t-péu',
-'nowatchlist' => 'Ngì ke kam-sṳ lie̍t-péu he khûng-hî.',
-'watchlistanontext' => 'Chhiáng $1 yî kiám-sṳ fe̍t-chá phiên-chho ngì-ke kam-sṳ lie̍t-péu.',
-'watchnologin' => 'Hàn-mò tên-ngi̍p',
-'watchnologintext' => 'Ngì pit-sî siên [[Special:UserLogin|tên-ngi̍p]] chhòi-nèn kiên-kói ngì-ke kam-sṳ lie̍t-péu.',
+'watchlist' => '監視列表',
+'mywatchlist' => '監視列表',
+'watchlistfor2' => '$1嘅監視列表$2',
+'nowatchlist' => '汝嘅監視列表係空嘅。',
+'watchlistanontext' => '請$1來查看或編寫汝嘅監視列表。',
+'watchnologin' => '還吂登入',
+'watchnologintext' => '汝必須先[[Special:UserLogin|登入]],正做得更改汝嘅監視列表。',
 'addedwatchtext' => "Hong-mien \"[[:\$1]]\" yí-kîn pûn kâ-ngi̍p to ngì-ke [[Special:Watchlist|Kam-sṳ chhîn-tân]] chûng. Chiông-lòi yû-kôan chhṳ́ hong-mien khi̍p khì-thâ thó-lun-hong ke ngim-hò siû-cháng chiông-voi chhai hong-mien lie̍t-chhut, song-chhiá hàn-voi chhai [[Special:RecentChanges|Chui-khiûn ke kiên-kói]] chûng ke '''chhû-thí''' hìn-sṳt lie̍t-chhut. Kó-yèn  ngì heu-lòi sióng chhiùng hong-mien kam-sṳ chhîn-tân chûng chhîn-chhù, hí-khó tiám-kit thô-hòng thiàu-chûng \"thìn-chṳ́ kam-sṳ\" ke lièn-kiet。",
 'removedwatchtext' => 'Vùn-chông "[[:$1]]" yí-kîn chhiùng Ngì kekam-sṳ lie̍t-péu mien-chûng yì-chhù.',
-'watch' => 'Kam-sṳ',
-'watchthispage' => 'Kam-sṳ pún-chông',
-'unwatch' => 'Thìn-chṳ́ kam-sṳ',
-'unwatchthispage' => 'Thìn-chṳ́ kam-sṳ',
-'notanarticle' => 'Put-he vùn-chông',
-'watchnochange' => 'Chhai hién-sṳ ke sṳ̀-kiên thon-nui ngì só kam-sṳ ke vùn-chông mò-yû kiên-kói.',
-'watchlist-details' => 'Put pâu-hàm thó-lun-hong, ngì-ke kam-sṳ lie̍t-péu khiung-yû $1-hong.',
-'wlheader-enotif' => 'Yí-kîn khí-thung email thûng-tî kûng-nèn.',
-'wlheader-showupdated' => "Chhai ngì song-chhṳ kiám-sṳ heu yû pûn chhùng-siû ko ke vùn-chông chiông-voi hién-sṳ vi '''chhû-thí'''.",
-'watchmethod-recent' => 'Kiám-chhà pûn kam-sṳ hong-mien ke chui-khiûn phiên-cho',
-'watchmethod-list' => 'Kiám-chhà chui-khiûn phiên-cho ke pûn kam-sṳ hong-mien.',
-'watchlistcontains' => 'Ngì-ke kam-sṳ lie̍t-péu pâu-hàm $1-ke hong-mien.',
-'iteminvalidname' => "Hong-mien '$1' chho-ngu, mò-háu min-miàng...",
+'watch' => '監視',
+'watchthispage' => '監視本頁',
+'unwatch' => '取消監視',
+'unwatchthispage' => '停止監視',
+'notanarticle' => '毋係內容頁面',
+'watchnochange' => '在顯示嘅時間段內汝所監視嘅頁面無更改。',
+'watchlist-details' => '毋包含交流頁,汝嘅監視列表上有$1隻頁面。',
+'wlheader-enotif' => 'Yí-kîn khí-thung email thûng-tî kûng-nèn.',
+'wlheader-showupdated' => "Chhai ngì song-chhṳ kiám-sṳ heu yû pûn chhùng-siû ko ke vùn-chông chiông-voi hién-sṳ vi '''chhû-thí'''.",
+'watchmethod-recent' => '檢查分監視頁面嘅最近編寫',
+'watchmethod-list' => '檢查最近編寫嘅分監視頁面',
+'watchlistcontains' => '汝嘅監視列表包含$1隻頁面。',
+'iteminvalidname' => "頁面'$1'錯誤,無效命名...",
 'wlnote' => 'Yî-ha he chui-khiûn <b>$2</b> séu-sṳ̀ nui-ke chui-heu $1-chhṳ chin-siû.',
-'wlshowlast' => 'Hién-sṳ chui-khiûn $1 séu-sṳ̀ $2-thiên $3 ke chin-siû.',
-'watchlist-options' => 'Kam-sṳ lie̍t-péu sién-chet',
+'wlshowlast' => '展示最近$1隻鐘頭,$2日或$3嘅更改。',
+'watchlist-options' => '監視列表選項',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Chang-chhai kam-sṳ...',
-'unwatching' => 'Chang-chhai thìn-chṳ́ kam-sṳ',
-
-'enotif_mailer' => '{{SITENAME}} email thûng-tî-hi',
-'enotif_reset' => 'Chiông só-yû hong-mien phêu-vi yí-kîn thu̍k-ko.',
-'enotif_impersonal_salutation' => '{{SITENAME}} yung-fu',
-'enotif_lastvisited' => 'Kiám-sṳ ngì song-chhṳ fóng-mun heu ke só-yû kiên-kói chhián chhâm-siòng $1.',
-'enotif_lastdiff' => 'Kiám-chhà kiên-kói chhiáng chhâm-siòng $1.',
-'enotif_anon_editor' => 'ngia̍k-miàng yung-fu $1',
+'watching' => '監視中...',
+'unwatching' => '停止監視中...',
+'watcherrortext' => '更改“$1”嘅監視列表設定時出現差錯。',
+
+'enotif_mailer' => '{{SITENAME}}郵件通知器',
+'enotif_reset' => '標記所有頁面做已探訪',
+'enotif_impersonal_salutation' => '{{SITENAME}}用戶',
+'enotif_lastvisited' => '請參詳$1查看汝上次訪問後嘅所有更改。',
+'enotif_lastdiff' => '請參詳$1查看邇次更改。',
+'enotif_anon_editor' => '匿名用戶$1',
 'enotif_body' => 'Chhîn-oi ke $WATCHINGUSERNAME, $PAGEEDITOR yí-kîn chhai $PAGEEDITDATE $CHANGEDORCREATED{{SITENAME}} ke $PAGETITLE vùn-chông, chhiáng-to $PAGETITLE_URL kiám-sṳ siên-chhièn pán-pún.  $NEWPAGE phiên-si̍p chak-yeu: $PAGESUMMARY $PAGEMINOREDIT lièn-kiê chhṳ́ phiên-si̍p-chá: email: $PAGEEDITOR_EMAIL pún-chham: $PAGEEDITOR_WIKI chhai ngì fóng-mun chhṳ́-chông chṳ̂-chhièn, chiông-lòi ke kiên-kói vù-nèn hiong ngì thûng-tî. Ngì khó-yî chhûng-sat ngì só-yû kam-sṳ vùn-chông ke thûng-tî phêu-ki. {{SITENAME}} thûng-tî ne-thúng -- yeu kói-pien ngì-ke kam-sṳ lie̍t-péu sat-thin, chhiáng chhâm-siòng {{canonicalurl:{{#special:EditWatchlist}}}} chin-yit-phu ke pông-chhu: {{canonicalurl:{{MediaWiki:Helppage}}}}',
-'created' => 'Yí-kîn kien-li̍p',
-'changed' => 'siû-kói liáu',
+'created' => '建立矣',
+'changed' => '更改矣',
 
 # Delete
-'deletepage' => 'Chhù-thet hong-mien',
-'confirm' => 'Khok-ngin',
-'excontent' => 'Nui-yùng pún-lòi he: "$1"',
+'deletepage' => '刪除頁面',
+'confirm' => '確認',
+'excontent' => '內容係:“$1”',
 'excontentauthor' => 'Nui-yùng he: "$1" (song-chhiá vì-thu̍k kung-hien-chá he "$2")',
-'exbeforeblank' => 'Pûn chhîn-khûng chhièn ke nui-yùng he: "$1"',
-'exblank' => 'Vùn-chông he hî-khûng',
-'delete-legend' => 'Chhù-thet',
+'exbeforeblank' => '分清空前嘅內容係:“$1”',
+'exblank' => '頁面係空嘅',
+'delete-legend' => '刪除',
 'historywarning' => 'Kín-ko: Ngì chiông-yeu chhù-hi ke chông-nui hàm-yû li̍t-sṳ́:',
-'confirmdeletetext' => 'Ngì chiông-voi chhiùng chṳ̂-liau-khu chûng yún-yén chhù-thet yit-ke vùn-chông fe̍t-chá thù-chhiong yî-khi̍p li̍t-sṳ́. Chhiáng khok-thin ngì-yeu chin-hàng chhâu-chok, pin liáu-kié heu-kó, thùng-sṳ̀ ngì-ke hàng-vì fù-ha̍p [[{{MediaWiki:Policy-url}}]].',
-'actioncomplete' => 'Chhâu-chok vàn-sṳ̀n',
-'deletedtext' => '"$1" yí-kîn pûn chhù-thet. Chui-khiûn chhù-hi ke ki-liu̍k chhiáng chhâm-siòng $2.',
-'dellogpage' => 'Chhù-chhiang ki-liu̍k',
-'dellogpagetext' => 'Yî-ha he chui-khiûn chhù-thet ke ki-liu̍k lie̍t-péu.',
-'deletionlog' => 'Chhù-chhiang ki-liu̍k',
-'reverted' => 'Fî-fu̍k to  chó-khì pán-pún',
-'deletecomment' => 'Ngièn-yîn:',
-'deleteotherreason' => 'Khì-thâ/fu-kâ ke lî-yù:',
-'deletereasonotherlist' => 'Khì-thâ lî-yù',
+'confirmdeletetext' => '汝即將刪除一隻頁面或圖片撈其嘅歷史。
+請確定汝愛進行邇項操作,並且了解其嘅後果,同時汝嘅行為符合[[{{MediaWiki:Policy-url}}]]。',
+'actioncomplete' => '操作完成',
+'actionfailed' => '操作失敗',
+'deletedtext' => '“$1”已經分刪除。最近刪除嘅記錄請參見$2。',
+'dellogpage' => '刪除日誌',
+'dellogpagetext' => '下背係最近刪除嘅列表。',
+'deletionlog' => '刪除日誌',
+'reverted' => '恢復到早期版本',
+'deletecomment' => '理由:',
+'deleteotherreason' => '其它/附加理由:',
+'deletereasonotherlist' => '其它理由',
 
 # Rollback
-'rollback' => 'Fî-fu̍k',
-'rollback_short' => 'Fî-fu̍k',
-'rollbacklink' => 'fî-fu̍k',
-'rollbackfailed' => 'Mò-fap fî-fu̍k',
-'cantrollback' => 'Vù-fap fî-fu̍k phiên-cho; chui-heu ke kung-hien-chá he pún vùn-chông ke vì-thu̍k chok-chá.',
+'rollback' => '編寫倒轉頭',
+'rollback_short' => '倒轉頭',
+'rollbacklink' => '打轉頭',
+'rollbackfailed' => '無法倒轉頭',
+'cantrollback' => '編寫無法打轉頭;最後嘅貢獻者人本文嘅唯一作者。',
 'alreadyrolled' => 'Mò-fap fî-fu̍k yù [[User:$2|$2]] ([[User talk:$2|thó-lun]]) chin-hàng ke [[$1]] ke chui-heu phiên-si̍p; khì-thâ ngìn yí-kîn phiên-siá fe̍t-he fî-fu̍k liáu ke-hong. Chui-heu phiên-si̍p-chá: [[User:$3|$3]] ([[User talk:$3|Thó-lun]])。',
 'editcomment' => "Phiên-siá sot-mìn he: \"''\$1''\"。",
 'revertpage' => 'Fî-fu̍k yù [[Special:Contributions/$2|$2]] ([[User talk:$2|tui-fa]]) ke phiên-cho; kiên-kói fì-fu̍k [[User:$1|$1]] ke chui-heu yit-ke pán-pún',
 
 # Edit tokens
-'sessionfailure' => 'Ngì-ke tên-ngi̍p sṳ-fû yû mun-thì, vi-liáu fòng-chṳ́ sêu-sit pûn làn-chiet, pún-chhṳ chhâu-chok yí-kîn chhí-sêu, chhiáng-on "song-yit-chông" chhùng-sîn chai-ngi̍p.',
+'sessionfailure' => '汝嘅登入會話好像有問題;
+為到防止會話劫持,邇次操作已經畀取消。
+請轉到先前嘅頁面,重新載入邇頁面,然後重試。',
 
 # Protect
-'protectlogpage' => 'Pó-fu ngit-ki',
+'protectlogpage' => '保護日誌',
 'protectlogtext' => 'Ha-mien he vùn-chông só-thin lâu chhí-sêu só-thin ke lie̍t-péu. Chhiáng chhâm-kháu [[Special:ProtectedPages|Pó-fu vùn-chông chhîn-tân]] yî-khi̍p kiám-sṳ tông-chhièn chin-hàng ke vùn-chông pó-fu.',
-'protectedarticle' => 'Yí-kîn pó-fu "[[$1]]"',
-'modifiedarticleprotection' => 'yí-kîn kiên-kói "[[$1]]" ke pó-fu tén-kip',
+'protectedarticle' => '已保護“[[$1]]”',
+'modifiedarticleprotection' => '已經更改“[[$1]]”嘅保護等級',
 'unprotectedarticle' => 'yí-kîn kié-chhù pó-fu "[[$1]]"',
 'protect-title' => 'Chang-chhai pó-fu "$1"',
 'prot_1movedto2' => '[[$1]] yì-thung to [[$2]]',
@@ -1127,7 +1407,7 @@ Yî-ha he '''$1''' hien-sṳ̀ ke pó-fu khi̍p-phe̍t:",
 'protect-summary-cascade' => 'Lièn-só',
 'protect-expiring' => 'Chûng-chṳ́ chhai-yî $1 (UTC)',
 'protect-cascade' => 'Lièn-só pó-fu - pún-chông pâu-hàm ke só-yû hong-mien kiûn yit-phîn pó-fu.',
-'protect-cantedit' => 'Ngì mò-fap kiên-kói liá-ya̍p ke pó-fu tén-kip, yîn-vi ngì mò khièn-han phiên-sip kì.',
+'protect-cantedit' => '汝無法更改邇隻頁面嘅保護等級,因為汝無權限去編寫其。',
 'protect-expiry-options' => '1 séu-sṳ̀:1 hour, 1 thiên:1 day,1 chû:1 week,2 chû:2 weeks,1-ke ngie̍t:1 month,3-ke ngie̍t:3 months,6-ke ngie̍t:6 months,1-ngièn:1 year, yún-kiú:infinite',
 'restriction-type' => 'Khièn-han:',
 'restriction-level' => 'Han-chṳ khi̍p-phe̍t:',
@@ -1136,7 +1416,7 @@ Yî-ha he '''$1''' hien-sṳ̀ ke pó-fu khi̍p-phe̍t:",
 'pagesize' => '(Vi-ngièn-chû)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'Phiên-siá',
+'restriction-edit' => '編寫',
 'restriction-move' => 'Yì-thung',
 'restriction-create' => 'Tshóng-kien',
 
@@ -1159,7 +1439,8 @@ Pûn chhù-thet chhièn ke só-yû siû-thin pán-pún, lièn-thùng chhù-thet
 'undelete-revision' => 'Chhù-thet pán-pún $1 chhṳ $2:',
 'undeleterevision-missing' => 'Chhṳ́ pán-pún ke nui-yùng put chṳn-khok fe̍t-chá yí-kîn yì-sṳt. Khó-nèn lièn-kiet chho-ngu, pûn yì-chhù fe̍t-he yí-kîn pûn fî-fu̍k.',
 'undeletebtn' => 'Fî-fu̍k',
-'undeletelink' => 'kiám-sṳ/fî-fu̍k',
+'undeletelink' => '查看/恢復',
+'undeleteviewlink' => '查看',
 'undeletereset' => 'Chhùng-sat',
 'undeletecomment' => 'Ngièn-yîn:',
 'undeletedrevisions' => '$1-ke siû-thin pán-pún yí-kîn fî-fu̍k',
@@ -1176,46 +1457,50 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 'undelete-no-results' => 'Chhù-thet ki-liu̍k lî mò-yû fù-ha̍p ke kiet-kó.',
 
 # Namespace form on various pages
-'namespace' => 'Miàng-sṳ khûng-kiên:',
-'invert' => 'Fán-hiong sién-chet',
-'blanknamespace' => '(Chú)',
+'namespace' => '名字空間:',
+'invert' => '反向選擇',
+'blanknamespace' => '(主要)',
 
 # Contributions
-'contributions' => 'Yung-fu kung-hien',
-'contributions-title' => '$1-ke yung-fu kung-hien',
-'mycontris' => 'Ngài-ke phiên-siû ki-liu̍k',
-'contribsub2' => '$1 ($2) ke kung-hien',
-'nocontribs' => 'Mò-yû chhìm-cháu to fù-ha̍p thi̍t-chṳ̂n ke kiên-kói.',
-'uctop' => '(Chui-sîn siû-thin)',
-'month' => 'Chhiùng liá-ke ngie̍t-fun (fe̍t-he kien-chó):',
-'year' => 'Chhiùng liá-ke ngièn-fun (fe̍t-he kien-chó):',
-
-'sp-contributions-newbies' => 'Chak hién-sṳ sîn kien-li̍p chṳ̂ yung-fu ke kung-hien',
-'sp-contributions-newbies-sub' => 'Sîn-sú',
-'sp-contributions-blocklog' => 'Fûng-kim ki-liu̍k',
-'sp-contributions-talk' => 'Tui-fa',
+'contributions' => '{{GENDER:$1|用戶}}貢獻',
+'contributions-title' => '$1嘅用戶貢獻',
+'mycontris' => '貢獻',
+'contribsub2' => '$1嘅貢獻($2)',
+'nocontribs' => '毋尋到符合特徵嘅更改。',
+'uctop' => '(最新修改)',
+'month' => '從邇月(或還較早):',
+'year' => '從邇年(或還較早):',
+
+'sp-contributions-newbies' => '單淨展示新建用戶嘅貢獻',
+'sp-contributions-newbies-sub' => '新手',
+'sp-contributions-blocklog' => '封禁日誌',
+'sp-contributions-uploads' => '上傳',
+'sp-contributions-logs' => '日誌',
+'sp-contributions-talk' => '交流',
 'sp-contributions-userrights' => 'Yung-fu khièn-han kón-lî',
-'sp-contributions-search' => 'Chhìm-cháu kung-hien ki-liu̍k',
-'sp-contributions-username' => 'IP chhô-vi fe̍t-chá yung-fu miàng-chhṳ̂n:',
-'sp-contributions-submit' => 'Chhìm-cháu',
+'sp-contributions-search' => '搜尋貢獻記錄',
+'sp-contributions-username' => 'IP地址或用戶名:',
+'sp-contributions-toponly' => '單淨展示最新修訂版本嘅編寫',
+'sp-contributions-submit' => '搜尋',
 
 # What links here
-'whatlinkshere' => 'Lièn-ngi̍p to liá-chham',
-'whatlinkshere-title' => 'Lièn-chiap to "$1" ke ya̍p',
-'whatlinkshere-page' => 'Vùn-chông:',
-'linkshere' => 'Yî-ha vùn-chông lièn-kiet to [[:$1]]:',
-'nolinkshere' => 'Mò-yû vùn-chông lièn-kiet to [[:$1]].',
+'whatlinkshere' => '鏈接入頁面',
+'whatlinkshere-title' => '鏈接到“$1”嘅頁面',
+'whatlinkshere-page' => '頁面:',
+'linkshere' => '下背頁面鏈接到[[:$1]]:',
+'nolinkshere' => "無頁面鏈接到'''[[:$1]]'''。",
 'nolinkshere-ns' => 'Chhai só-sién ke miàng-sṳ khûng-kiên nui  mò-yû vùn-chông lièn-kiet to[[:$1]].',
-'isredirect' => 'chhùng-thin vùn-chông',
-'istemplate' => 'pâu-hàm',
-'isimage' => 'tóng-on lièn-kiet',
-'whatlinkshere-prev' => 'Chhièn $1-ke',
-'whatlinkshere-next' => 'Heu $1-ke',
-'whatlinkshere-links' => '← lièn-ngi̍p',
-'whatlinkshere-hideredirs' => '$1 chhûng-thin-hiong',
-'whatlinkshere-hidetrans' => '$1 pâu-hàm',
-'whatlinkshere-hidelinks' => '$1 lièn-kiet',
-'whatlinkshere-filters' => 'Ko-li-khí',
+'isredirect' => '重定向頁',
+'istemplate' => '包含',
+'isimage' => '文件鏈接',
+'whatlinkshere-prev' => '前頭$1隻',
+'whatlinkshere-next' => '後背$1隻',
+'whatlinkshere-links' => '←連入',
+'whatlinkshere-hideredirs' => '$1重定向',
+'whatlinkshere-hidetrans' => '$1包含',
+'whatlinkshere-hidelinks' => '$1鏈接',
+'whatlinkshere-hideimages' => '$1條文件鏈接',
+'whatlinkshere-filters' => '過濾器',
 
 # Block/unblock
 'blockip' => 'chhà-fûng IP thi-tiám',
@@ -1235,8 +1520,8 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 'ipbcreateaccount' => 'Chú-chṳ́ chhóng-li̍p sîn chong-ho',
 'ipbenableautoblock' => 'Chhṳ-thung chhà-fûng ke-yung-fu sṳ́-yung-ko ke IP thi-tiám',
 'ipbsubmit' => 'Chhà-fûng ke-yung-fu',
-'ipbother' => 'Khì-thâ sṳ̀-kiên:',
-'ipboptions' => '2 séu-sṳ̀:2 hours,1 thiên:1 day,3 thiên:3 days,1 chû:1 week,2 chû:2 weeks,1-ke ngie̍t:1 month,3-ke ngie̍t:3 months,6-ke ngie̍t:6 months,1 ngièn:1 year,yún-kiú:infinite',
+'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',
 'ipbotheroption' => 'khì-thâ',
 'ipbotherreason' => 'Khì-thâ lî-yù:',
 'ipbhidename' => 'Chhai chhà-fûng ngit-ki, fa̍t-chhiok chhà-fûng lie̍t-péu yî-khi̍p yung-fu lie̍t-péu chûng yún-chhòng yung-fu-miàng.',
@@ -1250,9 +1535,9 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 'unblockip' => 'Kié-chhù kim-fûng IP thi-tiám',
 'unblockiptext' => 'Yung ha-mien ke péu-tân lòi fî-fu̍k siên-chhièn pûn kim-fûng ke IP thi-tiám ke siá-sû-khièn.',
 'ipusubmit' => 'Kié-chhù kim-fûng',
-'unblocked' => '[[User:$1|$1]]-ke fûng-kim yí-kîn kié-chhù',
+'unblocked' => '[[User:$1|$1]]已經分解封。',
 'unblocked-id' => 'Fûng-kim $1 yí-kîn pûn yì-chhù',
-'ipblocklist' => 'Pûn fûng IP thi-tiám lie̍t-péu',
+'ipblocklist' => '分封用戶列表',
 'ipblocklist-submit' => 'Chhìm-cháu',
 'infiniteblock' => 'yún-kiú',
 'expiringblock' => '$1 $2 to-khì',
@@ -1261,20 +1546,20 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 'createaccountblock' => 'Kim-chṳ́ chhóng-kien chong-ho',
 'ipblocklist-empty' => 'Chhà-fûng lie̍t-péu he khûng-hî.',
 'ipblocklist-no-results' => 'Só yêu-khiù ke IP thi-tiám/yung-fu-miàng mò-yû pûn chhà-fûng.',
-'blocklink' => 'Kim-fûng',
-'unblocklink' => 'kié-chhù kim-fûng',
-'change-blocklink' => 'kiên-kói fûng-kim',
-'contribslink' => 'Kung-hien',
+'blocklink' => '查封',
+'unblocklink' => '解封',
+'change-blocklink' => '更改封禁',
+'contribslink' => '貢獻',
 'autoblocker' => 'Ngì-ke IP lâu pûn fûng-liáu ke "$1" he yit-yong ke. Fûng-só ngièn-yîn: "$2".',
-'blocklogpage' => 'Fûng-só ki-liu̍k',
-'blocklogentry' => '"[[$1]]" yí-kîn pûn chhà-fûng $3, chûng-chṳ́ sṳ̀-kiên he $2',
+'blocklogpage' => '查封日誌',
+'blocklogentry' => '封禁[[$1]],到期時間係$2$3',
 'blocklogtext' => 'Liá-he kôan-yî yung-fu fûng-kim lâu kié-chhù fûng-kim chhâu-chok ke ki-liu̍k. Pûn chhṳ-thung fûng-kim ke IP thi-tiám mò-yû lie̍t-chhut. Chhiáng chhâm-kháu [[Special:BlockList|Pûn chhà-fûng ke IP thi-tiám lâu yung-fu lie̍t-péu]].',
-'unblocklogentry' => '"$1" yí-kîn pûn kié-fûng',
+'unblocklogentry' => '$1已分解封',
 'block-log-flags-anononly' => 'Han-chṳ ngia̍k-miàng ke yung-fu',
-'block-log-flags-nocreate' => 'Kim-chṳ́ chhṳ́ IP/Yung-fu kien-li̍p sîn chong-fu',
+'block-log-flags-nocreate' => '帳號建立已禁',
 'block-log-flags-noautoblock' => 'Thìn-chṳ́ yung chhṳ-thung fûng-kim',
 'range_block_disabled' => 'Chṳ́-yû kón-lî-yèn chhòi-nèn kien-chho kim-chṳ́ chhà-fûng ke fam-vì.',
-'ipb_expiry_invalid' => 'Mò-háu ke chûng-chṳ́ sṳ̀-kiên.',
+'ipb_expiry_invalid' => '無效嘅終止時間。',
 'ipb_already_blocked' => 'Yí-kîn fûng-só "$1"',
 'ipb_cant_unblock' => 'Chho-ngu: Mò-yû fat-hien Block ID $1. Ke-IP khó-nèn yí-kîn pûn kié-fûng.',
 'ip_range_invalid' => 'Mò-háu ke IP fam-vì.',
@@ -1285,8 +1570,8 @@ Chhiáng chhâm-kháu [[Special:Log/delete|chhù-hi ngit-ki]] lòi chhà-chhut c
 'sorbs_create_account_reason' => 'Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí. Só-yî ngì mò-fap kien-li̍p chong-ho.',
 
 # Developer tools
-'lockdb' => 'Kim-chṳ́ kiên-kói chṳ̂-liau-khu',
-'unlockdb' => 'Khôi-fong kiên-kói chṳ̂-liau-khu',
+'lockdb' => '鎖定數據庫',
+'unlockdb' => '開數據庫鎖',
 'lockdbtext' => 'Só-he̍t chṳ̂-liau-khu chiông-voi kim-chṳ́ só-yû yung-fu chin-hàng phiên-siá vùn-chông, kiên-kói chhâm-su, phiên-cho kam-sṳ lie̍t-péu yî-khi̍p khì-thâ sî-yeu kiên-kói chṳ̂-liau-khu ke chhâu-chok. Chhiáng khok-ngin ngì-ke kiet-thin, pin pó-chṳn ngì-chhai vì-fu kûng-chok kiet-suk heu chiông-voi chhùng-sîn khôi-fong chṳ̂-liau-khu.',
 'unlockdbtext' => 'Khôi-fong chṳ̂-liau-khu chiông-voi fî-fu̍k só-yû yung-fu chin-hàng phiên-siá vùn-chông, siû-thin chhâm-su, phiên-siá kam-sṳ lie̍t-péu yî-khi̍p khì-thâ sî-yeu kiên-kói chṳ̂-liau-khu ke chhâu-chok. Chhiáng khok-ngin ngì-ke kiet-thin.',
 'lockconfirm' => 'Chṳ̂n-ke, Ngô khok-sṳ̍t chhin-sióng fûng-só chṳ̂-liau-khu.',
@@ -1323,152 +1608,155 @@ chhiáng chhai hàng-thung chṳ̂-chhièn siên liáu-kié khì-thâ khó-nèn
 'movearticle' => 'Yì-thung vùn-chông',
 'movenologin' => 'Hàn-mò tên-ngi̍p',
 'movenologintext' => 'Ngì pit-sî he yit-miàng tên-ki yung-fu pin-chhiâ [[Special:UserLogin|tên-ngi̍p]] heu chhòi-nèn Yì-thung yit-ke vùn-chông.',
-'newtitle' => 'Sîn phêu-thì',
+'newtitle' => '新標題:',
 'move-watch' => 'Kam-sṳ chhṳ́-chông',
 'movepagebtn' => 'Yì-thung vùn-chông',
 'pagemovedsub' => 'Yì-thung sṳ̀n-kûng',
 'movepage-moved' => '\'\'\'"$1" yí-kîn pûn yì-thung to "$2"\'\'\'',
 'articleexists' => 'Ke miàng-sṳ ke hong-mien yí-kîn chhùn-chhai, fe̍t-chá ngì sién-chet ke miàng-sṳ mò-háu. Chhiáng chai-hi sién yit-ke miàng-sṳ.',
-'talkexists' => "'''Hong-mien pún-sṳ̂n yì-thung sṳ̀n-kûng, than-he yù-yî sîn phêu-thì hâ yí-kîn yû tui-fa-hong chhùn-chhai, só-yî tui-fa-hong vù-fap yì-thung. Chhiáng sú-kûng ha̍p-phîn lióng-ke hong-mien'''.",
+'talkexists' => '頁面本身移動成功,參過由於新標題下已經有交流頁存在,故所對話交流頁無法移動。請手工合併兩隻頁面。',
 'movedto' => 'yì-thung to',
 'movetalk' => 'Chhiáng thùng-sṳ̀ yì-thung tui-fa-chông',
-'movelogpage' => 'Yì-thung ngit-ki',
+'movelogpage' => '移動日誌',
 'movelogpagetext' => 'Yî-ha he yí-kîn yì-thung ke vùn-chông chhîn-tân.',
 'movereason' => 'Ngièn-yîn:',
-'revertmove' => 'fî-fu̍k ke-yì-thung',
+'revertmove' => '恢復',
 'delete_and_move' => 'Chhù-chhîn lâu yì-thung',
 'delete_and_move_text' => '==Sî-yeu chhù-thet==
 
 Muk-phêu vùn-chông "[[:$1]]" yí-kîn chhùn-chhai.
 Ngì khok-ngin sî-yeu chhù-thet ngièn hong-mien khi̍p chin-hàng yì-thung mâ?',
-'delete_and_move_confirm' => 'Chhie̍t-tui, chhù-thet chhṳ́ hong-mien',
+'delete_and_move_confirm' => '著,刪除邇頁',
 'delete_and_move_reason' => 'Chhù-thet yî-phien yì-thung',
 'selfmove' => 'Ngièn-sṳ́ phêu-thì khi̍p muk-phêu phêu-thì siông-thùng, vù-nèn yì-thung yit-chông fu̍k-koi pún-sṳ̂n.',
 
 # Export
-'export' => 'Thô-chhut vùn-chông',
-'exporttext' => 'Ngì khó-yî chiông thi̍t-thin vùn-chông fe̍t-he yit-chû vùn-chông ke vùn-pún yî-khi̍p phiên-cho li̍t-sṳ́ yung XML kak-sṳt thô-chhut;
-liá-yong khó-yî chiông yû-kôan vùn-chông theu-ko "[[Special:Import|Thô-chhut vùn-chông]]" hong-mien thô-chhut to nang-ngoi yit-ke yun-hàng MediaWiki ke mióng-chham.
+'export' => '導出頁面',
+'exporttext' => '汝做得將特定頁面或一組頁面嘅文字以及編輯歷史用XML格式導出;恁樣做得將有關頁面通過「[[Special:Import|導入頁面]]」頁面導入到另一隻執行MediaWiki嘅網站。
 
-Yeu thô-chhut vùn-chông, chhiáng chhai ha-mien ke vùn-sṳ-khiông chûng sû-ngi̍p vùn-chông phêu-thì, mî-hàng yit-ke phêu-thì, pin sién-chet ngì he-feu sî-yeu thô-chhut tai-yû vùn-chông li̍t-sṳ́ yî-chhièn ke pán-pún, fe̍t-he chak sién-chet thô-chhut tai-yû chui-heu yit-chhṳ phiên-cho sêu-sit ke tông-chhièn pán-pún.
+愛導出頁面,請在下背嘅文字框肚輸入頁面標題,每行一隻標題,並選擇汝係毋係愛匯出帶有頁面歷史嘅以前嘅修訂版本,或係單淨選擇導出帶有最後一次編寫信息嘅當前修訂版本。
 
-Nang-ngoi ngì hí-khó li-yung lièn-kiet thô-chhut tóng-on, yì-yi ngì hí-khó sṳ́-yung [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] thô-chhut [[{{MediaWiki:Mainpage}}]] vùn-chông.',
-'exportcuronly' => 'Chak thô-chhut tông-chhièn pán-pún, put pâu-hàm vàn-cháng ke li̍t-sṳ́ pán-pún.',
+另外汝還可以利用鏈接導出文件,例如汝做得使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]導出「[[{{MediaWiki:Mainpage}}]]」頁面。',
+'exportcuronly' => '單淨導出當前版本,毋包含完整歷史版本',
 'exportnohistory' => "----
-'''Chu-yi:''' Chhut-yì sin-nèn ngièn-yîn, chhiùng-chhṳ péu-tân thô-chhut vùn-chông ke chhiòn-phu li̍t-sṳ́ yí-kîn pûn thìn yung.",
-'export-submit' => 'Thô-chhut',
+'''注意:''' 由於性能原因,從本表單導出頁面嘅全部歷史已分停用。",
+'export-submit' => '導出',
 'export-addcattext' => 'Chhai fûn-lui chûng kâ-ngi̍p vùn-chông:',
 'export-addcat' => 'Kâ-ngi̍p',
 
 # Namespace 8 related
 'allmessages' => 'Ne-thúng kie-mien',
-'allmessagesname' => 'Miàng-chhṳ̂n',
-'allmessagesdefault' => 'Yi-sat ke vùn-sṳ',
+'allmessagesname' => '',
+'allmessagesdefault' => '默認信息文字',
 'allmessagescurrent' => 'Tông-chhièn ke vùn-sṳ',
 'allmessagestext' => 'Liá-piên lie̍t-chhut só-yû hí-khó thin-chṳ ke ne-thúng kie-mien.
 Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
 'allmessagesnotsupportedDB' => 'Ne-thúng kie-mien kûng-yung chhu-yî kôan-pit chong-thai (wgUseDatabaseMessages)。',
 
 # Thumbnails
-'thumbnail-more' => 'Fong-thai',
+'thumbnail-more' => '放大',
 'filemissing' => 'Mò-fap cháu-to tóng-on',
-'thumbnail_error' => 'Chhóng-kien suk-thù chho-ngu: $1',
-'djvu_page_error' => 'DjVu hong-mien chhêu-chhut fam-vì',
+'thumbnail_error' => '建立縮略圖差錯:$1',
+'djvu_page_error' => 'DjVu頁面超出範圍',
 'djvu_no_xml' => 'Mò-fap chhai DjVu tóng-on chûng chên-chhí XML',
 'thumbnail_invalid_params' => 'Put chṳn-khok ke suk-thù chhâm-su',
 'thumbnail_dest_directory' => 'Vù-fap kien-li̍p muk-phêu muk-liu̍k',
 
 # Special:Import
-'import' => 'Thô-ngi̍p vùn-chông',
-'importinterwiki' => 'Khiam vì-kî thô-ngi̍p',
-'import-interwiki-text' => 'Sién-chet yit-ke wiki lâu vùn-chông phêu-thì chin-hàng thô-ngi̍p. Siû-thin ngit-khì lâu phiên-cho-chá miàng-sṳ chiông thùng-sṳ̀ pûn tú-chhùn. Só-yû ke Khiam-wiki thô-ngi̍p chhâu-chok pûn ki-liu̍k chhai [[Special:Log/import|Thô-ngi̍p ngit-ki]].',
+'import' => '導入頁面',
+'importinterwiki' => '跨wiki導入',
+'import-interwiki-text' => '選擇一隻wiki撈頁面標題進行導入。
+修訂日期與編寫人嘅名會分保存。
+所有嘅跨wiki導入操作分記錄在[[Special:Log/import|導入日誌]]肚。',
 'import-interwiki-history' => 'Fuk-chṳ chhṳ́-chông ke só-yû li̍t-sṳ́ pán-pún',
-'import-interwiki-submit' => 'Thô-ngi̍p',
+'import-interwiki-submit' => '導入',
 'import-interwiki-namespace' => 'Chiông vùn-chông chón-yì to miàng-sṳ khûng-kiên:',
 'importtext' => 'Chhiáng sṳ́-yung Special:Export kûng-nèn chhiùng-ngièn wiki thô-chhuttóng-on, tú-chhùn to ngì ke-phién pin song-chhòn to liá-piên.',
-'importstart' => 'Chang-chhai thô-ngi̍p vùn-chông...',
+'importstart' => '頁面導入中……',
 'import-revision-count' => '$1-ke siû-thin',
-'importnopages' => 'Mò-yû thô-ngi̍p ke vùn-chông.',
-'importfailed' => 'Thô-ngi̍p sṳt-phai: $1',
-'importunknownsource' => 'Vù-tî ke thô-ngi̍p ngièn lui-hìn',
-'importcantopen' => 'Mò-fap tá-khôi thô-ngi̍p tóng-on',
+'importnopages' => '無導入嘅頁面。',
+'importfailed' => '導入失敗: <nowiki>$1</nowiki>',
+'importunknownsource' => '還吂知嘅源導入類型',
+'importcantopen' => '無法打開導入文件',
 'importbadinterwiki' => 'Sún-fái ke nui-phu wiki lièn-kiet',
 'importnotext' => 'khûng fe̍t-he mò vùn-sṳ',
 'importsuccess' => 'Thô-ngi̍p sṳ̀n-kûng!',
-'importhistoryconflict' => 'Chhùn-chhai chhûng-thu̍t ke siû-thin li̍t-sṳ́ (khó-nèn chhai chṳ̂-chhièn yí-kîn thô-ngi̍p-ko chhṳ́vùn-chông)',
-'importnosources' => 'Khiam-wiki thô-ngi̍p ngièn mò-yû thin-ngi, thùng-sṳ̀ put yún-chún chhṳ̍t-chiap ke  li̍t-sṳ́ song-chhòn.',
-'importnofile' => 'Mò-yû song-chhòn thô-ngi̍p tóng-on.',
+'importhistoryconflict' => '存在衝突嘅修訂歷史(可能在之前已經導入過本頁面)',
+'importnosources' => '跨Wiki導入源無定義,同時毋允許直接嘅歷史上傳。',
+'importnofile' => '無上傳導入文件。',
 
 # Import log
-'importlogpage' => 'Thô-ngi̍p ngit-ki',
-'importlogpagetext' => 'Kón-lî-yèn chhiùng khì-thâ mióng-chham thô-ngi̍p ke tai-yû phiên-cho li̍t-sṳ́ ke vùn-chông.',
+'importlogpage' => '導入日誌',
+'importlogpagetext' => '管理性導入在其他Wiki上有編寫歷史嘅頁面',
 'import-logentry-upload' => 'Theu-ko tóng-on sông-chhòn thô-ngi̍p ke $1',
 'import-logentry-upload-detail' => '$1-ke siû-thin',
 'import-logentry-interwiki' => 'Khiam-wiki $1',
 'import-logentry-interwiki-detail' => 'Lòi-chhṳ $2-ke $1-ke siû-thin',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ngài-ke yung-fu-ya̍p',
+'tooltip-pt-userpage' => '汝嘅用戶頁面',
 'tooltip-pt-anonuserpage' => 'Ngì-ke phiên-siá pún-chham só yung IP ke tui-yin yung-fu-chông',
-'tooltip-pt-mytalk' => 'Ngài-ke tui-fa-ya̍p',
+'tooltip-pt-mytalk' => '汝嘅交流頁',
 'tooltip-pt-anontalk' => 'Tui-yî lòi-chhṳ chhṳ́IP thi-tiám phiên-siá ke tui-fa',
-'tooltip-pt-preferences' => 'Ngô-ke chhâm-su sat-chṳ',
-'tooltip-pt-watchlist' => 'Ngô-ke kam-sṳ lie̍t-péu',
-'tooltip-pt-mycontris' => 'Ngài-ke kung-hien lie̍t-péu',
-'tooltip-pt-login' => 'Kien-ngi ngì tên-ki, than-he pin-fî pit-sî.',
+'tooltip-pt-preferences' => '汝嘅偏好設定',
+'tooltip-pt-watchlist' => '汝監視中頁面嘅更改列表',
+'tooltip-pt-mycontris' => '汝嘅貢獻列表',
+'tooltip-pt-login' => '建議汝登入,但係並非必須嘅',
 'tooltip-pt-anonlogin' => 'Kien-ngi ngì tên-ki, than-he pin-fî pit-sî.',
-'tooltip-pt-logout' => 'Tên-chhut',
-'tooltip-ca-talk' => 'Kôan-yî thiàu-muk chang-vùn ke thó-lun',
-'tooltip-ca-edit' => 'Ngì khó-yî phiên-siá chhṳ́-chông, chhiáng chhai pó-chhùn chṳ̂-chhièn siên yi-liau yit-ha-é.',
-'tooltip-ca-addsection' => 'Chhai-yî pún thó-lun chông chen-kâ sîn-ke thó-lun chú-thì',
-'tooltip-ca-viewsource' => 'Ke-vùn-chông yí-kîn pûn pó-fu. Ngì khó-yî chhà-kháu ke-chông ngièn-sṳ́ me̍t.',
-'tooltip-ca-history' => 'Pún vùn-chông ke chó-chhièn pán-pún.',
-'tooltip-ca-protect' => 'Pó-fu ke-vùn-chông',
-'tooltip-ca-delete' => 'Chhù-hi pún-chông',
+'tooltip-pt-logout' => '登出',
+'tooltip-ca-talk' => '關於頁面正文嘅討論',
+'tooltip-ca-edit' => '汝做得編寫邇頁,請在保存前用預覽撳掣。',
+'tooltip-ca-addsection' => '開始一隻新段落',
+'tooltip-ca-viewsource' => '本頁面受到保護。
+汝做得查看其嘅源碼。',
+'tooltip-ca-history' => '本頁面早先嘅修訂版本',
+'tooltip-ca-protect' => '保護邇頁',
+'tooltip-ca-delete' => '刪除邇頁',
 'tooltip-ca-undelete' => 'Chiông liá-ke vùn-chông fî-fu̍k to pûn chhù-hi yî-chhièn ke chhong-khóng',
-'tooltip-ca-move' => 'Yì-thung pún-chông',
-'tooltip-ca-watch' => 'Chiông chhṳ́ vùn-chông kâ-ngi̍p kam-sṳ lie̍t-péu',
-'tooltip-ca-unwatch' => 'Chiông chhṳ́ vùn-chông chhiùng kam-sṳ lie̍t-péu chûng yì-chhù',
-'tooltip-search' => 'Chhìm-cháu {{SITENAME}}',
-'tooltip-search-go' => 'Van-yit yû siông-thùng ke phêu-thì chhùn-chhai, tshṳ̍t-tsiap chhièn-vông liá-ya̍p',
-'tooltip-search-fulltext' => 'Sêu-chhà liá vùn-sṳ ke ya̍p',
-'tooltip-p-logo' => 'Thèu-chông',
-'tooltip-n-mainpage' => 'Fóng-mun Thèu Ya̍p',
-'tooltip-n-mainpage-description' => 'Fóng-mun Thèu Ya̍p',
-'tooltip-n-portal' => 'Kôan-yî pún kie-va̍k, ngì khó-yî cho-mak-ke, yin-kôi hó-mò cho.',
-'tooltip-n-currentevents' => 'Thì-kiûng tông-chhièn sîn-vùn sṳ-khien ke poi-kín chṳ̂-liau',
-'tooltip-n-recentchanges' => 'Lie̍t-chhut ke-mióng-chham chûng ke chui-khiûn siû-kói',
-'tooltip-n-randompage' => 'Sùi-kî chai-ngi̍p yit-ke vùn-chông',
-'tooltip-n-help' => 'Chhìm-khiù pông-chhu.',
-'tooltip-t-whatlinkshere' => 'Lie̍t-chhut só-yû lâu pún-chông siông-lièn ke vùn-chông',
-'tooltip-t-recentchangeslinked' => 'Vùn-chông lièn-chhut só-yû vùn-chông ke kiên-kói',
+'tooltip-ca-move' => '移動本頁',
+'tooltip-ca-watch' => '加邇頁入監視列表',
+'tooltip-ca-unwatch' => '從監視列表肚移除本頁',
+'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-rss' => 'Chṳ́-thin pún vùn-chông li̍t-sṳ́ ke RSS chṳ̂-liau',
-'tooltip-feed-atom' => 'Chṳ́-thin pún vùn-chông li̍t-sṳ́ ke Atom sêu-sit',
-'tooltip-t-contributions' => 'Chhà-khon ke-yung-fu ke kung-hien lie̍t-péu',
-'tooltip-t-emailuser' => 'Hiong ke-yung-fu fat-sung sin-sit',
-'tooltip-t-upload' => 'Sông-chhòn tóng-on',
-'tooltip-t-specialpages' => 'Chhiòn-phu thi̍t-sû vùn-chông ke lie̍t-péu',
-'tooltip-t-print' => 'Liá-ke vùn-chông ke hí-khó lie̍t-yin pán-pún',
-'tooltip-t-permalink' => 'Liá-ke vùn-chông pán-pún ke yún-kiú lièn-kiet',
-'tooltip-ca-nstab-main' => 'Chhà-khon vùn-chông nui-yùng',
-'tooltip-ca-nstab-user' => 'Chhà-khon yung-fu-chông',
+'tooltip-feed-atom' => '訂閱邇頁嘅Atom源',
+'tooltip-t-contributions' => '查看邇隻用戶嘅貢獻列表',
+'tooltip-t-emailuser' => '向邇隻用戶發送電子郵件',
+'tooltip-t-upload' => '上傳文件',
+'tooltip-t-specialpages' => '全部特殊文章嘅列表',
+'tooltip-t-print' => '本頁面做得打印嘅版本',
+'tooltip-t-permalink' => '邇隻頁面修訂版本嘅永久鏈接',
+'tooltip-ca-nstab-main' => '查看內容頁',
+'tooltip-ca-nstab-user' => '查看用戶頁面',
 'tooltip-ca-nstab-media' => 'Chhà-khon hìn-thí-chông',
-'tooltip-ca-nstab-special' => 'pún vùn-chông voi sùi-tén chṳ̂-liau-khu ke su-kí kiên-sîn, ngim-hò ngìn put-nèn chhṳ̍t-chiap phiên-cho',
-'tooltip-ca-nstab-project' => 'Chhà-khon hong-muk vùn-chông',
-'tooltip-ca-nstab-image' => 'Chhà-chhìm thù-phién hong-mien',
+'tooltip-ca-nstab-special' => '本頁面係特殊頁面,汝做毋得編寫本頁',
+'tooltip-ca-nstab-project' => '查看項目頁面',
+'tooltip-ca-nstab-image' => '查看文件頁面',
 'tooltip-ca-nstab-mediawiki' => 'Chhà-khon ne-thúng chṳ̂-liau',
-'tooltip-ca-nstab-template' => 'Chhà-khon mù-pán',
+'tooltip-ca-nstab-template' => '查看模板',
 'tooltip-ca-nstab-help' => 'Chhà-khon pông-chhu thiàu-muk',
-'tooltip-ca-nstab-category' => 'Chhà-khon fûn-lui thiàu-muk',
-'tooltip-minoredit' => 'Phêu-ki sṳ̀n-vì séu siû-kói',
-'tooltip-save' => 'Pó-chhùn ngì-ke siù-chho',
-'tooltip-preview' => 'Yi-ko ngì-ke phiên-siá, chhiáng siên sṳ́-yung pún-kûng chai pó-chhùn!',
-'tooltip-diff' => 'Hién-sṳ ngì tui vùn-chông ke kung-hien',
-'tooltip-compareselectedversions' => 'Chhà-khon pún-chông pûn tiám-sién ke lióng-ke pán-pún kiê ke chhâ-yi.',
-'tooltip-watch' => 'Chiông chhṳ́-chông kâ-ngi̍p ngì-ke kam-sṳ lie̍t-péu',
+'tooltip-ca-nstab-category' => '查看分類頁面',
+'tooltip-minoredit' => '標記做細微修改',
+'tooltip-save' => '保存汝嘅修改',
+'tooltip-preview' => '預覽汝嘅編寫,請先使用本功能後再保存!',
+'tooltip-diff' => '展示汝對頁面嘅貢獻',
+'tooltip-compareselectedversions' => '查看本頁分點選嘅兩個修訂版本間嘅差別',
+'tooltip-watch' => '加邇頁入監視列表',
 'tooltip-recreate' => 'Chhùng-kien ke-vùn-chông, mò-lun he-feu pûn chhù-chhîn',
-'tooltip-rollback' => '"Fán-chón" khó-yî yit-on fî-fu̍k sông yit-vi kung-hien-chá tui liá-ya̍p ke phiên-chho',
-'tooltip-undo' => '"Fu̍k-ngièn" khó-yî chhai phiên-sip mù-sṳt sông khôi-khí phiên-sip péu-kak fu̍k-ngièn. Kì yùng-chún chhai chak-yeu chûng kâ-ngi̍p ngièn-yîn.',
+'tooltip-rollback' => '撳“打轉頭”恢復上一位貢獻人對本頁面嘅編寫',
+'tooltip-undo' => '“撤銷”做得在編寫模式上開啟編輯寫表格來方便復原。其允許在摘要肚加入原因。',
+'tooltip-summary' => '輸入一條簡短嘅摘要',
 
 # Stylesheets
 'common.css' => '/* Chhṳ́-chhu ke CSS chiông-chhiu yin-yung chhai só-yû ke mien-pán */',
@@ -1488,7 +1776,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'othercontribs' => 'Chhai $1-ke kûng-chok kî-chhú song.',
 'others' => 'khì-thâ',
 'siteusers' => '{{SITENAME}} Yung-fu-chá $1',
-'creditspage' => 'Hong-mien chṳ-chhia',
+'creditspage' => '頁面編寫人名單',
 'nocredits' => 'Ke-chông mò-yû chṳ-chhia miàng-tân sêu-sit.',
 
 # Spam protection
@@ -1504,7 +1792,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'markaspatrolledtext' => 'Phêu-ki chhṳ́ vùn-chông sṳ̀n-vì yí-kîn kiám-chhà',
 'markedaspatrolled' => 'Phêu-ki yí-kîn kiám-chhà',
 'markedaspatrolledtext' => 'Ngì sî-yeu chṳ́-thin mêu-ke pán-pún chhòi-nèn phêu-ki sṳ̀n-vì yí-kîn kiám-chhà.',
-'rcpatroldisabled' => 'Chui-sîn kiên-kói kiám-chhà pûn kôan-pit',
+'rcpatroldisabled' => '最新更改檢查分人關閉',
 'rcpatroldisabledtext' => 'Chui-sîn kiên-kói kiám-chhà ke kûng-nèn muk-chhièn yí-kîn kôan-pit.',
 'markedaspatrollederror' => 'Put-nèn phêu-ki sṳ̀n-vì yí-kîn kiám-chhà',
 'markedaspatrollederrortext' => 'Ngì sî-yeu chṳ́-thin mêu-ke pán-pún chhòi-nèn phêu-ki sṳ̀n-vì yí-kîn kiám-chhà.',
@@ -1514,21 +1802,21 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'patrol-log-page' => 'Sùn-chhà ki-liu̍k',
 
 # Image deletion
-'deletedrevision' => 'Yí-kîn chhù-thet khiu-ke pán-pún $1.',
+'deletedrevision' => '已刪除舊版本$1',
 
 # Browsing diffs
-'previousdiff' => 'Sông yit-ke phiên-sip',
-'nextdiff' => 'Hâ-yit pán-pún →',
+'previousdiff' => '←上隻版本',
+'nextdiff' => '下隻版本→',
 
 # Media information
 'mediawarning' => "'''Kín-ko''': Ke-tóng-on khó-nèn pâu-hàm ok-yi am-ho, chṳp-hàng kì khó-nèn tui ngì-ke ne-thúng tai-lòi ngùi-hiám.",
 'imagemaxsize' => 'Chhai thù-chhiong mèu-siá chông tui thù-chhiong thai-séu han-chṳ he:',
 'thumbsize' => 'Lio̍k-thù thai-séu:',
 'file-info' => 'tóng-on thai-séu: $1, MIME lui-hìn: $2',
-'file-info-size' => '$1 × $2 chhiong-su, tóng-on thai-séu:$3 ,MIME lui-hìn:$4',
-'file-nohires' => 'Mò kien-kô kié-chhiong-thu khó-yî thì-kiûng.',
-'svg-long-desc' => 'SVG tóng-on, péu-mien thai-séu: $1 × $2 siong-su, tóng-on thai-séu: $3',
-'show-big-image' => 'Vàn-cháng ke kié-chhiong-thu',
+'file-info-size' => '$1 × $2像素,文件大小:$3,MIME類型:$4',
+'file-nohires' => '無做得提供嘅還較高分辨率。',
+'svg-long-desc' => 'SVG文件,尺寸:$1×$2像素,文件大細:$3',
+'show-big-image' => '完全分辨率',
 
 # Special:NewFiles
 'newimages' => 'Sîn-kien thù-chhiong ke va̍k-lòng',
@@ -1540,17 +1828,21 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'sp-newimages-showfrom' => 'Chhiùng $1 khôi-sṳ́ hién-sṳ sîn thù-phién',
 
 # Bad image list
-'bad_image_list' => 'Chhiáng on-cheu yî-ha kiet-sṳt phiên-siá
+'bad_image_list' => '請按照下列格式編寫
 
-Chṳ́-yû (yung * khôi-thèu) lie̍t-chhut ke hong-muk chhòi-nèn pûn kháu-li. Mî-yit-hòng ke thi-yit ke lièn-chiap pit-sî he mò-ngâ vùn-khien ke lièn-chiap.
-yèn-heu thùng yit-hòng heu-fông ke lièn-chiap chiông-voi pûn sṳ-vì li-ngoi, he liá-ke vùn-khien khó-yî chhai hong-muk nui pûn hién-sṳ.',
+單淨係有(以*開頭)列出嘅項目會分考慮。
+每一行嘅第一條鏈接必須係損壞文件嘅鏈接。
+然後同一行後方嘅鏈接會分看做例外,也就係講邇文件做得在哪兜頁面肚分顯示。',
 
 # Metadata
-'metadata' => 'Ngièn-sṳ́ sṳ-kí',
-'metadata-help' => 'Chhṳ́ tóng-on chûng pâu-hàm yû khok-chán ke sêu-sit. Liá-ke sêu-sit khó-nèn he yù sṳ-vi siong-kî fe̍t-chá mèu-ngì chhai chhóng-li̍p fe̍t-he su-sṳ-fa ko-chhàng chûng só kâ-thiâm ke. Kó-yèn chhṳ́ tóng-on ke ngièn tóng-on yí-kîn pûn siû-kói, sêu-sit chhai siû-kói heu ke tóng-on chûng chiông put-nèn vàn-chhiòn fán-yang chhut-lòi.',
+'metadata' => '元數據',
+'metadata-help' => '邇文件肚包含有擴展嘅信息。邇兜信息可能係由數碼相機或掃描儀在創建或數字化過程肚所加入嘅。
+
+係講邇文件嘅源文件已經分修改,一兜信息在修改後嘅文件肚將毋做得完全反映出來。',
 'metadata-expand' => 'Hién-sṳ siòng-se ke chṳ̂-liau',
 'metadata-collapse' => 'Yún-chhòng siòng-se ke chṳ̂-liau',
-'metadata-fields' => 'Chhai pún sêu-sit chûng só lie̍t-chhut ke EXIF ngièn-su-kí chiông-chhiu pâu-hàm chhai thù-phién hién-sṳ thiàu-muk, tông ngièn-su-kí péu sún-fái sṳ̀ chak hién-sṳ yî-ha sêu-sit, khì-thâ ke ngièn-su-kí yi-sat vì yún-chhòng.
+'metadata-fields' => '在本信息肚所列出嘅EXIF元數據域將包含在圖片顯示頁面,當元數據表損壞時單淨顯示下背信息。
+其他嘅元數據默認做隱藏。
 * make
 * model
 * datetimeoriginal
@@ -1566,17 +1858,18 @@ yèn-heu thùng yit-hòng heu-fông ke lièn-chiap chiông-voi pûn sṳ-vì li-
 * gpsaltitude',
 
 # External editor support
-'edit-externally' => 'Yung ngoi-phu chhàng-sṳt phiên-siá chhṳ́ tóng-on',
-'edit-externally-help' => 'Chhiáng chhâm-siòng [//www.mediawiki.org/wiki/Manual:External_editors sat-thin phu] liáu-kié siòng-se sin-sit.',
+'edit-externally' => '用外部應用程序編寫本文件',
+'edit-externally-help' => '(請參詳[//www.mediawiki.org/wiki/Manual:External_editors 設定步驟]了解詳細資訊)',
 
 # 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'chhiòn-phu',
-'namespacesall' => 'Chhiòn-phu',
-'monthsall' => 'chhiòn-phu',
+'watchlistall2' => '全部',
+'namespacesall' => '全部',
+'monthsall' => '全部',
+'limitall' => '全部',
 
 # Email address confirmation
-'confirmemail' => 'Khok-ngin email thi-tiám',
-'confirmemail_noemail' => 'Ngì mò-yû chhai ngì-ke [[Special:Preferences|yung-fu sat-thin]] sû-ngi̍p yit-ke yû-háu ke email thi-tiám.',
+'confirmemail' => '確認電郵地址',
+'confirmemail_noemail' => '汝還吂在汝嘅[[Special:Preferences|用戶偏好設定]]肚輸入一隻有效嘅電郵地址。',
 'confirmemail_text' => 'Chhṳ́ mióng-chham yêu-khiù ngì chhai sṳ́-yung sin-siông kûng-nèn chṳ̂-chhièn ngiam-chṳn ngì-ke sin-siông thi-tiám. Tiám-kit yî-ha on-néu chhṳ̍t-hiong ngì-ke sin-siông fat-sung yit-fûng khok-ngin sin-siông. Ke-sin-siông pâu-hàm yû yit-hòng me̍t-me̍t lièn-kiet; chhiáng chhai ngì-ke hi-khí chûng kâ-chai chhṳ́ lièn-kiet yî khok-ngin ngì-ke sin-siông thi-tiám he yû-háu ke.',
 'confirmemail_pending' => ' Yit-ke khok-ngin me̍t-me̍t yí-kîn pûn fat-sung to ngì-ke sin-siông, ngì khó-nèn sî-yeu tén kí-fun chhòi-nèn chhòi-nèn sû-tó.
 Kó-yèn mò-fap sû-tó, chhiáng chhai sṳ̂n-chhiáng yit-ke sîn-ke khok-ngin me̍t-me̍t!',
@@ -1608,16 +1901,16 @@ Kó-yèn ngì *mò-yû* thì-chhut liá-ke chhiáng-khiù,  chhiáng put-yeu ti
 'confirmrecreate' => "Chhai ngì phiên-chho liá-ke thiàu-muk heu, yung-fu [[User:$1|$1]]([[User talk:$1|tui-fa]]) yî ha-lie̍t ngièn-yîn chhù-thet liá-ke vùn-chông:
 : ''$2''
 Chhiáng chhai chhùng-sîn kien-chho vùn-chông chhièn sâm-sṳ̂.",
-'recreate' => 'Chhùng-kien',
+'recreate' => '重建',
 
 # action=purge
-'confirm_purge_button' => 'Khok-thin',
+'confirm_purge_button' => '做得',
 'confirm-purge-top' => 'Chhîn-chhù pún-chông chhòng-chhùn?',
 
 # Multipage image navigation
 'imgmultipageprev' => '← sông yit-chông',
 'imgmultipagenext' => 'hâ yit-chông →',
-'imgmultigo' => 'Khok-thin!',
+'imgmultigo' => '確定!',
 
 # Table pager
 'ascending_abbrev' => 'Suk-siá chen',
@@ -1632,7 +1925,7 @@ Chhiáng chhai chhùng-sîn kien-chho vùn-chông chhièn sâm-sṳ̂.",
 
 # Auto-summaries
 'autosumm-blank' => 'Chhù-chhîn só-yû ke hong-mien nui-yùng',
-'autosumm-replace' => "Chang-chhai chiông hong-mien thi-von sṳ̀n-vì '$1'",
+'autosumm-replace' => '用“$1”替換內容',
 'autoredircomment' => 'Chang-chhai chhûng-thin hiong to [[$1]]',
 'autosumm-new' => 'Sîn hong-mien: $1',
 
@@ -1652,9 +1945,12 @@ Sòn-chhṳ phêu-chún yi-liau.',
 'lag-warn-high' => 'Yù-yî chṳ̂-liau-khu ke ko-thu yèn-chhṳ̀, tô-yî $1-méu ke kiên-kói khó-nèn put-voi chhai liá-ke chhîn-tân chûng hién-sṳ.',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'Kiám-sṳ yû-kôan kiên-kói',
-'watchlisttools-edit' => 'Kiám-sṳ lâu phiên-sip kam-sṳ lie̍t-péu',
-'watchlisttools-raw' => 'Phiên-sip ngièn-sṳ́ kam-sṳ lie̍t-péu',
+'watchlisttools-view' => '查看有關更改',
+'watchlisttools-edit' => '查看並編寫監視列表',
+'watchlisttools-raw' => '編寫原始監視列表',
+
+# Core parser functions
+'duplicate-defaultsort' => "'''警告:'''默認排序關鍵字“$2”蓋過矣先前嘅默認排序關鍵字“$1”。",
 
 # Special:Version
 'version' => 'Pán-pún',
@@ -1663,11 +1959,24 @@ Sòn-chhṳ phêu-chún yi-liau.',
 'fileduplicatesearch-submit' => 'Chhìm-cháu',
 
 # Special:SpecialPages
-'specialpages' => 'Thi̍t-sû-ya̍p',
+'specialpages' => '特殊頁',
+
+# External image whitelist
+'external_image_whitelist' => ' #留下撈邇行一樣嘅文字<pre>
+#在下背(//中間部份)輸入正則表達式
+#邇兜將會撈外部(已超鏈接嘅)圖片配合
+#遐兜配合上嘅會顯示成圖片,否則就單淨會顯示成鏈接
+#有#開頭嘅行會當成意見
+#大小寫並無區分
+
+#在邇行上片輸入全部正則表達式。留下撈邇行一樣嘅文字</pre>',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|標籤]]過濾器:',
 
 # New logging system
 'revdelete-restricted' => 'yí-kîn yin-yung han-tsṳ tsṳ tshâu-tsok-yèn',
 'revdelete-unrestricted' => 'yí-kîn yì-tshù yû-kûan tshâu-tsok-yè ke han-tsṳ',
-'rightsnone' => '()',
+'rightsnone' => '()',
 
 );
index a6e9b8e..d3f835d 100644 (file)
@@ -641,7 +641,7 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 # Special:ListGroupRights
 'listgrouprights-members' => '(papa o nā lālā)',
 
-# E-mail user
+# Email user
 'emailuser' => 'E leka uila i kēia mea ho‘ohana',
 'emailmessage' => 'Memo:',
 
index a1e453c..c425168 100644 (file)
@@ -20,6 +20,7 @@
  * @author Rotemliss
  * @author YaronSh
  * @author ערן
+ * @author פדיחה
  * @author שומבלע
  * @author תומר ט
  */
@@ -104,6 +105,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'חיפוש_MIME' ),
        'Mostcategories'            => array( 'הקטגוריות_הרבות_ביותר', 'הדפים_מרובי-הקטגוריות_ביותר' ),
        'Mostimages'                => array( 'הקבצים_המקושרים_ביותר', 'התמונות_המקושרות_ביותר' ),
+       'Mostinterwikis'            => array( 'קישורי_שפה_ביותר' ),
        'Mostlinked'                => array( 'הדפים_המקושרים_ביותר', 'המקושרים_ביותר' ),
        'Mostlinkedcategories'      => array( 'הקטגוריות_המקושרות_ביותר' ),
        'Mostlinkedtemplates'       => array( 'התבניות_המקושרות_ביותר' ),
@@ -198,6 +200,7 @@ $magicWords = array(
        'pagenamee'                 => array( '1', 'שם הדף מקודד', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'מרחב השם', 'NAMESPACE' ),
        'namespacee'                => array( '1', 'מרחב השם מקודד', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'מספר_מרחב_השם', 'NAMESPACENUMBER' ),
        'talkspace'                 => array( '1', 'מרחב השיחה', 'TALKSPACE' ),
        'talkspacee'                => array( '1', 'מרחב השיחה מקודד', 'TALKSPACEE' ),
        'subjectspace'              => array( '1', 'מרחב הנושא', 'מרחב הערכים', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -310,6 +313,7 @@ $magicWords = array(
        'url_query'                 => array( '0', 'שאילתה', 'QUERY' ),
        'defaultsort_noerror'       => array( '0', 'ללא שגיאה', 'noerror' ),
        'defaultsort_noreplace'     => array( '0', 'ללא החלפה', 'noreplace' ),
+       'pagesincategory_pages'     => array( '0', 'דפים', 'pages' ),
 );
 
 $datePreferences = array(
@@ -371,23 +375,21 @@ $messages = array(
 'tog-watchmoves' => 'מעקב אחרי דפים וקבצים שהעברתי',
 'tog-watchdeletion' => 'מעקב אחרי דפים וקבצים שמחקתי',
 'tog-minordefault' => 'הגדרת כל פעולת עריכה כמשנית אם לא צוין אחרת',
-'tog-previewontop' => 'הצגת תצוגה מקדימה לפני תיבת העריכה (או: אחריה)',
+'tog-previewontop' => 'הצגת תצוגה מקדימה לפני תיבת העריכה',
 'tog-previewonfirst' => 'הצגת תצוגה מקדימה בעריכה ראשונה',
 'tog-nocache' => 'מניעת אחסון הדפים בזיכרון המטמון בדפדפן',
 'tog-enotifwatchlistpages' => 'לשלוח אליי דואר אלקטרוני כאשר משתנה דף או קובץ ברשימת המעקב שלי',
 'tog-enotifusertalkpages' => 'לשלוח אליי דואר אלקטרוני כאשר נעשה שינוי בדף שיחת המשתמש שלי',
 'tog-enotifminoredits' => 'לשלוח אליי דואר אלקטרוני גם על עריכות משניות של דפים וקבצים',
 'tog-enotifrevealaddr' => 'חשיפת כתובת הדוא"ל שלך בהודעות דוא"ל',
-'tog-shownumberswatching' => 'הצגת מספר המשתמשים העוקבים אחרי הדף',
-'tog-oldsig' => '×\94×\97ת×\99×\9e×\94 ×\94ק×\99×\99×\9eת:',
+'tog-shownumberswatching' => 'הצגת מספר המשתמשים העוקבים',
+'tog-oldsig' => '×\94×\97ת×\99×\9e×\94 ×\94× ×\95×\9b×\97×\99ת:',
 'tog-fancysig' => 'פירוש החתימה כקוד ויקי (ללא קישור אוטומטי)',
-'tog-externaleditor' => 'שימוש בעורך חיצוני כברירת מחדל (למשתמשים מומחים בלבד, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
-'tog-externaldiff' => 'שימוש בתוכנת השוואת הגרסאות החיצונית כברירת מחדל (למשתמשים מומחים בלבד, דורש הגדרות מיוחדות במחשב. [//www.mediawiki.org/wiki/Manual:External_editors למידע נוסף.])',
-'tog-showjumplinks' => 'הצגת קישורי נגישות מסוג "קפוץ אל"',
+'tog-showjumplinks' => 'הצגת קישורי נגישות מסוג "{{int:jumpto}}"',
 'tog-uselivepreview' => 'שימוש בתצוגה מקדימה מהירה (דרוש JavaScript) (ניסיוני)',
 'tog-forceeditsummary' => 'הצגת אזהרה בעת הכנסת תקציר עריכה ריק',
-'tog-watchlisthideown' => 'הסתרת עריכות שלי ברשימת המעקב',
-'tog-watchlisthidebots' => 'הסתרת בוטים ברשימת המעקב',
+'tog-watchlisthideown' => '×\94סתרת ×\94ער×\99×\9b×\95ת ×©×\9c×\99 ×\91רש×\99×\9eת ×\94×\9eעק×\91',
+'tog-watchlisthidebots' => '×\94סתרת ×¢×¨×\99×\9b×\95ת ×©×\9c ×\91×\95×\98×\99×\9d ×\91רש×\99×\9eת ×\94×\9eעק×\91',
 'tog-watchlisthideminor' => 'הסתרת עריכות משניות ברשימת המעקב',
 'tog-watchlisthideliu' => 'הסתרת עריכות של משתמשים רשומים ברשימת המעקב',
 'tog-watchlisthideanons' => 'הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב',
@@ -397,6 +399,7 @@ $messages = array(
 'tog-showhiddencats' => 'הצגת קטגוריות מוסתרות',
 'tog-noconvertlink' => 'ביטול המרת קישורים לכותרות',
 'tog-norollbackdiff' => 'השמטת ההבדלים בין הגרסאות לאחר ביצוע שחזור',
+'tog-useeditwarning' => 'הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו',
 
 'underline-always' => 'תמיד',
 'underline-never' => 'לעולם לא',
@@ -460,6 +463,18 @@ $messages = array(
 '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 בדצמבר',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|קטגוריה|קטגוריות}}',
@@ -483,7 +498,7 @@ $messages = array(
 'about' => 'אודות',
 'article' => 'דף תוכן',
 'newwindow' => '(נפתח בחלון חדש)',
-'cancel' => 'ביטול / יציאה',
+'cancel' => 'ביטול',
 'moredotdotdot' => 'עוד…',
 'morenotlisted' => 'עוד פריטים שאינם ברשימה…',
 'mypage' => 'דף משתמש',
@@ -769,9 +784,18 @@ $2',
 'welcomecreation-msg' => 'חשבונך נוצר.
 נא לא לשכוח להתאים את [[Special:Preferences|העדפות המשתמש]] שלך ב{{grammar:תחילית|{{SITENAME}}}}.',
 'yourname' => 'שם משתמש:',
+'userlogin-yourname' => 'שם משתמש',
+'userlogin-yourname-ph' => 'יש להקליד את שם המשתמש',
 'yourpassword' => 'סיסמה:',
-'yourpasswordagain' => 'הקש סיסמה שנית:',
+'userlogin-yourpassword' => 'סיסמה',
+'userlogin-yourpassword-ph' => 'יש להקליד את הסיסמה',
+'createacct-yourpassword-ph' => 'יש להקליד סיסמה',
+'yourpasswordagain' => 'חזרה על הסיסמה:',
+'createacct-yourpasswordagain' => 'אימות הסיסמה',
+'createacct-yourpasswordagain-ph' => 'יש להקליד את הסיסמה שנית',
 'remembermypassword' => 'שמירת הכניסה שלי בדפדפן הזה (ל{{PLURAL:$1|יום אחד|יומיים|־$1 ימים}} לכל היותר)',
+'userlogin-remembermypassword' => 'לזכור שנכנסתי',
+'userlogin-signwithsecure' => 'שימוש בחיבור מאובטח',
 'securelogin-stick-https' => 'המשך שימוש ב־HTTPS אחרי הכניסה',
 'yourdomainname' => 'המתחם שלך:',
 'password-change-forbidden' => 'אינכם יכולים לשנות סיסמאות באתר זה.',
@@ -784,18 +808,38 @@ $2',
 'logout' => 'יציאה מהחשבון',
 'userlogout' => 'יציאה מהחשבון',
 'notloggedin' => 'לא בחשבון',
+'userlogin-noaccount' => 'אין לך חשבון?',
+'userlogin-joinproject' => 'הצטרפות ל{{grammar:תחילית|{{SITENAME}}}}',
 'nologin' => 'אין לכם חשבון? $1.',
 'nologinlink' => 'הרשמה',
 'createaccount' => 'יצירת חשבון חדש',
 'gotaccount' => 'כבר נרשמתם? $1.',
 'gotaccountlink' => 'כניסה לחשבון',
 'userlogin-resetlink' => 'שכחת את פרטי הכניסה?',
+'userlogin-resetpassword-link' => 'איפוס הסיסמה',
+'helplogin-url' => 'Help:כניסה לחשבון',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|עזרה בכניסה לחשבון]]',
+'createacct-join' => 'נא להקליד להלן את הפרטים שלך.',
+'createacct-emailrequired' => 'כתובת דוא"ל',
+'createacct-emailoptional' => 'כתובת דוא"ל (לא חובה)',
+'createacct-email-ph' => 'יש להקליד את כתובת הדוא"ל שלך',
 'createaccountmail' => 'שימוש בסיסמה זמנית אקראית ושליחתה לכתובת הדוא"ל המצוינת להלן',
+'createacct-realname' => 'שם אמיתי (לא חובה)',
 'createaccountreason' => 'סיבה:',
+'createacct-reason' => 'סיבה',
+'createacct-reason-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|תורם|תורמים}} לאחרונה',
 'badretype' => 'הסיסמאות שהזנתם אינן מתאימות.',
 'userexists' => 'שם המשתמש שבחרתם כבר נמצא בשימוש.
 אנא בחרו שם אחר.',
 'loginerror' => 'שגיאה בכניסה לאתר',
+'createacct-error' => 'שגיאה ביצירת חשבון',
 'createaccounterror' => 'לא ניתן היה ליצור את החשבון: $1',
 'nocookiesnew' => 'חשבון המשתמש שלכם נוצר, אך לא נכנסתם כמשתמשים רשומים.
 {{SITENAME}} משתמש בעוגיות כדי להכניס משתמשים למערכת.
@@ -832,7 +876,7 @@ $2',
 עליכם להיכנס לאתר ולשנות את סיסמתכם בהקדם האפשרי. אם מישהו אחר ביקש סיסמה חדשה זו או אם נזכרתם בסיסמתכם
 ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמתכם הישנה.',
 'noemail' => 'לא רשומה כתובת דואר אלקטרוני עבור המשתמש "$1".',
-'noemailcreate' => 'עליכם לספק כתובת דואר אלקטרוני תקינה',
+'noemailcreate' => 'עליכם לספק כתובת דואר אלקטרוני תקינה.',
 'passwordsent' => 'סיסמה חדשה נשלחה לכתובת הדואר האלקטרוני הרשומה עבור "$1".
 אנא היכנסו חזרה לאתר אחרי שתקבלו אותה.',
 'blocked-mailpassword' => 'כתובת ה־IP שלכם חסומה מעריכה, ולפיכך אינכם מורשים להשתמש באפשרות שחזור הסיסמה כדי למנוע ניצול לרעה של התכונה.',
@@ -888,13 +932,15 @@ $2',
 'resetpass-wrong-oldpass' => 'הסיסמה הזמנית או הנוכחית אינה תקינה.
 ייתכן שכבר שיניתם את סיסמתכם או שכבר ביקשתם סיסמה זמנית חדשה.',
 'resetpass-temp-password' => 'סיסמה זמנית:',
+'resetpass-abort-generic' => 'שינוי הסיסמה בוטל על ידי הרחבה.',
 
 # Special:PasswordReset
 'passwordreset' => 'איפוס סיסמה',
-'passwordreset-text' => 'מלאו טופס זה כדי לאפס את הסיסמה.',
+'passwordreset-text-one' => 'מלאו טופס זה כדי לאפס את הסיסמה.',
+'passwordreset-text-many' => '{{PLURAL:$1||הקלידו אחד מפריטי המידע כדי לאפס את הסיסמה.}}',
 'passwordreset-legend' => 'איפוס סיסמה',
 'passwordreset-disabled' => 'איפוסי סיסמה בוטלו באתר ויקי זה.',
-'passwordreset-pretext' => '{{PLURAL:$1||הקלידו אחד מפריטי המידע למטה}}',
+'passwordreset-emaildisabled' => 'שירותי הדוא"ל בוטלו באתר ויקי זה.',
 'passwordreset-username' => 'שם משתמש:',
 'passwordreset-domain' => 'תחום:',
 'passwordreset-capture' => 'לצפות בדוא"ל הנשלח?',
@@ -924,7 +970,7 @@ $2
 סיסמה זמנית: $2',
 'passwordreset-emailsent' => 'נשלח דואר אלקטרוני לאיפוס הסיסמה.',
 'passwordreset-emailsent-capture' => 'נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.',
-'passwordreset-emailerror-capture' => 'נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו למשתמש נכשלה: $1',
+'passwordreset-emailerror-capture' => 'נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'שינוי כתובת דוא"ל',
@@ -1132,12 +1178,15 @@ $2
 נראה שהוא נמחק.',
 'edit-conflict' => 'התנגשות עריכה.',
 'edit-no-change' => 'המערכת התעלמה מעריכתכם, כיוון שלא נעשה שינוי בטקסט.',
+'postedit-confirmation' => 'עריכתך נשמרה.',
 'edit-already-exists' => 'לא ניתן ליצור דף חדש.
 הוא כבר קיים.',
 'defaultmessagetext' => 'טקסט ההודעה המקורי',
 'content-failed-to-parse' => 'פענוח $2 כתוכן מסוג $1 נכשל: $3',
 'invalid-content-data' => 'מידע שגוי על התוכן',
 'content-not-allowed-here' => 'תוכן מסוג "$1" אינו מותר בדף [[$2]]',
+'editwarning-warning' => 'עזיבת דף זה עשויה לגרום לאובדן כל השינויים שביצעתם.
+אם אתם מחוברים לחשבון, תוכלו לבטל אזהרה זו בחלק "עריכה" שבהעדפות שלכם.',
 
 # Content models
 'content-model-wikitext' => 'טקסט ויקי',
@@ -1421,15 +1470,7 @@ $1",
 'searchdisabled' => 'חיפוש ב{{grammar:תחילית|{{SITENAME}}}} אינו מופעל כעת.
 בינתיים אפשר לחפש באמצעות גוגל.
 שימו לב שייתכן שהמידע של {{SITENAME}} שם אינו מעודכן.',
-
-# Quickbar
-'qbsettings' => 'הגדרות סרגל כלים',
-'qbsettings-none' => 'ללא',
-'qbsettings-fixedleft' => 'קבוע משמאל',
-'qbsettings-fixedright' => 'קבוע מימין',
-'qbsettings-floatingleft' => 'צף משמאל',
-'qbsettings-floatingright' => 'צף מימין',
-'qbsettings-directionality' => 'קבוע, תלוי בכיוון הכתב של השפה שלך',
+'search-error' => 'אירעה שגיאה במהלך החיפוש: $1',
 
 # Preferences page
 'preferences' => 'העדפות',
@@ -1461,7 +1502,7 @@ $1",
 'prefs-rendering' => 'מראה',
 'saveprefs' => 'שמירת העדפות',
 'resetprefs' => 'מחיקת שינויים שלא נשמרו',
-'restoreprefs' => '×\97×\96ר×\94 ×\9c×\94×\92×\93ר×\95ת ×\91ר×\99רת ×\94×\9e×\97×\93×\9c',
+'restoreprefs' => 'ש×\97×\96×\95ר ×\94×\94×\92×\93ר×\95ת ×\94×\94ת×\97×\9cת×\99×\95ת',
 'prefs-editing' => 'עריכה',
 'prefs-edit-boxsize' => 'גודל חלון העריכה.',
 'rows' => 'שורות:',
@@ -1575,6 +1616,7 @@ $1",
 'userrights-notallowed' => 'לחשבון המשתמש שלכם אין הרשאה להוסיף או להסיר הרשאות של משתמשים.',
 'userrights-changeable-col' => 'קבוצות שבאפשרותכם לשנות',
 'userrights-unchangeable-col' => 'קבוצות שאין באפשרותכם לשנות',
+'userrights-conflict' => 'התנגשות הרשאות משתמש! אנא בצעו את השינויים שלכם שוב.',
 
 # Groups
 'group' => 'קבוצה:',
@@ -1991,7 +2033,6 @@ $1',
 'http-read-error' => 'שגיאת קריאה של HTTP.',
 'http-timed-out' => 'עבר זמן ההמתנה של בקשת ה־HTTP.',
 'http-curl-error' => 'שגיאה בקבלת כתובת ה־URL‏: $1',
-'http-host-unreachable' => 'לא ניתן להגיע לכתובת ה־URL.',
 'http-bad-status' => 'הייתה בעיה בשליחת בקשת ה־HTTP‏: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2004,8 +2045,8 @@ $1',
 'license-header' => 'רישיון',
 'nolicense' => 'אין',
 'license-nopreview' => '(תצוגה מקדימה לא זמינה)',
-'upload_source_url' => ' (כתובת URL תקפה ונגישה)',
-'upload_source_file' => ' (קובץ במחשב שלך)',
+'upload_source_url' => '(כתובת URL תקפה ונגישה)',
+'upload_source_file' => '(קובץ במחשב שלך)',
 
 # Special:ListFiles
 'listfiles-summary' => 'דף מיוחד זה מציג את כל הקבצים שהועלו.
@@ -2404,8 +2445,8 @@ $1',
 'notvisiblerev' => 'הגרסה האחרונה שנוצרה על ידי משתמש אחר נמחקה',
 'watchnochange' => 'אף אחד מהדפים ברשימת המעקב לא עודכן בפרק הזמן המצוין למעלה.',
 'watchlist-details' => 'ברשימת המעקב יש {{PLURAL:$1|דף אחד|$1 דפים}} (לא כולל דפי שיחה).',
-'wlheader-enotif' => 'הודעות דוא"ל מאופשרות.',
-'wlheader-showupdated' => "דפים שהשתנו מאז ביקורכם האחרון בהם מוצגים ב'''הדגשה'''.",
+'wlheader-enotif' => 'הודעות דוא"ל מאופשרות.',
+'wlheader-showupdated' => "דפים שהשתנו מאז ביקורכם האחרון בהם מוצגים ב'''הדגשה'''.",
 'watchmethod-recent' => 'בודק את הדפים שברשימת המעקב לשינויים אחרונים.',
 'watchmethod-list' => 'בודק את העריכות האחרונות בדפים שברשימת המעקב',
 'watchlistcontains' => 'רשימת המעקב כוללת {{PLURAL:$1|דף אחד|$1 דפים}}.',
@@ -2814,6 +2855,7 @@ $1',
 'proxyblocksuccess' => 'בוצע.',
 'sorbsreason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו.',
 'sorbs_create_account_reason' => 'כתובת ה־IP שלכם רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר זה משתמש בו. אינכם יכולים ליצור חשבון.',
+'xffblockreason' => 'כתובת IP הנמצאת בכותרת X-Forwarded-For, בין אם שלכם או של שרת פרוקסי שאתם משתמשים בו, נחסמה. סיבת החסימה המקורית הייתה: $1',
 'cant-block-while-blocked' => 'אינכם יכולים לחסום משתמשים אחרים כשאתם חסומים.',
 'cant-see-hidden-user' => 'המשתמש שאתם מנסים לחסום כבר נחסם והוסתר. כיוון שאין לכם את ההרשאה לחסימת משתמש והסתרתו, אינכם רשאים לצפות בחסימת המשתמש או לערוך אותה.',
 'ipbblocked' => 'אינכם יכולים לחסום או לשחרר את חסימתם של משתמשים אחרים, כיוון שאתם עצמכם חסומים',
@@ -2978,6 +3020,8 @@ $1',
 'thumbnail-more' => 'הגדלה',
 'filemissing' => 'קובץ חסר',
 'thumbnail_error' => 'שגיאה ביצירת תמונה ממוזערת: $1',
+'thumbnail_error_remote' => 'הודעת שגיאה של $1:
+$2',
 'djvu_page_error' => 'דף ה־DjVu מחוץ לטווח',
 'djvu_no_xml' => 'לא ניתן היה לקבל את ה־XML עבור קובץ ה־DjVu',
 'thumbnail-temp-create' => 'לא הצליחה יצירת קובץ תמונה ממוזערת זמני',
@@ -3128,17 +3172,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/* הסגנונות הנכתבים כאן ישפיעו על כל העיצובים */',
-'standard.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Standard בלבד */',
-'nostalgia.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Nostalgia בלבד */',
 'cologneblue.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב CologneBlue בלבד */',
 'monobook.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MonoBook בלבד */',
-'myskin.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MySkin בלבד */',
-'chick.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Chick בלבד */',
-'simple.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Simple בלבד */',
 'modern.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Modern בלבד */',
 'vector.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Vector בלבד */',
 'print.css' => '/* הסגנונות הנכתבים כאן ישפיעו על הפלט בהדפסה בלבד */',
-'handheld.css' => '/* הסגנונות הנכתבים כאן ישפיעו על מכשירים ניידים המבוססים על העיצוב שבהגדרה $wgHandheldStyle בלבד */',
 'noscript.css' => '/* הסגנונות הנכתבים כאן ישפיעו על משתמשים עם JavaScript מבוטל */',
 'group-autoconfirmed.css' => '/* הסגנונות הנכתבים כאן ישפיעו על משתמשים ותיקים בלבד */',
 'group-bot.css' => '/* הסגנונות הנכתבים כאן ישפיעו על בוטים בלבד */',
@@ -3147,13 +3185,8 @@ $1',
 
 # Scripts
 'common.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ עבור כל המשתמשים בכל טעינת עמוד */',
-'standard.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Standard */',
-'nostalgia.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Nostalgia */',
 'cologneblue.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב CologneBlue */',
 'monobook.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Monobook */',
-'myskin.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב MySkin */',
-'chick.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Chick */',
-'simple.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Simple */',
 'modern.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Modern */',
 'vector.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור המשתמשים בעיצוב Vector */',
 'group-autoconfirmed.js' => '/* כל סקריפט JavaScript שנכתב כאן ירוץ רק עבור משתמשים ותיקים */',
@@ -3233,13 +3266,8 @@ $1',
 'pageinfo-category-files' => 'מספר הקבצים',
 
 # Skin names
-'skinname-standard' => 'קלאסי',
-'skinname-nostalgia' => 'נוסטלגיה',
 'skinname-cologneblue' => 'מים כחולים',
 'skinname-monobook' => 'מונובוק',
-'skinname-myskin' => 'העיצוב שלי',
-'skinname-chick' => "צ'יק",
-'skinname-simple' => 'פשוט',
 'skinname-modern' => 'מודרני',
 'skinname-vector' => 'וקטור',
 
@@ -3322,11 +3350,25 @@ $1',
 'minutes' => '{{PLURAL:$1|דקה|$1 דקות}}',
 'hours' => '{{PLURAL:$1|שעה|שעתיים|$1 שעות}}',
 'days' => '{{PLURAL:$1|יום|יומיים|$1 ימים}}',
+'weeks' => '{{PLURAL:$1|שבוע|שבועיים|$1 שבועות}}',
 'months' => '{{PLURAL:$1|חודש|חודשיים|$1 חודשים}}',
 'years' => '{{PLURAL:$1|שנה|שנתיים|$1 שנים}}',
 'ago' => 'לפני $1',
 'just-now' => 'לפני זמן קצר',
 
+# Human-readable timestamps
+'hours-ago' => 'לפני {{PLURAL:$1|שעה|שעתיים|$1 שעות}}',
+'minutes-ago' => 'לפני {{PLURAL:$1|דקה|$1 דקות}}',
+'seconds-ago' => 'לפני {{PLURAL:$1|שנייה|$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
 'bad_image_list' => 'דרך הכתיבה בהודעה היא כמתואר להלן:
 
@@ -3356,7 +3398,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'רוחב',
 'exif-imagelength' => 'גובה',
 'exif-bitspersample' => 'ביטים לרכיב',
@@ -3535,7 +3577,7 @@ $1',
 'exif-originalimageheight' => 'גובה התמונה לפני קיטוע',
 'exif-originalimagewidth' => 'רוחב התמונה לפני קיטוע',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'לא דחוס',
 'exif-compression-2' => 'קידוד הופמן מואתם חד-מימדי לאורך ריצה CCITT קבוצה 3',
 'exif-compression-3' => 'קידוד פקס CCITT קבוצה 3',
@@ -4010,12 +4052,17 @@ $5
 'version-entrypoints-header-entrypoint' => 'נקודת כניסה',
 'version-entrypoints-header-url' => 'כתובת',
 
-# Special:FilePath
-'filepath' => 'נתיב לקובץ',
-'filepath-page' => 'הקובץ:',
-'filepath-submit' => 'הצגה',
-'filepath-summary' => 'דף זה מציג את הנתיב המלא לקבצים שהועלו.
-תמונות מוצגות ברזולוציה מלאה, וסוגי קבצים אחרים מוצגים ישירות באמצעות התוכנה שהוגדרה להצגתם.',
+# Special:Redirect
+'redirect' => 'הפניה לפי שם קובץ, מספר משתמש או מספר גרסה',
+'redirect-legend' => 'הפניה לקובץ או לדף',
+'redirect-summary' => 'דף מיוחד זה מפנה לקובץ (בהינתן שם הקובץ), לדף (בהינתן מספר גרסה), או לדף משתמש (בהינתן מספר משתמש).',
+'redirect-submit' => 'מעבר',
+'redirect-lookup' => 'סוג:',
+'redirect-value' => 'ערך:',
+'redirect-user' => 'מספר משתמש',
+'redirect-revision' => 'גרסת דף',
+'redirect-file' => 'שם קובץ',
+'redirect-not-exists' => 'הערך לא נמצא',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'חיפוש קבצים כפולים',
@@ -4105,6 +4152,9 @@ $5
 'htmlform-submit' => 'שליחה',
 'htmlform-reset' => 'ביטול השינויים',
 'htmlform-selectorother-other' => 'אחר',
+'htmlform-no' => 'לא',
+'htmlform-yes' => 'כן',
+'htmlform-chosen-placeholder' => 'נא לבחור אפשרות',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 עם תמיכה בחיפוש בטקסט מלא',
@@ -4147,8 +4197,8 @@ $5
 'rightsnone' => '(כלום)',
 
 # Feedback
-'feedback-bugornote' => '×\90×\9d ×\90ת×\9d ×\9e×\95×\9b× ×\99×\9d ×\9cת×\90ר ×\91×¢×\99×\94 ×\98×\9b× ×\99ת ×\91פר×\98×\99×\9d, ×\90× ×\90 [$1 ×\93×\95×\95×\97×\95 ×¢×\9c ×\91×\90×\92].
-אחרת, תוכלו להשתמש בטופס הפשוט שלהלן. הערתכם תתווסף לדף "[$3 $2]", יחד עם שם המשתמש שלכם והדפדפן בו אתם משתמשים.',
+'feedback-bugornote' => 'אם אתם מוכנים לתאר בעיה טכנית בפרטים, אנא [$1 דווחו באג].
+אחרת, תוכלו להשתמש בטופס הפשוט שלהלן. הערתכם תתווסף לדף "[$3 $2]", יחד עם שם המשתמש שלכם.',
 'feedback-subject' => 'נושא:',
 'feedback-message' => 'הודעה:',
 'feedback-cancel' => 'ביטול',
index a7a4085..aeaf3c9 100644 (file)
@@ -182,7 +182,7 @@ $digitTransformTable = array(
        '8' => '८', # &#x096e;
        '9' => '९', # &#x096f;
 );
-$linkTrail = "/^([a-z]+)(.*)$/sD";
+$linkTrail = "/^([a-z\x{0900}-\x{0963}\x{0966}-\x{A8E0}-\x{A8FF}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
 
@@ -217,8 +217,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ध्यान रखने वाले सदस्यों की संख्या दिखाएँ',
 'tog-oldsig' => 'वर्तमान हस्ताक्षर:',
 'tog-fancysig' => 'हस्ताक्षर का विकिपाठ के समान उपयोग करें (बिना स्वचालित कड़ी के)',
-'tog-externaleditor' => 'डिफ़ॉल्ट रूप से बाह्य सम्पादक का उपयोग करें (केवल विशेषज्ञों के लिए, इसके लिए संगणक पर विशेष जमाव चाहिए होंगे। [//www.mediawiki.org/wiki/Manual:External_editors अधिक जानकारी।])',
-'tog-externaldiff' => 'डिफ़ॉल्ट रूप से बाह्य अन्तर का उपयोग करें (केवल विशेषज्ञों के लिए, इसके लिए संगणक पर विशेष जमाव चाहिए होंगे। [//www.mediawiki.org/wiki/Manual:External_editors अधिक जानकारी।])',
 'tog-showjumplinks' => '"की ओर जाएं" कड़ियाँ उपलब्ध कराएँ',
 'tog-uselivepreview' => 'सजीवन झलक का उपयोग करें (जावास्क्रिप्ट चाहिए) (प्रयोगक्षम)',
 'tog-forceeditsummary' => 'यदि बदलाव सारांश ना दिया गया हो तो मुझे सूचित करें',
@@ -1237,15 +1235,6 @@ $1",
 आप गूगल से खोज कर सकते हैं।
 ध्यान रखें कि उनकी {{SITENAME}} सामग्री की सूची पुरानी हो सकती है।',
 
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'बिल्कुल नहीं',
-'qbsettings-fixedleft' => 'स्थिर बाईं ओर',
-'qbsettings-fixedright' => 'स्थिर दाहिनी ओर',
-'qbsettings-floatingleft' => 'अस्थिर बाईं ओर',
-'qbsettings-floatingright' => 'अस्थिर दाहिनी ओर',
-'qbsettings-directionality' => 'निश्चित, आपकी भाषा की लिपि की दिशात्मकता पर निर्भर',
-
 # Preferences page
 'preferences' => 'मेरी वरीयताएँ',
 'mypreferences' => 'पसंद',
@@ -1805,7 +1794,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'http-read-error' => 'एच॰टी॰टी॰पी पढ़ने में त्रुटि।',
 'http-timed-out' => 'एच॰टी॰टी॰पी अनुरोध का समय समाप्त (टाइम आउट)',
 'http-curl-error' => 'यू॰आर॰एल $1 पाने में त्रुटि',
-'http-host-unreachable' => 'यू॰आर॰एल तक पहुँचा नहीं जा सका।',
 'http-bad-status' => 'एच॰टी॰टी॰पी अनुरोध के दौरान समस्या थी: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2211,8 +2199,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'notvisiblerev' => 'किसी अन्य सदस्य द्वारा किया अन्तिम अवतरण हटाया गया है',
 'watchnochange' => 'दिये गये समय में आपके ध्यानसूची में मौजूद पृष्ठों में कोई भी बदलाव नहीं हुए हैं।',
 'watchlist-details' => 'वार्ता पृष्ठों के अलावा {{PLURAL:$1|$1 पृष्ठ}} आपकी ध्यानसूची में हैं।',
-'wlheader-enotif' => 'ई-मेल नोटिफिकेशन सक्षम हैं।',
-'wlheader-showupdated' => "पृष्ठ जो आपके द्वारा देखे जाने के बाद बदले गये हैं, '''बोल्ड''' दिखेंगे।",
+'wlheader-enotif' => 'ई-मेल नोटिफिकेशन सक्षम हैं।',
+'wlheader-showupdated' => "पृष्ठ जो आपके द्वारा देखे जाने के बाद बदले गये हैं, '''बोल्ड''' दिखेंगे।",
 'watchmethod-recent' => 'ध्यानसूची में दिये गये पृष्ठों में हाल में हुए बदलाव देख रहे हैं',
 'watchmethod-list' => 'ध्यानसूची में दिये गये पृष्ठों में हाल में हुए बदलाव देख रहे हैं',
 'watchlistcontains' => 'आपकी ध्यानसूची में $1 {{PLURAL:$1|पृष्ठ}} हैं।',
@@ -3105,7 +3093,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौडाई',
 'exif-imagelength' => 'ऊँचाई',
 'exif-bitspersample' => 'प्रति घटक बीट्स',
@@ -3282,7 +3270,7 @@ $1',
 'exif-originalimageheight' => 'छवि की ऊँचाई उभरा होने से पहले',
 'exif-originalimagewidth' => 'छवि की चौड़ाई उभरा होने से पहले',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'अनकॉम्प्रेस्स्ड',
 'exif-compression-3' => 'CCITT ग्रुप 3 फ़ैक्स एनकोडिंग',
 'exif-compression-4' => 'CCITT ग्रुप 4 फ़ैक्स एनकोडिंग',
@@ -3724,13 +3712,6 @@ $5
 'version-software-version' => 'अवतरण',
 'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
-# Special:FilePath
-'filepath' => 'सञ्चिका पथ',
-'filepath-page' => 'सञ्चिका:',
-'filepath-submit' => 'जाइए',
-'filepath-summary' => 'यह विशेष पृष्ठ सञ्चिका का पूरा पथ देता है।
-चित्र पूरे रिज़ोल्यूशन के साथ दिखता हैं, अन्य सञ्चिका प्रकार उनके सम्बन्धित प्रोग्रेम डाइरेक्टरी से आरम्भ होते हैं।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'फ़ाईल द्विरावृत्ति खोजें',
 'fileduplicatesearch-summary' => 'हैश वैल्यू के अनुसार फ़ाईल की द्विरावृत्ति खोजें।',
index fe473fb..b36a153 100644 (file)
@@ -65,8 +65,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ketna sadasya dekhe hai ke number dekhao',
 'tog-oldsig' => 'Abhi ke signature:',
 'tog-fancysig' => 'Signature ke wikitext ke rakam dekho (binaa automatic jorr se)',
-'tog-externaleditor' => 'Apne se bahaari editor ke kaam me lao (khaali chalaak logan khatir, computer me special settings ke jaruri hai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => ' Apne se bahaari editor ke kaam me lao (khaali chalaak logan khatir, computer me special settings ke jaruri hai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => '"jump to" accessibility jorr ke laabu karo',
 'tog-uselivepreview' => 'Jinda jhalak ke kaam me lao (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Ek khali badlao waala summary ke likhe ke time hamse puchho',
@@ -468,7 +466,7 @@ Aapan [[Special:Preferences|{{SITENAME}} pasand]]  ke badle nai bhulna.',
 'gotaccount' => "Aap ke pas pahile se account hai ki nai? '''$1'''.",
 'gotaccountlink' => 'Log in',
 'userlogin-resetlink' => 'Ka aap aapan login kare waala jaankari ke bhulae gaya hae?',
-'createaccountmail' => 'e-mail se',
+'createaccountmail' => 'Ek temporary password ke kaam me laao aur iske niche dekhawa gais Email pe bhej do',
 'createaccountreason' => 'Kaaran:',
 'badretype' => 'Jon duuno password aap likha hai uu ek rakam nai hae.',
 'userexists' => 'Ii sadasya ke naam aur koi ke hae.
@@ -513,8 +511,8 @@ Agar jo aur koi ii request karis hai, nai to aap aapan password yaad kar liya ha
 'passwordsent' => 'Ek nawaa password ke "$1" ke registered e-mail pe bheja gais hai. Meharbaani kar ke aap password mile ke baad login karna.',
 'blocked-mailpassword' => 'Aap ke IP address ke block kar dewa gais hai, aur iske kaaran aap ke password recovery function kaam me lae ke ijajat nai hai,',
 'eauthentsent' => 'Ek confirmation e-mail aap ke dewa gae e-mail address be bhej dewa gais hai. Aur mail ii account pe bheje se pahile e-mail me likha instructions ke follow karo, ii confirm kare ke khatir ki account aap ke hai.',
-'throttled-mailpassword' => 'Ek password reminder ke pichhle {{PLURAL:$1|hour|$1 hours}} me bhej dewa gais hai.
-Abuse ke roke ke khatir, khali ek password reminer har {{PLURAL:$1|hour|$1 hours}} me bheja jaai.',
+'throttled-mailpassword' => 'Ek password reset Email ke pahile bheja gais hae, pichhle  {{PLURAL:$1|ghanta|$1 ghanta}} me bhej me.
+Abuse ke roke ke khatir, khali ek password reminer har {{PLURAL:$1|ghanta|$1 ghanta}} me bheja jaai.',
 'mailerror' => 'Mail bheje me galti hoe gais hai: $1',
 'acct_creation_throttle_hit' => 'Ii wiki me visitors log aap ke IP address ke use kar ke {{PLURAL:$1|1 account|$1 accounts}}, pichhle kuch din me, banae liin hai, jis se jaada ii time nai banawa jaae sake hai.
 Ii kaaran se visitors log jon ki ii IP address use kare hai, ke aur account banae ke ijajat nai hai.',
@@ -543,6 +541,7 @@ Thora deri baad fir se kosis karna.',
 # Email sending
 'php-mail-error-unknown' => 'PHP ke mail() function me koi anjaan kharaabi hae',
 'user-mail-no-addy' => 'Bina e-mail address rahe pe bhi e-mail bheje ke kosis karaa gais hae.',
+'user-mail-no-body' => 'Ek khaali, nai to kaafi chhota email bheje ke kosis kara rahaa.',
 
 # Change password dialog
 'resetpass' => 'Password ke badlo',
@@ -565,7 +564,7 @@ Sait aap password ke safalta se badal sia hoga nai to nawaa temporary password k
 
 # Special:PasswordReset
 'passwordreset' => 'Password ke badlo',
-'passwordreset-text' => 'Aapan account ke baare me jaankari ke receive kare ke khatir ii fom ke bharo.',
+'passwordreset-text' => 'Password ke reset kare ke khatir ii form ke bharo.',
 'passwordreset-legend' => 'Password ke badlo',
 'passwordreset-disabled' => 'II wiki me password ke badle ke ijaajat nai hae.',
 'passwordreset-pretext' => '{{PLURAL:$1||Niche ke ek data ke likho}}',
@@ -1101,15 +1100,6 @@ Aapan query ke ''all:'' se suruu kar ke visay suchi me khojo (including talk pag
 Aap tab tak Google se khoje sakta hai.
 Yaad rakhna ki uu log ke {{SITENAME}} ke index saait purana hoi.',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Koi nai',
-'qbsettings-fixedleft' => 'Left me fixed hai',
-'qbsettings-fixedright' => 'Right me fixed hai',
-'qbsettings-floatingleft' => 'Baaen or baho',
-'qbsettings-floatingright' => 'Daaen or baho',
-'qbsettings-directionality' => 'Banae dewa gais hae, lekin ii aap ke bhasa ke script directionality ke uppar nibhar hae',
-
 # Preferences page
 'preferences' => 'Pasand',
 'mypreferences' => 'Pasand',
@@ -1654,7 +1644,6 @@ Puura surakchha ke khatir, img_auth.php ke band kar dewa gais hae.',
 'http-read-error' => 'HTTP ke parrhe me galti hae',
 'http-timed-out' => 'HTTP ke khatir time nai hae.',
 'http-curl-error' => 'URL ke laawe me galti hoe gais hae: $1',
-'http-host-unreachable' => 'URL pahunche nai sakaa hae',
 'http-bad-status' => 'HTTP ke maange ke time kuch garrbarr hoe gais hae: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2063,8 +2052,8 @@ Ii panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae.
 'notvisiblerev' => 'Badlao ke mitae dewa gais hai',
 'watchnochange' => 'Aap ke koi bhi dhyan me rakkhaa gae chij ke ii time me badla nai gais hai.',
 'watchlist-details' => '{{PLURAL:$1|$1 panna|$1 panna}} pe dhyan dewa jae hai, baat waala panna ke chhorr ke.',
-'wlheader-enotif' => 'E-mail notification ke enable kar dewa gais hai.',
-'wlheader-showupdated' => "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa gais hai",
+'wlheader-enotif' => 'E-mail notification ke enable kar dewa gais hai.',
+'wlheader-showupdated' => "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa gais hai",
 'watchmethod-recent' => 'Dhyan me rakkhaa gais panna ke nawaa badlao ke check karaa jaawe hai',
 'watchmethod-list' => 'dhyan me rakkha gais panna ke nawaa badlao ke khatir check karaa jaawe hai',
 'watchlistcontains' => 'Aap ke dhyan suchi me  $1 {{PLURAL:$1|panna|panna}} hai.',
@@ -2850,6 +2839,7 @@ Ii saait ii kaaran se hoi ki panna ke ek jorr koi blacklisted external site se h
 'pageinfo-robot-noindex' => 'Indexable nai hae',
 'pageinfo-views' => 'Ketna dafe dekha gais hae',
 'pageinfo-watchers' => 'Ketnaa jane panna ke dekhe hae',
+'pageinfo-few-watchers' => '$1 {{PLURAL:$1|watcher|watchers}} se kamtii log hae',
 'pageinfo-redirects-name' => 'Ii panna pe redirect karo',
 'pageinfo-subpages-name' => 'Ii panna ke subpage',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})',
@@ -2977,7 +2967,7 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Chaurrai',
 'exif-imagelength' => 'Unchai',
 'exif-bitspersample' => 'Bits per component',
@@ -3184,9 +3174,6 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
 'version-other' => 'Duusra',
 'version-poweredby-others' => 'duusra waala',
 
-# Special:FilePath
-'filepath-submit' => 'Jaao',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'File ke naam:',
 'fileduplicatesearch-submit' => 'Khojo',
index 7b38419..28f3ee3 100644 (file)
@@ -48,8 +48,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang numero sang mga nagalantaw nga manug-gamit',
 'tog-oldsig' => 'Nagapabilin nga pirma:',
 'tog-fancysig' => 'Tratoha ang pirma bilang wikitext (wala sang tabid nga dayon)',
-'tog-externaleditor' => 'Gamiton dayon ang pang-guha nga manug-ilis (para sa mga sagad lamang, nagakinahanglan sang espesyal nga pagkay-o sa imo computer. [//www.mediawiki.org/wiki/Manual:External_editors Mas madamo pa nga impormasyon.])',
-'tog-externaldiff' => 'Gamiton dayon ang pang-guha nga diff (para sa mga sagad lamang, nagakinahanglan sang espesyal nga pagkay-o sa imo computer. [//www.mediawiki.org/wiki/Manual:External_editors Mas madamo pa nga impormasyon.])',
 'tog-showjumplinks' => 'Sugtan ang "maglumpat sa" nga mga tabid sang paalagyan',
 'tog-uselivepreview' => 'Gamiton ang preview nga live (nagakinahanglan sang JavaScript) (experimentohanon)',
 'tog-forceeditsummary' => 'Sugidi ako kon magasulod ako sa blanko nga kabilogan sang pag-ilis',
@@ -1110,15 +1108,6 @@ Testingan mo i-prefiks ang imo pamangkot upod sang ''tanan:'' para makita mo ang
 Mahimo ka nga magpangita gamit ang Google sa sini nga tion.
 Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga madaan na.',
 
-# Quickbar
-'qbsettings' => 'Bar nga mahapos',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Gintadlong sa wala',
-'qbsettings-fixedright' => 'Gintadlong sa too',
-'qbsettings-floatingleft' => 'Nagalutaw sa wala',
-'qbsettings-floatingright' => 'Nagalutaw sa too',
-'qbsettings-directionality' => 'Indi na maliwat, depende sa direksyon sang iskrip sang imo lenggwahe',
-
 # Preferences page
 'preferences' => 'Mga Ginabasehan',
 'mypreferences' => 'Mga Ginabasehan',
@@ -1900,7 +1889,7 @@ Ang iban ay pagataguon sang default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-lightsource' => 'Ginghalinan sang sanag',
 'exif-flash' => 'Igpat',
 'exif-subjectarea' => 'Subject area',
index 88215c4..7b884dd 100644 (file)
@@ -22,6 +22,7 @@
  * @author MayaSimFan
  * @author Meno25
  * @author Mvrban
+ * @author Nemo bis
  * @author Roberta F.
  * @author SpeedyGonsales
  * @author Tivek
@@ -343,8 +344,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj suradnika koji prate stranicu (u nedavnim izmjenama, popisu praćenja i samim člancima)',
 'tog-oldsig' => 'Pregled postojećeg potpisa:',
 'tog-fancysig' => 'Običan potpis kao wikitekst (bez automatske poveznice)',
-'tog-externaleditor' => 'Uvijek koristi vanjski program za uređivanje (samo za napredne, potrebne su posebne postavke na računalu. [//www.mediawiki.org/wiki/Manual:External_editors Dodatne informacije.])',
-'tog-externaldiff' => 'Uvijek koristi vanjski program za usporedbu (samo za napredne, potrebne su posebne postavke na računalu. [//www.mediawiki.org/wiki/Manual:External_editors Dodatne informacije.])',
 'tog-showjumplinks' => 'Uključi pomoćne poveznice "Skoči na"',
 'tog-uselivepreview' => 'Uključi trenutačni pretpregled (JavaScript) (eksperimentalno)',
 'tog-forceeditsummary' => 'Podsjeti me ako sažetak uređivanja ostavljam praznim',
@@ -358,6 +357,7 @@ $messages = array(
 'tog-diffonly' => 'Ne prikazuj sadržaj stranice prilikom usporedbe inačica',
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-norollbackdiff' => 'Izostavi razliku nakon upotrebe ukloni',
+'tog-useeditwarning' => 'Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena',
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
@@ -430,7 +430,7 @@ $messages = array(
 'category-empty' => "''U ovoj kategoriji trenutačno nema članaka ni medija.''",
 'hidden-categories' => '{{PLURAL:$1|Skrivena kategorija|Skrivene kategorije|Skrivenih kategorija}}',
 'hidden-category-category' => 'Skrivene kategorije',
-'category-subcat-count' => '{{PLURAL:$2|Ova kategorija ima samo sljedeću podkategoriju.|Ova kategorija ima {{PLURAL:$1|podkategoriju|$1 podkategorije|$1 podkategorija}}, od njih $2 ukupno.}}',
+'category-subcat-count' => 'Ova kategorija sadrži $2 {{PLURAL:$2|podkategoriju|podkategorije|podkategorija}}, ovaj popis prikazuje $1.',
 'category-subcat-count-limited' => 'Ova kategorija ima {{PLURAL:$1|podkategoriju|$1 podkategorije|$1 podkategorija}}.',
 'category-article-count' => '{{PLURAL:$2|Ova kategorija sadrži $2 članak.|{{PLURAL:$1|Prikazano je $1 članak|Prikazana su $1 članka|Prikazano je $1 članaka}} od njih $2 ukupno.}}',
 'category-article-count-limited' => '{{PLURAL:$1|stranica je|$1 stranice su|$1 stranica je}} u ovoj kategoriji.',
@@ -491,7 +491,7 @@ $messages = array(
 'history' => 'Stare izmjene',
 'history_short' => 'Stare izmjene',
 'updatedmarker' => 'obnovljeno od zadnjeg posjeta',
-'printableversion' => 'Verzija za ispis',
+'printableversion' => 'Inačica za ispis',
 'permalink' => 'Trajna poveznica',
 'print' => 'Ispiši',
 'view' => 'Vidi',
@@ -834,10 +834,8 @@ Možda ste već uspješno promijenili Vašu lozinku ili ste zatražili novu priv
 
 # Special:PasswordReset
 'passwordreset' => 'Ponovno postavi lozinku',
-'passwordreset-text' => 'Ispunite ovaj obrazac da biste dobili e-mail podsjetnik o vašim detaljima računa.',
 'passwordreset-legend' => 'Poništi lozinku',
 'passwordreset-disabled' => 'Poništavanje lozinke je onemogućeno na ovom wikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan od dijelova podataka u nastavku}}',
 'passwordreset-username' => 'Suradničko ime:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'Pogledati krajnju poruku?',
@@ -979,7 +977,7 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'userpage-userdoesnotexist-view' => 'Suradnički račun "$1" nije registriran.',
 'blocked-notice-logextract' => 'Ovaj suradnik je trenutačno blokiran.
 Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
-'clearyourcache' => "'''Napomena:''' Nakon snimanja možda ćete trebate očistiti međuspremnik svog preglednika kako biste vidjeli promjene.
+'clearyourcache' => "'''Napomena:''' Nakon snimanja ćete možda trebati očistiti međuspremnik svog preglednika kako biste vidjeli promjene.
 * '''Firefox / Safari:''' držite ''Shift'' i pritisnite ''Reload'', ili pritisnite bilo ''Ctrl-F5'' ili ''Ctrl-R'' (''Command-R'' na Macu)
 * '''Google Chrome:''' pritisnite ''Ctrl-Shift-R'' (''Command-Shift-R'' na Macu)
 * '''Internet Explorer:''' držite ''Ctrl'' i kliknite ''Refresh'', ili pritisnite ''Ctrl-F5''
@@ -1076,6 +1074,8 @@ Stranica već postoji.',
 'content-failed-to-parse' => "Obrada (''parsiranje'') formata $2 za model $1 nije uspjela: $3",
 'invalid-content-data' => 'Nevaljani sadržaj',
 'content-not-allowed-here' => 'Sadržaj napisan u obliku "$1"-a nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Napuštanje ove stranice može uzrokovati gubitak svake izmjene koju ste napravili.
+Možete onemogućiti ovo upozorenje u odjeljku "{{int:prefs-editing}}" Vaših postavki.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1356,15 +1356,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-external' => 'Vanjski pretraživač',
 'searchdisabled' => '<p>Oprostite! Pretraga po cjelokupnoj bazi je zbog bržeg rada projekta {{SITENAME}} trenutačno onemogućena. Možete se poslužiti tražilicom Google.</p>',
 
-# Quickbar
-'qbsettings' => 'Traka',
-'qbsettings-none' => 'Bez',
-'qbsettings-fixedleft' => 'Lijevo nepomično',
-'qbsettings-fixedright' => 'Desno nepomično',
-'qbsettings-floatingleft' => 'Lijevo leteće',
-'qbsettings-floatingright' => 'Desno leteće',
-'qbsettings-directionality' => 'Fiksno, ovisno o smjeru pisma Vašeg jezika',
-
 # Preferences page
 'preferences' => 'Postavke',
 'mypreferences' => 'Moje postavke',
@@ -1897,7 +1888,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'http-read-error' => 'Pogrješka pri čitanju HTTP.',
 'http-timed-out' => 'HTTP zahtjev je istekao.',
 'http-curl-error' => 'Pogrješka pri otvaranju URL-a: $1',
-'http-host-unreachable' => 'URL nije dostupan.',
 'http-bad-status' => 'Došlo je do problema tijekom HTTP zahtjeva: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1987,7 +1977,7 @@ Možda želite urediti njen opis na [$2 stranici opisa datoteke].',
 'filedelete-success' => "Datoteka '''$1''' je izbrisana.",
 'filedelete-success-old' => "Inačica datoteke '''[[Media:$1|$1]]''' od $3, $2 je obrisana.",
 'filedelete-nofile' => "'''$1''' ne postoji.",
-'filedelete-nofile-old' => "Nema arhivirane verzije datoteke '''$1''' s zadanim parametrima.",
+'filedelete-nofile-old' => "Nema arhivirane inačice datoteke '''$1''' sa zadanim parametrima.",
 'filedelete-otherreason' => 'Drugi/dodatni razlog:',
 'filedelete-reason-otherlist' => 'Drugi razlog',
 'filedelete-reason-dropdown' => '*Česti razlozi brisanja
@@ -2302,8 +2292,8 @@ Promjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popi
 'notvisiblerev' => 'Izmjena je obrisana',
 'watchnochange' => 'Niti jedna od praćenih stranica nije promijenjena od Vašeg zadnjeg posjeta.',
 'watchlist-details' => '{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} se nalazi na popisu praćenja, ne brojeći stranice za razgovor.',
-'wlheader-enotif' => 'Uključeno je izvješćivanje e-mailom.',
-'wlheader-showupdated' => "Stranice koje su promijenjene od Vašeg zadnjeg posjeta prikazane su '''podebljano'''",
+'wlheader-enotif' => 'Uključeno je izvješćivanje e-mailom.',
+'wlheader-showupdated' => "Stranice koje su promijenjene od Vašeg zadnjeg posjeta prikazane su '''podebljano'''",
 'watchmethod-recent' => 'provjera nedavnih promjena praćenih stranica',
 'watchmethod-list' => 'provjera praćanih stranica za nedavne promjene',
 'watchlistcontains' => 'Vaš popis praćenja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
@@ -2832,7 +2822,7 @@ Molimo odaberite drugo ime.',
 
 # Export
 'export' => 'Izvezi stranice',
-'exporttext' => 'Možete izvesti tekst i prijašnje promjene jedne ili više stranica uklopljene u XML kod. U budućim verzijama MediaWiki softvera bit će moguće uvesti ovakvu stranicu u neki drugi wiki. Trenutačna verzija to još ne podržava.
+'exporttext' => 'Možete izvesti tekst i prijašnje promjene jedne ili više stranica uklopljene u kȏd XML. U budućim inačicama MediaWiki softvera bit će moguće uvesti ovakvu stranicu u neki drugi wiki. Trenutačna inačica to još ne podržava.
 
 Za izvoz stranica unesite njihove naslove u polje ispod, jedan naslov po retku, i označite želite li trenutačnu inačicu zajedno sa svim prijašnjima, ili samo trenutačnu inačicu s informacijom o zadnjoj promjeni.
 
@@ -3091,12 +3081,8 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
 'pageinfo-protect-cascading-from' => 'Prenosiva zaštita počinje od',
 
 # Skin names
-'skinname-standard' => 'Standardna',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kölnska plava',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označi za pregledano',
@@ -3206,7 +3192,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Visina',
 'exif-bitspersample' => 'Dubina boje',
@@ -3384,7 +3370,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
 'exif-originalimageheight' => 'Visina slike prije nego što je obrezana',
 'exif-originalimagewidth' => 'Širina slike prije nego što je obrezana',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nesažeto',
 'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeno Huffmanovo šifriranje po dužini',
 'exif-compression-3' => 'CCITT Grupa 3 faks kodiranje',
@@ -3853,13 +3839,6 @@ Trebali ste primiti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju GNU opće javne lic
 'version-entrypoints-header-entrypoint' => 'Početna adresa',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica daje Vam kompletnu putanju do neke datoteke.
-Slike se na taj način prikazuju u punoj rezoluciji, a drugi tipovi datoteka se otvaraju na klik (kako je već namješteno u Vašem operacijskom sustavu).',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Traži kopije datoteka',
 'fileduplicatesearch-summary' => 'Traži kopije datoteka na temelju njihove hash vrijednosti.',
index f8ea051..156f504 100644 (file)
@@ -11,6 +11,7 @@
  * @author J budissin
  * @author Kaganer
  * @author Michawiki
+ * @author Nemo bis
  * @author Shirayuki
  * @author Tchoř
  * @author Tlustulimu
@@ -184,8 +185,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ličbu wobkedźbowacych wužiwarjow pokazać',
 'tog-oldsig' => 'Eksistowaca signatura:',
 'tog-fancysig' => 'Ze signaturu kaž z wikitekstom wobchadźeć  (bjez awtomatiskeho wotkaza)',
-'tog-externaleditor' => 'Eksterny editor jako standard wužiwać (jenož za ekspertow, žada sej specialne nastajenja na wašim ličaku. [//www.mediawiki.org/wiki/Manual:External_editors Dalše informacije.])',
-'tog-externaldiff' => 'Eksterny diff-program jako standard wužiwać (jenož za ekspertow, žada sej specialne nastajenja na wašim ličaku. [//www.mediawiki.org/wiki/Manual:External_editors Dalše informacije.])',
 'tog-showjumplinks' => 'Wotkazy typa „dźi do” zmóžnić',
 'tog-uselivepreview' => 'Live-přehlad wužiwać (wužaduje sej JavaScript) (eksperimentalny)',
 'tog-forceeditsummary' => 'Mje skedźbnić, jeli zabudu zjeće',
@@ -199,6 +198,7 @@ $messages = array(
 'tog-diffonly' => 'Jenož rozdźěle pokazać (nic pak zbytny wobsah)',
 'tog-showhiddencats' => 'Schowane kategorije pokazać',
 'tog-norollbackdiff' => 'Rozdźěl po wróćostajenju zanjechać',
+'tog-useeditwarning' => 'Warnować, hdyž so wobdźěłowanska strona z njeskładowanymi změnami wopušća',
 
 'underline-always' => 'Přeco',
 'underline-never' => 'Ženje',
@@ -565,8 +565,14 @@ Wobkedźbuj, zo so někotre strony dale jewja, kaž by hišće přizjewjeny był
 'welcomecreation-msg' => 'Twoje konto bu wutworjene.
 Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENAME}}}}]] změnić.',
 'yourname' => 'Wužiwarske mjeno:',
+'userlogin-yourname' => 'Wužiwarske mjeno',
+'userlogin-yourname-ph' => 'Zapodaj swoje wužiwarske mjeno',
 'yourpassword' => 'Hesło:',
+'userlogin-yourpassword' => 'Hesło',
+'userlogin-yourpassword-ph' => 'Zapodaj swoje hesło',
+'createacct-yourpassword-ph' => 'Zapodaj hesło',
 'yourpasswordagain' => 'Hesło znowa zapodać:',
+'createacct-yourpasswordagain' => 'Hesło wobkrućić',
 'remembermypassword' => 'Na tutym ličaku přizjewjeny wostać (za maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})',
 'securelogin-stick-https' => 'Po přizjewjenju z HTTPS zwjazany wostać',
 'yourdomainname' => 'Twoja domejna:',
@@ -586,8 +592,13 @@ Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENA
 'gotaccount' => 'Maš hižo wužiwarske konto? $1.',
 'gotaccountlink' => 'Přizjewić',
 'userlogin-resetlink' => 'Přizjewjenske daty zabył?',
+'createacct-emailrequired' => 'E-mejlowa adresa',
 'createaccountmail' => 'Nachwilne přidatne hesło wužiwać a jo na slědowacu e-mejlowu adresu pósłać',
 'createaccountreason' => 'Přičina:',
+'createacct-reason' => 'Přičina',
+'createacct-imgcaptcha-ph' => 'Zapodaj tekst, kotryž deleka widźiš',
+'createacct-benefit-body1' => 'změny',
+'createacct-benefit-body2' => 'strony',
 'badretype' => 'Hesle, kotrejž sy zapodał, so njekryjetej.',
 'userexists' => 'Wužiwarske mjeno, kotrež sy zapodał, so hižo wužiwa.
 Prošu wubjer druhe mjeno.',
@@ -672,10 +683,8 @@ Snano sy swoje hesło hižo wuspěšnje změnił abo nowe nachwilne hesło poža
 
 # Special:PasswordReset
 'passwordreset' => 'Hesło wróćo stajić',
-'passwordreset-text' => 'Wupjelń tutón formular, zo by swoje hesło anulował.',
 'passwordreset-legend' => 'Hesło wróćo stajić',
 'passwordreset-disabled' => 'Wróćostajenje hesłow je so na  tutym wikiju znjemóžniło.',
-'passwordreset-pretext' => '{{PLURAL:$1||Zapodaj deleka jedne ze slědowacych datowych podaćow}}',
 'passwordreset-username' => 'Wužiwarske mjeno:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'E-mejlku sej wobhladać?',
@@ -698,7 +707,7 @@ Ty měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tut
 Nachwilne hesło: $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 wužiwarjej je so njeporadźiło: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mejlowu adresu změnić',
@@ -898,12 +907,14 @@ Njeje žane wujasnjenje podała.',
 Zda so, zo je hîžo wušmórnjena.',
 'edit-conflict' => 'Wobdźěłanski konflikt.',
 'edit-no-change' => 'Waše wobdźěłanje bu ignorowane, dokelž tekst njebu zm,ěnjeny.',
+'postedit-confirmation' => 'Twoja změna je so składowała.',
 'edit-already-exists' => 'Njebě móžno nowu stronu wutworić.
 Eksistuje hižo.',
 'defaultmessagetext' => 'Standardny tekst zdźělenki',
 'content-failed-to-parse' => 'Parsowanje wobsaha $2 za model $1 je so njeporadźiło: $3',
 'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
 'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
+'editwarning-warning' => 'Hdyž so strona wopušća, móžeja so změny zhubić, kotrež sy přewjedł. Jeli sy přizjewjeny, móžeš tute warnowanje we wotrězku {{int:prefs-editing}} swojich nastajenjow znjemóžnić.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1183,15 +1194,6 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
 'search-external' => 'Eksterne pytanje',
 'searchdisabled' => 'Pytanje w {{GRAMMAR:lokatiw|{{SITENAME}}}} tuchwilu móžne njeje. Móžeš mjeztym z Google pytać. Wobkedźbuj, zo móža wuslědki z wobsaha {{GRAMMAR:genitiw|{{SITENAME}}}} zestarjene być.',
 
-# Quickbar
-'qbsettings' => 'Pobóčna lajsta',
-'qbsettings-none' => 'Žane',
-'qbsettings-fixedleft' => 'Leži nalěwo',
-'qbsettings-fixedright' => 'Leži naprawo',
-'qbsettings-floatingleft' => 'Wisa nalěwo',
-'qbsettings-floatingright' => 'Wisa naprawo',
-'qbsettings-directionality' => 'Kruty, wotwisny wot pisanskeho směra twojeje rěče',
-
 # Preferences page
 'preferences' => 'Nastajenja',
 'mypreferences' => 'Nastajenja',
@@ -1503,9 +1505,9 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'rc-old-title' => 'prěnjotnje wutworjeny jako "$1"',
 
 # Recent changes linked
-'recentchangeslinked' => 'Změny w zwjazanych stronach',
+'recentchangeslinked' => 'Změny na zwjazanych stronach',
 'recentchangeslinked-feed' => 'Změny zwjazanych stron',
-'recentchangeslinked-toolbox' => 'Změny w zwjazanych stronach',
+'recentchangeslinked-toolbox' => 'Změny na zwjazanych stronach',
 'recentchangeslinked-title' => 'Změny na stronach, kotrež su z „$1“ wotkazane',
 'recentchangeslinked-noresult' => 'Njejsu změny zwajzanych stron we wubranej dobje.',
 'recentchangeslinked-summary' => "Tuta strona nalistuje poslednje změny na wotkazanych stronach (resp. pola kategorijow na čłonach kategorije).
@@ -1744,7 +1746,6 @@ Za optimalnu wěstotu je img_auth.php znjemóžnjeny.',
 'http-read-error' => 'Čitanski zmylk HTTP.',
 'http-timed-out' => 'Naprašowanje HTTP je čas překročiło.',
 'http-curl-error' => 'Zmylk při wołanju URL: $1',
-'http-host-unreachable' => 'URL njeda so docpěć.',
 'http-bad-status' => 'Problem je za HTTP-naprašowanje wustupił: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2145,8 +2146,8 @@ Přichodne změny tuteje strony a přisłušneje diskusijneje strony budu so tam
 'notvisiblerev' => 'Wersija bu wušmórnjena',
 'watchnochange' => 'Žana z twojich wobkedźbowanych stron njebu w podatej dobje wobdźěłana.',
 'watchlist-details' => '{{PLURAL:$1|$1 wobkedźbowana strona|$1 wobkedźbowanej stronje|$1 wobkedźbowane strony|$1 wobkedźbowanych stronow}}, diskusijne strony wuwzate.',
-'wlheader-enotif' => 'E-mejlowe zdźělenje je zmóžnjene.',
-'wlheader-showupdated' => 'Strony, kotrež buchu po twojim poslednim wopyće změnjene so <b>tučne</b> pokazuja.',
+'wlheader-enotif' => 'E-mejlowe zdźělenje je zmóžnjene.',
+'wlheader-showupdated' => 'Strony, kotrež buchu po twojim poslednim wopyće změnjene so <b>tučne</b> pokazuja.',
 'watchmethod-recent' => 'Aktualne změny za wobkedźbowane strony přepruwować',
 'watchmethod-list' => 'Wobkedźbowanki za aktualnymi změnami přepruwować',
 'watchlistcontains' => 'Maš $1 {{PLURAL:$1|stronu|stronje|strony|stronow}} w swojich wobkedźbowankach.',
@@ -2544,6 +2545,7 @@ Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.'
 'sorbs' => 'SORBS DNSbl',
 'sorbsreason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana.',
 'sorbs_create_account_reason' => 'Twoja IP-adresa je jako wotewrjeny proksy na DNSBL {{GRAMMAR:genitiw|{{SITENAME}}}} zapisana. Njemóžeš konto wutworić.',
+'xffblockreason' => 'IP-adresa w header X-Forwarded-For, pak twoja pak ta proksy-serwera, kotryž wužiwaš, je so zablokowała. Prěnjotna přičina za blokowanje bě: $1',
 'cant-block-while-blocked' => 'Njemóžeš druhich wužiwarjow blokować, mjeztym zo ty sy zablokowany.',
 'cant-see-hidden-user' => 'Wužiwar, kotrehož pospytuješ blokować, bu hižo zablokowany a schowany. Dokelž nimaš prawo wužiwarja schować, njemóžeš blokowanje wužiwarja widźeć abo wobdźěłać.',
 'ipbblocked' => 'Njemóžeš druhich wužiwarjow blokować abo wotblokować, dokelž ty sam sy zablokowany',
@@ -2917,13 +2919,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'pageinfo-category-files' => 'Ličba datajow',
 
 # Skin names
-'skinname-standard' => 'Klasiski',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kölnjanska módrina',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Ćipka',
-'skinname-simple' => 'Jednory',
 'skinname-modern' => 'Moderny',
 
 # Patrolling
@@ -3001,11 +2998,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 mjeńšinu|$1 mjeńšinomaj|$1 mjeńšinami|$1 mjeńšinami}}',
 'hours' => '{{PLURAL:$1|$1 hodźinu|$1 hodźinomaj|$1 hodźinami|$1 hodźinami}}',
 'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjomaj|$1 dnjemi|$1 dnjemi}}',
+'weeks' => '{{PLURAL:$1|$1 tydźeń|$1 njedźeli|$1 njedźele|$1 njedźel}}',
 'months' => '{{PLURAL:$1|$1 měsacom|$1 měsacomaj|$1 měsacami}}',
 'years' => '{{PLURAL:$1|$1 lětom|$1 lětomaj|$1 lětami}}',
 'ago' => 'před $1',
 'just-now' => 'runje',
 
+# Human-readable timestamps
+'hours-ago' => 'před $1 {{PLURAL:$1|hodźinu|hodźinomaj|hodźinami|hodźinami}}',
+'minutes-ago' => 'před $1 {{PLURAL:$1|mjeńšinu|mjeńšinomaj|mjeńšinami|mjeńšinami}}',
+'seconds-ago' => 'před $1 {{PLURAL:$1|sekundu|sekundomaj|sekundami|sekundami}}',
+'monday-at' => 'Póndźela $1',
+'tuesday-at' => 'Wutora $1',
+'wednesday-at' => 'Srjeda $1',
+'thursday-at' => 'Štwórtk $1',
+'friday-at' => 'Pjatk $1',
+'saturday-at' => 'Sobota $1',
+'sunday-at' => 'Njedźela $1',
+'yesterday-at' => 'Wčera $1',
+
 # Bad image list
 'bad_image_list' => 'Format:
 
@@ -3032,7 +3043,7 @@ Nasledne wotkazy na samsnej lince definuja wuwzaća, hdźež so wobraz smě naje
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šěrokosć',
 'exif-imagelength' => 'Wysokosć',
 'exif-bitspersample' => 'Bitow na barbowu komponentu',
@@ -3210,7 +3221,7 @@ Nasledne wotkazy na samsnej lince definuja wuwzaća, hdźež so wobraz smě naje
 'exif-originalimageheight' => 'Wysokosć wobraza před přitřihowanjom',
 'exif-originalimagewidth' => 'Šěrokosć wobraza před přitřihowanjom',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Njekomprimowany',
 'exif-compression-2' => 'CCITT skupina 3 jednodimensionalne modificěrowane kodowanje Huffman běhoweje dołhosće',
 'exif-compression-3' => 'CCITT skupina 3 faksowe kodowanje',
@@ -3618,13 +3629,6 @@ Ty měł [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licency GNU General Public Lic
 'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Datajowy puć',
-'filepath-page' => 'Dataja:',
-'filepath-submit' => 'Pytać',
-'filepath-summary' => 'Tuta specialna strona wróća dospołny puć aktualneje datajoweje wersije.
-Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym programom startuja.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dwójne dataje pytać',
 'fileduplicatesearch-summary' => 'Pytanje za duplikatnymi datajemi na zakładźe jich hašoweje hódnoty.',
@@ -3714,6 +3718,8 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
 'htmlform-submit' => 'Wotpósłać',
 'htmlform-reset' => 'Změny cofnyć',
 'htmlform-selectorother-other' => 'Druhe',
+'htmlform-no' => 'Ně',
+'htmlform-yes' => 'Haj',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 połnotekstowe pytanje podpěruje.',
index ef8f3eb..433c889 100644 (file)
@@ -171,8 +171,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Montre kantite itlizatè k’ap swiv',
 'tog-oldsig' => 'Gade pou wè siyati ki egziste deja:',
 'tog-fancysig' => 'Konsidere siyati sa tankou yon wikitèks (san lyen ki ta otomatik)',
-'tog-externaleditor' => 'Itilize editè ki pa nan sistèm wikimedya pa defo',
-'tog-externaldiff' => 'Itilize yon konparatè ki pa nan sitsèm wikimedya pa defo',
 'tog-showjumplinks' => 'Pèmèt lyen aksesibilite « ale nan »',
 'tog-uselivepreview' => 'Itilize kout je an dirèk (sa mande JavaScrip) (Esperimantal)',
 'tog-forceeditsummary' => 'Notifye m lè m ap antre yon somè modifikasyon vid',
index 178f1e5..2c2803c 100644 (file)
@@ -27,6 +27,7 @@
  * @author Kaganer
  * @author KossuthRad
  * @author Misibacsi
+ * @author Nemo bis
  * @author R-Joe
  * @author Samat
  * @author Sucy
@@ -343,8 +344,6 @@ $messages = array(
 'tog-shownumberswatching' => 'A lapot figyelő szerkesztők számának megjelenítése',
 'tog-oldsig' => 'A jelenlegi aláírás:',
 'tog-fancysig' => 'Az aláírás wikiszöveg (nem lesz automatikusan hivatkozásba rakva)',
-'tog-externaleditor' => 'Külső szerkesztőprogram használata (Csak haladók számára, speciális beállításokra van szükség a számítógépen. [//www.mediawiki.org/wiki/Manual:External_editors További információ angolul.])',
-'tog-externaldiff' => 'Külső diff program használata (Csak haladók számára, speciális beállításokra van szükség a számítógépen. [//www.mediawiki.org/wiki/Manual:External_editors További információ angolul.])',
 'tog-showjumplinks' => 'Helyezzen el hivatkozást („Ugrás”) a beépített eszköztárra',
 'tog-uselivepreview' => 'Élő előnézet használata (JavaScript-alapú, kísérleti)',
 'tog-forceeditsummary' => 'Figyelmeztessen, ha nem adok meg szerkesztési összefoglalót',
@@ -358,6 +357,7 @@ $messages = array(
 'tog-diffonly' => 'Ne mutassa a lap tartalmát a lapváltozatok közötti eltérések megtekintésekor',
 'tog-showhiddencats' => 'Rejtett kategóriák megjelenítése',
 'tog-norollbackdiff' => 'Ne jelenjenek meg az eltérések visszaállítás után',
+'tog-useeditwarning' => 'Figyelmeztessen, ha szerkesztéskor a módosítások mentése nélkül akarom elhagyni a lapot',
 
 'underline-always' => 'mindig',
 'underline-never' => 'soha',
@@ -421,6 +421,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => 'Január $1',
+'february-date' => 'Február $1',
+'march-date' => 'Március $1',
+'april-date' => 'Április $1',
+'may-date' => 'Május $1',
+'june-date' => 'Június $1',
+'july-date' => 'Július $1',
+'august-date' => 'Augusztus $1',
+'september-date' => 'Szeptember $1',
+'october-date' => 'Október $1',
+'november-date' => 'November $1',
+'december-date' => 'December $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategória|Kategória}}',
@@ -577,10 +589,10 @@ További információkat a [[Special:Version|verzióinformációs lapon]] talál
 'youhavenewmessages' => '$1 a vitalapodon! ($2 külön is megtekintheted.)',
 'newmessageslink' => 'új üzenet vár',
 'newmessagesdifflink' => 'az utolsó üzenetet',
-'youhavenewmessagesfromusers' => '$1 a vitalapodon {{PLURAL:$3|egy|$3}} szerkesztőtől! ($2 külön is megtekintheted.)',
+'youhavenewmessagesfromusers' => '$2 kaptál {{PLURAL:$3|egy|$3}} szerkesztőtől $1!',
 'youhavenewmessagesmanyusers' => '$1ed van több szerkesztőtől ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|Új üzenet vár|Új üzenetek várnak}}',
-'newmessagesdifflinkplural' => 'Az utolsó {{PLURAL:$1|változtatást|változtatásokat}}',
+'newmessageslinkplural' => 'a vitalapodon',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|Új üzenetet|Új üzeneteket}}',
 'youhavenewmessagesmulti' => 'Új üzenet vár a(z) $1 wikin',
 'editsection' => 'szerkesztés',
 'editold' => 'szerkesztés',
@@ -723,9 +735,18 @@ Lehetséges, hogy néhány oldalon továbbra is azt látod, be vagy jelentkezve,
 'welcomecreation-msg' => 'A felhasználói fiókod elkészült.
 Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaidat]].',
 'yourname' => 'Szerkesztőneved:',
+'userlogin-yourname' => 'Felhasználónév',
+'userlogin-yourname-ph' => 'Add meg a felhasználóneved',
 'yourpassword' => 'Jelszavad:',
+'userlogin-yourpassword' => 'Jelszó',
+'userlogin-yourpassword-ph' => 'Add meg a jelszavad',
+'createacct-yourpassword-ph' => 'Add meg a jelszavad',
 'yourpasswordagain' => 'Jelszavad ismét:',
+'createacct-yourpasswordagain' => 'Új jelszó megerősítése',
+'createacct-yourpasswordagain-ph' => 'Írd be a jelszót újra',
 'remembermypassword' => 'Emlékezzen rám ezen a számítógépen (legfeljebb $1 napig)',
+'userlogin-remembermypassword' => 'Maradjak bejelentkezve',
+'userlogin-signwithsecure' => 'Biztonságos kapcsolat használata',
 'securelogin-stick-https' => 'Kapcsolódás HTTPS-en keresztül bejelentkezés után is',
 'yourdomainname' => 'A domainneved:',
 'password-change-forbidden' => 'Nem módosíthatod a jelszót ezen a wikin.',
@@ -738,14 +759,29 @@ Ne felejtsd el módosítani a [[Special:Preferences|{{SITENAME}} beállításaid
 'logout' => 'Kijelentkezés',
 'userlogout' => 'Kijelentkezés',
 'notloggedin' => 'Nem vagy bejelentkezve',
+'userlogin-noaccount' => 'Nem rendelkezel még felhasználói fiókkal?',
+'userlogin-joinproject' => 'Csatlakozz a(z) {{SITENAME}} wikihez',
 'nologin' => "Nem rendelkezel még felhasználói fiókkal? '''$1'''.",
 'nologinlink' => 'Itt regisztrálhatsz',
 'createaccount' => 'Regisztráció',
 'gotaccount' => "Ha már korábban regisztráltál, '''$1'''.",
 'gotaccountlink' => 'Bejelentkezés',
 'userlogin-resetlink' => 'Elfelejtetted a bejelentkezési adataidat?',
+'userlogin-resetpassword-link' => 'A jelszó alaphelyzetbe állítása',
+'helplogin-url' => 'Help:Bejelentkezés',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Segítség a bejelentkezéshez]]',
+'createacct-join' => 'Add meg az alábbi információkat.',
+'createacct-emailrequired' => 'E-mail cím',
+'createacct-emailoptional' => 'E-mail cím (opcionáis)',
+'createacct-email-ph' => 'Add meg e-mail címed',
 'createaccountmail' => 'Átmeneti, véletlenszerű jelszó használata és kiküldése az alábbi e-mail címre',
+'createacct-realname' => 'Igazi neved (nem kötelező)',
 'createaccountreason' => 'Indoklás:',
+'createacct-reason' => 'Indoklás',
+'createacct-reason-ph' => 'Miért hozol létre egy másik fiókot',
+'createacct-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',
 'badretype' => 'A megadott jelszavak nem egyeznek.',
 'userexists' => 'A megadott felhasználónév már foglalt.
 Kérlek, válassz másikat!',
@@ -837,30 +873,29 @@ Lehet, hogy már sikeresen megváltoztattad a jelszavad, vagy pedig időközben
 
 # Special:PasswordReset
 'passwordreset' => 'Jelszó törlése',
-'passwordreset-text' => 'Az alábbi űrlap kitöltése után egy értesítő e-mailt kapsz a fiókod adataival.',
 'passwordreset-legend' => 'Új jelszó kérése',
 'passwordreset-disabled' => 'Új jelszó kérése nem engedélyezett ezen a wikin.',
-'passwordreset-pretext' => '{{PLURAL:$1||Írd be az alábbi adatok egyikét}}',
+'passwordreset-emaildisabled' => 'Az e-mail funkció le van tiltva ezen a wikin.',
 'passwordreset-username' => 'Felhasználónév:',
 'passwordreset-domain' => 'Tartomány:',
 'passwordreset-capture' => 'Meg szeretnéd nézni az elkészült üzenetet?',
 'passwordreset-capture-help' => 'Ha kipipálod a dobozt, elmegy az üzenet a felhasználónak és megjelenik számodra (az ideiglenes jelszóval együtt).',
 'passwordreset-email' => 'E-mail cím:',
 'passwordreset-emailtitle' => 'A(z) {{SITENAME}}-fiók adatai',
-'passwordreset-emailtext-ip' => 'Valaki (vélhetően Te, a $1 IP-címről) emlékeztetőt kért a {{SITENAME}} ($4) oldalon felvett fiókokról. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:
+'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:
 
 $2
 
 {{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ó emlékeztetők kért a {{SITENAME}} ($4) oldalon felvett fiókokról. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:
+'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:
 
 $2
 
 {{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
 Ideiglenes jelszó: $2',
-'passwordreset-emailsent' => 'Emlékeztető e-mail elküldve.',
-'passwordreset-emailsent-capture' => 'Az alább látható emlékeztető e-mail lett elküldve.',
+'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' => 'Az emlékeztető levél generálása megtörtént, mint az alább látszik, de elküldése a szerkesztőnek nem sikerült: $1',
 
 # Special:ChangeEmail
@@ -1075,6 +1110,8 @@ Már létezik.',
 'content-failed-to-parse' => 'Hiba történt a $2 tartalom $1 modellre történő konvertálása során: $3',
 'invalid-content-data' => 'Érvénytelen tartalom adat',
 'content-not-allowed-here' => '"$1" tartalom nem engedélyezett a [[$2]] oldalon',
+'editwarning-warning' => 'A lap elhagyásával az összes itt végzett változtatás elveszhet.
+Ha be vagy jelentkezve letilthatod ezt a figyelmeztetést a beállításaid „{{int:prefs-editing}}” szakaszában.',
 
 # Content models
 'content-model-wikitext' => 'wikiszöveg',
@@ -1351,15 +1388,6 @@ Ezt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás
 'search-external' => 'Külső kereső',
 'searchdisabled' => 'Elnézésed kérjük, de a teljes szöveges keresés terhelési okok miatt átmenetileg nem használható. Ezidő alatt használhatod a lenti Google keresést, mely viszont lehetséges, hogy nem teljesen friss adatokkal dolgozik.',
 
-# Quickbar
-'qbsettings' => 'Gyorsmenü',
-'qbsettings-none' => 'Nincs',
-'qbsettings-fixedleft' => 'Fix baloldali',
-'qbsettings-fixedright' => 'Fix jobboldali',
-'qbsettings-floatingleft' => 'Lebegő baloldali',
-'qbsettings-floatingright' => 'Lebegő jobboldali',
-'qbsettings-directionality' => 'Rögzített, a nyelved írásának irányától függően',
-
 # Preferences page
 'preferences' => 'Beállítások',
 'mypreferences' => 'Beállítások',
@@ -1909,7 +1937,6 @@ Ez a wiki publikus, így a biztonság miatt az img_auth.php ki van kapcsolva.',
 'http-read-error' => 'HTTP-olvasási hiba.',
 'http-timed-out' => 'A HTTP-kérés túllépte a határidőt.',
 'http-curl-error' => 'Hiba történt az URL lekérésekor: $1',
-'http-host-unreachable' => 'Nem sikerült elérni az URL-t.',
 'http-bad-status' => 'Probléma történt a HTTP-kérés közben: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2310,8 +2337,8 @@ Ezután minden, a lapon vagy annak vitalapján történő változást ott fogsz
 'notvisiblerev' => 'A változat törölve lett',
 'watchnochange' => 'Egyik figyelt lap sem változott a megadott időintervallumon belül.',
 'watchlist-details' => 'A vitalapokon kívül {{PLURAL:$1|egy|$1}} lap van a figyelőlistádon.',
-'wlheader-enotif' => 'Az e-mailen keresztül történő értesítés engedélyezve.',
-'wlheader-showupdated' => "Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagon''' láthatóak.",
+'wlheader-enotif' => 'Az e-mailen keresztül történő értesítés engedélyezve.',
+'wlheader-showupdated' => "Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagon''' láthatóak.",
 'watchmethod-recent' => 'a figyelt lapokon belüli legfrissebb szerkesztések',
 'watchmethod-list' => 'a legfrissebb szerkesztésekben található figyelt lapok',
 'watchlistcontains' => 'A figyelőlistádon {{PLURAL:$1|egy|$1}} lap szerepel.',
@@ -3033,17 +3060,11 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
 
 # Stylesheets
 'common.css' => '/* Közös CSS az összes felületnek */',
-'standard.css' => '/* Az ide elhelyezett CSS hatással lesz a Klasszikus felület használóira */',
-'nostalgia.css' => '/* Az ide elhelyezett CSS hatással lesz a Nosztalgia felület használóira */',
 'cologneblue.css' => '/* Az ide elhelyezett CSS hatással lesz a Kölni kék felület használóira */',
 'monobook.css' => '/* Az ide elhelyezett CSS hatással lesz a Monobook felület használóira */',
-'myskin.css' => '/* Az ide elhelyezett CSS hatással lesz a MySkin felület használóira */',
-'chick.css' => '/* Az ide elhelyezett CSS hatással lesz a Chick felület használóira */',
-'simple.css' => '/* Az ide elhelyezett CSS hatással lesz a Egyszerű felület használóira */',
 'modern.css' => '/* Az ide elhelyezett CSS hatással lesz a Modern felület használóira */',
 'vector.css' => '/* Az ide elhelyezett CSS hatással lesz a Vector felület használóira */',
 'print.css' => '/* Az ide elhelyezett CSS hatással lesz a nyomtatás kimenetelére */',
-'handheld.css' => '/* Az ide elhelyezett CSS hatással lesz azon kézi eszközökre, amelyek $wgHandheldStyle felülettel vannak konfigurálva */',
 'noscript.css' => '/* Az ide elhelyezett CSS azon felhasználókra lesz hatással, ahol a JavaScript le van tiltva */',
 'group-autoconfirmed.css' => '/* Az ide elhelyezett CSS az automatikusan megerősített felhasználókra lesz hatással */',
 'group-bot.css' => '/* Az ide elhelyezett CSS csak botokra lesz hatással */',
@@ -3052,13 +3073,8 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
 
 # Scripts
 'common.js' => '/* Az ide elhelyezett JavaScript kód minden felhasználó számára lefut az oldalak betöltésekor. */',
-'standard.js' => '/* A Klasszikus felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'nostalgia.js' => '/* A Nosztalgia felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'cologneblue.js' => '/* A Kölni kék felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'monobook.js' => '/* A Monobook felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'myskin.js' => '/* A MySkin felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'chick.js' => '/* A Chick felületet használó szerkesztők számára betöltendő JavaScriptek */',
-'simple.js' => '/* Az Egyszerű felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'modern.js' => '/* A Modern felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'vector.js' => '/* A Vector felületet használó szerkesztők számára betöltendő JavaScriptek */',
 'group-autoconfirmed.js' => '/* Az ide elhelyezett JavaScript csak automatikusan megerősített felhasználóknak töltődik be */',
@@ -3135,13 +3151,8 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
 'pageinfo-category-files' => 'Fájlok száma',
 
 # Skin names
-'skinname-standard' => 'Klasszikus',
-'skinname-nostalgia' => 'Nosztalgia',
 'skinname-cologneblue' => 'Kölni kék',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Egyszerű',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3251,7 +3262,7 @@ míg a többi elem a táblázat összecsukása után alapértelmezett esetben re
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Szélesség',
 'exif-imagelength' => 'Magasság',
 'exif-bitspersample' => 'Bitek összetevőnként',
@@ -3429,7 +3440,7 @@ míg a többi elem a táblázat összecsukása után alapértelmezett esetben re
 'exif-originalimageheight' => 'Kép magassága a levágás előtt',
 'exif-originalimagewidth' => 'Kép szélessége a levágás előtt',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nem tömörített',
 'exif-compression-2' => 'CCITT Group 3 1 dimenziós módosított Huffman kódolás',
 'exif-compression-3' => 'CCITT Group 3 fax kódolás',
@@ -3843,13 +3854,6 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
 'version-entrypoints-header-entrypoint' => 'Belépési pont',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Fájlelérés',
-'filepath-page' => 'Fájl:',
-'filepath-submit' => 'Elérési út',
-'filepath-summary' => 'Ezen lap segítségével lekérheted egy adott fájl pontos útvonalát.
-A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozzájuk rendelt programmal indulnak el.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Duplikátumok keresése',
 'fileduplicatesearch-summary' => 'Fájlok duplikátumainak keresése hash értékük alapján.',
@@ -3946,14 +3950,14 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 # New logging system
 'logentry-delete-delete' => '$1 törölte a következő lapot: $3',
 'logentry-delete-restore' => '$1 helyreállította a következő lapot: $3',
-'logentry-delete-event' => '$1 megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát $3 lapon: $4',
+'logentry-delete-event' => '$1 megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát a(z) $3 című lapon: $4',
 'logentry-delete-revision' => '$1 módosította a(z) $3 című lap {{PLURAL:$5|egy|$1}} lapváltozatának láthatóságát: $4',
 'logentry-delete-event-legacy' => '$1 módosította a(z) $3 című lap naplóbejegyzéseinek láthatóságát',
 'logentry-delete-revision-legacy' => '$1 módosította a(z) $3 című lap lapváltozatainak láthatóságát',
 'logentry-suppress-delete' => '$1 elrejtette a következő lapot: $3',
-'logentry-suppress-event' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát $3 lapon: $4',
-'logentry-suppress-revision' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy változat|$5 változat}} láthatóságát $3 lapon: $4',
-'logentry-suppress-event-legacy' => '$1 rejtetten megváltoztatta napló bejegyzések láthatóságát a(z) $3 lapon',
+'logentry-suppress-event' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy napló bejegyzés|$5 napló bejegyzés}} láthatóságát a(z) $3 című lapon: $4',
+'logentry-suppress-revision' => '$1 rejtetten megváltoztatta {{PLURAL:$5|egy változat|$5 változat}} láthatóságát a(z) $3 című lapon: $4',
+'logentry-suppress-event-legacy' => '$1 rejtetten megváltoztatta napló bejegyzések láthatóságát a(z) $3 című lapon',
 'logentry-suppress-revision-legacy' => '$1 rejtetten megváltoztatta változatok láthatóságát a(z) $3 lapon',
 'revdelete-content-hid' => 'tartalom elrejtve',
 'revdelete-summary-hid' => 'szerkesztési összefoglaló elrejtve',
index d1ab972..0a0bde6 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Chaojoker
+ * @author Nemo bis
  * @author Pandukht
  * @author Reedy
  * @author Ruben Vardanyan (me@RubenVardanyan.com)
@@ -303,8 +304,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ցույց տալ էջ հսկող մասնակիցների թիվը',
 'tog-oldsig' => 'Ներկայիս ստորագրությունն է․',
 'tog-fancysig' => 'Ստորագրությունը վիքիտեքստի տեսքով (առանց ավտոմատ հղման)',
-'tog-externaleditor' => 'Օգտագործել արտաքին խմբագրիչ ըստ լռության (պահանջում է հատուկ նախընտրություններ ձեր համակարգչում)',
-'tog-externaldiff' => 'Օգտագործել տարբերակների համեմատման արտաքին ծրագիր ըստ լռության (պահանջում է հատուկ նախընտրություններ ձեր համակարգչում)',
 'tog-showjumplinks' => 'Միացնել «անցնել դեպի» օգնական հղումները',
 'tog-uselivepreview' => 'Օգտագործել ուղիղ նախադիտում (JavaScript) (Փորձնական)',
 'tog-forceeditsummary' => 'Նախազգուշացնել խմբագրման ամփոփումը դատարկ թողնելու դեպքում',
@@ -318,6 +317,7 @@ $messages = array(
 'tog-diffonly' => 'Չցուցադրել էջի պարունակությունը տարբերությունների ներքևից',
 'tog-showhiddencats' => 'Ցուցադրել թաքնված կատեգորիաները',
 'tog-norollbackdiff' => 'Չցուցադրել տարբերությունները հետ գլորելուց հետո',
+'tog-useeditwarning' => 'Զգուշացնել ինձ, երբ ես լքում եմ խմբագրման էջը առանց կատարած փոփոխությունները հիշելու։',
 
 'underline-always' => 'Միշտ',
 'underline-never' => 'Երբեք',
@@ -686,14 +686,25 @@ $2',
 'logout' => 'Դուրս գալ համակարգից',
 'userlogout' => 'Ելնել համակարգից',
 'notloggedin' => 'Դուք չեք մտել համակարգ',
-'nologin' => "Դեռևս չե՞ք գրանցվել։ '''$1'''։",
+'userlogin-joinproject' => 'Միցել է {{SITENAME}}-{{grammar:genitive|ը}}',
+'nologin' => "Դեռևս չե՞ք գրանցվել '''$1'''։",
 'nologinlink' => 'Ստեղծեք մասնակցային հաշիվ',
 'createaccount' => 'Ստեղծել նոր հաշիվ',
 'gotaccount' => "Դուք արդեն գրանցվա՞ծ եք։ '''$1'''։",
 'gotaccountlink' => 'Մուտք գործեք համակարգ',
 'userlogin-resetlink' => 'Մոռացե՞լ եք Ձեր լոգին տվյալները։',
+'createacct-emailrequired' => 'Էլ-փոստի հասցեն',
 'createaccountmail' => 'էլ-փոստով',
 'createaccountreason' => 'Պատճառը՝',
+'createacct-reason' => 'Պատճառ',
+'createacct-reason-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|ներդրումը|ներդրումները}}',
 'badretype' => 'Ձեր մուտքագրած գաղտնաբառերը չեն համընկնում։',
 'userexists' => 'Այս մասնակցի անունը արդեն զբաղված է։ Խնդրում ենք ընտրել մեկ այլ անուն։',
 'loginerror' => 'Մուտքի սխալ',
@@ -774,11 +785,12 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Վերականգնել գաղտնաբառը',
-'passwordreset-text' => 'Լրացրեք ձևը՝ էլ-փոստով ձեր տվյալների մասին հիշեցում ստանալու համար։',
 'passwordreset-legend' => 'Վերականգնել գաղտնաբառը',
 'passwordreset-disabled' => 'Գաղտնաբառի վերականգնումը այս վիքիում թույլատրված չէ։',
 'passwordreset-username' => 'Մասնակցի անուն՝',
+'passwordreset-domain' => 'Դոմեն՝',
 'passwordreset-email' => 'Էլ-փոստի հասցեն՝',
+'passwordreset-emailtitle' => '{{SITENAME}} հաշվի մանրամասները',
 'passwordreset-emailelement' => 'Մասնակցային անունը՝ $1
 Ժամանակավոր գաղտնաբառը՝ $2',
 'passwordreset-emailsent' => 'Ուղարկվեց հիշեցնող էլ․ նամակ։',
@@ -1004,6 +1016,8 @@ $2',
 'edit-conflict' => 'Խմբագրման ընհարում։',
 'edit-no-change' => 'Ձեր խմբագրումը անտեսվել է, քանի որ ոչ մի փոփոխություն չի կատարվել տեքստի մեջ։',
 'defaultmessagetext' => 'Լռելյան տեքստը',
+'editwarning-warning' => 'Այս էջը լքելով դուք կարող եք կորցնել ձեր կատարած փոփոխությունները։
+Եթե դուք գրանցված եք համակարգում, կարող եք անջատել այս նախազգուշացումը ձեր նախընրությունների «{{int:prefs-editing}}» բաժնում։',
 
 # Content models
 'content-model-wikitext' => 'վիքիտեքստ',
@@ -1181,14 +1195,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'search-external' => 'Արտաքին որոնում',
 'searchdisabled' => '{{SITENAME}} կայքի ներքին որոնումը անջատված է։ Դուք կարող եք որոնել կայքի պարունակությունը արտաքին որոնման շարժիչներով (Google, Yahoo...), սակայն, ի նկատի ունեցեք, որ կայքի իրենց ինդեքսները կարող են հնացած լինել։',
 
-# Quickbar
-'qbsettings' => 'Արագ անցման վահանակ',
-'qbsettings-none' => 'Չցուցադրել',
-'qbsettings-fixedleft' => 'Ձախից անշարժ',
-'qbsettings-fixedright' => 'Աջից անշարժ',
-'qbsettings-floatingleft' => 'Ձախից լողացող',
-'qbsettings-floatingright' => 'Աջից լողացող',
-
 # Preferences page
 'preferences' => 'Նախընտրություններ',
 'mypreferences' => 'Նախընտրություններ',
@@ -1813,8 +1819,8 @@ $1-ը հղվել է $2 ից',
 'notanarticle' => 'Հոդված չէ',
 'watchnochange' => 'Ոչ մի հսկվող էջ չի փոփոխվել ցուցադրվող ժամանակահատվածում։',
 'watchlist-details' => 'Ձեր հսկացանկում կա {{PLURAL:$1|$1 էջ|$1 էջ}}` քննարկման էջերը չհաշված։',
-'wlheader-enotif' => 'Էլ-փոստով տեղեկացումը միացված է։',
-'wlheader-showupdated' => "Էջերը, որոնք փոփոխվել են ձեր դրանց վերջին այցից հետո բերված են '''թավատառ'''։",
+'wlheader-enotif' => 'Էլ-փոստով տեղեկացումը միացված է։',
+'wlheader-showupdated' => "Էջերը, որոնք փոփոխվել են ձեր դրանց վերջին այցից հետո բերված են '''թավատառ'''։",
 'watchmethod-recent' => 'վերջին փոփոխությունները հսկվող էջերի համար',
 'watchmethod-list' => 'հսկվող էջերի վերջին փոփոխությունները',
 'watchlistcontains' => 'Ձեր հսկացանկում կա $1 {{PLURAL:$1|էջ|էջ}}։',
@@ -2440,13 +2446,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'pageinfo-protect-cascading-yes' => 'Այո',
 
 # Skin names
-'skinname-standard' => 'Դասական',
-'skinname-nostalgia' => 'Հայրենաբաղձություն',
 'skinname-cologneblue' => 'Քյոլնի թախիծ',
 'skinname-monobook' => 'ՄիաԳիրք',
-'skinname-myskin' => 'ԻմՏեսք',
-'skinname-chick' => 'Ծիտ',
-'skinname-simple' => 'Պարզ',
 'skinname-modern' => 'Մոդերն',
 'skinname-vector' => 'Սովորական',
 
@@ -2542,7 +2543,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Լայնք',
 'exif-imagelength' => 'Բարձրություն',
 'exif-artist' => 'Հեղինակ',
@@ -2685,10 +2686,6 @@ $3
 # Special:Version
 'version' => 'ՄեդիաՎիքի տարբերակը',
 
-# Special:FilePath
-'filepath-page' => 'Նիշք՝',
-'filepath-submit' => 'Անցնել',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Փնտրել կրկնօրինակ պատկերներ',
 'fileduplicatesearch-summary' => 'Փնտրել կրկնօրինակ պատկերներ՝ հեշ արժեքների հիման վրա',
index 0214e82..321561f 100644 (file)
@@ -11,6 +11,7 @@
  * @author Kaganer
  * @author Malafaya
  * @author McDutchie
+ * @author Nemo bis
  * @author Reedy
  * @author Yfdyh000
  * @author לערי ריינהארט
@@ -172,8 +173,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Monstrar le numero de usatores que observa le pagina',
 'tog-oldsig' => 'Signatura existente:',
 'tog-fancysig' => 'Tractar signatura como wikitexto (sin ligamine automatic)',
-'tog-externaleditor' => 'Usar un editor externe qua standard (pro expertos solmente, necessita configuration special in tu computator. [//www.mediawiki.org/wiki/Manual:External_editors Plus informationes.])',
-'tog-externaldiff' => "Usar un programma ''diff'' externe qua standard (pro expertos solmente, necessita configuration special in tu computator. [//www.mediawiki.org/wiki/Manual:External_editors Plus informationes.])",
 'tog-showjumplinks' => 'Activar ligamines de accessibilitate "saltar a"',
 'tog-uselivepreview' => 'Usar previsualisation in directo (require JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avisar me si io non entra un summario de modification',
@@ -188,6 +187,7 @@ $messages = array(
 'tog-showhiddencats' => 'Monstrar categorias celate',
 'tog-noconvertlink' => 'Disactivar conversion de titulos de ligamines',
 'tog-norollbackdiff' => 'Omitter le diff post le execution de un revocation',
+'tog-useeditwarning' => 'Advertir me quando io quita un pagina de modification sin publicar le cambiamentos',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunquam',
@@ -251,6 +251,18 @@ $messages = array(
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 de januario',
+'february-date' => '$1 de februario���',
+'march-date' => '$1 de martio',
+'april-date' => '$1 de april',
+'may-date' => '$1 de maio',
+'june-date' => '$1 de junio',
+'july-date' => '$1 de julio',
+'august-date' => '$1 de augusto',
+'september-date' => '$1 de septembre',
+'october-date' => '$1 de octobre',
+'november-date' => '$1 de novembre',
+'december-date' => '$1 de decembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -559,9 +571,18 @@ Nota que alcun paginas pote continuar a apparer como si tu esserea ancora authen
 'welcomecreation-msg' => 'Tu conto ha essite create.
 Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].',
 'yourname' => 'Nomine de usator:',
+'userlogin-yourname' => 'Nomine de usator�',
+'userlogin-yourname-ph' => 'Entra tu nomine de usator',
 'yourpassword' => 'Contrasigno:',
+'userlogin-yourpassword' => 'Contrasigno',
+'userlogin-yourpassword-ph' => 'Entra tu contrasigno',
+'createacct-yourpassword-ph' => 'Entra un contrasigno',
 'yourpasswordagain' => 'Repete contrasigno:',
+'createacct-yourpasswordagain' => 'Confirma contrasigno',
+'createacct-yourpasswordagain-ph' => 'Repete le contrasigno',
 'remembermypassword' => 'Memorar mi contrasigno in iste navigator (pro un maximo de $1 {{PLURAL:$1|die|dies}})',
+'userlogin-remembermypassword' => 'Mantener mi session aperte',
+'userlogin-signwithsecure' => 'Usar un connexion secur',
 'securelogin-stick-https' => 'Remaner connectite via HTTPS post apertura de session',
 'yourdomainname' => 'Tu dominio:',
 'password-change-forbidden' => 'Non es possibile cambiar le contrasigno in iste wiki.',
@@ -574,18 +595,38 @@ Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].
 'logout' => 'Clauder session',
 'userlogout' => 'Clauder session',
 'notloggedin' => 'Tu non ha aperite un session',
+'userlogin-noaccount' => 'Non ha un conto?',
+'userlogin-joinproject' => 'Crear un conto in {{SITENAME}}',
 'nologin' => "Tu non ha un conto? '''$1'''.",
 'nologinlink' => 'Crear un conto',
 'createaccount' => 'Crear conto',
 'gotaccount' => "Tu jam ha un conto? '''$1'''.",
 'gotaccountlink' => 'Aperir session',
 'userlogin-resetlink' => 'Datos de authentication oblidate?',
+'userlogin-resetpassword-link' => 'Reinitialisar contrasigno',
+'helplogin-url' => 'Help:Aperir session',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Adjuta a aperir session]]',
+'createacct-join' => 'Specifica tu information hic infra.',
+'createacct-emailrequired' => 'Adresse de e-mail',
+'createacct-emailoptional' => 'Adresse de e-mail (optional)',
+'createacct-email-ph' => 'Entra tu adresse de e-mail',
 'createaccountmail' => 'Usar un contrasigno aleatori temporari e inviar lo al adresse de e-mail specificate hic infra',
+'createacct-realname' => 'Nomine real (optional)',
 '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-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.',
 'userexists' => 'Iste nomine de usator es jam in uso.
 Selige un altere nomine.',
 'loginerror' => 'Error in le apertura del session',
+'createacct-error' => 'Error de creation de conto',
 'createaccounterror' => 'Non poteva crear le conto: $1',
 'nocookiesnew' => "Le conto de usator ha essite create, sed tu non ha aperite un session.
 {{SITENAME}} usa ''cookies'' pro mantener le sessiones del usatores.
@@ -630,8 +671,8 @@ Per favor aperi session de novo post reciper lo.',
 'blocked-mailpassword' => 'Tu adresse IP es blocate de facer modificationes, e pro impedir le abuso, le uso del function pro recuperar contrasignos es equalmente blocate.',
 'eauthentsent' => 'Un e-mail de confirmation ha essite inviate al adresse de e-mail specificate.
 Pro poter reciper altere e-mail a iste conto, tu debe sequer le instructiones in iste e-mail pro confirmar que le conto es realmente tue.',
-'throttled-mailpassword' => 'Un rememoration del contrasigno ha jam essite inviate intra le ultime {{PLURAL:$1|hora|$1 horas}}.
-Pro prevenir le abuso, solmente un rememoration de contrasigno essera inviate per {{PLURAL:$1|hora|$1 horas}}.',
+'throttled-mailpassword' => 'Un message pro le reinitialisation del contrasigno ha jam essite inviate intra le ultime {{PLURAL:$1|hora|$1 horas}}.
+Pro prevenir le abuso, solmente un message pro le reinitialisation del contrasigno essera inviate per {{PLURAL:$1|hora|$1 horas}}.',
 'mailerror' => 'Error de inviar e-mail: $1',
 'acct_creation_throttle_hit' => 'Le visitatores de iste wiki usante tu adresse IP ha create {{PLURAL:$1|1 conto|$1 contos}} durante le ultime die, e isto es le maximo permittite in iste periodo de tempore.
 A causa de isto, le visitatores usante iste adresse IP non pote crear nove contos al momento.',
@@ -681,21 +722,22 @@ Pro completar le accesso, tu debe definir un nove contrasigno hic:',
 'resetpass-wrong-oldpass' => 'Le contrasigno temporari o actual es invalide.
 Es possibile que tu ha ja cambiate tu contrasigno o requestate un nove contrasigno temporari.',
 'resetpass-temp-password' => 'Contrasigno temporari:',
+'resetpass-abort-generic' => 'Le cambio del contrasigno ha essite abortate per un extension.',
 
 # Special:PasswordReset
 'passwordreset' => 'Reinitialisar contrasigno',
-'passwordreset-text' => 'Complete iste formulario pro reciper un rememoration in e-mail del datos de tu conto.',
+'passwordreset-text-one' => 'Completa iste formulario pro reinitialisar tu contrasigno.',
 'passwordreset-legend' => 'Reinitialisar contrasigno',
 'passwordreset-disabled' => 'Le reinitialisation de contrasignos ha essite disactivate in iste wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Entra un del elementos de datos hic infra}}',
+'passwordreset-emaildisabled' => 'Le functionalitate de e-mail ha essite disactivate in iste wiki.',
 'passwordreset-username' => 'Nomine de usator:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => 'Vider le e-mail resultante?',
 'passwordreset-capture-help' => 'Si tu marca iste quadrato, le e-mail (con le contrasigno temporari) non solmente essera inviate al usator, ma anque monstrate a te.',
 'passwordreset-email' => 'Adresse de e-mail:',
 'passwordreset-emailtitle' => 'Detalios del conto in {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Un persona (probabilemente tu, ab le adresse IP $1) requestava un rememoration del
-detalios de tu conto in {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es
+'passwordreset-emailtext-ip' => 'Un persona (probabilemente tu, ab le adresse IP $1) requestava le reinitialisation de tu
+contrasigno de {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es
 associate con iste adresse de e-mail:
 
 $2
@@ -705,7 +747,7 @@ Tu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona
 requesta, o si tu te ha rememorate tu contrasigno original e non plus
 vole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian
 contrasigno.',
-'passwordreset-emailtext-user' => 'Le usator $1 in {{SITENAME}} requestava un rememoration del detalios de tu conto in {{SITENAME}}
+'passwordreset-emailtext-user' => 'Le usator $1 in {{SITENAME}} requestava un reinitialisation de tu contrasigno in {{SITENAME}}
 ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es associate con iste adresse de e-mail:
 
 $2
@@ -717,9 +759,9 @@ vole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian
 contrasigno.',
 'passwordreset-emailelement' => 'Nomine de usator: $1
 Contrasigno temporari: $2',
-'passwordreset-emailsent' => 'Un e-mail de rememoration ha essite inviate.',
-'passwordreset-emailsent-capture' => 'Un e-mail de rememoration ha essite inviate; iste message es monstrate hic infra.',
-'passwordreset-emailerror-capture' => 'Un e-mail de rememoration ha essite generate; iste message es monstrate hic infra, ma le invio al usator ha fallite: $1',
+'passwordreset-emailsent' => 'Un message de e-mail pro le reinitialisation del contrasigno ha essite 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',
 
 # Special:ChangeEmail
 'changeemail' => 'Cambiar adresse de e-mail',
@@ -946,6 +988,8 @@ Illo existe ja.',
 'content-failed-to-parse' => 'Impossibile processar le contento $2 pro le modello $1: $3',
 'invalid-content-data' => 'Datos de contento invalide',
 'content-not-allowed-here' => 'Le contento "$1" non es permittite in le pagina [[$2]]',
+'editwarning-warning' => 'Quitar iste pagina pote causar le perdita de omne modificationes que tu ha facite.
+Si tu ha aperite un session, tu pote disactivar iste aviso in le section "{{int:prefs-editing}}" de tu preferentias.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1235,15 +1279,7 @@ Tenta prefixar tu consulta con ''all:'' pro cercar in tote le contento (includen
 'searchdisabled' => 'Le recerca in {{SITENAME}} es disactivate.
 Tu pote cercar via Google in le interim.
 Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
-
-# Quickbar
-'qbsettings' => 'Barra rapide',
-'qbsettings-none' => 'Necun',
-'qbsettings-fixedleft' => 'Fixe a sinistra',
-'qbsettings-fixedright' => 'Fixe a dextra',
-'qbsettings-floatingleft' => 'Flottante a sinistra',
-'qbsettings-floatingright' => 'Flottante a dextra',
-'qbsettings-directionality' => 'Fixe, dependente del direction de scriptura de tu lingua',
+'search-error' => 'Un error ha occurrite durante le recerca: $1',
 
 # Preferences page
 'preferences' => 'Preferentias',
@@ -1387,6 +1423,7 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'userrights-notallowed' => 'Tu conto non ha le permission de adder o remover derectos de usator.',
 'userrights-changeable-col' => 'Gruppos que tu pote modificar',
 'userrights-unchangeable-col' => 'Gruppos que tu non pote modificar',
+'userrights-conflict' => 'Conflicto inter derectos de usator! Per favor applica tu cambiamentos de novo.',
 
 # Groups
 'group' => 'Gruppo:',
@@ -1806,7 +1843,6 @@ Pro securitate optimal, img_auth.php es disactivate.',
 'http-read-error' => 'Error de lectura HTTP.',
 'http-timed-out' => 'Le requesta HTTP ha expirate.',
 'http-curl-error' => 'Error al obtener datos del URL: $1',
-'http-host-unreachable' => 'Non poteva acceder al URL',
 'http-bad-status' => 'Un problema occurreva durante le requesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2225,8 +2261,8 @@ Le modificationes futur in iste pagina e in le pagina de discussion associate es
 'notvisiblerev' => 'Le version ha essite delite',
 'watchnochange' => 'Nulle articulo que tu observa esseva modificate durante le periodo de tempore indicate.',
 'watchlist-details' => '{{PLURAL:$1|$1 pagina|$1 paginas}} es in tu observatorio, sin contar le paginas de discussion.',
-'wlheader-enotif' => '* Le notificationes via e-mail es active.',
-'wlheader-showupdated' => "* Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''",
+'wlheader-enotif' => 'Le notification via e-mail es active.',
+'wlheader-showupdated' => "Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''.",
 'watchmethod-recent' => 'cerca paginas sub observation in modificationes recente',
 'watchmethod-list' => 'cerca modificationes recente in paginas sub observation',
 'watchlistcontains' => 'Tu observatorio contine $1 {{PLURAL:$1|pagina|paginas}}.',
@@ -2651,6 +2687,7 @@ Per favor contacta tu providitor de servicio internet o supporto technic e infor
 'sorbsreason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Tu adresse IP es listate como proxy aperte in le DNSBL usate per {{SITENAME}}.
 Tu non pote crear un conto',
+'xffblockreason' => 'Un adresse IP presente in le capite X-Forwarded-For, o le tue o illo de un servitor proxy que tu usa, ha essite blocate. Le motivo original pro le blocada es: $1',
 'cant-block-while-blocked' => 'Tu non pote blocar altere usatores durante que tu mesme es blocate.',
 'cant-see-hidden-user' => 'Le usator que tu tenta blocar ha ja essite blocate e celate. Post que tu non ha le derecto hideuser, tu non pote vider o modificar le blocada del usator.',
 'ipbblocked' => 'Tu non pote blocar o disblocar altere usatores, proque tu mesme es blocate',
@@ -2819,6 +2856,8 @@ Per favor visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation]
 'thumbnail-more' => 'Aggrandir',
 'filemissing' => 'File manca',
 'thumbnail_error' => 'Error durante le creation del miniatura: $1',
+'thumbnail_error_remote' => 'Message de error ab $1:
+$2',
 'djvu_page_error' => 'Pagina DjVu foras de limite',
 'djvu_no_xml' => 'Impossibile obtener XML pro file DjVu',
 'thumbnail-temp-create' => 'Impossibile crear un file temporari de miniatura',
@@ -2969,27 +3008,16 @@ Es possibile adder un motivo in le summario.',
 
 # Stylesheets
 'common.css' => '/* Le CSS placiate hic se applicara a tote le stilos */',
-'standard.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Classic */',
-'nostalgia.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Nostalgia */',
 'cologneblue.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Colonia Blau */',
 'monobook.css' => '/* Le CSS placiate hic afficera le usatores del apparentia MonoBook */',
-'myskin.css' => '/* Le CSS placiate hic afficera le usatores del apparentia "Mi apparentia" */',
-'chick.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Chique */',
-'simple.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Simple */',
 'modern.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Moderne */',
 'vector.css' => '/* Le CSS placiate hic afficera le usatores del apparentia Vector */',
 'print.css' => '/* Le CSS placiate hic influentiara le apparentia del paginas imprimite */',
-'handheld.css' => '/* Le CSS placiate hic afficera le apparatos mobile basate super le apparentia configurate in $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Omne JavaScript hic se executara pro tote le usatores a cata cargamento de pagina. */',
-'standard.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Classic */',
-'nostalgia.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Nostalgia */',
 'cologneblue.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Colonia Blau */',
 'monobook.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia MonoBook */',
-'myskin.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia "Mi apparentia" */',
-'chick.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Chique */',
-'simple.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Simple */',
 'modern.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Moderne */',
 'vector.js' => '/* Omne JavaScript hic se executara pro le usatores del apparentia Vector */',
 
@@ -3065,13 +3093,8 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-category-files' => 'Numero de files',
 
 # Skin names
-'skinname-standard' => 'Classic',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Colonia Blau',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mi apparentia',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3149,11 +3172,25 @@ Le execution de illo pote compromitter le securitate de tu systema.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
 'days' => '{{PLURAL:$1|$1 die|$1 dies}}',
+'weeks' => '$1 {{PLURAL:$1|septimana|septimanas}}',
 'months' => '{{PLURAL:$1|$1 mense|$1 menses}}',
 'years' => '{{PLURAL:$1|$1 anno|$1 annos}}',
 'ago' => '$1 retro',
 'just-now' => 'Justo nunc',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|hora|horas}} retro',
+'minutes-ago' => '$1 {{PLURAL:$1|minuta|minutas}} retro',
+'seconds-ago' => '$1 {{PLURAL:$1|secunda|secundas}} retro',
+'monday-at' => 'Lunedi a $1',
+'tuesday-at' => 'Martedi a $1',
+'wednesday-at' => 'Mercuridi a $1',
+'thursday-at' => 'Jovedi a $1',
+'friday-at' => 'Venerdi a $1',
+'saturday-at' => 'Sabbato a $1',
+'sunday-at' => 'Dominica a $1',
+'yesterday-at' => 'Heri a $1',
+
 # Bad image list
 'bad_image_list' => 'Le formato es como seque:
 
@@ -3183,7 +3220,7 @@ Le alteres essera initialmente celate.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Latitude',
 'exif-imagelength' => 'Altitude',
 'exif-bitspersample' => 'Bits per componente',
@@ -3361,7 +3398,7 @@ Le alteres essera initialmente celate.
 'exif-originalimageheight' => 'Altitude del imagine ante taliar',
 'exif-originalimagewidth' => 'Latitude del imagine ante taliar',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Non comprimite',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'CCITT Group 3 codification fax',
@@ -3780,12 +3817,17 @@ Vos deberea haber recipite [{{SERVER}}{{SCRIPTPATH}}/COPYING un exemplar del Lic
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cammino al articulo]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cammino al script]',
 
-# Special:FilePath
-'filepath' => 'Cammino del file',
-'filepath-page' => 'File:',
-'filepath-submit' => 'Va',
-'filepath-summary' => 'Iste pagina special retorna le cammino complete de un file.
-Le imagines se monstra in plen resolution, le altere typos de file se executa directemente con lor programmas associate.',
+# Special:Redirect
+'redirect' => 'Rediriger per nomine de file, ID de usator o ID de version',
+'redirect-legend' => 'Rediriger a un file o pagina',
+'redirect-summary' => 'Iste pagina special redirige a un file (si es date le nomine de un file), a un pagina (si es date un ID de version) o a un pagina de usator (si es date un ID de usator numeric).',
+'redirect-submit' => 'Va',
+'redirect-lookup' => 'Cercar:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID de usator',
+'redirect-revision' => 'Version de pagina',
+'redirect-file' => 'Nomine de file',
+'redirect-not-exists' => 'Valor non trovate',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cercar files duplicate',
@@ -3876,23 +3918,26 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
 'htmlform-submit' => 'Submitter',
 'htmlform-reset' => 'Disfacer modificationes',
 'htmlform-selectorother-other' => 'Altere',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Si',
+'htmlform-chosen-placeholder' => 'Selige un option',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con supporto de recerca de texto integre',
 'sqlite-no-fts' => '$1 sin supporto de recerca de texto integre',
 
 # New logging system
-'logentry-delete-delete' => '$1 deleva le pagina $3',
-'logentry-delete-restore' => '$1 restaurava le pagina $3',
-'logentry-delete-event' => '$1 cambiava le visibilitate de {{PLURAL:$5|un entrata|$5 entratas}} de registro in $3: $4',
-'logentry-delete-revision' => '$1 cambiava le visibilitate de {{PLURAL:$5|un version|$5 versiones}} del pagina $3: $4',
-'logentry-delete-event-legacy' => '$1 cambiava le visibilitate de entratas de registro in $3',
-'logentry-delete-revision-legacy' => '$1 cambiava le visibilitate de versiones del pagina $3',
-'logentry-suppress-delete' => '$1 supprimeva le pagina $3',
-'logentry-suppress-event' => '$1 secretemente cambiava le visibilitate de {{PLURAL:$5|un entrata|$5 entratas}} de registro in $3: $4',
-'logentry-suppress-revision' => '$1 secretemente cambiava le visibilitate de {{PLURAL:$5|un version|$5 versiones}} del pagina $3: $4',
-'logentry-suppress-event-legacy' => '$1 secretemente cambiava le visibilitate de entratas de registro in $3',
-'logentry-suppress-revision-legacy' => '$1 secretemente cambiava le visibilitate de versiones del pagina $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|deleva}} le pagina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|restaurava}} le pagina $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|cambiava}} le visibilitate de {{PLURAL:$5|un entrata|$5 entratas}} de registro in $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|cambiava}} le visibilitate de {{PLURAL:$5|un version|$5 versiones}} del pagina $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|cambiava}} le visibilitate de entratas de registro in $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|cambiava}} le visibilitate de versiones del pagina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|supprimeva}} le pagina $3',
+'logentry-suppress-event' => '$1 secretemente {{GENDER:$2|cambiava}} le visibilitate de {{PLURAL:$5|un entrata|$5 entratas}} de registro in $3: $4',
+'logentry-suppress-revision' => '$1 secretemente {{GENDER:$2|cambiava}} le visibilitate de {{PLURAL:$5|un version|$5 versiones}} del pagina $3: $4',
+'logentry-suppress-event-legacy' => '$1 secretemente {{GENDER:$2|cambiava}} le visibilitate de entratas de registro in $3',
+'logentry-suppress-revision-legacy' => '$1 secretemente {{GENDER:$2|cambiava}} le visibilitate de versiones del pagina $3',
 'revdelete-content-hid' => 'contento celate',
 'revdelete-summary-hid' => 'summario del modification celate',
 'revdelete-uname-hid' => 'nomine de usator celate',
@@ -3901,20 +3946,20 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
 'revdelete-uname-unhid' => 'nomine de usator non plus celate',
 'revdelete-restricted' => 'restrictiones applicate al administratores',
 'revdelete-unrestricted' => 'restrictiones eliminate pro administratores',
-'logentry-move-move' => '$1 renominava le pagina $3 a $4',
-'logentry-move-move-noredirect' => '$1 renominava le pagina $3 a $4 sin lassar un redirection',
-'logentry-move-move_redir' => '$1 renominava le pagina $3 a $4, superscribente un redirection',
-'logentry-move-move_redir-noredirect' => '$1 renominava le pagina $3 a $4, superscribente un redirection sin lassar un nove redirection',
-'logentry-patrol-patrol' => '$1 marcava le version $4 del pagina $3 como patruliate',
-'logentry-patrol-patrol-auto' => '$1 automaticamente marcava le version $4 del pagina $3 como patruliate',
-'logentry-newusers-newusers' => 'Le conto de usator $1 ha essite create',
-'logentry-newusers-create' => 'Le conto de usator $1 ha essite create',
-'logentry-newusers-create2' => 'Le conto de usator $3 ha essite create per $1',
-'logentry-newusers-byemail' => 'Le conto de usator $3 ha essite create per $1 e le contrasigno ha essite inviate per e-mail',
-'logentry-newusers-autocreate' => 'Le conto $1 ha essite create automaticamente',
-'logentry-rights-rights' => '$1 cambiava le appertinentia a gruppos pro $3 de $4 a $5',
-'logentry-rights-rights-legacy' => '$1 cambiava le appertinentia a gruppos pro $3',
-'logentry-rights-autopromote' => '$1 ha essite automaticamente promovite de $4 a $5',
+'logentry-move-move' => '$1 {{GENDER:$2|renominava}} le pagina $3 a $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|renominava}} le pagina $3 a $4 sin lassar un redirection',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|renominava}} le pagina $3 a $4, superscribente un redirection',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|renominava}} le pagina $3 a $4, superscribente un redirection sin lassar un nove redirection',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|marcava}} le version $4 del pagina $3 como patruliate',
+'logentry-patrol-patrol-auto' => '$1 automaticamente {{GENDER:$2|marcava}} le version $4 del pagina $3 como patruliate',
+'logentry-newusers-newusers' => 'Le conto de usator $1 ha essite {{GENDER:$2|create}}',
+'logentry-newusers-create' => 'Le conto de usator $1 ha essite {{GENDER:$2|create}}',
+'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-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',
 'rightsnone' => '(nulle)',
 
 # Feedback
index b8f27d7..31e5f15 100644 (file)
@@ -12,6 +12,7 @@
  * @author Aldnonymous
  * @author Anakmalaysia
  * @author ArdWar
+ * @author Bawoor
  * @author Bennylin
  * @author Borgx
  * @author Dosmiin Barsbold
@@ -261,6 +262,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'Pencarian_MIME', 'PencarianMIME' ),
        'Mostcategories'            => array( 'Kategori_terbanyak', 'KategoriTerbanyak' ),
        'Mostimages'                => array( 'Berkas_paling_digunakan', 'BerkasPalingDigunakan' ),
+       'Mostinterwikis'            => array( 'Interwiki_terbanyak', 'InterwikiTerbanyak' ),
        'Mostlinked'                => array( 'Halaman_paling_digunakan', 'HalamanPalingDigunakan' ),
        'Mostlinkedcategories'      => array( 'Kategori_paling_digunakan', 'KategoriPalingDigunakan' ),
        'Mostlinkedtemplates'       => array( 'Templat_paling_digunakan', 'TemplatPalingDigunakan' ),
@@ -348,7 +350,7 @@ $messages = array(
 'tog-editsection' => 'Fungsikan penyuntingan subbagian melalui pranala [sunting]',
 'tog-editsectiononrightclick' => 'Fungsikan penyuntingan subbagian dengan mengeklik kanan pada judul bagian (JavaScript)',
 'tog-showtoc' => 'Perlihatkan daftar isi (untuk halaman yang mempunyai lebih dari 3 subbagian)',
-'tog-rememberpassword' => 'Ingat kata sandi saya di peramban ini (selama $1 {{PLURAL:$1|hari|hari}})',
+'tog-rememberpassword' => 'Ingat kata sandi saya di peramban ini (selama $1 {{PLURAL:$1|hari}})',
 'tog-watchcreations' => 'Tambahkan halaman yang saya buat ke daftar pantauan',
 'tog-watchdefault' => 'Tambahkan halaman yang saya sunting ke daftar pantauan',
 'tog-watchmoves' => 'Tambahkan halaman yang saya pindahkan ke daftar pantauan',
@@ -364,10 +366,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tunjukkan jumlah pemantau',
 'tog-oldsig' => 'Tanda tangan sekarang:',
 'tog-fancysig' => 'Perlakukan tanda tangan sebagai teks wiki (tanpa suatu pranala otomatis)',
-'tog-externaleditor' => 'Gunakan editor eksternal secara bawaan (hanya untuk ahli, perlu pengaturan khusus pada komputer Anda.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapnya].)',
-'tog-externaldiff' => 'Gunakan diff eksternal secara bawaan (hanya untuk ahli, perlu pengaturan khusus pada komputer Anda.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkapnya].)',
 'tog-showjumplinks' => 'Aktifkan pranala pembantu "langsung ke"',
 'tog-uselivepreview' => 'Gunakan pratayang langsung (JavaScript) (eksperimental)',
 'tog-forceeditsummary' => 'Ingatkan saya bila kotak ringkasan suntingan masih kosong',
@@ -382,6 +380,7 @@ $messages = array(
 'tog-showhiddencats' => 'Tampilkan kategori tersembunyi',
 'tog-noconvertlink' => 'Matikan konversi judul pranala',
 'tog-norollbackdiff' => 'Jangan tampilkan perbedaan setelah melakukan pengembalian',
+'tog-useeditwarning' => 'Ingatkan saya bila meninggalkan halaman penyuntingan sebelum menyimpan perubahan',
 
 'underline-always' => 'Selalu',
 'underline-never' => 'Tidak pernah',
@@ -445,21 +444,33 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Februari',
+'march-date' => '$1 Maret',
+'april-date' => '$1 April',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Juni',
+'july-date' => '$1 Juli',
+'august-date' => '$1 Agustus',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Desember',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
+'pagecategories' => '{{PLURAL:$1|Kategori}}',
 'category_header' => 'Halaman dalam kategori "$1"',
 'subcategories' => 'Subkategori',
 'category-media-header' => 'Media dalam kategori "$1"',
 'category-empty' => "''Saat ini, tidak terdapat halaman ataupun media dalam kategori ini.''",
-'hidden-categories' => '{{PLURAL:$1|Kategori tersembunyi|Kategori tersembunyi}}',
+'hidden-categories' => '{{PLURAL:$1|Kategori tersembunyi}}',
 'hidden-category-category' => 'Kategori tersembunyi',
-'category-subcat-count' => '{{PLURAL:$2|Kategori ini hanya memiliki satu subkategori berikut.|Kategori ini memiliki {{PLURAL:$1|subkategori|$1 subkategori}} berikut, dari total $2.}}',
-'category-subcat-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|subkategori|$1 subkategori}} berikut.',
-'category-article-count' => '{{PLURAL:$2|Kategori ini hanya memiliki satu halaman berikut.|Kategori ini memiliki {{PLURAL:$1|halaman|$1 halaman}}, dari total $2.}}',
-'category-article-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|satu halaman|$1 halaman}} berikut.',
-'category-file-count' => '{{PLURAL:$2|Kategori ini hanya memiliki satu berkas berikut.|Kategori ini memiliki {{PLURAL:$1|berkas|$1 berkas}} berikut, dari total $2.}}',
-'category-file-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|berkas|$1 berkas}} berikut.',
+'category-subcat-count' => '{{PLURAL:$2|Kategori ini memiliki {{PLURAL:$1|$1 subkategori}} berikut, dari total $2.}}',
+'category-subcat-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|$1 subkategori}} berikut.',
+'category-article-count' => '{{PLURAL:$2|Kategori ini memiliki {{PLURAL:$1|$1 halaman}}, dari total $2.}}',
+'category-article-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|$1 halaman}} berikut.',
+'category-file-count' => '{{PLURAL:$2|Kategori ini memiliki {{PLURAL:$1|$1 berkas}} berikut, dari total $2.}}',
+'category-file-count-limited' => 'Kategori ini memiliki {{PLURAL:$1|$1 berkas}} berikut.',
 'listingcontinuesabbrev' => 'samb.',
 'index-category' => 'Halaman yang diindeks',
 'noindex-category' => 'Halaman yang tidak diindeks',
@@ -516,7 +527,7 @@ $messages = array(
 'searchbutton' => 'Cari',
 'go' => 'Tuju ke',
 'searcharticle' => 'Tuju ke',
-'history' => 'Halaman riwayat',
+'history' => 'Riwayat halaman',
 'history_short' => 'Versi terdahulu',
 'updatedmarker' => 'diubah sejak kunjungan terakhir saya',
 'printableversion' => 'Versi cetak',
@@ -529,8 +540,8 @@ $messages = array(
 'create-this-page' => 'Buat halaman ini',
 'delete' => 'Hapus',
 'deletethispage' => 'Hapus halaman ini',
-'undelete_short' => 'Batal hapus $1 {{PLURAL:$1|suntingan|suntingan}}',
-'viewdeleted_short' => 'Lihat {{PLURAL:$1|satu suntingan|$1 suntingan}} yang dihapus',
+'undelete_short' => 'Batal hapus {{PLURAL:$1|$1 suntingan}}',
+'viewdeleted_short' => 'Lihat {{PLURAL:$1|$1 suntingan}} yang dihapus',
 'protect' => 'Lindungi',
 'protect_change' => 'ubah',
 'protectthispage' => 'Lindungi halaman ini',
@@ -558,7 +569,7 @@ $messages = array(
 'redirectedfrom' => '(Dialihkan dari $1)',
 'redirectpagesub' => 'Halaman pengalihan',
 'lastmodifiedat' => 'Halaman ini terakhir diubah pada $2, $1.',
-'viewcount' => 'Halaman ini telah diakses sebanyak {{PLURAL:$1|satu kali|$1 kali}}.<br />',
+'viewcount' => 'Halaman ini telah diakses sebanyak {{PLURAL:$1|$1 kali}}.<br />',
 'protectedpage' => 'Halaman yang dilindungi',
 'jumpto' => 'Langsung ke:',
 'jumptonavigation' => 'navigasi',
@@ -594,7 +605,7 @@ $1',
 
 'badaccess' => 'Kesalahan hak akses',
 'badaccess-group0' => 'Anda tidak diizinkan untuk melakukan tindakan yang Anda minta.',
-'badaccess-groups' => 'Tindakan yang Anda minta dibatasi untuk pengguna dalam {{PLURAL:$2|kelompok|salah satu dari kelompok}}: $1.',
+'badaccess-groups' => 'Tindakan yang Anda minta dibatasi untuk pengguna dalam {{PLURAL:$2|kelompok}}: $1.',
 
 'versionrequired' => 'Dibutuhkan MediaWiki versi $1',
 'versionrequiredtext' => 'MediaWiki versi $1 dibutuhkan untuk menggunakan halaman ini. Lihat [[Special:Version|halaman versi]]',
@@ -607,11 +618,11 @@ $1',
 'youhavenewmessages' => 'Anda mempunyai $1 ($2).',
 'newmessageslink' => 'pesan baru',
 'newmessagesdifflink' => 'perubahan terakhir',
-'youhavenewmessagesfromusers' => 'Anda memiliki $1 dari {{PLURAL:$3||}}pengguna lain ($2).',
+'youhavenewmessagesfromusers' => 'Anda memiliki $1 dari {{PLURAL:$3|$3 pengguna lain}} ($2).',
 'youhavenewmessagesmanyusers' => 'Anda memiliki $1 dari pengguna lain ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1||}}pesan baru',
-'newmessagesdifflinkplural' => '{{PLURAL:$1||}}perubahan terakhir',
-'youhavenewmessagesmulti' => 'Anda mendapat beberapa pesan baru pada $1',
+'newmessageslinkplural' => '{{PLURAL:$1|pesan baru}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|perubahan}} terakhir',
+'youhavenewmessagesmulti' => 'Anda mendapat pesan baru pada $1',
 'editsection' => 'sunting',
 'editsection-brackets' => '[$1]',
 'editold' => 'sunting',
@@ -626,7 +637,7 @@ $1',
 'collapsible-expand' => 'Kembangkan',
 'thisisdeleted' => 'Lihat atau kembalikan $1?',
 'viewdeleted' => 'Lihat $1?',
-'restorelink' => '$1 {{PLURAL:$1|suntingan|suntingan}} yang telah dihapus',
+'restorelink' => '{{PLURAL:$1|$1 suntingan}} yang telah dihapus',
 'feedlinks' => 'Umpan:',
 'feed-invalid' => 'Tipe permintaan umpan tidak tepat.',
 'feed-unavailable' => 'Umpan sindikasi tidak tersedia',
@@ -654,7 +665,7 @@ $1',
 
 # Main script and global functions
 '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 betul. Hal ini juga mungkin mengindikasikan suatu bug pada perangkat lunak yang digunakan oleh {{SITENAME}}.',
+'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',
 'nospecialpagetext' => '<strong>Anda meminta halaman istimewa yang tidak sah.</strong>
 
@@ -751,9 +762,18 @@ Perhatikan bahwa beberapa halaman mungkin masih terus menunjukkan bahwa Anda mas
 'welcomeuser' => 'Selamat datang,  $1 !',
 'welcomecreation-msg' => 'Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Anda.',
 'yourname' => 'Nama pengguna:',
+'userlogin-yourname' => 'Nama pengguna',
+'userlogin-yourname-ph' => 'Masukkan nama pengguna Anda',
 'yourpassword' => 'Kata sandi:',
+'userlogin-yourpassword' => 'Kata sandi',
+'userlogin-yourpassword-ph' => 'Masukkan kata sandi',
+'createacct-yourpassword-ph' => 'Masukkan kata sandi',
 'yourpasswordagain' => 'Ulangi kata sandi:',
+'createacct-yourpasswordagain' => 'Konfirmasi kata sandi',
+'createacct-yourpasswordagain-ph' => 'Masukkan lagi kata sandi',
 'remembermypassword' => 'Ingat kata sandi saya di komputer ini (selama $1 {{PLURAL:$1|hari|hari}})',
+'userlogin-remembermypassword' => 'Biarkan saya tetap masuk',
+'userlogin-signwithsecure' => 'Gunakan server aman',
 'securelogin-stick-https' => 'Tetap terhubung ke HTTPS setelah masuk',
 'yourdomainname' => 'Domain Anda:',
 'password-change-forbidden' => 'Anda tidak dapat mengubah kata sandi pada wiki ini.',
@@ -766,18 +786,38 @@ Perhatikan bahwa beberapa halaman mungkin masih terus menunjukkan bahwa Anda mas
 'logout' => 'Keluar log',
 'userlogout' => 'Keluar log',
 'notloggedin' => 'Belum masuk log',
+'userlogin-noaccount' => 'Belum punya akun?',
+'userlogin-joinproject' => 'Join {{SITENAME}}',
 'nologin' => "Belum mempunyai akun? '''$1'''.",
 'nologinlink' => 'Daftarkan akun baru',
 'createaccount' => 'Buat akun baru',
 'gotaccount' => "Sudah terdaftar sebagai pengguna? '''$1'''.",
 'gotaccountlink' => 'Masuk log',
 'userlogin-resetlink' => 'Lupa detail info masuk Anda?',
+'userlogin-resetpassword-link' => 'Buat ulang kata sandi',
+'helplogin-url' => 'Help:Masuk log',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan masuk log]]',
+'createacct-join' => 'Masukkan informasi Anda di bawah ini.',
+'createacct-emailrequired' => 'Alamat surel',
+'createacct-emailoptional' => 'Alamat surel (opsional)',
+'createacct-email-ph' => 'Masukkan alamat surel Anda',
 'createaccountmail' => 'Gunakan kata sandi acak sementara dan kirimkan ke surel yang tercantum di bawah',
+'createacct-realname' => 'Nama asli (opsional)',
 '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-benefit-heading' => '{{SITENAME}} dibuat oleh orang-orang seperti Anda.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntingan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|halaman}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|kontributor}} terakhir',
 'badretype' => 'Kata sandi yang Anda masukkan salah.',
 'userexists' => 'Nama pengguna yang dimasukkan telah digunakan.
 Silakan tentukan nama yang lain.',
 'loginerror' => 'Kesalahan masuk log',
+'createacct-error' => 'Pembuatan akun gagal',
 'createaccounterror' => 'Tidak dapat membuat akun: $1',
 'nocookiesnew' => "Akun pengguna telah dibuat, tetapi Anda belum masuk log. {{SITENAME}} menggunakan ''cookies'' untuk log pengguna. ''Cookies'' pada penjelajah web Anda dimatikan. Silakan aktifkan dan masuk log kembali dengan nama pengguna dan kata sandi Anda.",
 'nocookieslogin' => "{{SITENAME}} menggunakan ''cookies'' untuk log penggunanya. ''Cookies'' pada penjelajah web Anda dimatikan. Silakan aktifkan dan coba lagi.",
@@ -811,8 +851,8 @@ Silakan masuk log kembali setelah menerima surel tersebut.',
 'blocked-mailpassword' => 'Alamat IP Anda diblokir dari penyuntingan dan karenanya tidak diizinkan menggunakan fungsi pengingat kata sandi untuk mencegah penyalahgunaan.',
 'eauthentsent' => 'Sebuah surel untuk konfirmasi telah dikirim ke alamat surel.
 Anda harus mengikuti instruksi di dalam surel tersebut untuk melakukan konfirmasi bahwa alamat tersebut adalah benar kepunyaan Anda. {{SITENAME}} tidak akan mengaktifkan fitur surel jika langkah ini belum dilakukan.',
-'throttled-mailpassword' => 'Suatu pengingat kata sandi telah dikirimkan dalam {{PLURAL:$1|jam|$1 jam}} terakhir.
-Untuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan setiap {{PLURAL:$1|jam|$1 jam}}.',
+'throttled-mailpassword' => 'Suatu pengingat kata sandi telah dikirimkan dalam {{PLURAL:$1|$1 jam}} terakhir.
+Untuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan setiap {{PLURAL:$1|$1 jam}}.',
 'mailerror' => 'Kesalahan dalam mengirimkan surel: $1',
 'acct_creation_throttle_hit' => 'Pengunjung wiki ini dengan alamat IP yang sama dengan Anda telah membuat {{PLURAL:$1|1 akun|$1 akun}} dalam satu hari terakhir, hingga jumlah maksimum yang diijinkan.
 Karenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain untuk sementara.',
@@ -859,13 +899,13 @@ Silakan menunggu sebelum mencoba lagi.',
 'resetpass-wrong-oldpass' => 'Kata sandi tidak sah.
 Anda mungkin telah berhasil mengganti kata sandi Anda atau telah meminta kata sandi sementara yang baru.',
 'resetpass-temp-password' => 'Kata sandi sementara:',
+'resetpass-abort-generic' => 'Perubahan kata sandi telah dibatalkan oleh ekstensi.',
 
 # Special:PasswordReset
 'passwordreset' => 'Setel ulang sandi',
-'passwordreset-text' => 'Lengkapi formulir ini untuk menerima surel pengingat detail akun Anda.',
 'passwordreset-legend' => 'Setel ulang sandi',
 'passwordreset-disabled' => 'Penyetelan ulang sandi telah dimatikan di wiki ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Masukkan salah satu data di bawah ini}}',
+'passwordreset-emaildisabled' => 'Fitur surel telah dinonaktifkan pada wiki ini.',
 'passwordreset-username' => 'Nama pengguna:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Lihat surel yang dihasilkan?',
@@ -878,7 +918,7 @@ terkait dengan alamat surel ini:
 
 $2
 
-{{PLURAL:$3|Sandi sementara|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|satu hari|$5 hari}}.
+{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.
 Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
 permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
 ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.',
@@ -887,15 +927,15 @@ ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi
 
 $2
 
-{{PLURAL:$3|Sandi sementara|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|satu hari|$5 hari}}.
+{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.
 Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
 permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
 ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.',
 'passwordreset-emailelement' => 'Nama pengguna: $1
 Sandi sementara: $2',
-'passwordreset-emailsent' => 'Surel pengingat telah dikirimkan.',
-'passwordreset-emailsent-capture' => 'Surel pengingat, yang ditampilkan di bawah, telah dikirim.',
-'passwordreset-emailerror-capture' => 'Surel pengingat, yang ditampilkan di bawah, telah dihasilkan, tetapi gagal mengirimkannya ke pengguna: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Ubah alamat surel',
@@ -1104,12 +1144,15 @@ tanpa ada keterangan.',
 Halaman kemungkinan telah dihapus.',
 'edit-conflict' => 'Konflik penyuntingan.',
 'edit-no-change' => 'Suntingan diabaikan, karena Anda tidak melakukan perubahan atas teks.',
+'postedit-confirmation' => 'Suntingan Anda tersimpan.',
 'edit-already-exists' => 'Tidak dapat membuat halaman baru
 karena telah ada.',
 'defaultmessagetext' => 'Teks baku',
 'content-failed-to-parse' => 'Gagal menjabarkan konten $2 untuk model $1: $3',
 'invalid-content-data' => 'Data konten tidak sah',
 'content-not-allowed-here' => 'Konten "$1" tidak diizinkan di halaman [[$2]]',
+'editwarning-warning' => 'Meninggalkan halaman ini dapat menyebabkan semua perubahan yang belum tersimpan hilang.
+Jika Anda telah masuk log, Anda dapat mematikan peringatan ini lewat bagian "Penyuntingan" pada halaman preferensi Anda.',
 
 # Content models
 'content-model-wikitext' => 'teks wiki',
@@ -1219,7 +1262,7 @@ Sebagai seorang pengurus, Anda dapat melihat perbedaan ini; detail mungkin terse
 'revdelete-nologtype-title' => 'Tipe log tak diberikan',
 'revdelete-nologtype-text' => 'Anda tidak memberikan suatu tipe log untuk menerapkan tindakan ini.',
 'revdelete-nologid-title' => 'Entri log tak valid',
-'revdelete-nologid-text' => 'Anda mungkin tidak menyebutkan suatu log peristiwa target untuk menjalankan fungsi ini atau entri yang dimaksud tak ditemukan.',
+'revdelete-nologid-text' => 'Anda mungkin tidak menyebutkan suatu log target peristiwa untuk menjalankan fungsi ini atau entri yang dimaksud tidak ditemukan.',
 'revdelete-no-file' => 'Berkas yang dituju tidak ditemukan.',
 'revdelete-show-file-confirm' => 'Apakah Anda yakin ingin melihat revisi yang telah dihapus dari berkas "<nowiki>$1</nowiki>" per $3, $2?',
 'revdelete-show-file-submit' => 'Ya',
@@ -1391,15 +1434,7 @@ Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'searchdisabled' => 'Pencarian {{SITENAME}} sementara dimatikan.
 Anda dapat mencari melalui Google untuk sementara waktu.
 Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencakup perubahan-perubahan terakhir.',
-
-# Quickbar
-'qbsettings' => 'Pengaturan bar pintas',
-'qbsettings-none' => 'Tidak ada',
-'qbsettings-fixedleft' => 'Tetap sebelah kiri',
-'qbsettings-fixedright' => 'Tetap sebelah kanan',
-'qbsettings-floatingleft' => 'Mengambang sebelah kiri',
-'qbsettings-floatingright' => 'Mengambang sebelah kanan',
-'qbsettings-directionality' => 'Tetap, tergantung pada bentuk skrip dari bahasa Anda',
+'search-error' => 'Kesalahan terjadi saat mencari: $1',
 
 # Preferences page
 'preferences' => 'Preferensi',
@@ -1546,6 +1581,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'userrights-changeable-col' => 'Kelompok yang dapat Anda ubah',
 'userrights-unchangeable-col' => 'Kelompok yang tidak dapat Anda ubah',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Konflik hak pengguna! Silakan ubah kembali.',
 
 # Groups
 'group' => 'Kelompok:',
@@ -1558,8 +1594,8 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'group-all' => '(semua)',
 
 'group-user-member' => '{{GENDER:$1| pengguna}}',
-'group-autoconfirmed-member' => '{{GENDER:$1| pengguna}} terkonfimasi otomatis',
-'group-bot-member' => 'Bot',
+'group-autoconfirmed-member' => '{{GENDER:$1|pengguna terkonfimasi otomatis}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => '{{GENDER:$1|pengurus}}',
 'group-bureaucrat-member' => '{{GENDER:$1|birokrat}}',
 'group-suppress-member' => '{{GENDER:$1|pengawas}}',
@@ -1956,7 +1992,6 @@ Untuk pilihan keamanan, img_auth.php dinonaktifkan.',
 'http-read-error' => 'Kesalahan pembacaan HTTP',
 'http-timed-out' => 'Permintaan HTTP lewat tenggat.',
 'http-curl-error' => 'Kesalahan saat mengambil URL: $1',
-'http-host-unreachable' => 'Tidak dapat mencapai URL.',
 'http-bad-status' => 'Ada masalah saat permintaan halaman HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2117,7 +2152,7 @@ Suatu halaman dianggap sebagai halaman disambiguasi apabila halaman tersebut men
 'pageswithprop-legend' => 'Halaman dengan halaman properti',
 'pageswithprop-text' => 'Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.',
 'pageswithprop-prop' => 'Nama properti:',
-'pageswithprop-submit' => 'Pergi',
+'pageswithprop-submit' => 'Lanjut',
 
 'doubleredirects' => 'Pengalihan ganda',
 'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
@@ -2133,7 +2168,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
 'brokenredirects-delete' => 'hapus',
 
 'withoutinterwiki' => 'Halaman tanpa interwiki',
-'withoutinterwiki-summary' => 'Halaman-halaman berikut tidak memiliki pranala ke versi dalam bahasa lain:',
+'withoutinterwiki-summary' => 'Halaman-halaman berikut tidak memiliki interwiki ke versi bahasa lain.',
 'withoutinterwiki-legend' => 'Prefiks',
 'withoutinterwiki-submit' => 'Tampilkan',
 
@@ -2163,7 +2198,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
 'wantedpages' => 'Halaman yang diinginkan',
 'wantedpages-badtitle' => 'Judul tak valid dalam himpunan hasil: $1',
 'wantedfiles' => 'Berkas yang diinginkan',
-'wantedfiletext-cat' => 'Berkas-berkas berikut digunakan tetapi tidak ada. Berkas dari repositori asing mungkin tercantum meskipun ada. Setiap "false positive" akan <del>dicoret</del>. Selain itu, halaman yang menggunakan berkas yang tidak ada eksis akan dicantumkan dalam [[:$1]].',
+'wantedfiletext-cat' => 'Berkas-berkas berikut digunakan tetapi tidak ada. Berkas dari repositori asing mungkin tercantum meskipun ada. Setiap "false positive" akan <del>dicoret</del>. Selain itu, halaman yang menggunakan berkas yang tidak ada akan dicantumkan dalam [[:$1]].',
 'wantedfiletext-nocat' => 'Berkas-berkas berikut digunakan tetapi tidak ada. Berkas dari repositori asing mungkin tercantum meskipun ada. Setiap "false positive" akan <del>dicoret</del>.',
 'wantedtemplates' => 'Templat yang diinginkan',
 'mostlinked' => 'Halaman yang tersering dituju',
@@ -2189,7 +2224,7 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
 'protectedtitlesempty' => 'Tidak ada judul yang dilindungi.',
 'listusers' => 'Daftar pengguna',
 'listusers-editsonly' => 'Tampilkan hanya pengguna yang memiliki kontribusi',
-'listusers-creationsort' => 'Urutkan menurut tanggal pembuatan',
+'listusers-creationsort' => 'Urutkan menurut tanggal pendaftaran',
 'usereditcount' => '$1 {{PLURAL:$1|suntingan|suntingan}}',
 'usercreated' => '{{GENDER:$3|Dibuat}} pada $1 pukul $2',
 'newpages' => 'Halaman baru',
@@ -2240,7 +2275,7 @@ Anda dapat melakukan pembatasan tampilan dengan memilih jenis log, nama pengguna
 'allnotinnamespace' => 'Daftar halaman (bukan ruang nama $1)',
 'allpagesprev' => 'Sebelumnya',
 'allpagesnext' => 'Selanjutnya',
-'allpagessubmit' => 'Pergi',
+'allpagessubmit' => 'Lanjut',
 'allpagesprefix' => 'Tampilkan halaman dengan awalan:',
 'allpagesbadtitle' => 'Judul halaman yang diberikan tidak sah atau memiliki awalan antar-bahasa atau antar-wiki. Judul tersebut mungkin juga mengandung satu atau lebih aksara yang tidak dapat digunakan dalam judul.',
 'allpages-bad-ns' => '{{SITENAME}} tidak memiliki ruang nama "$1".',
@@ -2302,7 +2337,7 @@ Perlu sedikitnya satu domain tingkat atas, misalnya "*.org".<br />
 'listgrouprights-members' => '(daftar anggota)',
 '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' => 'Menambahkan {{PLURAL:$2|kelompok|kelompok}}: $1',
+'listgrouprights-addgroup' => 'Menambahkan {{PLURAL:$2|kelompok}}: $1',
 'listgrouprights-removegroup' => 'Menghapus {{PLURAL:$2|kelompok|kelompok}}: $1',
 'listgrouprights-addgroup-all' => 'Menambahkan semua kelompok',
 'listgrouprights-removegroup-all' => 'Menghapus semua kelompok',
@@ -2370,8 +2405,8 @@ Perubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan ter
 'notvisiblerev' => 'Revisi telah dihapus',
 'watchnochange' => 'Tak ada halaman pantauan Anda yang telah berubah dalam jangka waktu yang dipilih.',
 'watchlist-details' => 'Terdapat {{PLURAL:$1|$1 halaman|$1 halaman}} di daftar pantauan Anda, tidak termasuk halaman pembicaraan.',
-'wlheader-enotif' => 'Notifikasi surel diaktifkan.',
-'wlheader-showupdated' => "* Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''",
+'wlheader-enotif' => 'Notifikasi surel diaktifkan.',
+'wlheader-showupdated' => "Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''.",
 'watchmethod-recent' => 'periksa daftar perubahan terbaru terhadap halaman yang dipantau',
 'watchmethod-list' => 'periksa halaman yang dipantau terhadap perubahan terbaru',
 'watchlistcontains' => 'Daftar pantauan Anda berisi $1 {{PLURAL:$1|halaman|halaman}}.',
@@ -2746,9 +2781,9 @@ Alasan yang diberikan untuk pemblokiran $1 adalah: "$2"',
 'blocklog-showsuppresslog' => 'Pengguna ini telah diblokir dan disembunyikan sebelumnya. Log supresi disediakan di bawah untuk referensi:',
 'blocklogentry' => 'memblokir [[$1]] dengan waktu kedaluwarsa $2 $3',
 'reblock-logentry' => 'mengubah pemblokiran [[$1]] dengan waktu kedaluwarsa $2 $3',
-'blocklogtext' => 'Di bawah ko adolah log panyakek jo pambukaan sakek pado pangguno.
-Alamaik IP nan kanai sakek sacaro otomatis indak nampak dalam dafta ko.
-Lihek [[Special:BlockList|dafta panyakek]] untuak kasado pangguno nan koni kanai sakek.',
+'blocklogtext' => 'Di bawah ini adalah log pemblokiran dan pembukaan blokir terhadap pengguna.
+Alamat IP yang diblokir secara otomatis tidak terdapat di dalam daftar ini.
+Lihat [[Special:BlockList|daftar pemblokiran]] untuk semua pengguna yang saat ini diblokir.',
 'unblocklogentry' => 'menghilangkan blokir "$1"',
 'block-log-flags-anononly' => 'hanya pengguna anonim',
 'block-log-flags-nocreate' => 'pembuatan akun dimatikan',
@@ -2777,6 +2812,7 @@ Lihek [[Special:BlockList|dafta panyakek]] untuak kasado pangguno nan koni kanai
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL.',
 'sorbs_create_account_reason' => 'Alamat IP anda terdaftar sebagai proxy terbuka di DNSBL. Anda tidak dapat membuat akun.',
+'xffblockreason' => 'Sebuah alamat IP di kepala X-Forwarded-For, entah milik Anda atau server proxy yang Anda pakai, telah diblokir. Alasan pemblokirannya adalah: $1',
 'cant-block-while-blocked' => 'Anda tidak dapat memblokir pengguna lain ketika Anda sendiri sedang diblokir.',
 'cant-see-hidden-user' => 'Pengguna yang anda coba blokir telah di blokir dan di sembunyikan. Selama anda tidak memiliki hak sembunyikan pengguna, anda tidak dapat melihat atau menyunting pemblokiran pengguna ini.',
 'ipbblocked' => 'Anda tidak dapat memblokir atau membuka blokir pengguna lain, karena anda sendiri diblokir',
@@ -3085,17 +3121,11 @@ Simpan ke komputer Anda dan unggah ke sini.',
 
 # Stylesheets
 'common.css' => '/* CSS yang ada di sini akan diterapkan pada semua kulit. */',
-'standard.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Standar. */',
-'nostalgia.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Nostalgia. */',
 'cologneblue.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Cologne Blue. */',
 'monobook.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Monobook. */',
-'myskin.css' => '/* CSS yang ada di sini akan diterapkan pada kulit MySkin. */',
-'chick.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Chick. */',
-'simple.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Sederhana. */',
 'modern.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Modern. */',
-'vector.css' => '/* CSS yang ada di sini akan diterapkan pada kulit Vektor. */',
+'vector.css' => '/* CSS nan ado di siko diterapkan pado kulik Vektor. */',
 'print.css' => '/* CSS yang ada di sini akan diterapkan pada tampilan cetak. */',
-'handheld.css' => '/* CSS yang ada di sini akan diterapkan untuk tampilan piranti genggam yang dikonfigurasi di $wgHandheldStyle. */',
 'noscript.css' => '/* CSS di sini akan mempengaruhi pengguna dengan skrip Java non-aktif */',
 'group-autoconfirmed.css' => '/* CSS di sini hanya mempengaruhi pengguna terkonfirmasi otomatis */',
 'group-bot.css' => '/* CSS di sini hanya mempengaruhi bot */',
@@ -3104,13 +3134,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
 
 # Scripts
 'common.js' => '/* JavaScript yang ada di sini akan diterapkan untuk semua kulit. */',
-'standard.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Standard */',
-'nostalgia.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Nostalgia */',
 'cologneblue.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Cologne Blue */',
 'monobook.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MonoBook */',
-'myskin.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit MySkin */',
-'chick.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Chick */',
-'simple.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Simple */',
 'modern.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Modern */',
 'vector.js' => '/* Semua JavaScript di sini akan dimuatkan untuk para pengguna yang menggunakan kulit Vector */',
 'group-autoconfirmed.js' => '/* Semua JavaScript di sini hanya dimuatkan untuk pengguna terkonfirmasi otomatis */',
@@ -3140,7 +3165,7 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
 'spamprotectionmatch' => 'Teks berikut ini memancing filter spam kami: $1',
 'spambot_username' => 'Pembersihan span MediaWiki',
 'spam_reverting' => 'Membatalkan ke versi terakhir yang tak memiliki pranala ke $1',
-'spam_blanking' => 'Semua revisi yang memiliki pranala ke $1, pengosongan',
+'spam_blanking' => 'Semua revisi yang memiliki pranala ke $1, kosong',
 'spam_deleting' => 'Semua revisi yang memiliki pranala ke $1, penghapusan',
 
 # Info page
@@ -3176,10 +3201,10 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
 'pageinfo-magic-words' => '{{PLURAL:$1|Kata|Kata}} ajaib ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategori|Kategori}} tersembunyi ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Templat|Templat}} yang ditransklusi ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|Halaman|Halaman}} ditransklusikan pada ( $1 )',
+'pageinfo-transclusions' => '{{PLURAL:$1|Halaman}} ditransklusikan pada ($1)',
 'pageinfo-toolboxlink' => 'Informasi halaman',
 'pageinfo-redirectsto' => 'Beralih ke',
-'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-redirectsto-info' => 'info',
 'pageinfo-contentpage' => 'Dihitung sebagai halaman konten',
 'pageinfo-contentpage-yes' => 'Ya',
 'pageinfo-protect-cascading' => 'Perlindungan berurutan dari sini',
@@ -3191,13 +3216,8 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
 'pageinfo-category-files' => 'Jumlah berkas',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Biru Köln',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sederhana',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3278,15 +3298,29 @@ Jika dijalankan, sistem Anda akan berisiko terserang.",
 'minutes-abbrev' => '$1 mnt',
 'hours-abbrev' => '$1 j',
 'days-abbrev' => '$1 h',
-'seconds' => '{{PLURAL:$1|$1 detik|$1 detik}}',
+'seconds' => '{{PLURAL:$1|satu detik|$1 detik}}',
 'minutes' => '{{PLURAL:$1|$1 menit|$1 menit}}',
 'hours' => '{{PLURAL:$1|$1 jam|$1 jam}}',
 'days' => '{{PLURAL:$1|$1 hari|$1 hari}}',
+'weeks' => '{{PLURAL:$1|$1 minggu|$1 minggu}}',
 'months' => '{{PLURAL:$1|$1 bulan|$1 bulan}}',
 'years' => '{{PLURAL:$1|$1 tahun|$1 tahun}}',
 'ago' => '$1 yang lalu',
 'just-now' => 'baru saja',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|jam}} yang lalu',
+'minutes-ago' => '$1 {{PLURAL:$1|menit}} yang lalu',
+'seconds-ago' => '$1 {{PLURAL:$1|detik}} yang lalu',
+'monday-at' => 'Senin pukul $1',
+'tuesday-at' => 'Selasa pukul $1',
+'wednesday-at' => 'Rabu pukul $1',
+'thursday-at' => 'Kamis pukul $1',
+'friday-at' => 'Jumat pukul $1',
+'saturday-at' => 'Sabtu pukul $1',
+'sunday-at' => 'Minggu pukul $1',
+'yesterday-at' => 'Kemarin pukul $1',
+
 # Bad image list
 'bad_image_list' => 'Formatnya sebagai berikut:
 
@@ -3296,8 +3330,6 @@ Pranala-pranala selanjutnya pada baris yang sama dianggap sebagai pengecualian,
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3348,7 +3380,7 @@ Data lain akan disembunyikan secara bawaan.
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lebar',
 'exif-imagelength' => 'Tinggi',
 'exif-bitspersample' => 'Bit per komponen',
@@ -3541,7 +3573,7 @@ $4, $5 - $6, $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Tak terkompresi',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman RLE',
 'exif-compression-3' => 'CCITT Group 3 fax encoding',
@@ -3704,8 +3736,8 @@ $8',
 'exif-gpslongitude-w' => 'Bujur barat',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|meter|meter}} di atas permukaan laut',
-'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|meter|meter}} di bawah permukaan laut',
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|meter}} di atas permukaan laut',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|meter}} di bawah permukaan laut',
 
 'exif-gpsstatus-a' => 'Pengukuran sedang berlangsung',
 'exif-gpsstatus-v' => 'Interoperabilitas pengukuran',
@@ -3943,8 +3975,8 @@ Anda juga dapat [[Special:EditWatchlist|menggunakan penyunting standar Anda]].',
 'watchlistedit-raw-titles' => 'Judul:',
 'watchlistedit-raw-submit' => 'Perbarui daftar pantauan',
 'watchlistedit-raw-done' => 'Daftar pantauan Anda telah diperbarui.',
-'watchlistedit-raw-added' => '{{PLURAL:$1|1 judul telah|$1 judul telah}} ditambahkan:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|1 judul telah|$1 judul telah}} dikeluarkan:',
+'watchlistedit-raw-added' => '{{PLURAL:$1|$1 judul telah}} ditambahkan:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|$1 judul telah}} dikeluarkan:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Tampilkan perubahan terkait',
@@ -4036,12 +4068,10 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]',
 
-# Special:FilePath
-'filepath' => 'Lokasi berkas',
-'filepath-page' => 'Berkas:',
-'filepath-submit' => 'Cari',
-'filepath-summary' => 'Halaman istimewa ini menampilkan jalur lengkap untuk suatu berkas.
-Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsung dengan program terkaitnya.',
+# Special:Redirect
+'redirect' => 'Pengalihan oleh berkas, pengguna atau ID revisi',
+'redirect-legend' => 'Pengalihan ke sebuah berkas atau halaman',
+'redirect-submit' => 'Lanjut',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pencarian berkas duplikat',
@@ -4051,7 +4081,7 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'fileduplicatesearch-submit' => 'Cari',
 'fileduplicatesearch-info' => '$1 × $2 piksel<br />Besar berkas: $3<br />Tipe MIME: $4',
 'fileduplicatesearch-result-1' => 'Berkas "$1" tidak memiliki duplikat identik.',
-'fileduplicatesearch-result-n' => 'Berkas "$1" memiliki {{PLURAL:$2|1 duplikat identik|$2 duplikat identik}}.',
+'fileduplicatesearch-result-n' => 'Berkas "$1" memiliki {{PLURAL:$2|$2 duplikat identik}}.',
 'fileduplicatesearch-noresults' => 'Tidak ditemukan berkas dengan nama "$1".',
 
 # Special:SpecialPages
@@ -4131,23 +4161,26 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'htmlform-submit' => 'Kirim',
 'htmlform-reset' => 'Balikkan perubahan',
 'htmlform-selectorother-other' => 'Lain-lain',
+'htmlform-no' => 'Tidak',
+'htmlform-yes' => 'Ya',
+'htmlform-chosen-placeholder' => 'Pilih opsi',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 dengan dukungan pencarian teks lengkap',
 'sqlite-no-fts' => '$1 tanpa dukungan pencarian teks lengkap',
 
 # New logging system
-'logentry-delete-delete' => '$1 menghapus halaman $3',
-'logentry-delete-restore' => '$1 mengembalikan halaman $3',
-'logentry-delete-event' => '$1 mengubah ketertampilan {{PLURAL:$5||}} $5  log peristiwa di $3: $4',
-'logentry-delete-revision' => '$1 mengubah ketertampilan {{PLURAL:$5||}} $5  revisi di halaman $3: $4',
-'logentry-delete-event-legacy' => '$1 mengubah ketertampilan log peristiwa pada $3',
-'logentry-delete-revision-legacy' => '$1 mengubah ketertampilan revisi pada halaman $3',
-'logentry-suppress-delete' => '$1 mensupresi halaman $3',
-'logentry-suppress-event' => '$1 secara diam-diam mengubah ketertampilan  {{PLURAL:$5||}} $5  log peristiwa di $3: $4',
-'logentry-suppress-revision' => '$1 diam-diam mengubah ketertampilan {{PLURAL:$5||}} $5 revisi di halaman $3: $4',
-'logentry-suppress-event-legacy' => '$1 diam-diam mengubah ketertampilan log peristiwa pada $3',
-'logentry-suppress-revision-legacy' => '$1 diam-diam mengubah ketertampilan revisi pada halaman $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|menghapus}} halaman $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|mengembalikan}} halaman $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5 log peristiwa}} di $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5  revisi}} di halaman $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|mengubah}} tampilan log peristiwa pada $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|mengubah}} tampilan revisi pada halaman $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|menimpa}} halaman $3',
+'logentry-suppress-event' => '$1 secara diam-diam {{GENDER:$2|mengubah}} tampilan  {{PLURAL:$5|$5 log peristiwa}} di $3: $4',
+'logentry-suppress-revision' => '$1 diam-diam {{GENDER:$2|mengubah}} tampilan {{PLURAL:$5|$5 revisi}} di halaman $3: $4',
+'logentry-suppress-event-legacy' => '$1 diam-diam {{GENDER:$2|mengubah}} tampilan log peristiwa pada $3',
+'logentry-suppress-revision-legacy' => '$1 diam-diam {{GENDER:$2|mengubah}} tampilan revisi pada halaman $3',
 'revdelete-content-hid' => 'konten disembunyikan',
 'revdelete-summary-hid' => 'ringkasan suntingan disembunyikan',
 'revdelete-uname-hid' => 'nama pengguna disembunyikan',
@@ -4156,20 +4189,20 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'revdelete-uname-unhid' => 'nama pengguna tidak disembunyikan',
 'revdelete-restricted' => 'akses telah dibatasi untuk opsis',
 'revdelete-unrestricted' => 'pembatasan akses opsis dihapuskan',
-'logentry-move-move' => '$1 memindahkan halaman $3 ke $4',
-'logentry-move-move-noredirect' => '$1 memindahkan halaman $3 ke $4 tanpa membuat pengalihan',
-'logentry-move-move_redir' => '$1 memindahkan halaman $3 ke $4 menimpa pengalihan lama',
-'logentry-move-move_redir-noredirect' => '$1 memindahkan halaman $3 ke $4 menimpa pengalihan lama tanpa membuat pengalihan',
-'logentry-patrol-patrol' => '$1 menandai revisi $4 dari halaman $3 terpatroli',
-'logentry-patrol-patrol-auto' => '$1 secara otomatis menandai revisi $4 dari halaman $3 terpatroli',
-'logentry-newusers-newusers' => 'Akun pengguna $1 telah dibuat',
-'logentry-newusers-create' => '$1 membuat akun pengguna',
-'logentry-newusers-create2' => '$1 membuat akun pengguna $3',
-'logentry-newusers-byemail' => 'Akun pengguna  $3  diciptakan oleh  $1  dan password dikirim melalui surel',
-'logentry-newusers-autocreate' => 'Akun $1 dibuat secara otomatis',
-'logentry-rights-rights' => '$1 mengubah keanggotaan grup $3 dari $4 menjadi $5',
-'logentry-rights-rights-legacy' => '$1 mengubah keanggotaan grup $3',
-'logentry-rights-autopromote' => '$1 secara otomatis dipromosikan dari $4 menjadi $5',
+'logentry-move-move' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa membuat pengalihan',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 menimpa pengalihan lama',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|memindahkan}} halaman $3 ke $4 menimpa pengalihan lama tanpa membuat pengalihan',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|menandai}} revisi $4 dari halaman $3 terpatroli',
+'logentry-patrol-patrol-auto' => '$1 otomatis {{GENDER:$2|menandai}} revisi $4 dari halaman $3 terpatroli',
+'logentry-newusers-newusers' => 'Akun pengguna $1 telah {{GENDER:$2|dibuat}}',
+'logentry-newusers-create' => '$1 {{GENDER:$2|membuat}} akun pengguna',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|membuat}} akun pengguna $3',
+'logentry-newusers-byemail' => 'Akun pengguna  $3  {{GENDER:$2|dibuat}} oleh  $1  dan password dikirim melalui surel',
+'logentry-newusers-autocreate' => 'Akun $1 {{GENDER:$2|dibuat}} secara otomatis',
+'logentry-rights-rights' => '$1 {{GENDER:$2|mengubah}} keanggotaan grup $3 dari $4 menjadi $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|mengubah}} keanggotaan grup $3',
+'logentry-rights-autopromote' => '$1 secara otomatis {{GENDER:$2|dipromosikan}} dari $4 menjadi $5',
 'rightsnone' => '(tidak ada)',
 
 # Feedback
index 281987d..31f7d1f 100644 (file)
@@ -161,8 +161,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Monstrar li númere de usatores vigilant',
 'tog-oldsig' => 'Prevision de signature in existentie:',
 'tog-fancysig' => 'Tractar signature quam textu wiki (sin un catenun auto-crate)',
-'tog-externaleditor' => 'Usar redactor extern per contumacie (solmen por usatores expert, besona de colocationes special in tui computator. [//www.mediawiki.org/wiki/Manual:External_editors Plu information.])',
-'tog-externaldiff' => 'Usar diferentie extern per contumacie (solmen por usatores expert, besona de colocationes special in tui computator. [//www.mediawiki.org/wiki/Manual:External_editors Plu information.])',
 'tog-showjumplinks' => 'Permisser catenunes de accessebilitá "saltar a"',
 'tog-uselivepreview' => 'Usar prevision in vivi (exige JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Suggester me quande intrar un redaction che summarium in blanc',
@@ -648,9 +646,6 @@ Vider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e ba
 'search-nonefound' => 'Ne esset constatat resultates por li question.',
 'powersearch' => 'Serchar avansat',
 
-# Quickbar
-'qbsettings' => 'Personalisation del barre de utensiles',
-
 # Preferences page
 'preferences' => 'Preferenties',
 'mypreferences' => 'Mi preferenties',
@@ -996,8 +991,8 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
 'unwatch' => 'Desvigilar',
 'watchnochange' => 'Nequant de tui tui partes vigilat esset redactet in li periode de témpor monstrat.',
 'watchlist-details' => '{{PLURAL:$1|$1 págine|$1 págines}} in tui liste de págines vigilat, sin págines de discussion.',
-'wlheader-enotif' => 'Li notification de e-mail es permisset.',
-'wlheader-showupdated' => "Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
+'wlheader-enotif' => 'Li notification de e-mail es permisset.',
+'wlheader-showupdated' => "Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
 'watchmethod-recent' => 'controlant nov redactiones por págines vigilat',
 'watchmethod-list' => 'controlant págines vigilat por nov redactiones',
 'watchlistcontains' => 'Tui liste de págines vigilat contene $1 {{PLURAL:$1|págine|págines}}.',
@@ -1372,9 +1367,6 @@ Vu posse anc [[Special:EditWatchlist|usar li redactor uniform]].',
 'version-software-product' => 'Producte',
 'version-software-version' => 'Version',
 
-# Special:FilePath
-'filepath-page' => 'Figura:',
-
 # Special:SpecialPages
 'specialpages' => 'Págines special',
 'specialpages-group-maintenance' => 'Raportes de conservation',
index 05ea9a4..0157257 100644 (file)
@@ -104,8 +104,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zi onuogụgụ ndi na banife nke ne lé',
 'tog-oldsig' => 'Létu ntakiri ndẹlu ejị a ma gí:',
 'tog-fancysig' => 'Mesò ka nkábi nwéré édé wiki (nké énwéghị jikodo nke nọr na onwe)',
-'tog-externaleditor' => 'Jí irü èzí nà áká (màkà ndi òkà nání, ȯ chọrọ ndósé nke kárí na nsónùsòrò gi)',
-'tog-externaldiff' => 'Jí nkéichè èzí nà áká (màkà ndi òkà nání, ȯ chọrọ ndósé nke kárí na nsónùsòrò gi)',
 'tog-showjumplinks' => 'Kwé ka njikodo "mani énū" I mé',
 'tog-uselivepreview' => 'Jí nlé ntàkírí dí ndụ (Í gí nwé JavaScript) (mmètú kanyí lé)',
 'tog-forceeditsummary' => 'Gwam mgbè okwu nsem màkà orüm rürü a díghị',
@@ -749,14 +747,6 @@ Nwàné ótù okwu íshí na ihe Í nè tú jí ''háníle:'' Í tuó ihe nílé
 'powersearch-toggleall' => 'Haníle',
 'powersearch-togglenone' => 'Efù',
 
-# Quickbar
-'qbsettings' => 'Mkpọrọ-ȯsȯ-ọsọ',
-'qbsettings-none' => 'Efù',
-'qbsettings-fixedleft' => 'Gbado na áká èkpè',
-'qbsettings-fixedright' => 'Gbado na áká ìkengà',
-'qbsettings-floatingleft' => 'Ne fé na áká èkpè',
-'qbsettings-floatingright' => 'Ne fé na áká nrí',
-
 # Preferences page
 'preferences' => 'Otu ha dosẹrẹ ihe',
 'mypreferences' => 'Otú m shị na dose ihem',
@@ -1115,7 +1105,7 @@ Ubwa, o na ga [[$2]].',
 'listgrouprights-addgroup' => 'Gbàkọ {{PLURAL:$2|ọtú|ọtú}}: $1',
 'listgrouprights-addgroup-all' => 'Tìnyé ọtú nílé',
 
-# E-mail user
+# Email user
 'emailuser' => 'Zi onye á ózí-nsónùsòrò',
 'emailpage' => "Mé ọ'bànifé e-mailù",
 'defemailsubject' => 'e-mail {{SITENAME}}',
@@ -1524,7 +1514,7 @@ Nke ozor gí zonari na áká onwe ha.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Àsáa',
 'exif-imagelength' => 'Ógólógó',
 'exif-orientation' => 'Ívú nà àsáa',
@@ -1695,11 +1685,6 @@ Nke ozor gí zonari na áká onwe ha.
 'version-entrypoints-header-entrypoint' => 'Ébé ọ̀bụ̀bà',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Uzọ usòrò',
-'filepath-page' => 'Usòrò:',
-'filepath-submit' => 'Gá',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Áhà usòrò:',
 'fileduplicatesearch-submit' => 'Chọwa',
index 9a96023..d19a789 100644 (file)
@@ -45,9 +45,9 @@ $messages = array(
 'tog-usenewrc' => 'Dagiti grupo a panagbaliw babaen ti panid kadagiti kinaudi a panagbaliw ken banbantayan  (masapul ti JavaScript)',
 'tog-numberheadings' => 'Automatiko a pabilangan dagiti paulo',
 'tog-showtoolbar' => 'Ipakita ti ramit ti panag-urnos (masapul ti JavaScript)',
-'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagtakla (masapul ti JavaScript)',
-'tog-editsection' => 'Pakabaelan ti paset a panag-urnos babaen kadagiti [urnosen] a  panilpo',
-'tog-editsectiononrightclick' => 'Pakabaelan ti paset  a panag-urnos babaen ti panagtakla ti kanawan kadagiti paset a titulo (masapul ti JavaScript)',
+'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagpindut (masapul ti JavaScript)',
+'tog-editsection' => 'Pakabaelan ti paset a panag-urnos babaen kadagiti silpo nga [urnosen]',
+'tog-editsectiononrightclick' => 'Pakabaelan ti paset  a panag-urnos babaen ti panagpindut ti kanawan kadagiti paset a titulo (masapul ti JavaScript)',
 'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga adda ti ad-adu ngem dagiti 3 a paulo)',
 'tog-rememberpassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kapaut nga $1 {{PLURAL:$1|aldaw|al-aldaw}})',
 'tog-watchcreations' => 'Agnayon kadagiti panid a pinartuatko ken papeles nga inpanko idiay listaan ti bambantayak',
@@ -65,8 +65,6 @@ $messages = array(
 '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 panagsilpo)',
-'tog-externaleditor' => 'Isigud ti panag-usar iti ruar a pnag-urnos (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
-'tog-externaldiff' => 'Isigud ti panag-usar iti ruar a  sabali (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a panagikabil idiay kompiutermo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
 'tog-showjumplinks' => 'Pakabaelan a "lumaktaw kadagiti" naipalaka a pagserkan a silpo',
 'tog-uselivepreview' => 'Usaren ti agdama a panagpadas (masapul ti JavaScript) (eksperimento)',
 'tog-forceeditsummary' => 'Pakaammuannak no sumrek ti blanko a pakabuklan ti panag-urnos',
@@ -80,6 +78,7 @@ $messages = array(
 'tog-diffonly' => 'Saan nga iparang ti linaon ti panid dita baba dagiti pagiddiatan',
 'tog-showhiddencats' => 'Ipakita dagiti nailemmeng a kategoria',
 'tog-norollbackdiff' => 'Laksiden ti paggiddiatan kalpasan ti panagaramid ti panagisubli',
+'tog-useeditwarning' => 'Pakaunaannak no pumanawak ti pagurnosan a panid nga adda ti saan a naidulin a sinuksukatan',
 
 'underline-always' => 'Kanayon',
 'underline-never' => 'Saan uray kaanoman',
@@ -143,6 +142,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nob',
 'dec' => 'Dis',
+'january-date' => 'Enero $1',
+'february-date' => 'Pebrero $1',
+'march-date' => 'Marso $1',
+'april-date' => 'Abril $1',
+'may-date' => 'Mayo $1',
+'june-date' => 'Hunio $1',
+'july-date' => 'Hulio $1',
+'august-date' => 'Agosto $1',
+'september-date' => 'Septiembre $1',
+'october-date' => 'Oktubre $1',
+'november-date' => 'Nobiembre $1',
+'december-date' => 'Disiembre $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Katkategoria}}',
@@ -453,9 +464,18 @@ Laglagipem a sumagmamano a pampanid ti mabalin a nakaparang latta a kasla nakase
 'welcomecreation-msg' => 'Naaramiden ti pakabilangam.
 Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITENAME}} kakaykayatan]].',
 'yourname' => 'Nagan ti agar-aramat:',
+'userlogin-yourname' => 'Nagan ti agar-aramat',
+'userlogin-yourname-ph' => 'Ikabil ti naganmo nga agar-aramat',
 'yourpassword' => 'Kontrasenias:',
+'userlogin-yourpassword' => 'Kontrasenias',
+'userlogin-yourpassword-ph' => 'Ikabilmo ti kontrasenias',
+'createacct-yourpassword-ph' => 'Agikabil ti kontrasenias',
 'yourpasswordagain' => 'Uliten ti kontrasenias:',
+'createacct-yourpasswordagain' => 'Pasingkedan ti kontrasenias',
+'createacct-yourpasswordagain-ph' => 'Ikabil manen ti kontrasenias',
 'remembermypassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (para iti kapaut iti $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})',
+'userlogin-remembermypassword' => 'Taginayonennak nga iserrek',
+'userlogin-signwithsecure' => 'Usaren ti natalged a pannakaikapet',
 'securelogin-stick-https' => 'Agyanka a nakasilpo iti HTTPS kalpasan no nakastrekka',
 'yourdomainname' => 'Ti bukodmo a pagturayan:',
 'password-change-forbidden' => 'Saanmo a mabalin ti mangbaliw kadagiti kontrasenias iti daytoy a wiki.',
@@ -468,18 +488,38 @@ Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITE
 'logout' => 'Rummuar',
 'userlogout' => 'Rummuar',
 'notloggedin' => 'Saan a nakastrek',
+'userlogin-noaccount' => 'Awan ti pakabilangam?',
+'userlogin-joinproject' => 'Tumipon {{SITENAME}}',
 'nologin' => "Awan kadi pay ti pakabilangam? '''$1'''.",
 'nologinlink' => 'Agaramid ti pakabilangan',
-'createaccount' => 'Agaramid ti pakabilangan',
+'createaccount' => 'Agaramiden ti pakabilangan',
 'gotaccount' => "Addaanka kadin ti pakabilangam? '''$1'''.",
 'gotaccountlink' => 'Sumrek',
-'userlogin-resetlink' => 'Nalipatam dagiti salaysay ti pagserrek mo?',
+'userlogin-resetlink' => 'Nalipatam dagiti salaysay ti pagserrekmo?',
+'userlogin-resetpassword-link' => 'Iyasentar manen ti kontrasenias',
+'helplogin-url' => 'Help:Panagserrek',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Tulong iti panagserrek]]',
+'createacct-join' => 'Ikabil ti pakaammom dita baba.',
+'createacct-emailrequired' => 'Esurat a pagtaengan',
+'createacct-emailoptional' => 'Esurat a pagtaengan (pagpilian)',
+'createacct-email-ph' => 'Ikabil ti esurat a pagtaengam',
 'createaccountmail' => 'Agusar ti maysa a temporario a pugto a kontrasenias ken ipatulod idiay esurat a pagtaengan a nainaganan dita baba',
+'createacct-realname' => 'Pudno a nagan (pagpilian)',
 'createaccountreason' => 'Rason:',
+'createacct-reason' => 'Rason',
+'createacct-reason-ph' => 'Apay nga agparpartuatka manen ti pakabilangam',
+'createacct-captcha' => 'Panagkita ti pannakatalinaay',
+'createacct-imgcaptcha-ph' => 'Ikabil ti testo a makitam dita ngato',
+'createacct-submit' => 'Partuatem ti pakabilangam',
+'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 impanmo a kontrasenias.',
 'userexists' => 'Maus-usaren ti nagan a kayatmo.
 Pangngaasi nga agpilika ti sabali a nagan.',
 'loginerror' => 'Biddut ti sumrek',
+'createacct-error' => 'Biddut a panagpartuat ti pakabilangan',
 'createaccounterror' => 'Saan a makaaramid ti pakabilangan: $1',
 'nocookiesnew' => 'Naaramid ti pakabilangan ti agar-aramat, ngem saanka a nakastrek.
 Ti {{SITENAME}} ket agususar kadagiti "galietas" tapno maiserrek dagiti agaramat.
@@ -538,11 +578,11 @@ Awan ti esurat a naipatulod para kadagiti sumaganad a langa.',
 'invalidemailaddress' => 'Ti esurat a pagtaengam ket saan a maawat ngamin ket kasla adda ti saan a napudno a nakabuklan.
 Pangngaasi nga ikkam ti nasayaat a nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
 'cannotchangeemail' => 'Dagiti pakabilangan nga esurat a pagtaengan ket saan a mabaliwan ditoy a wiki.',
-'emaildisabled' => 'Daytoy a pagsaaadan ket saan a makaipatuod kadagiti e-surat.',
+'emaildisabled' => 'Daytoy a pagsaaadan ket saan a makaipatulod kadagiti esurat.',
 'accountcreated' => 'Naaramiden ti pakabilangan',
 'accountcreatedtext' => 'Ti pakabilangan ti agar-aramat para iti  $1 ket naaramiden.',
 'createaccount-title' => 'Panagaramid iti pakabilangan para iti {{SITENAME}}',
-'createaccount-text' => 'Adda nagaramid ti pakabilangan para iti e-surat a pagtaengam idiay {{SITENAME}} ($4) nga agnagan  ti "$2", iti kontrasenias a "$3".
+'createaccount-text' => 'Adda nagaramid ti pakabilangan para iti esurat a pagtaengam idiay {{SITENAME}} ($4) nga agnagan  ti "$2", iti kontrasenias a "$3".
 Nasken a sumrekka ken sukatam ti kontraseniasmo tattan.
 
 Mabalinmo ti saan a mangikaskaso ti daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.',
@@ -567,7 +607,7 @@ Tapno malpaska a makastrek, nasken a mangikabilka ti baro a kontrasenias ditoy:'
 'newpassword' => 'Baro a kontrasenias:',
 'retypenew' => 'Imakinilya manen ti baro a kontrasenias:',
 'resetpass_submit' => 'Ikabil ti kontrasenias ken sumrek',
-'resetpass_success' => 'Nagballigi a nabaliwan ti kontrasenias mo! 
+'resetpass_success' => 'Nagballigi a nabaliwan ti kontraseniasmo! 
 </br>
 Iserrek kan...',
 'resetpass_forbidden' => 'Saan a masukatan dagiti kontrasenias',
@@ -577,17 +617,17 @@ Iserrek kan...',
 'resetpass-wrong-oldpass' => 'Imbalido ti temporario wenno agdama a kontrasenias.
 Mabalin a nagballigi ti panagsukatmo ti kontrasenias wenno nagkiddaw ti baro a temporario a kontrasenias.',
 'resetpass-temp-password' => 'Temporario a kontrasenias:',
+'resetpass-abort-generic' => 'Ti panagsukat ti kontrasenias ket pinasardeng babaen ti pagpaatiddog.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ipasubli ti kontrasenias',
-'passwordreset-text' => 'Lippasem daytoy a porma tapno maidisso manen ti bukodmo a kontrasenias.',
 'passwordreset-legend' => 'Ipasubli ti kontrasenias',
 'passwordreset-disabled' => 'Nabaldado dagiti panagisubli ti kontrasenias iti daytoy a wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a piraso ti datos dita baba}}',
+'passwordreset-emaildisabled' => 'Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.',
 'passwordreset-username' => 'Nagan ti agar-aramat:',
 'passwordreset-domain' => 'Pagturayan:',
 'passwordreset-capture' => 'Kitaem ti nagbanagan ti esurat?',
-'passwordreset-capture-help' => 'No markaam daytoy a kahon, ti e-surat (nga adda ti temporario a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.',
+'passwordreset-capture-help' => 'No markaam daytoy a kahon, ti esurat (nga adda ti temporario a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.',
 'passwordreset-email' => 'Esurat a pagtaengan:',
 'passwordreset-emailtitle' => 'Salaysay ti pakabilangan iti {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangidisso manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket
@@ -596,9 +636,9 @@ nakairaman iti daytoy nga esurat a pagtaengan:
 $2
 
 {{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso  {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
-Sumrekka kuman ta agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a 
-panagkiddaw, wenno malagip mo ti dati a kontrasenias mo, ket saan mo a kayaten a sukatan, saan mo nga ikaskaso daytoy a mensahe ken 
-agtuloy ka nga agusar ti daan a kontrasenias.',
+Sumrekka kuman ta agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a 
+panagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken 
+agtuloyka nga agusar ti daan a kontrasenias.',
 'passwordreset-emailtext-user' => 'Daytoy nga  agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangidisso manen ti bukodmo a kontrasenias para iti {{SITENAME}}
 ($4) .  {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilanagn ti agar-aramat ket
 nakairaman iti daytoy nga esurat a pagtaengan:
@@ -613,7 +653,7 @@ agtuloykan nga agusar ti daan a kontraseniasmo.',
 Temporario a kontrasenias: $2',
 'passwordreset-emailsent' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naipatuloden.',
 'passwordreset-emailsent-capture' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naipatuloden, a napaikita dita baba.',
-'passwordreset-emailerror-capture' => 'Ti maysa nga esurat ti panangidisso manen ti kontrasenias ket naaramiden, a napaikita dita baba, ngem napaay a napaitulod iti agar-aramat: $1',
+'passwordreset-emailerror-capture' => 'Naaramid ti maysa nga esurat a panangyasentar manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Sukatan ti esurat a pagtaengan',
@@ -677,7 +717,7 @@ Ti rason ket ''$2''.
 
 Mabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panag-serra.
 Dimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a naipan iti [[Special:Preferences|pakabilangan ti kaykayatmo]] ken no saanka a naparitan nga agaramat iti daytoy.
-Ti agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. Pangngaasim nga iramanmo nga ited ti ania man wenno agpada kadagitoy iti ania man a panagsaludsodmo.",
+Ti agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. Pangngaasim nga iramanmo nga ited ti aniaman wenno agpada kadagitoy iti aniaman a panagsaludsodmo.",
 'autoblockedtext' => 'Ti IP a pagtaengam ket na-automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.
 Ti rason nga inted ket:
 
@@ -702,7 +742,7 @@ Pangngaasim nga ikabil ken ipapudnom ti esuratmo idiay [[Special:Preferences|kay
 Mabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.',
 'loginreqtitle' => 'Masapul ti sumrek',
 'loginreqlink' => 'sumrek',
-'loginreqpagetext' => 'Nasken a $1 ka tapno makakitaka kadagiti sabsabali a pampanid.',
+'loginreqpagetext' => 'Naskenka a $1 tapno makakitaka kadagiti sabsabali a pampanid.',
 'accmailtitle' => 'Naipatuloden ti kontrasenias.',
 'accmailtext' => "Ti kontrasenias para ken ni [[User talk:$1|$1]] ket naipatuloden ken ni $2.
 
@@ -722,9 +762,9 @@ Mabalinmo ti [[Special:Search/{{PAGENAME}}|agsapul iti kastoy a titulo ti panid]
 wenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid].',
 'noarticletext-nopermission' => 'Awan ti agdama  a linaon daytoy a panid.
 Mabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti dadduma a panid, wenno <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat ti daytoy a panid.',
-'missing-revision' => 'Ti panagbalbaliw ti #$1 tipanid a nanaganan ti "{{PAGENAME}}" ket awan.
+'missing-revision' => 'Ti panagbalbaliw ti #$1 iti daytoy a panid a nanaganan ti "{{PAGENAME}}" ket awan.
 
-Daytoy ket kadawyan a gapuanan babaen ti samaganad a panilpo ti baak a pakasaritaan iti maysa a panid a naikkaten.
+Daytoy ket kadawyan a gapuanan babaen ti sumaganad a panilpo ti baak a pakasaritaan iti maysa a naikkaten a panid.
 Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].',
 'userpage-userdoesnotexist' => 'Ti pakabilangan ti agar-aramat "$1" ket saan a nakarehistro. 
 Pangngaasi a kitaem no kayatmo ti agaramid/urnosen daytoy a panid.',
@@ -833,12 +873,15 @@ Awan ti intedna a palawag.',
 Kasla met naikkaten.',
 'edit-conflict' => 'Adda kasinnungat ti panag-urnos.',
 'edit-no-change' => 'Ti inurnosmo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.',
+'postedit-confirmation' => 'Ti inurnosmo ket naidulinen.',
 'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
 Adda met daytoyen.',
 'defaultmessagetext' => 'Kasisigud a testo ti mensahe',
 'content-failed-to-parse' => 'Napaay a nausig 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 idiay [[$2]] a panid',
+'editwarning-warning' => 'Ti ipapanaw ti daytoy a panid ket makapataud ti panakapukaw kadagiti amiaman a binalbaliwam.
+No nakastrekka, mabalinmo nga ibaldado daytoy a ballaag idiay "Panagurnos" a paset kadagiti kakaykayatam.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -854,8 +897,8 @@ Adda koman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}
 'post-expand-template-inclusion-warning' => "'''Ballaag:''' Dakkel unay ti nairaman a kadakkel ti plantilia.
 Adda dagiti plantilia a saanto a mairaman.",
 'post-expand-template-inclusion-category' => 'Pampanid nga ayan ti plantilia a  nagsobra ti kadakkel ti rukod a nairaman',
-'post-expand-template-argument-warning' => "'''Ballaag:''' Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panagpalawag a plantilia a dakkel unay ti panagpadakkel na.
-Dagitoy a panagpalawag  ket naikkaten.",
+'post-expand-template-argument-warning' => "'''Ballaag:''' Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panangipalawag ti plantilia a dakkel unay ti panagpadakkelna.
+Dagitoy a panangipalawag ket naikkaten.",
 'post-expand-template-argument-category' => 'Dagiti panid a naglaon ti naikkat a plantilia kadagiti kasinnungat',
 'parser-template-loop-warning' => 'Adda nasarakan a silo ti plantilia: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Ti kinauneg ti panagdullit ti plantilia ket nagpatingga ti napalabes ($1)',
@@ -872,7 +915,7 @@ Dagitoy a panagpalawag  ket naikkaten.",
 'undo-success' => 'Ti panag-urnos ket saan a maisubli.
 Pangngaasi a kitaen ti pagipadaan dita baba tapno maamuan no agpaypayso ti kayatmo nga aramiden, ken 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-norev' => 'Saan a maibabawi ti naurnos ngamin ket awan met daytoy wenno mabalin a naikkat.',
+'undo-norev' => 'Saan a maibabawi ti naurnos ngamin ket awan daytoy wenno mabalin a naikkaten.',
 'undo-summary' => 'Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])',
 
 # Account creation failure
@@ -1126,15 +1169,7 @@ Padasem a  pasarunuan ti panagbiruk mo ti ''all:'' tapno birukem amin a nagyan (
 'searchdisabled' => 'Ti panagbiruk iti {{SITENAME}} ket nabaldado.
 Mabalin mo ti agbiruk idiay Google tattan.
 Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Awan',
-'qbsettings-fixedleft' => 'Agyan latta iti kanigid',
-'qbsettings-fixedright' => 'Agyan latta iti kanawan',
-'qbsettings-floatingleft' => 'Tumpaw ti kanigid',
-'qbsettings-floatingright' => 'Tumpaw ti kanawan',
-'qbsettings-directionality' => 'Nasimpa, gapu laeng ti papanan ti panagsurat ti pagsasaom',
+'search-error' => 'Adda maysa a biddut  napasamak bayat nga agbirbiruk:$1',
 
 # Preferences page
 'preferences' => 'Kakaykayatan',
@@ -1162,7 +1197,7 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'prefs-resetpass' => 'Sukatan ti kontrasenias',
 'prefs-changeemail' => 'Sukatan ti esurat a pagtaengan',
 'prefs-setemail' => 'Ikabil ti esurat a pagtaengan',
-'prefs-email' => 'Pagpilian ti e-surat',
+'prefs-email' => 'Pagpilian ti esurat',
 'prefs-rendering' => 'Tabas',
 'saveprefs' => 'Idulin',
 'resetprefs' => 'Dalusan dagiti saan a naidulin a sinuksukatan',
@@ -1282,6 +1317,7 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'userrights-notallowed' => 'Awan ti pammalubos ti pakabilangam a mangted iti kakaberngan ti agar-aramat.',
 'userrights-changeable-col' => 'Dagiti grupo a mabalinmo a baliwan',
 'userrights-unchangeable-col' => 'Dagiti grupo a dimo mabalin a baliwan',
+'userrights-conflict' => 'Suppiat ti karbengan ti agar-aramat! Pangngaasi nga ipakatmo manen dagiti sinuksukatam.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1345,7 +1381,7 @@ Ti esurat a pagtaengam ket saan a maipakita kadagiti agar-aramat nga agkontak ke
 'right-hideuser' => 'Serraan ti maysa a nagan ti agar-aramat, ilemmeng manipud ti publiko',
 'right-ipblock-exempt' => 'Labsan dagiti IP a serra, dagiti automatiko a serra ken dagiti nasakup a serra.',
 'right-proxyunbannable' => 'Labsan dagiti automatiko a serra dagiti proxie',
-'right-unblockself' => 'Ikkaten ti panaka-serra kaniada',
+'right-unblockself' => 'Ikkaten ti pannaka-serra kaniada',
 'right-protect' => 'Sukatan dagiti lessaad ti salaknib ken dagiti panid a nasalakniban ti panag-urnos',
 'right-editprotected' => 'Urnosen dagiti nasalakniban a panid (nga awan ti sariap a salaknib")',
 'right-editinterface' => 'Urnosen ti "interface" ti agar-aramat',
@@ -1690,7 +1726,6 @@ Para iti kangatuan a talinaay, nabaldado ti img_auth.php.',
 'http-read-error' => 'Biddut ti panagbasa ti HTTP.',
 'http-timed-out' => 'Nagsardeng ti panagtulod ti HTTP.',
 'http-curl-error' => 'Biddut ti panagala ti URL: $1',
-'http-host-unreachable' => 'Di madanon ti URL',
 'http-bad-status' => 'Adda pakirut idi las-ud ti panagkiddaw ti HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1881,7 +1916,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'ncategories' => '$1 {{PLURAL:$1|a kategoria|kadagiti kategoria}}',
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|dagiti interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|a panilpo|kadagiti panilpo}}',
-'nmembers' => '$1 {{PLURAL:$1|a kameng|kadagiti kameng}}',
+'nmembers' => '$1 {{PLURAL:$1|a kameng|kamkameng}}',
 'nrevisions' => '$1 {{PLURAL:$1|a panagbalbaliw|kadagiti panagbalbaliw}}',
 'nviews' => '$1 {{PLURAL:$1|a panangkita|kadagiti panangkita}}',
 'nimagelinks' => 'Inusar idiay $1 {{PLURAL:$1|a panid|a pampanid}}',
@@ -2104,8 +2139,8 @@ Dagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunga
 'notvisiblerev' => 'Ti panagbalbaliw ti sabali nga agar-aramat ket naikkaten',
 'watchnochange' => 'Awan dagiti binambantayam ket naurnos dita panawen a naipakita.',
 'watchlist-details' => '{{PLURAL:$1|$1 panid|$1 dagiti panid}} a bambantayam, saan a mairaman dagiti panid ti tungtongan.',
-'wlheader-enotif' => '* Napakabaelan ti pakiammo ti esurat.',
-'wlheader-showupdated' => "* Dagiti panid a nasukatan manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
+'wlheader-enotif' => 'Napakabaelan ti panangipakaammo ti esurat.',
+'wlheader-showupdated' => "Dagiti panid a nasukatanen manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
 'watchmethod-recent' => 'kitkitaen dagiti kinaudi nga inurnos kadagiti bambantayan a panid',
 'watchmethod-list' => 'kitkitaen dagiti bambantayan a panid kadagiti kinaudi nga inurnos',
 'watchlistcontains' => 'Ti listaan ti bambantayam ket aglaon ti $1 {{PLURAL:$1|a panid|a pampanid}}.',
@@ -2693,6 +2728,8 @@ Pangngaasi a bisitaen ti [//www.mediawiki.org/wiki/Localisation Lokalisasion ti
 'thumbnail-more' => 'Padakkelen',
 'filemissing' => 'Mapukpukaw ti papeles',
 'thumbnail_error' => 'Biddut ti panagaramid ti bassit nga imahen: $1',
+'thumbnail_error_remote' => 'Biddut a mensahe manipud ti $1: 
+$2',
 'djvu_page_error' => 'Ti DjVu a panid ket saan a nasakup',
 'djvu_no_xml' => 'Saan a naala ti XML iti DjVu a papeles',
 'thumbnail-temp-create' => 'Saan a makaaramid ti temporario a bassit a papeles',
@@ -2989,11 +3026,25 @@ No usarem daytoy, baka makompromiso ti sistema.",
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 oras$1 oras}}',
 'days' => '{{PLURAL:$1|$1 aldaw|$1 al-aldaw}}',
+'weeks' => '{{PLURAL:$1|$1 a lawas|$1 a law-lawas}}',
 'months' => '{{PLURAL:$1|$1 a bulan|$1 a bulbulan}}',
 'years' => '{{PLURAL:$1|$1 a tawen|$1 a tawtawen}}',
 'ago' => '$1 nagtapos',
 'just-now' => 'tatta laeng',
 
+# Human-readable timestamps
+'hours-ago' => '$1 nga {{PLURAL:$1|oras|or-oras}} idi ugma',
+'minutes-ago' => '$1 a {{PLURAL:$1|minuto|minutos}} idi ugma',
+'seconds-ago' => '$1 a {{PLURAL:$1|segundo|seg-segundo}} idi ugma',
+'monday-at' => 'Lunes idiay $1',
+'tuesday-at' => 'Martes idiay $1',
+'wednesday-at' => 'Mierkoles idiay $1',
+'thursday-at' => 'Huebes idiay $1',
+'friday-at' => 'Biernes idiay $1',
+'saturday-at' => 'Sabado idiay $1',
+'sunday-at' => 'Dominggo idiay $1',
+'yesterday-at' => 'Idi kalman idiay $1',
+
 # Bad image list
 'bad_image_list' => 'Ti kinabuklan ket kas iti sumaganad:
 
@@ -3023,7 +3074,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Kaakaba',
 'exif-imagelength' => 'Katayag',
 'exif-bitspersample' => 'Bits tunggal maysa a  nagyan',
@@ -3200,7 +3251,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-originalimageheight' => 'Kangato ti imahen sakbay nga naputed',
 'exif-originalimagewidth' => 'Kalawa ti imahen sakbay nga naputed',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Saan a napespes',
 
 'exif-copyrighted-true' => 'Nakarbengan a kopia',
@@ -3613,12 +3664,17 @@ Naka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 'version-entrypoints-header-entrypoint' => 'Pagserrekan a puntos',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Dalanan ti papeles',
-'filepath-page' => 'Papeles:',
-'filepath-submit' => 'Inkan',
-'filepath-summary' => 'Daytoy nga espesial a panid ket agisubli ti kompleto a dalan ti papeles.
-Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti papeles ket dagus a mangrugida idiay nakairamananda a programa.',
+# Special:Redirect
+'redirect' => 'Ibaw-ing babaen ti papeles, agar-aramat, wenno ID ti panagbaliw',
+'redirect-legend' => 'Ibaw-ing iti papeles wenno panid',
+'redirect-summary' => 'Daytoy nga espesial a panid ket maibaw-ing iti papeles (iti nagan ti papeles), ti panid (iti ID ti panagbaliw), wenno ti panid ti agar-aramat (iti numeriko nga ID ti agar-aramat).',
+'redirect-submit' => 'Inkan',
+'redirect-lookup' => 'Kitaen:',
+'redirect-value' => 'Pateg:',
+'redirect-user' => 'ID ti agar-aramat',
+'redirect-revision' => 'Panagbaliw ti panid',
+'redirect-file' => 'Nagan ti papeles',
+'redirect-not-exists' => 'Saan a nabirukan ti pateg',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Agbiruk kadagiti duplikado a papeles',
@@ -3710,6 +3766,9 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'htmlform-submit' => 'Ited',
 'htmlform-reset' => 'Ibabawi ti sinukatan',
 'htmlform-selectorother-other' => 'Sabali',
+'htmlform-no' => 'Saan',
+'htmlform-yes' => 'Wen',
+'htmlform-chosen-placeholder' => 'Agpili ti pagpilian',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 adda ti suporta ti napno a testo ti panagbiruk',
@@ -3735,7 +3794,7 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'revdelete-uname-unhid' => 'saan a nailemmeng ti nagan ti agar-aramat',
 'revdelete-restricted' => 'naipakat dagiti pammarit kadagiti administrador',
 'revdelete-unrestricted' => 'naikkat dagiti pammarit para kadagiti administrador',
-'logentry-move-move' => 'Ni $1 ket {{GENDER:$2|inyalisna}}ti panid $3 idiay $4',
+'logentry-move-move' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid $3 idiay $4',
 'logentry-move-move-noredirect' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 a saan a nangibati ti baw-ing',
 'logentry-move-move_redir' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing',
 'logentry-move-move_redir-noredirect' => 'Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing a saan a nangibati ti baw-ing',
index fad44dd..7e69b43 100644 (file)
@@ -12,6 +12,7 @@
  * @author Reedy
  * @author Sapral Mikail
  * @author Tagir
+ * @author Умар
  */
 
 $fallback = 'ru';
@@ -47,8 +48,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ший теркама дагарленгах оагӀув чулаьца бола дакъалаьцархой таьрах хьахьокха',
 'tog-oldsig' => 'Дола кулгайоазув:',
 'tog-fancysig' => 'Ший кулга яздара массахоамбаккхам (ший лоӀаме Ӏинка йоацаш)',
-'tog-externaleditor' => 'Арена гӀалатнийсдарца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
-'tog-externaldiff' => 'Арена бӀасакхосса болхоагӀувца болх бе (ший болх ховш болачара мара мегаш дац, хьамлоархIара ший-тайпара оттам эша; [//www.mediawiki.org/wiki/Manual:External_editors хьажа эша])',
 'tog-showjumplinks' => '"Дехьадала" яха новкъостала Ӏинк хьахьокха',
 'tog-uselivepreview' => 'Сиха бӀарахьажар (JavaScript) (Экспериментально)',
 'tog-forceeditsummary' => 'Хоам бе, хувцамий лоацам белгал даь деце',
@@ -556,9 +555,6 @@ $messages = array(
 'powersearch-toggleall' => 'Деррига',
 'powersearch-togglenone' => 'Цхьаккха',
 
-# Quickbar
-'qbsettings-none' => 'Цхьаккха',
-
 # Preferences page
 'preferences' => 'Оттамаш',
 'mypreferences' => 'Оттамаш',
@@ -796,7 +792,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(тоабий дагарче)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Дакъалаьцархочоа д-хоамни:',
 
 # Watchlist
@@ -1072,7 +1068,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шерал',
 'exif-imagelength' => 'Лакхал',
 'exif-imagedescription' => 'Сурта цIи',
@@ -1132,11 +1128,6 @@ $messages = array(
 'version-version' => '(Доржам $1)',
 'version-software-version' => 'Доржам',
 
-# Special:FilePath
-'filepath' => 'Паьлачу никъ',
-'filepath-page' => 'Паьл:',
-'filepath-submit' => 'Дехьавала/яла',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'ПаьлацIи:',
 'fileduplicatesearch-submit' => 'Лаха',
index 505fa76..c2b2f50 100644 (file)
@@ -137,7 +137,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Montrez mea e-posto adreso en notifiko e-posti',
 'tog-shownumberswatching' => 'Montrez nombro di surveyanta uzanti',
 'tog-fancysig' => 'Traktez signaturo kom wikikodo (sen automata ligilo)',
-'tog-externaleditor' => 'Uzez extera redaktanto nespecigite (nur por experti, bezonas specala moderi ye vua komputoro .[//www.mediawiki.org/wiki/Manual:External_editors Plusa informo.])',
 'tog-forceeditsummary' => 'Notifikez me kande skribanta vakua redakto-rezumo',
 'tog-watchlisthideown' => 'Celez mea redaktaji de la surveyaji',
 'tog-watchlisthidebots' => 'Celez redaktaji da roboti de la surveyaji',
@@ -682,10 +681,6 @@ Probez prefixizar vua demando kun ''all:'' por serchar omna kontenajo (inkluzant
 'search-external' => 'Extera sercho',
 'searchdisabled' => 'La sercho en la kompleta texto desaktivigesis temporale pro superkargo dil servanto. Ni esperas riaktivigar ol pos facar ula proxima aktualigi. Dum ica tempo, vu povas serchar per Google.',
 
-# Quickbar
-'qbsettings' => 'Preferaji pri "Quickbar"',
-'qbsettings-none' => 'Nula',
-
 # Preferences page
 'preferences' => 'Preferaji',
 'mypreferences' => 'Mea preferaji',
@@ -1035,7 +1030,7 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
 'listgrouprights-group' => 'Grupo',
 'listgrouprights-members' => '(listo di membri)',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Ne sendar adreso',
 'mailnologintext' => 'Vu mustas [[Special:UserLogin|enirir]] e havar valida e-adreso en vua [[Special:Preferences|preferaji]] por sendar e-posto ad altra uzanti.',
 'emailuser' => 'Sendar e-posto a ca uzanto',
@@ -1415,7 +1410,7 @@ Vu darfos adjuntar kauso en la rezumo.',
 # Metadata
 'metadata' => 'Metadonaji',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larjeso',
 'exif-imagelength' => 'Alteso',
 'exif-artist' => 'Autoro',
@@ -1458,7 +1453,7 @@ Vu darfos adjuntar kauso en la rezumo.',
 'namespacesall' => 'omna',
 'monthsall' => 'omna',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail_needlogin' => 'Vu mustas $1 pro konfirmar vua adreso di e-posto.',
 
 # Scary transclusion
@@ -1516,9 +1511,6 @@ Vu darfos adjuntar kauso en la rezumo.',
 'version-software-product' => 'Produkturo',
 'version-software-version' => 'Versiono',
 
-# Special:FilePath
-'filepath-page' => 'Arkivo:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Serchar',
 
index 0e7e82d..36df20f 100644 (file)
@@ -262,8 +262,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Sýna fjölda vaktandi notenda',
 'tog-oldsig' => 'Núverandi undirskrift:',
 'tog-fancysig' => 'Meðhöndla undirskrift sem wikimál (án sjálfvirks tengils)',
-'tog-externaleditor' => 'Nota utanaðkomandi ritil sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
-'tog-externaldiff' => 'Nota utanaðkomandi mismun sjálfgefið (eingöngu fyrir reynda, þarfnast sérstakra stillinga á tölvunni þinni. [//www.mediawiki.org/wiki/Manual:External_editors Frekari upplýsingar.])',
 'tog-showjumplinks' => 'Virkja „stökkva á“ aðgengitengla',
 'tog-uselivepreview' => 'Nota beina forskoðun (JavaScript) (Á tilraunastigi)',
 'tog-forceeditsummary' => 'Birta áminningu þegar breytingarágripið er tómt',
@@ -277,6 +275,7 @@ $messages = array(
 'tog-diffonly' => 'Ekki sýna síðuefni undir mismunum',
 'tog-showhiddencats' => 'Sýna falda flokka',
 'tog-norollbackdiff' => 'Sleppa breytingu eftir að endurvakning síðu hefur verið gerð.',
+'tog-useeditwarning' => 'Vara mig við þegar ég fer frá breytingarsíðu með óvistaðar breytingar',
 
 'underline-always' => 'Alltaf',
 'underline-never' => 'Aldrei',
@@ -316,10 +315,10 @@ $messages = array(
 'october' => 'október',
 'november' => 'nóvember',
 'december' => 'desember',
-'january-gen' => 'janúars',
-'february-gen' => 'febrúars',
+'january-gen' => 'janúar',
+'february-gen' => 'febrúar',
 'march-gen' => 'mars',
-'april-gen' => 'apríls',
+'april-gen' => 'apríl',
 'may-gen' => 'maí',
 'june-gen' => 'júní',
 'july-gen' => 'júlí',
@@ -340,6 +339,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nóv',
 'dec' => 'des',
+'january-date' => '$1. janúar',
+'february-date' => '$1. febrúar',
+'march-date' => '$1. mars',
+'april-date' => '$1. apríl',
+'may-date' => '$1. maí',
+'june-date' => '$1. júní',
+'july-date' => '$1. júlí',
+'august-date' => '$1. ágúst',
+'september-date' => '$1. september',
+'october-date' => '$1. október',
+'november-date' => '$1. nóvember',
+'december-date' => '$1. desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Flokkur|Flokkar}}',
@@ -648,9 +659,18 @@ Athugaðu að sumar síður kunna að birtast líkt og þú sért ennþá skrá
 'welcomecreation-msg' => 'Aðgangurinn þinn hefur verið búinn til.
 Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum.',
 'yourname' => 'Notandanafn:',
+'userlogin-yourname' => 'Notandanafn',
+'userlogin-yourname-ph' => 'Skrifaðu inn notendanafnið þitt',
 'yourpassword' => 'Lykilorð:',
+'userlogin-yourpassword' => 'Lykilorð',
+'userlogin-yourpassword-ph' => 'Skrifaðu niður lykilorðið þitt',
+'createacct-yourpassword-ph' => 'Skrifaðu niður lykilorð',
 'yourpasswordagain' => 'Endurrita lykilorð:',
+'createacct-yourpasswordagain' => 'Staðfestu lykilorðið',
+'createacct-yourpasswordagain-ph' => 'Sláðu inn lykilorðið aftur',
 'remembermypassword' => 'Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})',
+'userlogin-remembermypassword' => 'Muna innskráningu mína',
+'userlogin-signwithsecure' => 'Nota örugga tengingu',
 'securelogin-stick-https' => 'Halda öllum samskiptum áfram yfir HTTPS eftir að þú skráir þig inn',
 'yourdomainname' => 'Þitt lén:',
 'password-change-forbidden' => 'Þú getur ekki breytt lykilorðum á þessum wiki.',
@@ -663,18 +683,36 @@ Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum
 'logout' => 'Útskráning',
 'userlogout' => 'Útskrá',
 'notloggedin' => 'Ekki innskráð(ur)',
+'userlogin-noaccount' => 'Áttu ekki aðgang?',
 'nologin' => "Ekki með aðgang? '''$1'''.",
 'nologinlink' => 'Stofnaðu aðgang',
 'createaccount' => 'Nýskrá',
 'gotaccount' => "Nú þegar með notandanafn? '''$1'''.",
 'gotaccountlink' => 'Skráðu þig inn',
 'userlogin-resetlink' => 'Gleymdir þú notendaupplýsingunum þínum?',
+'userlogin-resetpassword-link' => 'Endursetja lykilorð',
+'helplogin-url' => 'Help:Innskráning',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjálp við innskráningu]]',
+'createacct-join' => 'Sláðu inn þínar upplýsingar fyrir neðan.',
+'createacct-emailrequired' => 'Netfang',
+'createacct-emailoptional' => 'Netfang (valfrjálst)',
+'createacct-email-ph' => 'Skrifaðu niður netfangið þitt',
 'createaccountmail' => 'Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan',
+'createacct-realname' => 'Raunverulegt nafn (valfrjálst)',
 'createaccountreason' => 'Ástæða:',
+'createacct-reason' => 'Ástæða',
+'createacct-reason-ph' => 'Afhverju ertu að búa til annan aðgang',
+'createacct-captcha' => 'Öryggis athugun',
+'createacct-imgcaptcha-ph' => 'Sláðu inn textann að ofan',
+'createacct-submit' => 'Búa til aðganginn',
+'createacct-benefit-heading' => '{{SITENAME}} er skrifuð af fólki eins og þér.',
+'createacct-benefit-body1' => '{{PLURAL:$1|breyting|breytingar}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|síða|síður}}',
 'badretype' => 'Lykilorðin sem þú skrifaðir eru ekki eins.',
 'userexists' => 'Þetta notandanafn er þegar í notkun.
 Vinsamlegast veldu þér annað.',
 'loginerror' => 'Innskráningarvilla',
+'createacct-error' => 'Stofnun aðgangs mistókst',
 'createaccounterror' => 'Gat ekki búið til notanda: $1',
 'nocookiesnew' => 'Innskráningin var búin til, en þú ert ekki skráð(ur) inn.
 {{SITENAME}} notar vefkökur til að skrá inn notendur.
@@ -713,8 +751,8 @@ halda áfram að nota gamla lykilorðið.',
 Vinsamlegast skráðu þig inn á ný þegar þú hefur móttekið það.',
 'blocked-mailpassword' => 'Þér er ekki heimilt að gera breytingar frá þessu netfangi og  því getur þú ekki fengið nýtt lykilorð í pósti.  Þetta er gert til þess að koma í veg fyrir skemmdarverk.',
 'eauthentsent' => 'Staðfestingarpóstur hefur verið sendur á uppgefið netfang. Þú verður að fylgja leiðbeiningunum í póstinum til þess að virkja netfangið og staðfesta að það sé örugglega þitt.',
-'throttled-mailpassword' => 'Áminning fyrir lykilorð hefur nú þegar verið send, innan við {{PLURAL:$1|síðasta klukkutímans|$1 síðustu klukkutímanna}}.
-Til að koma í veg fyrir misnotkun, er aðeins ein áminning send {{PLURAL:$1|hvern klukkutíma|hverja $1 klukkutíma}}.',
+'throttled-mailpassword' => 'Tölvupóstur til að endursetja lykilorðið hefur þegar verið sent, innan við {{PLURAL:$1|síðasta klukkutímans|$1 síðustu klukkutímanna}}.
+Til að koma í veg fyrir misnotkun, er aðeins einn tölvupóstur sendur {{PLURAL:$1|hvern klukkutíma|hverja $1 klukkutíma}}.',
 'mailerror' => 'Upp kom villa við sendingu tölvupósts: $1',
 'acct_creation_throttle_hit' => 'Því miður, hafa verið búnir til {{PLURAL:$1|1 aðgang|$1 aðganga}} nýr aðgangar í dag sem er hámarksfjöldi nýskráninga á einum degi.
 Þú getur því miður ekki búið til nýjan aðgang frá þessari IP-tölu að svo stöddu.',
@@ -766,24 +804,23 @@ Til að klára að skrá þig inn, verður þú að endurstilla lykilorðið hé
 
 # Special:PasswordReset
 'passwordreset' => 'Endurstilla lykilorð',
-'passwordreset-text' => 'Fylltu út þennan reit til að fá tölvupóst um áminningu um notendauplýsingarnar þínar.',
 'passwordreset-legend' => 'Endurstilla lykilorð',
 'passwordreset-disabled' => 'Lokað hefur verið fyrir að endurstilla lykilorð á þessum wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Sláðu inn einn hluta gagnanna hér fyrir neðan}}',
 'passwordreset-username' => 'Notandanafn:',
 'passwordreset-domain' => 'Lén:',
 'passwordreset-capture' => 'Sjá áminninguna sem var send í tölvupósti?',
 'passwordreset-capture-help' => 'Ef þú hakar við þennan reit verður tölvupósturinn (með tímabundna lykilorðinu) sýndur þér og einnig sendur notandanum.',
 'passwordreset-email' => 'Netfang:',
 'passwordreset-emailtitle' => 'Notendaupplýsingar á {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Einhver (líklegast þú, á vistfanginu $1) hefur beðið um notendaupplýsingar þínar fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
+'passwordreset-emailtext-ip' => 'Einhver (líklegast þú, á vistfanginu $1) hefur beðið um 
+endursetningu lykilorðsins þíns fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
 
 $2
 
 Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt lykilorð. {{PLURAL:$3|Tímabundna lykilorð|Tímabundnu lykilorðin}} renna út eftir {{PLURAL:$5|einn dag|$5 daga}}.
 
 Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst 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 notendaupplýsingar þínar fyrir {{SITENAME}} ($4). Aðgangur eftirfarandi {{PLURAL:$3|notanda er|notendum eru}} tengd þessu netfangi:
+'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:
 
 $2
 
@@ -792,9 +829,9 @@ Ef þetta er það sem þú vildir, þarftu að skrá þig inn og velja nýtt ly
 Ef það varst ekki þú sem fórst fram á þetta, eða ef þú mannst lykilorðið þitt, og villt ekki lengur breyta því, skaltu hunsa þessi skilaboð og halda áfram að nota gamla lykilorðið.',
 'passwordreset-emailelement' => 'Notendanafn: $1
 Tímabundið lykilorð: $2',
-'passwordreset-emailsent' => 'Áminning hefur verið send í tölvupósti.',
-'passwordreset-emailsent-capture' => 'Áminning hefur verið send í tölvupósti, sem er sýnd hér fyrir neðan.',
-'passwordreset-emailerror-capture' => 'Áminning var búin til, sem er sýnd hér fyrir neðan, en ekki tókst að senda hana til notandans: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Breyting netfangs',
@@ -1003,12 +1040,15 @@ Engin skýring gefin.',
 Svo 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' => 'Breytingin þín var vistuð.',
 'edit-already-exists' => 'Gat ekki skapað nýja síðu.
 Hún er nú þegar til.',
 'defaultmessagetext' => 'Sjálfgefinn skilaboða texti',
 'content-failed-to-parse' => 'Gat ekki þáttað $2 efni samkvæmt $1 líkani: $3',
 'invalid-content-data' => 'Ógild efnisgögn.',
 'content-not-allowed-here' => '„$1“ efni er ekki leyfilegt á síðunni [[$2]]',
+'editwarning-warning' => 'Ef farið er frá þessari síðu gætu þær breytingar sem þú hefur gert tapast.
+Ef þú ert skráður inn, þá getur þú óvirkjað þessi skilaboð í „Breytingarflipanum" undir stillingum.',
 
 # Content models
 'content-model-wikitext' => 'wiki-texti',
@@ -1296,15 +1336,6 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 Þú getur leitað í genum Google á meðan.
 Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
 
-# Quickbar
-'qbsettings' => 'Valblað',
-'qbsettings-none' => 'Sleppa',
-'qbsettings-fixedleft' => 'Fast vinstra megin',
-'qbsettings-fixedright' => 'Fast hægra megin',
-'qbsettings-floatingleft' => 'Fljótandi til vinstri',
-'qbsettings-floatingright' => 'Fljótandi til hægri',
-'qbsettings-directionality' => 'Lagað, fer eftir því í hvaða átt er skrifað á þínu tungumáli.',
-
 # Preferences page
 'preferences' => 'Stillingar',
 'mypreferences' => 'Mínar stillingar',
@@ -1853,7 +1884,6 @@ Vegna öryggissjónarmiða er img_auth.php óvirkt.',
 'http-read-error' => 'HTTP lesturs villa.',
 'http-timed-out' => 'Tímamörk HTTP beiðni rann út.',
 'http-curl-error' => 'Villa við að sækja vefslóð: $1',
-'http-host-unreachable' => 'Gat ekki náð í vefslóðina',
 'http-bad-status' => 'Mistök við HTTP beiðnina: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2261,8 +2291,8 @@ Frekari breytingar á henni eða spallsíðu hennar munu verða sýndar þar.',
 'notvisiblerev' => 'Síðasta breyting eftir annan notanda hefur verið eytt.',
 'watchnochange' => 'Engri síðu á vaktlistanum þínum hefur verið breytt á tilgreindu tímabili.',
 'watchlist-details' => '{{PLURAL:$1|$1 síða|$1 síður}} á vaktlistanum þínum, fyrir utan spjallsíður.',
-'wlheader-enotif' => 'Tilkynning með tölvupósti er virk.',
-'wlheader-showupdated' => "* Síðum sem hefur verið breytt síðan þú skoðaðir þær síðast eru '''feitletraðar'''",
+'wlheader-enotif' => 'Tilkynning með tölvupósti er virk.',
+'wlheader-showupdated' => "Síðum sem hefur verið breytt síðan þú skoðaðir þær síðast eru '''feitletraðar'''.",
 'watchmethod-recent' => 'kanna hvort nýlegar breytingar innihalda vaktaðar síður',
 'watchmethod-list' => 'leita að breytingum í vöktuðum síðum',
 'watchlistcontains' => 'Vaktlistinn þinn inniheldur {{PLURAL:$1|$1 síðu|$1 síður}}.',
@@ -3069,13 +3099,8 @@ Vinsamlegast reyndu aftur.',
 'pageinfo-category-files' => 'Fjöldi skráa',
 
 # Skin names
-'skinname-standard' => 'Sígilt',
-'skinname-nostalgia' => 'Gamaldags',
 'skinname-cologneblue' => 'Kölnarblátt',
 'skinname-monobook' => 'EinBók',
-'skinname-myskin' => 'Mitt þema',
-'skinname-chick' => 'Gella',
-'skinname-simple' => 'Einfalt',
 'skinname-modern' => 'Nútímalegt',
 
 # Patrolling
@@ -3184,7 +3209,7 @@ Ef skránni hefur verið breytt, kann að vera að einhverjar upplýsingar eigi
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breidd',
 'exif-imagelength' => 'Hæð',
 'exif-bitspersample' => 'Bæti á einingu',
@@ -3343,7 +3368,7 @@ Ef skránni hefur verið breytt, kann að vera að einhverjar upplýsingar eigi
 'exif-originalimageheight' => 'Hæð myndarinnar fyrir skerðingu',
 'exif-originalimagewidth' => 'Breidd myndar fyrir skerðingu',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ósamþjappað',
 
 'exif-copyrighted-true' => 'Höfundaréttarvarið',
@@ -3720,13 +3745,6 @@ MediaWiki er útgefin í þeirri von að hann sé gagnlegur, en ÁN ALLRAR ÁBYR
 'version-software-version' => 'Útgáfa',
 'version-entrypoints-header-url' => 'vefslóð',
 
-# Special:FilePath
-'filepath' => 'Slóð skráar',
-'filepath-page' => 'Skrá:',
-'filepath-submit' => 'Áfram',
-'filepath-summary' => 'Þessi kerfisíða birtir fulla vefslóð skráar. 
-Myndir eru sýndar í fullri upplausn og önnur skráarsnið eru ræst í sjálfvöldu forriti til þess að opna skránna.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Leita að afriti',
 'fileduplicatesearch-summary' => 'Leita að afritum sem hafa sama hakk gildi.',
@@ -3822,17 +3840,17 @@ Tæknilegir örðugleikar eru á þessari síðu.',
 'sqlite-no-fts' => '$1 án fullum texta leitar stuðningi',
 
 # New logging system
-'logentry-delete-delete' => '$1 eyddi síðunni $3',
-'logentry-delete-restore' => '$1 endurvakti $3',
-'logentry-delete-event' => '$1 breytti sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
-'logentry-delete-revision' => '$1 breytti sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
-'logentry-delete-event-legacy' => '$1 breytti sýnileika færslna á $3',
-'logentry-delete-revision-legacy' => '$1 breytti sýnileika útgáfna á $3',
-'logentry-suppress-delete' => '$1 bældi niður síðuna $3',
-'logentry-suppress-event' => '$1 breytti leynilega sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
-'logentry-suppress-revision' => '$1 breytti leynilega sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
-'logentry-suppress-event-legacy' => '$1 breytti leynilega sýnileika færslna á $3',
-'logentry-suppress-revision-legacy' => '$1 breytti leynilega sýnileika útgáfna á $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|eyddi}} síðunni $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|endurvakti}} $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|breytti}} sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|breytti}} sýnileika færslna á $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|breytti}} sýnileika útgáfna á $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|bældi niður}} síðuna $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika {{PLURAL:$5|færslu|$5 færslna}} á $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika {{PLURAL:$5|útgáfu|$5 útgáfna}} á $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika færslna á $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|breytti}} leynilega sýnileika útgáfna á $3',
 'revdelete-content-hid' => 'efni falið',
 'revdelete-summary-hid' => 'breytingarágrip falið',
 'revdelete-uname-hid' => 'notandanafn falið',
@@ -3841,20 +3859,20 @@ Tæknilegir örðugleikar eru á þessari síðu.',
 'revdelete-uname-unhid' => 'notandanafn birt',
 'revdelete-restricted' => 'hömlur settar á stjórnendur',
 'revdelete-unrestricted' => 'fjarlægja hömlur á stjórnendur',
-'logentry-move-move' => '$1 færði $3 á $4',
-'logentry-move-move-noredirect' => '$1 færði $3 á $4 án þess að skilja eftir tilvísun',
-'logentry-move-move_redir' => '$1 færði $3 á $4 yfir tilvísun',
-'logentry-move-move_redir-noredirect' => '$1 færði $3 á $4 yfir tilvísun, án þess að skilja eftir tilvísun',
-'logentry-patrol-patrol' => '$1 merkti útgáfu $3 frá $4 sem yfirfarna',
-'logentry-patrol-patrol-auto' => '$1 merkti sjálfvirkt útgáfu $3 frá $4 sem yfirfarna',
-'logentry-newusers-newusers' => 'Notandaaðgangurinn $1 var stofnaður',
-'logentry-newusers-create' => 'Notandaaðgangurinn $1 var stofnaður',
-'logentry-newusers-create2' => '$1 stofnaði notandaaðganginn $3',
-'logentry-newusers-byemail' => 'Notandaaðgangurinn $3 var búinn til af $1 og lykilorðið var sent með tölvupósti',
-'logentry-newusers-autocreate' => 'Aðgangurinn $1 var stofnaður sjálfvirkt',
-'logentry-rights-rights' => '$1 breytti réttindum $3 frá $4 í $5',
-'logentry-rights-rights-legacy' => '$1 breytti réttindum $3',
-'logentry-rights-autopromote' => '$1 fékk sjálfvirkt aukin réttindi frá $4 til $5',
+'logentry-move-move' => '$1 {{GENDER:$2|færði}} $3 á $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|færði}} $3 á $4 án þess að skilja eftir tilvísun',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|færði}} $3 á $4 yfir tilvísun',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|færði}} $3 á $4 yfir tilvísun, án þess að skilja eftir tilvísun',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|merkti}} útgáfu $3 frá $4 sem yfirfarna',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|merkti}} sjálfvirkt útgáfu $3 frá $4 sem yfirfarna',
+'logentry-newusers-newusers' => 'Notandaaðgangurinn $1 var {{GENDER:$2|stofnaður}}',
+'logentry-newusers-create' => 'Notandaaðgangurinn $1 var {{GENDER:$2|stofnaður}}',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|stofnaði}} notandaaðganginn $3',
+'logentry-newusers-byemail' => 'Notandaaðgangurinn $3 var {{GENDER:$2|búinn til}} af $1 og lykilorðið var sent með tölvupósti',
+'logentry-newusers-autocreate' => 'Aðgangurinn $1 var {{GENDER:$2|stofnaður}} sjálfvirkt',
+'logentry-rights-rights' => '$1 {{GENDER:$2|breytti}} réttindum $3 frá $4 í $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|breytti}} réttindum $3',
+'logentry-rights-autopromote' => '$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5',
 'rightsnone' => '(engum)',
 
 # Feedback
@@ -3930,4 +3948,7 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'duration-centuries' => '$1 {{PLURAL:$1|öld|aldir}}',
 'duration-millennia' => '$1 {{PLURAL:$1|árþúsund}}',
 
+# Image rotation
+'rotate-comment' => 'Myndinni var snúið um $1 {{PLURAL:$1|gráðu|gráður}} réttsælis',
+
 );
index 19c2042..78cd685 100644 (file)
@@ -316,8 +316,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostra il numero di utenti che hanno la pagina in osservazione',
 'tog-oldsig' => 'Firma attuale:',
 'tog-fancysig' => 'Tratta la firma come wikitesto (senza un collegamento automatico)',
-'tog-externaleditor' => "Usa per default un editor di testi esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
-'tog-externaldiff' => "Usa per default un programma di diff esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
 'tog-showjumplinks' => 'Attiva i collegamenti accessibili "vai a"',
 'tog-uselivepreview' => "Abilita la funzione ''Live preview'' (anteprima in diretta - richiede JavaScript; sperimentale)",
 'tog-forceeditsummary' => 'Chiedi conferma se il campo oggetto è vuoto',
@@ -332,6 +330,7 @@ $messages = array(
 'tog-showhiddencats' => 'Mostra categorie nascoste',
 'tog-noconvertlink' => 'Disattiva la conversione dei titoli dei link',
 'tog-norollbackdiff' => 'Non mostrare il confronto tra versioni dopo aver effettuato un rollback',
+'tog-useeditwarning' => 'Avvisa quando si lascia una pagina di modifica con modifiche non salvate',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mai',
@@ -395,6 +394,18 @@ $messages = array(
 'oct' => 'ott',
 'nov' => 'nov',
 'dec' => 'dic',
+'january-date' => '$1 gennaio',
+'february-date' => '$1 febbraio',
+'march-date' => '$1 marzo',
+'april-date' => '$1 aprile',
+'may-date' => '$1 maggio',
+'june-date' => '$1 giugno',
+'july-date' => '$1 luglio',
+'august-date' => '$1 agosto',
+'september-date' => '$1 settembre',
+'october-date' => '$1 ottobre',
+'november-date' => '$1 novembre',
+'december-date' => '$1 dicembre',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorie}}',
@@ -447,7 +458,7 @@ $messages = array(
 'vector-simplesearch-preference' => 'Abilita la barra per la ricerca semplificata (solo per la skin Vector)',
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Modifica',
-'vector-view-history' => 'Visualizza cronologia',
+'vector-view-history' => 'Cronologia',
 'vector-view-view' => 'Leggi',
 'vector-view-viewsource' => 'Visualizza sorgente',
 'actions' => 'Azioni',
@@ -506,7 +517,7 @@ $messages = array(
 'redirectpagesub' => 'Pagina di reindirizzamento',
 'lastmodifiedat' => "Questa pagina è stata modificata per l'ultima volta il $1 alle $2.",
 'viewcount' => 'Questa pagina è stata letta {{PLURAL:$1|una volta|$1 volte}}.',
-'protectedpage' => 'Pagina bloccata',
+'protectedpage' => 'Pagina protetta',
 'jumpto' => 'Vai a:',
 'jumptonavigation' => 'navigazione',
 'jumptosearch' => 'ricerca',
@@ -543,7 +554,7 @@ $1',
 'badaccess-group0' => "Non si dispone dei permessi necessari per eseguire l'azione richiesta.",
 'badaccess-groups' => 'La funzione richiesta è riservata agli utenti che appartengono {{PLURAL:$2|al gruppo|a uno dei seguenti gruppi}}: $1.',
 
-'versionrequired' => 'Versione $1 di MediaWiki richiesta',
+'versionrequired' => 'È necessaria la versione $1 di MediaWiki',
 'versionrequiredtext' => "Per usare questa pagina è necessario disporre della versione $1 del software MediaWiki. Vedi [[Special:Version|l'apposita pagina]].",
 
 'ok' => 'OK',
@@ -645,13 +656,14 @@ Si prega di segnalare l\'accaduto a un [[Special:ListUsers/sysop|amministratore]
 'unexpected' => 'Valore imprevisto: "$1"="$2".',
 'formerror' => 'Errore: impossibile inviare il modulo',
 'badarticleerror' => 'Operazione non consentita per questa pagina.',
-'cannotdelete' => 'Non è stato possibile cancellare il file "$1".
+'cannotdelete' => 'Non è stato possibile cancellare la pagina o il file "$1".
 Potrebbe essere stato già cancellato da qualcun altro.',
 'cannotdelete-title' => 'Impossibile eliminare la pagina "$1"',
 'delete-hook-aborted' => "La cancellazione è stata annullata dall'hook.
 Non è stata restituita alcuna spiegazione.",
 'badtitle' => 'Titolo non corretto',
-'badtitletext' => 'Il titolo della pagina richiesta è vuoto, errato o con caratteri non ammessi oppure deriva da un errore nei collegamenti tra siti wiki diversi o versioni in lingue diverse dello stesso sito.',
+'badtitletext' => 'Il titolo della pagina richiesta è vuoto, errato oppure deriva da un errore nei collegamenti interlingua o interwiki.
+Potrebbe inoltre contenere uno o più caratteri il cui uso non è ammesso nei titoli.',
 'perfcached' => "I dati che seguono sono estratti da una copia ''cache'' del database, e potrebbero non essere aggiornati. Un massimo di {{PLURAL:$1|un risultato è disponibile|$1 risultati sono disponibili}} in cache.",
 'perfcachedts' => "I dati che seguono sono estratti da una copia ''cache'' del database, il cui ultimo aggiornamento risale al $1. Un massimo di {{PLURAL:$4|un risultato è disponibile|$4 risultati sono disponibili}} in cache.",
 'querypage-no-updates' => 'Gli aggiornamenti della pagina sono temporaneamente sospesi. I dati in essa contenuti non verranno aggiornati.',
@@ -700,9 +712,18 @@ Nota che alcune pagine potrebbero continuare ad apparire come se il logout non f
 'welcomecreation-msg' => "L'account è stato creato correttamente.
 Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITENAME}}]].",
 'yourname' => 'Nome utente:',
+'userlogin-yourname' => 'Nome utente',
+'userlogin-yourname-ph' => 'Inserisci il tuo nome utente',
 'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Inserisci la tua password',
+'createacct-yourpassword-ph' => 'Inserisci una password',
 'yourpasswordagain' => 'Ripeti la password:',
+'createacct-yourpasswordagain' => 'Conferma password',
+'createacct-yourpasswordagain-ph' => 'Inserisci nuovamente la password',
 'remembermypassword' => 'Ricorda la password su questo browser (per un massimo di $1 {{PLURAL:$1|giorno|giorni}})',
+'userlogin-remembermypassword' => 'Mantienimi collegato',
+'userlogin-signwithsecure' => 'Usa una connessione sicura',
 'securelogin-stick-https' => 'Resta connesso attraverso HTTPS dopo il login',
 'yourdomainname' => 'Specificare il dominio',
 'password-change-forbidden' => 'Non è possibile modificare le password su questo wiki.',
@@ -715,18 +736,38 @@ Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITEN
 'logout' => 'Esci',
 'userlogout' => 'esci',
 'notloggedin' => 'Accesso non effettuato',
-'nologin' => "Non hai ancora un accesso? '''$1'''.",
+'userlogin-noaccount' => 'Non hai un account?',
+'userlogin-joinproject' => 'Registrati su {{SITENAME}}',
+'nologin' => 'Non hai ancora un accesso? $1.',
 'nologinlink' => 'Registrati',
-'createaccount' => "Crea un'utenza",
-'gotaccount' => "Hai già un accesso? '''$1'''.",
+'createaccount' => 'Registrati',
+'gotaccount' => 'Hai già un accesso? $1.',
 'gotaccountlink' => 'Entra',
 'userlogin-resetlink' => 'Hai dimenticato i tuoi dati di accesso?',
+'userlogin-resetpassword-link' => 'Reimposta la tua password',
+'helplogin-url' => 'Help:Login',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Aiuto con il login]]',
+'createacct-join' => 'Inserisci i tuoi dati qui sotto.',
+'createacct-emailrequired' => 'Indirizzo email',
+'createacct-emailoptional' => 'Indirizzo di posta elettronica (opzionale)',
+'createacct-email-ph' => 'Inserisci il tuo indirizzo email',
 'createaccountmail' => "Usa una password casuale temporanea e inviala all'indirizzo e-mail specificato sotto",
+'createacct-realname' => 'Nome reale (opzionale)',
 '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-benefit-heading' => '{{SITENAME}} è fatta da 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.',
 'userexists' => 'Il nome utente inserito è già utilizzato.
 Scegliere un nome utente diverso.',
 'loginerror' => "Errore durante l'accesso",
+'createacct-error' => "Errore durante la creazione dell'utenza",
 'createaccounterror' => "Impossibile creare l'account: $1",
 'nocookiesnew' => "La registrazione è stata completata, ma non è stato possibile accedere a {{SITENAME}} perché i cookie sono disattivati. Riprovare l'accesso con il nome utente e la password appena creati dopo aver attivato i cookie nel proprio browser.",
 'nocookieslogin' => "L'accesso a {{SITENAME}} richiede l'uso dei cookie, che risultano disattivati. Riprovare l'accesso dopo aver attivato i cookie nel proprio browser.",
@@ -763,10 +804,11 @@ Per prevenire abusi, la funzione di reimpostazione della password può essere us
 'mailerror' => "Errore nell'invio del messaggio: $1",
 'acct_creation_throttle_hit' => "I visitatori del sito che usano il tuo indirizzo IP hanno creato {{PLURAL:$1|1 account|$1 account}} nell'ultimo giorno, che è il massimo consentito in questo periodo di tempo.
 Perciò, gli utenti che usano questo indirizzo IP non possono creare altri account per il momento.",
-'emailauthenticated' => "L'indirizzo e-mail è stato confermato il $2 alle $3.",
-'emailnotauthenticated' => "L'indirizzo e-mail non è stato ancora confermato. Non verranno inviati messaggi e-mail attraverso le funzioni elencate di seguito.",
+'emailauthenticated' => "L'indirizzo email è stato confermato il $2 alle $3.",
+'emailnotauthenticated' => "L'indirizzo di posta elettronica non è stato ancora confermato.
+Non verranno inviati messaggi email per le funzioni elencate di seguito.",
 'noemailprefs' => 'Indicare un indirizzo e-mail per attivare queste funzioni.',
-'emailconfirmlink' => 'Confermare il proprio indirizzo e-mail',
+'emailconfirmlink' => 'Conferma il tuo indirizzo email',
 'invalidemailaddress' => "L'indirizzo e-mail indicato ha un formato non valido. Inserire un indirizzo valido o svuotare la casella.",
 'cannotchangeemail' => 'Gli indirizzi e-mail non possono essere modificati in questo wiki.',
 'emaildisabled' => 'Questo sito non può inviare messaggi di posta elettronica.',
@@ -806,13 +848,14 @@ Riprovare più tardi.',
 'resetpass-wrong-oldpass' => 'Password temporanea o attuale non valida.
 La password potrebbe essere stata già cambiata, oppure potrebbe essere stata richiesta una nuova password temporanea.',
 'resetpass-temp-password' => 'Password temporanea:',
+'resetpass-abort-generic' => "La modifica della password è stata interrotta da un'estensione.",
 
 # Special:PasswordReset
 'passwordreset' => 'Reimposta password',
-'passwordreset-text' => 'Compila questo modulo per reimpostare la tua password.',
+'passwordreset-text-one' => 'Compila questo modulo per reimpostare la tua password.',
 'passwordreset-legend' => 'Reimposta password',
 'passwordreset-disabled' => 'La reimpostazione delle password è stata disabilitata su questa wiki',
-'passwordreset-pretext' => '{{PLURAL:$1||Immetti uno dei dati richiesti qui sotto}}',
+'passwordreset-emaildisabled' => 'Le funzionalità di posta elettronica sono state disabilitate su questa wiki.',
 'passwordreset-username' => 'Nome utente:',
 'passwordreset-domain' => 'Dominio:',
 'passwordreset-capture' => 'Visualizzare il contenuto del messaggio e-mail?',
@@ -839,7 +882,7 @@ Se non sei stato tu a fare la richiesta, o se ti sei ricordato la password origi
 Password temporanea: $2',
 'passwordreset-emailsent' => 'È stata inviata una email di reimpostazione della 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 all'utente non è riuscito: $1",
+'passwordreset-emailerror-capture' => "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
 
 # Special:ChangeEmail
 'changeemail' => "Modifica l'indirizzo e-mail",
@@ -997,7 +1040,7 @@ Se non desideri che i tuoi testi possano essere modificati e ridistribuiti da ch
 Inviando il testo dichiari inoltre, sotto tua responsabilità, che è stato scritto da te personalmente oppure è stato copiato da una fonte di pubblico dominio o similarmente libera.
 '''Non inviare materiale protetto da copyright senza autorizzazione!'''",
 'copyrightwarning2' => "Per favore tieni presente che tutti i contributi a {{SITENAME}} possono essere modificati, stravolti o cancellati da altri contributori.
-Se non desideri che i tuoi testi possano essere alterati, non inviarli qui.<br />
+Se non vuoi che i tuoi testi possano essere alterati, allora non inserirli.<br />
 Inviando il testo dichiari inoltre, sotto tua responsabilità, che è stato scritto da te personalmente oppure è stato copiato da una fonte di pubblico dominio o similarmente libera (vedi $1 per maggiori dettagli).
 '''Non inviare materiale protetto da copyright senza autorizzazione!'''",
 'longpageerror' => "'''Errore: il testo inviato è lungo {{PLURAL:$1|1|$1}} kilobyte, che è maggiore della dimensione massima consentita ({{PLURAL:$2|1|$2}} kilobyte).'''
@@ -1039,12 +1082,15 @@ Non è stata restituita alcuna spiegazione.",
 Sembra che sia stata cancellata.',
 'edit-conflict' => 'Conflitto di edizione.',
 'edit-no-change' => 'La modifica è stata ignorata poiché non sono stati apportati cambiamenti al testo.',
+'postedit-confirmation' => 'La modifica è stata salvata.',
 'edit-already-exists' => 'Impossibile creare una nuova pagina.
 Esiste già.',
 'defaultmessagetext' => 'Testo predefinito',
 'content-failed-to-parse' => 'Impossibile analizzare $2 per il modello $1: $3',
 'invalid-content-data' => 'Dati contenuti non validi',
 'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
+'editwarning-warning' => 'Lasciare questa pagina potrebbe causare la perdita di tutte le modifiche fatte.
+Se hai effettuato l\'accesso, puoi disattivare questo avviso nella sezione "Casella di modifica" delle tue preferenze.',
 
 # Content models
 'content-model-wikitext' => 'wikitesto',
@@ -1074,7 +1120,8 @@ Alcuni template non verranno inclusi.",
 'converter-manual-rule-error' => 'Rilevato errore nella regola manuale di conversione della lingua',
 
 # "Undo" feature
-'undo-success' => 'Questa modifica può essere annullata. Verificare il confronto presentato di seguito per accertarsi che il contenuto corrisponda a quanto desiderato e quindi salvare le modifiche per completare la procedura di annullamento.',
+'undo-success' => 'Questa modifica può essere annullata.
+Controlla le differenze mostrate sotto fra le due versioni per essere certo che il contenuto corrisponda a quanto desiderato, e quindi salvare le modifiche per completare la procedura di annullamento.',
 'undo-failure' => 'Impossibile annullare la modifica a causa di un conflitto con modifiche intermedie.',
 'undo-norev' => 'La modifica non può essere annullata perché non esiste o è stata cancellata.',
 'undo-summary' => 'Annullata la modifica $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]])',
@@ -1091,7 +1138,7 @@ La motivazione del blocco fornita da $3 è la seguente: ''$2''",
 'currentrev' => 'Versione attuale',
 'currentrev-asof' => 'Versione attuale delle $1',
 'revisionasof' => 'Versione delle $1',
-'revision-info' => 'Versione delle $1, autore: $2',
+'revision-info' => 'Versione del $4 alle $5 di $2',
 'previousrevision' => '← Versione meno recente',
 'nextrevision' => 'Versione più recente →',
 'currentrevisionlink' => 'Versione attuale',
@@ -1251,8 +1298,8 @@ Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blo
 'compareselectedversions' => 'Confronta le versioni selezionate',
 'showhideselectedversions' => 'Mostra/nascondi versioni selezionate',
 'editundo' => 'annulla',
-'diff-multi' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di {{PLURAL:$2|un utente|$2 utenti}} non mostrate)',
-'diff-multi-manyusers' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di oltre $2 {{PLURAL:$2|utente|utenti}} non mostrate)',
+'diff-multi' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di {{PLURAL:$2|un utente|$2 utenti}} non {{PLURAL:$1|mostrata|mostrate}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|Una revisione intermedia|$1 revisioni intermedie}} di oltre $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrata|mostrate}})',
 'difference-missing-revision' => '{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.
 
 Questo si verifica solitamente seguendo un collegamento obsoleto di un diff a una pagina cancellata.
@@ -1319,15 +1366,7 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'powersearch-togglenone' => 'Nessuno',
 'search-external' => 'Ricerca esterna',
 'searchdisabled' => 'La ricerca interna di {{SITENAME}} non è attiva; nel frattempo si può provare ad usare un motore di ricerca esterno come Google. (Si noti però che i contenuti di {{SITENAME}} presenti in tali motori potrebbero non essere aggiornati.)',
-
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Nessuno',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-'qbsettings-directionality' => 'Fisso, a seconda della direzione del testo nella tua lingua',
+'search-error' => 'Si è verificato un errore durante la ricerca: $1',
 
 # Preferences page
 'preferences' => 'Preferenze',
@@ -1394,7 +1433,7 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'allowemail' => 'Abilita la ricezione di messaggi e-mail da altri utenti',
 'prefs-searchoptions' => 'Ricerca',
 'prefs-namespaces' => 'Namespace',
-'defaultns' => 'In caso contrario, cerca in questi namespace:',
+'defaultns' => 'Altrimenti, cerca in questi namespace:',
 'default' => 'predefinito',
 'prefs-files' => 'File',
 'prefs-custom-css' => 'CSS personalizzato',
@@ -1455,7 +1494,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'editinguser' => "Modifica diritti utente dell'utente '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Modifica gruppi utente',
 'saveusergroups' => 'Salva gruppi utente',
-'userrights-groupsmember' => 'Appartiene ai gruppi:',
+'userrights-groupsmember' => 'Appartiene {{PLURAL:$1|al gruppo|ai gruppi}}:',
 'userrights-groupsmember-auto' => 'Membro implicito di:',
 'userrights-groups-help' => "È possibile modificare i gruppi cui è assegnato l'utente.
 * Una casella di spunta selezionata indica l'appartenenza dell'utente al gruppo
@@ -1468,6 +1507,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'userrights-notallowed' => "Il tuo account non dispone dell'autorizzazione per aggiungere o rimuovere i permessi utente.",
 'userrights-changeable-col' => 'Gruppi modificabili',
 'userrights-unchangeable-col' => 'Gruppi non modificabili',
+'userrights-conflict' => 'Conflitto di diritti utente! Applica nuovamente le tue modifiche.',
 
 # Groups
 'group' => 'Gruppo:',
@@ -1729,7 +1769,7 @@ Se si dispone dell'immagine nella risoluzione originale, si prega di caricarla.
 'savefile' => 'Salva file',
 'uploadedimage' => 'ha caricato "[[$1]]"',
 'overwroteimage' => 'ha caricato una nuova versione di "[[$1]]"',
-'uploaddisabled' => 'Il caricamento dei file è temporaneamente sospeso.',
+'uploaddisabled' => 'Il caricamento dei file è disabilitato.',
 'copyuploaddisabled' => 'Il caricamento tramite URL è disabilitato.',
 'uploadfromurl-queued' => 'Il caricamento è stato accodato.',
 'uploaddisabledtext' => 'Il caricamento dei file non è attivo.',
@@ -1869,7 +1909,6 @@ Per una sicurezza ottimale, img_auth.php è disattivato.',
 'http-read-error' => 'Errore di lettura HTTP.',
 'http-timed-out' => 'Richiesta HTTP scaduta.',
 'http-curl-error' => "Errore durante il recupero dell'URL: $1",
-'http-host-unreachable' => 'URL non raggiungibile.',
 'http-bad-status' => "C'è stato un problema durante la richiesta HTTP: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1947,7 +1986,7 @@ Probabilmente vuoi modificare la descrizione presente nella [$2 pagina di descri
 '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 delle $2, $1',
+'filerevert-defaultcomment' => 'Ripristinata la versione del $2, $1',
 '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.',
@@ -2131,7 +2170,7 @@ Potrebbero essere presenti immagini che sono usate da altri siti con un collegam
 # Special:Log
 'specialloguserlabel' => 'Azione effettuata da:',
 'speciallogtitlelabel' => 'Azione effettuata su:',
-'log' => 'Log',
+'log' => 'Registri',
 'all-logs-page' => 'Tutti i registri pubblici',
 'alllogstext' => "Presentazione unificata di tutti i registri di {{SITENAME}}.
 È 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).",
@@ -2279,8 +2318,8 @@ D\'ora in poi, le modifiche apportate alla pagina e alla sua discussione verrann
 'notvisiblerev' => 'La revisione è stata cancellata',
 'watchnochange' => 'Nessuna delle pagine osservate è stata modificata nel periodo selezionato.',
 'watchlist-details' => 'La lista degli osservati speciali contiene {{PLURAL:$1|una pagina (e la rispettiva pagina di discussione)|$1 pagine (e le rispettive pagine di discussione)}}.',
-'wlheader-enotif' => '* La notifica via e-mail è attiva.',
-'wlheader-showupdated' => "Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
+'wlheader-enotif' => 'La notifica via email è attiva.',
+'wlheader-showupdated' => "Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
 'watchmethod-recent' => 'controllo delle modifiche recenti per gli osservati speciali',
 'watchmethod-list' => 'controllo degli osservati speciali per modifiche recenti',
 'watchlistcontains' => 'La lista degli osservati speciali contiene {{PLURAL:$1|una pagina|$1 pagine}}.',
@@ -2422,7 +2461,7 @@ Le impostazioni correnti per la pagina sono '''$1''':",
 'protect-level-autoconfirmed' => 'Consentito solo agli utenti "autoconfermati"',
 'protect-level-sysop' => 'Consentito solo agli amministratori',
 'protect-summary-cascade' => 'ricorsiva',
-'protect-expiring' => 'scadenza: $1 (UTC)',
+'protect-expiring' => 'scade il $2 alle $3 (UTC)',
 'protect-expiring-local' => 'scade il $1',
 'protect-expiry-indefinite' => 'infinito',
 'protect-cascade' => 'Protezione ricorsiva (estende la protezione a tutte le pagine incluse in questa).',
@@ -2466,7 +2505,8 @@ Le impostazioni correnti per la pagina sono '''$1''':",
 'undeleteextrahelp' => "Per recuperare l'intera cronologia della pagina, lasciare tutte le caselle deselezionate e fare clic su '''''{{int:undeletebtn}}'''''.
 Per effettuare un ripristino selettivo, selezionare le caselle corrispondenti alle revisioni da ripristinare e fare clic su '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '{{PLURAL:$1|Una revisione|$1 revisioni}} in archivio',
-'undeletehistory' => 'Recuperando questa pagina, tutte le sue revisioni verranno ripristinate nella relativa cronologia. Se dopo la cancellazione è stata creata una nuova pagina con lo stesso titolo, le revisioni recuperate saranno inserite nella cronologia precedente.',
+'undeletehistory' => 'Recuperando questa pagina, tutte le sue versioni verranno ripristinate nella relativa cronologia.
+Se dopo la cancellazione è stata creata una nuova pagina con lo stesso titolo, le revisioni 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 revisioni cancellate più recenti.",
 'undeletehistorynoadmin' => "Questa pagina è stata cancellata.
 Il motivo della cancellazione è mostrato qui sotto, assieme ai dettagli dell'utente che ha modificato questa pagina prima della cancellazione.
@@ -2490,7 +2530,7 @@ $1',
 Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cancellazioni e i recuperi più recenti.",
 'undelete-header' => 'Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cancellazioni più recenti.',
 'undelete-search-title' => 'Ricerca nelle pagine cancellate',
-'undelete-search-box' => 'Ricerca nelle pagine cancellate',
+'undelete-search-box' => 'Ricerca le pagine cancellate',
 'undelete-search-prefix' => 'Mostra le pagine il cui titolo inizia con:',
 'undelete-search-submit' => 'Cerca',
 'undelete-no-results' => "Nessuna pagina corrispondente nell'archivio delle cancellazioni.",
@@ -2638,7 +2678,7 @@ Sei sicuro di voler continuare?',
 'emailblock' => 'e-mail bloccate',
 'blocklist-nousertalk' => 'non può modificare la propria pagina di discussione',
 'ipblocklist-empty' => "L'elenco dei blocchi è vuoto.",
-'ipblocklist-no-results' => "L'indirizzo IP o nome utente richiesto non è bloccato.",
+'ipblocklist-no-results' => "L'indirizzo IP o il nome utente richiesto non è bloccato.",
 'blocklink' => 'blocca',
 'unblocklink' => 'sblocca',
 'change-blocklink' => 'cambia blocco',
@@ -2681,6 +2721,7 @@ Consultare l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi o b
 'proxyblocksuccess' => 'Fatto.',
 'sorbsreason' => 'Questo indirizzo IP è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Non è possibile creare nuovi accessi da questo indirizzo IP perché è elencato come proxy aperto nella blacklist DNSBL utilizzata da {{SITENAME}}.',
+'xffblockreason' => "Un indirizzo IP presente nell'intestazione X-Forwarded-For, tuo o del server proxy che stai utilizzando, è stato bloccato. La motivazione originale del blocco è: $1",
 'cant-block-while-blocked' => 'Non è possibile bloccare altri utenti mentre si è bloccati.',
 'cant-see-hidden-user' => 'L\'utente che si sta tentando di bloccare è stato già bloccato e nascosto. Poiché non hai il permesso "hideuser", non è possibile visualizzare o modificare il blocco dell\'utente.',
 'ipbblocked' => 'Non puoi bloccare o sbloccare altri utenti, perché tu stesso sei bloccato',
@@ -2830,6 +2871,8 @@ Visitare [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//tra
 'thumbnail-more' => 'Ingrandisci',
 'filemissing' => 'File mancante',
 'thumbnail_error' => 'Errore nella creazione della miniatura: $1',
+'thumbnail_error_remote' => 'Messaggio di errore da $1:
+$2',
 'djvu_page_error' => 'Numero di pagina DjVu errato',
 'djvu_no_xml' => "Impossibile ottenere l'XML per il file DjVu",
 'thumbnail-temp-create' => 'Impossibile creare il file temporaneo delle miniature',
@@ -2977,17 +3020,11 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Stylesheets
 'common.css' => '/* Gli stili CSS inseriti qui si applicano a tutte le skin */',
-'standard.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Standard */',
-'nostalgia.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Nostalgia */',
 'cologneblue.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Cologne Blue */',
 'monobook.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Monobook */',
-'myskin.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin MySkin */',
-'chick.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Chick */',
-'simple.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Simple */',
 'modern.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Modern */',
 'vector.css' => '/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Vector */',
 'print.css' => "/* Gli stili CSS inseriti qui si applicano all'output in stampa */",
-'handheld.css' => '/* Gli stili CSS inseriti qui si applicano ai dispositivi portatili basati sulla skin configurata in $wgHandheldStyle */',
 'noscript.css' => '/ * Gli stili CSS inseriti qui si applicano agli utenti che hanno JavaScript disabilitato * /',
 'group-autoconfirmed.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ad utenti autoconvalidati * /',
 'group-bot.css' => '/ * Gli stili CSS inseriti qui si applicheranno solo ai bot * /',
@@ -2996,13 +3033,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Scripts
 'common.js' => '/* Il codice JavaScript inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */',
-'standard.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Standard */',
-'nostalgia.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Nostalgia */',
 'cologneblue.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Cologne Blue */',
 'monobook.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MonoBook */',
-'myskin.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin MySkin */',
-'chick.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Chick */',
-'simple.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Simple */',
 'modern.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Modern */',
 'vector.js' => '/* Il codice JavaScript inserito qui viene caricato dagli utenti che usano la skin Vector */',
 'group-autoconfirmed.js' => '/ * Il codice JavaScript inserito qui viene caricato solo per gli utenti autoconvalidati * /',
@@ -3116,7 +3148,7 @@ $1',
 # Media information
 'mediawarning' => "'''Attenzione''': Questo file potrebbe contenere codice maligno. La sua esecuzione potrebbe danneggiare il tuo sistema.",
 'imagemaxsize' => "Dimensione massima delle immagini:<br />''(per le pagine di descrizione del file)''",
-'thumbsize' => 'Grandezza delle miniature:',
+'thumbsize' => 'Dimensione delle miniature:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pagina|pagine}}',
 'file-info' => 'dimensione del file: $1, tipo MIME: $2',
 'file-info-size' => '$1 × $2 pixel, dimensione del file: $3, tipo MIME: $4',
@@ -3158,11 +3190,25 @@ $1',
 'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
 'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
 'days' => '{{PLURAL:$1|$1 giorno|$1 giorni}}',
+'weeks' => '{{PLURAL:$1|$1 settimana|$1 settimane}}',
 'months' => '{{PLURAL:$1|$1 mese|$1 mesi}}',
 'years' => '{{PLURAL:$1|$1 anno|$1 anni}}',
 'ago' => '$1 fa',
 'just-now' => 'proprio ora',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ora|ore}} fa',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minuti}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1|secondo|secondi}} fa',
+'monday-at' => 'Lunedì alle $1',
+'tuesday-at' => 'Martedì alle $1',
+'wednesday-at' => 'Mercoledì alle $1',
+'thursday-at' => 'Giovedì alle $1',
+'friday-at' => 'Venerdì alle $1',
+'saturday-at' => 'Sabato alle $1',
+'sunday-at' => 'Domenica alle $1',
+'yesterday-at' => 'Ieri alle $1',
+
 # Bad image list
 'bad_image_list' => "Il formato è il seguente:
 
@@ -3189,7 +3235,7 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghezza',
 'exif-imagelength' => 'Altezza',
 'exif-bitspersample' => 'Bit per campione',
@@ -3367,7 +3413,7 @@ I collegamenti successivi, sulla stessa riga, sono considerati come eccezioni (o
 'exif-originalimageheight' => "Altezza dell'immagine prima che fosse ritagliata",
 'exif-originalimagewidth' => "Larghezza dell'immagine prima che fosse ritagliata",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nessuno',
 'exif-compression-2' => 'CCITT gruppo 3 monodimensionale - codifica run length di Huffman modificata',
 'exif-compression-3' => 'Codifica fax CCITT Group 3',
@@ -3615,7 +3661,7 @@ Messaggio di errore del mailer: $1',
 'confirmemail_invalid' => 'Codice di conferma non valido. Il codice potrebbe essere scaduto.',
 'confirmemail_needlogin' => 'È necessario $1 per confermare il proprio indirizzo e-mail.',
 'confirmemail_success' => "L'indirizzo e-mail è confermato. Ora è possibile [[Special:UserLogin|eseguire l'accesso]] e fare pieno uso del sito.",
-'confirmemail_loggedin' => "L'indirizzo e-mail è stato confermato.",
+'confirmemail_loggedin' => "L'indirizzo email è stato confermato.",
 'confirmemail_error' => 'Errore nel salvataggio della conferma.',
 'confirmemail_subject' => "{{SITENAME}}: richiesta di conferma dell'indirizzo",
 'confirmemail_body' => 'Qualcuno, probabilmente tu stesso dall\'indirizzo IP $1, ha registrato l\'account "$2" su {{SITENAME}} indicando questo indirizzo e-mail.
@@ -3669,9 +3715,9 @@ Questo codice di conferma scadrà automaticamente alle $4.',
 # Delete conflict
 'deletedwhileediting' => "'''Attenzione''': questa pagina è stata cancellata dopo che hai cominciato a modificarla!",
 'confirmrecreate' => "L'utente [[User:$1|$1]] ([[User talk:$1|discussioni]]) ha cancellato questa pagina dopo che hai iniziato a modificarla, per il seguente motivo: ''$2''
-Per favore, conferma che desideri veramente ricreare questa pagina.",
+Per favore, conferma che vuoi veramente ricreare questa pagina.",
 'confirmrecreate-noreason' => "L'utente [[User:$1|$1]] ([[User talk:$1|discussioni]]) ha cancellato questa pagina dopo che hai iniziato a modificarla.
-Per favore, conferma che desideri veramente ricreare questa pagina.",
+Per favore, conferma che vuoi veramente ricreare questa pagina.",
 'recreate' => 'Ricrea',
 
 # action=purge
@@ -3701,7 +3747,7 @@ Per favore, conferma che desideri veramente ricreare questa pagina.",
 'table_pager_prev' => 'Pagina precedente',
 'table_pager_first' => 'Prima pagina',
 'table_pager_last' => 'Ultima pagina',
-'table_pager_limit' => 'Mostra $1 file per pagina',
+'table_pager_limit' => 'Mostra $1 elementi per pagina',
 'table_pager_limit_label' => 'Elementi per pagina:',
 'table_pager_limit_submit' => 'Vai',
 'table_pager_empty' => 'Nessun risultato',
@@ -3710,7 +3756,7 @@ Per favore, conferma che desideri veramente ricreare questa pagina.",
 'autosumm-blank' => 'Pagina svuotata',
 'autosumm-replace' => "Pagina sostituita con '$1'",
 'autoredircomment' => 'Redirect alla pagina [[$1]]',
-'autosumm-new' => "Creata pagina con '$1'",
+'autosumm-new' => 'Creata pagina con "$1"',
 
 # Size units
 'size-bytes' => '$1 byte',
@@ -3799,12 +3845,17 @@ Questo programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/CO
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Percorso voci]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Percorso script]',
 
-# Special:FilePath
-'filepath' => 'Percorso di un file',
-'filepath-page' => 'Nome del file:',
-'filepath-submit' => 'Vai',
-'filepath-summary' => 'Questa pagina speciale restituisce il percorso completo di un file.
-Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri tipi di file viene avviato direttamente il programma associato.',
+# Special:Redirect
+'redirect' => 'Reindirizzamento da file, utente o ID versione',
+'redirect-legend' => 'Reindirizza a un file o una pagina',
+'redirect-summary' => 'Questa pagina speciale reindirizza a un file (specificando il nome del file), a una pagina (specificando un ID di versione) o a un utente (specificando un ID utente numerico).',
+'redirect-submit' => 'Vai',
+'redirect-lookup' => 'Ricerca:',
+'redirect-value' => 'Valore:',
+'redirect-user' => 'ID utente',
+'redirect-revision' => 'Versione pagina',
+'redirect-file' => 'Nome del file',
+'redirect-not-exists' => 'Valore non trovato',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ricerca dei file duplicati',
@@ -3838,7 +3889,7 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 
 # Special:BlankPage
 'blankpage' => 'Pagina vuota',
-'intentionallyblankpage' => 'Questa pagina è lasciata volutamente vuota ed è usata per benchmark, ecc.',
+'intentionallyblankpage' => 'Questa pagina è lasciata volutamente vuota.',
 
 # External image whitelist
 'external_image_whitelist' => " #Lasciare questa riga esattamente com'è<pre>
@@ -3895,6 +3946,9 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'htmlform-submit' => 'Invia',
 'htmlform-reset' => 'Annulla modifiche',
 'htmlform-selectorother-other' => 'Altro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sì',
+'htmlform-chosen-placeholder' => "Seleziona un'opzione",
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con la possibilità di ricerca completa nel testo',
index 8ea970d..c0dd43b 100644 (file)
@@ -59,6 +59,7 @@
  * @author 欅
  * @author 蝋燭α
  * @author 青子守歌
+ * @author 아라
  */
 
 $datePreferences = array(
@@ -141,6 +142,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'パスの取得' ),
        'Import'                    => array( 'データ取り込み', 'データー取り込み', 'インポート' ),
        'Invalidateemail'           => array( 'メール無効化', 'メール無効' ),
+       'JavaScriptTest'            => array( 'JavaScriptテスト', 'JavaScript試験' ),
        'BlockList'                 => array( 'ブロック一覧', 'ブロックの一覧' ),
        'LinkSearch'                => array( '外部リンク検索' ),
        'Listadmins'                => array( '管理者一覧' ),
@@ -157,6 +159,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIME検索', 'MIMEタイプ検索' ),
        'Mostcategories'            => array( 'カテゴリの多いページ', 'カテゴリの多い項目' ),
        'Mostimages'                => array( '被リンクの多いファイル', '使用箇所の多いファイル' ),
+       'Mostinterwikis'            => array( 'ウィキ間リンクの多いページ' ),
        'Mostlinked'                => array( '被リンクの多いページ' ),
        'Mostlinkedcategories'      => array( '被リンクの多いカテゴリ' ),
        'Mostlinkedtemplates'       => array( '使用箇所の多いテンプレート', '被リンクの多いテンプレート' ),
@@ -167,7 +170,8 @@ $specialPageAliases = array(
        'Mytalk'                    => array( 'トークページ', '会話ページ', 'マイトーク', 'マイ・トーク' ),
        'Myuploads'                 => array( '自分のアップロード記録' ),
        'Newimages'                 => array( '新着ファイル', '新しいファイルの一覧', '新着画像展示室' ),
-       'Newpages'                  => array( '新しいページ', '新規項目' ),
+       'Newpages'                  => array( '新しいページ' ),
+       'PagesWithProp'             => array( 'プロパティがあるページ' ),
        'PasswordReset'             => array( 'パスワード再設定', 'パスワードの再設定', 'パスワードのリセット', 'パスワードリセット' ),
        'PermanentLink'             => array( '固定リンク', 'パーマリンク' ),
        'Popularpages'              => array( '人気ページ' ),
@@ -179,6 +183,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'おまかせリダイレクト', 'おまかせ転送' ),
        'Recentchanges'             => array( '最近の更新', '最近更新したページ' ),
        'Recentchangeslinked'       => array( '関連ページの更新状況', 'リンク先の更新状況' ),
+       'Redirect'                  => array( '転送', 'リダイレクト' ),
        'Revisiondelete'            => array( '版指定削除', '特定版削除' ),
        'Search'                    => array( '検索' ),
        'Shortpages'                => array( '短いページ' ),
@@ -392,8 +397,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示',
 'tog-oldsig' => '既存の署名:',
 'tog-fancysig' => '署名をウィキ文として扱う (自動リンクなし)',
-'tog-externaleditor' => '既定で編集に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
-'tog-externaldiff' => '差分表示に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
 'tog-showjumplinks' => '利用しやすさ向上のための「{{int:jumpto}}」リンクを有効にする',
 'tog-uselivepreview' => 'ライブプレビューを使用 (JavaScriptが必要) (開発中)',
 'tog-forceeditsummary' => '要約欄が空欄の場合に確認を促す',
@@ -408,6 +411,7 @@ $messages = array(
 'tog-showhiddencats' => '隠しカテゴリを表示',
 'tog-noconvertlink' => 'リンクタイトル変換を無効にする',
 'tog-norollbackdiff' => '巻き戻し後の差分を表示しない',
+'tog-useeditwarning' => '変更を保存せずに編集画面から離れようとしたら警告',
 
 'underline-always' => '常に付ける',
 'underline-never' => '常に付けない',
@@ -417,8 +421,8 @@ $messages = array(
 'editfont-style' => '編集エリアのフォント:',
 'editfont-default' => 'ブラウザーの設定を使用',
 'editfont-monospace' => '等幅フォント',
-'editfont-sansserif' => 'Sans Serif フォント',
-'editfont-serif' => 'Serif フォント',
+'editfont-sansserif' => 'サンセリフ体のフォント',
+'editfont-serif' => 'セリフ体のフォント',
 
 # Dates
 'sunday' => '日曜日',
@@ -471,6 +475,18 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|カテゴリ}}',
@@ -783,9 +799,18 @@ $2',
 'welcomecreation-msg' => 'アカウントが作成されました。
 [[Special:Preferences|{{SITENAME}}の個人設定]]の変更も忘れないようにしてください。',
 'yourname' => '利用者名:',
+'userlogin-yourname' => '利用者名',
+'userlogin-yourname-ph' => '利用者名を入力',
 'yourpassword' => 'パスワード:',
+'userlogin-yourpassword' => 'パスワード',
+'userlogin-yourpassword-ph' => 'パスワードを入力',
+'createacct-yourpassword-ph' => 'パスワードを入力',
 'yourpasswordagain' => 'パスワード再入力:',
+'createacct-yourpasswordagain' => 'パスワード再入力',
+'createacct-yourpasswordagain-ph' => 'パスワードを再入力',
 'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
+'userlogin-remembermypassword' => 'ログイン状態を保持',
+'userlogin-signwithsecure' => 'SSL (https) 接続を使用',
 'securelogin-stick-https' => 'ログイン後にHTTPS接続を維持',
 'yourdomainname' => 'ドメイン:',
 'password-change-forbidden' => 'このウィキではパスワードを変更できません。',
@@ -798,18 +823,38 @@ $2',
 'logout' => 'ログアウト',
 'userlogout' => 'ログアウト',
 'notloggedin' => 'ログインしていません',
+'userlogin-noaccount' => '登録がまだの場合',
+'userlogin-joinproject' => '{{SITENAME}}のアカウントを作成',
 'nologin' => '登録がまだの場合、$1。',
 'nologinlink' => 'アカウントを作成してください',
 'createaccount' => 'アカウント作成',
 'gotaccount' => 'アカウントを既に持っている場合、$1。',
 'gotaccountlink' => 'ログインしてください',
 'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
+'userlogin-resetpassword-link' => 'パスワードを再設定',
+'helplogin-url' => 'Help:ログイン',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ログインのヘルプ]]',
+'createacct-join' => '以下の情報を入力してください。',
+'createacct-emailrequired' => 'メールアドレス',
+'createacct-emailoptional' => 'メールアドレス (省略可能)',
+'createacct-email-ph' => 'メールアドレスを入力',
 'createaccountmail' => '一時的でランダムなパスワードを生成して、以下に指定したメールアドレスに送信する',
+'createacct-realname' => '本名 (省略可能)',
 'createaccountreason' => '理由:',
+'createacct-reason' => '理由',
+'createacct-reason-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|貢献者}}',
 'badretype' => '入力したパスワードが一致しません。',
 'userexists' => '入力された利用者名は既に使用されています。
 他の名前を選んでください。',
 'loginerror' => 'ログインのエラー',
+'createacct-error' => 'アカウント作成エラー',
 'createaccounterror' => 'アカウントを作成できませんでした: $1',
 'nocookiesnew' => '利用者アカウントは作成されましたが、ログインしていません。
 {{SITENAME}}では利用者のログインに Cookie を使用します。
@@ -848,7 +893,7 @@ Cookieを有効にしていることを確認して、このページを再読
 この申請をしたのが他人の場合、あるいはパスワードを思い出してパスワード変更が不要になった場合は、
 このメッセージを無視して、引き続き以前のパスワードを使用し続けることができます。',
 'noemail' => '利用者「$1」のメールアドレスは登録されていません。',
-'noemailcreate' => '有効なメールアドレスを入力する必要があります',
+'noemailcreate' => '有効なメールアドレスを入力する必要があります',
 'passwordsent' => '新しいパスワードを「$1」に登録されたメールアドレスにお送りしました。
 メールが届いたら、再度ログインしてください。',
 'blocked-mailpassword' => 'ご使用中のIPアドレスからの編集はブロックされており、不正利用防止のため、パスワードの再発行機能は使用できません。',
@@ -907,13 +952,15 @@ Cookieを有効にしていることを確認して、このページを再読
 'resetpass-wrong-oldpass' => '仮パスワードまたは現在のパスワードが正しくありません。
 パスワードを既に変更した、または新しい仮パスワードを依頼した可能性があります。',
 'resetpass-temp-password' => '仮パスワード:',
+'resetpass-abort-generic' => '拡張機能により、パスワードの変更は取り消されました。',
 
 # Special:PasswordReset
 'passwordreset' => 'パスワードの再設定',
-'passwordreset-text' => 'このフォームに記入すると、パスワードを再設定できます。',
+'passwordreset-text-one' => 'パスワードを再設定するにはこのフォームに記入してください。',
+'passwordreset-text-many' => '{{PLURAL:$1|パスワードを再設定するにはいずれかの情報を入力してください。}}',
 'passwordreset-legend' => 'パスワードの再設定',
 'passwordreset-disabled' => 'パスワードの再設定は、このウィキでは無効になっています。',
-'passwordreset-pretext' => '{{PLURAL:$1||下記のデータのいずれか 1 つを入力してください}}',
+'passwordreset-emaildisabled' => 'メール機能は、このウィキでは無効化されています。',
 'passwordreset-username' => '利用者名:',
 'passwordreset-domain' => 'ドメイン:',
 'passwordreset-capture' => 'お送りするメールの内容を表示しますか?',
@@ -946,7 +993,7 @@ $2
 仮パスワード: $2',
 'passwordreset-emailsent' => 'パスワード再設定メールをお送りしました。',
 'passwordreset-emailsent-capture' => '下記の内容の、パスワード再設定メールをお送りしました。',
-'passwordreset-emailerror-capture' => '以下の内容のパスワード再設定メールを生成しましたが、利用者への送信に失敗しました: $1',
+'passwordreset-emailerror-capture' => '以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'メールアドレスの変更',
@@ -1168,12 +1215,15 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロッ
 既に削除されているようです。',
 'edit-conflict' => '編集が競合。',
 'edit-no-change' => '文章が変更されていないため、編集は無視されました。',
+'postedit-confirmation' => '編集を保存しました。',
 'edit-already-exists' => '新しいページを作成できませんでした。
 そのページは既に存在します。',
 'defaultmessagetext' => '既定のメッセージ文',
 'content-failed-to-parse' => '$2のコンテンツを$1モデルとして構文解析できませんでした: $3',
 'invalid-content-data' => '本文データが無効です',
 'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
+'editwarning-warning' => 'このページを離れると、あなたが行なった変更がすべて失われてしまうかもしれません。
+ログインしている場合、個人設定の「編集」タブでこの警告を表示しないようにすることができます。',
 
 # Content models
 'content-model-wikitext' => 'ウィキテキスト',
@@ -1461,15 +1511,7 @@ $1",
 'searchdisabled' => '{{SITENAME}}の検索機能は無効化されています。
 さしあたってはGoogleなどで検索できます。
 ただし外部の検索エンジンの索引にある{{SITENAME}}のコンテンツは古い場合があります。',
-
-# Quickbar
-'qbsettings' => 'クイックバー',
-'qbsettings-none' => 'なし',
-'qbsettings-fixedleft' => '左端',
-'qbsettings-fixedright' => '右端',
-'qbsettings-floatingleft' => 'ウィンドウの左上に固定',
-'qbsettings-floatingright' => 'ウィンドウの右上に固定',
-'qbsettings-directionality' => 'あなたの言語の文字体系の書字方向に応じて固定',
+'search-error' => '検索する際にエラーが発生しました: $1',
 
 # Preferences page
 'preferences' => '個人設定',
@@ -1620,6 +1662,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'userrights-changeable-col' => '変更できるグループ',
 'userrights-unchangeable-col' => '変更できないグループ',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => '利用者権限に競合があります! 変更内容をもう一度適用してください。',
 
 # Groups
 'group' => 'グループ:',
@@ -1686,7 +1729,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-unblockself' => '自身に対するブロックを解除',
 'right-protect' => '保護レベルを変更し、保護されたページを編集',
 'right-editprotected' => '保護ページ (カスケード保護を除く) を編集',
-'right-editinterface' => 'ã\83¦ã\83¼ã\82¶ã\83¼ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤スを編集',
+'right-editinterface' => 'ã\83¦ã\83¼ã\82¶ã\83¼ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼スを編集',
 'right-editusercssjs' => '他の利用者のCSSファイル/JavaScriptファイルを編集',
 'right-editusercss' => '他の利用者のCSSファイルを編集',
 'right-edituserjs' => '他の利用者のJavaScriptファイルを編集',
@@ -2047,7 +2090,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization をご覧ください
 'http-read-error' => 'HTTP読み込みエラーです。',
 'http-timed-out' => 'HTTP要求がタイムアウトしました。',
 'http-curl-error' => 'URLからの取得に失敗しました: $1',
-'http-host-unreachable' => 'URLに到達できません。',
 'http-bad-status' => 'HTTP リクエストで問題が発生しました: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2063,7 +2105,7 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'license-header' => 'ライセンス',
 'nolicense' => '選択なし',
 'license-nopreview' => '(プレビューはありません)',
-'upload_source_url' => '(有効かつ一般に公開されているURL)',
+'upload_source_url' => '(有効かつ一般に公開されている URL)',
 'upload_source_file' => '(あなたのコンピューター上のファイル)',
 
 # Special:ListFiles
@@ -2467,8 +2509,8 @@ contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</
 'notvisiblerev' => '別の利用者による最終版は削除されました',
 'watchnochange' => 'ウォッチリストに登録しているページで、指定期間内に編集されたものはありません。',
 'watchlist-details' => 'ウォッチリストには {{PLURAL:$1|$1 ページ}}が登録されています (トークページを除く)。',
-'wlheader-enotif' => '* メール通知が有効になっています',
-'wlheader-showupdated' => "* 最終訪問以降に変更されたページは、'''太字'''で表示されます",
+'wlheader-enotif' => 'メール通知が有効になっています。',
+'wlheader-showupdated' => "最終訪問以降に変更されたページは、'''太字'''で表示されます。",
 'watchmethod-recent' => '最近の更新内のウォッチされているページを確認中',
 'watchmethod-list' => 'ウォッチされているページ内の最近の更新を確認中',
 'watchlistcontains' => 'ウォッチリストには {{PLURAL:$1|$1 ページ}}が登録されています。',
@@ -2616,7 +2658,7 @@ $2による直前の版へ変更されました。',
 ページ「'''$1'''」の現在の状態は以下の通りです:",
 'protect-cascadeon' => 'このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、保護されています。
 このページの保護レベルを変更できますが、カスケード保護には影響しません。',
-'protect-default' => 'ã\81\99ã\81¹ã\81¦ã\81®å\88©ç\94¨è\80\85ã\82\92許可',
+'protect-default' => 'ã\81\99ã\81¹ã\81¦ã\81®å\88©ç\94¨è\80\85ã\81«許可',
 'protect-fallback' => '「$1」権限を持つ利用者のみに許可',
 'protect-level-autoconfirmed' => '自動承認された利用者のみに許可',
 'protect-level-sysop' => '管理者のみに許可',
@@ -2726,8 +2768,8 @@ $1',
 'contribsub2' => '利用者: $1 ($2)',
 'nocontribs' => 'これらの条件に一致する変更は見つかりませんでした。',
 'uctop' => '(最新)',
-'month' => 'ã\81\93ã\82\8c以å\89\8dã\81®æ\9c\88:',
-'year' => 'ã\81\93ã\82\8c以å\89\8dã\81®å¹´:',
+'month' => 'ã\81\93ã\81®æ\9c\88以å\89\8d:',
+'year' => 'ã\81\93ã\81®å¹´ä»¥å\89\8d:',
 
 'sp-contributions-newbies' => '新規利用者の投稿のみ表示',
 'sp-contributions-newbies-sub' => '新規利用者のみ',
@@ -2807,7 +2849,7 @@ $1',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]をブロックしました。<br />
 [[Special:BlockList|ブロックの一覧]]を参照してください。',
 'ipb-blockingself' => '自分自身をブロックしようとしています! 本当に実行しますか?',
-'ipb-confirmhideuser' => '秘匿が有効になっている利用者をブロックしようとしています。実行すると、すべてのリストやログでこの利用者名が表示されません。本当に実行しますか?',
+'ipb-confirmhideuser' => '秘匿が有効になっている利用者をブロックしようとしています。実行すると、すべての一覧や記録項目で利用者名が表示されません。本当に実行しますか?',
 'ipb-edit-dropdown' => 'ブロック理由を編集',
 'ipb-unblock-addr' => '$1のブロックを解除',
 'ipb-unblock' => '利用者またはIPアドレスのブロックを解除',
@@ -2892,6 +2934,7 @@ $1 のブロックの理由は「''$2''」です。",
 'sorbsreason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。',
 'sorbs_create_account_reason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。
 アカウント作成はできません',
+'xffblockreason' => 'X-Forwarded-For ヘッダーに含まれている IP アドレスがブロックされています。これはあなたのものか、あなたが利用しているプロキシサーバーのものです。元のブロックの理由は: $1',
 'cant-block-while-blocked' => 'ブロックされている間は、他の利用者をブロックできません。',
 'cant-see-hidden-user' => 'ブロックしようとしている利用者は、既にブロックされ隠されています。
 あなたには hideuser 権限がないため、この利用者のブロックの閲覧/編集はできません。',
@@ -3057,7 +3100,9 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 # Thumbnails
 'thumbnail-more' => '拡大',
 'filemissing' => 'ファイルがありません',
-'thumbnail_error' => 'サムネイルの作成中にエラーが発生しました: $1',
+'thumbnail_error' => 'サムネイルの作成エラー: $1',
+'thumbnail_error_remote' => '$1が返したエラーメッセージ:
+$2',
 'djvu_page_error' => 'DjVuページが範囲外です',
 'djvu_no_xml' => 'DjVuファイルのXMLデータを取得できません',
 'thumbnail-temp-create' => '一時的なサムネイルファイルを作成できません',
@@ -3211,17 +3256,11 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 
 # Stylesheets
 'common.css' => '/* ここに記述したCSSはすべての外装に反映されます */',
-'standard.css' => '/* ここに記述したCSSはスタンダード外装の利用者に影響します */',
-'nostalgia.css' => '/* ここに記述したCSSはノスタルジア外装の利用者に影響します */',
 'cologneblue.css' => '/* ここに記述したCSSはケルンブルー外装の利用者に影響します */',
 'monobook.css' => '/* ここに記述したCSSはモノブック外装の利用者に影響します */',
-'myskin.css' => '/* ここに記述したCSSはマイスキン外装の利用者に影響します */',
-'chick.css' => '/* ここに記述したCSSはチック外装の利用者に影響します */',
-'simple.css' => '/* ここに記述したCSSはシンプル外装の利用者に影響します */',
 'modern.css' => '/* ここに記述したCSSはモダン外装の利用者に影響します */',
 'vector.css' => '/* ここに記述したCSSはベクター外装の利用者に影響します */',
 'print.css' => '/* ここに記述したCSSは印刷出力に影響します */',
-'handheld.css' => '/* ここに記述したCSSは$wgHandheldStyleで設定された外装に基づく携帯機器に影響します */',
 'noscript.css' => '/* ここに記述したCSSはJavaScriptを無効にしている利用者に影響します */',
 'group-autoconfirmed.css' => '/* ここに記述したCSSは自動承認された利用者のみに影響します */',
 'group-bot.css' => '/* ここに記述したCSSはボットのみに影響します */',
@@ -3230,13 +3269,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 
 # Scripts
 'common.js' => '/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */',
-'standard.js' => '/* ここにあるすべてのJavaScriptは、スタンダード外装を使用している利用者に対して読み込まれます */',
-'nostalgia.js' => '/* ここにあるすべてのJavaScriptは、ノスタルジア外装を使用している利用者に対して読み込まれます */',
 'cologneblue.js' => '/* ここにあるすべてのJavaScriptは、ケルンブルー外装を使用している利用者に対して読み込まれます */',
 'monobook.js' => '/* ここにあるすべてのJavaScriptは、モノブック外装を使用している利用者に対して読み込まれます */',
-'myskin.js' => '/* ここにあるすべてのJavaScriptは、マイスキン外装を使用している利用者に対して読み込まれます */',
-'chick.js' => '/* ここにあるすべてのJavaScriptは、チック外装を使用している利用者に対して読み込まれます */',
-'simple.js' => '/* ここにあるすべてのJavaScriptは、シンプル外装を使用している利用者に対して読み込まれます */',
 'modern.js' => '/* ここにあるすべてのJavaScriptは、モダン外装を使用している利用者に対して読み込まれます */',
 'vector.js' => '/* ここにあるすべてのJavaScriptは、ベクター外装を使用している利用者に対して読み込まれます */',
 'group-autoconfirmed.js' => '/* ここにあるすべてのJavaScriptは、自動承認された利用者に対して読み込まれます */',
@@ -3317,13 +3351,8 @@ MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、
 'pageinfo-category-files' => 'ファイル数',
 
 # Skin names
-'skinname-standard' => 'クラシック',
-'skinname-nostalgia' => 'ノスタルジア',
 'skinname-cologneblue' => 'ケルンブルー',
 'skinname-monobook' => 'モノブック',
-'skinname-myskin' => 'マイスキン',
-'skinname-chick' => 'チック',
-'skinname-simple' => 'シンプル',
 'skinname-modern' => 'モダン',
 'skinname-vector' => 'ベクター',
 
@@ -3408,11 +3437,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 分}}',
 'hours' => '{{PLURAL:$1|$1 時間}}',
 'days' => '{{PLURAL:$1|$1 日}}',
+'weeks' => '{{PLURAL:$1|$1 週間}}',
 'months' => '{{PLURAL:$1|$1 か月}}',
 'years' => '{{PLURAL:$1|$1 年}}',
 'ago' => '$1前',
 'just-now' => 'ちょうど今',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => '書式は以下の通りです:
 
@@ -3422,8 +3465,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => '中国語 (簡体)',
@@ -3497,7 +3538,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '画像の幅',
 'exif-imagelength' => '画像の高さ',
 'exif-bitspersample' => '画像のビットの深さ',
@@ -3675,7 +3716,7 @@ Variants for Chinese language
 'exif-originalimageheight' => 'トリミングされる前の画像の高さ',
 'exif-originalimagewidth' => 'トリミングされる前の画像の幅',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '無圧縮',
 'exif-compression-2' => 'CCITT Group 3 1次元修正ハフマン連長符号化',
 'exif-compression-3' => 'CCITT Group 3 ファックス符号化',
@@ -4174,12 +4215,17 @@ MediaWikiは、有用であることを期待して配布されていますが
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath/ja 記事のパス]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath/ja スクリプトパス]',
 
-# Special:FilePath
-'filepath' => 'ファイルパス',
-'filepath-page' => 'ファイル:',
-'filepath-submit' => '取得',
-'filepath-summary' => 'この特別ページは、ファイルへの完全なパスを返します。
-画像は最大解像度で表示され、他のファイルタイプは関連付けされたプログラムが直接起動します。',
+# Special:Redirect
+'redirect' => 'ファイル名、利用者ID、版IDでの転送',
+'redirect-legend' => 'ファイルまたはページヘの転送',
+'redirect-summary' => 'この特別ページは、ファイル (ファイル名を指定)、ページ (版 ID を指定)、利用者ページ (利用者 ID を整数で指定) に転送されます。',
+'redirect-submit' => '実行',
+'redirect-lookup' => '検索の種類:',
+'redirect-value' => '値:',
+'redirect-user' => '利用者 ID',
+'redirect-revision' => 'ページの版 ID',
+'redirect-file' => 'ファイル名',
+'redirect-not-exists' => '値が見つかりません',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '重複ファイルの検索',
@@ -4252,7 +4298,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 # Database error messages
 'dberr-header' => 'このウィキには問題があります',
 'dberr-problems' => '申し訳ありません!
-このウェブサイトに技術的な問題が発生しています。',
+このウェブサイトに技術的な障害が発生しています。',
 'dberr-again' => '数分間待った後、もう一度読み込んでください。',
 'dberr-info' => '(データベースサーバー $1 に接続できませんでした)',
 'dberr-usegoogle' => '元に戻るまで、Googleを利用して検索できます。',
@@ -4270,6 +4316,9 @@ MediaWikiは、有用であることを期待して配布されていますが
 'htmlform-submit' => '送信',
 'htmlform-reset' => '変更を取り消す',
 'htmlform-selectorother-other' => 'その他',
+'htmlform-no' => 'いいえ',
+'htmlform-yes' => 'はい',
+'htmlform-chosen-placeholder' => '選択してください',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (全文検索あり)',
index a9ecb16..b8e50b5 100644 (file)
@@ -10,6 +10,7 @@
  * @author Hazard-SJ
  * @author Ukabia
  * @author Yocahuna
+ * @author គីមស៊្រុន
  */
 
 $messages = array(
@@ -42,8 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Shuo di nomba a wachin yuuza',
 'tog-oldsig' => 'Priivyuu a egzisin signicha:',
 'tog-fancysig' => 'Chriit signicha az wikitex (widoutn aatamatik lingk)',
-'tog-externaleditor' => 'Yuuz extoernal edita bai difaalt (fi expoert onli, niid speshal setn pahn yu kompiuta)',
-'tog-externaldiff' => 'Yuuz extoernal dif bai difaalt (fi expoert onli, niid speshal setn pahn yu kompiuta)',
 'tog-showjumplinks' => 'Eniebl "jomp tu" aksesibiliti lingk',
 'tog-uselivepreview' => 'Yuuz laiv priivyuu (rikwaya JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Pramp mi wen entarin blangk edit somari',
@@ -244,7 +243,7 @@ $1',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Habowt {{SITENAME}}',
-'aboutpage' => 'Project: About',
+'aboutpage' => 'Project: អំពី',
 'copyright' => 'Kantent avielobl anda $1.',
 'copyrightpage' => '{{ns:project}}:Kapirait',
 'currentevents' => 'Korant ivent',
index 4279d5f..3f4e01f 100644 (file)
@@ -42,8 +42,6 @@ $messages = array(
 '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-externaleditor' => 'Brug ekstern redigærengsmåskiin åtåmatisk',
-'tog-externaldiff' => 'Brug ekstern førskelsvesnenge åtåmatisk',
 'tog-showjumplinks' => 'Ves tilgængelegheds-henvesnenger',
 'tog-uselivepreview' => 'Brug åtåmatisk førhåndsvesnenge (JavaScript) (eksperimentel)',
 'tog-forceeditsummary' => 'Advar, hves sammenfatnenge mangler ve gemnenge',
@@ -609,7 +607,7 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre 
 'linksearch-line' => '$2 linker til $1',
 'linksearch-error' => "Wildkårter må ken benyttes i'n stårt åf håstnavnet.",
 
-# E-mail user
+# Email user
 'emailuser' => 'E-mail til denne bruger',
 
 # Watchlist
index 83163b9..1c19744 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Anggoro
+ * @author Bawoor
  * @author Bennylin
  * @author Helix84
  * @author Hoo
@@ -52,11 +53,11 @@ $namespaceAliases = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garisen ngisoré pranala:',
-'tog-justify' => 'Ratakna paragraf',
-'tog-hideminor' => 'Delikna suntingan cilik ing owah-owahan pungkasan',
-'tog-hidepatrolled' => 'Delikna suntingan sing wis dipatroli ing kaca owah-owahan',
-'tog-newpageshidepatrolled' => 'Delikna kaca sing wis dipatroli saka daftar kaca anyar',
-'tog-extendwatchlist' => 'Kembangna daftar pangawasan kanggo nuduhaké kabèh pangowahan, ora mung sing paling anyar',
+'tog-justify' => 'Ratakaké paragrap',
+'tog-hideminor' => 'Dhelikaké suntingan cilik ing owah-owahan pungkasan',
+'tog-hidepatrolled' => 'Dhelikaké suntingan kapanto ing owah-owahan pungkasan',
+'tog-newpageshidepatrolled' => 'Dhelikaké kaca kapanto saka daptar kaca anyar',
+'tog-extendwatchlist' => 'Jembaraké daptar pangawasan kanggo nuduhaké kabèh owahan, ora mung sing paling anyar',
 'tog-usenewrc' => 'Owah-owahané paguyuban miturut kaca nèng owah-owahan anyar lan daptar panto (mbutuhaké JavaScript)',
 'tog-numberheadings' => 'Wènèhana nomer judul secara otomatis',
 'tog-showtoolbar' => 'Tuduhna <em>toolbar</em> (batang piranti) panyuntingan',
@@ -80,10 +81,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tuduhna cacahé pangawas',
 'tog-oldsig' => 'Tapak asma sing ana:',
 'tog-fancysig' => 'Anggepen tapak asta minangka teks wiki (tanpa pranala otomatis)',
-'tog-externaleditor' => 'Pigunakaken program pangolah tembung jawi (namung tumrap ahli, perlu pangaturan mligi ing komputer panjenengan. 
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi sajangkepipun].)',
-'tog-externaldiff' => 'Pigunakaken diff eksternal sacara bektan (namung tumrap para ahli, perlu pangaturan mligi ing komputer panjenengan.
-[//www.mediawiki.org/wiki/Manual:External_editors Informasi sajangkepipun].)',
 'tog-showjumplinks' => 'Aktifna pranala pambiyantu "langsung menyang"',
 'tog-uselivepreview' => 'Nganggoa pratayang langsung (JavaScript) (eksperimental)',
 'tog-forceeditsummary' => 'Élingna aku menawa kothak ringkesan suntingan isih kosong',
@@ -97,6 +94,7 @@ $messages = array(
 'tog-diffonly' => 'Aja dituduhaké isi kaca ing ngisor bédané suntingan',
 'tog-showhiddencats' => 'Tuduhna kategori sing didelikaké',
 'tog-norollbackdiff' => 'Lirwaaké prabédan sawusé nglakokaké sawijining pambalikan.',
+'tog-useeditwarning' => 'Èlingaké kula yèn kula ninggalaké suntingan sing durung kasimpen',
 
 'underline-always' => 'Tansah',
 'underline-never' => 'Ora',
@@ -456,6 +454,8 @@ Cathet yèn sapérangan kaca mungkin isih nampilaké tulisan yèn Sampéyan isih
 'welcomeuser' => 'Sugeng Rawuh, $1!',
 'welcomecreation-msg' => 'Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.',
 'yourname' => 'Asma pangangeman',
+'userlogin-yourname' => 'Jeneng panganggo',
+'userlogin-yourname-ph' => 'Lebokaké jenengné panganggo',
 'yourpassword' => 'Tembung sandhi:',
 'yourpasswordagain' => 'Balènana tembung sandhi',
 'remembermypassword' => 'Émut tembung sandi kula (salebeting $1 {{PLURAL:$1|dinten|dinten}})',
@@ -512,8 +512,8 @@ Yèn wong liya sing nglakoni panyuwunan iki, utawa panjenengan éling tembung sa
 'passwordsent' => 'Tembung sandhi anyar wis dikirim menyang alamat layang e-mail panjenengan sing wis didaftar kanggo "$1". Mangga mlebu log manèh sawisé nampa e-mail iku.',
 'blocked-mailpassword' => "Alamat IP panjenengan diblokir saka panyuntingan, mulané panjenengan ora olèh nganggo fungsi pèngetan tembung sandhi kanggo ''mencegah penyalahgunaan''.",
 'eauthentsent' => 'Sawijining layang élèktronik (e-mail) kanggo ndhedhes (konfirmasi) wis dikirim menyang alamat layang élèktronik panjenengan. Panjenengan kudu nuruti instruksi sajroning layang iku kanggo ndhedhes yèn alamat iku bener kagungané panjenengan. {{SITENAME}} ora bakal ngaktifaké fitur layang élèktronik yèn langkah iki durung dilakoni.',
-'throttled-mailpassword' => 'Sawijining pènget tembung sandi wis dikirim, jroning {{PLURAL:$1|jam|$1 jam}} pungkasan iki.
-Kanggo nyegah salah-guna, mung siji pènget tembung sandi waé sing bisa dikirim saben {{PLURAL:$1|jam|$1 jam}}.',
+'throttled-mailpassword' => 'Layang kanggo mbalèkaké tembung sandhi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.
+Kanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung sandhi sing bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.',
 'mailerror' => 'Kasalahan ing ngirimaké layang e-mail: $1',
 'acct_creation_throttle_hit' => 'Tamu ing wiki iki kanthi alamat IP sing padha karo panjenengan wis gawé {{PLURAL:$1|1 akun|$1 akun}} ing sadina pungkasan, nganti cacah maksimum sing diidinaké.
 Amarga saka kuwi., tamu kanthi alamat IP iki ora bisa gawé akun manèh kanggo sauntara iki.',
@@ -562,7 +562,7 @@ Panjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi saunta
 
 # Special:PasswordReset
 'passwordreset' => 'Balèni setèl tembung sandhi',
-'passwordreset-text' => 'Ganepi pormulir iki kanggo nampa pangéling layang èlèktronik kanggo rincian akun Sampéyan.',
+'passwordreset-text' => 'Jangkepi pormulir iki kanggo mbalèkaké tembung sandhiné Sampéyan.',
 'passwordreset-legend' => 'Balèni setèl tembung sandhi',
 'passwordreset-disabled' => 'Piranti kanggo mbalèni nyetèl tembung sandhi dipatèni nèng wiki iki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Lebokaké siji bagéyan data ngisor iki}}',
@@ -572,30 +572,23 @@ Panjengen manawa wis kasil ganti tembung sandi utawa nyuwun tembung sandi saunta
 'passwordreset-capture-help' => 'Yèn Sampéyan nyentang kothak iki, layang èlèktronik (mawa tembung sandhi sawetara) bakal ditampilaké nèng Sampéyan lan uga dikirim nèng panganggo.',
 'passwordreset-email' => 'Alamat layang èlèktronik:',
 'passwordreset-emailtitle' => 'Rincian akun nèng {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat
-detail akun untuk {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} berikut
-terkait dengan alamat surel ini:
+'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:
 
 $2
 
-{{PLURAL:$3|Sandi sementara|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|satu hari|$5 hari}}.
-Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
-permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
-ingin 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).
-{{PLURAL:$3|Akun|Akun-akun}} berikut terkait dengan alamat surel ini:
+{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.
+Sampé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:
 
 $2
 
-{{PLURAL:$3|Sandi sementara|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|satu hari|$5 hari}}.
-Anda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat
-permintaan ini atau jika Anda ingat sandi asli dan tidak lagi
-ingin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.',
+{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.
+Sampé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
 Tembung sandhi sawetara: $2',
-'passwordreset-emailsent' => 'Layang èlèktronik pangèling wis dikirim.',
-'passwordreset-emailsent-capture' => 'Layang èlèktronik pangèling wis dikirim kaya ngisor iki.',
-'passwordreset-emailerror-capture' => 'Layang èlèktronik pangèling ditampilaké nèng ngisor iki, nanging ora kasil dikirim: $1',
+'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 kanggo mbalèkaké tembung sandhi wis ditokaké, bisa didelok ngisor iki, nanging gagal nalika dikirim menyang panganggoné: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ganti alamat layang èlèktronik',
@@ -1057,7 +1050,7 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-interwiki-default' => 'Pituwas $1:',
 'search-interwiki-more' => '(luwih akèh)',
 'search-relatedarticle' => 'Kagandhèng',
-'mwsuggest-disable' => 'Patènana sugèsti AJAX',
+'mwsuggest-disable' => 'Tutup saka panemu-panemu ing golèk',
 'searcheverything-enable' => 'Golèki ing kabèh bilik-jeneng',
 'searchrelated' => 'kagandhèng',
 'searchall' => 'kabèh',
@@ -1077,15 +1070,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-external' => 'Panggolèkan èkstèrnal',
 'searchdisabled' => 'Sawetara wektu iki panjenengan ora bisa nggolèk mawa fungsi golèk {{SITENAME}}. Kanggo saiki mangga panjenengan bisa golèk nganggo Google. Nanging isi indèks Google kanggo {{SITENAME}} bisa waé lawas lan durung dianyari.',
 
-# Quickbar
-'qbsettings' => 'Pengaturan bar sidhatan',
-'qbsettings-none' => 'Ora ana',
-'qbsettings-fixedleft' => 'Tetep sisih kiwa',
-'qbsettings-fixedright' => 'Tetep sisih tengen',
-'qbsettings-floatingleft' => 'Ngambang sisih kiwa',
-'qbsettings-floatingright' => 'Ngambang sisih tengen',
-'qbsettings-directionality' => 'Wis pesthi, gumantung saka wujud skrip basané Sampéyan',
-
 # Preferences page
 'preferences' => 'Preferensi (pilihan)',
 'mypreferences' => 'Préferènsi',
@@ -1506,7 +1490,7 @@ Mangga priksa panyetèlan pangunggahan berkas.',
 'uploadjava' => 'Berkas kuwi berkas ZIP sing kaisi berkas .class Java.
 Ngungga berkas Java ora dililakaké amarga bisa nyebabaké ngluwèhaké wates kamanan.',
 'upload-source' => 'Berkas sumber',
-'sourcefilename' => 'Jeneng berkas sumber',
+'sourcefilename' => 'Jeneng berkas sumber:',
 'sourceurl' => 'URL sumber:',
 'destfilename' => 'Jeneng berkas sing dituju',
 'upload-maxfilesize' => 'Ukuran maksimal berkas: $1',
@@ -1623,7 +1607,6 @@ Kanggo kamanan paling apik, img_auth.php dipatèni.',
 'http-read-error' => 'Kasalahan maca HTTP.',
 'http-timed-out' => 'Panjalukan HTTP kliwat wates wektu.',
 'http-curl-error' => 'Kasalahan nalika njupuk URL: $1',
-'http-host-unreachable' => 'Ora bisa ngranggèh URL.',
 'http-bad-status' => 'Ana masalah nalika njaluk HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1781,6 +1764,12 @@ Priksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.',
 Mungkin kuduné diubungaké nèng kaca sing luwih pantes.<br />
 Kaca kaanggep kaca disambiguasi yèn kuwi nganggo templat sing kaubung saka [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Kaca-kaca mawa ubarampé',
+'pageswithprop-legend' => 'Kaca-kaca mawa ubarampé',
+'pageswithprop-text' => 'Kaca iki njlèntèhaké kaca-kaca sing nganggo ubarampé astamiwa.',
+'pageswithprop-prop' => 'Arané ubarampé:',
+'pageswithprop-submit' => 'Nuju',
+
 'doubleredirects' => 'Pangalihan dobel',
 'doubleredirectstext' => 'Kaca iki ngandhut daftar kaca sing ngalih ing kaca pangalihan liyané.
 Saben baris ngandhut pranala menyang pangalihan kapisan lan kapindho, sarta tujuan saka pangalihan kapindho, sing biasané kaca tujuan sing "sajatiné", yakuwi pangalihan kapisan kuduné dialihaké menyang kaca tujuan iku.
@@ -2029,8 +2018,8 @@ Owah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhè
 'notvisiblerev' => 'Révisi wis dibusak',
 'watchnochange' => 'Ora ana kaca ing daftar pangawasan panjenengan sing diowahi ing mangsa wektu sing dipilih.',
 'watchlist-details' => 'Ngawasaké {{PLURAL:$1|$1 kaca|$1 kaca}}, ora kalebu kaca-kaca dhiskusi.',
-'wlheader-enotif' => 'Notifikasi e-mail diaktifaké.',
-'wlheader-showupdated' => "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
+'wlheader-enotif' => 'Notifikasi e-mail diaktifaké.',
+'wlheader-showupdated' => "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
 'watchmethod-recent' => 'priksa daftar owah-owahan anyar kanggo kaca sing diawasi',
 'watchmethod-list' => 'priksa kaca sing diawasi kanggo owah-owahan anyar',
 'watchlistcontains' => 'Daftar pangawasan panjenengan isiné ana $1 {{PLURAL:$1|kaca|kaca}}.',
@@ -2783,6 +2772,7 @@ Mbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.',
 'pageinfo-robot-noindex' => 'Tidak dapat diindeks',
 'pageinfo-views' => 'Cacahing delokan',
 'pageinfo-watchers' => 'Cacahé pangawas kaca',
+'pageinfo-few-watchers' => 'Kurang seka $1 {{PLURAL:$1|wong tilik|wong tilik}}',
 'pageinfo-redirects-name' => 'Pengalihan ke halaman ini',
 'pageinfo-subpages-name' => 'Subhalaman halaman ini',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pengalihan|pengalihan}}; $3 {{PLURAL:$3|non-pengalihan|non-pengalihan}})',
@@ -2917,7 +2907,7 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Jembar',
 'exif-imagelength' => 'Dhuwur',
 'exif-bitspersample' => 'Bit per komponèn',
@@ -3095,7 +3085,7 @@ Pranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian
 'exif-originalimageheight' => 'Dhuwuré gambar sakdurungé dikethok',
 'exif-originalimagewidth' => 'Jembaré gambar sakdurungé dikethok',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ora dikomprèsi',
 'exif-compression-2' => 'CCITT Group 3 1-Dimensional Modified Huffman RLE',
 'exif-compression-3' => 'CCITT Group 3 fax encoding',
@@ -3495,13 +3485,6 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
 'version-entrypoints-header-entrypoint' => 'Tithik lebon',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Lokasi berkas',
-'filepath-page' => 'Berkas:',
-'filepath-submit' => 'Golèk',
-'filepath-summary' => 'Kaca astaméwa utawa kusus iki nuduhaké jalur pepak sawijining berkas.
-Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka langsung mawa program kagandhèng.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Golèk berkas duplikat',
 'fileduplicatesearch-summary' => 'Golèk duplikat berkas adhedhasar biji hash-é.',
@@ -3595,9 +3578,9 @@ Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka lan
 'sqlite-no-fts' => '$1 tanpa sengkuyungan golèkan tèks jangkep',
 
 # New logging system
-'logentry-delete-delete' => '$1 mbusak kaca $3',
-'logentry-delete-restore' => '$1 mbalèkaké kaca $3',
-'logentry-delete-event' => '$1 ngganti patampilan {{PLURAL:$5|sak kadadéan log|$5 kadadéan log}} nèng $3: $4',
+'logentry-delete-delete' => '$1 {{GENDER:$2|mbusak}} kaca $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|mbalèkaké}} kaca $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ngganti}} parupané {{PLURAL:$5|sak prastawa log|$5 prastawa log}} ana ing $3: $4',
 'logentry-delete-revision' => '$1 ngganti patampilan {{PLURAL:$5|sak pambenahan|$5 pambenahan}} nèng kaca $3: $4',
 'logentry-delete-event-legacy' => '$1 ngganti patampilan saka kadadéan log nèng $3',
 'logentry-delete-revision-legacy' => '$1 ngganti patampilan saka pambenahan nèng kaca $3',
@@ -3618,7 +3601,7 @@ Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka lan
 'logentry-move-move-noredirect' => '$1 mindhahaké kaca $3 nèng $4 tanpa nginggalaké pangalihan',
 'logentry-move-move_redir' => '$1 mindhahaké kaca $3 nèng $4 ngliwati pangalihan',
 'logentry-move-move_redir-noredirect' => '$1 mindhahaké kaca $3 nèng $4 ngliwati pangalihan tanpa nginggalaké pangalihan',
-'logentry-patrol-patrol' => '$1 nandhai benahan $4 saka kaca $3 kaawasi',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|nengeri}} rèvisi $4 saka kaca $3 sing diawasi',
 'logentry-patrol-patrol-auto' => '$1 otomatis nandhai benahan $4 saka kaca $3 kaawasai',
 'logentry-newusers-newusers' => 'Akun panganggo $1 digawé',
 'logentry-newusers-create' => 'Akun panganggo $1 digawé',
@@ -3703,4 +3686,7 @@ Utawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal
 'duration-centuries' => '$1 {{PLURAL:$1|abad|abad}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milénium|milénium}}',
 
+# Image rotation
+'rotate-comment' => 'Gambar diubengaké $1 {{PLURAL:$1|drajat|drajat}} sak arah domé jam',
+
 );
index d012011..9278429 100644 (file)
@@ -16,6 +16,7 @@
  * @author ITshnik
  * @author Kaganer
  * @author Malafaya
+ * @author Nemo bis
  * @author Nodar Kherkheulidze
  * @author Reedy
  * @author Sopho
@@ -197,8 +198,6 @@ $messages = array(
 'tog-shownumberswatching' => 'მაკონტროლებელ მომხმარებელთა რიცხვის ჩვენება',
 'tog-oldsig' => 'არსებული ხელმოწერა:',
 'tog-fancysig' => 'საკუთარი ვიკიფორმატიანი ხელმოწერა (ავტომატური ბმულის გარეშე)',
-'tog-externaleditor' => 'გამოიყენეთ გარე რედაქტორი სტანდარტული ფორმით (მხოლოდ ექსპერტებისთვის, მოითხოვს სპეციალურ კონფიგურაციას თქვენს კომპიუტერში. [//www.mediawiki.org/wiki/Manual:External_editors ვრცლად.])',
-'tog-externaldiff' => 'გამოიყენეთ გარე განსხვავება სტანდარტული ფორმით (მხოლოდ ექსპერტთათვის, მოითხოვს სპეციალურ კონფიგურაციას თქვენს კომპიუტერში. [//www.mediawiki.org/wiki/Manual:External_editors ვრცლად.])',
 'tog-showjumplinks' => 'დამხმარე ბმულების „გადასვლა-კენ“ ჩართვა',
 'tog-uselivepreview' => 'გამოიყენეთ ახალი წინასწარი გადახედვა (ჯავასკრიპტი)  (ექსპერიმენტული)',
 'tog-forceeditsummary' => 'გამაფრთხილე ცარიელი რედაქტირების რეზიუმეს შემთხვევაში',
@@ -213,6 +212,7 @@ $messages = array(
 'tog-showhiddencats' => 'დამალული კატეგორიების ჩვენება',
 'tog-noconvertlink' => 'სათაურის გარდაქმნის ბმულის გამორთვა',
 'tog-norollbackdiff' => 'გამოტოვეთ ცვლილება გაუქმებისას',
+'tog-useeditwarning' => 'გამაფრთხილე, როდესაც დავტოვებ რედაქტირებად გვერდს, დაუმახსოვრებელი ცვლილებებით',
 
 'underline-always' => 'მუდამ',
 'underline-never' => 'არასდროს',
@@ -276,6 +276,18 @@ $messages = array(
 '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 დეკემბერი',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|კატეგორია|კატეგორიები}}',
@@ -592,9 +604,18 @@ $2',
 'welcomecreation-msg' => 'თქვენი ანგარიში შექმნილია.
 არ დაგავიწყდეთ თქვენი [[Special:Preferences|{{SITENAME}}-ის კონფიგურაციის]] შეცვლა.',
 'yourname' => 'მომხმარებელი:',
+'userlogin-yourname' => 'მომხმარებლის სახელი',
+'userlogin-yourname-ph' => 'შეიყვანეთ თქვენი მომხმარებლის სახელი',
 'yourpassword' => 'პაროლი:',
+'userlogin-yourpassword' => 'პაროლი',
+'userlogin-yourpassword-ph' => 'შეიყვანეთ თქვენი პაროლი',
+'createacct-yourpassword-ph' => 'შეიყვანეთ პაროლი',
 'yourpasswordagain' => 'ხელმეორედ შეიყვანეთ პაროლი',
+'createacct-yourpasswordagain' => 'დაადასტურეთ პაროლი',
+'createacct-yourpasswordagain-ph' => 'ხელმეორედ შეიყვანეთ პაროლი',
 'remembermypassword' => 'დამიმახსოვრე ამ კომპიუტერზე (მაქსიმუმ $1 {{PLURAL:$1|დღე}})',
+'userlogin-remembermypassword' => 'დამიმახსოვრე',
+'userlogin-signwithsecure' => 'უსაფრთხო კავშირის გამოყენება',
 'securelogin-stick-https' => 'გააგრძელეთ კავშირი HTTPS-თან შესვლის შემდეგ',
 'yourdomainname' => 'თქვენი დომენი',
 'password-change-forbidden' => 'თქვენ არ შეგიძლიათ ამ ვიკიში პაროლის შეცვლა.',
@@ -607,14 +628,21 @@ $2',
 'logout' => 'გასვლა',
 'userlogout' => 'გასვლა',
 'notloggedin' => 'შესული არ ხართ',
+'userlogin-noaccount' => 'არ გაქვთ ანგარიში?',
+'userlogin-joinproject' => 'შეუერთდით პროექტს {{SITENAME}}',
 'nologin' => "ჯერ არ ხართ რეგისტრირებული? '''$1'''.",
 'nologinlink' => 'გახსენით ანგარიში',
 'createaccount' => 'გახსენი ანგარიში',
 'gotaccount' => "უკვე რეგისტრირებული ხართ? '''$1'''",
 'gotaccountlink' => 'შესვლა',
 'userlogin-resetlink' => 'ავტორიზაციის მონაცემები დაგავიწყდათ?',
+'userlogin-resetpassword-link' => 'პაროლის მოცილება',
 'createaccountmail' => 'გამოიყენეთ შემთხვევითობის მეთოდით შერჩეული დროებითი პაროლი და მისი გაგზავნა ქვემოთ მითითებულ ელ. ფოსტის მისამართზე:',
 'createaccountreason' => 'მიზეზი:',
+'createacct-submit' => 'შექმენით თქვენი ანგარიში',
+'createacct-benefit-heading' => '{{SITENAME}} შექმნილია თქვენნაირი ადამიანების მიერ.',
+'createacct-benefit-body1' => '{{PLURAL:$1|რედაქტირება|რედაქტირება}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|გვერდი|გვერდი}}',
 'badretype' => 'თქვენს მიერ შეყვანილი პაროლები ერთმანეთს არ ემთხვევა.',
 'userexists' => 'ეს სახელი უკვე გამოყენებულია.
 გთხოვთ, აირჩიეთ სხვა.',
@@ -659,9 +687,8 @@ $2',
 'eauthentsent' => 'დამადასტურებელი შეტყობინება გაიგზავნა თქვენს მიერ მითითებულ ელ. ფოსტის მისამართზე.
 სანამ ნებისმიერი სხვა შეტყობინება გაიგზავნებოდეს თქვენს ანგარიშზე, გთხოვთ მიჰყვეთ ელ.
 ფოსტაში მითითებულ ინსტრუქციებს, რათა დაადასტუროთ რომ ანგარიში ნამდვილად თქვენია.',
-'throttled-mailpassword' => 'პაროლის შეხსენება უკვე გაგზავნილია ბოლო $1 საათის განმავლობაში.
-ბოროტად გამოყენების თავიდან აცილებისთვის, მხოლოდ ერთი შეხსენება იგზავნება ყოველ
-$1 საათში.',
+'throttled-mailpassword' => 'პაროლის შეხსენება უკვე გაგზავნილია ბოლო {{PLURAL:$1|საათის|$1 საათის}} განმავლობაში.
+ბოროტად გამოყენების თავიდან აცილებისთვის, მხოლოდ ერთი შეხსენება იგზავნება ყოველ {{PLURAL:$1|საათში|$1 საათში}}.',
 'mailerror' => 'შეცდომა ფოსტის გაგზავნაში: $1',
 'acct_creation_throttle_hit' => '24 საათის განმავლობაში თქვენი IP-მისამართითან {{PLURAL:$1|შეიქმნა $1 ანგარიში|შეიქმნა $1 ანგარიშები|შეიქმნა $1 ანგარიშის}}, რაც არის აკრძალული დროის ამ მონაკვეთისთის.
 აქედან გამომდინარე თქვენი IP-მისამართის მქონე მომხმარებლები ვეღარ შექმნიან ანგარიშები.',
@@ -711,10 +738,8 @@ $1 საათში.',
 
 # Special:PasswordReset
 'passwordreset' => 'პაროლის აღდგენა',
-'passwordreset-text' => 'შეავსეთ ეს ფორმა, რათა ელ.ფოსტით მიიღოთ შეხსენება თქვენი ანგარიშის პარამეტრების შესახებ.',
 'passwordreset-legend' => 'პაროლის აღდგენა',
 'passwordreset-disabled' => 'ამ ვიკიში პაროლის კვლავ დაყენების ფუნქცია გამორთულია.',
-'passwordreset-pretext' => '{{PLURAL:$1||შეიყვანეთ ქვემოთ მოცემულ მონაცემთა ერთ-ერთი ნაწილი.}}',
 'passwordreset-username' => 'მომხმარებლის სახელი:',
 'passwordreset-domain' => 'დომენი:',
 'passwordreset-capture' => 'გამოსული ელ-ფოსტის ხილვა?',
@@ -722,32 +747,32 @@ $1 საათში.',
 'passwordreset-email' => 'ელ. ფოსტის მისამართი:',
 'passwordreset-emailtitle' => 'ანგარიშის მონაცემები {{SITENAME}}-თვის',
 'passwordreset-emailtext-ip' => 'ვიღაცამ (შესაძლოა თქვენ, ამ IP-მისამართიდან $1) მოითხოვა თქვენი 
\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98á\83¡ á\83\93á\83\94á\83¢á\83\90á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83®á\83¡á\83\94á\83\9cá\83\94á\83\91á\83\90 {{SITENAME}}-á\83\97á\83\95á\83\98á\83¡ ($4).
\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\97á\83\90á\83\95á\83\98á\83\93á\83\90á\83\9c á\83\93á\83\90á\83§á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83¡á\83\90á\83\98á\83¢á\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡ {{SITENAME}} ($4).
 {{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:
 
 $2
 
-{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|$5 დღე}}.
+{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.
 თქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.
 თუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი
 და აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას
 და გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.',
 'passwordreset-emailtext-user' => 'მომხმარებელმა $1 პროექტიდან {{SITENAME}} მოითხოვა თქვენი 
\83\90á\83\9cá\83\92á\83\90á\83 á\83\98á\83¨á\83\98á\83¡ á\83\93á\83\94á\83¢á\83\90á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83®á\83¡á\83\94á\83\9cá\83\94á\83\91á\83\90 {{SITENAME}}-á\83\97á\83\95á\83\98á\83¡ ($4).
\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\97á\83\90á\83\95á\83\98á\83\93á\83\90á\83\9c á\83\93á\83\90á\83§á\83\94á\83\9cá\83\94á\83\91á\83\90 á\83¡á\83\90á\83\98á\83¢á\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡ {{SITENAME}} ($4).
 {{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:
 
 $2
 
-{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|$5 დღე}}.
+{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.
 თქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.
 თუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი
 და აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას
 და გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.',
 'passwordreset-emailelement' => 'მომხმარებლის სახელი: $1
 დროებითი პაროლი: $2',
-'passwordreset-emailsent' => 'á\83¨á\83\94á\83¡á\83\90á\83®á\83¡ენებელი ელ.ფოსტა გაიგზავნა.',
-'passwordreset-emailsent-capture' => 'á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83\9cá\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\98 á\83¨á\83\94á\83¡á\83\90á\83®á\83¡ენებელი წერილი გაიგზავნა.',
-'passwordreset-emailerror-capture' => 'á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83\9bá\83\9dá\83ªá\83\94á\83\9bá\83£á\83\9aá\83\98á\83\90 á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\98á\83\9aá\83\98 á\83¨á\83\94á\83¡á\83\90á\83®á\83¡á\83\94á\83\9cá\83\94á\83\91á\83\94á\83\9aá\83\98 á\83¬á\83\94á\83 á\83\98á\83\9aá\83\98, á\83 á\83\9dá\83\9bá\83\9aá\83\98á\83¡ á\83\92á\83\90á\83\92á\83\96á\83\90á\83\95á\83\9cá\83\90á\83ª ვერ მოხერხდა: $1 გამო',
+'passwordreset-emailsent' => 'á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\97á\83\90á\83\95á\83\98á\83\93á\83\90á\83\9c á\83\93á\83\90á\83¡á\83\90á\83§ენებელი ელ.ფოსტა გაიგზავნა.',
+'passwordreset-emailsent-capture' => 'á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83\9cá\83\90á\83©á\83\95á\83\94á\83\9cá\83\94á\83\91á\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\97á\83\90á\83\95á\83\98á\83\93á\83\90á\83\9c á\83\93á\83\90á\83¡á\83\90á\83§ენებელი წერილი გაიგზავნა.',
+'passwordreset-emailerror-capture' => 'á\83¥á\83\95á\83\94á\83\9bá\83\9dá\83\97 á\83\9bá\83\9dá\83ªá\83\94á\83\9bá\83£á\83\9aá\83\98á\83\90 á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\98á\83\9aá\83\98 á\83\9eá\83\90á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83\93á\83\90á\83¡á\83\90á\83§á\83\94á\83\9cá\83\94á\83\91á\83\94á\83\9aá\83\98 á\83¬á\83\94á\83 á\83\98á\83\9aá\83\98, á\83 á\83\9dá\83\9bá\83\9aá\83\98á\83¡ á\83\92á\83\90á\83\92á\83\96á\83\90á\83\95á\83\9cá\83\90á\83ª {{GENDER:$2|á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\97á\83\90á\83\9c}} ვერ მოხერხდა: $1 გამო',
 
 # Special:ChangeEmail
 'changeemail' => 'ელ-ფოსტის მისამართის შეცვლა',
@@ -960,12 +985,15 @@ $2
 შესაძლოა, იგი წაიშალა.',
 'edit-conflict' => 'რედაქციების კონფლიქტი.',
 'edit-no-change' => 'თქვენი შესწორება არ იქნა შენახული, რადგანაც ტექსტის ცვლილება არ მოხდა.',
+'postedit-confirmation' => 'თქვენი რედაქტირება შენახულია.',
 'edit-already-exists' => 'ახალი გვერდის შექმნა არ მოხერხდა.
 ის უკვე არსებობს.',
 'defaultmessagetext' => 'შეტყობინების სტანდარტული ტექსტი',
 'content-failed-to-parse' => '$2-ის შინაარსი არ შეესაბამება $1-ის ტიპს: $3.',
 'invalid-content-data' => 'დაუშვებელი მონაცემები',
 'content-not-allowed-here' => '„$1“-ის შინაარსი დაუშვებელია [[$2]] გვერდზე',
+'editwarning-warning' => 'სხვა გვერდზე გადასვლამ შესაძლოა გამოიწვიოს ცვლილებების დაკარგვა.
+თუკი თქვენ დარეგისტრირებული ხართ სისტემაში, მაში შეგიძლიათ გამორთოთ ეს გაფრთხილება „{{int:prefs-editing}}“ თქვენი კონფიგურაციის განყოფილებაში.',
 
 # Content models
 'content-model-wikitext' => 'ვიკიტექსტი',
@@ -1249,15 +1277,6 @@ $1",
 'search-external' => 'გარე ძიება',
 'searchdisabled' => '{{SITENAME}}ში ძებნა გაუქმებულია. თქვენ შეგიძლიათ დროის შუალედით Google-ით ძებნა. მიაქციეთ ყურადღება, რომ {{SITENAME}}ში შესაძლებელია მათი ინდექსები აქტუალური არ არის.',
 
-# Quickbar
-'qbsettings' => 'სწრაფი ზოლი',
-'qbsettings-none' => 'არაფერი',
-'qbsettings-fixedleft' => 'ფიქსირებული მარცხნივ',
-'qbsettings-fixedright' => 'ფიქსირებული მარჯვნივ',
-'qbsettings-floatingleft' => 'მარცხნივ მცურავი',
-'qbsettings-floatingright' => 'მარჯვნივ მცურავი',
-'qbsettings-directionality' => 'ფიქსირებული, დამოკიდებული თქვენი ენის წერილობით მიმართულებაზე',
-
 # Preferences page
 'preferences' => 'კონფიგურაცია',
 'mypreferences' => 'კონფიგურაცია',
@@ -1802,7 +1821,6 @@ $1',
 'http-read-error' => 'HTTP წაკითხვის შეცდომა.',
 'http-timed-out' => 'HTTP მოთხოვნის დრო გავიდა.',
 'http-curl-error' => 'შეცდომა URL: $1-ის მოთხოვნისას',
-'http-host-unreachable' => 'URL მიუწვდომელია',
 'http-bad-status' => 'HTTP მოთხოვნისას აღმოჩენილია შეცდომა - $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1961,6 +1979,9 @@ $1',
 ამის ნაცვლად, სავარაუდოდ, ისისნი უნდა მიუთითებდნენ შესაბამის კონკრეტულ სტატიაზე.<br />
 გვერდი ითვლება მრავამნიშვნელოვნად, თუ მასში განთავსებულია თარგი, რომლის სახელიც მითითებულია გვერდზე [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'გვერდები განსაზღვრული თვისებით',
+'pageswithprop-legend' => 'გვერდები განსაზღვრული თვისებით',
+'pageswithprop-text' => 'აქ მოცემულია გვერდები, რომელთაც ხელით განესაზღვრათ გარკვეული თვისებები.',
 'pageswithprop-prop' => 'თვისების სახელი:',
 'pageswithprop-submit' => 'მიდი',
 
@@ -2019,7 +2040,7 @@ $1',
 'mostimages' => 'ყველაზე მეტი ბმულების მქონე ფაილები',
 'mostinterwikis' => 'ყველაზე მეტი ინტერვიკის მქონე სტატია',
 'mostrevisions' => 'ყველაზე მეტად რედაქტირებული სტატიები',
-'prefixindex' => 'á\83§á\83\95á\83\94á\83\9aá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 (á\83\97á\83\90á\83\95á\83¡á\83\90á\83 á\83\97ით)',
+'prefixindex' => 'á\83§á\83\95á\83\94á\83\9aá\83\90 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 (á\83\9eá\83 á\83\94á\83¤á\83\98á\83¥á\83¡ით)',
 'prefixindex-namespace' => 'ყველა პრეფიქსიანი გვერდი ($1 სახელთა სივრცე)',
 'shortpages' => 'მოკლე გვერდები',
 'longpages' => 'გრძელი გვერდები',
@@ -2088,7 +2109,7 @@ $1',
 'allpagesprev' => 'წინა',
 'allpagesnext' => 'შემდეგი',
 'allpagessubmit' => 'ჩვენება',
-'allpagesprefix' => 'á\83\90á\83¡á\83\90á\83®ე გვერდები პრეფიქსით:',
+'allpagesprefix' => 'á\83\90á\83©á\83\95á\83\94á\83\9cე გვერდები პრეფიქსით:',
 'allpagesbadtitle' => 'მოცემული გვერდის სათაური არასწორია ან აქვს ინტერვიკი ან ნათშორისი პრეფიქსი. იგი შესაძლოა შეიცავდეს ერთ ან მეტ სიმბოლოს, რომელიც არ შეიძლება გამოყენებულ იქნას სათაურში.',
 'allpages-bad-ns' => '{{SITENAME}} "$1" არ აქვს სახელთა სივრცე.',
 'allpages-hide-redirects' => 'გადამისამართებების დამალვა',
@@ -2219,8 +2240,8 @@ $1',
 'notvisiblerev' => 'შესწორება წაშლილია',
 'watchnochange' => 'არც ერთი თქვენი კონტროლის ქვეშ მყოფი ერთეული არ იქნა რედაქტირებული ნაჩვენებ დროში.',
 'watchlist-details' => '$1 გვერდია თქვენი კონტროლის სიაში განხილვის გვერდების ჩაუთვლელად.',
-'wlheader-enotif' => 'ელ. ფოსტით შეტყობინება ჩართულია.',
-'wlheader-showupdated' => 'გვერდები, რომლებშიც შეტანილ იქნა ცვლილებები თქვენი ბოლო ვიზიტის შემდეგ, აღნიშნულია მუქად.',
+'wlheader-enotif' => 'ელ. ფოსტით შეტყობინება ჩართულია.',
+'wlheader-showupdated' => 'გვერდები, რომლებშიც შეტანილ იქნა ცვლილებები თქვენი ბოლო ვიზიტის შემდეგ, აღნიშნულია მუქად.',
 'watchmethod-recent' => 'მიმდინარეობს უახლესი შესწორებების შემოწმება კონტროლის ქვეშ მყოფი გვერდების მიხედვით.',
 'watchmethod-list' => 'მიმდინარეობს თქვენი კონტროლის ქვეშ მყოფი გვერდების შემოწმება უახლესი შესწორებების მიხედვით.',
 'watchlistcontains' => 'თქვენი კონტროლის სია შეიცავს $1 გვერდს.',
@@ -2635,6 +2656,7 @@ $1',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'თქვენი IP-მისამართი მიჩნევა ღია პროქსიდ DNSBL-ის თანახმად.',
 'sorbs_create_account_reason' => 'თქვენი IP-მისამართი ითვლება ღია პროქსიდ DNSBL-ის ანახმად. თქვენ ვერ შექმნით ანგარიშს.',
+'xffblockreason' => 'დაიბლოკა IP-მისამართი, რომელიც იმყოფებოდა X-Forwarded-For-ის სათაურში და რომელიც გეკუთვნით თქვენ ან თქვენ მიერ გამოყენებულ პროქსი-სერვერს. დაბლოკვის თავდაპირველი მიზეზი იყო: $1',
 'cant-block-while-blocked' => 'თქვენ ვერ დაბლოკავთ სხვა მომხმარებლებს, რადგანაც თავად ხართ დაბლოკილი.',
 'cant-see-hidden-user' => 'მომხმარებელი, რომლის დაბლოკვასაც ცდილოთ, უკვე დაბლოკილია და დამალულია. რადგანაც თქვენ არ გაქვთ დამალულ მომხმარებლებთან მუშაობის ნებართვა, თქვენ ვერ შეცვლით ამ ბლოკს.',
 'ipbblocked' => 'თქვენ ვერ დაბლოკავთ ან მოხსნით ბლოკს სხვა მომხმარებლებს, რადგანაც თავად ხართ დაბლოკილი.',
@@ -2939,13 +2961,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/** აქ ჩასმული CSS გამოყენებული იქნება გაფორმების ყველა გარეკანზე */',
-'standard.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება სტანდარტული გაფორმების თემაში */',
-'nostalgia.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება ნოსტალგიური გაფორმების თემაში */',
 'cologneblue.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება კელნის ლურჯი გაფორმების თემაში */',
 'monobook.css' => '/* აქ ჩასმული CSS გავლენას იქონიებს Monobook ინტერფეისის მომხმარებლებზე */',
-'myskin.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება ჩემი იერსახის გაფორმების თემაში */',
-'chick.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება წიწილის გაფორმების თემაში */',
-'simple.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება მარტივი გაფორმების თემაში */',
 'modern.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება თანამედროვე გაფორმების თემაში */',
 'vector.css' => '/* აქ ჩასმული CSS გამოყენებული იქნება ვექტორული გაფორმების თემაში */',
 'group-autoconfirmed.css' => '/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ავტომატურად დადასტურებული მომხმარებლებისათვის */',
@@ -3029,13 +3046,8 @@ $1',
 'pageinfo-category-files' => 'ფაილების რაოდენობა',
 
 # Skin names
-'skinname-standard' => 'კლასიკური',
-'skinname-nostalgia' => 'ნოსტალგია',
 'skinname-cologneblue' => 'კელნის ლურჯი',
 'skinname-monobook' => 'მონობუკი',
-'skinname-myskin' => 'საკუთარი',
-'skinname-chick' => 'წიწილა',
-'skinname-simple' => 'მარტივი',
 'skinname-modern' => 'თანამედროვე',
 'skinname-vector' => 'ვექტორული',
 
@@ -3120,11 +3132,25 @@ $1',
 'minutes' => '$1 წუთის',
 'hours' => '$1 საათის',
 'days' => '$1 დღის',
+'weeks' => '{{PLURAL:$1|$1 კვირა|$1 კვირა}}',
 'months' => '{{PLURAL:$1|$1 თვე|$1 თვე}}',
 'years' => '{{PLURAL:$1|$1 წელი|$1 წელი}}',
 'ago' => '$1 წინ',
 'just-now' => 'ახლახანს',
 
+# Human-readable timestamps
+'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-ზე',
+
 # Bad image list
 'bad_image_list' => 'ფორმატი შემდეგია:
 
@@ -3155,7 +3181,7 @@ $1',
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'სიგანე',
 'exif-imagelength' => 'სიმაღლე',
 'exif-bitspersample' => 'ფერის კომპონენტთა სიღრმე',
@@ -3348,7 +3374,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'შეუკუმშავი',
 'exif-compression-2' => 'CCITT Group 3, ჰაფმანის სერიის სიგრძის კოდირების 1-განზომილებიანი მოდიფიკაცია',
 'exif-compression-3' => 'CCITT Group 3 ფაქსის კოდირება',
@@ -3823,11 +3849,10 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath გზა სტატიისაკენ]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath გზა სკრიპტისაკენ]',
 
-# Special:FilePath
-'filepath' => 'გზა ფაილისდამი',
-'filepath-page' => 'ფაილი:',
-'filepath-submit' => 'წავიდა',
-'filepath-summary' => 'მოცემული სპეცგვერდი აბრუნებს ზუსტ გზას ფაილისდამი იმ სახით, რომლითაც იგი დისკზეა შენახული',
+# Special:Redirect
+'redirect-submit' => 'მიდი',
+'redirect-user' => 'მომხმარებლის იდენტიფიკატორი',
+'redirect-file' => 'ფაილის სახელი',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ერთნაირი ფაილების ძიება',
@@ -3915,23 +3940,26 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'htmlform-submit' => 'შენახვა',
 'htmlform-reset' => 'ცვლილებების გაუქმება',
 'htmlform-selectorother-other' => 'სხვა',
+'htmlform-no' => 'არა',
+'htmlform-yes' => 'დიახ',
+'htmlform-chosen-placeholder' => 'აირჩიეთ პარამეტრი',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 სრული ტექსტის ძიების მხარდაჭერით',
 'sqlite-no-fts' => '$1 სრული ტექსტის ძიების მხარდაჭერის გარეშე',
 
 # New logging system
-'logentry-delete-delete' => 'მომხმარებელმა $1 წაშალა გვერდი: „$3“',
-'logentry-delete-restore' => '$1 აღადგინა გვერდი $3',
-'logentry-delete-event' => '$1 შეცვალა {{PLURAL:$5|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4',
-'logentry-delete-revision' => '$1 შეცვალა {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა გვერდისათვის $3: $4',
-'logentry-delete-event-legacy' => '$1 შეცვალა ჩანაწერების ჟურნალის ხილვადობა $3-ზე',
-'logentry-delete-revision-legacy' => '$1 შეცვალა რედაქტირების კომენტარი გვერდზე $3',
-'logentry-suppress-delete' => '$1 ჩაახშო $3 გვერდი',
-'logentry-suppress-event' => '$1 ფარულად შეცვალა {{PLURAL:$5|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4',
-'logentry-suppress-revision' => '$1 ფარულად შეცვალა {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა $3 გვერდზე: $4',
-'logentry-suppress-event-legacy' => '$1 ფარულად შეცვალა $3 ჩანაწერების ჟურნალის ხილვადობა',
-'logentry-suppress-revision-legacy' => '$1 ფარულად შეცვალა ვერსიის ხილვადობა $3 გვერდზე',
+'logentry-delete-delete' => 'მომხმარებელმა $1 {{GENDER:$2|წაშალა}} გვერდი: „$3“',
+'logentry-delete-restore' => 'მომხმარებელმა $1 {{GENDER:$2|აღადგინა}} გვერდი $3',
+'logentry-delete-event' => 'მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4',
+'logentry-delete-revision' => 'მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა გვერდისათვის $3: $4',
+'logentry-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|ჟურნალის ჩანაწერის|$5 ჟურნალის ჩანაწერების}} ხილვადობა $3-ზე: $4',
+'logentry-suppress-revision' => 'მომხმარებელმა $1 ფარულად {{GENDER:$2|შეცვალა}} {{PLURAL:$5|$5 ვერსიის|$5 ვერსიის}} ხილვადობა $3 გვერდზე: $4',
+'logentry-suppress-event-legacy' => 'მომხმარებელმა $1 ფარულად {{GENDER:$2|შეცვალა}} $3 ჩანაწერების ჟურნალის ხილვადობა',
+'logentry-suppress-revision-legacy' => 'მომხმარებელმა $1 ფარულად {{GENDER:$2|შეცვალა}} ვერსიის ხილვადობა $3 გვერდზე',
 'revdelete-content-hid' => 'შინაარსი დამალულია',
 'revdelete-summary-hid' => 'რედაქტირების აღწერა დამალულია',
 'revdelete-uname-hid' => 'მომხმარებლის სახელი დაფარულია',
@@ -3940,20 +3968,20 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'revdelete-uname-unhid' => 'მომხმარებლის სახელი გახსნილია',
 'revdelete-restricted' => 'შეზღუდვა ადმინისტრატორთათვის',
 'revdelete-unrestricted' => 'ადმინისტრატორთათვის შეზღუდვები მოხსნილია',
-'logentry-move-move' => 'მომხმარებელმა $1 გვერდი „$3“ გადაიტანა გვერდზე „$4“',
-'logentry-move-move-noredirect' => 'მომხმარებელმა $1 გვერდი „$3“ გადაიტანა გვერდზე „$4“ გადამისამართების დატოვების გარეშე',
-'logentry-move-move_redir' => 'მომხმარებელმა $1 გვერდი „$3“ გადაიტანა გვერდზე „$4“ გადამისამართებაზე',
-'logentry-move-move_redir-noredirect' => '$1 გადაიტანა გვერდი $3 $4-ში გადამისამართების დატოვების გარეშე',
-'logentry-patrol-patrol' => '$1 გააკეთა გვერდის „$3“ $4 ვერსიის პატრულირება',
-'logentry-patrol-patrol-auto' => '$1 ავტომატურად გააკეთა გვერდის „$3“ $4 ვერსიის პატრულირება',
-'logentry-newusers-newusers' => 'მომხმარებლის ანგარიში $1 შექმნილია',
-'logentry-newusers-create' => 'შეიქმნა მომხმარებლის ანგარიში $1',
-'logentry-newusers-create2' => 'მომხმარებლის ანგარიში $3 შექმნა მომხმარებელმა $1',
-'logentry-newusers-byemail' => 'მომხმარებლის ანგარიში $3 შექმნა მომხმარებელმა $1 და პაროლი გაგზავნა ელ. ფოსტით',
-'logentry-newusers-autocreate' => 'ავტომატურად შეიქმნა მომხმარებლის ანგარიში $1',
-'logentry-rights-rights' => '$1 შეცვალა ჯგუფის წევრობა $3-თვის $4-დან $5-ზე',
-'logentry-rights-rights-legacy' => '$1 შეცვალა ჯგუფის წევრობა $3-თვის',
-'logentry-rights-autopromote' => '$1 ავტომატურად იქნა გადაყვანილი $4–დან $5–ში',
+'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“ გადამისამართებაზე',
+'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 ვერსიის პატრულირება',
+'logentry-newusers-newusers' => 'მომხმარებლის ანგარიში $1 {{GENDER:$2|შექმნილია}}',
+'logentry-newusers-create' => '{{GENDER:$2|შეიქმნა}} მომხმარებლის ანგარიში $1',
+'logentry-newusers-create2' => 'მომხმარებლის ანგარიში $3 {{GENDER:$2|შექმნა}} მომხმარებელმა $1',
+'logentry-newusers-byemail' => 'მომხმარებლის ანგარიში $3 {{GENDER:$2|შექმნა}} მომხმარებელმა $1 და პაროლი გაგზავნა ელ. ფოსტით',
+'logentry-newusers-autocreate' => 'ავტომატურად {{GENDER:$2|შეიქმნა}} მომხმარებლის ანგარიში $1',
+'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–ში',
 'rightsnone' => '(არცერთი)',
 
 # Feedback
@@ -4029,4 +4057,7 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'duration-centuries' => '$1 {{PLURAL:$1|საუკუნე|საუკუნე}}',
 'duration-millennia' => '$1 {{PLURAL:$1|ათასწლეული|ათასწლეული}}',
 
+# Image rotation
+'rotate-comment' => 'სურათი მოტრიალებულია $1 {{PLURAL:$1|გრადუსით|გრადუსით}} საათის ისრის მიმართულებით',
+
 );
index 37e4005..0555201 100644 (file)
@@ -180,8 +180,6 @@ $messages = array(
 'tog-enotifrevealaddr' => "Eskertiw xatlarında e-mail adresimdi ko'rset",
 'tog-shownumberswatching' => "Baqlag'an paydalanıwshılar sanın ko'rset",
 'tog-fancysig' => 'İmzalardı wikitext dep qabıl etiw (avtomat siltewsiz)',
-'tog-externaleditor' => "Defolt boyınsha sırtqı o'zgertiwshini qollan (tek g'ana ta'jiriybeli paydalanıwshılar ushın, kompyuterin'izde qosımsha sazlawlar qılınıwı kerek. [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-externaldiff' => "Defoltta sırtqı parqtı qollan (tek ekspert paydalanıwshılar ushın, kompyuterin'izde arnawlı sazlawlardı talap etedi. [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
 'tog-showjumplinks' => "«O'tip ketiw» siltewlerin qos",
 'tog-uselivepreview' => "Janlı ko'rip shıg'ıwdı qollan (JavaScript) (Sınawda)",
 'tog-forceeditsummary' => "O'zgertiw juwmag'ı bos qalg'anda mag'an eskert",
@@ -863,14 +861,6 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
 'powersearch-field' => "İzlenetug'ın so'z (yamasa so'z dizbegi):",
 'search-external' => 'Sırtqı izlewshi',
 
-# Quickbar
-'qbsettings' => 'Navigatsiya paneli',
-'qbsettings-none' => 'Hesh qanday',
-'qbsettings-fixedleft' => 'Shepke bekitilgen',
-'qbsettings-fixedright' => "On'g'a bekitilgen",
-'qbsettings-floatingleft' => 'Shepte jıljıwshı',
-'qbsettings-floatingright' => "On'da jıljıwshı",
-
 # Preferences page
 'preferences' => 'Sazlawlar',
 'mypreferences' => "Menin' sazlawlarım",
@@ -1412,7 +1402,7 @@ Eger siz bul betti baqlaw dizimin'izden o'shirmekshi bolsan'ız bettin' joqarg'
 'notanarticle' => "Mag'lıwmat beti emes",
 'notvisiblerev' => "Nusqa o'shirildi",
 'watchlist-details' => "Baqlaw dizimin'izde (sa'wbet betlerin esapqa almag'anda) {{PLURAL:$1|1 bet|$1 bet}} bar.",
-'wlheader-enotif' => "E-mail arqalı eskertiw qosılg'an.",
+'wlheader-enotif' => "E-mail arqalı eskertiw qosılg'an.",
 'watchlistcontains' => "Sizin' baqlaw dizimin'izde {{PLURAL:$1|1 bet|$1 bet}} bar.",
 'wlnote' => "To'mende aqırg'ı {{PLURAL:$2|saattag'ı|'''$2''' saattag'ı}} {{PLURAL:$1|aqırg'ı o'zgeris bar|aqırg'ı '''$1''' o'zgeris bar}}.",
 'wlshowlast' => "Aqırg'ı $1 saat, $2 ku'n, $3 ko'rset",
@@ -1829,7 +1819,7 @@ Eger fayl jaratılg'anınan keyin o'zgertilgen bolsa, geybir parametrleri o'zger
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Yeni:',
 'exif-imagelength' => "Uzunlıg'ı",
 'exif-imagedescription' => "Su'wret ataması",
@@ -1932,9 +1922,6 @@ Bul tastıyıqlaw kodının' pitetug'ın waqtı: $4.",
 # Special:Version
 'version' => "MediaWikidin' nusqası",
 
-# Special:FilePath
-'filepath' => 'Fayl jolı',
-
 # Special:SpecialPages
 'specialpages' => 'Arnawlı betler',
 'specialpages-group-users' => "Paydalanıwshılar ha'm olardın' huqıqları",
index 33a9490..8ce650e 100644 (file)
@@ -73,8 +73,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ssken geddac yellan n yimseqdacen iɛessasen',
 'tog-oldsig' => 'Azmul yellan :',
 'tog-fancysig' => 'ǧǧ azmul am yettili (war azday awurman)',
-'tog-externaleditor' => 'Sseqdec ambeddel n berra d ameslugen',
-'tog-externaldiff' => 'Sseqdec ambeddel n berra iwakken ad ẓreɣ imgerraden',
 'tog-showjumplinks' => 'Eǧǧ izdayen "neggez ar"',
 'tog-uselivepreview' => 'Sseqdec pre-timeẓriwt taǧiḥbuṭ (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Ini-iyi-d mi sskecmeɣ agzul amecluc',
@@ -1060,15 +1058,6 @@ Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPA
 'search-external' => 'Anadi yeffɣen',
 'searchdisabled' => 'Anadi deg {{SITENAME}} yettwakkes. Tzemreḍ ad tnadiḍ s Google. Meɛna ur tettuḍ ara, tasmult n google taqdimt.',
 
-# Quickbar
-'qbsettings' => 'Tanuga taǧiḥbuṭ',
-'qbsettings-none' => 'Ulac',
-'qbsettings-fixedleft' => 'Aẓelmaḍ',
-'qbsettings-fixedright' => 'Ayeffus',
-'qbsettings-floatingleft' => 'Tufeg aẓelmaḍ',
-'qbsettings-floatingright' => 'Tufeg ayeffus',
-'qbsettings-directionality' => 'Usbiḍ, ɣef wayen n unamud n tira n tutlayt ik/im',
-
 # Preferences page
 'preferences' => 'Isemyifiyen',
 'mypreferences' => 'Isemyifiyen inu',
@@ -1607,7 +1596,6 @@ I taɣellist tameqqṛant, img_auth.php yensa.',
 'http-read-error' => 'Anezri n taɣuri HTTP.',
 'http-timed-out' => 'Tuttra HTTP teneffeṛ.',
 'http-curl-error' => 'Anezri deg tiririt n URL : $1',
-'http-host-unreachable' => 'Ulamek an siḍes URL',
 'http-bad-status' => 'Yella ugur deg tuttra HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2012,8 +2000,8 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'notvisiblerev' => 'Lqem tetwemḥa',
 'watchnochange' => 'Ulaḥedd n yiferdas n wumuɣ n uɛessi inek ma yettubeddel deg tawala i textareḍ.',
 'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren "amyannan".',
-'wlheader-enotif' => 'Yeǧǧa Email n talɣut.',
-'wlheader-showupdated' => "Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s '''uḍris aberbuz'''",
+'wlheader-enotif' => 'Yeǧǧa Email n talɣut.',
+'wlheader-showupdated' => "Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s '''uḍris aberbuz'''",
 'watchmethod-recent' => 'yessenqed ibeddlen imaynuten n isebtar i ttɛasseɣ',
 'watchmethod-list' => 'yessenqed isebtar i ttɛassaɣ i ibeddlen imaynuten',
 'watchlistcontains' => 'Umuɣ n uɛessi inek ɣur-s $1 n {{PLURAL:$1|usebter|isebtar}}.',
@@ -2541,6 +2529,19 @@ Lukan a t-tesseqdceḍ yezmer ad yexsser aselkim inek/inem.",
 'ago' => '$1 aya',
 'just-now' => 'Tura kan',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|asrag|isragen}} aya',
+'minutes-ago' => '$1 {{PLURAL:$1|tamrect|timercin}} aya',
+'seconds-ago' => '$1 {{PLURAL:$1|tasint|tisinin}} aya',
+'monday-at' => 'Arim af $1',
+'tuesday-at' => 'Aram af $1',
+'wednesday-at' => 'Ahad af $1',
+'thursday-at' => 'Amhad af $1',
+'friday-at' => 'Sem af $1',
+'saturday-at' => 'Sed af $1',
+'sunday-at' => 'Acer af $1',
+'yesterday-at' => 'Iḍelli af $1',
+
 # Bad image list
 'bad_image_list' => 'Amasal d-wagi :
 
@@ -2567,7 +2568,7 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Tehri',
 'exif-imagelength' => 'Taɣwzi',
 'exif-bitspersample' => 'Ibitten s isger',
@@ -2982,11 +2983,6 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'version-entrypoints-header-entrypoint' => 'Ired n wekcam',
 'version-entrypoints-header-url' => 'Tansa URL',
 
-# Special:FilePath
-'filepath' => 'Abrid n wadduf ufaylu',
-'filepath-page' => 'Afaylu :',
-'filepath-submit' => 'Ruḥ',
-
 # Special:SpecialPages
 'specialpages' => 'isebtar usligen',
 
index 85b046d..e39a75f 100644 (file)
@@ -84,8 +84,6 @@ $messages = array(
 'tog-shownumberswatching' => 'НапэкӀуэцӀыр я тхылъ кӀэлъыплъыгъуэхэм хэзгъэхьахэм я бжыгъэр гъэлъэгъуэн',
 'tog-oldsig' => 'ӀэпэщӀэдз щыӀэм и япэ-еплъ',
 'tog-fancysig' => 'Викитхылъ ӀэпэщӀэдз Ӏыгъын (автоматикэ техьэпӀэншу)',
-'tog-externaleditor' => 'Хэмыт редакторыр къэгъэсэбэпын (компутырым абым теухуа тегъэпсыхьыгъуэ хуэныкъуэ)',
-'tog-externaldiff' => 'Хэмыт программэр къэгъэсэбэпын зэгъэлъытэн шъхьэкӀэ (компутырым абым теухуа тегъэпсыхьыгъуэ хуэныкъуэ)',
 'tog-showjumplinks' => 'ДэӀэпыкъуэгъу техьэпӀэ «техьэн» хэгъэнэн',
 'tog-uselivepreview' => 'Япэ-еплъ щӀэхыр къэгъэсэбэпын (JavaScript хуэныкъуэ) (эксперементалу)',
 'tog-forceeditsummary' => 'КъэӀохун, гъэтэрэзыгъуэм и тепсэлъыхьыпӀэм зыри имытхамэ',
index b8a1b06..38f2da2 100644 (file)
@@ -45,8 +45,6 @@ $messages = array(
 'tog-shownumberswatching' => 'لوڑاک ممبرانن تعدادان پشاؤے',
 'tog-oldsig' => 'موجودہ دستخطو نمائش:',
 'tog-fancysig' => '(سادہ دسخط بلا خودکار ربط)',
-'tog-externaleditor' => 'ہمیشہ بیرونی تدوین کار استعمال کورے (صرفی ماہرینن بچے، ھمو بچے کمپیوٹرا خاص ترتیبات درکار بونیان)',
-'tog-externaldiff' => 'ہمیشہ بیرونی تدوین کار استعمال کورے (صرفی ماہرینن بچے، ھمو بچے کمپیوٹرا خاص ترتیبات درکار بونیان)',
 'tog-showjumplinks' => 'ھیہ ووشکی څروٹھاوے',
 'tog-uselivepreview' => 'براہِ راست نمائش استعمال کورے (JavaScript ضرورت بوی)',
 'tog-forceeditsummary' => 'کیاوتکی آوا ترمیمی خلاصو خالی پیڅھیتام تھے متے لو دیت',
@@ -1117,10 +1115,6 @@ HTML tags لوڑے.',",
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'خبردار:\'\'\' ڈیفالٹ تاڑٰ(نغڑی) "$2" پروشٹیو ڈیفالٹ تاڑا "$1" لیگی شیر۔',
 
-# Special:FilePath
-'filepath-page' => 'فایل',
-'filepath-submit' => 'Go/بوغے',
-
 # Special:SpecialPages
 'specialpages' => 'اسپیشل صفحہ',
 
index 3a6fa9d..5454422 100644 (file)
@@ -82,8 +82,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Amorê karberunê şêrkerdoğu bıasne',
 'tog-oldsig' => 'İmza mewcude:',
 'tog-fancysig' => 'İmza rê mamelê wikimeqaley bıke (bê girewo otomatik)',
-'tog-externaleditor' => 'Editorê teberi standart bıgurene (teyna serba ekspertuno, komputerê sıma de ayarê xusışiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
-'tog-externaldiff' => 'Têversanaene pê programê teberi vıraze (teyna serba ekspertuno, komputerê sıma de ayarê xısuşiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
 'tog-showjumplinks' => 'Girê "so"y feal ke',
 'tog-uselivepreview' => 'Verqayto cande bıgurene (JavaScript) (hona cerrebnayene dero)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
@@ -782,14 +780,6 @@ Verê cıfeteliyaene de be ilawekerdena verbendê '''all:'''i ra (ebe pelunê hu
 Sıma şikinê na sıre ''Google'' de şêr kerê.
 Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 
-# Quickbar
-'qbsettings' => 'Herbişiyaena hedefi',
-'qbsettings-none' => 'Qet',
-'qbsettings-fixedleft' => 'Çhep de bestniyo pa',
-'qbsettings-fixedright' => 'Rast de bestniyo pa',
-'qbsettings-floatingleft' => 'Çhepi ser aznino',
-'qbsettings-floatingright' => 'Rasti ser aznino',
-
 # Preferences page
 'preferences' => 'Tercihi',
 'mypreferences' => 'Tercihê mı',
@@ -803,7 +793,7 @@ Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 'prefs-datetime' => 'Tarix u zeman',
 'prefs-personal' => 'Dosya karberi',
 'prefs-rc' => 'Vurnaisê peyêni',
-'prefs-watchlist' => 'Lista şêr-kerdişi',
+'prefs-watchlist' => 'Lista şêrkerdene',
 'prefs-watchlist-days' => 'Rozê ke lista şêr-kerdişi de asenê:',
 'prefs-watchlist-edits' => 'Miqdarê tewr jêdêr vurnaisuno ke lista şêr-kerdişia hirakerdiye derê:',
 'prefs-misc' => 'Ğelet',
@@ -844,8 +834,8 @@ Diqet kerê, beno ke tedeestê {{SITENAME}} uza endi rozane niyê.",
 'prefs-files' => 'Dosyey',
 'youremail' => 'E-poste:',
 'username' => 'Namê karberi:',
-'uid' => 'Kamiya karberi:',
-'prefs-memberingroups' => 'Ezaê de {{PLURAL:$1|gruba|grubunê}}:',
+'uid' => 'Kamiya {{GENDER:$1|karberi}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|grubu}}:',
 'yourrealname' => 'Namo rastıkên:',
 'yourlanguage' => 'Zon:',
 'yourvariant' => 'Varyant:',
@@ -1148,7 +1138,7 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
 'emailsend' => 'Bırusne',
 
 # Watchlist
-'watchlist' => 'Pela mına şêrkerdene',
+'watchlist' => 'Lista şêrkerdene',
 'mywatchlist' => 'Lista şêrkerdışi',
 'watchlistfor2' => 'Serba $1 ($2)',
 'addedwatchtext' => "Pela \"[[:\$1]]\"i ilawe biye be [[Special:Watchlist|pela şêrkerdişi]].
@@ -1200,7 +1190,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 'protect-default' => 'Destur bıde be karberu pêrune',
 'protect-fallback' => 'Desturê "$1"i lazımo',
 'protect-level-autoconfirmed' => 'Karberunê newun u qeydnêbiyaoğu kilıt ke',
-'protect-level-sysop' => 'Teyna idarekeri',
+'protect-level-sysop' => 'Teyna idarekeru rê izıne bıde',
 'protect-summary-cascade' => 'qedemein',
 'protect-expiring' => 'tarixê qediyaene $1 (UTC)',
 'protect-expiring-local' => '$1 de qedino',
@@ -1468,8 +1458,6 @@ Na rêze de her girêo bin jê istisna vênino, yanê pelê ke dosya beno ke ser
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -1528,7 +1516,7 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Verındêni',
 'exif-imagelength' => 'Berzêni',
 
@@ -1558,10 +1546,6 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Teme:\'\'\' Tuşê default sort "$2" sero tuşê default sort "$1"î ra şino.',
 
-# Special:FilePath
-'filepath-page' => 'Dosya:',
-'filepath-submit' => 'So',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Namê dosya:',
 
@@ -1577,7 +1561,7 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
 'specialpages-group-media' => 'Raporê medya u bar-kerdey',
 'specialpages-group-users' => 'Karber u heqi',
 'specialpages-group-highuse' => 'Pelê jêdêr gurenaey',
-'specialpages-group-pages' => 'Lista pelun',
+'specialpages-group-pages' => 'Listê pelun',
 'specialpages-group-pagetools' => 'Hacetê pele',
 'specialpages-group-wiki' => "Daê ''Wiki''y u haceti",
 'specialpages-group-redirects' => 'Newe-vırastena pelunê xususiyun',
index 8db1e09..c757c53 100644 (file)
@@ -420,8 +420,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'ە-پوشتامنىڭ مەكەنجايىن ەسكەرتۋ حاتتاردا اش',
 'tog-shownumberswatching' => 'باقىلاپ تۇرعان قاتىسۋشىلاردىڭ سانىن كورسەت',
 'tog-fancysig' => 'قام قولتاڭبا (وزدىكتىك سىلتەمەسىز)',
-'tog-externaleditor' => 'شەتتىك وڭدەۋىشتى ادەپكىدەن قولدان (تەك ساراپشىلار ٴۇشىن, كومپيۋتەرىڭىزدە ارناۋلى باپتالىمدار كەرەك)',
-'tog-externaldiff' => 'شەتتىك ايىرماعىشتى ادەپكىدەن قولدان (تەك ساراپشىلار ٴۇشىن, كومپيۋتەرىڭىزدە ارناۋلى باپتالىمدار كەرەك)',
 'tog-showjumplinks' => '«ٴوتىپ كەتۋ» قاتىناۋ سىلتەمەلەرىن قوس',
 'tog-uselivepreview' => 'تۋرا قاراپ شىعۋدى قولدانۋ (JavaScript) (سىناقتاما)',
 'tog-forceeditsummary' => 'وڭدەمەنىڭ قىسقاشا مازمۇنداماسى بوس قالعاندا ماعان ەسكەرت',
@@ -1140,14 +1138,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 ازىرشە Google ارقىلى ىزدەۋگە بولادى.
 اڭعارتپا: {{SITENAME}} تورابىنىڭ ماعلۇمات تىزبەلەرى ەسكىرگەن بولۋى مۇمكىن.',
 
-# Quickbar
-'qbsettings' => 'ٴمازىر',
-'qbsettings-none' => 'ەشقانداي',
-'qbsettings-fixedleft' => 'سولعا بەكىتىلگەن',
-'qbsettings-fixedright' => 'وڭعا بەكىتىلگەن',
-'qbsettings-floatingleft' => 'سولعا قالقىعان',
-'qbsettings-floatingright' => 'وڭعا قالقىعان',
-
 # Preferences page
 'preferences' => 'باپتالىمدار',
 'mypreferences' => 'باپتالىمدارىم',
@@ -1732,8 +1722,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'notvisiblerev' => 'تۇزەتۋ جويىلدى',
 'watchnochange' => 'كورسەتىلگەن مەرزىمدە ەش باقىلانعان دانا وڭدەلگەن جوق.',
 'watchlist-details' => 'تالقىلاۋ بەتتەرىن ساناماعاندا $1 بەت باقلانىلادى.',
-'wlheader-enotif' => 'ەسكەرتۋ حات جىبەرۋى قوسىلعان.',
-'wlheader-showupdated' => "سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى وزگەرتىلگەن بەتتەردى '''جۋان''' قارىپىمەن كورسەت",
+'wlheader-enotif' => 'ەسكەرتۋ حات جىبەرۋى قوسىلعان.',
+'wlheader-showupdated' => "سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى وزگەرتىلگەن بەتتەردى '''جۋان''' قارىپىمەن كورسەت",
 'watchmethod-recent' => 'باقىلاۋلى بەتتەر ٴۇشىن جۋىقتاعى وزگەرىستەردى تەكسەرۋ',
 'watchmethod-list' => 'جۋىقتاعى وزگەرىستەر ٴۇشىن باقىلاۋلى بەتتەردى تەكسەرۋ',
 'watchlistcontains' => 'باقىلاۋ تىزىمىڭىزدە $1 بەت بار.',
@@ -2272,24 +2262,14 @@ MediaWiki جۇيەسىنىڭ [[{{#special:Import}}|سىرتتان الۋ بەت
 
 # Stylesheets
 'common.css' => '/* مىندا ورنالاستىرىلعان CSS بارلىق مانەرلەردە قولدانىلادى */',
-'standard.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «داعدىلى» (standard) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'nostalgia.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «اڭساۋ» (nostalgia) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
 'cologneblue.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «كولن زەڭگىرلىگى» (cologneblue) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى skin */',
 'monobook.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «دارا كىتاپ» (monobook) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'myskin.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «ٴوز مانەرىم» (myskin) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'chick.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «بالاپان» (chick) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
-'simple.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «كادىمگى» (simple) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
 'modern.css' => '/* مىندا ورنالاستىرىلعان CSS تەك «زاماناۋىي» (modern) مانەرىن پايدالانۋشىلارىنا ىقپال ەتەدى */',
 
 # Scripts
 'common.js' => '/* مىنداعى ٴارتۇرلى JavaScript كەز كەلگەن بەت قوتارىلعاندا بارلىق پايدالانۋشىلار ٴۇشىن جەگىلەدى. */',
-'standard.js' => '/* مىنداعى JavaScript تەك «داعدىلى» (standard) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'nostalgia.js' => '/* مىنداعى JavaScript تەك «اڭساۋ» (nostalgia) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى*/',
 'cologneblue.js' => '/* مىنداعى JavaScript تەك «كولن زەڭگىرلىگى» (cologneblue) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
 'monobook.js' => '/* مىنداعى JavaScript تەك «دارا كىتاپ» (monobook) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'myskin.js' => '/* مىنداعى JavaScript تەك «ٴوز مانەرىم» (myskin) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'chick.js' => '/* مىنداعى JavaScript تەك «بالاپان» (chick) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
-'simple.js' => '/* مىنداعى JavaScript تەك «كادىمگى» (simple) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
 'modern.js' => '/* مىنداعى JavaScript تەك «زاماناۋىي» (modern) مانەرىن پايدالانۋشىلار ٴۇشىن جەگىلەدى */',
 
 # Metadata
@@ -2315,13 +2295,8 @@ MediaWiki جۇيەسىنىڭ [[{{#special:Import}}|سىرتتان الۋ بەت
 'spam_blanking' => '$1 دەگەنگە سىلتەمەلەرى بار بارلىق تۇزەتۋلەر تازارتىلدى',
 
 # Skin names
-'skinname-standard' => 'داعدىلى (standard)',
-'skinname-nostalgia' => 'اڭساۋ (nostalgia)',
 'skinname-cologneblue' => 'كولن زەڭگىرلىگى (cologneblue)',
 'skinname-monobook' => 'دارا كىتاپ (monobook)',
-'skinname-myskin' => 'ٴوز مانەرىم (myskin)',
-'skinname-chick' => 'بالاپان (chick)',
-'skinname-simple' => 'كادىمگى (simple)',
 'skinname-modern' => 'زاماناۋىي (modern)',
 
 # Patrolling
@@ -2410,7 +2385,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ەنى',
 'exif-imagelength' => 'بىيىكتىگى',
 'exif-bitspersample' => 'قۇراش سايىن بىيت سانى',
@@ -2524,7 +2499,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS كۇن-ايى',
 'exif-gpsdifferential' => 'GPS سارالانعان دۇرىستاۋ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ۇلعايتىلعان',
 
 'exif-unknowndate' => 'بەلگىسىز كۇن-ايى',
@@ -2858,13 +2833,6 @@ $5
 'version-software-product' => 'ٴونىم',
 'version-software-version' => 'نۇسقاسى',
 
-# Special:FilePath
-'filepath' => 'فايل ورنالاسۋى',
-'filepath-page' => 'فايل اتى:',
-'filepath-submit' => 'ورنالاسۋىن تاپ',
-'filepath-summary' => 'بۇل ارنايى بەت فايل ورنالاسۋى تولىق جولىن قايتارادى.
-سۋرەتتەر تولىق اجىراتىلىمدىعىمەن كورسەتىلەدى, باسقا فايل تۇرلەرىنە قاتىستى باعدارلاماسى تۋرا جەگىلەدى.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'فايل تەلنۇسقالارىن ىزدەۋ',
 'fileduplicatesearch-summary' => 'فايل حەشى ماعىناسى نەگىزىندە تەلنۇسقالارىن ىزدەۋ.',
index 3dd54eb..440e4c5 100644 (file)
@@ -12,6 +12,7 @@
  * @author Daniyar
  * @author GaiJin
  * @author Kaztrans
+ * @author Nemo bis
  * @author Urhixidur
  */
 
@@ -388,8 +389,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Бақылап тұрған қатысушылардың санын көрсет',
 'tog-oldsig' => 'Ағымдағы қолтаңбаңыз:',
 'tog-fancysig' => 'Қолтаңбаны уикимәтін ретінде қарастыру (автоматты сілтеме қойылмайды)',
-'tog-externaleditor' => 'Шеттік өңдеуішті әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
-'tog-externaldiff' => 'Шеттік айырмағышты әдепкіден қолдан (тек сарапшылар үшін, компьютеріңізде арнаулы бапталымдар керек)',
 'tog-showjumplinks' => '«Өтіп кету» қатынау сілтемелерін қос',
 'tog-uselivepreview' => 'Тура қарап шығуды қолдану (JavaScript) (Сынақтама)',
 'tog-forceeditsummary' => 'Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт',
@@ -872,10 +871,8 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Құпия сөзді қайтару',
-'passwordreset-text' => 'Сіздің тіркелгіңіздің баптаулары туралы хабарламаларды алу үшін мына пішінді толтырыңыз.',
 'passwordreset-legend' => 'Құпия сөзді қайтару',
 'passwordreset-disabled' => 'Бұл уикиде құпия сөзді қайтару ажыратылған.',
-'passwordreset-pretext' => '{{PLURAL:$1||Төменде көрсетілгендердің ішіндегі біреуін жазыңыз}}',
 'passwordreset-username' => 'Қатысушы аты:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Келген хатты қарау керек пе?',
@@ -1076,6 +1073,8 @@ IP-мекенжайыңыз бұл беттің түзету тарихында
 'edit-already-exists' => 'Жаңа бет жасау мүмкін емес.
 Ол әлдеқашан бар.',
 'defaultmessagetext' => 'Әдепкі мәтіні',
+'editwarning-warning' => 'Басқа бетке өтсеңіз сіздің жазған соңғы өңдемелеріңіз жойылуы мүмкін. 
+Егер сiз жүйеде тiркелсеңiз, онда сiз баптауларыңыздағы «{{int:prefs-editing}}» бөлігіне кіріп, бұл ескертуді өшіре аласыз.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Құлақтандыру: Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.
@@ -1291,14 +1290,6 @@ $3 келтірілген себебі: ''$2''",
 Әзірше Google арқылы іздеуге болады.
 Аңғартпа: {{SITENAME}} торабының мағлұмат тізбелері ескірген болуы мүмкін.',
 
-# Quickbar
-'qbsettings' => 'Мәзір',
-'qbsettings-none' => 'Ешқандай',
-'qbsettings-fixedleft' => 'Солға бекітілген',
-'qbsettings-fixedright' => 'Оңға бекітілген',
-'qbsettings-floatingleft' => 'Солға қалқыған',
-'qbsettings-floatingright' => 'Оңға қалқыған',
-
 # Preferences page
 'preferences' => 'Бапталымдар',
 'mypreferences' => 'Баптауларым',
@@ -1968,8 +1959,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'notvisiblerev' => 'Түзету жойылды',
 'watchnochange' => 'Көрсетілген мерзімде еш бақыланған дана өңделген жоқ.',
 'watchlist-details' => 'Тізіміңізде $1 бет бар (талқылау беттері саналмайды).',
-'wlheader-enotif' => 'Ескерту хат жіберуі қосылған.',
-'wlheader-showupdated' => "Соңғы келіп-кетуіңізден бері өзгертілген беттерді '''жуан''' қаріпімен көрсет",
+'wlheader-enotif' => 'Ескерту хат жіберуі қосылған.',
+'wlheader-showupdated' => "Соңғы келіп-кетуіңізден бері өзгертілген беттерді '''жуан''' қаріпімен көрсет",
 'watchmethod-recent' => 'бақылаулы беттер үшін жуықтағы өзгерістерді тексеру',
 'watchmethod-list' => 'жуықтағы өзгерістер үшін бақылаулы беттерді тексеру',
 'watchlistcontains' => 'Бақылау тізіміңізде $1 бет бар.',
@@ -2542,24 +2533,14 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 
 # Stylesheets
 'common.css' => '/* Мында орналастырылған CSS барлық мәнерлерде қолданылады */',
-'standard.css' => '/* Мында орналастырылған CSS тек «Дағдылы» (standard) мәнерін пайдаланушыларына ықпал етеді */',
-'nostalgia.css' => '/* Мында орналастырылған CSS тек «Аңсау» (nostalgia) мәнерін пайдаланушыларына ықпал етеді */',
 'cologneblue.css' => '/* Мында орналастырылған CSS тек «Көлн зеңгірлігі» (cologneblue) мәнерін пайдаланушыларына ықпал етеді skin */',
 'monobook.css' => '/* Мында орналастырылған CSS тек «Дара кітап» (monobook) мәнерін пайдаланушыларына ықпал етеді */',
-'myskin.css' => '/* Мында орналастырылған CSS тек «Өз мәнерім» (myskin) мәнерін пайдаланушыларына ықпал етеді */',
-'chick.css' => '/* Мында орналастырылған CSS тек «Балапан» (chick) мәнерін пайдаланушыларына ықпал етеді */',
-'simple.css' => '/* Мында орналастырылған CSS тек «Кәдімгі» (simple) мәнерін пайдаланушыларына ықпал етеді */',
 'modern.css' => '/* Мында орналастырылған CSS тек «Заманауи» (modern) мәнерін пайдаланушыларына ықпал етеді */',
 
 # Scripts
 'common.js' => '/* Мындағы әртүрлі JavaScript кез келген бет қотарылғанда барлық пайдаланушылар үшін жегіледі. */',
-'standard.js' => '/* Мындағы JavaScript тек «Дағдылы» (standard) мәнерін пайдаланушылар үшін жегіледі */',
-'nostalgia.js' => '/* Мындағы JavaScript тек «Аңсау» (nostalgia) мәнерін пайдаланушылар үшін жегіледі*/',
 'cologneblue.js' => '/* Мындағы JavaScript тек «Көлн зеңгірлігі» (cologneblue) мәнерін пайдаланушылар үшін жегіледі */',
 'monobook.js' => '/* Мындағы JavaScript тек «Дара кітап» (monobook) мәнерін пайдаланушылар үшін жегіледі */',
-'myskin.js' => '/* Мындағы JavaScript тек «Өз мәнерім» (myskin) мәнерін пайдаланушылар үшін жегіледі */',
-'chick.js' => '/* Мындағы JavaScript тек «Балапан» (chick) мәнерін пайдаланушылар үшін жегіледі */',
-'simple.js' => '/* Мындағы JavaScript тек «Кәдімгі» (simple) мәнерін пайдаланушылар үшін жегіледі */',
 'modern.js' => '/* Мындағы JavaScript тек «Заманауи» (modern) мәнерін пайдаланушылар үшін жегіледі */',
 
 # Metadata
@@ -2585,13 +2566,8 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'spam_blanking' => '$1 дегенге сілтемелері бар барлық түзетулер тазартылды',
 
 # Skin names
-'skinname-standard' => 'Дағдылы (standard)',
-'skinname-nostalgia' => 'Аңсау (nostalgia)',
 'skinname-cologneblue' => 'Көлн зеңгірлігі (cologneblue)',
 'skinname-monobook' => 'Дара кітап (monobook)',
-'skinname-myskin' => 'Өз мәнерім (myskin)',
-'skinname-chick' => 'Балапан (chick)',
-'skinname-simple' => 'Кәдімгі (simple)',
 'skinname-modern' => 'Заманауи (modern)',
 
 # Patrolling
@@ -2681,7 +2657,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ені',
 'exif-imagelength' => 'Биіктігі',
 'exif-bitspersample' => 'Құраш сайын бит саны',
@@ -2795,7 +2771,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS күн-айы',
 'exif-gpsdifferential' => 'GPS сараланған дұрыстау',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ұлғайтылған',
 
 'exif-unknowndate' => 'Белгісіз күн-айы',
@@ -3129,13 +3105,6 @@ $5
 'version-software-product' => 'Өнім',
 'version-software-version' => 'Нұсқасы',
 
-# Special:FilePath
-'filepath' => 'Файл орналасуы',
-'filepath-page' => 'Файл аты:',
-'filepath-submit' => 'Орналасуын тап',
-'filepath-summary' => 'Бұл арнайы бет файл орналасуы толық жолын қайтарады.
-Суреттер толық ажыратылымдығымен көрсетіледі, басқа файл түрлеріне қатысты бағдарламасы тура жегіледі.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Файл телнұсқаларын іздеу',
 'fileduplicatesearch-summary' => 'Файл хеші мағынасы негізінде телнұсқаларын іздеу.',
index 608ad71..67f1372 100644 (file)
@@ -383,8 +383,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'E-poştamnıñ mekenjaýın eskertw xattarda aş',
 'tog-shownumberswatching' => 'Baqılap turğan qatıswşılardıñ sanın körset',
 'tog-fancysig' => 'Qam qoltañba (özdiktik siltemesiz)',
-'tog-externaleditor' => 'Şettik öñdewişti ädepkiden qoldan (tek sarapşılar üşin, komp′ywteriñizde arnawlı baptalımdar kerek)',
-'tog-externaldiff' => 'Şettik aýırmağıştı ädepkiden qoldan (tek sarapşılar üşin, komp′ywteriñizde arnawlı baptalımdar kerek)',
 'tog-showjumplinks' => '«Ötip ketw» qatınaw siltemelerin qos',
 'tog-uselivepreview' => 'Twra qarap şığwdı qoldanw (JavaScript) (Sınaqtama)',
 'tog-forceeditsummary' => 'Öñdemeniñ qısqaşa mazmundaması bos qalğanda mağan eskert',
@@ -1103,14 +1101,6 @@ Añğartpa: bağıttaw siltemelerin qoldanğanda bul bağan qaýta qoýıladı.'
 Äzirşe Google arqılı izdewge boladı.
 Añğartpa: {{SITENAME}} torabınıñ mağlumat tizbeleri eskirgen bolwı mümkin.',
 
-# Quickbar
-'qbsettings' => 'Mäzir',
-'qbsettings-none' => 'Eşqandaý',
-'qbsettings-fixedleft' => 'Solğa bekitilgen',
-'qbsettings-fixedright' => 'Oñğa bekitilgen',
-'qbsettings-floatingleft' => 'Solğa qalqığan',
-'qbsettings-floatingright' => 'Oñğa qalqığan',
-
 # Preferences page
 'preferences' => 'Baptalımdar',
 'mypreferences' => 'Baptalımdarım',
@@ -1695,8 +1685,8 @@ Bul bettiñ jäne baýlanıstı talqılaw betiniñ keleşektegi özgeristeri mı
 'notvisiblerev' => 'Tüzetw joýıldı',
 'watchnochange' => 'Körsetilgen merzimde eş baqılanğan dana öñdelgen joq.',
 'watchlist-details' => 'Talqılaw betterin sanamağanda $1 bet baqlanıladı.',
-'wlheader-enotif' => 'Eskertw xat jiberwi qosılğan.',
-'wlheader-showupdated' => "Soñğı kelip-ketwiñizden beri özgertilgen betterdi '''jwan''' qaripimen körset",
+'wlheader-enotif' => 'Eskertw xat jiberwi qosılğan.',
+'wlheader-showupdated' => "Soñğı kelip-ketwiñizden beri özgertilgen betterdi '''jwan''' qaripimen körset",
 'watchmethod-recent' => 'baqılawlı better üşin jwıqtağı özgeristerdi tekserw',
 'watchmethod-list' => 'jwıqtağı özgerister üşin baqılawlı betterdi tekserw',
 'watchlistcontains' => 'Baqılaw tizimiñizde $1 bet bar.',
@@ -2236,24 +2226,14 @@ Wïkï-aparw üşin sırttan alw barlıq äreketter [[{{#special:Log}}/import|s
 
 # Stylesheets
 'common.css' => '/* Mında ornalastırılğan CSS barlıq mänerlerde qoldanıladı */',
-'standard.css' => '/* Mında ornalastırılğan CSS tek «Dağdılı» (standard) mänerin paýdalanwşılarına ıqpal etedi */',
-'nostalgia.css' => '/* Mında ornalastırılğan CSS tek «Añsaw» (nostalgia) mänerin paýdalanwşılarına ıqpal etedi */',
 'cologneblue.css' => '/* Mında ornalastırılğan CSS tek «Köln zeñgirligi» (cologneblue) mänerin paýdalanwşılarına ıqpal etedi skin */',
 'monobook.css' => '/* Mında ornalastırılğan CSS tek «Dara kitap» (monobook) mänerin paýdalanwşılarına ıqpal etedi */',
-'myskin.css' => '/* Mında ornalastırılğan CSS tek «Öz mänerim» (myskin) mänerin paýdalanwşılarına ıqpal etedi */',
-'chick.css' => '/* Mında ornalastırılğan CSS tek «Balapan» (chick) mänerin paýdalanwşılarına ıqpal etedi */',
-'simple.css' => '/* Mında ornalastırılğan CSS tek «Kädimgi» (simple) mänerin paýdalanwşılarına ıqpal etedi */',
 'modern.css' => '/* Mında ornalastırılğan CSS tek «Zamanawï» (modern) mänerin paýdalanwşılarına ıqpal etedi */',
 
 # Scripts
 'common.js' => '/* Mındağı ärtürli JavaScript kez kelgen bet qotarılğanda barlıq paýdalanwşılar üşin jegiledi. */',
-'standard.js' => '/* Mındağı JavaScript tek «Dağdılı» (standard) mänerin paýdalanwşılar üşin jegiledi */',
-'nostalgia.js' => '/* Mındağı JavaScript tek «Añsaw» (nostalgia) mänerin paýdalanwşılar üşin jegiledi*/',
 'cologneblue.js' => '/* Mındağı JavaScript tek «Köln zeñgirligi» (cologneblue) mänerin paýdalanwşılar üşin jegiledi */',
 'monobook.js' => '/* Mındağı JavaScript tek «Dara kitap» (monobook) mänerin paýdalanwşılar üşin jegiledi */',
-'myskin.js' => '/* Mındağı JavaScript tek «Öz mänerim» (myskin) mänerin paýdalanwşılar üşin jegiledi */',
-'chick.js' => '/* Mındağı JavaScript tek «Balapan» (chick) mänerin paýdalanwşılar üşin jegiledi */',
-'simple.js' => '/* Mındağı JavaScript tek «Kädimgi» (simple) mänerin paýdalanwşılar üşin jegiledi */',
 'modern.js' => '/* Mındağı JavaScript tek «Zamanawï» (modern) mänerin paýdalanwşılar üşin jegiledi */',
 
 # Metadata
@@ -2279,13 +2259,8 @@ Bunıñ sebebi şettik torap siltemesinen bolwı mümkin.',
 'spam_blanking' => '$1 degenge siltemeleri bar barlıq tüzetwler tazartıldı',
 
 # Skin names
-'skinname-standard' => 'Dağdılı (standard)',
-'skinname-nostalgia' => 'Añsaw (nostalgia)',
 'skinname-cologneblue' => 'Köln zeñgirligi (cologneblue)',
 'skinname-monobook' => 'Dara kitap (monobook)',
-'skinname-myskin' => 'Öz mänerim (myskin)',
-'skinname-chick' => 'Balapan (chick)',
-'skinname-simple' => 'Kädimgi (simple)',
 'skinname-modern' => 'Zamanawï (modern)',
 
 # Patrolling
@@ -2373,7 +2348,7 @@ Basqaları ädepkiden jasırıladı.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Eni',
 'exif-imagelength' => 'Bïiktigi',
 'exif-bitspersample' => 'Quraş saýın bït sanı',
@@ -2487,7 +2462,7 @@ Basqaları ädepkiden jasırıladı.
 'exif-gpsdatestamp' => 'GPS kün-aýı',
 'exif-gpsdifferential' => 'GPS saralanğan durıstaw',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ulğaýtılğan',
 
 'exif-unknowndate' => 'Belgisiz kün-aýı',
@@ -2817,13 +2792,6 @@ Tağı da [[Special:EditWatchlist|qalıpalğan öñdewişti paýdalana]] alasız
 'version-software-product' => 'Önim',
 'version-software-version' => 'Nusqası',
 
-# Special:FilePath
-'filepath' => 'Faýl ornalaswı',
-'filepath-page' => 'Faýl atı:',
-'filepath-submit' => 'Ornalaswın tap',
-'filepath-summary' => 'Bul arnaýı bet faýl ornalaswı tolıq jolın qaýtaradı.
-Swretter tolıq ajıratılımdığımen körsetiledi, basqa faýl türlerine qatıstı bağdarlaması twra jegiledi.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Faýl telnusqaların izdew',
 'fileduplicatesearch-summary' => 'Faýl xeşi mağınası negizinde telnusqaların izdew.',
index e5b8892..b3fb68f 100644 (file)
@@ -12,6 +12,7 @@
  * @author Kaganer
  * @author Kiensvay
  * @author Lovekhmer
+ * @author Nemo bis
  * @author Sovichet
  * @author T-Rithy
  * @author Thearith
@@ -291,8 +292,6 @@ $messages = array(
 'tog-shownumberswatching' => 'បង្ហាញ​ចំនួនអ្នកប្រើប្រាស់​ដែលតាមដាន​ទំព័រនេះ',
 'tog-oldsig' => 'ហត្ថលេខាមានហើយ៖',
 'tog-fancysig' => 'ចុះហត្ថលេខា​ជា​អត្ថបទវិគី​ (ដោយ​គ្មានតំណភ្ជាប់​ស្វ័យប្រវត្តិ)',
-'tog-externaleditor' => 'ប្រើប្រាស់​ឧបករណ៍​កែប្រែខាងក្រៅ​តាមលំនាំដើម (សម្រាប់តែអ្នកមានជំនាញប៉ុណ្ណោះនិងត្រូវការការកំណត់ពិសេសៗនៅលើកុំព្យូទ័ររបស់អ្នក។ [//www.mediawiki.org/wiki/Manual:External_editors ព័ត៌មានបន្ថែម]។)',
-'tog-externaldiff' => 'ប្រើប្រាស់​ឧបករណ៍​ប្រៀបធៀបខាងក្រៅ​តាមលំនាំដើម (សម្រាប់តែអ្នកមានជំនាញប៉ុណ្ណោះនិងត្រូវការការកំណត់ពិសេសៗនៅលើកុំព្យូទ័ររបស់អ្នក។ [//www.mediawiki.org/wiki/Manual:External_editors ព័ត៌មានបន្ថែម]។)',
 'tog-showjumplinks' => 'ប្រើតំណភ្ជាប់ "លោតទៅ"',
 'tog-uselivepreview' => 'ប្រើប្រាស់​ការមើលមុនរហ័ស​ (តម្រូវអោយមាន JavaScript) (ស្ថិតក្រោមការពិសោធន៍នៅឡើយ)',
 'tog-forceeditsummary' => 'សូមរំលឹកខ្ញុំ​កាលបើខ្ញុំទុកប្រអប់ចំណារពន្យល់ឱ្យនៅទំនេរ',
@@ -306,6 +305,7 @@ $messages = array(
 'tog-diffonly' => 'កុំបង្ហាញខ្លឹមសារទំព័រនៅពីក្រោមតារាងប្រៀបធៀបចំណុចខុសគ្នា',
 'tog-showhiddencats' => 'បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់',
 'tog-norollbackdiff' => 'បំភ្លេច​ភាព​ខុស​គ្នា​បន្ទាប់​ពី​អនុវត្តការ​ស្ដារវិញ',
+'tog-useeditwarning' => 'សូមព្រមាន​ខ្ញុំ​ ពេលដែលខ្ញុំ​ចាកចេញ​ពី​ទំព័រ​កែប្រែដោយមិន​បានរក្សា​ទុកបំលាស់ប្ដូរ​នានា​',
 
 'underline-always' => 'ជានិច្ច',
 'underline-never' => 'កុំអោយសោះ',
@@ -369,6 +369,18 @@ $messages = array(
 '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 ធ្នូ',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ចំណាត់ថ្នាក់ក្រុម|ចំណាត់ថ្នាក់ក្រុម}}',
@@ -388,6 +400,9 @@ $messages = array(
 'index-category' => 'ទំព័រដែលមានលិបិក្រម',
 'noindex-category' => 'ទំព័រដែលគ្មានលិបិក្រម',
 'broken-file-category' => 'ទំព័រទាំងឡាយដែលដាច់តំណភ្ជាប់',
+'categoryviewer-pagedlinks' => '($1) ($2)',
+
+'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
 'about' => 'អំពី',
 'article' => 'មាតិកាអត្ថបទ',
@@ -522,6 +537,8 @@ $1',
 
 'ok' => 'យល់ព្រម',
 'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '← $1',
 'retrievedfrom' => 'បានពី "$1"',
 'youhavenewmessages' => 'អ្នកមាន $1 ($2)។',
 'newmessageslink' => 'សារថ្មីៗ',
@@ -532,6 +549,7 @@ $1',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}ចុងក្រោយ',
 'youhavenewmessagesmulti' => 'អ្នកមានសារថ្មីៗនៅ $1',
 'editsection' => 'កែប្រែ',
+'editsection-brackets' => '[$1]',
 'editold' => 'កែប្រែ',
 'viewsourceold' => 'មើលកូដ',
 'editlink' => 'កែប្រែ',
@@ -552,6 +570,8 @@ $1',
 'site-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ $1',
 'page-rss-feed' => 'បម្រែបម្រួល RSS Feed នៃ "$1"',
 'page-atom-feed' => 'បម្រែបម្រួល Atom Feed នៃ "$1"',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1 (ទំព័រនេះមិនទាន់​មាននៅឡើយទេ)',
 'sort-descending' => 'តម្រៀបតាមលំដាប់ចុះ',
 'sort-ascending' => 'តម្រៀបតាមលំដាប់ឡើង',
@@ -666,9 +686,18 @@ $2',
 'welcomecreation-msg' => 'គណនីរបស់អ្នកត្រូវបានបង្កើតហើយ។
 កុំភ្លេចផ្លាស់ប្ដូរ[[Special:Preferences|ចំណង់ចំណូលចិត្ត{{SITENAME}}]]របស់អ្នក។',
 'yourname' => 'អត្តនាម៖',
+'userlogin-yourname' => 'អត្តនាម',
+'userlogin-yourname-ph' => 'បញ្ចូលអត្តនាមរបស់អ្នក',
 'yourpassword' => 'ពាក្យសម្ងាត់៖',
+'userlogin-yourpassword' => 'ពាក្យ​សម្ងាត់',
+'userlogin-yourpassword-ph' => 'បញ្ចូលពាក្យសម្ងាត់របស់អ្នក',
+'createacct-yourpassword-ph' => 'បញ្ចូលពាក្យសម្ងាត់',
 'yourpasswordagain' => 'វាយពាក្យសម្ងាត់ម្តងទៀត៖',
+'createacct-yourpasswordagain' => 'អះអាង​ពាក្យ​សម្ងាត់',
+'createacct-yourpasswordagain-ph' => 'បញ្ចូលពាក្យសម្ងាត់ម្ដងទៀត',
 'remembermypassword' => 'ចងចាំកំណត់ឈ្មោះចូលរបស់ខ្ញុំក្នុងកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយូរបំផុត $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})',
+'userlogin-remembermypassword' => 'រក្សាស្ថានភាពកត់ឈ្មោះចូលរបស់ខ្ញុំ',
+'userlogin-signwithsecure' => 'ប្រើការតភ្ជាប់មានសុវត្ថិភាព',
 'securelogin-stick-https' => 'នៅភ្ជាប់ទៅ HTTPS ដដែលបន្ទាប់ពីចុះឈ្មោះចូលហើយក៏ដោយ',
 'yourdomainname' => 'ដូម៉ែនរបស់អ្នក៖',
 'password-change-forbidden' => 'អ្នកមិនអាចផ្លាស់ប្ដូរពាក្យសម្ងាត់ក្នុងវិគីនេះទេ។',
@@ -682,18 +711,38 @@ $2',
 'logout' => 'កត់ឈ្មោះចេញ',
 'userlogout' => 'កត់ឈ្មោះចេញ',
 'notloggedin' => 'មិនទាន់កត់ឈ្មោះចូល',
+'userlogin-noaccount' => 'តើលោកអ្នក​មិនទាន់មាន​គណនី​សម្រាប់​ប្រើ​ទេ​ឬ?',
+'userlogin-joinproject' => 'សូមចូលជាសមាជិក {{SITENAME}}',
 'nologin' => "​បើលោកអ្នក​មិនទាន់មាន​គណនី​សម្រាប់​ប្រើ​ទេ​ សូម'''$1''' ។",
 'nologinlink' => 'បង្កើតគណនី',
 'createaccount' => 'បង្កើតគណនី',
 'gotaccount' => "បើលោកអ្នកមានគណនីសម្រាប់ប្រើហើយ  សូម'''$1'''។",
 'gotaccountlink' => 'កត់ឈ្មោះចូល',
 'userlogin-resetlink' => 'តើអ្នកភ្លេចព័ត៌មានលម្អិតសម្រាប់កត់ឈ្មោះចូលហើយ?',
+'userlogin-resetpassword-link' => 'ស្ដារពាក្យសម្ងាត់របស់អ្នក',
+'helplogin-url' => 'Help:ការកត់ឈ្មោះចូល',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ជំនួយក្នុងការកត់ឈ្មោះចូល]]',
+'createacct-join' => 'បំពេញព័ត៌មានរបស់អ្នកខាងក្រោម។',
+'createacct-emailrequired' => 'អាសយដ្ឋានអ៊ីមែល',
+'createacct-emailoptional' => 'អាសយដ្ឋានអ៊ីមែល (ដាក់ក៏បានមិនដាក់ក៏បាន)',
+'createacct-email-ph' => 'បញ្ចូលអាសយដ្ឋានអ៊ីមែលរបស់អ្នក',
 'createaccountmail' => 'ប្រើប្រាស់ពាក្យសំងាត់ព្រៀងបណ្ដោះអាសនុ្ន រួចផ្ញើវាទៅកាន់អាសយដ្ឋានអ៊ីមែលខាងក្រោម',
+'createacct-realname' => 'ឈ្មោះពិត (ដាក់ក៏បានមិនដាក់ក៏បាន)',
 'createaccountreason' => 'មូលហេតុ៖',
+'createacct-reason' => 'មូលហេតុ',
+'createacct-reason-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|អ្នករួមចំណែក|អ្នករួមចំណែក}}ថ្មីៗ',
 'badretype' => 'ពាក្យសម្ងាត់ដែលអ្នកបានវាយបញ្ចូលនោះ គឺមិនស៊ីគ្នាទេ។',
 'userexists' => 'អត្តនាមដែលអ្នកបានវាយបញ្ចូលមានគេប្រើហើយ។
 សូមជ្រើសរើសអត្តនាមផ្សេងពីនេះ។',
 'loginerror' => 'កំហុសនៃការកត់ឈ្មោះចូល',
+'createacct-error' => 'បញ្ហាក្នុងការបង្កើតគណនី',
 'createaccounterror' => 'មិនអាចបង្កើតគណនីបានទេ៖ $1',
 'nocookiesnew' => 'គណនីប្រើប្រាស់របស់អ្នកត្រូវបានបង្កើតហើយ ក៏ប៉ុន្តែអ្នកមិនទាន់បានកត់ឈ្មោះចូលទេ។
 
@@ -707,6 +756,7 @@ $2',
 អ្នកបានជ្រើសមិនប្រើខូឃី។​
 
 សូមជ្រើសប្រើខូឃីវិញ រួចព្យាយាមម្តងទៀត។',
+'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'អ្នកមិនបានផ្ដល់អត្តនាមត្រឹមត្រូវទេ។',
 'loginsuccesstitle' => 'កត់ឈ្មោះចូលបានសំរេច',
 'loginsuccess' => "'''ពេលនេះអ្នកបានកត់ឈ្មោះចូល{{SITENAME}}ដោយប្រើឈ្មោះ \"\$1\"។'''",
@@ -743,9 +793,9 @@ $2',
 'eauthentsent' => 'អ៊ីមែល​សម្រាប់​ផ្ទៀងផ្ទាត់​បញ្ជាក់ត្រូវបានផ្ញើទៅ​អាសយដ្ឋានអ៊ីមែល​ដែលបានចុះត្រាហើយ។
 
 មុននឹងមាន​អ៊ីមែលផ្សេងមួយទៀត​ត្រូវផ្ញើទៅ​គណនីនេះ អ្នកត្រូវតែ​ធ្វើតាមសេចក្តីណែនាំ​ក្នុងអ៊ីមែល​នោះ ដើម្បីបញ្ជាក់ថា​គណនីបច្ចុប្បន្ន​ពិតជា​របស់អ្នកពិតប្រាកដមែន។',
-'throttled-mailpassword' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80ពាក្យសម្ងាត់ត្រូវបានផ្ញើទៅឱ្យអ្នកតាំងពី{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}មុននេះហើយ។
+'throttled-mailpassword' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aពាក្យសម្ងាត់ត្រូវបានផ្ញើទៅឱ្យអ្នកតាំងពី{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}មុននេះហើយ។
 
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e¢á\9f\86á\9e\96á\9e¾á\9e\94á\9f\86á\9e\96á\9e¶á\9e\93 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80ពាក្យសម្ងាត់តែមួយគត់នឹងត្រូវបាន​ផ្ញើក្នុងរយៈពេល{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}។',
\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\84á\9f\92á\9e\80á\9e¶á\9e\9aá\9e¢á\9f\86á\9e\96á\9e¾á\9e\94á\9f\86á\9e\96á\9e¶á\9e\93 á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aពាក្យសម្ងាត់តែមួយគត់នឹងត្រូវបាន​ផ្ញើក្នុងរយៈពេល{{PLURAL:$1|មួយម៉ោង|$1ម៉ោង}}។',
 'mailerror' => 'បញ្ហាក្នុងការផ្ញើអ៊ីមែល៖ $1',
 'acct_creation_throttle_hit' => 'អ្នកទស្សនា​វិគី​នេះ​ដោយ​ប្រើប្រាស់​អាសយដ្ឋានIPរបស់​អ្នក​ បានបង្កើត{{PLURAL:$1|គណនីមួយ|គណនីចំនួន$1}}នៅ​ថ្ងៃ​ចុងក្រោយ។ ចំនួននេះ​ជា​ចំនួន​អតិបរមារ​ដែល​ត្រូវ​បាន​អនុញ្ញាត​សម្រាប់​រយៈពេល​នេះ​។
 
@@ -803,40 +853,38 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ',
-'passwordreset-text' => 'បំពេញសំណុំបែបបទនេះដើម្បីទទួលបានអ៊ីម៉ែលក្រើនរំលឹកពីព័ត៌មានលំអិតរបស់គណនីរបស់អ្នក។',
-'passwordreset-legend' => 'ប្ដូរទៅពាក្យសម្ងាត់ដើម',
+'passwordreset-legend' => 'កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ',
 'passwordreset-disabled' => 'មុខងារប្ដូរទៅពាក្យសម្ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
-'passwordreset-pretext' => '{{PLURAL:$1||វាយបញ្ចូលផ្នែកមួយនៃទិន្នន័យខាងក្រោម}}',
+'passwordreset-emaildisabled' => 'មុខងារអ៊ីមែលត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។',
 'passwordreset-username' => 'អត្តនាម៖',
 'passwordreset-domain' => 'ដូម៉ែន៖',
 'passwordreset-capture' => 'មើលអ៊ីមែលលទ្ធផល?',
 'passwordreset-capture-help' => 'ប្រសិនបើអ្នកគូសធីកប្រអប់នេះ អ៊ីមែល (ដែលមានពាក្យសម្ងាត់បណ្ដោះអាសន្ន) មិនត្រូវបានបង្ហាញដូចគ្នានឹងអ៊ីមែលដែលនឹងត្រូវផ្ញើទៅទៅកាន់អ្នកប្រើប្រាស់ដែរ។',
 'passwordreset-email' => 'អាសយដ្ឋានអ៊ីមែល៖',
 'passwordreset-emailtitle' => 'ព័ត៌មានលំអិតពីគណនីនៅលើ {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំសារក្រើនរំលឹកពីព័ត៌មានពិស្ដារ
-អំពីគណនីរបស់អ្នកសំរាប់ {{SITENAME}} ($4)។ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះ
-មានជាប់ទាក់ទិននឹងអាស័យដ្ឋានអ៊ីមែលនេះ៖
+'passwordreset-emailtext-ip' => 'មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកសម្រាប់ {{SITENAME}} ($4)។ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះ
+មានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖
 
 $2
 
 {{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
-យកល្អអ្នកគួរតែកត់ឈ្មោះរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ 
-ឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\98á\9e¸á\9e\98á\9e½á\9e\99á\9f\94 á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e\98á\9e¶á\9e\93á\9e\93á\9e\9aá\9e\8eá\9e¶á\9e\98á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\93á\9f\81á\9f\87 
+ឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
 បំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
-'passwordreset-emailtext-user' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b $1 á\9e\93á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84 {{SITENAME}} á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\9fá\9e¶á\9e\9aá\9e\80á\9f\92á\9e\9aá\9e¾á\9e\93á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e¢á\9f\86á\9e\96á\9e¸á\9e\96á\9f\90á\9e\8fá\9f\8cá\9e\98á\9e¶á\9e\93á\9e\96á\9e·á\9e\9fá\9f\92á\9e\8aá\9e¶á\9e\9aá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\82á\9e\8eá\9e\93á\9e¸របស់អ្នកនៅក្នុង {{SITENAME}} ($4)។
- {{PLURAL:$3|á\9e\82á\9e\8eá\9e\93á\9e¸|á\9e\82á\9e\8eá\9e\93á\9e¸}}á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\8aá\9e¼á\9e\85á\9e\8fá\9e\91á\9f\85á\9e\93á\9f\81á\9f\87á\9e\98á\9e¶á\9e\93á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\91á\9e¶á\9e\80á\9f\8bá\9e\91á\9e·á\9e\93á\9e\93á\9e¹á\9e\84á\9e¢á\9e¶á\9e\9fá\9f\90á\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\93á\9f\81á\9f\87á\9f\96
+'passwordreset-emailtext-user' => 'á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b $1 á\9e\93á\9f\85á\9e\80á\9f\92á\9e\93á\9e»á\9e\84 {{SITENAME}} á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\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របស់អ្នកនៅក្នុង {{SITENAME}} ($4)។
+ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖
 
 $2
 
 {{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។
-យកល្អអ្នកគួរតែកត់ឈ្មោះរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ 
-ឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នកហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
\9e\99á\9e\80á\9e\9bá\9f\92á\9e¢á\9e¢á\9f\92á\9e\93á\9e\80á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bá\9e\9aá\9e½á\9e\85á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\98á\9e¸á\9e\98á\9e½á\9e\99á\9f\94 á\9e\94á\9f\92á\9e\9aá\9e\9fá\9e·á\9e\93á\9e\94á\9e¾á\9e\98á\9e¶á\9e\93á\9e\93á\9e\9aá\9e\8eá\9e¶á\9e\98á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8bá\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\93á\9f\81á\9f\87 
+ឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ
 បំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។',
 'passwordreset-emailelement' => 'អត្តនាម៖ $1
 ពាក្យសម្ងាត់បណ្ដោះអាសន្ន៖ $2',
-'passwordreset-emailsent' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80មួយត្រូវបានផ្ញើទៅហើយ។',
-'passwordreset-emailsent-capture' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80មួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។',
-'passwordreset-emailerror-capture' => 'á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9e\98á\9e½á\9e\99á\9e\8aá\9e¼á\9e\85á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e á\9e¾á\9e\99 á\9e\94á\9f\89á\9e»á\9e\93á\9f\92á\9e\8fá\9f\82á\9e\80á\9e¶á\9e\9aá\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85á\9e\80á\9e¶á\9e\93á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bមិនបានសំរេចទេ៖ $1',
+'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មួយត្រូវបានផ្ញើទៅហើយ។',
+'passwordreset-emailsent-capture' => 'á\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មួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។',
+'passwordreset-emailerror-capture' => 'á\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\8aá\9e¼á\9e\85á\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9e\84á\9f\92á\9e\80á\9e¾á\9e\8fá\9e á\9e¾á\9e\99 á\9e\94á\9f\89á\9e»á\9e\93á\9f\92á\9e\8fá\9f\82á\9e\80á\9e¶á\9e\9aá\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85á\9e\80á\9e¶á\9e\93á\9f\8b {{GENDER:$2|á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b}}មិនបានសំរេចទេ៖ $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល',
@@ -1020,9 +1068,10 @@ $2
 '''មិនត្រូវ​ដាក់ស្នើ​ការងារមានជាប់កម្មសិទ្ឋិបញ្ញាដោយគ្មានការអនុញ្ញាតទេ!'''",
 'longpageerror' => "'''បញ្ហា៖ អត្ថបទ​ដែល​អ្នក​បានដាក់​ស្នើ​មានទំហំ $1 គីឡូបៃ ដែលធំជាង​ទំហំអតិបរមា $2 គីឡូបៃ។'''
 អត្ថបទនេះ​មិនអាច​រក្សាទុកបានទេ។",
-'readonlywarning' => "'''ប្រយ័ត្ន:មូលដ្ឋានទិន្នន័យត្រូវបានចាក់សោសម្រាប់ការរក្សាទុក ដូច្នេះអ្នកនឹងមិនអាចរក្សាទុករាល់កំណែប្រែរបស់អ្នកបានទេឥឡូវនេះ។ សូមអ្នកចម្លងអត្ថបទ រួចដាក់ទៅក្នុងឯកសារដែលជាអត្ថបទ ហើយបន្ទាប់មករក្សាវាទុកនៅពេលក្រោយ។'''
+'readonlywarning' => "'''ប្រយ័ត្ន:មូលដ្ឋានទិន្នន័យត្រូវបានចាក់សោសម្រាប់ការរក្សាទុក ដូច្នេះអ្នកនឹងមិនអាចរក្សាទុករាល់កំណែប្រែរបស់អ្នកបានទេឥឡូវនេះ។'''
+សូមអ្នកចម្លងអត្ថបទ រួចដាក់ទៅក្នុងឯកសារដែលជាអត្ថបទ ហើយបន្ទាប់មករក្សាវាទុកនៅពេលក្រោយ។
 
\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\85á\9e¶á\9e\80á\9f\8bá\9e\9fá\9f\84á\9e\9cá\9e¶ á\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\93á\9e½វការពន្យល់ដូចតទៅ៖ $1",
\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e\97á\9e·á\9e\94á\9e¶á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\94á\9e¶á\9e\93á\9e\85á\9e¶á\9e\80á\9f\8bá\9e\9fá\9f\84á\9e\9cá\9e¶ á\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\93á\9e¼វការពន្យល់ដូចតទៅ៖ $1",
 'protectedpagewarning' => "'''ប្រយ័ត្ន៖ ទំព័រនេះ​ត្រូវបានចាក់សោ។ ដូច្នេះ​មានតែ​អ្នកប្រើប្រាស់​ដែល​មាន​អភ័យឯកសិទ្ឋិ​ជាអ្នកអភិបាលទេទើបអាច​កែប្រែ​វាបាន។'''
 
 ខាងក្រោមនេះជាកំណត់ហេតុចូលចុងក្រោយ៖",
@@ -1064,10 +1113,14 @@ $2
 
 ទំព័រនេះមានរួចហើយ។',
 'defaultmessagetext' => 'អត្ថបទសារតាមលំនាំដើម',
+'editwarning-warning' => 'ចាកចេញពីទំព័រនេះ នឹងធ្វើឲ្យអ្នកបាត់បង់កំណែប្រែដែលអ្នកបានធ្វើ។
+ប្រសិនបើអ្នកបាន​ឡុកអ៊ីនរួចហើយ អ្នកអាច​បិទ​បម្រាម​នេះ​នៅ​ក្នុងផ្នែក​ "{{int:prefs-editing}}" នៃ​ចំណូល​ចិត្ត​របស់​អ្នក​។',
 
 # Content models
 'content-model-wikitext' => 'អត្ថបទវិគី',
 'content-model-text' => 'អត្ថបទសុទ្ធ',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ប្រយ័ត្ន៖''' ទំព័រនេះមានប្រើអនុគមន៍ញែកច្រើនពេកហើយ។
@@ -1330,15 +1383,6 @@ $1",
 ក្នុង​ពេល​ឥឡូវ​នេះ​ អ្នកអាច​ស្វែង​រក​តាម​រយៈ​ Google បាន​។
 សូមចងចាំ​ថា​ លិបិក្រម​នៃ​មាតិការ​របស់​{{SITENAME}} អាចហួស​សម័យ​។​',
 
-# Quickbar
-'qbsettings' => 'របារទាន់ចិត្ត',
-'qbsettings-none' => 'ទទេ',
-'qbsettings-fixedleft' => 'ចុងខាងឆ្វេង',
-'qbsettings-fixedright' => 'ចុងខាងស្តាំ',
-'qbsettings-floatingleft' => 'អណ្តែតឆ្វេង',
-'qbsettings-floatingright' => 'អណ្តែតស្តាំ',
-'qbsettings-directionality' => 'នៅមួយកន្លែង, អាស្រ័យលើទិសដៅសរសេររបស់ភាសារបស់អ្នក',
-
 # Preferences page
 'preferences' => 'ចំណង់ចំណូលចិត្ត',
 'mypreferences' => 'ចំណង់ចំណូលចិត្ត​',
@@ -1354,7 +1398,7 @@ $1",
 'prefs-labs' => 'មុខងារពិសេសថ្មីៗដែលស្ថិតក្រោមការពិសោធន៍នៅឡើយ',
 'prefs-user-pages' => 'ទំព័រអ្នកប្រើប្រាស់',
 'prefs-personal' => 'ប្រវត្តិរូប',
-'prefs-rc' => 'á\9e\94á\9e\93á\9f\92លាស់ប្ដូរថ្មីៗ',
+'prefs-rc' => 'á\9e\94á\9f\86លាស់ប្ដូរថ្មីៗ',
 'prefs-watchlist' => 'បញ្ជីតាមដាន',
 'prefs-watchlist-days' => 'ចំនួនថ្ងៃត្រូវបង្ហាញក្នុងបញ្ជីតាមដាន៖',
 'prefs-watchlist-days-max' => 'អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}',
@@ -1848,7 +1892,6 @@ $1',
 
 # HTTP errors
 'http-invalid-url' => 'URLមិនត្រឹមត្រូវ៖ $1',
-'http-host-unreachable' => 'មិនអាចទៅកាន់URLបានទេ',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'មិនអាច ចូលទៅដល់ URL',
@@ -2246,7 +2289,7 @@ $1',
 'watchnologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
 'watchnologintext' => 'អ្នកចាំបាច់ត្រូវតែ[[Special:UserLogin|កត់ឈ្មោះចូល]]ដើម្បីកែប្រែបញ្ជីតាមដានរបស់អ្នក។',
 'addwatch' => 'បន្ថែមទៅបញ្ជីតាមដាន',
-'addedwatchtext' => "ទំព័រ \"[[:\$1]]\" ត្រូវបានដាក់បញ្ចូលទៅក្នុង​[[Special:Watchlist|បញ្ជីតាមដាន]]របស់លោកអ្នកហើយ ។ រាល់ការផ្លាស់ប្ដូរនៃទំព័រនេះ រួមទាំងទំព័រពិភាក្សារបស់វាផងដែរ នឹងត្រូវបានដាក់បញ្ចូលក្នុងបញ្ជីនៅទីនោះ។  ទំព័រនេះនឹងបង្ហាញជា'''អក្សរដិត''' នៅក្នុង [[Special:RecentChanges|បញ្ជីបំលាស់ប្ដូរថ្មីៗ]] ងាយស្រួលក្នុងការស្វែងរក។ ប្រសិនបើលោកអ្នកចង់យកវាចេញពី [[Special:Watchlist|បញ្ជីតាមដាន]]របស់លោកអ្នក សូមចុច '''ឈប់តាមដាន''' នៅលើរបារចំហៀងផ្នែកខាងលើ។",
+'addedwatchtext' => 'ទំព័រ "[[:$1]]" ត្រូវបានដាក់បញ្ចូលទៅក្នុង​[[Special:Watchlist|បញ្ជីតាមដាន]]របស់លោកអ្នកហើយ ។ រាល់ការផ្លាស់ប្ដូរនៃទំព័រនេះ រួមទាំងទំព័រពិភាក្សារបស់វាផងដែរ នឹងត្រូវបានដាក់បញ្ចូលក្នុងបញ្ជីនៅទីនោះ។',
 'removewatch' => 'ដកចេញពីបញ្ជីតាមដាន',
 'removedwatchtext' => 'ទំព័រ "[[:$1]]" ត្រូវបានដកចេញពី[[Special:Watchlist|បញ្ជីតាមដាន]]របស់លោកអ្នកហើយ ។',
 'watch' => 'តាមដាន',
@@ -2257,8 +2300,8 @@ $1',
 'notvisiblerev' => 'ការកែតម្រូវត្រូវបានលុបចោល',
 'watchnochange' => 'មិនមានរបស់ដែលអ្នកកំពុងតាមដានណាមួយត្រូវបានគេកែប្រែក្នុងកំលុងពេលដូលដែលបានបង្ហាញទេ។',
 'watchlist-details' => '{{PLURAL:$1|$1 page|ទំព័រ $1}}នៅក្នុងបញ្ជីតាមដានរបស់អ្នក ដោយមិនរាប់បញ្ចូលទំព័រពិភាក្សា។',
-'wlheader-enotif' => 'អនុញ្ញាតឱ្យមានការផ្ដល់ដំណឹងតាមរយៈអ៊ីមែល',
-'wlheader-showupdated' => "ទំព័រដែលត្រូវបានផ្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយរបស់អ្នក ត្រូវបានបង្ហាញជា '''អក្សរដិត'''",
+'wlheader-enotif' => 'អនុញ្ញាតឱ្យមានការផ្ដល់ដំណឹងតាមរយៈអ៊ីមែល',
+'wlheader-showupdated' => "ទំព័រដែលត្រូវបានផ្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយរបស់អ្នក ត្រូវបានបង្ហាញជា '''អក្សរដិត'''",
 'watchmethod-recent' => 'ឆែកមើលកំណែប្រែថ្មីៗចំពោះទំព័រត្រូវបានតាមដាន',
 'watchmethod-list' => 'ឆែកមើលទំព័រត្រូវបានតាមដានចំពោះកំណែប្រែថ្មីៗ',
 'watchlistcontains' => 'បញ្ជីតាមដាន របស់អ្នក មាន $1 {{PLURAL:$1|ទំព័រ|ទំព័រ}}។',
@@ -2276,7 +2319,7 @@ $1',
 'enotif_reset' => 'កត់សម្គាល់រាល់គ្រប់ទំព័រដែលបានចូលមើល',
 'enotif_impersonal_salutation' => 'អ្នកប្រើប្រាស់ {{SITENAME}}',
 'enotif_lastvisited' => 'ពិនិត្យ $1 សម្រាប់គ្រប់បន្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយ។',
-'enotif_lastdiff' => 'សូមពិនិត្យ$1ដើម្បីមើលបន្លាស់ប្តូរនេះ។',
+'enotif_lastdiff' => 'សូមពិនិត្យ $1 ដើម្បីមើលបំលាស់ប្តូរនេះ។',
 'enotif_anon_editor' => 'អ្នកប្រើប្រាស់អនាមិក $1',
 'enotif_body' => 'ជូនចំពោះ $WATCHINGUSERNAME ជាទីរាប់អាន,
 
@@ -2469,9 +2512,7 @@ $UNWATCHURL
 'undeletedrevisions' => 'បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}',
 'undeletedrevisions-files' => 'បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}និង{{PLURAL:$2|១ឯកសារ|$2ឯកសារ}}',
 'undeletedfiles' => '{{PLURAL:$1|១ ឯកសារ|$1 ឯកសារ}} ត្រូវបានស្ដារឡើងវិញ',
-'cannotundelete' => 'ឈប់លុបមិនសម្រេច។
-
-ប្រហែលជាមាននរណាម្នាក់ផ្សេងទៀតបានឈប់លុបទំព័រនេះមុនអ្នក។',
+'cannotundelete' => 'ឈប់លុបមិនសម្រេច៖​$1',
 'undeletedpage' => "'''$1 ត្រូវបានស្តារឡើងវិញហើយ'''
 
 សូម​ចូល​ទៅ [[Special:Log/delete|កំណត់ហេតុ​នៃ​ការលុប]] ដើម្បី​ពិនិត្យ​មើល​កំណត់ត្រា​នៃ​ការលុប​និង​ការ​ស្ដារ​ឡើង​វិញ​។",
@@ -2915,13 +2956,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */',
-'standard.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Standard */',
-'nostalgia.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Nostalgia */',
 'cologneblue.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Cologne Blue */',
 'monobook.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Monobook */',
-'myskin.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក MySkin */',
-'chick.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Chick */',
-'simple.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Simple */',
 'modern.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Modern */',
 'vector.css' => '/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Vector */',
 
@@ -2986,13 +3022,8 @@ $1',
 'pageinfo-protect-cascading-from' => 'ការការពារត្រូវបានដាក់ជាថ្នាក់ពី',
 
 # Skin names
-'skinname-standard' => 'បុរាណ',
-'skinname-nostalgia' => 'អាឡោះអាល័យ',
 'skinname-cologneblue' => 'ទឹកអប់ខៀវ',
 'skinname-monobook' => 'សៀវភៅឯក',
-'skinname-myskin' => 'សំបកខ្ញុំ',
-'skinname-chick' => 'កូនមាន់',
-'skinname-simple' => 'សាមញ្ញ',
 'skinname-modern' => 'ទំនើប',
 'skinname-vector' => 'វ៉ិចទ័រ​​',
 
@@ -3063,9 +3094,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 នាទី|$1 នាទី}}',
 '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' => 'អំបាញ់មិញនេះ',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => 'ទម្រង់ ដូចតទៅ ៖
 
@@ -3092,7 +3139,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ទទឹង',
 'exif-imagelength' => 'កម្ពស់',
 'exif-bitspersample' => '',
@@ -3201,7 +3248,7 @@ $1',
 'exif-originalimageheight' => 'កំពស់របស់រូបភាពមុនពេលកាត់តំរឹម',
 'exif-originalimagewidth' => 'ទទឹងរបស់រូបភាពមុនពេលកាត់តំរឹម',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'លែងបានបង្ហាប់',
 
 'exif-copyrighted-true' => 'រក្សាសិទ្ឋ',
@@ -3549,15 +3596,6 @@ $5
 'version-software-version' => 'កំណែ',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'ផ្លូវនៃឯកសារ',
-'filepath-page' => 'ឯកសារ៖',
-'filepath-submit' => 'ទៅ',
-'filepath-summary' => 'ទំព័រពិសេសនេះ បង្ហាញផ្លូវពេញលេញ នៃ មួយឯកសារ។
-រូបភាពត្រូវបានបង្ហាញ ជាភាពម៉ត់ខ្ពស់, ប្រភេទឯកសារ ដទៃទៀត ធ្វើការដោយផ្ទាល់ ជាមួយ សហកម្មវិធី ។
-
-បញ្ចូល ឈ្មោះឯកសារ ដោយគ្មានការភ្ជាប់ "{{ns:file}}:" នៅពីមុខវា ។',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ស្វែងរកឯកសារដូចគ្នាបេះបិទ',
 'fileduplicatesearch-legend' => 'ស្វែងរកឯកសារដូចគ្នាបេះបិទ',
@@ -3634,6 +3672,8 @@ $5
 'htmlform-submit' => 'ដាក់ស្នើ',
 'htmlform-reset' => 'ធ្វើដូចដើមវិញ',
 'htmlform-selectorother-other' => 'ផ្សេងទៀត',
+'htmlform-no' => 'ទេ',
+'htmlform-yes' => 'ព្រម',
 
 # New logging system
 'logentry-delete-delete' => '$1 បានលុបទំព័រ $3 ចោល',
index d703eab..1cd439c 100644 (file)
@@ -94,8 +94,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ಪುಟವನ್ನು ವೀಕ್ಷಿಸುತ್ತಿರುವ ಸದಸ್ಯರ ಸಂಖ್ಯೆಯನ್ನು ತೋರಿಸು',
 'tog-oldsig' => 'ಪ್ರಸ್ತುತ ಸಹಿ',
 'tog-fancysig' => 'ಸರಳ ಸಹಿಗಳು (ಕೊಂಡಿ ಇಲ್ಲದಿರುವಂತೆ)',
-'tog-externaleditor' => 'ಬಾಹ್ಯ ಸಂಪಾದನೆ ಸಲಕರಣೆಯನ್ನು ಯಾವಾಗಲೂ ಉಪಯೋಗಿಸು (ಅನುಭವ ಹೊಂದಿರುವ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ, ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ ವಿಶೇಷ ಬದಲಾವಣೆಗಳು ಬೇಕಾಗುತ್ತದೆ)',
-'tog-externaldiff' => 'ಬಾಹ್ಯ ಅಂತರದರ್ಶಕವನ್ನು ಯಾವಗಲೂ ಉಪಯೋಗಿಸು (ಅನುಭವ ಹೊಂದಿರುವ ಬಳಕೆದಾರರಿಗೆ ಮಾತ್ರ, ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ ವಿಶೇಷ ಬದಲಾವಣೆಗಳು ಬೇಕಾಗುತ್ತದೆ)',
 'tog-showjumplinks' => 'ಶಕ್ತಗೊಳಿಸಲು "ನೆಗೆ ಇಲ್ಲಿಗೆ" ಲಭ್ಯಕೆ ಕೊಡ',
 'tog-uselivepreview' => 'ನೇರ ಮುನ್ನೋಟವನ್ನು ಉಪಯೋಗಿಸು (JavaScript) (ಪ್ರಾಯೋಗಿಕ)',
 'tog-forceeditsummary' => 'ಸಂಪಾದನೆ ಸಾರಾಂಶವನ್ನು ಖಾಲಿ ಬಿಟ್ಟಲ್ಲಿ ನೆನಪಿಸು',
@@ -109,6 +107,7 @@ $messages = array(
 'tog-diffonly' => 'ವ್ಯತ್ಯಾಸಗಳ ಕೆಳಗಿರುವ ಪುಟದ ವಿವರಗಳನ್ನು ತೋರಿಸಬೇಡ',
 'tog-showhiddencats' => 'ಅಡಗಿಸಲ್ಪಟ್ಟ ವರ್ಗಗಳನ್ನು ತೋರಿಸು',
 'tog-norollbackdiff' => 'ತೊಡೆದುಹಾಕಿದ ನಂತರ ವ್ಯತ್ಯಸವನ್ನು ಬಿದು',
+'tog-useeditwarning' => 'ಸಂಪಾದನೆಯನ್ನು ಉಳಿಸದೆ ಹೊರಟಲ್ಲಿ ನನಗೆ ಎಚ್ಚರಿಸು',
 
 'underline-always' => 'ಯಾವಾಗಲೂ',
 'underline-never' => 'ಎಂದಿಗೂ ಇಲ್ಲ',
@@ -197,6 +196,7 @@ $messages = array(
 'newwindow' => '(ಹೊಸ ಕಿಟಕಿಯನ್ನು ತೆರೆಯುತ್ತದೆ)',
 'cancel' => 'ವಜಾ ಮಾಡಿ',
 'moredotdotdot' => 'ಇನ್ನಷ್ಟು...',
+'morenotlisted' => 'ಹೆಚ್ಚಿನದನ್ನು ಪಟ್ಟಿಮಾಡಲಾಗಿಲ್ಲ...',
 'mypage' => 'ಪುಟ',
 'mytalk' => 'ಚರ್ಚೆ',
 'anontalk' => 'ಈ ಐ.ಪಿ ಗೆ ಮಾತನಾಡಿ',
@@ -322,6 +322,7 @@ $messages = array(
 'youhavenewmessages' => 'ನಿಮಗೆ $1 ಇವೆ ($2).',
 'newmessageslink' => 'ಹೊಸ ಸಂದೇಶಗಳು',
 'newmessagesdifflink' => 'ಕೊನೆಯ ಬದಲಾವಣೆ',
+'newmessagesdifflinkplural' => 'ಕಡೆಯ {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}',
 'youhavenewmessagesmulti' => '$1 ಅಲ್ಲಿ ನಿಮಗೆ ಹೊಸ ಸಂದೇಶಗಳಿವೆ',
 'editsection' => 'ಬದಲಾಯಿಸಿ',
 'editold' => 'ಬದಲಾಯಿಸಿ',
@@ -371,12 +372,12 @@ $messages = array(
 # General errors
 'error' => 'ದೋಷ',
 'databaseerror' => 'ಡೇಟಬೇಸ್ ದೋಷ',
-'dberrortext' => '!!FUZZY!ಒಂದು ಡೇಟಾಬೇಸ್ ನಿಮ್ಮಪ್ರಶ್ನೆಗೆ ಸಿಂಟಾಕ್ಸ್ ತಪ್ಪು ಸಂಭವಿಸಿದೆ
+'dberrortext' => 'ಒಂದು ಡೇಟಾಬೇಸ್ ನಿಮ್ಮಪ್ರಶ್ನೆಗೆ ಸಿಂಟಾಕ್ಸ್ ತಪ್ಪು ಸಂಭವಿಸಿದೆ
 ಈ ಸಾಫ್ಟ್ವೇರ್ ಒಂದು ದೋಷವನ್ನು ನಿವಾರಿಸಲಾಗಿದೆ ಸೂಚಿಸಬಹುದು.
 ಕೊನೆಯ ಪ್ರಯತ್ನ ಡೇಟಾಬೇಸ್ ನಿಮ್ಮಪ್ರಶ್ನೆಗೆ ಮಾಡಲಾಯಿತು:
-<blockquote><tt>$1</tt></blockquote>
-ಕ್ರಿಯೆ ಒಳಗಿನಿಂದಲೇ "<tt>$2</tt>" 
-ಡೇಟಾಬೇಸ್ ದೋಷವನ್ನು ತಿಳಿಸಿದೆ"<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+ಕ್ರಿಯೆ ಒಳಗಿನಿಂದಲೇ "<code>$2</code>" 
+ಡೇಟಾಬೇಸ್ ದೋಷವನ್ನು ತಿಳಿಸಿದೆ"<code>$3: $4</code>".',
 'dberrortextcl' => 'ಡೇಟಾಬೇಸ್ ಪ್ರಶ್ನೆಯ ವಿನ್ಯಾಸದಲ್ಲಿ ದೋಷ ಉಂಟಾಗಿದೆ.
 ಕೊನೆಯದಾಗಿ ಪ್ರಯತ್ನಿಸಲಾದ ಡೇಟಾಬೇಸ್ ಪ್ರಶ್ನೆಯು:
 "$1"
@@ -410,7 +411,7 @@ MySQL ಹಿಂದಿರುಗಿಸಿದ ದೋಷ "$3: $4"',
 'unexpected' => 'ಅನಿರೀಕ್ಷಿತ ಮೌಲ್ಯ: "$1"="$2".',
 'formerror' => 'ದೋಷ: ಅರ್ಜಿ ಕಳುಹಿಸಲಾಗಲಿಲ್ಲ',
 'badarticleerror' => 'ಈ ಪುಟದ ಮೇಲೆ ನೀವು ಪ್ರಯತ್ನಿಸಿದ ಕಾರ್ಯವನ್ನು ನಡೆಸಲಾಗದು.',
-'cannotdelete' => 'ಈ ಪುಟ ಅಥವಾ ಚಿತ್ರವನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ. (ಬೇರೊಬ್ಬ ಸದಸ್ಯರಿಂದ ಆಗಲೇ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು.)',
+'cannotdelete' => '"$1" ಈ ಪುಟ ಅಥವಾ ಚಿತ್ರವನ್ನು ಅಳಿಸಲಾಗಲಿಲ್ಲ. (ಬೇರೊಬ್ಬ ಸದಸ್ಯರಿಂದ ಆಗಲೇ ಅಳಿಸಲ್ಪಟ್ಟಿರಬಹುದು.)',
 'cannotdelete-title' => '"$1" ಪುಟವನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ',
 'badtitle' => 'ಸರಿಯಿಲ್ಲದ ಹೆಸರು',
 'badtitletext' => 'ನೀವು ಕೋರಿದ ಪುಟದ ಶೀರ್ಷಿಕೆ ಸಿಂಧುವಲ್ಲದ್ದು ಅಥವ ಖಾಲಿ ಅಥವ ಸರಿಯಾದ ಕೊಂಡಿಯಲ್ಲದ ಅಂತರ-ಭಾಷೆ/ಅಂತರ-ವಿಕಿ ಸಂಪರ್ಕವಾಗಿದೆ.
@@ -428,11 +429,21 @@ MySQL ಹಿಂದಿರುಗಿಸಿದ ದೋಷ "$3: $4"',
 'cascadeprotected' => 'ಈ ಪುಟವು ಸಂಪಾದನೆ ಮಾಡಲಾಗದಂತೆ ಸಂರಕ್ಷಿಸಲಾಗಿದೆ. ಇದಕ್ಕೆ ಕಾರಣ ಈ ಪುಟವನ್ನು ಈ ಕೆಳಗಿನ ತಡಸಲು-ಸಂರಕ್ಷಣೆ ಅಳವಡಿಸಲಾದ {{PLURAL:$1|ಪುಟದಲ್ಲಿ|ಪುಟಗಳಲ್ಲಿ}} ಉಪಯೋಗಿಸಲಾಗಿದೆ:
 $2',
 'namespaceprotected' => "ನಿಮಗೆ '''$1''' ಪುಟಪ್ರಬೇಧಕ್ಕೆ ಸೇರಿರುವ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸುವ ಅನುಮತಿ ಇಲ್ಲ.",
+'customcssprotected' => 'ಈ ಸಿಎಸ್ಎಸ್ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಈ ಪುಟವು ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರನ ವಯುಕ್ತಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ಹೊಂದಿರುವುದರಿಂದ ಅನುಮತಿ ಇಲ್ಲ',
+'customjsprotected' => 'ಈ ಜಾವಾ ಸ್ಕ್ರಿಪ್ಟ್ ಪುಟವನ್ನು ಸಂಪಾದಿಸಲು ಈ ಪುಟವು ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರನ ವಯುಕ್ತಿಕ ವ್ಯವಸ್ಥೆಯನ್ನು ಹೊಂದಿರುವುದರಿಂದ ಅನುಮತಿ ಇಲ್ಲ',
 'ns-specialprotected' => 'ವಿಶೇಷ ಪುಟಗಳನ್ನು ಸಂಪಾದಿಸಲು ಆಗುವುದಿಲ್ಲ.',
 'titleprotected' => "ಈ ಹೆಸರಿನ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಲಾಗದಂತೆ [[User:$1|$1]] ಅವರು ಸಂರಕ್ಷಿಸಿದ್ದಾರೆ.
 ಸಂರಕ್ಷಣೆಗೆ ನೀಡಿರುವ ಕಾರಣ: ''$2''.",
+'filereadonlyerror' => '"$1" ಕಡತವು ಓದಲು ಮಾತ್ರ ಸಾದ್ಯವಿರುವ ರೀತಿಯಲ್ಲಿರುವ"$2" ಸಂಪುಟದಲ್ಲಿರುವುದರಿಂದ ಇದನ್ನು  ಮಾರ್ಪಡಿಸಲು ಸಾದ್ಯವಾಗುತ್ತಿಲ್ಲ.
+ಇದನ್ನು ಬದ್ದಗೊಳಿಸಿರುವ ನಿರ್ವಾಹಕರು "$3" ಈ ವಿವರಣೆಯನ್ನು ನೀಡುತ್ತಿದ್ದಾರೆ.',
+'invalidtitle-knownnamespace' => '"$2"ನೇಮ್ ಸ್ಪೇಸ್ ಮತ್ತು "$3"ಪಠ್ಯದೊಂದಿಗೆ ಅಸಮಂಜಸ ತಲೆಬರಹ',
+'invalidtitle-unknownnamespace' => '$1ನೇಮ್ ಸ್ಪೇಸ್ ಮತ್ತು "$2"ಪಠ್ಯದೊಂದಿಗೆ ಅಸಮಂಜಸ ತಲೆಬರಹ',
+'exception-nologin' => 'ಲಾಗಿನ್ ಆಗಿಲ್ಲ',
+'exception-nologin-text' => 'ಈ ಪುಟ ಅಥವಾ ಚಟುವಟಿಕೆಗೆ ನೀವು ಈ ವಿಕಿಗೆ ಲಾಗಿನ್ ಆಗಿರಬೇಕಾಗಿರುತ್ತದೆ',
 
 # Virus scanner
+'virus-badscanner' => "ಅಸಮಂಜಸ ವಿನ್ಯಾಸ:ಅಪರಿಚಿತ ವೈರಸ್ ಸ್ಕಾನರ್:''$1''",
+'virus-scanfailed' => 'ಸ್ಕಾನ್ ವಿಫಲ (code $1)',
 'virus-unknownscanner' => 'ಅಪರಿಚಿತ ವೈರಾಣುನಾಶಕ:',
 
 # Login and logout pages
@@ -440,10 +451,20 @@ $2',
 
 ನೀವು {{SITENAME}} ಅನ್ನು ಅನಾಮಧೇಯವಾಗಿ ಉಪಯೋಗಿಸಬಹುದು, ಅಥವ ಮತ್ತೆ ಇದೇ ಹೆಸರಿನಲ್ಲಿ ಅಥವ ಬೇರೆ ಹೆಸರಿನಲ್ಲಿ <span class='plainlinks'>[$1 ಲಾಗ್ ಇನ್]</span> ಆಗಬಹುದು.
 ಗಮನಿಸಿ: ನಿಮ್ಮ ಬ್ರೌಸರ್‍ನ cache ಅನ್ನು ಅಳಿಸುವವರೆಗೂ ಕೆಲವು ಪುಟಗಳು ನೀವಿನ್ನೂ ಲಾಗ್ ಇನ್ ಆಗಿರುವಂತೆ ಪ್ರದರ್ಶಿತವಾಗಬಹುದು.",
+'welcomeuser' => 'ಸುಸ್ವಾಗತ,$1!',
+'welcomecreation-msg' => 'ನಿಮ್ಮ ಖಾತೆ ತೆರೆಯಲಾಗಿದೆ.ನಿಮ್ಮ [[Special:Preferences|{{SITENAME}} preferences]]ಬದಲಾಯಿಸಲು ಮರೆಯಬೇಡಿ.',
 'yourname' => 'ನಿಮ್ಮ ಬಳಕೆಯ ಹೆಸರು',
 'yourpassword' => 'ನಿಮ್ಮ ಪ್ರವೇಶಪದ',
+'userlogin-yourpassword' => 'ಪ್ರವೇಶಪದ',
+'userlogin-yourpassword-ph' => 'ನಿಮ್ಮ ಪ್ರವೇಶಪದ ನಮೂದಿಸಿ',
+'createacct-yourpassword-ph' => 'ಪ್ರವೇಶಪದ ಒಂದನ್ನು ನಮೂದಿಸಿ',
 'yourpasswordagain' => 'ಪ್ರವೇಶ ಪದ ಮತ್ತೊಮ್ಮೆ ಟೈಪ್ ಮಾಡಿ',
+'createacct-yourpasswordagain' => 'ಪ್ರವೇಶಪದವನ್ನು ಧೃಡೀಕರಿಸಿ',
+'createacct-yourpasswordagain-ph' => 'ಪ್ರವೇಶಪದವನ್ನು ಮತ್ತೊಮ್ಮೆ ನಮೂದಿಸಿ',
 'remembermypassword' => 'ಈ ಗಣಕಯಂತ್ರದಲ್ಲಿ ನನ್ನ ಲಾಗಿನ್ ನೆನಪಿನಲ್ಲಿಟ್ಟುಕೊ (ಗರಿಷ್ಠ $1 {{PLURAL:$1|ದಿನದ|ದಿನಗಳ}}ವರೆಗೆ)',
+'securelogin-stick-https' => 'ಲಾಗಿನ್ ಆದ ಬಳಿಕ HTTPS ನ ಸಂಪರ್ಕದಲ್ಲಿರಿ.',
+'yourdomainname' => 'ನಿಮ್ಮ ಕ್ಷೇತ್ರ:',
+'password-change-forbidden' => 'ನೀವು ಈ ವಿಕಿಯಲ್ಲಿ ಪ್ರವೇಶಪದವನ್ನು ಬದಲಾಯಿಸಲು ಸಾದ್ಯವಿಲ್ಲ.',
 'login' => 'ಲಾಗ್ ಇನ್',
 'nav-login-createaccount' => 'ಲಾಗ್ ಇನ್ - log in',
 'loginprompt' => '{{SITENAME}} ತಾಣಕ್ಕೆ ಲಾಗ್ ಇನ್ ಆಗಲು ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿ ಕುಕೀ (cookie) ಸೌಲಭ್ಯವಿರಬೇಕು.',
@@ -627,7 +648,7 @@ $2',
 ಅಥವ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟವನ್ನು ಸಂಪಾದಿಸಬಹುದು]</span>.',
 'noarticletext-nopermission' => 'ಈ ಪುಟದಲ್ಲಿ ಸದ್ಯಕ್ಕೆ ಯಾವ ಪಠ್ಯವೂ ಇಲ್ಲ.
 ನೀವು ಇತರ ಪುಟಗಳಲ್ಲಿ [[ವಿಶೇಷ:Search/{{PAGENAME}}|ಈ ಶೀರ್ಷಿಕೆಗಾಗಿ ಹುಡುಕಬಹುದು]],
-à²\85ಥವಾ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à²¸à²\82ಬà²\82ಧಿಸಿದ à²¦à²¾à²\96ಲಾತಿ à²¹à³\81ಡà³\81à²\95ಿ]</span>.',
+à²\85ಥವಾ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à²¸à²\82ಬà²\82ಧಿಸಿದ à²¦à²¾à²\96ಲಾತಿ à²¹à³\81ಡà³\81à²\95ಬಹà³\81ದà³\81]</span>, à²\86ದರà³\86 à²¨à²¿à²®à²\97à³\86 à²\88 à²ªà³\81à²\9fವನà³\8dನà³\81 à²¸à²\82ಪಾದಿಸಲà³\81 à²\85ನà³\81ಮತಿಯಿಲà³\8dಲ.',
 'userpage-userdoesnotexist' => 'ಬಳಕೆದಾರ ಖಾತೆ "<nowiki>$1</nowiki>" ದಾಖಲಾಗಿಲ್ಲ. ನೀವು ಇದೇ ಪುಟವನ್ನು ಸೃಷ್ಟಿ/ಸಂಪಾದನೆ ಮಾಡಬೇಕೆಂದಿರುವಿರಿ ಎಂದು ಖಾತ್ರಿ ಮಾಡಿಕೊಳ್ಳಿ.',
 'blocked-notice-logextract' => 'ಈ ಬಳಕೆದಾರರನ್ನು  ಪ್ರಸ್ತುತವಾಗಿ  ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. 
 ಇತ್ತೀಚಿನ  ನಿರ್ಬಂಧನೆಯ ದಾಖಲೆಯನ್ನು ಉಲ್ಲೇಖಕ್ಕಾಗಿ ಕೆಳಗೆ ಕೊಟ್ಟಿದೆ:',
@@ -640,7 +661,8 @@ $2',
 'sitejspreview' => "'''ನೆನಪಿಡಿ: ನೀವು ಇಲ್ಲಿ ಕೇವಲ ನಿಮ್ಮ ಬಳಕೆದಾರ CSSನ ಮುನ್ನೋಟ ನೋಡುತ್ತಿರುವಿರಿ.''''''ಅದನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ!'''",
 'updated' => '(ನಕಲೆರಿಸಲಾಗಿದೆ)',
 'note' => "'''ಸೂಚನೆ:'''",
-'previewnote' => "'''ಇದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟವನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಮರೆಯದಿರಿ!'''",
+'previewnote' => "'''ಇದು ಕೇವಲ ಮುನ್ನೋಟ.'''
+ಪುಟವನ್ನು ಇನ್ನೂ ಉಳಿಸಲಾಗಿಲ್ಲ ಎಂಬುದನ್ನು ಮರೆಯದಿರಿ!",
 'continue-editing' => 'ಸಂಪಾದನೆಯ ಪ್ರದೇಶಕ್ಕೆ  ಹೋಗಿ',
 'editing' => "'$1' ಲೇಖನ ಬದಲಾಯಿಸಲಾಗುತ್ತಿದೆ",
 'editingsection' => '$1 (ವಿಭಾಗ) ಅನ್ನು ಸಂಪಾದಿಸುತ್ತಿರುವಿರಿ',
@@ -816,7 +838,7 @@ $2',
 'compareselectedversions' => 'ಆಯ್ಕೆ ಮಾಡಿದ ಆವೃತ್ತಿಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಿ ನೋಡಿ',
 'showhideselectedversions' => 'ಆಯ್ದ ಆವೃತ್ತಿಗಳನ್ನು ತೋರಿಸು/ಅಡಗಿಸು',
 'editundo' => 'ಹಿಂದಿನಂತೆ',
-'diff-multi' => '(ಮಧ್ಯದಲ್ಲಿ ಆಗಿರುವ {{PLURAL:$1|೧ ಬದಲಾವಣೆಯನ್ನು|$1 ಬದಲಾವಣೆಗಳನ್ನು}} ತೋರಿಸಲಾಗಿಲ್ಲ.)',
+'diff-multi' => '(ಮಧ್ಯದಲ್ಲಿ {{PLURAL:$2|ಒಬ್ಬ|$2}} ಸದಸ್ಯರಿಂದ ಆಗಿರುವ {{PLURAL:$1|೧ ಬದಲಾವಣೆಯನ್ನು|$1 ಬದಲಾವಣೆಗಳನ್ನು}} ತೋರಿಸಲಾಗಿಲ್ಲ.)',
 
 # Search results
 'searchresults' => 'ಶೋಧನೆಯ ಫಲಿತಾಂಶಗಳು',
@@ -878,11 +900,6 @@ $2',
 ಈ ವೇಳೆಯಲ್ಲಿ ನೀವು ಗೂಗಲ್ ಉಪಯೋಗಿಸಿ ಹುಡುಕಾಟ ನಡೆಸಬಹುದು.
 ಗಮನಿಸಿ: ಅವರ {{SITENAME}} ಮಾಹಿತಿಯು ಪ್ರಸಕ್ತವಾಗಿಲ್ಲದಿರಬಹುದು.',
 
-# Quickbar
-'qbsettings-none' => 'ಯಾವುದೂ ಇಲ್ಲ',
-'qbsettings-floatingleft' => 'ಎಡಕ್ಕ ತೇಲುತ್ತಿದೆ',
-'qbsettings-floatingright' => 'ಬಲಕ್ಕೆ ತೇಲುತ್ತಿದೆ',
-
 # Preferences page
 'preferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
 'mypreferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
@@ -947,8 +964,7 @@ $2',
 'gender-female' => 'ಸ್ತ್ರೀ',
 'email' => 'ಇ-ಅಂಚೆ',
 'prefs-help-realname' => 'ನಿಜ ಹೆಸರು ನೀಡುವುದು ಐಚ್ಛಿಕ. ನೀವು ಅದನ್ನು ನೀಡಿದಲ್ಲಿ ನಿಮ್ಮ ಕಾಣಿಕೆಗಳಿಗೆ ನಿಮಗೆ ಮನ್ನಣೆ ನೀಡಲಾಗುವುದು.',
-'prefs-help-email' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಕಡ್ಡಾಯವಲ್ಲ, ಆದರೆ ನೀವು ಅದನ್ನು ನೀಡಿದರೆ ನೀವು ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಮರೆತರೆ ಅದನ್ನು ನಿಮಗೆ ಇ-ಅಂಚೆಯಿಂದ ಕಳುಹಿಸಿಬಹುದು.
-ಅಲ್ಲದೆ ಬೇರೆಯವರು ನಿಮ್ಮನ್ನು ಇತರರಿಗೆ ತಿಳಿಯದಂತೆ ನಿಮ್ಮ ಸದಸ್ಯ ಪುಟ ಅಥವ ಚರ್ಚೆ ಪುಟದ ಮೂಲಕ ಸಂಪರ್ಕಿಸಬಹುದು.',
+'prefs-help-email' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಕಡ್ಡಾಯವಲ್ಲ, ಆದರೆ ನೀವು ಅದನ್ನು ನೀಡಿದರೆ ನೀವು ನಿಮ್ಮ ಪ್ರವೇಶ ಪದವನ್ನು ಮರೆತರೆ ಅದನ್ನು ನಿಮಗೆ ಇ-ಅಂಚೆಯಿಂದ ಕಳುಹಿಸಿಬಹುದು.',
 'prefs-help-email-required' => 'ಇ-ಅಂಚೆ ವಿಳಾಸ ಬೇಕಾಗಿದೆ.',
 'prefs-i18n' => 'ಅಂತರರಾಷ್ಟ್ರೀಕರಣ',
 'prefs-signature' => 'ಸಹಿ',
@@ -1473,7 +1489,7 @@ $2',
 'unwatchthispage' => 'ವೀಕ್ಷಣೆ ನಿಲ್ಲಿಸು',
 'notvisiblerev' => 'ಆವೃತ್ತಿಯನ್ನು ಅಳಿಸಲಾಗಿದೆ',
 'watchlist-details' => 'ಚರ್ಚೆ ಪುಟಗಳನ್ನು ಹೊರತುಪಡಿಸಿ, ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ {{PLURAL:$1|$1 ಪುಟ ಇದೆ|$1 ಪುಟಗಳು ಇವೆ}}.',
-'wlheader-showupdated' => "ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
+'wlheader-showupdated' => "ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
 'watchmethod-recent' => 'ಇತ್ತೀಚಿನ ಸಂಪಾದನೆಗಳಲ್ಲಿ ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರುವ ಪುಟಗಳ ಹುಡುಕು',
 'watchmethod-list' => 'ವೀಕ್ಷಣಾಪಟ್ಟಿಗೆ ಸೇರುವ ಪುಟಗಳಲ್ಲಿ ಇತ್ತೀಚಿನ ಸಂಪಾದನೆಗಳಿಗೆ ಹುಡುಕು',
 'watchlistcontains' => 'ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ $1 {{PLURAL:$1|ಪುಟ|ಪುಟಗಳು}} ಇವೆ.',
@@ -1591,7 +1607,7 @@ $2',
 'blanknamespace' => '(ಮುಖ್ಯ)',
 
 # Contributions
-'contributions' => 'ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು',
+'contributions' => '{{GENDER:$1|User}} ಕಾಣಿಕೆಗಳು',
 'contributions-title' => '$1 ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು',
 'mycontris' => 'ಕಾಣಿಕೆಗಳು',
 'contribsub2' => '$1 ($2) ಗೆ',
@@ -1665,7 +1681,7 @@ $2',
 'ipusubmit' => 'ಈ ವಿಳಾಸದ ತಡೆಯನ್ನು ತೆಗೆ',
 'unblocked' => '[[User:$1|$1]] ಖಾತೆಯ ತಡೆಯನ್ನು ತೆಗೆಯಲಾಗಿದೆ',
 'unblocked-id' => '$1 ತಡೆಯನ್ನು ತೆಗೆಯಲಾಗಿದೆ',
-'ipblocklist' => 'ನಿರ್ಬಂಧಿಸಲಾಗಿರುವ IP ವಿಳಾಸಗಳು ಹಾಗೂ ಬಳಕೆಯ ಹೆಸರುಗಳು',
+'ipblocklist' => 'ನಿರ್ಬಂಧಿಸಲಾಗಿರುವ ಸದಸ್ಯರು',
 'ipblocklist-legend' => 'ತಡೆಹಿಡಿಯಲಾದ ಬಳಕೆದಾರನನ್ನು ಹುಡುಕು',
 'ipblocklist-submit' => 'ಹುಡುಕು',
 'infiniteblock' => 'ಅನಂತ',
@@ -1930,7 +1946,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ಅಗಲ',
 'exif-imagelength' => 'ಎತ್ತರ',
 'exif-bitspersample' => 'ಪ್ರತಿ ಭಾಗಕ್ಕಿರುವ ಬಿಟ್‍ಗಳು',
@@ -2131,11 +2147,6 @@ $5
 'version-software-product' => 'ಉತ್ಪನ್ನ',
 'version-software-version' => 'ಆವೃತ್ತಿ',
 
-# Special:FilePath
-'filepath' => 'ಫೈಲಿನ ಮಾರ್ಗ',
-'filepath-page' => 'ಫೈಲು:',
-'filepath-submit' => 'ಹೋಗು',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ದ್ವಿಪ್ರತಿ ಫೈಲುಗಳಿಗೆ ಹುಡುಕು',
 'fileduplicatesearch-legend' => 'ದ್ವಿಪ್ರತಿಯನ್ನು ಹುಡುಕು',
index 4ceaff4..0ed5744 100644 (file)
@@ -80,7 +80,7 @@ $specialPageAliases = array(
        'ChangePassword'            => array( '비밀번호바꾸기', '비밀번호변경', '비밀단어바꾸기', '비밀단어변경' ),
        'ComparePages'              => array( '문서비교' ),
        'Confirmemail'              => array( '이메일인증' ),
-       'Contributions'             => array( '기여', '기여목록', '사용자기여' ),
+       'Contributions'             => array( '기여', '기여목록' ),
        'CreateAccount'             => array( '계정만들기', '가입' ),
        'Deadendpages'              => array( '막다른문서' ),
        'DeletedContributions'      => array( '삭제된기여' ),
@@ -94,14 +94,14 @@ $specialPageAliases = array(
        'Filepath'                  => array( '파일경로', '그림경로' ),
        'Import'                    => array( '가져오기' ),
        'Invalidateemail'           => array( '이메일인증취소', '이메일인증해제' ),
-       'JavaScriptTest'            => array( '자바스크립트시험' ),
-       'BlockList'                 => array( '차단된사용자', '차단목록' ),
+       'JavaScriptTest'            => array( '자바스크립트시험', '자바스크립트테스트' ),
+       'BlockList'                 => array( '차단된사용자', '차단목록', 'IP차단목록' ),
        'LinkSearch'                => array( '링크찾기', '링크검색' ),
        'Listadmins'                => array( '관리자', '관리자목록' ),
        'Listbots'                  => array( '봇', '봇목록' ),
        'Listfiles'                 => array( '파일', '그림', '파일목록', '그림목록' ),
        'Listgrouprights'           => array( '사용자권한', '권한목록' ),
-       'Listredirects'             => array( '넘겨주기', '넘겨주기목록' ),
+       'Listredirects'             => array( '넘겨주기목록' ),
        'Listusers'                 => array( '사용자', '사용자목록' ),
        'Lockdb'                    => array( 'DB잠금', 'DB잠그기' ),
        'Log'                       => array( '기록', '로그' ),
@@ -116,13 +116,14 @@ $specialPageAliases = array(
        'Mostlinkedcategories'      => array( '많이쓰는분류' ),
        'Mostlinkedtemplates'       => array( '많이쓰는틀' ),
        'Mostrevisions'             => array( '역사긴문서' ),
-       'Movepage'                  => array( '이동', '문서이동' ),
+       'Movepage'                  => array( 'ì\98®ê¸°ê¸°', '문ì\84\9cì\98®ê¸°ê¸°', 'ì\9d´ë\8f\99', '문ì\84\9cì\9d´ë\8f\99' ),
        'Mycontributions'           => array( '내기여', '내기여목록' ),
        'Mypage'                    => array( '내사용자문서' ),
        'Mytalk'                    => array( '내사용자토론' ),
        'Myuploads'                 => array( '내가올린파일' ),
        'Newimages'                 => array( '새파일', '새그림' ),
        'Newpages'                  => array( '새문서' ),
+       'PagesWithProp'             => array( '속성별문서' ),
        'PasswordReset'             => array( '비밀번호재설정', '비밀단어재설정', '비밀번호초기화', '비밀단어초기화' ),
        'PermanentLink'             => array( '고유링크', '영구링크' ),
        'Popularpages'              => array( '인기있는문서' ),
@@ -134,6 +135,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( '임의넘겨주기' ),
        'Recentchanges'             => array( '최근바뀜' ),
        'Recentchangeslinked'       => array( '링크최근바뀜' ),
+       'Redirect'                  => array( '넘겨주기' ),
        'Revisiondelete'            => array( '특정판삭제' ),
        'Search'                    => array( '찾기', '검색' ),
        'Shortpages'                => array( '짧은문서' ),
@@ -169,7 +171,7 @@ $specialPageAliases = array(
 $magicWords = array(
        'redirect'                  => array( '0', '#넘겨주기', '#REDIRECT' ),
        'notoc'                     => array( '0', '__목차숨김__', '__NOTOC__' ),
-       'nogallery'                 => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
+       'nogallery'                 => array( '0', '__갤러리숨김__', '__화랑숨김__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__목차보임__', '__목차표시__', '__FORCETOC__' ),
        'toc'                       => array( '0', '__목차__', '__TOC__' ),
        'noeditsection'             => array( '0', '__부분편집숨김__', '__문단편집숨김__', '__단락편집숨김__', '__NOEDITSECTION__' ),
@@ -182,7 +184,7 @@ $magicWords = array(
        'currentday2'               => array( '1', '현재일2', 'CURRENTDAY2' ),
        'currentdayname'            => array( '1', '현재요일', 'CURRENTDAYNAME' ),
        'currentyear'               => array( '1', '현재년', 'CURRENTYEAR' ),
-       'currenttime'               => array( '1', '현재시분', '현재시각', 'CURRENTTIME' ),
+       'currenttime'               => array( '1', '현재시각', '현재시분', 'CURRENTTIME' ),
        'currenthour'               => array( '1', '현재시', 'CURRENTHOUR' ),
        'localmonth'                => array( '1', '지역월', 'LOCALMONTH', 'LOCALMONTH2' ),
        'localmonth1'               => array( '1', '지역월1', 'LOCALMONTH1' ),
@@ -215,6 +217,8 @@ $magicWords = array(
        'fullpagenamee'             => array( '1', '전체문서이름E', 'FULLPAGENAMEE' ),
        'subpagename'               => array( '1', '하위문서이름', 'SUBPAGENAME' ),
        'subpagenamee'              => array( '1', '하위문서이름E', 'SUBPAGENAMEE' ),
+       'rootpagename'              => array( '1', '최상위문서이름', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', '최상위문서이름E', 'ROOTPAGENAMEE' ),
        'basepagename'              => array( '1', '상위문서이름', 'BASEPAGENAME' ),
        'basepagenamee'             => array( '1', '상위문서이름E', 'BASEPAGENAMEE' ),
        'talkpagename'              => array( '1', '토론문서이름', 'TALKPAGENAME' ),
@@ -287,6 +291,8 @@ $magicWords = array(
        'uc'                        => array( '0', '대문자:', 'UC:' ),
        'raw'                       => array( '0', '원본:', 'RAW:' ),
        'displaytitle'              => array( '1', '제목보이기', '제목표시', 'DISPLAYTITLE' ),
+       'rawsuffix'                 => array( '1', '원', 'R' ),
+       'nocommafysuffix'           => array( '0', '구분자없음', 'NOSEP' ),
        'newsectionlink'            => array( '1', '__새글쓰기__', '__NEWSECTIONLINK__' ),
        'nonewsectionlink'          => array( '1', '__새글쓰기숨기기__', '__NONEWSECTIONLINK__' ),
        'currentversion'            => array( '1', '현재버전', 'CURRENTVERSION' ),
@@ -358,7 +364,7 @@ $messages = array(
 'tog-editsection' => '[편집] 링크로 부분 편집하기',
 'tog-editsectiononrightclick' => '제목을 오른쪽 클릭해서 부분 편집하기 (자바스크립트 필요)',
 'tog-showtoc' => '문서의 차례 보여주기 (머릿글이 4개 이상인 경우)',
-'tog-rememberpassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1)',
+'tog-rememberpassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
 'tog-watchcreations' => '내가 만드는 문서와 내가 올린 파일을 주시문서 목록에 추가',
 'tog-watchdefault' => '내가 편집하는 문서와 파일을 주시문서 목록에 추가',
 'tog-watchmoves' => '내가 이동하는 문서와 파일을 주시문서 목록에 추가',
@@ -374,10 +380,8 @@ $messages = array(
 'tog-shownumberswatching' => '주시 사용자 수 보기',
 'tog-oldsig' => '현재 서명:',
 'tog-fancysig' => '서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)',
-'tog-externaleditor' => '바깥 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
-'tog-externaldiff' => '바깥 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
 'tog-showjumplinks' => '접근성을 위한 "이동" 링크 쓰기 (일부 스킨에서만 작동)',
-'tog-uselivepreview' => 'ì\8b¤ì\8b\9cê°\84 ë¯¸ë¦¬ ë³´ê¸° ì\82¬ì\9a©í\95\98기 (ì\9e\90ë°\94ì\8a¤í\81¬ë¦½í\8a¸ í\95\84ì\9a\94) (ì\8b\9c험 기능)',
+'tog-uselivepreview' => 'ì\8b¤ì\8b\9cê°\84 ë¯¸ë¦¬ ë³´ê¸° ì\82¬ì\9a©í\95\98기 (ì\9e\90ë°\94ì\8a¤í\81¬ë¦½í\8a¸ í\95\84ì\9a\94) (ì\8b¤험 기능)',
 'tog-forceeditsummary' => '편집 요약을 쓰지 않았을 때 알려주기',
 'tog-watchlisthideown' => '주시문서 목록에서 내 편집을 숨기기',
 'tog-watchlisthidebots' => '주시문서 목록에서 봇 편집을 숨기기',
@@ -390,6 +394,7 @@ $messages = array(
 'tog-showhiddencats' => '숨은 분류 보기',
 'tog-noconvertlink' => '링크 제목 변환을 비활성화',
 'tog-norollbackdiff' => '되돌리기 후 차이를 보이지 않기',
+'tog-useeditwarning' => '바꾼 내용을 저장하지 않고 편집 페이지를 벗어날 때 알림',
 
 'underline-always' => '항상',
 'underline-never' => '치지 않음',
@@ -453,6 +458,18 @@ $messages = array(
 'oct' => '10',
 'nov' => '11',
 'dec' => '12',
+'january-date' => '1월 $1일',
+'february-date' => '2월 $1일',
+'march-date' => '3월 $1일',
+'april-date' => '4월 $1일',
+'may-date' => '5월 $1일',
+'june-date' => '6월 $1일',
+'july-date' => '7월 $1일',
+'august-date' => '8월 $1일',
+'september-date' => '9월 $1일',
+'october-date' => '10월 $1일',
+'november-date' => '11월 $1일',
+'december-date' => '12월 $1일',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|분류}}',
@@ -462,12 +479,12 @@ $messages = array(
 'category-empty' => '이 분류에 속하는 문서나 자료가 없습니다.',
 'hidden-categories' => '{{PLURAL:$1|숨은 분류}}',
 'hidden-category-category' => '숨은 분류',
-'category-subcat-count' => '{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 하위 분류 $2개 가운데 $1개입니다.}}',
-'category-subcat-count-limited' => '이 분류에 하위 분류 $1개가 있습니다.',
-'category-article-count' => '{{PLURAL:$2|이 분류에는 문서 1개만이 속해 있습니다.|다음은 이 분류에 속하는 문서 $2개 가운데 $1개입니다.}}',
-'category-article-count-limited' => '이 분류에 문서 $1개가 있습니다.',
-'category-file-count' => '{{PLURAL:$2|이 분류에는 파일 1개만이 속해 있습니다.|다음은 이 분류에 속하는 파일 $2개 가운데 $1개입니다.}}',
-'category-file-count-limited' => '이 분류에 파일 $1개가 있습니다.',
+'category-subcat-count' => '{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|하위 분류}} $2개 가운데 $1개입니다.}}',
+'category-subcat-count-limited' => '이 분류에 {{PLURAL:$1|하위 분류}} $1개가 있습니다.',
+'category-article-count' => '{{PLURAL:$2|이 분류에는 문서 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|문서}} $2개 가운데 $1개입니다.}}',
+'category-article-count-limited' => '이 분류에 {{PLURAL:$1|문서}} $1개가 있습니다.',
+'category-file-count' => '{{PLURAL:$2|이 분류에는 파일 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|파일}} $2개 가운데 $1개입니다.}}',
+'category-file-count-limited' => '이 분류에 {{PLURAL:$1|파일}} $1개가 있습니다.',
 'listingcontinuesabbrev' => '(계속)',
 'index-category' => '색인된 문서',
 'noindex-category' => '색인에서 제외되는 문서',
@@ -534,8 +551,8 @@ $messages = array(
 'create-this-page' => '이 문서 만들기',
 'delete' => '삭제',
 'deletethispage' => '이 문서 삭제하기',
-'undelete_short' => '편집 $1개 되살리기',
-'viewdeleted_short' => '삭제된 편집 $1개 보기',
+'undelete_short' => '{{PLURAL:$1|편집 $1개}} 되살리기',
+'viewdeleted_short' => '{{PLURAL:$1|삭제된 편집 $1개}} 보기',
 'protect' => '보호',
 'protect_change' => '보호 수준 바꾸기',
 'protectthispage' => '이 문서 보호하기',
@@ -563,7 +580,7 @@ $messages = array(
 'redirectedfrom' => '($1에서 넘어옴)',
 'redirectpagesub' => '넘겨주기 문서',
 'lastmodifiedat' => '이 문서는 $1 $2에 마지막으로 바뀌었습니다.',
-'viewcount' => '이 문서는 $1번 읽혔습니다.',
+'viewcount' => '이 문서는 {{PLURAL:$1|$1번}} 읽혔습니다.',
 'protectedpage' => '보호된 문서',
 'jumpto' => '이동:',
 'jumptonavigation' => '둘러보기',
@@ -574,7 +591,7 @@ $messages = array(
 
 $1',
 'pool-timeout' => '잠금 대기 중 타임아웃',
-'pool-queuefull' => '풀 큐가 가득 찼습니다.',
+'pool-queuefull' => '풀 큐가 가득 찼습니다',
 'pool-errorunknown' => '알 수 없는 오류',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
@@ -607,14 +624,14 @@ $1',
 
 'ok' => '확인',
 'retrievedfrom' => '원본 주소 "$1"',
-'youhavenewmessages' => '다른 사용자가 $1에 글을 남겼습니다. ($2)',
+'youhavenewmessages' => '다른 사용자가 $1에 글을 남겼습니다. ($2)',
 'newmessageslink' => '사용자 토론',
-'newmessagesdifflink' => '마지막 바뀐 내용',
-'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1에 글을 남겼습니다. ($2)',
-'youhavenewmessagesmanyusers' => '여러 사용자가 $1에 글을 남겼습니다. ($2)',
+'newmessagesdifflink' => '마지막으로 바뀐 내용',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1에 글을 남겼습니다. ($2)',
+'youhavenewmessagesmanyusers' => '여러 사용자가 $1에 글을 남겼습니다. ($2)',
 'newmessageslinkplural' => '{{PLURAL:$1|사용자 토론}}',
-'newmessagesdifflinkplural' => '마지막 {{PLURAL:$1|바뀐 내용}}',
-'youhavenewmessagesmulti' => '다른 사용자가 $1란에 글을 남겼습니다.',
+'newmessagesdifflinkplural' => '마지막으로 {{PLURAL:$1|바뀐 내용}}',
+'youhavenewmessagesmulti' => '다른 사용자가 $1에 글을 남겼습니다',
 'editsection' => '편집',
 'editold' => '편집',
 'viewsourceold' => '내용 보기',
@@ -626,9 +643,9 @@ $1',
 'hidetoc' => '숨기기',
 'collapsible-collapse' => '접기',
 'collapsible-expand' => '펼치기',
-'thisisdeleted' => '$1 보거나 되살리겠습니까?',
-'viewdeleted' => '$1 보겠습니까?',
-'restorelink' => '삭제된 편집 $1개',
+'thisisdeleted' => '$1 문서를 보거나 되살리겠습니까?',
+'viewdeleted' => '$1 문서를 보겠습니까?',
+'restorelink' => '{{PLURAL:$1|삭제된 편집 $1개}}',
 'feedlinks' => '피드:',
 'feed-invalid' => '잘못된 구독 피드 방식입니다.',
 'feed-unavailable' => '피드 서비스는 제공하지 않습니다',
@@ -709,7 +726,7 @@ URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니
 'delete-hook-aborted' => '훅에 의해 삭제가 중단되었습니다.
 아무런 설명도 주어지지 않았습니다.',
 'badtitle' => '잘못된 제목',
-'badtitletext' => '문서 제목이 잘못되었거나 비어있습니다. 또는 잘못된 인터위키 제목으로 링크했습니다.
+'badtitletext' => '요청한 문서 제목이 잘못되었거나, 비어있거나, 잘못된 인터위키 제목으로 링크했습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
 'perfcached' => '다음 자료는 캐시된 것이므로 현재 상황을 반영하지 않을 수 있습니다. 캐시에 최대 {{PLURAL:$1|결과 $1개}}가 있습니다.',
 'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 새로 고쳐졌습니다.  캐시에 최대 {{PLURAL:$4|결과 $4개}}가 있습니다.',
@@ -762,9 +779,18 @@ $2',
 'welcomecreation-msg' => '계정이 만들어졌습니다.
 [[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.',
 'yourname' => '사용자 이름:',
+'userlogin-yourname' => '사용자 이름',
+'userlogin-yourname-ph' => '사용자 이름을 입력하세요',
 'yourpassword' => '비밀번호:',
+'userlogin-yourpassword' => '비밀번호',
+'userlogin-yourpassword-ph' => '비밀번호를 입력하세요',
+'createacct-yourpassword-ph' => '비밀번호 입력',
 'yourpasswordagain' => '비밀번호 다시 입력:',
-'remembermypassword' => '이 컴퓨터에서 로그인 상태를 저장하기 (최대 $1일)',
+'createacct-yourpasswordagain' => '비밀번호 확인',
+'createacct-yourpasswordagain-ph' => '비밀번호 다시 입력',
+'remembermypassword' => '이 브라우저에서 로그인 상태를 저장하기 (최대 $1{{PLURAL:$1|일}})',
+'userlogin-remembermypassword' => '로그인 상태를 유지하기',
+'userlogin-signwithsecure' => '보안 연결 사용',
 'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다',
 'yourdomainname' => '도메인 이름:',
 'password-change-forbidden' => '이 위키에서 비밀번호를 바꿀 수 없습니다.',
@@ -777,18 +803,38 @@ $2',
 'logout' => '로그아웃',
 'userlogout' => '로그아웃',
 'notloggedin' => '로그인하지 않음',
+'userlogin-noaccount' => '계정이 없나요?',
+'userlogin-joinproject' => '{{SITENAME}}에 가입하세요',
 'nologin' => '계정이 없나요? $1.',
 'nologinlink' => '계정을 만들 수 있습니다',
 'createaccount' => '계정 만들기',
 'gotaccount' => '계정이 이미 있다면, $1.',
 'gotaccountlink' => '로그인하세요',
 'userlogin-resetlink' => '사용자 이름이나 비밀번호를 잊으셨나요?',
+'userlogin-resetpassword-link' => '내 비밀번호 재설정',
+'helplogin-url' => 'Help:로그인',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|로그인에 관한 도움말]]',
+'createacct-join' => '아래에 정보를 입력하세요.',
+'createacct-emailrequired' => '이메일 주소',
+'createacct-emailoptional' => '이메일 주소 (선택 사항)',
+'createacct-email-ph' => '이메일 주소를 입력하세요',
 'createaccountmail' => '임시 임의 비밀번호를 아래에 지정한 이메일로 보내기',
+'createacct-realname' => '실명 (선택 사항)',
 'createaccountreason' => '이유:',
-'badretype' => '입력한 비밀번호가 서로 다릅니다.',
+'createacct-reason' => '이유',
+'createacct-reason-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|기여자}}',
+'badretype' => '입력한 비밀번호가 일치하지 않습니다.',
 'userexists' => '입력하신 사용자 이름이 이미 등록되어 있습니다.
 다른 이름을 선택하세요.',
 'loginerror' => '로그인 오류',
+'createacct-error' => '계정 만들기 오류',
 'createaccounterror' => '계정을 만들지 못했습니다: $1',
 'nocookiesnew' => '사용자 계정을 만들었지만, 아직 로그인하지 않았습니다.
 {{SITENAME}}에서는 로그인 정보를 저장하기 위해 쿠키를 사용합니다.
@@ -803,8 +849,8 @@ $2',
 'loginsuccesstitle' => '로그인 성공',
 'loginsuccess' => "'''{{SITENAME}}에 \"\$1\" 계정으로 로그인했습니다.'''",
 'nosuchuser' => '"$1" 사용자가 존재하지 않습니다.
-사용자 이름은 대소문자를 구별합니다. 철자가 맞는지 확인해주세요.
-[[Special:UserLogin/signup|새 계정을 만들 수도 있습니다]].',
+사용자 이름은 대소문자를 구별합니다.
+철자가 맞는지 확인해주세요. [[Special:UserLogin/signup|새 계정을 만들 수도 있습니다]].',
 'nosuchusershort' => '이름이 "$1"인 사용자는 없습니다.
 철자가 맞는지 확인하세요.',
 'nouserspecified' => '사용자 이름을 입력하지 않았습니다.',
@@ -813,7 +859,7 @@ $2',
 다시 시도하세요.',
 'wrongpasswordempty' => '비밀번호를 입력하지 않았습니다.
 다시 시도하세요.',
-'passwordtooshort' => '비밀번호는 $1 문자 이상이어야 합니다.',
+'passwordtooshort' => '비밀번호는 {{PLURAL:$1|$1 글자}} 이상이어야 합니다.',
 'password-name-match' => '비밀번호는 사용자 이름과 반드시 달라야 합니다.',
 'password-login-forbidden' => '이 사용자 이름과 비밀번호는 사용할 수 없습니다.',
 'mailmypassword' => '새 비밀번호를 이메일로 보내기',
@@ -821,12 +867,12 @@ $2',
 'passwordremindertext' => '$1 IP 주소에서 누군가가 아마 자신이 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.
 "$2" 사용자의 임시 비밀번호는 "$3"로 설정되었습니다. 이것이 자신이 의도한 바라면
 지금 로그인하여 새로운 비밀번호를 만드세요.
-임시 비밀번호는 $5일 후에 만료됩니다.
+임시 비밀번호는 {{PLURAL:$5|$5일}} 후에 만료됩니다.
 
 이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면
 이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.',
 'noemail' => '"$1" 사용자는 이메일 주소를 등록하지 않았습니다.',
-'noemailcreate' => '바른 이메일 주소를 제공해야 합니다.',
+'noemailcreate' => '바른 이메일 주소를 제공해야 합니다.',
 'passwordsent' => '"$1" 계정의 새로운 비밀번호를 이메일로 보냈습니다.
 비밀번호를 받고 다시 로그인해 주세요.',
 'blocked-mailpassword' => '당신의 IP 주소는 편집을 할 수 없게 차단되어 있어서 악용하지 못하도록 비밀번호 되살리기 기능 사용이 금지됩니다.',
@@ -835,7 +881,7 @@ $2',
 'throttled-mailpassword' => '비밀번호 재설정 이메일을 이미 최근 {{PLURAL:$1|$1시간}} 안에 보냈습니다.
 악용을 방지하기 위해 비밀번호 재설정 메일은 {{PLURAL:$1|$1시간}}마다 오직 하나씩만 보낼 수 있습니다.',
 'mailerror' => '메일 보내기 오류: $1',
-'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 계정을 $1개 만들어, 계정 만들기 한도를 초과하였습니다.
+'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 {{PLURAL:$1|계정 $1개}}를 만들어, 계정 만들기 한도를 초과하였습니다.
 따라서 지금은 이 IP 주소로는 더 이상 계정을 만들 수 없습니다.',
 'emailauthenticated' => '이메일 주소는 $2 $3에 인증되었습니다.',
 'emailnotauthenticated' => '이메일 주소를 인증하지 않았습니다.
@@ -853,9 +899,9 @@ $2',
 지금 로그인하여 비밀번호를 바꾸십시오.
 
 실수로 계정을 잘못 만들었다면 이 메시지는 무시해도 됩니다.',
-'usernamehasherror' => '사용자 이름에는 해시 문자가 들어갈 수 없습니다.',
+'usernamehasherror' => '사용자 이름에는 해시 문자가 들어갈 수 없습니다',
 'login-throttled' => '로그인에 연속으로 실패하였습니다.
\9e ì\8b\9c í\9b\84ì\97\90 ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95´ì£¼세요.',
\9e ì\8b\9c í\9b\84ì\97\90 ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98세요.',
 'login-abort-generic' => '로그인에 실패했습니다 - 중지됨',
 'loginlanguagelabel' => '언어: $1',
 'suspicious-userlogout' => '브라우저에 이상이 있거나 캐싱 프록시에서 로그아웃을 요청했기 때문에 로그아웃이 거부되었습니다.',
@@ -884,13 +930,13 @@ $2',
 'resetpass-wrong-oldpass' => '비밀번호가 잘못되었거나 현재의 비밀번호와 같습니다.
 이미 비밀번호를 성공적으로 바꾸었거나 새 임시 비밀번호를 요청했을 수 있습니다.',
 'resetpass-temp-password' => '임시 비밀번호:',
+'resetpass-abort-generic' => '비밀번호 바꾸기가 확장 기능에 의해 중단되었습니다.',
 
 # Special:PasswordReset
 'passwordreset' => '비밀번호 재설정',
-'passwordreset-text' => '비밀번호를 재설정하려면 이 양식을 채워주세요.',
 'passwordreset-legend' => '비밀번호 재설정',
 'passwordreset-disabled' => '이 위키에서는 비밀번호를 재설정할 수 없습니다.',
-'passwordreset-pretext' => '{{PLURAL:$1||아래에 한 가지 정보를 입력하세요}}',
+'passwordreset-emaildisabled' => '이 위키에서 이메일 기능이 비활성화되어 있습니다.',
 'passwordreset-username' => '사용자 이름:',
 'passwordreset-domain' => '도메인:',
 'passwordreset-capture' => '발송 결과 이메일을 보시겠습니까?',
@@ -902,7 +948,7 @@ $2',
 
 $2
 
-이 {{PLURAL:$3|임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.
+{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.
 이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,
 원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고
 이전의 비밀번호를 계속 사용할 수 있습니다.',
@@ -919,7 +965,7 @@ $2
 임시 비밀번호: $2',
 'passwordreset-emailsent' => '비밀번호 재설정 이메일을 보냈습니다.',
 'passwordreset-emailsent-capture' => '비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.',
-'passwordreset-emailerror-capture' => '비밀번호 재설정 이메일이 ë§\8cë\93¤ì\96´ì ¸ ì\95\84ë\9e\98ì\97\90 ë\82\98í\83\80ë\82¬ì§\80ë§\8c ë°\9cì\86¡í\95\98ë\8a\94 ë\8d°ì\97\90ë\8a\94 ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤: $1',
+'passwordreset-emailerror-capture' => '비밀번호 재설정 이메일이 ì\83\9dì\84±ë\90\98ì\96´ ì\95\84ë\9e\98ì\97\90 í\91\9cì\8b\9cë\90\98ì\96´ ì\9e\88ì§\80ë§\8c, {{GENDER:$2|ì\82¬ì\9a©ì\9e\90}}ì\97\90ê²\8c ë°\9cì\86¡í\95\98ë\8a\94 ë\8d°ì\97\90ë\8a\94 ì\8b¤í\8c¨í\96\88ì\8aµë\8b\88ë\8b¤: $1',
 
 # Special:ChangeEmail
 'changeemail' => '이메일 주소 바꾸기',
@@ -941,7 +987,7 @@ $2
 'link_sample' => '링크 제목',
 'link_tip' => '안쪽 링크',
 'extlink_sample' => 'http://www.example.com 사이트 이름',
-'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다.)',
+'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다)',
 'headline_sample' => '제목',
 'headline_tip' => '2단계 문단 제목',
 'nowiki_sample' => '여기에 위키 문법을 사용하지 않을 글을 적어 주세요',
@@ -1010,8 +1056,8 @@ $1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대
 'loginreqtitle' => '로그인 필요',
 'loginreqlink' => '로그인',
 'loginreqpagetext' => '다른 문서를 보기 위해서는 $1해야 합니다.',
-'accmailtitle' => '비밀번호를 보냈습니다.',
-'accmailtext' => '[[User talk:$1|$1]] 사용자의 비밀번호가 임의로 만들어져 $2ë¡\9c ì \84ì\86¡ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.
+'accmailtitle' => '비밀번호를 보냈습니다',
+'accmailtext' => '[[User talk:$1|$1]] 사용자의 비밀번호가 임의로 만들어져 $2\9c¼)ë¡\9c ë³´ë\83\88ì\8aµë\8b\88ë\8b¤.
 
 새 비밀번호는 로그인한 후 [[Special:ChangePassword|비밀번호를 바꿀]] 수 있습니다.',
 'newarticle' => '(새 문서)',
@@ -1049,9 +1095,9 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 '''아직 저장하지 않았습니다!'''",
 'userjspreview' => "'''사용자 자바스크립트 미리 보기입니다.'''
 '''아직 저장하지 않았습니다!'''",
-'sitecsspreview' => "'''ì\9d´ CSSì\9d\98 ë¯¸ë¦¬ ë³´ê¸°ì\9d¼ ë¿\90ì\9e\85ë\8b\88ë\8b¤.'''
+'sitecsspreview' => "'''이 CSS의 미리 보기입니다.'''
 '''아직 저장하지 않았습니다!'''",
-'sitejspreview' => "'''ì\9d´ ì\9e\90ë°\94ì\8a¤í\81¬ë¦½í\8a¸ ì½\94ë\93\9cì\9d\98 ë¯¸ë¦¬ ë³´ê¸°ì\9d¼ ë¿\90ì\9e\85ë\8b\88ë\8b¤.'''
+'sitejspreview' => "'''이 자바스크립트 코드의 미리 보기입니다.'''
 '''아직 저장하지 않았습니다!'''",
 'userinvalidcssjstitle' => "'''경고''': \"\$1\" 스킨은 없습니다.
 .css와 .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
@@ -1116,7 +1162,7 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'templatesusedsection' => '이 문단에서 사용하고 있는 {{PLURAL:$1|틀}}:',
 'template-protected' => '(보호됨)',
 'template-semiprotected' => '(준보호됨)',
-'hiddencategories' => '이 문서는 다음 숨은 분류 $1개에 속해 있습니다:',
+'hiddencategories' => '이 문서는 다음 {{PLURAL:$1|숨은 분류 1개|숨은 분류 $1개}}에 속해 있습니다:',
 'edittools' => '<!-- 이 문서는 편집 창과 파일 올리기 창에 출력됩니다. -->',
 'nocreatetext' => '{{SITENAME}}에서 새로운 문서를 만드는 것은 제한되어 있습니다.
 이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들 수 있습니다]].',
@@ -1139,12 +1185,15 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 문서가 삭제된 것 같습니다.',
 'edit-conflict' => '편집 충돌.',
 'edit-no-change' => '문서에 어떠한 바뀜도 없기 때문에 편집은 무시되었습니다.',
+'postedit-confirmation' => '편집을 저장했습니다.',
 'edit-already-exists' => '새 문서를 만들 수 없습니다.
 문서가 이미 존재합니다.',
 'defaultmessagetext' => '기본 메세지 내용',
 'content-failed-to-parse' => '$1 모델에 대한 $2 내용을 구문 분석하는 데 실패했습니다: $3',
 'invalid-content-data' => '잘못된 내용 데이터입니다',
 'content-not-allowed-here' => '"$1" 내용은 [[$2]] 문서예 허용하지 않습니다',
+'editwarning-warning' => '이 페이지에서 벗어나면 저장하지 않은 바뀜이 모두 사라집니다.
+로그인을 했다면, 환경 설정의 "편집 상자"에서 이 경고를 띄우지 않도록 설정할 수 있습니다.',
 
 # Content models
 'content-model-wikitext' => '위키텍스트',
@@ -1155,7 +1204,7 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''경고:''' 이 문서는 너무 많은 파서 함수를 포함하고 있습니다.
 
-$2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
+$2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개를 쓰고 있습니다}}.",
 'expensive-parserfunction-category' => '느린 파서 함수 호출을 너무 많이 하는 문서',
 'post-expand-template-inclusion-warning' => "'''경고:''' 틀 포함 크기가 너무 큽니다.
 일부 틀은 포함되지 않을 수 있습니다.",
@@ -1176,14 +1225,14 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 
 # "Undo" feature
 'undo-success' => '편집을 되돌릴 수 있습니다.
\8e¸ì§\91 ë\90\98ë\8f\8c리기를 ì\99\84ë£\8cí\95\98려면 ì\9d´ í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8c리려면 ì\95\84ë\9e\98ì\9d\98 ë°\94ë\80\9c ì\82¬í\95­을 확인한 후 저장해주세요.',
\8e¸ì§\91 ë\90\98ë\8f\8c리기를 ì\99\84ë£\8cí\95\98려면 ì\9d´ í\8e¸ì§\91ì\9d\84 ë\90\98ë\8f\8c리려면 ì\95\84ë\9e\98ì\9d\98 ë°\94ë\80\90 ë\82´ì\9a©을 확인한 후 저장해주세요.',
 'undo-failure' => '중간의 다른 편집과 충돌하여 이 편집을 되돌릴 수 없습니다.',
 'undo-norev' => '문서가 없거나 삭제되었기 때문에 편집을 되돌릴 수 없습니다.',
-'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]]) 의 $1판 편집을 되돌림',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|토론]])의 $1판 편집을 되돌림',
 
 # Account creation failure
 'cantcreateaccounttitle' => '계정을 만들 수 없음',
-'cantcreateaccount-text' => "í\98\84ì\9e¬ ì\95\84ì\9d´í\94¼ ì£¼ì\86\8c('''$1''')ë\8a\94 [[User:$3|$3]] ì\82¬ì\9a©ì\9e\90ì\97\90 ì\9d\98í\95´ ê³\84ì \95 ë§\8cë\93¤ê¸°ê°\80 ì°¨ë\8b¨ë\90\9c ì\83\81í\83\9cì\9e\85니다.
+'cantcreateaccount-text' => "í\98\84ì\9e¬ ì\95\84ì\9d´í\94¼ ì£¼ì\86\8c('''$1''')ë\8a\94 [[User:$3|$3]] ì\82¬ì\9a©ì\9e\90ì\97\90 ì\9d\98í\95´ ê³\84ì \95 ë§\8cë\93¤ê¸°ê°\80 ì°¨ë\8b¨ë\90\98ì\97\88ì\8aµ니다.
 
 차단 이유는 다음과 같습니다: $2",
 
@@ -1208,7 +1257,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'history-show-deleted' => '삭제된 것만',
 'histfirst' => '처음',
 'histlast' => '마지막',
-'historysize' => '($1 바이트)',
+'historysize' => '({{PLURAL:$1|1 바이트|$1 바이트}})',
 'historyempty' => '(비었음)',
 
 # Revision feed
@@ -1251,7 +1300,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 숨겨진 판과 이 판의 편집 비교를 할 수 있습니다. 자세한 내용은 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 해당 숨김 기록]에서 찾아볼 수 있습니다.",
 'rev-delundel' => '보이기/숨기기',
 'rev-showdeleted' => '보이기',
-'revisiondelete' => 'í\8c\90 ì\82­ì \9c³µêµ¬',
+'revisiondelete' => 'í\8c\90 ì\82­ì \9c\90\98ì\82´ë¦¬ê¸°',
 'revdelete-nooldid-title' => '대상 판이 잘못되었습니다.',
 'revdelete-nooldid-text' => '이 기능을 수행할 특정 판을 제시하지 않았거나 해당 판이 없습니다. 또는 현재 판을 숨기려 하고 있을 수도 있습니다.',
 'revdelete-nologtype-title' => '기록의 종류가 제시되지 않았습니다.',
@@ -1264,7 +1313,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'revdelete-selected' => "'''[[:$1]]의 {{PLURAL:$2|선택한 판}}:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|선택한 기록}}:'''",
 'revdelete-text' => "'''삭제된 판과 기록은 문서 역사와 기록에 계속 나타나지만, 내용은 공개되지 않을 것입니다.'''
-{{SITENAME}}ì\9d\98 ë\8b¤ë¥¸ ê´\80리ì\9e\90ë\8a\94 ë\8b¤ë¥¸ ì \9cí\95\9cì\9d´ ì\84¤ì \95ë\90\98ì\96´ ì\9e\88ì§\80 ì\95\8aë\8a\94 í\95\9c, ì\88¨ê²¨ì§\84 ë\82´ì\9a©ì\9d\84 ë³¼ ì\88\98 ì\9e\88ê³ , ê°\99ì\9d\80 ë\8f\84구를 ì\9d´ì\9a©í\95´ ë³µêµ¬í\95  수 있습니다.",
+{{SITENAME}}ì\9d\98 ë\8b¤ë¥¸ ê´\80리ì\9e\90ë\8a\94 ë\8b¤ë¥¸ ì \9cí\95\9cì\9d´ ì\84¤ì \95ë\90\98ì\96´ ì\9e\88ì§\80 ì\95\8aë\8a\94 í\95\9c, ì\88¨ê²¨ì§\84 ë\82´ì\9a©ì\9d\84 ë³¼ ì\88\98 ì\9e\88ê³ , ê°\99ì\9d\80 ë\8f\84구를 ì\9d´ì\9a©í\95´ ë\90\98ì\82´ë¦´ 수 있습니다.",
 'revdelete-confirm' => '이 작업을 수행하는 것의 결과를 알고 있으며, [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지 확인해주세요.',
 'revdelete-suppress-text' => "숨기기는 '''다음 경우에만''' 사용되어야 합니다:
 * 잠재적인 비방 정보
@@ -1281,7 +1330,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'revdelete-radio-set' => '예',
 'revdelete-radio-unset' => '아니오',
 'revdelete-suppress' => '문서 내용을 관리자에게도 보이지 않게 숨기기',
-'revdelete-unsuppress' => '복구ë\90\9c 판에 대한 제한을 해제',
+'revdelete-unsuppress' => 'ë\90\98ì\82´ë¦° 판에 대한 제한을 해제',
 'revdelete-log' => '이유:',
 'revdelete-submit' => '선택한 {{PLURAL:$1|판}}에 적용',
 'revdelete-success' => "'''판의 보이기 설정을 성공적으로 바꾸었습니다.'''",
@@ -1335,7 +1384,7 @@ $1",
 'mergehistory-go' => '합칠 수 있는 편집 보기',
 'mergehistory-submit' => '문서 역사 합치기',
 'mergehistory-empty' => '합칠 수 있는 판이 없습니다.',
-'mergehistory-success' => '[[:$1]] 문서의  $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.',
+'mergehistory-success' => '[[:$1]] 문서의 {{PLURAL:$3|판}} $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.',
 'mergehistory-fail' => '문서 역사 합치기 명령을 수행할 수 없습니다. 문서와 시간 변수를 다시 확인하십시오.',
 'mergehistory-no-source' => '원본인 $1 문서가 존재하지 않습니다.',
 'mergehistory-no-destination' => '대상인 $1 문서가 존재하지 않습니다.',
@@ -1361,9 +1410,9 @@ $1",
 'compareselectedversions' => '선택한 판을 비교하기',
 'showhideselectedversions' => '선택한 판을 보이기/숨기기',
 'editundo' => '편집 취소',
-'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} 중간의 편집 $1개 숨겨짐)',
-'diff-multi-manyusers' => '({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} 중간의 편집 $1개 숨겨짐)',
-'difference-missing-revision' => '문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 없습니다.
+'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
+'diff-multi-manyusers' => '({{PLURAL:$2|한 사용자의|사용자 $2명 이상의}} {{PLURAL:$1|중간의 편집 $1개}} 숨겨짐)',
+'difference-missing-revision' => '문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.
 
 이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 비교 링크로 인해 발생합니다.
 자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.',
@@ -1379,11 +1428,11 @@ $1",
 'notitlematches' => '해당하는 제목 없음',
 'textmatches' => '문서 내용 일치',
 'notextmatches' => '해당하는 문서 없음',
-'prevn' => '이전 $1개',
-'nextn' => '다음 $1개',
-'prevn-title' => '이전 결과 $1개',
-'nextn-title' => '다음 결과 $1개',
-'shown-title' => '쪽마다 ê²°ê³¼ $1ê°\9cì\94© ë³´ì\9d´ê¸°',
+'prevn' => '이전 {{PLURAL:$1|$1개}}',
+'nextn' => '다음 {{PLURAL:$1|$1개}}',
+'prevn-title' => '이전 {{PLURAL:$1|결과}} $1개',
+'nextn-title' => '다음 {{PLURAL:$1|결과}} $1개',
+'shown-title' => '쪽마다 {{PLURAL:$1|ê²°ê³¼}} $1ê°\9cì\94© ë³´ê¸°',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) 보기',
 'searchmenu-legend' => '찾기 설정',
 'searchmenu-exists' => "'''이 위키에 \"[[:\$1]]\"의 이름을 가진 문서가 있습니다.'''",
@@ -1400,8 +1449,8 @@ $1",
 'searchprofile-images-tooltip' => '파일 찾기',
 'searchprofile-everything-tooltip' => '토론 문서를 포함한 모든 문서 찾기',
 'searchprofile-advanced-tooltip' => '다음 설정한 이름공간에서 찾기',
-'search-result-size' => '$1 ($2 단어)',
-'search-result-category-size' => '문서 {{PLURAL:$1|1|$1}}개, 하위 분류 {{PLURAL:$2|1|$2}}개, 파일 {{PLURAL:$3|1|$3}}',
+'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-result-score' => '유사도: $1%',
 'search-redirect' => '($1에서 넘어옴)',
 'search-section' => '($1 문단)',
@@ -1414,9 +1463,9 @@ $1",
 'searcheverything-enable' => '모든 이름공간에서 찾기',
 'searchrelated' => '관련',
 'searchall' => '모두',
-'showingresults' => '<strong>$2</strong>번 부터의 <strong>결과 $1개</strong>입니다.',
-'showingresultsnum' => "'''$2'''번 부터의 '''결과 $3개''' 입니다.",
-'showingresultsheader' => "'''$4''' 검색어에 대하여 결과 '''$3'''개 중 {{PLURAL:$5|'''$1'''개|'''$1 - $2'''번째}}를 보여 주고 있습니다.",
+'showingresults' => "'''$2'''번 부터의 {{PLURAL:$1|결과 '''1'''개|결과 '''$1'''개}}입니다.",
+'showingresultsnum' => "'''$2'''번 부터의 {{PLURAL:$3|결과 '''1'''개|결과 '''$3'''개}} 입니다.",
+'showingresultsheader' => "'''$4''' 검색어에 대하여 {{PLURAL:$5|결과 '''$3'''개 중 '''$1'''개|결과 '''$3'''개 중 '''$1 - $2'''번째}}를 보여 주고 있습니다",
 'nonefound' => "'''참고''': 몇개의 이름공간만 기본 찾을 범위입니다. 토론이나 틀 등의 모든 자료를 찾하기 위해서는 접두어로 '''all:''' 어떤 이름공간을 위해서는 접두어로 그 이름공간을 쓸 수 있습니다.",
 'search-nonefound' => '찾기 결과가 없습니다.',
 'powersearch' => '고급 찾기',
@@ -1425,21 +1474,13 @@ $1",
 'powersearch-redir' => '넘겨주기 목록',
 'powersearch-field' => '찾기',
 'powersearch-togglelabel' => '확인:',
-'powersearch-toggleall' => '모두 선택',
+'powersearch-toggleall' => '모두',
 'powersearch-togglenone' => '없음',
 'search-external' => '바깥 찾기',
 'searchdisabled' => '{{SITENAME}} 찾기 기능이 비활성화되어 있습니다.
 기능이 작동하지 않는 동안에는 구글(Google)을 이용해 찾을 수 있습니다.
 검색 엔진의 내용은 최신이 아닐 수 있다는 점을 주의해주세요.',
-
-# Quickbar
-'qbsettings' => '빨리가기 맞춤',
-'qbsettings-none' => '없음',
-'qbsettings-fixedleft' => '왼쪽 고정',
-'qbsettings-fixedright' => '오른쪽 고정',
-'qbsettings-floatingleft' => '왼쪽 유동',
-'qbsettings-floatingright' => '오른쪽 유동',
-'qbsettings-directionality' => '사용자 언어의 문자 입력 방향에 맞추어 고정',
+'search-error' => '찾는 동안 오류가 발생했습니다: $1',
 
 # Preferences page
 'preferences' => '사용자 환경 설정',
@@ -1481,7 +1522,7 @@ $1",
 'stub-threshold' => '링크를 <a href="#" class="stub">토막글</a> 형식으로 보여줄 문서 크기 (바이트 수):',
 'stub-threshold-disabled' => '비활성화됨',
 'recentchangesdays' => '최근 바뀜에 보여줄 날짜 수:',
-'recentchangesdays-max' => '최대 $1',
+'recentchangesdays-max' => '최대 $1{{PLURAL:$1|일}}',
 'recentchangescount' => '기본으로 보여줄 편집 수:',
 'prefs-help-recentchangescount' => '이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.',
 'prefs-help-watchlist-token' => '아래에 비밀 값을 넣으면 주시문서 목록에 대한 RSS 피드가 만들어집니다.
@@ -1515,7 +1556,7 @@ $1",
 'prefs-custom-js' => '사용자 자바스크립트',
 'prefs-common-css-js' => '모든 스킨에 대한 공통 CSS/자바스크립트:',
 'prefs-reset-intro' => '이 사이트의 기본값으로 환경 설정을 되돌릴 수 있습니다.
³µêµ¬í\95  수 없습니다.',
\90\98ë\8f\8c릴 수 없습니다.',
 'prefs-emailconfirm-label' => '이메일 인증:',
 'prefs-textboxsize' => '편집창의 크기',
 'youremail' => '이메일:',
@@ -1532,7 +1573,7 @@ $1",
 'badsig' => '서명이 잘못되었습니다.
 HTML 태그를 확인하세요.',
 'badsiglength' => '서명이 너무 깁니다.
-서명은 $1보다 짧아야 합니다.',
+서명은 $1 {{PLURAL:$1|글자}}보다 짧아야 합니다.',
 'yourgender' => '성별:',
 'gender-unknown' => '무응답',
 'gender-male' => '남성',
@@ -1540,8 +1581,8 @@ HTML 태그를 확인하세요.',
 'prefs-help-gender' => '선택 사항: 소프트웨어에서 성별에 따른 언어 문제를 해결하기 위해 사용됩니다.
 이 정보는 공개됩니다.',
 'email' => '이메일',
-'prefs-help-realname' => '실명 기입은 자유입니다.
\8b¤ëª\85ì\9d\84 ì\9e\85ë ¥í\95  ê²½ì\9a° 문서 기여에 자신의 이름이 들어가게 됩니다.',
+'prefs-help-realname' => '실명은 선택 사항입니다.
\8b¤ëª\85ì\9d\84 ì\9e\85ë ¥í\95\98ë©´ 문서 기여에 자신의 이름이 들어가게 됩니다.',
 'prefs-help-email' => '이메일 주소 입력은 선택 사항입니다. 다만 비밀번호를 잊었을 때 비밀번호 바꾸기를 위해 필요합니다.',
 'prefs-help-email-others' => '자신의 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.
 이 경우에도 이메일 주소는 다른 사용자가 연락할 때 공개되지 않습니다.',
@@ -1563,7 +1604,7 @@ HTML 태그를 확인하세요.',
 
 # User preference: email validation using jQuery
 'email-address-validity-valid' => '이메일 주소가 유효한 것으로 보입니다.',
-'email-address-validity-invalid' => 'ì\9c í\9a¨í\95\9c ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥í\95´ì£¼ì\84¸ì\9a\94.',
+'email-address-validity-invalid' => 'ì\98¬ë°\94른 ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\9e\85ë ¥í\95\98ì\84¸ì\9a\94',
 
 # User rights
 'userrights' => '사용자 권한 관리',
@@ -1586,6 +1627,7 @@ HTML 태그를 확인하세요.',
 'userrights-notallowed' => '다른 사용자의 권한을 조정할 권한이 없습니다.',
 'userrights-changeable-col' => '바꿀 수 있는 권한',
 'userrights-unchangeable-col' => '바꿀 수 없는 권한',
+'userrights-conflict' => '사용자 권한에 충돌이 있습니다! 바뀜을 다시 적용하세요.',
 
 # Groups
 'group' => '그룹:',
@@ -1636,13 +1678,13 @@ HTML 태그를 확인하세요.',
 'right-writeapi' => 'API 작성',
 'right-delete' => '문서 삭제',
 'right-bigdelete' => '문서 역사가 긴 문서를 삭제',
-'right-deletelogentry' => '특정 기록 항목을 삭제 및 복구',
-'right-deleterevision' => '문서의 특정 판을 삭제 및 복구',
+'right-deletelogentry' => '특정 기록 항목을 삭제하고 되살리기',
+'right-deleterevision' => '문서의 특정 판을 삭제하고 되살리기',
 'right-deletedhistory' => '삭제된 문서의 내용을 제외한 역사를 보기',
 'right-deletedtext' => '삭제된 문서의 내용과 편집상의 차이를 보기',
 'right-browsearchive' => '삭제된 문서 찾기',
-'right-undelete' => 'ì\82­ì \9cë\90\9c ë¬¸ì\84\9c ë³µêµ¬',
-'right-suppressrevision' => 'ê´\80리ì\9e\90ë\8f\84 ë³´ì§\80 ëª»í\95\98ë\8f\84ë¡\9d ì\88¨ê²¨ì§\84 í\8c\90ì\9d\98 í\99\95ì\9d¸ ë°\8f ë³µêµ¬',
+'right-undelete' => 'ì\82­ì \9cë\90\9c ë¬¸ì\84\9c ë\90\98ì\82´ë¦¬ê¸°',
+'right-suppressrevision' => 'ê´\80리ì\9e\90ë\8f\84 ë³´ì§\80 ëª»í\95\98ë\8f\84ë¡\9d ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë\90\98ì\82´ë¦¬ê¸°',
 'right-suppressionlog' => '숨겨진 기록을 보기',
 'right-block' => '다른 사용자를 편집을 못하도록 차단',
 'right-blockemail' => '다른 사용자가 이메일을 보내지 못하도록 차단',
@@ -1701,8 +1743,8 @@ HTML 태그를 확인하세요.',
 'action-deleterevision' => '이 판을 삭제',
 'action-deletedhistory' => '이 문서의 삭제된 기여의 역사 보기',
 'action-browsearchive' => '삭제된 문서 찾기',
-'action-undelete' => 'ì\9d´ ë¬¸ì\84\9c를 ë³µêµ¬í\95\98기',
-'action-suppressrevision' => 'ì\9d´ ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë³µêµ¬í\95 ',
+'action-undelete' => 'ì\9d´ ë¬¸ì\84\9c를 ë\90\98ì\82´ë¦¬기',
+'action-suppressrevision' => 'ì\9d´ ì\88¨ê²¨ì§\84 í\8c\90ì\9d\84 ê²\80í\86 í\95\98ê³  ë\90\98ì\82´ë¦´',
 'action-suppressionlog' => '비공개 기록 보기',
 'action-block' => '이 사용자를 편집하지 못하도록 차단',
 'action-protect' => '이 문서의 보호 설정을 바꾸기',
@@ -1722,8 +1764,8 @@ HTML 태그를 확인하세요.',
 'nchanges' => '$1개 {{PLURAL:$1|바뀜}}',
 'recentchanges' => '최근 바뀜',
 'recentchanges-legend' => '최근 바뀜 설정',
-'recentchanges-summary' => '위키의 최근 바뀜 내역이 나와 있습니다.',
-'recentchanges-feed-description' => '위키의 최근 바뀜',
+'recentchanges-summary' => '위키의 최근 바뀜이 나와 있습니다.',
+'recentchanges-feed-description' => '위키의 최근 바뀜이 나와 있습니다.',
 'recentchanges-label-newpage' => '새로운 문서',
 'recentchanges-label-minor' => '사소한 편집',
 'recentchanges-label-bot' => '봇의 편집',
@@ -1745,14 +1787,14 @@ HTML 태그를 확인하세요.',
 'minoreditletter' => '잔글',
 'newpageletter' => '새글',
 'boteditletter' => '봇',
-'number_of_watching_users_pageview' => '[$1명이 주시하고 있음]',
+'number_of_watching_users_pageview' => '[{{PLURAL:$1|사용자}} $1명이 주시하고 있음]',
 'rc_categories' => '다음 분류로 제한 ("|"로 구분)',
 'rc_categories_any' => '모두',
 'rc-change-size-new' => '바꾼 후 $1 {{PLURAL:$1|바이트}}',
 'newsectionsummary' => '새 주제: /* $1 */',
 'rc-enhanced-expand' => '자세한 기록 보기 (자바스크립트 필요)',
 'rc-enhanced-hide' => '자세한 기록 숨기기',
-'rc-old-title' => '처음에  "$1"라는 제목으로 만들어짐',
+'rc-old-title' => '처음에 "$1"라는 제목으로 만들어졌습니다',
 
 # Recent changes linked
 'recentchangeslinked' => '가리키는 글의 바뀜',
@@ -1811,8 +1853,8 @@ HTML 태그를 확인하세요.',
 'filetype-bad-ie-mime' => '인터넷 익스플로러가 잠재적으로 위험한 파일 형식으로 판단되어 사용이 금지된 "$1"로 인식할 수 있기 때문에 이 파일을 올릴 수 없습니다.',
 'filetype-unwanted-type' => "'''\".\$1\"''' 확장자는 추천하지 않습니다.
 추천하는 {{PLURAL:\$3|파일 확장자}}는 \$2입니다.",
-'filetype-banned-type' => '{{PLURAL:$3$4}}\'\'\'".$1"\'\'\' 형식의 파일은 올릴 수 없습니다.
-$2 형식만 사용할 수 있습니다.',
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|형식의 파일은 올릴 수 없습니다}}.
+$2 {{PLURAL:$3|형식만 사용할 수 있습니다}}.',
 'filetype-missing' => '파일에 확장자(".jpg" 등)가 없습니다.',
 'empty-file' => '올린 파일이 비어 있습니다.',
 'file-too-large' => '올리려는 파일이 너무 큽니다.',
@@ -1914,7 +1956,7 @@ $1',
 [[Special:ListUsers/sysop|관리자]]에게 연락해주세요.',
 'upload-misc-error' => '알 수 없는 파일 올리기 오류',
 'upload-misc-error-text' => '파일을 올리는 중 알 수 없는 오류가 발생했습니다.
-URLì\9d´ ì\98¬ë°\94르고 ì \91ê·¼ ê°\80ë\8a¥í\95\9cì§\80를 í\99\95ì\9d¸í\95\98ê³  ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95´ì£¼세요.
+URLì\9d´ ì\98¬ë°\94르고 ì \91ê·¼ ê°\80ë\8a¥í\95\9cì§\80를 í\99\95ì\9d¸í\95\98ê³  ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98세요.
 문제가 계속되면 [[Special:ListUsers/sysop|관리자]]에게 연락해주세요.',
 'upload-too-many-redirects' => 'URL이 너무 많은 넘겨주기에 연결되어 있습니다.',
 'upload-unknown-size' => '크기를 알 수 없음',
@@ -1945,7 +1987,7 @@ URL이 올바르고 접근 가능한지를 확인하고 다시 시도해주세
 'backend-fail-connect' => '"$1" 저장 백엔드에 접속하지 못했습니다.',
 'backend-fail-internal' => '"$1" 저장 백엔드에 알 수 없는 오류가 발생했습니다.',
 'backend-fail-contenttype' => '"$1"에 저장하기 위한 파일의 내용 유형을 판별하지 못했습니다.',
-'backend-fail-batchsize' => 'ì \80ì\9e¥ ë°±ì\97\94ë\93\9cì\97\90ì\84\9c í\8c\8cì\9d¼ {{PLURAL:$1|ì\9e\91ì\97\85}} $1ê°\9cê°\80 ì\8c\93ì\97¬ ì\9e\88ì\8aµë\8b\88ë\8b¤. í\95\9cê³\84ë\8a\94 $2개입니다.',
+'backend-fail-batchsize' => 'ì \80ì\9e¥ ë°±ì\97\94ë\93\9cì\97\90ì\84\9c í\8c\8cì\9d¼ {{PLURAL:$1|ì\9e\91ì\97\85}} $1ê°\9cê°\80 ì\8c\93ì\98\80ì\8aµë\8b\88ë\8b¤. í\95\9cê³\84ë\8a\94 {{PLURAL:$2|ì\9e\91ì\97\85}} $2개입니다.',
 'backend-fail-usable' => '파일 읽기/쓰기 권한이 없거나 저장 위치가 빠졌기 때문에 "$1" 파일을 읽거나 쓸 수 없습니다.',
 
 # File journal errors
@@ -2008,7 +2050,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오
 'http-read-error' => 'HTTP 읽기 오류.',
 'http-timed-out' => 'HTTP 요청 시간 초과.',
 'http-curl-error' => 'URL 열기 오류: $1',
-'http-host-unreachable' => 'URL에 접근하지 못했습니다.',
 'http-bad-status' => 'HTTP 요청 중 오류 발생: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2017,19 +2058,19 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오
 URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'upload-curl-error28' => '업로드 시간 초과',
 'upload-curl-error28-text' => '사이트에서 응답하는 시간이 너무 깁니다.
\82¬ì\9d´í\8a¸ ì \91ì\86\8dì\9d´ ê°\80ë\8a¥í\95\9cì§\80 í\99\95ì\9d¸í\95\9c ë\8b¤ì\9d\8c ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95´ì£¼세요.
\95´ë\8b¹ ì\82¬ì\9d´í\8a¸ì\97\90 ì \91ì\86\8dì\9d´ ë§\8eì\9d\84 ê²½ì\9a° ì \91ì\86\8dì\9d´ ì\9b\90í\99\9cí\95\9c ì\8b\9cê°\84ë\8c\80ì\97\90 ì\8b\9cë\8f\84í\95´ì£¼세요.',
\82¬ì\9d´í\8a¸ ì \91ì\86\8dì\9d´ ê°\80ë\8a¥í\95\9cì§\80 í\99\95ì\9d¸í\95\9c ë\8b¤ì\9d\8c ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98세요.
\95´ë\8b¹ ì\82¬ì\9d´í\8a¸ì\97\90 ì \91ì\86\8dì\9d´ ë§\8eì\9d\84 ê²½ì\9a° ì \91ì\86\8dì\9d´ ì\9b\90í\99\9cí\95\9c ì\8b\9cê°\84ë\8c\80ì\97\90 ì\8b\9cë\8f\84í\95\98세요.',
 
 'license' => '라이선스:',
 'license-header' => '라이선스',
 'nolicense' => '선택하지 않음',
 'license-nopreview' => '(미리 보기 불가능)',
-'upload_source_url' => ' (유효하고, 모든 사람이 접근 가능한 URL)',
+'upload_source_url' => '(올바르고, 공개적으로 접근할 수 있는 URL)',
 'upload_source_file' => ' (당신의 컴퓨터에 있는 파일)',
 
 # Special:ListFiles
 'listfiles-summary' => '이 위키에 올라와 있는 모든 파일이 나열되어 있습니다.
-사용자별로 필터링했을 경우에는 사용자가 올린 가장 최신 버전만이 보여집니다.',
+사용자별로 필터링했을 경우에는 사용자가 올린 가장 최신 만이 보여집니다.',
 'listfiles_search_for' => '다음 이름을 가진 미디어 찾기:',
 'imgfile' => '파일',
 'listfiles' => '파일 목록',
@@ -2059,14 +2100,14 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filehist-comment' => '내용',
 'filehist-missing' => '파일을 찾을 수 없음',
 'imagelinks' => '이 파일을 사용하는 문서',
-'linkstoimage' => '다음 문서 $1개가 이 파일을 사용하고 있습니다:',
-'linkstoimage-more' => '$1개 이상의 문서가 이 파일을 가리키고 있습니다.
-다음 목록은 이 파일을 가리키는 처음 $1개 문서만 보여주고 있습니다.
-이 파일을 가리키는 ëª¨ë\93  ë¬¸ì\84\9c를 ë³´ë ¤ë©´ [[Special:WhatLinksHere/$2|ì\97¬ê¸°]]를 ì°¸ê³ í\95´ ì£¼ì\8b­ì\8b\9cì\98¤.',
+'linkstoimage' => '다음 {{PLURAL:$1|문서 $1개}}가 이 파일을 가리키고 있습니다:',
+'linkstoimage-more' => '$1개 이상의 {{PLURAL:$1|문서}}가 이 파일을 가리키고 있습니다.
+다음 목록은 이 파일을 {{PLURAL:$1|가리키는 처음 문서 $1개}}만 보여주고 있습니다.
+이 파일을 가리키는 [[Special:WhatLinksHere/$2|모ë\93  ë¬¸ì\84\9c ëª©ë¡\9d]]ì\9d\84 ë³¼ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.',
 'nolinkstoimage' => '이 파일을 사용하는 문서가 없습니다.',
 'morelinkstoimage' => '이 파일이 쓰이고 있는 문서 목록 [[Special:WhatLinksHere/$1|더 보기]].',
 'linkstoimage-redirect' => '$1 (파일 넘겨주기) $2',
-'duplicatesoffile' => '다음 파일 $1개가 이 파일과 중복됩니다 ([[Special:FileDuplicateSearch/$2|자세한 정보]]):',
+'duplicatesoffile' => '다음 {{PLURAL:$1|파일 $1개}}가 이 파일과 중복됩니다 ([[Special:FileDuplicateSearch/$2|자세한 정보]]):',
 'sharedupload' => '이 파일은 $1으로부터 왔고, 다른 프로젝트에서 사용하고 있을 가능성이 있습니다.',
 'sharedupload-desc-there' => '이 파일은 $1에 있으며, 다른 프로젝트에서 사용하고 있을 가능성이 있습니다.
 [$2 해당 파일]에 대한 자세한 정보를 확인해주세요.',
@@ -2112,7 +2153,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 ** 저작권 침해
 ** 중복된 파일',
 'filedelete-edit-reasonlist' => '삭제 이유 편집',
-'filedelete-maintenance' => 'ì \90ê²\80 ì¤\91ì\97\90ë\8a\94 ì\9e\84ì\8b\9cì \81ì\9c¼ë¡\9c ì\82­ì \9cì\99\80 ë³µêµ¬를 할 수 없습니다.',
+'filedelete-maintenance' => 'ì \90ê²\80 ì¤\91ì\97\90ë\8a\94 ì\9e\84ì\8b\9cì \81ì\9c¼ë¡\9c ì\82­ì \9cì\99\80 ë\90\98ì\82´ë¦¬ê¸°를 할 수 없습니다.',
 'filedelete-maintenance-title' => '파일을 삭제할 수 없습니다',
 
 # MIME search
@@ -2160,7 +2201,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'statistics-views-peredit' => '편집당 방문 횟수',
 'statistics-users' => '등록된 [[Special:ListUsers|사용자]]',
 'statistics-users-active' => '활동적인 사용자',
-'statistics-users-active-desc' => '최근 $1일 동안 활동한 사용자',
+'statistics-users-active-desc' => '최근 {{PLURAL:$1|$1일}} 동안 활동한 사용자',
 'statistics-mostpopular' => '가장 많이 읽힌 문서',
 
 'disambiguations' => '동음이의 문서를 가리키는 문서 목록',
@@ -2169,8 +2210,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 그 링크는 다른 적절한 문서로 연결할 필요가 있습니다.<br />
 [[MediaWiki:Disambiguationspage]]에서 링크된 틀을 사용하는 문서를 동음이의 문서로 간주합니다.",
 
-'pageswithprop' => '문ì\84\9c ì\86\8dì\84±ì\9c¼ë¡\9c ë\90\9c 문서',
-'pageswithprop-legend' => '문ì\84\9c ì\86\8dì\84±ì\9c¼ë¡\9c ë\90\9c 문서',
+'pageswithprop' => '문ì\84\9c ì\86\8dì\84±ì\9d´ ì\9e\88ë\8a\94 문서',
+'pageswithprop-legend' => '문ì\84\9c ì\86\8dì\84±ì\9d´ ì\9e\88ë\8a\94 문서',
 'pageswithprop-text' => '이 문서는 특정 문서 속성을 사용한 문서를 나타냅니다.',
 'pageswithprop-prop' => '속성 이름:',
 'pageswithprop-submit' => '가기',
@@ -2197,15 +2238,15 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'fewestrevisions' => '편집 역사가 짧은 문서 목록',
 
 # Miscellaneous special pages
-'nbytes' => '$1 바이트',
-'ncategories' => '분류 $1개',
+'nbytes' => '$1 {{PLURAL:$1|바이트}}',
+'ncategories' => '{{PLURAL:$1|분류}} $1개',
 'ninterwikis' => '{{PLURAL:$1|인터위키}} $1개',
-'nlinks' => '링크 $1개',
-'nmembers' => '문서 $1개',
-'nrevisions' => '편집 $1개',
-'nviews' => '$1회 읽음',
-'nimagelinks' => '문서 $1개에서 사용 중',
-'ntransclusions' => '문서 $1개에서 사용 중',
+'nlinks' => '{{PLURAL:$1|링크}} $1개',
+'nmembers' => '{{PLURAL:$1|문서}} $1개',
+'nrevisions' => '{{PLURAL:$1|판}} $1개',
+'nviews' => '$1번 {{PLURAL:$1|읽음}}',
+'nimagelinks' => '{{PLURAL:$1|문서}} $1개에서 사용 중',
+'ntransclusions' => '{{PLURAL:$1|문서}} $1개에서 사용 중',
 'specialpage-empty' => '명령에 대한 결과가 없습니다.',
 'lonelypages' => '외톨이 문서 목록',
 'lonelypagestext' => '{{SITENAME}}에서 다른 모든 문서에서 링크되거나 틀로 포함되지 않은 문서의 목록입니다.',
@@ -2215,7 +2256,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'uncategorizedtemplates' => '분류되지 않은 틀 목록',
 'unusedcategories' => '사용하지 않는 분류 목록',
 'unusedimages' => '사용하지 않는 파일 목록',
-'popularpages' => '인기있는 문서 목록',
+'popularpages' => '인기 있는 문서 목록',
 'wantedcategories' => '필요한 분류 목록',
 'wantedpages' => '필요한 문서 목록',
 'wantedpages-badtitle' => '문서 제목이 잘못되었습니다: $1',
@@ -2247,7 +2288,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'listusers' => '사용자 목록',
 'listusers-editsonly' => '기여가 있는 사용자만 보기',
 'listusers-creationsort' => '계정 등록일 순으로 정렬',
-'usereditcount' => '편집 $1회',
+'usereditcount' => '{{PLURAL:$1|편집}} $1회',
 'usercreated' => '$1 $2에 계정 {{GENDER:$3|만들어짐}}',
 'newpages' => '새 문서 목록',
 'newpages-username' => '사용자 이름:',
@@ -2259,10 +2300,10 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'unusedcategoriestext' => '사용하지 않는 분류 문서의 목록입니다.',
 'notargettitle' => '해당하는 문서 없음',
 'notargettext' => '기능을 수행할 대상 문서나 사용자를 지정하지 않았습니다.',
-'nopagetitle' => '해당 문서 없음',
+'nopagetitle' => '해당하는 문서 없음',
 'nopagetext' => '찾는 문서가 존재하지 않습니다.',
-'pager-newer-n' => '이전 $1개',
-'pager-older-n' => '다음 $1개',
+'pager-newer-n' => '{{PLURAL:$1|다음 1개|다음 $1개}}',
+'pager-older-n' => '{{PLURAL:$1|이전 1개|이전 $1개}}',
 'suppress' => '오버사이트',
 'querypage-disabled' => '이 특수 문서는 성능상의 이유로 비활성화되었습니다.',
 
@@ -2299,7 +2340,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'allpagesnext' => '다음',
 'allpagessubmit' => '보기',
 'allpagesprefix' => '다음으로 시작하는 문서 보기:',
-'allpagesbadtitle' => '문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키를 가지고 있습니다.
+'allpagesbadtitle' => '주어진 문서 제목이 잘못되었거나 다른 사이트로 연결되는 인터위키가 있습니다.
 문서 제목에 사용할 수 없는 문자를 사용했을 수 있습니다.',
 'allpages-bad-ns' => '{{SITENAME}}에서는 "$1" 이름공간을 사용하지 않습니다.',
 'allpages-hide-redirects' => '넘겨주기 숨기기',
@@ -2311,7 +2352,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 
 # Special:Categories
 'categories' => '분류 목록',
-'categoriespagetext' => '{{PLURAL:$1}}문서나 자료를 담고 있는 분류 목록입니다.
+'categoriespagetext' => '문서나 자료를 {{PLURAL:$1|포함하고 있는 분류}} 목록입니다.
 [[Special:UnusedCategories|사용되지 않는 분류]]는 여기에 보이지 않습니다.
 [[Special:WantedCategories|필요한 분류]]도 참고하세요.',
 'categoriesfrom' => '다음으로 시작하는 분류를 보여주기:',
@@ -2342,8 +2383,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 
 # Special:ActiveUsers
 'activeusers' => '활동적인 사용자 목록',
-'activeusers-intro' => '다음은 최근 $1 동안 활동한 사용자의 목록입니다.',
-'activeusers-count' => '최근 {{PLURAL:$3|1일|$3일}} 사이의 {{PLURAL:$1|활동}} $1회',
+'activeusers-intro' => '다음은 최근 $1{{PLURAL:$1|일}} 동안 활동한 사용자의 목록입니다.',
+'activeusers-count' => '최근 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회',
 'activeusers-from' => '다음으로 시작하는 사용자를 보기:',
 'activeusers-hidebots' => '봇을 숨기기',
 'activeusers-hidesysops' => '관리자를 숨기기',
@@ -2351,13 +2392,13 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 
 # Special:ListGroupRights
 'listgrouprights' => '사용자 권한 목록',
-'listgrouprights-summary' => '다음은 이 위키에서 설정된 사용자 권한 그룹의 목록입니다.
-ê°\81ê°\81ì\9d\98 ê¶\8cí\95\9cì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[{{MediaWiki:Listgrouprights-helppage}}|ì\9d´ê³³]]ì\9d\84 참고하세요.',
+'listgrouprights-summary' => '다음은 이 위키에 있는 사용자 권한 그룹의 목록입니다.
+ê°\81ê°\81ì\9d\98 ê¶\8cí\95\9cì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 [[{{MediaWiki:Listgrouprights-helppage}}|ì\94ê°\80 ì \95ë³´]]를 참고하세요.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">부여된 권한</span>
 * <span class="listgrouprights-revoked">해제된 권한</span>',
 'listgrouprights-group' => '그룹',
 'listgrouprights-rights' => '권한',
-'listgrouprights-helppage' => 'Help:사용자 권한 그룹',
+'listgrouprights-helppage' => 'Help:사용자 권한',
 'listgrouprights-members' => '(사용자 목록)',
 'listgrouprights-addgroup' => '{{PLURAL:$2|권한}} 부여: $1',
 'listgrouprights-removegroup' => '{{PLURAL:$2|권한}} 회수: $1',
@@ -2426,14 +2467,14 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'notanarticle' => '문서가 아님',
 'notvisiblerev' => '이 판은 삭제되었습니다.',
 'watchnochange' => '주어진 기간 중에 바뀐 주시문서가 없습니다.',
-'watchlist-details' => '토론을 제외하고 문서 $1개를 주시하고 있습니다.',
-'wlheader-enotif' => '이메일 알림 기능이 활성화되었습니다.',
-'wlheader-showupdated' => "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보여집니다.",
+'watchlist-details' => '토론을 제외하고 {{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
+'wlheader-enotif' => '이메일 알림 기능이 활성화되었습니다.',
+'wlheader-showupdated' => "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보여집니다.",
 'watchmethod-recent' => '주시된 문서를 확인하고자 최근 편집을 확인',
 'watchmethod-list' => '최근 편집을 확인하고자 주시된 문서 확인',
-'watchlistcontains' => '문서 $1개를 주시하고 있습니다.',
+'watchlistcontains' => '{{PLURAL:$1|문서 $1개}}를 주시하고 있습니다.',
 'iteminvalidname' => "'$1' 항목에 문제가 발생했습니다. 이름이 잘못되었습니다...",
-'wlnote' => "다음은 최근 '''$2'''시간 동안 바뀐 문서 '''$1'''개 입니다. ($3 $4 기준)",
+'wlnote' => "다음은 최근 {{PLURAL:$2|'''$2'''시간}} 동안 {{PLURAL:$1|바뀐 문서 '''$1'''개 입니다}}. ($3 $4 기준)",
 'wlshowlast' => '최근 $1시간 $2일 또는 $3 동안에 바뀐 문서',
 'watchlist-options' => '주시문서 목록 설정',
 
@@ -2445,18 +2486,18 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'enotif_mailer' => '{{SITENAME}} 자동 알림 메일',
 'enotif_reset' => '모든 문서를 방문한 것으로 표시하기',
 'enotif_impersonal_salutation' => '{{SITENAME}} 사용자',
-'enotif_subject_deleted' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 삭제했습니다',
-'enotif_subject_created' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 만들었습니다',
-'enotif_subject_moved' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 옮겼습니다',
-'enotif_subject_restored' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 복구했습니다',
-'enotif_subject_changed' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 바꾸었습니다',
-'enotif_body_intro_deleted' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 삭제했습니다. $3 에서 볼 수 있습니다.',
-'enotif_body_intro_created' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 만들었습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_body_intro_moved' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 옮겼습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_body_intro_restored' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 복구했습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_body_intro_changed' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 바꾸었습니다. 현재 판은 $3 에서 볼 수 있습니다.',
-'enotif_lastvisited' => '마지막으로 방문한 뒤 생긴 모든 바뀜 사항을 보려면 $1 을 보세요.',
-'enotif_lastdiff' => 'ì\9d´ ë°\94ë\80\90 ë\82´ì\9a©을 보려면 $1 을 보세요.',
+'enotif_subject_deleted' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|삭제했습니다}}',
+'enotif_subject_created' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|만들었습니다}}',
+'enotif_subject_moved' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|옮겼습니다}}',
+'enotif_subject_restored' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|되살렸습니다}}',
+'enotif_subject_changed' => '{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|바꾸었습니다}}',
+'enotif_body_intro_deleted' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|삭제했으며}} $3 에서 볼 수 있습니다.',
+'enotif_body_intro_created' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|만들었으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_moved' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|옮겼으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_restored' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_changed' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_lastvisited' => '마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1 을 보세요.',
+'enotif_lastdiff' => 'ì\9d´ ë°\94ë\80\9c을 보려면 $1 을 보세요.',
 'enotif_anon_editor' => '익명 사용자 $1',
 'enotif_body' => '$WATCHINGUSERNAME님,
 
@@ -2496,7 +2537,7 @@ $UNWATCHURL
 'exblank' => '빈 문서',
 'delete-confirm' => '"$1" 삭제',
 'delete-legend' => '삭제',
-'historywarning' => "'''경고:''' 삭제하려는 문서에 과거 편집 내역 약 $1개가 있습니다:",
+'historywarning' => "'''경고:''' 삭제하려는 문서에 이전 {{PLURAL:$1|편집 역사}} 약 $1개가 있습니다:",
 'confirmdeletetext' => '문서와 문서 역사를 삭제하려고 합니다.
 삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.',
 'actioncomplete' => '명령 완료',
@@ -2515,9 +2556,9 @@ $UNWATCHURL
 ** 저작권 침해
 ** 훼손 행위',
 'delete-edit-reasonlist' => '삭제 이유 편집',
-'delete-toobig' => '이 문서에는 편집 역사가 $1개 있습니다.
+'delete-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
 편집 역사가 긴 문서를 삭제하면 {{SITENAME}}에 큰 혼란을 줄 수 있기 때문에 삭제할 수 없습니다.',
-'delete-warning-toobig' => '이 문서에는 편집 역사가 $1개 있습니다.
+'delete-warning-toobig' => '이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.
 편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.
 주의해 주세요.',
 
@@ -2525,11 +2566,11 @@ $UNWATCHURL
 'rollback' => '편집 되돌리기',
 'rollback_short' => '되돌리기',
 'rollbacklink' => '되돌리기',
-'rollbacklinkcount' => '편집 $1회 되돌리기',
-'rollbacklinkcount-morethan' => '편집 $1회 이상 되돌리기',
+'rollbacklinkcount' => '{{PLURAL:$1|편집}} $1회 되돌리기',
+'rollbacklinkcount-morethan' => '{{PLURAL:$1|편집}} $1회 이상 되돌리기',
 'rollbackfailed' => '되돌리기 실패',
 'cantrollback' => '편집을 되돌릴 수 없습니다.
-문서를 편집한 사용자가 한명뿐입니다.',
+문서를 편집한 사용자가 한 명뿐입니다.',
 'alreadyrolled' => '[[:$1]]에서 [[User:$2|$2]] ([[User talk:$2|토론]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])의 편집을 되돌릴 수 없습니다.
 누군가가 이미 문서를 고치거나 되돌렸습니다.
 
@@ -2547,7 +2588,7 @@ $UNWATCHURL
 
 # Protect
 'protectlogpage' => '문서 보호 기록',
-'protectlogtext' => '아래의 목록은 문서 보호에 관한 바뀜 사항에 대한 기록입니다.
+'protectlogtext' => '아래의 목록은 문서 보호에 관한 바뀜에 대한 기록입니다.
 현재 보호된 문서의 목록에 대해서는 [[Special:ProtectedPages|보호된 문서 목록]]을 참고하세요.',
 'protectedarticle' => '사용자가 "[[$1]]" 문서를 보호했습니다',
 'modifiedarticleprotection' => '사용자가 "[[$1]]" 문서의 보호 설정을 바꿨습니다',
@@ -2555,7 +2596,7 @@ $UNWATCHURL
 'movedarticleprotection' => '사용자가 문서의 보호 설정을 "[[$2]]"에서 "[[$1]]"으로 옮겼습니다',
 'protect-title' => '"$1" 보호하기',
 'protect-title-notallowed' => '"$1" 문서의 보호 수준 보기',
-'prot_1movedto2' => '[[$1]] ë¬¸ì\84\9c를 [[$2]] ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95¨',
+'prot_1movedto2' => '[[$1]] ë¬¸ì\84\9c를 [[$2]] ë¬¸ì\84\9cë¡\9c ì\98®ê¹\80',
 'protect-badnamespace-title' => '보호할 수 없는 이름공간',
 'protect-badnamespace-text' => '이 이름공간에 있는 문서는 보호할 수 없습니다.',
 'protect-norestrictiontypes-text' => '이 문서는 제한 유형을 사용할 수 없음으로 보호할 수 없습니다.',
@@ -2621,49 +2662,49 @@ $UNWATCHURL
 'viewdeletedpage' => '삭제된 문서 보기',
 'undeletepagetext' => '다음 {{PLURAL:$1|문서는|문서 $1개는}} 삭제되었지만 아직 보관되어 있고 되살릴 수 있습니다.
 보관된 문서는 주기적으로 삭제될 것입니다.',
-'undelete-fieldset-title' => '문ì\84\9c ë³µêµ¬',
-'undeleteextrahelp' => "문ì\84\9c ì\97­ì\82¬ ì \84체를 ë³µêµ¬í\95\98려면 모든 체크박스의 선택을 해제하고 '''{{int:undeletebtn}}'''를 누르세요.
\8a¹ì \95í\95\9c ë²\84ì \84ë§\8c ë³µêµ¬í\95\98려면 ë³µêµ¬í\95\98려는 버전을 선택하고 '''{{int:undeletebtn}}'''를 누르세요.",
-'undeleterevisions' => '판 $1개 보관중',
+'undelete-fieldset-title' => '문ì\84\9c ë\90\98ì\82´ë¦¬ê¸°',
+'undeleteextrahelp' => "문ì\84\9c ì\97­ì\82¬ ì \84체를 ë\90\98ì\82´ë¦¬려면 모든 체크박스의 선택을 해제하고 '''{{int:undeletebtn}}'''를 누르세요.
\8a¹ì \95í\95\9c ë²\84ì \84ë§\8c ë\90\98ì\82´ë¦¬ë ¤ë©´ ë\90\98ì\82´ë¦¬려는 버전을 선택하고 '''{{int:undeletebtn}}'''를 누르세요.",
+'undeleterevisions' => '{{PLURAL:$1|판}} $1개 보관 중',
 'undeletehistory' => '문서를 되살리면 모든 역사가 같이 복구됩니다.
 문서가 삭제된 뒤 같은 이름의 문서가 만들어졌다면, 복구되는 역사는 지금 역사의 과거 부분에 나타날 것입니다.',
-'undeleterevdel' => '복구í\95\98ë ¤ë\8a\94 ë¬¸ì\84\9cì\9d\98 ìµ\9cì\8b í\8c\90ì\9d´ ì\82­ì \9cë\90\98ì\96´ ì\9e\88ë\8a\94 ê²½ì\9a° ë¬¸ì\84\9c를 ë³µêµ¬ì\8b\9cí\82¬ 수 없습니다.
+'undeleterevdel' => '복구í\95\98ë ¤ë\8a\94 ë¬¸ì\84\9cì\9d\98 ìµ\9cì\8b í\8c\90ì\9d´ ì\82­ì \9cë\90\98ì\96´ ì\9e\88ë\8a\94 ê²½ì\9a° ë¬¸ì\84\9c를 ë\90\98ì\82´ë¦´ 수 없습니다.
 이러한 경우 삭제된 최신판 문서의 확인 상자를 선택 해제하거나 숨김을 해제해야 합니다.',
 'undeletehistorynoadmin' => '이 문서는 삭제되었습니다.
 삭제된 이유와 삭제되기 전에 이 문서를 편집한 사용자가 아래에 나와 있습니다.
 삭제된 문서의 내용을 보려면 관리자 권한이 필요합니다.',
 'undelete-revision' => '삭제된 $1 문서의 $4 $5 버전 (기여자 $3):',
 'undeleterevision-missing' => '해당 판이 잘못되었거나 존재하지 않습니다.
\9e\98못ë\90\9c ë§\81í\81¬ë¥¼ ë\94°ë\9d¼ì\99\94ê±°ë\82\98, í\8a¹ì \95 í\8c\90ì\9d´ ì\9d´ë¯¸ ë³µêµ¬ë\90\98거나 데이터베이스에서 제거되었을 수도 있습니다.',
\9e\98못ë\90\9c ë§\81í\81¬ë¥¼ ë\94°ë\9d¼ì\99\94ê±°ë\82\98, í\8a¹ì \95 í\8c\90ì\9d´ ì\9d´ë¯¸ ë\90\98ì\82´ë ¸거나 데이터베이스에서 제거되었을 수도 있습니다.',
 'undelete-nodiff' => '이전의 판이 없습니다.',
-'undeletebtn' => '복구',
+'undeletebtn' => 'ë\90\98ì\82´ë¦¬ê¸°',
 'undeletelink' => '보기/되살리기',
 'undeleteviewlink' => '보기',
 'undeletereset' => '초기화',
 'undeleteinvert' => '선택 반전',
 'undeletecomment' => '이유:',
-'undeletedrevisions' => '판 $1개를 복구했습니다',
-'undeletedrevisions-files' => '판 $1개와 파일 $2개를 복구했습니다.',
-'undeletedfiles' => '파일 $1개를 복구했습니다',
-'cannotundelete' => '복구í\95\98는 데 실패했습니다:
+'undeletedrevisions' => '{{PLURAL:$1|판 1개|판 $1개}}를 되살렸습니다',
+'undeletedrevisions-files' => '{{PLURAL:$1|판 1개|판 $1개}}와 {{PLURAL:$2|파일 1개|파일 $2개}}를 되살렸습니다',
+'undeletedfiles' => '{{PLURAL:$1|파일 1개|파일 $1개}}를 되살렸습니다',
+'cannotundelete' => 'ë\90\98ì\82´ë¦¬는 데 실패했습니다:
 $1',
-'undeletedpage' => "'''$1 ë¬¸ì\84\9c를 ë³µêµ¬í\96\88습니다.'''
+'undeletedpage' => "'''$1 ë¬¸ì\84\9c를 ë\90\98ì\82´ë ¸습니다.'''
 
-[[Special:Log/delete|ì\82­ì \9c ê¸°ë¡\9d]]ì\97\90ì\84\9c ìµ\9cê·¼ì\9d\98 ì\82­ì \9cì\99\80 ë³µêµ¬ 기록을 볼 수 있습니다.",
+[[Special:Log/delete|ì\82­ì \9c ê¸°ë¡\9d]]ì\97\90ì\84\9c ìµ\9cê·¼ì\9d\98 ì\82­ì \9cì\99\80 ë\90\98ì\82´ë¦¬ê¸° 기록을 볼 수 있습니다.",
 'undelete-header' => '최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.',
 'undelete-search-title' => '삭제된 문서 찾기',
 'undelete-search-box' => '삭제된 문서 찾기',
 'undelete-search-prefix' => '다음으로 시작하는 문서 보기:',
 'undelete-search-submit' => '찾기',
 'undelete-no-results' => '삭제된 문서 보존 자료에서 입력한 값에 맞는 문서가 없습니다.',
-'undelete-filename-mismatch' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë³µêµ¬í\95  수 없습니다: 파일 이름이 일치하지 않습니다.',
-'undelete-bad-store-key' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë³µêµ¬í\95  수 없습니다: 파일이 삭제되기 전에 사라졌습니다.',
+'undelete-filename-mismatch' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë\90\98ì\82´ë¦´ 수 없습니다: 파일 이름이 일치하지 않습니다.',
+'undelete-bad-store-key' => 'í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\98 ë²\84ì \84ì\9d\84 ë\90\98ì\82´ë¦´ 수 없습니다: 파일이 삭제되기 전에 사라졌습니다.',
 'undelete-cleanup-error' => '사용되지 않는 보존된 파일 "$1"을 삭제하는 데 오류가 발생했습니다.',
-'undelete-missing-filearchive' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì¡´ì\9e¬í\95\98ì§\80 ì\95\8a기 ë\95\8c문ì\97\90 í\8c\8cì\9d¼ ë³´ì¡´ IDê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\84 ë³µêµ¬í\95  수 없습니다.
\9d´ë¯¸ ë³µêµ¬ë\90\98ì\97\88을 수 있습니다.',
-'undelete-error' => '문서 복구 중 오류',
-'undelete-error-short' => '파일 복구 오류: $1',
-'undelete-error-long' => 'í\8c\8cì\9d¼ì\9d\84 ë³µêµ¬í\95\98는 동안 오류가 발생했습니다:
+'undelete-missing-filearchive' => 'ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ì\97\90 ì¡´ì\9e¬í\95\98ì§\80 ì\95\8a기 ë\95\8c문ì\97\90 í\8c\8cì\9d¼ ë³´ì¡´ IDê°\80 $1ì\9d¸ í\8c\8cì\9d¼ì\9d\84 ë\90\98ì\82´ë¦´ 수 없습니다.
\9d´ë¯¸ ë\90\98ì\82´ë ¸을 수 있습니다.',
+'undelete-error' => '문서를 되살리는 동안 오류',
+'undelete-error-short' => '파일을 되살리는 동안 오류: $1',
+'undelete-error-long' => 'í\8c\8cì\9d¼ì\9d\84 ë\90\98ì\82´ë¦¬는 동안 오류가 발생했습니다:
 
 $1',
 'undelete-show-file-confirm' => '정말 "<nowiki>$1</nowiki>" 파일의 삭제된 $2 $3 버전을 보시겠습니까?',
@@ -2820,7 +2861,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다.
 자동으로 차단된 IP 주소는 여기에 나오지 않습니다.
 [[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
-'unblocklogentry' => '사용자가 $1 사용자를 차단 해제했습니다.',
+'unblocklogentry' => '사용자가 $1 사용자를 차단 해제했습니다',
 'block-log-flags-anononly' => 'IP만 막음',
 'block-log-flags-nocreate' => '계정 만들기 금지됨',
 'block-log-flags-noautoblock' => '자동 차단 비활성화됨',
@@ -2832,7 +2873,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'ipb_expiry_invalid' => '차단 기간이 잘못되었습니다.',
 'ipb_expiry_temp' => '사용자 이름을 숨기는 차단은 반드시 무기한이어야 합니다.',
 'ipb_hide_invalid' => '해당 계정은 막을 수 없습니다. 기여량이 너무 많습니다.',
-'ipb_already_blocked' => '"$1" ì\82¬ì\9a©ì\9e\90ë\8a\94 ì\9d´ë¯¸ ì°¨ë\8b¨ë\90¨',
+'ipb_already_blocked' => '"$1" ì\82¬ì\9a©ì\9e\90ë\8a\94 ì\9d´ë¯¸ ì°¨ë\8b¨ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤',
 'ipb-needreblock' => '$1 사용자는 이미 차단되었습니다. 차단 설정을 바꾸시겠습니까?',
 'ipb-otherblocks-header' => '다른 {{PLURAL:$1|차단}} 기록',
 'unblock-hideuser' => '이 사용자 이름이 숨겨져 있기 때문에 이 사용자를 차단 해제할 수 없습니다.',
@@ -2850,6 +2891,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'sorbsreason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.',
 'sorbs_create_account_reason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.
 계정을 만들 수 없습니다.',
+'xffblockreason' => 'X-Forwarded-For 헤더에 현재 사용하고 있는 프록시 서버 중 당신이나 해당 IP 주소가 차단되었습니다. 차단 이유는 다음과 같습니다: $1',
 'cant-block-while-blocked' => '자신이 차단되어 있는 동안에는 다른 사용자를 차단할 수 없습니다.',
 'cant-see-hidden-user' => '차단하려 하는 사용자는 이미 차단되었고 숨김 처리되었습니다.
 사용자 숨기기 권한을 갖고 있지 않기 때문에, 이 사용자의 차단 기록을 보거나 차단 설정을 바꿀 수 없습니다.',
@@ -2876,7 +2918,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'lockfilenotwritable' => '데이터베이스 잠금 파일에 쓰기 권한이 없습니다.
 데이터베이스를 잠그거나 잠금 해제하려면, 웹 서버에서 이 파일의 쓰기 권한을 설정해야 합니다.',
 'databasenotlocked' => '데이터베이스가 잠겨 있지 않습니다.',
-'lockedbyandtime' => '($1이 $2 $3에 잠금)',
+'lockedbyandtime' => '({{GENDER:$1|$1}} 사용자가 $2 $3에 잠금)',
 
 # Move page
 'move-page' => '$1 이동',
@@ -2910,36 +2952,36 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
 'movearticle' => '문서 이동하기',
-'moveuserpage-warning' => "'''경고:''' ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c를 ì\98®ê¸°ë ¤ í\95\98ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9cë§\8c ì\9d´ë\8f\99ë\90\98ë©° ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84ì\9d´ ë°\94ë\80\8cì§\80 '''ì\95\8aë\8a\94ë\8b¤'''ë\8a\94 ì \90ì\9d\84 ì°¸ê³ í\95´ì£¼ì\8b\9c기 ë°\94ë\9e\8dë\8b\88ë\8b¤.",
+'moveuserpage-warning' => "'''경고:''' ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c를 ì\98®ê¸°ë ¤ í\95\98ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9cë§\8c ì\9d´ë\8f\99ë\90\98ë©° ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84ì\9d´ ë°\94ë\80\8cì§\80 '''ì\95\8aë\8a\94ë\8b¤'''ë\8a\94 ì \90ì\9d\84 ì°¸ê³ í\95\98ì\84¸ì\9a\94.",
 'movenologin' => '로그인하지 않음',
 'movenologintext' => '문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.',
-'movenotallowed' => '문ì\84\9c를 ì\9d´ë\8f\99í\95  권한이 없습니다.',
-'movenotallowedfile' => 'í\8c\8cì\9d¼ì\9d\84 ì\9d´ë\8f\99í\95  권한이 없습니다.',
-'cant-move-user-page' => 'ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95  권한이 없습니다(하위 문서는 예외).',
-'cant-move-to-user-page' => '문ì\84\9c를 ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95  권한이 없습니다(하위 문서는 예외).',
+'movenotallowed' => '문ì\84\9c를 ì\98®ê¸¸ 권한이 없습니다.',
+'movenotallowedfile' => 'í\8c\8cì\9d¼ì\9d\84 ì\98®ê¸¸ 권한이 없습니다.',
+'cant-move-user-page' => 'ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c를 ì\98®ê¸¸ 권한이 없습니다(하위 문서는 예외).',
+'cant-move-to-user-page' => '문ì\84\9c를 ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9cë¡\9c ì\98®ê¸¸ 권한이 없습니다(하위 문서는 예외).',
 'newtitle' => '새 문서 이름',
 'move-watch' => '문서 주시하기',
 'movepagebtn' => '이동',
-'pagemovedsub' => '문서 이동함',
-'movepage-moved' => '\'\'\'"$1" ë¬¸ì\84\9c를 "$2" ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\96\88습니다.\'\'\'',
+'pagemovedsub' => '옮기기 성공',
+'movepage-moved' => '\'\'\'"$1" ë¬¸ì\84\9c를 "$2" ë¬¸ì\84\9cë¡\9c ì\98®ê²¼습니다.\'\'\'',
 'movepage-moved-redirect' => '넘겨주기 문서를 만들었습니다.',
 'movepage-moved-noredirect' => '넘겨주기 문서를 남기지 않았습니다.',
 'articleexists' => '문서가 이미 존재하거나 이름이 올바르지 않습니다.
\8b¤ë¥¸ ì \9c목ì\9c¼ë¡\9c ì\8b\9cë\8f\84í\95´ì£¼세요.',
-'cantmove-titleprotected' => 'ì\83\88ë¡\9cì\9a´ ì \9c목ì\9c¼ë¡\9c ë¬¸ì\84\9c를 ë§\8cë\93\9cë\8a\94 ê²\83ì\9d´ ê¸\88ì§\80ë\90\98ì\96´ ì\9e\88ì\96´ ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95  ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤.',
\8b¤ë¥¸ ì\9d´ë¦\84ì\9d\84 ì\84 í\83\9dí\95\98세요.',
+'cantmove-titleprotected' => 'ì\83\88ë¡\9cì\9a´ ì \9c목ì\9c¼ë¡\9c ë¬¸ì\84\9c를 ë§\8cë\93\9cë\8a\94 ê²\83ì\9d´ ê¸\88ì§\80ë\90\98ì\96´ ì\9e\88ì\96´ ë¬¸ì\84\9c를 ì\98®ê¸¸ ì\88\98 ì\97\86ì\8aµë\8b\88ë\8b¤',
 'talkexists' => "'''문서는 이동되었습니다. 하지만 딸린 토론 문서의 새 이름으로 된 문서가 이미 있기 때문에 토론 문서는 옮기지 못했습니다. 직접 문서를 합쳐 주세요.'''",
 'movedto' => '새 이름',
 'movetalk' => '딸린 토론도 함께 이동합니다.',
 'move-subpages' => '하위 문서도 함께 ($1개 이하) 이동합니다.',
 'move-talk-subpages' => '토론 문서의 하위 문서도 ($1개까지) 함께 이동합니다.',
-'movepage-page-exists' => '이동할 수 없습니다. "$1" 문서가 이미 존재합니다.',
-'movepage-page-moved' => '"$1" ë¬¸ì\84\9c를 "$2" ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\96\88습니다.',
-'movepage-page-unmoved' => '"$1" 문서를 "$2" 문서로 이동할 수 없습니다.',
-'movepage-max-pages' => '문서를 최대 $1개 이동했습니다. 나머지 문서는 자동 이동하지 않습니다.',
+'movepage-page-exists' => '$1 문서가 이미 존재하므로 자동으로 덮어쓸 수 없습니다.',
+'movepage-page-moved' => '"$1" ë¬¸ì\84\9c를 "$2" ë¬¸ì\84\9cë¡\9c ì\98®ê²¼습니다.',
+'movepage-page-unmoved' => '$1 문서를 $2 문서로 옮길 수 없습니다.',
+'movepage-max-pages' => '{{PLURAL:$1|문서}}를 최대 $1개 옮겼으며 나머지 문서는 자동으로 옮기지 않습니다.',
 'movelogpage' => '이동 기록',
 'movelogpagetext' => '아래는 이동한 문서의 목록입니다.',
 'movesubpage' => '{{PLURAL:$1|하위 문서}}',
-'movesubpagetext' => '이 문서에는 다음 하위 문서 $1개가 있습니다.',
+'movesubpagetext' => '이 문서에는 다음 {{PLURAL:$1|하위 문서}} $1개가 있습니다.',
 'movenosubpage' => '이 문서에는 하위 문서가 존재하지 않습니다.',
 'movereason' => '이유:',
 'revertmove' => '되돌리기',
@@ -2950,11 +2992,11 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'delete_and_move_confirm' => '네. 문서를 삭제합니다',
 'delete_and_move_reason' => '"[[$1]]"에서 문서를 이동하기 위해 삭제함',
 'selfmove' => '이동하려는 제목이 원래 제목과 같습니다.
-이동할 수 없습니다.',
+같은 제목으로는 옮길 수 없습니다.',
 'immobile-source-namespace' => '"$1" 이름공간에 속한 문서는 이동시킬 수 없습니다.',
 'immobile-target-namespace' => '"$1" 이름공간에 속한 문서는 이동시킬 수 없습니다.',
-'immobile-target-namespace-iw' => 'ì\9d¸í\84°ì\9c\84í\82¤ ë§\81í\81¬ë¥¼ ë\84\98ì\96´ ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95  수 없습니다.',
-'immobile-source-page' => 'ì\9d´ ë¬¸ì\84\9cë\8a\94 ì\9d´ë\8f\99í\95  수 없습니다.',
+'immobile-target-namespace-iw' => 'ì\9d¸í\84°ì\9c\84í\82¤ ë§\81í\81¬ë¥¼ ë\84\98ì\96´ ë¬¸ì\84\9c를 ì\98®ê¸¸ 수 없습니다.',
+'immobile-source-page' => 'ì\9d´ ë¬¸ì\84\9cë\8a\94 ì\98®ê¸¸ 수 없습니다.',
 'immobile-target-page' => '새 이름으로 옮길 수 없습니다.',
 'bad-target-model' => '원하는 대상은 다른 내용 모델을 사용합니다. $1에서 $2로 변환할 수 없습니다.',
 'imagenocrossnamespace' => '파일을 파일이 아닌 이름공간으로 옮길 수 없습니다.',
@@ -3014,6 +3056,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'thumbnail-more' => '실제 크기로',
 'filemissing' => '파일 사라짐',
 'thumbnail_error' => '섬네일을 만드는 중 오류 발생: $1',
+'thumbnail_error_remote' => '$1에서 반환한 오류 메시지:
+$2',
 'djvu_page_error' => 'DjVu 페이지 범위 벗어남',
 'djvu_no_xml' => 'DjVu 파일의 XML 정보를 읽을 수 없음',
 'thumbnail-temp-create' => '임시 섬네일 파일을 만들 수 없습니다.',
@@ -3041,9 +3085,9 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'importtext' => '원본 위키에서 [[Special:Export|내보내기]] 기능을 사용해 파일을 내려받으세요.
 그리고 당신의 컴퓨터에 저장해 둔 후 여기에 올려주세요.',
 'importstart' => '문서를 가져오는 중...',
-'import-revision-count' => ' $1개',
+'import-revision-count' => '{{PLURAL:$1|판}} $1개',
 'importnopages' => '가져올 문서가 없습니다.',
-'imported-log-entries' => '기록 항목 $1개를 가져왔습니다.',
+'imported-log-entries' => '{{PLURAL:$1|기록 항목}} $1개를 가져왔습니다.',
 'importfailed' => '가져오기 실패: <nowiki>$1</nowiki>',
 'importunknownsource' => '알 수 없는 가져오기 자료 유형',
 'importcantopen' => '파일을 열 수 없습니다.',
@@ -3080,10 +3124,10 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 # Import log
 'importlogpage' => '가져오기 기록',
 'importlogpagetext' => '다른 위키에서 가져온 문서 기록입니다.',
-'import-logentry-upload' => '사용자가 파일 올리기를 통해 [[$1]] 문서를 가져왔습니다.',
-'import-logentry-upload-detail' => ' $1개',
-'import-logentry-interwiki' => '$1 문서를 다른 위키에서 가져왔습니다.',
-'import-logentry-interwiki-detail' => '$2에서 판 $1개를 가져옴',
+'import-logentry-upload' => '사용자가 파일 올리기를 통해 [[$1]] 문서를 가져왔습니다',
+'import-logentry-upload-detail' => '{{PLURAL:$1|판}} $1개',
+'import-logentry-interwiki' => '$1 문서를 다른 위키에서 가져왔습니다',
+'import-logentry-interwiki-detail' => '$2에서 {{PLURAL:$1|판}} $1개를 가져왔습니다',
 
 # JavaScriptTest
 'javascripttest' => '자바스크립트 테스트',
@@ -3115,7 +3159,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-ca-protect' => '문서 보호하기',
 'tooltip-ca-unprotect' => '이 문서의 보호 설정을 바꾸기',
 'tooltip-ca-delete' => '문서 삭제하기',
-'tooltip-ca-undelete' => 'ì\82­ì \9cë\90\98기 ì \84ì\97\90 ì\9d´ ë¬¸ì\84\9cì\9d\98 ì\99\84ë£\8cí\95\9c í\8e¸ì§\91 ë³µêµ¬í\95\98기',
+'tooltip-ca-undelete' => 'ì\82­ì \9cë\90\98기 ì \84ì\97\90 ì\9d´ ë¬¸ì\84\9cì\9d\98 ì\99\84ë£\8cí\95\9c í\8e¸ì§\91 ë\90\98ì\82´ë¦¬기',
 'tooltip-ca-move' => '문서 이동하기',
 'tooltip-ca-watch' => '이 문서를 주시문서 목록에 추가합니다.',
 'tooltip-ca-unwatch' => '이 문서를 주시문서 목록에서 제거합니다.',
@@ -3151,7 +3195,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-ca-nstab-help' => '도움말 문서 내용을 봅니다.',
 'tooltip-ca-nstab-category' => '분류 문서 내용을 봅니다.',
 'tooltip-minoredit' => '사소한 편집으로 표시하기',
-'tooltip-save' => 'ë°\94ë\80\9c 저장하기',
+'tooltip-save' => 'ë°\94ë\80\90 ë\82´ì\9a© 저장하기',
 'tooltip-preview' => '바뀜을 미리 봅니다. 저장하기 전에 꼭 미리 보기를 해 주세요!',
 'tooltip-diff' => '자신이 바꾼 것 보기',
 'tooltip-compareselectedversions' => '이 문서에서 선택한 두 판간의 차이를 비교',
@@ -3167,17 +3211,11 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # Stylesheets
 'common.css' => '/* 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */',
-'standard.css' => '/* 이 CSS 설정은 스탠다드 스킨을 사용하는 사용자에게 적용됩니다 */',
-'nostalgia.css' => '/* 이 CSS 설정은 노스텔지아 스킨을 사용하는 사용자에게 적용됩니다 */',
 'cologneblue.css' => '/* 이 CSS 설정은 쾰른 블루 스킨을 사용하는 사용자에게 적용됩니다 */',
 'monobook.css' => '/* 이 CSS 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */',
-'myskin.css' => '/* 이 CSS 설정은 마이스킨 스킨을 사용하는 사용자에게 적용됩니다 */',
-'chick.css' => '/* 이 CSS 설정은 치크 스킨을 사용하는 사용자에게 적용됩니다 */',
-'simple.css' => '/* 이 CSS 설정은 심플 스킨을 사용하는 사용자에게 적용됩니다 */',
 'modern.css' => '/* 이 CSS 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */',
 'vector.css' => '/* 이 CSS 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */',
 'print.css' => '/* 이 CSS 설정은 인쇄 출력 화면에 적용됩니다 */',
-'handheld.css' => '/* 이 CSS 설정은 $wgHandheldStyle에 설정한 스킨을 기반으로 한 휴대 기기에 적용됩니다 */',
 'noscript.css' => '/* 이 CSS 설정은 자바스크립트를 비활성화한 사용자에 적용됩니다 */',
 'group-autoconfirmed.css' => '/* 이 CSS 설정은 자동 인증된 사용자에만 적용됩니다 */',
 'group-bot.css' => '/* 이 CSS 설정은 봇에만 적용됩니다 */',
@@ -3186,13 +3224,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # Scripts
 'common.js' => '/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */',
-'standard.js' => '/* 이 자바스크립트 설정은 스탠다드 스킨을 사용하는 사용자에게 적용됩니다 */',
-'nostalgia.js' => '/* 이 자바스크립트 설정은 노스텔지아 스킨을 사용하는 사용자에게 적용됩니다 */',
 'cologneblue.js' => '/* 이 자바스크립트 설정은 쾰른 블루 스킨을 사용하는 사용자에게 적용됩니다 */',
 'monobook.js' => '/* 이 자바스크립트 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */',
-'myskin.js' => '/* 이 자바스크립트 설정은 마이스킨 스킨을 사용하는 사용자에게 적용됩니다 */',
-'chick.js' => '/* 이 자바스크립트 설정은 치크 스킨을 사용하는 사용자에게 적용됩니다 */',
-'simple.js' => '/* 이 자바스크립트 설정은 심플 스킨을 사용하는 사용자에게 적용됩니다 */',
 'modern.js' => '/* 이 자바스크립트 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */',
 'vector.js' => '/* 이 자바스크립트 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */',
 'group-autoconfirmed.js' => '/* 이 자바스크립트 설정은 자동 인증된 사용자에만 적용됩니다 */',
@@ -3221,7 +3254,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 바깥 사이트로 연결하는 링크 중에 블랙리스트에 포함된 사이트가 있을 것입니다.',
 'spamprotectionmatch' => '문제가 되는 부분은 다음과 같습니다: $1',
 'spambot_username' => 'MediaWiki 스팸 제거',
-'spam_reverting' => '$1 포함하지 않는 최신 버전으로 되돌림',
+'spam_reverting' => '$1(을)를 포함하지 않는 최신 버전으로 되돌림',
 'spam_blanking' => '모든 버전에 $1 링크를 포함하고 있어 차단함',
 'spam_deleting' => '모든 버전에 $1 링크를 포함하고 있어 삭제함',
 
@@ -3273,13 +3306,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-category-files' => '파일 수',
 
 # Skin names
-'skinname-standard' => '클래식',
-'skinname-nostalgia' => '노스탤지아',
 'skinname-cologneblue' => '쾰른 블루',
 'skinname-monobook' => '모노북',
-'skinname-myskin' => '마이스킨',
-'skinname-chick' => '치크',
-'skinname-simple' => '심플',
 'skinname-modern' => '모던',
 'skinname-vector' => '벡터',
 
@@ -3321,7 +3349,7 @@ $1',
 파일을 실행하면 컴퓨터에 문제가 생길 가능성이 있습니다.",
 'imagemaxsize' => '그림 최대 크기:<br />(파일 문서에 적용되는 기능)',
 'thumbsize' => '섬네일 크기:',
-'widthheightpage' => '$1 × $2, $3페이지',
+'widthheightpage' => '$1 × $2, $3{{PLURAL:$3|쪽}}',
 '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|쪽}}',
@@ -3334,16 +3362,16 @@ $1',
 'show-big-image-other' => '다른 {{PLURAL:$2|해상도}}: $1',
 'show-big-image-size' => '$1 × $2 픽셀',
 'file-info-gif-looped' => '반복됨',
-'file-info-gif-frames' => '$1 프레임',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|프레임}}',
 'file-info-png-looped' => '반복됨',
 'file-info-png-repeat' => '$1{{PLURAL:$1|번}} 재생됨',
-'file-info-png-frames' => '$1 프레임',
+'file-info-png-frames' => '$1 {{PLURAL:$1|프레임}}',
 'file-no-thumb-animation' => "'''참고: 기술적인 제한으로 인해 이 파일의 섬네일은 애니메이션을 지원하지 않습니다.'''",
 'file-no-thumb-animation-gif' => "'''참고: 기술적인 제한으로 인해 고해상도 GIF 그림 섬네일은 애니메이션을 지원하지 않습니다.'''",
 
 # Special:NewFiles
 'newimages' => '새 파일 목록',
-'imagelisttext' => "파일 '''$1'''개를 $2 순으로 정렬한 목록입니다.",
+'imagelisttext' => "{{PLURAL:$1|파일}} '''$1'''개를 $2 순으로 정렬한 목록입니다.",
 'newimages-summary' => '이 특수 문서는 최근에 올라온 파일을 나열하고 있습니다.',
 'newimages-legend' => '필터',
 'newimages-label' => '파일 이름 (또는 그 일부분):',
@@ -3358,11 +3386,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1분}}',
 'hours' => '{{PLURAL:$1|$1시간}}',
 'days' => '{{PLURAL:$1|$1일}}',
+'weeks' => '{{PLURAL:$1|$1주}}',
 'months' => '{{PLURAL:$1|$1월}}',
 'years' => '{{PLURAL:$1|$1년}}',
 'ago' => '$1 전',
 'just-now' => '방금',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => '형식은 아래와 같습니다.
 
@@ -3372,8 +3414,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => '간체',
@@ -3401,7 +3441,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '너비',
 'exif-imagelength' => '높이',
 'exif-bitspersample' => '픽셀당 비트 수',
@@ -3579,7 +3619,7 @@ Variants for Chinese language
 'exif-originalimageheight' => '자르기 전 그림의 세로 길이',
 'exif-originalimagewidth' => '자르기 전 그림의 가로 길이',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '압축되지 않음',
 'exif-compression-2' => 'CCITT 그룹-3 1차원 수정 허프먼 반복 길이 부호화',
 'exif-compression-3' => 'CCITT 그룹-3 팩스 인코딩',
@@ -3722,8 +3762,8 @@ Variants for Chinese language
 'exif-gpslongitude-w' => '서경',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '해발 $1미터',
-'exif-gpsaltitude-below-sealevel' => '해저 $1미터',
+'exif-gpsaltitude-above-sealevel' => '해발 $1{{PLURAL:$1|미터}}',
+'exif-gpsaltitude-below-sealevel' => '해저 $1{{PLURAL:$1|미터}}',
 
 'exif-gpsstatus-a' => '측정 중',
 'exif-gpsstatus-v' => '인터랙티브 측정',
@@ -3806,7 +3846,7 @@ Variants for Chinese language
 
 # Email address confirmation
 'confirmemail' => '이메일 주소 확인',
-'confirmemail_noemail' => '[[Special:Preferences|환경 설정]]에 이메일을 설정하지 않았습니다.',
+'confirmemail_noemail' => '[[Special:Preferences|사용자 환경 설정]]에 올바른 이메일주소를 설정하지 않았습니다.',
 'confirmemail_text' => '{{SITENAME}}에서는 이메일 기능을 사용하기 전에 이메일 인증을 받아야 합니다.
 아래의 버튼을 누르면 인증 메일을 보냅니다.
 메일에는 인증 코드가 들어있는 링크가 있습니다.
@@ -3932,19 +3972,19 @@ $5
 일반 미리 보기를 이용하세요.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => '최근 $1 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.',
-'lag-warn-high' => '데이터베이스 서버의 과도한 부하 때문에 최근 $1 안에 바뀐 문서 목록은 보여지지 않을 수 있습니다.',
+'lag-warn-normal' => '최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서는 이 목록에서 빠졌을 수 있습니다.',
+'lag-warn-high' => '데이터베이스 서버의 과도한 부하 때문에 최근 $1{{PLURAL:$1|초}} 안에 바뀐 문서 목록은 보여지지 않을 수 있습니다.',
 
 # Watchlist editor
-'watchlistedit-numitems' => '토론 문서를 제외하고 문서 $1개를 주시하고 있습니다.',
+'watchlistedit-numitems' => '토론 문서를 제외하고 {{PLURAL:$1|문서 1개|문서 $1개}}를 주시하고 있습니다.',
 'watchlistedit-noitems' => '주시문서 목록이 비어 있습니다.',
 'watchlistedit-normal-title' => '주시문서 목록 편집하기',
 'watchlistedit-normal-legend' => '주시문서 목록에서 문서 제거하기',
-'watchlistedit-normal-explain' => '주ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90 ì\9e\88ë\8a\94 ë¬¸ì\84\9cì\9d\98 ì \9c목ì\9d´ ì\95\84ë\9e\98ì\97\90 ë\82\98ì\97´ë\90\98ì\96´ 있습니다.
+'watchlistedit-normal-explain' => '주ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90 ì\9e\88ë\8a\94 ë¬¸ì\84\9cì\9d\98 ì \9c목ì\9d´ ì\95\84ë\9e\98ì\97\90 ë\82\98ì\99\80 있습니다.
 주시문서 목록에서 제거하려는 문서가 있으면 각 항목의 확인 상자를 선택한 다음 "{{int:Watchlistedit-normal-submit}}"를 클릭해주세요.
 또는 [[Special:EditWatchlist/raw|목록을 직접 편집]]할 수도 있습니다.',
 'watchlistedit-normal-submit' => '항목 삭제',
-'watchlistedit-normal-done' => '주시문서 목록에서 다음 {{PLURAL:$1|항목}}을 주시하지 않습니다:',
+'watchlistedit-normal-done' => '주시문서 목록에서 다음 {{PLURAL:$1|항목 $1개}}를 제거했습니다:',
 'watchlistedit-raw-title' => '주시문서 목록 직접 편집하기',
 'watchlistedit-raw-legend' => '주시문서 목록 직접 편집하기',
 'watchlistedit-raw-explain' => '주시문서 목록의 각 항목이 나와 있습니다. 필요한 항목을 직접 추가하거나 제거할 수 있습니다.
@@ -3954,8 +3994,8 @@ $5
 'watchlistedit-raw-titles' => '목록:',
 'watchlistedit-raw-submit' => '주시문서 목록 새로 고침',
 'watchlistedit-raw-done' => '주시문서 목록을 새로 고쳤습니다.',
-'watchlistedit-raw-added' => '문서 $1개를 추가했습니다:',
-'watchlistedit-raw-removed' => '문서 $1개를 제거했습니다:',
+'watchlistedit-raw-added' => '{{PLURAL:$1|문서 $1개}}를 추가했습니다:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|문서 $1개}}를 제거했습니다:',
 
 # Watchlist editing tools
 'watchlisttools-view' => '주시문서 최근 바뀜',
@@ -4004,12 +4044,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 문서 경로]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath 스크립트 경로]',
 
-# Special:FilePath
-'filepath' => '파일 경로',
-'filepath-page' => '파일:',
-'filepath-submit' => '가기',
-'filepath-summary' => '파일의 실제 URL 주소를 엽니다.
-그림 파일일 경우 원본 해상도의 파일이 열립니다. 다른 종류의 파일일 경우 그 파일의 종류에 맞는 프로그램이 실행됩니다.',
+# Special:Redirect
+'redirect' => '파일, 사용자나 판 ID별 넘겨주기',
+'redirect-legend' => '파일이나 문서로 넘겨주기',
+'redirect-summary' => '이 특수 문서는 파일(파일 이름을 지정), 문서(판 ID를 지정)나 사용자 문서(사용자 ID를 정수로 지정)로 넘겨줍니다.',
+'redirect-submit' => '찾기',
+'redirect-lookup' => '찾을 종류:',
+'redirect-value' => '값:',
+'redirect-user' => '사용자 ID',
+'redirect-revision' => '문서 판',
+'redirect-file' => '파일 이름',
+'redirect-not-exists' => '값을 찾을 수 없습니다',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '중복된 파일 찾기',
@@ -4019,7 +4064,7 @@ $5
 'fileduplicatesearch-submit' => '찾기',
 'fileduplicatesearch-info' => '$1 × $2 픽셀<br />파일 크기: $3<br />MIME 유형: $4',
 'fileduplicatesearch-result-1' => '"$1" 파일과 중복된 파일이 없습니다.',
-'fileduplicatesearch-result-n' => '"$1" 파일은 중복 파일이 $2개 있습니다.',
+'fileduplicatesearch-result-n' => '"$1" 파일은 {{PLURAL:$2|중복 파일이 $2개}} 있습니다.',
 'fileduplicatesearch-noresults' => '"$1"이라는 이름을 가진 파일이 없습니다.',
 
 # Special:SpecialPages
@@ -4083,7 +4128,7 @@ $5
 'dberr-header' => '이 위키에 문제가 있습니다.',
 'dberr-problems' => '죄송합니다!
 이 사이트는 기술적인 문제가 있습니다.',
-'dberr-again' => '잠시 후에 다시 시도해주세요.',
+'dberr-again' => '잠시 기다리고 나서 다시 불러오세요.',
 'dberr-info' => '(데이터베이스에 접속할 수 없습니다: $1)',
 'dberr-usegoogle' => '그 동안 구글을 통해 검색할 수도 있습니다.',
 'dberr-outofdate' => '참고로 구글의 내용 개요는 오래된 것일 수도 있습니다.',
@@ -4100,23 +4145,26 @@ $5
 'htmlform-submit' => '저장',
 'htmlform-reset' => '바꾼 것을 되돌리기',
 'htmlform-selectorother-other' => '기타',
+'htmlform-no' => '아니오',
+'htmlform-yes' => '예',
+'htmlform-chosen-placeholder' => '선택하세요',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 (본문 전체 찾기)',
 'sqlite-no-fts' => '$1 (본문은 찾기에서 제외)',
 
 # New logging system
-'logentry-delete-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|삭제했습니다}}.',
-'logentry-delete-restore' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 {{GENDER:$2|복구í\96\88ì\8aµë\8b\88ë\8b¤}}.',
-'logentry-delete-event' => '$1 사용자가 $3의 기록 $5개에 대해 보이기 설정을 바꾸었습니다: $4',
-'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 바꾸었습니다: $4',
-'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 보이기 설정을 바꾸었습니다.',
-'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 보이기 설정을 바꾸었습니다.',
-'logentry-suppress-delete' => '$1 사용자가 $3 문서를 숨겼습니다.',
-'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 보이기 설정을 바꾸었습니다: $4',
-'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 보이기 설정을 바꾸었습니다: $4',
-'logentry-suppress-event-legacy' => '$1 사용자가 비공개적으로 $3의 항목에 대한 보이기 설정을 바꾸었습니다.',
-'logentry-suppress-revision-legacy' => '$1 사용자가 비공개적으로 $3 문서의 특정 판에 대한 보이기 설정을 바꾸었습니다.',
+'logentry-delete-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|삭제했습니다}}',
+'logentry-delete-restore' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 {{GENDER:$2|ë\90\98ì\82´ë ¸ì\8aµë\8b\88ë\8b¤}}',
+'logentry-delete-event' => '$1 사용자가 $3의 {{PLURAL:$1|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-suppress-delete' => '$1 사용자가 $3 문서를 {{GENDER:$2|숨겼습니다}}',
+'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4',
+'logentry-suppress-event-legacy' => '$1 사용자가 비공개적으로 $3의 항목에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-suppress-revision-legacy' => '$1 사용자가 비공개적으로 $3 문서의 특정 판에 대한 보이기 설정을 {{GENDER:$2|바꾸었습니다}}',
 'revdelete-content-hid' => '내용 숨겨짐',
 'revdelete-summary-hid' => '편집 요약 숨겨짐',
 'revdelete-uname-hid' => '사용자 이름 숨겨짐',
@@ -4125,20 +4173,20 @@ $5
 'revdelete-uname-unhid' => '사용자 이름 숨김 해제됨',
 'revdelete-restricted' => '관리자에게 제한을 적용함',
 'revdelete-unrestricted' => '관리자에 대한 제한을 해제함',
-'logentry-move-move' => '$1 사용자가 $3 문서를 $4 문서로 옮겼습니다.',
-'logentry-move-move-noredirect' => '$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 옮겼습니다.',
-'logentry-move-move_redir' => '$1 사용자가 $3 문서를 $4 문서로 옮기면서 넘겨주기를 덮어썼습니다.',
-'logentry-move-move_redir-noredirect' => '$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 옮기면서 옮길 대상에 있던 넘겨주기를 덮어썼습니다.',
-'logentry-patrol-patrol' => '$1 사용자가 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
-'logentry-patrol-patrol-auto' => '$1 사용자가 자동적으로 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
-'logentry-newusers-newusers' => '$1 사용자 계정을 만들었습니다.',
-'logentry-newusers-create' => '$1 사용자 계정을 만들었습니다.',
-'logentry-newusers-create2' => '$1 사용자가 $3 사용자 계정을 만들었습니다.',
-'logentry-newusers-byemail' => '$3 사용자 계정이 $1에 만들어졌고 비밀번호는 이메일로 보냈습니다',
-'logentry-newusers-autocreate' => '$1 사용자 계정을 자동적으로 만들었습니다.',
-'logentry-rights-rights' => '$1 사용자가 $3 사용자의 권한을 $4에서 $5으로 바꾸었습니다.',
-'logentry-rights-rights-legacy' => '$1 사용자가 $3 사용자의 권한을 바꾸었습니다.',
-'logentry-rights-autopromote' => '$1 ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¶\8cí\95\9cì\9d´ ì\9e\90ë\8f\99ì \81ì\9c¼ë¡\9c $4ì\97\90ì\84\9c $5ì\9c¼ë¡\9c ë°\94ë\80\8cì\97\88ì\8aµë\8b\88ë\8b¤.',
+'logentry-move-move' => '$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮겼습니다}}',
+'logentry-move-move-noredirect' => '$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 {{GENDER:$2|옮겼습니다}}',
+'logentry-move-move_redir' => '$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮기면서}} 넘겨주기를 덮어썼습니다',
+'logentry-move-move_redir-noredirect' => '$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 {{GENDER:$2|옮기면서}} 옮길 대상에 있던 넘겨주기를 덮어썼습니다',
+'logentry-patrol-patrol' => '$1 사용자가 $3 문서의 $4판을 검토한 것으로 {{GENDER:$2|표시했습니다}}',
+'logentry-patrol-patrol-auto' => '$1 사용자가 자동적으로 $3 문서의 $4판을 검토한 것으로 {{GENDER:$2|표시했습니다}}',
+'logentry-newusers-newusers' => '$1 사용자 계정을 {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-create' => '$1 사용자 계정을 {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-create2' => '$1 사용자가 $3 사용자 계정을 {{GENDER:$2|만들었습니다}}',
+'logentry-newusers-byemail' => '$3 사용자 계정이 $1에 {{GENDER:$2|만들어졌고}} 비밀번호는 이메일로 보냈습니다',
+'logentry-newusers-autocreate' => '$1 사용자 계정을 자동적으로 {{GENDER:$2|만들었습니다}}',
+'logentry-rights-rights' => '$1 사용자가 $3 사용자의 권한을 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}',
+'logentry-rights-rights-legacy' => '$1 사용자가 $3 사용자의 권한을 {{GENDER:$2|바꾸었습니다}}',
+'logentry-rights-autopromote' => '$1 ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¶\8cí\95\9cì\9d\84 ì\9e\90ë\8f\99ì \81ì\9c¼ë¡\9c $4ì\97\90ì\84\9c $5ì\9c¼ë¡\9c {{GENDER:$2|ë°\94꾸ì\97\88ì\8aµë\8b\88ë\8b¤}}',
 'rightsnone' => '(없음)',
 
 # Feedback
index 6dd4651..f2ede5e 100644 (file)
@@ -495,7 +495,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(уджкериссезлöн нимлёдз)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Этiя ужкерисьлö гижöт',
 'emailfrom' => 'Кинсянь:',
 'emailto' => 'Кинлö:',
@@ -737,7 +737,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Пасьта',
 'exif-imagelength' => 'Вылына',
 
index 574c201..503593a 100644 (file)
@@ -44,21 +44,65 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'Системаны_билдириулери' ),
        'Allpages'                  => array( 'Бютеу_бетле' ),
        'Blankpage'                 => array( 'Бош_бет' ),
-       'Block'                     => array( 'Блокла' ),
-       'Blockme'                   => array( 'Мени_блокла' ),
+       'Block'                     => array( 'Блок_эт' ),
+       'Blockme'                   => array( 'Мени_блок_эт' ),
        'Booksources'               => array( 'Китабланы_къайнакълары' ),
        'BrokenRedirects'           => array( 'Джыртылгъан_редиректле' ),
        'Categories'                => array( 'Категорияла' ),
-       'ChangeEmail'               => array( 'E-mail_ауушдур' ),
-       'ChangePassword'            => array( 'Пароль_ауушдур' ),
+       'ChangeEmail'               => array( 'E-mail’ни_ауушдур' ),
+       'ChangePassword'            => array( 'Паролну_ауушдур' ),
        'ComparePages'              => array( 'Бетлени_тенглешдириу' ),
-       'Confirmemail'              => array( 'E-mail_тюзлюгюн_бегит' ),
+       'Confirmemail'              => array( 'E-mail’ни_тюзлюгюн_бегит' ),
        'Contributions'             => array( 'Къошум' ),
-       'CreateAccount'             => array( 'ТеÑ\80геÑ\83_джазÑ\8bÑ\83нÑ\83_кÑ\8aÑ\83Ñ\80а', 'Ð\9aÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83нÑ\83_кÑ\8aÑ\83Ñ\80а', 'Ð\97аÑ\80егиÑ\81Ñ\82Ñ\80иÑ\80оваÑ\82Ñ\8cÑ\81Ñ\8f' ),
+       'CreateAccount'             => array( 'ТеÑ\80геÑ\83_джазÑ\8bÑ\83нÑ\83_кÑ\8aÑ\83Ñ\80а', 'Ð\9aÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83нÑ\83_кÑ\8aÑ\83Ñ\80а', 'РегиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f\8dÑ\82' ),
        'Deadendpages'              => array( 'Чыкъмазча_бетле' ),
        'DeletedContributions'      => array( 'Кетерилген_къошум' ),
        'Disambiguations'           => array( 'Кёб_магъаналы' ),
        'DoubleRedirects'           => array( 'Экили_редирект' ),
+       'EditWatchlist'             => array( 'Кёздеги_тизмени_тюрлендир' ),
+       'Emailuser'                 => array( 'Къошулуучугъа_джазма', 'Джазма_ий' ),
+       'Export'                    => array( 'Экспорт', 'Къотарыу' ),
+       'FileDuplicateSearch'       => array( 'Файлланы_дубликатларын_излеу' ),
+       'Filepath'                  => array( 'Файлгъа_джол' ),
+       'Import'                    => array( 'Импорт' ),
+       'BlockList'                 => array( 'Блок_этиулени_тизмеси', 'Блок_этиуле' ),
+       'LinkSearch'                => array( 'Джибериуле_излеу' ),
+       'Listadmins'                => array( 'Администраторланы_тизмеси' ),
+       'Listbots'                  => array( 'Ботланы_тизмеси' ),
+       'Listfiles'                 => array( 'Файлланы_тизмеси', 'Суратланы_тизмеси' ),
+       'Listgrouprights'           => array( 'Къошулуучу_къауумланы_хакълары', 'Къауумланы_хакъларыны_тизмеси' ),
+       'Listredirects'             => array( 'Редиректлени_тизмеси' ),
+       'Listusers'                 => array( 'Къошулуучуланы_тизмеси' ),
+       'Lockdb'                    => array( 'Билгиле_базаны_блок_эт' ),
+       'Log'                       => array( 'Журналла', 'Журнал' ),
+       'Lonelypages'               => array( 'Изоляция_этилген_бетле' ),
+       'Longpages'                 => array( 'Узун_бетле' ),
+       'MergeHistory'              => array( 'Тарихлени_бирикдириу' ),
+       'MIMEsearch'                => array( 'MIME’ге_кёре_излеу' ),
+       'Mostimages'                => array( 'Эм_кёб_хайырланнган_файлла' ),
+       'Movepage'                  => array( 'Бетни_атын_тюрлендириу', 'Атны_тюрлендириу', 'Атны_тюрлендир' ),
+       'Mycontributions'           => array( 'Мени_къошумум' ),
+       'Mypage'                    => array( 'Мени_бетим' ),
+       'Mytalk'                    => array( 'Мени_сюзюуюм' ),
+       'Myuploads'                 => array( 'Мени_джюклегенлерим' ),
+       'Newimages'                 => array( 'Джангы_файлла' ),
+       'Newpages'                  => array( 'Джангы_бетле' ),
+       'PasswordReset'             => array( 'Паролну_ийиу' ),
+       'PermanentLink'             => array( 'Дайым_джибериу' ),
+       'Popularpages'              => array( 'Популяр_бетле' ),
+       'Preferences'               => array( 'Джарашдырыула' ),
+       'Protectedpages'            => array( 'Джакъланнган_бетле' ),
+       'Protectedtitles'           => array( 'Джакъланнган_атла' ),
+       'Randompage'                => array( 'Эсде_болмагъан_бет', 'Эсде_болмагъан' ),
+       'Recentchanges'             => array( 'Ахыр_тюрлениуле' ),
+       'Recentchangeslinked'       => array( 'Байламлы_тюрлениуле' ),
+       'Revisiondelete'            => array( 'Кетерилген_тюрлениуле' ),
+       'Search'                    => array( 'Излеу' ),
+       'Shortpages'                => array( 'Къысха_бетле' ),
+       'Specialpages'              => array( 'Энчи_бетле' ),
+       'Statistics'                => array( 'Статистика' ),
+       'Tags'                      => array( 'Белгиле' ),
+       'Unblock'                   => array( 'Блокну_алыу' ),
 );
 
 $magicWords = array(
@@ -91,15 +135,13 @@ $messages = array(
 'tog-previewontop' => 'Ал къарауну тюрлендириу бетни башы бла кёргюз',
 'tog-previewonfirst' => 'Тюрледириу бетге кёчгенде ал къарауну кёргюз',
 'tog-nocache' => 'Бетлени браузерге кэш этерге къойма',
-'tog-enotifwatchlistpages' => 'Кёзюмде тургъан тизмемдеги бетлени неда файлланы тюрлениулерин E-mail бла билдир',
-'tog-enotifusertalkpages' => 'E-mail бла билдир энчи бетими тюрлениулерин',
+'tog-enotifwatchlistpages' => 'Кёзюмде тургъан тизмемдеги бетлени неда файлланы тюрлениулерин e-mail бла билдир',
+'tog-enotifusertalkpages' => 'Энчи бетими тюрлениулерин e-mail бла билдир',
 'tog-enotifminoredits' => 'Бетлени неда файлланы гитче тюрлениулерин огъуна E-mail бла',
 'tog-enotifrevealaddr' => 'E-mail адресими билдириу письмолада кёргюз',
 'tog-shownumberswatching' => 'Бетни, кёзде тургъан тизмелерине къошханланы санын кёргюз',
 'tog-oldsig' => 'Бусагъатдагъы къол салыннган:',
-'tog-fancysig' => 'Энчи вики-тексти къол салыуну (автомат джибериусюз)',
-'tog-externaleditor' => 'Тынгылау бла тыш редакторну хайырландырыу (къуру усталагъа, компьютерни энчи джарашдырылыуу керекди; [//www.mediawiki.org/wiki/Manual:External_editors толуракъ])',
-'tog-externaldiff' => 'Версияланы тенглешдириучу тыш программа хайырландырыу  (къуру усталагъа, компьютерни энчи джарашдырылыуу керекди; [//www.mediawiki.org/wiki/Manual:External_editors толуракъ])',
+'tog-fancysig' => 'Къол салыуну энчи вики-тексти (автомат джибериусюз)',
 'tog-showjumplinks' => '«Бар» болушлукъ джибериуню джандыр',
 'tog-uselivepreview' => 'Терк ал къарауну хайырландыр (JavaScript, экспериментал халда)',
 'tog-forceeditsummary' => 'Тюрлендириуню ачыкълау тизгини бош къалса, билдир',
@@ -113,6 +155,7 @@ $messages = array(
 'tog-diffonly' => 'Версия тенглешдириуню тюбю бла бетни ичиндегисин кёргюзме',
 'tog-showhiddencats' => 'Джашыртын категорияланы кёргюз',
 'tog-norollbackdiff' => 'Къайтарыудан сора версияланы башхалыкъларын кёргюзме',
+'tog-useeditwarning' => 'Тюрлендириулени сакълатмай редакторлау бетден кетген сагъатымда билдир',
 
 'underline-always' => 'Хаманда',
 'underline-never' => 'Бирзаманда да',
@@ -443,7 +486,7 @@ $1',
 'viewsource-title' => '$1 бетни чыкъгъан текстине къарау',
 'actionthrottled' => 'Терклик чекленнгенди',
 'actionthrottledtext' => 'Спамгъа къаршчы кюрешиуню себебинден, аз заманны ичинде бу амал бла кёб кере хайырланыу тыйылыбды. Кечирек джангыдан кёрюгюз.',
-'protectedpagetext' => 'Ð\91Ñ\83 Ð±ÐµÑ\82 Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83ге Ð´Ð¶Ð°Ð±Ñ\8bлыбды.',
+'protectedpagetext' => 'РедакÑ\82оÑ\80лÑ\83кÑ\8a Ð½ÐµÐ´Ð° Ð±Ð°Ñ\88Ñ\85а Ð·Ð°Ñ\82 Ñ\8dÑ\82илмез Ñ\8eÑ\87Ñ\8eн Ð±Ñ\83 Ð±ÐµÑ\82 Ð´Ð¶Ð°ÐºÑ\8aланыбды.',
 'viewsourcetext' => 'Сиз бу бетни башланнган текстине къараргъа эм аны копия этерге боллукъсуз:',
 'viewyourtext' => "Бу бетде '''кесигизни тюрлендириулеригизни''' къайнакъ текстине къараргъа эм копия этерге боллукъсуз:",
 'protectedinterface' => 'Бу бетде программаны интерфейс билдириую барды.
@@ -480,9 +523,17 @@ $2',
 'welcomecreation-msg' => 'Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.
 {{SITENAME}} сайтда [[Special:Preferences|джарашдырыуларыгъызны]] тюрлендирирге унутмагъыз.',
 'yourname' => 'Къошулуучуну аты',
+'userlogin-yourname' => 'Тергеу джазыуну аты',
+'userlogin-yourname-ph' => 'Тергеу джазыуугъузну атын джазыгъыз',
 'yourpassword' => 'Паролюгъуз:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Паролунгу джаз',
+'createacct-yourpassword-ph' => 'Пароль джаз',
 'yourpasswordagain' => 'Паролну джангыдан джаз:',
+'createacct-yourpasswordagain' => 'Паролну бегит',
+'createacct-yourpasswordagain-ph' => 'Паролну энтда бир кере джаз',
 'remembermypassword' => 'Бу компьютерде мени тергеў джазыўуму унутма (эм кёб $1 {{PLURAL:$1|кюн|кюн}})',
+'userlogin-remembermypassword' => 'Мени эсде тутуу',
 'securelogin-stick-https' => 'Чыкъгъандан сора да HTTPS бла байламлы къой',
 'yourdomainname' => 'Сизни доменигиз:',
 'password-change-forbidden' => 'Бу викиде паролугъузну тюрлендиреллик тюлсюз.',
@@ -495,18 +546,34 @@ $2',
 'logout' => 'Чыгъыу',
 'userlogout' => 'Чыгъыу',
 'notloggedin' => 'Авторизация ётмегенсиз',
+'userlogin-joinproject' => '{{SITENAME}} сайтха къошул',
 'nologin' => 'Тергеу джазыуугъуз (аккаунтугъуз) джокъмуду? $1.',
 'nologinlink' => 'Тергеу джазыу (аккаунт) къурагъыз',
 'createaccount' => 'Джангы къошулуучуну регистрация эт',
 'gotaccount' => 'Тергеу джазыуугъуз (аккаунтугъуз) энди бармыды? $1.',
 'gotaccountlink' => 'Кириу',
 'userlogin-resetlink' => 'Кирир ючюн билгилеригизни унутхан этгенмисиз?',
+'helplogin-url' => 'Help:Кириу',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Системагъа кириуде болушлукъ]]',
+'createacct-join' => 'Информациягъызны тюбюрекде джазыгъыз.',
+'createacct-emailrequired' => 'Электрон почтаны адреси',
+'createacct-emailoptional' => 'Электрон почтаны адреси (ажымсыз керек тюлдю)',
+'createacct-email-ph' => 'Электрон почта адресигизни джазыгъыз',
 'createaccountmail' => 'Эсде болмагъанлай генерация этилген болджаллы паролну хайырландыр эм тюбюрекде берилген электрон почта адресге ий:',
+'createacct-realname' => 'Керти атыгъыз (ажымсыз керек тюлдю)',
 'createaccountreason' => 'Чурум:',
+'createacct-reason' => 'Чурум',
+'createacct-captcha' => 'Къоркъуусузлукъну тинтиу',
+'createacct-imgcaptcha-ph' => 'Башыракъда кёрюннген текстни джазыгъыз',
+'createacct-benefit-heading' => '{{SITENAME}} сизнича адамла бла этилгенди.',
+'createacct-benefit-body1' => 'тюрлениу',
+'createacct-benefit-body2' => 'бет',
+'createacct-benefit-body3' => 'арт заманда къатышхан',
 'badretype' => 'Джазгъан паролларыгъыз бир-бирине келишмейдиле.',
 'userexists' => 'Джазылгъан ат хайырландырылады.
 Башха ат сайлагъыз.',
 'loginerror' => 'Кириу хата',
+'createacct-error' => 'Тергеу джазыу къурауда халат',
 'createaccounterror' => 'Быллай тергеу джазыу (аккаунт) къураргъа болмайды: $1',
 'nocookiesnew' => 'Къошлуучу регистрацияны ётгенди, алай кирмегенди. {{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хайырландырады. Сиз «cookies»-ни эркин этмегенсиз. «Cookies»-ни эркин этигиза да, андан сора джангы атыгъыз эм паролюгъуз бла киригиз.',
 'nocookieslogin' => '{{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хаырландырады. Сиз аны джукълатыб турасыз. «Cookies»-ни эркин этигизда джангыдан кёрюгюз.',
@@ -538,8 +605,8 @@ $2',
 Паролну алгъандан сора, джангыдан киригиз системагъа.',
 'blocked-mailpassword' => 'Сизни IP-адресигиз блокланыб турады, аны бла паролну къайтарыу функцияда.',
 'eauthentsent' => 'Джазылгъан электрон почтагъа адресни тюрлениуюн бегитирге соруу джиберилгенди. Письмода бу сизни электрон почтагъызны адреси болгъанын бегитир ючюн не этерге керек болгъаны да чертилгенди.',
-'throttled-mailpassword' => 'Паролну электрон почтагъа джибериу амалны сиз {{PLURAL:$1|ахыр $1 сагъаны}} ичинде хайырландыргъансыз энди.
\91Ñ\83 Ð°Ð¼Ð°Ð»Ð°Ð½Ñ\8b $1 {{PLURAL:$1|Ñ\81агÑ\8aаÑ\82нÑ\8b}} Ð¸Ñ\87инде ÐºÑ\8aÑ\83Ñ\80Ñ\83 Ð±Ð¸Ñ\80 ÐºÐµÑ\80ек Ñ\85айÑ\8bÑ\80ландÑ\8bÑ\80ыргъа болады.',
+'throttled-mailpassword' => 'Паролну билдириу амал {{PLURAL:$1|ахыр $1 сагъатны}} ичинде бир кере хайырланылгъанды.
\94жоÑ\80Ñ\83кÑ\8aдан Ñ\87Ñ\8bгÑ\8aÑ\8bÑ\83дан Ñ\81акÑ\8aланÑ\8bÑ\80 Ñ\8eÑ\87Ñ\8eн $1 {{PLURAL:$1|Ñ\81агÑ\8aаÑ\82нÑ\8b}} Ð¸Ñ\87инде ÐºÑ\8aÑ\83Ñ\80Ñ\83 Ð±Ð¸Ñ\80 Ð±Ð¸Ð»Ð´Ð¸Ñ\80иÑ\83 Ð°Ð»ыргъа болады.',
 'mailerror' => 'Почта джибериу хата: $1',
 'acct_creation_throttle_hit' => 'Кюн бла кечеге сизни IP-адресигизден {{PLURAL:$1|$1 тергеу джазыу (аккаунт)}} къуралгъанды. Бу амал энди бусагъатда джабыкъды.',
 'emailauthenticated' => 'Сизни электрон почта адресигиз бегитилгенди: $3, $2.',
@@ -586,9 +653,10 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Паролну атыу',
-'passwordreset-text' => 'ЭлекÑ\82Ñ\80он Ð´Ð¶Ð°Ð·Ð¼Ð° Ð±Ð»Ð° Ñ\82еÑ\80геÑ\83 Ð´Ð¶Ð°Ð·Ñ\8bÑ\83Ñ\83гÑ\8aÑ\83знÑ\83 (аккаÑ\83нÑ\82Ñ\83гÑ\8aÑ\83знÑ\83) Ð¿Ð°Ñ\80амеÑ\82Ñ\80леÑ\80ини Ñ\8eÑ\81Ñ\8eнден Ð±Ð¸Ð»Ð´Ð¸Ñ\80иÑ\83 Ð°Ð»Ñ\8bр ючюн бу форманы толтуругъуз.',
+'passwordreset-text' => 'Ð\9fаÑ\80олÑ\83гÑ\8aÑ\83з Ð´Ð¶Ð¸Ð±ÐµÑ\80илир ючюн бу форманы толтуругъуз.',
 'passwordreset-legend' => 'Паролну атыу',
 'passwordreset-disabled' => 'Бу викиде паролла атыу амал джукъланыбды.',
+'passwordreset-emaildisabled' => 'Бу викиде электрон почтаны функциялары джукъланыбдыла.',
 'passwordreset-pretext' => '{{PLURAL:$1||Тюбюрекде берилген билгиледен бирин джазыгъыз}}',
 'passwordreset-username' => 'Къошулуучуну аты:',
 'passwordreset-domain' => 'Домен:',
@@ -598,9 +666,9 @@ $2',
 'passwordreset-emailtitle' => '{{SITENAME}} сайтдагъы тергеу джазыуну юсюнден билгиле',
 'passwordreset-emailelement' => 'Къошулуучуну аты: $1
 Болджаллы пароль: $2',
-'passwordreset-emailsent' => 'ЭÑ\81геÑ\80Ñ\82иÑ\83 e-mail ийилди.',
-'passwordreset-emailsent-capture' => 'Ийилген эсгертиу e-mail тюбюрекде берилибди.',
-'passwordreset-emailerror-capture' => 'Ð\98йилген Ñ\8dÑ\81геÑ\80Ñ\82иÑ\83 e-mail Ñ\82Ñ\8eбÑ\8eÑ\80екде Ð±ÐµÑ\80илибди, Ð°Ð½Ñ\8b Ð°Ñ\88Ñ\8bÑ\80Ñ\8bÑ\83у джетишимсиз болду, чурум: $1',
+'passwordreset-emailsent' => 'Ð\9fаÑ\80олÑ\8c Ð±Ð»Ð° e-mail ийилди.',
+'passwordreset-emailsent-capture' => 'Ийилген пароль эсгертиу e-mail тюбюрекде берилибди.',
+'passwordreset-emailerror-capture' => 'Ð\9fаÑ\80олÑ\8c Ñ\8dÑ\81геÑ\80Ñ\82иÑ\83 e-mail Ð³ÐµÐ½ÐµÑ\80аÑ\86иÑ\8f Ñ\8dÑ\82илди (Ñ\82Ñ\8eбÑ\8eÑ\80екде Ð±ÐµÑ\80илибди), Ð°Ð½Ñ\8b {{GENDER:$2|кÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83гÑ\8aа}} Ð°Ñ\88Ñ\8bÑ\80Ñ\8bу джетишимсиз болду, чурум: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Электрон почтаны адресин ауушдур',
@@ -610,6 +678,7 @@ $2',
 'changeemail-oldemail' => 'Почтаны бусагъатдагъы адреси:',
 'changeemail-newemail' => 'Электрон почтаны джангы адреси:',
 'changeemail-none' => '(джокъ)',
+'changeemail-password' => '«{{SITENAME}}» проектде паролугъуз:',
 'changeemail-submit' => 'Адресни тюрлендир',
 'changeemail-cancel' => 'Ызына алыу',
 
@@ -762,9 +831,7 @@ $2',
 Сиз дагъыда этген къошакъларыгъызны автору болгъаныгъызны неда информацияны чыкъгъан джери эркин джаяргъа эм тюрлендирирге къойгъанын аны бегитесиз (къарагъыз: $1).
 '''ЭРКИНЛИКСИЗ АВТОР ХАКЪ БЛА ДЖАКЪЛАННГАН МАТЕРИАЛЛА САЛМАГЪЫЗ БЫЛАЙГЪА!'''",
 'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни  {{PLURAL:$1|бир килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|бир килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
-'readonlywarning' => "'''Эс бёлюгюз: Билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригиз къошулаллыкъ тюлдю. Джазгъанларыгъызны башха бир файлда сакълаб, кечирек къошаргъа боллукъсуз'''
-
-Киритлеген администратор бу билдириуню къойгъанды: $1",
+'readonlywarning' => "'''Эсгертиу. Кереклилерин тындырыу ишле себебли, билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригизни бусагъатда сакълаталлыкъ тюлсюз.''' Джазгъанларыгъызны башха бир текст файлда сакълаб, кечирек къошаргъа боллукъсуз. Киритлеген администратор бу билдириуню къойгъанды: $1",
 'protectedpagewarning' => "'''Эсгертиу: бу бет тюрлениуледен джакъланыбды, къуру администарторла тюрлендирелликдиле'''
 Тюбюнде, билги ючюн  журналдагъы ахыр джазыу берилгенди:",
 'semiprotectedpagewarning' => "'''Эсгертиу:''' бу бетни джангыз регистрация этген къошулуучула тюрлендирелликдиле.
@@ -806,6 +873,8 @@ $2',
 'content-failed-to-parse' => '$2 контент $1 типге келишмейди: $3',
 'invalid-content-data' => 'Джаламагъан билгиле',
 'content-not-allowed-here' => '[[$2]] бетни ичинде "$1" контент джарамайды',
+'editwarning-warning' => 'Башха бетге кёчсегиз, этген тюрлениулеригиз тас болургъа боллукъдула.
+Системада регистрацияны ётген эсегиз, бу билдириуню джарашдырыуларыгъызны «Тюрлендириу» деген бёлюмюнде джукълатыргъа боллукъсуз.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1057,7 +1126,7 @@ $1",
 'searchprofile-articles-tooltip' => '$1 ичинде изле',
 'searchprofile-project-tooltip' => '$1 ичинде изле',
 'searchprofile-images-tooltip' => 'Файлланы изле',
-'searchprofile-everything-tooltip' => 'Бютёу бетледе изле (сюзюу бетледе да)',
+'searchprofile-everything-tooltip' => 'Бютеу бетледе изле (сюзюу бетледе да)',
 'searchprofile-advanced-tooltip' => 'Энчи ат аланладада изле',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 сёз}})',
 'search-result-category-size' => '{{PLURAL:$1|1 элемент|$1 элемент}} ({{PLURAL:$2|1 тюбкатегория|$2 тюбкатегория}}, {{PLURAL:$3|1 файл|$3 файл}})',
@@ -1069,14 +1138,14 @@ $1",
 'search-interwiki-default' => '$1 эсеблери:',
 'search-interwiki-more' => '(дагъыда)',
 'search-relatedarticle' => 'Байламлы',
-'mwsuggest-disable' => 'AJAX юретиулени джукълатыгъыз',
-'searcheverything-enable' => 'Атланы бютёу аламларында изле',
+'mwsuggest-disable' => 'Излеуде юретиулени джукълат',
+'searcheverything-enable' => 'Атланы бютеу аламларында изле',
 'searchrelated' => 'бейламлы',
-'searchall' => 'бютёу',
+'searchall' => 'бютеу',
 'showingresults' => 'Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$1</strong> {{PLURAL:$1|эсеб|эсебле}} {{PLURAL:$1|кёргюзюлгенди|кёргюзюлгендиле}}.',
 'showingresultsnum' => 'Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$3</strong> {{PLURAL:$3|эсеб|эсебле}} {{PLURAL:$3|кёргюзюлгенди|кёргюзюлгендиле}}.',
 'showingresultsheader' => "'''$4''' ючюн {{PLURAL:$5|'''$3''' эсебден '''$1'''|'''$1 — $2''' арасы '''$3''' эсеб}}",
-'nonefound' => "'''Эсгериу.''' Тынгылау бла излеу бютёу атланы аламында бардырылмайды. Бютёу атланы аламында (къошулуучуланы сюзюулери, шаблонла эмда башхала) излер ючюн аллындан ''all:'' префиксни хайырландырыгъыз неда керекли атланы аламын белгилегиз.",
+'nonefound' => "'''Эсгериу:''' тынгылау бла излеу бютеу атланы аламында бардырылмайды. Бютеу атланы аламында (къошулуучуланы сюзюулери, шаблонла эмда башхала) излер ючюн аллындан ''all:'' префиксни хайырландырыгъыз неда керекли атланы аламын белгилегиз.",
 'search-nonefound' => 'Соруу бла келишген эсеб джокъду',
 'powersearch' => 'Кенг излеу',
 'powersearch-legend' => 'Кенг излеу',
@@ -1088,15 +1157,7 @@ $1",
 'powersearch-togglenone' => 'Бири да',
 'search-external' => 'Тыш излеу',
 'searchdisabled' => '{{SITENAME}} сайтда излеу талай заманнга тохтатылгъанды. Бусагъатда Google бла хайырланыб {{SITENAME}} ичинде излеу этерге боллукъсуз. Излеу сайтлада индекслери бир кесек эски болургъа боллугъун унутмагъыз.',
-
-# Quickbar
-'qbsettings' => 'Джюрютюуню панели',
-'qbsettings-none' => 'Кёргюзтме',
-'qbsettings-fixedleft' => 'Солу къатды',
-'qbsettings-fixedright' => 'Онгу къатды',
-'qbsettings-floatingleft' => 'Солгъа джюзеди',
-'qbsettings-floatingright' => 'Оннга джюзеди',
-'qbsettings-directionality' => 'Тилигизни джазмасыны онг/сол таба джазылгъанына кёре бегитилибди',
+'search-error' => 'Излеуде халат чыкъды: $1',
 
 # Preferences page
 'preferences' => 'Джарашдырыула',
@@ -1120,7 +1181,7 @@ $1",
 'prefs-watchlist-edits' => 'Кёзде тургъан тизмени кенглешдирилген вариантында кёргюзюллюк тюрлениулени саны:',
 'prefs-watchlist-edits-max' => 'Максимум саны:1000',
 'prefs-watchlist-token' => 'Кёзде тыргъан тизмени токени:',
-'prefs-misc' => 'Башха джарашдыдырыула',
+'prefs-misc' => 'Башха джарашдырыула',
 'prefs-resetpass' => 'Паролну тюрлендир',
 'prefs-changeemail' => 'Электрон почтаны адресин ауушдур',
 'prefs-setemail' => 'Лл. почтаны адресин айырыу',
@@ -1176,9 +1237,9 @@ $1",
 'prefs-emailconfirm-label' => 'Электрон почтаны бегитиу:',
 'prefs-textboxsize' => 'Тюрлендириу терезени ёлчеми',
 'youremail' => 'Электрон почта:',
-'username' => 'Къошулуучу ат:',
-'uid' => 'Къошулуучуну идентификатору:',
-'prefs-memberingroups' => '{{PLURAL:$1|Группаны|Группаланы}} члени:',
+'username' => '{{GENDER:$1|Къошулуучу ат}}:',
+'uid' => '{{GENDER:$1|Къошулуучуну}} коду:',
+'prefs-memberingroups' => '{{PLURAL:$1|Группаны|Группаланы}} {{GENDER:$2|члени}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Регистрацияны этилген заманы:',
 'prefs-registration-date-time' => '$1',
@@ -1573,6 +1634,8 @@ URL-адрес тюз болгъанын осмакълагъыз эмда дж
 'upload-http-error' => 'HTTP хата болду: $1',
 
 # File backend
+'backend-fail-backup' => '«$1» файлны резерв копиясын этерге болмайды.',
+'backend-fail-notexists' => '$1 файл джокъду.',
 'backend-fail-delete' => '«$1» файл кетерилмеди.',
 'backend-fail-store' => '$1 файл $2 ичинде сакъланылынмады.',
 'backend-fail-read' => '«$1» файлны окъуялмады.',
@@ -1609,7 +1672,6 @@ CGI тамалында ишлерге эмда <code>img_auth</code> бла иш
 'http-read-error' => 'HTTP окъууну халаты.',
 'http-timed-out' => 'HTTP-сорууну сакълау заман ётдю.',
 'http-curl-error' => 'Бу URL-гъа сорууну халаты: $1',
-'http-host-unreachable' => 'URL-ге джетелмеди',
 'http-bad-status' => 'HTTP-соруу ишлеген заманында проблема чыкъгъанды: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1761,6 +1823,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 Аны орнуна ала белгили бир статьягъа джибериу этерге керек болурла.<br />
 [[MediaWiki:Disambiguationspage]] бетде аты салыннган шаблон бар эсе, ол бет кёб магъаналы бетге саналады.",
 
+'pageswithprop-submit' => 'Таб',
+
 'doubleredirects' => 'Джибериу болгъан джибериуле',
 'doubleredirectstext' => 'Бу бетде башхы джибериулеге этилген джибериулени тизмеси барды.
 Хар тизгин биринчи неда экинчи джибериуню эмда асламысында бетни аты джазылгъан, биринчи джибериу кёргюзген, экинчи джибериуню нюзюр бети джазылады.
@@ -2001,8 +2065,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'notvisiblerev' => 'Версия кетерилгенди',
 'watchnochange' => 'Къаралгъан кёзюуде, кёзде тургъан тизмеден бир бет да тюрленмегенди.',
 'watchlist-details' => 'Кёзюгюзде тургъан тизмегизде, сюзюу бетлери саналмай {{PLURAL:$1|$1 бет|$1 бет}} барды.',
-'wlheader-enotif' => 'Эл. почта бла хапар бериу джандырылыбды.',
-'wlheader-showupdated' => "Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
+'wlheader-enotif' => 'Эл. почта бла хапар бериу джандырылыбды.',
+'wlheader-showupdated' => "Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
 'watchmethod-recent' => 'кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу',
 'watchmethod-list' => 'кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу',
 'watchlistcontains' => 'Кёзюгюзде тургъан тизмегизде $1 {{PLURAL:$1|бет|бет}} барды.',
@@ -2054,7 +2118,7 @@ $UNWATCHURL
 'deletepage' => 'Бетни кетер',
 'confirm' => 'Къабыл эт',
 'excontent' => 'ичиндеги: $1',
-'excontentauthor' => "ичиндеги: '$1' ('[[Special:Contributions/$2|$2]] юлюш къошхан джангыз къошулуучу болгъанды)",
+'excontentauthor' => 'ичиндеги: «$1» (юлюш къошхан джангыз къошулуучу [[Special:Contributions/$2|$2]] эди)',
 'exbeforeblank' => "Кетериуню алындагъы ичи: '$1'",
 'exblank' => 'бет бош эди',
 'delete-confirm' => '«$1» — кетериу',
@@ -2299,6 +2363,7 @@ $1',
 'ipbhidename' => 'Къошулуучуну атын тюрлендириуле бла спиоскладан джашыр',
 'ipbwatchuser' => 'Бу къошулуучуну, къошулуучу эмда сюзюу бетлерин кёзде тургъан тизмеге къош',
 'ipb-change-block' => 'Бу джарашдырыула бла къошулуучуну джангыдан тый',
+'ipb-confirm' => 'Блок салыуну бегит',
 'badipaddress' => 'Терс IP-адрес',
 'blockipsuccesssub' => 'Тыйыу джетишимли болду',
 'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] блокланды.<br />
@@ -2628,14 +2693,14 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-n-recentchanges' => 'Ахыр тюрлениулени тизмеси',
 'tooltip-n-randompage' => 'Эсде болмагъан бир бетге къара',
 'tooltip-n-help' => '«{{SITENAME}}» проектге джардам этиу',
-'tooltip-t-whatlinkshere' => 'Бу бетге джибериу берген бютёу бетлени тизмеси',
+'tooltip-t-whatlinkshere' => 'Бу бетге джибериу берген бютеу бетлени тизмеси',
 'tooltip-t-recentchangeslinked' => 'Бу бет джибериуле берген бетледе ахыр тюрлениуле',
 'tooltip-feed-rss' => 'Бу битге RSS-трансляция',
 'tooltip-feed-atom' => 'Бу бетге Atom-трансляция',
 'tooltip-t-contributions' => 'Къошулуучуну тюрлендирген бетлерине къара',
 'tooltip-t-emailuser' => 'Бу къошулуучугъа письмо джибер',
 'tooltip-t-upload' => 'Файлланы джюклеу',
-'tooltip-t-specialpages' => 'Бютёу къуллукъчу бетлени тизмеси',
+'tooltip-t-specialpages' => 'Бютеу къуллукъчу бетлени тизмеси',
 'tooltip-t-print' => 'Бу бетни басмагъа версиясы',
 'tooltip-t-permalink' => 'Бетни бу версиясына дайым джибериу',
 'tooltip-ca-nstab-main' => 'Статьяны ичиндеги',
@@ -2714,13 +2779,8 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'pageinfo-protect-cascading-yes' => 'Хоу',
 
 # Skin names
-'skinname-standard' => 'Стандарт',
-'skinname-nostalgia' => 'Ностальгия',
 'skinname-cologneblue' => 'Кёльн такъылыкъ',
 'skinname-monobook' => 'Моно-китаб',
-'skinname-myskin' => 'Меники',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'Бош',
 'skinname-modern' => 'Бусагъатдагъы',
 'skinname-vector' => 'Вектор',
 
@@ -2822,7 +2882,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Кенглик',
 'exif-imagelength' => 'Мийиклик',
 'exif-bitspersample' => 'Бояуну теренлиги',
@@ -2982,7 +3042,7 @@ $1',
 'exif-organisationinimage' => 'Суратланнган организация',
 'exif-personinimage' => 'Суратланнган адам',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Къысдырылмагъан',
 'exif-compression-3' => 'CCITT Group 3, факс кодлау',
 'exif-compression-4' => 'CCITT Group 4, факс кодлау',
@@ -3442,13 +3502,6 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'version-entrypoints-header-entrypoint' => 'Кириу нохта',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файлгъа джол',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Кёч',
-'filepath-summary' => 'Бу къуллукъчу бет файл ючюн толу джолну береди.
-Суратла толу резолюциялары бла кёргюзюледиле, башха файл типле алагъа джараулу программала бла ачыладыла.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Дубликат файлланы изле',
 'fileduplicatesearch-summary' => 'Хэш-кодлары бла дубликат файланны изле.',
@@ -3551,18 +3604,18 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'revdelete-restricted' => 'администраторла ючюн этилген чеклениуле',
 'revdelete-unrestricted' => 'администратолра ючюн этилген чеклениуле къоратылгъандыла',
 'logentry-move-move' => '$1, $3 бетни атын $4 деб тюрлендирди',
-'logentry-move-move-noredirect' => '$1, $3 бетни атын $4 деб тюрлендирди (редирект къоймагъанлай)',
-'logentry-move-move_redir' => '$1, $3 бетни атын $4 деб тюрлендирди (редиректни башы бла)',
-'logentry-move-move_redir-noredirect' => '$1, $3 бетни атын $4 деб тюрлендирди (редиректни башы бла эм редирект къурамай)',
+'logentry-move-move-noredirect' => '$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редирект къоймагъанлай)',
+'logentry-move-move_redir' => '$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редиректни башы бла)',
+'logentry-move-move_redir-noredirect' => '$1, $3 бетни атын $4 деб {{GENDER:$2|тюрлендирди}} (редиректни башы бла эм редирект къурамай)',
 'logentry-patrol-patrol' => '$1, $3 бетни $4 версияын партруль этиб чыкъды',
 'logentry-patrol-patrol-auto' => '$1, $3 бетни $4 версиясын автомат халда тинтиб чыкъды',
-'logentry-newusers-newusers' => '$1 тергеу джазыу (аккаунт) къуралды',
+'logentry-newusers-newusers' => '$1 тергеу джазыу (аккаунт) {{GENDER:$2|къуралды}}',
 'logentry-newusers-create' => '$1 тергеу джазыу (аккаунт) къуралды',
 'logentry-newusers-create2' => '$1, $3 тергеу джазыуну къурады',
 'logentry-newusers-autocreate' => '$1 тергеу джазыу автомат халда къуралды',
-'logentry-rights-rights' => '$1 къошулуучу, $3 къошулуучуну членлигин $4 къауумдан $5 къауумгъа кёчюрдю',
+'logentry-rights-rights' => '$1 къошулуучу, $3 къошулуучуну членлигин $4 къауумдан $5 къауумгъа {{GENDER:$2|кёчюрдю}}',
 'logentry-rights-rights-legacy' => '$1 къошулуучу, $3 къушулуучуну къауумлада членлигин тюрлендирди',
-'logentry-rights-autopromote' => '$1 къошулуучу, $4 къауумдан автомат халда $5 къауумгъа кёчюрюлдю',
+'logentry-rights-autopromote' => '$1 къошулуучу, $4 къауумдан автомат халда $5 къауумгъа {{GENDER:$2|кёчюрюлдю}}',
 'rightsnone' => '(джокъ)',
 
 # Feedback
index ccfbd05..559b734 100644 (file)
@@ -480,7 +480,7 @@ Yu go ebul luk im sos.',
 'namespacesall' => 'ol',
 'monthsall' => 'ol',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Konfam yu e-mail adrehs',
 'confirmemail_noemail' => 'Di email adrehs we yu pu na [[Special:Preferences|user preferences]] noh de.',
 
index 5a5cc2b..82ef0ed 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Caesius noh en Idee vum Manes
+ * @author Nemo bis
  * @author Purodha
  * @author Reedy
  * @author Rentenirer
@@ -230,7 +231,7 @@ $messages = array(
 'tog-watchmoves' => 'Donn Sigge beim Ömnänne automattesch för ming Oppaßlėß vörschlonn',
 'tog-watchdeletion' => 'Donn Sigge beim Fottschmiiße automattesch för ming Oppaßlėß vörschlonn',
 'tog-minordefault' => 'Dun all ming Änderunge jedes Mol als klein Mini-Änderunge vürschlage',
-'tog-previewontop' => 'Zeich de Vör-Aansich üvver däm Feld för dä Tex enzejevve aan.',
+'tog-previewontop' => 'Zeisch de Vör-Aanseesch övver däm Fäld för der Täx enzejävve aan.',
 'tog-previewonfirst' => 'Zeich de Vör-Aansich tirek för et eetste Mol beim Bearbeide aan',
 'tog-nocache' => 'Dun et Sigge Zweschespeichere en Dingem Brauser avschalte',
 'tog-enotifwatchlistpages' => 'Scheck mer en <i lang="en">e-mail</i>, wann en Sigg us minge Oppaßlėß verändert woode es',
@@ -240,8 +241,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zeich de Aanzahl Metmaacher, die op die Sigg am oppasse sin',
 'tog-oldsig' => 'Esu&nbsp;süht&nbsp;Ding „Ongerschreff“&nbsp;us:',
 'tog-fancysig' => 'Donn de „Ungerschreff“ als Wiki-Tex behandelle (ohne enne automattesche Lengk)',
-'tog-externaleditor' => 'Nemm jedes Mol en extern Editor-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
-'tog-externaldiff' => 'Nemm jedes Mol en extern Diff-Projramm (Doför bruchs de extra Enstellunge op Dingem Kompjutor. Dat es jet för Fachlück. Doh kanns De [//www.mediawiki.org/wiki/Manual:External_editors mieh drövver lässe])',
 'tog-showjumplinks' => '„Jangk-noh“-Links usjevve, die bei em „Zojang ohne Barrikad“ helfe dun',
 'tog-uselivepreview' => 'Dun de „Lebendije Vör-Aansich“ zeije (bruch Java_Skripp)',
 'tog-forceeditsummary' => 'Froch noh, wann en däm Feld „Koot zosammejefass, Quell“ beim Avspeichere nix dren steiht',
@@ -254,8 +253,9 @@ $messages = array(
 'tog-ccmeonemails' => 'Scheck mer en Kopie, wann ich en <i lang="en">e-mail</i> an ene andere Metmaacher scheck',
 'tog-diffonly' => 'Zeich beim Versione Verjliche nur de Ungerscheide aan (ävver pack nit noch de janze Sigg dodronger)',
 'tog-showhiddencats' => 'Donn de verstoche Saachjroppe aanzeije',
-'tog-noconvertlink' => 'Don de Tittele nit Ã¼mwandelle',
+'tog-noconvertlink' => 'Don de Tittele nit Ãmwandelle',
 'tog-norollbackdiff' => 'Donn noh „{{int:Rollback}}“ de Ungerscheide nit aanzeije',
+'tog-useeditwarning' => 'Donn mesch warne, wann esch vun en Sigg fott jonn, ih dat esch all ming Änderunge avjeschpeischert hann.',
 
 'underline-always' => 'jo, ongershtriishe',
 'underline-never' => 'nä',
@@ -319,6 +319,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Dez',
+'january-date' => '$1. Jannewaa',
+'february-date' => '$1. Fääbroaa',
+'march-date' => '$1. Määz',
+'april-date' => '$1. Aprell',
+'may-date' => '$1. Mai',
+'june-date' => '$1. Juuni',
+'july-date' => '$1. Juuli',
+'august-date' => '$1. Ojoßß',
+'september-date' => '$1. Säptämber',
+'october-date' => '$1. Oktoober',
+'november-date' => '$1. Novämber',
+'december-date' => '$1. Dezämber',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Saachjrupp|Saachjruppe}}',
@@ -344,6 +356,7 @@ $messages = array(
 'newwindow' => '(Mäht e neu Finster op, wann Dinge Brauser dat kann)',
 'cancel' => 'Stopp! Avbreche!',
 'moredotdotdot' => 'Mieh&nbsp;…',
+'morenotlisted' => 'Et jeiht noch wigger&nbsp;&hellip;',
 'mypage' => 'Metmaachersigg',
 'mytalk' => 'Klaafsigg',
 'anontalk' => 'Klaaf för de IP-Adress',
@@ -380,7 +393,7 @@ $messages = array(
 'navigation-heading' => 'Menü för et Navijeere',
 'errorpagetitle' => 'Fähler',
 'returnto' => 'Jangk widder noh: „$1“.',
-'tagline' => 'Us {{GRAMMAR:Dative|{{SITENAME}}}}',
+'tagline' => 'Uß {{GRAMMAR:Dativ | {{ucfirst:{{SITENAME}}}}}}',
 'help' => 'Hölp',
 'search' => 'Söhke',
 'searchbutton' => 'em Tex',
@@ -407,7 +420,7 @@ $messages = array(
 'unprotect' => 'Schoz ändere',
 'unprotectthispage' => 'Siggeschoz ändere',
 'newpage' => 'Neu Sigg',
-'talkpage' => 'Ã\9cvver die Sigg heh schwaade',
+'talkpage' => 'Ã\96vver die Sigg heh schwaade',
 'talkpagelinktext' => 'Klaaf',
 'specialpage' => '{{int:nstab-special}}',
 'personaltools' => 'Metmaacher Werkzüch',
@@ -443,13 +456,13 @@ $1',
 'pool-errorunknown' => 'Dä Fähler kenne mer nit',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Ã\9cvver {{GRAMMAR:Akkusativ|{{SITENAME}}}}',
-'aboutpage' => 'Project:Ã\9cvver {{GRAMMAR:Nom|{{SITENAME}}}}',
+'aboutsite' => 'Ã\96vver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}',
+'aboutpage' => 'Project:Ã\96vver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}',
 'copyright' => 'Dä Enhald steiht unger de $1.',
 'copyrightpage' => '{{ns:project}}:Lizenz',
 'currentevents' => 'Et Neuste',
 'currentevents-url' => 'Project:Et Neuste',
-'disclaimers' => 'Hinwies',
+'disclaimers' => 'Henwies',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Hölp för et Bearbeide',
 'edithelppage' => 'Help:Hölp',
@@ -457,7 +470,7 @@ $1',
 'mainpage' => 'Haupsigg',
 'mainpage-description' => 'Haupsigg',
 'policy-url' => 'Project:Rejelle',
-'portal' => 'Ã\9cvver {{GRAMMAR:Acc|{{SITENAME}}}} för Metmaacher',
+'portal' => 'Ã\96vver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}} för Metmaacher',
 'portal-url' => 'Project:Metmaacher Pooz',
 'privacy' => 'Daateschotz un Jeheimhaldung',
 'privacypage' => 'Project:Daateschotz un Jeheimhaldung',
@@ -489,7 +502,7 @@ $1',
 'editsectionhint' => 'Avschnedd $1 ändere',
 'toc' => 'Enhaldsüvversich',
 'showtoc' => 'enblende',
-'hidetoc' => 'usblende',
+'hidetoc' => 'ußblände',
 'collapsible-collapse' => 'Zohklappe',
 'collapsible-expand' => 'Opklappe',
 'thisisdeleted' => '$1 - aanluure oder widder zeröckholle?',
@@ -514,7 +527,7 @@ $1',
 'nstab-media' => 'Medijesigg',
 'nstab-special' => 'Extrasigg',
 'nstab-project' => 'Projeksigg',
-'nstab-image' => 'Datei',
+'nstab-image' => 'Dattei',
 'nstab-mediawiki' => 'Tex/Nohreesch',
 'nstab-template' => 'Schablon',
 'nstab-help' => 'Hölp',
@@ -640,9 +653,18 @@ Künnt sin, dat De de ein oder ander Sigg immer wigger aanjezeich kriss, wie wan
 'welcomecreation-msg' => 'Dinge Zohjang es enjerescht.
 Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].',
 'yourname' => 'Metmaacher_Naame:',
+'userlogin-yourname' => 'Der Metmaacher_Name',
+'userlogin-yourname-ph' => 'Donn Dinge Metmaachername aanjevve',
 'yourpassword' => 'Paßwoot:',
+'userlogin-yourpassword' => 'Et Paßwoot',
+'userlogin-yourpassword-ph' => 'Donn Ding Paßwood enjävve',
+'createacct-yourpassword-ph' => 'Jivv_e Paßwood_en!',
 'yourpasswordagain' => 'Noch ens dat Passwood',
+'createacct-yourpasswordagain' => 'Noch ens dat Paßwoot',
+'createacct-yourpasswordagain-ph' => 'Jivv_et Paßwoot norrens en!',
 'remembermypassword' => 'Op Duur aanmelde (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})',
+'userlogin-remembermypassword' => 'Op Duur enlogge',
+'userlogin-signwithsecure' => 'Verschlößeld enlogge',
 'securelogin-stick-https' => 'Noh em Enlogge övver HTTPS verbonge blieve.',
 'yourdomainname' => 'Ding Domain',
 'password-change-forbidden' => 'Do kanns en heh däm Wiki kein Paßwööter ändere.',
@@ -655,18 +677,38 @@ Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].'
 'logout' => 'Ußlogge',
 'userlogout' => 'Ußlogge',
 'notloggedin' => 'Nit enjelogg',
+'userlogin-noaccount' => 'Do häß noch keine Zohjang?',
+'userlogin-joinproject' => 'Aanmälde zom Metmaache!',
 'nologin' => "Wann De Dich noch nit aanjemeldt häs, dann dun Dich '''$1'''.",
 'nologinlink' => 'neu aanmelde',
 'createaccount' => 'Aanmelde als ene neue Metmaacher',
 'gotaccount' => "Do bes ald aanjemeldt {{GRAMMAR:en|{{SITENAME}}}}? Dann jangk nohm '''$1'''.",
 'gotaccountlink' => 'Enlogge',
 'userlogin-resetlink' => 'Häß De Ding Daate för et Enlogge verjäße?',
-'createaccountmail' => 'Scheck mer en E-Mail met Passwood',
+'userlogin-resetpassword-link' => 'Paßwoot verjäße?',
+'helplogin-url' => 'Help:Övver et Enlogge',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hölp bem Enlogge]]',
+'createacct-join' => 'Jiv Ding Daate en:',
+'createacct-emailrequired' => 'Ding Addräß för de <i lang="en">e-mail</i>',
+'createacct-emailoptional' => 'Ding Addräß för de <i lang="en">e-mail</i>, kann fott bliive',
+'createacct-email-ph' => 'Jiv Ding Addräß för de <i lang="en">e-mail</i> en!',
+'createaccountmail' => 'Scheck mer en <i lang="en">e-mail</i> met enem neu ußjedaachte Paßwood op Zick',
+'createacct-realname' => 'Dinge börjerlesche Naame, kam_mer och fott lohße',
 'createaccountreason' => 'Jrond:',
+'createacct-reason' => 'Der Jrond udder Aanlaß',
+'createacct-reason-ph' => 'Woröm deihs De noch ene Zohjang aanlääje?',
+'createacct-captcha' => 'Zor Sescherheit',
+'createacct-imgcaptcha-ph' => 'Jiv dä Täx en, dä De heh drövver sühs!',
+'createacct-submit' => 'Lohß Jonn!',
+'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.',
 'userexists' => 'Ene Metmaacher met däm Name jidd et ald.
 Do muss Der ene andere Name usdenke.',
 'loginerror' => 'Fähler beim Enlogge',
+'createacct-error' => 'Fähler beim Zohjang-Aanlääje',
 'createaccounterror' => 'Kunnt keine Zohjang för der Metmaacher-Name „$1“ aanlääje.',
 'nocookiesnew' => 'Dinge neue Metmaacher Name es enjerich, ävver dat automatisch Enlogge wor dann nix.
 Schad.
@@ -709,7 +751,7 @@ Do solls De tirek jlich enlogge,
 un dat Passwood widder ändere,
 wann dat esu Dinge Wonsch wor.
 Dat neu Passwood leuf noh {{PLURAL:$5|einem Daach|$5 Dääch|noch hück}} us.
-Dä Transport Ã¼vver et Netz met e-mail
+Dä Transport Ãvver et Netz met e-mail
 es unsecher, do künne Fremde metlese,
 un winnichstens de Jeheimdeenste dun
 dat och. Usserdäm es "$3"
@@ -731,8 +773,8 @@ Ene schöne Jroß vun {{GRAMMAR:Dat|{{SITENAME}}}}.
 'noemailcreate' => 'Do moß en jöltijje Adräß för Ding <i lang="en">e-mail</i> aanjävve',
 'passwordsent' => 'E neu Passwood es aan de E-Mail Adress vun däm Metmaacher „$1“ ungerwähs. Meld dich domet aan, wann De et häs. Dat ahle Passwood bliev erhalde un kann och noch jebruch wääde, bes dat De Dich et eetste Mol met däm Neue enjelogg häs.',
 'blocked-mailpassword' => 'Ding IP Adress es blockeet.',
-'eauthentsent' => 'En <i lang="en">e-mail</i> es jetz ungerwähs aan di Adress, die en de Enstellunge steiht. Ih dat <i lang="en">e-mails</i> üvver {{GRAMMAR:Genitiv iere male|{{SITENAME}}}} <i lang="en">e-mail</i>-Knopp verscheck wääde künne, muss de <i lang="en">e-mail</i>-Adress eets ens bestätich woode sin. Wat mer doför maache moß, steiht en dä <i lang="en">e-mail</i> dren, die jrad avjescheck woode es.',
-'throttled-mailpassword' => 'En Erennerung för di Passwood es ungerwähs. Domet ene fiese Möpp keine Dress fabrizeet, passeet dat hüchstens eimol en {{PLURAL:$1|der Stund|$1 Stunde|nidd ens eine Stund}}.',
+'eauthentsent' => 'En <i lang="en">e-mail</i> es jäz ungerwähs aan di Adräß, di en de Enschtällonge schteiht. Ih dat <i lang="en">e-mails</i> övver {{GRAMMAR:Genitiv iere male|{{ucfirst:{{SITENAME}}}}}} <i lang="en">e-mail</i>-Knopp verscheck wääde künne, moß de <i lang="en">e-mail</i>-Adräß eets ens beschtäätesch woode sin. Wat mer doför maache moß, schteiht en dä <i lang="en">e-mail</i> dren, di jrad avjescheck woode es.',
+'throttled-mailpassword' => 'En Erennerung för di Passwood es alld ongerwähs, un mieh wi eimol en {{PLURAL:$1|der Schtond|$1 Schtonde|nidd ens ener Schtond}} dommer kein schecke.',
 'mailerror' => 'Fähler beim E-Mail Verschecke: $1.',
 'acct_creation_throttle_hit' => '<b>Schad.</b>
 Besöker fun däm Wiki heh han övver de IP-Addräß, övver di De jraad aam
@@ -743,7 +785,7 @@ för der Momang nit noch mit Metmaacher neu aanmellde.',
 'emailauthenticated' => 'Ding E-Mail Adress wood aam <strong>$2</strong> öm <strong>$3</strong> Uhr bestätich.',
 'emailnotauthenticated' => 'Ding E-Mail Adress es <strong>nit</strong> bestätich. Dröm kann kein E-Mail aan Dich jescheck wääde för:',
 'noemailprefs' => 'Dun en E-Mail Adress endrage, domet dat et all fluppe kann.',
-'emailconfirmlink' => 'Dun Ding <i lang="en">e-mail</i> Adress bestätije looße',
+'emailconfirmlink' => 'Dun Ding <i lang="en">e-mail</i> Adräß beschtääteje lohße',
 'invalidemailaddress' => 'Wat De do als en Adreß för Ding <i lang="en">e-mail</i> aanjejovve häs, süht noh Dress us. En <i lang="en">e-mail</i> Adreß en däm Format, dat jitt et nit. Muss De repareere - oder Do mähs dat Feld leddich un schrievs nix eren. Un dann versök et noch ens.',
 'cannotchangeemail' => 'Sing <i lang="en">e-mail<i> Addreß kam_mer ehe em Wiki nit ändere.',
 'emaildisabled' => 'Heh dat Wiki kann kein <i lang="en">e-mails</i> verschecke.',
@@ -769,6 +811,7 @@ Et süht us, wi wann ene kappodde Brauser udder <i lang=\"en\">proxy</i>ẞööv
 # Email sending
 'php-mail-error-unknown' => 'Nit bekannte Fähler met dä Funxjohn <code lang="en">mail()</code> vum PHP',
 'user-mail-no-addy' => 'Do häs versöhg en <i lang="en">e-mail</i> der ohne en Adräß ze verschecke',
+'user-mail-no-body' => 'En dä <i lang="en">e-mail</i> schteiht nix udder zoh winnisch dren.',
 
 # Change password dialog
 'resetpass' => 'Passwood tuusche udder neu ußjävve',
@@ -784,25 +827,25 @@ Et süht us, wi wann ene kappodde Brauser udder <i lang=\"en\">proxy</i>ẞööv
 'resetpass-no-info' => 'Do mööts ad enjelogg sin, öm tiräk op di Sigg jonn ze dörve',
 'resetpass-submit-loggedin' => 'Passwood tuusche',
 'resetpass-submit-cancel' => 'Nix donn!',
-'resetpass-wrong-oldpass' => 'Dat Zweschepasswood udder dat aktoälle Passwood stemmp nit.
-Müjjelesch, Do häs Ding Passwood ald jetuusch, künnt och sin,
-Do häs Der enzwesche e neuZweschepasswood jehollt.',
+'resetpass-wrong-oldpass' => 'Dat Zweschepaßwood udder dat aktoälle Paßwood stemmp nit.
+Möjjelesch, Do häs Ding PaÃ\9fwood ald jetuusch, künnt och sin,
+Do häs Der enzwesche e neu Zweschepaßwood jehollt.',
 'resetpass-temp-password' => 'Zweschepasswood:',
+'resetpass-abort-generic' => 'E Zohsazprojramm häd_et nit zohjelohße, et Paßwoot ze ändere.',
 
 # Special:PasswordReset
 'passwordreset' => 'Et Paßwoot zeröck säze',
-'passwordreset-text' => 'Donn dat Fommulaa heh ußfölle, öm en <i lang="en">e-mail</i> ze krijje, woh jät övver der Zohjang heh obb et Wiki för Desch dren shteiht.',
 'passwordreset-legend' => 'Et Paßwoot zeröck säze',
 'passwordreset-disabled' => 'Et Paßwoot zeröck ze säze es heh em Wiki afjeschalldt.',
-'passwordreset-pretext' => '{{PLURAL:$1||Jiff ein vun dä Saache heh dronger enn|}}',
+'passwordreset-emaildisabled' => 'Heh dat Wiki määt nix met <i lang="en">e-mail</i>!',
 'passwordreset-username' => 'Metmaacher Name:',
 'passwordreset-domain' => 'Domähn:',
 'passwordreset-capture' => 'Wells De di <i lang="en">e-mail</i> beloore?',
 'passwordreset-capture-help' => 'Wann De heh e Krüzje määß, kriß de di <i lang="en">e-mail</i> met däm neue Paßwoot aanjezeish, ußer dat dä Metmaacher se och zohjescheck kritt.',
 'passwordreset-email' => 'De Adräß för de <i lang="en">e-mail</i>:',
 'passwordreset-emailtitle' => 'Einzelheite för der Zohjang op {{GRAMMAR:Akkusativ|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Do künns et sällver jewääse sin, öhnswää hät vun dä Adräß $1 en Internet öm
-en e-mail jefrooch, met Daate övver Dinge Zohjäng 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
+e neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}
 $4
 Heh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:
 
@@ -813,8 +856,8 @@ Donn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi
 Do dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot
 entsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann
 moß 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 en e-mail jefrooch,
-met Daate övver Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}
+'passwordreset-emailtext-user' => 'Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,
+r Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}
 $4
 Heh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:
 
@@ -827,9 +870,9 @@ entsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann
 moß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.',
 'passwordreset-emailelement' => 'Metmaacher Name: $1
 Eijmohl-Paßwoot: $2',
-'passwordreset-emailsent' => 'En <i lang="en">e-mail</i> met Aanjaabe zom Zohjang heh es verscheck.',
-'passwordreset-emailsent-capture' => 'En <i lang="en">e-mail</i> es verscheck. Heh dronger kanns De se lässe.',
-'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> sullt verscheck wääde. Heh dronger kanns De se lässe. Dat Verschecke hät ävver nit jeflup, wääje: $1.',
+'passwordreset-emailsent' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck.',
+'passwordreset-emailsent-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck woode. Heh dronger kanns De se lässe.',
+'passwordreset-emailerror-capture' => 'En <i lang="en">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh sullt verscheck wääde, ävver dat Verschecke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Donn Ding Address för de <i lang="en">e-mail</i> ändere',
@@ -886,9 +929,9 @@ Do moß Ding Paßwoot enjävve, öm Ding Änderong ze bschtäätejje.',
 
 Als Jrund es enjedrage: „''\$2''“
 
-Do kanns heh em Wiki immer noch lesse. Do sühß ävver di Sigg heh, wann De op rude Links klicks, neu Sigge aanlääje, odder Sigge ändere wells, denn doför bes De jetz jesperrt.
+Do 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.
 
-Do kanns met \$1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] Ã¼vver dat Sperre schwaade, wann De wells.
+Do kanns met \$1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] Ã¶vver dat Schpärre schwaade, wann De wells.
 Do kanns ävver nor dann „''E-Mail aan dä Metmaacher''“ aanwende, 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.
 
 Dun en Ding Aanfroge nenne:
@@ -909,10 +952,10 @@ Als Jrund es enjedrage: „''\$2''“
 
 Do kanns heh em Wiki immer noch lesse. Do sühß ävver di Sigg heh, wann De op rude Links klicks, neu Sigge aanlääje, odder Sigge ändere wells, denn doför bes De jetz jesperrt.
 
-Do kanns met \$1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] Ã¼vver dat Sperre schwaade, wann De wells.
-Do kanns ävver nor dann „''E-Mail aan dä Metmaacher''“ aanwende, 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.
+Do kanns met \$1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] Ã¶vver dat Schpärre schwaade, wann De wells.
+Do kanns ävver nor dann „''e-mail aan dä Metmaacher''“ aanwende, wann De ald en e-mail Adress en Dinge [[Special:Preferences|Enstellunge]] enjedrage un freijejovve häs un wann et e-mail schecke nit metjeschperrt es.
 
-Dun en Ding Aanfroge nenne:
+Dun en Dinge Aanfrore nänne:
 * Dä Wiki-Köbeß, dä jesperrt hät: \$1
 * Der Jrond för et Sperre: \$2
 * Da wood jesperrt: \$8
@@ -1051,10 +1094,10 @@ oder fottjeschmesse wääde. Wann Der dat nit rääch es, schriev nix. Et es och
 Dä Tex, dä De heh jescheck häs, dä es {{PLURAL:$1|ein|$1|kei}} Kilobyte jruuß.
 Dat {{PLURAL:$2|es mieh wie ei|sin mieh wie $2|es kei}} Kilobyte. Dat künne mer nit speichere!",
 'readonlywarning' => "'''Opjepass:'''
-De Daatebank es jesperrt woode, wo Do ald am Ändere wors.
+De Daatebank es jesperrt woode, wo Do ald am Ändere wohs.
 Dä.
-Jetz kanns De Ding Änderunge nit mieh avspeichere.
-Dun se bei Dir om Rechner fasshalde un versök et späder noch ens.
+Jetz kanns De Ding Änderunge nit mieh faßhallde lohße.
+Dun se bei Dir om Rechner faßhalde un versöhg et schpäder noch ens.
 
 Nävvebei, dä Datenbank-Köbes hät för et Sperre och ene Jrund aanjejovve: $1",
 'protectedpagewarning' => "'''Opjepass: Die Sigg heh es jäje Veränderunge jeschötz. Nor de Wiki-Köbesse künne se ändere.'''
@@ -1093,6 +1136,8 @@ Ene Jrond weße mer nit.',
 'content-failed-to-parse' => 'Et wohr nit müjjelesch, dä Enhalld met däm <i lang="en">MIME-Typ</i> $2 för en Dattei met $1 dren ze verwooschte: $3.',
 'invalid-content-data' => 'Di Daate en dä Sigg sen onjöltesch.',
 'content-not-allowed-here' => 'Ene Enhalld vun dä Zoot „$1“ es op dä Sigg „[[$2]]“ nit zohjelohße.',
+'editwarning-warning' => 'Wann de vun hee dä Sigg fott jeihß, doh künnte all Ding Änderunge aan dä Sigg verschött jonn.
+Do kanns heh di Warnung affschallde, wann de aanjemelldt un enjelogg bes, dann kriß de se nieh mieh wider. Jangk doför en dä Affschnett „{{int:prefs-editing}}“ en Dinge Enshtellunge.',
 
 # Content models
 'content-model-wikitext' => 'Wikitäx',
@@ -1147,11 +1192,11 @@ Als Jrund för et Sperre es enjedraare: ''$2''",
 'last' => 'met dovör',
 'page_first' => 'Aanfang',
 'page_last' => 'Engk',
-'histlegend' => 'Heh kanns De Versione för et Verjliiche ußsöke: Dun met dä Knöpp die zweij markiere,
+'histlegend' => 'Heh kanns De Versione för et Verjliiche ußsöke: Dun met dä Knöpp di zweij markiere,
 zwesche dänne De de Ungerscheid jezeich krije wells, dann dröck „<b style="padding:2px; background-color:#ddd;
 color:black">{{int:compareselectedversions}}</b>“ udder „<b style="padding:2px; background-color:#ddd;
 color:black">{{int:visualcomparison}}</b>“ udder „<b style="padding:2px; background-color:#ddd;
-color:black">{{int:wikicodecomparison}}</b>â\80\9c met Dinge Taste, oder klick op ein vun dä Knöpp Ã¼vver oder unger de Liss.<br />
+color:black">{{int:wikicodecomparison}}</b>â\80\9c met Dinge Taste, oder klick op ein vun dä Knöpp Ãvver oder unger de Liss.<br />
 Verklierung:
 ({{int:cur}}) = donn met de neuste Version verjliche,
 ({{int:last}}) = donn met de Version ein doför verjliche,
@@ -1200,7 +1245,7 @@ Als ene Wiki_Köbes kanns De de Ungerscheide ävver aankike wann De wells.",
 'rev-suppressed-diff-view' => "Ein vun de Versione heh es '''verschtoche'''.
 Mieh Einzelheite hät [{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} {{lcfirst:{{int:suppressionlog}}}}].
 Als ene Wiki_Köbes kanns De de Ungerscheide ävver aankike wann De wells.",
-'rev-delundel' => 'zeije/usblende',
+'rev-delundel' => 'zeije/ußblände',
 'rev-showdeleted' => 'zeije',
 'revisiondelete' => 'Versione fottschmieße un widder zeröck holle',
 'revdelete-nooldid-title' => 'Kein Version aanjejovve, oddeer en Stuß-Nommer',
@@ -1225,7 +1270,7 @@ dem Wiki singe Installation dat anders fassjelaht woode es.",
 'revdelete-hide-text' => 'Dä Tex vun dä Version versteiche',
 'revdelete-hide-image' => 'De Enhallt vun däm Beld versteiche',
 'revdelete-hide-name' => 'Der Förjang, un och der Enndraach uss_em Logboch, versteiche',
-'revdelete-hide-comment' => 'Dä Enhald vun „Koot Zosammejefass, Quell“ usblende',
+'revdelete-hide-comment' => 'Dä Enhald vun „Koot Zosammejefass, Quell“ ußblände',
 'revdelete-hide-user' => 'Däm Bearbeider sing IP Adress oder Metmaacher Name versteiche',
 'revdelete-hide-restricted' => 'Dun dat och för de Wiki-Köbesse esu maache wie för jede Andere',
 'revdelete-radio-same' => '(lohß wi_t eß)',
@@ -1354,12 +1399,12 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'search-interwiki-default' => '$1 hät heh di Träffer jefonge:',
 'search-interwiki-more' => '(mieh)',
 'search-relatedarticle' => 'Ähnlesch',
-'mwsuggest-disable' => 'Kein automatische Hölp-Liss per Ajax beim Tippe em Feld för et Söke',
+'mwsuggest-disable' => 'Donn kein automattische Leß met Sigge beim Tippe em Feld för et Söhke aanzeije.',
 'searcheverything-enable' => 'En alle Appachtemangs söhke',
 'searchrelated' => 'ähnlesch',
 'searchall' => 'all',
-'showingresults' => 'Unge {{PLURAL:$1|weed <strong>eine</strong>|wääde bes <strong>$1</strong>|weed <strong>keine</strong>}} vun de jefunge Endräch jezeich, vun de Nummer <strong>$2</strong> av.',
-'showingresultsnum' => 'Unge {{PLURAL:$3|es ein|sin <strong>$3</strong>|sin <strong>kein</strong>}} vun de jefunge Endräch opjeliss, vun de Nummer <strong>$2</strong> av.',
+'showingresults' => 'Onge {{PLURAL:$1|weed <strong>eine</strong>|wääde bes <strong>$1</strong>|weed <strong>keine</strong>}} vun de jefonge Endrähsch jezeisch, vun de Nommer <strong>$2</strong> av.',
+'showingresultsnum' => 'Onge {{PLURAL:$3|es ein|sin <strong>$3</strong>|sin <strong>kein</strong>}} vun de jefonge Endrähsch opjeleß, vun de Nommer <strong>$2</strong> av.',
 'showingresultsheader' => "Jefonge un aanjezeisch: {{PLURAL:$5|'''$1''' vun '''$3'''|'''$1''' beß '''$2''' vun '''$3'''|nix}} för '''$4'''",
 'nonefound' => '<strong>Opjepass:</strong>
 Standatmääßesch don mer nur en bestemmpte Appachtemangs söke.
@@ -1376,24 +1421,16 @@ Appachtemangs-Name.',
 'powersearch-toggleall' => 'Övverall Höhksche draan maache',
 'powersearch-togglenone' => 'All Höhksche fott nämme',
 'search-external' => 'Söke fun Ußerhallef',
-'searchdisabled' => 'Dat Söke hee {{GRAMMAR:en|{{SITENAME}}}} es em Momang avjeschalt.
+'searchdisabled' => 'Dat Söhke hee {{GRAMMAR:en|{{SITENAME}}}} es em Momang avjeschalt.
 Dat weed op dänne ẞööver ad ens jemaat, domet de Lass op inne nit ze jroß weed,
-un winnichstens dat normale Sigge Oprofe flöck jenoch jeiht.
+un winnischsdens dat normale Sigge Oprofe flöck jenoch jeiht.
 
-Ehr künnt esu lang Ã¼vver en Sökmaschin vun usserhalv immer noch
-Sigge us {{GRAMMAR:Dative|{{SITENAME}}}} finge.
+Ehr künnt esu lang Ã¶vver en Söhkmaschin vun usserhalv emmer noch
+Sigge us {{GRAMMAR:Dative|{{ucfirst:{{SITENAME}}}}}} finge.
 Et es nit jesaht,
-dat dänne ihr Daate topaktuell sin,
-ävver et es besser wie jaa_nix.',
-
-# Quickbar
-'qbsettings' => '„Flöcke Links“',
-'qbsettings-none' => 'Fottlooße, dat well ich nit sinn',
-'qbsettings-fixedleft' => 'Am linke Rand fass aanjepapp',
-'qbsettings-fixedright' => 'Am rächte Rand fass aanjepapp',
-'qbsettings-floatingleft' => 'Am linke Rand am Schwevve',
-'qbsettings-floatingright' => 'Am rächte Rand am Schwevve',
-'qbsettings-directionality' => 'Faß, passend för wi eröm de Schreff för Ding Schprooch jeiht',
+dat dänne ehr Daate topaktoell sin,
+ävver et es bäßer wi jaa_nix.',
+'search-error' => 'An error has occurred while searching: $1',
 
 # Preferences page
 'preferences' => 'ming Enstellunge',
@@ -1448,7 +1485,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'timezoneuseoffset' => 'Söns jet, jiff dä Ungerscheid aan',
 'timezoneoffset' => 'Dä Ungerscheid¹ es:',
 'servertime' => 'De Uhrzigg om ẞööver es jetz:',
-'guesstimezone' => 'Fingk et erus üvver dä Brauser',
+'guesstimezone' => 'Vum Brauser övvernämme',
 'timezoneregion-africa' => 'Affrikka',
 'timezoneregion-america' => 'Ammerrika',
 'timezoneregion-antarctica' => 'Der Södpool',
@@ -1515,7 +1552,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'email-address-validity-invalid' => 'Jivv en jöltijje Addräß fö de <i lang="en">e-mail</i> en',
 
 # User rights
-'userrights' => 'Metmaacher ehr Räächde verwalde',
+'userrights' => 'De Metmaacher ehr Rääschde verwallde',
 'userrights-lookup-user' => 'Metmaacherjruppe verwalde',
 'userrights-user-editname' => 'Däm Metmaacher singe Name:',
 'editusergroup' => 'Metmaacher ier Jruppe un Räächde ändere',
@@ -1536,6 +1573,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'userrights-changeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De ändere kanns',
 'userrights-unchangeable-col' => '{{PLURAL:$1:Di Jropp|Jroppe|kein Jropp doh}}, di De nit ändere kanns',
 'userrights-irreversible-marker' => '$1 *',
+'userrights-conflict' => 'Ene Andere hät di Rääschde ald verändert. Loor, wad_eruß kohm un versöhg_et norr-ens, wann nüüdesch.',
 
 # Groups
 'group' => 'Jrupp:',
@@ -1629,7 +1667,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 
 # User rights log
 'rightslog' => 'Logboch för Änderunge aan Metmaacher-Räächde',
-'rightslogtext' => 'Hee sin de Änderunge an Metmaacher ehre Räächde opjeliss. Op de Sigge üvver Metmaacher, Wiki-Köbesse, Bürrokrade, Stewards, un esu, kanns De nohlese, wat domet es.',
+'rightslogtext' => 'Heh sen de Änderonge an de Metmaacher ehre Räächde opjeleß.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'di Sigg ze lesse',
@@ -1690,7 +1728,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'rclinks' => 'Zeich de letzte {{int:pipe-separator}}$1{{int:pipe-separator}} Änderunge us de letzte {{int:pipe-separator}}$2{{int:pipe-separator}} Däch, un dun {{int:pipe-separator}}$3',
 'diff' => 'Ungerscheid',
 'hist' => 'Versione',
-'hide' => 'Usblende:',
+'hide' => 'Ußblände!',
 'show' => 'Zeije:',
 'minoreditletter' => 'M',
 'newpageletter' => 'N',
@@ -1805,7 +1843,7 @@ Wann dat de Orjinaaljrüß es, do moß keij för dat Beld keij extra Vör-Aansic
 Dat süühd uß, wi wann dat en Minni-Beldsche em Breefmarrke-Fommaat
 (\'\'<span lang="en">thumbnail</span>\'\') wöhr. Don ens di Dattei
 <strong>$1</strong> prööfe, of de nit e besser opjelööß Beld
-dofun häÃ\9f, un don dat met singe OrjinaaljrüÃ\9f huhlade, wann müjjelesch.
+dofun häÃ\9f, un don dat met singe OrjinaaljrüÃ\9f huhlade, wann mÃjjelesch.
 Söns donn besser ene andere Dateiname ußsöke.',
 'fileexists-forbidden' => 'Et jitt ald en Dattei met däm Name, un mer kann se nit övverschriive.
 Wann de Ding Dattei trozdämm huhlaade wells, da jangk zeröck un lad se
@@ -1971,7 +2009,6 @@ Dröm es <code lang="en">img_auth.php</code> zor Sisherheit heh affjeschalldt.',
 'http-read-error' => 'Et Lässe beim <code lang="en">HTTP</code> es donävve jeange.',
 'http-timed-out' => 'Di <code lang="en">HTTP</code>-Aanforderung hät zoh lang jebruch.',
 'http-curl-error' => 'Ene Fähler es opjetrodde beim Holle vun däm <code lang="en">URL</code>: $1',
-'http-host-unreachable' => 'Mer sen nit noh dämm <i lang="en">URL</i> dorschjekumme.',
 'http-bad-status' => 'Bei dä <code lang="en">HTTP</code>-Aanforderung es e Problem opjetrodde: Fähler&nbsp;$1 — $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1995,18 +2032,18 @@ Velleich probees De et och zo en Zick, wo winnijer loss es.',
 Et eetz wäde de zoletz huhjeladene Dateie aanjezeich. Wam_mer op de Övverschreff von ene Spalt klick, weed die Spalt sotteet, wam_mer norrens klick, weed de Reiejfolsch ömjedrieht.
 Wann ene Metmaacher ußjesöhk es, kritt mer bloß die Dateie, di dä Metmaacher huhjelaade hät.',
 'listfiles_search_for' => 'Sök noh däm Name vun dä Datei:',
-'imgfile' => 'Datei',
+'imgfile' => 'Dattei',
 'listfiles' => 'Dateie opleste',
 'listfiles_thumb' => 'Minni-Belldsche',
 'listfiles_date' => 'Dattum',
 'listfiles_name' => 'Name',
 'listfiles_user' => 'Metmaacher',
 'listfiles_size' => 'Byte',
-'listfiles_description' => 'Wat en dä Datei dren shtish',
-'listfiles_count' => 'Versione',
+'listfiles_description' => 'Wat en dä Datei dren schtisch',
+'listfiles_count' => 'Väsjohne',
 
 # File description page
-'file-anchor-link' => 'Datei',
+'file-anchor-link' => 'Dattei',
 'filehist' => 'De Versione vun dä Datei',
 'filehist-help' => 'Di domohlije Version kriß De jezeich övver dä Link op em Dattum.',
 'filehist-deleteall' => 'All Versione fottschmieße',
@@ -2055,7 +2092,7 @@ Velleisch sullts De dä [$2 Täx övver se doh]  aanpasse.',
 '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-submit' => 'Zeröcknemme',
+'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.',
 
@@ -2081,7 +2118,7 @@ Velleisch sullts De dä [$2 Täx övver se doh]  aanpasse.',
 'filedelete-maintenance-title' => 'Di Dattei künne mer nit fottschmiiße',
 
 # MIME search
-'mimesearch' => 'Dateie üvver dänne ehre <span lang="en">MIME</span>-Typ söke',
+'mimesearch' => 'Dateije övver dänne ehre <span lang="en">MIME</span>-Tüp söhke',
 'mimesearch-summary' => 'Op hee dä {{int:nstab-special}} könne de Dateie noh em <i lang="en">MIME</i>-Tüpp ußjesöök wäde.
 Mer moß immer der Medietüp un der Ongertüp aanjevve.
 Zem Beispell: <code lang="en">image/jpeg</code>
@@ -2111,12 +2148,12 @@ wääde, un luur Der der iehr ander Links aan!',
 'randomredirect-nopages' => 'En däm Appachtemang „$1“ sin ja kein Ömleidunge dren.',
 
 # Statistics
-'statistics' => 'Statistike',
+'statistics' => 'Schtatistike',
 'statistics-header-pages' => 'Zahle övver Sigge',
 'statistics-header-edits' => 'Zahle övver Änderunge',
 'statistics-header-views' => 'Zahle övver afjeroofe Sigge',
-'statistics-header-users' => 'Statistike üvver de Metmaacher',
-'statistics-header-hooks' => 'Ander Statistike',
+'statistics-header-users' => 'Schtatistike övver de Metmaacher',
+'statistics-header-hooks' => 'Ander Schtatistike',
 'statistics-articles' => 'Atikele',
 'statistics-pages' => 'Sigge jesamp',
 'statistics-pages-desc' => '
@@ -2139,6 +2176,12 @@ Esu en Links sollte eijentlesch op en Sigg jon, di tirek jemeint es.
 
 Ene Atikel weed als en „(Watt ėßß datt?)“-Sigg jezallt, wann dä en Schablohn opröhf, op di ene Lenk en dä Sigg [[MediaWiki:Disambiguationspage]] dren es.',
 
+'pageswithprop' => 'Sigge med en beschtemmpte Eijeschaff',
+'pageswithprop-legend' => 'Sigge med en Eijeschaff',
+'pageswithprop-text' => 'Heh di Sigg zeisch Sigge, di en beschtemmpte Eijeschaf han',
+'pageswithprop-prop' => 'Dä name vun dä Eijeschaff:',
+'pageswithprop-submit' => 'Lohß Jonn!',
+
 'doubleredirects' => 'Ömleitunge op Ömleitunge',
 'doubleredirectstext' => 'Hee fings De en jede Reih ene Link op de iertste un de zweite Ömleitung, donoh ene Link op de Sigg, wo de
 zweite Ömleitung hin jeiht. För jewöhnlich es dat dann och de richtije Sigg, wo de iertste Ömleitung ald hen jonn sullt.
@@ -2214,7 +2257,7 @@ Di sin dann <del>dorschjeschtresche</del>.',
 'protectedtitles' => 'Verbodde Titele för Sigge',
 'protectedtitlestext' => 'Sigge met hee dä Tittele lohße mer nit zo, un di künne dröm nit aanjelääsch wäde:',
 'protectedtitlesempty' => 'Op di Aat sin jrad kein Sigge jäje et neu Aanlääje jeschötz.',
-'listusers' => 'Metmaacherliss',
+'listusers' => 'De Metmaacherleß',
 'listusers-editsonly' => 'Donn nor Metmaacher zeije, di och ens jät jeschrevve han.',
 'listusers-creationsort' => 'Noh em Dattum vum Aanmellde zoteere',
 'usereditcount' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|Nix jedonn}}',
@@ -2265,7 +2308,7 @@ wadd_Er am Sööke sidt.',
 Dä Logböcher ehre Enhald ka'mer all noh de Aat, de Metmaacher,
 oder de Sigge ehr Name, un esu, einzel zoteet aanluure.
 Bei de Name moß mer op Jruß- un Kleinschreff aachjävve.",
-'logempty' => '<i>Mer han kein zopass Endräch en däm Logboch.</i>',
+'logempty' => 'Mer han kein zopaß Endrähsch en däm Logbooch.',
 'log-title-wildcard' => 'Sök noh Titelle, di aanfange met …',
 'showhideselectedlogentries' => 'Ußjesöhk Endrääsch verschteische udder zeije',
 
@@ -2314,7 +2357,7 @@ eins vun all däm op eimol.',
 'linksearch-ok' => 'Söhke',
 'linksearch-text' => 'Beim Söke künnd_Er Schtäänsche aanjevve för e Schtöcksche fun ennem Naame, wo mer nit jenou weiß, wi et heiß udder wat me nit kenne deit, zem Beishpöll esu: <code>http://*.example.com</code> un ene bövverschte Name för en Domain moß aanjejovve sin, zem Beishpöll esu: <code>http://*.org</code> 
 
-De Brauserprotokolle, di mer beim Söke aanjäjovve kann, sin: <code>$1</code>, un der Schtandatt es <code>http://</code> wann nix aanjejovve es.',
+{{PLURAL:$2|Dat Brauserprotokoll, wat|De Brauserprotokolle, di|Kein Brauserprotokolle, di}} mer beim Söhke aanjävve kann, sin: <code>$1</code>, un der Schtandatt es <code>http://</code> wann nix aanjejovve es.',
 'linksearch-line' => '„$2“ hät ene Link op $1',
 'linksearch-error' => 'Shternshe kam_mer nor aam Aanfang fum Domain-Name bruche.',
 
@@ -2327,7 +2370,7 @@ De Brauserprotokolle, di mer beim Söke aanjäjovve kann, sin: <code>$1</code>,
 # Special:ActiveUsers
 'activeusers' => 'Leß met de aktiive Metmaacher',
 'activeusers-intro' => 'Dat heh es en Leß met dä Metmaacher, di {{PLURAL:$1|zick jäßtere|en de läzde $1 Dääsch|hück}} ööhnsjät jemaat han.',
-'activeusers-count' => '{{PLURAL:$1|ein Änderung|$1 Änderunge|kein Änderunge}} {{PLURAL:$3|aam lezde Daach|en de lezte $3 Dääsch|hück}}',
+'activeusers-count' => '{{PLURAL:$1|ein Änderong|$1 Änderonge|kein Änderonge}} {{PLURAL:$3|aam lezde Daach|en de lezte $3 Dääsch|hück}}',
 'activeusers-from' => 'Donn de Metmaacher zeije aff:',
 'activeusers-hidebots' => 'De Bots fott lohße',
 'activeusers-hidesysops' => 'De Wiki_Köbesse fott lohße',
@@ -2340,7 +2383,7 @@ Mieh övver de einzel Rääschte fenkt Er op de [[{{MediaWiki:Listgrouprights-he
 'listgrouprights-key' => 'Lejend:
 * Dat es e <span class="listgrouprights-granted">jejovve Rääsch</span>
 * Dat es e <span class="listgrouprights-revoked">fottjenumme Rääsch</span>',
-'listgrouprights-group' => 'Jrupp',
+'listgrouprights-group' => 'Jropp',
 'listgrouprights-rights' => 'Räächte',
 'listgrouprights-helppage' => 'Help:Jrupperäächte',
 'listgrouprights-members' => '(opliste)',
@@ -2397,7 +2440,7 @@ Alles klor?',
 'usermessage-editor' => 'Name vum Metmaacher för de Täxte un Nohreshte vum Wiki ze beärbeide',
 
 # Watchlist
-'watchlist' => 'ming Oppassliss',
+'watchlist' => 'ming Oppaßleß',
 'mywatchlist' => 'Oppaßleß',
 'watchlistfor2' => 'För dä $1 $2',
 'nowatchlist' => 'En Ding Oppassliss es nix dren.',
@@ -2405,12 +2448,8 @@ Alles klor?',
 'watchnologin' => 'Nit enjelogg',
 'watchnologintext' => 'Öm Ding Oppassliss ze ändere, mööts de ald [[Special:UserLogin|enjelogg]] sin.',
 'addwatch' => 'En de Oppassliss don',
-'addedwatchtext' => "Die Sigg „[[:$1]]“ es jetz en Dinge [[Special:Watchlist|Oppaßleß]].
-Av jetz, wann die Sigg verändert weed, oder ehr Klaafsigg, dann weed dat en de
-Oppassliss jezeich. Dä Endrach för die Sigg kütt en  '''Fettschreff''' en de
-„[[Special:RecentChanges|Neuste Änderunge]]“, domet De dä do och flöck fengs.
-Wann de dä widder loss wääde wells us Dinger Oppaßleß,
-dann klick op „Nimieh drop oppasse“ wann De die Sigg om Schirm häs.",
+'addedwatchtext' => 'Die Sigg „[[:$1]]“ es jetz en Dinge [[Special:Watchlist|Oppaßleß]].
+Wann di Sigg udder ier Klaafsigg verändert weed, kütt dat af jäz heh en di Oppaßleß.',
 'removewatch' => 'Us de Oppassliss nämme',
 'removedwatchtext' => 'Die Sigg „[[:$1]]“ es jetz us de [[Special:Watchlist|Oppassliss]] erusjenomme.',
 'watch' => 'Drop Oppasse',
@@ -2421,8 +2460,8 @@ dann klick op „Nimieh drop oppasse“ wann De die Sigg om Schirm häs.",
 'notvisiblerev' => 'Di Version es fottjeschmesse',
 'watchnochange' => 'Keine Atikkel en Dinger Oppassliss es en dä aanjezeichte Zick verändert woode.',
 'watchlist-details' => 'Do häs {{PLURAL:$1|<strong>ein</strong> Sigg|<strong>$1</strong> Sigge|<strong>kein</strong> Sigg}} en dä Oppassliss{{PLURAL:$1|, un di Klaafsigg dozo|, un de Klaafsigge dozo|}}.',
-'wlheader-enotif' => '* Et E-mail Schecke es enjeschalt.',
-'wlheader-showupdated' => 'Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin die Sigge <strong>extra markeet</strong>.',
+'wlheader-enotif' => 'Et <i lang="en">e-mail</i> Schecke es enjeschalt.',
+'wlheader-showupdated' => 'Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin die Sigge <strong>extra markeet</strong>.',
 'watchmethod-recent' => 'Ben de letzte Änderunge jäje de Oppassliss am pröfe',
 'watchmethod-list' => 'Ben de Oppassliss am pröfe, noh de letzte Änderung',
 'watchlistcontains' => 'En dä Oppassliss {{PLURAL:$1|es ein Sigg|sinner <strong>$1</strong> Sigge|sinner <strong>kein</strong> Sigge}}.',
@@ -2546,6 +2585,8 @@ En Leß met de [[Special:ProtectedPages|em Momang jeschözde Sigge]] ham_mer och
 'prot_1movedto2' => 'hät de Sigg vun „[[$1]]“ en „[[$2]]“ ömjenannt.',
 'protect-badnamespace-title' => 'Appachtemang nit schözbaa.',
 'protect-badnamespace-text' => 'En dämm Appachtemang kam_mer kein Sigge schöze.',
+'protect-norestrictiontypes-text' => 'Heh di Sigg kam_mer nit schöze, weil et jaa_kein Zoote vun Schoz em Wiki jitt.',
+'protect-norestrictiontypes-title' => 'Di Sigg es nit schözbaa.',
 'protect-legend' => 'Sigg schötze',
 'protectcomment' => 'Aanlaß odder Jrund:',
 'protectexpiry' => 'Duur, wi lang:',
@@ -2561,8 +2602,8 @@ Di Sigg '''„$1“:''' es jetz jrad:",
 'protect-cascadeon' => 'Die Sigg es en enne Schotz-Kaskad. Se es enjebonge en {{PLURAL:$1|die Sigg|$1 Sigge|kein Sigg}}, die per Kaskade-Schotz jeschötz {{PLURAL:$1|es|sin|es}}. Do kanns dä Schotz för die Sigg heh ändere, ävver di Kaskad blief bestonn. Dat heh sin die Sigge en dä Kaskad:',
 'protect-default' => 'Jeede Metmaacher eraan lohße',
 'protect-fallback' => 'Do weet dat Rääsch „$1“ jebruch.',
-'protect-level-autoconfirmed' => 'Donn neu Metmaacher un namelose Metmaacher nit dranlooße',
-'protect-level-sysop' => 'Nor de Wiki-Köbesse dranlooße',
+'protect-level-autoconfirmed' => 'Bloß de automattesch beschtääteschte Metmaacher dranlooße',
+'protect-level-sysop' => 'Bloß de Wiki-Köbesse dranlooße',
 'protect-summary-cascade' => 'met Schotz-Kaskad',
 'protect-expiring' => 'bes öm $3 Uhr (UTC) aam $2',
 'protect-expiring-local' => 'löüf uß: $1',
@@ -2662,8 +2703,7 @@ $1',
 'blanknamespace' => '(Atikkele)',
 
 # Contributions
-'contributions' => '{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm Metmaacher}} $1
-{{GENDER:$1|singe|singe|singe|iere|singe}} Beidräch',
+'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äch',
 'contributions-title' => 'Beidräsch fum  $1',
 'mycontris' => 'Beidrähch',
 'contribsub2' => 'För dä Metmaacher: $1 ($2)',
@@ -2837,6 +2877,7 @@ un verzäll dänne vun däm ärrje Risiko för de Secherheit fun dänne ehr Rä
 'sorbs' => '<i lang="en">DNSBL</i>',
 'sorbsreason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!',
 'sorbs_create_account_reason' => 'Ding IP-Adress weed en de DNSbl als ene offe Proxy jeliss. Dröm kanns De Dich heh em Wiki nit als ene neue Metmaacher aanmelde. Schwaad met Dingem System-Minsch oder Netzwerk-Techniker oder (ISP Internet Service Provider) drüvver, un verzäll dänne vun däm Risiko för ehr Secherheit!',
+'xffblockreason' => 'En <i lang="en">IP-</i>Adräs en ener <code lang="en">X-Forwarded-For</i> Koppreih es jeschpächt: Et künnt de Dinge udder enem <i lang="en">proxy server</i> zweschedren sing Adräß sin. Der Jrond för et Schpärre woh orschprönglesch: $1',
 'cant-block-while-blocked' => 'Do kanns ander Metmaacher nit sperre, esu lang wi De sellver jesperrt bes.',
 'cant-see-hidden-user' => 'Dä Metmaacher, dä De shperre wells, es al jeshperrt un verschtoche. Weil De nit dat Rääsch häs. Metmaacher ze vershteiche (<code>hideuser</code>), kanns De däm sing Sperr och nit ändere.',
 'ipbblocked' => 'Do kanns kein ander Metmaachere sperrre, weil De sellver jesperrt bes',
@@ -2864,21 +2905,21 @@ un verzäll dänne vun däm ärrje Risiko för de Secherheit fun dänne ehr Rä
 'move-page' => 'De Sigg „$1“ ömnenne',
 'move-page-legend' => 'Sigg Ömnenne',
 'movepagetext' => "Heh kanns De en Sigg ömnenne.
-Domet kritt die Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.
-Unger däm ahle Tittel weed automatisch en Ömleitung op dä neue Tittel enjedrage.
+Domet kritt di Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.
+Unger däm ahle Tittel weed automatisch en Ömleidong op dä neue Tittel enjedrare.
 
-Do kannß dat Höksche setze domet Ömleidonge automattesch aanjepaß wääde, di op dä ahle Tittel zeije — dat weet ävver nur allmählesch pö a pö hengerher jemaat.
-Links op dä ahle Tittel blieve ävver wie se wore, wann De dat Höksche nit setz.
-Dat heiß, dann moß De selver nohluure, ov do jetz [[Special:DoubleRedirects|dubbelde Ömleidunge]] udder [[Special:BrokenRedirects|kapodde Ömleidunge]] bei eruskumme.
+Do 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.
+Links op dä ahle Tittel blieve ävver wi se wore, wann De dat Höksche nit säz.
+Dat heiß, dann moß De selver nohluure, of do jäz [[Special:DoubleRedirects|dubbelde Ömleidonge]] udder [[Special:BrokenRedirects|kapodde Ömleiduoge]] bei eruskumme.
 Wann De en Sigg ömnenne deis, häs Do och doför ze sorje, dat de betroffene Links do henjonn, wo se hen jonn solle.
-Alsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorch!
+Alsu holl Der de Liss „Wat noh heh link“ fun dä Sigg heh un jangk se dorsch!
 
-De Sigg weed '''nit''' ömjenannt, wann et met däm neue Name ald en Sigg jitt, '''ußer''' et es nix drop, oder et es en Ömleitung un se es noch nie jeändert woode.
-Esu kam_mer en Sigg jlich widder zeröck ömnenne, wam_mer sich bem Ömnenne verdonn hät, un mer kann och kein Sigge kapottmaache, wo ald jet drop steiht.
+De 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.
+Esu 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.
 
 '''Oppjepass!'''
-Wat beim Ömnenne erus kütt, künnt en opfällije un villeich stürende Änderung aam Wiki sin, besönders bei öff jebruchte Sigge.
-Alsu bes secher, dat De versteihs, wat De heh am maache bes, ih dat De et mähs!",
+Wat beim Ömnenne erus kütt, künnt en opfällije un villeisch stüürende Änderong aam Wiki sin, besönders bei öff jebruchte Sigge.
+Alsu 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.
 Domet kritt die Sigg ene neue Name, un all vörherije Versione vun dä Sigg och.
 Unger däm ahle Tittel weed automatisch en Ömleitung op dä neue Tittel enjedrage.
@@ -2915,7 +2956,7 @@ En dänne Fäll, muss De Der dä Enhald vun dä Klaafsigge selvs vörnemme, un e
 'movepage-moved-redirect' => 'En Ömleidung es aanjelaat woode.',
 'movepage-moved-noredirect' => 'Kein Ömleidung woodt aanjelaat.',
 'articleexists' => "De Sigg met däm Name jitt et ald, oder dä Name ka'mer oder darf mer nit bruche.<br />Do muss Der ene andere Name ussöke.",
-'cantmove-titleprotected' => 'Die Sigg Ã¶mzenänne es esu nit müjjelesch, dänn dä neu Name vun dä Sigg es jäje et Neu-Aanlääje jeschötz.',
+'cantmove-titleprotected' => 'Die Sigg Ã¶mzenänne es esu nit mÃjjelesch, dänn dä neu Name vun dä Sigg es jäje et Neu-Aanlääje jeschötz.',
 'talkexists' => '<strong>Opjepass:</strong> De Sigg selver woodt jetz ömjenannt, ävver dä ehr Klaafsigg kunnte mer nit met ömnenne. Et jitt ald ein met däm neue Name. Bes esu jod un dun die zwei vun Hand zosamme läje!',
 'movedto' => 'ömjenannt en',
 'movetalk' => 'dä ehr Klaafsigg met ömnenne, wat et jeiht',
@@ -2963,14 +3004,14 @@ Dröm söhk ene andere Name uß.',
 
 # Export
 'export' => 'Sigge Exporteere',
-'exporttext' => "Heh exportees De dä Tex un de Eijeschaffte vun ener Sigg, oder vun enem Knubbel Sigge, de aktuelle Version, met oder ohne ehr ählere Versione.
+'exporttext' => 'Heh exportees De dä Tex un de Eijeschaffte vun ener Sigg, oder vun enem Knubbel Sigge, de aktuelle Version, met oder ohne ehr ählere Versione.
 Dat Janze es enjepack en XML.
-Dat ka'mer en en ander Wiki — wann et och met dä MediaWiki-Soffwär läuf — üvver de Sigg „[[Special:Import|Import]]“ do widder importeere.
+Dat kam_mer en en ander Wiki — wann et och met dä MediaWiki-Soffwär läuf — övver de Sigg „[[Special:Import|Import]]“ do widder empoteere.
 
 Schriev de Titele vun dä Sigge en dat Feld för Tex enzejevve, unge, eine Titel en jede Reih.
 Dann dun onoch ussöke, ov De all de vörherije Versione vun dä Sigge han wells, oder nor de aktuelle met dä Informatione vun de letzte Änderung.
 
-En däm Fall künns De, för en einzelne Sigg, och ene tirekte Link bruche, zom Beispill „[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]“ för de Sigg „[[{{MediaWiki:Mainpage}}]]“ ze exporteere.",
+En däm Fall künns De, för en einzelne Sigg, och ene tirekte Link bruche, zom Beispill „[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]“ för de Sigg „[[{{MediaWiki:Mainpage}}]]“ ze exporteere.',
 'exportall' => 'Alle Sigge Äxpotteere',
 'exportcuronly' => 'Bloß de aktuelle Version usjevve (un <strong>nit</strong> de janze ahle Versione onoch met dobei dun)',
 'exportnohistory' => '----
@@ -3007,6 +3048,8 @@ Wenn De jenerell aan [//www.mediawiki.org/wiki/Localisation MediaWiki singe Öve
 'thumbnail-more' => 'Jrößer aanzeije',
 'filemissing' => 'Datei es nit do',
 'thumbnail_error' => 'Ene Fähler es opjetauch beim Maache vun enem Breefmarke/Thumbnail-Beldche: „$1“',
+'thumbnail_error_remote' => 'Ene Fähler es em $1 opjevalle:
+$2',
 'djvu_page_error' => 'De DjVu-Sgg es ußerhallef',
 'djvu_no_xml' => 'De XML-Date för di DjVu-Datei kunnte mer nit afrofe',
 'thumbnail-temp-create' => 'Mer kunnte kein Zweschedattei für Minnibeldscher aanlääje.',
@@ -3029,7 +3072,7 @@ All de Trans Wiki Emporte wääde em [[Special:Log/import|Emport_Logboch]] fassj
 'import-interwiki-submit' => 'Huhlade!',
 'import-interwiki-namespace' => 'Dun de Sigge emporteere en dat Appachtemeng:',
 'import-interwiki-rootpage' => 'De Aanfangssigg (kann läddesch bliive):',
-'import-upload-filename' => 'Dä Name fun dä Datei:',
+'import-upload-filename' => 'Dä Name fun dä Dattei:',
 'import-comment' => 'Jrond:',
 'importtext' => 'Dun de Daate met däm „[[Special:Export|Export]]“ vun doh vun enem Wiki Exporteere un - etwa bei Dir om Rechner - avspeichere, un dann heh wider huhlade.',
 'importstart' => 'Ben Sigge am emporteere …',
@@ -3123,7 +3166,7 @@ Bes esu joot, un versök et noch ens.',
 'tooltip-t-recentchangeslinked' => 'De neuste Änderunge aan Sigge, wo vun heh dä Sigg uß Links drop jon',
 'tooltip-feed-rss' => 'Dä RSS-Abonnomang-Kannal (Feed) för heh di Sigg',
 'tooltip-feed-atom' => 'Dä Atom-Abonnomang-Kannal (Feed) för heh di Sigg',
-'tooltip-t-contributions' => 'Donn de Liß met Bedträch vun däm Metmaacher beloore',
+'tooltip-t-contributions' => 'Donn en Leß met dä Bedrähsch vun däm Medmaacher belooere',
 'tooltip-t-emailuser' => 'Scheck en E-Mail aan dä Metmaacher',
 'tooltip-t-upload' => 'Dateie huhlade',
 'tooltip-t-specialpages' => 'Liss met de {{int:nstab-special}}e',
@@ -3134,7 +3177,7 @@ Bes esu joot, un versök et noch ens.',
 '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-project' => 'Dun die Projeksigg aanzeije',
-'tooltip-ca-nstab-image' => 'Dun die Sigg üvver heh di Dattei aanzeije',
+'tooltip-ca-nstab-image' => 'Don di Sigg övver heh di Dattei aanzeije',
 'tooltip-ca-nstab-mediawiki' => 'En Täx vum MediaWiki-System aanzeije',
 'tooltip-ca-nstab-template' => 'Dun die Schabloon aanzeije',
 'tooltip-ca-nstab-help' => 'Donn en Sigg met Hölp aanzeije',
@@ -3152,23 +3195,17 @@ Bes esu joot, un versök et noch ens.',
 'tooltip-rollback' => 'Nemmp alle Änderunge zeröck, di dä Läzde jemaat hät, dä aan dä Sigg övverhoup jet jedonn hät. Deit nimmieh frore un määd ene automattesche Endraach en „{{int:Summary}}“',
 'tooltip-undo' => '„{{UCfirst:{{int:editundo}}}}“ määt der förije Zostand
 fun dä Sigg op, zom Beärbeide un widder Afspeichere.
-Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
+Esu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.',
 'tooltip-preferences-save' => 'Enstellunge faßhallde',
 'tooltip-summary' => 'Jif en koote Zesammefassung en',
 
 # Stylesheets
 'common.css' => '/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */',
-'standard.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Klassesch“ */',
-'nostalgia.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Nostaljesch“ */',
 'cologneblue.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Kölsch Blau“ */',
 'monobook.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Monobooch“ */',
-'myskin.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Ming Skin“ */',
-'chick.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Höhnsche“ */',
-'simple.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Eijfach“ */',
 'modern.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Modern“ */',
 'vector.css' => '/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Vector“ */',
 'print.css' => '/* CSS heh aan dä Stell wirrek nur op et Sigge Drökke */',
-'handheld.css' => '/* dat CSS hee wirrek sesch uß op su jeannte Handheld-Apparaate, opjebout op de Ovverflääsch uß $wgHandheldStyle */',
 'noscript.css' => '/* Dat CSS heh aan dä Stell krijje nur de Metmaacher met affjeschaldt JavaSkrepp jescheck */',
 'group-autoconfirmed.css' => '/* Dat CSS heh aan dä Stell krijje nur de automattesch beshtääteshte Metmacher jescheck */',
 'group-bot.css' => '/* Dat CSS heh aan dä Stell krijje nur de Bot-Projrammee jescheck */',
@@ -3177,13 +3214,8 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 
 # Scripts
 'common.js' => '/* Jedes JavaScrip hee kütt för jede Metmaacher in jede Sigg erinn */',
-'standard.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Klassesch" jescheck */',
-'nostalgia.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Nostaljesch" jescheck */',
 'cologneblue.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Kölsch Blou" jescheck */',
 'monobook.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Monnobooch" jescheck */',
-'myskin.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Ming Skin" jescheck */',
-'chick.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Höhnsche" jescheck */',
-'simple.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Eijfach" jescheck */',
 'modern.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Modern" jescheck */',
 'vector.js' => '/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch "Vector" jescheck */',
 'group-autoconfirmed.js' => '/* De JavaSkreppte fun hee krijje bloß de autemattesch beshtääteschte Metmaacher jescheck */',
@@ -3203,7 +3235,7 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 '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' => 'Ã\9cvver de Metmaacher un ehre Beidräch för heh die Sigg',
+'creditspage' => 'Ã\96vver de Metmaacher un dänne ehr Beidräsch för heh di Sigg',
 'nocredits' => "För die Sigg ha'mer nix en de Liss.",
 
 # Spam protection
@@ -3232,6 +3264,7 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'pageinfo-robot-noindex' => 'kammer nit opnämme',
 'pageinfo-views' => 'De Aanzahl Affroofe',
 'pageinfo-watchers' => 'De Aanzahl Oppaßer för di Sigg',
+'pageinfo-few-watchers' => 'Et jidd_er winnijer wi {{PLURAL:$1|eine|$1|keine}} Oppaßer.',
 'pageinfo-redirects-name' => 'Ömleidong(e) op heh di Sigg',
 'pageinfo-subpages-name' => 'Ongersigg(e) vun heh dä Sigg',
 'pageinfo-subpages-value' => '$1 (dovun {{PLURAL:$2|ein Ömleidong|$2 Ömleidonge|kein Ömleidong}} un {{PLURAL:$3|ein nomaale Sigg|$3 nomaale Sigge|kein nomaale Sigg}})',
@@ -3246,6 +3279,7 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'pageinfo-magic-words' => '{{PLURAL:$1|Ei Zauberwoot|$1 Zauberwööter|Kein Zauberwööter}}',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Ein verstoche Saachjropp|$1 verstoche Saachjroppe|Kein verstoche Saachjropp}}',
 'pageinfo-templates' => '{{PLURAL:$1|Ein Schablohn|$1 Schablohne|Kein Schablohn}} opjerohfe',
+'pageinfo-transclusions' => 'En {{PLURAL:$1|ein Sigk|$1 Sigge|kein Sigk}} enjeföösch',
 'pageinfo-toolboxlink' => 'Övver heh di Sigg',
 'pageinfo-redirectsto' => 'Leidt öm op',
 'pageinfo-redirectsto-info' => 'Aanjaabe övver di Sigg',
@@ -3254,15 +3288,14 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'pageinfo-protect-cascading' => 'Ene Siggeschoz weed vun heh verärf',
 'pageinfo-protect-cascading-yes' => 'Joh',
 'pageinfo-protect-cascading-from' => 'Ene Siggeschoz weed jeärf vun',
+'pageinfo-category-info' => 'Aanjaabe övver Saachjroppe',
+'pageinfo-category-pages' => 'De Aanzahl Sigge',
+'pageinfo-category-subcats' => 'De Aanzahl Ongerjroppe',
+'pageinfo-category-files' => 'De Aanzahl Dateie',
 
 # Skin names
-'skinname-standard' => 'Klassesch',
-'skinname-nostalgia' => 'Nostaljesch',
 'skinname-cologneblue' => 'Kölsch Blau',
 'skinname-monobook' => 'MonoBoch',
-'skinname-myskin' => 'Ming Skin',
-'skinname-chick' => 'Höhnche',
-'skinname-simple' => 'Eifach',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vektor',
 
@@ -3303,6 +3336,7 @@ $1',
 'mediawarning' => '<strong>Opjepass</strong>: En dä Datei künnt en <b>jefährlich Projrammstöck</b> dren stecke. Wa\'mer et laufe looße dät, do künnt dä ẞööver, udder Dinge Rääschner, met för de <i lang="en">Cracker</i> opjemaht wääde.',
 'imagemaxsize' => "Belder nit jrößer maache wie:<br /> ''(op dä Sigge, wo se beschrevve wääde)''",
 'thumbsize' => 'Esu breid solle de klein Beldche (Thumbnails/Breefmarke) sin:',
+'widthheight' => '$1&nbsp;×&nbsp;$2',
 'widthheightpage' => '{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh, {{PLURAL:$3|eij Sigg|$3 Sigge|keij Sigge}}',
 'file-info' => 'Dateiömfang: $1, MIME-Tüp: <code>$2</code>',
 'file-info-size' => '{{PLURAL:$1|Ei Pixel|$1 Pixelle}} breed × {{PLURAL:$2|Ei Pixel|$2 Pixelle}} huh, de Datei hät $3, dä MIME-Typ es: <code>$4</code>',
@@ -3336,16 +3370,34 @@ $1',
 'sp-newimages-showfrom' => 'Zeich de neu Dateie av däm $1 öm $2 Uhr',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'video-dims' => '$1, $2&nbsp;×&nbsp;$3',
 'seconds-abbrev' => '$1&nbsp;Sek.',
 'minutes-abbrev' => '$1&nbsp;Min.',
 'hours-abbrev' => '$1&nbsp;Std.',
+'days-abbrev' => '$1&nbsp;d',
 'seconds' => '{{PLURAL:$1|eine Sekund|$1 Sekunde|keine Sekund}}',
 'minutes' => '{{PLURAL:$1|eine Menutt|$1 Menutte|keine Menutt}}',
 'hours' => '{{PLURAL:$1|ein Schtundt|$1 Schtunde|kein Schtundt}}',
 'days' => '{{PLURAL:$1|einem Daach|$1 Dääsch|keinem Daach}}',
+'weeks' => '{{PLURAL:$1|ein Woch|$1 Woche|keine Woch}}',
+'months' => '{{PLURAL:$1|Eine&nbsp;Monhnd|$1&nbsp;Mohnde|Keine&nbsp;Monhnd}}',
+'years' => '{{PLURAL:$1|Ein&nbsp;Jonhr|$1&nbsp;Johre|Kei&nbsp;Jonhr}}',
 'ago' => 'vür $1',
 'just-now' => 'jraad äävens',
 
+# Human-readable timestamps
+'hours-ago' => 'för {{PLURAL:$1|ein Stund|$1 Stunde|keine Stund}}',
+'minutes-ago' => 'för {{PLURAL:$1|eine Menott|$1 Menotte|keine Menott}}',
+'seconds-ago' => 'för {{PLURAL:$1|eine Sekond|$1 Sekonde|keine Sekond}}',
+'monday-at' => 'Läzde Moondaach öm $1 Uhr',
+'tuesday-at' => 'Läzde Dinnsdaach öm $1 Uhr',
+'wednesday-at' => 'Läzde Medwoch öm $1 Uhr',
+'thursday-at' => 'Läzde Donnersdaach öm $1 Uhr',
+'friday-at' => 'Läzde Friidaach öm $1 Uhr',
+'saturday-at' => 'Läzde Samsdaach öm $1 Uhr',
+'sunday-at' => 'Läzde Sundaach öm $1 Uhr',
+'yesterday-at' => 'Jästere öm $1 Uhr',
+
 # Bad image list
 'bad_image_list' => '<strong>Fomat:</strong>
 Nur Reije met ennem * am Aanfang don jet.
@@ -3372,7 +3424,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breejd',
 'exif-imagelength' => 'Läng',
 'exif-bitspersample' => 'Bits per Färvaandeil',
@@ -3551,7 +3603,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 'exif-originalimageheight' => 'De Hühde vum Beld, ih dat es zohjeschnedde wood, en Pixelle',
 'exif-originalimagewidth' => 'De Breede vum Beld, ih dat es zohjeschnedde wood, en Pixelle',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Oohne Kompressjuhn',
 'exif-compression-2' => 'Noh de <i lang="en">CCITT</i> ier Jrop 3 kodeet mem eindimänsjonalle aanjepaßte Verfahre noh_m <i lang="en">Huffman</i> singe „Läng vum Rötsch“',
 'exif-compression-3' => 'Noh de <i lang="en">CCITT</i> ier Jrop 3 als Fax kodeet',
@@ -3780,7 +3832,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 
 # External editor support
 'edit-externally' => 'Dun de Datei met enem externe Projramm bei Dr om Rechner bearbeide',
-'edit-externally-help' => '(Luur en de [//www.mediawiki.org/wiki/Manual:External_editors Installationsaanweisunge] noh mieh Hinwies)',
+'edit-externally-help' => '(Luur en de [//www.mediawiki.org/wiki/Manual:External_editors Aanleidong för de Enschtallazjuhn] noh mieh Henwiese)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'all',
@@ -3926,10 +3978,15 @@ Wells Do jetz met en neu Version die Sigg widder neu aanläje?',
 'autosumm-new' => 'De Sigg wood neu aanjelaat met däm Aanfang: $1',
 
 # Size units
-'size-bytes' => '$1 Bytes',
-'size-kilobytes' => '$1 KB',
-'size-megabytes' => '$1 MB',
-'size-gigabytes' => '$1 GB',
+'size-bytes' => '$1&nbsp;Bytes',
+'size-kilobytes' => '$1&nbsp;KB',
+'size-megabytes' => '$1&nbsp;MB',
+'size-gigabytes' => '$1&nbsp;GB',
+'size-terabytes' => '$1&nbsp;TB',
+'size-petabytes' => '$1&nbsp;PB',
+'size-exabytes' => '$1&nbsp;EB',
+'size-zetabytes' => '$1&nbsp;ZB',
+'size-yottabytes' => '$1&nbsp;YB',
 
 # Bitrate units
 'bitrate-bits' => '$1&nbps;bps',
@@ -3943,7 +4000,7 @@ Wells Do jetz met en neu Version die Sigg widder neu aanläje?',
 'bitrate-yottabits' => '$1&nbps;Ybps',
 
 # Live preview
-'livepreview-loading' => 'Ben am Lade …',
+'livepreview-loading' => 'Ben aam Laade{{int:ellipsis}}',
 'livepreview-ready' => 'Fädesch jelaade.',
 'livepreview-failed' => 'De lebendije Vör-Ansich klapp jrad nit.
 Don de nomaale Vör-Ansich nemme.',
@@ -3967,13 +4024,13 @@ Do kanns Ding Oppassleß och [[Special:EditWatchlist/raw|en rüh beärbeide]].',
 'watchlistedit-normal-done' => '{{PLURAL:$1|Eine Sigge-Tittel es|<strong>$1</strong> Sigge-Tittele sin|Keine Sigge-Tittel es}} us Dinge Opassliss erus jefloore:',
 'watchlistedit-raw-title' => 'Rüh Oppassliss beärbeide',
 'watchlistedit-raw-legend' => 'Rüh Oppassliss beärbeide',
-'watchlistedit-raw-explain' => "Dat sin de Endräch in Dinge Oppassliss en rüh.
-Öm einzel Titelle loss ze wääde, kanns de de Reije met inne eruß schmieße, ov leddich maache.
-Öm neu Titelle  dobei ze don, schriev neu Reije dobei. Jede Titel moß en en Reih för sijj_allein shtonn.
+'watchlistedit-raw-explain' => "Dat sin de Endrähsch in Dinge Oppaßles en rüh.
+Öm einzel Titelle loßß ze wääde, kanns de de Reije met inne eruß schmieße, ov läddich maache.
+Öm neu Titelle  dobei ze don, schriev neu Reije dobei. Jede Titel moss en en Reih för sijj_allein shtonn.
 Wanns De fädig bes, dann deuß De dä Knopp „{{int:Watchlistedit-raw-submit}}“.
-Natörlech kanns De di Liss och — met Dingem Brauser singe ''<span lang=\"en\">Copy&amp;Paste</span>''-Funkßjohn — komplett kopeere odder ußtuusche.
+Natörlesch kanns De di Les och — met Dingem Brauser singe ''<span lang=\"en\">Copy&amp;Paste</span>''-Funkßjohn — komplett kopeere odder ußtuusche.
 De könnts Ding Oppassliss ävver och [[Special:EditWatchlist|övver e Fomulaa met Kässjer un Hökscher beärbeide]].",
-'watchlistedit-raw-titles' => 'Endräch:',
+'watchlistedit-raw-titles' => 'Endrähsch:',
 'watchlistedit-raw-submit' => 'Oppassliss neu fasshallde',
 'watchlistedit-raw-done' => 'Ding Oppassliss es fassjehallde.',
 'watchlistedit-raw-added' => '{{PLURAL:$1|Eine Sigge-Tittel wood|<strong>$1</strong> Sigge-Tittele woodte|Keine Sigge-Tittel}} dobeijedonn:',
@@ -4010,7 +4067,7 @@ De könnts Ding Oppassliss ävver och [[Special:EditWatchlist|övver e Fomulaa m
 Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlößel „$2“.",
 
 # Special:Version
-'version' => 'Version vun de Wiki Soffwär zeije',
+'version' => 'Väsjohn vun de Wiki Soffwär zeije',
 'version-extensions' => 'Installeete Erjänzunge un Zohsätz',
 'version-specialpages' => '{{int:nstab-special}}e',
 'version-parserhooks' => 'De Parser-Hooke',
@@ -4026,8 +4083,8 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
 'version-parser-function-hooks' => 'Parserfunktione',
 'version-hook-name' => 'De Schnettstelle ier Name',
 'version-hook-subscribedby' => 'Opjeroofe vun',
-'version-version' => '(Version $1)',
-'version-license' => 'Lizänz',
+'version-version' => '(Väsjohn $1)',
+'version-license' => 'Lėzänz',
 'version-poweredby-credits' => "Dat Wiki heh löp met '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'sönß wää',
 'version-credits-summary' => 'Mer bedanke ons för iehr Beidrähsch zom [[Special:Version|MediaWiki]] bei:',
@@ -4038,17 +4095,22 @@ MediaWiki weed verdeilt met dä Hoffnung, dat et för jet jood es, ävver <span
 Do 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-software-version' => 'Version',
+'version-software-version' => 'Väsjohn',
 'version-entrypoints' => '<i lang="en>URLs</i> för enzeschteije',
 'version-entrypoints-header-entrypoint' => 'Enschteesch',
 'version-entrypoints-header-url' => '<i lang="en">URL</i>',
 
-# Special:FilePath
-'filepath' => 'Medije-Dateie med ier URL zëije',
-'filepath-page' => 'Dattëij_Name:',
-'filepath-submit' => 'Lohß Jonn!',
-'filepath-summary' => "Med dä {{int:nstab-special}} hee künnd'Er dä kompläte Paad vun de neuste Version vun ene Datei direk erusfenge.
-Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
+# Special:Redirect
+'redirect' => 'Ömleite op en Dattei, ene Metmaacher udder de Väsjohn vun ener Sigg',
+'redirect-legend' => 'Ömleide ob_en Dattei udder Sigg',
+'redirect-summary' => 'Heh di {{int:specialpage}} leidt öm ob_en Dattei — doh mößd_Er ene Nahme aanjävve — udder en Sigg — doh mößd_Er en Kännong för en Väsjoh aanjävve — udder en Metmaachersigg — doh mößd_Er enem Metmaacher sing Kännong aanjävve.',
+'redirect-submit' => 'Lohß Jonn!',
+'redirect-lookup' => 'Söhk noh:',
+'redirect-value' => 'Kännong udder Nahme:',
+'redirect-user' => 'Enem Metmaacher sing Kännong',
+'redirect-revision' => 'Ener Sigg ier Väsjohn ier Kännong',
+'redirect-file' => 'Ener Dattei iehre Nahme',
+'redirect-not-exists' => 'Nit jefonge',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sök noh dubbelte Dateie',
@@ -4076,8 +4138,8 @@ Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
 'specialpages-group-highuse' => 'Öff jebruch…',
 'specialpages-group-pages' => 'Siggeliste',
 'specialpages-group-pagetools' => 'Werrekzüch för Sigge',
-'specialpages-group-wiki' => 'Werrekzüch un Date vum Systeem',
-'specialpages-group-redirects' => '{{int:nstab-special}}e, die ömleite, söke, un finge',
+'specialpages-group-wiki' => 'Werrekzüch un Daate vum Syßteem',
+'specialpages-group-redirects' => '{{int:nstab-special}}e, die ömleide, söhke, un fenge',
 'specialpages-group-spam' => 'Werrekzüch jäje SPÄM',
 
 # Special:BlankPage
@@ -4086,7 +4148,7 @@ Die Datei weed jlich aanjezeig, odder med däm paßende Projramm op jemaat.",
 
 # External image whitelist
 'external_image_whitelist' => '# Donn aan dä Reih heh nix ändere<pre>
-# Onge künne Brochstöck fun regular expressions aanjejovve wäde,
+# Onge künne Brochstöke fun rejolähre Ußdrök aanjejovve wäde,
 # alsu dä Deil zwesche / und /
 # Noh em Verjliische met däm URL vun ene Datei fun ußerhallef:
 # Treffer: De Datei weed jezeich odder enjebonge.
@@ -4141,23 +4203,26 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
 'htmlform-submit' => 'Lohß Jonn!',
 'htmlform-reset' => 'Änderunge retuur nämme',
 'htmlform-selectorother-other' => 'Annder',
+'htmlform-no' => 'Nää',
+'htmlform-yes' => 'Joh',
+'htmlform-chosen-placeholder' => 'Söhk jäd_uß',
 
 # SQLite database support
 'sqlite-has-fts' => 'Version $1 (un kann en janze Täxte söhke)',
 'sqlite-no-fts' => 'Version $1 (kann ävver nit en janze Täxte söhke)',
 
 # New logging system
-'logentry-delete-delete' => ' $1 hät di Sigg „$3“ fottjeschmeße.',
-'logentry-delete-restore' => 'Dä $1 hät di vörmohls fottjeschmeße Sigg „$3“ wider zeröck jehollt..',
-'logentry-delete-event' => 'Dä $1 hät för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}}  vun dä Sigg „$3“ $4.',
-'logentry-delete-revision' => 'Dä $1 hät för {{PLURAL:$5|ein Version|$5 Versione|kein Version}}  vun dä Sigg „$3“ $4.',
-'logentry-delete-event-legacy' => 'Dä $1 hät de Seeschbakeit vun Enndrääje en Logbööscher vun dä Sigg „$3“ verändert.',
-'logentry-delete-revision-legacy' => 'Dä $1 hät de Seeschbakeit ällder Väsjohne vun dä Sigg „$3“ verändert.',
-'logentry-suppress-delete' => ' $1 hät di Sigg „$3“ ongerdröck.',
-'logentry-suppress-event' => 'Dä $1 hät heimlesh för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}}  vun dä Sigg „$3“ $4.',
-'logentry-suppress-revision' => 'Dä $1 hät heimlesh för {{PLURAL:$5|ein Version|$5 Versione|kein Version}}  vun dä Sigg „$3“ $4.',
-'logentry-suppress-event-legacy' => 'Dä $1 hät de Seeschbakeit vun Enndrääje en Logbööscher vun dä Sigg „$3“ heimlesch verändert.',
-'logentry-suppress-revision-legacy' => 'Dä $1 hät de Seeschbakeit ällder Väsjohne vun dä Sigg „$3“ heimlesch verändert.',
+'logentry-delete-delete' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ fottjeschmeße.',
+'logentry-delete-restore' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di vörmohls fottjeschmeße Sigg „$3“ wider zeröck jehollt.',
+'logentry-delete-event' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} vun dä Sigg „$3“ $4.',
+'logentry-delete-revision' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
+'logentry-delete-event-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun Enndrääje en de Logbööscher vun dä Sigg „$3“ verändert.',
+'logentry-delete-revision-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun älldere Väsjohne vun dä Sigg „$3“ verändert.',
+'logentry-suppress-delete' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ ongerdröck.',
+'logentry-suppress-event' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät heimlesh för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} en dä Sigg „$3“ $4.',
+'logentry-suppress-revision' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät heimlesch för {{PLURAL:$5|ein Version|$5 Versione|kein Version}} vun dä Sigg „$3“ $4.',
+'logentry-suppress-event-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun Enndrääje en dä Logbööscher op dä Sigg „$3“ heimlesch verändert.',
+'logentry-suppress-revision-legacy' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät de Seeschbakeit vun älldere Väsjohne vun dä Sigg „$3“ heimlesch verändert.',
 'revdelete-content-hid' => 'der Enhalt verstoche',
 'revdelete-summary-hid' => 'dat Fäld „{{int:summary}}“ vershtoche',
 'revdelete-uname-hid' => 'der Name vum Metmaacher verstoche',
@@ -4166,16 +4231,27 @@ die De häs han welle. Se künnt jet ällder un nit mieh aktoäll sin.',
 'revdelete-uname-unhid' => 'der Name vum Metmaacher öffentlesh jemaat',
 'revdelete-restricted' => ', och för de Wiki-Köbesse',
 'revdelete-unrestricted' => ', och för de Wiki-Köbesse',
-'logentry-move-move' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt.',
-'logentry-move-move-noredirect' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei kein Ömleidong aanjelaat.',
-'logentry-move-move_redir' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleingungssigg fottjeschmeße.',
-'logentry-move-move_redir-noredirect' => 'Dä $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleidongssigg fottjeschmeße un kein neue Ömliedongssig aanjelaat.',
-'logentry-patrol-patrol' => 'Dä $1 hät di Version $4 vun dä Sigg „$3“ nohjeloort.',
-'logentry-patrol-patrol-auto' => 'Dä $1 hät di Version $4 vun dä Sigg „$3“ automattesch nohjeloort.',
-'logentry-newusers-newusers' => 'Dä neue Metmaacher $1 wood aanjelaat.',
-'logentry-newusers-create' => 'Dä neue Metmaacher $1 wood aanjelaat.',
-'logentry-newusers-create2' => 'Dä $1 hät dä $3 als ene neue Metmaacher aanjelaat.',
-'logentry-newusers-autocreate' => 'Dä $1 wood automattesch als Metmaacher aanjelaat.',
+'logentry-move-move' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt.',
+'logentry-move-move-noredirect' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei kein Ömleidong aanjelaat.',
+'logentry-move-move_redir' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleindongßsigg fottjeschmeße.',
+'logentry-move-move_redir-noredirect' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hätt di Sigg „$3“ en „$4“ ömjenannt un derbei en ahle Ömleidongßsigg fottjeschmeße un kein neue Ömleidongßsig aanjelaat.',
+'logentry-patrol-patrol' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Version $4 vun dä Sigg „$3“ nohjeloort.',
+'logentry-patrol-patrol-auto' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Version $4 vun dä Sigg „$3“ automattesch nohjeloort.',
+'logentry-newusers-newusers' => '{{GENDER:$2
+|Dä neue Metmaacher $1 wood
+|Dat $1 wood als ene neue Metmaacherėn
+|Dä neue Metmaacher $1 wood
+|De $1 wood als en neue Metmaacherėn
+|Dat $1 wood als ene neue Metmaacher}} aanjelaat.',
+'logentry-newusers-create' => '{{GENDER:$4
+|Dä neue Metmaacher $1 wood
+|Dat $1 wood als ene neue Metmaacherėn
+|Dä neue Metmaacher $1 wood
+|De $1 wood als en neue Metmaacherėn
+|Dat $1 wood als ene neue Metmaacher}} aanjelaat.',
+'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-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.',
@@ -4234,6 +4310,7 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'api-error-ok-but-empty' => 'Fähler: Mer krijje kein Antwoot vum ẞööver.',
 'api-error-overwrite' => 'En Dattei ze övverschrieve es nit zohjelohße.',
 'api-error-stashfailed' => 'Fähler: Dä ẞööver hät kein Datteije zweschejeschpeischert.',
+'api-error-publishfailed' => 'Ene Fähler es em ẞööver opjetrodde. En zweschejescheischerte Dattei kunnt nit öffentlesch jemaat wääde.',
 'api-error-timeout' => 'Dä ẞööver hät en dä jewennde Zick nit jeantwoot.',
 'api-error-unclassified' => 'Ene Fähler es opjetrodde, der mer nit kenne.',
 'api-error-unknown-code' => 'Nit bekannte Fähler: „$1“',
@@ -4244,14 +4321,17 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'api-error-verification-error' => 'Di Dattei künnt kappott sin, udder en verkehte Endong em Naame han.',
 
 # Durations
-'duration-seconds' => '{{PLURAL:$1|ein Sekund|$1 Sekunde|kein Sekund}}',
-'duration-minutes' => '{{PLURAL:$1|ein Menutt|$1 Menutte|kein Menutt}}',
-'duration-hours' => '{{PLURAL:$1|en Stund|$1 Stunde|kein Shtund}}',
-'duration-days' => '{{PLURAL:$1|ene Daach|$1 Dääsch|keine Daach}}',
-'duration-weeks' => '{{PLURAL: $1|en Woch|$1 Woche|kein Woch}}',
-'duration-years' => '{{PLURAL:$1|e Johr|$1 Johre|kei Johr}}',
-'duration-decades' => '{{PLURAL:$1|zehn Johre|$1 Johrzehnte|kei Johrzehnt}}',
-'duration-centuries' => '{{PLURAL:$1|e Johrhondert|$1 Johrhonderte|kei Johrhondert}}',
-'duration-millennia' => '{{PLURAL:$1|e Johrdousend|$1 Johrdousende|kei Johrdousend}}',
+'duration-seconds' => '{{PLURAL:$1|ein&nbsp;Sekond|$1&nbsp;Sekonde|kein&nbsp;Sekond}}',
+'duration-minutes' => '{{PLURAL:$1|ein&nbsp;Menot|$1&nbsp;Menotte|kein&nbsp;Menot}}',
+'duration-hours' => '{{PLURAL:$1|en&nbsp;Schtond|$1&nbsp;Schtonde|kein&nbsp;Schtond}}',
+'duration-days' => '{{PLURAL:$1|ene&nbsp;Daach|$1&nbsp;Dääsch|keine&nbsp;Daach}}',
+'duration-weeks' => '{{PLURAL: $1|en&nbsp;Woch|$1&nbsp;Woche|kein&nbsp;Woch}}',
+'duration-years' => '{{PLURAL:$1|e&nbsp;Johr|$1&nbsp;Johre|kei&nbsp;Johr}}',
+'duration-decades' => '{{PLURAL:$1|zehn&nbsp;Johre|$1&nbsp;Johzehnte|kei&nbsp;Johzehnt}}',
+'duration-centuries' => '{{PLURAL:$1|e&nbsp;Johhondert|$1&nbsp;Johhonderte|kei&nbsp;Johhondert}}',
+'duration-millennia' => '{{PLURAL:$1|e&nbsp;Johdousend|$1&nbsp;Johdousende|kei&nbsp;Johdousend}}',
+
+# Image rotation
+'rotate-comment' => 'Dat Beld wood öm {{PLURAL:$1|$1 Jraad}} esu eröm jedrieht, wi der Ohrzeijer leuf.',
 
 );
index 1b1a99d..239ddd8 100644 (file)
@@ -131,8 +131,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Nîşan bide, çiqas bikarhêner dişopînin',
 'tog-oldsig' => 'Pêşdîtina îmzeya heye:',
 'tog-fancysig' => 'Di îmzeyê de girêdana otomatîk a bikarhêner betal bike',
-'tog-externaleditor' => 'Edîtorekî derve bike "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
-'tog-externaldiff' => 'Birnemijekî derve biguherîne "standard" (ji yên bi ezmûn re, tercîhên taybet di komputerê de hewce ne)',
 'tog-showjumplinks' => 'Girêdanên "Here-berve" qebûlbike',
 'tog-uselivepreview' => 'Pêşdîtina "zindî" bi kar bîne (JavaScript pêwîst e) (ceribandinî)',
 'tog-forceeditsummary' => 'Hinga kurteyeke vala hate tomarkirin min agahdar bike',
@@ -662,8 +660,8 @@ Astengkirina dawî bi referansa li jêr hatiye piştrastkirin:',
 'userjspreview' => "'''Zanibe ku tu tenê JavaScript'a xwe diceribînî, ew hê nehatiye tomarkirin!'''",
 'updated' => '(Hate rojanekirin)',
 'note' => "'''Nîşe:'''",
-'previewnote' => "'''Ji bîr neke ku ev bi tenê çavdêriyek e.'''
-Ev rûpel hîn nehatiye tomarkirin!",
+'previewnote' => "'''Ji bîr neke ku ev tenê pêşdîtinek e.'''
+Guhertinên te hê nehatine tomarkirin!",
 'continue-editing' => 'Guhertinê bidomîne',
 'editing' => 'Biguherîne: "$1"',
 'creating' => '$1 tê çêkirin',
@@ -821,7 +819,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Vebijartinên lêgerrînê',
 'searchmenu-exists' => "'''Rûpeleke bi navê \"[[:\$1]]\" li ser vê wîkiyê heye.'''",
-'searchmenu-new' => 'Rûpela "[[:$1]]" li ser vê derê çêke!',
+'searchmenu-new' => 'Rûpela "[[:$1]]" çêke!',
 'searchhelp-url' => 'Help:Alîkarî',
 'searchprofile-articles' => 'Rûpelên naverokê',
 'searchprofile-project' => 'Rûpelên alîkariyê û projeyê',
@@ -858,9 +856,6 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'searchdisabled' => '<p>Tu dikarî li {{SITENAME}} bi Google an Yahoo! bigere. Têbînî: Dibe ku encamen lêgerîne ne yên herî nû ne.
 </p>',
 
-# Quickbar
-'qbsettings-none' => 'Tune',
-
 # Preferences page
 'preferences' => 'Tercîhên min',
 'mypreferences' => 'Tercihên min',
@@ -1004,10 +999,10 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'right-sendemail' => 'Ji bikarhênerên di re e-name bişîne',
 
 # Special:Log/newusers
-'newuserlogpage' => 'çêkirina hesabê nû',
+'newuserlogpage' => 'Ã\87êkirina hesabê nû',
 
 # User rights log
-'rightslog' => 'guhertina mafê bikarhêneriyê',
+'rightslog' => 'Guhertina mafê bikarhêneriyê',
 'rightslogtext' => 'Ev guhertineke ji bo mafên bikarhêneriyê ye.',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1082,7 +1077,7 @@ anjî ji bo file'ên dengî '''<nowiki>[[</nowiki>{{ns:media}}:File.ogg<nowiki>]
 'upload-preferred' => 'Cureyên pelan yên tên xwestin: $1.',
 'upload-prohibited' => 'Cureyên pelan yên qedexekirî: $1.',
 'uploadlog' => 'barkirina belgeyan',
-'uploadlogpage' => 'barkirina belgeyan',
+'uploadlogpage' => 'Barkirina belgeyan',
 'filename' => 'Navê pelê',
 'filedesc' => 'Danasîn',
 'fileuploadsummary' => 'Kurte:',
@@ -1410,8 +1405,8 @@ Gava tu bixwazî wê rûpelê ji nav lîsteya xwe ya şopandinê derbixî, li se
 'notanarticle' => 'Ne gotar e',
 'watchnochange' => 'Ne rûpelek, yê tu dişopînê, hate xeyrandin di vê wextê da, yê tu dixazê bibînê.',
 'watchlist-details' => '{{PLURAL:$1|Rûpeleka|$1 rûpel}} li ser lîsteya te ya şopandinê, rûpelên gotûbêjê nayên jimartin.',
-'wlheader-enotif' => 'Agahdariya E-nameyê pêk tê.',
-'wlheader-showupdated' => "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
+'wlheader-enotif' => 'Agahdariya E-nameyê pêk tê.',
+'wlheader-showupdated' => "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
 'watchlistcontains' => 'Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.',
 'wlnote' => "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
 'wlshowlast' => 'Guhertinên berî $1 saetan, $2 rojan, ya $3 nîşan bide',
@@ -1462,7 +1457,7 @@ Paşagahîdan û alîkaraya din:
 'actioncomplete' => 'Çalakî pêk hat',
 'actionfailed' => 'Çalakî têkçû',
 'deletedtext' => '"$1" hat jêbirin. Ji bo qeyda rûpelên ku di dema nêzîk de hatin jêbirin binêre $2.',
-'dellogpage' => 'jêbirina rûpelê',
+'dellogpage' => 'Jêbirina rûpelê',
 'dellogpagetext' => 'Li jêr lîsteyek ji jêbirinên dawî heye.',
 'deletionlog' => 'jêbirina rûpelê',
 'reverted' => 'Hate şondabirin berve verzyonekî berê',
@@ -1478,7 +1473,7 @@ Paşagahîdan û alîkaraya din:
 'delete-warning-toobig' => "Dîroka vê rûpelê pir mezin e, zêdetirî $1 guherandin. Jêbirina van rûpelan dikarin şaşbûnan di database'ê {{SITENAME}} da çêkin; zandibe tu çi dikê!",
 
 # Rollback
-'rollback_short' => 'bizîvirîne pêş',
+'rollback_short' => 'Bizîvirîne pêş',
 'rollbacklink' => 'bizîvirîne pêş',
 'cantrollback' => 'Guherto naye vegerandin;
 bikarhênerê dawî, tenya nivîskarê vê rûpelê ye.',
@@ -1601,7 +1596,7 @@ Ji bo jêbirinan û çêkirinên nû, ji kerema xwe li [[{{ns:special}}:Log/dele
 'whatlinkshere-hideredirs' => 'Beralîkirinan $1',
 'whatlinkshere-hidetrans' => 'Naverokan $1',
 'whatlinkshere-hidelinks' => 'Girêdanan $1',
-'whatlinkshere-hideimages' => '$1 lînkên wêneyan',
+'whatlinkshere-hideimages' => 'Girêdanên wêneyan $1',
 'whatlinkshere-filters' => 'Parzûn',
 
 # Block/unblock
@@ -1619,14 +1614,14 @@ Sedemekê binivîse!",
 'ipbreason' => 'Sedem',
 'ipbreasonotherlist' => 'Sedemeke din',
 'ipbreason-dropdown' => '*Sedemên astengkirinê
-** vandalîzm
-** agahiya şaş kire gotarekê
-** naveroka rûpelekê vala kir
-** girêdanên xerab tevlî rûpelan dikir
-** tiştên tewş dikir gotaran
-** heqaretkirin
-** pir hesab bikaranîn
-** navekî ku nayê pejirandin',
+** Vandalîzm
+** Agahiya şaş dikire gotarekê
+** Naveroka rûpelekê vala kir
+** Girêdanên xerab tevlî rûpelan dikir
+** Tiştên tewş tevlî gotaran dikir
+** Heqaretkirin
+** Pir hesab bikaranîn
+** Navekî ku nayê pejirandin',
 'ipbcreateaccount' => 'Çêkirina hesaban qedexe bike',
 'ipbemailban' => 'Ji bo şandina e-nameyan qedexe bike.',
 'ipbenableautoblock' => "Otomatîk IP'yên niha û yên nû yê vê bikarhênerê astengbike.",
@@ -1741,8 +1736,9 @@ da bikarî navê wê rûpelê biguherînî.',
 'movepage-page-exists' => 'Rûpela $1 berê heye û ew nikane otomatîk were jêbirin.',
 'movepage-page-moved' => 'Rûpela $1 çû cihê $2.',
 'movepage-page-unmoved' => 'Rûpela $1 nikanî çûba ciha $2.',
-'movelogpage' => 'guhertina nav',
+'movelogpage' => 'Guhertina nav',
 'movelogpagetext' => 'Li jêr lîsteyek ji rûpelan ku navê wan hatiye guherandin heye.',
+'movenosubpage' => 'Binrûpelên vê rûpelê tune ne.',
 'movereason' => 'Sedem',
 'revertmove' => 'şûnde vegerîne',
 'delete_and_move' => 'Jêbibe û nav biguherîne',
@@ -1874,6 +1870,8 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 'pageinfo-redirectsto-info' => 'agahî',
 'pageinfo-contentpage-yes' => 'Erê',
 'pageinfo-protect-cascading-yes' => 'Erê',
+'pageinfo-category-pages' => 'hejmara rûpelan',
+'pageinfo-category-subcats' => 'Hejmara binkategoriyan',
 
 # Patrolling
 'markaspatrolleddiff' => 'Wek serrastkirî nîşan bide',
@@ -1927,7 +1925,7 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 'metadata-expand' => 'Detayên dirêj nîşan bide',
 'metadata-collapse' => 'Detayên dirêj veşêre',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Panbûn',
 'exif-imagelength' => 'Dirêjbûn',
 'exif-jpeginterchangeformatlength' => "Byte'ên daneya JPEG",
@@ -2095,10 +2093,6 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 'version-software-version' => 'Guherto',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath-page' => 'Wêne:',
-'filepath-submit' => 'Gotar',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Navê dosyeyê:',
 'fileduplicatesearch-submit' => 'Lê bigere',
@@ -2115,11 +2109,13 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 'specialpages-group-users' => 'Bikarhêner û maf',
 'specialpages-group-pages' => 'Lîstên rûpelan',
 'specialpages-group-pagetools' => 'Amûrên rûpelê',
+'specialpages-group-wiki' => 'Dane û amûr',
 
 # Special:BlankPage
 'blankpage' => 'Rûpela vala',
 
 # Special:Tags
+'tag-filter' => 'Parzûna [[Special:Tags|nîşankirinê]]:',
 'tag-filter-submit' => 'Parzûn',
 'tags-title' => 'Nîşankirin',
 'tags-tag' => 'Tag name',
index 245c003..55f572c 100644 (file)
@@ -224,6 +224,7 @@ $messages = array(
 'tog-watchlisthideliu' => "Cudha chanjyow gans devnydhyoryon omgelmys y'n rol golyas",
 'tog-watchlisthideanons' => "Cudha chanjyow gans devnydhyoryon heb hanow y'n rol golyas",
 'tog-showhiddencats' => 'Disqwedhes classys cudhys',
+'tog-useeditwarning' => 'Gwra ow gwarnya pan wrellen vy gasa folen chanjya gans chanjyow nag eus gwithys',
 
 'underline-always' => 'Puppres',
 'underline-never' => 'Jammes',
@@ -654,6 +655,8 @@ Gwrewgh checkya mars yw whans dhywgh gwruthyl/chanjya an folen-ma.',
 'moveddeleted-notice' => 'Diles yw an folen-ma.
 Yma covnoten dhileans ha gwayans an folen a-woles.',
 'log-fulllog' => 'Gweles an govnoten dien',
+'editwarning-warning' => 'Mar tewgh why ha gasa an folen-ma, chanjyow eus gwres genowgh a alsa bos kellys.
+Mars owgh why omgelmys, why a yll dialosegy an gwarnyans-ma yn trogh "Chanjya" agas dowisyansow.',
 
 # "Undo" feature
 'undo-summary' => 'Diswul amendyans $1 gans [[Special:Contributions/$2|$2]] ([[User talk:$2|kescows]])',
@@ -1308,7 +1311,7 @@ Why a yll gweles hy fennfenten.',
 'metadata-expand' => 'Disqwedhes manylyon ystynnys',
 'metadata-collapse' => 'Cudha manylyon ystynnys',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Les',
 'exif-imagelength' => 'Uhelder',
 'exif-artist' => 'Awtour',
@@ -1391,9 +1394,6 @@ Why a yll [[Special:EditWatchlist|usya an janjyel usadow]] ynwedh.',
 'version-other' => 'Aral',
 'version-version' => '(Versyon $1)',
 
-# Special:FilePath
-'filepath-page' => 'Restren:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Hanow an restren:',
 'fileduplicatesearch-submit' => 'Whilas',
index 356b857..9bb3544 100644 (file)
@@ -61,8 +61,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Көзөмөлдөп жаткан катышуучулардын санын көрсөтүү',
 'tog-oldsig' => 'Кезектеги кол тамга:',
 'tog-fancysig' => 'Кол тамганын өз уики-белгиси (автоматтык шилтемесиз)',
-'tog-externaleditor' => 'Тышкы редакторду жарыяланбасча колдонуу (адистер үчүн гана, компьютериңизде өзгөчө ырастоолор керек. [//www.mediawiki.org/wiki/Manual:External_editors кошумча маалымат.])',
-'tog-externaldiff' => 'Салыштыруу үчүн тышкы программаны жарыяланбасча колдонуу (адистер үчүн гана, компьютериңизде өзгөчө ырастоолор керек. [//www.mediawiki.org/wiki/Manual:External_editors кошумча маалымат.])',
 'tog-showjumplinks' => '«өтүү» деген жардамчы шилтемелерди күйгүзүү',
 'tog-uselivepreview' => 'Тез алдын ала көрсөтүүнү колдонуу (JavaScript талап кылынат) (эксперименталдык)',
 'tog-forceeditsummary' => 'Оңдоо баяндоосунун талаасы бош болгон кезинде мага алдын ала эскертүү',
@@ -721,14 +719,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'powersearch-togglenone' => 'Эчтеке',
 'search-external' => 'Тышкы издөө',
 
-# Quickbar
-'qbsettings' => 'Навигация панели',
-'qbsettings-none' => 'Көрсөтпөө',
-'qbsettings-fixedleft' => 'Жылбаган сол',
-'qbsettings-fixedright' => 'Жылбаган оң',
-'qbsettings-floatingleft' => 'Оома сол',
-'qbsettings-floatingright' => 'Оома оң',
-
 # Preferences page
 'preferences' => 'Ырастоолор',
 'mypreferences' => 'Ырастоолор',
@@ -1488,7 +1478,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Туурасы',
 'exif-imagelength' => 'Бийиктик',
 'exif-imagedescription' => 'Сүрөт аты',
@@ -1533,7 +1523,7 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'exif-intellectualgenre' => 'Объекттин түрү',
 'exif-subjectnewscode' => 'Теманын коду',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Кыстырылбаган',
 
 'exif-copyrighted-true' => 'Автордук укук менен корголгон',
@@ -1685,11 +1675,6 @@ HTML-тегдеринин тууралыгын текшериңиз.',
 'version-software-version' => 'Версия',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Файл жолу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Өтүү',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файл аты:',
 'fileduplicatesearch-submit' => 'Издөө',
index 4682739..c7d808e 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Amahoney
  * @author Andrew Dalby
+ * @author Autokrator
  * @author Dferg
  * @author Esteban97
  * @author Kaganer
@@ -188,8 +189,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Numerum usorum custodientium monstrare',
 'tog-oldsig' => 'Subscriptio ad tempus adhibita:',
 'tog-fancysig' => 'Subscriptio vicitext (sine nexu automatico)',
-'tog-externaleditor' => 'Utere editore externo semper (pro peritus solo, requirat speciales optiones in calculone. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Utere editore dissimilitudine externa semper (pro peritus solo, requirat speciales optiones in calculone. [//www.mediawiki.org/wiki/Manial:External_editors More information.])',
 'tog-showjumplinks' => 'Sinere nexus ostendi forma "salire ad" monstrata',
 'tog-uselivepreview' => 'Praevisum viventem adhibere (JavaScript)',
 'tog-forceeditsummary' => 'Si recensionem non summatim descripsero, me roga si continuare velim',
@@ -198,6 +197,7 @@ $messages = array(
 'tog-watchlisthideminor' => 'Celare recensiones minores in paginarum custoditarum indice',
 'tog-watchlisthideliu' => 'Celare recensiones usorum notorum in paginarum custoditarum indice',
 'tog-watchlisthideanons' => 'Celare recensiones usorum ignotorum in paginarum custoditarum indice',
+'tog-watchlisthidepatrolled' => 'Recensiones vigilatae paginas custoditas celare',
 'tog-ccmeonemails' => 'Mitte mihi transcriptiones litterarum quas ad alios usores mitto',
 'tog-diffonly' => 'Noli monstrare contenta paginae infra dissimilitudinem',
 'tog-showhiddencats' => 'Categorias celatas monstrare',
@@ -274,6 +274,9 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|Huic categoriae est solum unus fasciculus.|Huic categoriae {{PLURAL:$1|est hic fasciculus|sunt hi $1 fasciculi}} ex omnino $2 fasciculis.}}',
 'category-file-count-limited' => 'Huic categoriae {{PLURAL:$1|est hic fasciculus|sunt hi $1 fasciculi}}.',
 'listingcontinuesabbrev' => 'cont.',
+'index-category' => 'Paginae quae in indice sunt',
+'noindex-category' => 'Paginae quae non in indice sunt',
+'broken-file-category' => 'Paginae cum nexibus ad fasciculos ruptis',
 
 'about' => 'De hoc',
 'article' => 'Pagina contenta continens',
@@ -500,8 +503,15 @@ Nota bene paginas fortasse videantur quasi tuum conventum esset apertum, priusqu
 'welcomecreation-msg' => 'Ratio tua creata est.
 Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusative|{{SITENAME}}}} mutare.',
 'yourname' => 'Nomen usoris:',
+'userlogin-yourname' => 'Nomen usoris',
+'userlogin-yourname-ph' => 'Nomen usoris tuum inscribe',
 'yourpassword' => 'Tessera:',
+'userlogin-yourpassword' => 'Tessera',
+'userlogin-yourpassword-ph' => 'Tesseram tuam inscribe',
+'createacct-yourpassword-ph' => 'Tesseram inscribe',
 'yourpasswordagain' => 'Tesseram adfirmare:',
+'createacct-yourpasswordagain' => 'Tesseram confirmare',
+'createacct-yourpasswordagain-ph' => 'Tesseram iterum inscribe',
 'remembermypassword' => 'Tesseram meam hoc in navigatro inter conventa memento ({{PLURAL:$1|die|diebus}} $1 tenus)',
 'yourdomainname' => 'Regnum tuum:',
 'login' => 'Conventum aperire',
@@ -512,14 +522,23 @@ Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusat
 'logout' => 'Conventum concludere',
 'userlogout' => 'Conventum concludere',
 'notloggedin' => 'Conventum non est apertum',
+'userlogin-noaccount' => 'Num rationem non habes?',
 'nologin' => "Num rationem non habes? '''$1'''.",
 'nologinlink' => 'Eam crea',
 'createaccount' => 'Rationem novam creare',
 'gotaccount' => "Habesne iam rationem? '''$1'''.",
 'gotaccountlink' => 'Conventum aperi',
 'userlogin-resetlink' => 'Num tesserae tuae oblitus es?',
-'createaccountmail' => 'ab inscriptione electronica',
+'helplogin-url' => 'Help:Conventum aperire',
+'createacct-emailrequired' => 'Inscriptio electronica',
+'createacct-emailoptional' => 'Inscriptio electronica (non necesse)',
+'createacct-email-ph' => 'Inscriptionem electronicam tuam inscribe',
+'createaccountmail' => 'Use a temporary random password and send it to the email address specified below',
 'createaccountreason' => 'Causa:',
+'createacct-reason' => 'Causa',
+'createacct-imgcaptcha-ph' => 'Textum quem supra vidis inscribe',
+'createacct-benefit-body1' => '{{PLURAL:$1|recensio|recensiones}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|pagina|paginae}}',
 'badretype' => 'Tesserae quas scripsisti inter se non congruunt.',
 'userexists' => 'Nomen usoris quod selegisti iam est.
 Nomen usoris alium selige.',
@@ -752,6 +771,7 @@ Ille hanc causam dedit: ''$2''",
 Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 '''({{int:last}})''' = dissimilis ab emendatione proxima, '''{{int:minoreditletter}}''' = recensio minor.",
 'history-fieldset-title' => 'Quaerere in paginae historia',
+'history-show-deleted' => 'Solum recensiones deletas monstrare',
 'histfirst' => 'Veterrimus',
 'histlast' => 'Novissimus',
 'historysize' => '({{PLURAL:$1|1 octetus|$1 octeti}})',
@@ -781,6 +801,8 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'revdelete-radio-unset' => 'Minime',
 'revdelete-log' => 'Causa:',
 'revdel-restore' => 'visibilitatem mutare',
+'revdel-restore-deleted' => 'Recensiones deletae',
+'revdel-restore-visible' => 'Recensiones visibiles',
 'pagehist' => 'Historia paginae',
 'deletedhist' => 'Historia deleta',
 'revdelete-edit-reasonlist' => 'Causas deletionum recensere',
@@ -840,6 +862,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'searchprofile-articles-tooltip' => 'Quaerere in $1',
 'searchprofile-project-tooltip' => 'Quaerere in $1',
 'searchprofile-images-tooltip' => 'Fasciculos quaerere',
+'searchprofile-advanced-tooltip' => 'In spatiis nominalibus accommotis quaerere',
 'search-result-size' => '$1 ({{PLURAL:$2|1 verbum|$2 verba}})',
 'search-result-score' => 'Gravitas: $1%',
 'search-redirect' => '(redirectio $1)',
@@ -857,6 +880,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'showingresultsnum' => "Subter monstrans {{PLURAL:$3|'''1''' eventum|'''$3''' eventus}} incipiens ab #'''$2'''.",
 'nonefound' => "'''Adnotatio''': Solum aliquae spatia nominalia quaesita sunt semper.
 Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (paginas, formulas et cetera) vel utere spatio nominali desiderato quasi praefixo.",
+'search-nonefound' => 'Nullae paginae quaesitionem tuam adaequant.',
 'powersearch' => 'Quaerere callidissime',
 'powersearch-legend' => 'Quaerere callidissime',
 'powersearch-ns' => 'Quaerere in spatiis nominalibus:',
@@ -868,14 +892,6 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 'search-external' => 'Inquisitio externalis',
 'searchdisabled' => 'Per {{grammar:accusative|{{SITENAME}}}} ad tempus non potes quaerere. Interea per [http://www.google.com Googlem] quaeras. Nota indices {{grammar:genitive|{{SITENAME}}}} contentorum apud Googlem fortasse antiquiores esse.',
 
-# Quickbar
-'qbsettings' => 'Figuratio claustri celeris',
-'qbsettings-none' => 'Nullus',
-'qbsettings-fixedleft' => 'Constituere a sinistra',
-'qbsettings-fixedright' => 'Constituere a dextra',
-'qbsettings-floatingleft' => 'Innens a sinistra',
-'qbsettings-floatingright' => 'Innens a dextra',
-
 # Preferences page
 'preferences' => 'Praeferentiae',
 'mypreferences' => 'Praeferentiae',
@@ -943,6 +959,7 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 'yourlanguage' => 'Lingua:',
 'yourvariant' => 'Differentia linguae contentorum:',
 'yournick' => 'Subscriptio nova:',
+'prefs-help-signature' => 'Cum in paginis disputationum scribas, "<nowiki>~~~~</nowiki>" conscribe, quod in subscriptionem tuam et indicationem temporis convertetur.',
 'badsig' => 'Subscriptio cruda non est valida; scrutina affixa HTML.',
 'badsiglength' => 'Subscriptio tua nimis longa est.
 {{PLURAL:$1|Una littera est|$1 litterae sunt}} longitudo maxima.',
@@ -1665,6 +1682,7 @@ Si pagina nova cum ipso nomine post deletionem creata est, emendationes restitut
 'sp-contributions-newbies-title' => 'Conlationes rationum novarum',
 'sp-contributions-blocklog' => 'acta obstructionum',
 'sp-contributions-deleted' => 'conlationes usoris deletae',
+'sp-contributions-uploads' => 'Fasciculi impositi',
 'sp-contributions-logs' => 'acta',
 'sp-contributions-talk' => 'disputatio',
 'sp-contributions-userrights' => 'usorum potestates',
@@ -1960,6 +1978,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'tooltip-upload' => 'Incipere imponere',
 'tooltip-rollback' => '"Revertere" omnes ultimi editoris in hac pagina recensiones statim revertit',
 'tooltip-undo' => '"Abrogare" fenestram recensionis aperit (hac recensione reversa). Summarium addere licet.',
+'tooltip-summary' => 'Summarium breve addere',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Usor ignotus|Usores ignoti}} {{grammar:genitive|{{SITENAME}}}}',
@@ -1984,7 +2003,6 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'pageinfo-toolboxlink' => 'De hac pagina',
 
 # Skin names
-'skinname-standard' => 'Norma',
 'skinname-cologneblue' => 'Caerulus Colonia',
 
 # Patrolling
@@ -2032,7 +2050,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'metadata-expand' => 'Plura ostende',
 'metadata-collapse' => 'Partim celare',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Amplitudo',
 'exif-imagelength' => 'Altitudo',
 'exif-bitspersample' => 'Biti per componentem',
@@ -2105,7 +2123,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 'exif-gpsdatestamp' => 'Dies GPS',
 'exif-gpsdifferential' => 'Correctio differentialis GPS',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Incompressus',
 
 'exif-unknowndate' => 'Dies ignota',
@@ -2335,11 +2353,6 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
 'version-software-product' => 'Productum',
 'version-software-version' => 'Versio',
 
-# Special:FilePath
-'filepath' => 'Fasciculorum inscriptio',
-'filepath-page' => 'Fasciculus:',
-'filepath-submit' => 'Ire',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-legend' => 'Duplicatum quaerere',
 'fileduplicatesearch-filename' => 'Fasciculi nomen:',
index e5ddc84..9cdcb10 100644 (file)
@@ -211,8 +211,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Àmostrar el kadhar de usadores que están akavidando las hojas',
 'tog-oldsig' => 'La firma presente',
 'tog-fancysig' => 'Tratar la firma como un vikiteksto (sin un atamiento otomatiko)',
-'tog-externaleditor' => 'Yir usando un ēdditor esterno (es sólo para usadores adelantados; tiene menester de ayares especiales en vuestro contador [//www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
-'tog-externaldiff' => 'Yir usando un comparador (diff) esterno (sólo es para usadores adelantados; tiene menester de ayares especiales en vuestro contador [//www.mediawiki.org/wiki/Manual:External_editors Para saver más.])',
 'tog-showjumplinks' => 'Aktivar los atamientos de ayudo "{{int:jumpto}}"',
 'tog-uselivepreview' => 'Usar el "previsteo bivo" (JavaScript es menester) (eksperimental)',
 'tog-forceeditsummary' => 'Avizarme cuando dexo el somaryo vazío',
@@ -239,7 +237,7 @@ $messages = array(
 'editfont-serif' => 'Tipografía serif',
 
 # Dates
-'sunday' => 'Aljhadh',
+'sunday' => 'Aljhad',
 'monday' => 'Lunes',
 'tuesday' => 'Martes',
 'wednesday' => 'Miércoles',
@@ -256,7 +254,7 @@ $messages = array(
 'january' => 'Enero',
 'february' => 'Hevrero',
 'march' => 'Março',
-'april' => 'Avril',
+'april' => 'Abril',
 'may_long' => 'Mayo',
 'june' => 'Juño',
 'july' => 'Jullo',
@@ -268,7 +266,7 @@ $messages = array(
 'january-gen' => 'Enero',
 'february-gen' => 'Hevrero',
 'march-gen' => 'Março',
-'april-gen' => 'Avril',
+'april-gen' => 'Abril',
 'may-gen' => 'Mayo',
 'june-gen' => 'Juño',
 'july-gen' => 'Jullo',
@@ -280,7 +278,7 @@ $messages = array(
 'jan' => 'Ene',
 'feb' => 'Hev',
 'mar' => 'Mar',
-'apr' => 'Avr',
+'apr' => 'Abr',
 'may' => 'May',
 'jun' => 'Juñ',
 'jul' => 'Jull',
@@ -1160,7 +1158,7 @@ Los otros campos se van a guardar por defecto.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-filesource' => 'Manadéro de archivo',
 'exif-gpstimestamp' => 'Tiémpo GPS (óra atómica)',
 'exif-gpsdatestamp' => 'Dáta GPS',
@@ -1241,10 +1239,6 @@ Los otros campos se van a guardar por defecto.
 'version-poweredby-others' => 'otros',
 'version-software-version' => 'Versión',
 
-# Special:FilePath
-'filepath-page' => 'Dosya:',
-'filepath-submit' => 'Yir',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Buscar',
 
index 988cfa0..f8fdad2 100644 (file)
@@ -195,7 +195,7 @@ $messages = array(
 'tog-editsection' => "Linke fir d'Ännere vun eenzelnen Abschnitter weisen",
 'tog-editsectiononrightclick' => 'Eenzel Abschnitter mat Rietsklick änneren (JavaScript)',
 'tog-showtoc' => 'Inhaltsverzeechnes weise bei Säite mat méi wéi dräi Iwwerschrëften',
-'tog-rememberpassword' => 'Meng Umeldung mat dësem Browser(fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
+'tog-rememberpassword' => 'Meng Umeldung mat dësem Browser (fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
 'tog-watchcreations' => 'Säiten déi ech uleeën a Fichieren déi ech eroplueden op meng Iwwerwaachungslëscht derbäisetzen',
 'tog-watchdefault' => 'Säiten a Fichieren déi ech änneren op meng Iwwerwaachungslëscht derbäisetzen',
 'tog-watchmoves' => 'Säiten a Fichieren déi ech réckelen automatesch op meng Iwwerwaachungslëscht derbäisetzen',
@@ -211,8 +211,6 @@ $messages = array(
 'tog-shownumberswatching' => "D'Zuel vun de Benotzer déi dës Säit iwwerwaache weisen",
 'tog-oldsig' => 'Aktuell Ënnerschrëft:',
 'tog-fancysig' => 'Ënnerschrëft als Wiki-Text behandelen (Ouni automatesche Link)',
-'tog-externaleditor' => 'Externen Editeur als Standard benotzen (Nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen.])',
-'tog-externaldiff' => 'En Externen Diff-Programm als Standard benotzen (nëmme fir Experten, et musse speziell Astellungen op ärem Computer gemaach ginn. [//www.mediawiki.org/wiki/Manual:External_editors Méi Informatiounen])',
 'tog-showjumplinks' => 'Aktivéiere vun de "Sprang op"-Linken',
 'tog-uselivepreview' => 'Live-Preview benotzen (JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Warnen, wa beim Späicheren de Resumé feelt',
@@ -227,6 +225,7 @@ $messages = array(
 'tog-showhiddencats' => 'Verstoppt Kategorië weisen',
 'tog-noconvertlink' => 'Ëmwandlung vum Titel desaktivéieren',
 'tog-norollbackdiff' => 'Ënnerscheed nom Zrécksetzen ënnerdrécken',
+'tog-useeditwarning' => "Mech warne wann ech d'Ännerung vun enger Säit verloosen, ouni Ännerunge gespäichert ze hunn",
 
 'underline-always' => 'Ëmmer',
 'underline-never' => 'Ni',
@@ -290,6 +289,18 @@ $messages = array(
 'oct' => 'Okt.',
 'nov' => 'Nov.',
 'dec' => 'Dez.',
+'january-date' => '$1. Januar',
+'february-date' => '$1. Februar',
+'march-date' => '$1. Mäerz',
+'april-date' => '$1. Abrëll',
+'may-date' => '$1. Mee',
+'june-date' => '$1. Juni',
+'july-date' => '$1. Juli',
+'august-date' => '$1. August',
+'september-date' => '$1. September',
+'october-date' => '$1. Oktober',
+'november-date' => '$1. November',
+'december-date' => '$1. Dezember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
@@ -372,7 +383,7 @@ $messages = array(
 'delete' => 'Läschen',
 'deletethispage' => 'Dës Säit läschen',
 'undelete_short' => '$1 {{PLURAL:$1|Versioun|Versioune}} restauréieren',
-'viewdeleted_short' => '{{PLURAL:$1|Eng geläschte Versioun|$1 geläschte Versioune}} weisen',
+'viewdeleted_short' => '{{PLURAL:$1|Eng geläschte Versioun|$1 geläscht Versioune}} weisen',
 'protect' => 'Spären',
 'protect_change' => 'änneren',
 'protectthispage' => 'Dës Säit schützen',
@@ -399,7 +410,7 @@ $messages = array(
 'otherlanguages' => 'An anere Sproochen',
 'redirectedfrom' => '(Virugeleet vu(n) $1)',
 'redirectpagesub' => 'Viruleedungssäit',
-'lastmodifiedat' => "Dës Säit gouf den $1 ëm $2 Auer fir d'lescht geännert.",
+'lastmodifiedat' => "Dës Säit gouf de(n) $1 ëm $2 Auer fir d'lescht geännert.",
 'viewcount' => 'Dës Säit gouf bis elo {{PLURAL:$1|emol|$1-mol}} ofgefrot.',
 'protectedpage' => 'Gespaarte Säit',
 'jumpto' => 'Wiesselen op:',
@@ -497,7 +508,7 @@ Et kann awer och sinn datt et e Bug a(n) der Software op {{SITENAME}} gëtt.',
 'nosuchspecialpage' => 'Spezialsäit gëtt et net',
 'nospecialpagetext' => '<strong>Dir hutt eng Spezialsäit ofgefrot déi et net gëtt.</strong>
 
-All Spezialsäiten déi et gëtt, sinn op der [[Special:SpecialPages|Lëscht vun de Spezialsäiten]] ze fannen.',
+All Spezialsäiten déi et gëtt, sinn op der [[Special:SpecialPages|{{int:specialpages}}]] ze fannen.',
 
 # General errors
 'error' => 'Feeler',
@@ -566,7 +577,7 @@ Ufro: $2',
 Fir Iwwersetzungen fir all Wikien bäizesetzen oder z'änneren gitt w.e.g. op [//translatewiki.net/ translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
 'editinginterface' => "'''Opgepasst:''' Dir sidd am Gaang, eng Säit z'änneren, déi do ass, fir Interface-Text fir d'Software ze liwweren. 
 Ännerungen op dëser Säit änneren den Interface-Text, jee no Kontext, op allen oder verschiddene Säiten, déi vun alle Benotzer op dëser Wiki gesi ginn. 
-Fir d'Iwwersetzungen fir all Wikien derbäizesetzen oder z'änneren gitt w.e.g. op [//translatewiki.net translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
+Fir d'Iwwersetzunge fir all Wikien derbäizesetzen oder z'änneren gitt w.e.g. op [//translatewiki.net translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
 'sqlhidden' => '(SQL-Offro verstoppt)',
 'cascadeprotected' => 'Dës Säit gouf fir Ännerunge gespaart, well se duerch Cascadeprotectioun vun {{PLURAL:$1|dëser Säit|dëse Säite}} gespaart ass mat der Cascadenoptioun:
 $2',
@@ -598,9 +609,18 @@ Opgepasst: Op verschiddene Säite kann et nach esou aus gesinn, wéi wann Dir na
 'welcomecreation-msg' => "Äre Benotzerkont gouf ugeluecht.
 Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'änneren",
 'yourname' => 'Benotzernumm:',
+'userlogin-yourname' => 'Benotzernumm',
+'userlogin-yourname-ph' => 'Gitt Äre Benotzernumm an',
 'yourpassword' => 'Passwuert:',
+'userlogin-yourpassword' => 'Passwuert',
+'userlogin-yourpassword-ph' => 'Gitt Ärt Passwuert an',
+'createacct-yourpassword-ph' => 'Gitt e Passwuert an',
 'yourpasswordagain' => 'Passwuert nach eemol antippen:',
+'createacct-yourpasswordagain' => 'Passwuert confirméieren',
+'createacct-yourpasswordagain-ph' => 'Passwuert nach eng Kéier aginn',
 'remembermypassword' => 'Meng Umeldung op dësem Computer (fir maximal $1 {{PLURAL:$1|Dag|Deeg}}) verhalen',
+'userlogin-remembermypassword' => 'Mech ageloggt halen',
+'userlogin-signwithsecure' => 'Eng sécher Verbindung benotzen',
 'securelogin-stick-https' => 'Nom Umelle mat HTTPS verbonn bleiwen',
 'yourdomainname' => 'Ären Domain',
 'password-change-forbidden' => 'Dir däerft op dëser Wiki Passwierder net änneren.',
@@ -613,18 +633,38 @@ Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'ännere
 'logout' => 'Ofmellen',
 'userlogout' => 'Ausloggen',
 'notloggedin' => 'Net ageloggt',
+'userlogin-noaccount' => 'Hutt Dir kee Benotzerkont?',
+'userlogin-joinproject' => 'Maacht mat bäi {{SITENAME}}',
 'nologin' => "Hutt Dir kee Benotzerkont? '''$1'''.",
 'nologinlink' => 'Neie Benotzerkont maachen',
 'createaccount' => 'Neie Kont opmaachen',
 'gotaccount' => "Dir hutt schonn e Benotzerkont? '''$1'''.",
 'gotaccountlink' => 'Umellen',
 'userlogin-resetlink' => "Hutt Dir d'Detailer vun Ärem Login vergiess?",
+'userlogin-resetpassword-link' => 'Setzt Ärt Passwuert zréck',
+'helplogin-url' => 'Help:Aloggen',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hëllef beim aloggen]]',
+'createacct-join' => 'Gitt Är Informatioune hei drënner an.',
+'createacct-emailrequired' => 'E-Mailadress',
+'createacct-emailoptional' => 'E-Mailadress (fakultativ)',
+'createacct-email-ph' => 'Gitt Är E-Mailadress an',
 'createaccountmail' => 'En temporäert Passwuert benotzen an et per E-Mail un déi E-Mailadress schécken déi hei drënner steet',
+'createacct-realname' => 'Richtegen Numm (fakultativ)',
 '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-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 iwwerdeneen.',
 'userexists' => 'De Benotzernumm deen agi gouf gëtt scho benotzt.
 Sicht Iech een anere Benotzernumm.',
 'loginerror' => 'Feeler beim Aloggen',
+'createacct-error' => 'Feeler beim Uleeë vum Benotzerkont',
 'createaccounterror' => 'Benotzerkont konnt net opgemaach ginn: $1',
 'nocookiesnew' => "De Benotzerkont gouf ugeluecht, awer Dir sidd net ageloggt.
 {{SITENAME}} brauch fir dës Funktioun Cookien.
@@ -663,8 +703,8 @@ Mellt Iech w.e.g. domat un, soubal Dir et kritt hutt.',
 'blocked-mailpassword' => "Déi vun Iech benotzten IP-Adress ass fir d'Ännere vu Säite gespaart. Fir Mëssbrauch ze verhënneren, gouf d'Méiglechkeet fir een neit Passwuert unzefroen och gespaart.",
 'eauthentsent' => "Eng Confirmatiouns-E-Mail gouf un déi Adress geschéckt déi Dir uginn hutt.<br />
 Ier iergendeng E-Mail vun anere Benotzer op dee Kont geschéckt ka ginn, musst Dir als éischt d'Instructiounen an der Confirmatiouns-E-Mail befollegen, fir ze bestätegen datt de Kont wierklech Ären eegenen ass.",
-'throttled-mailpassword' => "An {{PLURAL:$1|der leschter Stonn|de leschte(n) $1 Stonnen}} gouf eng Erënenrung un d'Passwuert verschéckt.
-Fir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} esou eng Erënnerung verschéckt ginn.",
+'throttled-mailpassword' => "An {{PLURAL:$1|der leschter Stonn|de leschte(n) $1 Stonnen}} eng E-Mail verschéckt fir d'Passwuert zréckzesetzen.
+Fir de Mëssbrauch vun dëser Funktioun ze verhënneren kann nëmmen all {{PLURAL:$1|Stonn|$1 Stonnen}} esou eng Mail verschéckt ginn.",
 'mailerror' => 'Feeler beim Schécke vun der E-Mail: $1',
 'acct_creation_throttle_hit' => 'Visiteure vun dëser Wiki déi Är IP-Adress hu {{PLURAL:$1|schonn $1 Benotzerkont|scho(nn) $1 Benotzerkonten}} an de leschten Deeg opgemaach, dëst ass déi maximal Zuel déi an dësem Zäitraum erlaabt ass.
 Dofir kënne Visiteure déi dës IP-Adress benotzen den Ament keng Benotzerkonten opmaachen.',
@@ -715,30 +755,40 @@ Loggt Iech elo an ...',
 'resetpass-wrong-oldpass' => 'Net valabelt temporäert oder aktuellt Passwuert.
 Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwuert ugefrot.',
 'resetpass-temp-password' => 'Temporäert Passwuert:',
+'resetpass-abort-generic' => "D'Ännere vum Passwuert gouf duerch eng Erweiderung ofgebrach.",
 
 # Special:PasswordReset
 'passwordreset' => 'Passwuert zrécksetzen',
-'passwordreset-text' => 'Fëllt dëse Formulaire aus fir eng E-Mail Erënnerung vun den Detailer vun Ärem Benotzerkont ze kréien.',
+'passwordreset-text-one' => 'Fëllt dëse Formulaire aus fir Äert Passwuert zréckzesetzen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Gitt eng vun dësen Donnéeën a fir Ärt Passwuert zréckzesetzen.}}',
 'passwordreset-legend' => 'Passwuert zrécksetzen',
 'passwordreset-disabled' => "D'Zerécksetze vum Passwuert ass op dëser Wiki ausgeschalt.",
-'passwordreset-pretext' => '{{PLURAL:$1||Gitt eng vun dësen Donnéeën an}}',
+'passwordreset-emaildisabled' => "D'E-Mail-Fonctioune goufen op dëser Wiki ausgeschalt.",
 'passwordreset-username' => 'Benotzernumm:',
 'passwordreset-domain' => 'Domaine:',
 'passwordreset-capture' => "D'Mail kucken?",
 'passwordreset-capture-help' => 'Wann Dir dës Këscht ukräizt, gëtt de Mail (mam temporäre Passwuert) Iech gewisen an dem Benotzer geschéckt.',
 'passwordreset-email' => 'E-Mailadress:',
 'passwordreset-emailtitle' => 'Detailer vum Benotzerkont op{{SITENAME}}',
-'passwordreset-emailtext-ip' => "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet eng Erënnerung fir Är Benotzerkonteninformatiounen op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:
+'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:
 
 $2
 
+{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.
+Dir 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}} 
+
+$2
+
+{{PLURAL:$3|ass|si}} mat dëser E-Mail-Adress verbonn.
+
 {{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.
 Dir 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
 Temporärt Passwuert: $2',
-'passwordreset-emailsent' => 'Eng Erënnerungs-Mail gouf geschéckt.',
-'passwordreset-emailsent-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt.",
-'passwordreset-emailerror-capture' => "D'Erënnerungsmail gouf esou geschéckt wéi Dir se hei drënner gesitt, awer de Benotzer konnt se net kréien: $1",
+'passwordreset-emailsent' => "Eng Mail fir d'Passwuert zréckzesetze gouf 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",
 
 # Special:ChangeEmail
 'changeemail' => 'Mailadress änneren',
@@ -842,7 +892,7 @@ D'Passwuert fir dësen neie Benotzerkont kann op der ''[[Special:ChangePassword|
 'newarticletext' => "Dir hutt op e Link vun enger Säit geklickt, déi et nach net gëtt. Fir déi Säit unzeleeën, gitt w.e.g. Ären Text an déi Këscht hei drënner an (kuckt d'[[{{MediaWiki:Helppage}}|Hëllef Säit]] fir méi Informatiounen). Wann Dir duerch een Iertum heihi komm sidd, da klickt einfach op de Knäppchen '''Zréck''' vun Ärem Browser.",
 'anontalkpagetext' => "---- ''Dëst ass d'Diskussiounssäit fir en anonyme Benotzer deen nach kee Kont opgemaach huet oder en net benotzt. Dowéinst musse mir d'IP Adress benotzen, fir de Benotzer z'identifizéieren.
 Sou eng IP Adress ka vun e puer Benotzer gedeelt ginn.
-Wann Dir en anonyme Benotzer sidd an Dir irrelevant Kommentäre krut, [[Special:UserLogin/signup|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat aneren anonyme Benotzer ze verhënneren.''",
+Wann Dir en anonyme Benotzer sidd an Dir irrelevant Bemierkunge krut, [[Special:UserLogin/signup|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat aneren anonyme Benotzer ze verhënneren.''",
 'noarticletext' => 'Dës Säit huet momentan keen Text.
 Dir kënnt op anere Säiten no [[Special:Search/{{PAGENAME}}|dësem Säitentitel sichen]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an den entspriechende Logbicher nokucken] oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} esou eng Säit uleeën]</span>.',
@@ -949,10 +999,14 @@ Hei ass den Extrait aus dem Logbuch vum Réckelen a Läsche fir déi Säit.',
 Si gouf anscheinend geläscht.",
 'edit-conflict' => 'Ännerungskonflikt.',
 'edit-no-change' => 'Är ännerung gouf ignoréiert, well Dir näischt um Text geännert hutt.',
+'postedit-confirmation' => 'Är Ännerung gouf gespäichert.',
 'edit-already-exists' => 'Déi nei Säit konnt net ugeluecht ginn, well et se scho gëtt.',
 'defaultmessagetext' => 'Standardtext',
+'content-failed-to-parse' => 'Den $2-Inhalt fir den $1-Modell konnt net geparst ginn: $1',
 'invalid-content-data' => 'Donnéeë vum Inhalt sinn net valabel',
 'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
+'editwarning-warning' => 'Wann Dir dës Säit verloosst kann dat dozou féieren datt Dir all Ännerungen, déi Dir gemaach hutt, verléiert.
+Wann Dir ageloggt sidd, kënnt Dir dës Warnung an der Sektioun "Änneren" vun Ären Astellungen ausschalten.',
 
 # Content models
 'content-model-wikitext' => 'Wikitext',
@@ -1092,10 +1146,10 @@ $1",
 'logdelete-failure' => "'''D'Sichtbarkeet vum Logbuch konnt net agestllt ginn:'''
 $1",
 'revdel-restore' => 'Sichtbarkeet änneren',
-'revdel-restore-deleted' => 'geläschte Versiounen',
+'revdel-restore-deleted' => 'geläscht Versiounen',
 'revdel-restore-visible' => 'sichtbar Versiounen',
 'pagehist' => 'Versioune vun dëser Säit',
-'deletedhist' => 'Geläschte Versiounen',
+'deletedhist' => 'Geläscht Versiounen',
 'revdelete-hide-current' => 'Feeler beim Verstoppe vum Objet vum $2 ëm $1: et ass déi aktuell Versioun.
 Si kann net verstoppt ginn.',
 'revdelete-show-no-access' => 'Feeler beim Weise vum Objet vum $1 ëm $2 Auer: dësen Objet gouf als "limitéiert2 markéiert.
@@ -1106,7 +1160,7 @@ Dir hutt keen Zougang dozou.',
 'revdelete-no-change' => "'''Opgepasst:''' D'Element vum $2 ëm $1 Auer huet schonn déi ugefrote Sichtbarkeetsastellung.",
 'revdelete-concurrent-change' => "Feeler beim Ännere vum Element vum $1 ëm $2 Auer: säit Statut schéngt geännert ginn ze si während Dir vericht hutt et z'änneren.
 Kuckt w.e.g. an de Logbicher no.",
-'revdelete-only-restricted' => 'Feler beim verstoppe vum Objet vum $2, $1: Dir kënnt keng Objete virun den Administrateure verstoppen ouni och eng vun den aneren Optiounen vum weisen erauszesichen.',
+'revdelete-only-restricted' => 'Feeler beim verstoppe vum Element vum $2, $1: Dir kënnt keng Elementer virun den Administrateure verstoppen ouni och eng vun den aneren Optiounen vum weisen erauszesichen.',
 'revdelete-reason-dropdown' => "* Generell Läschgrënn
 ** Verletzung vun den Droits d'Auteur
 ** Net ubruechte perséinlech Informatioun
@@ -1162,7 +1216,7 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 'difference-multipage' => '(Ënnerscheed tëschent Säiten)',
 'lineno' => 'Linn $1:',
 'compareselectedversions' => 'Ausgewielte Versioune vergläichen',
-'showhideselectedversions' => 'Erausgesichte Versioune weisen/verstoppen',
+'showhideselectedversions' => 'Erausgesicht Versioune weisen/verstoppen',
 'editundo' => 'zréck',
 'diff-multi' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vun {{PLURAL:$2|engem|$2}} Benotzer {{PLURAL:$1|gëtt|ginn}} net gewisen)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Eng Tëscheversioun|$1 Tëscheversioune}} vu méi wéi $2 {{PLURAL:$2|Benotzer|Benotzer}} ginn net gewisen)',
@@ -1232,15 +1286,7 @@ Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'powersearch-togglenone' => 'Keen',
 'search-external' => 'Extern sichen',
 'searchdisabled' => "D'Sichfunktioun op {{SITENAME}} ass ausgeschalt. Dir kënnt iwwerdeems mat Hëllef vu Google sichen. Bedenkt awer, datt deenen hire  Sichindex fir {{SITENAME}} eventuell net dem aktuellste Stand entsprecht.",
-
-# Quickbar
-'qbsettings' => 'Geschirläischt',
-'qbsettings-none' => 'Keen',
-'qbsettings-fixedleft' => 'Lénks, fest',
-'qbsettings-fixedright' => 'Riets, fest',
-'qbsettings-floatingleft' => 'schwiewt lenks',
-'qbsettings-floatingright' => 'Schwiewt riets',
-'qbsettings-directionality' => 'Fix, ofhängeg vun der Schreiwrichtung vun Ärer Sprooch',
+'search-error' => 'Beim Sichen ass e Feeler geschitt: $1',
 
 # Preferences page
 'preferences' => 'Astellungen',
@@ -1383,6 +1429,7 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'userrights-notallowed' => "Äre Benotzerkont hutt net déi néideg Rechter fir d'Rechter vun anere Benotzer z'änneren.",
 'userrights-changeable-col' => 'Gruppen déi Dir ännere kënnt',
 'userrights-unchangeable-col' => 'Gruppen déi Dir net ännere kënnt',
+'userrights-conflict' => 'Konflikt bäi de Benotzerrechter! Maacht Är Ännerunge w.e.g. nach eng Kéier.',
 
 # Groups
 'group' => 'Grupp:',
@@ -1433,10 +1480,11 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'right-writeapi' => "API benotze fir d'Wiki z'änneren",
 'right-delete' => 'Säite läschen',
 'right-bigdelete' => 'Säite mat engem groussen Historique läschen',
+'right-deletelogentry' => 'Eenzel Androungen an de Logbicher läschen a restauréieren',
 'right-deleterevision' => 'Spezifesch Versioune vu Säite läschen a restauréieren',
-'right-deletedhistory' => 'Weis geläschte Versiounen am Historique, ouni den assoziéierten Text',
+'right-deletedhistory' => 'Weis geläscht Versiounen am Historique, ouni den associéierten Text',
 'right-deletedtext' => "Geläschten Text an d'Ännerungen tëschent de geläschte Versioune weisen",
-'right-browsearchive' => 'Geläschte Säite sichen',
+'right-browsearchive' => 'Geläscht Säite sichen',
 'right-undelete' => 'Eng Säit restauréieren',
 'right-suppressrevision' => 'Virun den Administrateure verstoppte Versiounen nokucken a restauréieren',
 'right-suppressionlog' => 'Privat Lëschte kucken',
@@ -1495,7 +1543,7 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'action-writeapi' => "d'API mat Schreifzougrëff ze benotzen",
 'action-delete' => 'dës Säit ze läschen',
 'action-deleterevision' => 'dës Versioun ze läschen',
-'action-deletedhistory' => "d'Lëscht vun de geläschte Versiounen ze gesinn",
+'action-deletedhistory' => "d'Lëscht vun de geläschte Versiounen gesinn",
 'action-browsearchive' => 'no geläschte Säiten ze sichen',
 'action-undelete' => 'dës Säit ze restauréieren',
 'action-suppressrevision' => 'déi verstoppt Versioun kucken a restauréieren',
@@ -1772,7 +1820,6 @@ Fir eng oprimal Sécherheet ass img_auth.php ausgeschalt.",
 'http-read-error' => 'HTTP-Feeler beim Liesen.',
 'http-timed-out' => 'HTTP-Ufro huet ze laang gebraucht (time out).',
 'http-curl-error' => 'Feeler beim Ofruff vun der URL: $1',
-'http-host-unreachable' => "D'URL konnt net erreecht ginn.",
 'http-bad-status' => 'Et gouf e Problem bäi der HTTP-Ufro: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1932,6 +1979,7 @@ Eng Säite gëtt als Homonymie-Säit behandelt, wa si eng Schabloun benotzt déi
 
 'pageswithprop' => 'Säite mat enger Säiten-Eegeschaft',
 'pageswithprop-legend' => 'Säite mat enger Säiten-Eegeschaft',
+'pageswithprop-text' => 'Op dëser Säit sti Säiten déi eng speziell Säiteneegeschaft benotzen.',
 'pageswithprop-prop' => 'Numm vun der Eegeschaft:',
 'pageswithprop-submit' => 'Lass',
 
@@ -1976,12 +2024,12 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'unusedimages' => 'Onbenotzte Biller',
 'popularpages' => 'Populär Säiten',
 'wantedcategories' => 'Gewënscht Kategorien',
-'wantedpages' => 'Gewënschte Säiten',
+'wantedpages' => 'Gewënscht Säiten',
 'wantedpages-badtitle' => 'Net valabelen Titel am Resultat: $1',
-'wantedfiles' => 'Gewënschte Fichieren',
+'wantedfiles' => 'Gewënscht Fichieren',
 'wantedfiletext-cat' => 'Dës Fichiere gi benotzt awer et gëtt se net. Fichiere aus frieme Repositorie kënnen hei gewise ginn och wann et se gëtt. All esou falsch Positiver ginn <del>duerchgestrach</del>. Zousätzlech gi Säiten an deene Fichieren dra sinn déi et net gëtt op [[:$1]] gewisen.',
 'wantedfiletext-nocat' => 'Dës Fichiere gi benotzt existéieren awer net. Fichieren aus frieme Repertoiren kënnen trotzdeem opgelëscht ginn. All dës positiv Fichiere ginn <del>duergestrach</del>.',
-'wantedtemplates' => 'Gewënschte Schablounen',
+'wantedtemplates' => 'Gewënscht Schablounen',
 'mostlinked' => 'Dacks verlinkte Säiten',
 'mostlinkedcategories' => 'Dacks benotzte Kategorien',
 'mostlinkedtemplates' => 'Dacks benotzte Schablounen',
@@ -2010,7 +2058,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'usercreated' => "{{GENDER:$3|De(n)|D'}} $1 ëm $2 Auer ugeluecht",
 'newpages' => 'Nei Säiten',
 'newpages-username' => 'Benotzernumm:',
-'ancientpages' => 'Eelste Säiten',
+'ancientpages' => 'Eelst Säiten',
 'move' => 'Réckelen',
 'movethispage' => 'Dës Säit réckelen',
 'unusedimagestext' => 'Dës Fichieren gëtt et, si sinn awer a kenger Säit agebonn.
@@ -2076,8 +2124,8 @@ Kuckt och [[Special:WantedCategories|Gewënscht Kategorien]].',
 'special-categories-sort-abc' => 'alphabetesch zortéieren',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'Geläschte Kontributiounen',
-'deletedcontributions-title' => 'Geläschte Kontributiounen',
+'deletedcontributions' => 'Geläscht Kontributiounen',
+'deletedcontributions-title' => 'Geläscht Kontributiounen',
 'sp-deletedcontributions-contribs' => 'Kontributiounen',
 
 # Special:LinkSearch
@@ -2183,8 +2231,8 @@ All weider Ännerungen op dëser Säit an der assoziéierter Diskussiounssäit g
 'notvisiblerev' => 'Versioun gouf geläscht',
 'watchnochange' => 'Keng vun Ären iwwerwaachte Säite gouf während der ugewisener Zäit verännert.',
 'watchlist-details' => "{{PLURAL:$1|1 Säit|$1 Säiten}} sinn op ärer Iwwerwaachungsklëscht (d'Diskussiounssäite net matgezielt).",
-'wlheader-enotif' => '* E-Mail-Bescheed ass aktivéiert.',
-'wlheader-showupdated' => "Säiten déi zënter ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
+'wlheader-enotif' => 'E-Mail-Notifikatioun ass ageschalt.',
+'wlheader-showupdated' => "Säiten déi zënter ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
 'watchmethod-recent' => 'Rezent Ännerunge ginn op iwwerwaacht Säiten iwwerpréift',
 'watchmethod-list' => 'Iwwerwaachte Säite ginn op rezent Ännerungen iwwerpréift',
 'watchlistcontains' => 'Op ärer Iwwerwaachungslëscht $1 {{PLURAL:$1|steet $1 Säit|stinn $1 Säiten}}.',
@@ -2207,6 +2255,10 @@ All weider Ännerungen op dëser Säit an der assoziéierter Diskussiounssäit g
 'enotif_subject_restored' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} restauréiert",
 'enotif_subject_changed' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} geännert",
 'enotif_body_intro_deleted' => 'D\'{{SITENAME}}-Säit $1 gouf de(n) $PAGEEDITDATE {{gender:$2|vum $2|vun der $2}} geläscht, kuckt $3.',
+'enotif_body_intro_created' => 'D\'{{SITENAME}}-Säit $1 gouf den $PAGEEDITDATE vum $2 {{GENDER:$2|ugeluecht}}, kuckt $3 fir déi aktuell Versioun.',
+'enotif_body_intro_moved' => 'D\'{{SITENAME}}-Säit $1 gouf den $PAGEEDITDATE vum $2 {{GENDER:$2|geréckelt}}, kuckt $3 fir déi aktuell Versioun.',
+'enotif_body_intro_restored' => 'D\'{{SITENAME}}-Säit $1 gouf den $PAGEEDITDATE vum $2 {{GENDER:$2|restauréiert}}, kuckt $3 fir déi aktuell Versioun.',
+'enotif_body_intro_changed' => 'D\'{{SITENAME}}-Säit $1 gouf den $PAGEEDITDATE vum $2  {{GENDER:$2|geännert}}, kuckt $3 fir déi aktuell Versioun',
 'enotif_lastvisited' => 'All Ännerungen op ee Bléck: $1',
 'enotif_lastdiff' => 'Kuckt $1 fir dës Ännerung.',
 'enotif_anon_editor' => 'Anonyme Benotzer $1',
@@ -2314,6 +2366,7 @@ Kuckt d'[[Special:ProtectedPages|Lëscht vun de gespaarte Säite]] fir eng Lësc
 'prot_1movedto2' => '[[$1]] gouf op [[$2]] geréckelt',
 'protect-badnamespace-title' => 'Nummraum deen net gespaart ka ginn',
 'protect-badnamespace-text' => 'Säiten an dësem Nummraum kënnen net gespaart ginn.',
+'protect-norestrictiontypes-text' => 'Dës Säit kann net gespaart gi well keng Restriktiounstypen disponibel sinn.',
 'protect-norestrictiontypes-title' => 'Säit kann net gespaart ginn',
 'protect-legend' => "Confirméiert d'Protectioun",
 'protectcomment' => 'Grond:',
@@ -2369,10 +2422,10 @@ Hei sinn déi aktuell Astellunge fir d'Säit '''$1''':",
 'restriction-level-all' => 'alleguerten',
 
 # Undelete
-'undelete' => 'Geläschte Säite restauréieren',
-'undeletepage' => 'Geläschte Säite kucken a restauréieren',
-'undeletepagetitle' => "'''Op dëser Lëscht sti geläschte Versioune vun [[:$1]]'''.",
-'viewdeletedpage' => 'Geläschte Säite weisen',
+'undelete' => 'Geläscht Säite restauréieren',
+'undeletepage' => 'Geläscht Säite kucken a restauréieren',
+'undeletepagetitle' => "'''Op dëser Lëscht sti geläscht Versioune vun [[:$1]]'''.",
+'viewdeletedpage' => 'Geläscht Säite weisen',
 '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}}'''''.
@@ -2400,8 +2453,8 @@ $1",
 'undeletedpage' => "'''$1''' gouf restauréiert.
 
 Am [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréiert Säiten.",
-'undelete-header' => 'Kuckt [[Special:Log/delete|Läschlescht]] fir rezent geläschte Säiten.',
-'undelete-search-title' => 'Geläschte Säite sichen',
+'undelete-header' => 'Kuckt [[Special:Log/delete|Läschlescht]] fir rezent geläscht Säiten.',
+'undelete-search-title' => 'Geläscht Säite sichen',
 'undelete-search-box' => 'Sichen no geläschte Säiten',
 'undelete-search-prefix' => 'Weis Säiten déi esou ufänken:',
 'undelete-search-submit' => 'Sichen',
@@ -2440,7 +2493,7 @@ $1',
 'sp-contributions-newbies-sub' => 'Fir déi Nei',
 'sp-contributions-newbies-title' => 'Kontributioune vun neie Benotzer',
 'sp-contributions-blocklog' => 'Spärlescht',
-'sp-contributions-deleted' => 'geläschte Benotzer-Kontributiounen',
+'sp-contributions-deleted' => 'geläscht Kontributiounen',
 'sp-contributions-uploads' => 'Eropgeluede Fichieren',
 'sp-contributions-logs' => 'Logbicher',
 'sp-contributions-talk' => 'diskutéieren',
@@ -2592,6 +2645,7 @@ Si ass awer als Deel vun der Rei $2 gespaart, an dës Spär kann opgehuewe ginn.
 'proxyblocksuccess' => 'Gemaach.',
 'sorbsreason' => 'Är IP Adress steet als oppene Proxy an der schwaarzer Lëscht (DNSBL) déi vu {{SITENAME}} benotzt gëtt.',
 'sorbs_create_account_reason' => 'Är IP-Adress steet als oppene Proxy an der schwaarzer Lëscht déi op {{SITENAME}} benotzt gëtt. DIr kënnt keen neie Benotzerkont opmaachen.',
+'xffblockreason' => 'Eng IP-Adress am X-Forwarded-For-Header gouf gespaart, entweder Är oder déi vum Proxyserver deen Dir benotzt. De Grond vun der Spär war: $1',
 'cant-block-while-blocked' => 'Dir däerft keng aner Benotzer spären, esou lang wéi dir selwer gespaart sidd.',
 'cant-see-hidden-user' => "De Benotzer deen Dir versicht ze spären ass scho gespaart a verstoppt. Well Dir d'Recht ''Hideuser'' net hutt kënnt Dir dëse Benotzer net gesinn an dem Benotzer seng Spär net änneren.",
 'ipbblocked' => 'Dir kënnt keng aner Benotzer spären oder hir Spär ophiewen well Dir selwer gespaart sidd',
@@ -2754,6 +2808,8 @@ Besicht w.e.g. [//www.mediawiki.org/wiki/Localisation MediaWiki Localisatioun] a
 'thumbnail-more' => 'vergréisseren',
 'filemissing' => 'Fichier feelt',
 'thumbnail_error' => 'Feeler beim Erstelle vun der Miniatur: $1',
+'thumbnail_error_remote' => 'Feelermessage vum $1:
+$2',
 'djvu_page_error' => 'DjVu-Säit baussent dem Säiteberäich',
 'djvu_no_xml' => 'Den XML ka fir den DjVu-Fichier net ofgeruff ginn',
 'thumbnail-temp-create' => "Den temporäre Fichier fir d'Minitaurbild konnt net ugeluecht ginn",
@@ -2826,7 +2882,9 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 'javascripttest-pagetext-noframework' => 'Dës Säit ass fir Java-Script-Tester reservéiert.',
 'javascripttest-pagetext-unknownframework' => 'Onbekannten Test-Framework "$1".',
 'javascripttest-pagetext-frameworks' => 'Sicht w.e.g. eng vun dësen Test-Strukturen eraus: $1',
+'javascripttest-pagetext-skins' => "Sicht en Interface (skin) eraus fir d'Tester ze maachen:",
 'javascripttest-qunit-intro' => "Kuckt d'[$1 Dokumentatioun vun den Tester] op mediawiki.org",
+'javascripttest-qunit-heading' => 'JavaScript-QUnit Testserie op MediaWiki',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Är Benotzersäit',
@@ -2900,13 +2958,8 @@ Erlaabt et e Grond an de Resumé derbäizesetzen.',
 
 # Stylesheets
 'common.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Chick''  */",
-'standard.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Klassesch''  */",
-'nostalgia.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Nostalgie''  */",
 'cologneblue.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Köln Blo''  */",
 'monobook.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Monobook''  */",
-'myskin.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''MySkin''  */",
-'chick.css' => '/* Dës CSS huet nëmmen Afloss op de Skin "Chick" */',
-'simple.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Einfach''  */",
 'modern.css' => "/* Dës CSS huet nëmmen Afloss op de Skin ''Modern''  */",
 
 # Scripts
@@ -2984,13 +3037,8 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 'pageinfo-category-files' => 'Zuel vun de Fichieren',
 
 # Skin names
-'skinname-standard' => 'Klassesch',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Köln Blo',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Einfach',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3049,6 +3097,7 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'file-info-png-repeat' => 'gouf $1 {{PLURAL:$1|mol|mol}} gespillt',
 'file-info-png-frames' => '$1 {{PLURAL:$1|Frame|Framen}}',
 'file-no-thumb-animation' => "''''Informatioun: Wéinst technesche Limitatioune sinn d'Miniatur-Biller vun dësem Fichier net animéiert.'''",
+'file-no-thumb-animation-gif' => "'''Hiweis:Aus technesche Grënn gi Miniature mat enger héijer Opléisung vu GIF Biller, esou wéi dëst, net animéiert.'''",
 
 # Special:NewFiles
 'newimages' => 'Gallerie vun den neie Biller',
@@ -3067,11 +3116,25 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'minutes' => '{{PLURAL:$1|enger Minutt|$1 Minutten}}',
 'hours' => '{{PLURAL:$1|enger Stonn|$1 Stonnen}}',
 'days' => '{{PLURAL:$1|engem Dag|$1 Deeg}}',
+'weeks' => '{{PLURAL: $1|eng Woch|$1 Wochen}}',
 'months' => '{{PLURAL:$1|ee Mount|$1 Méint}}',
 'years' => '{{PLURAL:$1|ee Joer|$1 Joer}}',
 'ago' => 'viru(n) $1',
 'just-now' => 'grad elo',
 
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|virun 1 Stonn| viru(n) $1 Stonnen}}',
+'minutes-ago' => '{{PLURAL:$1|virun 1 Minutt| viru(n) $1 Minutten}}',
+'seconds-ago' => '{{PLURAL:$1|virun 1 Sekonn|viru(n) $1 Sekonnen}}',
+'monday-at' => 'Méindes ëm $1',
+'tuesday-at' => 'Dënschdes ëm $1',
+'wednesday-at' => 'Mëttwochs ëm $1',
+'thursday-at' => 'Donneschdes ëm $1',
+'friday-at' => 'Freides ëm $1',
+'saturday-at' => 'Samschdes ëm $1',
+'sunday-at' => 'Sonndes ëm $1',
+'yesterday-at' => 'Gëschter ëm $1',
+
 # Bad image list
 'bad_image_list' => 'Format:
 
@@ -3099,7 +3162,7 @@ Déi aner sinn am Standard verstoppt.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breet',
 'exif-imagelength' => 'Längt',
 'exif-bitspersample' => 'Bite pro Faarfkomponent',
@@ -3258,6 +3321,7 @@ Déi aner sinn am Standard verstoppt.
 'exif-copyrightowner' => "Titulaire vun den Droits d'auteur",
 'exif-usageterms' => 'Benotzungsbedingungen',
 'exif-webstatement' => 'Omline Copyright Deklaratioun',
+'exif-originaldocumentid' => 'Identifikatiounsnummer vum Original-Dokument',
 'exif-licenseurl' => 'URL vum Copyright (Lizenz)',
 'exif-morepermissionsurl' => 'Alternativ Lizenzinformatiounen',
 'exif-attributionurl' => 'Wann dëst Wierk weiderbenotzt gëtt, da linkt w.e.g. op',
@@ -3268,12 +3332,13 @@ Déi aner sinn am Standard verstoppt.
 'exif-giffilecomment' => 'Bemierkung zum GIF-Fichier',
 'exif-intellectualgenre' => 'Typ vum Element',
 'exif-subjectnewscode' => 'Code vum Sujet',
+'exif-event' => 'Duergestallten Evenement',
 'exif-organisationinimage' => 'Organisatioun um Bild',
 'exif-personinimage' => 'Persoun um Bild',
 'exif-originalimageheight' => 'Héicht vum Bild virum Ofschneiden',
 'exif-originalimagewidth' => 'Breet vum Bild virum Ofschneiden',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Onkompriméiert',
 
 'exif-copyrighted-true' => 'Duerch Copyright geschützt',
@@ -3582,7 +3647,7 @@ Dëse Confirmatiouns-Code leeft den $4 of.',
 'table_pager_first' => 'Éischt Säit',
 'table_pager_last' => 'Lescht Säit',
 'table_pager_limit' => '$1 Objete pro Säit weisen',
-'table_pager_limit_label' => 'Objete pro Säit:',
+'table_pager_limit_label' => 'Elementer pro Säit:',
 'table_pager_limit_submit' => 'Lass',
 'table_pager_empty' => 'Keng Resultater',
 
@@ -3669,12 +3734,17 @@ Dir misst eng [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun der GNU General Public
 'version-entrypoints-header-entrypoint' => 'Agangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Pad bei de Fichier',
-'filepath-page' => 'Fichier:',
-'filepath-submit' => 'Lass',
-'filepath-summary' => 'Op dëser Spezialsäit kënnt Dir de komplette Pad vun der aktueller Versioun vun engem Fichier direkt offroen.
-Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikatioun gestart.',
+# Special:Redirect
+'redirect' => 'Viruleedung duerch e Fichier, Benotzer oder Versiouns-ID',
+'redirect-legend' => 'Viruleedung op ee Fichier oder eng Säit',
+'redirect-summary' => 'Dës Spezialsäit ass eng Viruleedung op e Fichier (Fichiersnumm uginn), eng Säit (Versiounsnummer uginn) oder eng Benotzersäit (numeresch Benotzeridentifikatioun uginn).',
+'redirect-submit' => 'Lass',
+'redirect-lookup' => 'Nosichen:',
+'redirect-value' => 'Wäert:',
+'redirect-user' => 'Benotzernummer',
+'redirect-revision' => 'Versioun vun der Säit',
+'redirect-file' => 'Numm vum Fichier',
+'redirect-not-exists' => 'Wäert net fonnt',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'No duebele Fichiere sichen',
@@ -3765,20 +3835,26 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'htmlform-submit' => 'Späicheren',
 'htmlform-reset' => 'Ännerungen zrécksetzen',
 'htmlform-selectorother-other' => 'Anerer',
+'htmlform-no' => 'Neen',
+'htmlform-yes' => 'Jo',
+'htmlform-chosen-placeholder' => 'Sicht eng Optioun eraus',
 
 # SQLite database support
 'sqlite-has-fts' => "$1 ënnerstëtzt d'Volltextsich",
 'sqlite-no-fts' => "$1 ënnerstëtzt d'Volltextsich net",
 
 # New logging system
-'logentry-delete-delete' => "$1 huet d'Säit $3 geläscht",
-'logentry-delete-restore' => "$1 huet d'Säit $3 restauréiert",
-'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 geännert",
-'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 geännert",
-'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 geännert",
-'logentry-suppress-delete' => "$1 huet d'Säit $3 ewechgeholl",
-'logentry-suppress-event-legacy' => "$1 huet diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
-'logentry-suppress-revision-legacy' => "$1 huet diskret d'Visibilitéit vu Versioune vun der Säit $3 geännert",
+'logentry-delete-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
+'logentry-delete-restore' => "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
+'logentry-delete-event' => "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 {{GENDER:$2|geännert}}",
+'logentry-delete-revision' => "$1 huet d'Visibilitéit {{PLURAL:$5|vun enger Versioun|vu(n) $5 Versiounen}} op der Säit $3:$4 {{GENDER:$2|geännert}}",
+'logentry-delete-event-legacy' => "$1 huet d'Visibilitéit vun Elementer am Log op $3 {{GENDER:$2|geännert}}",
+'logentry-delete-revision-legacy' => "$1 huet d'Visibilitéit vu Versioune vun der Säit $3 {{GENDER:$2|geännert}}",
+'logentry-suppress-delete' => "$1 {{GENDER:$2|huet}} d'Säit $3 ewechgeholl",
+'logentry-suppress-event' => "$1 huet diskret d'Visibilitéit vu(n) {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 {{GENDER:$2|geännert}}",
+'logentry-suppress-revision' => "$1 huet diskret d'Visibilitéit {{PLURAL:$5|vun enger Versioun|vu(n) $5 Versiounen}} op der Säit $3:$4 {{GENDER:$2|geännert}}",
+'logentry-suppress-event-legacy' => "$1 {{GENDER:$2|huet}} diskret d'Visibilitéit vun Elementer am Log op $3 geännert",
+'logentry-suppress-revision-legacy' => "$1 huet diskret d'Visibilitéit vu Versioune vun der Säit $3 {{GENDER:$2|geännert}}",
 'revdelete-content-hid' => 'Inhalt verstoppt',
 'revdelete-summary-hid' => 'Resumé vun der Ännerung verstoppt',
 'revdelete-uname-hid' => 'Benotzernumm verstoppt',
@@ -3787,18 +3863,20 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'revdelete-uname-unhid' => 'Benotzernumm net verstoppt',
 'revdelete-restricted' => 'Limitatioune fir Administrateuren ageschalt',
 'revdelete-unrestricted' => 'Limitatioune fir Administrateuren opgehuewen',
-'logentry-move-move' => "$1 huet d'Säit $3 op $4 geréckelt",
-'logentry-move-move-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt ouni eng Viruleedung unzeleeën",
-'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen",
-'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
-'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt markéiert",
-'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt markéiert",
-'logentry-newusers-newusers' => 'De Benotzerkont $1 gouf ugeluecht',
-'logentry-newusers-create' => 'De Benotzerkont $1 gouf ugeluecht',
-'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 ugeluecht',
-'logentry-newusers-byemail' => "De Benotzerkont $3 gouf vum $1 ugeluecht an d'Passwuert gouf per E-Mail geschéckt.",
-'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch ugeluecht',
-'logentry-rights-autopromote' => "De Benotzer $1 huet d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
+'logentry-move-move' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}}",
+'logentry-move-move-noredirect' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} ouni eng Viruleedung unzeleeën",
+'logentry-move-move_redir' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an dobäi gouf eng Viruleedung iwwerschriwwen",
+'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
+'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt {{GENDER:$2|markéiert}}",
+'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt  {{GENDER:$2|markéiert}}",
+'logentry-newusers-newusers' => 'De Benotzerkont $1 gouf {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-create' => 'De Benotzerkont $1 gouf {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 {{GENDER:$2|ugeluecht}}',
+'logentry-newusers-byemail' => "De Benotzerkont $3 gouf vum $1 {{GENDER:$2|ugeluecht}} an d'Passwuert gouf per E-Mail geschéckt.",
+'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch {{GENDER:$2|ugeluecht}}',
+'logentry-rights-rights' => "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen de Benotzer $3 gehéiert vu(n) $4 op $5 geännert",
+'logentry-rights-rights-legacy' => "$1 {{GENDER:$2|huet}} d'Gruppen zou deenen de Benotzer $3 gehéiert geännert",
+'logentry-rights-autopromote' => "De Benotzer $1 {{GENDER:$2|krut}} d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
 'rightsnone' => '(keen)',
 
 # Feedback
@@ -3874,4 +3952,7 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
 'duration-centuries' => '$1 {{PLURAL:$1|Joerhonnert|Joerhonnerten}}',
 'duration-millennia' => '$1 {{PLURAL:$1|Millenaire|Millenairen}}',
 
+# Image rotation
+'rotate-comment' => 'Bild ëm $1 {{PLURAL:$1|Grad}} an der Richtung vun der Auer gedréint',
+
 );
index 42a8b46..85d36e0 100644 (file)
@@ -25,29 +25,29 @@ $fallback = 'ru';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'ЭлячIунрин кIаникай цIар чIугун',
+'tog-underline' => 'ЭлячӀунрин кӀаникай цӀар чӀугун',
 'tog-justify' => 'Ччинин гьяркьуьвилихъ текст дуьзрун',
-'tog-hideminor' => 'Мукьвара хьайи дегишвилера авай гъвечIи дуьзар хъувунар чуьнуьхун',
+'tog-hideminor' => 'Мукьвара хьайи дегишвилера авай гъвечӀи дуьзар хъувунар чуьнуьхун',
 'tog-hidepatrolled' => 'Мукьвара хьайи дегишвилера авай къаравулвал авунвай дуьзар хъувунар чуьнуьхун',
-'tog-newpageshidepatrolled' => 'ЦIийи ччинрин сиягьда къаравулвал авунвай ччинар чуьнуьхун',
+'tog-newpageshidepatrolled' => 'ЦӀийи ччинрин сиягьда къаравулвал авунвай ччинар чуьнуьхун',
 'tog-extendwatchlist' => 'ЧӀехи сиягь килигунин, кутазвай вири дегишунар, амма са эхирбур туш',
-'tog-usenewrc' => 'Мукьвара хьайи масакIавилерин ччина ва вилив хуьнин сиягьда  дуьзар хъувунар кIеретIриз ччара авун. (JavaScript герекзава)',
+'tog-usenewrc' => 'Мукьвара хьайи масакӀавилерин ччина ва вилив хуьнин сиягьда дуьзар хъувунар кӀеретӀриз ччара авун. (JavaScript герекзава)',
 'tog-numberheadings' => 'Кьилин цӀарариз автоматдаказ номерар эцигун',
 'tog-showtoolbar' => 'Дуьзар хъувунин алатрин кьвати къалура (JavaScript)',
-'tog-editondblclick' => 'Ччинар кьве тIампIуналди дуьзар хъувун (JavaScript герекзава)',
-'tog-editsection' => 'Пай [дуьзар хъувун] патал элячIун къалура',
-'tog-editsectiononrightclick' => 'Пайдин кьилинцIардиз эрчIи патан тIампI авуна пайдин дуьзар хъувуниз мумкинвал гун (JavaScript герекзава)',
+'tog-editondblclick' => 'Ччинар кьве тӀампӀуналди дуьзар хъувун (JavaScript герекзава)',
+'tog-editsection' => 'Пай [дуьзар хъувун] патал элячӀун къалура',
+'tog-editsectiononrightclick' => 'Пайдин кьилинцӀардиз эрчӀи патан тӀампӀ авуна пайдин дуьзар хъувуниз мумкинвал гун (JavaScript герекзава)',
 'tog-showtoc' => 'Къенеавайбурун сиягь къалурун (3-й гзаф кьилинцӀарар авай ччинар патал)',
-'tog-rememberpassword' => 'И браузерда зи логин рикlел хуьхь (лап гзаф $1 {{PLURAL:$1|югъ|йикъар}})',
-'tog-watchcreations' => 'За туькIуьрнавай ччинар зи гуьзетунин сиягьдиз алава авун',
+'tog-rememberpassword' => 'И браузерда зи логин рикӀел хуьхь (лап гзаф $1 {{PLURAL:$1|югъ|йикъар}})',
+'tog-watchcreations' => 'За туькӀуьрнавай ччинар зи гуьзетунин сиягьдиз алава авун',
 'tog-watchdefault' => 'За дуьзар хъувунвай ччинар зи гуьзетунин сиягьдиз алава авун',
-'tog-watchmoves' => 'За тIвар эхцигай ччинар зи гуьзетунин сиягьдиз алава авун',
+'tog-watchmoves' => 'За тӀвар эхцигай ччинар зи гуьзетунин сиягьдиз алава авун',
 'tog-watchdeletion' => 'За алуднавай ччинар зи гуьзетунин сиягьдиз алава авун',
-'tog-minordefault' => 'Авайвилелди, вири дуьзар хъувунар гъвечIи дуьзар хъувунар хьиз лишан авун',
-'tog-previewontop' => 'Сифтедин килигун дуьзар хъувундин дакIардин вилик эцига',
-'tog-previewonfirst' => 'Дуьзар хъувундиз эгечIайла сифтедин килигун къалурун',
-'tog-enotifwatchlistpages' => 'Зи гуьзетунин ччин масакIа хьайила заз эмейл ракъура.',
-'tog-enotifusertalkpages' => 'КЬилди жуван веревирдрин ччина хьанвай дегишвилерикай э-почтадиз чар ракъурун.',
+'tog-minordefault' => 'Авайвилелди, вири дуьзар хъувунар гъвечӀи дуьзар хъувунар хьиз лишан авун',
+'tog-previewontop' => 'Сифтедин килигун дуьзар хъувундин дакӀардин вилик эцига',
+'tog-previewonfirst' => 'Дуьзар хъувундиз эгечӀайла сифтедин килигун къалурун',
+'tog-enotifwatchlistpages' => 'Зи гуьзетунин ччин масакӀа хьайила заз эмейл ракъура.',
+'tog-enotifusertalkpages' => 'Кьилди жуван веревирдрин ччина хьанвай дегишвилерикай э-почтадиз чар ракъурун.',
 'tog-oldsig' => 'Алай къул:',
 'tog-showhiddencats' => 'Чуьнуьхай категорияр къалурун',
 
@@ -59,8 +59,8 @@ $messages = array(
 'editfont-style' => 'Дуьзар хъувунин чкадин шрифтдин жуьре',
 'editfont-default' => 'Браузердин низамарунрикай шрифт',
 'editfont-monospace' => 'Моногьяркьуьвилер авай шрифт',
-'editfont-sansserif' => 'КЬацI авачир шрифт',
-'editfont-serif' => 'КьацI авай кхьин',
+'editfont-sansserif' => 'КьацӀ авачир шрифт',
+'editfont-serif' => 'КьацӀ авай кхьин',
 
 # Dates
 'sunday' => 'Гьяд',
@@ -77,65 +77,65 @@ $messages = array(
 'thu' => 'Xем',
 'fri' => 'Жум',
 'sat' => 'Киш',
-'january' => 'гьер (январь)',
-'february' => 'Ñ\8dÑ\85ен (Ñ\84евÑ\80алÑ\8c)',
-'march' => 'ибне (маÑ\80Ñ\82)',
-'april' => 'нава (апÑ\80елÑ\8c)',
-'may_long' => 'тӀул (май)',
-'june' => 'кÑ\8cамÑ\83г (иÑ\8eнÑ\8c)',
-'july' => 'чиле (июль)',
-'august' => 'паÑ\85Ñ\83н (авгÑ\83Ñ\81Ñ\82)',
-'september' => 'мара (сентябрь)',
-'october' => 'баÑ\81кÓ\80Ñ\83м (окÑ\82Ñ\8fбÑ\80Ñ\8c)',
-'november' => 'цӀехуьл (ноябрь)',
-'december' => 'фундукӀ (декабрь)',
-'january-gen' => 'гьер (январдиз)',
-'february-gen' => 'Ñ\8dÑ\85ен (Ñ\84евÑ\80алдиз)',
-'march-gen' => 'ибне (маÑ\80Ñ\82диз)',
-'april-gen' => 'нава (апÑ\80елдиз)',
-'may-gen' => 'тӀул (майдиз)',
-'june-gen' => 'кÑ\8cамÑ\83г (иÑ\8eндиз)',
-'july-gen' => 'чиле (июлдиз)',
-'august-gen' => 'паÑ\85Ñ\83н (авгÑ\83Ñ\81Ñ\82диз)',
-'september-gen' => 'мара (сентябрдиз)',
-'october-gen' => 'баÑ\81кÓ\80Ñ\83м (окÑ\82Ñ\8fбÑ\80диз)',
-'november-gen' => 'цӀехуьл (ноябрдиз)',
-'december-gen' => 'фундукӀ (декабрдиз)',
-'jan' => 'гьер (январь)',
-'feb' => 'Ñ\8dÑ\85ен (Ñ\84евÑ\80алÑ\8c)',
-'mar' => 'ибне (маÑ\80Ñ\82)',
-'apr' => 'нава (апÑ\80елÑ\8c)',
-'may' => 'тӀул (май)',
-'jun' => 'кÑ\8cамÑ\83г (иÑ\8eнÑ\8c)',
-'jul' => 'чиле (июль)',
-'aug' => 'паÑ\85Ñ\83н (авгÑ\83Ñ\81Ñ\82)',
-'sep' => 'мара (сентябрь)',
-'oct' => 'баÑ\81кÓ\80Ñ\83м (окÑ\82Ñ\8fбÑ\80Ñ\8c)',
-'nov' => 'цӀехуьл (ноябрь)',
-'dec' => 'фандукl (декабрь)',
+'january' => 'январь',
+'february' => 'Ñ\84евÑ\80алÑ\8c',
+'march' => 'маÑ\80Ñ\82',
+'april' => 'апÑ\80елÑ\8c',
+'may_long' => 'май',
+'june' => 'иÑ\8eнÑ\8c',
+'july' => 'июль',
+'august' => 'авгÑ\83Ñ\81Ñ\82',
+'september' => 'сентябрь',
+'october' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'november' => 'ноябрь',
+'december' => 'декабрь',
+'january-gen' => 'январь',
+'february-gen' => 'Ñ\84евÑ\80алÑ\8c',
+'march-gen' => 'маÑ\80Ñ\82',
+'april-gen' => 'апÑ\80елÑ\8c',
+'may-gen' => 'май',
+'june-gen' => 'иÑ\8eнÑ\8c',
+'july-gen' => 'июль',
+'august-gen' => 'авгÑ\83Ñ\81Ñ\82',
+'september-gen' => 'сентябрь',
+'october-gen' => 'окÑ\82Ñ\8fбÑ\80Ñ\8c',
+'november-gen' => 'ноябрь',
+'december-gen' => 'декабрь',
+'jan' => 'янв',
+'feb' => 'Ñ\84ев',
+'mar' => 'маÑ\80',
+'apr' => 'апÑ\80',
+'may' => 'май',
+'jun' => 'иÑ\8eн',
+'jul' => 'июл',
+'aug' => 'авг',
+'sep' => 'сен',
+'oct' => 'окÑ\82',
+'nov' => 'ноя',
+'dec' => 'дек',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Категория|Категории}}',
+'pagecategories' => '{{PLURAL:$1|Категория|Категорияр}}',
 'category_header' => '"$1" категориядин ччинар',
 'subcategories' => 'агъакатегорияр',
-'category-media-header' => '"$1" категоридин медиа',
-'category-empty' => "''Алай чIава и категория ичIи я.\"",
-'hidden-categories' => '{{PLURAL:$1|Чуьнуьхай категория |Чуьнуьхай категорияр }}',
+'category-media-header' => '"$1" категориядин медиа',
+'category-empty' => "''Алай чӀава и категория ичӀи я.\"",
+'hidden-categories' => '{{PLURAL:$1|Чуьнуьхай категория|Чуьнуьхай категорияр}}',
 'hidden-category-category' => 'Чуьнуьхай категорияр',
-'category-subcat-count' => '{{PLURAL:$2|Ð\98 ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð°Ð½Ð¶Ð°Ñ\85 Ð³Ñ\83Ñ\8cгÑ\8aÑ\83Ñ\8cна Ð°Ð²Ð°Ð¹ Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ð°Ð²Ð°.|$2-кай {{PLURAL:$1|подкаÑ\82егоÑ\80иÑ\8f|$1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f}} къалурнава }}',
-'category-subcat-count-limited' => 'И категорияда {{PLURAL:$1|$1 агъакатегория|$1 агъакатегорияр|$1 подкатегорий}} ава.',
+'category-subcat-count' => '{{PLURAL:$2|Ð\98 ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð°Ð½Ð¶Ð°Ñ\85 Ð³Ñ\83Ñ\8cгÑ\8aÑ\83Ñ\8cна Ð°Ð²Ð°Ð¹ Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ð°Ð²Ð°.|$2-кай {{PLURAL:$1|агÑ\8aакаÑ\82егоÑ\80иÑ\8f|$1 Ð°Ð³Ñ\8aакаÑ\82егоÑ\80иÑ\8fÑ\80}} къалурнава }}',
+'category-subcat-count-limited' => 'И категорияда {{PLURAL:$1|агъакатегория|$1 агъакатегорияр}} ава.',
 'category-article-count' => '{{PLURAL:$2|И категорияда анжах гуьгъуьна авайди ччин ава |$2-кай къалурнавай {{PLURAL:$1|ччин|$1 ччин}} гьа а категориядин ччин я}}',
-'category-article-count-limited' => 'И категорияда {{PLURAL:$1|$1 ччин}} ава.',
+'category-article-count-limited' => 'И категорияда {{PLURAL:$1|ччин|$1 ччин}} ава.',
 'category-file-count' => '{{PLURAL:$2|И категорияда анжах гуьгъуьна авайди файл ава |$2-кай къалурнавай {{PLURAL:$1|файл|$1 файлар}} гьа а категориядин файл я}}',
-'category-file-count-limited' => 'И категорияда {{PLURAL:$1|$1 файл}} ава.',
-'listingcontinuesabbrev' => '(кьатI)',
+'category-file-count-limited' => 'И категорияда {{PLURAL:$1|файл|$1 файлар}} ава.',
+'listingcontinuesabbrev' => '(кьатӀ)',
 'index-category' => 'Индексавунвай ччинар',
 'noindex-category' => 'Индекстежезвай ччин',
-'broken-file-category' => 'ЧIуру файлдин элячIунар авай ччинар',
+'broken-file-category' => 'ЧӀуру файлдин элячӀунар авай ччинар',
 
 'about' => 'Гьакъиндай',
 'article' => 'Макъала',
-'newwindow' => '(цlийи дакlарда ахъа жезва)',
+'newwindow' => '(цӀийи дакӀарда ахъа жезва)',
 'cancel' => 'Гьич авун',
 'moredotdotdot' => 'Мад...',
 'mypage' => 'Зин чар',
@@ -150,61 +150,61 @@ $messages = array(
 'qbedit' => 'Дегишарун',
 'qbpageoptions' => 'Ччинин низамарунар',
 'qbmyoptions' => 'Зи ччинар',
-'qbspecialpages' => 'Кьетlен хъувун',
+'qbspecialpages' => 'КьетӀен хъувун',
 'faq' => 'Фад-фад гузвай жузунар (ФГЖ)',
 'faqpage' => 'Project:ФГС',
 
 # Vector skin
 'vector-action-addsection' => 'Тема алава авун',
 'vector-action-delete' => 'Алудун',
-'vector-action-move' => 'ТIвар эхцигун',
+'vector-action-move' => 'ТӀвар эхцигун',
 'vector-action-protect' => 'Хуьн',
-'vector-action-undelete' => 'ТуькIуьр хъувун',
+'vector-action-undelete' => 'ТуькӀуьр хъувун',
 'vector-action-unprotect' => 'Хуьн дегишарун',
-'vector-simplesearch-preference' => 'Гегьенш жагъурунин рикIел гъун кутун (кьилди "Вектор" акунар патал)',
-'vector-view-create' => 'Туькlуьрун',
-'vector-view-edit' => 'РаÑ\81Ñ\83н',
+'vector-simplesearch-preference' => 'Гегьенш жагъурунин рикӀел гъун кутун (кьилди «Вектор» акунар патал)',
+'vector-view-create' => 'ТуькӀуьрун',
+'vector-view-edit' => 'Ð\94Ñ\83Ñ\8cзаÑ\80ин',
 'vector-view-history' => 'Тарихдиз килигун',
-'vector-view-view' => 'Кlелун',
+'vector-view-view' => 'КӀелун',
 'vector-view-viewsource' => 'Чешме къалурун',
 'actions' => 'Крар',
-'namespaces' => 'Тlварарин генгвилер',
+'namespaces' => 'ТӀварарин генгвилер',
 'variants' => 'Жуьреяр',
 
-'errorpagetitle' => 'ГъалатI',
+'errorpagetitle' => 'ГъалатӀ',
 'returnto' => '$1 ччиниз элкъвена хтун',
 'tagline' => '{{SITENAME}} Cайтдихъай',
 'help' => 'Куьмек',
 'search' => 'Жугъурун',
 'searchbutton' => 'Жагъурун',
-'go' => 'ЭлячIун',
-'searcharticle' => 'ЭлячIун',
+'go' => 'ЭлячӀун',
+'searcharticle' => 'ЭлячӀун',
 'history' => 'Ччинин тарих',
 'history_short' => 'Тарих',
-'updatedmarker' => 'Зи эхиримжи гьахьун гуьгуьнлай цIийи авунва',
+'updatedmarker' => 'Зи эхиримжи гьахьун гуьгуьнлай цӀийи авунва',
 'printableversion' => 'Басма авун патал жуьре',
-'permalink' => 'Гьамишан элячIун',
+'permalink' => 'Гьамишан элячӀун',
 'print' => 'Басма авун',
 'view' => 'Килигун',
 'edit' => 'Дуьзар хъувун',
-'create' => 'Туькlуьрун',
+'create' => 'ТуькӀуьрун',
 'editthispage' => 'И ччин дуьзар хъувун',
-'create-this-page' => 'И ччин туькIуьрун',
+'create-this-page' => 'И ччин туькӀуьрун',
 'delete' => 'Алудун',
 'deletethispage' => 'И ччин алудун',
-'undelete_short' => '$1 {{PLURAL:$1|дуьзар хъувун|дуьзар хъувунар}} туьхкIуьрун',
+'undelete_short' => '$1 {{PLURAL:$1|дуьзар хъувун|дуьзар хъувунар}} туьхкӀуьрун',
 'viewdeleted_short' => '{{PLURAL:$1|дуьзар хъувуниз|$1 дуьзар хъувунриз}} килигун',
 'protect' => 'Xуьн',
-'protect_change' => 'масакIа авун',
+'protect_change' => 'масакӀа авун',
 'protectthispage' => 'И ччин блокарун',
 'unprotect' => 'Хуьн дегишарун',
 'unprotectthispage' => 'И ччинин хуьн дегишарун',
-'newpage' => 'ЦIийи ччин',
+'newpage' => 'ЦӀийи ччин',
 'talkpage' => 'И ччин веревирдун',
 'talkpagelinktext' => 'Рахун',
 'specialpage' => 'Куьмекчи ччин',
 'personaltools' => 'Кьилди вичин алатар',
-'postcomment' => 'ЦIйий пай',
+'postcomment' => 'ЦӀйий пай',
 'articlepage' => 'Къене авайбурун ччиндиз килигун',
 'talk' => 'Веревирд авун',
 'views' => 'Килигунар',
@@ -217,22 +217,22 @@ $messages = array(
 'viewhelppage' => 'Куьмекдин ччиниз килигун',
 'categorypage' => 'Категориядин ччиниз килигун',
 'viewtalkpage' => 'Веревирдриз килигун',
-'otherlanguages' => 'Маса чIаларал',
+'otherlanguages' => 'Маса чӀаларал',
 'redirectedfrom' => '($1-кай рахкъурнава )',
 'redirectpagesub' => 'Рахкъурунин ччин',
-'lastmodifiedat' => 'Ччинин эхиримжи масакIа хьун:  $1,  $2',
+'lastmodifiedat' => 'Ччинин эхиримжи масакӀа хьун:  $1,  $2',
 'protectedpage' => 'Хвенвай ччин',
-'jumpto' => 'ЭлячIун иниз:',
-'jumptonavigation' => 'Навигаци',
+'jumpto' => 'ЭлячӀун иниз:',
+'jumptonavigation' => 'Навигация',
 'jumptosearch' => 'Жугъурун',
-'pool-queuefull' => 'ТIалабар кIватзавайди ацIа я',
-'pool-errorunknown' => 'Малумтушир гъалатI',
+'pool-queuefull' => 'ТӀалабар кӀватзавайди ацӀа я',
+'pool-errorunknown' => 'Малумтушир гъалатӀ',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => ' {{SITENAME}}кай',
 'aboutpage' => 'Project:Гьакъиндай',
-'copyright' => 'КЪене авайбур $1 жугъуриз жеда.',
-'copyrightpage' => '{{ns:project}}: Автордин ихтияр',
+'copyright' => 'Къене авайбур $1 жугъуриз жеда.',
+'copyrightpage' => '{{ns:project}}:Автордин ихтияр',
 'currentevents' => 'Алай вакъиаяр',
 'currentevents-url' => 'Project:Алай вакъиаяр',
 'disclaimers' => 'Жавабдарвал хивяй акъудун',
@@ -243,20 +243,20 @@ $messages = array(
 'mainpage' => 'Кьилин ччин',
 'mainpage-description' => 'Кьилин ччин',
 'policy-url' => 'Project:Къайдаяр',
-'portal' => 'КIапIалдин портал',
-'portal-url' => 'Project:КIапIалдин портал',
+'portal' => 'КӀапӀалдин портал',
+'portal-url' => 'Project:КӀапӀалдин портал',
 'privacy' => 'Чинебанвилин сиясат',
 'privacypage' => 'Project:Чинебанвилин политика',
 
-'badaccess' => 'ГЬатунин гъалатlдин',
+'badaccess' => 'Гьатунин гъалатӀдин',
 
 'ok' => 'ОК',
 'retrievedfrom' => 'Чешне "$1" я',
-'youhavenewmessages' => 'Квез  $1 ($2) атанва.',
-'newmessageslink' => 'цlийи чарар',
-'newmessagesdifflink' => 'Эхиримжи масакIавилер',
-'youhavenewmessagesmulti' => '"$1"-да квез цIийи чарар атанва.',
-'editsection' => 'РаÑ\81ун',
+'youhavenewmessages' => 'Квез $1 ($2) атанва.',
+'newmessageslink' => 'цӀийи чарар',
+'newmessagesdifflink' => 'Эхиримжи масакӀавилер',
+'youhavenewmessagesmulti' => '"$1"-да квез цӀийи чарар атанва.',
+'editsection' => 'Ð\94Ñ\83Ñ\8cзаÑ\80 Ñ\85Ñ\8aÑ\83вун',
 'editold' => 'Дуьзар хъувун',
 'viewsourceold' => 'сифте кьилин коддиз килига',
 'editlink' => 'Дуьзар хъувун',
@@ -267,19 +267,19 @@ $messages = array(
 'hidetoc' => 'чуьнуьхун',
 'collapsible-collapse' => 'Алчудрун',
 'collapsible-expand' => 'Гегьеншрун',
-'thisisdeleted' => '$1 килигун ва я туькIуьр хъувун?',
+'thisisdeleted' => '$1 килигун ва я туькӀуьр хъувун?',
 'viewdeleted' => '$1 килигун?',
 'feedlinks' => 'Хулан жуьре',
 'site-rss-feed' => '$1 — RSS-зул',
-'site-atom-feed' => '$1 -  атом-зул',
-'page-rss-feed' => '"$1" РСС Xуьрек',
+'site-atom-feed' => '$1 - атом-зул',
+'page-rss-feed' => '"$1" RSS Xуьрек',
 'page-atom-feed' => '"$1" Атом-зул',
 'red-link-title' => '$1 (ихьтин ччин авайди туш)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Ччин',
 'nstab-user' => 'Уртахдин ччин',
-'nstab-media' => 'Медия ччин',
+'nstab-media' => 'Медиа ччин',
 'nstab-special' => 'Квимекдин ччин',
 'nstab-project' => 'Проектдин ччин',
 'nstab-image' => 'Файл',
@@ -293,69 +293,69 @@ $messages = array(
 'nosuchspecialpage' => 'Ихьтин куьмекчи ччин авайд ттуш',
 
 # General errors
-'error' => 'Гъалатl',
-'databaseerror' => 'Ганайбурун базадин гъалатI',
-'missing-article' => 'Малуматрин базада, квез герек авай "$1" $2 тIвар алай ччиндин текст жагъанвач
+'error' => 'ГъалатӀ',
+'databaseerror' => 'Ганайбурун базадин гъалатӀ',
+'missing-article' => 'Малуматрин базада, квез герек авай "$1" $2 тӀвар алай ччиндин текст жагъанвач
 
-Ихьтин гьал адет яз алуднавай ччинин масакIавилерин тарихдиз цlуру  рекьяй элячlайла арадал къвезва.
+Ихьтин гьал адет яз алуднавай ччинин масакӀавилерин тарихдиз цӀуру рекьяй элячӀайла арадал къвезва.
 
-Себеб ам туштlа, виридалайни мумкин тирди куьне программада гъалатl жугъурун я
-Тавакъу ийида, URL  къалурна адакай   [[Special:ListUsers/sysop|администратордиз]] хабар це.',
+Себеб ам туштӀа, виридалайни мумкин тирди куьне программада гъалатӀ жугъурун я
+Тавакъу ийида, URL къалурна адакай [[Special:ListUsers/sysop|администратордиз]] хабар це.',
 'missingarticle-rev' => '(жуьре#: $1)',
-'internalerror' => 'КЪенепатан гъалатI',
-'internalerror_info' => 'КЪенепатан гъалатI $1',
-'filecopyerror' => 'Kopi aqudiz jezach fail "$1"  "$2" - diz.',
-'filerenameerror' => '«$1» файл  «$2» -з тIвар эхцигиз жезвач..',
+'internalerror' => 'Къенепатан гъалатӀ',
+'internalerror_info' => 'Къенепатан гъалатI $1',
+'filecopyerror' => '«$1» файл «$2» -з тӀвар эхцигиз жезвач.',
+'filerenameerror' => '«$1» файл «$2» -з тӀвар эхцигиз жезвач.',
 'badarticleerror' => 'И ччина и кар кьилиз акъудиз мумкин ттуш.',
-'cannotdelete-title' => ' "$1" ччин алудиз жезвач',
-'badtitle' => 'Ииже текъвер тIвар',
-'badtitletext' => 'ТIалабзавай ччин  я вичел амал алачир я,  я  ичIи я,  ва я чIаларарадин ва я викиарадин кьилин цlарар чlурукlа къалурнава. Мумкин я, кьилин цlарара сад ва я адалай гзаф рехъ гун виже текъвер символар кардик кутунвайди я.',
+'cannotdelete-title' => '"$1" ччин алудиз жезвач',
+'badtitle' => 'Ииже текъвер тӀвар',
+'badtitletext' => 'ТӀалабзавай ччин я вичел амал алачир я, ичӀи я, ва я чӀаларарадин ва я викиарадин кьилин цӀарар чӀурукӀа къалурнава. Мумкин я, кьилин цӀарара сад ва я адалай гзаф рехъ гун виже текъвер символар кардик кутунвайди я.',
 'viewsource' => 'Килигун',
 'viewsource-title' => '$1 патал чешмедиз килигун',
 'actionthrottled' => 'Фадвилин сергьятар',
 
 # Virus scanner
-'virus-scanfailed' => 'Сканди гъалатl (кулег$1)',
+'virus-scanfailed' => 'Сканди гъалатӀ (кулег$1)',
 'virus-unknownscanner' => 'Малумтушир антивирус',
 
 # Login and logout pages
-'yourname' => 'Уртахдин тlвар',
+'yourname' => 'Уртахдин тӀвар',
 'yourpassword' => 'Парол',
 'yourpasswordagain' => 'Парол кхьин хъувун:',
-'remembermypassword' => 'И браузерда зи логин рикlел хуьхь (лап гзаф $1 {{PLURAL:$1|югъ|йикъар}})',
+'remembermypassword' => 'И браузерда зи логин рикӀел хуьхь (лап гзаф $1 {{PLURAL:$1|югъ|йикъар}})',
 'yourdomainname' => 'Куь домен',
 'login' => 'Гьахьун',
-'nav-login-createaccount' => 'Гьахьун/аккаунт туькlуьрун',
-'loginprompt' => 'Системадиз гьахьун патал "куки" -яр куькlуьрна кIанзава',
-'userlogin' => 'ГЬахьун/аккаунт туькlуьрун',
+'nav-login-createaccount' => 'Гьахьун/аккаунт туькӀуьрун',
+'loginprompt' => 'Системадиз гьахьун патал "куки" -яр куькӀуьрна кӀанзава',
+'userlogin' => 'Гьахьун/аккаунт туькӀуьрун',
 'userloginnocreate' => 'Гьахьун',
-'logout' => 'ЭкъечIун',
-'userlogout' => 'ЭкъечIун',
+'logout' => 'ЭкъечӀун',
+'userlogout' => 'ЭкъечӀун',
 'notloggedin' => 'Куьн гьахьнавач',
 'nologin' => 'Квез аккаунт авачни? $1.',
-'nologinlink' => 'Аккаунт туькlуьрун',
-'createaccount' => 'Аккаунт туькlуьрун',
+'nologinlink' => 'Аккаунт туькӀуьрун',
+'createaccount' => 'Аккаунт туькӀуьрун',
 'gotaccount' => 'Квез аккаунт авани?$1',
 'gotaccountlink' => 'Гьахьун',
-'userlogin-resetlink' => 'Гьахьунин куьлуь-шуьлуьяр рикlел алатнани?',
+'userlogin-resetlink' => 'Гьахьунин куьлуь-шуьлуьяр рикӀел алатнани?',
 'createaccountmail' => 'Э-чар галаз',
 'createaccountreason' => 'Себеб:',
-'loginerror' => 'ГЬахьунин гъалатI',
-'createaccounterror' => 'И аккаунт туькIуьриз мумкин ттуш: $1',
+'loginerror' => 'Гьахьунин гъалатӀ',
+'createaccounterror' => 'И аккаунт туькӀуьриз мумкин ттуш: $1',
 'loginsuccesstitle' => 'Агалкьунралди гьахьун',
-'wrongpasswordempty' => 'Тавакъу ийида, ичIи тушир парол ттур.',
-'mailmypassword' => 'ЦIийи парол Э-мейлдиз къачун',
-'mailerror' => 'Чар ракъурунин гъалатI: $1',
+'wrongpasswordempty' => 'Тавакъу ийида, ичӀи тушир парол ттур.',
+'mailmypassword' => 'ЦӀийи парол э-мейлдиз къачун',
+'mailerror' => 'Чар ракъурунин гъалатӀ: $1',
 'emailconfirmlink' => 'Куь электрон почтунин адрес тестикьун.',
-'accountcreated' => 'Аккаунт туькIуьрнава',
-'usernamehasherror' => 'Уртахдин тIвар "диез"дин лишан квачиз хьана кIанзава',
-'loginlanguagelabel' => 'ЧIал: $1',
+'accountcreated' => 'Аккаунт туькӀуьрнава',
+'usernamehasherror' => 'Уртахдин тӀвар "диез"дин лишан квачиз хьана кӀанзава',
+'loginlanguagelabel' => 'ЧӀал: $1',
 
 # Change password dialog
 'resetpass' => 'Куьлег дегишарун',
 'resetpass_header' => 'Аккаунтдин парол дегишун',
-'oldpassword' => 'ЦIуру парол:',
-'newpassword' => 'ЦIийи парол:',
+'oldpassword' => 'ЦӀуру парол:',
+'newpassword' => 'ЦӀийи парол:',
 'retypenew' => 'Парол кхьин хъувун:',
 'resetpass_submit' => 'Парол эцигун ва гьахьун',
 'resetpass_forbidden' => 'Парол дегишиз мумкин ттуш',
@@ -400,7 +400,7 @@ $messages = array(
 'subject' => 'Тема/кьилинцIар',
 'minoredit' => 'ГъвечIи дуьзар хъувун',
 'watchthis' => 'И ччин гуьзетун',
-'savearticle' => 'ЧÑ\8aин Ñ\85вин',
+'savearticle' => 'ЧÑ\87ин Ñ\85Ñ\83Ñ\8cн',
 'preview' => 'Сифтедин килигун',
 'showpreview' => 'Сифтедин килигун къалурун',
 'showlivepreview' => 'Фад сифтедин килигун',
@@ -422,7 +422,7 @@ $messages = array(
 Квевай [[Special:Search/{{PAGENAME}}| и тlвар алай ччин]] муькуь ччинра жугъуриз,
 <span class="plainlinks"> [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затIар жугъуриз],
 ва я [{{fullurl:{{FULLPAGENAME}}|action=edit}} и тlвар алай ччин туькIуьриз жеда] </span>.',
-'noarticletext-nopermission' => 'Исятда и  ччина са текстни авач.
+'noarticletext-nopermission' => 'Исятда и ччина са текстни авач.
 Квевай [[Special:Search/{{PAGENAME}}| и тӀвар алай ччин]] муькуь ччинра жугъуриз ва я
 <span class="plainlinks"> [{{fullurl: {{# Special:Log}} | page = {{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затӀар жугъуриз] жеда.',
 'blocked-notice-logextract' => 'И уртах алайчIава блокарнава.
@@ -525,7 +525,7 @@ $messages = array(
 'revertmerge' => 'Ччара авун',
 
 # Diffs
-'history-title' => '$1  -  масакӀавилерин тарих',
+'history-title' => '$1 - масакӀавилерин тарих',
 'lineno' => 'ЦIар $1:',
 'compareselectedversions' => 'Хкягъай жуьреяр гекъигун',
 'editundo' => 'гьич авун',
@@ -585,17 +585,9 @@ $messages = array(
 'powersearch-toggleall' => 'Вири',
 'powersearch-togglenone' => 'Садни',
 
-# Quickbar
-'qbsettings' => 'КЪекъуьнрин панел',
-'qbsettings-none' => 'Садни',
-'qbsettings-fixedleft' => 'Чапла патахъай юзан тийир',
-'qbsettings-fixedright' => 'ЭрчIи патахъай юзан тийир',
-'qbsettings-floatingleft' => 'Чапла патаз алгъурзава',
-'qbsettings-floatingright' => 'ЭрчIи патаз алгъурзава',
-
 # Preferences page
 'preferences' => 'Туькlуьрун',
-'mypreferences' => 'Zi tïķïrunar',
+'mypreferences' => 'Зи низамарунар',
 'prefs-edits' => 'Дьузар хъувунрин кьадар',
 'prefsnologin' => 'Куьне гьахьнавач',
 'changepassword' => 'Парол дегишарун',
@@ -866,7 +858,7 @@ $messages = array(
 'disambiguationspage' => 'Template:гзафманавал',
 
 'brokenredirects-edit' => 'дегишарун',
-'brokenredirects-delete' => 'кÑ\8aакÑ\8aудун',
+'brokenredirects-delete' => 'алудун',
 
 'withoutinterwiki-submit' => 'КЪалурун',
 
@@ -880,7 +872,7 @@ $messages = array(
 'protectedpages' => 'Хвенвай ччинар',
 'listusers' => 'Уртахрин сиягь',
 'usercreated' => '{{GENDER:$3|Created}} идав $1 идал $2',
-'newpages' => 'ЦIийи ччинар',
+'newpages' => 'ЦӀийи ччинар',
 'newpages-username' => 'Иштиракчидин тlвар',
 'ancientpages' => 'виридалайни цIуру ччинар',
 'move' => 'ТIвар эхцигун',
@@ -938,7 +930,7 @@ $messages = array(
 
 # Watchlist
 'watchlist' => 'Зи вилив хуьнин сиягь',
-'mywatchlist' => 'Ð\97и Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\8eнин сиягь',
+'mywatchlist' => 'Ð\92илив Ñ\85Ñ\83Ñ\8cнин сиягь',
 'watchlistfor2' => '$1 $2 патал',
 'addedwatchtext' => "Чар \"[[:\$1]]\" тун хъувунай куьн [[Special:Watchlist|watchlist]].                                                                                                             Къвезмай дегишунар и чарчел ва галкlанавай чарчихъ ихтилатар жеда инна, ахъатдава \"сакlус яцlу''''' инна [[Special:RecentChanges|list of recent changes]] гьам кьизил авун.",
 'removedwatchtext' => 'Чар "[[:$1]]" Идай чlурнай [[Special:Watchlist|ахтармишунин цlарар]].',
@@ -1025,7 +1017,7 @@ $messages = array(
 # Contributions
 'contributions' => 'Уртахди кутур крар',
 'contributions-title' => '$1 уртахди кутур крар',
-'mycontris' => 'Ð\97а Ðºутур кар',
+'mycontris' => 'Ð\9aутур кар',
 'contribsub2' => '($1)-ин кутур пай  ($2)',
 'uctop' => '(вини кьил)',
 'month' => ' Вацралай (ва адалай вилик)',
@@ -1182,7 +1174,7 @@ $messages = array(
 'tooltip-diff' => 'Сифте кьилин текстдиз талукь тир куьне авунвай масакIавилер къалурун',
 'tooltip-compareselectedversions' => 'И ччинин кьве хкягъай жуьрейрин арада авай тафаватдиз килигун',
 'tooltip-watch' => 'И ччин куь вилив хуьнин сиягьдиз алава авун',
-'tooltip-rollback' => '« КЬулухъди чIугун »  и ччиндиз эхиримжи кар кутазвайди патай  авунвай дуьзар хъувунар са т!ампуналди  paxкурзава',
+'tooltip-rollback' => '«Кьулухъди чӀугун» и ччиндиз эхиримжи кар кутазвайди патай авунвай дуьзар хъувунар са тӀампуналди paxкурзава',
 'tooltip-undo' => '«Гьич авун»  авунвай дуьзар хъувун paxкурзава ва сифтедин килигунин режимда  дуьзар хъувундин форма ахъа йийзва. Им нетижадиз себеб алава йийз мумкинвал гузва',
 'tooltip-summary' => 'Куьруь нетижа гьадрун',
 
@@ -1228,7 +1220,7 @@ Cиягьда авай анжах (* лишандихъ галаз эгечIза
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Гьяркьуь',
 'exif-planarconfiguration' => 'Ганайбур тешкил авун',
 'exif-ycbcrsubsampling' => ' Y  ва C компонентрин кьадаррин нисбет',
@@ -1326,6 +1318,11 @@ Cиягьда авай анжах (* лишандихъ галаз эгечIза
 'compare-page1' => 'Чар 1',
 
 # New logging system
+'logentry-move-move' => '$3 макъаладин тӀвар $4 -диз масакӀа хъувуна',
+'logentry-move-move-noredirect' => '$3 макъаладин тӀвар, ракъурунин винелай $4 -диз масакӀа хъувуна',
+'logentry-move-move_redir' => '$3 макъаладин тӀвар, ракъурун тун тавуна $4 -диз масакӀа хъувуна',
+'logentry-move-move_redir-noredirect' => '$3 макъаладин тӀвар, ракъурун тун тавуна ва ракъурунин винелай $4 -диз масакӀа хъувуна',
+'logentry-newusers-autocreate' => 'Уртахдин $1 учётдин кхьин автоматиквилели туькӀуьр хьанва',
 'rightsnone' => '(садни)',
 
 # Feedback
index 4e0d64b..909dea4 100644 (file)
@@ -63,7 +63,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Descovre la me adirije de eposta en postas de nota',
 'tog-shownumberswatching' => 'Mostra la numero de usores oservante',
 'tog-fancysig' => 'Sinias simple (sin lia automatica)',
-'tog-externaleditor' => 'Usa costumal editadores esterna',
 'tog-watchlisthideown' => 'Asconde me editas de la lista de pajes oservada',
 'tog-watchlisthidebots' => 'Asconde editas par bot de la lista de pajes oservada',
 'tog-watchlisthideminor' => 'Asconde editas minor de la lista de pajes oservada',
@@ -662,7 +661,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listgrouprights-group' => 'Grupo',
 'listgrouprights-members' => '(lista de membros)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Envia un eposta a esta usor',
 'emailfrom' => 'De',
 'emailto' => 'Per',
@@ -930,7 +929,7 @@ Si la fix ia es cambiada de se stato orijinal, alga detalias pote no es clara en
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-exposuretime-format' => '$1 sec. ($2)',
 
 # External editor support
@@ -954,9 +953,6 @@ Si la fix ia es cambiada de se stato orijinal, alga detalias pote no es clara en
 'version' => 'Varia',
 'version-version' => '(Varia $1)',
 
-# Special:FilePath
-'filepath-page' => 'Fix:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Xerca',
 
index d951f6e..7f14e50 100644 (file)
@@ -41,8 +41,6 @@ $messages = array(
 'tog-shownumberswatching' => "Ndaganga obungi bw'abagoberera olupapula",
 'tog-oldsig' => 'Omukono gwo kakano:',
 'tog-fancysig' => 'Omukono gubemu obubonero bwa ki-wiki (naye nga tegufuuka nyunzi)',
-'tog-externaleditor' => 'Wandikisanga puloguramu eri ku kompyuta yo (kyetaagisa bumanyirivu bungi, kubanga wetaaga okutegeka kompyuta yo mu ngeri ezitali za bulijjo. [//www.mediawiki.org/wiki/Manual:External_editors Okutangaaza okusingawo.])',
-'tog-externaldiff' => "Kozesanga puloguramu ey'oku kompyuta yo okukebera njawulo wakati w'ebiwandike (kyetaagisa bumanyirivu bungi, wetaaga ntegeka ezitali za bulijjo ku kompyuta yo. [//www.mediawiki.org/wiki/Manual:External_editors Okutangaaza okusingawo.])",
 'tog-showjumplinks' => 'Wabeerewo enyunzi eza "Genda ku"',
 'tog-uselivepreview' => 'Enkyukakyuka ze nkoze zirabikirewo nga tekyetaagisiza kumala kunyiga ppeesa (kyetaagisa JavaScript)(Kikyagezesebwa)',
 'tog-forceeditsummary' => 'Ŋambaako bwe mba ŋenda okuleka nga sinnyonyodde bye nkyusizza',
@@ -750,6 +748,9 @@ Kirabika lwagyibwawo.',
 'edit-no-change' => "Sisitemu ekubaze nga atalina ky'agikozeko, olw'okubanga ebiri ku lupapula obirese nga bwe wabisanze.",
 'edit-already-exists' => "Olupapula lw'ogeza okukolawo weruli, lwakolebwawo dda.<br />
 Tekisobose kuddamu n'ate oulukolawo.",
+'editwarning-warning' => 'Bw\'ova ku lupapula luno kiyinza okuleetera enkyukakyuka z\'olukozeko okuvawo.<br />
+Bw\'oba nga okola oyingidde mu sisitemu, okulabula kuno oyinza okukusirisa nga weyambisa<br />
+ebiri mu kitundu ekya "Kukyusa" eky\'omu "Nteekateeka yange".',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Kulabula:''' Olupapula luno luliko ebiragiro eby'ekikebera engoberera y'amateeka g'empandika ebizito ebiyitiridde obungi.<br />
index d7d50bb..5ce6bb4 100644 (file)
@@ -187,8 +187,6 @@ $messages = array(
 'tog-shownumberswatching' => "'t Aantal gebroekers tuine die dees pagina volg",
 'tog-oldsig' => 'Bestaonde ongerteikening:',
 'tog-fancysig' => 'Es wikiteks behanjele (zonder autematische verwiezing)',
-'tog-externaleditor' => "Sjtanderd 'ne externe teksbewirker gebroeke (inkel veur experts, speciaal instellinge zien nudig. [//www.mediawiki.org/wiki/Manual:External_editors Mie infermasie])",
-'tog-externaldiff' => "Sjtanderd 'n extern vergeliekingsprogramma gebroeke (inkel veur experts, speciaal instellinge zien nudig [//www.mediawiki.org/wiki/Manual:External_editors Mie infermasie])",
 'tog-showjumplinks' => '"gank nao"-toegankelikheidslinks mäögelik make',
 'tog-uselivepreview' => '"live veurbesjouwing" gebroeke (vereis JavaScript - experimenteel)',
 'tog-forceeditsummary' => "'n Melding gaeve bie 'n laeg samevatting",
@@ -202,6 +200,7 @@ $messages = array(
 'tog-diffonly' => 'Pagina-inhaud zónger verangeringe neet tuine',
 'tog-showhiddencats' => 'Verbórge categorië tuine',
 'tog-norollbackdiff' => 'Wieziginge eweglaote nao trökdrieje',
+'tog-useeditwarning' => "Waorssjoew mich es ich 'n bewerkdje pagina die nag neet is opgeslage wil verlaote",
 
 'underline-always' => 'Altied',
 'underline-never' => 'Noets',
@@ -892,6 +891,8 @@ Ze lik eweggesjaf te zien.',
 'edit-already-exists' => 'De pagina is neet aangemaak.
 Zie besjteit al.',
 'defaultmessagetext' => 'Obligaten teks',
+'editwarning-warning' => "Es se dees pagina verleets verluus se meugelik wieziginge die se haes gemaak.
+Es se bös aangemeld, kins se dees waorsjoewing oetzètten in 't bewerkingstabblaad in dien veurkäöre.",
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Waarschuwing:''' dees pagina gebroek te väöl kosbare parserfuncties.
@@ -1167,15 +1168,6 @@ Doe kans ouch 'n naamruumde es veurvoegsel gebroeke.",
 Zoelang as de servers nog neet sjterk genog zunt kins e zeuke bie Google.
 Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
 
-# Quickbar
-'qbsettings' => 'Menubalkinsjtèllinge',
-'qbsettings-none' => 'Oetgesjakeld',
-'qbsettings-fixedleft' => 'Links vas',
-'qbsettings-fixedright' => 'Rechts vas',
-'qbsettings-floatingleft' => 'Links zjwevend',
-'qbsettings-floatingright' => 'Rechs zjwevend',
-'qbsettings-directionality' => 'Vas, aafhenkelik vanne sjrifrichting van dien sjpraok',
-
 # Preferences page
 'preferences' => 'Veurkäöre',
 'mypreferences' => 'Mien veurkäöre',
@@ -1715,7 +1707,6 @@ Om beveiligingsrede is img_auth.php oetgesjakeld.",
 'http-read-error' => 'HTTP-laezingsfout.',
 'http-timed-out' => 'HTTP-verzeuktimeout',
 'http-curl-error' => 'Óphaolingsfout URL: $1',
-'http-host-unreachable' => 'Kòs de URL neet bereike',
 'http-bad-status' => "d'r Is e perbleem ópgetraoje bie 't HTTP-verzeuk: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2112,8 +2103,8 @@ Toekomstige verangeringe aan dees pagina en de biebehurende euverlèkpagina weur
 'notvisiblerev' => 'Bewèrking is verwiederd',
 'watchnochange' => 'Gein van dien gevolgde items is aangepas in dees periode.',
 'watchlist-details' => "D'r {{PLURAL:$1|sjteit ein pagina|sjtaon $1 pagina's}} op dien volglies mit oetzunjering van de euverlèkpagina's.",
-'wlheader-enotif' => 'Doe wörs per e-mail gewaarsjuwd',
-'wlheader-showupdated' => "Pazjena's die verangerd zeen saers doe ze veur 't lètste bekeeks sjtaon '''vet'''",
+'wlheader-enotif' => 'Doe wörs per e-mail gewaarsjuwd',
+'wlheader-showupdated' => "Pazjena's die verangerd zeen saers doe ze veur 't lètste bekeeks sjtaon '''vet'''",
 'watchmethod-recent' => "Controleer recènte verangere veur gevolgde pazjena's",
 'watchmethod-list' => "controlere van gevolgde pazjena's veur recènte verangeringe",
 'watchlistcontains' => "Dien volglies bevat $1 {{PLURAL:$1|pazjena|pazjena's}}.",
@@ -2830,8 +2821,6 @@ Meistal wörd dit door 'ne zwarte externe link veroorzaak.",
 'pageinfo-authors' => 'Aantal versjillende sjrievers',
 
 # Skin names
-'skinname-standard' => 'Standaard',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keuls blauw',
 
 # Patrolling
@@ -2930,7 +2919,7 @@ Alle volgende links die op dezelfde regel sjtaon, waere behanjeld es oetzunjerin
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breidte',
 'exif-imagelength' => 'Hoogte',
 'exif-bitspersample' => 'Bits per componènt',
@@ -3108,7 +3097,7 @@ Alle volgende links die op dezelfde regel sjtaon, waere behanjeld es oetzunjerin
 'exif-originalimageheight' => 'Heugdje vanne aafbeilding veur biesnieje',
 'exif-originalimagewidth' => 'Brèdje vanne aafbeilding veur biesnieje',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Óngecómprimeerd',
 'exif-compression-2' => 'CCITT Groep 3 1-dimensionale aangepasde "Huffman run length"-codering',
 'exif-compression-3' => 'CCITT Groep 3 faxcodering',
@@ -3516,13 +3505,6 @@ Same mit dit programma heurs se 'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van d
 'version-entrypoints-header-entrypoint' => 'Ingank',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Bestandjspaad',
-'filepath-page' => 'Bestandj:',
-'filepath-submit' => 'Zeuk',
-'filepath-summary' => "Dees speciaal pazjena guf 't vollejig paad veur 'n bestandj.
-Aafbeildinge waere in häör vollejige resolutie getoeandj. Anger bestandjstypes waere drèk in 't mit 't MIME-type verbónje programma geäöpendj.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Zeuk veur döbbelbestaondje bestenj',
 'fileduplicatesearch-summary' => 'Zeuk veur döbbel bestaondje bestenj op basis van zien hashwaarde.',
index 6442f4a..a7d4106 100644 (file)
@@ -10,6 +10,7 @@
  * @author Dario vet
  * @author Dedee
  * @author Gastaz
+ * @author Giromin Cangiaxo
  * @author Malafaya
  * @author Urhixidur
  * @author ZeneizeForesto
@@ -128,27 +129,52 @@ $messages = array(
 'tog-underline' => 'Sottolineâ i collegamenti',
 'tog-justify' => 'Alliniamento di paragrafi giustificòu',
 'tog-hideminor' => 'asconde e modifiche minori inte ùrtime modifiche',
-'tog-hidepatrolled' => 'Ascondi e modifiche verific inte ùrtime modifiche',
-'tog-newpageshidepatrolled' => 'Ascondi e paggine verifiché da-o elenco de paggine ciù reçenti',
-'tog-extendwatchlist' => 'mostrâ tùtte e modifiche a-i òsserve speciali',
-'tog-usenewrc' => 'Usâ e ùrtime modifiche avansê (serve Javascript)',
+'tog-hidepatrolled' => 'Ascondi e modifiche verificæ inte ùrtime modifiche',
+'tog-newpageshidepatrolled' => "Ascondi e paggine verificæ da  l'elenco de paggine ciù reçenti",
+'tog-extendwatchlist' => "mostra tùtte e modifiche a-i osservæ speciali, non solo l'urtima",
+'tog-usenewrc' => 'Ammuggia pe paggina e modifiche in urtime modifiche e sotta oservaçion (serve o Javascript)',
 'tog-numberheadings' => 'Nùmeraçion aotomàtica di tìtoli de seçión',
-'tog-showtoolbar' => 'Fâ vedde a barra de strumenti de modìffica (con JavaScript)',
-'tog-editondblclick' => 'Modifica e paggine co-o dópio clic (serve Javascrpt)',
+'tog-showtoolbar' => 'Fanni vedde a barra di strumenti de modìffica (serve JavaScript)',
+'tog-editondblclick' => 'Modifica e paggine co-o doggio clic (serve Javascrpt)',
 'tog-editsection' => 'Modifica e seçión co-o colegamento [modifica]',
-'tog-editsectiononrightclick' => 'Modifica e seçión co-o clic destro in sciô tìtolo (serve Javascipt)',
+'tog-editsectiononrightclick' => 'Modifica e seçión co-o clic drito in sciô tìtolo (serve Javascipt)',
 'tog-showtoc' => "Fanni védde l'indiçe pe-e pàgine con ciù de 3 seçioìn",
 'tog-rememberpassword' => "Arregorda a mæ paròlla d'ordine (a-o màscimo pe $1 {{PLURAL:$1|day|days}})",
-'tog-watchcreations' => 'Azónzi e pàgine a-i oservæ speciâli',
+'tog-watchcreations' => 'Azonzi e paggine che creo e i file che carrego a-i oservæ speciâli',
+'tog-watchdefault' => 'Azonzi e paggine e i files che modiffico a-i mæ sotta oservaçion',
+'tog-watchmoves' => 'Azonzi e paggine e i file che mescio a-i mæ sotta oservaçion',
+'tog-watchdeletion' => 'Azonzi e paggine e i files che scancello a-i mæ sotta oservaçion',
+'tog-minordefault' => 'Indica de longo comme menô e modiffiche',
 'tog-previewontop' => "Veddi l'anteprimma de d'äto a-o spaçio pe cangiâ",
 'tog-previewonfirst' => "Veddi l'anteprimma a-o primmo cangiamento",
-'tog-enotifwatchlistpages' => "Fammelo savéi via e-mail quande 'na paggina inta mæ lista in osservassion a va cangiaa.",
+'tog-nocache' => 'Disabilita a cache de pagine do navegatô',
+'tog-enotifwatchlistpages' => "Famme savéi via e-mail quande 'na paggina o in file inti mæ osservæ a ven cangiâ.",
 'tog-enotifusertalkpages' => "Màndime un messaggio e-mail se gh'é de-e modìffiche inta pagina de discuscion da mæ pagina d'utente.",
+'tog-enotifminoredits' => 'Inviami una email pe e modifiche menoî ascì de pagine e di file',
+'tog-enotifrevealaddr' => 'Mostra o mæ indirizzo e-mail inti messaggi de notifica',
+'tog-shownumberswatching' => "Mostra o numero di utenti che tegnan d'oeuggio sta pagina",
+'tog-oldsig' => 'Firma attuale:',
+'tog-fancysig' => 'Tratta a firma comme wikitesto (sensa un collegamento aotomatico)',
+'tog-showjumplinks' => 'Attiva i collegamenti d\'accescibilitæ "sata a"',
+'tog-uselivepreview' => "Doeuvia l'anteprimma in diretta (ghe voeu o JavaScript)(sperimentâ)",
+'tog-watchlisthideown' => "Ascondi e mæ modiffiche da-a lista che tegno d'oeuggio",
+'tog-watchlisthidebots' => "Ascondi e modiffiche di bot da-a lista che tegno d'oeuggio",
+'tog-watchlisthideminor' => "Ascondi e modiffiche menoî da-a lista che tegno d'oeuggio",
+'tog-watchlisthideliu' => "Ascondi e modiffiche di utenti intræ da-a lista che tegno d'oeuggio",
+'tog-watchlisthideanons' => "Ascondi e modiffiche di utenti anonnimi da-a lista che tegno d'oeuggio",
+'tog-watchlisthidepatrolled' => "Ascondi e modiffiche za controllæ da-a lista che tegno d'oeuggio",
+'tog-ccmeonemails' => "Mandime 'na coppia de e-mail che mando a-i atri utenti",
+'tog-diffonly' => 'No mostrâ o contegnuo da paggina sotta o confronto tra verscioin',
 'tog-showhiddencats' => 'Fa vedde e categorîe ascose',
+'tog-norollbackdiff' => "Ometti o confronto tra verscioin doppo ch'ho fæto o ripristino",
+'tog-useeditwarning' => "Avertime se lascio 'na paggina de modiffica sens'avei sarvou i cangi",
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mâi',
 
+# Font style option in Special:Preferences
+'editfont-style' => "Stile do carattere de l'aera de modiffica",
+
 # Dates
 'sunday' => 'Domenega',
 'monday' => 'Lunedì',
@@ -205,42 +231,50 @@ $messages = array(
 'pagecategories' => '{{PLURAL:$1|Categorîa|Categorîe}}',
 'category_header' => 'Pàgine inta categorîa "$1"',
 'subcategories' => 'Sottocategorîe',
-'category-media-header' => 'Archivio inta categorîa "$1"',
-'category-empty' => "''Pe òua sta categorîa a no contegne nisciùnn-a pàgina ò archivio moltimedia.''",
+'category-media-header' => 'Media inta categorîa "$1"',
+'category-empty' => "''Pe òua sta categorîa a no contegne pàgine ò file murtimediæ.''",
 'hidden-categories' => '{{PLURAL:$1|Categoria ascoza|Categorie ascoze}}',
 'hidden-category-category' => 'Categorîe ascôse',
 'category-subcat-count' => "{{PLURAL:$2|Sta categoria a contegne sôlo 'na sottocategoria, chi de segoito.|Sta categoria a contegne {{PLURAL:$1|a sottocategoria indicâ|e $1 sottocategorie indicæ}} di segoito, pe in totale de $2.}}",
 'category-subcat-count-limited' => "'Sta categorîa a contegne {{PLURAL:$1|ûnn-a sottocategorîa, indicaa|$1 sottocategorîe, indicæ}} chì inzû.",
-'category-article-count' => "{{PLURAL:$2|Sta categoria a contegne sôlo inna pagina, chi de segoito.|Sta categoria a contegne {{PLURAL:$1|a pàgina a l'é|e $1 pàgine son}} de segoito, pe in totale de $2.}}",
+'category-article-count' => "{{PLURAL:$2|Questa categoria a contegne solo sta pagina chì.|Questa categoria a contegne {{PLURAL:$1|a pagina indicâ|e $1 pagine indicæ}} chì de sotta , insce 'n totale de $2.}}",
 'category-article-count-limited' => "'Sta categorîa a contegne {{PLURAL:$1|'sta paggina|'ste $1 paggine}}.",
-'category-file-count' => "{{PLURAL:$2|Sta categoria a contegne sôlo in file, chi de segoito.|Sta categoria a contegne {{PLURAL:$1|o file o l'é|e $1 file son}} de segoito, pe in totale de $2.}}",
+'category-file-count' => "{{PLURAL:$2|Sta categoria a contegne sôlo sto file.|{{PLURAL:$1|Sto file o l'é|Sti $1 file son}} inte sta categoria, pe in totale de $2.}}",
+'category-file-count-limited' => 'Questa categoria a contegne {{PLURAL:$1|o file indicao|i $1 file indicæ}} chi de sotta.',
 'listingcontinuesabbrev' => 'cont.',
+'index-category' => 'Paggine indiçizzæ',
 'noindex-category' => 'Pàgine sénsa indiçe',
+'broken-file-category' => 'Paggine con di colegamenti a di file che no ghe son',
 
 'about' => 'Informaçioìn',
 'article' => 'Pagina de i contenùi',
 'newwindow' => "(O s'arve inte 'n âtro barcon)",
 'cancel' => 'Scancella',
 'moredotdotdot' => 'De ciû...',
-'mypage' => 'A mea pagina',
-'mytalk' => 'Mæ discuscioin',
+'morenotlisted' => 'Atro...',
+'mypage' => 'Paggina',
+'mytalk' => 'Discuscioin',
 'anontalk' => 'Discuscion pe questo indirisso IP',
 'navigation' => 'Navegaçión',
 'and' => '&#32;e',
 
 # Cologne Blue skin
 'qbfind' => 'Attrêuva',
+'qbbrowse' => 'Navvega',
 'qbedit' => 'Cangia',
 'qbpageoptions' => "Opsioîn de 'sta paggina",
 'qbmyoptions' => 'E mæ paggine',
 'qbspecialpages' => 'Pagine speçiä',
 'faq' => 'Domande frequenti',
+'faqpage' => 'Project:Domande frequente',
 
 # Vector skin
 'vector-action-addsection' => 'Azónzi discusción',
 'vector-action-delete' => 'Scancella',
 'vector-action-move' => 'Mescia',
-'vector-action-protect' => 'Protezzi',
+'vector-action-protect' => 'Protezi',
+'vector-action-undelete' => 'Recuppera',
+'vector-action-unprotect' => 'Cangia a proteçion',
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Càngia',
 'vector-view-history' => 'Fanni védde a Stöia',
@@ -250,8 +284,9 @@ $messages = array(
 'namespaces' => 'Namespaces',
 'variants' => 'Diferense',
 
+'navigation-heading' => 'Menu de navegaçion',
 'errorpagetitle' => 'Erô',
-'returnto' => 'Tornâ a $1.',
+'returnto' => 'Torna a $1.',
 'tagline' => 'Da {{SITENAME}}',
 'help' => 'Agiùtto',
 'search' => 'Çerca',
@@ -260,8 +295,9 @@ $messages = array(
 'searcharticle' => 'Vanni',
 'history' => 'Stöia da pàgina',
 'history_short' => 'Stöia',
+'updatedmarker' => 'modificâ da-a mæ urtima vixita',
 'printableversion' => 'Verscion da stanpâ',
-'permalink' => 'Inganso fisso',
+'permalink' => 'Ingancio fisso',
 'print' => 'Stampa',
 'edit' => 'Càngia',
 'create' => 'Crea',
@@ -269,42 +305,56 @@ $messages = array(
 'create-this-page' => "Crea 'sta paggina",
 'delete' => 'Scancella',
 'deletethispage' => "Scassa 'sta paggina",
-'protect' => 'Proteze',
-'protect_change' => 'cangiâ',
+'undelete_short' => 'Recuppera {{PLURAL:$1|una revixon|$1 revixoin}}',
+'protect' => 'Protezi',
+'protect_change' => 'cangia',
 'protectthispage' => "Proteze 'sta paggina.",
 'unprotect' => 'Càngia proteçión',
 'unprotectthispage' => 'Càngia a proteçión de sta paggina',
 'newpage' => 'Nêuva pàgina',
-'talkpage' => 'Paggina de discûxon',
+'talkpage' => 'Paggina de discuscion',
 'talkpagelinktext' => 'Ciæti',
 'specialpage' => 'Pagina speçiâ',
 'personaltools' => 'Strùmenti personâli',
+'postcomment' => 'Noeuva seçion',
 'articlepage' => 'Veddi a voxe',
 'talk' => 'Ciæti',
 'views' => 'Vìxite',
 'toolbox' => 'Arneixi',
+'userpage' => 'Veddi a paggina utente',
 'projectpage' => 'Veddi a pagina de o progetto',
+'imagepage' => 'Vizualizza a paggina do file',
+'mediawikipage' => 'Vizualizza o messaggio',
+'templatepage' => 'Vizualizza o modello',
+'viewhelppage' => "Vizualizza a paggina d'agiutto",
+'categorypage' => 'Veddi a paggina da categoria',
 'viewtalkpage' => 'Veddi o ciæto',
 'otherlanguages' => 'In âtre lengóe',
-'redirectedfrom' => '(Rediritto da $1)',
+'redirectedfrom' => '(Rendirissou da $1)',
 'redirectpagesub' => 'Paggina de rindirissamento',
 'lastmodifiedat' => "Sta pagina a l'è stæta cangiâ l'urtima votta a e $2 do $1.",
 'viewcount' => "'Sta paggina a l'è stæta vista {{PLURAL:$1|solo 'na vòtta|$1 vòtte}}.",
-'protectedpage' => 'Paggina protea',
+'protectedpage' => 'Paggina protetta',
 'jumpto' => 'Vanni a:',
 'jumptonavigation' => 'Navegaçión',
 'jumptosearch' => 'çerca',
+'view-pool-error' => "Scuza ma a-o momento i server sono stracarreghi.
+Troppi utenti çercan d' amiâ sta paggina.
+Aspeta quarche menuto primma de çercâ torna d'accede a sta pagina.
+
+$1",
+'pool-errorunknown' => 'Aro sconosciuo',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Informaçioìn in sciô {{SITENAME}}',
 'aboutpage' => 'Project:Informaçioìn',
 'copyright' => 'O contegnûo o se peu trovâ a $1.',
-'copyrightpage' => "{{ns:project}}:Diritti d'autô",
+'copyrightpage' => "{{ns:project}}:Driti d'autô",
 'currentevents' => 'Atualitæ',
 'currentevents-url' => 'Project:Atualitæ',
-'disclaimers' => 'Avértense',
+'disclaimers' => 'Avertense',
 'disclaimerpage' => 'Project:Avertense generâli',
-'edithelp' => "Agiùtto pe l'ediçion",
+'edithelp' => 'Agiùtto',
 'edithelppage' => 'Help:Modiffica',
 'helppage' => 'Help:Contegnûi',
 'mainpage' => 'Pàgina prinçipâ',
@@ -313,17 +363,24 @@ $messages = array(
 'portal' => 'Pòrtego da comunitæ',
 'portal-url' => 'Project:Pòrtego da comunitæ',
 'privacy' => 'Politica in sci dæti privæ',
-'privacypage' => 'Project:Leze in sci dæti privæ',
+'privacypage' => 'Project:Politica in scî dæti privæ',
 
 'badaccess' => "No ti g'hæ o permisso",
 'badaccess-group0' => "No ti g'hæ o permisso pe fâ quest'assion.",
-'badaccess-groups' => "L'assion che ti vêu fâ a l'è permissa solo a i ûtenti de ûn di grûppi $1.",
+'badaccess-groups' => "L'assion che ti vêu fâ a l'è permissa solo a i ûtenti {{PLURAL:$2|do gruppo|de un de sti gruppi}}: $1.",
+
+'versionrequired' => 'Ghe voeu a verscion $1 de MediaWiki',
+'versionrequiredtext' => "Pe doeuviâ sta paggina ghe voeu a verscion $1 do software MediaWiki. Amia [[Special:Version|l'appoxita paggina]].",
 
 'ok' => "D'accòrdio",
 'retrievedfrom' => 'Estræto da "$1"',
 'youhavenewmessages' => "Ti gh'æ $1 ($2).",
 'newmessageslink' => 'Nêuvi messaggi',
-'newmessagesdifflink' => 'Differensa co-a revixon preçedente',
+'newmessagesdifflink' => 'urtima modiffica',
+'youhavenewmessagesfromusers' => "Ti g'hæ $1 da {{PLURAL:$3|un atro utente|$3 utenti}} ($2).",
+'youhavenewmessagesmanyusers' => "Ti g'hæ $1 da tanti utenti ($2).",
+'newmessageslinkplural' => '{{PLURAL:$1|un noeuvo messaggio|noeuvi messaggi}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|urtima modifica|urtime modifiche}}',
 'youhavenewmessagesmulti' => "Ti t'æ neuvi messaggi in scia $1",
 'editsection' => 'Càngia',
 'editold' => 'càngia',
@@ -334,30 +391,45 @@ $messages = array(
 'toc' => 'Indiçe',
 'showtoc' => 'Fâ vedde',
 'hidetoc' => 'Asconde',
+'collapsible-collapse' => 'Comprimmi',
+'collapsible-expand' => 'Espandi',
+'thisisdeleted' => 'Amia o ripristina $1?',
 'viewdeleted' => 'Vedde $1?',
+'restorelink' => '{{PLURAL:$1|una modifica scancelâ|$1 modifiche scancelæ}}',
+'feedlinks' => 'Feed:',
+'feed-invalid' => 'Modalitæ de sottoscriçion do feed non vallida.',
 'site-rss-feed' => 'Feed RSS de $1',
 'site-atom-feed' => 'Feed Atom de $1',
 'page-rss-feed' => 'Feed RSS pe "$1"',
 'page-atom-feed' => 'Feed Atom pe "$1"',
 'red-link-title' => '$1 (ancon da scrîve)',
+'sort-descending' => 'Ordine decrescente',
+'sort-ascending' => 'Ordine crescente',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Pàgina',
 'nstab-user' => 'Utente',
+'nstab-media' => 'File murtimediâ',
 'nstab-special' => 'Pàgina speçiâ',
 'nstab-project' => 'Paggina de servissio',
 'nstab-image' => 'Archivio',
+'nstab-mediawiki' => 'Messaggio',
 'nstab-template' => 'Template',
 'nstab-help' => 'Agiûtto',
 'nstab-category' => 'Categorîa',
 
 # Main script and global functions
-'nosuchactiontext' => "L'URL a no corisponde a 'n comando reconosciûo da-o software MediaWiki",
+'nosuchaction' => 'No se poeu',
+'nosuchactiontext' => "L'açion specificâ inta URL a no l'è vallida.
+O che t'hæ scrito mâ, o che donque l'ea sbaliou o colegamento.
+O magara gh'è 'na cammoa into software doeuviou da {{SITENAME}}.",
+'nosuchspecialpage' => "Sta paggina speciale a no gh'è",
 
 # General errors
 'error' => 'Errô',
 'databaseerror' => 'Errô da a base de i dæti',
 'readonly' => 'Database bloccòu',
+'enterlockreason' => "Scrivi o motivo do blocco, e 'na stimma de quande o saiâ rimosso",
 'missing-article' => "O database o no l'à trovòu o testo di 'na pàgina che ghe saiêiva dovûa êse  co-o nómme de \"\$1\" \$2.
 
 Spésse vòtte questo o sucede quande a vegne riciamâ, da stöia ò dò-u confronto tra revixioìn, in colegaménto a 'na pàgina scancelâ, a in confronto tra revixioìn che no ghe son ciù ò a in confronto tra revixioìn sénsa ciù a stöia.
@@ -372,98 +444,134 @@ Pe favô ti peu segnalâ quello che l'é sucesso a in [[Special:ListUsers/sysop|
 'badarticleerror' => "L'açion che ti te veu fâ a non l'è permissa in sta pagina.",
 'cannotdelete' => 'Non çe peu scassâ a pagina o o papê. (o peu ese za stæto scassoö da quarchedun ätro).',
 'badtitle' => "O tìtolo o no l'è corretto.",
-'badtitletext' => "O tittolo da paggina çercâa o l'è vêuo, sballiòu o con caratteri no accettæ, oppûre o deriva da 'n errô inti collegamenti tra scîti Wiki diversci o verscioîn in léngue diversce do mæximo scîto.",
+'badtitletext' => "O tittolo da paggina çercâ o l'è vêuo, sballiòu o con caratteri no accettæ, oppû o deriva da 'n errô inti collegamenti inter-lengoa o inter-wiki.",
 'viewsource' => 'Veddi a fonte',
 'protectedpagetext' => "'Sta paggina a l'è stæta protezûa pe impedîghe a modiffica.",
 'viewsourcetext' => "O l'è poscibbile vedde e copiâ o còddice sorgente de 'sta paggina:",
+'customjsprotected' => "No ti gh'æ i permessi pe cangiâ sta pagina de JavaScript percose a contegne e impostaçioin personæ de 'n atro utente",
+'ns-specialprotected' => 'No se pœu modificâ e paggine speciali',
+'titleprotected' => "A creaçion de 'na paggina con sto tittolo a l'è stæta bloccâ da [[User:$1|$1]].
+A raxon a l'è: ''$2''.",
+'exception-nologin' => "No t'ê introu",
+'exception-nologin-text' => "Pe sta paggina ò sta açion ti gh'æ da effettuâ l'accesso inte sta wiki.",
+
+# Virus scanner
+'virus-scanfailed' => 'scansion fallia (codice $1)',
+'virus-unknownscanner' => 'antivirus sconosciuo:',
 
 # Login and logout pages
 'yourname' => 'Nomme',
 'yourpassword' => 'Pòula segretta:',
-'yourpasswordagain' => 'Scrivi tórna a pòula segrétta:',
-'remembermypassword' => 'Aregòrda a mæ login in sto navegatô (pe in mascìmo de $1 {{PLURAL:$1|giórno|giórni}})',
+'yourpasswordagain' => 'Riscrivi a pòula segrétta:',
+'remembermypassword' => 'Aregòrda a mæ login in sto navegatô (pe in mascimo de $1 {{PLURAL:$1|giórno|giórni}})',
 'yourdomainname' => 'Indirisso do scito:',
+'password-change-forbidden' => 'No ti peu cangiâ poula segretta in questa wiki.',
 'login' => 'Intra',
 'nav-login-createaccount' => 'Intra / Registrate',
-'loginprompt' => 'Ti devi avéi i cookie abilitæ into teu navigatô pe intrâ in {{SITENAME}}.',
-'userlogin' => 'Intra / Registrate',
+'loginprompt' => "Pe fâ l'accesso inte {{SITENAME}} ti g'hæ da  abilitâ i cookie.",
+'userlogin' => 'Intra / Registrite',
+'userloginnocreate' => 'Intra',
 'logout' => 'Sciorti',
 'userlogout' => 'Sciorti',
-'nologin' => "No ti gh'æ ancon l'aceizo? '''$1'''.",
-'nologinlink' => "Creâ 'n account",
+'notloggedin' => "No t'ê introu",
+'nologin' => "No ti gh'æ ancon in acesso? '''$1'''.",
+'nologinlink' => "Creâ 'n' utensa",
 'createaccount' => "Crea 'n nêuvo account",
-'gotaccount' => "Ti ghe l'æ za 'n conto d'aceizo? '''$1'''.",
+'gotaccount' => "Ti ghe l'æ za 'n' utensa? '''$1'''.",
 'gotaccountlink' => 'Intra',
-'userlogin-resetlink' => "T'æ ascordòu i teu dæti de aceizo?",
+'userlogin-resetlink' => "T'æ ascordòu i teu dæti de acesso?",
+'createaccountreason' => 'Raxon:',
 'badretype' => "E paròlle d'ordine che t'hæ scrîo son despægie.",
-'userexists' => "O nomme d'ûtente inserîo o l'è zà in ûso.<br />
-Pe piaxei prêuva a scellie 'n âtro.",
+'userexists' => "O nomme ûtente inserîo o l'è za doeuviao.<br />
+Çernine 'n âtro.",
 'loginerror' => "Errô inte l'accesso",
+'createaccounterror' => "Imposcibbile creâ l'account: $1",
 'noname' => "O nomme d'ûtente o l'è sballiòu.",
 'loginsuccesstitle' => 'Accesso effettuòu',
 'loginsuccess' => "'''O collegamento a-o server de {{SITENAME}} co-o nomme d'ûtente \"\$1\" o l'è attivo.'''",
 'nosuchuser' => 'No gh\'è nisciûn ûtente con quello nomme "$1". Verificâ o nomme inserîo ò creâ \'n nêuvo accesso.',
 'nosuchusershort' => 'No gh\'è nisciûn ûtente con quello nomme "$1". Verificâ o nomme inserîo.',
 'nouserspecified' => "O se deive inserî 'n nomme d'ûtente.",
+'login-userblocked' => "St'utente o l'è bloccou. Accesso negou.",
 'wrongpassword' => "Ti gh'æ scrîo 'na paròlla d'ordine sbaliâ. Tenta torna.",
 'wrongpasswordempty' => "No ti g'hæ scrîo nisciûnn-a paròlla d'ordine. Tenta torna.",
-'passwordtooshort' => "A paròlla d'ordine che ti gh'æ misso a no serve òu a l'é tròppo cûrta.
-A dêve contegnî mìnimo $1 caratteri e esse diverza da-o teu nómme utente.",
+'passwordtooshort' => 'E password devan aveighe aomanco {{PLURAL:$1|1 carattere|$1 caratteri}}.',
+'password-name-match' => "A password a dev'ese despægia da-o nomme utente.",
+'password-login-forbidden' => "L'utilizzo de sto nomme utente e password o l'è stæto proibio.",
 'mailmypassword' => "Invia 'na nêuva paròlla segrétta a-a mæ e-mail",
 'passwordremindertitle' => "Servissio Password Reminder (nêuva paròlla d'ordine temporannia) de {{SITENAME}}",
-'passwordremindertext' => "Quarchedûn (probabilmente ti, con indirisso IP \$1) o g'ha domandòu l'invîo de 'na nêuva paròlla d'ordine pe l'accesso a {{SITENAME}} (\$4).
-A paròlla d'ordine pe l'ûtente \"\$2\" a l'è stæta impostâa a \"\$3\".
-O se conseggia de fâ l'accesso quanto primma e cangiâ a paròlla d'ordine immediatamente.
-Se no ti Ã¨ stæto ti a fâ 'sta domanda, oppûre se ti g'hæ ritrovòu a têu paròlla d'ordine e no ti vêu cangiâla ciû, ti pêu ignorâ 'sto messaggio e andâ avanti Ã»sando a vegia paròlla d'ordine.",
+'passwordremindertext' => "Quarchedûn (probabilmente ti, con indirisso IP \$1) o l'ha domandòu l'invîo de 'na nêuva paròlla d'ordine pe l'accesso a {{SITENAME}} (\$4).
+A paròlla d'ordine pe l'ûtente \"\$2\" a l'è stæta impostâ a \"\$3\".
+Se conseggia de fâ l'accesso quanto primma e cangiâ a paròlla d'ordine immediatamente.
+Se no ti Ãª stæto ti a fâ 'sta domanda, oppûre se ti t'hæ ritrovòu a têu paròlla d'ordine e no ti vêu cangiâla ciû, ti pêu ignorâ 'sto messaggio e andâ avanti deuviando a vegia paròlla d'ordine.",
 'noemail' => 'No gh\'è nisciûn indirisso e-mail registròu pe l\'ûtente "$1".',
+'noemailcreate' => 'Ti devi dâ un addresso e-mail vallido.',
 'passwordsent' => "Ûnn-a nêuva paròlla d'ordine a l'è stæta inviâa a l'indirisso e-mail registròu pe l'ûtente \"\$1\".
 Pe piaxei, fa 'n accesso appenn-a ti a ghe reçeivi.",
 'blocked-mailpassword' => "O teu indirisso IP o l'è affirmoö, e pe sta razon o non se peu usâ a funscion de remandâ a pòula segretta.",
 'eauthentsent' => "'N messaggio e-mail de confermassion o l'è stæto inviòu a l'indirisso indicòu.
 Pe abilitâ l'invîo de messaggi e-mail pe quest'accesso, o se deive seguî l'istrûssioîn indicæ, coscì ti confermi che ti t'è o legittimo propietâjo de l'indirisso.",
-'acct_creation_throttle_hit' => 'O ne dispiâxe, ma ti hæ zà creòu $1 accesci. No ti pêu creâne de ciû!',
-'emailauthenticated' => "O teu indirisso de posta elettronega o l'è stæto autenticoö o $1.",
+'mailerror' => "Errô inte l'invio do messaggio: $1",
+'acct_creation_throttle_hit' => "Ne dispiâxe, ma t'hæ zà creòu $1 accesci. No ti pêu creâne ciû!",
+'emailauthenticated' => "O teu indirisso de posta elettronica o l'è stæto autenticou o $2 a $3.",
 'emailconfirmlink' => 'Conferma o teu indirisso de posta elettronega',
 'accountcreated' => 'Graçie pe esëte registroö!!!',
 'accountcreatedtext' => "Utente $1, ti te guägno l'açeiso!",
+'createaccount-title' => "Creaçion de 'n conto pe {{SITENAME}}",
+'usernamehasherror' => 'O nomme utente o no poeu contegnî di caratteri hash',
+'login-abort-generic' => "O to accesso o no l'ha avuo successo - Abortio",
 'loginlanguagelabel' => 'Lengoa: $1',
 
 # Change password dialog
-'resetpass' => 'Reverti a pòula segretta',
-'resetpass_header' => 'Reverti a pòula segretta',
+'resetpass' => 'Cangia a pòula segretta',
+'resetpass_announce' => "T'ê introu co in codiçe temporanio de l'e-mail.Pe completâ l'accesso ti devi çerne 'na neuva poula segretta chì:",
+'resetpass_header' => 'Cangia a pòula segretta do conto',
+'oldpassword' => 'Vegia poula segretta',
+'newpassword' => 'Neuva poula segretta',
 'retypenew' => "Ripette a nêuva paròlla d'ordine:",
+'resetpass_submit' => 'Çerni a poula segretta e intra',
 'resetpass_forbidden' => "No l'é poscìbile cangiâ e paròlle segrétte",
 
+# Special:PasswordReset
+'passwordreset-email' => 'Addresso e-mail:',
+'passwordreset-emailtitle' => 'Dettaggi account sciu {{SITENAME}}',
+'passwordreset-emailelement' => 'Nomme utente: $1
+Poula segretta temporannia: $2',
+
+# Special:ChangeEmail
+'changeemail-none' => '(nisciun)',
+'changeemail-cancel' => 'Annulla',
+
 # Edit page toolbar
 'bold_sample' => 'Grascetto',
 'bold_tip' => 'Grascetto',
-'italic_sample' => 'Testo in corsciva',
+'italic_sample' => 'Testo in corscivo',
 'italic_tip' => 'Corscivo',
-'link_sample' => "Nomme de l'inganço",
-'link_tip' => 'Inganço interno',
-'extlink_sample' => "http://www.example.com Nomme de l'inganço",
+'link_sample' => "Nomme de l'ingancio",
+'link_tip' => 'Ingancio interno',
+'extlink_sample' => "http://www.example.com Nomme de l'ingancio",
 'extlink_tip' => 'Colegaménto esterno (inclûdde o prefisso http:// )',
 'headline_sample' => 'Tìtolo',
 'headline_tip' => 'Tìtolo de 2° livello',
 'nowiki_sample' => 'Inserî chì o testo sensa formattaçion',
 'nowiki_tip' => 'Ignorâ a formattassion wiki',
 'image_sample' => 'Exempio.jpg',
-'image_tip' => 'Inmàgine caregâ',
+'image_tip' => 'Incorpora file',
 'media_sample' => 'Exempio.ogg',
-'media_tip' => 'Colegaménto a file moltimediale',
+'media_tip' => 'Colegaménto a file moltimediâ',
 'sig_tip' => 'Firma con data e ôa',
-'hr_tip' => 'Linnia orissontâ',
+'hr_tip' => 'Linnia orizontâ',
 
 # Edit pages
 'summary' => 'Oggetto:',
 'subject' => 'Argomento (tittolo):',
 'minoredit' => 'Cangiamento minô (m)',
-'watchthis' => 'Azzonze a-i osservæ speçiâli',
+'watchthis' => 'Metti sotta oservaçion',
 'savearticle' => 'Sarva a pàgina',
 'preview' => 'Anteprìmma',
 'showpreview' => "Veddi l'anteprimma",
 'showdiff' => 'Veddi i cangiamenti',
-'anoneditwarning' => "'''Attension:''' No ti t'hæ registròu. O têu indirisso IP o sajà misso inta stöja di cangiamenti da paggina.",
+'anoneditwarning' => "'''Attension:''' No t'ê intròu. Inta stoia di cangiamenti da paggina ghe saiâ misso o têu adresso IP.",
 'summary-preview' => 'Anteprimma oggetto:',
 'blockedtitle' => "L'utente o l'é bloccòu",
 'blockedtext' => "''''Sto nomme d'ûtente ou indirisso IP o l'è stæto bloccòu.'''
@@ -497,14 +605,14 @@ O têu blòcco ID o l'è \$5. Pe piaxei metti 'sto ID in tûtte e domande che ti
 'accmailtitle' => 'Pòula segretta spedïa',
 'accmailtext' => 'A pòula segretta pe-o utente "$1" a l\'è stæta spedïa a o indirisso $2.',
 'newarticle' => '(Nêuvo)',
-'newarticletext' => "Sto colegaménto o corisponde a 'na pàgina che ancon a no l'existe.
+'newarticletext' => "Sto colegaménto o corisponde a 'na pàgina ch'a no l'existe ancon.
 
-Se o se vêu creâ a pàgina òua, o se pêu comensâ a scrive o testo into spàçio vêuo chì sotta.
-(fâ riferimento a-e [[{{MediaWiki:Helppage}}|paggine d'agiûtto]] pe ciû informaçioìn).
+Se se vêu creâ a pàgina òua, se pêu comensâ a scrive into spàçio chì sotta.
+(amia e [[{{MediaWiki:Helppage}}|paggine d'agiûtto]] pe ciû informaçioìn).
 
-Se t'ê intròu inte sto colegaménto pe sbàlio, o basta sciaccâ '''Inderê''' into navegatô.",
+Se t'ê intròu chì pe sballio,  sciacca '''Inderê''' into navegatô.",
 'noarticletext' => "Inte sto momento a pagina çercâ a l'è vêua. O l'è poscibbile [[Special:Search/{{PAGENAME}}|çercâ 'sto tittolo]] inte âtre pagine do scîto opû [{{fullurl:{{FULLPAGENAME}}|action=edit}} cangiâ a pagina òua].",
-'noarticletext-nopermission' => "Òua a pàgina çercâ a l'è vêua. O l'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte âtre pàgine do scîto opû [{{fullurl:{{FULLPAGENAME}}|action=edit}} cangiâ a pàgina òua].",
+'noarticletext-nopermission' => "Òua a pàgina çercâ a l'è vêua. L'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte di âtre pàgine do scîto o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri corelæ]</span>, ma no ti gh'hæ i outorizzaçioin pe creâ sta paggina.",
 'previewnote' => "'''Questa chì a l'è solo 'n'anteprimma; i cangiamenti no son ancon stæti sarvæ!'''",
 'editing' => 'Modiffica de $1',
 'editingsection' => 'Càngio de $1 (seçión)',
@@ -514,24 +622,24 @@ Se t'ê intròu inte sto colegaménto pe sbàlio, o basta sciaccâ '''Inderê'''
 Se no ti veu che i testi teu pêuan esse modificæ da quarchedùn sensa limitaçioìn, no mandâli a {{SITENAME}}.<br />
 Inviando o testo ti diciâri, sott'a teu responsabilitæ, ch'o l'é stæto scrîto da ti personalmente oppure ch'o l'é stæto piggiòu da 'na fonte de pùbrico domìnio òu anàlogamente lìbea.<br />
 '''NO INVI MATERIÂLE COVERTO DA DRÎTI D'AUTÔ SENSA OUTORIZAÇION!'''",
-'templatesused' => '{{PLURAL:$1|Template adêuviòu|Template adêuviæ}} in sta pàgina:',
+'templatesused' => '{{PLURAL:$1|Template dêuviòu|Template dêuviæ}} in sta pàgina:',
 'templatesusedpreview' => "Template dêuviæ inte 'st'anteprimma:",
 'template-protected' => '(protezûo)',
 'template-semiprotected' => '(semiprotezûo)',
-'hiddencategories' => "Sta pàgina a l'é de {{PLURAL:$1|1 categoria ascoza|$1 categorie ascoze}}:",
+'hiddencategories' => 'Sta pàgina a fa parte de {{PLURAL:$1|1 categoria ascoza|$1 categorie ascoze}}:',
 'nocreatetext' => "A poscibilitæ de creâ nêuve paggine insce {{SITENAME}} a l'è stæta limitâ solo a-i ûtenti registræ.
 O se pêu tornâ inderê e modificâ 'na paggina escistente, oppûre [[Special:UserLogin|intrâ ò creâ 'n accesso nêuvo]].",
-'permissionserrorstext-withaction' => "No t'æ i permìssi pe $2 pe {{PLURAL:$1|sta raxon|ste raxoìn}}:",
-'recreate-moveddeleted-warn' => "Atençión: o se sta pe ricreâ 'na pàgina zà scancelâ into passòu.'''
+'permissionserrorstext-withaction' => "No ti g'hæ i permìssi pe $2 pe {{PLURAL:$1|sta raxon|ste raxoìn}}:",
+'recreate-moveddeleted-warn' => "Atençión: ti stæ pe ricreâ 'na pàgina zà scancelâ into passòu.'''
 
-O se deive consciderâ se o l'è davéi coretto continoâ  a cangiâ 'sta pàgina.
-E cancellaçioìn e mesciaménti son publicæ chì sotta:",
-'moveddeleted-notice' => "Sta pàgina a l'é stæta cancelâ.
-E scancelaçioìn e mescaménti son riportæ chi pe informaçión.",
+Consciddera se l'è o caxo de continoâ  a cangiâ 'sta pàgina.
+Pe comoditæ e cancellaçioìn e i stramui son pubricæ chì sotta:",
+'moveddeleted-notice' => "Sta pàgina a l'é stæta scancelâ.
+A lista de scancelaçioìn e di stramui son riportæ chi de sotta pe informaçión.",
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''Atento:''' a dimensción di template che t'æ misso l'é tròppo grànde.
-Quàrcheùn di teu template no saiâ azónto.",
+'post-expand-template-inclusion-warning' => "'''Atento:''' a dimensción di template che t'æ misso a l'é tròppo grande.
+Quarchedun di teu template o no saiâ incluzo.",
 'post-expand-template-inclusion-category' => "Pàgine con di template che gh'àn a dimensción ciù âta do limite mascimo",
 'post-expand-template-argument-warning' => "'''Atençión:''' sta pàgina a contegne un ò ciù argomenti di template che son tròppo gràndi pe êse espansi. Sti argomenti no saiàn fæti védde.",
 'post-expand-template-argument-category' => 'Pàgine con di template che ghe mancàn di argoménti',
@@ -547,7 +655,7 @@ A razon dæta a l'è ''$2''",
 'currentrev' => 'Verscion attuâle',
 'currentrev-asof' => 'Ùrtima revixón de-e $1',
 'revisionasof' => 'Verscion do $1',
-'revision-info' => 'Verscion do $1, outô: $2',
+'revision-info' => 'Verscion do $1 de $2',
 'previousrevision' => '← Verscion meno recente',
 'nextrevision' => 'Revixon ciù nêuva →',
 'currentrevisionlink' => 'Ûrtima revixon',
@@ -556,9 +664,9 @@ A razon dæta a l'è ''$2''",
 'last' => 'Ûrtima',
 'page_first' => 'primma',
 'page_last' => 'ûrtima',
-'histlegend' => "Confronto tra verscioîn: selessionâ e cascette corispondenti a-e verscioîn descideræ e schissâ Inviâ oppûre o pomello lì sotta.
+'histlegend' => "Confronto tra verscioîn: selession-a e cascette corispondenti a-e verscioîn dexidiæ e schissa Invio oppû o pomello da basso.
 
-Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a verscion preçedente, '''m''' = modiffica minô",
+Legenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a verscion precedente, '''m''' = modiffica minô",
 'history-fieldset-title' => 'Véddi a stöia',
 'history-show-deleted' => 'Sôlo scancelæ',
 'histfirst' => 'Prìmmo',
@@ -583,7 +691,7 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'lineno' => 'Linia $1:',
 'compareselectedversions' => 'Confronta e verscioîn selessionæ',
 'editundo' => 'Anùlla',
-'diff-multi' => '({{PLURAL:$1|Inna revixión intermedia|$1 revixioìn intermedie}} de {{PLURAL:$2|un utente|$2 utenti}} no son mostræ)',
+'diff-multi' => '({{PLURAL:$1|Inna revixón intermedia|$1 de revixoìn intermedie}} de {{PLURAL:$2|un utente|$2 utenti}} no son mostræ)',
 
 # Search results
 'searchresults' => 'Resultati da reçerca',
@@ -596,8 +704,8 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'nextn-title' => 'Pròscimo $1 {{PLURAL:$1|rezoltato|rezoltati}}',
 'shown-title' => 'Fanni védde {{PLURAL:$1|in rizoltato|$1 rizoltati}} pe pàgina',
 'viewprevnext' => 'Veddi ($1 {{int:pipe-separator}} $2) ($3).',
-'searchmenu-exists' => "'''In sciô scîto l'existe za 'na pàgina co-o nómme \"[[:\$1]]\"'''",
-'searchmenu-new' => 'Crea la pagina "[[:$1]]" su questo sito',
+'searchmenu-exists' => "'''Inte questa wiki gh'è za 'na pàgina co-o nómme \"[[:\$1]]\"'''",
+'searchmenu-new' => 'Crea a pagina "[[:$1]]" insce questo scito',
 'searchhelp-url' => 'Help:Contegnûi',
 'searchprofile-articles' => 'Pàgina di contegnûi',
 'searchprofile-project' => 'Pàgine de agiùtto e relative a-o progetto',
@@ -614,15 +722,15 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'search-redirect' => '(redirect $1)',
 'search-section' => '(seçión $1)',
 'search-suggest' => 'Fòscia ti voéivi: $1',
-'searchrelated' => 'relativi',
+'searchrelated' => 'corelæ',
 'searchall' => 'tùtti',
 'showingresultsheader' => "{{PLURAL:$5|Rizoltato '''$1''' di '''$3'''|Rizoltati '''$1 - $2''' de '''$3'''}} pe '''$4'''",
-'search-nonefound' => 'Mi no ò trovòu nìnte',
+'search-nonefound' => "Mi n'ho atrovòu ninte",
 'powersearch' => 'Çerca',
 
 # Preferences page
 'preferences' => 'Preferençe',
-'mypreferences' => 'Mæ preferense',
+'mypreferences' => 'Preferençe',
 'changepassword' => 'Cangiâ a pòula segretta',
 'skin-preview' => 'Anteprimma',
 'prefs-datetime' => 'Data e oùa',
@@ -643,8 +751,8 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'badsiglength' => "O nommeaggio o l'é tròppo lóngo; o dêve avéi meno de $1 caratteri.",
 'email' => 'Posta elettronega',
 'prefs-help-realname' => '* Nomme vëo (opsionâ): se o se scellie de scrivilo, o sajà dêuviòu pe ascrivighe a paternitæ di contegnûi inviæ.',
-'prefs-help-email' => "L'emal a no l'é obligatöia, ma a teu peu permette de reçéive a paròlla segrétta se ti t'ascòrdi.",
-'prefs-help-email-others' => 'Ti ti peu ascì scélie de lasciâ che i âtri te contâtino da-e teu pàgine utente ò de discoscioìn sénsa revelâ a teu indentitæ.',
+'prefs-help-email' => "L'email a no l'é obligatöia, ma a te permette de reçéive a paròlla segrétta se ti l'ascòrdi.",
+'prefs-help-email-others' => 'Ti ti peu scélie ascì de lasciâ che i âtri te contattan via e-mail co-in ingancio da-a to pàgina utente ò de discoscion sénsa rivelâ a to e-mail quande i atri utenti te contattan.',
 
 # Groups
 'group-user' => 'Ûtenti',
@@ -663,23 +771,23 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|modiffica|modiffiche}}',
 'recentchanges' => 'Ùrtimi cangiamenti',
-'recentchanges-legend' => 'Inpostaçioìn de lìùrtimi cangiaménti',
+'recentchanges-legend' => 'Opçioin di ùrtimi cangiaménti',
 'recentchanges-summary' => "Questa pàgina a g'ha di càngi ciù reçenti a-i contegnûi do scîto.",
 'recentchanges-feed-description' => "Questo feed o g'ha di cangiaménti ciù reçenti a-i contegnûi do scîto.",
 'recentchanges-label-newpage' => "Sto cangiaménto o l'à creòu 'na pàgina nêuva",
 'recentchanges-label-minor' => 'Cangiamento minô (m)',
 'recentchanges-label-bot' => "Sto cangiaménto o l'à fæto in bot",
 'recentchanges-label-unpatrolled' => "Sto cangiaménto o no l'é stæto ancón verificòu",
-'rcnote' => "De segoito {{PLURAL:$1|l'é elencâ o cangiménto ciù reçente|son elencæ e '''$1''' cangiménti ciù reçenti}} a-o scîto {{PLURAL:$2|inte ùrtime 24 ôe|inti ùrtimi '''$2''' giórni}}; i dæti son agiornæ a-e $5 do $4.",
-'rcnotefrom' => "Chì sotta gh'è i cangiamenti fæti comensando da '''$2''' (scinn-a '''$1''').",
-'rclistfrom' => 'Fanni vedde e modiffiche apportæ partendo da $1',
+'rcnote' => "Chì sotta {{PLURAL:$1|l'é elencou o cangiaménto ciù reçente|son elencæ i '''$1''' cangiaménti ciù reçenti}} a-o scîto {{PLURAL:$2|inte ùrtime 24 ôe|inti ùrtimi '''$2''' giorni}}; i dæti son agiornæ a-e $5 do $4.",
+'rcnotefrom' => "Chì sotta gh'è i cangiamenti fæti comensando da '''$2''' (scin a '''$1''').",
+'rclistfrom' => 'Fanni vedde e modiffiche apportæ partindo da $1',
 'rcshowhideminor' => '$1 cangiaménti minoi',
 'rcshowhidebots' => '$1 bot',
 'rcshowhideliu' => '$1 utenti registræ',
 'rcshowhideanons' => '$1 utenti anonnimi',
 'rcshowhidepatr' => '$1 i cangiaménti controllæ',
 'rcshowhidemine' => '$1 i mæ cangiamenti',
-'rclinks' => 'Fâ vedde i $1 cangiménti ciù reçenti fæte inti ùrtimi $2 giorni<br />$3',
+'rclinks' => 'Fanni vedde i $1 cangiaménti ciù reçenti fæti inti ùrtimi $2 giorni<br />$3',
 'diff' => 'diff',
 'hist' => 'stö',
 'hide' => 'Ascondi',
@@ -688,8 +796,8 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'rc_categories_any' => 'Quarsevêuggia',
-'rc-enhanced-expand' => 'Fanni védde detàli (con JavaScript)',
-'rc-enhanced-hide' => 'Ascondi detàli',
+'rc-enhanced-expand' => 'Fanni védde detaggi (serve JavaScript)',
+'rc-enhanced-hide' => 'Ascondi detaggi',
 
 # Recent changes linked
 'recentchangeslinked' => 'Cangiamenti correlæ',
@@ -697,17 +805,17 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'recentchangeslinked-toolbox' => 'Cangiaménti corelæ',
 'recentchangeslinked-title' => 'Modiffiche correlæ a "$1"',
 'recentchangeslinked-noresult' => 'Nisciûn cangiamento a-e paggine collegæ into periodo speçificòu.',
-'recentchangeslinked-summary' => "Sta pàgina a fa védde i cangiaménti ciù reçenti a-e pàgine colegæ a quésta.
+'recentchangeslinked-summary' => "Sta pàgina a fa védde i cangiaménti ciù reçenti a-e pàgine colegæ a questa.
 E pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] son in '''grascetto'''.",
 'recentchangeslinked-page' => 'Nómme da pàgina:',
 'recentchangeslinked-to' => 'Fanni védde sôlo i cangiaménti a-e pàgine colegæ a-a pàgina specificâ',
 
 # Upload
-'upload' => "Caregâ 'n archivio",
+'upload' => "Carrega 'n file",
 'uploadbtn' => "Carega 'n archivvio",
-'uploadlogpage' => 'Log di archivi caregæ',
+'uploadlogpage' => 'Log di file caregæ',
 'filename' => 'Nomme do papê',
-'filedesc' => 'Detàli',
+'filedesc' => 'Detaggi',
 'filesource' => 'Reixe:',
 'uploadedfiles' => 'Papê caregæ',
 'badfilename' => 'O nomme do papê o l\'è stæto cangioö in "$1".',
@@ -715,7 +823,7 @@ E pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] s
 [[$1|thumb]]",
 'fileexists-forbidden' => 'Un papê co sto nomme o existe de zà, pe piaxei vanni in derrê e carega sto papê co un ätro nomme. [[File:$1|thumb|center|$1]]',
 'savefile' => 'Sarva o papê',
-'uploadedimage' => 'O s\'ha caregòu "[[$1]]"',
+'uploadedimage' => 'O l\'ha caregòu "[[$1]]"',
 'uploaddisabledtext' => 'In {{SITENAME}} non se peu caregâ de papê.',
 'uploadvirus' => 'O papê gha un virus!! Dettaggi: $1',
 'sourcefilename' => "Nomme do papê d'origine:",
@@ -734,24 +842,24 @@ E pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] s
 'listfiles_date' => 'Dæta',
 
 # File description page
-'file-anchor-link' => 'Archivio',
+'file-anchor-link' => 'file',
 'filehist' => "Stöia de l'archivio",
-'filehist-help' => "Sciacca inscie 'n grûppo data/ôa pe vedde l'archivio comme o se presentâva into momento indicòu.",
-'filehist-revert' => 'Repìggia',
+'filehist-help' => "Sciacca insce data/ôa pe amiâ o file comm'o s'apresentâva into momento indicòu.",
+'filehist-revert' => 'Ripristina',
 'filehist-current' => 'Corrente',
 'filehist-datetime' => 'Dæta/Ôa',
-'filehist-thumb' => 'Miniatora',
-'filehist-thumbtext' => 'Miniatora de versción de $1',
+'filehist-thumb' => 'Miniatua',
+'filehist-thumbtext' => 'Miniatua da versción de $1',
 'filehist-user' => 'Utente',
-'filehist-dimensions' => 'Dimensioîn',
+'filehist-dimensions' => 'Dimenscioin',
 'filehist-filesize' => "Dimension de l'archivvio",
 'filehist-comment' => 'Coménti',
 'imagelinks' => "Ûzo de l'archivio",
 'linkstoimage' => '{{PLURAL:$1|A segoente pàgina a contegne|E segoenti $1 pàgine contegnan}} colegaménti a-o file:',
-'nolinkstoimage' => "No gh'è nisciûnn-a pàgina collegâa con 'st'archivvio.",
+'nolinkstoimage' => "No gh'è nisciûnn-a pàgina collegâ con 'sto file.",
 'sharedupload' => "'St'archivvio o l'è condiviso; sajeiva a dî c'o pêu ese dêuviòu da ciû progetti wiki.",
-'sharedupload-desc-here' => 'Sto file o vegne da $1 e o peu êse adêuviòu inti âtri progetti.
-Chi de segoito ti peu védde a descriçión inta [$2 pàgina de descriçión do file].',
+'sharedupload-desc-here' => 'Sto file o vegne da $1 e o peu êse dêuviòu inti âtri progetti.
+Chì apreuvo ti peu védde a descriçión inta [$2 pàgina de descriçión do file].',
 'uploadnewversion-linktext' => "Carega 'na nêuva verscion de 'st'archivvio chì",
 
 # File deletion
@@ -776,7 +884,7 @@ Chi de segoito ti peu védde a descriçión inta [$2 pàgina de descriçión do
 'statistics' => 'Statistiche',
 
 'disambiguations' => 'Paggine de desambiguassion',
-'disambiguationspage' => 'Template:Dizanbigoa',
+'disambiguationspage' => 'Template:Omonimia',
 
 'doubleredirects' => 'Rindirissamenti doggi',
 
@@ -809,7 +917,7 @@ Chi de segoito ti peu védde a descriçión inta [$2 pàgina de descriçión do
 'mostcategories' => 'Voxi con ciû categorîe',
 'mostimages' => 'Immaggini con ciû collegamenti',
 'mostrevisions' => 'Voxi con ciû revixoîn',
-'prefixindex' => 'Indiçe de voxi pe létie inçiâ',
+'prefixindex' => 'Indiçe arfabetico de voxe',
 'shortpages' => 'Paggine ciû cûrte',
 'longpages' => 'Paggine ciû longhe',
 'deadendpages' => 'Paggine sensa sciortîa',
@@ -825,7 +933,7 @@ Chi de segoito ti peu védde a descriçión inta [$2 pàgina de descriçión do
 'pager-older-n' => '{{PLURAL:$1|1 ciù vêgio|$1 ciù vêgi}}',
 
 # Book sources
-'booksources' => 'Fonti',
+'booksources' => 'Fonte libraie',
 'booksources-search-legend' => 'Çerca e fonti',
 'booksources-isbn' => 'Codice ISBN:',
 'booksources-go' => 'Vànni',
@@ -870,7 +978,7 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
 # Special:ListGroupRights
 'listgrouprights-members' => '(Elenco di membri)',
 
-# E-mail user
+# Email user
 'emailuser' => "Invia 'na email a st'utente chi",
 'emailpage' => "Mandighe 'na léttia elettronega",
 'defemailsubject' => '{{SITENAME}} posta elettronega',
@@ -885,17 +993,17 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
 'emailsenttext' => "A teua lettìa elettronega a l'è stæta spèdïa.",
 
 # Watchlist
-'watchlist' => 'A mæ lista in osservassion',
-'mywatchlist' => 'Lista in oservaçion',
+'watchlist' => 'Sotta osservassion',
+'mywatchlist' => 'Sotta oservaçion',
 'watchlistfor2' => 'Pe $1 $2',
 'watchnologin' => "Non ti t'æ entroö",
 'watchnologintext' => 'Devvi [[Special:UserLogin|entrâ]] pe cangiâ a toa lista in osservaçion.',
 'addedwatchtext' => "A paggina \"[[:\$1]]\" a l'è stæta azzonta a-a pròpia [[Special:Watchlist|lista in osservaçion]]. De chì in avanti, i cangiamenti fæti a-a paggina e a-a sêu discûxon sajàn missi in lista lì; o tittolo da paggina o sajà scrîo in '''grascietto''' inta paggina di [[Special:RecentChanges|ûrtimi cangiamenti]] coscì ti o veddi megio. Se ti vêu eliminâla da-a lista in osservaçion ciû târdi, sciacca \"no seguî\" inscia barra de d'âto.",
 'removedwatchtext' => 'A paggina "[[:$1]]" a l\'è stæta scassâa da-a têu lista in osservaçion.',
-'watch' => 'Inta lista in oservaçion',
+'watch' => 'Metti sotta oservaçion',
 'watchthispage' => "Vigilâ 'sta paggina",
-'unwatch' => 'No seguî',
-'watchlist-details' => "A lista d'oservaçión speçiâle a contegne {{PLURAL:$1|inna pàgina (co-a seu pàgina de discusción)|$1 pàgine (co-e lòro pàgine de discusción)}}.",
+'unwatch' => "Leva da sott'oservaçion",
+'watchlist-details' => "A lista d'oservaçión speçiâle a contegne {{PLURAL:$1|ina pàgina (co-a seu pàgina de discusción)|$1 de pàgine (co-e so pàgine de discusción)}}.",
 'watchlistcontains' => "A lista in osservaçion g'ha $1 {{PLURAL:$1|pagine|pagina}}.",
 'wlshowlast' => 'Famme vedde e ûrtime $1 ôe $2 giorni $3',
 'watchlist-options' => 'Inpostaçioìn di oservæ speciâli',
@@ -914,10 +1022,10 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
 'delete-legend' => 'Scassa',
 'historywarning' => "Attension: A paggina c'a se sta pe scassâ a g'ha 'na cronologîa:",
 'confirmdeletetext' => "Ti stæ pe scassâ pe sempre da-o database 'na paggina ò 'n'immaggine, assemme a tûtta a sêu cronologîa. Pe cortexia, conferma che davvei ti vêu andâ avanti con quella cancellassion, che ti capisci perfettamente e conseguense de 'st'assion e che a s'adatta a-e linnie guidda stabilîe in [[{{MediaWiki:Policy-url}}]].",
-'actioncomplete' => 'Açion finïa',
+'actioncomplete' => 'Açion completâ',
 'actionfailed' => 'Açión falîa',
 'deletedtext' => 'A paggina "$1" a l\'è stæta scassâa. Consûltâ o $2 pe \'na lista de-e paggine scassæ de reçente.',
-'dellogpage' => 'Registro de-e cose scassæ',
+'dellogpage' => 'Registro de cose scassæ',
 'deletecomment' => 'Raxon:',
 'deleteotherreason' => 'Ûn âtro motivo',
 'deletereasonotherlist' => "Ûnn'âtra raxon",
@@ -932,8 +1040,8 @@ L'ûrtimo cangiamento o ghe l'à fæto [[User:$3|$3]] ([[User talk:$3|Ciæti]]).
 'revertpage' => 'E modificaçioin de [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciæti]]) son stæte eliminæ; riportæ a verscion de primma de [[User:$1|$1]]',
 
 # Protect
-'protectlogpage' => 'Protessioîn',
-'protectedarticle' => 'l\'à protetto "[[$1]]"',
+'protectlogpage' => 'Protessioin',
+'protectedarticle' => 'l\'à protetto "[[$1]]"',
 'prot_1movedto2' => '[[$1]] mesciòu a [[$2]]',
 'protect-legend' => 'Confermâ protession',
 'protectcomment' => 'Raxon:',
@@ -982,13 +1090,13 @@ $1',
 'blanknamespace' => '(Prinçipâ)',
 
 # Contributions
-'contributions' => "Contribussioìn de l'utente",
+'contributions' => 'Contribuçioin {{GENDER:$1|utente}}',
 'contributions-title' => 'Contribuçioìn de $1',
-'mycontris' => 'Mæ contribuçioin',
+'mycontris' => 'Contribuçioin',
 'contribsub2' => 'Pe $1 ($2)',
 'uctop' => '(ûrtima pe-a paggina)',
-'month' => 'Partendo da-o méize (e precedénti):',
-'year' => "Partendo da l'anno (e preçedenti):",
+'month' => 'Partindo da-o meize (e precedénti):',
+'year' => "Partindo da l'anno (e precedenti):",
 
 'sp-contributions-newbies' => 'Fanni védde sôlo e contribuçioìn di nêuvi utenti',
 'sp-contributions-newbies-sub' => 'Pe i nêuvi ûtenti',
@@ -998,25 +1106,25 @@ $1',
 'sp-contributions-talk' => 'Ciæti',
 'sp-contributions-search' => 'Riçerca contribuçioìn',
 'sp-contributions-username' => 'Indirìsso IP ò nómme utente:',
-'sp-contributions-toponly' => "Fanni védde sôlo i ùrtimi cangiaménti che son inte l'ùrtime revixioìn da pàgina",
+'sp-contributions-toponly' => "Fanni védde sôlo i cangiaménti ch'en i ùrtime revixoìn da pàgina",
 'sp-contributions-submit' => 'Çerca',
 
 # What links here
-'whatlinkshere' => 'Cöse se colega chì',
+'whatlinkshere' => 'Cöse se colega chì',
 'whatlinkshere-title' => "Pàgine c'apontàn a $1",
 'whatlinkshere-page' => 'Pàgina:',
 'linkshere' => "E pàgine segoenti apontan a '''[[:$1]]''':",
 'nolinkshere' => "Nisciùnn-a pàgina a se collega con '''[[:$1]]'''.",
-'isredirect' => 'redirect',
+'isredirect' => 'Paggina de rindirissamento',
 'istemplate' => 'Incluxon',
 'isimage' => 'Colegamento a file',
-'whatlinkshere-prev' => '{{PLURAL:$1|preçedente|preçedenti $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|precedente|precedenti $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|sûccescivo|sûccescivi $1}}',
 'whatlinkshere-links' => '← colegaménti',
-'whatlinkshere-hideredirs' => '$1 redirect',
+'whatlinkshere-hideredirs' => '$1 i rendirissamenti',
 'whatlinkshere-hidetrans' => '$1 Incluxon',
 'whatlinkshere-hidelinks' => '$1 colegaménti',
-'whatlinkshere-hideimages' => '$1 colegaménti da inmàgini',
+'whatlinkshere-hideimages' => '$1 colegaménti di file',
 'whatlinkshere-filters' => 'Filtri',
 
 # Block/unblock
@@ -1031,14 +1139,14 @@ $1',
 'anononlyblock' => 'Non ti tè registroö. Non ti peu fanni de i cangiamenti! (Registräse o non vegne ninte!)',
 'emailblock' => 'posta elettronega affermaä',
 'ipblocklist-empty' => "A lista de e affermaçioin a l'è veua.",
-'blocklink' => 'Afermaçion',
+'blocklink' => 'Blocca',
 'unblocklink' => 'sblòcca',
 'change-blocklink' => 'càngia blòcco',
 'contribslink' => 'Contribuçioìn',
 'autoblocker' => 'Affermoö automaticamente perchè o teu indirisso IP o l\'è stæto usöo da "[[User:$1|$1]]" neuvamente. A razon dæta pe affermâ $1 a l\'è stæta:
 "$2"',
 'blocklogpage' => 'Blòcchi',
-'blocklogentry' => "l'a blocòu [[$1]] pe in periodo de $2 $3",
+'blocklogentry' => 'blocòu [[$1]] pe in periodo de $2 $3',
 'blocklogtext' => "Sta chie a l'è unn-a lista de affermaçioin fæte e levæ.
 I indirissi IP affermæ automaticamente non son  consideræ.
 Veddi a [[Special:BlockList|Lista de i indirissi IP affermæ]] pe e informaçioin neuve.",
@@ -1079,7 +1187,7 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'talkexists' => "'''A paggina a l'è stæta stramûâa correttamente, ma o no l'è stæto poscibbile stramûâ a paggina de discûxon perché ghe n'è zà 'n'âtra co-o nêuvo tittolo. O se deive inserî manualmente i contegnûi de tûtte e doe.'''",
 'movedto' => 'Stramûâa a',
 'movetalk' => 'Stramûâ anche a paggina de discûxon',
-'movelogpage' => 'Lista di remesci',
+'movelogpage' => 'Lista di stramûi',
 'movereason' => 'Raxon',
 'revertmove' => 'Ristorâ',
 'delete_and_move' => 'Scassa e mescia',
@@ -1092,7 +1200,7 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 # Namespace 8 related
 'allmessages' => 'Messaggi do scistemma',
 'allmessagesname' => 'Nomme',
-'allmessagesdefault' => 'Testo di default',
+'allmessagesdefault' => 'Testo predefinio',
 'allmessagescurrent' => 'Testo corrente',
 'allmessagestext' => "Sta chie a l'è unn-a lista de messaggi do scistema in ta MediaWiki.",
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' o non ti te peu vedde, perchè '''\$wgUseDatabaseMessages''' o non l'è attivo.",
@@ -1112,20 +1220,20 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'tooltip-pt-preferences' => 'E mæ preferense',
 'tooltip-pt-watchlist' => 'A lista de-e pagine che ti æ sotta osservaçion',
 'tooltip-pt-mycontris' => 'E mæ contribuçioìn',
-'tooltip-pt-login' => "Consegiêmo a registraçión, scibén a no l'è d'òbligo.",
+'tooltip-pt-login' => "Consegemmo a registraçión, ma a no l'è obrigatoia.",
 'tooltip-pt-logout' => 'Sciortîa (logout)',
-'tooltip-ca-talk' => 'Fanni védde e discuscioìn in sca pagina.',
-'tooltip-ca-edit' => "O se pêu modificâ sta pagina. Pe piaxei scia dêuvie o pommello d'anteprìmma primma de sarvâla.",
-'tooltip-ca-addsection' => "Iniçia 'na nêuva seçión",
+'tooltip-ca-talk' => 'Discuscion riguardo a sta paggina.',
+'tooltip-ca-edit' => "Ti pêu modificâ sta paggina. Pe piaxei dêuvia o pomello d'anteprimma primma de sarvâla.",
+'tooltip-ca-addsection' => "Inça 'na seçión nêuva",
 'tooltip-ca-viewsource' => "'Sta pagina a l'è protetta, ma ti peu védde o sêu còdice sorgente.",
 'tooltip-ca-history' => 'Verscioìn précedenti da pàgina',
-'tooltip-ca-protect' => "Proteze 'sta paggina",
+'tooltip-ca-protect' => "Protezi 'sta paggina",
 'tooltip-ca-delete' => 'Scancella sta pàgina',
-'tooltip-ca-move' => "Sposta 'sta paggina (cangia tittolo)",
+'tooltip-ca-move' => "Mescia 'sta paggina (cangia tittolo)",
 'tooltip-ca-watch' => "Azónzi 'sta pagina a-a teu lista d'oservaçion",
-'tooltip-ca-unwatch' => "Levâ sta pàgina d'inta têu lista d'oservaçion speçiâ",
+'tooltip-ca-unwatch' => "Leva sta pàgina da sott'oservaçion.",
 'tooltip-search' => 'Çerca {{SITENAME}}',
-'tooltip-search-go' => "Vànni inte 'na pàgina co-o sto tìtolo, se a l'existe",
+'tooltip-search-go' => "Vànni inte 'na pàgina con sto tìtolo, s'a l'existe",
 'tooltip-search-fulltext' => 'Çerca sto testo in scie pàgine',
 'tooltip-p-logo' => 'Vìxita a pàgina prinçipâ',
 'tooltip-n-mainpage' => 'Vìxita a pagina prinçipâ',
@@ -1138,8 +1246,8 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'tooltip-t-whatlinkshere' => 'Lista de tùtte e pagine che son colegæ a sta chì.',
 'tooltip-t-recentchangeslinked' => 'Ùrtimi càngi de pàgine colegæ a quésta',
 'tooltip-feed-atom' => 'Feed Atom pe sta pàgina',
-'tooltip-t-contributions' => "Lista de-e contribûssioîn de quest'utente",
-'tooltip-t-emailuser' => "Inviâ 'n messaggio e-mail a quest'utente",
+'tooltip-t-contributions' => "Lista de contribûssioîn de quest'utente",
+'tooltip-t-emailuser' => "Invia 'n messaggio e-mail a quest'utente",
 'tooltip-t-upload' => 'Carega inmàgini ò archivi moltimedia',
 'tooltip-t-specialpages' => 'Lista de tùtte e pagine speçiâli',
 'tooltip-t-print' => 'Versción da stànpa pe sta pàgina',
@@ -1152,15 +1260,15 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'tooltip-ca-nstab-template' => 'Veddi o template',
 'tooltip-ca-nstab-help' => "Veddi a paggina d'agiûtto",
 'tooltip-ca-nstab-category' => 'Veddi a paggina da categorîa',
-'tooltip-minoredit' => 'Segnalâ comme cangiaménto minô',
+'tooltip-minoredit' => 'Marchilo comme cangiaménto minô',
 'tooltip-save' => 'Sarva i cangiaménti',
-'tooltip-preview' => 'Anteprimma de-e modiffiche (conseggiâa, primma de sarvâ!)',
-'tooltip-diff' => "Ammîa e modiffiche che ti ti gh'æ fæto a-o testo.",
+'tooltip-preview' => 'Anteprimma de modiffiche (fannila, primma de sarvâ!)',
+'tooltip-diff' => "Ammîa e modiffiche che t'æ fæto a-o testo.",
 'tooltip-compareselectedversions' => 'Amia e diferense tra e doê verscioìn seleçionæ de sta paggina chì.',
 'tooltip-watch' => "Azónzi sta pàgina a-a têu lista d'osservæ speçiâli",
 'tooltip-rollback' => "\"Rollback\" scancella i cangiaménti de sta pàgina de l'ùrtimo ch'o l'à fæto 'n càngio co-in click do ràtto",
-'tooltip-undo' => '"Anùlla" o pérmette de anulâ sto cangiaménto e arve il modolo de cangiaménto into mòddo anteprìmma. Ti peu ascì métte a raxón inte l\'ògétto do cangiaménto.',
-'tooltip-summary' => "Scrîvi 'na scintezi",
+'tooltip-undo' => '"Anùlla" o permette de anulâ sto cangiaménto e o l\'arve o modolo de cangiaménto into modalitæ anteprìmma. Ti peu ascì métte a raxón inte l\'ogetto do cangiaménto.',
+'tooltip-summary' => "Scrîvi 'na scintexi",
 
 # Stylesheets
 'common.css' => '/** o codiçe css scrïo chie o vegne azzounto in tutte e pagine */',
@@ -1177,8 +1285,8 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 'thumbsize' => 'Dimescion da a imàginetta:',
 'file-info-size' => '$1 × $2 pixel, dimenscioîn: $3, tippo MIME: $4',
 'file-nohires' => 'No ghe son verscioìn a rezoluçion ciù âta.',
-'svg-long-desc' => "archivio in formato SVG, dimenscioìn nominâli $1 × $2 pixel, dimenscioìn de l'archivio: $3",
-'show-big-image' => "Verscion d'ærta resolûxon",
+'svg-long-desc' => 'file in formato SVG, dimenscioìn nominâli $1 × $2 pixel, dimenscioin do file: $3',
+'show-big-image' => 'Verscion a ata resolûçion',
 
 # Special:NewFiles
 'newimages' => 'Gallerîa de nêuvi archivvi',
@@ -1188,12 +1296,12 @@ Inte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manual
 # Bad image list
 'bad_image_list' => "O formato o l'è coscì:
 Van conscideræ sôlo e righe che comensan co-o càratere *.
-O primmo inganso in sce ògni riga o deiv'ese 'n inganso ch'o no fonçionn-a
-L'ingansi sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pagine donde o file o pêu ese reciamòu normalmente).",
+O primmo ingancio in sce ògni riga o dev'ese 'n ingancio ch'o no fonçionn-a
+I inganci sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pagine donde o file o pêu ese reciamòu normalmente).",
 
 # Metadata
 'metadata' => 'Metadati',
-'metadata-help' => "St'archivio o contegne informaçioìn in ciù, fòscia missa da-a fotocamera ò dò-u scanner adêuviòu pe creâla ò digitalissâla. Se l'archivio o l'è stæto cangiòu, çerti detàli porieivan no corisponde a-i cangi aportæ.",
+'metadata-help' => "Sto file o contegne de informaçioìn in ciù, fòscia misse da-a fotocamera ò dò-u scansô dêuviòu pe creâla ò digitalizâla. Se o file o l'è stæto cangiòu, çerti detàggi porieivan no corisponde a-i cangi aportæ.",
 'metadata-expand' => 'Fâ vedde dettaggi',
 'metadata-collapse' => 'Asconde dettaggi',
 'metadata-fields' => "I cànpi relativi a-i metadati EXIF elencæ inte 'sto messaggio saiàn in sciâ pàgina de l'inmàgine quande a tabella di metadati a saiâ inta forma cùrta. Cómme predefinîo, i âtri cànpi saiàn ascozi.
@@ -1211,20 +1319,20 @@ L'ingansi sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pag
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-datetime' => 'Data e öa do cangiamento do papê',
 'exif-artist' => 'Autô',
 'exif-copyright' => "Diritti d'autô de",
 'exif-filesource' => 'Reixe do papê',
 
 # External editor support
-'edit-externally' => "Càngia st'archivio con 'na applicaçión esterna",
+'edit-externally' => 'Càngia sto file co-in programma esterno',
 'edit-externally-help' => 'Pe avéi ciù informaçioìn amia e [//www.mediawiki.org/wiki/Manual:External_editors istruçioìn] (in ingléize)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'Tùtti',
 'namespacesall' => 'Tùtti',
-'monthsall' => 'tùtti',
+'monthsall' => 'tutti',
 
 # Multipage image navigation
 'imgmultipageprev' => '← Pagina de primma',
@@ -1257,7 +1365,7 @@ L'ingansi sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pag
 'watchlisttools-raw' => 'Modiffica a lista in formato testo',
 
 # Core parser functions
-'duplicate-defaultsort' => 'Atençión: a ciâve de ordinaménto predefinîa "$2" va in çimma a quella de prìmma "$1".',
+'duplicate-defaultsort' => 'Atençión: a ciâve de ordinaménto predefinîa "$2" a sostitoisce quella de primma "$1".',
 
 # Special:Version
 'version' => 'Verscion',
@@ -1266,14 +1374,14 @@ L'ingansi sucescivi, in scia mæxima riga, van conscideræ comme eceçioìn (pag
 'specialpages' => 'Pagine speçiâli',
 
 # External image whitelist
-'external_image_whitelist' => " #Lasciâ sta rîga cómme a l'é<pre>
-#Inserî i pessi de esprescioìn regolari (sôlo a pàrte che va fra //) di segoito
+'external_image_whitelist' => " #Lascia sta riga comm'a l'é<pre>
+#Inseisci i pessi de esprescioìn regolari (sôlo a pàrte ch'a va fra e //) chì sotta
 #Ste chi saiàn misse a confronto co-i indirìssi URL de inmàgini esterne (hotlinked)
-#E corispondense saiàn mostrate cómme inmàgini, âtriménti saiâ mostròu sôlo in colegaménto
-#E righe che iniçian con # son consideræ coménti
-#A diferensa tra maioscole e minoscole a no l'è significatîva
+#E corispondense saiàn mostræ cómme inmàgini, donca saiâ mostròu sôlo in colegaménto
+#E righe che començan con # son conscideræ coménti
+#A diferensa tra maioscole e minoscole a no l'è scignificatîva
 
-#Inserî sovia sta rîga tùtti i frammenti de regex. Lasciâ sta rîga cómme a l'é</pre>",
+#Inseisci sovia sta rîga tùtti i frammenti de regex. Lascia sta rîga ezattamente comm'a l'é</pre>",
 
 # Special:Tags
 'tag-filter' => 'Filtra pe [[Special:Tags|etichetta]]:',
index eaf2125..e99297e 100644 (file)
@@ -495,7 +495,7 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
 # Special:ListGroupRights
 'listgrouprights-members' => '(nõtkõmd nimkēra)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Sōtõgid sīen kȭlbatijizõn e-kēra',
 
 # Watchlist
index bc88182..2566cbf 100644 (file)
@@ -132,8 +132,6 @@ süi titul dai sezziún (JavaScript)',
 'tog-enotifrevealaddr' => "Lassa vedè 'l mè indirizz e-mail int i messagg d'avis",
 'tog-oldsig' => 'Anteprima de la firma esistenta:',
 'tog-fancysig' => 'Trata la firma cume test wiki (senza nissön ligam utumatich)',
-'tog-externaleditor' => "Dröva semper un prugrama da redatazión estern (dumà per espert, 'l gh'ha de besogn d'impustazión speciaj ins 'l to computer)",
-'tog-externaldiff' => 'Druvá sempar un "diff" estèrnu',
 'tog-watchlisthideown' => "Sconda i me mudifich dai pagin che a ten d'ögg",
 'tog-watchlisthidebots' => "Sconda i mudifich di bot da i pagin che a ten d'ögg",
 'tog-ccmeonemails' => 'Spedissem una copia di messagg spedii a i alter druvadur',
@@ -945,7 +943,7 @@ La descrizión sura la sua [$2 pagina de descrizión del file] l'è mustrada ch
 'listgrouprights' => 'Dirit del grüp di druvat',
 'listgrouprights-members' => '(Lista di member)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Manda un email a quel druvadur chì',
 'emailsent' => 'Messagg spedii',
 'emailsenttext' => "El messagg e-mail l'è staa spedii.",
@@ -1338,7 +1336,7 @@ I ligam che i vegnen dopu, in sü l'istessa riga, i vegnen cónsideraa di ecezi
 'namespacesall' => 'tücc',
 'monthsall' => 'tücc',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => "Cunferma l<nowiki>'</nowiki>''e-mail''",
 'confirmemail_text' => "Prima da pudé riçeef mesacc sül tò adrèss da pòsta letrònica l è neçessari verificál.
 Schiscjá ul butún che gh'è chi da sót par curfermá al tò adrèss.
@@ -1362,9 +1360,6 @@ Te riçevaree un mesacc cun deent un ligamm specjal; ti duvaree clicaa sül liga
 # Special:Version
 'version' => 'Versiun',
 
-# Special:FilePath
-'filepath' => 'Percuurz daj archivi',
-
 # Special:SpecialPages
 'specialpages' => 'Paginn special',
 
index d63187d..e29c4c0 100644 (file)
@@ -377,9 +377,6 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'powersearch-toggleall' => 'Nyɔ́nsɔ',
 'powersearch-togglenone' => 'Mɔ́kɔ́ tɛ́',
 
-# Quickbar
-'qbsettings-none' => 'Mɔ́kɔ́ tɛ́',
-
 # Preferences page
 'preferences' => 'Malúli',
 'mypreferences' => 'Malúli ma ngáí',
@@ -526,7 +523,7 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 # Special:Categories
 'categories' => 'Ndéngé',
 
-# E-mail user
+# Email user
 'emailuser' => 'Kotíndela yě mɛ́lɛ',
 'defemailsubject' => '{{SITENAME}} mokánda',
 'emailfrom' => 'útá',
@@ -703,7 +700,7 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 # Special:NewFiles
 'ilsubmit' => 'Boluki',
 
-# EXIF tags
+# Exif tags
 'exif-artist' => 'Mokeli',
 
 'exif-subjectdistancerange-2' => 'kokanga view',
index 7e9dcd7..a3898ea 100644 (file)
@@ -122,8 +122,6 @@ $messages = array(
 'tog-enotifminoredits' => 'ສົ່ງ ອີເມລ ໃຫ້ຂ້ອຍ ເວລາມີການດັດແກ້ເລັກນ້ອຍນຳ',
 'tog-enotifrevealaddr' => 'ສະແດງ ອີເມລ ຂອງຂ້ອຍ ໃນ ການແຈ້ງວ່າມີຂໍ້ຄວາມອີເມລ',
 'tog-shownumberswatching' => 'ສະແດງ ຈຳນວນຜູ້ໃຊ້ ຕິດຕາມໝ້ານີ້',
-'tog-externaleditor' => 'ໃຊ້ ເອດິດເຕີທາງນອກ ຖ້າບໍ່ມີການຕັ້ງ',
-'tog-externaldiff' => 'ໃຊ້ ສ່ວນຕ່າງທາງນອກ ຖ້າບໍ່ມີ ການກຳໜົດ',
 'tog-forceeditsummary' => 'ເຕື່ອນຂ້ອຍ ຖ້າບໍ່ໄດ້ຂຽນຫຍັງໃສ່ ຊ່ອງ ສະຫຼຸບການດັດແກ້',
 'tog-watchlisthideown' => 'ເຊື່ອງ ການດັດແກ້ໂດຍຂ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ',
 'tog-watchlisthidebots' => 'ເຊື່ອງ ການດັດແກ້ ໂດຍ ບອທ໌ ໃນລາຍການຕິດຕາມຂອງຂ້ອຍ',
@@ -687,7 +685,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:ListUsers
 'listusers-submit' => 'ສະແດງ',
 
-# E-mail user
+# Email user
 'emailuser' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້ນີ້',
 'emailpage' => 'ສົ່ງອີເມລ ຫາ ຜູ້ໃຊ້',
 'emailpagetext' => 'ຖ້າຜູ້ໃຊ້ນີ້ ຂຽນທີ່ຢູ່ອີເມລຢ່າງຖືກຕ້ອງຢູ່ການຕັ້ງຄ່າຂອງລາວ, ຟອມທາງລຸ່ມນີ້​ ຈະສົ່ງຂໍ້ຄວາມໜຶ່ງຫາທີ່ຢູ່ອີເມລນັ້ນ.
@@ -714,7 +712,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watchthispage' => 'ຕິດຕາມໜ້ານີ້',
 'unwatch' => 'ເຊົາຕິດຕາມ',
 'watchnochange' => 'ບໍ່ມີໜ້າທີ່ທ່ານຕິດຕາມໃດໆ ຖືກດັດແປງໃນໄລຍະສະແດງຂ້າງເທິງນີ້.',
-'wlheader-showupdated' => "ບັນດາ ໜ້າ ທີ່ມີການປ່ຽນແປງ ຫຼັງຈາກທີ່ທ່ານ ເຂົ້າຊົມຫຼ້າສຸດ ຈະຖືກສະແດງເປັນ ໂຕໜັງສື  '''ເຂັ້ມ'''",
+'wlheader-showupdated' => "ບັນດາ ໜ້າ ທີ່ມີການປ່ຽນແປງ ຫຼັງຈາກທີ່ທ່ານ ເຂົ້າຊົມຫຼ້າສຸດ ຈະຖືກສະແດງເປັນ ໂຕໜັງສື  '''ເຂັ້ມ'''",
 'wlshowlast' => 'ສະແດງ $1 ຊົ່ວໂມງຫຼ້າສຸດ $2 ມື້ຫຼ້າສຸດ $3',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -901,7 +899,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Metadata
 'metadata-expand' => 'ສະແດງລະອຽດຕື່ມ',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ຄວາມກ້ວາງ',
 'exif-imagelength' => 'ຄວາມສູງ',
 'exif-imagedescription' => 'ຫົວຂໍ້ຮູບ',
@@ -917,7 +915,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'namespacesall' => 'ທັງໝົດ',
 'monthsall' => 'ທັງໝົດ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'ຢືນຢັນ ທີ່ຢູ່ ອີເມລ',
 'confirmemail_pending' => 'ລະຫັດຢືນຢັນ ໄດ້ຖືກສົ່ງໄປ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ; ຖ້າ ທ່ານ ຫາກໍ່ສ້າງບັນຊີ
 , ທ່ານ ຄວນຈະລໍຖ້າໜ້ອຍໜຶ່ງ ກ່ອນຈະ ພະຍາຍາມ
@@ -962,9 +960,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:Version
 'version' => 'ສະບັບ',
 
-# Special:FilePath
-'filepath' => 'ທາງໄປຫາໄຟລ໌',
-
 # Special:SpecialPages
 'specialpages' => 'ໜ້າພິເສດ',
 
index 6f66906..0295b8e 100644 (file)
@@ -35,8 +35,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Kamukile zwa adress di meli di xete peson kwa melina notifikasyona',
 'tog-shownumberswatching' => 'Kamukile tali di kentezi sebelu',
 'tog-fancysig' => "Ro sebu e data (dicon ling'ki auto)",
-'tog-externaleditor' => "Sebelize hloli ye ng'i ektenali dauto",
-'tog-externaldiff' => 'Sebelize petuho ektenali dauto',
 'tog-showjumplinks' => 'Nyembulisize "sinkumukezi" ling\'ki',
 'tog-uselivepreview' => 'Sebelize live PendiBe (bulukezi JavaScript) (yem nca)',
 'tog-watchlisthideown' => 'Cwankekile zwa afina di zwa mukoloko di kentezi',
@@ -461,9 +459,6 @@ Informasi: (bye) = petuho a nca selt,
 'showingresultsnum' => "Kamukile {{PLURAL:$3|'''1''' ekali|'''$3''' ekalina}} di #'''$2'''.",
 'powersearch' => 'Fatukile',
 
-# Quickbar
-'qbsettings-none' => 'Ni',
-
 # Preferences page
 'preferences' => 'Petohoni di sebelu',
 'mypreferences' => 'Zwa petohoni di sebelu',
@@ -695,7 +690,7 @@ di uplodezi media.',
 'listusers-submit' => 'Kamukile',
 'listusers-noresult' => 'Ni-di sebelu.',
 
-# E-mail user
+# Email user
 'emailuser' => 'Imeli bye sebelu',
 'emailpage' => 'Imeli sebelu',
 'defemailsubject' => '{{SITENAME}} meli',
@@ -1019,7 +1014,7 @@ Xete ling'ki kwa lina sa konsidisize desepo. Petulo dimedi inlinenikusize.",
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagedescription' => 'Sebu di imegi',
 
 # External editor support
index 9b439ce..8bf794c 100644 (file)
@@ -213,8 +213,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Rodyti stebinčių naudotojų skaičių',
 'tog-oldsig' => 'Esamo parašo peržiūra:',
 'tog-fancysig' => 'Laikyti parašą vikitekstu (be automatinių nuorodų)',
-'tog-externaleditor' => 'Pagal nutylėjimą naudoti išorinį redaktorių (skirta tik ekspertams, nes reikia atitinkamai paruošti jūsų kompiuterį. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Pagal nutylėjimą naudoti išorinę skirtumų rodymo programą (tik ekspertams, nes reikia atitinkamai  paruošti jūsų kompiuterį. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Įjungti „peršokti į“ pasiekiamumo nuorodas',
 'tog-uselivepreview' => 'Naudoti tiesioginę peržiūrą (JavaScript) (Eksperimentinis)',
 'tog-forceeditsummary' => 'Klausti, kai palieku tuščią keitimo komentarą',
@@ -228,6 +226,7 @@ $messages = array(
 'tog-diffonly' => 'Nerodyti puslapio turinio po skirtumais',
 'tog-showhiddencats' => 'Rodyti paslėptas kategorijas',
 'tog-norollbackdiff' => 'Nepaisyti skirtumo atlikus atmetimą',
+'tog-useeditwarning' => 'Perspėti mane, kai palieku redagavimo puslapį, o jame yra neišsaugotų pakeitimų',
 
 'underline-always' => 'Visada',
 'underline-never' => 'Niekada',
@@ -617,7 +616,7 @@ Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
 'gotaccount' => "Jau turite paskyrą? '''$1'''.",
 'gotaccountlink' => 'Prisijunkite',
 'userlogin-resetlink' => 'Pamiršote savo prisijungimo duomenis?',
-'createaccountmail' => 'el. paštu',
+'createaccountmail' => 'Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.',
 'createaccountreason' => 'Priežastis:',
 'badretype' => 'Įvesti slaptažodžiai nesutampa.',
 'userexists' => 'Įvestasis naudotojo vardas jau naudojamas.
@@ -662,6 +661,7 @@ Prašome prisijungti vėl, kai jūs jį gausite.',
 'eauthentsent' => 'Patvirtinimo laiškas buvo nusiųstas į paskirtąjį el. pašto adresą.
 Prieš išsiunčiant kitą laišką į jūsų dėžutę, jūs turite vykdyti nurodymus laiške, kad patvirtintumėte, kad dėžutė tikrai yra jūsų.',
 'throttled-mailpassword' => 'Slaptažodžio priminimas jau buvo išsiųstas, per {{PLURAL:$1|$1 paskutinę valandą|$1 paskutines valandas|$1 paskutinių valandų}}.
+
 Norint apsisaugoti nuo piktnaudžiavimo, slaptažodžio priminimas gali būti išsiųstas tik kas {{PLURAL:$1|$1 valandą|$1 valandas|$1 valandų}}.',
 'mailerror' => 'Klaida siunčiant paštą: $1',
 'acct_creation_throttle_hit' => 'Šio projekto lankytojai, naudojantys jūsų IP adresą, sukūrė {{PLURAL:$1|$1 paskyrą|$1 paskyras|$1 paskyrų}} per paskutiniąją dieną, o tai yra didžiausias leidžiamas kiekis per šį laiko tarpą.
@@ -714,7 +714,7 @@ Jūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikin
 
 # Special:PasswordReset
 'passwordreset' => 'Atstatyti slaptažodį',
-'passwordreset-text' => 'Užpildykite šią formą, norėdami gauti el priminimas jūsų sąskaitos informaciją.',
+'passwordreset-text' => 'Užpildykite šią formą, norėdami atkurti savo slaptažodį.',
 'passwordreset-legend' => 'Atstatyti slaptažodį',
 'passwordreset-disabled' => 'Slaptažodžių atstatymai šiame wikyje išjungti.',
 'passwordreset-pretext' => '{{PLURAL:$1| | Langelyje parašykite vieną duomenų vienetų žemiau}}',
@@ -724,8 +724,15 @@ Jūs galbūt jau sėkmingai pakeitėte savo slaptažodį ar gavote naują laikin
 'passwordreset-capture-help' => 'Jei jūs čia pažymėsite, tai e-mail laiškas (su laikinuoju slaptažodžiu) bus parodytas jums prieš išsiunčiant jį naudotojui.',
 'passwordreset-email' => 'E-pašto adresas:',
 'passwordreset-emailtitle' => 'Paskyros informacija apie {{sitename}}',
-'passwordreset-emailtext-ip' => 'Kažkas (tikriausiai jūs, IP adresu $1 ) paprašė informacijos priminimas jūsų! N! sąskaitą {{sitename}} ( $4 ). Šis vartotojas {{PLURAL:$3| sąskaita | sąskaitas}} N!! N!, susijusių su šiuo e-pašto adresą!: N!! $2 ! N! N! {{PLURAL:$3| Šis laikinas slaptažodis | Šie laikini slaptažodžiai}} baigsis {{PLURAL:$5| vieną dieną | $5 dienų}} slaptažodis.! N! Jūs turėtumėte prisijungti ir pasirinkti naują. Jei kažkas padarė tai! N! prašymu, arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia! N! nori ją pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju! N! slaptažodį.',
-'passwordreset-emailtext-user' => 'Vartotojo $1 d. {{sitename}} prašoma informacija priminimas jūsų sąskaitos {{sitename}}! N! ( $4 ). Šis vartotojas {{PLURAL:$3| sąskaita | sąskaitas}}, susijusių su šiuo e-pašto adresą:! N! N! $2 ! N! N! {{PLURAL:$3| Šis laikinas slaptažodis | Šie laikini slaptažodžiai }} baigsis {{PLURAL:$5| vieną dieną | $5 dienų}} slaptažodis.! N! Jūs turėtumėte prisijungti ir pasirinkti naują. Jei kažkas padarė tai! N! prašymu, arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia! N! nori ją pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju! N! slaptažodį.',
+'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 $2
+
+{{PLURAL:$3|Šis laikinas slaptažodis |Šie laikini slaptažodžiai}} baigsis po {{PLURAL:$5|vienos dienos| $5 dienų}}. 
+
+Jū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}}
+($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} susieto su šiuo elektroniniu paštu $2. 
+
+{{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
 Laikinas slaptažodis: $2',
 'passwordreset-emailsent' => 'Priminimo laiškas buvo išsiųstas.',
@@ -938,6 +945,7 @@ Jis jau egzistuoja.',
 'defaultmessagetext' => 'Numatytasis pranešimo tekstas',
 'invalid-content-data' => 'Neleistinas turinys.',
 'content-not-allowed-here' => 'Turinys "$1" puslapyje [[$2]] nėra leistinas.',
+'editwarning-warning' => 'Palikdamas šį puslapį jūs prarasite visus padarytus pakeitimus.',
 
 # Content models
 'content-model-wikitext' => 'wikitekstas',
@@ -1211,15 +1219,6 @@ Prašome patikrinti sąrašus.',
 'search-external' => 'Išorinė paieška',
 'searchdisabled' => 'Projekto {{SITENAME}} paieška yra uždrausta. Galite pamėginti ieškoti Google paieškos sistemoje. Paieškos sistemoje projekto {{SITENAME}} duomenys gali būti pasenę.',
 
-# Quickbar
-'qbsettings' => 'Greitasis pasirinkimas',
-'qbsettings-none' => 'Nerodyti',
-'qbsettings-fixedleft' => 'Fiksuoti kairėje',
-'qbsettings-fixedright' => 'Fiksuoti dešinėje',
-'qbsettings-floatingleft' => 'Plaukiojantis kairėje',
-'qbsettings-floatingright' => 'Plaukiojantis dešinėje',
-'qbsettings-directionality' => 'Pataisyta, priklausomai nuo jūsų rašybos ir kalbos krypties',
-
 # Preferences page
 'preferences' => 'Nustatymai',
 'mypreferences' => 'Mano nustatymai',
@@ -1747,7 +1746,6 @@ Dėl saugumo, img_auth.php yra išjungtas.',
 'http-read-error' => 'HTTP skaitymo klaida.',
 'http-timed-out' => 'HTTP užklausos laikas baigėsi.',
 'http-curl-error' => 'Klaida siunčiantis URL: $1',
-'http-host-unreachable' => 'Nepavyko pasiekti URL.',
 'http-bad-status' => 'Iškilo problemų vykdant HTTP užklausą: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2147,8 +2145,8 @@ taip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąra
 'notvisiblerev' => 'Versija buvo ištrinta',
 'watchnochange' => 'Pasirinktu laikotarpiu nebuvo redaguotas nei vienas stebimas puslapis.',
 'watchlist-details' => 'Stebima {{PLURAL:$1|$1 puslapis|$1 puslapiai|$1 puslapių}} neskaičiuojant aptarimų puslapių.',
-'wlheader-enotif' => 'El. pašto priminimai yra įjungti.',
-'wlheader-showupdated' => "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
+'wlheader-enotif' => 'El. pašto priminimai yra įjungti.',
+'wlheader-showupdated' => "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
 'watchmethod-recent' => 'tikrinami naujausi stebimųjų puslapių pakeitimai',
 'watchmethod-list' => 'ieškoma naujausių keitimų stebimuose puslapiuose',
 'watchlistcontains' => 'Jūsų stebimųjų sąraše yra $1 {{PLURAL:$1|puslapis|puslapiai|puslapių}}.',
@@ -2951,13 +2949,8 @@ Leidžia pridėti atmetimo priežastį komentaruose',
 'pageinfo-category-files' => 'Failų skaičius',
 
 # Skin names
-'skinname-standard' => 'Klasikinė',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kelno mėlyna',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Mano išvaizda',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Paprasta',
 'skinname-modern' => 'Moderni',
 'skinname-vector' => 'Vektorinė',
 
@@ -3063,7 +3056,7 @@ Visos kitos nuorodos toje pačioje eilutėje yra laikomos išimtimis, t. y. pusl
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Plotis',
 'exif-imagelength' => 'Aukštis',
 'exif-bitspersample' => 'Bitai komponente',
@@ -3241,7 +3234,7 @@ Visos kitos nuorodos toje pačioje eilutėje yra laikomos išimtimis, t. y. pusl
 'exif-originalimageheight' => 'Piešinio aukštis prieš apkarpymą',
 'exif-originalimagewidth' => 'Piešinio plotis prieš apkarpymą',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nesuspausta',
 'exif-compression-2' => 'CCITT grupės 3 1-Dimensijos Modifikuotas Hafmano duomenų paleidimo ilgio kodavimas.',
 'exif-compression-3' => 'CCITT 3 grupės fakso kodavimas',
@@ -3660,13 +3653,6 @@ Jūs turėjote gauti [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public Licens
 'version-entrypoints-header-entrypoint' => 'Įėjimo taškas',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Failo kelias',
-'filepath-page' => 'Failas:',
-'filepath-submit' => 'Kelias',
-'filepath-summary' => 'Šis specialusis puslapis parašo pilną kelią iki failo.
-Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogiai su jų susietąja programa.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ieškoti dublikuotų failų',
 'fileduplicatesearch-summary' => 'Pasikartojančių failų paieška pagal jų kontrolinę sumą.',
index d51483a..46d2694 100644 (file)
@@ -595,7 +595,7 @@ Lopys, kas ir tovā [[Special:Watchlist|puorraugamūs rokstu sarokstā]] ir '''r
 'listgrouprights-members' => '(dalinīku saroksts)',
 'listgrouprights-addgroup' => 'Dalikt {{PLURAL:$2|grupu|grupys}}: $1',
 
-# E-mail user
+# Email user
 'emailuser' => 'Syuteit e-postu itam lītuotuojam',
 'emailmessage' => 'Viestejums:',
 
@@ -892,9 +892,6 @@ Puorejī lauki, piec nūklusiejuma, byus nūglobuoti.
 'version-software-product' => 'Produkts',
 'version-software-version' => 'Verseja',
 
-# Special:FilePath
-'filepath-page' => 'Fails:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Faila pasauka:',
 
index 30c4628..7bd9062 100644 (file)
@@ -19,31 +19,29 @@ $messages = array(
 'tog-hidepatrolled' => 'Siamţhat venhim tihdanglam thar zingah tilang suh',
 'tog-newpageshidepatrolled' => 'Phêk venhim phêk thar tlarah tilang suh',
 'tog-extendwatchlist' => 'A thar chauh ni lo, tihdanglamna zawng zawng tilang tùrin ralvèn kapparh rawh',
-'tog-usenewrc' => 'Tihdanglam thar belhchhan hmang rawh (JavaScript a ngai)',
+'tog-usenewrc' => 'Tihdanglam tharte leh ralvente a phêk azir zëlin tlar rawh (JavaScript a ngai)',
 'tog-numberheadings' => 'A thupuite amahin nambar inpêktir rawh',
-'tog-showtoolbar' => 'Siamţhatna hmanraw-liang tilang rawh (JavaScript a ngai)',
-'tog-editondblclick' => 'Hmehphìrin phêk siamţha rawh (JavaScript a ngai)',
-'tog-editsection' => 'Hlawm hrang siamţhatna [siamţhatna] zawmna hmangin awmtir rawh',
+'tog-showtoolbar' => 'Siamhatna hmanraw-liang tilang rawh (JavaScript a ngai)',
+'tog-editondblclick' => 'Hmehphìrin phêk siamha rawh (JavaScript a ngai)',
+'tog-editsection' => 'Hlawm hrang siamṭhatna [siamṭhatna] zawmna hmangin awmtir rawh',
 'tog-editsectiononrightclick' => 'Hlawm thupui ding-hmeh hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)',
 'tog-showtoc' => 'A chhunga thu awm te tilang rawh (thupui 3 aia tam phêk tan)',
 'tog-rememberpassword' => 'He ka rangpuifannaah hian min hre reng rawh (a rei berah ni $1  {{PLURAL:$1}})',
-'tog-watchcreations' => 'Ka phêk siamte ka ralvèn zing-ah telh rawh',
+'tog-watchcreations' => 'Ka phêk siamte leh ka taksa hlankaite ka ralvèn zing-ah telh rawh',
 'tog-watchdefault' => 'Ka phêk siamţhatte ka ralvèn zing-ah telh rawh',
-'tog-watchmoves' => 'Ka phêk sawnte ka ralvèn zing-ah telh rawh',
-'tog-watchdeletion' => 'Ka phêk nuaibo apiang ka ralvèn zingah telh rawh',
+'tog-watchmoves' => 'Ka phêk leh taksa sawnte ka ralvèn zing-ah telh rawh',
+'tog-watchdeletion' => 'Ka phêk leh taksa nuaibo apiang ka ralvèn zingah telh rawh',
 'tog-minordefault' => "Siamţhat tawh phawt chu 'tenau'-ah dah vek rawh",
 'tog-previewontop' => 'Siamţhatna bawm hmaah endikna dah rawh',
 'tog-previewonfirst' => 'Siamţhat vawi khatnaah endikna tilang rawh',
 'tog-nocache' => 'Fanna-in phêk a cache tur veng rawh',
-'tog-enotifwatchlistpages' => 'Ka ralvèn zinga phêk pakhat tihdanglam a nih apiangin e-lehkha min thawn rawh',
+'tog-enotifwatchlistpages' => 'Ka ralvèn zinga phêk emaw taksa pakhat tihdanglam a nih apiangin e-lehkha min thawn rawh',
 'tog-enotifusertalkpages' => 'Ka hmangtu-sawihona phêk tihdanglam a nihin e-lehkha min thawn rawh',
-'tog-enotifminoredits' => 'Phêk siamţhat tenauah pawh e-lehkha min thawn tho rawh',
+'tog-enotifminoredits' => 'Phêk leh taksa siamţhat tenauah pawh e-lehkha min thawn tho rawh',
 'tog-enotifrevealaddr' => 'Hriattirna email zingah ka email address pho lang rawh',
 'tog-shownumberswatching' => 'Ralvèngtu zât tilang rawh',
 'tog-oldsig' => 'Khàrna hming hman mék:',
 'tog-fancysig' => 'Khàrna hming wikithu angah ngai rawh (zawmna insiam ţül lovin)',
-'tog-externaleditor' => 'Sawi ngai lovin pawnlam siamţhatu hmang rawh (mithiam tan chauh, i khawlthluakneiah setting bîk a ngai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Sawi ngai lovin pawnlam diff hmang rawh (mithiam tan chauh, i khawlthluakneiah setting bîk a ngai. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => '"Zuan kahlên rawh" tih zawmna awmtir rawh',
 'tog-uselivepreview' => 'Endikna nung hmang rawh (JavaScript a ngai) (hei hi chhinna chauh a la ni)',
 'tog-forceeditsummary' => 'Siamţhatna ruak ka dahluh palhin min hrilh rawh',
@@ -57,10 +55,11 @@ $messages = array(
 'tog-diffonly' => 'Dnglmn hnuaiah phêk chhúng tilang suh',
 'tog-showhiddencats' => 'Pawl thuhrûkho tilang rawh',
 'tog-norollbackdiff' => 'Lumlêt hnuah dnglmn kalkan rawh',
+'tog-useeditwarning' => 'Ka phêk siam danglamna ka dahţhat theihnghilh palh chuan min hrilh rawh',
 
 'underline-always' => 'Ziah/ngei ngei',
 'underline-never' => 'Ngai lo',
-'underline-default' => 'Rängpuifanna duhdàn',
+'underline-default' => 'Vun leh rängpuifanna duhdàn',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Siamţhatna hmun hawrawp pian',
@@ -78,7 +77,7 @@ $messages = array(
 'friday' => 'Zirtawpni',
 'saturday' => 'Inrinni',
 'sun' => 'Ptn',
-'mon' => 'Thţ',
+'mon' => 'Th',
 'tue' => 'Thl',
 'wed' => 'Nil',
 'thu' => 'Nng',
@@ -111,8 +110,8 @@ $messages = array(
 'jan' => 'Pkt',
 'feb' => 'Rtk',
 'mar' => 'Vau',
-'apr' => 'Ţau',
-'may' => 'Ţmr',
+'apr' => 'au',
+'may' => 'mr',
 'jun' => 'Nkr',
 'jul' => 'Vhz',
 'aug' => 'Tţn',
@@ -145,8 +144,9 @@ $messages = array(
 'newwindow' => '(Tukverh tharah a inhawng ang)',
 'cancel' => 'Sûtna',
 'moredotdotdot' => 'Chhunzawmna...',
-'mypage' => 'Ka phêk',
-'mytalk' => 'Ka sawihona',
+'morenotlisted' => 'Tarlan loh dang...',
+'mypage' => 'Phêk',
+'mytalk' => 'Sawihona',
 'anontalk' => 'He chenhmun-IP tana sawihona',
 'navigation' => 'Fanzauna',
 'and' => '&#32;leh',
@@ -154,7 +154,7 @@ $messages = array(
 # Cologne Blue skin
 'qbfind' => 'Zawng rawh',
 'qbbrowse' => 'Fangvêl rawh',
-'qbedit' => 'Siamţhatna',
+'qbedit' => 'Siamhatna',
 'qbpageoptions' => 'He phêk hi',
 'qbmyoptions' => 'Ka phêkte',
 'qbspecialpages' => 'Phêk vohbîkte',
@@ -168,7 +168,7 @@ $messages = array(
 'vector-action-protect' => 'Venhimna',
 'vector-action-undelete' => 'Lak kir lehna',
 'vector-action-unprotect' => 'Venhimna dinhmun tidanglam rawh',
-'vector-simplesearch-preference' => 'Sawn awlsam lehzualna rawtna awmtir rawh (Vektawr vun tan chauh)',
+'vector-simplesearch-preference' => 'Zawn awlsam lehzualna rawtna awmtir rawh (Vektawr vun tan chauh)',
 'vector-view-create' => 'Siamna',
 'vector-view-edit' => 'Siamţhatna',
 'vector-view-history' => 'Hunhlui-chanchin',
@@ -178,6 +178,7 @@ $messages = array(
 'namespaces' => 'Hminghmun',
 'variants' => 'Zedang',
 
+'navigation-heading' => 'Fankualna',
 'errorpagetitle' => 'Dik lo',
 'returnto' => '$1 phekah kir leh rawh.',
 'tagline' => '{{SITENAME}} aṭangin',
@@ -224,10 +225,10 @@ $messages = array(
 'viewhelppage' => 'Ţanpuina phêk enna',
 'categorypage' => 'Pawl phêk enna',
 'viewtalkpage' => 'Sawinona en rawh',
-'otherlanguages' => 'Ţawng dangin',
+'otherlanguages' => 'awng dangin',
 'redirectedfrom' => '($1 aṭanga hruailuh a ni)',
 'redirectpagesub' => 'Hruailuhna phêk',
-'lastmodifiedat' => 'Hemi phek hi ni $1,  dar $2 khan siamţhat hnuhnun ber a ni.',
+'lastmodifiedat' => 'Hemi phek hi ni $1,  dar $2 khan siamhat hnuhnun ber a ni.',
 'viewcount' => 'He phêk hi vawi {{PLURAL:$1|khat|$1}} tlawh a ni tawh.',
 'protectedpage' => 'Phêk venhim',
 'jumpto' => 'Tah hian kal rawh:',
@@ -275,11 +276,15 @@ $1',
 'youhavenewmessages' => '($2) $1 i nei.',
 'newmessageslink' => 'thudawn thar',
 'newmessagesdifflink' => 'tihdanglam thar',
+'youhavenewmessagesfromusers' => 'Hmangtu dang {{PLURAL:$3|pakhat|$3}} hnên aṭang $1 i nei ($2)',
+'youhavenewmessagesmanyusers' => 'Hmangtu dang tamtak hnên aṭang $1 i nei nual ($2)',
+'newmessageslinkplural' => '{{PLURAL:$1|thudawn thar}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|tihdanglam}} thar',
 'youhavenewmessagesmulti' => '$1-ah thu dawn thar i nei',
-'editsection' => 'siamţhatna',
-'editold' => 'siamţhatna',
+'editsection' => 'siamhatna',
+'editold' => 'siamhatna',
 'viewsourceold' => 'A hnar enna',
-'editlink' => 'siamţhatna',
+'editlink' => 'siamhatna',
 'viewsourcelink' => 'a hnar enna',
 'editsectionhint' => 'Hemi thuhlawm hi siamţha rawh le: $1',
 'toc' => 'A chhung thute',
@@ -340,7 +345,7 @@ Zémpuiin dikhlelhna "<tt>$3: $4</tt>" a rawn khawhkïr.',
 Hei hi dnglm ţhing emaw phêk paih tawh zawmna hlui zui vanga awm a ni tlangpui. 
 
 Chumi a nih si loh chuan khawlthluakah hrik ţhalo i tawng tihna a ni ang. Khawngaihin [[Special:ListUsers/sysop|roreltu]] hnenah  a URL chiang taka sawiin hrilh rawh.',
-'missingarticle-rev' => '(siamţhatna zât: $1)',
+'missingarticle-rev' => '(siamhatna zât: $1)',
 'missingarticle-diff' => '(Diff: $1, $2)',
 'readonly_lag' => 'Database salin a pu a umphâk laiin database amahin inkhar behtir a ni.',
 'internalerror' => 'Chhunglam dik loh',
@@ -371,10 +376,10 @@ Thil zawn: $2',
 'viewsource-title' => '$1 hnar en rawh',
 'actionthrottled' => 'Thiltih upbeh a ni.',
 'actionthrottledtext' => 'Thu dukdak lo ven nan hun rei lo te chhunga vawi tam tak tih nawn phal loh a ni, i thiltih ngai i tihnawn ngun tawh lutuk avangin dan beh hrih i ni. Nakin deuhvah tum chhin leh rawh.',
-'protectedpagetext' => 'He phêk hi khawih danglam theih loh nan venhim hrih a ni.',
+'protectedpagetext' => 'He phêk hi khawih danglam theih emaw tihchingpen theih loh nana venhim hrih a ni.',
 'viewsourcetext' => 'A hnar i lachhawngin i en thei ang:',
 'viewyourtext' => "'''I siamţhatte''' chu he phêkah hian i enin i lachhawng thei ang.",
-'protectedinterface' => 'He phêk hian khawlthluak tan hmangtu-ţawng a phuhru a, hman khawloh a nih loh nan venhim hrih a ni.',
+'protectedinterface' => 'He phêk hian khawlthluak tan hmangtu-ţawng a phuhru a, hman khawloh a nih loh nan venhim hrih a ni. Lehlinna tidanglam tur emaw belh tur chuan [//translatewiki.net/ translatewiki.net], MediaWiki lehzauna hmachhawp hi i hmang dawn nia.',
 'sqlhidden' => '(SQL zawhna thuhrûk hrih a ni)',
 'cascadeprotected' => 'He phêk hi siam danglam phal a ni hrih lo, a chhan chu {{PLURAL:$1|he phêk|hêng phêk}}, "a huhova venhim" tih hmanga ven chhunga awm a nih vang a ni: 
 $2',
@@ -385,6 +390,8 @@ $2',
 'titleprotected' => 'He phêk hi hmangtu [[User:$1|$1]] siam phalsak a ni lo. A chhan hetah: "\'\'$2\'\'" hian pêk a ni.',
 'invalidtitle-knownnamespace' => 'Hming pawm loh hminghmun "$2"-a "$3" tih thu chuang.',
 'invalidtitle-unknownnamespace' => 'Hming pawm loh leh hminghmun zât hriat loh $1-a thu chuang "$2"',
+'exception-nologin' => 'I la lût lo',
+'exception-nologin-text' => 'I thiltih emaw hawn tum ti thei tur hian  he wiki-ah hian i luh a ngai',
 
 # Virus scanner
 'virus-badscanner' => "Inremdan dikhlel: Hrik thiantu hriat loh: ''$1''",
@@ -395,12 +402,16 @@ $2',
 'logouttext' => "'''I chhuak fel ta.'''
 Inziaklût kher lovin {{SITENAME}} hi i hmang chhunzawm thei ang, a nih loh vëk pawhin hmangtu hming pangngai emaw, a hming dang emawin <span class='plainlinks'>[$1 lût leh]</span> thei ang.
 I fangtu cache i thenfai hma chu phêk ţhenkhat intar lang a awm reng mai thei, i la  chhuak lo emaw tih mai tùrin.",
+'welcomeuser' => 'Chibai, $1!',
+'welcomecreation-msg' => 'I siangchan siam fel a ni ta.
+[[Special:Preferences|{{SITENAME}}-a i duhphung]] thlâk theihnghilh suh ang che.',
 'yourname' => 'Hmangtuhming:',
 'yourpassword' => 'Thurûk:',
 'yourpasswordagain' => 'Thurûk ziak nawn leh rawh le:',
 'remembermypassword' => 'He ka rangpuifanna hman mék (browser)-ah hian ka luhna (a rei berah ni {{PLURAL:$1||}}$1) min vawnsak rawh, thurûk ziah nawn ngai lo tùrin.',
 'securelogin-stick-https' => 'Luh hnuah HTTPS-ah hian chëng reng rawh.',
 'yourdomainname' => 'I ram:',
+'password-change-forbidden' => 'Hë wiki-ah hian thurûk i thlâk thei lo.',
 'externaldberror' => 'Insawifiahna felfai lo a awm lo a nih loh vëk pawhin i pawnlam siangchan tihdanglam phalsak i ni lo a ni ang.',
 'login' => 'Luhna',
 'nav-login-createaccount' => 'Luhna / siangchan siamna',
@@ -446,6 +457,7 @@ Khawngaihin tum ţha leh rawh.',
 'noemailcreate' => 'E-chenhmun dik i ziah a ngai.',
 'passwordsent' => '"$1" tana i e-chenhmun pêkah thurûk thawn a ni ta.
 I dawn hnuah i lût dawn nia.',
+'blocked-mailpassword' => 'Phêkte khawih danglam thei lo tùrin i IP hi danbeh a ni; hman khawlohna vèn nan i thurûk dawn lêt leh phalsak i ni tawh lo.',
 'mailerror' => 'e-Lehkha thawn sual: $1',
 'emailauthenticated' => 'I e-chenhmun $2, $3-ah finfiah a ni.',
 'emailnotauthenticated' => 'I e-chenhmun finfiah a la ni lo.
@@ -491,6 +503,7 @@ I thurûk i thlâk hlawhtling tawh a nih loh pawhin thurûk lailâwk i dil a ni
 
 # Special:PasswordReset
 'passwordreset' => 'Thurûk ziakţha rawh',
+'passwordreset-text' => 'I thurûk thlâk turin ahnuaia lehkha khu dah khat ang che.',
 'passwordreset-legend' => 'Thurûk ziakţha rawh',
 'passwordreset-username' => 'Hmangtu hming:',
 'passwordreset-domain' => 'Huamchin:',
@@ -510,6 +523,7 @@ Thurûk lailâwk: $2',
 'changeemail-oldemail' => 'Tùna i e-chenhmun:',
 'changeemail-newemail' => 'E-chenhmun thar:',
 'changeemail-none' => '(pakhat mah)',
+'changeemail-password' => 'I {{SITENAME}} thurûk:',
 'changeemail-submit' => 'E-chenhmun thlâk rawh',
 'changeemail-cancel' => 'Sûtna',
 
@@ -571,7 +585,7 @@ Tihsual palh thilthua heta lo lût i nih chuan i rangpuifanna-a '''letna''' fei
 Phêk dangah [[Special:Search/{{PAGENAME}}| he phêk hming hi i zawng]] thei ang, a nih loh pawhin a laichin 
 <span class="plainlinks">[{{fullurl:{{#Special:Log}} | page={{FULLPAGENAMEE}}}} chanchin-ziak dang i zawng thei ang]; a nih loh chuan [{{fullurl:{{FULLPAGENAME}}|action=edit}} he phêk hi i siamţha thei ang] </span>.',
 'noarticletext-nopermission' => 'He phêkah hian thu a la awm hrih lo.
-He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}-a a laichin chanchin dang] i zawng thei bawk ang. </span>',
+He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}-a a laichin chanchin dang] i zawng thei bawk ang,</span> mahsé hë phêk siam phalna hi i nei lo tlat thung.',
 'userpage-userdoesnotexist' => 'Hmangtu siangchan "$1" hi hriat a ni lo.
 He phêk hi siam/siamţhat emaw i duh chuan enfiah rawh.',
 'userpage-userdoesnotexist-view' => 'Hmangtu siangchan "$1" hi hriat a ni lo.',
@@ -579,6 +593,7 @@ He phêk hi siam/siamţhat emaw i duh chuan enfiah rawh.',
 I rawn atan a danbeh chhinchhiahna kan han tarlang a ni e:',
 'usercssyoucanpreview' => "'''Rawlrûk:''' I CSS fiah tùrin i dahţhat hmain \"{{int:showpreview}}\" hmehkhep hi hmang rawh.",
 'userjsyoucanpreview' => "'''Rawlrûk:''' I JavaScript thar fiah tùrin i dahţhat hmain \"{{int:showpreview}}\" hmehkhep hi hmang rawh.",
+'updated' => '(Bithuam fel a ni)',
 'note' => "'''Hriat tùr:'''",
 'previewnote' => "'''Heihi endikna chauh a ni tih hrereng ang che.'''
 I tihdanglamna dahţhat a la ni lo!",
@@ -589,10 +604,10 @@ I tihdanglamna dahţhat a la ni lo!",
 
 '''Hei hi siamṭhat tumna dànzui pangngai a nih chuan khawngaihin dahṭhat tum nawn leh rawh.'''
 I la dahṭhat theih loh cheu chuan [[Special:UserLogout|chhuah phawt ]] a, luh nawn leh hmang tein han bei vêl chhin lä.",
-'editing' => '$1 i siam(ţha) mék',
+'editing' => '$1 i siamṭha mék',
 'creating' => '$1 i siam mék',
-'editingsection' => '$1 (hlawm) i siam(ţha) mék',
-'editingcomment' => '$1 (hlawm thar) i siam(ţha) mék',
+'editingsection' => '$1 (hlawm) i siamṭha mék',
+'editingcomment' => '$1 (hlawm thar) i siam mék',
 'editconflict' => 'Siamţhat inchuh: $1',
 'yourtext' => 'I thu tah hian:',
 'storedversion' => 'Ennawnna vawnţhat',
@@ -626,6 +641,13 @@ Nuaibo a ni tawh a nih hmèl.',
 'edit-already-exists' => 'Phêk thar siam theih a ni lo.
 A awm tawh sa.',
 'defaultmessagetext' => 'Thuthawn tùr ziahsa',
+'invalid-content-data' => 'Kentel phal loh thil',
+
+# Content models
+'content-model-wikitext' => 'wikithü',
+'content-model-text' => 'thutluang',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Vaukhanna:''' Siamsa telh a lian leh lutuk.
@@ -634,6 +656,15 @@ Siamsa ţhenkhat hmaih a ni ang.",
 'post-expand-template-argument-warning' => "'''Vaukhanna:''' He phekah hian siamsa kawng kaihparh theih lenzawng nei lian leh lutuk pakhat tal a awm a ni.
 Heng kawngte hi hmaih mai tur.",
 'post-expand-template-argument-category' => 'Siamsa kawng hmaih awmna phekte',
+'parser-template-loop-warning' => 'Siamsa inthawnkual a awm tlat: [[$1]]',
+'language-converter-depth-warning' => 'Ṭawng lehna thûkzawng pèl ($1)',
+'node-count-exceeded-category' => 'Tihbawk theih chin pèl phêkte',
+'node-count-exceeded-warning' => 'Suihbawl theih chin pèl phêkte',
+'expansion-depth-exceeded-category' => 'Tihchiam theih chin pèl phêkte',
+'expansion-depth-exceeded-warning' => 'Tihchiam theih chin phêkin a pèl',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'Siangchan siam theih loh',
 
 # History pages
 'viewpagelogs' => 'He phêk chanchin hi en rawh',
@@ -668,6 +699,7 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'rev-delundel' => 'tilang/thup',
 'rev-showdeleted' => 'tihlanna',
 'revdelete-show-file-submit' => 'Aw',
+'revdelete-hide-restricted' => "Roreltute leh midangte paw'n an hmuh theih loh turin hriatna-taksa hi nuaibo rawh",
 'revdelete-radio-set' => 'Aw',
 'revdelete-radio-unset' => 'Aih',
 'revdelete-log' => 'Chhan:',
@@ -746,18 +778,9 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 Google hmangin i lo zawng hrih thei ang.
 {{SITENAME}} chhung zawnawlna hi a hlui lutuk tawh mai thei tih hria ang che.',
 
-# Quickbar
-'qbsettings' => 'Hmanrawliang',
-'qbsettings-none' => 'Pakhat mah',
-'qbsettings-fixedleft' => 'Veilam',
-'qbsettings-fixedright' => 'Dinglam',
-'qbsettings-floatingleft' => 'Veilama lang',
-'qbsettings-floatingright' => 'Dinglama lang',
-'qbsettings-directionality' => 'Bet, i ţawng inziahdàn hawzawnga zirin',
-
 # Preferences page
 'preferences' => 'Duhdàn',
-'mypreferences' => 'Ka duhdàn',
+'mypreferences' => 'Duhthlanna',
 'prefs-edits' => 'Siamţhat zât',
 'prefsnologin' => 'I la lût lo',
 'prefsnologintext' => 'Hmangtu duhdàn siam tùrin i <span class="plainlinks"> [{{fullurl:{{#Special:UserLogin}}|returnto=$1}} inziah luh] </span> a ngai.',
@@ -1388,8 +1411,8 @@ Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
 'usermessage-editor' => 'Thuthawntu khawl',
 
 # Watchlist
-'watchlist' => 'Ka ralvèn',
-'mywatchlist' => 'Ka ralvèn',
+'watchlist' => 'Ralvèn',
+'mywatchlist' => 'Ralvèn',
 'watchlistfor2' => '$1 tan $2',
 'nowatchlist' => 'Rálvèn i nei lo',
 'watchlistanontext' => 'I ralvèn en tùrin emaw siamṭha tùrin $1 rawh.',
@@ -1487,6 +1510,10 @@ $2-in a awmphung ngäiah a dahlêt leh.',
 'protect_expiry_invalid' => 'A tàwp hun i sawi kha a hman theih loh.',
 'protect_expiry_old' => 'A tàwp hun i thlan kha a thleng tawh!',
 'protect-unchain-permissions' => 'Vènhimna duhthlan dang chhuah zalenna',
+'protect-fallback' => '"$1" phalna nei hmangtute chauh remtihsakna',
+'protect-level-autoconfirmed' => 'Mahnia infinfiah hmangtute chauh remtihsakna',
+'protect-level-sysop' => 'Roreltute chauh remtihsakna',
+'protect-summary-cascade' => 'venhimchhàwnna',
 'protect-expiring' => '$1 (UTC) thleng',
 'protect-expiring-local' => '$1 thleng',
 'protect-expiry-indefinite' => 'tiamchin awm lo',
@@ -1534,9 +1561,9 @@ $2-in a awmphung ngäiah a dahlêt leh.',
 'blanknamespace' => '(Phekpui)',
 
 # Contributions
-'contributions' => 'Hmangtu kutthawhnate',
+'contributions' => '{{GENDER:$1|Hmangtu}} kutthawhnate',
 'contributions-title' => '$1 kutthawhnate',
-'mycontris' => 'Ka kutthawhnate',
+'mycontris' => 'Kutthawhnate',
 'contribsub2' => '$1 tan ($2) .',
 'nocontribs' => 'I zawn mil tihdanglamna a awm miah lo a nih hmel.',
 'uctop' => '(chung)',
@@ -1570,7 +1597,7 @@ $2-in a awmphung ngäiah a dahlêt leh.',
 'whatlinkshere-hideredirs' => 'hruailuhna $1',
 'whatlinkshere-hidetrans' => 'ziahhnante $1',
 'whatlinkshere-hidelinks' => 'zawmnate $1',
-'whatlinkshere-hideimages' => 'Thlalâk zawmna $1',
+'whatlinkshere-hideimages' => 'taksa zawmna $1',
 'whatlinkshere-filters' => 'Thlitfimna',
 
 # Block/unblock
@@ -1801,7 +1828,7 @@ A bak zawng chu thuhrûk sa vek a ni ang.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Zàuzáwng',
 'exif-imagelength' => 'Sànzáwng',
 'exif-bitspersample' => 'Péng khata mal(bit) awm zât',
index 995fd6b..c0510ca 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Admresdeserv.
  * @author Dark Eagle
  * @author FnTmLV
  * @author Geimeris
@@ -80,8 +81,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Rādīt uzraudzītāju skaitu',
 'tog-oldsig' => 'Pašreizējais paraksts:',
 'tog-fancysig' => 'Vienkāršs paraksts (bez automātiskās saites)',
-'tog-externaleditor' => 'Pēc noklusējuma izmantot ārēju programmu lapu izmainīšanai (tikai pieredzējušiem lietotājiem, lai darbotos nepieciešami speciāli uzstādījumi tavā datorā sk. [//www.mediawiki.org/wiki/Manual:External_editor šeit])',
-'tog-externaldiff' => 'Pēc noklusējuma izmantot ārēju programmu izmaiņu parādīšanai (tikai pieredzējušiem lietotājiem, lai darbotos nepieciešami speciāli uzstādījumi tavā datorā sk. [//www.mediawiki.org/wiki/Manual:External_editor šeit])',
 'tog-showjumplinks' => 'Rādīt pārlēkšanas saites',
 'tog-uselivepreview' => "Lietot tūlītējo priekšskatījumu (izmanto ''JavaScript''; eksperimentāla iespēja)",
 'tog-forceeditsummary' => 'Atgādināt man, ja kopsavilkuma ailīte ir tukša',
@@ -95,6 +94,7 @@ $messages = array(
 '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',
+'tog-useeditwarning' => 'Brīdināt mani, kad es atstāju lapas rediģēšanu nesaglabājot izmaiņas',
 
 'underline-always' => 'vienmēr',
 'underline-never' => 'nekad',
@@ -122,8 +122,8 @@ $messages = array(
 'thu' => 'Ce',
 'fri' => 'Pk',
 'sat' => 'Se',
-'january' => 'janvārī',
-'february' => 'februārī',
+'january' => 'Janvārs',
+'february' => 'Februārs',
 'march' => 'martā',
 'april' => 'aprīlī',
 'may_long' => 'maijā',
@@ -247,7 +247,7 @@ $messages = array(
 'unprotectthispage' => 'Mainīt šīs lapas aizsardzību',
 'newpage' => 'Jauna lapa',
 'talkpage' => 'Diskusija par šo lapu',
-'talkpagelinktext' => 'diskusija',
+'talkpagelinktext' => 'Diskusija',
 'specialpage' => 'Īpašā Lapa',
 'personaltools' => 'Lietotāja rīki',
 'postcomment' => 'Pievienot komentāru',
@@ -434,11 +434,18 @@ Vari turpināt to izmantot anonīmi, vari <span class='plainlinks'>[$1 atgriezti
 Ņem vērā, ka arī pēc iziešanas, dažas lapas var tikt parādītas tā, it kā tu vēl būtu iekšā, līdz tiks iztīrīta pārlūka kešatmiņa.",
 'welcomeuser' => 'Laipni lūgts, $1!',
 'yourname' => 'Tavs lietotājvārds',
+'userlogin-yourname' => 'Lietotājvārds',
+'userlogin-yourname-ph' => 'Ievadiet savu lietotājvārdu',
 'yourpassword' => 'Tava parole:',
+'userlogin-yourpassword' => 'Parole',
+'userlogin-yourpassword-ph' => 'Ievadiet savu paroli',
 'yourpasswordagain' => 'Atkārto paroli',
 'remembermypassword' => 'Atcerēties pēc pārlūka aizvēršanas (spēkā ne vairāk kā $1 {{PLURAL:$1|diena|dienas}}).',
+'userlogin-remembermypassword' => 'Atcerēties mani',
+'userlogin-signwithsecure' => 'Pieslēgties ar drošu serveri',
 'securelogin-stick-https' => 'Saglabāt HTTPS savienojumu pēc pieslēgšanās',
 'yourdomainname' => 'Tavs domēns',
+'password-change-forbidden' => 'Šajā wiki paroles nevar mainīt.',
 'externaldberror' => 'Notikusi vai nu ārējās autentifikācijas datubāzes kļūda, vai arī tev nav atļauts izmainīt savu ārējo kontu.',
 'login' => 'Pieslēgties',
 'nav-login-createaccount' => 'Izveidot jaunu lietotāju vai doties iekšā',
@@ -448,6 +455,7 @@ Vari turpināt to izmantot anonīmi, vari <span class='plainlinks'>[$1 atgriezti
 'logout' => 'Iziet',
 'userlogout' => 'Iziet',
 'notloggedin' => 'Neesi iegājis',
+'userlogin-joinproject' => 'Pievienojieties {{SITENAME}}',
 'nologin' => "Nav lietotājvārda? '''$1'''.",
 'nologinlink' => 'Reģistrējies',
 'createaccount' => 'Izveidot jaunu lietotāju',
@@ -500,6 +508,7 @@ Tādēļ šobrīd no šīs IP adreses vairs nevar izveidot jaunus kontus.',
 'emailconfirmlink' => 'Apstiprināt tavu e-pasta adresi',
 'invalidemailaddress' => 'E-pasta adrese nevar tikt apstiprināta, jo izskatās nederīga. Lūdzu ievadi korekti noformētu e-pasta adresi, vai arī atstāj to lauku tukšu.',
 'cannotchangeemail' => 'Konta e-pasta adresi nevar nomainīt šajā wiki.',
+'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}}}}',
@@ -645,7 +654,7 @@ Ja tu esi anonīms lietotājs un uzskati, ka tev ir adresēti neatbilstoši kome
 '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.
 Tu vari [[Special:Search/{{PAGENAME}}|meklēt šīs lapas nosaukumu]] citās lapās,
-vai <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} meklēt saistītus reģistru ierakstus]</span>.',
+vai <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.
 Lūdzu, pārliecinies vai vēlies izveidot/izmainīt šo lapu.',
 'userpage-userdoesnotexist-view' => 'Lietotājs "$1" nav reģistrēts.',
@@ -747,6 +756,8 @@ Izskatās, ka lapa ir dzēsta.',
 Tā jau eksistē.',
 'defaultmessagetext' => 'Noklusētais ziņojuma teksts',
 'invalid-content-data' => 'Nederīgi satura dati',
+'editwarning-warning' => 'Atstājot šo lapu tu zaudēsi izdarītās izmaiņas. 
+Ja esi pieteicies, jūs vari atspējot šo brīdinājumu savās izvēlēs sadaļā "rediģēšana"',
 
 # Content models
 'content-model-javascript' => 'JavaScript kods',
@@ -757,6 +768,8 @@ Tā jau eksistē.',
 'post-expand-template-inclusion-warning' => "'''Brīdinājums:''' iekļauto veidņu izmērs ir par lielu.
 Dažas veidnes netiks iekļautas.",
 'post-expand-template-inclusion-category' => 'Lapas, kurām pārsniegts iekļauto veidņu apjoms',
+'post-expand-template-argument-warning' => "'''Brīdinājums:''' Šī lapa satur vairāk neka vienu veidni argumentu, kas ir pārāk liels pec paplašināšanas.
+Šie argumenti ir izlaists.",
 'post-expand-template-argument-category' => 'Lapas, kurās ir izlaisti veidņu argumenti',
 'parser-template-loop-warning' => 'Veidne ir ievietota tādā pašā veidnē: [[$1]]',
 
@@ -959,13 +972,6 @@ $1",
 Pagaidām vari meklēt, izmantojot Google vai Yahoo.
 Ņem vērā, ka meklētāju indeksētais {{grammar:ģenitīvs|{{SITENAME}}}} saturs var būt novecojis.',
 
-# Quickbar
-'qbsettings' => 'Rīku joslas stāvoklis',
-'qbsettings-fixedleft' => 'Fiksēts pa kreisi',
-'qbsettings-fixedright' => 'Fiksēts pa labi',
-'qbsettings-floatingleft' => 'Peldošs pa kreisi',
-'qbsettings-floatingright' => 'Peldošs pa labi',
-
 # Preferences page
 'preferences' => 'Izvēles',
 'mypreferences' => 'Iestatījumi',
@@ -1063,6 +1069,7 @@ Norādītā parametra vērtība būs publiski pieejama.',
 'prefs-help-realname' => 'Īstais vārds nav obligāti jānorāda.
 Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (ieguldījumu {{grammar:lokatīvs|{{SITENAME}}}}).',
 'prefs-help-email' => 'E-pasta adrese nav obligāta, bet ir nepieciešama nozaudētas paroles atjaunošanai.',
+'prefs-help-email-others' => 'Jus ari variet izvelties ka citi jus var kontaktēt uz jusu lietotajā sarunas lapu, neatklājot jus identitāti.',
 'prefs-help-email-required' => 'E-pasta adrese ir obligāta.',
 'prefs-info' => 'Pamatinformācija',
 'prefs-i18n' => 'Internacionalizācija',
@@ -1448,7 +1455,6 @@ Atļauta ir tikai failu piekļuve.',
 # HTTP errors
 'http-invalid-url' => 'Nederīgs URL: $1',
 'http-read-error' => 'HTTP nolasīšanas kļūda.',
-'http-host-unreachable' => 'URL nevarēja sasniegt.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL nevarēja sasniegt',
@@ -1600,7 +1606,7 @@ Katrā rindiņā ir saites uz pirmo un otro pāradresācijas lapu, kā arī pirm
 'brokenredirects-edit' => 'labot',
 'brokenredirects-delete' => 'dzēst',
 
-'withoutinterwiki' => 'Lapas bez interwiki',
+'withoutinterwiki' => 'Lapas bez starpviki saitēm',
 'withoutinterwiki-summary' => "Šajās lapās nav saišu uz citu valodu projektiem (''interwiki''):",
 'withoutinterwiki-legend' => 'Prefikss',
 'withoutinterwiki-submit' => 'Rādīt',
@@ -1787,6 +1793,7 @@ Tā e-pasta adrese, kuru tu esi norādījis [[Special:Preferences|savā izvēļu
 # Watchlist
 'watchlist' => 'Mani uzraugāmie raksti',
 'mywatchlist' => 'Uzraugāmie raksti',
+'watchlistfor2' => 'Priekš $1 ($2)',
 'nowatchlist' => 'Tavā uzraugāmo rakstu sarakstā nav neviena raksta.',
 'watchlistanontext' => 'Lūdzu $1, lai apskatītu vai labotu savu uzraugāmo rakstu saraksta saturu.',
 'watchnologin' => 'Neesi iegājis',
@@ -1806,7 +1813,7 @@ Ja vēlāk pārdomāsi un nevēlēsies vairs uzraudzīt šo lapu, klikšķini uz
 'watchnochange' => 'Neviena no tevis uzraudzītajām lapām nav mainīta parādītajā laika posmā.',
 'watchlist-details' => '(Tu uzraugi $1 {{PLURAL:$1|lapu|lapas}}, neieskaitot diskusiju lapas.)',
 'wlheader-enotif' => 'E-pasta paziņojumi ir ieslēgti.',
-'wlheader-showupdated' => "Lapas, kuras ir tikušas izmainītas, kopš tu tās pēdējoreiz apskatījies, te rādās ar '''pustrekniem''' burtiem",
+'wlheader-showupdated' => "Lapas, kuras ir tikušas izmainītas, kopš tu tās pēdējoreiz apskatījies, te rādās ar '''pustrekniem''' burtiem",
 'watchlistcontains' => 'Tavā uzraugāmo lapu sarakstā ir $1 {{PLURAL:$1|lapa|lapas}}.',
 'iteminvalidname' => "Problēma ar '$1' vienību, nederīgs nosaukums...",
 'wlshowlast' => 'Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī $3.',
@@ -2564,7 +2571,7 @@ Pārējie lauki, pēc noklusējuma, būs paslēpti.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'platums',
 'exif-imagelength' => 'augstums',
 'exif-bitspersample' => 'biti komponentē',
@@ -2695,7 +2702,7 @@ Pārējie lauki, pēc noklusējuma, būs paslēpti.
 'exif-organisationinimage' => 'Attēlotā organizācija',
 'exif-personinimage' => 'Attēlotā persona',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nekompresēts',
 
 'exif-copyrighted-true' => 'Ar autortiesībām',
@@ -2986,6 +2993,7 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'Nezināma paplašinājuma iezīme "$1"',
+'duplicate-defaultsort' => '\'\'\'Brīdinājums:\'\'\' Noklusējuma kārtošanas atslēga "$2" ignorē kārtošanas atslēga "$1".',
 
 # Special:Version
 'version' => 'Versija',
@@ -3006,11 +3014,6 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'version-software-version' => 'Versija',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Failu adreses',
-'filepath-page' => 'Fails:',
-'filepath-submit' => 'Atrast',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Meklēt failu kopijas',
 'fileduplicatesearch-summary' => 'Meklē dublējošos failus, izmantojot uz jaucējfunkcijas vērtības.',
index 833d0ff..f3129ab 100644 (file)
@@ -177,8 +177,6 @@ $messages = array(
 'tog-shownumberswatching' => '放哨有',
 'tog-oldsig' => '覽原署名:',
 'tog-fancysig' => '署以本碼待之(免自連)',
-'tog-externaleditor' => '它器修文(高人用,需設之。[//www.mediawiki.org/wiki/Manual:External_editors 閱。])',
-'tog-externaldiff' => '它器修異(高人用,需設之。[//www.mediawiki.org/wiki/Manual:External_editors 閱。])',
 'tog-showjumplinks' => '鏈往字',
 'tog-uselivepreview' => '即覽嚐鮮(JavaScript)',
 'tog-forceeditsummary' => '漏概醒之',
@@ -490,6 +488,9 @@ $1',
 'formerror' => '有誤:表不可呈',
 'badarticleerror' => '此頁莫為之',
 'cannotdelete' => '頁或檔"$1"刪矣,不復為之。',
+'cannotdelete-title' => '刪「$1」不能也。',
+'delete-hook-aborted' => '鈎纂消矣。
+無解也。',
 'badtitle' => '無此題',
 'badtitletext' => '或別、或缺、或違、或他山謬鏈,此題不存也。',
 'perfcached' => '下為謄本,恐不新也。 A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -498,6 +499,7 @@ $1',
 函式: $1<br />
 問語: $2',
 'viewsource' => '覽源',
+'viewsource-title' => '查$1之案',
 'actionthrottled' => '無為',
 'actionthrottledtext' => '基反垃圾之量,於短時中限欲,爾之上限已過。數分後再試之。',
 'protectedpagetext' => '該頁被錮無纂也。',
@@ -523,11 +525,25 @@ $2',
 
 子可匿名還覽{{SITENAME}},或<span class='plainlinks'>[$1 復登]</span>同簿、異簿。
 未清謄本,覽器文舊,且慎之。",
+'welcomeuser' => '$1居,惠迎!',
+'welcomecreation-msg' => '子簿建矣。
+
+請更簿註乎[[Special:Preferences|此]]。',
 'yourname' => '名',
+'userlogin-yourname' => '簿名',
+'userlogin-yourname-ph' => '輸簿名',
 'yourpassword' => '符節',
+'userlogin-yourpassword' => '符節',
+'userlogin-yourpassword-ph' => '輸子符節',
+'createacct-yourpassword-ph' => '輸一符節',
 'yourpasswordagain' => '復核節',
+'createacct-yourpasswordagain' => '訂子符節',
+'createacct-yourpasswordagain-ph' => '復輸符節',
 'remembermypassword' => '吾之簿通越(達至$1日)',
+'userlogin-remembermypassword' => '記吾',
+'userlogin-signwithsecure' => '以安全伺服登簿',
 'securelogin-stick-https' => '登後仍以HTTPS通接',
+'password-change-forbidden' => '符節不能改乎此維基也。',
 'externaldberror' => '認庫之錯或禁更爾之外簿。',
 'login' => '登簿',
 'nav-login-createaccount' => '登簿、增簿',
@@ -537,17 +553,22 @@ $2',
 'logout' => '去簿',
 'userlogout' => '去簿',
 'notloggedin' => '尚未登簿',
+'userlogin-noaccount' => '無簿乎?',
+'userlogin-joinproject' => '入{{SITENAME}}',
 'nologin' => '無簿乎?往$1。',
 'nologinlink' => '增簿',
 'createaccount' => '增簿',
 'gotaccount' => '有簿矣哉?往$1。',
 'gotaccountlink' => '登簿',
 'userlogin-resetlink' => '君忘登簿所需爾?',
+'helplogin-url' => 'Help:登簿',
 'createaccountmail' => '同郵',
 'createaccountreason' => '因:',
+'createacct-benefit-body3' => '是月纂者',
 'badretype' => '符節不合也。',
-'userexists' => '簿名存矣,惠更之',
+'userexists' => '簿名存矣,惠更之',
 'loginerror' => '登簿誤然',
+'createacct-error' => '建簿未成',
 'createaccounterror' => '無增簿:$1',
 'nocookiesnew' => '{{SITENAME}}簿增而未登,惠准cookies後再登之。',
 'nocookieslogin' => '登簿{{SITENAME}}須cookies,惠准之後登。',
@@ -556,7 +577,7 @@ $2',
 'noname' => '缺簿名,或不格也。',
 'loginsuccesstitle' => '登簿成矣',
 'loginsuccess' => "'''$1'''登{{SITENAME}}矣",
-'nosuchuser' => '查無此人。',
+'nosuchuser' => '查無此人。惠請更名,或查大小寫。',
 'nosuchusershort' => '查無"$1",惠核之。',
 'nouserspecified' => '簿名須也',
 'login-userblocked' => '此簿已被封。登無簿也。',
@@ -585,6 +606,7 @@ $2',
 'emailconfirmlink' => '惠考郵驛',
 'invalidemailaddress' => '驛址不格,惠正略之。',
 'cannotchangeemail' => '電郵地址不可改于此wiki',
+'emaildisabled' => '是站不可遣函也。',
 'accountcreated' => '簿增矣',
 'accountcreatedtext' => '$1簿增矣',
 'createaccount-title' => '於{{SITENAME}}增簿',
@@ -594,11 +616,13 @@ $2',
 'usernamehasherror' => '簿名無含切細符也',
 'login-throttled' => '爾多試於此簿登中。
 請候再試之。',
+'login-abort-generic' => '登簿未成——棄',
 'loginlanguagelabel' => '語:$1',
 'suspicious-userlogout' => '爾欲無離也,可由壞瀏覽器或快枝代理呈送之。',
 
 # Email sending
 'php-mail-error-unknown' => '於 PHP mail() 參數現錯',
+'user-mail-no-addy' => '遣函豈能無址?',
 
 # Change password dialog
 'resetpass' => '變符',
@@ -1018,9 +1042,6 @@ $1",
 'search-external' => '外尋',
 'searchdisabled' => '{{SITENAME}}因性能而停用之。可Gooogle查之,乃之過時也。',
 
-# Quickbar
-'qbsettings-none' => '無',
-
 # Preferences page
 'preferences' => '簿註',
 'mypreferences' => '簿註',
@@ -1153,7 +1174,7 @@ $1",
 'userrights-no-interwiki' => '爾無權改他山wiki之簿權也。',
 'userrights-nodatabase' => '資料庫$1無存或非本地也。',
 'userrights-nologin' => '爾以有秩乲簿[[Special:UserLogin|登]]後以定簿之權也。',
-'userrights-notallowed' => '之簿無權定簿之權也。',
+'userrights-notallowed' => '之簿無權定簿之權也。',
 'userrights-changeable-col' => '爾所管轄',
 'userrights-unchangeable-col' => '非爾所轄',
 'userrights-irreversible-marker' => '$1*',
@@ -1457,7 +1478,6 @@ $1',
 'http-read-error' => 'HTTP讀錯。',
 'http-timed-out' => 'HTTP求之過時也。',
 'http-curl-error' => '取網址現錯之:$1',
-'http-host-unreachable' => '無達網址之。',
 'http-bad-status' => 'HTTP求時現問:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2395,27 +2415,16 @@ $1',
 
 # Stylesheets
 'common.css' => '/* 此之 CSS 用於全面也 */',
-'standard.css' => '/* 此之 CSS 用於經典面之簿也 */',
-'nostalgia.css' => '/* 此之 CSS 用於懷古面之簿也 */',
 'cologneblue.css' => '/* 此之 CSS 用於馨藍面之簿也 */',
 'monobook.css' => '/* 此之 CSS 用於單書面之簿也 */',
-'myskin.css' => '/* 此之 CSS 用於吾風面之簿也 */',
-'chick.css' => '/* 此之 CSS 用於窈窕面之簿也 */',
-'simple.css' => '/* 此之 CSS 用於簡明面之簿也 */',
 'modern.css' => '/* 此之 CSS 用於時髦面之簿也 */',
 'vector.css' => '/* 此之 CSS 用於動力面之簿也 */',
 'print.css' => '/* 此之 CSS 用於印之出力也 */',
-'handheld.css' => '/* 此之 CSS 用於 $wgHandheldStyle 之手置面也 */',
 
 # Scripts
 'common.js' => '/* 此之JavaScript將載於全簿之頁。 */',
-'standard.js' => '/* 此之JavaScript將載於用經典面之簿 */',
-'nostalgia.js' => '/* 此之JavaScript將載於用懷古面之簿 */',
 'cologneblue.js' => '/* 此之JavaScript將載於用馨藍面之簿 */',
 'monobook.js' => '/* 此之JavaScript將載於用單書面之簿 */',
-'myskin.js' => '/* 此之JavaScript將載於用吾風面之簿 */',
-'chick.js' => '/* 此之JavaScript將載於用窈窕面之簿 */',
-'simple.js' => '/* 此之JavaScript將載於用簡明面之簿 */',
 'modern.js' => '/* 此之JavaScript將載於用時髦面之簿 */',
 'vector.js' => '/* 此之JavaScript將載於用動力面之簿 */',
 
@@ -2441,13 +2450,8 @@ $1',
 'spam_blanking' => '審皆鏈$1,遂令白頁。',
 
 # Skin names
-'skinname-standard' => '經典',
-'skinname-nostalgia' => '懷古',
 'skinname-cologneblue' => '馨藍',
 'skinname-monobook' => '單書',
-'skinname-myskin' => '吾風',
-'skinname-chick' => '窈窕',
-'skinname-simple' => '簡明',
 'skinname-modern' => '時髦',
 'skinname-vector' => '動力',
 
@@ -2539,7 +2543,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '寬',
 'exif-imagelength' => '長',
 'exif-photometricinterpretation' => '像素構成',
@@ -2751,12 +2755,6 @@ MediaWiki乃為用之發,無擔之責也;亦無售目之默擔也。參GNU
 'version-software-product' => '品',
 'version-software-version' => '版',
 
-# Special:FilePath
-'filepath' => '檔路',
-'filepath-page' => '檔名:',
-'filepath-submit' => '往',
-'filepath-summary' => '此奇頁取一檔之整路。圖以全解像示之,他檔會以有關之程式啟動也。',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '擇重檔',
 'fileduplicatesearch-summary' => '以重檔之切去查重也。',
index 2e7155e..264a1bb 100644 (file)
@@ -508,7 +508,7 @@ Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (o
 # Special:ListGroupRights
 'listgrouprights-members' => '(makʼaturepeşi listʼe)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Maxmares e-maili oncğoni',
 
 # Watchlist
index 9169dcb..c2317b3 100644 (file)
@@ -57,8 +57,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ध्यान राखैबला प्रयोक्ताक संख्या',
 'tog-oldsig' => 'अखुनका दस्खत',
 'tog-fancysig' => 'हस्ताक्षरकें विकिटेक्सटक रूपमे देखू (स्वचालित श्रृंखला हीन)',
-'tog-externaleditor' => "↓पूर्वनिर्धारित रूपेँ बाह्य सम्पादक क' उपयोग करू (केवल विशेषज्ञसभक लेल, एकरा लेल संगणक पर विशेष सेटिंग चाही। [//www.mediawiki.org/wiki/Manual:External_editors आओर जानकारी।])",
-'tog-externaldiff' => 'पुरान संस्करणमे अंतर देखेबाक हेतु पूर्वनिविष्ट रूपमे बाहरक परिवर्तनक प्रयोग करू',
 'tog-showjumplinks' => 'करू "तड़पान" भेटैबला लिंक सभ',
 'tog-uselivepreview' => 'करू चल पूर्वावलोकन (जावास्क्रिप्ट चाही) (प्रायोगिक)',
 'tog-forceeditsummary' => 'हमरा सचेत करू जखन हम खाली सम्पादम सारांशमे जाइ',
@@ -1038,15 +1036,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 अहाँक गूगलक माध्यमसँ ऐ बीच ताकि सकै छी।
 मोन राखू जे तकर विवरणी {{अन्तर्जाल}} सामिग्री समयातीत भऽ सकैए।',
 
-# Quickbar
-'qbsettings' => 'त्वरित दृश्य',
-'qbsettings-none' => 'कोनो नै',
-'qbsettings-fixedleft' => 'वाम कात सटल',
-'qbsettings-fixedright' => 'दहिन दिस सटल',
-'qbsettings-floatingleft' => 'वाम कात घुमैत',
-'qbsettings-floatingright' => 'दहिन कात घुमैत',
-'qbsettings-directionality' => 'कीलित, अहाँक भाषाक लिपि दिशा-निर्देशपर आधारित',
-
 # Preferences page
 'preferences' => 'विकल्प',
 'mypreferences' => 'खासमखास',
@@ -1554,7 +1543,6 @@ $1',
 'http-read-error' => 'परिसंविद पठन भ्रम',
 'http-timed-out' => 'परिसंविद आग्रह कालातीत',
 'http-curl-error' => 'भ्रम निकालैबला सार्वत्रिक विभव संकेत:$1',
-'http-host-unreachable' => 'सार्वत्रिक विभव संकेत नै पाबि सकल',
 'http-bad-status' => 'परिसंविद आग्रह काल एकटा समस्या छल: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1945,8 +1933,8 @@ $1',
 'notvisiblerev' => 'कोनो दोसर प्रयोक्ता द्वारा कएल अन्तिम परिवर्तन मेटा देल गेल',
 'watchnochange' => 'अहाँक साकांक्ष सूचीमे सँ कोनोमे ऐ अवधिमे सम्पादन नै कएल गेल।',
 'watchlist-details' => '{{PLURAL:$1|$1 पन्ना|$1 पन्ना सभ}} अहाँक साकांक्षसूचीमे, चौबटिया पन्ना नै गानल गेल।',
-'wlheader-enotif' => 'ई-पत्र सूचना लागू अछि।',
-'wlheader-showupdated' => "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
+'wlheader-enotif' => 'ई-पत्र सूचना लागू अछि।',
+'wlheader-showupdated' => "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
 'watchmethod-recent' => 'साकांक्ष सूचीक हालक सम्पादन जाँचि रहल छी',
 'watchmethod-list' => 'साकांक्ष-सूचीक हालक सम्पादनकेँ देखि रहल छी',
 'watchlistcontains' => 'अहाँक साकांक्ष-सूचीमे अछि $1 {{PLURAL:$1|पन्ना|पन्ना}}।',
@@ -2679,9 +2667,6 @@ $1 एकर प्रतिबन्धक कारण अछि : "$2"',
 'pageinfo-authors' => 'भिन्न लेखक संख्या',
 
 # Skin names
-'skinname-standard' => 'प्राचीन',
-'skinname-nostalgia' => 'गामसँ प्रेम',
-'skinname-simple' => 'साधारण',
 'skinname-modern' => 'आधुनिक',
 'skinname-vector' => 'सदिश',
 
@@ -2770,8 +2755,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-cn' => 'cn',
@@ -2806,7 +2789,7 @@ Variants for Chinese language
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौड़ाई',
 'exif-imagelength' => 'ऊँच',
 'exif-bitspersample' => 'प्रति भाग अष्टक',
@@ -2985,7 +2968,7 @@ Variants for Chinese language
 'exif-originalimageheight' => 'काटहि सें पहिने तस्वीरक ऊँचाई',
 'exif-originalimagewidth' => 'काटहि सें पहिने तस्वीरक चौड़ाई',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'असम्पीडित',
 'exif-compression-2' => 'सी.सी.आइ.टी.टी. वर्ग ३ १ - बीम संशोधित हफमैन कूट सोझ लम्बाइ',
 'exif-compression-3' => 'सी.सी.आइ.टी.टी. वर्ग ३ फैक्स संकूट',
@@ -3396,13 +3379,6 @@ $5
 'version-software-product' => 'उत्पाद',
 'version-software-version' => 'संस्करण',
 
-# Special:FilePath
-'filepath' => 'संचिकाक रस्ता',
-'filepath-page' => 'संचिका',
-'filepath-submit' => 'जाऊ',
-'filepath-summary' => 'ई विशेष पन्ना संचिकाक पूर्ण रस्ता देखबैत अछि।
-चित्र सभ पूर्ण आकारमे देखाएल जाइत अछि, दोसर संचिका प्रकार चालित होइए सोझे सम्बन्धित संविधि द्वारा।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'द्वितीयक संचिका ताकू',
 'fileduplicatesearch-summary' => 'हैश मानक आधारपर द्वितीयक संचिका ताकू।',
index 8df81a7..2ecfa20 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Bawoor
  * @author Slamet Serayu (on map-bms.wikipedia.org)
  * @author StefanusRA
  * @author לערי ריינהארט
@@ -45,8 +46,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tidhokna jumlah pangawas',
 'tog-oldsig' => 'Tapak asma sekiye:',
 'tog-fancysig' => 'Tapak asma dianggep dadi teks wiki (ora nganggo pranala otomatis)',
-'tog-externaleditor' => 'Gunakna editor eksternal secara gawan (kanggo sing ahli thok, perlu pengaturan mligi nang komputere rika. [//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkape.])',
-'tog-externaldiff' => 'Gunakna diff eksternal secara gawan (kanggo sing ahli thok, perlu pengaturan mligi nang komputere rika. [//www.mediawiki.org/wiki/Manual:External_editors Informasi selengkape.])',
 'tog-showjumplinks' => 'Aktifna pranala pitulung "mlumpat maring"',
 'tog-uselivepreview' => 'Gunakna pratayang langsung (mbutuhna JavaScript) (egin jajalan)',
 'tog-forceeditsummary' => 'Emutna inyong anggere durung ngisi kotak ringkesan suntingan',
@@ -185,7 +184,7 @@ $messages = array(
 'errorpagetitle' => 'Kasalahan',
 'returnto' => 'Bali maring $1.',
 'tagline' => 'Sekang {{SITENAME}}',
-'help' => 'Rewang',
+'help' => 'Réwang',
 'search' => 'golet tulisan',
 'searchbutton' => 'Goleti',
 'go' => 'golet',
@@ -291,7 +290,7 @@ Deleng [[Special:Version|kaca versi]].',
 'viewsourcelink' => 'deleng sumbere',
 'editsectionhint' => 'Sunting bagian: $1',
 'toc' => 'Isi',
-'showtoc' => 'tidokna',
+'showtoc' => 'tidhokna',
 'hidetoc' => 'umpetna',
 'collapsible-collapse' => 'Umpetna',
 'collapsible-expand' => 'Tidokna',
@@ -588,12 +587,12 @@ Tembung sandhi sauntara: $2',
 'summary' => 'Ringkesan:',
 'subject' => 'Subyek/judhul:',
 'minoredit' => 'Kiye suntingan cilik',
-'watchthis' => 'Awasana kaca kiye',
+'watchthis' => 'Awasi kaca kiyé',
 'savearticle' => 'Simpen',
 'preview' => 'Pra tayang',
 'showpreview' => 'Pra tayang',
 'showlivepreview' => 'Pratayang langsung',
-'showdiff' => 'Deleng beda',
+'showdiff' => 'Ndeleng bedané',
 'anoneditwarning' => 'Rika ora kadaftar mlebu.
 Alamat IP-ne Rika bakal dicatet nang sajarah panyuntingane kaca kiye.',
 'anonpreviewwarning' => "''Rika durung mlebu log. Nyimpen kaca bakal nyatetna alamat IP-ne Rika nang riwayat suntingan kaca kiye.''",
@@ -909,15 +908,6 @@ Jajal aweh awalan ''all:'' kanggo nggolèti kabèh isi (kalebu kaca dhiskusi, ci
 Rika teyeng nggoleti nganggo Google disit.
 Ningen Rika kudu eling nek indeks Google kanggo {{SITENAME}} bisa baen isine anu sing lawas lan durung dianyari.',
 
-# Quickbar
-'qbsettings' => 'Pangaturan bar pintas',
-'qbsettings-none' => 'Ora ana',
-'qbsettings-fixedleft' => 'Tetep sisih kiwa',
-'qbsettings-fixedright' => 'Tetep sisih tengen',
-'qbsettings-floatingleft' => 'Ngambang sisih kiwa',
-'qbsettings-floatingright' => 'Ngambang sisih tengen',
-'qbsettings-directionality' => 'Tetep, ngetutna maring bentuk skrip sekang basane Rika',
-
 # Preferences page
 'preferences' => 'Preferensi',
 'mypreferences' => 'Preferensi',
@@ -1200,7 +1190,7 @@ Aja kuatir, alamat imele Rika ora ditidokna dong pangganggo sejen ngontak Rika.'
 'diff' => 'bédane',
 'hist' => 'versi',
 'hide' => 'Umpetna',
-'show' => 'Tidokna',
+'show' => 'Tidhokna',
 'minoreditletter' => 'c',
 'newpageletter' => 'A',
 'boteditletter' => 'b',
@@ -1471,12 +1461,12 @@ Rika teyeng mbatesi tampilan kanthi milih jinis log, jeneng panganggo (sensitif
 'emailuserfooter' => 'Layang kiye dikirimna sekang $1 ming $2 nggunakna fungsi "Layangpanganggo" nang {{SITENAME}}.',
 
 # Watchlist
-'watchlist' => 'Daftar pangawasane inyong',
-'mywatchlist' => 'Daptar pangawasane inyong',
+'watchlist' => 'Daftar sawangané inyong',
+'mywatchlist' => 'Daftar sawangané inyong',
 'watchlistfor2' => 'Kanggo $1 $2',
 'watch' => 'Pantau',
 'unwatch' => 'Batalna pantauan',
-'watchlist-details' => 'Ana {{PLURAL:$1|$1 kaca|$1 kaca}} nang daftar pangawasane Rika, ningen ora ngitung kaca dhiskusi.',
+'watchlist-details' => 'Ana {{PLURAL:$1|$1 kaca|$1 kaca}} nang daftar pangawasané Rika, ningèn kaca dhiskusiné ora mélu diétung.',
 'wlshowlast' => 'Tidokna $1 jam $2 dina $3 pungkasan',
 'watchlist-options' => 'Opsi daftar pangawasan',
 
@@ -1754,7 +1744,7 @@ Sing liyane bakal diumpetna sacara ''default''.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-lightsource' => 'Sumber cahya',
 
 'exif-meteringmode-6' => 'Sebagiyan',
index e96b255..283a85f 100644 (file)
@@ -173,8 +173,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Няфтемс мъзяра сувсида конат арафтозь лопать эсь мельгеваномазост',
 'tog-oldsig' => 'Афкуксонь кядьтяшкс',
 'tog-fancysig' => 'Кядьтяшкст улихть викитекстокс (эслек тиеви сюлмафксфтома)',
-'tog-externaleditor' => 'Нолдамс тевс ушеширень петнить мъзярс илякс изь мярьгов (аньцек тевонь содайхненди, сяс мес эрявихть башка кядьёнкст-арафнемат содама машинаса [//www.mediawiki.org/wiki/Manual:External_editors сяда тов.])',
-'tog-externaldiff' => 'Нолдамс тевс ушеширень програм верзиень ваксс путоманкса мъзярс илякс изь мярьгов (аньцек тевонь содайхненди, сяс мес эрявихть башка кядьёнкст-арафнемат содама машинаса[//www.mediawiki.org/wiki/Manual:External_editors сяда тов.])',
 'tog-showjumplinks' => 'Мярьгомс "юпадемс" сатовома сюлмафкстненди',
 'tog-uselivepreview' => 'Максомс эряй васень няфтемась (JavaScript) (Варжамань)',
 'tog-forceeditsummary' => 'Няфтемс мондине мезе сёрмадомс шава петнема вальмас сувамста',
@@ -1042,14 +1040,6 @@ $3 макссь туфталсь - ''$2''",
 'search-external' => 'Ушеширень вешендема',
 'searchdisabled' => '{{SITENAME}}-са тяни вешендемась аш. Ули кода вешендемс Google эли иля вешендемань интернет програпнень вельде. Шарфтк мяльце тостонь {{SITENAME}}-нь потмонц верзиец, улема, сирелгодсь.',
 
-# Quickbar
-'qbsettings' => 'Навигациень седяфкс',
-'qbsettings-none' => 'Аф няфтемс',
-'qbsettings-fixedleft' => 'Кержи шири киртьф',
-'qbsettings-fixedright' => 'Види шири киртьф',
-'qbsettings-floatingleft' => 'Кержи ширеса уенди',
-'qbsettings-floatingright' => 'Виде ширеса уенди',
-
 # Preferences page
 'preferences' => 'Арафнематне',
 'mypreferences' => 'Монь латцемане',
@@ -1732,8 +1722,8 @@ $3 макссь туфталсь - ''$2''",
 'notvisiblerev' => 'Верзиесь нардафоль',
 'watchnochange' => 'Мезеге изь полафтов тонь мельгеванома лувомастот тя пингеёткса.',
 'watchlist-details' => '{{PLURAL:$1|$1 лопа|$1 лопат}} мельгеваномацень ала корхнема лопат аф лувомок.',
-'wlheader-enotif' => 'Электрононь сёрма вельде пачфнема нолдаф тевс.',
-'wlheader-showupdated' => "Лопат конань полафтозь тонь мекольце сувсемадот меле няфтевсть '''эчке тяшкса'''.",
+'wlheader-enotif' => 'Электрононь сёрма вельде пачфнема нолдаф тевс.',
+'wlheader-showupdated' => "Лопат конань полафтозь тонь мекольце сувсемадот меле няфтевсть '''эчке тяшкса'''.",
 'watchmethod-recent' => 'мельге ванома ала лопатнень коряс мекольце петнематнень ванондома',
 'watchmethod-list' => 'мекольце петнематнень коряс мельге ванома ала лопат ванондома',
 'watchlistcontains' => 'Тонь мельгеваномасот $1 {{PLURAL:$1|лопа|лопат}}.',
@@ -2426,7 +2416,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Келец',
 'exif-imagelength' => 'Серец',
 'exif-bitspersample' => 'Битт фкя компонентс',
@@ -2540,7 +2530,7 @@ $1',
 'exif-gpsdatestamp' => 'GPS ши',
 'exif-gpsdifferential' => 'GPS диференциень петнема',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Аф компрезияф',
 
 'exif-unknowndate' => 'Аф содаф шись',
@@ -2832,13 +2822,6 @@ $5
 'version-software-product' => 'Нолдафкс',
 'version-software-version' => 'Верзие',
 
-# Special:FilePath
-'filepath' => 'Файлти ян',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Ян',
-'filepath-summary' => 'Тя башка тевонь лопась няфнесы сембе янць файлти.
-Архтофксне няфневихть сембе синь кувалмосост, иля файлонь сортсна нолдавихть видеста програпнень вельде конат сотфт мархтост.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Вешендемс кафонзаф файлхне',
 'fileduplicatesearch-summary' => 'Вешендемс кафонзаф файлхнень хэш-кодонь лувкс коряс.',
index f43f755..eccb360 100644 (file)
@@ -247,8 +247,6 @@ $messages = array(
 'tog-shownumberswatching' => "Asehoy ny isan'ny mpikambana manara-maso ny pejy",
 'tog-oldsig' => "Topi-mason'ny sonia :",
 'tog-fancysig' => 'Sonia tsotra (tsy misy rohy)',
-'tog-externaleditor' => "Hampiasa mpanova soratra ivelany (ho an'ny mpikambana havanana ihany, mila fampifanarahana manokana eo amin'ny mpikajinao [//www.mediawiki.org/wiki/Manual:External_editors Fampahalalana fanampiny.])",
-'tog-externaldiff' => "Hampiasa mpampitaha ivelany (ho an'ny mpikambana havanana ihany, mila fampifanarahana manokana eo amin'ny mpikajinao [//www.mediawiki.org/wiki/Manual:External_editors Fampahalalana fanampiny.])",
 'tog-showjumplinks' => 'Ampiasao ny rohy "handeha eto"',
 'tog-uselivepreview' => 'Ampesao ny topi-maso maikamaika (mila Javascript) (mbola am-panandramana)',
 'tog-forceeditsummary' => 'Teneno ahy ra tsy nametraka ny ambangovangony',
@@ -325,6 +323,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'january-date' => '$1 Janoary',
+'february-date' => '$1 Febroary',
+'march-date' => '$1 Martsa',
+'april-date' => '$1 Aprily',
+'may-date' => '$1 Mey',
+'june-date' => '$1 Jiona',
+'july-date' => '$1 Jolay',
+'august-date' => '$1 Aogositra',
+'september-date' => '$1 Septambra',
+'october-date' => '$1 Oktobra',
+'november-date' => '$1 Novambra',
+'december-date' => '$1 Desambra',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Sokajy|Sokajy}}',
@@ -350,6 +360,7 @@ $messages = array(
 'newwindow' => '(sokafy anaty takila hafa)',
 'cancel' => 'Aoka ihany',
 'moredotdotdot' => 'Tohiny...',
+'morenotlisted' => 'Tohiny tsy voalisitra...',
 'mypage' => 'Pejy',
 'mytalk' => 'Dinika',
 'anontalk' => "Resaka ho an'io adiresy IP io",
@@ -373,7 +384,7 @@ $messages = array(
 'vector-action-protect' => 'Arovy',
 'vector-action-undelete' => 'Avereno',
 'vector-action-unprotect' => 'Hanala ny fiarovana',
-'vector-simplesearch-preference' => "Alefa ny soso-kevitra mikasika ny fikarohana (ho an'ny Vector ihany)",
+'vector-simplesearch-preference' => "Hampiasa ny bara fikarohana notsorina (ho an'ny skin Vector ihany)",
 'vector-view-create' => 'Foronona',
 'vector-view-edit' => 'Hanova',
 'vector-view-history' => 'Hijery ny tantara',
@@ -469,7 +480,7 @@ $1',
 
 'badaccess' => 'Tsy manana alàlana',
 'badaccess-group0' => 'Tsy afaka manantontosa ny asa nangatahinao ianao tompoko',
-'badaccess-groups' => "Ny asa andramanao atao io dia voafetra amin'ny mpikambana ao amin'ny vondrona $1.{{PLURAL:$2||}}",
+'badaccess-groups' => "Ny asa andramanao atao io dia voafetra amin'ny mpikambana ao amin'ny vondrona $1.{{PLURAL:$2|}}",
 
 'versionrequired' => "
 Mitaky version $1-n'i MediaWiki",
@@ -575,6 +586,8 @@ Mihidy ho azy aloha ny banky angona mandra-pahatratran'ny serveur andevo ny tomp
 'cannotdelete' => "Tsy afaka fafàna ny pejy na ny rakitra « $1 ».
 Mety efa nataon'ny hafa angamba ny famafàna.",
 'cannotdelete-title' => 'Tsy afaka mamafa ny pejy "$1"',
+'delete-hook-aborted' => "Famafana nofoanan'ny itatra.
+Tsy nanome fanazavana.",
 'badtitle' => 'Tsy mety ny lohateny',
 'badtitletext' => "Tsy mety io anaram-pejy nangatahinao io na tsy misy n'inon'inona na rohy dikan-teny vahiny misy diso tsipelina.",
 'perfcached' => "Ao amin'ny voatakona ireo data manaraka ireo ary mety tsy voavao. $1{{PLURAL:}} ihany no isan'ireo zavatra voatahiry ao amin'ny voatakona",
@@ -608,8 +621,13 @@ $2',
 'ns-specialprotected' => "Tsy afaka ovaina ny pejy anatin'ny toeran'anarana « {{ns:special}} » .",
 'titleprotected' => "Voaaron'i [[User:$1|$1]] ity lohateny ity mba tsy hamorona pejy mitondra ity anarana ity.
 Ny antony napetraka dia : « ''$2'' ».",
+'filereadonlyerror' => 'Tsy afaka manova ny rakitra "$1" satria famakiana ihany no tao azo atao amin\'i "$2".
+
+Ny antony nomen\'ny mpandrindra nanidy azy: "$3".',
 'invalidtitle-knownnamespace' => 'Lohateny tsy miady amin\'ny fepetra miaraka amin\'ny anaram-balam-pejy "$2" ary soratra "$3"',
+'invalidtitle-unknownnamespace' => 'Lohateny tsy ekena miaraka amin\'ny laharana anaran-tsehatra $1 ary soratra "$2"',
 'exception-nologin' => 'Tsy tafiditra',
+'exception-nologin-text' => "Mila tafiditra eo amin'ilay wiki vao afaka manao ilay tao.",
 
 # Virus scanner
 'virus-badscanner' => "Diso : Tsy fantatray ny mpitady virus ''$1''",
@@ -621,10 +639,22 @@ Ny antony napetraka dia : « ''$2'' ».",
 
 Mbola afaka mampiasa ny {{SITENAME}} ianao na dia ef anivoaka aza, na afaka <span class='plainlinks'>[$1 miverina mihiditra]</span> ianao ambanin'ny anaranao na anaram-pikambana hafa.
 Fantaro fa ny endriky ny pejy sasany dia mety mitovy amin'ny endrika nahitanao azy tamin' ianao mbola niditra tato, ho toy izany ny endri-pejy raha tsy nofafanao ny cache.",
+'welcomeuser' => 'Tonga soa, $1',
+'welcomecreation-msg' => "Noforonina ny aontinao.
+Aza adin ny manova ny [[Special:Preferences|safidinao ro amin'i{{SITENAME}}]].",
 'yourname' => 'Solonanarana',
+'userlogin-yourname' => 'Anaram-pikambana',
+'userlogin-yourname-ph' => 'Atsofohy ny anaram-pikambanao',
 'yourpassword' => 'Tenimiafina',
+'userlogin-yourpassword' => 'Tenimiafina',
+'userlogin-yourpassword-ph' => 'Atsofohy ny tenimiafinao',
+'createacct-yourpassword-ph' => 'Manatsofoha tenimiafina',
 'yourpasswordagain' => 'Avereno ampidirina eto ny tenimiafina',
+'createacct-yourpasswordagain' => 'Hamarino ny tenimiafinao',
+'createacct-yourpasswordagain-ph' => 'Mbola ampidiro fanindroany ny tenimiafinao',
 'remembermypassword' => '{{PLURAL:}}Tadidio ny tenimiafiko (mandritry ny $1 andro fara-fahabetsany)',
+'userlogin-remembermypassword' => 'Tadidio aho',
+'userlogin-signwithsecure' => "Fidirana amin'ny alalan'ny fanohizana azo antoka",
 'securelogin-stick-https' => "Mijanona tafiditra amin'i HTTPS rehefa tafiditra",
 'yourdomainname' => 'faritra (domaine) misy anao',
 'password-change-forbidden' => "Tsy afaka manova ny tenimiafina ianao eto amin'ity wiki ity.",
@@ -638,18 +668,37 @@ Mila manaiky cookies ianao raha te hiditra amin'ny {{SITENAME}}.",
 'logout' => 'Hiala',
 'userlogout' => 'Hiala',
 'notloggedin' => 'Tsy tafiditra',
+'userlogin-noaccount' => 'Tsy manana kaonty?',
+'userlogin-joinproject' => "Midira ho mpikamban'i {{SITENAME}}",
 'nologin' => "Tsy manana solonanarana? '''$1'''.",
 'nologinlink' => 'Manokafa kaonty',
 'createaccount' => 'Hamorona kaonty',
 'gotaccount' => "Efa manana kaonty? '''$1'''.",
 'gotaccountlink' => 'Midira',
 'userlogin-resetlink' => "Adinonavo ve ny antsipihan'ny fidiranao ?",
-'createaccountmail' => "amin'ny imailaka",
+'userlogin-resetpassword-link' => 'Hamerina ny tenimiafinao',
+'helplogin-url' => 'Fanoroana:Fidirana',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Fanoroana mikasika ny fidirana]]',
+'createacct-join' => 'Atsofohy eo ambany ny fampahalalana momba anao.',
+'createacct-emailrequired' => 'Adiresy mailaka :',
+'createacct-emailoptional' => 'Adiresy mailaka (azo tsy atao) :',
+'createacct-email-ph' => 'Atsofohy ny adiresy mailakao',
+'createaccountmail' => "Hampiasa tenimiafina kisendra vonjimaika ary handefa azy mailaka any amin'ny adiresy nolazaina teo ambany",
+'createacct-realname' => 'Tena anarana (azo tsy atao)',
 'createaccountreason' => 'Antony :',
+'createacct-reason' => 'Antony',
+'createacct-reason-ph' => 'Inona ny antony hamoronanao kaonty hafa',
+'createacct-imgcaptcha-ph' => 'Atsofohy ny teny hitanao eo ambony',
+'createacct-submit' => 'Hamorona ny kaontinao',
+'createacct-benefit-heading' => "Olona tahaka ianao no manoratra eo amin'i {{SITENAME}}",
+'createacct-benefit-body1' => 'fanovana{{PLURAL:}}',
+'createacct-benefit-body2' => 'pejy{{PLURAL:}}',
+'createacct-benefit-body3' => 'mpandray anjara vao haingana{{PLURAL:}}',
 'badretype' => 'Tsy mitovy ny tenimiafina nampidirinao.',
 'userexists' => 'Efa miasa io anaram-pikambana natsofokao io.
 Anarana hafa safidiana.',
 'loginerror' => "Tsy fetezana teo amin'ny fidirana",
+'createacct-error' => 'Hadisoana tam-pamoronana ny kaonty',
 'createaccounterror' => 'Tsy afaka mamorona kaonty : $1',
 'nocookiesnew' => "Voasikatra ny kaontim-pikambana, fa tsy tafiditra amin'ny kaontinao ianao.
 Mampiasa cookies ny {{SITENAME}} ho an'ny fidirana amin'ny kaonty.
@@ -692,7 +741,8 @@ Azafady midira rehefa voarainao io imailaka io.',
 Efa nandefasana imailaka fanamarinana ilay adiresy nomenao.
 Alohan'ny handraisanao imailaka hafa, dia araho ny torolalana ao anatin'io imailaka io,
 mba hanaporofoana fa anao io kaonty io.",
-'throttled-mailpassword' => "Nandefa imailaka mety mampatadidy anao ny tenimiafinao izahay nandrintra ny $1 ora farany. Mba tsy hanararaotra, imailaka iray ihany no azo alefa isakin'ny ady ny $1{{PLURAL:}}",
+'throttled-mailpassword' => "Efa nandefasana mailaka famerenana tenimiafiana ianao tanatin'ny {{PLURAL:$1|ora|$1 ora}}.
+Mba tsy hisian'ny fanararaotana dia mailaka famerenana tenimiafiana iray ihany no azo ampiasaina isaky ny adin'ny $1{{PLURAL:}}.",
 'mailerror' => "Nisy olana tamin'ny fandefasana imailaka: $1",
 'acct_creation_throttle_hit' => 'Miala tsiny, efa nanokatra kaonty miisa $1 ianao, ka tsy afaka mamorona hafa intsony.{{PLURAL:}}',
 'emailauthenticated' => "Voamarina tamin'ny $2 $3 ny adiresy imailakao.",
@@ -720,6 +770,7 @@ Andraso kely ary andramo indray.",
 # Email sending
 'php-mail-error-unknown' => "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
 'user-mail-no-addy' => 'Nanandrana nandefa imailaka tsy misy adiresy imailaka.',
+'user-mail-no-body' => 'Nanandrana nandefa mailaka babangoana na fohy loatra',
 
 # Change password dialog
 'resetpass' => 'Hanova ny tenimiafina',
@@ -737,24 +788,25 @@ Andraso kely ary andramo indray.",
 'resetpass-wrong-oldpass' => 'Tsy izy ny tenimiafinao (tsotra na miserana)
 Mety efa nanova tenimiafina na nanontany tenimiafina miserana angamba ianao.',
 'resetpass-temp-password' => 'Tenimiafina miserana :',
+'resetpass-abort-generic' => "Nosakanan'ny itatra (extension) iray ny fanovana tenimiafina.",
 
 # Special:PasswordReset
 'passwordreset' => 'Famafana ary famerenana ny tenimiafina',
-'passwordreset-text' => "Fenoy ity formilera ity ho an'ny fahaozana ny fampahalalana mahakasika ny kaontinao amin'ny imailaka.",
 'passwordreset-legend' => 'Famafana ary famerenana ny tenimiafina',
 'passwordreset-disabled' => "Tsy nalefa ny fanovana tenimiafina adino eto amin'ity wiki ity.",
-'passwordreset-pretext' => '{{PLURAL:$1}}Mampidira singa data eo ambany',
+'passwordreset-emaildisabled' => "Tsy avela ny fampiasana mailaka eto amin'ity wiki ity.",
 'passwordreset-username' => 'Anaram-pikambana :',
 'passwordreset-domain' => 'Vala (domain) :',
 'passwordreset-capture' => 'Hijery ny imailaka vokany ?',
+'passwordreset-capture-help' => "Raha marihanao ity boaty ity, ny mailaka (miaraka amin'ilay tenimiafina vonjimaika) dia ho aseho aminao ary koa ho alefa amin'ilay mpikambana.",
 'passwordreset-email' => 'Adiresy imailaka :',
 'passwordreset-emailtitle' => "Antsipirihan'ny kaonty eo amin'i {{SITENAME}}",
-'passwordreset-emailtext-ip' => "Nisy olona (mety ianao ihany angamba, avy amin'ity adiresy IP ity: $1) nangataka fampahalalana manokana mikasika ny kaontinao eo amin'i {{SITENAME}} ($4). {{PLURAL:$3|Ity|Ireto}} adiresy imailaka {{PLURAL:$3|Ity|Ireto}} dia mampiasa ity adiresy imailaka ity :
+'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}}:
 
 $2
 
-{{PLURAL:$3|Io|Ireo}} ny tenimiafina miserana mitsahatra afaka {{PLURAL:$5|iray andro|$5 andro}}.
-Tokony miditra ianao ary misafidy ny tenimiafinao. Raha olon-kafa no nanao ity hataka ity, na efa tadidinao ny tenimiafinao taloha, ary raha tsy tia hanova azy intony ianao, azonao tsy raharahiana ity hafatra ity ary mbola azonao ampiasaina ilay tenimiafinao taloha.",
+Hitsahatra afaka $5 andro {{PLURAL:$3|io tenimiafina io|ireo tenimiafina ireo}}.
+Tokony 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}} :
 
 $2
@@ -762,9 +814,9 @@ $2
 Hitsahatra 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
 Tenimiafina miserana : $2',
-'passwordreset-emailsent' => 'Nalefa ny imailaka fampatsiahivana.',
-'passwordreset-emailsent-capture' => 'Lasa ilay imailaka fahatadidiana, izay aseho eo ambany.',
-'passwordreset-emailerror-capture' => "Voaforona ilay imailaka fitadidiana, izay aseho eo ambany, fa tsy nahomby anefa ny fandefasana azy any amin'ny mpikambana : $1",
+'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 lasa any amin'ilay mpikambana ilay izy : $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Hanova ny adiresy imailaka',
@@ -774,6 +826,7 @@ Tenimiafina miserana : $2',
 'changeemail-oldemail' => 'Adiresy imailaka ankehitriny :',
 'changeemail-newemail' => 'Adiresy imailaka vaovao :',
 'changeemail-none' => '(tsy misy)',
+'changeemail-password' => "Tenimiafinao eo amin'i {{SITENAME}}:",
 'changeemail-submit' => 'Hanova ny adiresy imailaka',
 'changeemail-cancel' => 'Adinoy',
 
@@ -869,6 +922,9 @@ Azonao atao ny [[Special:Search/{{PAGENAME}}|Tadiavo ny momba ny {{PAGENAME}}]].
 'noarticletext-nopermission' => "Mbola tsy misy lahatsoratra ao amin'io pejy io.
 
 Azonao atao ny [[Special:Search/{{PAGENAME}}|mikaroka ity lohateny ity]] eny amin'ny pejy hafa na <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mitady ao amin'ny laogy misy fifandraisana]</span>, fa tsy azonao atao ny mamorona ity pejy ity.",
+'missing-revision' => 'Tsy misy ny santiôna #$1 ny pejy "{{PAGENAME}}".
+
+Mitranga izany rehefa manaraka rohin-tantara tola mankany amina pejy voafafa. Ahitana fampahalalana fanampiny ny  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafana].',
 'userpage-userdoesnotexist' => 'Mbola tsy nisoratra anarana ato i « <nowiki>$1</nowiki> ». Marino raha tena hamorona ity pejy ity ianao.',
 'userpage-userdoesnotexist-view' => 'Tsy nisoratra anarana ato i « $1 ».',
 'blocked-notice-logextract' => "Ankehitriny ity mpikambana ity dia voasakana.
@@ -971,7 +1027,15 @@ Mety voafafa angamba izy.',
 'edit-already-exists' => 'Tsy afaka amboarina ilay pejy vaovao.
 Efa misy izy.',
 'defaultmessagetext' => 'Hafatra raha tsy misy',
+'content-failed-to-parse' => "Tsy naha-parse ny votoatin'i $2 ho an'ny modely $1 : $3",
 'invalid-content-data' => "Data anaty votoatiny tsy miady amin'ny fepetra",
+'content-not-allowed-here' => "Votoatiny ''$1'' voarara eo amin'ny pejy [[$2]]",
+
+# Content models
+'content-model-wikitext' => 'wiki-soratra',
+'content-model-text' => 'soratra tsotra',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Tandremo : Betsaka loatra ny fanantsoana ny tao parser.
@@ -991,6 +1055,7 @@ Ao aorian'ny fivelarana, mety namoaka valy lava loatra angamba izy, ary tsy namp
 'expansion-depth-exceeded-category' => 'Pejy manana halalim-panitarana mihoatra',
 'expansion-depth-exceeded-warning' => 'Pejy manana halalim-panitarana mihoatra',
 'parser-unstrip-loop-warning' => 'Nahitana tondro mifolaka tsy azo vahana',
+'converter-manual-rule-error' => "Nahitana hadisoana ao amin'ny fepetra famadihana tanana ny fiteny.",
 
 # "Undo" feature
 'undo-success' => 'Ho voafafa io fanovana io. Marino tsara ny fanovana eo ambany, ary tehirizo rehefa vita.',
@@ -1179,6 +1244,7 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 'showhideselectedversions' => 'Aseho/asitrika ireo ny santiôna nofidiana',
 'editundo' => 'esory',
 'diff-multi' => "({{PLURAL:$1|Famerenana tokana|Famerenana $1}} nataon'ny {{PLURAL:$2|mpikambana iray|mpikambana $2}} tsy miseho)",
+'diff-multi-manyusers' => "Tsy naseho ny antiôna $1{{PLURAL:}} nataon'ny mpikambana $2.",
 
 # Search results
 'searchresults' => 'Valim-pikarohana',
@@ -1222,7 +1288,7 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 'search-interwiki-default' => "Valiny amin'ny $1 :",
 'search-interwiki-more' => '(be kokoa)',
 'search-relatedarticle' => 'voadinika',
-'mwsuggest-disable' => 'Aza atao ny toro-hevitra AJAX',
+'mwsuggest-disable' => 'Tsy hampiasa ny toro-hevi-pikarohana AJAX',
 'searcheverything-enable' => "Hitady anatin'ny anaran-tsehatra rehetra:",
 'searchrelated' => 'voadinika',
 'searchall' => 'rehetra',
@@ -1245,15 +1311,6 @@ ihany no miseho amin'ny vokatry ny karoka).",
 'search-external' => 'Hikaroka any ivelany',
 'searchdisabled' => "Tsy nalefa ny karoka eto amin'i {{SITENAME}}. Afaka mampiasa an'i Google aloha ianao mandra-paha. Nefa fantaro fa mety ho efa lany daty ny valiny omeny.",
 
-# Quickbar
-'qbsettings' => 'Tsipika fiasàna',
-'qbsettings-none' => 'Tsy misy',
-'qbsettings-fixedleft' => 'Ankavia',
-'qbsettings-fixedright' => 'Ankavanana',
-'qbsettings-floatingleft' => 'Mitsingevaheva any ankavanana',
-'qbsettings-floatingright' => 'Mitsigevaheva any ankavanana',
-'qbsettings-directionality' => "Tsy mihetsika, arakaraky ny fizotran'ny soratra amin'ny teninao (avy any havanana miankavia, na avy any havia miankavanana)",
-
 # Preferences page
 'preferences' => 'Ny momba anao',
 'mypreferences' => 'Safidy',
@@ -1291,6 +1348,7 @@ ihany no miseho amin'ny vokatry ny karoka).",
 'columns' => 'Tsanganana/Tioba :',
 'searchresultshead' => 'Fikarohana',
 'resultsperpage' => "Isa ny valiny isakin'ny pejy :",
+'stub-threshold' => 'Fetra ambony ho an\'i <a href="#" class="stub">rohim-bangovango</a> (oktety):',
 'stub-threshold-disabled' => 'Tsy alefa',
 'recentchangesdays' => "Isa ny andro ho ampiseho eo amin'ny fanovàna farany",
 'recentchangesdays-max' => '($1 andro{{PLURAL:$1||}} fara-faha betsany)',
@@ -1334,11 +1392,12 @@ Fenoy araka ny datin'ny solosainan'ny mpitsidika",
 'youremail' => 'Imailaka:',
 'username' => '{{GENDER:$1}}Anaram-pikambana :',
 'uid' => '{{GENDER:$1}}mpikambana :',
-'prefs-memberingroups' => "mpikambana{{GENDER:$2}} ao amin'ny vondrona{{PLURAL:$1}} :",
+'prefs-memberingroups' => "Mpikambana{{GENDER:$2}} ao amin'ny vondrona{{PLURAL:$1}}:",
 'prefs-registration' => 'Daty fidirana :',
 'yourrealname' => 'Tena anarana marina:',
 'yourlanguage' => 'Tenim-pirenena:',
 'yourvariant' => 'fitenim-paritry ny fitenim-botoatiny :',
+'prefs-help-variant' => "Ny karazan-tsipelina tianao ho ampiasain'ny pejim-botoatiny",
 'yournick' => 'Anaram-bositra:',
 'prefs-help-signature' => 'Ilaina soniavina amin\'ny "<nowiki>~~~~</nowiki>" ny resaka eo amin\'ny pejin-dresaka izay hametraka ny sonianao ary ny daty nanoratanao.',
 'badsig' => 'Tsy mety io sonia io; hamarino ny kialo HTML.',
@@ -1379,7 +1438,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'userrights-lookup-user' => 'Handrindra vondrom-pikambana',
 'userrights-user-editname' => 'Manomeza solonanarana:',
 'editusergroup' => "Hanova satan'ny mpikambana",
-'editinguser' => "Fanovana ny zon'ny mpikambana '''[[user:$1|$1]]''' $2",
+'editinguser' => "Fanovana ny zon'ny mpikambana '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Hanova vondrom-pikambana',
 'saveusergroups' => 'Tehirizo ny vondrom-pikambana',
 'userrights-groupsmember' => "Mpikambana amin'ny vondrona:",
@@ -1583,6 +1642,9 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'upload_directory_missing' => "Ny petra-drakitra ampidiran-drakitra ($1) dia tsy misy ary tsy afaka namboarin'ny lohamilin-tranonkala.",
 'upload_directory_read_only' => "Ny répertoire ($1) handraisana ny rakitra alefan'ny mpikambana dia tsy afaka anoratana.",
 'uploaderror' => 'Nisy tsy fetezana ny fandefasana rakitra',
+'upload-recreate-warning' => "'''Tandremo : novain-toerana na nofafana ny rakitra mitondra io anarana io.'''
+
+Aseho eo ambany ho fampahalalana fanampiny ny iditra ao amin'ny laogim-panisahana ary ny laogim-pamafana :",
 'uploadtext' => "Ampiasao ity fisy ity handefasana rakitra. Jereo eto ny [[Special:FileList|lisitry ny rakitra]] nalefan'ny mpikambana, na koa azonao ampiasaina ny [[Special:Log/delete|tantaran'asan'ny fandefasana sy famonoana rakitra]].
 
 Raha hanisy sary ao anaty pejy, dia mampiasà rohy toy ny iray amin'ireto
@@ -1671,6 +1733,8 @@ Marino ny option configuration file_uploads.",
 'uploadscripted' => "
 Misy kialo HTML na fango script mety tsy ho hain'ny navigateur sasany haseho ity rakitra ity.",
 'uploadvirus' => 'Misy viriosy io rakitra io! Toy izao ny antsipirihany: $1',
+'uploadjava' => 'Ny rakitra dia rakitra ZIP ahitana rakitra .class Java.
+Voarara ny mandefa rakitra Java satria mety hahavaky ny fepetra mikasika ny antoka ireo rakitra ireo.',
 'upload-source' => 'Rakitra fango',
 'sourcefilename' => "Anaran'ny rakitra:",
 'sourceurl' => 'Loharano URL :',
@@ -1713,6 +1777,7 @@ Raha mbola misy foana ilay  olana, manorata any amin'ny [[Special:ListUsers/syso
 'backend-fail-notsame' => "Efa misy rakitra samihafa ho an'i $1",
 'backend-fail-invalidpath' => '$1 dia lalam-pitahirizana tsy azo raisina.',
 'backend-fail-delete' => 'Tsy afaka mamafa ilay rakitra $1.',
+'backend-fail-describe' => 'Tsy nahasolo ny metadata ho an\'ny rakitra "$1".',
 'backend-fail-alreadyexists' => 'Efa misy ilay rakitra $1.',
 'backend-fail-store' => 'Tsy afaka mitahiry ilay rakitra $1 anaty $2.',
 'backend-fail-copy' => 'Tsy afaka mandika ilay rakitra $1 anaty $2.',
@@ -1781,7 +1846,6 @@ ity wiki ity dia no-regler-na ho sarababem-bahoaka.",
 'http-read-error' => "Tsy fetezana momban'ny famakiana HTTP.",
 'http-timed-out' => 'Ny fangatahana HTTP dia efa lany daty.',
 'http-curl-error' => 'Tsi-fetezana teo am-pangalana ny URL : $1',
-'http-host-unreachable' => 'URL tsy afaka andehanana',
 'http-bad-status' => 'Nisy tsi-fetezana teo ampandefasana ny hataka HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1923,6 +1987,8 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'disambiguations' => 'Pejy misy rohy amina pejy fanalana ny fisalasalana',
 'disambiguationspage' => 'Template:homonimia',
 
+'pageswithprop-submit' => 'Alefa',
+
 'doubleredirects' => 'Fihodinana roa',
 'double-redirect-fixed-move' => "Ity fihodinana ity, nanana ny tanjona [[$1]] novaina anarana, dia mitondra mankany amin'ny [[$2]].",
 'double-redirect-fixer' => 'Mpanitsy fihodinana',
@@ -2005,6 +2071,7 @@ wiki ity aza izy.</p>",
 'pager-newer-n' => '$1 {{PLURAL:$1|vao haingana|vao haingana}}',
 'pager-older-n' => '$1 {{PLURAL:$1|taloha|taloha}}',
 'suppress' => 'Hitondra',
+'querypage-disabled' => 'Tsy ampiasaina ity pejy manokana ity mba hitsitsy ny solosaina',
 
 # Book sources
 'booksources' => 'boky tsiahy',
@@ -2079,7 +2146,7 @@ Protokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
 # Special:ActiveUsers
 'activeusers' => 'Lisitry ny mpikambana mavitrika',
 'activeusers-intro' => 'Ity ny lisitry ny mpikambana izay nanao zavatra iray nandritry ny andro $1 farany. {{PLURAL:}}',
-'activeusers-count' => "Nanova in-$1 tao anatin'ny $3 andro{{PLURAL:}}",
+'activeusers-count' => "Tao $1{{PLURAL:}} tanatin'ny $3 andro",
 'activeusers-from' => 'Aseho ny mpikambana hatry ny :',
 'activeusers-hidebots' => 'Asitriho ny robo',
 'activeusers-hidesysops' => 'Asitriho ny mpandrindra',
@@ -2087,6 +2154,9 @@ Protokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
 
 # Special:ListGroupRights
 'listgrouprights' => "Fahefan'ny vondrom-pikambana",
+'listgrouprights-summary' => "Ity pejy ity dia ahitana ny lisitry ny vondrom-pikambana voafaritra ato amin'ity wiki ity ary ny zo ananany. Mety misy [[{{MediaWiki:Listgrouprights-helppage}}|fampahalalana fanampiny]] mikasika ny zo manokana.",
+'listgrouprights-key' => '* <span class="listgrouprights-granted">Zo nomena</span>
+* <span class="listgrouprights-revoked">Zo nofoanana</span>',
 'listgrouprights-group' => 'Vondrona/Gropy',
 'listgrouprights-rights' => 'Fahefana miaraka aminy',
 'listgrouprights-helppage' => "Help:Fahefan'ny vondrona",
@@ -2107,10 +2177,7 @@ Protokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
 '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' => "Raha nametraka adiresy tena miasa tao amin'ny [[Special:Preferences|mombamomba azy io mpikambana io]],
-dia ahafahana mandefa hafatra tokana ho any aminy ity fisy eto ambany ity.
-Ny adiresy imailakao napetrakao tao amin'ny mombamomba anao no hiseho hoe
-adiresin'ny mpandefa izany imailaka izany, koa afaka hovaliany izay hafatra alefanao.",
+'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.',
 'usermailererror' => "Misy tsy mety amin'ny lohatenin'ny imailaka:",
 'defemailsubject' => '{{SITENAME}} Mailaky ny mpikambana "$1"',
 'usermaildisabled' => 'Tsy azo mifandefa imailaka ny mpikambana',
@@ -2141,7 +2208,7 @@ na tsy maniry handray imailaka avy amin'ny mpikambana hafa izy.",
 'usermessage-editor' => 'Mpampita hafatry ny rindrankajy',
 
 # Watchlist
-'watchlist' => 'Narahiko maso',
+'watchlist' => 'Pejy arahako',
 'mywatchlist' => 'Pejy arahana',
 'watchlistfor2' => "Ho an'i $1 $2",
 'nowatchlist' => 'Tsy manaraka pejy ianao.',
@@ -2149,11 +2216,7 @@ na tsy maniry handray imailaka avy amin'ny mpikambana hafa izy.",
 'watchnologin' => 'Tsy niditra',
 'watchnologintext' => 'Mila [[Special:UserLogin|miditra]] ianao vao afaka manova ny lisitry ny pejy arahanao.',
 'addwatch' => "Ampiana ao amin'ny pejy arahana",
-'addedwatchtext' => "Tafiditra anatin'ny lisitry ny [[Special:Watchlist|Pejy arahanao maso]] ny pejy \"[[:\$1]]\".
-Ny fanovana hisy amin'io pejy io sy ny pejin-dresaka miaraka aminy dia hiseho ao,
-ary rehefa miseho ao amin'ny [[Special:RecentChanges|lisitry ny pejy vao niova]] io pejy io dia hatao ''matavy'' mba hahamora ny fahitana azy.
-
-Aoriana, raha irinao ny hanaisotra azy ao amin'ny pejy arahanao maso, dia tsindrio ilay hoe \"aza arahi-maso intsony\" etsy amin'ny sisiny etsy.",
+'addedwatchtext' => 'Voalisitra ao amin\'ny [[Special:Watchlist|pejy arahanao]] ilay pejy "[[:$1]]". Ny fanovana ho avy ao amin\'ilay pejy ary ao amin\'ilay pejin-dresaka dia ho voalisitra any.',
 'removewatch' => "Alàna amin'ny pejy arahana",
 'removedwatchtext' => 'Tsy [[Special:Watchlist|arahanao]] intsony ny pejy [[:$1]].',
 'watch' => 'Arahana',
@@ -2164,8 +2227,8 @@ Aoriana, raha irinao ny hanaisotra azy ao amin'ny pejy arahanao maso, dia tsindr
 'notvisiblerev' => 'Voafafa ilay santiôna',
 'watchnochange' => 'Tsy niova nandritra ny fe-potoana miseho ny zavatra arahanao',
 'watchlist-details' => "Pejy $1{{PLURAL:}} ao amin'ny lisitry ny pejy arahanao, tsy isaina ny pejin-dresaka.",
-'wlheader-enotif' => "* Mandeha ny fampilazana amin'ny alalan'ny imailaka.",
-'wlheader-showupdated' => "* <b>Voasorabaventy</b> ny pejy niova taorian'ny famangianao farany.",
+'wlheader-enotif' => "Alefa ny fampilazana amin'ny mailaka.",
+'wlheader-showupdated' => "Aseho '''sorabaventy''' ny pejy niova taorian'ny famangianao azy farany.",
 'watchmethod-recent' => 'fanamarinana ny fanovana farany hahitana pejy arahana',
 'watchmethod-list' => 'fanamarinana ny pejy arahana ahitana fanovana farany',
 'watchlistcontains' => "Ao amin'ny pejy arahanao dia ahitana pejy $1{{PLURAL:}}.",
@@ -2269,6 +2332,9 @@ miverina any amin'ny santiôna farany nataon'i $2.",
 
 # Edit tokens
 'sessionfailure-title' => 'Tsi-fetezaka mikasika ny kaonty idirana',
+'sessionfailure' => 'Ohatry ny misy olana ny fidirana amin\'ny kaontinao ; 
+nofoanana ilay tao mba tsy hisy fanodinana fotaom-pidirana (session).
+Tsindrio "Mialoha" ary vaozy ilay pejy niavianao ary andramo fanindroany.',
 
 # Protect
 'protectlogpage' => 'Tatitr’asa momban’ny fiarovana',
@@ -2279,10 +2345,11 @@ Ho ann'y fanazavana fanampiny, jereo [[Special:ProtectedPages|ny lisitry ny pejy
 '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 »",
-'protect-title-notallowed' => "Hijery ny lentam-piarovana ho an'i « [[$1]] »",
+'protect-title-notallowed' => "Hijery 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-title' => 'Pejy tsy azo arovana',
 'protect-legend' => 'Fanekena ny fiarovana pejy',
 'protectcomment' => 'Antony :',
 'protectexpiry' => 'Daty fitsaharana :',
@@ -2298,9 +2365,9 @@ Ity ny reglajy ny pejy  '''$1'''",
 Ity 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-default' => 'Avela daholo ny mpikambana',
-'protect-fallback' => 'Mila manana sata « $1 »',
-'protect-level-autoconfirmed' => 'Sakano ny mpikambana vaovao sy ny mpikambana tsy nisoratra anarana',
-'protect-level-sysop' => 'Sysops ihany',
+'protect-fallback' => 'Hanome alalana ny mpikambana manana ny zo "$1"',
+'protect-level-autoconfirmed' => 'Hanome alalana ny mpikambana voamarina',
+'protect-level-sysop' => 'Hanome alalana ny mpandrindra ihany',
 'protect-summary-cascade' => 'Fiarovana an-driana',
 'protect-expiring' => "Miala amin'ny $1",
 'protect-expiring-local' => 'mitsahatra ny $1',
@@ -2339,6 +2406,7 @@ Ity ny réglage ny pejy '''$1''' :",
 # Undelete
 'undelete' => 'Jereo ny pejy voafafa',
 'undeletepage' => 'Hijery sy hamerina ny pejy efa voafafa',
+'undeletepagetitle' => "'''Ahitana ny santiôna voafafan'i [[:$1|$1]] ity lisitra manaraka.'''",
 'viewdeletedpage' => 'Hijery ny pejy efa nofafana',
 'undeletepagetext' => "Ireto pejy ireto dia efa voafafa nefa mbola voatahiry ao amin'ny tahiry ihany,
 ary mbola afaka averina, mandra-pifafan'ny tahiry. Mety ho voafafa matetitetika
@@ -2395,7 +2463,7 @@ $1',
 'blanknamespace' => '(fotony)',
 
 # Contributions
-'contributions' => "Fandraisan'anjaran'ny mpikambana",
+'contributions' => "Fandraisan'anjaran'ny mpikambana{{GENDER:$1}}",
 'contributions-title' => "Fandraisan'anjaran'i $1",
 'mycontris' => "Fandraisan'anjara",
 'contribsub2' => "ho an'ny $1 ($2)",
@@ -2718,6 +2786,8 @@ Andana vangio ny [//www.mediawiki.org/wiki/Localisation Fandikana an'i Mediawiki
 'thumbnail-more' => 'Angedazina',
 'filemissing' => 'Tsy hita ny rakitra',
 'thumbnail_error' => 'Tsy fetezana eo am-panamboarana ilay saritapaka : $1',
+'thumbnail_error_remote' => "Hafa-kadisoana avy amin'i $1:
+$2",
 'djvu_page_error' => "Pejy DjVu any ivelan'ny fetra",
 'djvu_no_xml' => "Tsy afaka alaina ny XML ho an'ny rakitra DjVu",
 'thumbnail-temp-create' => 'Tsy afaka namorona ilay thumbnail miserana',
@@ -2773,6 +2843,10 @@ Avereno fanindroany.',
 'import-logentry-upload' => "nampiditra [[$1]] tamin'ny fampidiran-drakitra",
 'import-logentry-interwiki' => "nampiditra $1 tamin'ny transwiki",
 
+# JavaScriptTest
+'javascripttest' => 'Fanandramana JavaScript',
+'javascripttest-title' => 'Mandefa fanandramana $1',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ny pejinao',
 'tooltip-pt-anonuserpage' => "Ny pejim-bikamban'ny IP andraisanao anjara",
@@ -2835,6 +2909,7 @@ Ampesao ny topi-maso aloha no mihatiry.",
 'tooltip-compareselectedversions' => "Jereo ny fahasamihafana amin'ireo votoatin'ny pejy anankiroa ireo.",
 'tooltip-watch' => "Ampidiro amin'ny lisitry ny pejy arahinao maso ity pejy ity",
 'tooltip-watchlistedit-normal-submit' => 'Hanala ny lohateny',
+'tooltip-watchlistedit-raw-submit' => 'Hanavao ny pejy arahana',
 'tooltip-recreate' => 'Hamorona ilay pejy fanindroany raha efa voafafa izy',
 'tooltip-upload' => 'Hanomboka ny fampidirana',
 'tooltip-rollback' => "Manala ny fanovan'ny mpikambana farany nanova azy ilay asa « foano » (Rollback) .",
@@ -2869,11 +2944,34 @@ Mamerina ny version taloha io asa io ary afaka manometraka ny antony anatin'ny a
 
 # Info page
 'pageinfo-title' => 'Fampahalalana ho an\'i "$1"',
+'pageinfo-header-basic' => 'Fampahalalana fototra',
 'pageinfo-header-edits' => "Tantaran'ny fanovana",
+'pageinfo-header-restrictions' => "Fiarovana an'ilay pejy",
+'pageinfo-header-properties' => "Tondron'ilay pejy",
+'pageinfo-display-title' => 'Lohateny aseho',
+'pageinfo-length' => 'Halavam-pejy (oktety)',
+'pageinfo-article-id' => 'Laharam-pejy',
+'pageinfo-language' => "Tenin'ny votoatiny",
+'pageinfo-robot-policy' => "Satan'ny motera fikarohana",
 'pageinfo-views' => "Isan'ny jery",
 'pageinfo-watchers' => "Isan'ny mpandray anjara manaraka",
+'pageinfo-firstuser' => 'Mpamorona ilay pejy',
+'pageinfo-firsttime' => 'Daty namoronana ilay pejy',
+'pageinfo-lastuser' => 'Mpanova farany',
+'pageinfo-lasttime' => "Datin'ny fanovana farany",
 'pageinfo-edits' => "Isa manontolon'ny fanovana",
 'pageinfo-authors' => "Isa manontolon'ny mpandray anjara",
+'pageinfo-recent-edits' => "Fanovana vao haingana (natao tanatin'ny $1)",
+'pageinfo-recent-authors' => "Isa vao haingan'ny mpanoratra misongadina",
+'pageinfo-hidden-categories' => 'Sokajy nafenina{{PLURAL:$1}} ($1)',
+'pageinfo-redirectsto' => "Fihdinana mankany amin'ny",
+'pageinfo-redirectsto-info' => 'fampahalalana',
+'pageinfo-contentpage' => 'Isaina ho pejim-botoatiny',
+'pageinfo-contentpage-yes' => 'Eny',
+'pageinfo-protect-cascading-yes' => 'Eny',
+'pageinfo-category-pages' => 'Isam-pejy',
+'pageinfo-category-subcats' => "Isan'ny zana-tsokajy",
+'pageinfo-category-files' => "Isan'ny rakitra",
 
 # Patrolling
 'markaspatrolleddiff' => 'Marihana ho voamarina',
@@ -2917,6 +3015,7 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
 'file-info-size-pages' => '$1 × $2 teboka, haben-drakitra : $3, karazana MIME $4, pejy $5 {{PLURAL:}}',
 'file-nohires' => "Tsy misy sary ngeza non'io",
 'svg-long-desc' => 'rakitra SVG, habe $1 × $2 teboka, habe : $3',
+'svg-long-error' => 'Rakitra SVG tsy ekena : $1',
 'show-big-image' => "Hijery ny tena haben'ny sary",
 'show-big-image-size' => '$1 × $2 teboka',
 'file-info-gif-looped' => 'miverimberina',
@@ -2942,6 +3041,16 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
 'days' => 'andro{{PLURAL:$1}}',
 'ago' => '$1 lasa izay',
 
+# Human-readable timestamps
+'monday-at' => "Alatsinainy tamin'ny $1",
+'tuesday-at' => "Talata tamin'ny $1",
+'wednesday-at' => "Alarobia tamin'ny $1",
+'thursday-at' => "Alakamisy tamin'ny $1",
+'friday-at' => "Zoma tamin'ny $1",
+'saturday-at' => "Sabotsy tamin'ny $1",
+'sunday-at' => "Alahady tamin'ny $1",
+'yesterday-at' => "Omaly tamin'ny $1",
+
 # Bad image list
 'bad_image_list' => "Ity ny andrefiny :
 
@@ -2969,7 +3078,7 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Halalaka',
 'exif-imagelength' => 'Haavo',
 'exif-bitspersample' => 'Bit isaky ny singa',
@@ -3210,13 +3319,6 @@ Andramo ny topi-maso tsotra',
 'version-software-product' => 'Vokatra',
 'version-software-version' => 'Santiôna',
 
-# Special:FilePath
-'filepath' => "Lalan'ny drakitra",
-'filepath-page' => 'Rakitra',
-'filepath-submit' => 'Handeha',
-'filepath-summary' => "Mamerina ny lalam-pandehanana any amin'ilay rakitra ity pejy ity.
-Aseho amin'ny tena habeny ny sary aseho, ny hafa dia alefa miaraka amin'ny rindrankajy miaraka aminy avy hatrany.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Hitady rakitra mitovy endrika',
 'fileduplicatesearch-legend' => 'Hitady mitovy endrika',
@@ -3313,4 +3415,47 @@ Aseho amin'ny tena habeny ny sary aseho, ny hafa dia alefa miaraka amin'ny rindr
 'logentry-rights-autopromote' => 'Lasa $5 ho azy i $1 izay $4 taloha',
 'rightsnone' => '(tsy misy)',
 
+# Feedback
+'feedback-subject' => 'Lohahevitra:',
+'feedback-message' => 'Hafatra:',
+'feedback-cancel' => 'Foanana',
+'feedback-submit' => 'Handefa ny fanehoan-kevitra',
+'feedback-adding' => "Manampy ny fahenoan-kevitra amin'ilay pejy...",
+'feedback-error1' => "Hadisoana: Valiny avy amin'ny API tsy fantatra",
+'feedback-error2' => 'Hadisoana: Tsy voaòva',
+'feedback-error3' => "Hadisoana: Tsy nisy valiny avy amin'ny API",
+'feedback-thanks' => "Misaotra! lanefa tany amin'ilay pejy ''[$2 $1]'' ilay fanehoan-kevitrao.",
+'feedback-close' => 'Vita',
+
+# API errors
+'api-error-empty-file' => 'Tsy misy na inona na inna ilay rakitra nalefanao.',
+'api-error-emptypage' => 'Tsy azo atao ny mamorona pejy vaovao tsy misy votoatiny.',
+'api-error-fetchfileerror' => 'Hadisoana naaty : misy hadisoana nitranga teo am-pangalana ilay rakitra.',
+'api-error-file-too-large' => 'Lehibe loatra ny rakitra nalefanao.',
+'api-error-filename-tooshort' => "Fohy loatra ny anaran'ilay rakitra.",
+'api-error-filetype-banned' => 'Voarara io karazan-drakitra io.',
+'api-error-filetype-missing' => 'Tsy ampy tovana ilay anaran-drakitra.',
+'api-error-hookaborted' => "Najanon'ny faraingon'itatra ny fanovana nandramanao natao.",
+'api-error-http' => "Hadisoana anaty: Tsy tafaray tamin'ilay lohamilina.",
+'api-error-illegal-filename' => 'Tsy azo ampiasaina io anaran-drakitra io.',
+'api-error-internal-error' => 'Hadisoana anaty: Nisy hadisoana nitranga teo am-pikajikajiana ny rakitrao',
+'api-error-invalid-file-key' => "Hadisoana anaty: Tsy hita tao amin'ilay tahiry vonjimaika ilay rakitra.",
+'api-error-missingparam' => "Hadisoana anaty: Parametatra tsy ampy ao amin'ny hataka.",
+'api-error-missingresult' => 'Hadisoana anaty: Tsy afaka milaza izahay raha tena nahomby ilay fandikana.',
+'api-error-mustbeloggedin' => 'Mila tafiditra ianao mba handefa rakitra.',
+'api-error-mustbeposted' => 'Hadisoana anaty: Mila HTTP POST ilay hataka.',
+'api-error-noimageinfo' => 'Nahomby ilay fandikana, fa tsy nanome antsika fampahalalana mikasika ilay raktira ilay lohamilina.',
+'api-error-nomodule' => 'Hadisoana anaty: Tsy namaritra joro fandefasana.',
+'api-error-ok-but-empty' => "Hadisoana anaty: Tsy nisy valiny avy amin'ilay lohamilina.",
+'api-error-overwrite' => 'Tsy azo atao ny manitsaka rakitra efa misy.',
+'api-error-stashfailed' => 'Hadisoana anaty: Tsy nahomby ny fitahirizana ilay rakitra vonjimaika ilay lohamilina.',
+'api-error-timeout' => "Tsy namaly tanatin'ny fe-potoana nandrasana ilay lohamilina.",
+'api-error-unclassified' => 'Nisy hadisoana tsy fantatra nitranga.',
+'api-error-unknown-code' => "Hadisoana tsy fantatra : ''$1''.",
+'api-error-unknown-error' => 'Hadisoana anaty: Nisy hadisoana tam-pandefasana ny rakitrao.',
+'api-error-unknown-warning' => "Fampitandremana tsy fantatra : ''$1''.",
+'api-error-unknownerror' => "Hadisoana tsy fantatra : ''$1''.",
+'api-error-uploaddisabled' => "Tsy alefa eto amin'ity wiki ity ny fandefasan-drakita.",
+'api-error-verification-error' => 'Mety tapaka ity rakitra ity, na diso tovan-drakitra.',
+
 );
index 17588be..a98597c 100644 (file)
@@ -13,6 +13,7 @@
  * @author Kaganer
  * @author Lifeway
  * @author Сай
+ * @author Санюн Вадик
  */
 
 $fallback = 'ru';
@@ -64,6 +65,12 @@ $namespaceAliases = array(
 $namespaceGenderAliases = array();
 
 $specialPageAliases = array(
+       'Blankpage'                 => array( 'Пуста_лаштык' ),
+       'BrokenRedirects'           => array( 'Кӱрылтшӧ__вес_вере_колтымаш-влак' ),
+       'Categories'                => array( 'Категорий-влак' ),
+       'ComparePages'              => array( 'Лаштык-влакым_тергымаш' ),
+       'Emailuser'                 => array( 'Пайдаланышылан_серышым_колташ' ),
+       'Longpages'                 => array( 'Кужу_лаштык-влак' ),
        'Preferences'               => array( 'Келыштарымаш' ),
        'Recentchanges'             => array( 'Пытартыш_тӧрлатымаш-влак' ),
        'Search'                    => array( 'Кычалмаш' ),
@@ -80,13 +87,14 @@ $magicWords = array(
        'img_top'                   => array( '1', 'кӱшычын', 'сверху', 'top' ),
        'img_middle'                => array( '1', 'покшелне', 'посередине', 'middle' ),
        'img_bottom'                => array( '1', 'ӱлычын', 'снизу', 'bottom' ),
+       'sitename'                  => array( '1', 'САЙТЛӰМ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
 );
 
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Кузе кылвер-влакым ӱлычын удыралаш?',
 'tog-justify' => 'Абзацым лопкыт дене тӧрлаш',
-'tog-hideminor' => 'Пытартыш тӧрлатымаш-влак лӱмер гыч изирак тӧрлатымаш-влакым ончыкташ огыл',
+'tog-hideminor' => 'Пытартыш тӧрлатымаш-влак радам гыч изи тӧрлатымаш-влакым кораҥдаш',
 'tog-hidepatrolled' => 'Тергыме тӧрлатымаш-влакым пытартыш тӧрлатымаш лӱмерыште шылташ',
 'tog-newpageshidepatrolled' => 'Тергыме лаштык-влакым у лаштык лӱмерыште шылташ',
 'tog-extendwatchlist' => 'Чыла вашталтышым, а пытартыш гына огылым ончыкташлан эскерыме лӱмерым кугемдаш',
@@ -105,18 +113,18 @@ $messages = array(
 'tog-nocache' => 'Лаштыкым кешироватлымым чараш',
 'tog-enotifwatchlistpages' => 'Мыйын эскерыме лӱмер гыч лаштыкыште тӧрлатымыш нерген электрон почто гоч шижтараш',
 'tog-enotifusertalkpages' => 'Мыйын каҥашымаш лаштыкыште тӧрлатымыш нерген электрон почто гоч шижтараш',
-'tog-oldsig' => 'Кидпалын ончылгоч ончымаш:',
+'tog-oldsig' => 'Кызытсе кидпале',
 'tog-showjumplinks' => '"Куснаш …" ешартыш кылверым чӱкташ',
-'tog-watchlisthideown' => 'Эскерыме лӱмер гыч мыйын тӧрлатымаш-влакым ончыкташ огыл',
-'tog-watchlisthidebots' => 'Эскерыме лӱмер гыч бот-влакын тӧрлатымым ончыкташ огыл',
-'tog-watchlisthideminor' => 'Эскерыме лӱмер гыч изирак тӧрлатымаш-влакым ончыкташ огыл',
+'tog-watchlisthideown' => 'Эскерыме лӱмер гыч мыйын тӧрлатымашым кораҥдаш',
+'tog-watchlisthidebots' => 'Эскерыме лӱмер гыч бот-влакын тӧрлатымашыштым кораҥдаш',
+'tog-watchlisthideminor' => 'Эскерыме лӱмер гыч изи тӧрлатымаш-влакым кораҥдаш',
 'tog-ccmeonemails' => 'Моло ушнышо-влаклан колтымо серышын копийжым мыламат колташ',
 'tog-diffonly' => 'Кок версийым таҥастарыме годым лаштыкыште возымым ончыкташ огыл',
 'tog-showhiddencats' => 'Шылтыме категорийым ончыкташ',
 
 'underline-always' => 'Кеч-кунам',
 'underline-never' => 'Нигунам',
-'underline-default' => 'Браузерысе семын палемдыде',
+'underline-default' => 'Браузерысе келыштарымаш дене пайдаланаш',
 
 # Dates
 'sunday' => 'Рушарня',
@@ -174,19 +182,23 @@ $messages = array(
 'pagecategories' => '{{PLURAL:$1|Категорий|Категорий}}',
 'category_header' => '"$1" категорийыште лаштык-влак',
 'subcategories' => 'Ӱлылкатегорий-влак',
+'category-media-header' => '"$1" категорийыште файл-влак',
+'category-empty' => "''Ты жаплан тиде категорийыште нимоат уке.''",
 'hidden-categories' => '{{PLURAL:$1|Шылтыме категорий|Шылтыме категорий-влак}}',
 'hidden-category-category' => 'Шылтымо категорий-влак',
 'category-subcat-count' => '{{PLURAL:$2|Тиде категорийыш ик ӱлылкатегорий гына пура.|{{PLURAL:$1|Тыгай $1 ӱлылкатегорий|Тыгане $1 ӱлылкатегорий-влак}} тиде категорийыште, чыла $2.}}',
 'category-article-count' => '{{PLURAL:$2|Тиде категорийыш ик лаштык гына пура.|{{PLURAL:$1|Тыгай $1 лаштык|Тыгане $1 лаштык-влак}} тиде категорийыште, чыла $2.}}',
+'category-file-count' => '{{PLURAL:$2|Тиде категорийыш ик лаштык гына пура.|{{PLURAL:$1|$1 лаштык|$1 лаштык}} тиде категорийыште, чылажге $2.}}',
 'listingcontinuesabbrev' => '(умбакыжым)',
+'noindex-category' => 'Шотыш налдыме лаштык-влак',
 
 'about' => 'Нерген',
 'article' => 'Возымо лаштык',
 'newwindow' => '(у тӧрзаште почылтеш)',
 'cancel' => 'Чараш',
 'moredotdotdot' => 'Рашрак...',
-'mypage' => 'Ð\9cÑ\8bйÑ\8bн Ð»аштык',
-'mytalk' => 'Ð\9cÑ\8bйÑ\8bн Ðºаҥашымаш',
+'mypage' => 'Ð\9bаштык',
+'mytalk' => 'Ð\9aаҥашымаш',
 'anontalk' => 'Каҥашымаш тиде IP нерген',
 'navigation' => 'Навигаций',
 
@@ -196,6 +208,7 @@ $messages = array(
 'qbpageoptions' => 'Тиде лаштык',
 'qbmyoptions' => 'Мыйын лаштык-влак',
 'qbspecialpages' => 'Лӱмын ыштыме лаштык-влак',
+'faq' => 'ЧӱВаЙо (Чӱчкыдын вашлиялтше йодыш-влак)',
 
 # Vector skin
 'vector-action-addsection' => 'У ӱжашым тӱҥалаш',
@@ -203,14 +216,15 @@ $messages = array(
 'vector-action-move' => 'Кусараш',
 'vector-action-protect' => 'Тӧрлатымаш деч аралаш',
 'vector-action-undelete' => 'Шӧрымым пӧртылаш',
-'vector-action-unprotect' => 'Ð\90Ñ\80алаÑ\88 Ð¾Ð³Ñ\8bл',
+'vector-action-unprotect' => 'Ð\9eÑ\80олÑ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аÑ\88',
 'vector-view-create' => 'Ышташ',
 'vector-view-edit' => 'Тӧрлаташ',
 'vector-view-history' => 'Эртымгорным ончалаш',
 'vector-view-view' => 'Лудаш',
 'vector-view-viewsource' => 'Тӱҥалтыш текстым ончалаш',
 'actions' => 'Сомылка-влак',
-'namespaces' => 'Лӱм-влакын кумдык-влак',
+'namespaces' => 'Лӱм-влак ора',
+'variants' => 'Вариант-влак',
 
 'errorpagetitle' => 'Йоҥылыш',
 'returnto' => '$1 деке пӧртылаш.',
@@ -252,12 +266,12 @@ $messages = array(
 'viewtalkpage' => 'Ончалаш каҥашымашым',
 'otherlanguages' => 'Вес йылме дене',
 'redirectedfrom' => '(Колтымо $1 гыч)',
-'redirectpagesub' => 'Вес вереш колтышо лаштык',
+'redirectpagesub' => 'Вес вере колтышо лаштык',
 'lastmodifiedat' => 'Тиде лаштыкым пытартыш гана $2 $1 тӧрлымӧ.',
 'protectedpage' => 'Тӧрлатымаш деч аралыме лаштык',
 'jumpto' => 'Куснаш:',
 'jumptonavigation' => 'навигацийыш',
-'jumptosearch' => 'кычалмашшке',
+'jumptosearch' => 'кычалмаш',
 'pool-errorunknown' => 'Палыдыме йоҥылыш',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
@@ -266,14 +280,16 @@ $messages = array(
 'copyright' => 'Лаштыкыште возымо $1 йӧн дене почмо.',
 'copyrightpage' => '{{ns:project}}:Автор кертыж',
 'currentevents' => 'Кызытсе событий',
+'currentevents-url' => 'Project:Мо кызыт лийын',
 'disclaimers' => 'Вуйшиймаш деч кораҥмаш',
 'disclaimerpage' => 'Project:Вуйшиймаш деч кораҥмаш',
-'edithelp' => 'Тӧрлатымаште полыш',
+'edithelp' => 'Тӧрлатымаш полыш',
 'edithelppage' => 'Help:Тӧрлымаш',
 'helppage' => 'Help:Полшык',
 'mainpage' => 'Тӱҥ лаштык',
 'mainpage-description' => 'Тӱҥ лаштык',
 'portal' => 'Тӱшка',
+'portal-url' => 'Project:Пашазе-влакын тӱшкашт',
 'privacy' => 'Конфиденциальность политике',
 'privacypage' => 'Project:Конфиденциальность политике',
 
@@ -282,7 +298,7 @@ $messages = array(
 'ok' => 'Йӧра',
 'retrievedfrom' => 'Налме вер — "$1"',
 'youhavenewmessages' => 'Тендан $1 уло ($2).',
-'newmessageslink' => 'у увертыш-влак',
+'newmessageslink' => 'У серыш',
 'newmessagesdifflink' => 'пытартыш тӧрлатымаш',
 'editsection' => 'тӧрлаташ',
 'editold' => 'тӧрлаташ',
@@ -326,12 +342,12 @@ $messages = array(
 'missingarticle-rev' => '(тӱрлык#: $1)',
 'internalerror' => 'Кӧргысӧ йоҥылыш',
 'internalerror_info' => 'Кӧргысӧ йоҥылыш: $1',
-'filecopyerror' => '«$1» Ð³Ñ\8bÑ\87 Â«$2» Ñ\84айлÑ\8bÑ\88 ÐºÐ¾Ð¿Ð¸Ð¹Ñ\8bм Ñ\8bÑ\88Ñ\82аÑ\88 Ð»Ð¸Ð¹Ð´Ñ\8bме.',
+'filecopyerror' => '«$1» Ð³Ñ\8bÑ\87 Â«$2» Ñ\84айлÑ\8bÑ\88 ÐºÐ¾Ð¿Ð¸Ð¹Ñ\8bм Ñ\8bÑ\88Ñ\82аÑ\88 Ð¾Ðº Ð»Ð¸Ð¹.',
 'fileexistserror' => '«$1» файлыш возыкым ышташ лийдыме: файл уло.',
 'unexpected' => 'Келшыдыме кугыт: «$1»=«$2».',
 'cannotdelete-title' => '"$1" лаштыкым шӧраш ок лий',
-'badtitle' => 'Сай Ð¾Ð³Ñ\8bл лӱм',
-'badtitletext' => 'Ð\99одмо Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ó§ Ð¹Ð¾Ò¥Ñ\8bлÑ\8bÑ\88, Ð°Ð»Ðµ Ñ\8fÑ\80а, Ð°Ð»Ðµ Ð¹Ñ\8bлме ÐºÐ¾ÐºÐ»Ð° Ð°Ð»Ðµ Ð¸Ð½Ñ\82еÑ\80-вики Ð»Ó±Ð¼Ð¶Ó§ Ð¹Ð¾Ò¥Ñ\8bлÑ\8bÑ\88. Ð\90ла лӱмыштӧ кӱлдымӧ тамга улыт.',
+'badtitle' => 'Уда лӱм',
+'badtitletext' => 'Ð\99одмо Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ó§ Ð¹Ð¾Ò¥Ñ\8bлÑ\8bÑ\88, Ð°Ð»Ðµ Ñ\8fÑ\80а, Ð°Ð»Ðµ Ð¹Ñ\8bлме ÐºÐ¾ÐºÐ»Ð° Ð°Ð»Ðµ Ð¸Ð½Ñ\82еÑ\80-вики Ð»Ó±Ð¼Ð¶Ó§ Ð¹Ð¾Ò¥Ñ\8bлÑ\8bÑ\88. Ð\90ле лӱмыштӧ кӱлдымӧ тамга улыт.',
 'viewsource' => 'Тӱҥалтыш текст',
 
 # Virus scanner
@@ -342,7 +358,7 @@ $messages = array(
 'yourname' => 'Пайдаланышын лӱмжӧ:',
 'yourpassword' => 'Шолыпмут:',
 'yourpasswordagain' => 'Шолыпмутым угыч пуртымаш:',
-'remembermypassword' => 'Тиде ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80Ñ\8bÑ\88Ñ\82о Ð¼Ñ\8bйÑ\8bн Ñ\88олÑ\8bпмÑ\83Ñ\82ым шарнаш (эн шуко $1 {{PLURAL:$1|кечылан|кечылан}})',
+'remembermypassword' => 'Тиде ÐºÐ¾Ð¼Ð¿Ñ\8cÑ\8eÑ\82еÑ\80Ñ\8bÑ\88Ñ\82е Ð¼Ñ\8bйым шарнаш (эн шуко $1 {{PLURAL:$1|кечылан|кечылан}})',
 'yourdomainname' => 'Тендан домен:',
 'login' => 'Шке денет палымым ыште',
 'nav-login-createaccount' => 'Пураш/Регистрацийым эрте',
@@ -355,7 +371,8 @@ $messages = array(
 'createaccount' => 'Регистрацийым эрте',
 'gotaccount' => "Тый регистрацийым эртенат? '''$1'''.",
 'gotaccountlink' => 'Шке денет палымым ыште',
-'createaccountmail' => 'e-mail дене',
+'userlogin-resetlink' => 'Лӱмдам але шолыпмутдам монденда?',
+'createaccountmail' => 'Кӱчык жаплан чокым ыштыме шолыпмутым мылам e-mail дене колташ',
 'nosuchuser' => '"$1" лӱман пайдаланыше уке.
 Пайдаланышын лӱмыштӧ йӱкпале-влакын кугытшо тӱрыс лийшаш.
 Лӱмым чын возымым терге але [[Special:UserLogin/signup|регистрацийым эрте]].',
@@ -369,7 +386,7 @@ $messages = array(
 'passwordtooshort' => 'Шолыпмут {{PLURAL:$1|1 символ|$1 символ}} деч шагал огыл лийшаш.',
 'mailmypassword' => 'У шолыпмутым колташ',
 'passwordremindertitle' => '{{SITENAME}} сайтлан жаплан ыштыме у шолыпмут',
-'passwordremindertext' => '{{SITENAME}} сайтлан ($4) $1 IP адрес гыч ала-кӧ (але тый) у шолыпмутым йодын. "$2" пайдаланышылан жаплан ыштыме у шолыпмутым ыштыме да "$3" электрон адресыш колтымо. Тидым тый йодынат гын, системыш у шолыпмут дене пуро.
+'passwordremindertext' => '{{SITENAME}} сайтлан ($4) $1 IP адрес гыч ала кӧ (але тый шкеак) у шолыпмутым йодын. "$2" пайдаланышылан жаплан ыштыме у шолыпмутым ыштыме да "$3" электрон адресыш колтымо. Тидым тый йодынат гын, системыш у шолыпмут дене пуро.
 
 Йодмашым вес еҥ ыштен гын, але тый шке шолыпмутетым шарненат гын, тиде увертышым шотыш налде, тошто шолыпмут дене пайдалане.',
 'noemail' => '"$1" пайдаланыше электрон адресым палемден огыл.',
@@ -403,8 +420,8 @@ $messages = array(
 'nowiki_tip' => 'Вики-форматированийым шотыш налаш огыл',
 'image_tip' => 'Пуртымо сӱрет',
 'media_tip' => 'Пуртымо медиа-файл',
-'sig_tip' => 'Тыйын кидпалет да шындеме жап ден кече',
-'hr_tip' => 'ТоÑ\80еÑ\88 (Ñ\88Ñ\83Ñ\8dн кучылт)',
+'sig_tip' => 'Тыйын кидпалет, шындыме жап да кече',
+'hr_tip' => 'ТоÑ\80еÑ\88 (Ñ\87Ó±Ñ\87кÑ\8bдÑ\8bн Ð¸Ñ\82 кучылт)',
 
 # Edit pages
 'summary' => 'Тӧрлатымаш нерген:',
@@ -415,16 +432,20 @@ $messages = array(
 'preview' => 'Ончылгоч ончымаш',
 'showpreview' => 'Ончылгоч ончымаш',
 'showdiff' => 'Тӧрлатымашым ончыкташ',
-'anoneditwarning' => "'''Тӱткӧ лий:''': Тый шкенетым палымым ыштен отыл. Тыйын IP-адресет лаштыкын вашталтымаш эртымгорныштыжо возалтен кодеш.",
+'anoneditwarning' => "'''Тӱткӧ лий:''': Тый авторизацийым эртен отыл. Тыйын IP-адресет лаштыкын вашталтымаш эртымгорныштыжо возалт кодеш.",
 'summary-preview' => 'Тӧрлатымаш нерген ончылгоч ончымаш:',
 'accmailtitle' => 'Шолыпмут колтымо.',
 'newarticle' => '(У)',
-'newarticletext' => "ТÑ\8bй ÐºÑ\8bлвеÑ\80 Ð¿Ð¾Ñ\87еÑ\88 Ñ\83ке Ñ\83лÑ\88о Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bÑ\88 ÐºÑ\83Ñ\81ненаÑ\82.
-Лаштыкым ышташлан ӱлнӧ возаш тӱҥал (сайрак палашлан [[{{MediaWiki:Helppage}}|полшыкым]] ончал).
+'newarticletext' => "ТÑ\8bгай Ð»Ó±Ð¼Ð°Ð½ Ð»Ð°Ñ\88Ñ\82Ñ\8bк Ñ\83ке.
\9bаÑ\88Ñ\82Ñ\8bкÑ\8bм Ñ\8bÑ\88Ñ\82аÑ\88лан Ó±Ð»Ð½Ó§ Ð²Ð¾Ð·Ð°Ñ\88 Ñ\82ӱҥал (Ñ\81айÑ\8bнÑ\80ак Ð¿Ð°Ð»Ð°Ñ\88лан [[{{MediaWiki:Helppage}}|полÑ\88Ñ\8bкÑ\8bм]] Ð¾Ð½Ñ\87ал).
 Тый тышке йонгылыш логалынат гын, браузерыште '''шенгек''' полдышым темдал.",
 'noarticletext' => 'Кызытсе жаплан тиде лаштыкыште нимом возымо огыл.
 Тый тиде лаштыкын лӱмжым вес лаштык-влакыште [[Special:Search/{{PAGENAME}}|кычалын]] кертат, але <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журнал-влакыште кычалын] кертат, але [{{fullurl:{{FULLPAGENAME}}|action=edit}} тыгай лӱман лаштыкым ышташ] кертат</span>.',
-'clearyourcache' => "'''Ешартыш''': Аралыме деч вара вашталтышым ужашлан браузеретын кэшыжым эрыкташ логалын кертеш. '''Mozilla / Firefox / Safari:''' ''Shift''-ым темдал кучен ''Reload''-ым темдал але ''Ctrl-F5'' але ''Ctrl-R'' темдал (Mac-влак ''Command-R''); '''Konqueror:''' темдал ''Reload'' полдышым але ''F5'' темдал; '''Opera:''' ''Tools→Preferences''-ыште кэшым эрыкте; '''Internet Explorer:''' ''Ctrl''-ым темдал кучен ''Refresh''-ым темдал але ''Ctrl-F5'' темдал.",
+'clearyourcache' => "'''Замечание.''' Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.
+* '''Firefox / Safari:''' Удерживая клавишу ''Shift'', нажмите на панели инструментов ''Обновить'' либо нажмите ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac)
+* '''Google Chrome:''' Нажмите ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)
+* '''Internet Explorer:''' Удерживая ''Ctrl'', нажмите ''Обновить'' либо нажмите ''Ctrl-F5''
+* '''Opera:''' Выберите очистку кэша в меню ''Инструменты → Настройки''",
 'previewnote' => "'''Тиде ончылгоч ончымаш гына;
 вашталтыш-влакым эше аралыме огыл!'''",
 'editing' => 'Тӧрлаталтеш $1',
@@ -432,38 +453,43 @@ $messages = array(
 'yourtext' => 'Тендан текст',
 'yourdiff' => 'Ойыртем',
 'copyrightwarning' => "Шотыш нал, чыла пашам {{SITENAME}} проектыш $2 лицензий почеш лукмо семын шотлыман($1 ончал). 
¢Ñ\8bйÑ\8bн Ñ\82екÑ\81Ñ\82еÑ\82 Ð²ÐµÑ\81е-влаклан Ñ\8bнже Ð»Ð¾Ð³Ð°Ð» Ð´Ð° ÐºÐµÑ\80ек ÐºÓ§ Ñ\82Ñ\83дÑ\8bм Ñ\8bнже Ñ\82Ó§Ñ\80лаÑ\82ен ÐºÐµÑ\80Ñ\82 Ð¼Ð°Ð½Ñ\8bн, тышке тудым ит шыҥдаре.<br />
-ТÑ\8bгак Ñ\82идÑ\8bм Ñ\82Ñ\8bй Ñ\88ке Ð²Ð¾Ð·ÐµÐ½Ð°Ñ\82 Ð°Ð»Ðµ Ñ\82Ñ\83дÑ\8bм Ñ\8dÑ\80Ñ\8bкан Ñ\88аÑ\80калаÑ\88 Ð»Ð¸Ð¹Ñ\88е Ð²ÐµÑ\80 Ð³Ñ\8bÑ\87 Ð½Ð°Ð»Ñ\8bнаÑ\82 Ð¼Ð°Ð½Ñ\8bн, мутым пуэт.<br />
\92озÑ\8bмеÑ\82Ñ\8bм Ð½Ð¸Ð³Ó§Ð»Ð°Ð½ Ð¿Ð°Ð¹Ð´Ð°Ð»Ð°Ð½Ð°Ñ\88, Ñ\82Ó§Ñ\80лаÑ\82аÑ\88 Ñ\8bнеÑ\82 Ð¿Ñ\83 Ð³Ñ\8bн тышке тудым ит шыҥдаре.<br />
+ТÑ\8bгак Ñ\82екÑ\81Ñ\82Ñ\8bм Ñ\88ке Ð²Ð¾Ð·Ñ\8bмо Ð°Ð»Ðµ Ñ\82Ñ\83дÑ\8bм Ñ\8dÑ\80Ñ\8bкан Ð²ÐµÑ\80 Ð³Ñ\8bÑ\87 Ð½Ð°Ð»Ð¼Ðµ Ñ\88оÑ\82Ñ\8bÑ\88Ñ\82о мутым пуэт.<br />
 '''АВТОР АЛЕ ТУДЫН ПРАВАМ АРАЛЫШЕ-ВЛАК ДЕЧ ЙОДДЕ МАТЕРИАЛЫМ ИТ ШЫҤДАРЕ!'''",
 'templatesused' => 'Тиде кызыт улшо лаштыкыште кучылтмо {{PLURAL:$1|ямдылык|ямдылык-влак}}:',
 'templatesusedpreview' => 'Тиде ончылгоч ончымаште кучылтмо {{PLURAL:$1|ямыдылык|ямдылык-влак}}:',
 'template-protected' => '(тӧрлаташ чарыме)',
 'template-semiprotected' => '(верын аралыме)',
 'hiddencategories' => 'Тиде лаштык $1 {{PLURAL:$1|шылтыме категорийыш|шылтыме категорийыш}} лектеш:',
-'permissionserrorstext-withaction' => "Тыйын '''$2''' кертмешет шагал. Тиде {{PLURAL:$1|амал ден|амал дене}}:",
-'moveddeleted-notice' => 'Тиде лаштык шӧрымӧ лийын.
-Тиде лаштыклан шӧрымӧ да кусарыме нерген журнал ӱлнӧ ончыктымо.',
+'permissionserrorstext-withaction' => "Тыйын '''$2''' кертмашет шагал. Тиде {{PLURAL:$1|амал ден|амал дене}}:",
+'recreate-moveddeleted-warn' => "'''Йолташ, тиде лаштыкым тиддеч ончыч шӧреныт.''' Тудым илаҥдарыме деч ончыч, тыгай лаштык кӱлешак мо - тергыман. Ӱлнырак шӧрымаш да лӱм вашталтымаш журнал-влакым шергал лекташ лиеш.",
+'moveddeleted-notice' => 'Тиде лаштык шӧралтын.
+Лаштыклан шӧрымӧ да кусарыме нерген журнал ӱлнӧ ончыктымо.',
 
 # History pages
 'viewpagelogs' => 'Тиде лаштыклан журнал-влакым ончыкташ',
 'currentrev' => 'Кызытсе тӱрлык',
 'currentrev-asof' => '$1 кечын кызытсе тӱрлык',
 'revisionasof' => '$1 тӱрлык',
+'revision-info' => '$1; $2 деч версий',
 'previousrevision' => '← Ончычсо тӱрлык',
-'nextrevision' => 'Вес тӱрлык →',
-'currentrevisionlink' => 'Кызытсе тӱрлык',
+'nextrevision' => 'Весе →',
+'currentrevisionlink' => 'Кызытсе',
 'cur' => 'кызыт',
 'next' => 'весе',
 'last' => 'ончычсо',
 'page_first' => 'икымше',
 'page_last' => 'пытартыш',
-'histlegend' => "Таҥастарашлаш ӱлнӧ версийым ойырымо полдышым але Enter-ым темдал.<br />
-Умылтарымаш: (кызыт) = кызытсе версий деч ойыртем, (ончычсо) = ончычсо версий деч ойыртем, '''и''' = изирак тӧрлатыме.",
+'histlegend' => "Таҥастарашлаш ӱлыл версийыште ойырымаш полдышым да Enter-ым темдал.<br />
+Умылтарымаш: (кызыт) = кызытсе версий деч ойыртем, (ончычсо) = ончычсо версий деч ойыртем, '''и''' = изи тӧрлатымаш.",
 'history-fieldset-title' => 'Эртымгорным ончыкташ',
 'histfirst' => 'Эн тошто',
 'histlast' => 'Эн у',
 'historyempty' => '(яра)',
 
+# Revision feed
+'history-feed-item-nocomment' => '$1 $2што',
+
 # Revision deletion
 'rev-delundel' => 'ончыкташ/шылташ',
 'rev-showdeleted' => 'ончыкташ',
@@ -488,6 +514,7 @@ $messages = array(
 'lineno' => '$1 корно:',
 'compareselectedversions' => 'Ойырымо версий-влакым таҥастараш',
 'editundo' => 'чараш',
+'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия|не показаны $1 промежуточные версии|не показаны $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников}})',
 
 # Search results
 'searchresults' => 'Кычалын мумо',
@@ -499,29 +526,36 @@ $messages = array(
 'notextmatches' => 'Лаштык-влакыште икгайлык возымо уке',
 'prevn' => 'кодшо {{PLURAL:$1|$1}}',
 'nextn' => 'весе {{PLURAL:$1|$1}}',
+'shown-title' => 'Лаштыкыште $1 {{PLURAL:$1|возымаш|возымашым}} ончыкташ',
 'viewprevnext' => 'Ончал ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-new' => "'''Тиде вики-проектыште «[[:$1]]» лӱман лаштыкым ышташ!'''",
 'searchhelp-url' => 'Help:Вуйлымаш',
 'searchprofile-articles' => 'Возымо лаштык-влак',
-'searchprofile-images' => 'Мультимедиа',
+'searchprofile-project' => 'Полыш да проект лаштык',
+'searchprofile-images' => 'Мультимедий',
 'searchprofile-everything' => 'Чыла',
+'searchprofile-advanced' => 'Кумдарак',
 'searchprofile-articles-tooltip' => 'Кычалмаш $1ште',
 'searchprofile-project-tooltip' => 'Кычалмаш $1ште',
 'searchprofile-images-tooltip' => 'Файл-влакым кычалмаш',
+'searchprofile-everything-tooltip' => 'Чыла лаштык-влакыште кычалаш (каҥашымаш лаштык-влакыштат)',
+'searchprofile-advanced-tooltip' => 'Искать в заданных пространствах имён',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 мут|$2 мут}})',
+'search-result-category-size' => '$1 {{PLURAL:$1|вхождение|вхождения|вхождений}} ($2 {{PLURAL:$2|подкатегория|подкатегории|подкатегорий}}, $3 {{PLURAL:$3|файл|файла|файлов}}).',
 'search-redirect' => '($1 вес вере колтымаш)',
 'search-section' => '(ужаш $1)',
 'search-suggest' => 'Але те $1 возынеда ыле',
 'search-interwiki-caption' => 'Родо проект-влак',
 'search-interwiki-default' => "$1'ште мумо:",
 'search-interwiki-more' => '(эше)',
+'searchrelated' => 'кылдалтше',
 'searchall' => 'чыла',
-'nonefound' => "'''Ð\95Ñ\88аÑ\80Ñ\82Ñ\8bÑ\88''':  Ð\9fоÑ\81на ÐºÐ°Ð»Ð°Ñ\81Ñ\8bме Ð¾Ð³Ñ\8bл Ð´Ñ\8bк, ÐºÑ\8bÑ\87алмаÑ\88 Ñ\8eжо Ð»Ó±Ð¼-влакÑ\8bн ÐºÑ\83мдÑ\8bкÑ\8bÑ\88Ñ\82о Ñ\8dÑ\80Ñ\82а. Ð£Ð»Ð¾ Ð»Ó±Ð¼-влакÑ\8bн ÐºÑ\83мдÑ\8bкÑ\8bÑ\88Ñ\82о ÐºÑ\8bÑ\87алаÑ\88лан(Ñ\87ӱкÑ\82ен ÐºÐ°Ò¥Ð°Ñ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bм, Ñ\8fмдÑ\8bлÑ\8bк-влакÑ\8bм Ð¸ Ñ\82Ñ\83ге Ð¼Ð¾Ð»Ð°Ñ\82) Ñ\88ке Ð¹Ð¾Ð´Ð¼Ð°Ñ\88Ñ\8bÑ\88Ñ\82еÑ\82 ''all:'' Ð¿Ñ\80еÑ\84икÑ\81Ñ\8bм ÐºÑ\83Ñ\87Ñ\8bлÑ\82, Ð°Ð»Ðµ ÐºÓ±Ð»ÐµÑ\88ан Ð»Ó±Ð¼-влакÑ\8bн ÐºÑ\83мдÑ\8bкÑ\8bм Ð¾Ð½Ñ\87Ñ\8bкÑ\82о.",
-'search-nonefound' => 'ТÑ\8bйÑ\8bн Ð¹Ð¾Ð´Ñ\8bÑ\88лан Ð½Ð¸Ð¼Ð¾Ð¼ ÐºÑ\8bÑ\87ален Ð¼Ñ\83мо Ñ\83ке.',
+'nonefound' => "'''Ð\95Ñ\88аÑ\80Ñ\82Ñ\8bÑ\88''':  Ð\9fоÑ\81на Ð¿Ð°Ð»ÐµÐ¼Ð´Ñ\8bме Ð¾Ð³Ñ\8bл Ð³Ñ\8bн, ÐºÑ\8bÑ\87алмаÑ\88 Ñ\8eжо Ð»Ó±Ð¼-влак ÐºÐ¾ÐºÐ»Ð°Ñ\88Ñ\82е Ð³Ñ\8bна Ñ\8dÑ\80Ñ\82а. Ð§Ñ\8bла Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влак ÐºÐ¾ÐºÐ»Ð°Ñ\88Ñ\82е ÐºÑ\8bÑ\87алаÑ\88лан (каҥаÑ\88Ñ\8bмаÑ\88, Ñ\8fмдÑ\8bлÑ\8bк-влак Ð´Ð° Ñ\82.м.) Ñ\88ке Ð¹Ð¾Ð´Ð¼Ð°Ñ\88Ñ\8bÑ\88Ñ\82еÑ\82 ''all:'' Ð¿Ñ\80еÑ\84икÑ\81Ñ\8bм ÐºÑ\83Ñ\87Ñ\8bлÑ\82, Ð°Ð»Ðµ ÐºÓ±Ð»ÐµÑ\88ан Ð»Ó±Ð¼-влакÑ\8bм Ð¿Ð°Ð»ÐµÐ¼Ð´Ðµ.",
+'search-nonefound' => 'ТÑ\8bйÑ\8bн Ð¹Ð¾Ð´Ñ\8bÑ\88еÑ\82 Ð¿Ð¾Ñ\87еÑ\88 Ð½Ð¸Ð¼Ð¾ Ð¼Ñ\83алÑ\82Ñ\8bн Ð¾Ð³Ñ\8bл',
 'powersearch' => 'Сайынрак кычал',
 'powersearch-legend' => 'Сайынрак кычалаш',
 'powersearch-ns' => 'Кычалаш тиде лӱм-влакын кумдыкышт-влакыште:',
-'powersearch-redir' => 'Вес верек колтымо лаштык-влакым ончыкташ',
+'powersearch-redir' => 'Вес вере колтымо лаштык-влакым ончыкташ',
 'powersearch-field' => 'Кычалаш',
 'powersearch-togglelabel' => 'Сайлаш:',
 'powersearch-toggleall' => 'Чыла',
@@ -539,17 +573,17 @@ $messages = array(
 'prefs-rc' => 'Шукертсе огыл тӧрлымаш-влак',
 'prefs-watchlist' => 'Эскерымаш лӱмер',
 'prefs-watchlist-days' => 'Мыняр кече эскерымаш лӱмерыште ончыкталтеш?',
-'prefs-watchlist-edits' => 'Ð\9cÑ\8bнÑ\8fÑ\80 Ñ\82Ó§Ñ\80лаÑ\82Ñ\8bмаÑ\88Ñ\8bм Ñ\8bÑ\88Ñ\82аÑ\88 Ð»Ð¸Ð¹Ð¼Ñ\8bм ÐºÑ\83гемдÑ\8bме Ñ\8dÑ\81кеÑ\80Ñ\8bмаÑ\88 Ð»Ó±Ð¼ÐµÑ\80Ñ\8bÑ\88Ñ\82е Ð¾Ð½Ñ\87Ñ\8bкÑ\82Ñ\8bмо?',
+'prefs-watchlist-edits' => 'Ð\9cÑ\8bнÑ\8fÑ\80 Ñ\82Ó§Ñ\80лаÑ\82Ñ\8bмаÑ\88Ñ\8bм Ñ\8dÑ\81кеÑ\80Ñ\8bмаÑ\88 Ð»Ó±Ð¼ÐµÑ\80Ñ\8bÑ\88Ñ\82еÑ\82 Ð¾Ð½Ñ\87Ñ\8bкÑ\82Ñ\8bман?',
 'prefs-misc' => 'Тӱрлӧ',
 'prefs-resetpass' => 'Шолыпмутым вашталташ',
 'prefs-email' => 'Электрон почто келыштарымаш',
 'prefs-rendering' => 'Тӱжвал сын',
 'saveprefs' => 'Аралаш',
 'resetprefs' => 'Тӧрлатымым шотыш налаш огыл',
-'restoreprefs' => 'ЧÑ\8bла Ð¾Ð¹Ð»Ñ\8bде ÐºÐµÐ»Ñ\8bÑ\88Ñ\82аÑ\80Ñ\8bмаÑ\88Ñ\8bм Ð¿Ó§Ñ\80Ñ\82Ñ\8bлаш',
+'restoreprefs' => 'ТӱҥалÑ\82Ñ\8bÑ\88 ÐºÐµÐ»Ñ\8bÑ\88Ñ\82аÑ\80Ñ\8bмаÑ\88Ñ\8bм Ð¿Ó§Ñ\80Ñ\82Ñ\8bлÑ\82аш',
 'prefs-editing' => 'Тöрлатымаш',
 'searchresultshead' => 'Кычалме',
-'savedprefs' => 'ТÑ\8bйÑ\8bн ÐºÐµÐ»Ñ\8bÑ\88Ñ\82аÑ\80Ñ\8bмаÑ\88ым аралыме.',
+'savedprefs' => 'Ð\9aелÑ\8bÑ\88Ñ\82аÑ\80Ñ\8bмаÑ\88еÑ\82ым аралыме.',
 'timezonelegend' => 'Шагат ÿштö:',
 'localtime' => 'Верысе жап:',
 'timezoneregion-africa' => 'Африка',
@@ -562,14 +596,14 @@ $messages = array(
 'timezoneregion-europe' => 'Европо',
 'timezoneregion-indian' => 'Индий таптеҥыз',
 'allowemail' => 'Вес ушнышо-влак деч электрон почтым налаш кӧнаш',
-'prefs-searchoptions' => 'Ð\9aÑ\8bÑ\87алмаÑ\88',
+'prefs-searchoptions' => 'Кычалаш',
 'prefs-namespaces' => 'Лӱм-влакын кумдыкышт-влак',
-'default' => 'ойлыде',
+'default' => 'тӱҥалтыш',
 'prefs-files' => 'Файл-влак',
 'prefs-emailconfirm-label' => 'Электрон почто пеҥгыдемдыме:',
 'youremail' => 'Электрон почто:',
-'username' => 'Пайдаланышын лӱмжӧ:',
-'uid' => 'Пайдаланышын ID-же:',
+'username' => '{{GENDER:$1|Пайдаланышын лӱмжӧ|Пайдаланышын лӱмжӧ}}:',
+'uid' => '{{GENDER:$1|Пайдаланышын}} ID-же:',
 'prefs-memberingroups' => '{{PLURAL:$1|Тӱшкаште шогышо|Тӱшка-влакыште шогышо}}:',
 'yourrealname' => 'Чын лӱмжӧ:',
 'yourlanguage' => 'Йылме:',
@@ -577,7 +611,8 @@ $messages = array(
 'gender-male' => 'Пӧръеҥ',
 'gender-female' => 'Ӱдырамаш',
 'email' => 'Электрон почто',
-'prefs-help-email' => 'Электрон почтын адресшым ончыктыде кертат, адакшым тудо моло ушнышо-влаклан тыйын лаштык гоч тый денет кылым кучаш йӧным ышта, тыгодымак нунылан палыдыме кодеш.',
+'prefs-help-email' => 'Электрон почтын адресым лучо возен кодыза. Трук шолыпмутым мондеда - шолпмутым Википедий электрон адресышкыда колта.',
+'prefs-help-email-others' => 'Моло пайдаланыше-влак тендан дене электрон почто гоч кылым кучен кертыт. Ты годым почтыдан адресше нигӧлан ок кой, лач лаштыкыштыда але каҥашымаш лаштыкыштыда серышым возашлан кылвер пыжыктыме лиеш.',
 'prefs-i18n' => 'Калык коклаште',
 'prefs-signature' => 'Кидпале',
 
@@ -606,16 +641,18 @@ $messages = array(
 'recentchanges-legend' => 'Пытартыш тӧрлатымаш-влакын келыштарымашышт',
 'recentchanges-summary' => 'Тиде лаштыкыште пытартыш тӧрлатымашым шекланаш.',
 'recentchanges-feed-description' => 'Тиде кылыште пытартыш тӧрлатымашым шекланаш.',
-'recentchanges-label-newpage' => 'Тиде тӧрлатымаш дене у лаштыкым ыштеныт',
-'recentchanges-label-minor' => 'Тиде изирак тӧрлатымаш',
+'recentchanges-label-newpage' => 'Тиде тӧрлатымаш дене у лаштык ышталтын',
+'recentchanges-label-minor' => 'Тиде изи тӧрлатымаш',
 'recentchanges-label-bot' => 'Тиде тӧрлатымашым бот ыштен',
-'recentchanges-label-unpatrolled' => 'Тиде тӧрлатымаш эше терген налын огыл',
+'recentchanges-label-unpatrolled' => 'Тиде тӧрлатымашым нигӧ терген огыл',
 'rcnote' => "Ӱлнӧ {{PLURAL:$1|'''1'''|'''$1'''}} вашталтыш пытартыш {{PLURAL:$2||'''$2'''}} кечылан, $5-лан, $4-лан.",
+'rcnotefrom' => "Ниже перечислены изменения с '''$2''' (не более '''$1''').",
 'rclistfrom' => '$1 гыч тӱҥалын у вашталтымашым ончыкташ',
-'rcshowhideminor' => 'Изирак тӧрлымым $1',
+'rcshowhideminor' => 'Изи тӧрлатымашым $1',
 'rcshowhidebots' => 'Бот-влакым $1',
 'rcshowhideliu' => 'Шолып пайдаланыше-влакым $1',
 'rcshowhideanons' => 'Ончыкталтше пайдаланыше-влакым $1',
+'rcshowhidepatr' => '$1 тергыме тӧрлатымаш',
 'rcshowhidemine' => 'Мыйын тӧрлымым $1',
 'rclinks' => 'Пытартыш $2 кечылан $1 вашталтымашым ончыкташ<br />$3',
 'diff' => 'ойырт.',
@@ -625,7 +662,7 @@ $messages = array(
 'minoreditletter' => 'и',
 'newpageletter' => 'У',
 'boteditletter' => 'б',
-'rc-enhanced-expand' => 'ТӱÑ\82кÑ\8bнÑ\80акÑ\8bм Ð¾Ð½Ñ\87Ñ\8bкÑ\82аÑ\88 (JavaScript кӱлеш)',
+'rc-enhanced-expand' => 'Ð\9fоказаÑ\82Ñ\8c Ð´ÐµÑ\82али  (JavaScript кӱлеш)',
 'rc-enhanced-hide' => 'Рашлык-влакым шылташ',
 
 # Recent changes linked
@@ -634,8 +671,8 @@ $messages = array(
 'recentchangeslinked-toolbox' => 'Ваш кылдалтше тӧрлатымаш-влак',
 'recentchangeslinked-title' => '"$1" лаштыклан кылдалтше тӧрлатымаш-влак',
 'recentchangeslinked-noresult' => 'Ончыктымо пагытыште кылдалтше лаштыклаште вашталтыш лийын огыл.',
-'recentchangeslinked-summary' => "Тиде Ñ\88Ñ\83кеÑ\80Ñ\82Ñ\81е Ð¾Ð³Ñ\8bл Ñ\82Ó§Ñ\80лÑ\8bмӧ Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bн, ÐºÑ\83дÑ\8bжо Ð¿Ð°Ð»ÐµÐ¼Ð´Ñ\8bме Ð»Ð°Ñ\88Ñ\82Ñ\8bк Ð´ÐµÐ½Ðµ ÐºÑ\8bлдалÑ\82Ñ\8bнÑ\8bÑ\82 (ала Ð¿ÐµÐ»ÐµÐ¼Ð´Ñ\8bме ÐºÐ°Ñ\82егоÑ\80ийÑ\8bÑ\88 Ð¿Ñ\83Ñ\80аÑ\82) Ð»Ó±Ð¼ÐµÑ\80же.
-[[Special:Watchlist|Тыйын эскерымаш лӱмерыш]] пурышо лаштык-влакым '''кӱжгӱн''' палемдыме.",
+'recentchangeslinked-summary' => "ЭÑ\82о Ñ\81пиÑ\81ок Ð½ÐµÐ´Ð°Ð²Ð½Ð¸Ñ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ Ð² Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\85, Ð½Ð° ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ñ\81Ñ\81Ñ\8bлаеÑ\82Ñ\81Ñ\8f Ñ\83казаннаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а (или Ð²Ñ\85одÑ\8fÑ\89иÑ\85 Ð² Ñ\83казаннÑ\83Ñ\8e ÐºÐ°Ñ\82егоÑ\80иÑ\8e).
+Страницы, входящие в [[Special:Watchlist|ваш список наблюдения]] '''выделены'''.",
 'recentchangeslinked-page' => 'Лаштыкын лӱмжӧ:',
 'recentchangeslinked-to' => 'Тиде лаштык дене кылдалтше лаштык-влакыште тӧрлатымашым ончыкташ тидын олмеш',
 
@@ -648,6 +685,8 @@ $messages = array(
 'uploadedimage' => '«[[$1]]» пуртыш',
 'watchthisupload' => 'Тиде файлым эскераш',
 
+'license-header' => 'Лицензирований',
+
 # Special:ListFiles
 'imgfile' => 'файл',
 'listfiles_user' => 'Пайдаланыше',
@@ -655,12 +694,13 @@ $messages = array(
 # File description page
 'file-anchor-link' => 'Файл',
 'filehist' => 'Файлын эртымгорно',
-'filehist-help' => 'Файл ончыч могай ыле манын ончалнет гын, кече/жапым темдал.',
+'filehist-help' => 'Файл ончыч могай ыле - ончалнет гын, кече/жапым темдал.',
 'filehist-deleteone' => 'шӧраш',
+'filehist-revert' => 'пӧртылташ',
 'filehist-current' => 'кызыт',
 'filehist-datetime' => 'Кече/жап',
 'filehist-thumb' => 'Иземдыме сӱрет',
-'filehist-thumbtext' => '$1 тӱрлыклан иземдыме сӱрет',
+'filehist-thumbtext' => '$1лан изирак сӱрет',
 'filehist-user' => 'Пайдаланыше',
 'filehist-dimensions' => 'Кугытшо',
 'filehist-filesize' => 'Файлын кугытшо',
@@ -678,10 +718,10 @@ $messages = array(
 'filedelete-reason-otherlist' => 'Вес амал',
 
 # List redirects
-'listredirects' => 'Вес верек колтымаш-влак лӱмер',
+'listredirects' => 'Вес вере колтымаш-влак',
 
 # Random page
-'randompage' => 'Ð\92Ñ\83Ñ\87Ñ\8bдÑ\8bмо лаштык',
+'randompage' => 'ЧокÑ\8bм лаштык',
 
 # Statistics
 'statistics' => 'Иктешлымаш',
@@ -692,9 +732,9 @@ $messages = array(
 'statistics-header-hooks' => 'Тӱрлӧ коклам иктешлымаш',
 'statistics-articles' => 'Возымо лаштык-влак',
 'statistics-pages' => 'Лаштык-влак',
-'statistics-pages-desc' => 'Чыла лаштык-влак, чӱктен каҥашымаш лаштык-влакым, вес верек колтымо лаштык-влакым и туге молат',
+'statistics-pages-desc' => 'Чыла лаштык-влак (каҥашымаш-влак, вес вере колтымаш-влак да тулеч моло)',
 'statistics-files' => 'Пуртымо файл-влак',
-'statistics-edits' => '{{SITENAME}} шындымеке тӧрлымӧ чот',
+'statistics-edits' => '{{SITENAME}} лаштыкым чылажге мыняр гана тӧрлатыме',
 'statistics-edits-average' => 'Ик лаштыкым покшел тӧрлымӧ чот',
 'statistics-views-total' => 'Чылажге ончымо',
 'statistics-views-peredit' => 'Ик тӧрлатымашлан ончымо',
@@ -703,7 +743,7 @@ $messages = array(
 'statistics-users-active-desc' => 'Пытартыш {{PLURAL:$1|кечыште|$1 кечыште}} иктаж-мом ыштыше пайаланыше-влак',
 'statistics-mostpopular' => 'Эн чӱчкыдын ончымо лаштык-влак',
 
-'brokenredirects' => 'Пудыртымо вес верек колтымаш-влак',
+'brokenredirects' => 'Пудыртымо вес вере колтымаш-влак',
 'brokenredirects-edit' => 'тӧрлаташ',
 'brokenredirects-delete' => 'шӧраш',
 
@@ -715,7 +755,7 @@ $messages = array(
 'nviews' => '$1 {{PLURAL:$1|ончымо|ончымо-влак}}',
 'lonelypages' => 'Тулык лаштык-влак',
 'wantedcategories' => 'Ыштыман категорий-влак',
-'wantedpages' => 'Ыштыман лаштык-влак',
+'wantedpages' => 'Ыштышаш лаштык-влак',
 'wantedfiles' => 'Ыштыман файл-влак',
 'wantedtemplates' => 'Ыштыман ямдылык-влак',
 'prefixindex' => 'Чыла лаштык-влак префикс дене',
@@ -761,7 +801,7 @@ $messages = array(
 'listusers-blocked' => '(йӧн петырыме)',
 
 # Special:ActiveUsers
-'activeusers' => 'Чӱчкыдын пайдаланыше-влак лӱмер',
+'activeusers' => 'Чӱчкыдын пайдаланыше-влак',
 'activeusers-count' => 'Пытартыш $3 {{PLURAL:$3|кечыште|кечылаште}} $1 {{PLURAL:$1|тӧрлатымаш|тӧрлатымаш-влак}}',
 'activeusers-hidebots' => 'Бот-влакым шылташ',
 'activeusers-hidesysops' => 'Сайтвиктарыше-влакым шылташ',
@@ -769,12 +809,13 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(тӱшкаште улшо-влак)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Пайдаланыше дек серыш',
 
 # Watchlist
-'watchlist' => 'Мыйын эскерымаш лӱмер',
-'mywatchlist' => 'Мыйын эскерымаш лӱмер',
+'watchlist' => 'Эскерымаш лӱмер',
+'mywatchlist' => 'Эскерымаш лӱмер',
+'watchlistfor2' => '$1 лан ($2)',
 'addedwatchtext' => "\"[[:\$1]]\" лаштыкым тыйын [[Special:Watchlist|эскерымаш лӱмерыш]] ешарыме.
 Тиде лаштыкын да тудын каҥашымаш лаштыкым умбакысе тӧрлатымашым тиде спискыште ончыктымо лиеш да, сайрак ужаш манын, [[Special:RecentChanges|пытартыш тӧрлатымаш лӱмерыште]] '''кӱжгӧ шрифт''' дене ойырымо.",
 'removedwatchtext' => '«[[:$1]]» лаштыкым [[Special:Watchlist|тыйын эскерыме лӱмер]] гыч кораҥдыме.',
@@ -782,7 +823,7 @@ $messages = array(
 'watchthispage' => 'Тиде лаштыкым эскераш',
 'unwatch' => 'Эскерыман огыл',
 'unwatchthispage' => 'Эскерымым чарнаш',
-'watchlist-details' => 'ТÑ\8bйÑ\8bн Ñ\8dÑ\81кеÑ\80Ñ\8bмаÑ\88 Ð»Ó±Ð¼ÐµÑ\80Ñ\8bÑ\88Ñ\82е $1 {{PLURAL:$1|лаÑ\88Ñ\82Ñ\8bк|лаÑ\88Ñ\82Ñ\8bк-влак}}, ÐºÐ°Ò¥Ð°Ñ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bм Ñ\88оÑ\82лÑ\8bде.',
+'watchlist-details' => 'ЭÑ\81кеÑ\80Ñ\8bмаÑ\88 Ð»Ó±Ð¼ÐµÑ\80Ñ\8bÑ\88Ñ\82еÑ\82 $1 {{PLURAL:$1|лаÑ\88Ñ\82Ñ\8bк|лаÑ\88Ñ\82Ñ\8bк}} (каҥаÑ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влакÑ\8bм Ñ\88оÑ\82лÑ\8bде)',
 'watchlistcontains' => 'Тыйын лӱмерыште $1 {{PLURAL:$1|лаштык|лаштык}}.',
 'wlshowlast' => 'Пытартыш $1 шагат $2 кечылан $3 ончыкташ',
 'watchlist-options' => 'Эскерыме лӱмерын келыштарымаш',
@@ -841,7 +882,7 @@ $messages = array(
 
 # Namespace form on various pages
 'namespace' => 'Лӱм-влакын кумдыкышт:',
-'invert' => 'Ð\9fалемдÑ\8bмаÑ\88Ñ\8bм Ð²Ð°Ñ\88Ñ\82аÑ\80еÑ\88 Ñ\8bÑ\88Ñ\82аÑ\88',
+'invert' => 'инвеÑ\80Ñ\82иÑ\80оваÑ\82Ñ\8c Ð²Ñ\8bделенное',
 'blanknamespace' => '(Тӱҥ)',
 
 # Contributions
@@ -850,26 +891,29 @@ $messages = array(
 'mycontris' => 'Мыйын паша',
 'contribsub2' => '$1 лан ($2)',
 'uctop' => '(пытартыш)',
-'month' => 'Могай тылзе гыч тӱҥалаш? (але ондакрак):',
-'year' => 'Могай ий гыч тӱҥалаш? (але ондакрак):',
+'month' => 'Могай тылзе гыч тӱҥалаш?',
+'year' => 'Могай ий гыч тӱҥалаш?',
 
 'sp-contributions-newbies' => 'У пайдалнышын гына пашам ончыкташ',
-'sp-contributions-blocklog' => 'йӧным вашталтыме журнал',
+'sp-contributions-blocklog' => 'блокирований журнал',
+'sp-contributions-uploads' => 'пуртымаш-влак',
+'sp-contributions-logs' => 'Журнал-влак',
 'sp-contributions-talk' => 'каҥашымаш',
 'sp-contributions-search' => 'Пашам кычалаш',
 'sp-contributions-username' => 'IP-адрес ала пайдаланышын лӱмжӧ:',
-'sp-contributions-submit' => 'Кычал',
+'sp-contributions-toponly' => 'Показывать только правки, являющиеся последними версиями',
+'sp-contributions-submit' => 'Кычалаш',
 
 # What links here
 'whatlinkshere' => 'Тышке кондышо кылвер-влак',
 'whatlinkshere-title' => '"$1" дене лаштык-влак кылым палемдат',
 'whatlinkshere-page' => 'Лаштык:',
 'linkshere' => "'''[[:$1]]''' лаштык дене кылдалтше лаштык-влак:",
-'nolinkshere' => "'''[[:$1]]''' лаштык дене нимогай вес лаштык-влак кылым огыт кучо.",
+'nolinkshere' => "'''[[:$1]]''' лаштык дене тетла нимогай лаштык кылдалтын огыл",
 'nolinkshere-ns' => "Тыгай лӱм-влакын кумдыкышто '''[[:$1]]''' лаштык дене нимогай вес лаштык-влак кылым огыт кучо.",
-'isredirect' => 'вес вереш колтышо лаштык',
+'isredirect' => 'вес вере колтышо лаштык',
 'istemplate' => 'пуртымаш',
-'isimage' => '!!FUZZY!ойыпыш кылвер',
+'isimage' => '!!FUZZY! файллан кылвер',
 'whatlinkshere-prev' => '{{PLURAL:$1|ончычсо|$1 ончычсо}}',
 'whatlinkshere-next' => '{{PLURAL:$1|вес|$1 вес}}',
 'whatlinkshere-links' => '← кылвер-влак',
@@ -885,13 +929,13 @@ $messages = array(
 'ipbreasonotherlist' => 'Вес амал',
 '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',
 'ipbotherreason' => 'Вес/ешартыш амал:',
-'ipblocklist' => 'Ð\9fеÑ\82Ñ\8bÑ\80Ñ\8bме IP Ð°Ð´Ñ\80еÑ\81-влак Ð´Ð° пайдаланыше-влак',
+'ipblocklist' => 'Ð\91локиÑ\80оваÑ\82лÑ\8bме пайдаланыше-влак',
 'ipblocklist-submit' => 'Кычал',
 'blocklink' => 'йӧным петыраш',
 'unblocklink' => 'йӧным почаш',
 'change-blocklink' => 'йӧным вашталташ',
 'contribslink' => 'паша',
-'blocklogpage' => 'Ð\99ӧнÑ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82Ñ\8bме журнал',
+'blocklogpage' => 'Ð\91локиÑ\80ований журнал',
 'blocklogentry' => '[[$1]] лан йӧным петрен $2 $3 мучашлалтеш',
 'unblocklogentry' => '$1лан йӧным почмо',
 'block-log-flags-nocreate' => 'у пайдаланыше-влаклан регистрацийым чактарыме',
@@ -921,8 +965,8 @@ $messages = array(
 'movepagebtn' => 'Лаштыкым кусараш',
 'pagemovedsub' => 'Кусарымаш сайын эртен',
 'movepage-moved' => '\'\'\'"$1" лаштыкым "$2" лаштыкыш кусарыме\'\'\'',
-'movepage-moved-redirect' => 'Вес верек колтымаш ыштыме.',
-'movepage-moved-noredirect' => 'Вес верек колтымаш ыштыме огыл.',
+'movepage-moved-redirect' => 'Вес вере колтымаш ыштыме.',
+'movepage-moved-noredirect' => 'Вес вере колтымаш ыштыме огыл.',
 'articleexists' => 'Тыгай лӱман лаштык уло але тиде лӱмым кучылташ огеш лий. Вес лӱмым ойыро.',
 'talkexists' => "'''Лаштыкым кусарыме гынат, тудын каҥашымаш лаштыкшым тыгай лӱман лаштык улмылан кӧра кусараш огеш лий. Нуным шке кидет дене иктыш ушно.'''",
 'movedto' => 'лаштыкыш кусарыме',
@@ -936,6 +980,7 @@ $messages = array(
 
 # Namespace 8 related
 'allmessagesname' => 'Лӱм',
+'allmessagesdefault' => 'Текст по умолчанию',
 'allmessages-filter-all' => 'Чыла',
 
 # Thumbnails
@@ -944,9 +989,9 @@ $messages = array(
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Тыйын лаштыкет',
 'tooltip-pt-mytalk' => 'Тыйын каҥашымаш лаштыкет',
-'tooltip-pt-preferences' => 'Мыйын келыштарымаш',
+'tooltip-pt-preferences' => 'Мыйын келыштарымашем',
 'tooltip-pt-watchlist' => 'Мыйын эскерыме лаштык-влак лӱмер',
-'tooltip-pt-mycontris' => 'ТÑ\8bйÑ\8bн Ð½Ð°Ð´Ñ\8bÑ\80 Ð»Ó±Ð¼ÐµÑ\80',
+'tooltip-pt-mycontris' => 'ТÑ\8bйÑ\8bн Ð¿Ð°Ñ\88аÑ\82Ñ\8bм Ñ\8dÑ\81кеÑ\80Ñ\8bме Ð»Ð°Ñ\88Ñ\82Ñ\8bк',
 'tooltip-pt-login' => 'Шке денет палымым ыштет гын сайрак лиеш; такшым тидым ыштыдеат кертат.',
 'tooltip-pt-logout' => 'Системе гыч лекташ',
 'tooltip-ca-talk' => 'Лаштыкыште возымым каҥашаш',
@@ -958,27 +1003,27 @@ $messages = array(
 'tooltip-ca-protect' => 'Тиде лаштыкым тӧрлатымаш деч аралаш',
 'tooltip-ca-delete' => 'Тиде лаштыкым шӧраш',
 'tooltip-ca-move' => 'Тиде лаштыкым кусараш',
-'tooltip-ca-watch' => 'Тиде лаштыкым тыйын эскерыме-влак лӱмерыш ешараш',
-'tooltip-ca-unwatch' => 'Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм Ñ\82Ñ\8bйÑ\8bн Ñ\8dÑ\81кеÑ\80Ñ\8bме-влак Ð»Ó±Ð¼ÐµÑ\80 гыч кораҥдаш',
-'tooltip-search' => '{{SITENAME}}ыште кычалаш',
+'tooltip-ca-watch' => 'Тиде лаштыкым тыйын эскерыме лӱмерыш ешараш',
+'tooltip-ca-unwatch' => 'Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм Ñ\82Ñ\8bйÑ\8bн Ñ\8dÑ\81кеÑ\80Ñ\8bмаÑ\88еÑ\82 гыч кораҥдаш',
+'tooltip-search' => '{{SITENAME}} лаштыкыште кычалаш',
 'tooltip-search-go' => 'Тиде лӱман лаштыкыш куснаш, тыгайже уло гын',
-'tooltip-search-fulltext' => 'Тыгай мутан лаштыкым кычалаш',
+'tooltip-search-fulltext' => 'Тыгай мут дене лаштыкым кычалаш',
 'tooltip-p-logo' => 'Тӱҥ лаштык',
 'tooltip-n-mainpage' => 'Тӱҥ лаштыкыш куснаш',
 'tooltip-n-mainpage-description' => 'Тӱҥ лаштыкыш куснаш',
 'tooltip-n-portal' => 'Проект нерген, мом тый ыштен кертат, мо кушто уло',
-'tooltip-n-currentevents' => 'Ð\9aÑ\8bзÑ\8bÑ\82Ñ\81е Ð»Ð¸Ð¹Ð¼Ð°Ñ\88-влак Ð½ÐµÑ\80ген увер',
+'tooltip-n-currentevents' => 'Ð\9cо Ð»Ð¸Ð¹Ð¼Ðµ Ð½ÐµÑ\80ген Ð½ÐµÑ\80ген Ð¿Ñ\8bÑ\82аÑ\80Ñ\82Ñ\8bÑ\88 увер',
 'tooltip-n-recentchanges' => 'Пытартыш вашталтымаш лӱмер',
 'tooltip-n-randompage' => 'Лаштыкым чокым ойыраш',
 'tooltip-n-help' => 'Википедийым кучылтмо да тӧрлатыме шотышто полшык.',
 'tooltip-t-whatlinkshere' => 'Тышке кондышо лаштык-влакын лӱмерышт',
-'tooltip-t-recentchangeslinked' => 'ШÑ\83кеÑ\80Ñ\82Ñ\81е Ð¾Ð³Ñ\8bл Ñ\82Ó§Ñ\80лÑ\8bмӧ Ð»Ð°Ñ\88Ñ\82Ñ\8bк-влак, ÐºÑ\83до Ð´ÐµÐ½Ðµ Ñ\82иде Ð»Ð°Ñ\88Ñ\82Ñ\8bк ÐºÑ\8bлдалÑ\82Ñ\8bн',
+'tooltip-t-recentchangeslinked' => 'Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bк ÐºÑ\8bлдалÑ\82Ñ\88е Ð¿Ñ\8bÑ\82аÑ\80Ñ\82Ñ\8bÑ\88 Ñ\82Ó§Ñ\80лаÑ\82Ñ\8bмаÑ\88-влак',
 'tooltip-feed-rss' => 'Тиде лаштыклан RSS-кыл',
 'tooltip-feed-atom' => 'Тиде лаштыклан Atom-кыл',
-'tooltip-t-contributions' => 'Пайдаланышын паша лӱмерым ончалаш',
+'tooltip-t-contributions' => 'Пайдаланышын ыштыме пашажым ончалаш',
 'tooltip-t-emailuser' => 'Тиде пайдаланышылан электрон серышым возаш',
 'tooltip-t-upload' => 'Файл-влакым пурташ',
-'tooltip-t-specialpages' => 'Лӱмын ыштыме лаштык-влак лӱмер',
+'tooltip-t-specialpages' => 'Лӱмын ыштыме лаштык-влак',
 'tooltip-t-print' => 'Савыкташлан келыштараш',
 'tooltip-t-permalink' => 'Тиде лаштык тӱрлыкыш эре улшо кылвер',
 'tooltip-ca-nstab-main' => 'Лаштыкыште возымым ончыкташ',
@@ -988,8 +1033,8 @@ $messages = array(
 'tooltip-ca-nstab-image' => 'Файлын лаштыкшым ончалаш',
 'tooltip-ca-nstab-template' => 'Ямдылыкым ончыкташ',
 'tooltip-ca-nstab-category' => 'Категорийын лаштыкым ончыкташ',
-'tooltip-minoredit' => 'Тиде тӧрлымым изирак семын палемдаш',
-'tooltip-save' => 'Тыйын тӧрлатымашым аралаш',
+'tooltip-minoredit' => 'Тиде тӧрлатымашым „изи” семын палемдаш',
+'tooltip-save' => 'Тыйын тӧрлатымашетым аралаш',
 'tooltip-preview' => 'Лаштыкым аралыме деч ончыч ончылгоч ончал!',
 'tooltip-diff' => 'Ончыкташ, могай тӧрлатымашым тый ыштенат.',
 'tooltip-compareselectedversions' => 'Кок ойырымо лаштык версийын ойыртемым ончалаш.',
@@ -999,7 +1044,7 @@ $messages = array(
 Тый тӧрлатымаш амалже нерген возымо верыште  возын кертат.',
 
 # Browsing diffs
-'previousdiff' => '← Ондакрак тӧрлатымаш',
+'previousdiff' => '← Ончычсо тӧрлатымаш-влак',
 'nextdiff' => 'Вес тӧрлатымаш →',
 
 # Media information
@@ -1023,11 +1068,11 @@ $messages = array(
 
 # Metadata
 'metadata' => 'Метаданный-влак',
-'metadata-help' => 'Тиде файлыште ешартыш увер уло, кудыжым фотоаппарат але сканер дене ыштыме.
¤Ð°Ð¹Ð»Ñ\8bм Ñ\8bÑ\88Ñ\82Ñ\8bме Ð´ÐµÑ\87 Ð²Ð°Ñ\80а Ñ\82Ó§Ñ\80лÑ\8bмӧ гын, южо данныйже тиде файллан келшыдыме лийын кертеш.',
+'metadata-help' => 'Тиде файлыште фотоаппаратын але сканерын данныже-влак улыт.
«Ñ\88Ñ\82алÑ\82ме Ð´ÐµÑ\87 Ð²Ð°Ñ\80а Ñ\84айлÑ\8bм Ñ\82Ó§Ñ\80лаÑ\82енÑ\8bÑ\82 гын, южо данныйже тиде файллан келшыдыме лийын кертеш.',
 'metadata-expand' => 'Ешартыш рашлык-влакым ончыкташ',
 'metadata-collapse' => 'Ешартыш рашлык-влакым шылташ',
-'metadata-fields' => 'Тиде Ð»Ó±Ð¼ÐµÑ\80 Ð³Ñ\8bÑ\87 EXIF ÐºÑ\83мдÑ\8bкпале Ð°Ð»Ð°Ð½ Ð¾Ð¹Ñ\8bпÑ\8bн Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bÑ\88Ñ\82е Ñ\8dÑ\80е Ð¾Ð½Ñ\87Ñ\8bкÑ\82алÑ\82еÑ\88, Ð¿Ð¾Ñ\81на ÐºÐ°Ð»Ð°Ñ\81Ñ\8bме Ð¾Ð³Ñ\8bл Ð³Ñ\8bн, Ð²ÐµÑ\81 Ð°Ð»Ð°Ð½ Ð¾Ðº Ð¾Ð½Ñ\87Ñ\8bкÑ\82алÑ\82.
+'metadata-fields' => 'Ð\9fолÑ\8f Ð¼ÐµÑ\82аданнÑ\8bÑ\85 Ð¸Ð·Ð¾Ð±Ñ\80ажениÑ\8f, Ð¿ÐµÑ\80еÑ\87иÑ\81леннÑ\8bе Ð² Ñ\8dÑ\82ом Ñ\81пиÑ\81ке, Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ\8b Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¸Ð·Ð¾Ð±Ñ\80ажениÑ\8f Ð¿Ñ\80и Ñ\81вÑ\91Ñ\80нÑ\83Ñ\82ой Ñ\82аблиÑ\86е Ð¼ÐµÑ\82аданнÑ\8bÑ\85. Ð\9eÑ\81Ñ\82алÑ\8cнÑ\8bе Ð¿Ð¾Ð»Ñ\8f Ð±Ñ\83дÑ\83Ñ\82 Ð¿Ð¾ Ñ\83молÑ\87аниÑ\8e Ñ\81кÑ\80Ñ\8bÑ\82Ñ\8b.
 * make
 * model
 * datetimeoriginal
@@ -1072,23 +1117,33 @@ $messages = array(
 'watchlisttools-edit' => 'Эскерыме лӱмерым ончалаш да тӧрлаташ',
 'watchlisttools-raw' => 'Эскерыме лӱмерым текст семын тӧрлаш',
 
+# Core parser functions
+'duplicate-defaultsort' => 'Внимание. Ключ сортировки по умолчанию «$2» переопределяет прежний ключ сортировки по умолчанию «$1».',
+
 # Special:Version
 'version-specialpages' => 'Лӱмын ыштыме лаштык-влак',
 
-# Special:FilePath
-'filepath-page' => 'Файл:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Кычалаш',
 
 # Special:SpecialPages
 'specialpages' => 'Лӱмын ыштыме лаштык-влак',
-'specialpages-group-other' => 'Ð\92еÑ\81е лӱмын ыштыме лаштык-влак',
+'specialpages-group-other' => 'Ð\9cоло лӱмын ыштыме лаштык-влак',
 'specialpages-group-login' => 'Пурымаш / регистрацийым эрташ',
 'specialpages-group-users' => 'Пайдаланыше-влак да нунын йӧн-влак',
-'specialpages-group-highuse' => 'ЧӱÑ\87кÑ\8bдÑ\8bн Ð¿Ð°Ð¹Ð´Ð°Ð»Ñ\8bн ÐºÑ\83Ñ\87Ñ\8bлÑ\82Ñ\8bÑ\88о лаштык-влак',
+'specialpages-group-highuse' => 'ЧӱÑ\87кÑ\8bдÑ\8bн ÐºÑ\83Ñ\87Ñ\8bлÑ\82мо лаштык-влак',
 'specialpages-group-pages' => 'Лаштык лӱмер-влак',
 'specialpages-group-pagetools' => 'Лаштык ӱзгар-влак',
-'specialpages-group-redirects' => 'Вес верек колтышо лӱмын ыштыме лаштык-влак',
+'specialpages-group-redirects' => 'Вес вере колтышо спецлаштык-влак',
+
+# External image whitelist
+'external_image_whitelist' => ' #Оставьте эту строчку такой, как она есть<pre>
+#Разместите здесь фрагменты регулярных выражений (ту часть, что находится между //)
+#они будут соотнесены с URL внешних изображений.
+#Подходящие будут показаны как изображения, остальные будут показаны как ссылки на изображения.
+#Строки, начинающиеся с # считаются комментариями.
+#Строки не чувствительны к регистру
+
+#Размещайте фрагменты регулярных выражений над этой строчкой. Оставьте эту строчку такой, как она есть.</pre>',
 
 );
index ed3d6f4..a7f4f40 100644 (file)
@@ -23,60 +23,115 @@ $namespaceNames = array(
        NS_TEMPLATE         => 'Templat',
 );
 
+$specialPageAliases = array(
+       'Activeusers'               => array( 'PanggunoAktip', 'Pangguno_aktip' ),
+       'Allmessages'               => array( 'PasanSistim', 'Pasan_sistem' ),
+       'Allpages'                  => array( 'DaptaLaman', 'Dapta_laman' ),
+       'Ancientpages'              => array( 'LamanLamo', 'Laman_lamo' ),
+       'Badtitle'                  => array( 'JudulBuruak', 'Judul_indak_rancak' ),
+       'Blankpage'                 => array( 'LamanKosong', 'Laman_kosong' ),
+       'Block'                     => array( 'Blokir', 'IPkanaiBlok', 'PanggunoTablokir' ),
+       'Blockme'                   => array( 'BlokDen', 'BlokirAmbo' ),
+       'Booksources'               => array( 'SumberBuku', 'Sumber_buku' ),
+       'BrokenRedirects'           => array( 'PangaliahanRusak', 'Pangaliahan_rusak' ),
+       'Categories'                => array( 'Kategori' ),
+       'ChangeEmail'               => array( 'GantiSurel', 'Ganti_surel' ),
+       'ChangePassword'            => array( 'GantiSandi', 'TukaSandi', 'TukaKatoSandi' ),
+       'ComparePages'              => array( 'BandiangkanLaman', 'Bandiangkan_laman' ),
+       'Confirmemail'              => array( 'PastikanSurel', 'Pastikan_surel' ),
+       'Contributions'             => array( 'SuntiangPangguno', 'Suntiangan_pangguno' ),
+       'CreateAccount'             => array( 'BuekAkun', 'Buek_akun' ),
+       'Deadendpages'              => array( 'LamanBuntu', 'Laman_buntu' ),
+       'DeletedContributions'      => array( 'SuntiangDihapuih', 'Suntiangan_kanai_hapuih' ),
+       'Disambiguations'           => array( 'SamoArti', 'Samo_arti' ),
+       'EditWatchlist'             => array( 'SuntiangDaptaPantau', 'Suntiang_dapta_pantau' ),
+       'Emailuser'                 => array( 'SurelPangguno', 'Surel_pangguno' ),
+       'Export'                    => array( 'Ekspor' ),
+       'Fewestrevisions'           => array( 'ParubahanTasaketek', 'Parubahan_tasaketek' ),
+       'FileDuplicateSearch'       => array( 'CariBerkasDuplikat', 'Cari_berkas_duplikat' ),
+       'Filepath'                  => array( 'LokasiBerkas', 'Lokasi_berkas' ),
+       'Import'                    => array( 'Impor' ),
+       'Invalidateemail'           => array( 'BatalSurel', 'Batalkan_surel' ),
+       'JavaScriptTest'            => array( 'TesSkripJava', 'Tes_skrip_Java' ),
+       'BlockList'                 => array( 'DaptaBlokir', 'Dapta_pemblokiran', 'Dapta_IP_diblok' ),
+       'LinkSearch'                => array( 'CariTautan', 'Cari_tautan' ),
+       'Listadmins'                => array( 'DaptaPanguruih' ),
+       'Listfiles'                 => array( 'DaptaBerkas', 'DaptaGamba' ),
+       'Listgrouprights'           => array( 'DaptaHakKalompok', 'HakKalompokPangguno' ),
+       'Listredirects'             => array( 'DaptaPangaliahan', 'Dapta_pangaliahan' ),
+       'Listusers'                 => array( 'DaptaPangguno', 'Dapta_pangguno' ),
+       'Lockdb'                    => array( 'KunciBD', 'Kunci_basisdata' ),
+       'Log'                       => array( 'Catatan' ),
+       'Lonelypages'               => array( 'LamanYatim', 'Laman_indak_batuan' ),
+       'Longpages'                 => array( 'LamanPanjang', 'Laman_panjang' ),
+       'MergeHistory'              => array( 'SajarahPanggabuangan', 'Sajarah_panggabuangan' ),
+       'MIMEsearch'                => array( 'CariMIME', 'PancarianMIME' ),
+       'Mostcategories'            => array( 'KategoriTabanyak', 'Kategori_tabanyak' ),
+       'Mostimages'                => array( 'BerkasAcokDipakai', 'BerkasTabanyak', 'GambaTabanyak' ),
+       'Mostinterwikis'            => array( 'InterwikiAcokDipakai' ),
+       'Mostlinked'                => array( 'LamanTautanTabanyak', 'TautanTabanyak' ),
+       'Mostlinkedcategories'      => array( 'KategoriBatauikTabanyak', 'KategoriAcokTapakai' ),
+       'Mostlinkedtemplates'       => array( 'TemplatTautanTabanyak', 'TemplatAcokDipakai' ),
+       'Mostrevisions'             => array( 'ParubahanTabanyak' ),
+       'Movepage'                  => array( 'PindahLaman', 'Pindahkan_laman' ),
+       'Mycontributions'           => array( 'SuntianganAmbo', 'Suntiangan_ambo' ),
+       'Mypage'                    => array( 'LamanDenai', 'Laman_denai' ),
+       'Mytalk'                    => array( 'DiskusiAmbo' ),
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garih bawahi tautan:',
 'tog-justify' => 'Ratokan paragraf',
-'tog-hideminor' => 'Suruakan suntiangan ketek di parubahan tabaru',
+'tog-hideminor' => 'Suruakan suntiangan ketek di parubahan baru',
 'tog-hidepatrolled' => 'Suruakan suntiangan nan lah dipatroli di parubahan tabaru',
-'tog-newpageshidepatrolled' => 'Suruakkan laman nan lah dipatroli dari dafta laman baru',
-'tog-extendwatchlist' => 'Kambangkan dafta pantau untuak malihek sado parubahan, indak nan baru se',
-'tog-usenewrc' => 'Gunokan tampilan parubahan tingkek lanjuik (paralu JavaScript)',
-'tog-numberheadings' => 'Agiah nomor judua sacaro otomatis',
-'tog-showtoolbar' => 'Tampilkan bilah suntiang (paralu JavaScript)',
+'tog-newpageshidepatrolled' => 'Suruakan laman nan lah dipatroli dari daftar laman baru',
+'tog-extendwatchlist' => 'Kambangan daftar pantau untuak mancaliak kasado parubahan, indak nan baru se',
+'tog-usenewrc' => 'Gunoan tampilan parubahan tingkek lanjuik (paralu JavaScript)',
+'tog-numberheadings' => 'Agiah nomor judul sacaro otomatis',
+'tog-showtoolbar' => 'Tunjuakan bilah panyuntiangan (paralu JavaScript)',
 'tog-editondblclick' => 'Suntiang laman jo klik duo kali (paralu JavaScript)',
-'tog-editsection' => 'Fungsikan penyuntiangan subbagian malalui [sunting] tautan',
-'tog-editsectiononrightclick' => 'Hiduikkan bagian panyuntiangan jo mangklik kanan pado judul bagian (paralu JavaScript)',
-'tog-showtoc' => 'Tunjuakkan dafta isi (untuak laman nan labiah dari 3 subbagian)',
+'tog-editsection' => 'Aktipan panyuntiangan subbagian malalui pautan [suntiang]',
+'tog-editsectiononrightclick' => 'Aktipan bagian panyuntiangan jo mangklik kanan pado judul bagian (paralu JavaScript)',
+'tog-showtoc' => 'Tunjuakan daftar isi (untuak laman nan labiah dari 3 subbagian)',
 'tog-rememberpassword' => 'Ingek log masuak denai di paramban ko (salamo $1 {{PLURAL:$1|hari}})',
-'tog-watchcreations' => 'Tambahkan laman nan den buek jo gambar nan den unggah ka dafta pantau',
-'tog-watchdefault' => 'Tambahkan laman jo gamba nan den suntiang ka dafta pantau',
-'tog-watchmoves' => 'Tambahkan laman jo gamba nan den pindah ka dafta pantau',
-'tog-watchdeletion' => 'Tambahkan laman jo gamba nan den hapuih ka dafta pantau',
-'tog-minordefault' => 'Tandoi sadoalah suntiangan sabagai suntiangan ketek sacaro baku',
-'tog-previewontop' => 'Tampilkan pratonton sabalun kotak suntiang',
-'tog-previewonfirst' => 'Tunjuakkan pratonton pado suntiangan patamo',
+'tog-watchcreations' => 'Tambahan laman nan den buek jo gambar nan den unggah ka daftar pantau',
+'tog-watchdefault' => 'Tambahan laman jo gambar nan den suntiang ka daftar pantau',
+'tog-watchmoves' => 'Tambahan laman jo gambar nan den pindah ka daftar pantau',
+'tog-watchdeletion' => 'Tambahan laman jo gambar nan den hapuih ka daftar pantau',
+'tog-minordefault' => 'Tandoi kasado suntiangan sabagai suntiangan ketek sacaro baku',
+'tog-previewontop' => 'Tunjuakan pratonton sabalun kotak suntiang',
+'tog-previewonfirst' => 'Tunjuakan pratonton pado suntiangan patamo',
 'tog-nocache' => 'Matikan panyinggahan laman paramban',
-'tog-enotifwatchlistpages' => 'Kirimkan surel, kok laman atau gambar pado dafta pantau Ambo lah barubah',
-'tog-enotifusertalkpages' => 'Kirimkan surel, koq laman diskusi Ambo lah barubah',
+'tog-enotifwatchlistpages' => 'Kiriman surel, kok laman atau gambar pado daftar pantau Ambo barubah',
+'tog-enotifusertalkpages' => 'Kiriman surel, koq laman maota Ambo barubah',
 'tog-enotifminoredits' => 'Kirimkan surel juo untuk saketek suntingan pado laman jo gambar',
-'tog-enotifrevealaddr' => 'Tunjuakkan alamaik surel ambo pado pambaritauan surel',
-'tog-shownumberswatching' => 'Tunjuakkan jumlah pamantau',
+'tog-enotifrevealaddr' => 'Tunjuakan alamaik surel ambo pado pambaritauan surel',
+'tog-shownumberswatching' => 'Tunjuakan jumlah pamantau',
 'tog-oldsig' => 'Tando tangan kini:',
 'tog-fancysig' => 'Jadikan tando tangan manjadi teks wiki (indak jo tautan otomatis)',
-'tog-externaleditor' => 'Gunokan editor dari lua sacaro bawaan (untuak nan ahli sajo, butuah pangaturan khusus di komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.])',
-'tog-externaldiff' => 'Gunokan diff eksternal sacaro bawaan (untuak nan ahli sajo, kabutuahan pangaturan khusus pado komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.].)',
 'tog-showjumplinks' => 'Aktifkan pautan bantuan "langsuang ka"',
-'tog-uselivepreview' => 'Gunoan pratonton langsuang (JavaScript) (eksperimental)',
+'tog-uselivepreview' => 'Gunoan pratonton langsuang (paralu JavaScript) (uji-cubo)',
 'tog-forceeditsummary' => 'Ingekan ambo bilo kotak ikhtisar suntiangan kosong',
-'tog-watchlisthideown' => 'Suruakan suntiangan surang di dafta pantau',
-'tog-watchlisthidebots' => 'Suruakan suntiangan bot di dafta pantau',
-'tog-watchlisthideminor' => 'Suruakan suntiangan ketek di dafta pantau',
-'tog-watchlisthideliu' => 'Suruakan suntiangan pangguno masuak log di dafta pantau',
-'tog-watchlisthideanons' => 'Suruakan suntiangan pangguno indak di kana di dafta pantau',
-'tog-watchlisthidepatrolled' => 'Suruakan suntiangan tapatroli di dafta pantau',
+'tog-watchlisthideown' => 'Suruakan suntiangan surang pado daftar pantau',
+'tog-watchlisthidebots' => 'Suruakan suntiangan bot pado daftar pantau',
+'tog-watchlisthideminor' => 'Suruakan suntiangan ketek pado daftar pantau',
+'tog-watchlisthideliu' => 'Suruakan suntiangan pangguno masuak log pado daftar pantau',
+'tog-watchlisthideanons' => 'Suruakan suntiangan pangguno anonim pado daftar pantau',
+'tog-watchlisthidepatrolled' => 'Suruakan suntiangan tapatroli pado daftar pantau',
 'tog-ccmeonemails' => 'Kiriman Ambo salinan surel nan dikiriman ka urang lain',
 'tog-diffonly' => 'Jan tampilan isi laman di bawah pabedoan suntiangan',
-'tog-showhiddencats' => 'Tampilan kategori tasambunyi',
+'tog-showhiddencats' => 'Tunjuakan kategori tasuruak',
 'tog-norollbackdiff' => 'Jan tampilan pabedoan sasudah malakukan pangambalian',
+'tog-useeditwarning' => 'Ingekan denai kok denai maninggakan laman suntiang sabalun manyimpan parubahan',
 
 'underline-always' => 'Taruih',
 'underline-never' => 'Indak pernah',
-'underline-default' => 'Kulik atau panjalajah web bawaan',
+'underline-default' => 'Kulik atau pangaturan paramban web',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Gaya tulisan komputer pado kotak panyuntiangan:',
-'editfont-default' => 'Bawaan panjalajah web',
+'editfont-default' => 'Pangaturan paramban web',
 'editfont-monospace' => 'Tulisan Monospace',
 'editfont-sansserif' => 'Tulisan Sans-serif',
 'editfont-serif' => 'Tulisan Serif',
@@ -132,6 +187,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nop',
 'dec' => 'Des',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Pebruari',
+'march-date' => '$1 Maret',
+'april-date' => '$1 April',
+'may-date' => '$1 Mai',
+'june-date' => '$1 Juni',
+'july-date' => '$1 Juli',
+'august-date' => '$1 Agustus',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 Nopember',
+'december-date' => '$1 Desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori}}',
@@ -139,14 +206,14 @@ $messages = array(
 'subcategories' => 'Subkategori',
 'category-media-header' => 'Laman/Media dalam kategori "$1"',
 'category-empty' => "''Kini ko, indak ado laman ataupun media dalam kategori ko.''",
-'hidden-categories' => '{{PLURAL:$1|Kategori tapandam}}',
-'hidden-category-category' => 'Kategori tasambunyi',
+'hidden-categories' => '{{PLURAL:$1|Kategori tasuruak}}',
+'hidden-category-category' => 'Kategori tasuruak',
 'category-subcat-count' => '{{PLURAL:$2|Kategori ko punyo {{PLURAL:$1|$1 subkategori}}, dari total $2.}}',
-'category-subcat-count-limited' => 'Kategori iko mamiliki {{PLURAL:$1|$1 subkategori}} barikuik.',
+'category-subcat-count-limited' => 'Kategori ko punyo {{PLURAL:$1|$1 subkategori}} barikuik.',
 'category-article-count' => '{{PLURAL:$2|Kategori ko punyo {{PLURAL:$1|$1 laman}}, dari total $2.}}',
-'category-article-count-limited' => 'Kategori iko mamiliki {{PLURAL:$1|$1 laman}} barikuik.',
-'category-file-count' => '{{PLURAL:$2|Kategori ko ado {{PLURAL:$1|$1 laman}}, dari $2 laman.}}',
-'category-file-count-limited' => 'Kategori iko mamiliki {{PLURAL:$1|$1 laman}} barikuik.',
+'category-article-count-limited' => 'Kategori ko punyo {{PLURAL:$1|$1 laman}} barikuik.',
+'category-file-count' => '{{PLURAL:$2|Kategori ko ado {{PLURAL:$1|$1 berkas}}, dari total $2 berkas.}}',
+'category-file-count-limited' => 'Kategori ko ado {{PLURAL:$1|$1 berkas}} barikuik.',
 'listingcontinuesabbrev' => 'samb.',
 'index-category' => 'Laman nan diindeks',
 'noindex-category' => 'Laman nan indak diindeks',
@@ -154,18 +221,18 @@ $messages = array(
 
 'about' => 'Perihal',
 'article' => 'Artikel',
-'newwindow' => '(bukak di jandela baru)',
+'newwindow' => '(bukak di jendela baru)',
 'cancel' => 'Batalkan',
 'moredotdotdot' => 'Lainnyo...',
 'morenotlisted' => 'Salabiahnyo...',
 'mypage' => 'Laman',
 'mytalk' => 'Maota',
 'anontalk' => 'Diskusi IP ko',
-'navigation' => 'Pinteh',
+'navigation' => 'Navigasi',
 'and' => '&#32;jo',
 
 # Cologne Blue skin
-'qbfind' => 'Pancarian',
+'qbfind' => 'Cari',
 'qbbrowse' => 'Jalajah',
 'qbedit' => 'Suntiang',
 'qbpageoptions' => 'Laman ko',
@@ -179,9 +246,9 @@ $messages = array(
 'vector-action-delete' => 'Hapuih',
 'vector-action-move' => 'Pindahkan',
 'vector-action-protect' => 'Linduangkan',
-'vector-action-undelete' => 'Pambatalan panghapuihan',
+'vector-action-undelete' => 'Pambatalan pangapuihan',
 'vector-action-unprotect' => 'Tuka palinduangan',
-'vector-simplesearch-preference' => 'Aktifkan kotak pancarian sadarano (hanyo kulik Vector)',
+'vector-simplesearch-preference' => 'Aktipan kotak pancarian sadarano (hanyo kulik Vector)',
 'vector-view-create' => 'Buek',
 'vector-view-edit' => 'Suntiang',
 'vector-view-history' => 'Riwayaik',
@@ -189,7 +256,7 @@ $messages = array(
 'vector-view-viewsource' => 'Caliak sumber',
 'actions' => 'Tindakan',
 'namespaces' => 'Ruang namo',
-'variants' => 'Varian:',
+'variants' => 'Variasi',
 
 'navigation-heading' => 'Menu navigasi',
 'errorpagetitle' => 'Kasalahan',
@@ -210,7 +277,7 @@ $messages = array(
 'edit' => 'Suntiang',
 'create' => 'Buek',
 'editthispage' => 'Suntiang laman ko',
-'create-this-page' => 'Buek laman iko',
+'create-this-page' => 'Buek laman ko',
 'delete' => 'Hapuih',
 'deletethispage' => 'Hapuih laman ko',
 'undelete_short' => 'Batal hapuih $1 {{PLURAL:$1|suntiangan}}',
@@ -226,11 +293,11 @@ $messages = array(
 'specialpage' => 'Laman istimewa',
 'personaltools' => 'Pakakeh pribadi',
 'postcomment' => 'Bagian baru',
-'articlepage' => 'Liek isi laman',
+'articlepage' => 'Lihek isi laman',
 'talk' => 'Rundiang',
 'views' => 'Caliak',
 'toolbox' => 'Kotak pakakeh',
-'userpage' => 'Liek laman pangguno',
+'userpage' => 'Lihek laman pangguno',
 'projectpage' => 'Caliak laman proyek',
 'imagepage' => 'Caliak laman berkas',
 'mediawikipage' => 'Caliak laman pasan',
@@ -241,11 +308,11 @@ $messages = array(
 'otherlanguages' => 'Dalam bahaso lain',
 'redirectedfrom' => '(Dialiahkan dari $1)',
 'redirectpagesub' => 'Laman pangaliahan',
-'lastmodifiedat' => 'Laman ko taakia diubah pado $2, $1.',
+'lastmodifiedat' => 'Laman ko tarakhia diubah pado pukua $2, tanggal $1.',
 'viewcount' => 'Laman ko lah dicaliak {{PLURAL:$1|$1 kali}}.',
 'protectedpage' => 'Laman nan dilinduangi',
 'jumpto' => 'Lompek ka:',
-'jumptonavigation' => 'pinteh',
+'jumptonavigation' => 'navigasi',
 'jumptosearch' => 'cari',
 'view-pool-error' => 'Maaf, server sadang kalabiahan baban.
 Banyak bana nan barusaho mancaliak laman ko.
@@ -254,41 +321,41 @@ Tunggu santa koq nio mancubo baliak ka laman ko.
 $1',
 'pool-timeout' => 'Abih wakatu',
 'pool-queuefull' => 'Antrian panuah',
-'pool-errorunknown' => 'Kasalahan nan indak dikatahui',
+'pool-errorunknown' => 'Kasalahan indak jaleh',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Tantang {{SITENAME}}',
-'aboutpage' => 'Project:Tantang',
-'copyright' => 'Kandungan tasadio dalam $1',
+'aboutpage' => 'Project:Tantang_{{SITENAME}}',
+'copyright' => 'Isi tasadio dalam $1',
 'copyrightpage' => '{{ns:project}}:Hak cipta',
 'currentevents' => 'Kajadian kini ko',
 'currentevents-url' => 'Project:Kajadian kini ko',
-'disclaimers' => 'Sanggah',
+'disclaimers' => 'Sanggahan umum',
 'disclaimerpage' => 'Project:Sanggahan umum',
 'edithelp' => 'Bantuan suntiangan',
 'edithelppage' => 'Help:Panyuntiangan',
 'helppage' => 'Help:Isi',
 'mainpage' => 'Palanta',
 'mainpage-description' => 'Palanta',
-'policy-url' => 'Project:Kabijakan',
+'policy-url' => 'Project:Kabijakan jo padoman',
 'portal' => 'Portal komunitas',
-'portal-url' => 'Portal:Komunitas',
-'privacy' => 'Kecipehan privasi',
-'privacypage' => 'Project:Kecipehan privasi',
+'portal-url' => 'Project:Portal komunitas',
+'privacy' => 'Kabijakan privasi',
+'privacypage' => 'Project:Kabijakan privasi',
 
 'badaccess' => 'Kasalahan hak akses',
-'badaccess-group0' => 'Sanak indak diizinkan untuak malakukan tindakan nan Sanak nio.',
-'badaccess-groups' => 'Tindakan nan Sanak nio dibatasi untuak pangguno dalam {{PLURAL:$2|kalompok}}: $1.',
+'badaccess-group0' => 'Sanak indak diizinkan untuak malakuan tindakan ko.',
+'badaccess-groups' => 'Tindakan nan Sanak nio babateh untuak pangguno dalam {{PLURAL:$2|kalompok}}: $1.',
 
-'versionrequired' => 'Dibutuahkan MediaWiki versi $1',
-'versionrequiredtext' => 'MediaWiki versi $1 dibutuahkan untuak manggunokan laman ko. Caliak [[Special:Version|versi laman]]',
+'versionrequired' => 'Dibutuahan MediaWiki versi $1',
+'versionrequiredtext' => 'MediaWiki versi $1 dibutuahan untuak manggunoan laman ko. Caliak [[Special:Version|versi laman]]',
 
 'ok' => 'OK',
 'pagetitle' => '$1 - {{SITENAME}} bahaso Minang',
 'pagetitle-view-mainpage' => '{{SITENAME}} bahaso Minang',
 'backlinksubtitle' => '← $1',
 'retrievedfrom' => 'Didapek dari "$1"',
-'youhavenewmessages' => 'Awak punyo $1 ($2).',
+'youhavenewmessages' => 'Sanak punyo $1 ($2).',
 'newmessageslink' => 'pasan baru',
 'newmessagesdifflink' => 'parubahan tarakhia',
 'youhavenewmessagesfromusers' => 'Sanak mandapek $1 dari {{PLURAL:$3|$3 pangguno}} ($2)',
@@ -302,9 +369,9 @@ $1',
 'editlink' => 'suntiang',
 'viewsourcelink' => 'caliak sumber',
 'editsectionhint' => 'Suntiang bagian: $1',
-'toc' => 'Dafta isi',
-'showtoc' => 'tampilkan',
-'hidetoc' => 'suruakkan',
+'toc' => 'Daftar isi',
+'showtoc' => 'tampakan',
+'hidetoc' => 'suruakan',
 'collapsible-collapse' => 'Ketekan',
 'collapsible-expand' => 'Kambangan',
 'thisisdeleted' => 'Caliak atau kambalian $1?',
@@ -313,18 +380,18 @@ $1',
 'feedlinks' => 'Umpan:',
 'feed-invalid' => 'Tipe pamintaan umpan indak tapek.',
 'feed-unavailable' => 'Sindikasi umpan indak tasadio',
-'site-rss-feed' => '$1 Umpan RSS',
-'site-atom-feed' => 'Umpan Atom $1',
-'page-rss-feed' => 'Umpan RSS "$1"',
+'site-rss-feed' => '$1 umpan RSS',
+'site-atom-feed' => '$1 umpan Atom',
+'page-rss-feed' => '"$1" umpan RSS',
 'page-atom-feed' => '"$1" umpan Atom',
 'red-link-title' => '$1 (laman indak ado)',
-'sort-descending' => 'Urutkan manurun',
-'sort-ascending' => 'Urutkan manaik',
+'sort-descending' => 'Uruikan manurun',
+'sort-ascending' => 'Uruikan manaik',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Laman',
 'nstab-user' => 'Laman pangguno',
-'nstab-media' => 'Laman Media',
+'nstab-media' => 'Laman media',
 'nstab-special' => 'Laman istimewa',
 'nstab-project' => 'Laman proyek',
 'nstab-image' => 'Berkas',
@@ -335,11 +402,11 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'Indak ado tindakan tasabuik',
-'nosuchactiontext' => 'Tindakan nan diminta dek URL tasabuik indak valid. Sanak mungkin salah mangetikkan URL, atau mangikuiki suatu pautan nan indak batua. Hal iko mungkin juo manunjuakan adonyo suatu bug pado parangkaik lunak nan dipagunoan dek {{SITENAME}}.',
-'nosuchspecialpage' => 'Indak ado laman istimewa tarsabuik',
-'nospecialpagetext' => '<strong>Sanak maminta laman istimewa nan indak sah.</strong>
+'nosuchactiontext' => 'Tindakan nan diminta dek URL tasabuik indak valid. Sanak mungkin salah mangetikkan URL, atau mangikuik pautan nan salah. Iko mungkin manunjuakan adonyo suatu bug pado parangkaik lunak nan dipagunoan dek {{SITENAME}}.',
+'nosuchspecialpage' => 'Indak ado laman istimewa tasabuik',
+'nospecialpagetext' => '<strong>Sanak mamintak laman istimewa nan indak sah.</strong>
 
-Dafta laman istimewa nan sah dapek dicaliak di [[Special:SpecialPages|{{int:specialpages}}]].',
+Daftar laman istimewa nan sah dapek dicaliak di [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Kasalahan',
@@ -377,7 +444,7 @@ Silakan laporkan hal iko ka [[Special:ListUsers/sysop|pangurus]], sarato manyabu
 'filedeleteerror' => 'Indak dapek mahapuih berkas "$1".',
 'directorycreateerror' => 'Indak dapek mambuek direktori "$1".',
 'filenotfound' => 'Indak dapek manamukan berkas "$1".',
-'fileexistserror' => 'Indak dapek manuliah berkas "$1": berkas sudah ado',
+'fileexistserror' => 'Indak dapek manulih berkas "$1": berkas lah ado.',
 'unexpected' => 'Nilai di lua jangkauan: "$1"="$2".',
 'formerror' => 'Kasalahan: Indak dapek mangiriman formulir',
 'badarticleerror' => 'Tindakan iko indak dapek dilaksanakan di laman iko.',
@@ -388,37 +455,37 @@ Mungkin alah dihapuih jo urang lain.',
 Indak ado keterangan.',
 'badtitle' => 'Judul indak sah',
 'badtitletext' => 'Pamintaan judul laman indak sah, kosong, atau antarbaso atau antarwiki nan salah sambuang. Mungkin juo ado kandungan karakter nan indak buliah digunoan untuak judul.',
-'perfcached' => 'Data barikuik ko diambiak dari singgahan dan mungkin indak data nan baru. Nan tabanyak dari {{PLURAL:$1|suatu hasil dari|$1 hasilnyo}} ado di singgahan.',
-'perfcachedts' => 'Data barikuik ko singgahan, dan tarakhir diperbarui $1. Nan tabanyak dari {{PLURAL:$1|suatu hasil dari|$1 hasilnyo}} ado di singgahan.',
-'querypage-no-updates' => 'Pamutakhiran dari laman iko sadang dimatian. Data nan ado di siko saat iko indak akan dimuaik ulang.',
+'perfcached' => 'Data barikuik ko diambiak dari singgahan dan mungkin indak data nan baru. Nan tabanyak dari {{PLURAL:$1|$1 hasilnyo}} ado di singgahan.',
+'perfcachedts' => 'Data barikuik ko singgahan, dan tarakhia dipabarui tanggal $1. Nan tabanyak dari tanggal {{PLURAL:$1|$1}}, hasilnyo ado di singgahan.',
+'querypage-no-updates' => 'Pamutakhiran dari laman ko sadang dimatian. Data nan ado di siko kini ko indak akan dimuaik ulang.',
 'wrong_wfQuery_params' => 'Parameter salah ka wfQuery()<br />Fungsi: $1<br />Pamintaan: $2',
 'viewsource' => 'Caliak sumber',
 'viewsource-title' => 'Caliak sumber untuak $1',
-'actionthrottled' => 'Tindakan dibatasi',
-'actionthrottledtext' => 'Anda dibatasi untuak malakuan tindakan iko talalu banyak dalam waktu singkek. Sila mancubo laik satalah bara menit.',
+'actionthrottled' => 'Tindakan tabateh',
+'actionthrottledtext' => 'Sanak tabateh untuak malakuan tindakan ko banyak-banyak dalam wakatu singkek. Cubo lah laik satalah bara minit.',
 'protectedpagetext' => 'Laman ko alah dikunci untuak manghindari panyuntiangan.',
 'viewsourcetext' => 'Sanak dapek malihek atau manyalin sumber laman iko:',
 'viewyourtext' => 'Sanak dapek mancaliak jo mangkopi sumber untuak "suntiangan sanak" ka laman ko',
-'protectedinterface' => 'Laman iko baisi teks antarmuko untuak digunoan dek parangkaik lunak di wiki iko sajo, dan alah dikunci untuak maindaan kasalahan. 
-Untuak manambah atau maubah tajamahan di sadonyo wiki, harap gunoan [//translatewiki.net/ translatewiki.net], yaitu proyek palokalan MediaWiki.',
+'protectedinterface' => 'Laman ko baisi teks antarmuko untuak digunoan dek parangkaik lunak di wiki ko sajo, dan alah dikunci untuak maindaan kasalahan. 
+Untuak manambah atau maubah tajamahan di kasado wiki, harap gunoan [//translatewiki.net/ translatewiki.net], yaitu proyek palokalan MediaWiki.',
 'editinginterface' => "'''Paringatan:''' Sanak manyuntiang laman nan digunoan untuak manyadiokan teks antarmuko untuak parangkaik lunak.
 Parubahan teks ko akan mampangaruhi tampilan pado antarmuko pangguno untuak pangguno lain.
-Untuak tarjamahan, harap gunokan [//translatewiki.net/wiki/Main_Page?setlang=id translatewiki.net], proyek palokalan MediaWiki.",
-'sqlhidden' => '(Pamintaan SQL disuruakkan)',
-'cascadeprotected' => 'Laman iko alah dilindungi dari panyuntiangan karano disartokan di {{PLURAL:$1|laman|laman-laman}} barikuik nan alah dilindungi jo opsi "runtun":
+Untuak tajamahan, harap gunoan [//translatewiki.net/wiki/Main_Page?setlang=min translatewiki.net], proyek palokalan MediaWiki.",
+'sqlhidden' => '(Pamintaan SQL disuruakan)',
+'cascadeprotected' => 'Laman iko alah dilindungi dari panyuntiangan karano disartokan di {{PLURAL:$1|laman}} barikuik nan alah dilindungi jo opsi "runtun":
 $2',
-'namespaceprotected' => "Sanak ndak mampunyoi hak akses untuak manyuntiang laman di ruang namo '''$1'''.",
+'namespaceprotected' => "Sanak indak mampunyoi hak akses untuak manyuntiang laman di ruang namo '''$1'''.",
 'customcssprotected' => 'Sanak indak mampunyoi izin untuak maubah laman CSS iko, karano manganduang pangaturan pribadi pangguno lain.',
 'customjsprotected' => 'Sanak ndak mampunyo izin untuak maubah laman JavaScript iko, karano manganduang pangaturan pribadi pangguno lain.',
 'ns-specialprotected' => 'Laman istimewa indak dapek disuntiang.',
-'titleprotected' => "Judul iko alah dilindungi dari pambantuakan oleh [[User:$1|$1]].
-Alasan nan diberikan adolah ''$2''.",
-'filereadonlyerror' => 'Indak bisa mangubah berkas "$1" karano repositori berkas "$2" dalam moda baco-sajo.
+'titleprotected' => "Judul ko dilinduangi dari dibuek jo [[User:$1|$1]].
+Alasannyo adolah ''$2''.",
+'filereadonlyerror' => 'Indak bisa mangubah berkas "$1" karano repositori berkas "$2" dalam mode baco-sajo.
 
-Pangurus nan manguncinyo manawarkan penjelasan: "$3"',
+Pangurus nan manguncinyo manawarkan panjalehan: "$3"',
 'invalidtitle-knownnamespace' => '↓Judul nan indak sah jo ruangnamo "$2" dan teks "$3"',
 'invalidtitle-unknownnamespace' => 'Judul nan tak sah jo nomor ruang namo indak diketahui $1 dan teks "$2"',
-'exception-nologin' => 'Indak log masuak',
+'exception-nologin' => 'Indak masuak log',
 'exception-nologin-text' => 'Laman ko hanyo dapek disuntiang dek pangguno nan mandaftar.',
 
 # Virus scanner
@@ -432,62 +499,91 @@ Pangurus nan manguncinyo manawarkan penjelasan: "$3"',
 Sanak dapek taruih manggunoan {{SITENAME}} sacaro anonim, atau Sanak dapek <span class='plainlinks'>[$1 masuak log liak]</span> sabagai pangguno nan samo atau pangguno nan lain.
 Parhatian bahawa bara laman mungkin masih taruih manunjukkan bahawa Sanak masih masuak log sampai Sanak mambarasihan singgahan panjelajah web Sanak.",
 'welcomeuser' => 'Salamaik datang, $1!',
-'welcomecreation-msg' => 'Akun Sanak alah dibuek. Jan lupo maatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Sanak.',
+'welcomecreation-msg' => 'Akun Sanak alah dibuek. Jan lupo maubah [[Special:Preferences|pangaturan {{SITENAME}}]] Sanak.',
 'yourname' => 'Namo pangguno:',
+'userlogin-yourname' => 'Namo pangguno',
+'userlogin-yourname-ph' => 'Masuakan namo pangguno',
 'yourpassword' => 'Kato sandi:',
+'userlogin-yourpassword' => 'Kato sandi',
+'userlogin-yourpassword-ph' => 'Masuakan kato sandi',
+'createacct-yourpassword-ph' => 'Masuakan kato sandi',
 'yourpasswordagain' => 'Ulang baliak kato sandi:',
-'remembermypassword' => 'Kana log masuak denai di komputer ko (salamo $1 {{PLURAL:$1|hari|hari}})',
+'createacct-yourpasswordagain' => 'Konfirmasi kato sandi',
+'createacct-yourpasswordagain-ph' => 'Masuakan lai kato sandi',
+'remembermypassword' => 'Ingek log masuak denai di paramban ko (salamo $1 {{PLURAL:$1|hari}})',
+'userlogin-remembermypassword' => 'Biakan ambo tetap masuak',
+'userlogin-signwithsecure' => 'Gunoan server aman',
 'securelogin-stick-https' => 'Tetap tahubuang ka HTTPS sasudah masuk log',
 'yourdomainname' => 'Domain Sanak:',
-'password-change-forbidden' => 'Sanak indak bisa mengubah kato kunci di wiki ko.',
-'externaldberror' => 'Alah tajadi kasalahan otentikasi basis data eksternal atau Sanak indak diizinan malakuan kamaskini tahadok akun eksternal Sanak.',
+'password-change-forbidden' => 'Sanak indak dapek maubah kato sandi di wiki ko.',
+'externaldberror' => 'Alah tajadi kasalahan otentikasi basis data eksternal atau Sanak indak diizinan malakuan pabaruan tahadok akun eksternal Sanak.',
 'login' => 'Masuak log',
 'nav-login-createaccount' => 'Masuak log / buek akun',
-'loginprompt' => "Sanak harus mangaktifan ''cookies'' untuak dapek masuak log ka {{SITENAME}}.",
+'loginprompt' => "Sanak musti mangaktipan ''cookies'' pado paramban Sanak untuak dapek masuak log ka {{SITENAME}} ko.",
 'userlogin' => 'Masuak log / buek akun',
 'userloginnocreate' => 'Masuak log',
 'logout' => 'Kalua log',
 'userlogout' => 'Kalua log',
 'notloggedin' => 'Alun masuak log',
-'nologin' => "Alun mampunyoi akun? '''$1'''.",
+'userlogin-noaccount' => 'Alun ado akun?',
+'userlogin-joinproject' => 'Join {{SITENAME}}',
+'nologin' => "Alun ado akun? '''$1'''.",
 'nologinlink' => 'Buek akun baru',
 'createaccount' => 'Buek akun',
-'gotaccount' => "Alah tadafta sabagai pangguno? '''$1'''.",
+'gotaccount' => "Alah tadaftar sabagai pangguno? '''$1'''.",
 'gotaccountlink' => 'Masuak log',
 'userlogin-resetlink' => 'Lupo rincian info masuak Sanak?',
+'userlogin-resetpassword-link' => 'Buek ulang kato sandi',
+'helplogin-url' => 'Help:Masuak log',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan untuak masuak log]]',
+'createacct-join' => 'Masuakan informasi Sanak di bawah ko.',
+'createacct-emailrequired' => 'Alamaik surel',
+'createacct-emailoptional' => 'Alamaik surel (opsional)',
+'createacct-email-ph' => 'Masuakan alamaik surel Sanak',
 'createaccountmail' => 'Pakai kato sandi sumbarang samantaro, lalu kirim ka alamaik surel nan di bawah ko',
+'createacct-realname' => 'Namo asli (opsional)',
 'createaccountreason' => 'Alasan:',
-'badretype' => 'Kato sandi nan Sanak masuakkan salah.',
+'createacct-reason' => 'Alasan',
+'createacct-reason-ph' => 'Manga Sanak mambuek akun lain',
+'createacct-captcha' => 'Pamarisoan kaamanan',
+'createacct-imgcaptcha-ph' => 'Masuakan teks nan Sanak caliak di ateh',
+'createacct-submit' => 'Buek akun Sanak',
+'createacct-benefit-heading' => '{{SITENAME}} dibuek dek urang-urang saroman Sanak.',
+'createacct-benefit-body1' => '{{PLURAL:$1|suntiangan}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|laman}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|panyuntiang}} tarakhia',
+'badretype' => 'Kato sandi nan Sanak masuakan salah.',
 'userexists' => 'Namo pangguno nan dipiliah alah tapakai.
 Piliah namo nan lain.',
 'loginerror' => 'Kasalahan masuak log',
+'createacct-error' => 'Pambuatan akun gagal',
 'createaccounterror' => 'Indak dapek mambuek akun: $1',
 'nocookiesnew' => 'Akun pangguno alah dibuek, tapi Sanak alun masuak log.
 {{SITENAME}} manggunokan cookies untuak log pangguno.
-Sanak mampunyoi cookie dinonaktifkan.
-Sila aktifan, sasudah itu masuak log jo namo pangguno dan password baharu Sanak.',
+Pangaturan cookie Sanak nonaktif.
+Aktifan dulu, sasudah tu baru masuak log jo namo pangguno dan kato sandi baru Sanak.',
 'nocookieslogin' => '{{SITENAME}} manggunokan cookies untuak log pangguno.
-Sanak mampunyoi cookie nan dinonaktifan.
-Sila aktifan dan cubo baliak.',
+Pangaturan cookie paramban Sanak nonaktif.
+Aktifan dulu dan cubo baliak.',
 'nocookiesfornew' => 'Akun pangguno indak dibuek karano kami indak dapek mamastian sumbernyo.
-Pastian Sanak alah mangaktifan kuki, lalu muek ulang laman iko dan cubo baliak.',
-'noname' => 'Namo pangguno nan Sanak masuakkan indak sah.',
-'loginsuccesstitle' => 'Berhasil masuak log',
+Pastian Sanak alah mangaktifan cokies, lalu muek ulang laman ko dan cubo baliak.',
+'noname' => 'Namo pangguno nan Sanak masuakan indak sah.',
+'loginsuccesstitle' => 'Bahasil masuak log',
 'loginsuccess' => "'''Sanak kini lah masuak log di {{SITENAME}} sabagai \"\$1\".'''",
 'nosuchuser' => 'Indak ado pangguno jo namo "$1".
-Namo psngguno msmbedokan kapitalisasi.
-Pariso baliak ejaan Sanak, atau [[Special:UserLogin/signup|buek akun baharu]].',
+Namo pangguno mambedoan kapitalisasi.
+Pariso baliak ejaan Sanak, atau [[Special:UserLogin/signup|buek akun baru]].',
 'nosuchusershort' => 'Indak ado pangguno jo namo "$1".
 Cubo pariso baliak ejaan Sanak.',
-'nouserspecified' => 'Sanak harus mamasuakkan namo pangguno.',
-'login-userblocked' => 'Pangguno iko diblokir. Indak diizinan/dipabuliahan untuak masuak log.',
-'wrongpassword' => 'Kato sandi nan Sanak masuakkan salah. Sila cubo baliak.',
-'wrongpasswordempty' => 'Sanak ndak mamasuakkan kato sandi. Sila cubo baliak.',
-'passwordtooshort' => 'Kato sandi paliang indak harus tadiri dari {{PLURAL:$1|1 karakter|$1 karakter}}.',
+'nouserspecified' => 'Sanak harus mamasuakan namo pangguno.',
+'login-userblocked' => 'Pangguno ko kanai sakek. Indak diizinan untuak masuak log.',
+'wrongpassword' => 'Kato sandi nan Sanak masuakan salah. Cubolah baliak.',
+'wrongpasswordempty' => 'Sanak indak mamasuakan kato sandi. Cubolah baliak.',
+'passwordtooshort' => 'Kato sandi paliang indak harus tadiri dari {{PLURAL:$1|$1 karakter}}.',
 'password-name-match' => 'Kato sandi Sanak harus babedo dari namo pangguno Sanak.',
-'password-login-forbidden' => 'Panggunoan namo pangguno dan sandi iko alah dilarang.',
+'password-login-forbidden' => 'Panggunoan namo pangguno dan sandi ko alah dilarang.',
 'mailmypassword' => 'Kirim kato sandi baru',
-'passwordremindertitle' => 'Paringatan kato sandi dari {{SITENAME}}',
+'passwordremindertitle' => 'Kato sandi samantaro untuak {{SITENAME}}',
 'passwordremindertext' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta kato sandi baharu untuak {{SITENAME}} ($4). Kato sandi samantaro untuak pangguno "$2" alah dibuekan dan diset manjadi "$3". Jikok memang Sanak nan mangajukan pamintaan ini, Sanak paralu masuak log dan mamilih kato sandi baharu kini. Kato sandi samantaro Sanak akan kadaluwarsa dalam wakatu {{PLURAL:$5|sahari|$5 hari}}.
 
 Jikok urang lain nan malakukan pamintaan iko, atau jikok Sanak alah mangingek kato sandi Sanak dan akan tetap manggunokan kato sandi tasabuik, sila abaikan pasan iko dan tatap gunokan kato sandi lamo Sanak.',
@@ -498,14 +594,14 @@ Silakan masuak log baliak sasudah manarimo surel tasabuik.',
 'blocked-mailpassword' => 'Alamaik IP Sanak diblokir dari panyuntingan dan karanonyo indak diizinan manggunokan fungsi pangingek kato sandi untuak mancegah panyalahgunoan.',
 'eauthentsent' => 'Surel untuak konfirmasi alah dikirim ka alamaik surel Sanak.
 Ikuti instruksi dalam surel tasabuik untuak malakuan konfirmasi jikok alamaik tasabuik adolah batua punyo Sanak. {{SITENAME}} indak akan mangaktifan fitur surel jikok langkah ko alun dilakuan.',
-'throttled-mailpassword' => 'Suatu pangingat kato sandi alah dikiriman dalam {{PLURAL:$1|jam|$1 jam}} tarakhir.
-Untuak manghindari panyalahgunoan, hanyo ciek kato sandi nan akan dikiriman satiok {{PLURAL:$1|jam|$1 jam}}.',
-'mailerror' => 'Kasalahan dalam mangirimkan surel: $1',
-'acct_creation_throttle_hit' => 'Pangunjung wiki iko jo alamaik IP nan samo jo Sanak alah mambuek {{PLURAL:$1|1 akun|$1 akun}} dalam sahari tarakhir, hinggo jumlah maksimum nan diizinan.
-Karanonyo, pangunjuang jo alamaik IP iko indak dapek baliak mambuek akun lain untuak samantaro.',
+'throttled-mailpassword' => 'Suatu pangingek kato sandi alah dikiriman dalam {{PLURAL:$1|$1 jam}} tarakhia.
+Untuak manghindari panyalahgunoan, hanyo ciek kato sandi nan ka dikirim satiok {{PLURAL:$1|$1 jam}}.',
+'mailerror' => 'Kasalahan dalam mangiriman surel: $1',
+'acct_creation_throttle_hit' => 'Pangunjung wiki iko jo alamaik IP nan samo jo Sanak alah mambuek {{PLURAL:$1|$1 akun}} dalam sahari tarakhia, sampai jumlah maksimum nan diizinan.
+Karanonyo, pangunjuang jo alamaik IP ko indak dapek mambuek akun lain untuak samantaro.',
 'emailauthenticated' => 'Alamaik surel Sanak lah dikonfirmasi pado $3, $2.',
 'emailnotauthenticated' => 'Alamaik surel Sanak alun dikonfirmasi. Sabalun dikonfirmasi Sanak indak dapek manggunoan fitur surel.',
-'noemailprefs' => 'Sanak harus mamasukan alamaik surel di pangaturan Sanak untuak dapek manggunoan fitur-fitur ko.',
+'noemailprefs' => 'Sanak harus mamasuakan alamaik surel di pangaturan Sanak untuak dapek manggunoan fitur-fitur ko.',
 'emailconfirmlink' => 'Konfirmasi alamaik surel Sanak',
 'invalidemailaddress' => 'Alamaik surel iko indak dapek ditarimo dek formatnyo indak sasuai.
 Harap masuakan alamaik surel dalam format nan bana atau kosoangan isian tasabuik.',
@@ -513,21 +609,21 @@ Harap masuakan alamaik surel dalam format nan bana atau kosoangan isian tasabuik
 'emaildisabled' => 'Situs web ko indak dapek mangirim surel.',
 'accountcreated' => 'Akun dibuek',
 'accountcreatedtext' => 'Akun pangguno untuak $1 alah dibuek.',
-'createaccount-title' => 'Pambuekan akun untuak {{SITENAME}}',
+'createaccount-title' => 'Pambuatan akun untuak {{SITENAME}}',
 'createaccount-text' => 'Sasaurang alah mambuek sabuah akun untuak alamaik surel Sanak di {{SITENAME}} ($4) jo namo "$2" dan kato sandi "$3". Sanak dianjuakan untuak masuak log dan mangganti kato sandi Sanak kini.
 
 Sanak dapek mangacuahkan pasan ko jikok akun ko dibuek dek ado kasalahan.',
-'usernamehasherror' => 'Namo pangguno indak bisa mangandung tando paga',
-'login-throttled' => 'Sanak alah bakali-kali mancoba masuak log.
-Sila manunggu sabalun mancubo baliak.',
-'login-abort-generic' => 'Proses masuak Sanak indak berhasil - Dibatalan',
+'usernamehasherror' => 'Namo pangguno indak bisa manganduang tando paga',
+'login-throttled' => 'Sanak alah bakali-kali mancubo masuak log.
+Tunggulah sabanta sabalun mancubo baliak.',
+'login-abort-generic' => 'Proses masuak Sanak indak barasil - Dibatalan',
 'loginlanguagelabel' => 'Baso: $1',
-'suspicious-userlogout' => 'Pamintaan Sanak untuak kalua log ditolak karano tampaknyo dikirim oleh panjalajah nan rusak atau proksi panyinggah.',
+'suspicious-userlogout' => 'Pamintaan Sanak untuak kalua log ditulak karano tampaknyo dikirim oleh paramban nan rusak atau proksi panyinggah.',
 
 # Email sending
-'php-mail-error-unknown' => 'Kasalahan nan indak dikana dalam fungsi mail() PHP',
-'user-mail-no-addy' => 'Mancubo mangirim surel tanpa alamaik surel nan sah.',
-'user-mail-no-body' => 'Mancubo kirim surel kosong atau pasan talalu pendek',
+'php-mail-error-unknown' => 'Kasalahan nan indak jaleh dalam fungsi mail() PHP',
+'user-mail-no-addy' => 'Mancubo mangirim surel tanpa alamaik surel.',
+'user-mail-no-body' => 'Mancubo mangirim surel kosong atau pasan talalu pendek',
 
 # Change password dialog
 'resetpass' => 'Tuka kato sandi',
@@ -546,43 +642,42 @@ Kini mamproses masuak log Sanak...',
 'resetpass-wrong-oldpass' => 'Kato sandi indak sah.
 Sanak mungkin alah berhasil mangganti kato sandi Sanak atau alah maminto kato sandi samantaro nan baharu.',
 'resetpass-temp-password' => 'Kato sandi samantaro:',
+'resetpass-abort-generic' => 'Parubahan kato sandi alah dibatalan dek ekstensi.',
 
 # Special:PasswordReset
 'passwordreset' => 'Setel ulang sandi',
-'passwordreset-text' => 'Lengkapi formulir ko untuak manarimo surel pangingek pado detil akun Sanak.',
 'passwordreset-legend' => 'Tuka baliak kato sandi',
-'passwordreset-disabled' => 'Panukaran baliak kato sandi alah dimatian di wiki iko.',
-'passwordreset-pretext' => '{{PLURAL:$1||Masuakan ciek data di bawah iko}}',
+'passwordreset-disabled' => 'Pangubahan kato sandi alah dimatian di wiki iko.',
+'passwordreset-emaildisabled' => 'Fitur surel alah dimatian pado wiki iko.',
 'passwordreset-username' => 'Namo pangguno:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Caliak kaputusannyo?',
 'passwordreset-capture-help' => 'Kalau sanak mancentang kotak ko, surel (jo kato sandi samantaro) akan nampak jo Sanak.',
 'passwordreset-email' => 'Alamaik surel:',
 'passwordreset-emailtitle' => 'Detail akun di {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta pangingek
-detil akun untuak {{SITENAME}} ($4). {{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel iko:
+'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:
 
 $2
 
-{{PLURAL:$3|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|$5 hari}}.
-Sanak 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 sandi lamo.',
-'passwordreset-emailtext-user' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta pangingek detil akun untuak {{SITENAME}} ($4).
+{{PLURAL:$3|Sandi samantaro}} barikuik akan habih masonyo dalam {{PLURAL:$5|$5 ari}}.
+Sanak 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).
 {{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel ko:
 
 $2
 
-{{PLURAL:$3|Sandi samantaro}} barikuik akan kadaluwarsa dalam {{PLURAL:$5|$5 hari}}.
-Sanak 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 sandi lamo.',
+{{PLURAL:$3|Sandi samantaro}} barikuik akan habih masonyo dalam {{PLURAL:$5|$5 ari}}.
+Sanak 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
 Sandi samantaro: $2',
-'passwordreset-emailsent' => 'Surel pangingek alah dikiriman.',
-'passwordreset-emailsent-capture' => 'Surel paringatan alah dikirim, nan nampak di bawah ko.',
-'passwordreset-emailerror-capture' => 'Surel pangingek, nan ditampilkan di bawah, alah dibuek, tapi pengirimannyo gagal ka pangguno: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Tuka alamaik surel.',
 'changeemail-header' => 'Ganti alamaik surel.',
-'changeemail-text' => 'Isi formulir ko untuak mangganti alamat surel. Sanak harus mamasuakkan kato sandi untuak mayakinkan parubahan.',
+'changeemail-text' => 'Isi formulir ko untuak mangganti alamaik surel. Sanak musti mamasuakan kato sandi untuak mayakinkan parubahan.',
 'changeemail-no-info' => 'Sanak harus masuak log untuak mangakses laman ko.',
 'changeemail-oldemail' => 'Alamat surel kini:',
 'changeemail-newemail' => 'Alamat surel baru:',
@@ -672,22 +767,23 @@ Subbagian ko mungkin lah dipindahan atau dihapuih sangkek Sanak mambukaknyo.',
 
 Kato sandi untuak akun baharu iko dapek diubah di laman ''[[Special:ChangePassword|pangubahan kato sandi]]'' satalah masuak log.",
 'newarticle' => '(Baru)',
-'newarticletext' => "Laman nan awak cari alun ado.
-Untuak mambuek laman tu, mulailah dangan manulih dalam kotak di bawah (caliak [[{{MediaWiki:Helppage}}|laman bantuan]] untuak informasi lanjuiknyo).
-Jikok awak indak sangajo sampai ka laman ko, klik tombol '''back''' pado panjalajah web awak.",
+'newarticletext' => "Laman nan Sanak cari alun ado.
+Untuak mambuek laman tu, mulailah jo manulih dalam kotak di bawah (caliak [[{{MediaWiki:Helppage}}|laman bantuan]] untuak informasi labiah lanjuik).
+Jikok Sanak indak sangajo sampai ka laman ko, klik tombol '''back''' pado paramban web Sanak.",
 'anontalkpagetext' => "----''Iko adolah laman rundiang saurang pangguno anonim nan alun mambuek akun atau indak manggunoannyo.
 Jadi, kami tapaso mamakai alamat IP nan takaik untuak mangenalinyo.
 Jikok Sanak adolah pangguno anonim dan maraso mandapek komentar nan indak lamak nan ditujuan langsung kapado Sanak, cubolah [[Special:UserLogin/signup|mambuek akun]] atau [[Special:UserLogin|masuak log]] guno manghindari karancuan jo pangguno anonim lainnyo.''",
-'noarticletext' => 'Kini ko indak ada teks di laman iko.
-Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancarian untuak judul laman iko]] di laman-laman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log takaik], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} manyuntiang laman iko]</span>.',
+'noarticletext' => 'Kini ko indak ado teks di laman ko.
+Sanak dapek [[Special:Search/{{PAGENAME}}|malakuan pancarian untuak judul laman ko]] di laman-laman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log takaik], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} manyuntiang laman iko]</span>.',
 'noarticletext-nopermission' => 'Kini ko indak ado teks dalam laman ko.
 Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancarian untuak judul laman ko]] di laman lain, atau <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancahari log takaik] </span>, tapi Sanak indak punyo izin untuak mambuek laman ko.',
 'missing-revision' => 'Revisi $1 di laman nan banamo "{{PAGENAME}}" ko indak ado.
 
 Hal iko biasonyo disababkan dek pautan sijarah nan alah kadaluarsa ka laman nan alah diapuih.
 Rinciannyo dapek dicaliak di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].',
-'userpage-userdoesnotexist' => 'Akun pangguno "<nowiki>$1</nowiki>" indak tadafta.',
-'userpage-userdoesnotexist-view' => 'Pangguno "$1" indak tadafta.',
+'userpage-userdoesnotexist' => 'Akun pangguno "$1" indak tadaftar.
+Cubo pareso jikok nio mambuek/suntiang laman ko.',
+'userpage-userdoesnotexist-view' => 'Pangguno "$1" indak tadaftar.',
 'blocked-notice-logextract' => 'Pangguno ko tangah diblokir.
 Entri log pamblokiran tabaru disadioan di bawah ko untuak referensi:',
 'clearyourcache' => "'''Catatan:''' Sasudah menyimpan, Sanak mungkin harus meminteh singgahan paramban Sanak untuak maliek parubahan.
@@ -709,7 +805,7 @@ Pratayang iko alun disimpan!'''",
 'note' => "'''Catatan:'''",
 'previewnote' => "'''Ingek iko hanyo pratonton'''
 Parubahan Sanak alun disimpan!",
-'continue-editing' => 'Pai ka area mangedit.',
+'continue-editing' => 'Pai ka kotak panyuntiangan',
 'previewconflict' => 'Pratayang iko mancaminan teks pado bagian ateh kotak suntiangan teks sabagaimano akan taliek bilo Sanak manyimpannyo.',
 'session_fail_preview' => "'''Maaf, kami ndak dapek mangolah suntiangan Sanak akibat tahapuihnyo data sesi.
 Sila cubo sakali lai.
@@ -736,8 +832,8 @@ Sanak hanyo paralu manggabungan parubahan Sanak jo teks nan lah ado.
 '''Hanyo''' teks pado bagian ateh lamanlah nan akan disimpan jikok Sanak manakan \"{{int:savearticle}}\".",
 'yourtext' => 'Teks Sanak',
 'storedversion' => 'Versi tasimpan',
-'nonunicodebrowser' => "'''Paringatan: Panjalajah web Sanak indak mandukuang Unicode.'''
-Alah ado solusi bia Sanak dapek manyuntiang laman sacaro aman: karakter non-ASCII akan muncua dalam kotak suntiang sabagai kode heksadesimal.",
+'nonunicodebrowser' => "'''Paringatan: Paramban web Sanak indak mandukuang Unicode.'''
+Alah ado jalan kalua bia Sanak dapek manyuntiang laman sacaro aman: karakter non-ASCII akan muncua dalam kotak suntiang sabagai kode heksadesimal.",
 'editingold' => "'''Paringatan:
 Sanak manyuntiang revisi lamo suatu laman.
 Jikok Sanak manyimpannyo, parubahan-parubahan nan dibuek sajak revisi ko akan hilang.'''",
@@ -754,8 +850,8 @@ Sanak mungkin paralu manyalin teks suntiangan Sanak ko dan simpankan ka sabuah b
 Panguruih nan mangunci basis data maagiahan panjalehan barikuik: $1",
 'protectedpagewarning' => "'''Paringatan: Laman iko sadang dilinduangi sahinggo hanyo pangguno jo hak akses pangurus nan dapek manyuntiangnyo.'''
 Entri catatan tarakhir disadioan di bawah untuak referensi:",
-'semiprotectedpagewarning' => "'''Paringatan: Laman iko sadang dilinduangi sahinggo hanyo pangguno tadafta nan bisa manyuntiangnyo.'''
-Entri catatan tarakhir disadioan di bawah untuak referensi:",
+'semiprotectedpagewarning' => "'''Catatan:''' Laman ko sadang dilinduangi, jadi hanyo pangguno tadaftar nan dapek manyuntiangnyo.
+Entri log tarakhia disadioan di bawah untuak reperensi:",
 'cascadeprotectedwarning' => "'''Paringatan:''' Laman ko sadang dilinduangi jadi hanyo pangguno jo hak akses panguruih sajo nan dapek manyuntiangnyo karano disaratoan dalam {{PLURAL:$1|laman}} nan alah dilinduangi jo palinduangan batingkek:",
 'titleprotectedwarning' => "'''Paringatan: Laman iko alah dilinduangi sahinggo diparaluan [[Special:ListGroupRights|hak khusus]] untuak mambueknyo.'''
 Entri catatan tarakhir disadioan di bawah untuak referensi:",
@@ -776,9 +872,9 @@ Sanak dapek baliak dan manyuntiang laman nan alah ado, atau [[Special:UserLogin|
 'recreate-moveddeleted-warn' => "'''Ingek: Sanak mambuek ulang suatu laman nan alah dihapuih.'''
 
 Harap ditimbang apo rancak malanjuikan suntiangan Sanak.
-Barikuik ko log panghapuihan jo pamindahan dari laman ko:",
+Barikuik ko log pangapuihan jo pamindahan dari laman ko:",
 'moveddeleted-notice' => 'Laman ko alah dihapuih.
-Sabagai referensi, barikuik adolah log panghapuihan dan pamindahannyo.',
+Sabagai reperensi, barikuik adolah log pangapuihan dan pamindahannyo.',
 'log-fulllog' => 'Liek saluruah log',
 'edit-hook-aborted' => 'Suntiangan dibatalan samo kait parser
 tanpa ado katarangan.',
@@ -792,6 +888,7 @@ Nyo alah ado.',
 'content-failed-to-parse' => 'Gagal manjabarkan konten $2 untuak model $1: $3',
 'invalid-content-data' => 'Data kanduangan indak valid.',
 'content-not-allowed-here' => 'Konten "$1" indak diizinan di laman [[$2]]',
+'editwarning-warning' => 'Maninggakan laman ko dapek maakibaikan parubahan nan dibuek hilang. Jikok Sanak lah masuak log, dapek mamatian pasan ko malalui bagian "Panyuntiangan" pado laman pangaturan.',
 
 # Content models
 'content-model-wikitext' => 'Teks wiki',
@@ -839,17 +936,17 @@ Alasan nan diagiah jo $3 adolah ''$2''",
 'nohistory' => 'Indak ado sajarah panyuntiangan untuak laman ko',
 'currentrev' => 'Revisi tabaru',
 'currentrev-asof' => 'Revisi tabaru pado $1',
-'revisionasof' => 'Pabaikkan per $1',
+'revisionasof' => 'Revisi pado $1',
 'revision-info' => 'Revisi sajak $1 dek $2',
-'previousrevision' => '← Pabaikkan sabalunnyo',
+'previousrevision' => '← Revisi sabalunnyo',
 'nextrevision' => 'Revisi selanjuiknyo →',
 'currentrevisionlink' => 'Revisi tabaru',
 'cur' => 'kini',
 'next' => 'lanjuik',
 'last' => 'sabalun',
 'page_first' => 'awal',
-'page_last' => 'akhir',
-'histlegend' => "Bandiangkan pilihan: Tandoi revisi untuak mambandiangkan dan takan enter atau tombol di bawah.<br />
+'page_last' => 'akhia',
+'histlegend' => "Bandiangan piliahan: Tandoi revisi untuak mambandiangan dan takan enter atau tombol di bawah.<br />
 Contoh: '''({{int:cur}})''' = bedo jo versi tarakhia, '''({{int:last}})''' = bedo jo versi sabalunnyo, '''{{int:minoreditletter}}''' = suntiangan ketek.",
 'history-fieldset-title' => 'Talusuri riwayaik',
 'history-show-deleted' => 'Hanyo nan dihapuih',
@@ -870,61 +967,98 @@ Cuba [[Special:Search|cari dulu]] untuak laman lain nan relevan.',
 'rev-deleted-comment' => '(ringkasan suntiangan dihapuih)',
 'rev-deleted-user' => '(namo pangguno dihapuih)',
 'rev-deleted-event' => '(isi dihapuih)',
-'rev-deleted-user-contribs' => '[namo pangguno atau alamat IP dihapuih - suntiangan disuruakkan pad dafta kontribusi]',
+'rev-deleted-user-contribs' => '[namo pangguno atau alamaik IP dihapuih - suntiangan disuruakan dari daftar jariah]',
 'rev-deleted-text-permission' => "Revisi laman ko alah '''dihapuih'''.
-Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log panghapuihan]",
+Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan]",
 'rev-deleted-text-unhide' => "Revisi laman ko alah '''dihapuih'''.
-Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapuihan].
-Angku masih dapek [$1 maliek revisi ko] ko' amuah.",
+Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].
+Sanak masih dapek [$1 mancaliak revisi ko] ko' amuah.",
 'rev-suppressed-text-unhide' => "Revisi laman ko alah '''tabanam'''.
 Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log pambanaman].
 Angku masih dapek [$1 maliek revisi ko] ko' amuah.",
 'rev-deleted-text-view' => "Laman revisi ko alah '''dihapuih'''.
-Angku dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapuihan].",
+Sanak dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
 'rev-suppressed-text-view' => "Revisi laman ko alah '''tabanam'''.
 Angku dapek malieknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambanaman]",
-'rev-deleted-no-diff' => "Angku indak dapek maliek pabedoan ko dek salah satu dari revisinyo alah '''dihapuih'''.
-Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapuihan].",
+'rev-deleted-no-diff' => "Sanak indak dapek mancaliak pabedoan ko dek salah satu dari revisi ko alah '''dihapuih'''.
+Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
 'rev-suppressed-no-diff' => "Angku indak dapek maliek pabedoan ko dek salah satu dari revisinyo alah '''dihapuih'''.",
 'rev-deleted-unhide-diff' => "Revisi laman ko alah '''dihapuih'''.
-Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapuihan].
-Sanak masih dapek [$1 maliek revisi ko] ko' amuah.",
+Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].
+Sanak masih dapek [$1 mancaliak revisi ko] ko' amuah.",
 'rev-suppressed-unhide-diff' => "Revisi laman ko alah '''tabanam'''.
 Rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log pambanaman].
 Sanak masih dapek [$1 maliek revisi ko] ko' amuah.",
 'rev-deleted-diff-view' => "Laman revisi ko alah '''dihapuih'''.
-Sanak dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapuihan].",
+Sanak dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
 'rev-suppressed-diff-view' => "Revisi laman ko alah '''tabanam'''.
 Sanak dapek malieknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambanaman]",
-'rev-delundel' => 'tampilkan/suruakkan',
-'rev-showdeleted' => "tunjua'an",
+'rev-delundel' => 'tunjuakan/suruakkan',
+'rev-showdeleted' => 'tunjuakan',
 'revisiondelete' => 'Hapuih/batal hapuih revisi',
 'revdelete-nooldid-title' => 'Target revisi indak basobok',
+'revdelete-nooldid-text' => 'Sanak alun mangagiah target revisi untuak manjalankan fungsi ko, revisi nan ditantuan indak ado, atau Sanak nio manyuruakan revisi kini ko.',
 'revdelete-nologtype-title' => 'Tipe log indak diagiah',
 'revdelete-nologtype-text' => 'Sanak indak mngagiah tipe log untuak manerapkan tindakan ko.',
-'revdelete-nologid-title' => 'Entri log indak valid',
+'revdelete-nologid-title' => 'Entri log indak sah',
+'revdelete-nologid-text' => 'Sanak mungkin indak manyabuik suatu log target kajadian untuak manjalanan fungsi iko atau entri nan dimakasuik indak basuo.',
 'revdelete-no-file' => 'Berkas nan dituju indak basobok.',
 'revdelete-show-file-confirm' => 'Apokah Sanak yakin nio mancaliak revisi nan alah dihapuih dari berkas "<nowiki>$1</nowiki>" per $3, $2?',
 'revdelete-show-file-submit' => 'Yo',
 'revdelete-selected' => "'''{{PLURAL:$2|Revisi piliahan}} dari [[:$1]]:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|Log pilihan}}:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Log piliahan}}:'''",
+'revdelete-text' => "'''Revisi jo tindakan nan alah dihapuih akan tetap muncua di versi tadaulu dan laman log, tapi bagian dari isinyo indak dapek diakses publik.'''
+Panguruih {{SITENAME}} lain tetap dapek mangakses isi nan tasuruak ko dan dapek mambatalan pangapuihannyo manggunoan antarmuko nan samo, kacuali ado pambatehan lain nan dibuek.",
+'revdelete-confirm' => 'Tolong konfirmasi baso Sanak samemang bamakasuik malakuan iko, mamahami konsekuensinyo, dan baso Sanak malakuannyo sasuai jo [[{{MediaWiki:Policy-url}}|kabijakan]].',
+'revdelete-suppress-text' => "Panyambunyian revisi '''hanyo''' buliah digunoan untuak kasus-kasus barikuik:
+* Informasi paribadi nan indak patuik
+*: ''alamaik rumah jo nomor telepon, nomor kartu identitas, dll.''",
+'revdelete-legend' => 'Pangaturan bateh',
+'revdelete-hide-text' => 'Suruakan teks revisi',
+'revdelete-hide-image' => 'Suruakan isi berkas',
+'revdelete-hide-name' => 'Suruakan tindakan jo target',
+'revdelete-hide-comment' => 'Suruakan ikhtisar suntiangan',
+'revdelete-hide-user' => 'Suruakan namo pangguno/IP panyuntiang',
+'revdelete-hide-restricted' => 'Suruakan juo data dari panguruih',
+'revdelete-radio-same' => '(jan diubah)',
 'revdelete-radio-set' => 'Yo',
 'revdelete-radio-unset' => 'Indak',
+'revdelete-suppress' => 'Suruakan juo data dari panguruih',
+'revdelete-unsuppress' => 'Hapuih batehan pado revisi nan dikambalian',
 'revdelete-log' => 'Alasan:',
+'revdelete-submit' => 'Terapkan pado {{PLURAL:$1|revisi}} tapiliah',
+'revdelete-success' => "'''Revisi barasil dipabarui.'''",
+'revdelete-failure' => "'''Revisi indak dapek dipabarui:'''
+$1",
+'logdelete-success' => "'''Log data barasil dipabarui.'''",
+'logdelete-failure' => "'''Log data indak dapek dipabarui:'''
+$1",
 'revdel-restore' => 'ganti tampilan',
 'revdel-restore-deleted' => 'suntiangan nan alah dihapuih',
 'revdel-restore-visible' => 'tampilan revisi',
 'pagehist' => 'Riwayaik laman',
+'deletedhist' => 'Riwayaik pangapuihan',
+'revdelete-reason-dropdown' => '*Alasan pangapuihan umum
+** Palanggaran hak cipta
+** Komentar atau informasi paribadi nan indak patuik
+** Namo pangguno nan indak patuik
+** Bapotensi mancemarkan namo baiak',
 'revdelete-otherreason' => 'Alasan lain/tambahan:',
 'revdelete-reasonotherlist' => 'Alasan lain',
 'revdelete-edit-reasonlist' => 'Alasan mangapuih laman',
+'revdelete-offender' => 'Pambuek reviri:',
+
+# Suppression log
+'suppressionlog' => 'Log pambanaman',
 
 # History merging
 'mergehistory-reason' => 'Alasan:',
 
 # Merge log
 'mergelog' => 'Log panggabuangan',
+'pagemerge-logentry' => 'manggabuangan [[$1]] ka [[$2]] (revisi sampai $3)',
 'revertmerge' => 'Batal gabuang',
+'mergelogpagetext' => 'Di bawah ko daftar panggabuangan riwayaik laman ka laman nan lain.',
 
 # Diffs
 'history-title' => 'Riwayaik revisi dari "$1"',
@@ -933,9 +1067,9 @@ Sanak dapek malieknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/del
 'difference-multipage' => '(Pabedoan antaro laman)',
 'lineno' => 'Barih $1:',
 'compareselectedversions' => 'Bandiangan versi tapiliah',
-'showhideselectedversions' => 'Tampilkan/suruakan versi tapiliah',
+'showhideselectedversions' => 'Tunjuakan/suruakan versi tapiliah',
 'editundo' => 'batal',
-'diff-multi' => '({{PLURAL:$1|$1 revisi antaro}} oleh {{PLURAL:$2|$2 pangguno}} indak ditampilkan)',
+'diff-multi' => '({{PLURAL:$1|$1 revisi antaro}} dek {{PLURAL:$2|$2 pangguno}} indak ditampilan)',
 
 # Search results
 'searchresults' => 'Hasil pancarian',
@@ -952,7 +1086,7 @@ Sanak dapek malieknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/del
 'prevn-title' => '$1 {{PLURAL:$1|hasil}} sabalunnyo',
 'nextn-title' => '$1 {{PLURAL:$1|hasil}} barikuiknyo',
 'shown-title' => 'Tampilkan $1 {{PLURAL:$1|hasil}} per laman',
-'viewprevnext' => 'Caliakkan ($1 {{int:pipe-separator}} $2) ($3)',
+'viewprevnext' => 'Caliak ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Atua pancarian',
 'searchmenu-exists' => "'''Ado laman nan banamo \"[[:\$1]]\" pado wiki ko.'''",
 'searchmenu-new' => "'''Buek laman \"[[:\$1]]\" di wiki ko!'''",
@@ -966,7 +1100,7 @@ Sanak dapek malieknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/del
 'searchprofile-articles-tooltip' => 'Cari di $1',
 'searchprofile-project-tooltip' => 'Cari di $1',
 'searchprofile-images-tooltip' => 'Cari untuak berkas',
-'searchprofile-everything-tooltip' => 'Cari sadoalahnyo (tamasuak laman maota)',
+'searchprofile-everything-tooltip' => 'Cari kasadonyo (tamasuak laman rundiang)',
 'searchprofile-advanced-tooltip' => 'Pacarian di ruang namo tatantu',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 kato}})',
 'search-result-category-size' => '{{PLURAL:$1|$1 anggota}} ({{PLURAL:$2|$2 subkategori}}, {{PLURAL:$3|$3 berkas}})',
@@ -979,7 +1113,7 @@ Sanak dapek malieknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/del
 'search-interwiki-more' => '(salanjuiknyo)',
 'search-relatedarticle' => 'Bakaitan',
 'mwsuggest-disable' => 'Matian saran pancarian',
-'searcheverything-enable' => 'Cari di sagalo ruang namo',
+'searcheverything-enable' => 'Cari kasado ruangnamo',
 'searchrelated' => 'bakaitan',
 'searchall' => 'sado',
 'showingresults' => "Di bawah ko dikaluaan sampai {{PLURAL:$1|'''$1''' hasil}}, dimulai dari #'''$2'''.",
@@ -991,7 +1125,7 @@ Cubo awali pamintaan Sanak tu jo ''sadonyo:'' untuak mancari kasado kandungan (t
 'powersearch' => 'Pencarian lanjut',
 'powersearch-legend' => 'Pencarian lanjut',
 'powersearch-ns' => 'Mancari di ruangnamo:',
-'powersearch-redir' => 'Dafta pangaliahan',
+'powersearch-redir' => 'Daftar pangaliahan',
 'powersearch-field' => 'Mancari',
 'powersearch-togglelabel' => 'Piliah:',
 'powersearch-toggleall' => 'Sadonyo',
@@ -1001,15 +1135,6 @@ Cubo awali pamintaan Sanak tu jo ''sadonyo:'' untuak mancari kasado kandungan (t
 Sanak samantaro dapek mancari lewaik Google.
 Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
 
-# Quickbar
-'qbsettings' => 'Bar pinteh',
-'qbsettings-none' => 'Indak ado',
-'qbsettings-fixedleft' => 'Rato kiri',
-'qbsettings-fixedright' => 'Rato kanan',
-'qbsettings-floatingleft' => 'Mangambang di kiri',
-'qbsettings-floatingright' => 'Mangambang di kanan',
-'qbsettings-directionality' => 'Tetap, tagantuang pado skrip bahaso Sanak',
-
 # Preferences page
 'preferences' => 'Pangaturan',
 'mypreferences' => 'Pangaturan',
@@ -1020,23 +1145,23 @@ Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
 'prefs-skin' => 'Kulik',
 'skin-preview' => 'Caliak',
 'datedefault' => 'Indak usah diatua',
-'prefs-beta' => 'Baru dicubo (Beta)',
-'prefs-datetime' => 'Tangga jo wakatu',
+'prefs-beta' => 'Baru uji-cubo (Beta)',
+'prefs-datetime' => 'Tanggal jo wakatu',
 'prefs-labs' => 'Alaik uji',
 'prefs-user-pages' => 'Laman pangguno',
 'prefs-personal' => 'Profil pangguno',
-'prefs-rc' => 'Parubahan tabaru',
-'prefs-watchlist' => 'Dafta pantau',
-'prefs-watchlist-days' => 'Lamonyo dalam dafta pantau:',
+'prefs-rc' => 'Parubahan baru',
+'prefs-watchlist' => 'Daftar pantau',
+'prefs-watchlist-days' => 'Jumlah hari dalam daftar pantau:',
 'prefs-watchlist-days-max' => 'Maksimum $1 {{PLURAL:$1|hari}}',
-'prefs-watchlist-edits' => 'Jumlah suntiangan maksimum nan ditampilkan didafta pantaun nan labiah langkok:',
+'prefs-watchlist-edits' => 'Jumlah suntiangan nan ditunjuakan pado daftar pantau:',
 'prefs-watchlist-edits-max' => 'Nilai maksimum: 1000',
 'prefs-watchlist-token' => 'Token pantauan:',
 'prefs-misc' => 'Lain-lain',
 'prefs-resetpass' => 'Tuka kato sandi',
 'prefs-changeemail' => 'Tuka alamaik surel',
 'prefs-setemail' => 'Atua alamaik surel',
-'prefs-email' => 'Opsi surel',
+'prefs-email' => 'Piliahan surel',
 'prefs-rendering' => 'Tampilan',
 'saveprefs' => 'Simpan',
 'resetprefs' => 'Batalan parubahan',
@@ -1044,16 +1169,16 @@ Ingek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.',
 'prefs-editing' => 'Panyuntiangan',
 'prefs-edit-boxsize' => 'Ukuran kotak panyuntiangan.',
 'rows' => 'Barih:',
-'columns' => 'Kolom',
+'columns' => 'Kolom:',
 'searchresultshead' => 'Cari',
 'resultsperpage' => 'Hasil per laman:',
-'stub-threshold' => 'Ambang bateh untuak format <a href="#" class="stub">tautan rintisan</a>:',
+'stub-threshold' => 'Ambang bateh untuak format <a href="#" class="stub">pautan rancangan</a>:',
 'stub-threshold-disabled' => 'Nonaktifkan',
-'recentchangesdays' => 'Jumlah ari nan ditampilkan di parubahan tabaru:',
+'recentchangesdays' => 'Jumlah hari nan ditunjuakan di parubahan baru:',
 'recentchangesdays-max' => 'Maksimum $1 {{PLURAL:$1|hari}}',
-'recentchangescount' => 'Standar jumlah suntiangan nan ditampilkan:',
+'recentchangescount' => 'Jumlah suntiangan nan ditunjuakan:',
 'prefs-help-recentchangescount' => 'Iko untuak parubahan tabaru, riwayaik laman nan lalu, sarato log.',
-'prefs-help-watchlist-token' => 'Mangisi kotak ko jo kunci rasio (PIN) akan manghasilkan sindikasi RSS untuak dafta pantau Sanak. Sia juo nan tau jo kunci ko dapek mambaco dafta pantau Sanak, jadi hati-hatilah mamiliah nilainyo. 
+'prefs-help-watchlist-token' => 'Mangisi kotak ko jo kunci rasio (PIN) akan manghasilkan sindikasi RSS untuak daftar pantau Sanak. Sia juo nan tau jo kunci ko dapek mambaco daftar pantau Sanak, jadi hati-hatilah mamiliah nilainyo. 
 Barikuik ko nilai acak nan dapek Sanak gunoan: $1',
 'savedprefs' => 'Pangaturan lah tasimpan',
 'timezonelegend' => 'Zona wakatu:',
@@ -1062,7 +1187,7 @@ Barikuik ko nilai acak nan dapek Sanak gunoan: $1',
 'timezoneuseoffset' => 'Lainnyo (tantuan pabedoannyo)',
 'timezoneoffset' => 'Pabedoan¹:',
 'servertime' => 'Wakatu server:',
-'guesstimezone' => 'Isikan dari panjalajah web',
+'guesstimezone' => 'Isian dari paramban web',
 'timezoneregion-africa' => 'Afrika',
 'timezoneregion-america' => 'Amerika',
 'timezoneregion-antarctica' => 'Antarktika',
@@ -1075,12 +1200,12 @@ Barikuik ko nilai acak nan dapek Sanak gunoan: $1',
 'timezoneregion-pacific' => 'Samudera Pasifik',
 'allowemail' => 'Izinkan pangguno lain mangirim surel',
 'prefs-searchoptions' => 'Cari',
-'prefs-namespaces' => 'Ruang namo',
-'defaultns' => 'Ataupun cari dalam ruang namo lain:',
+'prefs-namespaces' => 'Ruangnamo',
+'defaultns' => 'Ataupun cari dalam ruangnamo ko:',
 'default' => 'baku',
 'prefs-files' => 'Berkas',
-'prefs-custom-css' => 'CSS pribadi',
-'prefs-custom-js' => 'JS pribadi',
+'prefs-custom-css' => 'CSS paribadi',
+'prefs-custom-js' => 'JS paribadi',
 'prefs-common-css-js' => 'CSS/JS untuak kasado kulik:',
 'prefs-reset-intro' => 'Angku dapek manggunokan laman ko untuak mangambalikan pangaturan ka setelan baku situs ko.
 Pangambalian pangaturan indak dapek dibatalan.',
@@ -1091,40 +1216,40 @@ Pangambalian pangaturan indak dapek dibatalan.',
 'uid' => 'ID {{GENDER:$1|pangguno}}:',
 'prefs-memberingroups' => '{{GENDER:$2|Anggota}} {{PLURAL:$1|kalompok}}:',
 'prefs-registration' => 'Wakatu pandaftaran:',
-'yourrealname' => 'Namo sabananyo:',
+'yourrealname' => 'Namo asli:',
 'yourlanguage' => 'Bahaso',
-'yourvariant' => 'Varian bahaso isi:',
+'yourvariant' => 'Varian isi bahaso:',
 'prefs-help-variant' => 'Varian atau ortografi pilihan Angku untuak manampilkan isi laman wiki ko.',
 'yournick' => 'Tando tangan:',
-'prefs-help-signature' => 'Komen pado laman maota paralu ditandotangani jo "<nowiki>~~~~</nowiki>" nan kan diubah manjadi tando tangan Angku jo wakatu saat kini ko.',
+'prefs-help-signature' => 'Komen pado laman rundiang paralu ditandotangani jo "<nowiki>~~~~</nowiki>" nan ka diubah manjadi tando tangan Sanak sarato wakatu kini ko.',
 'badsig' => 'Tando tangan mantah indak sah; pariso tag HTML.',
-'badsiglength' => 'Tando tangan Angku panjang bana.
+'badsiglength' => 'Tando tangan Sanak panjang bana.
 Jan labiah dari $1 {{PLURAL:$1|karakter}}.',
-'yourgender' => 'Jenis kelamin:',
+'yourgender' => 'Jinih kalamin:',
 'gender-unknown' => 'Indak ditanyo',
 'gender-male' => 'Laki-laki',
 'gender-female' => 'Padusi',
-'prefs-help-gender' => 'Lainnyo: digunoan untuak manyabuik gender jo parangkaik lunak. Informasi ko akan tabukak untuak umum.',
+'prefs-help-gender' => 'Piliahan: digunoan untuak manyabuik jinih kalamin dek parangkaik lunak. Informasi ko akan tabukak untuak umum.',
 'email' => 'Surel',
-'prefs-help-realname' => "Namo asli sifaiknyo opsional.
-Jiko' Angku manambahkannyo, namo asli Angku akan digunoan untuak mengenal hasil karaja Angku.",
-'prefs-help-email' => "Alamaik surel ko hanyolah tambahan, tapi paralu untuak ma-''reset'' kato sandi, bilo Sanak lupo kato sandi.",
-'prefs-help-email-others' => 'Sanak dapek mamiliah untuak mangizinkan urang lain manghubungi jo surel malalui laman pangguno atau laman rundiang.
-Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
+'prefs-help-realname' => 'Namo asli sifaiknyo piliahan.
+Kalau Sanak manambahannyo, namo asli Sanak akan digunoan untuak manunjuakan hasil karajo Sanak.',
+'prefs-help-email' => "Alamaik surel ko hanyolah tambahan, tapi paralu untuak ma-''reset'' kato sandi, bilo Sanak lupo jo kato sandi.",
+'prefs-help-email-others' => 'Sanak dapek mamiliah untuak mangizinkan urang lain manghubuangi Sanak jo surel malalui laman pangguno atau laman rundiang.
+Alamaik surel Sanak indakkan tau dek urang nan manghubuangi sanak tu.',
 'prefs-help-email-required' => 'Alamaik surel wajib diisi.',
 'prefs-info' => 'Informasi dasar',
 'prefs-i18n' => 'Internasionalisasi',
 'prefs-signature' => 'Tando tangan',
-'prefs-dateformat' => 'Format tangga',
+'prefs-dateformat' => 'Format tanggal',
 'prefs-timeoffset' => 'Format wakatu',
-'prefs-advancedediting' => 'Opsi lanjuik',
-'prefs-advancedrc' => 'Opsi lanjuik',
-'prefs-advancedrendering' => 'Opsi lanjuik',
-'prefs-advancedsearchoptions' => 'Opsi lanjuik',
-'prefs-advancedwatchlist' => 'Opsi lanjuik',
-'prefs-displayrc' => 'Pilihan tampilan',
-'prefs-displaysearchoptions' => 'Pilihan tampilan',
-'prefs-displaywatchlist' => 'Pilihan tampilan',
+'prefs-advancedediting' => 'Piliahan lanjuik',
+'prefs-advancedrc' => 'Piliahan lanjuik',
+'prefs-advancedrendering' => 'Piliahan lanjuik',
+'prefs-advancedsearchoptions' => 'Piliahan lanjuik',
+'prefs-advancedwatchlist' => 'Piliahan lanjuik',
+'prefs-displayrc' => 'Piliahan tampilan',
+'prefs-displaysearchoptions' => 'Piliahan tampilan',
+'prefs-displaywatchlist' => 'Piliahan tampilan',
 'prefs-diffs' => 'Pabedoan',
 
 # User preference: email validation using jQuery
@@ -1142,9 +1267,9 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
 'userrights-groupsmember' => 'Anggota dari:',
 'userrights-groupsmember-auto' => 'Anggota implisit dari:',
 'userrights-groups-help' => 'Sanak dapek mangubah kalompok pangguno ko:
-* Kotak jo tando cek marupoan kalompok pangguno tasabuik
-* Kotak tanpa tando cek bararti pangguno ko bukan anggota kalompok tasabuik
-* Tando * manandoi Sanak indak dapek mambatalan kalompok tasabuik bilo Sanak alah manambahannyo, atau sabaliaknyo.',
+* Kotak jo tando centang marupoan kalompok pangguno tasabuik
+* Kotak indak ado tando centang bararti pangguno ko bukan anggota kalompok tasabuik
+* Tando * manandoan Sanak indak dapek mambatalan kalompok tasabuik bilo Sanak alah manambahannyo, ataupun sabaliaknyo.',
 'userrights-reason' => 'Alasan:',
 'userrights-no-interwiki' => 'Sanak indak bahak untuak mangubah hak pangguno di wiki lain.',
 'userrights-nodatabase' => 'Basis data $1 indak ado atau bukan disiko.',
@@ -1185,13 +1310,29 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
 'right-createaccount' => 'Mambuek akun baru',
 'right-minoredit' => 'Manandoi suntiangan ketek',
 'right-move' => 'Mamindahan laman',
-'right-move-subpages' => 'Mamindahan laman jo kasado sub laman',
+'right-move-subpages' => 'Mamindahan laman jo kasado sublaman',
 'right-move-rootuserpages' => 'Mamindahan laman pangguno',
 'right-movefile' => 'Mamindahan berkas',
 'right-suppressredirect' => 'Indak mambuek pangaliahan wakatu mamindahan laman',
 'right-upload' => 'Mamuek berkas',
 'right-reupload' => 'Manimpo berkas lamo',
 'right-reupload-own' => 'Manimpo berkas nan dimuek surang',
+'right-purge' => 'Mangapuih singgahan laman tanpa laman konfirmasi',
+'right-autoconfirmed' => 'Manyuntiang laman palinduangan semi',
+'right-bot' => 'Dipalakuan sabagai proses otomatis',
+'right-nominornewtalk' => 'Indak ado tando suntiangan ketek di laman rundiang mamicu pasan baru',
+'right-apihighlimits' => 'Manggunoan bateh labiah tinggi dalam kueri API',
+'right-writeapi' => 'Manggunoan panulisan API',
+'right-delete' => 'Mangapuih laman',
+'right-suppressionlog' => 'Mancaliak log privat',
+'right-unblockself' => 'Malapehan sakek diri surang',
+'right-editinterface' => 'Manyuntiang antarmuko pangguno',
+'right-editusercss' => 'Manyuntiang berkas CSS pangguno lain',
+'right-edituserjs' => 'Manyuntiang berkas JS pangguno lain',
+'right-noratelimit' => 'Indak dipangaruahi jo pambatehan jumlah suntiangan',
+'right-import' => 'Mangimpor laman dari wiki lain',
+'right-importupload' => 'Mangimpor laman dari berkas nan dimuek',
+'right-autopatrol' => 'Suntiangan surang sacaro otomatis ditandoi tapantau',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Log pangguno baru',
@@ -1199,6 +1340,7 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
 
 # User rights log
 'rightslog' => 'Log parubahan hak akses',
+'rightslogtext' => 'Di bawah ko daftar log parubahan pado hak-hak pangguno.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'baco laman ko',
@@ -1207,27 +1349,35 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
 'action-createtalk' => 'buek laman diskusi',
 'action-createaccount' => 'buek akun pangguno ko',
 'action-minoredit' => 'tandoi sabagai suntiangan ketek',
+'action-move' => 'pindahan laman ko',
+'action-move-subpages' => 'pindahkan laman ko, jo sublamannyo',
+'action-move-rootuserpages' => 'pindahan laman pangguno',
+'action-movefile' => 'pindahkan berkas ko',
+'action-upload' => 'muek berkas ko',
+'action-reupload' => 'timpo berkas lamo',
+'action-writeapi' => 'manggunoan panulisan API',
+'action-import' => 'impor laman ko dari wiki lain',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|parubahan}}',
 'recentchanges' => 'Parubahan baru',
 'recentchanges-legend' => 'Piliahan parubahan baru',
 'recentchanges-summary' => 'Caliak parubahan tabaru pado wiki di laman ko.',
-'recentchanges-feed-description' => 'Temukan parubahan baru dalam umpan wiki ko',
+'recentchanges-feed-description' => 'Tamuan parubahan baru dalam umpan wiki ko',
 'recentchanges-label-newpage' => 'Suntiangan ko mambuek laman baru',
 'recentchanges-label-minor' => 'Iko suntiangan ketek',
 'recentchanges-label-bot' => 'Suntiang ko dibuek dek bot',
 'recentchanges-label-unpatrolled' => 'Suntiangan ko alun dipatroli',
 'rcnote' => "Berikuik ko {{PLURAL:$1|'''$1'''}} parubahan dalam {{PLURAL:$2|'''$2''' hari}} tarakhia, sampai $4, pukul $5.",
 'rcnotefrom' => "Di bawah ko ado parubahan mulai dari '''$2''' (sampai '''$1''' parubahan).",
-'rclistfrom' => 'Tampilkan parubahan baru mulai dari $1',
-'rcshowhideminor' => '$1 suntingan ketek',
+'rclistfrom' => 'Tunjuakan parubahan baru mulai dari tanggal $1',
+'rcshowhideminor' => '$1 suntiangan ketek',
 'rcshowhidebots' => '$1 bot',
 'rcshowhideliu' => '$1 pangguno masuak log',
 'rcshowhideanons' => '$1 pangguno anon',
-'rcshowhidepatr' => '$1 suntiangan nan tajago',
-'rcshowhidemine' => '$1 suntingan denai',
-'rclinks' => 'Tunjuakkan $1 parubahan tabaru dalam $2 hari tarakhia<br />$3',
+'rcshowhidepatr' => '$1 suntiangan tapatroli',
+'rcshowhidemine' => '$1 suntiangan denai',
+'rclinks' => 'Tunjuakan $1 parubahan tabaru dalam $2 hari tarakhia<br />$3',
 'diff' => 'bedo',
 'hist' => 'sijarah',
 'hide' => 'Suruakan',
@@ -1243,8 +1393,8 @@ Alamaik surel Sanak indakkan tau dek urang nan manghubungi sanak tu.',
 'recentchangeslinked-toolbox' => 'Parubahan takaik',
 'recentchangeslinked-title' => 'Parubahan nan takaik jo "$1"',
 'recentchangeslinked-noresult' => 'Indak ado parubahan pado laman nan tapauik salamo periode nan ditantuan',
-'recentchangeslinked-summary' => "Iko dafta parubahan tarakhir pado laman nan tahubuang dari laman tatantu (atau anggota dari kategori tatantu).
-Laman pado [[Special:Watchlist|dafta pantau Sanak]] ditandoi jo '''cetak taba'''.",
+'recentchangeslinked-summary' => "Iko daftar parubahan tarakhia pado laman nan tahubuang dari laman tatantu (atau anggota dari kategori tatantu).
+Laman pado [[Special:Watchlist|daftar pantauan Sanak]] ditandoi jo '''cetak taba'''.",
 'recentchangeslinked-page' => 'Namo laman:',
 'recentchangeslinked-to' => 'Tampilkan parubahan dari laman nan takaik jo laman nan ko',
 
@@ -1252,20 +1402,29 @@ Laman pado [[Special:Watchlist|dafta pantau Sanak]] ditandoi jo '''cetak taba'''
 'upload' => 'Muek berkas',
 'uploadbtn' => 'Mamuek berkas',
 'reuploaddesc' => 'Batal dan baliak ka formulir pamuatan',
-'uploadtext' => "Gunoan formulir di bawah untuak mangunggah berkas.
-Untuak manampilan atau mancari berkas nan sabalumnyo dimuek, gunoan [[Special:FileList|dafta berkas]]. Pangunggahan (ulang) tacatat dalam [[Special:Log/upload|log pangunggahan]], samantaro panghapuihan tacatat dalam [[Special:Log/delete|log panghapuihan]].
-
-Untuak manampilkan atau manyaratoan berkas pado suatu laman, gunoan salah satu format di bawah ko:
+'upload-tryagain' => 'Kirim parubahan katarangan berkas',
+'uploadnologin' => 'Alun masuak log',
+'uploadnologintext' => 'Sanak musti [[Special:UserLogin|masuak log]] untuak dapek mamuek berkas.',
+'upload_directory_missing' => 'Direktori pamuatan ($1) indak basobok dan indak dapek dibuek dek server web.',
+'upload_directory_read_only' => 'Direktori pamuatan ($1) indak dapek ditulih jo server web.',
+'uploaderror' => 'Kasalahan pamuatan',
+'upload-recreate-warning' => "'''Paringatan: Berkas jo namo tu alah dihapuih atau dipindahan.'''
+
+Log pangapuihan dan pamindahan laman ko adolah sabagai barikuik:",
+'uploadtext' => "Gunoan formulir di bawah ko untuak mangunggah berkas.
+Untuak manampilan atau mancari berkas nan sabalumnyo dimuek, gunoan [[Special:FileList|daftar berkas]]. Pangunggahan (ulang) tacatat dalam [[Special:Log/upload|log pangunggahan]], samantaro pangapuihan tacatat dalam [[Special:Log/delete|log pangapuihan]].
+
+Untuak manampilkan berkas pado suatu laman, gunoan salah satu format di bawah ko:
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code>''' untuak manampilan berkas dalam ukuran aslinyo
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|teks alternatif]]</nowiki></code>''' untuak manampilan berkas jo leba 200px dalam sabuah kotak di kiri laman jo 'teks alternatif' sabagai katarangan gambar
-* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' sabagai pautan langsuang ka berkas nan dimaksud tanpa manampilan berkas tarsabuik di laman wiki",
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' sabagai pautan langsuang ka berkas media nan dimakasuik tanpa manampilan berkas tarsabuik di laman wiki",
 'upload-permitted' => 'Jenis berkas nan dipabuliahan: $1.',
 'upload-preferred' => 'Jenis berkas nan disaranan: $1.',
 'upload-prohibited' => 'Jenis berkas nan dilarang: $1.',
 'uploadlog' => 'log pangunggahan',
 'uploadlogpage' => 'Log pangunggahan',
-'uploadlogpagetext' => 'Barikuik adolah dafta unggahan berkas tabaru. 
-Lihek [[Special:NewFiles|galeri berkas baru]] untuak tampilan visual.',
+'uploadlogpagetext' => 'Barikuik ko adolah daftar pangunggahan berkas tabaru. 
+Caliak [[Special:NewFiles|galeri berkas baru]] untuak tampilan visual.',
 'filename' => 'Namo berkas',
 'filedesc' => 'Ikhtisar',
 'fileuploadsummary' => 'Ikhtisar:',
@@ -1288,7 +1447,7 @@ Koq berkas tu samemang marupoan gambar dalam ukuran aslinyo, Sanak indak paralu
 'file-thumbnail-no' => "Namo berkas dimulai jo <strong>$1</strong>.
 Nampaknyo berkas ko marupoan gambar jo ukuran dipaketek ''(miniatua)''.
 Koq Sanak ado versi resolusi panuah dari gambar ko, cubolah muekan berkas tasabuik. Koq indak, harap ubah namo berkas ko.",
-'uploadedimage' => 'muek "[[$1]]"',
+'uploadedimage' => 'mamuek "[[$1]]"',
 'upload-source' => 'Berkas sumber',
 'sourcefilename' => 'Namo berkas sumber:',
 'sourceurl' => 'URL sumber:',
@@ -1300,9 +1459,9 @@ Koq Sanak ado versi resolusi panuah dari gambar ko, cubolah muekan berkas tasabu
 
 'license' => 'Lisensi:',
 'license-header' => 'Lisensi',
-'nolicense' => 'Indak ad nan dipiliah',
+'nolicense' => 'Indak ado nan dipiliah',
 'license-nopreview' => '(Pratonton indak tasadio)',
-'upload_source_url' => ' (suatu URL valid nan dapek diakses publik)',
+'upload_source_url' => ' (suatu URL sah nan dapek diakses publik)',
 'upload_source_file' => ' (berkas nan di komputer Sanak)',
 
 # Special:ListFiles
@@ -1310,43 +1469,53 @@ Koq Sanak ado versi resolusi panuah dari gambar ko, cubolah muekan berkas tasabu
 Katiko disariang dek pangguno, hanyo versi berkas tabaru dari berkas nan diunggah nan tampil.',
 'listfiles_search_for' => 'Cari namo berkas:',
 'imgfile' => 'berkas',
-'listfiles' => 'Dafta berkas',
-'listfiles_thumb' => 'Miniatur',
+'listfiles' => 'Daftar berkas',
+'listfiles_thumb' => 'Miniatua',
 'listfiles_date' => 'Tanggal',
-'listfiles_name' => 'Namo',
+'listfiles_name' => 'Namo berkas',
 'listfiles_user' => 'Pangguno',
-'listfiles_size' => 'Ukuran',
+'listfiles_size' => 'Ukuaran',
 'listfiles_description' => 'Katarangan',
 'listfiles_count' => 'Versi',
 
 # File description page
 'file-anchor-link' => 'Berkas',
 'filehist' => 'Riwayaik berkas',
-'filehist-help' => 'Klik pado tanggal/waktu untuak malihek berkas pado maso tu',
+'filehist-help' => 'Klik pado tanggal/wakatu untuak mancaliak berkas pado maso tu',
 'filehist-deleteall' => 'hapuih sadonyo',
 'filehist-deleteone' => 'hapuih',
 'filehist-revert' => 'baliakan',
 'filehist-current' => 'kini ko',
 'filehist-datetime' => 'Tanggal/Wakatu',
-'filehist-thumb' => 'Miniatur',
-'filehist-thumbtext' => 'Miniatur untuak versi per $1',
-'filehist-nothumb' => 'Miniatur indak ado',
+'filehist-thumb' => 'Miniatua',
+'filehist-thumbtext' => 'Miniatua untuak versi per $1',
+'filehist-nothumb' => 'Miniatua indak ado',
 'filehist-user' => 'Pangguno',
 'filehist-dimensions' => 'Dimensi',
-'filehist-filesize' => 'Ukuran berkas',
+'filehist-filesize' => 'Ukuaran berkas',
 'filehist-comment' => 'Komen',
 'filehist-missing' => 'Berkas indak ado',
 'imagelinks' => 'Panggunoan berkas',
-'linkstoimage' => 'Barikuik ko {{PLURAL:$1|$1 laman nan takaik}} jo berkas:',
-'nolinkstoimage' => 'Indak ado laman nan batauik ka berkas ko.',
-'morelinkstoimage' => 'Lihek [[Special:WhatLinksHere/$1|pautan baliak]] ka berkas ko.',
+'linkstoimage' => 'Barikuik ko {{PLURAL:$1|$1 laman nan bapauik}} ka berkas:',
+'linkstoimage-more' => 'Labiah dari $1 {{PLURAL:$1|laman}} ado pautan ka berkas ko.
+Daftar barikuik manunjuakan {{PLURAL:$1|$1 laman jo pautan langsuang}} ka berkas ko.
+Ado juo tasadio [[Special:WhatLinksHere/$2|daftar langkoknyo]].',
+'nolinkstoimage' => 'Indak ado laman nan bapauik ka berkas ko.',
+'morelinkstoimage' => 'Caliak [[Special:WhatLinksHere/$1|pautan baliak]] ka berkas ko.',
 'linkstoimage-redirect' => '$1 (pangaliahan berkas) $2',
-'sharedupload' => 'Berkas ko barasal dari $1 dan mungkin digunoan oleh berbagai proyek lain.',
+'duplicatesoffile' => 'Sabanyak {{PLURAL:$1|$1 berkas barikuik}} marupoan duplikat dari berkas ko ([[Special:FileDuplicateSearch/$2|rincian labiah lanjuik]]):',
+'sharedupload' => 'Berkas ko barasal dari $1 dan mungkin digunoan dek babarapo proyek lain.',
+'sharedupload-desc-there' => 'Berkas ko barasal dari $1 dan mungkin digunoan dek babarapo proyek lain.
+Silakan caliak [$2 laman katarangan berkas] untuak informasi labiah lanjuik.',
 'sharedupload-desc-here' => 'Berkas ko dari $1, mungkin juo digunoan untuak proyek-proyek lain.
 Informasi dari [$2 laman katarangannyo] ado di bawah.',
+'sharedupload-desc-edit' => 'Berkas ko barasal dari $1 dan mungkin digunoan dek proyek lain.
+Mungkin Sanak nio manyuntiang katarangan pado [$2 laman katarangan berkas] di sinan.',
+'sharedupload-desc-create' => 'Berkas ko barasal dari $1 dan mungkin digunoan dek proyek lain.
+Mungkin Sanak nio manyuntiang katarangan pado [$2 laman katarangan berkas] di sinan.',
 'filepage-nofile' => 'Indak ado berkas banomo iko.',
 'filepage-nofile-link' => 'Indak ado berkas banamo iko, tapi sanak dapek [$1 mamueknyo].',
-'uploadnewversion-linktext' => 'Unggah versi baru dari berkas ko',
+'uploadnewversion-linktext' => 'Muek versi baru dari berkas ko',
 'shared-repo-from' => 'dari $1',
 'shared-repo' => 'repositori basamo',
 'upload-disallowed-here' => 'Sanak indak dapaek manimpo berkas ko.',
@@ -1365,9 +1534,27 @@ Informasi dari [$2 laman katarangannyo] ado di bawah.',
 'filedelete' => 'Hapuih $1',
 'filedelete-legend' => 'Hapuih berkas',
 
+# MIME search
+'mimesearch' => 'Pancarian MIME',
+
+# Unwatched pages
+'unwatchedpages' => 'Laman nan indak tapantau',
+
+# List redirects
+'listredirects' => 'Daftar pangaliahan',
+
+# Unused templates
+'unusedtemplates' => 'Templat nan indak tapakai',
+'unusedtemplatestext' => 'Daftar barikuik adolah kasado laman pado ruangnamo {{ns:template}} nan indak dipakai di laman manopun.
+Pariso dulu "pautan baliak" ka templat tasabuik sabalun manghapuihnyo.',
+'unusedtemplateswlh' => 'pautan baliak',
+
 # Random page
 'randompage' => 'Laman sumbarang',
 
+# Random redirect
+'randomredirect' => 'Pangaliahan sumbarang',
+
 # Statistics
 'statistics' => 'Statistik',
 'statistics-header-pages' => 'Statistik laman',
@@ -1384,18 +1571,37 @@ Informasi dari [$2 laman katarangannyo] ado di bawah.',
 'statistics-views-total' => 'Jumlah tampilan laman',
 'statistics-views-total-desc' => 'Tampilan ka laman nan indak ado jo laman khusus nan indak ikuik',
 'statistics-views-peredit' => 'Tampilan per-suntiangan',
-'statistics-users' => 'Jumlah [[Special:ListUsers|pangguno tadafta]]',
+'statistics-users' => 'Jumlah [[Special:ListUsers|pangguno tadaftar]]',
 'statistics-users-active' => 'Pangguno aktip',
 'statistics-users-active-desc' => 'Pangguno nan aktip dalam {{PLURAL:$1|$1 ari}} tarakhia.',
 'statistics-mostpopular' => 'Laman nan paliang banyak ditampilkan',
 
 'disambiguations' => 'Laman nan tahubuang ka laman disambiguasi',
-'disambiguationspage' => 'Template:sanamo',
-
-'doubleredirects' => 'Pangaliahan ganda',
-
+'disambiguationspage' => 'Template:Disambig',
+'disambiguations-text' => "Laman-laman barikuik punyo pautan ka '''laman disambiguasi'''.
+Laman tasabuik saharuihnyo bapauik ka topik-topik nan sasuai.<br />
+Laman nan dianggap sabagai laman disambiguasi jikok laman tasabuik manggunoan templat nan tahubuang ka [[MediaWiki:Disambiguationspage]].",
+
+'pageswithprop' => 'Laman jo laman properti',
+'pageswithprop-legend' => 'Laman jo laman properti',
+'pageswithprop-text' => 'Laman ko barisi daftar laman nan manggunoan properti laman tatantu.',
+'pageswithprop-prop' => 'Namo properti:',
+'pageswithprop-submit' => 'Lanjuik',
+
+'doubleredirects' => 'Pangaliahan gando',
+'doubleredirectstext' => 'Laman ko mamuek daftar laman nan dialiahkan ka laman pangaliahan nan lain.
+Satiok barih mamuek pautan ka pangaliahan partamo dan pangaliahan kadua sarato target dari pangaliahan kadua nan umumnyo adolah laman nan "sabananyo". Laman pangaliahan partamo saharuihnyo dialiahkan ka laman nan bukan marupoan laman pangaliahan.
+Judul laman nan <del>dicoret</del> bararti alah dipelokan.',
+
+'brokenredirects' => 'Pangaliahan rusak',
+'brokenredirectstext' => 'Pangaliahan-pangaliahan barikuik marujuak pado laman nan indak ado.',
+
+'withoutinterwiki' => 'Laman indak ado interwiki',
+'withoutinterwiki-summary' => 'Laman-laman barikuik indak ado interwiki ka versi bahaso lain.',
 'withoutinterwiki-submit' => 'Tunjuakan',
 
+'fewestrevisions' => 'Laman jo parubahan sangenek',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bita}}',
 'ncategories' => '$1 {{PLURAL:$1|kategori}}',
@@ -1406,25 +1612,51 @@ Informasi dari [$2 laman katarangannyo] ado di bawah.',
 '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.',
 'lonelypages' => 'Laman yatim',
+'lonelypagestext' => 'Laman-laman barikuik indak ado pautan dari atau ditransklusikan ka laman manopun di {{SITENAME}}.',
+'uncategorizedpages' => 'Laman nan indak takategori',
+'uncategorizedcategories' => 'Kategori nan indak takategori',
+'uncategorizedimages' => 'Berkas nan indak takategori',
+'uncategorizedtemplates' => 'Templat nan indak takategori',
+'unusedcategories' => 'Kategori nan indak tapakai',
+'unusedimages' => 'Berkas nan indak digunoan',
+'wantedcategories' => 'Kategori nan diinginan',
+'wantedpages' => 'Laman nan diinginan',
+'wantedfiles' => 'Berkas nan diinginan',
+'wantedfiletext-cat' => 'Berkas-berkas barikuik digunoan tapi indak ado. Berkas dari repositori asiang mungkin tacantum walaupun ado. Satiok "false positive" akan <del>dicoret</del>. Salain itu, laman nan manggunoan berkas nan indak ado akan dicantuman dalam [[:$1]].',
+'wantedfiletext-nocat' => 'Berkas-berkas barikuik digunoan tapi indak ado. Berkas dari repositori asiang mungkin tacantum walaupun ado. Satiok "false positive" akan <del>dicoret</del>.',
+'wantedtemplates' => 'Templat nan diinginan',
+'mostlinked' => 'Laman nan acok dituju',
+'mostlinkedcategories' => 'Kategori nan acok digunoan',
+'mostlinkedtemplates' => 'Templat nan acok dituju',
+'mostcategories' => 'Laman jo kategori tabanyak',
+'mostimages' => 'Berkas nan paliang acok digunoan',
+'mostinterwikis' => 'Laman jo interwiki paliang banyak',
 'prefixindex' => 'Sado laman jo awalan',
 'prefixindex-namespace' => 'Sado laman jo awalan (ruang namo $1)',
 'shortpages' => 'Laman pendek',
 'longpages' => 'Laman panjang',
 'deadendpages' => 'Laman buntu',
-'deadendpagestext' => 'Laman-laman ko indak ad pautan ka laman lain di {{SITENAME}}.',
+'deadendpagestext' => 'Laman-laman ko indak ado pautan ka laman lain di {{SITENAME}}.',
 'protectedpages' => 'Laman nan dilinduangi',
 'protectedpages-indef' => 'Untuak palinduangan salamonyo',
 'protectedpages-cascade' => 'Untuak palinduangan batingkek',
-'usereditcount' => '$1 {{PLURAL:$1|suntiangan}}',
+'protectedtitles' => 'Judul nan dilinduangi',
+'protectedtitlesempty' => 'Indak ado judul nan dilinduangi jo parameter ko.',
+'listusers' => 'Daftar pangguno',
+'listusers-editsonly' => 'Tunjuakan hanyo pangguno nan ado jariah',
+'listusers-creationsort' => 'Uruikan manuruik tanggal pandaftaran',
+'usereditcount' => '$1 {{PLURAL:$1|}} suntiangan',
 'usercreated' => '{{GENDER:$3|Dibuek}} pado $1 pukua $2',
 'newpages' => 'Laman baru',
 'newpages-username' => 'Namo pangguno:',
 'ancientpages' => 'Laman paliang lamo',
 'move' => 'Pindah',
-'movethispage' => 'Pindahan laman ko',
-'unusedimagestext' => 'Berkas barikuik ado tapi indak takaik jo laman mana pun.
-Harap paratikan bahwa situs web lain mungkin ado tautan ka suatu berkas jo URL langsung, dan  masih tadafta di siko walaupun  indak digunoan aktif.',
+'movethispage' => 'Pindahkan laman ko',
+'unusedimagestext' => 'Berkas barikuik ko ado tapi indak takaik ka laman manopun.
+Harok paratian jikok laman web lain mungkin ado pautan ka suatu berkas jo URL langsuang, dan  masih tadaftar di siko walaupun indak aktif digunoan.',
+'unusedcategoriestext' => 'Kategori barikuik ado, tapi indak ado laman atau kategori lain nan manggunoannyo.',
 'pager-newer-n' => '{{PLURAL:$1|$1 labiah baru}}',
 'pager-older-n' => '{{PLURAL:$1|$1 labiah lamo}}',
 
@@ -1438,8 +1670,8 @@ Harap paratikan bahwa situs web lain mungkin ado tautan ka suatu berkas jo URL l
 'speciallogtitlelabel' => 'Target (judul atau pangguno):',
 'log' => 'Log',
 'all-logs-page' => 'Sado log publik',
-'alllogstext' => 'Gabungan kasado log nan ado di {{SITENAME}}.
-Sanak dapek mamiliah jenis log nan ado, namo pangguno (bedoan huruf ketek/gadang), atau judul laman (bedoan huruf ketek/gadang).',
+'alllogstext' => 'Gabuangan kasado log nan ado di {{SITENAME}}.
+Sanak dapek mamiliah jinih log nan ado, namo pangguno (bedoan hurup ketek/gadang), atau judul laman (bedoan hurup ketek/gadang).',
 'logempty' => 'Indak basobok entri log nan sasuai.',
 'log-title-wildcard' => 'Cari judul nan diawali jo teks ko',
 'showhideselectedlogentries' => 'Tunjuakan/Suruakan entri log tapiliah',
@@ -1468,7 +1700,7 @@ Sanak dapek mamiliah jenis log nan ado, namo pangguno (bedoan huruf ketek/gadang
 'categories' => 'Kategori',
 'categoriespagetext' => '{{PLURAL:$1|Isi kategori}} ko ado laman atau media.
 [[Special:UnusedCategories|Kategori nan indak tapakai]] indak nampak di siko.
-Lihek pulo [[Special:WantedCategories|kategori nan diinginkan]].',
+Lihek pulo [[Special:WantedCategories|kategori nan diinginan]].',
 'categoriesfrom' => 'Tunjuakan kategori mulai jo:',
 'special-categories-sort-count' => 'uruikan manuruik jumlah',
 'special-categories-sort-abc' => 'uruikan manuruik abjad',
@@ -1492,18 +1724,27 @@ Lihek pulo [[Special:WantedCategories|kategori nan diinginkan]].',
 'listusers-blocked' => '(tasakek)',
 
 # Special:ActiveUsers
-'activeusers' => 'Dafta pangguno aktif',
+'activeusers' => 'Daftar pangguno aktif',
 'activeusers-from' => 'Tunjuakan pangguno mulai dari:',
 'activeusers-hidebots' => 'Suruakan bot',
 'activeusers-hidesysops' => 'Suruakan panguruih',
 'activeusers-noresult' => 'Pangguno indak basobok',
 
 # Special:ListGroupRights
-'listgrouprights' => 'Dafta kalompok pangguno',
+'listgrouprights' => 'Daftar kalompok pangguno',
+'listgrouprights-summary' => 'Barikuik ko adolah daftar kalompok pangguno nan ado di wiki ko, jo daftar hak aksesnyo masiang-masiang. Informasi labih lanjuik masalah hak masiang-masiang dapek dijumpoi di [[{{MediaWiki:Listgrouprights-helppage}}|laman bantuan hak pangguno]].',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">Hak nan balaku</span>
+* <span class="listgrouprights-revoked">Hak nan dicabuik</span>',
 'listgrouprights-group' => 'Kalompok',
 'listgrouprights-rights' => 'Hak',
 'listgrouprights-helppage' => 'Help:Hak akses',
-'listgrouprights-members' => '(dafta anggota)',
+'listgrouprights-members' => '(daftar anggota)',
+'listgrouprights-addgroup' => 'Manambahan {{PLURAL:$2|kalompok}}: $1',
+'listgrouprights-removegroup' => 'Mangapuih {{PLURAL:$2|kalompok}}: $1',
+'listgrouprights-addgroup-all' => 'Manambahan sado kalompok',
+'listgrouprights-removegroup-all' => 'Mangapuih kasado kalompok',
+'listgrouprights-removegroup-self' => 'Mengapuih {{PLURAL:$2|kalompok}} dari akun surang: $1',
+'listgrouprights-removegroup-self-all' => 'Mangapuih kasado kalompok dari akun surang',
 
 # Email user
 'emailuser' => 'Surel pangguno',
@@ -1530,30 +1771,43 @@ Alamaik surel nan Sanak masuakkan di [[Special:Preferences|pangaturan akun]] aka
 'watchlistfor2' => 'Untuak $1 $2',
 'addedwatchtext' => 'Laman "[[:$1]]" lah ditambahan ka [[Special:Watchlist|Pantauan]] Sanak.
 Parubahan laman ko tamasuak laman rundiangnyo akan ditampilan disinan.',
-'removewatch' => 'Hapuih dari dafta pantau',
-'removedwatchtext' => 'Laman "[[:$1]]" lah dihapuih dari [[Special:Watchlist|dafta pantau Sanak]].',
+'removewatch' => 'Hapuih dari daftar pantau',
+'removedwatchtext' => 'Laman "[[:$1]]" lah dihapuih dari [[Special:Watchlist|daftar pantau Sanak]].',
 'watch' => 'Pantau',
 'watchthispage' => 'Pantau laman ko',
 'unwatch' => 'Batal pantau',
 'unwatchthispage' => 'Batal pantau laman ko',
-'watchlist-details' => '{{PLURAL:$1|$1 laman}} dalam dafta pantau awak, indak tamasuak laman rundiangnyo.',
-'wlshowlast' => 'Tampilkan $1 jam $2 hari tarakhia $3',
-'watchlist-options' => 'Piliahan dafta pantau',
+'watchlist-details' => '{{PLURAL:$1|$1 laman}} dalam daftar pantau Sanak, indak tamasuak laman rundiangnyo.',
+'wlheader-showupdated' => "Laman nan alah barubah sajak kunjuangan tarakhia Sanak ditunjuakan jo '''hurup taba'''",
+'wlnote' => "Di bawah ko ado $1 {{PLURAL:$1|parubahan}} dalam {{PLURAL:$2|'''$2''' jam}} iko, sampai tanggal $3, pukua $4.",
+'wlshowlast' => 'Tunjuakan $1 jam parubahan dalam $2 hari tarakhia $3',
+'watchlist-options' => 'Piliahan daftar pantau',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Mamantau...',
 'unwatching' => 'indak dipantau le...',
 
+'enotif_reset' => 'Tandoi sado laman alah dibaco',
+'enotif_body_intro_restored' => 'Laman $1 pado {{SITENAME}} alah dikambalian tanggal $PAGEEDITDATE dek {{gender:$2|$2}}, caliak $3 untuak revisi tabaru.',
+
 # Delete
 'deletepage' => 'Hapuih laman',
 'confirm' => 'Konfirmasi',
+'excontent' => 'isi sabalunnyo: "$1"',
+'excontentauthor' => 'isinyo: "$1" (dan dibuek dek "[[Special:Contributions/$2|$2]]")',
+'exbeforeblank' => 'isi sabalun dikosongan: "$1"',
+'exblank' => 'laman kosong',
+'delete-confirm' => 'Hapuih "$1"',
+'delete-legend' => 'Hapuih',
+'historywarning' => "'''Paringatan:''' Laman nan ka dihapuih ado riwayaik jo $1 {{PLURAL:$1|revisi}}:",
 'confirmdeletetext' => 'Awak akan mahapuih laman atau berkas basamo riwayatnyo.
 Pastikan awak mainginkannyo, dan awak lah tahu sagalo akibatnyo dan sasuai jo [[{{MediaWiki:Policy-url}}|kebijakan]] yang balaku.',
 'actioncomplete' => 'Proses salasai',
 'actionfailed' => 'Proses gagal',
 'deletedtext' => '"$1" lah dihapuih.
 Caliak $2 untuak rakam jajak laman nan lah dihapuih.',
-'dellogpage' => 'Log penghapuihan',
+'dellogpage' => 'Log pangapuihan',
+'dellogpagetext' => 'Di bawah ko adolah log pangapuihan laman. Wakatu nan ditunjuakan adolah wakatu server.',
 'deletecomment' => 'Alasan:',
 'deleteotherreason' => 'Alasan lain/tambahan:',
 'deletereasonotherlist' => 'Alasan lain',
@@ -1568,8 +1822,8 @@ Caliak $2 untuak rakam jajak laman nan lah dihapuih.',
 
 # Protect
 'protectlogpage' => 'Log palinduangan',
-'protectlogtext' => 'Di bawah ko dafta parubahan tahadok palinduangan laman.
-Caliak [[Special:ProtectedPages|dafta laman talinduang]] untuak dafta palinduangan laman tabaru.',
+'protectlogtext' => 'Di bawah ko daftar parubahan dari palinduangan laman.
+Caliak [[Special:ProtectedPages|daftar laman talinduangi]] untuak daftar palinduangan laman tabaru.',
 'protectedarticle' => 'malinduangkan "[[$1]]"',
 'modifiedarticleprotection' => 'maubah tingkek palinduangan "[[$1]]"',
 'protectcomment' => 'Alasan:',
@@ -1581,16 +1835,16 @@ Caliak [[Special:ProtectedPages|dafta laman talinduang]] untuak dafta palinduang
 Barikuik ko pangaturan nan balaku untuak laman '''$1''':",
 'protect-cascadeon' => 'Laman ko sedang dilindungi karano tamasuak dalam {{PLURAL:$1|laman|laman}} aktif perlindungan batingkek.
 Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlindungan batingkeknyo.',
-'protect-default' => 'Semua pangguno diizinkan',
-'protect-fallback' => 'Cumo untuak pangguno jo izin  "$1"',
-'protect-level-autoconfirmed' => 'Cumo untuak pangguno takonfirmasi otomatis',
-'protect-level-sysop' => 'Cumo untuak panguruih',
+'protect-default' => 'Kasado pangguno diizinan',
+'protect-fallback' => 'Untuak pangguno jo izin  "$1" sajo',
+'protect-level-autoconfirmed' => 'Untuak pangguno takonfirmasi otomatis sajo',
+'protect-level-sysop' => 'Untuak panguruih sajo',
 'protect-summary-cascade' => 'batingkek',
 'protect-expiring' => 'sampai $1 (UTC)',
 'protect-expiring-local' => 'sampai $1',
 'protect-expiry-indefinite' => 'sataruihnyo',
 'protect-cascade' => 'Linduangi laman nan takaik jo laman ko (palinduangan batingkek)',
-'protect-cantedit' => 'Sanak indak dapek maubah tingkek palinduangan laman ko, karano indak ado izin untuak itu.',
+'protect-cantedit' => 'Sanak indak dapek maubah tingkek palinduangan laman ko, dek indak ado izin untuak itu.',
 'protect-othertime' => 'Wakatu lain:',
 'protect-othertime-op' => 'wakatu lain',
 'protect-existing-expiry' => 'Alah sampai: $3, $2',
@@ -1609,9 +1863,9 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 ** Baulang kali dikosongan
 ** Pamintaan pangguno',
 'protect-edit-reasonlist' => 'Suntiang alasan palinduangan',
-'protect-expiry-options' => '1 jam:1 hour,1 ari:1 day,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taun:1 year,salamonyo:infinite',
+'protect-expiry-options' => '1 jam:1 hour,1 ari:1 day,1 pakan:1 week,2 pakan:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taun:1 year,salamonyo:infinite',
 'restriction-type' => 'Palinduangan:',
-'restriction-level' => 'Tingkek larangan:',
+'restriction-level' => 'Tingkek:',
 'minimum-size' => 'Ukuran min',
 'maximum-size' => 'Ukuran max',
 'pagesize' => '(bita)',
@@ -1630,12 +1884,18 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 # Undelete
 'undelete' => 'Caliak laman nan dihapuih',
 'undeletepage' => 'Caliak dan baliakan laman tahapuih',
-'undeletepagetitle' => "'''Iko dafta revisi nan dihapuih dari [[:$1|$1]]'''.",
+'undeletepagetitle' => "'''Iko daftar revisi nan dihapuih dari [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Caliak laman nan dihapuih',
 'undelete-nodiff' => 'Indak ado basobok revisi lamo',
 'undeletebtn' => 'Baliakan',
 'undeletelink' => 'caliak/baliakan',
 'undeleteviewlink' => 'caliak',
+'undeletedrevisions' => '{{PLURAL:$1|$1 revisi}} alah dikambalian',
+'undelete-header' => 'Caliak [[Special:Log/delete|log pangapuihan]] untuak daftar laman nan baru dihapuih.',
+'undelete-search-title' => 'Cari laman nan dihapuih',
+'undelete-search-box' => 'Cari laman nan dihapuih',
+'undelete-search-prefix' => 'Tunjuakan laman mulai dari:',
+'undelete-cleanup-error' => 'Kasalahan sawaktu mangapuih arsip berkas "$1" nan indak digunoan.',
 
 # Namespace form on various pages
 'namespace' => 'Ruangnamo:',
@@ -1652,26 +1912,26 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'month' => 'Dari bulan (dan sabalunnyo):',
 'year' => 'Dari taun (dan sabalunnyo):',
 
-'sp-contributions-newbies' => 'Tampilkan jariah pangguno baru sajo',
+'sp-contributions-newbies' => 'Tunjuakan jariah pangguno baru sajo',
 'sp-contributions-newbies-sub' => 'Untuak pangguno baru',
 'sp-contributions-newbies-title' => 'Jariah pangguno baru',
-'sp-contributions-blocklog' => 'log pamblokiran',
+'sp-contributions-blocklog' => 'log sakek',
 'sp-contributions-deleted' => 'jariah pangguno nan lah dihapuih',
 'sp-contributions-uploads' => 'muek',
 'sp-contributions-logs' => 'log',
 'sp-contributions-talk' => 'maota',
 'sp-contributions-userrights' => 'pangalolaan hak pangguno',
 'sp-contributions-blocked-notice' => 'Pangguno ko sadang kanai sakek. log pamblokiran tarakhia ditunjuakan disiko untuak referensi:',
-'sp-contributions-blocked-notice-anon' => 'Alamaik IP ko tangah diblokir.
-Entri log pamblokiran tabaru ado di bawah ko untuak referensi:',
+'sp-contributions-blocked-notice-anon' => 'Alamaik IP ko tangah kanai sakek.
+Entri log sakek tabaru ado di bawah ko untuak referensi:',
 'sp-contributions-search' => 'Cari jariah',
-'sp-contributions-username' => 'Alamat IP atau namo pangguno:',
+'sp-contributions-username' => 'Alamaik IP atau namo pangguno:',
 'sp-contributions-toponly' => 'Hanyo manampilan suntiangan nan tarakhia',
 'sp-contributions-submit' => 'Cari',
 
 # What links here
 'whatlinkshere' => 'Pautan baliak',
-'whatlinkshere-title' => 'Laman yang bakaik ka "$1"',
+'whatlinkshere-title' => 'Laman nan takaik ka "$1"',
 'whatlinkshere-page' => 'Laman:',
 'linkshere' => "Laman-laman ko bakaik ka '''[[:$1]]''':",
 'nolinkshere' => "Indak ado laman nan punyo tautan ka '''[[:$1]]'''.",
@@ -1689,17 +1949,20 @@ Entri log pamblokiran tabaru ado di bawah ko untuak referensi:',
 'whatlinkshere-filters' => 'Panyariang',
 
 # Block/unblock
-'autoblockid' => 'Sakek otomatis #$1',
+'autoblockid' => 'Sakek otomatih #$1',
 'block' => 'Sakek pangguno',
 'unblock' => 'Lapeh sakek',
 'blockip' => 'Sakek pangguno',
 'blockip-title' => 'Sakek pangguno',
 'blockip-legend' => 'Sakek pangguno',
+'blockiptext' => 'Gunoan formulir di bawah ko untuak manyakek akses dari sabuah alamaik IP atau pangguno.
+Iko hanyo buliah dilakuan untuak mancagah vandal, dan sajalan jo [[{{MediaWiki:Policy-url}}|kabijakan]].
+Masuakan alasan sakek di bawah (contoh, mambuek karusakan atau vandal).',
 'ipadressorusername' => 'Alamaik IP atau namo pangguno:',
 'ipbexpiry' => 'Sampai:',
 'ipbreason' => 'Alasan:',
 'ipbreasonotherlist' => 'Alasan lain',
-'ipbreason-dropdown' => '*Alasan umum
+'ipbreason-dropdown' => '*Alasan umum sakek
 ** Marusak (vandal)
 ** Mangagiah informasi palsu
 ** Mangilangkan isi laman
@@ -1707,17 +1970,18 @@ Entri log pamblokiran tabaru ado di bawah ko untuak referensi:',
 ** Mambuek ota gadang di laman
 ** Babuek intimidasi/palecehan
 ** Manyalahgunoan babarapo akun
-** Namo pangguno talarang',
-'ipb-hardblock' => 'Halang pangguno tadafta untuak manyuntiang dari alamaik IP ko',
+** Namo pangguno talarang
+** Bot alun ado bot flag',
+'ipb-hardblock' => 'Halang pangguno tadaftar untuak manyuntiang dari alamaik IP ko',
 'ipbcreateaccount' => 'Halang mambuek akun',
 'ipbemailban' => 'Halang pangguno mangirim surel',
-'ipbenableautoblock' => 'Otomatis sakek alamaik IP tarakhia nan digunoan pangguno ko, jo sado alamaik IP takaik nan mancubo manyuntiang.',
+'ipbenableautoblock' => 'Otomatih sakek alamaik IP tarakhia nan digunoan pangguno ko, jo sado alamaik IP takaik nan mancubo manyuntiang.',
 'ipbsubmit' => 'Sakek pangguno ko',
 'ipbother' => 'Salamo:',
-'ipboptions' => '2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taun:1 year,salamonyo:infinite',
+'ipboptions' => '2 jam:2 hours,1 ari:1 day,3 ari:3 days,1 pakan:1 week,2 pakan:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taun:1 year,salamonyo:infinite',
 'ipbotheroption' => 'lainnyo',
 'ipbotherreason' => 'Alasan lain/tambahan:',
-'ipbhidename' => 'Suruakan namo pangguno dari dafta jo suntiangan',
+'ipbhidename' => 'Suruakan namo pangguno dari daftar jo suntiangan',
 'ipbwatchuser' => 'Pantau laman pangguno ko jo laman rundiangnyo',
 'ipb-disableusertalk' => 'Halang pangguno ko manyuntiang laman diskusinyo wakatu disakek',
 'ipb-change-block' => 'Sakek baliak pangguno jo setelan ko',
@@ -1725,7 +1989,7 @@ Entri log pamblokiran tabaru ado di bawah ko untuak referensi:',
 'badipaddress' => 'Alamaik IP salah',
 'blockipsuccesssub' => 'Sakek barasil',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] lah disakek.<br />
-Liek [[Special:BlockList|dafta sakek]] buek maninjaunyo.',
+Caliak [[Special:BlockList|daftar sakek]] buek maninjaunyo.',
 'ipb-blockingself' => 'Angku ka manyakek diri surang! Lai yakin apo nan dikarajoan?',
 'ipb-edit-dropdown' => 'Suntiang alasan manyakek',
 'ipb-unblock-addr' => 'Lapeh sakek $1',
@@ -1745,9 +2009,9 @@ Liek [[Special:BlockList|dafta sakek]] buek maninjaunyo.',
 'blocklist-tempblocks' => 'Suruakan sakek samantaro',
 'blocklist-addressblocks' => 'Suruakan ciek IP tasakek',
 'blocklist-rangeblocks' => 'Suruakan wilayah sakek',
-'blocklist-timestamp' => 'tando wakatu',
+'blocklist-timestamp' => 'Tanggal',
 'blocklist-target' => 'Target',
-'blocklist-expiry' => 'Kadaluwarsa',
+'blocklist-expiry' => 'Sampai',
 'blocklist-by' => 'Panguruih nan manyakek',
 'blocklist-params' => 'Parameter sakek',
 'blocklist-reason' => 'Alasan',
@@ -1757,28 +2021,31 @@ Liek [[Special:BlockList|dafta sakek]] buek maninjaunyo.',
 'infiniteblock' => 'salamonyo',
 'expiringblock' => 'habih pado $1 di $2',
 'anononlyblock' => 'hanyo anon.',
-'noautoblockblock' => 'sakek otomatis dimatian',
+'noautoblockblock' => 'sakek otomatih dimatian',
 'createaccountblock' => 'mambuek akun dimatian',
-'emailblock' => 'surel diblokir',
+'emailblock' => 'surel disakek',
 'blocklist-nousertalk' => 'indak dapek manyuntiang laman maota surang',
-'ipblocklist-empty' => 'Dafta sakek ko kosong.',
+'ipblocklist-empty' => 'Daftar sakek ko kosong.',
 'ipblocklist-no-results' => 'Alamaik IP atau pangguno nan dimintak indak disakek.',
 'blocklink' => 'sakek',
 'unblocklink' => 'lapeh sakek',
 'change-blocklink' => 'ubah sakek',
 'contribslink' => 'jariah',
 'emaillink' => 'kirim surel',
-'autoblocker' => 'Sakek otomatis dek alamaik IP lah digunoan jo "[[User:$1|$1]]".
+'autoblocker' => 'Sakek otomatih dek alamaik IP lah digunoan jo "[[User:$1|$1]]".
 Alasan disakek untuak $1 adolah "\'\'$2\'\'"',
 'blocklogpage' => 'Log sakek',
-'blocklogentry' => 'Manyakek [[$1]] dalam maso $2 $3',
+'blocklogentry' => 'manyakek [[$1]] dalam maso $2 $3',
+'blocklogtext' => 'Di bawah ko adolah log sakek jo palapehan sakek pado pangguno.
+Alamaik IP nan disakek sacaro otomatis indak tadapaik dalam daftar ko.
+Caliak [[Special:BlockList|daftar sakek]] untuak kasado pangguno nan kini kanai sakek.',
 'unblocklogentry' => 'lapeh sakek $1',
 'block-log-flags-anononly' => 'hanyo pangguno anonim',
 'block-log-flags-nocreate' => 'mambuek akun dimatian',
-'block-log-flags-noautoblock' => 'sakek otomatis dimatian',
-'block-log-flags-noemail' => 'surel diblokir',
+'block-log-flags-noautoblock' => 'sakek otomatih dimatian',
+'block-log-flags-noemail' => 'surel disakek',
 'block-log-flags-nousertalk' => 'indak dapek manyuntiang laman maota surang',
-'block-log-flags-angry-autoblock' => 'sistim sakek otomatis diaktifkan',
+'block-log-flags-angry-autoblock' => 'sistim sakek otomatih diaktipan',
 'block-log-flags-hiddenname' => 'namo pangguno tasuruak',
 'ipb_already_blocked' => '"$1" alah disakek',
 'ipb-needreblock' => '$1 alah tasakek. Apo nio diubah pangaturannyo?',
@@ -1790,10 +2057,11 @@ Alasan disakek untuak $1 adolah "\'\'$2\'\'"',
 # Developer tools
 'lockdb' => 'Kunci basis data',
 'unlockdb' => 'Bukak kunci basis data',
+'lockedbyandtime' => '(dek {{GENDER:$1|$1}} pado $2 pukua $3)',
 
 # Move page
 'move-page' => 'Pindahan $1',
-'move-page-legend' => 'Pindahan laman',
+'move-page-legend' => 'Pindahkan laman',
 'movepagetext' => "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan sadonyo data riwayaik ka namo baru. 
 Judua lamo tu ka manjadi laman paraliahan manuju judua nan baru. 
 Awak dapek mampabarui paraliahan-paraliahan nan manuju ka judua lamo sacaro otomatis.
@@ -1803,23 +2071,33 @@ Ingeklah bahaso laman ko '''indak''' ka bapindah apobilo lah ado laman nan mangg
 
 '''Paringatan!''' 
 Iko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastikan awak paham akibaik tindakan ko sabalun malanjuikannyo.",
-'movepagetalktext' => "Laman diskusi nan bakaitan akan dipindahkan sacaro otomatis '''kacuali apobilo:'''
+'movepagetext-noredirectfixer' => "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan sado data riwayaiknyo ka namo baru. 
+Judul lamo tu ka manjadi laman paraliahan manuju judul nan baru. 
+Sanak dapek mampabarui paraliahan-paraliahan nan manuju ka judul lamo sacaro otomatih.
+Kok 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.
 
-*Sabuah laman diskusi nan indak kosong lah ado pado judul baru, atau
-*Angku indak mangagiah tando pado kotak di bawah.
+Ingeklah 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.
 
-Dalam kasus tu, kok amuah Angku dapek mamindahkan ataupun manggabuangkan laman sacaro manual.",
+'''Paringatan!''' 
+Iko 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:'''
+
+*Laman rundiang nan indak kosong lah ado pado judul baru, atau
+*Sanak indak mangagiah tando pado kotak di bawah.
+
+Dalam 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.",
 'movenologin' => 'Alun masuak log',
-'movenologintext' => 'Sanak musti pangguno tadafta dan [[Special:UserLogin|masuak lo]] untuak mamindahan laman.',
+'movenologintext' => 'Sanak musti pangguno tadaftar dan [[Special:UserLogin|masuak log]] untuak mamindahan laman.',
 'movenotallowed' => 'Sanak indak ado izin untuak mamindahan laman.',
 'movenotallowedfile' => 'Sanak indak ado izin untuak mamindahan berkas.',
-'cant-move-user-page' => 'Sanak indak ado izin untuak mamindahan laman pangguno (bagian dari sub laman).',
-'cant-move-to-user-page' => 'Sanak indak ado izin untuak mamindahan laman ka laman pangguno (salain ka sub laman pangguno).',
+'cant-move-user-page' => 'Sanak indak ado izin untuak mamindahan laman pangguno (bagian dari sublaman).',
+'cant-move-to-user-page' => 'Sanak indak ado izin untuak mamindahan laman ka laman pangguno (salain ka sublaman pangguno).',
 'newtitle' => 'Ka judul baru:',
 'move-watch' => 'Pantau laman ko',
-'movepagebtn' => 'Pindahan laman',
-'pagemovedsub' => 'Pamindahan berhasil',
+'movepagebtn' => 'Pindahkan laman',
+'pagemovedsub' => 'Pamindahan barasil',
 'movepage-moved' => '\'\'\'"$1" lah dipindahan ka "$2"\'\'\'',
 'movepage-moved-redirect' => 'Pangaliahan lah dibuek.',
 'movepage-moved-noredirect' => 'Pangaliahan indak dibuek.',
@@ -1828,29 +2106,60 @@ Silakan piliah namo lain.',
 'cantmove-titleprotected' => 'Sanak indak dapek mamindahan laman kasiko dek judul barunyo kanai linduang dari dibuek',
 'talkexists' => "'''Laman tasabuik barasil dipindahan, tapi laman rundiangnyo indak dapek dipindahan dek lah ado laman rundiang disinan. Silakan digabuang laman rundiang tu sacaro manual.'''",
 'movedto' => 'pindahan ka',
-'movetalk' => 'Pindahan laman rundiang nan takaik',
-'move-subpages' => 'Pindahan sub laman (sampai $1)',
-'move-talk-subpages' => 'Pindahan sub laman dari laman rundiang (sampai $1)',
+'movetalk' => 'Pindahkan laman rundiang nan takaik',
+'move-subpages' => 'Pindahkan sublaman (sampai $1)',
+'move-talk-subpages' => 'Pindahkan sublaman dari laman rundiang (sampai $1)',
 'movelogpage' => 'Log pamindahan',
+'movelogpagetext' => 'Di bawah ko daftar log pamindahan laman.',
 'movereason' => 'Alasan:',
 'revertmove' => 'baliakkan',
+'immobile-source-namespace' => 'Indak dapek mamindahan laman dalam ruangnamo "$1"',
+'immobile-target-namespace' => 'Indak dapek mamindahan laman ka ruangnamo "$1"',
+'move-leave-redirect' => 'Buek pangaliahan ka judul baru',
 
 # Export
 'export' => 'Ekspor laman',
+'exporttext' => 'Sanak dapek mangekspor teks jo sajarah panyuntiangan suatu laman tatantu atau satu set laman dalam bantuak XML tatantu.
+Hasil ekspor ko salanjuiknyo dapek diimpor ka wiki lainnyo nan manggunoan parangkaik lunak MediaWiki, jo manggunoan fasilitas [[Special:Import|laman impor]].
+
+Untuak mangekspor laman, masuakan judul dalam kotak teks di bawah ko, satu judul pabarih, dan piliah apo Sanak nio mangekspor sacaro langkok jo versi tadaulu, atau hanyo versi tabaru jo catatan panyuntiangan tarakhia.
+
+Jikok Sanak hanyo nio mangimpor versi tabaru, Sanak dapek malakuannyo labiah capek jo manggunoan pautan khusuih, sabagai contoh: [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] untuak mangekspor laman "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Ekspor kasado laman',
+'exportcuronly' => 'Ekspor revisi kini sajo, bukan kasado versi tadaulu',
+'exportnohistory' => "----
+'''Catatan:''' Mangekspor kasado riwayaik suntiangan laman jo isian ko alah dinon-aktipan dek alasan kinerja.",
+'exportlistauthors' => 'Tamasuak daftar langkok kontributor satiok laman',
+'export-submit' => 'Ekspor',
+'export-addcattext' => 'Tambah laman dari kategori:',
+'export-addcat' => 'Tambah',
+'export-addnstext' => 'Tambah laman dari ruangnamo:',
+'export-addns' => 'Tambah',
+'export-download' => 'Simpan sabagai berkas',
+'export-templates' => 'Tamasuak templat',
+'export-pagelinks' => 'Saratoan laman takaik sampai kadalaman:',
 
 # Namespace 8 related
+'allmessages' => 'Pasan sistem',
 'allmessagesname' => 'Namo',
-'allmessagesdefault' => 'Teks pasan default',
+'allmessagesdefault' => 'Teks pasan baku',
+'allmessagescurrent' => 'Teks pasan kini',
+'allmessages-language' => 'Bahaso:',
+'allmessages-filter-submit' => 'Tuju',
 
 # Thumbnails
 'thumbnail-more' => 'Pagadang',
-'thumbnail_error' => 'Gagal mambuek miniatur: $1',
+'filemissing' => 'Berkas indak basobok',
+'thumbnail_error' => 'Gagal mambuek miniatua: $1',
 
 # Special:Import
+'import' => 'Impor laman',
 'importstart' => 'Mangimpor laman...',
+'importnosources' => 'Indak ado sumber impor transwiki nan lah dibuek dan pamuatan riwayaik sacaro langsuang alah dinon-aktipan.',
 
 # Import log
-'import-logentry-upload' => 'mangimpor [[$1]] malalui pamuekan berkas',
+'importlogpagetext' => 'Administrasi laman impor jo riwayaik panyuntiangannyo dari wiki lain.',
+'import-logentry-upload' => 'mangimpor [[$1]] malalui pangunggahan berkas',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Laman pangguno Sanak',
@@ -1858,9 +2167,10 @@ Silakan piliah namo lain.',
 'tooltip-pt-mytalk' => 'Laman rundiang Sanak',
 'tooltip-pt-anontalk' => 'Parundiangan tantang suntiangan dari IP ko',
 'tooltip-pt-preferences' => 'Pangaturan denai',
-'tooltip-pt-watchlist' => 'Dafta laman nan dipantau.',
-'tooltip-pt-mycontris' => 'Dafta jariah Sanak',
+'tooltip-pt-watchlist' => 'Daftar laman nan dipantau.',
+'tooltip-pt-mycontris' => 'Daftar jariah Sanak',
 'tooltip-pt-login' => 'Sanak disaranan untuak masuak log; walaupun indak wajib',
+'tooltip-pt-anonlogin' => 'Sanak disaranan untuak masuak log; walaupun indak wajib',
 'tooltip-pt-logout' => 'Kalua log',
 'tooltip-ca-talk' => 'Parudiangan tantang isi laman',
 'tooltip-ca-edit' => 'Angku dapek manyuntiang laman ko. Silakan gunoan tombol pratonton sabalun manyimpan',
@@ -1871,9 +2181,9 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'tooltip-ca-protect' => 'Linduangi laman ko',
 'tooltip-ca-unprotect' => 'Tuka palinduangan laman ko',
 'tooltip-ca-delete' => 'Hapuih laman ko',
-'tooltip-ca-move' => 'Pindahan laman ko',
-'tooltip-ca-watch' => 'Tambahkan laman ko ka dafta pantau sanak',
-'tooltip-ca-unwatch' => 'Kaluaan laman ko dari dafta pantau',
+'tooltip-ca-move' => 'Pindahkan laman ko',
+'tooltip-ca-watch' => 'Tambahkan laman ko ka daftar pantau Sanak',
+'tooltip-ca-unwatch' => 'Kaluaan laman ko dari daftar pantau',
 'tooltip-search' => 'Cari {{SITENAME}}',
 'tooltip-search-go' => 'Cari laman jo namo nan samo jikok ado',
 'tooltip-search-fulltext' => 'Cari laman untuak teks ko',
@@ -1882,17 +2192,17 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'tooltip-n-mainpage-description' => 'Kunjuangi palanta',
 'tooltip-n-portal' => 'Tantang proyek, nan dapek Sanak buek, dima ka basobok',
 'tooltip-n-currentevents' => 'Cari informasi manganai latar balakang kajadian ko',
-'tooltip-n-recentchanges' => 'Dafta parubahan baru dalam wiki',
+'tooltip-n-recentchanges' => 'Daftar parubahan baru dalam wiki',
 'tooltip-n-randompage' => 'Muek sumbarang laman',
 'tooltip-n-help' => 'Tampek mancari bantuan',
-'tooltip-t-whatlinkshere' => 'Dafta dari sado laman wiki nan tahubuang kasiko',
+'tooltip-t-whatlinkshere' => 'Daftar kasado laman wiki nan tahubuang kamari',
 'tooltip-t-recentchangeslinked' => 'Parubahan baru laman nan bakaik jo laman ko',
 'tooltip-feed-rss' => 'Umpan RSS untuak laman ko',
 'tooltip-feed-atom' => 'Umpan Atom untuak laman ko',
-'tooltip-t-contributions' => 'Caliak dafta jariah pangguno ko',
+'tooltip-t-contributions' => 'Caliak daftar jariah pangguno ko',
 'tooltip-t-emailuser' => 'Kirimkan surel pado pangguno ko',
 'tooltip-t-upload' => 'Muek berkas',
-'tooltip-t-specialpages' => 'Dafta dari sado laman istimewa',
+'tooltip-t-specialpages' => 'Daftar kasado laman istimewa',
 'tooltip-t-print' => 'Versi cetak dari laman ko',
 'tooltip-t-permalink' => 'Pautan parmanen untuak revisi laman ko',
 'tooltip-ca-nstab-main' => 'Caliak isi laman',
@@ -1901,27 +2211,28 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'tooltip-ca-nstab-special' => 'Laman istimewa, indak dapek disuntiang',
 'tooltip-ca-nstab-project' => 'Caliak laman proyek',
 'tooltip-ca-nstab-image' => 'Caliak laman berkas',
+'tooltip-ca-nstab-mediawiki' => 'Caliak pasan sistem',
 'tooltip-ca-nstab-template' => 'Caliak templat',
 'tooltip-ca-nstab-help' => 'Caliak laman bantuan',
 'tooltip-ca-nstab-category' => 'Caliak laman kategori',
 'tooltip-minoredit' => 'Tandoi iko sabagai suntiangan ketek',
 'tooltip-save' => 'Simpan nan diubah',
-'tooltip-preview' => 'Caliak dulu nan diubah, gunokan ko sabalun manyimpan',
-'tooltip-diff' => 'Caliak parubahan nan alah awak buek tu',
-'tooltip-compareselectedversions' => 'Caliak pabedoan antaro duo revisi pilihan laman ko',
-'tooltip-watch' => 'Tambahkan laman ko ka dafta pantau',
+'tooltip-preview' => 'Caliak lu nan diubah, gunoan ko sabalun manyimpan',
+'tooltip-diff' => 'Caliak parubahan nan lah dibuek',
+'tooltip-compareselectedversions' => 'Caliak pabedoan antaro duo revisi piliahan laman ko',
+'tooltip-watch' => 'Tambahkan laman ko ka daftar pantau',
 'tooltip-recreate' => 'Buek baliak laman walaupun sabananyo pernah dihapuih',
 'tooltip-upload' => 'Mulai mamuek',
 'tooltip-rollback' => '"Baliakkan" uruangkan suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
 'tooltip-undo' => '"Batalan" uruangkan panyuntiangan iko jo mambukak bantuak suntiang dalam bantuak pratonton. Hal ko mamungkinkan manambahkan alasan pado kotak ringkasan.',
 'tooltip-preferences-save' => 'Simpan preferensi',
-'tooltip-summary' => 'Masuakan sabuah ringkasan pendek',
+'tooltip-summary' => 'Buek ringkasan pendek',
 
 # Stylesheets
 'print.css' => '/* CSS placed here will affect the print output */',
 
 # Metadata
-'notacceptable' => 'Layanan wiki indak manyadioan data dalam format yang dapek dibaco dek pelanggan awak.',
+'notacceptable' => 'Server wiki indak dapek manyadioan data dalam format nan dapek dibaco dek klien Sanak.',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Pangguno}} anonim {{SITENAME}}',
@@ -1932,26 +2243,59 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'anonusers' => '{{PLURAL:$2|pangguno}} anonim {{SITENAME}} $1',
 'creditspage' => 'Panghargaan laman',
 
+# Spam protection
+'spam_blanking' => 'Sado revisi nan ado pautan ka $1, kosong',
+'spam_deleting' => 'Sado revisi nan ado pautan ka $1, dihapuih',
+
 # Info page
 'pageinfo-title' => 'Informasi untuak "$1"',
+'pageinfo-not-current' => 'Maaf, indak dapek mangagiahan informasi ko ka revisi lamo.',
 'pageinfo-header-basic' => 'Informasi dasar',
 'pageinfo-header-edits' => 'Riwayaik suntiangan',
 'pageinfo-header-restrictions' => 'Palinduangan laman',
 'pageinfo-header-properties' => 'Properti laman',
-'pageinfo-display-title' => 'Judua tampilan',
+'pageinfo-display-title' => 'Tampilan judul',
+'pageinfo-default-sort' => 'Kunci uruik baku',
 'pageinfo-length' => 'Panjang laman (dalam bita)',
 'pageinfo-article-id' => 'ID Laman',
+'pageinfo-language' => 'Bahaso isi laman',
+'pageinfo-robot-policy' => 'Statuih masin pancari',
+'pageinfo-robot-index' => 'Dapek di indeks',
+'pageinfo-robot-noindex' => 'Indak dapek di indeks',
+'pageinfo-views' => 'Bara kali dibaco',
+'pageinfo-watchers' => 'Bara urang nan mambaco',
+'pageinfo-few-watchers' => 'Kurang dari $1 {{PLURAL:$1|pambaco}}',
+'pageinfo-redirects-name' => 'Pangaliahan ka laman ko',
+'pageinfo-subpages-name' => 'Sublaman dari laman ko',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|pangaliahan}}; $3 {{PLURAL:$3|bukan pangaliahan}})',
 'pageinfo-firstuser' => 'Pambuek laman',
+'pageinfo-firsttime' => 'Tanggal pambuatan laman',
+'pageinfo-lastuser' => 'Panyuntiang tarakhia',
+'pageinfo-lasttime' => 'Tanggal suntiangan tarakhia',
+'pageinfo-edits' => 'Jumlah total suntiangan',
+'pageinfo-authors' => 'Jumlah total panyuntiang',
+'pageinfo-recent-edits' => 'Jumlah suntiangan tabaru (dalam $1 tarakhia)',
+'pageinfo-recent-authors' => 'Jumlah panyuntiang tabaru',
+'pageinfo-magic-words' => '{{PLURAL:$1|Kato}} ajaib ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategori}} tasuruak ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Templat}} nan ditransklusi ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Laman}} ditransklusi pado ($1)',
 'pageinfo-toolboxlink' => 'Informasi laman',
+'pageinfo-redirectsto' => 'Dialiahkan ka',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Dihituang sabagai laman konten',
+'pageinfo-contentpage-yes' => 'Yo',
+'pageinfo-protect-cascading' => 'Palinduangan baruruik dari siko',
+'pageinfo-protect-cascading-yes' => 'Yo',
+'pageinfo-protect-cascading-from' => 'Palinduangan baruruik dari',
+'pageinfo-category-info' => 'Kategori informasi',
+'pageinfo-category-pages' => 'Jumlah laman',
+'pageinfo-category-subcats' => 'Jumlah subkategori',
+'pageinfo-category-files' => 'Jumlah berkas',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Biru Köln',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sadarano',
 'skinname-modern' => 'Moderen',
 'skinname-vector' => 'Vektor',
 
@@ -1959,9 +2303,12 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'markaspatrolleddiff' => 'Tandoi lah dipatroli',
 'markaspatrolledtext' => 'Tandoi laman ko lah dipatroli',
 'markedaspatrolled' => 'Tandoi lah dipatroli',
+'markedaspatrolledtext' => 'Revisi nan tapiliah dari [[:$1]] lah ditando tapatroli.',
+'rcpatroldisabled' => 'Patroli parubahan baru dimatian',
 
 # Patrol log
 'patrol-log-page' => 'Log patroli',
+'patrol-log-header' => 'Iko daftar log revisi nan alah dipatroli.',
 'log-show-hide-patrol' => '$1 log patroli',
 
 # Browsing diffs
@@ -1978,7 +2325,7 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'file-info-size-pages' => '$1 × $2 piksel, ukuran berkas: $3, tipe MIME: $4, $5 {{PLURAL:$5|laman}}',
 'file-nohires' => 'Indak tasadio resolusi nan labiah gadang.',
 'svg-long-desc' => 'Berkas SVG, $1 × $2 piksel, ukuran berkas: $3',
-'svg-long-desc-animated' => 'Berkas anmasi SVG, $1 × $2 piksel, ukuran berkas: $3',
+'svg-long-desc-animated' => 'Berkas animasi SVG, $1 × $2 piksel, ukuran berkas: $3',
 'svg-long-error' => 'Berkas SVG indak sah: $1',
 'show-big-image' => 'Resolusi panuah',
 'show-big-image-preview' => 'Ukuran pratonton ko: $1',
@@ -1991,6 +2338,8 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'file-info-png-frames' => '$1 {{PLURAL:$1|bingkai}}',
 
 # Special:NewFiles
+'imagelisttext' => "Di bawah ko adolah daftar '''$1''' {{PLURAL:$1|berkas}} baruruik dari $2.",
+'newimages-summary' => 'Laman istimewa barikuik manunjuakan daftar berkas nan tarakhia dimuek',
 'newimages-legend' => 'Panyariang',
 'newimages-label' => 'Namo berkas (atau sabagian darinyo):',
 'showhidebots' => '($1 bot)',
@@ -2005,26 +2354,38 @@ Sanak hanyo buliah mancaliak sumbernyo sajo',
 'minutes-abbrev' => '$1 min',
 'hours-abbrev' => '$1 j',
 'days-abbrev' => '$1 h',
-'seconds' => '{{PLURAL:$1|$1 detik}}',
-'minutes' => '{{PLURAL:$1|$1 minik}}',
-'hours' => '{{PLURAL:$1|$1 jam}}',
-'days' => '{{PLURAL:$1|$1 hari}}',
-'months' => '{{PLURAL:$1|$1 bulan}}',
-'years' => '{{PLURAL:$1|$1 taun}}',
+'seconds' => '{{PLURAL:$1|1 datiak|$1 datiak}}',
+'minutes' => '{{PLURAL:$1|1 minik|$1 minik}}',
+'hours' => '{{PLURAL:$1|1 jam|$1 jam}}',
+'days' => '{{PLURAL:$1|1 ari|$1 ari}}',
+'weeks' => '{{PLURAL:$1|1 pakan|$1 pakan}}',
+'months' => '{{PLURAL:$1|1 bulan|$1 bulan}}',
+'years' => '{{PLURAL:$1|1 taun|$1 taun}}',
 'ago' => '$1 nan lalu',
-'just-now' => 'kini ko',
+'just-now' => 'sabanta ko',
+
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|1 jam|$1 jam}} nan lalu',
+'minutes-ago' => '{{PLURAL:$1|1 minik|$1 minik}} nan lalu',
+'seconds-ago' => '{{PLURAL:$1|1 datiak|$1 datiak}} nan lalu',
+'monday-at' => 'Sinayan pukua $1',
+'tuesday-at' => 'Salasa pukua $1',
+'wednesday-at' => "Raba'a pukua $1",
+'thursday-at' => 'Kamih pukua $1',
+'friday-at' => 'Jumaik pukua $1',
+'saturday-at' => 'Satu pukua $1',
+'sunday-at' => 'Akaik pukua $1',
+'yesterday-at' => 'Kapatang pukua $1',
 
 # Bad image list
 'bad_image_list' => 'Formatnyo adolah sabagai barikuik:
 
-Anyo dafta babutia (barih nan dimulai jo tando *) nan dianggap.
-Pautan patamo pado barih musiti pautan ka berkas buruak.
-Satiok pautan salanjuiknyo pado barih nan samo dianggap pangacualian, yaitu laman-laman dima berkas ko bisa tacaliak.',
+Hanyo daftar babutia (barih nan dimulai jo tando *) nan dipakai.
+Pautan patamo pado barih musti pautan ka berkas buruak.
+Satiok pautan salanjuiknyo pado barih nan samo dianggap pangacualian, yaitu laman-laman dima berkas ko nampak.',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -2054,9 +2415,9 @@ Variants for Chinese language
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => 'Berkas ko ado informasi tambahan nan mungkin ditambahkan dek kamera digital atau pemindai yang digunokan untuak mambuek atau mendigitalisasi berkas. Jikok berkas ko lah mangalami modifikasi, rincian nan ado mungkin indak sacaro panuah merefleksi modifikasi dari berkas tu.',
-'metadata-expand' => 'Tampilkan rincian tambahan',
-'metadata-collapse' => 'Suruakkan rincian tambahan',
+'metadata-help' => 'Berkas ko ado informasi tambahan nan mungkin ditambahan dek kamera digital atau pemindai nan digunoan untuak mambuek atau mandigitalisasi berkas ko. Jikok berkas ko lah mangalami parubahan, rincian nan ado mungkin indak sacaro jaleh mancerminkan parubahan dari berkas tu.',
+'metadata-expand' => 'Tunjuakan rincian tambahan',
+'metadata-collapse' => 'Suruakan rincian tambahan',
 'metadata-fields' => 'Tapak metadata gamba nan didata dalam pasan ko akan di masuakan pado tampilan laman gambar katiko tabel metadata disuruakkan. 
 Nan lainnyo akan tasuruak sacaro baku.
 * make
@@ -2073,7 +2434,7 @@ Nan lainnyo akan tasuruak sacaro baku.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Leba',
 'exif-imagelength' => 'Tinggi',
 'exif-bitspersample' => 'Bita per komponen',
@@ -2099,7 +2460,7 @@ Nan lainnyo akan tasuruak sacaro baku.
 'exif-relatedsoundfile' => 'Berkas audio nan bahubuangan',
 
 # External editor support
-'edit-externally' => 'Suntiang berkas ko dengan aplikasi lua',
+'edit-externally' => 'Suntiang berkas ko jo aplikasi lua',
 'edit-externally-help' => '(Caliak [//www.mediawiki.org/wiki/Manual:External_editors instruksi pangaturan] untuak informasi lanjuiknyo)',
 
 # 'all' in various places, this might be different for inflected languages
@@ -2108,7 +2469,27 @@ Nan lainnyo akan tasuruak sacaro baku.
 'monthsall' => 'sadonyo',
 'limitall' => 'sadonyo',
 
+# Table pager
+'table_pager_limit_label' => 'Item per laman:',
+'table_pager_limit_submit' => 'Tuju',
+
+# Auto-summaries
+'autosumm-new' => '←Mambuek laman baisi "$1"',
+
 # Watchlist editor
+'watchlistedit-normal-title' => 'Suntiang daftar pantau',
+'watchlistedit-normal-legend' => 'Hapuih judul dari daftar pantau',
+'watchlistedit-normal-explain' => 'Judul pado daftar pantauan Sanak ditunjuakan di bawah ko.
+Untuak mangapuih judul, agiah tando cek pado kotak di sampiangnyo, dan takan "{{int:Watchlistedit-normal-submit}}".
+Sanak dapek juo [[Special:EditWatchlist/raw|manyuntiang daftar mantahnyo]].',
+'watchlistedit-normal-submit' => 'Hapuih judul',
+'watchlistedit-normal-done' => '{{PLURAL:$1|$1 judul}} alah dihapuih dari daftar pantauan Sanak:',
+'watchlistedit-raw-title' => 'Suntiang pantauan mantah',
+'watchlistedit-raw-legend' => 'Suntiang pantauan mantah',
+'watchlistedit-raw-explain' => 'Judul pado daftar pantauan Sanak ditunjuakan di bawah ko, dan dapek disuntiang jo manambahan atau mengapuihnya dari daftar;
+ciek judul satiok barihnyo.
+Kok alah salasai, takan "{{int:Watchlistedit-raw-submit}}".
+Sanak dapek juo [[Special:EditWatchlist|manggunoan panyuntiang standarnyo]].',
 'watchlistedit-raw-titles' => 'Judul:',
 'watchlistedit-raw-submit' => 'Pabarui pantauan',
 'watchlistedit-raw-done' => 'Pantauan Sanak lah dipabarui',
@@ -2117,7 +2498,7 @@ Nan lainnyo akan tasuruak sacaro baku.
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Tunjuakan parubahan takaik',
-'watchlisttools-edit' => 'Tunjuakan sarato suntiang dafta pantau',
+'watchlisttools-edit' => 'Tunjuakan sarato suntiang daftar pantau',
 'watchlisttools-raw' => 'Suntiang pantauan mantah',
 
 # Signatures
@@ -2140,6 +2521,12 @@ Nan lainnyo akan tasuruak sacaro baku.
 'version-license' => 'Lisensi',
 'version-poweredby-credits' => "Wiki ko didukuang jo '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
 'version-poweredby-others' => 'lainnyo',
+'version-credits-summary' => 'Kami nio mangakui urang-urang ko ateh kontribusinyo pado [[Special:Version|MediaWiki]].',
+'version-license-info' => 'MediaWiki adolah parangkaik lunak bebas; Sanak dapek mandistribusian dan/atau mamodfikasinyo jo syaraik Lisensi Publik Umum GNU nan dikaluaan dek Free Software Foundation; versi 2 atau nan tabaru.
+
+MediaWiki didistribusian jo harapan dapek digunoan, tapi INDAK JO JAMINAN APO PUN; indak ado jaminan PADAGANGAN atau KACOCOKAN UNTUAK TUJUAN TATANTU. Caliak Lisensi Publik Umum GNU untuak informasi lebiah lanjuik.
+
+Sanak mustilah alah manarimo [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi Publik Umum GNU] basamo jo program iko; jikok indak, kiriman suraik ka Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA atau [//www.gnu.org/licenses/old-licenses/gpl-2.0.html baco sacaro online].',
 'version-software' => 'Parangkaik lunak tapasang',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Versi',
@@ -2147,51 +2534,112 @@ Nan lainnyo akan tasuruak sacaro baku.
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikel path]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skrip path]',
 
-# Special:FilePath
-'filepath' => 'Lokasi berkas',
-'filepath-page' => 'Berkas:',
-'filepath-submit' => 'Cari',
-
 # Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Pancarian berkas duplikat',
+'fileduplicatesearch-summary' => 'Pancarian berkas duplikat badasaran nilai hash-nyo.',
 'fileduplicatesearch-result-n' => 'Berkas "$1" ado {{PLURAL:$2|$2 duplikat nan samo}}.',
 'fileduplicatesearch-noresults' => 'Indak basobok berkas banamo "$1".',
 
 # Special:SpecialPages
 'specialpages' => 'Laman istimewa',
-'specialpages-group-login' => 'Masuak log / mandafta',
+'specialpages-note' => '----
+* Laman istimewa normal.
+* <span class="mw-specialpagerestricted">Laman istimewa talarang.</span>
+* <span class="mw-specialpagecached">Laman istimewa tasinggah (mungkin usang).</span>',
+'specialpages-group-maintenance' => 'Laporan pamaliharoan',
+'specialpages-group-other' => 'Lain-lain',
+'specialpages-group-login' => 'Masuak log / mandaftar',
+'specialpages-group-changes' => 'Parubahan baru jo log',
+'specialpages-group-media' => 'Laporan jo pamuatan berkas',
+'specialpages-group-users' => 'Pangguno jo hak pangguno',
+'specialpages-group-highuse' => 'Nan paliang',
+'specialpages-group-pages' => 'Daftar laman',
+'specialpages-group-pagetools' => 'Pakakeh laman',
+'specialpages-group-wiki' => 'Data jo pakakeh',
+'specialpages-group-redirects' => 'Pancarian jo pangaliahan',
+'specialpages-group-spam' => 'Pakakeh panangka spam',
 
 # Special:BlankPage
 'blankpage' => 'Laman kosong',
+'intentionallyblankpage' => 'Laman ko sangajo dikosoangkan.',
 
 # External image whitelist
 'external_image_whitelist' => '#Bia se barih ko apo adonyo<pre>
 #Latakan fragmen tando regular (hanyo bagian antaro //) di bawah ko
-#Iko akan dicocokan jo URL gambar lua (tahubuang langsuang)
-#Yang mano cocok akan ditampilkan sabagai gambar, sisonyo hanyo sabagai tautan sajo
-#Barih dimulai jo # dipalakuan sabagai komentar
-#Iko indak manbedaan huruf gadang atau ketek
+#Iko akan dicocokan jo URL gambar dari lua (tahubuang langsuang)
+#Nan mano nan cocok ditampilkan sabagai gambar, sisonyo hanyo sabagai tautan sajo
+#Barih nan dimulai jo # dianggap sabagai komentar
+#Iko indak mambedoan huruf gadang jo ketek
 
-#Latakan sado fragmen regex di bawah barih ko. Bia se barih apo adonyo</pre>',
+#Latakan sado fragmen regex di bawah barih ko. Bia se barih ko apo adonyo</pre>',
 
 # Special:Tags
+'tags' => 'Tag parubahan nan sah',
 'tag-filter' => '[[Special:Tags|Tag]] sariang:',
 'tag-filter-submit' => 'Sariang',
 'tags-title' => 'Tag',
+'tags-intro' => 'Laman ko barisi daftar tag nan dapek ditandoi dek parangkaik lunak jo suntiangan dan maknanyo.',
 'tags-tag' => 'Namo tag',
+'tags-display-header' => 'Tampilan di daftar parubahan',
+'tags-description-header' => 'Deskripsi langkok dari makna',
+'tags-hitcount-header' => 'Parubahan ba-tag',
 'tags-edit' => 'suntiang',
 'tags-hitcount' => '$1 {{PLURAL:$1|parubahan}}',
 
+# Special:ComparePages
+'comparepages' => 'Bandiangkan laman',
+'compare-selector' => 'Bandiangkan revisi laman',
+'compare-page1' => 'Laman 1',
+'compare-page2' => 'Laman 2',
+'compare-rev1' => 'Revisi 1',
+'compare-rev2' => 'Revisi 2',
+'compare-submit' => 'Bandiangkan',
+'compare-invalid-title' => 'Judul nan Sanak agiah indak sah.',
+'compare-title-not-exists' => 'Judul nan dituju indak basobok.',
+'compare-revision-not-exists' => 'Revisi nan dituju indak basobok.',
+
+# Database error messages
+'dberr-header' => 'Wiki ko bamasalah',
+'dberr-problems' => 'Maaf!
+Situs ko mangalami masalah teknis.',
+
+# HTML forms
+'htmlform-required' => 'Nilai ko diparaluan',
+
 # New logging system
-'logentry-newusers-newusers' => 'Akun pangguno $1 lah dibuek',
-'logentry-newusers-create' => '$1 mambuek akun pangguno',
-'logentry-newusers-create2' => 'Akun pangguno $3 dibuek jo $1',
-'logentry-newusers-autocreate' => 'Akun $1 dibuek sacaro otomatis',
+'logentry-delete-delete' => '$1 {{GENDER:$2|mangapuih}} laman $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|mangambalian}} laman $3',
+'logentry-move-move' => '$1 {{GENDER:$2|mamindahan}} laman $3 ka $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|mamindahan}} laman $3 ka $4 tanpa mambuek pangaliahan',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|mamindahan}} laman $3 ka $4 maimpok pangaliahan lamo',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|mamindahan}} laman $3 ka $4 maimpok pangaliahan lamo tanpa mambuek pangaliahan',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|manandoi}} revisi $4 dari laman $3 tapatroli',
+'logentry-patrol-patrol-auto' => '$1 otomatih {{GENDER:$2|manandoi}} revisi $4 dari laman $3 tapatroli',
+'logentry-newusers-newusers' => 'Akun pangguno $1 alah {{GENDER:$2|dibuek}}',
+'logentry-newusers-create' => 'Akun pangguno $1 alah {{GENDER:$2|dibuek}}',
+'logentry-newusers-create2' => 'Akun pangguno $3 alah {{GENDER:$2|dibuek}} dek $1',
+'logentry-newusers-byemail' => 'Akun pangguno $3 alah {{GENDER:$2|dibuek}} dek $1 dan kato sandi alah dikirim jo surel',
+'logentry-newusers-autocreate' => 'Akun pangguno $1 alah {{GENDER:$2|dibuek}} sacaro otomatih',
+'logentry-rights-rights' => '$1 {{GENDER:$2|maubah}} kaanggotaan kalompok $3 dari $4 manjadi $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|maubah}} kaanggotaan kalompok $3',
+'rightsnone' => '(indak ado)',
 
 # Search suggestions
 'searchsuggest-search' => 'Cari',
 'searchsuggest-containing' => 'Barisi...',
 
 # Durations
+'duration-seconds' => '$1 {{PLURAL:$1|datiak}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minik}}',
+'duration-hours' => '$1 {{PLURAL:$1|jam}}',
+'duration-days' => '$1 {{PLURAL:$1|ari}}',
+'duration-weeks' => '$1 {{PLURAL:$1|minggu}}',
+'duration-years' => '$1 {{PLURAL:$1|taun}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekade}}',
+'duration-centuries' => '$1 {{PLURAL:$1|abaik}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenium}}',
 
+# Image rotation
+'rotate-comment' => 'Gambar diputa $1 {{PLURAL:$1|darajaik}} saarah jarum jam',
+
 );
index 53ed722..6c7f0a6 100644 (file)
@@ -151,6 +151,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'МоиПодигања' ),
        'Newimages'                 => array( 'НовиСлики', 'НовиПодатотеки' ),
        'Newpages'                  => array( 'НовиСтраници' ),
+       'PagesWithProp'             => array( 'СтранициСоСвојство' ),
        'PasswordReset'             => array( 'ПроменаНаЛозинка' ),
        'PermanentLink'             => array( 'ПостојанаВрска' ),
        'Popularpages'              => array( 'ПопуларниСтраници' ),
@@ -162,6 +163,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'СлучајноПренасочување' ),
        'Recentchanges'             => array( 'СкорешниПромени' ),
        'Recentchangeslinked'       => array( 'ПоврзаниПромени' ),
+       'Redirect'                  => array( 'Пренасочување' ),
        'Revisiondelete'            => array( 'БришењеРевизија' ),
        'Search'                    => array( 'Барај' ),
        'Shortpages'                => array( 'КраткиСтраници' ),
@@ -179,7 +181,7 @@ $specialPageAliases = array(
        'Unusedimages'              => array( 'НеискористениСлики', 'НеискористениПодатотеки' ),
        'Unusedtemplates'           => array( 'НеискористениШаблони' ),
        'Unwatchedpages'            => array( 'НенабљудуваниСтраници' ),
-       'Upload'                    => array( 'Подигање', 'Подигања' ),
+       'Upload'                    => array( 'Подигање' ),
        'UploadStash'               => array( 'СкриениПодигања' ),
        'Userlogin'                 => array( 'Најавување' ),
        'Userlogout'                => array( 'Одјавување' ),
@@ -236,7 +238,7 @@ $magicWords = array(
        'talkspace'                 => array( '1', 'РАЗГОВОРПРОСТОР', 'TALKSPACE' ),
        'fullpagename'              => array( '1', 'ЦЕЛОСНОИМЕНАСТРАНИЦА', 'FULLPAGENAME' ),
        'subpagename'               => array( '1', 'ПОТСТРАНИЦА', 'SUBPAGENAME' ),
-       'basepagename'              => array( '1', 'Ð\98Ð\9cÐ\95Ð\9dÐ\90Ð\9eСÐ\9dÐ\9eÐ\92Ð\9dÐ\90СТРÐ\90Ð\9dÐ\98ЦÐ\90', 'BASEPAGENAME' ),
+       'basepagename'              => array( '1', 'ОСНОВНАСТРАНИЦА', 'BASEPAGENAME' ),
        'talkpagename'              => array( '1', 'СТРАНИЦАЗАРАЗГОВОР', 'TALKPAGENAME' ),
        'subjectpagename'           => array( '1', 'ИМЕНАСТАТИЈА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
        'msg'                       => array( '0', 'ПОР:', 'MSG:' ),
@@ -303,6 +305,7 @@ $magicWords = array(
        'raw'                       => array( '0', 'СИРОВО:', 'RAW:' ),
        'displaytitle'              => array( '1', 'ПРИКАЖИНАСЛОВ', 'DISPLAYTITLE' ),
        'rawsuffix'                 => array( '1', 'П', 'R' ),
+       'nocommafysuffix'           => array( '0', 'БЕЗПОДЕЛ', 'NOSEP' ),
        'newsectionlink'            => array( '1', '__ВРСКАНОВПОДНАСЛОВ__', '__NEWSECTIONLINK__' ),
        'nonewsectionlink'          => array( '1', '__БЕЗВРСКАНОВПОДНАСЛОВ__', '__NONEWSECTIONLINK__' ),
        'currentversion'            => array( '1', 'ТЕКОВНАВЕРЗИЈА', 'CURRENTVERSION' ),
@@ -376,8 +379,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Прикажи го бројот на корисници кои набљудуваат',
 'tog-oldsig' => 'Постоечки потпис:',
 'tog-fancysig' => 'Сметај го потписот за викитекст (без автоматска врска)',
-'tog-externaleditor' => 'По основно користи надворешен уредувач (само за стручњаци, потребно е посебно нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
-'tog-externaldiff' => 'По основно користи надворешен програм за споредување верзии (само за стручњаци, потребно е специјално нагодување на сметачот. [//www.mediawiki.org/wiki/Manual:External_editors?uselang=mk Повеќе информации.])',
 'tog-showjumplinks' => 'Овозможи врски на пристапност „скокни на“',
 'tog-uselivepreview' => 'Користи преглед во живо (бара JavaScript) (експериментално)',
 'tog-forceeditsummary' => 'Извести ме кога нема опис на промените',
@@ -392,6 +393,7 @@ $messages = array(
 'tog-showhiddencats' => 'Прикажи скриени категории',
 'tog-noconvertlink' => 'Оневозможи претворање на наслов на врска',
 'tog-norollbackdiff' => 'Изостави ја разликата по извршено отповикување',
+'tog-useeditwarning' => 'Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените',
 
 'underline-always' => 'Секогаш',
 'underline-never' => 'Никогаш',
@@ -455,6 +457,18 @@ $messages = array(
 '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 декември',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категорија|Категории}}',
@@ -466,9 +480,9 @@ $messages = array(
 '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' => '{{#ifeq:$2|Оваа категорија содржи само една страница.|{{PLURAL:$1|Прикажана е една|Прикажани се $1}} од вкупно $2 страници во категоријата.}}',
 'category-article-count-limited' => '{{PLURAL:$1|Следната страница е|Следните $1 страници се}} во оваа категорија.',
-'category-file-count' => '{{PLURAL:$2|Оваа категорија ја содржи само следната податотека.|{{PLURAL:$1|Следната податотека е|Следните $1 податотеки се}} во оваа категорија, од вкупно $2.}}',
+'category-file-count' => '{{#ifeq:$2|Оваа категорија содржи само една податотека.|{{PLURAL:$1|Прикажана е една|Прикажани се $1}} од вкупно $2 податотеки во категоријата.}}',
 'category-file-count-limited' => '{{PLURAL:$1|Следнава податотека е|Следниве $1 податотеки се}} во оваа категорија.',
 'listingcontinuesabbrev' => 'продолжува',
 'index-category' => 'Индексирани страници',
@@ -477,14 +491,14 @@ $messages = array(
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
-'about' => 'Ð\98нÑ\84оÑ\80маÑ\86ии Ð·Ð°',
+'about' => 'Ð\97а {{SITENAME}}',
 'article' => 'Статија',
 'newwindow' => '(се отвора во нов прозорец)',
 'cancel' => 'Откажи',
 'moredotdotdot' => 'Повеќе...',
 'morenotlisted' => 'Повеќе (вон списокот)...',
 'mypage' => 'Страница',
-'mytalk' => 'Разговор',
+'mytalk' => 'разговор',
 'anontalk' => 'Разговор за оваа IP-адреса',
 'navigation' => 'Навигација',
 'and' => '&#32;и',
@@ -563,10 +577,10 @@ $messages = array(
 'viewhelppage' => 'Погледајте ја страницата за помош',
 'categorypage' => 'Погледајте ја страницата за категоријата',
 'viewtalkpage' => 'Видете го разговорот',
-'otherlanguages' => 'Ð\94руги јазици',
+'otherlanguages' => 'Ð\9dа Ð´руги јазици',
 'redirectedfrom' => '(Пренасочено од $1)',
 'redirectpagesub' => 'Страница за пренасочување',
-'lastmodifiedat' => 'Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾Ñ\81леден Ð¿Ð°Ñ\82 Ðµ Ð¸Ð·Ð¼ÐµÐ½ÐµÑ\82а Ð½Ð° $1 во $2 ч.',
+'lastmodifiedat' => 'Ð\9fоÑ\81леднаÑ\82а Ð¿Ñ\80омена Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86ава Ðµ Ð¸Ð·Ð²Ñ\80Ñ\88ена Ð½Ð° $1 Ð³. во $2 ч.',
 'viewcount' => 'Оваа страница била посетена {{PLURAL:$1|еднаш|$1 пати}}.',
 'protectedpage' => 'Заштитена страница',
 'jumpto' => 'Прејди на:',
@@ -610,7 +624,7 @@ $1',
 Видете [[Special:Version|страница за верзија]].',
 
 'ok' => 'ОК',
-'pagetitle' => '$1 - {{SITENAME}}',
+'pagetitle' => '$1  {{SITENAME}}',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
 'retrievedfrom' => 'Преземено од „$1“',
 'youhavenewmessages' => 'Имате $1 ($2).',
@@ -631,7 +645,7 @@ $1',
 'toc' => 'Содржина',
 'showtoc' => 'прикажи',
 'hidetoc' => 'скриј',
-'collapsible-collapse' => 'скриј',
+'collapsible-collapse' => 'Собери',
 'collapsible-expand' => 'прикажи',
 'thisisdeleted' => 'Да прикажам или вратам $1?',
 'viewdeleted' => 'Да погледате $1?',
@@ -734,9 +748,9 @@ $1',
 'protectedpagetext' => 'Оваа страница е заклучена за уредувања и други дејства.',
 'viewsourcetext' => 'Можете да го погледнете и копирате кодот на оваа страница:',
 'viewyourtext' => "Можете да го погледнете и копирате кодот на '''вашите уредувања''' на оваа страница:",
-'protectedinterface' => 'Оваа страница содржи текст од посредникот на софтверот на ова вики и е превентивно заштитена поради можна злоупотреба.
+'protectedinterface' => 'Оваа страница содржи текст од посредникот на програмот на ова вики и е превентивно заштитена поради можна злоупотреба.
 За да додавате или менувате преводи на сите викија, појдете на [//translatewiki.net/wiki/Main_Page?uselang=mk translatewiki.net] - проектот за локализација на МедијаВики.',
-'editinginterface' => "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' Ð£Ñ\80едÑ\83ваÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а ÐºÐ¾Ñ\98а Ðµ Ð´ÐµÐ» Ð¾Ð´ ÐºÐ¾Ñ\80иÑ\81ниÑ\87киоÑ\82 Ð¿Ð¾Ñ\81Ñ\80едник Ð½Ð° Ð\9cедиÑ\98аÐ\92ики Ñ\81оÑ\84Ñ\82веÑ\80оÑ\82.
+'editinginterface' => "'''Ð\9fÑ\80едÑ\83пÑ\80едÑ\83ваÑ\9aе:''' Ð£Ñ\80едÑ\83ваÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а ÐºÐ¾Ñ\98а Ðµ Ð´ÐµÐ» Ð¾Ð´ ÐºÐ¾Ñ\80иÑ\81ниÑ\87киоÑ\82 Ð¿Ð¾Ñ\81Ñ\80едник Ð½Ð° Ð¿Ñ\80огÑ\80амоÑ\82 Ð\9cедиÑ\98аÐ\92ики.
 Промените на оваа страница ќе предизвикаат промени во корисничкиот посредник кај другите корисници на ова вики.
 За да додадете или измените превод на сите викија, појдете на [//translatewiki.net/wiki/Main_Page?setlang=mk translatewiki.net] - проектот за локализација на МедијаВики.",
 'sqlhidden' => '(Барањето до SQL е скриено)',
@@ -770,9 +784,18 @@ $2',
 'welcomecreation-msg' => 'Вашата корисничка сметка е создадена.
 Не заборавајте да ги измените вашите [[Special:Preferences|{{SITENAME}} нагодувања]].',
 'yourname' => 'Корисничко име:',
+'userlogin-yourname' => 'Корисничко име',
+'userlogin-yourname-ph' => 'Внесете корисничко име',
 'yourpassword' => 'Лозинка:',
+'userlogin-yourpassword' => 'Лозинка',
+'userlogin-yourpassword-ph' => 'Внесете лозинка',
+'createacct-yourpassword-ph' => 'Внесете лозинка',
 'yourpasswordagain' => 'Повторете ја лозинката:',
+'createacct-yourpasswordagain' => 'Потврда на лозинката',
+'createacct-yourpasswordagain-ph' => 'Повторно внесете ја лозинката',
 'remembermypassword' => 'Запомни ме на овој сметач (највеќе $1 {{PLURAL:$1|ден|дена}})',
+'userlogin-remembermypassword' => 'Запомни ме',
+'userlogin-signwithsecure' => 'Користи безбеден опслужувач',
 'securelogin-stick-https' => 'Останете поврзани со HTTPS по одјавата',
 'yourdomainname' => 'Вашиот домен:',
 'password-change-forbidden' => 'Не можете да ја менувате лозинката на ова вики.',
@@ -785,18 +808,38 @@ $2',
 'logout' => 'Одјава',
 'userlogout' => 'Одјава',
 'notloggedin' => 'Не сте најавени',
+'userlogin-noaccount' => 'Немате сметка?',
+'userlogin-joinproject' => 'Зачленете се на {{SITENAME}}',
 'nologin' => "Немате корисничка сметка? '''$1'''.",
 'nologinlink' => 'Направете нова корисничка сметка',
 'createaccount' => 'Направи сметка',
 'gotaccount' => "Веќе имате корисничка сметка? '''$1'''.",
 'gotaccountlink' => 'Најавете се',
 'userlogin-resetlink' => 'Си ги заборавивте податоците за најава?',
+'userlogin-resetpassword-link' => 'Смени лозинка',
+'helplogin-url' => 'Help:Најава',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помош со најавата]]',
+'createacct-join' => 'Внесете ваши информации',
+'createacct-emailrequired' => 'Е-пошта',
+'createacct-emailoptional' => 'Е-пошта (незадолжително)',
+'createacct-email-ph' => 'Внесете е-пошта',
 'createaccountmail' => 'Дај привремена произволна лозинка и испрати ја на долунаведената адреса',
+'createacct-realname' => 'Вистинско име (незадолжително)',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-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|скорешен учесник|скорешни учесници}}',
 'badretype' => 'Внесените лозинки не се совпаѓаат.',
 'userexists' => 'Корисничкото име што го внесовте е зафатено.
 Изберете друго име.',
 'loginerror' => 'Грешка при најавувањето',
+'createacct-error' => 'Грешка во создавањето на сметката',
 'createaccounterror' => 'Не можам да ја создадам сметката: $1',
 'nocookiesnew' => 'Корисничката сметка е создадена, но не сте најавени.
 {{SITENAME}} користи колачиња за најавување на корисници.
@@ -809,7 +852,7 @@ $2',
 За оваа цел ќе ви требаат колачиња. Проверете дали се овозможени, превчитајте ја страницава и обидете се повторно.',
 'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'Внесовте погрешно корисничко име.',
-'loginsuccesstitle' => 'Најавувањето е успешно',
+'loginsuccesstitle' => 'Најавата е успешна',
 'loginsuccess' => 'Сега сте најавени на {{SITENAME}} како „$1“.',
 'nosuchuser' => 'Нема корисник со името „$1“.
 Корисничките имиња разликуваат мали и големи букви.
@@ -838,7 +881,7 @@ $2',
 'blocked-mailpassword' => 'Вашата IP-адреса е блокирана за уредување, истовремено е ставена забрана за користење на функцијата за обнова на лозинка за да се спречи можноста за злоупотреба.',
 'eauthentsent' => 'На назначената адреса е испратена потврдна порака.
 Пред да се испрати друга порака на корисничката сметка, ќе морате да ги проследите напатствијата во пораката, за да потврдите дека таа корисничка сметка е навистина ваша.',
-'throttled-mailpassword' => 'Ð\9fоÑ\82Ñ\81еÑ\82Ñ\83ваÑ\9aе Ð·Ð° Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°Ñ\82а Ðµ Ð²ÐµÑ\9cе Ð¿Ñ\80аÑ\82ено во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.
+'throttled-mailpassword' => 'Ð\92еÑ\9cе Ðµ Ð¸Ñ\81пÑ\80аÑ\82ена Ð¿Ð¾Ñ\80ака Ð·Ð° Ð¸Ð·Ð¼ÐµÐ½Ð° Ð½Ð° Ð»Ð¾Ð·Ð¸Ð½ÐºÐ°Ñ\82а во {{PLURAL:$1|изминатиов час|изминативе $1 часа}}.
 За да се спречи злоупотреба, само едно потсетување може да се праќа на {{PLURAL:$1|секој час|секои $1 часа}}.',
 'mailerror' => 'Грешка при испраќање на е-поштата: $1',
 'acct_creation_throttle_hit' => 'Корисници на ова вики користејќи ја вашата IP-адреса создале {{PLURAL:$1|1 корисничка сметка|$1 кориснички сметки}} во последниве денови, при што е достигнат максималниот број на кориснички сметки предвиден и овозможен за овој период.
@@ -853,7 +896,7 @@ $2',
 'cannotchangeemail' => 'На ова вики не може да се менува е-пошта на сметките.',
 'emaildisabled' => 'Ова мреж. место не може да праќа е-пошта.',
 'accountcreated' => 'Корисничката сметка е направена',
-'accountcreatedtext' => 'Корисничката сметка за $1 беше направена.',
+'accountcreatedtext' => 'Корисничката сметка „$1“ е направена.',
 'createaccount-title' => 'Создавање на сметка за {{SITENAME}}',
 'createaccount-text' => 'Некој направил сметка со вашата е-поштенска адреса на {{SITENAME}} ($4) со име „$2“ и  лозинка „$3“.
 Би требало сега да се пријавите и да ја промените вашата лозинка.
@@ -889,21 +932,23 @@ $2',
 'resetpass-wrong-oldpass' => 'Погрешна привремена или тековна лозинка.
 Можеби веќе ја имате успешно променето вашата лизинка или сте побарале нова привремена лозинка.',
 'resetpass-temp-password' => 'Привремена лозинка:',
+'resetpass-abort-generic' => 'Смената на лозинката е откажана од додаток.',
 
 # Special:PasswordReset
 'passwordreset' => 'Менување на лозинка',
-'passwordreset-text' => 'Пополнете го образецов за да ви испратиме потсетник за вашите најавни податоци по е-пошта.',
+'passwordreset-text-one' => 'Пополнете го образецов за да ја измените лозинката.',
+'passwordreset-text-many' => '{{PLURAL:$1|Внесете еден од податоците за да ја смените лозинката.}}',
 'passwordreset-legend' => 'Нова лозинка',
 'passwordreset-disabled' => 'На ова вики е оневозможено задавање на нова лозинка.',
-'passwordreset-pretext' => '{{PLURAL:$1||Подолу внесете еден податок}}',
+'passwordreset-emaildisabled' => 'Можностите за е-пошта се исклучени на ова вики',
 'passwordreset-username' => 'Корисничко име:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Да ја прикажам пораката?',
 'passwordreset-capture-help' => 'Ако го штиклирате кутивчево, ќе ви се прикаже пораката (со привремената лозинка) и истата ќе му биде испратена на корисникот.',
 'passwordreset-email' => 'Е-пошта:',
 'passwordreset-emailtitle' => 'Најавни податоци за {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ð\9dекоÑ\98 (веÑ\80оÑ\98аÑ\82но Ð²Ð¸Ðµ, Ð¾Ð´ IP-адÑ\80еÑ\81аÑ\82а $1) Ð¿Ð¾Ð±Ð°Ñ\80а Ð¿Ð¾Ñ\82Ñ\81еÑ\82ник Ð½Ð° Ð²Ð°Ñ\88иÑ\82е
½Ð°Ñ\98авни Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и за {{SITENAME}} ($4). Оваа е-поштенска адреса е наведена во
+'passwordreset-emailtext-ip' => 'Ð\9dекоÑ\98 (веÑ\80оÑ\98аÑ\82но Ð²Ð¸Ðµ, Ð¾Ð´ IP-адÑ\80еÑ\81аÑ\82а $1) Ð¿Ð¾Ð±Ð°Ñ\80а Ð¸Ð·Ð¼ÐµÐ½Ð° Ð½Ð° Ð²Ð°Ñ\88аÑ\82а
»Ð¾Ð·Ð¸Ð½ÐºÐ° за {{SITENAME}} ($4). Оваа е-поштенска адреса е наведена во
 {{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:
 
 $2
@@ -912,7 +957,7 @@ $2
 Сега треба да се најавите и да внесете нова лозинка. Ако ова барање го
 поставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате
 да ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.',
-'passwordreset-emailtext-user' => 'Ð\9aоÑ\80иÑ\81никоÑ\82 $1 Ð½Ð° {{SITENAME}} Ð¿Ð¾Ð±Ð°Ñ\80а Ð´Ð° Ð¿Ð¾Ñ\82Ñ\81еÑ\82ник Ð·Ð° Ð²Ð°Ñ\88иÑ\82е Ð½Ð°Ñ\98авни Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и на {{SITENAME}}
+'passwordreset-emailtext-user' => 'Ð\9aоÑ\80иÑ\81никоÑ\82 $1 Ð½Ð° {{SITENAME}} Ð¿Ð¾Ð±Ð°Ñ\80а Ð¸Ð·Ð¼ÐµÐ½Ð° Ð½Ð° Ð²Ð°Ñ\88аÑ\82а Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° на {{SITENAME}}
 ($4). Оваа е-поштенска адреса е наведена во {{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:
 
 $2
@@ -923,9 +968,9 @@ $2
 да ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.',
 'passwordreset-emailelement' => 'Корисничко име: $1
 Привремена лозинка: $2',
-'passwordreset-emailsent' => 'Испратен е потсетник по е-пошта',
-'passwordreset-emailsent-capture' => 'Испратен е потсетник по е-пошта (прикажан подолу).',
-'passwordreset-emailerror-capture' => 'Создаден е потсетник за испраќање по е-пошта (прикажан подолу), но не успеав да го испратам на корисникот: $1',
+'passwordreset-emailsent' => 'Испратено е писмо за измена на лозинката.',
+'passwordreset-emailsent-capture' => 'Испратено е писмо за измена на лозинката (прикажано подолу).',
+'passwordreset-emailerror-capture' => 'Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Смени е-пошта',
@@ -947,7 +992,7 @@ $2
 'link_sample' => 'Наслов на врска',
 'link_tip' => 'Внатрешна врска',
 'extlink_sample' => 'http://www.example.com наслов на врска',
-'extlink_tip' => 'Ð\9dадвоÑ\80еÑ\88на Ð²Ñ\80Ñ\81ка (Ñ\81о Ð¿Ñ\80еÑ\84икÑ\81оÑ\82 http://)',
+'extlink_tip' => 'Ð\9dадвоÑ\80еÑ\88на Ð²Ñ\80Ñ\81ка (Ñ\81о Ð¿Ñ\80еÑ\82Ñ\81Ñ\82авкаÑ\82а http://)',
 'headline_sample' => 'Наслов',
 'headline_tip' => 'Поднаслов',
 'nowiki_sample' => 'Овде внесете неформатиран текст',
@@ -1015,8 +1060,8 @@ $2
 'nosuchsectiontext' => 'Се обидовте да уредите заглавие кое не постои.
 Може да било преместено или избришано додека ја разгледувавте страницата.',
 'loginreqtitle' => 'Треба да се најавите',
-'loginreqlink' => 'наÑ\98ава',
-'loginreqpagetext' => 'Ð\9fоÑ\82Ñ\80ебно Ðµ Ð²Ð°Ñ\88е $1 за да ги видите останатите страници.',
+'loginreqlink' => 'наÑ\98авени',
+'loginreqpagetext' => 'ТÑ\80еба Ð´Ð° Ñ\81Ñ\82е $1 за да ги видите останатите страници.',
 'accmailtitle' => 'Лозинката е испратена.',
 'accmailtext' => "Случајно создадена лозинка за [[User talk:$1|$1]] е испратена на $2.
 
@@ -1043,7 +1088,7 @@ $2
 'userpage-userdoesnotexist-view' => 'Корисничката сметка „$1“ не е регистрирана.',
 'blocked-notice-logextract' => 'Овој корисник е моментално блокиран.
 Подолу е прикажан последниот дневнички запис:',
-'clearyourcache' => "С'''Напомена: По зачувувањето морате да го исчистите кешот на прелистувачот за да можете ги видите промените.'''
+'clearyourcache' => "'''Напомена: По зачувувањето морате да го исчистите кешот на прелистувачот за да можете ги видите промените.'''
 * '''Firefox / Safari:''' Држете ''Shift'' и стиснете на ''Reload'' или притиснете ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac);
 * '''Google Chrome:''' Притиснете ''Ctrl-Shift-R'' (''⌘-R'' на Mac)
 * '''Internet Explorer:''' Држете ''Ctrl'' додека притискате на ''Refresh'' или притиснете ''Ctrl-F5''.
@@ -1144,12 +1189,15 @@ $2
 Веројатно е избришана.',
 'edit-conflict' => 'Спротиставеност во уредувањето.',
 'edit-no-change' => 'Вашите уредувања беа игнорирани, бидејќи не се направени промени врз текстот.',
+'postedit-confirmation' => 'Вашето уредување е зачувано.',
 'edit-already-exists' => 'Не може да се создаде нова страница.
 Истата веќе постои.',
 'defaultmessagetext' => 'Текст на пораката по основно',
 'content-failed-to-parse' => 'Не успеав да ја предадам содржината од типот $2 за моделот $1: $3',
 'invalid-content-data' => 'Неважечки податоци од содржината',
 'content-not-allowed-here' => 'Содржините од моделот „$1“ не се допуштени на страницата [[$2]]',
+'editwarning-warning' => 'Ако ја напуштите страницата ќе ги изгубите сите промени кои сте ги направиле.
+Ако сте најавени, можете да го исклучите ова предупредување во одделот „Уредување“ во вашите нагодувања.',
 
 # Content models
 'content-model-wikitext' => 'викитекст',
@@ -1375,7 +1423,7 @@ $1",
 'searchsubtitle' => "Пребарувате '''[[:$1]]''' на ([[Special:Prefixindex/$1|сите страници кои започнуваат со „$1“]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|сите страници кои водат до „$1“]])",
 'searchsubtitleinvalid' => "Пребарувавте '''$1'''",
 'toomanymatches' => 'Премногу резултати од пребарувањето, ве молиме обидете се со поинакво барање',
-'titlematches' => 'Ð\9dаÑ\81ловоÑ\82 Ð½Ð° Ñ\81Ñ\82аÑ\82иÑ\98аÑ\82а Ð¾Ð´Ð³Ð¾Ð²Ð°Ñ\80а',
+'titlematches' => 'СовпаднаÑ\82и Ð½Ð°Ñ\81лови',
 'notitlematches' => 'Ниеден наслов на страница не одговара',
 'textmatches' => 'Совпаднат текст во страниците',
 'notextmatches' => 'Ниеден текст во статиите не одговара',
@@ -1389,7 +1437,7 @@ $1",
 'searchmenu-exists' => "'''На ова вики има страница со наслов „[[:$1]]“'''",
 'searchmenu-new' => "Создајте ја страницата „[[:$1]]“ на ова вики!'''",
 'searchhelp-url' => 'Help:Содржина',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ð\9fÑ\80елиÑ\81Ñ\82Ñ\83ваÑ\9aе Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81о Ð¾Ð²Ð¾Ñ\98 Ð¿Ñ\80еÑ\84икÑ\81]]',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Ð\9fÑ\80елиÑ\81Ñ\82Ñ\83ваÑ\9aе Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81о Ð¾Ð²Ð°Ð° Ð¿Ñ\80еÑ\82Ñ\81Ñ\82авка]]',
 'searchprofile-articles' => 'Статии',
 'searchprofile-project' => 'Помош и проектни страници',
 'searchprofile-images' => 'Податотеки',
@@ -1418,12 +1466,12 @@ $1",
 'showingresultsnum' => "Подолу {{PLURAL:$3|е прикажан '''1''' резултат|се прикажани '''$3''' резултати}} почнувајќи од '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Резултат '''$1''' од '''$3'''|Резултати '''$1 - $2''' од '''$3'''}} за '''$4'''",
 'nonefound' => "'''Напомена''': Само некои именски простори се пребаруваат по основно.
\9eбидеÑ\82е Ñ\81е Ñ\81о Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\9aе Ð½Ð° Ð¿Ñ\80еÑ\84икÑ\81оÑ\82 ''all:'' Ð·Ð° Ð´Ð° Ð¿Ñ\80ебаÑ\80Ñ\83ваÑ\82е Ð½Ð¸Ð· Ñ\81иÑ\82е Ñ\81одÑ\80жини (вклÑ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ñ\81Ñ\82Ñ\80аниÑ\86и Ð·Ð° Ñ\80азговоÑ\80, Ñ\88аблони, Ð¸Ñ\82н) Ð¸Ð»Ð¸ ÐºÐ¾Ñ\80иÑ\81Ñ\82еÑ\82е Ð³Ð¾ Ð±Ð°Ñ\80аниоÑ\82 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 ÐºÐ°ÐºÐ¾ Ð¿Ñ\80еÑ\84икÑ\81.",
\9eбидеÑ\82е Ñ\81е Ñ\81о Ð´Ð¾Ð´Ð°Ð²Ð°Ñ\9aе Ð½Ð° Ð¿Ñ\80еÑ\82Ñ\81Ñ\82авкаÑ\82а ''all:'' Ð·Ð° Ð´Ð° Ð¿Ñ\80ебаÑ\80Ñ\83ваÑ\82е Ð½Ð¸Ð· Ñ\81иÑ\82е Ñ\81одÑ\80жини (вклÑ\83Ñ\87Ñ\83ваÑ\98Ñ\9cи Ñ\81Ñ\82Ñ\80аниÑ\86и Ð·Ð° Ñ\80азговоÑ\80, Ñ\88аблони, Ð¸Ñ\82н) Ð¸Ð»Ð¸ ÐºÐ¾Ñ\80иÑ\81Ñ\82еÑ\82е Ð³Ð¾ Ð±Ð°Ñ\80аниоÑ\82 Ð¸Ð¼ÐµÐ½Ñ\81ки Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 ÐºÐ°ÐºÐ¾ Ð¿Ñ\80еÑ\82Ñ\81Ñ\82авка.",
 'search-nonefound' => 'Нема резултати што одговараат на бараното.',
 'powersearch' => 'Напредно пребарување',
 'powersearch-legend' => 'Напредно пребарување',
 'powersearch-ns' => 'Пребарај во следниве именски простори:',
-'powersearch-redir' => 'СпиÑ\81ок Ð½Ð° пренасочувања',
+'powersearch-redir' => 'Ð\94аÑ\98 Ð¸ пренасочувања',
 'powersearch-field' => 'Пребарување на',
 'powersearch-togglelabel' => 'Одбери:',
 'powersearch-toggleall' => 'Сè',
@@ -1432,15 +1480,7 @@ $1",
 'searchdisabled' => '{{SITENAME}} пребарувањето е оневозможено.
 Во меѓувреме, можете да пребарувате преку Google.
 Да напоменеме дека нивното индексирање на {{SITENAME}} содржините може да биде застарено.',
-
-# Quickbar
-'qbsettings' => 'Лента за брз избор',
-'qbsettings-none' => 'Без мени',
-'qbsettings-fixedleft' => 'Неподвижна лево',
-'qbsettings-fixedright' => 'Неподвижна десно',
-'qbsettings-floatingleft' => 'Променлива лево',
-'qbsettings-floatingright' => 'Променлива десно',
-'qbsettings-directionality' => 'Непроменливо зададен, во зависност од насоката на пишување на вашиот јазик',
+'search-error' => 'Се појави грешка при пребарувањето: $1',
 
 # Preferences page
 'preferences' => 'Нагодувања',
@@ -1586,6 +1626,7 @@ $1",
 'userrights-changeable-col' => 'Групи кои може да ги промените',
 'userrights-unchangeable-col' => 'Групи кои не може да ги промените',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Спротиставеност во корисничките права. Применете ги промените повторно.',
 
 # Groups
 'group' => 'Група:',
@@ -1594,7 +1635,7 @@ $1",
 'group-bot' => 'Ботови',
 'group-sysop' => 'Администратори',
 'group-bureaucrat' => 'Бирократи',
-'group-suppress' => 'Ð\9dадгледÑ\83вачи',
+'group-suppress' => 'СкÑ\80ивачи',
 'group-all' => '(сите)',
 
 'group-user-member' => 'корисник',
@@ -1602,14 +1643,14 @@ $1",
 '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}}:Ð\9dадгледÑ\83ваÑ\87',
+'grouppage-suppress' => '{{ns:project}}:СкÑ\80иваÑ\9aе',
 
 # Rights
 'right-read' => 'Читање страници',
@@ -1678,7 +1719,7 @@ $1",
 'newuserlogpagetext' => 'Ова е дневник на регистрирани корисници.',
 
 # User rights log
-'rightslog' => 'Ð\94невник Ð½Ð° Ð¼ÐµÐ½Ñ\83ваÑ\9aа Ð½Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки права',
+'rightslog' => 'Ð\94невник Ð½Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87киÑ\82е права',
 'rightslogtext' => 'Ова е дневник на промени на кориснички права.',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1786,9 +1827,9 @@ $1",
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Податотека.jpg]]</nowiki></code>''' за верзија на сликата во целосна големина
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Податотека.png|200px|thumb|left|опис]]</nowiki></code>''' за верзија на сликата со големина од 200 пиксели прикажана во соодветна кутија, со опис како што е наведено во '''опис'''
 * '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Податотека.ogg]]</nowiki></code>''' за директно поврзување со податотеката без нејзино прикажување",
-'upload-permitted' => 'Ð\94озволени Ñ\82ипови Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки: $1.',
-'upload-preferred' => 'Ð\9fÑ\80еÑ\84еÑ\80иÑ\80ани Ñ\82ипови Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки: $1.',
-'upload-prohibited' => 'Ð\97абÑ\80анеÑ\82и Ñ\82ипови Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки: $1.',
+'upload-permitted' => 'Ð\94опÑ\83Ñ\88Ñ\82ени Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еÑ\87ни Ñ\82ипови: $1.',
+'upload-preferred' => 'Ð\9fÑ\80еÑ\82поÑ\87иÑ\82ани Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еÑ\87ни Ñ\82ипови: $1.',
+'upload-prohibited' => 'Ð\9dедопÑ\83Ñ\88Ñ\82ени Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еÑ\87ни Ñ\82ипови: $1.',
 'uploadlog' => 'дневник на подигања',
 'uploadlogpage' => 'Дневник на подигања',
 'uploadlogpagetext' => 'Наведен е список на најновите подигања на податотеки.
@@ -1810,8 +1851,8 @@ $1",
 'filetype-mime-mismatch' => 'Податотечната наставка „.$1“ не одговара на утврдениот MIME-тип на податотеката ($2).',
 'filetype-badmime' => 'Податотеките од MIME-тип „$1“ не се дозволени за подигање.',
 'filetype-bad-ie-mime' => 'Не може да се подигне оваа податотека бидејќи Internet Explorer би можел да го препознае како „$1“, што е оневозможен и потенцијално опасен тип на податотека.',
-'filetype-unwanted-type' => "'''„.$1“''' е непосакуван тип на податотека.
-{{PLURAL:$3|Ð\9fÑ\80еÑ\82поÑ\87иÑ\82ан Ñ\82ип Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ðµ|Ð\9fÑ\80еÑ\82поÑ\87иÑ\82ани Ñ\82ипови Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ñ\81е}} $2.",
+'filetype-unwanted-type' => "'''„.$1“''' е непосакуван податотечен тип.
+{{PLURAL:$3|Се Ð¿Ñ\80еÑ\82поÑ\87иÑ\82а Ñ\82ипоÑ\82|Се Ð¿Ñ\80еÑ\82поÑ\87иÑ\82ааÑ\82 Ñ\82иповиÑ\82е}} $2.",
 'filetype-banned-type' => "'''„.$1“''' не е допуштен тип на податотека.
 {{PLURAL:$3|Допуштен тип е|Допуштени типови се}} $2.",
 'filetype-missing' => 'Податотеката нема наставка (на пр. „.jpg“).',
@@ -1828,9 +1869,9 @@ $1",
 'tmp-write-error' => 'Грешка при запис на привремената податотека.',
 'large-file' => 'Се препорачува податотеките да не бидат поголеми од $1; оваа податотека е $2.',
 'largefileserver' => 'Големината на оваа податотека е поголема од максимално дозволената големина од серверот.',
-'emptyfile' => 'Ð\9fодаÑ\82оÑ\82екаÑ\82а Ñ\88Ñ\82о Ñ\98а Ð¿Ð¾Ð´Ð¸Ð³Ð½Ð°Ð²Ñ\82е Ð¸Ð·Ð³Ð»ÐµÐ´Ð° Ð´ÐµÐºÐ° Ðµ Ð¿Ñ\80азна.
-Ова може да е поради грешка во името на податотеката.
\92е Ð¼Ð¾Ð»Ð¸Ð¼Ðµ Ð¿Ñ\80овеÑ\80еÑ\82е Ð´Ð°Ð»Ð¸ Ð½Ð°Ð²Ð¸Ñ\81Ñ\82ина Ñ\81акаÑ\82е Ð´Ð° Ñ\98а Ð¿Ð¾Ð´Ð¸Ð³Ð½ÐµÑ\82е Ð¾Ð²Ð°а податотека.',
+'emptyfile' => 'Податотеката што ја подигнавте е празна.
+Ова може да се должи на грешка во нејзиното име.
\9fÑ\80овеÑ\80еÑ\82е Ð´Ð°Ð»Ð¸ Ð½Ð°Ð²Ð¸Ñ\81Ñ\82ина Ñ\81акаÑ\82е Ð´Ð° Ñ\98а Ð¿Ð¾Ð´Ð¸Ð³Ð½ÐµÑ\82е Ð²Ð°ÐºÐ²Ð°Ñ\82а податотека.',
 'windows-nonascii-filename' => 'Опслужувачот не поддржува податотечни имиња со специјални знаци.',
 'fileexists' => 'Податотека со ова име веќе постои, проверете <strong>[[:$1]]</strong> ако не сте сигурни дали сакате да го промените.
 [[$1|thumb]]',
@@ -1865,7 +1906,7 @@ $1",
 'uploaddisabledtext' => 'Подигањето на податотеки е оневозможено.',
 'php-uploaddisabledtext' => 'Подигањето на податотеки е оневозможено во PHP. 
 Проверете го нагодувањето file_uploads.',
-'uploadscripted' => 'Податотеката содржи HTML или скриптен код што може да биде погрешно протолкуван од прелистувач.',
+'uploadscripted' => 'Податотеката содржи HTML-код или сценарио што може погрешно да се протолкува во прелистувачот.',
 'uploadvirus' => 'Оваа податотека содржи вирус! Повеќе подробности: $1',
 'uploadjava' => 'Податотеката е од типот ZIP што содржи податотека со наставка .class за Java.
 Подигањето на податотеки за Java не е дозволено, бидејќи со нив можат да се заобиколуваат безбедносните ограничувања.',
@@ -1884,7 +1925,7 @@ $1",
 'filename-prefix-blacklist' => ' #<!-- Не менувајте ја содржината на овој ред - оставете ја како што е --> <pre>
 # Опис на ситнаксата:
 #   * Било што по знакот „#“, па до крајот на редот претставува коментар
-#   * Ð¡ÐµÐºÐ¾Ñ\98 Ñ\80ед Ð¾Ð·Ð½Ð°Ñ\87Ñ\83ва Ð¿Ñ\80еÑ\84икÑ\81 на типични имиња на податотеки што ги доделуваат дигиталните апарати
+#   * Ð¡ÐµÐºÐ¾Ñ\98 Ñ\80ед Ð¾Ð·Ð½Ð°Ñ\87Ñ\83ва Ð¿Ñ\80еÑ\82Ñ\81Ñ\82авка на типични имиња на податотеки што ги доделуваат дигиталните апарати
 CIMG # Casio
 DSC_ # Nikon
 DSCF # Fuji
@@ -2005,7 +2046,6 @@ $1',
 'http-read-error' => 'Грешка при читањето на HTTP.',
 'http-timed-out' => 'HTTP-барањето истече.',
 'http-curl-error' => 'Грешка при добивањето на URL: $1',
-'http-host-unreachable' => 'Не можев да пристапам до URL-адресата',
 'http-bad-status' => 'Се појави проблем во текот на обработката на HTTP-барањето: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2160,11 +2200,11 @@ $1',
 'statistics-users-active-desc' => 'Корисници кои имаат извршено некое дејство {{PLURAL:$1|претходниот ден|во претходните $1 дена}}',
 'statistics-mostpopular' => 'Најпосетувани страници',
 
-'disambiguations' => 'Страници што водат до страници за појаснување',
+'disambiguations' => 'Страници што водат до појаснителни страници',
 'disambiguationspage' => 'Template:Појаснување',
-'disambiguations-text' => "Следните страници имаат барем по една врска што води до '''страница за појаснување'''.
-Наместо тоа, може да имаат врска до посоодветната тема.<br />
-Една страница се смета за страница за појаснување ако го користи шаблонот што води од [[MediaWiki:Disambiguationspage]]",
+'disambiguations-text' => "Следните страници имаат барем по една врска што води до '''појаснителна страница'''.
+Наместо тоа, може да имаат врска до посоодветна страница.<br />
+Една страница се смета за појаснителна ако го користи шаблонот што води од [[MediaWiki:Disambiguationspage]]",
 
 'pageswithprop' => 'Страници со својство',
 'pageswithprop-legend' => 'Страници со својство',
@@ -2188,7 +2228,7 @@ $1',
 
 'withoutinterwiki' => 'Страници без меѓујазични врски',
 'withoutinterwiki-summary' => 'Следните страници немаат врски до други јазични верзии.',
-'withoutinterwiki-legend' => 'Ð\9fÑ\80еÑ\84икÑ\81',
+'withoutinterwiki-legend' => 'Ð\9fÑ\80еÑ\82Ñ\81Ñ\82авка',
 'withoutinterwiki-submit' => 'Прикажи',
 
 'fewestrevisions' => 'Статии со најмалку ревизии',
@@ -2227,7 +2267,7 @@ $1',
 'mostimages' => 'Најмногу врски до податотеки',
 'mostinterwikis' => 'Страници со најмногу меѓувики',
 'mostrevisions' => 'Статии со најмногу верзии',
-'prefixindex' => 'Страници со префикс',
+'prefixindex' => 'Сите страници (со претставка)',
 'prefixindex-namespace' => 'Сите страници со префикс (именски простор $1)',
 'shortpages' => 'Кратки страници',
 'longpages' => 'Долги страници',
@@ -2260,7 +2300,7 @@ $1',
 'nopagetext' => 'Целната страница која ја наведовте не постои.',
 'pager-newer-n' => '{{PLURAL:$1|понова 1|понови $1}}',
 'pager-older-n' => '{{PLURAL:$1|постара 1|постари $1}}',
-'suppress' => 'Ð\9dадзоÑ\80',
+'suppress' => 'СкÑ\80иваÑ\9aе',
 'querypage-disabled' => 'Оваа специјална страница е оневозможена за да не попречува на делотворноста.',
 
 # Book sources
@@ -2279,7 +2319,7 @@ $1',
 'all-logs-page' => 'Сите јавни дневници',
 'alllogstext' => 'Комбиниран приказ на сите расположиви дневници на {{SITENAME}}.
 Можете да го ограничите прикажаното избирајќи тип на дневник, корисничко име (разликува големи и мали букви), или страница (разликува големи и мали букви).',
-'logempty' => 'Ð\9dема Ñ\81оодвеÑ\82ни Ð·Ð°Ð¿Ð¸Ñ\81и Ð²Ð¾ Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ¾Ñ\82.',
+'logempty' => 'Ð\94невникоÑ\82 Ð½ÐµÐ¼Ð° Ð·Ð°Ð¿Ð¸Ñ\81и Ñ\88Ñ\82о Ð¾Ð´Ð³Ð¾Ð²Ð°Ñ\80ааÑ\82 Ð½Ð° Ð¾Ð²Ð°.',
 'log-title-wildcard' => 'Пребарај наслови кои почнуваат со овој текст',
 'showhideselectedlogentries' => 'Прикажи/скриј одбрани записи',
 
@@ -2296,8 +2336,8 @@ $1',
 'allpagesprev' => 'Претходна',
 'allpagesnext' => 'Следна',
 'allpagessubmit' => 'Оди',
-'allpagesprefix' => 'Ð\9fÑ\80икажи Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81о Ð¿Ñ\80еÑ\84икÑ\81:',
-'allpagesbadtitle' => 'Дадениот наслов е неважечки или има меѓујазичен или меѓувики префикс. Може да содржи повеќе знаци кои не смеат да се користат во наслови.',
+'allpagesprefix' => 'Ð\9fÑ\80икажи Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81о Ð¿Ñ\80еÑ\82Ñ\81Ñ\82авка:',
+'allpagesbadtitle' => 'Дадениот наслов е неважечки или има меѓујазичен или меѓувики-претставка. Може да содржи повеќе знаци кои не смеат да се користат во наслови.',
 'allpages-bad-ns' => 'Википедија не содржи именски простор „$1“.',
 'allpages-hide-redirects' => 'Скриј пренасочувања',
 
@@ -2403,11 +2443,11 @@ $1',
 'usermessage-editor' => 'Системски гласник',
 
 # Watchlist
-'watchlist' => 'Ð\9dабљудувања',
+'watchlist' => 'набљудувања',
 'mywatchlist' => 'Набљудувања',
 'watchlistfor2' => 'За $1 $2',
 'nowatchlist' => 'Немате ништо во списокот на набљудувања.',
-'watchlistanontext' => 'Се Ð±Ð°Ñ\80а $1 за да можете да го прегледувате и уредувате списокот на набљудувања.',
+'watchlistanontext' => 'ТÑ\80еба Ð´Ð° Ñ\81Ñ\82е $1 за да можете да го прегледувате и уредувате списокот на набљудувања.',
 'watchnologin' => 'Не сте најавени',
 'watchnologintext' => 'Мора да сте [[Special:UserLogin|најавени]] за да го менувате списокот на набљудувања.',
 'addwatch' => 'Додај во списокот на набљудувања',
@@ -2423,8 +2463,8 @@ $1',
 'notvisiblerev' => 'Ревизијата била избришана',
 'watchnochange' => 'Ниту едно од вашите набљудувања не било уредувано во прикажаниот период.',
 'watchlist-details' => '{{PLURAL:$1|$1 страница|$1 страници}} во вашиот список на набљудувања, не броејќи ги страниците за разговор.',
-'wlheader-enotif' => '* Известување по е-пошта е овозможено.',
-'wlheader-showupdated' => "* Страници кои се променети од вашата последна посета се прикажани со '''задебелени''' букви",
+'wlheader-enotif' => 'Известувањето по е-пошта е вклучено.',
+'wlheader-showupdated' => "Страниците што се изменети од вашата последна посета се прикажани со '''задебелени''' букви",
 'watchmethod-recent' => 'Проверка на скорешните уредувања на набљудуваните страници',
 'watchmethod-list' => 'Проверерка на набљудуваните страници во скорешните уредувања',
 'watchlistcontains' => 'Вашиот список на набљудувања содржи $1 {{PLURAL:$1|страница|страници}}.',
@@ -2497,8 +2537,8 @@ $UNWATCHURL
 'delete-legend' => 'Бришење',
 'historywarning' => "'''Предупредување:''' Страницата што сакате да ја избришете има историја со околу $1 {{PLURAL:$1|ревизија|ревизии}}:",
 'confirmdeletetext' => 'На пат сте трајно да избришете страница заедно со нејзината историја.
-Потврдете дека имате намера да го направите ова, дека ги разбирате последиците од тоа, дека го правите ова во согласност со [[{{MediaWiki:Policy-url}}|политиката]].',
-'actioncomplete' => 'Дејството е спроведено',
+Потврдете дека имате намера да го направите ова, дека ги разбирате последиците од тоа и дека го правите во согласност со [[{{MediaWiki:Policy-url}}|правилата]].',
+'actioncomplete' => 'Дејството е извршено',
 'actionfailed' => 'Неуспешно дејство',
 'deletedtext' => '„$1“ е избришана. Евиденција на скорешните бришења ќе најдете на $2.',
 'dellogpage' => 'Дневник на бришења',
@@ -2512,7 +2552,7 @@ $UNWATCHURL
 ** На барање на авторот
 ** Прекршување на авторски права
 ** Вандализам',
-'delete-edit-reasonlist' => 'Уредување на причини за бришење',
+'delete-edit-reasonlist' => 'Уреди причини за бришење',
 'delete-toobig' => 'Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|ревизија|ревизии}}.
 Бришењето на ваквии страници е забрането со цел {{SITENAME}} да се заштити од оштетувања.',
 'delete-warning-toobig' => 'Оваа страница има долга историја на уредување, преку $1 {{PLURAL:$1|ревизија|ревизии}}.
@@ -2578,7 +2618,7 @@ $UNWATCHURL
 'protect-level-autoconfirmed' => 'Допуштај само автопотврдени корисници',
 'protect-level-sysop' => 'Допуштај само администратори',
 'protect-summary-cascade' => 'каскада',
-'protect-expiring' => 'истекува на $1 (UTC)',
+'protect-expiring' => 'истекува на $2 во $3 ч. (UTC)',
 'protect-expiring-local' => 'истекува $1',
 'protect-expiry-indefinite' => 'бесконечно',
 'protect-cascade' => 'Заштити страници вклучени во оваа страница (каскадна заштита)',
@@ -2731,7 +2771,7 @@ $1',
 'blockip-legend' => 'Блокирај корисник',
 'blockiptext' => 'Користете го долниот образец за да го забраните пристапот за пишување од одредена IP-адреса или корисничко име.
 Ова единствено треба да се прави за да се спречи вандализам, во согласност со [[{{MediaWiki:Policy-url}}|правилата на Википедија]].
\98збеÑ\80еÑ\82е ÐºÐ¾Ð½ÐºÑ\80еÑ\82на Ð¿Ñ\80иÑ\87ина Ð¿Ð¾Ð´Ð¾Ð»Ñ\83 (пÑ\80имеÑ\80: Ñ\86иÑ\82иÑ\80аÑ\9aе Ð½Ð° ÐºÐ¾Ð½ÐºÑ\80еÑ\82ни Ñ\81Ñ\82Ñ\80аниÑ\86и што биле вандализирани).',
\98збеÑ\80еÑ\82е ÐºÐ¾Ð½ÐºÑ\80еÑ\82на Ð¿Ñ\80иÑ\87ина Ð¿Ð¾Ð´Ð¾Ð»Ñ\83 (на Ð¿Ñ\80. Ð½Ð°Ð²ÐµÐ´Ñ\83ваÑ\98Ñ\9cи Ð³Ð¸ Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е што биле вандализирани).',
 'ipadressorusername' => 'IP-адреса или корисничко име:',
 'ipbexpiry' => 'Истек на рокот:',
 'ipbreason' => 'Причина:',
@@ -2849,6 +2889,7 @@ $1',
 'sorbsreason' => 'Вашата IP-адреса е запишана како отворен застапник (proxy) во DNSBL кој го користи {{SITENAME}}..',
 'sorbs_create_account_reason' => 'Вашата IP-адреса е наведена како отворен застапникот (proxy) во DNSBL користена од {{SITENAME}}.
 Не можете да создадете корисничка сметка.',
+'xffblockreason' => 'Блокирана е IP-адреса присутна во заглавието X-Forwarded-For, која е ваша или на застапничкиот опслужувач што го користите. Наведеното образложение гласи: $1',
 'cant-block-while-blocked' => 'Не можете да блокирате други корисници додека и вие самите сте блокирани.',
 'cant-see-hidden-user' => 'Корисникот кој се обидувате да го блокирате е веќе блокиран и сокриен. Бидејќи вие немате права за сокривање на корисник, не можете да ги видите или уредувате корисничките блокирања.',
 'ipbblocked' => 'Не можете да блокирате или одблокирате други корисници бидејќи и самите сте блокирани',
@@ -2919,7 +2960,7 @@ $1',
 'movepagebtn' => 'Премести страница',
 'pagemovedsub' => 'Успешно преместување',
 'movepage-moved' => "'''„$1“ е преместена под името „$2“'''",
-'movepage-moved-redirect' => 'Ð\91еÑ\88е Ð½Ð°Ð¿Ñ\80авено пренасочување.',
+'movepage-moved-redirect' => 'Ð\9dапÑ\80авено Ðµ пренасочување.',
 'movepage-moved-noredirect' => 'Создавањето на пренасочување е оневозможено.',
 'articleexists' => 'Веќе постои страница со тоа име, или името што го одбравте е неважечко.
 Изберете друго име.',
@@ -2947,8 +2988,8 @@ $1',
 Дали сакате да ја избришете за да ослободите место за преместувањето?',
 'delete_and_move_confirm' => 'Да, избриши ја страницата',
 'delete_and_move_reason' => 'Избришано за да се ослободи место за преместувањето од „[[$1]]“',
-'selfmove' => 'СÑ\82Ñ\80аниÑ\86аÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ð¸Ð´Ðµ Ð¿Ñ\80емеÑ\81Ñ\82ена Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ñ\86елниоÑ\82 Ð½Ð°Ñ\81лов Ñ\81е Ñ\81овпаÑ\93а Ñ\81о Ð¿Ñ\80вобиÑ\82ниоÑ\82 Ð½Ð°Ñ\81лов;
-не Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80емеÑ\81Ñ\82и Ñ\81Ñ\82Ñ\80аниÑ\86а Ð²Ð¾ Ñ\81амаÑ\82а Ñ\81ебе.',
+'selfmove' => 'Ð\9fоÑ\98довнаÑ\82а Ð¸ Ñ\86елнаÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81е Ð¸Ñ\81Ñ\82овеÑ\82ни;
+не Ð¼Ð¾Ð¶Ð°Ð¼ Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82ам.',
 'immobile-source-namespace' => 'Не може да се преместуваат страници во именскиот простор „$1“',
 'immobile-target-namespace' => 'Не може да се преместуваат страници во именскиот простор „$1“',
 'immobile-target-namespace-iw' => 'Меѓувики-врска не може да се користи за преименување на страници.',
@@ -3013,6 +3054,8 @@ $1',
 'thumbnail-more' => 'Зголеми',
 'filemissing' => 'Недостасува податотека',
 'thumbnail_error' => 'Грешка при создавање на минијатурата: $1',
+'thumbnail_error_remote' => '$1 пријавува грешка:
+$2',
 'djvu_page_error' => 'Недостапна DjVu страница',
 'djvu_no_xml' => 'Не е можно да се излачи XML за DjVu податотеки',
 'thumbnail-temp-create' => 'Не можам да создадам привремена податотека на минијатурата',
@@ -3164,17 +3207,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/* Тука поставениот CSS ќе се применува врз сите рува */',
-'standard.css' => '/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Стандардно“ */',
-'nostalgia.css' => '/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Носталгија“ */',
 'cologneblue.css' => '/* Тука поставениот CSS ќе се применува врз корисниците што го избрале рувото „Келнско сино“ */',
 'monobook.css' => '/* Тука поставениот CSS ќе се применува врз корисниците на рувото „Монобук“ */',
-'myskin.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Мое руво“ */',
-'chick.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Шик“ */',
-'simple.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Просто“ */',
 'modern.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Современо“ */',
 'vector.css' => '/* Тука поставениот CSS се однесува на корисниците на рувото „Векторско“ */',
 'print.css' => '/* Тука поставениот CSS ќе се применува во верзијата за печатење */',
-'handheld.css' => '/* Тука поставениот CSS ќе се применува во рачните уреди со руво прилагодено во $wgHandheldStyle */',
 'noscript.css' => '/* Тука поставениот CSS се однесува на корисниците што имаат оневозможено JavaScript */',
 'group-autoconfirmed.css' => '/* Тука поставениот CSS ќе се применува само на автопотврдените корисници */',
 'group-bot.css' => '/* Тука поставениот CSS ќе се применува само врз ботовите */',
@@ -3183,13 +3220,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Тука поставениот JavaScript ќе им се вчитува на сите корисници при отворањето на секоја страница. */',
-'standard.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат стандардното руво */',
-'nostalgia.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Носталгија“ */',
 'cologneblue.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Келнско сино“ */',
 'monobook.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Монобук“ */',
-'myskin.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што користат „Мое руво“ */',
-'chick.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Шик“ */',
-'simple.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Просто“ */',
 'modern.js' => '/* Било која Јава скрипта поставена овде ќе биде вчитана за сите корисници што го користат рувото Современо */',
 'vector.js' => '/* Тука поставениот JavaScript  ќе им се вчитува на корисниците што го користат рувото „Векторско“ */',
 'group-autoconfirmed.js' => '/* Тука поставениот JavaScript  ќе им се вчитува само на автопотврдените корисници */',
@@ -3204,7 +3236,7 @@ $1',
 'anonymous' => '{{PLURAL:$1|Анонимен корисник|Анонимни корисници}} на {{SITENAME}}',
 'siteuser' => '{{SITENAME}} корисник $1',
 'anonuser' => '{{SITENAME}} анонимен корисник $1',
-'lastmodifiedatby' => 'Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ðµ Ð¿Ð¾Ñ\81леден Ð¿Ð°Ñ\82 Ð¸Ð·Ð¼ÐµÐ½ÐµÑ\82а Ð½Ð° $1 Ð²Ð¾ $2 Ñ\87. Ð¾Ð´ $3.',
+'lastmodifiedatby' => 'Ð\9fоÑ\81леднаÑ\82а Ð¿Ñ\80омена Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86ава Ðµ Ð¸Ð·Ð²Ñ\80Ñ\88ена Ð½Ð° $1 Ð³ Ð¡Ð²Ð¾ $2 Ñ\87. Ð\9fÑ\80оменаÑ\82а Ñ\98а Ð½Ð°Ð¿Ñ\80ави $3.',
 'othercontribs' => 'Засновано на работата на $1.',
 'others' => 'други',
 'siteusers' => '{{PLURAL:$2|корисникот|корисниците}} на {{SITENAME}} $1',
@@ -3270,13 +3302,8 @@ $1',
 'pageinfo-category-files' => 'Број на податотеки',
 
 # Skin names
-'skinname-standard' => 'Класично',
-'skinname-nostalgia' => 'Носталгија',
 'skinname-cologneblue' => 'Келнско сино',
 'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Мое руво',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'Просто',
 'skinname-modern' => 'Современо',
 'skinname-vector' => 'Векторско',
 
@@ -3361,11 +3388,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минута|$1 минути}}',
 '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' => 'Штотуку',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => 'Форматот е следниот:
 
@@ -3375,8 +3416,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3439,7 +3478,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Висина',
 'exif-bitspersample' => 'Длабочина на бојата',
@@ -3619,7 +3658,7 @@ Variants for Chinese language
 'exif-originalimageheight' => 'Висина на сликата пред кастрењето',
 'exif-originalimagewidth' => 'Ширина на сликата пред кастрењето',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ненабиена',
 'exif-compression-2' => 'CCITT Група 3 1 — Димензионално изменето Хафманово шифрирање по должина на низите',
 'exif-compression-3' => 'CCITT Група 3 — Факс-шифрирање',
@@ -3873,7 +3912,7 @@ Variants for Chinese language
 Вратена е следнава грешка: $1',
 'confirmemail_invalid' => 'Неточен потврден код. 
 Кодот можеби е истечен.',
-'confirmemail_needlogin' => 'Морате да $1 за да ја потврдите вашата е-поштенска адреса.',
+'confirmemail_needlogin' => 'Мора да сте $1 за да ја потврдите е-поштата.',
 'confirmemail_success' => 'Вашата е-поштенска адреса е потврдена.
 Сега можете да се [[Special:UserLogin|најавите]]. Ви посакуваме пријатни мигови на викито!',
 'confirmemail_loggedin' => 'Вашата е-поштенска адреса сега е потврдена.',
@@ -4141,12 +4180,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=mk Статија]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=mk Скрипта]',
 
-# Special:FilePath
-'filepath' => 'Патека до податотека',
-'filepath-page' => 'Податотека:',
-'filepath-submit' => 'Патека',
-'filepath-summary' => 'Оваа специјална страница го враќа целосниот пат на податотеката.
-Сликите се прикажани во изворна големина, другите типови на податотеки се отвораат со соодветните програми, директно.',
+# Special:Redirect
+'redirect' => 'Пренасочување по податотека, корисник или назнака на ревизија',
+'redirect-legend' => 'Пренасочување кон податотека или страница',
+'redirect-summary' => 'Оваа специјална страница пренасочува кон податотека (се задава името), страница (се задава назнаката на ревизијата) или корисничка странца (се задава бројчената назнака на корисникот).',
+'redirect-submit' => 'Оди',
+'redirect-lookup' => 'Пребарај:',
+'redirect-value' => 'Вредност:',
+'redirect-user' => 'Корисничка назнака',
+'redirect-revision' => 'Ревизија на страницата',
+'redirect-file' => 'Име на податотека',
+'redirect-not-exists' => 'Вредноста не е најдена',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Барање на дуплирани податотеки',
@@ -4236,23 +4280,26 @@ $5
 'htmlform-submit' => 'Поднеси',
 'htmlform-reset' => 'Откажи промени',
 'htmlform-selectorother-other' => 'Друго',
+'htmlform-no' => 'Не',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Одберете можност',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 со поддршка за пребарување по цели текстови',
 'sqlite-no-fts' => '$1 без поддршка за пребарување по цели текстови',
 
 # New logging system
-'logentry-delete-delete' => '$1 ја избриша страницата $3',
-'logentry-delete-restore' => '$1 ја врати страницата $3',
-'logentry-delete-event' => '$1 ја измени видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4',
-'logentry-delete-revision' => '$1 ја измени видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
-'logentry-delete-event-legacy' => '$1 ја измени видливоста на настани во дневникот на $3',
-'logentry-delete-revision-legacy' => '$1 ја измени видливоста на ревизии на страницата $3',
-'logentry-suppress-delete' => '$1 ја притаи страницата $3',
-'logentry-suppress-event' => '$1 потајно ја измени видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4',
-'logentry-suppress-revision' => '$1 потајно ја измени видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
-'logentry-suppress-event-legacy' => '$1 потајно ја измени видливоста на настани во дневникот на $3',
-'logentry-suppress-revision-legacy' => '$1 потајно ја измени видливоста на ревизии на страницата $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|ја избриша}} страницата $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|ја возобнови}} страницата $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
+'logentry-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|настан во дневникот|$5 настани во дневникот}} на $3: $4',
+'logentry-suppress-revision' => '$1 потајно {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|ревизија|$5 ревизии}} на страницата $3: $4',
+'logentry-suppress-event-legacy' => '$1 потајно {{GENDER:$2|ја измени}} видливоста на настани во дневникот на $3',
+'logentry-suppress-revision-legacy' => '$1 потајно {{GENDER:$2|ја измени}} видливоста на ревизии на страницата $3',
 'revdelete-content-hid' => 'содржината е скриена',
 'revdelete-summary-hid' => 'описот на уредувањето е скриен',
 'revdelete-uname-hid' => 'корисничкото име е скриено',
@@ -4261,20 +4308,20 @@ $5
 'revdelete-uname-unhid' => 'корисничкото име е скриено',
 'revdelete-restricted' => 'применети ограничувања на администратори',
 'revdelete-unrestricted' => 'отстранети ограничувања за систем оператори',
-'logentry-move-move' => '$1 ја премести страницата $3 на $4',
-'logentry-move-move-noredirect' => '$1 ја премести страницата $3 на $4 без да остави пренасочување',
-'logentry-move-move_redir' => '$1 ја премести страницата $3 на $4 презапишувајќи врз пренасочување',
-'logentry-move-move_redir-noredirect' => '$1 ја премести страницата $3 на $4 презапишувајќи врз пренасочување без да остави пренасочување',
-'logentry-patrol-patrol' => '$1 ја означи ревизијата $4 на страницата $3 како испатролирана',
-'logentry-patrol-patrol-auto' => '$1 автоматски ја означи ревизијата $4 на страницата $3 како испатролирана',
-'logentry-newusers-newusers' => 'Направена е корисничката сметка $1',
-'logentry-newusers-create' => 'Направена е корисничката сметка $1',
-'logentry-newusers-create2' => 'Направена е корисничката сметка $3; создавач: $1',
-'logentry-newusers-byemail' => '$1 ја создаде корисничката сметка $3. Лозинката ви ја испративме по е-пошта',
-'logentry-newusers-autocreate' => 'СмеÑ\82каÑ\82а $1 Ðµ Ñ\81оздадена Ð°Ð²Ñ\82омаÑ\82Ñ\81ки',
-'logentry-rights-rights' => '$1 го смени групното членство за $3 од $4 во $5',
-'logentry-rights-rights-legacy' => '$1 го смени групното членство за $3',
-'logentry-rights-autopromote' => '$1 Ðµ Ð°Ð²Ñ\82омаÑ\82Ñ\81ки Ñ\83напÑ\80еден од $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|ја премести}} страницата $3 на $4 презапишувајќи врз пренасочување',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|ја премести}} страницата $3 на $4 презапишувајќи врз пренасочување без да остави пренасочување',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|ја означи}} ревизијата $4 на страницата $3 како испатролирана',
+'logentry-patrol-patrol-auto' => '$1 автоматски {{GENDER:$2|ја означи}} ревизијата $4 на страницата $3 како испатролирана',
+'logentry-newusers-newusers' => '{{GENDER:$2|Направена}} корисничката сметка $1',
+'logentry-newusers-create' => '{{GENDER:$2|Направена}} корисничката сметка $1',
+'logentry-newusers-create2' => '{{GENDER:$2|Направена}} корисничката сметка $3 од $1',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|ја направи}} корисничката сметка $3. Лозинката ви ја испративме по е-пошта',
+'logentry-newusers-autocreate' => 'Ð\90вÑ\82омаÑ\82Ñ\81ки {{GENDER:$2|Ñ\81оздадена}} ÐºÐ¾Ñ\80иÑ\81ниÑ\87каÑ\82а Ñ\81меÑ\82ка $1',
+'logentry-rights-rights' => '$1 {{GENDER:$2|го измени}} групното членство на $3 од $4 во $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|го измени}} групното членство во $3',
+'logentry-rights-autopromote' => '$1 Ð°Ð²Ñ\82омаÑ\82Ñ\81ки {{GENDER:$2|Ñ\83напÑ\80еден|Ñ\83напÑ\80едена}} од $4 во $5',
 'rightsnone' => '(нема)',
 
 # Feedback
index 83a8cc4..17c41e4 100644 (file)
@@ -19,6 +19,7 @@
  * @author Krenair
  * @author Manjith Joseph <manjithkaini@gmail.com>
  * @author Naveen Sankar
+ * @author Nemo bis
  * @author Praveen Prakash <me.praveen@gmail.com>
  * @author Praveenp
  * @author Sadik Khalid
@@ -139,6 +140,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'ഞാൻഅപ്‌ലോഡ്‌ചെയ്തവ' ),
        'Newimages'                 => array( 'പുതിയ_പ്രമാണങ്ങൾ', 'പുതിയ_ചിത്രങ്ങൾ' ),
        'Newpages'                  => array( 'പുതിയ_താളുകൾ' ),
+       'PagesWithProp'             => array( 'താളുകളുടെഉള്ളടക്കപ്രത്യേകതകൾ' ),
        'PasswordReset'             => array( 'രഹസ്യവാക്ക്‌‌പുനക്രമീകരണം' ),
        'PermanentLink'             => array( 'സ്ഥിരംകണ്ണി' ),
        'Popularpages'              => array( 'ജനപ്രിയതാളുകൾ' ),
@@ -318,6 +320,7 @@ $magicWords = array(
        'pagesize'                  => array( '1', 'താൾവലിപ്പം', 'PAGESIZE' ),
        'index'                     => array( '1', '‌‌__സൂചിക__', '__INDEX__' ),
        'noindex'                   => array( '1', '__സൂചികവേണ്ട__', '__NOINDEX__' ),
+       'numberingroup'             => array( '1', 'ഗണത്തിലെയെണ്ണം', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '_സ്ഥിരസ്ഥിതതിരിച്ചുവിടൽ_', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', 'സംരക്ഷണതലം', 'PROTECTIONLEVEL' ),
        'formatdate'                => array( '0', 'ദിനരേഖീകരണരീതി', 'ദിവസരേഖീകരണരീതി', 'formatdate', 'dateformat' ),
@@ -365,8 +368,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ശ്രദ്ധിക്കുന്ന ഉപയോക്താക്കളുടെ എണ്ണം കാണിക്കുക',
 'tog-oldsig' => 'നിലവിലുള്ള ഒപ്പ്:',
 'tog-fancysig' => 'ഒപ്പ് ഒരു വിക്കി എഴുത്തായി പരിഗണിക്കുക (കണ്ണി സ്വയം ചേർക്കേണ്ടതില്ല)',
-'tog-externaleditor' => 'സ്വതേ ബാഹ്യ എഡിറ്റർ ഉപയോഗിക്കുക (വിദഗ്ദ്ധ ഉപയോക്താക്കൾക്കു മാത്രം, താങ്കളുടെ കമ്പ്യൂട്ടറിൽ പ്രത്യേക സജ്ജീകരണങ്ങൾ ആവശ്യമാണ്. [//www.mediawiki.org/wiki/Manual:External_editors കൂടുതൽ വിവരങ്ങൾ.])',
-'tog-externaldiff' => 'വ്യത്യാസം അറിയാൻ സ്വതേ ബാഹ്യ ഉപകരണങ്ങൾ ഉപയോഗിക്കുക (വിദഗ്ദ്ധ ഉപയോക്താക്കൾക്കു മാത്രം, താങ്കളുടെ കമ്പ്യൂട്ടറിൽ പ്രത്യേക സജ്ജീകരണങ്ങൾ ആവശ്യമാണ്. [//www.mediawiki.org/wiki/Manual:External_editors കൂടുതൽ വിവരങ്ങൾ.])',
 'tog-showjumplinks' => '"പോവുക" ഗമ്യത കണ്ണികൾ പ്രാപ്തമാക്കുക',
 'tog-uselivepreview' => 'തത്സമയ പ്രിവ്യൂ ഉപയോഗപ്പെടുത്തുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്) (പരീക്ഷണാടിസ്ഥാനം)',
 'tog-forceeditsummary' => 'തിരുത്തലുകളുടെ ചുരുക്കം നൽകിയില്ലെങ്കിൽ എന്നെ ഓർമ്മിപ്പിക്കുക',
@@ -380,6 +381,7 @@ $messages = array(
 'tog-diffonly' => 'രണ്ട് പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസത്തിനു താഴെ താളിന്റെ ഉള്ളടക്കം കാണിക്കരുത്.',
 'tog-showhiddencats' => 'മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങളെ കാണിക്കുക',
 'tog-norollbackdiff' => 'റോൾബാക്കിനു ശേഷം വ്യത്യാസം കാണിക്കാതിരിക്കുക',
+'tog-useeditwarning' => 'സേവ് ചെയ്യാത്ത മാറ്റങ്ങളോടു കൂടിയ തിരുത്തൽ താളിൽ നിന്നും പോകുമ്പോൾ എന്നെ അറിയിക്കുക',
 
 'underline-always' => 'എല്ലായ്പ്പോഴും',
 'underline-never' => 'ഒരിക്കലും അരുത്',
@@ -443,6 +445,18 @@ $messages = array(
 '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',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|വർഗ്ഗം|വർഗ്ഗങ്ങൾ}}',
@@ -452,7 +466,7 @@ $messages = array(
 'category-empty' => "''ഈ വർഗ്ഗത്തിൽ താളുകളോ പ്രമാണങ്ങളോ ഇല്ല.''",
 'hidden-categories' => '{{PLURAL:$1|മറഞ്ഞിരിക്കുന്ന വർഗ്ഗം|മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങൾ}}',
 'hidden-category-category' => 'മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങൾ',
-'category-subcat-count' => '{{PLURAL:$2|à´\88 à´µàµ¼à´\97àµ\8dà´\97à´¤àµ\8dതിനàµ\81 à´¤à´¾à´´àµ\86 à´¨àµ½à´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´\92à´°àµ\81 à´\89പവർà´\97àµ\8dà´\97à´\82 à´®à´¾à´¤àµ\8dരമാണàµ\81à´³àµ\8dളതàµ\8d.|à´\88 à´µàµ¼à´\97àµ\8dà´\97à´¤àµ\8dതിനàµ\8d ആകെ $2 ഉപവർഗ്ഗങ്ങൾ ഉള്ളതിൽ {{PLURAL:$1|ഒരു ഉപവർഗ്ഗം|$1 ഉപവർഗ്ഗങ്ങൾ}}, താഴെക്കൊടുത്തിരിക്കുന്നു.}}',
+'category-subcat-count' => '{{PLURAL:$2|à´\88 à´µàµ¼à´\97àµ\8dà´\97à´¤àµ\8dതിൽ à´¤à´¾à´´àµ\86 à´¨àµ½à´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´\92à´°àµ\81 à´\89പവർà´\97àµ\8dà´\97à´\82 à´®à´¾à´¤àµ\8dരമാണàµ\81à´³àµ\8dളതàµ\8d.|à´\88 à´µàµ¼à´\97àµ\8dà´\97à´¤àµ\8dതിൽ ആകെ $2 ഉപവർഗ്ഗങ്ങൾ ഉള്ളതിൽ {{PLURAL:$1|ഒരു ഉപവർഗ്ഗം|$1 ഉപവർഗ്ഗങ്ങൾ}}, താഴെക്കൊടുത്തിരിക്കുന്നു.}}',
 'category-subcat-count-limited' => 'ഈ വർഗ്ഗത്തിനു താഴെ നൽകിയിരിക്കുന്ന {{PLURAL:$1|ഉപവർഗ്ഗമുണ്ട്|$1 ഉപവർഗ്ഗങ്ങളുണ്ട്}}.',
 'category-article-count' => '{{PLURAL:$2|ഈ വർഗ്ഗത്തിൽ താഴെ നൽകിയിരിക്കുന്ന ഒരു താൾ മാത്രമാണുള്ളത്.|ഈ വർഗ്ഗത്തിൽ $2 താളുകളുള്ളതിൽ {{PLURAL:$1|ഒരു താൾ|$1 എണ്ണം}} താഴെ നൽകിയിരിക്കുന്നു.}}',
 'category-article-count-limited' => 'ഈ വർഗ്ഗത്തിൽ താഴെ നൽകിയിരിക്കുന്ന {{PLURAL:$1|ഒരു താൾ ഉണ്ട്|$1 താളുകൾ ഉണ്ട്}}.',
@@ -750,9 +764,18 @@ $2',
 'welcomecreation-msg' => 'താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.
 താങ്കളുടെ [[Special:Preferences|{{SITENAME}} ക്രമീകരണങ്ങളിൽ]] മാറ്റം വരുത്താൻ മറക്കരുത്.',
 'yourname' => 'ഉപയോക്തൃനാമം:',
+'userlogin-yourname' => 'ഉപയോക്തൃനാമം',
+'userlogin-yourname-ph' => 'താങ്കളുടെ ഉപയോക്തൃനാമം നൽകുക',
 'yourpassword' => 'രഹസ്യവാക്ക്:',
+'userlogin-yourpassword' => 'രഹസ്യവാക്ക്',
+'userlogin-yourpassword-ph' => 'താങ്കളുടെ രഹസ്യവാക്ക് നൽകുക',
+'createacct-yourpassword-ph' => 'രഹസ്യവാക്ക് നൽകുക',
 'yourpasswordagain' => 'രഹസ്യവാക്ക് ഒരിക്കൽക്കൂടി:',
+'createacct-yourpasswordagain' => 'രഹസ്യവാക്ക് സ്ഥിരീകരിക്കുക',
+'createacct-yourpasswordagain-ph' => 'രഹസ്യവാക്ക് വീണ്ടും നൽകുക',
 'remembermypassword' => 'എന്റെ പ്രവേശനം ഈ ബ്രൗസറിൽ ({{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}) ഓർത്തുവെക്കുക',
+'userlogin-remembermypassword' => 'ഞാൻ പ്രവേശിച്ചതായി തന്നെ നിലനിർത്തുക',
+'userlogin-signwithsecure' => 'സുരക്ഷിത കണൿഷൻ ഉപയോഗിക്കുക',
 'securelogin-stick-https' => 'പ്രവേശനത്തിനു ശേഷവും എച്ച്.റ്റി.റ്റി.പി.എസ്. തന്നെ ഉപയോഗിക്കുക',
 'yourdomainname' => 'താങ്കളുടെ ഡൊമെയിൻ:',
 'password-change-forbidden' => 'ഈ വിക്കിയിൽ രഹസ്യവാക്കുകൾ മാറ്റാനാവില്ല.',
@@ -765,18 +788,38 @@ $2',
 'logout' => 'ലോഗൗട്ട്',
 'userlogout' => 'ലോഗൗട്ട്',
 'notloggedin' => 'പ്രവേശിച്ചിട്ടില്ല',
+'userlogin-noaccount' => 'അംഗത്വമില്ലേ?',
+'userlogin-joinproject' => '{{SITENAME}} സം‌രംഭത്തിൽ ചേരുക',
 'nologin' => "അംഗത്വമില്ലേ? '''$1'''.",
 'nologinlink' => 'ഒരംഗത്വമെടുക്കുക',
 'createaccount' => 'അംഗത്വമെടുക്കുക',
 'gotaccount' => "താങ്കൾക്ക് അംഗത്വമുണ്ടോ? '''$1'''.",
 'gotaccountlink' => 'പ്രവേശിക്കുക',
 'userlogin-resetlink' => 'താങ്കളുടെ ലോഗിൻ വിവരങ്ങൾ മറന്നു പോയോ?',
+'userlogin-resetpassword-link' => 'താങ്കളുടെ രഹസ്യവാക്ക് പുനഃസജ്ജീകരിക്കുക',
+'helplogin-url' => 'Help:പ്രവേശനം',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|പ്രവേശന സഹായം]]',
+'createacct-join' => 'താങ്കളെപ്പറ്റിയുള്ള വിവരങ്ങൾ താഴെ നൽകുക.',
+'createacct-emailrequired' => 'ഇമെയിൽ വിലാസം',
+'createacct-emailoptional' => 'ഇമെയിൽ വിലാസം (നിർബന്ധമില്ല)',
+'createacct-email-ph' => 'താങ്കളുടെ ഇമെയിൽ വിലാസം നൽകുക',
 'createaccountmail' => 'താത്കാലികമായ ക്രമരഹിത രഹസ്യവാക്ക് ഉപയോഗിക്കാനനുവാദം നൽകുകയും അത് താഴെ വ്യക്തമാക്കിയിരിക്കുന്ന ഇമെയിൽ വിലാസത്തിലേയ്ക്ക് അയക്കുകയും ചെയ്യുക',
+'createacct-realname' => 'ശരിയായ പേര് (നിർബന്ധമില്ല)',
 'createaccountreason' => 'കാരണം:',
+'createacct-reason' => 'കാരണം',
+'createacct-reason-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|ചെയ്തയാൾ|ചെയ്തവർ}}',
 'badretype' => 'താങ്കൾ നൽകിയ രഹസ്യവാക്കുകൾ സമമല്ല.',
 'userexists' => 'നൽകിയ ഉപയോക്തൃനാമം മുമ്പേ നിലവിലുണ്ട്.
 ദയവായി മറ്റൊരു ഉപയോക്തൃനാമം തിരഞ്ഞെടുക്കുക.',
 'loginerror' => 'പ്രവേശനം സാധിച്ചില്ല',
+'createacct-error' => 'അംഗത്വസൃഷ്ടിക്കിടെ പിഴവുണ്ടായി',
 'createaccounterror' => 'അംഗത്വമെടുക്കാൻ കഴിഞ്ഞില്ല:$1',
 'nocookiesnew' => 'ഉപയോക്തൃഅംഗത്വം ഉണ്ടാക്കിയിരിക്കുന്നു. പക്ഷെ താങ്കൾ ലോഗിൻ ചെയ്തിട്ടില്ല. {{SITENAME}} സംരംഭത്തിൽ ലോഗിൻ ചെയ്യുവാൻ കുക്കികൾ സജ്ജമാക്കിയിരിക്കണം. താങ്കളുടെ കമ്പ്യൂട്ടറിൽ നിലവിൽ കുക്കികൾ ഡിസേബിൾ ചെയ്തിരിക്കുന്നു. അതു എനേബിൾ ചെയ്തു താങ്കളുടെ ഉപയോക്തൃനാമവും രഹസ്യവാക്കും ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യൂ.',
 'nocookieslogin' => '{{SITENAME}} സംരംഭത്തിൽ ലോഗിൻ ചെയ്യുവാൻ കുക്കികൾ സജ്ജമാക്കിയിരിക്കണം. പക്ഷെ താങ്കൾ കുക്കികൾ സജ്ജമാക്കിയിട്ടില്ല. കുക്കികൾ സജ്ജമാക്കിയതിനു ശേഷം വീണ്ടും ലോഗിൻ ചെയ്യാൻ ശ്രമിക്കൂ.',
@@ -854,13 +897,15 @@ $2',
 'resetpass-wrong-oldpass' => 'താത്കാലികമായി ലഭിച്ച അല്ലെങ്കിൽ നിലവിലുള്ളതായി നൽകിയ രഹസ്യവാക്ക് അസാധുവാണ്.
 താങ്കൾ രഹസ്യവാക്ക് വിജയകരമായി മാറ്റിയിട്ടുണ്ടാകാം അല്ലെങ്കിൽ പുതിയ താത്കാലിക രഹസ്യവാക്ക് അഭ്യർത്ഥിച്ചിട്ടുണ്ടാകാം.',
 'resetpass-temp-password' => 'താത്കാലിക രഹസ്യവാക്ക്:',
+'resetpass-abort-generic' => 'രഹസ്യവാക്ക് മാറ്റുന്നത് ഒരു അനുബന്ധം തടഞ്ഞിരിക്കുന്നു.',
 
 # Special:PasswordReset
 'passwordreset' => 'രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
-'passwordreset-text' => 'രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാനായി ഈ ഫോം പൂരിപ്പിക്കുക.',
+'passwordreset-text-one' => 'രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാനായി ഈ ഫോം പൂരിപ്പിക്കുക.',
+'passwordreset-text-many' => '{{PLURAL:$1|താങ്കളുടെ രഹസ്യവാക്ക് പുനസജ്ജീകരിക്കാൻ വിവരശകലം നൽകുക.}}',
 'passwordreset-legend' => 'രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക',
 'passwordreset-disabled' => 'ഈ വിക്കിയിൽ രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കലുകൾ പ്രവർത്തരഹിതമാക്കിയിരിക്കുകയാണ്.',
-'passwordreset-pretext' => '{{PLURAL:$1||താഴെ ഒരു വിവരശകലം നൽകുക}}',
+'passwordreset-emaildisabled' => 'ഈ വിക്കിയിൽ ഇമെയിൽ സൗകര്യങ്ങൾ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.',
 'passwordreset-username' => 'ഉപയോക്തൃനാമം:',
 'passwordreset-domain' => 'ഡൊമൈൻ:',
 'passwordreset-capture' => 'ഫലമായുണ്ടാകുന്ന ഇമെയിൽ കാണണോ?',
@@ -885,7 +930,7 @@ $2
 താത്കാലിക രഹസ്യവാക്ക്: $2',
 'passwordreset-emailsent' => 'ഒരു രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്.',
 'passwordreset-emailsent-capture' => 'രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.',
-'passwordreset-emailerror-capture' => 'താഴàµ\86à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨, à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95ാനായàµ\86à´\99àµ\8dà´\95à´¿à´²àµ\81à´\82, à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8d à´\85യയàµ\8dà´\95àµ\8dà´\95ാൻ à´\95à´´à´¿à´\9eàµ\8dà´\9eà´¿à´²àµ\8dà´²: $1',
+'passwordreset-emailerror-capture' => 'താഴàµ\86à´\95àµ\8dà´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨, à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´ªàµ\81നർസà´\9càµ\8dà´\9càµ\80à´\95à´°à´£ à´\87à´®àµ\86യിൽ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95ാനായàµ\86à´\99àµ\8dà´\95à´¿à´²àµ\81à´\82, à´\85à´¤àµ\8d {{GENDER:$2|à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8d}} à´\85യയàµ\8dà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതàµ\8d à´ªà´°à´¾à´\9cയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fàµ\81: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക',
@@ -1082,12 +1127,15 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 ഇത് മായ്ക്കപ്പെട്ടതായി കാണുന്നു.',
 'edit-conflict' => 'തിരുത്തൽ സമരസപ്പെടായ്ക.',
 'edit-no-change' => 'ഇപ്പോഴുള്ള സ്ഥിതിയിൽ നിന്നു യാതൊരു മാറ്റവും ഇല്ലാത്തതിനാൽ താങ്കളുടെ തിരുത്തലുകൾ തിരസ്കരിക്കപ്പെട്ടിരിക്കുന്നു.',
+'postedit-confirmation' => 'താങ്കളുടെ തിരുത്ത് സേവ് ചെയ്തിരിക്കുന്നു.',
 'edit-already-exists' => 'പുതിയ താൾ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.
 താൾ ഇപ്പോൾ തന്നെ നിലവിലുണ്ട്.',
 'defaultmessagetext' => 'സ്വതേയുള്ള സന്ദേശ എഴുത്ത്',
 'content-failed-to-parse' => '$2 ഉള്ളടക്കം $1 മാതൃകയിൽ പാഴ്സ് ചെയ്യൽ പരാജയപ്പെട്ടു: $3',
 'invalid-content-data' => 'അസാധുവായ ഉള്ളടക്ക ഡേറ്റ',
 'content-not-allowed-here' => '"$1" ഉള്ളടക്കം [[$2]] താളിൽ അനുവദിക്കുന്നില്ല',
+'editwarning-warning' => 'ഈ താളിൽ നിന്നും പോകുന്നത് താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ നഷ്ടപ്പെടാൻ ഇടയാക്കും.
+താങ്കൾ ലോഗിൻ ചെയ്തിട്ടുണ്ടെങ്കിൽ, താങ്കളുടെ ക്രമീകരണങ്ങളിൽ "തിരുത്തൽ" എന്ന ഭാഗത്ത് ചെന്ന് ഈ അറിയിപ്പ് പ്രദർശിപ്പിക്കുന്നത് ഒഴിവാക്കാവുന്നതാണ്.',
 
 # Content models
 'content-model-wikitext' => 'വിക്കിഎഴുത്ത്',
@@ -1370,15 +1418,7 @@ $1",
 'powersearch-togglenone' => 'ഒന്നുംവേണ്ട',
 'search-external' => 'ബാഹ്യ അന്വേഷണം',
 'searchdisabled' => '{{SITENAME}} സം‌രംഭത്തിൽ തിരച്ചിൽ ദുർബലപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾക്ക് ഗൂഗിൾ ഉപയോഗിച്ച് തത്കാലം തിരച്ചിൽ നടത്താവുന്നതാണ്‌. പക്ഷെ ഗൂഗിളിൽ {{SITENAME}} സം‌രംഭത്തിന്റെ സൂചിക കാലഹരണപ്പെട്ടതായിരിക്കാൻ സാദ്ധ്യതയുണ്ട്.',
-
-# Quickbar
-'qbsettings' => 'ദ്രുത സൗകര്യം',
-'qbsettings-none' => 'ഒന്നുമില്ല',
-'qbsettings-fixedleft' => 'സ്ഥിരമായ ഇടത്',
-'qbsettings-fixedright' => 'സ്ഥിരമായ വലത്',
-'qbsettings-floatingleft' => 'ഇടത്തേയ്ക്ക് ഒഴുകി നിൽക്കുക',
-'qbsettings-floatingright' => 'വലത്തേയ്ക്ക് ഒഴുകി നിൽക്കുക',
-'qbsettings-directionality' => 'താങ്കളുടെ ഭാഷയുടെ ലിപിയിൽ എഴുത്തുന്ന ദിശയനുസരിച്ച് ശരിയാക്കിയിരിക്കുന്നു',
+'search-error' => 'തിരയുന്നതിനിടെ ഒരു പിഴവുണ്ടായി: $1',
 
 # Preferences page
 'preferences' => 'ക്രമീകരണങ്ങൾ',
@@ -1522,6 +1562,7 @@ $1",
 'userrights-notallowed' => 'ഉപയോക്താക്കൾക്ക് അവകാശങ്ങൾ കൊടുക്കാനും എടുത്തുകളയാനുമുള്ള അനുമതി താങ്കളുടെ അംഗത്വത്തിനില്ല.',
 'userrights-changeable-col' => 'താങ്കൾക്ക് മാറ്റാവുന്ന സംഘങ്ങൾ',
 'userrights-unchangeable-col' => 'താങ്കൾക്ക് മാറ്റാനാവാത്ത സംഘങ്ങൾ',
+'userrights-conflict' => 'ഉപയോക്തൃ അവകാശങ്ങൾ സമരസപ്പെടായ്കയുണ്ടായി! ദയവായി താങ്കളുടെ മാറ്റങ്ങൾ വീണ്ടും നടപ്പിലാക്കുക.',
 
 # Groups
 'group' => 'സംഘം:',
@@ -1922,7 +1963,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'http-read-error' => 'എച്ച്.റ്റി.റ്റി.പി. വിവരം പ്രദർശിപ്പിക്കുന്നതിൽ പിഴവ്.',
 'http-timed-out' => 'എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥന സമയം കഴിഞ്ഞു.',
 'http-curl-error' => 'യു.ആർ.എൽ. ശേഖരിക്കുന്നതിൽ പിഴവ്: $1',
-'http-host-unreachable' => 'യു.ആർ.എൽ.-ല്‍ എത്തിപ്പെടാന്‍ സാധിച്ചില്ല',
 'http-bad-status' => 'എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥനാ വേളയിൽ ഒരു പിഴവുണ്ടായി: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2081,6 +2121,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'disambiguations-text' => "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ '''വിവക്ഷിതങ്ങൾ താളിലേയ്ക്ക്''' കുറഞ്ഞത് ഒരു കണ്ണിയുണ്ട്. അവ അനുയോജ്യമായ താളിലേയ്ക്ക് കണ്ണിചേർക്കപ്പെടേണ്ടതാവാം. <br />
 [[MediaWiki:Disambiguationspage]] എന്ന താളിൽ കണ്ണി ചേർത്തിട്ടുള്ള ഫലകം ഉപയോഗിക്കുന്ന താളുകളെ വിവക്ഷിതങ്ങൾ താളായി കണക്കാക്കുന്നു.",
 
+'pageswithprop' => 'താളിന്റെ സവിശേഷതകളുള്ള താളുകൾ',
+'pageswithprop-legend' => 'ഒരു താൾ സവിശേഷതയുള്ള താളുകൾ',
 'pageswithprop-submit' => 'പോകൂ',
 
 'doubleredirects' => 'ഇരട്ട തിരിച്ചുവിടലുകൾ',
@@ -2331,8 +2373,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'notvisiblerev' => 'മറ്റൊരു ഉപയോക്താവ് സൃഷ്ടിച്ച അവസാനത്തെ നാൾപ്പതിപ്പ് മായ്ച്ചിരിക്കുന്നു',
 'watchnochange' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ ഒന്നും തന്നെ ഇക്കാലയളവിൽ തിരുത്തപ്പെട്ടിട്ടില്ല.',
 'watchlist-details' => 'സം‌വാദം താളുകൾ ഉൾപ്പെടുത്താതെ {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.',
-'wlheader-enotif' => '* ഇമെയിൽ വിജ്ഞാപനം സാധ്യമാക്കിയിരിക്കുന്നു.',
-'wlheader-showupdated' => "* താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം തിരുത്തപ്പെട്ട താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
+'wlheader-enotif' => 'ഇമെയിൽ അറിയിപ്പുകൾ സജ്ജമാക്കിയിരിക്കുന്നു.',
+'wlheader-showupdated' => "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം മാറ്റം വന്ന താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
 'watchmethod-recent' => 'ശ്രദ്ധിക്കുന്ന താളുകൾക്കുവേണ്ടി പുതിയ മാറ്റങ്ങൾ പരിശോധിക്കുന്നു',
 'watchmethod-list' => 'ശ്രദ്ധിക്കുന്ന താളുകളിലെ പുതിയ മാറ്റങ്ങൾ പരിശോധിക്കുന്നു',
 'watchlistcontains' => 'താങ്കൾ {{PLURAL:$1|താൾ|താളുകൾ}} ശ്രദ്ധിക്കുന്നുണ്ട്.',
@@ -2740,6 +2782,7 @@ $1',
 'proxyblocksuccess' => 'ചെയ്തു കഴിഞ്ഞു.',
 'sorbsreason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്.',
 'sorbs_create_account_reason' => '{{SITENAME}} ഉപയോഗിക്കുന്ന DNSBL ൽ താങ്കളുടെ ഐ.പി. വിലാസം ഒരു ഓപ്പൺ പ്രോക്സിയായാണു രേഖപ്പെടുത്തിട്ടുള്ളത്. താങ്കൾക്ക് അംഗത്വമെടുക്കാൻ സാദ്ധ്യമല്ല.',
+'xffblockreason' => 'എക്സ്-ഫോർവേഡഡ്-ഫോർ ഹെഡറിലെ ഒരു ഐ.പി. വിലാസം, താങ്കളുടേതോ താങ്കൾ ഉപയോഗിക്കുന്ന പ്രോക്സി സെർവറിലേതോ ആകാം, തടയപ്പെട്ടിരിക്കുന്നതാണ്. തടയലിന്റെ കാരണം: $1',
 'cant-block-while-blocked' => 'താങ്കൾ തടയപ്പെട്ടിരിക്കുമ്പോൾ മറ്റുപയോക്താക്കളെ തടയാൻ താങ്കൾക്ക് സാധിക്കില്ല.',
 'cant-see-hidden-user' => 'താങ്കൾ തടയാൻ ശ്രമിക്കുന്ന ഉപയോക്താവ് മുമ്പേ തടയപ്പെടുകയും മറയ്ക്കപ്പെടുകയും ചെയ്യപ്പെട്ടതാണ്. താങ്കൾക്ക് ഉപയോക്താവിനെ മറയ്ക്കാനുള്ള അവകാശം ഇല്ലെങ്കിൽ, ഉപയോക്താവിനെതിരെ ഉള്ള തടയൽ കാണാനോ തിരുത്താനോ കഴിയുന്നതല്ല.',
 'ipbblocked' => 'മറ്റുള്ളവരെ തടയാനോ അവരുടെ തടയൽ നീക്കാനോ താങ്കൾക്ക് കഴിയില്ല. കാരണം താങ്കൾ തന്നെ തടയപ്പെട്ടിരിക്കുകയാണ്',
@@ -2906,6 +2949,7 @@ $1',
 'thumbnail-more' => 'വലുതാക്കി കാണിക്കുക',
 'filemissing' => 'പ്രമാണം നഷ്ടമായിരിക്കുന്നു',
 'thumbnail_error' => 'ലഘുചിത്രം സൃഷ്ടിക്കുന്നതിൽ പിഴവ്: $1',
+'thumbnail_error_remote' => '$1 സംരംഭത്തിൽ നിന്നുള്ള പിഴവ് സന്ദേശം: $2',
 'djvu_page_error' => 'DjVu താൾ പരിധിയ്ക്കു പുറത്താണ്',
 'djvu_no_xml' => 'DjVu പ്രമാണത്തിനു വേണ്ടി XML ശേഖരിക്കുവാൻ പറ്റിയില്ല',
 'thumbnail-temp-create' => 'താത്കാലിക ലഘുചിത്ര പ്രമാണം സൃഷ്ടിക്കാനായില്ല',
@@ -3056,11 +3100,7 @@ $1',
 
 # Stylesheets
 'common.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എല്ലാ ദൃശ്യരൂപങ്ങൾക്കും ബാധകമായിരിക്കും */',
-'standard.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സാർവത്രികം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
-'nostalgia.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ഗൃഹാതുരത്വം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'monobook.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
-'myskin.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എന്റിഷ്ടം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
-'chick.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സുന്ദരി ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'modern.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. നവീനം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'vector.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. വെക്റ്റർ ദൃശ്യരൂപത്തിനു ബാധകമായിരിക്കും*/',
 'noscript.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്., ജാവാസ്ക്രിപ്റ്റ് സജ്ജമാക്കിയിട്ടില്ലാത്ത ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */',
@@ -3151,13 +3191,8 @@ $1',
 'pageinfo-category-files' => 'പ്രമാണങ്ങളുടെ എണ്ണം',
 
 # Skin names
-'skinname-standard' => 'സാർവത്രികം',
-'skinname-nostalgia' => 'ഗൃഹാതുരത്വം',
 'skinname-cologneblue' => 'ക്ലോൺ നീല',
 'skinname-monobook' => 'മോണോബുക്ക്',
-'skinname-myskin' => 'എന്റിഷ്ടം',
-'skinname-chick' => 'സുന്ദരി',
-'skinname-simple' => 'ലളിതം',
 'skinname-modern' => 'നവീനം',
 'skinname-vector' => 'വെക്റ്റർ',
 
@@ -3239,11 +3274,25 @@ $1',
 'minutes' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}}',
 'hours' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}}',
 'days' => '{{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}',
+'weeks' => '{{PLURAL:$1|ഒരാഴ്ച്ച|$1 ആഴ്ച്ച}}',
 'months' => '{{PLURAL:$1|ഒരു മാസം|$1 മാസം}}',
 'years' => '{{PLURAL:$1|ഒരു വർഷം|$1 വർഷം}}',
 'ago' => '$1 മുമ്പ്',
 'just-now' => 'ഇപ്പോൾ',
 
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}} മുൻപ്',
+'minutes-ago' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}} മുൻപ്',
+'seconds-ago' => '{{PLURAL:$1|ഒരു സെക്കന്റ്|$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
 'bad_image_list' => 'എഴുത്ത് രീതി താഴെ കൊടുത്തിരിക്കുന്നു:
 
@@ -3270,7 +3319,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'വീതി',
 'exif-imagelength' => 'ഉയരം',
 'exif-bitspersample' => 'ഓരോ ഘടകത്തിലുമുള്ള ബിറ്റുകൾ',
@@ -3444,7 +3493,7 @@ $1',
 'exif-originalimageheight' => 'വെട്ടിയെടുക്കുന്നതിനു മുമ്പ് ചിത്രത്തിന്റെ ഉയരം',
 'exif-originalimagewidth' => 'വെട്ടിയെടുക്കുന്നതിനു മുമ്പ് ചിത്രത്തിന്റെ വീതി',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ചുരുക്കാത്തത്',
 'exif-compression-5' => 'എൽ.സെഡ്.ഡബ്ല്യു.',
 'exif-compression-6' => 'ജെപിഇജി (പഴയത്)',
@@ -3817,7 +3866,7 @@ $5
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 താൾ|$1 താളുകൾ}} പട്ടികയിൽ നിന്നു മാറ്റിയിരിക്കുന്നു:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'ബനàµ\8dധപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´\95à´¾à´\9fàµ\8dà´\9fുക',
+'watchlisttools-view' => 'ബനàµ\8dധപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´ªàµ\8dരദർശിപàµ\8dപിà´\95àµ\8dà´\95ുക',
 'watchlisttools-edit' => 'ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക കാണുക, തിരുത്തുക',
 'watchlisttools-raw' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയുടെ മൂലരൂപം തിരുത്തുക',
 
@@ -3855,7 +3904,7 @@ $5
 
 ഈ പ്രോഗ്രാമിനൊപ്പം [{{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' => 'à´¸àµ\8bà´«àµ\8dà´±àµ\8dà´±àµ\8dâ\80\8cà´µàµ\86യർ à´\89à´²àµ\8dà´ª്പന്നം',
+'version-software-product' => 'à´\89à´²്പന്നം',
 'version-software-version' => 'വിവരണം',
 'version-entrypoints' => 'പ്രവേശനസ്ഥാന യു.ആർ.എല്ലുകൾ',
 'version-entrypoints-header-entrypoint' => 'പ്രവേശനസ്ഥാനം',
@@ -3863,12 +3912,17 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath ലേഖന പഥം]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath സ്ക്രിപ്റ്റ് പഥം]',
 
-# Special:FilePath
-'filepath' => 'പ്രമാണത്തിലേക്കുള്ള വിലാസം',
-'filepath-page' => 'പ്രമാണം:',
-'filepath-submit' => 'പോകൂ',
-'filepath-summary' => 'ഈ പ്രത്യേക താൾ ഒരു പ്രമാണത്തിന്റെ പൂർണ്ണ വിലാസം പ്രദർശിപ്പിക്കുന്നു.
-ചിത്രങ്ങൾ പൂർണ്ണ റെസലൂഷനോടു കൂടി പ്രദർശിപ്പിച്ചിരിക്കുന്നു. മറ്റുള്ള പ്രമാണ തരങ്ങൾ അതതു പ്രോഗ്രാമിൽ നേരിട്ടു തുറക്കാവുന്നതാണ്‌.',
+# Special:Redirect
+'redirect' => 'പ്രമാണത്താൽ, ഉപയോക്താവിനാൽ അഥവാ നാൾപ്പതിപ്പ് ഐ.ഡി. ചെയ്യുന്ന തിരിച്ചുവിടൽ',
+'redirect-legend' => 'ഒരു പ്രമാണത്തിലോട്ടോ താളിലോട്ടോ ഉള്ള തിരിച്ചുവിടൽ',
+'redirect-summary' => 'ഈ പ്രത്യേക താൾ ഒരു പ്രമാണത്തിലേയ്ക്കോ (പ്രമാണത്തിന്റെ പേര് തന്നിട്ടുണ്ട്), ഒരു താളിലേയ്ക്കോ (നാൾപ്പതിപ്പിന്റെ ഐഡി തന്നിട്ടുണ്ട്), അല്ലെങ്കിൽ ഒരു ഉപയോക്തൃതാളിലേയ്ക്കോ (ഉപയോക്താവിന്റെ സംഖ്യാ ഐ.ഡി. തന്നിട്ടുണ്ട്) തിരിച്ചുവിടുന്നു.',
+'redirect-submit' => 'പോകൂ',
+'redirect-lookup' => 'തേടുക:',
+'redirect-value' => 'വില:',
+'redirect-user' => 'ഉപയോക്തൃ ഐ.ഡി.',
+'redirect-revision' => 'താളിന്റെ നാൾപ്പതിപ്പ്',
+'redirect-file' => 'പ്രമാണത്തിന്റെ പേര്',
+'redirect-not-exists' => 'വില കണ്ടെത്താൻ കഴിഞ്ഞില്ല',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ഒരേ പ്രമാണത്തിന്റെ പലപകർപ്പുകളുണ്ടോയെന്നു തിരയുക',
@@ -3960,6 +4014,9 @@ $5
 'htmlform-submit' => 'സമർപ്പിക്കുക',
 'htmlform-reset' => 'മാറ്റങ്ങൾ വേണ്ട',
 'htmlform-selectorother-other' => 'മറ്റുള്ളവ',
+'htmlform-no' => 'ഇല്ല',
+'htmlform-yes' => 'ശരി',
+'htmlform-chosen-placeholder' => 'ഒരു ഐച്ഛികം തിരഞ്ഞെടുക്കുക',
 
 # SQLite database support
 'sqlite-has-fts' => 'പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1',
index 92299dc..1deb5ea 100644 (file)
@@ -72,8 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Харж буй хэрэглэгчдийн тоог үзүүлэх',
 'tog-oldsig' => 'Одоогийн гарын үсэг:',
 'tog-fancysig' => 'Түүхий гарын үсэг (автомат холбоосгүй)',
-'tog-externaleditor' => 'Үндсэн горимд нэмэлт засварлах багаж хэрэглэх(экспертүүдэд зориулагдсан, таны компьютерт тусгай тохиргоо шаардлагатай)',
-'tog-externaldiff' => 'Үндсэн горим гадаад харьцуулагч программ ашиглах (экспертүүдэд зориулав, таны компьютерт тусгай тохиргоо шаардлагатай)',
 'tog-showjumplinks' => '"Шууд очих" хялбар линкүүдийг ажиллагаатай болгох',
 'tog-uselivepreview' => 'Шууд байдлаар урьдчилж харах (ЖаваСкрипт) (Туршилт)',
 'tog-forceeditsummary' => 'Товч агуулгын талбарыг хоосон үлдээхэд надад мэдэгдэх',
@@ -1097,15 +1095,6 @@ $1",
 Та одоохондоо Google-г ашиглан хайх боломжтой.
 Анхааруулж хэлэхэд, тэдний {{SITENAME}}-н агуулгын индексүүд хоцрогдсон байж магадгүй.',
 
-# Quickbar
-'qbsettings' => 'Шуурхай тавцан',
-'qbsettings-none' => 'Байхгүй',
-'qbsettings-fixedleft' => 'Зүүн талд бэхжүүлсэн',
-'qbsettings-fixedright' => 'Баруун талд бэхжүүлсэн',
-'qbsettings-floatingleft' => 'Зүүн талд хөвсөн',
-'qbsettings-floatingright' => 'Баруун талд хөвсөн',
-'qbsettings-directionality' => 'Тухай хэлний барилаас хамаарч хэлбэрийг бий болгох',
-
 # Preferences page
 'preferences' => 'Хэрэглэгчийн тохиргоо',
 'mypreferences' => 'Миний тохиргоо',
@@ -1659,7 +1648,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization -г харна уу.',
 'http-read-error' => 'HTTP-г унших алдаа.',
 'http-timed-out' => 'HTTP хүсэлтийн хугацаа дуусав.',
 'http-curl-error' => 'Дараах URL-г авчрахад алдаа гарав: $1',
-'http-host-unreachable' => 'URL-д хүрч чадсангүй.',
 'http-bad-status' => 'HTTP хандалтын үед асуудал үүсэв: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2047,8 +2035,8 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'notvisiblerev' => 'Засвар устгагдлаа',
 'watchnochange' => 'Дурьдагдсан хугацаанд таны хянаж буй хуудсуудад өөрчлөлт ороогүй байна.',
 'watchlist-details' => 'Хяналтын жагсаалтад {{PLURAL:$1|$1 хуудас|$1 хуудаснууд}} байна.',
-'wlheader-enotif' => 'И-мэйл мэдэгдэл хүчинтэй боллоо.',
-'wlheader-showupdated' => "Таны хамгийн сүүлд айлчилснаас хойш өөрчлөгдсөн хуудсууд '''тодоор''' бичигдсэн байгаа",
+'wlheader-enotif' => 'И-мэйл мэдэгдэл хүчинтэй боллоо.',
+'wlheader-showupdated' => "Таны хамгийн сүүлд айлчилснаас хойш өөрчлөгдсөн хуудсууд '''тодоор''' бичигдсэн байгаа",
 'watchmethod-recent' => 'хяналтад буй хуудсуудад шинэ өөрчлөлт орсон эсэхийг шалгаж байна',
 'watchmethod-list' => 'хяналтад буй хуудсуудад саяхан өөрчлөлт орсон эсэхийг шалгаж байна',
 'watchlistcontains' => 'Таны хянах жагсаалтанд $1 хуудас байна.',
@@ -2886,7 +2874,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Өргөн',
 'exif-imagelength' => 'Өндөр',
 'exif-bitspersample' => 'Бүрэлдэхүүн хэсэг бүр дэх бит',
@@ -3040,7 +3028,7 @@ $1',
 'exif-giffilecomment' => 'GIF файлын тэмдэглэгээ',
 'exif-intellectualgenre' => 'Зүйлийн төрөл',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Шахагдаагүй',
 
 'exif-unknowndate' => 'Мэдэгдэхгүй огноо',
@@ -3379,13 +3367,6 @@ $5
 'version-software-product' => 'Бүтээгдэхүүн',
 'version-software-version' => 'Хувилбар',
 
-# Special:FilePath
-'filepath' => 'Файлын зам',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Явах',
-'filepath-summary' => 'Энэхүү тусгай хуудас нь файлын бүтэн замыг дуудна.
-Зургууд нь бүтэн хэмжээгээрээ гарах ба бусад файлын төрлүүд нь тохирох програмаараа шууд нээгдэнэ.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Давхардсан файлуудыг хайх',
 'fileduplicatesearch-summary' => 'Хэш кодыг ашиглан давхардсан файлуудын хайна.',
index ef8797a..b05ccc4 100644 (file)
@@ -274,6 +274,9 @@ $messages = array(
 
 'grouppage-sysop' => '{{ns:project}}:Администраторь',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Журнал утилизаторь ной',
+
 # User rights log
 'rightslog' => 'Журнал дрептурь де утилизатор',
 
@@ -363,13 +366,10 @@ $messages = array(
 # Special:LinkSearch
 'linksearch' => 'Легэтурь екстерне',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Журнал утилизаторь ной',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(листэ де мембрь)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Тримите прин поштэ електроникэ ун месаж ачестуй утилизатор',
 
 # Watchlist
index efb0ed4..c0d4672 100644 (file)
@@ -334,9 +334,9 @@ $messages = array(
 'tog-usenewrc' => 'वाढीव अलीकडील बदल वापरा (जावास्क्रीप्टच्या उपलब्धतेची गरज)',
 'tog-numberheadings' => 'शीर्षके स्वयंक्रमांकित करा',
 'tog-showtoolbar' => 'संपादन चिन्हे दाखवा (जावास्क्रीप्ट)',
-'tog-editondblclick' => 'दà¥\8bनवà¥\87ळा à¤\95à¥\8dलà¥\80à¤\95 à¤\95रà¥\81न पान संपादित करा (जावास्क्रीप्ट)',
+'tog-editondblclick' => 'दà¥\8bनवà¥\87ळा à¤\95à¥\8dलिà¤\95 à¤\95रà¥\82न पान संपादित करा (जावास्क्रीप्ट)',
 'tog-editsection' => '[संपादन] दुव्याने संपादन करणे शक्य करा',
-'tog-editsectiononrightclick' => 'विभाà¤\97 à¤¶à¥\80रà¥\8dषà¤\95ावर à¤\89à¤\9cवà¥\8dया à¤\95à¥\8dलà¥\80कने संपादन करा(जावास्क्रीप्ट)',
+'tog-editsectiononrightclick' => 'विभाà¤\97 à¤¶à¥\80रà¥\8dषà¤\95ावर à¤\89à¤\9cवà¥\8dया à¤\95à¥\8dलिकने संपादन करा(जावास्क्रीप्ट)',
 'tog-showtoc' => 'पानात ३ पेक्षा जास्त शीर्षके असल्यास अनुक्रमणिका दाखवा',
 'tog-rememberpassword' => 'माझा प्रवेश या संगणकावर लक्षात ठेवा (जास्तीत जास्त $1 {{PLURAL:$1|दिवसासाठी|दिवसांसाठी}})',
 'tog-watchcreations' => 'मी तयार केलेली पाने माझ्या पहाऱ्याच्या सूचीमध्ये (माझी नित्य पहाण्याची सूची)टाका',
@@ -354,8 +354,6 @@ $messages = array(
 'tog-shownumberswatching' => 'पहारा दिलेले सदस्य दाखवा',
 'tog-oldsig' => 'सध्याची सही:',
 'tog-fancysig' => 'सही विकिसंज्ञा म्हणून वापरा (आपोआप दुव्याशिवाय)',
-'tog-externaleditor' => 'कायम बाह्य संपादक वापरा (फक्त प्रशिक्षित सदस्यांसाठीच, संगणकावर विशेष प्रणाली लागते) ([//www.mediawiki.org/wiki/Manual:External_editors अधिक माहिती])',
-'tog-externaldiff' => 'इतिहास पानावर निवडलेल्या आवृत्त्यांमधील बदल दाखविण्यासाठी बाह्य प्रणाली वापरा (फक्त प्रशिक्षित सदस्यांसाठीच, संगणकावर विशेष प्रणाली लागते) ([//www.mediawiki.org/wiki/Manual:External_editors अधिक माहिती])',
 'tog-showjumplinks' => '"कडे जा" सुगम दुवे, उपलब्ध करा.',
 'tog-uselivepreview' => 'संपादन करता करताच झलक दाखवा (जावास्क्रीप्ट)(प्रयोगक्षम)',
 'tog-forceeditsummary' => 'जर ’बदलांचा आढावा’ दिला नसेल तर मला सूचित करा',
@@ -369,6 +367,7 @@ $messages = array(
 'tog-diffonly' => 'निवडलेल्या आवृत्त्यांमधील बदल दाखवताना जुनी आवृत्ती दाखवू नका.',
 'tog-showhiddencats' => 'लपविलेले वर्ग दाखवा',
 'tog-norollbackdiff' => 'द्रुतमाघार घेतल्यास बदल वगळा',
+'tog-useeditwarning' => 'जर मी संपादित करीत असलेल्या पानावरील माझे संपादिलेले बदल जतन न केल्यास मला इशारा द्या',
 
 'underline-always' => 'नेहेमी',
 'underline-never' => 'कधीच नाही',
@@ -547,7 +546,7 @@ $messages = array(
 'jumpto' => 'येथे जा:',
 'jumptonavigation' => 'सुचालन',
 'jumptosearch' => 'शोध',
-'view-pool-error' => 'माफ à¤\95रा. à¤¯à¤¾à¤µà¥\87ळà¥\87स à¤¸à¤°à¥\8dवà¥\8dहरवर à¤¤à¤¾à¤£ à¤\86हà¥\87. à¤\85नà¥\87à¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¬à¤\98णà¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रà¥\80त आहेत. पुन्हा या पानावर पोचण्यासाठी थोडा वेळ थांबून परत प्रयत्‍न करा.
+'view-pool-error' => 'माफ à¤\95रा. à¤¯à¤¾à¤µà¥\87ळà¥\87स à¤¸à¤°à¥\8dवà¥\8dहरवर à¤¤à¤¾à¤£ à¤\86हà¥\87. à¤\85नà¥\87à¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¬à¤\98णà¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रित आहेत. पुन्हा या पानावर पोचण्यासाठी थोडा वेळ थांबून परत प्रयत्‍न करा.
 $1',
 'pool-timeout' => 'ताळ्यासाठी वाट पाहताना वेळ संपली',
 'pool-queuefull' => 'सर्व्हरवर ताण आहे.',
@@ -575,7 +574,7 @@ $1',
 
 'badaccess' => 'परवानगी नाकारण्यात आली आहे',
 'badaccess-group0' => 'तुम्ही करत असलेल्या क्रियेचे तुम्हाला अधिकार नाहीत.',
-'badaccess-groups' => 'à¤\86पण à¤µà¤¿à¤¨à¥\80त à¤\95à¥\87लà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤\96ालà¥\80ल {{PLURAL:$2|समà¥\82हासाठà¥\80|पà¥\88à¤\95à¥\80 à¤\8fà¤\95ा à¤¸à¤®à¥\82हासाठà¥\80}} à¤®à¤°à¥\8dयादà¥\80त आहे: $1.',
+'badaccess-groups' => 'à¤\86पण à¤µà¤¿à¤¨à¥\80त à¤\95à¥\87लà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤\96ालà¥\80ल {{PLURAL:$2|समà¥\82हासाठà¥\80|पà¥\88à¤\95à¥\80 à¤\8fà¤\95ा à¤¸à¤®à¥\82हासाठà¥\80}} à¤®à¤°à¥\8dयादित आहे: $1.',
 
 'versionrequired' => 'मीडियाविकीच्या $1 आवृत्तीची गरज आहे.',
 'versionrequiredtext' => 'हे पान वापरण्यासाठी मीडियाविकीच्या $1 आवृत्तीची गरज आहे. पहा [[Special:Version|आवृत्ती यादी]].',
@@ -630,7 +629,7 @@ $1',
 'nosuchaction' => 'अशी कृती अस्तित्वात नाही',
 'nosuchactiontext' => 'URL ने सांगितलेली कृती चुकीची आहे.
 तुम्ही कदाचित URL चुकीची दिली असेल, किंवा चुकीच्या दुव्यावर टिचकी दिली असेल.
-à¤\95दाà¤\9aित à¤¹à¥\80 à¤\95à¥\83तà¥\80 {{SITENAME}} à¤®à¤§à¥\80ल à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤¸à¥\81दà¥\8dधा à¤¦à¤°à¥\8dशवित असेल.',
+à¤\95दाà¤\9aित à¤¹à¥\80 à¤\95à¥\83तà¥\80 {{SITENAME}} à¤®à¤§à¥\80ल à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤¸à¥\81दà¥\8dधा à¤¦à¤°à¥\8dशवà¥\80त असेल.',
 'nosuchspecialpage' => 'असे कोणतेही विशेष पृष्ठ अस्तित्वात नाही',
 'nospecialpagetext' => '<strong>आपण केलेली विनंती अयोग्य विशेषपानासंबंधी आहे.</strong>
 
@@ -652,9 +651,9 @@ MySQL returned error "$3: $4".',
 'laggedslavemode' => 'सुचना: पानावर नवीन बदल नसतील.',
 'readonly' => 'विदागारास (database) ताळे आहे.',
 'enterlockreason' => 'विदागारास ताळे ठोकण्याचे कारण, ताळे उघडले जाण्याच्या अदमासे कालावधीसहीत द्या.',
-'readonlytext' => 'बहà¥\81धा à¤µà¤¿à¤¦à¤¾à¤\97ार à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dसà¤\95रिता à¤¨à¤µà¥\80न à¤­à¤° à¤\98ालणà¥\8dयापासà¥\82न à¤\86णि à¤\87तर à¤¬à¤¦à¤² à¤\95रणà¥\8dयापासà¥\82न à¤¬à¤\82द à¤ à¥\87वणà¥\8dयात à¤\86ला à¤\86हà¥\87, à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dसनà¤\82तर à¤¤à¥\8b à¤¨à¤¿à¤¯à¤®à¥\80त होईल.
+'readonlytext' => 'बहà¥\81धा à¤µà¤¿à¤¦à¤¾à¤\97ार à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dसà¤\95रिता à¤¨à¤µà¥\80न à¤­à¤° à¤\98ालणà¥\8dयापासà¥\82न à¤\86णि à¤\87तर à¤¬à¤¦à¤² à¤\95रणà¥\8dयापासà¥\82न à¤¬à¤\82द à¤ à¥\87वणà¥\8dयात à¤\86ला à¤\86हà¥\87, à¤®à¥\87à¤\82à¤\9fà¥\87ननà¥\8dसनà¤\82तर à¤¤à¥\8b à¤¨à¤¿à¤¯à¤®à¤¿त होईल.
 
-ताळà¥\87 à¤ à¥\8bà¤\95णाऱà¥\8dया à¤ªà¥\8dरबà¤\82धà¤\95ाà¤\82नà¥\80 à¤\96ालà¥\80ल à¤\95ारण à¤¨à¤®à¥\81द केले आहे: $1',
+ताळà¥\87 à¤ à¥\8bà¤\95णाऱà¥\8dया à¤ªà¥\8dरबà¤\82धà¤\95ाà¤\82नà¥\80 à¤\96ालà¥\80ल à¤\95ारण à¤¨à¤®à¥\82द केले आहे: $1',
 'missing-article' => 'डाटाबेसला "$1" $2 नावाचे पान मिळालेले नाही, जे मिळायला हवे होते.
 
 असे बहुदा संपुष्टात आलेल्या फरकामुळे किंवा वगळलेल्या पानाच्या इतिहास दुव्यामुळे घडते.
@@ -679,10 +678,10 @@ MySQL returned error "$3: $4".',
 'badarticleerror' => 'या पानावर ही कृती करता येत नाही.',
 'cannotdelete' => '$1 हे पान किंवा संचिका वगळता आलेली नाही. (आधीच इतर कुणी वगळले असण्याची शक्यता आहे.)',
 'cannotdelete-title' => '$1 ला वगळू शकत नाहि',
-'delete-hook-aborted' => 'à¤\96à¥\8bडणà¥\8dयाà¤\9aà¥\80  à¤\95à¥\8dरिया à¤®à¤§à¥\87à¤\9a à¤¥à¤¾à¤\82बवà¥\80ण्यात येत आहे.
+'delete-hook-aborted' => 'à¤\96à¥\8bडणà¥\8dयाà¤\9aà¥\80  à¤\95à¥\8dरिया à¤®à¤§à¥\87à¤\9a à¤¥à¤¾à¤\82बविण्यात येत आहे.
 कोणतेही कारण देण्यात आले नाही',
 'badtitle' => 'चुकीचे शीर्षक',
-'badtitletext' => 'à¤\86पण à¤®à¤¾à¤\97ितलà¥\87लà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤¾à¤¨ à¤\85यà¥\8bà¤\97à¥\8dय, à¤°à¤¿à¤\95ामà¥\87 à¤\85थवा à¤\9aà¥\82à¤\95à¥\80ने जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीर्षक आहे. त्यात एक किंवा अधिक शीर्षकअयोग्य चिन्हे आहेत.',
+'badtitletext' => 'à¤\86पण à¤®à¤¾à¤\97ितलà¥\87लà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤¾à¤¨ à¤\85यà¥\8bà¤\97à¥\8dय, à¤°à¤¿à¤\95ामà¥\87 à¤\85थवा à¤\9aà¥\81à¤\95िने जोडलेले आंतर-भाषिय किंवा आंतर-विकि शीर्षक आहे. त्यात एक किंवा अधिक शीर्षकअयोग्य चिन्हे आहेत.',
 'perfcached' => 'खालील माहिती सयीमध्ये(कॅशे) ठेवली आहे त्यामुळे ती नवीनतम {{PLURAL:$1|one result is|$1 results }} नसावी.',
 'perfcachedts' => 'खालील माहिती सयीमध्ये(कॅशे) ठेवली आहे आणि शेवटी $1 ला {{PLURAL:$4|one result is|$4 results}} बदलली होती.',
 'querypage-no-updates' => 'सध्या या पाना करिता नवीसंस्करणे अनुपलब्ध केली आहेत.आत्ताच येथील विदा ताजा होणार नाही.',
@@ -692,8 +691,8 @@ MySQL returned error "$3: $4".',
 'viewsource' => 'स्रोत पहा',
 'viewsource-title' => '$1 चा उगम बघा',
 'actionthrottled' => 'कृती अवरूद्ध (throttle) केली',
-'actionthrottledtext' => 'à¤\86à¤\82तरà¤\9cाल-à¤\9aिà¤\96लणà¥\80 à¤µà¤¿à¤°à¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(anti-spam measure), à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धà¥\80त करण्यात आले आहे, आणि आपण या मर्यादेचे उल्लंघन केले आहे. कृपया थोड्या वेळाने पुन्हा प्रयत्न करा.',
-'protectedpagetext' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¬à¤¦à¤² à¤¹à¥\8bà¤\8a à¤¨à¤¯à¥\87त à¤®à¥\8dहणà¥\81न सुरक्षित केले आहे.',
+'actionthrottledtext' => 'à¤\86à¤\82तरà¤\9cाल-à¤\9aिà¤\96लणà¥\80 à¤µà¤¿à¤°à¥\8bधà¥\80 à¤\89पायाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87(anti-spam measure), à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤¥à¥\8bडà¥\8dया à¤\95ालावधà¥\80त à¤\85सà¤\82à¤\96à¥\8dयवà¥\87ळा à¤\95रणà¥\8dयापासà¥\82न à¤¤à¥\81मà¥\8dहाला à¤ªà¥\8dरतिबà¤\82धित करण्यात आले आहे, आणि आपण या मर्यादेचे उल्लंघन केले आहे. कृपया थोड्या वेळाने पुन्हा प्रयत्न करा.',
+'protectedpagetext' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¬à¤¦à¤² à¤¹à¥\8bà¤\8a à¤¨à¤¯à¥\87त à¤®à¥\8dहणà¥\82न सुरक्षित केले आहे.',
 'viewsourcetext' => 'तुम्ही या पानाचा स्रोत पाहू शकता व प्रत करू शकता:',
 'viewyourtext' => 'तुम्ही या पानाचे स्त्रोत पाहू शकता व प्रत करू शकता',
 'protectedinterface' => 'हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.',
@@ -702,10 +701,10 @@ MySQL returned error "$3: $4".',
 'cascadeprotected' => 'हे पान संपादनांपासून सुरक्षित केले गेलेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे, की जे पान/जी पाने शिडी पर्यायाने सुरक्षित आहेत:
 $2',
 'namespaceprotected' => "'''$1''' नामविश्वातील पाने बदलण्याची आपणांस परवानगी नाही.",
-'customcssprotected' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\8dया à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤ªà¤¸à¤\82तà¥\80 à¤\85सलà¥\8dयामà¥\81ळà¥\87, à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87 à¤¸à¥\80à¤\8fसà¤\8fस à¤ªà¤¾à¤¨ à¤¸à¤\82पादà¥\80त करण्याची परवानगी नाही.',
-'customjsprotected' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\8dया à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤ªà¤¸à¤\82तà¥\80 à¤\85सलà¥\8dयामà¥\81ळà¥\87, à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87 JavaScript à¤ªà¤¾à¤¨ à¤¸à¤\82पादà¥\80त करण्याची परवानगी नाही.',
+'customcssprotected' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\8dया à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤ªà¤¸à¤\82तà¥\80 à¤\85सलà¥\8dयामà¥\81ळà¥\87, à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87 à¤¸à¥\80à¤\8fसà¤\8fस à¤ªà¤¾à¤¨ à¤¸à¤\82पादित करण्याची परवानगी नाही.',
+'customjsprotected' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\8dया à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤ªà¤¸à¤\82तà¥\80 à¤\85सलà¥\8dयामà¥\81ळà¥\87, à¤¤à¥\81मà¥\8dहाला à¤¹à¥\87 JavaScript à¤ªà¤¾à¤¨ à¤¸à¤\82पादित करण्याची परवानगी नाही.',
 'ns-specialprotected' => 'विशेष पाने संपादित करता येत नाहीत.',
-'titleprotected' => "या à¤¶à¥\80रà¥\8dषà¤\95ाà¤\9aà¥\87 à¤ªà¤¾à¤¨ à¤¸à¤¦à¤¸à¥\8dय [[User:$1|$1]]नà¥\87 à¤¨à¤¿à¤°à¥\8dमà¥\80त करण्यापासून सुरक्षित केलेले आहे.
+'titleprotected' => "या à¤¶à¥\80रà¥\8dषà¤\95ाà¤\9aà¥\87 à¤ªà¤¾à¤¨ à¤¸à¤¦à¤¸à¥\8dय [[User:$1|$1]]नà¥\87 à¤¨à¤¿à¤°à¥\8dमित करण्यापासून सुरक्षित केलेले आहे.
 ''$2'' हे कारण नमूद केलेले आहे.",
 'invalidtitle-knownnamespace' => '"$2" नामविश्वात "$3" हे अयोग्य शीर्षक',
 'exception-nologin' => 'प्रवेश केलेला नाही',
@@ -734,7 +733,7 @@ $2',
 'externaldberror' => 'विदागार ’खातरजमा’ (प्रमाणितीकरण) त्रुटी होती अथवा तुम्हाला तुमचे बाह्य खाते अद्ययावत  करण्याची परवानगी नाही.',
 'login' => 'प्रवेश करा',
 'nav-login-createaccount' => 'सदस्य प्रवेश',
-'loginprompt' => '{{SITENAME}}मधà¥\8dयà¥\87 à¤¦à¤¾à¤\96ल à¤¹à¥\8bणà¥\8dयाà¤\95रिता  à¤¸à¥\8dमà¥\83तिशà¥\87ष à¤\8aपलब्ध (Cookie enable)असणे आवश्यक आहे.',
+'loginprompt' => '{{SITENAME}}मधà¥\8dयà¥\87 à¤¦à¤¾à¤\96ल à¤¹à¥\8bणà¥\8dयाà¤\95रिता  à¤¸à¥\8dमà¥\83तिशà¥\87ष à¤\89पलब्ध (Cookie enable)असणे आवश्यक आहे.',
 'userlogin' => 'दाखल व्हा /सदस्य खाते उघडा',
 'userloginnocreate' => 'प्रवेश करा',
 'logout' => 'बाहेर पडा',
@@ -752,18 +751,18 @@ $2',
 'userexists' => 'या नावाने सदस्याची नोंदणी झालेली आहे.
 कृपया दुसरे सदस्य नाव निवडा.',
 'loginerror' => 'आपल्या प्रवेश नोंदणीमध्ये चूक झाली आहे',
-'createaccounterror' => 'हà¥\87 à¤\96ातà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रता à¤¯à¥\87à¤\89 शकले नाही:$1',
-'nocookiesnew' => 'सदसà¥\8dय à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 ,पण à¤¤à¥\81मà¥\8dहà¥\80 à¤\96ातà¥\87 à¤µà¤¾à¤ªà¤°à¥\82न à¤¦à¤¾à¤\96ल à¤\9dालà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\86हात.{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤¦à¤¾à¤\96ल à¤\95रà¥\82न à¤\98à¥\87ताना à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¥\8dमà¥\83तà¥\80शà¥\87ष (cookies) à¤µà¤¾à¤ªà¤°à¤¤à¥\87.तà¥\81मà¥\8dहà¥\80 à¤¸à¥\8dमà¥\83तà¥\80शेष सुविधा अनुपलब्ध टेवली आहे.ती कृपया उपलब्ध करा,आणि नंतर तुमच्या नवीन सदस्य नावाने आणि परवलीने दाखल व्हा.',
-'nocookieslogin' => '{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤¦à¤¾à¤\96ल à¤\95रà¥\82न à¤\98à¥\87ताना à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¥\8dमà¥\83तà¥\80शà¥\87ष (cookies) à¤µà¤¾à¤ªà¤°à¤¤à¥\87.तà¥\81मà¥\8dहà¥\80 à¤¸à¥\8dमà¥\83तà¥\80शेष सुविधा अनुपलब्ध टेवली आहे.स्मृतीशेष सुविधा कृपया उपलब्ध करा,आणि दाखल होण्यासाठी पुन्हा प्रयत्न करा.',
+'createaccounterror' => 'हà¥\87 à¤\96ातà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रता à¤¯à¥\87à¤\8a शकले नाही:$1',
+'nocookiesnew' => 'सदसà¥\8dय à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 ,पण à¤¤à¥\81मà¥\8dहà¥\80 à¤\96ातà¥\87 à¤µà¤¾à¤ªà¤°à¥\82न à¤¦à¤¾à¤\96ल à¤\9dालà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\86हात.{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤¦à¤¾à¤\96ल à¤\95रà¥\82न à¤\98à¥\87ताना à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¥\8dमà¥\83तिशà¥\87ष (cookies) à¤µà¤¾à¤ªà¤°à¤¤à¥\87.तà¥\81मà¥\8dहà¥\80 à¤¸à¥\8dमà¥\83तिशेष सुविधा अनुपलब्ध टेवली आहे.ती कृपया उपलब्ध करा,आणि नंतर तुमच्या नवीन सदस्य नावाने आणि परवलीने दाखल व्हा.',
+'nocookieslogin' => '{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤¦à¤¾à¤\96ल à¤\95रà¥\82न à¤\98à¥\87ताना à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¥\8dमà¥\83तिशà¥\87ष (cookies) à¤µà¤¾à¤ªà¤°à¤¤à¥\87.तà¥\81मà¥\8dहà¥\80 à¤¸à¥\8dमà¥\83तिशेष सुविधा अनुपलब्ध टेवली आहे.स्मृतीशेष सुविधा कृपया उपलब्ध करा,आणि दाखल होण्यासाठी पुन्हा प्रयत्न करा.',
 'nocookiesfornew' => 'हे सदस्य खाते अस्तित्वात नाही, त्यामुळे आम्ही त्याच्या स्रोताची खात्री करू शकलो नाही.
 तुमचे स्मृतिशेष उपलब्ध असण्याची खात्री करा, किंवा थोड्या वेळाने हे पान पुन्हा पहा.',
 'noname' => 'आपण नोंदणीसाठी सदस्याचे योग्य नाव लिहिले नाही.',
-'loginsuccesstitle' => 'à¤\86पलà¥\8dया à¤ªà¥\8dरवà¥\87शाà¤\9aà¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤¯à¤¶à¤¸à¥\8dवà¥\80रित्या पूर्ण झाली',
+'loginsuccesstitle' => 'à¤\86पलà¥\8dया à¤ªà¥\8dरवà¥\87शाà¤\9aà¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤¯à¤¶à¤¸à¥\8dवà¥\80रà¥\80त्या पूर्ण झाली',
 'loginsuccess' => "'''तुम्ही {{SITENAME}} वर \"\$1\" नावाने प्रवेश केला आहे.'''",
 'nosuchuser' => '"$1" या नावाचा कोणताही सदस्य नाही.तुमचे शुद्धलेखन तपासा, किंवा [[Special:UserLogin/signup|नवीन खाते]] तयार करा.',
 'nosuchusershort' => '"$1" या नावाचा सदस्य नाही. लिहीताना आपली चूक तर नाही ना झाली?',
-'nouserspecified' => 'तà¥\81मà¥\8dहाला à¤¸à¤¦à¤¸à¥\8dयनाव à¤¨à¤®à¥\81द करावे लागेल.',
-'login-userblocked' => 'या à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\87 à¤\96ातà¥\87 â\80\99पà¥\8dरतिबà¤\82धितâ\80\99 à¤\86हà¥\87. à¤¤à¥\8dयास à¤ªà¥\8dरवà¥\87श à¤\95रà¥\81 देणे शक्य नाही.',
+'nouserspecified' => 'तà¥\81मà¥\8dहाला à¤¸à¤¦à¤¸à¥\8dयनाव à¤¨à¤®à¥\82द करावे लागेल.',
+'login-userblocked' => 'या à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\87 à¤\96ातà¥\87 â\80\99पà¥\8dरतिबà¤\82धितâ\80\99 à¤\86हà¥\87. à¤¤à¥\8dयास à¤ªà¥\8dरवà¥\87श à¤\95रà¥\82 देणे शक्य नाही.',
 'wrongpassword' => 'आपला परवलीचा शब्द चुकीचा आहे, पुन्हा एकदा प्रयत्न करा.',
 'wrongpasswordempty' => 'परवलीचा शब्द रिकामा आहे; परत प्रयत्न करा.',
 'passwordtooshort' => 'तुमचा परवलीचा शब्द जरूरीपेक्षा लहान आहे. यात कमीत कमी {{PLURAL:$1|१ अक्षर |$1 अक्षरे}} पाहिजेत.',
@@ -782,7 +781,7 @@ $2',
 तो शब्द वापरुन पुन्हा प्रवेश करा.',
 'blocked-mailpassword' => 'संपादनापासून तुमच्या अंकपत्त्यास आडविण्यात आले आहे,आणि म्हणून दुरूपयोग टाळ्ण्याच्या दृष्टीने परवलीचाशब्द परत मिळवण्यास सुद्धा मान्यता उपलब्ध नाही.',
 'eauthentsent' => 'नामांकित ई-मेल पत्त्यावर एक निश्चितता स्वीकारक ई-मेल पाठविला गेला आहे.
-à¤\96ातà¥\8dयावर à¤\95à¥\8bणताहà¥\80 à¤\87तर à¤\88-मà¥\87ल à¤ªà¤¾à¤ à¤µà¤¿à¤£à¥\8dयापà¥\82रà¥\8dवà¥\80 - à¤¤à¥\8b à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dता à¤¤à¥\81मà¤\9aाà¤\9a à¤\86हà¥\87, à¤¹à¥\87 à¤¸à¥\82निश्चित करण्यासाठी - तुम्हाला त्या ई-मेल मधील सूचनांचे पालन करावे लागेल.',
+à¤\96ातà¥\8dयावर à¤\95à¥\8bणताहà¥\80 à¤\87तर à¤\88-मà¥\87ल à¤ªà¤¾à¤ à¤µà¤¿à¤£à¥\8dयापà¥\82रà¥\8dवà¥\80 - à¤¤à¥\8b à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dता à¤¤à¥\81मà¤\9aाà¤\9a à¤\86हà¥\87, à¤¹à¥\87 à¤¸à¥\81निश्चित करण्यासाठी - तुम्हाला त्या ई-मेल मधील सूचनांचे पालन करावे लागेल.',
 'throttled-mailpassword' => 'मागील {{PLURAL:$1|एका तासामध्ये|$1 तासांमध्ये}} परवलीचा शब्द बदलण्यासाठीची सूचना पाठविलेली आहे. दुरुपयोग टाळण्यासाठी {{PLURAL:$1|एका तासामध्ये|$1 तासांमध्ये}} फक्त एकदाच सूचना दिली जाईल.',
 'mailerror' => 'विपत्र पाठवण्यात त्रुटी: $1',
 'acct_creation_throttle_hit' => 'माफ करा, तुम्ही आत्तापर्यंत {{PLURAL:$1|१ खाते उघडले आहे|$1 खाती उघडली आहेत}}. तुम्हाला आणखी खाती उघडता येणार नाहीत.',
@@ -791,14 +790,14 @@ $2',
 'noemailprefs' => 'खालील सुविधा कार्यान्वित करण्यासाठी इ-मेल पत्ता पुरवा.',
 'emailconfirmlink' => 'आपला ई-मेल पत्ता तपासून पहा.',
 'invalidemailaddress' => 'तुम्ही दिलेला ई-मेल पत्ता चुकीचा आहे, कारण तो योग्यप्रकारे लिहिलेला नाही. कृपया योग्यप्रकारे ई-मेल पत्ता लिहा अथवा ती जागा मोकळी सोडा.',
-'cannotchangeemail' => 'या à¤µà¤¿à¤\95à¥\80वर खात्याचा ईमेल बदलता येत नाही',
+'cannotchangeemail' => 'या à¤µà¤¿à¤\95िवर खात्याचा ईमेल बदलता येत नाही',
 'emaildisabled' => 'हे संकेतस्थळ विपत्र पाठवू शकत नाही.',
 'accountcreated' => 'खाते उघडले.',
 'accountcreatedtext' => '$1 चे सदस्यखाते उघडले.',
 'createaccount-title' => '{{SITENAME}} साठीची सदस्य नोंदणी',
 'createaccount-text' => 'तुमच्या विपत्र पत्त्याकरिता {{SITENAME}} ($4)वर "$2" नावाच्या कुणी "$3" परवलीने खाते उघडले आहे. कृपया आपण सदस्य प्रवेश करून आपला परवलीचा शब्द बदलावा.
 
-à¤\9cर à¤¹à¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤\9aà¥\81à¤\95à¥\80ने झाली असेल तर तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.',
+à¤\9cर à¤¹à¥\80 à¤¨à¥\8bà¤\82दणà¥\80 à¤\9aà¥\81à¤\95िने झाली असेल तर तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.',
 'usernamehasherror' => 'सदस्यनामात "हॅश" वर्ण असू शकत नाहीत.',
 'login-throttled' => 'तुम्ही प्रवेश करण्यासाठी खूप प्रयत्न केले आहेत.
 कृपया पुन्हा प्रयत्न करण्याआधी थांबा',
@@ -819,7 +818,7 @@ $2',
 'newpassword' => 'नवीन परवलीचा शब्द:',
 'retypenew' => 'पुन्हा एकदा परवलीचा शब्द',
 'resetpass_submit' => 'परवलीचा शब्द टाका आणि प्रवेश करा',
-'resetpass_success' => 'तà¥\81मà¤\9aा à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤¬à¤¦à¤²à¤²à¥\87ला à¤\86हà¥\87! à¤\86ता à¤¤à¥\81मà¤\9aा à¤ªà¥\8dरवà¥\87श à¤\95रà¥\80त आहोत...',
+'resetpass_success' => 'तà¥\81मà¤\9aा à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤¬à¤¦à¤²à¤²à¥\87ला à¤\86हà¥\87! à¤\86ता à¤¤à¥\81मà¤\9aा à¤ªà¥\8dरवà¥\87श à¤\95रित आहोत...',
 'resetpass_forbidden' => 'परवलीचा शब्द बदलता येत नाही.',
 'resetpass-no-info' => 'या पानामध्ये थेट जाण्यासाठी तुम्हाला प्रवेश घ्यावा लागेल.',
 'resetpass-submit-loggedin' => 'परवलीचा शब्द बदला',
@@ -832,12 +831,12 @@ $2',
 'passwordreset' => 'परवलीचा शब्द पूर्ववत करा',
 'passwordreset-text' => 'तुमच्या खात्याच्या माहितीसंदर्भात विपत्राद्वारे अनुस्मारक येण्यासाठी हा अर्ज पूर्ण भरा.',
 'passwordreset-legend' => 'परवलीचा शब्द पूर्ववत करा',
-'passwordreset-disabled' => 'या à¤µà¤¿à¤\95à¥\80वर परवलीचा शब्द पुनर्स्थापित करता येत नाही.',
+'passwordreset-disabled' => 'या à¤µà¤¿à¤\95िवर परवलीचा शब्द पुनर्स्थापित करता येत नाही.',
 'passwordreset-pretext' => '{{PLURAL:$1||खालील माहितीच्या भागांपैकी एक भाग लिहा}}',
 'passwordreset-username' => 'सदस्यनाव:',
 'passwordreset-domain' => 'डोमेन',
 'passwordreset-capture' => 'ईमेल कशी असेल ते बघायचेय ?',
-'passwordreset-capture-help' => 'या à¤\9aà¥\8cà¤\95à¤\9fित खूण केली तर, ईमेल (तात्पुर्त्या परवली शब्दा सोबत) दखवण्यत व प्रयोगकर्त्त्यस पाठवण्यत येइल',
+'passwordreset-capture-help' => 'या à¤\9aà¥\8cà¤\95à¤\9fà¥\80त खूण केली तर, ईमेल (तात्पुर्त्या परवली शब्दा सोबत) दखवण्यत व प्रयोगकर्त्त्यस पाठवण्यत येइल',
 'passwordreset-email' => 'विपत्र पत्ता',
 'passwordreset-emailtitle' => '{{SITENAME}} वर खात्याची माहिती',
 'passwordreset-emailtext-ip' => 'कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शब्दांक पाठवावा’ अशी विनंती केली आहे ($4).
@@ -898,8 +897,8 @@ $2',
 'showdiff' => 'बदल दाखवा',
 'anoneditwarning' => "'''इशारा:''' तुम्ही विकिपीडियाचे सदस्य म्हणून प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंक पत्ता (आयपी) नोंदला जाईल.",
 'anonpreviewwarning' => "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
-'missingsummary' => "'''à¤\86ठवण:''' à¤¤à¥\82मà¥\8dहà¥\80 à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤ªà¥\81रवलà¥\87ला à¤¨à¤¾à¤¹à¥\80.à¤\86पण à¤\9cतन à¤\95रा à¤µà¤° à¤ªà¥\81नà¥\8dहा à¤\9fà¥\80चकी मारली तर तेत्या शिवाय जतन होईल.",
-'missingcommenttext' => 'à¤\95à¥\83पया à¤\96ालà¥\80 à¤ªà¥\8dरतिà¤\95à¥\8dरà¥\80या भरा.',
+'missingsummary' => "'''à¤\86ठवण:''' à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤ªà¥\81रवलà¥\87ला à¤¨à¤¾à¤¹à¥\80.à¤\86पण à¤\9cतन à¤\95रा à¤µà¤° à¤ªà¥\81नà¥\8dहा à¤\9fिचकी मारली तर तेत्या शिवाय जतन होईल.",
+'missingcommenttext' => 'à¤\95à¥\83पया à¤\96ालà¥\80 à¤ªà¥\8dरतिà¤\95à¥\8dरिया भरा.',
 'missingcommentheader' => "'''आठवण:''' आपण या लेखनाकरिता विषय किंवा अधोरेषा दिलेली नाही. आपण पुन्हा जतन करा अशी सूचना केली तर, तुमचे संपादन त्याशिवायच जतन होईल.",
 'summary-preview' => 'आढाव्याची झलक:',
 'subject-preview' => 'विषय/मथळा झलक:',
@@ -926,12 +925,12 @@ $2',
 
 तुम्ही $1शी संपर्क करू शकता किंवा इतर [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकां पैकी]] एकाशी स्थगनाबद्दल चर्चा करू शकता.
 
-[[Special:Preferences|सदसà¥\8dय à¤ªà¤¸à¤\82तà¥\80त]]त à¤¶à¤¾à¤¬à¥\80त à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¤¤à¥\8dता à¤¨à¤®à¥\81द à¤\85सलà¥\8dया à¤¶à¤¿à¤µà¤¾à¤¯ à¤\86णि à¤¤à¥\81मà¥\8dहाला  à¤¤à¥\8b à¤µà¤¾à¤ªà¤°à¤£à¥\8dया à¤ªà¤¾à¤¸à¥\82न à¤ªà¥\8dरतिबà¤\82धà¥\80त केले असल्यास तुम्ही  "या सदस्यास विपत्र पाठवा" सुविधा  वापरू शकणार नाही.
+[[Special:Preferences|सदसà¥\8dय à¤ªà¤¸à¤\82तà¥\80त]]त à¤¶à¤¾à¤¬à¥\80त à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¤¤à¥\8dता à¤¨à¤®à¥\82द à¤\85सलà¥\8dया à¤¶à¤¿à¤µà¤¾à¤¯ à¤\86णि à¤¤à¥\81मà¥\8dहाला  à¤¤à¥\8b à¤µà¤¾à¤ªà¤°à¤£à¥\8dया à¤ªà¤¾à¤¸à¥\82न à¤ªà¥\8dरतिबà¤\82धित केले असल्यास तुम्ही  "या सदस्यास विपत्र पाठवा" सुविधा  वापरू शकणार नाही.
 
-तà¥\81मà¤\9aा à¤¸à¥\8dथà¤\97न à¤\95à¥\8dर $5 à¤\86हà¥\87. à¤\95à¥\83पया à¤¤à¥\82मà¤\9aà¥\8dया à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤¶à¤\82à¤\95ासमाधाना à¤¸à¤¾à¤ à¥\80 à¤¹à¤¾ à¤\95à¥\8dरà¤\82माà¤\82à¤\95 à¤¨à¤®à¥\81द करा.',
+तà¥\81मà¤\9aा à¤¸à¥\8dथà¤\97न à¤\95à¥\8dर $5 à¤\86हà¥\87. à¤\95à¥\83पया à¤¤à¥\81मà¤\9aà¥\8dया à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤¶à¤\82à¤\95ासमाधाना à¤¸à¤¾à¤ à¥\80 à¤¹à¤¾ à¤\95à¥\8dरà¤\82माà¤\82à¤\95 à¤¨à¤®à¥\82द करा.',
 'blockednoreason' => 'कारण दिलेले नाही',
 'whitelistedittext' => 'लेखांचे संपादन करण्यासाठी आधी $1 करा.',
-'confirmedittext' => 'तà¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादनà¥\87 à¤\95रणà¥\8dयापà¥\81र्वी तुमचा विपत्र पत्ता प्रमाणित करणे आवश्यक आहे.Please set and validate तुमचा विपत्र पत्ता तुमच्या[[Special:Preferences|सदस्य पसंती]]तून लिहा व सिद्ध करा.',
+'confirmedittext' => 'तà¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादनà¥\87 à¤\95रणà¥\8dयापà¥\82र्वी तुमचा विपत्र पत्ता प्रमाणित करणे आवश्यक आहे.Please set and validate तुमचा विपत्र पत्ता तुमच्या[[Special:Preferences|सदस्य पसंती]]तून लिहा व सिद्ध करा.',
 'nosuchsectiontitle' => 'असा विभाग नाही.',
 'nosuchsectiontext' => 'तुम्ही अस्तिवात नसलेला विभाग संपादन करण्याचा प्रयत्न केला आहे.',
 'loginreqtitle' => 'प्रवेश गरजेचा आहे',
@@ -968,14 +967,14 @@ $2',
 'userjspreview' => "'''तुम्ही तुमची सदस्य जावास्क्रिप्ट तपासत आहात किंवा झलक पहात आहात ,ती अजून जतन केलेली नाही हे लक्षात घ्या!'''",
 'sitecsspreview' => "'''तुम्ही तुमच्या सी.एस.एस.ची केवळ झलक पहात आहात, ती अजून जतन केलेली नाही हे लक्षात घ्या.'''",
 'sitejspreview' => "'''तुम्ही तुमच्या जावास्क्रिप्टची केवळ झलक पहात आहात, ती अजून जतन केलेली नाही हे लक्षात घ्या.'''",
-'userinvalidcssjstitle' => "'''सावधान:''' \"\$1\" à¤\85शà¥\80 à¤¤à¥\8dवà¤\9aा à¤¨à¤¾à¤¹à¥\80.custom .css à¤\86णि .js à¤ªà¤¾à¤¨à¥\87 lowercase title à¤µà¤¾à¤ªà¤°à¤¤à¤¾à¤¤ à¤¹à¥\87 à¤²à¤\95à¥\8dषात à¤\98à¥\8dया, à¤\89दा. {{ns:user}}:Foo/vector.css à¤¯à¤¾ à¤µà¤¿à¤°à¥\82द्ध {{ns:user}}:Foo/Vector.css.",
+'userinvalidcssjstitle' => "'''सावधान:''' \"\$1\" à¤\85शà¥\80 à¤¤à¥\8dवà¤\9aा à¤¨à¤¾à¤¹à¥\80.custom .css à¤\86णि .js à¤ªà¤¾à¤¨à¥\87 lowercase title à¤µà¤¾à¤ªà¤°à¤¤à¤¾à¤¤ à¤¹à¥\87 à¤²à¤\95à¥\8dषात à¤\98à¥\8dया, à¤\89दा. {{ns:user}}:Foo/vector.css à¤¯à¤¾ à¤µà¤¿à¤°à¥\81द्ध {{ns:user}}:Foo/Vector.css.",
 'updated' => '(बदल झाला आहे.)',
 'note' => "'''सूचना:'''",
 'previewnote' => "'''लक्षात ठेवा की ही फक्त झलक आहे''', बदल अजून जतन करण्यात आलेले नाहीत.",
-'continue-editing' => 'सà¤\82पादन à¤\9aालà¥\81 राहुदे',
+'continue-editing' => 'सà¤\82पादन à¤\9aालà¥\82 राहुदे',
 'previewconflict' => 'वरील संपादन क्षेत्रातील मजकूर जतन केल्यावर या झलकेप्रमाणे दिसेल.',
-'session_fail_preview' => "'''à¤\95à¥\8dषमसà¥\8dव! à¤¸à¤¤à¥\8dर à¤µà¤¿à¤¦à¥\87à¤\9aà¥\8dया à¤\95à¥\8dषयामà¥\81ळà¥\87 à¤\86मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤¸à¤\82पादन à¤ªà¥\8dरà¤\95à¥\8dरà¥\80या पार पाडू शकलो नाही.कृपया पुन्हा प्रयत्न करा.जर एवढ्याने काम झाले नाही तर सदस्य खात्यातून बाहेर पडून पुन्हा प्रवेश करून पहा.'''",
-'session_fail_preview_html' => "'''à¤\95à¥\8dषमसà¥\8dव! à¤¸à¤¤à¥\8dर à¤µà¤¿à¤¦à¥\87à¤\9aà¥\8dया à¤\95à¥\8dषयामà¥\81ळà¥\87 à¤\86मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤¸à¤\82पादन à¤ªà¥\8dरà¤\95à¥\8dरà¥\80या पार पाडू शकलो नाही.'''
+'session_fail_preview' => "'''à¤\95à¥\8dषमसà¥\8dव! à¤¸à¤¤à¥\8dर à¤µà¤¿à¤¦à¥\87à¤\9aà¥\8dया à¤\95à¥\8dषयामà¥\81ळà¥\87 à¤\86मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤¸à¤\82पादन à¤ªà¥\8dरà¤\95à¥\8dरिया पार पाडू शकलो नाही.कृपया पुन्हा प्रयत्न करा.जर एवढ्याने काम झाले नाही तर सदस्य खात्यातून बाहेर पडून पुन्हा प्रवेश करून पहा.'''",
+'session_fail_preview_html' => "'''à¤\95à¥\8dषमसà¥\8dव! à¤¸à¤¤à¥\8dर à¤µà¤¿à¤¦à¥\87à¤\9aà¥\8dया à¤\95à¥\8dषयामà¥\81ळà¥\87 à¤\86मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤¸à¤\82पादन à¤ªà¥\8dरà¤\95à¥\8dरिया पार पाडू शकलो नाही.'''
 
 ''कारण {{SITENAME}}चे कच्चे HTML चालू ठेवले आहे, जावास्क्रिप्ट हल्ल्यांपासून बचाव व्हावा म्हणून झलक लपवली आहे.''
 
@@ -985,7 +984,7 @@ $2',
 असे कदाचित तुम्ही अनामिक proxy वापरत असल्याने होऊ शकते.'''",
 'edit_form_incomplete' => '”’तुमच्या संपादनाचा काही भाग सर्व्हरपर्यंत पोचला नाही; तुमचे संपादन पूर्ण आहे का याची पुन्हा खात्री करा.',
 'editing' => '$1 चे संपादन होत आहे.',
-'creating' => '$1 à¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤¸à¥\81रà¥\81 आहे',
+'creating' => '$1 à¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤¸à¥\81रà¥\82 आहे',
 'editingsection' => '$1 (विभाग) संपादन',
 'editingcomment' => '$1 चे संपादन (प्रतिक्रिया)',
 'editconflict' => 'वादग्रस्त संपादन: $1',
@@ -995,18 +994,18 @@ $2',
 '''केवळ''' वरील पाठ्यभागामध्ये असलेले पाठ्य साठविण्यात येईल जर तुम्ही \"{{int:savearticle}}\" ही कळ दाबली.",
 'yourtext' => 'तुमचे पाठ्य',
 'storedversion' => 'साठविलेली आवृत्ती',
-'nonunicodebrowser' => "'''सावधान: à¤¤à¥\81मà¤\9aा à¤µà¤¿à¤\9aरà¤\95 à¤¯à¥\82निà¤\95à¥\8bड à¤\86धारà¥\80त à¤¨à¤¾à¤¹à¥\80. ASCII à¤¨à¤¸à¤²à¥\87लà¥\80  à¤\85à¤\95à¥\8dषरà¤\9aिनà¥\8dहà¥\87 à¤¸à¤\82पादन à¤\96िडà¤\95à¥\80त à¤¸à¥\8bळाà¤\85à¤\82à¤\95à¥\80 à¤\95à¥\82à¤\9fसà¤\82à¤\95à¥\87त (हà¥\87à¤\95à¥\8dà¤\9dाडà¥\87सà¥\80मल à¤\95à¥\8bड) à¤¸à¥\8dवरà¥\82पात à¤¦à¤¿à¤¸à¤£à¥\8dयाà¤\9aà¥\80, à¤¸à¥\81रà¤\95à¥\8dषà¥\80तपणे संपादन करू देणारी,  पळवाट उपलब्ध आहे.'''",
-'editingold' => "'''à¤\87शारा: à¤¤à¥\81मà¥\8dहà¥\80 à¤®à¥\82ळ à¤ªà¥\83षà¥\8dठाà¤\9aà¥\80 à¤\8fà¤\95 à¤\95ालबाहà¥\8dय à¤\86वà¥\83तà¥\8dतà¥\80 à¤¸à¤\82पादित à¤\95रà¥\80त आहात.
+'nonunicodebrowser' => "'''सावधान: à¤¤à¥\81मà¤\9aा à¤µà¤¿à¤\9aरà¤\95 à¤¯à¥\81निà¤\95à¥\8bड à¤\86धारित à¤¨à¤¾à¤¹à¥\80. ASCII à¤¨à¤¸à¤²à¥\87लà¥\80  à¤\85à¤\95à¥\8dषरà¤\9aिनà¥\8dहà¥\87 à¤¸à¤\82पादन à¤\96िडà¤\95à¥\80त à¤¸à¥\8bळाà¤\85à¤\82à¤\95à¥\80 à¤\95à¥\82à¤\9fसà¤\82à¤\95à¥\87त (हà¥\87à¤\95à¥\8dà¤\9dाडà¥\87सà¥\80मल à¤\95à¥\8bड) à¤¸à¥\8dवरà¥\82पात à¤¦à¤¿à¤¸à¤£à¥\8dयाà¤\9aà¥\80, à¤¸à¥\81रà¤\95à¥\8dषितपणे संपादन करू देणारी,  पळवाट उपलब्ध आहे.'''",
+'editingold' => "'''à¤\87शारा: à¤¤à¥\81मà¥\8dहà¥\80 à¤®à¥\82ळ à¤ªà¥\83षà¥\8dठाà¤\9aà¥\80 à¤\8fà¤\95 à¤\95ालबाहà¥\8dय à¤\86वà¥\83तà¥\8dतà¥\80 à¤¸à¤\82पादित à¤\95रित आहात.
 जर आपण बदल साठवून ठेवण्यात आले तर या नंतरच्या सर्व आवृत्त्यांमधील साठविण्यात आलेले बदल नष्ठ होतील.'''",
 'yourdiff' => 'फरक',
-'copyrightwarning' => "{{SITENAME}} à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤\95à¥\8bणतà¥\87हà¥\80 à¤²à¥\87à¤\96न $2 (à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80साठà¥\80 $1 à¤ªà¤¹à¤¾) à¤\85à¤\82तरà¥\8dà¤\97त à¤®à¥\81à¤\95à¥\8dत à¤\89दà¥\8dà¤\98à¥\8bषित à¤\95à¥\87लà¥\87 à¤\86हà¥\87 à¤\85सà¥\87 à¤\97à¥\83हित धरले जाईल याची कृपया नोंद घ्यावी. आपणास आपल्या लेखनाचे मुक्त संपादन आणि मुक्त वितरण होणे पसंत नसेल तर येथे संपादन करू नये.<br />
-तà¥\81मà¥\8dहà¥\80 à¤¯à¥\87थà¥\87 à¤²à¥\87à¤\96न à¤\95रताना à¤¹à¥\87 à¤¸à¥\81दà¥\8dधा à¤\97à¥\83हित à¤§à¤°à¤²à¥\87लà¥\87 à¤\85सतà¥\87 à¤\95à¥\80 à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤²à¥\87à¤\96न à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¥\8dवतà¤\83à¤\9aà¥\87 à¤\86णि à¤\95à¥\87वळ à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤ªà¥\8dरताधिà¤\95ार (à¤\95à¥\89पà¥\80राà¤\88à¤\9f) à¤®à¤¾à¤²à¤\95à¥\80à¤\9aà¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤ªà¥\8dरताधिà¤\95ारानà¥\87 à¤\97ठà¥\80त न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात. '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
+'copyrightwarning' => "{{SITENAME}} à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤\95à¥\8bणतà¥\87हà¥\80 à¤²à¥\87à¤\96न $2 (à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80साठà¥\80 $1 à¤ªà¤¹à¤¾) à¤\85à¤\82तरà¥\8dà¤\97त à¤®à¥\81à¤\95à¥\8dत à¤\89दà¥\8dà¤\98à¥\8bषित à¤\95à¥\87लà¥\87 à¤\86हà¥\87 à¤\85सà¥\87 à¤\97à¥\83हà¥\80त धरले जाईल याची कृपया नोंद घ्यावी. आपणास आपल्या लेखनाचे मुक्त संपादन आणि मुक्त वितरण होणे पसंत नसेल तर येथे संपादन करू नये.<br />
+तà¥\81मà¥\8dहà¥\80 à¤¯à¥\87थà¥\87 à¤²à¥\87à¤\96न à¤\95रताना à¤¹à¥\87 à¤¸à¥\81दà¥\8dधा à¤\97à¥\83हà¥\80त à¤§à¤°à¤²à¥\87लà¥\87 à¤\85सतà¥\87 à¤\95à¥\80 à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤²à¥\87à¤\96न à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¥\8dवतà¤\83à¤\9aà¥\87 à¤\86णि à¤\95à¥\87वळ à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤ªà¥\8dरताधिà¤\95ार (à¤\95à¥\89पà¥\80राà¤\88à¤\9f) à¤®à¤¾à¤²à¤\95à¥\80à¤\9aà¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤ªà¥\8dरताधिà¤\95ारानà¥\87 à¤\97ठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात. '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
 'copyrightwarning2' => "{{SITENAME}} येथे केलेले कोणतेही लेखन हे इतर संपादकांकरवी बदलले अथवा काढले जाऊ शकते. जर आपणास आपल्या लेखनाचे मुक्त संपादन होणे पसंत नसेल तर येथे संपादन करू नये.<br />
-तà¥\81मà¥\8dहà¥\80 à¤¯à¥\87थà¥\87 à¤²à¥\87à¤\96न à¤\95रताना à¤¹à¥\87 à¤¸à¥\81दà¥\8dधा à¤\97à¥\83हित à¤§à¤°à¤²à¥\87लà¥\87 à¤\85सतà¥\87 à¤\95à¥\80 à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤²à¥\87à¤\96न à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¥\8dवतà¤\83à¤\9aà¥\87 à¤\86णि à¤\95à¥\87वळ à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤ªà¥\8dरताधिà¤\95ार (à¤\95à¥\89पà¥\80राà¤\88à¤\9f) à¤®à¤¾à¤²à¤\95à¥\80à¤\9aà¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤ªà¥\8dरताधिà¤\95ारानà¥\87 à¤\97ठà¥\80त न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात (अधिक माहितीसाठी $1 पहा). '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
-'longpageerror' => 'तà¥\8dरà¥\82à¤\9fà¥\80:à¤\86पण à¤¦à¤¿à¤²à¥\87ला à¤®à¤\9cà¤\95à¥\81र जास्तीत जास्त शक्य {{PLURAL:$2|one किलोबाईट|$2 किलोबाईट}} पेक्षा अधिक लांबीचा {{PLURAL:$1|one किलोबाईट|$1 किलोबाईट}} आहे.तो जतन केला जाऊ शकत नाही',
-'readonlywarning' => "सावधान:विदाà¤\97ारास à¤­à¤°à¤£-पà¥\8bषणाà¤\95रिता à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\87 à¤\86हà¥\87,तà¥\8dयामà¥\81ळà¥\87 à¤¸à¤§à¥\8dया à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¤\82पादन à¤\9cतन à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.à¤\9cर à¤¤à¥\81मà¥\8dहाला à¤¹à¤µà¥\87 à¤\85सà¥\87ल à¤¤à¤° à¤¨à¤\82तर à¤\89पयà¥\8bà¤\97 à¤\95रणà¥\8dयाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87, à¤¤à¥\81मà¥\8dहà¥\80 à¤®à¤\9cà¤\95à¥\81र ’मजकुर संचिकेत’(टेक्स्ट फाईल मध्ये) कापून-चिटकवू शकता.'''
-विदाà¤\97ारास à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\87लà¥\8dया à¤ªà¥\8dरà¤\9aालà¤\95ाà¤\82नà¥\80 $1 à¤\85सà¥\87 à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रणà¥\87 à¤¦à¥\80ले आहे",
-'protectedpagewarning' => "'''सà¥\82à¤\9aना: à¤¹à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤ªà¤¾à¤¨ à¤\86हà¥\87. à¤«à¤\95à¥\8dत à¤ªà¥\8dरà¤\9aालà¤\95 à¤¯à¤¾à¤\9aà¥\8dयात à¤¬à¤¦à¤² à¤\95रà¥\81 शकतात.'''",
+तà¥\81मà¥\8dहà¥\80 à¤¯à¥\87थà¥\87 à¤²à¥\87à¤\96न à¤\95रताना à¤¹à¥\87 à¤¸à¥\81दà¥\8dधा à¤\97à¥\83हà¥\80त à¤§à¤°à¤²à¥\87लà¥\87 à¤\85सतà¥\87 à¤\95à¥\80 à¤¯à¥\87थà¥\87 à¤\95à¥\87लà¥\87लà¥\87 à¤²à¥\87à¤\96न à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¥\8dवतà¤\83à¤\9aà¥\87 à¤\86णि à¤\95à¥\87वळ à¤¸à¥\8dवतà¤\83à¤\9aà¥\8dया à¤ªà¥\8dरताधिà¤\95ार (à¤\95à¥\89पà¥\80राà¤\88à¤\9f) à¤®à¤¾à¤²à¤\95à¥\80à¤\9aà¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤ªà¥\8dरताधिà¤\95ारानà¥\87 à¤\97ठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात (अधिक माहितीसाठी $1 पहा). '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
+'longpageerror' => 'तà¥\8dरà¥\82à¤\9fà¥\80:à¤\86पण à¤¦à¤¿à¤²à¥\87ला à¤®à¤\9cà¤\95à¥\82र जास्तीत जास्त शक्य {{PLURAL:$2|one किलोबाईट|$2 किलोबाईट}} पेक्षा अधिक लांबीचा {{PLURAL:$1|one किलोबाईट|$1 किलोबाईट}} आहे.तो जतन केला जाऊ शकत नाही',
+'readonlywarning' => "सावधान:विदाà¤\97ारास à¤­à¤°à¤£-पà¥\8bषणाà¤\95रिता à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\87 à¤\86हà¥\87,तà¥\8dयामà¥\81ळà¥\87 à¤¸à¤§à¥\8dया à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\87 à¤¸à¤\82पादन à¤\9cतन à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.à¤\9cर à¤¤à¥\81मà¥\8dहाला à¤¹à¤µà¥\87 à¤\85सà¥\87ल à¤¤à¤° à¤¨à¤\82तर à¤\89पयà¥\8bà¤\97 à¤\95रणà¥\8dयाà¤\9aà¥\8dया à¤¦à¥\83षà¥\8dà¤\9fà¥\80नà¥\87, à¤¤à¥\81मà¥\8dहà¥\80 à¤®à¤\9cà¤\95à¥\82र ’मजकुर संचिकेत’(टेक्स्ट फाईल मध्ये) कापून-चिटकवू शकता.'''
+विदाà¤\97ारास à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\87लà¥\8dया à¤ªà¥\8dरà¤\9aालà¤\95ाà¤\82नà¥\80 $1 à¤\85सà¥\87 à¤¸à¥\8dपषà¥\8dà¤\9fà¥\80à¤\95रणà¥\87 à¤¦à¤¿ले आहे",
+'protectedpagewarning' => "'''सà¥\82à¤\9aना: à¤¹à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤ªà¤¾à¤¨ à¤\86हà¥\87. à¤«à¤\95à¥\8dत à¤ªà¥\8dरà¤\9aालà¤\95 à¤¯à¤¾à¤\9aà¥\8dयात à¤¬à¤¦à¤² à¤\95रà¥\82 शकतात.'''",
 'semiprotectedpagewarning' => "'''सूचना:''' हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याच्यात बदल करू शकतात.",
 'cascadeprotectedwarning' => "'''सावधान:''' हे पान निम्न-लिखीत शिडी-प्रतिबंधीत {{PLURAL:$1|पानात|पानात}} आंतरभूत असल्यामुळे,केवळ प्रचालक सुविधाप्राप्त सदस्यांनाच संपादन करता यावे असे ताळे त्यास ठोकलेले आहे :",
 'titleprotectedwarning' => "”’सावधान: फक्त काही सदस्यानांच [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावे म्हणून ह्या पानास ताळे आहे.'''",
@@ -1039,6 +1038,8 @@ $2',
 या नावाचे पान आधीच अस्तित्वात आहे.',
 'defaultmessagetext' => 'कसूर पाठ्य मजकूर',
 'invalid-content-data' => 'अवैध माहिती',
+'editwarning-warning' => "या पानावरुन दुसर्‍या पानावर गेल्यास, तुम्ही येथे केलेले बदल जतन होणार नाहीत.
+ही सूचना घालवण्यासाठी ''माझ्या पसंती'' मधील संपादनपसंतीत बदल करा.",
 
 # Content models
 'content-model-wikitext' => 'विकिमजकूर',
@@ -1047,10 +1048,10 @@ $2',
 'content-model-css' => 'सीएसएस',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'â\80\9dâ\80\99à¤\87शारा:â\80\9dâ\80\99 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\96à¥\82प à¤¸à¤¾à¤°à¥\87 à¤\96रà¥\8dà¤\9aिक पृथक्करण क्रिया कॉल्स आहेत.
+'expensive-parserfunction-warning' => 'â\80\9dâ\80\99à¤\87शारा:â\80\9dâ\80\99 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\96à¥\82प à¤¸à¤¾à¤°à¥\87 à¤\96रà¥\8dà¤\9aà¥\80क पृथक्करण क्रिया कॉल्स आहेत.
 
 ते $2{{PLURAL:$2|कॉल|कॉल्स}} पेक्षा कमी असायला हवेत, सध्या $1{{PLURAL:$1| $1 कॉल| $1 कॉल्स}} एवढे आहेत.',
-'expensive-parserfunction-category' => 'à¤\96à¥\82प à¤¸à¤¾à¤°à¥\87 à¤\96रà¥\8dà¤\9aिक पार्सर क्रिया कॉल्स असणारी पाने',
+'expensive-parserfunction-category' => 'à¤\96à¥\82प à¤¸à¤¾à¤°à¥\87 à¤\96रà¥\8dà¤\9aà¥\80क पार्सर क्रिया कॉल्स असणारी पाने',
 'post-expand-template-inclusion-warning' => 'सूचना: साचे वाढविण्याची मर्यादा संपलेली आहे.
 काही साचे वगळले जातील.',
 'post-expand-template-inclusion-category' => 'अशी पाने ज्यांच्यावर साचे चढविण्याची मर्यादा संपलेली आहे',
@@ -1062,14 +1063,14 @@ $2',
 'language-converter-depth-warning' => 'भाषा रुपांतरण खोली मर्यादा ओलांडली ($1)',
 
 # "Undo" feature
-'undo-success' => 'सà¤\82पादन à¤ªà¤°à¤¤à¤µà¤²à¥\87 à¤\9cाà¤\8a à¤¶à¤\95तà¥\87.à¤\95à¥\83पया, à¤\86पण à¤¨à¥\87मà¤\95à¥\87 à¤¹à¥\87à¤\9a à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bà¥\80ता à¤¹à¥\87 à¤\96ालà¥\80 à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¤à¥\81लना à¤ªà¤¾à¤¹à¥\82 à¤¨à¤¿à¤¶à¥\8dà¤\9aà¥\80त à¤\95रा,à¤\86णि à¤¨à¤\82तर à¤¸à¤\82पादन à¤ªà¤°à¤¤à¤µà¤£à¥\8dयाà¤\9aà¥\87 à¤\95ाम à¤ªà¥\82रà¥\8dण à¤\95रणà¥\8dयाà¤\95रिता à¤\87à¤\9aà¥\8dà¤\9bà¥\80त बद्ल जतन करा.',
+'undo-success' => 'सà¤\82पादन à¤ªà¤°à¤¤à¤µà¤²à¥\87 à¤\9cाà¤\8a à¤¶à¤\95तà¥\87.à¤\95à¥\83पया, à¤\86पण à¤¨à¥\87मà¤\95à¥\87 à¤¹à¥\87à¤\9a à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bिता à¤¹à¥\87 à¤\96ालà¥\80 à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¤à¥\81लना à¤ªà¤¾à¤¹à¥\82 à¤¨à¤¿à¤¶à¥\8dà¤\9aित à¤\95रा,à¤\86णि à¤¨à¤\82तर à¤¸à¤\82पादन à¤ªà¤°à¤¤à¤µà¤£à¥\8dयाà¤\9aà¥\87 à¤\95ाम à¤ªà¥\82रà¥\8dण à¤\95रणà¥\8dयाà¤\95रिता à¤\87à¤\9aà¥\8dà¤\9bित बद्ल जतन करा.',
 'undo-failure' => 'दरम्यान परस्पर विरोधी संपादने झाल्यामुळे आपण हे संपादन परतवू शकत नाही.',
 'undo-norev' => 'हे संपादन परतविता आलेले नाही कारण ते अगोदरच उलटविलेले किंवा वगळलेले आहे.',
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]])यांची आवृत्ती $1 परतवली.',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'खाते उघडू शकत नाही',
-'cantcreateaccount-text' => "('''$1''')या à¤\86à¤\82तरà¤\9cाल à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयाà¤\95डà¥\82नà¤\9aà¥\8dया à¤\96ातà¥\87 à¤¨à¤¿à¤°à¥\8dमà¥\80तीस [[User:$3|$3]]ने अटकाव केला आहे.
+'cantcreateaccount-text' => "('''$1''')या à¤\86à¤\82तरà¤\9cाल à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयाà¤\95डà¥\82नà¤\9aà¥\8dया à¤\96ातà¥\87 à¤¨à¤¿à¤°à¥\8dमितीस [[User:$3|$3]]ने अटकाव केला आहे.
 
 $3ने ''$2'' कारण दिले आहे.",
 
@@ -1118,32 +1119,32 @@ $3ने ''$2'' कारण दिले आहे.",
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदीत]निर्देश असण्याची शक्यता आहे",
 'rev-deleted-text-unhide' => "या पानाचे संस्करण '''वगळले'''.
  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे याची माहिती मिळेल.
-à¤\9cर à¤\86पणास à¤ªà¥\81ढà¥\87 à¤\9cावयाà¤\9aà¥\87 à¤\85सलà¥\8dयास, à¤\85à¤\9cà¥\82नहà¥\80 [$1 à¤¹à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण à¤¬à¤\98à¥\81 शकता].",
+à¤\9cर à¤\86पणास à¤ªà¥\81ढà¥\87 à¤\9cावयाà¤\9aà¥\87 à¤\85सलà¥\8dयास, à¤\85à¤\9cà¥\82नहà¥\80 [$1 à¤¹à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण à¤¬à¤\98à¥\82 शकता].",
 'rev-suppressed-text-unhide' => "या पानाचे संस्करण '''दडपले'''.
  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} दडपलेले क्रमलेख] येथे याची माहिती मिळेल.
-à¤\9cर à¤\86पणास à¤ªà¥\81ढà¥\87 à¤\9cावयाà¤\9aà¥\87 à¤\85सलà¥\8dयास, à¤\85à¤\9cà¥\82नहà¥\80 [$1 à¤¹à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण à¤¬à¤\98à¥\81 शकता].",
-'rev-deleted-text-view' => "या à¤ªà¤¾à¤¨à¤¾à¤\9aि आवृत्ती '''वगळण्यात आली आहे'''.
-हà¥\87 à¤¤à¥\81मà¥\8dहि à¤¬à¤\98à¥\81 à¤¶à¤\95ता; à¤®à¤¹à¤¿à¤¤à¤¿ à¤¹à¤¿ तुम्हाला इथे सपदेल् [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} कधुन तकले आहे].",
+à¤\9cर à¤\86पणास à¤ªà¥\81ढà¥\87 à¤\9cावयाà¤\9aà¥\87 à¤\85सलà¥\8dयास, à¤\85à¤\9cà¥\82नहà¥\80 [$1 à¤¹à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण à¤¬à¤\98à¥\82 शकता].",
+'rev-deleted-text-view' => "या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 आवृत्ती '''वगळण्यात आली आहे'''.
+हà¥\87 à¤¤à¥\81मà¥\8dहà¥\80 à¤¬à¤\98à¥\82 à¤¶à¤\95ता; à¤®à¤¹à¤¿à¤¤à¤¿ à¤¹à¥\80 तुम्हाला इथे सपदेल् [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} कधुन तकले आहे].",
 'rev-suppressed-text-view' => "या पानाची आवृत्ती '''दडपली'''.
-à¤\86पण à¤¹à¥\87 à¤¬à¤\98à¥\81 शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
-'rev-deleted-no-diff' => "à¤\86पण à¤¯à¤¾à¤¤à¥\80ल à¤«à¤°à¤\95 à¤¬à¤\98à¥\81 शकत नाही कारण त्यापैकी एक संस्करण '''वगळले''' आहे.
+à¤\86पण à¤¹à¥\87 à¤¬à¤\98à¥\82 शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
+'rev-deleted-no-diff' => "à¤\86पण à¤¯à¤¾à¤¤à¥\80ल à¤«à¤°à¤\95 à¤¬à¤\98à¥\82 शकत नाही कारण त्यापैकी एक संस्करण '''वगळले''' आहे.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
 'rev-suppressed-no-diff' => 'तुम्ही हा फरक पाहू शकत नाही कारण या आवृत्त्यांमधील एक संस्करण ”’वगळण्यात आले आहे.”’',
 'rev-deleted-unhide-diff' => "या पेज चे रिविषन  '''रीक्त करन्यात आले आहे'''.
 महिती एथे सुद्धा मीलु शकेल [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} रीक्क्त कर्न्यात आले आहे].
-तà¥\81मà¥\8dमà¥\8dहि à¤\86तà¥\8dता à¤¸à¥\81दà¥\8dधा [$1 à¤«à¤°à¤\95 à¤¬à¤\98ा] à¤\9cर à¤¤à¥\81मà¥\8dहि चलु थेउ ईच्चुक असाल तर.",
+तà¥\81मà¥\8dमà¥\8dहि à¤\86तà¥\8dता à¤¸à¥\81दà¥\8dधा [$1 à¤«à¤°à¤\95 à¤¬à¤\98ा] à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 चलु थेउ ईच्चुक असाल तर.",
 'rev-suppressed-unhide-diff' => "या पेज चे रिविषन  '''रीक्त करन्यात आले आहे'''.
 महिती एथे सुद्धा मीलु शकेल  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} रीक्क्त कर्न्यात आले आहे].
-तà¥\81मà¥\8dमà¥\8dहि à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा [$1 à¤¹à¤¾ à¤«à¤°à¤\95 à¤\93लà¤\96ा] à¤\9cर à¤¤à¥\81मà¥\8dहि चलु थेउ ईच्चुक असाल तर.",
+तà¥\81मà¥\8dमà¥\8dहि à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा [$1 à¤¹à¤¾ à¤«à¤°à¤\95 à¤\93लà¤\96ा] à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 चलु थेउ ईच्चुक असाल तर.",
 'rev-deleted-diff-view' => "या पेज चे रिविषन  '''रीक्त करन्यात आले आहे'''.
-तà¥\81मà¥\8dमà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤¬à¤\98à¥\81 शकता ; माहिती यात मीलु शकेल [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} रिक्क्त केलेली महिती].",
+तà¥\81मà¥\8dमà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤¬à¤\98à¥\82 शकता ; माहिती यात मीलु शकेल [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} रिक्क्त केलेली महिती].",
 'rev-suppressed-diff-view' => "या पेज चे रिविषन  '''रीक्त करन्यात आले आहे'''.
-तà¥\81मà¥\8dमà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤¬à¤\98à¥\81 à¤¶à¤\95ता ; à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¯à¤¾à¤¤ à¤®à¥\80लà¥\81 à¤¶à¤\95à¥\87ल [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  à¤\9cर à¤¤à¥\81मà¥\8dहि चलु थेउ ईच्चुक असाल तर].",
+तà¥\81मà¥\8dमà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤¬à¤\98à¥\82 à¤¶à¤\95ता ; à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¯à¤¾à¤¤ à¤®à¥\80लà¥\81 à¤¶à¤\95à¥\87ल [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 चलु थेउ ईच्चुक असाल तर].",
 'rev-delundel' => 'दाखवा/लपवा',
 'rev-showdeleted' => 'दाखवा',
 'revisiondelete' => 'आवर्तने वगळा/पुनर्स्थापित करा',
 'revdelete-nooldid-title' => 'अपेक्षीत आवृत्ती दिलेली नाही',
-'revdelete-nooldid-text' => '!!à¤\86पण à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤\95रावयाà¤\9aà¥\80 à¤\86वरà¥\8dतनà¥\87 à¤¸à¥\82à¤\9aà¥\80मधà¥\8dयà¥\87 à¤\95à¥\87लà¥\87लà¥\80 à¤¨à¤¾à¤¹à¥\80त, à¤¦à¤¿à¤²à¥\87लà¥\87 à¤\86वरà¥\8dतन à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80, à¤\95िà¤\82वा à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤§à¥\8dयाà¤\9aà¥\87 à¤\86वरà¥\8dतन à¤²à¤ªà¤µà¤¿à¤£à¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रà¥\80त आहात.',
+'revdelete-nooldid-text' => '!!à¤\86पण à¤¹à¥\80 à¤\95à¥\83तà¥\80 à¤\95रावयाà¤\9aà¥\80 à¤\86वरà¥\8dतनà¥\87 à¤¸à¥\82à¤\9aà¥\80मधà¥\8dयà¥\87 à¤\95à¥\87लà¥\87लà¥\80 à¤¨à¤¾à¤¹à¥\80त, à¤¦à¤¿à¤²à¥\87लà¥\87 à¤\86वरà¥\8dतन à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80, à¤\95िà¤\82वा à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤§à¥\8dयाà¤\9aà¥\87 à¤\86वरà¥\8dतन à¤²à¤ªà¤µà¤¿à¤£à¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रित आहात.',
 'revdelete-nologtype-title' => 'कोणताही क्रमलेखप्रकार दिलेला नाही',
 'revdelete-nologtype-text' => 'ही क्रिया करण्यासाठी तुम्ही यादीप्रकार निवडला नाही.',
 'revdelete-nologid-title' => 'अवैध क्रमलेख प्रविष्टी',
@@ -1155,15 +1156,15 @@ $3ने ''$2'' कारण दिले आहे.",
 'logdelete-selected' => "'''{{PLURAL:$1|निवडलेली नोंदीकृत घटना|निवडलेल्या नोंदीकृत घटना}}:'''",
 'revdelete-text' => "'''वगळलेल्या नोंदी आणि घटना अजूनही पानाच्या इतिहासात आणि नोंदीत आढळेल,परंतु मजकुराचा भाग सार्वजनिक स्वरूपात उपलब्ध राहणार नाही.'''
 
-à¤\85à¤\9cà¥\82न à¤\87तर  à¤ªà¥\8dरतिबà¤\82ध à¤\98ातलà¥\8dया à¤¶à¤¿à¤µà¤¾à¤¯ {{SITENAME}}à¤\9aà¥\87 à¤\87तर à¤ªà¥\8dरबà¤\82धà¤\95 à¤\9dाà¤\95लà¥\87ला à¤®à¤\9cà¤\95à¥\81र याच दुव्याने परतवू शकतील.",
-'revdelete-confirm' => 'à¤\95à¥\83पया à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा à¤\95à¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤\9cà¥\87 à¤\95रà¥\80त आहात, त्याचे परिणाम जाणत आहात, आणि ते [[{{MediaWiki:Policy-url}}|मीडियाविकीच्या नीती]]नुसार आहे काय?',
+à¤\85à¤\9cà¥\82न à¤\87तर  à¤ªà¥\8dरतिबà¤\82ध à¤\98ातलà¥\8dया à¤¶à¤¿à¤µà¤¾à¤¯ {{SITENAME}}à¤\9aà¥\87 à¤\87तर à¤ªà¥\8dरबà¤\82धà¤\95 à¤\9dाà¤\95लà¥\87ला à¤®à¤\9cà¤\95à¥\82र याच दुव्याने परतवू शकतील.",
+'revdelete-confirm' => 'à¤\95à¥\83पया à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा à¤\95à¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤\9cà¥\87 à¤\95रित आहात, त्याचे परिणाम जाणत आहात, आणि ते [[{{MediaWiki:Policy-url}}|मीडियाविकीच्या नीती]]नुसार आहे काय?',
 'revdelete-suppress-text' => "लपवण्याचा वापर '''फक्त''' पुढील बाबतीत होतो:
 * अनुपयोगी माहिती
 * अयोग्य व्यक्तिगत माहिती
 *: ''गृहपत्ते, दूरध्वनी क्रमांक व सामाजिक सुरक्षा क्रमांक''",
 'revdelete-legend' => 'दृश्य बंधने निश्चित करा',
-'revdelete-hide-text' => 'à¤\86वरà¥\8dतà¥\80त à¤®à¤\9cà¤\95à¥\81र लपवा',
-'revdelete-hide-image' => 'सà¤\82à¤\9aिà¤\95ा à¤®à¤\9cà¤\95à¥\81र लपवा',
+'revdelete-hide-text' => 'à¤\86वरà¥\8dतà¥\80त à¤®à¤\9cà¤\95à¥\82र लपवा',
+'revdelete-hide-image' => 'सà¤\82à¤\9aिà¤\95ा à¤®à¤\9cà¤\95à¥\82र लपवा',
 'revdelete-hide-name' => 'कृती आणि लक्ष्य लपवा',
 'revdelete-hide-comment' => 'संपादन संक्षेप लपवा',
 'revdelete-hide-user' => 'संपादकाचे सदस्यनाव/आयपी अंकपत्ता लपवा',
@@ -1203,28 +1204,28 @@ $1",
 ** अनुपयोगी माहिती',
 'revdelete-otherreason' => 'इतर / आणखी कारण:',
 'revdelete-reasonotherlist' => 'इतर कारणे',
-'revdelete-edit-reasonlist' => 'वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\95ारणà¥\87 à¤¸à¤\82पादà¥\80त करा',
+'revdelete-edit-reasonlist' => 'वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\95ारणà¥\87 à¤¸à¤\82पादित करा',
 'revdelete-offender' => 'आवर्तन निर्माता:',
 
 # Suppression log
 'suppressionlog' => 'सप्रेशन नोंद',
 'suppressionlogtext' => 'खालील यादी ही रिक्क्त आनी ब्लोक त्याचे प्रकार हे आड्मिनिस्ट्रेटर्स पासून चुपे असतात.
-हà¥\87 à¤¬à¤\98ा [[Special:BlockList|IP block list]] à¤¸à¤¦à¥\8dधà¥\8dया à¤\9aालà¥\81 à¤\85सलà¥\87लà¥\87  à¤\93परà¥\87शà¥\8dनल à¤¬à¤¨à¥\8dस à¤\86णà¥\80 ब्लोच्क्स.',
+हà¥\87 à¤¬à¤\98ा [[Special:BlockList|IP block list]] à¤¸à¤¦à¥\8dधà¥\8dया à¤\9aालà¥\82 à¤\85सलà¥\87लà¥\87  à¤\93परà¥\87शà¥\8dनल à¤¬à¤¨à¥\8dस à¤\86णि ब्लोच्क्स.',
 
 # History merging
-'mergehistory' => 'पान à¤\88तिहासाà¤\82à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरिकरण करा',
+'mergehistory' => 'पान à¤\88तिहासाà¤\82à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरà¥\80करण करा',
 'mergehistory-header' => 'हे पान एका स्रोत पानाचा इतिहास एखाद्या नवीन पानात समाविष्ट करू देते.
 हा बदल पानाचे ऐतिहासिक सातत्य राखेल याची दक्षता घ्या.',
 'mergehistory-box' => 'दोन पानांची आवर्तने संमिलीत करा:',
 'mergehistory-from' => 'स्रोत पान:',
 'mergehistory-into' => 'लक्ष्य पान:',
 'mergehistory-list' => 'गोळाबेरीज करण्याजोगा संपादन इतिहास',
-'mergehistory-merge' => '[[:$1]]à¤\9aà¥\80 à¤ªà¥\82ढà¥\80ल à¤\86वरà¥\8dतनà¥\87 [[:$2]]मधà¥\8dयà¥\87 à¤\8fà¤\95तà¥\8dरित à¤\95रता à¤¯à¥\87तà¥\80ल.ठराविà¤\95 à¤µà¥\87ळà¥\80 à¤\85थवा à¤¤à¤¤à¥\8dपà¥\82रà¥\8dवà¥\80 à¤\9dालà¥\87लà¥\8dया à¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरिà¤\95रण à¤\95रणà¥\8dयाà¤\95रिता à¤°à¥\87डà¥\80ओ कळ स्तंभ वापरा.हा स्तंभ सुचालन दुवे वापरल्यास पूर्वपदावर येईल हे लक्षात घ्या.',
+'mergehistory-merge' => '[[:$1]]à¤\9aà¥\80 à¤ªà¥\81ढà¥\80ल à¤\86वरà¥\8dतनà¥\87 [[:$2]]मधà¥\8dयà¥\87 à¤\8fà¤\95तà¥\8dरित à¤\95रता à¤¯à¥\87तà¥\80ल.ठराविà¤\95 à¤µà¥\87ळà¥\80 à¤\85थवा à¤¤à¤¤à¥\8dपà¥\82रà¥\8dवà¥\80 à¤\9dालà¥\87लà¥\8dया à¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरà¥\80à¤\95रण à¤\95रणà¥\8dयाà¤\95रिता à¤°à¥\87डिओ कळ स्तंभ वापरा.हा स्तंभ सुचालन दुवे वापरल्यास पूर्वपदावर येईल हे लक्षात घ्या.',
 'mergehistory-go' => 'गोळाबेरीज करण्याजोगी संपादने दाखवा',
 'mergehistory-submit' => 'आवर्तने एकत्रित करा.',
 'mergehistory-empty' => 'कोणतेही आवर्तन एकत्रित करता येत नाही.',
-'mergehistory-success' => '[[:$1]] {{PLURAL:$3|à¤\9aà¥\87|à¤\9aà¥\80}} $3 {{PLURAL:$3|à¤\86वरà¥\8dतन|à¤\86वरà¥\8dतनà¥\87}} [[:$2]] à¤®à¤§à¥\8dयà¥\87 à¤¯à¤¶à¤¸à¥\8dवà¥\80रित्या एकत्रित केली.',
-'mergehistory-fail' => 'à¤\87तिहासाà¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरिकरण कार्य करू शकत नाही आहे, कृपया पान आणि वेळ नियमावलीची पुर्नतपासणी करा.',
+'mergehistory-success' => '[[:$1]] {{PLURAL:$3|à¤\9aà¥\87|à¤\9aà¥\80}} $3 {{PLURAL:$3|à¤\86वरà¥\8dतन|à¤\86वरà¥\8dतनà¥\87}} [[:$2]] à¤®à¤§à¥\8dयà¥\87 à¤¯à¤¶à¤¸à¥\8dवà¥\80रà¥\80त्या एकत्रित केली.',
+'mergehistory-fail' => 'à¤\87तिहासाà¤\9aà¥\87 à¤\8fà¤\95तà¥\8dरà¥\80करण कार्य करू शकत नाही आहे, कृपया पान आणि वेळ नियमावलीची पुर्नतपासणी करा.',
 'mergehistory-no-source' => 'स्रोत पान $1 अस्तित्वात नाही.',
 'mergehistory-no-destination' => 'लक्ष्य पान $1  अस्तित्वात नाही.',
 'mergehistory-invalid-source' => 'स्रोत पानाचे शीर्षक योग्य असणे आवश्यक आहे.',
@@ -1238,7 +1239,7 @@ $1",
 'mergelog' => 'नोंदी एकत्र करा',
 'pagemerge-logentry' => '[[$2]]मध्ये[[$1]] समाविष्ट केले ($3पर्यंतची आवर्तने)',
 'revertmerge' => 'वेगवेगळे करा',
-'mergelogpagetext' => 'à¤\8fà¤\95ापानाà¤\9aा à¤\87तिहास à¤\87तर à¤ªà¤¾à¤¨à¤¾à¤¤ à¤\9fाà¤\95à¥\82न à¤\85à¤\97दà¥\80 à¤\85लिकडे एकत्रित केलेली एकत्रिकरणे निम्न्दर्शीत सूचीमध्ये आहेत.',
+'mergelogpagetext' => 'à¤\8fà¤\95ापानाà¤\9aा à¤\87तिहास à¤\87तर à¤ªà¤¾à¤¨à¤¾à¤¤ à¤\9fाà¤\95à¥\82न à¤\85à¤\97दà¥\80 à¤\85लà¥\80कडे एकत्रित केलेली एकत्रिकरणे निम्न्दर्शीत सूचीमध्ये आहेत.',
 
 # Diffs
 'history-title' => '"$1" चा संपादन इतिहास',
@@ -1261,7 +1262,7 @@ $1",
 'toomanymatches' => 'खूप एकसारखी उत्तरे मिळाली, कृपया पृच्छा वेगळ्या तऱ्हेने करून पहा',
 'titlematches' => 'पानाचे शीर्षक जुळते',
 'notitlematches' => 'कोणत्याही पानाचे शीर्षक जुळत नाही',
-'textmatches' => 'पानातà¥\80ल à¤®à¤\9cà¤\95à¥\81र जुळतो',
+'textmatches' => 'पानातà¥\80ल à¤®à¤\9cà¤\95à¥\82र जुळतो',
 'notextmatches' => 'पानातील मजकुराशी जुळत नाही',
 'prevn' => 'मागील {{PLURAL:$1|$1}}',
 'nextn' => 'पुढील {{PLURAL:$1|$1}}',
@@ -1270,8 +1271,8 @@ $1",
 'shown-title' => '$1 {{PLURAL:$1|निकाल|निकाल}} निकाल प्रतिपान पहा',
 'viewprevnext' => 'पहा ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'विकल्प शोधा',
-'searchmenu-exists' => "'''या à¤µà¤¿à¤\95à¥\80वर \"[[:\$1]]\" या नावाचे पान आहे.'''",
-'searchmenu-new' => "'''या à¤µà¤¿à¤\95à¥\80वर \"[[:\$1]]\" हे पान तयार करा!'''",
+'searchmenu-exists' => "'''या à¤µà¤¿à¤\95िवर \"[[:\$1]]\" या नावाचे पान आहे.'''",
+'searchmenu-new' => "'''या à¤µà¤¿à¤\95िवर \"[[:\$1]]\" हे पान तयार करा!'''",
 'searchhelp-url' => 'Help:साहाय्य पृष्ठ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|या उपसर्गानिशी असलेली पाने न्याहाळा]]',
 'searchprofile-articles' => 'संबंधित पाने',
@@ -1301,7 +1302,7 @@ $1",
 'showingresults' => "#'''$2'''पासून {{PLURAL:$1|'''1'''पर्यंतचा निकाल|'''$1'''पर्यंतचे निकाल}} खाली दाखवले आहे.",
 'showingresultsnum' => "खाली दिलेले #'''$2'''पासून सुरू होणारे  {{PLURAL:$3|'''1''' निकाल|'''$3''' निकाल}}.",
 'showingresultsheader' => "'''$4''' साठी {{PLURAL:$5|'''$3'''पैकी '''$1''' निकाल|'''$3''' पैकी '''$1 - $2''' निकाल}}",
-'nonefound' => "'''सà¥\82à¤\9aना''':à¤\95ाहà¥\80 à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवà¥\87à¤\9a à¤¨à¥\87हमà¥\80 à¤¶à¥\8bधलà¥\80 à¤\9cातात. à¤¸à¤°à¥\8dव à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवà¥\87 à¤¶à¥\8bधणà¥\8dयाà¤\95रà¥\80ता (चर्चा पाने, साचे, इ. सकट) कॄपया शोधशब्दांच्या आधी ''all:'' लावून पहा किंवा पाहिजे असलेले नामविश्व लिहा.",
+'nonefound' => "'''सà¥\82à¤\9aना''':à¤\95ाहà¥\80 à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवà¥\87à¤\9a à¤¨à¥\87हमà¥\80 à¤¶à¥\8bधलà¥\80 à¤\9cातात. à¤¸à¤°à¥\8dव à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवà¥\87 à¤¶à¥\8bधणà¥\8dयाà¤\95रिता (चर्चा पाने, साचे, इ. सकट) कॄपया शोधशब्दांच्या आधी ''all:'' लावून पहा किंवा पाहिजे असलेले नामविश्व लिहा.",
 'search-nonefound' => 'दिलेल्या वर्णनाशी जुळणारे निकाल नाहीत.',
 'powersearch' => 'वाढीव शोध',
 'powersearch-legend' => 'वाढीव शोध',
@@ -1312,16 +1313,7 @@ $1",
 'powersearch-toggleall' => 'सर्व',
 'powersearch-togglenone' => 'काहीही नाही',
 'search-external' => 'बाह्य शोध',
-'searchdisabled' => '{{SITENAME}} शोध अनुपलब्ध केला आहे.तो पर्यंत गूगलवरून शोध घ्या.{{SITENAME}}च्या मजकुराची त्यांची सूचिबद्धता शिळी असण्याची शक्यता असु शकते हे लक्षात घ्या.',
-
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'नाही',
-'qbsettings-fixedleft' => 'स्थिर डावे',
-'qbsettings-fixedright' => 'स्थिर ऊजवे',
-'qbsettings-floatingleft' => 'तरंगते डावे',
-'qbsettings-floatingright' => 'तरंगते ऊजवे',
-'qbsettings-directionality' => 'तुमच्या भाशा ची पद्धत दिशात्मक असली पाहिजे.',
+'searchdisabled' => '{{SITENAME}} शोध अनुपलब्ध केला आहे.तो पर्यंत गूगलवरून शोध घ्या.{{SITENAME}}च्या मजकुराची त्यांची सूचिबद्धता शिळी असण्याची शक्यता असू शकते हे लक्षात घ्या.',
 
 # Preferences page
 'preferences' => 'माझ्या पसंती',
@@ -1366,9 +1358,9 @@ $1",
 'recentchangesdays-max' => 'जास्तीतजास्त $1 {{PLURAL:$1|दिवस|दिवस}}',
 'recentchangescount' => 'अलीकडील बदल, इतिहास व नोंद पानांमध्ये दाखवायाच्या संपादनांची संख्या:',
 'prefs-help-recentchangescount' => 'यात नुकतेच झालेले बदल, पानांचे इतिहास व याद्या या गोष्टी असतात.',
-'prefs-help-watchlist-token' => 'या à¤\95à¥\8dषà¥\87तà¥\8dरत à¤\97à¥\81पित à¤\95िलà¥\8dलि प्रदान केल्यस तुमच्या निरीक्षणयादीसाठी एक आरएसएस फीड उत्पन्न होईल.
-à¤\95à¥\8bणà¥\80हà¥\80 à¤\9cà¥\8dयाला à¤¯à¤¾ à¤\95à¥\8dषà¥\87तà¥\8dरातिल à¤\95िलà¥\8dलि à¤®à¤¾à¤¹à¤¿à¤¤ à¤\85सà¥\87ल à¤¤à¥\81मà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणयादà¥\80 à¤µà¤¾à¤\9aà¥\82 à¤¶à¤\95तà¥\8b, à¤¤à¥\8dयमà¥\81ळà¥\87 à¤\95à¥\8bणतà¥\80हà¥\80 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95िलà¥\8dलि निवडा.
-यà¥\87थà¥\87 à¤\8fà¤\95 à¤¯à¤\82तà¥\8dरà¤\9cनित à¤\95िलà¥\8dलि दिलेली आहे गरज असल्यस तुम्ही ती वपरु शकता: $1',
+'prefs-help-watchlist-token' => 'या à¤\95à¥\8dषà¥\87तà¥\8dरत à¤\97à¥\81पित à¤\95िलà¥\8dलà¥\80 प्रदान केल्यस तुमच्या निरीक्षणयादीसाठी एक आरएसएस फीड उत्पन्न होईल.
+à¤\95à¥\8bणà¥\80हà¥\80 à¤\9cà¥\8dयाला à¤¯à¤¾ à¤\95à¥\8dषà¥\87तà¥\8dरातà¥\80ल à¤\95िलà¥\8dलà¥\80 à¤®à¤¾à¤¹à¥\80त à¤\85सà¥\87ल à¤¤à¥\81मà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणयादà¥\80 à¤µà¤¾à¤\9aà¥\82 à¤¶à¤\95तà¥\8b, à¤¤à¥\8dयमà¥\81ळà¥\87 à¤\95à¥\8bणतà¥\80हà¥\80 à¤¸à¥\81रà¤\95à¥\8dषित à¤\95िलà¥\8dलà¥\80 निवडा.
+यà¥\87थà¥\87 à¤\8fà¤\95 à¤¯à¤\82तà¥\8dरà¤\9cनित à¤\95िलà¥\8dलà¥\80 दिलेली आहे गरज असल्यस तुम्ही ती वपरु शकता: $1',
 'savedprefs' => 'तुमच्या पसंती जतन केल्या आहेत.',
 'timezonelegend' => 'वेळक्षेत्र',
 'localtime' => 'स्थानिक वेळ:',
@@ -1410,7 +1402,7 @@ $1",
 'prefs-help-variant' => 'या विकीची पाने दाखवण्यासाठी तुमच्या पसंतीचे शुद्धलेखन',
 'yournick' => 'आपले उपनाव (सहीसाठी)',
 'prefs-help-signature' => 'चर्चा पानावरील टिपणाखाली "<nowiki>~~~~</nowiki>" लिहावे म्हणजे त्याचे रूपांतर आपली सही व सही करण्याची वेळ यात होईल.',
-'badsig' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¸à¤¹à¥\80;HTML à¤\96à¥\82णा तपासा.',
+'badsig' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¸à¤¹à¥\80;HTML à¤\96à¥\81णा तपासा.',
 'badsiglength' => 'तुमची स्वाक्षरी खूप लांब आहे.
 टोपणनाव $1 {{PLURAL:$1|अक्षरापेक्षा|अक्षरांपेक्षा}} कमी लांबीचे हवे.',
 'yourgender' => 'लिंग',
@@ -1458,7 +1450,7 @@ $1",
 * एक * चा अर्थ तुम्ही एकदा समावेश केल्यानंतर तो गट बदलू शकत नाही, किंवा काढल्यानंतर समावेश करू शकत नाही.',
 'userrights-reason' => 'कारण:',
 'userrights-no-interwiki' => 'इतर विकींवरचे सदस्य अधिकार बदलण्याची परवानगी तुम्हाला नाही.',
-'userrights-nodatabase' => 'विदा $1 à¤\85सà¥\8dतà¥\80त्वात नाही अथवा स्थानिक नाही.',
+'userrights-nodatabase' => 'विदा $1 à¤\85सà¥\8dतित्वात नाही अथवा स्थानिक नाही.',
 'userrights-nologin' => 'सदस्य अधिकार देण्यासाठी तुम्ही प्रबंधक म्हणून [[Special:UserLogin|प्रवेश केलेला]] असणे आवश्यक आहे.',
 'userrights-notallowed' => 'तुमच्या सदस्य खात्यास सदस्य अधिकारांची निश्चिती करण्याची परवानगी नाही.',
 'userrights-changeable-col' => 'गट जे तुम्ही बदलू शकता',
@@ -1513,7 +1505,7 @@ $1",
 'right-writeapi' => 'लेखन एपीआय चा उपयोग',
 'right-delete' => 'पृष्ठे वगळा',
 'right-bigdelete' => 'जास्त इतिहास असणारी पाने वगळा',
-'right-deletelogentry' => 'थरविà¤\95à¥\8d à¤²à¥\8bà¤\97à¥\8d à¤ªà¥\8dरवà¥\87शà¥\8d à¤¬à¤¨à¥\8dद à¤\86नि à¤\9aालà¥\81 करने',
+'right-deletelogentry' => 'थरविà¤\95à¥\8d à¤²à¥\8bà¤\97à¥\8d à¤ªà¥\8dरवà¥\87शà¥\8d à¤¬à¤¨à¥\8dद à¤\86नि à¤\9aालà¥\82 करने',
 'right-deleterevision' => 'एखाद्या पानाच्या विशिष्ट आवृत्त्या लपवा',
 'right-deletedhistory' => 'वगळलेल्या इतिहास नोंदी, त्यांच्या संलग्न मजकूराशिवाय पहा',
 'right-deletedtext' => 'वगळलेला मजकूर व वगळलेल्या आवर्तनांमधील बदल पहा',
@@ -1540,12 +1532,12 @@ $1",
 'right-importupload' => 'चढविलेल्या संचिकेतून पाने आयात करा',
 'right-patrol' => 'इतरांची संपादने तपासलेली म्हणून जतन करा',
 'right-autopatrol' => 'संपादने आपोआप तपासलेली (patrolled) म्हणून जतन करा',
-'right-patrolmarks' => 'à¤\85लà¥\80à¤\95डà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\82मधà¥\80ल à¤¤à¤ªà¤¾à¤¸à¤²à¥\8dयाà¤\9aà¥\8dया à¤\96à¥\82णा पहा',
+'right-patrolmarks' => 'à¤\85लà¥\80à¤\95डà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\82मधà¥\80ल à¤¤à¤ªà¤¾à¤¸à¤²à¥\8dयाà¤\9aà¥\8dया à¤\96à¥\81णा पहा',
 'right-unwatchedpages' => 'न पाहिलेल्या पानांची यादी पहा',
 'right-mergehistory' => 'पानांचा इतिहास एकत्रित करा',
 'right-userrights' => 'सर्व सदस्यांचे अधिकार संपादा',
 'right-userrights-interwiki' => 'इतर विकिंवर सदस्य अधिकार बदला',
-'right-siteadmin' => 'माहितà¥\80साठà¥\8dयाला à¤\95à¥\81लà¥\81प लावा अथवा काढा',
+'right-siteadmin' => 'माहितà¥\80साठà¥\8dयाला à¤\95à¥\81लà¥\82प लावा अथवा काढा',
 'right-override-export-depth' => 'पाने निर्यात करा (आंतरिक जेडलेली पाने पाचव्या पतळी पर्यंत समाविष्ट करुन).',
 'right-sendemail' => 'इतर सदस्यांना विपत्रे पाठवा',
 'right-passwordreset' => 'परवलीचा शब्द (पासवर्ड) पुन:स्थापित केल्याची इ मेल पहा.',
@@ -1592,7 +1584,7 @@ $1",
 'action-mergehistory' => 'पानाचा इतिहास विलीन करा',
 'action-userrights' => 'सर्व सदस्यांचे अधिकार संपादित करा',
 'action-userrights-interwiki' => 'इतर विकिंवरच्या सदस्यांचे अधिकार संपादित करा',
-'action-siteadmin' => 'माहितà¥\80साठà¥\8dयाला à¤\95à¥\81लà¥\81प लावा अथवा काढा',
+'action-siteadmin' => 'माहितà¥\80साठà¥\8dयाला à¤\95à¥\81लà¥\82प लावा अथवा काढा',
 'action-sendemail' => 'विपत्रे (ई-मेल्स) पाठवा.',
 
 # Recent changes
@@ -1600,7 +1592,7 @@ $1",
 'recentchanges' => 'अलीकडील बदल',
 'recentchanges-legend' => 'अलीकडील बदल पर्याय',
 'recentchanges-summary' => 'विकितील अलीकडील बदल या पानावर दिसतात.',
-'recentchanges-feed-description' => 'या à¤°à¤¸à¤¦à¥\80मधà¥\80ल à¤µà¤¿à¤\95à¥\80वर झालेले सर्वात अलीकडील बदल पहा.',
+'recentchanges-feed-description' => 'या à¤°à¤¸à¤¦à¥\80मधà¥\80ल à¤µà¤¿à¤\95िवर झालेले सर्वात अलीकडील बदल पहा.',
 'recentchanges-label-newpage' => 'या संपादनाने नवीन पान तयार झाले',
 'recentchanges-label-minor' => 'हा एक छोटा बदल आहे',
 'recentchanges-label-bot' => 'हे संपादन एका सांगकाम्याकडून केले गेले आहे',
@@ -1623,7 +1615,7 @@ $1",
 'newpageletter' => 'न',
 'boteditletter' => 'सां',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|सदस्याने|सदस्यांनी}} पहारा दिलेला आहे]',
-'rc_categories' => 'वरà¥\8dà¤\97ाà¤\82पपà¥\81रतà¥\87 à¤®à¤°à¥\8dयादà¥\80त ठेवा ("|"ने वेगळे करा)',
+'rc_categories' => 'वरà¥\8dà¤\97ाà¤\82पपà¥\81रतà¥\87 à¤®à¤°à¥\8dयादित ठेवा ("|"ने वेगळे करा)',
 'rc_categories_any' => 'कोणतेही',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} बदला',
 'newsectionsummary' => '/* $1 */ नवीन विभाग',
@@ -1652,7 +1644,7 @@ $1",
 'upload_directory_missing' => 'अपलोड डिरेक्टरी ($1) सापडली नाही तसेच वेबसर्व्हर ती तयार करू शकलेला नाही.',
 'upload_directory_read_only' => '$1 या डिरेक्टरी मध्ये सर्व्हर लिहू शकत नाही.',
 'uploaderror' => 'चढवण्यात चूक',
-'upload-recreate-warning' => "'''सावधान: à¤¯à¤¾ à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aà¥\80à¤\95ा à¤µà¤\97ळलà¥\80 à¤\85थवा à¤¸à¥\8dथलाà¤\82तरà¥\80त करण्यात आली आहे.'''
+'upload-recreate-warning' => "'''सावधान: à¤¯à¤¾ à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aà¥\80à¤\95ा à¤µà¤\97ळलà¥\80 à¤\85थवा à¤¸à¥\8dथलाà¤\82तरित करण्यात आली आहे.'''
 या पानाची वगळल्याची व स्थलांतरणाची नोंद तुमच्या सोयीसाठी येथे पुरवली आहे.:",
 'uploadtext' => "खालील अर्ज नवीन संचिका चढविण्यासाठी वापरा.
 पूर्वी चढविलेल्या संचिका पाहण्यासाठी अथवा शोधण्यासाठी [[Special:FileList|चढविलेल्या संचिकांची यादी]] पहा. चढविलेल्या तसेच वगळलेल्या संचिकांची यादी पहाण्यासाठी [[Special:Log/upload|चढवलेल्या संचिकांची सूची]] व [[Special:Log/delete|वगळलेल्या संचिकांची सूची]] पहा.
@@ -1675,10 +1667,10 @@ $1",
 'filesource' => 'स्रोत:',
 'uploadedfiles' => 'चढवलेल्या संचिका',
 'ignorewarning' => 'सुचनेकडे दुर्लक्ष करा आणि संचिका जतन करा.',
-'ignorewarnings' => 'सरà¥\8dव à¤¸à¥\81चनांकडे दुर्लक्ष करा',
+'ignorewarnings' => 'सरà¥\8dव à¤¸à¥\82चनांकडे दुर्लक्ष करा',
 'minlength1' => 'संचिकानाम किमान एक अक्षराचे हवे.',
 'illegalfilename' => '"$1" या संचिकानामात शीर्षकात चालू न शकणारी अक्षरे आहेत. कृपया संचिकानाम बदलून पुन्हा चढवण्याचा प्रयत्न करा.',
-'filename-toolong' => '२४० à¤¬à¤¾à¤\88à¤\9fपà¥\87à¤\95à¥\8dषा à¤«à¤¾à¤\88लचे नांव स्वीकारले जाणार नाही.',
+'filename-toolong' => '२४० à¤¬à¤¾à¤\88à¤\9fपà¥\87à¤\95à¥\8dषा à¤«à¤¾à¤\87लचे नांव स्वीकारले जाणार नाही.',
 'badfilename' => 'संचिकेचे नाव बदलून "$1" असे केले आहे.',
 'filetype-mime-mismatch' => 'संचिका विस्तारक ".$1" ठरवलेल्या एमआयएमई संचिकाप्रकारांशी जुळत नाही ($2).',
 'filetype-badmime' => 'विविधामाप(माईम) "$1" प्रकारच्या संचिका चढवण्यास परवानगी नाही.',
@@ -1691,7 +1683,7 @@ $1",
 'filename-tooshort' => 'तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप कमी होती.',
 'filetype-banned' => 'याप्रकारची संचिका प्रतिबंधित आहे.',
 'verification-error' => 'संचिका पडताळणीत ही संचिका अनुत्तीर्ण झाली.',
-'hookaborted' => 'तà¥\81मà¥\8dहà¥\80 à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bà¥\80णारे संपादन बाह्य हुक द्वारे थंबवण्यात आले.',
+'hookaborted' => 'तà¥\81मà¥\8dहà¥\80 à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bिणारे संपादन बाह्य हुक द्वारे थंबवण्यात आले.',
 'illegal-filename' => 'हे संचिकानाम प्रतिबंधित आहे.',
 'overwrite' => 'अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.',
 'unknown-error' => 'एक अज्ञात चूक उद्भवली.',
@@ -1700,16 +1692,16 @@ $1",
 'large-file' => 'संचिका $1 पेक्षा कमी आकाराची असण्याची अपेक्षा आहे, ही संचिका $2 एवढी आहे.',
 'largefileserver' => 'सेवा संगणकावर (सर्वर) निर्धारित केलेल्या आकारापेक्षा या संचिकेचा आकार मोठा आहे.',
 'emptyfile' => 'चढवलेली संचिका रिकामी आहे. हे संचिकानाम चुकीचे लिहिल्याने असू शकते. कृपया तुम्हाला हीच संचिका चढवायची आहे का ते तपासा.',
-'windows-nonascii-filename' => 'या à¤µà¤¿à¤\95à¥\80वर विशेष चिन्हातील फाईलनांवाचा आधार घेता येणार नाही.',
+'windows-nonascii-filename' => 'या à¤µà¤¿à¤\95िवर विशेष चिन्हातील फाईलनांवाचा आधार घेता येणार नाही.',
 'fileexists' => 'या नावाची संचिका आधीच अस्तित्वात आहे, कृपया ही संचिका बदलण्याबद्दल तुम्ही साशंक असाल तर <strong>[[:$1]]</strong> तपासा.
 [[$1|thumb]]',
 'filepageexists' => 'या नावाचे एक माहितीपृष्ठ (संचिका नव्हे) अगोदरच अस्तित्त्वात आहे. कृपया जर आपणांस त्यात बदल करायचा नसेल तर <strong>[[:$1]]</strong> तपासा.
 [[$1|thumb]]',
 'fileexists-extension' => 'या नावाची संचिका अस्तित्वात आहे: [[$2|thumb]]
-* à¤\9aढवित असलेल्या संचिकेचे नाव: <strong>[[:$1]]</strong>
+* à¤\9aढवà¥\80त असलेल्या संचिकेचे नाव: <strong>[[:$1]]</strong>
 * अस्तित्वात असलेल्या संचिकेचे नाव: <strong>[[:$2]]</strong>
 कृपया दुसरे नाव निवडा.',
-'fileexists-thumbnail-yes' => "à¤\86पण à¤\9aढवित असलेली संचिका ही मोठ्या चित्राची इवलीशी प्रतिकृती ''(thumbnail)'' असण्याची शक्यता आहे. [[$1|इवलेसे]]
+'fileexists-thumbnail-yes' => "à¤\86पण à¤\9aढवà¥\80त असलेली संचिका ही मोठ्या चित्राची इवलीशी प्रतिकृती ''(thumbnail)'' असण्याची शक्यता आहे. [[$1|इवलेसे]]
 कृपया <strong>[[:$1]]</strong> ही संचिका तपासा.
 जर तपासलेली संचिका ही याच आकाराची असेल तर नवीन प्रतिकृती चढविण्याची गरज नाही.",
 'file-thumbnail-no' => 'या संचिकेचे नाव <strong>$1</strong> पासून सुरू होत आहे. ही कदाचित झलक असू शकते.
@@ -1729,12 +1721,12 @@ $1",
 'copyuploaddisabled' => 'आंतरजालपत्त्याद्वारे चढवणे प्रतिबंधित आहे.',
 'uploadfromurl-queued' => 'तुमचे चढवणे नोंदवण्यात आले आहे',
 'uploaddisabledtext' => '{{SITENAME}} वर संचिका चढविण्यास बंदी घालण्यात आलेली आहे.',
-'php-uploaddisabledtext' => 'PHP à¤®à¤§à¥\8dयà¥\87 à¤¸à¤\82à¤\9aिà¤\95ा à¤\9aढवणà¥\87 à¤ªà¥\8dरतिबà¤\82धà¥\80त केले आहे.
+'php-uploaddisabledtext' => 'PHP à¤®à¤§à¥\8dयà¥\87 à¤¸à¤\82à¤\9aिà¤\95ा à¤\9aढवणà¥\87 à¤ªà¥\8dरतिबà¤\82धित केले आहे.
 कृपया file_uploads मांडणी (setting) तपासावी.',
-'uploadscripted' => 'या à¤¸à¤\82à¤\9aिà¤\95à¥\87त HTML à¤\95िà¤\82वा à¤¸à¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤\95à¥\8bडà¤\9aा à¤\86à¤\82तरà¥\8dभाव à¤\86हà¥\87, à¤¤à¥\8dयाà¤\9aा à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤\9aरà¤\95ाà¤\95डà¥\82न à¤µà¤¿à¤\9aà¥\80त्र अर्थ लावला जाऊ शकतो.',
+'uploadscripted' => 'या à¤¸à¤\82à¤\9aिà¤\95à¥\87त HTML à¤\95िà¤\82वा à¤¸à¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤\95à¥\8bडà¤\9aा à¤\86à¤\82तरà¥\8dभाव à¤\86हà¥\87, à¤¤à¥\8dयाà¤\9aा à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤\9aरà¤\95ाà¤\95डà¥\82न à¤µà¤¿à¤\9aित्र अर्थ लावला जाऊ शकतो.',
 'uploadvirus' => 'ह्या संचिकेत व्हायरस आहे. अधिक माहिती: $1',
-'uploadjava' => 'हà¥\80 à¤«à¤¾à¤\88ल à¤\9dà¥\80पà¥\8d à¤¹à¥\8dया à¤ªà¥\8dरà¤\95ारातिल आहे ज्यामधे जाव्हा .क्लास फाईल. आहे,
- à¤\9cावà¥\8dहा à¤«à¤¾à¤\88ल  à¤¹à¥\8dयात à¤µà¤¾à¤ªà¤°à¥\8dता  à¤¯à¥\87नार à¤¨à¤¾à¤¹à¤¿à¤¤ ,à¤\95ारन à¤\88थे सुरक्षेचे कारने येतात्',
+'uploadjava' => 'हà¥\80 à¤«à¤¾à¤\88ल à¤\9dà¥\80पà¥\8d à¤¹à¥\8dया à¤ªà¥\8dरà¤\95ारातà¥\80ल आहे ज्यामधे जाव्हा .क्लास फाईल. आहे,
+ à¤\9cावà¥\8dहा à¤«à¤¾à¤\88ल  à¤¹à¥\8dयात à¤µà¤¾à¤ªà¤°à¥\8dता  à¤¯à¥\87नार à¤¨à¤¾à¤¹à¥\80त ,à¤\95ारन à¤\87थे सुरक्षेचे कारने येतात्',
 'upload-source' => 'स्रोत संचिका',
 'sourcefilename' => 'स्रोत-संचिकानाम:',
 'sourceurl' => 'स्रोत युआरएल',
@@ -1752,13 +1744,13 @@ $1",
 
 $1',
 'upload-warning-subj' => 'चढवताना सूचना',
-'upload-warning-msg' => 'तà¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात [$2] à¤¯à¥\87थà¥\82न à¤\9aà¥\82à¤\95 à¤\9dालà¥\80. à¤¤à¥\81मà¥\8dहà¥\80 [[Special:Upload/stash/$1|à¤\9aढवणà¥\8dयाà¤\9aा à¤\85रà¥\8dà¤\9c]] à¤ªà¥\81नà¥\8dहा à¤­à¤°à¥\81न ही चूक दूर करू शकता.',
+'upload-warning-msg' => 'तà¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात [$2] à¤¯à¥\87थà¥\82न à¤\9aà¥\82à¤\95 à¤\9dालà¥\80. à¤¤à¥\81मà¥\8dहà¥\80 [[Special:Upload/stash/$1|à¤\9aढवणà¥\8dयाà¤\9aा à¤\85रà¥\8dà¤\9c]] à¤ªà¥\81नà¥\8dहा à¤­à¤°à¥\82न ही चूक दूर करू शकता.',
 
 'upload-proto-error' => 'चूकीचा संकेत',
-'upload-proto-error-text' => 'दà¥\82रसà¥\8dथ à¤\9aढवणà¥\8dयाà¤\9aà¥\8dया à¤\95à¥\8dरियà¥\87त <code>http://</code>पासà¥\82न à¤\95िà¤\82वा <code>ftp://</code>पासà¥\82न à¤¸à¥\82रू होणारी URL लागतात.',
+'upload-proto-error-text' => 'दà¥\82रसà¥\8dथ à¤\9aढवणà¥\8dयाà¤\9aà¥\8dया à¤\95à¥\8dरियà¥\87त <code>http://</code>पासà¥\82न à¤\95िà¤\82वा <code>ftp://</code>पासà¥\82न à¤¸à¥\81रू होणारी URL लागतात.',
 'upload-file-error' => 'अंतर्गत त्रूटी',
 'upload-file-error-text' => 'विदादात्यावर तात्पुरती संचिका तयार करण्याच्या प्रयत्न करत असताना अंतर्गत तांत्रिक अडचण आली.कृपया [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.',
-'upload-misc-error' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढविताना à¤®à¤¾à¤¹à¤¿à¤¤ à¤¨à¤¸à¤²à¥\87लà¥\80 à¤¤à¥\8dरà¥\82टी आलेली आहे.',
+'upload-misc-error' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढविताना à¤®à¤¾à¤¹à¥\80त à¤¨à¤¸à¤²à¥\87लà¥\80 à¤¤à¥\8dरà¥\81टी आलेली आहे.',
 'upload-misc-error-text' => 'चढवताना अज्ञात तांत्रिक अडचण आली.कृपया आंतरजालपत्ता सुयोग्य आणि उपलब्ध आहे का ते तपासा आणि पुन्हा प्रयत्न करा. अधिक अडचणी आल्यास तर [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.',
 'upload-too-many-redirects' => 'या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत',
 'upload-unknown-size' => 'अज्ञात आकारमान',
@@ -1789,10 +1781,10 @@ $1',
 'backend-fail-connect' => 'पार्श्वभौमीक साठा "$1"शी संबंध जोडू शकत नाही.',
 'backend-fail-internal' => 'पार्श्वभौमीक साठा "$1" यात अज्ञात चूक झाली आहे.',
 'backend-fail-contenttype' => '"$1" मध्ये ठेवलेल्या फाईलचा महितीचा प्रकार कळत नाही',
-'backend-fail-batchsize' => 'पारà¥\8dशà¥\8dवभà¥\8cमà¥\80à¤\95 à¤¸à¤¾à¤ à¤¯à¤¾à¤¤à¥\80ल à¤¬à¥\85à¤\9a $1 à¤«à¤¾à¤\88ल{{PLURAL:$1|operation|operations}}; à¤®à¤§à¥\87 à¤®à¤°à¥\8dयादà¥\80त कस्त $२ {{PLURAL:$2|operation|operations}} असू शकते',
+'backend-fail-batchsize' => 'पारà¥\8dशà¥\8dवभà¥\8cमà¥\80à¤\95 à¤¸à¤¾à¤ à¤¯à¤¾à¤¤à¥\80ल à¤¬à¥\85à¤\9a $1 à¤«à¤¾à¤\88ल{{PLURAL:$1|operation|operations}}; à¤®à¤§à¥\87 à¤®à¤°à¥\8dयादित कस्त $२ {{PLURAL:$2|operation|operations}} असू शकते',
 
 # Lock manager
-'lockmanager-notlocked' => '"$1" à¤²à¤¾ à¤®à¥\8bà¤\95ळà¥\87 à¤\95रता à¤\86लà¥\87 à¤¨à¤¾à¤¹à¥\80;तà¥\87 à¤\95à¥\81लà¥\81पबंद नाही.',
+'lockmanager-notlocked' => '"$1" à¤²à¤¾ à¤®à¥\8bà¤\95ळà¥\87 à¤\95रता à¤\86लà¥\87 à¤¨à¤¾à¤¹à¥\80;तà¥\87 à¤\95à¥\81लà¥\82पबंद नाही.',
 'lockmanager-fail-closelock' => '"$1" साठी लॉक फाइल बंद करू शकत नाही',
 'lockmanager-fail-deletelock' => '"$1" साठी लॉक फाइल वगळू शकत नाही',
 'lockmanager-fail-acquirelock' => '"$1" साठी लॉक फाइल मिळवू शकत नाही',
@@ -1813,7 +1805,7 @@ $1',
 
 # Special:UploadStash
 'uploadstash' => 'चढवणे लपवा',
-'uploadstash-summary' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\85शà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¤¹à¤¾à¤µà¤¯à¤¾à¤¸à¥\8d à¤®à¤¿à¤³à¤¤à¤¾à¤¤ à¤\9cà¥\8dया à¤\9aढवलà¥\8dया à¤\86हà¥\87त (à¤\85थवा à¤\9aढवलà¥\8dया à¤\9cात à¤\86हà¥\87त) à¤ªà¤°à¤\82तà¥\81 à¤\85à¤\9cà¥\81न विकी वर प्रकाशित केल्या नाहित. या संचिका फक्त त्या सदस्यास् दिसतील ज्याने त्या चढवल्या आहेत, इतर सदस्यांस् त्या दिसणार नाहीत.',
+'uploadstash-summary' => 'या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤\85शà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¤¹à¤¾à¤µà¤¯à¤¾à¤¸à¥\8d à¤®à¤¿à¤³à¤¤à¤¾à¤¤ à¤\9cà¥\8dया à¤\9aढवलà¥\8dया à¤\86हà¥\87त (à¤\85थवा à¤\9aढवलà¥\8dया à¤\9cात à¤\86हà¥\87त) à¤ªà¤°à¤\82तà¥\81 à¤\85à¤\9cà¥\82न विकी वर प्रकाशित केल्या नाहित. या संचिका फक्त त्या सदस्यास् दिसतील ज्याने त्या चढवल्या आहेत, इतर सदस्यांस् त्या दिसणार नाहीत.',
 'uploadstash-clear' => 'लपवलेल्या संचिका काढा',
 'uploadstash-nofiles' => 'तुमच्याकडे लपवलेल्या संचिका नाहीत.',
 'uploadstash-badtoken' => 'हि कृती अयशस्वी होती. कदाचित आपल्या संपादन अधिकारपत्राची (editing credentials) मुदत संपली.',
@@ -1847,7 +1839,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'http-read-error' => 'एचटीटीपी वाचन त्रुटी.',
 'http-timed-out' => 'विनंती वेळ सपला आहे',
 'http-curl-error' => 'आंतरजालपत्ता पकडताना चूक: $1',
-'http-host-unreachable' => 'आंतरजाल पत्त्यापाशी पोहोचले नाही',
 'http-bad-status' => 'एचटीटीपी मागणीदरम्यान एक चूक उद्भवली: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1914,7 +1905,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'uploadnewversion-linktext' => 'या संचिकेची नवीन आवृत्ती चढवा',
 'shared-repo-from' => '$1 पासून',
 'shared-repo' => 'एक मुक्त कोश',
-'upload-disallowed-here' => 'या à¤¸à¤\82à¤\9aिà¤\95à¥\87वर à¤\86पण à¤ªà¥\81नरà¥\8dलिà¤\96ाण à¤\95रà¥\81 शकत नाही.',
+'upload-disallowed-here' => 'या à¤¸à¤\82à¤\9aिà¤\95à¥\87वर à¤\86पण à¤ªà¥\81नरà¥\8dलिà¤\96ाण à¤\95रà¥\82 शकत नाही.',
 
 # File reversion
 'filerevert' => '$1 पूर्वपद',
@@ -1942,7 +1933,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization कृपया हे
 'filedelete-reason-dropdown' => '*वगळण्याची सामान्य कारणे
 ** प्रताधिकार उल्लंघन
 ** जुळी संचिका',
-'filedelete-edit-reasonlist' => 'वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\95ारणà¥\87 à¤¸à¤\82पादà¥\80त करा',
+'filedelete-edit-reasonlist' => 'वà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤\95ारणà¥\87 à¤¸à¤\82पादित करा',
 'filedelete-maintenance' => 'फाईल वगळने आणि पुन्:स्थापित करण्',
 'filedelete-maintenance-title' => 'संचिका (फाईल) वगळू शकत नाही.',
 
@@ -1986,7 +1977,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'statistics-edits' => '{{SITENAME}} च्या सुरुवातीपासूनची पानांची संपादने',
 'statistics-edits-average' => 'प्रतिपान सरासरी संपादने',
 'statistics-views-total' => 'सर्व दाखवते',
-'statistics-views-total-desc' => 'à¤\9cà¥\87 à¤ªà¤¾à¤¨à¥\87 à¤¯à¤¾à¤®à¤§à¥\8dदà¥\87 à¤¨à¤¾à¤¹à¥\80त à¤¤à¥\87 à¤ªà¤¾à¤¹à¤¾ à¤\86नि à¤\96ास à¤ªà¤¾à¤¨à¥\87 à¤¸à¤¾à¤®à¤¿à¤²à¤¾ à¤\95रà¥\81 नका.',
+'statistics-views-total-desc' => 'à¤\9cà¥\87 à¤ªà¤¾à¤¨à¥\87 à¤¯à¤¾à¤®à¤§à¥\8dदà¥\87 à¤¨à¤¾à¤¹à¥\80त à¤¤à¥\87 à¤ªà¤¾à¤¹à¤¾ à¤\86नि à¤\96ास à¤ªà¤¾à¤¨à¥\87 à¤¸à¤¾à¤®à¤¿à¤²à¤¾ à¤\95रà¥\82 नका.',
 'statistics-views-peredit' => 'प्रति संपादनामागे पाहणे',
 'statistics-users' => 'नोंदणीकृत [[Special:ListUsers|सदस्य]]',
 'statistics-users-active' => 'कार्यरत सदस्य',
@@ -1998,7 +1989,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'disambiguations-text' => "निम्नलिखीत पाने एका '''नि:संदिग्धकरण पृष्ठास'''जोडली जातात. त्याऐवजी ती सुयोग्य विषयाशी जोडली जावयास हवीत.<br /> जर जर एखादे पान [[MediaWiki:Disambiguationspage]]पासून जोडलेला साचा वापरत असेल तर ते पान '''नि:संदिग्धकरण पृष्ठ''' गृहीत धरले जाते",
 
 'doubleredirects' => 'दुहेरी-पुनर्निर्देशने',
-'doubleredirectstext' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\85शा à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\81रवतà¥\87 à¤\95à¥\80 à¤\9cà¥\80 à¤ªà¥\81रà¥\8dननिरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨à¥\87 à¤¦à¥\81सऱà¥\8dया à¤ªà¥\81रà¥\8dननिरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨à¤¾à¤\95डà¥\87 à¤¨à¤¿à¤°à¥\8dदà¥\87शà¥\80त झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनास दुवा दिला आहे सोबतच दुसरे पुर्ननिर्देशन ज्या पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असण्याची शक्यता आहे ,ते वस्तुतः पहिल्या पानापासूनचेही पुर्ननिर्देशन असावयास हवे.',
+'doubleredirectstext' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\85शा à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\81रवतà¥\87 à¤\95à¥\80 à¤\9cà¥\80 à¤ªà¥\81रà¥\8dननिरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨à¥\87 à¤¦à¥\81सऱà¥\8dया à¤ªà¥\81रà¥\8dननिरà¥\8dदà¥\87शà¥\80त à¤ªà¤¾à¤¨à¤¾à¤\95डà¥\87 à¤¨à¤¿à¤°à¥\8dदà¥\87शित झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनास दुवा दिला आहे सोबतच दुसरे पुर्ननिर्देशन ज्या पानाकडे पोहचते ते पण दिले आहे, जे की बरोबर असण्याची शक्यता आहे ,ते वस्तुतः पहिल्या पानापासूनचेही पुर्ननिर्देशन असावयास हवे.',
 'double-redirect-fixed-move' => '[[$1]] हलवले गेले आहे.
 ते [[$2]] येथे निर्देशित होते.',
 'double-redirect-fixed-maintenance' => '[[$1]] ते [[$2]] हे चुकीचे पुनर्निर्देशन नीट केले.',
@@ -2028,7 +2019,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'ntransclusions' => '$1{{PLURAL:$1|पानावर|पानांवर}} वापर',
 'specialpage-empty' => 'या अहवालाकरिता(रिपोर्ट)कोणताही निकाल नाही.',
 'lonelypages' => 'पोरकी पाने',
-'lonelypagestext' => 'à¤\96ालà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82ना {{SITENAME}}à¤\9aà¥\8dया à¤\87तर à¤ªà¤¾à¤¨à¤¾à¤\82à¤\95डà¥\82न à¤¦à¥\82वा जोड झालेली नाही.',
+'lonelypagestext' => 'à¤\96ालà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82ना {{SITENAME}}à¤\9aà¥\8dया à¤\87तर à¤ªà¤¾à¤¨à¤¾à¤\82à¤\95डà¥\82न à¤¦à¥\81वा जोड झालेली नाही.',
 'uncategorizedpages' => 'अवर्गीकृत पाने',
 'uncategorizedcategories' => 'अवर्गीकृत वर्ग',
 'uncategorizedimages' => 'अवर्गीकृत चित्रे',
@@ -2040,8 +2031,8 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'wantedpages' => 'पाहिजे असलेले लेख',
 'wantedpages-badtitle' => 'परिणामाच्या यादीत अवैध शीर्षक: $1',
 'wantedfiles' => 'पाहिजे असलेल्या संचिका',
-'wantedfiletext-cat' => 'पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतà¥\80त्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील. अशी पाने [[:$1]] येथे दिसतील.',
-'wantedfiletext-nocat' => 'पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतà¥\80त्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील.',
+'wantedfiletext-cat' => 'पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतित्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील. अशी पाने [[:$1]] येथे दिसतील.',
+'wantedfiletext-nocat' => 'पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतित्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील.',
 'wantedtemplates' => 'पाहिजे असलेले साचे',
 'mostlinked' => 'सर्वाधिक जोडलेली पाने',
 'mostlinkedcategories' => 'सर्वाधिक जोडलेले वर्ग',
@@ -2059,11 +2050,11 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'protectedpages' => 'सुरक्षित पाने',
 'protectedpages-indef' => 'फक्त अनंत काळासाठी सुरक्षित केलेले',
 'protectedpages-cascade' => 'केवळ एकामेकांवर अवलंबून कास्केडींग सुरक्षा (सुरक्षा शिडी)',
-'protectedpagestext' => 'à¤\96ालà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\8dथानाà¤\82तरण à¤\95िà¤\82वा à¤¸à¤\82पादन à¤¯à¤¾à¤\82पासà¥\81न सुरक्षित आहेत',
-'protectedpagesempty' => 'सधà¥\8dया à¤¯à¤¾ à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80नà¥\87 à¤\95à¥\8bणतà¥\80हà¥\80 à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\81रà¤\95à¥\8dषà¥\80त केलेली नाहीत.',
+'protectedpagestext' => 'à¤\96ालà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\8dथानाà¤\82तरण à¤\95िà¤\82वा à¤¸à¤\82पादन à¤¯à¤¾à¤\82पासà¥\82न सुरक्षित आहेत',
+'protectedpagesempty' => 'सधà¥\8dया à¤¯à¤¾ à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80नà¥\87 à¤\95à¥\8bणतà¥\80हà¥\80 à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित केलेली नाहीत.',
 'protectedtitles' => 'सुरक्षीत शीर्षके',
-'protectedtitlestext' => 'पà¥\81ढà¥\80ल à¤¶à¤¿à¤°à¥\8dषà¤\95à¥\87 à¤¬à¤¦à¤² à¤\98डवणà¥\8dयापासà¥\82न à¤¸à¥\81रà¤\95à¥\8dषà¥\80त आहेत.',
-'protectedtitlesempty' => 'या à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80नà¥\87 à¤¸à¤§à¥\8dया à¤\95à¥\8bणतà¥\80हà¥\80 à¤¶à¥\80रà¥\8dषà¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषà¥\80त केलेली नाहीत.',
+'protectedtitlestext' => 'पà¥\81ढà¥\80ल à¤¶à¥\80रà¥\8dषà¤\95à¥\87 à¤¬à¤¦à¤² à¤\98डवणà¥\8dयापासà¥\82न à¤¸à¥\81रà¤\95à¥\8dषित आहेत.',
+'protectedtitlesempty' => 'या à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80नà¥\87 à¤¸à¤§à¥\8dया à¤\95à¥\8bणतà¥\80हà¥\80 à¤¶à¥\80रà¥\8dषà¤\95à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित केलेली नाहीत.',
 'listusers' => 'सदस्यांची यादी',
 'listusers-editsonly' => 'फक्त संपादनांसहित सदस्य दाखवा',
 'listusers-creationsort' => 'निर्मितीच्या तारखेप्रमाणे लावा',
@@ -2097,9 +2088,9 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'speciallogtitlelabel' => 'उद्दिष्ट (लक्ष):',
 'log' => 'नोंदी',
 'all-logs-page' => 'सर्व नोंदी',
-'alllogstext' => '{{SITENAME}}à¤\9aà¥\8dया à¤¸à¤°à¥\8dव à¤¨à¥\8bà¤\82दà¥\80à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dर à¤¦à¤°à¥\8dशन.नà¥\8bà¤\82द à¤ªà¥\8dरà¤\95ार, à¤¸à¤¦à¤¸à¥\8dयनाव à¤\95िà¤\82वा à¤¬à¤¾à¤§à¥\80त à¤ªà¤¾à¤¨ à¤¨à¤¿à¤µà¤¡à¥\82न à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\87 à¤¦à¥\83शà¥\8dयपान à¤®à¤°à¥\8dयादà¥\80त करू शकता.',
+'alllogstext' => '{{SITENAME}}à¤\9aà¥\8dया à¤¸à¤°à¥\8dव à¤¨à¥\8bà¤\82दà¥\80à¤\9aà¥\87 à¤\8fà¤\95तà¥\8dर à¤¦à¤°à¥\8dशन.नà¥\8bà¤\82द à¤ªà¥\8dरà¤\95ार, à¤¸à¤¦à¤¸à¥\8dयनाव à¤\95िà¤\82वा à¤¬à¤¾à¤§à¤¿à¤¤ à¤ªà¤¾à¤¨ à¤¨à¤¿à¤µà¤¡à¥\82न à¤¤à¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\87 à¤¦à¥\83शà¥\8dयपान à¤®à¤°à¥\8dयादित करू शकता.',
 'logempty' => 'नोंदीत अशी बाब नाही.',
-'log-title-wildcard' => 'या à¤®à¤\9cà¤\95à¥\81रापासà¥\82न à¤¸à¥\81रà¥\82 à¤¹à¥\8bणारà¥\80 à¤¶à¤¿र्षके शोधा.',
+'log-title-wildcard' => 'या à¤®à¤\9cà¤\95à¥\81रापासà¥\82न à¤¸à¥\81रà¥\82 à¤¹à¥\8bणारà¥\80 à¤¶à¥\80र्षके शोधा.',
 'showhideselectedlogentries' => 'निवडलेले लॉग पहाणे /लपवणे',
 
 # Special:AllPages
@@ -2150,7 +2141,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'linksearch-error' => 'वाईल्डकार्ड्स होस्ट नावाच्या फक्त सुरवातीलाच येऊ शकतात.',
 
 # Special:ListUsers
-'listusersfrom' => 'पà¥\81ढà¥\80ल à¤¶à¤¬à¥\8dदापासà¥\81न सुरू होणारे सदस्य दाखवा:',
+'listusersfrom' => 'पà¥\81ढà¥\80ल à¤¶à¤¬à¥\8dदापासà¥\82न सुरू होणारे सदस्य दाखवा:',
 'listusers-submit' => 'दाखवा',
 'listusers-noresult' => 'एकही सदस्य सापडला नाही.',
 'listusers-blocked' => '(खंडित)',
@@ -2159,7 +2150,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'activeusers' => 'कार्यरत सदस्यांची यादी',
 'activeusers-intro' => '$1 {{PLURAL:$1|day|days}} मधे शेवटी काम केलेल्या सदस्यांची यादी येथे मिळेल',
 'activeusers-count' => 'शेवटच्या {{PLURAL:$3|दिवसात|$3 दिवसांत}} $1 {{PLURAL:$1|संपादन|संपादने}}',
-'activeusers-from' => 'पà¥\81ढà¥\80ल à¤¶à¤¬à¥\8dदापासà¥\81न सुरू होणारे सदस्य दाखवा:',
+'activeusers-from' => 'पà¥\81ढà¥\80ल à¤¶à¤¬à¥\8dदापासà¥\82न सुरू होणारे सदस्य दाखवा:',
 'activeusers-hidebots' => 'सांगकामे लपवा',
 'activeusers-hidesysops' => 'प्रचालक लपवा',
 'activeusers-noresult' => 'एकही सदस्य सापडला नाही.',
@@ -2184,20 +2175,20 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 
 # Email user
 'mailnologin' => 'पाठविण्याचा पत्ता नाही',
-'mailnologintext' => 'à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤µà¤¿à¤ªà¤¤à¥\8dर(à¤\88-मà¥\87ल) à¤ªà¤¾à¤ à¤µà¤£à¥\8dयाà¤\95रिता à¤¤à¥\81मà¥\8dहà¥\80 [[Special:UserLogin|पà¥\8dरवà¥\87श à¤\95à¥\87लà¥\87ला]] à¤\85सणà¥\87 à¤\86णि  à¤ªà¥\8dरमाणित (à¤\88-मà¥\87ल) à¤ªà¤¤à¥\8dता à¤¤à¥\81मà¤\9aà¥\8dया [[Special:Preferences|पसà¤\82तà¥\80त]] à¤¨à¤®à¥\81द असणे आवश्यक आहे.',
+'mailnologintext' => 'à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤µà¤¿à¤ªà¤¤à¥\8dर(à¤\88-मà¥\87ल) à¤ªà¤¾à¤ à¤µà¤£à¥\8dयाà¤\95रिता à¤¤à¥\81मà¥\8dहà¥\80 [[Special:UserLogin|पà¥\8dरवà¥\87श à¤\95à¥\87लà¥\87ला]] à¤\85सणà¥\87 à¤\86णि  à¤ªà¥\8dरमाणित (à¤\88-मà¥\87ल) à¤ªà¤¤à¥\8dता à¤¤à¥\81मà¤\9aà¥\8dया [[Special:Preferences|पसà¤\82तà¥\80त]] à¤¨à¤®à¥\82द असणे आवश्यक आहे.',
 'emailuser' => 'या सदस्याला ई-मेल पाठवा',
 'emailuser-title-target' => '{{GENDER:$1|सदस्याला}} विपत्र पाठवा',
 'emailuser-title-notarget' => 'विपत्र (ईमेल) उपयोगकर्ता',
 'emailpage' => 'विपत्र (ईमेल) उपयोगकर्ता',
-'emailpagetext' => 'à¤\9cर à¤¯à¤¾ à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤ªà¥\8dरमाणित à¤µà¤¿à¤ªà¤¤à¥\8dर (à¤\88मà¥\87ल)पतà¥\8dता à¤¤à¥\80à¤\9aà¥\8dया à¤\85थवा à¤¤à¥\8dयाà¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80त à¤¨à¤®à¥\81द à¤\95à¥\87ला à¤\85सà¥\87ल,तर à¤\96ालà¥\80ल à¤¸à¤¾à¤°à¤£à¥\80 à¤¤à¥\81मà¥\8dहाला à¤\8fà¤\95(à¤\9a) à¤¸à¤\82दà¥\87श à¤ªà¤¾à¤ à¤µà¥\87ल.तà¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\8dया [[Special:Preferences|सदसà¥\8dय à¤ªà¤¸à¤\82तà¥\80त]] à¤¨à¤®à¥\81द केलेला विपत्र पत्ता "कडून" पत्त्यात येईल म्हणजे  प्राप्तकरता आपल्याला उत्तर देऊ शकेल.',
+'emailpagetext' => 'à¤\9cर à¤¯à¤¾ à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤ªà¥\8dरमाणित à¤µà¤¿à¤ªà¤¤à¥\8dर (à¤\88मà¥\87ल)पतà¥\8dता à¤¤à¤¿à¤\9aà¥\8dया à¤\85थवा à¤¤à¥\8dयाà¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80त à¤¨à¤®à¥\82द à¤\95à¥\87ला à¤\85सà¥\87ल,तर à¤\96ालà¥\80ल à¤¸à¤¾à¤°à¤£à¥\80 à¤¤à¥\81मà¥\8dहाला à¤\8fà¤\95(à¤\9a) à¤¸à¤\82दà¥\87श à¤ªà¤¾à¤ à¤µà¥\87ल.तà¥\81मà¥\8dहà¥\80 à¤¤à¥\81मà¤\9aà¥\8dया [[Special:Preferences|सदसà¥\8dय à¤ªà¤¸à¤\82तà¥\80त]] à¤¨à¤®à¥\82द केलेला विपत्र पत्ता "कडून" पत्त्यात येईल म्हणजे  प्राप्तकरता आपल्याला उत्तर देऊ शकेल.',
 'usermailererror' => 'पत्र बाब त्रुटी वापस पाठवली:',
 'defemailsubject' => '{{SITENAME}} "$1" सदस्याकडून विपत्र',
-'usermaildisabled' => 'सदसà¥\8dय à¤µà¤¿à¤ªà¤¤à¥\8dर à¤¨à¤¿à¤·à¥\8dà¤\95à¥\8dरà¥\80य आहे',
+'usermaildisabled' => 'सदसà¥\8dय à¤µà¤¿à¤ªà¤¤à¥\8dर à¤¨à¤¿à¤·à¥\8dà¤\95à¥\8dरिय आहे',
 'usermaildisabledtext' => 'या विकिवर तुम्हाला इतर सदस्यांना विपत्रे पाठवता येत नाहीत',
 'noemailtitle' => 'विपत्र पत्ता नाही',
 'noemailtext' => 'या सदस्याने वैध विपत्र पत्ता नमूद केलेला नाही.',
 'nowikiemailtitle' => 'विपत्र प्रतिबंधित',
-'nowikiemailtext' => 'हा à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\95डà¥\81न  à¤\88-मà¥\87ल à¤\98à¥\87à¤\8a à¤\88च्छित नाही.',
+'nowikiemailtext' => 'हा à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85नà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\95डà¥\82न  à¤\88-मà¥\87ल à¤\98à¥\87à¤\8a à¤\87च्छित नाही.',
 'emailnotarget' => 'प्राप्तकर्ता करीता अस्तित्वात नसलेले  किंवा अवैध सदस्य',
 'emailtarget' => 'प्राप्तकर्ता प्रयोक्ताचे नांव टाका.',
 'emailusername' => 'सदस्यनाम:',
@@ -2236,12 +2227,12 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watchthispage' => 'या पानावर बदलांसाठी लक्ष ठेवा.',
 'unwatch' => 'पहारा काढा',
 'unwatchthispage' => 'पहारा काढून टाका',
-'notanarticle' => 'मà¤\9cà¤\95à¥\81र à¤µà¤¿à¤°à¤¹à¥\80त पान',
+'notanarticle' => 'मà¤\9cà¤\95à¥\81र à¤µà¤¿à¤°à¤¹à¤¿त पान',
 'notvisiblerev' => 'आवृत्ती वगळण्यात आलेली आहे',
 'watchnochange' => 'प्रदर्शित कालावधीत, तुम्ही नित्य पहाण्यासाठी ठेवलेली कोणतीही बाब संपादित झाली नाही.',
 'watchlist-details' => '{{PLURAL:$1|$1 पान|$1 पाने}} पहाऱ्याच्या सूचीमध्ये, चर्चा पाने मोजलेले नाहीत.',
-'wlheader-enotif' => '* विपत्र सूचना सुविधा ऊपलब्ध केली.',
-'wlheader-showupdated' => "तुम्ही पानांस दिलेल्या शेवटच्या भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
+'wlheader-enotif' => 'विपत्र सूचना सुविधा उपलब्ध केली.',
+'wlheader-showupdated' => "तुम्ही पानांस दिलेल्या शेवटच्या भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
 'watchmethod-recent' => 'पहाऱ्यातील पानांकरिता अलीकडील बदलांचा तपास',
 'watchmethod-list' => 'अलीकडील बदलांकरिता पहाऱ्यातील पानांचा तपास',
 'watchlistcontains' => 'तुमचा $1 {{PLURAL:$1|पानावर|पानांवर}} पहारा आहे.',
@@ -2256,7 +2247,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'watcherrortext' => '$1 साठीच्या तुमच्या पहाऱ्याच्या सूचीमधील मांडणीत (watchlist settings) बदल करताना त्रुटी आली.',
 
 'enotif_mailer' => '{{SITENAME}} सूचना विपत्र',
-'enotif_reset' => 'सरà¥\8dव à¤ªà¤¾à¤¨à¤¾à¤¸ à¤­à¥\87à¤\9f à¤¦à¤¿à¤²à¥\8dयाà¤\9aà¥\87 à¤¨à¤®à¥\81द करा',
+'enotif_reset' => 'सरà¥\8dव à¤ªà¤¾à¤¨à¤¾à¤¸ à¤­à¥\87à¤\9f à¤¦à¤¿à¤²à¥\8dयाà¤\9aà¥\87 à¤¨à¤®à¥\82द करा',
 'enotif_impersonal_salutation' => '{{SITENAME}} सदस्य',
 'enotif_subject_deleted' => '{{SITENAME}} पानाला $1 {{gender:$2|$2}} ने वगळले',
 'enotif_subject_created' => '{{SITENAME}} पान $1  {{gender:$2|$2}} ने तयार केले',
@@ -2306,7 +2297,7 @@ $UNWATCHURL
 'delete-legend' => 'वगळा',
 'historywarning' => 'सूचना: तुम्ही वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:',
 'confirmdeletetext' => 'तुम्ही एक लेख त्याच्या सर्व इतिहासासोबत वगळण्याच्या तयारीत आहात.
-à¤\95à¥\83पया à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रत à¤\85सलà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤¹à¥\80 à¤®à¥\80डियाविà¤\95à¥\80à¤\9aà¥\8dया [[{{MediaWiki:Policy-url}}|नà¥\80तà¥\80नà¥\81सार]] à¤\86हà¥\87 à¤¹à¥\8dयाà¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा. à¤¤à¤¸à¥\87à¤\9a à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रà¥\80त à¤\85सलà¥\87लà¥\8dया à¤\95à¥\83तà¥\80à¤\9aà¥\87 à¤ªà¤°à¥\80णाम कृती करण्यापूर्वी जाणून घ्या.',
+à¤\95à¥\83पया à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रत à¤\85सलà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤¹à¥\80 à¤®à¥\80डियाविà¤\95à¥\80à¤\9aà¥\8dया [[{{MediaWiki:Policy-url}}|नà¥\80तà¥\80नà¥\81सार]] à¤\86हà¥\87 à¤¹à¥\8dयाà¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा. à¤¤à¤¸à¥\87à¤\9a à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रित à¤\85सलà¥\87लà¥\8dया à¤\95à¥\83तà¥\80à¤\9aà¥\87 à¤ªà¤°à¤¿णाम कृती करण्यापूर्वी जाणून घ्या.',
 'actioncomplete' => 'काम पूर्ण',
 'actionfailed' => 'कृती अयशस्वी झाली',
 'deletedtext' => '"$1" हा लेख वगळला. अलीकडे वगळलेले लेख पाहण्यासाठी $2 पहा.',
@@ -2335,12 +2326,12 @@ $UNWATCHURL
 'rollbacklinkcount-morethan' => '$1 पेक्षा अधिक उलटवा {{PLURAL:$1|संपादन|संपादने}}',
 'rollbackfailed' => 'द्रूतमाघार फसली',
 'cantrollback' => 'जुन्या आवृत्तीकडे परतवता येत नाही; शेवटचा संपादक या पानाचा एकमात्र लेखक आहे.',
-'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]] [[Special:Contributions/$2|{{int:contribslink}}]])à¤\9aà¥\87 à¤¶à¥\87वà¤\9fाà¤\9aà¥\87 [[:$1]]वà¥\87 à¤¸à¤\82पादन à¤®à¤¾à¤\98ारà¥\80 à¤ªà¤°à¤¤à¤µà¤¤à¤¾ à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80; à¤ªà¤¾à¤¨ à¤\86धà¥\80à¤\9a à¤\95à¥\81णà¥\80 à¤®à¤¾à¤\98ारà¥\80 à¤ªà¤°à¤¤à¤µà¤²à¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤¸à¤\82पादà¥\80त केले आहे.
+'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]] [[Special:Contributions/$2|{{int:contribslink}}]])à¤\9aà¥\87 à¤¶à¥\87वà¤\9fाà¤\9aà¥\87 [[:$1]]वà¥\87 à¤¸à¤\82पादन à¤®à¤¾à¤\98ारà¥\80 à¤ªà¤°à¤¤à¤µà¤¤à¤¾ à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80; à¤ªà¤¾à¤¨ à¤\86धà¥\80à¤\9a à¤\95à¥\81णà¥\80 à¤®à¤¾à¤\98ारà¥\80 à¤ªà¤°à¤¤à¤µà¤²à¥\87 à¤\86हà¥\87 à¤\95िà¤\82वा à¤¸à¤\82पादित केले आहे.
 
 शेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]] [[Special:Contributions/$3|{{int:contribslink}}]])-चे होते.',
 'editcomment' => "संपादन सारांश \"''\$1''\" होता.",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]]) यांनी केलेले बदल [[User:$1|$1]] यांच्या आवृत्तीकडे पूर्वपदास नेले.',
-'revertpage-nouser' => '(सदसà¥\8dयनाम à¤\95ाढà¥\82न à¤\9fाà¤\95लà¥\87) à¤¯à¤¾à¤\82à¤\9aà¥\87 à¤¬à¤¦à¤² à¤\89लà¤\9fवà¥\81न [[User:$1|$1]] यांच्या मागील आवृत्तीस न्या.',
+'revertpage-nouser' => '(सदसà¥\8dयनाम à¤\95ाढà¥\82न à¤\9fाà¤\95लà¥\87) à¤¯à¤¾à¤\82à¤\9aà¥\87 à¤¬à¤¦à¤² à¤\89लà¤\9fवà¥\82न [[User:$1|$1]] यांच्या मागील आवृत्तीस न्या.',
 'rollback-success' => '$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.',
 
 # Edit tokens
@@ -2349,7 +2340,7 @@ $UNWATCHURL
 
 # Protect
 'protectlogpage' => 'सुरक्षा नोंदी',
-'protectlogtext' => 'पानाà¤\82ना à¤²à¤¾à¤µà¤²à¥\87लà¥\8dया à¤¤à¤¾à¤³à¥\8dयाà¤\82à¤\9aà¥\80 à¤\86णि à¤¤à¤¾à¤³à¥\87 à¤\89à¤\98डणà¥\8dयाबदà¥\8dदलà¤\9aà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\96ालà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¦à¤¿à¤²à¥\80 à¤\86हà¥\87.सधà¥\8dयाà¤\9aà¥\8dया à¤¸à¥\81रà¤\95à¥\8dषà¥\80त पानांबद्दलच्या माहितीकरिता [[Special:ProtectedPages|सुरक्षीत पानांची सूची]] पहा.',
+'protectlogtext' => 'पानाà¤\82ना à¤²à¤¾à¤µà¤²à¥\87लà¥\8dया à¤¤à¤¾à¤³à¥\8dयाà¤\82à¤\9aà¥\80 à¤\86णि à¤¤à¤¾à¤³à¥\87 à¤\89à¤\98डणà¥\8dयाबदà¥\8dदलà¤\9aà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\96ालà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¦à¤¿à¤²à¥\80 à¤\86हà¥\87.सधà¥\8dयाà¤\9aà¥\8dया à¤¸à¥\81रà¤\95à¥\8dषित पानांबद्दलच्या माहितीकरिता [[Special:ProtectedPages|सुरक्षीत पानांची सूची]] पहा.',
 'protectedarticle' => '"[[$1]]" सुरक्षित केला',
 'modifiedarticleprotection' => '"[[$1]]"करिता सुरक्षापातळी बदलली',
 'unprotectedarticle' => '"[[$1]]" असुरक्षित केला.',
@@ -2358,7 +2349,7 @@ $UNWATCHURL
 'protect-title-notallowed' => '"$1" ची सुरक्षा पातळी पहा',
 'prot_1movedto2' => '"[[$1]]" हे पान "[[$2]]" मथळ्याखाली स्थानांतरित केले.',
 'protect-badnamespace-title' => 'असुरक्षणीय नामविश्व',
-'protect-badnamespace-text' => 'या à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\81रà¤\95à¥\8dषà¥\80त करता येत नाहीत',
+'protect-badnamespace-text' => 'या à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल à¤ªà¤¾à¤¨à¥\87 à¤¸à¥\81रà¤\95à¥\8dषित करता येत नाहीत',
 'protect-norestrictiontypes-text' => 'हे पान सुरक्षित होऊ शकत नाही कारण कोणताही सुरक्षापातळी प्रकार उपलब्ध नाही.',
 'protect-norestrictiontypes-title' => 'सुरक्षापातळी नसलेले पान',
 'protect-legend' => 'सुरक्षापातळीतील बदल निर्धारित करा',
@@ -2368,7 +2359,7 @@ $UNWATCHURL
 'protect_expiry_old' => 'संपण्याचा कालावधी उलटून गेलेला आहे.',
 'protect-unchain-permissions' => 'पुढील संरक्षित विकल्प उघडा.',
 'protect-text' => "'''$1''' या पानाची सुरक्षापातळी तुम्ही इथे पाहू शकता अथवा बदलू शकता.",
-'protect-locked-blocked' => "तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¤\82धà¥\80त असताना सुरक्षा पातळी बदलू शकत नाही.येथे '''$1''' पानाकरिता सध्याची मांडणावळ आहे:",
+'protect-locked-blocked' => "तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¤\82धित असताना सुरक्षा पातळी बदलू शकत नाही.येथे '''$1''' पानाकरिता सध्याची मांडणावळ आहे:",
 'protect-locked-dblock' => "विदागारास ताळे लागलेले असताना सुरक्षा पातळी बदलता येत नाही.येथे '''$1''' पानाकरिता सध्याची मांडणावळ आहे:",
 'protect-locked-access' => "तुम्हाला या पानाची सुरक्षा पातळी बदलण्याचे अधिकार नाहीत.
 '''$1''' या पानाची सुरक्षा पातळी पुढीलप्रमाणे:",
@@ -2388,7 +2379,7 @@ $UNWATCHURL
 'protect-existing-expiry' => 'शेवट दिनांक: $3, $2',
 'protect-otherreason' => 'इतर / अतिरिक्त कारण:',
 'protect-otherreason-op' => 'दुसरे कारण',
-'protect-dropdown' => '* à¤¸à¥\81रà¤\95à¥\8dषà¥\80त करण्याची सामान्य कारणे
+'protect-dropdown' => '* à¤¸à¥\81रà¤\95à¥\8dषित करण्याची सामान्य कारणे
 ** अती उपद्रव
 ** अती उत्पात
 ** अनुत्पादक संपादन युद्ध
@@ -2417,17 +2408,17 @@ $UNWATCHURL
 'undeletepage' => 'वगळलेली पाने पहा आणि पुनर्स्थापित करा',
 'undeletepagetitle' => "'''खाली [[:$1]] च्या वगळलेल्या आवृत्त्या समाविष्ट केलेल्या आहेत'''.",
 'viewdeletedpage' => 'काढून टाकलेले लेख पहा',
-'undeletepagetext' => 'à¤\96ालà¥\80ल {{PLURAL:$1|पान à¤µà¤\97ळलà¥\87 à¤\86हà¥\87 à¤¤à¤°à¥\80सà¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87 à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87|$1 à¤ªà¤¾à¤¨à¥\87 à¤µà¤\97ळलà¥\80 à¤\86हà¥\87त à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87त à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87त}}. à¤µà¤¿à¤¦à¤¾à¤\97ारातà¥\80ल à¤¸à¤¾à¤ à¤µà¤£ à¤ à¤°à¤¾à¤µà¤¿क कालावधीने स्वच्छ करता येते.',
+'undeletepagetext' => 'à¤\96ालà¥\80ल {{PLURAL:$1|पान à¤µà¤\97ळलà¥\87 à¤\86हà¥\87 à¤¤à¤°à¥\80सà¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87 à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87|$1 à¤ªà¤¾à¤¨à¥\87 à¤µà¤\97ळलà¥\80 à¤\86हà¥\87त à¤¤à¤°à¥\80 à¤¸à¥\81दà¥\8dधा à¤µà¤¿à¤¦à¤¾à¤\97ारात à¤\9cतन à¤\86हà¥\87त à¤\86णि à¤ªà¥\81रà¥\8dनà¥\8dसà¥\8dथापित à¤\95रणà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87त}}. à¤µà¤¿à¤¦à¤¾à¤\97ारातà¥\80ल à¤¸à¤¾à¤ à¤µà¤£ à¤ à¤°à¤¾à¤µà¥\80क कालावधीने स्वच्छ करता येते.',
 'undelete-fieldset-title' => 'आवर्तने पुनर्स्थापित करा',
-'undeleteextrahelp' => "सà¤\82पà¥\82रà¥\8dण à¤ªà¤¾à¤¨ à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रणà¥\8dयाà¤\95रिता,सारà¥\87 à¤°à¤\95ानà¥\87 à¤°à¤¿à¤\95ामà¥\87 à¤ à¥\87वा à¤\86णि '''''पà¥\81नरà¥\8dसà¥\8dथापन'''''वर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. à¤¨à¤¿à¤µà¤¡à¤\95 à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\95रणà¥\8dयाà¤\95रिता, à¤\9cà¥\8dया à¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\87 à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\95रावयाà¤\9aà¥\87 à¤¤à¥\8dयाà¤\82à¤\9aà¥\87 à¤°à¤\95ानà¥\87 à¤¨à¤¿à¤µà¤¡à¤¾ , à¤\86णि '''''पà¥\81नरà¥\8dसà¥\8dथापन'''''वर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. '''''पà¥\81नरà¥\8dयà¥\8bà¤\9cन ''''' à¤µà¤° à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤²à¥\8dयास à¤¸à¤¾à¤°à¥\87 à¤°à¤\95ानà¥\87 à¤\86णि à¤ªà¥\8dरतिà¤\95à¥\8dरà¥\80या खिडकी रिकामी होईल.",
+'undeleteextrahelp' => "सà¤\82पà¥\82रà¥\8dण à¤ªà¤¾à¤¨ à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रणà¥\8dयाà¤\95रिता,सारà¥\87 à¤°à¤\95ानà¥\87 à¤°à¤¿à¤\95ामà¥\87 à¤ à¥\87वा à¤\86णि '''''पà¥\81नरà¥\8dसà¥\8dथापन'''''वर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. à¤¨à¤¿à¤µà¤¡à¤\95 à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\95रणà¥\8dयाà¤\95रिता, à¤\9cà¥\8dया à¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\87 à¤ªà¥\81नरà¥\8dसà¥\8dथापन à¤\95रावयाà¤\9aà¥\87 à¤¤à¥\8dयाà¤\82à¤\9aà¥\87 à¤°à¤\95ानà¥\87 à¤¨à¤¿à¤µà¤¡à¤¾ , à¤\86णि '''''पà¥\81नरà¥\8dसà¥\8dथापन'''''वर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. '''''पà¥\81नरà¥\8dयà¥\8bà¤\9cन ''''' à¤µà¤° à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤²à¥\8dयास à¤¸à¤¾à¤°à¥\87 à¤°à¤\95ानà¥\87 à¤\86णि à¤ªà¥\8dरतिà¤\95à¥\8dरिया खिडकी रिकामी होईल.",
 'undeleterevisions' => '$1 {{PLURAL:$1|आवर्तन|आवर्तने}}विदागारात संचीत',
 'undeletehistory' => 'जर तुम्ही पान पुनर्स्थापित केले तर ,सारी आवर्तने इतिहासात पुनर्स्थापित होतील.
 वगळल्या पासून त्याच नावाचे नवे पान तयार केले गेले असेले तर, पुनर्स्थापित आवर्तने पाठीमागील इतिहासात दिसतील. पुनर्स्थापना नंतर संचिकांच्या आवर्तनांवरील बंधने गळून पडतील याची नोंद घ्या.',
 'undeleterevdel' => 'पृष्ठ पानाचे आवर्तन अर्धवट वगळले जाणार असेल तर पुनर्स्थापनाची कृती केली जाणार नाही.
 अशा प्रसंगी, तुम्ही अगदी अलीकडील वगळलेली आवर्तने अनचेक किंवा अनहाईड केलीच पाहिजे.',
-'undeletehistorynoadmin' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤µà¤\97ळलà¥\87 à¤\97à¥\87लà¥\87 à¤\86हà¥\87.वà¤\97ळणà¥\8dयाà¤\9aà¥\87 à¤\95ारण à¤\96ालà¥\80ल à¤\86ढावà¥\8dयात,वà¤\97ळणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤¸à¤\82पादà¥\80त à¤\95रणाऱà¥\8dया à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\8dया à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¸à¥\8bबत,दाà¤\96वलà¥\87 à¤\86हà¥\87. à¤µà¤\97ळलà¥\87लà¥\8dया à¤\86वरà¥\8dतà¥\8dनाà¤\82à¤\9aा à¤¨à¥\87मà¤\95ा à¤®à¤\9cà¤\95à¥\81र केवळ प्रचालकांना उपलब्ध असेल.',
+'undeletehistorynoadmin' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤µà¤\97ळलà¥\87 à¤\97à¥\87लà¥\87 à¤\86हà¥\87.वà¤\97ळणà¥\8dयाà¤\9aà¥\87 à¤\95ारण à¤\96ालà¥\80ल à¤\86ढावà¥\8dयात,वà¤\97ळणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤¸à¤\82पादित à¤\95रणाऱà¥\8dया à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\8dया à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¸à¥\8bबत,दाà¤\96वलà¥\87 à¤\86हà¥\87. à¤µà¤\97ळलà¥\87लà¥\8dया à¤\86वरà¥\8dतà¥\8dनाà¤\82à¤\9aा à¤¨à¥\87मà¤\95ा à¤®à¤\9cà¤\95à¥\82र केवळ प्रचालकांना उपलब्ध असेल.',
 'undelete-revision' => '$1चे($4चे, $5 येथील) आवर्तन $3 ने वगळले:',
-'undeleterevision-missing' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤\85थवा à¤¨à¤¸à¤¾à¤ªà¤¡à¤£à¤¾à¤°à¥\87 à¤\86वरà¥\8dतन. à¤¤à¥\81मà¤\9aा à¤¦à¥\81वा à¤\95दाà¤\9aित à¤\9aà¥\82कीचा असेल, किंवा आवर्तन पुनर्स्थापित केले गेले असेल किंवा विदागारातून वगळले असेल.',
+'undeleterevision-missing' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤\85थवा à¤¨à¤¸à¤¾à¤ªà¤¡à¤£à¤¾à¤°à¥\87 à¤\86वरà¥\8dतन. à¤¤à¥\81मà¤\9aा à¤¦à¥\81वा à¤\95दाà¤\9aित à¤\9aà¥\81कीचा असेल, किंवा आवर्तन पुनर्स्थापित केले गेले असेल किंवा विदागारातून वगळले असेल.',
 'undelete-nodiff' => 'पूर्वीचे कोणतेही आवर्तन आढळले नाही.',
 'undeletebtn' => 'वगळण्याची क्रिया रद्द करा',
 'undeletelink' => 'पहा/पुनर्स्थापित करा',
@@ -2445,16 +2436,16 @@ $UNWATCHURL
 'undelete-header' => 'अलीकडील वगळलेल्या पानांकरिता [[Special:Log/delete|वगळलेल्या नोंदी]] पहा.',
 'undelete-search-title' => 'वगळलेली पाने शोधा',
 'undelete-search-box' => 'वगळलेली पाने शोधा',
-'undelete-search-prefix' => 'पासà¥\82न à¤¸à¥\82रू होणारी पाने दाखवा:',
+'undelete-search-prefix' => 'पासà¥\82न à¤¸à¥\81रू होणारी पाने दाखवा:',
 'undelete-search-submit' => 'शोध',
 'undelete-no-results' => 'वगळलेल्यांच्या विदांमध्ये जुळणारी पाने सापडली नाहीत.',
 'undelete-filename-mismatch' => '$1 वेळेचे, वगळलेल्या संचिकेचे आवर्तन उलटवता येत नाही: नजुळणारे संचिकानाव',
 'undelete-bad-store-key' => '$1 वेळ दिलेली संचिका आवर्तन पुनर्स्थापित करता येत नाही:संचिका वगळण्यापूर्वी पासून मिळाली नव्हती.',
-'undelete-cleanup-error' => 'न à¤µà¤¾à¤ªà¤°à¤²à¥\87लà¥\80 à¤µà¤¿à¤¦à¤¾ à¤¸à¤\82à¤\9aिà¤\95ा "$1" à¤µà¤\97ळताना à¤¤à¥\8dरà¥\82टी दाखवते.',
+'undelete-cleanup-error' => 'न à¤µà¤¾à¤ªà¤°à¤²à¥\87लà¥\80 à¤µà¤¿à¤¦à¤¾ à¤¸à¤\82à¤\9aिà¤\95ा "$1" à¤µà¤\97ळताना à¤¤à¥\8dरà¥\81टी दाखवते.',
 'undelete-missing-filearchive' => 'संचिका विदास्मृती ID $1 पुनर्स्थापित करू शकत नाही कारण ती विदागारात उपलब्ध नाही. ती आधीच पुनर्स्थापित केली असण्याची शक्यता सुद्धा असू शकते.',
-'undelete-error' => 'à¤\9cर à¤ªà¤¾à¤¨à¤¾ à¤\95ाढà¥\81न नाही टाकले तर पान शीर्षक',
+'undelete-error' => 'à¤\9cर à¤ªà¤¾à¤¨à¤¾ à¤\95ाढà¥\82न नाही टाकले तर पान शीर्षक',
 'undelete-error-short' => 'संचिकेचे वगळणे उलटवताना त्रूटी: $1',
-'undelete-error-long' => 'सà¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤µà¤\97ळणà¥\87 à¤\89लà¤\9fवताना à¤¤à¥\8dरà¥\82टींचा अडथळा आला:
+'undelete-error-long' => 'सà¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤µà¤\97ळणà¥\87 à¤\89लà¤\9fवताना à¤¤à¥\8dरà¥\81टींचा अडथळा आला:
 
 $1',
 'undelete-show-file-confirm' => 'तुम्ही "<nowiki>$1</nowiki>" या संचिकेचे $2 येथून $3 वेळी असलेले आवर्तन नक्की पहाणार आहात?',
@@ -2463,7 +2454,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'नामविश्व:',
 'invert' => 'निवडीचा क्रम उलटा करा',
-'tooltip-invert' => 'निवडलà¥\87लà¥\8dया à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल (à¤\86णि à¤¤à¤¸à¥\87 à¤¨à¤¿à¤µà¤¡à¤²à¥\8dयास à¤¸à¤\82बà¤\82धà¥\80त नामविश्वातील)  पानांचे बदल  अदृष्य करण्या साटी टिचकी मारा',
+'tooltip-invert' => 'निवडलà¥\87लà¥\8dया à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवातà¥\80ल (à¤\86णि à¤¤à¤¸à¥\87 à¤¨à¤¿à¤µà¤¡à¤²à¥\8dयास à¤¸à¤\82बà¤\82धित नामविश्वातील)  पानांचे बदल  अदृष्य करण्या साटी टिचकी मारा',
 'namespace_association' => 'सहभागी नामविश्वे',
 'tooltip-namespace_association' => 'निवडलेल्या नामविश्वासंबधीत विषय अथवा चर्चा नामविश्वसुद्धा आंतर्भूत करण्याकरिता हा बॉक्स टिचकवून चिह्नित करा',
 'blanknamespace' => '(मुख्य)',
@@ -2522,7 +2513,7 @@ $1',
 'blockip' => 'हा अंकपत्ता अडवा',
 'blockip-title' => 'सदस्यास प्रतिबंध करा',
 'blockip-legend' => 'सदस्यास प्रतिबंध करा',
-'blockiptext' => 'à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयाà¤\9aà¥\80 à¤\95िà¤\82वा à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\80 à¤²à¤¿à¤¹à¤¿à¤£à¥\8dयाà¤\9aà¥\80 à¤\95à¥\8dषमता à¤ªà¥\8dरतिबà¤\82धà¥\80त  करण्याकरिता खालील सारणी वापरा.
+'blockiptext' => 'à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयाà¤\9aà¥\80 à¤\95िà¤\82वा à¤¸à¤¦à¤¸à¥\8dयाà¤\9aà¥\80 à¤²à¤¿à¤¹à¤¿à¤£à¥\8dयाà¤\9aà¥\80 à¤\95à¥\8dषमता à¤ªà¥\8dरतिबà¤\82धित  करण्याकरिता खालील सारणी वापरा.
 हे केवळ उच्छेद टाळण्याच्याच दृष्टीने आणि [[{{MediaWiki:Policy-url}}|निती]]स अनुसरून केले पाहिजे.
 खाली विशिष्ट कारण भरा(उदाहरणार्थ,ज्या पानांवर उच्छेद माजवला गेला त्यांची उद्धरणे देऊन).',
 'ipadressorusername' => 'अंकपत्ता किंवा सदस्यनाम:',
@@ -2538,9 +2529,9 @@ $1',
 ** असंख्य खात्यांचा गैरवापर
 ** अस्वीकार्य सदस्यनाम',
 'ipb-hardblock' => 'या अंक पत्यावरुन (IP address) प्रवेश केलेल्या सदस्यांना बदल करण्यापासून प्रतिबंध करा.',
-'ipbcreateaccount' => 'à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤ªà¥\8dरतिबà¤\82धà¥\80त करा',
-'ipbemailban' => 'सदसà¥\8dयाà¤\82ना à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¤¾à¤ à¤µà¤£à¥\8dयापासà¥\82न à¤ªà¥\8dरतिबà¤\82धà¥\80त करा',
-'ipbenableautoblock' => 'या à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\87ला à¤¶à¥\87वà¤\9fà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता à¤\86णि à¤\9cà¥\87थà¥\82न à¤¯à¤¾ à¤ªà¥\81ढà¥\87 à¤¤à¥\8b à¤¸à¤\82पादनाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रà¥\87ल à¤¤à¥\87 à¤¸à¤°à¥\8dव à¤\85à¤\82à¤\95पतà¥\8dतà¥\87 à¤\86पà¥\8bà¤\86प à¤ªà¥\8dरतिबà¤\82धà¥\80त करा.',
+'ipbcreateaccount' => 'à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤ªà¥\8dरतिबà¤\82धित करा',
+'ipbemailban' => 'सदसà¥\8dयाà¤\82ना à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¤¾à¤ à¤µà¤£à¥\8dयापासà¥\82न à¤ªà¥\8dरतिबà¤\82धित करा',
+'ipbenableautoblock' => 'या à¤¸à¤¦à¤¸à¥\8dयानà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\87ला à¤¶à¥\87वà¤\9fà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता à¤\86णि à¤\9cà¥\87थà¥\82न à¤¯à¤¾ à¤ªà¥\81ढà¥\87 à¤¤à¥\8b à¤¸à¤\82पादनाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रà¥\87ल à¤¤à¥\87 à¤¸à¤°à¥\8dव à¤\85à¤\82à¤\95पतà¥\8dतà¥\87 à¤\86पà¥\8bà¤\86प à¤ªà¥\8dरतिबà¤\82धित करा.',
 'ipbsubmit' => 'हा पत्ता अडवा',
 'ipbother' => 'इतर वेळ:',
 'ipboptions' => '२ तास:2 hours,१ दिवस:1 day,३ दिवस:3 days,१ आठवडा:1 week,२ आठवडे:2 weeks,१ महिना:1 month,३ महिने:3 months,६ महिने:6 months,१ वर्ष:1 year,अनंत:infinite',
@@ -2548,12 +2539,12 @@ $1',
 'ipbotherreason' => 'इतर/अजून कारण:',
 'ipbhidename' => 'सदस्य नाम प्रतिबंधन नोंदी, प्रतिबंधनाची चालू यादी आणि सदस्य यादी इत्यादीतून लपवा',
 'ipbwatchuser' => 'या सदस्याच्या सदस्य तसेच चर्चा पानावर पहारा ठेवा',
-'ipb-disableusertalk' => 'सदसà¥\8dयास à¤¸à¥\8dवत:à¤\9aà¥\87 à¤\9aरà¥\8dà¤\9aापान à¤¸à¤\82पादणà¥\8dयापासà¥\82न à¤ªà¥\8dरतिबà¤\82धà¥\80त करा',
+'ipb-disableusertalk' => 'सदसà¥\8dयास à¤¸à¥\8dवत:à¤\9aà¥\87 à¤\9aरà¥\8dà¤\9aापान à¤¸à¤\82पादणà¥\8dयापासà¥\82न à¤ªà¥\8dरतिबà¤\82धित करा',
 'ipb-change-block' => 'युपयोगकर्ताला पुन्हा ब्लाक करा सोबत स्थानिक सेथिँग.',
 'ipb-confirm' => 'अडथाळा सुनिश्चित करा.',
 'badipaddress' => 'अंकपत्ता बरोबर नाही.',
 'blockipsuccesssub' => 'अडवणूक यशस्वी झाली',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ला à¤ªà¥\8dरतिबà¤\82धà¥\80त केले.<br />
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]ला à¤ªà¥\8dरतिबà¤\82धित केले.<br />
 प्रतिबंधनांचा आढावा घेण्याकरिता [[Special:BlockList|अंकपत्ता प्रतिबंधन सूची]] पहा.',
 'ipb-blockingself' => 'तुम्ही स्वतःलाच प्रतिबंधित करत आहात! तुम्ही ते नक्की करणार आहात का?',
 'ipb-confirmhideuser' => 'तुमच्याकडून सदस्य प्रतिबंधनासोबतच "सदस्य लपवला" जातो आहे.या कृउतीने सर्व याद्या आणि नोंदीतून सदस्य नाव लपविले जाते.असे करावयाचे आहे या बद्दल आपली खात्री आहे काय ?',
@@ -2588,11 +2579,11 @@ $1',
 'expiringblock' => 'समाप्ति $1 $2',
 'anononlyblock' => 'केवळ अनामिक',
 'noautoblockblock' => 'स्व्यंचलितप्रतिबंधन स्थगित केले',
-'createaccountblock' => 'à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤ªà¥\8dरतिबà¤\82धà¥\80त केली',
+'createaccountblock' => 'à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤ªà¥\8dरतिबà¤\82धित केली',
 'emailblock' => 'विपत्र प्रतिबंधीत',
 'blocklist-nousertalk' => 'ला स्वतःचे चर्चापान संपादता येत नाही',
 'ipblocklist-empty' => 'प्रतिबंधन यादी रिकामी आहे.',
-'ipblocklist-no-results' => 'विनà¤\82तà¥\80 à¤\95à¥\87लà¥\87ला à¤\85à¤\82à¤\95पतà¥\8dता à¤\85थवा à¤¸à¤¦à¤¸à¥\8dयनाव à¤ªà¥\8dरतिबà¤\82धà¥\80त केलेले नाही.',
+'ipblocklist-no-results' => 'विनà¤\82तà¥\80 à¤\95à¥\87लà¥\87ला à¤\85à¤\82à¤\95पतà¥\8dता à¤\85थवा à¤¸à¤¦à¤¸à¥\8dयनाव à¤ªà¥\8dरतिबà¤\82धित केलेले नाही.',
 'blocklink' => 'अडवा',
 'unblocklink' => 'सोडवा',
 'change-blocklink' => 'ब्लॉक बदला',
@@ -2601,12 +2592,12 @@ $1',
 'autoblocker' => 'स्वयंचलितप्रतिबंधन केले गेले कारण तुमचा अंकपत्ता अलीकडे "[[User:$1|$1]]"ने वापरला होता. $1 च्या प्रतिबंधनाकरिता दिलेले कारण: "$2" आहे.',
 'blocklogpage' => 'ब्लॉक यादी',
 'blocklog-showlog' => 'या सदस्यावर आधी बन्दी घालन्यात आली आहे. बन्दी सन्दर्भातील अधिक नोन्दी येथे आहेत',
-'blocklog-showsuppresslog' => 'हा à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\81रà¥\8dवà¥\80 à¤ªà¥\8dरतिबà¤\82धà¥\80त अथवा लपविला गेला होता.
+'blocklog-showsuppresslog' => 'हा à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\82रà¥\8dवà¥\80 à¤ªà¥\8dरतिबà¤\82धित अथवा लपविला गेला होता.
 लपविलेल्या नोंदी खाली संदर्भाकरिता उपलब्ध आहेत.',
 'blocklogentry' => '[[$1]] ला $2 $3 पर्यंत ब्लॉक केलेले आहे',
-'reblock-logentry' => ' $2 $3 à¤¹à¤¿ à¤\85à¤\82तà¥\80म वेळ देऊन   [[$1]] चे प्रतिबंधन बदलले',
+'reblock-logentry' => ' $2 $3 à¤¹à¥\80 à¤\85à¤\82तिम वेळ देऊन   [[$1]] चे प्रतिबंधन बदलले',
 'blocklogtext' => 'ही सदस्यांच्या प्रतिबंधनाची आणि प्रतिबंधने उठवल्याची नोंद आहे.
-à¤\86पà¥\8bà¤\86प à¤ªà¥\8dरतिबà¤\82धà¥\80त केलेले अंकपत्ते नमूद केलेले नाहीत.
+à¤\86पà¥\8bà¤\86प à¤ªà¥\8dरतिबà¤\82धित केलेले अंकपत्ते नमूद केलेले नाहीत.
 सध्या लागू असलेली बंदी व प्रतिबंधनांच्या यादीकरिता [[Special:BlockList|अंकपत्ता प्रतिबंधन सूची]] पहा.',
 'unblocklogentry' => 'प्रतिबंधन $1 हटवले',
 'block-log-flags-anononly' => 'केवळ अनामिक सदस्य',
@@ -2618,35 +2609,35 @@ $1',
 'block-log-flags-hiddenname' => 'सदस्यनाम लपवलेले आहे',
 'range_block_disabled' => 'प्रचालकांची पल्ला बंधने घालण्याची क्षमता अनुपलब्ध केली आहे.',
 'ipb_expiry_invalid' => 'अयोग्य समाप्ती काळ.',
-'ipb_expiry_temp' => 'लपविलà¥\87लà¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम à¤ªà¥\8dरतिबà¤\82धन à¤\95ायमसà¥\8dवरà¥\81पी असले पाहिजे.',
+'ipb_expiry_temp' => 'लपविलà¥\87लà¥\87 à¤¸à¤¦à¤¸à¥\8dयनाम à¤ªà¥\8dरतिबà¤\82धन à¤\95ायमसà¥\8dवरà¥\82पी असले पाहिजे.',
 'ipb_hide_invalid' => 'हे खात दाबन्यासाथि असमर्थ: ते सुध्दा बदल करन्याचि सकतात.',
 'ipb_already_blocked' => '"$1" आधीच अवरूद्ध केलेले आहे.',
-'ipb-needreblock' => '$1 à¤\86धà¥\80à¤\9a à¤ªà¥\8dरतिबà¤\82धà¥\80त à¤\86हà¥\87 . à¤¤à¥\81मà¥\8dहाला à¤¤à¥\8dयाà¤\9aि सेटींग्स बदलण्याची इच्छा आहे का ?',
+'ipb-needreblock' => '$1 à¤\86धà¥\80à¤\9a à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87 . à¤¤à¥\81मà¥\8dहाला à¤¤à¥\8dयाà¤\9aà¥\80 सेटींग्स बदलण्याची इच्छा आहे का ?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|दुसरे प्रतिबंधन|इतर प्रतिबंधने}}',
 'unblock-hideuser' => 'सदस्याचे नाव हे गोपनीय असल्यामुळे हे सदस्य खाते आपण गोठवू शकत नाही',
 'ipb_cant_unblock' => 'त्रूटी: प्रतिबंधन क्र.$1 मिळाला नाही. त्यावरील प्रतिबंधन कदाचित आधीच उठवले असेल.',
-'ipb_blocked_as_range' => 'तà¥\8dरà¥\82à¤\9fà¥\80:à¤\85à¤\82à¤\95पतà¥\8dता IP $1 à¤¹à¤¾ à¤ªà¥\8dरतà¥\8dयà¤\95à¥\8dषपणà¥\87 à¤ªà¥\8dरतिबà¤\82धà¥\80त à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80 à¤\86णि à¤\85पà¥\8dरतिबà¤\82धà¥\80त à¤\95रता à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80.तà¥\8b,à¤\85रà¥\8dथात,$2पलà¥\8dलà¥\8dयाà¤\9aा à¤­à¤¾à¤\97 à¤®à¥\8dहाणà¥\82न à¤¤à¥\8b à¤ªà¥\8dरतिबà¤\82धà¥\80त केलेला आहे,जो की अप्रतिबंधीत करता येत नाही.',
+'ipb_blocked_as_range' => 'तà¥\8dरà¥\82à¤\9fà¥\80:à¤\85à¤\82à¤\95पतà¥\8dता IP $1 à¤¹à¤¾ à¤ªà¥\8dरतà¥\8dयà¤\95à¥\8dषपणà¥\87 à¤ªà¥\8dरतिबà¤\82धित à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80 à¤\86णि à¤\85पà¥\8dरतिबà¤\82धà¥\80त à¤\95रता à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80.तà¥\8b,à¤\85रà¥\8dथात,$2पलà¥\8dलà¥\8dयाà¤\9aा à¤­à¤¾à¤\97 à¤®à¥\8dहाणà¥\82न à¤¤à¥\8b à¤ªà¥\8dरतिबà¤\82धित केलेला आहे,जो की अप्रतिबंधीत करता येत नाही.',
 'ip_range_invalid' => 'अंकपत्ता अयोग्य टप्प्यात.',
 'ip_range_toolarge' => '/$1 पेक्षा मोठ्या Range प्रतिबंधनाची परवानगी नाह् are not allowed.',
-'blockme' => 'मला à¤ªà¥\8dरतिबà¤\82धà¥\80त करा',
+'blockme' => 'मला à¤ªà¥\8dरतिबà¤\82धित करा',
 'proxyblocker' => 'प्रातिनिधी(प्रॉक्झी)प्रतिबंधक',
 'proxyblocker-disabled' => 'हे कार्य अवरूद्ध केले आहे.',
-'proxyblockreason' => 'तà¥\81मà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता à¤ªà¥\8dरतिबà¤\82धà¥\80त केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्ना कडे लक्ष वेधा.',
+'proxyblockreason' => 'तà¥\81मà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता à¤ªà¥\8dरतिबà¤\82धित केला आहे कारण तो उघड-उघड प्रतिनिधी आहे.कृपया तुमच्या आंतरजाल सेवा दात्यास किंवा तंत्रज्ञास पाचारण संपर्क करा आणि त्यांचे या गंभीर सुरक्षाप्रश्ना कडे लक्ष वेधा.',
 'proxyblocksuccess' => 'झाले.',
 'sorbsreason' => '{{SITENAME}}ने वापरलेल्या DNSBL मध्ये तुमच्या अंकपत्त्याची नोंद उघड-उघड प्रतिनिधी म्हणून सूचित केली आहे.',
 'sorbs_create_account_reason' => '{{SITENAME}}च्या DNSBLने तुमचा अंकपत्ता उघड-उघड प्रतिनिधी म्हणून सूचित केला आहे.तुम्ही खाते उघडू शकत नाही',
 'cant-block-while-blocked' => 'तुम्ही स्वतः प्रतिबंधित असताना इतरांना प्रतिबंधित करू शकत नाही.',
-'cant-see-hidden-user' => 'तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¥\8dà¤\82धà¤\95रणà¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सलà¥\87लà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤\96ातà¥\87 à¤\86धà¥\80पासà¥\82नà¤\9a à¤ªà¥\8dरतिबà¤\82धà¥\80त आणि लपविले गेले आहे.
-तà¥\81मà¤\9aà¥\8dयाà¤\95डà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤²à¤ªà¤µà¤¿à¤£à¥\8dयाà¤\9aà¥\87 à¤\85धिà¤\95ार à¤¨à¤¸à¤²à¥\8dयामà¥\81ळà¥\87 , à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\8dरतिबà¤\82धन  à¤ªà¤¾à¤¹à¥\82 à¤\85थवा à¤¸à¤\82पादà¥\80त करू शकत नाही',
-'ipbblocked' => 'तà¥\81मà¤\9aà¥\87 à¤¸à¥\8dवत:à¤\9aà¥\87à¤\9a à¤\96ातà¥\87 à¤ªà¥\8dरतिबà¤\82धà¥\80त à¤\85सलà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\81मà¥\8dहà¥\80 à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धà¥\80त किंवा अप्रतिबंधीत करू शकत नाही',
+'cant-see-hidden-user' => 'तà¥\81मà¥\8dहà¥\80 à¤ªà¥\8dरतिबà¥\8dà¤\82धà¤\95रणà¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सलà¥\87लà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤\96ातà¥\87 à¤\86धà¥\80पासà¥\82नà¤\9a à¤ªà¥\8dरतिबà¤\82धित आणि लपविले गेले आहे.
+तà¥\81मà¤\9aà¥\8dयाà¤\95डà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤²à¤ªà¤µà¤¿à¤£à¥\8dयाà¤\9aà¥\87 à¤\85धिà¤\95ार à¤¨à¤¸à¤²à¥\8dयामà¥\81ळà¥\87 , à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¥\8dरतिबà¤\82धन  à¤ªà¤¾à¤¹à¥\82 à¤\85थवा à¤¸à¤\82पादित करू शकत नाही',
+'ipbblocked' => 'तà¥\81मà¤\9aà¥\87 à¤¸à¥\8dवत:à¤\9aà¥\87à¤\9a à¤\96ातà¥\87 à¤ªà¥\8dरतिबà¤\82धित à¤\85सलà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\81मà¥\8dहà¥\80 à¤\87तर à¤¸à¤¦à¤¸à¥\8dयाà¤\82ना à¤ªà¥\8dरतिबà¤\82धित किंवा अप्रतिबंधीत करू शकत नाही',
 'ipbnounblockself' => 'तुम्ही स्वतः अप्रतिबंधित करू शकत नाही',
 
 # Developer tools
 'lockdb' => 'विदागारास ताळे ठोका',
 'unlockdb' => 'विदागाराचे ताळे उघडा',
-'lockdbtext' => 'विदाà¤\97ारास à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\8dयानà¥\87 à¤¸à¤°à¥\8dव à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¤\82पादन à¤\95à¥\8dषमता, à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80 à¤¬à¤¦à¤²à¤£à¥\87,तà¥\8dयाà¤\82à¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त à¤\95रणà¥\87,à¤\86णि à¤µà¤¿à¤¦à¥\87त à¤¬à¤¦à¤² à¤\98डवणाऱà¥\8dया à¤\87तर à¤\97à¥\8bषà¥\8dà¤\9fà¥\80 à¤¸à¤\82सà¥\8dथà¤\97à¥\80त होतील.
+'lockdbtext' => 'विदाà¤\97ारास à¤¤à¤¾à¤³à¥\87 à¤ à¥\8bà¤\95लà¥\8dयानà¥\87 à¤¸à¤°à¥\8dव à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¤\82पादन à¤\95à¥\8dषमता, à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80 à¤¬à¤¦à¤²à¤£à¥\87,तà¥\8dयाà¤\82à¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित à¤\95रणà¥\87,à¤\86णि à¤µà¤¿à¤¦à¥\87त à¤¬à¤¦à¤² à¤\98डवणाऱà¥\8dया à¤\87तर à¤\97à¥\8bषà¥\8dà¤\9fà¥\80 à¤¸à¤\82सà¥\8dथà¤\97ित होतील.
 कृपया तुम्हाला हेच करावयाचे आहे आणि भरण-पोषणा नंतर विदागाराचे ताळे उघडावयाचे आहे हे निश्चित करा.',
-'unlockdbtext' => 'विदाà¤\97ाराà¤\9aà¥\87 à¤¤à¤¾à¤³à¥\87 à¤\89à¤\98डलà¥\8dयानà¥\87 à¤¸à¤°à¥\8dव à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¤\82पादन à¤\95à¥\8dषमता, à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80 à¤¬à¤¦à¤²à¤£à¥\87,तà¥\8dयाà¤\82à¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त करणे,आणि विदेत बदल घडवणाऱ्या इतर गोष्टीची क्षमता पुन्हा उपलब्ध होईल.
+'unlockdbtext' => 'विदाà¤\97ाराà¤\9aà¥\87 à¤¤à¤¾à¤³à¥\87 à¤\89à¤\98डलà¥\8dयानà¥\87 à¤¸à¤°à¥\8dव à¤¸à¤¦à¤¸à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¤\82पादन à¤\95à¥\8dषमता, à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¸à¤\82तà¥\80 à¤¬à¤¦à¤²à¤£à¥\87,तà¥\8dयाà¤\82à¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित करणे,आणि विदेत बदल घडवणाऱ्या इतर गोष्टीची क्षमता पुन्हा उपलब्ध होईल.
 कृपया तुम्हाला हेच करावयाचे आहे हे निश्चित करा.',
 'lockconfirm' => 'होय,मला खरेच विदागारास ताळे ठोकायच आहे.',
 'unlockconfirm' => 'होय,मला खरेच विदागाराचे ताळे उघडवयाचे आहे.',
@@ -2682,7 +2673,7 @@ $1',
 जुने शीर्षक नवीन शीर्षकाकडे पुनर्निर्देशित करेल.
 
 [[Special:DoubleRedirects|दुहेरी]] अथवा [[Special:BrokenRedirects|मोडकी]] पुनर्निर्देशनांकरीता तपासण्याची काळजी घ्या.
-à¤\89पलबà¥\8dध à¤¦à¥\81वà¥\87  à¤\9cà¥\80थे उघडणे अभिप्रेत होते तसेच उघडतील याची तुम्ही जबाबदारी घेत आहात
+à¤\89पलबà¥\8dध à¤¦à¥\81वà¥\87  à¤\9cिथे उघडणे अभिप्रेत होते तसेच उघडतील याची तुम्ही जबाबदारी घेत आहात
 
 जर नवीन शीर्षकाचा लेख अस्तित्वात असेल तर स्थानांतरण होणार '''नाही'''.
 पण जर नवीन शीर्षकाचा लेख हा रिकामा असेल अथवा पुनर्निर्देशन असेल (म्हणजेच त्या लेखाला जर संपादन इतिहास नसेल) तर स्थानांतरण होईल. याचा अर्थ असा की जर काही चूक झाली तर तुम्ही पुन्हा जुन्या शीर्षकाकडे स्थानांतरण करू शकता.
@@ -2696,7 +2687,7 @@ $1',
 
 या बाबतीत तुम्हाला स्वतःला ही पाने एकत्र करावी लागतील.",
 'movearticle' => 'पृष्ठाचे स्थानांतरण',
-'moveuserpage-warning' => "'''सावधान:''' à¤\86पण à¤\8fà¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरà¥\80त à¤\95रत à¤\86हात. à¤\95à¥\83पया à¤²à¤\95à¥\8dषात à¤\98à¥\8dया à¤\95à¥\80, à¤«à¤\95à¥\8dत à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरà¥\80त होइल, सदस्य नाम बदलले जणार नाही.",
+'moveuserpage-warning' => "'''सावधान:''' à¤\86पण à¤\8fà¤\95 à¤¸à¤¦à¤¸à¥\8dय à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरित à¤\95रत à¤\86हात. à¤\95à¥\83पया à¤²à¤\95à¥\8dषात à¤\98à¥\8dया à¤\95à¥\80, à¤«à¤\95à¥\8dत à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¸à¥\8dथलाà¤\82तरित होइल, सदस्य नाम बदलले जणार नाही.",
 'movenologin' => 'प्रवेश केलेला नाही',
 'movenologintext' => 'पान स्थानांतरित करण्यासाठी तुम्हाला [[Special:UserLogin|प्रवेश]] करावा लागेल.',
 'movenotallowed' => '{{SITENAME}}वरील पाने स्थानांतरीत करण्याची आपल्यापाशी परवानगी नाही.',
@@ -2713,7 +2704,7 @@ $1',
 'articleexists' => 'त्या नावाचे पृष्ठ अगोदरच अस्तित्वात आहे, किंवा तुम्ही निवडलेले
 नाव योग्य नाही आहे.
 कृपया दुसरे नाव शोधा.',
-'cantmove-titleprotected' => 'नवà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤¨à¤¿à¤°à¥\8dमà¥\80त à¤\95रणà¥\8dया à¤ªà¤¾à¤¸à¥\82न à¤¸à¥\81रà¤\95à¥\8dषà¥\80त केलेले असल्यामुळे,तुम्ही या जागी एखादे पान स्थानांतरीत करू शकत नाही.',
+'cantmove-titleprotected' => 'नवà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤¨à¤¿à¤°à¥\8dमित à¤\95रणà¥\8dया à¤ªà¤¾à¤¸à¥\82न à¤¸à¥\81रà¤\95à¥\8dषित केलेले असल्यामुळे,तुम्ही या जागी एखादे पान स्थानांतरीत करू शकत नाही.',
 'talkexists' => 'पृष्ठ यशस्वीरीत्या स्थानांतरीत झाले पण चर्चा पृष्ठ स्थानांतरीत होवू
 शकले नाही कारण त्या नावाचे पृष्ठ आधीच अस्तित्वात होते. कृपया तुम्ही स्वतः ती पृष्ठे एकत्र करा.',
 'movedto' => 'कडे स्थानांतरण केले',
@@ -2734,7 +2725,7 @@ $1',
 'delete_and_move' => 'वगळा आणि स्थानांतरित करा',
 'delete_and_move_text' => '==वगळण्याची आवशकता==
 
-लà¤\95à¥\8dषà¥\8dयपान  "[[:$1]]" à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतà¥\80त्वात आहे.स्थानांतराचा मार्ग मोकळाकरण्या करिता तुम्हाला ते वगळावयाचे आहे काय?',
+लà¤\95à¥\8dषà¥\8dयपान  "[[:$1]]" à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतित्वात आहे.स्थानांतराचा मार्ग मोकळाकरण्या करिता तुम्हाला ते वगळावयाचे आहे काय?',
 'delete_and_move_confirm' => 'होय, पान वगळा',
 'delete_and_move_reason' => '"[[$1]]" पासून वगळून स्थानांतर केले.',
 'selfmove' => 'स्रोत आणि लक्ष्य पाने समान आहेत; एखादे पान स्वत:च्याच जागी स्थानांतरीत करता येत नाही.',
@@ -2744,23 +2735,23 @@ $1',
 'immobile-source-page' => 'हे पान हलवता येत नाही',
 'immobile-target-page' => 'लक्ष्य मथळा हलवता येत नाही.',
 'imagenocrossnamespace' => 'ज्या नामविश्वात संचिका साठविता येत नाहीत, त्या नामविश्वात संचिकांचे स्थानांतरण करता येत नाही',
-'nonfile-cannot-move-to-file' => 'सà¤\82à¤\9aिà¤\95ा à¤¸à¥\8dवरà¥\81पाची नसलेली माहिती आपणास संचिका नामविश्वात वळती करता येणार नाही',
+'nonfile-cannot-move-to-file' => 'सà¤\82à¤\9aिà¤\95ा à¤¸à¥\8dवरà¥\82पाची नसलेली माहिती आपणास संचिका नामविश्वात वळती करता येणार नाही',
 'imagetypemismatch' => 'दिलेले संचिकेचे एक्सटेंशन त्या संचिकेच्या प्रकाराशी जुळत नाही',
 'imageinvalidfilename' => 'लक्ष्यसंचिका अवैध आहे',
-'fix-double-redirects' => 'मà¥\81ळ à¤¶à¤¿र्षक दर्शविणारे फेरे अद्ययावत करा',
+'fix-double-redirects' => 'मà¥\81ळ à¤¶à¥\80र्षक दर्शविणारे फेरे अद्ययावत करा',
 'move-leave-redirect' => 'मागे एक पुनर्निर्देशन ठेवा',
 'protectedpagemovewarning' => "'''सूचना:''' हे पान सुरक्षित आहे. फक्त प्रशासकीय अधिकार असलेले सदस्य याच्यात बदल करू शकतात.",
 'semiprotectedpagemovewarning' => "'''सूचना:''' हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याच्यात बदल करू शकतात.
 सर्वांत ताजी यादी खाली संदर्भासाठी दिली आहे:",
 'move-over-sharedrepo' => '== संचिका अस्तित्वात आहे ==
 सामायिक भांडारात [[:$1]] नाव आधी पासून अस्तित्वात आहे. संचिका या नावावर स्थानांतरीत केल्यास सामायिक संचिकेवर चढेल.',
-'file-exists-sharedrepo' => 'धà¥\80रिà¤\95à¥\87साठà¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤¨à¤¿à¤µà¤¡à¤²à¥\87लà¥\87 à¤¨à¤¾à¤µ à¤¹à¥\87 à¤¸à¤¾à¤®à¥\81हà¥\80क संग्राहलयात आधीपासून वापरात असल्याने कृपया दुसरे नाव निवडा.',
+'file-exists-sharedrepo' => 'धà¥\80रिà¤\95à¥\87साठà¥\80 à¤¤à¥\81मà¥\8dहà¥\80 à¤¨à¤¿à¤µà¤¡à¤²à¥\87लà¥\87 à¤¨à¤¾à¤µ à¤¹à¥\87 à¤¸à¤¾à¤®à¥\82हिक संग्राहलयात आधीपासून वापरात असल्याने कृपया दुसरे नाव निवडा.',
 
 # Export
 'export' => 'पाने निर्यात करा',
-'exporttext' => 'तà¥\81मà¥\8dहà¥\80 à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤®à¤\9cà¤\95à¥\81र आणि संपादन इतिहास किंवा  पानांचा संच एखाद्या XML वेष्ठणात ठेवून निर्यात करू शकता.हे तुम्हाला [[Special:Import|पान आयात करा]]वापरून मिडीयाविकि वापरणाऱ्या इतर विकित आयात करता येईल.
+'exporttext' => 'तà¥\81मà¥\8dहà¥\80 à¤\8fà¤\96ादà¥\8dया à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤®à¤\9cà¤\95à¥\82र आणि संपादन इतिहास किंवा  पानांचा संच एखाद्या XML वेष्ठणात ठेवून निर्यात करू शकता.हे तुम्हाला [[Special:Import|पान आयात करा]]वापरून मिडीयाविकि वापरणाऱ्या इतर विकित आयात करता येईल.
 
-पानà¥\87 à¤¨à¤¿à¤°à¥\8dयात à¤\95रणà¥\8dया à¤\95रिता,à¤\8fà¤\95ा à¤\93ळà¥\80त à¤\8fà¤\95 à¤®à¤¥à¤³à¤¾ à¤\85सà¥\87, à¤\96ालà¥\80ल à¤®à¤\9cà¤\95à¥\81र रकान्यात मथळे भरा आणि तुम्हाला ’सध्याची आवृत्ती तसेच सर्व जुन्या आवृत्ती ,पानाच्या इतिहास ओळी सोबत’, किंवा ’केवळ सध्याची आवृत्ती शेवटच्या संपादनाच्या माहिती सोबत’ हवी आहे का ते निवडा.
+पानà¥\87 à¤¨à¤¿à¤°à¥\8dयात à¤\95रणà¥\8dया à¤\95रिता,à¤\8fà¤\95ा à¤\93ळà¥\80त à¤\8fà¤\95 à¤®à¤¥à¤³à¤¾ à¤\85सà¥\87, à¤\96ालà¥\80ल à¤®à¤\9cà¤\95à¥\82र रकान्यात मथळे भरा आणि तुम्हाला ’सध्याची आवृत्ती तसेच सर्व जुन्या आवृत्ती ,पानाच्या इतिहास ओळी सोबत’, किंवा ’केवळ सध्याची आवृत्ती शेवटच्या संपादनाच्या माहिती सोबत’ हवी आहे का ते निवडा.
 
 तुम्ही नंतरच्या बाबतीत एखादा दुवा सुद्धा वापरू शकता, उदाहरणार्थ "[[{{MediaWiki:Mainpage}}]]" पाना करिता [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] .',
 'exportall' => 'सर्व पान एक्सपोर्ट करा',
@@ -2775,7 +2766,7 @@ $1',
 'export-addns' => 'वाढवा',
 'export-download' => 'संचिका म्हणून जतन करा',
 'export-templates' => 'साचे आंतरभूत करा',
-'export-pagelinks' => 'पà¥\81ढà¥\87 à¤\89लà¥\8dलà¥\87à¤\96à¥\80त पातळी पर्यंत दुवे दिलेल्या पानांचा आंतर्भाव करा :',
+'export-pagelinks' => 'पà¥\81ढà¥\87 à¤\89लà¥\8dलà¥\87à¤\96ित पातळी पर्यंत दुवे दिलेल्या पानांचा आंतर्भाव करा :',
 
 # Namespace 8 related
 'allmessages' => 'सर्व प्रणाली-संदेश',
@@ -2800,7 +2791,7 @@ $1',
 'djvu_page_error' => 'टप्प्याच्या बाहेरचे DjVu पान',
 'djvu_no_xml' => 'DjVu संचिकेकरिता XML ओढण्यात असमर्थ',
 'thumbnail-temp-create' => 'तात्पुरती इवलीशी संचिका बनविता आली नाही',
-'thumbnail-dest-create' => 'à¤\87षà¥\8dà¤\9fसà¥\8dथळà¥\80 à¤\88वलीशी संचिका जतन करता आली नाही',
+'thumbnail-dest-create' => 'à¤\87षà¥\8dà¤\9fसà¥\8dथळà¥\80 à¤\87वलीशी संचिका जतन करता आली नाही',
 'thumbnail_invalid_params' => 'इवल्याशाचित्राचा अयोग्य परिचय',
 'thumbnail_dest_directory' => 'लक्ष्य धारिकेच्या निर्मितीस असमर्थ',
 'thumbnail_image-type' => 'चित्रप्रकार समर्थित नाही',
@@ -2829,7 +2820,7 @@ $1',
 'importunknownsource' => 'आयात स्रोत प्रकार अज्ञात',
 'importcantopen' => 'आयातीत संचिका उघडणे जमले नाही',
 'importbadinterwiki' => 'अयोग्य आंतरविकि दुवा',
-'importnotext' => 'रिà¤\95ामà¥\87 à¤\85थवा à¤®à¤\9cà¤\95à¥\81र नाही',
+'importnotext' => 'रिà¤\95ामà¥\87 à¤\85थवा à¤®à¤\9cà¤\95à¥\82र नाही',
 'importsuccess' => 'आयात पूर्ण झाली!',
 'importhistoryconflict' => 'उपलब्ध इतिहास आवर्तने परस्पर विरोधी आहेत(हे पान पूर्वी आयात केले असण्याची शक्यता आहे)',
 'importnosources' => 'कोणतेही आंतरविकि आयात स्रोत व्यक्त केलेले नाहीत आणि प्रत्यक्ष इतिहास चढवा अनुपलब्ध केले आहे.',
@@ -2872,7 +2863,7 @@ $1',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'तुमचे सदस्य पान',
-'tooltip-pt-anonuserpage' => 'तà¥\81मà¥\8dहà¥\80 à¤\9cà¥\8dया à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयानà¥\8dवयà¥\87 à¤¸à¤\82पादà¥\80त करत आहात त्याकरिता हे सदस्य पान',
+'tooltip-pt-anonuserpage' => 'तà¥\81मà¥\8dहà¥\80 à¤\9cà¥\8dया à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयानà¥\8dवयà¥\87 à¤¸à¤\82पादित करत आहात त्याकरिता हे सदस्य पान',
 'tooltip-pt-mytalk' => 'तुमचे चर्चा पान',
 'tooltip-pt-anontalk' => 'या अंकपत्त्यापासून झालेल्या संपादनांबद्दल चर्चा',
 'tooltip-pt-preferences' => 'माझ्या पसंती',
@@ -2882,7 +2873,7 @@ $1',
 'tooltip-pt-anonlogin' => 'आपण खात्यात दाखल व्हावे या करिता प्रोत्साहन देतो, अर्थात ते अत्यावश्यक नाही.',
 'tooltip-pt-logout' => 'बाहेर पडा',
 'tooltip-ca-talk' => 'कंटेंट पानाबद्दलच्या चर्चा',
-'tooltip-ca-edit' => 'तà¥\81मà¥\8dहà¥\80 à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¬à¤¦à¥\8dलà¥\82 à¤¶à¤\95ता. à¤\95à¥\83पया à¤\9cतन à¤\95रणà¥\8dयापà¥\81र्वी झलक कळ वापरून पहा.',
+'tooltip-ca-edit' => 'तà¥\81मà¥\8dहà¥\80 à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¬à¤¦à¥\8dलà¥\82 à¤¶à¤\95ता. à¤\95à¥\83पया à¤\9cतन à¤\95रणà¥\8dयापà¥\82र्वी झलक कळ वापरून पहा.',
 'tooltip-ca-addsection' => 'नवीन चर्चा सुरू करा',
 'tooltip-ca-viewsource' => 'हे पान सुरक्षित आहे. तुम्ही याचा स्रोत पाहू शकता.',
 'tooltip-ca-history' => 'या पानाच्या जुन्या आवृत्या.',
@@ -2929,7 +2920,7 @@ $1',
 'tooltip-preview' => 'तुम्ही केलेल्या बदलांची झलक पहा, जतन करण्यापूर्वी कृपया हे वापरा!',
 'tooltip-diff' => 'या पाठ्यातील तुम्ही केलेले बदल दाखवा.',
 'tooltip-compareselectedversions' => 'निवडलेल्या आवृत्त्यांमधील बदल दाखवा.',
-'tooltip-watch' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80त टाका.',
+'tooltip-watch' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aित टाका.',
 'tooltip-watchlistedit-normal-submit' => 'शीर्षके काढवीत',
 'tooltip-watchlistedit-raw-submit' => 'पाहण्याची सूची अद्ययावत करावी',
 'tooltip-recreate' => 'हे पान मागे वगळले असले तरी नवनिर्मीत करा',
@@ -2957,7 +2948,7 @@ $1',
 
 # Spam protection
 'spamprotectiontitle' => 'केर(स्पॅम) सुरक्षा चाचणी',
-'spamprotectiontext' => 'तà¥\81मà¥\8dहà¥\80 à¤\9cतन à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bित à¤\85सलà¥\87लà¥\87 à¤ªà¤¾à¤¨ à¤\95à¥\87र-à¤\89तà¥\8dपात à¤°à¥\8bधà¤\95 à¤\9aाळणà¥\80नà¥\87 à¤ªà¥\8dरतिबà¤\82धà¥\80त केले आहे.
+'spamprotectiontext' => 'तà¥\81मà¥\8dहà¥\80 à¤\9cतन à¤\95रà¥\82 à¤\87à¤\9aà¥\8dà¤\9bित à¤\85सलà¥\87लà¥\87 à¤ªà¤¾à¤¨ à¤\95à¥\87र-à¤\89तà¥\8dपात à¤°à¥\8bधà¤\95 à¤\9aाळणà¥\80नà¥\87 à¤ªà¥\8dरतिबà¤\82धित केले आहे.
 
 असे बाहेरच्या संकेतस्थळाचा दुवा देण्याची शक्यता असल्यामुळे घडू शकते.',
 'spamprotectionmatch' => 'खालील मजकुरामुळे आमची चिखलणी रोधक चाळणी सुरू झाली: $1',
@@ -2996,13 +2987,8 @@ $1',
 'pageinfo-category-files' => 'संचिकांची संख्या',
 
 # Skin names
-'skinname-standard' => 'अभिजात',
-'skinname-nostalgia' => 'रम्य',
 'skinname-cologneblue' => 'सुरेखनीळी',
 'skinname-monobook' => 'मोनोबुक',
-'skinname-myskin' => 'माझीकांती',
-'skinname-chick' => 'मस्त',
-'skinname-simple' => 'साधी',
 'skinname-modern' => 'आधुनिक',
 'skinname-vector' => 'सदिश',
 
@@ -3014,18 +3000,18 @@ $1',
 'rcpatroldisabled' => 'अलीकडील बदलची गस्ती अनुपलब्ध',
 'rcpatroldisabledtext' => 'सध्या ’अलीकडील बदल’ ची गस्त सुविधा अनुपलब्ध केली आहे.',
 'markedaspatrollederror' => 'गस्तीची खूण करता येत नाही',
-'markedaspatrollederrortext' => 'à¤\97सà¥\8dत à¤\98ातलà¥\8dयाà¤\9aà¥\80 à¤\96à¥\82ण à¤\95रणà¥\8dयाà¤\95रिता à¤¤à¥\81मà¥\8dहाला à¤\8fà¤\95 à¤\86वरà¥\8dतन à¤¨à¤®à¥\81द करावे लागेल.',
+'markedaspatrollederrortext' => 'à¤\97सà¥\8dत à¤\98ातलà¥\8dयाà¤\9aà¥\80 à¤\96à¥\82ण à¤\95रणà¥\8dयाà¤\95रिता à¤¤à¥\81मà¥\8dहाला à¤\8fà¤\95 à¤\86वरà¥\8dतन à¤¨à¤®à¥\82द करावे लागेल.',
 'markedaspatrollederror-noautopatrol' => 'तुम्हाला स्वत:च्याच बदलांवर गस्त घातल्याची खूण करण्याची परवानगी नाही.',
 
 # Patrol log
 'patrol-log-page' => 'टेहळणीतील नोंदी',
-'patrol-log-header' => 'हà¥\80 à¤ªà¤¾à¤¹à¤£à¥\80नà¤\82तरà¤\9aà¥\8dया à¤¨à¤¿à¤°à¤¿क्षणाची नोंद आहे.',
+'patrol-log-header' => 'हà¥\80 à¤ªà¤¾à¤¹à¤£à¥\80नà¤\82तरà¤\9aà¥\8dया à¤¨à¤¿à¤°à¥\80क्षणाची नोंद आहे.',
 'log-show-hide-patrol' => '$1 गस्तीची नोंद',
 
 # Image deletion
 'deletedrevision' => 'जुनी आवृत्ती ($1) वगळली.',
 'filedeleteerror-short' => 'संचिका वगळताना त्रूटी: $1',
-'filedeleteerror-long' => 'सà¤\82à¤\9aिà¤\95ा à¤µà¤\97ळताना à¤¤à¥\8dरà¥\82टी आढळल्या:
+'filedeleteerror-long' => 'सà¤\82à¤\9aिà¤\95ा à¤µà¤\97ळताना à¤¤à¥\8dरà¥\81टी आढळल्या:
 
 $1',
 'filedelete-missing' => 'संचिका "$1" वगळता येत नाही, कारण ती अस्तित्वात नाही.',
@@ -3110,7 +3096,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'रूंदी',
 'exif-imagelength' => 'उंची',
 'exif-bitspersample' => 'प्रती घटक बीट्स',
@@ -3125,13 +3111,13 @@ $1',
 'exif-yresolution' => 'उभे रिझोल्यूशन',
 'exif-stripoffsets' => 'चित्रविदा स्थान',
 'exif-rowsperstrip' => 'प्रत्येक पट्टीतील ओळींची संख्या',
-'exif-stripbytecounts' => 'पà¥\8dरतà¥\8dयà¥\87à¤\95 à¤\86à¤\95à¥\81à¤\82à¤\9aà¥\80त पट्टीतील बाईट्सची संख्या',
+'exif-stripbytecounts' => 'पà¥\8dरतà¥\8dयà¥\87à¤\95 à¤\86à¤\95à¥\81à¤\82à¤\9aित पट्टीतील बाईट्सची संख्या',
 'exif-jpeginterchangeformat' => 'JPEG SOI करिता ऑफसेट',
 'exif-jpeginterchangeformatlength' => 'JPEG विदे च्या बाईट्स',
 'exif-whitepoint' => 'धवल बिंदू क्रोमॅटिसिटी',
 'exif-primarychromaticities' => 'क्रोमॅटिसिटीज ऑफ प्राईमारिटीज',
 'exif-ycbcrcoefficients' => 'कलर स्पेस ट्रान्स्फॉर्मेशन मॅट्रीक्स कोएफिशीयंट्स',
-'exif-referenceblackwhite' => 'à¤\95ाळà¥\8dया à¤\86णि à¤ªà¤¾à¤\82ढऱà¥\8dया à¤¸à¤\82दरà¥\8dभ à¤®à¥\81ल्यांची जोडी',
+'exif-referenceblackwhite' => 'à¤\95ाळà¥\8dया à¤\86णि à¤ªà¤¾à¤\82ढऱà¥\8dया à¤¸à¤\82दरà¥\8dभ à¤®à¥\82ल्यांची जोडी',
 'exif-datetime' => 'संचिका बदल तारीख आणि वेळ',
 'exif-imagedescription' => 'चित्र शीर्षक',
 'exif-make' => 'कॅमेरा उत्पादक',
@@ -3174,7 +3160,7 @@ $1',
 'exif-flashenergy' => 'लखाट उर्जा (फ्लॅश एनर्जी)',
 'exif-focalplanexresolution' => 'फोकल प्लेन x रिझोल्यूशन',
 'exif-focalplaneyresolution' => 'फोकल प्लेन Y रिझोल्यूशन',
-'exif-focalplaneresolutionunit' => 'फà¥\8bà¤\95ल à¤ªà¥\8dलà¥\87न  à¤°à¤¿à¤\9dà¥\8bलà¥\8dयà¥\82शन माप',
+'exif-focalplaneresolutionunit' => 'फà¥\8bà¤\95ल à¤ªà¥\8dलà¥\87न  à¤°à¤¿à¤\9dà¥\8bलà¥\8dयà¥\81शन माप',
 'exif-subjectlocation' => 'लक्ष्य स्थळ',
 'exif-exposureindex' => 'प्रभावन सूची',
 'exif-sensingmethod' => 'सेन्सींग पद्धती',
@@ -3194,7 +3180,7 @@ $1',
 'exif-subjectdistancerange' => 'गोष्टीपासूनचे पल्ला अंतर',
 'exif-imageuniqueid' => 'विशिष्ट चित्र क्रमांक',
 'exif-gpsversionid' => 'GPS खूण आवृत्ती',
-'exif-gpslatituderef' => 'à¤\89तà¥\8dतर à¤\95िà¤\82वा à¤¦à¤\95à¥\8dषà¥\80ण अक्षांश',
+'exif-gpslatituderef' => 'à¤\89तà¥\8dतर à¤\95िà¤\82वा à¤¦à¤\95à¥\8dषिण अक्षांश',
 'exif-gpslatitude' => 'अक्षांश',
 'exif-gpslongituderef' => 'पूर्व किंवा पश्चिम रेखांश',
 'exif-gpslongitude' => 'रेखांश',
@@ -3220,7 +3206,7 @@ $1',
 'exif-gpsdestbearing' => 'बीअरींग ऑफ डेस्टीनेशन',
 'exif-gpsdestdistanceref' => 'लक्ष्यस्थळापर्यंतच्या अंतराकरिता संदर्भ',
 'exif-gpsdestdistance' => 'लक्ष्यस्थळापर्यंतचे अंतर',
-'exif-gpsprocessingmethod' => 'GPS à¤ªà¥\8dरà¤\95à¥\8dरà¥\80या पद्धतीचे नाव',
+'exif-gpsprocessingmethod' => 'GPS à¤ªà¥\8dरà¤\95à¥\8dरिया पद्धतीचे नाव',
 'exif-gpsareainformation' => 'GPS विभागाचे नाव',
 'exif-gpsdatestamp' => 'GPSतारीख',
 'exif-gpsdifferential' => 'GPS डिफरेंशीअल सुधारणा',
@@ -3256,7 +3242,7 @@ $1',
 'exif-iimcategory' => 'वर्ग',
 'exif-iimsupplementalcategory' => 'पुरवणी श्रेणी',
 'exif-datetimeexpires' => 'या तारखेपश्चात वापरू नका',
-'exif-datetimereleased' => 'या à¤µà¥\87ळà¥\80/दिवशà¥\80 à¤ªà¥\8dरसà¥\83त (पà¥\8dरसारण )à¤\95à¥\87लà¥\87/मà¥\81à¤\95à¥\8dत à¤\95à¥\87लà¥\87 / à¤¸à¥\82रू केले',
+'exif-datetimereleased' => 'या à¤µà¥\87ळà¥\80/दिवशà¥\80 à¤ªà¥\8dरसà¥\83त (पà¥\8dरसारण )à¤\95à¥\87लà¥\87/मà¥\81à¤\95à¥\8dत à¤\95à¥\87लà¥\87 / à¤¸à¥\81रू केले',
 'exif-originaltransmissionref' => 'Original transmission location code: मूळ प्रसारण केले त्या स्थानाचे कूटाक्षर(कोड)',
 'exif-identifier' => 'ओळख दुवा',
 'exif-lens' => 'वापरलेले भिंग',
@@ -3280,7 +3266,7 @@ $1',
 'exif-disclaimer' => 'परवाना',
 'exif-contentwarning' => 'आशय विषयी सूचना',
 'exif-giffilecomment' => 'जीआयएफ संचिका टिप्पणी',
-'exif-intellectualgenre' => 'विशिषà¥\8dठ à¤µà¤¸à¥\8dतà¥\81चा प्रकार',
+'exif-intellectualgenre' => 'विशिषà¥\8dठ à¤µà¤¸à¥\8dतà¥\82चा प्रकार',
 'exif-subjectnewscode' => 'विषयाचे संकेतचिन्ह',
 'exif-scenecode' => 'IPTC दृश्य संकेत',
 'exif-event' => 'सादर केलेला उपक्रम',
@@ -3289,7 +3275,7 @@ $1',
 'exif-originalimageheight' => 'चित्राचा आकार बदलण्यापुर्वीची उंची',
 'exif-originalimagewidth' => 'छाचाचित्राचा आकार बदलण्यापुर्वीची रूंदी',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'अनाकुंचीत',
 'exif-compression-2' => 'CCITT गट३ १-Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'CCITT Group 3 फॅक्स संकेतन',
@@ -3352,7 +3338,7 @@ $1',
 'exif-lightsource-17' => 'प्रकाश दर्जा A',
 'exif-lightsource-18' => 'प्रकाश दर्जा B',
 'exif-lightsource-19' => 'प्रमाण प्रकाश C',
-'exif-lightsource-24' => 'ISO à¤¸à¥\8dà¤\9fà¥\82डीयो टंगस्टन',
+'exif-lightsource-24' => 'ISO à¤¸à¥\8dà¤\9fà¥\81डीयो टंगस्टन',
 'exif-lightsource-255' => 'इतर प्रकाश स्रोत',
 
 # Flash modes
@@ -3362,7 +3348,7 @@ $1',
 'exif-flash-return-0' => 'लखलखाट (फ्लॅश) - प्रकाश परावर्तन नोंदणीची सुविधा अनुपलब्ध',
 'exif-flash-return-2' => 'लखलखाटाच्या (फ्लॅश)   परावर्तन प्रकाशाची नोंद झाली नाही',
 'exif-flash-return-3' => 'लखलखाटाचे (फ्लॅश) - प्रकाश परावर्तन होत असल्याचे टिपले',
-'exif-flash-mode-1' => 'à¤\85निवारà¥\8dय à¤²à¤\96लà¤\96ाà¤\9f à¤ªà¥\8dरदà¥\80पन (फà¥\8dलà¥\85श à¤«à¤¾à¤¯à¤°à¥\80ंग )',
+'exif-flash-mode-1' => 'à¤\85निवारà¥\8dय à¤²à¤\96लà¤\96ाà¤\9f à¤ªà¥\8dरदà¥\80पन (फà¥\8dलà¥\85श à¤«à¤¾à¤¯à¤°à¤¿ंग )',
 'exif-flash-mode-2' => 'अनिवार्य विना-लखलखाट  (फ्लॅश सप्रेशन)',
 'exif-flash-mode-3' => 'स्वयंचलित स्थिती',
 'exif-flash-function-1' => 'लखलखाट  (फ्लॅश) सुविधा अनुपलब्ध',
@@ -3371,10 +3357,10 @@ $1',
 'exif-focalplaneresolutionunit-2' => 'इंच',
 
 'exif-sensingmethod-1' => 'अव्यक्त',
-'exif-sensingmethod-2' => 'वन à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या सेंसर',
-'exif-sensingmethod-3' => 'à¤\9fà¥\82 à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या सेन्सर',
-'exif-sensingmethod-4' => 'थà¥\8dरà¥\80 à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या सेंसर',
-'exif-sensingmethod-5' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87णà¥\8dशà¥\80यल à¤\8fरà¥\80या सेंसर',
+'exif-sensingmethod-2' => 'वन à¤\9aà¥\80प à¤\95लर à¤\8fरिया सेंसर',
+'exif-sensingmethod-3' => 'à¤\9fà¥\82 à¤\9aà¥\80प à¤\95लर à¤\8fरिया सेन्सर',
+'exif-sensingmethod-4' => 'थà¥\8dरà¥\80 à¤\9aà¥\80प à¤\95लर à¤\8fरिया सेंसर',
+'exif-sensingmethod-5' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87णà¥\8dशà¥\80यल à¤\8fरिया सेंसर',
 'exif-sensingmethod-7' => 'ट्रायलिनीयर सेंसर',
 'exif-sensingmethod-8' => 'कलर सिक्वेंशीयल लिनीयर सेंसर',
 
@@ -3487,7 +3473,7 @@ $1',
 'exif-iimcategory-hth' => 'तब्येत',
 'exif-iimcategory-hum' => 'मानवी अभिरुचि',
 'exif-iimcategory-lab' => 'परिश्रम',
-'exif-iimcategory-lif' => 'à¤\86राम à¤\86णि à¤\9cिवन पद्धती',
+'exif-iimcategory-lif' => 'à¤\86राम à¤\86णि à¤\9cà¥\80वन पद्धती',
 'exif-iimcategory-pol' => 'राजनीती',
 'exif-iimcategory-rel' => 'धर्म व श्रद्धा',
 'exif-iimcategory-sci' => 'विज्ञान व तंत्रज्ञान',
@@ -3515,7 +3501,7 @@ $1',
 'confirmemail' => 'ई-मेल पत्ता पडताळून पहा',
 'confirmemail_noemail' => '[[Special:Preferences|सदस्य पसंतीत]] तुम्ही प्रमाणित विपत्र (ई-मेल) पत्ता दिलेला नाही.',
 'confirmemail_text' => 'विपत्र सुविधा वापरण्या पूर्वी {{SITENAME}}वर तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित करणे गरजेचे आहे. तुमच्या पत्त्यावर निश्चितीकरण विपत्र (ई-मेल) पाठवण्याकरिता खालील बटण सुरू करा.विपत्रात कुटसंकेतच्(पासवर्ड) असलेला दुवा असेल;तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित करण्या करिता तुमच्या विचरकात हा दिलेला दुवा चढवा.',
-'confirmemail_pending' => 'à¤\8fà¤\95 à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤\95à¥\81à¤\9fसà¤\82à¤\95à¥\87त à¤\86धà¥\80à¤\9a à¤¤à¥\81मà¥\8dहाला à¤µà¤¿à¤ªà¤¤à¥\8dर à¤\95à¥\87ला à¤\86हà¥\87; à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 à¤\96ातà¥\87 à¤\85शातà¤\9a à¤\89à¤\98डलà¥\87 à¤\85सà¥\87ल à¤¤à¤°,à¤\8fà¤\95 à¤¨à¤µà¤¾ à¤\95à¥\81ट संकेत मागण्यापूर्वी,पाठवलेला मिळण्याकरिता थोडी मिनिटे वाट पहाणे तुम्हाला आवडू शकेल.',
+'confirmemail_pending' => 'à¤\8fà¤\95 à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤\95à¥\81à¤\9fसà¤\82à¤\95à¥\87त à¤\86धà¥\80à¤\9a à¤¤à¥\81मà¥\8dहाला à¤µà¤¿à¤ªà¤¤à¥\8dर à¤\95à¥\87ला à¤\86हà¥\87; à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 à¤\96ातà¥\87 à¤\85शातà¤\9a à¤\89à¤\98डलà¥\87 à¤\85सà¥\87ल à¤¤à¤°,à¤\8fà¤\95 à¤¨à¤µà¤¾ à¤\95à¥\82ट संकेत मागण्यापूर्वी,पाठवलेला मिळण्याकरिता थोडी मिनिटे वाट पहाणे तुम्हाला आवडू शकेल.',
 'confirmemail_send' => 'विपत्र निश्चितीकरण नियमावली',
 'confirmemail_sent' => 'शाबितीकरण विपत्र पाठवले.',
 'confirmemail_oncreate' => 'तुमच्या विपत्र पत्त्यावर निश्चितीकरण कुटसंकेत पाठवला होता .
@@ -3523,7 +3509,7 @@ $1',
 'confirmemail_sendfailed' => 'पोच-विपत्र पाठवू शकलो नाही. अयोग्य चिन्हांकरिता पत्ता तपासा.
 
 मेलर परत आले: $1',
-'confirmemail_invalid' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80.नियमावलà¥\80 à¤\95ाल à¤¸à¤®à¤¾à¤ªà¥\8dत à¤\9dाला à¤\85सà¥\81 शकेल.',
+'confirmemail_invalid' => 'à¤\85यà¥\8bà¤\97à¥\8dय à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤¨à¤¿à¤¯à¤®à¤¾à¤µà¤²à¥\80.नियमावलà¥\80 à¤\95ाल à¤¸à¤®à¤¾à¤ªà¥\8dत à¤\9dाला à¤\85सà¥\82 शकेल.',
 'confirmemail_needlogin' => 'तुमचा विपत्रपत्ता प्रमाणित करण्यासाठी तुम्ही $1 करावयास हवे.',
 'confirmemail_success' => 'तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित झाला आहे.तुम्ही आता [[Special:UserLogin|दाखल]] होऊ शकता आणि विकिचा आनंद घेऊ शकता.',
 'confirmemail_loggedin' => 'तुमचा विपत्र (ई-मेल) पत्ता आता प्रमाणित झाला आहे.',
@@ -3576,7 +3562,7 @@ $5
 'deletedwhileediting' => '”’सूचना:”’ तुम्ही संपादन सुरू केल्यानंतर हे पान वगळले गेले आहे.',
 'confirmrecreate' => "तुम्ही संपादन सुरू केल्यानंतर सदस्य [[User:$1|$1]] ([[User talk:$1|चर्चा]])ने हे पान पुढील कारणाने वगळले:
 : ''$2''
-à¤\95à¥\83पया à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤\96रà¥\87à¤\9a à¤ªà¥\81नà¥\8dहा à¤¨à¤¿à¤°à¥\8dमà¥\80त करून हवे आहे का हे निश्चित करा.",
+à¤\95à¥\83पया à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤\96रà¥\87à¤\9a à¤ªà¥\81नà¥\8dहा à¤¨à¤¿à¤°à¥\8dमित करून हवे आहे का हे निश्चित करा.",
 'confirmrecreate-noreason' => 'तुम्ही संपादन सुरू केल्यानंतर सदस्य [[User:$1|$1]] ([[User talk:$1|चर्चा]])ने हे पान  वगळले. तुम्हाला हे पान खरेच पुन्हा निर्मित करून हवे आहे का हे निश्चित करा.',
 'recreate' => 'पुनर्निर्माण',
 
@@ -3629,14 +3615,14 @@ $5
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => '$1 {{PLURAL:$1|सेकंदाच्या|सेकंदांच्या}} आतले बदल या यादी नसण्याची शक्यता आहे.',
-'lag-warn-high' => 'विदा à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¥\8dयास à¤²à¤¾à¤\97णाऱà¥\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 à¤®à¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} à¤¨à¤µà¥\87 à¤¬à¤¦à¤² à¤¯à¤¾ à¤¸à¥\82à¤\9aà¥\80त कदाचित दाखवले नाही जाणार.',
+'lag-warn-high' => 'विदा à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¥\8dयास à¤²à¤¾à¤\97णाऱà¥\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 à¤®à¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} à¤¨à¤µà¥\87 à¤¬à¤¦à¤² à¤¯à¤¾ à¤¸à¥\82à¤\9aित कदाचित दाखवले नाही जाणार.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'चर्चा पाने सोडून, {{PLURAL:$1|1 शीर्षक पान|$1 शीर्षक पाने}} तुमच्या पहाऱ्याच्या सूचीमध्ये आहेत.',
-'watchlistedit-noitems' => 'नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80त कोणतेही शीर्षक पान नोंदलेले नाही.',
+'watchlistedit-noitems' => 'नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aित कोणतेही शीर्षक पान नोंदलेले नाही.',
 'watchlistedit-normal-title' => 'पहाऱ्याची सूचीचे संपादन करा',
 'watchlistedit-normal-legend' => 'शीर्षकपाने नित्य पहाण्याच्या सूचीतून काढा',
-'watchlistedit-normal-explain' => 'तà¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\80ल à¤\85à¤\82तरà¥\8dभà¥\82त à¤¨à¤¾à¤®à¤¾à¤µà¤³à¥\80 à¤\96ालà¥\80 à¤¨à¤¿à¤°à¥\8dदà¥\87शà¥\80त केली आहे. शीर्षक वगळण्याकरिता, त्या पुढील खिडकी निवडा, आणि शीर्षक वगळावर टिचकी मारा. तुम्ही [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.',
+'watchlistedit-normal-explain' => 'तà¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\80ल à¤\85à¤\82तरà¥\8dभà¥\82त à¤¨à¤¾à¤®à¤¾à¤µà¤³à¥\80 à¤\96ालà¥\80 à¤¨à¤¿à¤°à¥\8dदà¥\87शित केली आहे. शीर्षक वगळण्याकरिता, त्या पुढील खिडकी निवडा, आणि शीर्षक वगळावर टिचकी मारा. तुम्ही [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.',
 'watchlistedit-normal-submit' => 'शिर्षक वगळा',
 'watchlistedit-normal-done' => 'तुमच्या नित्य पहाण्या सूचीतून वगळलेली {{PLURAL:$1|1 शीर्षक होते |$1 शीर्षके होती }}:',
 'watchlistedit-raw-title' => 'कच्ची नित्य पहाण्याची सूची संपादित करा',
@@ -3647,8 +3633,8 @@ $5
 'watchlistedit-raw-titles' => 'शिर्षके:',
 'watchlistedit-raw-submit' => 'पहाऱ्याची सूची अद्ययावत करा.',
 'watchlistedit-raw-done' => 'तुमची पहाऱ्याची सूची परिष्कृत करण्यात आली आहे.',
-'watchlistedit-raw-added' => '{{PLURAL:$1|1 à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¤¿र्षक होती }} भर घातली:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|1 à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¤¿र्षक होती }} वगळले:',
+'watchlistedit-raw-added' => '{{PLURAL:$1|1 à¤¶à¥\80रà¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¥\80र्षक होती }} भर घातली:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1 à¤¶à¥\80रà¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¥\80र्षक होती }} वगळले:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'सुयोग्य बदल पहा',
@@ -3684,7 +3670,7 @@ $5
 'version-poweredby-others' => 'इतर',
 'version-license-info' => 'मिडियाविकि हे  मुक्त संगणक प्रणाली विकि पॅकेज आहे.Free Software Foundation प्रकाशित  GNU General Public परवान्याच्या अटीस अनुसरून तुम्ही त्यात बदल आणि/अथवा त्याचे  पुर्नवितरण  करू शकता.
 
-मिडियाविà¤\95ि  à¤¸à¤\82à¤\97णà¤\95 à¤ªà¥\8dरणालà¥\80 à¤\89पयà¥\82à¤\95à¥\8dत à¤ à¤°à¥\87ल à¤¯à¤¾ à¤\86शà¥\87नà¥\87 à¤µà¤¿à¤¤à¤°à¥\80त à¤\95à¥\87लà¥\80 à¤\9cात à¤\85सलà¥\80 à¤¤à¤°à¥\80;à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤µà¤¿à¤¤à¤°à¤£à¤¾à¤¸ à¤\85थवा à¤µà¤¿à¤¶à¥\80ष्ट उद्देशाकरिता योग्यतेची अगदी कोणतीही अप्रत्यक्ष अथवा उपलक्षित   अथवा  निहित अशा अथवा कोणत्याही प्रकारच्या केवळ  कोणत्याही प्राश्वासनाशिवायच (WITHOUT ANY WARRANTY) उपलब्ध आहे.अधिक माहिती करिता   GNU General Public License पहावे.
+मिडियाविà¤\95ि  à¤¸à¤\82à¤\97णà¤\95 à¤ªà¥\8dरणालà¥\80 à¤\89पयà¥\81à¤\95à¥\8dत à¤ à¤°à¥\87ल à¤¯à¤¾ à¤\86शà¥\87नà¥\87 à¤µà¤¿à¤¤à¤°à¤¿à¤¤ à¤\95à¥\87लà¥\80 à¤\9cात à¤\85सलà¥\80 à¤¤à¤°à¥\80;à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤µà¤¿à¤¤à¤°à¤£à¤¾à¤¸ à¤\85थवा à¤µà¤¿à¤¶à¤¿ष्ट उद्देशाकरिता योग्यतेची अगदी कोणतीही अप्रत्यक्ष अथवा उपलक्षित   अथवा  निहित अशा अथवा कोणत्याही प्रकारच्या केवळ  कोणत्याही प्राश्वासनाशिवायच (WITHOUT ANY WARRANTY) उपलब्ध आहे.अधिक माहिती करिता   GNU General Public License पहावे.
 
 तुम्हाला या प्रणाली सोबत [{{SERVER}}{{SCRIPTPATH}}/COPYING  GNU General Public License परवान्याची प्रत] मिळालेली असावयास हवी, तसे नसेल तर,[//www.gnu.org/licenses/old-licenses/gpl-2.0.html  येथे ऑनलाईन वाचा] किंवा the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ला लिहा.',
 'version-software' => 'स्थापित संगणक प्रणाली (Installed software)',
@@ -3694,13 +3680,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'आत येण्याचा मार्ग',
 'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
-# Special:FilePath
-'filepath' => 'संचिका मार्ग',
-'filepath-page' => 'संचिका:',
-'filepath-submit' => 'चला',
-'filepath-summary' => 'हे विशेष पान संचिकेचा संपूर्ण मार्ग कळवते.
-चित्रे संपूर्ण रिझोल्यूशन मध्ये दाखवली आहेत,इतर संचिका प्रकार त्यांच्या संबधीत प्रोग्रामने प्रत्यक्ष सुरू होतात.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'जुळ्या संचिका शोधा',
 'fileduplicatesearch-summary' => 'हॅश किंमतीप्रमाणे जुळ्या संचिका शोधा.',
@@ -3734,11 +3713,11 @@ $5
 'intentionallyblankpage' => 'हे पान मुद्दाम कोरे सोडण्यात आले आहे.',
 
 # External image whitelist
-'external_image_whitelist' => '#हà¥\87 à¤\93ल à¤¬à¤°à¥\8bबर à¤\9cशि à¤\86हà¥\87 à¤¤à¤¶à¤¿ घेने.
+'external_image_whitelist' => '#हà¥\87 à¤\93ल à¤¬à¤°à¥\8bबर à¤\9cशà¥\80 à¤\86हà¥\87 à¤¤à¤¶à¥\80 घेने.
 #नेहमि वपरले जानारे सर्व चीह्न्न् वपरने.
 #बाहेरिल सर्व चित्राना ह्यासोबत जोद्दले जाइल.
-#हà¥\8dया à¤®à¤§à¤¿à¤² à¤\9cà¥\81ललà¥\87लà¥\87 à¤¸à¤°à¥\8dव à¤\9aितà¥\8dर à¤®à¥\8dहनà¥\81न à¤¦à¤\96वलà¥\87 à¤\9cतिल,à¤\85थवा à¤\9aितà¥\8dराà¤\9aि फक़्त् लिन्क दखवलि जाइल.
-## à¤¹à¥\8dया à¤\9aिहà¥\8dना à¤ªà¤¾à¤¸à¥\81न à¤¸à¥\81रà¥\81 à¤\9dलà¥\87लà¥\8dया à¤¸à¤°à¥\8dव à¤\93लि कमेन्त म्हनुन वपरर्ल्या जातिल.
+#हà¥\8dया à¤®à¤§à¥\80ल à¤\9cà¥\81ललà¥\87लà¥\87 à¤¸à¤°à¥\8dव à¤\9aितà¥\8dर à¤®à¥\8dहनà¥\81न à¤¦à¤\96वलà¥\87 à¤\9cतिल,à¤\85थवा à¤\9aितà¥\8dराà¤\9aà¥\80 फक़्त् लिन्क दखवलि जाइल.
+## à¤¹à¥\8dया à¤\9aिहà¥\8dना à¤ªà¤¾à¤¸à¥\82न à¤¸à¥\81रà¥\82 à¤\9dलà¥\87लà¥\8dया à¤¸à¤°à¥\8dव à¤\93लà¥\80 कमेन्त म्हनुन वपरर्ल्या जातिल.
 #हे केस सेन्सेतिव आहे.',
 
 # Special:Tags
@@ -3746,7 +3725,7 @@ $5
 'tag-filter' => '[[Special:Tags|खूण]] गाळक:',
 'tag-filter-submit' => 'गाळक',
 'tags-title' => 'खुणा',
-'tags-intro' => 'पà¥\8dरणालà¥\80तà¥\82न à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤¸à¤\82पादनाà¤\82à¤\9aà¥\8dया à¤\85रà¥\8dथासहà¥\80त  à¤\96à¥\82णाà¤\82à¤\9aà¥\80  à¤¯à¤¾à¤¦à¥\80 à¤¨à¤®à¥\81द करणारे पान',
+'tags-intro' => 'पà¥\8dरणालà¥\80तà¥\82न à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤¸à¤\82पादनाà¤\82à¤\9aà¥\8dया à¤\85रà¥\8dथासहित  à¤\96à¥\81णाà¤\82à¤\9aà¥\80  à¤¯à¤¾à¤¦à¥\80 à¤¨à¤®à¥\82द करणारे पान',
 'tags-tag' => 'खूण नाव',
 'tags-display-header' => 'बदल सुचीवर कसे दिसेल',
 'tags-description-header' => 'अर्थाची पूर्ण माहिती',
@@ -3762,9 +3741,9 @@ $5
 'compare-rev1' => 'आवर्तन १',
 'compare-rev2' => 'आवर्तन २',
 'compare-submit' => 'तुलना करा',
-'compare-invalid-title' => 'तà¥\81मà¥\8dहà¥\80 à¤¨à¤®à¥\81द केलेले शीर्षक अग्राह्य आहे.',
+'compare-invalid-title' => 'तà¥\81मà¥\8dहà¥\80 à¤¨à¤®à¥\82द केलेले शीर्षक अग्राह्य आहे.',
 'compare-title-not-exists' => 'या नावाने काहीही अस्तित्वात नाही.',
-'compare-revision-not-exists' => 'à¤\86पण à¤¨à¤®à¥\81द करत असलेली आवृत्ती अस्तित्वात नाही.',
+'compare-revision-not-exists' => 'à¤\86पण à¤¨à¤®à¥\82द करत असलेली आवृत्ती अस्तित्वात नाही.',
 
 # Database error messages
 'dberr-header' => 'या विकीत एक चूक आहे',
@@ -3772,13 +3751,13 @@ $5
 'dberr-again' => 'थोडा वेळ थांबून पुन्हा पहा.',
 'dberr-info' => '( विदादाताशी संपर्क साधण्यात  असमर्थ : $1)',
 'dberr-usegoogle' => 'तोपर्यंत गूगलवर शोधून पहा',
-'dberr-outofdate' => 'लà¤\95à¥\8dषात à¤\98à¥\8dया, à¤\86मà¤\9aà¥\8dया à¤®à¤\9cà¤\95à¥\81राबाबत à¤¤à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¥\81à¤\9aà¥\80 à¤\95ालबाहà¥\8dय à¤\85सà¥\81 शकते',
+'dberr-outofdate' => 'लà¤\95à¥\8dषात à¤\98à¥\8dया, à¤\86मà¤\9aà¥\8dया à¤®à¤\9cà¤\95à¥\81राबाबत à¤¤à¥\8dयाà¤\82à¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤\95ालबाहà¥\8dय à¤\85सà¥\82 शकते',
 'dberr-cachederror' => 'ही मागवलेल्या पानाची सयीतील प्रत आहे, ती अद्ययावत नसण्याची शक्यता आहे.',
 
 # HTML forms
 'htmlform-invalid-input' => 'तुम्ही दिलेल्या माहितीत काहीतरी गडबड आहे',
-'htmlform-select-badoption' => 'à¤\86पण à¤¨à¤®à¥\81द करत असलेली व्हॅल्यू ग्राह्य पर्याय ठरत नाही',
-'htmlform-int-invalid' => 'à¤\86पण à¤¨à¤®à¥\81द केलेली व्हॅल्यू पूर्णांक (इंटीजर) नाही.',
+'htmlform-select-badoption' => 'à¤\86पण à¤¨à¤®à¥\82द करत असलेली व्हॅल्यू ग्राह्य पर्याय ठरत नाही',
+'htmlform-int-invalid' => 'à¤\86पण à¤¨à¤®à¥\82द केलेली व्हॅल्यू पूर्णांक (इंटीजर) नाही.',
 'htmlform-float-invalid' => 'तुम्ही दिलेली किंमत आकडा नाही.',
 'htmlform-int-toolow' => '$1 किंवा मोठा आकडा द्या.',
 'htmlform-int-toohigh' => '$1 किंवा त्याहून छोटा आकडा द्या.',
@@ -3813,7 +3792,7 @@ $5
 'revdelete-unrestricted' => 'प्रबंधकांची बंधने काढली',
 'logentry-move-move' => '  $3पान    $4 कडे  $1 स्थानांतरीत',
 'logentry-move-move-noredirect' => '$1 ने $3 हे पान पुनर्निर्देशीत न करता $4 येथे स्थानांतरीत केले',
-'logentry-move-move_redir' => '$1 à¤¯à¤¾à¤\82नà¥\80 $3 à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤²à¤¾à¤µà¥\81न $4 येथे हलवले',
+'logentry-move-move_redir' => '$1 à¤¯à¤¾à¤\82नà¥\80 $3 à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤²à¤¾à¤µà¥\82न $4 येथे हलवले',
 'logentry-move-move_redir-noredirect' => '$1 ने $3 हे पान पुनर्निर्देशीत न करता $4 येथे पुर्ननिर्देशनावर  स्थानांतरीत केले',
 'logentry-patrol-patrol' => '  $3  पानाच्या  $1 सुचवलेल्या  $4 आवृत्तीस गस्त घातली',
 'logentry-patrol-patrol-auto' => '  $3  पानाच्या  $1 सुचवलेल्या  $4 आवृत्तीस स्वयंचलित गस्त घातली',
@@ -3844,7 +3823,7 @@ $5
 'searchsuggest-containing' => '.......हे असलेले',
 
 # API errors
-'api-error-badaccess-groups' => 'à¤\86पणास à¤¹à¥\8dया à¤µà¤¿à¤\95à¥\80वर संचिका चढवण्याची परवानगी नाही',
+'api-error-badaccess-groups' => 'à¤\86पणास à¤¹à¥\8dया à¤µà¤¿à¤\95िवर संचिका चढवण्याची परवानगी नाही',
 'api-error-badtoken' => 'अंतर्गत चूक: अयोग्य टोकन',
 'api-error-copyuploaddisabled' => "या विदागारावर 'संकेतस्थळावरील संचिका चढविणे' अक्षम करण्यात आले आहे.",
 'api-error-duplicate' => 'या संकेतस्थळावर यासारखाच आशय असलेली {{PLURAL:$1|संचिका आहे [$2 दुसरी संचिका]| [$2 दुसऱ्या संचिका]}} आहेत.',
@@ -3865,14 +3844,14 @@ $5
 'api-error-internal-error' => 'अंतर्गत त्रुटी:आपण विकिवर चढविलेल्या संचिकेवर प्रक्रिया करतांना काहीतरी चुकले आहे.',
 'api-error-invalid-file-key' => 'अंतर्गत त्रुटी: तात्पुरत्या साठवणीत संचिका सापडली नाही.',
 'api-error-missingparam' => 'अंतर्गत चूक: मागणीतील काही नोंदी राहून गेल्या आहेत',
-'api-error-missingresult' => 'à¤\86à¤\82तरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 : à¤ªà¥\8dरत à¤¯à¤¶à¤¸à¥\8dवà¥\80 à¤\9dालà¥\80 à¤\95ि नाही हे ठरवता  येत नाही',
-'api-error-mustbeloggedin' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढविणà¥\8dयासाठà¥\80 à¤\86पण à¤¦à¤¾à¤\96ल à¤¹à¥\8bणà¥\87 à¤\9cरà¥\82री आहे.',
+'api-error-missingresult' => 'à¤\86à¤\82तरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 : à¤ªà¥\8dरत à¤¯à¤¶à¤¸à¥\8dवà¥\80 à¤\9dालà¥\80 à¤\95à¥\80 नाही हे ठरवता  येत नाही',
+'api-error-mustbeloggedin' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढविणà¥\8dयासाठà¥\80 à¤\86पण à¤¦à¤¾à¤\96ल à¤¹à¥\8bणà¥\87 à¤\9cरà¥\81री आहे.',
 'api-error-mustbeposted' => 'अंतर्गत चूक: मागणी पूर्ण करण्यासाठी HTTP POST असायला हवे',
 'api-error-noimageinfo' => 'डाटा अपलोड यशस्वी झाले आहे पण सर्व्हर कडून तशी माहिती अजून मिळाली नाही',
 'api-error-nomodule' => 'अंतर्गत चूक: module set चढवलेला नाही',
 'api-error-ok-but-empty' => 'आंतरिक त्रुटी : विदादाता प्रतिक्रिया देत नहीं',
 'api-error-overwrite' => 'अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.',
-'api-error-stashfailed' => 'à¤\87नà¥\8dतरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 : à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¤¾ à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\8dया à¤¸à¥\8dवरà¥\81पाच्या संचिका जमा करण्यात अयशस्वी',
+'api-error-stashfailed' => 'à¤\87नà¥\8dतरिà¤\95 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 : à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¤¾ à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\8dया à¤¸à¥\8dवरà¥\82पाच्या संचिका जमा करण्यात अयशस्वी',
 'api-error-timeout' => 'अपेक्षित वेळेत विदागार (server)ने प्रतिसाद दिला नाही.',
 'api-error-unclassified' => 'एक अज्ञात चूक उद्भवली.',
 'api-error-unknown-code' => 'अज्ञात त्रुटी: "$1"',
@@ -3880,7 +3859,7 @@ $5
 'api-error-unknown-warning' => 'अज्ञात इशारा : $1',
 'api-error-unknownerror' => 'अज्ञात चूक $1',
 'api-error-uploaddisabled' => 'चढवण्याचे कार्य ह्या विकिवर अवरुद्ध करण्यात आले आहे',
-'api-error-verification-error' => 'हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤­à¥\8dरषà¥\8dà¤\9f(à¤\95रपà¥\8dà¤\9f) à¤\9dालà¥\80 à¤\95िà¤\82वा à¤\9aà¥\81à¤\95िचा विस्तार(एक्सटेंशन) असलेली असू शकते.',
+'api-error-verification-error' => 'हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤­à¥\8dरषà¥\8dà¤\9f(à¤\95रपà¥\8dà¤\9f) à¤\9dालà¥\80 à¤\95िà¤\82वा à¤\9aà¥\81à¤\95à¥\80चा विस्तार(एक्सटेंशन) असलेली असू शकते.',
 
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|सेकंदापूर्वी|सेकंदांपूर्वी}}',
index cefe13a..503dca4 100644 (file)
@@ -75,8 +75,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Манярын ӹлӹштӓшӹм вӓнгӹмӹ списокышкышты пыртенӹт, анжыкташ',
 'tog-oldsig' => 'Ылшы сирӹмӹ подписьӹм анзыцок анжен лӓктӓш',
 'tog-fancysig' => 'Вики-пӓлӹкӹн ӹшке подписьшӹ (автоматический ажедмӓш гӹц пасна)',
-'tog-externaleditor' => 'Тӱнӹш тӧрлӹшӹм кычылташ (компьютерӹн йори настройкыжы келеш)',
-'tog-externaldiff' => 'Вариантвлӓн тӓнгӓштӓрӹмӹ годым тӱнӹш программым кычылташ (компьютерӹн йори настройкыжы келеш)',
 'tog-showjumplinks' => '«ванжаш» палшышы ажедмӓшвлӓм чӱктӓш',
 'tog-uselivepreview' => 'Текстӹм пӹсӹн анзыц анжен лӓкмӹм кычылташ (эксперимент семӹнь JavaScript)',
 'tog-forceeditsummary' => 'Мам тӧрлӹмӹ тӹ «нырын» охыр ылмыжы гишӓн пӓлдӹртӓш',
@@ -387,6 +385,9 @@ $messages = array(
 
 'grouppage-sysop' => '{{ns:project}}:Администраторвлӓ',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Сирӹшӹвлӓм регистрируйышы журнал',
+
 # User rights log
 'rightslog' => 'Сирӹшӹн прававлӓжӹм анжыктышы журнал',
 
@@ -480,13 +481,10 @@ $messages = array(
 # Special:LinkSearch
 'linksearch' => 'Тӱнӹш ажедмӓшвлӓ',
 
-# Special:Log/newusers
-'newuserlogpage' => 'Сирӹшӹвлӓм регистрируйышы журнал',
-
 # Special:ListGroupRights
 'listgrouprights-members' => '(группын списокшы)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Сирӹшӹлӓн сирмӓш',
 
 # Watchlist
index 60fedcc..0040e09 100644 (file)
@@ -84,6 +84,7 @@ $magicWords = array(
        'pagenamee'                 => array( '1', 'NAMALAMANE', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'RUANGNAMA', 'NAMESPACE' ),
        'namespacee'                => array( '1', 'RUANGNAMAE', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'NOMBORRUANGNAMA', 'NAMESPACENUMBER' ),
        'talkspace'                 => array( '1', 'RUANGBINCANG', 'TALKSPACE' ),
        'talkspacee'                => array( '1', 'RUANGBINCANGE', 'TALKSPACEE' ),
        'fullpagename'              => array( '1', 'NAMALAMANPENUH', 'FULLPAGENAME' ),
@@ -94,9 +95,11 @@ $magicWords = array(
        'img_left'                  => array( '1', 'kanan', 'left' ),
        'img_none'                  => array( '1', 'tiada', 'none' ),
        'img_center'                => array( '1', 'tengah', 'center', 'centre' ),
+       'img_border'                => array( '1', 'bingkai', 'border' ),
        'sitename'                  => array( '1', 'NAMATAPAK', 'SITENAME' ),
        'ns'                        => array( '0', 'RN:', 'NS:' ),
        'nse'                       => array( '0', 'RNE:', 'NSE:' ),
+       'gender'                    => array( '0', 'JANTINA:', 'GENDER:' ),
        'currentweek'               => array( '1', 'MINGGUSEMASA', 'CURRENTWEEK' ),
 );
 
@@ -111,13 +114,15 @@ $specialPageAliases = array(
        'Booksources'               => array( 'Sumber_buku' ),
        'BrokenRedirects'           => array( 'Lencongan_rosak', 'Pelencongan_rosak' ),
        'Categories'                => array( 'Kategori' ),
+       'ChangeEmail'               => array( 'Tukar_e-mel' ),
        'ChangePassword'            => array( 'Lupa_kata_laluan' ),
+       'ComparePages'              => array( 'Banding_laman' ),
        'Confirmemail'              => array( 'Sahkan_e-mel' ),
        'Contributions'             => array( 'Sumbangan' ),
        'CreateAccount'             => array( 'Buka_akaun' ),
        'Deadendpages'              => array( 'Laman_buntu' ),
        'DeletedContributions'      => array( 'Sumbangan_dihapuskan' ),
-       'Disambiguations'           => array( 'Penyahtaksaan' ),
+       'Disambiguations'           => array( 'Penyahtaksaan', 'Nyahkekaburan' ),
        'DoubleRedirects'           => array( 'Lencongan_berganda', 'Pelencongan_berganda' ),
        'Emailuser'                 => array( 'E-mel_pengguna' ),
        'Export'                    => array( 'Eksport' ),
@@ -148,6 +153,7 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'Sumbangan_saya' ),
        'Mypage'                    => array( 'Laman_saya' ),
        'Mytalk'                    => array( 'Perbincangan_saya' ),
+       'Myuploads'                 => array( 'Muat_naik_saya' ),
        'Newimages'                 => array( 'Imej_baru' ),
        'Newpages'                  => array( 'Laman_baru' ),
        'Popularpages'              => array( 'Laman_popular' ),
@@ -165,6 +171,7 @@ $specialPageAliases = array(
        'Specialpages'              => array( 'Laman_khas' ),
        'Statistics'                => array( 'Statistik' ),
        'Tags'                      => array( 'Label' ),
+       'Unblock'                   => array( 'Nyahsekat' ),
        'Uncategorizedcategories'   => array( 'Kategori_tanpa_kategori' ),
        'Uncategorizedimages'       => array( 'Imej_tanpa_kategori' ),
        'Uncategorizedpages'        => array( 'Laman_tanpa_kategori' ),
@@ -220,8 +227,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Tunjukkan bilangan pemantau',
 'tog-oldsig' => 'Tanda tangan yang sedia ada:',
 'tog-fancysig' => 'Anggap tandatangan sebagai teks wiki (tanpa pautan automatik)',
-'tog-externaleditor' => 'Utamakan penyunting luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
-'tog-externaldiff' => 'Utamakan pembeza luar (hanya untuk pakar, perlu tetapan khas pada komputer anda. [//www.mediawiki.org/wiki/Manual:External_editors Maklumat lanjut.])',
 'tog-showjumplinks' => 'Bolehkan pautan ketercapaian "lompat ke"',
 'tog-uselivepreview' => 'Gunakan pralihat langsung (JavaScript) (dalam percubaan)',
 'tog-forceeditsummary' => 'Tanya saya jika ringkasan suntingan kosong',
@@ -236,14 +241,15 @@ $messages = array(
 'tog-showhiddencats' => 'Tunjukkan kategori tersembunyi',
 'tog-noconvertlink' => 'Lumpuhkan penukaran tajuk pautan',
 'tog-norollbackdiff' => 'Abaikan perbezaan selepas melakukan pengunduran suntingan.',
+'tog-useeditwarning' => 'Beri saya amaran apabila saya meninggalkan sesebuah laman penyuntingan tanpa menyimpan perubahan.',
 
 'underline-always' => 'Sentiasa',
 'underline-never' => 'Jangan',
-'underline-default' => 'Tetapan azali kulit/pelayar',
+'underline-default' => 'Tetapan lalai kulit/pelayar',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Gaya fon ruang sunting:',
-'editfont-default' => 'Pelayar web utama',
+'editfont-default' => 'Lalaian pelayar web',
 'editfont-monospace' => 'Fon monospace',
 'editfont-sansserif' => 'Fon sans-serif',
 'editfont-serif' => 'Fon serif',
@@ -299,6 +305,18 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Dis',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Februari',
+'march-date' => '$1 Mac',
+'april-date' => '$1 April',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Jun',
+'july-date' => '$1 Julai',
+'august-date' => '$1 Ogos',
+'september-date' => '$1 September',
+'october-date' => '$1 Oktober',
+'november-date' => '$1 November',
+'december-date' => '$1 Disember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategori}}',
@@ -324,7 +342,7 @@ $messages = array(
 'about' => 'Perihal',
 'article' => 'Laman kandungan',
 'newwindow' => '(dibuka di tetingkap baru)',
-'cancel' => 'Batalkan',
+'cancel' => 'Batal',
 'moredotdotdot' => 'Lagi...',
 'morenotlisted' => 'Lain-lain yang tidak tersenarai...',
 'mypage' => 'Halaman',
@@ -608,9 +626,18 @@ Anda boleh terus menggunakan {{SITENAME}} sebagai pengguna tanpa nama, atau anda
 'welcomecreation-msg' => 'Akaun anda telah dibuka.
 Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]].',
 'yourname' => 'Nama pengguna:',
+'userlogin-yourname' => 'Nama pengguna',
+'userlogin-yourname-ph' => 'Masukkan nama pengguna anda',
 'yourpassword' => 'Kata laluan:',
+'userlogin-yourpassword' => 'Kata laluan',
+'userlogin-yourpassword-ph' => 'Masukkan kata laluan anda',
+'createacct-yourpassword-ph' => 'Isikan kata laluan',
 'yourpasswordagain' => 'Ulangi kata laluan:',
+'createacct-yourpasswordagain' => 'Sahkan kata laluan',
+'createacct-yourpasswordagain-ph' => 'Isikan kata laluan semula',
 'remembermypassword' => 'Ingat log masuk saya pada pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})',
+'userlogin-remembermypassword' => 'Biar saya kekal log masuk',
+'userlogin-signwithsecure' => 'Gunakan sambungan terlindung',
 'securelogin-stick-https' => 'Kekal disambungkan ke HTTPS selepas log masuk',
 'yourdomainname' => 'Domain anda:',
 'password-change-forbidden' => 'Anda tidak dapat mengubah kata laluan di wiki ini.',
@@ -623,18 +650,38 @@ Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]
 'logout' => 'Log keluar',
 'userlogout' => 'Log keluar',
 'notloggedin' => 'Belum log masuk',
+'userlogin-noaccount' => 'Belum buka akaun?',
+'userlogin-joinproject' => 'Sertai {{SITENAME}}',
 'nologin' => "Belum mempunyai akaun? '''$1'''.",
 'nologinlink' => 'Buka akaun baru',
 'createaccount' => 'Buka akaun',
 'gotaccount' => "Sudah mempunyai akaun? '''$1'''.",
 'gotaccountlink' => 'Log masuk',
 'userlogin-resetlink' => 'Lupa nama pengguna/kata laluan anda?',
+'userlogin-resetpassword-link' => 'Reset kata laluan anda',
+'helplogin-url' => 'Help:Log masuk',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan untuk log masuk]]',
+'createacct-join' => 'Isikan keterangan anda di bawah.',
+'createacct-emailrequired' => 'Alamat e-mel',
+'createacct-emailoptional' => 'Alamat e-mel (pilihan)',
+'createacct-email-ph' => 'Isikan alamt e-mel anda',
 'createaccountmail' => 'Gunakan kata laluan rawak yang sementara dan hantarnya ke alamat e-mel yang dinyatakan di bawah',
+'createacct-realname' => 'Nama sebenar (pilihan)',
 '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-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.',
 'userexists' => 'Nama pengguna yang diisikan telah pun digunakan.
 Sila pilih nama yang lain.',
 'loginerror' => 'Ralat log masuk',
+'createacct-error' => 'Ralat pembukaan akaun',
 'createaccounterror' => 'Tidak dapat mencipta akaun: $1',
 'nocookiesnew' => 'Akaun anda telah dibuka, tetapi anda belum log masuk. {{SITENAME}} menggunakan kuki untuk mencatat status log masuk pengguna. Sila aktifkan sokongan kuki pada pelayar anda, kemudian log masuk dengan nama pengguna dan kata laluan baru anda.',
 'nocookieslogin' => "{{SITENAME}} menggunakan ''cookies'' untuk mencatat status log masuk pengguna. Sila aktifkan sokongan ''cookies'' pada pelayar anda dan cuba lagi.",
@@ -668,9 +715,8 @@ mengelak penyalahgunaan, anda tidak dibenarkan menggunakan ciri pemulihan kata l
 'eauthentsent' => 'Sebuah e-mel pengesahan telah dikirim kepada alamat e-mel tersebut.
 Sebelum e-emel lain boleh dikirim kepada alamat tersebut, anda perlu mengikuti segala arahan dalam e-mel tersebut
 untuk membuktikan bahawa alamat tersebut memang milik anda.',
-'throttled-mailpassword' => 'Sebuah pengingat kata laluan telah pun
-dikirim dalam $1 jam yang lalu. Untuk mengelak penyalahgunaan, hanya satu
-pengingat kata laluan akan dikirim pada setiap $1 jam.',
+'throttled-mailpassword' => 'E-mel set semula kata laluan telah dihantar dalam tempoh $1 jam yang lalu.
+Untuk mencegah salah guna, hanya sepucuk e-mel set semula kata laluan dihantar setiap {{PLURAL:$1|jam|$1 jam}}.',
 'mailerror' => 'Ralat ketika mengirim e-mel: $1',
 'acct_creation_throttle_hit' => 'Pengunjung wiki ini yang menggunakan alamat IP anda telah membuka sebanyak $1 akaun semenjak sehari lepas, iaitu merupakan had maksimum yang dibenarkan dalam tempoh tersebut.
 Akibatknya, pengunjung dari alamat IP ini tidak boleh membuka akaun lagi pada masa sekarang.',
@@ -719,34 +765,38 @@ Sila tunggu sebentar dan cuba lagi.',
 'resetpass-wrong-oldpass' => 'Kata laluan sementara atau semasa tidak sah.
 Anda mungkin telah pun berjaya menukar kata laluan anda atau meminta kata laluan sementara yang baru.',
 'resetpass-temp-password' => 'Kata laluan sementara:',
+'resetpass-abort-generic' => 'Penukaran kata laluan telah dihenti paksa oleh sambungan.',
 
 # Special:PasswordReset
 'passwordreset' => 'Set semula kata laluan',
-'passwordreset-text' => 'Isikan borang ini untuk menerima peringatan butiran akaun anda melalui e-mel.',
+'passwordreset-text-one' => 'Lengkapkan borang ini untuk mengeset semula kata laluan anda.',
+'passwordreset-text-many' => '{{PLURAL:$1|Masukkan salah sebahagian data untuk mengeset semula kata laluan anda.}}',
 'passwordreset-legend' => 'Set semula kata laluan',
 'passwordreset-disabled' => 'Ciri set semula kata laluan telah dimatikan di wiki ini.',
-'passwordreset-pretext' => '{{PLURAL:$1||Isikan data di bawah}}',
+'passwordreset-emaildisabled' => 'Ciri-ciri e-mel telah dipadamkan di wiki ini.',
 'passwordreset-username' => 'Nama pengguna:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Lihat e-mel yang terhasil?',
 'passwordreset-capture-help' => 'Jika anda menandai ruang ini, e-mel (yang membawa kata laluan sementara) akan ditunjukkan kepada anda dan juga dihantar kepada pengguna itu.',
 'passwordreset-email' => 'Alamat e-mel:',
 'passwordreset-emailtitle' => 'Butiran akaun di {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ada orang (mungkin anda, dari alamat IP $1) yang memohon peringatan butiran akaun anda untuk {{SITENAME}} ($4).  {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut dikaitkan dengan alamat e-mel ini:
+'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
+dikaitkan dengan alamat e-mel ini:
 
 $2
 
-{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa {{PLURAL:$5|sehari|$5 hari}}. Anda mesti log masuk dan buat kata laluan baru sekarang juga. Jika permohonan ini dibuat oleh orang lain, ataupun jika anda teringat balik kata laluan lama anda, dan tidak ingin lagi untuk menukarnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.',
-'passwordreset-emailtext-user' => 'Pengguna $1 di {{SITENAME}} memohon peringatan butiran akaun anda untuk {{SITENAME}} ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut dikaitkan dengan alamat e-mel ini:
+{{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
+dikaitkan dengan alamat e-mel ini:
 
 $2
 
-{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa {{PLURAL:$5|sehari|$5 hari}}. Anda mesti log masuk dan buat kata laluan baru sekarang juga. Jika permohonan ini dibuat oleh orang lain, ataupun jika anda teringat balik kata laluan lama anda, dan tidak ingin lagi untuk menukarnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.',
+{{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
 Kata laluan sementara: $2',
-'passwordreset-emailsent' => 'E-mel peringatan telah dihantar.',
-'passwordreset-emailsent-capture' => 'E-mel peringatan (seperti di bawah) telah dihantar.',
-'passwordreset-emailerror-capture' => 'E-mel peringatan (seperti di bawah) telah dihasilkan tetapi tidak dapat dihantar kepada pengguna: $1',
+'passwordreset-emailsent' => 'E-mel set semula kata laluan telah 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',
 
 # Special:ChangeEmail
 'changeemail' => 'Tukar alamat e-mel',
@@ -952,11 +1002,14 @@ Log penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.',
 'edit-gone-missing' => 'Laman tersebut telah dihapuskan dan tidak dapat dikemaskinikan.',
 'edit-conflict' => 'Percanggahan penyuntingan.',
 'edit-no-change' => 'Suntingan anda diabaikan kerana tiada perubahan dibuat pada teks tersebut.',
+'postedit-confirmation' => 'Suntingan anda telah disimpan.',
 'edit-already-exists' => 'Tidak dapat mencipta laman baru kerana ia telah wujud.',
 'defaultmessagetext' => 'Teks mesej asal',
 'content-failed-to-parse' => 'Kandungan $2 tidak dapat dihuraikan untuk model $1: $3',
 'invalid-content-data' => 'Data kandungan tidak sah',
 'content-not-allowed-here' => 'Kandungan "$1" tidak dibenarkan di halaman [[$2]]',
+'editwarning-warning' => 'Meninggalkan laman ini mungkin akan menyebabkan sebarang perubahan yang telah anda lakukan hilang.
+Jika anda sudah log masuk, anda boleh melumpuhkan amaran ini di bahagian "Menyunting" dalam keutamaan anda.',
 
 # Content models
 'content-model-wikitext' => 'wikiteks',
@@ -1241,15 +1294,7 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
 'powersearch-togglenone' => 'Tiada',
 'search-external' => 'Carian luar',
 'searchdisabled' => 'Ciri pencarian dalam {{SITENAME}} dimatikan. Anda boleh mencari melalui Google. Sila ambil perhatian bahawa indeks dalam Google mungkin bukan yang terkini.',
-
-# Quickbar
-'qbsettings' => 'Bar pantas',
-'qbsettings-none' => 'Tiada',
-'qbsettings-fixedleft' => 'Tetap sebelah kiri',
-'qbsettings-fixedright' => 'Tetap sebelah kanan',
-'qbsettings-floatingleft' => 'Berubah-ubah sebelah kiri',
-'qbsettings-floatingright' => 'Berubah-ubah sebelah kanan',
-'qbsettings-directionality' => 'Tetap, bergantung pada kearahan tulisan bahasa anda',
+'search-error' => 'Berlakunya ralat ketika mencari: $1',
 
 # Preferences page
 'preferences' => 'Keutamaan',
@@ -1394,6 +1439,7 @@ Tindakan ini tidak boleh dibatalkan.',
 'userrights-changeable-col' => 'Kumpulan yang anda boleh ubah',
 'userrights-unchangeable-col' => 'Kumpulan yang anda tak boleh ubah',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Hak-hak pengguna bercanggah! Sila terapkan pengubahan anda sekali lagi.',
 
 # Groups
 'group' => 'Kumpulan:',
@@ -1800,7 +1846,6 @@ Untuk keselamatan optimum, img_auth.php telah dilumpuhkan.',
 'http-read-error' => 'Ralat baca HTTP.',
 'http-timed-out' => 'Permintaan HTTP melebihi waktu tamat.',
 'http-curl-error' => 'Ralat mendapatkan URL: $1',
-'http-host-unreachable' => 'URL tidak dapat dicapai.',
 'http-bad-status' => 'Berlaku masalah ketika permintaan HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2213,8 +2258,8 @@ Perubahan-perubahan pada halaman ini dan halaman perbualannya pada masa akan dat
 'notvisiblerev' => 'Semakan ini telah dihapuskan',
 'watchnochange' => 'Tiada perubahan pada laman-laman yang dipantau dalam tempoh yang ditunjukkan.',
 'watchlist-details' => '$1 laman dipantau (tidak termasuk laman perbincangan).',
-'wlheader-enotif' => '* Pemberitahuan melalui e-mel diaktifkan.',
-'wlheader-showupdated' => "* Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''",
+'wlheader-enotif' => 'Pemberitahuan melalui e-mel dibolehkan.',
+'wlheader-showupdated' => "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
 'watchmethod-recent' => 'menyemak laman yang dipantau dalam suntingan-suntingan terkini',
 'watchmethod-list' => 'menyemak suntingan terkini pada laman-laman yang dipantau',
 'watchlistcontains' => 'Terdapat $1 laman dalam senarai pantau anda.',
@@ -2623,6 +2668,7 @@ Sila hubungi penyedia perkhidmatan Internet anda atau pihak sokongan teknikal da
 'proxyblocksuccess' => 'Berjaya.',
 'sorbsreason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Alamat IP anda telah disenaraikan sebagai proksi terbuka dalam DNSBL yang digunakan oleh {{SITENAME}}. Oleh itu, anda tidak dibenarkan membuka akaun baru.',
+'xffblockreason' => 'Alamat IP yang terdapat dalam pengepala X-Forwarded-For, sama ada milik anda ataupun pelayan proksi yang anda gunakan, telah disekat. Sebab asal sekatan adalah: $1',
 'cant-block-while-blocked' => 'Anda tidak boleh menyekat orang lain sedangkan anda disekat.',
 'cant-see-hidden-user' => 'Pengguna yang anda cuba sekat telahpun disekat dan tersorok.
 Memandangkan anda tidak mempunyai hak untuk menyorokkan pengguna, anda tidak boleh melihat atau menyunting sekatan pengguna tersebut.',
@@ -2791,6 +2837,7 @@ Sila lawat [//www.mediawiki.org/wiki/Localisation Penyetempatan MediaWiki] dan [
 'thumbnail-more' => 'Besarkan',
 'filemissing' => 'Fail hilang',
 'thumbnail_error' => 'Berlaku ralat ketika mencipta gambar kenit: $1',
+'thumbnail_error_remote' => 'Mesej ralat dari $1: $2',
 'djvu_page_error' => 'Laman DjVu di luar julat',
 'djvu_no_xml' => 'Gagal mendapatkan data XML bagi fail DjVu',
 'thumbnail-temp-create' => 'Fail gambar kenit sementara tidak dapat dibuat',
@@ -2939,13 +2986,8 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 
 # Stylesheets
 'common.css' => '/* CSS yang terletak di sini akan digunakan pada semua kulit */',
-'standard.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Klasik */',
-'nostalgia.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Nostalgia */',
 'cologneblue.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Cologne Blue */',
 'monobook.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Monobook */',
-'myskin.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit MySkin */',
-'chick.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Chick */',
-'simple.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Ringkas */',
 'modern.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Moden */',
 'vector.css' => '/* CSS yang terletak di sini akan mempengaruhi pengguna kulit Vector */',
 
@@ -3020,13 +3062,8 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'pageinfo-category-files' => 'Bilangan fail',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Ringkas',
 'skinname-modern' => 'Moden',
 'skinname-vector' => 'Vector',
 
@@ -3109,11 +3146,25 @@ Dengan menjalankannya, komputer anda mungkin akan terjejas.",
 'minutes' => '$1 minit',
 'hours' => '$1 jam',
 'days' => '$1 hari',
+'weeks' => '$1 minggu',
 'months' => '$1 bulan',
 'years' => '$1 tahun',
 'ago' => '$1 yang lalu',
 'just-now' => 'tadi',
 
+# Human-readable timestamps
+'hours-ago' => '$1 jam yang lalu',
+'minutes-ago' => '$1 minit yang lalu',
+'seconds-ago' => '$1 saat yang lalu',
+'monday-at' => 'Isnin $1',
+'tuesday-at' => 'Selasa $1',
+'wednesday-at' => 'Rabu $1',
+'thursday-at' => 'Khamis $1',
+'friday-at' => 'Jumaat $1',
+'saturday-at' => 'Sabtu $1',
+'sunday-at' => 'Ahad $1',
+'yesterday-at' => 'Semalam $1',
+
 # Bad image list
 'bad_image_list' => 'Berikut adalah format yang digunakan:
 
@@ -3141,7 +3192,7 @@ Ruangan-ruangan yang lain pula akan disembunyikan pada asali.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lebar',
 'exif-imagelength' => 'Tinggi',
 'exif-bitspersample' => 'Bit sekomponen',
@@ -3319,7 +3370,7 @@ Ruangan-ruangan yang lain pula akan disembunyikan pada asali.
 'exif-originalimageheight' => 'Ketinggian imej sebelum dipangkas',
 'exif-originalimagewidth' => 'Lebar imej sebelum dipangkas',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Tak termampat',
 'exif-compression-2' => 'Pengekodan panjang jalan Huffman Terubahsuai 1-Dimensi Kumpulan 3 CCITT',
 'exif-compression-3' => 'Pengekodan faks Kumpulan 3 CCITT',
@@ -3741,12 +3792,17 @@ Anda patut telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING sebuah salinan bagi
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Laluan rencana]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Laluan skrip]',
 
-# Special:FilePath
-'filepath' => 'Laluan fail',
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Pergi',
-'filepath-summary' => 'Laman khas ini mengembalikan laluan penuh bagi sesebuah fail.
-Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara yang berkenaan secara terus.',
+# Special:Redirect
+'redirect' => 'Lencongkan mengikut fail, ID pengguna atau ID semakan',
+'redirect-legend' => 'Lencongkan ke fail atau halaman',
+'redirect-summary' => 'Halaman khas ini melencong kepada fail (dengan nama fail), halaman (dengan ID semakan) atau halaman pengguna (dengan ID pengguna berangka).',
+'redirect-submit' => 'Pergi',
+'redirect-lookup' => 'Cari:',
+'redirect-value' => 'Nilai:',
+'redirect-user' => 'ID Pengguna',
+'redirect-revision' => 'Semakan halaman',
+'redirect-file' => 'Nama fail',
+'redirect-not-exists' => 'Nilai tidak dijumpai',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cari fail serupa',
@@ -3837,23 +3893,26 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 'htmlform-submit' => 'Hantar',
 'htmlform-reset' => 'Undur perubahan',
 'htmlform-selectorother-other' => 'Lain-lain',
+'htmlform-no' => 'Tidak',
+'htmlform-yes' => 'Ya',
+'htmlform-chosen-placeholder' => 'Pilih satu pilihan',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 dengan sokongan carian teks penuh',
 'sqlite-no-fts' => '$1 tanpa sokongan carian teks penuh',
 
 # New logging system
-'logentry-delete-delete' => '$1 menghapuskan laman $3',
-'logentry-delete-restore' => '$1 memulihkan laman $3',
-'logentry-delete-event' => '$1 mengubah keterlihatan {{PLURAL:$5|satu peristiwa log|$5 peristiwa log}} di $3: $4',
-'logentry-delete-revision' => '$1 mengubah keterlihatan {{PLURAL:$5|satu semakan|$5 semakan}} di $3: $4',
-'logentry-delete-event-legacy' => '$1 mengubah keterlihatan peristiwa-peristiwa log di $3',
-'logentry-delete-revision-legacy' => '$1 mengubah keterlihatan semakan-semakan di $3',
-'logentry-suppress-delete' => '$1 menyekat laman $3',
-'logentry-suppress-event' => '$1 mengubah keterlihatan {{PLURAL:$5|satu peristiwa log|$5 peristiwa log}} di $3 secara rahsia: $4',
-'logentry-suppress-revision' => '$1 mengubah keterlihatan {{PLURAL:$5|satu semakan|$5 semakan}} di $3 secara rahsia: $4',
-'logentry-suppress-event-legacy' => '$1 mengubah keterlihatan peristiwa-peristiwa log di $3 secara rahsia',
-'logentry-suppress-revision-legacy' => '$1 mengubah keterlihatan semakan-semakan di $3 secara rahsia',
+'logentry-delete-delete' => '$1 telah {{GENDER:$2|menghapuskan}} halaman $3',
+'logentry-delete-restore' => '$1 telah {{GENDER:$2|memulihkan}} halaman $3',
+'logentry-delete-event' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3: $4',
+'logentry-delete-revision' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3: $4',
+'logentry-delete-event-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3',
+'logentry-delete-revision-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan semakan di halaman $3',
+'logentry-suppress-delete' => '$1 telah {{GENDER:$2|menyekat}} halaman $3',
+'logentry-suppress-event' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3 secara senyap: $4',
+'logentry-suppress-revision' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3 secara senyap: $4',
+'logentry-suppress-event-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3 secara senyap',
+'logentry-suppress-revision-legacy' => '$1 telah {{GENDER:$2|mengubah}} keterlihatan semakan di halaman $3 secara senyap',
 'revdelete-content-hid' => 'kandungan tersorok',
 'revdelete-summary-hid' => 'ringkasan suntingan tersorok',
 'revdelete-uname-hid' => 'nama pengguna tersorok',
@@ -3862,20 +3921,20 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 'revdelete-uname-unhid' => 'nama pengguna terdedah',
 'revdelete-restricted' => 'mengenakan sekatan pada penyelia',
 'revdelete-unrestricted' => 'menarik sekatan daripada penyelia',
-'logentry-move-move' => '$1 memindahkan laman $3 ke $4',
-'logentry-move-move-noredirect' => '$1 mengalihkan laman $3 ke $4 tanpa meninggalkan lencongan',
-'logentry-move-move_redir' => '$1 mengalihkan laman $3 ke $4 pada lencongan',
-'logentry-move-move_redir-noredirect' => '$1 mengalihkan laman $3 ke $4 pada satu lencongan tanpa meninggalkan lencongan',
-'logentry-patrol-patrol' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda',
-'logentry-patrol-patrol-auto' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda secara automatik',
-'logentry-newusers-newusers' => 'Akaun pengguna $1 dibuka',
-'logentry-newusers-create' => 'Akaun pengguna $1 dibuka',
-'logentry-newusers-create2' => 'Akaun pengguna $3 dibuka oleh $1',
-'logentry-newusers-byemail' => 'Akaun pengguna $3 dibuka oleh $1 dan kata laluannya dihantar melalui e-mel',
-'logentry-newusers-autocreate' => 'Akaun $1 dibuka secara automatik',
-'logentry-rights-rights' => '$1 menukar keahlian kumpulan untuk $3 dari $4 ke $5',
-'logentry-rights-rights-legacy' => '$1 menukar keahlian kumpulan untuk $3',
-'logentry-rights-autopromote' => '$1 dinaik pangkat secara automatik dari $4 ke $5',
+'logentry-move-move' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4',
+'logentry-move-move-noredirect' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa meninggalkan lencongan',
+'logentry-move-move_redir' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan',
+'logentry-move-move_redir-noredirect' => '$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan tanpa meninggalkan lencongan',
+'logentry-patrol-patrol' => '$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda',
+'logentry-patrol-patrol-auto' => '$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda secara automatik',
+'logentry-newusers-newusers' => 'Akaun pengguna $1 telah {{GENDER:$2|dibuka}}',
+'logentry-newusers-create' => 'Akaun pengguna $1 telah {{GENDER:$2|dibuka}}',
+'logentry-newusers-create2' => 'Akaun pengguna $3 telah {{GENDER:$2|dibuka}} oleh $1',
+'logentry-newusers-byemail' => 'Akaun pengguna $3 telah {{GENDER:$2|dibuka}} oleh $1 dan kata laluannya dihantar melalui e-mel',
+'logentry-newusers-autocreate' => 'Akaun pengguna $1 telah {{GENDER:$2|dibuka}} secara automatik',
+'logentry-rights-rights' => '$1 telah {{GENDER:$2|menukar}} keahlian kumpulan untuk $3 dari $4 ke $5',
+'logentry-rights-rights-legacy' => '$1 telah {{GENDER:$2|menukar}} keahlian kumpulan untuk $3',
+'logentry-rights-autopromote' => '$1 telah {{GENDER:$2|dinaik pangkat}} secara automatik dari $4 ke $5',
 'rightsnone' => '(tiada)',
 
 # Feedback
index e5cc31b..69bfec7 100644 (file)
@@ -302,8 +302,6 @@ $messages = array(
 'tog-shownumberswatching' => "Uri n-numru ta' utenti li qegħdin isegwu din il-paġna",
 'tog-oldsig' => 'Firma attwali:',
 'tog-fancysig' => 'Interpreta l-firma bħala test tal-wiki (mingħajr ħolqa awtomatika)',
-'tog-externaleditor' => 'Uża awtomatikament editur estern (għal utenti esperti biss, hemm bżonn preferenzi speċjali fuq il-komputer tiegħek. [//www.mediawiki.org/wiki/Manual:External_editors Iktar informazzjoni.])',
-'tog-externaldiff' => 'Uża awtomatikament diff estern (għal utenti esperti biss, hemm bżonn preferenzi speċjali fuq il-komputer tiegħek. [//www.mediawiki.org/wiki/Manual:External_editors Iktar informazzjoni.])',
 'tog-showjumplinks' => 'Attiva l-ħoloq aċċessibbli "aqbeż għal"',
 'tog-uselivepreview' => "Attiva l-funzjoni ''Live preview'' (bżonn tal-JavaScript; sperimentali)",
 'tog-forceeditsummary' => 'Nebbaħni meta ndaħħal taqsira tal-modifika vojta',
@@ -317,6 +315,7 @@ $messages = array(
 'tog-diffonly' => 'Turiex kontenut tal-paġni wara li tkun għamilt paragun bejn il-verżjonijiet',
 'tog-showhiddencats' => 'Uri kategoriji moħbija',
 'tog-norollbackdiff' => "Turix il-paragun bejn il-verżjonijiet wara li tkun effettwajt ir-''rollback''",
+'tog-useeditwarning' => "Avżani kull meta nħalli paġna ta' modifika b'modifiki li għadhom ma ġewx salvati",
 
 'underline-always' => 'Dejjem',
 'underline-never' => 'Qatt',
@@ -1012,6 +1011,7 @@ Jidher li din ġiet imħassra.',
 'edit-no-change' => 'Il-modifika li għamilt ġiet injorata, minħabba li ebda bidla ma saret lejn it-test.',
 'edit-already-exists' => 'Ma tistax tinħoloq din il-paġna.
 Din teżisti diġà.',
+'editwarning-warning' => 'Jekk tħalli din il-paġna jista\' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista\' tneħħi dan l-avviż fis-sezzjoni "Modifiki" tal-preferenzi tiegħek.',
 
 # Content models
 'content-model-wikitext' => 'test tal-wiki',
@@ -1282,15 +1282,6 @@ Ipprova għamel prefiss għall-inkjesta tiegħek ma' ''all:'' sabiex tfittex il-
 Sadanittant, tista' tipprova tfittex bil-Google.
 Innota però li l-werreja tal-kontenut ta' {{SITENAME}} f'dawn is-siti, jistgħu ma jkunux aġġornati.",
 
-# Quickbar
-'qbsettings' => "''Quickbar''",
-'qbsettings-none' => 'Xejn',
-'qbsettings-fixedleft' => 'Mehmuż fix-xellug',
-'qbsettings-fixedright' => 'Mehmuż fil-lemin',
-'qbsettings-floatingleft' => "''Floating'' lejn ix-xellug",
-'qbsettings-floatingright' => "''Floating'' lejn il-lemin",
-'qbsettings-directionality' => 'Fiss, skont id-direzzjoni tat-test fil-lingwa tiegħek',
-
 # Preferences page
 'preferences' => 'Preferenzi',
 'mypreferences' => 'Preferenzi',
@@ -1800,7 +1791,6 @@ Għal sigurtà ottimali, img_auth.php hija diżattivata.",
 'http-read-error' => 'Żball fil-qari HTTP.',
 'http-timed-out' => 'Rikjesta HTTP skaduta.',
 'http-curl-error' => 'Żball fil-kisba tal-URL: $1',
-'http-host-unreachable' => 'Il-URL ma setgħetx tintlaħaq.',
 'http-bad-status' => 'Kien hemm problema matul ir-rikjesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2201,8 +2191,8 @@ Kwalunkwe modifika li ssir fil-futur, kemm fuq din il-paġna u fil-paġna ta\' d
 'notvisiblerev' => 'Ir-reviżjoni tħassret',
 'watchnochange' => 'L-ebda waħda mill-paġni osservati tiegħek ma ġiet modifikata fil-ħin stipulat.',
 'watchlist-details' => "Il-lista ta' osservazzjoni fiha {{PLURAL:$1|paġna waħda (u l-paġna ta' diskussjoni tagħha)|$1 paġni (u l-paġni ta' diskussjoni tagħhom)}}.",
-'wlheader-enotif' => 'In-notifikazzjoni bl-użu tal-posta elettronika hija attivata.',
-'wlheader-showupdated' => "Il-paġni li ġew editjati wara l-aħħar żjara tiegħek qed jiġu murija b'tipa '''ħoxna'''",
+'wlheader-enotif' => 'In-notifikazzjoni bl-użu tal-posta elettronika hija attivata.',
+'wlheader-showupdated' => "Il-paġni li ġew editjati wara l-aħħar żjara tiegħek qed jiġu murija b'tipa '''ħoxna'''",
 'watchmethod-recent' => "Kontroll ta' modifiki riċenti għall-osservati speċjali.",
 'watchmethod-list' => 'Kontroll tal-osservati speċjali għal modifiki riċenti',
 'watchlistcontains' => "Il-lista ta' osservazzjoni fiha {{PLURAL:$1|paġna|$1 paġni}}.",
@@ -2891,24 +2881,14 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 
 # Stylesheets
 'common.css' => '/* CSS li tpoġġa hawnhekk irrid jiġi applikat fl-iskins kollha */',
-'standard.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa l-utenti li jagħmlu użu mill-iskin Standard */',
-'nostalgia.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa l-utenti li jagħmlu użu mill-aspett grafiku Nostalgia */',
 'cologneblue.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Cologne Blue */',
 'monobook.css' => "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-iskin ''Monobook'' */",
-'myskin.css' => "/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-iskin ''L-Iskin tiegħi'' */",
-'chick.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Ckick */',
-'simple.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Simple */',
 'modern.css' => '/* CSS li tpoġġa hawnhekk se jaffetwa dawk l-utenti li jagħmlu użu mill-aspett grafiku Modern */',
 
 # Scripts
 'common.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal kull utent f'kull tniżżil ta' paġna. */",
-'standard.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Standard'' */",
-'nostalgia.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Nostalgia'' */",
 'cologneblue.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Cologne Blue'' */",
 'monobook.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Monobook'' */",
-'myskin.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''MySkin'' */",
-'chick.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Chick'' */",
-'simple.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Simple'' */",
 'modern.js' => "/* Kull ''JavaScript'' hawnhekk jiġi mniżżel għal dawk l-utenti li qegħdin jagħmlu użu mill-iskin ''Modern''*/",
 
 # Metadata
@@ -2974,13 +2954,8 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 'pageinfo-protect-cascading-from' => 'Protezzjoni li tintiret minn',
 
 # Skin names
-'skinname-standard' => 'Classic',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3085,7 +3060,7 @@ Oħrajn jiġu moħbija kif inhu definit oriġinarjament.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => "Wisa'",
 'exif-imagelength' => 'Għoli',
 'exif-bitspersample' => 'Bits għal kull komponent',
@@ -3263,7 +3238,7 @@ Oħrajn jiġu moħbija kif inhu definit oriġinarjament.
 'exif-originalimageheight' => 'Għoli tal-istampa qabel ma ġiet maqtugħa',
 'exif-originalimagewidth' => "Wisa' tal-istampa qabel ma ġiet maqtugħa",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'L-Ebda',
 
 'exif-copyrighted-true' => 'Protetta bil-copyright',
@@ -3684,13 +3659,6 @@ Flimkien ma' dan il-programm suppost kellek tirċievi [{{SERVER}}{{SCRIPTPATH}}/
 'version-entrypoints-header-entrypoint' => "Punt ta' dħul",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Post tal-fajl',
-'filepath-page' => 'Fajl:',
-'filepath-submit' => 'Mur',
-'filepath-summary' => "Din il-paġna speċjali tagħti lura l-indirizz komplet tal-posta għal fajl.
-Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-program assoċjat magħhom direttament.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Fittex fajls duplikati',
 'fileduplicatesearch-summary' => "Fittex fajls duplikati fil-bażi għal valur ''hash''.",
index 26ed430..65a4423 100644 (file)
@@ -107,8 +107,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Rebelar l miu andereço de correio eiletrónico nas noteficaçones',
 'tog-shownumberswatching' => "Amostrar l númaro d'outelizadores a begiar",
 'tog-fancysig' => 'Tratar assinatura cumo wikitesto (sin lhigaçon outomática)',
-'tog-externaleditor' => 'Por oumisson, outelizar un eiditor sterno (solo para outelizadores abançados, eisige cunfiguraçones adecionales ne l tou cumputador)',
-'tog-externaldiff' => 'Por oumisson, outelizar defrenças sternas (solo para outelizadores abançados, eisige cunfiguraçones adicionales ne l tou cumputador)',
 'tog-showjumplinks' => 'Posseblitar lhigaçones d\'acessibelidade "{{ant:jumpto}}"',
 'tog-uselivepreview' => "Ousar l'antebison an tiempo rial (JavaScrit) (Spurmental)",
 'tog-forceeditsummary' => 'Abisar-me al antroduzir un sumairo bazio',
@@ -852,7 +850,7 @@ Páiginas que steian ne ls [[Special:Watchlist|tous begiados]] son amostradas an
 'listgrouprights-rights' => 'Dreitos',
 'listgrouprights-members' => '(lista de nembros)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Ambiar carta eiletrónica a este outelizador',
 'emailfrom' => 'De:',
 'emailto' => 'Para:',
@@ -1087,13 +1085,8 @@ Por fabor, scuolhe outro nome.',
 Premite ajuntar la rezon de la eidiçon ne l sumário.',
 
 # Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Suidade',
 'skinname-cologneblue' => 'Azul',
 'skinname-monobook' => 'Lhibro',
-'skinname-myskin' => 'Piel',
-'skinname-chick' => 'Cipe-Çape',
-'skinname-simple' => 'Simpre',
 'skinname-modern' => 'Moderno',
 
 # Browsing diffs
@@ -1138,7 +1131,7 @@ Causo l fexeiro tenga sido demudado a partir de l sou stado oureginal, alguns de
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ancho',
 'exif-imagelength' => 'Altura',
 'exif-imagedescription' => 'Títalo de la eimaige',
@@ -1213,11 +1206,6 @@ Causo l fexeiro tenga sido demudado a partir de l sou stado oureginal, alguns de
 'version-software-product' => 'Perduto',
 'version-software-version' => 'Berson',
 
-# Special:FilePath
-'filepath' => 'Camino de l fexeiro',
-'filepath-page' => 'Fexeiro',
-'filepath-submit' => 'Camino',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Nome de l fexeiro',
 'fileduplicatesearch-submit' => 'Percurar',
index e6f79b9..835bb30 100644 (file)
@@ -710,13 +710,6 @@ Try prefixing your query with ''all:'' to search all content (including talk pag
 'powersearch-togglenone' => 'အမည်ညွှန်းမရှိ',
 'search-external' => 'အပြင်တွင် ရှာရန်',
 
-# Quickbar
-'qbsettings-none' => 'အမည်ညွှန်းမရှိ',
-'qbsettings-fixedleft' => 'ဘယ်ဘက်ကို အသေထားရန်',
-'qbsettings-fixedright' => 'ညာဘက်ကို အသေထားရန်',
-'qbsettings-floatingleft' => 'ဘယ်ဘက်ကို အရှင်ထားရန်',
-'qbsettings-floatingright' => 'ညာဘက်ကို အရှင်ထားရန်',
-
 # Preferences page
 'preferences' => '​ရွေး​ချယ်​စ​ရာ​များ​',
 'mypreferences' => '​ရွေး​ချယ်​စ​ရာ​များ​',
@@ -818,7 +811,7 @@ Your e-mail address is not revealed when other users contact you.
 'prefs-displaywatchlist' => 'ပြသရန် ရွေးချယ်မှု',
 'prefs-diffs' => 'ကွဲပြားချက်',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'အီးမေးလိပ်စာ တရားဝင်ပုံပေါ်သည်',
 'email-address-validity-invalid' => 'တရားဝင်အီးမေးလိပ်စာတစ်ခု ထည့်ပါ',
 
@@ -1043,7 +1036,6 @@ Your e-mail address is not revealed when other users contact you.
 
 # HTTP errors
 'http-invalid-url' => 'တရားမဝင်သော URL လင့် - $1',
-'http-host-unreachable' => 'URL လင့်သို့ သွားမရပါ။',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL လင့်သို့ သွားမရပါ',
@@ -1273,7 +1265,7 @@ Your e-mail address is not revealed when other users contact you.
 'listgrouprights-addgroup-self-all' => 'အုပ်စုအားလုံးကို မိမိ၏အကောင့်သို့ ပေါင်းထည့်ရန်',
 'listgrouprights-removegroup-self-all' => 'မိမိ၏အကောင့်မှ အုပ်စုအားလုံးကို ဖယ်ရှားရန်',
 
-# E-mail user
+# Email user
 'mailnologin' => 'ပို့ရန်လိပ်စာ မရှိပါ',
 'emailuser' => 'ဤ​အ​သုံး​ပြု​သူ​အား​အီး​မေး​ပို့​ပါ​',
 'emailpage' => 'အီးမေးအသုံးပြုသူ',
@@ -1707,7 +1699,7 @@ Your e-mail address is not revealed when other users contact you.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'အကျယ်',
 'exif-imagelength' => 'အမြင့်',
 'exif-bitspersample' => 'အစိတ်အပိုင်းတစ်ခုတွင်ပါဝင်သော အပိုင်းငယ်များ',
@@ -1785,7 +1777,7 @@ Your e-mail address is not revealed when other users contact you.
 'monthsall' => 'အားလုံး',
 'limitall' => 'အားလုံး',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'အီးမေးကိုအတည်ပြုပါ',
 'confirmemail_send' => 'အတည်ပြုချက်ကုတ်ကို အီးမေးပို့ပေးရန်',
 
@@ -1837,11 +1829,6 @@ Your e-mail address is not revealed when other users contact you.
 'version-software-product' => 'ထုတ်ကုန်',
 'version-software-version' => 'ဗားရှင်း',
 
-# Special:FilePath
-'filepath' => 'ဖိုင်လမ်းကြောင်း',
-'filepath-page' => 'ဖိုင်:',
-'filepath-submit' => 'သွား',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'နှစ်ခုထပ်နေသောဖိုင်များကို ရှာရန်',
 'fileduplicatesearch-legend' => 'နှစ်ခုထပ်နေသည်ကို ရှာရန်',
index 05f5854..0d86814 100644 (file)
@@ -216,8 +216,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Невтемс зяро теицятнеде, конат аравтызь лопанть эсест ванома лемрисьментень',
 'tog-oldsig' => 'Уликс кедьпутовксось:',
 'tog-fancysig' => 'Лемпутовксось прок викитекст (сонсь теевиця сюлмавома певтеме)',
-'tog-externaleditor' => 'Нолдамс тевс ушоёнонь витнемканть, зярс лиякс апак аравто (ансяк тевень содыйтненень, арсий машинасот эрявить башка ёнкст-аравтомат [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-externaldiff' => 'Нолдамс тевс ушоёнонь diff, зярс лиякс апак аравто (ансяк тевень содыйтненень, арсий машинасот эрявить башка ёнкст-аравтомат [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
 'tog-showjumplinks' => 'Меремс "тёкадемс" маласпонгомань сюлмавомапетнес',
 'tog-uselivepreview' => 'Максомс эряй васнянь невтевкс (JavaScript) (Варчамонь)',
 'tog-forceeditsummary' => 'Невтик монень, мезе сёрмадомс витнемадо-петнемадо ёвтамонь вальминентень',
@@ -460,6 +458,8 @@ $messages = array(
 'page-rss-feed' => '«$1» RSS максовкс',
 'page-atom-feed' => '«$1» Atom максовкс',
 'red-link-title' => '$1 (истямо лопа арась)',
+'sort-descending' => 'Аравтомс лувс Я-А',
+'sort-ascending' => 'Аравтомс лувс А-Я',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Лопа',
@@ -546,7 +546,7 @@ $messages = array(
 'gotaccount' => "Совамотаркат ули? '''$1'''.",
 'gotaccountlink' => 'Совамс',
 'userlogin-resetlink' => 'Совамо эрявикстнэнь стувтыть?',
-'createaccountmail' => 'е-Ñ\81Ñ\91Ñ\80маÑ\81о',
+'createaccountmail' => 'ТейÑ\82Ñ\8c ÐºÐ¾Ð´Ð°Ð¼Ð¾ Ð¿Ð¾Ð½Ð³Ñ\81Ñ\8c Ñ\81алаванÑ\8c Ð²Ð°Ð», ÐºÑ\83Ñ\87ик Ñ\81онзÑ\8d Ð°Ð»Ð¾ Ð¼Ð°ÐºÑ\81озÑ\8c Ðµ-Ñ\81Ñ\91Ñ\80мапаÑ\80гонÑ\82енÑ\8c',
 'createaccountreason' => 'Тувталось:',
 'badretype' => 'Сёрмадыть салава валот кавксть: сынь аволь вейкеть.',
 'userexists' => 'Те лемесь уш саезь.
@@ -593,7 +593,7 @@ $messages = array(
 'accountcreatedtext' => '$1-нь совицянь таркась теевсь-шкавсь.',
 'loginlanguagelabel' => 'Кель: $1',
 
-# E-mail sending
+# Email sending
 'user-mail-no-addy' => 'Терявтыть кучомс е-сёрма е-сёрмапарговтомо.',
 
 # Change password dialog
@@ -698,6 +698,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 Мусак [[Special:Search/{{PAGENAME}}|вешнемс  файлань те коняксонть]] лия сёрмадовкстнэстэ эли
 <span class="plainlinks">
 [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} вешнемс малавикс журналтнэстэ]</span>. Ялатеке тонеть а мерить шкамс те лопанть.',
+'userpage-userdoesnotexist-view' => 'Совамотарка  "$1" апак сёрмадсто.',
 'updated' => '(Одолгавтозь)',
 'note' => "'''Явт мель:'''",
 'previewnote' => "'''Кирдтяя мельсэ, те ансяк васнянь невтевкс.'''
@@ -774,6 +775,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'history-feed-title' => 'Лиякстомтомань тевде',
 'history-feed-description' => 'Викинь тевате лопанть лиякстомтомань тевдензэ',
 'history-feed-item-nocomment' => '$1 $2-зэ',
+'history-feed-empty' => 'Лопа, кона вешнить, арась. Кизды нардавсь wikiстэ эли одов лемдявсь. Варчак [[Special:Search|wiki-ва вешнема]] эрявикс од лопанть муемга.',
 
 # Revision deletion
 'rev-deleted-comment' => '(витнемадо-петнемадо арсемась-мелесь нардазь)',
@@ -881,40 +883,34 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'search-nonefound' => 'Те вешнема лангс мезеяк эзь муеве.',
 'powersearch' => 'Седеяк вешнемс',
 'powersearch-legend' => 'Седе келейстэ вешнема',
-'powersearch-ns' => 'Вешнемс не лем потмотнестэ:',
-'powersearch-redir' => 'Лия таркав йутавтоматнень сёрмалема',
+'powersearch-ns' => 'Вешнемс не лемпотмотнестэ:',
+'powersearch-redir' => 'Лия таркав ютавтоматнень сёрмалема',
 'powersearch-field' => 'Вешнемс',
 'powersearch-toggleall' => 'Весе',
 'powersearch-togglenone' => 'Арась мезе невтемс',
 'search-external' => 'Ушо йондонь вешнема',
 
-# Quickbar
-'qbsettings' => 'Навигациянь лазнэ',
-'qbsettings-none' => 'Арась мезе невтемс',
-'qbsettings-fixedleft' => 'Керш ёндо кирдезь',
-'qbsettings-fixedright' => 'Вить ёндо кирдезь',
-'qbsettings-floatingleft' => 'Керш ёнга уи',
-'qbsettings-floatingright' => 'Вить ёнга уи',
-
 # Preferences page
-'preferences' => 'Ð\9bиÑ\8f Ñ\8eÑ\82кÑ\81Ñ\82о Ñ\8fвома',
+'preferences' => 'Ð\90Ñ\80авÑ\82омаÑ\82',
 'mypreferences' => 'Аравтомат',
 'prefs-edits' => 'Зяроксть витнезь-петнезь:',
 'prefsnologin' => 'Эзить сова',
+'prefsnologintext' => 'Эряви <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} совамс]</span> аравтоматнень ладсемга.',
 'changepassword' => 'Салавань валонь полавтома',
 'prefs-skin' => 'Неемань ладсема',
 'skin-preview' => 'Васнянь неевтезэ',
 'datedefault' => 'Икелькс вешема арась',
 'prefs-beta' => 'Бета ёнкст-мезть',
-'prefs-datetime' => 'Чи ды шка',
+'prefs-datetime' => 'Чить-шкат',
+'prefs-labs' => 'Варчамонь ёнкст-тевть',
 'prefs-user-pages' => 'Теицянть лопанзо',
 'prefs-personal' => 'Теицядо',
-'prefs-rc' => 'Чиень полавтнемат',
+'prefs-rc' => 'Чиень полавтнемат-лиякстомтомат',
 'prefs-watchlist' => 'Ванома лемрисьме',
 'prefs-watchlist-days-max' => 'Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}',
 'prefs-watchlist-edits-max' => 'Весемеде покш цётось: 1000',
 'prefs-misc' => 'Минеть-сюнот',
-'prefs-resetpass' => 'Салава валонь полавтома',
+'prefs-resetpass' => 'Салавань валонь полавтома',
 'prefs-changeemail' => 'Полавтомс е-сёрмапаргот',
 'prefs-setemail' => 'Путомс е-сёрмапарго',
 'prefs-email' => 'Е-сёрмат-мезть',
@@ -924,13 +920,18 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'restoreprefs' => 'Велявтомс мекев весе ушодкс ладсематнень',
 'prefs-editing' => 'Витнема-петнема',
 'prefs-edit-boxsize' => 'Витнема-петнема вальманть сэрензэ-келензэ.',
-'rows' => 'Вал чилькстнэ (строкатне):',
+'rows' => 'Валчилькстнэ (строкатне):',
 'columns' => 'Палманть:',
-'searchresultshead' => 'Вешнэма',
+'searchresultshead' => 'Вешнема',
 'resultsperpage' => 'Зяроксть вастневи ве лопасо:',
-'recentchangesdays-max' => '(максимумось $1 {{PLURAL:$1|чи|чить}})',
+'recentchangesdays' => 'Зяро чить невтемс чиень полавтнематнесэ-лиякстомтоматнесэ:',
+'recentchangesdays-max' => 'Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}',
+'recentchangescount' => 'Васень аравтоматнень коряс зяро витнемат-петнемат невтемс:',
+'prefs-help-recentchangescount' => 'Тезэнь совавтозь чиень полавтнемат-лиякстомтомат, лопань лувт-путовкст, журналт.',
 'timezonelegend' => 'Шкань зонась:',
 'localtime' => 'Теицянь шкась:',
+'timezoneuseserverdefault' => 'Нолдамс тевс викинь ($1) аравтнематнень',
+'timezoneoffset' => 'Офсет¹:',
 'servertime' => 'Серверэнь шкась:',
 'guesstimezone' => 'Пештемс интернет икельксстэть',
 'timezoneregion-africa' => 'Африка',
@@ -969,7 +970,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'prefs-dateformat' => 'Ков чинь форматозо',
 'prefs-diffs' => 'Мейсэ явовить верзиятне',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'Е-сёрмапаргот маряви маштови',
 
 # User rights
@@ -1416,7 +1417,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'listgrouprights-addgroup-all' => 'Поладомс весе куротнень',
 'listgrouprights-removegroup-all' => 'Весе куротнень нардамс',
 
-# E-mail user
+# Email user
 'mailnologin' => 'Кучомс сёрма парго арась',
 'emailuser' => 'Кучомс е-сёрма те теицянтень',
 'emailpage' => 'Кучт э-сёрма теицянтень',
@@ -1845,10 +1846,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'pageinfo-authors' => 'Весемезэ зяро авторонзо',
 
 # Skin names
-'skinname-standard' => 'Классикань',
-'skinname-nostalgia' => 'ОдПингеньМазы',
-'skinname-myskin' => 'ЭсьМелемКоряс',
-'skinname-simple' => 'Шожда',
 'skinname-modern' => 'НееньШкань',
 
 # Patrolling
@@ -1917,7 +1914,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Келе',
 'exif-imagelength' => 'Сэрь',
 'exif-bitspersample' => 'Эрьва компонентс зяро битт',
@@ -1969,7 +1966,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'exif-languagecode' => 'Кель',
 'exif-iimcategory' => 'Явовкс',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Апак сювордо',
 
 'exif-unknowndate' => 'Апак содань чи',
@@ -2105,7 +2102,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'monthsall' => 'весе',
 'limitall' => 'весе',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Кемекстамс е-почтань сёрмапаргот',
 'confirmemail_send' => 'Кучомс е-сёрмасо кемекстамонь код',
 'confirmemail_loggedin' => 'Е-сёрма паргот апак кемекста.',
@@ -2177,11 +2174,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'version-software-product' => 'Шкавкс-нолдавкс',
 'version-software-version' => 'Верзия',
 
-# Special:FilePath
-'filepath' => 'Файлас яннэ',
-'filepath-page' => 'Файлась:',
-'filepath-submit' => 'Ютак',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Вешнэмс кавтаське файлат',
 'fileduplicatesearch-legend' => 'Вешнэмс кавтаське',
index 146a7ee..ab1210e 100644 (file)
@@ -156,8 +156,6 @@ $messages = array(
 'tog-shownumberswatching' => 'دمبالکرونِ سِراق هدائن',
 'tog-oldsig' => 'پیش نیمایش ایمضای موجود:',
 'tog-fancysig' => 'ایمضا ره ویکی متن نظر بیرین (بدون لینک هایتن)',
-'tog-externaleditor' => 'به شیکل پیش فرض خارجی ویرایشگرون جه ایستیفاده بواشه',
-'tog-externaldiff' => 'ایستیفاده از تفاوت‌گیر جه (diff) خارجی به‌طور پیش‌فرض.',
 'tog-showjumplinks' => 'فعال هکردن بپرسنی پیوندون مندرجات فهرست دله',
 'tog-uselivepreview' => 'ایستیفاده از پیش نیمایش زنده (جاوا اسکریپ) (جدیده)',
 'tog-forceeditsummary' => 'زمونی که خولاصه دچی‌ین ره ننویشتمه مه ره بائو',
@@ -1032,12 +1030,12 @@ $2، $1',
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1, $2×$3',
 
-# EXIF tags
+# Exif tags
 'exif-gpsareainformation' => 'جی پی اس ناحیه نوم',
 'exif-gpsdatestamp' => 'جی پی اس روز',
 'exif-gpsdifferential' => 'جی پی اس په‌چه‌ک درس هأکه‌ردن',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'فه‌شورده نئی',
 
 'exif-unknowndate' => 'نه‌شناسی روز',
index e464a70..5d8c441 100644 (file)
@@ -394,7 +394,7 @@ Hueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.',
 'createaccount' => 'Ticchīhuāz cē cuentah',
 'gotaccount' => "¿Ye ticpiya cē cuentah? '''$1'''.",
 'gotaccountlink' => 'Ximocalaqui',
-'createaccountmail' => 'e-mailcopa',
+'createaccountmail' => 'Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō moēhualtīz in maltzinteyōtl netitlanizyeyāntli',
 'createaccountreason' => 'Tlèka:',
 'badretype' => 'Ahneneuhqui motlahtōlichtacāyo.',
 'userexists' => 'In tlatequitiltilīltōcāitl in ōquipehpen ye ia.
@@ -628,9 +628,6 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'powersearch-togglenone' => 'Ahtlein',
 'search-external' => 'Tlatēmotiliztli calāmpa',
 
-# Quickbar
-'qbsettings-none' => 'Ahtlein',
-
 # Preferences page
 'preferences' => 'Tlaēlēhuiliztli',
 'mypreferences' => 'Notlaēlēhuiliz',
@@ -671,9 +668,9 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'default' => 'ic default',
 'prefs-files' => 'Tlahcuilōlli',
 'youremail' => 'Maltzinteyōtl netitlanizyeyāntli:',
-'username' => 'Tlatequitiltilīltōcāitl:',
-'uid' => 'Tlatequitiltilīlli ID:',
-'prefs-memberingroups' => 'Tlācatl {{PLURAL:$1|olōlco|olōlco}}:',
+'username' => '{{GENDER:$1|Tlatequitiltilīltōcāitl}}:',
+'uid' => '{{GENDER:$1|Tlatequitiltilīlli}} ID:',
+'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:',
 'yournick' => 'Motōcātlaliz:',
@@ -1004,7 +1001,7 @@ Nò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
 'listgrouprights-group' => 'Olōlli',
 'listgrouprights-rights' => 'Huelītiliztli',
 
-# E-mail user
+# Email user
 'emailuser' => 'Tiquēhualtlīz maltzinteyōtl netitlaniztli inīn tlatequitiltilīlli',
 'defemailsubject' => '{{SITENAME}} correo tlatequitiltilīlhuīc $1',
 'emailfrom' => 'Īhuīcpa:',
@@ -1030,32 +1027,31 @@ Nò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
 
 'enotif_impersonal_salutation' => 'tlatequitiltilīlli īpan {{SITENAME}}',
 'enotif_anon_editor' => 'ahtōcātlatequitiltilīlli $1',
-'enotif_body' => 'Māhuizzoh $WATCHINGUSERNAME,
+'enotif_body' => 'Māhuiztic $WATCHINGUSERNAME,
 
-In {{SITENAME}} āmatl "$PAGETITLE" $CHANGEDORCREATED in tlatequitiltilīlli $PAGEEDITOR īpan $PAGEEDITDATE.
-In āxcān tlachiyaliztli onca īpan $PAGETITLE_URL
+$PAGEINTRO $NEWPAGE
 
-$NEWPAGE
+Tlapatlani ītlahtōlpehuallo:  $PAGESUMMARY $PAGEMINOREDIT
 
-In tlapatlaliztli īxtlamatiliztli cah: $PAGESUMMARY $PAGEMINOREDIT
 Xicnotzāz in tlapatlani:
-Correo electrónico: {{canonicalurl:Special:Emailuser|target=$PAGEEDITOR}}
-Huiqui: {{canonicalurl:User:$PAGEEDITOR}}
+īnetitlanizyeyān:$PAGEEDITOR_EMAIL
+īhuiqui:$PAGEEDITOR_WIKI
+
+Ahmo occēppa mitztlamachiztīz intlā yancuīc tlapatlaliztli, zā mā tiquittaz inīn āmatl. Tihueliti ticcencahulīz in tēmachiztīlizpāmitl in mochintin motlachixāmatl in motlachiyaliz.
 
-Ahmo onyez occē tēmachitīliztli ītech occē tlapatlaliztli, zan mā tiquihitta inīn āmoxtli yancuīcān.
-Nō tihuelīti quitlahtlālīz, in tēmachitīliztli in mochi tlachixqui mozāzanilhuīc in motlachiyaliz āmatl.
+In {{SITENAME}} icnīuhtīliztica motēmachiztīliztlacentetilīz.
 
-       In {{SITENAME}} tēmachitīliztli sistema.
+Intlā ticnequi ticpatlaz in maltzinteyōtl monetitlanizyeyān, xiquihitta:
+{{canonicalurl:{{#special:Preferences}}}}
 
---
-Ic ticpatlaz in tlachiyaliztli motlapōhualāma, xiquihitta:
+
+Intlā ticnequi ticpatlaz in motlachiyaliz tlaēlēhuiliztli, xiquihitta:
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Ic ticpolōz in āmatl in tlachiyaliztli motlapōhualāma, xiquihitta:
+Intlā ticnequi ticpolōz in āmatl ītech motlachiyaliz, xiquihitta:
 $UNWATCHURL
 
-Tētlamachītīliztli īhuān oc yeh tēpalehuiliztli:
+Motlahtōlcaquiliztīlōni īhuān ocachi tēpalēhuiliztli, xiquihitta:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'created' => 'ōmochīuh',
 'changed' => 'ōmotlacuep',
@@ -1089,9 +1085,9 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'protectexpiry' => 'Tlamiliztli:',
 'protect_expiry_invalid' => 'Ahcualli tlamiliztli cāhuitl.',
 'protect-default' => 'Ticmācāhuaz mochintin in tlatequitiltilīltin',
-'protect-fallback' => 'Tiquihuīquilia tlahuelītiliztli "$1"',
-'protect-level-autoconfirmed' => 'Tiquinquīxtīz yancuīc tlatequitiltilīltin īhuan in ahmo ōmocalacqueh',
-'protect-level-sysop' => 'Zan tētlamahmacanih',
+'protect-fallback' => 'Zan momācāhuazqueh tlatequitiltilīltin in tēmācāhualiztica «$1»',
+'protect-level-autoconfirmed' => 'Zan momācāhuaz moneltilīlli tlatequitiltilīltin',
+'protect-level-sysop' => 'Zan momācāhuaz tētlamahmacanimeh',
 'protect-expiring' => 'motlamīz $1 (UTC)',
 'protect-expiry-options' => '1 hora:1 hour,1 tōnalli:1 day,1 chicuēyilhuitl:1 week,2 chicuēyilhuitl:2 weeks,1 mētztli:1 month,3 mētztli:3 months,6 mētztli:6 months,1 xihuitl:1 year,mochipa:infinite',
 'restriction-type' => 'Mācāhualiztli:',
@@ -1121,7 +1117,7 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'blanknamespace' => '(Tāchcāuh)',
 
 # Contributions
-'contributions' => 'Ītlahcuilōl',
+'contributions' => 'In {{GENDER:$1|tlatequitiltilīlli}} ītlahcuilōl',
 'contributions-title' => 'Tlatequitiltilīlli $1 ītlahcuilōl',
 'mycontris' => 'Notlahcuilōl',
 'contribsub2' => '$1 ($2)',
@@ -1345,7 +1341,7 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'metadata-expand' => 'Tiquittāz tlanōnōtzaliztli huehca ōmpa',
 'metadata-collapse' => 'Tictlātīz tlanōnōtzaliztli huehca ōmpa',
 
-# EXIF tags
+# Exif tags
 'exif-photometricinterpretation' => 'Pixel tlachīhualiztli',
 'exif-imagedescription' => 'Īxiptli ītōcā',
 'exif-software' => 'Software ōmotēquitilti',
@@ -1410,7 +1406,7 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'monthsall' => '(mochīntīn)',
 'limitall' => 'mochi',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Ticchicāhuāz e-mail',
 'confirmemail_needlogin' => 'Tihuīquilia $1 ic ticchicāhua mo e-mail.',
 'confirmemail_success' => 'Mocorreo ōmotlahtōlneltilih
@@ -1475,10 +1471,6 @@ Niman tihuelīti [[Special:UserLogin|timocalaqui]] auh ticpactiāz huiquitica.',
 'version-version' => '(Machiyōtzin $1)',
 'version-software-version' => 'Machiyōtzin',
 
-# Special:FilePath
-'filepath-page' => 'Tlahcuilōlli:',
-'filepath-submit' => 'Yāuh',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Tlahcuilōlli ītōcā:',
 'fileduplicatesearch-submit' => 'Tlatēmōz',
index bd01e65..cc74533 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Hiong3-eng5
  * @author Ianbu
  * @author Kaihsu
  */
@@ -53,8 +54,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Hián-sī tng leh khoàⁿ ê iōng-chiá sò͘-bo̍k',
 'tog-oldsig' => 'Chit-má ê chhiam-miâ:',
 'tog-fancysig' => 'Chhiam-miâ mài chò liân-kiat',
-'tog-externaleditor' => 'Iōng gōa-pō· pian-chi̍p-khì',
-'tog-externaldiff' => 'Iōng gōa-pō· diff',
 'tog-showjumplinks' => 'Hō͘ "thiàu khì" chit ê liân-chiap ē-sái',
 'tog-uselivepreview' => 'Ēng sui khoàⁿ-māi (ài ū JavaScript) (chhì-giām--ê)',
 'tog-forceeditsummary' => 'Pian-chi̍p khài-iàu bô thiⁿ ê sî-chūn, kā goá thê-chhéⁿ',
@@ -396,7 +395,9 @@ $2',
 Lí ē-sái mài kì-miâ kè-siok sú-iōng {{SITENAME}}, mā ē-sái iōng kāng-ê a̍h-sī pa̍t-ê sin-hūn têng teng-ji̍p.
 Chhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iû-goân teng-ji̍p tiong; che chi-iàu piàⁿ tiāu lí ê browser ê cache chiū ē chèng-siông.",
 'yourname' => 'Lí ê iōng-chiá miâ-chheng:',
+'userlogin-yourname' => 'Iōng-chiá miâ-chheng',
 'yourpassword' => 'Lí ê bi̍t-bé:',
+'userlogin-yourpassword' => 'Bi̍t-bé',
 'yourpasswordagain' => 'Têng phah bi̍t-bé:',
 'remembermypassword' => 'Kì tiâu góa ê bi̍t-bé (āu-chhiú teng-ji̍p iōng) (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'login' => 'Teng-ji̍p',
@@ -603,9 +604,6 @@ Lí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê k
 'powersearch' => 'Kiám-sek',
 'powersearch-legend' => 'Kiám-sek',
 
-# Quickbar
-'qbsettings' => 'Quickbar ê siat-tēng',
-
 # Preferences page
 'preferences' => 'Siat-tēng',
 'mypreferences' => 'Góa ê siat-tēng',
@@ -1176,9 +1174,6 @@ Chit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.',
 # Special:Version
 'version' => 'Pán-pún',
 
-# Special:FilePath
-'filepath' => 'Tóng-àn ê soàⁿ-lō·',
-
 # Special:SpecialPages
 'specialpages' => 'Te̍k-sû-ia̍h',
 
index 12c44e4..3e04583 100644 (file)
@@ -8,8 +8,10 @@
  * @file
  *
  * @author Carmine Colacino
+ * @author Chelin
  * @author Cryptex
  * @author E. abu Filumena
+ * @author PiRSquared17
  * @author SabineCretella
  * @author לערי ריינהארט
  */
@@ -57,15 +59,16 @@ $messages = array(
 'tog-underline' => "Sottolinia 'e jonte:",
 'tog-justify' => "Alliniamento d''e paracrafe mpare",
 'tog-hideminor' => "Annascunne 'e cagne piccirille  'int'a ll'úrdeme cagne",
-'tog-extendwatchlist' => "Spanne ll'asservate speciale pe fà vedé tutte 'e cagne possíbbele",
-'tog-usenewrc' => 'Urdeme cagne avanzate (JavaScript)',
+'tog-hidepatrolled' => "Annascunne 'e cagne 'verificate' 'int'a ll'úrdeme cagne",
+'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",
 'tog-showtoolbar' => "Aspone 'a barra d''e stromiente 'e cagno (JavaScript)",
 'tog-editondblclick' => "Cagna 'e pàggene cliccanno ddoje vote (JavaScript)",
 'tog-editsection' => "Permette 'e cagnà 'e sezzione cu a jonta [cagna]",
 'tog-editsectiononrightclick' => "Permette 'e cangne 'e sezzione cliccanno p''o tasto destro ncopp 'e titule 'e sezzione (JavaScript)",
 'tog-showtoc' => "Mosta ll'innece pe 'e paggene cu cchiù 'e 3 sezzione",
-'tog-rememberpassword' => "Ricurda 'a registrazzione pe' cchiu sessione (for a maximum of $1 {{PLURAL:$1|day|days}})",
+'tog-rememberpassword' => "Ricurda 'a registrazzione pe' cchiu sessione (ppe 'numassimo 'e $1 {{PLURAL:$1|juorno|juorne}})",
 
 'underline-always' => 'Sèmpe',
 'underline-never' => 'Màje',
@@ -123,54 +126,86 @@ $messages = array(
 'dec' => 'dic',
 
 # Categories related messages
+'pagecategories' => '{{PLURAL:$1|Categurìa|Categurìe}}',
 'category_header' => 'Paggene rìnt\'a categurìa "$1"',
 'subcategories' => 'Categurìe secunnarie',
+'category-media-header' => 'File \'int\'â categuría "$1"',
+'hidden-categories' => '{{PLURAL:$1|Categurìa annascusa|Categuríe annascuse}}',
+'category-subcat-count' => "{{PLURAL:$2|Chesta categurìa cuntene n'unneca sottocategurìa, nzignata 'e seguito.|Chesta categurìa cuntene {{PLURAL:$1|'a sottocategurìa nzignata|'e $1 sottocategurìe nzignate}} 'e seguito, 'a nu totale 'e $2.}}",
+'category-article-count' => "{{PLURAL:$2|Chesta categurìa cuntiene un'unneca paggena, nzignata ccà sotto.|Chesta categurìa cuntiene {{PLURAL:$1|'a paggena nzignata|'e $1 paggene nzignate}} ccà sotto, faccenno nu totale 'e $2.}}",
+'listingcontinuesabbrev' => 'cont.',
 
 'about' => 'Nfromma',
 'article' => 'Articulo',
 'newwindow' => "(s'arape n'ata fenèsta)",
 'cancel' => 'Scancèlla',
-'mypage' => "'A paggena mia",
-'mytalk' => "'E mmie chiacchieriàte",
+'moredotdotdot' => 'Cchiù...',
+'mypage' => 'Paggena',
+'mytalk' => "'E mmie chiàcchieriate",
 'anontalk' => 'Chiacchierate pe chisto IP',
+'navigation' => 'Navigazzione',
 
 # Cologne Blue skin
 'qbfind' => 'Truòva',
 'qbedit' => 'Càgna',
 'qbpageoptions' => 'Chesta paggena',
-'qbpageinfo' => "Nfrummazzione ncopp'â paggena",
 'qbmyoptions' => "'E ppaggene mie",
 'qbspecialpages' => 'Pàggene speciàle',
+'faq' => 'FAQ',
+
+# Vector skin
+'vector-action-delete' => 'Scancèlla',
+'vector-action-move' => 'Spusta',
+'vector-action-protect' => 'Prutegge',
+'vector-view-create' => 'Cria',
+'vector-view-edit' => 'Càgna',
+'vector-view-history' => 'Vere cronologgia',
+'vector-view-view' => 'Legge',
+'vector-view-viewsource' => 'Vere sorgente',
+'actions' => 'Azione',
+'namespaces' => 'Namespace',
+'variants' => 'Variante',
 
 'errorpagetitle' => 'Sbaglio',
 'returnto' => 'Torna a $1.',
+'tagline' => 'Dda {{SITENAME}}.',
 'help' => 'Ajùto',
 'search' => 'Truova',
 'searchbutton' => 'Truova',
 'go' => 'Vàje',
+'searcharticle' => 'Vàje',
 'history' => "Verziune 'e primma",
 'history_short' => 'Cronologgia',
 'printableversion' => "Verzione pe' stampa",
 'permalink' => 'Jonta permanente',
 'edit' => 'Càgna',
+'create' => 'Cria',
 'editthispage' => 'Càgna chesta paggena',
+'create-this-page' => 'Cria sta paggena',
 'delete' => 'Scancèlla',
 'deletethispage' => 'Scancèlla chésta paggena',
 'protect' => 'Ferma',
+'protect_change' => 'càgna',
 'protectthispage' => 'Ferma chesta paggena',
-'unprotect' => 'Sferma',
-'unprotectthispage' => 'Sferma chesta paggena',
+'unprotect' => 'Càgna prutezzione',
+'unprotectthispage' => "Càgna prutezzione 'e chesta paggena",
 'newpage' => 'Paggena nòva',
 'talkpage' => "Paggena 'e chiàcchiera",
 'talkpagelinktext' => 'Chiàcchiera',
 'specialpage' => 'Paggena speciàle',
+'personaltools' => 'Strumiente perzonale',
+'postcomment' => 'Nova sezzione',
+'articlepage' => 'Vere a paggena e contenuto',
 'talk' => 'Chiàcchiera',
+'views' => 'Visite',
 'toolbox' => 'Strumiente',
-'imagepage' => 'Paggena fiùra',
+'userpage' => 'Vere a paggena utente',
+'imagepage' => 'Vere a paggena ddo file',
 'otherlanguages' => 'Ate léngue',
 'redirectedfrom' => "(Redirect 'a $1)",
 'lastmodifiedat' => "Urdema cagnamiénto pe' a paggena: $2, $1.",
 'viewcount' => 'Chesta paggena è stata lètta {{PLURAL:$1|una vòta|$1 vòte}}.',
+'protectedpage' => 'Paggena prutetta',
 'jumpto' => 'Vaje a:',
 'jumptonavigation' => 'navigazione',
 'jumptosearch' => 'truova',
@@ -178,33 +213,48 @@ $messages = array(
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => "'Nfrummazione ncòpp'a {{SITENAME}}",
 'aboutpage' => "Project:'Nfrummazione",
+'copyrightpage' => '{{ns:project}}:Copyrights',
+'currentevents' => 'Novità',
+'currentevents-url' => 'Project:Novità',
 'disclaimers' => 'Avvertimiènte',
 'disclaimerpage' => 'Project:Avvertimiènte generale',
 'edithelp' => 'Guida',
+'edithelppage' => 'Help:Càgna',
 'helppage' => 'Help:Ajùto',
 'mainpage' => 'Paggena prencepale',
 'mainpage-description' => 'Paggena prencepale',
 'portal' => "Porta d''a cummunetà",
 'portal-url' => "Project:Porta d''a cummunetà",
+'privacy' => "'Nformazzione ppe a privacy",
+'privacypage' => "Project:'Nfrummazione ncopp'â privacy",
 
 'badaccess' => "Nun haje 'e premmesse abbastante.",
 
+'retrievedfrom' => 'Estratto \'e "$1"',
+'youhavenewmessages' => 'Haje $1 ($2).',
 'newmessageslink' => "nuove 'mmasciàte",
 'newmessagesdifflink' => "differenze cu 'a revisione precedente",
 'youhavenewmessagesmulti' => 'Tiene nuove mmasciate $1',
 'editsection' => 'càgna',
 'editold' => 'càgna',
+'editlink' => 'càgna',
+'viewsourcelink' => 'Vere sorgente',
+'editsectionhint' => 'Modifica a sezzione $1',
 'toc' => 'Énnece',
 'showtoc' => 'faje vedé',
 'hidetoc' => 'annascunne',
 'viewdeleted' => 'Vire $1?',
+'site-atom-feed' => "Feed Atom 'e $1",
+'red-link-title' => '$1 (a paggena nun esiste)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Articulo',
 'nstab-user' => 'Paggena utente',
+'nstab-special' => 'Paggena speciale',
 'nstab-project' => "Paggena 'e servizio",
 'nstab-image' => 'Fiura',
 'nstab-mediawiki' => "'Mmasciata",
+'nstab-template' => 'Modello',
 'nstab-help' => 'Ajùto',
 'nstab-category' => 'Categurìa',
 
@@ -212,18 +262,22 @@ $messages = array(
 'filedeleteerror' => 'Nun se pô scancellà \'o file "$1"',
 'cannotdelete' => "Nun è possibbele scassà 'a paggena o 'a fiura addamannata. (Putria éssere stato già scancellato.)",
 'badtitle' => "'O nnomme nun è jùsto",
+'viewsource' => 'Vere sorgente',
+'exception-nologin' => 'Acciesso nun affettuato',
 
 # Login and logout pages
 'logouttext' => "'''Site asciùte.'''
 
 Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putite trasì n'ata vota, cu 'o stesso nomme o cu n'ato nomme.",
-'welcomecreation' => "== Bemmenuto, $1! ==
-
-'O cunto è stato criato currettamente.  Nun scurdà 'e perzonalizzà 'e ppreferenze 'e {{SITENAME}}.",
+'welcomeuser' => 'Bemmenuto, $1!',
+'yourname' => 'Nomme utente',
+'yourpassword' => 'Password:',
 'remembermypassword' => 'Allicuordate d"a password (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'yourdomainname' => "Spiecà 'o dumminio",
 'login' => 'Tràse',
+'nav-login-createaccount' => "Tràse o cria n'acciesso nuovo",
 'userlogin' => "Tràse o cria n'acciesso nuovo",
+'userloginnocreate' => 'Tràse',
 'logout' => 'Jèsce',
 'userlogout' => 'Jèsce',
 'notloggedin' => 'Acciesso nun affettuato',
@@ -241,8 +295,15 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 'loginlanguagelabel' => 'Lengua: $1',
 
 # Edit page toolbar
+'italic_sample' => 'Corsivo',
+'italic_tip' => 'Corsivo',
+'link_sample' => 'Titulo ddo cullegamente',
+'extlink_sample' => 'http://www.example.com titulo ddo cullegamente',
+'headline_sample' => 'Testate',
+'headline_tip' => "Testate 'e 2° livello",
 'image_sample' => 'Essempio.jpg',
 'image_tip' => 'Fiura ncuorporata',
+'media_tip' => 'Cullegamente a file multimediale',
 
 # Edit pages
 'minoredit' => 'Chisto è nu cagnamiénto piccerillo',
@@ -256,44 +317,84 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 'loginreqpagetext' => "Pe' veré ate ppaggene abbesognate $1.",
 'accmailtitle' => "'O password è stato mannato.",
 'accmailtext' => '\'A password pe ll\'utente "$1" fuje mannata ô nnerizzo $2.',
-'previewnote' => "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena NUN songo ancora sarvate!'''",
+'newarticle' => '(Novo)',
+'previewnote' => "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena nun songo ancora sarvate!'''",
 'editing' => "Cagnamiento 'e $1",
-'templatesused' => "Template ausate 'a chesta paggena:",
+'editingsection' => 'Cagnamiénto di $1 (sezzione)',
+'templatesused' => "{{PLURAL:$1|Template|Templates}} ausate 'a chesta paggena:",
+'template-protected' => '(prutetto)',
 
 # "Undo" feature
 'undo-summary' => "Canciella 'o cagnamiento $1 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|Chiàcchiera]])",
 
 # History pages
 'currentrev' => "Verzione 'e mmo",
+'currentrev-asof' => 'Vversione attuale dde $1',
+'revisionasof' => 'Vversione delle $1',
+'nextrevision' => 'Vversione cchiù recente →',
+'cur' => 'corr',
+'last' => 'prec',
+
+# Revision feed
+'history-feed-item-nocomment' => "$1 'o $2",
 
 # Revision deletion
 'rev-delundel' => 'faje vedé/annascunne',
+'revdel-restore' => 'càgna visiblità',
+
+# Diffs
+'lineno' => 'Riga $1:',
+'editundo' => 'annulla',
 
 # Search results
 'searchresults' => "Risultato d''a recerca",
+'searchresults-title' => 'Ascià risultate ppe "$1"',
 'searchresulttext' => "Pe sapé de cchiù ncopp'â comme ascia 'a {{SITENAME}}, vere [[{{MediaWiki:Helppage}}|Ricerca in {{SITENAME}}]].",
 'notitlematches' => "Voce addemannata nun truvata dint' 'e titule 'e articulo",
 'notextmatches' => "Voce addemannata nun truvata dint' 'e teste 'e articulo",
+'prevn' => '{{PLURAL:$1|precedente|precedente $1}}',
+'nextn' => '{{PLURAL:$1|successivo|successive $1}}',
+'prevn-title' => '{{PLURAL:$1|Risultato precediente|$1 risultate precedenti}}',
+'nextn-title' => '{{PLURAL:$1|Risultato successivo|$1 risultate successive}}',
+'shown-title' => "Fa vere {{PLURAL:$1|'nu risultato|$1 risultate}} ppe paggena",
+'viewprevnext' => 'Vere($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-new' => "'''Cria a paggena \"[[:\$1]]\" ncopp'â chisto wiki!'''",
 'searchhelp-url' => 'Help:Ajùto',
+'searchprofile-articles' => "Paggene 'e contenute",
+'searchprofile-project' => "Paggene 'e ajùto e relative 'o prugietto",
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Tutto',
+'searchprofile-advanced' => 'Avanzate',
+'searchprofile-articles-tooltip' => "Circa dint'ô $1",
+'searchprofile-project-tooltip' => "Circa dint'ô $1",
+'searchprofile-images-tooltip' => 'Circa file',
+'searchprofile-advanced-tooltip' => "Circa dint'e namespace perzonalizzate",
+'search-result-size' => "$1 ({{PLURAL:$2|'na parola|$2 parole}})",
+'search-redirect' => '(redirect $1)',
+'search-section' => '(sezzione $1)',
+'searchall' => 'Tutte',
 'powersearch' => 'Truova',
 
 # Preferences page
-'mypreferences' => "Preferenze d''e mie",
+'mypreferences' => "Preferenze d''e mmeje",
 'changepassword' => 'Cagna password',
 'prefs-rc' => 'Urdeme nove',
 'prefs-watchlist' => 'Asservate speciale',
 'columns' => 'Culonne:',
 'timezoneregion-africa' => 'Afreca',
+'youremail' => 'E-mail:',
 'username' => 'Nomme utente',
 'yourlanguage' => 'Lengua:',
 
-# User rights log
-'rightsnone' => '(nisciuno)',
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'càgna chesta paggena',
 
 # Recent changes
 'recentchanges' => 'Urdeme nove',
 'recentchanges-summary' => "Ncoppa chesta paggena song' appresentate ll'urdeme cagnamiente fatto ê cuntenute d\"o sito.",
-'rcnote' => "Ccà sotto nce songo ll'urdeme {{PLURAL:$1|cangiamiento|'''$1''' cangiamiente}} 'e ll'urdeme {{PLURAL:$2|juorno|'''$2''' juorne}}, agghiuornate a $3.",
+'recentchanges-label-newpage' => "Chista modifica ha criato 'na nova paggena",
+'recentchanges-label-minor' => 'Chisto è nu cagnamiénto piccerillo',
+'rcnote' => "Ccà sotto nce songo ll'urdeme {{PLURAL:$1|cangiamiento|'''$1''' cangiamiente}} 'e ll'urdeme {{PLURAL:$2|juorno|'''$2''' juorne}}, agghiuornate alle $5 ddo $4.",
 'rclistfrom' => "Faje vedé 'e cagnamiénte fatte a partì 'a $1",
 'rcshowhideminor' => "$1 'e cagnamiénte piccerille",
 'rcshowhidebots' => "$1 'e bot",
@@ -301,31 +402,47 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 'rcshowhideanons' => "$1 ll'utente anonime",
 'rcshowhidemine' => "$1 'e ffatiche mmee",
 'rclinks' => "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne<br />$3",
+'diff' => 'diff',
+'hist' => 'cron',
 'hide' => 'annascunne',
 'show' => 'faje vedé',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 'rc_categories_any' => 'Qualònca',
 
 # Recent changes linked
 'recentchangeslinked' => 'Cagnamiénte cullegate',
 'recentchangeslinked-feed' => 'Cagnamiénte cullegate',
 'recentchangeslinked-toolbox' => 'Cagnamiénte cullegate',
+'recentchangeslinked-page' => 'Nomme dda paggena',
 
 # Upload
 'upload' => 'Careca file',
 'uploadedimage' => 'ha carecato "[[$1]]"',
 
+'license' => 'Licenze:',
+'license-header' => 'Licenza',
+
 # Special:ListFiles
 'listfiles_name' => 'Nomme',
 
 # File description page
 'file-anchor-link' => 'Fiura',
+'filehist-current' => 'attuale',
+'filehist-datetime' => 'Data/Ora',
+'filehist-thumb' => 'Miniature',
 'filehist-user' => 'Utente',
+'filehist-dimensions' => 'Dimenzione',
 'imagelinks' => 'Jonte ê ffiure',
 
 # Random page
 'randompage' => 'Na paggena qualsiase',
 'randompage-nopages' => 'Nessuna pagina nel namespace selezionato.',
 
+# Statistics
+'statistics' => 'Statistiche',
+
 'disambiguations' => "Paggene 'e disambigua",
 
 'doubleredirects' => 'Redirect duppie',
@@ -338,14 +455,23 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 'wantedpages' => 'Paggene cchiù addemannate',
 'shortpages' => 'Paggene curte',
 'longpages' => 'Paggene cchiú longhe',
+'usercreated' => "{{GENDER:$3|Criato/a}} 'o $1 a $2",
 'newpages' => 'Paggene cchiù frische',
 'move' => 'Spusta',
 'movethispage' => 'Spusta chesta paggena',
 
+# Book sources
+'booksources-go' => 'Vàje',
+
+# Special:Log
+'log' => 'Logs',
+
 # Special:AllPages
 'allpages' => "Tutte 'e ppaggene",
+'alphaindexline' => 'da $1 a $2',
 'allarticles' => "Tutt' 'e vvoce",
 'allinnamespace' => "Tutt' 'e ppaggene d''o namespace $1",
+'allpagessubmit' => 'Vàje',
 
 # Special:Categories
 'categories' => 'Categurìe',
@@ -357,10 +483,12 @@ Also see [[Special:WantedCategories|wanted categories]].",
 'linksearch-ok' => 'Truova',
 
 # Watchlist
+'mywatchlist' => 'osservate speciale',
+'watchlistfor2' => 'Ppe $1 $2',
 'watch' => 'Secuta',
+'unwatch' => 'Nun segui',
 'notanarticle' => 'Chesta paggena nun è na voce',
 
-'enotif_newpagetext' => 'Chesta è na paggena nòva.',
 'changed' => 'cagnata',
 
 # Delete
@@ -377,6 +505,7 @@ Also see [[Special:WantedCategories|wanted categories]].",
 
 # Rollback
 'rollback' => "Ausa na revizione 'e primma",
+'rollbacklink' => 'a vascio',
 'revertpage' => "Cangiaje 'e cagnamiénte 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), cu â verzione 'e pprimma 'e  [[User:$1|$1]]",
 
 # Protect
@@ -385,20 +514,29 @@ Also see [[Special:WantedCategories|wanted categories]].",
 
 # Undelete
 'viewdeletedpage' => "Vìre 'e ppàggine scancellate",
+'undeleteviewlink' => 'vere',
 
 # Namespace form on various pages
+'namespace' => 'Namespace:',
 'invert' => "abbarruca 'a sceveta",
+'blanknamespace' => '(Prencepale)',
 
 # Contributions
-'contributions' => 'Contribbute utente',
-'mycontris' => 'Mie contribbute',
+'contributions' => 'Contribbute {{GENDER:$1|utente}}',
+'mycontris' => "'E ffatiche d''e mmeje",
+'uctop' => '(ultima ppe a paggena)',
 
 'sp-contributions-talk' => 'Chiàcchiera',
+'sp-contributions-submit' => 'Truova',
 
 # What links here
 'whatlinkshere' => 'Paggene ca cullegano a chesta',
 'whatlinkshere-title' => 'Paggene ca cullegano a $1',
+'whatlinkshere-page' => 'Paggena:',
 'nolinkshere' => "Nisciuna paggena cuntene jonte ca mpuntano a '''[[:$1]]'''.",
+'whatlinkshere-links' => '← jonte',
+'whatlinkshere-hideredirs' => '$1 redirects',
+'whatlinkshere-hideimages' => '$1 links ddo file',
 
 # Block/unblock
 'blockip' => 'Ferma utelizzatóre',
@@ -406,6 +544,8 @@ Also see [[Special:WantedCategories|wanted categories]].",
 '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',
 'blockipsuccesssub' => 'Blocco aseguito',
 'blocklink' => 'ferma',
+'unblocklink' => 'sblocca',
+'contribslink' => 'contribuzzione',
 'blocklogpage' => 'Blocche',
 'blocklogentry' => 'ha fermato "[[$1]]" pe\' nu mumento \'e $2 $3',
 'blocklogtext' => "Chesta è 'a lista d''e azzione 'e blocco e sblocco utente.  'E nnerizze IP bloccate automaticamente nun nce so'. Addumannà 'a [[Special:BlockList|lista IP bloccate]] pp' 'a lista d''e nnerizze e nomme utente 'o ca blocco nce sta.",
@@ -416,7 +556,9 @@ Also see [[Special:WantedCategories|wanted categories]].",
 'movepagebtn' => "Spusta 'a paggena",
 'articleexists' => "Na paggena cu chisto nomme asiste già, o pure 'o nomme scegliuto nun è buono.  Scegliere n'ato titulo.",
 'movedto' => 'spustata a',
+'movelogpage' => 'Spustamente',
 'movereason' => 'Raggióne',
+'revertmove' => 'ripristina',
 'delete_and_move' => 'Scancèlla e spusta',
 'delete_and_move_confirm' => "Sì, suprascrivi 'a paggena asistente",
 
@@ -428,6 +570,9 @@ Also see [[Special:WantedCategories|wanted categories]].",
 'allmessagesname' => 'Nomme',
 'allmessagescurrent' => "Testo 'e mo",
 
+# Thumbnails
+'thumbnail-more' => 'Ingrandisce',
+
 # Special:Import
 'import' => 'Mpurta paggene',
 'import-interwiki-submit' => 'Mpurta',
@@ -436,18 +581,49 @@ Also see [[Special:WantedCategories|wanted categories]].",
 'import-logentry-upload' => 'ha mpurtato [[$1]] trammeto upload',
 
 # Tooltip help for the actions
+'tooltip-pt-mycontris' => 'Elenco dde tuje contributte',
+'tooltip-pt-login' => 'A reggistrazione e consegliata',
 'tooltip-pt-logout' => 'Jésce (logout)',
+'tooltip-ca-edit' => "Puo modifica chista paggena. Ppe favore usa 'o pulsante 'e anteprimma primma 'e salva",
+'tooltip-ca-addsection' => "Cummincia 'na nova sezzione",
+'tooltip-ca-viewsource' => "Chista paggena è prutetta, ma puo vere 'o codice sorgente",
+'tooltip-ca-history' => "Vversione precedente 'e chista paggena",
+'tooltip-ca-move' => 'Spusta chista paggena',
+'tooltip-search' => "Truova dint'ô {{SITENAME}}",
+'tooltip-search-fulltext' => "Ascià 'o testo indicato dint'e paggene",
+'tooltip-p-logo' => 'Visita a paggena prencepale',
+'tooltip-n-mainpage' => 'Visita a paggena prencepale',
+'tooltip-n-mainpage-description' => 'Visita a paggena prencepale',
+'tooltip-n-portal' => 'Descrizione ddo prugietto, che pou fa, addo truova e cose',
+'tooltip-n-recentchanges' => 'Ennece dde urdeme cagnamiénte ddo sito',
+'tooltip-n-randompage' => 'Na paggena qualsiase',
+'tooltip-n-help' => "Paggena 'e ajùto",
+'tooltip-t-recentchangeslinked' => 'Urdeme cagnamiénte dde paggene ca cullegano a chesta',
+'tooltip-t-upload' => 'Careca file',
+'tooltip-t-specialpages' => "Lista 'e tutte e paggene speciale",
+'tooltip-t-print' => "Vversione pe' stampa 'e chista paggena",
+'tooltip-t-permalink' => 'Jonta permanente a chista vversione dda paggena',
+'tooltip-ca-nstab-main' => 'Vere a paggena e contenuto',
+'tooltip-ca-nstab-template' => "Vere 'o modello",
 'tooltip-minoredit' => 'Rénne chìsto cagnamiénto cchiù ppiccirìllo.',
 'tooltip-save' => "Sàrva 'e cagnamiénte.",
 'tooltip-preview' => "Primma 'e sarvà, vìre primma chille ca hê cagnàte!",
+'tooltip-rollback' => "\"A vascio\" annulla 'e modefeche 'e chista paggena ell'ultimo contributore cu n' uneco click",
 
 # Attribution
 'others' => 'ate',
 
+# Media information
+'file-info-size' => '$1 × $2 pixel, dimenzione ddo file: $3, tipo MIME: $4',
+'show-big-image' => 'Vversione ad ata risoluzione',
+
 # Special:NewFiles
 'noimages' => "Nun nc'è nind' 'a veré.",
 'ilsubmit' => 'Truova',
 
+# Metadata
+'metadata' => 'Metadate',
+
 'exif-xyresolution-i' => '$1 punte pe pollice (dpi)',
 
 'exif-meteringmode-0' => 'Scanusciuto',
@@ -465,9 +641,11 @@ Also see [[Special:WantedCategories|wanted categories]].",
 'edit-externally-help' => "Pe piglià cchiù nfromma veré 'e [//www.mediawiki.org/wiki/Manual:External_editors struzione] ('n ngrese)",
 
 # 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'tutte',
 'namespacesall' => 'Tutte',
+'monthsall' => 'tutte',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail_needlogin' => "Abbesognate $1 pe cunfirmà 'o nnerizzo 'e e-mail d''o vuosto.",
 'confirmemail_loggedin' => "'O nnerizzo 'e e-mail è vàleto",
 
@@ -476,9 +654,12 @@ Also see [[Special:WantedCategories|wanted categories]].",
 
 # Auto-summaries
 'autoredircomment' => 'Redirect â paggena [[$1]]',
-'autosumm-new' => 'Paggena nuova: $1',
+'autosumm-new' => "Paggena criate ch''o: $1",
 
 # Special:SpecialPages
 'specialpages' => 'Paggene speciale',
 
+# New logging system
+'rightsnone' => '(nisciuno)',
+
 );
index 10621f3..f96cbda 100644 (file)
@@ -37,6 +37,7 @@
  * @author Purodha
  * @author Qaqqalik
  * @author Samuelsen
+ * @author Simen47
  * @author Simny
  * @author Sjurhamre
  * @author Stigmj
@@ -346,8 +347,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis antall brukere som overvåker',
 'tog-oldsig' => 'Nåværende signatur:',
 'tog-fancysig' => 'Behandle signaturen som wikitekst (uten automatisk lenke)',
-'tog-externaleditor' => 'Bruk ekstern behandler som standard (kun for viderekomne brukere, krever spesielle innstillinger på din datamaskin. [//www.mediawiki.org/wiki/Manual:External_editors Mer informasjon.])',
-'tog-externaldiff' => 'Bruk ekstern differanse som standard (kun for viderekomne brukere, krever spesielle innstillinger på din datamaskin. [//www.mediawiki.org/wiki/Manual:External_editors Mer informasjon.])',
 'tog-showjumplinks' => 'Slå på «gå til»-lenker',
 'tog-uselivepreview' => 'Bruk levende forhåndsvisning (eksperimentell JavaScript)',
 'tog-forceeditsummary' => 'Advar meg når jeg ikke gir noen redigeringsforklaring',
@@ -361,6 +360,7 @@ $messages = array(
 'tog-diffonly' => 'Ikke vis sideinnhold under differ',
 'tog-showhiddencats' => 'Vis skjulte kategorier',
 'tog-norollbackdiff' => 'Ikke vis diff etter tilbakestilling',
+'tog-useeditwarning' => 'Si ifra dersom jeg forlater en side jeg har gjort redigeringer på men ikke har lagret siden.',
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldri',
@@ -424,6 +424,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'des',
+'january-date' => 'Januar $1',
+'february-date' => 'Februar $1',
+'march-date' => 'Mars $1',
+'april-date' => 'April $1',
+'may-date' => 'Mai $1',
+'june-date' => 'Juni $1',
+'july-date' => 'Juli $1',
+'august-date' => 'August $1',
+'september-date' => 'September $1',
+'october-date' => 'Oktober $1',
+'november-date' => 'November $1',
+'december-date' => 'Desember $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
@@ -730,9 +742,18 @@ Merk at noen sider kan vise at du fortsatt er logget inn fram til du tømmer mel
 'welcomecreation-msg' => 'Kontoen din har blitt opprettet.
 Ikke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.',
 'yourname' => 'Brukernavn:',
+'userlogin-yourname' => 'Brukernan',
+'userlogin-yourname-ph' => 'Skriv inn brukernavnet ditt',
 'yourpassword' => 'Passord:',
+'userlogin-yourpassword' => 'Passord',
+'userlogin-yourpassword-ph' => 'Skriv inn passordet ditt',
+'createacct-yourpassword-ph' => 'Skriv inn et passord',
 'yourpasswordagain' => 'Gjenta passord',
+'createacct-yourpasswordagain' => 'Bekreft passord',
+'createacct-yourpasswordagain-ph' => 'Skriv inn passordet igjen',
 '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',
 'securelogin-stick-https' => 'Vær fortsatt koblet til HTTPS etter innlogging',
 'yourdomainname' => 'Ditt domene',
 'password-change-forbidden' => 'Du kan ikke endre passord på denne wikien.',
@@ -745,18 +766,38 @@ Ikke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.
 'logout' => 'Logg ut',
 'userlogout' => 'Logg ut',
 'notloggedin' => 'Ikke logget inn',
+'userlogin-noaccount' => 'Ingen konto?',
+'userlogin-joinproject' => 'Bli med på {{SITENAME}}',
 'nologin' => 'Har du ingen konto? $1.',
 'nologinlink' => 'Opprett en konto',
 'createaccount' => 'Opprett konto',
 'gotaccount' => 'Har du allerede en konto? $1.',
 'gotaccountlink' => 'Logg inn',
 'userlogin-resetlink' => 'Har du glemt påloggingsdetaljene dine?',
+'userlogin-resetpassword-link' => 'Tilbakestill passordet dit',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
+'createacct-join' => 'Skriv inn informasjonen din under.',
+'createacct-emailrequired' => 'Email-adresse',
+'createacct-emailoptional' => 'Email-adresse (valgfritt)',
+'createacct-email-ph' => 'Skriv inn email-adressen din',
 'createaccountmail' => 'Bruk et midlertidig tilfeldig passord, og send det til e-postadressen nedenfor',
+'createacct-realname' => 'Virkelige 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' => 'Lag deg en bruker',
+'createacct-benefit-heading' => '{{SITENAME}} er laget av personer som deg.',
+'createacct-benefit-body1' => '{{PLURAL:$1|edit|edits}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|page|pages}}',
+'createacct-benefit-body3' => 'siste {{PLURAL:$1|contributor|contributors}}',
 'badretype' => 'Passordene samsvarte ikke.',
 'userexists' => 'Brukernavnet er allerede i bruk.
 Velg et annet brukernavn.',
 'loginerror' => 'Innloggingsfeil',
+'createacct-error' => 'Feil med kontoppretting',
 'createaccounterror' => 'Kunne ikke opprette konto: $1',
 'nocookiesnew' => 'Din brukerkonto er nå opprettet, men du har ikke logget på. {{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på for å kunne logge på med ditt nye brukernavn og passord.',
 'nocookieslogin' => '{{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på og prøv igjen.',
@@ -792,8 +833,8 @@ og fortsette å bruke det gamle passordet.',
 Logg inn når du har mottatt det nye passordet.',
 'blocked-mailpassword' => 'IP-adressen din er blokkert fra å redigere, og for å forhindre misbruk kan du heller ikke bruke funksjonen som gir deg nytt passord.',
 'eauthentsent' => 'En bekreftelsesmelding ble sendt til gitte e-postadresse. Før andre e-poster kan sendes til kontoen må du følge instruksjonene i e-posten for å bekrefte at kontoen faktisk er din.',
-'throttled-mailpassword' => 'En passordpåminnelse ble sendt for mindre enn {{PLURAL:$1|en time|$1 timer}} siden.
-For å forhindre misbruk kan kun én passordpåminnelse sendes per {{PLURAL:$1|time|$1 timer}}.',
+'throttled-mailpassword' => 'En passordtilbakestillingsepost har allerede blitt sendt for mindre enn {{PLURAL:$1|en time|$1 timer}} siden.
+For å forhindre misbruk kan kun én passordtilbakestillingsepost sendes per {{PLURAL:$1|time|$1 timer}}.',
 'mailerror' => 'Feil under sending av e-post: $1',
 'acct_creation_throttle_hit' => 'Gjester med samme IP-adresse som deg har opprettet {{PLURAL:$1|én konto|$1 kontoer}} det siste døgnet, og det er ikke tillatt å opprette flere.
 Som et resultat kan det ikke opprettes flere kontoer fra denne IP-adressen.',
@@ -839,21 +880,20 @@ Du kan ignorere denne beskjeden dersom kontoen ble opprettet ved en feil.',
 'resetpass-wrong-oldpass' => 'Ugyldig midlertidig eller nåværende passord.
 Du kan ha allerede byttet passordet, eller bedt om et nytt midlertidig passord.',
 'resetpass-temp-password' => 'Midlertidig passord:',
+'resetpass-abort-generic' => 'Endring av passord har blitt avbrutt av en utvidelse.',
 
 # Special:PasswordReset
 'passwordreset' => 'Passordresetting',
-'passwordreset-text' => 'Fyll ut dette skjemaet for å motta en påminnelse om kontoopplysningene dine i en e-post.',
 'passwordreset-legend' => 'Nullstill passord',
 'passwordreset-disabled' => 'Nullstilling av passord er deaktivert på denne wikien.',
-'passwordreset-pretext' => '{{PLURAL:$1||Skriv inn en av datadelene nedenfor}}',
+'passwordreset-emaildisabled' => 'E-posttjenester er slått av på denne wikien.',
 'passwordreset-username' => 'Brukernavn:',
 'passwordreset-domain' => 'Domene:',
 'passwordreset-capture' => 'Vise resulterende e-post?',
 'passwordreset-capture-help' => 'Hvis du krysser av her, vil du se e-posten (med foreløpig passord) i tillegg til at den blir sendt til brukeren.',
 'passwordreset-email' => 'E-postadresse:',
 'passwordreset-emailtitle' => 'Kontodetaljer på {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Noen (sannsynligvis deg fra IP-adressen $1) ba om en påminnelse om dine
-kontodetaljer for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er
+'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
 tilknyttet denne e-postadressen:
 
 $2
@@ -863,7 +903,7 @@ Du bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne
 forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger
 ønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle
 passord.',
-'passwordreset-emailtext-user' => 'Brukeren $1 på {{SITENAME}} ba om en påminnelse om kontodetaljene dine for {{SITENAME}}
+'passwordreset-emailtext-user' => 'Brukeren $1 på {{SITENAME}} ba om en tilbakestilling av passordet ditt for {{SITENAME}}
 ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er tilknyttet denne e-postadressen:
 
 $2
@@ -875,9 +915,9 @@ forespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenge
 passord.',
 'passwordreset-emailelement' => 'Brukernavn: $1
 Midlertidig passord: $2',
-'passwordreset-emailsent' => 'En påminnelse har blitt sendt på e-post.',
-'passwordreset-emailsent-capture' => 'E-posten under er sendt ut som en påminnelse.',
-'passwordreset-emailerror-capture' => 'E-posten, som du ser under, ble forsøkt sendt til brukeren, men dette mislyktes: $1',
+'passwordreset-emailsent' => 'En passordtilbakestillingslenke har blitt sendt per e-post.',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Endre e-postadresse',
@@ -1095,6 +1135,7 @@ Slette- og flytteloggen vises nedenfor.',
 'content-failed-to-parse' => 'Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3',
 'invalid-content-data' => 'Ugyldig innhold',
 'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
+'editwarning-warning' => 'Ved å forlate siden kan du miste alle endringer du har utført. Om du er logget inn kan du slå av denne advarselen under «Redigering»-seksjonen i innstillingene.',
 
 # Content models
 'content-model-wikitext' => 'WikiTekst',
@@ -1376,15 +1417,7 @@ For å søke i alle, bruk prefikset ''all:'' (inkluderer diskusjonssider, maler,
 'powersearch-togglenone' => 'Ingen',
 'search-external' => 'Eksternt søk',
 'searchdisabled' => 'Søkefunksjonen er slått av. Du kan søke via Google i mellomtiden. Merk at Googles indeksering av {{SITENAME}} muligens er utdatert.',
-
-# Quickbar
-'qbsettings' => 'Brukerinnstillinger for hurtigmeny.',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast venstre',
-'qbsettings-fixedright' => 'Fast høyre',
-'qbsettings-floatingleft' => 'Flytende venstre',
-'qbsettings-floatingright' => 'Flytende til høyre',
-'qbsettings-directionality' => '"Låst", f. eks. i posisjon "låst til venstre eller til høyre". For venstre-mot-høyre-språk vil hurtigvelgeren være satt til venstre, for høyre-mot-venstre-språk til høyre.',
+'search-error' => 'En feil oppsto under søk: $1',
 
 # Preferences page
 'preferences' => 'Innstillinger',
@@ -1528,6 +1561,7 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'userrights-changeable-col' => 'Grupper du kan endre',
 'userrights-unchangeable-col' => 'Grupper du ikke kan endre',
 'userrights-irreversible-marker' => '$1 *',
+'userrights-conflict' => 'En konflikt med brukerrettighetene! Vennligst legg til endringene dine igjen.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1938,7 +1972,6 @@ For best mulig sikkerhet er img_auth.php slått av.',
 'http-read-error' => 'HTTP-lesefeil.',
 'http-timed-out' => 'Tidsavbrudd på HTTP-forespørsel.',
 'http-curl-error' => 'Feil under henting av adresse: $1',
-'http-host-unreachable' => 'Kunne ikke nå adressen.',
 'http-bad-status' => 'Det var et problem under HTTP-forespørselen: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2094,6 +2127,9 @@ En side anses om en pekerside om den inneholder en mal som det lenkes til fra [[
 
 'pageswithprop' => 'Sider med sideverdi',
 'pageswithprop-legend' => 'Sider med en sideverdi',
+'pageswithprop-text' => 'Denne siden lister opp sider som bruker en viss sideverdi.',
+'pageswithprop-prop' => 'Verdinavn:',
+'pageswithprop-submit' => 'Gå',
 
 'doubleredirects' => 'Doble omdirigeringer',
 'doubleredirectstext' => 'Denne siden lister opp de sidene som er omdirigeringer til andre omdirigeringssider.
@@ -2343,8 +2379,8 @@ Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir lis
 'notvisiblerev' => 'Revisjonen er slettet',
 'watchnochange' => 'Ingen av sidene i overvåkningslisten er endret i den valgte perioden.',
 'watchlist-details' => '{{PLURAL:$1|Én side|$1 sider}} på din overvåkningsliste, teller ikke diskusjonssider.',
-'wlheader-enotif' => 'E-postnotifikasjon er slått på.',
-'wlheader-showupdated' => "Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
+'wlheader-enotif' => 'E-postnotifikasjon er slått på.',
+'wlheader-showupdated' => "Sider som har blitt forandret siden du sist besøkte dem vises i '''fet tekst'''",
 'watchmethod-recent' => 'sjekker siste endringer for sider i overvåkningslisten',
 'watchmethod-list' => 'sjekker siste endringer for sider i overvåkningslisten',
 'watchlistcontains' => 'Overvåkningslisten inneholder $1 {{PLURAL:$1|side|sider}}.',
@@ -2743,6 +2779,7 @@ Skjulingsloggen vises nedenfor.',
 'proxyblocksuccess' => 'Utført.',
 'sorbsreason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Din IP-adresse angis som en åpen proxy i DNSBL-en brukt av {{SITENAME}}. Du kan ikke opprette en konto',
+'xffblockreason' => 'En IP-adresse som er tilstede i X-Forwarded-For-headeren, enten din eller en som tilhører en proxyserver du bruker, har blitt blokkert. Den opprinnelige blokkeringsgrunnen var: $1',
 'cant-block-while-blocked' => 'Du kan ikke blokkere andre mens du selv er blokkert.',
 'cant-see-hidden-user' => 'Brukeren du prøver å blokkere har allerede blitt blokkert og skjult. Ettersom du ikke har rett til å skjule brukere (hideuser), kan du ikke se eller endre brukerens blokkering.',
 'ipbblocked' => 'Du kan ikke blokkere eller avblokkere andre brukere, siden du selv er blokkert',
@@ -2909,6 +2946,8 @@ Besøk [//translatewiki.net translatewiki.net] om du ønsker å bidra med overse
 'thumbnail-more' => 'Forstørr',
 'filemissing' => 'Filen mangler',
 'thumbnail_error' => 'Feil under oppretting av miniatyrbilde: $1',
+'thumbnail_error_remote' => 'Feil-melding fra $1:
+$2',
 'djvu_page_error' => 'DjVu-side ute av rekkevidde',
 'djvu_no_xml' => 'Klarte ikke å hente XML for DjVu-fil',
 'thumbnail-temp-create' => 'Kan ikke opprette midlertidig miniatyrbildefil',
@@ -3056,24 +3095,14 @@ Du kan se på kildeteksten',
 
 # Stylesheets
 'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
-'standard.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Standard */',
-'nostalgia.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Nostalgia */',
 'cologneblue.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Kølnerblå */',
 'monobook.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Monobook */',
-'myskin.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta MySkin */',
-'chick.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Chick */',
-'simple.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Simple */',
 'modern.css' => '/* CSS i denne fila vil gjelde alle som bruker drakta Modern */',
 
 # Scripts
 'common.js' => '/* Javascript i denne fila vil gjelde for alle drakter. */',
-'standard.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Standard */',
-'nostalgia.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Nostalgia */',
 'cologneblue.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Kølnerblå */',
 'monobook.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Monobook */',
-'myskin.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta MySkin */',
-'chick.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Chick */',
-'simple.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Simple */',
 'modern.js' => '/* Javascript i denne fila vil gjelde for brukere av drakta Modern */',
 
 # Metadata
@@ -3118,6 +3147,7 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-robot-noindex' => 'Ikke indekserbar',
 'pageinfo-views' => 'Antall visninger',
 'pageinfo-watchers' => 'Antall overvåkere av siden',
+'pageinfo-few-watchers' => 'Færre enn $1 {{PLURAL:$1|overvåker|overvåkere}}',
 'pageinfo-redirects-name' => 'Omdirigeringer til siden',
 'pageinfo-subpages-name' => 'Undersider av siden',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringer}}; $3 {{PLURAL:$3|ikke-omdirigering|ikke-omdirigeringer}})',
@@ -3147,12 +3177,8 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-category-files' => 'Antall filer',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Kølnerblå',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Eget utseende',
-'skinname-simple' => 'Enkel',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3231,11 +3257,25 @@ Ved å åpne den kan systemet ditt kompromitteres.",
 'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutter}}',
 'hours' => '{{PLURAL:$1|$1 time|$1 timer}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dager}}',
+'weeks' => '{{FLERTALL:$1|$1 uke|$1 uker}}',
 'months' => '{{PLURAL:$1|$1 måned|$1 måneder}}',
 'years' => '{{PLURAL:$1|$1 år}}',
 'ago' => '$1 siden',
 'just-now' => 'nettopp',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{FLERTALL:$1|time|timer}} siden',
+'minutes-ago' => '$1 {{FLERTALL:$1|minutt|minutter}} siden',
+'seconds-ago' => '$1 {{FLERTALL:$1|sekund|sekunder}} siden',
+'monday-at' => 'Mandag på $1',
+'tuesday-at' => 'Tirsdag på $1',
+'wednesday-at' => 'Onsdag på $1',
+'thursday-at' => 'Torsdag på $1',
+'friday-at' => 'Fredag på $1',
+'saturday-at' => 'Lørdag på $1',
+'sunday-at' => 'Søndag på $1',
+'yesterday-at' => 'I går på $1',
+
 # Bad image list
 'bad_image_list' => 'Formatet er som følger:
 
@@ -3265,7 +3305,7 @@ Andre vil skjules som standard.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bredde',
 'exif-imagelength' => 'Høyde',
 'exif-bitspersample' => 'Bits per komponent',
@@ -3443,7 +3483,7 @@ Andre vil skjules som standard.
 'exif-originalimageheight' => 'Høyde på bildet før det ble beskåret',
 'exif-originalimagewidth' => 'Bredde på bildet før det ble beskåret',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ukomprimert',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensjonal modifisert Huffman-kjørelengdekoding',
 'exif-compression-3' => 'CCITT Gruppe 3 faks-koding',
@@ -3877,12 +3917,14 @@ Du skal ha mottatt [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi av GNU General Publ
 'version-entrypoints-header-entrypoint' => 'Inngangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Gå',
-'filepath-summary' => 'Denne spesialsiden returnerer den fullstendige stien for en fil.
-Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom sine tilknyttede programmer.',
+# Special:Redirect
+'redirect-submit' => 'Gå',
+'redirect-lookup' => 'Oppslag:',
+'redirect-value' => 'Verdi:',
+'redirect-user' => 'Bruker ID',
+'redirect-revision' => 'Side revisjon',
+'redirect-file' => 'Fil-navn',
+'redirect-not-exists' => 'Verdi er ikke funnet',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Søk etter duplikatfiler',
@@ -3973,23 +4015,26 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
 'htmlform-submit' => 'Lagre',
 'htmlform-reset' => 'Omgjør endringer',
 'htmlform-selectorother-other' => 'Andre',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Velg et alternativ',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
 'sqlite-no-fts' => '$1 uten støtte for fulltekstsøk',
 
 # New logging system
-'logentry-delete-delete' => '$1 slettet siden $3',
-'logentry-delete-restore' => '$1 gjenopprettet siden $3',
-'logentry-delete-event' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
-'logentry-delete-revision' => '$1 endret synlighet av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4',
-'logentry-delete-event-legacy' => '$1 endret synlighet av loggede hendelser på $3',
-'logentry-delete-revision-legacy' => '$1 endret synlighet av revisjoner på side $3',
-'logentry-suppress-delete' => '$1 skjult side $3',
-'logentry-suppress-event' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
-'logentry-suppress-revision' => '$1 endret skjult synligheten av {{PLURAL:$5|en logget hendelse|$5 loggede hendelser}} på $3: $4',
-'logentry-suppress-event-legacy' => '$1 endret skjult synligheten av loggede hendelser på $3',
-'logentry-suppress-revision-legacy' => '$1 endret skjult synligheten av revisjoner på side $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|slettet}} siden $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|gjenopprettet}} siden $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|endret}} synligheten av logghendelser på $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|endret}} synligheten av revisjoner på siden $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|skjulte}} siden $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|endret}} diskré synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|endret}} diskré synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|endret}} diskré synligheten av logghendelser på $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|endret}} diskré synligheten av revisjoner på siden $3',
 'revdelete-content-hid' => 'innhold skjult',
 'revdelete-summary-hid' => 'redigeringsbeskrivelse skjult',
 'revdelete-uname-hid' => 'brukernavn skjult',
@@ -3998,20 +4043,20 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
 'revdelete-uname-unhid' => 'brukernavn synlig',
 'revdelete-restricted' => 'begrensninger gjelder også administratorer',
 'revdelete-unrestricted' => 'fjernet begrensninger for administratorer',
-'logentry-move-move' => '$1 flyttet siden $3 til $4',
-'logentry-move-move-noredirect' => '$1 flyttet siden $3 til $4 uten å etterlate en omdirigering',
-'logentry-move-move_redir' => '$1 flyttet siden $3 til $4 over en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttet siden $3 til $4 over en omdirigering uten å etterlate en omdirigering',
-'logentry-patrol-patrol' => '$1 markerte revisjon $4 av siden $3 som patruljert',
-'logentry-patrol-patrol-auto' => '$1 markerte automatisk revisjon $4 av siden $3 som patruljert',
-'logentry-newusers-newusers' => 'Kontoen $1 ble opprettet',
-'logentry-newusers-create' => 'Kontoen $1 ble opprettet',
-'logentry-newusers-create2' => 'Kontoen $3 ble opprettet av $1',
-'logentry-newusers-byemail' => 'Kontoen $3 ble opprettet av $1 og passordet sendt med e-post',
-'logentry-newusers-autocreate' => 'Konto $1 ble opprettet automatisk',
-'logentry-rights-rights' => '$1 endret gruppemedlemskap for $3 fra $4 til $5',
-'logentry-rights-rights-legacy' => '$1 endret gruppemedlemskap for $3',
-'logentry-rights-autopromote' => '$1 ble automatisk forfremmet fra $4 til $5',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4 uten å etterlate en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4 over en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttet}} siden $3 til $4 over en omdirigering uten å etterlate en omdirigering',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerte}} revisjon $4 av siden $3 som patruljert',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerte}} automatisk revisjon $4 av siden $3 som patruljert',
+'logentry-newusers-newusers' => 'Brukerkontoen $1 ble {{GENDER:$2|opprettet}}',
+'logentry-newusers-create' => 'Brukerkontoen $1 ble {{GENDER:$2|opprettet}}',
+'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-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',
 'rightsnone' => '(ingen)',
 
 # Feedback
@@ -4087,4 +4132,7 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
 'duration-centuries' => '$1 {{PLURAL:$1|århundre|århundrer}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
 
+# Image rotation
+'rotate-comment' => 'Bildet snudd $1{{PLURAL:°}} med klokka',
+
 );
index d155c76..a8fa3d8 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Geitost
+ * @author Joachim Mos
  * @author Kaganer
  * @author Purodha
  * @author Slomox
@@ -245,8 +246,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Wies de Tall vun Brukers, de op disse Siet oppasst',
 'tog-oldsig' => 'Gellen Ünnerschrift',
 'tog-fancysig' => 'Signatur as Wikitext behanneln (ahn automaatsch Lenk)',
-'tog-externaleditor' => 'Extern Editor as Standard bruken (Blots för Lüüd, de sik dormit utkennt. Dor mutt noch mehr op dien Reekner instellt warrn, dat dat geiht. [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatschonen hierto.])',
-'tog-externaldiff' => 'Extern Warktüüch to’n Wiesen vun Ünnerscheden as Standard bruken (Blots för Lüüd, de sik dormit utkennt. Dor mutt noch mehr op dien Reekner instellt warrn, dat dat geiht. [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatschonen hierto.])',
 'tog-showjumplinks' => '„Wesseln-na“-Lenken tolaten',
 'tog-uselivepreview' => 'Live-Vörschau bruken (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Segg mi bescheid, wenn ik keen Tosamenfaten geven heff, wat ik allens ännert heff',
@@ -710,9 +709,14 @@ Villicht hest du dien Passwoord al ännert oder noch wedder en nee temporär Pas
 # Special:PasswordReset
 'passwordreset' => 'Passwoord torüchsetten',
 'passwordreset-legend' => 'Passwoord torüchsetten',
+'passwordreset-username' => 'Brukernaam:',
+'passwordreset-domain' => 'Domään',
+'passwordreset-email' => 'E-Mail-Adress:',
 
 # Special:ChangeEmail
 'changeemail' => 'E-Mail-Adress ännern',
+'changeemail-newemail' => 'Nee E-Mail-Adress:',
+'changeemail-cancel' => 'Afbreken',
 
 # Edit page toolbar
 'bold_sample' => 'Fetten Text',
@@ -892,6 +896,11 @@ Schient so, as wenn se wegdaan worrn is.',
 'edit-no-change' => 'Dien Ännern is nich afspiekert worrn, denn dor hett sik nix an’n Text ännert.',
 'edit-already-exists' => 'Kunn keen ne’e Sied opstellen, dat gifft ehr al.',
 
+# Content models
+'content-model-wikitext' => 'Wikitext',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Wohrschau: Disse Sied bruukt to veel opwännige Parserfunkschonen.
 
@@ -1120,14 +1129,6 @@ Du kannst dat Woord ''all:'' vör dien Söökwoord setten, dat all Naamrüüm (o
 'searchdisabled' => '<p>De Vulltextsöök is wegen Överlast en Stoot deaktiveert. In disse Tied kannst du disse Google-Söök verwennen,
 de aver nich jümmer den aktuellsten Stand weerspegelt.<p>',
 
-# Quickbar
-'qbsettings' => 'Siedenliest',
-'qbsettings-none' => 'Keen',
-'qbsettings-fixedleft' => 'Links, fast',
-'qbsettings-fixedright' => 'Rechts, fast',
-'qbsettings-floatingleft' => 'Links, sweven',
-'qbsettings-floatingright' => 'Rechts, sweven',
-
 # Preferences page
 'preferences' => 'Instellen',
 'mypreferences' => 'För mi Instellen',
@@ -1270,12 +1271,12 @@ Dat kann nich wedder ungeschehn maakt warrn.',
 'group-suppress' => 'Oversights',
 'group-all' => '(all)',
 
-'group-user-member' => 'Bruker',
-'group-autoconfirmed-member' => 'Bestätigt Bruker',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Admin',
-'group-bureaucrat-member' => 'Bürokraat',
-'group-suppress-member' => 'Oversight',
+'group-user-member' => '{{GENDER:$1|Bruker}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|Bestätigt Bruker}}',
+'group-bot-member' => '{{GENDER:$1|Bot}}',
+'group-sysop-member' => '{{GENDER:$1|Admin}}',
+'group-bureaucrat-member' => '{{GENDER:$1|Bürokraat}}',
+'group-suppress-member' => '{{GENDER:$1|Översicht}}',
 
 'grouppage-user' => '{{ns:project}}:Brukers',
 'grouppage-autoconfirmed' => '{{ns:project}}:Bestätigte Brukers',
@@ -1414,6 +1415,7 @@ Dat kann nich wedder ungeschehn maakt warrn.',
 'number_of_watching_users_pageview' => '[{{PLURAL:$1|Een Bruker|$1 Brukers}}, de oppasst]',
 'rc_categories' => 'Blot Sieden ut de Kategorien (trennt mit „|“):',
 'rc_categories_any' => 'All',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} achter Ännern',
 'newsectionsummary' => '/* $1 */ nee Afsnitt',
 'rc-enhanced-expand' => 'Details wiesen (bruukt JavaScript)',
 'rc-enhanced-hide' => 'Details versteken',
@@ -1502,6 +1504,7 @@ Wenn du ehr liekers hoochladen wullt, gah trüch un laad de Datei ünner en anne
 'sourceurl' => 'Born-URL:',
 'destfilename' => 'Dateinaam, so as dat hier spiekert warrn schall:',
 'upload-maxfilesize' => 'Maximale Dateigrött: $1',
+'upload-description' => 'Dateibeschrieven',
 'watchthisupload' => 'Op disse Datei oppassen',
 'filewasdeleted' => 'En Datei mit dissen Naam hett dat al mal geven un is denn wegsmeten worrn. Kiek doch toeerst in dat $1 na, ehrdat du de Datei afspiekerst.',
 'filename-bad-prefix' => "De Naam vun de Datei fangt mit '''„$1“''' an. Dat is normalerwies en Naam, den de Datei automaatsch vun de Digitalkamera kriggt. De Naam beschrievt de Datei nich un seggt dor ok nix över ut. Söök di doch en Naam för de Datei ut, de ok wat över den Inholt seggt.",
@@ -1637,6 +1640,7 @@ Denk dor an, natokieken, wat nich noch annere Sieden na de Vörlagen wiest, ehrd
 'statistics-header-edits' => 'Änner-Statistik',
 'statistics-header-views' => 'Siedenweddergaav-Statistik',
 'statistics-header-users' => 'Brukerstatistik',
+'statistics-header-hooks' => 'Annere Statistiken',
 'statistics-articles' => 'Inholtssieden',
 'statistics-pages' => 'Sieden',
 'statistics-pages-desc' => 'All Sieden in dit Wiki, tohoop mit all Diskuschoonssieden, Redirects usw.',
@@ -1654,6 +1658,8 @@ Denk dor an, natokieken, wat nich noch annere Sieden na de Vörlagen wiest, ehrd
 'disambiguationspage' => 'Template:Mehrdüdig_Begreep',
 'disambiguations-text' => 'Disse Sieden wist na Sieden för mehrdüdige Begrepen. Se schöölt lever op de Sieden wiesen, de egentlich meent sünd.<br />Ene Siet warrt as Siet för en mehrdüdigen Begreep ansehn, wenn [[MediaWiki:Disambiguationspage]] na ehr wiest.<br />Lenken ut annere Naamrüüm sünd nich mit in de List.',
 
+'pageswithprop-submit' => 'Los',
+
 'doubleredirects' => 'Dubbelte Wiederleiden',
 'doubleredirectstext' => '<b>Wohrscho:</b> Disse List kann „falsche Positive“ bargen.
 Dat passeert denn, wenn en Wiederleiden blangen de Wiederleiden-Verwies noch mehr Text mit annere Verwiesen hett.
@@ -1831,6 +1837,8 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
 'mailnologin' => 'Du büst nich anmellt.',
 'mailnologintext' => 'Du musst [[Special:UserLogin|anmellt wesen]] un in diene [[Special:Preferences|Instellungen]] en güllige E-Mail-Adress hebben, dat du annere Brukers E-Mails tostüren kannst.',
 '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.',
 'usermailererror' => 'Dat Mail-Objekt hett en Fehler trüchgeven:',
@@ -1841,6 +1849,8 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
 'noemailtext' => 'Disse Bruker hett kene güllige E-Mail-Adress angeven.',
 'nowikiemailtitle' => 'E-Mails sünd nich verlöövt',
 'nowikiemailtext' => 'Disse Bruker will vun annere Brukers keen E-Mails tostüürt kriegen.',
+'emailusername' => 'Brukernaam:',
+'emailusernamesubmit' => 'Wedder',
 'email-legend' => 'en annern Bruker op {{SITENAME}} en E-Mail tostüren',
 'emailfrom' => 'Vun:',
 'emailto' => 'An:',
@@ -1876,7 +1886,7 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
 'watchnochange' => 'Kene Siet op dien Oppasslist is in den wiesten Tietruum ännert worrn.',
 'watchlist-details' => '{{PLURAL:$1|Ene Siet is|$1 Sieden sünd}} op dien Oppasslist (ahn Diskuschoonssieden).',
 'wlheader-enotif' => 'Benarichtigen per E-Mail is anstellt.',
-'wlheader-showupdated' => "Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
+'wlheader-showupdated' => "Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
 'watchmethod-recent' => 'letzte Ännern no Oppasslist pröven',
 'watchmethod-list' => 'Oppasslist na letzte Ännern nakieken',
 'watchlistcontains' => 'Diene Oppasslist bargt {{PLURAL:$1|ene Siet|$1 Sieden}}.',
@@ -2126,6 +2136,9 @@ De jüngste Indrag in dat Sperr-Logbook wart ünnen wiest:',
 'whatlinkshere-filters' => 'Filters',
 
 # Block/unblock
+'autoblockid' => 'Autoblock #$1',
+'block' => 'Bruker blocken',
+'unblock' => 'Bruker freegeven',
 'blockip' => 'IP-Adress blocken',
 'blockip-title' => 'Bruker sperren',
 'blockip-legend' => 'Bruker blocken',
@@ -2167,6 +2180,7 @@ Op de [[Special:BlockList|IP-Blocklist]] is en List vun alle Blocks to finnen.',
 'ipusubmit' => 'Disse Sperr opheven',
 'unblocked' => '[[User:$1|$1]] freegeven',
 'unblocked-id' => 'Sperr $1 freegeven',
+'blocklist' => 'Sparrte Brukers',
 'ipblocklist' => 'Sparrte Brukers',
 'ipblocklist-legend' => 'Blockten Bruker finnen',
 'ipblocklist-submit' => 'Söken',
@@ -2337,6 +2351,8 @@ Wenn du blot de aktuelle hebben wist, kannst du ok en Lenk bruken, to’n Bispee
 'allmessagescurrent' => 'Text nu',
 'allmessagestext' => 'Dit is de List vun de Systemnarichten, de dat in den MediaWiki-Naamruum gifft.',
 'allmessagesnotsupportedDB' => '{{ns:special}}:Allmessages is nich ünnerstütt, vun wegen dat wgUseDatabaseMessages utstellt is.',
+'allmessages-filter-all' => 'All',
+'allmessages-language' => 'Spraak:',
 'allmessages-filter-submit' => 'Los',
 
 # Thumbnails
@@ -2474,10 +2490,12 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
 # Attribution
 'anonymous' => '{{PLURAL:$1|Anonym Bruker|Anonyme Brukers}} vun {{SITENAME}}',
 'siteuser' => '{{SITENAME}}-Bruker $1',
+'anonuser' => '{{SITENAME}} anonym  Bruker user $1',
 'lastmodifiedatby' => 'Disse Siet weer dat letzte Maal $2, $1 vun $3 ännert.',
 'othercontribs' => 'Grünnt op Arbeid vun $1.',
 'others' => 'annere',
 'siteusers' => '{{SITENAME}}-{{PLURAL:$2|Bruker|Brukers}} $1',
+'anonusers' => '{{SITENAME}} anonym {{PLURAL:$2|user|users}} $1',
 'creditspage' => 'Sieten-Autoren',
 'nocredits' => 'Dor is keen Autorenlist för disse Siet verfögbor.',
 
@@ -2489,11 +2507,18 @@ All Transwiki-Import-Akschonen staht later ok in dat [[Special:Log/import|Import
 'spam_reverting' => 'Trüchdreiht na de letzte Version ahn Lenken na $1.',
 'spam_blanking' => 'All Versionen harrn Lenken na $1, rein maakt.',
 
+# Info page
+'pageinfo-title' => 'Informatschoon för "$1"',
+'pageinfo-article-id' => 'Sied-ID',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-category-info' => 'Kategorieinformatschoon',
+'pageinfo-category-pages' => 'Tall vun Sied',
+'pageinfo-category-subcats' => 'TAll vun Ünnerkategorien',
+
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Kölsch Blau',
-'skinname-chick' => 'Küken',
 
 # Patrolling
 'markaspatrolleddiff' => 'As nakeken marken',
@@ -2536,6 +2561,7 @@ $1',
 'file-nohires' => 'Gifft dat Bild nich grötter.',
 'svg-long-desc' => 'SVG-Datei, Utgangsgrött: $1 × $2 Pixel, Dateigrött: $3',
 'show-big-image' => 'Dat Bild wat grötter',
+'show-big-image-size' => '$1 × $2 Pixels',
 'file-info-gif-looped' => 'löppt as Slööp',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|Bild|Biller}}',
 'file-info-png-looped' => 'löppt as Slööp',
@@ -2581,7 +2607,7 @@ Wiedere warrt standardmatig nich anwiest:
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breed',
 'exif-imagelength' => 'Hööchd',
 'exif-bitspersample' => 'Bits je Farvkomponent',
@@ -2694,8 +2720,12 @@ Wiedere warrt standardmatig nich anwiest:
 'exif-gpsareainformation' => 'Naam vun dat GPS-Rebeet',
 'exif-gpsdatestamp' => 'GPS-Datum',
 'exif-gpsdifferential' => 'GPS-Differentialkorrektur',
+'exif-source' => 'Born',
+'exif-writer' => 'Schriever',
+'exif-languagecode' => 'Spraak',
+'exif-iimcategory' => 'Kategorie',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Unkomprimeert',
 
 'exif-unknowndate' => 'Unbekannt Datum',
@@ -2843,6 +2873,18 @@ Wiedere warrt standardmatig nich anwiest:
 'exif-gpsdirection-t' => 'Wohre Richtung',
 'exif-gpsdirection-m' => 'Magneetsch Richtung',
 
+'exif-dc-publisher' => 'Verleger',
+
+'exif-iimcategory-clj' => 'Kriminalität un Recht',
+'exif-iimcategory-edu' => 'Uptucht',
+'exif-iimcategory-hth' => 'Gesundheit',
+'exif-iimcategory-lab' => 'Arbeit',
+'exif-iimcategory-pol' => 'Politik',
+'exif-iimcategory-rel' => 'Religion un Gloov',
+'exif-iimcategory-sci' => 'Wetenschap un Technologie',
+'exif-iimcategory-spo' => 'Sport',
+'exif-iimcategory-wea' => 'Wedder',
+
 # External editor support
 'edit-externally' => 'Änner disse Datei mit en extern Programm',
 'edit-externally-help' => '(Lees de [//www.mediawiki.org/wiki/Manual:External_editors Installatschoonshelp] wenn du dor mehr to weten wullt)',
@@ -2901,6 +2943,12 @@ Wist du de Siet würklich nee anleggen?",
 'confirm-purge-top' => 'Den Cache vun disse Siet leddig maken?',
 'confirm-purge-bottom' => 'Maakt den Cache vun en Sied leddig un sorgt dor för dat de aktuelle Version wiest warrt.',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'Jo',
+'confirm-watch-top' => 'Disse Siet to de Oppasslist hentofögen',
+'confirm-unwatch-button' => 'Jo',
+'confirm-unwatch-top' => 'Disse Siet vun de Oppasslist löschen',
+
 # Multipage image navigation
 'imgmultipageprev' => '← vörige Siet',
 'imgmultipagenext' => 'nächste Siet →',
@@ -2961,6 +3009,9 @@ Du kannst ok de [[Special:EditWatchlist|normale Sied to’n Ännern]] bruken.',
 'watchlisttools-edit' => 'Oppasslist ankieken un ännern',
 'watchlisttools-raw' => 'Oppasslist as Textlist ännern',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskusschoon]])',
+
 # Core parser functions
 'unknown_extension_tag' => 'Unbekannt Extension-Tag „$1“',
 'duplicate-defaultsort' => 'Wohrschau: De DEFAULTSORTKEY „$2“ överschrifft den vörher bruukten Slötel „$1“.',
@@ -2986,14 +3037,7 @@ Du kannst ok de [[Special:EditWatchlist|normale Sied to’n Ännern]] bruken.',
 'version-software' => 'Installeerte Software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
-
-# Special:FilePath
-'filepath' => 'Dateipadd',
-'filepath-page' => 'Datei:',
-'filepath-submit' => 'Los',
-'filepath-summary' => 'Disse Spezialsiet gifft den kumpletten Padd för ene Datei trüch. Biller warrt in vull Oplösen wiest, annere Datein warrt glieks mit dat Programm opropen, dat för de Soort Datein instellt is.
-
-Geev den Dateinaam ahn den Tosatz „{{ns:file}}:“ an.',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Söök na Datein, de jüst gliek sünd',
index 031dead..d339b04 100644 (file)
@@ -146,7 +146,7 @@ $magicWords = array(
        'img_middle'                => array( '1', 'midden', 'middle' ),
        'img_bottom'                => array( '1', 'benejen', 'beneden', 'bottom' ),
        'img_text_bottom'           => array( '1', 'tekste-benejen', 'tekst-beneden', 'text-bottom' ),
-       'img_link'                  => array( '1', 'verwiezing=$1', 'verwijzing=$1', 'link=$1' ),
+       'img_link'                  => array( '1', 'verwiezing=$1', 'verwijzing=$1', 'koppeling=$1', 'link=$1' ),
        'sitename'                  => array( '1', 'WEBSTEENAAM', 'SITENAAM', 'SITENAME' ),
        'ns'                        => array( '0', 'NR:', 'NS:' ),
        'localurl'                  => array( '0', 'LOKALEURL', 'LOCALURL:' ),
@@ -179,7 +179,7 @@ $magicWords = array(
        'raw'                       => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
        'displaytitle'              => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'WEERGEGEVENTITEL', 'DISPLAYTITLE' ),
        'newsectionlink'            => array( '1', '__NIEJESECTIEVERWIEZING__', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
-       'nonewsectionlink'          => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__NONEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEKOPPELING__', '__NONEWSECTIONLINK__' ),
        'currentversion'            => array( '1', 'DISSEVERSIE', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
        'urlencode'                 => array( '0', 'URLKODEREN', 'URLCODEREN', 'CODEERURL', 'URLENCODE:' ),
        'anchorencode'              => array( '0', 'ANKERKODEREN', 'ANKERCODEREN', 'CODEERANKER', 'ANCHORENCODE' ),
@@ -336,8 +336,6 @@ $messages = array(
 'tog-shownumberswatching' => 't Antal gebrukers bekieken die disse zied volgt',
 'tog-oldsig' => 'Bestaonde haandtekening:',
 'tog-fancysig' => 'Ondertekening zien as wikitekste (zonder automatiese verwiezing)',
-'tog-externaleditor' => 'Standard n externe tekstbewarker gebruken (allinnig veur gevorderden - veur disse funksie bin spesiale instellingen neudig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informasie]).',
-'tog-externaldiff' => 'Standard n extern vergeliekingsprogramma gebruken (allinnig veur gevorderden - veur disse funksie bin spesiale instellingen neudig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informasie]).',
 'tog-showjumplinks' => '"Gao naor"-verwiezingen toelaoten',
 'tog-uselivepreview' => 'Gebruuk "rechtstreeks naokieken" (mu\'j JavaScript veur hebben - experimenteel)',
 'tog-forceeditsummary' => 'Geef n melding bie n lege samenvatting',
@@ -352,10 +350,11 @@ $messages = array(
 'tog-showhiddencats' => 'Laot verbörgen kategorieën zien',
 'tog-noconvertlink' => 'Ziednaamkonversie uutschakelen',
 'tog-norollbackdiff' => 'Wiezigingen vortlaoten nao t weerummedreien',
+'tog-useeditwarning' => "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
 
 'underline-always' => 'Altied',
 'underline-never' => 'Nooit',
-'underline-default' => 'Standardinstelling',
+'underline-default' => 'Standard in joew vormgeving of webkieker',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Lettertype veur de tekste t bewarkingsveld:',
@@ -440,7 +439,8 @@ $messages = array(
 'newwindow' => '(niej vienster)',
 'cancel' => 'Aofbreken',
 'moredotdotdot' => 'Meer...',
-'mypage' => 'Mien gebrukerszied',
+'morenotlisted' => 'Meer niet in de lieste...',
+'mypage' => 'Gebrukerszied',
 'mytalk' => 'Mien overleg',
 'anontalk' => 'Overlegzied veur dit IP-adres',
 'navigation' => 'Navigasie',
@@ -463,7 +463,7 @@ $messages = array(
 'vector-action-protect' => 'Beveiligen',
 'vector-action-undelete' => 'Weerummeplaotsen',
 'vector-action-unprotect' => 'Beveiliging wiezigen',
-'vector-simplesearch-preference' => 'Verbeterde zeuksuggesties anzetten (allinnig mit Vector-vormgeving)',
+'vector-simplesearch-preference' => 'Vereenvoudigd zeuken anzetten (allinnig mit Vector-vormgeving)',
 'vector-view-create' => 'Anmaken',
 'vector-view-edit' => 'Bewarken',
 'vector-view-history' => 'Geschiedenisse bekieken',
@@ -473,6 +473,7 @@ $messages = array(
 'namespaces' => 'Naamruumtes',
 'variants' => 'Variaanten',
 
+'navigation-heading' => 'Navigasiemenu',
 'errorpagetitle' => 'Foutmelding',
 'returnto' => 'Weerumme naor $1.',
 'tagline' => 'Van {{SITENAME}}',
@@ -680,7 +681,7 @@ Zeukopdrachte: $2',
 'viewsource-title' => 'Bron bekieken van $1',
 'actionthrottled' => 'Haandeling tegenehöllen',
 'actionthrottledtext' => "As maotregel tegen t plaotsen van ongewunste verwiezingen, is t antal keren da'j disse haandeling in n korte tied uutvoeren kunnen beteund. Je hebben de limiet overschrejen. Probeer t over n antal minuten weer.",
-'protectedpagetext' => 'Disse zied is beveiligd um bewarkingen te veurkoemen.',
+'protectedpagetext' => 'Disse zied is beveiligd. Bewarken of aandere haandelingen bin niet meugelik.',
 'viewsourcetext' => 'Je kunnen de brontekste van disse zied bewarken en bekieken:',
 'viewyourtext' => "Je kunnen '''joew bewarkingen''' an de brontekste van disse zied bekieken en kopiëren:",
 'protectedinterface' => "Op disse zied steet tekste die gebruukt wörden veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.
@@ -713,10 +714,16 @@ De beheerder gaf hierveur de volgende reden: "$3".',
 
 Je kunnen {{SITENAME}} noen anoniem gebruken of je eigen <span class='plainlinks'>[$1 opniej anmelden]</span> onder disse of n aandere gebrukersnaam.
 t Kan ween dat der wat ziejen bin die weeregeven wörden asof je an-emeld bin totda'j t tussengeheugen van joew webkieker leegmaken.",
+'welcomeuser' => 'Welkom, $1!',
 'yourname' => 'Gebrukersnaam',
+'userlogin-yourname' => 'Gebrukersnaam',
+'userlogin-yourname-ph' => 'Geef joew gebrukersnaam op',
 'yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword-ph' => 'Geef joew wachtwoord op',
 'yourpasswordagain' => 'Opniej invoeren',
 'remembermypassword' => 'Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})',
+'userlogin-remembermypassword' => 'Vanzelf anmelden',
 'securelogin-stick-https' => "Verbunnen blieven via HTTPS naoda'j an-emeld bin",
 'yourdomainname' => 'Joew domein',
 'password-change-forbidden' => 'Je kunnen joew wachtwoord niet wiezigen op disse wiki.',
@@ -729,13 +736,15 @@ t Kan ween dat der wat ziejen bin die weeregeven wörden asof je an-emeld bin to
 'logout' => 'Aofmelden',
 'userlogout' => 'Aofmelden',
 'notloggedin' => 'Niet an-emeld',
+'userlogin-noaccount' => "He'j nog gien gebrukersnaam?",
+'userlogin-joinproject' => 'Over {{SITENAME}}',
 'nologin' => "He'j nog gien gebrukersnaam? '''$1'''.",
 'nologinlink' => 'Maak n gebrukersprofiel an',
 'createaccount' => 'Niej gebrukersprofiel anmaken',
 'gotaccount' => "Stao'j al in-eschreven? '''$1'''.",
 'gotaccountlink' => 'Anmelden',
 'userlogin-resetlink' => "Bi'j de anmeldgegevens kwiet?",
-'createaccountmail' => 'per netpost',
+'createaccountmail' => 'Gebruuk n tiejelik wachtwoord dat joe netzelde is en stuur t naor t netpostadres dat hieronder steet',
 'createaccountreason' => 'Reden:',
 'badretype' => "De wachtwoorden die'j in-etikt hebben bin niet liek alleens.",
 'userexists' => 'Disse gebrukersnaam is al gebruuk.
@@ -1070,6 +1079,14 @@ t Schient dat t vortedaon is.',
 'edit-already-exists' => 'De zied kon niet an-emaakt wörden.
 t Besteet al.',
 'defaultmessagetext' => 'Standardtekste',
+'editwarning-warning' => "A'j disse zied aofsluten dan kan t ween dat der wieziging die'j emaakt hebben kwiet raken.
+A'j an-emeld bin, dan ku'j disse waorschuwing uutzetten in t tabblad \"Bewarken\" in joew veurkeuren.",
+
+# Content models
+'content-model-wikitext' => 'wikitekste',
+'content-model-text' => 'tekste zonder opmaak',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Waorschuwing: disse zied gebruukt te veule kostbaore parserfunksies.
@@ -1320,7 +1337,7 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'search-interwiki-default' => '$1 resultaoten:',
 'search-interwiki-more' => '(meer)',
 'search-relatedarticle' => 'Verwaant',
-'mwsuggest-disable' => 'Anbevelingen via AJAX uutschakelen',
+'mwsuggest-disable' => 'Zeuksuggesties uutzetten',
 'searcheverything-enable' => 'In alle naamruumten zeuken',
 'searchrelated' => 'verwaant',
 'searchall' => 'alles',
@@ -1340,15 +1357,6 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'search-external' => 'Extern zeuken',
 'searchdisabled' => 'Zeuken in {{SITENAME}} is niet meugelik. Je kunnen gebruukmaken van Google. De gegevens over {{SITENAME}} bin misschien niet bie-ewörken.',
 
-# Quickbar
-'qbsettings' => 'Lieste mit ziejen',
-'qbsettings-none' => 'Gien',
-'qbsettings-fixedleft' => 'Links, vaste',
-'qbsettings-fixedright' => 'Rechts, vaste',
-'qbsettings-floatingleft' => 'Links, zweven',
-'qbsettings-floatingright' => 'Rechts, zweven',
-'qbsettings-directionality' => 'Vaste, aofhankelik van de schriefrichtige van joew taal',
-
 # Preferences page
 'preferences' => 'Veurkeuren',
 'mypreferences' => 'Mien veurkeuren',
@@ -1427,8 +1435,8 @@ Disse haandeling kan niet ongedaonemaakt wörden.',
 'prefs-emailconfirm-label' => 'Netpostbevestiging:',
 'prefs-textboxsize' => 'Aofmetingen bewarkingsscharm',
 'youremail' => 'Netpostadres (niet verplicht) *',
-'username' => 'Gebrukersnaam:',
-'uid' => 'Gebrukersnummer:',
+'username' => '{{GENDER:$1|Gebrukersnaam}}:',
+'uid' => '{{GENDER:$1|Gebrukersnummer}}:',
 'prefs-memberingroups' => 'Lid van {{PLURAL:$1|groep|groepen}}:',
 'prefs-registration' => 'Registrasiedaotum:',
 'yourrealname' => 'Echte naam (niet verplicht)',
@@ -1891,7 +1899,6 @@ Um beveiligingsredens is img_auth.php uutezet.',
 'http-read-error' => 'Fout bie t lezen van HTTP',
 'http-timed-out' => 'Wachttied bie t HTTP verzeuk',
 'http-curl-error' => 'Fout bie t ophaolen van t webadres: $1',
-'http-host-unreachable' => 'Kon webadres niet bereiken.',
 'http-bad-status' => 'Der is n probleem mit t HTTP-verzeuk: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2044,6 +2051,8 @@ Vergeet niet de verwiezingen nao te kieken veurda\'j de mal vortdoon.',
 Feitelik mutten ze rechtstreeks verwiezen naor t juuste onderwarp.<br />
 Ziejen wörden ezien as n deurverwieszied, as de mal gebruukt wörden die vermeld steet op [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop-submit' => 'Zeuk',
+
 'doubleredirects' => 'Dubbele deurverwiezingen',
 'doubleredirectstext' => 'Op disse lieste staon alle ziejen die deurverwiezen naor aandere deurverwiezingen.
 Op elke regel steet de eerste en de tweede deurverwiezing, daorachter steet de doelzied van de tweede deurverwiezing.
@@ -2297,7 +2306,7 @@ Toekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wör
 'watchnochange' => 'Gien van de ziejen op joew volglieste is in disse periode ewiezigd',
 'watchlist-details' => 'Der {{PLURAL:$1|steet één zied|staon $1 ziejen}} op joew volglieste, zonder de overlegziejen mee-erekend.',
 'wlheader-enotif' => 'Je kriegen bericht per netpost',
-'wlheader-showupdated' => "Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
+'wlheader-showupdated' => "Ziejen die sinds joew leste bezeuk bie-ewörken bin, staon '''vet-edrokt'''.",
 'watchmethod-recent' => "leste wiezigingen an t naokieken op ziejen die'j volgen",
 'watchmethod-list' => 'Kik joew nao volglieste veur de leste wiezigingen',
 'watchlistcontains' => 'Der {{PLURAL:$1|steet 1 zied|staon $1 ziejen}} op joew volglieste.',
@@ -2527,7 +2536,7 @@ $1',
 'blanknamespace' => '(Heufdnaamruumte)',
 
 # Contributions
-'contributions' => 'Biedragen van disse gebruker',
+'contributions' => '{{GENDER:$1|Biedragen van disse gebruker}}',
 'contributions-title' => 'Biedragen van $1',
 'mycontris' => 'Mien biedragen',
 'contribsub2' => 'Veur $1 ($2)',
@@ -3053,15 +3062,15 @@ Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet
 'pageinfo-magic-words' => '{{PLURAL:$1|Magies woord|Magiese woorden}} ($1)',
 'pageinfo-hidden-categories' => 'Verbörgen {{PLURAL:$1|kategorie|kategorieën}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Gebruukten mal|Gebruukten mallen}} ($1)',
+'pageinfo-toolboxlink' => 'Informasie over disse zied',
+'pageinfo-redirectsto' => 'Verwis deur naor',
+'pageinfo-redirectsto-info' => 'informasie',
+'pageinfo-contentpage' => 'Eteld as zied mit inhoud',
+'pageinfo-contentpage-yes' => 'Ja',
 
 # Skin names
-'skinname-standard' => 'Klassiek',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keuls blauw',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MienSkin',
-'skinname-chick' => 'Deftig',
-'skinname-simple' => 'Eenvoudig',
 'skinname-modern' => 'Niejmoeds',
 
 # Patrolling
@@ -3137,6 +3146,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 ure|$1 uren}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
 'ago' => '$1 eleen',
+'just-now' => 'onderlest',
 
 # Bad image list
 'bad_image_list' => 'De opmaak is as volgt:
@@ -3166,7 +3176,7 @@ Aandere velden wörden verbörgen.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Wiedte',
 'exif-imagelength' => 'Heugte',
 'exif-bitspersample' => 'Bits per komponent',
@@ -3344,7 +3354,7 @@ Aandere velden wörden verbörgen.
 'exif-originalimageheight' => 'Heugte van de aofbeelding veur biesniejen',
 'exif-originalimagewidth' => 'Breedte van de aofbeelding veur biesniejen',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Niet ekomprimeerd',
 'exif-compression-2' => 'CCITT-groep 3 1-dimensionale an-epasten "Huffman run length"-kodering',
 'exif-compression-3' => 'CCITT-groep 3 faxcodering',
@@ -3751,14 +3761,6 @@ Samen mit dit programma heur je n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van de
 'version-entrypoints-header-entrypoint' => 'Ingang',
 'version-entrypoints-header-url' => 'Webadres',
 
-# Special:FilePath
-'filepath' => 'Bestaandslokasie',
-'filepath-page' => 'Bestaand:',
-'filepath-submit' => 'Zeuken',
-'filepath-summary' => 'Disse spesiale zied gif t hele pad veur n bestaand. 
-Aofbeeldingen wörden in resolusie helemaole weeregeven. 
-Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma opend.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dubbele bestaanden zeuken',
 'fileduplicatesearch-summary' => 'Dubbele bestaanden zeuken op baosis van de hashweerde.',
@@ -3848,6 +3850,8 @@ Aandere bestaandstypen wörden gelieke in t mit t MIME-type verbunnen programma
 'htmlform-submit' => 'Opslaon',
 'htmlform-reset' => 'Wiezigingen ongedaonmaken',
 'htmlform-selectorother-other' => 'Aanders',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
 
 # SQLite database support
 'sqlite-has-fts' => 'Versie $1 mit ondersteuning veur "full-text" zeuken',
index 3eb03d1..5b2ad6e 100644 (file)
@@ -83,8 +83,6 @@ $messages = array(
 'tog-shownumberswatching' => 'निगरानी गरिरहेका प्रयोगकर्ताहरुको संख्या देखाउने',
 'tog-oldsig' => 'वर्तमान हस्ताक्षर:',
 'tog-fancysig' => 'मेरो दस्तखतलाई विकि पाठको रुपमा लिने(स्वत सम्वन्ध बिना)',
-'tog-externaleditor' => 'पूर्वनिर्धारित रुपमा बाह्य सम्पादक प्रयोग गर्नुहोस् (विज्ञहरुको लागि मात्र, तपाईको कम्प्युटरमा विशेष अनुकुलता आवश्यक हुन्छ [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'पूर्वनिर्धारित रुपमा बाह्य diff प्रयोग गर्नुहोस (विज्ञ प्रयोगकर्ताहरुको लागि मात्र, तपाईंको कम्प्युटरमा विशेष अनुकुलता आवश्यक हुन्छ [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => '"जाने" पहुँच सम्वन्ध सक्रिय पार्ने',
 'tog-uselivepreview' => 'प्रत्यक्ष पूर्वरुप प्रयोग गर्नुहोस् ( जाभा स्क्रिप्ट आवश्यक) (प्रयोगात्मक)',
 'tog-forceeditsummary' => 'खाली सम्पादन सार प्रविष्टि गरेमा मलाई सोध्ने',
@@ -1067,15 +1065,6 @@ $1",
 हाललाई तपाईले गूगलद्वारा खोज्न सक्नुहुन्छ ।
 याद गर्नुहोस् उनीहरुको {{SITENAME}}को सूची सामग्री पुरानो भएको हुनसक्छ ।',
 
-# Quickbar
-'qbsettings' => 'क्विकबार',
-'qbsettings-none' => 'कुनैपनि होइन',
-'qbsettings-fixedleft' => 'देब्रे निश्चित गरिएको',
-'qbsettings-fixedright' => 'दाहिने निश्चित गरिएको',
-'qbsettings-floatingleft' => 'देब्रे तैरने',
-'qbsettings-floatingright' => 'दाहिने तैरने',
-'qbsettings-directionality' => 'तपाईको भाषाको लेखाइ दिशाको आधारमा मिलान गरिएको छ',
-
 # Preferences page
 'preferences' => 'रोजाईहरू',
 'mypreferences' => 'प्राथमिकताहरु',
@@ -1546,7 +1535,6 @@ $1',
 'http-read-error' => 'HTTP बुझाइमा त्रुटि।',
 'http-timed-out' => 'HTTP माँगिएको समय सकियो।',
 'http-curl-error' => 'URL $1 लिनमा त्रुटि',
-'http-host-unreachable' => 'URL मा पुग्न सकिएन।',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URLमा पुग्न सकिएन',
@@ -1886,8 +1874,8 @@ $1',
 'notvisiblerev' => 'पूर्वावलोकन हटाइयो',
 'watchnochange' => 'दिइएको समय अवधीभित्र निगरानी सुचीमा रहेका कुनै पनि सामाग्री सम्पादन भएको छैनन ।',
 'watchlist-details' => 'तपाईको निगरानी सूचीमा रहेका{{PLURAL:$1|$1 पृष्ठ|$1 पृष्ठहरु}}वार्तालापमा पृष्ठमा गनिएका छैनन् ।',
-'wlheader-enotif' => 'ईमेलद्वारा जानकारी गराउने तरिका सक्रिय गरियो ।',
-'wlheader-showupdated' => "तपाइले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई '''गाढा''' गरेर देखाइएको छ ।",
+'wlheader-enotif' => 'ईमेलद्वारा जानकारी गराउने तरिका सक्रिय गरियो ।',
+'wlheader-showupdated' => "तपाइले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई '''गाढा''' गरेर देखाइएको छ ।",
 'watchmethod-recent' => 'निगरानी सुचीमा रहेका पृष्ठमा गरिएका सम्पादनहरु जाँच्दै',
 'watchmethod-list' => 'सम्पदान गरिएका निगरानी सुचीमा रहेका पृष्ठहरुको सम्पादन जाँच्दै',
 'watchlistcontains' => 'तपाईको निगरानी सुचीमा $1 {{PLURAL:$1|पृष्ठ|पृष्ठहरु}}रहेका छन् ।',
@@ -2520,17 +2508,11 @@ $1को बन्देजको कारण : "$2" हो',
 
 # Stylesheets
 'common.css' => '/* यहाँ राखिएका CSS सबै खोलहरुमा लागु हुनेछन् */',
-'standard.css' => '/* यहाँ राखिएका CSS हरुले स्तरीय खोल प्रयोग गर्ने प्रयोगकर्ताहरुलाई प्रभावित पार्छ  */',
-'nostalgia.css' => '/* यहाँ राखिएको CSS ले नस्टाल्जिया स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'cologneblue.css' => '/* यहाँ राखिएको CSS ले कोलोग्ने ब्लु स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'monobook.css' => '/* यहाँ राखिएको CSS ले मोनोबुक स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
-'myskin.css' => '/* यहाँ राखिएको CSS ले माइस्किन स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
-'chick.css' => '/* यहाँ राखिएको CSS ले चिक स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
-'simple.css' => '/* यहाँ राखिएको CSS ले सिम्पल स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'modern.css' => '/* यहाँ राखिएको CSS ले मोनोबुक मोडर्न प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'vector.css' => '/* यहाँ राखिएको CSS ले भेक्टर स्किनको प्रयोगकर्ताहरुलाई प्रभावित गर्ने छ  */',
 'print.css' => '/* यहाँ राखिएको CSS मुद्रण नतिजालाई प्रभावित गर्छ  */',
-'handheld.css' => '/* यहाँ राखिएको CSS ले हाते मेसिनहरु(मोबाईल) स्किनलाई प्रभावित गर्छ जुन $wgHandheldStyle मा निर्धारण गरिएको छ  */',
 
 # Metadata
 'notacceptable' => 'विकि सर्भर तपाइको क्लाइन्टलाइ जुन प्रकारको डाटा चाहिन्छ त्यस प्रकारले दिन सक्दैन।',
@@ -2565,13 +2547,8 @@ $1को बन्देजको कारण : "$2" हो',
 'pageinfo-authors' => 'फरक सम्पादकरुको संख्या',
 
 # Skin names
-'skinname-standard' => 'क्लासिक',
-'skinname-nostalgia' => 'नोस्टाल्जिया',
 'skinname-cologneblue' => 'कोलोग्ने निलो',
 'skinname-monobook' => 'मोनोबुक',
-'skinname-myskin' => 'माइस्किन',
-'skinname-chick' => 'चिक',
-'skinname-simple' => 'सिम्पल',
 'skinname-modern' => 'मोडर्न',
 'skinname-vector' => 'भेक्टर',
 
@@ -2676,7 +2653,7 @@ Others will be hidden by default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'चौडाइ',
 'exif-imagelength' => 'उचाई',
 'exif-bitspersample' => 'घटक प्रति बिट्स',
@@ -2850,7 +2827,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'नखादिएको(कम्प्रेस नगरिएको)',
 'exif-compression-2' => 'CCITT समूह 3 1-Dimensional Modified Huffman संचालन इन्कोडिङ्ग',
 'exif-compression-3' => 'CCITT Group 3  फ्याक्स इन्कोडिङ्ग',
@@ -3323,15 +3300,6 @@ $5
 'version-software-product' => 'उत्पादन',
 'version-software-version' => 'संस्करण',
 
-# Special:FilePath
-'filepath' => 'फाइल मार्ग:',
-'filepath-page' => 'फाइल',
-'filepath-submit' => 'जाने',
-'filepath-summary' => 'यस पृष्ठले फाइको पूरा बाटो(पाथ) दिन्छ ।
-तस्विरहु पूरा रिजोल्युशनमा देखाइन्छ अरु फाइहरु निका सम्बन्धित अनुप्रयोगहरुसँग खोलिन्छन ।
-
- "{{ns:file}}:" प्रिफिक्स(पूर्वसर्ग) बिना फाइल नाम प्रविष्ट गर्नुहोस् । .',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'नक्कल फाइल खोज्ने',
 'fileduplicatesearch-summary' => 'ह्यास मानको आधारमा दुरुस्त नक्कल फाइहरु खोज्ने ।',
index d9cd17d..939f036 100644 (file)
@@ -46,7 +46,7 @@ $messages = array(
 'tog-underline' => 'लिङ्कतेत अन्दरलाइन यानादिसँ:',
 'tog-justify' => 'अनुच्छेद धंकादिसँ',
 'tog-hideminor' => 'न्हुगु हिलेज्याय् चिधंगु सम्पादन सुचुकादिसँ',
-'tog-extendwatchlist' => 'वाचलिस्टयात परिमार्जित याना सकल स्वेज्युगु हिलेज्या क्यनादिसँ',
+'tog-extendwatchlist' => 'वाचलिस्टयात परिमार्जित याना सकल स्वेज्युगु हिलेज्या क्यनादिसँ, दकले लिपाया जक्क मखु',
 'tog-usenewrc' => 'एन्ह्यान्स्ड् न्हुगु हिलेज्या (जाभास्क्रिप्ट)',
 'tog-numberheadings' => 'अटो-ल्याखँ हेडिङ',
 'tog-showtoolbar' => 'सम्पादन टुलबार क्यनादिसँ (जाभास्क्रिप्ट)',
@@ -69,8 +69,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'जिगु इ-मेल थाय्‌बाय्‌ नोटिफिकेसन इ-मेलय् क्यनादिसँ',
 'tog-shownumberswatching' => 'स्वयाच्वंपिं छ्यलामितेगु ल्याखँ क्यनादिसँ',
 'tog-fancysig' => 'कच्चा हस्ताक्षर (अटोम्याटिक लिङ्क मदेःकः)',
-'tog-externaleditor' => 'डिफल्टं एक्स्टर्नल एडिटर छ्यलादिसँ (एक्स्पर्टतेगु निंतिं जक्क, छिगु कम्प्युटरय् विषेश सेटिङ माः)',
-'tog-externaldiff' => 'एक्स्टर्नल डिफ् (diff) डिफल्टं छ्यलादिसँ (एक्स्पर्टतेगु निंतिं जक्क, छिगु कम्प्युटरय् विषेश सेटिङ माः)',
 'tog-showjumplinks' => '"जम्प टु" एसिसिबिलिटी लिङ्क इनेबल यानादिसँ',
 'tog-uselivepreview' => 'लाइभ प्रिभ्यु (जाभास्क्रिप्ट) इनेबल यानादिसँ (परिक्षणकाल)',
 'tog-forceeditsummary' => 'सम्पादन सार खालि त्वतिबिले जित सशंकित यानादिसँ',
@@ -166,9 +164,19 @@ $messages = array(
 # Cologne Blue skin
 'qbfind' => 'मालादिसँ',
 'qbedit' => 'सम्पादन',
+'qbpageoptions' => 'थ्व पौ',
+'qbmyoptions' => 'जिगु पौ',
+'qbspecialpages' => 'विशेष पौ',
 'faq' => 'आपालं न्यनिगु न्ह्यसः (FAQ)',
 'faqpage' => 'Project:आपालं न्यनिगु न्ह्यसःत (FAQ)',
 
+# Vector skin
+'vector-action-move' => 'संकादिसँ',
+'vector-view-create' => 'दयेकादिसँ',
+'vector-view-edit' => 'सम्पादन',
+'vector-view-history' => 'इतिहास स्वयादिसँ',
+'vector-view-view' => 'ब्वनादिसँ',
+
 'returnto' => '$1य् लिहाँझासँ।',
 'tagline' => '{{SITENAME}}नं',
 'help' => 'ग्वहालि',
@@ -182,8 +190,13 @@ $messages = array(
 'printableversion' => 'ध्वायेज्युगु संस्करण',
 'permalink' => 'स्थायी लिङ्क',
 'print' => 'ध्वानादिसँ',
+'view' => 'क्यनादिसँ',
 'edit' => 'सम्पादन',
+'create' => 'दयेकादिसँ',
 'editthispage' => 'थ्व पौ सम्पादन यानादिसं',
+'create-this-page' => 'थ्व पौ दयेकादिसँ',
+'delete' => 'हुयादिसँ (दिलित)',
+'deletethispage' => 'थ्व पौ हुयादिसँ (दिलित)',
 'newpage' => 'न्हुगु पौ',
 'talkpagelinktext' => 'खँल्हाबँल्हा',
 'specialpage' => 'विषेश पौ',
@@ -192,7 +205,9 @@ $messages = array(
 'toolbox' => 'ज्याब्व सन्दुक',
 'projectpage' => 'ज्याखँ पौ क्येनादिसँ',
 'otherlanguages' => 'मेमेगु भाषाय्',
+'jumpto' => 'थन झासँ:',
 'jumptosearch' => 'मालादिसँ',
+'pool-errorunknown' => 'मस्युगु इरर',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}}या बारेय्',
@@ -228,8 +243,12 @@ $messages = array(
 'youhavenewmessagesmulti' => '$1य् छित न्हुगु सन्देश वगु दु',
 'editsection' => 'सम्पादन',
 'editold' => 'सम्पादन',
+'editlink' => 'सम्पादन',
 'editsectionhint' => 'खण्ड सम्पादन: $1',
 'showtoc' => 'क्यनादिसँ',
+'hidetoc' => 'सुचुकादिसँ',
+'collapsible-expand' => 'चायेकादिसँ',
+'red-link-title' => '$1 (पौ मदु)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'पौ',
@@ -269,9 +288,7 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 'viewsource' => 'स्रोत स्वयादिसँ',
 
 # Login and logout pages
-'welcomecreation' => '== लसकुस, $1! ==
-छिगु खाता चायेके धुंकल।
-छिगु [[Special:Preferences|{{SITENAME}} प्राथमिकता]] हिलिगु लुमंकादिसँ।',
+'welcomeuser' => 'लसकुस, $1जु!',
 'yourname' => 'छ्य्‌लामि नां:',
 'yourpassword' => 'दुथखँग्वः (पासवर्द):',
 'yourpasswordagain' => 'दुथखँग्वः हानं तियादिसँ:',
@@ -284,14 +301,42 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 'nologinlink' => 'खाता न्ह्यथनादिसँ',
 'createaccount' => 'खाता चायेकादिसँ',
 'gotaccountlink' => 'दुहां झासँ',
+'badretype' => 'छिं तियादिगु पासवर्द पाय्‌छि मजु।',
 'loginsuccesstitle' => 'लग इन सफल जुल',
+'emaildisabled' => 'थ्व फाइलं इमेल छ्वयेमफु।',
 'accountcreated' => 'खाता न्ह्येथन',
+'accountcreatedtext' => '$1या निंतिं छ्य्‌लामि खाता चायेकूगु दु।',
 'loginlanguagelabel' => 'भाषा: $1',
 
+# Change password dialog
+'resetpass' => 'पासवर्द हिलादिसँ',
+
+# Special:ChangeEmail
+'changeemail-submit' => 'इ-मेल हिलादिसँ',
+'changeemail-cancel' => 'खारेज',
+
+# Edit page toolbar
+'bold_sample' => 'गाढा आखः',
+'bold_tip' => 'गाढा आखः',
+'italic_sample' => 'बेक्वःगु आखः',
+'italic_tip' => 'बेक्वःगु आखः',
+'link_tip' => 'आन्तरिक लिंक',
+
 # Edit pages
 'summary' => 'सारांश:',
-'savearticle' => 'पौ मुंकादिसं',
-'preview' => 'स्वयादिसं',
+'minoredit' => 'थ्व चिधंगु सम्पादन ख',
+'watchthis' => 'थ्व पौ स्वयादिसँ',
+'savearticle' => 'पौ स्वथनादिसँ',
+'preview' => 'न्हेकिपा',
+'showpreview' => 'न्हेकिपा क्यनादिसँ',
+'showlivepreview' => 'जुथें (लाइभ) न्हेकिपा',
+'showdiff' => 'हिसुझ्वः क्यनादिसँ',
+'anoneditwarning' => "'''न्ह्यःखँ:''' छि लग्द इन मदु। 
+छिगु IP address पौया सम्पादन इतिहासय् स्वथनिगु जुइ।",
+'anonpreviewwarning' => "''छि लग्द इन मदु। थ्व पौ स्वथनादिल धाःसा छिगु IP address थ्व पौया इतिहासय् स्वथनिगु जुइ।''",
+'loginreqtitle' => 'लग इन माःगु',
+'loginreqpagetext' => 'मेमेगु पौ स्वयेत छिं $1 यायेमा/जुइमा।',
+'accmailtitle' => 'पासवर्द छ्वल।',
 'newarticle' => '(न्हु)',
 'note' => "'''होस यानादिसँ:'''",
 'previewnote' => "'''थ्व पूर्वालोकन जक्क ख। छिं यानादिगु सम्पादन स्वथंगु मदुनि!'''",
@@ -300,12 +345,17 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 'yourtext' => 'छिगु आखः',
 'storedversion' => 'स्वथनातगु संस्करण',
 
+# Content models
+'content-model-text' => 'सादा आखः',
+
 # History pages
 'revisionasof' => '$1 तक्कया संस्करण',
 'previousrevision' => '←पुलांगु संस्करण',
 
 # Search results
 'searchhelp-url' => 'Help:धलःपौ',
+'searchprofile-everything' => 'दक्वं',
+'search-result-size' => '$1 ({{PLURAL:$2|1 खँग्वः |$2 खँग्वःत}})',
 'searchrelated' => 'स्वापू दुःगु',
 'searchall' => 'सकल',
 'powersearch' => 'मालादिसँ',
@@ -313,6 +363,7 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 # Preferences page
 'mypreferences' => 'जिगु प्राथमिकता',
 'changepassword' => 'पासवर्द हिलादिसँ',
+'prefs-skin' => 'भुँसा',
 'prefs-datetime' => 'दिं व ई',
 'prefs-personal' => 'छ्य्‌लामि प्रोफाइल',
 'prefs-rc' => 'न्हुगु हिलेज्या',
@@ -321,21 +372,24 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 'username' => 'छ्य्‌लामि नां:',
 'yourrealname' => 'वास्तविक नां:',
 'yourlanguage' => 'भाषा:',
+'gender-male' => 'मिजं',
+'gender-female' => 'मिसा',
 'email' => 'इ-मेल',
 
 # User rights
 'userrights-user-editname' => 'छपू छ्य्‌लामि नां तयादिसँ:',
 
 # Groups
+'group' => 'पुचः',
 'group-user' => 'छ्य्‌लामित',
 'group-bot' => 'बोत',
 
 # Recent changes
-'recentchanges' => 'नà¥\8dहà¥\81à¤\97à¥\81 à¤¹à¤¿à¤²à¥\87à¤\9cà¥\8dया',
+'recentchanges' => 'नà¤\95तिनिया à¤¹à¤¿à¤¸à¥\81à¤\9dà¥\8dवà¤\83',
 'show' => 'क्यनादिसँ',
 
 # Upload
-'upload' => 'सà¤\82à¤\9aिà¤\95ा à¤\9aढ़ाà¤\8fँ',
+'upload' => 'फाà¤\87ल à¤\85पलà¥\8bद à¤¯à¤¾à¤¨à¤¾à¤¦à¤¿à¤¸ँ',
 
 # File description page
 'file-anchor-link' => 'फाइल',
@@ -361,6 +415,9 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 # Special:Categories
 'categories' => 'पुचःत',
 
+# Email user
+'emailusername' => 'छ्य्‌लामि नां (युजर नेम) :',
+
 # Restrictions (nouns)
 'restriction-edit' => 'सम्पादन',
 
@@ -376,10 +433,16 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 # What links here
 'whatlinkshere' => 'थन छु स्वाई',
 
+# Block/unblock
+'contribslink' => 'योगदान',
+
 # Move page
 'movereason' => 'कारण:',
 
 # Tooltip help for the actions
+'tooltip-search' => '{{SITENAME}} मालादिसं',
+'tooltip-search-fulltext' => 'थ्व खँग्वःया निंतिं पौस मालादिसं',
+'tooltip-p-logo' => 'मू पौय् झासँ',
 'tooltip-n-mainpage' => 'मू पौ भ्रमण यानादिसँ',
 'tooltip-n-portal' => 'ज्याझ्वःया बारेय्, छिं छु यायेछिं, गन खँ सीकिगु',
 'tooltip-n-currentevents' => 'जुयाच्वँगु घटनाया लिधँसा तथ्य मालादिसँ',
@@ -392,7 +455,7 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 'tooltip-feed-atom' => 'थ्व पौया Atom फीड',
 'tooltip-t-contributions' => 'थ्व छ्य्‌लामिया योगदानया धलः क्यनादिसँ',
 'tooltip-t-emailuser' => 'थ्व छ्य्‌लामियात इ-मेल छ्वयादिसँ',
-'tooltip-t-upload' => 'सà¤\82à¤\9aिà¤\95ाà¤\8fà¤\81 à¤\9aढ़ाà¤\8fँ',
+'tooltip-t-upload' => 'फाà¤\87ल à¤\85पलà¥\8bद à¤¯à¤¾à¤¨à¤¾à¤¦à¤¿à¤¸ँ',
 'tooltip-t-specialpages' => 'सकल विशेष पौस धलः',
 'tooltip-t-print' => 'थ्व पौस ध्वायेज्युगु संस्करण',
 'tooltip-t-permalink' => 'थ्व पौस थ्व संस्करणया पर्मानेन्ट लिङ्क',
@@ -420,13 +483,8 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 
 # Stylesheets
 'common.css' => '/* थन तःगु CSS सकल स्किनय् छ्य्‌लिगु जुइ */',
-'standard.css' => '/* थन तःगु CSS नं स्ट्याण्डर्ड स्किनया छ्य्‌लामितेत प्रभावित याइ */',
-'nostalgia.css' => '/* थन तःगु CSS नं नोस्ट्याल्जिया स्किनया छ्य्‌लामितेत असर याइ */',
 'cologneblue.css' => '/* थन तःगु CSS नं कोलोन ब्लु स्किनया छ्य्‌लामितेत असर याइ */',
 'monobook.css' => '/* थन तःगु CSS नं मोनोबुक स्किनया छ्य्‌लामितेत असर याइ */',
-'myskin.css' => '/* थन तःगु CSS नं माइस्किन स्किनया छ्य्‌लामितेत असर याइ */',
-'chick.css' => '/* थन तःगु CSS नं चिक स्किनया छ्य्‌लामितेत असर याइ */',
-'simple.css' => '/* थन तःगु CSS नं सिम्पल स्किनया छ्य्‌लामितेत असर याइ */',
 'modern.css' => '/* थन तःगु CSS नं मोडर्न स्किनया छ्य्‌लामितेत असर याइ */',
 'print.css' => '/* थन तःगु CSS नं प्रिन्ट आउटपुटयात असर याइ */',
 'handheld.css' => '/* थन तःगु CSS नं $wgHandheldStyle आधारित ह्याण्डहेल्ड यन्त्रयात असर याइ */',
@@ -434,6 +492,20 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 # Attribution
 'others' => 'मेमेगु',
 
+# Exif tags
+'exif-imagewidth' => 'ब्याः',
+'exif-imagelength' => 'जाः',
+'exif-imagedescription' => 'किपाया नां',
+'exif-make' => 'किपासाः दयेकामि',
+'exif-model' => 'किपासाः मोदेल',
+'exif-software' => 'छ्यलातःगु सफ्तवेयर',
+'exif-artist' => 'च्वमि',
+'exif-copyright' => 'लेखाधिकार थुवा',
+'exif-pixelydimension' => 'किपा ब्याः',
+'exif-pixelxdimension' => 'किपा जाः',
+
+'exif-dc-date' => 'तिथि',
+
 # 'all' in various places, this might be different for inflected languages
 'namespacesall' => 'सकल',
 
index e9f518f..71879af 100644 (file)
@@ -10,6 +10,7 @@
  * @author Annabel
  * @author AvatarTeam
  * @author B4bol4t
+ * @author Basvb
  * @author DasRakel
  * @author Effeietsanders
  * @author Erwin
@@ -43,6 +44,8 @@
  * @author Trijnstel
  * @author Troefkaart
  * @author Tvdm
+ * @author User555
+ * @author WTM
  * @author Wiki13
  * @author לערי ריינהארט
  */
@@ -145,6 +148,8 @@ $magicWords = array(
        'fullpagenamee'             => array( '1', 'VOLLEDIGEPAGINANAAME', 'FULLPAGENAMEE' ),
        'subpagename'               => array( '1', 'DEELPAGINANAAM', 'SUBPAGENAME' ),
        'subpagenamee'              => array( '1', 'DEELPAGINANAAME', 'SUBPAGENAMEE' ),
+       'rootpagename'              => array( '1', 'ROOTPAGINANAAM', 'ROOTPAGENAME' ),
+       'rootpagenamee'             => array( '1', 'ROOTPAGINANAAME', 'ROOTPAGENAMEE' ),
        'basepagename'              => array( '1', 'BASISPAGINANAAM', 'BASEPAGENAME' ),
        'basepagenamee'             => array( '1', 'BASISPAGINANAAME', 'BASEPAGENAMEE' ),
        'talkpagename'              => array( '1', 'OVERLEGPAGINANAAM', 'TALKPAGENAME' ),
@@ -211,6 +216,7 @@ $magicWords = array(
        'raw'                       => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
        'displaytitle'              => array( '1', 'WEERGEGEVENTITEL', 'TOONTITEL', 'DISPLAYTITLE' ),
        'rawsuffix'                 => array( '1', 'V', 'R' ),
+       'nocommafysuffix'           => array( '0', 'GEENSCHEIDINGSTEKEN', 'NOSEP' ),
        'newsectionlink'            => array( '1', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
        'nonewsectionlink'          => array( '1', '__GEENNIEUWKOPJEKOPPELING__', '__GEENNIEUWESECTIELINK__', '__GEENNIEUWKOPJEVERWIJZING__', '__NONEWSECTIONLINK__' ),
        'currentversion'            => array( '1', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
@@ -269,7 +275,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'GebruikerAanmaken' ),
        'Deadendpages'              => array( 'VerwijslozePaginas', 'VerwijslozePagina’s', 'VerwijslozePagina\'s' ),
        'DeletedContributions'      => array( 'VerwijderdeBijdragen' ),
-       'Disambiguations'           => array( 'Doorverwijspagina\'s', 'Doorverwijspaginas' ),
+       'Disambiguations'           => array( 'Doorverwijzingen' ),
        'DoubleRedirects'           => array( 'DubbeleDoorverwijzingen' ),
        'EditWatchlist'             => array( 'VolglijstBewerken' ),
        'Emailuser'                 => array( 'GebruikerE-mailen', 'E-mailGebruiker' ),
@@ -307,6 +313,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'MijnUploads' ),
        'Newimages'                 => array( 'NieuweBestanden', 'NieuweAfbeeldingen' ),
        'Newpages'                  => array( 'NieuwePaginas', 'NieuwePagina’s', 'NieuwePagina\'s' ),
+       'PagesWithProp'             => array( 'PaginasMetEigenschap', 'Pagina\'sMetEigenschap' ),
        'PasswordReset'             => array( 'WachtwoordOpnieuwInstellen' ),
        'PermanentLink'             => array( 'PermanenteVerwijzing' ),
        'Popularpages'              => array( 'PopulairePaginas', 'PopulairePagina’s', 'PopulairePagina\'s' ),
@@ -318,6 +325,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'WillekeurigeDoorverwijzing' ),
        'Recentchanges'             => array( 'RecenteWijzigingen' ),
        'Recentchangeslinked'       => array( 'RecenteWijzigingenGelinkt', 'VerwanteWijzigingen' ),
+       'Redirect'                  => array( 'Doorverwijzen' ),
        'Revisiondelete'            => array( 'VersieVerwijderen', 'HerzieningVerwijderen', 'RevisieVerwijderen' ),
        'Search'                    => array( 'Zoeken' ),
        'Shortpages'                => array( 'KortePaginas', 'KortePagina’s', 'KortePagina\'s' ),
@@ -383,8 +391,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Het aantal gebruikers weergeven dat deze pagina volgt',
 'tog-oldsig' => 'Bestaande ondertekening:',
 'tog-fancysig' => 'Als wikitekst behandelen (zonder automatische koppeling)',
-'tog-externaleditor' => 'Standaard een externe tekstbewerker gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
-'tog-externaldiff' => 'Standaard een extern vergelijkingsprogramma gebruiken (alleen voor experts - voor deze functie zijn speciale instellingen nodig. [//www.mediawiki.org/wiki/Manual:External_editors Meer informatie]).',
 'tog-showjumplinks' => '"ga naar"-toegankelijkheidskoppelingen inschakelen',
 'tog-uselivepreview' => '"live voorvertoning" gebruiken (vereist JavaScript – experimenteel)',
 'tog-forceeditsummary' => 'Een melding geven bij een lege bewerkingssamenvatting',
@@ -399,6 +405,7 @@ $messages = array(
 'tog-showhiddencats' => 'Verborgen categorieën weergeven',
 'tog-noconvertlink' => 'Paginanaamconversie uitschakelen',
 'tog-norollbackdiff' => 'Wijzigingen weglaten na terugdraaien',
+'tog-useeditwarning' => 'U waarschuwen als u een bewerkte pagina die nog niet is opgeslagen wil verlaten',
 
 'underline-always' => 'Altijd',
 'underline-never' => 'Nooit',
@@ -462,6 +469,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 januari',
+'february-date' => '$1 februari',
+'march-date' => '$1 maart',
+'april-date' => '$1 april',
+'may-date' => '$1 mei',
+'june-date' => '$1 juni',
+'july-date' => '$1 juli',
+'august-date' => '$1 augustus',
+'september-date' => '$1 september',
+'october-date' => '$1 oktober',
+'november-date' => '$1 november',
+'december-date' => '$1 december',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorie|Categorieën}}',
@@ -579,7 +598,7 @@ $messages = array(
 'jumptosearch' => 'zoeken',
 'view-pool-error' => 'De servers zijn op het moment helaas overbelast.
 Te veel gebruikers proberen deze pagina te bekijken.
-Wacht alstublieft even voordat u opnieuw toegang probeert te krijgen tot deze pagina.
+Wacht even voordat u opnieuw toegang probeert te krijgen tot deze pagina.
 
 $1',
 'pool-timeout' => 'De maximaal te wachten tijd voor het wachten op een lock is verstreken',
@@ -719,7 +738,7 @@ Mogelijk is deze al door iemand anders verwijderd.',
 'delete-hook-aborted' => 'Het verwijderen is afgebroken door een hook.
 Er is geen toelichting beschikbaar.',
 'badtitle' => 'Ongeldige paginanaam',
-'badtitletext' => 'De naam van de opgevraagde pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikikoppeling.
+'badtitletext' => 'De naam van de opgegeven pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikikoppeling.
 Wellicht bevat de paginanaam niet toegestane tekens.',
 '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.',
@@ -773,9 +792,18 @@ Mogelijk worden nog een aantal pagina's weergegeven alsof u aangemeld bent totda
 'welcomecreation-msg' => 'Uw gebruiker is aangemaakt.
 Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.',
 'yourname' => 'Gebruikersnaam:',
+'userlogin-yourname' => 'Gebruikersnaam',
+'userlogin-yourname-ph' => 'Geef uw gebruikersnaam op',
 'yourpassword' => 'Wachtwoord:',
+'userlogin-yourpassword' => 'Wachtwoord',
+'userlogin-yourpassword-ph' => 'Geef uw wachtwoord op',
+'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',
 'remembermypassword' => 'Aanmeldgegevens onthouden (maximaal $1 {{PLURAL:$1|dag|dagen}})',
+'userlogin-remembermypassword' => 'Aangemeld blijven',
+'userlogin-signwithsecure' => 'Beveiligde verbinding gebruiken',
 'securelogin-stick-https' => 'Verbonden blijven via HTTPS na aanmelden',
 'yourdomainname' => 'Uw domein:',
 'password-change-forbidden' => 'U kunt uw wachtwoord niet wijzigen in deze wiki.',
@@ -788,18 +816,38 @@ Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te pass
 'logout' => 'Afmelden',
 'userlogout' => 'Afmelden',
 'notloggedin' => 'Niet aangemeld',
+'userlogin-noaccount' => 'Hebt u geen geregistreerde gebruiker?',
+'userlogin-joinproject' => 'Word lid van {{SITENAME}}',
 'nologin' => 'Nog geen gebruikersnaam? $1.',
 'nologinlink' => 'Registreren',
 'createaccount' => 'Registreren',
 'gotaccount' => 'Hebt u al een gebruikersnaam? $1.',
 'gotaccountlink' => 'Aanmelden',
 'userlogin-resetlink' => 'Bent u uw aanmeldgegevens vergeten?',
+'userlogin-resetpassword-link' => 'Uw wachtwoord opnieuw instellen',
+'helplogin-url' => 'Help:Aanmelden',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hulp bij aanmelden]]',
+'createacct-join' => 'Geef uw gegevens hieronder op.',
+'createacct-emailrequired' => 'E-mailadres',
+'createacct-emailoptional' => 'E-mailadres (optioneel)',
+'createacct-email-ph' => 'Geef uw e-mailadres op',
 'createaccountmail' => 'Gebruik een tijdelijk willekeurig wachtwoord en stuur het naar het e-mailadres dat hieronder is vermeld',
+'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-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.',
 'userexists' => 'De gekozen gebruikersnaam is al in gebruik.
 Kies een andere naam.',
 'loginerror' => 'Aanmeldfout',
+'createacct-error' => 'Fout tijdens aanmaken gebruiker',
 'createaccounterror' => 'Het was niet mogelijk de gebruiker aan te maken: $1',
 'nocookiesnew' => 'De gebruiker is geregistreerd, maar niet aangemeld.
 {{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
@@ -820,7 +868,7 @@ Controleer de schrijfwijze.',
 'nouserspecified' => 'Geef een gebruikersnaam op.',
 'login-userblocked' => 'Deze gebruiker is geblokkeerd.
 Aanmelden is niet mogelijk.',
-'wrongpassword' => 'Het ingegeven wachtwoord is onjuist.
+'wrongpassword' => 'Het opgegeven wachtwoord is onjuist.
 Probeer het opnieuw.',
 'wrongpasswordempty' => 'Het opgegeven wachtwoord was leeg.
 Probeer het opnieuw.',
@@ -901,13 +949,15 @@ Bezig met aanmelden…',
 'resetpass-wrong-oldpass' => 'Het huidige of tijdelijke wachtwoord is ongeldig.
 Mogelijk hebt u uw wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aangevraagd.',
 'resetpass-temp-password' => 'Tijdelijk wachtwoord:',
+'resetpass-abort-generic' => 'De wachtwoordwijziging is afgebroken door een uitbreiding.',
 
 # Special:PasswordReset
 'passwordreset' => 'Wachtwoord opnieuw instellen',
-'passwordreset-text' => 'Vul dit formulier in om uw wachtwoord opnieuw in te stellen.',
+'passwordreset-text-one' => 'Vul dit formulier in om uw wachtwoord opnieuw in te stellen.',
+'passwordreset-text-many' => '{{PLURAL:$1|Vul een van de gegevensvelden in om uw wachtwoord opnieuw in te stellen.}}',
 'passwordreset-legend' => 'Wachtwoord opnieuw instellen',
 'passwordreset-disabled' => 'Het is in deze wiki niet mogelijk uw wachtwoord opnieuw in te stellen.',
-'passwordreset-pretext' => '{{PLURAL:$1||Voer één van de onderstaande velden in}}',
+'passwordreset-emaildisabled' => 'E-mailmogelijkheden zijn uitgeschakeld op deze wiki.',
 'passwordreset-username' => 'Gebruiker:',
 'passwordreset-domain' => 'Domein:',
 'passwordreset-capture' => 'De resulterende e-mail bekijken?',
@@ -929,7 +979,7 @@ Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan
 Tijdelijk wachtwoord: $2',
 'passwordreset-emailsent' => 'Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden.',
 '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 verzonden naar de gebruiker is mislukt om de volgende reden: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mailadres wijzigen',
@@ -1152,12 +1202,15 @@ Er is geen toelichting beschikbaar.',
 Deze lijkt verwijderd te zijn.',
 'edit-conflict' => 'Bewerkingsconflict.',
 'edit-no-change' => 'Uw bewerking is genegeerd, omdat er geen wijziging aan de tekst is gemaakt.',
+'postedit-confirmation' => 'Uw bewerking is opgeslagen',
 'edit-already-exists' => 'De pagina is niet aangemaakt.
 Deze bestaat al.',
 'defaultmessagetext' => 'Standaardinhoud',
 'content-failed-to-parse' => 'Het was niet mogelijk de inhoud van het MIME-type $2 voor het model $1 te verwerken: $3.',
 'invalid-content-data' => 'Ongeldige inhoudsgegevens',
 'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
+'editwarning-warning' => 'Als u deze pagina verlaat verliest u mogelijk wijzigingen die u hebt gemaakt.
+Als u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad "{{int:prefs-editing}}" in uw voorkeuren.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1267,12 +1320,12 @@ U kunt deze verschillen bekijken. Er kunnen details te vinden zijn in het [{{ful
 'rev-showdeleted' => 'weergeven',
 'revisiondelete' => 'Versies verwijderen of terugplaatsen',
 'revdelete-nooldid-title' => 'Ongeldige doelversie',
-'revdelete-nooldid-text' => 'U hebt geen doelversie(s) voor deze handeling opgegeven. De aangegeven versie bestaat niet of u probeert de laatste versie te verbergen.',
+'revdelete-nooldid-text' => 'U hebt geen doelversie(s) voor deze handeling opgegeven. De opgegeven versie bestaat niet of u probeert de laatste versie te verbergen.',
 'revdelete-nologtype-title' => 'Er is geen logboektype opgegeven',
 'revdelete-nologtype-text' => 'U hebt geen logboektype opgegeven om deze handeling op uit te voeren.',
 'revdelete-nologid-title' => 'Ongeldige logboekregel',
-'revdelete-nologid-text' => 'U hebt ofwel geen doellogboekregel opgegeven of de aangegeven logboekregel bestaat niet.',
-'revdelete-no-file' => 'Het aangegeven bestand bestaat niet.',
+'revdelete-nologid-text' => 'U hebt ofwel geen doellogboekregel opgegeven of de opgegeven logboekregel bestaat niet.',
+'revdelete-no-file' => 'Het opgegeven bestand bestaat niet.',
 'revdelete-show-file-confirm' => 'Weet u zeker dat u de verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wilt bekijken?',
 'revdelete-show-file-submit' => 'Ja',
 'revdelete-selected' => "'''Geselecteerde {{PLURAL:$2|bewerking|bewerkingen}} van [[:$1]]:'''",
@@ -1315,7 +1368,7 @@ U hebt geen toegang tot dit object.',
 'revdelete-modify-no-access' => 'Er is een fout opgetreden tijdens het wijzigen van het object van $1 om $2: dit object is gemarkeerd als "beschermd".
 U hebt geen toegang tot dit object.',
 'revdelete-modify-missing' => 'Er is een fout opgetreden bij het wijzigen van versienummer $1: het komt niet voor in de database!',
-'revdelete-no-change' => "'''Waarschuwing:''' het object van $1 om $2 uur had al de aangegeven zichtbaarheidsinstellingen.",
+'revdelete-no-change' => "'''Waarschuwing:''' het object van $1 om $2 uur had al de opgegeven zichtbaarheidsinstellingen.",
 'revdelete-concurrent-change' => 'Er is een fout opgetreden bij het wijzigen van het object van $1 om $2: de status is inmiddels gewijzigd door iemand anders.
 Controleer de logboeken.',
 'revdelete-only-restricted' => 'Er is een fout opgetreden tijdens het verbergen van het item van $1, $2: u kunt geen items onderdrukken uit het zicht van beheerders zonder ook een van de andere zichtbaarheidsopties te selecteren.',
@@ -1342,8 +1395,8 @@ Zorg dat deze wijziging de geschiedenisdoorlopendheid van de pagina behoudt.',
 'mergehistory-from' => 'Bronpagina:',
 'mergehistory-into' => 'Bestemmingspagina:',
 'mergehistory-list' => 'Samenvoegbare bewerkingsgeschiedenis',
-'mergehistory-merge' => 'De volgende versies van [[:$1]] kunnen samengevoegd worden naar [[:$2]].
-Gebruik de kolom met keuzerondjes om alleen de versies gemaakt op en voor de aangegeven tijd samen te voegen.
+'mergehistory-merge' => 'De volgende versies van [[:$1]] kunnen worden samengevoegd naar [[:$2]].
+Gebruik de kolom met keuzerondjes om alleen de versies gemaakt op en voor de opgegeven tijd samen te voegen.
 Let op dat het gebruiken van de navigatiekoppelingen deze kolom opnieuw instelt.',
 'mergehistory-go' => 'Samenvoegbare bewerkingen bekijken',
 'mergehistory-submit' => 'Versies samenvoegen',
@@ -1413,7 +1466,7 @@ Probeer een andere zoekopdracht.',
 'searchprofile-project-tooltip' => 'Zoeken in $1',
 'searchprofile-images-tooltip' => 'Zoeken naar bestanden',
 'searchprofile-everything-tooltip' => "Alle inhoud doorzoeken (inclusief overlegpagina's)",
-'searchprofile-advanced-tooltip' => 'Zoeken in aangegeven naamruimten',
+'searchprofile-advanced-tooltip' => 'Zoeken in opgegeven naamruimten',
 'search-result-size' => '$1 ({{PLURAL:$2|1 woord|$2 woorden}})',
 'search-result-category-size' => '{{PLURAL:$1|1 categorielid|$1 categorieleden}} ({{PLURAL:$2|1 ondercategorie|$2 ondercategorieën}}, {{PLURAL:$3|1 bestand|$3 bestanden}})',
 'search-result-score' => 'Relevantie: $1%',
@@ -1447,15 +1500,7 @@ U kunt ook een naamruimte als voorvoegsel gebruiken.",
 'searchdisabled' => 'Zoeken in {{SITENAME}} is niet mogelijk.
 U kunt gebruik maken van Google.
 De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
-
-# Quickbar
-'qbsettings' => 'Menubalk',
-'qbsettings-none' => 'Uitgeschakeld',
-'qbsettings-fixedleft' => 'Links vast',
-'qbsettings-fixedright' => 'Rechts vast',
-'qbsettings-floatingleft' => 'Links zwevend',
-'qbsettings-floatingright' => 'Rechts zwevend',
-'qbsettings-directionality' => 'Vast, afhankelijk van de schrijfrichting van uw taal',
+'search-error' => 'Er is een fout opgetreden tijdens het zoeken: $1',
 
 # Preferences page
 'preferences' => 'Voorkeuren',
@@ -1507,7 +1552,7 @@ Hier volgt een willekeurig gegenereerde waarde die u kunt gebruiken: $1',
 'timezonelegend' => 'Tijdzone:',
 'localtime' => 'Plaatselijke tijd:',
 'timezoneuseserverdefault' => 'Wikistandaard gebruiken ($1)',
-'timezoneuseoffset' => 'Anders (tijdverschil aangeven)',
+'timezoneuseoffset' => 'Anders (tijdverschil opgeven)',
 'timezoneoffset' => 'Tijdsverschil¹:',
 'servertime' => 'Servertijd:',
 'guesstimezone' => 'Vanuit de browser toevoegen',
@@ -1550,7 +1595,7 @@ De tildes worden omgezet in uw ondertekening en een datum en tijd van de bewerki
 'badsiglength' => 'Uw ondertekening is te lang.
 Deze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.',
 'yourgender' => 'Geslacht:',
-'gender-unknown' => 'Niet aangegeven',
+'gender-unknown' => 'Niet opgegeven',
 'gender-male' => 'Man',
 'gender-female' => 'Vrouw',
 'prefs-help-gender' => 'Optioneel: dit wordt gebruikt om gebruikers correct aan te spreken in de software.
@@ -1601,6 +1646,7 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'userrights-notallowed' => 'U hebt geen rechten om gebruikersrechten toe te voegen of te verwijderen.',
 'userrights-changeable-col' => 'Groepen die u kunt beheren',
 'userrights-unchangeable-col' => 'Groepen die u niet kunt beheren',
+'userrights-conflict' => 'Er is een probleem opgetreden tijdens het instellen van de gebruikersrechten. Pas uw wijzigingen opnieuw toe.',
 
 # Groups
 'group' => 'Groep:',
@@ -1775,7 +1821,7 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'recentchangeslinked-toolbox' => 'Verwante wijzigingen',
 'recentchangeslinked-title' => 'Wijzigingen verwant aan "$1"',
 'recentchangeslinked-noresult' => "Er zijn in de opgegeven periode geen bewerkingen geweest op de pagina's waarheen vanaf hier verwezen wordt.",
-'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een aangegeven pagina of op pagina's in een aangegeven categorie.
+'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.
 Pagina'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",
@@ -2007,7 +2053,7 @@ De veiligheid kan niet worden gecontroleerd.',
 Uw server is niet ingesteld om deze gegevens door te geven.
 Misschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.
 Zie https://www.mediawiki.org/wiki/Manual:Image_Authorization voor meer informatie.',
-'img-auth-notindir' => 'Het opgevraagde pad is niet de ingestelde uploadmap.',
+'img-auth-notindir' => 'Het opgegeven pad is niet de ingestelde uploadmap.',
 'img-auth-badtitle' => 'Het was niet mogelijk een geldige paginanaam te maken van "$1".',
 'img-auth-nologinnWL' => 'U bent niet aangemeld en "$1" staat niet op de witte lijst.',
 'img-auth-nofile' => 'Bestand "$1" bestaat niet.',
@@ -2027,7 +2073,6 @@ Om beveiligingsreden is img_auth.php uitgeschakeld.',
 'http-read-error' => 'Fout bij het lezen van HTTP.',
 'http-timed-out' => 'Timeout bij het HTTP-verzoek.',
 'http-curl-error' => 'Fout bij het ophalen van URL: $1',
-'http-host-unreachable' => 'De URL is niet bereikbaar.',
 'http-bad-status' => 'Er is een probleem opgetreden bij het HTTP-verzoek: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2124,7 +2169,7 @@ U kunt de beschrijving bewerken op de [$2 pagina met de bestandsbeschrijving].',
 'filedelete-success' => "'''$1''' is verwijderd.",
 'filedelete-success-old' => "De versie van '''[[Media:$1|$1]]''' van $3, $2 is verwijderd.",
 'filedelete-nofile' => "'''$1''' bestaat niet.",
-'filedelete-nofile-old' => "Er is geen versie van '''$1''' in het archief met de aangegeven eigenschappen.",
+'filedelete-nofile-old' => "Er is geen versie van '''$1''' in het archief met de opgegeven eigenschappen.",
 'filedelete-otherreason' => 'Andere reden:',
 'filedelete-reason-otherlist' => 'Andere reden',
 'filedelete-reason-dropdown' => '*Veel voorkomende redenen voor verwijderen
@@ -2292,7 +2337,7 @@ Een bestand kan hier dus ten onrechte opgenomen zijn.',
 'booksources-search-legend' => 'Bronnen en gegevens over een boek zoeken',
 'booksources-go' => 'OK',
 '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 ingegeven ISBN lijkt niet geldig te zijn.
+'booksources-invalid-isbn' => 'Het opgegeven ISBN lijkt niet geldig te zijn.
 Controleer of u wellicht een fout hebt gemaakt bij de invoer.',
 
 # Special:Log
@@ -2448,8 +2493,8 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
 'notvisiblerev' => 'De laatste versie van een andere gebruiker is verwijderd',
 'watchnochange' => "Geen van de pagina's op uw volglijst is in deze periode bewerkt.",
 'watchlist-details' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst, exclusief overlegpagina's.",
-'wlheader-enotif' => '* U wordt per e-mail gewaarschuwd',
-'wlheader-showupdated' => "* Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven",
+'wlheader-enotif' => 'U wordt per e-mail gewaarschuwd.',
+'wlheader-showupdated' => "Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
 'watchmethod-recent' => "controleer recente wijzigingen op pagina's op volglijst",
 'watchmethod-list' => "controleer pagina's op volglijst op wijzigingen",
 'watchlistcontains' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op uw volglijst.",
@@ -2571,7 +2616,7 @@ Ga een pagina terug, laad die pagina opnieuw en probeer het nog eens.',
 'protectlogtext' => "Hieronder staan pagina's waarvan de beveiliging recentelijk gewijzigd is.
 Zie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveiligde pagina's.",
 'protectedarticle' => 'heeft "[[$1]]" beveiligd',
-'modifiedarticleprotection' => 'heeft het beveiligingsniveau voor "[[$1]]" gewijzigd',
+'modifiedarticleprotection' => 'heeft het beveiligingsniveau gewijzigd voor "[[$1]]"',
 'unprotectedarticle' => 'heeft de beveiliging van "[[$1]]" opgeheven',
 'movedarticleprotection' => 'heeft beveiligingsinstellingen verplaatst van "[[$2]]" naar "[[$1]]"',
 'protect-title' => 'Beveiligingsniveau instellen voor "$1"',
@@ -2584,7 +2629,7 @@ Zie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveil
 'protect-legend' => 'Beveiliging bevestigen',
 'protectcomment' => 'Reden:',
 'protectexpiry' => 'Duur:',
-'protect_expiry_invalid' => 'De aangegeven duur is ongeldig.',
+'protect_expiry_invalid' => 'De opgegeven duur is ongeldig.',
 'protect_expiry_old' => 'Vervaldatum is in het verleden.',
 'protect-unchain-permissions' => 'Overige beveiligingsinstellingen beschikbaar maken',
 'protect-text' => "Hier kunt u het beveiligingsniveau voor de pagina '''$1''' bekijken en wijzigen.",
@@ -2870,6 +2915,7 @@ Neem contact op met uw internetprovider of uw helpdesk en stel die op de hoogte
 'sorbsreason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.',
 'sorbs_create_account_reason' => 'Uw IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.
 U kunt geen gebruiker registreren.',
+'xffblockreason' => 'Een IP-adres dat u gebruikt is geblokkeerd. Dit staat de X-Forwarded-For van de header. De oorspronkelijke blokkadereden is: $1',
 'cant-block-while-blocked' => 'U kunt andere gebruikers niet blokkeren terwijl u zelf geblokkeerd bent.',
 'cant-see-hidden-user' => 'De gebruiker die u probeert te blokken is al geblokkeerd en verborgen.
 Omdat u het recht "hideuser" niet hebt, kunt u de blokkade van de gebruiker niet bekijken of bewerken.',
@@ -3036,6 +3082,8 @@ Ga naar [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//tran
 'thumbnail-more' => 'Vergroten',
 'filemissing' => 'Bestand is zoek',
 'thumbnail_error' => 'Fout bij het aanmaken van de miniatuurafbeelding: $1',
+'thumbnail_error_remote' => 'Foutmelding van $1:
+$2',
 'djvu_page_error' => 'DjVu-pagina buiten bereik',
 'djvu_no_xml' => 'De XML voor het DjVu-bestand kon niet opgehaald worden',
 'thumbnail-temp-create' => 'Het was niet mogelijk een tijdelijk miniatuurbestand aan te maken.',
@@ -3087,7 +3135,7 @@ Een tijdelijke map is niet aanwezig.',
 'xml-error-string' => '$1 op regel $2, kolom $3 (byte $4): $5',
 'import-upload' => 'XML-gegevens uploaden',
 'import-token-mismatch' => 'De sessiegegevens zijn verloren gegaan. Probeer het opnieuw.',
-'import-invalid-interwiki' => 'Het is niet mogelijk van de aangegeven wiki te importeren.',
+'import-invalid-interwiki' => 'Het is niet mogelijk van de opgegeven wiki te importeren.',
 'import-error-edit' => 'De pagina "$1" is niet geïmporteerd omdat u niet de rechten hebt om die te bewerken.',
 'import-error-create' => 'De pagina "$1" is niet geïmporteerd omdat u niet de rechten hebt om die aan te maken.',
 'import-error-interwiki' => 'De pagina "$1" is niet geïmporteerd omdat deze naam is gereserveerd voor externe koppelingen (interwiki).',
@@ -3188,17 +3236,11 @@ U kunt wel de broncode bekijken.',
 
 # Stylesheets
 'common.css' => '/** CSS die hier wordt geplaatst heeft invloed op alle skins */',
-'standard.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Standard */',
-'nostalgia.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Nostalgie */',
 'cologneblue.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Keuls blauw */',
 'monobook.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Monobook */',
-'myskin.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin MijnSkin */',
-'chick.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Chick */',
-'simple.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Eenvoudig */',
 'modern.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Modern */',
 'vector.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de skin Vector */',
 'print.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op de printuitvoer */',
-'handheld.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op handheldapparaten gebaseerd op de skin die is ingesteld in $wgHandheldStyle */',
 'noscript.css' => '/ * CSS die hier wordt geplaatst heeft invloed voor gebruikers die JavaScript hebben uitgeschakeld * /',
 'group-autoconfirmed.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */',
 'group-bot.css' => '/* CSS die hier wordt geplaatst heeft alleen invloed op robots */',
@@ -3207,13 +3249,8 @@ U kunt wel de broncode bekijken.',
 
 # Scripts
 'common.js' => "/* JavaScript die hier wordt geplaatst heeft invloed op alle pagina's voor alle gebruikers */",
-'standard.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Standaard gebruiken */',
-'nostalgia.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Nostalgie gebruiken */',
 'cologneblue.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Keuls blauw gebruiken */',
 'monobook.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Monobook gebruiken */',
-'myskin.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin MijnSkin gebruiken */',
-'chick.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Chick gebruiken */',
-'simple.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Eenvoudig gebruiken */',
 'modern.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Modern gebruiken */',
 'vector.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op gebruikers die de skin Vector gebruiken */',
 'group-autoconfirmed.js' => '/* JavaScript die hier wordt geplaatst heeft alleen invloed op automatisch bevestigde gebruikers */',
@@ -3293,13 +3330,8 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
 'pageinfo-category-files' => 'Aantal bestanden',
 
 # Skin names
-'skinname-standard' => 'Klassiek',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Keuls blauw',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'MijnSkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Eenvoudig',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3328,8 +3360,8 @@ Meestal wordt dit door een externe koppeling op een zwarte lijst veroorzaakt.',
 
 $1',
 'filedelete-missing' => 'Het bestand "$1" kan niet verwijderd worden, omdat het niet bestaat.',
-'filedelete-old-unregistered' => 'De aangegeven bestandsversie "$1" staat niet in de database`.',
-'filedelete-current-unregistered' => 'Het aangegeven bestand "$1" staat niet in de database.',
+'filedelete-old-unregistered' => 'De opgegeven bestandsversie "$1" staat niet in de database`.',
+'filedelete-current-unregistered' => 'Het opgegeven bestand "$1" staat niet in de database.',
 'filedelete-archive-read-only' => 'De webserver kan niet in de archiefmap "$1" schrijven.',
 
 # Browsing diffs
@@ -3379,11 +3411,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 minuut|$1 minuten}}',
 'hours' => '{{PLURAL:$1|$1 uur|$1 uur}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
+'weeks' => '{{PLURAL: $1|één week|$1 weken}}',
 'months' => '{{PLURAL:$1|één maand|$1 maanden}}',
 'years' => '{{PLURAL:$1|één jaar|$1 jaar}}',
 'ago' => '$1 geleden',
 'just-now' => 'Daarnet',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|uur}} geleden',
+'minutes-ago' => '$1 {{PLURAL:$1|minuut|minuten}} geleden',
+'seconds-ago' => '$1 {{PLURAL:$1|seconde|seconden}} geleden',
+'monday-at' => 'Maandag om $1',
+'tuesday-at' => 'Dinsdag om $1',
+'wednesday-at' => 'Woensdag om $1',
+'thursday-at' => 'Donderdag om $1',
+'friday-at' => 'Vrijdag om $1',
+'saturday-at' => 'Zaterdag om $1',
+'sunday-at' => 'Zondag om $1',
+'yesterday-at' => 'Gisteren om $1',
+
 # Bad image list
 'bad_image_list' => "De opmaak is als volgt:
 
@@ -3413,7 +3459,7 @@ Andere velden worden verborgen.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breedte',
 'exif-imagelength' => 'Hoogte',
 'exif-bitspersample' => 'Bits per component',
@@ -3591,7 +3637,7 @@ Andere velden worden verborgen.
 'exif-originalimageheight' => 'Hoogte van de afbeelding voor bijsnijden',
 'exif-originalimagewidth' => 'Breedte van de afbeelding voor bijsnijden',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ongecomprimeerd',
 'exif-compression-2' => 'CCITT Groep 3 1-dimensionale aangepaste "Huffman run length"-codering',
 'exif-compression-3' => 'CCITT Groep 3 faxcodering',
@@ -3814,7 +3860,7 @@ Andere velden worden verborgen.
 
 # Email address confirmation
 'confirmemail' => 'E-mailadres bevestigen',
-'confirmemail_noemail' => 'U hebt geen geldig e-mailadres ingegeven in uw [[Special:Preferences|gebruikersvoorkeuren]].',
+'confirmemail_noemail' => 'U hebt geen geldig e-mailadres opgegeven in uw [[Special:Preferences|gebruikersvoorkeuren]].',
 'confirmemail_text' => '{{SITENAME}} eist bevestiging van uw e-mailadres voordat u de e-mailmogelijkheden kunt gebruiken.
 Klik op de onderstaande knop om een bevestigingsbericht te ontvangen.
 Dit bericht bevat een koppeling met een code.
@@ -4025,13 +4071,17 @@ Samen met dit programma hoort u een [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
 
-# Special:FilePath
-'filepath' => 'Bestandslocatie',
-'filepath-page' => 'Bestand:',
-'filepath-submit' => 'OK',
-'filepath-summary' => 'Deze speciale pagina geeft het volledige pad voor een bestand.
-Afbeeldingen worden in hun volledige resolutie weergegeven.
-Andere bestandstypen worden direct in het met het MIME-type verbonden programma geopend.',
+# Special:Redirect
+'redirect' => 'Doorverwijzen op bestandsnaam, gebruikersnummer of versienummer',
+'redirect-legend' => 'Doorverwijzen naar een bestand of pagina',
+'redirect-summary' => 'Deze speciale pagina verwijst door naar een bestand (als een bestandsnaam wordt opgegeven), een pagina (als een versienummer wordt opgegeven) of een gebruikerspagina (als een gebruikersnummer wordt opgegeven).',
+'redirect-submit' => 'OK',
+'redirect-lookup' => 'Opzoeken:',
+'redirect-value' => 'Waarde:',
+'redirect-user' => 'Gebruikersnummer',
+'redirect-revision' => 'Paginaversie',
+'redirect-file' => 'Bestandsnaam',
+'redirect-not-exists' => 'Waarde niet gevonden',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Duplicaatbestanden zoeken',
@@ -4112,16 +4162,19 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'dberr-cachederror' => 'Deze pagina is een kopie uit de cache en is wellicht niet de meest recente versie.',
 
 # HTML forms
-'htmlform-invalid-input' => 'Er zijn problemen met enkele ingegeven waarden',
-'htmlform-select-badoption' => 'De ingegeven waarde is ongeldig.',
-'htmlform-int-invalid' => 'De ingegeven waarde is geen geheel getal.',
+'htmlform-invalid-input' => 'Er zijn problemen met enkele opgegeven waarden',
+'htmlform-select-badoption' => 'De opgegeven waarde is ongeldig.',
+'htmlform-int-invalid' => 'De opgegeven waarde is geen geheel getal.',
 'htmlform-float-invalid' => 'De waarde die u hebt opgegeven is geen getal.',
-'htmlform-int-toolow' => 'De ingegeven waarde ligt onder de minimumwaarde van $1',
-'htmlform-int-toohigh' => 'De ingegeven waarde ligt boven de maximumwaarde van $1',
+'htmlform-int-toolow' => 'De opgegeven waarde ligt onder de minimumwaarde van $1',
+'htmlform-int-toohigh' => 'De opgegeven waarde ligt boven de maximumwaarde van $1',
 'htmlform-required' => 'Deze waarde is verplicht',
 'htmlform-submit' => 'Opslaan',
 'htmlform-reset' => 'Wijzigingen ongedaan maken',
 'htmlform-selectorother-other' => 'Anders',
+'htmlform-no' => 'Nee',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Selecteer een optie',
 
 # SQLite database support
 'sqlite-has-fts' => 'Versie $1 met ondersteuning voor "full-text" zoeken',
index 663aa93..f52c86b 100644 (file)
@@ -418,7 +418,7 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
 'removedwatchtext' => 'De pagina "[[:$1]]" is van [[Special:Watchlist|je volglijst]] verwijderd.',
 'watchnochange' => "Geen van de pagina's op je volglijst is in deze periode bewerkt.",
 'watchlist-details' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op je volglijst, exclusief overlegpagina's.",
-'wlheader-showupdated' => "* Pagina's die zijn bewerkt sinds je laatste bezoek worden '''vet''' weergegeven",
+'wlheader-showupdated' => "Pagina's die zijn bewerkt sinds je laatste bezoek worden '''vet''' weergegeven.",
 'watchlistcontains' => "Er {{PLURAL:$1|staat 1 pagina|staan $1 pagina's}} op je volglijst.",
 
 'enotif_lastvisited' => 'Zie $1 voor alle wijzigingen sinds je laatste bezoek.',
index 62483f9..c9c2cce 100644 (file)
@@ -144,7 +144,7 @@ $magicWords = array(
        'img_framed'                => array( '1', 'ramme', 'ramma', 'framed', 'enframed', 'frame' ),
        'img_frameless'             => array( '1', 'rammelaus', 'frameless' ),
        'img_page'                  => array( '1', 'side=$1', 'side_$1', 'page=$1', 'page $1' ),
-       'img_link'                  => array( '1', 'lenkje=$1', 'lenkja=$1', 'link=$1' ),
+       'img_link'                  => array( '1', 'lenkje=$1', 'lenke=$1', 'link=$1' ),
        'sitename'                  => array( '1', 'NETTSTADNAMN', 'SITENAME' ),
        'ns'                        => array( '0', 'NR:', 'NS:' ),
        'localurl'                  => array( '0', 'LOKALLENKJE:', 'LOKALLENKE:', 'LOCALURL:' ),
@@ -180,6 +180,7 @@ $magicWords = array(
        'numberofadmins'            => array( '1', 'ADMINTAL', 'ADMINISTRATORTAL', 'NUMBEROFADMINS' ),
        'formatnum'                 => array( '0', 'FORMATTAL', 'FORMATNUM' ),
        'special'                   => array( '0', 'spesial', 'special' ),
+       'defaultsort'               => array( '1', 'STANDARDSORTERING', 'SORTERINGSNYKEL', 'SORTERINGSNØKKEL', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'FILSTIG', 'FILEPATH:' ),
        'tag'                       => array( '0', 'merke', 'tag' ),
        'hiddencat'                 => array( '1', '__GØYMDKAT__', '__LØYNDKAT__', '__HIDDENCAT__' ),
@@ -214,15 +215,18 @@ $namespaceNames = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'Verksame_brukarar', 'Aktive_brukarar' ),
        'Allmessages'               => array( 'Alle_systemmeldingar' ),
        'Allpages'                  => array( 'Alle_sider' ),
        'Ancientpages'              => array( 'Gamle_sider' ),
+       'Badtitle'                  => array( 'Dårleg_tittel' ),
        'Blankpage'                 => array( 'Tom_side' ),
        'Block'                     => array( 'Blokker' ),
        'Blockme'                   => array( 'Blokker_meg' ),
        'Booksources'               => array( 'Bokkjelder' ),
        'BrokenRedirects'           => array( 'Blindvegsomdirigeringar' ),
        'Categories'                => array( 'Kategoriar' ),
+       'ChangeEmail'               => array( 'Endra_e-post', 'Endre_e-post' ),
        'ChangePassword'            => array( 'Nullstill_passord' ),
        'Confirmemail'              => array( 'Stadfest_e-postadresse' ),
        'Contributions'             => array( 'Bidrag' ),
@@ -231,6 +235,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'Sletta_brukarbidrag' ),
        'Disambiguations'           => array( 'Fleirtydingssider' ),
        'DoubleRedirects'           => array( 'Doble_omdirigeringar' ),
+       'EditWatchlist'             => array( 'Endra_overvakingsliste', 'Endre_overvakingsliste' ),
        'Emailuser'                 => array( 'E-post' ),
        'Export'                    => array( 'Eksport' ),
        'Fewestrevisions'           => array( 'Færrast_endringar' ),
@@ -241,7 +246,7 @@ $specialPageAliases = array(
        'BlockList'                 => array( 'Blokkeringsliste' ),
        'LinkSearch'                => array( 'Lenkjesøk' ),
        'Listadmins'                => array( 'Administratorliste', 'Administratorar' ),
-       'Listbots'                  => array( 'Bottliste', 'Bottar' ),
+       'Listbots'                  => array( 'Bottliste', 'Bottar', 'Robotliste', 'Robotar' ),
        'Listfiles'                 => array( 'Filliste' ),
        'Listgrouprights'           => array( 'Grupperettar' ),
        'Listredirects'             => array( 'Omdirigeringsliste' ),
@@ -254,7 +259,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIME-søk' ),
        'Mostcategories'            => array( 'Flest_kategoriar' ),
        'Mostimages'                => array( 'Mest_brukte_filer' ),
-       'Mostlinked'                => array( 'Mest_lenka_sider' ),
+       'Mostlinked'                => array( 'Mest_lenka_sider', 'Mest_lenkja_sider' ),
        'Mostlinkedcategories'      => array( 'Mest_brukte_kategoriar' ),
        'Mostlinkedtemplates'       => array( 'Mest_brukte_malar' ),
        'Mostrevisions'             => array( 'Flest_endringar' ),
@@ -265,7 +270,7 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'Opplastingane_mine' ),
        'Newimages'                 => array( 'Nye_filer' ),
        'Newpages'                  => array( 'Nye_sider' ),
-       'PermanentLink'             => array( 'Permanent_lenkje' ),
+       'PermanentLink'             => array( 'Permanent_lenkje', 'Permanent_lenke' ),
        'Popularpages'              => array( 'Populære_sider' ),
        'Preferences'               => array( 'Innstillingar' ),
        'Prefixindex'               => array( 'Prefiksindeks' ),
@@ -273,12 +278,12 @@ $specialPageAliases = array(
        'Protectedtitles'           => array( 'Verna_sidenamn' ),
        'Randompage'                => array( 'Tilfeldig_side' ),
        'Randomredirect'            => array( 'Tilfeldig_omdirigering' ),
-       'Recentchanges'             => array( 'Siste_endringar' ),
+       'Recentchanges'             => array( 'Siste_endringar', 'Siste_endringane' ),
        'Recentchangeslinked'       => array( 'Relaterte_endringar' ),
        'Revisiondelete'            => array( 'Versjonssletting' ),
        'Search'                    => array( 'Søk' ),
-       'Shortpages'                => array( 'Korte_sider' ),
-       'Specialpages'              => array( 'Spesialsider' ),
+       'Shortpages'                => array( 'Korte_sider', 'Stutte_sider' ),
+       'Specialpages'              => array( 'Spesialsider', 'Særsider' ),
        'Statistics'                => array( 'Statistikk' ),
        'Tags'                      => array( 'Merke' ),
        'Uncategorizedcategories'   => array( 'Ukategoriserte_kategoriar' ),
@@ -342,9 +347,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Vis kor mange som overvakar sida',
 'tog-oldsig' => 'Noverande signatur:',
 'tog-fancysig' => 'Handsam signaturar som wikitekst (utan automatisk lenking)',
-'tog-externaleditor' => 'Bruk eit eksternt handsamingsprogram som standard (berre for vidarekomne, krev eit spesielt oppsett på maskina di. [//www.mediawiki.org/wiki/Manual:External_editors Meir informasjon.])',
-'tog-externaldiff' => 'Bruk eit eksternt skilnadprogram som standard (berre for vidarekomne, krev eit spesielt oppsett på maskina di.
-[//www.mediawiki.org/wiki/Manual:External_editors Meir informasjon.])',
 'tog-showjumplinks' => 'Slå på «gå til»-lenkjer',
 'tog-uselivepreview' => 'Bruk levande førehandsvising (eksperimentelt JavaScript)',
 'tog-forceeditsummary' => 'Spør meg når eg ikkje har skrive noko i endringssamandraget',
@@ -359,6 +361,7 @@ $messages = array(
 'tog-showhiddencats' => 'Vis gøymde kategoriar',
 'tog-noconvertlink' => 'Slå av konvertering av sidetitlar',
 'tog-norollbackdiff' => 'Ikkje vis skilnad etter attenderulling',
+'tog-useeditwarning' => 'Gje ei åtvaring om eg går ut av ei redigeringsside og ikkje alle endringar er lagra',
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldri',
@@ -422,6 +425,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'des',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mars',
+'april-date' => '$1. april',
+'may-date' => '$1. mai',
+'june-date' => '$1. juni',
+'july-date' => '$1. juli',
+'august-date' => '$1. august',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. desember',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriar}}',
@@ -557,7 +572,7 @@ $1',
 'currentevents-url' => 'Project:Aktuelt',
 'disclaimers' => 'Atterhald',
 'disclaimerpage' => 'Project:Atterhald',
-'edithelp' => 'Hjelp til endring',
+'edithelp' => 'Endringshjelp',
 'edithelppage' => 'Help:Endring',
 'helppage' => 'Help:Innhald',
 'mainpage' => 'Hovudside',
@@ -719,9 +734,15 @@ Ver merksam på at nokre sider framleis kan visast fram som om du er innlogga fr
 'welcomecreation-msg' => 'Brukarkontoen din er oppretta.
 Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}]].',
 'yourname' => 'Brukarnamn:',
+'userlogin-yourname' => 'Brukarnamn',
+'userlogin-yourname-ph' => 'Skriv inn brukarnamnet ditt',
 'yourpassword' => 'Passord:',
+'userlogin-yourpassword' => 'Passord',
+'userlogin-yourpassword-ph' => 'Skriv inn passordet ditt',
 'yourpasswordagain' => 'Skriv opp att passordet',
 'remembermypassword' => 'Hugs innlogginga mi på denne datamaskinen (høgst {{PLURAL:$1|éin dag|$1 dagar}})',
+'userlogin-remembermypassword' => 'Hald meg innlogga',
+'userlogin-signwithsecure' => 'Logg inn med trygg tenar',
 'securelogin-stick-https' => 'Fortset HTTPS-tilkopling etter innlogging.',
 'yourdomainname' => 'Domenet ditt',
 'password-change-forbidden' => 'Du kan ikkje endra passord på denne wikien.',
@@ -734,12 +755,16 @@ Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}
 'logout' => 'Logg ut',
 'userlogout' => 'Logg ut',
 'notloggedin' => 'Ikkje innlogga',
+'userlogin-noaccount' => 'Har du ingen konto?',
+'userlogin-joinproject' => 'Vert med {{SITENAME}}',
 'nologin' => "Har du ingen brukarkonto? '''$1'''.",
 'nologinlink' => 'Registrer deg',
 'createaccount' => 'Opprett ny konto',
 'gotaccount' => "Har du ein brukarkonto? '''$1'''.",
 'gotaccountlink' => 'Logg inn',
 'userlogin-resetlink' => 'Har du gløymd påloggingsopplysingane dine?',
+'helplogin-url' => 'Help:Innlogging',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjelp med innlogging]]',
 'createaccountmail' => 'Bruk eit mellombels tilfeldig passord og send det til e-postadressa som er oppgjeven under',
 'createaccountreason' => 'Årsak:',
 'badretype' => 'Passorda du skreiv inn er ikkje like.',
@@ -825,10 +850,9 @@ Du kan allereie ha byta passordet, eller ha bede om å få eit nytt mellombels p
 
 # Special:PasswordReset
 'passwordreset' => 'Attendestilling av passord',
-'passwordreset-text' => '↓Fyll ut dette skjemaet for å motta ei påminning om kontoopplysningane dine i ein e-post.',
 'passwordreset-legend' => '↓Nullstill passordet',
 'passwordreset-disabled' => '↓Tilbakestilling av passord er ikkje aktivert på denne wikien',
-'passwordreset-pretext' => '↓{{PLURAL:$1||Tast inn ein av datadelane nedanfor}}',
+'passwordreset-emaildisabled' => 'E-postfunksjonen er slegen av på wikien.',
 'passwordreset-username' => 'Brukarnamn:',
 'passwordreset-domain' => 'Domene:',
 'passwordreset-capture' => 'Vis resulterande epost',
@@ -1051,11 +1075,14 @@ Sletteloggen for sida finn du her:",
 Det ser ut til at ho er sletta.',
 'edit-conflict' => 'Endringskonflikt.',
 'edit-no-change' => 'Redigeringa di vart ignorert fordi det ikkje vart gjort endringar i teksten.',
+'postedit-confirmation' => 'Endringa di vart lagra.',
 'edit-already-exists' => 'Kunne ikkje opprette ny side fordi ho alt eksisterer.',
 'defaultmessagetext' => 'Standard meldingstekst',
 'content-failed-to-parse' => 'Klarte ikkje å tolke innhaldet «$2» for innhaldsmodellen «$1»: $3',
 'invalid-content-data' => 'Ugyldig innhald',
 'content-not-allowed-here' => 'Innhaldsmodellen «$1» er ikkje tillaten på sida [[$2]]',
+'editwarning-warning' => 'Ved å forlata denne sida kan du mista alle endringane du måtte ha gjort.
+Er du innlogga kan denne åtvaringa slåast av under bolken «Endring» i innstillingane dine.',
 
 # Content models
 'content-model-wikitext' => 'WikiTekst',
@@ -1201,8 +1228,8 @@ $1",
 'revdel-restore-visible' => 'synlege versjonar',
 'pagehist' => 'Sidehistorikk',
 'deletedhist' => 'Sletta historikk',
-'revdelete-hide-current' => 'Feil under skjuling av objektet datert $2, $1: dette er den gjeldande revisjonen.
-Han kan ikkje skjulast.',
+'revdelete-hide-current' => 'Feil under løyning av objektet datert $2, $1: dette er den gjeldande versjonen.
+Han kan ikkje løynast.',
 'revdelete-show-no-access' => 'Feil under vising av objekt datert $2, $1: dette objektet har vorte markert "avgrensa".
 Du har ikkje tilgjenge til det.',
 'revdelete-modify-no-access' => 'Feil ved endringa av eininga datert $2, $1: denne eininga har vorte markert som "avgrensa".
@@ -1318,8 +1345,8 @@ Detaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'searcheverything-enable' => 'Søk i alle namneroma',
 'searchrelated' => 'relatert',
 'searchall' => 'alle',
-'showingresults' => "Nedanfor er opp til {{PLURAL:$1|'''eitt''' resultat|'''$1''' resultat}} som byrjar med nummer '''$2''' vist{{PLURAL:$1||e}}.",
-'showingresultsnum' => "Nedanfor er {{PLURAL:$3|'''eitt''' resultat|'''$3''' resultat}} som byrjar med nummer '''$2''' vist.",
+'showingresults' => "Nedanfor er opp til {{PLURAL:$1|'''eitt'''|'''$1'''}} resultat som byrjar med nummer '''$2''' vist{{PLURAL:$1||e}}.",
+'showingresultsnum' => "Nedanfor er {{PLURAL:$3|'''eitt'''|'''$3'''}} resultat som byrjar med nummer '''$2''' {{PLURAL:$3|vist|viste}}.",
 'showingresultsheader' => "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
 'nonefound' => "'''Merk:''' Som standard blir det berre søkt i enkelte namnerom.
 For å søkja i alle, bruk prefikset ''all:'' (det inkluderer diskusjonssider, malar etc.), eller bruk det ønskte namnerommet som prefiks.",
@@ -1336,15 +1363,7 @@ For å søkja i alle, bruk prefikset ''all:'' (det inkluderer diskusjonssider, m
 'searchdisabled' => 'Søkjefunksjonen på {{SITENAME}} er slått av akkurat no.
 I mellomtida kan du søkje gjennom Google.
 Ver merksam på at registra deira kan vera utdaterte.',
-
-# Quickbar
-'qbsettings' => 'Snøggmeny',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Venstre',
-'qbsettings-fixedright' => 'Høgre',
-'qbsettings-floatingleft' => 'Flytande venstre',
-'qbsettings-floatingright' => 'Flytande høgre',
-'qbsettings-directionality' => 'Fast, avhengig av kva retning språket ditt vert lese',
+'search-error' => 'Det oppstod ein feil under søket: $1',
 
 # Preferences page
 'preferences' => 'Innstillingar',
@@ -1891,7 +1910,6 @@ For best tryggleik, er img_auth.php sett ut av funksjon.',
 'http-read-error' => 'HTTP-lesefeil.',
 'http-timed-out' => 'Tidsavbrot på HTTP-førespurnad.',
 'http-curl-error' => 'Feil under henting av nettadressa: $1',
-'http-host-unreachable' => 'Kunne ikkje nå nettadressa',
 'http-bad-status' => 'Det var eit problem under HTTP-førespurnaden: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2294,8 +2312,8 @@ E-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukk
 'notvisiblerev' => 'Sideversjonen er sletta',
 'watchnochange' => 'Ingen av sidene i overvakingslista er endra i den valde perioden.',
 'watchlist-details' => '{{PLURAL:$1|Éi side|$1 sider}} er overvaka, utanom diskusjonssider.',
-'wlheader-enotif' => 'Funksjonen for endringsmeldingar per e-post er på.',
-'wlheader-showupdated' => "Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
+'wlheader-enotif' => 'Funksjonen for endringsmeldingar per e-post er på.',
+'wlheader-showupdated' => "Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
 'watchmethod-recent' => 'sjekkar siste endringar for dei overvaka sidene',
 'watchmethod-list' => 'sjekkar om dei overvaka sidene har blitt endra i det siste',
 'watchlistcontains' => 'Overvakingslista di inneheld {{PLURAL:$1|éi side|$1 sider}}.',
@@ -2525,7 +2543,7 @@ $1',
 'tooltip-invert' => 'Hak av boksen for å gøyma endringar på sider i det valde namnerommet (og det tilknytte namnerommet om det er haka av)',
 'namespace_association' => 'Tilknytt namnerom',
 'tooltip-namespace_association' => 'Hak av boksen for at diskusjonssida eller emnenamnerommet knytt til det valde namnerommet skal vera med òg',
-'blanknamespace' => '(Hovud)',
+'blanknamespace' => '(hovud)',
 
 # Contributions
 'contributions' => '{{GENDER:$1|Brukarbidrag}}',
@@ -2689,6 +2707,7 @@ IP-adresser som blir automatisk blokkerte er ikkje lista her. Sjå [[Special:Blo
 'proxyblocksuccess' => 'Utført.',
 'sorbsreason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL.',
 'sorbs_create_account_reason' => 'IP-adressa di er lista som ein open mellomtenar i DNSBL, og difor får du ikkje registrert deg.',
+'xffblockreason' => 'Ei IP-adresse i X-Forwarded-For-tittelen, anten di eller den som høyrer til ein proksytenar du nyttar, er blokkert. Den opphavlege blokkeringsgrunnen var: $1',
 'cant-block-while-blocked' => 'Du kan ikkje blokkere andre medan du sjølv er blokkert.',
 'cant-see-hidden-user' => 'Brukaren du prøver å blokkera har allereie vorte blokkert og skjult. Sidan du ikkje har rett til å skjula brukarar, kan du ikkje sjå eller endra blokkeringa til brukaren.',
 'ipbblocked' => 'Du kan ikkje blokkera eller avblokkera andre brukarar sidan du sjølv er blokkert',
@@ -2989,26 +3008,15 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 
 # Stylesheets
 'common.css' => '/* CSS plassert i denne fila vil gjelde for alle utsjånader. */',
-'standard.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Standard */',
-'nostalgia.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Nostalgia */',
 'cologneblue.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Kølnerblå */',
 'monobook.css' => '/* CSS-tekst som vert plassert her, endrar utsjånaden til sidedrakta Monobook */',
-'myskin.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta MySkin */',
-'chick.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Chick */',
-'simple.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Simple */',
 'modern.css' => '/* CSS i denne fila vil gjelde alle som nyttar drakta Modern */',
 'print.css' => '/* CSS i denne fila vil påverke utskriftsversjonen */',
-'handheld.css' => '/* CSS i denne fila vil gjelde alle handheldte innretnigar konfigurert i $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Javascript i denne fila vil gjelde for alle drakter. */',
-'standard.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Standard */',
-'nostalgia.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Nostalgia */',
 'cologneblue.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Kølnerblå */',
 'monobook.js' => '/* Javascript i denne fila vil gjelde for brukarar av drakta Monobook */',
-'myskin.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta MySkin */',
-'chick.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Chick */',
-'simple.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Simple */',
 'modern.js' => '* Javascript i denne fila vil gjelde for brukarar av drakta Modern */',
 
 # Metadata
@@ -3082,13 +3090,8 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'pageinfo-category-files' => 'Tal filer',
 
 # Skin names
-'skinname-standard' => 'Klassisk',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Kölnerblå',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MiDrakt',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkel',
 'skinname-modern' => 'Moderne',
 
 # Patrolling
@@ -3101,7 +3104,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'markedaspatrollederror' => 'Kan ikkje merke sida som patruljert',
 'markedaspatrollederrortext' => 'Du må markere ein versjon for å kunne godkjenne.',
 'markedaspatrollederror-noautopatrol' => 'Ein har ikkje høve til å merkje sine eigne endringar som godkjende.',
-'markedaspatrollednotify' => 'Denne endringa på $1 har vorte merkt som patruljert.',
+'markedaspatrollednotify' => 'Denne endringa på $1 vart merkt som patruljert.',
 'markedaspatrollederrornotify' => 'Det gjekk ikkje å merkja endringa som patruljert.',
 
 # Patrol log
@@ -3199,7 +3202,7 @@ Andre er gøymde som standard.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Breidd',
 'exif-imagelength' => 'Høgd',
 'exif-bitspersample' => 'Bitar per komponent',
@@ -3377,7 +3380,7 @@ Andre er gøymde som standard.
 'exif-originalimageheight' => 'Høgda på biletet før det vart beskåren',
 'exif-originalimagewidth' => 'Bredda på biletet før det vart beskåren',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ukomprimert',
 'exif-compression-2' => 'CCITT Gruppe 3 1-dimensjonal modifisert Huffman-kjøyrelengdekoding',
 'exif-compression-3' => 'CCITT Gruppe 3 faks-koding',
@@ -3751,7 +3754,7 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'Ukjend tilleggsmerking «$1»',
-'duplicate-defaultsort' => 'Åtvaring: Standarsorteringa «$2» tar over for den tidlegare sorteringa «$1».',
+'duplicate-defaultsort' => 'Åtvaring: Standardsorteringa «$2» tar over for den tidlegare sorteringa «$1».',
 
 # Special:Version
 'version' => 'Versjon',
@@ -3786,13 +3789,6 @@ Du skal ha motteke [{{SERVER}}{{SCRIPTPATH}}/COPYING ein kopi av GNU General Pub
 'version-entrypoints-header-entrypoint' => 'Inngangspunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Filsti',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Gå',
-'filepath-summary' => 'Denne spesialsida svarar med den fullstendige stigen til ei fil.
-Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei tilknytte programma sine.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Søk etter duplikatfiler',
 'fileduplicatesearch-summary' => 'Søk etter duplikatfiler basert på hash-verdiane deira.',
@@ -3881,45 +3877,47 @@ Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei t
 'htmlform-submit' => 'Lagre',
 'htmlform-reset' => 'Gjer om endringar',
 'htmlform-selectorother-other' => 'Andre',
+'htmlform-no' => 'Nei',
+'htmlform-yes' => 'Ja',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med støtte for fulltekstsøk',
 'sqlite-no-fts' => '$1 utan støtte for fulltekstsøk',
 
 # New logging system
-'logentry-delete-delete' => '$1 sletta sida $3',
-'logentry-delete-restore' => '$1 attoppretta sida $3',
-'logentry-delete-event' => '$1 endra synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4',
-'logentry-delete-revision' => '$1 endra synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
-'logentry-delete-event-legacy' => '$1 endra synlegdomen til loggoppføringar på $3',
-'logentry-delete-revision-legacy' => '$1 endra synlegdomen til versjonar på sida $3',
-'logentry-suppress-delete' => '$1 gøymde sida $3',
-'logentry-suppress-event' => '$1 endra i løyndom synlegdomen til {{PLURAL:$5|éi logghending|$5 logghendingar}} på $3: $4',
-'logentry-suppress-revision' => '$1 endra i løyndom synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
-'logentry-suppress-event-legacy' => '$1 endra i løyndom synlegdomen til logghendingar på $3',
-'logentry-suppress-revision-legacy' => '$1 endra i løyndom synlegdomen til versjonar på sida $3',
-'revdelete-content-hid' => 'innhald gøymt',
-'revdelete-summary-hid' => 'endringsamandrag gøymt',
+'logentry-delete-delete' => '$1 {{GENDER:$2|sletta}} sida $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|attoppretta}} sida $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|endra}} synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|endra}} synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|endra}} synlegdomen til loggoppføringar på $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|endra}} synlegdomen til versjonar på sida $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|løynde}} sida $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|endra}} i løyndom synlegdomen til {{PLURAL:$5|éi logghending|$5 logghendingar}} på $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|endra}} i løyndom synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|endra}} i løyndom synlegdomen til logghendingar på $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|endra}} i løyndom synlegdomen til versjonar på sida $3',
+'revdelete-content-hid' => 'innhald løynt',
+'revdelete-summary-hid' => 'endringsamandrag løynt',
 'revdelete-uname-hid' => 'brukarnamn gøymt',
 'revdelete-content-unhid' => 'innhald gjort synleg',
 'revdelete-summary-unhid' => 'endringssamandrag gjort synleg',
 'revdelete-uname-unhid' => 'brukarnamn gjort synleg',
 'revdelete-restricted' => 'la til avgrensingar for administratorar',
 'revdelete-unrestricted' => 'fjerna avgrensingar for administratorar',
-'logentry-move-move' => '$1 flytte sida $3 til $4',
-'logentry-move-move-noredirect' => '$1 flytte sida $3 til $4 utan å lata etter ei omdirigering',
-'logentry-move-move_redir' => '$1 flytte sida $3 til $4 over ei omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flytte sida $3 til $4 over ei omdirigering utan å lata etter ei omdirigering',
-'logentry-patrol-patrol' => '$1 merkte versjon $4 av sida $3 som patruljert',
-'logentry-patrol-patrol-auto' => '$1 merkte automatisk versjon $4 av sida $3 som patruljert',
-'logentry-newusers-newusers' => 'Brukarkontoen $1 vart oppretta',
-'logentry-newusers-create' => 'Brukarkontoen $1 vart oppretta',
-'logentry-newusers-create2' => 'Brukarkontoen $3 vart oppretta av $1',
-'logentry-newusers-byemail' => 'Brukarkontoen $3 vart oppretta av $1 og passord vart sendt med e-post',
-'logentry-newusers-autocreate' => 'Kontoen $1 vart oppretta av seg sjølv',
-'logentry-rights-rights' => '$1 endra gruppemedlemskap for $3 frå $4 til $5',
-'logentry-rights-rights-legacy' => '$1 endra gruppemedlemskap for $3',
-'logentry-rights-autopromote' => '$1 vart automatisk forfremja frå $4 til $5',
+'logentry-move-move' => '$1 {{GENDER:$2|flytte}} sida $3 til $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flytte}} sida $3 til $4 utan å lata etter ei omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flytte}} sida $3 til $4 over ei omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flytte}} sida $3 til $4 over ei omdirigering utan å lata etter ei omdirigering',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|merkte}} versjon $4 av sida $3 som patruljert',
+'logentry-patrol-patrol-auto' => '$1{{GENDER:$2| merkte}} automatisk versjon $4 av sida $3 som patruljert',
+'logentry-newusers-newusers' => 'Brukarkontoen $1 vart {{GENDER:$2|oppretta}}',
+'logentry-newusers-create' => 'Brukarkontoen $1 vart {{GENDER:$2|oppretta}}',
+'logentry-newusers-create2' => 'Brukarkontoen $3 vart {{GENDER:$2|oppretta}} av $1',
+'logentry-newusers-byemail' => 'Brukarkontoen $3 vart {{GENDER:$2|oppretta}} av $1 og passord vart sendt med e-post',
+'logentry-newusers-autocreate' => 'Brukarkontoen $1 vart {{GENDER:$2|oppretta}} av seg sjølv',
+'logentry-rights-rights' => '$1 {{GENDER:$2|endra}} gruppemedlemskap for $3 frå $4 til $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|endra}} gruppemedlemskap for $3',
+'logentry-rights-autopromote' => '$1 vart automatisk {{GENDER:$2|forfremja}} frå $4 til $5',
 'rightsnone' => '(ingen)',
 
 # Feedback
@@ -3995,4 +3993,7 @@ Om ikkje kan du nytta det enkle skjemaet under. Merknaden din vert lagd til på
 'duration-centuries' => '$1 {{PLURAL:$1|hundreår|hundreår}}',
 'duration-millennia' => '$1 {{PLURAL:$1|tusenår|tusenår}}',
 
+# Image rotation
+'rotate-comment' => 'Biletet vart dreitt $1{{PLURAL:$1|°}} med klokka',
+
 );
index 5a67f1f..bfee3ab 100644 (file)
@@ -358,8 +358,8 @@ Si vu voli plu tardim ekarta li pagine fro vun observa-liste, klikta \"Desobserv
 'unwatch' => 'Desobserva',
 'unwatchthispage' => 'Des-observa disi pagine',
 
-'changed' => 'chanjati',
 'enotif_lastvisited' => 'Regarda $1 por vida omni chanjes depos vun lasti visite.',
+'changed' => 'chanjati',
 
 # Delete
 'confirm' => 'Konfirma',
@@ -429,7 +429,7 @@ Si vu voli plu tardim ekarta li pagine fro vun observa-liste, klikta \"Desobserv
 'ilsubmit' => 'Sercha',
 'bydate' => 'segun date',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larjeso',
 'exif-imagelength' => 'Alteso',
 'exif-imagedescription' => 'Title de imaje',
index eed1ac1..3aa00b7 100644 (file)
@@ -66,7 +66,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Bonagatša email atrese go temošo tša poso',
 'tog-shownumberswatching' => 'Laetša palo bašomiši bao ba tlhapetšego',
 'tog-fancysig' => 'Tsaeno ya gose fihliwe',
-'tog-externaleditor' => 'Šomiša sengwadi sa kantle (bašumiši bao banalego botsibi fela.  [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-forceeditsummary' => 'Ntaetše ge kesa tsenye mongwalo go kakaretšo ya dithetogo',
 'tog-watchlisthideown' => 'Fihla diphetogo tšeo di direlego ke nna go lenano la ditlhapetšo.',
 'tog-watchlisthideminor' => 'Fihla diphetogo tše nyenyane tšeo di direlego ke nna go lenano la ditlhapetšo',
@@ -1209,7 +1208,7 @@ letlakala la seswantšho ge tafola ya metadata e bulwa. Tše dingwe tša di ''fi
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bophara',
 'exif-imagelength' => 'Botelele',
 'exif-artist' => 'Mongwadi',
index 477e2b0..5f0838e 100644 (file)
@@ -14,6 +14,7 @@
  * @author Jfblanc
  * @author Kaganer
  * @author McDutchie
+ * @author Nemo bis
  * @author Spacebirdy
  * @author Горан Анђелковић
  * @author לערי ריינהארט
@@ -321,8 +322,6 @@ $messages = array(
 'tog-shownumberswatching' => "Afichar lo nombre d'utilizaires que seguisson aquesta pagina",
 'tog-oldsig' => 'Apercebut de la signatura existenta :',
 'tog-fancysig' => 'Tractar la signatura coma de wikitèxte (sens ligam automatic)',
-'tog-externaleditor' => 'Utilizar un editor extèrne per defaut (pels utilizaires avançats, necessita una configuracion especiala sus vòstre ordinator)',
-'tog-externaldiff' => "Utilizar un comparador extèrne per defaut (pels utilizaires avançats, necessita una configuracion especiala sus vòstre ordenador, [//www.mediawiki.org/wiki/Manual:External_editors/fr mai d'informacions]).",
 'tog-showjumplinks' => 'Activar los ligams « navigacion » e « recèrca » en naut de pagina (aparéncias Myskin e autres)',
 'tog-uselivepreview' => 'Utilizar l’apercebut rapid (JavaScript) (experimental)',
 'tog-forceeditsummary' => "M'avertir quand ai pas completat lo contengut de la bóstia de comentaris",
@@ -337,6 +336,7 @@ $messages = array(
 'tog-showhiddencats' => 'Afichar las categorias amagadas',
 'tog-noconvertlink' => 'Desactivar la conversion dels títols',
 'tog-norollbackdiff' => 'Ometre lo diff aprèp l’utilizacion d’un revert',
+'tog-useeditwarning' => 'M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments',
 
 'underline-always' => 'Totjorn',
 'underline-never' => 'Pas jamai',
@@ -1006,6 +1006,8 @@ Sembla que siá estada suprimida.',
 'edit-already-exists' => 'La pagina novèla a pogut èsser creada .
 Existís ja.',
 'defaultmessagetext' => 'Messatge per defaut',
+'editwarning-warning' => "Quitar aquesta pagina vos farà pèrdre totas las modificacions qu'avètz fachas.
+Se sètz connectat amb vòstre compte, podètz levar aqueste avertiment dins la seccion {{int:prefs-editing}} de vòstras preferéncias.",
 
 # Content models
 'content-model-wikitext' => 'wikitèxte',
@@ -1273,14 +1275,6 @@ Ensajatz en utilizant lo prefix ''all:'' per recercar tot lo contengut (tot incl
 En esperant la reactivacion, podètz efectuar una recèrca via Google.
 Atencion, lor indexacion de contengut {{SITENAME}} benlèu es pas a jorn.',
 
-# Quickbar
-'qbsettings' => "Barra d'aisinas",
-'qbsettings-none' => 'Pas cap',
-'qbsettings-fixedleft' => 'Esquèrra',
-'qbsettings-fixedright' => 'Drecha',
-'qbsettings-floatingleft' => 'Flotanta a esquèrra',
-'qbsettings-floatingright' => 'Flotanta a drecha',
-
 # Preferences page
 'preferences' => 'Preferéncias',
 'mypreferences' => 'Preferéncias',
@@ -1782,7 +1776,6 @@ Per una seguretat optimala, img_auth.php es desactivat.",
 'http-read-error' => 'HTTP Error de lectura.',
 'http-timed-out' => 'HTTP request timed out.',
 'http-curl-error' => "Error al moment de la recuperacion de l'URL : $1",
-'http-host-unreachable' => "Impossible d'aténher l'URL",
 'http-bad-status' => 'I a agut un problèma al moment de la requèsta HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2164,8 +2157,8 @@ Las modificacions venentas d\'aquesta pagina e de la pagina de discussion associ
 'notvisiblerev' => 'Version suprimida',
 'watchnochange' => 'Cap de las paginas que seguissètz son pas estadas modificadas pendent lo periòde afichat.',
 'watchlist-details' => 'I a {{PLURAL:$1|pagina|paginas}} dins vòstra lista de seguiment, sens comptar las paginas de discussion.',
-'wlheader-enotif' => 'La notificacion per corrièr electronic es activada.',
-'wlheader-showupdated' => 'Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son mostradas en <b>gras</b>',
+'wlheader-enotif' => 'La notificacion per corrièr electronic es activada.',
+'wlheader-showupdated' => 'Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son mostradas en <b>gras</b>',
 'watchmethod-recent' => 'verificacion dels darrièrs cambiaments de las paginas seguidas',
 'watchmethod-list' => 'verificacion de las paginas seguidas per de modificacions recentas',
 'watchlistcontains' => 'Vòstra lista de seguiment conten $1 {{PLURAL:$1|pagina|paginas}}.',
@@ -2820,27 +2813,16 @@ Salvatz-lo sus vòstre disc dur puèi importatz-lo aicí.",
 
 # Stylesheets
 'common.css' => '/** Lo CSS plaçat aicí serà aplicat a totas las aparéncias. */',
-'standard.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Estandard. */',
-'nostalgia.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Nostalgia. */',
 'cologneblue.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Cologne Blue */',
 'monobook.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires del skin Monobook */',
-'myskin.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge MySkin */',
-'chick.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Chick */',
-'simple.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Simple */',
 'modern.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Modern */',
 'vector.css' => '/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Vector */',
 'print.css' => '/* Lo CSS plaçat aicí afectarà las impressions */',
-'handheld.css' => '/* Lo CSS plaçat aicí afectarà los aparelhs mobils en foncion de l\'abilhatge configurat $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Tot JavaScript serà cargat amb cada pagina accedida per un utilizaire quin que siá. */',
-'standard.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Standard unicament. */',
-'nostalgia.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Nostalgia unicament. */',
 'cologneblue.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Cologne Blue unicament. */',
 'monobook.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MonoBook unicament. */',
-'myskin.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MySkin unicament. */',
-'chick.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Chick unicament. */',
-'simple.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Simple unicament. */',
 'modern.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Modern unicament. */',
 'vector.js' => '/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Vector unicament. */',
 
@@ -2907,13 +2889,8 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
 'pageinfo-category-files' => 'Nombre de fichièrs',
 
 # Skin names
-'skinname-standard' => 'Estandard',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Colonha Blau',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mon interfàcia',
-'skinname-chick' => 'Poleton',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Modèrne',
 
 # Patrolling
@@ -3021,7 +2998,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largor',
 'exif-imagelength' => 'Nautor',
 'exif-bitspersample' => 'Bits per compausanta',
@@ -3186,7 +3163,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-originalimageheight' => "Nautor de l'imatge abans d'èsser requadrada",
 'exif-originalimagewidth' => "Largor de l'imatge abans d'èsser requadrada",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sens compression',
 'exif-compression-2' => "CCITT Grop 3 Longor de l'encodatge Huffman modificat de dimension 1",
 'exif-compression-3' => 'CCITT Grop 3 encodatge del fax',
@@ -3576,13 +3553,6 @@ Ensajatz la previsualizacion normala.',
 'version-software-product' => 'Produch',
 'version-software-version' => 'Version',
 
-# Special:FilePath
-'filepath' => "Camin d'accès d'un fichièr",
-'filepath-page' => 'Fichièr :',
-'filepath-submit' => 'Validar',
-'filepath-summary' => "Aquesta pagina especiala retorna lo camin d'accès complet d’un fichièr.
-Los imatges son afichats en nauta resolucion, los fichièrs àudio e vidèo son cargats e aviats dirèctament amb lor programa associat.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Recèrca dels fichièrs en doble',
 'fileduplicatesearch-summary' => 'Recèrca per de fichièrs en doble sus la banca de valors fragmentàrias.',
index 13e0a46..479063f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Oriya (à¬\93à­\9cିଆ)
+/** Oriya (à¬\93ଡ଼ିଆ)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -33,6 +33,8 @@ $digitTransformTable = array(
        '9' => '୯', # &#x0b6f;
 );
 
+$linkTrail = "/^([a-z\x{0B00}-\x{0B7F}]+)(.*)$/sDu";
+
 /** namespace translations from translatewiki.net 
  * @author Shijualex
  * @author Psubhashish
@@ -271,23 +273,21 @@ $messages = array(
 'tog-editsectiononrightclick' => 'ବିଭାଗ ନାମରେ ଡାହାଣ କ୍ଲିକ କରି ବିଭାଗ ସମ୍ପାଦନାକୁ ସଚଳ କରିବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-showtoc' => 'ସୂଚୀପତ୍ର ଦେଖାଇବେ (୩ରୁ ଅଧିକ ମୁଖ୍ୟ ନାମ ଥିଲେ)',
 'tog-rememberpassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
-'tog-watchcreations' => 'ମà­\8b à¬¤à¬¿à¬\86ରି à¬ªà­\83ଷà­\8dଠାସବà­\81à¬\95à­\81 à¬\8fବà¬\82 à¬®à­\8b à¬\85ପଲà­\8bଡà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନ୍ତୁ',
-'tog-watchdefault' => 'ମà­\81à¬\81 à¬¬à¬¦à¬³à­\87à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନ୍ତୁ',
-'tog-watchmoves' => 'ମà­\81à¬\81 à¬\98à­\81à¬\9eà­\8dà¬\9aାà¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନ୍ତୁ',
-'tog-watchdeletion' => 'ମà­\81à¬\81 à¬²à¬¿à¬­à¬¾à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡନ୍ତୁ',
-'tog-minordefault' => 'ସବà­\81ଯାà¬\95 à¬¸à¬®à­\8dପାଦନାà¬\95à­\81 à¬\9bାà¬\8fà¬\81 à¬\9fିà¬\95à­\87 ବଦଳ ଭାବରେ ସୂଚିତ କରିବେ',
+'tog-watchcreations' => 'ମà­\8b à¬¤à¬¿à¬\86ରି à¬ªà­\83ଷà­\8dଠାସବà­\81à¬\95à­\81 à¬\8fବà¬\82 à¬®à­\8b à¬\85ପଲà­\8bଡ଼à¬\97à­\81ଡ଼ିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡ଼ନ୍ତୁ',
+'tog-watchdefault' => 'ମà­\81à¬\81 à¬¬à¬¦à¬³à­\87à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡ଼ିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡ଼ନ୍ତୁ',
+'tog-watchmoves' => 'ମà­\81à¬\81 à¬\98à­\81à¬\9eà­\8dà¬\9aାà¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡ଼ିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡ଼ନ୍ତୁ',
+'tog-watchdeletion' => 'ମà­\81à¬\81 à¬²à¬¿à¬­à¬¾à¬\87ଥିବା à¬ªà­\83ଷà­\8dଠା à¬\8fବà¬\82 à¬«à¬¾à¬\87ଲà¬\97à­\81ଡ଼ିà¬\95à­\81 à¬®à­\8bର à¬¦à­\87à¬\96ଣାତାଲିà¬\95ାରà­\87 à¬¯à­\8bଡ଼ନ୍ତୁ',
+'tog-minordefault' => 'ସବà­\81ଯାà¬\95 à¬¸à¬®à­\8dପାଦନାà¬\95à­\81 à¬\9bାà¬\8fà¬\81 à¬\9bà­\8bà¬\9f ବଦଳ ଭାବରେ ସୂଚିତ କରିବେ',
 'tog-previewontop' => 'ଏଡ଼ିଟ ବାକ୍ସ ଆଗରୁ ଦେଖଣା ଦେଖାଇବେ',
 'tog-previewonfirst' => 'ପ୍ରଥମ ବଦଳର ଦେଖଣା ଦେଖାଇବେ',
 'tog-nocache' => 'ବ୍ରାଉଜର ପୃଷ୍ଠା ସଂରକ୍ଷଣକୁ ଅଚଳ କରିବେ',
-'tog-enotifwatchlistpages' => 'ମୋ ଦେଖଣାତାଲିକାରେ ଥିବା ପୃଷ୍ଠା ବା ଫାଇଲରେ କିଛି ବଦଳ ହେଲେ ମୋତେ ଇ-ମେଲ କରିବେ',
+'tog-enotifwatchlistpages' => 'ମୋ ଦେଖଣାତାଲିକାରେ ଥିବା ପୃଷ୍ଠା ବା ଫାଇଲରେ କିଛି ବଦଳ ହେଲେ ମୋତେ ଇମେଲ କରିବେ',
 'tog-enotifusertalkpages' => 'ମୋର ଆଲୋଚନା ପୃଷ୍ଠାରେ କିଛି ବଦଳ ହେଲେ ମୋତେ ଇ-ମେଲ କରିବେ',
 'tog-enotifminoredits' => 'ପୃଷ୍ଠାରେ ଏବଂ ଫାଇଲଗୁଡିକରେ ଛୋଟ ଛୋଟ ବଦଳ ହେଲେ ବି ମୋତେ ଇ-ମେଲ କରିବେ',
-'tog-enotifrevealaddr' => 'ସୂଚନା ଇ-ମେଲ ରେ ମୋର ଇ-ମେଲ ଠିକଣା ଦେଖାଇବେ',
+'tog-enotifrevealaddr' => 'ସୂଚନା ଇମେଲ ରେ ମୋର ଇମେଲ ଠିକଣା ଦେଖାଇବେ',
 'tog-shownumberswatching' => 'ଦେଖୁଥିବା ବ୍ୟବହାରକାରୀଙ୍କ ସଂଖ୍ୟା ଦେଖାଇବେ',
 'tog-oldsig' => 'ଏବେ ଥିବା ନାମ:',
 'tog-fancysig' => 'ଦସ୍ତଖତକୁ ଉଇକିଟେକ୍ସଟ ଭାବରେ ଗଣିବେ (ଆପେଆପେ ଥିବା ଲିଙ୍କ ବିନା)',
-'tog-externaleditor' => 'ବାହାର ସମ୍ପାଦକଟି ଆପଣାଛାଏଁ ବ୍ୟବହାର କରିବେ (କେବଳ ପଟୁ ସଭ୍ୟଙ୍କ ପାଇଁ, ଏଥି ନିମନ୍ତେ ଆପଣଙ୍କ କମ୍ପୁଟରରେ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
-'tog-externaldiff' => 'ବାହାର ବାଛିବା (external diff) ଆପଣାଛାଏଁ ବ୍ୟବହାର କରିବେ (କେବଳ ପଟୁ ସଭ୍ୟଙ୍କ ପାଇଁ, ଏଥି ନିମନ୍ତେ ଆପଣଙ୍କ କମ୍ପୁଟରରେ ବିଶେଷ ସଜାଣି ଲୋଡ଼ା । [//www.mediawiki.org/wiki/Manual:External_editors ଅଧିକ ସୂଚନା])',
 'tog-showjumplinks' => '"ଡେଇଁଯିବେ" ଲିଙ୍କସବୁକୁ ସଚଳ କରିବେ',
 'tog-uselivepreview' => 'ସାଥେ ସାଥେ ଚାଲିଥିବା ଦେଖଣା ବ୍ୟବହାର କରିବେ (ଜାଭାସ୍କ୍ରିପ୍ଟ ଲୋଡ଼ା)',
 'tog-forceeditsummary' => 'ଖାଲି ସମ୍ପାଦନା ସାରକଥାକୁ ଯିବା ବେଳେ ମୋତେ ଜଣାଇବେ',
@@ -301,6 +301,7 @@ $messages = array(
 'tog-diffonly' => 'ତୁଳନା ତଳେ ପୃଷ୍ଠାର ଭିତର ଭାଗ ଦେଖାନ୍ତୁ ନାହିଁ',
 'tog-showhiddencats' => 'ଲୁଚାଯାଇଥିବା ଶ୍ରେଣୀଗୁଡ଼ିକ ଦେଖାଇବେ',
 'tog-norollbackdiff' => 'ରୋଲବ୍ୟାକ କଲାପରେ ତୁଳନା ଦେଖାନ୍ତୁ ନାହିଁ',
+'tog-useeditwarning' => 'ଯେତେବେଳେ ମୁଁ ଗୋଟିଏ ସାଇତାଯାଇନଥିବା ପୃଷ୍ଠାକୁ ବନ୍ଦ କରିଦିଏ ମୋତେ ଚେତାବନୀ ଦେବେ',
 
 'underline-always' => 'ସବୁବେଳେ',
 'underline-never' => 'କେବେନୁହେଁ',
@@ -364,6 +365,18 @@ $messages = array(
 '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 ଡିସେମ୍ବର',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ଶ୍ରେଣୀ|ଶ୍ରେଣୀସମୂହ}}',
@@ -470,7 +483,7 @@ $messages = array(
 'viewhelppage' => 'ସହଯୋଗ ପୃଷ୍ଠାଗୁଡ଼ିକ ଦେଖନ୍ତୁ',
 'categorypage' => 'ଶ୍ରେଣୀ ପୃଷ୍ଠାଟିକୁ ଦେଖାଇବେ',
 'viewtalkpage' => 'ଆଲୋଚନାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ',
-'otherlanguages' => 'ଅଲଗା ଭାଷା',
+'otherlanguages' => 'ଅଲଗା ଭାଷାରେ',
 'redirectedfrom' => '($1 ରୁ ଲେଉଟି ଆସିଛି)',
 'redirectpagesub' => 'ଆଉଥରେ ଫେରିବା ପୃଷ୍ଠା',
 'lastmodifiedat' => 'ଏହି ପୃଷ୍ଠାଟି $1 ତାରିଖ $2 ବେଳେ ବଦଳାଯାଇଥିଲା ।',
@@ -531,7 +544,7 @@ $1',
 'editlink' => 'ସମ୍ପାଦନା',
 'viewsourcelink' => 'ମୂଳାଧାର ଦେଖିବେ',
 'editsectionhint' => '$1 ଭାଗଟିକୁ ବଦଳାଇବେ',
-'toc' => 'ଭିତର à¬\9aିà¬\9c',
+'toc' => 'ବିଷà­\9fସà­\82à¬\9aà­\80',
 'showtoc' => 'ଦେଖାଇବେ',
 'hidetoc' => 'ଲୁଚାନ୍ତୁ',
 'collapsible-collapse' => 'ଚାପିଦେବେ',
@@ -670,7 +683,10 @@ $2',
 'welcomecreation-msg' => 'ଆପଣଙ୍କ ଖାତାଟି ଖୋଲାଗଲା
 ନିଜର [[Special:Preferences|{{SITENAME}} ପସନ୍ଦସବୁକୁ]] ବଦଳାଇବାକୁ ଭୁଲିବେ ନାହିଁ ।',
 'yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
+'userlogin-yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ',
 'yourpassword' => 'ପାସୱାର୍ଡ଼',
+'userlogin-yourpassword' => 'ପାସୱାର୍ଡ଼',
+'userlogin-yourpassword-ph' => 'ଆପଣଙ୍କ ପାସୱାର୍ଡ଼ ନିବେଶ କରନ୍ତୁ',
 'yourpasswordagain' => 'ପାସୱାର୍ଡ଼ ଆଉଥରେ:',
 'remembermypassword' => 'ଏହି ବ୍ରାଉଜରରେ (ସବୁଠୁ ଅଧିକ ହେଲେ $1 {{PLURAL:$1|day|ଦିନ}}) ପାଇଁ ମୋ ଲଗଇନ ମନେ ରଖିଥିବେ',
 'securelogin-stick-https' => 'ଲଗ ଇନ କଲାପରେ HTTPS ସହ ଯୋଡ଼ି ହୋଇ ରହନ୍ତୁ',
@@ -685,6 +701,7 @@ $2',
 'logout' => 'ଲଗଆଉଟ',
 'userlogout' => 'ଲଗ ଆଉଟ',
 'notloggedin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
+'userlogin-noaccount' => 'ଖାତାଟିଏ ନାହିଁ?',
 'nologin' => 'ଖାତାଟିଏ ନାହିଁ? $1।',
 'nologinlink' => 'ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
 'createaccount' => 'ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ',
@@ -741,8 +758,8 @@ continue using your old password.',
 'blocked-mailpassword' => 'ଆପଣଙ୍କ IP ଠିକଣାଟି ସମ୍ପାଦନାରେ ଭାଗ ନେବାରୁ ଅଟକାଯାଇଛି, ତେଣୁ ପାସୱାର୍ଡ଼ ଫେରନ୍ତା କାମ ବ୍ୟବହାର କରି ଅବ୍ୟବହାରକୁ ରୋକିବା ଅନୁମୋଦିତ ନୁହେଁ ।',
 'eauthentsent' => 'ଆପଣଙ୍କ ବଛା ଇ-ମେଲ ଠିକଣାକୁ ଏକ ଥୟ କରିବା ଇ-ମେଲଟିଏ ପଠାଇଦିଆଗଲା ।
 ଖାତାଟି ଆପଣଙ୍କର ବୋଲି ଥୟ କରିବା ନିମନ୍ତେ ଆଉ କେଉଁ ଇ-ମେଲ ଆପଣଙ୍କ ଖାତାକୁ ପଠାହେବା ଆଗରୁ ଆପଣଙ୍କୁ ସେହି ଇ-ମେଲରେ ଥିବା ସୂଚନା ଅନୁସରଣ କରିବାକୁ ପଡ଼ିବ ।',
-'throttled-mailpassword' => 'à¬\97ତ {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà­\8dà¬\9fାରà­\87|$1 à¬\98ଣà­\8dà¬\9fାରà­\87}} à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬\8fà¬\95 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬®à¬¨à­\87à¬\95ରିବା à¬¸à­\82à¬\9aନାଟିଏ ପଠାଯାଇଛି ।
-à¬\85ବà­\8dà­\9fବହାରà¬\95à­\81 à¬°à­\8bà¬\95ିବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87, {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà­\8dà¬\9fାରà­\87|$1 à¬\98ଣà­\8dà¬\9fାରà­\87}} à¬\95à­\87ବଳ à¬\97à­\8bà¬\9fିà¬\8f à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ ହିଁ ପଠାହେବ ।',
+'throttled-mailpassword' => 'à¬\97ତ {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà­\8dà¬\9fାରà­\87|$1 à¬\98ଣà­\8dà¬\9fାରà­\87}} à¬\86ପଣà¬\99à­\8dà¬\95à­\81 à¬\8fà¬\95 à¬ªà­\81ନà¬\83ସà­\8dଥାପନ à¬\87ମà­\87ଲଟିଏ ପଠାଯାଇଛି ।
+à¬\85ବà­\8dà­\9fବହାରà¬\95à­\81 à¬°à­\8bà¬\95ିବା à¬¨à¬¿à¬®à¬¨à­\8dତà­\87, {{PLURAL:$1|à¬\8fà¬\95 à¬\98ଣà­\8dà¬\9fାରà­\87|$1 à¬\98ଣà­\8dà¬\9fାରà­\87}} à¬\95à­\87ବଳ à¬\97à­\8bà¬\9fିà¬\8f à¬\87ମà­\87ଲ ହିଁ ପଠାହେବ ।',
 'mailerror' => 'ମେଲ ପଠାଇବାରେ ଭୁଲ : $1',
 'acct_creation_throttle_hit' => 'ଏହି ଉଇକିର ଦେଖଣାହାରୀ ମାନେ ଆପଣଙ୍କ IP ଠିକଣା ବ୍ୟବହାର କରି ବିଗତ ଦିନରେ {{PLURAL:$1|ଖାତାଟିଏ|$1 ଗୋଟି ଖାତା}} ତିଆରି କରିଛନ୍ତି ଯାହା ସେହି ସମୟସୀମା ଭିତରେ ସବୁଠାରୁ ଅଧିକ ଥିଲା ।
 ତେଣୁ, ଏହି IP ଠିକଣାର ଦେଖଣାହାରୀ ଗଣ ଏବେ ଆଉ ଅଧିକ ଖାତା ଖୋଲିପାରିବେ ନାହିଁ ।',
@@ -795,9 +812,10 @@ continue using your old password.',
 
 # Special:PasswordReset
 'passwordreset' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
-'passwordreset-text' => 'ନିà¬\9c à¬\96ାତାର à¬¸à¬¬à¬¿à¬¶à­\87ଷ à¬¬à¬¿à¬¬à¬°à¬£à­\80 à¬\8fà¬\95 à¬\87-ମà­\87ଲରà­\87 à¬ªà¬¾à¬\87ବା ପାଇଁ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ ।',
+'passwordreset-text' => 'ନିà¬\9c à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼à¬\95à­\81 à¬ªà­\81ନà¬\83ସà­\8dଥାପନ à¬\95ରିବା ପାଇଁ ଏହି ଆବେଦନ ପତ୍ରଟି ପୂରଣ କରନ୍ତୁ ।',
 'passwordreset-legend' => 'ପାସୱାର୍ଡ଼ ପୁନସ୍ଥାପନ କରନ୍ତୁ',
 'passwordreset-disabled' => 'ପାସୱାର୍ଡ଼କୁ ପୁରାପୁରି ମୂଳକୁ ଫେରାଇବା ଏହି ଉଇକିରେ ଅଚଳ କରାଯାଇଅଛି ।',
+'passwordreset-emaildisabled' => 'ଏହି ଉଇକିରେ ଇମେଲ ସୁବିଧା ଅଚଳ କରାଯାଇଅଛି ।',
 'passwordreset-pretext' => '{{PLURAL:$1||ତଳେ ଥିବା ତଥ୍ୟସମୂହରୁ କୌଣସି ଗୋଟିଏ ଦିଅନ୍ତୁ}}',
 'passwordreset-username' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
 'passwordreset-domain' => 'ଡୋମେନ:',
@@ -824,8 +842,8 @@ $2
 ଆପଣ ନିଜ ପୁରୁଣା ପାସୱାର୍ଡ଼ଟି ଆଗପରି ବ୍ୟବହାର କରିପାରନ୍ତି ।',
 'passwordreset-emailelement' => 'ଇଉଜର ନାମ: $1
 ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼: $2',
-'passwordreset-emailsent' => 'à¬\8fà¬\95 à¬®à¬¨à­\87ପà¬\95ାà¬\87ବା à¬\87-ମେଲ ପଠାଇଦିଆଯାଇଅଛି ।',
-'passwordreset-emailsent-capture' => 'ତଳà­\87 à¬¦à¬¿à¬\86ଯାà¬\87ଥିବା à¬­à¬³à¬¿ à¬®à¬¨à­\87ପà¬\95ାà¬\87ବା à¬\87-ମà­\87ଲà¬\9fିà¬\8f à¬ªà¬ à¬¾à¬¦à¬¿à¬\86à¬\97ଲା ।',
+'passwordreset-emailsent' => 'à¬\8fà¬\95 à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬ªà­\81ନà¬\83ସà­\8dଥାପନ à¬\87ମେଲ ପଠାଇଦିଆଯାଇଅଛି ।',
+'passwordreset-emailsent-capture' => 'ତଳà­\87 à¬¦à­\87à¬\96ାଯାà¬\89ଥିବା à¬­à¬³à¬¿, à¬ªà¬¾à¬¸à­±à¬¾à¬°à­\8dଡ଼ à¬ªà­\81ନà¬\83ସà­\8dଥାପନ à¬\87ମà­\87ଲà¬\9fିà¬\8f à¬ªà¬ à¬¾à¬\87ଦିà¬\86ଯାà¬\87à¬\9bି ।',
 'passwordreset-emailerror-capture' => 'ଗୋଟିଏ ମନେପକାଇବା ଇ-ମେଲ ତିଆରି କରାଯାଇଥିଲା, ଯାହାକି ତଳେ ଅଛି, କିନ୍ତୁ ଏହାକୁ ବ୍ୟବହାରକାରୀକୁ ପଠାଇବାରେ ଅସଫଳ ହେଲା :$1',
 
 # Special:ChangeEmail
@@ -1053,6 +1071,8 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 'content-failed-to-parse' => '$1 ପ୍ରକାର ପାଇଁ $2 ଲେଖାକୁ ବର୍ଣ୍ଣନା କରିପାରିଲା ନାହିଁ: $3',
 'invalid-content-data' => 'ଅବୈଧ ଆଧାର ତଥ୍ୟ',
 'content-not-allowed-here' => '"$1" ବିଷୟଗୁଡିକ [[$2]]ପୃଷ୍ଠାରେ ରହିପାରିବ ନାହିଁ',
+'editwarning-warning' => 'ଏହି ପୃଷ୍ଠାକୁ ଛାଡ଼ି ଚାଲିଗଲେ ହୁଏ ତ ଆପଣ କରିଥିବା କିଛି ସମ୍ପାଦନା ହରାଇ ପାରନ୍ତି ।
+ଯଦି ଆପଣ ଲଗ ଇନ କରିଥାନ୍ତି ତେବେ ଆପଣଙ୍କ ପସନ୍ଦର "ସମ୍ପାଦନା" ଭାଗରେ ଏହି ଚେତାବନୀଟିକୁ ଅଚଳ କରିପାରିବେ ।',
 
 # Content models
 'content-model-wikitext' => 'ଉଇକିଟେକ୍ସଟ',
@@ -1340,15 +1360,6 @@ $1",
 ଆପଣ ଏହି ଭିତରେ ଗୁଗଲ ଦେଖିପାରନ୍ତି ।
 ଜାଣିରଖନ୍ତୁ ଯେ {{SITENAME}}ର ବିଷୟ ସୂଚି ପୁରାତନ ହୋଇଥାଇପାରେ ।',
 
-# Quickbar
-'qbsettings' => 'ସହଳ ପଟି (Quickbar)',
-'qbsettings-none' => 'କିଛି ନାହିଁ',
-'qbsettings-fixedleft' => 'ବାମକୁ ଥୟ କରାଗଲା',
-'qbsettings-fixedright' => 'ଡାହାଣକୁ ଥୟ କରାଗଲା',
-'qbsettings-floatingleft' => 'ବାମରେ ଭାସନ୍ତା',
-'qbsettings-floatingright' => 'ଡାହାଣରେ ଭାସନ୍ତା',
-'qbsettings-directionality' => 'ଆପଣଙ୍କ ଭାଷାର ବାମ-ଡାହାଣ ଲିଖନ ଶୈଳୀ ଅନୁସାରେ ସଜାଡ଼ି ଦିଆଗଲା',
-
 # Preferences page
 'preferences' => 'ପସନ୍ଦ',
 'mypreferences' => 'ପସନ୍ଦ',
@@ -1903,7 +1914,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization ଦେଖନ୍ତୁ
 'http-read-error' => 'HTTP ପଢ଼ିବା ଭୁଲ ।',
 'http-timed-out' => 'HTTP ଅନୁରୋଧ ମିଆଦ ପୁରିଗଲା ।',
 'http-curl-error' => '$1 URL କୁ ପାଇବାରେ ବିଫଳ',
-'http-host-unreachable' => 'URLଟି ପାଇଲୁ ନାହିଁ ।',
 'http-bad-status' => 'HTTP ଅନୁରୋଧ ବେଳେ କିଛି ଅସୁବିଧା ହେଲା : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2062,6 +2072,8 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 ସେସବୁ ଅଧିକ ଉପଯୁକ୍ତ ପ୍ରସଙ୍ଗ ସହ ଯୋଡ଼ାହେବା ଉଚିତ  ।<br />
 [[MediaWiki:Disambiguationspage]] ସହ ଯୋଡ଼ାଥିବା ଛାଞ୍ଚ ବ୍ୟବହାର କରୁଥିଲେ ପୃଷ୍ଠାଟିଏକୁ ବହୁବିକଳ୍ପ ପୃଷ୍ଠା ବୋଲି କୁହାଯାଏ",
 
+'pageswithprop-submit' => 'ଯିବା',
+
 'doubleredirects' => 'ଯୋଡ଼ା ପୁନପ୍ରେରଣ',
 'doubleredirectstext' => 'ଏହି ପୃଷ୍ଠା ବାକି ବହୁବିକଳ୍ପ ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ିଥାଏ ।
 ପ୍ରତ୍ୟେକ ଧାଡ଼ିରେ ପ୍ରଥମ ଓ ଶେଷ ପୁନପ୍ରେରଣ ସହ ଯୋଡ଼ିବା ଲିଙ୍କ ରହିଥାଏ, ଆହୁରି ମଧ୍ୟ ଏଥିରେ ଦ୍ଵିତୀୟ ପୁନପ୍ରେରଣର ଲକ୍ଷ ସହ ଯୋଡ଼ିବାର ଲିଙ୍କ ଥାଏ , ଯାହାକି ସାଧାରଣତ "ପ୍ରକୃତ" ଲକ୍ଷ ପୃଷ୍ଠା ହୋଇଥାଏ, ଯାହାକୁ ପ୍ରଥମ ପୁନପ୍ରେରଣ ପୃଷ୍ଠା ଯୋଡ଼ିଥାଏ ।
@@ -2312,8 +2324,8 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 'notvisiblerev' => 'ଜଣେ ଅଲଗା ବ୍ୟବହାରକାରୀଙ୍କ ଦେଇ କରାଯାଇଥିବା ସେଶ ସଂସ୍କରଣଟି ଲିଭାଇଦିଆଗଲା ।',
 'watchnochange' => 'ଆପଣଙ୍କ ଦେଇ ଦେଖାଯାଇଥିବା ସମୟ ସୀମା ଭିତରେ କୌଣସିଟି ପୃଷ୍ଠାର ବଦଳ କରାଯାଇନାହିଁ ।',
 'watchlist-details' => 'ଆପଣଙ୍କ ଦେଖଣା ତାଲିକାରେ ଆଲୋଚନା ପୃଷ୍ଠାକୁ ଛାଡ଼ି {{PLURAL:$1|$1 ଟି ପୃଷ୍ଠା|$1 ଟି ପୃଷ୍ଠା}} ଅଛି ।',
-'wlheader-enotif' => 'ଇ-ମେଲ ସୂଚନାକୁ ସଚଳ କରାଗଲା ।',
-'wlheader-showupdated' => "ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ '''ମୋଟା ଅକ୍ଷର'''ରେ ଦେଖାଯାଇଅଛି ।",
+'wlheader-enotif' => 'ଇ-ମେଲ ସୂଚନାକୁ ସଚଳ କରାଗଲା ।',
+'wlheader-showupdated' => "ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ '''ମୋଟା ଅକ୍ଷର'''ରେ ଦେଖାଯାଇଅଛି ।",
 'watchmethod-recent' => 'ଏଡଖାଯାଇଥିବା ପୃଷ୍ଠାର ନଗଦ ବଦଳ ପରଖୁଛୁଁ',
 'watchmethod-list' => 'ନଗଦ ବଦଳ ନିମନ୍ତେ ଦେଖାଯାଇଥିବା ପୃଷ୍ଠାମାନ ପରଖୁଛୁଁ',
 'watchlistcontains' => 'ଆପଣଙ୍କ ଦେଖଣାତାଲିକାରେ $1 {{PLURAL:$1|ଗୋଟି ପୃଷ୍ଠା|ଗୋଟି ପୃଷ୍ଠା}} ରହିଅଛି ।',
@@ -3199,6 +3211,11 @@ $1',
 'ago' => '$1 ଆଗରୁ',
 'just-now' => 'ଏବେ ଏବେ',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ଘଣ୍ଟା}} ଆଗରୁ',
+'minutes-ago' => '$1 {{PLURAL:$1|ମିନିଟ|ମିନିଟ}} ଆଗରୁ',
+'seconds-ago' => '$1 {{PLURAL:$1|ସେକେଣ୍ଡ|ସେକେଣ୍ଡ}} ଆଗରୁ',
+
 # Bad image list
 'bad_image_list' => 'ଗଢ଼ଣଟି ଏମିତି ହେବ:
 
@@ -3227,7 +3244,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ଓସାର',
 'exif-imagelength' => 'ଉଚ୍ଚତା',
 'exif-bitspersample' => 'ଉପାଦାନ ପ୍ରତି ବିଟ',
@@ -3405,7 +3422,7 @@ $1',
 'exif-originalimageheight' => 'ଛୋଟ କରାଯିବ ଆଗରୁ ଛବିର ଉଚ୍ଚତା',
 'exif-originalimagewidth' => 'ଛୋଟ କରାଯିବ ଆଗରୁ ଛବିର ଓସାର',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ଅସମ୍ପାଦିତ',
 'exif-compression-2' => 'CCITT ଗୋଠ ୩ ୧-ବିମିୟ ବଦଳାଯାଇଥିବା ହଫମାନ ରନ ଲମ୍ବ ଏନକୋଡ଼ିଙ୍ଗ',
 'exif-compression-3' => 'CCITT ଗୋଠ ୩ ଫାକ୍ସ ଏନକୋଡ଼ିଙ୍ଗ',
@@ -3818,13 +3835,6 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'version-entrypoints-header-entrypoint' => 'ପ୍ରବେଶ ବିନ୍ଦୁ',
 'version-entrypoints-header-url' => 'ଇଉଆରଏଲ',
 
-# Special:FilePath
-'filepath' => 'ଫାଇଲ ପଥ',
-'filepath-page' => 'ଫାଇଲ:',
-'filepath-submit' => 'ଯିବା',
-'filepath-summary' => 'ଏହି ବିଶେଷ ପୃଷ୍ଠା ଏକ ଫାଇଲର ପୁରା ପଥ ଦେଖାଇଦିଏ ।
-ଛବିସବୁ ପୁରା ରେଜୋଲୁସନରେ ଦେଖାଇଦିଆଯାଏ, ବାକି ଫାଇଲସବୁ ସେମାନଙ୍କ ସହଯୋଗୀ ପ୍ରଗାମ ମାନଙ୍କ ଦେଇ ଆରମ୍ଭ ହୋଇଥାନ୍ତି ।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ଏହାର ନକଲ ପୃଷ୍ଠା ଖୋଜିବେ ।',
 'fileduplicatesearch-summary' => 'ହାସ୍ ମୂଲ୍ୟକୁ ନେଇ ଦୁଇଥର ଥିବା ଫାଇଲ ଖୋଜନ୍ତୁ ।',
@@ -3914,6 +3924,8 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'htmlform-submit' => 'ଦାଖଲକରିବା',
 'htmlform-reset' => 'କରାଯାଇଥିବା ବଦଳ ପଛକୁ ଫେରାଇବେ',
 'htmlform-selectorother-other' => 'ବାକି',
+'htmlform-no' => 'ନାହିଁ',
+'htmlform-yes' => 'ହଁ',
 
 # SQLite database support
 'sqlite-has-fts' => 'ପୁରା ଟେକ୍ସ୍ଟ ଖୋଜା ସହଯୋଗ ସହିତ $1',
index 3a6e545..651f561 100644 (file)
@@ -187,7 +187,7 @@ $fallback8bitEncoding =  'windows-1251';
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Æрвитæнты бын хахх',
+'tog-underline' => 'Æрвитæнты бын хахх:',
 'tog-justify' => 'Æмвæз абзацтæ',
 'tog-hideminor' => 'Чысыл ивддзинæдтæ фæстаг ивддзинæдты номхыгъды мауал æвдис',
 'tog-hidepatrolled' => 'Айсын бæрæггонд ивдтытæ фæстаг ивдтытæй',
@@ -196,7 +196,7 @@ $messages = array(
 'tog-usenewrc' => 'Фæстаг æмæ цæстдард ивдтытæ фарсмæ гæсгæ иу кæнæт (домы JavaScript)',
 'tog-numberheadings' => 'Сæртæн хæдæвзæргæ номыр æвæрын',
 'tog-showtoolbar' => 'Æвдисын ивыны панел (домы JavaScript)',
-'tog-editondblclick' => 'Фæрстæ дыкъæппæй ив (JavaScript)',
+'tog-editondblclick' => 'Фæрстæ дыкъæппæй ив (домы JavaScript)',
 'tog-editsection' => 'Равдис «баив æй» æрвитæн тексты алы хайы дæр',
 'tog-editsectiononrightclick' => 'Хайы сæрыл рахис æркъæппæй ивыны фадат баиу кæнын (домы JavaScript)',
 'tog-showtoc' => 'Сæрты номхыгъд æвдисын (æртæйæ фылдæрсæр цы фарсы ис, уым)',
@@ -216,8 +216,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Цал архайæджы фарсмæ сæ цæст дарынц, уый равдис',
 'tog-oldsig' => 'Ныры къухæрфыст:',
 'tog-fancysig' => 'Сæвæрын къухæрфыст викитекстæй (æнæ хæдæвзæргæ æрвитæнæй)',
-'tog-externaleditor' => 'Архайын æддаг ивæнæй (æрмæст эксперттæн, домы сæрмагонд æвæрдтытæ компьютерыл. [//www.mediawiki.org/wiki/Manual:External_editors Лæмбынæг.])',
-'tog-externaldiff' => 'Архайын æндæр иртасæнæй (æрмæст эксперттæн, домы сæрмагонд æвæрдтытæ компьютерыл. [//www.mediawiki.org/wiki/Manual:External_editors Лæмбынæг.])',
 'tog-showjumplinks' => 'Тагъд æрвитæнтæй пайда кæн',
 'tog-uselivepreview' => 'Архайын тагъд разбакастæй (домы JavaScript) (эксперименталон)',
 'tog-forceeditsummary' => 'Фæдзæхсæд иу мæ, кæд ивды афыст афтид уа',
@@ -231,8 +229,9 @@ $messages = array(
 'tog-diffonly' => 'Ма æвдис фарсы мидис иртасæны бынмæ',
 'tog-showhiddencats' => 'Æмбæхст категоритæ æвдис',
 'tog-norollbackdiff' => 'Рауадзын иртасæн раздæхты фæстæ',
+'tog-useeditwarning' => 'Зæгъæт-иу мын системæ, æнæ æвæрд архайдимæ ивыны фарс-иу куы æхкæнон',
 
-'underline-always' => 'Æдзух',
+'underline-always' => 'Алкуыдæр',
 'underline-never' => 'Никуы',
 'underline-default' => 'Цъар æви сгарæнмæ гæсгæ',
 
@@ -297,7 +296,7 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категори|Категоритæ}}',
-'category_header' => 'Категори "$1"',
+'category_header' => 'Категори "{{grammar:genitive|$1}}" фæрстæ',
 'subcategories' => 'Дæлкатегоритæ',
 'category-media-header' => 'Категори "{{grammar:genitive|$1}}" файлтæ',
 'category-empty' => "''Ацы категори афтид у.''",
@@ -322,13 +321,13 @@ $messages = array(
 'morenotlisted' => 'Фылдæр æнææвдыст...',
 'mypage' => 'Фарс',
 'mytalk' => 'Ныхас',
-'anontalk' => 'Ацы IP-адрисы тæрхон',
+'anontalk' => 'Ацы IP адрисы тæрхон',
 'navigation' => 'Навигаци',
 'and' => '&#32;æмæ',
 
 # Cologne Blue skin
-'qbfind' => 'Ð\90гÑ\83р',
-'qbbrowse' => 'Фен',
+'qbfind' => 'СÑ\81ар',
+'qbbrowse' => 'СгаÑ\80',
 'qbedit' => 'Ивын',
 'qbpageoptions' => 'Ацы фарс',
 'qbmyoptions' => 'Мæ фæрстæ',
@@ -355,7 +354,7 @@ $messages = array(
 
 'navigation-heading' => 'Навигацион меню',
 'errorpagetitle' => 'Рæдыд',
-'returnto' => 'Фæстæмæ $1 фарсмæ.',
+'returnto' => 'Фæстæмæ, {{grammar:allative|$1}}.',
 'tagline' => '{{grammar:ablative|{{SITENAME}}}}',
 'help' => 'Æххуыс',
 'search' => 'Агуырд',
@@ -365,10 +364,10 @@ $messages = array(
 'history' => 'Фарсы истори',
 'history_short' => 'Истори',
 'updatedmarker' => 'ноггонд мæ фæстаг æрбахызтæй',
-'printableversion' => 'Мыхурмæ верси',
-'permalink' => 'Ð\90Ñ\86Ñ\8b Ð²ÐµÑ\80Ñ\81имæ æрвитæн',
+'printableversion' => 'Мыхурæн',
+'permalink' => 'УдгаÑ\81 æрвитæн',
 'print' => 'Мыхуыр',
-'view' => 'Æркæст',
+'view' => 'Кæсын',
 'edit' => 'Ивын',
 'create' => 'Скæнын',
 'editthispage' => 'Ивын ацы фарс',
@@ -379,34 +378,34 @@ $messages = array(
 'viewdeleted_short' => 'Кæсын {{PLURAL:$1|иу хафт ивд|$1 хафт ивдтытæ}}',
 'protect' => 'Сæхгæнын',
 'protect_change' => 'баивын',
-'protectthispage' => 'СæÑ\85гæн Ð°Ñ\86Ñ\8b Ñ\84аÑ\80Ñ\81',
+'protectthispage' => 'Ð\90Ñ\86Ñ\8b Ñ\84аÑ\80Ñ\81 Ñ\81æÑ\85гæнÑ\8bн',
 'unprotect' => 'Ивын хъахъхъæд',
 'unprotectthispage' => 'Ивын ацы фарсы хъахъхъæд',
 'newpage' => 'Ног фарс',
 'talkpage' => 'Ацы фарсы тыххæй ныхас',
 'talkpagelinktext' => 'Ныхас',
 'specialpage' => 'Сæрмагонд фарс',
-'personaltools' => 'Ð\9cигæнæнтæ',
+'personaltools' => 'Хион Ñ\84æÑ\80æзтæ',
 'postcomment' => 'Ног хай',
 'articlepage' => 'Фенын уац',
 'talk' => 'Тæрхон',
 'views' => 'Æркæстытæ',
 'toolbox' => 'Фæрæзтæ',
-'userpage' => 'Ð\90Ñ\86Ñ\8b Ð°Ñ\80Ñ\85айæджÑ\8b Ñ\84аÑ\80Ñ\81 Ñ\84ен',
-'projectpage' => 'Проекты фарс фен',
-'imagepage' => 'Файлы фарс фен',
-'mediawikipage' => 'Фыстæджы фарс фен',
+'userpage' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ñ\84аÑ\80Ñ\81 Ñ\84енÑ\8bн',
+'projectpage' => 'Проекты фарс фенын',
+'imagepage' => 'Файлы фарс фенын',
+'mediawikipage' => 'Фыстæджы фарс фенын',
 'templatepage' => 'Хуызæджы фарс фенын',
-'viewhelppage' => 'Æххуысы фарс фен',
-'categorypage' => 'Категорийы фарс фен',
+'viewhelppage' => 'Æххуысы фарс фенын',
+'categorypage' => 'Категорийы фарс фенын',
 'viewtalkpage' => 'Тæрхон фен',
 'otherlanguages' => 'Æндæр æвзæгтыл',
 'redirectedfrom' => '({{grammar:ablative|$1}} æрвыст)',
-'redirectpagesub' => 'Рарвысты фарс',
+'redirectpagesub' => 'Æрвитæн фарс',
 'lastmodifiedat' => 'Ацы фарс фæстаг хатт ивд æрцыд: $1, $2.',
 'viewcount' => 'Ацы фарс домд æрцыд {{PLURAL:$1|иу хатт|$1 хатты}}.',
 'protectedpage' => 'Æхгæд фарс',
-'jumpto' => 'ТагÑ\8aд Ã¦Ñ\80виÑ\82æнÑ\82æ:',
+'jumpto' => 'Ð\90Ñ\80дæм:',
 'jumptonavigation' => 'навигаци',
 'jumptosearch' => 'агуырд',
 'view-pool-error' => 'Хатыр, сервертæ тынг æнæвдæлон сты ацы тæккæ.
@@ -416,12 +415,12 @@ $messages = array(
 $1',
 'pool-timeout' => 'Скусыны афон у',
 'pool-queuefull' => 'Процессты рад йедзаг у',
-'pool-errorunknown' => 'Æбæрæг рæдыд',
+'pool-errorunknown' => 'Ã\86нæбæÑ\80æг Ñ\80æдÑ\8bд',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} тыххæй',
 'aboutpage' => 'Project:Афыст',
-'copyright' => 'Ð\9bиÑ\86ензи: $1.',
+'copyright' => 'Ð\9cидиÑ\81 Ñ\83 Ð³Ð¾Ð¼ {{grammar:allative|$1}} Ð³Ã¦Ñ\81гæ.',
 'copyrightpage' => '{{ns:project}}:Авторы бартæ',
 'currentevents' => 'Ног хабæрттæ',
 'currentevents-url' => 'Project:Ног хабæрттæ',
@@ -433,16 +432,16 @@ $1',
 'mainpage' => 'Сæйраг фарс',
 'mainpage-description' => 'Сæйраг фарс',
 'policy-url' => 'Project:Фæтк',
-'portal' => 'Архайджыты æхсæнад',
+'portal' => 'Æхсæнады портал',
 'portal-url' => 'Project:Архайджыты æхсæнад',
 'privacy' => 'Хибардзинады политикæ',
 'privacypage' => 'Project:Хибардзинады политикæ',
 
-'badaccess' => 'Ð\91аÑ\86æÑ\83æны рæдыд',
-'badaccess-group0' => 'Ð\90Ñ\86Ñ\8b Ð°Ñ\80Ñ\85айд Ñ\80акæныны бар дæм нæй.',
+'badaccess' => 'Ð\91аÑ\80лæвæÑ\80ды рæдыд',
+'badaccess-group0' => 'ЦÑ\8b Ð°Ñ\80Ñ\85айд Ã¦Ñ\80домдÑ\82ай, Ñ\83Ñ\8bй кæныны бар дæм нæй.',
 'badaccess-groups' => 'Æрдомд арæзтытæ ис бар аразын æрмаст ацы {{PLURAL:$2|къорды|къордты}} уæнгтæн: $1.',
 
-'versionrequired' => 'Ð¥Ñ\8aæÑ\83Ñ\8b MediaWiki-йÑ\8b Ð²ÐµÑ\80Ñ\81ии $1',
+'versionrequired' => 'Ð\94омÑ\8b MediaWiki-йÑ\8b $1-æм Ñ\84æлÑ\82æÑ\80',
 'versionrequiredtext' => 'Хъæуы MediaWiki-йы $1 фæлтæр, цæмæй ацы фарсæй архайæн уа.
 Кæс [[Special:Version|фæлтæры фарс]].',
 
@@ -533,18 +532,18 @@ $1',
 'missingarticle-rev' => '(фæлтæр № $1)',
 'missingarticle-diff' => '(хъауджы: $1, $2)',
 'readonly_lag' => 'Рарддон йæхæдæг сæхгæд ис, цалынмæ дыггагон севертæ нæ ссинхронизаци кæной фыццагонтимæ',
-'internalerror' => 'Мидæг рæдыд',
-'internalerror_info' => 'Мидæг рæдыд: $1',
+'internalerror' => 'Мидæггаг рæдыд',
+'internalerror_info' => 'Мидæггаг рæдыд: $1',
 'fileappenderrorread' => 'Нæ рауадис бафæрсын "$1" æфтауыны рæстæджы.',
 'fileappenderror' => 'Нæ рауадис бафтауын "$1" "{{grammar:allative|$2}}".',
-'filecopyerror' => 'Файл «$1» файлмæ «$2» халдихгæнæн нæ разынд.',
+'filecopyerror' => 'Файл «$1» файл {{grammar:allative|«$2»}} къопи кæнын нæ рауад.',
 'filerenameerror' => 'Нæ рауадис фæивын "$1" файлы ном "$2"-мæ.',
 'filedeleteerror' => 'Нæ уайы файл «$1» схафын.',
-'directorycreateerror' => 'Ð\9dæй Ñ\81аÑ\80азæн Ñ\84айлдон Â«$1».',
-'filenotfound' => 'Ð\9dæй Ñ\81Ñ\81аÑ\80æн Ñ\84айл Â«$1».',
+'directorycreateerror' => 'Ð\94иÑ\80екÑ\82оÑ\80и Â«$1» Ñ\81аÑ\80азÑ\8bн Ð½Ã¦ Ñ\80аÑ\83адиÑ\81.',
+'filenotfound' => 'Файл Â«$1» Ñ\81Ñ\81аÑ\80Ñ\8bн Ð½Ã¦ Ñ\80аÑ\83адиÑ\81.',
 'fileexistserror' => 'Нæй фыссæн "$1" файлы: Файл ис.',
-'unexpected' => 'Æнæмбæлон æмиасад: «$1»=«$2».',
-'formerror' => 'Рæдыд: формæ арвитæн нæй',
+'unexpected' => 'Æнæмбæлон нысаниуæг: «$1»=«$2».',
+'formerror' => 'Рæдыд: формæ арвитын нæ рауадис.',
 'badarticleerror' => 'Ацы архайд нæ арæзт кæны ацы фарсыл.',
 'cannotdelete' => 'Нæ уайы файл кæнæ фарс "$1" схафын.
 Гæнæн ис, æндæр чидæр æй схафта.',
@@ -580,7 +579,7 @@ $2',
 'namespaceprotected' => "Дæуæн нæй бар ивын фæрстæ '''$1''' номдоны.",
 'customcssprotected' => 'Дæуæн нæй бар ивын ацы CSS фарс, уымæн æмæ уым ис æндæр архайæджы персоналон æвæрдтытæ.',
 'customjsprotected' => 'Дæуæн нæй бар ивын ацы JavaScript фарс, уымæн æмæ уым ис æндæр архайæджы персоналон æвæрдтытæ.',
-'ns-specialprotected' => 'Сæрмагонд фæрстæ ({{ns:special}}) баивæн нæй.',
+'ns-specialprotected' => 'Сæрмагонд фæрстæн ивæн нæй.',
 'titleprotected' => 'Ацы ном уыд æхгæд саразынæй. Сæхгæдта йæ [[User:$1|$1]].
 Æхгæныны бындур уыд "\'\'$2\'\'".',
 'filereadonlyerror' => 'Нæ уайы фæивын файл "$1" уый тыххæй æмæ репозиторий "$2" кусы æрмæст фæрсыны уавæры.
@@ -605,9 +604,18 @@ $2',
 'welcomecreation-msg' => 'Дæ аккаунт арæзт æрцыдис.
 Ма дæ ферох уæт æркæсын дæ [[Special:Preferences|{{grammar:genitive|{{SITENAME}}}} уагæвæрдтæм]].',
 'yourname' => 'Фæсномыг:',
+'userlogin-yourname' => 'Фæсномыг',
+'userlogin-yourname-ph' => 'Бафысс дæ фæсномыг',
 'yourpassword' => 'Пароль:',
-'yourpasswordagain' => 'Дæ пароль иу хатт ма:',
-'remembermypassword' => 'Бахъуыды мæ кæнæд ашы браузеры (максимум $1 {{PLURAL:$1|бонмæ|бонмæ}})',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Бафысс дæ пароль',
+'createacct-yourpassword-ph' => 'Бафысс пароль',
+'yourpasswordagain' => 'Пароль ногæй бафысс:',
+'createacct-yourpasswordagain' => 'Сбæлвырд кæн пароль',
+'createacct-yourpasswordagain-ph' => 'Пароль ногæй бафысс',
+'remembermypassword' => 'Бахъуыды мæ кæнæд ацы браузеры (максимум $1 {{PLURAL:$1|бонмæ}})',
+'userlogin-remembermypassword' => 'Системæйы мæ дар',
+'userlogin-signwithsecure' => 'Æдас бастдзинадæй',
 'securelogin-stick-https' => 'Дарддæр дæр HTTPS-ы уылты, бахизыны фæстæ',
 'yourdomainname' => 'Дæ домен:',
 'password-change-forbidden' => 'Дæ бон нæу пароль фæивын ацы викийы.',
@@ -619,19 +627,39 @@ $2',
 'userloginnocreate' => 'Бахизын',
 'logout' => 'Рахизын',
 'userlogout' => 'Рахизын',
-'notloggedin' => 'Системæйæн дæхи нæ бацамыдтай',
-'nologin' => "Регистрацигонд нæма дæ? '''$1'''.",
+'notloggedin' => 'Системæмæ хызт нæ дæ',
+'userlogin-noaccount' => 'Нæй дын аккаунт?',
+'userlogin-joinproject' => 'Баиу у {{grammar:comitative|{{SITENAME}}}}',
+'nologin' => 'Регистрацигонд нæма дæ? $1.',
 'nologinlink' => 'Регистраци',
 'createaccount' => 'Регистраци кæнын',
 'gotaccount' => 'Регистрацигонд дæ? $1.',
 'gotaccountlink' => 'Бахизын',
 'userlogin-resetlink' => 'Ферох дæ сты дæ бахизæнтæ?',
-'createaccountmail' => 'адрисмæ гæсгæ',
+'userlogin-resetpassword-link' => 'Дæ пароль ногæй сæвæр',
+'helplogin-url' => 'Help:Бахизын',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Бахизынæн æххуыс]]',
+'createacct-join' => 'Дæ информаци дæлдæр бафысс.',
+'createacct-emailrequired' => 'Электрон посты адрис',
+'createacct-emailoptional' => 'Электрон посты адрис (фæндон)',
+'createacct-email-ph' => 'Бафысс дæ электрон посты адрис',
+'createaccountmail' => 'Рæстæгмæ пароль халæй ист æрцæуæт æмæ бындæр цы электрон пост ис, уырдæм æрвыст æрцæуæт',
+'createacct-realname' => 'Æцæг ном (фæндон)',
 'createaccountreason' => 'Бындур:',
-'badretype' => 'Дыууæ хатты иу пароль хъуамæ ныффыстаис',
+'createacct-reason' => 'Бындур',
+'createacct-reason-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|архайæг|архайæджы}}',
+'badretype' => 'Цы паролтæ бафыстай, уыдон æмхуызæн не сты.',
 'userexists' => 'Уыцы фæсномыг нæвдæлон у.
 Дæ хорзæхæй, равзар æндæр.',
 'loginerror' => 'Бахизыны рæдыд',
+'createacct-error' => 'Аккаунт аразыны рæдыд',
 'createaccounterror' => 'Нæ рауадис аккаунт саразын: $1',
 'nocookiesnew' => 'Аккаунт арæзт æрцыдис, фæлæ ды нырмæ нæ дæ хызт мидæмæ. 
 {{SITENAME}} архайы cookies-æй цæмæй архайджыты æвзара.
@@ -653,7 +681,7 @@ $2',
 'nouserspecified' => 'Ды хъуамæ зæгъай дæ фæсномыг.',
 'login-userblocked' => 'Ацы архайæг хъодыгонд у. Нæй гæнæн бахизын.',
 'wrongpassword' => 'Цы пароль ныффыстай, уый раст нæу.
\9bæмбÑ\8bнæгæй Ð½Ñ\8bÑ\84Ñ\84Ñ\8bÑ\81Ñ\81 Ð´Ã¦ Ð¿Ð°Ñ\80олÑ\8c',
\94æ Ñ\85оÑ\80зæÑ\85æй, Ð½Ð¾Ð³Ã¦Ð¹ Ð±Ð°Ñ\84æлваÑ\80.',
 'wrongpasswordempty' => 'Пароль афтид у.
 Бафæлвар ногæй.',
 'passwordtooshort' => 'Паролтæ хъуамæ уой уæддæр {{PLURAL:$1|1 дамгъæйы|$1 дамгъæйы}} дæргъæн.',
@@ -671,8 +699,8 @@ $2',
 'blocked-mailpassword' => 'Дæ IP адрис уыд хъодыгонд ивынæй æмæ цæмæй мачи разнаггад кæна, уы тыххæй дзы нæй гæнæн парол раивын дæр.',
 'eauthentsent' => 'Бæлвырдгæнæн фыстæг æрвыст æрцыд амынд e-mail адрисмæ.
 Цæмæй дæм æндæр фыстæджытæ дæр цæуой, уый тыххæй дын хъæудзæн сæххæст кæнын фыстæджы фыст амындтытæ. Уый фæстæ сбæлвыд уыдзæн аккаунт æцæгдæр дæу кæй у, уый.',
-'throttled-mailpassword' => 'Ð\9fаÑ\80олÑ\80Ñ\8bмÑ\8bÑ\81æн нырид æрвыст æрцыд фæстаг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.
-Цæмæй мачи разнагкад кæна, уый тыххæй æрмæст иу хатт ис гæнæн райсын рымысæнфыстæг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.',
+'throttled-mailpassword' => 'Ð\9dог Ð¿Ð°Ñ\80олÑ\8c Ñ\81æвæÑ\80æн Ñ\84Ñ\8bÑ\81Ñ\82æг нырид æрвыст æрцыд фæстаг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.
+Цæмæй мачи разнагкад кæна, уый тыххæй æрмæст иу хатт ис гæнæн райсын ног пароль сæвæрæн фыстæг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.',
 'mailerror' => 'Фыстæг арвитыны рæдыд: $1',
 'acct_creation_throttle_hit' => 'Ацы викимæ дæ IP адрисæй чи æрбацыдис, уыдон фæстаг боны мидæг бакодтой {{PLURAL:$1|1 аккаунт|$1 аккаунты}}. Уымæй фылдæр нæй гæнæн ахæм рæстæгмæ.
 Уый тыххæй, ацы тæккæ, ацы IP адрисæй уазджытæн сæ бон нæу бакæнын аккаунттæ.',
@@ -702,6 +730,7 @@ $2',
 # Email sending
 'php-mail-error-unknown' => 'Нæбæрæг рæдыд PHP-йы mail() функцийы.',
 'user-mail-no-addy' => 'Е-mail æрвыста æнæ e-mail адрисæй.',
+'user-mail-no-body' => 'Фæлварста афтид кæнæ æнæбары мидисимæ фыстæг арвитын.',
 
 # Change password dialog
 'resetpass' => 'Пароль фæивын',
@@ -709,39 +738,39 @@ $2',
 Цæмæй кæронмæ бахизай системæмæ, уый тыххæй ам хъуамæ сæвæрай ног пароль.',
 'resetpass_text' => '<!-- Бахæсс дæ текст ам -->',
 'resetpass_header' => 'Аккаунты пароль ивын',
-'oldpassword' => 'РаздæÑ\80Ñ\8b пароль:',
+'oldpassword' => 'Ð\97æÑ\80онд пароль:',
 'newpassword' => 'Нæуæг пароль:',
 'retypenew' => 'Ног пароль ногæй бафысс:',
 'resetpass_submit' => 'Пароль сæвæрын æмæ системæмæ бахизын',
 'resetpass_success' => 'Дæ пароль ивд æрцыд!
 Ныр ды хизыс системæмæ...',
-'resetpass_forbidden' => 'Пароль баивæн нæй',
+'resetpass_forbidden' => 'Паролæн баивæн нæй',
 'resetpass-no-info' => 'Ды хъуамæ системæмæ хызт уай, цæмæй ацы фарсмæ комкоммæ бавналай.',
 'resetpass-submit-loggedin' => 'Пароль фæивын',
 'resetpass-submit-cancel' => 'Ныууадзын',
 'resetpass-wrong-oldpass' => 'Рæстæгмæ кæнæ нырыккон пароль нæ бæззы.
 Гæнæн ис ды нырид фæивтай дæ пароль кæнæ та ног рæстæгмæ пароль æрдомдтай.',
 'resetpass-temp-password' => 'Рæстæгмæ пароль:',
+'resetpass-abort-generic' => 'Уæрæхгæнæн паролы ивд æрлæууын кодта.',
 
 # Special:PasswordReset
 'passwordreset' => 'Пароль раппарæн',
-'passwordreset-text' => 'Байдзаг кæн ацы формæ, цæмæй райсай дæ аккаунты бахизæнтæ рымысæн e-mail.',
 'passwordreset-legend' => 'Пароль раппарын',
 'passwordreset-disabled' => 'Парол фæлварын ацы викийы хицæн у.',
-'passwordreset-pretext' => '{{PLURAL:$1||Дæлдæр цы рардты хæйттæ ис, уыдонæй иу бафысс}}',
+'passwordreset-emaildisabled' => 'Электрон пост ацы викийы хицæн у.',
 'passwordreset-username' => 'Фæсномыг:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Цы e-mail рауадис, уый æвдыст æрцæуæт?',
 'passwordreset-capture-help' => 'Кæд сæвæрай ацы нысан, уæд дын e-mail (рæстæгмæ паролимæ) æвдыст æрцæудзæн. Архайæгмæ дæр æрвыст æрцæудзæн.',
 'passwordreset-email' => 'Электрон посты адрис:',
 'passwordreset-emailtitle' => '{{grammar:genitive|{{SITENAME}}}} акканты тыххæй',
-'passwordreset-emailtext-ip' => 'ЧидæÑ\80 (Ñ\83æÑ\86Ñ\86æгæн Ð´Ñ\8b, $1 IP Ð°Ð´Ñ\80иÑ\81æй) Ã¦Ñ\80домдÑ\82а Ð´Ã¦ {{grammar:genitive|{{SITENAME}}}} ($4) Ð°ÐºÐºÐ°Ñ\83нÑ\82Ñ\8b Ñ\82Ñ\8bÑ\85Ñ\85æй Ð´ÐµÑ\82алÑ\8cÑ\82æ. Ð\90Ñ\86Ñ\8b Ð°Ñ\80Ñ\85айæджÑ\8b {{PLURAL:$3|аккаÑ\83нÑ\82 Ð±Ð°Ñ\81Ñ\82 Ñ\83|аккаÑ\83нÑ\82Ñ\82æ Ð±Ð°Ñ\81Ñ\82 Ñ\81Ñ\82Ñ\8b}} Ð°Ñ\86Ñ\8b e-mail адрисимæ:
+'passwordreset-emailtext-ip' => 'ЧидæÑ\80 (Ñ\83æÑ\86Ñ\86æгæн Ð´Ñ\8b, $1 IP Ð°Ð´Ñ\80иÑ\81æй) Ã¦Ñ\80домдÑ\82а Ð´Ã¦ {{grammar:genitive|{{SITENAME}}}} ($4) Ð¿Ð°Ñ\80олÑ\8c Ð½Ð¾Ð³Ã¦Ð¹ Ñ\81æвæÑ\80Ñ\8bн. Ð\90Ñ\86Ñ\8b Ð°Ñ\80Ñ\85айæджÑ\8b {{PLURAL:$3|аккаÑ\83нÑ\82 Ð±Ð°Ñ\81Ñ\82 Ñ\83|аккаÑ\83нÑ\82Ñ\82æ Ð±Ð°Ñ\81Ñ\82 Ñ\81Ñ\82Ñ\8b}} Ð°Ñ\86Ñ\8b Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\81Ñ\82Ñ\8b адрисимæ:
 
 $2
 
 {{PLURAL:$3|Ацы рæстæгмæ пароль|Ацы рæстæгмæ паролтæ}} кусдзысты {{PLURAL:$5|иу бон|$5 боны}}.
 Ныр ды хъуамæ бахизай системæмæ æмæ равзарай ног пароль. Кæд ай æндæр чидæр æрдомдта, кæнæ кæд дæ пароль æрхъуыды кодтай æмæ дæ нал фæды фæивай йæ, уæд дæ бон у мацæмæ дарай ацы фыстæг æмæ дарддæр архайай дæ зæронд паролæй.',
-'passwordreset-emailtext-user' => '{{grammar:genitive|{{SITENAME}}}} архайæг $1 æрдомдта дæ {{grammar:genitive|{{SITENAME}}}} ($4) аккаунты тыххæй детальтæ. Ацы архайæджы {{PLURAL:$3|аккаунт баст у|аккаунттæ баст сты}} ацы e-mail адрисимæ:
+'passwordreset-emailtext-user' => '{{grammar:genitive|{{SITENAME}}}} архайæг $1 æрдомдта дæ {{grammar:genitive|{{SITENAME}}}} ($4) аккаунты пароль ногæй сæвæрын. Ацы архайæджы {{PLURAL:$3|аккаунт баст у|аккаунттæ баст сты}} ацы электрон посты адрисимæ:
 
 $2
 
@@ -749,9 +778,9 @@ $2
 Ныр ды хъуамæ бахизай системæмæ æмæ равзарай ног пароль. Кæд ай æндæр чидæр æрдомдта, кæнæ кæд дæ пароль æрхъуыды кодтай æмæ дæ нал фæды фæивай йæ, уæд дæ бон у мацæмæ дарай ацы фыстæг æмæ дарддæр архайай дæ зæронд паролæй.',
 'passwordreset-emailelement' => 'Фæсномыг: $1
 Рæстæгмæ пароль: $2',
-'passwordreset-emailsent' => 'Æрхъуыдыгæнæн e-mail æрвыст æрцыд',
-'passwordreset-emailsent-capture' => 'Æрхъуыдыгæнæн e-mail æрвыст æрцыд æмæ бындæр æвдыст у.',
-'passwordreset-emailerror-capture' => 'Æрхъуыдыгæнæн e-mail арæзт æрцыд æмæ бындæр æвдыст у. Фæлæ йæ арвитын нæ бантыстис: $1',
+'passwordreset-emailsent' => 'Ног пароль сæвæрыны фыстæг æрвыст æрцыд.',
+'passwordreset-emailsent-capture' => 'Ног пароль сæвæрыны фыстæг æрвыст æрцыд æмæ бындæр æвдыст у.',
+'passwordreset-emailerror-capture' => 'Ног пароль сæвæрыны фыстæг арæзт æрцыд æмæ бындæр æвдыст у. Фæлæ йæ {{grammar:allative|{{GENDER:$2|user}}}} арвитын нæ бантыстис: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'E-mail адрис фæивын',
@@ -803,7 +832,7 @@ $2
 Кæд ногæй равзарай \"{{int:savearticle}}\", уæд ивд æнæ уымæй бавæрд уыдзæнис.",
 'summary-preview' => 'Ивд афыст уыдзæн:',
 'subject-preview' => 'Темæ/сæр:',
-'blockedtitle' => 'Архайæг хъодыгонд æрцыд',
+'blockedtitle' => 'Архайæг хъодыгонд у',
 'blockedtext' => "'''Дæ фæсномыг кæнæ дæ IP адрис блокгонд æрцыд.'''
 
 Блок скодта $1.
@@ -863,18 +892,61 @@ $2
 
 Ай арæх æрцæуы, исчи хафт фарсы зæронд историйы æрвитæны фæдыл куы ацæуы.
 Фылдæр гæнæн ис базонын [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} хафыны логы].',
+'userpage-userdoesnotexist' => 'Архайæджы аккаунт "$1" регистрацигонд нæу.
+Дæ хорзæхæй сбæрæг æй кæн, æцæг дæ фæнды ацы фарс саразын/фæивын.',
 'userpage-userdoesnotexist-view' => 'Архайæджы аккаунт "$1" регистрацигонд нæу.',
+'blocked-notice-logextract' => 'Ацы архайæг ацы тæккæ хъодыгонд у.
+Фæстаг хъодыйы тыххæй логы фыст æвдыст у дæлдæр:',
+'clearyourcache' => "'''Дæ зæрдыл дар:''' Бавæрыны фæстæ дын уæццæгæн хъæудзæн дæ сгарæны кæш асыгъдæг кæнын, цæмæй цы фæивтай, уый разына.
+* '''Firefox / Safari:''' Хæц ''Shift''-ыл ''Ног кæныны'' рæстæджы, кæнæ ныххæц ''Ctrl-F5'' æви ''Ctrl-R'' (''⌘-R'' Mac-ыл)
+* '''Google Chrome:''' Ныххæц ''Ctrl-Shift-R'' (''⌘-Shift-R'' Mac-ыл)
+* '''Internet Explorer:''' Хæц ''Ctrl'' ''Ног кæныны'' рæстæджы, кæнæ ныххæц ''Ctrl-F5''
+* '''Opera:''' Ам кæш асыгъдæг кæныны равзар:''Фæрæзтæ → Уагæвæрдтæ''",
+'usercssyoucanpreview' => "'''Æххуыс:''' Спайда кæн \"{{int:showpreview}}\" æгънæгæй, цæмæй дæ ног CSS афæлварай.",
+'userjsyoucanpreview' => "'''Æххуыс:''' Спайда кæн \"{{int:showpreview}}\" æгънæгæй, цæмæй дæ ног JavaScript афæлварай.",
+'usercsspreview' => "'''Дæ зæрдыл дар уый, æмæ дæ CSS ды ныртæккæ фæлваргæ кæныс.'''
+'''Нырмæ æвæрд нæу!'''",
+'userjspreview' => "'''Дæ зæрдыл дар уый, æмæ дæ JavaScript ды ныртæккæ фæлваргæ кæныс.'''
+'''Нырмæ æвæрд нæу!'''",
+'sitecsspreview' => "'''Дæ зæрдыл дар уый, æмæ ацы CSS ды ныртæккæ фæлваргæ кæныс.'''
+'''Нырмæ æвæрд нæу!'''",
+'sitejspreview' => "'''Дæ зæрдыл дар уый, æмæ ацы JavaScript ды ныртæккæ фæлваргæ кæныс.'''
+'''Нырмæ æвæрд нæу!'''",
+'userinvalidcssjstitle' => "'''Сындæг:''' \"\$1\" царм нæй.
+Хиæвæрд .css æмæ .js фæрстæ архайынц гыццыл дамгъæтимæ нæмттæй. Цæвиддон, {{ns:user}}:Foo/vector.cs, {{ns:user}}:Foo/Vector.css нæ фæлæ.",
 'updated' => '(Ноггонд)',
 'note' => "'''Фиппаинаг:'''",
 'previewnote' => "'''Зон æй, æмæ ай у æрмæстдæр разбакаст.'''
 Дæ ивдтытæ нырмæ æвæрд не рцыдысты!",
 'continue-editing' => 'Ивыны бынатмæ ацæуын',
+'previewconflict' => 'Ацы фенæн æвдисы уæлдæр текст ивæн бынаты цы текст ис, уый куыд разындзæн кæд æй бавæрай.',
+'session_fail_preview' => "'''Хатыр! Нæ бон дын не ссис дæ ивд бавæрын, сессийы рардтæ кæй фесæфтысты, уый тыххæй.'''
+Дæ хорзæхæй, ногæй бафæлвар.
+Кæд уæддæр нæ кусы, уæд бафæлвар [[Special:UserLogout|æддæмæ рахизын]] æмæ фæстæмæ бахизын.",
+'session_fail_preview_html' => "'''Хатыр! Нæ бон дын не ссис дæ ивд бавæрын, сессийы рардтæ кæй фесæфтысты, уый тыххæй.'''
+
+''{{SITENAME}}-ы хом HTML уагъд кæй у, уый тыххæй разбакаст æмбæхст у, цæмæ JavaScript атакæтæ ма уой.''
+
+'''Кæд ай дзæбæх ивд у, уæд ногæй бафæлвар.'''
+Кæд уæддæр нæ кусы, уæд бафæлвар [[Special:UserLogout|æддæмæ рахизын]] æмæ фæстæмæ бахизын.",
+'token_suffix_mismatch' => "'''Дæ ивд урæд æрцыд, уымæн æмæ дæ программæ пунктуацийы нысæнттæ раст нæ æмбары ивыны бынаты.'''
+Ивд урæд æрцыд, цæмæй фарсы текст ма фехæла.
+Ай арæх фæзыны, кæд пайда кæнынц æвзæр веб сусæг прокси сервертæй.",
+'edit_form_incomplete' => "'''Ивыны формæйæ цыдæр хæйттæ сервермæ нæ бахæццæ сты; Сбæрæг кæн дæ ивдтытæ нæ фехæлд сты, æмæ ногæй бафæлвар.'''",
 'editing' => 'Ивд цæуы $1',
 'creating' => 'Конд цæуы $1',
 'editingsection' => 'Ивд цæуы $1 (хай)',
 'editingcomment' => 'Ивд цæуы $1 (ног хай)',
 'editconflict' => 'Ивыны конфликт: $1',
+'explainconflict' => "Цалынмæ ды ацы фарс ивтай, уæдмæ йæ æндæр чидæр фæивта.
+Уæллаг текст ивыны бынаты ды уыныс фарсы текст ныр куыд у, уый хуызы.
+Дæ ивдтытæ æвдыст сты дæллаг ивыны бынаты.
+Дæуæн хъæудзæн дæ ивдтытæ уæллаг ивæн бынатмæ рахæссын.
+'''Æрмæст''' уæллаг ивæны текст æрцæудзæн æвæрд \"{{int:savearticle}}\"-ыл куы ныххæцай.",
 'yourtext' => 'Дæ текст',
+'storedversion' => 'Æвæрд фæлтæр',
+'nonunicodebrowser' => "'''Сындæг: Дæ сгарæн Unicode-имæ нæ фидауы.'''
+ASCII нысæнттæм чи нæ хауы, уыдон ивыны бынаты сæ æхсæрдæсон кодты хуызы уыдзысты.",
 'yourdiff' => 'Хицæндзинæдтæ',
 'templatesused' => 'Ацы фарсы ис {{PLURAL:$1|хуызæг|хуызæджы}}:',
 'template-protected' => '(æхгæд)',
@@ -889,7 +961,7 @@ $2
 'moveddeleted-notice' => 'Ацы фарс хафт уыдис.
 Уый тыххæй бындæр ис хафын æмæ номивыны логтæй фыст.',
 'edit-conflict' => 'Ивдтыты конфликт.',
-'edit-already-exists' => 'Ног фарс скæнæн нæй. Ахæм фарс ис.',
+'edit-already-exists' => 'Ð\9dог Ñ\84аÑ\80Ñ\81 Ñ\81кæнæн Ð½Ã¦Ð¹. Ð\90Ñ\85æм Ñ\84аÑ\80Ñ\81 Ð½Ñ\8bÑ\80ид Ð¸Ñ\81.',
 
 # Content models
 'content-model-wikitext' => 'викитекст',
@@ -907,14 +979,14 @@ $2
 
 # History pages
 'viewpagelogs' => 'Ацы фарсæн йæ логтæ равдисын',
-'nohistory' => 'Ð\90Ñ\86Ñ\8b Ñ\84аÑ\80Ñ\81æн Ð¸Ð²Ð²Ð´Ð·Ð¸Ð½Ã¦Ð´ты истори нæй.',
-'currentrev' => 'Ð\9dÑ\8bÑ\80Ñ\8bккон фæлтæр',
+'nohistory' => 'Ð\90Ñ\86Ñ\8b Ñ\84аÑ\80Ñ\81æн Ð¸Ð²Ð´Ñ\82Ñ\8bты истори нæй.',
+'currentrev' => 'ФæÑ\81Ñ\82аг фæлтæр',
 'currentrev-asof' => 'Нырыккон фæлтæр $1',
 'revisionasof' => 'Фæлтæр $1',
 'revision-info' => 'Фæлтæр $1; $2',
 'previousrevision' => '← Зæронддæр фæлтæр',
 'nextrevision' => 'Ногдæр фæлтæр →',
-'currentrevisionlink' => 'Ð\9dÑ\8bÑ\80Ñ\8bккон фæлтæр',
+'currentrevisionlink' => 'ФæÑ\81Ñ\82аг фæлтæр',
 'cur' => 'ныр.',
 'next' => 'иннæ',
 'last' => 'раз.',
@@ -930,8 +1002,8 @@ $2
 'historyempty' => '(афтид)',
 
 # Revision feed
-'history-feed-title' => 'Ивддзинæдты истори',
-'history-feed-item-nocomment' => '$1 $2',
+'history-feed-title' => 'Ивдтыты истори',
+'history-feed-item-nocomment' => '$1, $2',
 
 # Revision deletion
 'rev-deleted-comment' => '(ивды афыст хафт у)',
@@ -999,7 +1071,7 @@ $2
 'search-redirect' => '({{grammar:ablative|$1}} æрвыст)',
 'search-section' => '(хай $1)',
 'search-suggest' => 'Кæд мыййаг агурыс: $1',
-'search-interwiki-caption' => 'Ã\86Ñ\84Ñ\81Ñ\8bмæÑ\80он проекттæ',
+'search-interwiki-caption' => 'Ã\86Ñ\80вадæл проекттæ',
 'search-interwiki-default' => '{{grammar:genitive|$1}} фæстиуджытæ:',
 'search-interwiki-more' => '(нодзы)',
 'search-relatedarticle' => 'Хæстæг',
@@ -1013,18 +1085,11 @@ $2
 'powersearch-field' => 'Агуырд',
 'powersearch-toggleall' => 'Иууылдæр',
 
-# Quickbar
-'qbsettings' => 'Навигацион таг',
-'qbsettings-none' => 'Ма равдис',
-'qbsettings-fixedleft' => 'Галиуырдыгæй',
-'qbsettings-fixedright' => 'Рахизырдыгæй',
-'qbsettings-floatingleft' => 'Рахизырдыгæй ленккæнгæ',
-
 # Preferences page
 'preferences' => 'Уагæвæрдтæ',
 'mypreferences' => 'Уагæвæрдтæ',
 'prefs-edits' => 'Ивдтыты нымæц:',
-'prefsnologin' => 'Системæйæн дæхи нæ бацамыдтай',
+'prefsnologin' => 'Системæйы нæ дæ',
 'changepassword' => 'Пароль ивæн',
 'prefs-skin' => 'Цъар',
 'skin-preview' => 'Разæркаст',
@@ -1065,10 +1130,10 @@ $2
 'prefs-custom-css' => 'Хиæвæрд CSS',
 'prefs-custom-js' => 'Хиæвæрд JavaScript',
 'youremail' => 'E-mail:',
-'username' => 'Фæсномыг:',
-'uid' => 'Архайæджы ID:',
+'username' => '{{GENDER:$1|Фæсномыг}}:',
+'uid' => '{{GENDER:$1|Архайæджы}} ID:',
 'yourrealname' => 'Æцæг ном:',
-'yourlanguage' => 'Техникон фыстыты æвзаг:',
+'yourlanguage' => 'Æвзаг:',
 'yourvariant' => 'Мидисы æвзаджы вариант:',
 'yournick' => 'Ног къухæрфыст:',
 'badsiglength' => 'Æгæр даргъ къухæрфыст, хъуамæ {{PLURAL:$1|дамгъæйæ|дамгъæйæ}} къаддæр уа.',
@@ -1108,7 +1173,7 @@ $2
 'group-bot' => 'Роботтæ',
 'group-sysop' => 'Админтæ',
 'group-bureaucrat' => 'Бюрократтæ',
-'group-all' => '(æппæт)',
+'group-all' => '(иууылдæр)',
 
 'group-user-member' => '{{GENDER:$1|архайæг}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|хæдсгарст архайæг}}',
@@ -1128,8 +1193,8 @@ $2
 'right-read' => 'Фæрстæ кæсын',
 'right-edit' => 'Фæрстæ ивын',
 'right-move' => 'Фæрсты нæмттæ ивын',
-'right-move-subpages' => 'фæрсты æмæ сæ дæлфæрсты нæмттæ ивын',
-'right-movefile' => 'файлты нæмттæ ивын',
+'right-move-subpages' => 'Фæрстæ æмæ сæ дæлфæрсты нæмттæ ивын',
+'right-movefile' => 'Файлты нæмттæ ивын',
 'right-upload' => 'Файлтæ æвгæнын',
 'right-upload_by_url' => 'Бавгæнын файлтæ интернетæй',
 'right-delete' => 'Фæрстæ хафын',
@@ -1164,7 +1229,7 @@ $2
 'rcnotefrom' => "Бындæр сты æвдыст ивдтытæ '''$2'''-æй ('''{{grammar:genitive|$1}}''' йонг).",
 'rclistfrom' => 'Равдисын ивдтытæ амæй фæстæ: $1',
 'rcshowhideminor' => '$1 чысыл ивдтытæ',
-'rcshowhidebots' => '$1 роботты куыст',
+'rcshowhidebots' => '$1 роботты',
 'rcshowhideliu' => '$1, йæхи чи бацамыдта, уыцы архайджыты',
 'rcshowhideanons' => '$1 æнæном архайджыты',
 'rcshowhidepatr' => '$1 бæрæггонд ивдтæ',
@@ -1197,13 +1262,13 @@ $3',
 # Upload
 'upload' => 'Бавгæнын файл',
 'uploadbtn' => 'Файл бавгæнын',
-'uploadnologin' => 'СиÑ\81Ñ\82емæйæн Ð´Ã¦Ñ\85и Ð½Ã¦ Ð±Ð°Ñ\86амÑ\8bдÑ\82ай',
-'uploaderror' => 'Файл сæвæрыны рæдыд',
+'uploadnologin' => 'СиÑ\81Ñ\82емæмæ Ñ\85Ñ\8bзÑ\82 Ð½Ã¦ Ð´Ã¦',
+'uploaderror' => 'Файл бавгæныны рæдыд',
 'uploadlogpage' => 'Æвгæндты лог',
 'filename' => 'Файлы ном',
 'filedesc' => 'Афыст:',
 'minlength1' => 'Файлы номы хъуамæ æппынкъаддæр иу дамгъæ уа.',
-'badfilename' => 'Ð\9dÑ\8bвÑ\8b Ð½Ð¾Ð¼ Ð¸Ð²Ð´ Ã¦Ñ\80Ñ\86Ñ\8bдиÑ\81. Ð\9dÑ\8bÑ\80 Ñ\85Ñ\83инÑ\8b Â«$1».',
+'badfilename' => 'ФайлÑ\8b Ð½Ð¾Ð¼ Ð¸Ð²Ð´ Ã¦Ñ\80Ñ\86Ñ\8bд {{grammar:allative|«$1»}}.',
 'savefile' => 'Файл бавæрын',
 'uploadedimage' => 'бавгæдта "[[$1]]"',
 'uploadvirus' => 'Файлы ис вирус! 
@@ -1217,7 +1282,7 @@ $3',
 'license-header' => 'Лицензи',
 
 # Special:ListFiles
-'listfiles' => 'Ð\9dÑ\8bвты номхыгъд',
+'listfiles' => 'Файлты номхыгъд',
 'listfiles_thumb' => 'Къаддæргонд',
 'listfiles_date' => 'Датæ',
 'listfiles_name' => 'Ном',
@@ -1372,7 +1437,7 @@ $3',
 'emailpage' => 'Электронон фыстæг йæм барвит',
 
 # Watchlist
-'watchlist' => 'Ð\9cæ Ñ\86æÑ\81Ñ\82даÑ\80д Ñ\80æгÑ\8a',
+'watchlist' => 'ЦæÑ\81Ñ\82даÑ\80д',
 'mywatchlist' => 'Цæстдард',
 'watchlistfor2' => 'Архайæг: $1 $2',
 'nowatchlist' => 'Иу уацмæ дæр дæ цæст нæ дарыс.',
@@ -1612,12 +1677,8 @@ $3',
 'spamprotectiontitle' => 'Спамы ныхмæ фильтр',
 
 # Skin names
-'skinname-standard' => 'Стандартон',
-'skinname-nostalgia' => 'Æнкъард',
 'skinname-cologneblue' => 'Кёльны æрхæндæг',
 'skinname-monobook' => 'Моно-чиныг',
-'skinname-myskin' => 'Мæхи',
-'skinname-chick' => 'Карк',
 
 # Browsing diffs
 'previousdiff' => '← Зæронддæр ивд',
@@ -1666,7 +1727,7 @@ $3',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Уæрх',
 'exif-imagelength' => 'Бæрзæнд',
 'exif-artist' => 'Автор',
@@ -1752,11 +1813,6 @@ $3',
 'version-poweredby-others' => 'æндæртæ',
 'version-software-version' => 'Верси',
 
-# Special:FilePath
-'filepath' => 'Файлмæ фæт',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Бацæуын',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файлы ном:',
 'fileduplicatesearch-submit' => 'Агурын',
index 932c13a..3a4c5a0 100644 (file)
@@ -189,68 +189,59 @@ $digitGroupingPattern = "##,##,###";
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'à¨\95à©\9cà©\80à¨\86à¨\82 à¨\85ਧà©\8bਰà©\87à¨\96ਨ:',
-'tog-justify' => 'ਪਰਿੱà¨\9bà©\87ਦ à¨¸à¨®à¨¾à¨¨ à¨\95ਰà©\8b',
-'tog-hideminor' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨µà¨¿à©±à¨\9a à¨\9bà©\8bà¨\9fà©\87 à¨¬à¨¦à¨²à¨¾à¨µ à¨\9bà©\81ਪਾਓ',
-'tog-hidepatrolled' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨µà¨¿à©±à¨\9a à¨\9cਾà¨\82à¨\9aà©\87 à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨\9bà©\81ਪਾਓ',
-'tog-newpageshidepatrolled' => 'ਨਵੀ ਸੁਚੀ ਮੈ ਸੈ ਗਸ਼ਤ ਪਰਚੇ ਕੌ ਛੁਪਾਏ.',
-'tog-extendwatchlist' => 'à¨\95à©\87ਵਲ à¨¹à¨¾à¨²à¨¿à¨\86 à¨¹à©\80 à¨¨à¨¹à©\80à¨\82, à¨¸à¨\97à©\8bà¨\82 à¨¸à¨¾à¨°à©\87 à¨ªà¨°à¨¿à¨µà¨°à¨¤à¨¨à¨¾à¨\82 à¨¨à©\82à©° à¨µà¨¿à¨\96ਾà¨\89ਣ à¨²à¨\88 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 à¨¨à©\82à©° à¨µà¨¿à¨¸à¨¥à¨¾à¨°à¨¿à¨¤ à¨\95ਰà©\8b',
-'tog-usenewrc' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ à¨\85ਤà©\87 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 à¨µà¨¿à©±à¨\9a à¨ªà©°à¨¨à©\87 à¨®à©\81ਤਾਬà¨\95 à¨¬à¨¦à¨²à¨¾à¨µ à¨¦à©\87 à¨\97ਰà©\81ੱਪ à¨¬à¨£à¨¾à¨\93 (à¨\9cਾਵਾਸà¨\95à©\8dਰਿਪà¨\9f à¨¦à©\80 à¨\9cਰà©\82ਰਤ ਹੈ)',
+'tog-underline' => 'ਲਿੰà¨\95 à¨¹à©\87ਠ-ਲਾà¨\88ਨ:',
+'tog-justify' => 'ਪà©\88ਰਾà¨\97ਰਾਫ਼ à¨\87à¨\95ਸਾਰ',
+'tog-hideminor' => 'ਤਾà¨\9c਼ਾ à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨\9bà©\8bà¨\9fà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨²à©\81à¨\95ਾਓ',
+'tog-hidepatrolled' => 'ਤਾà¨\9c਼ਾ à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨\9cਾà¨\82à¨\9aà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨²à©\81à¨\95ਾਓ',
+'tog-newpageshidepatrolled' => 'ਨਵੀਂ ਸਫ਼ਾ ਸੂਚੀ ਵਿੱਚੋਂ ਨਿਗਰਾਨੀ ਸਫ਼ੇ ਓਹਲੇ ਕਰੋ',
+'tog-extendwatchlist' => 'ਸਿਰਫ਼ à¨¤à¨¾à¨\9c਼ਾ à¨¹à©\80 à¨¨à¨¹à©\80à¨\82, à¨¸à¨\97à©\8bà¨\82 à¨¸à¨¾à¨°à©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨¨à©\82à©° à¨µà¨\96ਾà¨\89ਣ à¨²à¨\88 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨¨à©\82à©° à¨µà¨§à¨¾à¨\93',
+'tog-usenewrc' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨\85ਤà©\87 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿à©±à¨\9a à¨ªà©°à¨¨à©\87 à¨®à©\81ਤਾਬà¨\95 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨¦à©\87 à¨\97ਰà©\81ੱਪ à¨¬à¨£à¨¾à¨\93 (à¨\9cਾਵਾਸà¨\95à©\8dਰਿਪà¨\9f à¨²à©\8bà©\9cà©\80à¨\82ਦà©\80 ਹੈ)',
 'tog-numberheadings' => 'ਆਟੋ-ਨੰਬਰ ਹੈਡਿੰਗ',
-'tog-showtoolbar' => 'à¨\90ਡਿà¨\9f à¨\9fà©\82ਲਬਾਰ à¨µà©\87à¨\96à©\8b (JavaScript)',
-'tog-editondblclick' => 'ਦà©\82ਹਰà©\87 à¨\95ਲਿੱà¨\95 â\80\99ਤà©\87 à¨ªà©°à¨¨à©\87 à¨¨à©\82à©° à¨¸à©°à¨ªà¨¾à¨¦à¨¿à¨¤ à¨\95ਰà©\8b (à¨\9cਾਵਾਸà¨\95à©\8dਰਿਪà¨\9f à¨¦à©\80 à¨\9cਰà©\82ਰਤ ਹੈ)',
-'tog-editsection' => '[ਸੰਪਾਦਨ] à¨\95à©\9cà©\80à¨\86à¨\82 à¨¦à©\81à¨\86ਰਾ à¨\85ਨà©\81ਭਾà¨\97 à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨¸à¨®à¨°à©±à¨¥à¨¾à¨µà¨¾à¨¨ ਕਰੋ',
-'tog-editsectiononrightclick' => 'ਸà©\88à¨\95ਸ਼ਨ ਸਿਰਲੇਖਾਂ ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਦੁਆਰਾ ਸੋਧ ਯੋਗ ਕਰੋ (ਜਾਵਾ ਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
-'tog-showtoc' => 'à¨\9fà©\87ਬਲ à¨\86ਫ਼ à¨\95ੰਨà¨\9fà©\88ੱà¨\9f à¨µà©\87à¨\96ਾà¨\93 (for pages with more than 3 headings)',
+'tog-showtoolbar' => 'ਸà©\8bਧ à¨\9fà©\82ਲਬਾਰ à¨µà©\87à¨\96à©\8b (JavaScript à¨\9aਾਹà©\80ਦà©\80 à¨¹à©\88)',
+'tog-editondblclick' => 'ਦà©\8b à¨µà¨¾à¨° à¨\95ਲਿੱà¨\95 à¨\95ਰਨ à¨¨à¨¾à¨² à¨¸à¨«à¨¼à©\87 à¨¸à©\8bਧà©\8b (à¨\9cਾਵਾਸà¨\95à©\8dਰਿਪà¨\9f à¨\9aਾਹà©\80ਦà©\80 ਹੈ)',
+'tog-editsection' => '[ਸà©\8bਧà©\8b] à¨²à¨¿à©°à¨\95ਾà¨\82 à¨¦à©\81à¨\86ਰਾ à¨¸à©\88à¨\95ਸ਼ਨ à¨¸à©\8bਧਣਾ à¨\9aਾਲà©\82 ਕਰੋ',
+'tog-editsectiononrightclick' => 'ਭਾà¨\97 ਸਿਰਲੇਖਾਂ ਤੇ ਸੱਜੀ ਕਲਿੱਕ ਦੁਆਰਾ ਸੋਧ ਯੋਗ ਕਰੋ (ਜਾਵਾ ਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
+'tog-showtoc' => 'ਤਤà¨\95ਰਾ à¨µà¨\96ਾà¨\93 (3 à¨¤à©\8bà¨\82 à¨µà©±à¨§ à¨¸à¨¿à¨°à¨²à©\87à¨\96ਾà¨\82 à¨µà¨¾à¨²à©\87 à¨ªà©°à¨¨à¨¿à¨\86à¨\82 à¨²à¨\88)',
 'tog-rememberpassword' => 'ਇਸ ਬਰਾਊਜ਼ਰ ਉੱਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ ($1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ)',
-'tog-watchcreations' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨¬à¨£à¨¾à¨\8f à¨\97à¨\8f à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨\85ੱਪਲà©\8bਡ à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 ਵਿੱਚ ਪਾਓ',
-'tog-watchdefault' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¸à©°à¨ªà¨¾à¨¦à¨¿à¨¤ à¨\97à¨\8f à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 ਵਿੱਚ ਪਾਓ',
-'tog-watchmoves' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¸à¨¥à¨¾à¨¨à¨¾à¨\82ਤਰਿਤ à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸà©\82à¨\9aà©\80 ਵਿੱਚ ਪਾਓ',
-'tog-watchdeletion' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨®à¨¿à¨\9fਾà¨\8f à¨\97à¨\8f à¨¸à¨«à¨¼à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿ਚ ਪਾਓ',
-'tog-minordefault' => 'ਸਾਰà©\87 à¨«à©\87ਰ-ਬਦਲਾà¨\82 â\80\99ਤà©\87 à¨®à©\82ਲ à¨°à©\82ਪ à¨µà¨¿à¨\9a à¨\9bà©\8bà¨\9fà©\80à¨\86à¨\82 ਹੋਣ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ',
-'tog-previewontop' => 'à¨\90ਡਿà¨\9f à¨¬à¨\95ਸà©\87 ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵੇਖਾਓ',
-'tog-previewonfirst' => 'ਪਹਿਲà©\87 à¨\90ਡਿà¨\9f ਉੱਤੇ ਝਲਕ ਵੇਖਾਓ',
+'tog-watchcreations' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨¬à¨£à¨¾à¨\8f à¨\97à¨\8f à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨\85ੱਪਲà©\8bਡ à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨«à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f ਵਿੱਚ ਪਾਓ',
+'tog-watchdefault' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¸à©\8bਧà©\87 à¨\97à¨\8f à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f ਵਿੱਚ ਪਾਓ',
+'tog-watchmoves' => 'ਮà©\87ਰà©\87 à¨µà©±à¨²à©\8bà¨\82 à¨¬à¨¦à¨²à©\87 à¨¸à¨¿à¨°à¨²à©\87à¨\96ਾà¨\82 à¨µà¨¾à¨²à¨¼à©\87 à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f ਵਿੱਚ ਪਾਓ',
+'tog-watchdeletion' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨®à¨¿à¨\9fਾà¨\8f à¨\97à¨\8f à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿à©±ਚ ਪਾਓ',
+'tog-minordefault' => 'ਸਾਰà©\87 à¨«à©\87ਰ-ਬਦਲਾà¨\82 â\80\99ਤà©\87 à¨®à©\82ਲ à¨°à©\82ਪ à¨µà¨¿à¨\9a à¨\9bà©\8bà¨\9fà©\87 ਹੋਣ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ',
+'tog-previewontop' => 'ਸà©\8bਧ à¨¬à¨¾à¨\95ਸ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵੇਖਾਓ',
+'tog-previewonfirst' => 'ਪਹਿਲà©\80 à¨¸à©\8bਧ ਉੱਤੇ ਝਲਕ ਵੇਖਾਓ',
 'tog-nocache' => 'ਬਰਾਊਜ਼ਰ ਸਫ਼ਾ ਕੈਸ਼ ਕਰਨਾ ਬੰਦ ਕਰੋ',
-'tog-enotifwatchlistpages' => 'à¨\9cਦà©\8bà¨\82 à¨®à©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸà¨\9f à¨µà¨¿à¨\9a à¨¦à¨°à¨\9c à¨\95à©\8bà¨\88 à¨¸à¨«à¨¼à¨¾ à¨¬à¨¦à¨²à¨¿à¨\86 à¨\9cਾਵà©\87 à¨¯à¨¾ à¨®à¨¿à¨¸ਲ ਬਦਲੀ ਜਾਵੇ ਤਾਂ ਮੈਨੂੰ ਈਮੇਲ ਭੇਜੋ',
+'tog-enotifwatchlistpages' => 'à¨\9cਦà©\8bà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨ-ਸà©\82à¨\9aà©\80 à¨µà¨¿à¨\9a à¨¦à¨°à¨\9c à¨\95à©\8bà¨\88 à¨¸à¨«à¨¼à¨¾ à¨¬à¨¦à¨²à¨¿à¨\86 à¨\9cਾਵà©\87 à¨\9cਾà¨\82 à¨«à¨¾à¨\87ਲ ਬਦਲੀ ਜਾਵੇ ਤਾਂ ਮੈਨੂੰ ਈਮੇਲ ਭੇਜੋ',
 'tog-enotifusertalkpages' => 'ਜਦੋਂ ਮੇਰਾ ਗੱਲ-ਬਾਤ ਸਫ਼ਾ ਬਦਲਿਆ ਜਾਵੇ ਤਾਂ ਮੈਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
-'tog-enotifminoredits' => 'ਸਫ਼ਿà¨\86à¨\82 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾਂ ਦੀਆਂ ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ ਲਈ ਵੀ ਮੈਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
-'tog-enotifrevealaddr' => 'à¨\87ਤਲਾਹ à¨¦à©\87ਣ à¨µà¨¾à¨²à¨¼à©\80à¨\86à¨\82 à¨\88-ਮà©\87ਲਾà¨\82 à¨µà¨¿à¨\9a à¨®à©\87ਰਾ à¨\88-ਮà©\87ਲ à¨ªà¨¤à¨¾ à¨\9c਼ਾਹਰ à¨\95ਰà©\8b',
-'tog-shownumberswatching' => 'ਨਜ਼ਰ ਰੱਖ ਰਹੇ ਮੈਂਬਰਾਂ ਦੀ ਗਿਣਤੀ ਵਖਾਓ',
+'tog-enotifminoredits' => 'ਸਫ਼ਿà¨\86à¨\82 à¨\85ਤà©\87 à¨«à¨¾à¨\87ਲਾਂ ਦੀਆਂ ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ ਲਈ ਵੀ ਮੈਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
+'tog-enotifrevealaddr' => 'ਇਤਲਾਹ ਦੇਣ ਵਾਲੀਆਂ ਈ-ਮੇਲਾਂ ਵਿਚ ਮੇਰਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਕਰੋ',
+'tog-shownumberswatching' => 'ਨà¨\9c਼ਰ à¨°à©±à¨\96 à¨°à¨¹à©\87 à¨®à©\88à¨\82ਬਰਾà¨\82 à¨¦à©\80 à¨\97ਿਣਤà©\80 à¨µà©\87à¨\96ਾà¨\93',
 'tog-oldsig' => 'ਮੌਜੂਦਾ ਦਸਤਖਤ:',
-'tog-fancysig' => 'ਦਸਤਖ਼ਤ ਨੂੰ ਬਤੌਰ ਵਿਕੀਲਿਖਤ ਵਰਤੋ (ਬਿਨਾਂ ਆਟੋਮੈਟਿਕ ਲਿੰਕ)',
-'tog-externaleditor' => 'ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਬਾਹਰੀ ਸੋਧਕ ਵਰਤੋ (ਸਿਰਫ਼ ਮਾਹਿਰਾਂ ਲਈ ਹੈ, ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਤੇ ਖ਼ਾਸ ਸੈਟਿੰਗਾਂ ਲੋੜੀਂਦੀਆਂ ਹਨ। [//
-www.mediawiki.org/wiki/
-Manual:External_editors More
-information.])',
-'tog-externaldiff' => 'ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਬਾਹਰੀ ਫ਼ਰਕ ਵਰਤੋ (ਸਿਰਫ਼
-ਮਾਹਿਰਾਂ ਲਈ ਹੈ, ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਤੇ ਖ਼ਾਸ
-ਸੈਟਿੰਗਾਂ ਲੋੜੀਂਦੀਆਂ ਹਨ। [//
-www.mediawiki.org/wiki/
-Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
-'tog-showjumplinks' => '"ਇਸ ਤੇ ਜਾਓ" ਦੇ ਲਿੰਕ ਦਿਖਾਣਾ ਸਮਰੱਥ ਕਰੋ',
-'tog-uselivepreview' => 'ਸਿੱਧੀ ਝਲਕ ਵਰਤੋ (ਜਾਵਾਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ) (ਤਜਰਬੇਕਾਰੀ)',
-'tog-forceeditsummary' => 'ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦਾਖ਼ਲ ਕਰਾਂ ਤਾਂ ਮੈਨੂੰ ਖ਼ਬਰਦਾਰ ਕਰੋ',
-'tog-watchlisthideown' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚੋਂ ਮੇਰੇ ਫੇਰ-ਬਦਲ ਲੁਕਾਓ',
-'tog-watchlisthidebots' => 'ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਬੋਟਾਂ ਦੇ ਫੇਰ-ਬਦਲ ਲੁਕਾਓ',
-'tog-watchlisthideminor' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਛੋਟੇ ਫੇਰ-ਬਦਲ ਲੁਕਾਓ',
-'tog-watchlisthideliu' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਲਾਗ ਇਨ ਮੈਂਬਰਾਂ ਦੇ ਕੀਤੇ ਫੇਰ-ਬਦਲ ਲੁਕਾਓ',
+'tog-fancysig' => 'ਦਸਤਖ਼ਤ ਨੂੰ ਬਤੌਰ ਵਿਕਿਲਿਖਤ ਵਰਤੋਂ (ਬਿਨਾਂ ਆਟੋਮੈਟਿਕ ਲਿੰਕ)',
+'tog-showjumplinks' => '"ਇਸ ਤੇ ਜਾਓ" ਅਸੈਸਬਿਲਟੀ ਲਿੰਕ ਚਾਲੂ ਕਰੋ',
+'tog-uselivepreview' => 'ਸਿੱਧੀ ਝਲਕ ਵਰਤੋਂ (ਜਾਵਾਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ) (ਤਜਰਬੇ-ਅਧੀਨ)',
+'tog-forceeditsummary' => 'ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦੇਵਾਂ ਤਾਂ ਮੈਨੂੰ ਪੁੱਛੋ',
+'tog-watchlisthideown' => 'ਨਿਗਰਾਨ-ਸੂਚੀ ਵਿੱਚੋਂ ਮੇਰੇ ਸੋਧ ਓਹਲੇ ਕਰੋ',
+'tog-watchlisthidebots' => 'ਨਿਗਰਾਨ-ਸੂਚੀ ਵਿੱਚੋਂ ਬੋਟ ਸੋਧਾਂ ਓਹਲੇ ਕਰੋ',
+'tog-watchlisthideminor' => 'ਨਿਗਰਾਨ-ਸੂਚੀ ਵਿੱਚੋਂ ਛੋਟੀਆਂ ਸੋਧਾਂ ਓਹਲੇ ਕਰੋ',
+'tog-watchlisthideliu' => 'ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵਿਚੋਂ ਲਾਗ ਇਨ ਮੈਂਬਰਾਂ ਦੀਆਂ ਸੋਧਾਂ ਓਹਲੇ ਕਰੋ',
 'tog-watchlisthideanons' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਗੁਮਨਾਮ ਮੈਂਬਰਾਂ ਦੇ ਕੀਤੇ ਫੇਰ-ਬਦਲ ਲੁਕਾਓ',
 'tog-watchlisthidepatrolled' => 'ਵੇਖੀਆਂ ਜਾ ਚੁੱਕੀਆਂ ਸੋਧਾਂ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਲੁਕਾਓ',
 'tog-ccmeonemails' => 'ਜੋ ਈ-ਮੇਲਾਂ ਮੈਂ ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਭੇਜਦਾ ਹਾਂ ਓਹਨਾਂ ਦੀਆਂ ਨਕਲਾਂ ਮੈਨੂੰ ਭੇਜੋ',
-'tog-diffonly' => 'ਫ਼ਰਕਾਂ ਤੋਂ ਹੇਠ ਸਫ਼ੇ ਦੀ ਸਮੱਗਰੀ ਨਾ ਵਖਾਓ',
-'tog-showhiddencats' => 'ਲà©\81à¨\95à©\80à¨\86à¨\82 à¨¸à¨¼à©\8dਰà©\87ਣà©\80à¨\86à¨\82 à¨µਖਾਓ',
+'tog-diffonly' => 'ਫ਼ਰਕ ਤੋਂ ਹੇਠ ਸਫ਼ੇ ਦੀ ਸਮੱਗਰੀ ਨਾ ਵੇਖਾਓ',
+'tog-showhiddencats' => 'ਲà©\81à¨\95ਵà©\80à¨\86à¨\82 à¨¸à¨¼à©\8dਰà©\87ਣà©\80à¨\86à¨\82 à¨µà©\87ਖਾਓ',
 'tog-norollbackdiff' => '"ਵਾਪਸ ਮੋੜੌ"ਅਮਲ ਵਿਚ ਲਿਆਣ ਬਾਦ ਫ਼ਰਕ ਨਾ ਦਿਖਾਓ',
 
 'underline-always' => 'ਹਮੇਸ਼ਾਂ',
 'underline-never' => 'ਕਦੇ ਨਹੀਂ',
-'underline-default' => 'ਵਿਸ਼ਾ-ਵਸਤà©\82 à¨\9cਾà¨\82 à¨\87à©°à¨\9fਰਨà©\88ੱà¨\9f-à¨\9aਾਰà¨\95 à¨¡à¨¿à¨«à¨¾à¨²à¨\9f',
+'underline-default' => 'ਸà¨\95ਿਨ à¨\9cਾà¨\82 à¨¬à¨°à¨¾à¨\8aà¨\9c਼ਰ à¨®à©\82ਲ',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'ਸੰਪਾਦਨ à¨\96à©\87ਤਰ à¨¦à©\87 à¨\85ੱà¨\96ਰਾà¨\82 à¨¦à©\80 à¨«à¨¼à©\8cà¨\82à¨\9f à¨°à©\80ਤà©\80',
-'editfont-default' => 'ਬਰਾà¨\8aà¨\9c਼ਰ à¨¡à¨¿à¨«à¨¾à¨²à¨\9f',
-'editfont-monospace' => 'à¨\87ੱà¨\95à©\8b à¨\9cਿਹà©\80 à¨\96਼ਾਲà©\80 à¨¥à¨¾à¨\82 à¨µà¨¾à¨²à¨¼à¨¾ à¨\85ੱà¨\96ਰ',
-'editfont-sansserif' => 'Sans-serif à¨¨à¨¾à¨\82 à¨¦à¨¾ à¨«à¨¼à©\8cਂਟ',
-'editfont-serif' => 'ਨà©\8bà¨\95ਦਾਰ à¨\85ੱà¨\96ਰ',
+'editfont-style' => 'ਸà©\8bਧ à¨\96à©\87ਤਰ à¨«à©\8bà¨\82à¨\9f à¨¸à¨\9fਾà¨\87ਲ:',
+'editfont-default' => 'ਬਰਾà¨\8aà¨\9c਼ਰ à¨®à©\82ਲ',
+'editfont-monospace' => 'ਮà©\8bਨà©\8bਸਪà©\87ਸ à¨«à©\8bà¨\82à¨\9f',
+'editfont-sansserif' => 'Sans-serif à¨«à©\8bਂਟ',
+'editfont-serif' => 'ਨà©\8bà¨\95ਦਾਰ à¨«à©\8bà¨\82à¨\9f',
 
 # Dates
 'sunday' => 'ਐਤਵਾਰ',
@@ -259,18 +250,18 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'wednesday' => 'ਬੁੱਧਵਾਰ',
 'thursday' => 'ਵੀਰਵਾਰ',
 'friday' => 'ਸ਼ੁੱਕਰਵਾਰ',
-'saturday' => 'ਸ਼ਨà©\80ਵਾਰ',
+'saturday' => 'ਸ਼ਨਿੱà¨\9aਰਵਾਰ',
 'sun' => 'ਐਤ',
 'mon' => 'ਸੋਮ',
 'tue' => 'ਮੰਗਲ',
 'wed' => 'ਬੁੱਧ',
 'thu' => 'ਵੀਰ',
 'fri' => 'ਸ਼ੁੱਕਰ',
-'sat' => 'ਸ਼ਨà©\80',
+'sat' => 'ਸ਼ਨਿੱà¨\9aਰ',
 'january' => 'ਜਨਵਰੀ',
 'february' => 'ਫਰਵਰੀ',
 'march' => 'ਮਾਰਚ',
-'april' => 'ਅਪਰੈਲ',
+'april' => 'à¨\85ਪà©\8dਰà©\88ਲ',
 'may_long' => 'ਮਈ',
 'june' => 'ਜੂਨ',
 'july' => 'ਜੁਲਾਈ',
@@ -282,7 +273,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'january-gen' => 'ਜਨਵਰੀ',
 'february-gen' => 'ਫ਼ਰਵਰੀ',
 'march-gen' => 'ਮਾਰਚ',
-'april-gen' => 'ਅਪਰੈਲ',
+'april-gen' => 'à¨\85ਪà©\8dਰà©\88ਲ',
 'may-gen' => 'ਮਈ',
 'june-gen' => 'ਜੂਨ',
 'july-gen' => 'ਜੁਲਾਈ',
@@ -290,19 +281,19 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'september-gen' => 'ਸਤੰਬਰ',
 'october-gen' => 'ਅਕਤੂਬਰ',
 'november-gen' => 'ਨਵੰਬਰ',
-'december-gen' => 'ਦਿਸੰਬਰ',
-'jan' => 'ਜਨਵਰੀ',
-'feb' => 'ਫ਼ਰਵਰੀ',
-'mar' => 'ਮਾਰ',
-'apr' => 'ਅਪਰੈਲ',
+'december-gen' => 'ਦਸੰਬਰ',
+'jan' => 'ਜਨ',
+'feb' => 'ਫ਼ਰ',
+'mar' => 'ਮਾਰ',
+'apr' => 'ਅਪ',
 'may' => 'ਮਈ',
 'jun' => 'ਜੂਨ',
-'jul' => 'ਜੁਲਾ',
-'aug' => 'ਅਗਸਤ',
-'sep' => 'ਸਤੰਬਰ',
-'oct' => 'ਅਕਤੂਬਰ',
-'nov' => 'ਨਵੰਬਰ',
-'dec' => 'ਦਸੰਬਰ',
+'jul' => 'ਜੁਲਾ',
+'aug' => 'ਅਗ',
+'sep' => 'ਸਤੰ',
+'oct' => 'ਅਕਤੂ',
+'nov' => 'ਨਵੰ',
+'dec' => 'ਦਸੰ',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|ਸ਼੍ਰੇਣੀ|ਸ਼੍ਰੇਣੀਆਂ}}',
@@ -311,7 +302,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'category-media-header' => 'ਸ਼੍ਰੇਣੀ "$1" ਵਿੱਚ ਮੀਡੀਆ',
 'category-empty' => "''ਇਸ ਸ਼੍ਰੇਣੀ ਵਿੱਚ ਇਸ ਵੇਲੇ ਕੋਈ ਵੀ ਪੰਨਾ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ ਹੈ।''",
 'hidden-categories' => '{{PLURAL:$1|ਲੁਕਵੀਂ ਸ਼੍ਰੇਣੀ|ਲੁਕਵੀਂਆਂ ਸ਼੍ਰੇਣੀਆਂ}}',
-'hidden-category-category' => 'ਲੁਕੀਆਂ ਕੈਟੇਗਰੀਆਂ',
+'hidden-category-category' => 'ਲà©\81à¨\95ਵà©\80à¨\86à¨\82 à¨\95à©\88à¨\9fà©\87à¨\97ਰà©\80à¨\86à¨\82',
 'category-subcat-count' => 'ਇਸ ਸ਼੍ਰੇਣੀ ਵਿੱਚ, ਕੁੱਲ $2 ਵਿੱਚੋਂ, {{PLURAL:$2|ਕੇਵਲ ਇਹ ਉਪਸ਼੍ਰੇਣੀ ਹੈ|ਇਹ {{PLURAL:$1|ਉਪਸ਼੍ਰੇਣੀ ਹੈ|$1 ਉਪਸ਼੍ਰੇਣੀਆਂ ਹਨ}}}}।',
 'category-subcat-count-limited' => 'ਇਸ ਕੈਟੇਗਰੀ ਵਿਚ {{PLURAL:$1|ਸਬ-ਕੈਟੇਗਰੀ ਹੈ|$1 ਸਬ-ਕੈਟੇਗਰੀਆਂ ਹਨ}}।',
 'category-article-count' => '{{PLURAL:$2|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿੱਚ ਕੇਵਲ ਇਹ ਪੰਨਾ ਹੈ।| ਇਸ ਸ਼੍ਰੇਣੀ ਵਿੱਚ, ਕੁੱਲ $2 ਵਿੱਚੋਂ, ਇਹ {{PLURAL:$1|ਪੰਨਾ ਹੈ|$1 ਪੰਨੇ ਹਨ}}}}।',
@@ -319,7 +310,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'category-file-count' => '{{PLURAL:$2|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿੱਚ ਕੇਵਲ ਇਹ ਫ਼ਾਈਲ ਹੈ|ਇਸ ਸ਼੍ਰੇਣੀ ਵਿੱਚ {{PLURAL:$1|ਫ਼ਾਈਲ ਹੈ|$1 ਫ਼ਾਈਲਾਂ ਹਨ}}}}।',
 'category-file-count-limited' => 'ਮੌਜੂਦਾ ਕੈਟੇਗਰੀ ਵਿਚ ਇਹ {{PLURAL:$1|ਫ਼ਾਈਲ ਹੈ|$1 ਫ਼ਾਈਲਾਂ ਹਨ}}।',
 'listingcontinuesabbrev' => 'ਜਾਰੀ',
-'index-category' => 'ਤਤà¨\95ਰà©\87 à¨µà¨¾à¨²à¨¼à©\87 ਸਫ਼ੇ',
+'index-category' => 'ਤਤà¨\95ਰਾ ਸਫ਼ੇ',
 'noindex-category' => 'ਬਿਨਾਂ ਤਤਕਰੇ ਵਾਲੇ ਪੰਨੇ',
 'broken-file-category' => 'ਟੁੱਟੇ ਹੋਏ ਫ਼ਾਈਲ ਜੋੜਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ',
 
@@ -327,104 +318,104 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'article' => 'ਸਮੱਗਰੀ ਸਫ਼ਾ',
 'newwindow' => '(ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਖੁੱਲ੍ਹਦੀ ਹੈ)',
 'cancel' => 'ਰੱਦ ਕਰੋ',
-'moredotdotdot' => 'ਹੋਰ...',
-'morenotlisted' => 'ਹੋਰ ਨਹੀ ਹੈਗੇ',
-'mypage' => 'ਪੰਨਾ',
+'moredotdotdot' => '...ਹੋਰ',
+'morenotlisted' => '....ਹੋਰ ਸੂਚੀਬੱਧ ਨਹੀਂ',
+'mypage' => 'ਸਫ਼ਾ',
 'mytalk' => 'ਚਰਚਾ',
 'anontalk' => 'ਇਸ IP ਲਈ ਗੱਲ-ਬਾਤ',
-'navigation' => 'ਰਹਿਨà©\81ਮਾà¨\88',
+'navigation' => 'ਨà©\87ਵà©\80à¨\97à©\87ਸ਼ਨ',
 'and' => '&#32;ਅਤੇ',
 
 # Cologne Blue skin
-'qbfind' => 'ਖੋਜ',
-'qbbrowse' => 'ਬਰਾà¨\8aà¨\9c਼',
+'qbfind' => 'ਖੋਜ',
+'qbbrowse' => 'à¨\9dਲà¨\95',
 'qbedit' => 'ਸੋਧ',
-'qbpageoptions' => 'à¨\87ਹ à¨ªà©°à¨¨ਾ',
-'qbmyoptions' => 'ਮà©\87ਰà©\87 à¨ªà©°à¨¨ੇ',
-'qbspecialpages' => 'à¨\96ਾਸ à¨ªà©°à¨¨ੇ',
-'faq' => 'à¨\85à¨\95ਸਰ à¨ªà©\81ੱà¨\9bà©\87 à¨\9cਾਣ à¨µà¨¾à¨²à©\87 à¨¸à¨µà¨¾à¨²',
+'qbpageoptions' => 'à¨\87ਹ à¨¸à¨«à¨¼ਾ',
+'qbmyoptions' => 'ਮà©\87ਰà©\87 à¨¸à¨«à¨¼ੇ',
+'qbspecialpages' => 'à¨\96਼ਾਸ à¨¸à¨«à¨¼ੇ',
+'faq' => 'ਸਵਾਲ-à¨\9cਵਾਬ',
 'faqpage' => 'Project:ਸਵਾਲ-ਜਵਾਬ',
 
 # Vector skin
 'vector-action-addsection' => 'ਵਿਸ਼ਾ ਜੋੜੋ',
 'vector-action-delete' => 'ਹਟਾਓ',
-'vector-action-move' => 'ਸਥਾਨਾà¨\82ਤਰਣ à¨\95ਰੋ',
-'vector-action-protect' => 'ਸà©\81ਰੱà¨\96ਿà¨\85ਤ à¨\95ਰà©\8b',
-'vector-action-undelete' => 'à¨\85ਣ-ਮਿà¨\9fਾà¨\89ਣਾ',
+'vector-action-move' => 'ਭà©\87à¨\9cੋ',
+'vector-action-protect' => 'ਸà©\81ਰੱà¨\96ਿà¨\86',
+'vector-action-undelete' => 'ਹà¨\9fਾà¨\89ਣਾ-ਵਾਪਸ',
 'vector-action-unprotect' => 'ਸੁਰੱਖਿਆ ਬਦਲੋ',
 'vector-simplesearch-preference' => 'ਸਧਾਰਨ ਖੋਜ ਸਲਾਹ ਪੱਟੀ ਯੋਗ ਕਰੋ (ਸਿਰਫ਼ ਵਿਕਟਰ ਸਕਿੰਨ ਵਿਚ)',
 'vector-view-create' => 'ਬਣਾਓ',
-'vector-view-edit' => 'ਸੰਪਾਦਨ',
-'vector-view-history' => 'à¨\87ਤਿਹਾਸ ਵੇਖੋ',
+'vector-view-edit' => 'ਸà©\8bਧ',
+'vector-view-history' => 'à¨\85ਤà©\80ਤ ਵੇਖੋ',
 'vector-view-view' => 'ਪੜ੍ਹੋ',
 'vector-view-viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
 'actions' => 'ਕਾਰਵਾਈਆਂ',
-'namespaces' => 'ਨਾਮ-ਥਾਂਵਾਂ',
+'namespaces' => 'ਨਾਮਸਥਾਨ',
 'variants' => 'ਬਦਲ',
 
-'navigation-heading' => 'ਦਿà¨\95à¨\9aਾਲਨ à¨¸à©\82à¨\9aà©\80',
+'navigation-heading' => 'ਨà©\87ਵà©\80à¨\97à©\87ਸ਼ਨ à¨®à©\87ਨà©\82',
 'errorpagetitle' => 'ਗਲਤੀ',
 'returnto' => '$1 ’ਤੇ ਵਾਪਸ ਜਾਓ।',
 'tagline' => '{{SITENAME}} ਤੋਂ',
 'help' => 'ਮਦਦ',
-'search' => 'ਖੋਜ',
-'searchbutton' => 'ਖੋਜ',
+'search' => 'ਖੋਜ',
+'searchbutton' => 'ਖੋਜ',
 'go' => 'ਜਾਓ',
 'searcharticle' => 'ਜਾਓ',
-'history' => 'ਪੰਨà©\87 à¨¦à¨¾ à¨\87ਤਿਹਾਸ',
-'history_short' => 'à¨\87ਤਿਹਾਸ',
-'updatedmarker' => 'ਮà©\87ਰà©\80 à¨\86à¨\96਼ਰà©\80 à¨«à©\87ਰà©\80 à¨¤à©\8bà¨\82 à¨¬à¨¾à¨\85ਦ à¨¬à¨¦à¨²à©\87 à¨\97à¨\8f',
+'history' => 'ਸਫ਼à©\87 à¨¦à¨¾ à¨\85ਤà©\80ਤ',
+'history_short' => 'à¨\85ਤà©\80ਤ',
+'updatedmarker' => 'ਮà©\87ਰà©\80 à¨\86à¨\96ਰà©\80 à¨«à©\87ਰà©\80 à¨¤à©\8bà¨\82 à¨¬à¨¾à¨\85ਦ à¨¦à©\87 à¨\85ੱਪਡà©\87à¨\9f',
 'printableversion' => 'ਛਪਣਯੋਗ ਵਰਜਨ',
 'permalink' => 'ਪੱਕਾ ਲਿੰਕ',
 'print' => 'ਛਾਪੋ',
 'view' => 'ਵੇਖੋ',
-'edit' => 'ਸੰਪਾਦਨ',
+'edit' => 'ਸà©\8bਧà©\8b',
 'create' => 'ਬਣਾਓ',
 'editthispage' => 'ਇਹ ਸਫ਼ਾ ਸੋਧੋ',
 'create-this-page' => 'ਇਹ ਸਫ਼ਾ ਬਣਾਓ',
 'delete' => 'ਹਟਾਓ',
-'deletethispage' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨®à¨¿ਟਾਓ',
-'undelete_short' => '{{PLURAL:$1|à¨\87ੱà¨\95 à¨¸à©\8bਧ|$1 à¨¸à©\8bਧਾà¨\82}} à¨\85ਣ-ਮਿà¨\9fਾà¨\93',
-'viewdeleted_short' => '{{PLURAL:$1|à¨\87à¨\95 à¨®à¨¿à¨\9fਾà¨\88 à¨¸à©\8bਧ|$1 à¨®à¨¿ਟਾਈਆਂ ਸੋਧਾਂ}} ਵੇਖੋ',
+'deletethispage' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨¹ਟਾਓ',
+'undelete_short' => '{{PLURAL:$1|à¨\87ੱà¨\95 à¨¸à©\8bਧ|$1 à¨¸à©\8bਧਾà¨\82}} à¨¹à¨\9fਾà¨\89ਣਾ-ਵਾਪਸ',
+'viewdeleted_short' => '{{PLURAL:$1|ਹà¨\9fਾà¨\88 à¨¸à©\8bਧ|$1 à¨¹ਟਾਈਆਂ ਸੋਧਾਂ}} ਵੇਖੋ',
 'protect' => 'ਸੁਰੱਖਿਆ',
-'protect_change' => 'ਬਦਲà©\80',
+'protect_change' => 'ਬਦਲà©\8b',
 'protectthispage' => 'ਇਹ ਸਫ਼ਾ ਸੁਰੱਖਿਅਤ ਕਰੋ',
 'unprotect' => 'ਸੁਰੱਖਿਆ ਬਦਲੋ',
 'unprotectthispage' => 'ਇਹ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ',
-'newpage' => 'ਨਵਾà¨\82 à¨ªà©°à¨¨ਾ',
+'newpage' => 'ਨਵਾà¨\82 à¨¸à¨«à¨¼ਾ',
 'talkpage' => 'ਇਸ ਸਫ਼ੇ ਬਾਰੇ ਚਰਚਾ ਕਰੋ',
 'talkpagelinktext' => 'ਚਰਚਾ',
 'specialpage' => 'ਖ਼ਾਸ ਸਫ਼ਾ',
 'personaltools' => 'ਨਿੱਜੀ ਸੰਦ',
-'postcomment' => 'ਨਵਾà¨\82 à¨¸à©\88à¨\95ਸ਼ਨ',
+'postcomment' => 'ਨਵਾà¨\82 à¨­à¨¾à¨\97',
 'articlepage' => 'ਸਮੱਗਰੀ ਸਫ਼ਾ ਵੇਖੋ',
 'talk' => 'ਚਰਚਾ',
 'views' => 'ਵੇਖੋ',
 'toolbox' => 'ਸੰਦ ਬਕਸਾ',
-'userpage' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¸à¨«à¨¼ਾ ਵੇਖੋ',
+'userpage' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨ªà©°à¨¨ਾ ਵੇਖੋ',
 'projectpage' => 'ਪ੍ਰੋਜੈਕਟ ਸਫ਼ਾ ਵੇਖੋ',
-'imagepage' => 'ਫ਼ਾà¨\88ਲ ਸਫ਼ਾ ਵੇਖੋ',
+'imagepage' => 'ਫਾà¨\87ਲ ਸਫ਼ਾ ਵੇਖੋ',
 'mediawikipage' => 'ਸੁਨੇਹਾ ਪੇਜ ਵੇਖੋ',
-'templatepage' => 'ਫਰਮਾ à¨¸à¨«à¨¼ਾ ਵੇਖੋ',
-'viewhelppage' => 'ਮਦਦ ਸਫ਼ਾ ਵੇਖੋ',
+'templatepage' => 'ਫਰਮਾ à¨ªà©°à¨¨ਾ ਵੇਖੋ',
+'viewhelppage' => 'ਮੱਦਦ à¨¸à¨«à¨¼à¨¾ à¨µà©\87à¨\96à©\8b',
 'categorypage' => 'ਕੈਟੈਗਰੀ ਸਫ਼ਾ ਵੇਖੋ',
 'viewtalkpage' => 'ਚਰਚਾ ਵੇਖੋ',
-'otherlanguages' => 'ਹੋਰ ਭਾਸ਼ਾਵਾਂ',
+'otherlanguages' => 'ਹੋਰ ਭਾਸ਼ਾਵਾਂ ਵਿੱਚ',
 'redirectedfrom' => '($1 ਤੋਂ ਰੀਡਿਰੈਕਟ)',
 'redirectpagesub' => 'ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ',
-'lastmodifiedat' => 'à¨\87ਸ à¨ªà©°à¨¨à¨¾ à¨¦à¨¾ à¨ªà¨¿à©±à¨\9bਲਾ à¨¬à¨¦à¨²à¨¾à¨µ  $1 à¨¨à©\82à©°  $2 à¨µà¨\9cà©\87 à¨¹à©\8bà¨\87à¨\86 à¨¸à©\80।',
+'lastmodifiedat' => 'à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨µà¨¿à©±à¨\9a à¨\86à¨\96਼ਰà©\80 à¨¸à©\8bਧ $1 à¨¨à©\82à©° $2 à¨µà¨\9cà©\87 à¨¹à©\8bà¨\88।',
 'viewcount' => 'ਇਹ ਸਫ਼ਾ {{PLURAL:$1|ਇੱਕ ਵਾਰ|$1 ਵਾਰ}} ਵੇਖਿਆ ਗਿਆ।',
 'protectedpage' => 'ਸੁਰੱਖਿਅਤ ਪੇਜ',
 'jumpto' => 'ਇਸ ’ਤੇ ਜਾਓ:',
-'jumptonavigation' => 'ਰਹਿਨà©\81ਮਾà¨\88',
-'jumptosearch' => 'ਖੋਜ',
-'view-pool-error' => 'à¨\86ਫ਼ਸà©\8bਸ, à¨¸à¨°à¨µà¨° à¨\87ਸ à¨µà©\87ਲ਼ੇ ਓਵਰਲੋਡ ਹੈ।
+'jumptonavigation' => 'ਨà©\87ਵà©\80à¨\97à©\87ਸ਼ਨ',
+'jumptosearch' => 'ਖੋਜ',
+'view-pool-error' => 'à¨\85ਫ਼ਸà©\8bਸ, à¨¸à¨°à¨µà¨° à¨\87ਸ à¨µà©\87ਲੇ ਓਵਰਲੋਡ ਹੈ।
 ਬਹੁਤ ਸਾਰੇ ਮੈਂਬਰ ਇਸ ਸਫ਼ੇ ਨੂੰ ਵੇਖਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਹੇ ਹਨ।
-ਮਿਹਰਬਾਨà©\80 à¨\95ਰà¨\95à©\87 à¨¦à©\81ਬਾਰਾ à¨\95à©\8bਸ਼ਿਸ਼ à¨\95ਰਨ à¨¤à©\8bà¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¥à©\8bà©\9cà©\80 à¨\89ਡà©\80à¨\95 à¨\95ਰà©\8b
+ਫà©\87ਰ à¨\95à©\8bਸ਼ਿਸ਼ à¨\95ਰਨ à¨¤à©\8bà¨\82 à¨ªà¨¹à¨¿à¨²à¨¾à¨\82 à¨¥à©\8bà©\9cà©\80 à¨\89ਡà©\80à¨\95 à¨\95ਰà©\8b à¨\9cà©\80
 $1',
-'pool-timeout' => 'ਲà©\8cਕ ਲਈ ਉਡੀਕ ਦਾ ਵਕਤ ਖ਼ਤਮ ਹੋ ਗਿਆ ਹੈ',
-'pool-queuefull' => 'ਪà©\82ਲ à¨\95ਤਾਰ à¨ªà©\82ਰà©\80 à¨²à©±à¨¦ੀ ਹੈ',
-'pool-errorunknown' => 'à¨\85ਣà¨\9cਾਣ à¨\97਼ਲਤà©\80',
+'pool-timeout' => 'ਲਾਕ ਲਈ ਉਡੀਕ ਦਾ ਵਕਤ ਖ਼ਤਮ ਹੋ ਗਿਆ ਹੈ',
+'pool-queuefull' => 'ਪà©\82ਲ à¨\95ਤਾਰ à¨­à¨°ੀ ਹੈ',
+'pool-errorunknown' => 'ਅਣਜਾਣ ਗਲਤੀ',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}} ਬਾਰੇ',
@@ -433,18 +424,18 @@ $1',
 'copyrightpage' => '{{ns:project}}:ਕਾਪੀਰਾਈਟ',
 'currentevents' => 'ਹਾਲ ਦੀਆਂ ਘਟਨਾਵਾਂ',
 'currentevents-url' => 'Project:ਹਾਲ ਦੀਆਂ ਘਟਨਾਵਾਂ',
-'disclaimers' => 'à¨\87ਨà¨\95ਾਰà©\80 à¨\90ਲਾਨ',
-'disclaimerpage' => 'Project:à¨\86ਮ à¨\87ਨà¨\95ਾਰ',
-'edithelp' => 'ਸੰਪਾਦਨ à¨®ਦਦ',
-'edithelppage' => 'Help:ਸੰਪਾਦਨ',
-'helppage' => 'Help:à¨\9aà©\80à¨\9c਼ਾà¨\82',
-'mainpage' => 'ਮà©\81ੱà¨\96 à¨ªà©°à¨¨ਾ',
-'mainpage-description' => 'ਮà©\81ੱà¨\96 à¨ªà©°à¨¨ਾ',
-'policy-url' => 'Project:ਪਾਲਸੀ',
-'portal' => 'ਸਮਾà¨\9c à¨®à©\81ੱà¨\96 à¨ªà©°à¨¨à¨¾',
-'portal-url' => 'Project:ਸਮਾà¨\9c à¨®à©\81ੱà¨\96 à¨ªà©°à¨¨à¨¾',
-'privacy' => 'ਲà©\81à¨\95ਾà¨\85 ਨੀਤੀ',
-'privacypage' => 'Project:ਲà©\81à¨\95ਾà¨\85 ਨੀਤੀ',
+'disclaimers' => 'ਦਾà¨\85ਵà©\87',
+'disclaimerpage' => 'Project:à¨\86ਮ à¨¦à¨¾à¨\85ਵà©\87',
+'edithelp' => 'ਸà©\8bਧ à¨®à©±ਦਦ',
+'edithelppage' => 'Help:ਸà©\8bਧ',
+'helppage' => 'Help:ਸਮੱà¨\97ਰà©\80',
+'mainpage' => 'ਮà©\81ੱà¨\96 à¨¸à¨«à¨¼ਾ',
+'mainpage-description' => 'ਮà©\81ੱà¨\96 à¨¸à¨«à¨¼ਾ',
+'policy-url' => 'Project:ਨà©\80ਤੀ',
+'portal' => 'ਭਾà¨\88à¨\9aਾਰà¨\95 à¨¸à©±à¨¥',
+'portal-url' => 'Project:ਸਮਾà¨\9c à¨¸à©±à¨¥',
+'privacy' => 'ਪਰਾà¨\88ਵà©\87ਸà©\80 ਨੀਤੀ',
+'privacypage' => 'Project:ਪਰਾà¨\88ਵà©\87ਸà©\80 ਨੀਤੀ',
 
 'badaccess' => 'ਅਧਿਕਾਰ ਗਲਤੀ',
 'badaccess-group0' => 'ਤੁਹਾਨੂੰ ਉਹ ਐਕਸ਼ਨ ਕਰਨ ਦੀ ਮਨਜ਼ੂਰੀ ਨਹੀਂ, ਜਿਸ ਦੀ ਤੁਸੀਂ ਮੰਗ ਕੀਤੀ ਹੈ।',
@@ -458,24 +449,24 @@ $1',
 'retrievedfrom' => '"$1" ਤੋਂ ਲਿਆ',
 'youhavenewmessages' => 'ਤੁਹਾਡੇ ਲਈ $1। ($2)',
 'newmessageslink' => 'ਨਵੇਂ ਸੁਨੇਹੇ',
-'newmessagesdifflink' => 'ਪਿੱà¨\9bਲਾ à¨¬à¨¦à¨²à¨¾à¨µ',
+'newmessagesdifflink' => 'à¨\86à¨\96਼ਰà©\80 à¨¤à¨¬à¨¦à©\80ਲà©\80',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|ਇੱਕ ਵਰਤੋਂਕਾਰ|$3 ਵਰਤੋਂਕਾਰਾਂ}} ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।',
-'youhavenewmessagesmanyusers' => 'à¨\95à¨\88 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰਾà¨\82 ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।',
+'youhavenewmessagesmanyusers' => 'à¨\95à¨\88 à¨¯à©\82à¨\9c਼ਰ ਵੱਲੋਂ ਤੁਹਾਨੂੰ $1 ($2)।',
 'newmessageslinkplural' => '{{PLURAL:$1|ਇੱਕ ਨਵਾਂ ਸੁਨੇਹਾ|ਨਵੇਂ ਸੁਨੇਹੇ}} {{PLURAL:$1|ਹੈ|ਹਨ}}',
 'newmessagesdifflinkplural' => 'ਆਖ਼ਰੀ {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}',
 'youhavenewmessagesmulti' => '$1 ’ਤੇ ਤੁਹਾਡੇ ਲਈ ਨਵੇਂ ਸੁਨੇਹੇ ਹਨ',
-'editsection' => 'ਸੰਪਾਦਨ',
-'editold' => 'ਸੰਪਾਦਨ',
+'editsection' => 'ਸà©\8bਧ',
+'editold' => 'ਸà©\8bਧ',
 'viewsourceold' => 'ਸਰੋਤ ਵੇਖੋ',
-'editlink' => 'ਸੰਪਾਦਨ',
+'editlink' => 'ਸà©\8bਧ',
 'viewsourcelink' => 'ਸਰੋਤ ਵੇਖੋ',
-'editsectionhint' => 'ਭਾà¨\97 à¨¸à©°à¨ªà¨¾à¨¦à¨¨: $1',
+'editsectionhint' => 'ਭਾà¨\97 à¨¸à©\8bਧ: $1',
 'toc' => 'ਵਿਸ਼ਾ ਸੂਚੀ',
-'showtoc' => 'ਵà©\87à¨\96à©\8b',
+'showtoc' => 'ਵà©\87à¨\96ਾà¨\93',
 'hidetoc' => 'ਓਹਲੇ',
 'collapsible-collapse' => 'ਸਮੇਟੋ',
 'collapsible-expand' => 'ਫੈਲਾਓ',
-'thisisdeleted' => '$1 à¨µà©\87à¨\96à©\8b à¨\9cਾà¨\82 à¨®à©\81à©\9c à¨¬à¨¹à¨¾à¨² ਕਰੋ',
+'thisisdeleted' => '$1 à¨µà©\87à¨\96à©\8b à¨\9cਾà¨\82 à¨®à©\81à©\9c à¨¸à¨\9fà©\8bਰ ਕਰੋ',
 'viewdeleted' => '$1 ਵੇਖਣੀਆਂ ਹਨ?',
 'restorelink' => '{{PLURAL:$1|ਇਕ ਮਿਟਾਈ ਹੋਈ ਸੋਧ|$1 ਮਿਟਾਈਆਂ ਹੋਈਆਂ ਸੋਧਾਂ}}',
 'feedlinks' => 'ਫੀਡ:',
@@ -485,20 +476,20 @@ $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' => 'ਵੱਧਦਾ ਕ੍ਰਮ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'ਪੰਨਾ',
-'nstab-user' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨ªà©°à¨¨à©\87',
-'nstab-media' => 'ਮà©\80ਡà©\80ਆ ਸਫ਼ਾ',
-'nstab-special' => 'ਵਿਸ਼à©\87ਸ਼ à¨ªà©°à¨¨ਾ',
-'nstab-project' => 'ਪਰਿਯà©\8bà¨\9cਨਾ à¨ªà©°à¨¨ਾ',
-'nstab-image' => 'ਫ਼ਾà¨\88ਲ',
+'nstab-main' => 'ਸਫ਼ਾ',
+'nstab-user' => 'ਯà©\82à¨\9c਼ਰ à¨¸à¨«à¨¼à¨¾',
+'nstab-media' => 'ਮà©\80ਡਿਆ ਸਫ਼ਾ',
+'nstab-special' => 'à¨\96ਾਸ à¨¸à¨«à¨¼ਾ',
+'nstab-project' => 'ਪਰà©\8bà¨\9cà©\88à¨\95à¨\9f à¨¸à¨«à¨¼ਾ',
+'nstab-image' => 'ਫਾà¨\87ਲ',
 'nstab-mediawiki' => 'ਸੁਨੇਹਾ',
-'nstab-template' => 'ਸਾà¨\82à¨\9aਾ',
-'nstab-help' => 'ਮੱਦਦ à¨ªà©\87à¨\9c',
+'nstab-template' => 'à¨\9fà©\88ਪਲà©\87à¨\9f',
+'nstab-help' => 'ਮੱਦਦ à¨¸à¨«à¨¼à¨¾',
 'nstab-category' => 'ਸ਼੍ਰੇਣੀ',
 
 # Main script and global functions
@@ -512,7 +503,7 @@ $1',
 
 # General errors
 'error' => 'ਗ਼ਲਤੀ',
-'databaseerror' => 'ਡà©\88à¨\9fਾਬà©\87ਸ à¨\97਼ਲਤੀ',
+'databaseerror' => 'ਡਾà¨\9fਾਬà©\87ਸ à¨\97ਲਤੀ',
 'dberrortext' => 'ਡੈਟਾਬੇਸ ਪੁ੍ਛ ਗਿੱਛ ਵਿਚ ਹਿਦਾਇਤਾਂ ਦੀ ਤਰੁੱਟੀ ਮਿਲੀ ਹੈ।
 ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਤਰੁ੍ੱਟੀ ਸਾਫ਼ਟਵੇਅਰ ਦੀ ਹੋਵੇ।
 ਇਸ ਗਣਿਤਫ਼ਲ "<tt>$2</tt>" ਵਿਚੌਂ ਪਿਛਲੀ ਡੈਟਬਾਸ ਪੁੱਛ ਗਿੱਛ ਸੀ: <blockquote><tt>$1</tt></blockquote.
@@ -528,25 +519,25 @@ $1',
 'missing-article' => "ਡਾਟਾਬੇਸ ਨੂੰ ''$1'' $2 ਨਾਮ ਦਾ ਕੋਈ ਪੰਨਾ ਨਹੀਂ ਮਿਲਿਆ।
 ਆਮ ਤੌਰ ਤੇ ਹਟਾਈ ਜਾ ਚੁੱਕੇ ਪੰਨੇ ਦਾ ਇਤਿਹਾਸ ਕੜੀ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲ ਇੰਝ ਹੁੰਦਾ ਹੈ।
 ਜੇ ਇਹ ਗੱਲ ਨਹੀਂ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਤੁਹਾਨੂੰ ਸਾਫ਼ਟਵੇਅਰ ਵਿਚ ਖਾਮੀ ਮਿਲ ਗਈ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਪੰਨੇ ਦੇ ਪਤੇ ਸਮੇਤ [[Special:ListUsers/sysop|administrator]] ਨੂੰ ਇਤਲਾਹ ਦਿਓ।",
-'missingarticle-rev' => '(ਬਦਲਾà¨\85#: $1)',
-'missingarticle-diff' => '(ਫ਼ਰà¨\95: $1, $2)',
+'missingarticle-rev' => '(ਰà©\80ਵਿà¨\9c਼ਨ#: $1)',
+'missingarticle-diff' => '(à¨\85ੰਤਰ: $1, $2)',
 'readonly_lag' => 'ਜਦੌਂ ਤਕ ਅਧੀਨ ਡੇਟਾਬੇਸ ਸਰਵਰ ਸੁਤੰਤਰ ਡੈਟਾਬੇਸ ਸਰਵਰ ਦੀ ਪਕੜ ਵਿਚ ਨਹੀਂ ਆ ਜਾਂਦੇ ਡੈਟਾਬੇਸ ਸਵੈ ਜਕੜਿਆ ਗਿਆ ਹੈ।',
 'internalerror' => 'ਅੰਦਰੂਨੀ ਗ਼ਲਤੀ',
 'internalerror_info' => 'ਅੰਦਰੂਨੀ ਗ਼ਲਤੀ: $1',
 'fileappenderrorread' => 'ਅੰਤਕਾ ਜੋੜਨ ਲਗਿਆਂ "$1"ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।',
 'fileappenderror' => "''$1'' ''$2'' ਨਾਲ਼ ਜੋੜਿਆ ਨਹੀ ਜਾ ਸਕਦਾ",
-'filecopyerror' => "'''$1''' ਫ਼ਾਈਲ '''$2''' ਵਿਚ ਨਕਲ ਨਹੀਂ ਹੋ ਸਕੀ।",
-'filerenameerror' => "ਫ਼ਾà¨\88ਲ ''$1'' à¨¦à¨¾ à¨¨à¨¾à¨® à¨¬à¨¦à¨² à¨\95à©\87 ''$2'' à¨¨à¨¹à©\80à¨\82 à¨°à©±à¨\96ਿà¨\86 ਜਾ ਸਕਿਆ।",
-'filedeleteerror' => "ਫ਼ਾਈਲ ''$1'' ਮਿਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
-'directorycreateerror' => "''$1'' ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
-'filenotfound' => "ਫ਼ਾà¨\88ਲ ''$1'' ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।",
-'fileexistserror' => 'ਮਿਸਲ "$1" à¨¤à©\87 à¨²à¨¿à¨\96 à¨¨à¨¹à©\80à¨\82 à¨¸à¨\95ਦà©\87: à¨®à¨¿à¨¸à¨² à¨¹à©\8cà¨\82ਦ à¨µà¨¿à¨\9a ਹੈ।',
+'filecopyerror' => "ਫਾਇਲ '''$1'' '$2''' ਵਿੱਚ ਕਾਪੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ।",
+'filerenameerror' => "ਫਾà¨\87ਲ ''$1'' à¨¦à¨¾ à¨¨à¨¾à¨\82 ''$2'' à¨¬à¨¦à¨²à¨¿à¨\86 à¨¨à¨¹à©\80à¨\82 ਜਾ ਸਕਿਆ।",
+'filedeleteerror' => "''$1'' ਫਾਇਲ ਹਟਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
+'directorycreateerror' => "ਡਾਇਰੈਕਟਰੀ ''$1'' ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ।",
+'filenotfound' => "ਫਾà¨\87ਲ ''$1'' ਲੱਭੀ ਨਹੀਂ ਜਾ ਸਕੀ।",
+'fileexistserror' => 'ਫਾà¨\87ਲ "$1" à¨\89ੱਤà©\87 à¨²à¨¿à¨\96 à¨¨à¨¹à©\80à¨\82 à¨¸à¨\95ਦà©\87: à¨«à¨¾à¨\87ਲ à¨®à©\8cà¨\9cà©\82ਦ ਹੈ।',
 'unexpected' => 'ਅਣਉਮੀਦਿਆ ਮੁੱਲ: "$1"="$2"।',
 'formerror' => 'ਗ਼ਲਤੀ: ਫ਼ਾਰਮ ਪੇਸ਼ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ',
 'badarticleerror' => 'ਇਹ ਕਾਰਵਾਈ ਇਸ ਸਫ਼ੇ ਤੇ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।',
 'cannotdelete' => "ਫ਼ਾਈਲ ਜਾਂ ਸਫ਼ਾ ''$1'' ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।
 ਸ਼ਾਇਦ ਕੋਈ ਪਹਿਲਾਂ ਹੀ ਇਸਨੂੰ ਮਿਟਾ ਚੁੱਕਾ ਹੈ।",
-'cannotdelete-title' => "ਸਫ਼ਾ ''$1'' à¨¨à©\82à©° à¨®à¨¿ਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ",
+'cannotdelete-title' => "ਸਫ਼ਾ ''$1'' à¨¨à©\82à©° à¨¹ਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ",
 'delete-hook-aborted' => 'ਹੁੱਕ ਨੇ ਮਿਟਾਉਣਾ ਨਾਕਾਮ ਕੀਤਾ।
 ਇਸਨੇ ਕੋਈ ਕਾਰਨ ਨਹੀਂ ਦੱਸਿਆ।',
 'badtitle' => 'ਗਲਤ ਸਿਰਲੇਖ',
@@ -558,11 +549,11 @@ $1',
  ਪ੍ਰਸ਼ਨ: $2',
 'viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
 'viewsource-title' => '$1 ਲਈ ਸਰੋਤ ਵੇਖੋ',
-'actionthrottled' => 'à¨\95ਾਰà¨\9c à¨¬à©°à¨¦ à¨\95ਰ à¨¦à¨¿à©±à¨¤à¨¾ à¨\97ਿà¨\86 à¨¹à©\88',
+'actionthrottled' => 'à¨\95ਾਰਵਾà¨\88 à¨¬à©°à¨¦ à¨\95à©\80ਤà©\80 à¨\97à¨\88।',
 'actionthrottledtext' => 'ਸਪੈਮ ਦੀ ਰੋਕਥਾਮ ਲਈ, ਇਹ ਕਰੀਆ ਇਨ੍ਹੇ ਘੱਟ ਸਮੇਂ ਵਿੱਚ ਇੱਕ ਸੀਮਾ ਤੋਂ ਜਿਆਦਾ ਵਾਰ ਕਰਨ ਤੋਂ ਮਨਾਹੀ ਹੈ, ਅਤੇ ਤੁਸੀਂ ਇਸ ਸੀਮਾ ਨੂੰ ਪਾਰ ਕਰ ਚੁੱਕੇ ਹੋ।
 ਕਿਰਪਾ ਕਰਕੇ ਕੁਝ ਸਮੇਂ ਬਾਅਦ ਪੁੰਨ: ਜਤਨ ਕਰੋ।',
 'protectedpagetext' => 'ਇਹ ਪੰਨੇ ਸੰਪਾਦਨ ਅਤੇ ਹੋਰ ਕੰਮ ਤੋਂ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਹੋਇਆ ਹੈ।',
-'viewsourcetext' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¦à¨¾ à¨¸à¨°à©\8bਤ à¨µà©\87à¨\96 à¨\85ਤà©\87 à¨¨à¨\95ਲ ਕਰ ਸਕਦੇ ਹੋ:',
+'viewsourcetext' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¦à¨¾ à¨¸à¨°à©\8bਤ à¨µà©\87à¨\96 à¨\85ਤà©\87 à¨\95ਾਪà©\80 ਕਰ ਸਕਦੇ ਹੋ:',
 'viewyourtext' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ’ਤੇ ਕੀਤੀਆਂ "ਆਪਣੀਆਂ ਸੋਧਾਂ" ਦਾ ਸਰੋਤ ਵੇਖ ਅਤੇ ਨਕਲ ਕਰ ਸਕਦੇ ਹੋ:',
 'protectedinterface' => 'ਇਹ ਪੰਨਾ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦਾ ਮੂਲ ਪਾਠ ਹੈ ,ਅਤੇ ਦੁਰਵਰਤੌਂ ਤੌਂ ਬਚਾਅ ਲਈ ਰਾਖਵਾਂ ਕੀਤਾ ਗਿਆ ਹੈ।',
 'editinginterface' => "'''ਚਿਤਾਵਨੀ''' ਤੁਸੀਂ ਐਸੇ ਪੰਨੇ ਨੂੰ ਬਦਲ ਰਹੇ ਹੋ ਜੋ ਸਾਫ਼ਟਵੇਅਰ ਇੰਟਰਫ਼ੇਸ ਦੇ ਮੂਲ ਪਾਠ ਲਈ ਵਰਤਿਆ ਗਿਆ ਹੈ।
@@ -580,6 +571,7 @@ $2',
 'exception-nologin-text' => 'ਇਹ ਸਫ਼ਾ ਜਾਂ ਕਾਰਵਾਈ ਤੁਹਾਡਾ ਇਸ ਵਿਕੀ ’ਤੇ ਲਾਗਇਨ ਕੀਤਾ ਹੋਣਾ ਲੋੜਦੀ ਹੈ।',
 
 # Virus scanner
+'virus-scanfailed' => 'ਸਕੈਨ ਫੇਲ੍ਹ ਹੈ (ਕੋਡ $1)',
 'virus-unknownscanner' => 'ਅਣਪਛਾਤਾ ਐਂਟੀਵਾਇਰਸ:',
 
 # Login and logout pages
@@ -587,12 +579,22 @@ $2',
 
 You can continue to use {{SITENAME}} anonymously, or you can log in again as the same or as a different user.
 Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomeuser' => 'ਸੁਆਗਤ, $1!',
-'welcomecreation-msg' => 'ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦਾਂ]] ਬਦਲਣੀਆਂ ਨਾ ਭੁੱਲੋ।',
-'yourname' => 'ਵਰਤੋਂਕਾਰ ਨਾਮ:',
+'welcomeuser' => '$1 ਜੀ ਆਇਆਂ ਨੂੰ!',
+'welcomecreation-msg' => 'ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦ]] ਬਦਲਣੀ ਨਾ ਭੁੱਲੋ।',
+'yourname' => 'ਯੂਜ਼ਰ-ਨਾਂ:',
+'userlogin-yourname' => 'ਯੂਜ਼ਰ ਨਾਂ',
+'userlogin-yourname-ph' => 'ਆਪਣਾ ਯੂਜਰ-ਨਾਂ ਦਿਉ',
 'yourpassword' => 'ਪਾਸਵਰਡ:',
-'yourpasswordagain' => 'ਪਾਸਵਰਡ ਦੁਬਾਰਾ ਲਿਖੋ:',
+'userlogin-yourpassword' => 'ਪਾਸਵਰਡ',
+'userlogin-yourpassword-ph' => 'ਆਪਣਾ ਪਾਸਵਰਡ ਦਿਉ',
+'createacct-yourpassword-ph' => 'ਪਾਸਵਰਡ ਦਿਉ',
+'yourpasswordagain' => 'ਪਾਸਵਰਡ ਮੁੜ ਲਿਖੋ:',
+'createacct-yourpasswordagain' => 'ਪਾਸਵਰਡ ਪੁਸ਼ਟੀ',
+'createacct-yourpasswordagain-ph' => 'ਪਾਸਵਰਡ ਫੇਰ ਦਿਉ',
 'remembermypassword' => 'ਇਸ ਕੰਪਿਊਟਰ ’ਤੇ ਮੇਰਾ ਲਾਗਇਨ ਯਾਦ ਰੱਖੋ (ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ)',
+'userlogin-remembermypassword' => 'ਮੈਨੂੰ ਯਾਦ ਰੱਖੋ',
+'userlogin-signwithsecure' => 'ਸੁਰੱਖਿਅਤ ਸਰਵਰ ਨਾਲ ਸਾਇਨ ਕਰੋ',
+'securelogin-stick-https' => 'ਲਾਗਇਨ ਕਰਨ ਦੇ ਬਾਅਦ HTTPS ਨਾਲ ਕੁਨੈਕਟ ਰਹੋ',
 'yourdomainname' => 'ਤੁਹਾਡੀ ਡੋਮੇਨ:',
 'password-change-forbidden' => 'ਇਸ ਵਿਕੀ ਤੇ ਤੁਸੀਂ ਪਾਸਵਰਡ ਨਹੀਂ ਬਦਲ ਸਕਦੇ।',
 'login' => 'ਲਾਗ ਇਨ',
@@ -603,33 +605,49 @@ Note that some pages may continue to be displayed as if you were still logged in
 'logout' => 'ਲਾਗ ਆਉਟ',
 'userlogout' => 'ਲਾਗ ਆਉਟ',
 'notloggedin' => 'ਲਾਗਇਨ ਨਹੀਂ',
+'userlogin-noaccount' => 'ਖਾਤਾ ਨਹੀਂ ਹੈ?',
+'userlogin-joinproject' => '{{SITENAME}} ਦਾ ਹਿੱਸਾ ਬਣੋ',
 'nologin' => 'ਖਾਤਾ ਨਹੀਂ ਹੈ? $1।',
 'nologinlink' => 'ਖਾਤਾ ਬਣਾਓ',
 'createaccount' => 'ਖਾਤਾ ਬਣਾਓ',
 'gotaccount' => 'ਖਾਤਾ ਪਹਿਲਾਂ ਹੀ ਹੈ? $1',
 'gotaccountlink' => 'ਲਾਗ ਇਨ',
 'userlogin-resetlink' => 'ਆਪਣੀ ਲਾਗਇਨ ਜਾਣਕਾਰੀ ਭੁੱਲ ਗਏ ਹੋ?',
-'createaccountmail' => 'ਈ-ਮੇਲ ਜ਼ਰੀਏ',
+'helplogin-url' => 'Help: ਲਾਗਇਨ ਕਰਨਾ',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ਲਾਗਇਨ ਕਰਨ ਬਾਰੇ ਮੱਦਦ]]',
+'createacct-join' => 'ਆਪਣੀ ਜਾਣਕਾਰੀ ਹੇਠਾਂ ਦਿਉ।',
+'createacct-emailrequired' => 'ਈਮੇਲ ਐਡਰੈਸ',
+'createacct-emailoptional' => 'ਈਮੇਲ ਐਡਰੈਸ (ਚੋਣਵਾਂ)',
+'createacct-email-ph' => 'ਆਪਣਾ ਈਮੇਲ ਐਡਰੈਸ ਦਿਉ',
+'createaccountmail' => 'ਆਰਜ਼ੀ ਰਲਵਾਂ ਪਾਸਵਰਡ ਵਰਤੋਂ ਅਤੇ ਇਸ ਨੂੰ ਹੇਠ ਦਿੱਤੇ ਈਮੇਲ ਸਿਰਨਾਵੇਂ ਉੱਤੇ ਭੇਜ ਦਿਉ',
+'createacct-realname' => 'ਅਸਲੀ ਨਾਂ (ਚੋਣਵਾਂ)',
 'createaccountreason' => 'ਕਾਰਨ:',
+'createacct-reason' => 'ਕਾਰਨ',
+'createacct-captcha' => 'ਸੁਰੱਖਿਆ ਜਾਂਚ',
+'createacct-imgcaptcha-ph' => 'ਉੱਤੇ ਵੇਖਾਈ ਦੇ ਰਿਹਾ ਸ਼ਬਦ ਦਿਉ',
+'createacct-benefit-heading' => '{{SITENAME}} ਨੂੰ ਤੁਹਾਡੇ ਵਰਗੇ ਲੋਕਾਂ ਵਲੋਂ ਹੀ ਬਣਾਇਆ ਗਿਆ ਹੈ।',
+'createacct-benefit-body1' => 'ਸੋਧਾਂ',
+'createacct-benefit-body2' => 'ਸਫ਼ੇ',
+'createacct-benefit-body3' => 'ਇਹ ਮਹੀਨੇ ਲਈ ਯੋਗਦਾਨ',
 'badretype' => 'ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੇ ਪਾਸਵਰਡ ਮਿਲਦੇ ਨਹੀਂ ਹਨ।',
-'userexists' => 'ਇਹ ਮੈਂਬਰ-ਨਾਮ ਪਹਿਲਾਂ ਹੀ ਵਰਤੋਂ ’ਚ ਹੈ।
-ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਵੱਖਰਾ ਮੈਂਬਰ-ਨਾਮ ਵਰਤੋਂ।',
+'userexists' => 'ਯੂਜ਼ਰ-ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਵੱਖਰਾ ਨਾਂ ਚੁਣੋ ਜੀ।',
 'loginerror' => 'ਲਾਗਇਨ ਗ਼ਲਤੀ',
+'createacct-error' => 'ਖਾਤਾ ਬਣਾਉਣ ਗਲਤੀ',
 'createaccounterror' => 'ਖਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ: $1',
 'nocookiesnew' => 'ਯੂਜ਼ਰ ਅਕਾਊਂਟ ਬਣਾਇਆ ਗਿਆ ਹੈ, ਪਰ ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ ਹੈ।{{SITENAME}} uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.',
 'nocookieslogin' => '{{SITENAME}} ਯੂਜ਼ਰਾਂ ਨੂੰ ਲਾਗਇਨ ਕਰਨ ਲਈ ਕੂਕੀਜ਼ ਵਰਤਦੀ ਹੈ। ਤੁਹਾਡੇ ਕੂਕੀਜ਼ ਆਯੋਗ ਕੀਤੇ ਹੋਏ ਹਨ। ਉਨ੍ਹਾਂ ਨੂੰ ਯੋਗ ਕਰਕੇ ਮੁੜ ਟਰਾਈ ਕਰੋ।',
-'noname' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ੱà¨\95 à¨¸à¨¹à©\80 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ-ਨਾਂ ਨਹੀਂ ਦਿੱਤਾ ਹੈ।',
-'loginsuccesstitle' => 'ਲਾà¨\97à¨\87ਨ à¨\95ਾਮਯਾਬ',
-'loginsuccess' => "'''ਤà©\81ਸà©\80à¨\82 {{SITENAME}} à¨\89ੱਤà©\87 \"\$1\" à¨µà¨¾à¨\82à¨\97 ਲਾਗਇਨ ਕਰ ਚੁੱਕੇ ਹੋ।'''",
+'noname' => 'ਤà©\81ਸà©\80à¨\82 à¨\87ੱà¨\95 à¨¸à¨¹à©\80 à¨¯à©\82à¨\9c਼ਰ-ਨਾਂ ਨਹੀਂ ਦਿੱਤਾ ਹੈ।',
+'loginsuccesstitle' => 'ਲਾà¨\97à¨\87ਨ à¨¸à¨«à¨¼à¨²',
+'loginsuccess' => "'''ਤà©\81ਸà©\80à¨\82 {{SITENAME}} à¨\89ੱਤà©\87 \"\$1\" à¨µà¨\9cà©\8bà¨\82 ਲਾਗਇਨ ਕਰ ਚੁੱਕੇ ਹੋ।'''",
 'nosuchuser' => '!"$1" ਨਾਂ ਨਾਲ ਕੋਈ ਯੂਜ਼ਰ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਸ਼ਬਦ ਜੋੜ ਧਿਆਨ ਨਾਲ ਚੈਕ ਕਰੋ ਉਪਰ ਹੇਠਾਂ ਦਾ ਕੇਸ ਵਰਤਣ ਨਾਲ ਫ਼ਰਕ ਪੈਂਦਾ ਹੈ ਜਾਂ [[Special:UserLogin/signup|ਨਵਾਂ ਖਾਤਾ ਬਣਾਓ]]',
 'nosuchusershort' => '"$1" ਨਾਂ ਨਾਲ ਕੋਈ ਵੀ ਯੂਜ਼ਰ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਸ਼ਬਦ ਧਿਆਨ ਨਾਲ ਚੈੱਕ ਕਰੋ।',
 'nouserspecified' => 'ਤੁਹਾਨੂੰ ਇੱਕ ਯੂਜ਼ਰ-ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ।',
-'login-userblocked' => 'à¨\87ਹ à¨®à©\88à¨\82ਬਰ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। ਲਾਗਇਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
-'wrongpassword' => 'à¨\97ਲਤ à¨ªà¨¾à¨¸à¨µà¨°à¨¡ à¨¦à¨¿à©±à¨¤à¨¾ à¨¹à©\88। à¨®à©\81à©\9c-à¨\9fਰਾà¨\88 ਕਰੋ ਜੀ।',
-'wrongpasswordempty' => 'à¨\96ਾਲà©\80 à¨ªà¨¾à¨¸à¨µà¨°à¨¡ à¨¦à¨¿à©±à¨¤à¨¾ à¨¹à©\88। à¨®à©\81à©\9c-à¨\9fਰਾà¨\88 ਕਰੋ ਜੀ।',
+'login-userblocked' => 'à¨\87ਹ à¨¯à©\82à¨\9c਼ਰ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। ਲਾਗਇਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'wrongpassword' => 'à¨\97ਲਤ à¨ªà¨¾à¨¸à¨µà¨°à¨¡ à¨¦à¨¿à©±à¨¤à¨¾ à¨¹à©\88। à¨®à©\81à©\9c-à¨\95à©\8bਸ਼ਿਸ਼ ਕਰੋ ਜੀ।',
+'wrongpasswordempty' => 'à¨\96ਾਲà©\80 à¨ªà¨¾à¨¸à¨µà¨°à¨¡ à¨¦à¨¿à©±à¨¤à¨¾ à¨¹à©\88। à¨®à©\81à©\9c-à¨\95à©\8bਸ਼ਿਸ਼ ਕਰੋ ਜੀ।',
 'passwordtooshort' => 'ਪਾਸਵਰਡ {{PLURAL:$1|1 ਅੱਖਰ|$1 ਅੱਖਰਾਂ}} ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ।',
 'password-name-match' => 'ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਤੁਹਾਡੇ ਯੂਜ਼ਰ ਨਾਂ ਤੋਂ ਵੱਖਰਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
-'password-login-forbidden' => 'à¨\87ਹ à¨®à©\88à¨\82ਬਰ-ਨਾਮ ਅਤੇ ਪਾਸਵਰਡ ਵਰਤਣ ਦੀ ਮਨਾਹੀ ਹੈ।',
+'password-login-forbidden' => 'à¨\87ਹ à¨¯à©\82à¨\9c਼ਰ-ਨਾà¨\82 ਅਤੇ ਪਾਸਵਰਡ ਵਰਤਣ ਦੀ ਮਨਾਹੀ ਹੈ।',
 'mailmypassword' => 'ਨਵਾਂ ਪਾਸਵਰਡ ਈ-ਮੇਲ ਕਰੋ',
 'passwordremindertitle' => '{{SITENAME}} ਲਈ ਪਾਸਵਰਡ ਯਾਦ ਰੱਖੋ',
 'passwordremindertext' => 'ਕਿਸੇ ਨੇ (ਸ਼ਾਇਦ ਤੁਸੀਂ, IP ਪਤਾ $1 ਤੋਂ) {{SITENAME}} ਲਈ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ ($4)।
@@ -653,13 +671,13 @@ Note that some pages may continue to be displayed as if you were still logged in
 'emailauthenticated' => 'ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ $2 ਨੂੰ $1 ’ਤੇ ਤਸਦੀਕ ਕੀਤਾ ਗਿਆ।',
 'emailnotauthenticated' => 'ਤੁਹਾਡਾ ਈਮੇਲ ਐਡਰੈੱਸ ਹਾਲੇ ਪਰਮਾਣਿਤ ਨਹੀਂ ਹੈ। ਹੇਠ ਦਿੱਤੇ ਫੀਚਰਾਂ ਲਈ ਕੋਈ ਵੀ ਈਮੇਲ ਨਹੀਂ ਭੇਜੀ ਜਾਵੇਗੀ।',
 'noemailprefs' => 'ਇਹਨਾਂ ਸਹੂਲਤਾਂ ਦੀ ਵਰਤੋਂ ਲਈ ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਵਿਚ ਇਕ ਈ-ਮੇਲ ਪਤਾ ਦਿਓ।',
-'emailconfirmlink' => 'à¨\86ਪਣਾ à¨\88-ਮà©\87ਲ à¨ªà¨¤à¨¾ à¨¤à¨¸à¨¦à©\80à¨\95 ਕਰੋ',
+'emailconfirmlink' => 'à¨\86ਪਣà©\87 à¨\88ਮà©\87ਲ à¨\90ਡਰà©\88ਸ à¨¦à©\80 à¨ªà©\81ਸ਼à¨\9fà©\80 ਕਰੋ',
 'invalidemailaddress' => 'ਈ-ਮੇਲ ਪਤਾ ਕਬੂਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਕਿਉਂਕਿ ਇਹ ਸਹੀ ਅੰਦਾਜ਼ ਵਿਚ ਲਿਖਿਆ ਨਹੀਂ ਜਾਪਦਾ ਹੈ।
 ਸਹੀ ਅੰਦਾਜ਼ ਵਿਚ ਦਿਓ ਜਾਂ ਇਹ ਖ਼ਾਨਾ ਖ਼ਾਲੀ ਛੱਡ ਦਿਓ।',
 'cannotchangeemail' => 'ਇਸ ਵਿਕੀ ਤੇ ਈ-ਮੇਲ ਪਤੇ ਬਦਲੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।',
 'emaildisabled' => 'ਇਹ ਸਾਈਟ ਈ-ਮੇਲਾਂ ਨਹੀਂ ਭੇਜ ਸਕਦੀ।',
 'accountcreated' => 'ਖਾਤਾ ਬਣਾਇਆ',
-'accountcreatedtext' => '$1 à¨²à¨\88 à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ ਖਾਤਾ ਬਣਾਇਆ ਗਿਆ।',
+'accountcreatedtext' => '$1 à¨²à¨\88 à¨¯à©\82à¨\9c਼ਰ ਖਾਤਾ ਬਣਾਇਆ ਗਿਆ।',
 'createaccount-title' => '{{SITENAME}} ਲਈ ਅਕਾਊਂਟ ਬਣਾਉਣਾ',
 'createaccount-text' => 'ਕਿਸੇ ਨੇ "$2" ਮੈਂਬਰ-ਨਾਮ ਅਤੇ "$3" ਪਾਸਵਰਡ ਨਾਲ਼ {{SITENAME}} ($4) ਤੇ, ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਵਰਤਦੇ ਹੋਏ, ਖਾਤਾ ਬਣਾਇਆ ਹੈ।
 ਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਆਪਣਾ ਪਾਸਵਰਡ ਬਦਲਣਾ ਚਾਹੀਦਾ ਹੈ।
@@ -668,7 +686,7 @@ Note that some pages may continue to be displayed as if you were still logged in
 'usernamehasherror' => 'ਮੈਂਬਰ-ਨਾਮ ਵਿਚ ਹੈਸ਼ ਅੱਖਰ ਨਹੀਂ ਹੋ ਸਕਦੇ',
 'login-throttled' => 'ਤੁਸੀਂ ਬਹੁਤ ਸਾਰੀਆਂ ਤਾਜ਼ਾ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ਾਂ ਕੀਤੀਆਂ ਹਨ।
 ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਥੋੜੀ ਉਡੀਕ ਕਰੋ।',
-'login-abort-generic' => 'ਤà©\81ਹਾਡà©\80 à¨²à¨¾à¨\97à¨\87ਨ à¨¨à¨¾à¨\95ਾਮ à¨¸à©\80 - à¨°à©±à¨¦',
+'login-abort-generic' => 'ਤà©\81ਹਾਡà©\80 à¨²à¨¾à¨\97à¨\87ਨ à¨¨à¨¾à¨\95ਾਮ à¨¸à©\80 - à¨\85ਧà©\82ਰਾ à¨\9bੱਡਿà¨\86',
 'loginlanguagelabel' => 'ਭਾਸ਼ਾ: $1',
 
 # Email sending
@@ -692,13 +710,13 @@ Note that some pages may continue to be displayed as if you were still logged in
 'resetpass-temp-password' => 'ਆਰਜ਼ੀ ਪਾਸਵਰਡ:',
 
 # Special:PasswordReset
-'passwordreset' => 'ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਕਰੋ',
-'passwordreset-text' => 'ਆਪਣੇ ਖਾਤੇ ਦੀ ਤਫ਼ਸੀਲ ਦੀ ਈ-ਮੇਲ ਹਾਸਲ ਕਰਨ ਲਈ ਇਹ ਫ਼ਾਰਮ ਮੁਕੰਮਲ ਕਰੋ।',
-'passwordreset-legend' => 'ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਕਰੋ',
+'passwordreset' => 'ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ',
+'passwordreset-legend' => 'ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਕਰੋ',
 'passwordreset-disabled' => 'ਇਸ ਵਿਕੀ ਤੇ ਪਾਸਵਰਡ ਰੀਸੈੱਟ ਬੰਦ ਕੀਤੇ ਗਏ ਹਨ।',
-'passwordreset-username' => 'ਮੈਂਬਰ-ਨਾਂ:',
+'passwordreset-emaildisabled' => 'ਇਹ ਵਿਕਿ ਉੱਤੇ ਈਮੇਲ ਫੀਚਰ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ।',
+'passwordreset-username' => 'ਯੂਜ਼ਰ-ਨਾਂ:',
 'passwordreset-domain' => 'ਡੋਮੇਨ:',
-'passwordreset-email' => 'à¨\88-ਮà©\87ਲ à¨ªà¨¤à¨¾:',
+'passwordreset-email' => 'à¨\88-ਮà©\87ਲ à¨¸à¨¿à¨°à¨¨à¨¾à¨µà¨¾à¨\82:',
 'passwordreset-emailtitle' => '{{SITENAME}} ਤੇ ਖਾਤੇ ਦੀ ਜਾਣਕਾਰੀ',
 'passwordreset-emailtext-ip' => 'ਕਿਸੇ ਨੇ (ਸ਼ਾਇਦ ਤੁਸੀਂ, IP ਪਤਾ $1 ਤੋਂ) {{SITENAME}}
 ($4) ਲਈ ਖਾਤਾ ਤਫ਼ਸੀਲ ਯਾਦ-ਦਹਾਨੀ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਹ {{PLURAL:
@@ -708,57 +726,58 @@ $2
 ਇਹ ਆਰਜ਼ੀ ਪਾਸਵਰਡ
 {{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} ਵਿਚ ਖ਼ਤਮ ਹੋ {{PLURAL:$3|ਜਾਵੇਗਾ|ਜਾਣਗੇ}}।
 ਤੁਹਾਨੂੰ ਹੁਣੇ ਲਾਗਇਨ ਕਰਕੇ ਨਵਾਂ ਪਾਸਵਰਡ ਬਣਾਉਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਸੀ ਜਾਂ ਜੇ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਯਾਦ ਹੈ ਅਤੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਦਲਣਾ ਨਹੀਂ ਚਾਹੁੰਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਾਸਵਰਡ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖ ਸਕਦੇ ਹੋ।',
-'passwordreset-emailelement' => 'ਮà©\88à¨\82ਬਰ-ਨਾਂ: $1
+'passwordreset-emailelement' => 'ਯà©\82à¨\9c਼ਰ-ਨਾਂ: $1
 ਆਰਜ਼ੀ ਪਾਸਵਰਡ: $2',
-'passwordreset-emailsent' => 'à¨\87ੱà¨\95 à¨¯à¨¾à¨¦-ਦਹਾਨà©\80 ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।',
+'passwordreset-emailsent' => 'à¨\87ੱà¨\95 à¨ªà¨¾à¨¸à¨µà¨°à¨¡ à¨®à©\81à©\9c-ਸà©\88ੱà¨\9f ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।',
 'passwordreset-emailsent-capture' => 'ਇੱਕ ਯਾਦ-ਦਹਾਨੀ ਈ-ਮੇਲ, ਜਿਹੜੀ ਕਿ ਹੇਠਾਂ ਦਿੱਸ ਰਹੀ ਹੈ, ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।',
 
 # Special:ChangeEmail
-'changeemail' => 'à¨\88-ਮà©\87ਲ à¨ªà¨¤à¨¾ ਬਦਲੋ',
-'changeemail-header' => 'à¨\96ਾਤà©\87 à¨µà¨¾à¨²à¨¼à¨¾ à¨\88-ਮà©\87ਲ à¨ªà¨¤à¨¾ ਬਦਲੋ',
+'changeemail' => 'à¨\88-ਮà©\87ਲ à¨¸à¨¿à¨°à¨¨à¨¾à¨µà¨¾à¨\82 ਬਦਲੋ',
+'changeemail-header' => 'à¨\96ਾਤà©\87 à¨µà¨¾à¨²à¨¾ à¨\88-ਮà©\87ਲ à¨¸à¨¿à¨°à¨¨à¨¾à¨µà¨¾à¨\82 ਬਦਲੋ',
 'changeemail-text' => 'ਆਪਣਾ ਈ-ਮੇਲ ਪਤਾ ਬਦਲਣ ਲਈ ਇਹ ਫ਼ਾਰਮ ਮੁਕੰਮਲ ਕਰੋ। ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਤਸਦੀਕ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖ਼ਲ ਕਰਨਾ ਪਵੇਗਾ।',
 'changeemail-no-info' => 'ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।',
-'changeemail-oldemail' => 'à¨\9aਾਲà©\82 à¨\88-ਮà©\87ਲ à¨ªà¨¤à¨¾:',
-'changeemail-newemail' => 'ਨਵਾà¨\82 à¨\88-ਮà©\87ਲ à¨ªà¨¤à¨¾:',
+'changeemail-oldemail' => 'ਮà©\8cà¨\9cà©\82ਦਾ à¨\88ਮà©\87ਲ à¨¸à¨¿à¨°à¨¨à¨¾à¨µà¨¾à¨\82:',
+'changeemail-newemail' => 'ਨਵਾà¨\82 à¨\88-ਮà©\87ਲ à¨¸à¨¿à¨°à¨¨à¨¾à¨µà¨¾à¨\82:',
 'changeemail-none' => '(ਕੋਈ ਨਹੀਂ)',
+'changeemail-password' => 'ਤੁਹਾਡਾ {{SITENAME}} ਪਾਸਵਰਡ:',
 'changeemail-submit' => 'ਈ-ਮੇਲ ਬਦਲੋ',
 'changeemail-cancel' => 'ਰੱਦ ਕਰੋ',
 
 # Edit page toolbar
-'bold_sample' => 'à¨\97à©\82à©\9cà©\8dਹà©\80 à¨²à¨¿à¨\96ਾà¨\88',
-'bold_tip' => 'à¨\97à©\81à©\9cà©\8dਹà©\80 à¨²à¨¿à¨\96ਾà¨\88',
-'italic_sample' => 'à¨\9fà©\87ਢà©\80 à¨²à¨¿à¨\96ਤ',
-'italic_tip' => 'à¨\9fà©\87ਢà©\80 à¨²à¨¿à¨\96ਾà¨\88',
-'link_sample' => 'à¨\95à©\9cà©\80 à¨¸à¨¿à¨°à¨²à©\87à¨\96',
-'link_tip' => 'à¨\85ੰਦਰà©\82ਨà©\80 à¨\95à©\9cà©\80',
-'extlink_sample' => 'http://www.example.com à¨²à¨¿à©°à¨\95 à¨¸à¨¿à¨°à¨²à©\87à¨\96',
-'extlink_tip' => 'ਬਾਹਰà©\80 à¨\95à©\9cà©\80 (ਅਗੇਤਰ http:// ਯਾਦ ਰੱਖੋ)',
-'headline_sample' => 'ਸਿਰਲੇਖ',
+'bold_sample' => 'à¨\97à©\82à©\9cà©\8dਹà©\87 à¨\85ੱà¨\96ਰ',
+'bold_tip' => 'à¨\97à©\82à©\9cà©\8dਹà©\87 à¨\85ੱà¨\96ਰ',
+'italic_sample' => 'à¨\9fà©\87ਡà©\87 à¨\85ੱà¨\96ਰ',
+'italic_tip' => 'à¨\9fà©\87ਢà©\80 à¨\85ੱà¨\96ਰ',
+'link_sample' => 'ਲਿੰà¨\95 à¨¨à¨¾à¨\82',
+'link_tip' => 'à¨\85ੰਦਰà©\82ਨà©\80 à¨²à¨¿à©°à¨\95',
+'extlink_sample' => 'http://www.example.com à¨²à¨¿à©°à¨\95 à¨¨à¨¾à¨\82',
+'extlink_tip' => 'ਬਾਹਰà©\80 à¨²à¨¿à©°à¨\95 (ਅਗੇਤਰ http:// ਯਾਦ ਰੱਖੋ)',
+'headline_sample' => 'ਸਿਰਲੇਖ ਸ਼ਬਦ',
 'headline_tip' => 'ਦੂਜੇ ਦਰਜੇ ਦਾ ਸਿਰਲੇਖ',
 'nowiki_sample' => 'ਅਸੰਗਠਿਤ ਪਾਠ (NON -FORMATTED) ਇੱਥੇ ਰਖੋ।',
-'nowiki_tip' => 'ਵਿà¨\95à©\80 à¨«à¨¼à©\8cਰਮੈਟਿੰਗ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰੋ',
-'image_tip' => 'à¨\87ੰਬà©\88ੱਡ à¨\9aਿੱਤਰ',
-'media_tip' => 'ਫ਼ਾà¨\88ਲ à¨\95à©\9cà©\80',
+'nowiki_tip' => 'ਵਿà¨\95à©\80 à¨«à¨¾ਰਮੈਟਿੰਗ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰੋ',
+'image_tip' => 'à¨\87ੰਬà©\88ੱਡ à¨«à¨¾à¨\87ਲ',
+'media_tip' => 'ਫਾà¨\87ਲ à¨²à¨¿à©°à¨\95',
 'sig_tip' => 'ਤੁਹਾਡੇ ਦਸਤਖਤ ਸਮੇਂ ਸਮੇਤ',
 'hr_tip' => 'ਲੇਟਵੀਂ ਲਾਈਨ (use sparingly)',
 
 # Edit pages
 'summary' => 'ਸਾਰ:',
 'subject' => 'ਵਿਸ਼ਾ/ਹੈੱਡਲਾਈਨ:',
-'minoredit' => 'à¨\87ਹ à¨\87ੱà¨\95 à¨\9bà©\8bà¨\9fਾ à¨¬à¨¦à¨²à¨¾à¨µ ਹੈ',
-'watchthis' => 'à¨\87ਸ à¨ªà©°à¨¨à©\87 â\80\99ਤà©\87 à¨§à¨¿à¨\86ਨ ਰੱਖੋ',
-'savearticle' => 'ਪੰਨਾ à¨¸à¨¾à¨\82ਭੋ',
+'minoredit' => 'à¨\87ਹ à¨\87ੱà¨\95 à¨\9bà©\8bà¨\9fà©\80 à¨¸à©\8bਧ ਹੈ',
+'watchthis' => 'à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¤à©\87 à¨¨à¨\9c਼ਰ ਰੱਖੋ',
+'savearticle' => 'ਸਫ਼ਾ à¨¸à©°à¨­à¨¾à¨²ੋ',
 'preview' => 'ਝਲਕ',
-'showpreview' => 'à¨\9dਲà¨\95 à¨µà©\87à¨\96à©\8b',
+'showpreview' => 'à¨\9dਲà¨\95 à¨µà©\87à¨\96ਾà¨\93',
 'showlivepreview' => 'ਲਾਈਵ ਝਲਕ',
-'showdiff' => 'ਬਦਲਾਵ à¨µà¨¿à¨\96ਾà¨\93',
-'anoneditwarning' => "'''à¨\9aà©\87ਤਾਵਨà©\80:''' à¨¤à©\81ਸà©\80à¨\82 à¨²à¨¾à¨\97à¨\87ਨ à¨¨à¨¹à©\80à¨\82 à¨\95à©\80ਤਾ à¨¹à©\88। à¨¤à©\81ਹਾਡਾ IP à¨\90ਡਰà©\88ੱਸ à¨\87ਸ à¨ªà©°à¨¨à©\87 à¨¦à©\87 à¨\87ਤਿਹਾਸ ਵਿੱਚ ਰਿਕਾਰਡ ਕੀਤਾ ਜਾਵੇਗਾ।",
+'showdiff' => 'ਬਦਲਾà¨\85 à¨µà©\87à¨\96à©\8b',
+'anoneditwarning' => "'''à¨\9aà©\87ਤਾਵਨà©\80:''' à¨¤à©\81ਸà©\80à¨\82 à¨²à¨¾à¨\97à¨\87ਨ à¨¨à¨¹à©\80à¨\82 à¨\95à©\80ਤਾ à¨¹à©\88। à¨¤à©\81ਹਾਡਾ IP à¨\90ਡਰà©\88ੱਸ à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨¦à©\87 à¨\85ਤà©\80ਤ ਵਿੱਚ ਰਿਕਾਰਡ ਕੀਤਾ ਜਾਵੇਗਾ।",
 'anonpreviewwarning' => "''ਤੁਸੀਂ ਲਾਗਇਨ ਨਹੀਂ ਕੀਤਾ। ਤਬਦੀਲੀ ਸਾਂਭਣ ਨਾਲ਼ ਤੁਹਾਡਾ IP ਪਤਾ ਸਫ਼ੇ ਦੇ ਸੋਧ ਅਤੀਤ ਵਿਚ ਰਿਕਾਰਡ ਹੋ ਜਾਵੇਗਾ।''",
 'missingsummary' => "'''ਯਾਦ-ਦਹਾਨੀ:''' ਤੁਸੀਂ ਸੋਧ ਸਾਰ ਮੁਹੱਈਆ ਨਹੀਂ ਕਰਵਾਇਆ। ਜੇ ਤੁਸੀਂ \"{{int:savearticle}}\" ਤੇ ਦੁਬਾਰਾ ਕਲਿੱਕ ਕੀਤਾ ਤਾਂ ਤੁਹਾਡਾ ਸਫ਼ਾ ਇਸਦੇ ਬਿਨਾਂ ਹੀ ਸਾਂਭਿਆ ਜਾਵੇਗਾ।",
 'missingcommenttext' => 'ਹੇਠਾਂ ਇੱਕ ਟਿੱਪਣੀ ਦਿਓ।',
 'summary-preview' => 'ਸੋਧ ਸਾਰ ਦੀ ਝਲਕ:',
 'subject-preview' => 'ਵਿਸ਼ਾ/ਹੈੱਡਲਾਈਨ ਝਲਕ:',
-'blockedtitle' => 'ਯà©\82à¨\9c਼ਰ à¨¬à¨²à¨¾à¨\95 à¨\95à©\80ਤਾ à¨\97ਿà¨\86',
+'blockedtitle' => 'ਯà©\82à¨\9c਼ਰ à¨\89ੱਤà©\87 à¨ªà¨¾à¨¬à©°à¨¦à©\80 à¨²à¨\97ਾà¨\88',
 'blockedtext' => "'''ਤੁਹਾਡੇ ਮੌਮਬਰ ਨਾਮ ਜਾਂ IP ਪਤੇ ’ਤੇ ਪਾਬੰਦੀ ਲੱਗ ਚੁੱਕੀ ਹੈ।'''
 
 ਪਾਬੰਦੀ $1 ਨੇ ਲਾਈ ਹੈ।
@@ -800,7 +819,7 @@ sysop}}|administrator]] ਨਾਲ ਰਾਬਤਾ ਕਰ ਸਕਦੇ ਹੋ।
 'noarticletext-nopermission' => 'ਫ਼ਿਲਹਾਲ ਇਸ ਪੰਨੇ ’ਤੇ ਕੋਈ ਲਿਖਤ ਨਹੀਂ ਹੈ। ਤੁਸੀਂ ਦੂਸਰੇ ਪੰਨਿਆਂ ’ਤੇ [[Special:Search/{{PAGENAME}}|ਇਸ ਸਿਰਲੇਖ ਦੀ ਖੋਜ]] ਕਰ ਸਕਦੇ ਹੋ, ਸਬੰਧਤ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ਚਿੱਠੇ] ਖੋਜ ਸਕਦੇ ਹੋ ਜਾਂ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਪੰਨੇ ਵਿੱਚ ਲਿਖ] ਸਕਦੇ ਹੋ।</span>',
 'userpage-userdoesnotexist' => 'ਮੈਂਬਰ ਖਾਤਾ "$1" ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।
 ਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਣਾਉਣਾ/ਸੋਧਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਮਿਰਬਾਨੀ ਕਰਕੇ ਜਾਂਚ ਕਰ ਲਓ।',
-'userpage-userdoesnotexist-view' => 'ਮà©\88à¨\82ਬਰ ਖਾਤਾ "$1" ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।',
+'userpage-userdoesnotexist-view' => 'ਯà©\82à¨\9c਼ਰ ਖਾਤਾ "$1" ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।',
 'blocked-notice-logextract' => 'ਇਹ ਮੈਂਬਰ ਇਸ ਵੇਲ਼ੇ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।
 ਹਵਾਲੇ ਲਈ ਪਾਬੰਦੀ ਚਿੱਠੇ ਦਾ ਨਵਾਂ ਦਾਖ਼ਲਾ ਹੇਠ ਦਿੱਤਾ ਗਿਆ ਹੈ:',
 'usercssyoucanpreview' => "'''ਟੋਟਕਾ:''' ਆਪਣੇ ਨਵੇਂ CSS ਸਫ਼ੇ ਨੂੰ ਸਾਂਭਣ ਤੋਂ ਪਹਿਲਾਂ ਪਰਖ ਕਰਨ ਲਈ \"{{int:showpreview}}\" ਬਟਨ ਵਰਤੋ।",
@@ -815,14 +834,14 @@ sysop}}|administrator]] ਨਾਲ ਰਾਬਤਾ ਕਰ ਸਕਦੇ ਹੋ।
 '''ਇਹ ਹਾਲੇ ਸਾਂਭੀ ਨਹੀਂ ਗਈ ਹੈ!'''",
 'updated' => '(ਅੱਪਡੇਟ)',
 'note' => "'''ਨੋਟ:'''",
-'previewnote' => "'''ਯਾਦ ਰੱਖੋ, ਇਹ ਕੇਵਲ ਇੱਕ ਝਲਕ ਹੈ।'''
-ਤà©\81ਹਾਡà©\87 à¨¬à¨¦à¨²à¨¾à¨µ à¨¹à©\81ਣà©\87 à¨¤à©±à¨\95 à¨¸à¨¾à¨\82ਭà©\87 à¨¨à¨¹à©\80à¨\82 à¨\97à¨\8f à¨¹à¨¨!",
-'continue-editing' => 'ਸੰਪਾਦਨ à¨\9cਾਰà©\80 à¨°à©±à¨\96à©\8b',
+'previewnote' => "'''ਯਾਦ ਰੱਖੋ ਇਹ ਸਿਰਫ਼ ਇੱਕ ਝਲਕ ਹੈ।'''
+ਤà©\81ਹਾਡà©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨¹à¨¾à¨²à©\87 à¨¸à¨¾à¨\82ਭà©\80à¨\86à¨\82 à¨¨à¨¹à©\80à¨\82 à¨\97à¨\88à¨\86à¨\82!",
+'continue-editing' => 'ਸà©\8bਧ à¨\96à©\87ਤਰ à¨¤à©\87 à¨\9cਾà¨\93',
 'previewconflict' => 'ਇਹ ਝਲਕ ਲਿਖਤ ਦਾ ਓਹ ਅਕਸ ਪੇਸ਼ ਕਰਦੀ ਹੈ ਜਿਵੇਂ ਓਹ ਤੁਹਾਡੇ ਸਾਂਭੇ ਜਾਣ ਤੋਂ ਬਾਅਦ ਦਿੱਸੇਗਾ।',
-'editing' => '$1 à¨¸à©°à¨ªà¨¾à¨¦à¨¨',
-'creating' => '$1 ਬਣਾ ਰਹੇ ਹੋ',
-'editingsection' => '$1 ਸੰਪਾਦਨ (ਭਾਗ)',
-'editingcomment' => '$1 ਸੋਧ ਰਹੇ ਹੋ (ਨਵਾਂ ਸੈਕਸ਼ਨ)',
+'editing' => '$1 à¨¸à©\8bਧ à¨\9cਾਰà©\80',
+'creating' => '$1 ਬਣਾਇਆ ਜਾ ਰਿਹਾ ਹੈ',
+'editingsection' => '$1 (ਭਾਗ) ਸੋਧ ਜਾਰੀ',
+'editingcomment' => '$1 (ਨਵਾਂ ਭਾਗ) ਸੋਧ ਜਾਰੀ',
 'editconflict' => 'ਅਪਵਾਦ ਟਿੱਪਣੀ: $1',
 'yourtext' => 'ਤੁਹਾਡਾ ਟੈਕਸਟ',
 'storedversion' => 'ਸੰਭਾਲਿਆ ਵਰਜਨ',
@@ -851,7 +870,7 @@ $1 ਲੁਕਵੀਆਂ ਸ਼੍ਰੇਣੀਆਂ}} ਦਾ ਮੈਂਬਰ 
 'nocreate-loggedin' => 'ਤੁਹਾਨੂੰ ਨਵੇਂ ਸਫ਼ੇ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
 'permissionserrors' => 'ਅਧਿਕਾਰ ਗਲਤੀਆਂ',
 'permissionserrorstext' => 'ਤੁਹਾਨੂੰ ਇੰਝ ਕਰਨ ਦੇ ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ। ਹੇਠ ਦਿੱਤੇ {{PLURAL:$1|ਕਾਰਨ|ਕਾਰਨ}} ਨੇ:',
-'permissionserrorstext-withaction' => 'ਤà©\81ਹਾਨà©\82à©°  $2 à¨¦à©\80 à¨\85ਨà©\81ਮਤà©\80 à¨¨à¨¹à©\80à¨\82 à¨¹à¨¨, à¨¨à¨¿à©±à¨\9aà©\87 à¨²à¨¿à¨\96à©\87 {{PLURAL:$1|à¨\95ਾਰਨ|à¨\95ਾਰਨਾà¨\82}} à¨¦à©\80 à¨µà¨\9cà©\8dਹਾ:',
+'permissionserrorstext-withaction' => 'à¨\85ੱà¨\97à©\87 à¨¦à¨¿à©±à¨¤à©\87 {{PLURAL:$1|à¨\95ਾਰਨ|à¨\95ਾਰਨਾà¨\82}} à¨\95ਰà¨\95à©\87 à¨¤à©\81ਹਾਡà©\87 à¨\95à©\8bਲ $2 à¨²à¨\88 à¨¹à©±à¨\95 à¨¨à¨¹à©\80à¨\82 à¨¹à¨¨:',
 'recreate-moveddeleted-warn' => "'''ਚਿਤਾਵਣੀ:
 ਤੁਸੀਂ ਐਸਾ ਪੰਨਾ ਬਣਾ ਰਹੇ ਹੋ ਜੋ ਪਹਿਲਾਂ ਹਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।'''
 
@@ -859,13 +878,19 @@ $1 ਲੁਕਵੀਆਂ ਸ਼੍ਰੇਣੀਆਂ}} ਦਾ ਮੈਂਬਰ 
 ਇਸਨੂੰ ਮਿਟਾਉਣ ਜਾਂ ਸਿਰਲੇਖ ਬਦਲੀ ਦਾ ਚਿੱਠਾ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ।",
 'moveddeleted-notice' => 'ਇਹ ਪੰਨਾ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।
 ਇਸਦੇ ਹਟਾਉਣ ਜਾਂ ਸਿਰਲੇਖ ਬਦਲੀ ਦਾ ਚਿੱਠਾ ਹਵਾਲੇ ਲਈ ਹੇਠ ਦਿੱਤਾ ਗਿਆ ਹੈ।',
-'log-fulllog' => 'ਪà©\82ਰਾ à¨\9aਿੱਠਾ à¨µà©\87à¨\96à©\8b',
-'edit-gone-missing' => 'ਸਫ਼ਾ à¨\85ਪਡੇਟ ਨਹੀਂ ਹੋ ਸਕਿਆ।
-ਲà¨\97ਦਾ à¨¹à©\88 à¨®à¨¿ਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।',
+'log-fulllog' => 'ਪà©\82ਰਾ à¨²à¨¾à¨\97 à¨µà©\87à¨\96ਾà¨\93',
+'edit-gone-missing' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨\85ੱਪਡੇਟ ਨਹੀਂ ਹੋ ਸਕਿਆ।
+à¨\9cਾਪਦਾ à¨¹à©\88 à¨\95ਿ à¨\87ਹ à¨¹ਟਾਇਆ ਜਾ ਚੁੱਕਾ ਹੈ।',
 'edit-no-change' => 'ਤੁਹਾਡੀ ਸੋਧ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ ਕਿਉਂਕਿ ਲਿਖਤ ਵਿਚ ਕੋਈ ਤਬਦੀਲੀ ਨਹੀਂ ਕੀਤੀ ਗਈ।',
 'edit-already-exists' => 'ਨਵਾਂ ਸਫ਼ਾ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਿਆ।
 ਇਹ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।',
 
+# Content models
+'content-model-wikitext' => 'ਵਿਕਿਟੈਕਸਟ',
+'content-model-text' => 'ਆਮ ਟੈਕਸਟ',
+'content-model-javascript' => 'ਜਾਵਾਸਕ੍ਰਿਪਟ',
+'content-model-css' => 'ਸੀਐਸਐਸ',
+
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''ਖਬਰਦਾਰ:''' ਸਾਂਚਾ ਦਾ ਅਕਾਰ ਬਹੁਤ ਵੱਡਾ ਹੈ। ਕੁਝ ਟੈਂਪਲੇਟ ਸ਼ਾਮਲ ਨਹੀਂ ਹੋਣਗੇ।",
 'post-expand-template-inclusion-category' => 'ਓਹ ਪੰਨੇ ਜਿੱਥੇ ਟੈਂਪਲੇਟਾਂ ਦੇ ਸ਼ਾਮਲ ਕਰਨ ਦਾ ਅਕਾਰ ਹੱਦੋਂ ਵਧ ਗਿਆ ਹੈ',
@@ -881,13 +906,13 @@ $1 ਲੁਕਵੀਆਂ ਸ਼੍ਰੇਣੀਆਂ}} ਦਾ ਮੈਂਬਰ 
 'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|ਗੱਲ-ਬਾਤ]]) ਦੀ ਸੋਧ $1 ਨਕਾਰੀ',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'à¨\85à¨\95ਾà¨\8aà¨\82à¨\9f ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
+'cantcreateaccounttitle' => 'à¨\96ਾਤਾ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
 'cantcreateaccount-text' => "[[User:$3|$3]] ਨੇ ਇਸ IP ਪਤੇ ('''$1''') ਤੋਂ ਖਾਤਾ ਬਣਾਉਣ ਤੇ ਪਾਬੰਦੀ ਲਾਈ ਹੈ।
 
 $3 ਨੇ ਕਾਰਨ ਇਹ ਦੱਸਿਆ ਹੈ, ''$2''",
 
 # History pages
-'viewpagelogs' => 'à¨\87ਸ à¨ªà©°à¨¨à©\87 à¨²à¨\88 à¨\9aਿੱਠà©\87 ਵੇਖੋ',
+'viewpagelogs' => 'à¨\87ਹ à¨¸à¨«à¨¼à©\87 à¨²à¨\88 à¨²à¨¾à¨\97 ਵੇਖੋ',
 'nohistory' => 'ਇਸ ਸਫ਼ੇ ਦਾ ਕੋਈ ਸੋਧ ਅਤੀਤ ਨਹੀਂ ਹੈ।',
 'currentrev' => 'ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ',
 'currentrev-asof' => '$1 ਮੁਤਾਬਕ ਸਭ ਤੋਂ ਨਵਾਂ ਰੀਵਿਜਨ',
@@ -898,18 +923,18 @@ $3 ਨੇ ਕਾਰਨ ਇਹ ਦੱਸਿਆ ਹੈ, ''$2''",
 'currentrevisionlink' => 'ਸਭ ਤੋ ਨਵਾਂ ਰੀਵਿਜਨ',
 'cur' => 'ਮੌਜੂਦਾ',
 'next' => 'ਅੱਗੇ',
-'last' => 'ਪਿੱà¨\9bਲਾ',
+'last' => 'ਪਿੱà¨\9bà©\87',
 'page_first' => 'ਪਹਿਲਾਂ',
 'page_last' => 'ਆਖਰੀ',
-'histlegend' => "à¨\85ੰਤਰ ਵੇਖੋ:
-ਮੁਕਾਬਲਾ ਕਰਨ ਲਈ ਰੀਵਿਜਨਾਂ ਦੇ ਰੇਡੀਓ ਬਟਨਾਂ ਵਿੱਚ ਨਿਸ਼ਾਨ ਲਾਓ ਅਤੇ ਜਾਓ ਜਾਂ ਸਭ ਤੋਂ ਥੱਲੇ ਵਾਲੇ ਬਟਨ ਤੇ ਕਲਿੱਕ ਕਰੋ। <br />
+'histlegend' => "ਫ਼ਰà¨\95 ਵੇਖੋ:
+ਮੁਕਾਬਲਾ ਕਰਨ ਲਈ ਰੀਵਿਜਨਾਂ ਦੇ ਰੇਡੀਓ ਬਟਨਾਂ ਵਿੱਚ ਨਿਸ਼ਾਨ ਲਾਓ ਅਤੇ \"ਜਾਓ\" ਜਾਂ ਸਭ ਤੋਂ ਥੱਲੇ ਵਾਲੇ ਬਟਨ ਤੇ ਕਲਿੱਕ ਕਰੋ। <br />
 ਲੈਜਅੰਡ:
-'''({{int:cur}})''' = à¨¨à¨µà©\87à¨\82 à¨°à©\80ਵਿà¨\9cਨ à¨¨à¨¾à¨²à©\8bà¨\82 à¨\85ੰਤਰ, '''({{int:last}})''' = à¨ªà¨¿à©±à¨\9bਲà©\80 à¨°à©\80ਵਿà¨\9cਨ à¨¨à¨¾à¨²à©\8bà¨\82 à¨\85ੰਤਰ, '''({{int:minoreditletter}})''' = à¨\9bà©\8bà¨\9fਾ à¨¬à¨¦à¨²à¨¾à¨µ।",
-'history-fieldset-title' => 'à¨\87ਤਿਹਾਸ à¨¨à©\82à©° à¨¬à©\8dਰਾà¨\8aà¨\9c਼ à¨\95ਰà©\8b',
+'''({{int:cur}})''' = à¨¨à¨µà©\87à¨\82 à¨°à©\80ਵਿà¨\9cਨ à¨¨à¨¾à¨²à©\8bà¨\82 à¨«à¨¼à¨°à¨\95, '''({{int:last}})''' = à¨ªà¨¿à¨\9bਲà©\87 à¨°à©\80ਵਿà¨\9cਨ à¨¨à¨¾à¨²à©\8bà¨\82 à¨«à¨¼à¨°à¨\95, '''({{int:minoreditletter}})''' = à¨\9bà©\8bà¨\9fà©\80 à¨¤à¨¬à¨¦à©\80ਲà©\80।",
+'history-fieldset-title' => 'ਬਰਾà¨\8aà¨\9c਼ਰ à¨\85ਤà©\80ਤ',
 'history-show-deleted' => 'ਕੇਵਲ ਹਟਾਏ ਗਏ',
 'histfirst' => 'ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਦੇ',
 'histlast' => 'ਸਭ ਤੋਂ ਨਵਾਂ',
-'historysize' => '($1 ਬਾਈਟ)',
+'historysize' => '({{PLURAL:$1|1 ਬਾਈਟ|$1 ਬਾਈਟ}})',
 'historyempty' => '(ਖਾਲੀ)',
 
 # Revision feed
@@ -921,9 +946,9 @@ $3 ਨੇ ਕਾਰਨ ਇਹ ਦੱਸਿਆ ਹੈ, ''$2''",
 ਵਿਕੀ ਦੇ ਨਵੇਂ ਮੁਨਾਸਿਬ ਸਫ਼ਿਆਂ ਵਿਚ [[Special:Search|ਲੱਭਣ]] ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।',
 
 # Revision deletion
-'rev-deleted-comment' => '(à¨\9fਿੱਪਣà©\80 à¨¹à¨\9fਾà¨\88)',
+'rev-deleted-comment' => '(ਸà©\8bਧ à¨¸à¨¾à¨° à¨¹à¨\9fਾà¨\87à¨\86)',
 'rev-deleted-user' => '(ਯੂਜ਼ਰ ਨਾਂ ਹਟਾਇਆ)',
-'rev-deleted-event' => '(à¨\90à¨\82à¨\9fਰà©\80 à¨¹à¨\9fਾਈ)',
+'rev-deleted-event' => '(ਲਾà¨\97 à¨\95ਾਰਵਾà¨\88 à¨¹à¨\9fਾà¨\88 à¨\97ਈ)',
 'rev-deleted-user-contribs' => '[ਮੈਂਬਰ-ਨਾਂ ਜਾਂ IP ਪਤਾ ਹਟਾਇਆ - ਸੋਧ ਯੋਗਦਾਨਾਂ ਵਿਚੋਂ ਓਹਲੇ ਕੀਤੀ]',
 'rev-deleted-text-permission' => "ਸਫ਼ੇ ਦੀ ਇਹ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।
 ਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|
@@ -943,23 +968,23 @@ page={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ 
 'rev-suppressed-diff-view' => "ਇਸ ਫ਼ਰਕ ਵਿੱਚੋਂ ਇੱਕ ਰੀਵਿਜ਼ਨ '''ਜ਼ਬਤ''' ਕੀਤੀ ਜਾ ਚੁੱਕੀ ਹੈ।
 ਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|
 page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।",
-'rev-delundel' => 'ਵਿà¨\96ਾà¨\93/à¨\9bà©\81ਪਾà¨\93',
-'rev-showdeleted' => 'ਵਖਾਓ',
-'revisiondelete' => 'ਰà©\80ਵਿà¨\9c਼ਨ à¨®à¨¿à¨\9fਾà¨\93/ਮਿà¨\9fਾà¨\88 à¨°à©±à¨¦ à¨\95ਰà©\8b',
+'rev-delundel' => 'ਵà©\87à¨\96ਾà¨\93/à¨\93ਹਲà©\87',
+'rev-showdeleted' => 'ਵà©\87à¨\96ਾà¨\93',
+'revisiondelete' => 'ਰà©\80ਵਿà¨\9c਼ਨ à¨¹à¨\9fਾà¨\93/ਹà¨\9fਾà¨\87à¨\86-ਵਾਪਸ',
 'revdelete-nooldid-title' => 'ਕੋਈ ਟਾਰਗੇਟ ਰੀਵਿਜ਼ਨ ਨਹੀਂ',
 'revdelete-nologtype-title' => 'ਚਿੱਠੇ ਦੀ ਕਿਸਮ ਨਹੀਂ ਦੱਸੀ ਗਈ',
 'revdelete-nologtype-text' => 'ਇਹ ਕਾਰਵਾਈ ਕਰਨ ਲਈ ਤੁਸੀਂ ਚਿੱਠੇ ਦੀ ਕਿਸਮ ਨਹੀਂ ਦੱਸੀ।',
-'revdelete-no-file' => 'ਦੱਸà©\80 à¨\97à¨\88 à¨«à¨¼à¨¾à¨\88ਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
+'revdelete-no-file' => 'ਦਿੱਤà©\80 à¨\97à¨\88 à¨«à¨¾à¨\87ਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
 'revdelete-show-file-confirm' => 'ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ ਤੁਸੀਂ $2 ਨੂੰ $3 ਦੀ ਫ਼ਾਈਲ "<nowiki>$1</nowiki>" ਦੀ ਮਿਟਾਈ ਗਈ ਰੀਵਿਜ਼ਨ ਵੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?',
 'revdelete-show-file-submit' => 'ਹਾਂ',
 'revdelete-selected' => "'''[[:$1]] {{PLURAL:$2|ਦੀ ਚੁਣੀ ਹੋਈ ਰੀਵਿਜ਼ਨ|ਦੀਆਂ ਚੁਣੀਆਂ ਹੋਈਆਂ ਰੀਵਿਜ਼ਨਾਂ}}:'''",
-'revdelete-legend' => 'ਪਾਬੰਦੀਆਂ ਸੈੱਟ ਕਰੋ:',
+'revdelete-legend' => 'ਵà©\87à¨\96ਣ à¨ªà¨¾à¨¬à©°à¨¦à©\80à¨\86à¨\82 à¨¸à©\88ੱà¨\9f à¨\95ਰà©\8b:',
 'revdelete-hide-text' => 'ਰੀਵਿਜ਼ਨ ਟੈਕਸਟ ਓਹਲੇ',
 'revdelete-hide-image' => 'ਫਾਇਲ ਸਮੱਗਰੀ ਓਹਲੇ',
-'revdelete-hide-name' => 'à¨\90à¨\95ਸ਼ਨ ਅਤੇ ਟਾਰਗੇਟ ਓਹਲੇ',
-'revdelete-hide-comment' => 'ਸà©\8bਧ à¨¸à¨¾à¨° à¨²à©\81à¨\95ਾà¨\93',
+'revdelete-hide-name' => 'à¨\95ਾਰਵਾà¨\88 ਅਤੇ ਟਾਰਗੇਟ ਓਹਲੇ',
+'revdelete-hide-comment' => 'ਸà©\8bਧ à¨¸à¨¾à¨° à¨\93ਹਲà©\87',
 'revdelete-hide-user' => 'ਸੋਧਣ ਵਾਲ਼ੇ ਦਾ ਮੈਂਬਰ-ਨਾਂ/IP ਪਤਾ ਲੁਕਾਓ',
-'revdelete-radio-same' => '(ਨਹà©\80à¨\82 à¨¬à¨¦à¨²à¨£à¨¾)',
+'revdelete-radio-same' => '(ਨਾ à¨¬à¨¦à¨²à©\8b)',
 'revdelete-radio-set' => 'ਹਾਂ',
 'revdelete-radio-unset' => 'ਨਹੀਂ',
 'revdelete-unsuppress' => 'ਮੁੜ ਬਹਾਲ ਕੀਤੀਆਂ ਰੀਵਿਜ਼ਨਾਂ ਤੋਂ ਰੋਕਾਂ ਹਟਾਓ',
@@ -970,7 +995,7 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'revdel-restore' => 'ਦਿੱਖ ਬਦਲੋ',
 'revdel-restore-deleted' => 'ਹਟਾਏ ਗਏ ਰੀਵੀਜਨ',
 'revdel-restore-visible' => 'ਦਿਸਣਯੋਗ ਰੀਵੀਜਨ',
-'pagehist' => 'ਪà©\87à¨\9c à¨¦ਾ ਅਤੀਤ',
+'pagehist' => 'ਸਫ਼ਾ ਅਤੀਤ',
 'deletedhist' => 'ਹਟਾਇਆ ਗਿਆ ਅਤੀਤ',
 'revdelete-hide-current' => 'ਤਾਰੀਖ &2, $1 ਦੀ ਚੀਜ਼ ਲੁਕਾਉਣ ਵਿਚ ਗਲਤੀ: ਇਹ ਮੌਜੂਦਾ ਰੀਵਿਜ਼ਨ ਹੈ।
 ਇਹ ਲੁਕਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ।',
@@ -1000,14 +1025,14 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'mergelogpagetext' => 'ਹੇਠਾਂ ਇੱਕ ਸਫ਼ੇ ਦੇ ਅਤੀਤ ਨੂੰ ਦੂਜੇ ਦੇ ਅਤੀਤ ਵਿਚ ਰਲ਼ਾਉਣ ਦੀ ਸਭ ਤੋਂ ਤਾਜ਼ਾ ਲਿਸਟ ਹੈ।',
 
 # Diffs
-'history-title' => 'ਰੀਵਿਜਨ ਦਾ ਇਤਿਹਾਸ "$1"',
+'history-title' => '"$1" ਦੇ ਰੀਵਿਜਨ ਦਾ ਅਤੀਤ',
 'difference-title' => '"$1" ਦੇ ਰੀਵਿਜ਼ਨਾਂ ਵਿਚ ਫ਼ਰਕ',
 'difference-title-multipage' => 'ਸਫ਼ਿਆਂ "$1" ਅਤੇ "$2" ਵਿਚ ਫ਼ਰਕ',
 'difference-multipage' => '(ਦੋ ਸਫ਼ਿਆਂ ਵਿਚਕਾਰ ਫ਼ਰਕ)',
 'lineno' => 'ਲਾਈਨ $1:',
 'compareselectedversions' => 'ਚੁਣੇ ਵਰਜਨਾਂ ਦੀ ਤੁਲਨਾ',
 'showhideselectedversions' => 'ਚੁਣੇ ਰੀਵਿਜ਼ਨ ਵਖਾਓ/ਲੁਕਾਓ',
-'editundo' => 'à¨\89ਧà©\87à©\9cà©\8b',
+'editundo' => 'ਵਾਪਸ',
 'diff-multi' => '({{PLURAL:$2|ਵਰਤੋਂਕਾਰ ਦੀ|$2 ਵਰਤੋਂਕਾਰਾਂ ਦੀਆਂ}} {{PLURAL:$1|ਵਿਚਕਾਰਲੀ ਰੀਵਿਜਨ ਨਹੀਂ ਦਿਖਾਈ ਜਾ ਰਹੀ|ਵਿਚਕਾਰਲੀਆਂ $1 ਰੀਵਿਜਨਾਂ ਨਹੀਂ ਦਿਖਾਈਆਂ ਜਾ ਰਹੀਆਂ}})',
 
 # Search results
@@ -1018,27 +1043,27 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'searchsubtitleinvalid' => "ਤੁਸੀਂ'''$1''' ਲਈ ਖੋਜ ਕੀਤੀ।",
 'titlematches' => 'ਆਰਟੀਕਲ ਟੈਕਸਟ ਮਿਲਦਾ',
 'notitlematches' => 'ਕੋਈ ਪੇਜ ਟਾਇਟਲ ਨਹੀਂ ਮਿਲਦਾ',
-'textmatches' => 'ਪà©\87à¨\9c ਟੈਕਸਟ ਮਿਲਦਾ',
+'textmatches' => 'ਸਫ਼ਾ ਟੈਕਸਟ ਮਿਲਦਾ',
 'notextmatches' => 'ਕੋਈ ਪੇਜ ਟੈਕਸਟ ਨਹੀਂ ਮਿਲਦਾ',
-'prevn' => 'ਪਿà¨\9bਲੇ {{PLURAL:$1|$1}}',
-'nextn' => 'à¨\85à¨\97ਲੇ {{PLURAL:$1|$1}}',
+'prevn' => 'ਪਿੱà¨\9bੇ {{PLURAL:$1|$1}}',
+'nextn' => 'à¨\85ੱà¨\97ੇ {{PLURAL:$1|$1}}',
 'prevn-title' => 'ਪਿਛਲੇ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
 'nextn-title' => 'ਅਗਲੇ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
 'shown-title' => 'ਪ੍ਰਤੀ ਪੰਨਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}} ਵਖਾਓ',
 'viewprevnext' => 'ਵੇਖੋ ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-legend' => 'à¨\96à©\8bà¨\9c à¨\87à¨\96਼ਤਿà¨\86ਰ',
-'searchmenu-exists' => "'''à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 \"[[:\$1]]\" à¨¨à¨¾à¨® à¨¦à¨¾ à¨ªà©°à¨¨ਾ ਹੈ।'''",
+'searchmenu-legend' => 'à¨\96à©\8bà¨\9c à¨\9aà©\8bਣਾà¨\82',
+'searchmenu-exists' => "'''à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 \"[[:\$1]]\" à¨¨à¨¾à¨® à¨¦à¨¾ à¨¸à¨«ਾ ਹੈ।'''",
 'searchmenu-new' => "'''ਇਸ ਵਿਕੀ ’ਤੇ \"[[:\$1]]\" ਪੰਨਾ ਬਣਾਓ!'''",
 'searchhelp-url' => 'Help:ਸਮੱਗਰੀ',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|ਇਸ ਅਗੇਤਰ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵੇਖੋ]]',
 'searchprofile-articles' => 'ਸਮੱਗਰੀ ਪੰਨੇ',
-'searchprofile-project' => 'ਮਦਦ à¨\85ਤà©\87 à¨ªà¨°à¨¿à¨¯à©\8bà¨\9cਨਾ à¨ªà©°à¨¨ੇ',
+'searchprofile-project' => 'ਮੱਦਦ à¨¤à©\87 à¨ªà¨°à©\8bà¨\9cà©\88à¨\95à¨\9f à¨¸à¨«à¨¼ੇ',
 'searchprofile-images' => 'ਮਲਟੀਮੀਡੀਆ',
 'searchprofile-everything' => 'ਸਭ ਕੁਝ',
-'searchprofile-advanced' => 'à¨\86ਧà©\81ਨਿà¨\95',
-'searchprofile-articles-tooltip' => '$1 ਵਿੱਚ ਖੋਜ',
-'searchprofile-project-tooltip' => '$1 ਵਿੱਚ ਖੋਜ',
-'searchprofile-images-tooltip' => 'ਫ਼ਾà¨\88ਲਾà¨\82 à¨\96à©\8bà¨\9cà©\8b',
+'searchprofile-advanced' => 'ਤà¨\95ਨà©\80à¨\95à©\80',
+'searchprofile-articles-tooltip' => '$1 ਵਿੱਚ ਖੋਜ',
+'searchprofile-project-tooltip' => '$1 ਵਿੱਚ ਖੋਜ',
+'searchprofile-images-tooltip' => 'ਫਾà¨\87ਲ à¨¦à©\80 à¨\96à©\8bà¨\9c',
 'searchprofile-everything-tooltip' => 'ਸਭ ਚੀਜ਼ਾਂ ਖੋਜੋ (ਚਰਚਾ ਪੰਨਿਆਂ ਸਮੇਤ)',
 'searchprofile-advanced-tooltip' => 'ਆਪਣੇ ਬਣਾਏ ਨਾਮ-ਥਾਂਵਾਂ ਵਿੱਚ ਖੋਜੋ',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ਸ਼ਬਦ|$2 ਸ਼ਬਦ}})',
@@ -1061,7 +1086,7 @@ $1|'''1''' ਨਤੀਜਾ|'''$1''' ਤੱਕ ਨਤੀਜੇ}} ਵਖਾਓ।"
 $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'showingresultsheader' => "'''$4''' ਵਾਸਤੇ {{PLURAL:$5|'''$3''' ਵਿੱਚੋਂ '''$1''' ਨਤੀਜੇ|'''$3''' ਵਿੱਚੋਂ '''$1 - $2''' ਨਤੀਜੇ}}",
 'search-nonefound' => 'ਤੁਹਾਡੀ ਖੋਜ ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ।',
-'powersearch' => 'ਖੋਜ',
+'powersearch' => 'ਤà¨\95ਨà©\80à¨\95à©\80 à¨\96à©\8bà¨\9c',
 'powersearch-legend' => 'ਤਕਨੀਕੀ ਖੋਜ',
 'powersearch-ns' => 'ਨੇਮ-ਸਪੇਸ ਵਿੱਚ ਖੋਜ:',
 'powersearch-redir' => 'ਰੀ-ਡਿਰੈਕਟ ਲਿਸਟ',
@@ -1071,17 +1096,9 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'powersearch-togglenone' => 'ਕੋਈ ਨਹੀਂ',
 'search-external' => 'ਬਾਹਰੀ ਖੋਜ',
 
-# Quickbar
-'qbsettings' => 'ਤੁਰੰਤ ਬਾਰ',
-'qbsettings-none' => 'ਕੋਈ ਨਹੀਂ',
-'qbsettings-fixedleft' => 'ਕਾਬ੍ਬ੍ਹੇ ਨੂ ਸਥਾਪਿਤ',
-'qbsettings-fixedright' => 'ਸੱਜੇ ਨੂ ਸਥਾਪਿਤ',
-'qbsettings-floatingleft' => 'ਕਾਬ੍ਬ੍ਹੇ ਨੂ ਰੁਲਦੀ',
-'qbsettings-floatingright' => 'ਸੱਜੇ ਨੂ ਰੁਲਦੀ',
-
 # Preferences page
 'preferences' => 'ਮੇਰੀ ਪਸੰਦ',
-'mypreferences' => 'ਪਸੰਦਾਂ',
+'mypreferences' => 'ਪਸੰਦ',
 'prefs-edits' => 'ਸੋਧਾਂ ਦੀ ਗਿਣਤੀ:',
 'prefsnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
 'prefsnologintext' => 'ਵਰਤੋਂਕਾਰ ਪਸੰਦਾਂ ਸੈੱਟ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ਲਾਗਇਨ]</span> ਕਰਨਾ ਪਵੇਗਾ।',
@@ -1089,11 +1106,13 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'prefs-skin' => 'ਸਕਿਨ',
 'skin-preview' => 'ਝਲਕ',
 'datedefault' => 'ਕੋਈ ਪਸੰਦ ਨਹੀਂ',
+'prefs-beta' => 'ਬੀਟਾ ਫੀਚਰ',
 'prefs-datetime' => 'ਮਿਤੀ ਅਤੇ ਸਮਾਂ',
-'prefs-user-pages' => 'ਮੈਂਬਰ ਸਫ਼ੇ',
+'prefs-labs' => 'ਲੈਬ ਫੀਚਰ',
+'prefs-user-pages' => 'ਯੂਜ਼ਰ ਸਫ਼ੇ',
 'prefs-personal' => 'ਯੂਜ਼ਰ ਪਰੋਫਾਇਲ',
 'prefs-rc' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ',
-'prefs-watchlist' => 'ਵਾà¨\9a-ਲਿਸà¨\9f',
+'prefs-watchlist' => 'ਨਿà¨\97ਰਾਨ-ਸà©\82à¨\9aà©\80',
 'prefs-watchlist-days' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਦਿਨ:',
 'prefs-watchlist-days-max' => 'ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}',
 'prefs-watchlist-edits' => 'ਵਧਾਈ ਹੋਈ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਵੱਧ ਤੋਂ ਵੱਧ ਤਬਦੀਲੀਆਂ:',
@@ -1107,12 +1126,14 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'prefs-rendering' => 'ਦਿੱਖ',
 'saveprefs' => 'ਸੰਭਾਲੋ',
 'resetprefs' => 'ਰੀ-ਸੈੱਟ',
-'prefs-editing' => 'ਸੰਪਾਦਨ',
+'restoreprefs' => 'ਸਭ ਮੂਲ ਸੈਟਿੰਗ ਮੁੜ-ਸਟੋਰ ਕਰੋ',
+'prefs-editing' => 'ਸੋਧ ਜਾਰੀ',
 'prefs-edit-boxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
 'rows' => 'ਕਤਾਰਾਂ:',
 'columns' => 'ਕਾਲਮ:',
 'searchresultshead' => 'ਖੋਜ',
 'resultsperpage' => 'ਪ੍ਰਤੀ ਪੇਜ ਹਿੱਟ:',
+'stub-threshold-disabled' => 'ਬੰਦ ਹੈ',
 'recentchangesdays' => 'ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਵਿਚ ਦਿਖਾਉਣ ਲਈ ਦਿਨ:',
 'recentchangesdays-max' => 'ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨ}}',
 'prefs-help-recentchangescount' => 'ਇਸ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ, ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤ ਅਤੇ ਚਿੱਠੇ ਸ਼ਾਮਲ ਹਨ।',
@@ -1128,26 +1149,27 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'timezoneregion-arctic' => 'ਆਰਕਟਿਕ',
 'timezoneregion-asia' => 'ਏਸ਼ੀਆ',
 'timezoneregion-atlantic' => 'ਅੰਧ ਮਹਾਂਸਾਗਰ',
-'timezoneregion-australia' => 'à¨\86ਸà¨\9fà©\8dਰà©\87ਲà©\80à¨\86',
+'timezoneregion-australia' => 'ਆਸਟਰੇਲੀਆ',
 'timezoneregion-europe' => 'ਯੂਰਪ',
 'timezoneregion-indian' => 'ਹਿੰਦ ਮਹਾਂਸਾਗਰ',
 'timezoneregion-pacific' => 'ਪ੍ਰਸ਼ਾਂਤ ਮਹਾਂਸਾਗਰ',
 'allowemail' => 'ਹੋਰ ਯੂਜ਼ਰਾਂ ਤੋਂ ਈਮੇਲ ਯੋਗ ਕਰੋ',
-'prefs-searchoptions' => 'ਖੋਜ ਦੇ ਇਖ਼ਤਿਆਰ',
+'prefs-searchoptions' => 'ਖੋਜ',
 'prefs-namespaces' => 'ਥਾਂ-ਨਾਮ',
 'defaultns' => 'ਨਹੀਂ ਤਾਂ ਇਹਨਾਂ ਥਾਂ-ਨਾਂਵਾਂ ਵਿਚ ਖੋਜੋ:',
-'default' => 'ਡਿਫਾਲà¨\9f',
+'default' => 'ਮà©\82ਲ',
 'prefs-files' => 'ਫਾਇਲਾਂ',
-'prefs-emailconfirm-label' => 'à¨\88-ਮà©\87ਲ à¨¤à¨¸à¨¦à©\80à¨\95:',
+'prefs-emailconfirm-label' => 'à¨\88-ਮà©\87ਲ à¨ªà©\81ਸ਼à¨\9fà©\80:',
 'prefs-textboxsize' => 'ਸੋਧ ਖਿੜਕੀ ਦਾ ਅਕਾਰ',
 'youremail' => 'ਈ-ਮੇਲ:',
-'username' => 'ਵਰਤੋਂਕਾਰਨਾਮ:',
-'uid' => 'ਵਰਤੋਂਕਾਰ ID:',
+'username' => '{{GENDER:$1|ਯੂਜ਼ਰਨਾਂ}}:',
+'uid' => '{{GENDER:$1|User}} ਆਈਡੀ:',
 'prefs-memberingroups' => '{{PLURAL:$1|ਗਰੁੱਪ|ਗਰੁੱਪਾਂ}} ਦਾ ਮੈਂਬਰ:',
-'prefs-registration' => 'ਰà¨\9cਿਸà¨\9fà©\8dਰà©\87ਸ਼ਨ à¨¦à¨¾ à¨µà¨\95ਤ:',
+'prefs-registration' => 'ਰà¨\9cਿਸà¨\9fਰà©\87ਸ਼ਨ à¨¸à¨®à¨¾à¨\82:',
 'yourrealname' => 'ਅਸਲੀ ਨਾਮ:',
 'yourlanguage' => 'ਭਾਸ਼ਾ:',
-'yournick' => 'ਛੋਟਾ ਨਾਂ:',
+'yourvariant' => 'ਸਮੱਗਰੀ ਭਾਸ਼ਾ ਰੂਪ:',
+'yournick' => 'ਨਵੇਂ ਦਸਤਖ਼ਤ:',
 'prefs-help-signature' => 'ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ ਉੱਤੇ ਟਿੱਪਣੀਆਂ ਦੇ ਆਖ਼ਰ ਵਿਚ "<nowiki>~~~~</nowiki>" ਲਾਓ ਜੋ ਤੁਹਾਡੇ ਦਸਤਖ਼ਤ ਅਤੇ ਵਕਤ ਦੀ ਮੋਹਰ ਵਿਚ ਤਬਦੀਲ ਹੋ ਜਾਵੇਗਾ।',
 'badsiglength' => 'ਦਸਤਖ਼ਤ ਬਹੁਤ ਲੰਬਾ ਹੋ ਗਿਆ ਹੈ। ਇਹ {{PLURAL:$1|ਅੱਖਰ|ਅੱਖਰਾਂ}} ਤੋਂ ਲੰਬਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ।',
 'yourgender' => 'ਲਿੰਗ:',
@@ -1161,13 +1183,17 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 ਜਦੋਂ ਹੋਰ ਵਰਤੋਂਕਾਰ ਤੁਹਾਨੂੰ ਈ-ਮੇਲ ਭੇਜਦੇ ਹਨ ਤਾਂ ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਜ਼ਾਹਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ।',
 'prefs-help-email-required' => 'ਈ-ਮੇਲ ਪਤਾ ਚਾਹੀਦਾ ਹੈ।',
 'prefs-info' => 'ਮੁੱਢਲੀ ਜਾਣਕਾਰੀ',
+'prefs-i18n' => 'ਅੰਤਰਰਾਸ਼ਟਰੀਕਰਨ',
 'prefs-signature' => 'ਦਸਤਖ਼ਤ',
-'prefs-dateformat' => 'ਤਾਰà©\80à¨\96਼ ਅੰਦਾਜ਼',
+'prefs-dateformat' => 'ਮਿਤà©\80 à¨¦à¨¾ ਅੰਦਾਜ਼',
 'prefs-advancedediting' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedrc' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedrendering' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedsearchoptions' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
 'prefs-advancedwatchlist' => 'ਤਕਨੀਕੀ ਚੋਣਾਂ',
+'prefs-displayrc' => 'ਵੇਖਾਉਣ ਚੋਣਾਂ',
+'prefs-displaysearchoptions' => 'ਵੇਖਾਉਣ ਚੋਣਾਂ',
+'prefs-displaywatchlist' => 'ਵੇਖਾਉਣ ਚੋਣਾਂ',
 'prefs-diffs' => 'ਫ਼ਰਕ',
 
 # User preference: email validation using jQuery
@@ -1175,11 +1201,11 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'email-address-validity-invalid' => 'ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦਾਖ਼ਲ ਕਰੋ',
 
 # User rights
-'userrights' => 'ਮà©\88à¨\82ਬਰ à¨¦à©\87 à¨¹à©±à¨\95ਾਂ ਦਾ ਰੱਖ-ਰਖਾਓ',
+'userrights' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ à¨¦à©\87 à¨\85ਧਿà¨\95ਾਰਾਂ ਦਾ ਰੱਖ-ਰਖਾਓ',
 'userrights-lookup-user' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਦੇਖਭਾਲ',
 'userrights-user-editname' => 'ਇੱਕ ਯੂਜ਼ਰ ਨਾਂ ਦਿਓ:',
 'editusergroup' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੋਧ',
-'editinguser' => '<b>$1</b> ਵਰਤੋਂਕਾਰ ਸੋਧਿਆ ਜਾ ਰਿਹਾ ਹੈ ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])',
+'editinguser' => "'''[[User:$1|$1]]''' $2 ਯੂਜ਼ਰ ਦੇ ਯੂਜ਼ਰ ਹੱਕ ਬਦਲੇ ਜਾ ਰਹੇ ਹਨ",
 'userrights-editusergroup' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੋਧ',
 'saveusergroups' => 'ਯੂਜ਼ਰ ਗਰੁੱਪ ਸੰਭਾਲੋ',
 'userrights-groupsmember' => 'ਇਸ ਦਾ ਮੈਂਬਰ:',
@@ -1190,15 +1216,16 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 
 # Groups
 'group' => 'ਗਰੁੱਪ:',
-'group-user' => 'ਮà©\88à¨\82ਬਰ',
+'group-user' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ',
 'group-autoconfirmed' => 'ਖ਼ੁਦ-ਤਸਦੀਕਸ਼ੁਦਾ ਮੈਂਬਰ',
 'group-bot' => 'ਬੋਟ',
+'group-sysop' => 'ਪਰਸ਼ਾਸ਼ਕ',
 'group-all' => '(ਸਭ)',
 
-'group-user-member' => '{{GENDER:$1|ਮà©\88à¨\82ਬਰ}}',
+'group-user-member' => '{{GENDER:$1|ਵਰਤà©\8bà¨\82à¨\95ਾਰ}}',
 'group-bot-member' => 'ਬੋਟ',
 
-'grouppage-user' => '{{ns:project}}:ਮà©\88à¨\82ਬਰ',
+'grouppage-user' => '{{ns:project}}:ਵਰਤà©\8bà¨\82à¨\95ਾਰ',
 
 # Rights
 'right-read' => 'ਸਫ਼ੇ ਪੜ੍ਹਨਾ',
@@ -1208,12 +1235,13 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'right-createaccount' => 'ਨਵੇਂ ਖਾਤੇ ਬਣਾਉਣਾ',
 'right-minoredit' => 'ਸੋਧਾਂ ਦੇ ਛੋਟਾ ਹੋਣ ਲਈ ਨਿਸ਼ਾਨ ਲਾਉਣਾ',
 'right-move' => 'ਸਫ਼ੇ ਭੇਜਣਾ',
-'right-movefile' => 'ਫ਼ਾਈਲਾਂ ਦੇ ਨਾਂ ਬਦਲਣਾ',
-'right-upload' => 'ਫ਼ਾਈਲਾਂ ਅੱਪਲੋਡ ਕਰਨਾ',
+'right-movefile' => 'ਫਾਇਲਾਂ ਭੇਜਣੀਆਂ',
+'right-upload' => 'ਫਾਇਲਾਂ ਅੱਪਲੋਡ',
+'right-upload_by_url' => 'URL ਤੋਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ',
 'right-autoconfirmed' => 'ਨੀਮ-ਸੁਰੱਖਿਅਤ ਸਫ਼ਿਆਂ ਨੂੰ ਸੋਧਣਾ',
 'right-delete' => 'ਸਫ਼ੇ ਹਟਾਓ',
-'right-bigdelete' => 'ਵੱਡੇ ਅਤੀਤਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਮਿਟਾਉਣੇ',
-'right-browsearchive' => 'ਮਿà¨\9fਾà¨\8f à¨\97à¨\8f à¨¸à¨«à¨¼à©\87 à¨\96à©\8bà¨\9cਣਾ',
+'right-bigdelete' => 'ਵੱਡੇ ਅਤੀਤ ਵਾਲੇ ਪੰਨੇ ਮਿਟਾਉਣੇ',
+'right-browsearchive' => 'ਮਿà¨\9fਾà¨\8f à¨¹à©\8bà¨\8f à¨¸à¨«à¨¼à©\87 à¨\96à©\8bà¨\9cà©\8b',
 'right-undelete' => 'ਸਫ਼ੇ ਨੂੰ ਅਣ-ਮਿਟਾਇਆ ਕਰਨਾ',
 'right-suppressionlog' => 'ਪ੍ਰਾਈਵੇਟ ਚਿੱਠੇ ਵੇਖਣਾ',
 'right-block' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਦੇ ਸੋਧ ਕਰਨ ਤੇ ਪਾਬੰਦੀ ਲਾਉਣੀ',
@@ -1225,6 +1253,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'right-userrights-interwiki' => 'ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਸੋਧ ਕਰਨਾ',
 'right-siteadmin' => 'ਡੈਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਉਣਾ ਤੇ ਖੋਲ੍ਹਣਾ',
 'right-sendemail' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣਾ',
+'right-passwordreset' => 'ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈਮੇਲ ਵੇਖੋ',
 
 # Special:Log/newusers
 'newuserlogpage' => 'ਬਣਾਏ ਖਾਤਿਆਂ ਦਾ ਚਿੱਠਾ',
@@ -1235,61 +1264,76 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'rightslogtext' => 'ਇਹ ਮੈਂਬਰ ਹੱਕਾਂ ਵਿਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਦਾ ਚਿੱਠਾ ਹੈ।',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨ªà©\9cà©\8dਹਨ',
+'action-read' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨ªà©\9cà©\8dਹà©\8b',
 'action-edit' => 'ਇਹ ਪੰਨੇ ਨੂੰ ਸੰਪਾਦਿਤ ਕਰਨ',
-'action-createpage' => 'ਸਫ਼à©\87 à¨¬à¨£à¨¾à¨\89ਣ',
+'action-createpage' => 'ਸਫ਼à©\87 à¨¬à¨£à¨¾à¨\93',
 'action-createtalk' => 'ਚਰਚਾ ਸਫ਼ੇ ਬਣਾਉਣ',
-'action-createaccount' => 'ਮੈਂਬਰ ਖਾਤਾ ਬਣਾਉਣ',
-'action-upload' => 'ਇਹ ਫ਼ਾਈਲ ਅੱਪਲੋਡ ਕਰਨ',
-'action-delete' => 'ਇਹ ਸਫ਼ਾ ਮਿਟਾਉਣ',
-'action-deleterevision' => 'ਇਹ ਰੀਵਿਜ਼ਨ ਮਿਟਾਉਣ',
+'action-createaccount' => 'ਇਹ ਵਰਤੋਂਕਾਰ ਖਾਤਾ ਬਣਾਓ',
+'action-minoredit' => 'ਇਹ ਸੋਧ ਨੂੰ ਛੋਟੀ ਤੌਰ ਉੱਤੇ ਮੰਨੋ',
+'action-move' => 'ਇਹ ਸਫ਼ਾ ਭੇਜੋ',
+'action-move-subpages' => 'ਇਹ ਸਫ਼ਾ ਤੇ ਇਸ ਦੇ ਅਧੀਨ-ਸਫ਼ਿਆਂ ਨੂੰ ਭੇਜੋ',
+'action-movefile' => 'ਇਹ ਫਾਇਲ ਭੇਜੋ',
+'action-upload' => 'ਇਹ ਫਾਇਲ ਅੱਪਲੋਡ',
+'action-reupload' => 'ਇਹ ਮੌਜੂਦਾ ਫਾਇਲ ਉੱਤੇ ਲਿਖੋ',
+'action-reupload-shared' => 'ਇਹ ਫਾਇਲ ਨੂੰ ਸਾਂਝੀ ਕੀਤੀ ਰਿਪੋਜ਼ਟਰੀ ਉੱਤੇ ਲਿਖੋ',
+'action-upload_by_url' => 'ਇਹ ਫਾਇਲ ਨੂੰ URL ਤੋਂ ਅੱਪਲੋਡ ਕਰੋ',
+'action-writeapi' => 'ਲਿਖਣ API ਵਰਤੋਂ',
+'action-delete' => 'ਇਹ ਪੰਨਾ ਮਿਟਾਓ',
+'action-deleterevision' => 'ਇਹ ਰੀਵਿਜਨ ਮਿਟਾਓ',
 'action-deletedhistory' => 'ਇਸ ਸਫ਼ੇ ਦਾ ਮਿਟਾਇਆ ਅਤੀਤ ਵੇਖਣ',
 'action-browsearchive' => 'ਮਿਟਾਏ ਸਫ਼ੇ ਖੋਜਣ',
 'action-undelete' => 'ਇਹ ਸਫ਼ਾ ਅਣ-ਮਿਟਿਆ ਕਰਨ',
+'action-suppressrevision' => 'ਇਹ ਲੁਕਵਾਂ ਰੀਵਿਜ਼ਨ ਜਾਂਚੋ ਅਤੇ ਮੁੜ-ਸਟੋਰ ਕਰੋ',
+'action-suppressionlog' => 'ਇਹ ਪ੍ਰਾਈਵੇਟ ਲਾਗ ਵੇਖੋ',
 'action-block' => 'ਇਸ ਮੈਂਬਰ ਦੇ ਸੋਧ ਕਰਨ ਤੇ ਪਾਬੰਦੀ ਲਾਉਣ',
 'action-protect' => 'ਇਸ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲਣ',
+'action-import' => 'ਹੋਰ ਵਿਕਿ ਤੋਂ ਇਹ ਸਫ਼ਾ ਇੰਪੋਰਟ ਕਰੋ',
+'action-importupload' => 'ਫਾਇਲ ਅੱਪਲੋਡ ਤੋਂ ਇਹ ਸਫ਼ਾ ਇੰਪੋਰਟ ਕਰੋ',
 'action-unwatchedpages' => 'ਨਜ਼ਰ ਨਾ ਰੱਖੇ ਜਾ ਰਹੇ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਵੇਖਣ',
 'action-mergehistory' => 'ਇਸ ਸਫ਼ੇ ਦੇ ਅਤੀਤ ਨੂੰ ਰਲ਼ਾਉਣ',
 'action-userrights' => 'ਸਾਰੇ ਮੈਂਬਰ ਹੱਕ ਸੋਧਣ',
 'action-userrights-interwiki' => 'ਦੂਜੇ ਵਿਕੀਆਂ ਤੇ ਮੈਂਬਰਾਂ ਦੇ ਮੈਂਬਰ ਹੱਕ ਸੋਧਣ',
 'action-siteadmin' => 'ਡੈਟਾਬੇਸ ਨੂੰ ਤਾਲਾ ਲਾਉਣ ਜਾਂ ਖੋਲ੍ਹਣ',
-'action-sendemail' => 'à¨\88-ਮà©\87ਲਾà¨\82 à¨­à©\87à¨\9cਣ',
+'action-sendemail' => 'à¨\88-ਮà©\87ਲਾà¨\82 à¨­à©\87à¨\9cà©\8b',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|ਬਦਲਾਵ}}',
-'recentchanges' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ',
-'recentchanges-legend' => 'ਹਾਲ à¨¦à©\87 à¨ªà¨°à¨¿à¨µà¨°à¨¤à¨¨ à¨¸à¨¬à©°à¨§à©\80 à¨µà¨¿à¨\95ਲਪ',
+'nchanges' => '$1 {{PLURAL:$1|ਤਬਦà©\80ਲà©\80|ਤਬਦà©\80ਲà©\80à¨\86à¨\82}}',
+'recentchanges' => 'ਹਾਲ â\80\99à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82',
+'recentchanges-legend' => 'ਹਾਲ à¨¦à©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨¸à¨¬à©°à¨§à©\80 à¨\9aà©\8bਣਾà¨\82',
 'recentchanges-summary' => 'ਇਸ ਵਿਕੀ ’ਤੇ ਹੋਈਆਂ ਸਭ ਤੋਂ ਨਵੀਆਂ ਤਬਦੀਲੀਆਂ ਇਸ ਸਫ਼ੇ ’ਤੇ ਵੇਖੋ।',
-'recentchanges-feed-description' => 'à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 à¨¹à¨¾à¨² â\80\98à¨\9a à¨¹à©\8bà¨\8f à¨¬à¨¦à¨²à¨¾à¨µ ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।',
-'recentchanges-label-newpage' => 'à¨\87ਹ à¨¸à©°à¨ªà¨¾à¨¦à¨¨ ਨੇ ਨਵਾਂ ਪੰਨਾ ਬਣਾਇਆ ਹੈ',
-'recentchanges-label-minor' => 'à¨\87ਹ à¨\87ੱà¨\95 à¨\9bà©\8bà¨\9fਾ à¨¸à©°à¨ªà¨¾à¨¦à¨¨ ਹੈ',
-'recentchanges-label-bot' => 'à¨\87ਹ à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨¬à©\8bà¨\9f à¨µà¨²à©\8bà¨\82 à¨\95à©\80ਤà©\80 à¨\97à¨\88 à¨¹à©\88',
+'recentchanges-feed-description' => 'à¨\87ਸ à¨µà¨¿à¨\95à©\80 â\80\99ਤà©\87 à¨¹à¨¾à¨² â\80\98à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।',
+'recentchanges-label-newpage' => 'à¨\87ਸ à¨¸à©\8bਧ ਨੇ ਨਵਾਂ ਪੰਨਾ ਬਣਾਇਆ ਹੈ',
+'recentchanges-label-minor' => 'à¨\87ਹ à¨\87ੱà¨\95 à¨\9bà©\8bà¨\9fà©\80 à¨¸à©\8bਧ ਹੈ',
+'recentchanges-label-bot' => 'à¨\87ਹ à¨¸à©\8bਧ à¨\87ੱà¨\95 à¨¬à©\8bà¨\9f à¨¦à©\81à¨\86ਰਾ à¨\95à©\80ਤà©\80 à¨\97à¨\88 à¨¸à©\80',
 'recentchanges-label-unpatrolled' => 'ਇਹ ਫੇਰ-ਬਦਲ ਹਾਲੇ ਵੇਖਿਆ ਨਹੀਂ ਗਿਆ',
 'rcnote' => "$4, $5 ਤੱਕ ਆਖਰੀ {{PLURAL:$2|ਦਿਨ|'''$2''' ਦਿਨਾਂ}} ਵਿੱਚ {{PLURAL:$1|'''1''' ਬਦਲੀ ਹੋਈ ਹੈ।|'''$1''' ਬਦਲੀਆਂ ਹੋਈਆਂ ਹਨ।}}",
 'rcnotefrom' => "'''$2''' ਤੱਕ ('''$1''' ਤੱਕ ਦਿੱਸਦੇ) ਬਦਲਾਵ ਹੇਠ ਦਿੱਤੀਆਂ ਹਨ।",
-'rclistfrom' => '$1 à¨¤à©\8bà¨\82 à¨¸à¨¼à©\81ਰà©\82 à¨\95ਰà¨\95à©\87 à¨¨à¨µà©\87à¨\82 à¨¬à¨¦à¨²à¨¾à¨µ à¨µà©\87ਖਾਓ',
-'rcshowhideminor' => '$1 ਛੋਟੇ ਬਦਲਾਵ',
+'rclistfrom' => '$1 à¨¤à©\8bà¨\82 à¨¸à¨¼à©\81ਰà©\82 à¨\95ਰà¨\95à©\87 à¨¨à¨µà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨µਖਾਓ',
+'rcshowhideminor' => 'ਛੋਟੀਆਂ ਤਬਦੀਲੀਆਂ $1',
 'rcshowhidebots' => '$1 ਬੋਟ',
-'rcshowhideliu' => '$1 ਲਾਗਇਨ ਹੋਏ ਵਰਤੋਂਕਾਰਾਂ',
-'rcshowhideanons' => '$1 ਗੁਮਨਾਮ ਵਰਤੋਂਕਾਰ',
-'rcshowhidepatr' => 'à¨\9cਾà¨\82à¨\9aà©\87 à¨¹à©\8bà¨\8f à¨¸à©°à¨ªà¨¾à¨¦à¨¨ $1',
-'rcshowhidemine' => 'ਮà©\87ਰà©\87 à¨¬à¨¦à¨²à¨¾à¨µ $1',
-'rclinks' => 'ਪਿà¨\9bਲà©\87 $2 à¨¦à¨¿à¨¨à¨¾à¨\82 à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\8f $1 à¨¬à¨¦à¨²à¨¾à¨µ à¨µà©\87ਖਾਓ<br /> $3',
-'diff' => 'à¨\85ੰਤਰ',
-'hist' => 'à¨\87ਤਿਹਾਸ',
-'hide' => 'à¨\9bà©\81ਪਾਓ',
-'show' => 'ਵਿਖਾਓ',
+'rcshowhideliu' => '$1 ਲਾਗਇਨ ਹੋਏ ਵਰਤੋਂਕਾਰ',
+'rcshowhideanons' => 'ਅਣਜਾਣ ਵਰਤੋਂਕਾਰ $1',
+'rcshowhidepatr' => 'à¨\9cਾà¨\82à¨\9aà©\80à¨\86à¨\82 à¨¹à©\8bà¨\88à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 $1',
+'rcshowhidemine' => 'ਮà©\87ਰà©\80à¨\86à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82  $1',
+'rclinks' => 'ਪਿà¨\9bਲà©\87 $2 à¨¦à¨¿à¨¨à¨¾à¨\82 à¨µà¨¿à©±à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 $1 à¨¤à¨¬à¨¦à©\80ਲà©\80à¨\86à¨\82 à¨µਖਾਓ<br /> $3',
+'diff' => 'ਫ਼ਰà¨\95',
+'hist' => 'à¨\85ਤà©\80ਤ',
+'hide' => 'ਲà©\81à¨\95ਾਓ',
+'show' => 'ਵà©\87ਖਾਓ',
 'minoreditletter' => 'ਛੋ',
 'newpageletter' => 'ਨ',
 'boteditletter' => 'ਬੋ',
+'number_of_watching_users_pageview' => '[$1 ਵੇਖ ਰਹੇ ਹਨ {{PLURAL:$1|ਯੂਜ਼ਰ}}]',
 'rc_categories_any' => 'ਕੋਈ ਵੀ',
+'newsectionsummary' => '/* $1 */ ਨਵਾਂ ਭਾਗ',
 'rc-enhanced-expand' => 'ਵੇਰਵਾ ਵੇਖਾਓ (ਜਾਵਾਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ)',
-'rc-enhanced-hide' => 'ਵੇਰਵਾ ਛੁਪਾਓ',
+'rc-enhanced-hide' => 'ਵੇਰਵਾ ਲੁਕਾਓ',
+'rc-old-title' => 'ਅਸਲ ਵਿੱਚ "$1" ਵਜੋਂ ਬਣਾਇਆ',
 
 # Recent changes linked
-'recentchangeslinked' => 'ਸਬੰਧਤ à¨¬à¨¦à¨²à¨¾à¨µ',
+'recentchangeslinked' => 'ਸਬੰਧਤ à¨¬à¨¦à¨²à¨¾à¨\85',
 'recentchangeslinked-feed' => 'ਸਬੰਧਤ ਤਬਦੀਲੀਆਂ',
-'recentchangeslinked-toolbox' => 'ਪੰਨà©\87 à¨¨à¨¾à¨² à¨¸à©°à¨¬à©°à¨§à¨¿à¨¤ à¨¬à¨¦à¨²à¨¾à¨µ',
+'recentchangeslinked-toolbox' => 'ਸਬੰਧਤ à¨¬à¨¦à¨²à¨¾à¨\85',
 'recentchangeslinked-title' => '"$1" ਨਾਲ ਸਬੰਧਿਤ ਬਦਲਾਵ',
 'recentchangeslinked-noresult' => 'ਜੁੜੇ ਪੰਨਿਆਂ ’ਤੇ, ਦਿੱਤੇ ਸਮੇਂ ’ਚ ਕੋਈ ਬਦਲਾਵ ਨਹੀਂ ਹੋਈ।',
 'recentchangeslinked-summary' => 'ਇਹ ਸੂਚੀ ਇੱਕ ਵਿਸ਼ੇਸ਼ ਪੰਨੇ ਨਾਲ ਸਬੰਧਿਤ ਪੰਨਿਆਂ ਜਾਂ ਕਿਸੇ ਵਿਸ਼ੇਸ਼ ਸ਼੍ਰੇਣੀ ਦੇ ਮੈਂਬਰਾਂ ਦੇ ਹਾਲ ‘ਚ ਹੋਏ ਬਦਲਾਵਾਂ ਨੂੰ ਦਰਸਾਂਉਦੀ ਹੈ। [[Special:Watchlist|ਤੁਹਾਡੀ ਧਿਆਨਸੂਚੀ]] ਵਿੱਚ ਮੌਜੂਦ ਪੰਨੇ ਮੋਟੇ ਅੱਖਰਾਂ ਵਿੱਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
@@ -1297,7 +1341,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 'recentchangeslinked-to' => 'ਇਸਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿੱਚ ਹੋਏ ਬਦਲਾਅ ਵਿਖਾਓ',
 
 # Upload
-'upload' => 'ਫ਼ਾà¨\88ਲ à¨\85ੱਪਲà©\8bਡ à¨\95ਰà©\8b',
+'upload' => 'ਫ਼ਾਈਲ ਅਪਲੋਡ ਕਰੋ',
 'uploadbtn' => 'ਫਾਇਲ ਅੱਪਲੋਡ ਕਰੋ',
 'reuploaddesc' => 'ਅੱਪਲੋਡ ਫਾਰਮ ਉੱਤੇ ਜਾਓ।',
 'uploadnologin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
@@ -1307,10 +1351,11 @@ to upload files.',
 'upload-recreate-warning' => "'''ਖ਼ਬਰਦਾਰ: ਇਸ ਨਾਮ ਦੀ ਫ਼ਾਈਲ ਮਿਟਾਈ ਜਾਂ ਹੋਰ ਨਾਮ ਤੇ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।'''
 ਮਿਟਾਉਣ ਅਤੇ ਭੇਜੇ ਜਾਣ ਦਾ ਚਿੱਠਾ ਸਹੂਲਤ ਲਈ ਇੱਥੇ ਦਿੱਤਾ ਗਿਆ ਹੈ:",
 'uploadlog' => 'ਅੱਪਲੋਡ ਲਾਗ',
-'uploadlogpage' => 'à¨\85ੱਪਲà©\8bਡਾà¨\82 à¨¦à¨¾ à¨\9aਿੱਠਾ',
+'uploadlogpage' => 'ਅਪਲੋਡਾਂ ਦਾ ਚਿੱਠਾ',
 'filename' => 'ਫਾਇਲ ਨਾਂ',
 'filedesc' => 'ਸਾਰ',
 'fileuploadsummary' => 'ਸੰਖੇਪ:',
+'filereuploadsummary' => 'ਫਾਇਲ ਬਦਲਾਅ',
 'filestatus' => 'ਕਾਪੀਰਾਈਟ ਹਾਲਤ:',
 'filesource' => 'ਸੋਰਸ:',
 'uploadedfiles' => 'ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫਾਇਲਾਂ',
@@ -1319,9 +1364,15 @@ to upload files.',
 'minlength1' => 'ਫਾਇਲ ਨਾਂ ਵਿੱਚ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਅੱਖਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
 'badfilename' => 'ਫਾਇਲ ਨਾਂ "$1" ਬਦਲਿਆ ਗਿਆ ਹੈ।',
 'filetype-missing' => 'ਫਾਇਲ ਦੀ ਕੋਈ ਐਕਸ਼ਟੇਸ਼ਨ ਨਹੀਂ ਹੈ (ਜਿਵੇਂ ".jpg").',
-'filename-tooshort' => 'ਫ਼ਾਈਲ ਬਹੁਤ ਛੋਟੀ ਹੈ।',
-'filetype-banned' => 'ਇਸ ਕਿਸਮ ਦੀ ਫ਼ਾਈਲ ਦੀ ਮਨਾਹੀ ਹੈ।',
-'illegal-filename' => 'ਇਸ ਫ਼ਾਈਲ-ਨਾਮ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'empty-file' => 'ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੀ ਫਾਇਲ ਖਾਲੀ ਸੀ।',
+'file-too-large' => 'ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤੀ ਫਾਇਲ ਬਹੁਤ ਵੱਡੀ ਸੀ।',
+'filename-tooshort' => 'ਫ਼ਾਈਲ ਦਾ ਨਾਂ ਬਹੁਤ ਛੋਟਾ ਹੈ।',
+'filetype-banned' => 'ਇਸ ਕਿਸਮ ਦੀ ਫਾਈਲ ਦੀ ਮਨਾਹੀ ਹੈ।',
+'verification-error' => 'ਇਹ ਫਾਇਲ ਫਾਇਲ ਜਾਂਚ ਪੂਰੀ ਨਹੀਂ ਕਰਦੀ ਹੈ।',
+'illegal-filename' => 'ਇਸ ਫਾਈਲ-ਨਾਮ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
+'unknown-error' => 'ਅਣਜਾਣ ਗਲਤੀ ਆਈ ਹੈ।',
+'tmp-create-error' => 'ਆਰਜ਼ੀ ਫਾਇਲ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ ਹੈ।',
+'tmp-write-error' => 'ਆਰਜ਼ੀ ਫਾਇਲ ਲਿਖਣ ਲਈ ਗਲਤੀ ਹੈ।',
 'fileexists' => 'ਇਹ ਫਾਇਲ ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਜੇ ਤੁਸੀਂ ਇਹ ਬਦਲਣ ਬਾਰੇ ਦ੍ਰਿੜ ਨਹੀਂ ਹੋ ਤਾਂ  <strong>[[:$1]]</strong> ਵੇਖੋ ਜੀ। [[$1|thumb]]',
 'fileexists-extension' => 'ਇਸ ਨਾਂ ਨਾਲ ਰਲਦੀ ਫਾਇਲ ਮੌਜੂਦ ਹੈ: [[$2|thumb]]
 * ਅੱਪਲੋਡ ਕੀਤੀ ਜਾਂਦੀ ਫਾਇਲ ਦਾ ਨਾਂ: <strong>[[:$1]]</strong>
@@ -1334,15 +1385,22 @@ to upload files.',
 'overwroteimage' => '"[[$1]]" ਦਾ ਨਵਾਂ ਰੂਪ ਅੱਪਲੋਡ ਕਰੋ',
 'uploaddisabled' => 'ਅੱਪਲੋਡ ਆਯੋਗ ਹੈ',
 'uploadvirus' => 'ਇਹ ਫਾਇਲ ਵਿੱਚ ਵਾਇਰਸ ਹੈ! ਵੇਰਵੇ ਲਈ ਵੇਖੋ: $1',
+'upload-source' => 'ਸਰੋਤ ਫਾਇਲ',
 'sourcefilename' => 'ਸੋਰਸ ਫਾਇਲ ਨਾਂ:',
-'upload-maxfilesize' => 'ਫ਼ਾਈਲ ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਅਕਾਰ: $1',
-'upload-description' => 'ਫ਼ਾਈਲ ਦਾ ਵੇਰਵਾ',
+'sourceurl' => 'ਸਰੋਤ URL:',
+'destfilename' => 'ਟਿਕਾਣਾ ਫਾਇਲ-ਨਾਂ:',
+'upload-maxfilesize' => 'ਫਾਈਲ ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਅਕਾਰ: $1',
+'upload-description' => 'ਫਾਈਲ ਵੇਰਵਾ',
+'upload-options' => 'ਅੱਪਲੋਡ ਚੋਣਾਂ',
 'watchthisupload' => 'ਇਸ ਫ਼ਾਈਲ ’ਤੇ ਨਜ਼ਰ ਰੱਖੋ',
 'upload-success-subj' => 'ਠੀਕ ਤਰ੍ਹਾਂ ਅੱਪਲੋਡ',
+'upload-failure-subj' => 'ਅੱਪਲੋਡ ਸਮੱਸਿਆ',
 'upload-warning-subj' => 'ਅੱਪਲੋਡ ਚੇਤਾਵਨੀ',
 
+'upload-proto-error' => 'ਗਲਤ ਪਰੋਟੋਕਾਲ',
 'upload-file-error' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ',
 'upload-misc-error' => 'ਅਣਜਾਣ ਅੱਪਲੋਡ ਗਲਤੀ',
+'upload-unknown-size' => 'ਅਣਜਾਣ ਆਕਾਰ',
 
 # File backend
 'backend-fail-notexists' => 'ਫ਼ਾਈਲ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।',
@@ -1365,8 +1423,8 @@ to upload files.',
 ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ ਕਿ URL ਸਹੀ ਹੈ ਅਤੇ ਸਾਈਟ ਉਪਲੱਬਧ ਹੈ।',
 'upload-curl-error28' => 'ਅੱਪਲੋਡ ਟਾਈਮ-ਆਉਟ',
 
-'license' => 'ਲਾਈਸੈਂਸਿੰਗ:',
-'license-header' => 'ਲਸੰਸ',
+'license' => 'ਲਾਈਸੈਂਸ:',
+'license-header' => 'ਲਾà¨\88ਸà©\88à¨\82ਸ',
 'nolicense' => 'ਕੁਝ ਵੀ ਚੁਣਿਆ',
 'license-nopreview' => '(ਝਲਕ ਉਪਲੱਬਧ ਨਹੀਂ)',
 'upload_source_file' => ' (ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਉੱਤੇ ਇੱਕ ਫਾਇਲ)',
@@ -1384,14 +1442,14 @@ to upload files.',
 'listfiles_count' => 'ਵਰਜਨ',
 
 # File description page
-'file-anchor-link' => 'ਫ਼ਾà¨\88ਲ',
-'filehist' => 'ਫ਼ਾà¨\88ਲ à¨¦à¨¾ à¨\87ਤਿਹਾਸ',
+'file-anchor-link' => 'ਫਾਈਲ',
+'filehist' => 'ਫ਼ਾà¨\88ਲ à¨¦à¨¾ à¨\85ਤà©\80ਤ',
 'filehist-help' => 'ਤਾਰੀਖ/ਸਮੇਂ ’ਤੇ ਕਲਿੱਕ ਕਰੋ ਤਾਂ ਉਸ ਸਮੇਂ ਦੀ ਫਾਈਲ ਪੇਸ਼ ਹੋ ਜਾਵੇਗੀ।',
 'filehist-deleteall' => 'ਸਭ ਹਟਾਓ',
 'filehist-deleteone' => 'ਇਹ ਹਟਾਓ',
 'filehist-revert' => 'ਉਲਟਾਓ',
 'filehist-current' => 'ਮੌਜੂਦਾ',
-'filehist-datetime' => 'ਤਾਰà©\80à¨\96/ਸਮà©\87ਂ',
+'filehist-datetime' => 'ਮਿਤà©\80/ਸਮਾਂ',
 'filehist-thumb' => 'ਨਮੂਨਾ',
 'filehist-thumbtext' => '$1 ਦੇ ਸਮੇਂ ਦੇ ਸੰਸਕਰਨ ਦਾ ਅੰਗੂਠਾਕਾਰ ਪ੍ਰਤੀਰੂਪ',
 'filehist-nothumb' => 'ਕੋਈ ਨਮੂਨਾ-ਤਸਵੀਰ ਨਹੀਂ',
@@ -1399,8 +1457,8 @@ to upload files.',
 'filehist-dimensions' => 'ਨਾਪ',
 'filehist-filesize' => 'ਫਾਇਲ ਆਕਾਰ',
 'filehist-comment' => 'ਟਿੱਪਣੀ',
-'filehist-missing' => 'ਫ਼ਾà¨\88ਲ à¨\97à©\81ੰਮ',
-'imagelinks' => 'ਫ਼ਾà¨\88ਲ à¨¦à©\80 ਵਰਤੋਂ',
+'filehist-missing' => 'ਫਾਈਲ ਗੁੰਮ',
+'imagelinks' => 'ਫਾà¨\88ਲ ਵਰਤੋਂ',
 'linkstoimage' => 'ਇਹ {{PLURAL:$1|ਪੰਨੇ ਦੇ ਲਿੰਕ|$1 ਪੰਨੇ}} ਇਸ ਫ਼ਾਈਲ ਨਾਲ ਜੋੜਦੇ ਹਨੇ:',
 'nolinkstoimage' => 'ਕੋਈ ਵੀ ਪੰਨਾ ਇਸ ਫ਼ਾਈਲ ਨਾਲ ਨਹੀਂ ਜੋੜਦਾ।',
 'morelinkstoimage' => 'ਇਸ ਫ਼ਾਈਲ ਨਾਲ਼ ਜੋੜਦੇ [[Special:WhatLinksHere/$1|ਹੋਰ ਲਿੰਕ]] ਵੇਖੋ।',
@@ -1420,7 +1478,7 @@ to upload files.',
 # File reversion
 'filerevert' => '$1 ਰੀਵਰਟ',
 'filerevert-legend' => 'ਫਾਇਲ ਰੀਵਰਟ',
-'filerevert-comment' => 'à¨\9fਿੱਪਣà©\80:',
+'filerevert-comment' => 'à¨\95ਾਰਨ:',
 'filerevert-submit' => 'ਰੀਵਰਟ',
 
 # File deletion
@@ -1466,18 +1524,21 @@ to upload files.',
 'statistics-header-edits' => 'ਸੋਧ ਅੰਕੜੇ',
 'statistics-header-views' => 'ਵੇਖਣ ਅੰਕੜੇ',
 'statistics-header-users' => 'ਯੂਜ਼ਰ ਅੰਕੜੇ',
-'statistics-header-hooks' => 'ਹੋਰ ਆਂਕੜੇ',
+'statistics-header-hooks' => 'ਹੋਰ ਅੰਕੜੇ',
+'statistics-articles' => 'ਸਮੱਗਰੀ ਸਫ਼ੇ',
 'statistics-pages' => 'ਸਫ਼ੇ',
 'statistics-pages-desc' => 'ਇਸ ਵਿਕੀ ਦੇ ਸਾਰੇ ਸਫ਼ੇ, ਗੱਲ-ਬਾਤ ਸਫ਼ਿਆਂ, ਰੀਡਾਇਰੈਕਟਾਂ ਇਤਿਆਦਿ ਨੂੰ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋਏ',
-'statistics-files' => 'à¨\85ੱਪਲà©\8bਡ à¨¹à©\8bà¨\88à¨\86à¨\82 à¨«à¨¼ਾਈਲਾਂ',
+'statistics-files' => 'à¨\85ਪਲà©\8bਡ à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨\97à¨\88à¨\86à¨\82 à¨«ਾਈਲਾਂ',
 'statistics-edits-average' => 'ਪ੍ਰਤੀ ਸਫ਼ਾ ਔਸਤਨ ਸੋਧਾਂ',
-'statistics-users' => 'ਰà¨\9cਿਸà¨\9fਰ à¨¹à©\8bà¨\8f [[Special:ListUsers|ਮà©\88à¨\82ਬਰ]]',
-'statistics-users-active' => 'à¨\9aà©\81ਸਤ à¨®à©\88à¨\82ਬਰ',
+'statistics-users' => 'ਰà¨\9cਿਸà¨\9fà©\8dਰਡ [[Special:ListUsers|ਵਰਤà©\8bà¨\82à¨\95ਾਰ]]',
+'statistics-users-active' => 'ਸਰà¨\97ਰਮ à¨¯à©\82à¨\9c਼ਰ',
 'statistics-users-active-desc' => 'ਮੈਂਬਰ, ਜਿੰਨ੍ਹਾ ਨੇ ਆਖ਼ਰੀ {{PLURAL:$1|ਦਿਨ|$1 ਦਿਨਾਂ}} ਵਿਚ ਕੋਈ ਕੰਮ ਕੀਤਾ ਹੈ।',
-'statistics-mostpopular' => 'ਸਭ à¨¤à©\8bà¨\82 à¨µà©±à¨§ à¨µà©\87à¨\96à©\87 à¨ªà©\87à¨\9c',
+'statistics-mostpopular' => 'ਸਭ à¨¤à©\8bà¨\82 à¨µà©±à¨§ à¨µà©\87à¨\96à©\87 à¨¸à¨«à¨¼à©\87',
 
 'disambiguationspage' => 'Template:ਗੁੰਝਲ ਖੋਲ੍ਹ',
 
+'pageswithprop-submit' => 'ਜਾਉ',
+
 'doubleredirects' => 'ਦੋਹਰੇ ਰੀਡਿਰੈਕਟ',
 
 'brokenredirectstext' => 'ਇਹ ਰਿਡਿਰੈਕਟ ਨਾ-ਮੌਜੂਦ ਸਫ਼ਿਆਂ ’ਤੇ ਜੋੜਦੇ ਹਨ:',
@@ -1487,7 +1548,7 @@ to upload files.',
 'withoutinterwiki' => 'ਬਿਨਾਂ ਬੋਲੀ ਲਿੰਕਾਂ ਦੇ ਸਫ਼ੇ',
 'withoutinterwiki-summary' => 'ਇਹ ਸਫ਼ੇ ਹੋਰ ਬੋਲੀਆਂ ਵਾਲ਼ੇ ਵਰਜਨਾਂ ਨਾਲ਼ ਨਹੀਂ ਜੁੜਦੇ।',
 'withoutinterwiki-legend' => 'ਅਗੇਤਰ',
-'withoutinterwiki-submit' => 'ਵਖਾਓ',
+'withoutinterwiki-submit' => 'ਵà©\87à¨\96ਾà¨\93',
 
 'fewestrevisions' => 'ਸਭ ਤੋਂ ਘੱਟ ਰੀਵਿਜ਼ਨਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ',
 
@@ -1497,7 +1558,7 @@ to upload files.',
 'nlinks' => '$1 {{PLURAL:$1|ਲਿੰਕ|ਲਿੰਕ}}',
 'nmembers' => '$1 {{PLURAL:$1|ਮੈਂਬਰ|ਮੈਂਬਰਾਂ}}',
 'nrevisions' => '$1 {{PLURAL:$1|ਰੀਵਿਜ਼ਨ|ਰੀਵਿਜ਼ਨਾਂ}}',
-'nviews' => '$1 {{PLURAL:$1|ਨà¨\9c਼ਾਰਾ|ਨà¨\9c਼ਾਰà©\87}}',
+'nviews' => '$1 {{PLURAL:$1|à¨\9dਲà¨\95|à¨\9dਲà¨\95}}',
 'nimagelinks' => '$1 {{PLURAL:$1|ਸਫ਼ੇ|ਸਫ਼ਿਆਂ}} ’ਤੇ ਵਰਤਿਆ ਹੋਇਆ',
 'ntransclusions' => '$1 {{PLURAL:$1|ਸਫ਼ੇ|ਸਫ਼ਿਆਂ}} ’ਤੇ ਵਰਤਿਆ ਹੋਇਆ',
 'specialpage-empty' => 'ਇਸ ਰਿਪੋਟ ਦਾ ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਹੈ।',
@@ -1508,21 +1569,21 @@ to upload files.',
 'uncategorizedtemplates' => 'ਬਗ਼ੈਰ ਕੈਟੇਗਰੀਆਂ ਵਾਲ਼ੇ ਸਾਂਚੇ',
 'unusedcategories' => 'ਅਣਵਰਤੀਆਂ ਕੈਟਾਗਰੀਆਂ',
 'unusedimages' => 'ਅਣਵਰਤੀਆਂ ਫਾਇਲਾਂ',
-'popularpages' => 'ਪਾਪà©\82ਲਰ à¨ªà©\87à¨\9c',
+'popularpages' => 'ਹਰਮਨਪਿà¨\86ਰà©\87 à¨¸à¨«à¨¼à©\87',
 'wantedcategories' => 'ਚਾਹੀਦੀਆਂ ਕੈਟੇਗਰੀਆਂ',
 'wantedpages' => 'ਚਾਹੀਦੇ ਸਫ਼ੇ',
-'wantedfiles' => 'à¨\9aਾਹà©\80ਦà©\80à¨\86à¨\82 à¨«à¨¼à¨¾à¨\88ਲਾਂ',
-'wantedtemplates' => 'à¨\9aਾਹà©\80ਦà©\87 à¨¸à¨¾à¨\82à¨\9aà©\87',
+'wantedfiles' => 'à¨\9aਾਹà©\80ਦà©\80à¨\86à¨\82 à¨«à¨¾à¨\87ਲਾਂ',
+'wantedtemplates' => 'à¨\9aਾਹà©\80ਦà©\87 à¨\9fà©\88ਪਲà©\87à¨\9f',
 'mostcategories' => 'ਸਭ ਤੋਂ ਵੱਧ ਕੈਟੇਗਰੀਆਂ ਵਾਲ਼ੇ ਸਫ਼ੇ',
 'prefixindex' => 'ਇਸ ਅਗੇਤਰ ਵਾਲੇ ਸਾਰੇ ਪੰਨੇ',
-'shortpages' => 'à¨\9bà©\8bà¨\9fà©\87 à¨ªà©\87à¨\9c',
+'shortpages' => 'à¨\9bà©\8bà¨\9fà©\87 à¨¸à¨«à¨¼à©\87',
 'listusers' => 'ਯੂਜ਼ਰ ਲਿਸਟ',
 'usercreated' => '$1 ਨੂੰ $2 ’ਤੇ {{GENDER:$3|ਬਣਾਇਆ}}',
-'newpages' => 'ਨਵà©\87à¨\82 à¨ªà©°à¨¨ੇ',
-'newpages-username' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ-ਨਾਂ:',
+'newpages' => 'ਨਵà©\87à¨\82 à¨¸à¨«à¨¼ੇ',
+'newpages-username' => 'ਯà©\82à¨\9c਼ਰ-ਨਾਂ:',
 'ancientpages' => 'ਸਭ ਤੋਂ ਪੁਰਾਣੇ ਪੇਜ',
-'move' => 'ਸਥਾਨਾà¨\82ਤਰਣ',
-'movethispage' => 'à¨\87ਹ à¨ªà©\87à¨\9c ਭੇਜੋ',
+'move' => 'ਸਿਰਲà©\87à¨\96 à¨¬à¨¦à¨²à©\8b',
+'movethispage' => 'à¨\87ਹ à¨¸à¨«à¨¼à¨¾ ਭੇਜੋ',
 'unusedcategoriestext' => 'ਇਹ ਕੈਟੇਗਰੀ ਸਫ਼ੇ ਮੌਜੂਦ ਹਨ ਹਾਲਾਂਕਿ ਕਿਸੇ ਵੀ ਸਫ਼ੇ ਜਾਂ ਕੈਟੇਗਰੀ ਨੇ ਇਹਨਾਂ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ।',
 'notargettitle' => 'ਟਾਰਗੇਟ ਨਹੀਂ',
 'pager-newer-n' => '{{PLURAL:$1|1 ਨਵਾਂ|$1 ਨਵੇਂ}}',
@@ -1544,13 +1605,13 @@ to upload files.',
 'showhideselectedlogentries' => 'ਚਿੱਠੇ ਦੇ ਚੁਣੇ ਹੋਏ ਦਾਖ਼ਲੇ ਵਖਾਓ/ਲੁਕਾਓ',
 
 # Special:AllPages
-'allpages' => 'ਸਭ à¨ªà©°à¨¨ੇ',
+'allpages' => 'ਸਭ à¨¸à¨«à¨¼ੇ',
 'alphaindexline' => '$1 ਤੋਂ $2',
-'nextpage' => 'à¨\85ੱà¨\97à©\87 à¨ªà©\87à¨\9c ($1)',
-'prevpage' => 'ਪਿੱà¨\9bà©\87 à¨ªà©\87à¨\9c ($1)',
+'nextpage' => 'à¨\85ੱà¨\97à©\87 à¨¸à¨«à¨¼à¨¾ ($1)',
+'prevpage' => 'ਪਿੱà¨\9bà©\87 à¨¸à¨«à¨¼à¨¾ ($1)',
 'allpagesfrom' => 'ਇਸਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵਖਾਓ:',
 'allpagesto' => 'ਇਸਤੇ ਖ਼ਤਮ ਹੋਣ ਵਾਲ਼ੇ ਸਫ਼ੇ ਵਖਾਓ:',
-'allarticles' => 'ਸਭ  ਪੰਨੇ',
+'allarticles' => 'ਸਭ ਸਫ਼ੇ',
 'allinnamespace' => 'ਸਭ ਪੇਜ ($1 ਨੇਮਸਪੇਸ)',
 'allnotinnamespace' => 'ਸਭ ਪੇਜ ($1 ਨੇਮਸਪੇਸ ਵਿੱਚ ਨਹੀਂ)',
 'allpagesprev' => 'ਪਿੱਛੇ',
@@ -1575,14 +1636,14 @@ to upload files.',
 'sp-deletedcontributions-contribs' => 'ਯੋਗਦਾਨ',
 
 # Special:LinkSearch
-'linksearch' => 'ਬਾਹਰà©\80 à¨\95à©\9cà©\80 à¨\96à©\8bà¨\9cà©\8b',
+'linksearch' => 'ਬਾਹਰà©\80 à¨²à¨¿à©°à¨\95 à¨\96à©\8bà¨\9c',
 'linksearch-ns' => 'ਥਾਂ-ਨਾਮ:',
-'linksearch-ok' => 'ਖੋਜ',
+'linksearch-ok' => 'ਖੋਜ',
 'linksearch-line' => '$2 ਵਿੱਚ $1 ਬਾਹਰੀ ਸਿਰਨਾਵਾਂ ਹੈ',
 
 # Special:ListUsers
 'listusersfrom' => 'ਇਸਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ ਮੈਂਬਰ ਵਖਾਓ:',
-'listusers-submit' => 'ਵà©\87à¨\96à©\8b',
+'listusers-submit' => 'ਵà©\87à¨\96ਾà¨\93',
 'listusers-noresult' => 'ਕੋਈ ਯੂਜ਼ਰ ਨਹੀਂ ਲੱਭਿਆ।',
 'listusers-blocked' => '(ਪਾਬੰਦੀਸ਼ੁਦਾ)',
 
@@ -1599,7 +1660,7 @@ to upload files.',
 'listgrouprights-group' => 'ਗਰੁੱਪ',
 'listgrouprights-rights' => 'ਹੱਕ',
 'listgrouprights-helppage' => 'Help:ਗਰੁੱਪ ਹੱਕ',
-'listgrouprights-members' => '(ਵਰਤà©\8bà¨\82à¨\95ਾਰਾਂ ਦੀ ਸੂਚੀ)',
+'listgrouprights-members' => '(ਮà©\88à¨\82ਬਰਾਂ ਦੀ ਸੂਚੀ)',
 'listgrouprights-addgroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਜੋੜੋ',
 'listgrouprights-removegroup-all' => 'ਸਾਰੇ ਗਰੁੱਪ ਹਟਾਓ',
 
@@ -1607,6 +1668,8 @@ to upload files.',
 'mailnologin' => 'ਕੋਈ ਭੇਜਣ ਐਡਰੈੱਸ ਨਹੀਂ',
 'mailnologintext' => 'ਦੂਜੇ ਮੈਂਬਰਾਂ ਨੂੰ ਈ-ਮੇਲ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ [[Special:UserLogin|ਲਾਗਇਨ]] ਹੋਣਾ ਅਤੇ ਆਪਣੀਆਂ [[Special:Preferences|ਪਸੰਦਾਂ]] ਵਿਚ ਇਕ ਸਹੀ ਈ-ਮੇਲ ਪਤਾ ਦੇਣਾ ਪਵੇਗਾ।',
 'emailuser' => 'ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
+'emailuser-title-target' => 'ਇਹ {{GENDER:$1|ਯੂਜ਼ਰ}} ਨੂੰ ਈਮੇਲ ਭੇਜੋ',
+'emailuser-title-notarget' => 'ਯੂਜ਼ਰ ਨੂੰ ਈਮੇਲ',
 'emailpage' => 'ਯੂਜ਼ਰ ਨੂੰ ਈਮੇਲ ਕਰੋ',
 'defemailsubject' => '{{SITENAME}} ਈਮੇਲ',
 'usermaildisabled' => 'ਮੈਂਬਰ ਈ-ਮੇਲ ਬੰਦ ਹੈ',
@@ -1617,7 +1680,7 @@ to upload files.',
 'nowikiemailtext' => 'ਇਸ ਮੈਂਬਰ ਨੇ ਦੂਜੇ ਮੈਂਬਰਾਂ ਤੋਂ ਈ-ਮੇਲ ਨਾ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚੁਣ ਰੱਖਿਆ ਹੈ।',
 'emailnotarget' => 'ਪ੍ਰਾਪਤ ਕਰਤਾ ਦਾ ਨਾ-ਮੌਜੂਦ ਜਾਂ ਗ਼ਲਤ ਮੈਂਬਰ-ਨਾਂ।',
 'emailtarget' => 'ਪ੍ਰਾਪਤ ਕਰਤਾ ਦਾ ਮੈਂਬਰ-ਨਾਂ ਦਾਖ਼ਲ ਕਰੋ',
-'emailusername' => 'ਮà©\88à¨\82ਬਰ-ਨਾਂ:',
+'emailusername' => 'ਯà©\82à¨\9c਼ਰ-ਨਾਂ:',
 'emailusernamesubmit' => 'ਭੇਜੋ',
 'email-legend' => 'ਕਿਸੇ ਦੂਜੇ {{SITENAME}} ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
 'emailfrom' => 'ਵਲੋਂ:',
@@ -1632,8 +1695,8 @@ to upload files.',
 'emailuserfooter' => 'ਇਹ ਈ-ਮੇਲ $1 ਨੇ {{SITENAME}} ’ਤੇ "ਇਸ ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ" ਸਹੂਲਤ ਜ਼ਰੀਏ $2 ਨੂੰ ਭੇਜੀ ਸੀ।',
 
 # Watchlist
-'watchlist' => 'ਮà©\87ਰà©\80 à¨§à¨¿à¨\86ਨਸੂਚੀ',
-'mywatchlist' => 'ਧਿà¨\86ਨਸà©\82à¨\9aà©\80',
+'watchlist' => 'ਨਿà¨\97ਰਾਨ-ਸੂਚੀ',
+'mywatchlist' => 'ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f',
 'watchlistfor2' => '$1 $2 ਲਈ',
 'nowatchlist' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।',
 'watchlistanontext' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ ਵੇਖਣ ਜਾਂ ਸੋਧਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ $1।',
@@ -1648,14 +1711,15 @@ to upload files.',
 'watchthispage' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
 'unwatch' => 'ਧਿਆਨ ਹਟਾਓ',
 'unwatchthispage' => 'ਨਜ਼ਰ ਰੱਖਣੀ ਬੰਦ ਕਰੋ',
+'notanarticle' => 'ਕੋਈ ਸਮੱਗਰੀ ਸਫ਼ਾ ਨਹੀਂ ਹੈ',
 'notvisiblerev' => 'ਇੱਕ ਵੱਖਰੇ ਮੈਂਬਰ ਦੀ ਬਣਾਈ ਆਖ਼ਰੀ ਰੀਵਿਜ਼ਨ ਮਿਟਾਈ ਜਾ ਚੁੱਕੀ ਹੈ',
 'watchnochange' => 'ਵਖਾਏ ਜਾ ਰਹੇ ਸਮੇਂ ਅੰਦਰ ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲਾ ਕੋਈ ਵੀ ਸਫ਼ਾ ਸੋਧਿਆ ਨਹੀਂ ਗਿਆ।',
 'watchlist-details' => 'ਚਰਚਾ ਪੰਨੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਧਿਆਨਸੂਚੀ ਵਿੱਚ{{PLURAL:$1|$1 ਪੰਨਾ ਹੈ|$1 ਪੰਨੇ ਹਨ}}।',
 'watchlistcontains' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ $1 {{PLURAL:$1|ਸਫ਼ਾ ਹੈ|ਸਫ਼ੇ ਹਨ}}।',
 'wlnote' => "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|'''$2''' ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:
 $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ}}, ਹੇਠਾਂ ਵੇਖੋ।",
-'wlshowlast' => 'ਪਿੱà¨\9bਲà©\87 $1 à¨\98à©°à¨\9fà©\87 $2 à¨¦à¨¿à¨¨ $3 à¨µà©\87à¨\96à©\8b',
-'watchlist-options' => 'ਧਿà¨\86ਨਸà©\82à¨\9aà©\80 à¨¦à©\87 à¨\87à¨\96ਤਿà¨\86ਰ',
+'wlshowlast' => 'ਪਿà¨\9bਲà©\87 $1 à¨\98à©°à¨\9fà©\87 $2 à¨¦à¨¿à¨¨ $3 à¨µà¨\96ਾà¨\93',
+'watchlist-options' => 'ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨\9aà©\8bਣਾà¨\82',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...',
@@ -1669,7 +1733,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'changed' => 'ਬਦਲਿਆ',
 
 # Delete
-'deletepage' => 'ਪà©\87à¨\9c ਹਟਾਓ',
+'deletepage' => 'ਸਫ਼ਾ ਹਟਾਓ',
 'confirm' => 'ਪੁਸ਼ਟੀ',
 'excontent' => "ਸਮੱਗਰੀ ਸੀ: '$1'",
 'exbeforeblank' => 'ਖ਼ਾਲੀ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਸਮੱਗਰੀ ਸੀ: "$1"',
@@ -1712,7 +1776,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'prot_1movedto2' => '[[$1]] ਨੂੰ [[$2]] ’ਤੇ ਭੇਜਿਆ',
 'protect-badnamespace-title' => 'ਨਾ-ਸੁਰੱਖਿਆਯੋਗ ਥਾਂ-ਨਾਮ',
 'protect-badnamespace-text' => 'ਇਸ ਥਾਂ-ਨਾਮ ਵਿਚਲੇ ਸਫ਼ੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ।',
-'protect-legend' => 'ਸà©\81ਰੱà¨\96ਿà¨\86 à¨\95ਨਫਰਮ',
+'protect-legend' => 'ਸà©\81ਰੱà¨\96ਿà¨\86 à¨ªà©\81ਸ਼à¨\9fà©\80',
 'protectcomment' => 'ਕਾਰਨ:',
 'protectexpiry' => 'ਮਿਆਦ:',
 'protect_expiry_invalid' => 'ਖ਼ਤਮ ਹੋਣ ਦਾ ਸਮਾਂ ਗ਼ਲਤ ਹੈ।',
@@ -1721,11 +1785,11 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'protect-default' => 'ਸਭ ਯੂਜ਼ਰ ਮਨਜ਼ੂਰ',
 'protect-fallback' => '"$1" ਅਧਿਕਾਰ ਲੋੜੀਦਾ ਹੈ',
 'protect-level-autoconfirmed' => 'ਨਵੇਂ ਤੇ ਗੈਰ-ਰਜਿਸਟਰ ਵਰਤੋਂਕਾਰਾਂ ਉੱਤੇ ਪਾਬੰਦੀ',
-'protect-level-sysop' => 'à¨\95à©\87ਵਲ à¨ªà©\8dਰਬੰਧà¨\95',
+'protect-level-sysop' => 'à¨\95à©\87ਵਲ à¨ªà¨°à¨¸à¨¼à¨¾à¨¸à¨¼à¨\95 à¨¹à©\80 à¨®à¨¨à¨\9c਼à©\82ਰ',
 'protect-summary-cascade' => 'ਕਾਸਕੇਡਿੰਗ',
 'protect-cascade' => 'ਇਸ ਸਫ਼ੇ ਵਿਚ ਸ਼ਾਮਲ ਸਫ਼ੇ ਸੁਰੱਖਿਅਤ ਕਰੋ (ਕਾਸਕੇਡਿੰਗ ਸੁਰੱਖਿਆ)',
 'protect-cantedit' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ਦਾ ਸੁਰੱਖਿਆ ਦਰਜਾ ਨਹੀਂ ਬਦਲ ਸਕਦੇ ਕਿਉਂਕਿ ਤੁਹਾਨੂੰ ਇਸਨੂੰ ਸੋਧਣ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ।',
-'protect-othertime' => 'ਹੋਰ ਸਮਾਂ',
+'protect-othertime' => 'ਹੋਰ ਸਮਾਂ:',
 'protect-othertime-op' => 'ਹੋਰ ਸਮਾਂ',
 'protect-existing-expiry' => 'ਖ਼ਤਮ ਹੋਣ ਦਾ ਮੌਜੂਦਾ ਸਮਾਂ: $2, $3',
 'protect-otherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
@@ -1733,8 +1797,9 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'protect-edit-reasonlist' => 'ਸੁਰੱਖਿਆ ਦੇ ਕਾਰਨ ਸੋਧੋ',
 'protect-expiry-options' => '੧ ਘੰਟਾ:1 hour,੧ ਦਿਨ:1 day,੧ ਹਫ਼ਤਾ:1 week,੨ ਹਫ਼ਤੇ:2 weeks,੧ ਮਹੀਨਾ:1 month,੩ ਮਹੀਨੇ:3 months,੬ ਮਹੀਨੇ:6 months,੧ ਸਾਲ:1 year,ਬੇਹੱਦ:infinite',
 'restriction-type' => 'ਅਧਿਕਾਰ:',
+'restriction-level' => 'ਪਾਬੰਦੀ ਪੱਧਰ:',
 'minimum-size' => 'ਘੱਟੋ-ਘੱਟ ਆਕਾਰ',
-'maximum-size' => 'ਵੱਧੋ-ਵੱਧ ਆਕਾਰ',
+'maximum-size' => 'ਵੱਧੋ-ਵੱਧ ਆਕਾਰ:',
 'pagesize' => '(ਬਾਈਟ)',
 
 # Restrictions (nouns)
@@ -1754,16 +1819,16 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'viewdeletedpage' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਵੇਖੋ',
 'undelete-fieldset-title' => 'ਰੀਵਿਜ਼ਨਾਂ ਮੁੜ ਬਹਾਲ ਕਰੋ',
 'undelete-nodiff' => 'ਕੋਈ ਪਿਛਲੀ ਰੀਵਿਜ਼ਨ ਨਹੀਂ ਲੱਭੀ',
-'undeletebtn' => 'ਰà©\80ਸਟੋਰ',
+'undeletebtn' => 'ਮà©\81à©\9c-ਸਟੋਰ',
 'undeletelink' => 'ਵੇਖੋ/ਮੁੜ ਬਹਾਲ ਕਰੋ',
 'undeleteviewlink' => 'ਵੇਖੋ',
-'undeletereset' => 'ਰà©\80-ਸੈੱਟ',
-'undeletecomment' => 'à¨\9fਿੱਪਣà©\80:',
+'undeletereset' => 'ਮà©\81à©\9c-ਸੈੱਟ',
+'undeletecomment' => 'à¨\95ਾਰਨ:',
 'undelete-header' => 'ਤਾਜ਼ੇ ਹਟਾਏ ਗਏ ਪੰਨਿਆਂ ਲਈ [[Special:Log/
 delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'undelete-search-title' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ',
 'undelete-search-box' => 'ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਖੋਜੋ',
-'undelete-search-submit' => 'ਖੋਜ',
+'undelete-search-submit' => 'ਖੋਜ',
 'undelete-show-file-submit' => 'ਹਾਂ',
 
 # Namespace form on various pages
@@ -1781,10 +1846,10 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'year' => 'ਇਸ (ਅਤੇ ਪਿਛਲੇ) ਸਾਲ ਤੋਂ :',
 
 'sp-contributions-newbies' => 'ਸਿਰਫ਼ ਨਵੇਂ ਵਰਤੋਂਕਾਰਾਂ ਦੇ ਯੋਗਦਾਨ ਵਖਾਓ',
-'sp-contributions-newbies-sub' => 'ਨਵà©\87à¨\82 à¨\85à¨\95ਾà¨\8aà¨\82à¨\9fਾਂ ਲਈ',
+'sp-contributions-newbies-sub' => 'ਨਵà©\87à¨\82 à¨\96ਾਤਿà¨\86ਂ ਲਈ',
 'sp-contributions-blocklog' => 'ਪਾਬੰਦੀ ਚਿੱਠਾ',
-'sp-contributions-uploads' => 'ਅਪਲੋਡ',
-'sp-contributions-logs' => 'à¨\9aਿੱਠà©\87',
+'sp-contributions-uploads' => 'à¨\85ੱਪਲà©\8bਡ',
+'sp-contributions-logs' => 'ਲਾà¨\97',
 'sp-contributions-talk' => 'ਚਰਚਾ',
 'sp-contributions-blocked-notice' => 'ਇਹ ਮੈਂਬਰ ਇਸ ਵੇਲ਼ੇ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।
 ਪਾਬੰਦੀ ਚਿੱਠੇ ਦਾ ਤਾਜ਼ਾ ਦਾਖ਼ਲਾ ਹਵਾਲੇ ਲਈ ਹੇਠਾਂ ਦਿੱਤਾ ਗਿਆ ਹੈ:',
@@ -1793,7 +1858,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
 'sp-contributions-username' => 'IP ਪਤਾ ਜਾਂ ਵਰਤੋਂਕਾਰਨਾਮ:',
 'sp-contributions-toponly' => 'ਕੇਵਲ ਉਨ੍ਹਾਂ ਸੰਪਾਦਨਾਂ ਨੂੰ ਵਖਾਓ ਜੋ ਨਵੀਨਤਮ ਸੰਸ਼ੋਧਨ ਹਨ',
-'sp-contributions-submit' => 'ਖੋਜ',
+'sp-contributions-submit' => 'ਖੋਜ',
 
 # What links here
 'whatlinkshere' => 'ਕਿਹੜੇ (ਪੰਨੇ) ਇੱਥੇ ਜੋੜਦੇ ਹਨ',
@@ -1803,18 +1868,18 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'nolinkshere' => "ਕੋਈ ਵੀ ਪੰਨਾ '''[[:$1]]''' ਨਾਲ ਨਹੀਂ ਜੋੜਦਾ।",
 'isredirect' => 'ਰੀਡਿਰੈਕਟ ਪੰਨਾ',
 'istemplate' => 'ਟਾਕਰਾ ਕਰੋ',
-'isimage' => 'ਫ਼ਾà¨\88ਲ à¨¦à©\80 à¨\95à©\9cà©\80',
+'isimage' => 'ਫਾà¨\88ਲ à¨²à¨¿à©°à¨\95',
 'whatlinkshere-prev' => '{{PLURAL:$1|ਪਿਛਲਾ|ਪਿਛਲੇ $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|ਅਗਲਾ|ਅਗਲੇ $1}}',
-'whatlinkshere-links' => 'â\86\90 à¨\95à©\9cà©\80à¨\86à¨\82',
+'whatlinkshere-links' => 'â\86\90 à¨²à¨¿à©°à¨\95',
 'whatlinkshere-hideredirs' => 'ਅਸਿੱਧੇ ਰਾਹ $1',
 'whatlinkshere-hidetrans' => '$1 ਇੱਥੇ ਕੀ ਕੀ ਜੁੜਦਾ ਹੈ।',
-'whatlinkshere-hidelinks' => '$1 à¨\95à©\9cà©\80',
+'whatlinkshere-hidelinks' => '$1 à¨²à¨¿à©°à¨\95',
 'whatlinkshere-hideimages' => 'ਫ਼ਾਈਲ ਲਿੰਕ $1',
-'whatlinkshere-filters' => 'à¨\9bਾਨਣà©\80à¨\86à¨\82',
+'whatlinkshere-filters' => 'ਫਿਲà¨\9fਰ',
 
 # Block/unblock
-'blockip' => 'ਯà©\82à¨\9c਼ਰ à¨¬à¨²à¨¾à¨\95 à¨\95ਰà©\8b',
+'blockip' => 'ਪਾਬੰਦà©\80ਸ਼à©\81ਦਾ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ',
 'ipadressorusername' => 'IP ਐਡਰੈਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:',
 'ipbexpiry' => 'ਮਿਆਦ:',
 'ipbreason' => 'ਕਾਰਨ:',
@@ -1829,7 +1894,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'badipaddress' => 'ਗਲਤ IP ਐਡਰੈੱਸ',
 'blockipsuccesssub' => 'ਪਾਬੰਦੀ ਕਾਮਯਾਬ',
 'ipb-edit-dropdown' => 'ਪਾਬੰਦੀ ਲਾਉਣ ਦੇ ਕਾਰਨ ਸੋਧੋ',
-'ipb-unblock-addr' => '$1 à¨\85ਣ-ਬਲਾà¨\95',
+'ipb-unblock-addr' => '$1 à¨¤à©\8bà¨\82 à¨ªà¨¾à¨¬à©°à¨¦à©\80 à¨¹à¨\9fਾà¨\93',
 'ipb-unblock' => 'ਇੱਕ ਯੂਜ਼ਰ ਨਾਂ ਜਾਂ IP ਐਡਰੈੱਸ ਅਣ-ਬਲਾਕ ਕਰੋ',
 'ipb-blocklist' => 'ਮੌਜੂਦਾ ਪਾਬੰਦੀਆਂ ਵੇਖੋ',
 'ipb-blocklist-contribs' => '$1 ਦੇ ਯੋਗਦਾਨ',
@@ -1887,7 +1952,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'lockdb' => 'ਡਾਟਾਬੇਸ ਲਾਕ',
 
 # Move page
-'move-page-legend' => 'ਪà©\87à¨\9c à¨®à©\82ਵ à¨\95ਰੋ',
+'move-page-legend' => 'ਸਫ਼ਾ à¨­à©\87à¨\9cੋ',
 'movearticle' => 'ਸਫ਼ਾ ਭੇਜੋ:',
 'movenologin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
 'movenologintext' => 'ਇਕ ਸਫ਼ੇ ਦਾ ਸਿਰਲੇਖ ਬਦਲਣ ਲਈ ਤੁਸੀਂ ਰਜਿਸਟਰਡ ਮੈਂਬਰ ਹੋਣੇ ਚਾਹੀਦੇ ਹੋ ਅਤੇ [[Special:UserLogin|ਲਾਗਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
@@ -1899,11 +1964,11 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'movepage-moved-redirect' => 'ਇੱਕ ਰੀਡਿਰੈਕਟ ਬਣਾ ਦਿੱਤਾ ਗਿਆ।',
 'articleexists' => 'ਇਸ ਨਾਮ ਦਾ ਸਫ਼ਾ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ ਜਾਂ ਤੁਹਾਡਾ ਚੁਣਿਆ ਹੋਇਆ ਨਾਮ ਸਹੀ ਨਹੀਂ ਹੈ।
 ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਕੋਈ ਹੋਰ ਨਾਮ ਚੁਣੋ।',
-'movedto' => 'ਮà©\82ਵ à¨\95à©\80ਤਾ',
+'movedto' => 'ਭà©\87à¨\9cਿà¨\86',
 'movepage-page-moved' => 'ਸਫ਼ਾ $1 ਨੂੰ $2 ’ਤੇ ਭੇਜਿਆ ਜਾ ਚੁੱਕਾ ਹੈ।',
-'movelogpage' => 'ਸਥਾਨਾà¨\82ਤਰਣ ਦਾ ਚਿੱਠਾ',
+'movelogpage' => 'ਸਿਰਲà©\87à¨\96 à¨¬à¨¦à¨²à©\80 ਦਾ ਚਿੱਠਾ',
 'movereason' => 'ਕਾਰਨ:',
-'revertmove' => 'ਰੱਦ à¨\95ਰà©\8b',
+'revertmove' => 'à¨\89ਲà¨\9fਾà¨\93',
 'delete_and_move' => 'ਹਟਾਓ ਅਤੇ ਮੂਵ ਕਰੋ',
 'delete_and_move_confirm' => 'ਹਾਂ, ਸਫ਼ਾ ਮਿਟਾ ਦੇਵੋ',
 'move-leave-redirect' => 'ਪਿੱਛੇ ਇਕ ਰੀਡਿਰੈਕਟ ਛੱਡੋ',
@@ -1922,7 +1987,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'allmessagesname' => 'ਨਾਮ',
 'allmessagesdefault' => 'ਡਿਫਾਲਟ ਪਾਠ',
 'allmessagescurrent' => 'ਮੌਜੂਦਾ ਟੈਕਸਟ',
-'allmessages-filter-legend' => 'à¨\9bਾਨਣਾ',
+'allmessages-filter-legend' => 'ਫਿਲà¨\9fਰ',
 'allmessages-filter-all' => 'ਸਭ',
 'allmessages-language' => 'ਭਾਸ਼ਾ:',
 'allmessages-filter-submit' => 'ਜਾਓ',
@@ -1974,7 +2039,7 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'tooltip-p-logo' => 'ਮੁੱਖ ਪੰਨੇ ’ਤੇ ਜਾਓ',
 'tooltip-n-mainpage' => 'ਮੁੱਖ ਪੰਨੇ ’ਤੇ ਜਾਓ',
 'tooltip-n-mainpage-description' => 'ਮੁੱਖ ਪੰਨੇ ’ਤੇ ਜਾਓ',
-'tooltip-n-portal' => 'ਪਰਿਯà©\8bà¨\9cਨਾ ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭਣਾ ਹੈ',
+'tooltip-n-portal' => 'ਪà©\8dਰà©\8bà¨\9cà©\88à¨\95à¨\9f ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭਣਾ ਹੈ',
 'tooltip-n-currentevents' => 'ਮੌਜੂਦਾ ਸਮਾਗਮ ਬਾਰੇ ਪਿਛਲੀ ਜਾਣਕਾਰੀ ਲੱਭੋ',
 'tooltip-n-recentchanges' => 'ਵਿਕੀ ਵਿੱਚ ਹਾਲ ’ਚ ਹੋਈਆਂ ਬਦਲੀਆਂ ਦੀ ਸੂਚੀ',
 'tooltip-n-randompage' => 'ਇੱਕ ਰਲਵਾਂ ਪੰਨਾ ਲੋਡ ਕਰੋ',
@@ -1984,19 +2049,19 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'tooltip-feed-atom' => 'ਇਸ ਪੰਨੇ ਦੀ ਐਟਮ ਫ਼ੀਡ',
 'tooltip-t-contributions' => 'ਇਸ ਵਰਤੋਂਕਾਰ ਦੇ ਯੋਗਦਾਨ ਦੀ ਸੂਚੀ',
 'tooltip-t-emailuser' => 'ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
-'tooltip-t-upload' => 'à¨\9aਿੱਤਰ à¨\9cਾà¨\82 à¨®à©\80ਡà©\80à¨\86 à¨«à¨¾à¨\88ਲਾà¨\82 à¨\85ੱਪਲੋਡ ਕਰੋ',
-'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨µà¨¿à¨¸à¨¼à©\87ਸ਼ à¨ªà©°à¨¨à¨¿à¨\86à¨\82 à¨¦à©\80 à¨¸à©\82à¨\9aà©\80',
+'tooltip-t-upload' => 'ਤਸਵà©\80ਰ à¨\9cਾà¨\82 à¨®à©\80ਡà©\80à¨\86 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨\85ਪਲੋਡ ਕਰੋ',
+'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨\96਼ਾਸ à¨ªà©°à¨¨à¨¿à¨\86à¨\82 à¨¦à©\80 à¨²à¨¿à¨¸à¨\9f',
 '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-project' => 'ਪਰਿਯà©\8bà¨\9cਨਾ ਪੰਨਾ ਵੇਖੋ',
-'tooltip-ca-nstab-image' => 'ਫ਼ਾà¨\88ਲ à¨ªà©°à¨¨à¨¾ à¨µà©\87à¨\96à©\8b',
+'tooltip-ca-nstab-project' => 'ਪà©\8dਰà©\8bà¨\9cà©\88à¨\95à¨\9f ਪੰਨਾ ਵੇਖੋ',
+'tooltip-ca-nstab-image' => 'ਫਾਈਲ ਪੰਨਾ ਵੇਖੋ',
 'tooltip-ca-nstab-mediawiki' => 'ਸਿਸਟਮ ਸੁਨੇਹੇ ਵੇਖੋ',
 'tooltip-ca-nstab-template' => 'ਸਾਂਚਾ ਵੇਖੋ',
-'tooltip-ca-nstab-help' => 'ਮੱਦਦ à¨ªà©\87à¨\9c ਵੇਖੋ',
+'tooltip-ca-nstab-help' => 'ਮਦਦ à¨ªà©°à¨¨à¨¾ ਵੇਖੋ',
 'tooltip-ca-nstab-category' => 'ਸ਼੍ਰੇਣੀ ਪੰਨਾ ਵੇਖੋ',
 'tooltip-minoredit' => 'ਇਸ ’ਤੇ ਬਤੌਰ ਛੋਟਾ ਬਦਲਾਵ ਨਿਸ਼ਾਨ ਲਾਓ',
 'tooltip-save' => 'ਆਪਣੀਆਂ ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ',
@@ -2005,19 +2070,19 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'tooltip-compareselectedversions' => 'ਇਸ ਪੰਨੇ ਦੇ ਦੋ ਚੁਣੇ ਹੋਏ ਸੋਧਾਂ ਵਿੱਚ ਫ਼ਰਕ ਵੇਖੋ',
 'tooltip-watch' => 'ਇਸ ਪੰਨੇ ਨੂੰ ਆਪਣੀ ਧਿਆਨਸੂਚੀ ਵਿੱਚ ਪਾਓ',
 'tooltip-watchlistedit-normal-submit' => 'ਸਿਰਲੇਖ ਹਟਾਓ',
-'tooltip-watchlistedit-raw-submit' => 'ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨¨à¨µà©\80à¨\82 ਕਰੋ',
-'tooltip-upload' => 'à¨\85ੱਪਲà©\8bਡ à¨¸à¨\9fਾਰà¨\9f ਕਰੋ',
+'tooltip-watchlistedit-raw-submit' => 'ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨¤à¨¾à¨\9c਼ਾ ਕਰੋ',
+'tooltip-upload' => 'à¨\85ਪਲà©\8bਡ à¨¸à¨¼à©\81ਰà©\82 ਕਰੋ',
 'tooltip-rollback' => "''ਵਾਪਸ ਮੋੜੋ'' ਇੱਕ ਹੀ ਕਲਿੱਕ ਨਾਲ ਆਖਰੀ ਯੋਗਦਾਨ ਨੂੰ ਰੱਦ ਕਰ ਦਿੰਦਾ ਹੈ",
 'tooltip-undo' => '"ਉਧੇੜਨਾ" ਇਸ ਬਦਲਾਵ ਨੂੰ ਰੱਦ ਕਰਕੇ ਸੋਧ ਫ਼ਾਰਮ ਨੂੰ ਝਲਕ ਦੇ ਸ਼ੈਲੀ ਵਿੱਚ ਦਿਖਾਉਂਦਾ ਹੈ।
 ਇੰਝ "ਸਾਰ" ਵਿੱਚ ਬਦਲਾਵ ਨਕਾਰਨ ਦਾ ਕਾਰਨ ਲਿਖਿਆ ਜਾ ਸਕਦਾ ਹੈ।',
-'tooltip-preferences-save' => 'ਪਸੰਦਾਂ ਸਾਂਭੋ',
+'tooltip-preferences-save' => 'ਪਸੰਦ ਸੰਭਾਲੋ',
 'tooltip-summary' => 'ਸੰਖੇਪ ਸਾਰ ਦਰਜ ਕਰੋ',
 
 # Attribution
 'lastmodifiedatby' => 'ਇਹ ਸਫ਼ਾ ਆਖ਼ਰੀ ਵਾਰ $1 ਨੂੰ $2 ’ਤੇ $3 ਨੇ ਸੋਧਿਆ ਸੀ।',
 'others' => 'ਹੋਰ',
 'siteusers' => '{{SITENAME}} {{PLURAL:$2|ਵਰਤੋਂਕਾਰ|ਵਰਤੋਂਕਾਰਾਂ}} $1',
-'creditspage' => 'ਪà©\87à¨\9c ਮਾਣ',
+'creditspage' => 'ਪੰਨਾ ਮਾਣ',
 
 # Spam protection
 'spamprotectiontitle' => 'Spam ਸੁਰੱਖਿਆ ਫਿਲਟਰ',
@@ -2029,15 +2094,11 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'pageinfo-edits' => 'ਕੁੱਲ ਸੋਧਾਂ',
 
 # Skin names
-'skinname-standard' => 'ਕਲਾਸਿਕ',
 'skinname-monobook' => 'ਮੋਨੋਬੁੱਕ',
-'skinname-myskin' => 'ਮੇਰੀਸਕਿਨ',
-'skinname-chick' => 'ਚੀਚਕ',
-'skinname-simple' => 'ਸੈਂਪਲ',
 
 # Browsing diffs
-'previousdiff' => 'â\86\90 à¨\87ਸ à¨¤à©\8bà¨\82 à¨ªà©\81ਰਾਣਾ à¨¬à¨¦à¨²à¨¾à¨µ',
-'nextdiff' => 'ਤਾà¨\9cਾ à¨¸à©°à¨ªà¨¾à¨¦à¨¨ →',
+'previousdiff' => 'â\86\90 à¨ªà©\81ਰਾਣà©\80 à¨¤à¨¬à¨¦à©\80ਲà©\80',
+'nextdiff' => 'ਨਵà©\80à¨\82 à¨¤à¨¬à¨¦à©\80ਲà©\80 →',
 
 # Media information
 'thumbsize' => 'ਥੰਮਨੇਲ ਆਕਾਰ:',
@@ -2060,11 +2121,11 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 ਲਾਈਨ ਵਿਚ ਪਹਿਲੀ ਕੜੀ ਗ਼ਲਤ ਫ਼ਾਈਲ ਦੀ ਕੜੀ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ। ਉਸ ਲਾਈਨ ’ਚ ਅੱਗੇ ਦਿਤੀਆਂ ਕੜੀਆਂ ਨੂੰ ਇਤਰਾਜ਼ਯੋਗ ਮੰਨਿਆ ਜਾਵੇਗਾ, ਭਾਵ ਉਹ ਪੰਨੇ ਜਿਨ੍ਹਾਂ ਵਿਚ ਫ਼ਾਈਲ ਕਿਸੇ ਲਾਈਨ ਵਿਚ ਸਥਿਤ ਹੋ ਸਕਦੀ ਹੈ।',
 
 # Metadata
-'metadata' => 'ਮà©\80à¨\9fਾਡਾਟਾ',
+'metadata' => 'ਮà©\80à¨\9fਾਡà©\88ਟਾ',
 'metadata-help' => 'ਇਸ ਫ਼ਾਈਲ ਵਿੱਚ ਵਾਧੂ ਜਾਣਕਾਰੀਆਂ ਹਨ, ਜੋ ਸ਼ਾਇਦ ਉਸ ਕੈਮਰੇ ਜਾਂ ਸਕੈਨਰ ਦੀ ਦੇਣ ਹਨ ਜੋ ਇਸਨੂੰ ਬਣਾਉਣ ਲਈ ਵਰਤਿਆ ਗਿਆ। ਜੇ ਇਸ ਫ਼ਾਈਲ ਵਿੱਚ ਕੋਈ ਤਬਦੀਲੀ ਕੀਤੀ ਗਈ ਹੈ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕੁਝ ਵੇਰਵੇ ਬਦਲੀ ਫ਼ਾਈਲ ਦਾ ਸਹੀ ਰੂਪਮਾਨ ਨਾ ਹੋਣ।',
 'metadata-fields' => 'ਇਸ ਸੁਨੇਹੇ ਵਿੱਚ ਸੂਚੀਬੱਧ ਖੇਤਰ ਚਿੱਤਰ ਪੰਨੇ ’ਚ ਸ਼ਾਮਲ ਕੀਤੇ ਜਾਣਗੇ ਜੋ ਉਦੋਂ ਦਿੱਸਦੇ ਹਨ ਜਦੋ ਮੈਟਾਡੈਟਾ ਖਾਕਾ ਬੰਦ ਹੋਵੇ। ਬਾਕੀ ਉਂਞ ਹੀ ਲੁਕੇ ਹੋਣਗੇ।',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ਚੌੜਾਈ',
 'exif-imagelength' => 'ਉਚਾਈ',
 'exif-samplesperpixel' => 'ਭਾਗਾਂ ਦੀ ਗਿਣਤੀ',
@@ -2104,14 +2165,14 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'exif-gpsspeed-k' => 'ਕਿਲੋਮੀਟਰ ਪ੍ਰਤੀ ਘੰਟਾ',
 'exif-gpsspeed-m' => 'ਮੀਲ ਪ੍ਰਤੀ ਘੰਟਾ',
 
-'exif-iimcategory-war' => 'ਯà©\81ੱਧ, à¨¸à©°à¨\98ਰਸ਼ à¨\85ਤà©\87 à¨\85ਸ਼ਾà¨\82à¨\9fੀ',
+'exif-iimcategory-war' => 'ਯà©\81ੱਧ, à¨¸à©°à¨\98ਰਸ਼ à¨\85ਤà©\87 à¨\85ਸ਼ਾà¨\82ਤੀ',
 'exif-iimcategory-wea' => 'ਮੌਸਮ',
 
 'exif-urgency-normal' => 'ਸਧਾਰਨ ($1)',
 
 # External editor support
-'edit-externally' => 'ਬਾਹਰà©\80 à¨\90ਪਲà©\80à¨\95à©\87ਸ਼ਨ à¨µà¨°à¨¤à¨¦à©\87 à¨¹à©\8bà¨\8f à¨\87ਸ à¨«à¨¼à¨¾à¨\88ਲ à¨¨à©\82à©° à¨¸à©°à¨ªà¨¾à¨¦à¨¨ à¨\95ਰà©\8b।',
-'edit-externally-help' => '(à¨\9c਼ਿà¨\86ਦਾ ਜਾਣਕਾਰੀ ਲਈ [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] ਵੇਖੋ)',
+'edit-externally' => 'ਬਾਹਰà©\80 à¨\90ਪਲà©\80à¨\95à©\87ਸ਼ਨ à¨µà¨°à¨¤à¨¦à©\87 à¨¹à©\8bà¨\8f à¨\87ਸ à¨«à¨¾à¨\88ਲ à¨¨à©\82à©° à¨¸à©\8bਧà©\8b',
+'edit-externally-help' => '(ਹà©\8bਰ ਜਾਣਕਾਰੀ ਲਈ [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] ਵੇਖੋ)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'ਸਭ',
@@ -2120,12 +2181,12 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'limitall' => 'ਸਭ',
 
 # Email address confirmation
-'confirmemail' => 'ਈਮੇਲ ਐਡਰੈੱਸ ਪੁਸ਼ਟੀ',
+'confirmemail' => 'ਈ-ਮੇਲ ਪਤਾ ਤਸਦੀਕ ਕਰੋ',
 'confirmemail_send' => 'ਇੱਕ ਪੁਸ਼ਟੀ ਕੋਡ ਭੇਜੋ',
 'confirmemail_sent' => 'ਪੁਸ਼ਟੀ ਈਮੇਲ ਭੇਜੀ ਗਈ।',
 'confirmemail_invalid' => 'ਗਲਤ ਪੁਸ਼ਟੀ ਕੋਡ ਹੈ। ਕੋਡ ਦੀ ਮਿਆਦ ਪੁੱਗੀ ਹੋ ਸਕਦੀ ਹੈ।',
 'confirmemail_loggedin' => 'ਤੁਹਾਡਾ ਈ-ਮੇਲ ਪਤਾ ਹੁਣ ਤਸਦੀਕ ਹੋ ਚੁੱਕਾ ਹੈ।',
-'confirmemail_subject' => '{{SITENAME}} ਈਮੇਲ ਐਡਰੈੱਸ ਪੁਸ਼ਟੀ',
+'confirmemail_subject' => '{{SITENAME}} ਈ-ਮੇਲ ਪਤਾ ਤਸਦੀਕ',
 
 # Scary transclusion
 'scarytranscludetoolong' => '[URL ਬਹੁਤ ਲੰਬਾ ਹੈ]',
@@ -2137,16 +2198,16 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'confirm_purge_button' => 'ਠੀਕ ਹੈ',
 
 # Multipage image navigation
-'imgmultipageprev' => 'â\86\90 à¨ªà¨¿à¨\9bਲਾ à¨ªà©\87à¨\9c',
-'imgmultipagenext' => 'à¨\85à¨\97ਲਾ à¨ªà©\87à¨\9c →',
+'imgmultipageprev' => 'â\86\90 à¨ªà¨¿à¨\9bਲਾ à¨ªà©°à¨¨à¨¾',
+'imgmultipagenext' => 'à¨\85à¨\97ਲਾ à¨ªà©°à¨¨à¨¾ →',
 'imgmultigo' => 'ਜਾਓ!',
 'imgmultigoto' => '$1 ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ',
 
 # Table pager
-'table_pager_next' => 'à¨\85à¨\97ਲਾ à¨ªà©\87à¨\9c',
-'table_pager_prev' => 'ਪਿà¨\9bਲਾ à¨ªà©\87à¨\9c',
-'table_pager_first' => 'ਪਹਿਲਾ à¨ªà©\87à¨\9c',
-'table_pager_last' => 'à¨\86à¨\96ਰà©\80 à¨ªà©\87à¨\9c',
+'table_pager_next' => 'à¨\85à¨\97ਲਾ à¨ªà©°à¨¨à¨¾',
+'table_pager_prev' => 'ਪਿà¨\9bਲਾ à¨ªà©°à¨¨à¨¾',
+'table_pager_first' => 'ਪਹਿਲਾ à¨ªà©°à¨¨à¨¾',
+'table_pager_last' => 'à¨\86à¨\96਼ਰà©\80 à¨ªà©°à¨¨à¨¾',
 'table_pager_limit' => 'ਹਰੇਕ ਪੇਜ ਲਈ $1 ਆਈਟਮਾਂ',
 'table_pager_limit_label' => 'ਪ੍ਰਤੀ ਸਫ਼ਾ ਆਈਟਮਾਂ:',
 'table_pager_limit_submit' => 'ਜਾਓ',
@@ -2157,18 +2218,18 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'autosumm-new' => '"$1" ਨਾਲ਼ ਸਫ਼ਾ ਬਣਾਇਆ',
 
 # Live preview
-'livepreview-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
-'livepreview-ready' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...ਤਿਆਰ!',
+'livepreview-loading' => '…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ',
+'livepreview-ready' => '…ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। ਤਿਆਰ!',
 
 # Watchlist editor
-'watchlistedit-normal-title' => 'ਧਿà¨\86ਨਸà©\82à¨\9aà©\80 à¨¬à¨¦à¨²ੋ',
+'watchlistedit-normal-title' => 'ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨¸à©\8bਧੋ',
 'watchlistedit-raw-titles' => 'ਟਾਇਟਲ:',
-'watchlistedit-raw-submit' => 'ਧਿà¨\86ਨਸà©\82à¨\9aà©\80 à¨¨à©\82à©° à¨\85ਪਡà©\87à¨\9f ਕਰੋ',
+'watchlistedit-raw-submit' => 'ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨¤à¨¾à¨\9c਼à©\80 ਕਰੋ',
 'watchlistedit-raw-added' => '{{PLURAL:$1|1 title was|$1 titles were}} ਸ਼ਾਮਲ:',
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 title was|$1 titles were}} ਹਟਾਓ:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'à¨\86ਧਾਰਿਤ à¨¬à¨¦à¨²à¨¾à¨µ ਵੇਖੋ',
+'watchlisttools-view' => 'ਸਬੰਧਤ à¨¤à¨¬à¨¦à¨²à©\80à¨\86à¨\82 ਵੇਖੋ',
 'watchlisttools-edit' => 'ਧਿਆਨਸੂਚੀ ਵੇਖੋ ’ਤੇ ਸੰਪਾਦਨ ਕਰੋ',
 'watchlisttools-raw' => 'ਕੱਚੀ ਧਿਆਨਸੂਚੀ ਸੰਪਾਦਨ ਕਰੋ',
 
@@ -2179,14 +2240,10 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'version' => 'ਵਰਜਨ',
 'version-other' => 'ਹੋਰ',
 
-# Special:FilePath
-'filepath-page' => 'ਫਾਈਲ:',
-'filepath-submit' => 'ਜਾਓ',
-
 # Special:SpecialPages
-'specialpages' => 'ਵਿਸ਼à©\87ਸ਼ ਪੰਨੇ',
+'specialpages' => 'à¨\96਼ਾਸ ਪੰਨੇ',
 'specialpages-group-login' => 'ਲਾਗਇਨ / ਖਾਤਾ ਬਣਾਓ',
-'specialpages-group-users' => 'ਵਰਤੋਂਕਾਰਾਂ ਅਤੇ ਅਧਿਕਾਰ',
+'specialpages-group-users' => 'ਵਰਤੋਂਕਾਰ ਅਤੇ ਹੱਕ',
 
 # Special:BlankPage
 'blankpage' => 'ਖ਼ਾਲੀ ਸਫ਼ਾ',
@@ -2202,9 +2259,9 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 #ਸਾਰੇ ਰੈਜੈਕਸ ਫ਼ਰੈਗਮੈਂਟ ਇਸ ਲਾਈਨ ਤੋਂ ਉੱਪਰ ਪਾਓ। ਇਸ ਲਾਈਨ ਨੂੰ ਇੰਝ ਹੀ ਰਹਿਣ ਦਿਓ </pre>",
 
 # Special:Tags
-'tag-filter' => '[[Special:Tags|à¨\9fà©\88à¨\97]] à¨\9bਾਨਣà©\80:',
+'tag-filter' => '[[Special:Tags|à¨\9fà©\88à¨\97]] à¨«à¨¿à¨²à¨\9fਰ:',
 'tags-tag' => 'ਟੈਗ ਦਾ ਨਾਮ',
-'tags-edit' => 'ਸੰਪਾਦਨ',
+'tags-edit' => 'ਸà©\8bਧà©\8b',
 
 # HTML forms
 'htmlform-submit' => 'ਭੇਜੋ',
@@ -2227,14 +2284,14 @@ delete|ਹਟਾਉਣ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'searchsuggest-search' => 'ਖੋਜ',
 
 # Durations
-'duration-seconds' => '$1 {{PLURAL:$1|ਸà©\87à¨\95à©\8bੰਡ|ਵਧà©\87ਰà©\87 à¨¸à©\87à¨\95à©\8bੰਡ}}',
-'duration-minutes' => '$1 {{PLURAL:$1|ਮਿਨà©\81à¨\9f |ਵਧà©\87ਰà©\87 à¨®à¨¿à¨¨à©\81ਟ }}',
-'duration-hours' => '$1 {{PLURAL:$1|à¨\98à©°à¨\9fà©\87 |ਵਧà©\87ਰà©\87 ਘੰਟੇ }}',
-'duration-days' => '$1 {{PLURAL:$1|ਦਿਨ |ਵਧà©\87ਰà©\87 à¨¦à¨¿à¨¨ }}',
-'duration-weeks' => '$1 {{PLURAL:$1|ਹਫ਼ਤà©\87 |ਵਧà©\87ਰà©\87 ਹਫ਼ਤੇ }}',
-'duration-years' => '$1 {{PLURAL:$1|ਸਾਲ |ਵਧà©\87ਰà©\87 à¨¸à¨¾à¨² }}',
-'duration-decades' => '$1 {{PLURAL:$1|ਦਸ਼à¨\95  |ਵਧà©\87ਰà©\87 à¨¦à¨¸à¨¼à¨\95 }}',
-'duration-centuries' => '$1 {{PLURAL:$1|ਸ਼ਤਾਬਦà©\80 |ਵਧà©\87ਰà©\87 à¨¸à¨¼à¨¤à¨¾à¨¬à¨¦à©\80 }}',
+'duration-seconds' => '$1 {{PLURAL:$1|ਸà¨\95ਿੰà¨\9f|ਸà¨\95ਿੰà¨\9f}}',
+'duration-minutes' => '$1 {{PLURAL:$1|ਮਿੰà¨\9f |ਮਿੰਟ }}',
+'duration-hours' => '$1 {{PLURAL:$1|à¨\98à©°à¨\9fਾ |ਘੰਟੇ }}',
+'duration-days' => '$1 {{PLURAL:$1|ਦਿਨ |ਦਿਨ }}',
+'duration-weeks' => '$1 {{PLURAL:$1|ਹਫ਼ਤਾ |ਹਫ਼ਤੇ }}',
+'duration-years' => '$1 {{PLURAL:$1|ਸਾਲ |ਸਾਲ }}',
+'duration-decades' => '$1 {{PLURAL:$1|ਦਹਾà¨\95ਾ  |ਦਹਾà¨\95à©\87 }}',
+'duration-centuries' => '$1 {{PLURAL:$1|ਸà©\8c |ਸà©\8c }}',
 'duration-millennia' => '$1 {{PLURAL:$1|ਸਾਹਸ਼ਤਾਬਦੀ  |ਵਧੇਰੇ ਸਾਹਸ਼ਤਾਬਦੀ  }}',
 
 );
index 5c5ba09..94ce761 100644 (file)
@@ -45,8 +45,6 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'tog-shownumberswatching' => 'Ipakit la reng bilang da reng magbanteng talagamit',
 'tog-oldsig' => 'I-preview ya ing salukuyan a pirma',
 'tog-fancysig' => 'Ituring yang wikitext ing pirma (alang automatic link o tambing a suglung)',
-'tog-externaleditor' => 'Gumamit a pangkilual a editor kapamilatan ning kabud',
-'tog-externaldiff' => 'Tambing kang gumamit aliwa (diff) ibat a panglual',
 'tog-showjumplinks' => 'Salangian la reng suglung a pampabilis (accessibility links) a "luksu king" (jump to)',
 'tog-uselivepreview' => 'Gumamit kang live preview (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Pabaluan mu ku ustung magpalub a blankung edit',
@@ -797,13 +795,6 @@ Tutuking $1 {{PLURAL:$1|result|results}}',
 Samantala, maliari kang maintun kapamilatan ning Google.
 Pakitandanan mung maliaring e no makapanaun deng karelang index king kalamnan ning {{SITENAME}}.',
 
-# Quickbar
-'qbsettings-none' => 'Ala',
-'qbsettings-fixedleft' => 'Makapirmi ya ing kaili',
-'qbsettings-fixedright' => 'Makapirmi ya ing wanan',
-'qbsettings-floatingleft' => 'Kikimut ya ing kaili',
-'qbsettings-floatingright' => 'Kikimut ya ing wanan',
-
 # Preferences page
 'preferences' => 'Pinili',
 'mypreferences' => '↓Deng pinili ku',
@@ -1373,8 +1364,8 @@ click me ing \"Tuknangan ing pamagbante\" (Unwatch) king gilid na ning bulung.",
 'notvisiblerev' => 'Mebura ya itang mibayu (revision)',
 'watchnochange' => 'Alang me-edit kareng kekang babanten ketang panaun a makabili keti.',
 'watchlist-details' => "{{PLURAL:$1|$1 bulung|$1 bulung}} king kekang watchlist, e la kayabe deng ''talk pages''.",
-'wlheader-enotif' => 'Makasalangi (enabled) ing pamipabalu kapamilatan ning e-mail.',
-'wlheader-showupdated' => "'''Makapal''' la pangasulat deng bulung a miyalilan manibat aniang tauli mu lang pintalan.",
+'wlheader-enotif' => 'Makasalangi (enabled) ing pamipabalu kapamilatan ning e-mail.',
+'wlheader-showupdated' => "'''Makapal''' la pangasulat deng bulung a miyalilan manibat aniang tauli mu lang pintalan.",
 'watchmethod-recent' => 'sisimen/susurian la reng bayung mengayalili para kareng bulung a babanten',
 'watchmethod-list' => 'susurian la reng bulung a babanten para kareng bayung mengayalili',
 'watchlistcontains' => 'Atin yang $1 {{PLURAL:$1|a bulung|bulung}} ing kekang tala ring babanten (watchlist).',
@@ -2015,7 +2006,7 @@ Detang aliwa tambing (by default) lang makasalikut.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lapad',
 'exif-imagelength' => 'Katas',
 'exif-bitspersample' => 'Bit balang dake (component)',
@@ -2109,7 +2100,7 @@ Detang aliwa tambing (by default) lang makasalikut.
 'exif-source' => 'Pikuanan',
 'exif-cameraownername' => 'Mikibandi keng paglitratu',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'E makapitpit (uncompressed)',
 
 'exif-unknowndate' => 'E makabili ing petsa',
@@ -2321,11 +2312,6 @@ Mayari/mapasu ya ining confirmation code keng $4.',
 'version-software-product' => 'Produktu',
 'version-software-version' => 'Bersion',
 
-# Special:FilePath
-'filepath' => 'Dalan ning simpan (file path)',
-'filepath-page' => 'Simpan (file):',
-'filepath-submit' => 'Dalan',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Maintun simpan (file) a kapareu',
 'fileduplicatesearch-legend' => 'Maintun kapareu',
index 8beee8e..64377fa 100644 (file)
@@ -755,7 +755,7 @@ Vir l'pache [$2 édseur Commons].",
 'listgrouprights-summary' => "L'pache-lo ch'est ène lisse d'chés groupes d'uzeus définis édseur ech wiki aveuc chés drouots d'intrèe achuchonnés.<br />I put y avoèr ichi d'eutes [[MediaWiki:Listgrouprights-helppage|informacions]] édseur chés drouots individuèls. ([[{{MediaWiki:Listgrouprights-helppage}}|vir]])",
 'listgrouprights-members' => '(lisse éd chés mimbes)',
 
-# E-mail user
+# Email user
 'emailuser' => "Imèle echl'uzeu-lo",
 'emailpage' => 'Imèle dech uzeu',
 
@@ -1059,9 +1059,6 @@ Chés eutes cans is s'ront muchés pèr défeut.
 # Special:Version
 'version-specialpages' => 'Paches éspéchiales',
 
-# Special:FilePath
-'filepath-page' => 'Fichié :',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dénicher chés doublons',
 
index ab3f5ce..f52d5d3 100644 (file)
@@ -420,9 +420,6 @@ Paesswatt fer nau: $2',
 'powersearch-togglenone' => 'Ken',
 'search-external' => 'Guck im Gewebb',
 
-# Quickbar
-'qbsettings-none' => 'Ken',
-
 # Preferences page
 'preferences' => 'Paerseenlich Profil',
 'mypreferences' => 'Uffschtellinge',
@@ -677,7 +674,7 @@ Paesswatt fer nau: $2',
 'listgrouprights-addgroup' => 'Yuuser zu {{PLURAL:$2|daer Druppe|denne Druppe}} dezu duh: $1',
 'listgrouprights-addgroup-all' => 'Yuuser zu alle Druppe dezu duh',
 
-# E-mail user
+# Email user
 'emailuser' => 'E-Poschd fer den Yuuser',
 'defemailsubject' => '{{SITENAME}} - E-Poschde vun Yuuser „$1“',
 'emailusername' => 'Yuuser-Naame:',
@@ -906,7 +903,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 # Metadata
 'metadata' => 'Metadaade',
 
-# EXIF tags
+# Exif tags
 'exif-imagelength' => 'Leng',
 'exif-software' => 'Geyuust Software',
 'exif-usercomment' => 'Anmaerrickinge vun Yuuser',
@@ -976,11 +973,6 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 'version-poweredby-others' => 'annere',
 'version-software-version' => 'Version',
 
-# Special:FilePath
-'filepath' => 'Feilpaad',
-'filepath-page' => 'Feil:',
-'filepath-submit' => 'Geh',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Feilnaame:',
 'fileduplicatesearch-submit' => 'Uffgucke',
index aa4e5f9..013c818 100644 (file)
@@ -547,25 +547,15 @@ Dee Grunt es: "$2"',
 
 # Stylesheets
 'common.css' => '/* CSS opp dise Sted woat opp aula Skins wirtje */',
-'standard.css' => '/* CSS opp dise Sted wirtjt opp dem Standard-Skin */',
-'nostalgia.css' => '/* CSS opp dise Sted wirtjt opp daut Nostalgia-Skin */',
 'cologneblue.css' => '/* CSS opp dise Sted wirtjt opp daut Keloonsch-Blau-Skin */',
 'monobook.css' => '/* CSS opp dise Sted wirtjt opp daut Monobook-Skin */',
-'myskin.css' => '/* CSS opp dise Sted wirtjt opp daut MySkin-Skin */',
-'chick.css' => '/* CSS opp dise Sted wirtjt opp daut Chick-Skin */',
-'simple.css' => '/* CSS opp dise Sted wirtjt opp daut Simple-Skin */',
 'modern.css' => '/* CSS opp dise Sted wirtjt opp daut Modern-Skin */',
 'print.css' => '/* CSS opp dise Sted woat daut Utkome vom Dretje aundasch moake */',
 
 # Scripts
 'common.js' => '/* Daut neachste JavaScript woat fe aula Brucka jelode. */',
-'standard.js' => '/* Daut neachste JavaScript woat fe Brucka mett Standard-Skin jelode. */',
-'nostalgia.js' => '/* Daut neachste JavaScript woat fe Brucka mett Nostalgie-Skin jelode. */',
 'cologneblue.js' => '/* Daut neachste JavaScript woat fe Brucka mett Keloonsch-Blau-Skin jelode */',
 'monobook.js' => '/* Daut neachste JavaScript woat fe Brucka mett Monobook-Skin jelode */',
-'myskin.js' => '/* Daut neachste JavaScript woat fe Brucka mett MySkin-Skin jelode */',
-'chick.js' => '/* Daut neachste JavaScript woat fe Brucka mett Chick-Skin jelode */',
-'simple.js' => '/* Daut neachste JavaScript woat fe Brucka mett Eenfach-Skin jelode */',
 'modern.js' => '/* Daut neachste JavaScript woat fe Brucka mett Modern-Skin jelode. */',
 
 # Metadata
index 60a8a21..32cfc57 100644 (file)
@@ -56,12 +56,18 @@ $namespaceAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-showtoolbar' => "Werkzaich zum Bearwaide zaische (dodezu brauchd's JavaScript)",
-'tog-showhiddencats' => 'Zaisch vaschdeglde Kadegorije',
+'tog-underline' => 'Lingg unnaschdraische',
+'tog-showtoolbar' => "Wergzaisch fas Beawaide zaische (dodezu brauchd's JavaScript)",
+'tog-showjumplinks' => 'Schdellde "Hubs uff"-Lingg o',
+'tog-showhiddencats' => 'Zaisch vaschdeglde Grubbe',
 
-'underline-always' => 'Immer',
-'underline-never' => 'Garnet',
-'underline-default' => 'Des nemme, was em Browser gsaachd hoschd.',
+'underline-always' => 'Imma',
+'underline-never' => 'Gaaned',
+'underline-default' => 'Des nemme, wum Browser gsachd hoschd.',
+
+# Font style option in Special:Preferences
+'editfont-sansserif' => 'Sans-serif Schrifd',
+'editfont-serif' => 'Serif Schrifd',
 
 # Dates
 'sunday' => 'Sundaach',
@@ -78,32 +84,32 @@ $messages = array(
 'thu' => 'Du',
 'fri' => 'Fr',
 'sat' => 'So',
-'january' => 'Jänner',
-'february' => 'Fewwer',
+'january' => 'Janua',
+'february' => 'Februa',
 'march' => 'März',
 'april' => 'Abril',
 'may_long' => 'Mai',
 'june' => 'Juni',
 'july' => 'Juli',
 'august' => 'Auguschd',
-'september' => 'Sebdember',
-'october' => 'Ogdower',
-'november' => 'Nowember',
-'december' => 'Dezember',
-'january-gen' => 'Jänner',
-'february-gen' => 'Fewwer',
+'september' => 'Sebdemba',
+'october' => 'Ogdowa',
+'november' => 'Nowemba',
+'december' => 'Dezemba',
+'january-gen' => 'Janua',
+'february-gen' => 'Februa',
 'march-gen' => 'März',
 'april-gen' => 'Abril',
 'may-gen' => 'Mai',
 'june-gen' => 'Juni',
 'july-gen' => 'Juli',
 'august-gen' => 'Auguschd',
-'september-gen' => 'Sebdember',
-'october-gen' => 'Ogdower',
-'november-gen' => 'Nowember',
-'december-gen' => 'Dezember',
-'jan' => 'Jän',
-'feb' => 'Few',
+'september-gen' => 'Sebdemba',
+'october-gen' => 'Ogdowa',
+'november-gen' => 'Nowemba',
+'december-gen' => 'Dezemba',
+'jan' => 'Jan',
+'feb' => 'Feb',
 'mar' => 'Mär',
 'apr' => 'Abr',
 'may' => 'Mai',
@@ -116,306 +122,403 @@ $messages = array(
 'dec' => 'Dez',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kadegorie|Kadegorie}}',
-'category_header' => 'Saide in de Kadegorie „$1“',
-'subcategories' => 'Unnerkadegorie',
-'category-media-header' => 'Medie in de Kadegorie „$1“',
-'hidden-categories' => '{{PLURAL:$1|Verschdegelde Kadegorie|Verschdegelde Kadegorije}}',
-'hidden-category-category' => 'Verschdegelde Kadegorije',
-'category-subcat-count' => '{{PLURAL:$2|Die Kategorie hot die Unnerkategorie:|{{PLURAL:$1|Die Unnerkategori isch eni vun insgsamt $2 Unnerkategorie in derre Kategorie:|S werre $1 vun insgsamt $2 Unnerkategorie in derre Kategorie aagezeicht:}}}}',
-'category-article-count' => "{{PLURAL:$2|In derre Kadegorie hot's numme die Said.|Die {{PLURAL:$1|Said|$1 Saide}} gebbt's in derre Kadegorie, vun insgsamt $2.}}",
-'listingcontinuesabbrev' => '(Forts.)',
-
-'about' => 'Iwwer',
-'newwindow' => '(werd im e naie Fenschter uffgmacht)',
-'cancel' => 'Abbreche',
+'pagecategories' => '{{PLURAL:$1|Grubb|Grubbe}}',
+'category_header' => 'Saide in de Grubb „$1“',
+'subcategories' => 'Unnagrubbe',
+'category-media-header' => 'Medije inde Grubb „$1“',
+'category-empty' => '"Die Grubb hod kä Said odda Medije."',
+'hidden-categories' => '{{PLURAL:$1|Vaschdegldi Grubb|Vaschdeglde Grubbe}}',
+'hidden-category-category' => 'Verschdegelde Grubbe',
+'category-subcat-count' => '{{PLURAL:$2|Die Grubb hod bloß die Unnagrubb.|Die Grubb hod {{PLURAL:$1|Unnagrubbe|$1 Unnagrubbe}},vun gsomd $2.}}',
+'category-article-count' => '{{PLURAL:$2|Inde Grubb hodss nua die Said.|Die {{PLURAL:$1|Said|$1 Saide}} gibbds inde Grubb, vun gsomd $2.}}',
+'category-file-count' => "{{PLURAL:$2|Die Grubb hod bloß ä Said.|Die {{PLURAL:$1|Said isch äni vun $2 Saide:|S'werren $1 vun gsomd $2 Saide gzaischd:}}}}",
+'listingcontinuesabbrev' => '(Fords.)',
+'noindex-category' => 'Saide, wu ned im Vazaischnis sinn',
+
+'about' => 'Iwwa',
+'newwindow' => '(werd inem naije Fenschda uffgmachd)',
+'cancel' => 'Abbresche',
+'moredotdotdot' => 'Mea …',
 'mypage' => 'Said',
 'mytalk' => 'Dischbediere',
 'navigation' => 'Nawigadzion',
 
 # Cologne Blue skin
 'qbfind' => 'Finne',
-'qbedit' => 'Bearwaide',
-'qbmyoptions' => 'Mai Saide',
+'qbbrowse' => 'Duaschschdewere',
+'qbedit' => 'Beawaide',
+'qbpageoptions' => 'Die Said',
+'qbmyoptions' => 'Moi Saide',
 'faq' => 'Ofd gschdeldi Froche',
 
 # Vector skin
+'vector-action-addsection' => 'Abschnidd dzufiesche',
 'vector-action-delete' => 'Lesche',
-'vector-action-move' => 'Verschiewe',
+'vector-action-move' => 'Vaschiewe',
 'vector-action-protect' => 'Schidze',
-'vector-view-edit' => 'Bearwaide',
+'vector-action-undelete' => 'Zriggbringe',
+'vector-view-create' => 'Oleesche',
+'vector-view-edit' => 'Beawaide',
 'vector-view-history' => 'Dadaigschischd',
 'vector-view-view' => 'Lese',
-'actions' => 'Agzione',
-'namespaces' => 'Nomensreem',
+'vector-view-viewsource' => 'Gwelltegschd zaische',
+'actions' => 'Maßnohme',
+'namespaces' => 'Nomensreum',
+'variants' => 'Tibbe',
 
-'errorpagetitle' => 'Fehler',
+'errorpagetitle' => 'Irrdumm',
 'returnto' => 'Zrick zu $1.',
 'tagline' => 'Vun {{SITENAME}}',
-'help' => 'Hilf',
-'search' => 'Suche',
-'searchbutton' => 'Suche',
-'go' => 'Adiggel',
-'searcharticle' => 'Suche',
-'history' => 'Gschichd vun de Said',
-'history_short' => 'Versione',
-'printableversion' => 'Drugg-Aasicht',
-'permalink' => 'Permanentlink',
-'print' => 'Ausdrugge',
-'view' => 'Lese',
-'edit' => 'Bearwaide',
-'create' => 'Aaleche',
-'editthispage' => 'Die Said bearwaide',
+'help' => 'Unaschdidzung',
+'search' => 'Nochgugge',
+'searchbutton' => 'Gugg',
+'go' => 'Ausfiere',
+'searcharticle' => 'Ausfiare',
+'history' => 'Gschischd vunde Said',
+'history_short' => 'Gschischd',
+'printableversion' => 'Drugg-Asischd',
+'permalink' => 'Schdendischa Lingg',
+'print' => 'Drugge',
+'view' => 'Ogugge',
+'edit' => 'Beawaide',
+'create' => 'Aleesche',
+'editthispage' => 'Die Said beawaide',
 'delete' => 'Lesche',
-'undelete_short' => '{{PLURAL:$1|ä Ännerung|$1 Ännerunge}} widderherschdelle',
+'deletethispage' => 'Lesch die Said',
+'undelete_short' => '{{PLURAL:$1|ä Ännarung|$1 Ännarunge}} widdaheaschdelle',
+'viewdeleted_short' => 'Zaisch {{PLURAL:$1|ä gleschdi Ännarung|$1 gleschde Ännarunge}}',
 'protect' => 'schidze',
-'protect_change' => 'ännere',
+'protect_change' => 'ännare',
 'protectthispage' => 'Die Said schidze',
-'unprotect' => 'Saideschudz änare',
-'newpage' => 'Naie Said',
-'talkpage' => 'Iwwer die Said dischbediere',
+'unprotect' => 'Saideschudz ännare',
+'newpage' => 'Naiji Said',
+'talkpage' => 'Iwwa die Said dischbediere',
 'talkpagelinktext' => 'Dischbediere',
-'personaltools' => 'Perseenliche Werkzeische',
+'personaltools' => 'Persenlischs Wergzaisch',
+'postcomment' => 'Naije Abschnidd',
 'talk' => 'Dischbediere',
-'views' => 'Wievielmol aageguckt',
-'toolbox' => 'Werkzaisch',
-'otherlanguages' => 'In annere Schbroche',
-'redirectedfrom' => '(Wairrerglaidet vun $1)',
-'redirectpagesub' => 'Wairerlaidungssaid',
-'lastmodifiedat' => 'Die Said isch zum ledschde Mol gänneret worre am $1, am $2.',
-'viewcount' => 'Die Seid isch bis jetzerd {{PLURAL:$1|$1|$1}} mol uffgerufe worre.',
-'jumpto' => 'Spring zu:',
-'jumptonavigation' => 'Navigation',
-'jumptosearch' => 'Suche',
+'views' => 'Uffruf',
+'toolbox' => 'Wergzaischkischd',
+'viewtalkpage' => 'Zaischs Gbabbl',
+'otherlanguages' => 'In annare Schbroche',
+'redirectedfrom' => '(Nochgschiggd vun $1)',
+'redirectpagesub' => 'Nochschigg-Said',
+'lastmodifiedat' => 'Die Said ischs ledschde Mol gännad worre om $1, om $2.',
+'viewcount' => 'Die Said isch bis jedz {{PLURAL:$1|$1|$1}} mol uffgrufe worre.',
+'protectedpage' => 'Said schidze',
+'jumpto' => 'Hubs uff:',
+'jumptonavigation' => 'Nawigadzion',
+'jumptosearch' => 'Nochgugge',
+'pool-errorunknown' => 'Ubkonnde Irrdumm',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Iwwer {{SITENAME}}',
-'aboutpage' => 'Project:Iwwer',
-'copyright' => 'Was do drin schdeht isch unner $1 verfiechbar.',
-'copyrightpage' => '{{ns:project}}:Urhewerrecht',
-'currentevents' => 'Was grad so bassierd isch',
-'currentevents-url' => 'Project: Leschdi Eraigniss',
+'aboutsite' => 'Iwwa {{SITENAME}}',
+'aboutpage' => 'Project:Iwwa',
+'copyright' => 'Was do drin schded isch unna $1 vafieschba.',
+'copyrightpage' => '{{ns:project}}:Urhewareschd',
+'currentevents' => 'Aggduelli Gscheniss',
+'currentevents-url' => 'Project: Leschdi Gschneniss',
 'disclaimers' => 'Hafdungsausschluß',
 'disclaimerpage' => 'Project:Impressum',
-'edithelp' => 'Hilf fers Bearwaide',
-'edithelppage' => 'Help:Ännere',
+'edithelp' => 'Unaschdizung fas Beawaide',
+'edithelppage' => 'Help:Ännare',
 'helppage' => 'Help:Inhald',
-'mainpage' => 'Hääptsaid',
-'mainpage-description' => 'Startseid',
+'mainpage' => 'Schdadsaid',
+'mainpage-description' => 'Schdadsaid',
 'portal' => '{{SITENAME}}-Bordal',
 'portal-url' => 'Project:Gmoinschafdsbordal',
-'privacy' => 'Dadeschuds',
-'privacypage' => 'Project:Daadeschutz',
+'privacy' => 'Daadeschuds',
+'privacypage' => 'Project:Daadeschuds',
 
-'badaccess' => 'Kää ausraichende Reschd',
+'badaccess' => 'Ned genuch Reschd',
 
+'ok' => 'Alla gud',
 'retrievedfrom' => 'Vun "$1"',
-'youhavenewmessages' => 'Du hoscht $1 ($2).',
-'newmessageslink' => 'naie Nochrischde',
-'newmessagesdifflink' => 'ledschde Ännerung',
-'editsection' => 'bearwaide',
-'editold' => 'bearwaide',
-'viewsourceold' => 'Quelltegschd ogugge',
-'editlink' => 'bearwaide',
-'viewsourcelink' => 'Quell aagugge',
-'editsectionhint' => 'Abschnidd ännere: $1',
+'youhavenewmessages' => 'Du hoschd $1 ($2).',
+'newmessageslink' => 'naije Nochrischde',
+'newmessagesdifflink' => 'ledschdi Ännarung',
+'editsection' => 'beawaide',
+'editold' => 'beawaide',
+'viewsourceold' => 'Gwelltegschd ogugge',
+'editlink' => 'beawaide',
+'viewsourcelink' => 'Gwell aagugge',
+'editsectionhint' => 'Deel ännare: $1',
 'toc' => 'Inhald',
 'showtoc' => 'zaische',
-'hidetoc' => 'versteggle',
-'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 (Said gebbds nid)',
+'hidetoc' => 'vaschdeggle',
+'collapsible-collapse' => 'Oiglabbe',
+'viewdeleted' => '$1 zaische?',
+'restorelink' => '{{PLURAL:$1|ä gleschdi Ännarung|$1 gleschde Ännarunge}}',
+'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 (Said gibbds ned)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Said',
-'nstab-user' => 'Benutzersaid',
-'nstab-media' => 'Media',
-'nstab-special' => 'Spezialsaid',
+'nstab-user' => 'Benudzersaid',
+'nstab-media' => 'Medije',
+'nstab-special' => 'Schbezialsaid',
 'nstab-project' => 'Bordal',
-'nstab-image' => 'Dadei',
-'nstab-mediawiki' => 'Mitdeelung',
-'nstab-template' => 'Vorlaach',
-'nstab-help' => 'Hilf',
+'nstab-image' => 'Dadai',
+'nstab-mediawiki' => 'Middeelung',
+'nstab-template' => 'Vorlach',
+'nstab-help' => 'Unaschdidzung',
 'nstab-category' => 'Kadegorie',
 
 # General errors
-'missing-article' => "De Text fer „$1“ $2 isch inde Daadebong'g nit gfunne worre.
+'error' => 'Irrdumm',
+'missing-article' => 'De Tegschd fa „$1“ $2 isch inde Daadebongg ned gfunne worre.
 
-Normalerwais hääßd des, dass die Said gleschd worre isch.
+Noamalawees heeßd des, dass die Said gleschd worre isch.
 
-Wenns des nit isch, hoschd villaischd en Fehler in de Daadebong'g gfunne.
-Bidde meldsm [[Special:ListUsers/sysop|Adminischdrador]], un gebb d URL dezu aa.",
+Wonnse des awwa ned isch, hoschd villaischdn Irddumm inde Daadebongg gfunne.
+Bidde meldsm [[Special:ListUsers/sysop|Adminischdrador]], un gebbde URL dzu aa.',
 'missingarticle-rev' => '(Versionsnummer#: $1)',
 'badtitle' => 'Schleschde Didl',
-'badtitletext' => 'De Titel vun de aageforderte Said isch nid giltich, leer, odder e nid giltiche Link vun eme annere Wiki.
-S kann sai, dass es ää odder meh Zaiche drin hot, wu im Titel vun de Said nid gebraucht werre därfe.',
-'viewsource' => 'Quelltegschd bedrachde',
+'badtitletext' => 'De Tidl vunde aagefordad Said isch nid gildisch, leer, oddan nid gildische Lingg vunem annare Wiki.
+S kann sai, dass es ää odda meh Zaische drin hod, wu im Tidl vunde Said nid gbrauchd werre dirfn.',
+'viewsource' => 'Gwelltegschd ogugge',
 
 # Login and logout pages
-'yourname' => 'Benutzername:',
+'welcomeuser' => 'Willkumme, $1!',
+'yourname' => 'Benudzernome:',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => 'Password nomol oigewe:',
-'remembermypassword' => 'Mai Passwort uff dem Computer merke (hechschtens fer $1 {{PLURAL:$1|Dach|Dach}})',
+'remembermypassword' => 'Mai Passwort uffm Computer merge (hegschdns fa $1 {{PLURAL:$1|Daach|Daach}})',
 'login' => 'Omelde',
-'nav-login-createaccount' => 'Aamelde / Benudzerkondo aaleche',
-'userlogin' => 'Omelde / Benutzerkonto anleche',
-'logout' => 'Abmelde',
-'userlogout' => 'Abmelde',
-'nologinlink' => 'E Benutzerkondo aaleche',
-'mailmypassword' => 'Nais Passwort per E-Mail schicke',
+'nav-login-createaccount' => 'Amelde / Benudzerkondo aleesche',
+'loginprompt' => 'Cookies mugschd fa {{SITENAME}} schun ohawe.',
+'userlogin' => 'Omelde / Benudzerkondo oleesche',
+'userloginnocreate' => 'Oilogge',
+'logout' => 'Uffhere',
+'userlogout' => 'Uffhere',
+'nologin' => 'Hoschd noch kä Kondo? $1',
+'nologinlink' => 'E Benudzerkondo aaleesche',
+'createaccount' => 'Bnudza oleesche',
+'gotaccount' => 'Hoschd schun ä Kondo? $1',
+'gotaccountlink' => 'Omelde',
+'userlogin-resetlink' => 'Hoschd doi Daade vagesse?',
+'mailmypassword' => 'Nais Passwort per E-Mail schigge',
+'loginlanguagelabel' => 'Schbrooch: $1',
+
+# Change password dialog
+'resetpass-submit-loggedin' => 'Password wegsle',
+
+# Special:PasswordReset
+'passwordreset-username' => 'Benudza:',
+
+# Special:ChangeEmail
+'changeemail-none' => '(käni)',
+'changeemail-cancel' => 'Uffhere',
 
 # Edit page toolbar
-'bold_sample' => 'Fedde Schrifd',
-'bold_tip' => 'Fedde Schrifd',
-'italic_sample' => 'Kursive Schrifd',
-'italic_tip' => 'Kursive Schrifd',
-'link_sample' => 'Schdischword',
-'link_tip' => 'Interner Link',
-'extlink_sample' => "http://www.example.com Ling'gtegschd",
-'extlink_tip' => 'Externer Link (uff http:// Acht gewwe)',
-'headline_sample' => 'Abschnitts-Iwwerschrift',
-'headline_tip' => 'Iwwerschrift Ewene 2',
-'nowiki_sample' => 'Gebb do en Text ai, wu nit formatiert wird',
-'nowiki_tip' => 'Wiki-Formatierunge ignoriere',
-'image_tip' => 'Bildverwais',
-'media_tip' => 'Dadeilink',
+'bold_sample' => 'Feddi Schrifd',
+'bold_tip' => 'Feddi Schrifd',
+'italic_sample' => 'Schebbi Schrifd',
+'italic_tip' => 'Schebbi Schrifd',
+'link_sample' => 'Schdischwoad',
+'link_tip' => 'Inderna Lingg',
+'extlink_sample' => 'http://www.example.com Linggtegschd',
+'extlink_tip' => 'Exderna Lingg (uff http:// uffbasse)',
+'headline_sample' => 'Schlaachzail',
+'headline_tip' => 'Iwwaschrifd Ewene 2',
+'nowiki_sample' => 'Gebb do en Tegschd ai, wu nit uffberaid werd',
+'nowiki_tip' => 'Wiki-Formatierunge ned beachde',
+'image_tip' => 'Bildvawais',
+'media_tip' => 'Dadailingg',
 'sig_tip' => 'Dai Unnerschrifd mid ener Zaidaagab',
 'hr_tip' => 'Horizontale Linie (sparsam verwenne)',
 
 # Edit pages
-'summary' => 'Zammefassung:',
+'summary' => 'Iwwabligg:',
 'subject' => 'Bedreff:',
 'minoredit' => 'Des isch e klänni Bearwaidung',
-'watchthis' => 'Die Said beowachde',
+'watchthis' => 'Die Said im Aach bhalde',
 'savearticle' => 'Said schbeichere',
 'preview' => 'Voaschau',
-'showpreview' => 'Vorschau zaische',
-'showlivepreview' => 'Live-Vorschau',
-'showdiff' => 'Ännerunge zaische',
-'anoneditwarning' => "'''Warnung:''' Du bischt nit aagemeldt. Dai IP-Adress werd in de Gschichd vum Artikel gspaichert.",
-'summary-preview' => 'Zammefassung:',
+'showpreview' => 'Voaschau zaische',
+'showlivepreview' => 'Live-Voaschau',
+'showdiff' => 'Ännarunge zaische',
+'anoneditwarning' => "'''Baßma uff:''' Du bischd nit aagemeld. Dai IP-Adress werd inde Gschischd vum Adiggl gschbaischad.",
+'summary-preview' => 'Iwwabligg:',
+'blockednoreason' => "s'hod kän Grund",
 'newarticle' => '(Nai)',
 'newarticletext' => "Du bisch eme Link nogange zu re Said, wu s no gar nit gebbt.
 Zum die Said aaleche, kannscht do in dem Käschtel unne aafange mid schraiwe (guck[[{{MediaWiki:Helppage}}|Hilfe]] fer meh Informatione).
 Wenn do nid hin hoscht welle, no druck in Daim Browser uff '''Zrick'''.",
-'noarticletext' => 'Uff derre Said gebbt\'s noch kää Text. Du kannschd uff annere Saide [[Special:Search/{{PAGENAME}}|de Aidrach suche]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbuchaidrach suche, wu dezu ghert],
-orrer [{{fullurl:{{FULLPAGENAME}}|action=edit}} die Said bearwaide]</span>.',
+'noarticletext' => 'Uffde Said hods noch kän Tegschd. Du konnschd uff onnare Saide nochm [[Special:Search/{{PAGENAME}}|Oidrach gugge]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Logbuchaidrach gugge, wu dezu kead],
+odda [{{fullurl:{{FULLPAGENAME}}|action=edit}} die Said beawaide]</span>.',
+'updated' => '(Gännad)',
+'note' => "'''Hiwes:'''",
 'previewnote' => "'''Deng'g droa, dass des numme e Vorschau isch.'''
 Doi Ännerunge sinn no nid gschbaichert worre!",
-'editing' => 'Am $1 bearwaide',
-'editingsection' => '$1 bearwaide (Abschnitt)',
+'editing' => 'Om $1 beawaide',
+'editingsection' => '$1 beawaide (de Deel)',
 'yourtext' => 'Doin Tegschd',
 'storedversion' => 'Gschbaischerdi Version',
 'yourdiff' => 'Unaschied',
-'copyrightwarning' => "Bidde gebb achd, dass alle Baidräch zu {{SITENAME}} unner $2 vereffentlischd werre (guck $1 fer mehr Details).
-Wenn du nit willschd, dass deswu du gschriwwe hoschd, gänneret un kopierd werre kann, dann duu s do nit naischraiwe.<br />
-du gebbschd do au zu, dass Du des selwerschd gschriwwe hoschd orrer vun ere effendliche, fraie Quell ('''public domain''') orrer vun ere ähnliche fraie Quell her hoschd.
-'''SCHRAIB DO NIX NAI, WAS URHEWERRECHDLICH GSCHIZD ISCH!'''",
-'templatesused' => '{{PLURAL:$1|Vorlach wu uff derre Said gbrauchd werd|Vorlache wu uff derre Said gbrauchd werre}}:',
-'templatesusedpreview' => '{{PLURAL:$1|Vorlach wu in derre Vorschau gbrauchd werd|Vorlache wu in derre Vorschau gbrauchd werre}}:',
+'copyrightwarning' => "Baß uff, dass alli Baidräch fa {{SITENAME}} unna $2 vaeffendlischd werren (gugg $1 fa mea Enzlhaide).
+Wonnsda ned basse dud, dass des wu gschriwwe hoschd, gännad un kopiead werre konn, donn duus do ned noischraiwe.<br />
+Du gibbschd do a zu, dasses selwaschd gschriwwe hoschd odda vuna effendlischi, fraiji Gwell ('''public domain''') odda vuna ähnlichi fraiji Gwell hawe duschd.
+'''Du do nix noi schraiwe, wa unnam Uahewareschd gschizd isch!'''",
+'templatesused' => '{{PLURAL:$1|Vorlach wu uffde Said gbrauchd werd|Vorlache wu uffde Saide gbrauchd werren}}:',
+'templatesusedpreview' => '{{PLURAL:$1|Vorlach wu inde Vorschau gbrauchd werd|Vorlache wu inde Vorschau gbrauchd werren}}:',
 'template-protected' => '(gschizd)',
-'template-semiprotected' => '(halb-gschizd)',
+'template-semiprotected' => '(halwa-gschizd)',
 'hiddencategories' => 'Die Said ghert zu {{PLURAL:$1|1 versteckelte Kategorie|$1 versteckelte Kategorie}}:',
-'permissionserrorstext-withaction' => 'Du därfscht nid $2, aus {{PLURAL:$1|dem Grund|denne Grind}}:',
+'permissionserrorstext-withaction' => 'Du därfscht nid $2, wesche{{PLURAL:$1|m Grund|de Grind}}:',
+'recreate-moveddeleted-warn' => "'''Baßma uff: Du magschd do ä Said, wuma frija schumol geleschd kabd hod.'''",
 'moveddeleted-notice' => 'Die Said isch gleschd worre.
 De Leschaidrach fa die Said isch do unne als Kwell aagewwe.',
 
+# Content models
+'content-model-css' => 'CSS',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Baßma uff:''' Greeß vunde Vorlach isch iwwaschridde. Oinischi Vorlache werren ned bnuzd.",
+'post-expand-template-inclusion-category' => 'Saide mid Vorlache, wu die Greeß iwwaschridde worre isch',
+'post-expand-template-argument-warning' => "'''Baßma uff:''' Die Said hod wenigschdns ä Vorlach mida Kenngreeß, wu groß werre dud. Die Kenngreeß wead do ned ogeguggd.",
+
 # History pages
 'viewpagelogs' => 'Lochbischer fer die Said aagucke',
 'currentrev' => 'Ledschdi Änarung',
-'currentrev-asof' => 'Agduell Version vun $1',
-'revisionasof' => 'Version vun $1',
-'previousrevision' => '← Äldere Versione',
-'nextrevision' => 'Naiere Versione →',
-'currentrevisionlink' => 'Agduell Version',
-'cur' => 'jetzert',
-'next' => 'Negschde',
-'last' => 'vorich',
+'currentrev-asof' => 'Agduell Ausgab vun $1',
+'revisionasof' => 'Iwwaawaidung vun $1',
+'revision-info' => 'Ännarung vun $1 duasch $2',
+'previousrevision' => '← Älderi Beawaidung',
+'nextrevision' => 'Naijare Ausgab →',
+'currentrevisionlink' => 'Agduell Ausgab',
+'cur' => 'jedzischi',
+'next' => 'Negschd',
+'last' => 'vorischi',
+'page_first' => 'Easchd',
+'page_last' => 'Ledschd',
 'histlegend' => "Du kannscht zwää Versione auswähle un verglaiche.<br />
 Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 '''({{int:last}})''' = Unnerschied zu de voriche Version, '''{{int:minoreditletter}}''' = klenni Ännerung.",
-'history-fieldset-title' => 'In de Versionsgschichd gugge',
+'history-fieldset-title' => 'Gugg die Gschischd',
+'history-show-deleted' => 'Bloß gleschdi Saide zaische',
 'histfirst' => 'Ältschde',
 'histlast' => 'Naischde',
+'historyempty' => '(lea)',
 
 # Revision feed
 'history-feed-item-nocomment' => '$1 om $2',
 
 # Revision deletion
 'rev-delundel' => 'zaisch/verschdeggle',
+'rev-showdeleted' => 'zaische',
 'revdelete-show-file-submit' => 'Ja',
+'revdelete-radio-same' => '(dudo nix ännare)',
 'revdelete-radio-set' => 'Ja',
 'revdelete-radio-unset' => 'Nä',
-'revdelete-submit' => 'Uff die gewehld {{PLURAL:$1|Version|Versione}} owende',
-'revdel-restore' => 'Sischdbakaid ännere',
-'revdel-restore-deleted' => 'gleschdi Änarunge',
-'revdel-restore-visible' => 'sischdbari Änarunge',
+'revdelete-submit' => 'Uff die {{PLURAL:$1|gewehld Asugab|gewehldi Ausgawe}} owende',
+'revdel-restore' => 'Sischdbakaid ännare',
+'revdel-restore-deleted' => 'gleschdi Ännarunge',
+'revdel-restore-visible' => 'sischdbari Ännarunge',
+'pagehist' => 'Gschischd vunde Said',
+
+# History merging
+'mergehistory-go' => 'Zaisch, wasma vaoinische konn',
 
 # Merge log
-'revertmerge' => 'Zammefiehrung rickgängich mache',
+'revertmerge' => 'Zammefiehrung rigggängisch mache',
 
 # Diffs
-'history-title' => 'Änarungsgschischd vun "$1"',
+'history-title' => 'Ännarungsgschischd vun "$1"',
 'lineno' => 'Zail $1:',
-'compareselectedversions' => 'Die Versione mitenonner vergleiche',
-'editundo' => 'zerigg',
+'compareselectedversions' => 'Ausgawe midnonna vaglaische',
+'showhideselectedversions' => 'Zaisch/Vaschdeggl gwehldi Ausgawe',
+'editundo' => 'zriggnemme',
 
 # Search results
-'searchresults' => 'Ergebnis suche',
-'searchresults-title' => 'Ergebnis suche fer "$1"',
-'searchresulttext' => 'Fer mehr Informatione iwwer d Such in {{SITENAME}}, guck emol uff [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Du hoscht no \'\'\'[[:$1]]\'\'\' gesucht ([[Special:Prefixindex/$1|alle Saide wo mit "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Saide wo uf "$1" verlinkt sin]])',
-'searchsubtitleinvalid' => "Du hoscht '''$1''' gsucht",
-'notitlematches' => 'Kää Saidetitel gfunne',
-'notextmatches' => 'Kää Iwwerainstimmunge mit Inhalde',
-'prevn' => 'voriche {{PLURAL:$1|$1}}',
-'nextn' => 'negschte {{PLURAL:$1|$1}}',
-'prevn-title' => 'Frijari $1 {{PLURAL:$1|result|Ergewnis}}',
-'nextn-title' => 'Negschdi $1 {{PLURAL:$1|result|Ergewnis}}',
-'shown-title' => 'Zaisch $1 {{PLURAL:$1|Ergewnis}} vunde Said',
+'searchresults' => 'Eagewnis nochgugge',
+'searchresults-title' => 'Eagewnis gugge fa "$1"',
+'searchresulttext' => 'Fa mea Ogawe iwwas Nochgugge uff {{SITENAME}}, guggmol uff [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Du hoschd noch \'\'\'[[:$1]]\'\'\' geguggd ([[Special:Prefixindex/$1|alle Saide, wu mid "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Saide, wu uff "$1" valinggd sinn]])',
+'searchsubtitleinvalid' => "Du hoschd '''$1''' gsuchd",
+'notitlematches' => 'Kän Saidedidl gfunne',
+'notextmatches' => 'Kä Iwwaoinschdimmunge midm Tegschd',
+'prevn' => 'vorisch {{PLURAL:$1|$1}}',
+'nextn' => 'negschd {{PLURAL:$1|$1}}',
+'prevn-title' => 'Frijari $1 {{PLURAL:$1|Ergewnis|Ergewnis}}',
+'nextn-title' => 'Negschdi $1 {{PLURAL:$1|Ergewnis|Ergewnis}}',
+'shown-title' => 'Zaisch $1 {{PLURAL:$1|Ergewnis}} bro Said',
 'viewprevnext' => 'Gugg ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Dohods ä Said \"[[:\$1]]\".'''",
+'searchmenu-new' => "'''Mach die Said „[[:$1]]“ im Wiki.'''",
+'searchprofile-articles' => 'Inhald',
+'searchprofile-project' => 'Hilf- un Brojegdsaide',
+'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Alles',
+'searchprofile-advanced' => 'Foadgschridde',
 'searchprofile-articles-tooltip' => 'In $1 gugge',
 'searchprofile-project-tooltip' => 'In $1 gugge',
-'searchprofile-images-tooltip' => 'Gugg noch Bilder',
-'searchprofile-advanced-tooltip' => 'Gugg in onare Nomensraim',
-'search-result-size' => '$1 ({{PLURAL:$2|1 Word|$2 Wärder}})',
-'search-redirect' => '(Wairerlaitung $1)',
-'search-section' => '(Abschnitt $1)',
-'search-suggest' => 'Hoscht gemäänt: $1',
+'searchprofile-images-tooltip' => 'Gugg noch Bilda',
+'searchprofile-everything-tooltip' => 'Such iwwaraal (a wuma dischbedierd)',
+'searchprofile-advanced-tooltip' => 'Gugg in onare Nomensreum',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Word|$2 Wärda}})',
+'search-redirect' => '(Waidalaidung $1)',
+'search-section' => '(Abschnidd $1)',
+'search-suggest' => 'Hoschd gemäänd: $1',
 'search-interwiki-caption' => 'Schweschterprojekt',
 'search-interwiki-default' => '$1 Ergebnis:',
 'search-interwiki-more' => '(meh)',
+'search-relatedarticle' => 'Vawond',
+'mwsuggest-disable' => 'Schald Voaschlesch ab',
+'searchrelated' => 'vawond',
 'searchall' => 'alle',
+'showingresultsheader' => "{{PLURAL:$5|Ergewnis '''$1''' vun '''$3'''|Ergewnis '''$1–$2''' vun '''$3'''}} fa '''$4'''",
 'nonefound' => "'''Hiiwais:''' S werre standardmäßich numme e Dail Namensraim durchsucht. Setz ''all:'' vor Dai Suchbegriff zum alle Saide (mit Dischbediersaide, Voalaache usw.) durchsuche odder direkt de Name vum Namensraum, wu durchsucht werre sell.",
 'search-nonefound' => 'Fa die Such hods kä Ergewnis.',
 'powersearch' => 'Erwaiterte Such',
 'powersearch-legend' => 'Erwaiterte Such',
 'powersearch-ns' => 'In de Namensraim suche:',
-'powersearch-redir' => 'Wairerlaitunge aazaiche',
+'powersearch-redir' => 'Waiderlaidunge aazaische',
 'powersearch-field' => 'Suche noch',
+'powersearch-togglelabel' => 'Wehl:',
+'powersearch-toggleall' => 'Alli',
 'powersearch-togglenone' => 'Kään',
 
-# Quickbar
-'qbsettings-none' => 'Kään',
-
 # Preferences page
-'preferences' => 'Optione',
-'mypreferences' => 'Oistellunge',
-'saveprefs' => 'Oischdellunge schbeichere',
-'resetprefs' => 'Oischdellunge verwerfe',
+'preferences' => 'Obzione',
+'mypreferences' => 'Oischdellunge',
+'prefs-watchlist' => 'Beowachdungslischd',
+'prefs-misc' => 'Schunschdisches',
+'saveprefs' => 'Oischdellunge schbaischere',
+'resetprefs' => 'Oischdellunge vawerfe',
+'prefs-editing' => 'Schaffe',
+'rows' => 'Zaile',
+'columns' => 'Schbalde',
+'searchresultshead' => 'Nochgugge',
+'resultsperpage' => 'Dreffa bro Said',
+'stub-threshold-disabled' => 'Abgschdeld',
 'guesstimezone' => 'Aus em Browser iwwernemme',
-'yourrealname' => 'Birscherlischer Nome:',
+'timezoneregion-europe' => 'Oirobba',
+'prefs-searchoptions' => 'Nochgugge',
+'youremail' => 'E-Mail:',
+'yourrealname' => 'Birschalischa Nome:',
 'yourlanguage' => 'Schbrooch:',
+'yournick' => 'Naiji Unnaschfrid',
+'yourgender' => 'Gschleschd:',
 'gender-unknown' => 'Ghoim gkalde',
+'gender-male' => 'Männlisch',
+'gender-female' => 'Waiblisch',
+'prefs-help-email-others' => 'Konschd a wehle, ob onnare disch iwwan Lingg uff doina Dischbedier-Said oschbresche kennen.
+Doi Meil-Address isch ned zaisch nix waida.',
+'prefs-diffs' => 'Unaschied',
+
+# User rights
+'userrights-groupsmember' => 'Midglied vun:',
 
 # Groups
 'group' => 'Grubb:',
+'group-user' => 'Benudza',
 'group-bot' => 'Bots',
 'group-sysop' => 'Adminischdradore',
-'group-bureaucrat' => 'Birokrade',
+'group-bureaucrat' => 'Birograde',
 'group-all' => '(alle)',
 
 'group-bot-member' => '{{GENDER:$1|Bot}}',
@@ -424,6 +527,13 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 
 'grouppage-sysop' => '{{ns:project}}:Adminischtratore',
 
+# Rights
+'right-move' => 'Said bwesche',
+'right-move-subpages' => 'Said midde Unasaide bwesche',
+'right-movefile' => 'Saide vaschiewe',
+'right-upload' => 'Dadaije nufflade',
+'right-delete' => 'Saide lesche',
+
 # Special:Log/newusers
 'newuserlogpage' => 'Naiaameldungs-Logbuch',
 
@@ -431,108 +541,135 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'rightslog' => 'Benutzerrecht-Logbuch',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'die Said bearwaide',
+'action-edit' => 'die Said beawaide',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerunge}}',
-'recentchanges' => 'Was zuledschd gemachd worre isch',
-'recentchanges-legend' => 'Optione vun de Aazaich',
+'recentchanges' => 'Ledschdi Ännarunge',
+'recentchanges-legend' => 'Wehl ä Aazaisch fa die ledschdi Ännarunge',
 'recentchanges-feed-description' => 'Di letschte Ännerunge vun {{SITENAME}} in des Feed aigewwe.',
+'recentchanges-label-newpage' => 'Domid magschd ä naiji Said',
 'recentchanges-label-minor' => "S'ische glänni Beawaidung",
+'recentchanges-label-bot' => 'Ännarunge duaschn Bod',
+'recentchanges-label-unpatrolled' => 'Die Änarung isch noch ned iwwabriefd worre',
 'rcnote' => "Aagezaicht {{PLURAL:$1|werd '''1''' Ännerung|werre die letschte '''$1''' Ännerunge}} {{PLURAL:$2|vum letschte Dach|in de letschte '''$2''' Dache}} (Stand: $4, $5)",
-'rclistfrom' => 'Zeich die ledschde Ännerunge ab $1',
-'rcshowhideminor' => 'Klenne Ännerunge $1',
+'rclistfrom' => 'Zaisch die ledschd Ännarunge ab $1',
+'rcshowhideminor' => 'Klenne Ännarunge $1',
 'rcshowhidebots' => 'Bots $1',
 'rcshowhideliu' => 'Aagemeldte Benutzer $1',
-'rcshowhideanons' => 'Nit aagemeldte Benutzer $1',
-'rcshowhidemine' => 'Mai Bearwaidunge $1',
-'rclinks' => 'Zeich die letschte $1 Ännerunge in de letschte $2 Dache<br />$3',
-'diff' => 'Unnerschied',
-'hist' => 'Gschichd',
+'rcshowhideanons' => 'Nit aagemeldt Benutzer $1',
+'rcshowhidepatr' => '$1 iwabriefde Ännarunge',
+'rcshowhidemine' => 'Mai Beawaidunge $1',
+'rclinks' => 'Zaich die letschde $1 Ännarunge inde ledschde $2 Dach<br />$3',
+'diff' => 'Unnaschied',
+'hist' => 'Gschischd',
 'hide' => 'vaschdeggle',
 'show' => 'zaische',
 'minoreditletter' => 'k',
 'newpageletter' => 'N',
 'boteditletter' => 'B',
-'rc-enhanced-expand' => "Details zaische (dodezu braucht's JavaScript)",
-'rc-enhanced-hide' => 'Dedails versdeckle',
+'rc_categories_any' => 'Ebbes',
+'rc-enhanced-expand' => 'Änzlhaide zaische (dozu brauchds JavaScript)',
+'rc-enhanced-hide' => 'Ogawe vaschdeggle',
 
 # Recent changes linked
-'recentchangeslinked' => 'Was on verlinkde Saide gemacht worre isch',
-'recentchangeslinked-feed' => 'Was on verlinkde Seide gemacht worre isch',
-'recentchangeslinked-toolbox' => 'Was on verlinkde Seide gemacht worre isch',
-'recentchangeslinked-title' => 'Ännerunge an Saide, wu „$1“ druf verlinkt',
-'recentchangeslinked-summary' => "Des isch e Lischt vun Ännerunge, wu erscht gmacht worre sin an Saide, die wu vun ere bstimmte Said verlinkt sin (odder die wu zu ere bstimmte Kadegorie ghere).
-Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
+'recentchangeslinked' => 'Was on verlinggde Saide gännad worre isch',
+'recentchangeslinked-feed' => 'Ännarunge on valinggde Saide',
+'recentchangeslinked-toolbox' => 'Ännarunge on verlingde Saide',
+'recentchangeslinked-title' => 'Ännarunge on Saide, wu „$1“ druff verlinggd',
+'recentchangeslinked-noresult' => 'Inde Zaid ischdo nix gännad worre.',
+'recentchangeslinked-summary' => "Die Lischd zaischd ledschde Ännarunge, vunna bschdimmde Said, wu do valinggd isch (odda zu Midglied vuna bschdimmde Kadegorije isch).
+Saide uff [[Special:Watchlist|Dainer Beowachdungslischd]] sinn '''fedd'''.",
 'recentchangeslinked-page' => 'Saide:',
-'recentchangeslinked-to' => 'Zaisch Ännerunge uff Saide, wu do her verlinkt sinn',
+'recentchangeslinked-to' => 'Zaisch Ännarunge uff Saide, wu do her valinggd sinn',
 
 # Upload
 'upload' => 'Nufflade',
-'uploadbtn' => 'Datei hochlade',
-'uploadlogpage' => 'Dateie-Logbuch',
-'filedesc' => 'Zommefassung',
-'fileuploadsummary' => 'Zommefassung:',
-'savefile' => 'Datei schbeichere',
+'uploadbtn' => 'Dadai nufflade',
+'uploadlogpage' => 'Dadaije-Logbuch',
+'filedesc' => 'Iwwabligg',
+'fileuploadsummary' => 'Iwwabligg:',
+'savefile' => 'Dadai schbaischere',
 'uploadedimage' => 'hod „[[$1]]“ nuffglade',
 
 # Lock manager
-'lockmanager-notlocked' => '„$1“ hod ned uffgmachd were kenne, die isch ganed gschberd gwesd.',
+'lockmanager-notlocked' => "„$1“ hod ned uffgmachd were kenne, s'isch ganed gschberd gwesd.",
 'lockmanager-fail-closelock' => 'Die gbscherd Dadai „$1“ hod ned gschlosse were kenne.',
 'lockmanager-fail-deletelock' => 'Die gbscherd Dadai „$1“ hod ned gleschd were kenne.',
 'lockmanager-fail-acquirelock' => '„$1“ komma ned schberre.',
 'lockmanager-fail-openlock' => 'Die gschberd Dadai „$1“ komma ned uffmache.',
 'lockmanager-fail-releaselock' => '„$1“ konn ned fraigewe werre.',
 
+'license' => 'Bwillischung',
+'license-header' => 'Bwillischung',
+
 # Special:ListFiles
+'listfiles_name' => 'Nome',
+'listfiles_size' => 'Greeß',
 'listfiles_count' => 'Versione',
 
 # File description page
-'file-anchor-link' => 'Datei',
-'filehist' => 'Dateigschischd',
-'filehist-help' => 'Drick uff e Zaidpunkt zum aazääche, wie s dort ausgsähne hot.',
-'filehist-revert' => 'zuriggsedze',
-'filehist-current' => 'akduell',
+'file-anchor-link' => 'Dadai',
+'filehist' => 'Dadaigschischd',
+'filehist-help' => 'Drigg uff e Zaidpunggd zum aazaische, wie s dord ausgseh hod.',
+'filehist-deleteall' => 'alles lesche',
+'filehist-deleteone' => 'lesche',
+'filehist-revert' => 'zriggsedze',
+'filehist-current' => 'agduell',
 'filehist-datetime' => 'Zaidpungd',
-'filehist-thumb' => 'Vorschaubild',
-'filehist-thumbtext' => 'Vorschaubild fer Version vum $1',
+'filehist-thumb' => 'Gleenes Bild',
+'filehist-thumbtext' => 'Skizz fa die Ausgab vum $1',
 'filehist-user' => 'Benudzer',
-'filehist-dimensions' => 'Moß',
-'filehist-comment' => 'Kommentar',
+'filehist-dimensions' => 'Maß',
+'filehist-comment' => 'Aißarung',
 'imagelinks' => 'Dadaivawendung',
 'linkstoimage' => 'Die {{PLURAL:$1|Said verwaisd|$1 Saide verwaise}} uff die Datei:',
+'nolinkstoimage' => 'Do hods kä Said, wu dohea zaischd.',
 'sharedupload' => 'Die Datei isch vun $1 un s kann sai, dass se ach vun annere Projekt gebraucht werd.',
 'uploadnewversion-linktext' => 'E naiere Version vun derre Datei hochlade',
 
 # File deletion
+'filedelete' => 'Lesch $1',
+'filedelete-legend' => 'Dadai lesche',
 'filedelete-submit' => 'Lesche',
+'filedelete-success' => "'''$1''' isch gleschd worre.",
+'filedelete-maintenance-title' => 'Dadai konnned gleschd werre',
+
+# MIME search
+'download' => 'Runalaade',
 
 # Random page
-'randompage' => 'Irnd en Adiggel',
+'randompage' => 'Irschnd en Adiggl',
 
 # Statistics
-'statistics' => 'Statischtike',
+'statistics' => 'Schdadischdigge',
+'statistics-pages' => 'Saide',
 
-'brokenredirects-edit' => 'bearwaide',
+'disambiguationspage' => 'Template:Vadaidlischung',
+
+'brokenredirects-edit' => 'beawaide',
 'brokenredirects-delete' => 'lesche',
 
+'withoutinterwiki-submit' => 'Zaische',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
-'nmembers' => '$1 {{PLURAL:$1|Mitglied|Mitglieder}}',
+'nmembers' => '$1 {{PLURAL:$1|Dailnemma|Dailnemma}}',
 'prefixindex' => 'Alle Saide (mid Präfix)',
-'newpages' => 'Naie Saide',
+'listusers-editsonly' => 'Zaisch bloß Bnudza mid Baidräsch',
+'newpages' => 'Naije Saide',
 'move' => 'Verschiewe',
 'movethispage' => 'Die Said verschiewe',
 'pager-newer-n' => '{{PLURAL:$1|negschte 1|negschte $1}}',
 'pager-older-n' => '{{PLURAL:$1|vorich 1|voriche $1}}',
 
 # Book sources
-'booksources' => 'Buchqwelle',
+'booksources' => 'Buchgwelle',
 'booksources-search-legend' => 'No Buchquelle suche',
 'booksources-go' => 'Geh',
 
 # Special:Log
-'log' => 'Logbicher',
+'log' => 'Logbischa',
 
 # Special:AllPages
 'allpages' => 'Alle Saide',
@@ -542,25 +679,33 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 'allpagesto' => 'Saide aazaische wu ufhere mid:',
 'allarticles' => 'Alle Saide',
 'allpagesprev' => 'Voriche',
-'allpagesnext' => 'Negschte',
+'allpagesnext' => 'Negschd',
 'allpagessubmit' => 'Zaische',
 
+# Special:Categories
+'categories' => 'Kadegorije',
+
 # Special:LinkSearch
-'linksearch' => 'Externe Links',
+'linksearch' => 'Exderne Lings',
+'linksearch-line' => '$1 isch vun $2 valinggd',
 
 # Special:ListGroupRights
 'listgrouprights-members' => '(Midgliederlischd)',
 
-# E-mail user
+# Email user
 'emailuser' => 'E-Mail on de Benutzer',
+'emailfrom' => 'Vum:',
+'emailto' => 'Fa:',
+'emailsubject' => 'Bdreff:',
+'emailmessage' => 'Middeelung:',
 'emailsend' => 'Abschigge',
 
 # Watchlist
 'watchlist' => 'Beowachdungslischd',
 'mywatchlist' => 'Beowachdungslischd',
 'watchlistfor2' => 'Vun $1 $2',
-'addedwatchtext' => "Die Said \"[[:\$1]]\" isch zu Dainer [[Special:Watchlist|Beowachdungslischt]] zugefiecht worre.
-Zukimftiche Ännerunge an derre Said un de Dischbediersaid, wu dezu ghert, werre doo aagezaicht, un d Said werd '''fett''' aagezaicht in de [[Special:RecentChanges|Letschte Ännerunge]] fer dass es ääfacher isch zum finne.",
+'addedwatchtext' => "Die Said \"[[:\$1]]\" isch zu Doina [[Special:Watchlist|Beowachdungslischt]] zugfieschd worre.
+Zukinfdischi Ännarunge onde Said unde Dischbediersaid, wu dzu kead, werren doo aagzaischd, un die Said werd '''fedd''' aagzaisch inde [[Special:RecentChanges|Ledschdi Ännarunge]] domidmas efacha finne konn.",
 'removedwatchtext' => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
 'watch' => 'Beowachde',
 'watchthispage' => 'Die Said beowachde',
@@ -577,11 +722,12 @@ Zukimftiche Ännerunge an derre Said un de Dischbediersaid, wu dezu ghert, werre
 
 # Delete
 'deletepage' => 'Said lesche',
-'confirm' => 'Bestädiche',
+'confirm' => 'Beschdedische',
 'delete-legend' => 'Lesche',
 'confirmdeletetext' => 'Du bisch debai e Said z lesche mid alle Versione.
 Bitte du bstätiche, dass Du des wllscht du, dass Du verstehsch, was des hääßt, un dass Du des machscht in Iwweraistimmung mit de [[{{MediaWiki:Policy-url}}|Richtline]].',
-'actioncomplete' => 'Agtion ferdisch',
+'actioncomplete' => 'Agzion ferdisch',
+'actionfailed' => 'Maßnohm gschaidad',
 'deletedtext' => '"$1" isch gelescht worre.
 Guck $2 fer e Lischt vun de letschte Leschunge.',
 'dellogpage' => 'Leschlogbuch',
@@ -590,11 +736,11 @@ Guck $2 fer e Lischt vun de letschte Leschunge.',
 'deletereasonotherlist' => 'Annere Grund',
 
 # Rollback
-'rollbacklink' => 'Zeriggsetze',
+'rollbacklink' => 'Zeriggsedze',
 
 # Protect
 'protectlogpage' => 'Saideschutz-Logbuch',
-'protectedarticle' => 'hot "[[$1]]" gschizd',
+'protectedarticle' => 'hod "[[$1]]" gschizd',
 'modifiedarticleprotection' => 'hot de Schutzstatus vun "[[$1]]" gännert',
 'protectcomment' => 'Grund:',
 'protectexpiry' => 'Bis:',
@@ -605,33 +751,34 @@ Guck $2 fer e Lischt vun de letschte Leschunge.',
 Do hot s di aktuelle Aistellunge vun de Said '''$1''':",
 'protect-cascadeon' => 'Die Said isch gschizd, wail se {{PLURAL:$1|zu derre Said ghert|zu denne Saide ghert}}, wu e Kaskadesperrung gelt.
 Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uff d Kaskadesperrung.',
-'protect-default' => 'Alle Benutzer erlääwe',
-'protect-fallback' => '«$1»-Berechdichung nedich',
-'protect-level-autoconfirmed' => 'Naie un nid aagemeldte Benutzer sperre',
-'protect-level-sysop' => 'Numme Adminischtratore',
+'protect-default' => 'Alle Benudzer erlauwe',
+'protect-fallback' => 'Bloß fa Laid mid "$1" Bereschdischung',
+'protect-level-autoconfirmed' => 'Naije un nid aagemeldte Benutzer schberre',
+'protect-level-sysop' => 'Bloß fa Adminischdradore',
 'protect-summary-cascade' => 'Kaskade',
 'protect-expiring' => 'bis $1 (UTC)',
+'protect-expiring-local' => 'bis $1',
 'protect-cascade' => 'Kaskadesperrung – alle aigebunnene Vorlache sinn midgsperrd.',
 'protect-cantedit' => 'Du kannscht de Schutzstatus vun derre Said nit ännere, wail Du nid d Berechdichung dezu hoscht.',
 'restriction-type' => 'Berechdichung:',
-'restriction-level' => 'Schutzewene:',
+'restriction-level' => 'Schudsewene:',
 
 # Restrictions (nouns)
-'restriction-edit' => 'Bearwaide',
+'restriction-edit' => 'Beawaide',
 'restriction-move' => 'Verschiewe',
 
 # Undelete
 'undelete' => 'Widderherschdelle',
 'undeletebtn' => 'Widderherschdelle',
-'undeletelink' => 'aagucke/wirrer herstelle',
+'undeletelink' => 'aagucke/widda herschdelle',
 'undeleteviewlink' => 'Ogugge',
-'undeletereset' => 'Zuricksetze',
+'undeletereset' => 'Zuriggsedze',
 'undelete-show-file-submit' => 'Ja',
 
 # Namespace form on various pages
 'namespace' => 'Nomensraum',
-'invert' => 'Auswahl umkehre',
-'blanknamespace' => '(Haaptsaid)',
+'invert' => 'Wahl dausche',
+'blanknamespace' => '(Schdadsaid)',
 
 # Contributions
 'contributions' => '{{GENDER:$1|Wasa gemachd hod}}',
@@ -639,166 +786,177 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
 'mycontris' => 'Baidräsch',
 'contribsub2' => 'Fer $1 ($2)',
 'uctop' => '(akduell)',
-'month' => 'un Monet (un frieher):',
-'year' => 'Ab em Johr (un frieher):',
+'month' => 'än Monad (un frija):',
+'year' => 'Abm Johr (un frieja):',
 
-'sp-contributions-newbies' => 'Zaich numme Baidräch vun naie Benutzerkonte',
-'sp-contributions-blocklog' => 'Sperrlogbuch',
+'sp-contributions-newbies' => 'Zaisch nua Baidräsch vun naije Konde',
+'sp-contributions-blocklog' => 'Schberrlogbuch',
+'sp-contributions-uploads' => 'Nufflade',
+'sp-contributions-logs' => 'Logbischa',
 'sp-contributions-talk' => 'Dischbediere',
-'sp-contributions-search' => 'No Baidräch suche',
-'sp-contributions-username' => 'IP-Adress orrer Benutzername:',
+'sp-contributions-search' => 'Noch Baidräsch gugge',
+'sp-contributions-username' => 'IP-Adress odda Benudzernome:',
+'sp-contributions-toponly' => 'Bloß agduelli Ännarunge zaische',
 'sp-contributions-submit' => 'Suche',
 
 # What links here
-'whatlinkshere' => 'Was doher zeischt',
+'whatlinkshere' => 'Was doher zaische dud',
 'whatlinkshere-title' => 'Saide wu uff "$1" verlinke',
 'whatlinkshere-page' => 'Said:',
-'linkshere' => "Die Saide verlinke zu '''[[:$1]]''':",
-'isredirect' => 'Wairerlaitungsaid',
-'istemplate' => 'Vorlacheaibindung',
-'isimage' => "Dadailing'g",
+'linkshere' => "Die Saide valingge uff '''[[:$1]]''':",
+'nolinkshere' => "Kä Said zaischd uff '''[[:$1]]'''.",
+'isredirect' => 'Waidalaidungsaid',
+'istemplate' => 'Vorlacheoibindung',
+'isimage' => 'Dadailingg',
 'whatlinkshere-prev' => '{{PLURAL:$1|vorich|voriche $1}}',
-'whatlinkshere-next' => '{{PLURAL:$1|negscht|negschte $1}}',
-'whatlinkshere-links' => '← Links',
-'whatlinkshere-hideredirs' => '$1 Wairerlaitunge',
+'whatlinkshere-next' => '{{PLURAL:$1|negschd|negschde $1}}',
+'whatlinkshere-links' => '← Linggs',
+'whatlinkshere-hideredirs' => '$1 Waidalaidunge',
 'whatlinkshere-hidetrans' => '$1 Vorlacheaibindunge',
-'whatlinkshere-hidelinks' => '$1 Links',
-'whatlinkshere-filters' => 'Filter',
+'whatlinkshere-hidelinks' => '$1 Linggs',
+'whatlinkshere-filters' => 'Filda',
 
 # Block/unblock
-'blockip' => 'Benutzer bloggiere',
-'ipbsubmit' => 'Benutzer bloggiere',
+'blockip' => 'Benudzer bloggiere',
+'ipbsubmit' => 'Benudzer bloggiere',
 'ipboptions' => '2 Stunne:2 hours,1 Dach:1 day,3 Dache:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Monet:1 month,3 Monet:3 months,6 Monet:6 months,1 Johr:1 year,Fer immer:infinite',
-'ipusubmit' => 'Die Adreß freigewwe',
+'ipbotheroption' => 'onnari',
+'ipusubmit' => 'Die Adreß fraigewwe',
 'ipblocklist' => 'Gschberrdi IP-Adress un Benudzernome',
-'blocklink' => 'sperre',
+'infiniteblock' => 'ubgrensd',
+'blocklink' => 'schberre',
 'unblocklink' => 'Sperr uffhewe',
-'change-blocklink' => 'Sperr ännere',
-'contribslink' => 'Baidräch',
-'blocklogpage' => 'Sperrlogbuch',
+'change-blocklink' => 'Schberr ännare',
+'contribslink' => 'Baidräsch',
+'blocklogpage' => 'Schberrlogbuch',
 'blocklogentry' => 'hot [[$1]] gsperrt fer e Zaidraum vun $2 $3',
 'unblocklogentry' => 'hot d Sperr vun $1 uffghowwe',
-'block-log-flags-nocreate' => 'Aaleche vun Benutzerkonte isch gsperrt',
+'block-log-flags-nocreate' => 'Aalesche vun Benudzerkonde isch gschberrd',
 
 # Developer tools
-'lockbtn' => 'Dadebonk schberre',
-'unlockbtn' => 'Dadebonk freigewwe',
+'lockbtn' => 'Dadebongg schberre',
+'unlockbtn' => 'Dadebongg fraigewwe',
 
 # Move page
-'move-page-legend' => 'Said verschiewe',
-'movepagetext' => "Mid dem Format kannscht ener Said e naie Name gewwe, debai werre alle alde Versione uff de nai Name verschowe.
-Aus em Alde Name werd e Wairerlaidungssaid´zum naie Name.
-Wairerlaidungssaide, wu uff de ald Name umlaire, kannscht automatisch aktualisiere.
-Wenn De des nid willsch, no guck uff [[Special:DoubleRedirects|doppelte]] orrer [[Special:BrokenRedirects|kaputte Wairerlaidunge]].
-Du solltescht defer sorche, dass Links wairer zu de richdiche Saide fiehre.
-
-Gebb Acht, dass die Said '''nid''' verschowe werd, wenn s scho e Said mid em naie Name hot, außer wenn se leer isch orrer e Wairerlaidung.
-Des hääßt, Du kannscht ke Said, wu s schun gebbt, iwwerschraiwe.
-
-'''WARNUNG!'''
-Des isch e wichdiche Ännerung fer e Said un kann ziehmlich unerwartet sai fer wichdiche Saide;
-bitte mach des numme, wenn Du die Folche vun derre Aktion kannsch abschätze.",
+'move-page-legend' => 'Said vaschiewe',
+'movepagetext' => "Midm Formad konnschd ä Said en naije Nome gewwe, debai werrem alli alde Ausgawe uffde nai Nome vaschowe.
+Ausm alde Nome werd e Waidalaidungssaid zum naije Nome.
+Waidalaidungssaide, wu uffde ald Nome umlaide dun, konnschd vun allä uffde naischde Schdond bringe.
+Wonndes ned willschd, guggschd uff [[Special:DoubleRedirects|dobbldi]] odda [[Special:BrokenRedirects|kabuddi Waidalaidunge]].
+Soasch dfia, dass Linggs waida uffdie rischdische Saide fiehan.
+
+Gebb Achd, dass die Said '''ned''' vaschowe werd, wonns schunä Said midm naije Nome hod, außa wonnse lea isch odda e Waidalaidung.
+Des heeßd, Du konnschd ke Said, wus schun gibbd, iwwaschraiwe.
+
+'''BAßMAUFF!'''
+Des isch e wischdischi Ännarung fa e Said un konn zimlisch uuerwaaded soi fa wischdischi Saide;
+mach des bloß, wonn die Folsche vunde Maßnohm a abschedze konnschd.",
 'movepagetalktext' => "D Dischbediersaid werd ach mid verschowe, '''ausser:'''
 * Du verschiebsch die Saide in e annere Namensraum, odder
 * s gebbt schun e Dischbediersaid mi dem Name, orrer
 * Du wählsch unne d Option, se nid z verschiewe.
 
 In denne Fäll misst mer d Dischbediersaid vun Hand kopiere.",
-'movearticle' => 'Said verschiewe:',
-'newtitle' => 'Zum naie Titel:',
+'movearticle' => 'Said vaschiewe:',
+'newtitle' => 'Zum naije Didl:',
 'move-watch' => 'Die Said beowachde',
-'movepagebtn' => 'Said verschiewe',
+'movepagebtn' => 'Said vaschiewe',
 'pagemovedsub' => 'Verschiewung hot geklappt',
 'movepage-moved' => '\'\'\'"$1" isch verschowe worre uff "$2"\'\'\'',
 'articleexists' => 'E Said mid dem Name gebbt s schun, orrer de Name, wu du gewählt hoscht, isch nid gildich.
 Bitte nemm e annere Name.',
 'talkexists' => "'''Die Said selwerschd, isch verschowe worre, awwer d Dischbediersaid hot nid kenne verschowe werre, wail s schun enni gebbt mid dem Name.
 Bitte duu se vun Hand zammefiehre.'''",
-'movedto' => 'verschowe uff',
+'movedto' => 'vaschowe uff',
 'movetalk' => 'Dischbediersaid, wu dezu ghert, verschiewe',
 'movelogpage' => 'Verschiewungs-Logbuch',
 'movereason' => 'Grund:',
-'revertmove' => 'Zerigg verschiewe',
+'revertmove' => 'Zurigg vaschiewe',
 'delete_and_move' => 'Lesche un Verschiewe',
 'delete_and_move_confirm' => 'Ja, Said lesche',
 
 # Export
 'export' => 'Saide expordiere',
-'export-submit' => 'Seide exbordiere',
+'export-submit' => 'Saide exbordiere',
+
+# Namespace 8 related
+'allmessagesname' => 'Nome',
+'allmessagesdefault' => 'Vorgewene Tegschd',
+'allmessages-filter-modified' => 'Vaännad',
 
 # Thumbnails
-'thumbnail-more' => 'Greßer mache',
+'thumbnail-more' => 'Mags greßa',
 
 # Special:Import
 'import-interwiki-submit' => 'Impordiere',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Dai Benudzersaid',
-'tooltip-pt-mytalk' => 'Dai Dischbedier-Said',
+'tooltip-pt-mytalk' => 'Dai Said fas Dischbediere',
 'tooltip-pt-preferences' => 'Dai Aistellunge',
-'tooltip-pt-watchlist' => 'D Lischt vun Saide, die wu du beowachde dusch',
-'tooltip-pt-mycontris' => 'Lischd vun Daine Baidräch',
-'tooltip-pt-login' => 'Du kannscht Dich aamelde, awwer du muscht s nit',
+'tooltip-pt-watchlist' => 'D Lischd vun Saide, wu du beowachde duschd',
+'tooltip-pt-mycontris' => 'Lischd vun Daine Baidräsch',
+'tooltip-pt-login' => 'Du konnschd disch aamelde, awwer du mugschd s nit',
 'tooltip-pt-logout' => 'Abmelde',
-'tooltip-ca-talk' => 'Iwwer d Inhaltssaid dischbediere',
-'tooltip-ca-edit' => 'Du kannschd die Said bearwaide.
-Bidde nemmde Vorschau-Knobb vorm Schbaischere',
+'tooltip-ca-talk' => 'Iwwa d Inhaldssaid dischbediere',
+'tooltip-ca-edit' => 'Du konnschd die Said beawaide.
+Bidde nemmde Vorschau-Gnobb vorm Schbaischare',
 'tooltip-ca-addsection' => 'E naie Abschnitt aaleche',
-'tooltip-ca-viewsource' => 'Die Said isch gschizd.
-Du kannscht awwer de Quelltegschd aagucke',
+'tooltip-ca-viewsource' => 'Die Said isch gschizd. Du konnschd awwa de Gwelltegschd aagugge.',
 'tooltip-ca-history' => 'Ledschde Versione vun derre Said',
 'tooltip-ca-protect' => 'Die Said schidze',
 'tooltip-ca-delete' => 'Die Said lesche',
-'tooltip-ca-move' => 'Die Said verschiewe',
-'tooltip-ca-watch' => 'Die Said zu Dainere Beowachdungslischt zufieche',
-'tooltip-ca-unwatch' => 'Die Said aus Dainer Beowachdunschlischde rausnemme',
-'tooltip-search' => 'Durchsuch {{SITENAME}}',
+'tooltip-ca-move' => 'Die Said vaschiewe',
+'tooltip-ca-watch' => 'Die Said zu Dainer Beowachdungslischd zufiesche',
+'tooltip-ca-unwatch' => 'Die Said aus Dainer Beowachdunschlischd wegnemme',
+'tooltip-search' => 'Gugg uff {{SITENAME}} noch',
 'tooltip-search-go' => 'Geh zu ere Said mid genää dem Namme, wenn s se gebbt',
-'tooltip-search-fulltext' => 'Gugg in de Said nochm Tegschd',
-'tooltip-p-logo' => 'Haubdsaid',
-'tooltip-n-mainpage' => 'Uff d Hääptsaid geh',
-'tooltip-n-mainpage-description' => 'Haubdsaid aagucke',
+'tooltip-search-fulltext' => 'Gugg inde Said nochm Tegschd',
+'tooltip-p-logo' => 'Schdadsaid',
+'tooltip-n-mainpage' => 'Uff d Schdadsaid geje',
+'tooltip-n-mainpage-description' => 'Haubdsaid aagugge',
 'tooltip-n-portal' => 'Iwwers Brojegd, wude duu kannschd, wu ebbes finne duschd',
-'tooltip-n-currentevents' => 'hinnergundsinformatione finne iwwer naie Eraichnis',
-'tooltip-n-recentchanges' => 'D Lischd vun de ledschde Ännerunge in dem Wiki',
-'tooltip-n-randompage' => 'E zufällisch Said lade',
-'tooltip-n-help' => 'De Ort zum rausfinne',
-'tooltip-t-whatlinkshere' => 'Lischd vun alle Wikisaide, wu do her verlingd sinn',
-'tooltip-t-recentchangeslinked' => 'Letschde Ännerunge in Saide, wu vun do verlinkt sin',
+'tooltip-n-currentevents' => 'Finn Auskinfd iwwa naiji Voafell',
+'tooltip-n-recentchanges' => 'Lischd vun de ledschde Ännarunge im Wiki',
+'tooltip-n-randompage' => 'Lad e zufellischi Said',
+'tooltip-n-help' => 'Do konschds rausfinne',
+'tooltip-t-whatlinkshere' => 'Lischd vun alle Wikisaide, wu do hie verlingd sinn',
+'tooltip-t-recentchangeslinked' => 'Ledschde Ännerunge in Saide, wu vun do verlinggd sin',
 'tooltip-feed-rss' => 'RSS feed fer die Said',
-'tooltip-feed-atom' => 'Atom feed fer die Said',
-'tooltip-t-contributions' => 'Die ledschde Baidräch vun däm Benudzer aagucke',
+'tooltip-feed-atom' => 'Atom-Feed fa die Said',
+'tooltip-t-contributions' => 'Die ledschde Baidräsch vum Benudzer aagugge',
 'tooltip-t-emailuser' => 'Dem Benutzer e E-Mail schicke',
-'tooltip-t-upload' => 'Dateije nufflade',
-'tooltip-t-specialpages' => 'Lischd vun alle Schbezialsaide',
-'tooltip-t-print' => 'Druggversion vun derre Said',
+'tooltip-t-upload' => 'Dadaije nufflade',
+'tooltip-t-specialpages' => 'Lischd vunde Schbezialsaide',
+'tooltip-t-print' => 'Druggausgab vunde Said',
 'tooltip-t-permalink' => 'E dauerhafte Link zu derre Version vun de Said',
-'tooltip-ca-nstab-main' => 'D Inhaldssaid aagucke',
-'tooltip-ca-nstab-user' => 'D Benutzersaid aagucke',
+'tooltip-ca-nstab-main' => 'Inhald agugge',
+'tooltip-ca-nstab-user' => 'D Benudzersaid aagucke',
 'tooltip-ca-nstab-special' => 'Des isch e Spezialsaid, du kannscht d Said sälwerscht nit ännere',
-'tooltip-ca-nstab-project' => 'D Projektsaid aagucke',
-'tooltip-ca-nstab-image' => 'D Dateisaid aaugucke',
-'tooltip-ca-nstab-template' => 'Vorlach aagucke',
-'tooltip-ca-nstab-category' => 'D Kategoriesaid aagucke',
-'tooltip-minoredit' => 'Des als klenne Ännerung markiere',
-'tooltip-save' => 'Dai Ännerunge spaichere',
+'tooltip-ca-nstab-project' => 'Brojegdsaid agugge',
+'tooltip-ca-nstab-image' => 'D Dadaisaid aaugugge',
+'tooltip-ca-nstab-template' => 'Vorlach aagugge',
+'tooltip-ca-nstab-category' => 'D Kadegoriesaid aagucke',
+'tooltip-minoredit' => 'Des als klenni Ännarung makiere',
+'tooltip-save' => 'Dai Ännerunge schbaischere',
 'tooltip-preview' => 'Guck Daine Ännerunge in de Vorschau aa, vor Du uff Spaichere driksch!',
 'tooltip-diff' => 'Guck, welle Ännerunge Du im Text gmacht hoscht',
-'tooltip-compareselectedversions' => 'D Unnerschied zwische denne zwai ausgwehlte Versione aagucke',
+'tooltip-compareselectedversions' => 'D Unnaschied zwische denne zwee gwehlde Versione aagugge',
 'tooltip-watch' => 'Die Said zu Dainer Beowachdunglischd zufieche',
-'tooltip-rollback' => "„Zeriggsetze“ machd alle Bearwaidunge vum ledschde Bearwaider rigg'gängisch",
-'tooltip-undo' => "„Zerigg“ machd numme die Ännerung rigg'gängich un zaichd d Vorschau aa.
-Du kannschd e Grund in dr Zammfassung aagewwe",
+'tooltip-rollback' => "„Zriggsedze“ machd alli Beawaidunge vum ledschde Midawaida rigg'gängisch",
+'tooltip-undo' => "„Zrigg“ machd nua die Ännarung rigg'gängich un zaischd ä Vorschau aa.
+Du kannschd e Grund in de Zommefassung aagewwe.",
+'tooltip-summary' => 'Gebä koaz Resimee',
 
 # Browsing diffs
 'previousdiff' => '← Ältere Bearwaidung',
-'nextdiff' => 'Naiere Bearwaidung →',
+'nextdiff' => 'Naijari Beawaidung →',
 
 # Media information
 'file-info-size' => '$1 × $2 Pixels, Dateigreß: $3, MIME-Type: $4',
-'file-nohires' => 'Ke hechere Ufflesung verfiechbar.',
+'file-nohires' => 'Ke heheri Ufflesung vafieschba.',
 'svg-long-desc' => 'SVG-Datei, Basisgreß $1 × $2 Pixels, Dateigreß: $3',
-'show-big-image' => 'Gsamte Ergebnis',
+'show-big-image' => 'Volli Ufflesung',
 
 # Special:NewFiles
 'showhidebots' => '(Bots $1)',
@@ -813,8 +971,8 @@ Annere Links in der glaiche Zail werre als Ausnahme behanneld, d. h. Saide, wu d
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => 'Die Dadei hot waidere Informatione, wahrschainlich vun de Digidalkamera oder vum Scanner, mid dem wu sie gmacht worre sinn.
-Wenn die Dadei verännerd worre isch, dann kann s sai, dass die zusädzlich Information fer die verännert Dadei nimmi richdisch isch.',
+'metadata-help' => 'Die Dadai hod waideri Ogawe, waaschoinlisch vunde Digidalkomara odda vum Skänna, wuse mid gmachd worre isch.
+Wpnn die Dadai vaännad worre isch, donn konns soi, daß zusedzlischi Ogawe fa die vaännad Dadai nemme rischdisch sin.',
 'metadata-expand' => 'Erwaiterte Details aazaiche',
 'metadata-collapse' => 'Erwaiterte Details versteckeln',
 'metadata-fields' => 'Die EXIF-Medadaade werren inde Bild-Bschraiwung a ogzaischd, wonn die Medadaade-Tabelle verschdegld isch.
@@ -849,13 +1007,17 @@ Annere Medadaade sinn noamalawais verschdegld.
 'watchlisttools-edit' => 'D Beowachdunglischt aagucke un bearwaide',
 'watchlisttools-raw' => 'ime große Textfeld bearwaide',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Baßma uff:\'\'\' De Schlissl "$2" dudde frijare Schlissl "$1" iwwaschraiwe.',
+
 # Special:SpecialPages
-'specialpages' => 'Spezialsaide',
+'specialpages' => 'Schbezialsaide',
 'specialpages-group-other' => 'Onare bsundare Saide',
 'specialpages-group-pagetools' => 'Wergzaisch fa Saide',
 'specialpages-group-wiki' => 'Daade un Wergzaisch',
 
 # Special:Tags
+'tag-filter' => '[[Special:Tags|Bschildarungs]]-Filda:',
 'tags-edit' => 'bearwaide',
 
 # New logging system
index d6b9955..f03ea10 100644 (file)
@@ -12,7 +12,9 @@
  * @author BdgwksxD
  * @author Beau
  * @author BeginaFelicysym
+ * @author Chrumps
  * @author Cysioland
+ * @author Debeet
  * @author Derbeth
  * @author Equadus
  * @author Fizykaa
@@ -52,6 +54,7 @@
  * @author Timpul
  * @author ToSter
  * @author Tsca
+ * @author Ty221
  * @author WTM
  * @author Woytecr
  * @author Wpedzich
@@ -322,14 +325,12 @@ $messages = array(
 'tog-previewonfirst' => 'Pokazuj podgląd strony podczas pierwszej edycji',
 'tog-nocache' => 'Wyłącz pamięć podręczną przeglądarki',
 'tog-enotifwatchlistpages' => 'Wyślij do mnie e‐mail, gdy strona lub plik z mojej listy obserwowanych zostaną zmodyfikowane',
-'tog-enotifusertalkpages' => 'Wyślij do mnie e‐mail kiedy moja strona dyskusji zostanie zmodyfikowana',
+'tog-enotifusertalkpages' => 'Wyślij do mnie e‐mail, gdy moja strona dyskusji zostanie zmodyfikowana',
 'tog-enotifminoredits' => 'Wyślij e‐mail także w przypadku drobnych zmian na stronach lub w plikach',
 'tog-enotifrevealaddr' => 'Nie ukrywaj mojego adresu e‐mail w powiadomieniach',
 'tog-shownumberswatching' => 'Pokaż liczbę użytkowników obserwujących stronę',
 'tog-oldsig' => 'Twój obecny podpis',
 'tog-fancysig' => 'Traktuj podpis jako wikikod (nie linkuj automatycznie całości)',
-'tog-externaleditor' => 'Domyślnie używaj zewnętrznego edytora (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
-'tog-externaldiff' => 'Domyślnie używaj zewnętrznego programu pokazującego zmiany (tylko dla zaawansowanych użytkowników; wymaga odpowiedniego skonfigurowania komputera)',
 'tog-showjumplinks' => 'Włącz odnośniki „skocz do”',
 'tog-uselivepreview' => 'Używaj dynamicznego podglądu (JavaScript; eksperymentalny)',
 'tog-forceeditsummary' => 'Informuj o niewypełnieniu opisu zmian',
@@ -344,6 +345,7 @@ $messages = array(
 'tog-showhiddencats' => 'Pokazuj ukryte kategorie',
 'tog-noconvertlink' => 'Wyłącz konwersję tytułów w linkach',
 'tog-norollbackdiff' => 'Pomiń pokazywanie zmian po użyciu funkcji „cofnij”',
+'tog-useeditwarning' => 'Ostrzegaj mnie, gdy opuszczam stronę edycji bez zapisania zmian',
 
 'underline-always' => 'zawsze',
 'underline-never' => 'nigdy',
@@ -364,13 +366,13 @@ $messages = array(
 'thursday' => 'czwartek',
 'friday' => 'piątek',
 'saturday' => 'sobota',
-'sun' => 'Nie',
-'mon' => 'Pon',
-'tue' => 'Wto',
-'wed' => 'Śro',
-'thu' => 'Czw',
-'fri' => 'P',
-'sat' => 'Sob',
+'sun' => 'N',
+'mon' => 'Pn',
+'tue' => 'Wt',
+'wed' => 'Śr',
+'thu' => 'Cz',
+'fri' => 'Pt',
+'sat' => 'So',
 'january' => 'styczeń',
 'february' => 'luty',
 'march' => 'marzec',
@@ -407,6 +409,18 @@ $messages = array(
 'oct' => 'paź',
 'nov' => 'lis',
 'dec' => 'gru',
+'january-date' => '$1 stycznia',
+'february-date' => '$1 lutego',
+'march-date' => '$1 marca',
+'april-date' => '$1 kwietnia',
+'may-date' => '$1 maja',
+'june-date' => '$1 czerwca',
+'july-date' => '$1 lipca',
+'august-date' => '$1 sierpnia',
+'september-date' => '$1 września',
+'october-date' => '$1 października',
+'november-date' => '$1 listopada',
+'december-date' => '$1 grudnia',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Kategorie}}',
@@ -476,7 +490,7 @@ $messages = array(
 'go' => 'Przejdź',
 'searcharticle' => 'Przejdź',
 'history' => 'Historia strony',
-'history_short' => 'Historia i autorzy',
+'history_short' => 'Historia',
 'updatedmarker' => 'zmienione od ostatniej wizyty',
 'printableversion' => 'Wersja do druku',
 'permalink' => 'Link do tej wersji',
@@ -516,7 +530,7 @@ $messages = array(
 'otherlanguages' => 'W innych językach',
 'redirectedfrom' => '(Przekierowano z $1)',
 'redirectpagesub' => 'Strona przekierowująca',
-'lastmodifiedat' => 'Tę stronę ostatnio zmodyfikowano $2, $1.',
+'lastmodifiedat' => 'Tę stronę ostatnio zmodyfikowano $2, $1.',
 'viewcount' => 'Tę stronę obejrzano {{PLURAL:$1|tylko raz|$1 razy}}.',
 'protectedpage' => 'Strona zabezpieczona',
 'jumpto' => 'Skocz do:',
@@ -590,6 +604,7 @@ $1',
 'site-atom-feed' => 'Kanał Atom {{GRAMMAR:D.lp|$1}}',
 'page-rss-feed' => 'Kanał RSS „$1”',
 'page-atom-feed' => 'Kanał Atom „$1”',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1 (strona nie istnieje)',
 'sort-descending' => 'Sortuj malejąco',
 'sort-ascending' => 'Sortuj rosnąco',
@@ -713,9 +728,18 @@ Zauważ, że do momentu wyczyszczenia pamięci podręcznej przeglądarki niektó
 'welcomecreation-msg' => 'Twoje konto zostało utworzone.
 Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
 'yourname' => 'Nazwa {{GENDER:|użytkownika|użytkowniczki}}',
+'userlogin-yourname' => 'Nazwa użytkownika',
+'userlogin-yourname-ph' => 'Wprowadź swoją nazwę użytkownika',
 'yourpassword' => 'Hasło',
+'userlogin-yourpassword' => 'Hasło',
+'userlogin-yourpassword-ph' => 'Wpisz swoje hasło',
+'createacct-yourpassword-ph' => 'Wprowadź hasło',
 'yourpasswordagain' => 'Powtórz hasło',
+'createacct-yourpasswordagain' => 'Potwierdź hasło',
+'createacct-yourpasswordagain-ph' => 'Wprowadź hasło jeszcze raz',
 'remembermypassword' => 'Zapamiętaj moje hasło na tym komputerze (maksymalnie przez $1 {{PLURAL:$1|dzień|dni}})',
+'userlogin-remembermypassword' => 'Nie wylogowuj mnie',
+'userlogin-signwithsecure' => 'Użyj bezpiecznego połączenia',
 'securelogin-stick-https' => 'Po zalogowaniu utrzymuj połączenie poprzez HTTPS',
 'yourdomainname' => 'Twoja domena',
 'password-change-forbidden' => 'Nie można zmieniać haseł na tej wiki.',
@@ -728,18 +752,38 @@ Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
 'logout' => 'Wyloguj',
 'userlogout' => 'Wyloguj',
 'notloggedin' => 'Nie jesteś zalogowany',
+'userlogin-noaccount' => 'Nie masz konta?',
+'userlogin-joinproject' => 'Dołącz do {{GRAMMAR:D.lp|{{SITENAME}}}}',
 'nologin' => "Nie masz konta? '''$1'''.",
 'nologinlink' => 'Zarejestruj się',
 'createaccount' => 'Załóż nowe konto',
 'gotaccount' => "Masz już konto? '''$1'''.",
 'gotaccountlink' => 'Zaloguj się',
 'userlogin-resetlink' => 'Zapomniałeś danych do zalogowania się?',
+'userlogin-resetpassword-link' => 'Nie pamiętasz hasła?',
+'helplogin-url' => 'Help:Logowanie',
+'userlogin-helplink' => '<p></p>',
+'createacct-join' => 'Wpisz poniżej swoje dane.',
+'createacct-emailrequired' => 'Adres e‐mail',
+'createacct-emailoptional' => 'Adres e-mail (opcjonalnie)',
+'createacct-email-ph' => 'Wpisz swój adres e-mail',
 'createaccountmail' => 'Użyj tymczasowego hasła wygenerowanego losowo i wyślij je na podany poniżej adres e-mail',
+'createacct-realname' => 'Prawdziwe imię i nazwisko (opcjonalnie)',
 '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-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|użytkownik|użytkowników}} w ostatnim czasie',
 'badretype' => 'Wprowadzone hasła różnią się między sobą.',
 'userexists' => 'Wybrana przez Ciebie nazwa użytkownika jest już zajęta.
 Wybierz inną nazwę użytkownika.',
 'loginerror' => 'Błąd logowania',
+'createacct-error' => 'Błąd tworzenia konta',
 'createaccounterror' => 'Nie można utworzyć konta $1',
 'nocookiesnew' => 'Konto użytkownika zostało utworzone, ale nie jesteś zalogowany.
 {{SITENAME}} używa ciasteczek do przechowywania informacji o zalogowaniu się.
@@ -782,7 +826,7 @@ Po otrzymaniu go zaloguj się ponownie.',
 'eauthentsent' => 'Potwierdzenie zostało wysłane na adres e‐mail.
 Zanim jakiekolwiek inne wiadomości zostaną wysłane na ten adres, należy wykonać zawarte w mailu instrukcje. Potwierdzisz w ten sposób, że ten adres e‐mail należy do Ciebie.',
 'throttled-mailpassword' => 'Przypomnienie hasła zostało już wysłane w ciągu {{PLURAL:$1|ostatniej godziny|ostatnich $1 godzin}}.
-W celu powstrzymania nadużyć możliwość wysyłania przypomnień została ograniczona do jednego na {{PLURAL:$1|godzinę|$1 godziny|$1 godzin}}.',
+Aby zapobiec nadużyciom nadużyć możliwość wysyłania przypomnień została ograniczona do jednego na {{PLURAL:$1|godzinę|$1 godziny|$1 godzin}}.',
 'mailerror' => 'W trakcie wysyłania wiadomości e‐mail wystąpił błąd: $1',
 'acct_creation_throttle_hit' => 'Z adresu IP, z którego korzystasz {{PLURAL:$1|ktoś już utworzył dziś konto|utworzono dziś $1 konta|utworzono dziś $1 kont}}, co jest maksymalną dopuszczalną liczbą w tym czasie.
 W związku z tym, osoby korzystające z tego adresu IP w chwili obecnej nie mogą założyć kolejnego.',
@@ -832,13 +876,13 @@ Aby zakończyć proces logowania, musisz ustawić nowe hasło:',
 'resetpass-wrong-oldpass' => 'Nieprawidłowe tymczasowe lub aktualne hasło.
 Być może właśnie zmienił{{GENDER:|eś|aś|eś(‐aś)}} swoje hasło lub poprosił{{GENDER:|eś|aś|eś(‐aś)}} o nowe tymczasowe hasło.',
 'resetpass-temp-password' => 'Tymczasowe hasło:',
+'resetpass-abort-generic' => 'Zmiana hasła została przerwana przez rozszerzenie.',
 
 # Special:PasswordReset
 'passwordreset' => 'Wyczyść hasło',
-'passwordreset-text' => 'Wypełnij formularz, aby zresetować swoje hasło.',
 'passwordreset-legend' => 'Zresetuj hasło',
 'passwordreset-disabled' => 'Na tej wiki wyłączono możliwość resetowania haseł.',
-'passwordreset-pretext' => '{{PLURAL:$1||Wprowadź jedną z danych poniżej}}',
+'passwordreset-emaildisabled' => 'Wysyłanie emaili zostało wyłączone na tej wiki',
 'passwordreset-username' => 'Nazwa użytkownika:',
 'passwordreset-domain' => 'Domena',
 'passwordreset-capture' => 'Czy pokazywać treść wiadomości e‐mail?',
@@ -861,7 +905,7 @@ Powinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inni popr
 Tymczasowe hasło – $2',
 'passwordreset-emailsent' => 'E‐mail pozwalający na zresetowanie hasła został wysłany.',
 '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 użytkownika: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Zmiana adresu e‐mail',
@@ -968,7 +1012,7 @@ Jednak adres IP może być współdzielony przez wielu użytkowników.
 Jeśli jesteś anonimowym użytkownikiem i uważasz, że zamieszczone tu komentarze nie są skierowane do Ciebie, [[Special:UserLogin/signup|utwórz konto]] lub [[Special:UserLogin|zaloguj się]] – dzięki temu unikniesz w przyszłości podobnych nieporozumień.''",
 'noarticletext' => 'Brak strony o tym tytule.
 Możesz [[Special:Search/{{PAGENAME}}|poszukać „{{PAGENAME}}” na innych stronach]],
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać log] lub [{{fullurl:{{FULLPAGENAME}}|action=edit}} utworzyć tę stronę]</span>.',
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać rejestr] lub [{{fullurl:{{FULLPAGENAME}}|action=edit}} utworzyć tę stronę]</span>.',
 'noarticletext-nopermission' => 'Ta strona nie posiada jeszcze zawartości.
 Możesz [[Special:Search/{{PAGENAME}}|wyszukać ten tytuł]] w treści innych stron
 lub <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} przeszukać powiązane dzienniki]</span>, ale nie masz uprawnień do utworzenia tej strony',
@@ -1077,12 +1121,15 @@ Wystąpił z nieokreślonej przyczyny.',
 Zdaje się, że została skasowana.',
 'edit-conflict' => 'Konflikt edycji.',
 'edit-no-change' => 'Twoja edycja została zignorowana, ponieważ nie zmienił{{GENDER:|eś|aś|eś(‐aś)}} niczego w tekście.',
+'postedit-confirmation' => 'Twoja edycja została zapisana.',
 'edit-already-exists' => 'Nie udało się stworzyć nowej strony.
 Strona już istnieje.',
 'defaultmessagetext' => 'Domyślny tekst komunikatu',
 'content-failed-to-parse' => 'Format zawartości typu $2 (dla modelu: $1) nieprawidłowy: $3',
 'invalid-content-data' => 'Zawartość strony zawiera nieprawidłowe dane',
 'content-not-allowed-here' => 'Zawartość tego typu ($1) nie jest dozwolona na stronie [[$2]]',
+'editwarning-warning' => 'Opuszczenie tej strony może spowodować utratę wprowadzonych przez Ciebie zmian.
+Jeśli jesteś zalogowany możesz wyłączyć wyświetlanie tego ostrzeżenia w zakładce Edycja w swoich preferencjach.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1365,15 +1412,7 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
 'searchdisabled' => 'Wyszukiwanie w {{GRAMMAR:MS.lp|{{SITENAME}}}} zostało wyłączone.
 W międzyczasie możesz skorzystać z wyszukiwania Google.
 Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google nieaktualne.',
-
-# Quickbar
-'qbsettings' => 'Pasek szybkiego dostępu',
-'qbsettings-none' => 'Brak',
-'qbsettings-fixedleft' => 'Stały, z lewej',
-'qbsettings-fixedright' => 'Stały, z prawej',
-'qbsettings-floatingleft' => 'Unoszący się, z lewej',
-'qbsettings-floatingright' => 'Unoszący się, z prawej',
-'qbsettings-directionality' => 'Ustawione na stałe, zgodnie z kierunkiem zapisywania w wybranym języku',
+'search-error' => 'Wystąpił błąd podczas wyszukiwania:$1',
 
 # Preferences page
 'preferences' => 'Preferencje',
@@ -1509,7 +1548,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'userrights-groups-help' => 'Możesz zmienić przynależność tego użytkownika do podanych grup.
 * Zaznaczone pole oznacza przynależność użytkownika do danej grupy.
 * Niezaznaczone pole oznacza, że użytkownik nie należy do danej grupy.
-* Gwiazdka * informuje, że nie możesz usunąć z grupy po dodaniu do niej lub dodać po usunięciu z grupy.',
+* Gwiazdka * informuje, że nie możesz usunąć użytkownika z grupy po dodaniu do niej lub dodać po usunięciu z grupy.',
 'userrights-reason' => 'Powód',
 'userrights-no-interwiki' => 'Nie masz dostępu do edycji uprawnień na innych wiki.',
 'userrights-nodatabase' => 'Baza danych $1 nie istnieje lub nie jest lokalna.',
@@ -1517,6 +1556,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'userrights-notallowed' => 'Nie jesteś upoważniony do nadawania i odbierania uprawnień użytkownikom.',
 'userrights-changeable-col' => 'Grupy, które możesz wybrać',
 'userrights-unchangeable-col' => 'Grupy, których nie możesz wybrać',
+'userrights-conflict' => 'Konflikt uprawnień użytkownika! Proszę zastosować zmiany ponownie.',
 
 # Groups
 'group' => 'Grupa',
@@ -1563,7 +1603,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'right-autoconfirmed' => 'Edycja stron częściowo zabezpieczonych',
 'right-bot' => 'Oznaczanie edycji jako wykonanych automatycznie',
 'right-nominornewtalk' => 'Drobne zmiany na stronach dyskusji użytkowników nie włączają powiadomienia o nowej wiadomości',
-'right-apihighlimits' => 'Zwiększony limit w zapytaniach, wykonywanych poprzez interfejs API',
+'right-apihighlimits' => 'Zwiększony limit w zapytaniach wykonywanych poprzez interfejs API',
 'right-writeapi' => 'Zapis poprzez interfejs API',
 'right-delete' => 'Usuwanie stron',
 'right-bigdelete' => 'Usuwanie stron z długą historią edycji',
@@ -1644,7 +1684,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'action-autopatrol' => 'oznaczenia własnej edycji jako „sprawdzonej”',
 'action-unwatchedpages' => 'podglądu listy nieobserwowanych stron',
 'action-mergehistory' => 'łączenia historii edycji tej strony',
-'action-userrights' => 'edytowania uprawnień wszystkich użytkowników',
+'action-userrights' => 'edycja uprawnień użytkowników',
 'action-userrights-interwiki' => 'edytowania uprawnień użytkowników na innych witrynach wiki',
 'action-siteadmin' => 'blokowania i odblokowywania bazy danych',
 'action-sendemail' => 'wysyłania e-maili',
@@ -1681,7 +1721,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'rc_categories_any' => 'Wszystkie',
 'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajty|bajtów}} po zmianie',
 'newsectionsummary' => '/* $1 */ nowa sekcja',
-'rc-enhanced-expand' => 'Pokaż szczegóły (wymagana JavaScript)',
+'rc-enhanced-expand' => 'Pokaż szczegóły (wymagany JavaScript)',
 'rc-enhanced-hide' => 'Ukryj szczegóły',
 'rc-old-title' => 'oryginalnie utworzono jako "$1"',
 
@@ -1934,7 +1974,6 @@ Ponieważ ta wiki została skonfigurowana jako publiczna dla zapewnienia optymal
 'http-read-error' => 'Błąd odczytu HTTP.',
 'http-timed-out' => 'Przekroczony czas żądania HTTP.',
 'http-curl-error' => 'Błąd pobierania z adresu $1',
-'http-host-unreachable' => 'Adres jest nieosiągalny.',
 'http-bad-status' => 'Wystąpił problem z realizacją żądania HTTP $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2093,6 +2132,12 @@ Sprawdź inne linki do szablonów, zanim usuniesz tę stronę.',
 a powinny odwoływać się bezpośrednio do stron treści.<br />
 Strona uznawana jest za ujednoznaczniającą, jeśli zawiera szablon linkowany przez stronę [[MediaWiki:Disambiguationspage]]",
 
+'pageswithprop' => 'Strony z właściwościami',
+'pageswithprop-legend' => 'Strony z właściwościami',
+'pageswithprop-text' => 'Ta strona zawiera listę stron korzystających z właściwości.',
+'pageswithprop-prop' => 'Nazwa właściwości:',
+'pageswithprop-submit' => 'Pokaż',
+
 'doubleredirects' => 'Podwójne przekierowania',
 'doubleredirectstext' => 'Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.
 Każdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, do którego prowadzi drugie przekierowanie. Ostatni link prowadzi zazwyczaj do strony, do której powinna w rzeczywistości przekierowywać pierwsza strona.
@@ -2341,8 +2386,8 @@ Każda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie
 'notvisiblerev' => 'Wersja została usunięta',
 'watchnochange' => 'Żadna z obserwowanych stron nie była edytowana w podanym okresie.',
 'watchlist-details' => 'Lista obserwowanych przez Ciebie stron zawiera {{PLURAL:$1|$1 pozycję|$1 pozycje|$1 pozycji}}, nie licząc stron dyskusji.',
-'wlheader-enotif' => 'Wysyłanie powiadomień na adres e‐mail jest włączone.',
-'wlheader-showupdated' => "'''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej na nich wizyty.",
+'wlheader-enotif' => 'Wysyłanie powiadomień na adres e‐mail jest włączone.',
+'wlheader-showupdated' => "'''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej na nich wizyty.",
 'watchmethod-recent' => 'poszukiwanie ostatnich zmian wśród obserwowanych stron',
 'watchmethod-list' => 'poszukiwanie obserwowanych stron wśród ostatnich zmian',
 'watchlistcontains' => 'Na liście obserwowanych przez Ciebie stron {{PLURAL:$1|znajduje się 1 pozycja|znajdują się $1 pozycje|znajduje się $1 pozycji}}.',
@@ -2446,8 +2491,8 @@ Autorem ostatniej zmiany jest teraz [[User:$3|$3]] ([[User talk:$3|dyskusja]]{{i
 'editcomment' => "Edycję opisał „''$1''”.",
 'revertpage' => 'Wycofano edycje użytkownika [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]]). Autor przywróconej wersji to [[User:$1|$1]].',
 'revertpage-nouser' => 'Wycofano edycje (nazwa użytkownika usunięta). Autor przywróconej wersji to [[User:$1|$1]].',
-'rollback-success' => 'Wycofano edycje użytkownika $1.
-Przywrócono ostatnią wersję autorstwa $2.',
+'rollback-success' => 'Wycofano edycje użytkownika $1;
+przywrócono ostatnią wersję autorstwa $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Błąd sesji',
@@ -2459,12 +2504,12 @@ Naciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wyd
 'protectlogpage' => 'Zabezpieczone',
 'protectlogtext' => 'Poniżej znajduje się lista zmian w zabezpieczeniu pojedynczych stron.
 Wszystkie aktywne zabezpieczenia odnajdziesz na liście [[Special:ProtectedPages|zabezpieczonych stron]].',
-'protectedarticle' => '{{GENDER:$2|zabezpieczył|zabezpieczyła}} [[$1]]',
-'modifiedarticleprotection' => '{{GENDER:$2|zmienił|zmieniła}} poziom zabezpieczenia [[$1]]',
+'protectedarticle' => 'zabezpieczono "[[$1]]"',
+'modifiedarticleprotection' => 'zmieniono stopień zabezpieczenia "[[$1]]"',
 'unprotectedarticle' => 'odbezpieczył [[$1]]',
 'movedarticleprotection' => 'przeniósł ustawienia zabezpieczeń z [[$2]] do [[$1]]',
-'protect-title' => 'Zmiana poziomu zabezpieczenia „$1”',
-'protect-title-notallowed' => 'Podgląd poziomu zabezpieczenia „$1”',
+'protect-title' => 'Zmiana stopnia zabezpieczenia „$1”',
+'protect-title-notallowed' => 'Podgląd stopnia zabezpieczenia „$1”',
 'prot_1movedto2' => 'stronę [[$1]] przeniósł do [[$2]]',
 'protect-badnamespace-title' => 'Przestrzeń nazw, w której nie można zabezpieczać stron',
 'protect-badnamespace-text' => 'Stron w tej przestrzeni nazw nie można zabezpieczać.',
@@ -2476,15 +2521,15 @@ Wszystkie aktywne zabezpieczenia odnajdziesz na liście [[Special:ProtectedPages
 'protect_expiry_invalid' => 'Podany czas automatycznego odbezpieczenia jest nieprawidłowy.',
 'protect_expiry_old' => 'Podany czas automatycznego odblokowania znajduje się w przeszłości.',
 'protect-unchain-permissions' => 'Odblokuj dodatkowe opcje zabezpieczania',
-'protect-text' => "Możesz tu sprawdzić i zmienić poziom zabezpieczenia strony '''$1'''.",
+'protect-text' => "Możesz tu sprawdzić i zmienić stopień zabezpieczenia strony '''$1'''.",
 'protect-locked-blocked' => "Nie możesz zmienić poziomów zabezpieczenia, ponieważ jesteś zablokowany.
 Obecne ustawienia dla strony '''$1''' to:",
 'protect-locked-dblock' => "Nie można zmienić poziomu zabezpieczenia z powodu działającej blokady bazy danych. Obecne ustawienia dla strony '''$1''' to:",
 'protect-locked-access' => "Nie masz uprawnień do zmiany poziomu zabezpieczenia strony. Obecne ustawienia dla strony '''$1''' to:",
-'protect-cascadeon' => 'Ta strona jest zabezpieczona przed edycją, ponieważ jest używana przez {{PLURAL:$1|następującą stronę, która została zabezpieczona|następujące strony, które zostały zabezpieczone}} z włączoną opcją dziedziczenia. Możesz zmienić poziom zabezpieczenia strony, ale nie wpłynie to na dziedziczenie zabezpieczenia.',
+'protect-cascadeon' => 'Ta strona jest zabezpieczona przed edycją, ponieważ jest używana przez {{PLURAL:$1|następującą stronę, która została zabezpieczona|następujące strony, które zostały zabezpieczone}} z włączoną opcją dziedziczenia. Możesz zmienić stopień zabezpieczenia strony, ale nie wpłynie to na dziedziczenie zabezpieczenia.',
 'protect-default' => 'Dostęp mają wszyscy użytkownicy',
 'protect-fallback' => 'Wymaga uprawnień „$1”',
-'protect-level-autoconfirmed' => 'Blokuj nowych i niezarejestrowanych użytkowników',
+'protect-level-autoconfirmed' => 'Dozwolone dla wszystkich poza nowymi i niezalogowanymi użytkownikami',
 'protect-level-sysop' => 'Dozwolone tylko dla administratorów',
 'protect-summary-cascade' => 'dziedziczenie',
 'protect-expiring' => 'wygasa $1 (UTC)',
@@ -2505,7 +2550,7 @@ Obecne ustawienia dla strony '''$1''' to:",
 'protect-edit-reasonlist' => 'Edytuj listę przyczyn zabezpieczenia',
 'protect-expiry-options' => '1 godzina:1 hour,1 dzień:1 day,1 tydzień:1 week,2 tygodnie:2 weeks,1 miesiąc:1 month,3 miesiące:3 months,6 miesięcy:6 months,1 rok:1 year,na zawsze:infinite',
 'restriction-type' => 'Ograniczenia',
-'restriction-level' => 'Poziom',
+'restriction-level' => 'Stopień',
 'minimum-size' => 'Minimalny rozmiar',
 'maximum-size' => 'Maksymalny rozmiar',
 'pagesize' => '(bajtów)',
@@ -2519,7 +2564,7 @@ Obecne ustawienia dla strony '''$1''' to:",
 # Restriction levels
 'restriction-level-sysop' => 'całkowite zabezpieczenie',
 'restriction-level-autoconfirmed' => 'częściowe zabezpieczenie',
-'restriction-level-all' => 'dowolny poziom',
+'restriction-level-all' => 'dowolny stopień',
 
 # Undelete
 'undelete' => 'Odtwórz usuniętą stronę',
@@ -2725,7 +2770,7 @@ Przyczyna blokady $1 to: „$2”',
 'blocklogtext' => 'Poniżej znajduje się lista blokad założonych i zdjętych z poszczególnych adresów IP.
 Na liście nie znajdą się adresy IP, które zablokowano w sposób automatyczny.
 By przejrzeć listę obecnie aktywnych blokad, przejdź na stronę [[Special:BlockList|zablokowanych adresów i użytkowników]].',
-'unblocklogentry' => '{{GENDER:$2|zdjął|zdjęła}} blokadę $1',
+'unblocklogentry' => 'zdjęto blokadę z $1',
 'block-log-flags-anononly' => 'tylko anonimowi',
 'block-log-flags-nocreate' => 'blokada tworzenia konta',
 'block-log-flags-noautoblock' => 'automatyczne blokowanie wyłączone',
@@ -2755,6 +2800,7 @@ O tym poważnym problemie dotyczącym bezpieczeństwa należy poinformować dost
 'sorbsreason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.',
 'sorbs_create_account_reason' => 'Twój adres IP znajduje się na liście serwerów open proxy w DNSBL, używanej przez {{GRAMMAR:B.lp|{{SITENAME}}}}.
 Nie możesz utworzyć konta',
+'xffblockreason' => 'Adres IP obecny w nagłówku X-Forwarded-For – twój lub serwera proxy, z którego korzystasz – został zablokowany. Powód blokady to: $1',
 'cant-block-while-blocked' => 'Nie możesz zablokować innych użytkowników, kiedy sam jesteś zablokowany.',
 'cant-see-hidden-user' => 'Konto użytkownika, które próbujesz zablokować, zostało już zablokowane oraz ukryte. Bez uprawnienia do ukrywania kont nie możesz zobaczyć oraz modyfikować blokady tego użytkownika.',
 'ipbblocked' => 'Nie możesz blokować i odblokowywać innych użytkowników, ponieważ sam jesteś zablokowany',
@@ -2918,6 +2964,8 @@ Odwiedź [//www.mediawiki.org/wiki/Localisation Tłumaczenie MediaWiki] oraz [//
 'thumbnail-more' => 'Powiększ',
 'filemissing' => 'Brak pliku',
 'thumbnail_error' => 'Błąd przy generowaniu miniatury $1',
+'thumbnail_error_remote' => 'Komunikat o błędzie z {{grammar:2sg|$1}}:
+$2',
 'djvu_page_error' => 'Strona DjVu poza zakresem',
 'djvu_no_xml' => 'Nie można pobrać danych w formacie XML dla pliku DjVu',
 'thumbnail-temp-create' => 'Nie można utworzyć pliku tymczasowego miniatury',
@@ -2981,9 +3029,9 @@ Brak katalogu dla plików tymczasowych.',
 # Import log
 'importlogpage' => 'Rejestr importu',
 'importlogpagetext' => 'Rejestr przeprowadzonych importów stron z innych serwisów wiki.',
-'import-logentry-upload' => '{{GENDER:$2|zaimportował|zaimportowała}} [[$1]] przez przesłanie pliku',
+'import-logentry-upload' => 'Zaimportowano [[$1]] przez pobieranie plików',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|wersja|wersje|wersji}}',
-'import-logentry-interwiki' => '{{GENDER:$2|zaimportował|zaimportowała}} $1 używając transwiki',
+'import-logentry-interwiki' => 'zaimportowano $1 używając transwiki',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|wersja|wersje|wersji}} z $2',
 
 # JavaScriptTest
@@ -3007,7 +3055,7 @@ Brak katalogu dla plików tymczasowych.',
 'tooltip-pt-login' => 'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.',
 'tooltip-pt-anonlogin' => 'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe',
 'tooltip-pt-logout' => 'Wyloguj',
-'tooltip-ca-talk' => 'Dyskusja o zawartości tej strony.',
+'tooltip-ca-talk' => 'Dyskusja o zawartości tej strony',
 'tooltip-ca-edit' => 'Możesz edytować tę stronę. Przed zapisaniem zmian użyj przycisku podgląd.',
 'tooltip-ca-addsection' => 'Dodaj nowy wątek.',
 'tooltip-ca-viewsource' => 'Ta strona jest zabezpieczona. Możesz zobaczyć tekst źródłowy.',
@@ -3068,30 +3116,21 @@ Pozwala na wpisanie powodu w opisie zmian.',
 
 # Stylesheets
 'common.css' => '/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */',
-'standard.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Standardowa */',
-'nostalgia.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Tęsknota */',
 'cologneblue.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Błękit */',
 'monobook.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Książka */',
-'myskin.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Moja skórka */',
-'chick.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Kurczaczek */',
-'simple.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Prosta */',
 'modern.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Nowoczesna */',
 'vector.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd skórki Wektor */',
 'print.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd wydruku */',
-'handheld.css' => '/* Umieszczony tutaj kod CSS wpłynie na wygląd na urządzeniach kieszonkowych skórki ustawionej w zmiennej $wgHandheldStyle */',
 'noscript.css' => '/* Umieszczony tu arkusz stylów CSS będzie wykorzystywany dla użytkowników z wyłączoną obsługą JavaScript */',
 'group-autoconfirmed.css' => '/* CSS tutaj umieszczony będzie dotyczyć tylko automatycznie zatwierdzonych użytkowników */',
 'group-bot.css' => '/* CSS tutaj umieszczony będzie obowiązywał tylko dla botów */',
+'group-sysop.css' => '/* Umieszczony tutaj kod CSS dotyczyć będzie tylko administratorów */',
+'group-bureaucrat.css' => '/* Umieszczony tutaj kod CSS dotyczyć będzie tylko biurokratów */',
 
 # Scripts
 'common.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany przez każdego użytkownika, podczas każdego ładowania strony. */',
-'standard.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Standardowa */',
-'nostalgia.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Tęsknota */',
 'cologneblue.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Błękit */',
 'monobook.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Książka */',
-'myskin.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Moja skórka */',
-'chick.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Kurczaczek */',
-'simple.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Prosta */',
 'modern.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Nowoczesna */',
 'vector.js' => '/* Umieszczony tutaj kod JavaScript zostanie załadowany wyłącznie przez użytkowników korzystających ze skórki Wektor */',
 
@@ -3125,7 +3164,7 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-not-current' => 'Niestety, te informacje nie są dostępne dla starych wersji stron.',
 'pageinfo-header-basic' => 'Podstawowe informacje',
 'pageinfo-header-edits' => 'Historia edycji',
-'pageinfo-header-restrictions' => 'Zmień zabezpieczenie',
+'pageinfo-header-restrictions' => 'Zabezpieczenie strony',
 'pageinfo-header-properties' => 'Właściwości strony',
 'pageinfo-display-title' => 'Wyświetlany tytuł',
 'pageinfo-default-sort' => 'Domyślny klucz sortowania',
@@ -3167,13 +3206,8 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-category-files' => 'Liczba plików',
 
 # Skin names
-'skinname-standard' => 'Standardowa',
-'skinname-nostalgia' => 'Tęsknota',
 'skinname-cologneblue' => 'Błękit',
 'skinname-monobook' => 'Książka',
-'skinname-myskin' => 'Moja skórka',
-'skinname-chick' => 'Kurczaczek',
-'skinname-simple' => 'Prosta',
 'skinname-modern' => 'Nowoczesna',
 'skinname-vector' => 'Wektor',
 
@@ -3255,11 +3289,25 @@ Jeśli go otworzysz, możesz zarazić swój system.",
 'minutes' => '{{PLURAL:$1|$1 minuta|$1 minuty|$1 minut}}',
 'hours' => '{{PLURAL:$1|$1 godzina|$1 godziny|$1 godzin}}',
 'days' => '{{PLURAL:$1|$1 dzień|$1 dni}}',
+'weeks' => '{{PLURAL:$1|$1 tydzień|$1 tygodnie|$1 tygodni}}',
 'months' => '{{PLURAL:$1|$1 miesiąc|$1 miesiące|$1 miesięcy}}',
 'years' => '{{PLURAL:$1|$1 rok|$1 lata|$1 lat}}',
 'ago' => '$1 temu',
 'just-now' => 'przed chwilą',
 
+# Human-readable timestamps
+'hours-ago' => '{{PLURAL:$1|przed godziną|$1 godziny temu|$1 godzin temu}}',
+'minutes-ago' => '{{PLURAL:$1|przed minutą|$1 minuty temu|$1 minut temu}}',
+'seconds-ago' => '{{PLURAL:$1|przed sekundą|$1 sekundy temu|$1 sekund temu}}',
+'monday-at' => 'poniedziałek, $1',
+'tuesday-at' => 'wtorek, $1',
+'wednesday-at' => 'środa, $1',
+'thursday-at' => 'czwartek, $1',
+'friday-at' => 'piątek, $1',
+'saturday-at' => 'sobota, $1',
+'sunday-at' => 'niedziela, $1',
+'yesterday-at' => 'wczoraj, $1',
+
 # Bad image list
 'bad_image_list' => 'Dane należy wprowadzić w formacie:
 
@@ -3289,7 +3337,7 @@ Pozostałe pola zostaną domyślnie ukryte.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Szerokość',
 'exif-imagelength' => 'Wysokość',
 'exif-bitspersample' => 'Bitów na próbkę',
@@ -3469,7 +3517,7 @@ Pozostałe pola zostaną domyślnie ukryte.
 'exif-originalimageheight' => 'Wysokość obrazu zanim został przycięty',
 'exif-originalimagewidth' => 'Szerokość obrazu zanim został przycięty',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'nieskompresowany',
 'exif-compression-2' => 'CCITT Grupa 3 Jednowymiarowe zmodyfikowane kodowanie długości algorytmem Huffmana',
 'exif-compression-3' => 'CCITT Grupa 3 kodowanie faksowe',
@@ -3814,7 +3862,7 @@ Czy na pewno chcesz ją ponownie utworzyć?",
 'autosumm-blank' => 'UWAGA! Usunięcie treści (strona pozostała pusta)!',
 'autosumm-replace' => 'UWAGA! Zastąpienie treści hasła bardzo krótkim tekstem: „$1”',
 'autoredircomment' => 'Przekierowanie do [[$1]]',
-'autosumm-new' => 'Utworzył nową stronę „$1”',
+'autosumm-new' => 'Utworzono nową stronę "$1"',
 
 # Size units
 'size-bytes' => '$1&nbsp;B',
@@ -3922,7 +3970,7 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
 'version-hook-subscribedby' => 'Zapotrzebowany przez',
 'version-version' => '(Wersja $1)',
 'version-license' => 'Licencja',
-'version-poweredby-credits' => "To wiki korzysta z oprogramowania '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001‐$1 $2.",
+'version-poweredby-credits' => "Ta wiki korzysta z oprogramowania '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001‐$1 $2.",
 'version-poweredby-others' => 'inni',
 'version-credits-summary' => 'Następujące osoby wniosły istotny wkład w rozwój oprogramowania [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki jest wolnym oprogramowaniem – możesz je dystrybuować i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (jeśli wolisz) dowolnej późniejszej.
@@ -3937,12 +3985,17 @@ Powinieneś otrzymać [{{SERVER}}{{SCRIPTPATH}}/COPYING kopię licencji GNU Gene
 'version-entrypoints-header-entrypoint' => 'Punkt wejścia',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Ścieżka do pliku',
-'filepath-page' => 'Plik',
-'filepath-submit' => 'Przejdź',
-'filepath-summary' => 'Ta strona specjalna zwraca pełną ścieżkę do pliku.
-Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwierane w skojarzonym z nimi programie.',
+# Special:Redirect
+'redirect' => 'Przekierowanie według pliku, użytkownika albo identyfikatora wersji',
+'redirect-legend' => 'Przekieruj do pliku lub strony',
+'redirect-summary' => 'Ta strona specjalna przekierowuje do pliku (wg nazwy pliku), do strony (wg numeru wersji) albo do strony użytkownika (wg liczbowego identyfikatora użytkownika)',
+'redirect-submit' => 'Przejdź',
+'redirect-lookup' => 'Wyszukaj:',
+'redirect-value' => 'Wartość:',
+'redirect-user' => 'ID użytkownika',
+'redirect-revision' => 'Wersja strony',
+'redirect-file' => 'Nazwa pliku',
+'redirect-not-exists' => 'Nie znaleziono wartości',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Szukaj duplikatów pliku',
@@ -4032,6 +4085,9 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'htmlform-submit' => 'Zapisz',
 'htmlform-reset' => 'Cofnij zmiany',
 'htmlform-selectorother-other' => 'Inne',
+'htmlform-no' => 'Nie',
+'htmlform-yes' => 'Tak',
+'htmlform-chosen-placeholder' => 'Wybierz opcję',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 z obsługą pełnotekstowego wyszukiwania',
@@ -4044,11 +4100,11 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'logentry-delete-revision' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
 'logentry-delete-event-legacy' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzeń w rejestrze strony $3',
 'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|zmienił|zmieniła}} widoczność wersji strony $3',
-'logentry-suppress-delete' => '$1 ukrywa stronę $3',
-'logentry-suppress-event' => '$1 potajemnie zmienia widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w $3, wykonano następujące operacje: $4',
-'logentry-suppress-revision' => '$1 potajemnie zmienia widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
-'logentry-suppress-event-legacy' => '$1 potajemnie zmienia widoczność zdarzenia w rejestrze $3',
-'logentry-suppress-revision-legacy' => '$1 potajemnie zmienia widoczność wersji strony $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|ukrył|ukryła}} stronę $3',
+'logentry-suppress-event' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w $3, wykonano następujące operacje: $4',
+'logentry-suppress-revision' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4',
+'logentry-suppress-event-legacy' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzenia w rejestrze dla strony $3',
+'logentry-suppress-revision-legacy' => '$1 potajemnie {{GENDER:$2|zmienił|zmieniła}} widoczność wersji strony $3',
 'revdelete-content-hid' => 'treść została ukryta',
 'revdelete-summary-hid' => 'opis zmian został ukryty',
 'revdelete-uname-hid' => 'nazwa użytkownika została ukryta',
@@ -4063,19 +4119,19 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4 w miejsce przekierowania i bez pozostawienia przekierowania pod starym tytułem',
 'logentry-patrol-patrol' => '$1 {{GENDER:$2|oznaczył|oznaczyła}} wersję $4 strony $3 jako sprawdzoną',
 'logentry-patrol-patrol-auto' => '$1 automatycznie {{GENDER:$2|oznaczył|oznaczyła}} wersję $4 strony $3 jako sprawdzoną',
-'logentry-newusers-newusers' => 'Konto użytkownika $1 zostało utworzone',
-'logentry-newusers-create' => 'Konto użytkownika $1 zostało utworzone',
-'logentry-newusers-create2' => 'Konto użytkownika $3 zostało utworzone przez użytkownika $1',
+'logentry-newusers-newusers' => 'Konto {{GENDER:$2|użytkownika|użytkowniczki}} $1 zostało utworzone',
+'logentry-newusers-create' => 'Konto {{GENDER:$2|użytkownika|użytkowniczki}} $1 zostało utworzone',
+'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 tworzy konto użytkownika',
+'logentry-newusers-autocreate' => '$1 automatycznie {{GENDER:$2|utworzył|utworzyła|utworzył}} konto użytkownika',
 '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)',
 'rightsnone' => 'brak',
 
 # Feedback
-'feedback-bugornote' => 'Jeśli jesteś {{GENDER:|gotów|gotowa}} szczegółowo opisać problem techniczny proszę [$1 zgłoś błąd].
-W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zostanie dodany do strony "[$3  $2]", wraz z nazwą użytkownika i nazwą przeglądarki.',
+'feedback-bugornote' => 'Jeśli jesteś {{GENDER:|gotów|gotowa}} szczegółowo opisać problem techniczny, proszę [$1 zgłoś błąd].
+W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zostanie dodany do strony "[$3  $2]", wraz z nazwą użytkownika.',
 'feedback-subject' => 'Temat',
 'feedback-message' => 'Wiadomość:',
 'feedback-cancel' => 'Anuluj',
index b343e58..2cec50d 100644 (file)
@@ -44,138 +44,137 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Anliure con la sotliniadura',
 'tog-justify' => 'Paràgraf: giustificà',
-'tog-hideminor' => 'Stërma le modìfiche cite<br />ant sla pàgina "Ùltime Modìfiche"',
-'tog-hidepatrolled' => "Stërma le modìfiche verificà ant j'ùltime modìfiche",
-'tog-newpageshidepatrolled' => 'Stërma le pàgine verificà da la lista dle pàgine neuve',
-'tog-extendwatchlist' => 'Slarga la funsion "ten sot euj" an manera che a la smon-a tute le modìfiche, nen mach l\'ùltima',
-'tog-usenewrc' => "Deuvra j'ùltime modìfiche ameliorà (a-i và JavaScript)",
+'tog-hideminor' => "Stërmé le modìfiche cite ant sla pàgina dj'ùltime modìfiche",
+'tog-hidepatrolled' => "Stërmé le modìfiche dzorvejà ant j'ùltime modìfiche",
+'tog-newpageshidepatrolled' => 'Stërmé le pàgine dzorvejà da la lista dle pàgine neuve',
+'tog-extendwatchlist' => "Slarghé la lista ëd ròba che as ten sot-euj an manera che a la smon-a tute le modìfiche, nen mach j'ùltime",
+'tog-usenewrc' => "Argropré le modìfiche për pàgina ant j'ùltime modìfiche e ant la lista dla ròba ch'as ten sot-euj (a-i và JavaScript)",
 'tog-numberheadings' => 'Tìtoj ëd paràgraf<br />che as nùmero daspërlor',
-'tog-showtoolbar' => "Mostra la bara dj'utiss (a-i va Javascript)",
-'tog-editondblclick' => "Dobia sgnacà për modifiché l'artìcol<br />(a-i va JavaScript)",
-'tog-editsection' => "Abìlita la modìfica dle session con j'anliure [modìfica]",
-'tog-editsectiononrightclick' => 'Abilité la modìfica dle session ën sgnacand-je ansima<br />  al tìtol col tast drit dël rat (a-i va Javascript)',
-'tog-showtoc' => "Buta le tàole dij contnù<br />(për j'artìcoj che l'han pì che 3 session)",
-'tog-rememberpassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di|di}})",
-'tog-watchcreations' => "Gionta le pàgine che i creo mi e j'archivi che i cario mi a la lista ëd lòn che im ten-o sot euj",
-'tog-watchdefault' => "Gionta le pàgine che i modìfico mi a la lista dle ròbe ch'i ten-o sot-euj",
-'tog-watchmoves' => "Gionta le pàgine e j'archivi che i tramudo a lòn che im ten-o sot euj",
-'tog-watchdeletion' => "Gionta le pàgine e j'archivi che i scancelo via a la lista ëd lòn che im ten-o sot euj",
-'tog-minordefault' => 'Marca tute le modìfice coma cite<br />(mach coma predefinission dla casela)',
+'tog-showtoolbar' => "Smon-e la bara dj'utiss ëd modìfica (a-i va Javascript)",
+'tog-editondblclick' => "Dobia sgnacà për modifiché l'artìcol (a-i va JavaScript)",
+'tog-editsection' => "Abilité le modìfiche ëd session con j'anliure [modifiché]",
+'tog-editsectiononrightclick' => 'Abilité la modìfica dle session ën sgnacand-je ansima al tìtol col tast drit dël rat (a-i va Javascript)',
+'tog-showtoc' => "Smon-e la tàula dij contnù (për le pàgine che l'han pì che 3 session)",
+'tog-rememberpassword' => "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di}})",
+'tog-watchcreations' => "Gionté le pàgine che i creo mi e j'archivi che i cario mi a la lista ëd lòn che im ten-o sot-euj",
+'tog-watchdefault' => "Gionté le pàgine e j'archivi che i modìfico mi a la lista dle ròbe ch'i ten-o sot-euj",
+'tog-watchmoves' => "Gionté le pàgine e j'archivi che i tramudo a lòn che im ten-o sot-euj",
+'tog-watchdeletion' => "Gionté le pàgine e j'archivi che i scancelo via a la lista ëd lòn che im ten-o sot-euj",
+'tog-minordefault' => 'Marché tute le modìfiche coma cite coma predefinission',
 'tog-previewontop' => 'Smon-e la preuva dzora al quàder ëd modìfica dël test e nen sota',
-'tog-previewonfirst' => 'Smon na preuva la prima vira che as fa na modìfica',
+'tog-previewonfirst' => 'Smon-e na preuva la prima vira che as fa na modìfica',
 'tog-nocache' => 'Disabilité la memòria local ëd le pàgine dël navigador',
-'tog-enotifwatchlistpages' => "Mandeme un mëssagi an pòsta eletrònica quand a-i son dle modìfiche a le pàgine ch'im ten-o sot euj",
-'tog-enotifusertalkpages' => 'Mand-me un messagi ëd pòsta eletrònica quand a-i son dle modìfiche a mia pàgina dle ciaciarade',
+'tog-enotifwatchlistpages' => "Mandeme un mëssagi an pòsta eletrònica quand a-i son dle modìfiche a le pàgine ch'im ten-o sot-euj",
+'tog-enotifusertalkpages' => 'Mandeme un mëssagi ëd pòsta eletrònica quand a-i son dle modìfiche a mia pàgina dle ciaciarade',
 'tog-enotifminoredits' => "Mandeme un mëssagi an pòsta eletrònica bele che për le modìfiche cite dle pàgine o dj'archivi",
-'tog-enotifrevealaddr' => 'Lassa che a së s-ciàira mia adrëssa ëd pòsta eletrònica ant ij messagi ëd notìfica',
-'tog-shownumberswatching' => "Smon ël nùmer d'utent che as ten-o la pàgina sot euj",
+'tog-enotifrevealaddr' => 'Lassé che a së s-ciàira mia adrëssa ëd pòsta eletrònica ant ij mëssagi ëd notìfica',
+'tog-shownumberswatching' => "Smon-e ël nùmer d'utent che as ten-o la pàgina sot-euj",
 'tog-oldsig' => 'Firma esistenta:',
-'tog-fancysig' => "Trata la firma com test wiki (sensa n'anliura automàtica)",
-'tog-externaleditor' => "Dovré coma stàndard n'editor estern (mach për espert, a-i é dabzògn d'ampostassion speciaj dzora a sò ordinator. [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
-'tog-externaldiff' => "Dovré për stàndard un programa comparator estern (mach për espert, a-i é dabzògn d'ampostassion speciaj ansima a sò ordinator [//www.mediawiki.org/wiki/Manual:External_editors Për savèjne ëd pi.])",
-'tog-showjumplinks' => 'Dovré j\'anliure d\'acessibilità dla sòrt "Va a"',
+'tog-fancysig' => "Traté la firma com dël test wiki (sensa n'anliura automàtica)",
+'tog-showjumplinks' => "Dovré j'anliure d'acessibilità dla sòrt «Andé a»",
 'tog-uselivepreview' => "Dovré la fonsion ''Preuva dal viv'' (a-i va JavaScript) (sperimental)",
-'tog-forceeditsummary' => "Ciama conferma se ël somari dla modìfica a l'é veujd",
-'tog-watchlisthideown' => 'Stërma mie modìfiche ant la ròba che im ten-o sot euj',
-'tog-watchlisthidebots' => 'Stërma le modìfiche fàite daj trigomiro ant la lista dle ròbe che im ten-o sot euj',
-'tog-watchlisthideminor' => "Stërma le modìfiche cite da 'nt lòn che im ten-o sot euj",
-'tog-watchlisthideliu' => "Stërma le modìfiche fàite da j'utent registrà ant la lista dle ròbe che im ten-o sot euj",
-'tog-watchlisthideanons' => "Stërma le modìfiche fàite da j'utent anònim da 'nt lòn che im ten-o sot euj",
-'tog-watchlisthidepatrolled' => "Stërma le modìfiche verificà da 'nt la ròba che im ten-o sot euj",
-'tog-ccmeonemails' => "Mand-me còpia dij messagi ëd pòsta eletrònica che i-j mando a j'àotri utent",
-'tog-diffonly' => 'Smon pa ël contnù dla pàgina dapress a le diferense',
-'tog-showhiddencats' => 'Smon le categorìe stërmà',
+'tog-forceeditsummary' => "Ciamé conferma se ël resumé dla modìfica a l'é veujd",
+'tog-watchlisthideown' => 'Stërmé mie modìfiche ant la ròba che im ten-o sot-euj',
+'tog-watchlisthidebots' => 'Stërmé le modìfiche fàite daj trigomiro ant la lista dle ròbe che im ten-o sot-euj',
+'tog-watchlisthideminor' => "Stërmé le modìfiche cite da 'nt lòn che im ten-o sot-euj",
+'tog-watchlisthideliu' => "Stërmé le modìfiche fàite da j'utent registrà ant la lista dle ròbe che im ten-o sot-euj",
+'tog-watchlisthideanons' => "Stërmé le modìfiche fàite da j'utent anònim da 'nt lòn che im ten-o sot-euj",
+'tog-watchlisthidepatrolled' => "Stërmé le modìfiche dzorvejà da 'nt la ròba che im ten-o sot-euj",
+'tog-ccmeonemails' => "Mandeme na còpia dij mëssagi ëd pòsta eletrònica che i-j mando a j'àotri utent",
+'tog-diffonly' => 'Smon-e pa ël contnù dle pàgine sota le diferense',
+'tog-showhiddencats' => 'Smon-e le categorìe stërmà',
 'tog-noconvertlink' => "Disativé la conversion dij tìtoj ant j'anliure",
-'tog-norollbackdiff' => "Fa nen vëdde le diferense apress d'avèj ripristinà",
+'tog-norollbackdiff' => "Fé nen vëdde le diferense apress d'avèj ripristinà",
+'tog-useeditwarning' => 'Aviseme quand che i chito na pàgina ëd modìfiche con dle modìfiche nen salvà',
 
 'underline-always' => 'Sempe',
 'underline-never' => 'Mai',
-'underline-default' => 'Stàndard dël navigator',
+'underline-default' => 'Stàndard dël navigator o dël tema',
 
 # Font style option in Special:Preferences
-'editfont-style' => "Stil dël font ëd l'àrea ëd modìfica:",
+'editfont-style' => "Stil dij caràter ëd l'àrea ëd modìfica:",
 'editfont-default' => 'Stàndard dël navigator',
-'editfont-monospace' => 'Font mono-spassià',
-'editfont-sansserif' => 'Font sans-serif',
-'editfont-serif' => 'Font serif',
+'editfont-monospace' => 'Caràter mono-spassià',
+'editfont-sansserif' => 'Caràter sensa piòte',
+'editfont-serif' => 'Caràter con piòte',
 
 # Dates
-'sunday' => 'Dumìnica',
-'monday' => 'Lùn-es',
-'tuesday' => 'Màrtes',
-'wednesday' => 'Merco',
-'thursday' => 'Giòbia',
-'friday' => 'Vënner',
-'saturday' => 'Saba',
-'sun' => 'Dum',
-'mon' => 'Lun',
-'tue' => 'Màr',
-'wed' => 'Mer',
-'thu' => 'Giò',
-'fri' => 'Vën',
-'sat' => 'Sab',
-'january' => 'Gené',
-'february' => 'Fërvé',
-'march' => 'Mars',
-'april' => 'Avril',
-'may_long' => 'Magg',
-'june' => 'Giugn',
-'july' => 'Luj',
-'august' => 'Aost',
-'september' => 'Stèmber',
-'october' => 'Otóber',
-'november' => 'Novèmber',
-'december' => 'Dzèmber',
-'january-gen' => 'Gené',
-'february-gen' => 'Fërvé',
-'march-gen' => 'Mars',
-'april-gen' => 'Avril',
-'may-gen' => 'Magg',
-'june-gen' => 'Giugn',
-'july-gen' => 'Luj',
-'august-gen' => 'Aost',
-'september-gen' => 'Stèmber',
-'october-gen' => 'Otóber',
-'november-gen' => 'Novèmber',
-'december-gen' => 'Dzèmber',
-'jan' => 'Gen',
-'feb' => 'Fër',
-'mar' => 'Mar',
-'apr' => 'Avr',
-'may' => 'Mag',
-'jun' => 'Giu',
-'jul' => 'Luj',
-'aug' => 'Aos',
-'sep' => 'Stè',
-'oct' => 'Otó',
-'nov' => 'Nov',
-'dec' => 'Dzè',
+'sunday' => 'dumìnica',
+'monday' => 'lùn-es',
+'tuesday' => 'màrtes',
+'wednesday' => 'merco',
+'thursday' => 'giòbia',
+'friday' => 'vënner',
+'saturday' => 'saba',
+'sun' => 'dum',
+'mon' => 'n',
+'tue' => 'màr',
+'wed' => 'mer',
+'thu' => 'giò',
+'fri' => 'vën',
+'sat' => 'sab',
+'january' => 'gené',
+'february' => 'fërvé',
+'march' => 'mars',
+'april' => 'avril',
+'may_long' => 'maj',
+'june' => 'giugn',
+'july' => 'luj',
+'august' => 'ost',
+'september' => 'stèmber',
+'october' => 'otóber',
+'november' => 'novèmber',
+'december' => 'dzèmber',
+'january-gen' => 'gené',
+'february-gen' => 'fërvé',
+'march-gen' => 'mars',
+'april-gen' => 'avril',
+'may-gen' => 'maj',
+'june-gen' => 'giugn',
+'july-gen' => 'luj',
+'august-gen' => 'ost',
+'september-gen' => 'stèmber',
+'october-gen' => 'otóber',
+'november-gen' => 'novèmber',
+'december-gen' => 'dzèmber',
+'jan' => 'gen',
+'feb' => 'fër',
+'mar' => 'mar',
+'apr' => 'avr',
+'may' => 'maj',
+'jun' => 'giu',
+'jul' => 'luj',
+'aug' => 'ost',
+'sep' => 'stè',
+'oct' => 'otó',
+'nov' => 'nov',
+'dec' => 'dzè',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorìa|Categorìe}}',
-'category_header' => 'Artìcoj ant la categorìa "$1"',
-'subcategories' => 'Sotacategorìe',
-'category-media-header' => 'Archivi ant la categorìa "$1"',
+'category_header' => 'Pàgine ant la categorìa «$1»',
+'subcategories' => 'Sot-categorìe',
+'category-media-header' => 'Archivi multimojen ant la categorìa «$1»',
 'category-empty' => "''Al dì d'ancheuj la categorìa a l'ha pa andrinta nì 'd pàgine, nì d'archivi multimojen.''",
 'hidden-categories' => '{{PLURAL:$1|Categorìa stërmà|Categorìe stërmà}}',
 'hidden-category-category' => 'Categorìe stërmà',
-'category-subcat-count' => "{{PLURAL:$2|Sta categorìa-sì a l'ha mach na sot-categorìa, listà ambelessì sota.|Sta categorìa-sì a l'ha {{PLURAL:$1|na sot-categorìa|$1 sot-categorìe}}, ëd $2 ch'a-i në j'é an total.}}",
+'category-subcat-count' => "{{PLURAL:$2|Sta categorìa-sì a l'ha mach la sot-categorìa sì-dapress.|Sta categorìa-sì a l'ha {{PLURAL:$1|la sot-categorìa|le $1 sot-categorìe}} sì-dapress, ëd $2 ch'a-i në j'é an total.}}",
 'category-subcat-count-limited' => "Sta categorìa-sì a l'ha {{PLURAL:$1|la sot-categorìa|le $1 sot-categorìe}} sì-dapress.",
 'category-article-count' => "{{PLURAL:$2|Sta categorìa-sì a l'ha mach sta pàgina.|Ant sta categorìa-sì a-i {{PLURAL:$1|intra mach sta pàgina|intro $1 pàgine}} ëd $2 ch'a-i në j'é an total.}}",
 'category-article-count-limited' => 'Ant sta categorìa-sì a-i {{PLURAL:$1|resta mach sta pàgina|resto $1 pàgine}}.',
 'category-file-count' => "{{PLURAL:$2|Sta categorìa-sì a l'ha nomach st'archivi.|Sta categorìa-sì a l'ha {{PLURAL:$1|n'|$1}} archivi, ëd $2 ch'a-i në j'é an total.}}",
 'category-file-count-limited' => "Ant sta categorìa-sì a-i {{PLURAL:$1|intra mach st'|intro $1}} archivi.",
-'listingcontinuesabbrev' => ' anans',
+'listingcontinuesabbrev' => 'anans',
 'index-category' => 'Pàgine indicisà',
-'noindex-category' => 'Pàgine pa indicisà',
-'broken-file-category' => 'Pàgine con colegament pa giust a archivi',
+'noindex-category' => 'Pàgine nen indicisà',
+'broken-file-category' => "Pàgine con dle liure cioche a d'archivi",
 
 'about' => 'A propòsit ëd',
 'article' => 'Pàgina ëd contnù',
 'newwindow' => '(as deurb ant na fnestra neuva)',
-'cancel' => 'Scancela',
-'moredotdotdot' => ' pì...',
-'morenotlisted' => 'Autr pa listà...',
+'cancel' => 'Anulé',
+'moredotdotdot' => 'Ëd pì...',
+'morenotlisted' => "A-i na j'é ëdcò d'àutri nen ant la lista...",
 'mypage' => 'Pàgina',
 'mytalk' => 'Ciaciarade',
 'anontalk' => "Ciaciarade për st'adrëssa IP-sì",
@@ -183,53 +182,53 @@ $messages = array(
 'and' => '&#32;e',
 
 # Cologne Blue skin
-'qbfind' => 'Treuva',
-'qbbrowse' => 'Sfeuja',
-'qbedit' => 'Modìfica',
-'qbpageoptions' => 'Opsion dla pàgina',
-'qbmyoptions' => 'Mie opsion',
+'qbfind' => 'Trové',
+'qbbrowse' => 'Sfojé',
+'qbedit' => 'Modifiché',
+'qbpageoptions' => 'Costa pàgina',
+'qbmyoptions' => 'Mie pàgine',
 'qbspecialpages' => 'Pàgine speciaj',
 'faq' => 'Chestion frequente',
 'faqpage' => 'Project:Soèns An Ciamo',
 
 # Vector skin
-'vector-action-addsection' => 'Gionta argoment',
-'vector-action-delete' => 'Scancela',
-'vector-action-move' => 'Tramuda',
-'vector-action-protect' => 'Protegg',
-'vector-action-undelete' => 'Arcùpera',
+'vector-action-addsection' => "Gionté n'argoment",
+'vector-action-delete' => 'Scancelé',
+'vector-action-move' => 'Tramudé',
+'vector-action-protect' => 'Protege',
+'vector-action-undelete' => 'Arcuperé',
 'vector-action-unprotect' => 'Cangé la protession',
 'vector-simplesearch-preference' => "Abilité la bara d'arserca semplificà (mach për la pel Vector)",
-'vector-view-create' => 'Crea',
-'vector-view-edit' => 'Modìfica',
-'vector-view-history' => 'Varda stòria',
-'vector-view-view' => 'Les',
-'vector-view-viewsource' => 'Varda sorgiss',
+'vector-view-create' => 'Creé',
+'vector-view-edit' => 'Modifiché',
+'vector-view-history' => 'Smon-e la stòria',
+'vector-view-view' => 'Lese',
+'vector-view-viewsource' => 'Vëdde la sorgiss',
 'actions' => 'Assion',
 'namespaces' => 'Spassi nominaj',
 'variants' => 'Variant',
 
 'navigation-heading' => 'Lista ëd navigassion',
 'errorpagetitle' => 'Eror',
-'returnto' => 'Torna andré a $1.',
+'returnto' => 'Torné andré a $1.',
 'tagline' => 'Da {{SITENAME}}.',
 'help' => 'Agiut',
-'search' => 'Sërca',
-'searchbutton' => 'Sërca',
-'go' => 'Va',
-'searcharticle' => 'Va',
+'search' => 'Sërc',
+'searchbutton' => 'Sërc',
+'go' => 'Andé',
+'searcharticle' => 'Andé',
 'history' => 'Version pì veje',
 'history_short' => 'Stòria',
-'updatedmarker' => "Agiornà da 'nt l'ùltima vira che i son passà",
+'updatedmarker' => "agiornà da l'ùltima vira che i son passà",
 'printableversion' => 'Version bon-a për stampé',
 'permalink' => 'Anliura fissa',
-'print' => 'Stampa',
+'print' => 'Stampé',
 'view' => 'Vardé',
-'edit' => 'Modìfica',
+'edit' => 'Modifiché',
 'create' => 'Creé',
-'editthispage' => "Modìfica st'artìcol-sì",
+'editthispage' => 'Modifiché costa pàgina',
 'create-this-page' => 'Creé sta pàgina',
-'delete' => 'Scancela',
+'delete' => 'Scancelé',
 'deletethispage' => 'Scancela pàgina',
 'undelete_short' => 'Disdëscancela {{PLURAL:$1|na modìfica|$1 modìfiche}}',
 'viewdeleted_short' => 'Vardé {{PLURAL:$1|na modìfica scancelà|$1 modìfiche scancelà}}',
@@ -548,7 +547,7 @@ Për piasì speta prima ëd prové torna.",
 # Email sending
 'php-mail-error-unknown' => 'Eror pa conossù ant la funsion PHP mail()',
 'user-mail-no-addy' => 'Provà a spedì un mëssagi sensa adrëssa ëd pòsta eletrònica.',
-'user-mail-no-body' => 'Preuva a mandé un corel con un còrp veuid o motobin curt.',
+'user-mail-no-body' => 'Tentativ ëd mandé un mëssagi con un còrp veuid o curt ëd fasson esagerà.',
 
 # Change password dialog
 'resetpass' => 'Cambia la ciav',
@@ -567,13 +566,12 @@ Për piasì speta prima ëd prové torna.",
 'resetpass-wrong-oldpass' => "Ciav a temp o corenta nen bon-a.
 Miraco it l'has già cambià la ciav o it l'has ciamà na neuva ciav a temp.",
 'resetpass-temp-password' => 'Ciav a temp:',
+'resetpass-abort-generic' => "Ël cangiament ëd la ciav a l'é stàit anulà da n'estension.",
 
 # Special:PasswordReset
 'passwordreset' => 'Cambi ëd ciav',
-'passwordreset-text' => "Ch'a completa 's formolari për arsèive un mëssagi ëd pòsta eletrònica con ij detaj ëd sò cont.",
 'passwordreset-legend' => 'Cambié la ciav',
 'passwordreset-disabled' => 'Ij cangiament ëd ciav a son stàit disabilità su sta wiki.',
-'passwordreset-pretext' => "{{PLURAL:$1||Ch'a anserissa un dij tòch ëd dat sì-sota}}",
 'passwordreset-username' => 'Stranòm:',
 'passwordreset-domain' => 'Domini:',
 'passwordreset-capture' => 'Vardé ël mëssagi arzultant?',
@@ -805,12 +803,15 @@ A-i é pa gnun-e spiegassion.",
 A smija che a sia stàita scancelà.',
 'edit-conflict' => "Conflit d'edission.",
 'edit-no-change' => "Toa modìfica a l'é stàita ignorà, përchè a l'é pa stàit fàit gnun cambiament al test.",
+'postedit-confirmation' => "Soa modìfica a l'é stàita salvà!",
 'edit-already-exists' => 'As peul nen creesse la pàgina.
 A esist già.',
 'defaultmessagetext' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
 'content-failed-to-parse' => "Faliment ëd l'anàlisi dël contnù ëd $2 për ël model $1: $3",
 'invalid-content-data' => 'Dat dël contnù pa bon',
 'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
+'editwarning-warning' => "Chité sta pàgina-sì a peul feje perde tute le modìfiche ch'a l'ha fàit.
+S'a l'é rintrà ant ël sistema, a peul disabilité st'avis ant la session «Modìfiche» dij sò gust.",
 
 # Content models
 'content-model-wikitext' => 'test wiki',
@@ -1094,15 +1095,6 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 'search-external' => 'Arserca esterna',
 'searchdisabled' => "L'arserca anterna ëd {{SITENAME}} a l'é nen abilità; për adess a peul prové a dovré un motor d'arserca estern coma Google. (Però che a ten-a da ment che ij contnù ëd {{SITENAME}} listà ant ij motor pùblich a podrìo ëdcò esse nen d'autut agiornà)",
 
-# Quickbar
-'qbsettings' => 'Regolassion dla bara dij menù',
-'qbsettings-none' => 'Gnun',
-'qbsettings-fixedleft' => 'Fissà a la man ësnista',
-'qbsettings-fixedright' => 'Fissà a la man drita',
-'qbsettings-floatingleft' => 'Flotant a la man ësnista',
-'qbsettings-floatingright' => 'Flotant a la man drita',
-'qbsettings-directionality' => 'A pòst, an dipendensa dla diressionalità dë scritura ëd soa lenga',
-
 # Preferences page
 'preferences' => 'Mè gust',
 'mypreferences' => 'Gust',
@@ -1664,7 +1656,6 @@ Për na sicurëssa otimal, img_auth.php a l'é disabilità.",
 'http-read-error' => 'Eror ëd letura HTTP.',
 'http-timed-out' => "L'arcesta HTTP a l'ha finì sò temp.",
 'http-curl-error' => "Eror an sërcand d'arcuperé l'adrëssa dl'aragnà: $1.",
-'http-host-unreachable' => "L'anliura a rispond pa.",
 'http-bad-status' => "A l'é staje un problema durant l'arcesta HTTP: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2050,7 +2041,7 @@ L'adrëssa ëd pòsta eletrònica ch'a l'ha butà ant ij [[Special:Preferences|s
 'usermessage-editor' => 'Mëssagerìa ëd sistema',
 
 # Watchlist
-'watchlist' => 'Ròba che as ten sot euj',
+'watchlist' => 'Ròba che as ten sot-euj',
 'mywatchlist' => 'Ròba che as ten sot euj',
 'watchlistfor2' => 'Për $1 $2',
 'nowatchlist' => "A l'ha ancó pa marcà dj'artìcoj coma ròba da tnì sot-euj.",
@@ -2071,8 +2062,8 @@ Le modìfiche che a-i saran ant costa pàgina-sì e ant soa pàgina ëd discussi
 'notvisiblerev' => "La revision a l'é stàita scancelà",
 'watchnochange' => "Gnun-a dle ròbe che as ten sot-euj a l'é staita modificà ant ël periòd ësmonù.",
 'watchlist-details' => "A l'é dëmentrè ch'as ten sot-euj {{PLURAL:$1|$1 pàgina|$1 pàgine}}, nen contand cole ëd discussion.",
-'wlheader-enotif' => 'Le notìfiche për pòsta eletrònica a son abilità.',
-'wlheader-showupdated' => "Cole pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
+'wlheader-enotif' => 'Le notìfiche për pòsta eletrònica a son abilità.',
+'wlheader-showupdated' => "Cole pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
 'watchmethod-recent' => "contròl a j'ùltime modìfiche fàite a le pàgine che as ten sot-euj",
 'watchmethod-list' => 'contròl ëd le pàgine che as ten sot-euj për vëdde se a-i sio staje dle modìfiche recente',
 'watchlistcontains' => "Soa lista dla ròba ch'as ten sot-euj a l'ha andrinta {{PLURAL:$1|na pàgina|$1 pàgine}}.",
@@ -2199,8 +2190,8 @@ Ch'a varda la [[Special:ProtectedPages|Lista dle pàgine protegiùe]] për la li
 'prot_1movedto2' => '[[$1]] tramudà a [[$2]]',
 'protect-badnamespace-title' => 'Spassi nominal pa protegìbil',
 'protect-badnamespace-text' => 'Le pàgine an cost ëspassi nominal-sì a peulo pa esse protegiùe.',
-'protect-norestrictiontypes-text' => 'Sta pagina a peul pa esse protegiùa përchè a-i son gnun-e sòrt ëd restrission disponìbij.',
-'protect-norestrictiontypes-title' => 'Pagina pa protegìbila',
+'protect-norestrictiontypes-text' => 'Sta pàgina a peul pa esse protegiùa përchè a-i son gnun-e sòrt ëd restrission disponìbij.',
+'protect-norestrictiontypes-title' => 'Pàgina nen protegìbil',
 'protect-legend' => 'Che an conferma la protession',
 'protectcomment' => 'Rason:',
 'protectexpiry' => 'Scadensa:',
@@ -2216,7 +2207,7 @@ Ambelessì a-i son j'ampostassion atuaj për la pàgina '''$1''':",
 'protect-cascadeon' => "Sta pàgina për adess a l'é blocà përchè a-i intra ant {{PLURAL:$1|la pàgina sì-sota, ch'a l'ha|le-pàgine sì sota, ch'a l'han}} na protession a sàut anvisca. A peul cambie-je sò livel ëd protession a sta pàgina-sì ma lòn a tochërà pa la protession a sàut.",
 'protect-default' => "Autorisé tùit j'utent",
 'protect-fallback' => "Përmëtt mach a j'utent con ël përmess «$1»",
-'protect-level-autoconfirmed' => "Përmëtt mach j'utent autoconfirmà",
+'protect-level-autoconfirmed' => "Përmëtte mach j'utent autoconfirmà",
 'protect-level-sysop' => "Përmëtt mach a j'aministrator",
 'protect-summary-cascade' => 'a sàut',
 'protect-expiring' => 'scadensa: $1 (UTC)',
@@ -2863,7 +2854,7 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-magic-words' => '{{PLURAL:$1|Paròla màgica|Paròle màgiche}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorìa|Categorìe}} stërmà ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|stamp contnù|stamp contnù}} ($1)',
-'pageinfo-transclusions' => '{{PLURAL:$1|Pagina|Pagine}} transcludùe dzor ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Pàgina|Pàgine}} transcludùe dzor ($1)',
 'pageinfo-toolboxlink' => 'Anformassion an sla pàgina',
 'pageinfo-redirectsto' => 'Ridiression-a a',
 'pageinfo-redirectsto-info' => 'anformassion',
@@ -2872,9 +2863,9 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-protect-cascading' => 'Le protession a son a cascada da sì',
 'pageinfo-protect-cascading-yes' => 'É!',
 'pageinfo-protect-cascading-from' => 'Le protession a son a cascada da',
-'pageinfo-category-info' => 'Anformassion ëd categorìa',
+'pageinfo-category-info' => 'Anformassion an sla categorìa',
 'pageinfo-category-pages' => 'Nùmer ëd pàgine',
-'pageinfo-category-subcats' => 'Nùmer ëd sotcategorìe',
+'pageinfo-category-subcats' => 'Nùmer ëd sot-categorìe',
 'pageinfo-category-files' => "Nùmer d'archivi",
 
 # Patrolling
@@ -2984,7 +2975,7 @@ J'àutri a saran stërmà coma stàndard.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghëssa',
 'exif-imagelength' => 'Autëssa',
 'exif-bitspersample' => 'Bit për campion',
@@ -3162,7 +3153,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-originalimageheight' => "Autëssa dla figura prima ch'a fussa ritajà",
 'exif-originalimagewidth' => "Larghëssa dla figura prima ch'a fussa ritajà",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nen comprimù',
 'exif-compression-2' => "CCITT Partìa 3 longheur dla codìfica d'esecussion dla codìfica Huffman modificà ëd dimension 1",
 'exif-compression-3' => 'CCITT Partìa 3 codìfica dël fax',
@@ -3607,13 +3598,6 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'version-entrypoints-header-url' => "Adrëssa an sl'aragnà",
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Senté d\'artìcol]',
 
-# Special:FilePath
-'filepath' => "Përcors d'archivi",
-'filepath-page' => 'Archivi:',
-'filepath-submit' => 'Përcors',
-'filepath-summary' => "Sta pàgina special-sì a la smon ël përcors complet për n'archivi.
-Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite parte diretament da sò programa a pòsta.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => "Arsërca dj'archivi dobi",
 'fileduplicatesearch-summary' => "Arsërca dj'archivi dobi a parte dal valor d'ordinament.",
index 28ae908..8324dc0 100644 (file)
@@ -51,9 +51,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ویکھن آلے لوکاں دی گنتی وکھاؤ۔',
 'tog-oldsig' => 'ہن والے دسخط:',
 'tog-fancysig' => 'دستخط نوں وکی ٹیکسڈ ونگوں؎ ورتو(without an automatic link)',
-'tog-externaleditor' => 'ہمیشہ بارلا لکھن والا ورتو (ماہر لوکاں واسطے، اس واسطے تواڑے کمپیوٹر تے خاص تبدیلیاں چائیدیاں نیں۔ [//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات.])',
-'tog-externaldiff' => '
-ہمیشہ بارلا تبدیلی کرن والا ورتو (ماہر لوکاں واسطے، اس واسطے تواڑے کمپیوٹر تے خاص تبدیلیاں چائیدیاں نیں۔ [//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات۔])',
 'tog-showjumplinks' => '"ایدر چلو" نوں رلن والے جوڑان نال جوڑو',
 'tog-uselivepreview' => 'لائیو پریویو ورتو',
 'tog-forceeditsummary' => 'مینون اوسے ویلے دسو جدوں خالی سمری تے آؤ۔',
@@ -67,6 +64,7 @@ $messages = array(
 'tog-diffonly' => 'تبدیلی توں علاوہ صفحہ نا وکھاؤ',
 'tog-showhiddencats' => 'لکیاں کیٹاگریاں وکھاؤ',
 'tog-norollbackdiff' => 'صفحے دی واپسی تے تبدیلی کڈ دو',
+'tog-useeditwarning' => 'جدوں میں کوئی صفحہ تبدیلی کر کے بچاۓ بغیر چھڈن لگاں تے منوں دس دیو',
 
 'underline-always' => 'ہمیشہ',
 'underline-never' => 'کدی وی نئیں',
@@ -757,6 +755,8 @@ Custom .css تے .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.cs
 'edit-no-change' => 'تواڈی تبدیلی ول کوئی توجہ نئیں، کیوں جے لکھت چ کوئی تبدیلی نئیں۔',
 'edit-already-exists' => 'نواں صفہ نئیں بن سکدا۔
 ایہ پہلے ای ہیگا اے۔',
+'editwarning-warning' => 'اے صفے توں جان تے ہو سکدا اوہ ساریاں تبدیلیاں مک جان جیہڑیاں تساں بناياں نیں۔
+اگر تسیں لاکان او، تسیں ایڈیٹنگ سیکشن چ  اپنی پسنداں چ ایس خبرداری نوں پعلے ناں۔',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''خبردار:''' ایس صفے تے چوکھیاں ساریاں پارسر کلز نیں۔
@@ -1021,15 +1021,6 @@ $1",
 تسیں گوگل تے کھوج کرو۔
 اے گل یاد رکھنا جے انڈیکس {{SITENAME}} دے پرانے ہون۔',
 
-# Quickbar
-'qbsettings' => 'کوئکبار',
-'qbsettings-none' => 'کوئی نئیں',
-'qbsettings-fixedleft' => 'فکسڈ کھبے',
-'qbsettings-fixedright' => 'فکسڈ سجے',
-'qbsettings-floatingleft' => 'ہلدا کھبے',
-'qbsettings-floatingright' => 'ہلدا سجے',
-'qbsettings-directionality' => '!!!!فکسڈ، تھاڈی بولی تے لپی نال',
-
 # Preferences page
 'preferences' => 'تانگاں',
 'mypreferences' => 'میریاں تانگاں',
@@ -1573,7 +1564,6 @@ $1",
 'http-read-error' => 'ایچ ٹی ٹی پی  غلطی پڑھدی اے۔',
 'http-timed-out' => 'ایچ ٹی ٹی پی  دی مانگ ویلیوں بار۔',
 'http-curl-error' => 'ایچ ٹی ٹی پی  : $1 لیان چ غلطی۔',
-'http-host-unreachable' => 'ایچ ٹی ٹی پی  تک ناں پونچ سکیا۔',
 'http-bad-status' => 'ایچ ٹی ٹی پی : $1 $2 دی مانگ ویلے رپھڑ',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1967,7 +1957,7 @@ $1",
 'watchnochange' => 'دسے گۓ ویلے چ تھواڈیاں ویکھیاںشیواں نئیں بدلیاں گیاں۔',
 'watchlist-details' => '{{PLURAL:$1|$1 صفحہ|$1 صفحہ}} تواڈی اکھ تھلے گلاں باتاں شامل نہیں۔',
 'wlheader-enotif' => 'ای-میل نوٹیفیکیشن قابل',
-'wlheader-showupdated' => ' صفے جیہڑے بدلے کۓ تھواڈے آخری وار آن مکرون  اونان نوں موٹا کرکے دسیا گیا اے۔',
+'wlheader-showupdated' => ' صفے جیہڑے بدلے کۓ تھواڈے آخری وار آن مکرون  اونان نوں موٹا کرکے دسیا گیا اے۔',
 'watchmethod-recent' => 'نیڑے ہویاں تبدیلیاں چائیدے صفیاں دیاں ویکھے جان والے صفیاں لئی۔',
 'watchmethod-list' => 'ویکھے کے صفے نیڑے ہون والیاں تبدیلیاں دی پڑتال',
 'watchlistcontains' => 'تھواڈی اکھ تھلے رکھی لسٹ چ $1 {{PLURAL:$1|صفہ|صفے}}  نیں۔',
@@ -2812,7 +2802,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'چوڑائی',
 'exif-imagelength' => 'اچائی',
 'exif-bitspersample' => 'اک کمپوننٹ وچ بٹ',
@@ -2990,7 +2980,7 @@ $1',
 'exif-originalimageheight' => 'مورت دی اچائی کٹن توں پہلے',
 'exif-originalimagewidth' => 'مورت دی چوڑائی کٹن توں پہلے',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'کھولی گئی',
 'exif-compression-2' => 'سی سی آئی ٹی ٹی گروپ 3 1-ڈائمینشنل موڈیفائیڈ ہفمین رن فل لنتھ انکوڈنگ',
 'exif-compression-3' => 'سی سی آئی ٹی ٹی گروپ 3 فیکس اینکوڈنگ',
@@ -3399,13 +3389,6 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 'version-software-product' => 'پراڈکٹ',
 'version-software-version' => 'ورژن',
 
-# Special:FilePath
-'filepath' => 'فائل راہ',
-'filepath-page' => 'فائل:',
-'filepath-submit' => 'چلو',
-'filepath-summary' => 'اے خاص صفہاک فائل دا پورا راہ دسدا اے۔
-مورتاں پورے ریزولوشن چ دسیاں گیاں نئیں، دوجیاں فائل ٹائپ نوں نوں اوناں دے رلدے پروکراماں نال ٹوریا گیا اے۔',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'دوہری فائلاں دی کھوج کرو',
 'fileduplicatesearch-summary' => 'دوہریاں فائلاں دی کھوج ہیش ویلیو تے اے۔',
index 88b7195..7bb4f58 100644 (file)
@@ -614,9 +614,6 @@ $messages = array(
 'powersearch-togglenone' => 'Τιδέν',
 'search-external' => 'Εύρον σα εξ μερέαν',
 
-# Quickbar
-'qbsettings-none' => 'Τιδέν',
-
 # Preferences page
 'preferences' => 'Αγαπεμένα',
 'mypreferences' => "Τ' εμά τ' αγαπεμένα",
@@ -948,7 +945,7 @@ $messages = array(
 'listgrouprights-rights' => 'Δικαιώματα',
 'listgrouprights-members' => '(κατάλογον μελών)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Στείλον μένεμαν σον χρήστεν ατόν',
 'emailfrom' => 'Ασά:',
 'emailto' => 'Σο:',
@@ -1306,7 +1303,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Πλάτος',
 'exif-imagelength' => 'Ύψηλος',
 'exif-bitspersample' => 'Bits ανά στοιχείο',
@@ -1408,10 +1405,6 @@ $messages = array(
 'version-software' => "Λογισμικόν ντ'εθέκεν",
 'version-software-version' => 'Έκδοση',
 
-# Special:FilePath
-'filepath-page' => 'Αρχείον:',
-'filepath-submit' => 'Δέβα',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Όνεμα αρχείου:',
 'fileduplicatesearch-submit' => 'Εύρον',
index 20ec925..2a792d8 100644 (file)
@@ -43,8 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Waidinnais gīrbin stēisan nadirīntin tērpautajan',
 'tog-oldsig' => 'Twājs tēntiskas papeisāsenis',
 'tog-fancysig' => 'Laikais papeisāsenin per wikitekstan (šlāit autōmatiskan sēisnan)',
-'tog-externaleditor' => 'Auprestaminai tērpaus izwinaīnan editōran (tēr per ekspertans, izkīnina speciālins ensadīnsenins en kōmputeŗu)',
-'tog-externaldiff' => 'Auprestaminai tērpaus izwinaīnan prōgraman waidināntin šlaitīntans  (tēr per ekspertans, izkīnina speciālins ensadīnsenins en kōmputeŗu)',
 'tog-showjumplinks' => 'Enklaūjais autengīnsenins "sākais en"',
 'tog-uselivepreview' => 'Tērpaus dināmiskan pirmādiran (JavaScript) (eksperimentālin)',
 'tog-forceeditsummary' => 'Pawakēis mi nierpilninsenin stesse ebpeisāsenin stēisan kitawīdinsnan',
@@ -841,14 +839,6 @@ Bandais pagaūtun laukītan frāzin sen prefiksan \"all:\", kāi pralaukīlai pa
 En šissei kērdan tu mazzi laukītun sen Google.
 Pamēnais, kāi tenēisan indicai mazzi ni būtwei aktuālin.',
 
-# Quickbar
-'qbsettings' => 'Dīwas preiēisenes sawinzli',
-'qbsettings-none' => 'Nisatausnā',
-'qbsettings-fixedleft' => 'Preidrūktintan prei kāirai',
-'qbsettings-fixedright' => 'Preidrūktintan prei tikrai',
-'qbsettings-floatingleft' => 'Plūjants prei kāirai',
-'qbsettings-floatingright' => 'Plūjants prei tikrai',
-
 # Preferences page
 'preferences' => 'Pirminiskwas',
 'mypreferences' => 'Majjas pirminiskwas',
@@ -1587,8 +1577,8 @@ Eraīna šisse pāusas ēnturas kitawīdinsna anga diskusiōnis pāusas sēitan
 'notvisiblerev' => 'Wersiōni pastāi āupausintan',
 'watchnochange' => 'Niaīnan iz nadirītans pāusans ni bēi redigītan en padātan kērdasetrapan.',
 'watchlist-details' => 'Ast {{PLURAL:$1|$1 pāusan|$1 pāusai}} en twajjai listin stēisan nadirītan, ni gīrbawintei diskusiōnis pāusans.',
-'wlheader-enotif' => 'E-mail pawakīsenei ast enklaūtan.',
-'wlheader-showupdated' => "Pastāi '''pastarīntan''' pāusai,  kawīdai bēi kitawīdintan ezze Twajjai panzdauman tenēisan kāimalukisnan..",
+'wlheader-enotif' => 'E-mail pawakīsenei ast enklaūtan.',
+'wlheader-showupdated' => "Pastāi '''pastarīntan''' pāusai,  kawīdai bēi kitawīdintan ezze Twajjai panzdauman tenēisan kāimalukisnan..",
 'watchmethod-recent' => 'Izbandasnā stēisan panzdauman kitawīdisnan sirzdau nadirītans pāusans',
 'watchmethod-list' => 'Izbandasnā stēisan nadirītan pāusan laukīntei panzdaumans kitawīdisnans',
 'watchlistcontains' => 'En twajjai listin stēisan nadirītan ast $1 {{PLURAL:$1|pāusan|pāusai}}.',
@@ -2254,7 +2244,7 @@ Kitāi wīrst būwusis kliptan auprestaminai.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Plattu',
 'exif-imagelength' => 'Aūktan',
 'exif-bitspersample' => 'Bittai per izimlin',
@@ -2355,7 +2345,7 @@ Kitāi wīrst būwusis kliptan auprestaminai.
 'exif-gpsareainformation' => 'GPS areālas pabilisnā',
 'exif-gpsdatestamp' => 'GPS dātan',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nikōmpresitan',
 
 'exif-unknowndate' => 'Niwaīstan dātan',
@@ -2623,15 +2613,6 @@ Tu mazzi dīgi [[Special:EditWatchlist|tērpautun stāndardiskan editōran]].',
 'version-software' => 'Instalītas prōgraminis',
 'version-software-version' => 'Wersiōni',
 
-# Special:FilePath
-'filepath' => 'Lunki en zūrbrukin',
-'filepath-page' => 'Zūrbrukis:',
-'filepath-submit' => 'Lunki',
-'filepath-summary' => 'Šin speciālin pāusan wartinna pastippan lunkin prei zūrbrukin.
-Bildei ast waīdintan en pilnan  rezōluciōnin, kitāi zūrbrukin tīpai ast etwertan en prōgramu preiristasmu prei tennans.
-
-Enpeisāis zūrbrukes pabilīsnan šlāit "{{ns:file}}:" prefiksan.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Laukīs dwigubbintans zūrbrukins',
 'fileduplicatesearch-summary' => 'Laukīs dwigubbintans zūrbrukins pa tenēisan kōntrōlingin summin.',
index 490e4ce..5d7037a 100644 (file)
@@ -200,6 +200,8 @@ $messages = array(
 'tog-ccmeonemails' => 'هغه برېښليکونه چې زه يې نورو ته لېږم، د هغو يوه کاپي دې ماته هم راشي',
 'tog-diffonly' => 'د توپيرونو نه لاندې د مخ مېنځپانګه پټول',
 'tog-showhiddencats' => 'پټې وېشنيزې ښکاره کول',
+'tog-norollbackdiff' => 'پرشاتمبولو وروسته توپيرونه نه ښودل',
+'tog-useeditwarning' => 'کله چې يو سمون مخ څخه د بدلونونو د خوندي کولو پرته وځم خبر دې شم',
 
 'underline-always' => 'تل',
 'underline-never' => 'هېڅکله',
@@ -263,6 +265,18 @@ $messages = array(
 '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',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|وېشنيزه|وېشنيزې}}',
@@ -311,6 +325,7 @@ $messages = array(
 'vector-action-protect' => 'ژغورل',
 'vector-action-undelete' => 'ناړنګول',
 'vector-action-unprotect' => 'ژغورنه بدلول',
+'vector-simplesearch-preference' => 'د پلټنې ساده پټه چارنول (يوازې په وېکټور پوښۍ کار کوي)',
 'vector-view-create' => 'جوړول',
 'vector-view-edit' => 'سمول',
 'vector-view-history' => 'پېښليک کتل',
@@ -509,6 +524,7 @@ $1',
 'actionthrottled' => 'د دې کړنې مخنيوی وشو',
 'protectedpagetext' => 'دا مخ د سمون او نورو کړنو د ترسره کولو په تکل ژغورل شوی.',
 'viewsourcetext' => 'تاسې د دې مخ سرچينه کتلی او لمېسلی شی:',
+'viewyourtext' => "تاسې په دې مخ کې د '''خپلو سمونونو''' سرچينه کتلی او لمېسلی شی:",
 'protectedinterface' => 'دا مخ د دې ويکي د ساوترې د ليدنمخ متن لري، او د ورانکارۍ په خاطر ژغورل شوی.
 په ټولو ويکي ګانو کې د ژباړې د ورګډولو او يا هم د ژباړې د سمون او بدلون لپاره د مېډياويکي د ځايتابه پروژه [//translatewiki.net/ translatewiki.net] وکاروۍ.',
 'editinginterface' => "'''ګواښنه:''' تاسو په يوه داسې مخ کې بدلون راولی کوم چې د يوې پوستکالی د ليدنمخ متن په توګه کارېږي.
@@ -534,12 +550,24 @@ $1',
 تاسې کولای شی چې د کارن-نوم نه پرته په ورکنومي توګه {{SITENAME}} وکاروی، او يا هم په همدې او يا کوم بل کارن-نوم، يو ځل <span class='plainlinks'>[$1 بيا غونډال ته ورننوځۍ]</span>.
 دا په پام کې وساتۍ چې تر څو تاسې د خپل کتنمل حافظه نه وي سپينه کړې، نو ځينې مخونو کې به لا تر اوسه پورې په غونډال کې ننوتي ښکارۍ.",
 'welcomeuser' => '$1، ښه راغلې!',
+'welcomecreation-msg' => 'ګڼون مو جوړ شو.
+د [[Special:Preferences|{{SITENAME}} غوره توبونه]] بدلول مو مه هېروۍ.',
 'yourname' => 'کارن-نوم:',
+'userlogin-yourname' => 'کارن-نوم',
+'userlogin-yourname-ph' => 'کارن-نوم مو وليکۍ',
 'yourpassword' => 'پټنوم:',
+'userlogin-yourpassword' => 'پټنوم',
+'userlogin-yourpassword-ph' => 'پټنوم مو وليکۍ',
+'createacct-yourpassword-ph' => 'پټنوم مو وټاپۍ',
 'yourpasswordagain' => 'پټنوم بيا وليکه',
+'createacct-yourpasswordagain' => 'پټنوم مو تاييد کړۍ',
+'createacct-yourpasswordagain-ph' => 'پټنوم مو بيا وټاپۍ',
 'remembermypassword' => 'زما پټنوم په دې کمپيوټر (تر $1 {{PLURAL:$1|ورځې|ورځو}}) په ياد وساته!',
+'userlogin-remembermypassword' => 'غونډال کې مې ننوتلی وساته',
+'userlogin-signwithsecure' => 'د خوندي پالنګر په مرسته ننوتل',
 'securelogin-stick-https' => 'وروسته د ننوتلو HTTPS سره تړلی پاتې کېدل',
 'yourdomainname' => 'ستاسې شپول:',
+'password-change-forbidden' => 'تاسې په دې ويکي باندې خپل پټنوم نه شی بدلولی.',
 'login' => 'ننوتل',
 'nav-login-createaccount' => 'ننوتل / ګڼون جوړول',
 'loginprompt' => 'ددې لپاره چې {{SITENAME}} کې ننوځۍ نو بايد ستاسې د کمپيوټر کوکيز چارن وي.',
@@ -548,18 +576,33 @@ $1',
 'logout' => 'وتل',
 'userlogout' => 'وتل',
 'notloggedin' => 'غونډال کې نه ياست ننوتي',
+'userlogin-noaccount' => 'ګڼون نه لرې؟',
+'userlogin-joinproject' => 'د {{SITENAME}} سره يوځای شه',
 'nologin' => 'کارن-نوم نه لرې؟ $1.',
 'nologinlink' => 'يو ګڼون جوړول',
 'createaccount' => 'ګڼون جوړول',
 'gotaccount' => 'آيا وار دمخې يو ګڼون لری؟ $1.',
 'gotaccountlink' => 'ننوتل',
 'userlogin-resetlink' => 'د ننوتلو مالومات مو هېر شوي؟',
+'createacct-emailrequired' => 'برېښليک پته',
+'createacct-emailoptional' => 'برېښليک پته (اختياري)',
+'createacct-email-ph' => 'برېښليک پته مو وټاپۍ',
 'createaccountmail' => 'يو لنډمهاله ناټاکلی پټنوم کارول او په لاندې ورکړل شوې برېښليک پته کې ورلېږل',
+'createacct-realname' => 'آر نوم (اختياري)',
 'createaccountreason' => 'سبب:',
+'createacct-reason' => 'سبب',
+'createacct-reason-ph' => 'ولې تاسې بل ګڼون جوړول غوااړۍ',
+'createacct-imgcaptcha-ph' => 'پورته تاسې ته ښکاره شوی متن وټاپۍ',
+'createacct-submit' => 'ګڼون مو جوړ کړۍ',
+'createacct-benefit-heading' => '{{SITENAME}} ستاسې په شان خلکو لخوا جوړ شوی.',
+'createacct-benefit-body1' => '{{PLURAL:$1|سمون|سمونونه}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|مخ|مخونه}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|وروستنی ونډه وال|وروستني ونډه وال}}',
 'badretype' => 'دا پټنوم چې تاسې ليکلی د مخکني پټنوم سره ورته نه دی.',
 'userexists' => 'کوم کارن نوم چې تاسې ورکړی هغه بل چا کارولی.
 لطفاً يو بل نوم وټاکۍ.',
 'loginerror' => 'د ننوتنې ستونزه',
+'createacct-error' => 'د ګڼون جوړېدنې ستونزه',
 'createaccounterror' => 'ګڼون مو جوړ نه شو: $1',
 'nocookiesnew' => 'ستاسې ګڼون جوړ شو، خو تاسې لا غونډال ته نه ياست ورننوتلي.
 {{SITENAME}} کې د ننوتلو لپاره کوکيز کارېږي.
@@ -643,7 +686,7 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'پټنوم بياپرځايول',
-'passwordreset-text' => 'د Ø¯Û\90 Ù\84پارÙ\87 Ú\86Û\90 Ø³ØªØ§Ø³Û\90 Ø¯ Ú«Ú¼Ù\88Ù\86 Ø¨Ø´Ù¾Ú\93Û\90 Ú\85رګÙ\86دÙ\86Û\90 Ø¯Ø±Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ø´Ù\8a Ù\86Ù\88 دا فورمه ډکه کړۍ.',
+'passwordreset-text' => 'د Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ø¯  Ø¨Ù\8aاپرÚ\81اÛ\8c Ú©Û\90دÙ\86Û\90 Ù\84پارÙ\87 دا فورمه ډکه کړۍ.',
 'passwordreset-legend' => 'پټنوم بياپرځايول',
 'passwordreset-disabled' => 'په دې ويکي پټنوم بياپرځای کولو کړنه ناچارنه شوې.',
 'passwordreset-pretext' => '{{PLURAL:$1||د لاندې اومتوک يوه برخه مالومات وليکۍ}}',
@@ -654,8 +697,8 @@ $1',
 'passwordreset-emailtitle' => 'د {{SITENAME}} د ګڼون څرګندنې',
 'passwordreset-emailelement' => 'کارن-نوم: $1
 لنډمهاله پټنوم: $2',
-'passwordreset-emailsent' => 'يو يادښتي برېښليک ولېږل شو.',
-'passwordreset-emailsent-capture' => 'د Ù\8aادÙ\88Ù\86Û\90 Ù\84پارÙ\87 Ù\8aÙ\88 Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ù\88Ù\84Û\90Ú\96Ù\84 Ø´Ù\88، برېښليک په لاندې توګه ښودل شوی.',
+'passwordreset-emailsent' => 'د پټنوم بيا پرځای کېدنې لپاره برېښليک درولېږل شو.',
+'passwordreset-emailsent-capture' => 'د Ù¾Ù¼Ù\86Ù\88Ù\85 Ø¨Ù\8aاپرÚ\81اÛ\8c Ú©Û\90دÙ\86Û\90 Ù\84پار Ù\85Ù\88 Ù\8aÙ\88 Ø¨Ø±Û\90Ú\9aÙ\84Ù\8aÚ© Ø¯Ø±Ù\88Ù\84Û\90Ú\96Ù\87، برېښليک په لاندې توګه ښودل شوی.',
 
 # Special:ChangeEmail
 'changeemail' => 'برېښليک پته بدلول',
@@ -823,6 +866,7 @@ $1',
 'content-model-wikitext' => 'ويکي متن',
 'content-model-text' => 'ساده متن',
 'content-model-javascript' => 'جاواسکرېپټ',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''ګواښنه:''' دا کينډۍ د خپل ټاکلي بريد نه ډېره لويه ده.
@@ -986,14 +1030,6 @@ $1',
 'powersearch-togglenone' => 'هېڅ',
 'search-external' => 'باندنۍ پلټنه',
 
-# Quickbar
-'qbsettings' => 'چټک پټه',
-'qbsettings-none' => 'هېڅ',
-'qbsettings-fixedleft' => 'ثابته کيڼ',
-'qbsettings-fixedright' => 'ثابته ښي',
-'qbsettings-floatingleft' => 'کيڼه لامبا',
-'qbsettings-floatingright' => 'ښي لامبا',
-
 # Preferences page
 'preferences' => 'غوره توبونه',
 'mypreferences' => 'غوره توبونه',
@@ -1007,6 +1043,7 @@ $1',
 'prefs-beta' => 'د آزمېښتي بڼې ځانګړنې',
 'prefs-datetime' => 'نېټه او وخت',
 'prefs-labs' => 'د آزمېنتون ځانګړنې',
+'prefs-user-pages' => 'کارن مخونه',
 'prefs-personal' => 'د کارن پېژنليک',
 'prefs-rc' => 'وروستي بدلونونه',
 'prefs-watchlist' => 'کتنلړ',
@@ -1193,9 +1230,13 @@ $1',
 'action-deletedhistory' => 'د دې مخ ړنګ شوی پېښليک کتل',
 'action-browsearchive' => 'ړنګ مخونه پلټل',
 'action-undelete' => 'همدا مخ ناړنګول',
+'action-suppressionlog' => 'دا شخصي يادښت کتل',
 'action-block' => 'پر دې کارن د سمون د آسانتياوؤ بنديز لګول',
 'action-protect' => 'د دې مخ د ژغورنې کچه بدلول',
+'action-mergehistory' => 'د دې مخ پېښليک سره اخږل',
 'action-userrights' => 'د کارن ټولې رښتې سمول',
+'action-userrights-interwiki' => 'په نورو ويکي ګانو د کارنانو رښتې سمول',
+'action-siteadmin' => 'توکبنسټ کولپول يا نه کولپول',
 'action-sendemail' => 'برېښليکونه لېږل',
 
 # Recent changes
@@ -1227,9 +1268,11 @@ $1',
 'boteditletter' => 'روباټ',
 'number_of_watching_users_pageview' => '[$1  {{PLURAL:$1|کارن|کارنان}} يې ګوري]',
 'rc_categories_any' => 'هر يو',
+'rc-change-size-new' => '$1 {{PLURAL:$1|بايټ|بايټونه}} د بدلون وروسته',
 'newsectionsummary' => '/* $1 */ نوې برخه',
 'rc-enhanced-expand' => 'تفصيل ښکاره کول (د دې لپاره د JavaScript اړتيا ده)',
 'rc-enhanced-hide' => 'تفصيل پټول',
+'rc-old-title' => 'اصلاً د "$1" په توګه جوړ شو',
 
 # Recent changes linked
 'recentchangeslinked' => 'اړونده بدلونونه',
@@ -1245,6 +1288,8 @@ $1',
 # Upload
 'upload' => 'دوتنه پورته کول',
 'uploadbtn' => 'دوتنه پورته کول',
+'reuploaddesc' => 'پورته کېدنه ناګارل او بېرته د پورته کېدنې فورمې ته ورګرځېدل',
+'upload-tryagain' => 'د بدلون موندلې دوتنې څرګندونې سپارل',
 'uploadnologin' => 'غونډال کې نه ياست ننوتي',
 'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو لومړی غونډال کې [[Special:UserLogin|ورننوځۍ]].',
 'uploaderror' => 'د پورته کولو ستونزه',
@@ -1310,6 +1355,7 @@ $1',
 'upload-failure-subj' => 'د پورته کېدو ستونزه',
 'upload-warning-subj' => 'د پورته کولو ګواښ',
 
+'upload-proto-error' => 'ناسم پروتوکول',
 'upload-file-error' => 'کورنۍ ستونزه',
 'upload-unknown-size' => 'ناڅرګنده کچه',
 'upload-http-error' => 'د HTTP يوه ستونزه رامېنځ ته شوې: $1',
@@ -1436,6 +1482,7 @@ $1',
 'statistics-header-hooks' => 'بل شمار',
 'statistics-articles' => 'مېنځپانګيز مخونه',
 'statistics-pages' => 'مخونه',
+'statistics-pages-desc' => 'د ويکي ټول مخونه، د خبرو اترو، مخ ګرځېدنو، او لا نورو مخونو په ګډون.',
 'statistics-files' => 'پورته شوې دوتنې',
 'statistics-edits' => 'د {{SITENAME}} د جوړېدو راهيسې د مخونو سمون',
 'statistics-edits-average' => 'پر يوه مخ د سمون منځوۍ کچه',
@@ -1449,6 +1496,8 @@ $1',
 'disambiguations' => 'د مبهمو مخونو سره تړلي مخونه',
 'disambiguationspage' => 'Template:ناجوت',
 
+'pageswithprop-submit' => 'ورځه',
+
 'doubleredirects' => 'دوه ځلي ورګرځېدنې',
 
 'brokenredirects' => 'ماتې ورګرځېدنې',
@@ -1653,7 +1702,7 @@ $1',
 'notanarticle' => 'يو منځپانګيز مخ نه دی',
 'watchlist-details' => 'ستاسې کتنلړ کې {{PLURAL:$1|$1 مخ دی|$1 مخونه دي}}، د خبرو اترو مخونه مو پکې نه دي شمېرلي.',
 'wlheader-enotif' => 'د برېښليک له لارې خبرول چارن شوی.*',
-'wlheader-showupdated' => "هغه مخونه چې وروستی ځل ستاسو د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک نښه شوي.",
+'wlheader-showupdated' => "هغه مخونه چې وروستی ځل ستاسو د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک نښه شوي.",
 'watchlistcontains' => 'ستاسې کتنلړ $1 {{PLURAL:$1|مخ|مخونه}} لري.',
 'iteminvalidname' => "د '$1' توکي سره ستونزه، ناسم نوم ...",
 'wlnote' => "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
@@ -1761,8 +1810,8 @@ $UNWATCHURL  نه ليدنه وکړۍ
 تاسې د همدې مخ د ژغورنې په کچه کې بدلون راوستلای شی، خو دا به په ځوړاوبيزه ژغورنه اغېزمنه نه کړي.',
 'protect-default' => 'ټول کارنان پرېښودل',
 'protect-fallback' => 'يوازې د "$1" اجازې لرونکي کارنان پرېښودل',
-'protect-level-autoconfirmed' => 'پر Ù\86Ù\88ؤ Ø§Ù\88 Ù\86اثبتÙ\87 Ú©Ø§Ø±Ù\86اÙ\86Ù\88 Ø¨Ù\86دÙ\8aز Ù\84Ú«Ù\88Ù\84',
-'protect-level-sysop' => 'يواځې پازوالان',
+'protect-level-autoconfirmed' => 'Ù\8aÙ\88ازÛ\90 ØªØ§Ù\8aÙ\8aد Ø´Ù\88Ù\8a Ú©Ø§Ø±Ù\86اÙ\86',
+'protect-level-sysop' => 'يواځې پازوالان پرېښودل',
 'protect-summary-cascade' => 'ځوړاوبيز',
 'protect-expiring' => 'په $1 (UTC) پای ته رسېږي',
 'protect-expiring-local' => 'پای نېټه $1',
@@ -2012,6 +2061,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # Export
 'export' => 'مخونه صادرول',
+'exportall' => 'ټول مخونه صادرول',
 'export-submit' => 'صادرول',
 'export-addcattext' => 'مخونو د ورګډولو وېشنيزه:',
 'export-addcat' => 'ورګډول',
@@ -2165,18 +2215,15 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'pageinfo-protect-cascading-yes' => 'هو',
 
 # Skin names
-'skinname-standard' => 'کلاسيک',
-'skinname-nostalgia' => 'نوستالژي',
 'skinname-cologneblue' => 'شين کلون',
 'skinname-monobook' => 'مونوبوک',
-'skinname-myskin' => 'زمابڼه',
-'skinname-chick' => 'شيک',
-'skinname-simple' => 'ساده',
 'skinname-modern' => 'نوی',
 'skinname-vector' => 'وېکټور',
 
 # Patrolling
+'markaspatrolleddiff' => 'دا مخ څارل شوی په نخښه کول',
 'markaspatrolledtext' => 'دا مخ څارل شوی په نخښه کول',
+'markedaspatrolled' => 'دا مخ څارل شوی په نخښه کول',
 
 # Image deletion
 'filedeleteerror-short' => 'د دوتنې د ړنګولو ستونزه: $1',
@@ -2218,6 +2265,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 ساعت|$1 ساعتونه}}',
 'days' => '{{PLURAL:$1|$1 ورځ|$1 ورځې}}',
 'ago' => '$1 دمخه',
+'just-now' => 'همدا اوس',
 
 # Bad image list
 'bad_image_list' => 'بڼه يې په لاندې توګه ده:
@@ -2248,7 +2296,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'سوروالی',
 'exif-imagelength' => 'لوړوالی',
 'exif-datetime' => 'د دوتنې د بدلون وخت او نېټه',
@@ -2430,8 +2478,8 @@ $1',
 'confirmemail_noemail' => 'تاسې يوه سمه برېښليک پته نه ده ثبته کړې مهرباني وکړی [[Special:Preferences|د کارن غوره توبونه]] مو بدل کړۍ.',
 'confirmemail_send' => 'يو تاييدي کوډ لېږل',
 'confirmemail_sent' => 'تاييدي برېښليک ولېږل شو.',
-'confirmemail_oncreate' => 'ستاسو د برېښناليک پتې ته يو تاييدي کوډ درولېږل شو.
-ددې لپاره چې تاسو غونډال ته ورننوځی تاسو ته د همدغه کوډ اړتيا نشته، خو تاسو ته د همدغه کوډ اړتيا په هغه وخت کې پکارېږي کله چې په ويکي کې خپلې برېښناليکي کړنې چارن کول غواړی.',
+'confirmemail_oncreate' => 'ستاسې برېښليک پتې ته يو تاييدي کوډ درولېږل شو.
+که تاسې غونډال ته ورننوځی نو تاسې دې کوډ ته اړتيا نه لرۍ، خو تاسې هغه وخت همدې درلېږل شوي کوډ ته اړتيا لرۍ، کله چې په ويکي کې د برېښليک پر بنسټ نورې کړنې چارنول غواړی.',
 'confirmemail_needlogin' => 'ددې لپاره چې ستاسې د برېښليک پتې پخلی وشي، تاسې ته پکار ده چې $1.',
 'confirmemail_loggedin' => 'اوس ستاسې د برېښليک پتې پخلی وشو.',
 'confirmemail_error' => 'ستاسې د برېښليک پتې د تاييد په خوندي کولو کې يوه ستونزه رامېنڅ ته شوه.',
@@ -2587,10 +2635,6 @@ $5
 'version-software-product' => 'اېبره',
 'version-software-version' => 'بڼه',
 
-# Special:FilePath
-'filepath-page' => 'دوتنه:',
-'filepath-submit' => 'ورځه',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'د دوه ګونو دوتنو پلټنه',
 'fileduplicatesearch-legend' => 'د دوه ګونو دوتنو پلټنه',
@@ -2665,17 +2709,19 @@ $5
 'htmlform-submit' => 'سپارل',
 'htmlform-reset' => 'بدلونونه ناکړل',
 'htmlform-selectorother-other' => 'بل',
+'htmlform-no' => 'نه',
+'htmlform-yes' => 'هو',
 
 # New logging system
-'logentry-delete-delete' => '$1 د $3 مخ ړنګ کړ',
+'logentry-delete-delete' => '$1 د $3 مخ {{GENDER:$2|ړنګ کړ}}',
 'revdelete-content-hid' => 'مېنځپانګه پټېدلې',
 'revdelete-uname-hid' => 'کارن نوم پټ شوی',
 'revdelete-content-unhid' => 'مېنځپانګه ښکاره شوی',
 'revdelete-uname-unhid' => 'ښکاره کارن-نوم',
-'logentry-move-move' => '$1 د $3 مخ $4 ته ولېږداوه',
-'logentry-newusers-newusers' => 'د $1 کارن ګڼون جوړ شو',
-'logentry-newusers-create' => 'د $1 کارن ګڼون جوړ شو',
-'logentry-newusers-autocreate' => 'د $1 ګڼون په اتوماتيک ډول جوړ شو',
+'logentry-move-move' => '$1 د $3 مخ $4 ته {{GENDER:$2|ولېږداوه}}',
+'logentry-newusers-newusers' => 'د $1 کارن ګڼون {{GENDER:$2|جوړ شو}}',
+'logentry-newusers-create' => 'د $1 کارن ګڼون {{GENDER:$2|جوړ شو}}',
+'logentry-newusers-autocreate' => 'د $1 ګڼون په اتوماتيک ډول {{GENDER:$2|جوړ شو}}',
 'rightsnone' => '(هېڅ)',
 
 # Feedback
@@ -2694,6 +2740,7 @@ $5
 'api-error-filename-tooshort' => 'د دوتنې نوم ډېر لنډ دی.',
 'api-error-filetype-banned' => 'په دې ډول دوتنې بنديز دی.',
 'api-error-illegal-filename' => 'د دوتنې نوم نه دی پرېښل شوی.',
+'api-error-mustbeloggedin' => 'د دوتنو د پورته کولو لپاره بايد تاسې غونډال کې ننوتلی اوسۍ.',
 'api-error-unclassified' => 'يوه ناڅرګنده تېروتنه رامېنځته شوه.',
 'api-error-unknown-code' => 'ناڅرګنده تېروتنه: "$1"',
 'api-error-unknown-warning' => 'ناڅرګنده ګواښنه: "$1".',
index c9596df..89b727f 100644 (file)
@@ -12,6 +12,7 @@
  * @author Capmo
  * @author Crazymadlover
  * @author Daemorris
+ * @author DanielTom
  * @author Dicionarista
  * @author Francisco Leandro
  * @author Giro720
@@ -24,6 +25,7 @@
  * @author Kaganer
  * @author Leonardo.stabile
  * @author Lijealso
+ * @author Luckas
  * @author Luckas Blade
  * @author Lugusto
  * @author MCruz
@@ -34,6 +36,7 @@
  * @author McDutchie
  * @author MetalBrasil
  * @author Minh Nguyen
+ * @author Nemo bis
  * @author Nuno Tavares
  * @author Opraco
  * @author Paulo Juntas
@@ -44,6 +47,7 @@
  * @author RmSilva
  * @author Rodrigo Calanca Nishino
  * @author SandroHc
+ * @author Sarilho1
  * @author Sir Lestaty de Lioncourt
  * @author Sérgio Ribeiro
  * @author Teles
@@ -341,8 +345,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Mostrar o número de utilizadores a vigiar',
 'tog-oldsig' => 'Assinatura existente:',
 'tog-fancysig' => 'Tratar assinatura como texto wiki (sem link automático)',
-'tog-externaleditor' => 'Por omissão, utilizar um editor externo (só para utilizadores avançados, exige configurações adicionais no seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-externaldiff' => 'Por omissão, utilizar diferenças externas (só para utilizadores avançados, exige configurações adicionais no seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
 'tog-showjumplinks' => 'Possibilitar links de acessibilidade "{{int:jumpto}}"',
 'tog-uselivepreview' => 'Usar a antevisão ao vivo (requer JavaScript; é experimental)',
 'tog-forceeditsummary' => 'Avisar-me se deixar o resumo da edição vazio',
@@ -357,6 +359,7 @@ $messages = array(
 'tog-showhiddencats' => 'Mostrar categorias ocultas',
 'tog-noconvertlink' => 'Impossibilitar a conversão dos títulos de links',
 'tog-norollbackdiff' => 'Omitir diferenças depois de reverter edições em bloco',
+'tog-useeditwarning' => 'Avisar-me ao abandonar uma página editada sem gravar as alterações.',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
@@ -420,6 +423,18 @@ $messages = array(
 'oct' => 'Out.',
 'nov' => 'Nov.',
 'dec' => 'Dez.',
+'january-date' => '$1 de Janeiro',
+'february-date' => '$1 de Fevereiro',
+'march-date' => '$1 de Março',
+'april-date' => '$1 de Abril',
+'may-date' => '$1 de Maio',
+'june-date' => '$1 de Junho',
+'july-date' => '$1 de Julho',
+'august-date' => '$1 de Agosto',
+'september-date' => '$1 de Setembro',
+'october-date' => '$1 de Outubro',
+'november-date' => '$1 de Novembro',
+'december-date' => '$1 de Dezembro',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -475,7 +490,7 @@ $messages = array(
 'vector-view-history' => 'Ver histórico',
 'vector-view-view' => 'Ler',
 'vector-view-viewsource' => 'Ver fonte',
-'actions' => 'Acções',
+'actions' => 'Ações',
 'namespaces' => 'Espaços nominais',
 'variants' => 'Variantes',
 
@@ -490,7 +505,7 @@ $messages = array(
 'searcharticle' => 'Ir',
 'history' => 'Histórico',
 'history_short' => 'Histórico',
-'updatedmarker' => 'actualizado desde a minha última visita',
+'updatedmarker' => 'atualizado desde a minha última visita',
 'printableversion' => 'Versão para impressão',
 'permalink' => 'Link permanente',
 'print' => 'Imprimir',
@@ -513,13 +528,13 @@ $messages = array(
 'talkpagelinktext' => 'discussão',
 'specialpage' => 'Página especial',
 'personaltools' => 'Ferramentas pessoais',
-'postcomment' => 'Nova secção',
+'postcomment' => 'Nova seção',
 'articlepage' => 'Ver página de conteúdo',
 'talk' => 'Discussão',
 'views' => 'Vistas',
 'toolbox' => 'Ferramentas',
 'userpage' => 'Ver página de utilizador',
-'projectpage' => 'Ver página de projecto',
+'projectpage' => 'Ver página de projeto',
 'imagepage' => 'Ver página de ficheiro',
 'mediawikipage' => 'Ver página de mensagens',
 'templatepage' => 'Ver página de predefinições',
@@ -587,7 +602,7 @@ Consulte a página da [[Special:Version|versão do sistema]].',
 'viewsourceold' => 'ver código',
 'editlink' => 'editar',
 'viewsourcelink' => 'ver fonte',
-'editsectionhint' => 'Editar secção: $1',
+'editsectionhint' => 'Editar seção: $1',
 'toc' => 'Índice',
 'showtoc' => 'mostrar',
 'hidetoc' => 'esconder',
@@ -726,9 +741,18 @@ Tenha em atenção que algumas páginas poderão continuar a ser apresentadas co
 'welcomecreation-msg' => 'A sua conta foi criada.
 Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].',
 'yourname' => 'Nome de utilizador:',
+'userlogin-yourname' => 'Nome de utilizador(a):',
+'userlogin-yourname-ph' => 'Digite seu nome de utilizador(a)',
 'yourpassword' => 'Palavra-chave:',
+'userlogin-yourpassword' => 'Palavra-chave',
+'userlogin-yourpassword-ph' => 'Digite sua palavra-chave',
+'createacct-yourpassword-ph' => 'Digite uma palavra-chave',
 'yourpasswordagain' => 'Repita a palavra-chave:',
+'createacct-yourpasswordagain' => 'Confirme a palavra-chave',
+'createacct-yourpasswordagain-ph' => 'Digite a palavra-chave novamente',
 'remembermypassword' => 'Recordar os meus dados neste computador (no máximo, por $1 {{PLURAL:$1|dia|dias}})',
+'userlogin-remembermypassword' => 'Manter-me autenticado',
+'userlogin-signwithsecure' => 'Use uma ligação segura',
 'securelogin-stick-https' => 'Manter a ligação HTTPS após a autenticação',
 'yourdomainname' => 'O seu domínio:',
 'password-change-forbidden' => 'Não podes alterar senhas nesta wiki.',
@@ -741,18 +765,38 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências]].'
 'logout' => 'Sair',
 'userlogout' => 'Sair',
 'notloggedin' => 'Não autenticado',
+'userlogin-noaccount' => 'Não tem uma conta?',
+'userlogin-joinproject' => 'Junte {{SITENAME}}',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
 'createaccount' => 'Criar conta',
 'gotaccount' => "Já possui uma conta? '''$1'''.",
 'gotaccountlink' => 'Autentique-se',
 'userlogin-resetlink' => 'Esqueceu-se do seu nome de utilizador ou da palavra-chave?',
+'userlogin-resetpassword-link' => 'Recuperar palavra-chave',
+'helplogin-url' => 'Ajuda:login',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda a fazer login]]',
+'createacct-join' => 'Insira a sua informação abaixo.',
+'createacct-emailrequired' => 'Endereço de email',
+'createacct-emailoptional' => 'Endereço de email (opcional)',
+'createacct-email-ph' => 'Digite seu endereço de email',
 'createaccountmail' => 'Usar uma palavra passe aleatória e temporária e enviar para o endereço de e-mail especificado abaixo',
+'createacct-realname' => 'Nome verdadeiro (opcional)',
 'createaccountreason' => 'Motivo:',
+'createacct-reason' => 'Razão',
+'createacct-reason-ph' => 'Porque está a criar outra conta',
+'createacct-captcha' => 'Verificar segurança',
+'createacct-imgcaptcha-ph' => 'Digite o texto que vê acima',
+'createacct-submit' => 'Crie a sua 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-chave que introduziu não são iguais.',
 'userexists' => 'O nome de utilizador introduzido já existe.
 Por favor escolha um nome diferente.',
 'loginerror' => 'Erro de autenticação',
+'createacct-error' => 'Erro na criação da conta',
 'createaccounterror' => 'Não foi possível criar a conta: $1',
 'nocookiesnew' => "A conta de utilizador foi criada, mas neste momento não está autenticado.
 A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.
@@ -823,6 +867,7 @@ Aguarde antes de tentar novamente, por favor.',
 # Email sending
 'php-mail-error-unknown' => 'Erro desconhecido na função mail() do PHP',
 'user-mail-no-addy' => 'Tentou enviar uma mensagem sem um endereço de correio electrónico',
+'user-mail-no-body' => 'Tentou mandar email sem conteúdo ou com conteúdo demasiado pequeno.',
 
 # Change password dialog
 'resetpass' => 'Alterar palavra-chave',
@@ -842,13 +887,15 @@ Para prosseguir, será necessário definir uma nova palavra-chave.',
 'resetpass-wrong-oldpass' => 'Palavra-chave temporária ou actual inválida.
 Pode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova palavra-chave temporária.',
 'resetpass-temp-password' => 'Palavra-chave temporária:',
+'resetpass-abort-generic' => 'Alteração de senha foi cancelada por uma extensão.',
 
 # Special:PasswordReset
 'passwordreset' => 'Repor palavra-chave',
-'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta por correio electrónico.',
+'passwordreset-text-one' => 'Preencha este formulário para repor a sua palavra-passe.',
+'passwordreset-text-many' => '{{PLURAL:$1|Digite uma parte dos dados para redefinir sua senha.}}',
 'passwordreset-legend' => 'Reiniciar a palavra-chave',
 'passwordreset-disabled' => 'O reinício da palavra-chave foi impossibilitado nesta wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
+'passwordreset-emaildisabled' => 'Recursos de e-mail foram desactivados neste wiki.',
 'passwordreset-username' => 'Nome de utilizador:',
 'passwordreset-domain' => 'Domínio:',
 'passwordreset-capture' => 'Ver o email resultante?',
@@ -879,6 +926,7 @@ Palavra-chave temporária: $2',
 'changeemail-oldemail' => 'Correio electrónico actual:',
 'changeemail-newemail' => 'Correio electrónico novo:',
 'changeemail-none' => '(nenhum)',
+'changeemail-password' => 'A sua senha {{SITENAME}}:',
 'changeemail-submit' => 'Alterar correio electrónico',
 'changeemail-cancel' => 'Cancelar',
 
@@ -957,7 +1005,7 @@ Inclua todos os detalhes acima em quaisquer contactos relacionados com este bloq
 'whitelistedittext' => 'Precisa de $1 para poder editar páginas.',
 'confirmedittext' => 'Precisa de confirmar o seu endereço de correio electrónico antes de começar a editar páginas.
 Introduza e valide o endereço através das [[Special:Preferences|preferências do utilizador]], por favor.',
-'nosuchsectiontitle' => 'Não foi possível encontrar a secção',
+'nosuchsectiontitle' => 'Não foi possível encontrar a seção',
 'nosuchsectiontext' => 'Tentou editar uma secção que não existe.
 Ela pode ter sido movida ou removida enquanto estava a ver a página.',
 'loginreqtitle' => 'Autenticação necessária',
@@ -1005,7 +1053,7 @@ Este ainda não foi gravado!",
 'sitejspreview' => "'''Lembre-se de que está apenas a antever este código JavaScript.'''
 '''Ele ainda não foi gravado!'''",
 'userinvalidcssjstitle' => "'''Aviso:''' Não existe um tema \"\$1\". Lembre-se que as páginas .css e  .js têm um título em minúsculas, exemplo: {{ns:user}}:Alguém/vector.css em vez de {{ns:user}}:Alguém/Vector.css.",
-'updated' => '(Actualizado)',
+'updated' => '(Atualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Lembre-se que esta é apenas uma antevisão do resultado.'''
 As modificações ainda não foram gravadas!",
@@ -1026,8 +1074,8 @@ Isso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal
 'edit_form_incomplete' => "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''",
 'editing' => 'A editar $1',
 'creating' => 'A criar $1',
-'editingsection' => 'A editar $1 (secção)',
-'editingcomment' => 'A editar $1 (nova secção)',
+'editingsection' => 'A editar $1 (seção)',
+'editingcomment' => 'A editar $1 (nova seção)',
 'editconflict' => 'Conflito de edição: $1',
 'explainconflict' => "A página foi alterada por alguém desde que começou a editá-la.
 A caixa de texto abaixo mostra o texto existente neste momento.
@@ -1064,7 +1112,7 @@ A última entrada no histórico é fornecida abaixo como referência.",
 Para referência, é apresentada abaixo a última entrada do registo:",
 'templatesused' => '{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta página:',
 'templatesusedpreview' => '{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta antevisão:',
-'templatesusedsection' => '{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta secção:',
+'templatesusedsection' => '{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta seção:',
 'template-protected' => '(protegida)',
 'template-semiprotected' => '(semi-protegida)',
 'hiddencategories' => 'Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:',
@@ -1086,14 +1134,19 @@ Para referência, é apresentado de seguida o registo de eliminações e de movi
 'log-fulllog' => 'Ver registo detalhado',
 'edit-hook-aborted' => 'A edição foi abortada por um hook.
 Não foi dada nenhuma explicação.',
-'edit-gone-missing' => 'Não foi possível actualizar a página.
+'edit-gone-missing' => 'Não foi possível atualizar a página.
 Ela parece ter sido eliminada.',
 'edit-conflict' => 'Conflito de edição.',
 'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
+'postedit-confirmation' => 'Sua edição foi gravada',
 'edit-already-exists' => 'Não foi possível criar uma página nova.
 Ela já existia.',
 'defaultmessagetext' => 'Texto da mensagem padrão',
+'content-failed-to-parse' => 'Falha ao analisar conteúdo $2 para modelo $1:$3',
+'invalid-content-data' => 'Dados de conteúdo inválidos',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+'editwarning-warning' => 'Sair desta página fará com que você perca todas as alterações feitas por você.
+Se você fez login, pode desabilitar este aviso na seção "{{int:prefs-editing}}" das suas preferências.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1139,13 +1192,13 @@ O motivo apresentado por $3 foi ''$2''",
 # History pages
 'viewpagelogs' => 'Ver registos para esta página',
 'nohistory' => 'Não há histórico de edições para esta página.',
-'currentrev' => 'Revisão actual',
+'currentrev' => 'Revisão atual',
 'currentrev-asof' => 'Edição actual desde as $1',
 'revisionasof' => 'Revisão das $1',
 'revision-info' => 'Revisão das $1 por $2',
 'previousrevision' => '← Revisão anterior',
 'nextrevision' => 'Revisão seguinte →',
-'currentrevisionlink' => 'Revisão actual',
+'currentrevisionlink' => 'Revisão atual',
 'cur' => 'act',
 'next' => 'prox',
 'last' => 'ant',
@@ -1356,7 +1409,7 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-result-category-size' => '{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 ficheiro|$3 ficheiros}})',
 'search-result-score' => 'Relevancia: $1%',
 'search-redirect' => '(redireccionamento de $1)',
-'search-section' => '(secção $1)',
+'search-section' => '(seção $1)',
 'search-suggest' => 'Será que queria dizer: $1',
 'search-interwiki-caption' => 'Projectos associados',
 'search-interwiki-default' => 'Resultados de $1:',
@@ -1384,15 +1437,7 @@ Tente usar o prefixo ''all:'' para pesquisar todo o conteúdo (incluindo página
 'searchdisabled' => 'Foi impossibilitada a realização de pesquisas na {{SITENAME}}.
 Entretanto, pode realizar pesquisas através do Google.
 Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode estar desactualizada.',
-
-# Quickbar
-'qbsettings' => 'Barra Rápida',
-'qbsettings-none' => 'Nenhuma',
-'qbsettings-fixedleft' => 'Fixa à esquerda',
-'qbsettings-fixedright' => 'Fixa à direita',
-'qbsettings-floatingleft' => 'Flutuante à esquerda',
-'qbsettings-floatingright' => 'Flutuante à direita',
-'qbsettings-directionality' => 'Fixa, conforme a direccionalidade da escrita na sua língua',
+'search-error' => 'Um erro ocorreu enquanto se efectuava a busca: $1',
 
 # Preferences page
 'preferences' => 'Preferências',
@@ -1432,7 +1477,7 @@ Note, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode es
 'searchresultshead' => 'Pesquisar',
 'resultsperpage' => 'Resultados por página:',
 'stub-threshold' => 'Links para páginas curtas terão <a href="#" class="stub">este formato</a> se elas ocuparem menos de (bytes):',
-'stub-threshold-disabled' => 'Desactivado',
+'stub-threshold-disabled' => 'Desativado',
 'recentchangesdays' => 'Dias a apresentar nas mudanças recentes:',
 'recentchangesdays-max' => 'Máximo: $1 {{PLURAL:$1|dia|dias}}',
 'recentchangescount' => 'Número de edições a apresentar por omissão:',
@@ -1537,6 +1582,7 @@ Esta informação será pública.',
 'userrights-notallowed' => 'A sua conta não tem permissão para adicionar ou remover privilégios a utilizadores.',
 'userrights-changeable-col' => 'Grupos que pode alterar',
 'userrights-unchangeable-col' => 'Grupos que não pode alterar',
+'userrights-conflict' => 'Conflito com os privilégios dos utilizadores! Por favor, aplique as suas mudanças novamente.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1700,7 +1746,7 @@ Esta informação será pública.',
 'rc_categories' => 'Limitar às categorias (separar com "|")',
 'rc_categories_any' => 'Qualquer',
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} após mudança',
-'newsectionsummary' => '/* $1 */ nova secção',
+'newsectionsummary' => '/* $1 */ nova seção',
 'rc-enhanced-expand' => 'Mostrar detalhes (requer JavaScript)',
 'rc-enhanced-hide' => 'Esconder detalhes',
 'rc-old-title' => 'originalmente criado como "$1"',
@@ -1879,6 +1925,7 @@ Caso o problema persista, contacte um [[Special:ListUsers/sysop|administrador]].
 'backend-fail-notsame' => 'Já existe um ficheiro não idêntico em $1 .',
 'backend-fail-invalidpath' => '$1 não é um caminho de armazenamento válido.',
 'backend-fail-delete' => 'Não foi possível excluir o ficheiro $1.',
+'backend-fail-describe' => 'Não foi possível mudar metadados para o ficheiro "$1".',
 'backend-fail-alreadyexists' => 'O ficheiro $1 já existe.',
 'backend-fail-store' => 'Não foi possível armazenar o ficheiro $1 em $2.',
 'backend-fail-copy' => 'Não foi possível copiar o ficheiro $1 para $2.',
@@ -1957,7 +2004,6 @@ Para optimizar a segurança, o img_auth.php está impossibilitado de executar.',
 'http-read-error' => 'Erro de leitura HTTP.',
 'http-timed-out' => 'O pedido HTTP expirou.',
 'http-curl-error' => 'Ocorreu um erro ao aceder à URL: $1',
-'http-host-unreachable' => 'Não foi possível aceder à URL',
 'http-bad-status' => 'Ocorreu um problema durante o pedido HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1995,7 +2041,7 @@ Quando filtrada por utilizador, só lista os ficheiros cuja última versão foi
 'filehist-deleteall' => 'eliminar todas',
 'filehist-deleteone' => 'eliminar',
 'filehist-revert' => 'restaurar',
-'filehist-current' => 'actual',
+'filehist-current' => 'atual',
 'filehist-datetime' => 'Data/Hora',
 'filehist-thumb' => 'Miniatura',
 'filehist-thumbtext' => "Miniatura ''(thumbnail)'' da versão das $1",
@@ -2112,6 +2158,12 @@ Talvez queira editar a descrição na [$2 página original de descrição do fic
 Estes links deviam ser desambiguados, apontando-os para uma página mais apropriada.<br />
 Considera-se que uma página é de desambiguação se nela for utilizada uma predefinição que esteja definida em [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Páginas com uma propriedade',
+'pageswithprop-legend' => 'Páginas com uma propriedade',
+'pageswithprop-text' => 'Esta página lista páginas que usam uma propriedade em particular.',
+'pageswithprop-prop' => 'Nome da propriedade:',
+'pageswithprop-submit' => 'Avançar',
+
 'doubleredirects' => 'Redireccionamentos duplos',
 'doubleredirectstext' => 'Esta página lista todas as páginas que redireccionam para outras páginas de redireccionamento.
 Cada linha contém links para o primeiro e segundo redireccionamentos, bem como o destino do segundo redireccionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redireccionamento.
@@ -2309,6 +2361,7 @@ Encontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações
 'mailnologintext' => 'Precisa de estar [[Special:UserLogin|autenticado]] e possuir um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio electrónico a outros utilizadores.',
 'emailuser' => 'Enviar correio electrónico a este utilizador',
 'emailuser-title-target' => 'Enviar correio eletrónico a {{GENDER:$1|este utilizador|esta utilizadora}}',
+'emailuser-title-notarget' => 'Enviar correio electrónico ao utilizador',
 'emailpage' => 'Enviar correio electró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}}.
 O 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.',
@@ -2362,8 +2415,8 @@ O nome desta página passará a aparecer a '''negrito''' na lista de [[Special:R
 'notvisiblerev' => 'Edição eliminada',
 'watchnochange' => 'Nenhuma das páginas vigiadas foi editada no período apresentado.',
 'watchlist-details' => '{{PLURAL:$1|Existe $1 página|Existem $1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.',
-'wlheader-enotif' => 'A notificação por correio electrónico está activada.',
-'wlheader-showupdated' => "As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''",
+'wlheader-enotif' => 'A notificação por correio electrónico está activada.',
+'wlheader-showupdated' => "As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''",
 'watchmethod-recent' => 'a procurar páginas vigiadas nas mudanças recentes',
 'watchmethod-list' => 'a procurar mudanças recentes nas páginas vigiadas',
 'watchlistcontains' => 'A sua lista de páginas vigiadas contém $1 {{PLURAL:$1|página|páginas}}.',
@@ -2380,6 +2433,16 @@ O nome desta página passará a aparecer a '''negrito''' na lista de [[Special:R
 'enotif_mailer' => 'Gerador de Notificações da {{SITENAME}}',
 'enotif_reset' => 'Marcar todas as páginas como visitadas',
 'enotif_impersonal_salutation' => 'Utilizador da "{{SITENAME}}"',
+'enotif_subject_deleted' => 'A página  $1 de {{SITENAME}} foi {{GENDER:$2|eliminada}} por $2',
+'enotif_subject_created' => 'A página $1 de {{SITENAME}} foi {{GENDER:$2|criada}} por $2',
+'enotif_subject_moved' => 'A página $1 de {{SITENAME}} foi {{GENDER:$2|movida}} por $2',
+'enotif_subject_restored' => 'A página $1 de {{SITENAME}} foi {{GENDER:$2|restaurada}} por $2',
+'enotif_subject_changed' => 'A página $1 de {{SITENAME}} foi {{GENDER:$2|alterada}} por $2',
+'enotif_body_intro_deleted' => 'A página $1 de {{SITENAME}} foi {{GENDER:$2|eliminada}} em $PAGEEDITDATE por $2, ver $3.',
+'enotif_body_intro_created' => 'A página $1 em {{SITENAME}} foi {{GENDER:$2| criada}} em $PAGEEDITDATE por $2, ver $3 para a versão actual.',
+'enotif_body_intro_moved' => 'A páginas $1 em {{SITENAME}} foi {{GENDER:$2|movida}} em $PAGEEDITDATE por $2, ver $3 para a versão actual.',
+'enotif_body_intro_restored' => 'A páginas $1 em {{SITENAME}} foi {{GENDER:$2|restaurada}} em $PAGEEDITDATE por $2, ver $3 para a versão actual.',
+'enotif_body_intro_changed' => 'A página $1 em {{SITENAME}} foi {{GENDER:$2|alterada}} em $PAGEEDITDATE por $2, ver $3 para a versão actual.',
 'enotif_lastvisited' => 'Consulte $1 para todas as alterações efectuadas desde a sua última visita.',
 'enotif_lastdiff' => 'Consulte $1 para ver esta alteração.',
 'enotif_anon_editor' => 'utilizador anónimo $1',
@@ -2483,6 +2546,8 @@ Consulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as p
 'prot_1movedto2' => 'moveu [[$1]] para [[$2]]',
 'protect-badnamespace-title' => 'Espaço nominal não passível de protecção',
 'protect-badnamespace-text' => 'Páginas neste espaço nominal não podem ser protegidas.',
+'protect-norestrictiontypes-text' => 'Esta página não pode ser protegida porque não há nenhum tipo de restrição disponível.',
+'protect-norestrictiontypes-title' => 'Página não passível de protecção',
 'protect-legend' => 'Confirmar protecção',
 'protectcomment' => 'Motivo:',
 'protectexpiry' => 'Expiração:',
@@ -2560,10 +2625,10 @@ Pode ter usado um link incorrecto ou talvez a revisão tenha sido restaurada ou
 'undeletelink' => 'ver/restaurar',
 'undeleteviewlink' => 'ver',
 'undeletereset' => 'Limpar',
-'undeleteinvert' => 'Inverter selecção',
+'undeleteinvert' => 'Inverter seleção',
 'undeletecomment' => 'Motivo:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|edição restaurada|edições restauradas}}',
-'undeletedrevisions-files' => '$1 {{PLURAL:$2|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|ficheiro restaurado|ficheiros restaurados}}',
+'undeletedrevisions-files' => '$1 {{PLURAL:$1|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|ficheiro restaurado|ficheiros restaurados}}',
 'undeletedfiles' => '{{PLURAL:$1|ficheiro restaurado|$1 ficheiros restaurados}}',
 'cannotundelete' => 'Restauração falhada:
 $1',
@@ -2590,7 +2655,7 @@ $1',
 
 # Namespace form on various pages
 'namespace' => 'Espaço nominal:',
-'invert' => 'Inverter selecção',
+'invert' => 'Inverter seleção',
 'tooltip-invert' => 'Marque esta caixa para esconder as alterações a páginas no espaço nominal seleccionado (e no espaço nominal associado, se escolheu fazê-lo)',
 'namespace_association' => 'Espaço nominal associado',
 'tooltip-namespace_association' => 'Marque esta caixa para incluir também o espaço nominal de conteúdo ou de discussão associado à sua selecção',
@@ -2764,6 +2829,7 @@ Contacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-
 'proxyblocksuccess' => 'Concluído.',
 'sorbsreason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}.",
 'sorbs_create_account_reason' => "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}. Não pode criar uma conta",
+'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwardd-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1',
 'cant-block-while-blocked' => 'Não pode bloquear outros utilizadores enquanto estiver bloqueado.',
 'cant-see-hidden-user' => "O utilizador que está tentando bloquear já está bloqueado e oculto.
 Como não tem o privilégio para ocultar utilizadores ''(hideuser)'', não pode ver ou editar o bloqueio deste utilizador.",
@@ -2910,7 +2976,7 @@ Se desejar, pode utilizar um link (por exemplo, [[{{#Special:Export}}/{{MediaWik
 'allmessages' => 'Mensagens de sistema',
 'allmessagesname' => 'Nome',
 'allmessagesdefault' => 'Texto padrão',
-'allmessagescurrent' => 'Texto actual',
+'allmessagescurrent' => 'Texto atual',
 'allmessagestext' => 'Esta é a lista das mensagens de sistema disponíveis no espaço nominal MediaWiki.
 Se deseja colaborar na localização genérica do MediaWiki, visite [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e a [//translatewiki.net translatewiki.net].',
 'allmessagesnotsupportedDB' => "Esta página não pode ser utilizada, uma vez que '''\$wgUseDatabaseMessages''' foi desativado.",
@@ -2927,6 +2993,8 @@ Se deseja colaborar na localização genérica do MediaWiki, visite [//www.media
 'thumbnail-more' => 'Ampliar',
 'filemissing' => 'Ficheiro não encontrado',
 'thumbnail_error' => 'Erro ao criar miniatura: $1',
+'thumbnail_error_remote' => 'Mensagem de erro de $1 :
+$2',
 'djvu_page_error' => 'página DjVu inacessível',
 'djvu_no_xml' => 'Não foi possível aceder ao XML para o ficheiro DjVU',
 'thumbnail-temp-create' => 'Não foi possível criar o ficheiro temporário da miniatura',
@@ -2948,6 +3016,7 @@ Todas as acções de importação transwikis são registadas no [[Special:Log/im
 'import-interwiki-templates' => 'Incluir todas as predefinições',
 'import-interwiki-submit' => 'Importar',
 'import-interwiki-namespace' => 'Espaço nominal de destino:',
+'import-interwiki-rootpage' => 'Raiz da página de destino (opcional):',
 'import-upload-filename' => 'Nome do ficheiro:',
 'import-comment' => 'Comentário:',
 'importtext' => 'Exporte o ficheiro da wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].
@@ -2983,7 +3052,9 @@ Não há um directório temporário.',
 'import-error-interwiki' => 'A página "$1" não pode ser importada pois seu nome está reservado para um link externo (interwiki).',
 'import-error-special' => 'A página "$1" não pode ser importada porque ela pertence a um espaço nominal especial que não permite páginas.',
 'import-error-invalid' => 'A página "$1" não pode ser importada porque seu nome é inválido.',
+'import-error-unserialize' => 'Revisão $2 da página "$1" não pode ser desserializada. Foi relatado que a revisão usava o modelo de conteúdo $3 serializado como $4.',
 'import-options-wrong' => '{{PLURAL:$2|Opção errada|Opções erradas}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'A raiz da página dada é um título inválido.',
 
 # Import log
 'importlogpage' => 'Registo de importações',
@@ -3017,7 +3088,7 @@ Não há um directório temporário.',
 'tooltip-ca-talk' => 'Discussão sobre o conteúdo da página',
 'tooltip-ca-edit' => 'Pode editar esta página.
 Utilize o botão "Antever resultado" antes de gravar, por favor.',
-'tooltip-ca-addsection' => 'Iniciar uma nova secção',
+'tooltip-ca-addsection' => 'Iniciar uma nova seção',
 'tooltip-ca-viewsource' => 'Esta página está protegida; só pode ver o conteúdo.',
 'tooltip-ca-history' => 'Edições anteriores desta página.',
 'tooltip-ca-protect' => 'Proteger esta página',
@@ -3052,7 +3123,7 @@ Utilize o botão "Antever resultado" antes de gravar, por favor.',
 'tooltip-ca-nstab-user' => 'Ver a página de utilizador',
 'tooltip-ca-nstab-media' => 'Ver a página de media',
 'tooltip-ca-nstab-special' => 'Esta é uma página especial, não pode ser editada.',
-'tooltip-ca-nstab-project' => 'Ver a página de projecto',
+'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',
 'tooltip-ca-nstab-template' => 'Ver a predefinição',
@@ -3076,27 +3147,16 @@ Permite colocar uma justificação no resumo da edição.',
 
 # Stylesheets
 'common.css' => '/* Código CSS colocado aqui será aplicado a todos os temas */',
-'standard.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Clássico */',
-'nostalgia.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Nostalgia */',
 'cologneblue.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Azul colonial */',
 'monobook.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Monobook */',
-'myskin.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema MySkin */',
-'chick.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Chique */',
-'simple.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Simples */',
 'modern.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Moderno */',
 'vector.css' => '/* Código CSS colocado aqui afectará os utilizadores do tema Vector */',
 'print.css' => '/* Código CSS colocado aqui afectará as impressões */',
-'handheld.css' => '/* Código CSS colocado aqui afectará dispositivos móveis baseados no tema configurado em $wgHandheldStyle */',
 
 # Scripts
 'common.js' => '/* Código Javascript colocado aqui será carregado para todos os utilizadores em cada carregamento de página */',
-'standard.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Clássico */',
-'nostalgia.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Nostalgia */',
 'cologneblue.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Azul colonial */',
 'monobook.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Monobook */',
-'myskin.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema MySkin */',
-'chick.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Chick */',
-'simple.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Simples */',
 'modern.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Moderno */',
 'vector.js' => '/* Código Javascript colocado aqui será carregado para utilizadores do tema Vector */',
 
@@ -3132,7 +3192,7 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 'pageinfo-header-edits' => 'Histórico de edições',
 'pageinfo-header-restrictions' => 'Proteção da página',
 'pageinfo-header-properties' => 'Propriedades da página',
-'pageinfo-display-title' => 'Exibir título',
+'pageinfo-display-title' => 'Título exibido',
 'pageinfo-length' => 'Tamanho da página (em bytes)',
 'pageinfo-article-id' => 'ID da página',
 'pageinfo-language' => 'Idioma do conteúdo da página',
@@ -3166,13 +3226,8 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 'pageinfo-category-files' => 'Número de ficheiros',
 
 # Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Azul colonial',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simples',
 'skinname-modern' => 'Moderno',
 'skinname-vector' => 'Vector',
 
@@ -3282,7 +3337,7 @@ Caso o ficheiro tenha sido modificado a partir do seu estado original, alguns de
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largura',
 'exif-imagelength' => 'Altura',
 'exif-bitspersample' => 'Bits por componente',
@@ -3460,7 +3515,7 @@ Caso o ficheiro tenha sido modificado a partir do seu estado original, alguns de
 'exif-originalimageheight' => 'Altura da imagem antes de ser cortada',
 'exif-originalimagewidth' => 'Largura da imagem antes de ser cortada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Descomprimido',
 'exif-compression-2' => 'CCITT Grupo 3 1-D Codificação Unidimensional Huffman Modificado e Run Length Encoding',
 'exif-compression-3' => 'CCITT Grupo 3 codificação de fax',
@@ -3831,7 +3886,7 @@ Liste uma só página por linha.
 Quando terminar, clique "{{int:Watchlistedit-raw-submit}}".
 Também pode [[Special:EditWatchlist|editar a lista da maneira convencional]].',
 'watchlistedit-raw-titles' => 'Páginas:',
-'watchlistedit-raw-submit' => 'Actualizar a lista de páginas vigiadas',
+'watchlistedit-raw-submit' => 'Atualizar a lista de páginas vigiadas',
 'watchlistedit-raw-done' => 'A sua lista de páginas vigiadas foi actualizada.',
 'watchlistedit-raw-added' => '{{PLURAL:$1|Foi adicionada uma página|Foram adicionadas $1 páginas}}:',
 'watchlistedit-raw-removed' => '{{PLURAL:$1|Foi removida uma página|Foram removidas $1 páginas}}:',
@@ -3880,13 +3935,6 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Endereço de ficheiro',
-'filepath-page' => 'Ficheiro:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página especial retorna o endereço completo de um ficheiro.
-Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de outro tipo serão abertos pelo browser directamente no programa que lhes está associado no seu computador.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ficheiros duplicados',
 'fileduplicatesearch-summary' => "Procure ficheiros duplicados tendo por base o seu resumo criptográfico ''(hash value)''.",
@@ -3958,7 +4006,7 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 # Database error messages
 'dberr-header' => 'Esta wiki tem um problema',
 'dberr-problems' => 'Desculpe! Este site está com dificuldades técnicas.',
-'dberr-again' => 'Experimente esperar uns minutos e actualizar.',
+'dberr-again' => 'Experimente esperar alguns minutos e atualizar.',
 'dberr-info' => '(Não foi possível contactar o servidor da base de dados: $1)',
 'dberr-usegoogle' => 'Pode tentar pesquisar no Google entretanto.',
 'dberr-outofdate' => 'Note que os seus índices relativos ao nosso conteúdo podem estar desactualizados.',
index 51107c8..e70911a 100644 (file)
  * @author Emufarmers
  * @author Everton137
  * @author Francisco Leandro
+ * @author Fúlvio
  * @author GKnedo
  * @author Giro720
  * @author GoEThe
+ * @author Gusta
  * @author Hamilton Abreu
  * @author Helder.wiki
  * @author Jaideraf
  * @author Leonardo.stabile
  * @author LeonardoG
  * @author Lijealso
+ * @author Luckas
  * @author Luckas Blade
  * @author Malafaya
  * @author ManoDbo
  * @author McDutchie
  * @author MetalBrasil
+ * @author MisterSanderson
+ * @author Nemo bis
  * @author Opraco
  * @author Pedroca cerebral
  * @author Ppena
@@ -52,6 +57,7 @@
  * @author Teles
  * @author TheGabrielZaum
  * @author Urhixidur
+ * @author Vivaelcelta
  * @author Vuln
  * @author Waldir
  * @author Yves Marques Junqueira
@@ -316,13 +322,13 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Sublinhar linques:',
+'tog-underline' => 'Sublinhar links:',
 'tog-justify' => 'Justificar parágrafos',
 'tog-hideminor' => 'Ocultar edições menores nas mudanças recentes',
 'tog-hidepatrolled' => 'Ocultar edições patrulhadas nas mudanças recentes',
 'tog-newpageshidepatrolled' => 'Ocultar páginas patrulhadas da lista de páginas novas',
-'tog-extendwatchlist' => 'Expandir a lista de páginas vigiadas para mostrar todas as alterações aplicáveis, não apenas as mais recentes',
-'tog-usenewrc' => 'Agrupar alterações por páginas nas mudanças recentes e páginas vigiadas (requer JavaScript)',
+'tog-extendwatchlist' => 'Expandir a lista de páginas vigiadas para mostrar todas as mudanças, não apenas as mais recentes',
+'tog-usenewrc' => 'Agrupar alterações por páginas nas mudanças recentes e na lista de páginas vigiadas (requer JavaScript)',
 'tog-numberheadings' => 'Auto-numerar cabeçalhos',
 'tog-showtoolbar' => 'Mostrar barra de edição (JavaScript)',
 'tog-editondblclick' => 'Editar páginas quando houver clique duplo (JavaScript)',
@@ -330,44 +336,43 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Habilitar edição de seção por clique com o botão direito no título da seção (JavaScript)',
 'tog-showtoc' => 'Mostrar Tabela de Conteúdos (para páginas com mais de três cabeçalhos)',
 'tog-rememberpassword' => 'Recordar os meus dados neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
-'tog-watchcreations' => 'Adicionar as páginas e arquivos que eu criar às minhas páginas vigiadas',
-'tog-watchdefault' => 'Adicionar as páginas e arquivos que eu editar às minhas páginas vigiadas',
-'tog-watchmoves' => 'Adicionar as páginas e arquivos que eu mover às minhas páginas vigiadas',
-'tog-watchdeletion' => 'Adicionar as páginas e arquivos que eu eliminar às minhas páginas vigiadas',
-'tog-minordefault' => 'Marcar todas as edições como secundárias, por padrão',
+'tog-watchcreations' => 'Adicionar as páginas e arquivos que eu criar à minha lista de páginas vigiadas',
+'tog-watchdefault' => 'Adicionar as páginas e arquivos que eu editar à minha lista de páginas vigiadas',
+'tog-watchmoves' => 'Adicionar as páginas e arquivos que eu mover à minha lista de páginas vigiadas',
+'tog-watchdeletion' => 'Adicionar as páginas e arquivos que eu eliminar à minha lista de páginas vigiadas',
+'tog-minordefault' => 'Marcar todas as edições como menores por padrão',
 'tog-previewontop' => 'Mostrar previsão antes da caixa de edição',
 'tog-previewonfirst' => 'Mostrar previsão na primeira edição',
 'tog-nocache' => 'Desativar o cache de páginas do navegador',
 'tog-enotifwatchlistpages' => 'Notificar-me por e-mail quando uma página ou arquivo vigiado for alterado',
 'tog-enotifusertalkpages' => 'Receber e-mail quando a minha página de discussão for editada',
 'tog-enotifminoredits' => 'Notificar-me por e-mail também sobre edições menores de páginas ou arquivos',
-'tog-enotifrevealaddr' => 'Revelar o meu endereço de email nas notificações',
+'tog-enotifrevealaddr' => 'Revelar meu endereço de e-mail nas mensagens de notificação',
 'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
 'tog-oldsig' => 'Assinatura existente:',
 'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
-'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
 'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
 'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (JavaScript) (Experimental)',
-'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário vazio',
+'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário de edição vazio',
 'tog-watchlisthideown' => 'Ocultar as minhas edições da lista de páginas vigiadas',
-'tog-watchlisthidebots' => 'Ocultar edições automatizadas por bots da lista de páginas vigiadas',
+'tog-watchlisthidebots' => 'Ocultar edições de bots da lista de páginas vigiadas',
 'tog-watchlisthideminor' => 'Ocultar edições menores da lista de páginas vigiadas',
 'tog-watchlisthideliu' => 'Ocultar edições de usuários autenticados da lista de páginas vigiadas',
 'tog-watchlisthideanons' => 'Ocultar edições de usuários anônimos da lista de páginas vigiadas',
-'tog-watchlisthidepatrolled' => 'Ocultar edições patrulhadas na lista de páginas vigiadas',
+'tog-watchlisthidepatrolled' => 'Ocultar edições patrulhadas da lista de páginas vigiadas',
 'tog-ccmeonemails' => 'Receber cópias de e-mails que eu enviar a outros usuários',
 'tog-diffonly' => 'Não mostrar o conteúdo da página ao comparar duas edições',
 'tog-showhiddencats' => 'Exibir categorias ocultas',
 'tog-noconvertlink' => 'Desabilitar conversão de títulos de links',
-'tog-norollbackdiff' => 'Omitir diferenças depois de desfazer edições em bloco',
+'tog-norollbackdiff' => 'Omitir diferenças após desfazer edições em bloco',
+'tog-useeditwarning' => 'Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações',
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
 'underline-default' => 'Padrão do navegador/skin',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Estilo da fonte para a região de edição:',
+'editfont-style' => 'Estilo da fonte da área de edição:',
 'editfont-default' => 'Padrão do navegador',
 'editfont-monospace' => 'Fonte mono-espaçada',
 'editfont-sansserif' => 'Fonte sem serifa',
@@ -424,6 +429,18 @@ $messages = array(
 'oct' => 'out.',
 'nov' => 'nov.',
 'dec' => 'dez.',
+'january-date' => '$1 de janeiro',
+'february-date' => '$1 de fevereiro',
+'march-date' => '$1 de março',
+'april-date' => '$1 de abril',
+'may-date' => '$1 de maio',
+'june-date' => '$1 de junho',
+'july-date' => '$1 de julho',
+'august-date' => '$1 de agosto',
+'september-date' => '$1 de setembro',
+'october-date' => '$1 de outubro',
+'november-date' => '$1 de novembro',
+'december-date' => '$1 de dezembro',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
@@ -433,12 +450,12 @@ $messages = array(
 'category-empty' => "''No momento esta categoria não possui nenhuma página ou arquivo multimídia.''",
 'hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}}',
 'hidden-category-category' => 'Categorias ocultas',
-'category-subcat-count' => '{{PLURAL:$2|Esta categoria possui apenas a subcategoria a seguir.|Há, nesta categoria {{PLURAL:$1|uma subcategoria|$1 subcategorias}} (dentre um total de $2).}}',
+'category-subcat-count' => '{{PLURAL:$2|Esta categoria possui apenas a seguinte subcategoria.|Esta categoria possui {{PLURAL:$1|uma subcategoria|$1 subcategorias}}, de um total de $2.}}',
 'category-subcat-count-limited' => 'Esta categoria possui {{PLURAL:$1|a seguinte sub-categoria|as $1 sub-categorias a seguir}}.',
-'category-article-count' => '{{PLURAL:$2|Esta categoria possui apenas a página a seguir.|Há, nesta categoria, {{PLURAL:$1|a página a seguir|as $1 páginas a seguir}} (dentre um total de $2).}}',
-'category-article-count-limited' => 'Há, nesta categoria, {{PLURAL:$1|a página a seguir|as $1 páginas a seguir}}.',
-'category-file-count' => '{{PLURAL:$2|Esta categoria possui apenas o arquivo a seguir.|Há, nesta categoria, {{PLURAL:$1|o arquivo a seguir|os $1 seguintes arquivos}} (dentre um total de $2.)}}',
-'category-file-count-limited' => 'Nesta categoria há {{PLURAL:$1|um arquivo|$1 arquivos}}.',
+'category-article-count' => '{{PLURAL:$2|Esta categoria possui apenas a seguinte página.|Esta categoria possui {{PLURAL:$1|a seguinte página|as $1 páginas a seguir}}, de um total de $2.}}',
+'category-article-count-limited' => 'Esta categoria possui {{PLURAL:$1|a seguinte página|as $1 páginas a seguir}}.',
+'category-file-count' => '{{PLURAL:$2|Esta categoria possui apenas o seguinte arquivo.|Esta categoria possui {{PLURAL:$1|o seguinte arquivo|os $1 arquivos a seguir}}, de um total de $2.}}',
+'category-file-count-limited' => 'Esta categoria possui {{PLURAL:$1|um arquivo|$1 arquivos}}.',
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páginas indexadas',
 'noindex-category' => 'Páginas não indexadas',
@@ -671,7 +688,7 @@ Anote a URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].
 'filedeleteerror' => 'Não foi possível eliminar o arquivo "$1".',
 'directorycreateerror' => 'Não foi possível criar o diretório "$1".',
 'filenotfound' => 'Não foi possível encontrar o arquivo "$1".',
-'fileexistserror' => 'Não foi possível gravar no arquivo "$1": ele já existe',
+'fileexistserror' => 'Não foi possível escrever no arquivo "$1": ele já existe',
 'unexpected' => 'Valor não esperado: "$1"="$2".',
 'formerror' => 'Erro: Não foi possível enviar o formulário',
 'badarticleerror' => 'Esta ação não pode ser realizada nesta página.',
@@ -734,9 +751,18 @@ Note que algumas páginas podem continuar sendo exibidas como se você ainda est
 'welcomecreation-msg' => 'A sua conta foi criada.
 Não se esqueça de personalizar as suas [[Special:Preferences|preferências no wiki {{SITENAME}}]].',
 'yourname' => 'Nome de usuário:',
+'userlogin-yourname' => 'Nome de usuário',
+'userlogin-yourname-ph' => 'Escreva seu nome de usuário',
 'yourpassword' => 'Senha:',
+'userlogin-yourpassword' => 'Senha',
+'userlogin-yourpassword-ph' => 'Digite sua senha',
+'createacct-yourpassword-ph' => 'Digite uma senha',
 'yourpasswordagain' => 'Redigite sua senha',
+'createacct-yourpasswordagain' => 'Confirmar senha',
+'createacct-yourpasswordagain-ph' => 'Digite a senha novamente',
 'remembermypassword' => 'Lembrar meu login neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
+'userlogin-remembermypassword' => 'Mantenha-me conectado',
+'userlogin-signwithsecure' => 'Entrar com um servidor seguro',
 'securelogin-stick-https' => 'Permanecer conectado ao HTTPS após a autenticação',
 'yourdomainname' => 'Seu domínio:',
 'password-change-forbidden' => 'Você não pode alterar senhas nessa wiki.',
@@ -749,18 +775,37 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'logout' => 'Sair',
 'userlogout' => 'Sair',
 'notloggedin' => 'Não autenticado',
+'userlogin-noaccount' => 'Não possui uma conta?',
+'userlogin-joinproject' => 'Sobre {{SITENAME}}',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
 'createaccount' => 'Criar conta',
 'gotaccount' => "Já possui uma conta? '''$1'''.",
 'gotaccountlink' => 'Autenticar-se',
 'userlogin-resetlink' => 'Esqueceu-se do seu nome de usuário ou da senha?',
+'helplogin-url' => 'Help:Iniciar sessão',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda para iniciar sessão]]',
+'createacct-join' => 'Insira suas informações abaixo.',
+'createacct-emailrequired' => 'Endereço de e-mail',
+'createacct-emailoptional' => 'Endereço de e-mail (opcional)',
+'createacct-email-ph' => 'Confirme seu endereço de e-mail',
 'createaccountmail' => 'Usar uma senha aleatória e temporária que será enviada ao endereço de e-mail especificado a seguir',
+'createacct-realname' => 'Nome real (opcional)',
 'createaccountreason' => 'Razão:',
+'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-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' => 'contribuidores recentes',
 'badretype' => 'As senhas que você digitou não são iguais.',
 'userexists' => 'O nome de usuário fornecido já está em uso.
 Escolha um nome diferente.',
 'loginerror' => 'Erro de autenticação',
+'createacct-error' => 'Erro ao criar a conta',
 'createaccounterror' => 'Não foi possível criar a conta: $1',
 'nocookiesnew' => "A conta do usuário foi criada, mas você não foi autenticado.
 {{SITENAME}} utiliza ''cookies'' para autenticar os usuários.
@@ -845,13 +890,13 @@ Por favor aguarde antes de tentar novamente.',
 'resetpass-wrong-oldpass' => 'Senha temporária ou atual inválida.
 Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senha temporária.',
 'resetpass-temp-password' => 'Senha temporária:',
+'resetpass-abort-generic' => 'Uma extensão cancelou a alteração da senha.',
 
 # Special:PasswordReset
 'passwordreset' => 'Redefinir senha',
-'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta pelo e-mail.',
 'passwordreset-legend' => 'Reiniciar a senha',
 'passwordreset-disabled' => 'Redefinições de senha foram desabilitadas nesta wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
+'passwordreset-emaildisabled' => 'Os recursos de e-mail foram desativados nesta wiki.',
 'passwordreset-username' => 'Nome de usuário:',
 'passwordreset-domain' => 'Domínio:',
 'passwordreset-capture' => 'Ver o e-mail resultante?',
@@ -878,7 +923,7 @@ $2
 Senha temporária: $2',
 'passwordreset-emailsent' => 'Foi enviado um e-mail de lembrete.',
 'passwordreset-emailsent-capture' => 'Foi enviado um e-mail de lembrete, que é mostrado abaixo.',
-'passwordreset-emailerror-capture' => 'Foi gerado o lembrete de e-mail mostrado abaixo, contudo falhou o envio para o usuário: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Alterar o endereço de e-mail',
@@ -1092,12 +1137,15 @@ Ele não deu nenhuma explicação.",
 Ela parece ter sido eliminada.',
 'edit-conflict' => 'Conflito de edição.',
 'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
+'postedit-confirmation' => 'Sua edição foi salva',
 'edit-already-exists' => 'Não foi possível criar uma nova página.
 Ela já existia.',
 'defaultmessagetext' => 'Texto da mensagem padrão',
 'content-failed-to-parse' => 'Falha ao analisar o conteúdo $2 para o modelo $1: $3',
 'invalid-content-data' => 'Dados de conteúdo inválidos',
 'content-not-allowed-here' => 'Conteúdo do tipo "$1" não é permitido na página [[$2]]',
+'editwarning-warning' => 'Abandonar esta página pode fazer com que você perca todas as alterações que fez.
+Se você estiver autenticado, você pode desabilitar este aviso na seção "{{int:prefs-editing}}" de suas preferências.',
 
 # Content models
 'content-model-wikitext' => 'wikitexto',
@@ -1148,7 +1196,7 @@ A justificativa apresentada por $3 foi ''$2''",
 'revision-info' => 'Edição feita às $1 por $2',
 'previousrevision' => '← Edição anterior',
 'nextrevision' => 'Versão posterior →',
-'currentrevisionlink' => 'ver versão atual',
+'currentrevisionlink' => 'Revisão atual',
 'cur' => 'atu',
 'next' => 'prox',
 'last' => 'ult',
@@ -1381,15 +1429,7 @@ Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os cont
 'searchdisabled' => 'A busca em {{SITENAME}} se encontra desativada.
 Você poderá pesquisar através do Google enquanto isso.
 Note que os índices do sistema de busca externo poderão conter referências desatualizadas a {{SITENAME}}.',
-
-# Quickbar
-'qbsettings' => 'Configurações da Barra Rápida',
-'qbsettings-none' => 'Nenhuma',
-'qbsettings-fixedleft' => 'Fixo à esquerda',
-'qbsettings-fixedright' => 'Fixo à direita',
-'qbsettings-floatingleft' => 'Flutuando à esquerda',
-'qbsettings-floatingright' => 'Flutuando à direita',
-'qbsettings-directionality' => 'Fixado, dependendo da direcionalidade do seu alfabeto e da sua língua',
+'search-error' => 'Ocorreu um erro ao buscar por: $1',
 
 # Preferences page
 'preferences' => 'Preferências',
@@ -1533,6 +1573,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'userrights-notallowed' => 'A sua conta não tem permissão para adicionar ou remover privilégios a usuários.',
 'userrights-changeable-col' => 'Grupos que pode alterar',
 'userrights-unchangeable-col' => 'Grupos que não pode alterar',
+'userrights-conflict' => 'Há um comflito de permissões de usuário! Por favor, aplique as alterações novamente.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1958,7 +1999,6 @@ Para melhor segurança, o img_auth.php está desativado.',
 'http-read-error' => 'Erro de leitura HTTP.',
 'http-timed-out' => 'Esgotado o tempo de espera da requisição HTTP.',
 'http-curl-error' => 'Erro ao requisitar a URL: $1',
-'http-host-unreachable' => 'Não foi possível atingir a URL.',
 'http-bad-status' => 'Ocorreu um problema durante a requisição HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2368,8 +2408,8 @@ Futuras modificações em tal página e páginas de discussão relacionadas ser
 'notvisiblerev' => 'Edição eliminada',
 'watchnochange' => 'Nenhuma das páginas vigiadas foi editada no período exibido.',
 'watchlist-details' => '{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.',
-'wlheader-enotif' => 'A notificação por email encontra-se ativada.',
-'wlheader-showupdated' => "As páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
+'wlheader-enotif' => 'A notificação por email encontra-se ativada.',
+'wlheader-showupdated' => "As páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
 'watchmethod-recent' => 'verificando edições recentes para as páginas vigiadas',
 'watchmethod-list' => 'verificando páginas vigiadas para edições recentes',
 'watchlistcontains' => 'Sua lista de páginas vigiadas contém $1 {{PLURAL:$1|página|páginas}}.',
@@ -2579,7 +2619,7 @@ Em tais casos, deverá desselecionar ou reverter a ocultação da versão apagad
 'undeleteinvert' => 'Inverter seleção',
 'undeletecomment' => 'Motivo:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|edição restaurada|edições restauradas}}',
-'undeletedrevisions-files' => '$1 {{PLURAL:$2|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|arquivo restaurado|arquivos restaurados}}',
+'undeletedrevisions-files' => '$1 {{PLURAL:$1|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|arquivo restaurado|arquivos restaurados}}',
 'undeletedfiles' => '{{PLURAL:$1|arquivo restaurado|$1 arquivos restaurados}}',
 'cannotundelete' => 'Falha ao restaurar:
 $1',
@@ -2778,6 +2818,7 @@ Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloque
 'proxyblocksuccess' => 'Concluído.',
 'sorbsreason' => 'O seu endereço IP encontra-se listado como proxy aberto pela DNSBL utilizada por {{SITENAME}}.',
 'sorbs_create_account_reason' => 'O seu endereço de IP encontra-se listado como proxy aberto na DNSBL utilizada por {{SITENAME}}. Você não pode criar uma conta',
+'xffblockreason' => 'Um endereço IP presente no cabeçalho X-Forwarded-For, seu ou do servidor proxy que está usando, foi bloqueado. O motivo original do bloqueio foi: $1',
 'cant-block-while-blocked' => 'Você não pode bloquear outros usuários enquanto estiver bloqueado.',
 'cant-see-hidden-user' => 'O usuário que você está tentando bloquear já está bloqueado ou oculto. Como você não possui privilégio de ocultar usuários, você não pode ver ou editar o bloqueio desse usuário.',
 'ipbblocked' => 'Não é possível que você bloqueie ou desbloqueie outros usuários, já que você se encontra bloqueado',
@@ -3093,13 +3134,8 @@ Permite colocar uma justificativa no sumário da edição.',
 
 # Scripts
 'common.js' => '/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */',
-'standard.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Clássico */',
-'nostalgia.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Nostalgia */',
 'cologneblue.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Azul colonial */',
 'monobook.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin MonoBook */',
-'myskin.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin MySkin */',
-'chick.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Chique */',
-'simple.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Simples */',
 'modern.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Moderno */',
 'vector.js' => '/* Qualquer JavaScript aqui colocado afetará os usuários do skin Vector */',
 
@@ -3135,7 +3171,7 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'pageinfo-header-edits' => 'Histórico de edições',
 'pageinfo-header-restrictions' => 'Proteção da página',
 'pageinfo-header-properties' => 'Propriedades da página',
-'pageinfo-display-title' => 'Exibir título',
+'pageinfo-display-title' => 'Título exibido',
 'pageinfo-default-sort' => 'Chave de ordenação padrão',
 'pageinfo-length' => 'Tamanho da página (em bytes)',
 'pageinfo-article-id' => 'ID da página',
@@ -3175,13 +3211,8 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'pageinfo-category-files' => 'Número de arquivos',
 
 # Skin names
-'skinname-standard' => 'Clássico',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Azul colonial',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chique',
-'skinname-simple' => 'Simples',
 'skinname-modern' => 'Moderno',
 
 # Patrolling
@@ -3259,11 +3290,25 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
 'minutes' => '{{PLURAL:$1|um minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|uma hora|$1 horas}}',
 'days' => '{{PLURAL:$1|um dia|$1 dias}}',
+'weeks' => '{{PLURAL:$1|$1 semana|$1 semanas}}',
 'months' => '{{PLURAL:$1|$1 mês|$1 meses}}',
 'years' => '{{PLURAL:$1|$1 ano|$1 anos}}',
 'ago' => '$1 atrás',
 'just-now' => 'agora mesmo',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|hora|horas}} atrás',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minutos}} atrás',
+'seconds-ago' => '$1 {{PLURAL:$1|segundo|segundos}} atrás',
+'monday-at' => 'Segunda-feira às $1',
+'tuesday-at' => 'Terça-feira às $1',
+'wednesday-at' => 'Quarta-feira às $1',
+'thursday-at' => 'Quinta-feira às $1',
+'friday-at' => 'Sexta-feira às $1',
+'saturday-at' => 'Sábado às $1',
+'sunday-at' => 'Domingo às $1',
+'yesterday-at' => 'Ontem às $1',
+
 # Bad image list
 'bad_image_list' => 'O formato é o seguinte:
 
@@ -3293,7 +3338,7 @@ Por padrão, outros campos estarão ocultos.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largura',
 'exif-imagelength' => 'Altura',
 'exif-bitspersample' => 'Bits por componente',
@@ -3471,7 +3516,7 @@ Por padrão, outros campos estarão ocultos.
 'exif-originalimageheight' => 'Altura da imagem antes de ser cortada',
 'exif-originalimagewidth' => 'Largura da imagem antes de ser cortada',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sem compressão',
 'exif-compression-2' => 'CCITT Grupo 3 Codificação run length de Huffman modificado unidimensional',
 'exif-compression-3' => 'CCITT Grupo 3 codificação de fax',
@@ -3889,12 +3934,17 @@ Em conjunto com este programa deve ter recebido [{{SERVER}}{{SCRIPTPATH}}/COPYIN
 'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Diretório do arquivo',
-'filepath-page' => 'arquivo:',
-'filepath-submit' => 'Ir',
-'filepath-summary' => 'Esta página especial retorna o endereço completo de um arquivo.
-As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos serão abertos diretamente pelos programas associados.',
+# Special:Redirect
+'redirect' => 'Redirecionar por arquivo, usuário ou ID de revisão',
+'redirect-legend' => 'Redirecionar para um arquivo ou página',
+'redirect-summary' => 'Esta página especial redireciona a um arquivo (dado o nome do arquivo), a uma página (dado um ID de revisão) ou a uma página de usuário (dado o ID do usuário).',
+'redirect-submit' => 'Ir',
+'redirect-lookup' => 'Buscar',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID do usuário',
+'redirect-revision' => 'Revisão da página',
+'redirect-file' => 'Nome do arquivo',
+'redirect-not-exists' => 'Valor não encontrado',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Procurar por arquivos duplicados',
@@ -3984,6 +4034,9 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'htmlform-submit' => 'Enviar',
 'htmlform-reset' => 'Desfazer alterações',
 'htmlform-selectorother-other' => 'Outros',
+'htmlform-no' => 'Não',
+'htmlform-yes' => 'Sim',
+'htmlform-chosen-placeholder' => 'Selecione uma opção',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 com suporte de pesquisa de texto completo',
@@ -3993,14 +4046,14 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'logentry-delete-delete' => '$1 apagou a página $3',
 'logentry-delete-restore' => '$1 restaurou a página $3',
 'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|de $5 entradas}} do registro $3: $4',
-'logentry-delete-revision' => '$1 alterou a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} em $3: $4',
-'logentry-delete-event-legacy' => '$1 alterou a visibilidade de uma entrada em $3',
-'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de uma revisão em $3',
+'logentry-delete-revision' => '$1 alterou a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} na página $3: $4',
+'logentry-delete-event-legacy' => '$1 alterou a visibilidade de eventos de log em $3',
+'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de revisões na página $3',
 'logentry-suppress-delete' => '$1 suprimiu a página $3',
 'logentry-suppress-event' => '$1 alterou secretamente a visibilidade {{PLURAL:$5|de uma entrada|das $5 entradas}} em $3: $4',
 'logentry-suppress-revision' => '$1 alterou secretamente a visibilidade {{PLURAL:$5|de uma revisão|das $5 revisões}} em $3: $4',
 'logentry-suppress-event-legacy' => '$1 alterou secretamente a visibilidade das entradas em $3',
-'logentry-suppress-revision-legacy' => '$1 alterou secretamente a visibilidade das revisões em $3',
+'logentry-suppress-revision-legacy' => '$1 alterou secretamente a visibilidade de revisões na página $3',
 'revdelete-content-hid' => 'conteúdo oculto',
 'revdelete-summary-hid' => 'sumário de edição oculto',
 'revdelete-uname-hid' => 'nome de usuário oculto',
@@ -4015,14 +4068,14 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'logentry-move-move_redir-noredirect' => '$1 moveu a página $3 para $4 sem um redirecionamento',
 'logentry-patrol-patrol' => '$1 marcou a revisão $4 da página $3 como patrulhada',
 'logentry-patrol-patrol-auto' => '$1 marcou automaticamente a revisão $4 da página $3 como patrulhada',
-'logentry-newusers-newusers' => 'A conta de usuário $1 foi criada',
+'logentry-newusers-newusers' => 'A conta de usuário $1 foi {{GENDER:$2|criada}}',
 'logentry-newusers-create' => 'A conta de usuário $1 foi criada',
 'logentry-newusers-create2' => 'A conta de usuário $3 foi criada por $1',
 'logentry-newusers-byemail' => 'A conta de usuário $3 foi criada por $1, com a senha sendo enviada por e-mail',
-'logentry-newusers-autocreate' => 'A conta $1 foi criada automaticamente',
+'logentry-newusers-autocreate' => 'A conta de usuário $1 foi criada automaticamente',
 '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 a $5',
+'logentry-rights-autopromote' => '$1 foi promovido automaticamente de $4 para $5',
 'rightsnone' => '(nenhum)',
 
 # Feedback
@@ -4098,4 +4151,7 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milênio|milênios}}',
 
+# Image rotation
+'rotate-comment' => 'Imagem girada por $1 {{PLURAL:$1|grau|graus}} no sentido horário',
+
 );
index c21bb29..bec6bad 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author *Surak*
+ * @author 127.0.0.1
  * @author Abanima
  * @author Ahonc
  * @author Aleator
@@ -79,6 +80,7 @@
  * @author Mido
  * @author Mihai
  * @author Minh Nguyen
+ * @author Moha
  * @author Mormegil
  * @author Mpradeep
  * @author Murma174
  * @author Yyy
  * @author Žekřil71pl
  * @author פוילישער
+ * @author គីមស៊្រុន
  * @author 아라
  */
 
@@ -185,8 +188,6 @@ Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwa
 'tog-shownumberswatching' => 'Toggle option used in [[Special:Preferences]], in the section for recent changes. When this option is activated, the entries in recent changes includes the number of users who watch pages. {{Gender}}',
 'tog-oldsig' => 'Used in [[Special:Preferences]], tab User profile. {{Gender}}',
 'tog-fancysig' => 'In user preferences under the signature box.  {{Gender}}',
-'tog-externaleditor' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external editor by default. {{Gender}}",
-'tog-externaldiff' => "[[Special:Preferences]], tab 'Edit'. Offers user to use an external diff program by default. {{Gender}}",
 'tog-showjumplinks' => 'Toggle option used in [[Special:Preferences]]. The "jump to" part should be the same with {{msg-mw|jumpto}} (or you can use <nowiki>{{int:jumpto}}</nowiki>). These links are shown in some of the older skins as "jump to: navigation, search" but they are hidden by default (you can enable them with this option). {{Gender}}',
 'tog-uselivepreview' => 'Toggle option used in [[Special:Preferences]]. Live preview is an experimental feature (unavailable by default) to use edit preview without loading the page again. {{Gender}}',
 'tog-forceeditsummary' => "Toggle option used in [[Special:Preferences]] to force an edit ''{{msg-mw|summary}}''. {{Gender}}",
@@ -204,6 +205,7 @@ Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwa
 ''(the message is considered optional because it is only used in wikis with language variants)''",
 'tog-norollbackdiff' => "Option in [[Special:Preferences]], 'Misc' tab. Only shown for users with the rollback right. By default a diff is shown below the return screen of a rollback. Checking this preference toggle will suppress that. {{Gender}}
 {{Identical|Rollback}}",
+'tog-useeditwarning' => 'Used as label for the checkbox in [[Special:Preferences#mw-prefsection-editing|Special:Preferences]].',
 
 'underline-always' => 'Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].
 
@@ -308,6 +310,18 @@ This option means "underline links as in your user skin or your browser", there
 'oct' => 'Abbreviation of October, the tenth month of the Gregorian calendar',
 'nov' => 'Abbreviation of November, the eleventh month of the Gregorian calendar',
 'dec' => 'Abbreviation of December, the twelfth month of the Gregorian calendar',
+'january-date' => 'A date in the Gregorian month of January. $1 is the numerical date, for example "23".',
+'february-date' => 'A date in the Gregorian month of February. $1 is the numerical date, for example "23".',
+'march-date' => 'A date in the Gregorian month of March. $1 is the numerical date, for example "23".',
+'april-date' => 'A date in the Gregorian month of April. $1 is the numerical date, for example "23".',
+'may-date' => 'A date in the Gregorian month of May. $1 is the numerical date, for example "23". The month name is not abbreviated.',
+'june-date' => 'A date in the Gregorian month of June. $1 is the numerical date, for example "23".',
+'july-date' => 'A date in the Gregorian month of July. $1 is the numerical date, for example "23".',
+'august-date' => 'A date in the Gregorian month of August. $1 is the numerical date, for example "23".',
+'september-date' => 'A date in the Gregorian month of September. $1 is the numerical date, for example "23".',
+'october-date' => 'A date in the Gregorian month of October. $1 is the numerical date, for example "23".',
+'november-date' => 'A date in the Gregorian month of November. $1 is the numerical date, for example "23".',
+'december-date' => 'A date in the Gregorian month of December. $1 is the numerical date, for example "23".',
 
 # Categories related messages
 'pagecategories' => 'Used in the categories section of pages. Is followed by a colon and a list of categories.',
@@ -384,7 +398,8 @@ Used as link title in your personal toolbox.
 See also:
 * {{msg-mw|Mytalk}}
 * {{msg-mw|Accesskey-pt-mytalk}}
-* {{msg-mw|Tooltip-pt-mytalk}}',
+* {{msg-mw|Tooltip-pt-mytalk}}
+{{Identical|Talk}}',
 'anontalk' => 'Link to the talk page appearing in [[mw:Help:Navigation#User_Links|user links]] for each anonymous users when [[mw:Manual:$wgShowIPinHeader|$wgShowIPinHeader]] is true.
 
 See also:
@@ -458,9 +473,8 @@ See also:
 * {{msg-mw|Accesskey-n-help}}
 * {{msg-mw|Tooltip-n-help}}
 {{Identical|Help}}',
-'search' => 'Noun. Text of menu section shown on every page of the wiki above the search form.
-
-Also used as title of [[Special:Search]] page in [[Special:SpecialPages]].
+'search' => '{{doc-special|Search}}
+Noun. Text of menu section shown on every page of the wiki above the search form.
 
 See also:
 * {{msg-mw|Search}}
@@ -509,8 +523,8 @@ See also:
 'create' => 'The text on the tab of the edit form on unexisting pages starts editing them.
 
 {{Identical|Create}}',
-'editthispage' => 'This is the "edit" link as used in the skins Classic/Standard, Cologne Blue and Nostalgia. See {{msg|create-this-page}} for when the page does not exist.',
-'create-this-page' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the text for the link leading to the edit form on pages that have not yet been created. See {{msg-mw|editthispage}} for when the page already exists.
+'editthispage' => 'This is the "edit" link as used in the Cologne Blue skin, at the bottom of the page. See {{msg|create-this-page}} for when the page does not exist.',
+'create-this-page' => 'In the Cologne Blue skin this is the text for the link leading to the edit form on pages that have not yet been created, at the bottom of the page. See {{msg-mw|editthispage}} for when the page already exists.
 {{Identical|Createpage}}',
 'delete' => 'Name of the Delete tab shown for admins. Should be in the infinitive mood.
 
@@ -519,7 +533,8 @@ See also:
 * {{msg-mw|Accesskey-ca-delete}}
 * {{msg-mw|Tooltip-ca-delete}}
 {{Identical|Delete}}',
-'deletethispage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the text for link to delete the page in admin view.
+'undeletethispage' => 'In the Cologne Blue skin this is the text for link to undelete the page in admin view, at the bottom of the page.',
+'deletethispage' => 'In the Cologne Blue skin this is the text for link to delete the page in admin view, at the bottom of the page.
 {{Identical|Delete this page}}',
 'undelete_short' => "It is tab label. It's really can be named ''nstab-undelete''.",
 'viewdeleted_short' => 'Tab label for the undelete button when the user has permission to view the deleted history but not undelete.',
@@ -532,7 +547,7 @@ See also:
 {{Identical|Protect}}',
 'protect_change' => 'Text on links for each entry in [[Special:ProtectedPages]] to change the protection of pages (only displayed to admins).
 {{Identical|Change}}',
-'protectthispage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the text for link to protect the page in admin view.
+'protectthispage' => 'In this Cologne Blue skin this is the text for link to protect the page in admin view, at the bottom of the page.
 {{Identical|Protect this page}}',
 'unprotect' => 'Name of unprotect tab displayed for admins
 
@@ -541,16 +556,19 @@ See also:
 * {{msg-mw|Accesskey-ca-unprotect}}
 * {{msg-mw|Tooltip-ca-unprotect}}
 {{Identical|Unprotect}}',
-'unprotectthispage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the anchor text for the link to unprotect the page in admin view.
+'unprotectthispage' => 'In this Cologne Blue skin this is the anchor text for the link to unprotect the page in admin view, at the bottom of the page.
 {{Identical|Unprotect this page}}',
 'newpage' => '{{Identical|New page}}',
-'talkpage' => 'In the skins Classic/Standard, Cologne Blue and Nostalgia this is the text for link to discuss the page.',
+'talkpage' => 'In the Cologne Blue skin this is the text for link to discuss the page, at the bottom of the page.',
 'talkpagelinktext' => 'Used as name of links going to talk page in some places, like in [[Special:RecentChanges]], [[Special:Allmessages]], [[Special:Logs]], and [[Special:Watchlist/edit]].
 
 {{Identical|Talk}}',
 'specialpage' => '{{Identical|Special page}}',
 'personaltools' => 'Heading for a group of links to your user page, talk page, preferences, watchlist, and contributions. This heading is visible in the sidebar in some skins. For an example, see [{{canonicalurl:Main_Page|useskin=simple}} Main Page using simple skin].',
-'articlepage' => "'Content page' is used for NS_MAIN and any other non-standard namespace and this message is only used in skins Nostalgia, Cologneblue and Standard in the bottomLinks part.
+'postcomment' => 'Used as link text.
+
+The link points to the talk page and has the parameters "action=edit&section=new".',
+'articlepage' => "'Content page' is used for NS_MAIN and any other non-standard namespaces. Only used in the Cologne Blue skin in the bottomLinks part.
 
 {{Identical|Content page}}",
 'talk' => 'Used as display name for the tab to all {{msg-mw|Talk}} pages. These pages accompany all content pages and can be used for discussing the content page. Example: [[Talk:Example]].
@@ -607,7 +625,8 @@ For explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
 'pool-queuefull' => 'Part of {{msg-mw|view-pool-error}}
 
 "Pool" refers to a pool of processes.',
-'pool-errorunknown' => 'Part of {{msg-mw|view-pool-error}}.',
+'pool-errorunknown' => 'Part of {{msg-mw|view-pool-error}}.
+{{Identical|Unknown error}}',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'Used as the label of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. The link target is {{msg-mw|aboutpage}}.
@@ -633,7 +652,8 @@ See also:
 * {{msg-mw|Tooltip-n-currentevents}}',
 'currentevents-url' => "Target page of ''CurrentEvents'' in the sidebar. See also {{msg-mw|currentevents}}.
 {{doc-important|Do not translate the \"<tt>Project:</tt>\" part.}}",
-'disclaimers' => 'Used as display name for the link to [[{{MediaWiki:Disclaimerpage}}]] shown at the bottom of every page on the wiki. Example [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].',
+'disclaimers' => 'Used as display name for the link to [[{{MediaWiki:Disclaimerpage}}]] shown at the bottom of every page on the wiki. Example [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].
+{{Identical|Disclaimer}}',
 'disclaimerpage' => 'Used as page for that contains the site disclaimer. Used at the bottom of every page on the wiki. Example: [[{{MediaWiki:Disclaimerpage}}|{{MediaWiki:Disclaimers}}]].
 {{doc-important|Do not change the "<tt>Project:</tt>" part.}}',
 'edithelp' => 'This is the text that appears on the editing help link that is near the bottom of the editing page',
@@ -815,7 +835,7 @@ See also:
 * {{msg-mw|Accesskey-ca-nstab-main}}
 * {{msg-mw|Tooltip-ca-nstab-main}}
 {{Identical|Page}}',
-'nstab-user' => 'The name for the tab of the user namespace. Example: [[User:Example]]. It is possible to use <nowiki>{{GENDER:{{BASEPAGENAME}}|male form|female form}}</nowiki> if needed.
+'nstab-user' => 'The name for the tab of the user namespace. Example: [[User:Example]]. It is possible to use <nowiki>{{GENDER:{{ROOTPAGENAME}}|male form|female form}}</nowiki> if needed.
 
 See also:
 * {{msg-mw|Nstab-user}}
@@ -1038,18 +1058,50 @@ Parameters:
 'yourname' => "{{doc-important|<nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.}}
 In user preferences.
 {{Identical|Username}}",
+'userlogin-yourname' => 'In new vertical user login & create account forms, label for username field.
+
+See examples: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Username}}',
+'userlogin-yourname-ph' => 'Placeholder text in new userlogin/create account form field.
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 'yourpassword' => 'In user preferences
 
 {{Identical|Password}}',
+'userlogin-yourpassword' => 'In new vertical user login & create account forms, label for password field.
+
+See examples: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Password}}',
+'userlogin-yourpassword-ph' => 'Placeholder text in new userlogin form for password field.
+
+See examples: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1] and [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Enter password}}',
+'createacct-yourpassword-ph' => 'Placeholder text in new create account form for password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Enter password}}',
 'yourpasswordagain' => 'In user preferences',
+'createacct-yourpasswordagain' => 'In new create account form, label for field to re-enter password
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Confirm password}}',
+'createacct-yourpasswordagain-ph' => 'Placeholder text in new create account form for re-enter password field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 'remembermypassword' => 'A check box in [[Special:UserLogin]]
 
 {{Identical|Remember my login on this computer}}',
+'userlogin-remembermypassword' => 'The text for a check box in the new-style [[Special:UserLogin]].
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]',
+'userlogin-signwithsecure' => 'Text of link to HTTPS login form.
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]',
 'securelogin-stick-https' => 'Used as label for checkbox.',
 'yourdomainname' => 'Used as label for listbox.',
 'password-change-forbidden' => 'Error message shown when an external authentication source does not allow the password to be changed.',
 'externaldberror' => 'This message is thrown when a valid attempt to change the wiki password for a user fails because of a database error or an error from an external system.',
-'login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there).
+'login' => "Shown as the caption of the button at [[Special:UserLogin]], and also to anonymous users in the upper right corner of the page when they can't create an account (otherwise the message {{msg-mw|nav-login-createaccount}} is shown there). Also the title of the new login special page, which does not combine Log in & Create account.
 
 See also:
 * {{msg-mw|Login}}
@@ -1072,29 +1124,110 @@ See also:
 * {{msg-mw|Tooltip-pt-logout}}
 {{Identical|Log out}}',
 'userlogout' => '{{Doc-actionlink}}
+{{doc-special|UserLogout|unlisted=1}}
 {{Identical|Log out}}',
 'notloggedin' => 'This message is displayed in the standard skin when not logged in. The message is placed above the login link in the top right corner of pages.
 
 {{Identical|Not logged in}}',
+'userlogin-noaccount' => 'In the new-style [[Special:Userlogin]] form, this is the text prior to button inviting user to join project.
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]
+{{Identical|Do not have an account}}',
+'userlogin-joinproject' => 'Text of button inviting user to create an account.
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]',
 'nologin' => 'A message shown in the log in form. Parameters:
-* $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}',
+* $1 - a link to the account creation form, and the text of it is {{msg-mw|Nologinlink}}
+{{Identical|Do not have an account}}',
 'nologinlink' => 'Text of the link to the account creation form. Before that link, the message {{msg-mw|Nologin}} appears.
 {{Identical|Create an account}}',
-'createaccount' => 'The title of [[Special:CreateAccount]], where users can register a new account. Used on [[Special:SpecialPages]] and on the submit button in the form where you register a new account.
+'createaccount' => 'Used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
 
-It is also used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
+It is also used on the submit button in the form/special page where you register a new account.
+{{doc-special|CreateAccount}}
 {{Identical|Create account}}',
 'gotaccount' => 'A message shown in the account creation form.
 * $1 - a link to the log in form, and the text of it is {{msg-mw|Gotaccountlink}}',
 'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message {{msg-mw|Gotaccount}} appears.
 {{Identical|Log in}}',
 'userlogin-resetlink' => 'Used on the login page.',
-'createaccountmail' => 'Button text for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.',
+'userlogin-resetpassword-link' => 'Used as link text on new vertical-layout create account form.
+
+The link points to [[Special:PasswordReset]].
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]
+
+userlogin-resetpassword-link may have to be shorter than the old {{msg-mw|userlogin-resetlink}}',
+'helplogin-url' => '{{doc-important|Do not translate the namespace name <code>Help</code>.}}
+Used as name of the page that provides information about logging into the wiki.
+
+Used as a link target in the message {{msg-mw|Userlogin-helplink}}.',
+'userlogin-helplink' => '{{doc-important|Do not change <code><nowiki>{{MediaWiki:helplogin-url}}</nowiki></code>.}}
+Wikitext linking to login help.
+
+See example: [{{canonicalurl:Special:UserLogin|useNew=1}} Special:UserLogin?useNew=1]
+
+See also:
+* {{msg-mw|Helplogin-url}}',
+'createacct-join' => 'Subheading of vertical-layout create account form encouraging user to join the wiki.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-emailrequired' => 'Label in vertical-layout create account form for email field when it is required.
+
+See also:
+* {{msg-mw|Createacct-emailoptional}}
+{{Identical|E-mail address}}',
+'createacct-emailoptional' => 'Label in vertical-layout create account form for email field when it is optional.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+
+See also:
+* {{msg-mw|Createacct-emailrequired}}',
+'createacct-email-ph' => 'Placeholder in vertical-layout create account form for email field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createaccountmail' => 'Used as label for the checkbox for creating a new account and sending the new password to the specified e-mail address directly, as used on [[Special:UserLogin/signup]] if creating accounts by e-mail is allowed.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-realname' => 'In vertical-layout create account form, label for field to enter optional real name.',
 'createaccountreason' => '{{Identical|Reason}}',
+'createacct-reason' => 'In vertical-layout create account form, label for field to enter reason to create an account when already logged-in.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Reason}}',
+'createacct-reason-ph' => 'Placeholder in vertical-layout create account form for reason field.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-captcha' => 'Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.',
+'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.
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'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&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
+'createacct-benefit-body1' => 'In vertical-layout create account form, the text for the first benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head1}} (number of edits).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Edit}}',
+'createacct-benefit-body2' => 'In vertical-layout create account form, the text for the second benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head2}} (number of pages).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]
+{{Identical|Page}}',
+'createacct-benefit-body3' => 'In vertical-layout create account form, the text for the third benefit.
+
+Preceded by the message {{msg-mw|Createacct-benefit-head3}} (number of contributors).
+
+See example: [{{canonicalurl:Special:UserLogin|type=signup&useNew=1}} Special:UserLogin?type=signup&useNew=1]',
 'badretype' => 'Used as error message when the new password and its retype do not match.',
 'userexists' => 'Used as error message in creating a user account.',
 'loginerror' => 'Used as title of error message.
 {{Identical|Login error}}',
+'createacct-error' => 'Used as heading for the error message.',
 'createaccounterror' => 'Parameters:
 * $1 is an error message',
 'nocookiesnew' => "This message is displayed when a new account was successfully created, but the browser doesn't accept cookies.",
@@ -1116,8 +1249,10 @@ Parameters:
 'nosuchusershort' => "Displayed when trying to log in with a non-existant username. This message is only shown when you can't create an account, otherwise the message {{msg-mw|nosuchusershort}} is displayed.",
 'nouserspecified' => 'Used as error message when username to fetch is not specified.',
 'login-userblocked' => 'This message supports GENDER, username is available in $1.',
-'wrongpassword' => 'Used as error message when the provided password is wrong.',
-'wrongpasswordempty' => 'Error message displayed when entering a blank password',
+'wrongpassword' => 'Used as error message when the provided password is wrong.
+{{Identical|Please try again}}',
+'wrongpasswordempty' => 'Error message displayed when entering a blank password.
+{{Identical|Please try again}}',
 'passwordtooshort' => 'This message is shown at
 
 * [[Special:Preferences]]
@@ -1138,7 +1273,7 @@ $1 is the minimum number of characters in the password.',
 
 Parameters:
 * $1 is a user name. This parameter can be used with GENDER.',
-'noemailcreate' => 'Error message.',
+'noemailcreate' => 'Used as error message when one user creates an account for another and there is no email.',
 'passwordsent' => '* $1 - username',
 'blocked-mailpassword' => 'Used as error message in password recovery.',
 'eauthentsent' => "This message appears after entering an e-mail address in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}, then clicking on '{{int:saveprefs}}'.",
@@ -1211,16 +1346,18 @@ See also:
 {{Identical|Cancel}}',
 'resetpass-wrong-oldpass' => 'Error message shown on [[Special:ChangePassword]] when the old password is not valid.',
 'resetpass-temp-password' => 'The label of the input box for the temporary password (received by e-mail) on the form displayed after logging in with a temporary password.',
+'resetpass-abort-generic' => 'Generic error message shown on [[Special:ChangePassword]] when an extension aborts a password change from a hook.',
 
 # Special:PasswordReset
 'passwordreset' => 'Title of [[Special:PasswordReset]].
 {{Identical|Reset password}}',
-'passwordreset-text' => 'Text on [[Special:PasswordReset]]',
+'passwordreset-text-one' => 'Text on [[Special:PasswordReset]] that appears when there is only one way of resetting the password.',
+'passwordreset-text-many' => 'Text on [[Special:PasswordReset]] that appears when there are multiple ways of resetting the password.
+
+* $1 is the number of password reset routes.',
 'passwordreset-legend' => '{{Identical|Reset password}}',
 'passwordreset-disabled' => 'Used as error message in changing password.',
-'passwordreset-pretext' => 'These instructions are shown on the password reset dialogue, which can, in principle, take the user\'s email address as well as, or instead of, their username. This text displays above one or more fields, at least one of which needs to be completed, and the message does not know which routes are available, so it needs to refer to some vague noun rather than specifically "username".
-"One of the pieces of data" means "an info"/"a datum" (probably to be translatea with a singular noun in your language if available). Parameters:
-* $1 is the number of password reset routes. This is never 1, but always two or more. Thus, the first plural option is empty in English.',
+'passwordreset-emaildisabled' => "Used as error message in changing password when site's email feature is disabled.",
 'passwordreset-username' => '{{Identical|Username}}',
 'passwordreset-domain' => 'A domain like used in Domain Name System (DNS) or more specifically like a domain component in the Lightweight Directory Access Protocol (LDAP)',
 'passwordreset-capture' => 'Label for checkbox asking the user whether they want to see the contents of the password reset email (only shown if they have the <tt>passwordreset</tt> permission',
@@ -1254,8 +1391,9 @@ See also:
 See also:
 * {{msg-mw|Passwordreset-emailsent}}
 * {{msg-mw|Passwordreset-emailerror-capture}}',
-'passwordreset-emailerror-capture' => 'Error message displayed in [[Special:PasswordReset]] when sending an e-mail fails. Parameters:
-* $1 - the name of a user who was supposed to get the e-mail
+'passwordreset-emailerror-capture' => 'Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:
+* $1 - error message
+* $2 - username, used for GENDER
 See also:
 * {{msg-mw|Passwordreset-emailsent}}
 * {{msg-mw|Passwordreset-emailsent-capture}}',
@@ -1342,7 +1480,8 @@ See also:
 See also:
 * {{msg-mw|Savearticle}}
 * {{msg-mw|Accesskey-save}}
-* {{msg-mw|Tooltip-save}}',
+* {{msg-mw|Tooltip-save}}
+{{Identical|Save page}}',
 'preview' => 'The title of the Preview page shown after clicking the "Show preview" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.
 
 {{Identical|Preview}}',
@@ -1576,6 +1715,7 @@ See also:
 * {{msg-mw|edit-gone-missing}}
 * {{msg-mw|edit-conflict}}
 * {{msg-mw|edit-already-exists}}',
+'postedit-confirmation' => 'Confirmation message that is displayed upon successful edit. Parameter $1 is the current user, for GENDER support.',
 'edit-already-exists' => 'Used as error message.
 
 See also:
@@ -1592,6 +1732,9 @@ See also:
 'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
 * $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
 * $2 - the title of the page in question',
+'editwarning-warning' => "{{doc-important|Do ''not'' use <nowiki>{{int:prefs-editing}}</nowiki> for \"Editing\". It is forbidden in this message, see [[mwr:68405]].}}
+
+but you can see the text of that button here: {{msg-mw|Prefs-editing}}",
 
 # Content models
 'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
@@ -1755,7 +1898,8 @@ Used in History and [[Special:Contributions]].',
 It is followed by the message {{msg-mw|Viewprevnext}}.',
 'histlast' => 'This is part of the navigation message on the top and bottom of Page History pages which are lists of things in date order, e.g. [{{canonicalurl:Support|action=history}} Page History of Support].
 
-It is followed by the message {{msg-mw|Viewprevnext}}.',
+It is followed by the message {{msg-mw|Viewprevnext}}.
+{{Identical|Latest}}',
 'historysize' => '* $1 - byte count',
 'historyempty' => 'Text in page history for empty page revisions
 
@@ -1805,7 +1949,8 @@ See [{{canonicalurl:x|feed=atom&action=history}} example].',
 'rev-showdeleted' => 'Link in page history for oversight (see also {{msg-mw|rev-delundel}})
 {{Identical|Show}}',
 'revisiondelete' => '{{RevisionDelete}}
-It is the page title of [[Special:RevisionDelete]].',
+
+{{doc-special|RevisionDelete|unlisted=1}}',
 'revdelete-nooldid-title' => '{{RevisionDelete}}',
 'revdelete-nooldid-text' => '{{RevisionDelete}}',
 'revdelete-nologtype-title' => 'See also:
@@ -1999,6 +2144,7 @@ Title of the suppression log. Shown in the drop down menu at [[Special:log]] and
 'suppressionlogtext' => 'Description text of the suppression log. Shown at top of [[Special:log/suppress]].',
 
 # History merging
+'mergehistory' => '{{doc-special|MergeHistory}}',
 'mergehistory-header' => 'Used as header for Merge form in [[Special:MergeHistory]].
 
 See also:
@@ -2101,6 +2247,7 @@ A revision row in the merge history page. Parameters:
 
 # Merge log
 'mergelog' => '{{doc-logpage}}
+
 This is the name of a log of merge actions done on [[Special:MergeHistory]]. This special page and this log is not enabled by default.',
 'pagemerge-logentry' => "This log message is used in a merge log entry.
 
@@ -2217,7 +2364,8 @@ See also:
 
 See also:
 * {{msg-mw|Searchprofile-images|message}}
-* {{msg-mw|Searchprofile-images-tooltip|tooltip}}',
+* {{msg-mw|Searchprofile-images-tooltip|tooltip}}
+{{Identical|Muitimedia}}',
 'searchprofile-everything' => 'Used as an option in [[Special:Search]].
 
 See also:
@@ -2313,15 +2461,8 @@ See also:
 In this sentence, "their indexes" refers to "Google\'s indexes".
 
 Shown on [[Special:Search]] when the internal search is disabled.',
-
-# Quickbar
-'qbsettings' => 'The title of the section in [[Special:Preferences]], only shown when using the skins "Standard/Classic" or "Cologne Blue". The quicbar is the same as the sidebar.',
-'qbsettings-none' => '{{Identical|None}}',
-'qbsettings-fixedleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-fixedright' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-floatingleft' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-floatingright' => 'Position of the quickbar (sidebar). Used in the preferences.',
-'qbsettings-directionality' => '"Fixed", as in the position "fixed left or right". For left-to-right languages, the quickbar will be positioned at the left, for right-to-left languages at the right.',
+'search-error' => 'Shown when an error has occurred when performing a search
+* $1 is the localized error that was returned',
 
 # Preferences page
 'preferences' => 'Title of the [[Special:Preferences]] page.
@@ -2391,7 +2532,8 @@ See also:
 'resetprefs' => 'Button for resetting changes in the preferences page.',
 'restoreprefs' => 'Used in [[Special:Preferences]]',
 'prefs-editing' => 'Title of a tab in [[Special:Preferences]].
-When changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.',
+When changing this message, please also update {{msg-mw|vector-editwarning-warning}} which references to this message.
+{{Identical|Editing}}',
 'prefs-edit-boxsize' => 'Used on [[Special:Preferences]].',
 'rows' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset',
 'columns' => 'Used on [[Special:Preferences]], "Editing" section in the "Size of editing window" fieldset',
@@ -2400,7 +2542,8 @@ When changing this message, please also update {{msg-mw|vector-editwarning-warni
 {{Identical|Search}}',
 'resultsperpage' => "Option on the 'Search options' tab of [[Special:Preferences]]",
 'stub-threshold' => 'Used in [[Special:Preferences]], tab "Misc".',
-'stub-threshold-disabled' => 'Used in [[Special:Preferences]].',
+'stub-threshold-disabled' => 'Used in [[Special:Preferences]].
+{{Identical|Disabled}}',
 'recentchangesdays' => 'Used in [[Special:Preferences]], tab "Recent changes".',
 'recentchangesdays-max' => 'Shown as hint in [[Special:Preferences]], tab "Recent changes"',
 'recentchangescount' => 'Used in [[Special:Preferences]], tab "Recent changes".',
@@ -2429,7 +2572,8 @@ This option lets your time zone setting use the one that is used on the wiki (of
 'timezoneregion-atlantic' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.
 {{Related|Timezoneregion}}',
 'timezoneregion-australia' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.
-{{Related|Timezoneregion}}',
+{{Related|Timezoneregion}}
+{{Identical|Australia}}',
 'timezoneregion-europe' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.
 {{Related|Timezoneregion}}',
 'timezoneregion-indian' => 'Used in "Time zone" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], "date and time" tab.
@@ -2451,6 +2595,8 @@ This option lets your time zone setting use the one that is used on the wiki (of
 'prefs-emailconfirm-label' => 'Sub-heading in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.',
 'prefs-textboxsize' => "Header for the box specifying the size of the editing window, displayed on the 'editing' tab of the [[Special:Preferences|user preferences]] special page.",
 'youremail' => 'Label of the e-mail text box of the "E-mail options" section of [[Special:Preferences]].
+Also used on create account form.
+
 {{Identical|E-mail}}',
 'username' => 'Username field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).
 
@@ -2598,6 +2744,7 @@ Parameters:
 Parameters:
 * $1 - optional, for PLURAL use, the number of items in the column following the message. Avoid PLURAL, if your language allows that.',
 'userrights-irreversible-marker' => '{{optional}}',
+'userrights-conflict' => "Shown on [[Special:UserRights]] if the target's rights have been changed since the form was loaded.",
 
 # Groups
 'group' => '{{Identical|Group}}',
@@ -2687,7 +2834,8 @@ If you are in that group, you have (by default) the '''right \"autoconfirmed\"''
 If someone with this right (bots by default) edits a user talk page and marks it as minor (requires {{msg-mw|right-minoredit}}), the user will not get a notification "You have new messages".',
 'right-apihighlimits' => '{{doc-right|apihighlimits}}',
 'right-writeapi' => '{{doc-right|writeapi}}',
-'right-delete' => '{{doc-right|delete}}',
+'right-delete' => '{{doc-right|delete}}
+{{Identical|Delete page}}',
 'right-bigdelete' => '{{doc-right|bigdelete}}',
 'right-deletelogentry' => '{{doc-right|deletelogentry}}
 This user right is part of the [[mw:RevisionDelete|RevisionDelete]] feature.
@@ -2779,6 +2927,7 @@ Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newuse
 
 # User rights log
 'rightslog' => '{{doc-logpage}}
+
 In [[Special:Log]]',
 'rightslogtext' => 'Text in [[Special:Log/rights]].',
 
@@ -2913,15 +3062,25 @@ Does not work under $wgMiserMode ([[mwr:48986|r48986]]).',
 'rc-old-title' => 'Text that shows the original title of a page, $1 is the original title text',
 
 # Recent changes linked
-'recentchangeslinked' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].
-
+'recentchangeslinked' => '{{doc-special|RecentChangesLinked}}
 See also:
 * {{msg-mw|Recentchangeslinked}}
 * {{msg-mw|Accesskey-t-recentchangeslinked}}
 * {{msg-mw|Tooltip-t-recentchangeslinked}}',
-'recentchangeslinked-feed' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
-'recentchangeslinked-toolbox' => 'Title of [[Special:RecentChangesLinked]] and display name of page on [[Special:SpecialPages]].',
-'recentchangeslinked-title' => 'Message used as title and page header on [[Special:RecentChangesLinked]] (needs an argument like "/Main Page"). Related changes are all recent change to pages that are linked from \'\'this page\'\'. "$1" is the name of the page for which related changes are shown.',
+'recentchangeslinked-feed' => 'Used in the feed object.
+
+This message follows the message {{msg-mw|Recentchangeslinked-title}}.',
+'recentchangeslinked-toolbox' => 'Used as link text, and also used as link text in the common toolbox.
+
+These links point to [[Special:RecentChangesLinked]].',
+'recentchangeslinked-title' => "Message used as title and page header on [[Special:RecentChangesLinked]] (needs an argument like \"/Main Page\").
+
+Related changes are all recent change to pages that are linked from ''this page''.
+
+This message is followed by {{msg-mw|Recentchangeslinked-feed}}.
+
+Parameters:
+* \$1 - the name of the page for which related changes are shown",
 'recentchangeslinked-noresult' => 'Used in [[Special:RecentChangesLinked]], when there are no changes.',
 'recentchangeslinked-summary' => 'Summary of [[Special:RecentChangesLinked]].',
 'recentchangeslinked-page' => '{{Identical|Page name}}',
@@ -2974,6 +3133,7 @@ Text displayed when uploading a file using [[Special:Upload]].",
 'upload-preferred' => 'Used in [[Special:Upload]].',
 'upload-prohibited' => 'Used in [[Special:Upload]].',
 'uploadlogpage' => '{{doc-logpage}}
+
 Page title of [[Special:Log/upload]].',
 'uploadlogpagetext' => 'Appears on top of [[Special:Log/upload]].',
 'filename' => '{{Identical|Filename}}',
@@ -3005,6 +3165,7 @@ See also:
 * {{msg-mw|upload-tryagain|Submit button text}}
 * {{msg-mw|reuploaddesc|button text}}',
 'ignorewarnings' => 'In [[Special:Upload]]',
+'minlength1' => 'Used as error message in [[Special:Upload]].',
 'illegalfilename' => '* $1 - filename',
 'filename-toolong' => 'Error message when uploading a file with a filename longer than the hard-coded limit of 240 bytes. This limit will never change and is hard-coded in the message.
 
@@ -3556,12 +3717,6 @@ See also:
 Known messages are:
 * {{msg-mw|http-host-unreachable}}
 * {{msg-mw|http-timed-out}}',
-'http-host-unreachable' => 'Used as error message when executing HTTP request.
-
-See also:
-* {{msg-mw|Http-request-error}}
-* {{msg-mw|Http-read-error}}
-* {{msg-mw|Http-timed-out|28}}',
 'http-bad-status' => 'Parameters:
 * $1 - an HTTP error code (e.g. 404)
 * $2 - the HTTP error message (e.g. File Not Found)',
@@ -3756,13 +3911,15 @@ $1 is the name of the shared repository. On wikimedia sites, $1 is {{msg-mw|shar
 * $3 is a hour
 * $4 is an URL and must follow square bracket: [$4
 {{Identical|Revert}}',
+'filerevert-badversion' => 'Used as error message.',
 
 # File deletion
 'filedelete' => 'Used as page title. Parameters:
 * $1 - file title
 See also:
 * {{msg-mw|Filedelete-intro}}',
-'filedelete-legend' => '{{Identical|Delete}}',
+'filedelete-legend' => 'Used as fieldset label in the "Delete file" form.
+{{Identical|Delete file}}',
 'filedelete-intro' => 'Used as introduction for FileDelete form.
 See also:
 * {{msg-mw|Filedelete|page title}}',
@@ -3806,23 +3963,26 @@ See also:
 
 See also:
 * {{msg-mw|Mimesearch|page title}}
-* {{msg-mw|Ilsubmit|Submit button text}}',
+* {{msg-mw|Ilsubmit|Submit button text}}
+{{Identical|MIME type}}',
 'download' => 'Direct download link in each line returned by [[Special:MIMESearch]]. Points to the actual file, rather than the image description page.
 {{Identical|Download}}',
 
 # Unwatched pages
-'unwatchedpages' => 'Name of special page displayed in [[Special:SpecialPages]] for admins',
+'unwatchedpages' => '{{doc-special|UnwatchedPages}}',
 
 # List redirects
-'listredirects' => 'Name of special page displayed in [[Special:SpecialPages]].',
+'listredirects' => '{{doc-special|ListRedirects}}',
 
 # Unused templates
-'unusedtemplates' => 'Name of special page displayed in [[Special:SpecialPages]].',
+'unusedtemplates' => '{{doc-special|UnusedTemplates}}',
 'unusedtemplatestext' => 'Shown on top of [[Special:Unusedtemplates]]',
+'unusedtemplateswlh' => 'Used as link text in [[Special:UnusedTemplates]].
 
-# Random page
-'randompage' => 'Name of special page displayed in [[Special:SpecialPages]].
+The link points to the "What links here" page.',
 
+# Random page
+'randompage' => '{{doc-special|RandomPage}}
 See also:
 * {{msg-mw|Randompage}}
 * {{msg-mw|Accesskey-n-randompage}}
@@ -3832,12 +3992,11 @@ See also:
 * $2 - number of namespaces',
 
 # Random redirect
-'randomredirect' => 'Name of special page displayed in [[Special:SpecialPages]].',
+'randomredirect' => '{{doc-special|RandomRedirect}}',
 'randomredirect-nopages' => '* $1 - namespace name',
 
 # Statistics
-'statistics' => 'Name of special page displayed in [[Special:SpecialPages]].
-
+'statistics' => '{{doc-special|Statistics}}
 {{Identical|Statistics}}',
 'statistics-header-pages' => 'Used in [[Special:Statistics]]',
 'statistics-header-edits' => 'Used in [[Special:Statistics]]',
@@ -3853,12 +4012,13 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 
 {{Identical|Content page}}",
 'statistics-pages' => 'Used in [[Special:Statistics]]
-{{Identical|Pages}}',
+{{Identical|Page}}',
 'statistics-pages-desc' => "Tooltip shown over ''Pages'' (or as a note below it) in [[Special:Statistics]]",
 'statistics-files' => 'Used in [[Special:Statistics]]',
 'statistics-edits' => 'Used in [[Special:Statistics]]',
 'statistics-edits-average' => 'Used in [[Special:Statistics]]',
 'statistics-views-total' => 'Used in [[Special:Statistics]]',
+'statistics-views-total-desc' => 'This message follows the message {{msg-mw|statistics-views-total}}, in [[Special:Statistics]].',
 'statistics-views-peredit' => 'Used in [[Special:Statistics]]',
 'statistics-users' => '{{doc-important|Do not translate "Special:ListUsers"}}
 Used in [[Special:Statistics]].',
@@ -3867,7 +4027,7 @@ Used in [[Special:Statistics]].',
 * \$1 - Value of <code>\$wgRCMaxAge</code> in days",
 'statistics-mostpopular' => 'Used in [[Special:Statistics]]',
 
-'disambiguations' => 'Name of a special page displayed in [[Special:SpecialPages]].',
+'disambiguations' => '{{doc-special|Disambiguations}}',
 'disambiguationspage' => 'This message is the name of the template used for marking disambiguation pages. It is used by [[Special:Disambiguations]] to find all pages which link to disambiguation pages.
 
 {{doc-important|Don\'t translate the "Template:" part!}}',
@@ -3876,7 +4036,7 @@ This block of text is shown on [[:Special:Disambiguations]].
 
 \'\'\'Background information:\'\'\' Beyond telling about links going to disambiguation pages, that they are generally bad, it should explain which pages in the article namespace are seen as disambiguations: [[MediaWiki:Disambiguationspage]] usually holds a list of disambiguation templates of the local wiki. Pages linking to one of them (by transclusion) will count as disambiguation pages. Pages linking to these disambiguation pages, instead to the disambiguated article itself, are listed on [[:Special:Disambiguations]].',
 
-'pageswithprop' => 'Title for [[Special:PagesWithProp]].
+'pageswithprop' => '{{doc-special|PagesWithProp}}
 {{Identical|Page with page property}}',
 'pageswithprop-legend' => 'Legend for the input form on [[Special:PagesWithProp]].
 {{Identical|Page with page property}}',
@@ -3886,13 +4046,13 @@ This block of text is shown on [[:Special:Disambiguations]].
 'pageswithprop-submit' => 'Label for the submit button on [[Special:PagesWithProp]].
 {{Identical|Go}}',
 
-'doubleredirects' => 'Name of [[Special:DoubleRedirects]] displayed in [[Special:SpecialPages]]',
+'doubleredirects' => '{{doc-special|DoubleRedirects}}',
 'doubleredirectstext' => 'Shown on top of [[Special:Doubleredirects]]',
 'double-redirect-fixed-move' => 'This is the message in the log when the software (under the username {{msg|double-redirect-fixer}}) updates the redirects after a page move. See also {{msg|fix-double-redirects}}.',
 'double-redirect-fixed-maintenance' => 'This is the message in the log when the software (under the username {{msg-mw|double-redirect-fixer}}) updates the redirects after running maintenance/fixDoubleRedirects.php. Compare with {{msg-mw|double-redirect-fixed-move}}.',
 'double-redirect-fixer' => "This is the '''username''' of the user who updates the double redirects after a page move. A user is created with this username, so it is perhaps better to not change this message too often. See also {{msg|double-redirect-fixed-move}} and {{msg|fix-double-redirects}}.",
 
-'brokenredirects' => 'Name of [[Special:BrokenRedirects]] displayed in [[Special:SpecialPages]]',
+'brokenredirects' => '{{doc-special|BrokenRedirects}}',
 'brokenredirectstext' => 'Shown on top of [[Special:BrokenRedirects]].',
 'brokenredirects-edit' => 'Link in [[Special:BrokenRedirects]]
 
@@ -3901,12 +4061,12 @@ This block of text is shown on [[:Special:Disambiguations]].
 
 {{Identical|Delete}}',
 
-'withoutinterwiki' => 'The title of the special page [[Special:WithoutInterwiki]].',
+'withoutinterwiki' => '{{doc-special|WithoutInterwiki}}',
 'withoutinterwiki-summary' => 'Summary of [[Special:WithoutInterwiki]].',
 'withoutinterwiki-legend' => 'Used on [[Special:WithoutInterwiki]] as title of fieldset.',
 'withoutinterwiki-submit' => '{{Identical|Show}}',
 
-'fewestrevisions' => 'Name of a special page displayed in [[Special:SpecialPages]].',
+'fewestrevisions' => '{{doc-special|FewestRevisions}}',
 
 # Miscellaneous special pages
 'nbytes' => 'Message used on the history page of a wiki page. Each version of a page consist of a number of bytes. $1 is the number of bytes that the page uses. Uses plural as configured for a language based on $1.',
@@ -3920,45 +4080,47 @@ This block of text is shown on [[:Special:Disambiguations]].
 'nimagelinks' => 'Used on [[Special:MostLinkedFiles]] to indicate how often a specific file is used.',
 'ntransclusions' => 'Used on [[Special:MostLinkedTemplates]] to indicate how often a template is in use.',
 'specialpage-empty' => 'Used on a special page when there is no data. For example on [[Special:Unusedimages]] when all images are used.',
-'lonelypages' => 'Name of [[Special:LonelyPages]] displayed in [[Special:SpecialPages]]',
+'lonelypages' => '{{doc-special|LonelyPages}}',
 'lonelypagestext' => 'Text displayed in [[Special:LonelyPages]]',
-'uncategorizedpages' => 'Name of a special page displayed in [[Special:SpecialPages]].',
-'uncategorizedcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'uncategorizedimages' => 'The title of the special page [[Special:UncategorizedImages]].',
-'uncategorizedtemplates' => 'The title of the special page [[Special:UncategorizedTemplates]].',
-'unusedcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'unusedimages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'popularpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'wantedcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'wantedpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'uncategorizedpages' => '{{doc-special|UncategorizedPages}}',
+'uncategorizedcategories' => '{{doc-special|UncategorizedCategories}}',
+'uncategorizedimages' => '{{doc-special|UncategorizedImages}}',
+'uncategorizedtemplates' => '{{doc-special|UncategorizedTemplates}}',
+'unusedcategories' => '{{doc-special|UnusedCategories}}',
+'unusedimages' => '{{doc-special|UnusedImages}}',
+'popularpages' => '{{doc-special|PopularPages}}',
+'wantedcategories' => '{{doc-special|WantedCategories}}',
+'wantedpages' => '{{doc-special|WantedPages}}',
 'wantedpages-badtitle' => "Error message shown when [[Special:WantedPages]] is listing a page with a title that shouldn't exist.
 
 $1 is a page title",
-'wantedfiles' => 'Name of special page displayed in [[Special:SpecialPages]] and title of [[Special:WantedFiles]].',
+'wantedfiles' => '{{doc-special|WantedFiles}}',
 'wantedfiletext-cat' => 'Message displayed at top of [[special:WantedFiles]]. $1 contains the name of the tracking category for broken files (Including Category prefix). {{msg-mw|wantedfiletext-nocat}} is used if the tracking category is disabled.',
 'wantedfiletext-nocat' => 'Message displayed at top of [[special:WantedFiles]] when broken file tracking category is disabled. See {{msg-mw|wantedfiletext-cat}}.',
-'wantedtemplates' => 'The page name of [[Special:WantedTemplates]].',
-'mostlinked' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostlinkedcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostlinkedtemplates' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostcategories' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostimages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostinterwikis' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'mostrevisions' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'prefixindex' => 'The page title of [[Special:PrefixIndex]]. When the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.',
+'wantedtemplates' => '{{doc-special|WantedTemplates}}',
+'mostlinked' => '{{doc-special|MostLinked}}',
+'mostlinkedcategories' => '{{doc-special|MostLinkedCategories}}',
+'mostlinkedtemplates' => '{{doc-special|MostLinkedTemplates}}',
+'mostcategories' => '{{doc-special|MostCategories}}',
+'mostimages' => '{{doc-special|MostImages}}',
+'mostinterwikis' => '{{doc-special|MostInterwikis}}',
+'mostrevisions' => '{{doc-special|MostRevisions}}',
+'prefixindex' => '{{doc-special|PrefixIndex}}
+When the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.',
 'prefixindex-namespace' => 'The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace',
-'shortpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'longpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
-'deadendpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'shortpages' => '{{doc-special|ShortPages}}',
+'longpages' => '{{doc-special|LongPages}}',
+'deadendpages' => '{{doc-special|DeadendPages}}',
 'deadendpagestext' => 'Introductory text for [[Special:DeadendPages]]',
-'protectedpages' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'protectedpages' => '{{doc-special|ProtectedPages}}',
 'protectedpages-indef' => 'Option in [[Special:ProtectedPages]]',
 'protectedpages-cascade' => 'Option in [[Special:ProtectedPages]]',
 'protectedpagestext' => 'Shown on top of [[Special:ProtectedPages]]',
-'protectedtitles' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'protectedpagesempty' => 'Used in [[Special:ProtectedPages]], when there are no protected pages with the specified parameters.',
+'protectedtitles' => '{{doc-special|ProtectedTitles}}',
 'protectedtitlestext' => 'Shown on top of list of titles on [[Special:ProtectedTitles]]. If the list is empty the message [[MediaWiki:Protectedtitlesempty]] appears instead of this. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
 'protectedtitlesempty' => 'Used on [[Special:ProtectedTitles]]. This text appears if the list of protected titles is empty. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.',
-'listusers' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'listusers' => '{{doc-special|ListUsers}}',
 'listusers-editsonly' => 'Option in [[Special:ListUsers]].',
 'listusers-creationsort' => 'Option in [[Special:ListUsers]].',
 'usereditcount' => 'Shown behind every username on [[Special:ListUsers]].',
@@ -3966,10 +4128,11 @@ $1 is a page title",
 * $1 - a date
 * $2 - a time
 * $3 - the name of the user, for use in GENDER',
-'newpages' => 'Name of special page displayed in [[Special:SpecialPages]]
+'newpages' => '{{doc-special|NewPages}}
 {{Identical|New page}}',
 'newpages-username' => '{{Identical|Username}}',
-'ancientpages' => 'The page title of [[Special:Ancientpages]]. [[mw:Manual:Interface/Special pages title|mw manual]]',
+'ancientpages' => '{{doc-special|AncientPages}}
+See [[mw:Manual:Interface/Special pages title|manual]].',
 'move' => 'Name of Move tab. Should be in the imperative mood.
 
 See also:
@@ -3979,6 +4142,7 @@ See also:
 {{Identical|Move}}',
 'movethispage' => '{{Identical|Move this page}}',
 'unusedimagestext' => 'Header message of [[Special:UnusedFiles]]',
+'unusedcategoriestext' => 'Used as page header in [[Special:UnusedCategories]].',
 'notargettitle' => 'Used as title of error message.
 
 See also:
@@ -4010,8 +4174,7 @@ See also:
 '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).",
 
 # Book sources
-'booksources' => 'Name of special page displayed in [[Special:SpecialPages]]
-
+'booksources' => '{{doc-special|BookSources}}
 See also:
 * {{msg-mw|Booksources|title}}
 * {{msg-mw|Booksources-text|text}}',
@@ -4032,17 +4195,19 @@ See also:
 # Special:Log
 'specialloguserlabel' => 'Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions \'\'performed\'\' by the specified user.  "Carried out" and "done" are possible alternatives for "performed".',
 'speciallogtitlelabel' => 'Used in [[Special:Log]] as a label for an input field with which the log can be filtered.  This filter selects for pages or users on which a log action was performed.',
-'log' => 'Name of special page displayed in [[Special:SpecialPages]]',
+'log' => '{{doc-special|Log}}',
 'all-logs-page' => '{{doc-logpage}}
 Title of [[Special:Log]].',
 'alllogstext' => 'Header of [[Special:Log]]',
+'logempty' => 'Used as warning when there are no items to show.',
 'log-title-wildcard' => '* Appears in: [[Special:Log]]
 * Description: A check box to enable prefix search option',
 'showhideselectedlogentries' => 'Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].',
 
 # Special:AllPages
-'allpages' => 'First part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. The other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.
-
+'allpages' => '{{doc-special|AllPages}}
+First part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]].
+The other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.
 {{Identical|All pages}}',
 'alphaindexline' => 'Used on [[Special:AllPages]] if the main namespace contains more than 960 pages. Indicates the page range displayed behind the link. "from page $1 to page $2". $1 is the source page name. $1 is the target page name.',
 'nextpage' => 'Third part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Prevpage}}.
@@ -4072,6 +4237,7 @@ Title of [[Special:Log]].',
 
 {{Identical|Go}}',
 'allpagesprefix' => "Used for the label of the input box of [[Special:PrefixIndex]]. On this page you can either write 'Name of namespace:string from which to begin display in alphabetical order' in the top box, or you can choose a namespace in the bottom box and put 'string from which to begin display in alphabetical order' in the top box. The result will be the same.",
+'allpagesbadtitle' => 'Used in [[Special:AllPages]], [[Special:PrefixIndex]] and [[Special:RecentChangesLinked]].',
 'allpages-bad-ns' => '* $1 - namespace name',
 'allpages-hide-redirects' => 'Label for a checkbox. If the checkbox is checked redirects will not be shown in the list. Used in [[Special:PrefixIndex]] and [[Special:Allpages]].',
 
@@ -4082,16 +4248,29 @@ Title of [[Special:Log]].',
 
 # Special:Categories
 'categories' => 'The page name of [[Special:Categories]].
-
-{{Identical|Categories}}',
+{{Identical|Category}}',
 'categoriespagetext' => "{{doc-important|Do not translate or change links.}}
 Text displayed in [[Special:Categories]].
 
 In order to translate ''Unused categories'' and ''wanted categories'' see {{msg|unusedcategories}} and {{msg|wantedcategories}}.",
-'special-categories-sort-count' => 'This message is used on [[Special:Categories]] to sort the list by the number of members in the categories.',
+'categoriesfrom' => 'Used as label for the input box in [[Special:Categories]].
+
+This message follows the fieldset label {{msg-mw|categories}}, and is followed by the input box.',
+'special-categories-sort-count' => 'Commented out at this time.
+
+This message is used on [[Special:Categories]] to sort the list by the number of members in the categories.
+
+See also:
+* {{msg-mw|Special-categories-sort-abc}}',
+'special-categories-sort-abc' => 'Commented out at this time.
+
+This message is used on [[Special:Categories]] to sort the list by the category name.
+
+See also:
+* {{msg-mw|Special-categories-sort-count}}',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'The message is shown as a link on user contributions page (like [[Special:Contributions/User]]) to the corresponding [[Special:DeletedContributions]] page.
+'deletedcontributions' => 'The message is shown as a link on [[Special:SpecialPages]] to [[Special:DeletedContributions]].
 
 {{Identical|Deleted user contributions}}',
 'deletedcontributions-title' => 'Title of [[Special:DeletedContributions]] (extension), a special page with a list of edits to pages which were deleted. Only viewable by sysops.
@@ -4216,9 +4395,11 @@ See also:
 * {{msg-mw|Emailuser}}
 * {{msg-mw|Accesskey-t-emailuser}}
 * {{msg-mw|Tooltip-t-emailuser}}',
-'emailuser-title-target' => 'Title of [[Special:EmailUser|special page]] when a user was given to e-mail. Parameters:
-* $1 is a plain text username, used for GENDER.',
-'emailuser-title-notarget' => 'Title of [[Special:EmailUser|special page]] when no user given to e-mail yet',
+'emailuser-title-target' => '{{doc-special|EmailUser|unlisted=1}}
+Used when a user was given to e-mail. Parameters:
+* $1 - a plain text username, used for GENDER.',
+'emailuser-title-notarget' => '{{doc-special|EmailUser|unlisted=1}}
+Used when no user given to e-mail yet.',
 '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 e-mail form on [[Special:EmailUser]].
 
@@ -4282,11 +4463,25 @@ Parameters:
 {{Identical|For $1}}',
 'nowatchlist' => 'Displayed when there is no pages in the watchlist.',
 'watchlistanontext' => '* $1 is a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description',
-'watchnologin' => '{{Identical|Not logged in}}',
-'addwatch' => 'Link to a dialog box, displayed at the end of the list of categories at the foot of each page.',
+'watchnologin' => 'Used as error page title.
+
+The error message for this title is:
+* {{msg-mw|Watchnologintext}}
+{{Identical|Not logged in}}',
+'watchnologintext' => 'Used as error message.
+
+The title for this error is {{msg-mw|Watchnologin}}.',
+'addwatch' => 'Link to a dialog box, displayed at the end of the list of categories at the foot of each page.
+
+See also:
+* {{msg-mw|Removewatch}}',
 'addedwatchtext' => 'Explanation shown when clicking on the {{msg-mw|watch}} tab.
 
 See also {{msg-mw|addedwatch}}.',
+'removewatch' => 'Link to a dialog box, displayed at the end of the list of categories at the foot of each page.
+
+See also:
+* {{msg-mw|Addwatch}}',
 'removedwatchtext' => "After a page has been removed from a user's watchlist by clicking the {{msg|unwatch}} tab at the top of an article, this message appears just below the title of the article. $1 is the title of the article. See also {{msg|removedwatch}} and {{msg|addedwatchtext}}.",
 'watch' => '{{doc-actionlink}}
 Name of the Watch tab. Should be in the imperative mood.
@@ -4331,13 +4526,12 @@ See also:
 * {{msg-mw|Watchlist-options|fieldset}}
 * {{msg-mw|Wlheader-enotif|watchlist header}}
 * {{msg-mw|enotif reset|Submit button text}}',
-'wlheader-enotif' => 'Used in [[Special:Watchlist]].
+'wlheader-enotif' => 'Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.
 
 See also:
 * {{msg-mw|Watchlist-options|fieldset}}
-* {{msg-mw|Watchlist-details|watchlist header}}
 * {{msg-mw|enotif reset|Submit button text}}',
-'wlheader-showupdated' => 'This message shows up near top of users watchlist page.',
+'wlheader-showupdated' => 'Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.',
 'watchmethod-recent' => 'See also:
 * {{msg-mw|Watchmethod-list}}',
 'watchmethod-list' => 'See also:
@@ -4455,6 +4649,8 @@ Possible value for $CHANGEDORCREATED in the following messages:
 * {{msg|enotif_body}}',
 
 # Delete
+'deletepage' => 'Used as Submit button text.
+{{Identical|Delete page}}',
 'confirm' => 'Submit button text for protection confirmation
 
 {{Identical|Confirm}}',
@@ -4480,8 +4676,8 @@ See also:
 * $1 is a page that was deleted
 * $2 is {{msg-mw|deletionlog}}',
 'dellogpage' => '{{doc-logpage}}
-The name of the deletion log. Used as heading on [[Special:Log/delete]] and in the drop down menu for selecting logs on [[Special:Log]].
 
+The name of the deletion log. Used as heading on [[Special:Log/delete]] and in the drop down menu for selecting logs on [[Special:Log]].
 {{Identical|Deletion log}}',
 'dellogpagetext' => 'Text in [[Special:Log/delete]].',
 'deletionlog' => 'This message is used to link to the deletion log:
@@ -4567,6 +4763,7 @@ The title for this error message is {{msg-mw|Sessionfailure-title}}.',
 
 # Protect
 'protectlogpage' => '{{doc-logpage}}
+
 Title of [[Special:Log/protect]].',
 'protectlogtext' => 'Text in [[Special:Log/protect]].',
 'protectedarticle' => 'Text describing an action on [[Special:Log]]. $1 is a page title.',
@@ -4621,14 +4818,18 @@ Also used in [[Special:ProtectedPages]] when a page is cascade protected. See ex
 See also:
 *{{msg-mw|Restriction-level-sysop}}
 *{{msg-mw|Restriction-level-autoconfirmed}}',
-'protect-expiring' => 'Used in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.
-* $1 is a date and time
-* $2 is a date (optional)
-* $3 is a time (optional)
-
+'protect-expiring' => 'Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.
+* $1 - a date and time
+* $2 - a date (optional)
+* $3 - a time (optional)
+If the expiry is indefinite, {{msg-mw|protect-expiry-indefinite}} is used.
 {{Identical|Expires $1 (UTC)}}',
 'protect-expiring-local' => '$1 is a timestamp like "22:51, 23 July 2011 (UTC)" depending on the wiki content language.',
+'protect-expiry-indefinite' => 'Used as expiry text in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.
+
+If the expiry is definite, {{msg-mw|protect-expiring}} is used.',
 'protect-cascade' => 'See [[meta:Protect]] for more information.',
+'protect-cantedit' => 'Used as error message when changing the protection levels of the page.',
 'protect-othertime' => 'Used on the page protection form as label for the following input field (text)
 {{Identical|Other time}}',
 'protect-othertime-op' => 'Used on the page protection form in the drop down menu
@@ -4691,8 +4892,7 @@ See also:
 *{{msg-mw|Restriction-level-autoconfirmed}}",
 
 # Undelete
-'undelete' => 'Name of special page for admins as displayed in [[Special:SpecialPages]].
-
+'undelete' => '{{doc-special|Undelete}}
 See also:
 * {{msg-mw|Undelete}}
 * {{msg-mw|Accesskey-ca-undelete}}
@@ -4734,6 +4934,7 @@ Parameters:
 * $5 - time of the revision
 Example:
 * Deleted revision of [[Main Page]] (as of {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}, at {{CURRENTTIME}}) by [[User:Username|Username]]:',
+'undeleterevision-missing' => 'Used as warning when undeleting the revision.',
 'undelete-nodiff' => 'Used in [[Special:Undelete]].',
 'undeletebtn' => 'Shown on [[Special:Undelete]] as button caption and on [[Special:Log/delete|deletion log]] after each entry (for sysops).
 
@@ -4858,9 +5059,13 @@ See also:
 'contribsub2' => 'Contributions for "user" (links)
 {{Identical|For $1}}',
 'nocontribs' => 'Optional parameter: $1 is the user name',
-'uctop' => 'This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (top)',
+'uctop' => 'This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (top)
+{{Identical|Top}}',
 'month' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a dropdown box to select a specific month to view the edits made in that month, and the earlier months. See also {{msg-mw|year}}.',
-'year' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a inputbox to select a specific year to view the edits made in that year, and the earlier years. See also {{msg-mw|month}}.',
+'year' => 'Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for an input box to select a specific year to view the edits made in that year, and the earlier years.
+
+See also:
+* {{msg-mw|month}}',
 
 'sp-contributions-newbies' => 'Text of radio button on special page [[Special:Contributions]].',
 'sp-contributions-newbies-sub' => "Note at the top of the page of results for a search on [[Special:Contributions]] where 'Show contributions for new accounts only' has been selected.",
@@ -5010,8 +5215,8 @@ See also:
 # Block/unblock
 'autoblockid' => 'Used as name of autoblock, instead of autoblocked IPs. Parameters:
 * $1 - autoblock ID',
-'block' => 'Name of the special page on [[Special:SpecialPages]]',
-'unblock' => 'Name of the special page on [[Special:SpecialPages]]',
+'block' => '{{doc-special|Block}}',
+'unblock' => '{{doc-special|Unblock}}',
 'blockip' => 'The title of the special page [[Special:BlockIP]].
 
 {{Identical|Block user}}',
@@ -5019,6 +5224,12 @@ See also:
 'blockip-legend' => 'Legend/Header for the fieldset around the input form of [[Special:Block]].
 
 {{Identical|Block user}}',
+'blockiptext' => 'Used in the {{msg-mw|Blockip}} form in [[Special:Block]].
+
+This message may follow the message {{msg-mw|Ipb-otherblocks-header}} and other block messages.
+
+See also:
+* {{msg-mw|Unblockiptext}}',
 'ipadressorusername' => '{{Identical|IP address or username}}',
 'ipbexpiry' => '{{Identical|Expiry}}',
 'ipbreason' => 'Label of the block reason dropdown in [[Special:BlockIP]] and the unblock reason textfield in [{{fullurl:Special:IPBlockList|action=unblock}} Special:IPBlockList?action=unblock].
@@ -5100,13 +5311,33 @@ The title (subject) for this message is {{msg-mw|Blockipsuccesssub}}.
 
 Parameters:
 * $1 - username, can be used for GENDER',
+'ipb-blockingself' => 'Used as confirmation message in [[Special:Block]].
+
+See also:
+* {{msg-mw|Ipb-confirmhideuser}}',
+'ipb-confirmhideuser' => 'Used as confirmation message in [[Special:Block]].
+
+See also:
+* {{msg-mw|Ipb-blockingself}}',
 'ipb-edit-dropdown' => 'Shown beneath the user block form on the right side. It is a link to {{msg-mw|Ipbreason-dropdown|notext=1}}.
 
 See also:
 * {{msg-mw|Delete-edit-reasonlist}}
 * {{msg-mw|Protect-edit-reasonlist}}',
-'ipb-unblock-addr' => 'Used in [[Special:Block]].
-* $1 - target username',
+'ipb-unblock-addr' => 'Used as page title in [[Special:Block]], if the target user is specified.
+
+Parameters:
+* $1 - target username
+
+See also:
+* {{msg-mw|Ipb-unblock}}',
+'ipb-unblock' => 'Used as page title in [[Special:Block]], if the target user is not specified.
+
+See also:
+* {{msg-mw|Ipb-unblock-addr}}',
+'ipb-blocklist' => 'Used as link text in [[Special:Block]].
+
+The link points to Specil:BlockList.',
 'ipb-blocklist-contribs' => 'Used in [[Special:Block]].
 * $1 - target username',
 'unblockip' => 'Used as legend for the form in [[Special:Unblock]].',
@@ -5131,6 +5362,7 @@ See also:
 See also:
 * {{msg-mw|Unblocked}}
 * {{msg-mw|Unblocked-range}}',
+'blocklist' => '{{doc-special|BlockList}}',
 'ipblocklist' => 'Title of [[Special:Ipblocklist]].',
 'ipblocklist-legend' => 'Used as legend of the form in [[Special:BlockList]].
 
@@ -5216,7 +5448,14 @@ See also {{msg-mw|Block-log-flags-nousertalk}}.
 Part of the log entry of user block in [[Special:BlockList]].
 
 {{Related|Blocklist}}',
-'ipblocklist-empty' => 'Shown on page [[Special:Blocklist]], if no blocks are to be shown.',
+'ipblocklist-empty' => 'Used in [[Special:BlockList]], if the target is not specified.
+
+See also:
+* {{msg-mw|Ipblocklist-no-results}}',
+'ipblocklist-no-results' => 'Used in [[Special:BlockList]], if the target is specified.
+
+See also:
+* {{msg-mw|Ipblocklist-empty}}',
 'blocklink' => "Display name for a link that, when selected, leads to a form where a user can be blocked. Used in page history and recent changes pages. Example: \"''UserName (Talk | contribs | '''block''')''\".
 
 Used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].
@@ -5241,7 +5480,8 @@ See also:
 * {{msg-mw|sp-contributions-uploads}}
 * {{msg-mw|sp-contributions-logs}}
 * {{msg-mw|sp-contributions-deleted}}
-* {{msg-mw|sp-contributions-userrights}}',
+* {{msg-mw|sp-contributions-userrights}}
+{{Identical|Unblock}}',
 'change-blocklink' => 'Used to name the link on [[Special:Log]].
 
 Also used as link title in [[Special:Contributions]] and in [[Special:DeletedContributions]].
@@ -5315,7 +5555,9 @@ See also:
 * {{msg-mw|Range block disabled}}
 * {{msg-mw|Ip range invalid}}
 * {{msg-mw|Ip range toolarge}}',
+'ipb_expiry_invalid' => 'Used as error message in [[Special:Block]].',
 'ipb_expiry_temp' => 'Warning message displayed on [[Special:BlockIP]] if the option "hide username" is selected but the expiry time is not infinite.',
+'ipb_hide_invalid' => 'Used as error message in [[Special:Block]].',
 'ipb_already_blocked' => '{{Identical|$1 is already blocked}}',
 'ipb-needreblock' => 'Used in [[Special:Block]].
 * $1 - target username',
@@ -5338,7 +5580,8 @@ See also:
 * {{msg-mw|Range block disabled}}
 * {{msg-mw|Ip range invalid}}
 * {{msg-mw|Ip range toolarge}}',
-'blockme' => 'The page title of [[Special:Blockme]], a feature which is disabled by default.',
+'blockme' => '{{doc-special|BlockMe|unlisted=1}}
+This feature is disabled by default.',
 'proxyblocker' => 'Used in [[Special:BlockMe]].
 
 See also:
@@ -5373,6 +5616,8 @@ See also:
 See also:
 * {{msg-mw|Sorbsreason}}
 * {{msg-mw|Sorbs create account_reason}}',
+'xffblockreason' => "This text is shown to the user as a block reason and describes that the user is being blocked because an IP in the X-Forwarded-For header (which lists the user's IP as well as all IPs of the transparent proxy servers they went through) sent when they loaded the page has been blocked:
+* $1 is the original block reason for the IP address matched in the X-Forwarded-For header",
 'cant-see-hidden-user' => 'Used as (red) error message on [[Special:Block]] when you try to change (as sysop without the hideuser right) the block of a hidden user.',
 'ipbblocked' => 'Error message shown when a user tries to alter block settings when they are themselves blocked.',
 'ipbnounblockself' => 'Error message shown when a user without the <tt>unblockself</tt> right tries to unblock themselves.',
@@ -5644,6 +5889,7 @@ See also:
 * $2 - new page title',
 'movepage-max-pages' => 'PROBABLY (A GUESS): when moving a page, you can select an option of moving its subpages, but there is a maximum that can be moved automatically.',
 'movelogpage' => '{{doc-logpage}}
+
 Title of [[Special:Log/move]]. Used as heading on that page, and in the dropdown menu on log pages.',
 'movelogpagetext' => "Text on the special page 'Move log'.",
 'movesubpage' => "This is a section header on [[Special:MovePage]], below is a list of subpages.
@@ -5842,10 +6088,14 @@ The reason $1 is one of the following messages:
 * {{msg-mw|Thumbnail-dest-create}}
 * {{msg-mw|Thumbnail dest directory}}
 * {{msg-mw|Thumbnail invalid params}}
+* {{msg-mw|Thumbnail image-missing}}
 * {{msg-mw|Djvu no xml}}
 * {{msg-mw|Djvu page error}}
 * {{msg-mw|Svg-long-error}}
 * other custom string',
+'thumbnail_error_remote' => 'Message shown in a thumbnail frame when creation of the thumbnail fails. Parameters:
+* $1 - the name of the shared repository, see {{msg-mw|sharedupload}}
+* $2 - the reason, see {{msg-mw|thumbnail_error}}',
 'djvu_page_error' => 'Used as error message.
 
 See also:
@@ -6173,6 +6423,13 @@ See also:
 * {{msg-mw|Viewsource}}
 * {{msg-mw|Accesskey-ca-viewsource}}
 * {{msg-mw|Tooltip-ca-viewsource}}',
+'tooltip-ca-history' => 'Used as tooltip for {{msg-mw|Vector-view-history}}.
+
+See for example {{canonicalurl:Main_Page|useskin=vector}}Main page?useskin=vector]
+
+See also:
+* {{msg-mw|Vector-view-history}}
+* {{msg-mw|Accesskey-ca-history}}',
 'tooltip-ca-protect' => 'Used as tooltip for {{msg-mw|Protect}}.
 
 See also:
@@ -6492,19 +6749,12 @@ See also:
 # Stylesheets
 'common.css' => '{{optional}}
 CSS applied to all users.',
-'standard.css' => '{{optional}}',
-'nostalgia.css' => '{{optional}}',
 'cologneblue.css' => '{{optional}}',
 'monobook.css' => '{{optional}}
 CSS applied to users using Monobook skin.',
-'myskin.css' => '{{optional}}',
-'chick.css' => '{{optional}}',
-'simple.css' => '{{optional}}',
 'modern.css' => '{{optional}}',
 'vector.css' => '{{optional}}',
 'print.css' => '{{optional}}',
-'handheld.css' => '{{optional}}
-Style that can be applied on [[w:handheld devices|handheld devices]] (e.g. mobile phones), <code>$wgHandheldStyle</code> is an optional configuration variable which specifies a style sheet file for handheld devices.',
 'noscript.css' => '{{optional}}',
 'group-autoconfirmed.css' => '{{doc-group|autoconfirmed|css}}',
 'group-bot.css' => '{{doc-group|bot|css}}',
@@ -6514,14 +6764,9 @@ Style that can be applied on [[w:handheld devices|handheld devices]] (e.g. mobil
 # Scripts
 'common.js' => '{{optional}}
 JS for all users.',
-'standard.js' => '{{optional}}',
-'nostalgia.js' => '{{optional}}',
 'cologneblue.js' => '{{optional}}',
 'monobook.js' => '{{optional}}
 JS for users using Monobook skin.',
-'myskin.js' => '{{optional}}',
-'chick.js' => '{{optional}}',
-'simple.js' => '{{optional}}',
 'modern.js' => '{{optional}}',
 'vector.js' => '{{optional}}',
 'group-autoconfirmed.js' => '{{doc-group|autoconfirmed|js}}',
@@ -6647,15 +6892,19 @@ See also:
 'pageinfo-views' => 'The number of times the page has been viewed.',
 'pageinfo-watchers' => 'The number of users watching the page.',
 'pageinfo-few-watchers' => 'Message displayed when there are fewer than $wgUnwatchedPageThreshold watchers. $1 is the value of $wgUnwatchedPageThreshold.',
-'pageinfo-redirects-name' => "The number of redirects to the page.
+'pageinfo-redirects-name' => 'Followed by the number of redirects to the page.
+
+Used as link text. The link points to "{{int:Whatlinkshere-title}}" page ([[Special:WhatLinksHere]]).
 
-Used as link text, linked to '{{int:Whatlinkshere-title}}' page ([[Special:WhatLinksHere]]).",
+See example: [{{canonicalurl:Main page|action=info}} Main page?action=info]',
 'pageinfo-redirects-value' => '{{Optional}}
 Parameters:
 * $1 - the number of redirects to the page',
-'pageinfo-subpages-name' => "The number of subpages of the page.
+'pageinfo-subpages-name' => 'Followed by the number of subpages of the page.
+
+Used as link text. The link points to the "{{int:Prefixindex}}" page ([[Special:PrefixIndex]]).
 
-Used as link text, linked to '{{int:Prefixindex}}' page ([[Special:PrefixIndex]]).",
+See example: [{{canonicalurl:Main page|action=info}} Main page?action=info]',
 'pageinfo-subpages-value' => 'Parameters:
 * $1 - the number of subpages of the page
 * $2 - the number of subpages of the page that are redirects
@@ -6664,7 +6913,9 @@ Used as link text, linked to '{{int:Prefixindex}}' page ([[Special:PrefixIndex]]
 'pageinfo-firsttime' => 'The date and time the page was created.',
 'pageinfo-lastuser' => 'The last user who edited the page.',
 'pageinfo-lasttime' => 'The date and time the page was last edited.',
-'pageinfo-edits' => 'The total number of times the page has been edited.',
+'pageinfo-edits' => 'Used as label in info page. See [{{canonicalurl:Support|action=info}} example].
+
+This message is followed by the total number of times the page has been edited.',
 'pageinfo-authors' => 'The total number of users who have edited the page.',
 'pageinfo-recent-edits' => 'The number of times the page has been edited recently. $1 is a localised duration (e.g. 9 days).',
 'pageinfo-recent-authors' => 'The number of users who have edited the page recently.',
@@ -6705,14 +6956,8 @@ See also:
 * {{msg-mw|Pageinfo-category-subcats}}',
 
 # Skin names
-'skinname-standard' => '{{optional}}
-{{Identical|Classic}}',
-'skinname-nostalgia' => '{{optional}}',
 'skinname-cologneblue' => '{{optional}}',
 'skinname-monobook' => '{{optional}}',
-'skinname-myskin' => '{{optional}}',
-'skinname-chick' => '{{optional}}',
-'skinname-simple' => '{{optional}}',
 'skinname-modern' => '{{optional}}',
 'skinname-vector' => '{{optional}}',
 
@@ -6898,32 +7143,29 @@ Abbreviation for "days". $1 is the number of days.
 See also {{msg-mw|days}}',
 'seconds' => 'Full word for "seconds". $1 is the number of seconds.
 
-See also {{msg-mw|Seconds-abbrev}}
-
-Part of variable $1 in {{msg-mw|Ago}}',
+See also {{msg-mw|seconds-abbrev}}, {{msg-mw|seconds-ago}}.',
 'minutes' => 'Full word for "minutes". $1 is the number of minutes.
 
-See also {{msg-mw|Minutes-abbrev}}
+See also {{msg-mw|minutes-abbrev}}, {{msg-mw|minutes-ago}}.
 
-Part of variable $1 in {{msg-mw|Ago}}.
 {{Identical|Minute}}',
 'hours' => 'Full word for "hours". $1 is the number of hours.
 
-See also {{msg-mw|Hours-abbrev}}
-
-Part of variable $1 in {{msg-mw|Ago}}',
+See also {{msg-mw|hours-abbrev}}, {{msg-mw|hours-ago}}.',
 'days' => 'Full word for "days". $1 is the number of days.
 
 See also {{msg-mw|Days-abbrev}}
 
-Part of variable $1 in {{msg-mw|Ago}}
 {{Identical|Day}}',
-'months' => 'Full word for "months". $1 is the number of months.
+'weeks' => 'Full word for "weeks".
 
-Part of variable $1 in {{msg-mw|Ago}}',
-'years' => 'Full word for "years". $1 is the number of years.
+Parameters:
+* $1 - the number of weeks',
+'months' => 'Full word for "months". $1 is the number of months.',
+'years' => 'Full word for "years".
 
-Part of variable $1 in {{msg-mw|Ago}}',
+Parameters:
+* $1 - the number of years',
 'ago' => 'Phrase for indicating how long ago something happened. $1 is something like "3 days 10 hours", taken from these messages:
 *{{msg-mw|Seconds}}
 *{{msg-mw|Minutes}}
@@ -6933,13 +7175,24 @@ Part of variable $1 in {{msg-mw|Ago}}',
 *{{msg-mw|Years}}',
 'just-now' => 'Phrase for indicating something happened just now.',
 
+# Human-readable timestamps
+'hours-ago' => 'Phrase for indicating that something occurred a certain number of hours ago',
+'minutes-ago' => 'Phrase for indicating that something occurred a certain number of minutes ago',
+'seconds-ago' => 'Phrase for indicating that something occurred a certain number of seconds ago',
+'monday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Monday. $1 is the time.',
+'tuesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Tuesday. $1 is the time.',
+'wednesday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Wednesday. $1 is the time.',
+'thursday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Thursday. $1 is the time.',
+'friday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Friday. $1 is the time.',
+'saturday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Saturday. $1 is the time.',
+'sunday-at' => 'Phrase for indicating that something occurred at a particular time on the most recent Sunday. $1 is the time.',
+'yesterday-at' => 'Phrase for indicating that something occurred at a particular time yesterday. $1 is the time.',
+
 # Bad image list
 'bad_image_list' => 'This message only appears to guide administrators to add links with the right format. This will not appear anywhere else in MediaWiki.',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => '{{Optional}}
@@ -7031,6 +7284,7 @@ Varient Option for wikis with variants conversion enabled.',
 # Metadata
 'metadata' => 'The title of a section on an image description page, with information and data about the image. For example of message in use see [[commons:File:Titan-crystal_bar.JPG|Commons]].
 {{Identical|Metadata}}',
+'metadata-help' => 'This message is followed by a table with metadata.',
 'metadata-expand' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see {{msg-mw|Metadata-collapse}}.',
 'metadata-collapse' => 'On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on the link {{msg-mw|Metadata-expand}}, you can see more data and information. This message is for the link to hide back the less important data.',
 'metadata-fields' => '{{doc-important|Do not translate list items, only translate the text! So leave "<code>* make</code>" and the other items exactly as they are.}}
@@ -7042,7 +7296,7 @@ $1 is the value of the property (in one language), $2 is the language name that
 'metadata-langitem-default' => '{{optional}}
 Similar to "metadata-langitem" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 {{Identical|Width}}',
 'exif-imagelength' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
@@ -7135,7 +7389,8 @@ See also:
 This contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.
 {{Related|Exif-componentsconfiguration}}',
 'exif-compressedbitsperpixel' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
-'exif-pixelydimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+'exif-pixelydimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+{{Identical|Image width}}',
 'exif-pixelxdimension' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
 'exif-usercomment' => "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
@@ -7215,11 +7470,7 @@ See [[w:Metering_mode|Wikipedia article]] on metering mode.
 'exif-flash' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
 See this [[w:en:Flash_(photography)|Wikipedia article]] for an explanation of the term.
-
-See also:
-* {{msg-mw|Exif-flash}}
-* {{msg-mw|Exif-flash-fired-0}}
-* {{msg-mw|Exif-flash-fired-1}}
+{{Related|Exif-flash}}
 {{Identical|Flash}}',
 'exif-focallength' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
@@ -7402,7 +7653,7 @@ This is who originally owned the image (a person, stock photo agency, etc). This
 'exif-editstatus' => 'Editorial status of image. This is more intended for use with people making news papers. This denotes whether the image is on the main page, is part of a correction, etc. See 2:07 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
 'exif-urgency' => 'Urgency. How urgent this image is. 1 is very urgent, 5 is normal, 8 is  very low priority.
 {{Related|Exif-urgency}}',
-'exif-fixtureidentifier' => 'Fixture name. Identifies frequently occuring object data, for example a regular column in a news paper.',
+'exif-fixtureidentifier' => 'Fixture name. Identifies frequently occurring object data, for example a regular column in a news paper.',
 'exif-locationdest' => 'Full printable name of location.',
 'exif-locationdestcode' => 'Code of location depicted. Typically this is an ISO country code, but the IPTC-iim standard also defines other codes like XSP for outer space. See appendix D (and tag 2:100) of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
 'exif-objectcycle' => 'Time of day that media is intended for. Either morning only, evening only, or all day. Typically only used for news related things that might only be broadcast at a specific time of day.
@@ -7422,7 +7673,9 @@ This is taken from IPTC-iim 2:135 and XMP's dc:language.
 {{Identical|Category}}',
 'exif-iimsupplementalcategory' => 'Supplemental categories. Like {{msg-mw|exif-iimcategory}} but for categories beyond the main one.',
 'exif-datetimeexpires' => 'Date after which not to use the image (media). This is often used in news situations were certain things (like forecasts) should not be used after a specified date.',
-'exif-datetimereleased' => 'Earliest date the image (media) can be used. See 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
+'exif-datetimereleased' => 'Earliest date the image (media) can be used.
+
+See 2:30 of http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf',
 'exif-originaltransmissionref' => 'This is basically a job id. This could help an individual keep track of for what reason the image was created. See Job Id on page 19 of http://www.iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-201007_1.pdf',
 'exif-identifier' => 'A formal identifier for the image. Often this is a URL.',
 'exif-lens' => 'Description of lens used. This is taken from aux:Lens XMP property. See http://www.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/XMPSpecificationPart2.pdf',
@@ -7448,7 +7701,8 @@ This property can come from xmp:Label in XMP ( http://www.adobe.com/content/dam/
 'exif-pngfilecomment' => 'See also:
 * {{msg-mw|Exif-pngfilecomment}}
 * {{msg-mw|Exif-giffilecomment}}',
-'exif-disclaimer' => 'Disclaimer for the image.',
+'exif-disclaimer' => 'Disclaimer for the image.
+{{Identical|Disclaimer}}',
 'exif-contentwarning' => 'Content warning for the image. For example if the image/media contains violent, sexual or otherwise offensive content.
 
 This comes from the png warning textual chunk. See http://www.w3.org/TR/PNG/#11keywords',
@@ -7480,7 +7734,7 @@ Note, not all fields are guaranteed to be present, some may be empty strings.',
 *$1 is numeric IPTC subject news code (one of http://cv.iptc.org/newscodes/subjectcode )
 *$2 is one of 17 broad categories that the code falls into. For example any code starting with 15 has the contents of {{msg-mw|exif-iimcategory-spo}} for $2.',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '{{Related|Exif-compression}}',
 'exif-compression-2' => '{{Related|Exif-compression}}',
 'exif-compression-3' => '{{Related|Exif-compression}}',
@@ -7500,6 +7754,18 @@ Lempel-Ziv & Welch algorithm',
 'exif-photometricinterpretation-2' => '{{optional}}',
 'exif-photometricinterpretation-6' => '{{optional}}',
 
+'exif-unknowndate' => 'Used if the Exif date and time is "<code>0000:00:00 00:00:00</code>".
+
+Related Exif attributes:
+* {{msg-mw|Exif-datetime}}
+* {{msg-mw|Exif-datetimeoriginal}}
+* {{msg-mw|Exif-datetimedigitized}}
+* {{msg-mw|Exif-datetimereleased}}
+* {{msg-mw|Exif-datetimeexpires}}
+* {{msg-mw|Exif-gpsdatestamp}}
+* {{msg-mw|Exif-dc-date}}
+* {{msg-mw|Exif-datetimemetadata}}',
+
 'exif-orientation-1' => '0th row: top; 0th column: left
 {{Related|Exif-orientation}}
 {{Identical|Normal}}',
@@ -7626,55 +7892,28 @@ See also:
 'exif-lightsource-255' => '{{Related|Exif-lightsource}}',
 
 # Flash modes
-'exif-flash-fired-0' => 'See also:
-* {{msg-mw|Exif-flash}}
-* {{msg-mw|Exif-flash-fired-0}}
-* {{msg-mw|Exif-flash-fired-1}}',
-'exif-flash-fired-1' => 'See also:
-* {{msg-mw|Exif-flash}}
-* {{msg-mw|Exif-flash-fired-0}}
-* {{msg-mw|Exif-flash-fired-1}}',
+'exif-flash-fired-0' => '{{Related|Exif-flash}}',
+'exif-flash-fired-1' => '{{Related|Exif-flash}}',
 'exif-flash-return-0' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
 "Strobe" and "flash" mean the same here.
-
-See also:
-* {{msg-mw|Exif-flash-return-0}}
-* {{msg-mw|Exif-flash-return-2}}
-* {{msg-mw|Exif-flash-return-3}}',
+{{Related|Exif-flash}}',
 'exif-flash-return-2' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
 "Strobe" and "flash" mean the same here.
-
-See also:
-* {{msg-mw|Exif-flash-return-0}}
-* {{msg-mw|Exif-flash-return-2}}
-* {{msg-mw|Exif-flash-return-3}}',
+{{Related|Exif-flash}}',
 'exif-flash-return-3' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
 
 "Strobe" and "flash" mean the same here.
-
-See also:
-* {{msg-mw|Exif-flash-return-0}}
-* {{msg-mw|Exif-flash-return-2}}
-* {{msg-mw|Exif-flash-return-3}}',
+{{Related|Exif-flash}}',
 'exif-flash-mode-1' => 'This is when you have chosen that your camera must use a flash for this picture.
-
-See also:
-* {{msg-mw|Exif-flash-mode-1}}
-* {{msg-mw|Exif-flash-mode-2}}
-* {{msg-mw|Exif-flash-mode-3}}',
+{{Related|Exif-flash}}',
 'exif-flash-mode-2' => "This is when you have chosen that your camera must ''not'' use a flash for this picture.
-
-See also:
-* {{msg-mw|Exif-flash-mode-1}}
-* {{msg-mw|Exif-flash-mode-2}}
-* {{msg-mw|Exif-flash-mode-3}}",
-'exif-flash-mode-3' => 'See also:
-* {{msg-mw|Exif-flash-mode-1}}
-* {{msg-mw|Exif-flash-mode-2}}
-* {{msg-mw|Exif-flash-mode-3}}',
-'exif-flash-function-1' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].',
+{{Related|Exif-flash}}",
+'exif-flash-mode-3' => '{{Related|Exif-flash}}',
+'exif-flash-function-1' => 'Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].
+{{Related|Exif-flash}}',
+'exif-flash-redeye-1' => '{{Related|Exif-flash}}',
 
 'exif-focalplaneresolutionunit-2' => 'See also:
 * {{msg-mw|Exif-focalplaneresolutionunit}}',
@@ -7823,7 +8062,8 @@ See also:
 {{Related|Exif-gpsdop}}',
 'exif-gpsdop-moderate' => 'Parameters:
 * $1 - the actual HDOP/PDOP value (5-10 for moderate). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)
-{{Related|Exif-gpsdop}}',
+{{Related|Exif-gpsdop}}
+{{Identical|Moderate}}',
 'exif-gpsdop-fair' => 'Parameters:
 * $1 - the actual HDOP/PDOP value (10-20 for fair). See http://en.wikipedia.org/wiki/Dilution_of_precision_(GPS)
 {{Related|Exif-gpsdop}}',
@@ -8333,8 +8573,7 @@ Parameters:
 'duplicate-defaultsort' => 'See definition of [[w:Sorting|sort key]] on Wikipedia.',
 
 # Special:Version
-'version' => 'Name of special page displayed in [[Special:SpecialPages]]
-
+'version' => '{{doc-special|Version}}
 {{Identical|Version}}',
 'version-extensions' => 'Header on [[Special:Version]].',
 'version-specialpages' => 'Part of [[Special:Version]].
@@ -8381,14 +8620,29 @@ A short description of the article path entry point. Links to the mediawiki.org
 'version-entrypoints-scriptpath' => '{{Optional}}
 A short description of the script path entry point. Links to the mediawiki.org documentation page for $wgScriptPath.',
 
-# Special:FilePath
-'filepath' => 'Legend of fieldset around input box in [[Special:FilePath]].',
-'filepath-page' => 'Shown next to input box in [[Special:FilePath]]
-
-{{Identical|File}}',
-'filepath-submit' => 'Button label in [[Special:FilePath]].
+# Special:Redirect
+'redirect' => "{{doc-special|Redirect}}
+This means \"Redirect by file'''name''', user '''ID''', or revision ID\".",
+'redirect-legend' => 'Legend of fieldset around input box in [[Special:Redirect]]',
+'redirect-summary' => 'Shown at top of [[Special:Redirect]]',
+'redirect-submit' => 'Button label in [[Special:Redirect]].
 {{Identical|Go}}',
-'filepath-summary' => 'Shown in [[Special:FilePath]]',
+'redirect-lookup' => 'First field label in [[Special:Redirect]].
+
+Followed by the select box which has the following options:
+* {{msg-mw|Redirect-user}}
+* {{msg-mw|Redirect-revision}}
+* {{msg-mw|Redirect-file}}',
+'redirect-value' => 'Second field label in [[Special:Redirect]]
+{{Identical|Value}}',
+'redirect-user' => 'Description of lookup type for [[Special:Redirect]].
+{{Identical|User ID}}',
+'redirect-revision' => "Description of lookup type for [[Special:Redirect]].
+
+This means \"Page revision '''ID'''\".",
+'redirect-file' => 'Description of lookup type for [[Special:Redirect]].
+{{Identical|Filename}}',
+'redirect-not-exists' => 'Used as error message in [[Special:Redirect]]',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Name of special page [[Special:FileDuplicateSearch]].',
@@ -8418,7 +8672,8 @@ $1 is the name of the requested file.',
 * $1 - file name',
 
 # Special:SpecialPages
-'specialpages' => 'Display name of link to [[Special:SpecialPages]] shown on all pages in the toolbox, as well as the page title and header of [[Special:SpecialPages]].
+'specialpages' => '{{doc-special|SpecialPages|unlisted=1}}
+Display name of link to [[Special:SpecialPages]] shown on all pages in the toolbox.
 
 See also:
 * {{msg-mw|Specialpages}}
@@ -8426,22 +8681,22 @@ See also:
 * {{msg-mw|Tooltip-t-specialpages}}
 {{Identical|Special page}}',
 'specialpages-note' => 'Footer note for the [[Special:SpecialPages]] page',
-'specialpages-group-maintenance' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-other' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-login' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-changes' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-media' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-users' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-highuse' => 'Section heading in the list of [[Special:SpecialPages|Special pages]].',
-'specialpages-group-pages' => 'Used on [[Special:SpecialPages]]. Title of the special pages group, containing pages like [[Special:AllPages]], [[Special:PrefixIndex]], [[Special:Categories]], [[Special:Disambiguations]], etc.',
-'specialpages-group-pagetools' => 'Title of the special pages group containing special pages like [[Special:MovePage]], [[Special:Undelete]], [[Special:WhatLinksHere]], [[Special:Export]] etc.',
-'specialpages-group-wiki' => 'Title of the special pages group, containing special pages like [[Special:Version]], [[Special:Statistics]], [[Special:LockDB]], etc.',
-'specialpages-group-redirects' => 'Title of the special pages group, containing special pages that redirect to another location, like [[Special:Randompage]], [[Special:Mypage]], [[Special:Mytalk]], etc.',
-'specialpages-group-spam' => 'Title of the special pages group, containing special pages like (...), etc.',
+'specialpages-group-maintenance' => '{{doc-special-group|like=[[Special:DoubleRedirects]], [[Special:LonelyPages]] and [[Special:WantedPages]]}}',
+'specialpages-group-other' => '{{doc-special-group|like=[[Special:AdminLinks]] and [[Special:BookSources]]}}',
+'specialpages-group-login' => '{{doc-special-group|like=[[Special:UserLogin]]}}',
+'specialpages-group-changes' => '{{doc-special-group|like=[[Special:Log]], [[Special:NewPages]] and [[Special:RecentChanges]]}}',
+'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]], 
+[[Special:Disambiguations]], 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}}',
+'specialpages-group-spam' => '{{doc-special-group}}',
 
 # Special:BlankPage
-'blankpage' => 'Used as page title in [[Special:BlankPage]].
-
+'blankpage' => '{{doc-special|BlankPage|unlisted=1}}
 See also:
 * {{msg-mw|Intentionallyblankpage|text}}',
 'intentionallyblankpage' => 'Text displayed in [[Special:BlankPage]].
@@ -8570,6 +8825,11 @@ See also:
 * stub threshold (appearance tab)
 
 {{Identical|Other}}',
+'htmlform-no' => 'Used in form, such as with radio buttons, for generic yes / no questions.
+{{Identical|No}}',
+'htmlform-yes' => 'Used in form, such as with radio buttons, for generic yes / no questions.
+{{Identical|Yes}}',
+'htmlform-chosen-placeholder' => 'Used as initial placeholder text in select multiple "chosen" input boxes',
 
 # SQLite database support
 'sqlite-has-fts' => 'Shown on [[Special:Version]].
@@ -8580,17 +8840,17 @@ Parameters:
 * $1 - version',
 
 # New logging system
-'logentry-delete-delete' => '{{Logentry}}',
-'logentry-delete-restore' => '{{Logentry}}',
-'logentry-delete-event' => '{{Logentry}}
+'logentry-delete-delete' => '{{Logentry|[[Special:Log/delete]]}}',
+'logentry-delete-restore' => '{{Logentry|[[Special:Log/delete]]}}',
+'logentry-delete-event' => '{{Logentry|[[Special:Log/delete]]}}
 {{Logentryparam}}
-* $3 is the name of the log page inside parenthesis',
-'logentry-delete-revision' => '{{Logentry}}
+* $3 - the name of the log page inside parenthesis',
+'logentry-delete-revision' => '{{Logentry|[[Special:Log/delete]]}}
 {{Logentryparam}}
-* $5 is the number of affected revisions of the page $3.',
-'logentry-delete-event-legacy' => '{{Logentry}}
-$3 is the name of the log page inside parenthesis',
-'logentry-delete-revision-legacy' => '{{Logentry}}',
+* $5 - the number of affected revisions of the page $3.',
+'logentry-delete-event-legacy' => '{{Logentry|[[Special:Log/delete]]}}
+* $3 - the name of the log page inside parenthesis',
+'logentry-delete-revision-legacy' => '{{Logentry|[[Special:Log/delete]]}}',
 'logentry-suppress-delete' => "{{Logentry}}
 
 'Hid' is a possible alternative to 'suppressed' in this message.",
@@ -8599,7 +8859,7 @@ $3 is the name of the log page inside parenthesis',
 $3 is the name of the log page inside parenthesis',
 'logentry-suppress-revision' => '{{Logentry}}
 {{Logentryparam}}
-* $5 is the number of affected revisions of the page $3.',
+* $5 - the number of affected revisions of the page $3.',
 'logentry-suppress-event-legacy' => '{{Logentry}}
 $3 is the name of the log page inside parenthesis',
 'logentry-suppress-revision-legacy' => '{{Logentry}}',
@@ -8643,52 +8903,51 @@ $3 is the name of the log page inside parenthesis',
 * {{msg-mw|logentry-delete-revision}}
 * {{msg-mw|logentry-suppress-event}}
 * {{msg-mw|logentry-suppress-event}}',
-'logentry-move-move' => '{{Logentry}}
+'logentry-move-move' => '{{Logentry|[[Special:Log/move]]}}
 Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-move-move-noredirect' => '{{Logentry}}
+'logentry-move-move-noredirect' => '{{Logentry|[[Special:Log/move]]}}
 Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-move-move_redir' => '{{Logentry}}
+'logentry-move-move_redir' => '{{Logentry|[[Special:Log/move]]}}
 Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-move-move_redir-noredirect' => '{{Logentry}}
+'logentry-move-move_redir-noredirect' => '{{Logentry|[[Special:Log/move]]}}
 Parameter $4, the target page, is also not visible to parser functions.',
-'logentry-patrol-patrol' => '{{Logentry}}
-* $4 is a formatted revision number, maybe linked to the diff.',
-'logentry-patrol-patrol-auto' => '{{Logentry}}
-* $4 is a formatted revision number, maybe linked to the diff.
+'logentry-patrol-patrol' => '{{Logentry|[[Special:Log/patrol]]}}
+* $4 - a formatted revision number, maybe linked to the diff.',
+'logentry-patrol-patrol-auto' => '{{Logentry|[[Special:Log/patrol]]}}
+* $4 - a formatted revision number, maybe linked to the diff.
 "Automatically" refers to users with autopatrol right who mark revisions automatically patrolled when editing.',
-'logentry-newusers-newusers' => 'Parameters:
-* $1 - user name',
-'logentry-newusers-create' => '{{Logentry}}
+'logentry-newusers-newusers' => '{{Logentry|[[Special:Log/newusers]]}}',
+'logentry-newusers-create' => '{{Logentry|[[Special:Log/newusers]]}}
 
 $4 is the gender of the target user.',
-'logentry-newusers-create2' => '{{Logentry}}
+'logentry-newusers-create2' => '{{Logentry|[[Special:Log/newusers]]}}
 
 $4 is the name of the user that was created.',
-'logentry-newusers-byemail' => '{{Logentry}}
+'logentry-newusers-byemail' => '{{Logentry|[[Special:Log/newusers]]}}
 
 $4 is the name of the user that was created.',
-'logentry-newusers-autocreate' => '{{Logentry}}
+'logentry-newusers-autocreate' => '{{Logentry|[[Special:Log/newusers]]}}
 
 $4 is the gender of the target user.',
-'logentry-rights-rights' => '*$1 - username
-*$2 - (see below)
-*$3 - username
-*$4 - list of user groups or {{msg-mw|Rightsnone}}
-*$5 - list of user groups or {{msg-mw|Rightsnone}}
+'logentry-rights-rights' => '* $1 - username
+* $2 - (see below)
+* $3 - username
+* $4 - list of user groups or {{msg-mw|Rightsnone}}
+* $5 - list of user groups or {{msg-mw|Rightsnone}}
 ----
-{{Logentry}}',
-'logentry-rights-rights-legacy' => '*$1 - username
-*$2 - (see below)
-*$3 - username
+{{Logentry|[[Special:Log/rights]]}}',
+'logentry-rights-rights-legacy' => '* $1 - username
+* $2 - (see below)
+* $3 - username
 ----
-{{Logentry}}',
-'logentry-rights-autopromote' => '*$1 - username
-*$2 - (see below)
-*$3 - (see below)
-*$4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}
-*$5 - comma separated list of new user groups
+{{Logentry|[[Special:Log/rights]]}}',
+'logentry-rights-autopromote' => '* $1 - username
+* $2 - (see below)
+* $3 - (see below)
+* $4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}
+* $5 - comma separated list of new user groups
 ----
-{{Logentry}}',
+{{Logentry|[[Special:Log/rights]]}}',
 'rightsnone' => 'Default rights for registered users.
 
 {{Identical|None}}',
index 17fcdef..c9d6c8f 100644 (file)
@@ -295,8 +295,6 @@ $messages = array(
 'tog-shownumberswatching' => "Rikuchiy hayk'a watiqaq ruraqkuna",
 'tog-oldsig' => "Kachkaqña silq'uy:",
 'tog-fancysig' => "Silq'uyta wiki qillqa hinata llamk'achiy (mana kikinmanta t'inkichaq silq'uy)",
-'tog-externaleditor' => "Kikinmanta hawa llamk'apunata llamk'achiy (kamayuqkunallapaq, antañiqiqniykipi sapaq allinkachinakuna kananmi. [//www.mediawiki.org/wiki/Manual:External_editors Astawan ñawiriy.])",
-'tog-externaldiff' => "Kikinmanta hawa ''diff'' (wakin kay) nisqata llamk'achiy (kamayuqkunallapaq, antañiqiqniykipi sapaq allinkachinakuna kananmi. [//www.mediawiki.org/wiki/Manual:External_editors Astawan ñawiriy.])",
 'tog-showjumplinks' => "«Chayman phinkiy» aypanalla t'inkikunata saqillay",
 'tog-uselivepreview' => "''Live preview'' nisqa ñawpaq qhawayta llamk'achiy (JavaScript) (llamiy aknaraq)",
 'tog-forceeditsummary' => "Ch'usaq llamk'apuy waqaychasqa kachkaptinqa ch'itiyay.",
@@ -311,6 +309,7 @@ $messages = array(
 'tog-showhiddencats' => 'Pakasqa katiguriyakunata rikuchiy',
 'tog-noconvertlink' => "T'inki suti t'ikrayman ama niy",
 'tog-norollbackdiff' => 'Ruraqpa hukchasqankunata kutichispa ama wakin kayta willaychu',
+'tog-useeditwarning' => "Yuyampaway p'anqata saqiptiy manaraq rurarqusqay hukchasqakunata waqaychaspay.",
 
 'underline-always' => "Hayk'appas",
 'underline-never' => "Mana hayk'appas",
@@ -535,7 +534,7 @@ $1",
 'newmessageslinkplural' => '{{PLURAL:$1|Musuq willaymi|Musuq willaykunam}}',
 'newmessagesdifflinkplural' => 'qayna {{PLURAL:$1|hukchasqapi|hukchasqakunapi}} wakin kaynin',
 'youhavenewmessagesmulti' => 'Musuq willaykunam qhawanayki kachkan $1-pi',
-'editsection' => 'allichay',
+'editsection' => "llamk'apuy",
 'editold' => "llamk'apuy",
 'viewsourceold' => 'pukyu qillqata qhaway',
 'editlink' => "llamk'apuy",
@@ -678,9 +677,18 @@ Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa
 'welcomecreation-msg' => 'Rakiqunaykiqa kamarisqañam.
 Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchayta.',
 'yourname' => 'Ruraq sutiyki:',
+'userlogin-yourname' => 'Ruraqpa sutin',
+'userlogin-yourname-ph' => 'Ruraqpa sutiykita yaykuchiy',
 'yourpassword' => 'Yaykuna rimayki',
+'userlogin-yourpassword' => 'Yaykuna rima',
+'userlogin-yourpassword-ph' => 'Yaykuna rimaykita yaykuchiy',
+'createacct-yourpassword-ph' => 'Yaykuna rimata yaykuchiy',
 'yourpasswordagain' => 'Yaykuna rimaykita kutipayay',
+'createacct-yourpasswordagain' => 'Yaykuna rimata takyachiy',
+'createacct-yourpasswordagain-ph' => 'Yaykuna rimata musuqmanta yaykuchiy',
 'remembermypassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy llamk'ay tiyayniypura ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
+'userlogin-remembermypassword' => 'Yaykusqa kakunaytam munani',
+'userlogin-signwithsecure' => "Amachasqa t'inkinakusqata llamk'achiy",
 'securelogin-stick-https' => "Yaykurquspa HTTPS nisqawan t'inkisqa kakuy",
 'yourdomainname' => 'Duminyuykip sutin',
 'password-change-forbidden' => 'Kay wikipi yaykuna rimataqa manam hukchayta atinkichu.',
@@ -693,14 +701,25 @@ Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] hukchay
 'logout' => 'Lluqsiy',
 'userlogout' => 'Lluqsiy',
 'notloggedin' => 'Manam yaykurqankichu',
+'userlogin-noaccount' => 'Rakiqunaykiri manachu kanchu?',
+'userlogin-joinproject' => '{{SITENAME}}man yaykuy',
 'nologin' => "Manaraqchu rakiqunaykichu kachkan? '''$1'''.",
 'nologinlink' => 'Kichariy',
 'createaccount' => 'Musuq rakiqunata kichariy',
 'gotaccount' => "Rakiqunaykiñachu kachkan? '''$1'''.",
 'gotaccountlink' => 'Rakiqunaykita willaway',
 'userlogin-resetlink' => 'Yaykuna willayniykikunatari qunqarqankichu?',
+'userlogin-resetpassword-link' => 'Yaykuna rimaykita kutichiy',
+'helplogin-url' => 'Help:Yaykuy',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Yaykunapaq yanapa]]',
+'createacct-join' => 'Kay qatiqpi willaykita yaykuchiy.',
+'createacct-emailrequired' => 'E-chaski imamayta',
+'createacct-emailoptional' => 'E-chaski imamayta (munaspayki)',
+'createacct-email-ph' => 'E-chaski imamaytaykita yaykuchiy',
 'createaccountmail' => "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa kay qatiqpi kaq e-chaski imamaytaman kachay",
+'createacct-realname' => 'Chiqap suti (munaspayki)',
 'createaccountreason' => 'Kayrayku:',
+'createacct-reason' => 'Kayrayku',
 'badretype' => 'Qusqayki yaykuna rimakunaqa manam kaqllachu.',
 'userexists' => 'Munasqayki ruraqpa sutiykiqa kachkanñam.
 Ama hina kaspa, huk ruraqpa sutiykita akllay.',
@@ -738,7 +757,7 @@ Huk runa kay willayta mañakurqaptinqa icha yaykuna rimaykita hukchayta manaña
 Ama hina kaspa, chaskispaykiqa ruraqpa sutiykita nispa musuqmanta yaykuy.',
 'blocked-mailpassword' => "IP tiyayniykiqa hark'asqam, chayrayku manam saqillanchu yaykuna rimata musuqmanta chaskiyta, millay rurayta hark'anapaq.",
 'eauthentsent' => 'Takyachina e-chaskiqa qusqayki e-chaski imamaytaman kachamusqam. Manaraq huk e-chaskikuna kachamusqa kaptinqa, ñawpaqta e-chaskipi kamachisqakunata qatinaykim tiyan, chiqap e-chaski imamaytaykita takyachinaykipaq.',
-'throttled-mailpassword' => "Huk yaykuna rima yuyachinañam qayna {{PLURAL:$1|huk ura|$1 ura}} mit'api kachamusqam. {{PLURAL:$1|Huk ura|$1 ura}} mit'apiqa hukllam yaykuna rima yuyachina kachasqa kachun millay rurayta hark'anapaq.",
+'throttled-mailpassword' => "Huk yaykuna rima kutichinapaq yuyachina qayna {{PLURAL:$1|huk ura|$1 ura}} mit'api kachamusqañam. {{PLURAL:$1|Huk ura|$1 ura}} mit'apiqa hukllam yaykuna rima yuyachina kachasqa kachun millay rurayta hark'anapaq.",
 'mailerror' => 'E-chaskita kachaspa pantasqa: $1',
 'acct_creation_throttle_hit' => "Qampa IP huchhaykiyuq kachkaq ruraqkunaqa kay wikita watukuspa ñaqha 24 urapi {{PLURAL:$1|rakiqunaykim|$1 rakiqunaykim}} kamarirqanña. Manam atinkichikchu astawan kichayta huklla p'unchawpi chay IP huchhallayuq kaspa.",
 'emailauthenticated' => "E-chaski imamaytaykiqa $2 p'unchawpi, $3 pachapi chiqapchasqañam.",
@@ -785,7 +804,7 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata
 
 # Special:PasswordReset
 'passwordreset' => 'Yaykuna rimata kutichiy',
-'passwordreset-text' => "Kay hunt'ana p'anqata hunt'ay, rakiqunaykipaq willakunayuq e-chaskita chaskinaykipaq.",
+'passwordreset-text' => "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
 'passwordreset-legend' => 'Yaykuna rimata kutichiy',
 'passwordreset-disabled' => 'Kay wikipiqa yaykuna rimata manam kutichiyta atinkichu.',
 'passwordreset-pretext' => '{{PLURAL:$1||Qatiqpi kaq willa rakikunamanta huktam yaykuchiy}}',
@@ -796,7 +815,7 @@ Yaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata
 'passwordreset-email' => 'E-chaski imamayta:',
 'passwordreset-emailtitle' => '{{SITENAME}}-paq rakiqunamanta willakuna',
 'passwordreset-emailtext-ip' => "Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) {{SITENAME}}-paq ($4)
-rakiqunaykipaq willakunayuq yuyachinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
+rakiqunaykipaq yaykuna rimata kutichinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
 kay e-chaski imamaytayuq kachkan:
 
 $2
@@ -806,7 +825,7 @@ Yaykuspayki musuq yaykuna rimaykitam akllankiman. Pi wakiykipas kayta mañakurqa
 icha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,
 kay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
 'passwordreset-emailtext-user' => "{{SITENAME}}-pi kaq $1 sutiyuq ruraqqa {{SITENAME}}-paq ($4)
-rakiqunaykipaq willakunayuq yuyachinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
+rakiqunaykipaq yaykuna rimata kutichinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}
 kay e-chaski imamaytayuq kachkan:
 
 $2
@@ -817,9 +836,9 @@ icha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,
 kay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
 'passwordreset-emailelement' => "Ruraqpa sutin: $1
 Mit'alla yaykuna rima: $2",
-'passwordreset-emailsent' => 'Yuyachina e-chaskiqa kachasqañam.',
-'passwordreset-emailsent-capture' => 'Yuyachina e-chaskiqa kachasqañam, kay qatiqpi rikunki.',
-'passwordreset-emailerror-capture' => 'Yuyachina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'E-chaski imamaytata wakinchay',
@@ -1018,6 +1037,8 @@ Kachkañam.",
 'defaultmessagetext' => 'Ñawpaq qillqa',
 'invalid-content-data' => 'Samiqmanta willaykunaqa manam allinchu',
 'content-not-allowed-here' => '"$1" nisqa samiqqa [[$2]] sutiyuq p\'anqapi manam saqillasqachu',
+'editwarning-warning' => "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.
+Yaykusqa kaspaykiqa, kay yuyampayta hark'ayta atinki allinkachinaykikunapi \"Llamk'apusqa\" rakipi.",
 
 # Content models
 'content-model-wikitext' => 'wiki qillqa',
@@ -1298,15 +1319,6 @@ Imaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy ha
 'search-external' => 'Hawapi maskay',
 'searchdisabled' => "{{SITENAME}} nisqapi maskaymanqa ama nisqam. Hinachkaptinqa, maskariy google nisqawan icha huk hawa maskanakunawan, ichataq yuyariy, {{SITENAME}}manta hallch'asqankunaqa manañachá musuqllachu.",
 
-# Quickbar
-'qbsettings' => 'Utqaytawna ("Quickbar") allinkachinakuna',
-'qbsettings-none' => 'Mana imapas',
-'qbsettings-fixedleft' => "Lluq'iman watay",
-'qbsettings-fixedright' => 'Pañaman watay',
-'qbsettings-floatingleft' => "Lluq'iman tuytuy",
-'qbsettings-floatingright' => 'Pañaman tuytuy',
-'qbsettings-directionality' => 'Watasqa, rimayniykip qillqa puririyninmanta wachariq',
-
 # Preferences page
 'preferences' => 'Allinkachinakuna',
 'mypreferences' => 'Allinkachinaykuna',
@@ -1834,7 +1846,6 @@ Lliwmanta aswan alliku kanapaqqa, img_auth.php manam atinchu.',
 'http-read-error' => 'HTTP ñawiriy pantasqa.',
 'http-timed-out' => "HTTP mañakuypa mit'anqa lluqsikusqañam.",
 'http-curl-error' => 'URL apamuypi pantasqa: $1',
-'http-host-unreachable' => 'Manam aypanichu URL-ta.',
 'http-bad-status' => 'HTTP mañakuypi sasachakuymi tukukurqan: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2240,8 +2251,8 @@ Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamayta
 'notvisiblerev' => 'Musuqchasqaqa qullusqam',
 'watchnochange' => "Manam ima watiqasqayki qillqapas llamk'apusqachu karqan rikuchisqa mit'api.",
 'watchlist-details' => "Watiqana sutisuyuykipiqa {{PLURAL:$1|huk p'anqam|$1 p'anqakunam}}, rimanakuna p'anqakunata mana yupaspa.",
-'wlheader-enotif' => 'E-chaskimanta musyachinaman arí nisqañam.',
-'wlheader-showupdated' => "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
+'wlheader-enotif' => 'E-chaskimanta musyachinaman arí nisqañam.',
+'wlheader-showupdated' => "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
 'watchmethod-recent' => "watiqasqayki p'anqakunapaq ñaqha hukchasqakunata llanchispa",
 'watchmethod-list' => "watiqasqayki p'anqakunata ñaqha hukchasqakunapaq llanchispa",
 'watchlistcontains' => "Watiqana sutisuyuykipiqa $1 {{PLURAL:$1|p'anqam|p'anqakunam}} kachkan.",
@@ -2936,26 +2947,15 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 
 # Stylesheets
 'common.css' => "/* Churamusqa CSS chantakunaqa tukuy qarakunapim llamk'anqa */",
-'standard.css' => "/* Churamusqa CSS chantakunaqa ''Standard skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-'nostalgia.css' => "/* Churamusqa CSS chantakunaqa ''Nostalgia skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
 'cologneblue.css' => "/* Churamusqa CSS chantakunaqa ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
 'monobook.css' => '/* Kayman churasqa CSS nisqaqa Monobook qaratam hukchanqa tukuy internet tiyanapaq */',
-'myskin.css' => "/* Churamusqa CSS chantakunaqa ''MySkin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-'chick.css' => "/* Churamusqa CSS chantakunaqa ''Chick skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
-'simple.css' => "/* Churamusqa CSS chantakunaqa ''Simple skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
 'modern.css' => "/* Churamusqa CSS chantakunaqa ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
 'print.css' => "/* Churamusqa CSS chantakunaqa ch'ipachinap rikch'akuynintam hukchanqa */",
-'handheld.css' => "/* Churamusqa CSS chantakunaqa makiwan hap'isqa qarapi tiksisqa \$wgHandheldStyle nisqapi allichasqa antakunap llamk'aynintam hukchanqa */",
 
 # Scripts
 'common.js' => "/* Ima kaypi kaq JavaScript qillqapas tukuy ruraqkunapaq tukuy p'anqakunap tukuy chaqnankunapi chaqnamusqa kanqa. */",
-'standard.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Standard skin'' nisqa sapsi qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'nostalgia.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Nostalgia skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
 'cologneblue.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
 'monobook.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas MonoBook nisqata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'myskin.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''MySkin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'chick.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Chick skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-'simple.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Simple skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
 'modern.js' => "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
 
 # Metadata
@@ -3081,7 +3081,7 @@ Payta rurachiyqa antañiqiqniykita llikaykitapas waqllinqachá.",
 'file-info-gif-looped' => 'muyupayachisqa',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|inchu|inchukuna}}',
 'file-info-png-looped' => 'muyupayachisqa',
-'file-info-png-repeat' => '$1 {{PLURAL:$1|kuti|kuti}} pukllasqa',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|kuti}} pukllasqa',
 'file-info-png-frames' => '$1 {{PLURAL:$1|inchu|inchukuna}}',
 'file-no-thumb-animation' => "'''Paqtataq: Saywachasqa allwiyaraykuqa, kay willañiqimanta rikch'achakuna manam kuyuchisqa kanqachu.'''",
 'file-no-thumb-animation-gif' => "'''Paqtataq: Saywachasqa allwiyaraykuqa, kay rikch'a hina k'awchi huyakuyuq GIF rikch'akunamanta rikch'achakuna manam kuyuchisqa kanqachu.'''",
@@ -3134,7 +3134,7 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Suni kay',
 'exif-imagelength' => 'Hanaq kay',
 'exif-bitspersample' => 'Bitkuna ñawpariqninman',
@@ -3312,7 +3312,7 @@ Kikin siq'ipi ima qatiq t'inkillapas sapaqllatam hamut'arisqa, ahinataq siq'ipi
 'exif-originalimageheight' => "Manaraq rutusqa rikch'ap hanaq kaynin",
 'exif-originalimagewidth' => "Manaraq rutusqa rikch'ap suni kaynin",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => "Mana mat'isqa",
 'exif-compression-2' => 'CCITT Huñu 3 1-tupu wakinchasqa Huffman purina suni llawiy',
 'exif-compression-3' => 'CCITT Huñu 3 tilifaks llawiy',
@@ -3712,13 +3712,6 @@ MediaWikitaqa mast'ariyku runakunata yanapanapaqmi, ichataq MANAM FIYAKUYTA ATIY
 'version-entrypoints-header-entrypoint' => "Yaykuna t'uksi",
 'version-entrypoints-header-url' => 'URL tiyay',
 
-# Special:FilePath
-'filepath' => 'Willañiqi ñan',
-'filepath-page' => 'Willañiqi:',
-'filepath-submit' => 'Riy',
-'filepath-summary' => "Kay sapaq p'anqaqa willañiqipaq tukuy ñannintam kutichin.
-Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapusqa wakichiwanmi chiqalla kicharikun.",
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Iskaychasqa willañiqikunata maskay',
 'fileduplicatesearch-summary' => "Iskaychasqa willañiqikunata maskay ''hash'' chaninpi tiksispa.",
@@ -3813,17 +3806,17 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 'sqlite-no-fts' => "$1 mana hunt'a qillqa maskana yanapawan",
 
 # New logging system
-'logentry-delete-delete' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
-'logentry-delete-restore' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullusqamanta paqarichin",
-'logentry-delete-event' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta wakinchan $3 p'anqapi: $4",
-'logentry-delete-revision' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta wakinchan $3 p'anqapi: $4",
-'logentry-delete-event-legacy' => "$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta wakinchan $3 p'anqapi",
-'logentry-delete-revision-legacy' => "$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta wakinchan $3 p'anqapi",
-'logentry-suppress-delete' => "$1 sutiyuq ruraqqa $3 nisqa p'anqatam ñit'ipan",
-'logentry-suppress-event' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
-'logentry-suppress-revision' => "$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
-'logentry-suppress-event-legacy' => "$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
-'logentry-suppress-revision-legacy' => "$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
+'logentry-delete-delete' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
+'logentry-delete-restore' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullusqamanta paqarichin",
+'logentry-delete-event' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta wakinchan $3 p'anqapi: $4",
+'logentry-delete-revision' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta wakinchan $3 p'anqapi: $4",
+'logentry-delete-event-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta wakinchan $3 p'anqapi",
+'logentry-delete-revision-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta wakinchan $3 p'anqapi",
+'logentry-suppress-delete' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam ñit'ipan",
+'logentry-suppress-event' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk hallch'ay|$5 hallch'ay}} ruraypa rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
+'logentry-suppress-revision' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa {{PLURAL:$5|huk musuqchasqap|$5 musuqchasqap}} rikunalla kayninta pakalla wakinchan $3 p'anqapi: $4",
+'logentry-suppress-event-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa hallch'ay ruraykunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
+'logentry-suppress-revision-legacy' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa musuqchasqakunap rikunalla kayninta pakalla wakinchan $3 p'anqapi",
 'revdelete-content-hid' => 'samiq pakasqa',
 'revdelete-summary-hid' => "llamk'apuypa pisichaynin pakasqa",
 'revdelete-uname-hid' => 'ruraqpa sutin pakasqa',
@@ -3832,17 +3825,20 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 'revdelete-uname-unhid' => 'ruraqpa sutin rikuchisqa',
 'revdelete-restricted' => "kamachiqkunaman llamk'achisqa saywachanakuna",
 'revdelete-unrestricted' => 'kamachiqkunamanta qichusqa saywachanakuna',
-'logentry-move-move' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man",
-'logentry-move-move-noredirect' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man mana pusapunata saqispa",
-'logentry-move-move_redir' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa",
-'logentry-move-move_redir-noredirect' => "$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa mana pusapunata saqispa",
-'logentry-patrol-patrol' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam patrullasqa nispa sananchan",
-'logentry-patrol-patrol-auto' => "$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam kikinmanta patrullasqa nispa sananchan",
-'logentry-newusers-newusers' => '$1 sutiyuq rakiquna kamarisqañam',
-'logentry-newusers-create' => '$1 sutiyuq rakiquna kamarisqañam',
-'logentry-newusers-create2' => '$1 sutiyuq ruraqqa $3 sutiyuq rakiqunatam kamarirqanñam',
-'logentry-newusers-byemail' => '$3 sutiyuq rakiqunataqa $1 kamarirqañam, yaykuna rimataq kachasqañam.',
-'logentry-newusers-autocreate' => '$1 sutiyuq rakiqunaqa kikinmanta kamarisqam',
+'logentry-move-move' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man",
+'logentry-move-move-noredirect' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man mana pusapunata saqispa",
+'logentry-move-move_redir' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa",
+'logentry-move-move_redir-noredirect' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa p'anqatam astan $3-manta $4-man pusapunata huknachaspa mana pusapunata saqispa",
+'logentry-patrol-patrol' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam patrullasqa nispa sananchan",
+'logentry-patrol-patrol-auto' => "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqamanta $4 musuqchasqatam kikinmanta patrullasqa nispa sananchan",
+'logentry-newusers-newusers' => '{{GENDER:$2|}}$1 sutiyuq rakiquna kamarisqañam',
+'logentry-newusers-create' => '{{GENDER:$2|}}$1 sutiyuq rakiquna kamarisqañam',
+'logentry-newusers-create2' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 sutiyuq rakiqunatam kamarirqanñam',
+'logentry-newusers-byemail' => '$3 sutiyuq rakiqunataqa $1 {{GENDER:$2|kamarirqañam}}, yaykuna rimataq kachasqañam.',
+'logentry-newusers-autocreate' => '{{GENDER:$2|}}$1 sutiyuq rakiqunaqa kikinmanta kamarisqam',
+'logentry-rights-rights' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa $3-pa huñuman kapuyninta hukchan $4-manta $5-man',
+'logentry-rights-rights-legacy' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa $3-pa huñuman kapuyninta hukchan',
+'logentry-rights-autopromote' => '{{GENDER:$2|}}$1 sutiyuq ruraqqa kikinmantam ñawparikun $4-manta $5-man',
 'rightsnone' => '(-)',
 
 # Feedback
index 79dbea3..d7c6e0c 100644 (file)
@@ -44,8 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => "Fam' avdè e' nòmar d'j utent ch'j tèn sta pàgina sot occ",
 'tog-oldsig' => 'Anteprèma dla fírma bona',
 'tog-fancysig' => "Tràta la firma cumpagna e' test int'la wiki (senza nissön ligam automatich)",
-'tog-externaleditor' => "Drova sempar un prugràma d'scritura esteran (editor testuale)",
-'tog-externaldiff' => 'Drova sempar un prugràma comparator esteran (sol par j utent espert)',
 'tog-showjumplinks' => "Fa' funzionè j leghèm d'acesibilitè tipo \"Va' a\"",
 'tog-uselivepreview' => 'Drova la funziòn "Anteprèma dal viv" (u j vo Javascript; sperimentêl)',
 'tog-forceeditsummary' => "Dam la vos quènd l'ugèt dla mudèfica l'è vut",
@@ -476,7 +474,7 @@ $1 {{PLURAL:$1|elemént|elemént}}',
 # Special:ListGroupRights
 'listgrouprights-members' => "(Lèsta d'j mèmbar)",
 
-# E-mail user
+# Email user
 'emailuser' => 'Manda un scrètt a ste patàca',
 
 # Watchlist
index d5fb568..63cf5da 100644 (file)
@@ -514,7 +514,7 @@ Tasniwin di [[Special:Watchlist|your watchlist]] d '''tizurarin'''.",
 # Special:ListUsers
 'listusers-submit' => 'Smmrad',
 
-# E-mail user
+# Email user
 'emailuser' => 'Ssek E-mail i bnadm a',
 
 # Watchlist
index 8890581..db311ea 100644 (file)
@@ -72,8 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => "Mussar il dumber d'utilisaders che obervan questa pagina",
 'tog-oldsig' => 'Signatura actuala:',
 'tog-fancysig' => "Suttascripziun senza link automatic tar la pagina da l'utilisader.",
-'tog-externaleditor' => 'Utilisar sco standard in editur extern (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
-'tog-externaldiff' => 'Utilisar sco standard in program extern per visualisar differenzas tranter versiuns (be per experts, basegna ina configuraziun speziala da des computer. [//www.mediawiki.org/wiki/Manual:External_editors Dapli infurmaziuns.])',
 'tog-showjumplinks' => 'Activar las colliaziuns "seglir a"',
 'tog-uselivepreview' => 'Utilisar la prevista dinamica (basegna JavaScript) (experiment!)',
 'tog-forceeditsummary' => 'Avertir durant memoriar sche la resumaziun manca',
@@ -1113,15 +1111,6 @@ Scriva il prefix ''all:'' avant il term che ti vuls tschertgar, per tschertgar e
 Ti pos tschertgar en il fratemp cun Google. 
 Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli actualas.",
 
-# Quickbar
-'qbsettings' => 'Glista laterala',
-'qbsettings-none' => 'Nagins',
-'qbsettings-fixedleft' => 'Sanester, fixà',
-'qbsettings-fixedright' => 'Dretg, fixà',
-'qbsettings-floatingleft' => 'Sanester, flottand',
-'qbsettings-floatingright' => 'Dretg, flottand',
-'qbsettings-directionality' => 'Fixà, dependent da la direcziun da scriver da tia lingua',
-
 # Preferences page
 'preferences' => 'Preferenzas',
 'mypreferences' => 'Preferenzas',
@@ -1672,7 +1661,6 @@ Per cuntanscher segirezza opgimala è img_auth.php deactivà.",
 'http-read-error' => 'Sbagl da leger HTTP.',
 'http-timed-out' => 'Surpassà il temp durant la dumonda HTTP.',
 'http-curl-error' => "Errur cun recuperar l'URL: $1",
-'http-host-unreachable' => "Impussibel da cuntanscher l'URL.",
 'http-bad-status' => 'Durant la dumonda HTTP è ina errur capitada: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2081,8 +2069,8 @@ Midadas futuras vid questa pagina e la pagina da discussiun appertegnenta vegnan
 'notvisiblerev' => "L'ultima versiun d'in auter utilisader è vegnida stizzada",
 'watchnochange' => 'Nagin dals artitgels che ti observeschas è vegnì midà durant la perioda da temp inditgada.',
 'watchlist-details' => "{{PLURAL:$1|Ina pagina|$1 paginas}} èn sin tia glista d'observaziun (senza dumbrar las paginas da discussiun).",
-'wlheader-enotif' => "Il servetsch d'infurmaziun per e-mail è activà.",
-'wlheader-showupdated' => "Artitgels ch'èn vegnids midads suenter che ti has vis els la davosa giada èn mussads '''grass'''",
+'wlheader-enotif' => "Il servetsch d'infurmaziun per e-mail è activà.",
+'wlheader-showupdated' => "Artitgels ch'èn vegnids midads suenter che ti has vis els la davosa giada èn mussads '''grass'''",
 'watchmethod-recent' => "intercurir las davosas midadas per la glista d'observaziun",
 'watchmethod-list' => 'intercurir las paginas observadas davart novas midadas',
 'watchlistcontains' => "Tia glista d'observaziun cuntegna $1 {{PLURAL:$1|pagina|paginas}}.",
@@ -2332,7 +2320,7 @@ $1',
 'blanknamespace' => '(principal)',
 
 # Contributions
-'contributions' => "Contribuziuns {{GENDER:$1|dautilisader|da l'utilisadra}}",
+'contributions' => "Contribuziuns {{GENDER:$1|da l'utilisader|da l'utilisadra}}",
 'contributions-title' => "Contribuziuns d'utilisader da $1",
 'mycontris' => 'Contribuziuns',
 'contribsub2' => 'Per $1 ($2)',
@@ -2998,7 +2986,7 @@ Sche la datoteca è vegnida midada dal status original èn tscherts detagls even
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ladezza',
 'exif-imagelength' => 'Autezza',
 'exif-bitspersample' => 'Bits per cumponenta da colur',
@@ -3176,7 +3164,7 @@ Sche la datoteca è vegnida midada dal status original èn tscherts detagls even
 'exif-originalimageheight' => 'Autezza avant tagliar',
 'exif-originalimagewidth' => 'Ladezza avant tagliar',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Betg cumprimà',
 'exif-compression-2' => 'GGITT gruppa 3 codaziun da lunghezza currenta Hufman modifitgada en 1 dimensiun',
 'exif-compression-3' => 'CCITT gruppa 3 codaziun da fax',
@@ -3592,15 +3580,6 @@ Ti duessas avair retschavì [{{SERVER}}{{SCRIPTPATH}}/COPYING ina copia da la GN
 'version-entrypoints-header-entrypoint' => "Punct d'entrada",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Percurs da la datoteca',
-'filepath-page' => 'Datoteca:',
-'filepath-submit' => 'Dai',
-'filepath-summary' => 'Questa pagina speciala inditgescha l\'adressa cumpletta per ina datoteca. 
-Maletgs vegnan mussads en resoluziun cumpletta, auters tips da datoteca vegnan averts directamain cun lur program assozià. 
-
-Endatescha il num da datoteca senza il prefix "{{ns:file}}:".',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Tschertgar datotecas dublas',
 'fileduplicatesearch-summary' => 'Tschertgar datotecas dublas a basa da valurs da hash.',
index 3910671..9cae704 100644 (file)
@@ -84,7 +84,6 @@ $messages = array(
 
 # Cologne Blue skin
 'qbedit' => 'Editisar',
-'qbpageinfo' => 'Patrinyake janglimata',
 'qbspecialpages' => 'Uzalutne patrya',
 
 'errorpagetitle' => 'Dosh',
@@ -169,9 +168,6 @@ $messages = array(
 'logouttext' => "'''Akana san avryal i {{SITENAME}}.'''
 
 Shai te labyares {{SITENAME}} sar ekh bijanglo jeno vai shai te prinjares tut palem sar o jeno le kadale navesa vai le aver navesa.",
-'welcomecreation' => '== Mishto avilyan, $1! ==
-
-Akana si tuke ekh akont. Te na bistares te paruves, kana trebul tuke, tire kamimata kai {{SITENAME}}.',
 'yourname' => 'Tiro anav',
 'yourpassword' => 'O nakhavipnasko lav',
 'yourpasswordagain' => 'O nakhavipnasko lav de nevo',
@@ -371,7 +367,7 @@ Kana avilyan kathe doshatar, ja palpale.',
 'allarticles' => 'Sa le artikolurya',
 'allpagessubmit' => 'Ja',
 
-# E-mail user
+# Email user
 'emailuser' => 'Bichhal les/la e-mail',
 'emailfrom' => 'Katar',
 'emailto' => 'Karing',
@@ -391,7 +387,6 @@ Kana kamesa te khoses kadaya patrin andar tiri lista le patryange so arakhes len
 'wlnote' => 'Tele si le palutne $1 paruvimata ande palutne <b>$2</b> ore.',
 
 'enotif_reset' => 'Thov semno kai patrya so dikhlem',
-'enotif_newpagetext' => 'Kadaya si ek nevi patrin.',
 
 # Delete
 'deletepage' => 'Khos i patrin',
index 5aacdd2..7fa1a6c 100644 (file)
@@ -328,8 +328,6 @@ pe titlul secțiunii (JavaScript)',
 '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-externaleditor' => 'Utilizează, în mod implicit, un editor extern (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
-'tog-externaldiff' => 'Utilizează, în mod implicit, un program extern pentru diferențele între versiuni (Doar pentru experți; necesită setări speciale pe calculatorul dumneavoastră. [//www.mediawiki.org/wiki/Manual:External_editors Mai multe informații.])',
 'tog-showjumplinks' => 'Activează legăturile de accesibilitate „sari la”',
 'tog-uselivepreview' => 'Folosește previzualizarea în timp real (JavaScript) (experimental)',
 'tog-forceeditsummary' => 'Avertizează-mă când uit să descriu modificările',
@@ -344,6 +342,7 @@ pe titlul secțiunii (JavaScript)',
 'tog-showhiddencats' => 'Arată categoriile ascunse',
 'tog-noconvertlink' => 'Dezactivează conversia titlurilor',
 'tog-norollbackdiff' => 'Nu arăta diferența după efectuarea unei reveniri',
+'tog-useeditwarning' => 'Avertizează-mă când părăsesc o pagină fără a salva modificările',
 
 'underline-always' => 'Întotdeauna',
 'underline-never' => 'Niciodată',
@@ -407,6 +406,18 @@ pe titlul secțiunii (JavaScript)',
 'oct' => 'oct',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 ianuarie',
+'february-date' => '$1 februarie',
+'march-date' => '$1 martie',
+'april-date' => '$1 aprilie',
+'may-date' => '$1 mai',
+'june-date' => '$1 iunie',
+'july-date' => '$1 iulie',
+'august-date' => '$1 august',
+'september-date' => '$1 septembrie',
+'october-date' => '$1 octombrie',
+'november-date' => '$1 noiembrie',
+'december-date' => '$1 decembrie',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorie|Categorii}}',
@@ -717,9 +728,18 @@ Sesiunea dumneavoastră la {{SITENAME}} a fost închisă. Puteți continua să f
 'welcomecreation-msg' => 'Contul dumneavoastră a fost creat.
 Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SITENAME}}.',
 'yourname' => 'Nume de utilizator:',
+'userlogin-yourname' => 'Nume de utilizator',
+'userlogin-yourname-ph' => 'Introduceți numele de utilizator',
 'yourpassword' => 'Parolă:',
+'userlogin-yourpassword' => 'Parolă',
+'userlogin-yourpassword-ph' => 'Introduceți parola',
+'createacct-yourpassword-ph' => 'Introduceți o parolă',
 'yourpasswordagain' => 'Repetați parola:',
+'createacct-yourpasswordagain' => 'Confirmare parolă',
+'createacct-yourpasswordagain-ph' => 'Introduceți parola din nou',
 'remembermypassword' => 'Autentificare automată de la acest calculator (expiră după {{PLURAL:$1|24 de ore|$1 zile|$1 de zile}})',
+'userlogin-remembermypassword' => 'Păstrează-mă autentificat',
+'userlogin-signwithsecure' => 'Utilizează conexiunea securizată',
 'securelogin-stick-https' => 'Rămâi conectat la HTTPS după autentificare',
 'yourdomainname' => 'Domeniul dumneavoastră:',
 'password-change-forbidden' => 'Nu puteți schimba parole pe acest wiki.',
@@ -732,18 +752,38 @@ Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SI
 'logout' => 'Închidere sesiune',
 'userlogout' => 'Închide sesiunea',
 'notloggedin' => 'Nu sunteți autentificat',
+'userlogin-noaccount' => 'Nu aveți cont încă?',
+'userlogin-joinproject' => 'Înscrieți-vă la {{SITENAME}}',
 'nologin' => "Nu aveți cont încă? '''$1'''.",
 'nologinlink' => 'Creați-vă un cont de utilizator acum',
 'createaccount' => 'Creare cont',
 'gotaccount' => "Aveți deja un cont de utilizator? '''$1'''.",
 'gotaccountlink' => 'Autentificați-vă',
 'userlogin-resetlink' => 'Ați uitat datele de autentificare?',
-'createaccountmail' => 'Utilizează o parolă temporară aleasă la întâmplare și o trimite la adresa de e-mail specificată mai jos',
+'userlogin-resetpassword-link' => 'Resetare parolă',
+'helplogin-url' => 'Help:Autentificare',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajutor la autentificare]]',
+'createacct-join' => 'Introduceți-vă informațiile mai jos.',
+'createacct-emailrequired' => 'Adresă de e-mail',
+'createacct-emailoptional' => 'Adresă de e-mail (opțională)',
+'createacct-email-ph' => 'Introduceți adresa dumnevoastră de e-mail',
+'createaccountmail' => 'Utilizează o parolă temporară aleasă la întâmplare și o trimite la adresa de e-mail indicată mai jos',
+'createacct-realname' => 'Nume real (opțional)',
 '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-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ă.',
 'userexists' => 'Numele de utilizator pe care l-ați introdus este deja folosit.
 Vă rugăm să alegeți un alt nume.',
 'loginerror' => 'Eroare de autentificare',
+'createacct-error' => 'Eroare la crearea contului',
 'createaccounterror' => 'Nu pot crea contul: $1',
 'nocookiesnew' => 'Contul a fost creat, dar nu sunteți autentificat{{GENDER:||ă|}}. {{SITENAME}} folosește module cookie pentru a reține utilizatorii autentificați. Navigatorul dumneavoastră are aceste module cookie dezactivate. Vă rugăm să le activați și să vă reautentificați folosind noul nume de utilizator și noua parolă.',
 'nocookieslogin' => '{{SITENAME}} folosește module cookie pentru a autentifica utilizatorii. Browser-ul dvs. are cookie-urile dezactivate. Vă rugăm să le activați și să incercați din nou.',
@@ -810,10 +850,10 @@ Vă rugăm să așteptați până să mai încercați.',
 'user-mail-no-body' => 'S-a încercat trimiterea unui e-mail fără conținut sau nejustificat de scurt.',
 
 # Change password dialog
-'resetpass' => 'Modifică parola',
+'resetpass' => 'Modificare parolă',
 'resetpass_announce' => 'Sunteți autentificat cu un cod temporar trimis pe e-mail. Pentru a termina acțiunea de autentificare, trebuie să setați o parolă nouă aici:',
 'resetpass_text' => '<!-- Adăugați text aici -->',
-'resetpass_header' => 'Modifică parola',
+'resetpass_header' => 'Modificare parolă',
 'oldpassword' => 'Parola veche:',
 'newpassword' => 'Parola nouă:',
 'retypenew' => 'Reintroduceți noua parolă:',
@@ -826,13 +866,15 @@ Vă rugăm să așteptați până să mai încercați.',
 'resetpass-wrong-oldpass' => 'Parolă curentă sau temporară incorectă.
 Este posibil să fi reușit deja schimbarea parolei sau să fi cerut o parolă temporară nouă.',
 'resetpass-temp-password' => 'Parolă temporară:',
+'resetpass-abort-generic' => 'Schimbarea parolei a fost anulată de către o extensie.',
 
 # Special:PasswordReset
 'passwordreset' => 'Resetare parolă',
-'passwordreset-text' => 'Completați acest formular pentru a vă reseta parola.',
+'passwordreset-text-one' => 'Completați acest formular pentru a vă reseta parola.',
+'passwordreset-text-many' => '{{PLURAL:$1|Introduceți una din aceste informații pentru a vă reseta parola.}}',
 'passwordreset-legend' => 'Resetare parolă',
 'passwordreset-disabled' => 'Resetarea parolei a fost dezactivată pe acest wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Introduceți mai jos o parte din informații}}',
+'passwordreset-emaildisabled' => 'Funcțiile de e-mail au fost dezactivate de pe acest wiki.',
 'passwordreset-username' => 'Nume de utilizator:',
 'passwordreset-domain' => 'Domeniu:',
 'passwordreset-capture' => 'Vizualizați e-mailul rezultat?',
@@ -859,7 +901,7 @@ Ar trebui să vă autentificați și să alegeți acum o nouă parolă. Dacă al
 Parolă temporară: $2',
 'passwordreset-emailsent' => 'A fost trimis 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 utilizator a eșuat: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Modificare adresă de e-mail',
@@ -1074,12 +1116,15 @@ Nicio explicație furnizată.',
 Se pare că a fost ștearsă.',
 'edit-conflict' => 'Conflict de modificare.',
 'edit-no-change' => 'Modificarea dvs. a fost ignorată deoarece nu s-a efectuat nicio schimbare.',
+'postedit-confirmation' => 'Modificarea dumneavoastră a fost salvată.',
 'edit-already-exists' => 'Pagina nouă nu a putut fi creată.
 Ea există deja.',
 'defaultmessagetext' => 'Textul implicit',
 'content-failed-to-parse' => 'Nu s-a putut analiza conținutul de tip $2 pentru modelul $1: $3',
 'invalid-content-data' => 'Date de conținut invalide',
 'content-not-allowed-here' => 'Conținutul de tip „$1” nu este permis pe pagina [[$2]]',
+'editwarning-warning' => 'Părăsind această pagină, există riscul pierderii modificărilor efectuate.
+Dacă sunteți autentificat, puteți dezactiva această avertizare în secțiunea „Modificare” a preferințelor dumneavoastră.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1284,7 +1329,7 @@ Folosirea linkurilor de navigare va reseta această coloană.',
 'mergelogpagetext' => 'Mai jos este o listă a celor mai recente combinări ale istoricului unei pagini cu al alteia.',
 
 # Diffs
-'history-title' => '$1: Istoricul versiunilor',
+'history-title' => 'Istoricul versiunilor pentru „$1”',
 'difference-title' => '$1: Diferență între versiuni',
 'difference-title-multipage' => '$1 și $2: Diferență între pagini',
 'difference-multipage' => '(Diferență între pagini)',
@@ -1361,15 +1406,7 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'powersearch-togglenone' => 'Nimic',
 'search-external' => 'Căutare externă',
 'searchdisabled' => '<p>Ne pare rău! Căutarea după text a fost dezactivată temporar, din motive de performanță. Între timp puteți folosi căutarea prin Google mai jos, însă aceasta poate să dea rezultate învechite.</p>',
-
-# Quickbar
-'qbsettings' => 'Setări pentru bara rapidă',
-'qbsettings-none' => 'Fără',
-'qbsettings-fixedleft' => 'Fixă, în stânga',
-'qbsettings-fixedright' => 'Fixă, în dreapta',
-'qbsettings-floatingleft' => 'Liberă',
-'qbsettings-floatingright' => 'Plutire la dreapta',
-'qbsettings-directionality' => 'Fixat, în funcție de direcția în care se face scrierea în limba dumneavoastră',
+'search-error' => 'A apărut o eroare în timpul căutării: $1',
 
 # Preferences page
 'preferences' => 'Preferințe',
@@ -1377,7 +1414,7 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'prefs-edits' => 'Număr de modificări:',
 'prefsnologin' => 'Neautentificat',
 'prefsnologintext' => 'Trebuie să fiți <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} autentificat]</span> pentru a vă putea salva preferințele.',
-'changepassword' => 'Schimbă parola',
+'changepassword' => 'Schimbare parolă',
 'prefs-skin' => 'Aspect',
 'skin-preview' => 'Previzualizare',
 'datedefault' => 'Nici o preferință',
@@ -1514,6 +1551,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'userrights-notallowed' => 'Contul dumneavoastră nu are permisiunea de a acorda sau elimina drepturi utilizatorilor.',
 'userrights-changeable-col' => 'Grupuri pe care le puteți schimba',
 'userrights-unchangeable-col' => 'Grupuri pe care nu le puteți schimba',
+'userrights-conflict' => 'Conflict al drepturilor de utilizator! Aplicați din nou modificările dumneavoastră.',
 
 # Groups
 'group' => 'Grup:',
@@ -1915,7 +1953,6 @@ Pentru securitate optimă, img_auth.php este dezactivat.',
 'http-read-error' => 'S-a produs o eroare în timpul citirii HTTP.',
 'http-timed-out' => 'Cererea HTTP a expirat.',
 'http-curl-error' => 'Eroare la preluarea adresei URL: $1',
-'http-host-unreachable' => 'Adresa URL nu a putut fi accesată.',
 'http-bad-status' => 'A apărut o problemă în timpul solicitării HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2069,7 +2106,7 @@ Lista tipurilor MIME recunoscute de MediaWiki poate fi găsită la [http://svn.w
 'statistics-pages' => 'Pagini',
 'statistics-pages-desc' => 'Toate paginile din wiki, inclusiv pagini de discuție, redirectări etc.',
 'statistics-files' => 'Fișiere încărcate',
-'statistics-edits' => 'Editări de la instalarea {{SITENAME}}',
+'statistics-edits' => 'Modificări de la instalarea proiectului {{SITENAME}}',
 'statistics-edits-average' => 'Media editărilor pe pagină',
 'statistics-views-total' => 'Număr de vizualizări',
 'statistics-views-total-desc' => 'Vizualizările paginilor inexistente și a paginilor speciale nu sunt incluse',
@@ -2339,8 +2376,8 @@ Modificările viitoare efectuate asupra acestei pagini dar și asupra paginii de
 'notvisiblerev' => 'Versiunea a fost ștearsă',
 'watchnochange' => 'Nici una dintre paginile pe care le urmăriți nu a fost modificată în perioada de timp afișată.',
 'watchlist-details' => '{{PLURAL:$1|O pagină|$1 pagini urmărite|$1 de pagini urmărite}}, excluzând paginile de discuție.',
-'wlheader-enotif' => '*Notificarea email este activată',
-'wlheader-showupdated' => "* Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate '''îngroșat'''",
+'wlheader-enotif' => 'Notificarea prin e-mail este activată.',
+'wlheader-showupdated' => "Paginile care au fost modificate ulterior accesării lor ultima dată de către dumneavoastră sunt '''îngroșate'''.",
 'watchmethod-recent' => 'căutarea schimbărilor recente pentru paginile urmărite',
 'watchmethod-list' => 'căutarea paginilor urmărite pentru schimbări recente',
 'watchlistcontains' => 'Lista de pagini urmărite conține $1 {{PLURAL:$1|element|elemente|de elemente}}.',
@@ -2525,7 +2562,7 @@ Puteți schimba nivelul de protejare al acestei pagini, dar asta nu va afecta pr
 'undelete' => 'Recuperare pagină ștearsă',
 'undeletepage' => 'Vizualizare și recuperare pagini șterse',
 'undeletepagetitle' => "'''Această listă cuprinde versiuni șterse ale paginii [[:$1|$1]].'''",
-'viewdeletedpage' => 'Vezi paginile șterse',
+'viewdeletedpage' => 'Vizualizare pagini șterse',
 '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}}'''''.
@@ -2750,6 +2787,7 @@ Vă rugăm să vă contactați furnizorul de servicii Internet sau tehnicienii I
 'sorbsreason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în DNSBL.',
 'sorbs_create_account_reason' => 'Adresa dumneavoastră IP este listată ca un proxy deschis în lista neagră DNS.
 Nu vă puteți crea un cont',
+'xffblockreason' => 'O adresă IP prezentă în antetul X-Forwarded-For — fie a dumneavoastră, fie a serverului proxy pe care îl folosiți — a fost blocată. Motivul original al blocării a fost: $1',
 'cant-block-while-blocked' => 'Nu puteți bloca alți utilizatori în timp ce sunteți dumneavoastră înșivă blocat.',
 'cant-see-hidden-user' => 'Utilizatorul pe care încercați să îl blocați este deja blocat și ascuns. Atata timp cât nu aveți drept de hideuser, nu puteți vedea sau modifica blocarea acestuia.',
 'ipbblocked' => 'Nu puteți bloca sau debloca alți utilizatori în timp ce sunteți dumneavoastră înșivă blocat.',
@@ -2918,6 +2956,8 @@ Vă rugăm să vizitați [//www.mediawiki.org/wiki/Localisation MediaWiki Locali
 'thumbnail-more' => 'Extindere',
 'filemissing' => 'Fișier lipsă',
 'thumbnail_error' => 'Eroare la generarea previzualizării: $1',
+'thumbnail_error_remote' => 'Mesaj de eroare de la $1:
+$2',
 'djvu_page_error' => 'Numărul paginii DjVu eronat',
 'djvu_no_xml' => 'Imposibil de obținut XML-ul pentru fișierul DjVu',
 'thumbnail-temp-create' => 'Imposibil de creat miniatura temporară',
@@ -3068,13 +3108,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 
 # Stylesheets
 'common.css' => '/** CSS plasate aici vor fi aplicate tuturor aparițiilor */',
-'standard.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Standard */',
-'nostalgia.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Nostalgia  */',
 'cologneblue.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Cologne Blue */',
 'monobook.css' => '/* modificați acest fișier pentru a adapta înfățișarea monobook-ului pentru tot situl*/',
-'myskin.css' => '/* CSS plasate aici vor afecta utilizatorii stilului MySkin */',
-'chick.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Chick */',
-'simple.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Simple */',
 'modern.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Modern */',
 'vector.css' => '/* CSS plasate aici vor afecta utilizatorii stilului Vector */',
 'print.css' => '/* CSS plasate aici vor afecta modul în care paginile vor fi imprimate */',
@@ -3150,13 +3185,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'pageinfo-category-files' => 'Număr de fișiere',
 
 # Skin names
-'skinname-standard' => 'Clasic',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Albastru de Cologne',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'StilulMeu',
-'skinname-chick' => 'Șic',
-'skinname-simple' => 'Simplu',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3236,11 +3266,25 @@ Executându-l, sistemul dvs. poate fi compromis.",
 'minutes' => '{{PLURAL:$1|un minut|$1 minute|$1 de minute}}',
 'hours' => '{{PLURAL:$1|o oră|$1 ore|$1 de ore}}',
 'days' => '{{PLURAL:$1|o zi|$1 zile|$1 de zile}}',
+'weeks' => '{{PLURAL:$1|$1 săptămână|$1 săptămâni|$1 de săptămâni}}',
 'months' => '{{PLURAL:$1|$1 lună|$1 luni|$1 de luni}}',
 'years' => '{{PLURAL:$1|$1 an|$1 ani|$1 de ani}}',
 'ago' => '$1 în urmă',
 'just-now' => 'Chiar acum',
 
+# Human-readable timestamps
+'hours-ago' => 'acum $1 {{PLURAL:$1|oră|ore|de ore}}',
+'minutes-ago' => 'acum $1 {{PLURAL:$1|minut|minute|de minute}}',
+'seconds-ago' => 'acum {{PLURAL:$1|o secundă|$1 secunde|$1 de secunde}}',
+'monday-at' => 'Luni, la $1',
+'tuesday-at' => 'Marți, la $1',
+'wednesday-at' => 'Miercuri, la $1',
+'thursday-at' => 'Joi,la $1',
+'friday-at' => 'Vineri, la $1',
+'saturday-at' => 'Sâmbătă, la $1',
+'sunday-at' => 'Duminică, la $1',
+'yesterday-at' => 'Ieri, la $1',
+
 # Bad image list
 'bad_image_list' => 'Formatul este următorul:
 
@@ -3272,7 +3316,7 @@ Altele vor fi ascunse implicit.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lățime',
 'exif-imagelength' => 'Înălțime',
 'exif-bitspersample' => 'Biți pe componentă',
@@ -3450,7 +3494,7 @@ Altele vor fi ascunse implicit.
 'exif-originalimageheight' => 'Înălțimea imaginii înainte de trunchiere',
 'exif-originalimagewidth' => 'Lățimea imaginii înainte de trunchiere',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Necomprimată',
 'exif-compression-2' => 'CCITT Grupa 3 Lungimea codificării Huffman modificată de dimensiune 1',
 'exif-compression-3' => 'CCITT Grupa 3 codificare fax',
@@ -3856,12 +3900,17 @@ MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GAR
 'version-entrypoints-header-entrypoint' => 'Punct de intrare',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Cale fișier',
-'filepath-page' => 'Fișier:',
-'filepath-submit' => 'Du-te',
-'filepath-summary' => 'Această pagină specială recreează calea completă a fișierului.
-Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fișiere vor porni direct în programele asociate.',
+# Special:Redirect
+'redirect' => 'Redirecționare după fișier, utilizator sau ID-ul versiunii',
+'redirect-legend' => 'Redirecționare către un fișier sau o pagină',
+'redirect-summary' => 'Această pagină specială vă redirecționează către un fișier (dat fiind un nume de fișier), o pagină (dat fiind ID-ul unei versiuni) sau o pagină de utilizator (dat fiind un ID numeric al utilizatorului).',
+'redirect-submit' => 'Du-te',
+'redirect-lookup' => 'Căutare:',
+'redirect-value' => 'Valoare:',
+'redirect-user' => 'ID utilizator',
+'redirect-revision' => 'Versiune de pagină',
+'redirect-file' => 'Nume de fișier',
+'redirect-not-exists' => 'Valoarea nu a fot găsită',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Căutare fișiere duplicate',
@@ -3952,6 +4001,9 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'htmlform-submit' => 'Trimite',
 'htmlform-reset' => 'Anulează modificările',
 'htmlform-selectorother-other' => 'Altul',
+'htmlform-no' => 'Nu',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Alegeți o opțiune',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 cu suport de căutare în tot textul',
index 12057d0..1d48931 100644 (file)
@@ -54,10 +54,6 @@ $messages = array(
 'tog-shownumberswatching' => "Fa vedè 'u numere de le utinde ca uardene",
 'tog-oldsig' => 'Firme esistende:',
 'tog-fancysig' => "Firma grezze cumme a 'nu teste de Uicchi (senza collegamende automatiche)",
-'tog-externaleditor' => "Ause n'editore esterne pe default (sulamende pe l'esperte, abbesogne de 'na configurazione speciele sus a 'u combiuter tune. <br />
-[//www.mediawiki.org/wiki/Manual:External_editors Pe cchiù 'mbormaziune.])",
-'tog-externaldiff' => "Ause 'na differenze esterne pe default (sulamende pe l'esperte, abbesogne de 'na configuraziona speciele sus a 'u computer tune. <br />
-[//www.mediawiki.org/wiki/Manual:External_editors More information.])",
 'tog-showjumplinks' => 'Abbilite "zumbe a" pe scè sus a le collegaminde',
 'tog-uselivepreview' => "Ause l'andeprime da 'u vive (JavaScript) (Sperimendale)",
 'tog-forceeditsummary' => "Ciércame conferme quanne stoche a 'nzerische 'nu riepighe vianghe",
@@ -72,6 +68,7 @@ $messages = array(
 'tog-showhiddencats' => 'Fa vedè le categorije scunnute',
 'tog-noconvertlink' => "Disabbilite 'a conversione d'u titele de collegamende",
 'tog-norollbackdiff' => "Non sce penzanne a le differenze apprisse l'esecuzione de 'nu rollback",
+'tog-useeditwarning' => "Avvisave quanne jie lasse 'na pàgene cangiate senze ca agghie sarvate le cangiaminde",
 
 'underline-always' => 'Sembre',
 'underline-never' => 'Maje',
@@ -135,6 +132,18 @@ $messages = array(
 'oct' => 'Ott',
 'nov' => 'Nov',
 'dec' => 'Dec',
+'january-date' => 'Scennare $1',
+'february-date' => 'Febbrare $1',
+'march-date' => 'Màrze $1',
+'april-date' => 'Abbrile $1',
+'may-date' => 'Màsce $1',
+'june-date' => 'Sciugne $1',
+'july-date' => 'Luglie $1',
+'august-date' => 'Aguste $1',
+'september-date' => 'Settemmre $1',
+'october-date' => 'Ottommre $1',
+'november-date' => 'Novemmre $1',
+'december-date' => 'Decemmre $1',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categorije|Categorije}}',
@@ -454,9 +463,18 @@ Note Bbuene ca certe pàggene ponne condinuà a essere viste cumme ce tu ste ang
 'welcomecreation-msg' => "'U cunde tue ha state ccrejete.
 No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze tue]].",
 'yourname' => 'Nome utende:',
+'userlogin-yourname' => 'Nome utende',
+'userlogin-yourname-ph' => "Mitte 'u nome utende tune",
 'yourpassword' => 'Passuord:',
+'userlogin-yourpassword' => 'Passuord',
+'userlogin-yourpassword-ph' => "Mitte 'a passuord toje",
+'createacct-yourpassword-ph' => "Mitte 'na passuord",
 'yourpasswordagain' => "Scrive 'a passuord notra vote:",
+'createacct-yourpasswordagain' => "Conferme 'a passuord",
+'createacct-yourpasswordagain-ph' => "Mitte arrete 'a passuord",
 'remembermypassword' => "Arrencuerdete 'u nome mije sus a stu combiuter (pe 'nu massime de $1 {{PLURAL:$1|sciurne|sciurne}})",
+'userlogin-remembermypassword' => 'Arrecuèrdeme',
+'userlogin-signwithsecure' => "Ause 'na connessione secure",
 'securelogin-stick-https' => "Statte collegate ô HTTPS apprisse 'a trasute",
 'yourdomainname' => "'U nome d'u dominie tue:",
 'password-change-forbidden' => 'Non ge puè cangià le passuord sus a sta uicchi.',
@@ -469,18 +487,38 @@ No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze
 'logout' => 'Isse',
 'userlogout' => 'Isse',
 'notloggedin' => 'Non ge sì colleghete',
+'userlogin-noaccount' => "Non ge tìne 'nu cunde?",
+'userlogin-joinproject' => "Tràse jndr'à {{SITENAME}}",
 'nologin' => "Non ge tine n'utenze? '''$1'''.",
 'nologinlink' => "Ccreje 'nu cunde utende",
 'createaccount' => "Ccreje 'nu cunde",
 'gotaccount' => "Tine già 'nu cunde? '''$1'''.",
 'gotaccountlink' => 'Tràse',
 'userlogin-resetlink' => "T'è scurdate le dettaglie pe trasè?",
+'userlogin-resetpassword-link' => "Azzere 'a passuord toje",
+'helplogin-url' => 'Help:Trasenne',
+'userlogin-helplink' => "[[{{MediaWiki:helplogin-url}}|Aijute cu 'a trasute]]",
+'createacct-join' => "Mitte le 'mbormaziune tune aqquà sotte.",
+'createacct-emailrequired' => 'Indirizze email',
+'createacct-emailoptional' => 'Indirizze email (opzionale)',
+'createacct-email-ph' => "Mitte l'indirizze email tune",
 'createaccountmail' => 'Pe e-mail',
+'createacct-realname' => 'Nome vere (opzionale)',
 '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-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.',
 'userexists' => "'U nome de l'utende ca è scritte jè già ausate.
 Pe piacere scacchiane n'otre.",
 'loginerror' => 'Errore de collegamende',
+'createacct-error' => "Errore sus 'a ccrejazione d'u cunde",
 'createaccounterror' => "Non ge puè ccrejà 'u cunde utende: $1",
 'nocookiesnew' => "'U cunde utende ha state ccrejete ma angore non g'è trasute jndr'à {{SITENAME}}.
 
@@ -577,13 +615,15 @@ Pe spiccià 'a procedure de collegamende, tu a 'mbostà 'na password nove aqquà
 'resetpass-wrong-oldpass' => "'A password temboranea o quedda corrende jè invalide.
 Pò essere ca tu è già cangete 'a password toje o è richieste una temboranea nove.",
 'resetpass-temp-password' => 'Password temboranea:',
+'resetpass-abort-generic' => "'U cange de passuord ha state annullate da 'n'estenzione.",
 
 # Special:PasswordReset
 'passwordreset' => "Azzere 'a passuord",
-'passwordreset-text' => "Comblete stu module pe ricevere 'na mail de promemorie de le dettaglie d'u cunde tune.",
+'passwordreset-text-one' => "Comblete stu module pe azzerà 'a passuord toje.",
+'passwordreset-text-many' => "{{PLURAL:$1|Mitte une de le pizze de date pe azzerà 'a passuord toje.}}",
 'passwordreset-legend' => "Azzere 'a passuord",
 'passwordreset-disabled' => "'U reset de le passuord ha state desabbilitate sus a sta uicchi.",
-'passwordreset-pretext' => '{{PLURAL:$1||Mitte une de le stuèzze de le date aqquà sotte}}',
+'passwordreset-emaildisabled' => "Le funziune de l'email onne state disabbilitate sus a sta uicchi.",
 'passwordreset-username' => 'Nome utende:',
 'passwordreset-domain' => 'Dominie:',
 'passwordreset-capture' => "Vide 'a mail resultande?",
@@ -607,7 +647,7 @@ Tu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta
 Passuord temboranèe: $2',
 'passwordreset-emailsent' => "'N'e-mail pe arrecurdarte ha state mannate.",
 '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 l'utende ha fallite: $1",
+'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",
 
 # Special:ChangeEmail
 'changeemail' => "Cange 'u 'ndirizze e-mail",
@@ -830,11 +870,14 @@ Non g'à date nisciune mutive.",
 Pare proprie ca l'onne scangellete.",
 'edit-conflict' => 'conflitte de cangiaminde.',
 'edit-no-change' => "'U cangiamende ca p fatte, avène scettate purcè 'u teste non g'à cangete manghe de 'na virgola.",
+'postedit-confirmation' => "'U cangiamende tune ha state reggistrate.",
 'edit-already-exists' => "Non ge puè ccrejà 'na pàgene nove purcè esiste già!",
 'defaultmessagetext' => 'Messàgge de teste de base',
 'content-failed-to-parse' => "L'analise d'u condenute $2 pu modelle $1 ha fallite: $3",
 'invalid-content-data' => "Condenute d'u date invalide",
 'content-not-allowed-here' => '"$1" condenute non g\'è permesse sus \'a pàgene [[$2]]',
+'editwarning-warning' => 'Assenne da sta pàgene tu puè perdè tutte le date ca è cangiate.
+Ce tu è trasute, tu puè disabbilità st\'avvertimende jndr\'à sezione "Cangiaminde..." de le preferenze tune.',
 
 # Content models
 'content-model-wikitext' => 'Uicchiteste',
@@ -1124,15 +1167,7 @@ Prueve mettènne nnande a l'inderrogaziona toje 'u prefisse '''all:''' pe cercà
 'searchdisabled' => "'A ricerche sus a {{SITENAME}} ha state disabbilitete.
 Tu puè cercà ausanne Google.
 Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàggene ca non ge sonde aggiornate.",
-
-# Quickbar
-'qbsettings' => 'Barra veloce',
-'qbsettings-none' => 'Ninde',
-'qbsettings-fixedleft' => 'Fissete a sinistre (Fixed left)',
-'qbsettings-fixedright' => 'Fissete a destre (Fixed right)',
-'qbsettings-floatingleft' => 'Volanne a sinistre (Floating left)',
-'qbsettings-floatingright' => 'Volanne a destre (Floating right)',
-'qbsettings-directionality' => "Corrette, depende da 'a direzionalità d'u script tune e da 'a lènga toje",
+'search-error' => "S'ha verificate 'n'errore mendre ste cercave: $1",
 
 # Preferences page
 'preferences' => 'Me piece accussì',
@@ -1280,6 +1315,7 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'userrights-changeable-col' => 'Gruppe ca tu puè cangià',
 'userrights-unchangeable-col' => 'Gruppe ca tu non ge puè cangià',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Conflitte sus a le deritte utende! Pe piacere appliche le cangiaminde tune arrete.',
 
 # Groups
 'group' => 'Gruppe:',
@@ -1702,7 +1738,6 @@ Pe 'na securezze a uerre proprie, img_auth.php jè disabbilitate.",
 'http-read-error' => "Errore jndr'à letture de l' HTTP",
 'http-timed-out' => 'Richieste HTTP fore timbe.',
 'http-curl-error' => "Errore analizzanne l'URL: $1",
-'http-host-unreachable' => "Non ge riesche a raggiungere l'URL",
 'http-bad-status' => "Ha state 'nu probbleme duranne 'a richieste HTTP: $1, $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2123,8 +2158,8 @@ Le cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le
 'notvisiblerev' => "'A revisione ha state scangellete",
 'watchnochange' => "Niscune de le vôsce condrollete onne state cangete jndr'à 'u periode visualizzate.",
 'watchlist-details' => "{{PLURAL:$1|$1 pàgene|$1 pàggene}} jndr'à liste de le pàggene condrollete, scartanne le pàggene de le 'ngazzaminde.",
-'wlheader-enotif' => "* 'A notifiche de le e-mail notification jè abbilitete.",
-'wlheader-showupdated' => "* Le pàggene ca onne cangete da quanne tu l'è visitate sonde visualizzate in '''grascette'''",
+'wlheader-enotif' => '* Notifiche pe email abbilitate.',
+'wlheader-showupdated' => "* Le pàggene ca onne state cangiate da l'urtema visite avènene fatte vedè in '''grascette'''",
 'watchmethod-recent' => 'verifiche de le cangiaminde recende pe le pàggene condrollete',
 'watchmethod-list' => 'stoche a condrolle le pàggene condrollete pe le urteme cangiaminde',
 'watchlistcontains' => "'A liste de le pàggene condrollete toje condene $1 {{PLURAL:$1|pàgene|pàggene}}.",
@@ -2550,6 +2585,7 @@ Pe piacere condatte 'u provider de Indernette tue o 'u supporte tecniche e 'mbor
 'sorbsreason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}.",
 'sorbs_create_account_reason' => "L'indirizze IP tue jè elegate cumme a 'nu proxy apirte jndr'à DNSBL ausate da {{SITENAME}}.
 Tu nonge puè ccrejà 'nu cunde utende",
+'xffblockreason' => "'N'indirizze IP presende jndr'à testate X-Forwarded-For, tutte e doje le tune o 'nu server proxy ca ste ause, onne state bloccate. 'U mutive d'u blocche origgenale ere: $1",
 'cant-block-while-blocked' => 'Tu non ge puè bloccà otre utinde quanne tu si blocchete.',
 'cant-see-hidden-user' => "L'utende ca tu ste pruève a bloccà ha state già bloccate e scunnute. Ce tu non ge tine le deritte ''hideuser'', tu non ge puè vedè o cangià 'u blocche de l'utende.",
 'ipbblocked' => 'Tu non ge puè bloccà o sbloccà otre utinde, purcé tu sì ppure bloccate',
@@ -2716,6 +2752,8 @@ Pe piacere vè vide [//www.mediawiki.org/wiki/Localisation Localizzazione de Med
 'thumbnail-more' => 'Allarije',
 'filemissing' => 'File perdute',
 'thumbnail_error' => "Errore ccrejanne l'andeprime picenne: $1",
+'thumbnail_error_remote' => "Messàgge d'errore da $1:
+$2",
 'djvu_page_error' => 'Pàgene DjVu fore da le limite',
 'djvu_no_xml' => "Non ge riesche a esaminà l'XML d'u file DjVu",
 'thumbnail-temp-create' => "Non ge se pò ccrejà 'na miniature temboranèe d'u file",
@@ -2870,17 +2908,11 @@ Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
 
 # Stylesheets
 'common.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a tutte le masckere */",
-'standard.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Standard */",
-'nostalgia.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Nostalgie */",
 'cologneblue.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Blu Cologne */",
 'monobook.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Monobook */",
-'myskin.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Personalizzate */",
-'chick.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Purecine */",
-'simple.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Semblice */",
 'modern.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Moderne */",
 'vector.css' => "/* 'U CSS ca se iacchie aqquà 'u 'ndrucane le utinde d'a masckere Vettore */",
 'print.css' => "/* 'U CSS ca se iacchie aqquà avène applicate a 'u resultate d'a stambe */",
-'handheld.css' => "/* 'U CSS ca se iacchie aqquà l'ausane le dispositive de gestione manuale basate sus a masckere configurate in \$wgHandheldStyle */",
 'noscript.css' => "/* 'U CSS ca se iacchie aqquà l'ausane le utinde cu 'u Javascript disabbilitate */",
 'group-autoconfirmed.css' => "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le utinde autoconfirmatarie */",
 'group-bot.css' => "/* 'U CSS ca se iacchie aqquà ave effettue seulamende sus a le bot */",
@@ -2889,12 +2921,8 @@ Permette de aggiungere 'nu mutive jndr'à 'u riepileghe",
 
 # Scripts
 'common.js' => '/* Ogne JavaScript aqquà avène carecate pe tutte le utinde sus a ogne pàgene carecate. */',
-'standard.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Standard */",
-'nostalgia.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Nostalgie */",
 'cologneblue.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Blu Cologne */",
 'monobook.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere MonoBook */",
-'myskin.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Personalizzate */",
-'chick.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Purecine */",
 'modern.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Moderne */",
 'vector.js' => "/* Ogne JavaScript aqquà avène carecate pe le utinde ca ausane 'a masckere Vettore */",
 'group-autoconfirmed.js' => '/* Ogne JavaScript aqquà avène carecate pe le utinde autoconfirmatarie */',
@@ -2975,13 +3003,8 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'pageinfo-category-files' => 'Numere de file',
 
 # Skin names
-'skinname-standard' => 'Classeche',
-'skinname-nostalgia' => 'Nostalgie',
 'skinname-cologneblue' => 'Blu Cologne',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Personalizzate',
-'skinname-chick' => 'Purecine',
-'skinname-simple' => 'Semblice',
 'skinname-modern' => 'Moderne',
 'skinname-vector' => 'Vettore',
 
@@ -3066,11 +3089,25 @@ Ce l'esegue sus a 'u sisteme tue pò essere ca se combromette.",
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minute}}',
 'hours' => '{{PLURAL: $1|$1ore|$1 ore}}',
 'days' => '{{PLURAL: $1|$1 sciurne|$1 sciurne}}',
+'weeks' => '{{PLURAL:$1|$1 sumàne}}',
 'months' => '{{PLURAL:$1|$1 mese|$1 mise}}',
 'years' => '{{PLURAL:$1|$1 anne}}',
 'ago' => '$1 fà',
 'just-now' => 'mò mò',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ore}} fà',
+'minutes-ago' => '$1 {{PLURAL:$1|minute}} fà',
+'seconds-ago' => '$1 {{PLURAL:$1|seconde}} fà',
+'monday-at' => 'Lunedìe a le $1',
+'tuesday-at' => 'Martedìe a le $1',
+'wednesday-at' => 'Mercrudìe a le $1',
+'thursday-at' => 'Sciuvedìe a le $1',
+'friday-at' => 'Venerdìe a le $1',
+'saturday-at' => 'Sabbète a le $1',
+'sunday-at' => 'Dumeneche a le $1',
+'yesterday-at' => 'Aijere a le $1',
+
 # Bad image list
 'bad_image_list' => "'U formete jè 'u seguende:
 
@@ -3080,8 +3117,6 @@ Tutte le sottosequenze ca appondene a stessa linea sonde considerete eccezziune,
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3157,7 +3192,7 @@ Otre avènene scunnute pe defolt.
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghezze',
 'exif-imagelength' => 'Altezze',
 'exif-bitspersample' => 'Bit pe combonende',
@@ -3350,7 +3385,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'No combresse',
 'exif-compression-2' => "Gruppe CCITT 3 Decodifeche de Esecuzione d'a lunghezze 1-Dimenzionale Cangiate de Huffman",
 'exif-compression-3' => "Gruppe CCITT 3 de decodifeche d'u fax",
@@ -3885,12 +3920,17 @@ Avisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenz
 'version-entrypoints-header-entrypoint' => "Punde d'ingresse",
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => "Percorse d'u fail",
-'filepath-page' => 'File:',
-'filepath-submit' => 'Véje',
-'filepath-summary' => "Sta pàgena speciale retorne 'u percorse comblete pe 'nu file.<br />
-Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file rechiamane 'u lore programme associate direttamende.",
+# Special:Redirect
+'redirect' => "Redirette da 'u file, utende o ID d'a revisione",
+'redirect-legend' => "Redirette a 'nu file o 'na pàgene",
+'redirect-summary' => "Sta pàgena speciale redirezione a 'nu file (date 'u nome d'u file), 'na pàgene (fate 'n'ID de revisione), o 'na pàgene utende (date 'n'ID numeriche de l'utende).",
+'redirect-submit' => 'Véje',
+'redirect-lookup' => 'Mappature:',
+'redirect-value' => 'Valore:',
+'redirect-user' => "ID de l'utende",
+'redirect-revision' => "Revisione d'a pàgene",
+'redirect-file' => "Nome d'u file",
+'redirect-not-exists' => 'Valore non acchiate',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cirche pe le file duplichete',
@@ -3981,6 +4021,9 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 'htmlform-submit' => 'Conferme',
 'htmlform-reset' => 'Annulle le cangiaminde',
 'htmlform-selectorother-other' => 'Otre',
+'htmlform-no' => 'None',
+'htmlform-yes' => 'Sìne',
+'htmlform-chosen-placeholder' => "Scacchie 'n'opzione",
 
 # SQLite database support
 'sqlite-has-fts' => "$1 cu 'u supporte d'a ricerche full-text",
index 8d91ebf..3a778fd 100644 (file)
@@ -30,6 +30,7 @@
  * @author Daniyar
  * @author Dim Grits
  * @author Don Alessandro
+ * @author Ekulikovdo
  * @author Eleferen
  * @author Erdemaslancan
  * @author EugeneZelenko
  * @author Haffman
  * @author HalanTul
  * @author Huuchin
+ * @author Ignatus
  * @author Illusion
  * @author Iltever
+ * @author Iluvatar
  * @author Incnis Mrsi
  * @author Iniquity
  * @author Innv
  * @author KorneySan
  * @author Kv75
  * @author Lockal
+ * @author Matma Rex
  * @author MaxBioHazard
  * @author MaxSem
  * @author NBS
+ * @author Nemo bis
  * @author Ola
  * @author Ole Yves
  * @author Putnik
@@ -78,6 +83,7 @@
  * @author Александр Сигачёв
  * @author Гусейн
  * @author ОйЛ
+ * @author Умар
  * @author לערי ריינהארט
  * @author გიორგიმელა
  */
@@ -115,16 +121,17 @@ $specialPageAliases = array(
        'Activeusers'               => array( 'Активные_участники' ),
        'Allmessages'               => array( 'Системные_сообщения' ),
        'Allpages'                  => array( 'Все_страницы' ),
+       'Badtitle'                  => array( 'Недопустимое_название' ),
        'Blankpage'                 => array( 'Пустая_страница' ),
        'Block'                     => array( 'Заблокировать' ),
        'Blockme'                   => array( 'Заблокируй_меня' ),
        'Booksources'               => array( 'Источники_книг' ),
        'BrokenRedirects'           => array( 'Разорванные_перенаправления' ),
        'Categories'                => array( 'Категории' ),
-       'ChangeEmail'               => array( 'Сменить_e-mail' ),
+       'ChangeEmail'               => array( 'Сменить_e-mail', 'Сменить_почту' ),
        'ChangePassword'            => array( 'Сменить_пароль' ),
        'ComparePages'              => array( 'Сравнение_страниц' ),
-       'Confirmemail'              => array( 'Подтвердить_e-mail' ),
+       'Confirmemail'              => array( 'Подтвердить_e-mail', 'Подтвердить_почту' ),
        'Contributions'             => array( 'Вклад' ),
        'CreateAccount'             => array( 'Создать_учётную_запись', 'Создать_пользователя', 'Зарегистрироваться' ),
        'Deadendpages'              => array( 'Тупиковые_страницы' ),
@@ -134,9 +141,12 @@ $specialPageAliases = array(
        'EditWatchlist'             => array( 'Править_список_наблюдения' ),
        'Emailuser'                 => array( 'Письмо_участнику', 'Отправить_письмо' ),
        'Export'                    => array( 'Экспорт', 'Выгрузка' ),
+       'Fewestrevisions'           => array( 'Редко_редактируемые' ),
        'FileDuplicateSearch'       => array( 'Поиск_дубликатов_файлов' ),
        'Filepath'                  => array( 'Путь_к_файлу' ),
        'Import'                    => array( 'Импорт' ),
+       'Invalidateemail'           => array( 'Отменить_подтверждение_адреса' ),
+       'JavaScriptTest'            => array( 'Тестирование_JavaScript' ),
        'BlockList'                 => array( 'Список_блокировок', 'Блокировки' ),
        'LinkSearch'                => array( 'Поиск_ссылок' ),
        'Listadmins'                => array( 'Список_администраторов' ),
@@ -151,7 +161,13 @@ $specialPageAliases = array(
        'Longpages'                 => array( 'Длинные_страницы' ),
        'MergeHistory'              => array( 'Объединение_историй' ),
        'MIMEsearch'                => array( 'Поиск_по_MIME' ),
+       'Mostcategories'            => array( 'Самые_категоризованные' ),
        'Mostimages'                => array( 'Самые_используемые_файлы' ),
+       'Mostinterwikis'            => array( 'Наибольшее_количество_интервики-ссылок' ),
+       'Mostlinked'                => array( 'Самые_используемые_страницы' ),
+       'Mostlinkedcategories'      => array( 'Самые_используемые_категории' ),
+       'Mostlinkedtemplates'       => array( 'Самые_используемые_шаблоны' ),
+       'Mostrevisions'             => array( 'Наибольшее_количество_версий' ),
        'Movepage'                  => array( 'Переименовать_страницу', 'Переименование', 'Переименовать' ),
        'Mycontributions'           => array( 'Мой_вклад' ),
        'Mypage'                    => array( 'Моя_страница' ),
@@ -163,9 +179,11 @@ $specialPageAliases = array(
        'PermanentLink'             => array( 'Постоянная_ссылка' ),
        'Popularpages'              => array( 'Популярные_страницы' ),
        'Preferences'               => array( 'Настройки' ),
+       'Prefixindex'               => array( 'Указатель_по_началу_названия' ),
        'Protectedpages'            => array( 'Защищённые_страницы' ),
        'Protectedtitles'           => array( 'Защищённые_названия' ),
        'Randompage'                => array( 'Случайная_страница', 'Случайная' ),
+       'Randomredirect'            => array( 'Случайное_перенаправление' ),
        'Recentchanges'             => array( 'Свежие_правки' ),
        'Recentchangeslinked'       => array( 'Связанные_правки' ),
        'Revisiondelete'            => array( 'Удаление_правки' ),
@@ -180,6 +198,7 @@ $specialPageAliases = array(
        'Uncategorizedpages'        => array( 'Некатегоризованные_страницы' ),
        'Uncategorizedtemplates'    => array( 'Некатегоризованные_шаблоны' ),
        'Undelete'                  => array( 'Восстановить', 'Восстановление' ),
+       'Unlockdb'                  => array( 'Разблокировка_БД' ),
        'Unusedcategories'          => array( 'Неиспользуемые_категории' ),
        'Unusedimages'              => array( 'Неиспользуемые_файлы' ),
        'Unusedtemplates'           => array( 'Неиспользуемые_шаблоны' ),
@@ -238,6 +257,7 @@ $magicWords = array(
        'pagenamee'                 => array( '1', 'НАЗВАНИЕ_СТРАНИЦЫ_2', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
        'namespacee'                => array( '1', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'НОМЕР_ПРОСТРАНСТВА_ИМЁН', 'NAMESPACENUMBER' ),
        'talkspace'                 => array( '1', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
        'talkspacee'                => array( '1', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
        'subjectspace'              => array( '1', 'ПРОСТРАНСТВО_СТАТЕЙ', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -285,6 +305,7 @@ $magicWords = array(
        'localurl'                  => array( '0', 'ЛОКАЛЬНЫЙ_АДРЕС:', 'LOCALURL:' ),
        'localurle'                 => array( '0', 'ЛОКАЛЬНЫЙ_АДРЕС_2:', 'LOCALURLE:' ),
        'articlepath'               => array( '0', 'ПУТЬ_К_СТАТЬЕ', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', 'ИДЕНТИФИКАТОР_СТРАНИЦЫ', 'PAGEID' ),
        'server'                    => array( '0', 'СЕРВЕР', 'SERVER' ),
        'servername'                => array( '0', 'НАЗВАНИЕ_СЕРВЕРА', 'SERVERNAME' ),
        'scriptpath'                => array( '0', 'ПУТЬ_К_СКРИПТУ', 'SCRIPTPATH' ),
@@ -346,6 +367,10 @@ $magicWords = array(
        'url_path'                  => array( '0', 'ПУТЬ', 'PATH' ),
        'url_wiki'                  => array( '0', 'ВИКИ', 'WIKI' ),
        'url_query'                 => array( '0', 'ЗАПРОС', 'QUERY' ),
+       'pagesincategory_all'       => array( '0', 'все', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'страницы', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'подкатегории', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'файлы', 'files' ),
 );
 
 
@@ -432,8 +457,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Показывать число участников, включивших страницу в свой список наблюдения',
 'tog-oldsig' => 'Текущая подпись:',
 'tog-fancysig' => 'Собственная вики-разметка подписи (без автоматической ссылки)',
-'tog-externaleditor' => 'Использовать по умолчанию внешний редактор (только для специалистов, необходима особая настройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
-'tog-externaldiff' => 'Использовать по умолчанию внешнюю программу сравнения (только для специалистов, необходима особая настройка компьютера; [//www.mediawiki.org/wiki/Manual:External_editors подробнее])',
 'tog-showjumplinks' => 'Включить вспомогательные ссылки «перейти к»',
 'tog-uselivepreview' => 'Использовать быстрый предварительный просмотр (JavaScript, экспериментально)',
 'tog-forceeditsummary' => 'Предупреждать, когда не заполнено поле описания правки',
@@ -448,6 +471,7 @@ $messages = array(
 'tog-showhiddencats' => 'Показывать скрытые категории',
 'tog-noconvertlink' => 'Отключить ссылку на преобразование заголовка',
 'tog-norollbackdiff' => 'Не показывать разницу версий после выполнения отката',
+'tog-useeditwarning' => 'Предупреждать, когда я покидаю страницу с несохранёнными изменениями',
 
 'underline-always' => 'Всегда',
 'underline-never' => 'Никогда',
@@ -503,7 +527,7 @@ $messages = array(
 'feb' => 'фев',
 'mar' => 'мар',
 'apr' => 'апр',
-'may' => 'мая',
+'may' => 'май',
 'jun' => 'июн',
 'jul' => 'июл',
 'aug' => 'авг',
@@ -511,6 +535,18 @@ $messages = array(
 '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',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категории}}',
@@ -522,9 +558,9 @@ $messages = array(
 'hidden-category-category' => 'Скрытые категории',
 'category-subcat-count' => '{{PLURAL:$2|Эта категория содержит только следующую подкатегорию.|Эта категория содержит $1 {{PLURAL:$1|подкатегорию|подкатегории}} из $2 всего.}}',
 'category-subcat-count-limited' => 'В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегории|$1 подкатегорий}}.',
-'category-article-count' => '{{PLURAL:$2|Эта категория содержит только следующую страницу.|В этой категории показан{{PLURAL:$1|а $1 страница|ы $1 страницы|о $1 страниц}} из $2.}}',
+'category-article-count' => '{{#ifeq:$2|1|Эта категория содержит только следующую страницу.|Эта категория содержит следующ{{PLURAL:$1|ую $1 страницу|ие $1 страницы|ие $1 страниц}} из $2.}}',
 'category-article-count-limited' => 'В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц}}.',
-'category-file-count' => '{{PLURAL:$2|Эта категория содержит только один файл.|В этой категории {{PLURAL:$1|показан $1 файл|показано $1 файла|показано $1 файлов}} из $2 {{PLURAL:$2|имеющейся|имеющихся}}.}}',
+'category-file-count' => '{{#ifeq:$2|1|Эта категория содержит только один файл.|Следующ{{PLURAL:$1|ий $1 файл|ие $1 файла|ие $1 файлов}} из $2 имеющ{{PLURAL:$2|его|их}}ся принадлеж{{PLURAL: ит|ат}} к этой категории.}}',
 'category-file-count-limited' => 'В этой категории {{PLURAL:$1|$1 файл|$1 файла|$1 файлов}}.',
 'listingcontinuesabbrev' => '(продолжение)',
 'index-category' => 'Индексируемые страницы',
@@ -562,7 +598,7 @@ $messages = array(
 'vector-action-unprotect' => 'Изменить защиту',
 'vector-simplesearch-preference' => 'Включить упрощённую строку поиска (только для оформления «Векторное»)',
 'vector-view-create' => 'Создание',
-'vector-view-edit' => 'Ð\9fÑ\80авка',
+'vector-view-edit' => 'Ð\9fÑ\80авиÑ\82Ñ\8c',
 'vector-view-history' => 'История',
 'vector-view-view' => 'Читать',
 'vector-view-viewsource' => 'Просмотр разметки',
@@ -668,7 +704,7 @@ $1',
 'youhavenewmessages' => 'Вы получили $1 ($2).',
 'newmessageslink' => 'новые сообщения',
 'newmessagesdifflink' => 'последнее изменение',
-'youhavenewmessagesfromusers' => 'Вы получили $1 от {{PLURAL:$3|$3 участника|$3 участников|$3 участников}} ($2).',
+'youhavenewmessagesfromusers' => 'Вы получили $1 от {{PLURAL:$3|$3 участника|$3 участников}} ($2).',
 'youhavenewmessagesmanyusers' => 'Вы получили $1 от множества пользователей ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|новое сообщение|новые сообщения}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|последнее изменение|последние изменения}}',
@@ -818,9 +854,18 @@ $2',
 'welcomecreation-msg' => 'Ваша учётная запись создана.
 Не забудьте провести [[Special:Preferences|персональную настройку]] сайта {{SITENAME}}.',
 'yourname' => 'Имя учётной записи:',
+'userlogin-yourname' => 'Имя учётной записи',
+'userlogin-yourname-ph' => 'Введите имя вашей учётной записи',
 'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Введите ваш пароль',
+'createacct-yourpassword-ph' => 'Введите пароль',
 'yourpasswordagain' => 'Повторный набор пароля:',
+'createacct-yourpasswordagain' => 'Подтвердите пароль',
+'createacct-yourpasswordagain-ph' => 'Введите пароль еще раз',
 'remembermypassword' => 'Помнить мою учётную запись на этом компьютере (не более $1 {{PLURAL:$1|дня|дней|дней}})',
+'userlogin-remembermypassword' => 'Оставаться в системе',
+'userlogin-signwithsecure' => 'Защищённое соединение',
 'securelogin-stick-https' => 'Продолжить подключение по HTTPS после входа',
 'yourdomainname' => 'Ваш домен:',
 'password-change-forbidden' => 'Вы не можете изменить пароль в этой вики.',
@@ -833,18 +878,38 @@ $2',
 'logout' => 'Завершение сеанса',
 'userlogout' => 'Завершение сеанса',
 'notloggedin' => 'Вы не представились системе',
+'userlogin-noaccount' => 'Нет аккаунта?',
+'userlogin-joinproject' => 'Присоединиться к {{grammar:genitive|{{SITENAME}}}}',
 'nologin' => 'Нет учётной записи? $1.',
 'nologinlink' => 'Создать учётную запись',
 'createaccount' => 'Создать учётную запись',
 'gotaccount' => "Вы уже зарегистрированы? '''$1'''.",
 'gotaccountlink' => 'Представьтесь',
 'userlogin-resetlink' => 'Забыли данные для входа?',
+'userlogin-resetpassword-link' => 'Сброс пароля',
+'helplogin-url' => 'Help:Вход в систему',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помощь со входом в систему]]',
+'createacct-join' => 'Введите свои данные ниже.',
+'createacct-emailrequired' => 'Адрес электронной почты',
+'createacct-emailoptional' => 'Адрес электронной почты (необязательно)',
+'createacct-email-ph' => 'Введите свой адрес электронной почты',
 'createaccountmail' => 'Использовать сгенерированный случайным образом временный пароль и выслать мне его на указанный ниже адрес электронной почты:',
+'createacct-realname' => 'Настоящее имя (необязательно)',
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-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|участник|участника|участников}} за последнее время',
 'badretype' => 'Введённые вами пароли не совпадают.',
 'userexists' => 'Введённое имя участника уже используется.
 Пожалуйста, выберите другое имя.',
 'loginerror' => 'Ошибка опознавания участника',
+'createacct-error' => 'Ошибка создания учетной записи',
 'createaccounterror' => 'Невозможно создать учётную запись: $1',
 'nocookiesnew' => 'Участник зарегистрирован, но не представлен. {{SITENAME}} использует «cookies» для представления участников. У вас «cookies» запрещены. Пожалуйста, разрешите их, а затем представьтесь со своиим новым именем участника и паролем.',
 'nocookieslogin' => '{{SITENAME}} использует «cookies» для представления участников. Вы их отключили. Пожалуйста, включите их и попробуйте снова.',
@@ -883,7 +948,7 @@ $2',
 'blocked-mailpassword' => 'Редактирование с вашего IP-адреса запрещено, поэтому заблокирована и функция восстановления пароля.',
 'eauthentsent' => 'На указанный адрес электронной почты отправлено письмо. 
 Следуйте изложенным там инструкциям для подтверждения того, что этот адрес действительно принадлежит вам.',
-'throttled-mailpassword' => 'Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|последнего $1 часа|последних $1 часов|последних $1 часов}} .
+'throttled-mailpassword' => 'Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|последнего часа|последних $1 часов}}.
 Для предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания за $1 {{PLURAL:$1|час|часа|часов}}.',
 'mailerror' => 'Ошибка при отправке почты: $1',
 'acct_creation_throttle_hit' => 'За сутки с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись участника|было создано $1 учётных записей участников|было создано $1 учётных записей участников}}, что является пределом для данного отрезка времени.
@@ -933,46 +998,44 @@ $2',
 'resetpass-wrong-oldpass' => 'Неправильный временный или текущий пароль.
 Возможно, вы уже успешно изменили пароль, или запросили новый временный пароль.',
 'resetpass-temp-password' => 'Временный пароль:',
+'resetpass-abort-generic' => 'Изменение пароля было прервано расширением.',
 
 # Special:PasswordReset
 'passwordreset' => 'Сброс пароля',
-'passwordreset-text' => 'Заполните эту форму, чтобы получить в письме напоминание о параметрах Вашей учётной записи.',
+'passwordreset-text-one' => 'Заполните эту форму, чтобы сбросить свой пароль.',
+'passwordreset-text-many' => '{{PLURAL:$1|Введите одну из частей данных для сброса пароля.}}',
 'passwordreset-legend' => 'Сбросить пароль',
 'passwordreset-disabled' => 'Сбросы пароля отключены на этой вики.',
-'passwordreset-pretext' => '{{PLURAL:$1||Введите одну из частей данных, показанных ниже}}',
+'passwordreset-emaildisabled' => 'Функции электронной почты отключены в этой вики.',
 'passwordreset-username' => 'Имя участника:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Просмотреть получившееся письмо?',
 'passwordreset-capture-help' => 'Если вы установите данную отметку, то вам будет показано письмо с временным паролем, отправляемое участнику.',
 'passwordreset-email' => 'Адрес электронной почты:',
 'passwordreset-emailtitle' => 'Сведения об учётной записи {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Кто-то (возможно, вы, с IP-адреса $1) запросил напоминание о вашей
-учётной записи в проекте {{SITENAME}} ($4).
-{{PLURAL:$3|Следующая учётная запись связана|Следующие учётные записи связаны}} с этим адресом электронной почты:
+'passwordreset-emailtext-ip' => 'Кто-то (возможно, вы, с IP-адреса $1) запросил сброс пароля к вашей учётной записи в проекте {{SITENAME}} ($4).
+С этим адресом электронной почты {{PLURAL:$3|связана следующая учётная запись|связаны следующие учётные записи}}:
 
 $2
 
 {{PLURAL:$3|Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней}}.
-Вы должны представиться системе и выбрать новый пароль.
-Если вы не делали этого запроса или вспомнили свой исходный пароль
-и не желаете его менять, то можете проигнорировать это сообщение
-и продолжить использовать свой старый пароль.',
-'passwordreset-emailtext-user' => 'Участник $1 из проекта {{SITENAME}} запросил напоминание о вашей
-учётной записи в проекте {{SITENAME}} ($4).
-{{PLURAL:$3|Следующая учётная запись связана|Следующие учётные записи связаны}} с этим адресом электронной почты:
+Вы должны представиться системе и выбрать новый пароль. 
+Если вы не делали этого запроса, или вспомнили свой исходный пароль и не желаете его менять, 
+то можете проигнорировать это сообщение и продолжить использовать свой старый пароль.',
+'passwordreset-emailtext-user' => 'Участник $1 из проекта {{SITENAME}} запросил сброс пароля для вашей учётной записи в проекте {{SITENAME}} ($4).
+С этим адресом электронной почты {{PLURAL:$3|связана следующая учётная запись|связаны следующие учётные записи}}:
 
 $2
 
 {{PLURAL:$3|Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней}}.
 Вы должны представиться системе и выбрать новый пароль.
-Если вы не делали этого запроса или вспомнили свой исходный пароль
-и не желаете его менять, то можете проигнорировать это сообщение
-и продолжить использовать свой старый пароль.',
+Если вы не делали этого запроса или вспомнили свой исходный пароль и не желаете его менять, 
+то можете проигнорировать это сообщение и продолжить использовать свой старый пароль.',
 'passwordreset-emailelement' => 'Имя участника: $1
 Временный пароль: $2',
-'passwordreset-emailsent' => 'Ð\9fо Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82е Ð±Ñ\8bло Ð¾Ñ\82пÑ\80авлено Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ðµ.',
-'passwordreset-emailsent-capture' => 'Ð\9dиже Ð¿Ñ\80иведено Ð¾Ñ\82пÑ\80авленное Ð¿Ð¸Ñ\81Ñ\8cмо-напоминание.',
-'passwordreset-emailerror-capture' => 'Ð\9dиже Ð¿Ñ\80иведено Ñ\81озданное Ð¿Ð¸Ñ\81Ñ\8cмо-напоминание, ÐµÐ³Ð¾ Ð¾Ñ\82пÑ\80авка Ð½Ðµ Ñ\83далаÑ\81Ñ\8c Ð¿Ð¾ причине: $1',
+'passwordreset-emailsent' => 'Ð\9eÑ\82пÑ\80авлено Ñ\8dлекÑ\82Ñ\80онное Ð¿Ð¸Ñ\81Ñ\8cмо Ñ\81 Ð¸Ð½Ñ\84оÑ\80маÑ\86ией Ð¾ Ñ\81бÑ\80оÑ\81е Ð¿Ð°Ñ\80олÑ\8f.',
+'passwordreset-emailsent-capture' => 'Ð\9eÑ\82пÑ\80авлено Ñ\8dлекÑ\82Ñ\80онное Ð¿Ð¸Ñ\81Ñ\8cмо Ñ\81 Ð¸Ð½Ñ\84оÑ\80маÑ\86ией Ð¾ Ñ\81бÑ\80оÑ\81е Ð¿Ð°Ñ\80олÑ\8f, Ñ\82екÑ\81Ñ\82 ÐºÐ¾Ñ\82оÑ\80ого Ð¼Ð¾Ð¶Ð½Ð¾ Ñ\83видеÑ\82Ñ\8c Ð½Ð¸Ð¶е.',
+'passwordreset-emailerror-capture' => 'Ð\91Ñ\8bло Ñ\81оздано Ñ\8dлекÑ\82Ñ\80онное Ð¿Ð¸Ñ\81Ñ\8cмо Ñ\81 Ð¸Ð½Ñ\84оÑ\80маÑ\86ией Ð¾ Ñ\81бÑ\80оÑ\81е Ð¿Ð°Ñ\80олÑ\8f, Ñ\82екÑ\81Ñ\82 ÐºÐ¾Ñ\82оÑ\80ого Ð¼Ð¾Ð¶Ð½Ð¾ Ñ\83видеÑ\82Ñ\8c Ð½Ð¸Ð¶Ðµ, Ð¾Ð´Ð½Ð°ÐºÐ¾ ÐµÐ³Ð¾ Ð½Ðµ Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82пÑ\80авиÑ\82Ñ\8c {{GENDER:$2|Ñ\83Ñ\87аÑ\81Ñ\82никÑ\83\83Ñ\87аÑ\81Ñ\82ниÑ\86е}} Ð¿Ð¾ Ñ\81ледÑ\83Ñ\8eÑ\89ей причине: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Изменить адрес электронной почты',
@@ -1187,12 +1250,15 @@ $2
 Вероятно, она была удалена.',
 'edit-conflict' => 'Конфликт редактирования.',
 'edit-no-change' => 'Ваша правка была отклонена, так как в тексте не было сделано изменений.',
+'postedit-confirmation' => 'Ваша правка сохранена.',
 'edit-already-exists' => 'Невозможно создать новую страницу.
 Она уже существует.',
 'defaultmessagetext' => 'Текст по умолчанию',
 'content-failed-to-parse' => 'Содержимое $2 не соответствует типу $1: $3.',
 'invalid-content-data' => 'Недопустимые данные',
 'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
+'editwarning-warning' => 'Переход на другую страницу может привести к потере сделанных вами изменений.
+Если вы зарегистрированы в системе, то вы можете отключить это предупреждение в разделе «Редактирование» ваших настроек.',
 
 # Content models
 'content-model-wikitext' => 'вики-текст',
@@ -1473,15 +1539,7 @@ $1",
 'powersearch-togglenone' => 'Ничего',
 'search-external' => 'Внешний поиск',
 'searchdisabled' => 'Извините, но встроенный полнотекстовый поиск выключен. Вы можете воспользоваться поиском по сайту через поисковые системы общего назначения, однако имейте в виду, что копия сайта в их кэше может быть несколько устаревшей.',
-
-# Quickbar
-'qbsettings' => 'Панель навигации',
-'qbsettings-none' => 'Не показывать',
-'qbsettings-fixedleft' => 'Неподвижная слева',
-'qbsettings-fixedright' => 'Неподвижная справа',
-'qbsettings-floatingleft' => 'Плавающая слева',
-'qbsettings-floatingright' => 'Плавающая справа',
-'qbsettings-directionality' => 'Закреплённая, в зависимости от направления письменности вашего языка',
+'search-error' => 'Произошла ошибка при поиске: $1',
 
 # Preferences page
 'preferences' => 'Настройки',
@@ -1626,6 +1684,7 @@ $1",
 'userrights-notallowed' => 'С вашей учётной записи не разрешено добавлять и удалять права участников.',
 'userrights-changeable-col' => 'Группы, которые вы можете изменять',
 'userrights-unchangeable-col' => 'Группы, которые вы не можете изменять',
+'userrights-conflict' => 'Конфликт прав участника! Пожалуйста, примените изменения заново.',
 
 # Groups
 'group' => 'Группа:',
@@ -2038,7 +2097,6 @@ $1',
 'http-read-error' => 'Ошибка чтения HTTP.',
 'http-timed-out' => 'Истекло время ожидания HTTP-запроса.',
 'http-curl-error' => 'Ошибка обращения к URL: $1',
-'http-host-unreachable' => 'Невозможно обратиться по указанному URL.',
 'http-bad-status' => 'Во время обработки HTTP-запроса обнаружена проблема: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2285,8 +2343,8 @@ $1',
 'notargettext' => 'Вы не указали целевую страницу или участника для этого действия.',
 'nopagetitle' => 'Нет такой целевой страницы',
 'nopagetext' => 'Указанной целевой страницы не существует.',
-'pager-newer-n' => '{{PLURAL:$1|более новая|более новые|более новых}} $1',
-'pager-older-n' => '{{PLURAL:$1|более старая|более старые|более старых}} $1',
+'pager-newer-n' => '$1 {{PLURAL:$1|более новая|более новые|более новых}}',
+'pager-older-n' => '$1 {{PLURAL:$1|более старая|более старые|более старых}}',
 'suppress' => 'Сокрытие',
 'querypage-disabled' => 'Эта спецстраница отключена для повышения производительности.',
 
@@ -2451,8 +2509,8 @@ $1',
 'notvisiblerev' => 'Версия была удалена',
 'watchnochange' => 'За этот период ни одна страница из списка наблюдения не менялась.',
 'watchlist-details' => 'В вашем списке наблюдения $1 {{PLURAL:$1|страница|страницы|страниц}}, не считая страниц обсуждения.',
-'wlheader-enotif' => '* Уведомление по эл. почте включено.',
-'wlheader-showupdated' => "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
+'wlheader-enotif' => 'Уведомления по эл. почте включены.',
+'wlheader-showupdated' => "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
 'watchmethod-recent' => 'просмотр последних изменений для наблюдаемых страниц',
 'watchmethod-list' => 'просмотр наблюдаемых страниц для последних изменений',
 'watchlistcontains' => 'Ваш список наблюдения содержит $1 {{PLURAL:$1|страница|страницы|страниц}}.',
@@ -2858,6 +2916,7 @@ $1',
 'proxyblocksuccess' => 'Выполнено.',
 'sorbsreason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL.',
 'sorbs_create_account_reason' => 'Ваш IP-адрес числится как открытый прокси в DNSBL. Вы не можете создать учётную запись.',
+'xffblockreason' => 'Был заблокирован IP-адрес, присутствующий в заголовке X-Forwarded-For и принадлежащий либо вам, либо используемому вами прокси-серверу. Первоначальная причина блокировки была следующей: $1',
 'cant-block-while-blocked' => 'Вы не можете блокировать других участников, пока вы сами заблокированы.',
 'cant-see-hidden-user' => 'Участник, которого вы пытаетесь заблокировать, уже заблокирован и скрыт. Поскольку у вас нет разрешения на работу по сокрытию участников, вы не можете просмотреть или изменить данную блокировку.',
 'ipbblocked' => 'Вы не можете блокировать или разблокировать других участников, так как вы сами заблокированы',
@@ -3025,6 +3084,8 @@ $1',
 'thumbnail-more' => 'Увеличить',
 'filemissing' => 'Файл не найден',
 'thumbnail_error' => 'Ошибка создания миниатюры: $1',
+'thumbnail_error_remote' => 'Сообщение об ошибке от $1:
+$2',
 'djvu_page_error' => 'Номер страницы DjVu вне досягаемости',
 'djvu_no_xml' => 'Невозможно получить XML для DjVu',
 'thumbnail-temp-create' => 'Не удаётся создать временный файл эскиза',
@@ -3172,17 +3233,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/* Размещённый здесь CSS будет применяться ко всем темам оформления */',
-'standard.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Standard */',
-'nostalgia.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Nostalgia */',
 'cologneblue.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Cologne Blue */',
 'monobook.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Monobook */',
-'myskin.css' => '/* Размещённый здесь CSS будет применяться к теме оформления MySkin */',
-'chick.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Chick */',
-'simple.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Simple */',
 'modern.css' => '/* Размещённый здесь CSS будет применяться к теме оформления Modern */',
 'vector.css' => '/* Размещённый здесь CSS будет применяться к векторной теме оформления  */',
 'print.css' => '/* Размещённый здесь CSS будет применяться к версии для печати */',
-'handheld.css' => '/* Размещённый здесь CSS-код будет применяться для мобильных устройств, использующих тему оформления, указанную в $wgHandheldStyle */',
 'noscript.css' => '/* Размещённый здесь CSS будет применяться для участников с отключенным JavaScript  */',
 'group-autoconfirmed.css' => '/* Размещённый здесь CSS будет применяться для автоподтверждённых участников */',
 'group-bot.css' => '/* Размещённый здесь CSS будет применяться только для ботов */',
@@ -3191,13 +3246,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */',
-'standard.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Standard */',
-'nostalgia.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Nostalgia */',
 'cologneblue.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Cologne Blue */',
 'monobook.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MonoBook */',
-'myskin.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MySkin  */',
-'chick.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Chick */',
-'simple.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Simple */',
 'modern.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Modern */',
 'vector.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Vector */',
 'group-autoconfirmed.js' => '/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */',
@@ -3279,12 +3329,7 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-category-files' => 'Количество файлов',
 
 # Skin names
-'skinname-standard' => 'Классическое',
-'skinname-nostalgia' => 'Ностальгия',
 'skinname-cologneblue' => 'Кёльнская тоска',
-'skinname-myskin' => 'Своё',
-'skinname-chick' => 'Цыпа',
-'skinname-simple' => 'Простое',
 'skinname-modern' => 'Современное',
 'skinname-vector' => 'Векторное',
 
@@ -3369,11 +3414,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}',
 'hours' => '{{PLURAL:$1|$1 час|$1 часа|$1 часов}}',
 'days' => '{{PLURAL:$1|$1 день|$1 дня|$1 дней}}',
+'weeks' => '{{PLURAL:$1|$1 неделя|$1 недели|$1 недель}}',
 'months' => '{{PLURAL:$1|$1 месяц|$1 месяца|$1 месяцев}}',
 'years' => '{{PLURAL:$1|$1 год|$1 года|$1 лет}}',
 'ago' => '$1 назад',
 'just-now' => 'только что',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => 'Формат должен быть следующим:
 
@@ -3401,7 +3460,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Высота',
 'exif-bitspersample' => 'Глубина цвета',
@@ -3580,7 +3639,7 @@ $1',
 'exif-originalimageheight' => 'Высота изображения до кадрирования',
 'exif-originalimagewidth' => 'Ширина изображения до кадрирования',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Несжатый',
 'exif-compression-2' => 'CCITT Group 3, 1-мерная модификация кодирования длин серий Хаффмана',
 'exif-compression-3' => 'CCITT Group 3, факсовое кодирование',
@@ -4078,12 +4137,17 @@ MediaWiki распространяется в надежде, что она бу
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Путь к статье]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Путь к скрипту]',
 
-# Special:FilePath
-'filepath' => 'Путь к файлу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Перейти',
-'filepath-summary' => 'Данная служебная страница возвращает полный путь к файлу.
-Изображения показываются в полном разрешении, другие типы файлов открываются напрямую в связанных с ними программах.',
+# Special:Redirect
+'redirect' => 'Перенаправление с файла, участника или идентификатора версии',
+'redirect-legend' => 'Перенаправление на файл или страницу',
+'redirect-summary' => 'Эта специальная страница перенаправляет на файл (с имени файла), страницу (с идентификатора версии) или страницу участника (с числового идентификатора участника).',
+'redirect-submit' => 'Перейти',
+'redirect-lookup' => 'Поиск:',
+'redirect-value' => 'Значение:',
+'redirect-user' => 'Идентификатор участника',
+'redirect-revision' => 'Версия страницы',
+'redirect-file' => 'Название файла',
+'redirect-not-exists' => 'Значение не найдено',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Поиск одинаковых файлов',
@@ -4174,6 +4238,9 @@ MediaWiki распространяется в надежде, что она бу
 'htmlform-submit' => 'Отправить',
 'htmlform-reset' => 'Отменить изменения',
 'htmlform-selectorother-other' => 'Иное',
+'htmlform-no' => 'Нет',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Выберите вариант',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 с поддержкой полнотекстового поиска',
@@ -4181,16 +4248,16 @@ MediaWiki распространяется в надежде, что она бу
 
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|удалил|удалила}} страницу $3',
-'logentry-delete-restore' => '$1 {{GENDER:$1|восстановил|восстановила}} страницу $3',
-'logentry-delete-event' => '$1 {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
-'logentry-delete-revision' => '$1 {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
-'logentry-delete-event-legacy' => '$1 {{GENDER:$1|изменил|изменила}} видимость записей журнала $3',
-'logentry-delete-revision-legacy' => '$1 {{GENDER:$1|изменил|изменила}} видимость версий на странице $3',
-'logentry-suppress-delete' => '$1 {{GENDER:$1|подавил|подавила}} страницу $3',
-'logentry-suppress-event' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
-'logentry-suppress-revision' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
-'logentry-suppress-event-legacy' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость записей журнала $3',
-'logentry-suppress-revision-legacy' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость версий на странице $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|восстановил|восстановила}} страницу $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимость записей журнала $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|изменил|изменила}} видимость версий на странице $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|подавил|подавила}} страницу $3',
+'logentry-suppress-event' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
+'logentry-suppress-revision' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
+'logentry-suppress-event-legacy' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость записей журнала $3',
+'logentry-suppress-revision-legacy' => '$1 скрытно {{GENDER:$2|изменил|изменила}} видимость версий на странице $3',
 'revdelete-content-hid' => 'содержание скрыто',
 'revdelete-summary-hid' => 'описание правки скрыто',
 'revdelete-uname-hid' => 'имя участника скрыто',
@@ -4199,20 +4266,20 @@ MediaWiki распространяется в надежде, что она бу
 'revdelete-uname-unhid' => 'имя участника раскрыто',
 'revdelete-restricted' => 'ограничения применяются к администраторам',
 'revdelete-unrestricted' => 'ограничения сняты для администраторов',
-'logentry-move-move' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4',
-'logentry-move-move-noredirect' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4 без оставления перенаправления',
-'logentry-move-move_redir' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления',
-'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления и без оставления перенаправления',
-'logentry-patrol-patrol' => '$1 {{GENDER:$1|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
-'logentry-patrol-patrol-auto' => '$1 автоматически {{GENDER:$1|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
-'logentry-newusers-newusers' => 'Создана учётная запись $1',
-'logentry-newusers-create' => 'Создана учётная запись $1',
+'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-move-move_redir-noredirect' => '$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления и без оставления перенаправления',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
+'logentry-patrol-patrol-auto' => '$1 автоматически {{GENDER:$2|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
+'logentry-newusers-newusers' => '{{GENDER:$2|Участник создал|Участница создала}} учётную запись $1',
+'logentry-newusers-create' => '{{GENDER:$2|Участник создал|Участница создала}} учётную запись $1',
 'logentry-newusers-create2' => '$1 {{GENDER:$2|создал|создала}} учётную запись $3',
 'logentry-newusers-byemail' => '$1 {{GENDER:$2|создал|создала}} учётную запись $3 и пароль был отправлен по электронной почте',
-'logentry-newusers-autocreate' => 'Автоматически создана учётная запись $1',
-'logentry-rights-rights' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3 с $4 на $5',
-'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3',
-'logentry-rights-autopromote' => 'Учётная запись «$1» была автоматически переведена из $4 в $5',
+'logentry-newusers-autocreate' => 'Автоматически создана учётная запись {{GENDER:$2|участника|участницы}} $1',
+'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',
 'rightsnone' => '(нет)',
 
 # Feedback
@@ -4288,4 +4355,7 @@ MediaWiki распространяется в надежде, что она бу
 'duration-centuries' => '$1 {{PLURAL:$1|век|века|веков}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тысячелетие|тысячелетия|тысячелетий}}',
 
+# Image rotation
+'rotate-comment' => 'Изображение повёрнуто на $1 градус{{PLURAL:$1||а|ов}} по часовой стрелке',
+
 );
index 1f04880..0931e4f 100644 (file)
@@ -148,8 +148,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Вказати кілько хоснователїв придало сторінку до свого списку слїдованых',
 'tog-oldsig' => 'Існуючій підпис:',
 'tog-fancysig' => 'Хосновати про підпис вікітекст (без автоматічного одказу)',
-'tog-externaleditor' => 'Імпліцітно хосновати екстерный едітор (лем про скусеных, выжадує шпеціалне наштелёваня компютера; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
-'tog-externaldiff' => 'Імпліцітно хосновати проґрам про порівнаваня (лем про скусеных, выжадує шпеціалне наштелёваня компютера; [//www.mediawiki.org/wiki/Manual:External_editors далшы інформації])',
 'tog-showjumplinks' => 'Актівізовати помічны одказы "перейти дo"',
 'tog-uselivepreview' => 'Хосновати швыдкый нагляд (JavaScript, експеріментално)',
 'tog-forceeditsummary' => 'Упозорнити ня, кідь не є выповнене згорнутя едітованя',
@@ -163,6 +161,7 @@ $messages = array(
 'tog-diffonly' => 'Не вказовати обсяг сторінкы під роздїлом  верзій',
 'tog-showhiddencats' => 'Вказати схованы катеґорії',
 'tog-norollbackdiff' => 'По вернутю зміны не вказовати порівнаня роздїлів',
+'tog-useeditwarning' => 'Упозорнити ня, кідь буду опущати сторінку без уложіня змін',
 
 'underline-always' => 'Все',
 'underline-never' => 'Нїґда',
@@ -226,6 +225,18 @@ $messages = array(
 '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. децембра',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Катеґорія|Катеґорії}}',
@@ -251,6 +262,7 @@ $messages = array(
 'newwindow' => '(отворить ся в новім окнї)',
 'cancel' => 'Зрушыти',
 'moredotdotdot' => 'Детайлнїше…',
+'morenotlisted' => 'Дале не є ніч ...',
 'mypage' => 'Сторінка',
 'mytalk' => 'Діскузія',
 'anontalk' => 'Діскузія к тїй IP-адресї',
@@ -366,7 +378,7 @@ $1',
 'policy-url' => 'Project:Правила',
 'portal' => 'Портал комуніты',
 'portal-url' => 'Project:Портал комуніты',
-'privacy' => 'Політіка сокочіня пріватных дан',
+'privacy' => 'Політіка сокочіня пріватных даных',
 'privacypage' => 'Project:Сокочіня пріватных дан',
 
 'badaccess' => 'Брак прав приступу',
@@ -472,7 +484,7 @@ $1',
 'directorycreateerror' => 'Не мож вытворити адресарь «$1».',
 'filenotfound' => 'Не было можне найти файл «$1».',
 'fileexistserror' => 'Не дасть ся записати до файлу «$1»: файл екзістує.',
-'unexpected' => 'Неочекавана годнота: «$1»=«$2».',
+'unexpected' => 'Несподїване значіня: «$1»=«$2».',
 'formerror' => 'Хыба: небыло можне одослати формуларь',
 'badarticleerror' => 'Тота дїя не може быти выконана на тій сторінцї.',
 'cannotdelete' => 'Не є можне вымазати сторінку або файл "$1".
@@ -529,9 +541,18 @@ $2',
 'welcomecreation-msg' => 'Ваше конто было вытворене.
 Не забудьте змінити свої [[Special:Preferences|наставлїня {{grammar:2sg|{{SITENAME}}}}]].',
 'yourname' => 'Імя хоснователя:',
+'userlogin-yourname' => 'Імя хоснователя',
+'userlogin-yourname-ph' => 'Уведьте ваше імя хоснователя',
 'yourpassword' => 'Гесло:',
+'userlogin-yourpassword' => 'Гесло',
+'userlogin-yourpassword-ph' => 'Уведьте ваше гесло',
+'createacct-yourpassword-ph' => 'Уведьте ваше гесло',
 'yourpasswordagain' => 'Повторяйте гесло:',
+'createacct-yourpasswordagain' => 'Потвердьте гесло',
+'createacct-yourpasswordagain-ph' => 'Уведьте гесло знову',
 'remembermypassword' => 'Запамнятати моє приголошіня на тім компютерї (максімално $1 {{PLURAL:$1|день|днів}})',
+'userlogin-remembermypassword' => 'Приголосити ня на довго',
+'userlogin-signwithsecure' => 'Хосновати забеспечене споїня',
 'securelogin-stick-https' => 'Останьте  припоєны через HTTPS по приголошіню',
 'yourdomainname' => 'Ваша домена:',
 'password-change-forbidden' => 'На тій вікі не можете мінити гесла.',
@@ -544,18 +565,38 @@ $2',
 'logout' => 'Одголосити',
 'userlogout' => 'Одголошіня',
 'notloggedin' => 'Не сьте приголошеный(а)',
+'userlogin-noaccount' => 'Не мате конто?',
+'userlogin-joinproject' => 'Придайте ся {{grammar:3sg|{{SITENAME}}}}',
 'nologin' => "До теперь не маєте конто? '''$1'''.",
 'nologinlink' => 'Створити конто',
 'createaccount' => 'Вытворити конто',
 'gotaccount' => "Уж сьте реґістрованы? '''$1'''.",
 'gotaccountlink' => 'Приголошіня',
 'userlogin-resetlink' => 'Забыли сьте вашы даны на приголошіня?',
-'createaccountmail' => 'електроничнов поштов',
+'userlogin-resetpassword-link' => 'Ресетовати ваше гесло',
+'helplogin-url' => 'Help:Приголошіня',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Поміч з приголошованём]]',
+'createacct-join' => 'Ниже уведьте вашы інформації',
+'createacct-emailrequired' => 'Адреса електронічной пошты',
+'createacct-emailoptional' => 'Адреса електронічной пошты (не обовязково)',
+'createacct-email-ph' => 'Уведьте вашу адресу електронічной пошты',
+'createaccountmail' => 'Схосновати дочасне гесло та загнати го на ниже написану адресу',
+'createacct-realname' => 'Правдиве імя (не обовязково)',
 'createaccountreason' => 'Причіна:',
+'createacct-reason' => 'Прічіна',
+'createacct-reason-ph' => 'Чом собі робите друге конто',
+'createacct-captcha' => 'Перевірка беспекы',
+'createacct-imgcaptcha-ph' => 'Опиште текст што видите высше',
+'createacct-submit' => 'Створити конто',
+'createacct-benefit-heading' => '{{grammar:4sg|{{SITENAME}}}} творять люде як вы.',
+'createacct-benefit-body1' => '{{PLURAL:$1|едітованя|едітованя|едітовань}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|сторінка|сторінкы|сторінок}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|недавный приспіватель|недавны приспівателї|недавных приспівателїв}}',
 'badretype' => 'Вами написаны гесла не сугласять.',
 'userexists' => 'Уведжене імя хоснователя ся уж хоснує.
 Просиме, выберьте інше імя.',
 'loginerror' => 'Хыба при приголошованю',
+'createacct-error' => 'Хыба створїня конта',
 'createaccounterror' => 'Не вдало ся створити конто хоснователя: $1',
 'nocookiesnew' => 'Конто хоснователя было створене, але не сьте приголошены.
 {{SITENAME}} хоснує cookies про приголошіня але вы маєте cookies выпнуты .
@@ -593,8 +634,8 @@ $2',
 'blocked-mailpassword' => 'Вашій IP адресї была заблокована можность едітації і сучасно з тым є заблокована функція про засланя нового гесла.',
 'eauthentsent' => 'На задану адресу електронічной пошты было послане потверджіня,
 Передтым як вам на тоту адресу буде мочі быти засылана далша пошта, слїдуйте інштрукції в ел. пошті, жебы сьте потвердили, же тота адреса справды належыть вам.',
-'throttled-mailpassword' => 'Ð\93еÑ\81ло Ñ\83ж Ð±Ñ\8bло Ñ\80аз Ð·Ð°Ñ\81лане Ð±Ñ\96гом Ñ\83плÑ\8bнÑ\83лÑ\8bÑ\85 $1 Ð³Ð¾Ð´Ð¸Ð½.
\93есло може быти заслане лем раз за $1 {{PLURAL:$1|годину|годины|годин}}.',
+'throttled-mailpassword' => 'Ð\93еÑ\81ло Ñ\83ж Ð±Ñ\8bло Ñ\80аз Ð·Ð°Ñ\81лане Ð¿Ñ\96д Ñ\87аÑ\81 {{PLURAL:$1|оÑ\81Ñ\82аÑ\82нÑ\91й Ð³Ð¾Ð´Ð¸Ð½Ñ\8b|оÑ\81Ñ\82аÑ\82нÑ\97Ñ\85 $1 Ð³Ð¾Ð´Ð¸Ð½}}.
\96ебÑ\8b Ñ\81Ñ\8f Ñ\82о Ð½Ðµ Ð·Ð»Ð¾Ð²Ð¶Ñ\8bвало Ñ\82а Ð³есло може быти заслане лем раз за $1 {{PLURAL:$1|годину|годины|годин}}.',
 'mailerror' => 'Хыба засыланя ел. пошты: $1',
 'acct_creation_throttle_hit' => 'Хоснователї приходячі з вашой IP адресы уж днесь створили {{PLURAL:$1|конто|конта|конт}}, што є дозволене максімум. Зато теперь не є дозволено з той IP адресы закладати далшы конта.',
 'emailauthenticated' => 'Адреса вашой ел. пошты была овірена дня $2 о $3.',
@@ -621,6 +662,7 @@ $2',
 # Email sending
 'php-mail-error-unknown' => 'Незнама хыба у PHP mail() функції',
 'user-mail-no-addy' => 'Проба одослати електронічну пошту без імейловой адресы.',
+'user-mail-no-body' => 'Спроба послати порожнїй або барз куртый імейл.',
 
 # Change password dialog
 'resetpass' => 'Змінити гесло',
@@ -638,30 +680,27 @@ $2',
 'resetpass-wrong-oldpass' => 'Неправилне дочасне або актуалне гесло.
 Може сьте собі уж гесло успішно змінили, або сьте выжадали нове дочасне гесло.',
 'resetpass-temp-password' => 'Дочасне гесло:',
+'resetpass-abort-generic' => 'Зміна гесла заблокована была росшырїнём.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ресет гесла',
-'passwordreset-text' => 'Выповньте тот формуларь, жебы обтримати  припомянутя детайлів вашого конта',
 'passwordreset-legend' => 'Знову наставити гесло',
 'passwordreset-disabled' => 'Зновунаставлїня гесла є на тій вікі заказане',
-'passwordreset-pretext' => '{{PLURAL:$1||Задайте єден з дат ниже}}',
+'passwordreset-emaildisabled' => 'Функції електронічной пошты были выпнуы на тій вікі.',
 'passwordreset-username' => 'Мено хоснователя:',
 'passwordreset-domain' => 'Домена:',
 'passwordreset-capture' => 'Посмотрити выслїдный імейл?',
 'passwordreset-capture-help' => 'Кідь означіте тото поличко, буде імейл (з дочасным геслом) оркем посланя хоснователёви указаный і вам.',
 'passwordreset-email' => 'Адреса електронічной пошты:',
 'passwordreset-emailtitle' => 'Детайлы конта на {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Дахто (асі вы, з IP адресы $1) пожадав о припомянутя інформацій ку вашому 
-конту на {{grammar:6sg|{{SITENAME}}}} ($4). Ку тій адресї {{PLURAL:$3|є спрягнуте наступне конто|суть спрягнуты наступны конта}}:
+'passwordreset-emailtext-ip' => 'Дахто (може Вы, з IP адресы $1) попросив о наставлїня нового гесла до вашого конта на {{grammar:6sg|{{SITENAME}}}} ($4). З тов адресов {{PLURAL:$3|є повязане наступне конто|суть повазяны слїдуючі конта}}:
 
 $2
 
-{{PLURAL:$3|Тот дочасне гесло|Тоты дочасны гесла}} кінчать{{PLURAL:$5|за єден день|за $5 днїв|за $5 днїв}}.
-Нынї бы сьте ся мав(а) приголосити і зволити нове гесло. Як тоту пожадавку
-послав дахто другый або сьте собі на своє старе гесло спомянув(а), і не хочете го
-змінити, можете тото повідомлїня іґноровати і надале хосновати старе гесло.',
-'passwordreset-emailtext-user' => '{{gender:$1|Хоснователь|Хоснователька|Хоснователь}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|попросив|попросила|попросив}} о припомянутя інформацій ку вашому
-конту на {{grammar:6sg|{{SITENAME}}}} ($4). Ку тій адресї {{PLURAL:$3|є спряжене наступне конто|суть спряжены наступну конта}}:
+{{PLURAL:$3|Тото дочасне гесло|Тоты дочасны гесла}} стануть неплатныма {{PLURAL:$5|за день|за $5 днї|за $5 днїв}}.
+Теперь бы хотїло, бы сьте ся приголосили та зволлил нове гесло. Кідь тоту просьбу післав хтось другый або сьте ся на старе гесло роспамнятали і не хочете го змінити, можете тото повідомлїня іґноровати та дале хосновати старе гесло.',
+'passwordreset-emailtext-user' => '{{gender:$1|Хоснователь|Хоснователька|Хоснователь}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|попросив|попросила|попросив}} о наставлїня нового гесла к вашому
+конту на {{grammar:6sg|{{SITENAME}}}} ($4). К тій адресї {{PLURAL:$3|є спряжене наступне конто|суть спряжены наступну конта}}:
 
 $2
 
@@ -672,8 +711,8 @@ $2
 'passwordreset-emailelement' => 'Імя хоснователя: $1
 Дочасне гесло: $2',
 'passwordreset-emailsent' => 'Імейл з геслом быв посланый.',
-'passwordreset-emailsent-capture' => 'Быв выґенерованый припоминаючій імейл, котрый є указаный ниже.',
-'passwordreset-emailerror-capture' => 'Быв выґенерованый припоминаючій імейл, котрый є указаный ниже, але одослати хоснователёви ся го не вдало: $1',
+'passwordreset-emailsent-capture' => 'Быв выґенерованый імейл з геслом, што є вказаный ниже.',
+'passwordreset-emailerror-capture' => 'Быв выґенерованый імейл з геслом, котрый є указаный ниже, але ся го не вдало загнати {{GENDER:$2|хоснователёви|хосновательцї}}: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Зміна імейловой адресы',
@@ -836,7 +875,7 @@ $2
 'copyrightwarning2' => "Просиме Вас, уважте, што вшыткы додаваня і зміны до  {{grammar:2sg|{{SITENAME}}}} можуть быти другыма хоснователями управлены, змінены ці одстранены. Покы собі не желате, жебы ваш текст быв немилосердно управляный, пак го до {{grammar:2sg|{{SITENAME}}}} не укладайте.<br />
 Уложінём приспевку ся завязуєте, же є вашым дїлом або є скопірованый із жрідел, котры не суть хоронены авторьскым правом (тзв. <em>public domain</em>), детайлы найдете на $1. '''Не копіруйте дїла хоронены авторьскым правом без дозволїня!'''",
 'longpageerror' => "'''ХЫБА: Пробуєте уложыти текст о великости {{PLURAL:$1|$1 КіБ}}, але дозволене максімум є {{PLURAL:$2|$2 КіБ}}. Ваша едітація не може быти уложена.'''",
-'readonlywarning' => "'''УВАГА: Датабаза была замкнута про утримованя, также не будете мочі уложыти свої зміны. Можете сі го окопіровати до файлу і уложыти го пізнїше.'''
+'readonlywarning' => "'''УÐ\92Ð\90Ð\93Ð\90: Ð\94аÑ\82абаза Ð±Ñ\8bла Ð·Ð°Ð¼ÐºÐ½Ñ\83Ñ\82а Ð¿Ñ\80о Ñ\83Ñ\82Ñ\80имованÑ\8f, Ñ\82акже Ð½Ðµ Ð±Ñ\83деÑ\82е Ð¼Ð¾Ñ\87Ñ\96 Ñ\83ложÑ\8bÑ\82и Ñ\81воÑ\97 Ð·Ð¼Ñ\96нÑ\8b. Ð\9cожеÑ\82е Ñ\81Ñ\96 Ð³Ð¾ Ð¾ÐºÐ¾Ð¿Ñ\96Ñ\80оваÑ\82и Ð´Ð¾ Ñ\84айлÑ\83 Ñ\96 Ñ\83ложÑ\8bÑ\82и Ð³Ð¾ Ð¿Ñ\80о Ð¿Ñ\96знÑ\97Ñ\88е.'''
 
 Адміністратор сервера, котрый датабазу замкнув, зохабив тото пояснїня: $1",
 'protectedpagewarning' => "'''Увага: Тота сторінка была замкнута, также єй можуть едітовати лем адміністраторы.'''
@@ -877,6 +916,8 @@ $2
 'content-failed-to-parse' => 'Не вдало ся проаналізовати $2 як тіп $1: $3',
 'invalid-content-data' => 'Неприпустны даны',
 'content-not-allowed-here' => 'Обсяг «$1» недозволеный на сторінцї [[$2]]',
+'editwarning-warning' => 'Зохаблїнём той стрінкы ся можуть вшыткы учінены зміны стратити.
+Кідь сьте приголошеный, можете тото варованя выпнути на картї „Едітованя“ в хосновательскім інтерфейсї.',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -1023,7 +1064,7 @@ $1",
 $1",
 'revdel-restore' => 'Змінити видимость',
 'revdel-restore-deleted' => 'вылучены ревізії',
-'revdel-restore-visible' => 'видительны ревізії',
+'revdel-restore-visible' => 'видимы ревізії',
 'pagehist' => 'Історія сторінкы',
 'deletedhist' => 'Вымазана історія',
 'revdelete-hide-current' => 'Хыба сховаваня положкы з $1 $2: їднать ся о сучасну ревізію.
@@ -1138,7 +1179,7 @@ $1",
 'search-interwiki-default' => '$1 резултаты:',
 'search-interwiki-more' => '(веце)',
 'search-relatedarticle' => 'Звязаный',
-'mwsuggest-disable' => 'Выпнути пораду AJAX',
+'mwsuggest-disable' => 'Выпнути пораду під час гляданя',
 'searcheverything-enable' => 'Глядати во вшыткых просторах назв',
 'searchrelated' => 'звязаный',
 'searchall' => 'вшыткы',
@@ -1158,15 +1199,7 @@ $1",
 'powersearch-togglenone' => 'Жадный',
 'search-external' => 'Екстерне гляданя',
 'searchdisabled' => '<p>Перебачте. Повнотекстове гляданя є дочасно недоступне. Затля можете спробовати гляданя Google; є але можне, же ёго резултаты не мусять быти актуалны.</p>',
-
-# Quickbar
-'qbsettings' => 'Панел навіґації',
-'qbsettings-none' => 'Жадный',
-'qbsettings-fixedleft' => 'Лежыть влїво',
-'qbsettings-fixedright' => 'Лежыть вправо',
-'qbsettings-floatingleft' => 'Плаваюча влїво',
-'qbsettings-floatingright' => 'Плаваюча вправо',
-'qbsettings-directionality' => 'Певный, в залежности на напрями вашого письма',
+'search-error' => 'Як ся глядало трафіла ся хыба: $1',
 
 # Preferences page
 'preferences' => 'Наставлїня',
@@ -1310,6 +1343,7 @@ $1",
 'userrights-notallowed' => 'Ваше конто не має права придати або одстранити хосновательскы права.',
 'userrights-changeable-col' => 'Ґрупы, котры можете змінити',
 'userrights-unchangeable-col' => 'Ґрупы, котры не можете змінити',
+'userrights-conflict' => 'Конфлікт прав хоснователїв! Учіньте потрібны зміны іщі раз.',
 
 # Groups
 'group' => 'Ґрупа:',
@@ -1702,7 +1736,6 @@ $1',
 'http-read-error' => 'Хыба чітаня HTTP.',
 'http-timed-out' => 'Час про HTTP пожадавкы уплинув.',
 'http-curl-error' => 'Хыба при чітаню з URL: $1',
-'http-host-unreachable' => 'Не вдало ся досягнути URL.',
 'http-bad-status' => 'Під час HTTP пожадавкы притрафив ся проблем: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1857,6 +1890,12 @@ $1',
 Асі намісто того мали бы одказовати на конкретнїшу сторінку.<br />
 Сторінка є тримана за чеперушку, кідь хоснує дакотру із шаблон одказованых на [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Сторінкы з властностями',
+'pageswithprop-legend' => 'Сторінкы з властностёв',
+'pageswithprop-text' => 'Тота сторінка обсягує список сторінкы, што хоснують вызначену властность сторінкы.',
+'pageswithprop-prop' => 'Назва властности:',
+'pageswithprop-submit' => 'Выконати',
+
 'doubleredirects' => 'Двоїты напрямлїня',
 'doubleredirectstext' => 'На тій сторінцї є список напрямлїн ведучіх на далшы напрямлїня.
 Каждый рядок обсягує одказ на перше і друге напрямлїня і ку тому ціль другого напрямлїня, котрый звычайно вказує мено „реалной“ цілёвой сторінкы, на котру бы ся мало перше напрямлїня одказовати.
@@ -2009,7 +2048,7 @@ $1',
 'linksearch-ok' => 'Глядати',
 'linksearch-text' => 'Може хосновати заступны сімболы, наприклад „*.wikipedia.org“.<br />
 Повиннов є передовшыткым домена найвысшой уровни, напр. „*.org“.<br />
-Підпорованы протоколы: <code>$1</code> (кідь не є шпеціфікованый та http://).',
+{{PLURAL:$2|Підпорованый протокол|Підпорованы протоколы}}: <code>$1</code> (кідь не є шпеціфікованый та http://).',
 'linksearch-line' => '$2 одказує на $1',
 'linksearch-error' => 'Заступны сімболы може хосновати лем на початку доменового мена.',
 
@@ -2022,7 +2061,7 @@ $1',
 # Special:ActiveUsers
 'activeusers' => 'Список актівных хоснователїв',
 'activeusers-intro' => 'Тото є список хоснователїв, котры были даяк актівны за {{plural:$1|остатнїй день|остатных $1 днїв}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|едÑ\96Ñ\82ованÑ\8f|едÑ\96Ñ\82ованÑ\8f|едÑ\96Ñ\82ованÑ\8c}} Ð±Ñ\96гом {{PLURAL:$3|остатнёго дня|остатнїх  $3 днїв}}',
+'activeusers-count' => '$1 {{PLURAL:$1|дÑ\97Ñ\8f|дÑ\97Ñ\97|дÑ\97й}} Ñ\87еÑ\80ез {{PLURAL:$3|остатнёго дня|остатнїх  $3 днїв}}',
 'activeusers-from' => 'Вказати хоснователїв, што ся зачінають на:',
 'activeusers-hidebots' => 'Сховати ботів',
 'activeusers-hidesysops' => 'Сховати адміністраторів',
@@ -2086,7 +2125,7 @@ $1',
 'usermessage-editor' => 'Сістемовый вістник',
 
 # Watchlist
-'watchlist' => 'СлÑ\97дованÑ\8b Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b',
+'watchlist' => 'СпиÑ\81ок Ñ\81лÑ\97дованÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок',
 'mywatchlist' => 'Слїдованы сторінкы',
 'watchlistfor2' => 'Про $1 ($2)',
 'nowatchlist' => 'Ваш список слїдованых сторінок є порожнїй.',
@@ -2232,6 +2271,8 @@ $UNWATCHURL
 'prot_1movedto2' => '«[[$1]]» переменована на «[[$2]]»',
 'protect-badnamespace-title' => 'Незамыкательный простор назв',
 'protect-badnamespace-text' => 'Сторінкы в тім просторї назв не годен замыкати.',
+'protect-norestrictiontypes-text' => 'Тоту сторінку не годен сокотити, бо не суть ниякы тіпы обмеджіня.',
+'protect-norestrictiontypes-title' => 'Сторінка, яку не годен замкнути',
 'protect-legend' => 'Потвердити замкнутя',
 'protectcomment' => 'Причіна:',
 'protectexpiry' => 'Кінчіть:',
@@ -2246,9 +2287,9 @@ $UNWATCHURL
 Моменталны наставлїня про сторінку : '''$1''':",
 'protect-cascadeon' => 'Тота сторінка є теперь хранена, бо є загорнута {{PLURAL:$1|до зазначеной сторінкы ніже, на яку|до ниже зазначеных сторінок, на якы}} становлена каскадова охрана. Вы можете змінити рівень охраны той сторінкы, але тото не буде впливати на каскадову охрану.',
 'protect-default' => 'Дозволити вшыткым хоснователям',
-'protect-fallback' => 'Ð\9fоÑ\80Ñ\82Ñ\80Ñ\96бнÑ\8b "$1" Ð¿Ñ\80ава',
-'protect-level-autoconfirmed' => 'Ð\91локоваÑ\82и Ð½Ð¾Ð²Ñ\8bÑ\85 Ñ\96 Ð½ÐµÐ·Ð°Ñ\80еÒ\91Ñ\96Ñ\81Ñ\82Ñ\80ованÑ\8bÑ\85 Ñ\85оÑ\81новаÑ\82елÑ\97в',
-'protect-level-sysop' => 'Ð\9bем Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8b',
+'protect-fallback' => 'Ð\94озволено Ð»ÐµÐ¼ Ñ\85оÑ\81новаÑ\82елÑ\8fм Ð· Ð¿Ñ\80авом â\80\9e$1â\80\9c',
+'protect-level-autoconfirmed' => 'Ð\94озволиÑ\82и Ð»ÐµÐ¼ Ð°Ð²Ñ\82омаÑ\82Ñ\96Ñ\87но Ð¿Ð¾Ñ\82веÑ\80дженÑ\8bм Ñ\85оÑ\81новаÑ\82елÑ\8fм',
+'protect-level-sysop' => 'Ð\94озволено Ð»ÐµÐ¼ Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ам',
 'protect-summary-cascade' => 'каскадовый',
 'protect-expiring' => 'кінчіть $1 (UTC)',
 'protect-expiring-local' => 'кінчіть ся $1',
@@ -2509,6 +2550,7 @@ $1',
 'proxyblocksuccess' => 'Готово.',
 'sorbsreason' => 'Ваша IP-адреса є веджена як отвореный проксі в DNSBL.',
 'sorbs_create_account_reason' => 'Ваша IP-адреса є веджена як одкрытый проксі в DNSBL. З той адресы собі не можете створити конто.',
+'xffblockreason' => 'IP адреса написана в голові X-Forwarded-For, ці уж ваша, або проксі сервера, што хоснуєете, была заблокована. Оріґінална прічіна того блокованя: $1',
 'cant-block-while-blocked' => 'Не можете блоковати іншых хоснователїв, кідь сьте сам заблокованый(а).',
 'cant-see-hidden-user' => 'Хоснователь, котрого хочете заблоковати, уж быв заблокованый і схованый. Кідьже не маєте права hideuser, не можете собі наставлїня блокованя того хоснователя посмотрити ани го змінити.',
 'ipbblocked' => 'Не можете блоковати або одблоковати іншых хоснователїв, {{GENDER:|сам|сама|сам}} сьте {{GENDER:|заблокованый|заблокована|заблокованый}}',
@@ -2536,14 +2578,14 @@ $1',
 # Move page
 'move-page' => 'Переменовати „$1“',
 'move-page-legend' => 'Переменовати сторінку',
-'movepagetext' => "ХоÑ\81нÑ\83вÑ\87Ñ\96 Ñ\84оÑ\80мÑ\83 Ð½Ð¸Ð¶Ðµ, Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80еменоваÑ\82и Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83, Ñ\94днÑ\8bм Ñ\80азом перемістивши на нове місце і лоґ єй едітовань.
-СÑ\82аÑ\80а Ð½Ð°Ð·Ð²Ð° Ñ\81Ñ\82ане Ð¿ÐµÑ\80енапÑ\80Ñ\8fмлинÑ\91м Ð½Ð° Ð½Ð¾Ð²Ñ\83 Ð½Ð°Ð·Ð²Ñ\83.
-Можете автоматично обновити напрямлиня на стару назву.
-Кідь вы тото не зробите, просиме Вас, перевірте наявність [[Special:DoubleRedirects|подвойных]] ці [[Special:BrokenRedirects|розорваных]] напрямлїнь.
+'movepagetext' => "ХоÑ\81нÑ\83вÑ\87Ñ\96 Ñ\84оÑ\80мÑ\83 Ð½Ð¸Ð¶Ðµ, Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80еменоваÑ\82и Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83, Ñ\82акой перемістивши на нове місце і лоґ єй едітовань.
+Стара назва стане напрямлинём на нову назву.
+Можете автоматично обновити напрямлїня на стару назву.
+Кідь вы тото не зробите, просиме Вас, перевірте [[Special:DoubleRedirects|подвойны]] ці [[Special:BrokenRedirects|розорваны]] напрямлїня.
 Вы одповідате за то, жебы одказы і надале вказовали там, де мають.
 
-Уважте, же сторінка '''не''' буде переменована, кідь сторінка з новов назвов уж екзістує, окрем того, коли она порожня або є напрямлїнём, а лоґ єй едітовань порожнїй.
-То Ð·Ð½Ð°Ñ\87Ñ\96Ñ\82Ñ\8c, Ð¶Ðµ Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð²ÐµÑ\80нÑ\83Ñ\82и Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\97 Ñ\81Ñ\82аÑ\80Ñ\83 Ð½Ð°Ð·Ð²Ñ\83, ÐºÑ\96дÑ\8c Ð²Ñ\8b Ð¿ÐµÑ\80еменовали Ñ\94й Ð¿Ð¾Ð¼Ñ\8bлково, Ð°Ð»Ðµ Ð²Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80епиÑ\81аÑ\82и ÐµÐºÐ·Ñ\96Ñ\81Ñ\82уючу сторінку.
+Уважте, же сторінка '''не''' буде переменована, кідь сторінка з новов назвов уж існує, окрем того, коли она порожня або є напрямлїнём, а лоґ єй едітовань порожнїй.
+То Ð·Ð½Ð°Ñ\87Ñ\96Ñ\82Ñ\8c, Ð¶Ðµ Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð²ÐµÑ\80нÑ\83Ñ\82и Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\97 Ñ\81Ñ\82аÑ\80Ñ\83 Ð½Ð°Ð·Ð²Ñ\83, ÐºÑ\96дÑ\8c Ð²Ñ\8b Ð¿ÐµÑ\80еменовали Ñ\94й Ð½ÐµÐ½Ð°Ñ\80оком, Ð°Ð»Ðµ Ð²Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80епиÑ\81аÑ\82и Ñ\96Ñ\81нуючу сторінку.
 
 '''ВАРОВАНЯ!'''
 Тота дїя може ся стати причінов серіозных а неочекованых змін популарных сторінок.
@@ -2670,6 +2712,8 @@ $1',
 'thumbnail-more' => 'Звекшыти',
 'filemissing' => 'Файл хыбить',
 'thumbnail_error' => 'Хыба створїня нагляду: $1',
+'thumbnail_error_remote' => 'Хыбове голошіня з {{grammar:2sg|$1}}:
+$2',
 'djvu_page_error' => 'Сторінка DjVu мімо россяг',
 'djvu_no_xml' => 'Створїня XML про файл DjVu ся не вдало.',
 'thumbnail-temp-create' => 'Дочасный файл нагляду негодно было створити',
@@ -2779,7 +2823,7 @@ $1',
 'tooltip-n-recentchanges' => 'Список послїднїх змін',
 'tooltip-n-randompage' => 'Іти на трафункову сторінку',
 'tooltip-n-help' => 'Посмотрити поміч',
-'tooltip-t-whatlinkshere' => 'СпиÑ\81ок Ð²Ñ\88Ñ\8bÑ\82кÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок, Ñ\88Ñ\82о Ð¾Ð´ÐºÐ°Ð·Ñ\83Ñ\8eÑ\82Ñ\8c Ñ\81Ñ\8f на тоту сторінку',
+'tooltip-t-whatlinkshere' => 'СпиÑ\81ок Ð²Ñ\88Ñ\8bÑ\82кÑ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок, Ñ\88Ñ\82о Ð·Ð°Ð³Ð°Ð½Ñ\8fÑ\8eÑ\82Ñ\8c на тоту сторінку',
 'tooltip-t-recentchangeslinked' => 'Послїднї зміны на сторінках, котры мають одказ на тїй сторінцї',
 'tooltip-feed-rss' => 'RSS канал про тоту сторінку',
 'tooltip-feed-atom' => 'Atom канал гевсёй сторінкы',
@@ -2855,6 +2899,7 @@ $1',
 'pageinfo-robot-noindex' => 'Не індексує ся',
 'pageinfo-views' => 'Чісло переглядів',
 'pageinfo-watchers' => 'Кількость слїдуючіх сторінку',
+'pageinfo-few-watchers' => 'Менше як $1 {{PLURAL:$1|слїдуючій|слїдуючі|слїдуючіх}}',
 'pageinfo-redirects-name' => 'Напрямлїня на гевсю сторінку',
 'pageinfo-subpages-name' => 'Підсторінкы гевсёй сторінкы',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|напрямлїня}}; $3 {{PLURAL:$3|ненапрямлїня}})',
@@ -2869,6 +2914,7 @@ $1',
 'pageinfo-magic-words' => '{{PLURAL:$1|Маґічне слово|Маґічны слова}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрыта катеґорія|Скрыты катеґорії}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Хоснована шаблона|Хоснованы шаблоны}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Сторінка, до котрой|Сторінкы, до котрых}} є тота сторінка вложена ($1)',
 'pageinfo-toolboxlink' => 'Інформації о сторінцї',
 'pageinfo-redirectsto' => 'Напрямлює на',
 'pageinfo-redirectsto-info' => 'інформація',
@@ -2877,6 +2923,10 @@ $1',
 'pageinfo-protect-cascading' => 'Одты ся почінать каскадна охорона',
 'pageinfo-protect-cascading-yes' => 'Гей',
 'pageinfo-protect-cascading-from' => 'Каскадна охорона ся почінать гев',
+'pageinfo-category-info' => 'Інформація о катеґорії',
+'pageinfo-category-pages' => 'Кількость сторінок',
+'pageinfo-category-subcats' => 'Кількость підкатеґорій',
+'pageinfo-category-files' => 'Кількость файлів',
 
 # Patrolling
 'markaspatrolleddiff' => 'Означіти як перевірене',
@@ -2954,15 +3004,31 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}',
 'hours' => '{{PLURAL:$1|$1 година|$1 годины|$1 годин}}',
 'days' => '{{PLURAL:$1|$1 день|$1 днї|$1 днїв}}',
+'weeks' => '{{PLURAL:$1|$1 тыждень|$1 тыжднї|$1 тыжднїв}}',
+'months' => '{{PLURAL:$1|$1 місяць|$1 місяцї|$1 місяцїв}}',
+'years' => '{{PLURAL:$1|$1 рік|$1 рокы|$1 років}}',
 'ago' => '$1 тому',
 'just-now' => 'акурат теперь',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => 'Формат має быти наступным:
 
 
 Раховати ся будуть лем елементы (рядкы, што ся почінають з *).
-Першый одказ рядка має быти одказом на планый файл.
+Першый одказ рядка має быти одказом на файл, якому ся не дозволює зображованя на сторінках.
 Далшы одказы у тім самім рядку будуть уважены як выняткы, наприклад сторінкы, де зображіня може быти вложене.',
 
 # Metadata
@@ -2986,7 +3052,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Шырька',
 'exif-imagelength' => 'Вышка',
 'exif-bitspersample' => 'Глубка фарбы',
@@ -3164,7 +3230,7 @@ $1',
 'exif-originalimageheight' => 'Вышка образчіка перед орїзанём',
 'exif-originalimagewidth' => 'Шырка образчіка перед орїзанём',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Нестиснутый',
 'exif-compression-2' => '1-дімензіоналне Гуффманове кодованя довжкы бігу CCITT Group 3',
 'exif-compression-3' => 'Кодованя факсів CCITT Group 3',
@@ -3571,11 +3637,17 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'version-entrypoints-header-entrypoint' => 'Вступный пункт',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Стежка ку файлу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Выконати',
-'filepath-summary' => 'Тота шпеціална сторінка вертать повну стежку к файлу. Образкы ся зобразять в повнім розлишіню, іншы тіпы файлів ся отворять в асоціованых проґрамах.',
+# Special:Redirect
+'redirect' => 'Напрямлїня за файлом, хоснователям або ID ревізії',
+'redirect-legend' => 'Напрямити на файл або сторінку',
+'redirect-summary' => 'Тота шпеціална сторінка напрямує на файл (по назві), сторінку (по ID ревізії) або хоснователя (по чіселнім хоснователёвім ID).',
+'redirect-submit' => 'Перейти',
+'redirect-lookup' => 'Найти:',
+'redirect-value' => 'Значіня',
+'redirect-user' => 'ID хоснователя',
+'redirect-revision' => 'Ревізія сторінкы',
+'redirect-file' => 'Назва файлу',
+'redirect-not-exists' => 'Значіня ся не нашло',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Гляданя дуплікатных файлів',
@@ -3603,7 +3675,7 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'specialpages-group-highuse' => 'Часто поужываны сторінкы',
 'specialpages-group-pages' => 'Спискы сторінок',
 'specialpages-group-pagetools' => 'Інштрументы сторінок',
-'specialpages-group-wiki' => 'Ð\92Ñ\96кÑ\96 Ð´Ð°Ñ\82а і інштрументы',
+'specialpages-group-wiki' => 'Ð\94анÑ\8b і інштрументы',
 'specialpages-group-redirects' => 'Напрямлїня',
 'specialpages-group-spam' => 'Протиспамовы інштрументы',
 
@@ -3666,23 +3738,26 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'htmlform-submit' => 'Одослати',
 'htmlform-reset' => 'Вернути зміны',
 'htmlform-selectorother-other' => 'Інше',
+'htmlform-no' => 'Нє',
+'htmlform-yes' => 'Гей',
+'htmlform-chosen-placeholder' => 'Звольте параметер',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з підпоров повнотекстового гляданя',
 'sqlite-no-fts' => '$1 без підпоры повнотекстового гляданя',
 
 # New logging system
-'logentry-delete-delete' => '$1 змазав сторінку $3',
-'logentry-delete-restore' => '$1 обновив сторінку $3',
-'logentry-delete-event' => '$1 змінив відимость {{PLURAL:$5|протоколового запису|$5 протоколовых записів}} к сторінцї $3: $4',
-'logentry-delete-revision' => '$1 змінив відимость {{PLURAL:$5|ревізії|$5 ревізій}} на сторінцї $3: $4',
-'logentry-delete-event-legacy' => '$1 змінив відимость протоколовых записів к сторінцї $3',
-'logentry-delete-revision-legacy' => '$1 змінив відимость ревізій на сторінцї $3',
-'logentry-suppress-delete' => '$1 утаїв сторінку $3',
-'logentry-suppress-event' => '$1 тайком змінив відимость {{PLURAL:$5|протоколового запису|$5 протоколовых записів}} к сторінцї $3: $4',
-'logentry-suppress-revision' => '$1 тайком змінив відимость {{PLURAL:$5|ревізії|$5 ревізій}} на сторінцї $3: $4',
-'logentry-suppress-event-legacy' => '$1 тайком змінив відимость протоколовых записів к сторінцї $3',
-'logentry-suppress-revision-legacy' => '$1 тайком змінив відимость ревізій на сторінцї $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|змазав|змазала}} сторінку $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|обновив|обновила}} сторінку $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|змінив|змінила}}  відимость {{PLURAL:$5|протоколового запису|$5 протоколовых записів}} к сторінцї $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|змінив|змінила}}  відимость {{PLURAL:$5|ревізії|$5 ревізій}} на сторінцї $3: $4',
+'logentry-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|протоколового запису|$5 протоколовых записів}} к сторінцї $3: $4',
+'logentry-suppress-revision' => '$1 тайком {{GENDER:$2|змінив|змінила}}  відимость {{PLURAL:$5|ревізії|$5 ревізій}} на сторінцї $3: $4',
+'logentry-suppress-event-legacy' => '$1 тайком {{GENDER:$2|змінив|змінила}}  відимость протоколовых записів к сторінцї $3',
+'logentry-suppress-revision-legacy' => '$1 тайком {{GENDER:$2|змінив|змінила}} відимость ревізій на сторінцї $3',
 'revdelete-content-hid' => 'скрыти обсяг',
 'revdelete-summary-hid' => 'опис едітованя схованый',
 'revdelete-uname-hid' => 'імя хоснователя сховане',
@@ -3691,19 +3766,20 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'revdelete-uname-unhid' => 'імя хоснователя одкрыте',
 'revdelete-restricted' => 'приданы обмеджіня про адміністраторів',
 'revdelete-unrestricted' => 'зняты обмеджіня про адміністраторів',
-'logentry-move-move' => '$1 переменовав сторінку $3 на $4',
-'logentry-move-move-noredirect' => '$1 переменовав сторінку $3 на $4 без створїня напрямлїня',
-'logentry-move-move_redir' => '$1 переменовав сторінку $3 на $4 з вычерянём напрямлїнём',
-'logentry-move-move_redir-noredirect' => '$1 переменовав сторінку $3 на $4 місце напрямлїня без створїня напрямлїня',
-'logentry-patrol-patrol' => '$1 означів ревізію $4 сторінкы $3 як перевірену',
-'logentry-patrol-patrol-auto' => '$1 автоматічно означів ревізію $4 сторінкы $3 як перевірену',
-'logentry-newusers-newusers' => 'Створене хосновательске конто $1',
-'logentry-newusers-create' => 'Створене было хосновательске конто $1',
-'logentry-newusers-create2' => '$1 створив хосновательске конто $3',
-'logentry-newusers-autocreate' => 'Автоматічно было створене конто $1',
+'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-move-move_redir-noredirect' => '$1 {{GENDER:$2|змінив|змінила}} сторінку $3 на $4 місце напрямлїня без створїня напрямлїня',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|означів|означіла}} ревізію $4 сторінкы $3 як перевірену',
+'logentry-patrol-patrol-auto' => '$1 автоматічно {{GENDER:$2|означів|означіла}} ревізію $4 сторінкы $3 як перевірену',
+'logentry-newusers-newusers' => 'Было {{GENDER:$2|створене}} хосновательске конто $1',
+'logentry-newusers-create' => 'Было {{GENDER:$2|створене}} хосновательске конто $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|створив|створила}} хосновательске конто $3',
+'logentry-newusers-byemail' => '$1 {{GENDER:$2|створив|створила}} хосновательске конто $3, гесло послане было імейлом',
+'logentry-newusers-autocreate' => 'Автоматічно было {{GENDER:$2|створене}} конто $1',
 'logentry-rights-rights' => '$1 {{GENDER:$1|змінив|змінила}} членство в ґрупах про $3 із $4 на $5',
 'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|змінив|змінила}} членство в ґрупах про $3',
-'logentry-rights-autopromote' => '$1 было автоматічно переведено із $4 в $5',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|быв автоматічно переведеный|была автоматічно переведана}} з $4 на $5',
 'rightsnone' => '(жадне)',
 
 # Feedback
@@ -3758,6 +3834,7 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'api-error-ok-but-empty' => 'Внутрїшня хыба: сервер не одповідать.',
 'api-error-overwrite' => 'Не є дозволене переписати екзістуючій файл.',
 'api-error-stashfailed' => 'Внутрїшня хыба: серверу ся не вдало уложыти дочасный файл.',
+'api-error-publishfailed' => 'Внутрїшня хыба: серверови ся не вдало опубліковати дочасный файл.',
 'api-error-timeout' => 'Сервер не одповідав в очекаванім часї.',
 'api-error-unclassified' => 'Трафила ся незнама хыба.',
 'api-error-unknown-code' => 'Незнама хыба: „$1“',
@@ -3778,4 +3855,7 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'duration-centuries' => '$1 {{PLURAL:$1|стороча|стороча|стороч}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тісячроча|тісячроча|тісячроч}}',
 
+# Image rotation
+'rotate-comment' => 'Образчік обернутый о $1 {{PLURAL:$1|ґрадус|ґрадусів}} за цайґером',
+
 );
index 6f30d2a..0828c2a 100644 (file)
@@ -172,7 +172,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#पुनर्निदेशन', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#पुनर्निदेशन', '#अनुप्रेषित', '#REDIRECT' ),
        'notoc'                     => array( '0', '__नैवअनुक्रमणी__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__नैवसंक्रमणका__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__अनुक्रमणीसचते__', '__FORCETOC__' ),
@@ -308,8 +308,6 @@ $messages = array(
 'tog-shownumberswatching' => 'निरीक्षमाणानां योजकानां संख्या दर्श्यताम्',
 'tog-oldsig' => 'विद्यमानं हस्ताङ्कनम्:',
 'tog-fancysig' => 'हस्ताक्षराणि विकिपाठवत् सन्तु (स्वचालित-संबंधनेभ्यः रहितानि)।',
-'tog-externaleditor' => 'Use external editor by default (for experts only, needs special settings on your computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'अकथिते (बाइ डिफाल्ट् इति), बाह्य अंतरक्रमादेशं प्रयोजयतु (केवलेभ्यः निपुणेभ्यः, भवतः संगणके विशेषाः न्यासाः आवश्यकाः)।',
 'tog-showjumplinks' => '"इत्येतत् प्रति कूर्दयतु" इति संबंधनानि समर्थयतु।',
 'tog-uselivepreview' => 'संपादनेन सहैव प्राग्दृश्यं दर्शयतु (जावालिपिः अपेक्ष्यते) (प्रयोगात्मकम्)।',
 'tog-forceeditsummary' => 'सम्पादनसारांशः न ददामि चेत् तदा मां ज्ञापयतु।',
@@ -323,6 +321,7 @@ $messages = array(
 'tog-diffonly' => 'आवृत्तिसु अंतरं दर्शयन् पुरातनाः आवृत्तयः मा दर्शयतु।',
 'tog-showhiddencats' => 'निगूढाः वर्गाः दर्श्यन्ताम्',
 'tog-norollbackdiff' => 'पूर्णप्रतिगमने कृते मा दर्शयतु तद् अंतरम्।',
+'tog-useeditwarning' => 'सम्पादनानन्तरं रक्षणेन विना पृष्ठत्यागावसरे स्मार्यताम्',
 
 'underline-always' => 'सर्वदा',
 'underline-never' => 'कदापि न',
@@ -786,6 +785,7 @@ You may ignore this message, if this account was created in error.',
 # Email sending
 'php-mail-error-unknown' => 'पीएच्पी इत्येतस्य mail() फलने अज्ञाता काऽपि त्रुटिर्जाता।',
 'user-mail-no-addy' => 'ईपत्रसङ्केतं विना ईपत्रप्रेषणस्य प्रयासः कृतः ।',
+'user-mail-no-body' => 'भवता खलु विद्युत्पत्रं रिक्ततया अथवा अतिलघुरूपेण प्रेषितुं चेष्टितम्।',
 
 # Change password dialog
 'resetpass' => 'कूटशब्दः परिवर्त्यताम्',
@@ -1038,6 +1038,8 @@ $2
 'defaultmessagetext' => 'सन्देशपाठं स्थिरयतु ।',
 'invalid-content-data' => 'अमान्यः सामग्रीदत्तांशः',
 'content-not-allowed-here' => '[[$2]] इति पृष्ठे "$1" सामग्री अनुमता नास्ति।',
+'editwarning-warning' => 'अस्मात् पृष्ठात् गमनेन अत्र भवता कृतानि परिवर्तनानि निष्फलानि भवेयुः ।
+भवता यदि प्रविष्टं तर्हि मम इष्टतमानि इत्यत्र अस्मिन् विभागे सम्पादनेन एषः प्रबोधः यथा न आगच्छेत् तथा कर्तुं शक्यते ।',
 
 # Content models
 'content-model-wikitext' => 'विकिपाठः',
@@ -1305,15 +1307,6 @@ You can still [$1 view this revision]",
 अश्मिन् समये भवान् गूगल माध्यमेन अन्वेषणं कर्तुं शक्नोति
 स्मरयतु यत् {{SITENAME}} इति स्थलस्य क्रमाङ्का नैव अद्यातना  इति सोच्यते।',
 
-# Quickbar
-'qbsettings' => 'शीघ्रपट',
-'qbsettings-none' => 'नास्ति',
-'qbsettings-fixedleft' => 'बामे स्थापितः',
-'qbsettings-fixedright' => 'दक्षिणे स्थापितः',
-'qbsettings-floatingleft' => 'वामप्लवनम् ।',
-'qbsettings-floatingright' => 'दक्षिणे प्लवनम् ।',
-'qbsettings-directionality' => 'निश्चितम् । ते भाषालिप्याः दिशात्मकतानुसारं भवति ।',
-
 # Preferences page
 'preferences' => 'इष्टतमानि',
 'mypreferences' => 'मम इष्टतमानि',
@@ -1855,7 +1848,6 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'http-read-error' => 'HTTP पठनदोषः।',
 'http-timed-out' => 'HTTP अभ्यर्थनं कालातीतम् ।',
 'http-curl-error' => 'दोषाहरणस्य URL: $1',
-'http-host-unreachable' => 'URL प्राप्तुं न शक्यते ।',
 'http-bad-status' => 'HTTP : $1 $2अभ्यर्थने समस्या आसीत् ।',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2014,6 +2006,9 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 एतानि यथार्थविषैः योजनीयानि । <br />
 यदि कोऽपि पुटेन प्रकृतिं प्रयोजयति यः  [[MediaWiki:Disambiguationspage]] इत्यनेन अनुबद्धः  ससन्दिग्धपुटम् इति उच्यते ।',
 
+'pageswithprop' => 'प्रगुणविशेषयुतानि पृष्ठानि',
+'pageswithprop-legend' => 'प्रगुणविशेषयुतानि पृष्ठानि',
+
 'doubleredirects' => 'दुगुनी-अनुप्रेषिते',
 'doubleredirectstext' => 'एतत्पुटं तेषां पुटानां सूची अस्ति यानि अन्यपुनर्निदेशितपुटानि प्रति पुनरिदेशितानि सन्ति । 
 प्रत्येकं पङ्क्तिः प्रथमद्वितीयपुनर्निदेशम् अन्तर्गता । द्वितीयपुनर्निदेशः लक्ष्यं यत् वास्तवं लक्ष्यपुटं प्रथमं प्रदर्शितम् । 
@@ -2262,8 +2257,8 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'notvisiblerev' => 'अन्ययोजकेन कृतम् अवतरणम् अपमर्जितम् ।',
 'watchnochange' => 'दर्शितावधौ अवलोकितपदार्थाः न सम्पादिताः ।',
 'watchlist-details' => '{{PLURAL:$1|$1 पृष्ठं|$1 पृष्ठानि}} भवतः अवेक्षणसूच्यां सन्ति, सम्भाषणपृष्ठानि नात्र गणितानि।',
-'wlheader-enotif' => 'विद्युन्मानपत्रस्य सूचनाः सक्रियाः ।',
-'wlheader-showupdated' => 'भवतः सन्दर्शनस्य पश्चात् परिवर्तितानि पुटानि स्थूलाक्षरैः निर्दिष्टानि ।',
+'wlheader-enotif' => 'विद्युन्मानपत्रस्य सूचनाः सक्रियाः ।',
+'wlheader-showupdated' => 'भवतः सन्दर्शनस्य पश्चात् परिवर्तितानि पुटानि स्थूलाक्षरैः निर्दिष्टानि ।',
 'watchmethod-recent' => 'अवलोकितपुटानां सद्यः सम्पादनस्य परीक्षणम् ।',
 'watchmethod-list' => 'सद्यः सम्पादनार्थम् अवलोकितपुटानां परीक्षणम् ।',
 'watchlistcontains' => 'भवतः अवलोकनावली $1 युक्तास्ति ।{{PLURAL:$1|page|pages}}.',
@@ -3043,14 +3038,11 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'pageinfo-category-info' => 'वर्गविषयकसूचना',
 'pageinfo-category-pages' => 'पृष्ठानां सङ्ख्या',
 'pageinfo-category-subcats' => 'उपवर्गानां सङ्ख्या',
+'pageinfo-category-files' => 'सञ्चिकानां सङ्ख्या',
 
 # Skin names
-'skinname-standard' => 'पूर्व',
-'skinname-nostalgia' => 'पुराण',
 'skinname-cologneblue' => 'नील',
 'skinname-monobook' => 'पुस्तक',
-'skinname-myskin' => 'मे चर्मन्',
-'skinname-chick' => 'Chick',
 
 # Patrolling
 'markaspatrolleddiff' => 'आरक्षितमिति अङ्कयतु ।',
@@ -3159,7 +3151,7 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'विस्तारः',
 'exif-imagelength' => 'औन्नत्यम्',
 'exif-bitspersample' => 'प्रत्येकं भागस्य अंशः ।',
@@ -3337,7 +3329,7 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'exif-originalimageheight' => 'कर्तनात्पूरव चित्रस्य औन्नत्यम् ।',
 'exif-originalimagewidth' => 'कर्तनात् पूर्वं चित्रस्य व्यासः ।',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'असङ्कोचितम् ।',
 'exif-compression-2' => 'CCITT समूहः 3 1- Dimensional Modified Huffman run length encoding',
 'exif-compression-3' => 'CCITT समूह ३ फेक्स  सङ्केतीकरणम् ।',
@@ -3743,13 +3735,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'प्रवेशबिन्दुः ।',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'सञ्चिकापथः ।',
-'filepath-page' => 'सञ्चिका:',
-'filepath-submit' => 'गम्यताम्',
-'filepath-summary' => 'एतद्विशेषपुटं सञ्चिकायाः पूर्णपथं प्रदर्शयति । 
-चित्राणि परिपूर्णसत्वयुतानि दर्शितानि । अन्यसञ्चिकाभेदाः सम्बद्धकार्यकलापैः प्रत्यक्षं आरब्धाः ।',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'प्रतिकृतिसञ्चिकार्थम् अन्विषतु ।',
 'fileduplicatesearch-summary' => 'सम्मिश्रमौल्यामूलयुतर्थं  प्रतिकृतिसञ्चिकार्थम् अन्विषतु ।',
index b465a21..a5df584 100644 (file)
@@ -13,6 +13,7 @@
  * @author HalanTul
  * @author Kaganer
  * @author Meno25
+ * @author Nemo bis
  * @author Urhixidur
  */
 
@@ -73,8 +74,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Сирэйи кэтээн көрөр дьон ахсаанын көрдөр',
 'tog-oldsig' => 'Баар илии баттааһын:',
 'tog-fancysig' => 'Бэйэ илии баттааһына (ыйынньыга суох)',
-'tog-externaleditor' => 'Атын этиллибэтэҕинэ тас эрэдээктэри туһан (билэр дьоҥҥо аналлаах, сиһилии [//www.mediawiki.org/wiki/Manual:External_editors манна] көр)',
-'tog-externaldiff' => 'Атын этиллибэтэҕинэ барыллары тэҥниир тас программаны туһан (билэр дьоҥҥо аналлаах, сиһилии [//www.mediawiki.org/wiki/Manual:External_editors манна] көр)',
 'tog-showjumplinks' => '"Манна бар" ыйынньыктары көрдөр',
 'tog-uselivepreview' => 'Тутатына хайдах буоларын көрүү (JavaScript, тургутуу быһыытынан)',
 'tog-forceeditsummary' => 'Тугу уларыппытым туһунан суруйбатахпына сэрэт',
@@ -88,6 +87,7 @@ $messages = array(
 'tog-diffonly' => 'Икки барылы тэҥнииргэ сирэй иһин көрдөрүмэ',
 'tog-showhiddencats' => 'Кистэммит категориялары көрдөр',
 'tog-norollbackdiff' => 'Төннөрүү кэнниттэн барыллар уратыларын көрдөрүмэ',
+'tog-useeditwarning' => 'Эрэдээксийэлиир сирэйтэн уларытыыларбын бигэргэппэккэ тахсаары гыннахпына сэрэтээр',
 
 'underline-always' => 'Куруук',
 'underline-never' => 'Аннынан тардыма',
@@ -151,6 +151,18 @@ $messages = array(
 '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',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категориялар}}',
@@ -455,9 +467,18 @@ $2',
 'welcomecreation-msg' => 'Аатыҥ бэлиэтэннэ.
 {{SITENAME}} ситим-сиргэ үлэлииргэ табыгастаах буоллун диэн [[Special:Preferences|тус туруорууларгын]] уларытыаххын сөп.',
 'yourname' => 'Кыттааччы аатыҥ:',
+'userlogin-yourname' => 'Бэлиэ-аат',
+'userlogin-yourname-ph' => 'Бэлиэ-ааккын киллэр',
 'yourpassword' => 'Киирии тыла:',
+'userlogin-yourpassword' => 'Киирии тыл',
+'userlogin-yourpassword-ph' => 'Киирии тылгын суруй',
+'createacct-yourpassword-ph' => 'Киирии тылгын суруй',
 'yourpasswordagain' => 'Киирии тылгын хатылаа:',
+'createacct-yourpasswordagain' => 'Киирии тылгын бигэргэт',
+'createacct-yourpasswordagain-ph' => 'Киирии тылгын хатылаа',
 'remembermypassword' => 'Миигин бу көмпүүтэргэ сигээ ($1 {{PLURAL:$1|күн|күнтэн ордуга суох}})',
+'userlogin-remembermypassword' => 'Тиһиликтэн тахсыма',
+'userlogin-signwithsecure' => 'Бигэ холбонуу',
 'securelogin-stick-https' => 'Киирэн баран HTTPS нөҥүө холбонууну салгыырга',
 'yourdomainname' => 'Эн дөмүөнүҥ:',
 'password-change-forbidden' => 'Бу биикигэ киирии тылы уоарытар табыллыбат.',
@@ -470,18 +491,38 @@ $2',
 'logout' => 'Тахсыы',
 'userlogout' => 'Тахсыы',
 'notloggedin' => 'Ааккын эппэтиҥ',
+'userlogin-noaccount' => 'Бэлиэтэнэ иликкин дуо?',
+'userlogin-joinproject' => '{{SITENAME}} ситим-сиргэ киирии',
 'nologin' => "Бэлиэтэнэ иликкин дуо? '''$1'''.",
 'nologinlink' => 'Бэлиэтэнии',
 'createaccount' => 'Бэлиэтэнии',
 'gotaccount' => "Бэлиэтэммитиҥ дуо? '''$1'''.",
 'gotaccountlink' => 'Аатыҥ',
 'userlogin-resetlink' => 'Киирэр тылгын умнубуккун дуо?',
+'userlogin-resetpassword-link' => 'Киирии тылы уларытыы',
+'helplogin-url' => 'Help:Бэлиэ-ааты киллэрии',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Бэлиэтэниигэ көмө]]',
+'createacct-join' => 'Аллара суруй.',
+'createacct-emailrequired' => 'Email аадырыс',
+'createacct-emailoptional' => 'Email аадырыс (булгуччута суох)',
+'createacct-email-ph' => 'Эл аадырыскын суруй',
 'createaccountmail' => 'Быстах киирии тылы туһаныы уонна ону email-ынан ыытыы',
+'createacct-realname' => 'Дьиҥнээх аатыҥ (булгуччута суох)',
 'createaccountreason' => 'Төрүөтэ:',
+'createacct-reason' => 'Төрүөтэ',
+'createacct-reason-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|кыттааччы|кыттааччы}}',
 'badretype' => 'Киирии тылларыҥ сөп түбэспэтилэр.',
 'userexists' => 'Суруйбут аатыҥ бэлиэр баар.
 Бука диэн, атын аатта тал.',
 'loginerror' => 'Ааккын система билбэтэ',
+'createacct-error' => 'Бэлиэтэнии кэмигэр алҕас таҕыста',
 'createaccounterror' => 'Саҥа аат бэлиэтиир кыах суох: $1',
 'nocookiesnew' => 'Маннык ааттаах кыттааччы баар буолла гынан баран, систиэмэҕэ киирэ илик. {{SITENAME}} «cookies» туттар, оттон эн көмпүүтэргэр ону туһанар бобуллубут. Бука диэн «cookies» холбоо, онтон өссө киирэн көр.',
 'nocookieslogin' => '{{SITENAME}} дьону билэргэ «cookies» туттар. Эн көмпүүтэргэр «cookies» бобуллубут. Ону холбоон баран өссө киирэн көр.',
@@ -520,8 +561,8 @@ $2',
 онон киирии тылы өйдөтөр кыах эмиэ суох.',
 'eauthentsent' => 'Быстах кэмҥэ туттуллар киирии тыл саҥа кыттааччы эл. почтатыгар ыытылынна.
 Бу аадырыс эйиэнэ буоларын бигэргэтэргэ өссө тугу гыныахтааҕыҥ туһунан сурукка кэпсэниллэр.',
-'throttled-mailpassword' => 'Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ó©Ð¹Ð´Ó©Ñ\82Ó©Ñ\80 Ñ\81иÑ\81Ñ\82иÑ\8dма бүтэһик {{PLURAL:$1|чаас|$1 чаас}} иһигэр туттулла сылдьыбыт.
-Киирии тылы {{PLURAL:$1|чааска|$1 чааска}} биирдэ эрэ ыйытыахха сөп.',
+'throttled-mailpassword' => 'Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ó©Ð¹Ð´Ó©Ñ\82Ó©Ñ\80 Ñ\82Ñ\8dÑ\80ил бүтэһик {{PLURAL:$1|чаас|$1 чаас}} иһигэр туттулла сылдьыбыт.
өмүскэнэр соруктан сылтаан киирии тылы {{PLURAL:$1|чааска|$1 чааска}} биирдэ эрэ ыйытыахха сөп.',
 'mailerror' => 'Сурук ыытарга алҕас таҕыста: $1',
 'acct_creation_throttle_hit' => 'Эн IP-гыттан бүгүн {{PLURAL:$1|1 аат оҥоһуллубут|$1 аат бэлиэтэммит}} буолан бүгүҥҥү күннээҕи нуорма туолбут.
 Бу IP-тан киирэр дьон саҥа ааты билигин бэлиэтиир кыахтара суох.',
@@ -573,27 +614,25 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'Киирии тылы саҥаттан',
-'passwordreset-text' => 'Бу форманы толорон аккааунуҥ туһунан сурук тутуоххун сөп.',
 'passwordreset-legend' => 'Киирии тылы саҥаттан',
 'passwordreset-disabled' => 'Бу биикигэ киирии тылы саҥардыы бобуллубут.',
-'passwordreset-pretext' => '{{PLURAL:$1||Аллара көстөр дааннайдартан биирин талан суруй}}',
 'passwordreset-username' => 'Кыттааччы:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Суруллубут суругу көрөҕүн дуо?',
 'passwordreset-capture-help' => 'Бу бэлиэни туруордаххына кыттааччыга ыытыллар сурук (быстах кэмҥэ туһаныллар киирии тыллаах) көстүө.',
 'passwordreset-email' => 'Электроннай почтата:',
 'passwordreset-emailtitle' => '{{SITENAME}} бырайыакка аатын туһунан',
-'passwordreset-emailtext-ip' => 'Ð\9aим Ñ\8dÑ\80Ñ\8d (баÒ\95аÑ\80 Ñ\8dн Ð±Ñ\83олÑ\83о, Ð±Ñ\83 IP-Ñ\82Ñ\82ан $1)  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dнииҥ Ñ\82Ñ\83Ò»Ñ\83нан Ñ\81ибидиÑ\8dннÑ\8cÑ\8dни ÐºÓ©Ñ\80дөөбүт.
-Бу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}
+'passwordreset-emailtext-ip' => 'Ð\9aим Ñ\8dÑ\80Ñ\8d (баÒ\95аÑ\80 Ñ\8dн Ð±Ñ\83олÑ\83о, Ð±Ñ\83 IP-Ñ\82Ñ\82ан $1)  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\8bйÑ\8bÑ\82Ñ\8bк Ð±Ð¸Ñ\8dÑ\80бит.
+Бу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:
 
 $2
 
 Бу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.
 Эн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.
 Өскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына 
-бу биллэриини аахайыа суоххун сөп.
+бу биллэриини ааххайыа суоххун сөп.
 Оччоҕо урукку киирии тылыҥ оннунан хаалыа.',
-'passwordreset-emailtext-user' => '$1 Ð´Ð¸Ñ\8dн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dнииҥ Ñ\82Ñ\83Ò»Ñ\83нан Ñ\81ибидиÑ\8dннÑ\8cÑ\8dни ÐºÓ©Ñ\80дөөбүт.
+'passwordreset-emailtext-user' => '$1 Ð´Ð¸Ñ\8dн ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8b  {{SITENAME}} ($4) Ð±Ñ\8bÑ\80айÑ\8bакка ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлгÑ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\8bйÑ\8bÑ\82Ñ\8bк Ñ\8bÑ\8bппÑ\8bт.
 Бу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}
 
 $2
@@ -601,13 +640,13 @@ $2
 Бу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.
 Эн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.
 Өскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына 
-бу биллэриини аахайыа суоххун сөп.
+бу биллэриини ааххайыа суоххун сөп.
 Оччоҕо урукку киирии тылыҥ оннунан хаалыа.',
 'passwordreset-emailelement' => 'Кыттааччы: $1
 Быстах киирии тыл: $2',
-'passwordreset-emailsent' => 'СанаÑ\82Ñ\8bÑ\8b Ñ\8bÑ\8bÑ\82Ñ\8bлÑ\8bнна.',
-'passwordreset-emailsent-capture' => 'Ð\9cанна Ñ\8bÑ\8bÑ\82Ñ\8bллÑ\8bбÑ\8bÑ\82 Ñ\81анаÑ\82аÑ\80 Ñ\81Ñ\83Ñ\80Ñ\83к көрдөрүлүннэ.',
-'passwordreset-emailerror-capture' => 'Манна санатар сурук көрдөрүлүннэ, бу төрүөттэн сатаан барбата: $1',
+'passwordreset-emailsent' => 'Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\81Ñ\83Ñ\80Ñ\83к Ð±Ð°Ñ\80да.',
+'passwordreset-emailsent-capture' => 'Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8b Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ñ\82Ñ\83Ò»Ñ\83нан Ñ\81Ñ\83Ñ\80Ñ\83к Ð°Ð»Ð»Ð°Ñ\80а Ñ\8dмиÑ\8d көрдөрүлүннэ.',
+'passwordreset-emailerror-capture' => 'Манна киирии тылы уларытар туһунан сурук көрдөрүлүннэ. Ол эрэн сурук бу төрүөттэн сатаан барбата: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Ааадырыһын уларыт',
@@ -823,6 +862,8 @@ IP-аадырыһа эрэ көстөр.
 'content-failed-to-parse' => '$2 иһинээҕитэ $1 көрүҥэр сөп түбэспэт: $3.',
 'invalid-content-data' => 'Алҕастаах дааннайдар',
 'content-not-allowed-here' => '[[$2]] сирэйгэ "$1" туттуллуо суохтаах',
+'editwarning-warning' => 'Атын сирэйгэ көстөххүнэ билигин оҥорбут уларытыыларыҥ барыта сүтэн хаалыахтара.
+Бэлиэтэммит буоллаҕына, бу сэрэтиини туруорууларыҥ «{{int:prefs-editing}}» сирэйигэр араарыаххын сөп.',
 
 # Content models
 'content-model-wikitext' => 'биики-тиэкис',
@@ -1087,7 +1128,7 @@ $1",
 'search-interwiki-default' => '$1 түмүгэ:',
 'search-interwiki-more' => '(өссө)',
 'search-relatedarticle' => 'Сигэнэр',
-'mwsuggest-disable' => 'AJAX этэн биэриилэрин араар',
+'mwsuggest-disable' => 'Көрдөөһүн этэн биэриилэрин араар',
 'searcheverything-enable' => 'Туох баар аат далларыгар көрдөөһүн',
 'searchrelated' => 'сибээстэммит',
 'searchall' => 'бары',
@@ -1107,15 +1148,6 @@ $1",
 'search-external' => 'Тастан көрдөөһүн',
 'searchdisabled' => '{{SITENAME}} көрдүүр тэрилэ араарыллыбыт. Атын көрдүүр системаларынан наадыйар сирэйдэргитин көрдөтүөххүтүн сөп. Ол гынан баран поисковик кээһигэр баар торум эргэрбит буолуон сөп.',
 
-# Quickbar
-'qbsettings' => 'Навигация панела',
-'qbsettings-none' => 'Көрдөрүмэ',
-'qbsettings-fixedleft' => 'Хаҥас өттө хамсаабат',
-'qbsettings-fixedright' => 'Уҥа өттө хамсаабат',
-'qbsettings-floatingleft' => 'Хаҥас өттө устаҥныыр',
-'qbsettings-floatingright' => 'Уҥа өттө устаҥныыр',
-'qbsettings-directionality' => 'Туттарыллыбыт, тылыҥ суругун-бичигин хайысхатыттан тутулуктаах',
-
 # Preferences page
 'preferences' => 'Уларытыылар',
 'mypreferences' => 'Туруоруулар',
@@ -1669,7 +1701,6 @@ $1',
 'http-read-error' => 'HTTP ааҕыытын алҕаһа.',
 'http-timed-out' => 'HTTP-көрдөбүл толоруллуохтаах болдьоҕо ааста.',
 'http-curl-error' => 'URL-га тахсыы алҕаһа: $1',
-'http-host-unreachable' => 'URL-га тахсыы сатаммата.',
 'http-bad-status' => 'HTTP-ыйытыгы көрүү кэмигэр туох эрэ сатаммата: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2073,8 +2104,8 @@ $1',
 'notvisiblerev' => 'Торум сотуллубут',
 'watchnochange' => 'Кэтиир сирэйдэргиттэн этиллибит кэмҥэ биир да уларыйбатах.',
 'watchlist-details' => '{{PLURAL:$1|$1 сирэйи кэтиигин|$1 сирэй кэтэбилгэ сылдьар}}, ырытыы сирэйдэрин аахпатахха.',
-'wlheader-enotif' => 'эл. почтанан биллэрии холбоммут.',
-'wlheader-showupdated' => "Бүтэһик киириигит кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр",
+'wlheader-enotif' => 'эл. почтанан биллэрии холбоммут.',
+'wlheader-showupdated' => "Бүтэһик киириигит кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр",
 'watchmethod-recent' => 'кэтээн көрүү бүтэһик уларыйыыларын көрүү',
 'watchmethod-list' => 'кэтээһин бүтэһик уларыйыылара',
 'watchlistcontains' => '$1 сирэйи кэтээн көрөҕүн.',
@@ -2510,8 +2541,8 @@ $1',
 Ол аата эн сирэй аатын сыыһа уларыппыт буоллаххына төттөрү урукку аатыгар төннөрүөххүн сөп, ол гынан баран баар сирэйи алҕас сотор кыаҕыҥ суох.
 
 '''Сэрэтии!'''
-Сирэй аатын уларытыы бөдөҥ уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.
-Онон, бука диэн салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
+''Элбэхтик туһаныллар'' сирэй аатын уларытыы бөдөҥ уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.
+Онон, бука диэн, салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
 'movepagetext-noredirectfixer' => "Манна баар форманы туһанан сирэй аатын уларытыаххын сөп.
 Бу түбэлтэҕэ уларытыы сурунаала саҥа сиргэ көһөр.
 Урукку аат саҥа сирэйгэ утаарар сирэйгэ кубулуйар.
@@ -2852,11 +2883,6 @@ $1',
 'pageinfo-protect-cascading-from' => 'Каскадынан көмүскэл мантан',
 
 # Skin names
-'skinname-standard' => 'Классика',
-'skinname-nostalgia' => 'Мунчаарыы',
-'skinname-myskin' => 'Миэнэ',
-'skinname-chick' => 'Чуппууска',
-'skinname-simple' => 'Судургу',
 'skinname-modern' => 'Билиҥҥи',
 
 # Patrolling
@@ -2961,7 +2987,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Кэтитэ',
 'exif-imagelength' => 'Үрдүгэ',
 'exif-bitspersample' => 'Глубина цвета',
@@ -3140,7 +3166,7 @@ $1',
 'exif-originalimageheight' => 'Ойуу быһылла илигинээҕи үрдүгэ',
 'exif-originalimagewidth' => 'Ойуу быһылла илигинээҕи кэтитэ',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Хам тутуллубатах',
 'exif-compression-2' => 'CCITT Group 3, 1-мерная модификация кодирования длин серий Хаффмана',
 'exif-compression-3' => 'CCITT Group 3, факс куодтааһына',
@@ -3551,13 +3577,6 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'version-entrypoints-header-entrypoint' => 'Киирии сирэ',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Билэ суола',
-'filepath-page' => 'Билэ:',
-'filepath-submit' => 'Көс',
-'filepath-summary' => 'Бу аналлаах сирэй билэ ханна сытарын толору көрдөрөр.
-Ойуулар толору көрдөрүллэллэр, атын билэлэр ситимнээх бырагырааммаларыгар тута арыллаллар.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Хос билэлэри көрдөөһүн',
 'fileduplicatesearch-summary' => 'Тэҥ билэлэри хэш-куодтарынан көрдөөһүн.',
@@ -3654,7 +3673,7 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 
 # New logging system
 'logentry-delete-delete' => '$3 сирэйи $1 соппут',
-'logentry-delete-restore' => '$3 Ñ\81иÑ\80Ñ\8dйи $1 Ñ\82өннөÑ\80бүт',
+'logentry-delete-restore' => '$3 Ñ\81иÑ\80Ñ\8dйи $1 Ñ\81Ó©Ñ\80гүппүт',
 'logentry-delete-event' => 'Сурунаал {{PLURAL:$5|суругун|$5 суруктарын}} көстүүтүн манна $3: $4 $1 уларыппыт',
 'logentry-delete-revision' => 'Сурунаал {{PLURAL:$5|суругун|$5 суруктарын}} көстүүтүн бу сирэйгэ $3: $4 $1 уларыппыт',
 'logentry-delete-event-legacy' => '$3 сурунаал суруктарын көстүүтүн $1 уларыппыт',
@@ -3673,15 +3692,15 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'revdelete-restricted' => 'хааччахтааһын администраатардарга сыһыаннаах',
 'revdelete-unrestricted' => 'хааччахтааһын админстраатардартан уһулунна',
 'logentry-move-move' => '$1 $3 сирэй аатын маннык $4 уларыппыт',
-'logentry-move-move-noredirect' => '$1 $3 сирэй аатын маннык $4 уларыппыт, утаарыы-сирэй оҥорботох',
+'logentry-move-move-noredirect' => '$3 сирэй аатын $1 маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах',
 'logentry-move-move_redir' => '$3 сирэйи $1 диэн кыттааччы манныкка $4  уларыппыт (утаарыы үрдүнэн)',
-'logentry-move-move_redir-noredirect' => '$1 $3 сирэй аатын утаарыы үрдүнэн маннык $4 уларыппыт, утаарыы-сирэй оҥорботох',
-'logentry-patrol-patrol' => '$1 $3 сирэй $4 барылын ботуруулламмыт курдук бэлиэтээбит',
-'logentry-patrol-patrol-auto' => '$1 $3 сирэй $4 барылын аптамаатынан ботуруулламмыт курдук бэлиэтээбит',
-'logentry-newusers-newusers' => '$1 диэн кыттааччы бэлиэтэннэ',
+'logentry-move-move_redir-noredirect' => '$1 $3 сирэй аатын утаарыы үрдүнэн маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах',
+'logentry-patrol-patrol' => '$3 сирэй $4 барылын $1 ботурууллаабыт',
+'logentry-patrol-patrol-auto' => '$3 сирэй $4 барылын $1 аптамаатынан ботурууллаабыт',
+'logentry-newusers-newusers' => 'Кыттааччы $1 диэн ааты бэлиэтээтэ',
 'logentry-newusers-create' => '$1 диэн кыттааччы бэлиэтэннэ',
-'logentry-newusers-create2' => '$3 кыттааччы аатын $1 бэлиэтээбит',
-'logentry-newusers-autocreate' => 'Ð\9cаннÑ\8bк Ð°Ð°Ñ\82 $1 Ð°Ð¿Ñ\82амааÑ\82Ñ\8bнан Ð±Ñ\8dлиÑ\8dÑ\82Ñ\8dнилиннÑ\8d',
+'logentry-newusers-create2' => '$3 кыттааччы аатын $1 бэлиэтээтэ',
+'logentry-newusers-autocreate' => 'Маннык аат $1 аптамаатынан бэлиэтэннэ',
 'rightsnone' => '(суох)',
 
 # Feedback
index 7060b13..f962f00 100644 (file)
@@ -26,7 +26,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Joṛaoakanaḱko nãwã bodolaḱte danaṅkam',
 'tog-newpageshidepatrolled' => 'Biḍạakanaḱ sakamko nãwã sakamreaḱ talikare danȧkam',
 'tog-extendwatchlist' => 'Khạli nitoḱ bodolko do baṅ, joto bodolkodo ńeloḱ tạlikare phaylaomẽ.',
-'tog-usenewrc' => 'Cetan darja reaḱ nãwã bodolakanaḱko beoharme',
+'tog-usenewrc' => 'Nahaḱ bodolakanaḱko ar nojor reaḱ pahaṭare bodolaḱko mit́são ńelńam',
 'tog-numberheadings' => 'Mukhiạ kathako do actege piṛhipiṛhite sajaḱma',
 'tog-showtoolbar' => 'Joṛaoakanaḱ ṭulbar udugoḱma',
 'tog-editondblclick' => 'Bar dhao lin kate sakam torjomão reaḱ ạidari emogoḱma',
@@ -34,9 +34,9 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Pahaṭa reaḱ pahaṭa guṭkathare jojom seć lin hotete <br /> pahaṭa sompadon lạgitte ektiạr em hoyoḱma (JavaScript)',
 'tog-showtoc' => 'Ṭibilre menaḱako ńel ( sakamkore 3 khon jạti hedlayenko)',
 'tog-rememberpassword' => 'Noa sendrare amaḱ boloḱ reaḱ katha (katha cạbi) disạimẽ (jạstite $1 {{PLURAL:$1din reaḱ din reaḱ}} lạgit)',
-'tog-watchcreations' => 'Sakamko songe  Ińaḱ ńelok tạlikare benao',
-'tog-watchdefault' => 'Sakam tońgey me Iń do ińaḱ ńeloḱ tạlikare joṛaokeda',
-'tog-watchmoves' => 'Sakamko tońgeyme Ińaḱ ńelok tạlikare kulme',
+'tog-watchcreations' => 'Ińaḱ tear sakam ar rakaṕ páelko ińaḱ ńelogoḱ tạlikare ńeloḱ ma',
+'tog-watchdefault' => 'Ińaḱ purạoakanaḱ sakam ar phayelko do ińaḱ ńeloḱ tạlikare joṛaoḱma',
+'tog-watchmoves' => 'Ińaḱ ocoḱ sakam ar phayelko inyaḱ nojor sakamre joṛaḱma',
 'tog-watchdeletion' => 'Sakamko tońgeyme Ińaḱ ńeloḱ tạlika khon get́ giḍikam',
 'tog-minordefault' => 'Etohoṕre sanam joṛao purạoanaḱko do bekor unuduḱ lekate cinhạkma',
 'tog-previewontop' => 'Joṛao bakso purạo lahare unuduḱ hoyoḱma',
@@ -49,8 +49,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ńelok laṛcaṛkoaḱ songkha uduḱme',
 'tog-oldsig' => 'Menaḱ signạtar',
 'tog-fancysig' => 'Signạcar do wikiṭesk hisạbte moneyemẽ (jahan acte hoyoḱ joṛao bạgikate)',
-'tog-externaleditor' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgit́te, kompeuṭare asokae seṭing jạruṛa. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
-'tog-externaldiff' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgit́te, kompeuṭare asokae seṭing jạruṛa. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
 'tog-showjumplinks' => '"Calaḱmẽ" beohar joṛao ehop hoyoḱma',
 'tog-uselivepreview' => 'Jewet́ ńeloḱ beoharme (JavaScript jaruṛ menaḱa)',
 'tog-forceeditsummary' => 'Khạli sompadon guṭkatha em oktere iń baḍae ocoyiń hoyoḱma',
@@ -737,9 +735,6 @@ Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:
 'powersearch-toggleall' => 'Sanamaḱ',
 'powersearch-togglenone' => 'Okaṭaḱ hõ baṅ',
 
-# Quickbar
-'qbsettings-none' => 'Okaṭaḱ hõ baṅ',
-
 # Preferences page
 'preferences' => 'Pạsindko',
 'mypreferences' => 'Iñaḱ pạsindko',
@@ -1178,7 +1173,7 @@ f nombor
 isospeeddratings
 jeleń',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ganḍe',
 'exif-imagelength' => 'Usul',
 'exif-datetime' => 'Rẽt bodol reaḱ tạrikh ar okte',
index f41597f..c688b46 100644 (file)
@@ -660,14 +660,6 @@ Prova a seberare ''totu:'' pro chircare in totu su cuntènnidu (inclùdidas pàg
 'powersearch-toggleall' => 'Totu',
 'powersearch-togglenone' => 'Nudda',
 
-# Quickbar
-'qbsettings' => 'Settaggio della barra menu',
-'qbsettings-none' => 'Nessuno',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-
 # Preferences page
 'preferences' => 'Preferèntzias',
 'mypreferences' => 'Preferèntzias meas',
@@ -1016,7 +1008,7 @@ Dia podent essere immàgines impreadas dae àteros giassos cun unu ligàmine dir
 'listgrouprights-group' => 'Grupu',
 'listgrouprights-members' => '(lista de is cumponentes)',
 
-# E-mail user
+# Email user
 'mailnologintext' => "Depes èsser [[Special:UserLogin|identificadu (login)]] e àer registradu un'indiritzu e-mail vàlidu in is [[Special:Preferences|preferèntzias tuas]] pro imbiare e-mail a àteros usuàrios.",
 'emailuser' => 'E-mail a custu usuàriu',
 'emailpage' => "Ispedi una missada a s'usuàriu",
@@ -1428,14 +1420,14 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-artist' => 'Autore',
 'exif-exposuretime-format' => '$1 s ($2)',
 'exif-fnumber-format' => 'f/$1',
 'exif-flash' => 'Flash',
 'exif-focallength-format' => '$1 mm',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-6' => 'JPEG',
 
 'exif-photometricinterpretation-2' => 'RGB',
@@ -1473,7 +1465,7 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
 'monthsall' => 'totu',
 'limitall' => 'totu',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => "Cunfirma s'indiritzu e-mail",
 
 # action=purge
@@ -1531,10 +1523,6 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
 'version-license' => 'Licèntzia',
 'version-software-version' => 'Versione',
 
-# Special:FilePath
-'filepath-page' => 'Nùmene de su file:',
-'filepath-submit' => 'Bae',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Chirca',
 
index 94ec90a..5decd0b 100644 (file)
@@ -182,8 +182,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ammustra lu nùmmiru di utenti ca sèquinu la pàggina',
 'tog-oldsig' => 'Firma attuali:',
 'tog-fancysig' => 'Interpitra li cumanna wiki nâ firma (senza liami automaticu)',
-'tog-externaleditor' => 'Usa di default nu editor esternu (sulu pi li esperti, abbisognanu mpustazzioni particulari pô tò computer. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => "Usa di default un prugramma di diff sternu (sulu pi utilizzatura sperti, addumanna l'usu di mpustazzioni particulari supra lu sò computer. [//www.mediawiki.org/wiki/Manual:External_editors Pi cchiossai nfurmazzioni.])",
 'tog-showjumplinks' => "Attiva li culligamenti accissìbbili 'và a'",
 'tog-uselivepreview' => "Attiva la funzioni ''Live preview'' (richiedi JavaScript; spirimintali)",
 'tog-forceeditsummary' => "Chiedi cunferma siddu l'uggettu dû canciamentu è vacanti",
@@ -1033,14 +1031,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 '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.',
 
-# Quickbar
-'qbsettings' => 'Pusizzioni QuickBar',
-'qbsettings-none' => 'Nuddu',
-'qbsettings-fixedleft' => 'Fissu a manu manca',
-'qbsettings-fixedright' => 'Fissu a manu dritta',
-'qbsettings-floatingleft' => 'Fluttuanti a manu manca',
-'qbsettings-floatingright' => 'Fluttuanti a manu dritta',
-
 # Preferences page
 'preferences' => 'prifirenzi',
 'mypreferences' => 'Li mè prifirenzi',
@@ -1795,8 +1785,8 @@ Protucolli suppurtati: <code>$1</code>',
 'notvisiblerev' => 'La revisioni fu cancillata',
 'watchnochange' => 'Nudda dî pàggini ossirvati hà statu canciata ntô pirìudu cunzidiratu.',
 'watchlist-details' => 'La lista dê pàggini taliati cunteni {{PLURAL:$1|na pàggina (cu la rispittiva pàggina di discussioni)|$1 pàggini (cu li rispittivi pàggini di discussioni)}}.',
-'wlheader-enotif' => 'La nutìfica via e-mail è attivata.',
-'wlheader-showupdated' => "Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n '''grassettu'''",
+'wlheader-enotif' => 'La nutìfica via e-mail è attivata.',
+'wlheader-showupdated' => "Li pàggini ca hannu statu canciati dâ tò ùrtima vìsita sunnu evidinziati 'n '''grassettu'''",
 'watchmethod-recent' => "cuntrollu dî canciamenti ricenti pi l'ossirvati spiciali",
 'watchmethod-list' => "cuntrollu di l'ossirvati spiciali pi canciamenti ricenti",
 'watchlistcontains' => 'La tò lista di ossirvati spiciali cunteni {{PLURAL:$1|na pàggina|$1 pàggini}}.',
@@ -2016,7 +2006,7 @@ $1',
 'sp-contributions-userrights' => 'gistioni dî dritti utenti',
 'sp-contributions-search' => 'Ricerca cuntribbuti',
 'sp-contributions-username' => 'Nnirizzu IP o nomu utenti:',
-'sp-contributions-toponly' => "Ammuscia sulu li cuntribbuti ca sunnu l'ùrtimi rivisioni pâ pàggina",
+'sp-contributions-toponly' => "Ammuccia sulu li cuntribbuta ca sunnu l'ùrtimi rivisioni pâ pàggina",
 'sp-contributions-submit' => 'Risciduta',
 
 # What links here
@@ -2411,13 +2401,8 @@ Visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
 'pageinfo-toolboxlink' => 'Nfurmazzioni ncapu la pàggina',
 
 # Skin names
-'skinname-standard' => 'Classicu',
-'skinname-nostalgia' => 'Nustargìa',
 'skinname-cologneblue' => 'Cologne Blu',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Sìmprici',
 'skinname-modern' => 'Mudernu',
 
 # Patrolling
@@ -2502,7 +2487,7 @@ Li lijami succissivi, supra la stissa riga, sunnu cunzidirati comu eccizzioni (p
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghizza',
 'exif-imagelength' => 'Autizza',
 'exif-bitspersample' => 'Bit pi campiuni',
@@ -2616,7 +2601,7 @@ Li lijami succissivi, supra la stissa riga, sunnu cunzidirati comu eccizzioni (p
 'exif-gpsdatestamp' => 'Data GPS',
 'exif-gpsdifferential' => 'Currezzioni diffirinziali GPS',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nuddu',
 
 'exif-unknowndate' => 'Data scanusciuta',
@@ -2909,14 +2894,6 @@ Stu còdici di cunferma scadi automaticamenti a li $4.',
 'version-software-product' => 'Prodottu',
 'version-software-version' => 'Virsioni',
 
-# Special:FilePath
-'filepath' => 'Pircorsu di nu file',
-'filepath-page' => 'Nnomu dô file:',
-'filepath-submit' => 'Pircorsu',
-'filepath-summary' => 'Sta pàggina spiciali rimanna arredi lu traggittu cumpretu di nu file. Li mmàggini sù ammustrati cu la cchiù àuta risoluzzioni dispunìbbili, pi l\'àutri tipi di file parti direttamenti lu prugramma assuciatu.
-
-Mèttiri lu nomu dû file senza lu prifissu "{{ns:file}}:"',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Circata dê file duppiuni',
 'fileduplicatesearch-summary' => "Circata di pussìbbili dupppiuni dû file 'n basi ô valuri di ''hash''.",
index 556670b..c271e88 100644 (file)
@@ -51,8 +51,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Shaw ma email address in notification mails',
 'tog-shownumberswatching' => 'Shaw the nummer o watching uisers',
 'tog-fancysig' => 'Raw seignaturs (athoot automatic airtin)',
-'tog-externaleditor' => 'Uise external editor bi defaut',
-'tog-externaldiff' => 'Uise external diff bi defaut',
 'tog-showjumplinks' => 'Enable "loup til" accessibility airtins',
 'tog-uselivepreview' => 'Uise leeve preview (JavaScript) (Prattik)',
 'tog-forceeditsummary' => 'Gie me a jottin when A dinnae put in a edit summary',
@@ -738,9 +736,6 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
 'powersearch-toggleall' => 'Aw',
 'searchdisabled' => 'Rakin throu {{SITENAME}} is disabled for performance raesons. Ye can rake via Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.',
 
-# Quickbar
-'qbsettings-none' => 'Nane',
-
 # Preferences page
 'mypreferences' => 'Ma preferences',
 'prefsnologin' => 'No loggit in',
@@ -1451,7 +1446,7 @@ If th' file haes bin modified frae tis original state, some details kin nae full
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-copyright' => 'Copyricht hauder',
 'exif-colorspace' => 'Colour space',
 'exif-componentsconfiguration' => 'Meanin o ilka component',
@@ -1534,9 +1529,6 @@ Please confirm that ye really want tae recreate this airticle.",
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Wairnin:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
 
-# Special:FilePath
-'filepath-page' => 'File:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Filename:',
 'fileduplicatesearch-submit' => 'Rake',
index 880e9b5..17e4204 100644 (file)
@@ -694,7 +694,7 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 # Special:Categories
 'categories' => 'زمرا',
 
-# E-mail user
+# Email user
 'emailuser' => 'هن يوزر کي برق ٽپال اماڻيو',
 
 # Watchlist
@@ -912,7 +912,7 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 'metadata-expand' => 'توسيعي تفصيل ڏيکاريو',
 'metadata-collapse' => 'توسيعي تفصيل لڪايو',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ويڪر',
 'exif-imagelength' => 'اوچائي',
 'exif-bitspersample' => 'ٻٽڻيون في جُز',
@@ -966,7 +966,7 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 'namespacesall' => 'سڀ',
 'monthsall' => 'سڀ',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail_success' => 'توھان جي برق ٽپال جي پڪ ڪئي وئي آھي. ھاڻِ توھان لاگ ان ٿي وڪيءَ جو مزو وٺي سگھو ٿا',
 
 # Delete conflict
index e09bb1f..d180355 100644 (file)
@@ -133,8 +133,6 @@ $messages = array(
 'tog-enotifrevealaddr' => "Rivera lu me' indirizzu di postha erettrònica i' l'imbasciaddi d'avvisu",
 'tog-shownumberswatching' => "Musthra lu nùmaru d'utenti ch'àni la pàgina abbaidadda",
 'tog-fancysig' => "Interpreta i cumandi wiki i' la fimma (chena cullegaumentu otomatiggu)",
-'tog-externaleditor' => 'Impustha cumenti pridifiniddu un cumponidori di testhi esthernu',
-'tog-externaldiff' => 'Impustha cumenti pridifiniddu un prugramma di diff esthernu',
 'tog-showjumplinks' => "Attiba li cullegamenti atzessibili 'vai a'",
 'tog-uselivepreview' => "Attiba la funzioni ''Live preview'' (dumanda JavaScript; ippirimintari)",
 'tog-forceeditsummary' => "Dumanda cunfèimma si l'oggettu di la mudìfigga è bioddu",
@@ -800,14 +798,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 'powersearch-togglenone' => 'Nisciunu',
 'searchdisabled' => 'Abà no pói zirchà in {{SITENAME}}; proba cun Google o sìmiri, ma ammèntaddi chi li cuntinuddi di {{SITENAME}} poni assé no aggiornaddi.',
 
-# Quickbar
-'qbsettings' => 'Prifirenzi di lu menù',
-'qbsettings-none' => 'Nisciunu',
-'qbsettings-fixedleft' => 'Fissu a manca',
-'qbsettings-fixedright' => 'Fissu a drestha',
-'qbsettings-floatingleft' => 'Galliggianti a manca',
-'qbsettings-floatingright' => 'Galliggianti a drestha',
-
 # Preferences page
 'preferences' => 'Prifirenzi',
 'mypreferences' => "Li me' prifirenzi",
@@ -1285,8 +1275,8 @@ Si daboi s'à gana d'eliminà la pàgina da la listha di l'abbaidaddi ippiziarii
 'notvisiblerev' => 'La ribisioni è isthadda canzilladda',
 'watchnochange' => "Nisciuna di li pàgini abbaidaddi è isthadda mudìfiggadda i' lu perìodu cunsidaraddu.",
 'watchlist-details' => "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pagina (e la rippettiba pagina di dischussioni)|$1 pagini (e li rippettibi pagini di dischussioni)}}.",
-'wlheader-enotif' => 'La nutìfica via postha erettrònica è attiba.',
-'wlheader-showupdated' => "Li pàgini chi so isthaddi mudìfiggaddi daboi l'ulthima vìsita so evidenziaddi in '''grasseddu'''",
+'wlheader-enotif' => 'La nutìfica via postha erettrònica è attiba.',
+'wlheader-showupdated' => "Li pàgini chi so isthaddi mudìfiggaddi daboi l'ulthima vìsita so evidenziaddi in '''grasseddu'''",
 'watchmethod-recent' => "cuntrollu di li mudìfigghi rizzenti pa l'abbaidaddi ippiziari",
 'watchmethod-list' => "cuntrollu di l'abbaidaddi ippiziari pa mudìfigghi rizzenti",
 'watchlistcontains' => "La listha di l'abbaidaddi ippiziari cunteni {{PLURAL:$1|una pàgina|$1 pàgini}}.",
@@ -1841,7 +1831,7 @@ So cunsidaraddi soru l'erenchi puntaddi (righi ch'ischumenzani cu' lu caràtteri
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Larghèzia',
 'exif-imagelength' => 'Althèzia',
 'exif-bitspersample' => 'Bit pa campioni',
@@ -2017,11 +2007,6 @@ Pa piazeri, cunfèimma chi vòi ricrià avveru chistha pàgina.",
 'version-other' => 'Althru',
 'version-software-version' => 'Versioni',
 
-# Special:FilePath
-'filepath' => "Parchossu d'un file",
-'filepath-page' => 'Innommu di lu file:',
-'filepath-submit' => 'Parchossu',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-legend' => "Zercha d'un dupricaddu",
 'fileduplicatesearch-filename' => 'Innòommu di lu file:',
index d9b0d84..d7fc8d9 100644 (file)
@@ -11,6 +11,7 @@
  * @author Jeblad
  * @author Kaganer
  * @author Laila
+ * @author Linnea
  * @author Skuolfi
  * @author Teak
  * @author The Evil IP address
@@ -51,12 +52,13 @@ $specialPageAliases = array(
        'Block'                     => array( 'Hehtte', 'Hehtte_geavaheaddji', 'Hehtte_IP' ),
        'Blockme'                   => array( 'Hehtte_mu' ),
        'Booksources'               => array( 'Girjegáldut' ),
-       'BrokenRedirects'           => array( 'Feaillalaš_stivremat', 'Feaillalaš_ođđasitstivremat' ),
+       'BrokenRedirects'           => array( 'Boatkanan_stivremat', 'Boatkanan_ođđasitstivremat' ),
        'Categories'                => array( 'Kategoriijat' ),
+       'ChangeEmail'               => array( 'Rievdat_E-poastta' ),
        'ComparePages'              => array( 'Veardit_siidduid' ),
        'Confirmemail'              => array( 'Sihkaraste_e-poastta' ),
        'Contributions'             => array( 'Rievdadusat' ),
-       'CreateAccount'             => array( 'Ráhkat_dovddaldaga' ),
+       'CreateAccount'             => array( 'Ráhkat_dovddaldaga', 'Ráhkat_konttu' ),
        'DeletedContributions'      => array( 'Sihkkojuvvon_rievdadusat' ),
        'Disambiguations'           => array( 'Liŋkkat_dárkonsiidduide' ),
        'DoubleRedirects'           => array( 'Guoktegeardásaš_ođđasitstivremat' ),
@@ -68,7 +70,7 @@ $specialPageAliases = array(
        'Listadmins'                => array( 'Administráhtorlistu', 'Listu_administráhtoriin' ),
        'Listbots'                  => array( 'Bohttalistu', 'Listu_bohtain' ),
        'Listfiles'                 => array( 'Fiilalogahallan' ),
-       'Listgrouprights'           => array( 'Listu_joavkkuid_vuoigavuođain' ),
+       'Listgrouprights'           => array( 'Listu_joavkkuid_vuoigatvuođain' ),
        'Listredirects'             => array( 'Stivrenlistu', 'Listu_stivremiin', 'Listu_ođđasitstivremiin' ),
        'Listusers'                 => array( 'Geavaheaddjelistu', 'Listu_geavaheddjiin' ),
        'Log'                       => array( 'Loggat', 'Logga' ),
@@ -94,10 +96,10 @@ $specialPageAliases = array(
        'Specialpages'              => array( 'Erenoamáš_siiddut', 'Doaibmasiiddut' ),
        'Statistics'                => array( 'Statistihkat' ),
        'Unblock'                   => array( 'Sihko_hehttema' ),
-       'Uncategorizedcategories'   => array( 'Kategoriserekeahtes_kategoriijat' ),
-       'Uncategorizedimages'       => array( 'Kategoriserekeahtes_govat', 'Kategoriserekeahtes_fiillat' ),
-       'Uncategorizedpages'        => array( 'Kategoriserekeahtes_siiddut' ),
-       'Uncategorizedtemplates'    => array( 'Kategoriserekeahtes_mállet' ),
+       'Uncategorizedcategories'   => array( 'Klassifiserekeahtes_kategoriijat' ),
+       'Uncategorizedimages'       => array( 'Klassifiserekeahtes_fiillat', 'Klassifiserekeahtes_govat' ),
+       'Uncategorizedpages'        => array( 'Klassifiserekeahtes_siiddut' ),
+       'Uncategorizedtemplates'    => array( 'Klassifiserekeahtes_mállet' ),
        'Undelete'                  => array( 'Máhccat' ),
        'Unusedcategories'          => array( 'Geavatkeahtes_kategoriijat' ),
        'Unusedimages'              => array( 'Geavatkeahtes_govat', 'Geavatkeahtes_fiillat' ),
@@ -118,7 +120,22 @@ $specialPageAliases = array(
 
 $magicWords = array(
        'redirect'                  => array( '0', '#STIVREN', '#OĐĐASITSTIVREN', '#REDIRECT' ),
-       'numberofarticles'          => array( '1', 'ARTIHKKALIIDMEARRI', 'NUMBEROFARTICLES' ),
+       'notoc'                     => array( '0', '__IISISDOALLU__', '__IISIS__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__IIGALLERIIJA__', '__NOGALLERY__' ),
+       'toc'                       => array( '0', '__SISDOALLU__', ' __SIS__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__IIRIEVDADITOASI__', '__NOEDITSECTION__' ),
+       'numberofarticles'          => array( '1', 'ARTIHKKALIIDMEARRI', ' ARTIHKALMEARRI', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'FIILLAIDMEARRI', 'FIILAMEARRI', ' GOVAIDMEARRI', ' GOVVAMEARRI', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'GEAVAHEDDJIIDMEARRI', ' GEAVAHEADDJIMEARRI', ' GEAVAHEADDJEMEARRI', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'       => array( '1', 'AKTIIVAGEAVAHEDDJIIDMEARRI', ' AKTIIVAGEAVAHEADDJIMEARRI', ' AKTIIVAGEAVAHEADDJEMEARRI', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'             => array( '1', 'RIEVDADUSAIDMEARRI', ' RIEVDADUSMEARRI', 'NUMBEROFEDITS' ),
+       'subst'                     => array( '0', 'LIIBME:', 'SUBST:' ),
+       'img_thumbnail'             => array( '1', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'           => array( '1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'                 => array( '1', 'olgeš', 'right' ),
+       'img_left'                  => array( '1', 'gurut', 'left' ),
+       'img_center'                => array( '1', 'gasku', 'center', 'centre' ),
+       'img_link'                  => array( '1', 'liŋka=$1', 'link=$1' ),
 );
 
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -616,13 +633,6 @@ $1 {{int:pipe-separator}} $2',
 'powersearch-toggleall' => 'Buot',
 'powersearch-togglenone' => 'Ii mihkkege',
 
-# Quickbar
-'qbsettings-none' => 'Ii maidige',
-'qbsettings-fixedleft' => 'Teaksta mielde, gurut',
-'qbsettings-fixedright' => 'Teaksta mielde, olgeš',
-'qbsettings-floatingleft' => 'Biso gurutbealde',
-'qbsettings-floatingright' => 'Biso olgesbealde',
-
 # Preferences page
 'preferences' => 'Ásahusat',
 'mypreferences' => 'Ásahusat',
@@ -711,6 +721,12 @@ $1 {{int:pipe-separator}} $2',
 'rightslog' => 'Logga geavaheaddjirievttiin',
 'rightslogtext' => 'Vuolábealde lea logga geavaheaddjirivttiid rievdadusain.',
 
+# Associated actions - in the sentence "You do not have permission to X"
+'action-createpage' => 'álggahit siidduid',
+'action-createtalk' => 'álggahit ságastallansiidduid',
+'action-browsearchive' => 'ohcat sihkkojuvvon siidduid',
+'action-sendemail' => 'sáddet e-poasttaid',
+
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|rievdadus|rievdadusa}}',
 'recentchanges' => 'Varas rievdadusat',
@@ -1025,8 +1041,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'notanarticle' => 'Ii leat siidu',
 'watchnochange' => 'Válljejuvvon áigodagas oktage du čuovvunlisttui gullevaš siidu leat rievdaduvvon.',
 'watchlist-details' => 'Du čuovvunlisttus {{PLURAL:$1|lea $1 siidu|leat $1 siiddu}}. Lohkui eai leat váldojuvvon ságastallansiidduid.',
-'wlheader-enotif' => 'E-poastaalmmuhusat leat anus.',
-'wlheader-showupdated' => "Siiddut, mat leat rievdaduvvon du maŋimus geavahangearddi maŋŋá leat merkojuvvon '''buoiddes teavsttain'''",
+'wlheader-enotif' => 'E-poastaalmmuhusat leat anus.',
+'wlheader-showupdated' => "Siiddut, mat leat rievdaduvvon du maŋimus geavahangearddi maŋŋá leat merkojuvvon '''buoiddes teavsttain'''",
 'watchmethod-recent' => 'dárkistuvvo varas rievdadusat čuovvunlisttu siidduide',
 'watchmethod-list' => 'dárkistuvvo čuovvunlisttu siidduid varas rievdadusat',
 'watchlistcontains' => 'Du čuovvunlisttus {{PLURAL:$1|lea okta siidu|leat $1 siiddu}}.',
@@ -1344,7 +1360,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'metadata-expand' => 'Čájet buot sisdoallogovvádusaid',
 'metadata-collapse' => 'Čájet beare dehaleamos sisdoallogovvádusaid',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Viidodat',
 'exif-imagelength' => 'Allodat',
 'exif-bitspersample' => 'Bihtá komponeanttas',
index 8d3ebd6..5f56f5e 100644 (file)
@@ -42,8 +42,6 @@ $messages = array(
 'tog-enotifrevealaddr' => 'Xuniim henadressade e-iitom notificacionde e-iitóm',
 'tog-shownumberswatching' => 'Cohuatlöx caitóm cáminotómde numberam',
 'tog-fancysig' => 'Signaturenám brazzinám (sans linkám automaticám)',
-'tog-externaleditor' => 'Usadad ticpatlöx externöx auto',
-'tog-externaldiff' => 'Usadad diff extern auto',
 'tog-showjumplinks' => 'Záj "jumpöx" accessibilitiit linkám',
 'tog-uselivepreview' => 'Usadad cuáxiit live (JavaScript) (Experimentam)',
 'tog-forceeditsummary' => 'Ixuniimticpatlöx he jan nenenterom abvuatlde ticpatlöx',
@@ -582,10 +580,6 @@ Informacion: (curt) = quiíxde vercion currentua,
 'searchhelp-url' => 'Help:Caálixötöj',
 'powersearch' => 'Yahöx',
 
-# Quickbar
-'qbsettings' => 'Zuónaát',
-'qbsettings-none' => 'Nepartám',
-
 # Preferences page
 'preferences' => 'Quáatlaác',
 'mypreferences' => 'Hequáatlaác',
@@ -1023,7 +1017,7 @@ iitom e-iitomde diijömde caitóm.',
 'ilsubmit' => 'Yahöx',
 'bydate' => 'de datum',
 
-# EXIF tags
+# Exif tags
 'exif-fnumber' => 'F Numberam',
 'exif-gpslatitude' => 'Latitudam',
 'exif-gpslongitude' => 'Longitudam',
index 0411b80..2e2bba5 100644 (file)
@@ -87,8 +87,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ruodītė keravuojantiu nauduotuoju skatliu',
 'tog-oldsig' => 'Esams parašos:',
 'tog-fancysig' => 'Parašos kāp wiki tekstos (ba autuomatėniu nūruodu)',
-'tog-externaleditor' => 'Vagol nutīliejėma nauduotė ėšuorini radaktuoriu (tėktās specam, rēk specēliū nustatīmu kompioteriō. [//www.mediawiki.org/wiki/Manual:External_editors Daugiau infuormacėjės.])',
-'tog-externaldiff' => 'Palē nutīliejėma nauduotė ėšuorinė skėrtomu ruodīma pruograma (tėktās specam, rēk specēliū nustatīmu kompioteriō. [//www.mediawiki.org/wiki/Manual:External_editors Daugiau infuormacėjės.])',
 'tog-showjumplinks' => 'Ijongtė „paršuoktė i“ pasėikiamoma nūruodas',
 'tog-uselivepreview' => 'Nauduotė tėisiogėne parvėiza (JavaScript) (Eksperimentėnis)',
 'tog-forceeditsummary' => 'Klaustė, kumet palėiku toščē pakeitėma kuomentara',
@@ -762,10 +760,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
 'powersearch-field' => 'Ėiškoutė',
 'search-external' => 'Ėšuorėnė paėiška',
 
-# Quickbar
-'qbsettings' => 'Greitasā pasėrėnkėms',
-'qbsettings-none' => 'Neruodītė',
-
 # Preferences page
 'preferences' => 'Nustatīmā',
 'mypreferences' => 'Mona nustatīmā',
@@ -1270,8 +1264,8 @@ Jēgo bikumet ožsėnuorietomiet liautėis keravuotė straipsnė, spauskat \"neb
 'notanarticle' => 'Ne torėnė poslapis',
 'watchnochange' => 'Pasėrėnkto čieso nebova redagouts nė vėins keravuojams straipsnis.',
 '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.',
-'wlheader-showupdated' => "Poslapē, katrėi pakeistė nu Tamstas paskotėnė apsėlonkėma čiesa anūs, īr pažīmietė '''pastuorintā'''",
+'wlheader-enotif' => 'El. pašta primėnėmā ijongtė īr.',
+'wlheader-showupdated' => "Poslapē, katrėi pakeistė nu Tamstas paskotėnė apsėlonkėma čiesa anūs, īr pažīmietė '''pastuorintā'''",
 'watchmethod-recent' => 'tėkrėnamė vielībė̅jė pakeitėmā keravuojamiems poslapiams',
 'watchmethod-list' => 'Ėiškuoma vielībūju pakeitėmu keravuojamūs poslapiūs',
 'watchlistcontains' => 'Tamstas kervuojamu sārašė īr $1 {{PLURAL:$1|poslapis|poslapē|poslapiu}}.',
@@ -1773,7 +1767,7 @@ Vėsas kėtas nūoruodas tuo patiuo eilotie īr laikomas ėšėmtim, tas rēšk
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Platoms',
 'exif-imagelength' => 'Aukštoms',
 'exif-orientation' => 'Pasokims',
@@ -1908,10 +1902,6 @@ Tamsta tēpuogi galėt [[Special:EditWatchlist/raw|redagoutė grīnaji keravuoja
 'version' => 'Versėjė',
 'version-license' => 'Licenzėjė',
 
-# Special:FilePath
-'filepath' => 'Faila maršrots',
-'filepath-page' => 'Fails:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ėiškuotė doblikoutu failu',
 'fileduplicatesearch-legend' => 'Ėiškuotė doblėkatu',
index ffd9dc3..6d58d82 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Kaganer
+ * @author Nemo bis
  * @author OC Ripper
  * @author לערי ריינהארט
  */
@@ -237,8 +238,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji prate',
 'tog-oldsig' => 'Postojeći potpis:',
 'tog-fancysig' => 'Smatraj potpis kao wikitekst (bez automatskog linka)',
-'tog-externaleditor' => 'Redovno koristite eksterni editor (samo za naprednije korisnike, potrebne su posebne postavke na vašem računaru)',
-'tog-externaldiff' => 'Redovno koristi vanjski (diff) program za prikaz razlika (samo za naprednije korisnike, potrebne posebne postavke na vašem računaru [//www.mediawiki.org/wiki/Manual:External_editors Više informacija.])',
 'tog-showjumplinks' => 'Omogući opciju "skoči na" linkove',
 'tog-uselivepreview' => 'Koristite pretpregled uživo (potreban JavaScript) (eksperimentalno)',
 'tog-forceeditsummary' => 'Opomeni me pri unosu praznog sažetka',
@@ -252,6 +251,7 @@ $messages = array(
 'tog-diffonly' => 'Ne prikazuj sadržaj stranice ispod prikaza razlika',
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-norollbackdiff' => 'Nakon povrata zanemari prikaz razlika',
+'tog-useeditwarning' => 'Upozori me kad napuštam stranicu za uređivanje bez snimanja izmjena',
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
@@ -315,6 +315,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. mart',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. jun',
+'july-date' => '$1. jul',
+'august-date' => '$1. august',
+'september-date' => '$1. septembar',
+'october-date' => '$1. oktobar',
+'november-date' => '$1. novembar',
+'december-date' => '$1. decembar',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
@@ -622,9 +634,18 @@ Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još
 'welcomecreation-msg' => 'Vaš korisnički račun je napravljen.
 Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].',
 'yourname' => 'Korisničko ime:',
+'userlogin-yourname' => 'Korisničko ime',
+'userlogin-yourname-ph' => 'Unesite svoje korisničko ime',
 'yourpassword' => 'Lozinka/zaporka:',
+'userlogin-yourpassword' => 'Lozinka/zaporka',
+'userlogin-yourpassword-ph' => 'Unesite svoju lozinku/zaporku',
+'createacct-yourpassword-ph' => 'Unesite lozinku/zaporku',
 'yourpasswordagain' => 'Ponovno utipkajte lozinku/zaporku:',
+'createacct-yourpasswordagain' => 'Potvrdite lozinku/zaporku',
+'createacct-yourpasswordagain-ph' => 'Unesite lozinku/zaporku ponovno',
 'remembermypassword' => 'Upamti moju lozinku na ovom kompjuteru (za maksimum od $1 {{PLURAL:$1|dan|dana}})',
+'userlogin-remembermypassword' => 'Držite me ulogiranog/u',
+'userlogin-signwithsecure' => 'Koristite sigurnu vezu',
 'securelogin-stick-https' => 'Ostanite povezani na HTTPS nakon prijave',
 'yourdomainname' => 'Vaš domen:',
 'password-change-forbidden' => 'Ne možete da promenite lozinku na ovom vikiju.',
@@ -637,18 +658,38 @@ Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].
 'logout' => 'Odjavi me',
 'userlogout' => 'Odjava',
 'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nemate račun?',
+'userlogin-joinproject' => 'Pridružite se {{SITENAME}}',
 'nologin' => "Nemate korisničko ime? '''$1'''.",
 'nologinlink' => 'Otvorite račun',
 'createaccount' => 'Napravi korisnički račun',
 'gotaccount' => "Imate račun? '''$1'''.",
 'gotaccountlink' => 'Prijavi se',
 'userlogin-resetlink' => 'Zaboravili ste detalje vaše prijave?',
+'userlogin-resetpassword-link' => 'Resetirajte svoju lozinku/zaporku',
+'helplogin-url' => 'Help:Logiranje',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri logiranju]]',
+'createacct-join' => 'Unesite svoje informacije ispod',
+'createacct-emailrequired' => 'E-mail adresa',
+'createacct-emailoptional' => 'E-mail adresa (opcionalno)',
+'createacct-email-ph' => 'Unesite svoju E-mail adresu',
 'createaccountmail' => 'Koristite privremenu slučajno stvorenu lozinku i pošaljite na dolje specificiranu e-mail adresu',
+'createacct-realname' => 'Stvarno ime (opcionalno)',
 '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-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.',
 'userexists' => 'Uneseno korisničko ime već je u upotrebi.
 Unesite neko drugo ime.',
 'loginerror' => 'Greška pri prijavljivanju',
+'createacct-error' => 'Pogreška u stvaranju računa',
 'createaccounterror' => 'Ne može se napraviti račun: $1',
 'nocookiesnew' => "Korisnički nalog je napravljen, ali niste prijavljeni.
 {{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.
@@ -739,21 +780,20 @@ Da biste završili prijavu, morate unijeti novu šifru ovdje:',
 'resetpass-wrong-oldpass' => 'Privremena ili trenutna lozinka nije valjana.
 Možda ste već uspješno promijenili Vašu lozinku ili ste tražili novu privremenu lozinku.',
 'resetpass-temp-password' => 'Privremena lozinka:',
+'resetpass-abort-generic' => 'Promjenu lozinke/zaporke je prekinula ekstenzija.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ponovno postavi lozinku',
-'passwordreset-text' => 'Ispunite ovaj obrazac da biste dobili e-mail podsjetnik o vašim detaljima računa.',
 'passwordreset-legend' => 'Ponovno postavi lozinku',
 'passwordreset-disabled' => 'Ponovno postavljanje lozinke je onemogućeno na ovom wikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan dio podataka ispod}}',
+'passwordreset-emaildisabled' => 'Postavke E-maila su deaktivirane na ovoj wiki.',
 'passwordreset-username' => 'Korisničko ime:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'Pogledati krajnji e-mail?',
 'passwordreset-capture-help' => 'Ako označite ovu kućicu, e-mail s privremenom lozinkom će biti prikazana i poslata korisniku.',
 'passwordreset-email' => 'E-mail adresa:',
 'passwordreset-emailtitle' => 'Detalji računa na {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Netko (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik Vaših detalja računa
-za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}}
+'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}}
 povezani s ovom e-mail adresom:
 
 $2
@@ -762,7 +802,7 @@ $2
 Trebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj
 zahtjev, ili ako ste se sjetili Vaše početne lozinke, a ne želite je promijeniti, 
 možete zanemariti ovu poruku i nastaviti koristiti staru lozinku.',
-'passwordreset-emailtext-user' => 'Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima Vašeg računa za {{SITENAME}}
+'passwordreset-emailtext-user' => 'Korisnik $1 na {{SITENAME}} je zatražio resetiranje vaše lozinke/zaporke za {{SITENAME}}
 ($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:
 
 $2
@@ -773,9 +813,9 @@ zahtjev, ili ako ste se sjetili Vaše originalne lozinke, a ne želite je više
 možete zanemariti ovu poruku i nastaviti koristiti staru lozinku.',
 'passwordreset-emailelement' => 'Korisničko ime: $1
 Privremena šifra: $2',
-'passwordreset-emailsent' => 'E-mail podsjetnik je poslan.',
-'passwordreset-emailsent-capture' => 'Poslan je podsjetnik preko e-maila (prikazan dolje).',
-'passwordreset-emailerror-capture' => 'E-mail s podsjetnikom, prikazan dolje, je poslan, ali slanje korisniku nije uspjelo: $1',
+'passwordreset-emailsent' => 'E-mail za resetiranje lozinke/zaporke je poslan.',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Promijeni e-mail adresu',
@@ -998,6 +1038,8 @@ Izgleda da već postoji.',
 'content-failed-to-parse' => 'Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3',
 'invalid-content-data' => 'Neispravni podaci sadržaja',
 'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.
+Ako ste prijavljeni, možete isključiti ovo upozorenje u "{{int:prefs-editing}}" dijelu vaših opcija.',
 
 # Content models
 'content-model-wikitext' => 'wikitekst',
@@ -1285,15 +1327,7 @@ Pokušajte u svoju pretragu staviti ''all:'' da se pretražuje cjelokupan sadrž
 'searchdisabled' => 'Pretraga teksta na ovoj Wiki je trenutno onemogućena.
 U međuvremenu možete pretraživati preko Googlea.
 Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
-
-# Quickbar
-'qbsettings' => 'Podešavanja brze palete',
-'qbsettings-none' => 'Nikakva',
-'qbsettings-fixedleft' => 'Fiksirana lijevo',
-'qbsettings-fixedright' => 'Fiksirana desno',
-'qbsettings-floatingleft' => 'Plutajuća lijevo',
-'qbsettings-floatingright' => 'Plutajuća desno',
-'qbsettings-directionality' => 'Fiksno, ovisno o smjeru pisma Vašeg jezika',
+'search-error' => 'Dogodila se pogreška prilikom pretraživanja: $1',
 
 # Preferences page
 'preferences' => 'Postavke',
@@ -1439,6 +1473,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'userrights-notallowed' => 'Vaš račun Vam ne daje dozvolu da postavljate i uklanjate korisnička prava.',
 'userrights-changeable-col' => 'Grupe koje možete mijenjati',
 'userrights-unchangeable-col' => 'Grupe koje ne možete mijenjati',
+'userrights-conflict' => 'Sukob u korisničkim pravima! Molimo pošaljite Vaše promjene ponovno.',
 
 # Groups
 'group' => 'Grupa:',
@@ -1844,7 +1879,6 @@ Za optimalnu sigurnost, img_auth.php je onemogućena.',
 'http-read-error' => 'Greška pri čitanju HTTP.',
 'http-timed-out' => 'Istekao HTTP zahtjev.',
 'http-curl-error' => 'Greška pri otvaranju URLa: $1',
-'http-host-unreachable' => 'Ovaj URL nije bilo moguće otvoriti',
 'http-bad-status' => 'Nastao je problem tokom HTTP zahtjeva: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2003,6 +2037,12 @@ Prije brisanja provjerite da li druge stranice vode na te šablone.',
 One se možda moraju povezati sa konkretnim člankom.<br />
 Stranica se smatra stranicom za razvrstavanje, ukoliko koristi šablon koji je povezan sa spiskom [[MediaWiki:Disambiguationspage|stranica za razvrstavanje]]",
 
+'pageswithprop' => 'Stranice sa svojstvom stranice',
+'pageswithprop-legend' => 'Stranice sa svojstvom stranice',
+'pageswithprop-text' => 'Ova stranica navodi stranice sa specifičnim svojstvom stranice.',
+'pageswithprop-prop' => 'Naziv svojstva:',
+'pageswithprop-submit' => 'Idi',
+
 'doubleredirects' => 'Dvostruka preusmjerenja',
 'doubleredirectstext' => 'Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.
 Svaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, što obično daje "pravi" ciljni članak, na koji bi prvo preusmjerenje i trebalo da pokazuje.
@@ -2676,6 +2716,7 @@ Molimo vas da kontaktirate vašeg davatelja internetskih usluga (Internet Servic
 'sorbsreason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL koji koristi {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Vaša IP adresa je prikazana kao otvoreni proxy u DNSBL korišten od {{SITENAME}}.
 Ne možete napraviti račun',
+'xffblockreason' => 'IP adresa koja postoji u zagljavlju X-Forwarded-For, ili Vaša ili od proxy servera koji koristite, je blokirana. Originalni razlog za blokiranje je bio: $1',
 'cant-block-while-blocked' => 'Ne možete blokirati druge korisnike dok ste blokirani.',
 'cant-see-hidden-user' => 'Korisnik kojeg pokušavate blokirati je već blokiran i sakriven. 
 Pošto nemate prava hideuser (sakrivanje korisnika), ne možete vidjeti ni urediti korisnikovu blokadu.',
@@ -2840,6 +2881,8 @@ Molimo posjetite [//www.mediawiki.org/wiki/Localisation MediaWiki lokalizaciju]
 'thumbnail-more' => 'Uvećaj',
 'filemissing' => 'Nedostaje datoteka',
 'thumbnail_error' => 'Greška pri pravljenju umanjene slike: $1',
+'thumbnail_error_remote' => 'Poruka o pogrešci o $1:
+$2',
 'djvu_page_error' => 'DjVu stranica je van opsega',
 'djvu_no_xml' => 'Za XML-datoteku se ne može pozvati DjVu datoteka',
 'thumbnail-temp-create' => 'Ne mogu da napravim privremenu smanjenu sliku',
@@ -3139,11 +3182,25 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minuta|$1 minuta}}',
 'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
 'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
+'weeks' => '{{PLURAL:$1|$1 sedmica}}',
 'months' => '{{PLURAL:$1|$1 mjesec|$1 mjeseci}}',
 'years' => '{{PLURAL:$1|$1 godina|$1 godine|$1 godina}}',
 'ago' => 'prije $1',
 'just-now' => 'upravo sada',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|sat|sati}}',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minuta}}',
+'seconds-ago' => '$1 {{PLURAL:$1|sekunda|sekunde}}',
+'monday-at' => 'ponedjeljak u $1',
+'tuesday-at' => 'utorak u $1',
+'wednesday-at' => 'srijeda u $1',
+'thursday-at' => 'četvrtak u $1',
+'friday-at' => 'petak u $1',
+'saturday-at' => 'subota u $1',
+'sunday-at' => 'nedjelja u $1',
+'yesterday-at' => 'jučer u $1',
+
 # Bad image list
 'bad_image_list' => "Koristi se sljedeći format:
 
@@ -3171,7 +3228,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Visina',
 'exif-bitspersample' => 'Bita po komponenti',
@@ -3351,7 +3408,7 @@ Svi drugi linkovi u istoj liniji se smatraju izuzecima, npr. kod stranica gdje s
 'exif-originalimageheight' => 'Visina slike prije nego što je odrezana',
 'exif-originalimagewidth' => 'Širina slike prije nego što je odrezana',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nekompresovano',
 'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeo Huffmanovo šifriranje po dužini',
 'exif-compression-3' => 'CCITT Group 3 faks kodiranje',
@@ -3768,12 +3825,17 @@ Trebali biste dobiti [{{SERVER}}{{SCRIPTPATH}}/KOPIJU GNU opće javne licence] z
 'version-entrypoints-header-entrypoint' => 'Ulazna tačka',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica prikazuje potpunu putanju za datoteku.
-Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktno sa, s njima povezanim, programom.',
+# Special:Redirect
+'redirect' => 'Preusmjeravanje preko datoteke, korisnika ili ID-a izmjene',
+'redirect-legend' => 'Preusmjeravanje na datoteku ili stranicu',
+'redirect-summary' => 'Ova posebna stranica preusmjerava na datoteku (ako je navedeno ime datoteke), stranicu (ako postoji ID revizije) ili korisničku stranicu (ako postoji brojčani ID korisnika).',
+'redirect-submit' => 'Idi',
+'redirect-lookup' => 'Pregled:',
+'redirect-value' => 'Vrijednost:',
+'redirect-user' => 'Korisnički ID',
+'redirect-revision' => 'Izmjena stranice',
+'redirect-file' => 'Naziv datoteke',
+'redirect-not-exists' => 'Vrijednost nije pronađena',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Potraga za duplim datotekama',
@@ -3864,23 +3926,26 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'htmlform-submit' => 'Unesi',
 'htmlform-reset' => 'Vrati izmjene',
 'htmlform-selectorother-other' => 'Ostalo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Odaberi opciju',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 sa podrškom pretrage cijelog teksta',
 'sqlite-no-fts' => '$1 bez podrške pretrage cijelog teksta',
 
 # New logging system
-'logentry-delete-delete' => '$1 obrisa stranicu $3',
-'logentry-delete-restore' => '$1 povrati stranicu $3',
-'logentry-delete-event' => '$1 promijeni vidljivost {{PLURAL:$5|događaja u historiji|$5 događaja u historiji|$5 događaja u historiji}} na $3: $4',
-'logentry-delete-revision' => '$1 promijeni vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4',
-'logentry-delete-event-legacy' => '$1 promijeni vidljivost događajâ u historiji na $3',
-'logentry-delete-revision-legacy' => '$1 promijeni vidljivost izmjenâ na stranici $3',
-'logentry-suppress-delete' => '$1 potisnu stranicu $3',
+'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|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-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 je {{GENDER:$2|potisnuo|potisnula}} stranicu $3',
 'logentry-suppress-event' => '$1 potajno promijeni vidljivost {{PLURAL:$5|događaja u historiji|$5 događaja u historiji|$5 događaja u historiji}} na $3: $4',
-'logentry-suppress-revision' => '$1 potajno promijeni vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4',
-'logentry-suppress-event-legacy' => '$1 potajno promijeni vidljivost događajâ u registru na $3',
-'logentry-suppress-revision-legacy' => '$1 potajno promijeni vidljivost izmjenâ na stranici $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' => 'sadržaj je sakriven',
 'revdelete-summary-hid' => 'sažetak izmjene je sakriven',
 'revdelete-uname-hid' => 'korisničko ime sakriveno',
@@ -3889,20 +3954,20 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'revdelete-uname-unhid' => 'korisničko ime je otkriveno',
 'revdelete-restricted' => 'primijenjena ograničenja za administratore',
 'revdelete-unrestricted' => 'uklonjena ograničenja za administratore',
-'logentry-move-move' => '$1 premjesti stranicu $3 na $4',
-'logentry-move-move-noredirect' => '$1 premjesti stranicu $3 na $4 bez ostavljanja preusmjerenja',
-'logentry-move-move_redir' => '$1 je premjestio stranicu $3 na $4 preko preusmjerenja',
-'logentry-move-move_redir-noredirect' => '$1 premjesti stranicu $3 na $4 preko preusmjerenja bez ostavljanja preusmjerenja',
-'logentry-patrol-patrol' => '$1 označi izmjenu $4 pregledane stranice $3',
-'logentry-patrol-patrol-auto' => '$1 samostalno označi izmjenu $4 pregledane stranice $3',
-'logentry-newusers-newusers' => 'Korisnički račun $1 je napravljen',
-'logentry-newusers-create' => 'Korisnički račun $1 je napravljen',
-'logentry-newusers-create2' => 'Korisnički račun $3 {{GENDER:|je napravio|je napravila|je napravio}} $1',
-'logentry-newusers-byemail' => 'Korisnički račun $3 je napravio $1 i lozinka/šifra je poslana putem e-maila',
-'logentry-newusers-autocreate' => 'Račun $1 je samostalno otvoren',
-'logentry-rights-rights' => '$1 {{GENDER:$1|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3 iz $4 u $5',
-'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|je promenio|je promenila|je promenio}} članstvo grupe za $3',
-'logentry-rights-autopromote' => '$1 je automatski {{GENDER:$1|unaprijeđen|unaprijeđena|unaprijeđen}} iz $4 u $5',
+'logentry-move-move' => '$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4',
+'logentry-move-move-noredirect' => '$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 bez ostavljanja preusmjerenja',
+'logentry-move-move_redir' => '$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja',
+'logentry-move-move_redir-noredirect' => '$1 je {{GENDER:$2|premjestio|premjestila}} stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja',
+'logentry-patrol-patrol' => '$1 je {{GENDER:$2|označio|označila}} izmjenu $4 stranice $3 patroliranim',
+'logentry-patrol-patrol-auto' => '$1 je automatski {{GENDER:$2|označio|označila}} izmjenu $4 stranice $3 patroliranim',
+'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' => 'Korisnički račun $3 {{GENDER:$2|je napravio|je napravila|je napravio}} $1',
+'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-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',
 'rightsnone' => '(nema)',
 
 # Feedback
@@ -3978,4 +4043,7 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'duration-centuries' => '$1 {{PLURAL:$1|vijek|vijekova}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenijum|milenijuma}}',
 
+# Image rotation
+'rotate-comment' => 'Slika rotirana za $1 {{PLURAL:$1|stepeni}} u smjeru kazaljke na satu',
+
 );
index 696c4fb..11f2e18 100644 (file)
@@ -43,8 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ml uṭṭun n Midn lli swurn ɣ tasna yad',
 'tog-oldsig' => 'Asmmaql (Tiẓṛi) n ukrraj n ufus lli illan:',
 'tog-fancysig' => 'Skr akrrag n ufus s taɣarast  n  wikitext (bla azday utumatik)',
-'tog-externaleditor' => 'Swwur s yan umẓṛg u uṭṛiṣ n brra ( i imskarn lli bahra ḥrcnin, ira mayad riglaj iẓlin ɣ urdinatur)',
-'tog-externaldiff' => 'Skr s yan umsnaḥya abrrani ( i midn lli bahra ḥrcnin, mayad ira riglaj ɣ urdinatur)',
 'tog-showjumplinks' => 'Srɣ izdayn « Amuddu » d « acnubc » niḍ « Asiǧl » ɣ uflla n tasna',
 'tog-uselivepreview' => 'Skr s umẓri amaynu izrbn (ira JavaScript) (Arm)',
 'tog-forceeditsummary' => 'Ayyit tini iɣ ur iwiɣ imsmun n imbdln',
@@ -405,7 +403,7 @@ Ussaɣ n isqdacn ḥiln hlli.
 'emailconfirmlink' => 'Als i tasna nk n tbratin izd nit nttat ayan.',
 'loginlanguagelabel' => 'Tutlayt: $1',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'Kra ur igadda tasɣnt btbratin() n PHP.',
 
 # Change password dialog
@@ -657,14 +655,6 @@ Tigira n ujbbad ns, ar takka yat tayafut bahra imqqurn,  ɣayan afan ur ttili.',
 Tzdar at cabbat ɣilad ɣ Google.
 Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
 
-# Quickbar
-'qbsettings' => 'Tafeggagt izrbn',
-'qbsettings-none' => 'Ur iḥudda',
-'qbsettings-fixedleft' => 'Aẓẓugz azlmaḍ',
-'qbsettings-fixedright' => 'Azzugz afasi',
-'qbsettings-floatingleft' => 'Yaywul su uzlmad',
-'qbsettings-floatingright' => 'Yaywul su ufasi',
-
 # Preferences page
 'preferences' => 'Timssusmin',
 'mypreferences' => 'Timssusmin',
@@ -911,7 +901,7 @@ Mel imbddeln z tisniwin li ittuyzdayni bla tasna li trit.',
 # Special:ListGroupRights
 'listgrouprights-members' => 'Umuɣ n  midn',
 
-# E-mail user
+# Email user
 'emailuser' => 'Azn tabrat umsqdac ad',
 
 # Watchlist
@@ -1293,10 +1283,6 @@ Wiyyaḍ raggis ḥbun s ɣiklli sttin kkan gantn.
 'version-software-product' => 'lmntoj',
 'version-software-version' => 'noskha',
 
-# Special:FilePath
-'filepath-page' => 'Asdaw:',
-'filepath-submit' => 'Ftu',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'smiyt n-wasdaw:',
 'fileduplicatesearch-submit' => 'Sigl',
index 1474df1..b6c719f 100644 (file)
@@ -222,8 +222,6 @@ $messages = array(
 'tog-shownumberswatching' => 'මුර කරනු ලබන පරිශීලකයන් සංඛ්‍යාව පෙන්වන්න',
 'tog-oldsig' => 'පවතින අත්සන:',
 'tog-fancysig' => 'අත්සන විකිපෙළ (ස්වයංක්‍රීය සබැඳියක් විරහිතව) ලෙසින් සලකන්න',
-'tog-externaleditor' => 'බාහිර සම්පාදකයක් භාවිත කරන්න (ප්‍රවීණයන් සඳහා පමණි, ඔබගේ පරිගණකයේ විශේෂිත වූ සැකසුම් අවශ්‍ය වේ. [//www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
-'tog-externaldiff' => 'බාහිර ප්‍රභේදයක් භාවිත කරන්න (ප්‍රවීණයන් සඳහා පමණි, ඔබගේ පරිගණකයේ විශේෂිත වූ සැකසුම් අවශ්‍ය වේ. [//www.mediawiki.org/wiki/Manual:External_editors තවත් තොරතුරු.])',
 'tog-showjumplinks' => '"වෙත පනින්න"  යන ප්‍රවේශතා සබැඳියන් සක්‍රීය කරන්න',
 'tog-uselivepreview' => 'තත්කාල පෙර-දසුන භාවිතා කරන්න (ජාවාස්ක්‍රිප්ට්) (පරීක්ෂණාත්මක)',
 'tog-forceeditsummary' => 'හිස් සංස්කරණ සාරාංශයකට මා ඇතුළු වන විට මාහට ඉඟි කරන්න',
@@ -238,6 +236,7 @@ $messages = array(
 'tog-showhiddencats' => 'සැඟවුනු ප්‍රවර්ග පෙන්වන්න',
 'tog-noconvertlink' => 'සබැඳියන්ගේ ශීර්ෂ පෙරැළීම අක්‍රීය කරන්න',
 'tog-norollbackdiff' => 'පුනරාවර්තනයක් කිරීමෙන් පසු වෙනස්වීම් අත්හරින්න',
+'tog-useeditwarning' => 'මා සංස්කරණ පිටුවක් සුරකිනු නොලැබූ වෙනස්කිරීම් සමඟ අතහැර යන විට අවවාද කරන්න',
 
 'underline-always' => 'සැමවිටම කරන්න',
 'underline-never' => 'කිසිවිටෙක නොකරන්න',
@@ -608,9 +607,18 @@ $2',
 'welcomecreation-msg' => 'ඔබගේ ගිණුම තනා ඇත.
 ඔබගේ [[Special:Preferences|{{SITENAME}} අභිරුචීන්]] නෙස් කිරීමට අමතක නොකරන්න.',
 'yourname' => 'පරිශීලක නාමය:',
+'userlogin-yourname' => 'පරිශීලක නම',
+'userlogin-yourname-ph' => 'ඔබගේ පරිශීලක නම ඇතුළු කරන්න',
 'yourpassword' => 'මුරපදය:',
+'userlogin-yourpassword' => 'මුර පදය',
+'userlogin-yourpassword-ph' => 'ඔබගේ මුර පදය ඇතුළු කරන්න',
+'createacct-yourpassword-ph' => 'මුර පදයක් ඇතුළු කරන්න',
 'yourpasswordagain' => 'මුරපදය යළි ඇතුළු කරන්න:',
+'createacct-yourpasswordagain' => 'මුර පදය සනාථ කරන්න',
+'createacct-yourpasswordagain-ph' => 'මුර පදය යළි ඇතුළු කරන්න',
 'remembermypassword' => 'මාගේ පිවිසීම මෙම ගවේෂක මතකයෙහි (උපරිම ලෙස {{PLURAL:$1|දින|දින}}) $1 ක් මතක තබාගන්න',
+'userlogin-remembermypassword' => 'මා ප්‍රවිෂ්ටයෙහි තබන්න',
+'userlogin-signwithsecure' => 'සුරක්ෂිත සම්බන්ධතාවය භාවිතා කරන්න',
 'securelogin-stick-https' => 'ඇතුල්වීමෙන් පසුවද HTTPS හරහා සම්බන්ධ වන්න',
 'yourdomainname' => 'ඔබගේ වසම:',
 'password-change-forbidden' => 'ඔබට මෙම විකියෙහි මුරපද වෙනස් කල නොහැක.',
@@ -623,14 +631,26 @@ $2',
 'logout' => 'නික්මීම',
 'userlogout' => 'නික්මීම',
 'notloggedin' => 'ප්‍රවිසී නැත',
+'userlogin-noaccount' => 'ගිණුමක් නොමැතිද?',
+'userlogin-joinproject' => '{{SITENAME}}හා එක්වන්න',
 'nologin' => "ඔබ හට ගිණුමක් නොමැතිද? '''$1'''.",
 'nologinlink' => 'ගිණුමක් තනන්න',
 'createaccount' => 'අලුත් ගිණුමක් තනන්න',
 'gotaccount' => 'දැනටමත් ගිණුමක් තිබේද? $1.',
 'gotaccountlink' => 'පිවිසෙන්න',
 'userlogin-resetlink' => 'ඔබේ පිවිසුම් තොරතුරු අමතකද?',
-'createaccountmail' => 'විද්‍යුත් තැපෑල මගින්',
+'helplogin-url' => 'Help:ප්‍රවිෂ්ට වීම',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|ප්‍රවිෂ්ට වීමට උදවු වන්න]]',
+'createacct-join' => 'ඔබගේ තොරතුරු පහත ඇතුළු කරන්න.',
+'createacct-emailrequired' => 'වි-තැපෑල ලිපිනය',
+'createacct-emailoptional' => 'වි-තැපෑල ලිපිනය (විකල්ප)',
+'createacct-email-ph' => 'ඔබගේ වි-තැපෑල ලිපිනය ඇතුළු කරන්න',
+'createaccountmail' => 'තාවකාලික අහුඹු මුර පදයක් භාවිතා කර එය පහත දක්වා ඇති වි-තැපැල් ලිපිනයට යවන්න',
+'createacct-realname' => 'නියම නම (වෛකල්පීය)',
 'createaccountreason' => 'හේතුව:',
+'createacct-reason' => 'හේතුව',
+'createacct-reason-ph' => 'ඔබ තවත් ගිණුමක් තනන්නේ කුමක් නිසාද',
+'createacct-captcha' => 'ආරක්ෂක පරික්ෂාව',
 'badretype' => 'ඔබ ඇතුළු කල මුරපදය නොගැලපේ.',
 'userexists' => 'ඔබ ඇතුළු කල පරිශීලක නාමය දැනටමත් භාවිතයෙහි ඇත.
 කරුණාකර වෙනත් නමක් තෝරා ගන්න.',
@@ -674,8 +694,8 @@ $2',
 'blocked-mailpassword' => 'ඔබගේ අන්තර්ජාල ලිපිනය භාවිතා කරමින් සංස්කරණයෙහි යෙදීම වාරණය කොට ඇති අතර, අපයෙදුම වළකනු වස්,  මුර-පදය පුනරුත්ථාන  කෘත්‍යය භාවිත කිරීමට අවසරයද අහිමි කොට ඇත.',
 'eauthentsent' => 'නම් කර ඇති විද්‍යුත්-ලිපි ලිපිනය වෙත, තහවුරු කිරීම් විද්‍යුත්-ලිපියක් යවා ඇත.
 ගිණුම වෙත වෙනත් විද්‍යුත්-ලිපියක්  යැවීමට පෙර, ගිණුම සත්‍ය වශයෙන්ම ඔබගේම බව තහවුරු කරනු වස්, විද්‍යුත්-ලිපියෙහි අඩංගු උපදෙස්  පිළිපදින්න.',
-'throttled-mailpassword' => 'අවසන් {{PLURAL:$1| පැය|පැය $1 }} අතරතුරදී, දැනටමත් එක් මුර-පද සිහිගැන්වීමක් යවා ඇත .
-අපයෙදුම වළක්වනු වස්, {{PLURAL:$1|එක් පැයක| පැය $1 ක}}ට වරක් එක් මුර-පද සිහිගැන්වීමක් පමණක් යවනු ලැබේ.',
+'throttled-mailpassword' => 'අවසන් {{PLURAL:$1|පැය|පැය $1}} අතරතුරදී, මුරපද යළි සැකසුම් විද්‍යුත් තැපෑලක් දැනටමත් යවා ඇත.
+අපයෙදුම වළක්වනු වස්, {{PLURAL:$1|එක් පැයක|පැය $1 ක}}ට වරක් එක් මුරපද යළි සැකසුම් විද්‍යුත් තැපෑලක් පමණක් යවනු ලැබේ.',
 'mailerror' => 'තැපෑල යැවීමේදී වූ දෝෂය: $1',
 'acct_creation_throttle_hit' => 'ඔබගේ අන්තර්ජාල ලිපිනය භාවිතා කල මෙම විකියට අමුත්තන් විසින් {{PLURAL:$1|එක් ගිණුමක්|ගිණුම් $1 ක්}} පසුගිය දිනය තුලදී තනා ඇති අතර, එය මෙම කාල පරිච්ඡේදය තුලදී ඉඩ දෙනු ලබන උපරිමය වෙයි.
 මේ හේතුවෙන්, මෙම අන්තර්ජාල ලිපිනය භාවිතා කරන අමුත්තන් විසින් මෙම අවස්ථාවෙහිදී තවත් ගිණුම් තැනීම සිදු කල නොහැකිව ඇත.',
@@ -727,7 +747,7 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'මුරපදය වෙනස් කරන්න',
-'passwordreset-text' => 'ඔබගේ ගිණුම් තොරතුරුවල විද්‍යුත් තැපැල් මතක්කිරීමක් ලබා ගැනීම සදහා මෙම ආකෘතිපත්‍රය සම්පූර්ණ කරන්න.',
+'passwordreset-text' => 'ඔබගේ මුරපදය යළි සැකසීම සදහා මෙම ආකෘතිපත්‍රය සම්පූර්ණ කරන්න.',
 'passwordreset-legend' => 'මුරපදය යළි පිහිටුවන්න',
 'passwordreset-disabled' => 'මෙම විකියෙහි මුර පද ප්‍රත්‍යාරම්භ කිරීම් අක්‍රීය කොට ඇත.',
 'passwordreset-pretext' => '{{PLURAL:$1||පහත දැක්වෙන දත්ත කණ්ඩ වලින් එකක් ඇතුල් කරන්න}}',
@@ -967,6 +987,8 @@ $2
 එය දැනටමත් පවතියි.',
 'defaultmessagetext' => 'සාමාන්‍ය පණිවුඩ පෙළ',
 'invalid-content-data' => 'වලංගු නොවන අන්තර්ගත දත්ත',
+'editwarning-warning' => 'අවධානයට: මෙම පිටුවෙන් නික්ම යාම ඔබ සිදු කළ වෙනස්කම් නැතිවී යෑමට හේතු විය හැක.
+ඔබ ප්‍රවිෂ්ටවී ඇත්නම්, ඔබගේ වරණයන්වල "සංසකරණය කිරීම්" කොටසේ ඇති මෙම අනතුරු ඇඟවීම අක්‍රීය කළ හැක.',
 
 # Content models
 'content-model-wikitext' => 'විකිපෙළ',
@@ -1219,7 +1241,7 @@ $1",
 'search-interwiki-default' => '$1 වෙතින් ප්‍රතිඵල:',
 'search-interwiki-more' => '(තවත්)',
 'search-relatedarticle' => 'සහසම්බන්ධිත',
-'mwsuggest-disable' => 'AJAX ඇඟවිලි අක්‍රීය කරන්න',
+'mwsuggest-disable' => 'සෙවුම් යෝජනා අක්‍රීය කරන්න',
 'searcheverything-enable' => 'සියළු නාමඅවකාශයන්හි ගවේෂණය කරන්න',
 'searchrelated' => 'ආශ්‍රිත',
 'searchall' => 'සියල්ල',
@@ -1242,14 +1264,6 @@ $1",
 මේ අතරතුර ඔබ හට ගූගල් ඔස්සේ ගවේෂණය කල හැක.
 {{SITENAME}} අන්තර්ගතය පිළිබඳ ඔවුන්ගේ සූචි යල් පැන ගොස් ඇතිවා විය හැකි බව සටහන් කර ගන්න.',
 
-# Quickbar
-'qbsettings' => 'යුහුතීරුව',
-'qbsettings-none' => 'කිසිවක් නොමැත',
-'qbsettings-fixedleft' => 'ස්ථාවර වම',
-'qbsettings-fixedright' => 'ස්ථාවර දකුණ',
-'qbsettings-floatingleft' => 'ප්ලාවක වම',
-'qbsettings-floatingright' => 'ප්ලාවක දකුණ',
-
 # Preferences page
 'preferences' => 'අභිරුචි',
 'mypreferences' => 'අභිරුචීන්',
@@ -1799,7 +1813,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization බලන්න.',
 'http-read-error' => 'HTTP කියැවුම් දෝෂය.',
 'http-timed-out' => 'HTTP අයැදුම සඳහා වූ කාලය ඉක්මව ඇත.',
 'http-curl-error' => 'අන්තර්ජාල ලිපිනය පමුණුවාගෙන ඒමේ දෝෂය : $1',
-'http-host-unreachable' => 'අන්තර්ජාල ලිපිනය වෙත සේන්දු විය නොහැකි විය',
 'http-bad-status' => 'HTTP ආයාචනයෙහිදී ගැටළුවක් පැන නැගුනි: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2174,7 +2187,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 'usermessage-editor' => 'පද්ධති පණිවුඩ කරු',
 
 # Watchlist
-'watchlist' => 'මà\9cà·\9a à¶¸à·\94ර-ලැයිස්තුව',
+'watchlist' => 'මà·\94රලැයිස්තුව',
 'mywatchlist' => 'මුර-ලැයිස්තුව',
 'watchlistfor2' => '$1 සඳහා ($2)',
 'nowatchlist' => 'ඔබගේ මුර-ලැයිස්තුවේ කිසිදු අයිතමයක් නොමැත.',
@@ -2194,8 +2207,8 @@ When filtered by user, only files where that user uploaded the most recent versi
 'notvisiblerev' => 'සංශෝධනය මකාදමා ඇත',
 'watchnochange' => 'ඔබ විසින් මුරකෙරෙන කිසිදු අයිතමයක් දක්වා ඇති කාල සීමාවෙහිදී  සංස්කරණයට භාජනය වී නොමැත.',
 'watchlist-details' => 'සාකච්ඡා පිටු නොගිණුනු කල, ඔබගේ මුර ලැයිස්තුවෙහි {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} ඇත.',
-'wlheader-enotif' => 'විද්‍යුත්-තැපැල් දැනුම්දීම සක්‍රීය කෙරිණි.',
-'wlheader-showupdated' => "ඔබ විසින් ඒවාට අවසන් වරට පිවිසුනු පසුව වෙනස්කෙරුනු පිටු  '''තදකුරු''' වලින් පෙන්වා ඇත",
+'wlheader-enotif' => 'විද්‍යුත්-තැපැල් දැනුම්දීම සක්‍රීය කෙරිණි.',
+'wlheader-showupdated' => "ඔබ විසින් ඒවාට අවසන් වරට පිවිසුනු පසුව වෙනස්කෙරුනු පිටු  '''තදකුරු''' වලින් පෙන්වා ඇත",
 'watchmethod-recent' => 'මුර-කෙරෙන පිටු සඳහා මෑත සංස්කරණයන් පරික්‍ෂා කරමින්',
 'watchmethod-list' => 'මෑත සංස්කරණයන් සඳහා මුර-කෙරෙන පිටු පරික්‍ෂා කරමින්',
 'watchlistcontains' => 'ඔබගේ මුර-ලැයිස්තුවෙහි  {{PLURAL:$1|එක් පිටුවක්|පිටු $1 ක්}} අඩංගුය.',
@@ -2915,26 +2928,15 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 
 # Stylesheets
 'common.css' => '/* මෙහි CSS  බහාලීම සියළු ඡවියයන් භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'standard.css' => '/* මෙහි CSS  බහාලීම සම්මත ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'nostalgia.css' => '/* මෙහි CSS  බහාලීම පිළිසැමරුම් ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'cologneblue.css' => '/* මෙහි CSS  බහාලීම "Cologne Blue" ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'monobook.css' => '/* මෙහි CSS  බහාලීම ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'myskin.css' => '/* මෙහි CSS  බහාලීම මගේ-ඡවිය ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'chick.css' => '/* මෙහි CSS  බහාලීම හැඩකාරී ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
-'simple.css' => '/* මෙහි CSS  බහාලීම සරල ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'modern.css' => '/* මෙහි CSS  බහාලීම නූතන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */',
 'print.css' => '/* මෙහි CSS  බහාලීම මුද්‍රණ ප්‍රතිදානයට බලපෑම් සිදු කල හැක */',
-'handheld.css' => '/* මෙහි බහාලන CSS විසින් $wgHandheldStyle හි වින්‍යාසකෙරෙන ජවිය මත පදනම් වූ අතේ ගෙන යා හැකි උපකරණ වලට බලපෑම් කල හැක*/',
 
 # Scripts
 'common.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සෑම පිටු ප්‍රවේශනයකදීම සියළු පරිශීලකයන්හට ප්‍රවේශනය කෙරේ. */',
-'standard.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සම්මත ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'nostalgia.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් පිළි සැමරුම් ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 'cologneblue.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සිහිල්-සුවඳ-පැන් ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 'monobook.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'myskin.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් මගේ-ඡවිය ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'chick.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් හැඩකාරී ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
-'simple.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සරල ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 'modern.js' => '/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් නූතන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */',
 
 # Metadata
@@ -3082,8 +3084,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3142,7 +3142,7 @@ Others will be hidden by default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'පළල',
 'exif-imagelength' => 'උස',
 'exif-bitspersample' => 'එක් සංරචකයකට බිට් ගණන',
@@ -3321,7 +3321,7 @@ Others will be hidden by default.
 'exif-personinimage' => 'පුද්ගලික වචනයෙන් විස්තර කරන ලද',
 'exif-originalimageheight' => 'කප්පාදුවට පෙර රූපයෙහි උස',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'අසංක්ෂිප්ත',
 'exif-compression-3' => 'CCITT සමූහය 3 ෆැක්ස් කේතීකරණය',
 'exif-compression-4' => 'CCITT සමූහය 4 ෆැක්ස් කේතීකරණය',
@@ -3819,13 +3819,6 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'version-entrypoints-header-entrypoint' => 'නිවේශන ලක්ෂ්‍යය',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'ගොනු පෙත',
-'filepath-page' => 'ගොනුව:',
-'filepath-submit' => 'යන්න',
-'filepath-summary' => 'මෙම විශේෂ පිටුව ගොනුවකට අදාල සම්පූර්ණ පෙත හුවා දක්වයි.
-රූප පූර්ණ විසර්ජනයෙන් දැක්වෙන අතර, අනෙකුත් ගොනු වර්ග ඒවායේ ආශ්‍රිත ක්‍රමලේඛයන් අනුසාරයෙන් සෘජුව ආරම්භ කෙරේ.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'අනුපිටපත් ගොනු සඳහා ගවේෂණය කරන්න',
 'fileduplicatesearch-summary' => 'එහි පූරක අගය පාදක කර ගෙන අනුපිටපත් ගොනු සඳහා ගවේෂණය කරන්න.',
@@ -3852,7 +3845,7 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'specialpages-group-highuse' => 'බෙහෙවින් භාවිත වන පිටු',
 'specialpages-group-pages' => 'පිටු ලැයිස්තු',
 'specialpages-group-pagetools' => 'පිටු මෙවලම්',
-'specialpages-group-wiki' => 'à·\80à·\92à¶\9aà·\92 à¶¯à¶­à·\8aත à·\84à·\8f à¶¸à·\99à·\80ලමà·\8a',
+'specialpages-group-wiki' => 'දත්ත හා මෙවලම්',
 'specialpages-group-redirects' => 'විශේෂ පිටු යළි-යොමුකිරීම',
 'specialpages-group-spam' => 'ස්පෑම් මෙවලම්',
 
index 8fe62a8..d993ff5 100644 (file)
@@ -16,6 +16,7 @@
  * @author Maros
  * @author Michawiki
  * @author Mormegil
+ * @author Nemo bis
  * @author Palica
  * @author Pitr2311
  * @author Ragimiri
@@ -311,8 +312,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Zobraziť počet používateľov sledujúcich stránku',
 'tog-oldsig' => 'Súčasný podpis:',
 'tog-fancysig' => 'Považovať podpisy za wikitext (bez automatických odkazov)',
-'tog-externaleditor' => 'Používať štandardne externý editor (iba pre expertov, vyžaduje špeciálne nastavenie vášho počítača. [//www.mediawiki.org/wiki/Manual:External_editors Ďalšie informácie.])',
-'tog-externaldiff' => 'Používať štandardne externý diff (iba pre expertov, vyžaduje špeciálne nastavenie vášho počítača. [//www.mediawiki.org/wiki/Manual:External_editors Ďalšie informácie.])',
 'tog-showjumplinks' => 'Používať odkazy „skočiť na“ pre lepšiu dostupnosť',
 'tog-uselivepreview' => 'Používať živý náhľad (JavaScript) (experimentálna funkcia)',
 'tog-forceeditsummary' => 'Upozoriť ma, keď nevyplním zhrnutie úprav',
@@ -327,6 +326,7 @@ $messages = array(
 'tog-showhiddencats' => 'Zobraziť skryté kategórie',
 'tog-noconvertlink' => 'Vypnúť konverziu názvov odkazov',
 'tog-norollbackdiff' => 'Vynechať rozdiel po vykonaní rollbacku',
+'tog-useeditwarning' => 'Upozorniť ma, keď opúšťam upravovaciu stránku s neuloženými zmenami',
 
 'underline-always' => 'Vždy',
 'underline-never' => 'Nikdy',
@@ -415,6 +415,7 @@ $messages = array(
 'newwindow' => '(otvorí v novom okne)',
 'cancel' => 'Zrušiť',
 'moredotdotdot' => 'Viac...',
+'morenotlisted' => 'Ďalšie neuvedené...',
 'mypage' => 'Stránka',
 'mytalk' => 'Diskusia',
 'anontalk' => 'Diskusia k tejto IP adrese',
@@ -448,6 +449,7 @@ $messages = array(
 'namespaces' => 'Menné priestory',
 'variants' => 'Varianty',
 
+'navigation-heading' => 'Navigačné menu',
 'errorpagetitle' => 'Chyba',
 'returnto' => 'Späť na $1.',
 'tagline' => 'Z {{GRAMMAR:genitív|{{SITENAME}}}}',
@@ -690,10 +692,19 @@ Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
 
 Odteraz môžete používať {{GRAMMAR:akuzatív|{{SITENAME}}}} ako anonymný používateľ alebo sa môžete opäť <span class='plainlinks'>[$1 prihlásiť]</span> pod rovnakým alebo odlišným používateľským menom.
 Uvedomte si, že niektoré stránky sa môžu naďalej zobrazovať ako keby ste boli prihlásený, až kým nevymažete vyrovnávaciu pamäť vášho prehliadača.",
+'welcomeuser' => 'Vitajte,  $1 !',
+'welcomecreation-msg' => 'Váš účet bol vytvorený.
+Nezabudnite zmeniť svoje [[Special:Preferences|Predvoľby {{GRAMMAR:genitív|{{SITENAME}}}}]].',
 'yourname' => 'Používateľské meno:',
+'userlogin-yourname' => 'Používateľské meno',
+'userlogin-yourname-ph' => 'Zadajte svoje používateľské meno',
 'yourpassword' => 'Heslo:',
+'userlogin-yourpassword' => 'Heslo',
+'userlogin-yourpassword-ph' => 'Zadajte svoje heslo',
 'yourpasswordagain' => 'Zopakujte heslo:',
 'remembermypassword' => 'Pamätať si prihlásenie na tomto počítači (naviac $1 {{PLURAL:$1|deň|dni|dní}})',
+'userlogin-remembermypassword' => 'Zapamätať si ma',
+'userlogin-signwithsecure' => 'Prihlásiť sa na zabezpečený server',
 'securelogin-stick-https' => 'Zostať pripojený cez HTTPS po prihlásení',
 'yourdomainname' => 'Vaša doména:',
 'password-change-forbidden' => 'Na tejto wiki si nemôžete zmeniť heslo.',
@@ -706,13 +717,17 @@ Uvedomte si, že niektoré stránky sa môžu naďalej zobrazovať ako keby ste
 'logout' => 'Odhlásiť',
 'userlogout' => 'Odhlásiť',
 'notloggedin' => 'Neprihlásený/á',
+'userlogin-noaccount' => 'Nemáte ešte účet?',
+'userlogin-joinproject' => 'Pridajte sa k {{GRAMMAR:lokál|{{SITENAME}}}}',
 'nologin' => "Nemáte ešte účet? '''$1'''.",
 'nologinlink' => 'Vytvoriť nový účet',
 'createaccount' => 'Vytvoriť nový účet',
 'gotaccount' => "Máte už vytvorený účet? '''$1'''.",
 'gotaccountlink' => 'Prihlásiť',
 'userlogin-resetlink' => 'Zabudli ste svoje prihlasovacie údaje?',
-'createaccountmail' => 'e-mailom',
+'helplogin-url' => 'Pomoc:Prihlasovanie',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoc s prihlásením]]',
+'createaccountmail' => 'Použiť dočasné náhodné heslo a poslať ho na nižšie uvedenú emailovú adresu',
 'createaccountreason' => 'Dôvod:',
 'badretype' => 'Zadané heslá nie sú rovnaké.',
 'userexists' => 'Zadané používateľské meno sa už používa.
@@ -755,8 +770,8 @@ Prosím, prihláste sa znovu, keď ho dostanete.',
 'blocked-mailpassword' => 'Boli zablokované úpravy z vašej IP adresy, a tak nie je dovolené použiť funkciu znovuvyžiadania hesla, aby sa zabránilo zneužitiu.',
 'eauthentsent' => 'Email s potvrdením bol zaslaný na uvedenú emailovú adresu.
 Predtým ako sa na účet pošle akákoľvek ďalšia pošta, musíte splniť inštrukcie v emaili, aby sa potvrdilo, že účet je skutočne váš.',
-'throttled-mailpassword' => 'V priebehu {{PLURAL:$1|poslednej $1 hodiny|posledných $1 hodín}} už došlo k vyžiadaniu hesla.
-Aby sa zabránilo zneužitiu, vyžiadanie hesla je možné vykonať iba raz za {{PLURAL:$1|$1 hodinu|$1 hodiny|$1 hodín}}.',
+'throttled-mailpassword' => 'E-mail na obnovenie hesla už bol odoslaný v priebehu {{PLURAL:$1|poslednej $1 hodiny|posledných $1 hodín}}.
+Aby sa zabránilo zneužitiu, obnovenie hesla emailom je možné vykonať iba raz za {{PLURAL:$1|$1 hodinu|$1 hodiny|$1 hodín}}.',
 'mailerror' => 'Chyba pri posielaní e-mailu: $1',
 'acct_creation_throttle_hit' => 'Návštevníci tejto wiki z vašej IP adresy už za posledný deň vytvorili {{PLURAL:$1|$1 účet|$1 účty|$1 účtov}}, čo je maximálny počet povolený za toto časové obdobie.
 Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť ďalšie účty.',
@@ -784,6 +799,7 @@ Prosím, počkajte predtým, než to skúsite znova.',
 # Email sending
 'php-mail-error-unknown' => 'Neznáma chyba vo funkcii PHP mail()',
 'user-mail-no-addy' => 'Pokus o odoslanie e-mailu bez e-mailovej adresy.',
+'user-mail-no-body' => 'Sa pokúsil poslať email s prázdnym alebo neprimerane krátkym telom správy.',
 
 # Change password dialog
 'resetpass' => 'Zmeniť heslo',
@@ -805,18 +821,16 @@ Je možné, že sa vám už podarilo úspešne zmeniť svoje heslo alebo ste si
 
 # Special:PasswordReset
 'passwordreset' => 'Reset hesla',
-'passwordreset-text' => 'Po vyplnení tohto formulára dostanete emailom podrobnosti o vašom účte.',
 'passwordreset-legend' => 'Obnoviť heslo',
 'passwordreset-disabled' => 'Obnovenie hesla bolo na tejto wiki zakázané.',
-'passwordreset-pretext' => '{{PLURAL:$1|Zadajte nižšie uvedený údaj|Zadajte jeden z nižšie uvedených údajov}}',
+'passwordreset-emaildisabled' => 'E-mailové funkcie boli na tejto wiki vypnuté.',
 'passwordreset-username' => 'Používateľské meno:',
 'passwordreset-domain' => 'Doména:',
 'passwordreset-capture' => 'Zobraziť výsledný e-mail?',
 'passwordreset-capture-help' => 'Ak označíte toto políčko, bude e-mail (s dočasným heslom) okrem zaslania používateľovi zobrazený aj vám.',
 'passwordreset-email' => 'Emailová adresa:',
 'passwordreset-emailtitle' => 'Podrobnosti o účte na {{GRAMMAR:lokál|{{SITENAME}}}}',
-'passwordreset-emailtext-ip' => 'Niekto (pravdepodobne vy z IP adresy $1) požiadal pripomenutie podrobností o vašom
-účtu na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}
+'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é}}
 s touto emailovou adresou:
 
 $2
@@ -825,8 +839,7 @@ $2
 Mali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo
 ak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu
 ignorovať a ďalej používať vaše staré heslo.',
-'passwordreset-emailtext-user' => 'Používateľ $1 na {{GRAMMAR:genitív|{{SITENAME}}}} požiadal pripomenutie podrobností o vašom
-účtu na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}
+'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é}}
 s touto emailovou adresou:
 
 $2
@@ -837,9 +850,9 @@ ak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete tút
 ignorovať a ďalej používať vaše staré heslo.',
 'passwordreset-emailelement' => 'Používateľské meno: $1
 Dočasné heslo:$2',
-'passwordreset-emailsent' => 'Email s heslom bol odoslaný.',
-'passwordreset-emailsent-capture' => 'Bol vytvorený pripomienkový e-mail, ktorý je zobrazený nižšie.',
-'passwordreset-emailerror-capture' => 'Bol vytvorený pripomienkový e-mail, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať používateľovi: $1',
+'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ť používateľovi: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Zmeniť emailovú adresu',
@@ -849,6 +862,7 @@ Dočasné heslo:$2',
 'changeemail-oldemail' => 'Súčasná e-mailová adresa:',
 'changeemail-newemail' => 'Nová e-mailová adresa:',
 'changeemail-none' => '(žiadna)',
+'changeemail-password' => 'Vaše heslo k {{GRAMMAR:lokál|{{SITENAME}}}}:',
 'changeemail-submit' => 'Zmeniť e-mail',
 'changeemail-cancel' => 'Zrušiť',
 
@@ -1015,8 +1029,8 @@ z voľného diela (public domain) alebo podobného zdroja neobmedzeného autorsk
 '''NEUMIESTŇUJTE SEM BEZ POVOLENIA DIELA CHRÁNENÉ AUTORSKÝM PRÁVOM!'''",
 'longpageerror' => "'''Chyba: Text, ktorý ste poslali má {{PLURAL:$1|jeden kilobajt|$1 kilobajty|$1 kilobajtov}}, čo je viac ako maximum {{PLURAL:$2|jeden kilobajt|$2 kilobajty|$2 kilobajtov}}.'''",
 'readonlywarning' => "'''UPOZORNENIE: Databáza bola počas upravovania stránky zamknutá z dôvodu údržby,
-takže stránku momentálne nemôžete uložiť. Môžete skopírovať a vložiť
-text do textového súboru a uložiť si ho na neskôr.'''
+takže svoje úpravy momentálne nemôžete uložiť.'''
+Môžete skopírovať a vložiť text do textového súboru a uložiť si ho na neskôr.
 
 Správca, ktorý ju zamkol, uviedol nasledovné vysvetlenie: $1",
 'protectedpagewarning' => "'''Upozornenie: Táto stránka bola zamknutá, takže ju môžu upravovať iba používatelia s oprávnením správcu.''' Dolu je pre informáciu posledná položka zo záznamu:",
@@ -1057,6 +1071,8 @@ Už existuje.',
 'content-failed-to-parse' => 'Nepodarilo sa spracovať obsah $2 pre model $1: $3',
 'invalid-content-data' => 'Neplatné dáta obsahu',
 'content-not-allowed-here' => 'Obsah „$1“ nie je povolený na stránke [[$2]]',
+'editwarning-warning' => 'Ak opustíte túto stránku, môžete tým stratiť všetky vykonané zmeny.
+Ak ste prihlásený, toto upozornenie môžete vypnúť v sekcii „{{int:prefs-editing}}“ svojich nastavení.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1319,7 +1335,7 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'search-interwiki-default' => '$1 výsledkov:',
 'search-interwiki-more' => '(viac)',
 'search-relatedarticle' => 'Súvisiace',
-'mwsuggest-disable' => 'Vypnúť AJAX návrhy',
+'mwsuggest-disable' => 'Vypnúť návrhy vyhľadávania',
 'searcheverything-enable' => 'Vyhľadať vo všetkých menných priestoroch',
 'searchrelated' => 'súvisiace',
 'searchall' => 'všetko',
@@ -1338,15 +1354,7 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'powersearch-togglenone' => 'Žiadne',
 'search-external' => 'Externé vyhľadávanie',
 'searchdisabled' => 'Prepáčte! Fulltextové vyhľadávanie bolo dočasne vypnuté z dôvodu preťaženia. Zatiaľ môžete použiť hľadanie pomocou Google, ktoré však nemusí byť aktuálne.',
-
-# Quickbar
-'qbsettings' => 'Navigačný panel',
-'qbsettings-none' => 'Žiadne',
-'qbsettings-fixedleft' => 'Ukotvené vľavo',
-'qbsettings-fixedright' => 'Ukotvené vpravo',
-'qbsettings-floatingleft' => 'Plávajúce vľavo',
-'qbsettings-floatingright' => 'Plávajúce vpravo',
-'qbsettings-directionality' => 'Pevný, v závislosti na smerovosti písma vášho jazyka',
+'search-error' => 'Pri hľadaní sa vyskytla chyba:$1',
 
 # Preferences page
 'preferences' => 'Nastavenia',
@@ -1427,7 +1435,7 @@ Túto operáciu nemožno vrátiť.',
 'youremail' => 'Váš e-mail²',
 'username' => 'Používateľské meno:',
 'uid' => 'ID používateľa:',
-'prefs-memberingroups' => 'Člen {{PLURAL:$1|skupiny|skupín}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Člen|Členovia}} {{PLURAL:$1|skupiny|skupín}}:',
 'prefs-registration' => 'Čas registrácie:',
 'yourrealname' => 'Skutočné meno *:',
 'yourlanguage' => 'Jazyk:',
@@ -1822,6 +1830,7 @@ Ak problém pretrváva, kontaktujte [[Special:ListUsers/sysop|správcu systému]
 'backend-fail-notsame' => 'Nerovnaký súbor už existuje v $1 .',
 'backend-fail-invalidpath' => '„$1“ nie je platná cesta úložiska.',
 'backend-fail-delete' => 'Nebolo možné vymazať súbor „$1“.',
+'backend-fail-describe' => 'Nie je možné zmeniť metadáta súboru „$1“.',
 'backend-fail-alreadyexists' => 'Súbor „$1“ už existuje.',
 'backend-fail-store' => 'Nebolo možné uložiť súbor „$1“ na „$2“.',
 'backend-fail-copy' => 'Nebolo možné skopírovať súbor „$1“ na „$2“.',
@@ -1899,7 +1908,6 @@ Aby bolo zabezpečenie optimálne, img_auth.php je vypnutý.',
 'http-read-error' => 'Chyba čítania HTTP.',
 'http-timed-out' => 'Vyhradený čas požiadavky HTTP vypršal.',
 'http-curl-error' => 'Chyba pri sťahovaní URL: $1',
-'http-host-unreachable' => 'URL nie je dostupný',
 'http-bad-status' => 'Počas požiadavky HTTP nastal problém: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2051,6 +2059,12 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 Mali by však odkazovať priamo na príslušnú tému.<br />
 Stránka sa považuje za rozlišovaciu, keď používa šablónu, na ktorú odkazuje [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Stránky s vlastnosťou stránky',
+'pageswithprop-legend' => 'Stránky s vlastnosťou stránky',
+'pageswithprop-text' => 'Táto stránka obsahuje stránky, ktoré používajú konkrétnu vlastnosť stránky.',
+'pageswithprop-prop' => 'Názov vlastnosti:',
+'pageswithprop-submit' => 'Vykonať',
+
 'doubleredirects' => 'Dvojité presmerovania',
 'doubleredirectstext' => 'Táto stránka obsahuje zoznam stránok, ktoré presmerovávajú na iné presmerovacie stránky.
 Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riadok z textu na ktorý odkazuje druhé presmerovanie, ktoré zvyčajne odkazuje na „skutočný“ cieľ, na ktorý má odkazovať prvé presmerovanie.
@@ -2203,8 +2217,8 @@ Pozri aj [[Special:WantedCategories|žiadané kategórie]].',
 'linksearch-ns' => 'Menný priestor:',
 'linksearch-ok' => 'Hľadať',
 'linksearch-text' => 'Je možné používať zástupné znaky, napr. „*.wikipedia.org“.
-Povinná je minimálne doména najvyššej úrovne, napr.. „*.org“.<br />
-Podporované protokoly: <code>$1</code> (ak protokol nie je uvedený, použije sa <code>http://</code>).',
+Povinná je minimálne doména najvyššej úrovne, napr. „*.org“.<br />
+{{PLURAL:$2|Podporovaný protokol|Podporované protokoly}}: <code>$1</code> (ak protokol nie je uvedený, použije sa http://).',
 'linksearch-line' => 'Na $1 odkazuje $2',
 'linksearch-error' => 'Zástupné znaky je možné použiť iba na začiatku názvu domény.',
 
@@ -2288,7 +2302,8 @@ Mailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach
 'watchnologin' => 'Nie ste prihlásený/á',
 'watchnologintext' => 'Musíte byť [[Special:UserLogin|prihlásený/á]], aby ste mohli modifikovať vaše sledované stránky.',
 'addwatch' => 'Pridať do zoznamu sledovaných stránok',
-'addedwatchtext' => "Stránka [[:$1]] bola pridaná do zoznamu [[Special:Watchlist|sledovaných stránok]]. Budú tam uvedené ďalšie úpravy tejto stránky a jej diskusie a stránka bude zobrazená '''tučne''' v [[Special:RecentChanges|zozname posledných úprav]], aby ste ju ľahšie našli.",
+'addedwatchtext' => 'Stránka „[[:$1]]“ bola pridaná do vášho zoznamu [[Special:Watchlist|sledovaných stránok]].
+Budú tam uvedené aj budúce úpravy tejto stránky a jej diskusie.',
 'removewatch' => 'Odstrániť zo zoznamu sledovaných',
 'removedwatchtext' => 'Stránka „[[:$1]]“ bola odstránená z vášho [[Special:Watchlist|zoznamu sledovaných stránok]].',
 'watch' => 'Sledovať',
@@ -2299,8 +2314,8 @@ Mailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach
 'notvisiblerev' => 'Revízia bola zmazaná',
 'watchnochange' => 'V rámci zobrazeného času nebola upravená žiadna z vašich sledovaných stránok.',
 'watchlist-details' => '{{PLURAL:$1|Jedna sledovaná stránka|$1 sledované stránky|$1 sledovaných stránok}}, nepočítajúc diskusné stránky.',
-'wlheader-enotif' => 'Upozorňovanie e-mailom je zapnuté.',
-'wlheader-showupdated' => "Stránky, ktoré boli zmené od vašej poslednej návštevy sú zobrazené '''tučne'''.",
+'wlheader-enotif' => 'Upozorňovanie e-mailom je zapnuté.',
+'wlheader-showupdated' => "Stránky, ktoré boli zmené od vašej poslednej návštevy sú zobrazené '''tučne'''.",
 'watchmethod-recent' => 'kontrolujú sa sledované stránky v posledných úpravách',
 'watchmethod-list' => 'kontrolujú posledné úpravy v sledovaných stránkach',
 'watchlistcontains' => 'Váš zoznam sledovaných obsahuje {{PLURAL:$1|jednu stránku|$1 stránky|$1 stránok}}.',
@@ -2317,21 +2332,29 @@ Mailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach
 'enotif_mailer' => 'Upozorňovač {{GRAMMAR:genitív|{{SITENAME}}}}',
 'enotif_reset' => 'Označiť všetky stránky ako „navštívené“',
 'enotif_impersonal_salutation' => 'používateľ {{GRAMMAR:genitív|{{SITENAME}}}}',
+'enotif_subject_deleted' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ odstránil používateľ $2',
+'enotif_subject_created' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ vytvoril používateľ $2',
+'enotif_subject_moved' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ presunul používateľ $2',
+'enotif_subject_restored' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ obnovil používateľ $2',
+'enotif_subject_changed' => 'Stránku {{GENDER:genitív|{{SITENAME}}}} „$1“ zmenil používateľ $2',
+'enotif_body_intro_deleted' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ zmazal $PAGEEDITDATE používateľ $2, pozri $3.',
+'enotif_body_intro_created' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ vytvoril $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.',
+'enotif_body_intro_moved' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ presunul $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.',
+'enotif_body_intro_restored' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ obnovil $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.',
+'enotif_body_intro_changed' => 'Stránka {{GENDER:genitív|{{SITENAME}}}} „$1“ zmenil $PAGEEDITDATE používateľ $2, pozri aktuálnu verziu $3.',
 'enotif_lastvisited' => 'Všetky zmeny od vašej poslednej návštevy uvidíte na $1.',
 'enotif_lastdiff' => 'Zmenu uvidíte v $1.',
 'enotif_anon_editor' => 'anonymný používateľ $1',
 'enotif_body' => 'Drahý $WATCHINGUSERNAME,
 
-na {{GRAMMAR:lokál|{{SITENAME}}}} $CHANGEDORCREATED používateľ $PAGEEDITOR stránku $PAGETITLE, pozrite si aktuálnu verziu $PAGETITLE_URL .
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Zhrnutie redaktora: $PAGESUMMARY $PAGEMINOREDIT
 Kontaktujte používateľa:
 mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Nedostanete ďalšie upozornenia, aj ak bude stránka znovu upravovaná, kým nenavštívite túto stránku.
+Nedostanete ďalšie upozornenia ani v prípade ďalších aktivít na strínke, kým túto stránku nenavštívite.
 Možete tiež vynulovať upozornenia pre všetky vaše sledované stránky.
 
 Váš upozorňovací systém {{GRAMMAR:genitív|{{SITENAME}}}}
@@ -2413,6 +2436,8 @@ Môžete si pozrieť aj [[Special:ProtectedPages|zoznam momentálne platných oc
 'prot_1movedto2' => '[[$1]] premiestnená na [[$2]]',
 'protect-badnamespace-title' => 'Nezamykateľný menný priestor',
 'protect-badnamespace-text' => 'Stránky v tomto mennom priestore nie je možné zamykať.',
+'protect-norestrictiontypes-text' => 'Túto stránku nie je možné chrániť, pretože nie sú k dispozícii žiadne typy obmedzení.',
+'protect-norestrictiontypes-title' => 'Neochrániteľná stránka',
 'protect-legend' => 'Potvrďte zamknutie',
 'protectcomment' => 'Dôvod:',
 'protectexpiry' => 'Zamknuté do:',
@@ -2428,9 +2453,9 @@ Tu sú aktuálne nastavenia stránky '''$1''':",
 Tu sú aktuálne nastavenia stránky '''$1''':",
 'protect-cascadeon' => 'Táto stránka je momentálne zamknutá, lebo je použitá na {{PLURAL:$1|nasledovnej stránke, ktorá má|nasledovných stránkach, ktoré majú}} zapnutú kaskádovú ochranu. Môžete zmeniť úroveň ochrany tejto stránky, ale neovplyvní to kaskádovú ochranu.',
 'protect-default' => 'Povoliť všetkých používateľov',
-'protect-fallback' => 'Vyžadovať povolenie „$1“',
-'protect-level-autoconfirmed' => 'Zablokovať nových a nezaregistrovaných používateľov',
-'protect-level-sysop' => 'Len pre správcov',
+'protect-fallback' => 'Povoliť iba používateľov s oprávnením „$1“',
+'protect-level-autoconfirmed' => 'Povoliť iba používateľov s potvrdeným emailom',
+'protect-level-sysop' => 'Povoliť iba správcov',
 'protect-summary-cascade' => 'kaskáda',
 'protect-expiring' => 'vyprší o $1 (UTC)',
 'protect-expiring-local' => 'vyprší $1',
@@ -3015,17 +3040,11 @@ Umožnuje do zhrnutia pridanie dôvodu.',
 
 # Stylesheets
 'common.css' => '/* Tu umiestnené CSS bude ovplyvňovať všetky štýly */',
-'standard.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Klasický */',
-'nostalgia.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Nostalgia */',
 'cologneblue.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Kolínska modrá */',
 'monobook.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Monobook */',
-'myskin.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Môjvzhľad */',
-'chick.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Kuriatko */',
-'simple.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Jednoduchý */',
 'modern.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Moderný */',
 'vector.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Vector */',
 'print.css' => '/* Tu umiestnené CSS bude ovplyvňovať tlačový výstup */',
-'handheld.css' => '/* Tu umiestnené CSS bude ovplyvňovať prenosné zariadenia vychádzajúceho zo štýlu nastaveného v $wgHandheldStyle */',
 'noscript.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov s vypnutým JavaScriptom */',
 'group-autoconfirmed.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba používateľov s overenou emailovou adresou */',
 'group-bot.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba robotov */',
@@ -3034,13 +3053,8 @@ Umožnuje do zhrnutia pridanie dôvodu.',
 
 # Scripts
 'common.js' => '/* Tu uvedený JavaScript sa nahrá všetkým používateľom pri každom nahraní stránky. */',
-'standard.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Klasický */',
-'nostalgia.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Nostalgia */',
 'cologneblue.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Kolínska modrá */',
 'monobook.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Monobook */',
-'myskin.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Môjvzhľad */',
-'chick.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Kuriatko */',
-'simple.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Jednoduchý */',
 'modern.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Moderný */',
 'vector.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Vector */',
 'group-autoconfirmed.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom s potvrdenou emailovou adresou */',
@@ -3114,13 +3128,8 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 'pageinfo-protect-cascading-from' => 'Zámky pochádzajú z kaskádových zamknutí',
 
 # Skin names
-'skinname-standard' => 'Klasický',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Kolínska modrá',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Môj vzhľad',
-'skinname-chick' => 'Kuriatko',
-'skinname-simple' => 'Jednoduchý',
 'skinname-modern' => 'Moderný',
 'skinname-vector' => 'Vector',
 
@@ -3169,6 +3178,7 @@ Jeho spustením môžete kompromitovať svoj systém.",
 'file-nohires' => 'Nie je dostupné vyššie rozlíšenie.',
 'svg-long-desc' => 'SVG súbor, $1 × $2 pixelov, veľkosť súboru: $3',
 'svg-long-desc-animated' => 'Animovaný súbor SVG, nominálne $1 × $2 pixlov, veľkosť súboru: $3',
+'svg-long-error' => 'Neplatný súbor SVG: $1',
 'show-big-image' => 'Obrázok vo vyššom rozlíšení',
 'show-big-image-preview' => 'Veľkosť tohto náhľadu: $1.',
 'show-big-image-other' => 'Iné {{PLURAL:$2|rozlíšenie|rozlíšenia}}: $1 .',
@@ -3198,9 +3208,24 @@ Jeho spustením môžete kompromitovať svoj systém.",
 'minutes' => '{{PLURAL:$1|$1 minúta|$1 minúty|$1 minút}}',
 'hours' => '{{PLURAL:$1|$1 hodina|$1 hodiny|$1 hodín}}',
 'days' => '{{PLURAL:$1|$1 deň|$1 dni|$1 dní}}',
+'months' => '{{PLURAL:$1|$1 mesiac|$1 mesiace|$1 mesiacov}}',
+'years' => '{{PLURAL:$1|$1 rok|$1 rok|$1 rokov}}',
 'ago' => 'pred: $1',
 'just-now' => 'Pred chvíľkou',
 
+# Human-readable timestamps
+'hours-ago' => 'pred $1 {{PLURAL:$1|hodinou|hodinami}}',
+'minutes-ago' => 'pred $1 {{PLURAL:$1|minútou|minútami}}',
+'seconds-ago' => 'pred $1 {{PLURAL:$1|sekundou|sekundami}}',
+'monday-at' => 'v pondelok o $1',
+'tuesday-at' => 'v utorok o $1',
+'wednesday-at' => 'v stredu o $1',
+'thursday-at' => 'vo štvrtok o $1',
+'friday-at' => 'v piatok o $1',
+'saturday-at' => 'v sobotu o $1',
+'sunday-at' => 'v nedeľu o $1',
+'yesterday-at' => 'včera o $1',
+
 # Bad image list
 'bad_image_list' => 'Formát je nasledovný:
 
@@ -3228,7 +3253,7 @@ Ostatné budú predvolene skryté.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šírka',
 'exif-imagelength' => 'Výška',
 'exif-bitspersample' => 'Bitov na zložku',
@@ -3406,7 +3431,7 @@ Ostatné budú predvolene skryté.
 'exif-originalimageheight' => 'Výška obrázka pred orezaním',
 'exif-originalimagewidth' => 'Šírka obrázka pred orezaním',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Bez kompresie',
 'exif-compression-2' => 'CCITT Group 3 1-rozmerné modifikované Huffmanovo kódovanie RLE',
 'exif-compression-3' => 'CCITT Group 3 faxové kódovanie',
@@ -3828,13 +3853,6 @@ Spolu s týmto programom by ste obdržať [{{SERVER}}{{SCRIPTPATH}}/COPYING kóp
 'version-entrypoints-header-entrypoint' => 'Vstupný bod',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Cesta k súboru',
-'filepath-page' => 'Súbor:',
-'filepath-submit' => 'Vykonať',
-'filepath-summary' => 'Táto špeciálna stránka vráti úplnú cestu k súboru.
-Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v príslušnom priradenom programe.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Hľadať duplicitné súbory',
 'fileduplicatesearch-summary' => 'Hľadanie duplicitných súborov na základe ich haš hodnôt.',
@@ -3861,7 +3879,7 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
 'specialpages-group-highuse' => 'Často používané stránky',
 'specialpages-group-pages' => 'Zoznamy stránok',
 'specialpages-group-pagetools' => 'Nástroje stránky',
-'specialpages-group-wiki' => 'Wiki údaje a nástroje',
+'specialpages-group-wiki' => 'Údaje a nástroje',
 'specialpages-group-redirects' => 'Špeciálne stránky, ktoré sú presmerovania',
 'specialpages-group-spam' => 'Nástroje proti spamu',
 
@@ -3924,22 +3942,24 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
 'htmlform-submit' => 'Odoslať',
 'htmlform-reset' => 'Vrátiť zmeny',
 'htmlform-selectorother-other' => 'Iné',
+'htmlform-no' => 'Nie',
+'htmlform-yes' => 'Áno',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podporou vyhľadávania v plnom texte',
 'sqlite-no-fts' => '$1 bez podpory vyhľadávania v plnom texte',
 
 # New logging system
-'logentry-delete-delete' => '$1 zmazal(a) stránku $3',
-'logentry-delete-restore' => '$1 obnovil(a) stránku $3',
-'logentry-delete-event' => '$1 zmenil viditeľnosť {{PLURAL:$5|protokolovacieho záznamu|$5 protokolovacích záznamov}} k stránke $3: $4',
+'logentry-delete-delete' => '$1 zmazal stránku $3',
+'logentry-delete-restore' => '$1 obnovil stránku $3',
+'logentry-delete-event' => '$1 zmenil viditeľnosť {{PLURAL:$5|záznamu udalostí|$5 záznamov udalostí}} k stránke $3: $4',
 'logentry-delete-revision' => '$1 zmenil viditeľnosť {{PLURAL:$5|revízie|$5 revízií}} na stránke $3: $4',
-'logentry-delete-event-legacy' => '$1 zmenil viditeľnosť protokolovacích záznamov k stránke $3',
+'logentry-delete-event-legacy' => '$1 zmenil viditeľnosť záznamov udalostí k stránke $3',
 'logentry-delete-revision-legacy' => '$1 zmenil viditeľnosť revízií na stránke $3',
 'logentry-suppress-delete' => '$1 utajil stránku $3',
-'logentry-suppress-event' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|protokolovacieho záznamu|$5 protokolovacích záznamov}} k stránke $3: $4',
+'logentry-suppress-event' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|záznamu udalostí|$5 záznamov udalostí}} k stránke $3: $4',
 'logentry-suppress-revision' => '$1 utajene zmenil viditeľnosť {{PLURAL:$5|revízie|$5 revízií}} na stránke $3: $4',
-'logentry-suppress-event-legacy' => '$1 utajene zmenil viditeľnosť protokolovacích záznamov k stránke $3',
+'logentry-suppress-event-legacy' => '$1 utajene zmenil viditeľnosť záznamov udalostí k stránke $3',
 'logentry-suppress-revision-legacy' => '$1 utajene zmenil viditeľnosť revízií na stránke $3',
 'revdelete-content-hid' => 'obsah skrytý',
 'revdelete-summary-hid' => 'zhrnutie editácie skryté',
@@ -3952,16 +3972,17 @@ Obrázky sa zobrazia v plnom rozlíšení, ostatné typy súborov sa spustia v p
 'logentry-move-move' => '$1 premiestnil stránku $3 na $4',
 'logentry-move-move-noredirect' => '$1 premiestnil stránku $3 na $4, ale neponechal presmerovanie',
 'logentry-move-move_redir' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania',
-'logentry-move-move_redir-noredirect' => '$1 premiestnil stránku $3 na $4 prostredníctvom  presmerovania, ale neponechal presmerovanie',
-'logentry-patrol-patrol' => '$1 označil revíziu $4 stránky $3 ako overenú',
-'logentry-patrol-patrol-auto' => '$1 automaticky označil revíziu $4 stránky $3 ako overenú',
+'logentry-move-move_redir-noredirect' => '$1 premiestnil stránku $3 na $4 prostredníctvom presmerovania, ale neponechal presmerovanie',
+'logentry-patrol-patrol' => '$1 označil revíziu $4 stránky $3 ako stráženú',
+'logentry-patrol-patrol-auto' => '$1 automaticky označil revíziu $4 stránky $3 ako stráženú',
 'logentry-newusers-newusers' => 'Bol vytvorený používateľský účet $1',
 'logentry-newusers-create' => 'Bol vytvorený používateľský účet $1',
 'logentry-newusers-create2' => '$1 vytvoril používateľský účet $3',
-'logentry-newusers-autocreate' => 'Automaticky bol založený účet $1',
-'logentry-rights-rights' => '$1 {{GENDER:$2|zmenil|zmenila}} členstvo $3 v skupinách z $4 na $5',
-'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|zmenil|zmenila}} členstvo $3 v skupinách',
-'logentry-rights-autopromote' => '$1 {{GENDER:$2|bol automaticky povýšený|bola automaticky povýšená}} z $4 na $5',
+'logentry-newusers-byemail' => '$1 vytvoril používateľský účet $3 a heslo bolo poslané emailom',
+'logentry-newusers-autocreate' => 'Používateľský účet $1 bol vytvorený automaticky',
+'logentry-rights-rights' => '$1 zmenil členstvo $3 v skupinách z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 zmenil členstvo $3 v skupinách',
+'logentry-rights-autopromote' => '$1 bol automaticky povýšený z $4 na $5',
 'rightsnone' => '(žiadne)',
 
 # Feedback
@@ -4016,6 +4037,7 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 'api-error-ok-but-empty' => 'Vnútorná chyba: Žiadna odpoveď zo servera.',
 'api-error-overwrite' => 'Prepísanie existujúceho súboru nie je povolené.',
 'api-error-stashfailed' => 'Vnútorná chyba: Serveru sa nepodarilo uložiť dočasný súbor.',
+'api-error-publishfailed' => 'Vnútorná chyba: Serveru sa nepodarilo publikovať dočasný súbor.',
 'api-error-timeout' => 'Server neodpovedal v očakávanom čase.',
 'api-error-unclassified' => 'Vyskytla sa neznáma chyba.',
 'api-error-unknown-code' => 'Neznáma chyba: „$1“',
@@ -4036,4 +4058,7 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 'duration-centuries' => '$1 {{PLURAL:$1|storočie|storočia|storočí}}',
 'duration-millennia' => '$1 {{PLURAL:$1|tisícročie|tisícročia|tisícročí}}',
 
+# Image rotation
+'rotate-comment' => 'Obrázok otočený o $1 {{PLURAL:$1|stupeň|stupne|stupňov}} v smere hodinových ručičiek',
+
 );
index 726b025..b7869a6 100644 (file)
@@ -12,6 +12,7 @@
  * @author Freakolowsky
  * @author Irena Plahuta
  * @author McDutchie
+ * @author Nemo bis
  * @author Smihael
  * @author Vadgt
  * @author XJamRastafire
@@ -195,7 +196,7 @@ $messages = array(
 '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 (zahteva JavaScript)',
 'tog-numberheadings' => 'Samodejno številči poglavja',
-'tog-showtoolbar' => 'Prikaži urejevalno orodno vrstico',
+'tog-showtoolbar' => 'Prikaži urejevalno orodno vrstico (potrebuje JavaScript)',
 'tog-editondblclick' => 'Omogoči urejanje strani z dvojnim klikom (zahteva JavaScript)',
 'tog-editsection' => 'Omogoči urejanje delov prek povezav [{{int:editsection}}]',
 'tog-editsectiononrightclick' => 'Omogoči urejanje razdelkov z desnim klikanjem njihovih naslovov (zahteva JavaScript)',
@@ -206,7 +207,7 @@ $messages = array(
 'tog-watchmoves' => 'Dodaj strani in datoteke, ki jih premaknem, na moj spisek nadzorov',
 'tog-watchdeletion' => 'Dodaj strani in datoteke, ki jih izbrišem, na moj spisek nadzorov',
 'tog-minordefault' => 'Vsa urejanja označi kot manjša',
-'tog-previewontop' => 'Prikaži predogled pred urejevalnim poljem in ne za njim',
+'tog-previewontop' => 'Prikaži predogled pred urejevalnim poljem',
 'tog-previewonfirst' => 'Ob začetku urejanja prikaži predogled',
 'tog-nocache' => 'Onemogoči predpomnenje strani v brskalniku',
 'tog-enotifwatchlistpages' => 'Ob spremembah strani ali datotek mi pošlji e-pošto',
@@ -216,28 +217,27 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži število uporabnikov, ki spremljajo temo',
 'tog-oldsig' => 'Obstoječi podpis:',
 'tog-fancysig' => 'Obravnavaj podpis kot wikibesedilo (brez samodejne povezave)',
-'tog-externaleditor' => 'Po privzetem uporabljaj zunanji urejevalnik (samo za strokovnjake; potrebuje posebne nastavitve na vašem računalniku; [//www.mediawiki.org/wiki/Manual:External_editors več informacij])',
-'tog-externaldiff' => 'Po privzetem uporabljaj zunanje primerjanje (samo za strokovnjake; potrebuje posebne nastavitve na vašem računalniku; [//www.mediawiki.org/wiki/Manual:External_editors več informacij])',
 'tog-showjumplinks' => 'Prikaži pomožni povezavi »Skoči na«',
 'tog-uselivepreview' => 'Uporabi hitri predogled (zahteva JavaScript) (preizkusno)',
 'tog-forceeditsummary' => 'Ob vpisu praznega povzetka urejanja me opozori',
 'tog-watchlisthideown' => 'Na spisku nadzorov skrij moja urejanja',
 'tog-watchlisthidebots' => 'Na spisku nadzorov skrij urejanja botov',
-'tog-watchlisthideminor' => 'Skrij manjša urejanja na spisku nadzorov',
+'tog-watchlisthideminor' => 'Na spisku nadzorov skrij manjša urejanja',
 'tog-watchlisthideliu' => 'Skrij urejanja prijavljenih uporabnikov na spisku nadzorov',
 'tog-watchlisthideanons' => 'Skrij urejanja anonimnih uporabnikov na spisku nadzorov',
-'tog-watchlisthidepatrolled' => 'Skrij pregledana urejanja s spiska nadzorov',
+'tog-watchlisthidepatrolled' => 'Na spisku nadzorov skrij pregledana urejanja',
 'tog-ccmeonemails' => 'Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom',
-'tog-diffonly' => 'Ne prikaži vsebine strani pod primerjavo',
+'tog-diffonly' => 'Pod primerjavo ne prikaži vsebine strani',
 'tog-showhiddencats' => 'Prikaži skrite kategorije',
 'tog-norollbackdiff' => 'Ne prikaži primerjave po izvedeni vrnitvi',
+'tog-useeditwarning' => 'Opozori me, ko skušam zapreti urejevalno polje z neshranjenimi spremembami',
 
 'underline-always' => 'Vedno',
 'underline-never' => 'Nikoli',
 'underline-default' => 'Koža ali privzeto v brskalniku',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Uredi področni slog pisave:',
+'editfont-style' => 'Slog pisave urejevalnega polja:',
 'editfont-default' => 'Privzeto po brskalniku',
 'editfont-monospace' => 'Pisava monospace',
 'editfont-sansserif' => 'Pisava sans-serif',
@@ -294,13 +294,25 @@ $messages = array(
 'oct' => 'okt.',
 'nov' => 'nov.',
 'dec' => 'dec.',
+'january-date' => '$1. januar',
+'february-date' => '$1. februar',
+'march-date' => '$1. marec',
+'april-date' => '$1. april',
+'may-date' => '$1. maj',
+'june-date' => '$1. junij',
+'july-date' => '$1. julij',
+'august-date' => '$1. avgust',
+'september-date' => '$1. september',
+'october-date' => '$1. oktober',
+'november-date' => '$1. november',
+'december-date' => '$1. december',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji|Kategorije|Kategorije|Kategorije}}',
+'pagecategories' => '{{PLURAL:$1|Kategorija|Kategoriji|Kategorije}}',
 'category_header' => 'Strani v kategoriji »$1«',
 'subcategories' => 'Podkategorije',
 'category-media-header' => 'Predstavnostno gradivo v kategoriji »$1«',
-'category-empty' => "''Ta kategorija trenutno ne vsebuje člankov ali drugega gradiva.''",
+'category-empty' => "''Kategorija trenutno ne vsebuje strani ali drugega gradiva.''",
 'hidden-categories' => '{{PLURAL:$1|Skrita kategorija|Skriti kategoriji|Skrite kategorije}}',
 'hidden-category-category' => 'Skrite kategorije',
 'category-subcat-count' => 'Ta del kategorije ima $1 {{PLURAL:$1|naslednjo podkategorijo|naslednji podkategoriji|naslednje podkategorije|naslednjih podkategorij}}{{PLURAL:$2||, od skupno $2}}.',
@@ -322,7 +334,7 @@ $messages = array(
 'morenotlisted' => 'Več ni navedenih ...',
 'mypage' => 'Stran',
 'mytalk' => 'Pogovor',
-'anontalk' => 'Pogovorna stran IP',
+'anontalk' => 'Pogovorna stran IP-naslova',
 'navigation' => 'Navigacija',
 'and' => '&#32;in',
 
@@ -331,7 +343,7 @@ $messages = array(
 'qbbrowse' => 'Prebrskaj',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Možnosti strani',
-'qbmyoptions' => 'Moje možnosti',
+'qbmyoptions' => 'Moje strani',
 'qbspecialpages' => 'Posebne strani',
 'faq' => 'Najpogostejša vprašanja',
 'faqpage' => 'Project:Najpogostejša vprašanja',
@@ -363,7 +375,7 @@ $messages = array(
 'go' => 'Pojdi na',
 'searcharticle' => 'Pojdi na',
 'history' => 'Zgodovina strani',
-'history_short' => 'Zgodovina strani',
+'history_short' => 'Zgodovina',
 'updatedmarker' => 'Posodobljeno od mojega zadnjega obiska',
 'printableversion' => 'Različica za tisk',
 'permalink' => 'Trajna povezava',
@@ -372,7 +384,7 @@ $messages = array(
 'edit' => 'Uredi stran',
 'create' => 'Ustvari',
 'editthispage' => 'Uredi stran',
-'create-this-page' => 'Ustvari to stran',
+'create-this-page' => 'Ustvari stran',
 'delete' => 'Briši',
 'deletethispage' => 'Briši stran',
 'undelete_short' => 'Vrni $1 {{PLURAL:$1|izbrisano urejanje|izbrisani urejanji|izbrisana urejanja|izbrisanih urejanj|izbrisanih urejanj}}',
@@ -401,7 +413,7 @@ $messages = array(
 'categorypage' => 'Prikaži stran kategorije',
 'viewtalkpage' => '< Pogovor',
 'otherlanguages' => 'V drugih jezikih',
-'redirectedfrom' => '(Preusmerjeno z $1)',
+'redirectedfrom' => '(Preusmerjeno s strani $1)',
 'redirectpagesub' => 'Preusmeritvena stran',
 'lastmodifiedat' => 'Čas zadnje spremembe: $2, $1.',
 'viewcount' => 'Stran je bila naložena {{PLURAL:$1|$1-krat}}.',
@@ -604,9 +616,18 @@ Morda bodo nekatere strani še naprej prikazane, kot da ste prijavljeni, dokler
 'welcomecreation-msg' => 'Ustvarili ste račun.
 Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rodilnik|{{SITENAME}}}}]].',
 'yourname' => 'Uporabniško ime:',
+'userlogin-yourname' => 'Uporabniško ime',
+'userlogin-yourname-ph' => 'Vnesite svoje uporabniško ime',
 'yourpassword' => 'Geslo:',
+'userlogin-yourpassword' => 'Geslo',
+'userlogin-yourpassword-ph' => 'Vnesite svoje geslo',
+'createacct-yourpassword-ph' => 'Vnesite geslo',
 'yourpasswordagain' => 'Ponovno vpišite geslo',
+'createacct-yourpasswordagain' => 'Potrdite geslo',
+'createacct-yourpasswordagain-ph' => 'Ponovno vnesite geslo',
 'remembermypassword' => 'Zapomni si me na tem računalniku (za največ $1 {{PLURAL:$1|dan|dneva|dni}})',
+'userlogin-remembermypassword' => 'Zapomni si me',
+'userlogin-signwithsecure' => 'Uporabi varno povezavo',
 'securelogin-stick-https' => 'Po prijavi ostani povezan preko HTTPS',
 'yourdomainname' => 'Domena',
 'password-change-forbidden' => 'Na tem wikiju ne morete spreminjati gesel.',
@@ -619,18 +640,38 @@ Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rod
 'logout' => 'Odjava',
 'userlogout' => 'Odjava',
 'notloggedin' => 'Niste prijavljeni',
+'userlogin-noaccount' => 'Nimate uporabniškega računa?',
+'userlogin-joinproject' => 'Pridružite se {{GRAMMAR:dajalnik|{{SITENAME}}}}',
 'nologin' => 'Še nimate uporabniškega računa? $1!',
 'nologinlink' => 'Registrirajte se',
 'createaccount' => 'Ustvari račun',
 'gotaccount' => 'Račun že imate? $1.',
 'gotaccountlink' => 'Prijavite se',
 'userlogin-resetlink' => 'Ste pozabili svoje prijavne podatke?',
+'userlogin-resetpassword-link' => 'Ponastavite svoje geslo',
+'helplogin-url' => 'Help:Prijava',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoč pri prijavi]]',
+'createacct-join' => 'Spodaj vnesite svoje informacije.',
+'createacct-emailrequired' => 'E-poštni naslov',
+'createacct-emailoptional' => 'E-poštni naslov (izbirno)',
+'createacct-email-ph' => 'Vnesite svoj e-poštni naslov',
 'createaccountmail' => 'Ustvari začasno naključno geslo in ga pošlji na spodaj navedeni e-poštni naslov',
+'createacct-realname' => 'Pravo ime (izbirno)',
 '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-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.',
 'userexists' => 'Uporabniško ime, ki ste ga vnesli, je že zasedeno.
 Prosimo, izberite drugo.',
 'loginerror' => 'Napaka ob prijavi',
+'createacct-error' => 'Napaka pri ustvarjanju računa',
 'createaccounterror' => 'Ne morem ustvariti računa: $1',
 'nocookiesnew' => 'Uporabniški račun je ustvarjen, vendar niste prijavljeni.
 {{SITENAME}} za prijavo uporabnikov uporablja piškotke, ki pa so pri vas onemogočeni.
@@ -641,7 +682,7 @@ Ker jih imate onemogočene, vas prosimo, da jih omogočite in se ponovno prijavi
 Poskrbite, da imate omogočene piškotke, osvežite to stran in poskusite znova.',
 'noname' => 'Niste vnesli veljavnega uporabniškega imena.',
 'loginsuccesstitle' => 'Uspešno ste se prijavili',
-'loginsuccess' => "'''Sedaj ste prijavljeni v {{GRAMMAR:tožilnik|{{SITENAME}}}} kot »$1«.'''",
+'loginsuccess' => "'''Zdaj ste prijavljeni v {{GRAMMAR:tožilnik|{{SITENAME}}}} kot »$1«.'''",
 'nosuchuser' => 'Uporabnik z imenom »$1« ne obstaja.
 Uporabniška imena so občutljiva na velikost črk.
 Preverite črkovanje ali pa si [[Special:UserLogin/signup|ustvarite nov uporabniški račun]].',
@@ -725,13 +766,13 @@ Za zaključitev prijave, morate tukaj nastaviti novo geslo:',
 'resetpass-wrong-oldpass' => 'Neveljavno začano ali trenutno geslo.
 Morda ste že uspešno spremenili geslo ali pa ste zahtevali novo začasno geslo.',
 'resetpass-temp-password' => 'Začasno geslo:',
+'resetpass-abort-generic' => 'Razširitev je prekinila spremembo gesla.',
 
 # Special:PasswordReset
 'passwordreset' => 'Ponastavitev gesla',
-'passwordreset-text' => 'Izpolnite obrazec, da ponastavite geslo.',
 'passwordreset-legend' => 'Ponastavitev gesla',
 'passwordreset-disabled' => 'Ponastavljanje gesla je na tem wikiju onemogočeno.',
-'passwordreset-pretext' => '{{PLURAL:$1||Vnesite enega od dela podatkov spodaj}}',
+'passwordreset-emaildisabled' => 'Na tem wikiju so možnosti e-pošte onemogočene.',
 'passwordreset-username' => 'Uporabniško ime:',
 'passwordreset-domain' => 'Domena:',
 'passwordreset-capture' => 'Ogled nastale e-pošte?',
@@ -745,7 +786,7 @@ gesla na {{SITENAME}} ($4). S tem e-poštnim naslovom
 $2
 
 {{PLURAL:$3|Začasno geslo bo poteklo|Začasni gesli bosta potekli|Začasna gesla bodo potekla}} v {{PLURAL:$5|enem dnevu|$5 dneh}}.
-Prijavite se in izberite novo geslo sedaj. Če je zahtevo podal
+Prijavite se in izberite novo geslo. Če je zahtevo podal
 nekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga več
 ne želite spremeniti, lahko to sporočilo prezrete in nadaljujete z uporabo
 svojega starega gesla.',
@@ -763,7 +804,7 @@ svojega starega gesla.',
 Začasno geslo: $2',
 'passwordreset-emailsent' => 'Poslali smo 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 uporabniku ni uspelo: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Sprememba e-poštnega naslova',
@@ -978,6 +1019,8 @@ Izgleda, da je bila izbrisana.',
 'content-failed-to-parse' => 'Nisem mogel razčleniti vsebine $2 za obliko $1: $3',
 'invalid-content-data' => 'Neveljavni podatki vsebine',
 'content-not-allowed-here' => 'Vsebina »$1« ni dovoljena na strani [[$2]]',
+'editwarning-warning' => 'Če zapustite stran, boste morda izgubili vse spremembe, ki ste jih naredili.
+Če ste prijavljeni, lahko to opozorilo onemogočite v razdelku »{{int:prefs-editing}}« v svojih nastavitvah.',
 
 # Content models
 'content-model-wikitext' => 'wikibesedilo',
@@ -1263,15 +1306,7 @@ Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'searchdisabled' => 'Iskanje po {{GRAMMAR:dajalnik|{{SITENAME}}}} je onemogoočeno.
 Medtem lahko iščete preko Googla.
 Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} morda zastareli.',
-
-# Quickbar
-'qbsettings' => 'Nastavitve hitre vrstice',
-'qbsettings-none' => 'Brez',
-'qbsettings-fixedleft' => 'Levo nepomično',
-'qbsettings-fixedright' => 'Desno nepomično',
-'qbsettings-floatingleft' => 'Levo leteče',
-'qbsettings-floatingright' => 'Desno leteče',
-'qbsettings-directionality' => 'Stalno, odvisno od usmerjenosti pisave vašega jezika',
+'search-error' => 'Med iskanjem je prišlo do napake: $1',
 
 # Preferences page
 'preferences' => 'Nastavitve',
@@ -1418,6 +1453,7 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'userrights-notallowed' => 'Vaš račun nima dovoljenja za dodajanje ali odstranjevanje uporabniških pravic.',
 'userrights-changeable-col' => 'Skupine, ki jih lahko spremenite',
 'userrights-unchangeable-col' => 'Skupine, ki jih ne morete spremeniti',
+'userrights-conflict' => 'Spor uporabniških pravic! Prosimo, da ponovno uveljavite svoje spremembe.',
 
 # Groups
 'group' => 'Skupina:',
@@ -1838,7 +1874,6 @@ Za optimalno varnost je img_auth.php onemogočen.',
 'http-read-error' => 'Napaka branja HTTP.',
 'http-timed-out' => 'Zahteva HTTP je potekla.',
 'http-curl-error' => 'Napaka pri doseganju URL: $1',
-'http-host-unreachable' => 'Ni mogoče doseči URL.',
 'http-bad-status' => 'Med zahtevo HTTP je prišlo do težave: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1874,7 +1909,7 @@ Ko so rezultati filtrirani po uporabniku, so prikazane samo datoteke, pri kateri
 # File description page
 'file-anchor-link' => 'Datoteka',
 'filehist' => 'Zgodovina datoteke',
-'filehist-help' => 'Kliknite na datum in čas za ogled datoteke, ki je bila takrat naložena.',
+'filehist-help' => 'Kliknite datum in čas za ogled datoteke, ki je bila takrat naložena.',
 'filehist-deleteall' => 'izbriši vse',
 'filehist-deleteone' => 'izbriši to',
 'filehist-revert' => 'vrni',
@@ -2253,8 +2288,8 @@ Morebitne spremembe te strani in pripadajoče pogovorne strani bodo navedene tuk
 'notvisiblerev' => 'Redakcija je bila izbrisana',
 'watchnochange' => 'V prikazanem časovnem obdobju ni nihče spremenil nadzorovanih strani.',
 'watchlist-details' => 'Spremljate $1 {{PLURAL:$1|stran|strani|strani|strani|strani}} (pogovorne strani niso vštete).',
-'wlheader-enotif' => 'Obveščanje po elektronski pošti je omogočeno.',
-'wlheader-showupdated' => "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
+'wlheader-enotif' => 'Obveščanje po elektronski pošti je omogočeno.',
+'wlheader-showupdated' => "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
 'watchmethod-recent' => 'med nedavnimi urejanji iščem spremljane strani',
 'watchmethod-list' => 'med spremljanimi stranmi iščem nedavna urejanja',
 'watchlistcontains' => 'Spremljate $1 {{PLURAL:$1|stran|strani}}.',
@@ -2408,7 +2443,7 @@ Stopnjo zaščite te strani lahko spremenite, vendar to ne bo vplivalo na kaskad
 'protect-expiring-local' => 'poteče $1',
 'protect-expiry-indefinite' => 'nedoločeno',
 'protect-cascade' => 'Zaščiti strani, ki so vključene v to stran (kaskadna zaščita)',
-'protect-cantedit' => 'Ne morete spreminjati stopnje zaščite te strani, ker nimate dovoljenja za njeno urejanje.',
+'protect-cantedit' => 'Stopnje zaščite te strani ne morete spreminjati, ker nimate dovoljenja za njeno urejanje.',
 'protect-othertime' => 'Drugačen čas:',
 'protect-othertime-op' => 'drugačen čas',
 'protect-existing-expiry' => 'Obstoječ čas izteka: $3, $2',
@@ -2672,6 +2707,7 @@ Gre za resno varnostno težavo, o kateri obvestite svojega internetnega ponudnik
 'sorbsreason' => 'Vaš IP-naslov je v DNSBL uvrščen med odprte posredniške strežnike.',
 'sorbs_create_account_reason' => 'Vaš IP-naslov je v DNSBL, ki ga uporablja {{GRAMMAR:tožilnik|{{SITENAME}}}}, naveden kot odprti posredniški strežnik (proxy).
 Računa žal ne morete ustvariti.',
+'xffblockreason' => 'IP-naslov, prisoten v glavi X-Forwarded-For, ali vaš ali od strežnika proxy, ki ga uporabljate, je blokiran. Izvirni razlog za blokado: $1',
 'cant-block-while-blocked' => 'Ne morete blokirati drugih uporabnikove, medtem ko ste sami blokirani.',
 'cant-see-hidden-user' => 'Uporabnik, ki ga poskušate blokirate, je že blokiran in skrit.
 Ker nimate pravice hideuser, si ne morete ogledati ali urejati uporabnikove blokade.',
@@ -2838,6 +2874,8 @@ Za lokalizacijo in prevajanje obiščite [//www.mediawiki.org/wiki/Localisation
 'thumbnail-more' => 'Povečaj',
 'filemissing' => 'Datoteka manjka',
 'thumbnail_error' => 'Napaka pri izdelavi sličice: $1',
+'thumbnail_error_remote' => 'Sporočilo o napaki od $1:
+$2',
 'djvu_page_error' => 'Stran DjVu je izven območja',
 'djvu_no_xml' => 'Ni mogoče pridobiti XML za datoteko DjVu',
 'thumbnail-temp-create' => 'Ne morem ustvariti začasne datoteke sličice',
@@ -3140,11 +3178,25 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
 'minutes' => '$1 {{PLURAL:$1|minuta|minuti|minute|minut}}',
 'hours' => '$1 {{PLURAL:$1|ura|uri|ure|ur}}',
 'days' => '$1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
+'weeks' => '$1 {{PLURAL:$1|teden|tedna|tedni|tednov}}',
 'months' => '$1 {{PLURAL:$1|mesec|meseca|mesece|mesecev}}',
 'years' => '$1 {{PLURAL:$1|leto|leti|leta|let}}',
 'ago' => 'pred $1',
 'just-now' => 'pravkar',
 
+# Human-readable timestamps
+'hours-ago' => 'pred $1 {{PLURAL:$1|uro|urama|urami}}',
+'minutes-ago' => 'pred $1 {{PLURAL:$1|minuto|minutama|minutami}}',
+'seconds-ago' => 'pred $1 {{PLURAL:$1|sekundo|sekundama|sekundami}}',
+'monday-at' => 'Ponedeljek ob $1',
+'tuesday-at' => 'Torek ob $1',
+'wednesday-at' => 'Sreda ob $1',
+'thursday-at' => 'Četrtek ob $1',
+'friday-at' => 'Petek ob $1',
+'saturday-at' => 'Sobota ob $1',
+'sunday-at' => 'Nedelja ob $1',
+'yesterday-at' => 'Včeraj ob $1',
+
 # Bad image list
 'bad_image_list' => 'Oblika je naslednja:
 
@@ -3173,7 +3225,7 @@ Druga bodo po privzetem skrita.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Višina',
 'exif-bitspersample' => 'Bitov na barvni gradnik',
@@ -3351,7 +3403,7 @@ Druga bodo po privzetem skrita.
 'exif-originalimageheight' => 'Višina slike, preden je bila obrezana',
 'exif-originalimagewidth' => 'Širina slike, preden je bila obrezana',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nestisnjeno',
 'exif-compression-2' => 'Kodiranje CCITT skupina 3 1-razsežnostna spremenjena dolžina teka Huffman',
 'exif-compression-3' => 'Kodiranje CCITT skupina 3 faks',
@@ -3775,14 +3827,17 @@ Skupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Pot članka]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Pot skripta]',
 
-# Special:FilePath
-'filepath' => 'Pot do datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Pojdi',
-'filepath-summary' => 'Ta posebna stran vrne polno pot do datoteke.
-Slike so prikazane v polni ločljivosti, druge vrste datotek pa se zaženejo v zanje določenih programih.
-
-Vnesite ime datoteke brez predpone »{{ns:file}}:«.',
+# Special:Redirect
+'redirect' => 'Preusmeri po datoteki, uporabniku ali ID-ju redakcije',
+'redirect-legend' => 'Preusmeritev na datoteko ali stran',
+'redirect-summary' => 'Posebna stran preusmeri na datoteko (če podate ime datoteke), stran (če podate ID redakcije) ali uporabniško stran (če podatek številski ID uporabnika).',
+'redirect-submit' => 'Pojdi',
+'redirect-lookup' => 'Iskanje:',
+'redirect-value' => 'Vrednost:',
+'redirect-user' => 'ID uporabnika',
+'redirect-revision' => 'Redakcija strani',
+'redirect-file' => 'Ime datoteke',
+'redirect-not-exists' => 'Vrednosti ni mogoče najti',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Iskanje podvojenih datotek',
@@ -3874,23 +3929,26 @@ Ta stran se sooča s tehničnimi težavami.',
 'htmlform-submit' => 'Pošlji',
 'htmlform-reset' => 'Razveljavi spremembe',
 'htmlform-selectorother-other' => 'Drugo',
+'htmlform-no' => 'Ne',
+'htmlform-yes' => 'Da',
+'htmlform-chosen-placeholder' => 'Izberite možnost',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 s podporo iskanju polnih besedil',
 'sqlite-no-fts' => '$1 brez podpore iskanju polnih besedil',
 
 # New logging system
-'logentry-delete-delete' => '$1 je izbrisal(-a) stran $3',
-'logentry-delete-restore' => '$1 je obnovil(-a) stran $3',
-'logentry-delete-event' => '$1 je spremenil(-a) vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
-'logentry-delete-revision' => '$1 je spremenil(-a) vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
-'logentry-delete-event-legacy' => '$1 je spremenil(-a) vidljivost dnevniških dogodkov na $3',
-'logentry-delete-revision-legacy' => '$1 je spremenil(-a) vidljivost redakcij na strani $3',
-'logentry-suppress-delete' => '$1 je zatrl(-a) stran $3',
-'logentry-suppress-event' => '$1 je skrivaj spremenil(-a) vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
-'logentry-suppress-revision' => '$1 je skrivaj spremenil(-a) vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
-'logentry-suppress-event-legacy' => '$1 je skrivaj spremenil(-a) vidljivost dnevniških dogodkov na $3',
-'logentry-suppress-revision-legacy' => '$1 je skrivaj spremenil(-a) vidljivost redakcij na strani $3',
+'logentry-delete-delete' => '$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3',
+'logentry-delete-restore' => '$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3',
+'logentry-delete-event' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
+'logentry-delete-revision' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
+'logentry-delete-event-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3',
+'logentry-delete-revision-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost redakcij na strani $3',
+'logentry-suppress-delete' => '$1 je {{GENDER:$2|zatrl|zatrla|zatrl(-a)}} stran $3',
+'logentry-suppress-event' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4',
+'logentry-suppress-revision' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4',
+'logentry-suppress-event-legacy' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3',
+'logentry-suppress-revision-legacy' => '$1 je skrivaj {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost redakcij na strani $3',
 'revdelete-content-hid' => 'vsebina je skrita',
 'revdelete-summary-hid' => 'povzetek urejanja je skrit',
 'revdelete-uname-hid' => 'uporabniško ime je skrito',
@@ -3899,20 +3957,20 @@ Ta stran se sooča s tehničnimi težavami.',
 'revdelete-uname-unhid' => 'uporabniško ime je ponovno prikazano',
 'revdelete-restricted' => 'uveljavljene omejitve administratorjev',
 'revdelete-unrestricted' => 'odstranjene omejitve administratorjev',
-'logentry-move-move' => '$1 je premaknil(-a) stran $3 na $4',
-'logentry-move-move-noredirect' => '$1 je premaknil(-a) stran $3 na $4 brez preusmeritve',
-'logentry-move-move_redir' => '$1 je premaknil(-a) stran $3 na $4 prek preusmeritve',
-'logentry-move-move_redir-noredirect' => '$1 je premaknil(-a) stran $3 na $4 prek preusmeritve in brez preusmeritve',
-'logentry-patrol-patrol' => '$1 je označil(-a) redakcijo $4 strani $3 kot nadzorovano',
-'logentry-patrol-patrol-auto' => '$1 je samodejno označil(-a) redakcijo $4 strani $3 kot nadzorovano',
-'logentry-newusers-newusers' => '$1 je ustvaril(-a) uporabniški račun',
-'logentry-newusers-create' => '$1 je ustvaril(-a) uporabniški račun',
-'logentry-newusers-create2' => '$1 je ustvaril(-a) uporabniški račun $3',
+'logentry-move-move' => '$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4',
+'logentry-move-move-noredirect' => '$1 je {{GENDER:$2|prestavil|prestavila|prestavil(-a)}} stran $3 na $4 brez preusmeritve',
+'logentry-move-move_redir' => '$1 je {{GENDER:$2|prestavil|prestavila|prestavil(-a)}} stran $3 na $4 prek preusmeritve',
+'logentry-move-move_redir-noredirect' => '$1 je {{GENDER:$2|prestavil|prestavila|prestavil(-a)}} stran $3 na $4 prek preusmeritve in brez preusmeritve',
+'logentry-patrol-patrol' => '$1 je {{GENDER:$2|označil|označila|označil(-a)}} redakcijo $4 strani $3 kot nadzorovano',
+'logentry-patrol-patrol-auto' => '$1 je samodejno {{GENDER:$2|označil|označila|označil(-a)}} redakcijo $4 strani $3 kot nadzorovano',
+'logentry-newusers-newusers' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun',
+'logentry-newusers-create' => '$1 je {{GENDER:$2|ustvaril|ustvarila|ustvaril(-a)}} uporabniški račun',
+'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 ustvarjen',
-'logentry-rights-rights' => '$1 je spremenil(-a) članstvo skupine $3 z $4 na $5',
-'logentry-rights-rights-legacy' => '$1 je spremenil(-a) članstvo skupine $3',
-'logentry-rights-autopromote' => '$1 je bil(-a) samodejno povišan(-a) z $4 na $5',
+'logentry-newusers-autocreate' => 'Račun $1 je bil samodejno {{GENDER:$2|ustvarjen}}',
+'logentry-rights-rights' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} članstvo skupine $3 z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} članstvo skupine $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',
 'rightsnone' => '(nobeno)',
 
 # Feedback
index fbcf663..c60c2b8 100644 (file)
@@ -54,8 +54,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Oazoahl derr beobachtenden Nutzer oazäan',
 'tog-oldsig' => 'Vorschau der aktuella Signatur:',
 'tog-fancysig' => 'Signatur ols Wikitext behandeln (ohne automatische Verlinkung)',
-'tog-externaleditor' => "Extern'n Editor als Standard benutza (nur fier Experta, is missa spezielle Einstellungen uff dam eegenen Rechner vurgenumma warn)",
-'tog-externaldiff' => 'Externes Diff-Programm als Standard benutza (nur fier Experta, is missa spezielle Einstellungen uff dam eegenen Rechner vurgenumma warn)',
 'tog-showjumplinks' => '„Wechseln zu“-Verknipfunga aktiviern',
 'tog-uselivepreview' => 'Direkte Vurschau notza (beneetigt JavaScript) (vrsuchsweise)',
 'tog-forceeditsummary' => 'Warnen, wenn bem Speichern de Zsoammafassung fahln tutt',
@@ -807,10 +805,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'powersearch-togglenone' => 'Kenne',
 'searchdisabled' => 'De {{SITENAME}}-Suche ies deaktiviert. Du koast underdessa miet Google sucha. Bitte bedenke, doaß der Suchindex fier {{SITENAME}} veraltet sei koan.',
 
-# Quickbar
-'qbsettings' => 'Seytaleiste',
-'qbsettings-none' => 'Keene',
-
 # Preferences page
 'preferences' => 'Eenstellunga',
 'mypreferences' => 'Meene Eistellunga',
@@ -1416,8 +1410,8 @@ Wenn du de Seite wieder vu denner Beobachtungsliste entferna mechtest, klicke uf
 'notanarticle' => 'Keene Seite',
 'watchnochange' => 'Kenne dar vu dir beobachteta Seyta wurde während des oagezeigta Zeitraums beoarbeetet.',
 'watchlist-details' => 'Du beobachtest {{PLURAL:$1|1 Seite|$1 Seita}}.',
-'wlheader-enotif' => 'Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.',
-'wlheader-showupdated' => "Seyta miet noo ne gesehenen Änderunga waan '''fett''' dargestellt.",
+'wlheader-enotif' => 'Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.',
+'wlheader-showupdated' => "Seyta miet noo ne gesehenen Änderunga waan '''fett''' dargestellt.",
 'watchmethod-recent' => 'Ieberprifa dar letzta Beoarbeetunga fier de Beobachtungsliste',
 'watchmethod-list' => 'Ieberpriefa dar Beobachtungsliste noach letzta Beoarbeetunga',
 'watchlistcontains' => 'Denne Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seita}}.',
@@ -2046,7 +2040,7 @@ Weitere werden standardmäßig nicht angezeigt.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagelength' => 'Länge',
 'exif-bitspersample' => 'Bits pro Forbkomponente',
 'exif-compression' => 'Oart dar Kompression',
@@ -2298,12 +2292,6 @@ Du koast au de [[Special:EditWatchlist|Standard-Beoarbeetungsseyte]] benutza.',
 'version-hook-name' => 'Schnittstallanoame',
 'version-hook-subscribedby' => 'Uffruff vu',
 
-# Special:FilePath
-'filepath-submit' => 'Pfad sucha',
-'filepath-summary' => 'Miet dieser Spezialseyte lässt siech dar komplette Pfad dar aktuella Version einer Datei ohne Umweg obfroaga. De oagefroagte Datei werd direkt dargestallt bzw. miet der verkniepfta Oawendung gestartet.
-
-De Eengabe muuß ohne dann Zusatz „{{ns:file}}:“ erfolga.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-summary' => 'Suche noach Dateiduplikaten uff Basis ihres Hashwertes.',
 'fileduplicatesearch-legend' => 'Suche noach Duplikata',
index 13ebdf5..42fa0c0 100644 (file)
@@ -533,7 +533,7 @@ Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge s
 # Special:ListUsers
 'listusers-submit' => 'Vuesehte',
 
-# E-mail user
+# Email user
 'emailuser' => 'E-påaste dïhte nuhtjien',
 'emailpage' => 'E-påaste nuhtjien',
 'defemailsubject' => '{{SITENAME}} e-påaste',
@@ -558,7 +558,6 @@ Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge s
 'watching' => 'Sïektjeminie...',
 'unwatching' => 'Ov-sïektjedh...',
 
-'enotif_newpagetext' => 'Dïhte lea orre bielie.',
 'enotif_impersonal_salutation' => '{{SITENAME}} nuhtjien',
 'created' => 'skaepede',
 
@@ -789,7 +788,7 @@ Jeatjebh dajveh lea gaptjedh goh sïejhme, bine vuesehte gåessie taabelle stoer
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Gamte',
 'exif-imagelength' => 'Gåhkoe',
 'exif-model' => 'Guvviedahke hammohke',
index 1a9216a..d0ffe71 100644 (file)
@@ -44,8 +44,6 @@ $messages = array(
 'tog-shownumberswatching' => "I'tus tirada isticmaalayaasha wax waardiyeynaayo",
 'tog-oldsig' => 'Saxiixa jiro:',
 'tog-fancysig' => "u isticmaal saxiixa sida qoraalada wiki  (ayada oo linki auomaatik la'aan)",
-'tog-externaleditor' => "Isticmaal qoraal wax ka bedelyaal ka madaxbanaan (La'iskuogyahay)",
-'tog-externaldiff' => "Isticmaal qoraal wax ka bedelyaal ka madaxbanaan oo (La'iskuogyahay)",
 'tog-showjumplinks' => 'Shid "ku bood" links-ka la geli karo',
 'tog-uselivepreview' => 'Isticmaal horfiirinta tooska ah (JavaScript) (Wuxuu ku jiraa tijaabo)',
 'tog-forceeditsummary' => "I'xasuusi markii uusan qoraalkeyga raacsiisnay faahfaahin gaaban",
@@ -249,7 +247,7 @@ $1',
 'copyright' => 'Qoraalka wuxuu ku salaysanyahay $1.',
 'copyrightpage' => '{{ns:project}}: Ogolaashada koobiga',
 'currentevents' => 'Dhacdooyinka cusub',
-'currentevents-url' => 'Project:Maxaa cusub',
+'currentevents-url' => 'Project:Dhacdooyinka Hadda',
 'disclaimers' => "Masuul la'aan",
 'disclaimerpage' => "Project:Masuul la'aan guud",
 'edithelp' => 'Caawinaada wax ka bedelka',
@@ -626,8 +624,8 @@ Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudag
 '''Hadii wax ka bedlkaan uu yahay mid xaq ah, fadlan markale isku day. Hadii aysan weli shaqaynin, is kuday inaad  ka baxdo ee markale soo gudagal.'''",
 'editing' => 'Waxaad badalaysaa $1',
 'creating' => 'Sameyta $1',
-'editingsection' => 'Waxaa wax ka badaleysaa $1 (qeyb yar)',
-'editingcomment' => 'Waxaa wax ka badaleysaa $1 (qeyb yar)',
+'editingsection' => 'Waxaad wax ka bedelaysaa $1 (qeyb yar)',
+'editingcomment' => 'Waxaad wax ka bedelaysaa $1 (qeyb yar)',
 'editconflict' => 'Isku dhac badalaadka: $1',
 'yourtext' => 'Qoraalkaaga',
 'editingold' => "'''DIGNIIN: Waxaad wax ka bedeli rabtaa boggan caddadkiisa duqoobay.
@@ -776,9 +774,6 @@ sababteeda neh waxaa laga heli kartaa  [{{fullurl:{{#Special:Log}}/delete|page={
 'powersearch-toggleall' => 'Dhamaan',
 'powersearch-togglenone' => 'Waxna',
 
-# Quickbar
-'qbsettings-none' => 'Waxna',
-
 # Preferences page
 'preferences' => 'Dooqyada',
 'mypreferences' => 'Dooqyadeyda',
@@ -1126,12 +1121,12 @@ $PAGEINTRO $NEWPAGE
 
 Qaybta wax laga bedelay: $PAGESUMMARY $PAGEMINOREDIT
 
-La xariirka Tafaftiraha:
+La xariirka Tifaftiraha:
 mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
 Lama soo diri doono ogeysiin dambe hadii isbedel kale lagu sii sameeyo ilaa aad ka soo booqato bogga.
-Waxaad awoodaa inaad ka saarto liiska waardiyeha booga.
+Waxaad awoodaa inaad ka saarto liiska waardiyeha bogga.
 
                         Nidaamka war gelinta {{SITENAME}} ee E-mailka
 
@@ -1410,7 +1405,7 @@ Hadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in e
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-iimcategory' => 'Qeybta',
 
 # External editor support
@@ -1456,10 +1451,6 @@ waxaad awoodaa [[Special:EditWatchlist/raw|Liiska wax ka bedel]].',
 # Special:Version
 'version-poweredby-others' => 'kuwa kale',
 
-# Special:FilePath
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Soco',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-legend' => 'Raadi mid tusaale ah',
 'fileduplicatesearch-submit' => 'Raadi',
index 7be0c36..2a78608 100644 (file)
@@ -246,8 +246,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Trego numrin e përdoruesve që vëzhgojnë këtë faqe',
 'tog-oldsig' => 'Nënshkrimi ekzistues:',
 'tog-fancysig' => 'Mbaje nënshkrimin si wikitekst (pa lidhje automatike)',
-'tog-externaleditor' => 'Përdor si rregull program të jashtëm redaktimi (vetëm për ekspertë, kërkon regjistrime speciale të kompjuterit. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Përdor si rregull program të jashtëm diff (vetëm për ekspertë, kërkon regjistrime speciale të kompjuterit. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Lejo lidhje "shko tek"',
 'tog-uselivepreview' => 'Trego bocetin në mënyrë të drejtëpërdrejtë (kërkon JavaScript) (eksperimentale)',
 'tog-forceeditsummary' => 'Më njofto kur e lë përmbledhjen e redaktimit bosh',
@@ -261,6 +259,7 @@ $messages = array(
 'tog-diffonly' => 'Mos trego përmbajtjen e faqes nën diff-e',
 'tog-showhiddencats' => 'Trego kategoritë e fshehura',
 'tog-norollbackdiff' => 'Ndryshimi pas rikthimit do të fshihet',
+'tog-useeditwarning' => 'Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura',
 
 'underline-always' => 'Gjithmonë',
 'underline-never' => 'Asnjëherë',
@@ -350,7 +349,7 @@ $messages = array(
 'cancel' => 'Anulo',
 'moredotdotdot' => 'Më shumë...',
 'mypage' => 'Faqja ime',
-'mytalk' => 'diskutimet',
+'mytalk' => 'Diskutimet',
 'anontalk' => 'Diskutimet për këtë IP',
 'navigation' => 'Shfleto',
 'and' => '&#32;dhe',
@@ -489,8 +488,7 @@ $1",
 'viewsourceold' => 'shiko tekstin',
 'editlink' => 'redakto',
 'viewsourcelink' => 'Shiko tekstin',
-'editsectionhint' => 'Redaktoni seksionin:
-Edit section: $1',
+'editsectionhint' => 'Redaktoni seksionin: $1',
 'toc' => 'Përmbajtje',
 'showtoc' => 'trego',
 'hidetoc' => 'fshih',
@@ -983,6 +981,8 @@ Duket se është grisur.',
 'edit-already-exists' => 'Faqja nuk mundej të hapet.
 Ajo tanimë ekziston.',
 'defaultmessagetext' => 'Teksti i porosisë së parazgjedhur',
+'editwarning-warning' => 'Lënia e kësaj faqeje mund t\'ju shkaktojë humbjen e çdo ndryshimi që keni bërë.
+Nëse keni hyrë brenda, ju mund ta hiqni këtë paralajmërim në seksionin "Redaktimi" tek preferencat tuaja.',
 
 # Content models
 'content-model-text' => 'tekst i thejshtë',
@@ -1250,15 +1250,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'search-external' => 'Kërkim i jashtëm',
 'searchdisabled' => '<p>Kërkimi me tekst të plotë është bllokuar tani për tani ngaqë shërbyesi është shumë i ngarkuar; shpresojmë ta nxjerrim prapë në gjendje normale pas disa punimeve. Deri atëherë mund të përdorni Google-in për kërkime:</p>',
 
-# Quickbar
-'qbsettings' => 'Vendime të shpejta',
-'qbsettings-none' => 'Asnjë',
-'qbsettings-fixedleft' => 'Lidhur majtas',
-'qbsettings-fixedright' => 'Lidhur djathtas',
-'qbsettings-floatingleft' => 'Pezull majtas',
-'qbsettings-floatingright' => 'Pezull djathtas',
-'qbsettings-directionality' => 'Fikse, në varësi të skriptës së drejtuar në gjuhën tuaj',
-
 # Preferences page
 'preferences' => 'Parapëlqimet',
 'mypreferences' => 'Parapëlqimet',
@@ -1796,7 +1787,6 @@ Për siguri optimale, img_auth.php është çaktivizuar.',
 'http-read-error' => 'Gabim në leximin e HTTP.',
 'http-timed-out' => 'Kërkesës HTTP i kaloi koha.',
 'http-curl-error' => 'Gabim gjatë gjetjes së URL-së: $1',
-'http-host-unreachable' => 'Nuk mund të lidheni me adresën URL.',
 'http-bad-status' => 'Ndodhi një problem gjatë kërkesës HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2196,8 +2186,8 @@ Në qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, sh
 'notvisiblerev' => 'Revizioni është grisur',
 'watchnochange' => 'Asnjë nga artikujt nën mbikqyrje nuk është redaktuar gjatë kohës së dhënë.',
 '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'''",
+'wlheader-enotif' => 'Njoftimi me email është lejuar.',
+'wlheader-showupdated' => "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
 'watchmethod-recent' => 'duke parë ndryshimet e fundit për faqet nën mbikqyrje',
 'watchmethod-list' => 'duke parë faqet nën mbikqyrje për ndryshimet e fundit',
 'watchlistcontains' => 'Lista mbikqyrëse e juaj ka $1 {{PLURAL:$1|faqe|faqe}}.',
@@ -2959,8 +2949,6 @@ Ju lutemi provoni përsëri.',
 'pageinfo-authors' => 'Numri i autorëve të veçantë',
 
 # Skin names
-'skinname-standard' => 'Standarte',
-'skinname-nostalgia' => 'Nostalgjike',
 'skinname-cologneblue' => 'Kolonjë Blu',
 
 # Patrolling
@@ -3062,7 +3050,7 @@ Në qoftë se skeda është ndryshuar nga gjendja origjinale, disa hollësira mu
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Gjerësia',
 'exif-imagelength' => 'Gjatësia',
 'exif-bitspersample' => 'Bit për komponent',
@@ -3240,7 +3228,7 @@ Në qoftë se skeda është ndryshuar nga gjendja origjinale, disa hollësira mu
 'exif-originalimageheight' => 'Lartësia e fotografisë para se të shkurtohej',
 'exif-originalimagewidth' => 'Gjerësia e fotografisë para se të shkurtohej',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'E pangjeshur',
 'exif-compression-2' => 'CCITT Grupi 3 1-Dimensional Kodimi i Modifikuar Huffman i linjës së gjatësisë',
 'exif-compression-3' => 'CCITT Grupi 3 faks kodimi',
@@ -3646,13 +3634,6 @@ Ju duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU Ge
 'version-software-version' => 'Versioni',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Vendndodhja e skedave',
-'filepath-page' => 'Skeda:',
-'filepath-submit' => 'Shko',
-'filepath-summary' => 'Kjo faqe speciale jep vendndodhjen e plotë të një skede.
-Figurat tregohen me madhësi të plotë, skedat e tjera hapen me programet përkatëse.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Kërkoni për skeda të dyfishta',
 'fileduplicatesearch-summary' => 'Kërkoni për dyfishime të skedave në bazë të vlerës përmbledhëse («hash»).',
index 3b2b042..4943b29 100644 (file)
@@ -15,6 +15,7 @@
  * @author Kaganer
  * @author Kale
  * @author Meno25
+ * @author Milicevic01
  * @author Millosh
  * @author Nikola Smolenski
  * @author Rancher
  * @author Reedy
  * @author Sasa Stefanovic
  * @author Slaven Kosanovic
+ * @author TheStefan12345
  * @author Јованвб
  * @author Жељко Тодоровић
+ * @author Милан Јелисавчић
  * @author Михајло Анђелковић
  * @author לערי ריינהארט
  */
@@ -399,12 +402,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Сакриј прегледане измене у списку скорашњих измена',
 'tog-newpageshidepatrolled' => 'Сакриј прегледане странице са списка нових страница',
 '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а (заÑ\85Ñ\82ева Ñ\98аваÑ\81кÑ\80ипÑ\82)',
+'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а (поÑ\82Ñ\80ебна JavaScript-а)',
 'tog-numberheadings' => 'Самостално нумериши поднаслове',
-'tog-showtoolbar' => 'Трака с алаткама за уређивање (јаваскрипт)',
+'tog-showtoolbar' => 'Трака с алаткама за уређивање (потребна JavaScript-а)',
 'tog-editondblclick' => 'Уређивање страница двоструким кликом (јаваскрипт)',
 'tog-editsection' => 'Везе за уређивање појединачних одељака',
-'tog-editsectiononrightclick' => 'Уређивање одељака десним кликом на њихове наслове (јаваскрипт)',
+'tog-editsectiononrightclick' => 'Уређивање одељака десним кликом на њихове наслове (потребна JavaScript-а)',
 'tog-showtoc' => 'Прикажи садржај страница које имају више од три поднаслова',
 'tog-rememberpassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
 'tog-watchcreations' => 'Додај странице које направим и датотеке које пошаљем у списак надгледања',
@@ -418,14 +421,12 @@ $messages = array(
 'tog-enotifwatchlistpages' => 'Пошаљи ми е-поруку када се промени страница или датотека коју надгледам',
 'tog-enotifusertalkpages' => 'Пошаљи ми е-поруку када се промени моја страница за разговор',
 'tog-enotifminoredits' => 'Пошаљи ми е-поруку и за мање измене у страницама и датотекама',
-'tog-enotifrevealaddr' => 'Ð\9eÑ\82кÑ\80иÑ\98 моју е-адресу у порукама обавештења',
+'tog-enotifrevealaddr' => 'Ð\9fÑ\80икажи моју е-адресу у порукама обавештења',
 'tog-shownumberswatching' => 'Прикажи број корисника који надгледају',
 'tog-oldsig' => 'Текући потпис:',
 'tog-fancysig' => 'Сматрај потпис као викитекст (без самоповезивања)',
-'tog-externaleditor' => 'Увек користи спољни уређивач (само за напредне — потребне су посебне поставке на рачунару)',
-'tog-externaldiff' => 'Увек користи спољни програм за упоређивање (само за напредне — потребне су посебне поставке на рачунару)',
 'tog-showjumplinks' => 'Омогући помоћне везе „Иди на“',
-'tog-uselivepreview' => 'Користи тренутан преглед (јаваскрипт, пробна могућност)',
+'tog-uselivepreview' => 'Користи тренутан преглед (потребна JavaScript-а, експериментално)',
 'tog-forceeditsummary' => 'Опомени ме при уносу празног описа',
 'tog-watchlisthideown' => 'Сакриј моје измене са списка надгледања',
 'tog-watchlisthidebots' => 'Сакриј измене ботова са списка надгледања',
@@ -433,11 +434,12 @@ $messages = array(
 'tog-watchlisthideliu' => 'Сакриј измене пријављених корисника са списка надгледања',
 'tog-watchlisthideanons' => 'Сакриј измене анонимних корисника са списка надгледања',
 'tog-watchlisthidepatrolled' => 'Сакриј прегледане измене са списка надгледања',
-'tog-ccmeonemails' => 'Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¿Ñ\80имеÑ\80ке е-порука које пошаљем другим корисницима',
+'tog-ccmeonemails' => 'Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ ÐºÐ¾Ð¿Ð¸Ñ\98е е-порука које пошаљем другим корисницима',
 'tog-diffonly' => 'Не приказуј садржај странице испод разлика',
 'tog-showhiddencats' => 'Прикажи скривене категорије',
 'tog-noconvertlink' => 'Онемогући претварање наслова веза',
 'tog-norollbackdiff' => 'Изостави разлику након извршеног враћања',
+'tog-useeditwarning' => 'Упозори ме када напустим страницу која није сачувана',
 
 'underline-always' => 'увек подвлачи',
 'underline-never' => 'никад не подвлачи',
@@ -501,6 +503,18 @@ $messages = array(
 '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 децембар',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категорија|Категорије}}',
@@ -525,9 +539,10 @@ $messages = array(
 
 'about' => 'О нама',
 'article' => 'Страница са садржајем',
-'newwindow' => '(отвара у новом прозору)',
+'newwindow' => '(оÑ\82ваÑ\80а Ñ\81е Ñ\83 Ð½Ð¾Ð²Ð¾Ð¼ Ð¿Ñ\80озоÑ\80Ñ\83)',
 'cancel' => 'Откажи',
 'moredotdotdot' => 'Више…',
+'morenotlisted' => 'Више није приказано…',
 'mypage' => 'Страница',
 'mytalk' => 'Разговор',
 'anontalk' => 'Разговор за ову ИП адресу',
@@ -556,7 +571,7 @@ $messages = array(
 'vector-view-edit' => 'Уреди',
 'vector-view-history' => 'Историја',
 'vector-view-view' => 'Читај',
-'vector-view-viewsource' => 'Изворник',
+'vector-view-viewsource' => 'Изворни код',
 'actions' => 'Радње',
 'namespaces' => 'Именски простори',
 'variants' => 'Варијанте',
@@ -670,7 +685,7 @@ $1',
 'editsection' => 'уреди',
 'editsection-brackets' => '[$1]',
 'editold' => 'уреди',
-'viewsourceold' => 'изворник',
+'viewsourceold' => 'изворни код',
 'editlink' => 'уреди',
 'viewsourcelink' => 'Извор',
 'editsectionhint' => 'Уредите одељак „$1“',
@@ -774,7 +789,7 @@ $1',
 'wrong_wfQuery_params' => 'Неисправни параметри за wfQuery()<br />
 Функција: $1<br />
 Упит: $2',
-'viewsource' => 'Изворник',
+'viewsource' => 'Изворни код',
 'viewsource-title' => 'Приказ извора странице $1',
 'actionthrottled' => 'Радња је успорена',
 'actionthrottledtext' => 'У циљу борбе против непожељних порука, ограничене су вам измене у одређеном времену, а управо сте прешли то ограничење. Покушајте поново за неколико минута.',
@@ -817,9 +832,18 @@ $2',
 'welcomecreation-msg' => 'Ваш налог је отворен.
 Не заборавите да промените своја [[Special:Preferences|подешавања]].',
 'yourname' => 'Корисничко име:',
+'userlogin-yourname' => 'Корисничко име',
+'userlogin-yourname-ph' => 'Унесите ново корисничко име',
 'yourpassword' => 'Лозинка:',
+'userlogin-yourpassword' => 'Лозинка',
+'userlogin-yourpassword-ph' => 'Унесите лозинку',
+'createacct-yourpassword-ph' => 'Унесите нову лозинку',
 'yourpasswordagain' => 'Потврда лозинке:',
+'createacct-yourpasswordagain' => 'Потврдите лозинку',
+'createacct-yourpasswordagain-ph' => 'Унесите лозинку још једном',
 'remembermypassword' => 'Запамти ме на овом прегледачу (најдуже $1 {{PLURAL:$1|дан|дана|дана}})',
+'userlogin-remembermypassword' => 'Запамти ме',
+'userlogin-signwithsecure' => 'Користите слигурну конекцију (SSL)',
 'securelogin-stick-https' => 'Останите повезани са HTTPS након пријаве',
 'yourdomainname' => 'Домен:',
 'password-change-forbidden' => 'Не можете да промените лозинку на овом викију.',
@@ -832,14 +856,30 @@ $2',
 'logout' => 'Одјава',
 'userlogout' => 'Одјави ме',
 'notloggedin' => 'Нисте пријављени',
+'userlogin-noaccount' => 'Немате налог?',
+'userlogin-joinproject' => 'Придружите се {{SITENAME}}',
 'nologin' => 'Немате налог? Идите на страницу „$1“.',
 'nologinlink' => 'Отварање налога',
 'createaccount' => 'Отвори налог',
 'gotaccount' => 'Већ имате налог? Идите на страницу „$1“.',
 'gotaccountlink' => 'Пријава',
 'userlogin-resetlink' => 'Заборавили сте податке за пријаву?',
-'createaccountmail' => 'Е-поштом',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Помоћ при пријављивању]]',
+'createacct-emailrequired' => 'Адреса е-поште',
+'createacct-emailoptional' => 'Адреса е-поште (опцијоно)',
+'createacct-email-ph' => 'Унесите вашу адресу е-поште',
+'createaccountmail' => 'Користите привремену, случајно створену лозинку и пошаљите на доле наведену адресу електронске поште',
+'createacct-realname' => 'Право име (опцијоно)',
 'createaccountreason' => 'Разлог:',
+'createacct-reason' => 'Разлог',
+'createacct-reason-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|доприноса}}',
 'badretype' => 'Унете лозинке се не поклапају.',
 'userexists' => 'Корисничко име је заузето. Изаберите друго.',
 'loginerror' => 'Грешка при пријављивању',
@@ -883,7 +923,7 @@ $2',
 'eauthentsent' => 'На наведену е-адресу је послат потврдни код.
 Пре него што пошаљемо даљње поруке, пратите упутства с е-поште да бисте потврдили да сте ви отворили налог.',
 'throttled-mailpassword' => 'Подсетник за лозинку је послат {{PLURAL:$1|пре сат времена|у последња $1 сата|у последњих $1 сати}}.
-Да бисмо спречили злоупотребу, поседник шаљемо само једном у року од {{PLURAL:$1|једног сата|$1 сата|$1 сати}}.',
+Да бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|једног сата|$1 сата|$1 сати}}.',
 'mailerror' => 'Грешка при слању поруке: $1',
 'acct_creation_throttle_hit' => 'Посетиоци овог викија који користе вашу ИП адресу су већ отворили {{PLURAL:$1|један налог|$1 налога|$1 налога}} претходни дан, што је највећи дозвољени број у том временском периоду.
 Због тога посетиоци с ове ИП адресе тренутно не могу отворити више налога.',
@@ -913,6 +953,7 @@ $2',
 # Email sending
 'php-mail-error-unknown' => 'Непозната грешка у функцији PHP mail().',
 'user-mail-no-addy' => 'Покушали сте да пошаљете поруку без е-адресе.',
+'user-mail-no-body' => 'Покушано слање електронске поруке с празним или неразумно кратким садржајем.',
 
 # Change password dialog
 'resetpass' => 'Промена лозинке',
@@ -933,27 +974,26 @@ $2',
 'resetpass-wrong-oldpass' => 'Неисправна привремена или текућа лозинка.
 Можда сте већ променили лозинку или сте затражили нову привремену лозинку.',
 'resetpass-temp-password' => 'Привремена лозинка:',
+'resetpass-abort-generic' => 'Промену лозинке је спречио додатак.',
 
 # Special:PasswordReset
 'passwordreset' => 'Обнављање лозинке',
-'passwordreset-text' => 'Попуните овај образац да бисте примили е-поруку са својим подацима за пријаву.',
 'passwordreset-legend' => 'Поништи лозинку',
 'passwordreset-disabled' => 'Обнављање лозинке је онемогућено на овом викију.',
-'passwordreset-pretext' => '{{PLURAL:$1||Унесите један од делова података испод}}',
 'passwordreset-username' => 'Корисничко име:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Погледати крајњу поруку?',
 'passwordreset-capture-help' => 'Ако означите ову кућицу, е-порука с привременом лозинком ће бити приказана и послата кориснику.',
 'passwordreset-email' => 'Е-адреса:',
 'passwordreset-emailtitle' => 'Детаљи налога на викију {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²и, са ИП адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).
+'passwordreset-emailtext-ip' => 'Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð\92и, са ИП адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).
 Следећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом е-адресом:
 
 $2
 
-{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана|$5 дана}}.
-Пријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.',
-'passwordreset-emailtext-user' => '{{GENDER:$1|Корисник|Корисница|Корисник}} $1 је затражио подсетник о подацима за пријаву на викију {{SITENAME}} ($4).
+{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.
+Пријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.',
+'passwordreset-emailtext-user' => '{{GENDER:$1|Корисник|Корисница|Корисник}} је затражио подсетник о подацима за пријаву на викију {{SITENAME}} ($4).
 Следећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом е-адресом:
 
 $2
@@ -1145,8 +1185,8 @@ $2
 '''Не шаљите радове заштићене ауторским правима без дозволе!'''",
 'longpageerror' => "'''Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.'''
 Страница не може бити сачувана.",
-'readonlywarning' => "'''Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.
\9dаÑ\98боÑ\99е Ð±Ð¸ Ð±Ð¸Ð»Ð¾ Ð´Ð° Ñ\81аÑ\87Ñ\83ваÑ\82е Ñ\82екÑ\81Ñ\82 Ð·Ð° ÐºÐ°Ñ\81ниÑ\98е Ñ\83 Ð½ÐµÐºÐ¾Ñ\98 Ñ\82екÑ\81Ñ\82Ñ\83алноÑ\98 Ð´Ð°Ñ\82оÑ\82еÑ\86и.'''
+'readonlywarning' => "'''Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.'''
\9cожда Ð±Ð¸Ñ\81Ñ\82е Ð¶ÐµÐ»ÐµÐ»Ð¸ Ñ\81аÑ\87Ñ\83ваÑ\82и Ñ\82екÑ\81Ñ\82 Ð·Ð° ÐºÐ°Ñ\81ниÑ\98е Ñ\83 Ð½ÐµÐºÐ¾Ñ\98 Ñ\82екÑ\81Ñ\82Ñ\83алноÑ\98 Ð´Ð°Ñ\82оÑ\82еÑ\86и.
 
 Администратор који је закључао базу дао је следеће објашњење: $1",
 'protectedpagewarning' => "'''Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.'''
@@ -1190,6 +1230,8 @@ $2
 'content-failed-to-parse' => 'Не могу да рашчланим садржај типа $2 за модел $1: $3',
 'invalid-content-data' => 'Неисправни подаци садржаја',
 'content-not-allowed-here' => 'Садржај модела „$1“ није дозвољен на страници [[$2]]',
+'editwarning-warning' => 'Ако напустите ову страницу, изгубићете све измене које сте направили.
+Ако сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „Уређивање“.',
 
 # Content models
 'content-model-wikitext' => 'викитекст',
@@ -1455,7 +1497,7 @@ $1",
 'search-interwiki-default' => '$1 резултати:',
 'search-interwiki-more' => '(више)',
 'search-relatedarticle' => 'Повезано',
-'mwsuggest-disable' => 'Онемогући предлоге AJAX',
+'mwsuggest-disable' => 'Онемогући предлоге при претраживању',
 'searcheverything-enable' => 'сви именски простори',
 'searchrelated' => 'повезано',
 'searchall' => 'све',
@@ -1478,15 +1520,6 @@ $1",
 У међувремену можете тражити преко Гугла.
 Упамтите да његови пописи овог викија могу бити застарели.',
 
-# Quickbar
-'qbsettings' => 'Бочна палета',
-'qbsettings-none' => 'Ништа',
-'qbsettings-fixedleft' => 'Причвршћена лево',
-'qbsettings-fixedright' => 'Причвршћена десно',
-'qbsettings-floatingleft' => 'Плутајућа лево',
-'qbsettings-floatingright' => 'Плутајућа десно',
-'qbsettings-directionality' => 'Фиксно, у зависности од смера писања вашег језика',
-
 # Preferences page
 'preferences' => 'Подешавања',
 'mypreferences' => 'Подешавања',
@@ -1566,7 +1599,7 @@ $1",
 'prefs-textboxsize' => 'Величина оквира за уређивање',
 'youremail' => 'Е-адреса:',
 'username' => 'Корисничко име:',
-'uid' => 'Кориснички ИБ:',
+'uid' => 'Кориснички ID:',
 'prefs-memberingroups' => 'Члан {{PLURAL:$1|групе|групâ}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Време уписа:',
@@ -1700,7 +1733,7 @@ $1",
 'right-unblockself' => 'деблокирање самог себе',
 'right-protect' => 'мењање заштићених страница и степена заштите',
 'right-editprotected' => 'уређивање заштићених страница (с преносивом заштитом)',
-'right-editinterface' => 'уређивање корисничког сучеља',
+'right-editinterface' => 'уређивање корисничког окружења',
 'right-editusercssjs' => 'уређивање туђих CSS и јаваскрипт датотека',
 'right-editusercss' => 'уређивање туђих CSS датотека',
 'right-edituserjs' => 'уређивање туђих јаваскрипт датотека',
@@ -2059,7 +2092,6 @@ $1',
 'http-read-error' => 'HTTP грешка при читању.',
 'http-timed-out' => 'Захтев HTTP је истекао.',
 'http-curl-error' => 'Грешка при отварању адресе: $1',
-'http-host-unreachable' => 'Не могу да приступим адреси.',
 'http-bad-status' => 'Дошло је до проблема током захтева HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2220,6 +2252,12 @@ $1',
 Уместо тога, ваљало би да воде до одговарајуће теме.
 Страница се сматра вишезначном одредницом ако користи шаблон који води од [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Стране с особином стране',
+'pageswithprop-legend' => 'Стране с особином стране',
+'pageswithprop-text' => 'Ова страна излистава стране које имају одређену особину',
+'pageswithprop-prop' => 'Име особине:',
+'pageswithprop-submit' => 'Иди',
+
 'doubleredirects' => 'Двострука преусмерења',
 'doubleredirectstext' => 'Ова страница приказује странице које преусмеравају на друга преусмерења.
 Сваки ред садржи везе према првом и другом преусмерењу, као и одредишну страницу другог преусмерења која је обично „прави“ чланак на кога прво преусмерење треба да упућује.
@@ -2373,9 +2411,9 @@ $1',
 'linksearch-pat' => 'Образац претраге:',
 'linksearch-ns' => 'Именски простор:',
 'linksearch-ok' => 'Претражи',
-'linksearch-text' => 'Могу се користити џокери попут „*.wikipedia.org“.<br />
+'linksearch-text' => 'Могу се користити џокери попут „*.wikipedia.org“.
 Потребан је највиши домен, као „*.org“.<br />
-Подржани протоколи: <code>$1</code> (задаје http:// ако не наведете протокол).',
+{{PLURAL:$2|Подржан протокол|Подржани протоколи}}: <code>$1</code> (задаје http:// ако не наведете протокол).',
 'linksearch-line' => '$1 веза у $2',
 'linksearch-error' => 'Џокери се могу појавити само на почетку адресе.',
 
@@ -2476,8 +2514,8 @@ $1',
 'notvisiblerev' => 'Измена је обрисана',
 'watchnochange' => 'Ништа што надгледате није промењено у приказаном времену.',
 'watchlist-details' => '{{PLURAL:$1|$1 страница|$1 странице|$1 страница}} на вашем списку надгледања, не рачунајући странице за разговор.',
-'wlheader-enotif' => '* Е-обавештење је омогућено.',
-'wlheader-showupdated' => "* Странице које су измењене откад сте их последњи пут посетили су '''подебљане'''",
+'wlheader-enotif' => 'Обавештење е-поруком је омогућено.',
+'wlheader-showupdated' => "Странице које су измењене откад сте их последњи пут посетили су '''подебљане'''.",
 'watchmethod-recent' => 'проверава се да ли има надгледаних страница у скорашњим изменама',
 'watchmethod-list' => 'проверава се да ли има скорашњих измена у надгледаним страницама',
 'watchlistcontains' => 'Ваш списак надгледања садржи $1 {{PLURAL:$1|страницу|странице|страница}}.',
@@ -2610,6 +2648,7 @@ $UNWATCHURL
 'prot_1movedto2' => '{{GENDER:|је преместио|је преместила|је преместио}} [[$1]] у [[$2]]',
 'protect-badnamespace-title' => 'Незаштитљив именски простор',
 'protect-badnamespace-text' => 'Странице у овом именском простору се не могу заштитити.',
+'protect-norestrictiontypes-title' => 'Незаштитљива страна',
 'protect-legend' => 'Потврдите заштиту',
 'protectcomment' => 'Разлог:',
 'protectexpiry' => 'Истиче:',
@@ -2626,9 +2665,9 @@ $UNWATCHURL
 'protect-cascadeon' => 'Ова страница је тренутно заштићена јер се налази на {{PLURAL:$1|страници која има|страницама које имају}} преносиву заштиту.
 Можете да промените степен заштите, али то неће утицати на преносиву заштиту.',
 'protect-default' => 'Дозволи свим корисницима',
-'protect-fallback' => 'Ð\9fоÑ\82Ñ\80ебно Ñ\98е Ð¸Ð¼Ð°Ñ\82и Ð¾Ð²Ð»Ð°Ñ\88Ñ\9bеÑ\9aа „$1“',
-'protect-level-autoconfirmed' => 'Ð\91локиÑ\80аÑ\98 Ð½Ð¾Ð²Ðµ Ð¸ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ðµ ÐºÐ¾Ñ\80иÑ\81нике',
-'protect-level-sysop' => 'Само Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80и',
+'protect-fallback' => 'Ð\94озвоÑ\99ено Ñ\81амо ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ñ\81а Ð´Ð¾Ð·Ð²Ð¾Ð»Ð¾Ð¼ „$1“',
+'protect-level-autoconfirmed' => 'Ð\94опÑ\83Ñ\88Ñ\82ено Ñ\81амо Ð°Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð¿Ð¾Ñ\82вÑ\80Ñ\92еним ÐºÐ¾Ñ\80иÑ\81ниÑ\86има',
+'protect-level-sysop' => 'Ð\94опÑ\83Ñ\88Ñ\82ено Ñ\81амо Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80има',
 'protect-summary-cascade' => 'преносива заштита',
 'protect-expiring' => 'истиче $1 (UTC)',
 'protect-expiring-local' => 'истиче $1',
@@ -2728,12 +2767,12 @@ $1',
 'blanknamespace' => '(Главно)',
 
 # Contributions
-'contributions' => 'Кориснички доприноси',
+'contributions' => '{{GENDER:$1|Кориснички}} доприноси',
 'contributions-title' => 'Доприноси {{GENDER:$1|корисника|кориснице|корисника}} $1',
 'mycontris' => 'Доприноси',
 'contribsub2' => 'За $1 ($2)',
 'nocontribs' => 'Измене које одговарају овим условима нису пронађене.',
-'uctop' => '(вÑ\80Ñ\85)',
+'uctop' => '(поÑ\81ледÑ\9aа)',
 'month' => 'од месеца (и раније):',
 'year' => 'од године (и раније):',
 
@@ -3124,6 +3163,7 @@ $1',
 'import-error-interwiki' => 'Не могу да увезем страницу „$1“ јер је њен назив резервисан за спољно повезивање (међувики).',
 'import-error-special' => 'Не могу да увезем страницу „$1“ јер она припада посебном именском простору које не прихвата странице.',
 'import-error-invalid' => 'Не могу да увезем страницу „$1“ јер је њен назив неисправан.',
+'import-error-unserialize' => 'Верзија $2 странице $1 не може бити прочитана/увезена. Записано је да верзија користи $3 тип садржаја у $4 формату.',
 'import-options-wrong' => '{{PLURAL:$2|Погрешна опција|Погрешне опције}}: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => 'Наведена основна страница има неисправан наслов.',
 'import-rootpage-nosubpage' => 'Именски простор „$1“ основне странице не дозвољава подстранице.',
@@ -3217,17 +3257,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/** CSS постављен овде ће се одразити на све теме */',
-'standard.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Стандардно“ */',
-'nostalgia.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Носталгија“ */',
 'cologneblue.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Келнско плава“ */',
 'monobook.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Монобук“ */',
-'myskin.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Моја тема“ */',
-'chick.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Шик“ */',
-'simple.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Просто“ */',
 'modern.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Савремено“ */',
 'vector.css' => '/* CSS постављен овде ће утицати на све кориснике теме „Векторско“ */',
 'print.css' => '/* CSS постављен овде ће утицати на издање за штампу */',
-'handheld.css' => '/* CSS постављен овде ће утицати на ручне уређаје с темом прилагођеном у $wgHandheldStyle */',
 'noscript.css' => '/* CSS постављен овде ће утицати на све кориснике којима је онемогућен јаваскрипт */',
 'group-autoconfirmed.css' => '/* CSS постављен овде ће утицати на самопотврђене кориснике */',
 'group-bot.css' => '/* CSS постављен овде ће утицати само на ботове */',
@@ -3236,13 +3270,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Јаваскрипт постављен овде ће се користити за све кориснике при отварању сваке странице. */',
-'standard.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Стандардно“ */',
-'nostalgia.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Носталгија“ */',
 'cologneblue.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Келнско плава“ */',
 'monobook.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Монобук“ */',
-'myskin.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе „Моју тему“ */',
-'chick.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Шик“ */',
-'simple.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Просто“ */',
 'modern.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Савремено“ */',
 'vector.js' => '/* Јаваскрипт постављен овде ће се учитати за све оне који користе тему „Векторско“ */',
 'group-autoconfirmed.js' => '/* Јаваскрипт постављен овде ће се учитати за самопотврђене кориснике */',
@@ -3292,6 +3321,7 @@ $1',
 'pageinfo-robot-noindex' => 'Не може да се попише',
 'pageinfo-views' => 'Број прегледа',
 'pageinfo-watchers' => 'Број надгледача страница',
+'pageinfo-few-watchers' => 'Мање од $1 {{PLURAL:$1|пратиоца|пратилаца}}',
 'pageinfo-redirects-name' => 'Преусмеравања на страницу',
 'pageinfo-subpages-name' => 'Подстранице ове странице',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|преусмерење|преусмерења|преусмерења}}; $3 {{PLURAL:$3|непреусмерење|непреусмерења|непреусмерења}})',
@@ -3306,6 +3336,7 @@ $1',
 'pageinfo-magic-words' => '{{PLURAL:$1|Магична реч|Магичне речи}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Укључени шаблон|Укључени шаблони}} ($1)',
+'pageinfo-transclusions' => '{{PLURAL:$1|Страница|Странице}} укључене у ($1)',
 'pageinfo-toolboxlink' => 'Подаци о страници',
 'pageinfo-redirectsto' => 'Преусмерава на',
 'pageinfo-redirectsto-info' => 'подаци',
@@ -3314,15 +3345,14 @@ $1',
 'pageinfo-protect-cascading' => 'Преносива заштита страница важи одавде',
 'pageinfo-protect-cascading-yes' => 'Да',
 'pageinfo-protect-cascading-from' => 'Странице са преносивом заштитом од',
+'pageinfo-category-info' => 'Информације о категорији',
+'pageinfo-category-pages' => 'Број страница',
+'pageinfo-category-subcats' => 'Број поткатегорија',
+'pageinfo-category-files' => 'Број датотека',
 
 # Skin names
-'skinname-standard' => 'Класично',
-'skinname-nostalgia' => 'Носталгија',
 'skinname-cologneblue' => 'Келнско плава',
 'skinname-monobook' => 'Монобук',
-'skinname-myskin' => 'Моја тема',
-'skinname-chick' => 'Шик',
-'skinname-simple' => 'Просто',
 'skinname-modern' => 'Савремено',
 'skinname-vector' => 'Векторско',
 
@@ -3372,6 +3402,7 @@ $1',
 'file-nohires' => 'Већа резолуција није доступна.',
 'svg-long-desc' => 'SVG датотека, номинално $1 × $2 пиксела, величина: $3',
 'svg-long-desc-animated' => 'Анимирана SVG датотека, номинално: $1 × $2 пиксела, величина: $3',
+'svg-long-error' => 'Неисправна SVG датотека: $1',
 'show-big-image' => 'Пуна величина',
 'show-big-image-preview' => 'Величина овог приказа: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Друга резолуција|Друге резолуције}}: $1.',
@@ -3407,6 +3438,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 сат|$1 сата|$1 сати}}',
 'days' => '{{PLURAL:$1|$1 дан|$1 дана|$1 дана}}',
 'ago' => 'пре $1',
+'just-now' => 'управо сад',
 
 # Bad image list
 'bad_image_list' => 'Формат је следећи:
@@ -3417,8 +3449,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3493,7 +3523,7 @@ Variants for Chinese language
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Висина',
 'exif-bitspersample' => 'Дубина боје',
@@ -3686,7 +3716,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Несажето',
 'exif-compression-2' => 'CCITT Group 3 1 – Димензионално измењено Хафманово кодирање по дужини',
 'exif-compression-3' => 'CCITT Group 3 факс кодирање',
@@ -4202,12 +4232,10 @@ $5
 'version-entrypoints-header-entrypoint' => 'Улазна тачка',
 'version-entrypoints-header-url' => 'Адреса',
 
-# Special:FilePath
-'filepath' => 'Путања датотеке',
-'filepath-page' => 'Датотека:',
-'filepath-submit' => 'Иди',
-'filepath-summary' => 'Ова посебна страница приказује потпуну путању датотеке.
-Слике су приказане у пуној величини, а друге врсте датотека се покрећу помоћу њима придруженим програмима.',
+# Special:Redirect
+'redirect-submit' => 'Иди',
+'redirect-value' => 'Вредност:',
+'redirect-file' => 'Назив датотеке',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Претрага дупликата',
@@ -4235,7 +4263,7 @@ $5
 'specialpages-group-highuse' => 'Најчешће коришћене странице',
 'specialpages-group-pages' => 'Спискови страница',
 'specialpages-group-pagetools' => 'Алатке',
-'specialpages-group-wiki' => 'Подаци и алати енциклопедије',
+'specialpages-group-wiki' => 'Подаци и алати',
 'specialpages-group-redirects' => 'Преусмеравање посебних страница',
 'specialpages-group-spam' => 'Алатке против непожељних порука',
 
@@ -4298,6 +4326,9 @@ $5
 'htmlform-submit' => 'Пошаљи',
 'htmlform-reset' => 'Врати измене',
 'htmlform-selectorother-other' => 'Друго',
+'htmlform-no' => 'Не',
+'htmlform-yes' => 'Да',
+'htmlform-chosen-placeholder' => 'Изаберите опцију',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 с подршком претраге целог текста',
index ea2bc20..fdbf933 100644 (file)
@@ -12,6 +12,7 @@
  * @author Liangent
  * @author Meno25
  * @author Michaello
+ * @author Milicevic01
  * @author Rancher
  * @author Red Baron
  * @author Reedy
@@ -332,8 +333,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji nadgledaju',
 'tog-oldsig' => 'Tekući potpis:',
 'tog-fancysig' => 'Smatraj potpis kao vikitekst (bez samopovezivanja)',
-'tog-externaleditor' => 'Uvek koristi spoljni uređivač (samo za napredne — potrebne su posebne postavke na računaru)',
-'tog-externaldiff' => 'Uvek koristi spoljni program za upoređivanje (samo za napredne — potrebne su posebne postavke na računaru)',
 'tog-showjumplinks' => 'Omogući pomoćne veze „Idi na“',
 'tog-uselivepreview' => 'Koristi trenutan pregled (javaskript, probna mogućnost)',
 'tog-forceeditsummary' => 'Opomeni me pri unosu praznog opisa',
@@ -348,6 +347,7 @@ $messages = array(
 'tog-showhiddencats' => 'Prikaži skrivene kategorije',
 'tog-noconvertlink' => 'Onemogući pretvaranje naslova veza',
 'tog-norollbackdiff' => 'Izostavi razliku nakon izvršenog vraćanja',
+'tog-useeditwarning' => 'Upozori me kada napustim stranicu sa nesačuvanim promenama',
 
 'underline-always' => 'uvek podvlači',
 'underline-never' => 'nikad ne podvlači',
@@ -744,6 +744,7 @@ Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još pr
 'gotaccount' => 'Već imate nalog? Idite na stranicu „$1“.',
 'gotaccountlink' => 'Prijava',
 'userlogin-resetlink' => 'Zaboravili ste podatke za prijavu?',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Pomoć pri prijavljivanju]]',
 'createaccountmail' => 'E-poštom',
 'createaccountreason' => 'Razlog:',
 'badretype' => 'Unete lozinke se ne poklapaju.',
@@ -842,10 +843,8 @@ Možda ste već promenili lozinku ili ste zatražili novu privremenu lozinku.',
 
 # Special:PasswordReset
 'passwordreset' => 'Obnavljanje lozinke',
-'passwordreset-text' => 'Popunite ovaj obrazac da biste primili e-poruku sa svojim podacima za prijavu.',
 'passwordreset-legend' => 'Poništi lozinku',
 'passwordreset-disabled' => 'Obnavljanje lozinke je onemogućeno na ovom vikiju.',
-'passwordreset-pretext' => '{{PLURAL:$1||Unesite jedan od delova podataka ispod}}',
 'passwordreset-username' => 'Korisničko ime:',
 'passwordreset-domain' => 'Domen:',
 'passwordreset-capture' => 'Pogledati krajnju poruku?',
@@ -1095,6 +1094,8 @@ Izgleda da ona već postoji.',
 'content-failed-to-parse' => 'Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3',
 'invalid-content-data' => 'Neispravni podaci sadržaja',
 'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+'editwarning-warning' => 'Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.
+Ako ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku „Uređivanje“.',
 
 # Content models
 'content-model-wikitext' => 'vikitekst',
@@ -1383,15 +1384,6 @@ Ako želite sve da pretražite, dodajte prefiks '''all:''' ispred traženog sadr
 U međuvremenu možete tražiti preko Gugla.
 Upamtite da njegovi popisi ovog vikija mogu biti zastareli.',
 
-# Quickbar
-'qbsettings' => 'Bočna paleta',
-'qbsettings-none' => 'Ništa',
-'qbsettings-fixedleft' => 'Pričvršćena levo',
-'qbsettings-fixedright' => 'Pričvršćena desno',
-'qbsettings-floatingleft' => 'Plutajuća levo',
-'qbsettings-floatingright' => 'Plutajuća desno',
-'qbsettings-directionality' => 'Fiksno, u zavisnosti od smera pisanja vašeg jezika',
-
 # Preferences page
 'preferences' => 'Podešavanja',
 'mypreferences' => 'Podešavanja',
@@ -1963,7 +1955,6 @@ Radi sigurnosti, img_auth.php je onemogućen.',
 'http-read-error' => 'HTTP greška pri čitanju.',
 'http-timed-out' => 'Zahtev HTTP je istekao.',
 'http-curl-error' => 'Greška pri otvaranju adrese: $1',
-'http-host-unreachable' => 'Ne mogu da pristupim adresi.',
 'http-bad-status' => 'Došlo je do problema tokom zahteva HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2380,8 +2371,8 @@ Ukoliko budete želeli da uklonite stranicu sa spiska nadgledanja, kliknite opet
 'notvisiblerev' => 'Izmena je obrisana',
 'watchnochange' => 'Ništa što nadgledate nije promenjeno u prikazanom vremenu.',
 'watchlist-details' => '{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na vašem spisku nadgledanja, ne računajući stranice za razgovor.',
-'wlheader-enotif' => 'E-obaveštenje je omogućeno.',
-'wlheader-showupdated' => "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''",
+'wlheader-enotif' => 'E-obaveštenje je omogućeno.',
+'wlheader-showupdated' => "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''",
 'watchmethod-recent' => 'proverava se da li ima nadgledanih stranica u skorašnjim izmenama',
 'watchmethod-list' => 'proverava se da li ima skorašnjih izmena u nadgledanim stranicama',
 'watchlistcontains' => 'Vaš spisak nadgledanja sadrži $1 {{PLURAL:$1|stranicu|stranice|stranica}}.',
@@ -2627,7 +2618,7 @@ $1',
 'mycontris' => 'Doprinosi',
 'contribsub2' => 'Za $1 ($2)',
 'nocontribs' => 'Izmene koje odgovaraju ovim uslovima nisu pronađene.',
-'uctop' => '(vrh)',
+'uctop' => '(poslednja)',
 'month' => 'od meseca (i ranije):',
 'year' => 'od godine (i ranije):',
 
@@ -3111,17 +3102,11 @@ Pokušajte ponovo.',
 
 # Stylesheets
 'common.css' => '/** CSS postavljen ovde će se odraziti na sve teme */',
-'standard.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Standardno“ */',
-'nostalgia.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Nostalgija“ */',
 'cologneblue.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Kelnsko plava“ */',
 'monobook.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Monobuk“ */',
-'myskin.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Moja tema“ */',
-'chick.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Šik“ */',
-'simple.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Prosto“ */',
 'modern.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Savremeno“ */',
 'vector.css' => '/* CSS postavljen ovde će uticati na sve korisnike teme „Vektorsko“ */',
 'print.css' => '/* CSS postavljen ovde će uticati na izdanje za štampu */',
-'handheld.css' => '/* CSS postavljen ovde će uticati na ručne uređaje s temom prilagođenom u $wgHandheldStyle */',
 'noscript.css' => '/* CSS postavljen ovde će uticati na sve korisnike kojima je onemogućen javaskript */',
 'group-autoconfirmed.css' => '/* CSS postavljen ovde će uticati na samopotvrđene korisnike */',
 'group-bot.css' => '/* CSS postavljen ovde će uticati samo na botove */',
@@ -3130,13 +3115,8 @@ Pokušajte ponovo.',
 
 # Scripts
 'common.js' => '/* Javaskript postavljen ovde će se koristiti za sve korisnike pri otvaranju svake stranice. */',
-'standard.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Standardno“ */',
-'nostalgia.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Nostalgija“ */',
 'cologneblue.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Kelnsko plava“ */',
 'monobook.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Monobuk“ */',
-'myskin.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste „Moju temu“ */',
-'chick.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Šik“ */',
-'simple.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Prosto“ */',
 'modern.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Savremeno“ */',
 'vector.js' => '/* Javaskript postavljen ovde će se učitati za sve one koji koriste temu „Vektorsko“ */',
 'group-autoconfirmed.js' => '/* Javaskript postavljen ovde će se učitati za samopotvrđene korisnike */',
@@ -3186,6 +3166,7 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-robot-noindex' => 'Ne može da se popiše',
 'pageinfo-views' => 'Broj pregleda',
 'pageinfo-watchers' => 'Broj nadgledača stranica',
+'pageinfo-few-watchers' => 'Manje od $1 {{PLURAL:$1|pratioca|pratilaca}}',
 'pageinfo-redirects-name' => 'Preusmeravanja na stranicu',
 'pageinfo-subpages-name' => 'Podstranice ove stranice',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|preusmerenje|preusmerenja|preusmerenja}}; $3 {{PLURAL:$3|nepreusmerenje|nepreusmerenja|nepreusmerenja}})',
@@ -3210,13 +3191,8 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-protect-cascading-from' => 'Stranice sa prenosivom zaštitom od',
 
 # Skin names
-'skinname-standard' => 'Klasično',
-'skinname-nostalgia' => 'Nostalgija',
 'skinname-cologneblue' => 'Kelnsko plava',
 'skinname-monobook' => 'Monobuk',
-'skinname-myskin' => 'Moja tema',
-'skinname-chick' => 'Šik',
-'skinname-simple' => 'Prosto',
 'skinname-modern' => 'Savremeno',
 'skinname-vector' => 'Vektorsko',
 
@@ -3311,8 +3287,6 @@ Sve daljnje veze u istom redu smatraju se izuzecima.',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3387,7 +3361,7 @@ Ako je prvobitno stanje datoteke promenjeno, moguće je da neki detalji ne opisu
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Širina',
 'exif-imagelength' => 'Visina',
 'exif-bitspersample' => 'Dubina boje',
@@ -3580,7 +3554,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Nesažeto',
 'exif-compression-2' => 'CCITT Group 3 1 – Dimenzionalno izmenjeno Hafmanovo kodiranje po dužini',
 'exif-compression-3' => 'CCITT Group 3 faks kodiranje',
@@ -4096,13 +4070,6 @@ Trebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove op
 'version-entrypoints-header-entrypoint' => 'Ulazna tačka',
 'version-entrypoints-header-url' => 'Adresa',
 
-# Special:FilePath
-'filepath' => 'Putanja datoteke',
-'filepath-page' => 'Datoteka:',
-'filepath-submit' => 'Idi',
-'filepath-summary' => 'Ova posebna stranica prikazuje potpunu putanju datoteke.
-Slike su prikazane u punoj veličini, a druge vrste datoteka se pokreću pomoću njima pridruženim programima.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pretraga duplikata',
 'fileduplicatesearch-summary' => 'Pretraga dupliranih datoteka prema vrednostima disperzije.',
index 0b23f31..7aca717 100644 (file)
@@ -179,8 +179,6 @@ $messages = array(
 'tog-enotifminoredits' => 'E-mail mi fu pikin kenki fu peprewoysi opo mi sirey',
 'tog-enotifrevealaddr' => 'Sori mi e-mail nen ini den e-mail boskopu',
 'tog-shownumberswatching' => 'Sori omeni kebroikiman e tan luku a papira disi',
-'tog-externaleditor' => 'Tan kebroiki wan dorosey kenki-wrokosani (soso gi sabiman - spesrutu seti de fanowdu gi disi)',
-'tog-externaldiff' => 'Tan kebroiki wan dorosey agersi-wrokosani (soso gi sabiman - spesrutu set de fanowdu gi disi)',
 'tog-showjumplinks' => 'Sori den "go na" miti',
 'tog-uselivepreview' => 'Kebroiki "wanten sori-na-fesi" (JavaScript – ondrosuku fasi)',
 'tog-forceeditsummary' => 'Gi wan boskopu efu a "Syatu" boksu leygi',
@@ -641,14 +639,6 @@ A kan ben trowe efu dribi.
 'searchhelp-url' => 'Help:San de',
 'powersearch' => 'Suku moro dipi',
 
-# Quickbar
-'qbsettings' => 'Kwikbak',
-'qbsettings-none' => 'Nowan',
-'qbsettings-fixedleft' => 'Set na ku',
-'qbsettings-fixedright' => 'Set na pe',
-'qbsettings-floatingleft' => 'Han na ku',
-'qbsettings-floatingright' => 'Han na pe',
-
 # Preferences page
 'preferences' => 'Seti',
 'mypreferences' => 'Mi seti',
@@ -942,7 +932,7 @@ Papira ini [[Special:Watchlist|yu Tan Luku réy]] '''fatu'''.",
 'listusers-submit' => 'Libi si',
 'listusers-noresult' => 'No masyin dyaso.',
 
-# E-mail user
+# Email user
 'mailnologin' => 'No stiradresi',
 'emailuser' => 'E-mail a kebroikiman disi',
 'emailpage' => 'Mayin e-mail',
index 6f58e15..43d5057 100644 (file)
@@ -74,9 +74,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Antaal fon do beooboachtjende Benutsere anwiese',
 'tog-oldsig' => 'Aktuälle Signatuur:',
 'tog-fancysig' => 'Unnerskrift as Wikitext behonnelje (sunner automatiske Ferlinkenge)',
-'tog-externaleditor' => 'Externen Editor as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide. [//www.mediawiki.org/wiki/Manual:External_editors Moor Information hiertou.])',
-'tog-externaldiff' => 'Extern Diff-Program as Standoard benutsje (bloot foar Experte, der mouten spezielle Ienstaalengen ap dän oaine Computer moaked wäide.
- [//www.mediawiki.org/wiki/Manual:External_editors Wiedere Informatione hiertou.])',
 'tog-showjumplinks' => '"Wikselje tou"-Links muugelk moakje',
 'tog-uselivepreview' => 'Live-Foarbekiek nutsje (JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Woarskauje, wan bie dät Spiekerjen ju Touhoopefoatenge failt',
@@ -1022,15 +1019,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'search-external' => 'Externe Säike',
 'searchdisabled' => 'Ju {{SITENAME}} Fultextsäike is weegen Uurläästenge apstuuns deaktivierd. Du koast insteede deerfon ne Google- of Yahoo-Säike startje. Do Resultoate foar {{SITENAME}} speegelje oawers nit uunbedingd dän aktuällen Stand wier.',
 
-# Quickbar
-'qbsettings' => 'Siedenlieste',
-'qbsettings-none' => 'Naan',
-'qbsettings-fixedleft' => 'Links, fääst',
-'qbsettings-fixedright' => 'Gjuchts, fääst',
-'qbsettings-floatingleft' => 'Links, swieuwjend',
-'qbsettings-floatingright' => 'Gjuchts, swieuwjend',
-'qbsettings-directionality' => 'Fääst, ouhongich fon de Skrieuwgjuchte fon ju wäälde Sproake',
-
 # Preferences page
 'preferences' => 'Ienstaalengen',
 'mypreferences' => 'Ienstaalengen',
@@ -1525,7 +1513,6 @@ Uut Sicherhaidsgruunde is img_auth.php deaktivierd.',
 'http-read-error' => 'HTTP-Leesefailer.',
 'http-timed-out' => 'Tied is ferron bie ju HTTP-Anfroage.',
 'http-curl-error' => 'Failer bier dän Ouroup fon ju URL: $1',
-'http-host-unreachable' => 'URL is nit tou beloangjen',
 'http-bad-status' => 'Unner ju HTTP-Anfroage is n Failer aptreeden: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1907,8 +1894,8 @@ Wan du die Artikkel wier fon ju Foulgelieste ou hoalje moatest, klik ap ju Siede
 'notvisiblerev' => 'Version wuude läsked',
 'watchnochange' => 'Neen fon do Sieden, do du beooboachtest, wuude in dän läästen Tiedruum beoarbaided.',
 'watchlist-details' => 'Jie beooboachtje {{PLURAL:$1|1 Siede|$1 Sieden}} (Diskussionssieden wuuden hier nit meetäld).',
-'wlheader-enotif' => 'E-Mail-Beskeed is aktivierd.',
-'wlheader-showupdated' => "Sieden, do ätter dien lääste Besäik annerd wuuden sunt, wäide '''fat''' deerstoald.",
+'wlheader-enotif' => 'E-Mail-Beskeed is aktivierd.',
+'wlheader-showupdated' => "Sieden, do ätter dien lääste Besäik annerd wuuden sunt, wäide '''fat''' deerstoald.",
 'watchmethod-recent' => 'Uurpröiwjen fon do lääste Beoarbaidengen foar ju Beooboachtengslieste',
 'watchmethod-list' => 'Uurpröiwjen fon ju Beooboachtengslieste ätter lääste Beoarbaidengen',
 'watchlistcontains' => 'Jou Beooboachtengslieste änthaalt $1 {{PLURAL:$1|Siede|Sieden}}.',
@@ -2696,7 +2683,7 @@ Wiedere wäide standoardmäitich nit anwiesd.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bratte',
 'exif-imagelength' => 'Laangte',
 'exif-bitspersample' => 'Bits pro Faawenkomponente',
@@ -2854,7 +2841,7 @@ Wiedere wäide standoardmäitich nit anwiesd.
 'exif-copyrighted' => 'Uurhieuwergjuchtstoatus',
 'exif-copyrightowner' => 'Uurhieuwergjuchtsienhääber',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Uunkomprimierd',
 
 'exif-unknowndate' => 'Uunbekoand Doatum',
@@ -3186,12 +3173,6 @@ Ne [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie fon ju ''GNU General Public License''
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
 
-# Special:FilePath
-'filepath' => 'Doatäipaad',
-'filepath-page' => 'Doatäi:',
-'filepath-submit' => 'Gung',
-'filepath-summary' => 'Mäd disse Spezialsiede lät sik die komplette Paad fon ju aktuelle Version fon ne Doatäi sunner Uumwai oufräigje. Ju anfräigede Doatäi wäd fluks deerstoald blw. mäd ju ferknätte Anweendenge started.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Doatäi-Duplikoat-Säike',
 'fileduplicatesearch-summary' => 'Säike ätter Doatäi-Duplikoate ap Basis fon hieren Hash-Wäid.',
index 2c8b70a..23fa02b 100644 (file)
@@ -159,8 +159,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Témbongkeun jumlah nu ngawaskeun',
 'tog-oldsig' => 'Paraf nu geus aya:',
 'tog-fancysig' => 'Témbongkeun paraf salaku wikitext (tanpa tumbu otomatis)',
-'tog-externaleditor' => 'Paké éditor éxternal dumasar asalna (ukur pikeun nu ahli, perlu sétingan husus dina komputer anjeun. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Paké diff éxternal dumasar asalna (ukur pikeun nu ahli, perlu sétingan husus dina komputer anjeun. [//www.mediawiki.org/wiki/Manual:External_editors Émbaran lengkep.])',
 'tog-showjumplinks' => 'Aktifkeun tumbu panyambung "luncat ka"',
 'tog-uselivepreview' => 'Paké pramidang saharita (JavaScript) (ujicoba)',
 'tog-forceeditsummary' => 'Mun kotak ringkesan éditan masih kosong, béjaan!',
@@ -175,6 +173,7 @@ $messages = array(
 'tog-showhiddencats' => 'Témbongkeun kategori nyumput',
 'tog-noconvertlink' => 'Non-aktifkeun konvérsi judul tumbu',
 'tog-norollbackdiff' => 'Liwat béda sanggeus malikkeun révisi',
+'tog-useeditwarning' => 'Béjaan kuring lamun ninggalkeun kaca édit anu parobahanana can disimpen',
 
 'underline-always' => 'Salawasna',
 'underline-never' => 'Ulah',
@@ -1089,14 +1088,6 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
 'search-external' => 'Panéangan luar',
 'searchdisabled' => 'Punten! Néangan téks lengkep di {{SITENAME}} kanggo samentawis ditumpurkeun pikeun alesan kinerja. Jalaran kitu, saheulaanan anjeun bisa nyungsi di Google di handap ieu. Catet yén indéxna ngeunaan eusi {{SITENAME}} bisa jadi teu mutahir.',
 
-# Quickbar
-'qbsettings' => 'Bar gancang',
-'qbsettings-none' => 'Henteu aya',
-'qbsettings-fixedleft' => 'Angger beulah kenca',
-'qbsettings-fixedright' => 'Angger beulah katuhu',
-'qbsettings-floatingleft' => 'Ngambang ka kenca',
-'qbsettings-floatingright' => 'Ngambang ka katuhu',
-
 # Preferences page
 'preferences' => 'Préferénsi',
 'mypreferences' => 'Préferéns',
@@ -1533,7 +1524,6 @@ Pariksa heula jujutan hapusanana saméméh neruskeun ngamuat deui éta berkas.',
 # HTTP errors
 'http-invalid-url' => 'URL teu bener: $1',
 'http-invalid-scheme' => 'URL anu skémana "$1" teu karojong',
-'http-host-unreachable' => 'URL teu kahontal.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL teu kahontal',
@@ -1883,8 +1873,8 @@ Jaga, parobahan na kaca ieu katut kaca obrolanana bakal dibéréndélkeun di din
 'notvisiblerev' => 'Révisi geus dihapus',
 'watchnochange' => 'Sadaya awaseun anjeun taya nu diédit dina jangka wanci nu ditémbongkeun.',
 'watchlist-details' => 'Aya {{PLURAL:$1|$1 kaca|$1 kaca}} nu ku anjeun diawaskeun, teu kaasup kaca obrolan/sawala.',
-'wlheader-enotif' => 'Pangémbar surélék difungsikeun.',
-'wlheader-showupdated' => "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
+'wlheader-enotif' => 'Pangémbar surélék difungsikeun.',
+'wlheader-showupdated' => "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
 'watchmethod-recent' => 'mariksa nu anyar robah na kaca nu diawaskeun',
 'watchmethod-list' => 'mariksa nu anyar robah na kaca nu diawaskeun',
 'watchlistcontains' => 'Anjeun ngawaskeun $1 {{PLURAL:$1|kaca|kaca}}.',
@@ -2551,7 +2541,7 @@ Nu séjénna bakal disumputkeun sakumaha asalna.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lega',
 'exif-imagelength' => 'Luhur',
 'exif-compression' => 'Skéma komprési',
@@ -2963,11 +2953,6 @@ Coba ku sawangan normal.',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Vérsi',
 
-# Special:FilePath
-'filepath' => 'Jalur koropak',
-'filepath-page' => 'Koropak:',
-'filepath-submit' => 'Jalur',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sungsi gambar duplikat',
 'fileduplicatesearch-legend' => 'Sungsi duplikat',
index 21438e3..34c47dc 100644 (file)
  * @author M.M.S.
  * @author MagnusA
  * @author Micke
+ * @author Mikez
  * @author NH
  * @author Najami
+ * @author Nemo bis
  * @author Nghtwlkr
  * @author Ozp
  * @author Per
@@ -349,9 +351,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Visa antalet användare som bevakar',
 'tog-oldsig' => 'Nuvarande signatur:',
 'tog-fancysig' => 'Rå signatur som wikitext (utan en automatisk länk)',
-'tog-externaleditor' => 'Använd extern editor som standard (endast för avancerade användare, speciella inställningar på din dator krävs. [//www.mediawiki.org/wiki/Manual:External_editors Mer information.])',
-'tog-externaldiff' => 'Använd externt diff-verktyg som förval (endast för avancerade användare, kräver speciella inställningar i din dator.
-[//www.mediawiki.org/wiki/Manual:External_editors Mer information.])',
 'tog-showjumplinks' => 'Aktivera "hoppa till"-tillgänglighetslänkar',
 'tog-uselivepreview' => 'Använd direktuppdaterad förhandsgranskning (Javascript, på försöksstadiet)',
 'tog-forceeditsummary' => 'Påminn mig om jag inte fyller i en redigeringskommentar',
@@ -366,6 +365,7 @@ $messages = array(
 'tog-showhiddencats' => 'Visa dolda kategorier',
 'tog-noconvertlink' => 'Stäng av konvertering av sidtitlar',
 'tog-norollbackdiff' => 'Visa inte diff efter tillbakarullning',
+'tog-useeditwarning' => 'Varna mig om jag lämnar en redigeringssida där jag gjort ändringar men inte sparat.',
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldrig',
@@ -429,6 +429,18 @@ $messages = array(
 'oct' => 'okt',
 'nov' => 'nov',
 'dec' => 'dec',
+'january-date' => '$1 januari',
+'february-date' => '$1 februari',
+'march-date' => '$1 mars',
+'april-date' => '$1 april',
+'may-date' => '$1 maj',
+'june-date' => '$1 juni',
+'july-date' => '$1 juli',
+'august-date' => '$1 augusti',
+'september-date' => '$1 september',
+'october-date' => '$1 oktober',
+'november-date' => '$1 november',
+'december-date' => '$1 december',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
@@ -734,9 +746,18 @@ Observera att det, tills du tömmer din webbläsares cache, på vissa sidor kan
 'welcomecreation-msg' => 'Ditt konto har skapats.
 Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].',
 'yourname' => 'Användarnamn:',
+'userlogin-yourname' => 'Användarnamn',
+'userlogin-yourname-ph' => 'Ange ditt användarnamn',
 'yourpassword' => 'Lösenord:',
+'userlogin-yourpassword' => 'Lösenord',
+'userlogin-yourpassword-ph' => 'Ange ditt lösenord',
+'createacct-yourpassword-ph' => 'Ange ett lösenord',
 'yourpasswordagain' => 'Upprepa lösenord',
+'createacct-yourpasswordagain' => 'Bekräfta lösenordet',
+'createacct-yourpasswordagain-ph' => 'Ange lösenordet igen',
 'remembermypassword' => 'Spara min inloggning på den här datorn (i max $1 {{PLURAL:$1|dygn|dygn}})',
+'userlogin-remembermypassword' => 'Håll mig inloggad',
+'userlogin-signwithsecure' => 'Använd säker anslutning',
 'securelogin-stick-https' => 'Fortsätt vara ansluten till HTTPS efter inloggning',
 'yourdomainname' => 'Din domän',
 'password-change-forbidden' => 'Du kan inte ändra lösenord på denna wiki.',
@@ -749,18 +770,38 @@ Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].
 'logout' => 'Logga ut',
 'userlogout' => 'Logga ut',
 'notloggedin' => 'Inte inloggad',
+'userlogin-noaccount' => 'Har du inget konto?',
+'userlogin-joinproject' => 'Gå med i {{SITENAME}}',
 'nologin' => "Har du inget användarkonto? '''$1'''.",
 'nologinlink' => 'Skapa ett användarkonto',
 'createaccount' => 'Skapa ett konto',
 'gotaccount' => "Har du redan ett användarkonto? '''$1'''.",
 'gotaccountlink' => 'Logga in',
 'userlogin-resetlink' => 'Har du glömt dina inloggningsuppgifter?',
-'createaccountmail' => 'Använd ett tillfällig slumpartat lösenord och skicka den till e-postadressen som anges nedan',
+'userlogin-resetpassword-link' => 'Återställ ditt lösenord',
+'helplogin-url' => 'Help:Logga in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Hjälp med inloggning]]',
+'createacct-join' => 'Ange din information nedan.',
+'createacct-emailrequired' => 'E-postadress',
+'createacct-emailoptional' => 'E-postadress (valfritt)',
+'createacct-email-ph' => 'Bekräfta din e-postadress',
+'createaccountmail' => 'Använd ett tillfälligt slumpvis valt lösenord och skicka det till e-postadressen som anges nedan',
+'createacct-realname' => 'Riktigt namn (valfritt)',
 'createaccountreason' => 'Orsak:',
+'createacct-reason' => 'Anledning',
+'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-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' => 'senaste {{PLURAL:$1|bidragsgivare}}',
 'badretype' => 'De lösenord du uppgett överensstämmer inte med varandra.',
 'userexists' => 'Det valda användarnamnet används redan.
 Var god välj ett annat namn.',
 'loginerror' => 'Inloggningsproblem',
+'createacct-error' => 'Fel när konto skulle skapas',
 'createaccounterror' => 'Kunde inte skapa konto: $1',
 'nocookiesnew' => 'Användarkontot skapades, men du är inte inloggad.
 {{SITENAME}} använder cookies för att logga in användare.
@@ -844,13 +885,13 @@ Vänta innan du försöker igen.',
 'resetpass-wrong-oldpass' => 'Ogiltigt tillfälligt eller nuvarande lösenord.
 Du kanske redan har lyckats ändra ditt lösenord eller begärt ett nytt tillfälligt lösenord.',
 'resetpass-temp-password' => 'Tillfälligt lösenord:',
+'resetpass-abort-generic' => 'Lösenordsändring av har avbrutits av ett tillägg.',
 
 # Special:PasswordReset
 'passwordreset' => 'Lösenordsåterställning',
-'passwordreset-text' => 'Fyll i detta formulär för att återställa ditt lösenord.',
 'passwordreset-legend' => 'Återställ lösenord',
 'passwordreset-disabled' => 'Lösenordsåterställning har inaktiverats på denna wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ange en av datadelarna nedan}}',
+'passwordreset-emaildisabled' => 'E-postfunktioner har inaktiverats på denna wiki.',
 'passwordreset-username' => 'Användarnamn:',
 'passwordreset-domain' => 'Domän:',
 'passwordreset-capture' => 'Visa resulterande e-post?',
@@ -873,7 +914,7 @@ Du bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna
 Tillfälligt lösenord: $2',
 'passwordreset-emailsent' => 'En lösenordsåterställning via e-post har skickats.',
 '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 användaren: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Ändra e-postadress',
@@ -1085,12 +1126,15 @@ Den gav ingen förklaring.',
 Det verkar som att den har raderats.',
 'edit-conflict' => 'Redigeringskonflikt.',
 'edit-no-change' => 'Din redigering ignorerades, eftersom ingen ändring gjordes i texten.',
+'postedit-confirmation' => 'Din redigering sparades.',
 'edit-already-exists' => 'Sidan kunde inte skapas.
 Den finns redan.',
 'defaultmessagetext' => 'Standardtext för meddelande',
 'content-failed-to-parse' => 'Det gick inte att parsa $2 innehåll för $1 modell: $3',
 'invalid-content-data' => 'Ogiltig innehållsdata',
 'content-not-allowed-here' => 'innehåll av "$1" är inte tillåtet på sidan [[$2]]',
+'editwarning-warning' => 'Om du lämnar den här sidan kommer du att förlora alla ändringar du har gjort.
+Om du är inloggad kan du slå av den här varningen under "{{int:prefs-editing}}" i dina inställningar.',
 
 # Content models
 'content-model-wikitext' => 'wikitext',
@@ -1376,15 +1420,7 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'searchdisabled' => 'Sökfunktionen på {{SITENAME}} är avstängd.
 Du kan istället göra sökningar med hjälp av Google.
 Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
-
-# Quickbar
-'qbsettings' => 'Snabbmeny',
-'qbsettings-none' => 'Ingen',
-'qbsettings-fixedleft' => 'Fast vänster',
-'qbsettings-fixedright' => 'Fast höger',
-'qbsettings-floatingleft' => 'Flytande vänster',
-'qbsettings-floatingright' => 'Flytande höger',
-'qbsettings-directionality' => 'Fast, beroende på riktningen av ditt skript och språk',
+'search-error' => 'Ett fel uppstod under sökningen: $1',
 
 # Preferences page
 'preferences' => 'Inställningar',
@@ -1528,6 +1564,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'userrights-notallowed' => 'Ditt konto har inte behörighet till att lägga till eller ta bort användarrättigheter.',
 'userrights-changeable-col' => 'Grupper du kan ändra',
 'userrights-unchangeable-col' => 'Grupper du inte kan ändra',
+'userrights-conflict' => 'Användarrättighetskonflikt! Var god tillämpa dina ändringar igen.',
 
 # Groups
 'group' => 'Grupp:',
@@ -1941,7 +1978,6 @@ För optimal säkerhet, har img_auth.php blivit avaktiverad.',
 'http-read-error' => 'HTTP-läsfel.',
 'http-timed-out' => 'Time out för HTTP-begäran.',
 'http-curl-error' => 'Fel vid hämtning av URL: $1',
-'http-host-unreachable' => 'URL:en kunde inte nås.',
 'http-bad-status' => 'Det uppstod ett problem under HTTP-begäran: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2350,8 +2386,8 @@ Framtida ändringar av den här sidan och dess diskussionssida kommer att listas
 'notvisiblerev' => 'Sidversionen har raderats',
 'watchnochange' => 'Inga av dina bevakade sidor har ändrats inom den visade tidsperioden.',
 'watchlist-details' => 'Du har $1 {{PLURAL:$1|sida|sidor}} på din bevakningslista (diskussionssidor är inte medräknade).',
-'wlheader-enotif' => '* Bekräftelse per e-post är aktiverad.',
-'wlheader-showupdated' => "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
+'wlheader-enotif' => 'E-postmeddelanden är aktiverade.',
+'wlheader-showupdated' => "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
 'watchmethod-recent' => 'letar efter bevakade sidor bland senaste ändringar',
 'watchmethod-list' => 'letar efter nyligen gjorda ändringar bland bevakade sidor',
 'watchlistcontains' => 'Din bevakningslista innehåller $1 {{PLURAL:$1|sida|sidor}}.',
@@ -2391,7 +2427,7 @@ Kontakta användaren:
 e-post: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Såvida du inte besöker sidan, kommer du inte att få flera meddelanden om ändringar av sidan.
+Såvida du inte besöker sidan, kommer du inte att få flera meddelanden om aktivitet på sidan.
 Du kan också ta bort flaggan för meddelanden om ändringar på alla sidor i din bevakningslista.
 
 Hälsningar från {{SITENAME}}s meddelandesystem
@@ -2761,6 +2797,7 @@ Se [[Special:BlockList|blockeringslistan]] för en översikt av gällande blocke
 'sorbsreason' => 'Din IP-adress är listad som öppen proxy i den DNSBL {{SITENAME}} använder.',
 'sorbs_create_account_reason' => 'Din IP-adress är listad som en öppen proxy i den DNSBL som används av {{SITENAME}}.
 Du får inte skapa ett användarkonto',
+'xffblockreason' => 'En IP-adress i sidhuvudet X-Forwarded-For, antingen din adress eller en proxyserver som du använder, har blockerats. Den ursprungliga anledningen till blockeringen var: $1',
 'cant-block-while-blocked' => 'Du kan inte blockera andra användare medan du är blockerad.',
 'cant-see-hidden-user' => 'Användaren du försöker blockera är redan blockerad och gömd. Eftersom du inte har hideuser-rättigheter, kan du inte se eller redigera användarens blockering.',
 'ipbblocked' => 'Du kan inte blockera eller avblockera andra användare, eftersom du själv är blockerad',
@@ -2892,7 +2929,7 @@ I det senare fallet kan du även använda en länk, exempel [[{{#Special:Export}
 'exportcuronly' => 'Inkludera endast den nuvarande versionen, inte hela historiken',
 'exportnohistory' => "----
 '''OBS:''' export av fullständig sidhistorik med hjälp av detta formulär har stängts av på grund av prestandaskäl.",
-'exportlistauthors' => 'Innehålla en fullständig lista över bidragsgivare för varje sida',
+'exportlistauthors' => 'Inkludera en fullständig lista över bidragsgivare för varje sida',
 'export-submit' => 'Exportera',
 'export-addcattext' => 'Lägg till sidor från kategori:',
 'export-addcat' => 'Lägg till',
@@ -2923,6 +2960,8 @@ Besök [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] eller [//t
 'thumbnail-more' => 'Förstora',
 'filemissing' => 'Fil saknas',
 'thumbnail_error' => 'Fel vid skapande av miniatyrbild: $1',
+'thumbnail_error_remote' => 'Felmeddelande från $1:
+$2',
 'djvu_page_error' => 'DjVu-sida utanför gränserna',
 'djvu_no_xml' => 'Kan inte hämta DjVu-filens XML',
 'thumbnail-temp-create' => 'Kunde inte skapa temporär miniatyrfil',
@@ -3073,17 +3112,11 @@ Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
 
 # Stylesheets
 'common.css' => '/* CSS som skrivs här påverkar alla skal */',
-'standard.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Standard */',
-'nostalgia.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Nostalgi */',
 'cologneblue.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Cologne blå */',
 'monobook.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Monobook */',
-'myskin.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Mitt utseende */',
-'chick.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Chick */',
-'simple.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Enkel */',
 'modern.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Modern */',
 'vector.css' => '/* CSS som skrivs här kommer att påverka alla användare av skalet Vector */',
 'print.css' => '/* CSS som skrivs här kommer att påverka utskriftsversionen */',
-'handheld.css' => '/* CSS som placeras här kommer att påverka handhållna enheter som baseras på skalet som konfigurerats i $wgHandheldStyle */',
 'noscript.css' => '/* CSS som placeras här kommer att påverka användare med JavaScript inaktiverat */',
 'group-autoconfirmed.css' => '/* CSS som placeras här kommer bara att påverka bekräftade användare */',
 'group-bot.css' => '/* CSS som placeras här kommer bara att påverka robotar */',
@@ -3092,13 +3125,8 @@ Ger möjlighet att skriva en motivering i redigeringssammanfattningen',
 
 # Scripts
 'common.js' => '/* JavaScript som skrivs här körs varje gång en användare laddar en sida. */',
-'standard.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Standard */',
-'nostalgia.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Nostalgi */',
 'cologneblue.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Cologne blå */',
 'monobook.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Monobook */',
-'myskin.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Mitt utseende */',
-'chick.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Chick */',
-'simple.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Enkel */',
 'modern.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Modern */',
 'vector.js' => '/* JavaScript här kommer att laddas för dem som använder skalet Vector */',
 'group-autoconfirmed.js' => '/* JavaScript här kommer att laddas för bekräftade användare */',
@@ -3178,13 +3206,8 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'pageinfo-category-files' => 'Antal filer',
 
 # Skin names
-'skinname-standard' => 'Standard',
-'skinname-nostalgia' => 'Nostalgi',
 'skinname-cologneblue' => 'Cologne blå',
 'skinname-monobook' => 'Monobook',
-'skinname-myskin' => 'Mitt utseende',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Enkel',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3264,11 +3287,25 @@ Om du kör den kan din dator skadas.",
 'minutes' => '{{PLURAL:$1|$1 minut|$1 minuter}}',
 'hours' => '{{PLURAL:$1|$1 timme|$1 timmar}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'weeks' => '{{PLURAL:$1|$1 vecka|$1 veckor}}',
 'months' => '{{PLURAL:$1|$1 månad|$1 månader}}',
 'years' => '{{PLURAL:$1|$1 år}}',
 'ago' => '$1 sedan',
 'just-now' => 'precis nu',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|timme|timmar}} sedan',
+'minutes-ago' => '$1 {{PLURAL:$1|minut|minuter}} sedan',
+'seconds-ago' => '$1 {{PLURAL:$1|sekund|sekunder}} sedan',
+'monday-at' => 'Måndag kl. $1',
+'tuesday-at' => 'Tisdag kl. $1',
+'wednesday-at' => 'Onsdag kl. $1',
+'thursday-at' => 'Torsdag kl. $1',
+'friday-at' => 'Fredag kl. $1',
+'saturday-at' => 'Lördag kl. $1',
+'sunday-at' => 'Söndag kl. $1',
+'yesterday-at' => 'Igår kl. $1',
+
 # Bad image list
 'bad_image_list' => 'Listan fungerar enligt följande:
 
@@ -3297,7 +3334,7 @@ Andra kommer att gömmas som standard
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Bredd',
 'exif-imagelength' => 'Höjd',
 'exif-bitspersample' => 'Bitar per komponent',
@@ -3475,7 +3512,7 @@ Andra kommer att gömmas som standard
 'exif-originalimageheight' => 'Bildens höjd innan den beskärdes',
 'exif-originalimagewidth' => 'Bildens bredd innan den beskärdes',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Inte komprimerad',
 'exif-compression-2' => 'CCITT Grupp 3 1-dimensionell modifierad Huffman-skurlängdskodning',
 'exif-compression-3' => 'CCITT Grupp 3 fax-kodning',
@@ -3888,16 +3925,21 @@ Du bör ha fått [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopia av GNU General Publi
 'version-software' => 'Installerad programvara',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
-'version-entrypoints' => 'StartpunktsURLer',
-'version-entrypoints-header-entrypoint' => 'Ingångspunkt',
+'version-entrypoints' => 'Startpunkts-URL:er',
+'version-entrypoints-header-entrypoint' => 'Startpunkt',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Sökväg till fil',
-'filepath-page' => 'Fil:',
-'filepath-submit' => 'Sökväg',
-'filepath-summary' => 'Den här specialsidan ger den fullständiga sökvägen till en fil.
-Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som är associerade till dem.',
+# Special:Redirect
+'redirect' => 'Omdirigering efter filnamn, användar-ID eller versions-ID',
+'redirect-legend' => 'Omdirigera till en fil eller sida',
+'redirect-summary' => 'Den här specialsidan omdirigerar till en fil (efter filnamn), en sida (efter versions-id) eller en användarsida (efter användar-id).',
+'redirect-submit' => 'Kör',
+'redirect-lookup' => 'Slå upp:',
+'redirect-value' => 'Värde:',
+'redirect-user' => 'Användar-ID',
+'redirect-revision' => 'Sidversion',
+'redirect-file' => 'Filnamn',
+'redirect-not-exists' => 'Värdet hittades inte',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sök efter dubblettfiler',
@@ -3988,23 +4030,26 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 'htmlform-submit' => 'Spara',
 'htmlform-reset' => 'Ogör ändringar',
 'htmlform-selectorother-other' => 'Andra',
+'htmlform-no' => 'Nej',
+'htmlform-yes' => 'Ja',
+'htmlform-chosen-placeholder' => 'Välj ett alternativ',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 med stöd för fulltextsökning',
 'sqlite-no-fts' => '$1 utan stöd för fulltextsökning',
 
 # New logging system
-'logentry-delete-delete' => '$1 raderade sidan $3',
-'logentry-delete-restore' => '$1 återställde sidan $3',
-'logentry-delete-event' => '$1 ändrade synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
-'logentry-delete-revision' => '$1 ändrade synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
-'logentry-delete-event-legacy' => '$1 ändrade synligheten för logghändelser på $3',
-'logentry-delete-revision-legacy' => '$1 ändrade synligheten för versioner på sidan $3',
-'logentry-suppress-delete' => '$1 gömde sidan $3',
-'logentry-suppress-event' => '$1 ändrade i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
-'logentry-suppress-revision' => '$1 ändrade synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
-'logentry-suppress-event-legacy' => '$1 ändrade synligheten i hemlighet för logghändelser på $3',
-'logentry-suppress-revision-legacy' => '$1 ändrade synligheten i hemlighet för versioner på sidan $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|raderade}} sidan $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|återställde}} sidan $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten för logghändelser på $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten för versioner på sidan $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|gömde}} sidan $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2|ändrade}} i hemlighet synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för logghändelser på $3',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|ändrade}} synligheten i hemlighet för versioner på sidan $3',
 'revdelete-content-hid' => 'innehåll dolt',
 'revdelete-summary-hid' => 'redigeringssammanfattning dold',
 'revdelete-uname-hid' => 'användarnamn dolt',
@@ -4013,10 +4058,10 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 'revdelete-uname-unhid' => 'användarnamn synligt',
 'revdelete-restricted' => 'satte begränsningar för administratörer',
 'revdelete-unrestricted' => 'tog bort begränsningar för administratörer',
-'logentry-move-move' => '$1 flyttade sidan $3 till $4',
-'logentry-move-move-noredirect' => '$1 flyttade sidan $3 till $4 utan att lämna en omdirigering',
-'logentry-move-move_redir' => '$1 flyttade sidan $3 till $4 över en omdirigering',
-'logentry-move-move_redir-noredirect' => '$1 flyttade sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
+'logentry-move-move' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 utan att lämna en omdirigering',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 över en omdirigering',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|flyttade}} sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
 'logentry-patrol-patrol' => '$1 {{GENDER:$2|markerade}} versionen $4 av sidan $3 som patrullerad',
 'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|markerade}} automatiskt versionen $4 av sidan $3 som patrullerad',
 'logentry-newusers-newusers' => 'Användarkonto $1 har {{GENDER:$2|skapats}}',
index 2a7c956..367e3cd 100644 (file)
@@ -14,6 +14,7 @@
  * @author Malangali
  * @author Marcos
  * @author Muddyb Blast Producer
+ * @author Nemo bis
  * @author Robert Ullmann
  * @author Stephenwanjau
  * @author לערי ריינהארט
@@ -154,8 +155,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Onyesha idadi ya watumiaji waangalizi',
 'tog-oldsig' => 'Sahihi iliyopo:',
 'tog-fancysig' => 'Weka sahihi tu (bila kujiweka kiungo yenyewe)',
-'tog-externaleditor' => 'Tumia kiharirio cha nje inaposhindikana (kwa wataalamu tu, inahitaji marekebisho maalum kwenye tarakilishi yako. [//www.mediawiki.org/wiki/Manual:External_editors Maelezo zaidi.])',
-'tog-externaldiff' => 'Tumia diff za nje inaposhindikana (kwa wataalamu tu, inahitaji marekebisho maalum kwenye tarakilishi yako. [//www.mediawiki.org/wiki/Manual:External_editors Maelezo zaidi.])',
 'tog-showjumplinks' => 'Wezesha "ruka hadi" viungo vya mafikio',
 'tog-uselivepreview' => 'Tumia kihakikio cha papohapo (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Nishtue pale ninapoingiza muhtasari mtupu wa kuhariri',
@@ -170,6 +169,7 @@ $messages = array(
 'tog-showhiddencats' => 'Onyesha jamii zilizofichwa',
 'tog-noconvertlink' => 'Lemaza kiungo cha jina la badiliko',
 'tog-norollbackdiff' => 'Ondoa faili za diff baada ya kufanyakazi ya kurejesha',
+'tog-useeditwarning' => 'Unionyeshe ilani ninapotaka kutoka kwenye ukurasa ninouhariri, bila kuhifadhi mabadiliko',
 
 'underline-always' => 'Muda wote',
 'underline-never' => 'Kamwe',
@@ -233,9 +233,21 @@ $messages = array(
 'oct' => 'Okt',
 'nov' => 'Nov',
 'dec' => 'Des',
+'january-date' => '$1 Januari',
+'february-date' => '$1 Februari',
+'march-date' => '$1 Machi',
+'april-date' => '$1 Aprili',
+'may-date' => '$1 Mei',
+'june-date' => '$1 Juni',
+'july-date' => '$1 Julai',
+'august-date' => '$1 Agosti',
+'september-date' => '$1 Septemba',
+'october-date' => '$1 Oktoba',
+'november-date' => '$1 Novemba',
+'december-date' => '$1 Desemba',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Jamii|Jamii}}',
+'pagecategories' => '{{PLURAL:$1|Jamii}}',
 'category_header' => 'Makala katika jamii "$1"',
 'subcategories' => 'Vijamii',
 'category-media-header' => 'Picha, video, na sauti katika jamii  "$1"',
@@ -258,7 +270,7 @@ $messages = array(
 'newwindow' => '(Itafungua kwa dirisha jipya)',
 'cancel' => 'Batilisha',
 'moredotdotdot' => 'Zaidi...',
-'mypage' => 'Ukurasa wangu',
+'mypage' => 'Ukurasa',
 'mytalk' => 'Majadiliano',
 'anontalk' => 'Majadiliano ya IP hii',
 'navigation' => 'Urambazaji',
@@ -530,7 +542,11 @@ Sababu zilizotolewa ni "\'\'$2\'\'".',
 Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza <span class='plainlinks'>[$1 kuingia tena]</span> kwenye akaunti yako. Kumbuka kwamba kurasa nyingine zitaendelea kuonekana kana kwamba bado hujatoka kwenye akaunti yako, hadi utakaposafisha kache ya kivinjari.",
 'welcomeuser' => 'Karibu, $1!',
 'yourname' => 'Jina la mtumiaji:',
+'userlogin-yourname' => 'Jina la mtumiaji',
+'userlogin-yourname-ph' => 'Weka jina lako la mtumiaji',
 'yourpassword' => 'Neno la siri:',
+'userlogin-yourpassword' => 'Neno la siri',
+'userlogin-yourpassword-ph' => 'Weka neno lako la siri',
 'yourpasswordagain' => 'Andika tena neno la siri',
 'remembermypassword' => 'Kumbuka kuingia kwangu katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)',
 'securelogin-stick-https' => 'Endelea kuunganishwa na HTTPS baada ya kuingia',
@@ -545,6 +561,8 @@ Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza <span c
 'logout' => 'Toka',
 'userlogout' => 'Toka',
 'notloggedin' => 'Hujaingia',
+'userlogin-noaccount' => 'Huna akaunti ya kuingilia?',
+'userlogin-joinproject' => 'Jiunga na {{SITENAME}}',
 'nologin' => "Huna akaunti ya kuingilia? '''$1'''.",
 'nologinlink' => 'Sajili akaunti',
 'createaccount' => 'Sajili akaunti',
@@ -649,10 +667,8 @@ Inawezekana ikawa tayari umefaulu kubadilisha neno lako la siri au neno la siri
 
 # Special:PasswordReset
 'passwordreset' => 'Seti upya neno la siri',
-'passwordreset-text' => 'Jaza fomu hii ili upate barua pepe inayotoa maelezo ya akaunti yako.',
 'passwordreset-legend' => 'Seti upya neno la siri',
 'passwordreset-disabled' => 'Kuweka neno la siri jipya kumeshitishwa katika wiki hii.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ingiza moja kati ya data hizi hapo chini}}',
 'passwordreset-username' => 'Jina la mtumiaji:',
 'passwordreset-domain' => 'Miliki',
 'passwordreset-capture' => 'Ioneshe barua-pepe itakayotumwa?',
@@ -884,6 +900,8 @@ Inaonekana kwamba ukurasa umefutwa.',
 'edit-already-exists' => 'Haikufanikiwa kuanzisha ukurasa mpya.
 Ukurasa wa jina hilo unapatikana tayari.',
 'defaultmessagetext' => 'Ujumbe uliopo',
+'editwarning-warning' => 'Ukitoka kwenye ukurasa huu labda utapoteza madabiliko uliyoyafanya.
+Unaweza kuondoa ilani hii ukienda kwenye sehemu ya "{{int:prefs-editing}}" kwenye mapendekezo yako.',
 
 # Content models
 'content-model-javascript' => 'HatiJava',
@@ -991,7 +1009,7 @@ Wakabidhi wengine wa {{SITENAME}} bado wataweza kuliona lile lililofichwa pamoja
 'revdelete-hide-restricted' => 'Wakabidhi (vilevile wengine) wasiweze kuona data',
 'revdelete-radio-same' => '(isibadilishwe)',
 'revdelete-radio-set' => 'Ndiyo',
-'revdelete-radio-unset' => 'Siyo',
+'revdelete-radio-unset' => 'Hapana',
 'revdelete-suppress' => 'Wakabidhi (vilevile wengine) wasiweze kuona data',
 'revdelete-unsuppress' => 'Uzuio wa kuona mapitio uondolewe, mapitio yanaporudishwa',
 'revdelete-log' => 'Sababu:',
@@ -1122,14 +1140,6 @@ Ukitaka kutafuta kwenye maeneo yote (pamoja na kurasa za majadiliano, vigezo, nk
 Unaweza kutafuta kwa kutumia Google punde si punde.
 Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wakati.',
 
-# Quickbar
-'qbsettings' => 'Mwambaa pembe',
-'qbsettings-none' => 'Hakuna',
-'qbsettings-fixedleft' => 'Kushoto tuli',
-'qbsettings-fixedright' => 'Kulia tuli',
-'qbsettings-floatingleft' => 'Kushoto geugeu',
-'qbsettings-floatingright' => 'Kulia geugeu',
-
 # Preferences page
 'preferences' => 'Mapendekezo',
 'mypreferences' => 'Mapendekezo',
@@ -1609,7 +1619,6 @@ Haliwezi kukaguliwa vilivyo kwa sababu za kiusalama.',
 'http-read-error' => 'Hitilafu ya kusoma HTTP.',
 'http-timed-out' => 'Ombi la HTTP muda umepita.',
 'http-curl-error' => 'Hitilafu ya kuleta URL: $1',
-'http-host-unreachable' => 'KISARA (URL) haikupatikana',
 'http-bad-status' => 'Kulikuwa na tatizo wakati wa kutekeleza ombi la HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2005,8 +2014,8 @@ Ukitaka kufuta ukurasa huo kutoka maangalizi yako baadaye, bonyeza \"Acha kufuat
 'notvisiblerev' => 'Haririo ya mwisho, iliotendwa na mtumiaji mwingine, imefutwa',
 'watchnochange' => 'Hakuna kitu kati ya maangalizi yako kilichohaririwa katika kipindi kilichotajwa.',
 'watchlist-details' => 'Unafuatilia {{PLURAL:$1|ukurasa $1|kurasa $1}} bila kuzingatia kurasa za majadiliano.',
-'wlheader-enotif' => 'Huduma ya kuarifu kwa barua pepe imewezeshwa.',
-'wlheader-showupdated' => "Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa katika hali ya '''kukooza'''",
+'wlheader-enotif' => 'Huduma ya kuarifu kwa barua pepe imewezeshwa.',
+'wlheader-showupdated' => "Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa katika hali ya '''kukooza'''",
 'watchmethod-recent' => 'kupitia madabiliko ya karibuni ili kupata kurasa za maangalizi',
 'watchmethod-list' => 'Kupitia kurasa za maangalizi ili kupata madabiliko ya karibuni',
 'watchlistcontains' => 'Orodha ya maangalizi yako ina {{PLURAL:$1|pages|kurasa}}.',
@@ -2175,7 +2184,7 @@ Hivi ni vipimo kwa ukurasa '''$1''':",
 'undeletebtn' => 'Rudisha',
 'undeletelink' => 'onyesha/rejesha',
 'undeleteviewlink' => 'tazama',
-'undeletereset' => 'Seti upya',
+'undeletereset' => 'Panga upya',
 'undeleteinvert' => 'Geuza uteuzi',
 'undeletecomment' => 'Sababu:',
 'undeletedrevisions' => '{{PLURAL:$1|pitio 1 lilirudishwa|mapitio $1 yalirudishwa}}',
@@ -2243,7 +2252,7 @@ Rejea kumbukumbu ya uzuio ya mwisho inayoandikwa chini:',
 'whatlinkshere-hideredirs' => '$1 maelekezo',
 'whatlinkshere-hidetrans' => '$1 majumuisho',
 'whatlinkshere-hidelinks' => '$1 viungo',
-'whatlinkshere-hideimages' => 'viungo $1 vya faili',
+'whatlinkshere-hideimages' => 'Viungo vya faili $1',
 'whatlinkshere-filters' => 'Machujio',
 
 # Block/unblock
@@ -2668,7 +2677,7 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Upana',
 'exif-imagelength' => 'Urefu',
 'exif-jpeginterchangeformatlength' => 'Idadi ya baiti za data ya JPEG',
@@ -3042,12 +3051,6 @@ Huwa unapokea [{{SERVER}}{{SCRIPTPATH}}/COPYING nakala ya GNU General Public Lic
 'version-software-version' => 'Toleo',
 'version-entrypoints-header-url' => 'KISARA Kioneshi Sanifu Raslimali',
 
-# Special:FilePath
-'filepath' => 'Njia ya faili',
-'filepath-page' => 'Faili:',
-'filepath-submit' => 'Nenda',
-'filepath-summary' => 'Ukurasa huu maalumu unarejesha njia kamili ya faili. Picha inaonyeshwa ukubwa wote, faili za aina zingine zinaanza na programu zake zinazohusiana moja kwa moja.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Tafuta mafaili ya nakili',
 'fileduplicatesearch-summary' => 'Kutafuta mafaili ya nakili kwa kuzingatia thamani za reli.',
@@ -3132,6 +3135,8 @@ Tovuti hii inapata matatatizo wakati huu.',
 'htmlform-submit' => 'Wasilisha',
 'htmlform-reset' => 'Tengua mabadiliko',
 'htmlform-selectorother-other' => 'Nyingine',
+'htmlform-no' => 'Hapana',
+'htmlform-yes' => 'Ndiyo',
 
 # New logging system
 'logentry-delete-delete' => '$1 alifuta ukurasa wa $3',
@@ -3189,12 +3194,12 @@ Tovuti hii inapata matatatizo wakati huu.',
 'api-error-uploaddisabled' => 'Kupakia kumelemazwa katika wiki hii.',
 
 # Durations
-'duration-seconds' => '$1 {{PLURAL:$1|second|sekunde}}',
-'duration-minutes' => '$1 {{PLURAL:$1|minute|dakikas}}',
-'duration-hours' => '$1 {{PLURAL:$1|hour|masaa}}',
-'duration-days' => '$1 {{PLURAL:$1|day|masiku}}',
-'duration-weeks' => '$1 {{PLURAL:$1|week|wiki}}',
-'duration-years' => '$1 {{PLURAL:$1|year|miaka}}',
+'duration-seconds' => '{{PLURAL:$1|sekunde}} $1',
+'duration-minutes' => '{{PLURAL:$1|dakika}} $1',
+'duration-hours' => '{{PLURAL:$1|saa|masaa}} $1',
+'duration-days' => '{{PLURAL:$1|siku}} $1',
+'duration-weeks' => '{{PLURAL:$1|wiki}} $1',
+'duration-years' => '{{PLURAL:$1|mwaka|miaka}} $1',
 'duration-centuries' => '$1 {{PLURAL:$1|century|karne}}',
 
 );
index 03d6c19..4a38133 100644 (file)
@@ -94,8 +94,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Pokoż, wjela sprowjorzy dowo pozůr',
 'tog-oldsig' => 'Teroźni wyglůnd Twojygo szrajbowańo',
 'tog-fancysig' => 'Szrajbńij s kodůma wiki (bez autůmatycznygo linka)',
-'tog-externaleditor' => 'Sztandardowo używej zewnyntrzny edytor (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
-'tog-externaldiff' => 'Sztandardowo używej zewnyntrzny program do filowańo we pomjyńańach (jyno do ekspertůw, trza mjyć ekstra sztalowańy we systymje)',
 'tog-showjumplinks' => 'Zapńij cajchnůndzki "przyńdź do"',
 'tog-uselivepreview' => 'Używej dynamiczne uobźyrańy (JavaScript) (eksperymentalny)',
 'tog-forceeditsummary' => 'Pedź, kejbych ńic ńy naszkryfloł we uopiśe pomjyńań',
@@ -983,14 +981,6 @@ $1',
 'search-external' => 'Šnupańy zewnyntřne',
 'searchdisabled' => 'Šnupańy we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostouo zawarte. Zańim go zouůnčům, možeš sprůbować šnupańo bez Google. Ino zauwaž, co informacyje uo treśći {{GRAMMAR:MS.lp|{{SITENAME}}}} můgům być we Google ńyakuratne.',
 
-# Quickbar
-'qbsettings' => 'Gurt šybkigo dostympu',
-'qbsettings-none' => 'Brak',
-'qbsettings-fixedleft' => 'Stouy, s lewyj',
-'qbsettings-fixedright' => 'Stouy, s prawyj',
-'qbsettings-floatingleft' => 'Unošůncy śe, s lewyj',
-'qbsettings-floatingright' => 'Unošůncy śe, s prawyj',
-
 # Preferences page
 'preferences' => 'Preferyncyje',
 'mypreferences' => 'Moje preferyncyje',
@@ -1693,8 +1683,8 @@ Na tyi liśće bydźeš mjou rejer přišuych sprowjyń tyi zajty i jeji zajty g
 'notvisiblerev' => 'Wersyja zostoua wyćepano',
 'watchnochange' => 'Žodno ze zajtůw, na kere dowoš pozůr, ńy bůua sprowjano w podanym uokreśe.',
 'watchlist-details' => 'Na pozorliśće {{PLURAL:$1|je 1 artikel|sům $1 artikle|je $1 artikli}} ńy rachujůnc zajtůw godek.',
-'wlheader-enotif' => 'Wysůuańy powjadůmjyń na adres e-brif je zouůnčůne',
-'wlheader-showupdated' => "Zajty, kere bouy sprowjane uod Twoi uostatńi wizyty na ńych zostoy naškryflane '''tuustym'''",
+'wlheader-enotif' => 'Wysůuańy powjadůmjyń na adres e-brif je zouůnčůne',
+'wlheader-showupdated' => "Zajty, kere bouy sprowjane uod Twoi uostatńi wizyty na ńych zostoy naškryflane '''tuustym'''",
 'watchmethod-recent' => 'šnupańy za půmjyńanymi na uostatku w zajtach, na kere dowoš pozůr',
 'watchmethod-list' => 'šnupańy w zajtach, na kere dowoš pozůr pośrůd půmjyńanych na uostatku',
 'watchlistcontains' => 'Lista zajtůw, na kere dowoš pozůr mo {{PLURAL:$1|jedna pozycja|$1 pozycje|$1 pozycyji}}.',
@@ -2380,7 +2370,7 @@ Eli plik był modyfikowany, dane mogům w tajli ńy być we zgodźe ze parametr
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Šyrokość',
 'exif-imagelength' => 'Wysokość',
 'exif-bitspersample' => 'Bitůw na průbka',
@@ -2494,7 +2484,7 @@ Eli plik był modyfikowany, dane mogům w tajli ńy być we zgodźe ze parametr
 'exif-gpsdatestamp' => 'Data GPS',
 'exif-gpsdifferential' => 'Korekcyjo růžńicy GPS',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ńyskůmpresowany',
 
 'exif-unknowndate' => 'ńyznano data',
@@ -2786,15 +2776,6 @@ Možeš tyž [[Special:EditWatchlist|užyć standardowygo edytora]].',
 'version-software-product' => 'Mjano',
 'version-software-version' => 'Wersjo',
 
-# Special:FilePath
-'filepath' => 'Śćežka do plika',
-'filepath-page' => 'Plik:',
-'filepath-submit' => 'Śćežka',
-'filepath-summary' => 'Ta ekstra zajta zwraco peuno śćyžka do plika.
-Grafiki sům pokazywane w peunyj rozdźelčośći, inkše typy plikůw sům uodmykane we skojařůnym ś ńimi průgramje.
-
-Naškryflej sam mjano plika bez prefiksu „{{ns:file}}:”.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Šnupej za duplikatym plika',
 'fileduplicatesearch-summary' => 'Šnupej za duplikatůma plika na podstawje wartośći fůnkcyji skrůtu.',
index 2fae26a..6003df4 100644 (file)
@@ -20,6 +20,7 @@
  * @author Mayooranathan
  * @author Naveen
  * @author Planemad
+ * @author Sank
  * @author Shanmugamp7
  * @author Sodabottle
  * @author Sundar
@@ -112,8 +113,6 @@ $messages = array(
 'tog-shownumberswatching' => 'கவனிக்கும் பயனர்களின் எண்ணிக்கையைக் காட்டவும்',
 'tog-oldsig' => 'நடப்பு கையொப்பம்:',
 'tog-fancysig' => 'வெற்றுக் கையொப்பம் (தானியங்கி இணைப்பின்றி)',
-'tog-externaleditor' => 'இயல்பிருப்பாக வெளித் தொகுப்பு மென்பொருளைப் பயன்படுத்து (இது வல்லுநர்களுக்கு மட்டும், உங்கள் கணினியில் சிறப்பு அமைப்புகள் தேவைப்படும் [மேலும் விவரங்களுக்கு //www.mediawiki.org/wiki/Manual:External_editors .])',
-'tog-externaldiff' => 'வெளி வேறுபாட்டை இயல்பிருப்பாகப் பயன்படுத்து (இது வல்லுநர்களுக்கு மட்டும்; உங்கள் கணினியில் சிறப்பு அமைப்புகள் தேவைப்படும் [மேலும் விவரங்களுக்கு //www.mediawiki.org/wiki/Manual:External_editors .])',
 'tog-showjumplinks' => '"தாவிச் செல்லவும்" இணைப்புகளை செயலாக்கவும்',
 'tog-uselivepreview' => 'நேரடி முன்தோற்றத்தைப் பயன்படுத்து (ஜாவாஸ்கிரிப்ட் தேவை) (சோதனையிலுள்ளது)',
 'tog-forceeditsummary' => 'தொகுப்புச் சுருக்கம் வெற்றாக இருக்கும் போது எனக்கு நினைவூட்டு',
@@ -127,6 +126,7 @@ $messages = array(
 'tog-diffonly' => 'மாற்றங்களை ஒப்பிடும் போது அதன் கீழ் பக்க உள்ளடக்கத்தைக் காட்டாதே',
 'tog-showhiddencats' => 'மறைக்கப்பட்ட பகுப்புகளைக் காட்டு',
 'tog-norollbackdiff' => 'முன்பிருந்த நிலைக்குக் கொண்டுவந்தபின் வித்தியாசங்களை விட்டுவிடவும் (காட்டத்தேவையில்லை).',
+'tog-useeditwarning' => 'தொகுத்துக் கொண்டிருக்கும் பக்கத்தை சேமிக்காமல் வெளியேறினால் எனக்கு எச்சரிக்கை செய்',
 
 'underline-always' => 'எப்பொழுதும்',
 'underline-never' => 'எப்போதுமில்லை',
@@ -215,6 +215,7 @@ $messages = array(
 'newwindow' => '(புதிய சாளரத்துள் திறக்கும்)',
 'cancel' => 'சேமிக்காமல் திரும்பு',
 'moredotdotdot' => 'மேலும்...',
+'morenotlisted' => 'மேலதிகமானவை பட்டியலிடப்படவில்லை',
 'mypage' => 'பக்கம்',
 'mytalk' => 'பேச்சு',
 'anontalk' => 'இந்த ஐ.பி. முகவரிக்கான பேச்சு',
@@ -486,9 +487,18 @@ MySQL returned error "$3: $4".',
 'welcomeuser' => 'வருக $1',
 'welcomecreation-msg' => 'உங்களுக்கான பயனர் கணக்கு உருவாக்கப்பட்டுள்ளது. உங்களுக்கேற்றவாறு [[Special:Preferences|{{SITENAME}} விருப்பத்தேர்வுகளை]] மாற்றிக் கொள்ள மறவாதீர்கள்.',
 'yourname' => 'பயனர் பெயர்:',
+'userlogin-yourname' => 'பயனர் பெயர்',
+'userlogin-yourname-ph' => 'தங்களின் பயனர் பெயரை உள்ளிடவும்',
 'yourpassword' => 'கடவுச்சொல்:',
+'userlogin-yourpassword' => 'கடவுச்சொல்',
+'userlogin-yourpassword-ph' => 'தங்களின் கடவுச்சொல்லை உள்ளிடவும்',
+'createacct-yourpassword-ph' => 'கடவுச்சொல்லை உள்ளிடுக',
 'yourpasswordagain' => 'கடவுச்சொல்லைத் திரும்ப தட்டச்சிடுக:',
+'createacct-yourpasswordagain' => 'கடவுச்சொல்லை உறுதிசெய்க',
+'createacct-yourpasswordagain-ph' => 'கடவுச்சொல்லை மீளவும் இடுக',
 'remembermypassword' => 'எனது கடவுச்சொல்லை (கூடியது $1 {{PLURAL:$1|நாள்|நாட்கள்}}) அமர்வுகளிடையே நினைவில் வைத்திருக்கவும்.',
+'userlogin-remembermypassword' => 'இடுபதிந்தே இருக்கவிடவும்',
+'userlogin-signwithsecure' => 'பாதுகாப்பான தொடர்பை உபயோகிக்கவும்',
 'securelogin-stick-https' => 'புகுபதிகைக்குப் பிறகும் HTTPS-இலேயே இருக்கவும்',
 'yourdomainname' => 'உங்கள் உரிமைப்பரப்பு:',
 'password-change-forbidden' => 'நீங்கள் விக்கிகளில் கடவுச் சொற்களை மாற்ற முடியாது',
@@ -501,18 +511,29 @@ MySQL returned error "$3: $4".',
 'logout' => 'விடுபதிகை',
 'userlogout' => 'விடுபதிகை',
 'notloggedin' => 'புகுபதிகை செய்யப்படவில்லை',
+'userlogin-noaccount' => 'பயனர் கணக்கு இல்லையா?',
+'userlogin-joinproject' => 'இணைக {{SITENAME}}',
 'nologin' => "பயனர் கணக்கு இல்லையா? '''$1'''.",
 'nologinlink' => 'கணக்கு ஒன்றை உருவாக்கவும்',
 'createaccount' => 'புதிய கணக்கை உருவாக்கு',
 'gotaccount' => "ஏற்கனவே பயனர் கணக்கு உள்ளதா? '''$1'''.",
 'gotaccountlink' => 'புகுபதிகை',
 'userlogin-resetlink' => 'உங்கள் புகுபதிகைக் குறிப்புகளை மறந்துவிட்டீர்களா?',
-'createaccountmail' => 'மின்னஞ்சல் மூலம்',
+'createacct-join' => 'தங்களின் தகவலை கீழிடவும்',
+'createacct-emailrequired' => 'மின்னஞ்சல் முகவரி',
+'createacct-email-ph' => 'தங்களின் மின்னஞ்சல் முகவரியை உள்ளிடவும்',
+'createaccountmail' => 'தற்காலிகமாக எழுந்தமான ஒரு கடவுச்சொல்லை பயன்படுத்துக, அதை கீழே தரப்பட்டுள்ள மின்னஞ்சலுக்கு அனுப்புக',
+'createacct-realname' => 'உண்மைப் பெயர் (விருப்பத்தேர்வு)',
 'createaccountreason' => 'காரணம்:',
+'createacct-reason-ph' => 'தாங்கள் ஏன் மற்றொரு கணக்கைத் துவங்குகிறீர்கள்?',
+'createacct-imgcaptcha-ph' => 'மேலே காணும் சொற்களை உள்ளிடுக',
+'createacct-submit' => 'தங்களின் கணக்கினை உருவாக்கவும்',
+'createacct-benefit-heading' => '{{SITENAME}} தங்களைப் போன்றோர்களால் உருவாக்கப்பட்டது',
 'badretype' => 'நீங்கள் பதிந்த கடவுச்சொற்கள்  பொருந்தவில்லை.',
 'userexists' => 'உள்ளிட்ட பயனர்பெயர் ஏற்கனவே உபயோகத்தில் உள்ளது.
 தயவுகூர்ந்து வேறு பெயரை தேர்ந்தெடுக்கவும்.',
 'loginerror' => 'புகுபதிகைத் தவறு',
+'createacct-error' => 'கணக்கு உருவாக்குதலில் பிழை',
 'createaccounterror' => 'இந்த கணக்கை உருவாக்க முடியவில்லை: $1',
 'nocookiesnew' => '{{SITENAME}} தளத்துக்கான உங்கள் பயனர் கணக்கு உருவாக்கப்பட்டுள்ளது, ஆனால் நீங்கள் புகுபதிகை செய்யவில்லை. பயனர்களைப் புகுபதிகை செய்ய {{SITENAME}} தளம் ஞாபகிகளைப் (குக்கிகள்) பயன்படுத்துகிறது. நீங்கள் ஞாபகிகளைச் செயலற்றவையாக்கியுள்ளீர்கள். தயவுசெய்து அவற்றைச் செயற்படுத்தியப் பின் உங்கள் புதிய பயனர் பெயருடனும், கடவுச் சொல்லுடனும் புகுபதிகை செய்யுங்கள்.',
 'nocookieslogin' => '{{SITENAME}} தளம் பயனர்களைப் புகுபதிகை செய்வதற்கு ஞாபகிகளைப் (குக்கிகள்) பயன்படுத்துகிறது. நீங்கள் ஞாபகிகளைச் செயலிழக்கச் செய்துள்ளீர்கள். தயவுசெய்து அவற்றைச் செயற்பாடுள்ளதாக்கித் திரும்பவும் முயலுங்கள்.',
@@ -546,7 +567,7 @@ MySQL returned error "$3: $4".',
 'passwordsent' => '"$1" பயனருக்கான மின்னஞ்சல் முகவரிக்கு ஒரு புதிய கடவுச்சொல் அனுப்பப்பட்டுள்ளது. பெற்றுக்கொண்டதும் தயவுசெய்து மீண்டும் புகுபதிகை செய்யவும்.',
 'blocked-mailpassword' => 'உங்கள் ஐ.பி. முகவரி தடுக்கப்பட்டுள்ளது, விசம செயற்பாடுகளைத் தவிர்க்க கடவுச்சொல் மீட்புச் செயலியை நீங்கள் பயன்படுத்து அனுமதிக்கப்படவில்லை.',
 'eauthentsent' => 'உறுதிப்படுத்தல் மின்னஞ்சலொன்று நீங்கள் கொடுத்த மின்னஞ்சல் முகவரிக்கு அனுப்பப் பட்டுள்ளது. மேலதிகமாக எந்த மின்னஞ்சலும் இந்த முகவரிக்கு அனுப்பப்படு முன்னர், மின்னலில் கொடுக்கப்பட்டுள்ள அறிவுறுத்தல்களின் படி, இம்மின்னஞ்சல் முகவரி உங்களுடையது என்பதை உறுதிப்படுத்தவும்.',
-'throttled-mailpassword' => 'கடந்த {{PLURAL:$1|மணிநேரத்துக்குள்|$1 மணிநேரங்களுக்குள்}} ஒரு கடவுச்சொல் நினைவூட்டல் மின்னஞ்சல் ஏற்கனவே அனுப்பப் பட்டுவிட்டது. விசம பயன்பாடுகளைத் தவிர்ப்பதற்காக {{PLURAL:$1|மணிநேரத்திற்கு|$1 மணிநேரங்களுக்கு}} ஒரு கடவுச்சொல் நினைவூட்டல் மின்னஞ்சல் மட்டுமே அனுப்பப்படும்.',
+'throttled-mailpassword' => 'கடந்த {{PLURAL:$1|மணிநேரத்துக்குள்|$1 மணிநேரங்களுக்குள்}} ஒரு கடவுச்சொல் நினைவூட்டல் மின்னஞ்சல் ஏற்கனவே அனுப்பப்பட்டுவிட்டது. விசமப் பயன்பாடுகளைத் தவிர்ப்பதற்காக {{PLURAL:$1|மணிநேரத்திற்கு|$1 மணிநேரங்களுக்கு}} ஒரு கடவுச்சொல் நினைவூட்டல் மின்னஞ்சல் மட்டுமே அனுப்பப்படும்.',
 'mailerror' => 'மின்னஞ்சல் அனுப்புவதில் தவறு: $1',
 'acct_creation_throttle_hit' => 'தங்களது IP முகவரியை பயன்படுத்தி இந்த விக்கியில் நேற்று {{PLURAL:$1|1 கணக்கு |$1 கணக்குகள்}} உருவாக்கப்பட்டுள்ளது.  தற்போது இதுவே மிக அதிகமாக அனுமதிக்கப்பட்ட அளவாகும்.
 
@@ -596,10 +617,8 @@ MySQL returned error "$3: $4".',
 
 # Special:PasswordReset
 'passwordreset' => 'கடவுச்சொல்லை மீட்டமை',
-'passwordreset-text' => ' உங்கள் கடவுச்சொல்லை மீட்டமைக்க இப்படிவத்தை பூர்த்தி செய்யவும்.',
 'passwordreset-legend' => 'கடவுச்சொல்லை மீட்டமை',
 'passwordreset-disabled' => 'கடவுச்சொல் மீட்டமைப்பு இந்த விக்கியில் செயலிழக்க செய்யப்பட்டுள்ளது.',
-'passwordreset-pretext' => '{{PLURAL:$1|| தரவு பகுதி ஒன்றை கீழே உள்ளிடு}}',
 'passwordreset-username' => 'பயனர் பெயர்:',
 'passwordreset-domain' => 'இணையதள முகவரி:',
 'passwordreset-capture' => 'விளைவு மின்னஞ்சலை காண்',
@@ -1083,7 +1102,7 @@ $1",
 'search-interwiki-default' => '$1 தளத்தின் முடிவுகள்:',
 'search-interwiki-more' => '(மேலும்)',
 'search-relatedarticle' => 'தொடர்புடையவை',
-'mwsuggest-disable' => 'AJAX பரிந்துரைகளை முடக்கு',
+'mwsuggest-disable' => 'தேடல் பரிந்துரைகளை முடக்கு',
 'searcheverything-enable' => 'அனைத்துப் பெயர்வெளிகளிலும் தேடவும்',
 'searchrelated' => 'தொடர்புடையவை',
 'searchall' => 'அனைத்தும்',
@@ -1104,15 +1123,7 @@ $1",
 'powersearch-togglenone' => 'ஏதுமில்லை',
 'search-external' => 'வெளித்தேடல்',
 'searchdisabled' => '{{SITENAME}} தளத்தின் தேடல் வசதிகள் தற்காலிகமாக முடக்கப்பட்டுள்ளது. அதுவரை நீங்கள் கீழேயுள்ள கூகிள் தேடலைப் பயன்படுத்தலாம். இது சில சமயம் இற்றைப்படுத்தப்படாததாய் இருக்கக்கூடும்.',
-
-# Quickbar
-'qbsettings' => 'விரைவுச் சட்ட அமைவுகள்',
-'qbsettings-none' => 'எதுவுமில்லை',
-'qbsettings-fixedleft' => 'நிலைத்த இடது',
-'qbsettings-fixedright' => 'நிலைத்த வலது',
-'qbsettings-floatingleft' => 'மிதப்பு இடது',
-'qbsettings-floatingright' => 'மிதப்பு வலது',
-'qbsettings-directionality' => 'உங்கள் மொழியைப் படிக்கும் திசைக்கு ஏற்ப, நிறுவப்பட்டது',
+'search-error' => 'தேடுகையில் ஒரு பிழை ஏற்பட்டுள்ளது:$1',
 
 # Preferences page
 'preferences' => 'விருப்பங்கள்',
@@ -1176,7 +1187,7 @@ $1",
 'timezoneregion-indian' => 'இந்தியப் பெருங்கடல்',
 'timezoneregion-pacific' => 'பசிபிக் பெருங்கடல்',
 'allowemail' => 'ஏனைய பயனர்களிடம் இருந்தான மின்னஞ்சல்களை அனுமதி',
-'prefs-searchoptions' => 'தà¯\87à®\9fà¯\81à®\95',
+'prefs-searchoptions' => 'தà¯\87à®\9fலà¯\8d',
 'prefs-namespaces' => 'பெயர்வெளிகள்',
 'defaultns' => 'அப்படியில்லையென்றால் இந்த பொயர்வெளிகளில் தேடவும்:',
 'default' => 'பொதுவானது',
@@ -1190,8 +1201,8 @@ $1",
 'prefs-textboxsize' => 'தொகுக்கும் சாளரத்தின் அளவு',
 'youremail' => 'மின்னஞ்சல்:',
 'username' => '{{GENDER:$1|பயனர் பெயர்}}:',
-'uid' => '{{பாலினம்:$1|பயனர்}}:',
-'prefs-memberingroups' => 'பின்வரும் {{பன்மை:$1|குழு|குழுக்களில்}} {{பாலினம்:$2|உறுப்பினர்}}:',
+'uid' => '{{GENDER:$1|User}} ID:',
+'prefs-memberingroups' => 'பின்வரும் {{PLURAL:$1|குழு|குழுக்களில்}} உறுப்பினர்:',
 'prefs-registration' => 'பதிவு செய்யும் நேரம்:',
 'yourrealname' => 'உண்மைப் பெயர்:',
 'yourlanguage' => 'மொழி:',
@@ -1635,7 +1646,6 @@ $1',
 'http-read-error' => 'HTTP படிப்பதில் பிழை.',
 'http-timed-out' => 'HTTP கோரியதற்கான நேரம் முடிவடைந்துவிட்டது.',
 'http-curl-error' => '$1 உரலியை பெறுவதில் பிழை நேரிட்டது',
-'http-host-unreachable' => 'இணைய முகவரியை (URL) சென்றடைய முடியவில்லை',
 'http-bad-status' => 'HTTP கோரிக்கையில் பிரச்சினை ஏற்பட்டுள்ளது:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1783,6 +1793,7 @@ $1',
 'disambiguationspage' => 'Template:பக்கவழி நெறிப்படுத்தல்',
 'disambiguations-text' => "பின்வரும் பக்கங்கள் '''பக்கவழி நெறிப்படுத்தல் பக்கத்துக்கு''' இணைக்கப்பட்டுள்ளன. மாறாக இவை பொருத்தமன தலைப்பிற்கு இணைக்கப்பட வேண்டும். <br />[[MediaWiki:Disambiguationspage|பக்கவழி நெறிப்படுத்தல் பக்கங்கத்தில்]] உள்ள வார்ப்புரு இணைக்கப்பட்ட பக்கங்கள்  பக்கவழி நெறிப்படுத்தல் பக்கங்கள் என் கருதப்படும்.",
 
+'pageswithprop' => 'பக்கப் பண்புடைய பக்கங்கள்',
 'pageswithprop-submit' => 'செல்க',
 
 'doubleredirects' => 'இரட்டை வழிமாற்றுகள்',
@@ -2002,7 +2013,7 @@ $1',
 'usermessage-editor' => 'அமைப்பு தூதன்(messenger).',
 
 # Watchlist
-'watchlist' => 'à®\8eனà¯\8d à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலà¯\8d',
+'watchlist' => 'கவனிப்புப் பட்டியல்',
 'mywatchlist' => 'கவனிப்புப் பட்டியல்',
 'watchlistfor2' => '$1 பயனரின் ($2)',
 'nowatchlist' => 'உங்களுடைய கவனிப்புப் பட்டியலில் ஒரு விடயமும் இல்லை.',
@@ -2021,8 +2032,8 @@ $1',
 'notvisiblerev' => 'திருத்தம் நீக்கப்பட்டுள்ளது',
 'watchnochange' => 'காட்சிப்படுத்தப்பட்ட கால இடைவெளியில், கவனிப்பிலுள்ள, உங்கள் விடயமெதுவும் தொகுக்கப்பட்டிருக்கவில்லை.',
 'watchlist-details' => 'பேச்சுப் பக்கங்களைத் தவிர்த்து, {{PLURAL:$1|$1 பக்கம் கவனிக்கப்பட்டது.|$1 பக்கங்கள் கவனிக்கப்பட்டன.}}',
-'wlheader-enotif' => 'மின்னஞ்சல் அறிவித்தல்கள் செயல்படுத்தப்பட்டுள்ளன.',
-'wlheader-showupdated' => "உமது கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களால்''' காட்டப்பட்டுள்ளன",
+'wlheader-enotif' => 'மின்னஞ்சல் அறிவித்தல்கள் செயல்படுத்தப்பட்டுள்ளன.',
+'wlheader-showupdated' => "உமது கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களால்''' காட்டப்பட்டுள்ளன",
 'watchmethod-recent' => 'கவனிக்கப்படுகின்ற பக்கங்களுக்காக, அண்மைய தொகுப்புகள் தேடிப் பார்க்கப்படுகிறன',
 'watchmethod-list' => 'அண்மைய தொகுப்புகளுக்காக, கவனிக்கப்படுகின்ற பக்கங்கள் தேடிப் பார்க்கப்படுகிறன',
 'watchlistcontains' => 'உங்கள் கவனிப்புப் பட்டியல் {{PLURAL:$1|ஒரு பக்கத்தைக்|$1 பக்கங்களைக்}} கொண்டுள்ளது.',
@@ -2151,7 +2162,7 @@ $NEWPAGE
 'protect-default' => 'அனைத்துப் பயனரையும் உள்ளிடு',
 'protect-fallback' => '"$1" அனுமதி தேவை',
 'protect-level-autoconfirmed' => 'புதிய, பதிவு செய்யாத பயனர்களைத் தடை செய்',
-'protect-level-sysop' => 'நிரà¯\81வாà®\95ிà®\95ளà¯\8d à®®à®\9fà¯\8dà®\9fும்',
+'protect-level-sysop' => 'நிரà¯\81வாà®\95ிà®\95ளà¯\88 à®®à®\9fà¯\8dà®\9fà¯\81à®®à¯\8d à®\85னà¯\81மதிà®\95à¯\8dà®\95வும்',
 'protect-summary-cascade' => 'படிநிலை',
 'protect-expiring' => '$1 (UTC) மணிக்கு காலாவதியாகிறது',
 'protect-expiring-local' => 'காலாவதியாகும்$1',
@@ -2216,7 +2227,7 @@ $NEWPAGE
 'undeletedrevisions' => '{{PLURAL:$1|1 திருத்தம் மீட்கப்பட்டது|$1 திருத்தங்கள் மீட்கப்பட்டன}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 திருத்தம்|$1 திருத்தங்கள்}} மற்றும் {{PLURAL:$2|1 கோப்பு|$2 கோப்புகள்}} மீட்கப்பட்டன.',
 'undeletedfiles' => '{{PLURAL:$1|ஒரு கோப்பு மீட்டெடுக்கப்பட்டது|$1 கோப்புகள் மீட்டெடுக்கப்பட்டன}}',
-'cannotundelete' => 'நà¯\80à®\95à¯\8dà®\95à®®à¯\8d à®¤à¯\8bலà¯\8dவி; à®µà¯\87à®±à¯\81 à®¯à®¾à®°à®¾à®µà®¤à¯\81 à®®à¯\81னà¯\8dனதாà®\95 à®\87பà¯\8dபà®\95à¯\8dà®\95தà¯\8dதà¯\88 à®¨à¯\80à®\95à¯\8dà®\95ியிரà¯\81à®\95à¯\8dà®\95லாமà¯\8d.',
+'cannotundelete' => 'à®®à¯\80ளà¯\8dவிதà¯\8dதலà¯\8d à®¤à¯\8bலà¯\8dவி: $1',
 'undeletedpage' => "'''$1 மீட்கப்பட்டது'''
 
 அண்மைய நீக்கல்களுக்கும் மீட்புக்களுக்கும் [[Special:Log/delete|நீக்கல் பதிவைப்]] பார்க்கவும்.",
@@ -2765,8 +2776,6 @@ $1',
 'pageinfo-category-files' => 'கோப்புகளின் எண்ணிக்கை',
 
 # Skin names
-'skinname-standard' => 'இயல்பான',
-'skinname-nostalgia' => 'பசுமை நினைவு (Nostalgia)',
 'skinname-cologneblue' => 'கொலோன் (Cologne) நீலம் Blue',
 
 # Patrolling
@@ -2811,6 +2820,7 @@ $1',
 'file-info-size' => '$1 × $2 படவணுக்கள், கோப்பின் அளவு: $3, MIME வகை: $4',
 'file-nohires' => 'இதைவிட அளவில் பெரிய படிமம் இல்லை.',
 'svg-long-desc' => 'SVG கோப்பு, பெயரளவில் $1 × $2 பிக்சல்கள், கோப்பு அளவு: $3',
+'svg-long-error' => 'செல்லாத SVG கோப்பு: $1',
 'show-big-image' => 'முழு அளவிலான படிமம்',
 'show-big-image-preview' => 'இந்த முன்னோட்டத்தின் அளவு:  $1 .',
 'show-big-image-other' => 'மற்ற  {{PLURAL:$2|பிரிதிறன்|பிரிதிறன்கள்}}:  $1 .',
@@ -2868,7 +2878,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'அகலம்',
 'exif-imagelength' => 'உயரம்',
 'exif-bitspersample' => 'ஒவ்வொரு உறுப்பின்படி பிட்கள்.',
@@ -3045,7 +3055,7 @@ $1',
 'exif-originalimageheight' => 'சரிசெய்யப்படும் முன் படத்தின் உயரம்',
 'exif-originalimagewidth' => 'சரிசெய்யப்படும் முன் படத்தின் அகலம்',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'சுருக்கப்படாத',
 
 'exif-copyrighted-true' => 'பதிப்புரிமைப்பட்டது',
@@ -3441,12 +3451,10 @@ $5
 'version-entrypoints-header-entrypoint' => 'நுழைவு புள்ளி',
 'version-entrypoints-header-url' => 'உரலி (URL)',
 
-# Special:FilePath
-'filepath' => 'கோப்பு வழி',
-'filepath-page' => 'கோப்பு:',
-'filepath-submit' => 'செல்',
-'filepath-summary' => 'இச்சிறப்புப் பக்கம் கோப்பு ஒன்றுக்கான முழுமையான முகவரியை பெற்றுக் கொடுக்கிறது.
-படிமங்கள் அவற்றின் முழு அளவில் காட்டபடுவதோடு ஏனைய கோப்புகள் அவற்றுக்கான மென்பொருளில் நேரடியாகத் திறக்கப்படும்.',
+# Special:Redirect
+'redirect-submit' => 'செல்க',
+'redirect-lookup' => 'கவனிக்கவும்:',
+'redirect-not-exists' => 'மதிப்பு காணப்பெறவில்லை',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'நகல் கோப்புகளைத் தேடுக',
@@ -3473,7 +3481,7 @@ $5
 'specialpages-group-highuse' => 'உயர் பயன்பாட்டு பக்கங்கள்',
 'specialpages-group-pages' => 'பக்கங்களின் பட்டியல்கள்',
 'specialpages-group-pagetools' => 'பக்கக் கருவிகள்',
-'specialpages-group-wiki' => 'விà®\95à¯\8dà®\95ி à®¤à®°à®µà¯\81 à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®\95à®°à¯\81விà®\95ளà¯\8d',
+'specialpages-group-wiki' => 'தரவு மற்றும் கருவிகள்',
 'specialpages-group-redirects' => 'சிறப்புப் பக்கங்கள் வழிமாற்றம் செய்யப்படுகின்றது',
 'specialpages-group-spam' => 'எரித கருவிகள்',
 
@@ -3493,14 +3501,14 @@ $5
 
 # Special:Tags
 'tags' => 'செல்லத்தக்க மாற்று குறிச்சொற்கள்',
-'tag-filter' => '[[Special:Tags|Tag]] [[சிறப்பு:மேற்கோள்கள்|மேற்கோள்]] வடிப்பான்:',
+'tag-filter' => '[[Special:Tags|குறொச்சொல்]] வடிப்பான்:',
 'tag-filter-submit' => 'வடிகட்டி',
 'tags-title' => 'குறிச்சொற்கள்',
 'tags-intro' => 'இப்பக்கத்தின் மென்பொருள் ஒரு திருத்ததுடனான குறியீடு என்று குறிச்சொற்கள், மற்றும் அவற்றின் பொருளை பட்டியலிடுகிறது.',
-'tags-tag' => 'à®\95à¯\81றிà®\9aà¯\8dà®\9aà¯\8aà®±à¯\8dà®\95ளினà¯\8d à®ªà¯\86யர்',
-'tags-display-header' => ' மாற்று பட்டியல்களின் தோற்றங்கள்',
-'tags-description-header' => 'à®\85à®°à¯\8dதà¯\8dததà¯\8dதினà¯\8d à®®à¯\81à®´à¯\81 விளக்கம்',
-'tags-hitcount-header' => 'à®\95à¯\81றிà®\9aà¯\8dà®\9aà¯\8aலà¯\8dலிà®\9fபà¯\8dபà®\9fà¯\8dà®\9f  à®®à®¾à®±à¯\8dà®±à®\99à¯\8dà®\95ளà¯\8d',
+'tags-tag' => 'à®\95à¯\81றிà®\9aà¯\8dà®\9aà¯\8aல்',
+'tags-display-header' => 'கவனிப்புப் பட்டியலில் தெரியும் பெயர்',
+'tags-description-header' => 'விரிவான விளக்கம்',
+'tags-hitcount-header' => 'மாறà¯\8dà®±à®\99à¯\8dà®\95ளினà¯\8d à®\8eணà¯\8dணிà®\95à¯\8dà®\95à¯\88',
 'tags-edit' => 'தொகு',
 'tags-hitcount' => '$1 {{PLURAL:$1|மாற்றம்|மாற்றங்கள்}}',
 
@@ -3537,6 +3545,7 @@ $5
 'htmlform-submit' => 'சமர்ப்பி',
 'htmlform-reset' => 'மாற்றங்களை இல்லாது செய்',
 'htmlform-selectorother-other' => 'மற்றவை',
+'htmlform-chosen-placeholder' => 'விருப்பத்தினைத் தேர்க',
 
 # SQLite database support
 'sqlite-has-fts' => '$1முழு-உரை தேடல் ஆதரவுடன்',
index 6fad2e8..3498739 100644 (file)
@@ -43,8 +43,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ಪುಟೊನು ತೂವೊಂದುಪ್ಪುನಂಚಿನ ಸದಸ್ಯೆರ್’ನ ಸಂಖ್ಯೆನ್ ತೊಜ್ಪಾಲೆ',
 'tog-oldsig' => 'ಇತ್ತೆದ ಸಹಿ',
 'tog-fancysig' => 'ಸರಳ ಸಹಿಗಳು (ಲಿಂಕ್ ಇಜ್ಜಂದಿಲೆಕ)',
-'tog-externaleditor' => 'ಯಾಪಲ ಪಿದಯಿದ ಸಂಪಾದನೆ ಉಪಕರಣದ ಉಪಯೋಗ ಮನ್ಪುಲೆ (ಅನುಭವ ಉಪ್ಪುನಂಚಿನ ಸದಸ್ಯೆರೆಗ್ ಮಾತ್ರ, ನಿಕ್ಲೆನ ಕಂಪ್ಯೂಟರ್’ಡ್ ವಿಶೇಷವಾಯಿನ ಬದಲಾವಣೆಲು ಬೋಡಾಪುಂಡು)',
-'tog-externaldiff' => 'ಬಾಹ್ಯ ಮುನ್ನೋಟನ್ ಯಾಪಲ ಉಪಯೋಗ ಮಲ್ಪುಲೆ (ಅನುಭವ ಉಪ್ಪುನಂಚಿನ ಸದಸ್ಯೆರೆಗ್ ಮಾತ್ರ, ನಿಕ್ಲೆನ ಕಂಪ್ಯೂಟರ್’ಡ್ ವಿಶೇಷ ಬದಲಾವಣೆಲು ಬೋಡಾಪುಂಡು)',
 'tog-uselivepreview' => 'ನೇರ ಮುನ್ನೋಟನ್ ಉಪಯೋಗ ಮಲ್ಪುಲೆ (JavaScript) (ಪ್ರಾಯೋಗಿಕ)',
 'tog-forceeditsummary' => 'ಸಂಪಾದನೆ ಸಾರಾಂಶೊನು ಖಾಲಿ ಬುಡ್’ನ್ಡ್ ಎಂಕ್ ನೆನಪು ಮಲ್ಪುಲೆ',
 'tog-watchlisthideown' => 'ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಎನ್ನ ಸಂಪಾದನೆಲೆನ್ ತೊಜ್’ಪಾವೊಚಿ',
@@ -777,7 +775,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(ಸದಸ್ಯೆರ್ನ ಪಟ್ಟಿ)',
 
-# E-mail user
+# Email user
 'emailuser' => 'ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೈಲ್ ಕಡಪುಡ್ಲೆ',
 
 # Watchlist
index 7dbcac1..5163720 100644 (file)
@@ -174,8 +174,6 @@ $messages = array(
 'tog-shownumberswatching' => 'వీక్షకుల సంఖ్యను చూపించు',
 'tog-oldsig' => 'ప్రస్తుత సంతకం:',
 'tog-fancysig' => 'సంతకాన్ని వికీపాఠ్యంగా తీసుకో (ఆటోమెటిక్‌ లింకు లేకుండా)',
-'tog-externaleditor' => 'మామూలుగా బయటి ఎడిటరును వాడు (నిపుణులకు మాత్రమే. మీ కంప్యూటర్లో ప్రత్యేక అమరికలు అవసరమవుతాయి. [//www.mediawiki.org/wiki/Manual:External_editors మరింత సమాచారం.])',
-'tog-externaldiff' => 'మార్పులను చూడటానికి బయటి సాఫ్టువేరును వాడు (నిపుణులకు మాత్రమే, మీ కంప్యూటర్లో ప్రత్యేక అమరికలు అవసరమవుతాయి. [//www.mediawiki.org/wiki/Manual:External_editors మరింత సమాచారం.])',
 'tog-showjumplinks' => '"ఇక్కడికి గెంతు" లింకులను చూపించు',
 'tog-uselivepreview' => 'రాస్తున్నదానిని ఎప్పటికప్పుడు సరిచూడండి (జావాస్క్రిప్టు) (పరీక్షాదశలో ఉంది)',
 'tog-forceeditsummary' => 'దిద్దుబాటు సారాంశం ఖాళీగా ఉంటే ఆ విషయాన్ని నాకు సూచించు',
@@ -189,6 +187,7 @@ $messages = array(
 'tog-diffonly' => 'తేడాలను చూపిస్తున్నపుడు, కింద చూపించే పేజీలోని సమాచారాన్ని చూపించొద్దు',
 'tog-showhiddencats' => 'దాచిన వర్గాలను చూపించు',
 'tog-norollbackdiff' => 'రద్దు చేసాక తేడాలు చూపించవద్దు',
+'tog-useeditwarning' => 'ఏదైనా పేజీని నేను వదిలివెళ్తున్నప్పుడు దానిలో భద్రపరచని మార్పులు ఉంటే నన్ను హెచ్చరించు',
 
 'underline-always' => 'ఎల్లప్పుడూ',
 'underline-never' => 'ఎప్పటికీ వద్దు',
@@ -342,7 +341,7 @@ $messages = array(
 'talkpage' => 'ఈ పేజీని చర్చించండి',
 'talkpagelinktext' => 'చర్చ',
 'specialpage' => 'ప్రత్యేక పేజీ',
-'personaltools' => 'తన పనిముట్లు',
+'personaltools' => 'à°µà±\8dà°¯à°\95à±\8dతిà°\97à°¤ పనిముట్లు',
 'postcomment' => 'కొత్త విభాగం',
 'articlepage' => 'విషయపు పేజీని చూడండి',
 'talk' => 'చర్చ',
@@ -405,7 +404,7 @@ $1',
 'retrievedfrom' => '"$1" నుండి వెలికితీశారు',
 'youhavenewmessages' => 'మీకు $1 ఉన్నాయి ($2).',
 'newmessageslink' => 'కొత్త సందేశాలు',
-'newmessagesdifflink' => 'à°\95à±\8dà°°à°¿à°¤à°\82 à°¸à°\82à°\9aà°¿à°\95à°¤à±\8b à°\97à°² à°¤à±\87డాలు',
+'newmessagesdifflink' => 'à°\9aివరి à°®à°¾à°°à±\8dà°ªు',
 'youhavenewmessagesfromusers' => 'మీకు {{PLURAL:$3|మరో వాడుకరి|$3 వాడుకరుల}} నుండి $1 ($2).',
 'youhavenewmessagesmanyusers' => 'మీకు చాలా వాడుకరుల నుండి $1 ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|ఒక కొత్త సందేశం వచ్చింది|కొత్త సందేశాలు ఉన్నాయి}}',
@@ -552,9 +551,17 @@ $2',
 *వికీని త్వరగా అర్థం చేసుకునేందుకు [[వికీపీడియా:5 నిమిషాల్లో వికీ|5 నిమిషాల్లో వికీ]] పేజీని చూడండి.
 *తెలుగులో రాసేందుకు ఇంగ్లీషు అక్షరాల ఉచ్ఛారణతో తెలుగు టైపు చేసే [[వికీపీడియా:టైపింగు సహాయం| టైపింగ్  సహాయం]] వాడవచ్చు. మరిన్ని ఉపకరణాల కొరకు [[కీ బోర్డు]] మరియు   తెరపై తెలుగు సరిగా లేకపోతే[[వికీపీడియా:Setting up your browser for Indic scripts|ఈ పేజీ]]  చూడండి.',
 'yourname' => 'వాడుకరి పేరు:',
+'userlogin-yourname' => 'వాడుకరి పేరు',
+'userlogin-yourname-ph' => 'మీ వాడుకరి పేరును ఇవ్వండి',
 'yourpassword' => 'సంకేతపదం:',
+'userlogin-yourpassword' => 'సంకేతపదం',
+'userlogin-yourpassword-ph' => 'మీ సంకేతపదాన్ని ఇవ్వండి',
+'createacct-yourpassword-ph' => 'సంకేతపదాన్ని ఇవ్వండి',
 'yourpasswordagain' => 'సంకేతపదాన్ని మళ్ళీ ఇవ్వండి:',
+'createacct-yourpasswordagain' => 'సంకేతపదాన్ని నిర్ధారించండి',
+'createacct-yourpasswordagain-ph' => 'సంకేతపదాన్ని మళ్ళీ ఇవ్వండి',
 'remembermypassword' => 'ఈ కంప్యూటరులో నా ప్రవేశాన్ని గుర్తుంచుకో (గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజుల}}కి)',
+'userlogin-remembermypassword' => 'నన్ను ప్రవేశింపజేసి ఉంచు',
 'securelogin-stick-https' => 'ప్రవేశం తర్వాత కూడా HTTPSకి అనుసంధానమై ఉండు',
 'yourdomainname' => 'మీ డోమైను',
 'password-change-forbidden' => 'ఈ వికీలో మీరు సంకేతపదాలను మార్చలేరు.',
@@ -567,23 +574,38 @@ $2',
 'logout' => 'నిష్క్రమించు',
 'userlogout' => 'నిష్క్రమించు',
 'notloggedin' => 'లోనికి ప్రవేశించి లేరు',
-'nologin' => "ఖాతా లేదా? '''$1'''.",
+'userlogin-noaccount' => 'మీకు ఖాతా లేదా?',
+'userlogin-joinproject' => '{{SITENAME}}లో చేరండి',
+'nologin' => 'ఖాతా లేదా? $1.',
 'nologinlink' => 'ఖాతాని సృష్టించుకోండి',
 'createaccount' => 'ఖాతాని సృష్టించు',
-'gotaccount' => "ఇప్పటికే మీకు ఖాతా ఉందా? '''$1'''.",
+'gotaccount' => 'ఇప్పటికే మీకు ఖాతా ఉందా? $1.',
 'gotaccountlink' => 'ప్రవేశించండి',
 'userlogin-resetlink' => 'మీ ప్రవేశ వివరాలను మరచిపోయారా?',
-'createaccountmail' => 'ఈ-మెయిలు ద్వారా',
+'createacct-join' => 'మీ సమాచారాన్ని క్రింద ఇవ్వండి.',
+'createacct-emailrequired' => 'ఈమెయిలు చిరునామా',
+'createacct-emailoptional' => 'ఈమెయిలు చిరునామా (ఐచ్చికం)',
+'createacct-email-ph' => 'మీ ఈమెయిలు చిరునామాను ఇవ్వండి',
+'createaccountmail' => 'తాత్కాలిక యాదృచ్చిక సంకేతపదాన్ని వాడి దాన్ని ఈ క్రింద ఇచ్చిన ఈమెయిలు చిరునామాకు పంపించు',
+'createacct-realname' => 'అసలు పేరు (ఐచ్చికం)',
 'createaccountreason' => 'కారణం:',
+'createacct-reason' => 'కారణం',
+'createacct-reason-ph' => 'మీరు మరో ఖాతాను ఎందుకు సృష్టించుకుంటున్నారు',
+'createacct-captcha' => 'భద్రతా తనిఖీ',
+'createacct-imgcaptcha-ph' => 'పైన కనబడే మాటలను ఇక్కడ ఇవ్వండి',
+'createacct-submit' => 'మీ ఖాతాను సృష్టించుకోండి',
+'createacct-benefit-heading' => '{{SITENAME}}ను తయారుచేసేది మీలాంటి ప్రజలే.',
+'createacct-benefit-body1' => '{{PLURAL:$1|మార్పు|మార్పులు}}',
+'createacct-benefit-body2' => '{{PLURAL:$1|పేజీ|పేజీలు}}',
 'badretype' => 'మీరు ఇచ్చిన రెండు సంకేతపదాలు ఒకదానితో మరొకటి సరిపోలడం లేదు.',
 'userexists' => 'ఇచ్చిన వాడుకరిపేరు ఇప్పటికే వాడుకలో ఉంది.
 వేరే పేరును ఎంచుకోండి.',
 'loginerror' => 'ప్రవేశంలో పొరపాటు',
 'createaccounterror' => 'ఖాతాని సృష్టించలేకపోయాం: $1',
-'nocookiesnew' => 'ఖాతాని సృష్టించాం, కానీ ఇంకా లోనికి ప్రవేశించలేదు.
+'nocookiesnew' => 'à°\96ాతాని à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°¾à°\82, à°\95ానà±\80 à°®à±\80à°°à±\81 à°\87à°\82à°\95à°¾ à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°²à±\87à°¦à±\81.
 వాడుకరుల ప్రవేశానికి {{SITENAME}} కూకీలను వాడుతుంది.
 మీరు కూకీలని అచేతనం చేసివున్నారు.
-దయà°\9aà±\87సి à°µà°¾à°\9fిని à°\9aà±\87తనà°\82à°\9aà±\87సి, à°\85à°ªà±\8dà°ªà±\81à°¡à±\81 à°®à±\80 à°\95à±\8aà°¤à±\8dà°¤ à°µà°¾à°¡à±\81à°\95à°°à°¿పేరు మరియు సంకేతపదాలతో లోనికి ప్రవేశించండి.',
+దయà°\9aà±\87సి à°µà°¾à°\9fిని à°\9aà±\87తనà°\82à°\9aà±\87సి, à°®à±\80 à°\95à±\8aà°¤à±\8dà°¤ à°µà°¾à°¡à±\81à°\95à°°à°¿ పేరు మరియు సంకేతపదాలతో లోనికి ప్రవేశించండి.',
 'nocookieslogin' => 'వాడుకరుల ప్రవేశానికై {{SITENAME}} కూకీలను వాడుతుంది.
 మీరు కుకీలని అచేతనం చేసివున్నారు.
 వాటిని చేతనంచేసి ప్రయత్నించండి.',
@@ -701,6 +723,7 @@ $2
 'changeemail-oldemail' => 'ప్రస్తుత ఈ-మెయిలు చిరునామా:',
 'changeemail-newemail' => 'కొత్త ఈ-మెయిలు చిరునామా:',
 'changeemail-none' => '(ఏమీలేదు)',
+'changeemail-password' => 'మీ {{SITENAME}} సంకేతపదం:',
 'changeemail-submit' => 'ఈ-మెయిల్ మార్చు',
 'changeemail-cancel' => 'రద్దుచేయి',
 
@@ -719,7 +742,7 @@ $2
 'nowiki_tip' => 'వికీ ఫార్మాటును పట్టించుకోవద్దు',
 'image_tip' => 'పొదిగిన ఫైలు',
 'media_tip' => 'దస్త్రపు లంకె',
-'sig_tip' => 'à°\9fà±\88à°\82à°¸à±\8dà°\9fà°¾à°\82à°ªà±\81తో సహా మీ సంతకం',
+'sig_tip' => 'సమయà°\82తో సహా మీ సంతకం',
 'hr_tip' => 'అడ్డగీత (అరుదుగా వాడండి)',
 
 # Edit pages
@@ -742,19 +765,19 @@ $2
 'summary-preview' => 'మీరు రాసిన సారాంశం:',
 'subject-preview' => 'విషయం/శీర్షిక మునుజూపు:',
 'blockedtitle' => 'సభ్యునిపై నిరోధం అమలయింది',
-'blockedtext' => '\'\'\'మీ వాడుకరి పేరుని లేదా ఐ.పీ. చిరునామాని నిరోధించారు.\'\'\'
+'blockedtext' => "'''మీ వాడుకరి పేరుని లేదా ఐ.పీ. చిరునామాని నిరోధించారు.'''
 
 నిరోధించినది $1.
-అందుకు ఇచ్చిన కారణం: \'\'$2\'\'
+అందుకు ఇచ్చిన కారణం: ''$2''
 
 * నిరోధం మొదలైన సమయం: $8
 * నిరోధించిన కాలం: $6
 * నిరోధానికి గురైనవారు: $7
 
-ఈ నిరోధంపై చర్చించేందుకు $1ను గాని, మరెవరైనా [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గాని సంప్రదించండి.
-à°®à±\80 [[Special:Preferences|à°\96ాతా à°\85à°­à°¿à°°à±\81à°\9aà±\81లలà±\8b]] à°¸à°°à±\88à°¨ à°\88-à°®à±\86యిలà±\81 à°\9aà°¿à°°à±\81నామా à°\87à°\9aà±\8dà°\9aà°¿à°µà±\81à°\82à°\9fà±\87 à°¤à°ªà±\8dà°ª, "à°\88 à°¸à°­à±\8dà°¯à±\81నిà°\95à°¿ à°\88-à°®à±\86యిలà±\81 à°ªà°\82à°ªà±\81" à°\85à°¨à±\87 à°\85à°\82శానà±\8dని à°µà°¾à°¡à±\81à°\95à±\8bà°²à±\87రని à°\97మనిà°\82à°\9aà°\82à°¡à°¿. à°\86 à°\85à°\82శానà±\8dని à°µà°¾à°¡à±\81à°\95à±\8bవడà°\82à°²à±\8b à°®à±\80à°ªà±\88 à°¨à°¿à°°à±\8bà°§à°\82 à°²à±\87à°¦ు.
-మీ ప్రస్తుత ఐ.పీ. చిరునామా $3, మరియు నిరోధపు ID $5.
-మీ సంప్రదింపులన్నిటిలోనూ వీటిని పేర్కొనండి.',
+ఈ నిరోధంపై చర్చించేందుకు మీరు $1ను గాని, మరెవరైనా [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గాని సంప్రదించవచ్చు.
+à°®à±\80 [[Special:Preferences|à°\96ాతా à°\85à°­à°¿à°°à±\81à°\9aà±\81లలà±\8b]] à°¸à°°à±\88à°¨ à°\88-à°®à±\86యిలà±\81 à°\9aà°¿à°°à±\81నామా à°\87à°\9aà±\8dà°\9aà°¿à°µà±\81à°\82à°¡à°\95à°ªà±\8bయినా à°²à±\87దా à°®à°¿à°®à±\8dమలà±\8dని  'à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿à°\95à°¿ à°\88-à°®à±\86యిలà±\81 à°ªà°\82à°ªà±\81' à°¸à±\8cలభà±\8dయానà±\8dని à°µà°¾à°¡à±\81à°\95à±\8bవడà°\82 à°¨à±\81à°\82à°¡à°¿ à°¨à°¿à°°à±\8bధిà°\82à°\9aà°¿à°µà±\81à°¨à±\8dనా à°®à±\80à°°à±\81 à°\88à°®à±\86యిలà±\81 à°¦à±\8dవారా à°¸à°\82à°ªà±\8dరదిà°\82à°\9aà°²à±\87à°°ు.
+మీ ప్రస్తుత ఐ.పీ. చిరునామా $3, మరియు నిరోధపు ID #$5.
+మీ సంప్రదింపులన్నిటిలోనూ వీటిని పేర్కొనండి.",
 'autoblockedtext' => 'మీ ఐపీ చిరునామా ఆటోమాటిగ్గా నిరోధించబడింది. ఎందుకంటే ఇదే ఐపీ చిరునామాని ఓ నిరోధిత వాడుకరి ఉపయోగించారు. ఆ వాడుకరిని $1 నిరోధించారు.
 అందుకు ఇచ్చిన కారణం ఇదీ:
 
@@ -887,6 +910,8 @@ $2
 అది ఇప్పటికే ఉంది.',
 'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
 'invalid-content-data' => 'తప్పుడు విషయం',
+'editwarning-warning' => 'ఈ పేజీని వదిలివెళ్ళడం వల్ల మీరు చేసిన మార్పులను కోల్పోయే అవకాశం ఉంది.
+మీరు ప్రవేశించివుంటే, ఈ హెచ్చరికని మీ అభిరుచులలో "మరపులు" అనే విభాగంలో అచేతనం చేసుకోవచ్చు.',
 
 # Content models
 'content-model-wikitext' => 'వికీపాఠ్యం',
@@ -1157,15 +1182,6 @@ $1",
 'search-external' => 'బయటి అన్వేషణ',
 'searchdisabled' => '{{SITENAME}} అన్వేషణ తాత్కాలికంగా పని చెయ్యడం లేదు. ఈలోగా మీరు గూగుల్‌ ఉపయోగించి అన్వేషించవచ్చు. ఒక గమనిక: గూగుల్‌ ద్వారా కాలదోషం పట్టిన ఫలితాలు రావడానికి అవకాశం ఉంది.',
 
-# Quickbar
-'qbsettings' => 'క్విక్‌బార్',
-'qbsettings-none' => 'ఏదీకాదు',
-'qbsettings-fixedleft' => 'స్థిర ఎడమ',
-'qbsettings-fixedright' => 'స్థిర కుడి',
-'qbsettings-floatingleft' => 'ఎడమకు ఒదిగి',
-'qbsettings-floatingright' => 'కుడికి ఒదిగి',
-'qbsettings-directionality' => 'స్థిరం, మీ లిపి మరియు భాషల యొక్క దిశ ఆధారంగా',
-
 # Preferences page
 'preferences' => 'అభిరుచులు',
 'mypreferences' => 'అభిరుచులు',
@@ -1243,10 +1259,10 @@ $1",
 'prefs-textboxsize' => 'దిద్దుబాటు కిటికీ పరిమాణం',
 'youremail' => 'మీ ఈ-మెయిలు*',
 'username' => '{{GENDER:$1|వాడుకరి పేరు}}:',
-'uid' => 'వాడుకరి ID:',
-'prefs-memberingroups' => 'సభà±\8dà°¯à±\81à°²à±\81à°\97à°¾ à°\89à°¨à±\8dà°¨ {{PLURAL:$1|à°\97à±\81à°\82à°ªà±\81|à°\97à±\81à°\82à°ªà±\81లు}}:',
+'uid' => '{{GENDER:$1|వాడుకరి}} ID:',
+'prefs-memberingroups' => 'à°\88 {{PLURAL:$1|à°\97à±\81à°\82à°ªà±\81à°²à±\8b|à°\97à±\81à°\82à°ªà±\81లలà±\8b}} {{GENDER:$2|సభà±\8dà°¯à±\81à°¡à±\81|సభà±\8dà°¯à±\81à°°à°¾లు}}:',
 'prefs-registration' => 'నమోదైన సమయం:',
-'yourrealname' => 'అసలు పేరు*',
+'yourrealname' => 'అసలు పేరు:',
 'yourlanguage' => 'భాష:',
 'yourvariant' => 'విషయపు భాషా వైవిధ్యం:',
 'prefs-help-variant' => 'ఈ వికీ లోని విషయపు పేజీలను చూపించడానికి మీ అభిమత వైవిధ్యం లేదా ఆర్ధోగ్రఫీ.',
@@ -1659,7 +1675,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'http-read-error' => 'HTTP చదువుటలో పొరపాటు.',
 'http-timed-out' => 'HTTP అభ్యర్థనకి కాలం చెల్లింది.',
 'http-curl-error' => 'URLని తేవడంలో పొరపాటు: $1',
-'http-host-unreachable' => 'URLని చేరలేకపోయాం.',
 'http-bad-status' => 'HTTP అభ్యర్ధన చేస్తున్నప్పుడు సమస్య ఉంది: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1726,6 +1741,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'shared-repo-from' => '$1 నుండి',
 'shared-repo' => 'సామూహిక నిక్షేపం',
 'shared-repo-name-wikimediacommons' => 'వికీమీడియా కామన్స్',
+'upload-disallowed-here' => 'ఈ దస్త్రాన్ని మీరు తిరగరాయలేరు.',
 
 # File reversion
 'filerevert' => '$1 ను వెనక్కు తీసుకుపో',
@@ -1776,7 +1792,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'unusedtemplateswlh' => 'ఇతర లింకులు',
 
 # Random page
-'randompage' => 'యాధృచ్ఛిక పేజీ',
+'randompage' => 'యాదృచ్ఛిక పేజీ',
 'randompage-nopages' => 'ఈ క్రింది {{PLURAL:$2|పెరుబరిలో|పెరుబరులలో}} పేజీలు ఏమి లేవు:$1',
 
 # Random redirect
@@ -1808,6 +1824,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'disambiguationspage' => 'Template:అయోమయ నివృత్తి',
 'disambiguations-text' => "కింది పేజీలు '''అయోమయ నివృత్తి''' పేజీకి లింకవుతున్నాయి. కానీ అవి సంబంధిత పేజీకి నేరుగా లింకు అవాలి. <br /> [[MediaWiki:Disambiguationspage]] నుంది లింకు ఉన్న మూసను వాడే పేజీని అయోమయ నివృత్తి పేజీగా భావిస్తారు.",
 
+'pageswithprop-submit' => 'వెళ్ళు',
+
 'doubleredirects' => 'జంట దారిమార్పులు',
 'doubleredirectstext' => 'ఇతర దారిమార్పు పుటలకి తీసుకెళ్ళే దారిమార్పులని ఈ పుట చూపిస్తుంది.
 ప్రతీ వరుసలో మొదటి మరియు రెండవ దారిమార్పులకు లంకెలు, ఆలానే రెండవ దారిమార్పు పుట యొక్క లక్ష్యం ఉన్నాయి. సాధారణంగా ఈ రెండవ దారిమార్పు యొక్క లక్ష్యమే "అసలైనది", అదే మొదటి దారిమార్పు యొక్క లక్ష్యంగా ఉండాలి.
@@ -1831,6 +1849,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|బైటు|బైట్లు}}',
 'ncategories' => '$1 {{PLURAL:$1|వర్గం|వర్గాలు}}',
+'ninterwikis' => '$1 {{PLURAL:$1|అంతర్వికీ|అంతర్వికీలు}}',
 'nlinks' => '$1 {{PLURAL:$1|లింకు|లింకులు}}',
 'nmembers' => '{{PLURAL:$1|ఒక ఉపవర్గం/పేజీ/ఫైలు|$1 ఉపవర్గాలు/పేజీలు/ఫైళ్లు}}',
 'nrevisions' => '{{PLURAL:$1|ఒక సంచిక|$1 సంచికలు}}',
@@ -2026,7 +2045,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'usermessage-editor' => 'వ్యవస్థ సందేశకులు',
 
 # Watchlist
-'watchlist' => 'నా à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా',
+'watchlist' => 'వీక్షణ జాబితా',
 'mywatchlist' => 'వీక్షణ జాబితా',
 'watchlistfor2' => '$1 కొరకు $2',
 'nowatchlist' => 'మీ వీక్షణ జాబితా ఖాళీగా ఉంది.',
@@ -2046,8 +2065,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'notvisiblerev' => 'ఈ కూర్పును తొలగించాం',
 'watchnochange' => 'మీ వీక్షణ జాబితాలోని ఏ పేజీలోనూ ఈ కాల అవధిలో మార్పులు జరగలేదు.',
 'watchlist-details' => 'మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}, చర్చా పేజీలని వదిలేసి.',
-'wlheader-enotif' => 'ఈ-మెయిలు ప్రకటనలు పంపబడతాయి.',
-'wlheader-showupdated' => "మీ గత సందర్శన తరువాత మారిన పేజీలు '''బొద్దు'''గా చూపించబడ్డాయి.",
+'wlheader-enotif' => 'ఈ-మెయిలు ప్రకటనలు పంపబడతాయి.',
+'wlheader-showupdated' => "మీ గత సందర్శన తరువాత మారిన పేజీలు '''బొద్దు'''గా చూపించబడ్డాయి.",
 'watchmethod-recent' => 'వీక్షణ జాబితాలోని పేజీల కొరకు ఇటీవలి మార్పులు పరిశీలించబడుతున్నాయి',
 'watchmethod-list' => 'ఇటీవలి మార్పుల కొరకు వీక్షణ జాబితాలోని పేజీలు పరిశీలించబడుతున్నాయి',
 'watchlistcontains' => 'మీ వీక్షణ జాబితాలో {{PLURAL:$1|ఒక పేజీ ఉంది|$1 పేజీలు ఉన్నాయి}}.',
@@ -2174,7 +2193,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'protect-default' => 'అందరు వాడుకరులను అనుమతించు',
 'protect-fallback' => '"$1" అనుమతి అవసరం',
 'protect-level-autoconfirmed' => 'కొత్త మరియు నమోదుకాని వాడుకరులను నిరోధించు',
-'protect-level-sysop' => 'నిరà±\8dవాహà°\95à±\81à°²à±\81 à°®à°¾à°¤à±\8dà°°à°®à±\87',
+'protect-level-sysop' => 'నిరà±\8dవాహà°\95à±\81లనà±\81 à°®à°¾à°¤à±\8dà°°à°®à±\87 à°\85à°¨à±\81మతిà°\82à°\9aà±\81',
 'protect-summary-cascade' => 'కాస్కేడింగు',
 'protect-expiring' => '$1 (UTC)న కాలంచెల్లుతుంది',
 'protect-expiring-local' => '$1న కాలంచెల్లుతుంది',
@@ -2239,7 +2258,8 @@ $UNWATCHURL కి వెళ్ళండి.
 'undeletedrevisions' => '{{PLURAL:$1|ఒక సంచిక|$1 సంచికల}} పునఃస్థాపన జరిగింది',
 'undeletedrevisions-files' => '{{PLURAL:$1|ఒక కూర్పు|$1 కూర్పులు}} మరియు {{PLURAL:$2|ఒక ఫైలు|$2 ఫైళ్ళ}}ను పునస్థాపించాం',
 'undeletedfiles' => '{{PLURAL:$1|ఒక ఫైలును|$1 ఫైళ్లను}} పునఃస్థాపించాం',
-'cannotundelete' => 'తొలగింపు రద్దు విఫలమైంది; ఆ పేజీ తొలగింపును వేరెవరైనా రద్దు చేసి ఉండవచ్చు.',
+'cannotundelete' => 'తొలగింపు రద్దు విఫలమైంది:
+$1',
 'undeletedpage' => "'''$1 ను పునస్థాపించాం'''
 
 ఇటీవల జరిగిన తొలగింపులు, పునస్థాపనల కొరకు [[Special:Log/delete|తొలగింపు చిట్టా]]ని చూడండి.",
@@ -2304,7 +2324,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'isimage' => 'దస్త్రపు లంకె',
 'whatlinkshere-prev' => '{{PLURAL:$1|మునుపటిది|మునుపటి $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|తరువాతది|తరువాతి $1}}',
-'whatlinkshere-links' => 'â\86\90 à°²à°¿à°\82à°\95à±\81లు',
+'whatlinkshere-links' => 'â\86\90 à°²à°\82à°\95à±\86లు',
 'whatlinkshere-hideredirs' => 'దారిమార్పులను $1',
 'whatlinkshere-hidetrans' => '$1 ట్రాన్స్‌క్లూజన్లు',
 'whatlinkshere-hidelinks' => 'లింకులను $1',
@@ -2326,14 +2346,14 @@ $UNWATCHURL కి వెళ్ళండి.
 'ipbreason' => 'కారణం:',
 'ipbreasonotherlist' => 'ఇతర కారణం',
 'ipbreason-dropdown' => '*సాధారణ నిరోధ కారణాలు
-** అదుపు తప్పిన బాటు
 ** తప్పు సమాచారాన్ని చొప్పించడం
 ** పేజీల్లోని సమాచారాన్ని తీసెయ్యడం
-** à°¬à°¯à°\9fà°¿ à°¸à±\88à°\9fà±\8dà°²à°\95à±\81 à°²à°¿à°\82à°\95à±\81à°²à±\81 à°ªà±\86à°\9fà±\8dà°\9fà°¿ స్పాము చెయ్యడం
+** à°¬à°¯à°\9fà°¿ à°¸à±\88à°\9fà±\8dà°²à°\95à±\81 à°²à°\82à°\95à±\86లతà±\8b స్పాము చెయ్యడం
 ** పేజీల్లోకి చెత్తను ఎక్కించడం
-** బెదిరింపు ప్రవర్తన/వేధింపు
+** బెదిరింపు ప్రవర్తన/వేధింపులు
 ** అనేక ఖాతాలను సృష్టించి దుశ్చర్యకు పాల్పడడం
-** అనుచితమైన వాడుకరిపేరు',
+** అనుచితమైన వాడుకరి పేరు
+** అదుపు తప్పిన బాటు',
 'ipb-hardblock' => 'లాగినై ఉన్న వాడుకరులు ఈ ఐపీ అడ్రసు నుంచి మార్పుచేర్పులు చెయ్యకుండా నిరోధించండి',
 'ipbcreateaccount' => 'ఖాతా సృష్టింపుని నివారించు',
 'ipbemailban' => 'వాడుకరిని ఈ-మెయిల్ చెయ్యకుండా నివారించు',
@@ -2355,7 +2375,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'ipb-blockingself' => 'మిమ్మల్ని మీరే నిరోధించుకోబోతున్నారు! అదే మీ నిశ్చయమా?',
 'ipb-edit-dropdown' => 'నిరోధపు కారణాలను మార్చండి',
 'ipb-unblock-addr' => '$1 పై ఉన్న నిరోధాన్ని తొలగించండి',
-'ipb-unblock' => 'వాడుకరిపేరు లేక ఐపీ అడ్రసుపై ఉన్న నిరోధాన్ని తొలగించండి',
+'ipb-unblock' => 'వాడుకరి పేరుపై లేదా ఐపీ చిరునామాపై ఉన్న నిరోధాన్ని తొలగించండి',
 'ipb-blocklist' => 'అమల్లో ఉన్న నిరోధాలను చూపించు',
 'ipb-blocklist-contribs' => '$1 యొక్క మార్పులు-చేర్పులు',
 'unblockip' => 'సభ్యునిపై నిరోధాన్ని తొలగించు',
@@ -2750,15 +2770,14 @@ $UNWATCHURL కి వెళ్ళండి.
 'pageinfo-toolboxlink' => 'పేజీ సమాచారం',
 'pageinfo-contentpage-yes' => 'అవును',
 'pageinfo-protect-cascading-yes' => 'అవును',
+'pageinfo-category-info' => 'వర్గపు సమాచారం',
+'pageinfo-category-pages' => 'పేజీల సంఖ్య',
+'pageinfo-category-subcats' => 'ఉపవర్గాల సంఖ్య',
+'pageinfo-category-files' => 'దస్త్రాల సంఖ్య',
 
 # Skin names
-'skinname-standard' => 'సంప్రదాయ',
-'skinname-nostalgia' => 'నాస్టాల్జియా',
 'skinname-cologneblue' => 'కలోన్ నీలం',
 'skinname-monobook' => 'మోనోబుక్',
-'skinname-myskin' => 'నాఅలంకారం',
-'skinname-chick' => 'చిక్',
-'skinname-simple' => 'సరళ',
 'skinname-modern' => 'ఆధునిక',
 'skinname-vector' => 'వెక్టర్',
 
@@ -2833,11 +2852,18 @@ $1',
 'minutes' => '{{PLURAL:$1|ఒక నిమిషం|$1 నిమిషాల}}',
 'hours' => '{{PLURAL:$1|ఒక గంట|$1 గంటల}}',
 'days' => '{{PLURAL:$1|ఒక రోజు|$1 రోజుల}}',
+'weeks' => '{{PLURAL:$1|$1 వారం|$1 వారాలు}}',
 'months' => '{{PLURAL:$1|ఒక నెల|$1 నెలల}}',
 'years' => '{{PLURAL:$1|ఒక సంవత్సరం|$1 సంవత్సరాల}}',
 'ago' => '$1 క్రితం',
 'just-now' => 'ఇప్పుడే',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|గంట|గంటల}} క్రితం',
+'minutes-ago' => '$1 {{PLURAL:$1|నిమిషం|నిమిషాల}} క్రితం',
+'seconds-ago' => '$1 {{PLURAL:$1|క్షణం|క్షణాల}} క్రితం',
+'yesterday-at' => 'నిన్న $1కి',
+
 # Bad image list
 'bad_image_list' => 'కింద తెలిపిన తీరులో కలపాలి:
 
@@ -2864,7 +2890,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'వెడల్పు',
 'exif-imagelength' => 'ఎత్తు',
 'exif-bitspersample' => 'ఒక్కో కాంపొనెంటుకు బిట్లు',
@@ -3030,7 +3056,7 @@ $1',
 'exif-originalimageheight' => 'కత్తిరించబడక ముందు బొమ్మ యొక్క ఎత్తు',
 'exif-originalimagewidth' => 'కత్తిరించబడక ముందు బొమ్మ యొక్క వెడల్పు',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'కుదించని',
 
 'exif-copyrighted-true' => 'నకలుహక్కులుకలది',
@@ -3366,8 +3392,8 @@ $5
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} తీసివేశాం:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'à°¸à°\82à°¬à°\82ధిత à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°\9aà±\82పిà°\82à°\9aà±\81',
-'watchlisttools-edit' => 'à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితానà±\81 à°\9aà±\82పిà°\82à°\9aà±\81, à°®à°¾à°°à±\8dà°\9aà±\81',
+'watchlisttools-view' => 'à°¸à°\82à°¬à°\82ధిత à°®à°¾à°°à±\8dà°ªà±\81లనà±\81 à°\9aà±\82à°¡à°\82à°¡à°¿',
+'watchlisttools-edit' => 'à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితానà±\81 à°\9aà±\82à°¡à°\82à°¡à°¿ à°²à±\87దా à°®à°¾à°°à±\8dà°\9aà°\82à°¡à°¿',
 'watchlisttools-raw' => 'ముడి వీక్షణ జాబితాలో మార్పులు చెయ్యి',
 
 # Signatures
@@ -3409,13 +3435,13 @@ $5
 'version-entrypoints-header-entrypoint' => 'ప్రవేశ బిందువు',
 'version-entrypoints-header-url' => 'చిరునామా',
 
-# Special:FilePath
-'filepath' => 'పూర్తి చిరునామా',
-'filepath-page' => '{{ns:file}}:',
-'filepath-submit' => 'వెళ్ళు',
-'filepath-summary' => 'ఈ ప్రత్యేక పేజీలో ఫైళ్ల పేర్లు ఇస్తే వాటి పూర్తి చిరునామలు వస్తాయి. బొమ్మలైతే వాటి పూర్తి సైజుతో తెరుచుకుంటాయి, బొమ్మలు కాని ఇతర ఫైళ్లు వాటి అనుబంధ ప్రోగ్రాములతో తెరుచుకుంటాయి.
-
-పేరుకు ముందు "{{ns:file}}:" అని చేర్చవద్దు.',
+# Special:Redirect
+'redirect-submit' => 'వెళ్ళు',
+'redirect-value' => 'విలువ:',
+'redirect-user' => 'వాడుకరి ID',
+'redirect-revision' => 'పేజీ కూర్పు',
+'redirect-file' => 'దస్త్రపు పేరు',
+'redirect-not-exists' => 'విలువ కనబడలేదు',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ఫైళ్ల మారుప్రతుల కోసం వెతుకు',
@@ -3443,7 +3469,7 @@ $5
 'specialpages-group-highuse' => 'అధిక వాడుక పేజీలు',
 'specialpages-group-pages' => 'పేజీల యొక్క జాబితాలు',
 'specialpages-group-pagetools' => 'పేజీ పనిముట్లు',
-'specialpages-group-wiki' => 'విà°\95à±\80 à°¡à°¾à°\9fà°¾ à°®à°°à°¿à°¯à±\81 à°ªà°¨à°¿à°®à±\81à°\9fà±\8dà°²à±\81',
+'specialpages-group-wiki' => 'డాటా మరియు పనిముట్లు',
 'specialpages-group-redirects' => 'ప్రత్యేక పేజీల దారిమార్పులు',
 'specialpages-group-spam' => 'స్పామ్ పనిముట్లు',
 
@@ -3484,6 +3510,7 @@ $5
 'compare-submit' => 'పోల్చిచూడు',
 'compare-invalid-title' => 'మీరు ఇచ్చిన శీర్షిక చెల్లనిది.',
 'compare-title-not-exists' => 'మీరు పేర్కొన్న శీర్షిక లేనే లేదు.',
+'compare-revision-not-exists' => 'మీరు పేర్కొన్న కూర్పు లేనే లేదు.',
 
 # Database error messages
 'dberr-header' => 'ఈ వికీ సమస్యాత్మకంగా ఉంది',
@@ -3505,6 +3532,8 @@ $5
 'htmlform-submit' => 'దాఖలుచెయ్యి',
 'htmlform-reset' => 'మార్పులను రద్దుచెయ్యి',
 'htmlform-selectorother-other' => 'ఇతర',
+'htmlform-no' => 'కాదు',
+'htmlform-yes' => 'అవును',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 పూర్తి-పాఠ్య అన్వేషణ తోడ్పాటుతో',
index 4104810..4f0223c 100644 (file)
@@ -377,7 +377,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'currentrevisionlink' => 'Versaun atuál',
 'cur' => 'atuál',
 'next' => 'oinmai',
-'last' => 'ikus',
+'last' => 'molok',
 'page_first' => 'uluk',
 'page_last' => 'ikus',
 'histfirst' => 'sedu liu hotu',
@@ -407,12 +407,14 @@ Ita-nia mudansa la armazenadu seidauk!",
 'nextn' => 'oinmai {{PLURAL:$1|$1}}',
 'shown-title' => 'Hatudu {{PLURAL:$1|rezultadu|rezultadu}} $1 kada pájina',
 'viewprevnext' => 'Haree ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Iha pájina ho naran \"[[:\$1]]\".'''",
 'searchmenu-new' => "'''Kria pájina \"[[:\$1]]\" iha wiki ne'e!'''",
 'searchprofile-everything' => 'Hotu',
 'searchprofile-articles-tooltip' => 'Buka iha $1',
 'searchprofile-project-tooltip' => 'Buka iha $1',
 'search-result-size' => '$1 ({{PLURAL:$2|liafuan ida|liafuan $2}})',
 'search-section' => '(seksaun $1)',
+'search-suggest' => 'Parese Ita buka: $1',
 'search-interwiki-caption' => 'Projetu seluseluk sira',
 'searchall' => 'hotu',
 'powersearch' => 'Buka',
@@ -647,7 +649,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'emailsend' => 'Haruka',
 
 # Watchlist
-'watchlist' => "Ha'u-nia lista hateke",
+'watchlist' => 'Lista hateke',
 'mywatchlist' => 'Lista hateke',
 'removedwatchtext' => 'La hateke pájina "[[:$1]]" ona (haree [[Special:Watchlist|"lista hateke"]]).',
 'watch' => 'Hateke',
@@ -671,6 +673,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'exblank' => 'pájina mamuk',
 'delete-legend' => 'Halakon',
 'actioncomplete' => 'operasaun remata',
+'actionfailed' => 'Asaun la konsege',
 'deletedtext' => 'Ita foin halakon pájina "$1". Haree $2 ba "operasaun halakon" seluk.',
 'dellogpage' => 'Lista halakon',
 'deletionlog' => 'lista halakon',
@@ -717,7 +720,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'blanknamespace' => '(Prinsipál)',
 
 # Contributions
-'contributions' => "Kontribuisaun uza-na'in",
+'contributions' => "{{GENDER:$1|Kontribuisaun uza-na'in}}",
 'contributions-title' => 'Kontribuisaun "$1" nian',
 'mycontris' => 'Kontribuisaun',
 'contribsub2' => 'Ba $1 ($2)',
@@ -766,6 +769,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'blocklink' => 'blokeiu',
 'unblocklink' => 'la blokeiu',
 'contribslink' => 'kontribuisaun',
+'blocklogentry' => 'blokeiu [[$1]] ba tempu $2 $3',
 'block-log-flags-nocreate' => 'la bele kria konta foun',
 'block-log-flags-noemail' => 'korreiu eletróniku blokeiu',
 'block-log-flags-nousertalk' => 'la bele edita pájina diskusaun rasik',
@@ -853,10 +857,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'siteusers' => "{{PLURAL:$2|uza-na'in|uza-na'in}} {{SITENAME}} nian $1",
 
 # Skin names
-'skinname-standard' => 'Klásiku',
 'skinname-cologneblue' => 'Kolónia azúl',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Manu',
 
 # Browsing diffs
 'previousdiff' => '←Versaun molok',
@@ -876,7 +877,7 @@ Liña hotu tenke komesa ho *
 Ligasaun uluk iha liña tenke ligasaun bá imajen aat.
 Ligasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.",
 
-# EXIF tags
+# Exif tags
 'exif-make' => 'Fabrikante kámara nian',
 'exif-model' => 'Kámara',
 'exif-artist' => 'Autór',
@@ -957,10 +958,6 @@ Ligasaun seluk iha liña - ne'e pájina sira iha ne'ebé bele inklui imajen aat.
 'version-software-product' => 'Produtu',
 'version-software-version' => 'Versaun',
 
-# Special:FilePath
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Bá',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Buka',
 
index 9a9c71f..f641ff3 100644 (file)
@@ -100,8 +100,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Нишон додани шумораи корбарони пайгир',
 'tog-oldsig' => 'Пешнамоиши имзои вуҷуддошта:',
 'tog-fancysig' => 'Имзоро ба сурати викиматн ба назар бигир (бе пайванди худкор)',
-'tog-externaleditor' => 'Истифода аз вироишгари хориҷӣ ба таври пешфарз (фақат барои корбарони пешрафта, ниёзманди танзимоти вижа дар ройонаи шумо аст. [//www.mediawiki.org/wiki/Manual:External_editors Иттилооти бештар.])',
-'tog-externaldiff' => 'Истифода аз тафовутгири (diff) хориҷӣ ба таври пешфарз (фақат барои корбарони пешрафта, ниёзманди танзимоти вижа дар ройонаи шумо аст. [//www.mediawiki.org/wiki/Manual:External_editors Иттилооти бештар.])',
 'tog-showjumplinks' => 'Намоиши пайвандҳои дастрасии "ҷаҳиш ба" дар феҳристи мундариҷот',
 'tog-uselivepreview' => 'Истифода аз пешнамоиши зинда (ҶаваСкрипт) (Озмоишӣ)',
 'tog-forceeditsummary' => 'Ҳангоме ки хулосаи вироиш нанавиштаам юа ман ислоҳ бидеҳ',
@@ -864,14 +862,6 @@ $1',
 'search-external' => 'Ҷустуҷӯи хориҷӣ',
 'searchdisabled' => 'Ҷустуҷу дар {{SITENAME}} ғайрифаъол карда шудааст. Шумо метавонед тариқи Google дар ҳол ҷустуҷӯ кунед. Таваҷҷӯҳ кунед, ки натоиҷи ҷустуҷӯ {{SITENAME}} метавонад барӯз набошад.',
 
-# Quickbar
-'qbsettings' => 'Танзимоти тезхат (Quickbar)',
-'qbsettings-none' => 'Набошад',
-'qbsettings-fixedleft' => 'Сабти чап',
-'qbsettings-fixedright' => 'Сабти рост',
-'qbsettings-floatingleft' => 'Шиновар чап',
-'qbsettings-floatingright' => 'Шиновар рост',
-
 # Preferences page
 'preferences' => 'Тарҷиҳот',
 'mypreferences' => 'Танзимот',
@@ -1452,8 +1442,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'notvisiblerev' => 'Нусха ҳазф шуд',
 'watchnochange' => 'Ягон мавриди пайгириҳои шумо дар давраи замони намоишёфта вироиш нашуда аст.',
 'watchlist-details' => '{{PLURAL:$1|$1 саҳифаи|$1 саҳифаҳои}} дар феҳристи пайгириҳои шумо, бидуни ҳисоби саҳифаҳои баҳс.',
-'wlheader-enotif' => 'Иттилоорасонии тариқи почтаи электронӣ (E-mail) имконпазир аст.',
-'wlheader-showupdated' => "Саҳифаҳое, ки пас аз охирин сар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
+'wlheader-enotif' => 'Иттилоорасонии тариқи почтаи электронӣ (E-mail) имконпазир аст.',
+'wlheader-showupdated' => "Саҳифаҳое, ки пас аз охирин сар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
 'watchmethod-recent' => 'баррасии вироишҳои охир барои саҳифаҳои пайгиришуда',
 'watchmethod-list' => 'баррасии саҳифаҳои пайгиришуда барои вироишҳои охир',
 'watchlistcontains' => 'Феҳристи пайгириҳои шумо $1 {{PLURAL:$1|саҳифаро|саҳифаҳоро}} дар бар мегирад.',
@@ -2092,7 +2082,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Васеъӣ',
 'exif-imagelength' => 'Баландӣ',
 'exif-bitspersample' => 'Нуқта дар ҳар ҷузъ',
@@ -2206,7 +2196,7 @@ $1',
 'exif-gpsdatestamp' => 'Таърихи ҶПС',
 'exif-gpsdifferential' => 'Тасҳеҳи ҷузъии ҶПС',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ғайрифишурда',
 
 'exif-unknowndate' => 'Таърихи номаълум',
@@ -2507,15 +2497,6 @@ $5
 'version-software-product' => 'Маҳсул',
 'version-software-version' => 'Нусха',
 
-# Special:FilePath
-'filepath' => 'Масири парванда',
-'filepath-page' => 'Парванда:',
-'filepath-submit' => 'Масир',
-'filepath-summary' => 'Ин саҳифаи вижа нишонаи комил барои як парвандаро нишон медиҳад.
-Аксҳо бо кайфият бо ҳаҷми пурраашон нишон дода мешаванд, дигар навъҳои парвандаҳои дигар бо барномаҳои алоқаманди махсус ба худашон боз мешаванд.
-
-Нишонаи пайвандро бидуни пешванд "{{ns:file}}:" ворид кунед.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ҷустуҷӯ барои парвандаҳои такрорӣ',
 'fileduplicatesearch-summary' => 'Ҷустуҷӯ барои парвандаҳои такрорӣ бар асоси миқдори дар ҳам шудаи онҳо сурат мегирад.',
index 61887af..eb2aaee 100644 (file)
@@ -42,8 +42,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Nişon dodani şumorai korbaroni pajgir',
 'tog-oldsig' => 'Peşnamoişi imzoi vuçuddoşta:',
 'tog-fancysig' => 'Imzoro ba surati vikimatn ba nazar bigir (be pajvandi xudkor)',
-'tog-externaleditor' => 'Istifoda az viroişgari xoriçī ba tavri peşfarz (faqat baroi korbaroni peşrafta, nijozmandi tanzimoti viƶa dar rojonai şumo ast. [//www.mediawiki.org/wiki/Manual:External_editors Ittilooti beştar.])',
-'tog-externaldiff' => 'Istifoda az tafovutgiri (diff) xoriçī ba tavri peşfarz (faqat baroi korbaroni peşrafta, nijozmandi tanzimoti viƶa dar rojonai şumo ast. [//www.mediawiki.org/wiki/Manual:External_editors Ittilooti beştar.])',
 'tog-showjumplinks' => 'Namoişi pajvandhoi dastrasiji "çahiş ba" dar fehristi mundariçot',
 'tog-uselivepreview' => 'Istifoda az peşnamoişi zinda (ÇavaSkript) (Ozmoişī)',
 'tog-forceeditsummary' => 'Hangome ki xulosai viroiş nanaviştaam jua man isloh bideh',
@@ -733,14 +731,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
 'search-external' => 'Çustuçūi xoriçī',
 'searchdisabled' => "Çustuçu dar {{SITENAME}} ƣajrifa'ol karda şudaast. Şumo metavoned tariqi Google dar hol çustuçū kuned. Tavaççūh kuned, ki natoiçi çustuçū {{SITENAME}} metavonad barūz naboşad.",
 
-# Quickbar
-'qbsettings' => 'Tanzimoti tezxat (Quickbar)',
-'qbsettings-none' => 'Naboşad',
-'qbsettings-fixedleft' => 'Sabti cap',
-'qbsettings-fixedright' => 'Sabti rost',
-'qbsettings-floatingleft' => 'Şinovar cap',
-'qbsettings-floatingright' => 'Şinovar rost',
-
 # Preferences page
 'preferences' => 'Tarçihot',
 'mypreferences' => 'Tarçihoti man',
@@ -1275,8 +1265,8 @@ Agar şumo dertar az fehristi nazarotaton in sahifaro hazv kardan xohed, dar men
 'notvisiblerev' => 'Nusxa hazf şud',
 'watchnochange' => 'Jagon mavridi pajgirihoi şumo dar davrai zamoni namoişjofta viroiş naşuda ast.',
 'watchlist-details' => '{{PLURAL:$1|$1 sahifai|$1 sahifahoi}} dar fehristi pajgirihoi şumo, biduni hisobi sahifahoi bahs.',
-'wlheader-enotif' => 'Ittiloorasoniji tariqi poctai elektronī (E-mail) imkonpazir ast.',
-'wlheader-showupdated' => "Sahifahoe, ki pas az oxirin sar zadanaton ba onho taƣjir kardaand '''purrang''' nişon doda şudaand",
+'wlheader-enotif' => 'Ittiloorasoniji tariqi poctai elektronī (E-mail) imkonpazir ast.',
+'wlheader-showupdated' => "Sahifahoe, ki pas az oxirin sar zadanaton ba onho taƣjir kardaand '''purrang''' nişon doda şudaand",
 'watchmethod-recent' => 'barrasiji viroişhoi oxir baroi sahifahoi pajgirişuda',
 'watchmethod-list' => 'barrasiji sahifahoi pajgirişuda baroi viroişhoi oxir',
 'watchlistcontains' => 'Fehristi pajgirihoi şumo $1 {{PLURAL:$1|sahifaro|sahifahoro}} dar bar megirad.',
@@ -1871,7 +1861,7 @@ Faqat satrhoe, ki bo * şurū' şavand ba nazar girifta meşavand. Avvalin pajva
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => "Vase'ī",
 'exif-imagelength' => 'Balandī',
 'exif-bitspersample' => "Nuqta dar har çuz'",
@@ -1985,7 +1975,7 @@ Faqat satrhoe, ki bo * şurū' şavand ba nazar girifta meşavand. Avvalin pajva
 'exif-gpsdatestamp' => "Ta'rixi ÇPS",
 'exif-gpsdifferential' => "Tashehi çuz'iji ÇPS",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ƣajrifişurda',
 
 'exif-unknowndate' => "Ta'rixi noma'lum",
@@ -2280,15 +2270,6 @@ Tavaççūh kuned, ki şumo metavoned az [[Special:EditWatchlist|viroişgari sta
 'version-software-product' => 'Mahsul',
 'version-software-version' => 'Nusxa',
 
-# Special:FilePath
-'filepath' => 'Masiri parvanda',
-'filepath-page' => 'Parvanda:',
-'filepath-submit' => 'Masir',
-'filepath-summary' => 'In sahifai viƶa nişonai komil baroi jak parvandaro nişon medihad.
-Aksho bo kajfijat bo haçmi purraaşon nişon doda meşavand, digar nav\'hoi parvandahoi digar bo barnomahoi aloqamandi maxsus ba xudaşon boz meşavand.
-
-Nişonai pajvandro biduni peşvand "{{ns:file}}:" vorid kuned.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Çustuçū baroi parvandahoi takrorī',
 'fileduplicatesearch-summary' => 'Çustuçū baroi parvandahoi takrorī bar asosi miqdori dar ham şudai onho surat megirad.',
index efae1ab..e07655d 100644 (file)
@@ -21,6 +21,7 @@
  * @author Octahedron80
  * @author Passawuth
  * @author TMo3289
+ * @author Taweetham
  * @author Woraponboonkerd
  * @author לערי ריינהארט
  * @author จักรกฤช วงศ์สระหลวง (Jakkrit Vongsraluang) / PaePae
@@ -222,12 +223,10 @@ $messages = array(
 'tog-enotifwatchlistpages' => 'อีเมลหาเมื่อหน้าหรือไฟล์ในรายการเฝ้าดูมีการเปลี่ยนแปลง',
 'tog-enotifusertalkpages' => 'อีเมลหาเมื่อหน้าคุยกับผู้ใช้ของฉันมีการเปลี่ยนแปลง',
 'tog-enotifminoredits' => 'อีเมลหาเช่นกันสำหรับการแก้ไขหน้าและไฟล์เล็กน้อย',
-'tog-enotifrevealaddr' => 'à¹\80à¸\9cยà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¹\83à¸\99อีà¹\80มลà¸\97ีà¹\88à¸\8aีà¹\89à¹\81à¸\88à¸\87',
+'tog-enotifrevealaddr' => 'à¹\80à¸\9bิà¸\94à¹\80à¸\9cยà¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¹\8cà¸\82อà¸\87à¸\89ัà¸\99à¹\83à¸\99อีà¹\80มลà¹\8cà¹\81à¸\88à¹\89à¸\87à¹\80à¸\95ือà¸\99',
 'tog-shownumberswatching' => 'แสดงจำนวนผู้ใช้ที่เฝ้าดู',
 'tog-oldsig' => 'ลายเซ็นที่ใช้อยู่:',
 'tog-fancysig' => 'ใช้คำสั่งวิกิที่ปรากฏในลายเซ็นนี้ (โดยไม่มีลิงก์อัตโนมัติ)',
-'tog-externaleditor' => 'ใช้โปรแกรมแก้ไขภายนอกโดยปริยาย (สำหรับผู้เชี่ยวชาญเท่านั้น ต้องการการตั้งค่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
-'tog-externaldiff' => 'ใช้โปรแกรมเปรียบเทียบภายนอกโดยปริยาย (สำหรับผู้เชี่ยวชาญเท่านั้น ต้องการการตั้งค่าพิเศษบนคอมพิวเตอร์ของคุณ [//www.mediawiki.org/wiki/Manual:External_editors ข้อมูลเพิ่มเติม])',
 'tog-showjumplinks' => 'เปิดใช้งาน "กระโดด" อัตโนมัติไปตามลิงก์',
 'tog-uselivepreview' => 'แสดงตัวอย่างการแก้ไขแบบทันที (จาวาสคริปต์) (ทดลอง)',
 'tog-forceeditsummary' => 'เตือนเมื่อช่องคำอธิบายอย่างย่อว่าง',
@@ -242,6 +241,7 @@ $messages = array(
 'tog-showhiddencats' => 'แสดงหมวดหมู่ที่ซ่อนอยู่',
 'tog-noconvertlink' => 'ปิดใช้งานการแปลงชื่อเรื่องของลิงก์',
 'tog-norollbackdiff' => 'ไม่แสดงการเปลี่ยนแปลงหลังดำเนินการย้อนกลับฉุกเฉิน',
+'tog-useeditwarning' => 'เตือนฉัน เมื่อฉันกำลังจะออกจากหน้าแก้ไขโดยมีข้อมูลที่ยังไม่ได้บันทึก',
 
 'underline-always' => 'เสมอ',
 'underline-never' => 'ไม่เคย',
@@ -320,7 +320,7 @@ $messages = array(
 'category-article-count-limited' => '$1 หน้าต่อไปนี้อยู่ในหมวดหมู่นี้',
 'category-file-count' => '{{PLURAL:$2|หมวดหมู่นี้มีเพียงไฟล์เดียว|ในหมวดหมู่นี้มี $1 ไฟล์ จากทั้งหมด $2 ไฟล์}}',
 'category-file-count-limited' => '{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้อยู่ในหมวดหมู่นี้',
-'listingcontinuesabbrev' => '(ต่อ)',
+'listingcontinuesabbrev' => 'ต่อ',
 'index-category' => 'หน้าที่มีดัชนี',
 'noindex-category' => 'หน้าที่ไม่มีดัชนี',
 'broken-file-category' => 'หน้าที่มีลิงก์ไฟล์เสีย',
@@ -375,7 +375,7 @@ $messages = array(
 'searcharticle' => 'ไป',
 'history' => 'ประวัติหน้า',
 'history_short' => 'ประวัติ',
-'updatedmarker' => 'à¸\81ารปรับตั้งแต่การเข้าชมครั้งล่าสุดของฉัน',
+'updatedmarker' => 'à¸\96ูà¸\81ปรับตั้งแต่การเข้าชมครั้งล่าสุดของฉัน',
 'printableversion' => 'รุ่นพร้อมพิมพ์',
 'permalink' => 'ลิงก์ถาวร',
 'print' => 'พิมพ์',
@@ -391,8 +391,8 @@ $messages = array(
 'protect' => 'ล็อก',
 'protect_change' => 'เปลี่ยน',
 'protectthispage' => 'ล็อกหน้านี้',
-'unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99',
-'unprotectthispage' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99หน้านี้',
+'unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารลà¹\87อà¸\81',
+'unprotectthispage' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารลà¹\87อà¸\81หน้านี้',
 'newpage' => 'หน้าใหม่',
 'talkpage' => 'อภิปรายหน้านี้',
 'talkpagelinktext' => 'พูดคุย',
@@ -402,7 +402,7 @@ $messages = array(
 'articlepage' => 'ดูหน้าเนื้อหา',
 'talk' => 'อภิปราย',
 'views' => 'ดู',
-'toolbox' => 'เครื่องมือ',
+'toolbox' => 'à¸\81ลà¹\88อà¸\87à¹\80à¸\84รืà¹\88อà¸\87มือ',
 'userpage' => 'ดูหน้าผู้ใช้',
 'projectpage' => 'ดูหน้าโครงการ',
 'imagepage' => 'ดูหน้าไฟล์',
@@ -421,8 +421,8 @@ $messages = array(
 'jumptonavigation' => 'นำทาง',
 'jumptosearch' => 'ค้นหา',
 'view-pool-error' => 'ขออภัย ขณะนี้เซิร์ฟเวอร์มีภาระเกิน
-à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\9eยายามà¹\80à¸\82à¹\89าà¸\94ูหà¸\99à¹\89าà¸\99ีà¹\89มาà¸\81à¹\80à¸\81ิà¸\99à¹\84à¸\9b
-à¸\81รุà¸\93ารอสัà¸\81à¸\84รูà¹\88à¸\81à¹\88อà¸\99à¸\97ีà¹\88à¸\88ะà¹\80à¸\82à¹\89าà¸\94ูหà¸\99à¹\89าà¸\99ีà¹\89อีà¸\81à¸\84รัà¹\89à¸\87หà¸\99ึà¹\88
+ผู้ใช้พยายามดูหน้านี้มากเกินไป
+à¸\81รุà¸\93ารอสัà¸\81à¸\84รูà¹\88à¸\81à¹\88อà¸\99à¹\80à¸\82à¹\89าหà¸\99à¹\89าà¸\99ีà¹\89อีà¸\81à¸\84รัà¹\89
 
 $1',
 'pool-timeout' => 'เกินเวลารอการล็อก',
@@ -451,10 +451,10 @@ $1',
 
 'badaccess' => 'มีข้อผิดพลาดในการใช้สิทธิ',
 'badaccess-group0' => 'คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ขอ',
-'badaccess-groups' => 'ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่มหนึ่งกลุ่มใด ดังนี้}}: $1',
+'badaccess-groups' => 'ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่ม}}: $1',
 
 'versionrequired' => 'ต้องการมีเดียวิกิรุ่น $1',
-'versionrequiredtext' => 'à¸\95à¹\89อà¸\87à¸\81ารมีà¹\80à¸\94ียวิà¸\81ิรุà¹\88à¸\99 $1 à¸ªà¸³à¸«à¸£à¸±à¸\9aà¹\83à¸\8aà¹\89à¸\87าà¸\99หà¸\99à¹\89าà¸\99ีà¹\89 ดู[[Special:Version|หน้ารุ่น]]',
+'versionrequiredtext' => 'à¸\81ารà¹\83à¸\8aà¹\89หà¸\99à¹\89าà¸\99ีà¹\89à¸\95à¹\89อà¸\87à¸\81ารมีà¹\80à¸\94ียวิà¸\81ิรุà¹\88à¸\99 $1  ดู[[Special:Version|หน้ารุ่น]]',
 
 'ok' => 'ตกลง',
 'retrievedfrom' => 'รับข้อมูลจาก "$1"',
@@ -478,7 +478,7 @@ $1',
 'collapsible-collapse' => 'ยุบ',
 'collapsible-expand' => 'ขยาย',
 'thisisdeleted' => 'ดูหรือกู้คืน $1 หรือไม่',
-'viewdeleted' => 'ดู $1',
+'viewdeleted' => 'ดู $1 หรือไม่',
 'restorelink' => '$1 การแก้ไขที่ถูกลบ',
 'feedlinks' => 'ฟีด',
 'feed-invalid' => 'ฟีดที่สมัครไม่ถูกชนิด',
@@ -553,13 +553,13 @@ $1',
 'fileexistserror' => 'ไม่สามารถเขียนไฟล์ "$1" ได้ เนื่องจากมีไฟล์อยู่แล้ว',
 'unexpected' => 'ผลที่ไม่คาดคิด: "$1"="$2"',
 'formerror' => 'ผิดพลาด: ไม่สามารถส่งแบบได้',
-'badarticleerror' => 'à¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\84à¸\94à¹\89à¹\83à¸\99หà¸\99à¹\89าà¸\99ี้',
+'badarticleerror' => 'à¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\83à¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94้',
 'cannotdelete' => 'ไม่สามารถลบหน้าหรือไฟล์ "$1" 
 อาจมีผู้อื่นลบไปแล้ว',
 'cannotdelete-title' => "ไม่สามารถลบหน้า ''$1''",
 'delete-hook-aborted' => 'การลบถูกฮุกยกเลิก
 โดยไม่มีคำอธิบาย',
-'badtitle' => 'à¹\83à¸\8aà¹\89à¸\8aืà¹\88อหัวà¸\82à¹\89อนี้ไม่ได้',
+'badtitle' => 'à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87นี้ไม่ได้',
 'badtitletext' => 'ชื่อหน้าที่ขอไม่ถูกต้อง เป็นชื่อว่าง หรือชื่อข้ามภาษาหรือข้ามวิกิที่เชื่อมโยงไม่ถูกต้อง
 อาจมีอักขระที่ไม่สามารถใช้ในชื่อเรื่องได้',
 'perfcached' => 'ข้อมูลต่อไปนี้ถูกเก็บในแคช และอาจล้าสมัย มีผลการค้นหาสูงสุด $1 รายการในแคช',
@@ -570,7 +570,7 @@ $1',
 คำค้น: $2',
 'viewsource' => 'ดูโค้ด',
 'viewsource-title' => 'ดูโค้ดสำหรับ $1',
-'actionthrottled' => 'à¸\81ารà¸\81ระà¸\97ำà¸\96ูà¸\81ระà¸\87ัà¸\9aชั่วคราว',
+'actionthrottled' => 'à¸\81ารà¸\81ระà¸\97ำà¸\99ีà¹\89à¸\96ูà¸\81ระà¸\87ัà¸\9aà¹\84วà¹\89ชั่วคราว',
 'actionthrottledtext' => 'เพื่อเป็นมาตรการป้องกันสแปม คุณจึงถูกจำกัดมิให้กระทำสิ่งนี้ไม่ให้ติดต่อกันหลายครั้งเกินไปในช่วงระยะเวลาสั้น ๆ ซึ่งขณะนี้คุณได้กระทำเกินขีดจำกัดแล้ว กรุณารอสักครู่แล้วลองอีกครั้ง',
 'protectedpagetext' => 'หน้านี้ถูกป้องกันมิให้แก้ไขหรือปฏิบัติการอื่น',
 'viewsourcetext' => 'คุณสามารถดูและคัดลอกโค้ดหน้านี้ได้:',
@@ -609,9 +609,15 @@ $1',
 'welcomecreation-msg' => 'บัญชีของคุณถูกสร้างขึ้นแล้ว
 อย่าลืมเปลี่ยนแปลง[[Special:Preferences|การตั้งค่าใน {{SITENAME}}]] ของคุณ',
 'yourname' => 'ชื่อผู้ใช้',
+'userlogin-yourname' => 'ชื่อผู้ใช้',
+'userlogin-yourname-ph' => 'กรอกชื่อผู้ใช้',
 'yourpassword' => 'รหัสผ่าน',
+'userlogin-yourpassword' => 'รหัสผ่าน',
+'userlogin-yourpassword-ph' => 'กรอกรหัสผ่าน',
 'yourpasswordagain' => 'พิมพ์รหัสผ่านอีกครั้ง:',
 'remembermypassword' => 'จำการล็อกอินของฉันบนเบราเซอร์นี้ (นานสุด $1 วัน)',
+'userlogin-remembermypassword' => 'ให้ฉันอยู่ในระบบ',
+'userlogin-signwithsecure' => 'ใช้การเชื่อมต่อที่ปลอดภัย',
 'securelogin-stick-https' => 'ยังคงเชื่อมต่อกับ HTTPS หลังจากล็อกอิน',
 'yourdomainname' => 'โดเมนของคุณ:',
 'password-change-forbidden' => 'คุณไม่สามารถเปลี่ยนรหัสผ่านบนวิกินี้',
@@ -624,14 +630,20 @@ $1',
 'logout' => 'ล็อกเอาต์',
 'userlogout' => 'ล็อกเอาต์',
 'notloggedin' => 'ไม่ได้ล็อกอิน',
+'userlogin-noaccount' => 'ไม่มีบัญชีหรือ',
+'userlogin-joinproject' => 'เข้าร่วม {{SITENAME}}',
 'nologin' => 'ไม่มีบัญชีหรือ $1',
 'nologinlink' => 'สร้างบัญชี',
 'createaccount' => 'สร้างบัญชี',
 'gotaccount' => "มีบัญชีแล้วใช่ไหม '''$1'''",
 'gotaccountlink' => 'ล็อกอิน',
 'userlogin-resetlink' => 'ลืมรายละเอียดล็อกอินของคุณหรือ',
+'userlogin-resetpassword-link' => 'รีเซ็ตรหัสผ่านของคุณ',
+'helplogin-url' => 'Help:การล็อกอิน',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|คำอธิบายเรื่องการล็อกอิน]]',
 'createaccountmail' => 'ใช้รหัสผ่านสุ่มชั่วคราวและส่งไปยังที่อยู่อีเมลที่ระบุด้านล่าง',
 'createaccountreason' => 'เหตุผล:',
+'createacct-submit' => 'สร้างบัญชีของคุณ',
 'badretype' => 'รหัสผ่านที่ใส่ไม่ตรงกัน',
 'userexists' => 'ชื่อผู้ใช้ที่กรอกมีผู้อื่นใช้ไปแล้ว กรุณาเลือกชื่ออื่น',
 'loginerror' => 'ล็อกอินผิดพลาด',
@@ -679,7 +691,7 @@ $1',
 'cannotchangeemail' => 'ไม่สามารถเปลี่ยนที่อยู่อีเมลบนวิกินี้',
 'emaildisabled' => 'เว็บไซต์นี้ไม่สามารถส่งอีเมล',
 'accountcreated' => 'บัญชีถูกสร้างขึ้น',
-'accountcreatedtext' => 'à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87 $1 à¸\96ูà¸\81สร้างขึ้นแล้ว',
+'accountcreatedtext' => 'à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87 $1 à¹\84à¸\94à¹\89สร้างขึ้นแล้ว',
 'createaccount-title' => 'สร้างบัญชีสำหรับ {{SITENAME}}',
 'createaccount-text' => 'มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ "$2" และรหัสผ่าน "$3" คุณควรล็อกอินเพื่อเปลี่ยนรหัสผ่านทันที
 
@@ -716,11 +728,13 @@ $1',
 
 # Special:PasswordReset
 'passwordreset' => 'ตั้งรหัสผ่านใหม่',
-'passwordreset-text' => 'กรอกแบบนี้เพื่อรับตัวเตือนอีเมลรายละเอียดบัญชีของคุณ',
 'passwordreset-legend' => 'เปลี่ยนรหัสผ่าน',
 'passwordreset-disabled' => 'การตั้งรหัสผ่านใหม่ปิดใช้งานบนวิกินี้',
+'passwordreset-emaildisabled' => 'คุณลักษณะอีเมลถูกปิดใช้งานบนวิกินี้',
 'passwordreset-username' => 'ชื่อผู้ใช้:',
 'passwordreset-domain' => 'โดเมน:',
+'passwordreset-capture' => 'ดูอีเมลที่ได้หรือไม่',
+'passwordreset-capture-help' => 'หากคุณเลือกกล่องนี้ อีเมลดังกล่าว (พร้อมรหัสผ่านชั่วคราว) จะแสดงแก่คุณ เช่นเดียวกับส่งไปยังผู้ใช้',
 'passwordreset-email' => 'ที่อยู่อีเมล:',
 'passwordreset-emailtitle' => 'รายละเอียดบัญชีบน {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'ใครบางคน (ซึ่งอาจเป็นคุณ ที่ใช้เลขที่อยู่ไอพี $1) ขอตัวเตือนรายละเอียดบัญชีของคุณบน {{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:
@@ -737,9 +751,9 @@ $2
 ตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตัวเตือนรายละเอียดบัญชี หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีกต่อไป คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเก่าของคุณต่อไป',
 'passwordreset-emailelement' => 'ชื่อผู้ใช้: $1
 รหัสผ่านชั่วคราว: $2',
-'passwordreset-emailsent' => 'อีà¹\80มลà¹\81à¸\88à¹\89à¸\87à¹\80à¸\95ือà¸\99à¹\84à¸\94à¹\89ถูกส่งไปแล้ว',
-'passwordreset-emailsent-capture' => 'อีà¹\80มลà¹\81à¸\88à¹\89à¸\87à¹\80à¸\95ือà¸\99à¹\84à¸\94à¹\89ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง',
-'passwordreset-emailerror-capture' => 'อีà¹\80มลà¹\81à¸\88à¹\89à¸\87à¹\80à¸\95ือà¸\99ถูกสร้างขึ้นแล้ว ซึ่งแสดงข้างล่าง แต่การส่งไปยังผู้ใช้ล้มเหลว: $1',
+'passwordreset-emailsent' => 'อีà¹\80มลà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88ถูกส่งไปแล้ว',
+'passwordreset-emailsent-capture' => 'อีà¹\80มลà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88ถูกส่งไปแล้ว ซึ่งแสดงด้านล่าง',
+'passwordreset-emailerror-capture' => 'อีà¹\80มลà¸\95ัà¹\89à¸\87รหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88ถูกสร้างขึ้นแล้ว ซึ่งแสดงข้างล่าง แต่การส่งไปยังผู้ใช้ล้มเหลว: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'เปลี่ยนที่อยู่อีเมล',
@@ -760,18 +774,18 @@ $2
 'italic_tip' => 'ทำตัวเอน',
 'link_sample' => 'ลิงก์เชื่อมโยง',
 'link_tip' => 'ลิงก์ภายในเว็บ',
-'extlink_sample' => 'http://www.example.com à¸\8aืà¹\88อà¸\84ำอà¸\98ิà¸\9aายลิงก์',
+'extlink_sample' => 'http://www.example.com à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\82อà¸\87ลิงก์',
 'extlink_tip' => 'ลิงก์ภายนอก (อย่าลืมใส่ http:// นำหน้าเสมอ)',
-'headline_sample' => 'หัวà¸\82à¹\89อ',
-'headline_tip' => 'หัวà¸\82à¹\89อ',
+'headline_sample' => 'à¸\82à¹\89อà¸\84วามà¸\9eาà¸\94หัว',
+'headline_tip' => 'à¸\9eาà¸\94หัวระà¸\94ัà¸\9a 2',
 'nowiki_sample' => 'แทรกข้อความที่ไม่จัดรูปแบบที่นี่',
 'nowiki_tip' => 'ไม่สนใจการจัดรูปแบบวิกิ',
 'image_sample' => 'ตัวอย่าง.jpg',
 'image_tip' => 'ใส่ไฟล์',
 'media_sample' => 'ตัวอย่าง.ogg',
-'media_tip' => 'เชื่อมโยงไฟล์สื่อ',
+'media_tip' => 'เชื่อมโยงไฟล์',
 'sig_tip' => 'ลายเซ็นของคุณพร้อมตราเวลา',
-'hr_tip' => 'เส้นนอน',
+'hr_tip' => 'เส้นนอน (โปรดใช้อย่างจำกัด)',
 
 # Edit pages
 'summary' => 'คำอธิบายโดยย่อ:',
@@ -789,7 +803,7 @@ $2
 'missingcommenttext' => 'กรุณาใส่ความเห็นด้านล่าง',
 'missingcommentheader' => "'''ประกาศเตือน:''' คุณยังไม่ได้ใส่หัวข้อ/จ่าหัวสำหรับความเห็นนี้ ถ้าคุณกด \"{{int:savearticle}}\" อีกครั้ง การแก้ไขของคุณจะถูกบันทึกโดยไม่มีหัวข้อ",
 'summary-preview' => 'ตัวอย่างคำอธิบายการแก้ไข:',
-'subject-preview' => 'ตัวอย่างหัวข้อ:',
+'subject-preview' => 'ตัวอย่างหัวข้อ/พาดหัว:',
 'blockedtitle' => 'ผู้ใช้ถูกบล็อกอยู่',
 'blockedtext' => "'''ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก'''
 
@@ -905,25 +919,25 @@ $2
 ถ้าคุณไม่ต้องการให้งานของคุณถูกแก้ไข หรือไม่ต้องการให้งานเผยแพร่ตามที่กล่าวไว้ อย่าส่งข้อความของคุณเข้ามาที่นี่<br />
 นอกจากนี้คุณแน่ใจว่าข้อความที่ส่งเข้ามาคุณได้เขียนด้วยตัวเอง ไม่ได้คัดลอก ทำซ้ำส่วนหนึ่งส่วนใดหรือทั้งหมดจากแหล่งอื่น (ดูรายละเอียดที่ $1)
 '''อย่าส่งงานที่มีลิขสิทธิ์เข้ามาก่อนได้รับอนุญาตจากเจ้าของ!'''",
-'longpageerror' => "'''ผิดพลาด: ข้อความที่คุณส่งเข้ามามีขนาด $1 กิโลไบต์
-à¸\8bึà¹\88à¸\87à¹\80à¸\81ิà¸\99à¸\81วà¹\88าà¸\82à¸\99าà¸\94à¸\97ีà¹\88กำหนดไว้ที่ $2 กิโลไบต์ จึงไม่สามารถบันทึกได้'''",
-'readonlywarning' => "'''à¸\84ำà¹\80à¸\95ือà¸\99: à¸\90าà¸\99à¸\82à¹\89อมูลà¸\96ูà¸\81ลà¹\87อà¸\81à¹\80à¸\9eืà¹\88อà¸\9aำรุà¸\87รัà¸\81ษา à¸\89ะà¸\99ัà¹\89à¸\99à¸\84ุà¸\93à¸\88ึà¸\87à¹\84มà¹\88สามารà¸\96à¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\82อà¸\87à¸\84ุà¸\93à¹\84à¸\94à¹\89à¹\83à¸\99à¸\82à¸\93ะà¸\99ีà¹\89'''
+'longpageerror' => "'''à¸\82à¹\89อà¸\9cิà¸\94à¸\9eลาà¸\94: à¸\82à¹\89อà¸\84วามà¸\97ีà¹\88à¸\84ุà¸\93สà¹\88à¸\87à¹\80à¸\82à¹\89ามามีà¸\82à¸\99าà¸\94 $1 à¸\81ิà¹\82ลà¹\84à¸\9aà¸\95à¹\8c
+à¸\8bึà¹\88à¸\87à¹\80à¸\81ิà¸\99à¸\81วà¹\88าà¸\82à¸\99าà¸\94สูà¸\87สุà¸\94à¸\8bึà¹\88à¸\87กำหนดไว้ที่ $2 กิโลไบต์ จึงไม่สามารถบันทึกได้'''",
+'readonlywarning' => "'''คำเตือน: ฐานข้อมูลถูกล็อกเพื่อบำรุงรักษา คุณจึงไม่สามารถบันทึกการเปลี่ยนแปลงของคุณได้ในขณะนี้'''
 คุณอาจต้องการคัดลอกและวางข้อความของคุณในไฟล์ข้อความ และบันทึกไว้ใช้ภายหลัง
 
 ผู้ดูแลระบบที่ล็อกฐานข้อมูลได้ให้คำอธิบายดังนี้: $1",
 'protectedpagewarning' => "'''คำเตือน: หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้น'''
-ปูมล่าสุดถูกแสดงไว้ด้านล่างเพื่อการอ้างอิง:",
+รายà¸\81ารà¸\9bูมลà¹\88าสุà¸\94à¸\96ูà¸\81à¹\81สà¸\94à¸\87à¹\84วà¹\89à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9eืà¹\88อà¸\81ารอà¹\89าà¸\87อิà¸\87:",
 'semiprotectedpagewarning' => "'''หมายเหตุ:''' หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่ลงทะเบียนเท่านั้น
 รายการแก้ไขล่าสุดได้ถูกแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง",
 'cascadeprotectedwarning' => "'''คำเตือน:''' หน้านี้ถูกล็อก และแก้ไขได้เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้น เนื่องจากหน้านี้สืบทอดการล็อกมาจาก{{PLURAL:$1|หน้า|หน้า}}ต่อไปนี้:",
-'titleprotectedwarning' => "'''คำเตือน: หน้านี้ได้รับการป้องกันไว้ให้สร้างได้เฉพาะโดย[[Special:ListGroupRights|ผู้ใช้ที่ได้รับสิทธิ]]เท่านั้น'''
-รายà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82ลà¹\88าสุà¸\94à¹\84à¸\94à¹\89à¸\96ูà¸\81à¹\81สà¸\94à¸\87à¹\84วà¹\89à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89เพื่อการอ้างอิง",
+'titleprotectedwarning' => "'''คำเตือน: หน้านี้ได้รับการป้องกัน สร้างได้เฉพาะผู้ใช้ที่มี[[Special:ListGroupRights|สิทธิจำเพาะ]]เท่านั้น'''
+รายà¸\81ารà¸\9bูมลà¹\88าสุà¸\94à¸\96ูà¸\81à¹\81สà¸\94à¸\87à¹\84วà¹\89à¸\94à¹\89าà¸\99ลà¹\88าà¸\87เพื่อการอ้างอิง",
 'templatesused' => '{{PLURAL:$1|แม่แบบ}}ที่ใช้ในหน้านี้:',
 'templatesusedpreview' => '{{PLURAL:$1|แม่แบบ}}ที่ใช้ในการแสดงตัวอย่าง:',
 'templatesusedsection' => '{{PLURAL:$1|แม่แบบ}}ที่ใช้ในส่วนนี้:',
-'template-protected' => '(ล็อก)',
-'template-semiprotected' => '(กึ่งล็อก)',
-'hiddencategories' => 'หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ที่ซ่อนอยู่|$1 หมวดหมู่ที่ซ่อนอยู่}} :',
+'template-protected' => '(à¸\96ูà¸\81ลà¹\87อà¸\81)',
+'template-semiprotected' => '(à¸\96ูà¸\81à¸\81ึà¹\88à¸\87ลà¹\87อà¸\81)',
+'hiddencategories' => 'หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ที่ซ่อนอยู่|$1 หมวดหมู่ที่ซ่อนอยู่}}:',
 'edittools' => '<!-- ข้อความนี้จะแสดงผลใต้ฟอร์มสำหรับการแก้ไขและอัปโหลด -->',
 'nocreatetext' => '{{SITENAME}} จำกัดการสร้างหน้าใหม่
 คุณสามารถย้อนกลับไปแก้ไขหน้าที่มีอยู่เดิม หรือ[[Special:UserLogin|ล็อกอินหรือสร้างบัญชีผู้ใช้]]',
@@ -949,6 +963,10 @@ $2
 'edit-already-exists' => 'ไม่สามารถสร้างหน้าใหม่ได้
 เพราะมีหน้านี้แล้ว',
 'defaultmessagetext' => 'ข้อความสารโดยปริยาย',
+'invalid-content-data' => 'ข้อมูลเนื้อหาไม่ถูกต้อง',
+'content-not-allowed-here' => 'เนื้อหา "$1" ไม่อนุญาตในหน้า [[$2]]',
+'editwarning-warning' => 'การออกจากหน้านี้อาจทำให้ความเปลี่ยนแปลงที่คุณกระทำสูญหาย
+ถ้าคุณล็อกอินแล้ว คุณสามารถปิดคำเตือนนี้ได้ที่ส่วน "การแก้ไข" ในการตั้งค่าของคุณ',
 
 # Content models
 'content-model-wikitext' => 'ข้อความวิกิ',
@@ -1223,14 +1241,7 @@ $1",
 'powersearch-togglenone' => 'ไม่เลือก',
 'search-external' => 'ค้นหาภายนอก',
 'searchdisabled' => 'การค้นหา {{SITENAME}} ปิดใช้งาน คุณสามารถค้นหาผ่านกูเกิลหรือเซิร์ชเอนจินอื่นในเวลาไม่นาน โปรดทราบว่าดัชนีเนื้อหาของ {{SITENAME}} บนเซิร์ชเอนจินอาจเป็นข้อมูลเก่า',
-
-# Quickbar
-'qbsettings' => 'แถบพิเศษ',
-'qbsettings-none' => 'ไม่มี',
-'qbsettings-fixedleft' => 'ตรึงไว้ทางซ้าย',
-'qbsettings-fixedright' => 'ตรึงไว้ทางขวา',
-'qbsettings-floatingleft' => 'ด้านซ้าย',
-'qbsettings-floatingright' => 'ด้านขวา',
+'search-error' => 'เกิดข้อผิดพลาดขณะกำลังค้นหา: $1',
 
 # Preferences page
 'preferences' => 'ตั้งค่าส่วนตัว',
@@ -1319,7 +1330,7 @@ $1",
 'yourvariant' => 'อักษรต่างรูปของเนื้อหา:',
 'yournick' => 'ลายเซ็น:',
 'prefs-help-signature' => 'ความเห็นในหน้าพูดคุยควรลงลายเซ็นด้วย "<nowiki>~~~~</nowiki>" ซึ่งจะถูกแปลงเป็นลายเซ็นของคุณและตราเวลา',
-'badsig' => 'ลายà¹\80à¸\8bà¹\87à¸\99à¸\94ิà¸\9aà¹\84มà¹\88สมà¹\80หà¸\95ุสมà¸\9cล à¸\95รวà¸\88สอà¸\9aà¸\9bà¹\89ายระà¸\9aุเอชทีเอ็มแอล',
+'badsig' => 'ลายà¹\80à¸\8bà¹\87à¸\99à¸\94ิà¸\9aà¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¹\83หà¹\89à¸\95รวà¸\88สอà¸\9aà¹\81à¸\97à¹\87à¸\81เอชทีเอ็มแอล',
 'badsiglength' => 'ลายเซ็นของคุณยาวเกินไป ต้องยาวไม่เกิน $1 ตัวอักษร',
 'yourgender' => 'เพศ:',
 'gender-unknown' => 'ไม่ระบุ',
@@ -1393,7 +1404,7 @@ $1",
 'grouppage-user' => '{{ns:project}}:ผู้ใช้',
 'grouppage-autoconfirmed' => '{{ns:project}}:ผู้ใช้ทั่วไป',
 'grouppage-bot' => '{{ns:project}}:บอต',
-'grouppage-sysop' => '{{ns:project}}:ผู้ดูแล',
+'grouppage-sysop' => '{{ns:project}}:ผู้ดูแลระบบ',
 'grouppage-bureaucrat' => '{{ns:project}}:ผู้ดูแลสิทธิแต่งตั้ง',
 'grouppage-suppress' => '{{ns:project}}:ผู้ดูแลประวัติ',
 
@@ -1465,7 +1476,7 @@ $1",
 
 # User rights log
 'rightslog' => 'ปูมสิทธิผู้ใช้',
-'rightslogtext' => 'สà¹\88วà¸\99à¸\99ีà¹\89คือปูมการเปลี่ยนแปลงสิทธิผู้ใช้',
+'rightslogtext' => 'à¸\99ีà¹\88คือปูมการเปลี่ยนแปลงสิทธิผู้ใช้',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'อ่านหน้านี้',
@@ -1636,7 +1647,7 @@ $1",
 ถ้าคุณยังคงต้องการอัปโหลดไฟล์ของคุณ กรุณาย้อนกลับไปตั้งชื่อใหม่
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'ไฟล์นี้ซ้ำกับ{{PLURAL:$1|ไฟล์|ไฟล์}}ต่อไปนี้:',
-'file-deleted-duplicate' => 'ไฟล์ที่เหมือไฟล์นี้ ([[:$1]]) เคยถูกลบไปก่อนหน้านี้แล้ว
+'file-deleted-duplicate' => 'à¹\84à¸\9fลà¹\8cà¸\97ีà¹\88à¹\80หมือà¸\99à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89 ([[:$1]]) à¹\80à¸\84ยà¸\96ูà¸\81ลà¸\9aà¹\84à¸\9bà¸\81à¹\88อà¸\99หà¸\99à¹\89าà¸\99ีà¹\89à¹\81ลà¹\89ว
 คุณควรตรวจสอบว่าประวัติการลบของไฟล์ก่อนดำเนินการอัปโหลดใหม่',
 'uploadwarning' => 'คำเตือนการอัปโหลด',
 'uploadwarning-text' => 'กรุณาแก้ไขคำอธิบายไฟล์ด้านล่างนี้ แล้วลองใหม่อีกครั้ง',
@@ -1694,10 +1705,17 @@ $1',
 'backend-fail-closetemp' => 'ไม่สามารถปิดไฟล์ชั่วคราวได้',
 'backend-fail-read' => 'ไม่สามารถอ่านไฟล์ "$1" ได้',
 'backend-fail-create' => 'ไม่สามารถเขียนไฟล์ "$1" ได้',
+'backend-fail-maxsize' => 'ไม่สามารถเขียนไฟล์ "$1" ได้ เพราะมีขนาดใหญ่เกิน $2 ไบต์',
+
+# Lock manager
+'lockmanager-notlocked' => 'ไม่สามารถปลดล็อก "$1" เพราะยังไม่ถูกล็อก',
 
 # ZipDirectoryReader
-'zip-unsupported' => 'ไฟล์ดังกล่าวเป็นไฟล์ ZIP ซึ่งใช้คุณสมบัติ ZIP ที่ไม่ได้รับการสนับสนุนโดย MediaWiki.
-ไฟล์ดังกล่าวนี้ไม่สามารถตรวจสอบเกี่ยวกับการรักษาความปลอดภัยได้อย่างเหมาะสม.',
+'zip-wrong-format' => 'ไฟล์ที่ระบุมิใช่ไฟล์ซิป',
+'zip-bad' => 'ไฟล์วิบัติ หรือมิฉะนั้นก็เป็นไฟล์ซิปที่อ่านไม่ได้ 
+จึงไม่สามารถตรวจสอบความปลอดภัยได้อย่างเหมาะสม',
+'zip-unsupported' => 'ไฟล์ดังกล่าวเป็นไฟล์ซิป ซึ่งใช้คุณสมบัติในการซิปที่ไม่ได้รับการสนับสนุนจากมีเดียวิกิ
+ทำให้ไม่สามารถตรวจสอบความปลอดภัยได้อย่างเหมาะสม',
 
 # Special:UploadStash
 'uploadstash' => 'อัปโหลดไฟล์ซ่อน',
@@ -1728,18 +1746,17 @@ $1',
 'img-auth-bad-query-string' => 'ที่อยู่ URL ดังกล่าวมีชุดข้อความสตริงก์ที่ร้องขอไม่ถูกต้อง',
 
 # HTTP errors
-'http-invalid-url' => 'URL ไม่ถูกต้อง: $1',
-'http-invalid-scheme' => 'ไม่สนับสนุน URL ที่มีรูปแบบ "$1"',
+'http-invalid-url' => 'ยูอาร์แอลไม่ถูกต้อง: $1',
+'http-invalid-scheme' => 'ไม่สนับสนุนยูอาร์แอลที่มีรูปแบบ "$1"',
 'http-request-error' => 'คำขอข้อมูล HTTP ผิดพลาดโดยไม่ทราบสาเหตุ',
 'http-read-error' => 'การอ่านข้อมูล HTTP ผิดพลาด',
 'http-timed-out' => 'คำขอข้อมูล HTTP เกินเวลาที่กำหนด',
 'http-curl-error' => 'เกิดข้อผิดพลาดในการเรียกข้อมูลจาก URL: $1',
-'http-host-unreachable' => 'ไม่สามารถเข้าถึง URL',
 'http-bad-status' => 'พบปัญหาในระหว่างการข้อข้อมูล HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'ไม่สามารถติดต่อยูอาร์แอลได้',
-'upload-curl-error6-text' => 'ยูอารà¹\8cà¹\81อลà¸\97ีà¹\88à¹\83สà¹\88à¸\84à¹\88ามาà¹\84มà¹\88สามารà¸\96à¸\95ิà¸\94à¸\95à¹\88อà¹\84à¸\94à¹\89 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aอีà¸\81à¸\84รัà¹\89à¸\87วà¹\88ายูอารà¹\8cà¹\81อลà¸\99ัà¹\89à¸\99à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¹\81ละà¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸\99ัà¹\89à¸\99ยัà¸\87à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84à¸\94à¹\89à¸\95ามà¸\9bà¸\81à¸\95ิ',
+'upload-curl-error6-text' => 'à¹\84มà¹\88สามารà¸\96à¹\80à¸\82à¹\89าà¸\96ึà¸\87ยูอารà¹\8cà¹\81อลà¸\97ีà¹\88à¹\83สà¹\88มาà¹\84à¸\94à¹\89 à¸\81รุà¸\93าà¸\95รวà¸\88สอà¸\9aอีà¸\81à¸\84รัà¹\89à¸\87วà¹\88ายูอารà¹\8cà¹\81อลà¸\99ัà¹\89à¸\99à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¹\81ละà¹\80วà¹\87à¸\9aà¹\84à¸\8bà¸\95à¹\8cà¸\99ัà¹\89à¸\99ยัà¸\87à¹\83à¸\8aà¹\89à¸\87าà¸\99à¹\84à¸\94à¹\89',
 'upload-curl-error28' => 'เวลาอัปโหลดถูกตัด',
 'upload-curl-error28-text' => 'เว็บไซต์นี้ใช้เวลานานเกินไปในการเชื่อมต่อ กรุณาตรวจสอบว่าเว็บนี้ยังใช้งานได้ตามปกติ หรืออาจจะรอสักครู่แล้วลองอัปโหลดใหม่',
 
@@ -1936,6 +1953,8 @@ $1',
 'wantedpages' => 'หน้าที่ต้องการ',
 'wantedpages-badtitle' => 'ชื่อเรื่องไม่สมเหตุสมผลในเซตผลลัพธ์: $1',
 'wantedfiles' => 'ไฟล์ที่ต้องการ',
+'wantedfiletext-cat' => 'ไฟล์ต่อไปนี้มีการเรียกใช้แต่ไม่มีอยู่ ไฟล์จากคลังเก็บภาษาอื่นอาจแสดงรายการแม้จะมีอยู่ ผลบวกลวงใด ๆ จะถูก<del>ขีดฆ่า</del> ยิ่งไปกว่านั้น หน้าที่ฝังตัวไฟล์ที่ไม่มีอยู่จะแสดงรายการใน [[:$1]]',
+'wantedfiletext-nocat' => 'ไฟล์ต่อไปนี้มีการเรียกใช้แต่ไม่มีอยู่ ไฟล์จากคลังเก็บภาษาอื่นอาจแสดงรายการแม้จะมีอยู่ ผลบวกลวงใด ๆ จะถูก<del>ขีดฆ่า</del>',
 'wantedtemplates' => 'แม่แบบที่ต้องการ',
 'mostlinked' => 'หน้าที่มีการเชื่อมโยงหามากที่สุด',
 'mostlinkedcategories' => 'หมวดหมู่ที่มีการเชื่อมโยงหามากที่สุด',
@@ -1999,7 +2018,7 @@ $1',
 'showhideselectedlogentries' => 'แสดง/ซ่อนหน่วยปูมที่เลือก',
 
 # Special:AllPages
-'allpages' => 'à¸\97ุà¸\81หà¸\99à¹\89า',
+'allpages' => 'หà¸\99à¹\89าà¸\97ัà¹\89à¸\87หมà¸\94',
 'alphaindexline' => '$1 ถึง $2',
 'nextpage' => 'ถัดไป ($1)',
 'prevpage' => 'ก่อนหน้า ($1)',
@@ -2016,6 +2035,9 @@ $1',
 'allpages-bad-ns' => '{{SITENAME}} ไม่มีเนมสเปซ "$1"',
 'allpages-hide-redirects' => 'ซ่อนการเปลี่ยนทาง',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'ดูล่าสุด',
+
 # Special:Categories
 'categories' => 'หมวดหมู่',
 'categoriespagetext' => '{{PLURAL:$1|หมวดหมู่นี้|หมวดหมู่ต่อไปนี้}}มีหน้าหรือสื่อต่าง ๆ
@@ -2121,7 +2143,7 @@ $1',
 'watchnologin' => 'ไม่ได้ล็อกอิน',
 'watchnologintext' => 'ต้อง[[Special:UserLogin|ล็อกอิน]]เพื่อแก้ไขรายการเฝ้าดูของคุณ',
 'addwatch' => 'เพิ่มเข้ารายการเฝ้าดู',
-'addedwatchtext' => 'หà¸\99à¹\89า "[[:$1]]" à¹\84à¸\94à¹\89à¹\80à¸\9eิà¹\88มลà¸\87à¹\83à¸\99[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82อà¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\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à¹\89าà¸\99ลà¹\88าà¸\87',
+'addedwatchtext' => 'หà¸\99à¹\89า "[[:$1]]" à¹\84à¸\94à¹\89à¹\80à¸\9eิà¹\88มลà¸\87à¹\83à¸\99[[Special:Watchlist|รายà¸\81ารà¹\80à¸\9dà¹\89าà¸\94ู]]à¸\82อà¸\87à¸\84ุà¸\93à¹\81ลà¹\89ว à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¹\83à¸\99หà¸\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าว',
 'removewatch' => 'นำออกจากรายการเฝ้าดู',
 'removedwatchtext' => 'หน้า "[[:$1]]" ถูกนำออกจาก[[Special:Watchlist|รายการเฝ้าดูของคุณ]]',
 'watch' => 'เฝ้าดู',
@@ -2132,8 +2154,8 @@ $1',
 'notvisiblerev' => 'รุ่นล่าสุดโดยผู้ใช้อีกคนถูกลบแล้ว',
 'watchnochange' => 'ไม่มีการแก้ไขหน้าที่คุณเฝ้าดูในระยะเวลาที่แสดง',
 'watchlist-details' => 'มี $1 หน้าในรายการเฝ้าดูของคุณ ไม่รวมหน้าอภิปราย',
-'wlheader-enotif' => 'แจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน',
-'wlheader-showupdated' => "หน้าที่มีการเปลี่ยนแปลงตั้งแต่การเข้าชมครั้งล่าสุดของคุณแสดงใน'''ตัวหนา'''",
+'wlheader-enotif' => 'แจ้งเตือนผ่านอีเมลถูกเปิดใช้งาน',
+'wlheader-showupdated' => "หน้าที่มีการเปลี่ยนแปลงตั้งแต่การเข้าชมครั้งล่าสุดของคุณแสดงใน'''ตัวหนา'''",
 'watchmethod-recent' => 'ตรวจสอบการปรับปรุงล่าสุดกับหน้าเฝ้าดู',
 'watchmethod-list' => 'ตรวจสอบหน้าเฝ้าดูกับการแก้ไขล่าสุด',
 'watchlistcontains' => 'รายการเฝ้าดูของคุณมี $1 หน้า',
@@ -2149,7 +2171,7 @@ $1',
 
 'enotif_mailer' => 'แจ้งการแก้ไขจาก {{SITENAME}}',
 'enotif_reset' => 'ทำเครื่องหมายว่าชมทุกหน้าแล้ว',
-'enotif_impersonal_salutation' => 'ผู้ใช้งาน {{SITENAME}}',
+'enotif_impersonal_salutation' => 'ผู้ใช้{{SITENAME}}',
 'enotif_subject_deleted' => 'หน้า $1 บน {{SITENAME}} ถูกลบโดย {{gender:$2|$2}}',
 'enotif_subject_created' => 'หน้า $1 บน {{SITENAME}} ถูกสร้างโดย {{gender:$2|$2}}',
 'enotif_subject_moved' => 'หน้า $1 บน {{SITENAME}} ถูกย้ายโดย {{gender:$2|$2}}',
@@ -2342,7 +2364,7 @@ $UNWATCHURL
 'undeletedrevisions' => '$1 รุ่นการแก้ไขถูกกู้คืน',
 'undeletedrevisions-files' => '$1 รุ่น และ $2 ไฟล์ถูกกู้คืน',
 'undeletedfiles' => '$1 ไฟล์ถูกกู้คืน',
-'cannotundelete' => 'กู้คืนล้มเหลว:
+'cannotundelete' => 'à¸\81ารà¸\81ูà¹\89à¸\84ืà¸\99ลà¹\89มà¹\80หลว:
 $1',
 'undeletedpage' => "'''$1 ถูกกู้คืน'''
 
@@ -2380,7 +2402,7 @@ $1',
 'mycontris' => 'เรื่องที่เขียน',
 'contribsub2' => 'สำหรับ $1 ($2)',
 'nocontribs' => 'ไม่พบการเปลี่ยนแปลงตรงกับเงื่อนไขเหล่านี้',
-'uctop' => ' (บนสุด)',
+'uctop' => '(ล่าสุด)',
 'month' => 'จากเดือน (และก่อนหน้า):',
 'year' => 'จากปี (และก่อนหน้า):',
 
@@ -2451,15 +2473,15 @@ $1',
 'ipboptions' => '2 ชั่วโมง:2 hours,1 วัน:1 day,3 วัน:3 days,1 สัปดาห์:1 week,2 สัปดาห์:2 weeks,1 เดือน:1 month,3 เดือน:3 months,6 เดือน:6 months,1 ปี:1 year,ไม่มีกำหนด:infinite',
 'ipbotheroption' => 'เลือกเวลา',
 'ipbotherreason' => 'เหตุผลอื่น',
-'ipbhidename' => 'à¸\8bà¹\88อà¸\99à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\88าà¸\81à¸\9bูมà¸\81ารà¸\9aลà¹\87อà¸\81 à¹\81ละรายà¸\81ารà¸\9cูà¹\89à¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81',
+'ipbhidename' => 'à¸\8bà¹\88อà¸\99à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\88าà¸\81à¸\9bูมà¹\81ละรายà¸\81ารà¸\95à¹\88าà¸\87 à¹\86',
 'ipbwatchuser' => 'เฝ้าดูหน้าผู้ใช้และหน้าคุยกับผู้ใช้ของผู้ใช้รายนี้',
 'ipb-disableusertalk' => 'ป้องกันไม่ให้ผู้ใช้นี้แก้ไขหน้าคุยกับผู้ใช้ของตัวเองขณะถูกบล็อก',
 'ipb-change-block' => 'บล็อกผู้ใช้อีกครั้งด้วยการตั้งค่าเหล่านี้',
 'ipb-confirm' => 'ยืนยันการบล็อก',
 'badipaddress' => 'เลขที่อยู่ไอพีไม่ถูกต้อง',
-'blockipsuccesssub' => 'à¸\9aลà¹\87อà¸\81à¹\80รียà¸\9aรà¹\89อย',
+'blockipsuccesssub' => 'à¸\9aลà¹\87อà¸\81สำà¹\80รà¹\87à¸\88',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ได้ถูกบล็อกแล้ว<br />
-ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อกดังกล่าว',
+ดู[[Special:BlockList|รายการบล็อก]]เพื่อทบทวนการบล็อก',
 'ipb-blockingself' => 'คุณกำลังบล็อกตัวเอง! แน่ใจแล้วหรือว่าต้องการทำอย่างนั้น',
 'ipb-confirmhideuser' => 'คุณกำลังบล็อกผู้ใช้โดยเป็นผู้ใช้ "ซ่อนผู้ใช้" ซึ่งจะระงับชื่อผู้ใช้ในรายการและหน่วยปูมทั้งหมด คุณแน่ใจหรือว่าต้องการดำเนินการเช่นนั้น',
 'ipb-edit-dropdown' => 'แก้ไขสาเหตุการบล็อก',
@@ -2470,7 +2492,7 @@ $1',
 'unblockip' => 'ปลดบล็อกผู้ใช้',
 'unblockiptext' => 'ใช้แบบด้านล่างเพื่อคืนสิทธิการเข้าถึงการเขียนแก่เลขที่อยู่ไอพี หรือชื่อผู้ใช้ที่เคยถูกบล็อก',
 'ipusubmit' => 'ยกเลิกการบล็อกนี้',
-'unblocked' => '[[User:$1|$1]] ถูกปลดบล็อก',
+'unblocked' => '[[User:$1|$1]] ถูกปลดบล็อกแล้ว',
 'unblocked-range' => '$1 ถูกปลดบล็อกแล้ว',
 'unblocked-id' => 'เลิกบล็อก $1',
 'blocklist' => 'ผู้ใช้ที่ถูกบล็อก',
@@ -2503,7 +2525,8 @@ $1',
 'change-blocklink' => 'เปลี่ยนการบล็อก',
 'contribslink' => 'เรื่องที่เขียน',
 'emaillink' => 'ส่งอีเมล',
-'autoblocker' => 'ถูกบล็อกอัตโนมัติเนื่องจากเลขที่อยู่ไอพีของคุณล่าสุดถูกใช้โดย "[[User:$1|$1]]" เหตุผลที่ให้แก่การบล็อก $1 คือ: "$2"',
+'autoblocker' => 'ได้บล็อกอัตโนมัติเนื่องจากเลขที่อยู่ไอพีของคุณใช้โดย "[[User:$1|$1]]" เมื่อเร็ว ๆ นี้
+เหตุผลที่ให้แก่การบล็อก $1 คือ: "$2"',
 'blocklogpage' => 'ปูมการบล็อก',
 'blocklog-showlog' => 'ผู้ใช้นี้ถูกสกัดกั้นมาก่อน
 ปูมการสกัดกั้นแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:',
@@ -2516,31 +2539,33 @@ $1',
 ดู[[Special:BlockList|รายการบล็อกไอพี]]สำหรับการบล็อกและการระงับในปัจจุบัน',
 'unblocklogentry' => 'เลิกบล็อก $1',
 'block-log-flags-anononly' => 'ผู้ใช้นิรนามเท่านั้น',
-'block-log-flags-nocreate' => 'หà¹\89ามสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89',
-'block-log-flags-noautoblock' => 'ยà¸\81à¹\80ลิà¸\81การบล็อกอัตโนมัติ',
-'block-log-flags-noemail' => 'à¸\9aลà¹\87อà¸\81à¸\81ารสà¹\88à¸\87อีเมล',
-'block-log-flags-nousertalk' => 'à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าอภิà¸\9bรายของตนเอง',
+'block-log-flags-nocreate' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99à¸\81ารสรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี',
+'block-log-flags-noautoblock' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99การบล็อกอัตโนมัติ',
+'block-log-flags-noemail' => 'à¸\9bิà¸\94à¹\83à¸\8aà¹\89à¸\87าà¸\99อีเมล',
+'block-log-flags-nousertalk' => 'à¹\84มà¹\88สามารà¸\96à¹\81à¸\81à¹\89à¹\84à¸\82หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยของตนเอง',
 'block-log-flags-angry-autoblock' => 'การบล็อกอัตโนมัติขั้นสูงเปิดใช้งาน',
 'block-log-flags-hiddenname' => 'ชื่อผู้ใช้ถูกซ่อน',
-'range_block_disabled' => 'ยà¸\81à¹\80ลิà¸\81à¸\81ารà¸\9aลà¹\87อà¸\81à¸\8aà¹\88วà¸\87à¹\84อà¸\9eีà¸\82อà¸\87à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a',
-'ipb_expiry_invalid' => 'à¸\84à¹\88าวัà¸\99หมà¸\94อายุà¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87',
-'ipb_expiry_temp' => 'à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¸\88ะà¸\8bà¹\88อà¸\99à¹\82à¸\94ยถาวร',
-'ipb_hide_invalid' => 'à¹\84มà¹\88สามารà¸\96ยัà¸\9aยัà¹\89à¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\80à¸\9eราะอาà¸\88มีการแก้ไขมากเกินไป',
+'range_block_disabled' => 'à¸\81ารà¸\9aลà¹\87อà¸\81à¸\8aà¹\88วà¸\87à¹\84อà¸\9eีà¸\82อà¸\87à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\96ูà¸\81à¸\9bิà¸\94à¸\81ารà¹\83à¸\8aà¹\89à¸\87าà¸\99',
+'ipb_expiry_invalid' => 'วันหมดอายุไม่ถูกต้อง',
+'ipb_expiry_temp' => 'à¸\81ารà¸\9aลà¹\87อà¸\81à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\8bà¹\88อà¸\99à¸\95à¹\89อà¸\87à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¸\9aลà¹\87อà¸\81ถาวร',
+'ipb_hide_invalid' => 'à¹\84มà¹\88สามารà¸\96ยัà¸\9aยัà¹\89à¸\87à¸\8aืà¹\88อà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸­à¸²à¸\88à¹\80à¸\9eราะมีการแก้ไขมากเกินไป',
 'ipb_already_blocked' => '"$1" ถูกบล็อกแล้วก่อนหน้านี้',
-'ipb-needreblock' => '$1 à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\81ลà¹\89ว à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82หรือไม่',
+'ipb-needreblock' => '$1 à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81à¹\81ลà¹\89ว à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\81ารà¸\95ัà¹\89à¸\87à¸\84à¹\88าหรือไม่',
 'ipb-otherblocks-header' => '{{PLURAL:$1|การบล็อก}}อื่น ๆ',
-'unblock-hideuser' => 'คุณไม่สามารถยกเลิกการบล็อคผู้ใช้งานรายนี้ได้, เนื่องจากชื่อผู้ใช้ของผู้ใช้งานถูกซ่อนอยู่',
-'ipb_cant_unblock' => 'ปัญหา: หมายเลขบล็อก $1 ไม่พบ อาจเกิดจากได้ถูกยกเลิกการบล็อกแล้ว',
-'ipb_blocked_as_range' => 'มีข้อผิดพลาด: เลขที่อยู่ไอพี $1 ไม่ได้ถูกระงับโดยตรงและไม่สามารถยกเลิกการระงับโดยตรงได้.  อย่างไรก็ตาม ไอพีนี้ถูกระงับในฐานะที่เป็นส่วนหนึ่งของเลขที่อยู่ไอพีในพิสัย $2 ซึ่งสามารถยกเลิกการระงับได้',
+'unblock-hideuser' => 'คุณไม่สามารถยกเลิกการบล็อกผู้ใช้งานรายนี้ได้ เพราะชื่อผู้ใช้ถูกซ่อนอยู่',
+'ipb_cant_unblock' => 'ข้อผิดพลาด: ไม่พบหมายเลขบล็อก $1 การบล็อกดังกล่าวอาจถูกปลดบล็อกแล้ว',
+'ipb_blocked_as_range' => 'ข้อผิดพลาด: เลขที่อยู่ไอพี $1 มิได้ถูกบล็อกโดยตรงและไม่สามารถปลดบล็อกได้
+อย่างไรก็ตาม ไอพีนี้ถูกระงับในฐานะที่เป็นส่วนหนึ่งของเลขที่อยู่ไอพีในพิสัย $2 ซึ่งสามารถปลดบล็อกได้',
 'ip_range_invalid' => 'พิสัยไอพีไม่ถูกต้อง',
-'ip_range_toolarge' => 'à¸\82à¸\99าà¸\94à¸\9aลà¹\87อà¸\81มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88า / $1 จะไม่ได้รับอนุญาต',
+'ip_range_toolarge' => 'à¸\9eิสัยà¸\9aลà¹\87อà¸\81à¸\97ีà¹\88มีà¸\82à¸\99าà¸\94à¹\83หà¸\8dà¹\88à¸\81วà¹\88า /$1 จะไม่ได้รับอนุญาต',
 'blockme' => 'บล็อกฉัน',
 'proxyblocker' => 'บล็อกพร็อกซี',
-'proxyblocker-disabled' => 'ฟังก์ชั่นนี้ไม่สามารถใช้ได้',
-'proxyblockreason' => 'เลขที่อยู่ไอพีของคุณถูกบล็อกเนื่องจากเป็นพร็อกซีเปิด กรุณาติดต่อผู้ให้บริการอินเทอร์เน็ตที่คุณใช้งานอยู่เกี่ยวกับปัญหานี้',
-'proxyblocksuccess' => 'บล็อกสำเร็จ',
-'sorbsreason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ถูกใช้งานในเว็บไซต์',
-'sorbs_create_account_reason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ถูกใช้งานในเว็บไซต์ ดังนั้นคุณไม่สามารถสร้างชื่อบัญชีผู้ใช้ได้',
+'proxyblocker-disabled' => 'ฟังก์ชันนี้ถูกปิดใช้งาน',
+'proxyblockreason' => 'เลขที่อยู่ไอพีของคุณถูกบล็อกเนื่องจากเป็นพร็อกซีเปิด กรุณาติดต่อผู้ให้บริการอินเทอร์เน็ตหรือฝ่ายสนับสนุนเทคนิคขององค์การคุณ และแจ้งให้พวกเขาทราบถึงปัญหาความปลอดภัยร้ายแรงนี้',
+'proxyblocksuccess' => 'สำเร็จ',
+'sorbsreason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้',
+'sorbs_create_account_reason' => 'เลขที่อยู่ไอพีของคุณอยู่ในพร็อกซีเปิดในส่วน DNSBL ที่ {{SITENAME}} ใช้ 
+คุณไม่สามารถสร้างบัญชีได้',
 'cant-block-while-blocked' => 'คุณไม่สามารถบล็อกผู้ใช้อื่นในขณะที่คุณกำลังถูกบล็อก',
 'cant-see-hidden-user' => 'ผู้ใช้ที่คุณกำลังพยายามระงับนั้นได้ถูกระงับหรือซ่อนเดิมอยู่แล้ว เนื่องจากคุณไม่มีสิทธิซ่อนผู้ใช้ คุณจึงไม่สามารถดูหรือแก้ไขการระงับผู้ใช้ได้',
 'ipbblocked' => 'คุณไม่สามารถบล็อกหรือปลดบล็อกผู้ใช้คนอื่น เนื่องจากคุณกำลังถูกบล็อก',
@@ -2603,16 +2628,16 @@ $1',
 'movenotallowedfile' => 'คุณไม่มีสิทธิย้ายไฟล์',
 'cant-move-user-page' => 'คุณไม่มีสิทธิย้ายหน้าผู้ใช้ (แยกจากหน้าย่อย)',
 'cant-move-to-user-page' => 'คุณไม่มีสิทธิย้ายหน้าใด ๆ ไปเป็นหน้าผู้ใช้ (ยกเว้นหน้าย่อยของผู้ใช้)',
-'newtitle' => 'à¸\8aืà¹\88อà¹\83หมà¹\88',
-'move-watch' => 'à¹\80à¸\9dà¹\89าà¸\94ูหà¸\99à¹\89าà¸\99ีà¹\89',
+'newtitle' => 'à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88:',
+'move-watch' => 'à¹\80à¸\9dà¹\89าà¸\94ูหà¸\99à¹\89าà¸\95à¹\89à¸\99à¸\97าà¸\87à¹\81ละหà¸\99à¹\89าà¸\9bลายà¸\97าà¸\87',
 'movepagebtn' => 'เปลี่ยนชื่อ',
 'pagemovedsub' => 'เปลี่ยนชื่อสำเร็จ',
 'movepage-moved' => '\'\'\'"$1" ถูกเปลี่ยนชื่อเป็น "$2"\'\'\'',
 'movepage-moved-redirect' => 'หน้าเปลี่ยนทางถูกสร้างขึ้น',
 'movepage-moved-noredirect' => 'การสร้างหน้าเปลี่ยนทางถูกระงับ',
 'articleexists' => 'หน้าที่ต้องการมีอยู่แล้ว หรือชื่อที่เลือกไม่ถูกต้อง กรุณาเลือกชื่อใหม่',
-'cantmove-titleprotected' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\8aืà¹\88อà¹\83หมà¹\88à¸\99ีà¹\89à¹\84à¸\94à¹\89รัà¸\9aà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¹\84มà¹\88à¹\83หà¹\89สรà¹\89าà¸\87à¹\83หมà¹\88',
-'talkexists' => "'''à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าสำà¹\80รà¹\87à¸\88 à¹\81à¸\95à¹\88หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¹\84มà¹\88สามารà¸\96à¸\96ูà¸\81à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81มีหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¹\83à¸\99à¸\8aืà¹\88อà¹\83หมà¹\88à¹\81ลà¹\89ว à¹\82à¸\9bรà¸\94รวมà¹\80อà¸\87à¸\94à¹\89วยมือ'''",
+'cantmove-titleprotected' => 'à¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¸\99ีà¹\89à¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88à¸\96ูà¸\81à¸\9bà¹\89อà¸\87à¸\81ัà¸\99มิà¹\83หà¹\89สรà¹\89าà¸\87',
+'talkexists' => "'''à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าสำà¹\80รà¹\87à¸\88 à¹\81à¸\95à¹\88หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¹\84มà¹\88สามารà¸\96à¸\96ูà¸\81à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¹\84à¸\94à¹\89 à¹\80à¸\99ืà¹\88อà¸\87à¸\88าà¸\81มีหà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¹\83à¸\99à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88à¹\81ลà¹\89ว à¹\82à¸\9bรà¸\94รวมหà¸\99à¹\89าà¹\80หลà¹\88าà¸\99ัà¹\89à¸\99à¹\80อà¸\87'''",
 'movedto' => 'เปลี่ยนชื่อเป็น',
 'movetalk' => 'เปลี่ยนชื่อหน้าพูดคุยพร้อมกัน',
 'move-subpages' => 'ย้ายหน้าย่อยทั้งหมด (มากถึง $1 หน้า)',
@@ -2622,7 +2647,7 @@ $1',
 'movepage-page-unmoved' => 'หน้า $1 ไม่สามารถเปลี่ยนชื่อเป็น $2 ได้',
 'movepage-max-pages' => 'หน้า $1 หน้าถูกย้ายไป ซึ่งมากสุดแล้ว และจะไม่มีหน้าใดย้ายอัตโนมัติเพิ่ม',
 'movelogpage' => 'ปูมการเปลี่ยนชื่อ',
-'movelogpagetext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¸\97ุà¸\81หà¸\99à¹\89า',
+'movelogpagetext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¹\80à¸\9bà¹\87à¸\99รายà¸\81ารà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อà¸\97ัà¹\89à¸\87หมà¸\94',
 'movesubpage' => '{{PLURAL:$1|หน้าย่อย|หน้าย่อย}}',
 'movesubpagetext' => 'หน้านี้มีหน้าย่อย $1 หน้า ดังด้านล่าง',
 'movenosubpage' => 'หน้านี้ไม่มีหน้าย่อย',
@@ -2640,7 +2665,7 @@ $1',
 'immobile-target-namespace-iw' => 'ไม่สามารถย้ายไปยังหน้าปลายทางที่เป็นลิงก์ interwiki ได้',
 'immobile-source-page' => 'หน้านี้ไม่สามารถเปลี่ยนชื่อได้',
 'immobile-target-page' => 'ไม่สามารถเปลี่ยนไปยังชื่อที่ต้องการได้',
-'imagenocrossnamespace' => 'à¹\84มà¹\88สามารà¸\96ยà¹\89ายà¹\84à¸\9fลà¹\8cà¹\84à¸\9bยัà¸\87à¹\80à¸\99มสà¹\80à¸\9bà¸\8bà¸\97ีà¹\88à¹\84มà¹\88รอà¸\87รัà¸\9a',
+'imagenocrossnamespace' => 'à¹\84มà¹\88สามารà¸\96ยà¹\89ายà¹\84à¸\9fลà¹\8cà¹\84à¸\9bยัà¸\87à¹\80à¸\99มสà¹\80à¸\9bà¸\8bอืà¹\88à¸\99',
 'nonfile-cannot-move-to-file' => 'ไม่สามารถย้ายจากเนมสเปซอื่นมาเป็นเนมสเปซไฟล์',
 'imagetypemismatch' => 'นามสกุลของไฟล์ใหม่ไม่ตรงกับชนิดของไฟล์',
 'imageinvalidfilename' => 'ชื่อไฟล์เป้าหมายไม่ถูกต้อง',
@@ -2665,9 +2690,10 @@ $1',
 'exportall' => 'ส่งออกข้อมูลทุกหน้า',
 'exportcuronly' => 'เอาเฉพาะรุ่นปัจจุบันเท่านั้น ไม่เอาประวัติทั้งหมด',
 'exportnohistory' => "----
-'''หมายเหตุ:''' การส่งออกประวัติหน้าทั้งหมดผ่านช่องทางนี้ได้ถูกปิดไว้ เนื่องจากปัญหาทางเทคนิคในด้านประสิทธิภาพ",
-'export-submit' => 'ส่งออกมา',
-'export-addcattext' => 'รวมหน้าจากหมวดหมู่:',
+'''หมายเหตุ:''' การส่งออกประวัติหน้าทั้งหมดผ่านแบบนี้ถูกปิดใช้งาน เนื่องจากปัญหาด้านประสิทธิภาพ",
+'exportlistauthors' => 'รวมรายการผู้ร่วมเขียนเต็มของแต่ละหน้า',
+'export-submit' => 'ส่งออก',
+'export-addcattext' => 'เพิ่มหน้าจากหมวดหมู่:',
 'export-addcat' => 'เพิ่ม',
 'export-addnstext' => 'เพิ่มหน้าจากเนมสเปซ:',
 'export-addns' => 'เพิ่ม',
@@ -2680,8 +2706,8 @@ $1',
 'allmessagesname' => 'ชื่อ',
 'allmessagesdefault' => 'ข้อความตามค่าตั้งต้น',
 'allmessagescurrent' => 'ข้อความปัจจุบัน',
-'allmessagestext' => 'รายà¸\81ารà¸\82à¹\89อà¸\84วามà¸\82อà¸\87ระà¸\9aà¸\9a อยู่ในเนมสเปซมีเดียวิกิ
-à¸\81รุà¸\93าà¹\84à¸\9bà¸\97ีà¹\88 [//www.mediawiki.org/wiki/Localisation à¸¡à¸µà¹\80à¸\94ียวิà¸\81ิ] à¹\81ละ [//translatewiki.new translatewiki.net] à¸\96à¹\89าà¸\84ุà¸\93ยัà¸\87อยาà¸\81à¸\97ีà¹\88à¸\88ะแปลข้อความของระบบมีเดียวิกิ',
+'allmessagestext' => 'à¸\99ีà¹\88à¸\84ือรายà¸\81ารà¸\82à¹\89อà¸\84วามà¸\82อà¸\87ระà¸\9aà¸\9aà¸\97ีà¹\88อยู่ในเนมสเปซมีเดียวิกิ
+à¸\81รุà¸\93าอà¹\88าà¸\99หà¸\99à¹\89า[//www.mediawiki.org/wiki/Localisation à¹\80à¸\97ศวิวัà¸\95à¸\99à¹\8cà¸\82อà¸\87มีà¹\80à¸\94ียวิà¸\81ิ] à¹\81ละ [//translatewiki.net translatewiki.net] à¸\96à¹\89าà¸\84ุà¸\93อยาà¸\81à¸\97ีà¹\88à¸\88ะà¸\8aà¹\88วยแปลข้อความของระบบมีเดียวิกิ',
 'allmessagesnotsupportedDB' => "หน้านี้ไม่สามารถใช้งานได้เนื่องจาก '''\$wgUseDatabaseMessages''' ถูกระงับการใช้งาน",
 'allmessages-filter-legend' => 'กรอง',
 'allmessages-filter' => 'กรองตามสถานะที่เลือก:',
@@ -2744,6 +2770,9 @@ $1',
 'import-token-mismatch' => 'ข้อมูลเซชชันสูญหาย ให้ลองใหม่อีกครั้ง',
 'import-invalid-interwiki' => 'ไม่สามารถนำข้อมูลเข้าจากวิกิที่กำหนดได้',
 'import-error-create' => 'หน้า "$1" ยังไม่ได้ถูกนำเข้า เนื่องจากคุณไม่ได้รับอนุญาตให้สามารถสร้างได้',
+'import-options-wrong' => '{{PLURAL:$2|ตัวเลือก|ตัวเลือก}}ผิด:<nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'หน้าต้นทางที่กำหนดมีชื่อเรื่องไม่ถูกต้อง',
+'import-rootpage-nosubpage' => 'เนมสเปซ "$1" ของหน้าต้นทางไม่อนุญาตหน้าย่อย',
 
 # Import log
 'importlogpage' => 'ปูมการนำเข้า',
@@ -2755,6 +2784,10 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'การทดสอบจาวาสคริปต์',
+'javascripttest-title' => 'กำลังดำเนินงานทดสอบ $1',
+'javascripttest-pagetext-noframework' => 'หน้านี้สงวนไว้สำหรับดำเนินงานการทดสอบจาวาสคริปต์',
+'javascripttest-pagetext-skins' => 'เลือกสกินที่จะดำเนินงานการทดสอบ:',
+'javascripttest-qunit-intro' => 'ดู[$1 เอกสารกำกับการทดสอบ]บน mediawiki.org',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'หน้าผู้ใช้ของคุณ',
@@ -2827,17 +2860,11 @@ $1',
 
 # Stylesheets
 'common.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทุกสกิน */',
-'standard.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินคลาสสิก */',
-'nostalgia.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินนอสตัลเจีย */',
 'cologneblue.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */',
 'monobook.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */',
-'myskin.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินมายสกิน */',
-'chick.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินชิก */',
-'simple.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินซิมเปิล */',
 'modern.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
 'vector.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
 'print.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ข้อมูลส่งออกเป็นสิ่งพิมพ์ */',
-'handheld.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่อุปกรณ์เคลื่อนที่ โดยขึ้นอยู่กับสกินที่ตั้งค่าไว้ใน $wgHandheldStyle */',
 'noscript.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ปิดการใช้งานจาวาสคริปต์ */',
 'group-autoconfirmed.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทั่วไปเท่านั้น */',
 'group-bot.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่บอตเท่านั้น */',
@@ -2846,13 +2873,8 @@ $1',
 
 # Scripts
 'common.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทุกคนในทุกหน้า */',
-'standard.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินคลาสสิก */',
-'nostalgia.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินนอสตัลเจีย */',
 'cologneblue.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */',
 'monobook.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */',
-'myskin.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินมายสกิน */',
-'chick.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินชิก */',
-'simple.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินซิมเปิล */',
 'modern.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
 'vector.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
 'group-autoconfirmed.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทั่วไปเท่านั้น */',
@@ -2879,7 +2901,7 @@ $1',
 'spamprotectiontitle' => 'ตัวกรองป้องกันสแปม',
 'spamprotectiontext' => 'ข้อความที่คุณต้องการบันทึกถูกตัวกรองสแปมบล็อก
 อาจเกิดจากลิงก์ไปยังเว็บไซต์ภายนอกที่ถูกขึ้นบัญชีดำ',
-'spamprotectionmatch' => 'à¸\82à¹\89อà¸\84วามà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\81ระà¸\95ุà¹\89à¸\99ให้ตัวกรองสแปมของเราทำงาน: $1',
+'spamprotectionmatch' => 'à¸\82à¹\89อà¸\84วามà¸\95à¹\88อà¹\84à¸\9bà¸\99ีà¹\89à¸\97ำให้ตัวกรองสแปมของเราทำงาน: $1',
 'spambot_username' => 'กวาดล้างมีเดียวิกิสแปม',
 'spam_reverting' => 'ย้อนกลับไปรุ่นก่อนหน้าที่ไม่มีลิงก์ไปยังเว็บ $1',
 'spam_blanking' => 'รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)',
@@ -2925,13 +2947,8 @@ $1',
 'pageinfo-category-files' => 'จำนวนไฟล์',
 
 # Skin names
-'skinname-standard' => 'คลาสสิก',
-'skinname-nostalgia' => 'นอสตัลเจีย',
 'skinname-cologneblue' => 'โคโลญจ์บลู',
 'skinname-monobook' => 'โมโนบุ๊ก',
-'skinname-myskin' => 'มายสกิน',
-'skinname-chick' => 'ชิก',
-'skinname-simple' => 'ซิมเปิล',
 'skinname-modern' => 'โมเดิร์น',
 'skinname-vector' => 'เวกเตอร์',
 
@@ -2945,6 +2962,8 @@ $1',
 'markedaspatrollederror' => 'ไม่สามารถทำเครื่องหมายว่าตรวจสอบแล้ว',
 'markedaspatrollederrortext' => 'คุณจำเป็นต้องระบุรุ่นการแก้ไขที่กำหนดว่าตรวจสอบแล้ว',
 'markedaspatrollederror-noautopatrol' => 'คุณไม่สามารถทำเครื่องหมายการแก้ไขของคุณเองว่าตรวจสอบแล้ว',
+'markedaspatrollednotify' => 'การเปลี่ยนแปลงไปยัง $1 ถูกทำเครื่องหมายว่าตรวจสอบแล้ว',
+'markedaspatrollederrornotify' => 'การทำเครื่องหมายว่าตรวจสอบแล้วล้มเหลว',
 
 # Patrol log
 'patrol-log-page' => 'ปูมการตรวจสอบ',
@@ -3039,7 +3058,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ความกว้าง',
 'exif-imagelength' => 'ความสูง',
 'exif-bitspersample' => 'บิต ต่อคอมโพเนนต์',
@@ -3153,6 +3172,7 @@ $1',
 'exif-gpsareainformation' => 'ชื่อของพื้นที่จีพีเอส',
 'exif-gpsdatestamp' => 'วันที่จีพีเอส',
 'exif-gpsdifferential' => 'การปรับแค่ข้อแตกต่างจีพีเอส',
+'exif-jpegfilecomment' => 'ความเห็นไฟล์ JPEG',
 'exif-keywords' => 'คำสำคัญ',
 'exif-objectname' => 'ชื่อเรื่องสั้น',
 'exif-headline' => 'พาดหัวข่าว',
@@ -3162,7 +3182,7 @@ $1',
 'exif-label' => 'ป้ายฉลาก',
 'exif-usageterms' => 'ข้อตกลงในการใช้งาน',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'ไม่ได้บีบอัด',
 
 'exif-unknowndate' => 'ไม่ทราบวัน',
@@ -3342,24 +3362,24 @@ $1',
 เปิดใช้งานปุ่มด้านล่างเพื่อส่งเมลยืนยันไปยังที่อยู่ของคุณ
 เมลจะรวมลิงก์ซึ่งมีรหัส
 โหลดลิงก์ในเบราว์เซอร์ของคุณเพื่อยืนยันว่าที่อยู่อีเมลของคุณสมเหตุสมผล',
-'confirmemail_pending' => 'รหัสยืà¸\99ยัà¸\99à¸\96ูà¸\81อีà¹\80มลà¹\84à¸\9bหาคุณแล้ว 
-à¸\96à¹\89าà¸\84ุà¸\93à¹\80à¸\9eิà¹\88à¸\87สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี à¸\84ุà¸\93อาà¸\88อยาà¸\81รอสัà¸\81à¸\84รูà¹\88à¹\83หà¹\89สà¹\88à¸\87à¹\84à¸\9bà¸\96ึà¸\87à¸\81à¹\88อà¸\99à¸\9eยายามà¸\82อรหัสà¹\83หมà¹\88',
+'confirmemail_pending' => 'รหัสยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89สà¹\88à¸\87à¹\84à¸\9bยัà¸\87อีà¹\80มลà¸\82อà¸\87คุณแล้ว 
+à¸\96à¹\89าà¸\84ุà¸\93à¹\80à¸\9eิà¹\88à¸\87สรà¹\89าà¸\87à¸\9aัà¸\8dà¸\8aี à¸\84ุà¸\93อาà¸\88à¸\95à¹\89อà¸\87รอสัà¸\81à¸\84รูà¹\88à¹\83หà¹\89รหัสสà¹\88à¸\87à¹\84à¸\9bà¸\96ึà¸\87à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\84ุà¸\93 à¹\81à¸\97à¸\99à¸\97ีà¹\88à¸\88ะà¸\82อรหัสยืà¸\99ยัà¸\99à¹\83หมà¹\88à¸\97ัà¸\99à¸\97ี',
 'confirmemail_send' => 'ส่งรหัสยืนยันทางอีเมล',
 'confirmemail_sent' => 'ส่งอีเมลยืนยันแล้ว',
 'confirmemail_oncreate' => 'รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ
 รหัสนี้ไม่กำหนดให้ต้องล็อกอิน แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้',
-'confirmemail_sendfailed' => '{{SITENAME}} ไม่สามารถส่งเมลยืนยันได้
-à¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าà¹\84มà¹\88มีอัà¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88สมà¹\80หà¸\95ุสมà¸\9cล
+'confirmemail_sendfailed' => '{{SITENAME}}ไม่สามารถส่งอีเมลยืนยันได้
+à¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าà¹\84มà¹\88มีอัà¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87
 
 ข้อความตีกลับ: $1',
 'confirmemail_invalid' => 'รหัสยืนยันไม่ถูกต้อง 
 รหัสอาจหมดอายุแล้ว',
-'confirmemail_needlogin' => 'ต้อง $1 เพื่อยืนยันที่อยู่อีเมลของคุณ',
+'confirmemail_needlogin' => 'à¸\84ุà¸\93à¸\95à¹\89อà¸\87 $1 à¹\80à¸\9eืà¹\88อยืà¸\99ยัà¸\99à¸\97ีà¹\88อยูà¹\88อีà¹\80มลà¸\82อà¸\87à¸\84ุà¸\93',
 'confirmemail_success' => 'อีเมลคุณได้รับการยืนยันแล้ว
 คุณอาจ[[Special:UserLogin|ล็อกอิน]]ตอนนี้และสนุกกับการแก้ไขวิกิ',
 'confirmemail_loggedin' => 'อีเมลคุณได้รับการยืนยันแล้ว',
 'confirmemail_error' => 'เกิดปัญหาขณะบันทึกการยืนยันของคุณ',
-'confirmemail_subject' => 'การยืนยันที่อยู่อีเมล {{SITENAME}}',
+'confirmemail_subject' => 'การยืนยันที่อยู่อีเมลของ{{SITENAME}}',
 'confirmemail_body' => 'ใครบางคน ซึ่งอาจจะเป็นคุณ จากหมายเลขไอพี $1 ได้ลงทะเบียนในชื่อ "$2" โดยใช้อีเมลนี้ที่ {{SITENAME}}
 
 เพื่อยืนยันว่าบัญชีผู้ใช้นี้เป็นของคุณอย่างแน่อน และใช้งานฟีเจอร์ส่งอีเมลหาผู้ใช้บน {{SITENAME}} กดลิงก์นี้ในเว็บเบราวเซอร์ของคุณ:
@@ -3544,15 +3564,6 @@ $5
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath เส้นทางบทความ]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath เส้นทางสคริปต์]',
 
-# Special:FilePath
-'filepath' => 'พาธของไฟล์',
-'filepath-page' => '{{ns:file}}:',
-'filepath-submit' => 'ไป',
-'filepath-summary' => 'หน้าพิเศษนี้คืนค่าเป็นเส้นทางเต็มของไฟล์
-ไฟล์ภาพจะถูกแสดงในขนาดเต็ม และไฟล์ประเภทอื่นจะถูกเปิดด้วยโปรแกรมที่เกี่ยวข้องโดยตรง
-
-กรุณาป้อนชื่อไฟล์โดยไม่มี "{{ns:file}}:" นำหน้า',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ค้นหาไฟล์ที่ซ้ำซ้อน',
 'fileduplicatesearch-summary' => 'ค้นหาไฟล์ที่ซ้ำกันตามค่าแฮช',
@@ -3641,6 +3652,8 @@ $5
 'htmlform-submit' => 'ส่งข้อมูล',
 'htmlform-reset' => 'ยกเลิกการเปลื่ยนแปลง',
 'htmlform-selectorother-other' => 'อื่น ๆ',
+'htmlform-no' => 'ไม่',
+'htmlform-yes' => 'ใช่',
 
 # SQLite database support
 'sqlite-has-fts' => 'รุ่น $1 พร้อมการสนับสนุนการค้นหาข้อความแบบเต็ม',
@@ -3679,23 +3692,31 @@ $5
 'rightsnone' => '(ไม่มี)',
 
 # Feedback
+'feedback-bugornote' => 'หากคุณได้อธิบายปัญหาทางเทคนิคในรายละเอียดแล้ว โปรด[$1 รายงานจุดบกพร่อง]
+มิฉะนั้น คุณสามารถแบบอย่างง่ายด้านล่าง ความเห็นของคุณจะถูกเพิ่มเข้าสู่ "[$3 $2]" ร่วมกับชื่อผู้ใช้ของคุณ',
+'feedback-subject' => 'เรื่อง:',
 'feedback-message' => 'ข้อความ:',
 'feedback-cancel' => 'ยกเลิก',
 'feedback-submit' => 'ส่งคำติชม',
 'feedback-adding' => 'เพิ่มคำติชมเข้าไปที่หน้า...',
+'feedback-thanks' => 'ขอบคุณ! ผลป้อนกลับของคุณถูกโพสต์ไปยังหน้า "[$2 $1]" แล้ว',
 'feedback-close' => 'เสร็จสิ้น',
+'feedback-bugcheck' => 'ยอดเยี่ยม! เพียงตรวจสอบว่าจุดบกพร่องนั้นมิใช่หนึ่งใน[$1 จุดบกพร่องที่ทราบแล้ว]',
+'feedback-bugnew' => 'ฉันตรวจสอบแล้ว รายงานจุดบกพร่องใหม่',
 
 # Search suggestions
 'searchsuggest-search' => 'ค้นหา',
 'searchsuggest-containing' => 'ประกอบไปด้วย...',
 
 # API errors
+'api-error-badaccess-groups' => 'คุณไม่ได้รับอนุญาตให้อัปโหลดไฟล์มายังวิกินี้',
 'api-error-empty-file' => 'ไฟล์ที่คุณส่งมานั้นว่าง',
 'api-error-emptypage' => 'ไม่อนุญาตให้สร้างหน้าใหม่ที่ว่าง',
 'api-error-file-too-large' => 'ไฟล์ที่คุณส่งมาใหญ่เกินไป',
 'api-error-filename-tooshort' => 'ชื่อไฟล์สั้นเกินไป',
 'api-error-filetype-banned' => 'ไฟล์ประเภทนี้ถูกห้าม',
 'api-error-mustbeloggedin' => 'กรุณาลงชื่อเข้าใช้เพื่ออัปโหลดไฟล์',
+'api-error-uploaddisabled' => 'การอัปโหลดถูกปิดใช้งานบนวิกินี้',
 
 # Durations
 'duration-seconds' => '$1 วินาที',
index 84c3abc..e1e4f45 100644 (file)
@@ -68,8 +68,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Gözegçilikde saklaýan ulanyjylaryň sanyny görkez',
 'tog-oldsig' => 'Bar bolan gol:',
 'tog-fancysig' => 'Gola wikitekst hökmünde çemeleş (awtomatik çykgytsyz)',
-'tog-externaleditor' => 'Gaýybana daşarky redaktor ulan (diňe hünärmenler üçin, kompýuteriňizde ýörite sazlamalar talap edilýär. [//www.mediawiki.org/wiki/Manual:External_editors Jikme-jik.])',
-'tog-externaldiff' => 'Başga programmalaryň üsti bilen deňeşdir (diňe hünärmenler üçin, kompýuteriňizde ýörite sazlamalar talap edilýär)',
 'tog-showjumplinks' => '"Git" çykgydyny işlet',
 'tog-uselivepreview' => 'Gönümel deslapky syny ulan (JavaScript) (Synag edilýär)',
 'tog-forceeditsummary' => 'Gysgaça mazmuny boş galdyran mahalym maňa ýatlat',
@@ -300,9 +298,9 @@ Bu sahypany ulanmak üçin MediaWikiniň $1 wersiýasy talap edilýär. [[Specia
 'ok' => 'OK',
 'retrievedfrom' => '"$1" adresinden alyndy.',
 'youhavenewmessages' => 'Size $1 bar. ($2)',
-'newmessageslink' => 'täze habarlaşyk',
+'newmessageslink' => 'täze habar',
 'newmessagesdifflink' => 'soňky üýtgeşme',
-'youhavenewmessagesmulti' => 'Size $1-de täze habarlaşyk bar.',
+'youhavenewmessagesmulti' => 'Size $1-de täze habar bar.',
 'editsection' => 'redaktirle',
 'editold' => 'redaktirle',
 'viewsourceold' => 'çeşmäni gör',
@@ -1012,14 +1010,6 @@ Gözlegiňiziň başyna '''all:''' pristawkasyny goşup tutuş mazmuny (şol san
 Ýogsa-da, oňa çenli Google bilen gözleg geçirip bilersiňiz.
 Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
 
-# Quickbar
-'qbsettings' => 'Tiz panel',
-'qbsettings-none' => 'Hiç biri',
-'qbsettings-fixedleft' => 'Çepe berkidildi',
-'qbsettings-fixedright' => 'Saga berkidildi',
-'qbsettings-floatingleft' => 'Çepe ýaplanýar',
-'qbsettings-floatingright' => 'Saga ýaplanýar',
-
 # Preferences page
 'preferences' => 'Ileri tutmalar',
 'mypreferences' => 'Ileri tutmalar',
@@ -1484,7 +1474,6 @@ Howpsuzlygyň optimizasiýasy üçin, img_auth.php ýapylyp goýuldy.',
 'http-read-error' => 'HTTP okamak säwligi.',
 'http-timed-out' => 'HTTP talabynyň wagty geçdi.',
 'http-curl-error' => 'URL äkelmek säwligi: $1',
-'http-host-unreachable' => 'URL-ä baryp bolmaýar',
 'http-bad-status' => 'HTTP talaby wagtynda problema döredi: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1861,8 +1850,8 @@ Aňsatlyk bilen saýlap almak üçin bolsa, [[Special:RecentChanges|soňky üýt
 'notvisiblerev' => 'Başga bir ulanyja degişli iň soňky wersiýa öçürilipdir',
 'watchnochange' => 'Gözegçilik edýän sahypalaryňyzyň hiç birisi görkezilen wagtyň dowamynda redaktirlenmändir.',
 'watchlist-details' => 'Çekişme sahypalaryny hasap etmäniňde, gözegçilik sanawyňyzda {{PLURAL:$1|$1 sahypa|$1 sahypa}} bar.',
-'wlheader-enotif' => 'E-poçta bilen habar beriş açyk.',
-'wlheader-showupdated' => "Soňky gezek baryp görenizden soňra üýtgedilen sahypalar '''goýy şrift''' bilen görkezilýär.",
+'wlheader-enotif' => 'E-poçta bilen habar beriş açyk.',
+'wlheader-showupdated' => "Soňky gezek baryp görenizden soňra üýtgedilen sahypalar '''goýy şrift''' bilen görkezilýär.",
 'watchmethod-recent' => 'soňky özgerdişlerdäki gözegçilikde saklaýan sahypalaryňyz barlanylýar',
 'watchmethod-list' => 'gözegçilikde saklaýan sahypalaryňyzdaky soňky özgerdişler barlanylýar',
 'watchlistcontains' => 'Gözegçilik sanawyňyzda $1 sany {{PLURAL:$1|sahypa|sahypa}} bar.',
@@ -2616,7 +2605,7 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'In',
 'exif-imagelength' => 'Beýiklik',
 'exif-bitspersample' => 'Komponent başyna bit',
@@ -2732,7 +2721,7 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
 'exif-languagecode' => 'Dil',
 'exif-iimcategory' => 'Kategoriýa',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Gysylmadyk',
 
 'exif-unknowndate' => 'Näbelli sene',
@@ -3051,15 +3040,6 @@ Bu programmanyň ýany bilen siz [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General P
 'version-software-product' => 'Önüm',
 'version-software-version' => 'Wersiýa',
 
-# Special:FilePath
-'filepath' => 'Faýla barýan ýol',
-'filepath-page' => 'Faýl:',
-'filepath-submit' => 'Git',
-'filepath-summary' => 'Bu ýörite sahypa faýla barýan doly ýoly gaýtaryp getirýär.
-Suratlar doly ölçegde görkezilýär, beýleki faýl görnüşleri degişli programmalary bilen gönümel başladylýar.
-
-Faýlyň adyny "{{ns:file}}:" pristawkasyz giriziň.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Dublikat faýllaryň gözlegi',
 'fileduplicatesearch-summary' => 'Heş kodlary boýunça meňzeş faýllary gözle.',
index f8c609a..bad2c0e 100644 (file)
@@ -176,8 +176,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ipakita ang bilang ng mga nagbabantay na tagagamit',
 'tog-oldsig' => 'Umiiral na lagda:',
 'tog-fancysig' => 'Ituring ang lagda bilang teksto ng wiki (walang automatikong pagkawing)',
-'tog-externaleditor' => 'Gumamit ng nakatakdang panlabas na pampatnugot ayon sa likas na pagkakatakda (para sa mga dalubhasa lamang, kailangan ng natatanging mga pagtatakda sa iyong kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors Marami pang kabatiran.])',
-'tog-externaldiff' => 'Gumamit ng likas na nakatakdang panlabas na pagkakaiba (para sa mga dalubhasa lamang, kailangan ng natatanging mga pagtatakda sa iyong kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors Mas marami pang kabatiran.])',
 'tog-showjumplinks' => 'Payagan ang mga "tumalon sa" na kawing pampagamit',
 'tog-uselivepreview' => 'Gamitin ang buhay na paunang tingin (JavaScript) (Eksperimental)',
 'tog-forceeditsummary' => 'Pagsabihan ako kapag nagpapasok ng walang-lamang buod ng pagbabago',
@@ -192,6 +190,7 @@ $messages = array(
 'tog-showhiddencats' => 'Ipakita ang mga nakatagong kategorya',
 'tog-noconvertlink' => 'Huwag paganahin ang pagpapalit ng pamagat na pangkawing',
 'tog-norollbackdiff' => 'Alisin ang mga pagkakaiba pagkatapos isagawa ang pagpapagulong na pabalik sa dati',
+'tog-useeditwarning' => 'Magbabala sa akin kapag umalis ako sa isang pahina ng pampatnugot na hindi pa nasasagip ang mga pagbabago',
 
 'underline-always' => 'Palagi',
 'underline-never' => 'Hindi magpakailanman',
@@ -950,6 +949,8 @@ Tila binura na ito.',
 'edit-already-exists' => 'Hindi makalikha ng isang bagong pahina.
 Umiiral na ito.',
 'defaultmessagetext' => 'Nakatakdang teksto ng mensahe',
+'editwarning-warning' => 'Ang paglisan mula sa pahinang ito ay maaaring makasanhi sa iyo ng pagkawala ng anumang mga pagbabagong ginawa mo.
+Kung nakalagda ka, maaari mong huwag paganahin ang babalang ito sa loob ng seksyong "May binabago" ng mga nais mo.',
 
 # Content models
 'content-model-wikitext' => 'wikiteksto',
@@ -1231,15 +1232,6 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'search-external' => 'Panlabas na paghahanap',
 'searchdisabled' => 'Nakapatay ang paghahanap sa {{SITENAME}}. Maaari kang pansamantalang maghanap sa pamamagitan ng Google. Tandaan na maaaring luma na ang kanilang mga indeks sa nilalaman ng {{SITENAME}}.',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Wala',
-'qbsettings-fixedleft' => 'Inayos ang kaliwa',
-'qbsettings-fixedright' => 'Inayos ang kanan',
-'qbsettings-floatingleft' => 'Kaliwa lumulutang',
-'qbsettings-floatingright' => 'Kanan lumulutang',
-'qbsettings-directionality' => 'Naayos na, ayon sa kapupuntahan ng panitik ng wika mo',
-
 # Preferences page
 'preferences' => 'Mga kagustuhan',
 'mypreferences' => 'Mga nais',
@@ -1797,7 +1789,6 @@ Para sa pinakamatatag na kaligtasan, hindi pinagana ang img_auth.php.',
 'http-read-error' => 'Kamalian sa pagbasa ng HTTP.',
 'http-timed-out' => 'Huminto ang kahilingang HTTP.',
 'http-curl-error' => 'Kamalian sa pagsalok ng URL: $1',
-'http-host-unreachable' => 'Hindi marating ang URL.',
 'http-bad-status' => 'Nagkaroon ng suliranin habang hinihiling ang HTTP na: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2207,8 +2198,8 @@ Makikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang
 'notvisiblerev' => 'Nabura na ang pagbabago',
 'watchnochange' => 'Wala sa binabantayan mo ang binago sa oras na nakikita.',
 'watchlist-details' => '{{PLURAL:$1|$1 pahinang|$1 mga pahinang}} nasa iyong talaan ng mga binabantayan, hindi binibilang ang mga pahina ng usapan.',
-'wlheader-enotif' => 'Umiiral ang pagpapahayag sa pamamagitan ng e-liham.',
-'wlheader-showupdated' => "Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
+'wlheader-enotif' => 'Umiiral ang pagpapahayag sa pamamagitan ng e-liham.',
+'wlheader-showupdated' => "Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
 'watchmethod-recent' => 'sinusuri ang kamakailan lamang na mga pagbabago para sa binabantayang mga pahina',
 'watchmethod-list' => 'sinusuri ang binabantayang mga pahina para sa mga kamakailan lamang na mga pagbabago',
 'watchlistcontains' => 'Naglalaman ng $1 {{PLURAL:$1|pahina|mga pahina}} ang iyong talaan ng mga binabantayan.',
@@ -2924,17 +2915,11 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 
 # Stylesheets
 'common.css' => '/* Ang inilagay na CSS dito ay gagamitin para sa lahat ng mga pabalat */',
-'standard.css' => '/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng Karaniwang pabalat */',
-'nostalgia.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Nostalgia */',
 'cologneblue.css' => "/* Ang Cascading Style Sheets na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Bughaw na Kolown (''Cologne Blue'') */",
 'monobook.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na Monobook */',
-'myskin.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa lahat ng mga tagagamit ng pabalat na Balatko (''MySkin'') */",
-'chick.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa mga tagagamit ng pabalat na ''Chick'' */",
-'simple.css' => "/* Ang CSS na iniligay dito ay makakaapekto sa mga tagagamit ng Payak (''Simple'') na pabalat */",
 'modern.css' => "/* Ang CSS na iniligay dito ay makakaapekto sa tagagamit ng Makabagong (''Modern'') pabalat */",
 'vector.css' => '/* Ang inilagay na CSS dito ay makakaapekto sa mga tagagamit ng pabalat na Vector */',
 'print.css' => '/* Ang CSS na inilagay dito ay makakaapekto sa kalalabasan o resulta ng paglilimbag */',
-'handheld.css' => "/* Ang CSS na inilagay dito ay makakaapekto sa mga aparatong nahahawakan (''handheld device'') batay sa itinakdang pabalat sa ''\$wgHandheldStyle'' */",
 'noscript.css' => '/* Ang inilagay na Cascading Style Sheets dito ay makakaapekto sa mga tagagamit na hindi nagpapagana ng JavaScript */',
 'group-autoconfirmed.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga tagagamit na kusang natiyak */',
 'group-bot.css' => '/* Ang inilagay na Mga Pilas ng Estilong Lumalagaslas (Cascading Style Sheets o CSS) dito ay makakaapekto lamang sa mga bot */',
@@ -2943,13 +2928,8 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 
 # Scripts
 'common.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa lahat ng mga tagagamit ng bawat pahinang ikinarga. */',
-'standard.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Karaniwang pabalat */',
-'nostalgia.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Nostalgia */',
 'cologneblue.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit ng pabalat na Cologne Blue o Bughaw na Kolown */',
 'monobook.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na MonoBook */',
-'myskin.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa tagagamit na gumagamit ng pabalat na MySkin o Balat Ko */',
-'chick.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Chick */',
-'simple.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Payak na pabalat */',
 'modern.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng Modernong pabalat */',
 'vector.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na gumagamit ng pabalat na Vector */',
 'group-autoconfirmed.js' => '/* Ang anumang JavaScript dito ay ikakarga para sa mga tagagamit na kusang natiyak lamang */',
@@ -3015,13 +2995,8 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
 'pageinfo-templates' => '{{PLURAL:$1|Suleras|Mga suleras}} ($1) na nasa transklusyon (kasama sa maraming mga lugar)',
 
 # Skin names
-'skinname-standard' => 'Klasiko',
-'skinname-nostalgia' => 'Nostalhiya',
 'skinname-cologneblue' => 'Bughaw na Kolown',
 'skinname-monobook' => 'MonoAklat ("isang aklat")',
-'skinname-myskin' => 'PabalatKo',
-'skinname-chick' => "\"Pambabae\" (''Chick'')",
-'skinname-simple' => 'Payak',
 'skinname-modern' => 'Makabago (Moderno)',
 'skinname-vector' => 'Vector',
 
@@ -3114,8 +3089,6 @@ Anumang susunod na mga kawing sa pinanggalingang linya ay tinuturing na mga ekse
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3191,7 +3164,7 @@ Likas na nakatakdang itago ang iba pa.
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lapad',
 'exif-imagelength' => 'Taas',
 'exif-bitspersample' => 'Mga bit (piraso) ng bawat komponente (bahagi)',
@@ -3384,7 +3357,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Walang kompresyon',
 'exif-compression-2' => 'CCITT Pangkat 3 1-kodigo sa haba ng pagtakbo ng Pangdimensiyong Huffman na May Bahagyang Pagbabago',
 'exif-compression-3' => 'Kodigo ng Pangkat 3 ng CCITT',
@@ -3916,13 +3889,6 @@ Dapat na nakatanggap ka ng [{{SERVER}}{{SCRIPTPATH}}/COPYING isang sipi ng Pangk
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Landas ng artikulo]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Landas ng panitik]',
 
-# Special:FilePath
-'filepath' => 'Lokasyon ng talaksan (file path)',
-'filepath-page' => 'Talaksan:',
-'filepath-submit' => 'Gawin',
-'filepath-summary' => 'Ibinabalik ng natatanging pahinang ito ang buong landas para sa isang talaksan.  
-Ipinapakita ang mga larawan sa buong kalinawan, tuwirang sinisimulan ang ibang uri ng mga talaksan sa pamamagitan ng kaugnay nilang mga programa.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Maghanap ng kaparehong mga talaksan',
 'fileduplicatesearch-summary' => "Maghanap ng mga kaparehong mga talaksan sa baba ng kanyang halaga ng ''hash''.",
index bb33363..3d475d7 100644 (file)
@@ -192,18 +192,18 @@ $messages = array(
 'thu' => 'Ҹым',
 'fri' => 'Әјн',
 'sat' => 'Шан',
-'january' => 'Јанвар',
-'february' => 'Феврал',
-'march' => 'Март',
-'april' => 'Апрел',
-'may_long' => 'Мај',
-'june' => 'Ијун',
-'july' => 'Ијул',
-'august' => 'Август',
-'september' => 'Сентјабр',
-'october' => 'Октјабр',
-'november' => 'Нојабр',
-'december' => 'Декабр',
+'january' => 'Yanvar',
+'february' => 'Fevral',
+'march' => 'Mart',
+'april' => 'Aprel',
+'may_long' => 'May',
+'june' => 'İyun',
+'july' => 'İyul',
+'august' => 'Avqust',
+'september' => 'Sentyabr',
+'october' => 'Oktyabr',
+'november' => 'Noyabr',
+'december' => 'Dekabr',
 'january-gen' => 'Јанварә манги',
 'february-gen' => 'Февралә манги',
 'march-gen' => 'Мартә манги',
@@ -244,7 +244,7 @@ $messages = array(
 'category-file-count-limited' => 'Ын категоријәдә  {{PLURAL:$1|$1 фајл}} һесте.',
 'listingcontinuesabbrev' => '(дәвом)',
 'index-category' => 'Индекс быә сәһифон.',
-'noindex-category' => 'Индекс нибыә саһифон',
+'noindex-category' => 'İndeks nibıə səhifon',
 'broken-file-category' => 'Сәһифон де ко ныкардә фајлинә сәбонон',
 
 'about' => 'Тәсвир',
@@ -255,7 +255,7 @@ $messages = array(
 'mypage' => 'Сәһифә',
 'mytalk' => 'Мызокирон',
 'anontalk' => 'Бо ын IP-унвони мызокирә',
-'navigation' => 'Ð\9dавигаÑ\81иÑ\98Ó\99',
+'navigation' => 'NavigasiyÉ\99',
 'and' => '&#32;ијән',
 
 # Cologne Blue skin
@@ -288,7 +288,7 @@ $messages = array(
 'returnto' => 'Бә сәһифә огәрдеј $1.',
 'tagline' => 'Материал че {{SITENAME}}',
 'help' => 'Арајиш',
-'search' => 'Нәве',
+'search' => 'Nəve',
 'searchbutton' => 'Нәве',
 'go' => 'Давардеј',
 'searcharticle' => 'Давардеј',
@@ -313,12 +313,12 @@ $messages = array(
 'unprotectthispage' => 'Ын сәһифә мыдофијә дәгиш кардеј',
 'newpage' => 'Тожә сәһифә',
 'talkpage' => 'Ым сәһифә мызокирә кардеј',
-'talkpagelinktext' => 'Ð\9cÑ\8bзокиÑ\80Ó\99',
+'talkpagelinktext' => 'MızokirÉ\99',
 'specialpage' => 'Хысусијә сәһифә',
 'personaltools' => 'Шәхси диләгон',
 'postcomment' => 'Нујә ғысм',
 'articlepage' => 'Мәғолә дијә кардеј',
-'talk' => 'Ð\9cÑ\8bзокиÑ\80Ó\99',
+'talk' => 'MızokirÉ\99',
 'views' => 'Тәмшо кардеј',
 'toolbox' => 'Диләгон',
 'userpage' => 'Иштирокәкә сәһифә дијә кардеј',
@@ -341,22 +341,22 @@ $messages = array(
 'pool-errorunknown' => 'Номәлумә сәһв',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Тәсвир {{SITENAME}}',
+'aboutsite' => 'Təsvir {{SITENAME}}',
 'aboutpage' => 'Project: Тәсвир',
 'copyrightpage' => '{{ns:project}}:Мыәллифә һуғуғ',
 'currentevents' => 'Есәтнә һодисон',
 'currentevents-url' => 'Project: Есәтнә һодисон',
-'disclaimers' => 'Че мәсулијјәтику имтино.',
+'disclaimers' => 'Çe məsuliyyətiku imtino.',
 'disclaimerpage' => 'Project:Дејни бә гиј ныгәтеј',
 'edithelp' => 'Арајиш бо редактә кардеј',
 'edithelppage' => 'Help:Арајиш бо сәрост кардеј',
 'helppage' => 'Help:Мындәриҹот',
-'mainpage' => 'Ó\98Ñ\81оÑ\81Ó\99 Ñ\81Ó\99һиÑ\84Ó\99',
+'mainpage' => 'Æ\8fsosÉ\99 sÉ\99hifÉ\99',
 'mainpage-description' => 'Әсосә сәһифә',
 'policy-url' => 'Project:Ғајдон',
 'portal' => 'Ҹәмјәт',
 'portal-url' => 'Project:Ҹәмјәти портал',
-'privacy' => 'Мәхфијәти сијосәт',
+'privacy' => 'Məxfiyəti siyosət',
 'privacypage' => 'Project:Мәхфијәти сијосәт',
 
 'badaccess' => 'Дастрәси ғәләт',
@@ -368,12 +368,12 @@ $messages = array(
 'newmessageslink' => 'нујә хәбон',
 'newmessagesdifflink' => 'охонә дәгиши',
 'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|охонә дәгиши|охонә дәгишон}}',
-'editsection' => 'Сәрост кардеј',
+'editsection' => 'Sərost kardey',
 'editold' => 'Сәрост кардеј',
 'viewsourceold' => 'бешемонә коди дијә кардеј',
 'editlink' => 'Сәрост кардеј',
 'viewsourcelink' => 'Бешемонә коди дијә кардеј',
-'editsectionhint' => 'Ын семонә сәрост карде: $1',
+'editsectionhint' => 'Im semonə sərost karde: $1',
 'toc' => 'Мындәриҹот',
 'showtoc' => 'нишо дој',
 'hidetoc' => 'нијо кардеј',
@@ -384,10 +384,10 @@ $messages = array(
 'restorelink' => '{{PLURAL:$1|иглә рәдд кардә быә дәгиши|$1 рәдд кардә быә дәгишон}}',
 'site-atom-feed' => '$1 Atom лента',
 'page-atom-feed' => '"$1" Atom лента',
-'red-link-title' => '$1 (жыго сәһифә ни)',
+'red-link-title' => '$1 (jıqo səhifə ni)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Ð\9cÓ\99Ò\93олÓ\99',
+'nstab-main' => '\99Ä\9folÉ\99',
 'nstab-user' => 'Иштирокәкә сәһифә',
 'nstab-media' => 'Медијә сәһифә',
 'nstab-special' => 'Хысусијә сәһифә',
@@ -509,7 +509,7 @@ $messages = array(
 'yourtext' => 'Шымә мәтн',
 'templatesused' => '{{PLURAL:$1|Ғәлиб:|Ғәлибон}} есәтнә сәһифә истифодә кардејдә:',
 'template-protected' => '(Мыдофиә кардә быә)',
-'template-semiprotected' => 'Ñ\82ики Ð¼Ñ\83һаÑ\84изÓ\99 Ð±Ñ\8bÓ\99',
+'template-semiprotected' => 'tiki muhafizÉ\99 bıÉ\99',
 'hiddencategories' => 'Ын сәһифә аидијотыш һесте бә {{PLURAL:$1|1 нијони категоријә|$1 нијони категоријон}}:',
 'permissionserrorstext-withaction' => "Шымәку ни иҹозә ба ым һәрәкәти «'''$2'''», бә жыго {{PLURAL:$1|сәбәби|сәбәбон}} горнә:",
 'recreate-moveddeleted-warn' => "''Дыггәт! Шымә нафко позулмуш быә сәһифон бәрпа кардеон пидә.'''
@@ -602,7 +602,7 @@ $messages = array(
 'searchprofile-images-tooltip' => 'Фајлон нәве',
 'searchprofile-everything-tooltip' => 'Һәммәј сәһифонәдә нәве (мызокирә сәһифонәдән)',
 'searchprofile-advanced-tooltip' => 'Бә асбардә быә номон мәкононәдә нәве',
-'search-result-size' => '$1 ({{PLURAL:$2|1 сыхан|$2 сыханон}})',
+'search-result-size' => '$1 ({{PLURAL:$2|1 sıxan|$2 sıxanon}})',
 'search-result-category-size' => '{{PLURAL:$1|$1 елемент|$1 елементон}} ({{PLURAL:$2|$2 жинә категоријә$2 жинә категоријон }}, {{PLURAL:$3|$3 фајл|$3 фајлон}})',
 'search-redirect' => '(Унвони дәгиш кардеј  $1)',
 'search-section' => '(семонә $1)',
@@ -664,7 +664,7 @@ $messages = array(
 'recentchanges-label-newpage' => 'Де ым дәгиши тожә сәһифә сохтә бе',
 'recentchanges-label-minor' => 'Ым гадә дәгишије',
 'recentchanges-label-bot' => 'Ым дәгиши бот кардәше',
-'recentchanges-label-unpatrolled' => 'Ым редактә һәлә нәзәрәдә давардәни',
+'recentchanges-label-unpatrolled' => 'Im redaktə hələ nəzərədə dəvardəni',
 'rcnote' => "Бә жиј нишо доә быә {{PLURAL:$1|'''1''' дәгиши|'''$1''' дәгиши}}, бә охонә {{PLURAL:$2|ружәдә|'''$2''' ружәдә}}, саат $5, $4.",
 'rcnotefrom' => "Бә жиј доә быән дәгишон че вахтику '''$2''' (тосә '''$1''').",
 'rclistfrom' => '$1 вахтику дәгишон нишо быдә',
@@ -780,7 +780,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(иштирокәкон сијоһи)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Номә бә иштирокәкә',
 
 # Watchlist
@@ -866,7 +866,7 @@ $messages = array(
 'blocklink' => 'Бә гырд гәтеј',
 'unblocklink' => 'Ошко кардеј',
 'change-blocklink' => 'Блок быә ҹо дәгиш кардеј',
-'contribslink' => 'Комәкон',
+'contribslink' => 'Koməqon',
 'blocklogpage' => 'Блок быәјон',
 'blocklogentry' => 'бастәше [[$1]] бә ын мыддәт $2 $3',
 'block-log-flags-nocreate' => 'нујә иштирокәкон ғејд карде ғәдәғәне',
@@ -911,24 +911,24 @@ $messages = array(
 'tooltip-ca-move' => 'Сәһифә номи дәгиш кардеј',
 'tooltip-ca-watch' => 'Ым сәһифә зијод кардеј бә шымә нығо доә сијоһи',
 'tooltip-ca-unwatch' => 'Рәдд кардеј ым сәһифә шымә ноғо доә сијоһиәдә',
-'tooltip-search' => 'Нәве {{SITENAME}}',
+'tooltip-search' => 'Nəve {{SITENAME}}',
 'tooltip-search-go' => 'Гирәм һесте дырыст бәнә бы номи сәһифә бәврә дәвардеј',
-'tooltip-search-fulltext' => 'Сәһифон пәјдо кардеј де ын мәтни',
-'tooltip-p-logo' => 'Ð\94Ó\99ваÑ\80деÑ\98 Ð±Ó\99 Ó\99Ñ\81оÑ\81Ó\99 Ñ\81Ó\99һиÑ\84Ó\99',
+'tooltip-search-fulltext' => 'Səhifon pəydo kardey de ın mətni',
+'tooltip-p-logo' => '\99vardey bÉ\99 É\99sosÉ\99 sÉ\99hifÉ\99',
 'tooltip-n-mainpage' => 'Дәвардеј бә әсосә сәһифә',
 'tooltip-n-mainpage-description' => 'Дәвардеј бә әсосә сәһифә',
-'tooltip-n-portal' => 'Нахшә барәдә, чич шымә базнејон  ыјо кардеј, конҹо чич һесте',
+'tooltip-n-portal' => 'Naxşə barədə, çiç şımə bəzneyon ıyo kardey, iyən konco çiç heste',
 'tooltip-n-currentevents' => 'Есәтнә һодисон сијоһи',
-'tooltip-n-recentchanges' => 'Охонә дәгишон сијоһи',
-'tooltip-n-randompage' => 'Рајрастә сәһифә дијә кардеј',
-'tooltip-n-help' => 'Ð\90Ñ\80аÑ\98иÑ\88Ó\99 ÐºÐ¸Ñ\82обÑ\87Ó\99 Ð±Ð¾ Ñ\8bн Ð½Ð°Ñ\85Ñ\88Ó\99',
+'tooltip-n-recentchanges' => 'Oxonə dəqişon siyohi',
+'tooltip-n-randompage' => 'Rayrastə səhifə diyə kardey',
+'tooltip-n-help' => 'ArayiÅ\9fÉ\99 kitobçÉ\99 bo Ä±n naxÅ\9fÉ\99',
 'tooltip-t-whatlinkshere' => 'Бә ым сәһифә сәбон вардә һәммәј вики сәһифон сијоһи',
 'tooltip-t-recentchangeslinked' => 'Охонә дәгишон сәһифонәдә, бә ком сәһифон сәбон вардә ым сәһифә',
 'tooltip-feed-atom' => 'Транслјасијә кардеј бә Atom бо ым сәһифә',
 'tooltip-t-contributions' => 'Че иштирок кардәкәси дагиш кардә быә сәһифон сијоһи',
 'tooltip-t-emailuser' => 'Бы иштироәкә номә вығәнде',
 'tooltip-t-upload' => 'Шикилон јаанки мултимедијә фајлон бо жај',
-'tooltip-t-specialpages' => 'Хыдмәтә сәһифон сијоһи',
+'tooltip-t-specialpages' => 'Xıdmətə səhifon siyohi',
 'tooltip-t-print' => 'Ым сәһифә рәвојәт бо чап кардеј',
 'tooltip-t-permalink' => 'Бә ым сәһифә рәвојәти еғрорә сәбон',
 'tooltip-ca-nstab-main' => 'Мәғолә мығдор',
@@ -993,7 +993,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Һовужи',
 'exif-imagelength' => 'Былынди',
 'exif-source' => 'Сәвон',
@@ -1007,7 +1007,7 @@ $messages = array(
 
 # External editor support
 'edit-externally' => 'Редактә кардеј ым фајли де заһири програм',
-'edit-externally-help' => '(Бо мыффәссәлә мәлумотон бә [//www.mediawiki.org/wiki/Manual:External_editors дәрсәвон бо сохтәј] дијә быкан)',
+'edit-externally-help' => '(Bo mıffəssələ məlumoton bə [//www.mediawiki.org/wiki/Manual:External_editors dərsəvon bo soxtəy] diyə bıkən)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'һәммәј',
@@ -1030,10 +1030,6 @@ $messages = array(
 'version-specialpages' => 'Хысусијә сәһифон',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath-page' => 'Фајл:',
-'filepath-submit' => 'Давард',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Нәве',
 
index afaeb6c..0704c08 100644 (file)
@@ -730,7 +730,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listusersfrom' => 'ʻAsi mai kau ʻetita mei he:',
 'listusers-submit' => 'ʻAsi mai',
 
-# E-mail user
+# Email user
 'mailnologin' => 'ʻOku ʻikai ha tuʻasila ke tohila ki ai',
 'emailuser' => 'Tohila ki he ʻetitá ni',
 'emailpage' => 'Ko e ʻetita ʻene tohila',
@@ -1043,7 +1043,7 @@ Pea hoko ai pē hoʻo lava tānaki ha ʻuhinga ʻi he fakanounou',
 'metadata-expand' => 'Fano kiʻi meʻa',
 'metadata-collapse' => 'Holo kiʻi meʻa',
 
-# EXIF tags
+# Exif tags
 'exif-xresolution' => 'Auiiki fakalava',
 'exif-yresolution' => 'Auiiki tuʻutonu',
 'exif-jpeginterchangeformatlength' => 'ʻŪ valu meʻaʻilo JPEG',
@@ -1157,7 +1157,7 @@ Pea hoko ai pē hoʻo lava tānaki ha ʻuhinga ʻi he fakanounou',
 'watchlistall2' => 'kātoa',
 'namespacesall' => 'vā kotoa',
 
-# E-mail address confirmation
+# Email address confirmation
 'confirmemail' => 'Fakamoʻoniʻi ho tuʻasila tohila',
 'confirmemail_noemail' => 'Naʻe ʻikai te ke fakamoʻoniʻi ʻa e tohila totonu ʻi he [[Special:Preferences|faʻiteliha ʻaʻau]].',
 'confirmemail_text' => 'Kuo pau te ke fakamoʻoniʻi ho tuʻasila tohila ki muʻa ʻi hoʻo ngāueʻaki ʻa e ngaahi fōtunga tohila. Lomiʻi ʻa e meʻalolomi ʻi lalo pea ʻe ʻavea ha tohila fakamoʻoniʻi ki ho tuʻasila. ʻE ʻi ai ha fehokotaki mo ha lea fakapulipuli ʻi ai. Fafaʻo ʻa e fehokotakí ni ʻi hoʻo palausa ke fakamoʻoniʻi ʻoku sai ho tuʻasila tohila.',
@@ -1221,11 +1221,6 @@ Kātaki fakapapauʻi te ke fie toe fatu ʻa e kupu ni.",
 # Special:Version
 'version' => 'Paaki',
 
-# Special:FilePath
-'filepath' => 'Hala ki he faile',
-'filepath-page' => 'Faile:',
-'filepath-submit' => 'Ko e hala',
-
 # Special:SpecialPages
 'specialpages' => 'Ngaahi peesi makehe',
 
index 39c868d..25ad43f 100644 (file)
@@ -80,8 +80,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Soim hamas yusa i lukautim pes',
 'tog-oldsig' => 'Olsem wanem yu raitim nem nau',
 'tog-fancysig' => 'Dispela rot yu raitim long nem stap wikitext (i no gat otomatik link)',
-'tog-externaleditor' => 'Yusim long ausait edita oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
-'tog-externaldiff' => 'Yusim long ausait diff oltaim (tasol long man bilong save, i nidim sipesol setap antap long komputa bilong yu. [//www.mediawiki.org/wiki/Manual:External_editors Lukim moa infomesen.])',
 'tog-showjumplinks' => ' Setap ol "Go stret long" links bilong helpim',
 'tog-uselivepreview' => 'Soim ol senis kwiktaim taim mi wokim (i nidim Javascript)',
 'tog-forceeditsummary' => 'Tokim mi long wanem taim raitim mi nating long liklik toksave bilong senis',
@@ -397,9 +395,6 @@ Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap
 'powersearch-toggleall' => 'Olgeta',
 'powersearch-togglenone' => 'I nogat wanpela',
 
-# Quickbar
-'qbsettings-none' => 'I nogat wanpela',
-
 # Preferences page
 'preferences' => 'Ol laik',
 'mypreferences' => 'Ol laik bilong mi',
@@ -614,7 +609,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listgrouprights-group' => 'Grup',
 'listgrouprights-members' => '(lista bilong ol memba)',
 
-# E-mail user
+# Email user
 'emailuser' => 'E-mel dispela yusa',
 'emailpage' => 'E-mel yusa',
 'defemailsubject' => '{{SITENAME}} e-mel',
@@ -643,7 +638,7 @@ Sapos yu laik rausim dispela pes long lukautbuk bilong yu bihain, paitim \"Pinis
 'unwatch' => 'Pinis long lukautim',
 'unwatchthispage' => 'Pinis long lukautim',
 'watchlist-details' => '$1 pes istap long lukautbuk (dispela namba i no kaunim ol pes bilong toktok).',
-'wlheader-showupdated' => "Ol pes i senis pinis bihain long taim yu lukim ol igat nem i '''strongpela'''",
+'wlheader-showupdated' => "Ol pes i senis pinis bihain long taim yu lukim ol igat nem i '''strongpela'''",
 'wlshowlast' => 'Lukim dispela $1 aua $2 de $3',
 'watchlist-options' => 'Ol laik bilong Lukautbuk',
 
@@ -805,7 +800,7 @@ Yu inap lukim as tok bilong em',
 # Metadata
 'metadata' => 'Metadata',
 
-# EXIF tags
+# Exif tags
 'exif-imagedescription' => 'Nem bilong piksa',
 
 'exif-meteringmode-255' => 'Narapela',
@@ -858,10 +853,6 @@ Yu inap lukim as tok bilong em',
 'version-license' => 'Laisens',
 'version-poweredby-others' => 'ol narapela',
 
-# Special:FilePath
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Go',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Nem bilong fail:',
 'fileduplicatesearch-submit' => 'Painim',
index 78b8008..c9462d8 100644 (file)
@@ -20,6 +20,7 @@
  * @author Erkan Yilmaz
  * @author Fryed-peach
  * @author Goktr001
+ * @author Gorizon
  * @author Hanberke
  * @author Hcagri
  * @author Hedda Gabler
@@ -38,6 +39,7 @@
  * @author Mskyrider
  * @author Myildirim2007
  * @author Nazif İLBEK
+ * @author Nemo bis
  * @author Reedy
  * @author Runningfridgesrule
  * @author Sadrettin
@@ -377,8 +379,6 @@ $messages = array(
 'tog-shownumberswatching' => 'İzleyen kullanıcı sayısını göster',
 'tog-oldsig' => 'Mevcut imza:',
 'tog-fancysig' => 'İmzaya vikimetin muamelesi yap (otomatik bir bağlantı olmadan)',
-'tog-externaleditor' => 'Varsayılan olarak harici düzenleyici kullan (deneyimli kullanıcılar içindir ve bilgisayarınızda özel ayarlar gerektirir. [//www.mediawiki.org/wiki/Manual:External_editors Ayrıntılı bilgi için tıklayın.])',
-'tog-externaldiff' => 'Varsayılan olarak harici karşılaştırıcı kullan (deneyimli kullanıcılar içindir ve bilgisayarınızda özel ayarlar gerektirir. [//www.mediawiki.org/wiki/Manual:External_editors Ayrıntılı bilgi için tıklayın.])',
 'tog-showjumplinks' => '"{{int:jumpto}}" erişilebilirlik bağlantısı etkinleştir',
 'tog-uselivepreview' => 'Canlı ön izlemeyi kullan (JavaScript gerektirir ve özellik deneme aşamasındadır)',
 'tog-forceeditsummary' => 'Özeti boş bıraktığımda beni uyar',
@@ -393,6 +393,7 @@ $messages = array(
 'tog-showhiddencats' => 'Gizli kategorileri göster',
 'tog-noconvertlink' => 'Bağlantı başlığı dönüştürmesini devre dışı bırakma',
 'tog-norollbackdiff' => 'Geridönüş uygulandıktan sonra değişikliği atla',
+'tog-useeditwarning' => 'Kaydedilmemiş değişikliğe sahip bir değişiklik sayfasından çıkarken beni uyar',
 
 'underline-always' => 'Daima',
 'underline-never' => 'Asla',
@@ -612,8 +613,8 @@ $1',
 'youhavenewmessages' => 'Yeni $1 var ($2).',
 'newmessageslink' => 'mesajınız',
 'newmessagesdifflink' => 'son değişiklik',
-'youhavenewmessagesfromusers' => '{{PLURAL:$3|Başka bir kullanıcıdan|$3 kullanıcıdan}} $1 var. ($2)',
-'youhavenewmessagesmanyusers' => 'Birçok kullanıcıdan $1 var. ($2)',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|Başka bir kullanıcıdan|$3 kullanıcıdan}} $1 var ($2).',
+'youhavenewmessagesmanyusers' => 'Birçok kullanıcıdan $1 var ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|yeni mesajınız|yeni mesajlarınız}}',
 'newmessagesdifflinkplural' => 'son {{PLURAL:$1|değişiklik|değişiklikler}}',
 'youhavenewmessagesmulti' => "$1'de yeni mesajınız var.",
@@ -870,10 +871,8 @@ Girişi bitirmek için, burada yeni bir parola yazın:',
 
 # Special:PasswordReset
 'passwordreset' => 'Parola sıfırlama',
-'passwordreset-text' => 'Hesap bilgilerinizin e-posta ile hatırlatılması için bu formu doldurunuz.',
 'passwordreset-legend' => 'Şifreyi sıfırla',
 'passwordreset-disabled' => 'Parola sıfırlamaları bu wiki üzerinde devre dışı bırakıldı.',
-'passwordreset-pretext' => '{{PLURAL:$1||Aşağıdaki verilerden birini girin}}',
 'passwordreset-username' => 'Kullanıcı adı:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Sonuç e-postasını görüntüle?',
@@ -1098,11 +1097,14 @@ Bir açıklama verilmedi.',
 Silinmiş görünüyor.',
 'edit-conflict' => 'Değişiklik çakışması.',
 'edit-no-change' => 'Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.',
+'postedit-confirmation' => 'Değişikliğiniz kaydedildi.',
 'edit-already-exists' => 'Yeni sayfa oluşturulamıyor.
 Sayfa zaten mevcut.',
 'defaultmessagetext' => 'Varsayılan mesaj metni',
 'invalid-content-data' => 'Geçersiz içerik verisi',
 'content-not-allowed-here' => '"$1" içeriğine, [[$2]] sayfasında izin verilmemekte.',
+'editwarning-warning' => 'Bu sayfadan ayrılmak yaptığınız herhangi bir değişikliği kaybetmenize sebep olabilir.
+Eğer giriş yaptıysanız, bu uyarıyı, tercihlerinizin "{{int:prefs-editing}}" bölümünde devre dışı bırakabilirsiniz.',
 
 # Content models
 'content-model-wikitext' => 'vikimetin',
@@ -1381,15 +1383,6 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 'search-external' => 'Dış arama',
 'searchdisabled' => '{{SITENAME}} sitesinde arama yapma geçici olarak durdurulmuştur. Bu arada Google kullanarak {{SITENAME}} içinde arama yapabilirsiniz. Arama sitelerinde dizinlerin biraz eski kalmış olabileceğini göz önünde bulundurunuz.',
 
-# Quickbar
-'qbsettings' => 'Hızlı erişim sütun ayarları',
-'qbsettings-none' => 'Hiçbiri',
-'qbsettings-fixedleft' => 'Sola sabitlendi',
-'qbsettings-fixedright' => 'Sağa sabitlendi',
-'qbsettings-floatingleft' => 'Sola yaslanıyor',
-'qbsettings-floatingright' => 'Sağa yaslanıyor',
-'qbsettings-directionality' => 'Sabit, dilinizin komut dosyasının yönüne bağlı',
-
 # Preferences page
 'preferences' => 'Tercihler',
 'mypreferences' => 'Tercihler',
@@ -1912,7 +1905,6 @@ En uygun güvenlik için, img_auth.php devre dışı bırakıldı.",
 'http-read-error' => 'HTTP okuma hatası.',
 'http-timed-out' => 'HTTP isteği zaman aşımına uğradı.',
 'http-curl-error' => 'URL alınırken hata: $1',
-'http-host-unreachable' => "URL'ye ulaşılamıyor.",
 'http-bad-status' => 'HTTP isteği sırasında bir sorun oluştu: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2307,8 +2299,8 @@ Bundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklik
 'notvisiblerev' => 'Revizyon silinmiş',
 'watchnochange' => 'İzleme listenizdeki sayfaların hiçbiri, gösterilen zaman aralığında güncellenmemiş.',
 'watchlist-details' => 'Tartışma sayfaları hariç {{PLURAL:$1|$1 sayfa|$1 sayfa}} izleme listenizdedir.',
-'wlheader-enotif' => 'E-posta ile haber verme açılmıştır.',
-'wlheader-showupdated' => "Son ziyaretinizden sonraki sayfa değişiklikleri '''kalın yazıyla''' gösterilmiştir.",
+'wlheader-enotif' => 'E-posta ile haber verme açılmıştır.',
+'wlheader-showupdated' => "Son ziyaretinizden sonraki sayfa değişiklikleri '''kalın yazıyla''' gösterilmiştir.",
 'watchmethod-recent' => 'izlediğiniz sayfalarda yapılan son değişiklikler kontrol ediliyor',
 'watchmethod-list' => 'izlediğiniz sayfalarda yapılan son değişiklikler kontrol ediliyor',
 'watchlistcontains' => 'İzleme listenizde $1 tane {{PLURAL:$1|sayfa|sayfa}} var.',
@@ -3078,10 +3070,6 @@ Geçici dosya kayıp.',
 'pageinfo-category-files' => 'Dosya sayısı',
 
 # Skin names
-'skinname-standard' => 'Klasik',
-'skinname-nostalgia' => 'Nostaljik',
-'skinname-chick' => 'Şık',
-'skinname-simple' => 'Basit',
 'skinname-modern' => 'Modern',
 
 # Patrolling
@@ -3164,6 +3152,19 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
 'ago' => '$1 önce',
 'just-now' => 'Hemen şimdi',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|saat|saat}} önce',
+'minutes-ago' => '$1 {{PLURAL:$1|dakika|dakika}} önce',
+'seconds-ago' => '$1 {{PLURAL:$1|saniye|saniye}} önce',
+'monday-at' => '$1 Pazartesi günü',
+'tuesday-at' => '$1 Salı günü',
+'wednesday-at' => '$1 Çarşamba günü',
+'thursday-at' => '$1 Perşembe günü',
+'friday-at' => '$1 Cuma günü',
+'saturday-at' => '$1 Cumartesi günü',
+'sunday-at' => '$1 Pazar günü',
+'yesterday-at' => '$1 dün itibariyle',
+
 # Bad image list
 'bad_image_list' => 'Biçim aşağıdaki gibidir:
 
@@ -3195,7 +3196,7 @@ Diğerleri varsayılan olarak gizlenecektir.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Genişlik',
 'exif-imagelength' => 'Yükseklik',
 'exif-bitspersample' => 'Bits per component',
@@ -3360,7 +3361,7 @@ Diğerleri varsayılan olarak gizlenecektir.
 'exif-originalimageheight' => 'Resmin kırpılmadan önceki yükseliği',
 'exif-originalimagewidth' => 'Resmin kırpılmadan önceki genişliği',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Sıkıştırılmamış',
 'exif-compression-6' => 'JPEG',
 
@@ -3794,13 +3795,6 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
 'version-entrypoints-header-entrypoint' => 'Giriş noktası',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Dosyanın konumu',
-'filepath-page' => 'Dosya adı:',
-'filepath-submit' => 'Git',
-'filepath-summary' => 'Bu özel sayfa bir dosya için tam yolu getirir.
-Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili programlarıyla doğrudan başlatılır.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Benzer dosyaları ara',
 'fileduplicatesearch-summary' => 'Sağlama değeri tabanında benzer dosyaları ara.',
index 6208505..9fbb8f8 100644 (file)
@@ -457,7 +457,7 @@ Legend: '''({{int:cur}})''' = difference with latest revision, '''({{int:last}})
 'prefs-help-email-others' => 'Kibux mijğolat 3am Hadome ğer biFaṭo duMamlo u luglozam dumat Işmux.',
 'prefs-signature' => 'Imḍa',
 
-# User preference: e-mail validation using jQuery
+# User preference: email validation using jQuery
 'email-address-validity-valid' => 'uEmail-Adresayḍux m³adlo yo.',
 
 # Groups
@@ -594,7 +594,7 @@ The description on its [$2 file description page] there is shown below.',
 'listgrouprights-helppage' => 'Help: Ḥaqat diGudo',
 'listgrouprights-members' => '(Lista daHadome)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Kṭaw Email luHadomano.',
 'emailusername' => 'Işme duHadomo:',
 'emailfrom' => 'Men:',
@@ -802,7 +802,7 @@ Others will be hidden by default.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-writer' => 'Kaṭowo',
 'exif-languagecode' => 'Leşono',
 'exif-cameraownername' => 'uMoro diQamera',
@@ -824,9 +824,6 @@ Others will be hidden by default.
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
 
-# Special:FilePath
-'filepath-submit' => 'Zux',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Krax',
 
index 42d9c49..50a2b3e 100644 (file)
@@ -38,8 +38,6 @@ $messages = array(
 'tog-enotifminoredits' => 'ndzurhumele e-mail loko ku endleka mindzulamiso leyi ntsongo',
 'tog-enotifrevealaddr' => 'Paluxa e-mail yamina eka mapapila lawa ndzimarhumelaka',
 'tog-shownumberswatching' => 'Komba ntsengo wa vatirhisi lava hlaleleke tluka',
-'tog-externaleditor' => 'Tirhisa xilulamisi xalehandle hikukongoma (Nhlawulo lowu i wavatirhisi lavangani ntokoto ntsena, wu lava ku cinca kokarhi eka khompuyuta yawena. [//www.mediawiki.org/wiki/Manual:External_editors vuxokoxoko hi mhakaleyi.])',
-'tog-externaldiff' => 'Tirhisa phurogiremi yalehandle hikukongoma (Nhlawulo lowu i wavatirhisi lavangani ntokoto ntsena, wu lava ku cinca kokarhi eka khompuyuta yawena. [//www.mediawiki.org/wiki/Manual:External_editors vuxokoxoko hi mhakaleyi.])',
 'tog-forceeditsummary' => 'Ndzivutisisi loko ndzinga hoxi nkomiso wa ndzulamiso lowu ndzi wu endleke',
 'tog-watchlisthideown' => 'Tumbeta mindzulamiso ya mina eka leswi ndzi swi languteke',
 'tog-watchlisthidebots' => 'Tumbeta mindzulamiso ya rhobhoti eka leswi ndzi swi languteke',
@@ -696,7 +694,7 @@ Nhlamuselo ya yona leyi nge ndzeni ka [$2 tluka ro hlamusela] hi yona leyi kombi
 # Special:ListGroupRights
 'listgrouprights-members' => '(nxaxamelo wa valandzeri)',
 
-# E-mail user
+# Email user
 'emailuser' => 'rhumela mutirhisi loyi E-mail',
 
 # Watchlist
index e308178..dbb1acc 100644 (file)
@@ -13,6 +13,7 @@
  * @author Haqmar
  * @author Himiq Dzyu
  * @author KhayR
+ * @author MF-Warburg
  * @author Marat Vildanov
  * @author Reedy
  * @author Rinatus
@@ -239,8 +240,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Битне күзәтү исемлекләренә өстәгән кулланучылар санын күрсәтелсен',
 'tog-oldsig' => 'Хәзерге имза:',
 'tog-fancysig' => 'Имзаның шәхси вики-билгеләмәсе (автоматик сылтамасыз)',
-'tog-externaleditor' => 'Тышкы редактор куллану (бары тик белгечләргә генә һәм санак махсус көйләнгән булу зарур; [//www.mediawiki.org/wiki/Manual:External_editors тулырак...])',
-'tog-externaldiff' => 'Тышкы версия чагыштыру программасын куллану (бары тик белгечләр өчен һшм санак махсус көйләнгән булу зарур; [//www.mediawiki.org/wiki/Manual:External_editors тулырак...])',
 'tog-showjumplinks' => '«Күчү» ярдәмче сылтамалары ялгансын',
 'tog-uselivepreview' => 'Тиз карап алу кулланылсын (JavaScript, эксперименталь)',
 'tog-forceeditsummary' => 'Үзгәртүләрне тасвирлау юлы тутырылмаган булса, кисәтү',
@@ -254,6 +253,7 @@ $messages = array(
 'tog-diffonly' => 'Юрама чагыштыру астында бит эчтәлеге күрсәтелмәсен',
 'tog-showhiddencats' => 'Яшерен төркемнәр күрсәтелсен',
 'tog-norollbackdiff' => 'Кире кайтару ясагач юрамалар аермасы күрсәтелмәсен',
+'tog-useeditwarning' => 'Битне сакламыйча китү вакытында мине кисәтергә',
 
 'underline-always' => 'Һәрвакыт',
 'underline-never' => 'Бервакытта да',
@@ -952,6 +952,8 @@ $2
 'edit-no-change' => 'Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.',
 'edit-already-exists' => 'Яңа бит төзеп булмый.
 Ул инде бар.',
+'editwarning-warning' => 'Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.
+Әгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Игътибар:''' бу биттә хәтерне еш кулланучы функцияләр артык күп.
@@ -1169,14 +1171,6 @@ $1",
 'powersearch-togglenone' => 'Бирни дә юк',
 'search-external' => 'Тышкы эзләү',
 
-# Quickbar
-'qbsettings' => 'Күчешләр аслыгы',
-'qbsettings-none' => 'Күрсәтмәү',
-'qbsettings-fixedleft' => 'Сулда күчерелмәс',
-'qbsettings-fixedright' => 'Уңда күчерелмәс',
-'qbsettings-floatingleft' => 'Сулда йөзмә',
-'qbsettings-floatingright' => 'Уңда йөзмә',
-
 # Preferences page
 'preferences' => 'Көйләнмәләр',
 'mypreferences' => 'Көйләнмәләр',
@@ -1911,7 +1905,7 @@ $1',
 'blanknamespace' => '(Төп)',
 
 # Contributions
-'contributions' => '{{GENDER:$1|Кулланучының} кертеме',
+'contributions' => '{{GENDER:$1|Кулланучының}} кертеме',
 'contributions-title' => '$1 исемле кулланучының кертеме',
 'mycontris' => 'Кертем',
 'contribsub2' => '$1 ($2) өчен',
@@ -2161,14 +2155,12 @@ $1',
 # Spam protection
 'spamprotectiontitle' => 'Спам фильтры',
 
+# Info page
+'pageinfo-toolboxlink' => 'Бит турында мәгълүмат',
+
 # Skin names
-'skinname-standard' => 'Классик',
-'skinname-nostalgia' => 'Искә алу',
 'skinname-cologneblue' => 'Зәңгәр сагыш',
 'skinname-monobook' => 'Китап',
-'skinname-myskin' => 'Үзем',
-'skinname-chick' => 'Чеби',
-'skinname-simple' => 'Гади',
 'skinname-modern' => 'Замана',
 'skinname-vector' => 'Сызымлы',
 
@@ -2238,7 +2230,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Киңлек',
 'exif-imagelength' => 'Биеклек',
 'exif-imagedescription' => 'Рәсемнең исеме',
@@ -2448,11 +2440,6 @@ $1',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версия',
 
-# Special:FilePath
-'filepath' => 'Файлга юл',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күчү',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Бер үк файлларны эзләү',
 'fileduplicatesearch-submit' => 'Эзләү',
index 826d833..bd0096e 100644 (file)
@@ -122,8 +122,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Bitne küzätü isemleklärenä östägän qullanuçılar sanın kürsätelsen',
 'tog-oldsig' => 'Xäzerge imzanı aldan qaraw:',
 'tog-fancysig' => 'İmzanıñ şäxsi wiki-bilgelämäse (avtomatik sıltamasız)',
-'tog-externaleditor' => 'Tışqı redaqtor qullanu (kompyuter maxsus köylängän bulu zarur)',
-'tog-externaldiff' => 'Tışqı versiä çağıştıru programmasın qullanu (kompyuter maxsus köylängän bulu zarur)',
 'tog-showjumplinks' => '«Küçü» yärdämçe sıltamaları yalğansın',
 'tog-uselivepreview' => 'Tiz qarap alu qullanılsın (JavaScript, eksperimental)',
 'tog-forceeditsummary' => 'Üzgärtülärne taswirlaw yulı tutırılmağan bulsa, kisätü',
@@ -940,14 +938,6 @@ Barlıq alannarda (bäxäs bitläre, ürnäklär, h.b.) ezläw öçen ''all'' s
 'powersearch-togglenone' => 'Birni dä yuq',
 'search-external' => 'Tışqı ezläw',
 
-# Quickbar
-'qbsettings' => 'Küçeşlär aslığı',
-'qbsettings-none' => 'Kürsätmäw',
-'qbsettings-fixedleft' => 'Sulda küçerelmäs',
-'qbsettings-fixedright' => 'Uñda küçerelmäs',
-'qbsettings-floatingleft' => 'Sulda yözmä',
-'qbsettings-floatingright' => 'Uñda yözmä',
-
 # Preferences page
 'preferences' => 'Köylänmälär',
 'mypreferences' => 'Köylänmälärem',
@@ -1893,13 +1883,8 @@ Zinhar başqa isem saylağız.',
 'spamprotectiontitle' => 'Spam filtrı',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => 'İskä alu',
 'skinname-cologneblue' => 'Zäñgär sağış',
 'skinname-monobook' => 'Kitap',
-'skinname-myskin' => 'Üzem',
-'skinname-chick' => 'Çebi',
-'skinname-simple' => 'Ğädi',
 'skinname-modern' => 'Zamana',
 'skinname-vector' => 'Sızımlı',
 
@@ -1970,7 +1955,7 @@ Yulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulır
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Kiñlek',
 'exif-imagelength' => 'Bieklek',
 'exif-imagedescription' => 'Räsemneñ iseme',
@@ -2138,11 +2123,6 @@ Yulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulır
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Versiä',
 
-# Special:FilePath
-'filepath' => 'Faylğa yul',
-'filepath-page' => 'Fayl:',
-'filepath-submit' => 'Küçü',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Ezläw',
 
index 8dfc21b..43d580b 100644 (file)
@@ -39,41 +39,46 @@ $namespaceNames = array(
 
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#ШИГЛЕДИР', '#REDIRECT' ),
-       'notoc'                     => array( '0', '__ДОПЧУЗУЧОК__', '__NOTOC__' ),
-       'toc'                       => array( '0', '__ДОПЧУЗУ__', '__TOC__' ),
-       'currentmonth'              => array( '1', 'АМГЫАЙ', 'АМГЫАЙ2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonth1'             => array( '1', 'АМГЫАЙ1', 'CURRENTMONTH1' ),
-       'currentmonthname'          => array( '1', 'АМГЫАЙНЫҢАДЫ', 'CURRENTMONTHNAME' ),
-       'currentday'                => array( '1', 'АМГЫХҮН', 'CURRENTDAY' ),
-       'currentday2'               => array( '1', 'АМГЫХҮН2', 'CURRENTDAY2' ),
-       'currentdayname'            => array( '1', 'АМГЫХҮННҮҢАДЫ', 'CURRENTDAYNAME' ),
-       'currentyear'               => array( '1', 'АМГЫЧЫЛ', 'CURRENTYEAR' ),
-       'currenttime'               => array( '1', 'АМГЫҮЕ', 'CURRENTTIME' ),
-       'currenthour'               => array( '1', 'АМГЫШАК', 'CURRENTHOUR' ),
-       'numberofpages'             => array( '1', 'АРЫННАРНЫҢСАНЫ', 'NUMBEROFPAGES' ),
-       'numberofarticles'          => array( '1', 'ЧҮҮЛДЕРНИҢСАНЫ', 'NUMBEROFARTICLES' ),
-       'numberoffiles'             => array( '1', 'ФАЙЛДАРНЫҢСАНЫ', 'NUMBEROFFILES' ),
-       'numberofusers'             => array( '1', 'АЖЫГЛАКЧЫЛАРНЫҢСАНЫ', 'NUMBEROFUSERS' ),
-       'numberofedits'             => array( '1', 'ӨСКЕРЛИИШКИННЕРНИҢСАНЫ', 'NUMBEROFEDITS' ),
-       'pagename'                  => array( '1', 'АРЫННЫҢАДЫ', 'PAGENAME' ),
-       'namespace'                 => array( '1', 'АТТАРДЕЛГЕМИ', 'NAMESPACE' ),
-       'namespacee'                => array( '1', 'АТТАРДЕЛГЕМИ2', 'NAMESPACEE' ),
+       'redirect'                  => array( '0', '#көжүрүлге', '#ШИГЛЕДИР', '#перенаправление', '#перенапр', '#REDIRECT' ),
+       'notoc'                     => array( '0', '__ЭГЕ_ЧОК__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__ГАЛЕРЕЯ_ЧОК__', '__БЕЗ_ГАЛЕРЕИ__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__АЛБАН_ЭГЕ__', '__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__', '__ОБЯЗ_ОГЛ__', '__FORCETOC__' ),
+       'toc'                       => array( '0', '__ДОПЧУ__', '__ОГЛАВЛЕНИЕ__', '__ОГЛ__', '__TOC__' ),
+       'noeditsection'             => array( '0', '__ҮЛЕГ_ЭДИЛГЕЗИ_ЧОК__', '__БЕЗ_РЕДАКТИРОВАНИЯ_РАЗДЕЛА__', '__NOEDITSECTION__' ),
+       'currentmonth'              => array( '1', '__АМГЫ_АЙ', '__АМГЫ_АЙ_2__', 'ТЕКУЩИЙ_МЕСЯЦ', 'ТЕКУЩИЙ_МЕСЯЦ_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'             => array( '1', '__АМГЫ_АЙ_1__', 'ТЕКУЩИЙ_МЕСЯЦ_1', 'CURRENTMONTH1' ),
+       'currentmonthname'          => array( '1', 'АМГЫАЙНЫҢАДЫ', 'НАЗВАНИЕ_ТЕКУЩЕГО_МЕСЯЦА', 'CURRENTMONTHNAME' ),
+       'currentday'                => array( '1', 'АМГЫХҮН', 'ТЕКУЩИЙ_ДЕНЬ', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'АМГЫХҮН2', 'ТЕКУЩИЙ_ДЕНЬ_2', 'CURRENTDAY2' ),
+       'currentdayname'            => array( '1', 'АМГЫХҮННҮҢАДЫ', 'НАЗВАНИЕ_ТЕКУЩЕГО_ДНЯ', 'CURRENTDAYNAME' ),
+       'currentyear'               => array( '1', 'АМГЫЧЫЛ', 'ТЕКУЩИЙ_ГОД', 'CURRENTYEAR' ),
+       'currenttime'               => array( '1', 'АМГЫҮЕ', 'ТЕКУЩЕЕ_ВРЕМЯ', 'CURRENTTIME' ),
+       'currenthour'               => array( '1', 'АМГЫШАК', 'ТЕКУЩИЙ_ЧАС', 'CURRENTHOUR' ),
+       'numberofpages'             => array( '1', 'АРЫННАРНЫҢСАНЫ', 'КОЛИЧЕСТВО_СТРАНИЦ', 'NUMBEROFPAGES' ),
+       'numberofarticles'          => array( '1', 'ЧҮҮЛДЕРНИҢСАНЫ', 'КОЛИЧЕСТВО_СТАТЕЙ', 'NUMBEROFARTICLES' ),
+       'numberoffiles'             => array( '1', 'ФАЙЛДАРНЫҢСАНЫ', 'КОЛИЧЕСТВО_ФАЙЛОВ', 'NUMBEROFFILES' ),
+       'numberofusers'             => array( '1', 'АЖЫГЛАКЧЫЛАРНЫҢСАНЫ', 'КОЛИЧЕСТВО_УЧАСТНИКОВ', 'NUMBEROFUSERS' ),
+       'numberofedits'             => array( '1', 'ӨСКЕРЛИИШКИННЕРНИҢСАНЫ', 'КОЛИЧЕСТВО_ПРАВОК', 'NUMBEROFEDITS' ),
+       'pagename'                  => array( '1', 'АРЫННЫҢАДЫ', 'НАЗВАНИЕ_СТРАНИЦЫ', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'АТТАРДЕЛГЕМИ', 'ПРОСТРАНСТВО_ИМЁН', 'NAMESPACE' ),
+       'namespacee'                => array( '1', 'АТТАРДЕЛГЕМИ2', 'ПРОСТРАНСТВО_ИМЁН_2', 'NAMESPACEE' ),
        'namespacenumber'           => array( '1', 'АТТАРДЕЛГЕМИНИҢСАНЫ', 'NAMESPACENUMBER' ),
-       'talkspace'                 => array( '1', 'ЧУГААДЕЛГЕМИ', 'TALKSPACE' ),
-       'talkspacee'                => array( '1', 'ЧУГААДЕЛГЕМИ2', 'TALKSPACEE' ),
-       'img_right'                 => array( '1', 'оң', 'right' ),
-       'img_left'                  => array( '1', 'солагай', 'left' ),
-       'img_center'                => array( '1', 'төп', 'center', 'centre' ),
-       'sitename'                  => array( '1', 'САЙТТЫҢАДЫ', 'SITENAME' ),
-       'ns'                        => array( '0', 'АД:', 'NS:' ),
-       'nse'                       => array( '0', 'АД2:', 'NSE:' ),
-       'currentweek'               => array( '1', 'АМГЫЧЕДИХОНУК', 'CURRENTWEEK' ),
-       'currentdow'                => array( '1', 'АМГЫЧЕДИХОНУКТУҢХҮНҮ', 'CURRENTDOW' ),
-       'raw'                       => array( '0', 'ЧИГ:', 'RAW:' ),
-       'language'                  => array( '0', '#ДЫЛ:', '#LANGUAGE:' ),
-       'special'                   => array( '0', 'тускай', 'special' ),
-       'tag'                       => array( '0', 'демдек', 'tag' ),
+       'talkspace'                 => array( '1', 'ЧУГААДЕЛГЕМИ', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ', 'TALKSPACE' ),
+       'talkspacee'                => array( '1', 'ЧУГААДЕЛГЕМИ2', 'ПРОСТРАНСТВО_ОБСУЖДЕНИЙ_2', 'TALKSPACEE' ),
+       'img_right'                 => array( '1', 'оң', 'справа', 'right' ),
+       'img_left'                  => array( '1', 'солагай', 'слева', 'left' ),
+       'img_center'                => array( '1', 'төп', 'центр', 'center', 'centre' ),
+       'sitename'                  => array( '1', 'САЙТТЫҢАДЫ', 'НАЗВАНИЕ_САЙТА', 'SITENAME' ),
+       'ns'                        => array( '0', 'АД:', 'ПИ:', 'NS:' ),
+       'nse'                       => array( '0', 'АД2:', 'ПИК:', 'NSE:' ),
+       'currentweek'               => array( '1', 'АМГЫЧЕДИХОНУК', 'ТЕКУЩАЯ_НЕДЕЛЯ', 'CURRENTWEEK' ),
+       'currentdow'                => array( '1', 'АМГЫЧЕДИХОНУКТУҢХҮНҮ', 'ТЕКУЩИЙ_ДЕНЬ_НЕДЕЛИ', 'CURRENTDOW' ),
+       'raw'                       => array( '0', 'ЧИГ:', 'НЕОБРАБ:', 'RAW:' ),
+       'language'                  => array( '0', '#ДЫЛ:', '#ЯЗЫК:', '#LANGUAGE:' ),
+       'special'                   => array( '0', 'тускай', 'служебная', 'special' ),
+       'tag'                       => array( '0', 'демдек', 'метка', 'тег', 'тэг', 'tag' ),
+       'hiddencat'                 => array( '1', '__ЧАЖЫТ_АҢГЫЛАЛ__', '__СКРЫТАЯ_КАТЕГОРИЯ__', '__HIDDENCAT__' ),
+       'pagesincategory'           => array( '1', '__АҢГЫЛАЛ_АРЫННАРЫ__', 'СТРАНИЦ_В_КАТЕГОРИИ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesincategory_all'       => array( '0', 'шупту', 'all' ),
        'pagesincategory_pages'     => array( '0', 'арыннар', 'pages' ),
        'pagesincategory_files'     => array( '0', 'файлдар', 'files' ),
@@ -404,7 +409,7 @@ $messages = array(
 'login-abort-generic' => 'Системаже таптыг эвес кирип тур силер',
 'loginlanguagelabel' => 'Дыл: $1',
 
-# E-mail sending
+# Email sending
 'php-mail-error-unknown' => 'PHP-ниң mail() ажыл-чорудулгазында билбес алдаг бар.',
 
 # Change password dialog
@@ -950,7 +955,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'listgrouprights-group' => 'Бөлүк кижилер',
 'listgrouprights-members' => '(кежигүннүң даңзызы)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Бо ажыглакчыга э-чагааны чорудаары',
 'defemailsubject' => '{{grammar:ablative|{{SITENAME}}}} э-чагаа',
 'emailusernamesubmit' => 'Күүcедири',
@@ -1194,13 +1199,8 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'anonymous' => '{{grammar:genitive|{{SITENAME}}}} ат эвес {{PLURAL:$1|ажыглакчызы|ажыглакчылары}}',
 
 # Skin names
-'skinname-standard' => 'Классик',
-'skinname-nostalgia' => 'Ностальгия',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'МоноБук',
-'skinname-myskin' => 'МайСкин',
-'skinname-chick' => 'Чикк',
-'skinname-simple' => 'Симпел',
 'skinname-modern' => 'Модерн',
 'skinname-vector' => 'Вектор',
 
@@ -1261,7 +1261,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Калбаа',
 'exif-imagelength' => 'Бедик',
 'exif-imagedescription' => 'Чуруктуң ады',
@@ -1339,10 +1339,6 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'version-other' => 'Өске',
 'version-software-version' => 'Үндүрери',
 
-# Special:FilePath
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Күүcедири',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файлдың ады:',
 'fileduplicatesearch-submit' => 'Дилээри',
index ec55bcb..1beb939 100644 (file)
@@ -35,6 +35,12 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'تۈر مۇنازىرىسى',
 );
 
+$specialPageAliases = array(
+       'Allmessages'               => array( 'بارلىق_خەۋەرلەر' ),
+       'Allpages'                  => array( 'بارلىق_بەتلەر' ),
+       'Ancientpages'              => array( 'كونا_بەتلەر' ),
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ئۇلانما ئاستى سىزىقى:',
@@ -66,9 +72,6 @@ $messages = array(
 'tog-shownumberswatching' => 'بۇ بەتنى كۆزىتىۋاتقان ئىشلەتكۈچى سانىنى كۆرسەت',
 'tog-oldsig' => 'نۆۋەتتىكى ئىمزا:',
 'tog-fancysig' => 'ئىمزاغا wiki تېكستى سۈپىتىدە مۇئامىلە قىل (ئۆزلۈكىدىن ئۇلانما ھاسىل بولمايدۇ)',
-'tog-externaleditor' => 'كۆڭۈلدىكى ئەھۋالدا سىرتقى تەھرىرلىگۈچ ئىشلىتىدۇ (ئالىي ئىشلەتكۈچىگە تەمىنلىنىدۇ، كومپيۇتېرىڭىزدا بىر قىسىم ئالاھىدە تەڭشەش ئېلىپ بېرىشىڭىز لازىم
-[//www.mediawiki.org/wiki/Manual:External_editors تېخىمۇ كۆپ ئۇچۇر.])',
-'tog-externaldiff' => 'كۆڭۈلدىكى ئەھۋالدا سىرتقى پەرق تەھلىلى ئىشلىتىدۇ (ئالىي ئىشلەتكۈچىگە تەمىنلىنىدۇ، كومپيۇتېرىڭىزدا بىر قىسىم ئالاھىدە تەڭشەش ئېلىپ بېرىشىڭىز لازىم. [//www.mediawiki.org/wiki/Manual:External_editors تېخىمۇ كۆپ ئۇچۇر.])',
 'tog-showjumplinks' => '"ئاتلا" زىيارەت ئۇلانمىسىنى قوزغات',
 'tog-uselivepreview' => 'رىئال ۋاقىتلىق ئالدىن كۆزىتىشنى ئىشلەت (JavaScript زۆرۈر) (سىناق)',
 'tog-forceeditsummary' => 'ئۈزۈندە كىرگۈزمىگەندە مېنى ئەسكەرت',
@@ -1156,15 +1159,6 @@ $1",
 'searchdisabled' => '{{SITENAME}} نىڭ ئىزدىشى چەكلەنگەن. سىز ھازىرچە Google ئىشلىتىپ ئىزدەپ تۇرۇڭ،.
 دىققەت ئۇلار ئىندېكسلىغان {{SITENAME}} مەزمۇنىنىڭ ۋاقتى ئۆتكەن بولۇشى مۇمكىن.',
 
-# Quickbar
-'qbsettings' => 'تېز يولباشچى ستونى',
-'qbsettings-none' => 'يوق',
-'qbsettings-fixedleft' => 'سول تەرەپ مۇقىم',
-'qbsettings-fixedright' => 'ئوڭ تەرەپ مۇقىم',
-'qbsettings-floatingleft' => 'سول تەرەپ لەيلىمە',
-'qbsettings-floatingright' => 'ئوڭ تەرەپ لەيلىمە',
-'qbsettings-directionality' => 'تىلىڭىزدىكى تېكىست ۋە قوليازمىنىڭ يۆنىلىشىگە ئاساسەن مۇقىملاشتۇرىدۇ.',
-
 # Preferences page
 'preferences' => 'مايىللىق',
 'mypreferences' => 'مايىللىق',
@@ -1726,7 +1720,6 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization',
 'http-read-error' => 'HTTP ئوقۇش خاتالىقى.',
 'http-timed-out' => 'HTTP ئىلتىماسى ۋاقىت ھالقىدى.',
 'http-curl-error' => 'URL ئاجراتقاندا خاتالىق كۆرۈلدى: $1',
-'http-host-unreachable' => 'URL غا ئۇلىشالمىدى.',
 'http-bad-status' => 'HTTP ئىلتىماس قىلغاندا مەسىلە كۆرۈلدى: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2138,8 +2131,8 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'notvisiblerev' => 'تۈزىتىلگەن نەشرى ئۆچۈرۈلدى',
 'watchnochange' => 'كۆرسەتكەن ۋاقىت بۆلىكىدە سىزنىڭ كۆزەت بېتىڭىزدە ئۆزگىرىش بولمىدى.',
 'watchlist-details' => 'كۆزەت تىزىملىكىڭىزدە {{PLURAL:$1|$1 بەت|$1 بەت}}  بار، مۇنازىرە بېتىنى ئۆز ئىچىگە ئالمايدۇ.',
-'wlheader-enotif' => 'ئېلخەتتە ئەسكەرتىش ئىقتىدارى قوزغىتىلدى.',
-'wlheader-showupdated' => "سىز ئالدىنقى قېتىم كۆرگەندىن كېيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
+'wlheader-enotif' => 'ئېلخەتتە ئەسكەرتىش ئىقتىدارى قوزغىتىلدى.',
+'wlheader-showupdated' => "سىز ئالدىنقى قېتىم كۆرگەندىن كېيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
 'watchmethod-recent' => 'كۆزىتىۋاتقان بەتنىڭ يېقىنقى ئۆزگەرتىشىنى تەكشۈر',
 'watchmethod-list' => 'كۆزىتىۋاتقان بەتنىڭ يېقىنقى ئۆزگەرتىشىنى تەكشۈر',
 'watchlistcontains' => 'كۆزەت تىزىملىكىڭىزدە $1 {{PLURAL:$1|بەت|بەت}} بار.',
@@ -2886,13 +2879,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* CSS placed here will be applied to all skins */',
-'standard.css' => '/* CSS placed here will affect users of the Standard skin */',
-'nostalgia.css' => '/* CSS placed here will affect users of the Nostalgia skin */',
 'cologneblue.css' => '/* CSS placed here will affect users of the Cologne Blue skin */',
 'monobook.css' => '/* CSS placed here will affect users of the Monobook skin */',
-'myskin.css' => '/* CSS placed here will affect users of the MySkin skin */',
-'chick.css' => '/* CSS placed here will affect users of the Chick skin */',
-'simple.css' => '/* CSS placed here will affect users of the Simple skin */',
 'modern.css' => '/* CSS placed here will affect users of the Modern skin */',
 'vector.css' => '/* CSS placed here will affect users of the Vector skin */',
 'print.css' => '/* CSS placed here will affect the print output */',
@@ -2904,13 +2892,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Any JavaScript here will be loaded for all users on every page load. */',
-'standard.js' => '/* Any JavaScript here will be loaded for users using the Standard skin */',
-'nostalgia.js' => '/* Any JavaScript here will be loaded for users using the Nostalgia skin */',
 'cologneblue.js' => '/* Any JavaScript here will be loaded for users using the Cologne Blue skin */',
 'monobook.js' => '/* Any JavaScript here will be loaded for users using the MonoBook skin */',
-'myskin.js' => '/* Any JavaScript here will be loaded for users using the MySkin skin */',
-'chick.js' => '/* Any JavaScript here will be loaded for users using the Chick skin */',
-'simple.js' => '/* Any JavaScript here will be loaded for users using the Simple skin */',
 'modern.js' => '/* Any JavaScript here will be loaded for users using the Modern skin */',
 'vector.js' => '/* Any JavaScript here will be loaded for users using the Vector skin */',
 'group-autoconfirmed.js' => '/* Any JavaScript here will be loaded for autoconfirmed users only */',
@@ -2990,13 +2973,8 @@ $1',
 'pageinfo-category-files' => 'ھۆججەت سانى',
 
 # Skin names
-'skinname-standard' => 'Classic',
-'skinname-nostalgia' => 'Nostalgia',
 'skinname-cologneblue' => 'Cologne Blue',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'MySkin',
-'skinname-chick' => 'Chick',
-'skinname-simple' => 'Simple',
 'skinname-modern' => 'Modern',
 'skinname-vector' => 'Vector',
 
@@ -3095,8 +3073,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3149,7 +3125,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'كەڭلىك',
 'exif-imagelength' => 'ئېگىزلىك',
 'exif-bitspersample' => 'ھەر بىر نۇقتىنىڭ بىت سانى',
@@ -3327,7 +3303,7 @@ Variants for Chinese language
 'exif-originalimageheight' => 'كېسىشتىن ئىلگىرىكى سۈرەتنىڭ ئېگىزلىكى',
 'exif-originalimagewidth' => 'كېسىشتىن ئىلگىرىكى سۈرەتنىڭ كەڭلىكى',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'پرىسلانمىغان',
 'exif-compression-2' => 'CCITT 3-گۇرۇپپا بىر ئۆلچەملىك ئۆزگەرتىلگەن خۇفمان ئىجرا كودلىنىشى',
 'exif-compression-3' => 'CCITT نىڭ 3-گۇرۇپپا فاكس كودلىنىشى',
@@ -3740,13 +3716,6 @@ MediaWiki ئىشلىتىش مەقسىتىنى ئاساس قىلىپ ئېلان 
 'version-entrypoints-header-entrypoint' => 'كىرىش نۇقتىسى',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'ھۆججەت يولى',
-'filepath-page' => 'ھۆججەت:',
-'filepath-submit' => 'يۆتكەل',
-'filepath-summary' => '!بۇ ئالاھىدە بەت ھۆججەتنىڭ تولۇق يولىنى قايتۇرىدۇ.
-سۈرەت تولۇق ئېنىقلىقتا كۆرسىتىلىدۇ، باشقا ھۆججەت تىپى بىۋاسىتە ئۇلانغان قوللىنىشچان پروگراممىدا ئېچىلىدۇ',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'تەكرار ھۆججەت ئىزدە',
 'fileduplicatesearch-summary' => 'چاچما (hash) قىممىتىگە ئاساسەن تەكرار ھۆججەت ئىزدە.',
index 9084776..c93757f 100644 (file)
  * @author KEL
  * @author Kalan
  * @author Microcell
+ * @author Nemo bis
  * @author NickK
  * @author Olvin
  * @author Prima klasy4na
  * @author RLuts
  * @author Riwnodennyk
  * @author Sodmy
+ * @author Ua2004
  * @author Urhixidur
  * @author VolodymyrF
  * @author Vox
@@ -308,7 +310,7 @@ $magicWords = array(
        'revisionmonth1'            => array( '1', 'МІСЯЦЬ_ВЕРСІЇ_1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
        'revisionyear'              => array( '1', 'РІК_ВЕРСІЇ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
        'revisiontimestamp'         => array( '1', 'МІТКА_ЧАСУ_ВЕРСІЇ', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'              => array( '1', 'Ð\92Ð\95РСÐ\86Я_Ð\9aÐ\9eРÐ\98СТУÐ\92Ð\90ЧÐ\90', 'Ð\92Ð\95РСÐ\98Я_УЧÐ\90СÐ\9dÐ\98Ð\9aÐ\90', 'Ð\92Ð\95РСÐ\98Я_УЧÐ\90СТÐ\9dÐ\98Ð\9aÐ\90', 'REVISIONUSER' ),
+       'revisionuser'              => array( '1', 'ВЕРСІЯ_КОРИСТУВАЧА', 'ВЕРСИЯ_УЧАСТНИКА', 'REVISIONUSER' ),
        'plural'                    => array( '0', 'МНОЖИНА:', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'ПОВНА_АДРЕСА:', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'ПОВНА_АДРЕСА_2:', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
@@ -385,8 +387,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Показувати число користувачів, які додали сторінку до свого списку спостереження',
 'tog-oldsig' => 'Існуючий підпис:',
 'tog-fancysig' => 'Власна вікі-розмітка підпису (без автоматичного посилання)',
-'tog-externaleditor' => "Використовувати зовнішній редактор за умовчанням (тільки для досвідчених користувачів, вимагає спеціальних налаштувань вашого комп'ютера [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
-'tog-externaldiff' => "Використовувати зовнішню програму порівняння версій за умовчанням (тільки для експертів, вимагає спеціальних налаштувань вашого комп'ютера. [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
 'tog-showjumplinks' => 'Активізувати допоміжні посилання «перейти до»',
 'tog-uselivepreview' => 'Використовувати швидкий попередній перегляд (JavaScript, експериментально)',
 'tog-forceeditsummary' => 'Попереджати, коли не зазначений короткий опис редагування',
@@ -401,6 +401,7 @@ $messages = array(
 'tog-showhiddencats' => 'Показувати приховані категорії',
 'tog-noconvertlink' => 'Вимкнути конвертацію назви посилання',
 'tog-norollbackdiff' => 'Не показувати різницю версій після виконання відкоту',
+'tog-useeditwarning' => 'Попереджати мене, якщо я залишаю сторінку редагування з незбереженими змінами',
 
 'underline-always' => 'Завжди',
 'underline-never' => 'Ніколи',
@@ -464,6 +465,18 @@ $messages = array(
 '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 грудня',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категорія|Категорії}}',
@@ -557,7 +570,7 @@ $messages = array(
 'unprotectthispage' => 'Зміна захисту цієї сторінки',
 'newpage' => 'Нова сторінка',
 'talkpage' => 'Обговорити цю сторінку',
-'talkpagelinktext' => 'Ð\9eбговорення',
+'talkpagelinktext' => 'обговорення',
 'specialpage' => 'Спеціальна сторінка',
 'personaltools' => 'Особисті інструменти',
 'postcomment' => 'Новий розділ',
@@ -773,9 +786,18 @@ $1',
 'welcomecreation-msg' => 'Ваш акаунт було створено.
 Не забудьте змінити свої [[Special:Preferences|налаштування у {{GRAMMAR:genitive|{{SITENAME}}}}]].',
 'yourname' => "Ім'я користувача:",
+'userlogin-yourname' => "Ім'я користувача",
+'userlogin-yourname-ph' => "Введіть ім'я користувача",
 'yourpassword' => 'Пароль:',
+'userlogin-yourpassword' => 'Пароль',
+'userlogin-yourpassword-ph' => 'Введіть ваш пароль',
+'createacct-yourpassword-ph' => 'Введіть пароль',
 'yourpasswordagain' => 'Повторний набір пароля:',
+'createacct-yourpasswordagain' => 'Підтвердіть пароль',
+'createacct-yourpasswordagain-ph' => 'Введіть пароль знову',
 'remembermypassword' => "Запам'ятати мій обліковий запис на цьому комп'ютері (на строк не більше $1 {{PLURAL:$1|дня|днів}})",
+'userlogin-remembermypassword' => "Запам'ятати мене",
+'userlogin-signwithsecure' => "Використовувати захищене з'єднання",
 'securelogin-stick-https' => 'Залишайтись підключенним через HTTPS після входу',
 'yourdomainname' => 'Ваш домен:',
 'password-change-forbidden' => 'Ви не можна змінити пароль на цій вікі.',
@@ -788,18 +810,38 @@ $1',
 'logout' => 'Вихід із системи',
 'userlogout' => 'Вихід із системи',
 'notloggedin' => 'Ви не ввійшли до системи',
+'userlogin-noaccount' => 'Немає облікового запису?',
+'userlogin-joinproject' => 'Приєднатися до {{SITENAME}}',
 'nologin' => "Ви ще не зареєструвались? '''$1'''.",
 'nologinlink' => 'Створіть обліковий запис',
 'createaccount' => 'Зареєструватися',
 'gotaccount' => "Ви вже зареєстровані? '''$1'''.",
 'gotaccountlink' => 'Увійдіть',
 'userlogin-resetlink' => 'Забули дані, потрібні для входу?',
+'userlogin-resetpassword-link' => 'Скинути пароль',
+'helplogin-url' => 'Help:Вхід до системи',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Допомога в реєстрації]]',
+'createacct-join' => 'Введіть вашу інформацію нижче.',
+'createacct-emailrequired' => 'Адреса електронної пошти',
+'createacct-emailoptional' => "Адреса електронної пошти (не обов'язково)",
+'createacct-email-ph' => 'Введіть Вашу адресу електронної пошти',
 'createaccountmail' => 'Використати тимчасовий випадковий пароль і надіслати його на адресу електронної пошти, вказану нижче',
+'createacct-realname' => "Справжнє ім'я (не обов'язково)",
 'createaccountreason' => 'Причина:',
+'createacct-reason' => 'Причина',
+'createacct-reason-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|дописувач|дописувачі|дописувачів}} цього місяця',
 'badretype' => 'Уведені вами паролі не збігаються.',
 'userexists' => "Уведене ім'я користувача вже існує.
 Будь ласка оберіть інше ім'я.",
 'loginerror' => 'Помилка при вході до системи',
+'createacct-error' => 'Помилка створення облікового запису',
 'createaccounterror' => 'Не в змозі створити обліковий запис: $1',
 'nocookiesnew' => 'Користувач зареєструвався, але не ввійшов до системи.
 {{SITENAME}} використовує куки для входу до системи.
@@ -844,8 +886,8 @@ $1',
 'blocked-mailpassword' => 'Редагування з вашої IP-адреси заборонено, заблокована також функція відновлення пароля.',
 'eauthentsent' => 'На зазначену адресу електронної пошти надісланий лист із запитом на підтвердження зміни адреси.
 У листі також описані дії, які потрібно виконати для підтвердження того, що ця адреса електронної пошти справді належить вам.',
-'throttled-mailpassword' => 'ФÑ\83нкÑ\86Ñ\96Ñ\8f Ð½Ð°Ð³Ð°Ð´Ñ\83ваннÑ\8f Ð¿Ð°Ñ\80олÑ\8f Ð²Ð¶Ðµ Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83валаÑ\81Ñ\8c Ð¿Ñ\80оÑ\82Ñ\8fгом {{PLURAL:$1|оÑ\81Ñ\82аннÑ\8cоÑ\97 $1 Ð³Ð¾Ð´Ð¸Ð½Ð¸|оÑ\81Ñ\82аннÑ\96Ñ\85 $1 Ð³Ð¾Ð´Ð¸Ð½|останніх $1 годин}}.
\94лÑ\8f Ð¿Ð¾Ð¿ÐµÑ\80едженнÑ\8f Ð·Ð»Ð¾Ð²Ð¶Ð¸Ð²Ð°Ð½Ñ\8c Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82и Ð½Ðµ Ð±Ñ\96лÑ\8cÑ\88е Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ð½Ð°Ð³Ð°Ð´Ñ\83ваннÑ\8f Ð·Ð° $1 {{PLURAL:$1|годинÑ\83|години|годин}}.',
+'throttled-mailpassword' => 'Ð\86нÑ\81Ñ\82Ñ\80Ñ\83кÑ\86Ñ\96Ñ\8f Ð¿Ð¾ Ð²Ñ\96дновленнÑ\8e Ð¿Ð°Ñ\80олÑ\8e Ð²Ð¶Ðµ Ð±Ñ\83ла Ð²Ð¸Ñ\81лана ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\8e Ð¿Ð¾Ñ\88Ñ\82оÑ\8e Ð¿Ñ\80оÑ\82Ñ\8fгом {{PLURAL:$1|оÑ\81Ñ\82аннÑ\8cоÑ\97 Ð³Ð¾Ð´Ð¸Ð½Ð¸|останніх $1 годин}}.
\94лÑ\8f Ð¿Ð¾Ð¿ÐµÑ\80едженнÑ\8f Ð·Ð»Ð¾Ð²Ð¶Ð¸Ð²Ð°Ð½Ñ\8c Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ Ð½Ð°Ð´Ñ\81илаÑ\82и Ñ\82Ñ\96лÑ\8cки Ð¾Ð´Ð½Ñ\83 Ñ\96нÑ\81Ñ\82Ñ\80Ñ\83кÑ\86Ñ\96Ñ\8e Ð·Ð° {{PLURAL:$1|годинÑ\83|$1 Ð³Ð¾Ð´Ð¸Ð½Ð¸|$1 годин}}.',
 'mailerror' => 'Помилка при відправці пошти: $1',
 'acct_creation_throttle_hit' => 'Відвідувачі з вашої IP-адреси вже створили $1 {{PLURAL:$1|обліковий запис|облікових записи|облікових записів}} за останню добу, що є максимумом для цього відрізка часу.
 Таким чином, користувачі з цієї IP-адреси не можуть на цей момент створювати нових облікових записів.',
@@ -892,13 +934,13 @@ $1',
 'resetpass-wrong-oldpass' => 'Неправильний тимчасовий або поточний пароль.
 Можливо, ви вже успішно змінили пароль або зробили запит на новий тимчасовий пароль.',
 'resetpass-temp-password' => 'Тимчасовий пароль:',
+'resetpass-abort-generic' => 'Зміну пароля було перервано розширенням.',
 
 # Special:PasswordReset
 'passwordreset' => 'Скинути пароль',
-'passwordreset-text' => 'Заповніть цю форму для відновлення пароля.',
 'passwordreset-legend' => 'Перевстановити пароль',
 'passwordreset-disabled' => 'У цій вікі вимкнена можливість скидання пароля.',
-'passwordreset-pretext' => '{{PLURAL:$1||Введіть одну з частин даних}}',
+'passwordreset-emaildisabled' => 'Функції електронної пошти вимкнуто в цій вікі.',
 'passwordreset-username' => "Ім'я користувача:",
 'passwordreset-domain' => 'Домен:',
 'passwordreset-capture' => 'Продивитись результуючий електронний лист?',
@@ -909,7 +951,7 @@ $1',
 
 $2
 
-{{PLURAL:$3|Цей тимчасовий пароль|Ці тимчасові паролі}} стануть нечинні через {{PLURAL:$5|день|$5 дні|$5 днів}}.
+{{PLURAL:$3|Цей тимчасовий пароль|Ці тимчасові паролі}} стануть недійсні через {{PLURAL:$5|день|$5 дні|$5 днів}}.
 Ви маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший, або Ви пам'ятаєте свій старий пароль і не бажаєте його змінювати, можете просто проігнорувати це повідомлення та продовжувати використовувати старий пароль.",
 'passwordreset-emailtext-user' => "Користувач $1 з {{SITENAME}} попросив нагадати деталі Вашого облікового запису для {{SITENAME}} ($4). З Вашою електронною скринькою пов'язан{{PLURAL:$3|ий такий запис|і такі записи}}:
 
@@ -920,8 +962,8 @@ $2
 'passwordreset-emailelement' => "Ім'я користувача: $1
 Тимчасовий пароль: $2",
 'passwordreset-emailsent' => 'Електронний лист для відновлення пароля відправлений.',
-'passwordreset-emailsent-capture' => 'Електронний лист-нагадування був надісланий, як показано нижче.',
-'passwordreset-emailerror-capture' => 'Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання користувачеві $1 не вдалося.',
+'passwordreset-emailsent-capture' => 'Електронний лист скидання паролю було надіслано, як показано нижче.',
+'passwordreset-emailerror-capture' => 'Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.',
 
 # Special:ChangeEmail
 'changeemail' => 'Змінити адресу електронної пошти',
@@ -1140,12 +1182,15 @@ $2
 Імовірно, вона була вилучена.',
 'edit-conflict' => 'Конфлікт редагувань.',
 'edit-no-change' => 'Ваше редагування відхилене, оскільки в тексті не було зроблено змін.',
+'postedit-confirmation' => 'Ваше редагування збережено',
 'edit-already-exists' => 'Неможливо створити нову сторінку.
 Вона вже існує.',
 'defaultmessagetext' => 'Текст «за замовчування»',
 'content-failed-to-parse' => 'Не вдалось проаналізувати $2 як тип $1: $3',
 'invalid-content-data' => 'Неприпустимі дані',
 'content-not-allowed-here' => 'Вміст «$1» недопустимий на сторінці [[$2]]',
+'editwarning-warning' => 'Перехід на іншу сторінку призведе до втрати ваших змін.
+Якщо ви ввійшли до системи, то ви можете відключити це попередження в розділі «{{int:prefs-editing}}» ваших налаштувань.',
 
 # Content models
 'content-model-wikitext' => 'вікітекст',
@@ -1386,7 +1431,7 @@ $1",
 'shown-title' => 'Показувати $1 {{PLURAL:$1|запис|записи|записів}} на сторінці',
 'viewprevnext' => 'Переглянути ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Параметри пошуку',
-'searchmenu-exists' => "'''У цій вікі є сторінка з назвою «[[$1]]»'''",
+'searchmenu-exists' => "'''У цій вікі є сторінка з назвою «[[:$1]]»'''",
 'searchmenu-new' => "'''Створити сторінку «[[:$1]]» у цій вікі!'''",
 'searchhelp-url' => 'Help:Довідка',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показати сторінки з цим префіксом]]',
@@ -1429,15 +1474,7 @@ $1",
 'powersearch-togglenone' => 'Жодний',
 'search-external' => 'Зовнішній пошук',
 'searchdisabled' => '<p>Вибачте, повнотекстовий пошук тимчасово недоступний через перевантаження сервера; передбачається, що ця функція буде знову включена після установки нового обладнання. Поки що ми пропонуємо вам скористатися Google чи Yahoo!:</p>',
-
-# Quickbar
-'qbsettings' => 'Панель навігації',
-'qbsettings-none' => 'Не показувати панель',
-'qbsettings-fixedleft' => 'Фіксована ліворуч',
-'qbsettings-fixedright' => 'Фіксована праворуч',
-'qbsettings-floatingleft' => 'Плаваюча ліворуч',
-'qbsettings-floatingright' => 'Плаваюча праворуч',
-'qbsettings-directionality' => 'Фіксована, залежно від напрямку письма вашої мови',
+'search-error' => 'Сталася помилка під час пошуку:$1',
 
 # Preferences page
 'preferences' => 'Налаштування',
@@ -1460,7 +1497,7 @@ $1",
 'prefs-watchlist-days-max' => 'Максимум $1 {{PLURAL:$1|день|дні|днів}}',
 'prefs-watchlist-edits' => 'Кількість редагувань для відображення у розширеному списку спостереження:',
 'prefs-watchlist-edits-max' => 'Максимально: 1000',
-'prefs-watchlist-token' => 'Ð\9fознаÑ\87ка списку спостереження:',
+'prefs-watchlist-token' => 'Ð\9cÑ\96Ñ\82ка списку спостереження:',
 'prefs-misc' => 'Інші налаштування',
 'prefs-resetpass' => 'Змінити пароль',
 'prefs-changeemail' => 'Змінити адресу електронної пошти',
@@ -1586,6 +1623,7 @@ $1",
 'userrights-changeable-col' => 'Групи, які ви можете змінити',
 'userrights-unchangeable-col' => 'Групи, які ви не можете змінити',
 'userrights-irreversible-marker' => '$1*',
+'userrights-conflict' => 'Конфлікт прав користувача! Будь ласка, застосуйте зміни знову.',
 
 # Groups
 'group' => 'Група:',
@@ -2006,7 +2044,6 @@ $1',
 'http-read-error' => 'Помилка читання HTTP.',
 'http-timed-out' => 'Перевищення часу очікування HTTP-запиту.',
 'http-curl-error' => 'Помилка звертання до URL: $1',
-'http-host-unreachable' => 'Неможливо досягнути вказану URL-адресу.',
 'http-bad-status' => 'Під час HTTP-запиту виникла проблема: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2414,7 +2451,7 @@ $1',
 'addedwatchtext' => "Сторінку «[[:$1]]» додано до вашого [[Special:Watchlist|списку спостереження]].
 Подальші редагування цієї сторінки (та пов'язаної з нею сторінки обговорення) відображатимуться в цьому списку.",
 'removewatch' => 'Видалити зі списку спостереження',
-'removedwatchtext' => 'Сторінка «[[:$1]]» вилучена з вашого [[Special:Watchlist|списку спостереження]].',
+'removedwatchtext' => 'Сторінку «[[:$1]]» вилучено з вашого [[Special:Watchlist|списку спостереження]].',
 'watch' => 'Спостерігати',
 'watchthispage' => 'Спостерігати за цією сторінкою',
 'unwatch' => 'Скас. спостереження',
@@ -2423,8 +2460,8 @@ $1',
 'notvisiblerev' => 'Версія була вилучена',
 'watchnochange' => 'За вказаний період в статтях з списку спостереження нічого не змінено.',
 'watchlist-details' => 'У вашому списку спостереження $1 {{PLURAL:$1|сторінка|сторінки|сторінок}} (не враховуючи сторінок обговорення).',
-'wlheader-enotif' => 'Сповіщення електронною поштою ввімкнено.',
-'wlheader-showupdated' => "Сторінки, що змінилися після вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
+'wlheader-enotif' => 'Сповіщення електронною поштою ввімкнено.',
+'wlheader-showupdated' => "Сторінки, що змінилися після вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
 'watchmethod-recent' => 'перегляд останніх редагувань статей за якими ведеться спостереження',
 'watchmethod-list' => 'перегляд статей за якими ведеться спостереження',
 'watchlistcontains' => 'Ваш список спостереження містить $1 {{PLURAL:$1|сторінку|сторінки|сторінок}}.',
@@ -2521,8 +2558,8 @@ $UNWATCHURL
 'rollback' => 'Відкинути редагування',
 'rollback_short' => 'Відкинути',
 'rollbacklink' => 'відкинути',
-'rollbacklinkcount' => 'скасування $1 {{PLURAL:$1|редагування|редагувань|редагувань}}',
-'rollbacklinkcount-morethan' => 'скасування більш, ніж $1 {{PLURAL:$1|редагування|редагувань|редагувань}}',
+'rollbacklinkcount' => 'відкинути $1 {{PLURAL:$1|редагування|редагування|редагувань}}',
+'rollbacklinkcount-morethan' => 'відкинути понад $1 {{PLURAL:$1|редагування|редагування|редагувань}}',
 'rollbackfailed' => 'Відкинути зміни не вдалося',
 'cantrollback' => 'Неможливо відкинути редагування, оскільки останній дописувач сторінки є її автором.',
 'alreadyrolled' => 'Неможливо відкинути останні редагування [[:$1]], зроблені [[User:$2|$2]] ([[User talk:$2|обговорення]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), оскільки хтось інший уже змінив чи відкинув редагування цієї статті.
@@ -2832,21 +2869,22 @@ $1',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL.',
 'sorbs_create_account_reason' => 'Ваша IP-адреса числиться як відкритий проксі в DNSBL. Ви не можете створити обліковий запис.',
+'xffblockreason' => 'IP-адреса в X-Forwarded-For полі заголовка, або ваша, або проксі сервера, що використовується вами, заблокована. Початкова причина блокування була:$1',
 'cant-block-while-blocked' => 'Ви не можете блокувати інших користувачів, поки ви самі заблоковані.',
 'cant-see-hidden-user' => 'Користувача, якого ви хочете заблокувати, вже заблоковано та приховано. Оскільки у вас немає прав щодо приховання користувачів, ви не можете переглянути або змінити дане блокування.',
 'ipbblocked' => 'Ви не можете блокувати чи розблоковувати інших користувачів, оскільки самі заблоковані',
 'ipbnounblockself' => 'Ви не можете розблокувати себе',
 
 # Developer tools
-'lockdb' => 'Заблокувати базу даних (режим "тільки для читання")',
+'lockdb' => 'Заблокувати базу даних',
 'unlockdb' => 'Розблокувати базу даних',
 'lockdbtext' => 'Блокування бази даних унеможливить для всіх користувачів редагування сторінок, зміну налаштувань, списків спостереження та виконання інших дій, що вимагають доступу до бази даних.
 Будь ласка, підтвердіть, що це — саме те, що ви бажаєте зробити, і що ви знімете блокування, коли закінчите обслуговування бази даних.',
 'unlockdbtext' => 'Розблокування бази даних надасть змогу знову редагувати сторінки, змінювати налаштування, списки спостереження та виконувати інші дії, що вимагають доступу до бази даних.
 Будь ласка, підтвердіть, що ви справді хочете це зробити.',
-'lockconfirm' => "Так, я дійсно хочу заблокувати базу даних (перейти в режим ''тільки для читання'').",
+'lockconfirm' => 'Так, я дійсно хочу заблокувати базу даних.',
 'unlockconfirm' => 'Так, я дійсно хочу розблокувати базу даних.',
-'lockbtn' => "Заблокувати базу даних (режим ''тільки для читання'')",
+'lockbtn' => 'Заблокувати базу даних',
 'unlockbtn' => 'Розблокувати базу даних',
 'locknoconfirm' => 'Ви не поставили галочку в поле підтвердження.',
 'lockdbsuccesssub' => 'Базу даних заблоковано',
@@ -2993,6 +3031,8 @@ $1',
 'thumbnail-more' => 'Збільшити',
 'filemissing' => 'Файл не знайдено',
 'thumbnail_error' => 'Помилка створення мініатюри: $1',
+'thumbnail_error_remote' => 'Повідомлення про помилку від $1:
+$2',
 'djvu_page_error' => 'Номер сторінки DjVu недосяжний',
 'djvu_no_xml' => 'Неможливо отримати XML для DjVu',
 'thumbnail-temp-create' => 'Не вдалося створити тимчасовий файл мініатюри',
@@ -3140,8 +3180,6 @@ $1',
 
 # Stylesheets
 'common.css' => '/** Розміщений тут CSS буде застосовуватися до всіх тем оформлення */',
-'standard.css' => '/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Стандартне */',
-'nostalgia.css' => '/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Ностальгія */',
 'cologneblue.css' => '/* Розміщений тут CSS-код буде використаний для користувачів з налаштованою темою оформлення Кельнське блакитне */',
 'monobook.css' => '/* Розміщений тут CSS буде застосовуватися до всіх тем оформлення Monobook */
 
@@ -3156,13 +3194,9 @@ $1',
     padding-right: 0em;
     font-weight: bold;
 }',
-'myskin.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Власне */',
-'chick.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Курча */',
-'simple.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Просте */',
 'modern.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Сучасне */',
 'vector.css' => '/* Розміщений тут CSS-код буде використаний в темі оформлення Векторне */',
 'print.css' => '/* Розміщений тут CSS-код буде використаний для друкованої версії */',
-'handheld.css' => '/* Розміщений тут CSS-код буде використаний для мобільних пристроїв, що використовують тему оформлення налаштовану в $wgHandheldStyle */',
 'noscript.css' => '/* Розміщений тут CSS-код буде використаний для користувачів у яких вимкнено JavaScript */',
 'group-autoconfirmed.css' => '/* Розміщений тут CSS-код буде використаний для автопідтверджених користувачів */',
 'group-bot.css' => '/* Розміщений тут CSS-код буде використаний тільки для ботів */',
@@ -3171,13 +3205,8 @@ $1',
 
 # Scripts
 'common.js' => '/* Розміщений тут код JavaScript буде завантажений всім користувачам при зверненні до будь-якої сторінки */',
-'standard.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують стандартну тему оформлення */',
-'nostalgia.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Ностальгія */',
 'cologneblue.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Кельнське синє */',
 'monobook.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Моно-книга */',
-'myskin.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують власну тему оформлення */',
-'chick.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Курча */',
-'simple.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують просту тему оформлення */',
 'modern.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують тему оформлення Сучасне */',
 'vector.js' => '/* Розміщений тут код JavaScript буде завантажений для всіх користувачів, що використовують векторну тему оформлення */',
 'group-autoconfirmed.js' => '/* Розміщений тут код JavaScript буде завантажений тільки для автопідтверджених користувачів */',
@@ -3258,13 +3287,8 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-category-files' => 'Кількість файлів',
 
 # Skin names
-'skinname-standard' => 'Стандартне',
-'skinname-nostalgia' => 'Ностальгія',
 'skinname-cologneblue' => 'Кельнське синє',
 'skinname-monobook' => 'Моно-книга',
-'skinname-myskin' => 'Своє',
-'skinname-chick' => 'Курча',
-'skinname-simple' => 'Просте',
 'skinname-modern' => 'Сучасне',
 'skinname-vector' => 'Векторне',
 
@@ -3348,11 +3372,25 @@ $1',
 'minutes' => '{{PLURAL:$1|$1 хвилина|$1 хвилини|$1 хвилин}}',
 'hours' => '{{PLURAL:$1|$1 година|$1 години|$1 годин}}',
 'days' => '{{PLURAL:$1|$1 день|$1 дні|$1 днів}}',
+'weeks' => '{{PLURAL:$1|$1 тиждень|$1 тижні|$1 тижнів}}',
 'months' => '{{PLURAL:$1|$1 місяць|$1 місяці|$1 місяців}}',
 'years' => '{{PLURAL:$1|$1 рік|$1 роки|$1 років}}',
 'ago' => '$1 тому',
 'just-now' => 'щойно',
 
+# Human-readable timestamps
+'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',
+
 # Bad image list
 'bad_image_list' => 'Формат має бути наступним:
 
@@ -3362,8 +3400,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -3432,7 +3468,7 @@ Variants for Chinese language
 'metadata-langitem' => "'''$2:''' $1",
 'metadata-langitem-default' => '$1',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Ширина',
 'exif-imagelength' => 'Висота',
 'exif-bitspersample' => 'Глибина кольору',
@@ -3625,7 +3661,7 @@ $4, $5, $6 $7
 $8',
 'exif-subjectnewscode-value' => '$2 ($1)',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Нестиснутий',
 'exif-compression-2' => 'CCITT Group 3, 1-мірна модифікація кодування довжин серій Хаффмана',
 'exif-compression-3' => 'CCITT Group 3, факсове кодування',
@@ -4141,12 +4177,17 @@ MediaWiki поширюється в надії, що вона буде кори
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях до статей]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Шлях до скриптів]',
 
-# Special:FilePath
-'filepath' => 'Шлях до файлу',
-'filepath-page' => 'Файл:',
-'filepath-submit' => 'Виконати',
-'filepath-summary' => 'Ця спеціальна сторінка повертає повний шлях до файлу. 
-Зображення показуються в оригінальному розмірі. Інші типи файлів відкриваються пов’язаними програмами.',
+# Special:Redirect
+'redirect' => 'Перенаправлення за файлом, користувачем або ID версії',
+'redirect-legend' => 'Перенаправити на файл чи сторінку',
+'redirect-summary' => 'Ця спеціальна сторінка перенаправляє на файл (за поданою назвою файлу), сторінку (за поданим ID версії) або сторінку користувача (за поданим числовим ID користувача).',
+'redirect-submit' => 'Перейти',
+'redirect-lookup' => 'Шукати:',
+'redirect-value' => 'Значення:',
+'redirect-user' => 'ID користувача',
+'redirect-revision' => 'Версія сторінки',
+'redirect-file' => 'Назва файлу',
+'redirect-not-exists' => 'Значення не знайдено',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Пошук файлів-дублікатів',
@@ -4237,6 +4278,9 @@ MediaWiki поширюється в надії, що вона буде кори
 'htmlform-submit' => 'Відправити',
 'htmlform-reset' => 'Відкотити зміни',
 'htmlform-selectorother-other' => 'Інше',
+'htmlform-no' => 'Ні',
+'htmlform-yes' => 'Так',
+'htmlform-chosen-placeholder' => 'Виберіть параметр',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 з підтримкою повнотекстового пошуку',
@@ -4245,15 +4289,15 @@ MediaWiki поширюється в надії, що вона буде кори
 # New logging system
 'logentry-delete-delete' => '$1 {{GENDER:$2|вилучив|вилучила}} сторінку $3',
 'logentry-delete-restore' => '$1 {{GENDER:$2|відновив|відновила}} сторінку $3',
-'logentry-delete-event' => '$1 змінив видимість {{PLURAL:$5 запису журнала|$5 записів журналу}} на $3: $4',
-'logentry-delete-revision' => '$1 змінив видимість {{PLURAL:$5 версії|$5 версій}} на сторінці $3: $4',
-'logentry-delete-event-legacy' => '$1 змінив видимість записів журналу подій $3',
-'logentry-delete-revision-legacy' => '$1 змінив видимість версійна сторінці $3',
-'logentry-suppress-delete' => '$1 подавив сторінку $3',
-'logentry-suppress-event' => '$1 приховано змінив видимість для {{PLURAL:$5|запису|$5 записів}} журналу на $3: $4',
-'logentry-suppress-revision' => '$1 приховано змінив видимість для {{PLURAL:$5 версії|$5 версій}} на сторінці $3: $4',
-'logentry-suppress-event-legacy' => '$1 приховано змінив видимість записів журналу $3',
-'logentry-suppress-revision-legacy' => '$1 приховано змінив видимість версій на сторінці $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5 запису журналу|$5 записів журналу}} на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5 версії|$5 версій}} на сторінці $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|змінив|змінила}} видимість записів журналу подій $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|змінив|змінила}} видимість версій на сторінці $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|подавив|подавила}} сторінку $3',
+'logentry-suppress-event' => '$1 приховано {{GENDER:$2|змінив|змінила}} видимість для {{PLURAL:$5|$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-revision-legacy' => '$1 приховано {{GENDER:$2|змінив|змінила}} видимість версій на сторінці $3',
 'revdelete-content-hid' => 'вміст приховано',
 'revdelete-summary-hid' => 'опис редагування приховано',
 'revdelete-uname-hid' => "ім'я користувача приховано",
@@ -4266,13 +4310,13 @@ MediaWiki поширюється в надії, що вона буде кори
 'logentry-move-move-noredirect' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4 без створення перенаправлення',
 'logentry-move-move_redir' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4 поверх перенаправлення',
 'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку $3 на $4 поверх перенаправлення і без залишення перенаправлення',
-'logentry-patrol-patrol' => '$1 відпатрулював версію $4 сторінки $3',
-'logentry-patrol-patrol-auto' => '$1 автоматично відпатрулював версію $4 сторінки $3',
-'logentry-newusers-newusers' => 'СÑ\82воÑ\80ено Ð¾Ð±Ð»Ñ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81 $1',
-'logentry-newusers-create' => '$1 — створено обліковий запис',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|відпатрулював|відпатрулювала}} версію $4 сторінки $3',
+'logentry-patrol-patrol-auto' => '$1 автоматично {{GENDER:$2|відпатрулював|відпатрулювала}} версію $4 сторінки $3',
+'logentry-newusers-newusers' => 'Ð\9eблÑ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81 $1 Ð±Ñ\83в {{GENDER:$2|Ñ\81Ñ\82воÑ\80ений}}',
+'logentry-newusers-create' => 'Обліковий запис для $1 було створено',
 'logentry-newusers-create2' => '$1 {{GENDER:$2|створив|створила}} обліковий запис {{GENDER:$4|користувача|користувачки}} $3',
-'logentry-newusers-byemail' => 'Обліковий запис {{GENDER:$2|користувача|користувачки}} створений {{GENDER:$4|користувачем|користувачкою}} $1 і пароль було надіслано електронною поштою',
-'logentry-newusers-autocreate' => '$1 — автоматично створений обліковий запис',
+'logentry-newusers-byemail' => 'Обліковий запис $3 {{GENDER:$2|користувача|користувачки}} створений {{GENDER:$4|користувачем|користувачкою}} $1 і пароль було надіслано електронною поштою',
+'logentry-newusers-autocreate' => 'Обліковий запис $1 було {{GENDER:$2|створено}} автоматично',
 'logentry-rights-rights' => '$1 {{GENDER:$1|змінив|змінила}} членство в групах для $3 із $4 на $5',
 'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|змінив|змінила}} членство в групах для $3',
 'logentry-rights-autopromote' => '$1 було автоматично переведено із $4 в $5',
index b7d12c0..2d210ef 100644 (file)
@@ -11,6 +11,7 @@
  * @author Istabani
  * @author Meno25
  * @author Muhammad Shuaib
+ * @author Noor2020
  * @author O.bangash
  * @author Rachitrali
  * @author Reedy
@@ -53,13 +54,13 @@ $specialPageAliases = array(
        'Ancientpages'              => array( 'قدیم_صفحات' ),
        'Badtitle'                  => array( 'خراب_عنوان' ),
        'Blankpage'                 => array( 'خالی_صفحہ' ),
-       'Block'                     => array( 'پابندی،_دستور_شبکی_پابندی،_پابندی_بر_صارف' ),
+       'Block'                     => array( 'پابندی', 'دستور_شبکی_پابندی', 'پابندی_بر_صارف' ),
        'Blockme'                   => array( 'میری_پابندی' ),
        'Booksources'               => array( 'کتابی_وسائل' ),
        'BrokenRedirects'           => array( 'شکستہ_رجوع_مکررات' ),
        'Categories'                => array( 'زمرہ_جات' ),
        'ChangeEmail'               => array( 'ڈاک_تبدیل' ),
-       'ChangePassword'            => array( 'کلمہ_شناخت_تبدیل،_تنظیم_کلمہ_شناخت' ),
+       'ChangePassword'            => array( 'کلمہ_شناخت_تبدیل', 'تنظیم_کلمہ_شناخت' ),
        'ComparePages'              => array( 'موازنہ_صفحات' ),
        'Confirmemail'              => array( 'تصدیق_ڈاک' ),
        'Contributions'             => array( 'شراکتیں' ),
@@ -77,15 +78,15 @@ $specialPageAliases = array(
        'Import'                    => array( 'درآمدگی' ),
        'Invalidateemail'           => array( 'ڈاک_تصدیق_منسوخ' ),
        'JavaScriptTest'            => array( 'تجربہ_جاوا_اسکرپٹ' ),
-       'BlockList'                 => array( 'فہرست_ممنوع،_فہرست_دستور_شبکی_ممنوع' ),
+       'BlockList'                 => array( 'فہرست_ممنوع', 'فہرست_دستور_شبکی_ممنوع' ),
        'LinkSearch'                => array( 'تلاش_روابط' ),
        'Listadmins'                => array( 'فہرست_منتظمین' ),
        'Listbots'                  => array( 'فہرست_روبہ_جات' ),
-       'Listfiles'                 => array( 'فہرست_املاف،_فہرست_تصاویر' ),
-       'Listgrouprights'           => array( 'فہرست_اختیارات_گروہ،_صارفی_گروہ_اختیارات' ),
+       'Listfiles'                 => array( 'فہرست_املاف', 'فہرست_تصاویر' ),
+       'Listgrouprights'           => array( 'فہرست_اختیارات_گروہ', 'صارفی_گروہ_اختیارات' ),
        'Listredirects'             => array( 'فہرست_رجوع_مکررات' ),
        'Listusers'                 => array( 'فہرست_صارفین،_صارف_فہرست' ),
-       'Log'                       => array( 'نوشتہ،_نوشتہ_جات' ),
+       'Log'                       => array( 'نوشتہ', 'نوشتہ_جات' ),
        'Lonelypages'               => array( 'یتیم_صفحات' ),
        'Longpages'                 => array( 'طویل_صفحات' ),
        'MergeHistory'              => array( 'ضم_تاریخچہ' ),
@@ -94,7 +95,7 @@ $specialPageAliases = array(
        'Mypage'                    => array( 'میرا_صفحہ' ),
        'Mytalk'                    => array( 'میری_گفتگو' ),
        'Myuploads'                 => array( 'میرے_زبراثقالات' ),
-       'Newimages'                 => array( 'جدید_املاف،_جدید_تصاویر' ),
+       'Newimages'                 => array( 'جدید_املاف', 'جدید_تصاویر' ),
        'Newpages'                  => array( 'جدید_صفحات' ),
        'PermanentLink'             => array( 'مستقل_ربط' ),
        'Popularpages'              => array( 'مقبول_صفحات' ),
@@ -102,7 +103,7 @@ $specialPageAliases = array(
        'Prefixindex'               => array( 'اشاریہ_سابقہ' ),
        'Protectedpages'            => array( 'محفوظ_صفحات' ),
        'Protectedtitles'           => array( 'محفوظ_عناوین' ),
-       'Randompage'                => array( 'تصادف،_تصادفی_مقالہ' ),
+       'Randompage'                => array( 'تصادف', 'تصادفی_مقالہ' ),
        'Randomredirect'            => array( 'تصادفی_رجوع_مکرر' ),
        'Recentchanges'             => array( 'حالیہ_تبدیلیاں' ),
        'Recentchangeslinked'       => array( 'متعلقہ_تبدیلیاں' ),
@@ -112,12 +113,12 @@ $specialPageAliases = array(
        'Specialpages'              => array( 'خصوصی_صفحات' ),
        'Statistics'                => array( 'شماریات' ),
        'Uncategorizedcategories'   => array( 'غیر_زمرہ_بند_زمرہ_جات' ),
-       'Uncategorizedimages'       => array( 'غیر_زمرہ_بند_املاف،_غیر_زمرہ_بند_تصاویر' ),
+       'Uncategorizedimages'       => array( 'غیر_زمرہ_بند_املاف', 'غیر_زمرہ_بند_تصاویر' ),
        'Uncategorizedpages'        => array( 'غیر_زمرہ_بند_صفحات' ),
        'Uncategorizedtemplates'    => array( 'غیر_زمرہ_بند_سانچے' ),
        'Undelete'                  => array( 'بحال' ),
        'Unusedcategories'          => array( 'غیر_مستعمل_زمرہ_جات' ),
-       'Unusedimages'              => array( 'غیر_مستعمل_املاف،_غیر_مستعمل_تصاویر' ),
+       'Unusedimages'              => array( 'غیر_مستعمل_املاف', 'غیر_مستعمل_تصاویر' ),
        'Unusedtemplates'           => array( 'غیر_مستعمل_سانچے' ),
        'Unwatchedpages'            => array( 'نادیدہ_صفحات' ),
        'Upload'                    => array( 'زبراثقال' ),
@@ -127,7 +128,7 @@ $specialPageAliases = array(
        'Version'                   => array( 'اخراجہ' ),
        'Wantedcategories'          => array( 'مطلوب_زمرہ_جات' ),
        'Wantedfiles'               => array( 'مطلوب_املاف' ),
-       'Wantedpages'               => array( 'مطلوب_صفحات،_شکستہ_روابط' ),
+       'Wantedpages'               => array( 'مطلوب_صفحات', 'شکستہ_روابط' ),
        'Wantedtemplates'           => array( 'مطلوب_سانچے' ),
        'Watchlist'                 => array( 'زیر_نظر_فہرست' ),
        'Whatlinkshere'             => array( 'یہاں_کس_کا_رابطہ' ),
@@ -139,9 +140,11 @@ $magicWords = array(
        'notoc'                     => array( '0', '_فہرست_نہیں_', '__NOTOC__' ),
        'toc'                       => array( '0', '__فہرست__', '__TOC__' ),
        'noeditsection'             => array( '0', '__ناتحریرقسم__', '__NOEDITSECTION__' ),
+       'pagename'                  => array( '1', 'نام_صفحہ', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'نام_فضا', 'NAMESPACE' ),
        'msg'                       => array( '0', 'پیغام:', 'MSG:' ),
-       'subst'                     => array( '0', 'نقل:', 'SUBST:' ),
-       'safesubst'                 => array( '0', 'محفوظ_نقل:', 'SAFESUBST:' ),
+       'subst'                     => array( '0', 'جا:', 'نقل:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'محفوظ_جا:', 'محفوظ_نقل:', 'SAFESUBST:' ),
        'img_thumbnail'             => array( '1', 'تصغیر', 'thumbnail', 'thumb' ),
        'img_right'                 => array( '1', 'دائیں', 'right' ),
        'img_left'                  => array( '1', 'بائیں', 'left' ),
@@ -186,9 +189,6 @@ $messages = array(
 'tog-shownumberswatching' => 'دیکھنے والے صارفین کی تعداد دکھاؤ',
 'tog-oldsig' => 'موجودہ دستخط:',
 'tog-fancysig' => '(سادہ دستخط بلا خودکار ربط)',
-'tog-externaleditor' => 'ہمیشہ بیرونی تدوین کار استعمال کرو (صرف ماہرین کیلئے، اِس کیلئے شمارندہ پر خاص ترتیبات درکار ہوتی ہیں۔
-[//www.mediawiki.org/wiki/Manual:External_editors مزید معلومات.])',
-'tog-externaldiff' => '',
 'tog-showjumplinks' => 'Enable "jump to" accessibility links',
 'tog-uselivepreview' => 'براہِ راست نمائش استعمال کرو (JavaScript چاہئے نیز تجرباتی)',
 'tog-forceeditsummary' => 'جب میں ترمیمی خلاصہ خالی چھوڑوں تو مجھے آگاہ کرو',
@@ -201,6 +201,7 @@ $messages = array(
 'tog-ccmeonemails' => 'دیگر صارفین کو ارسال کردہ برقی خطوط کی نقول مجھے ارسال کریں۔',
 'tog-diffonly' => 'مختلفات کے نیچے صفحے کی مشمولات مت دکھاؤ',
 'tog-showhiddencats' => 'پوشیدہ زمرہ جات دکھاؤ',
+'tog-useeditwarning' => 'خبردار مجھے جب میں غیر محفوظ کردہ تبدیلیوں کے ساتھ ایک ترمیم کے صفحے کو چھوڑ دو',
 
 'underline-always' => 'ہمیشہ',
 'underline-never' => 'کبھی نہیں',
@@ -539,7 +540,10 @@ Warning: Page may not contain recent updates.',
 آپ گمنام طور پر {{SITENAME}}  کا استعمال جاری رکھ سکتے ہیں، یا دوبارہ اسی نام یا مختلف نام سے <span class='plainlinks'>[$1 دوبارہ داخلِ نوشتہ]</span> بھی ہو سکتے ہیں۔  یہ یاد آوری کرلیجیۓ کہ کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے ، جب تک آپ اپنے متصفح کا ابطن صاف نہ کردیں۔",
 'yourname' => 'اسمِ رکنیت',
 'yourpassword' => 'کلمۂ شناخت',
+'createacct-yourpassword-ph' => 'ایک پاس ورڈ داخل کریں',
 'yourpasswordagain' => 'کلمۂ شناخت دوبارہ لکھیں',
+'createacct-yourpasswordagain' => 'کلمۂ اجازت تصدیق کریں',
+'createacct-yourpasswordagain-ph' => 'پاس ورڈ پھر داخل کریں',
 'remembermypassword' => 'اِس متصفح پر میرے داخلِ نوشتگی معلومات یاد رکھو (زیادہ سے زیادہ $1 {{PLURAL:$1|دِن|ایام}} کیلئے)',
 'yourdomainname' => 'آپکا ڈومین',
 'password-change-forbidden' => 'آپ اس ویکی پر پارلفظ (پاس روڈ) تبدیل نہیں کر سکتے',
@@ -558,12 +562,25 @@ Warning: Page may not contain recent updates.',
 'gotaccount' => "پہلے سے کھاتہ بنا ہوا ہے? '''$1'''.",
 'gotaccountlink' => 'داخل ہوجائیے',
 'userlogin-resetlink' => 'داخلِ نوشتہ ہونے کی تفاصیل بھول گئے ہیں؟',
+'createacct-join' => 'اپنی معلومات نیچے لکھیں۔',
+'createacct-emailrequired' => 'ای میل پتہ',
+'createacct-emailoptional' => 'ای میل ایڈریس (اختیاری)',
+'createacct-email-ph' => 'اپنا برقی پتہ لکھیں',
 'createaccountmail' => 'بذریعۂ برقی ڈاک',
+'createacct-realname' => 'اصلی نام (اختیاری)',
 'createaccountreason' => 'وجہ:',
+'createacct-reason' => 'وجہ',
+'createacct-captcha' => 'حفاظتی تدبیر',
+'createacct-imgcaptcha-ph' => 'آپ اوپر دیکھ متن داخل کریں',
+'createacct-benefit-heading' => '{{SITENAME}} آپ جیسے لوگوں کی طرف سے بنایا گیا ہے ۔',
+'createacct-benefit-body1' => 'ترمیم',
+'createacct-benefit-body2' => 'صفحات',
+'createacct-benefit-body3' => 'شرکت کرنے والے اس ماہ کے',
 'badretype' => 'درج شدہ کلمۂ شناخت اصل سے مطابقت نہیں رکھتا۔',
 'userexists' => 'داخل کردہ اسم صارف پہلے سے مستعمل ہے۔
 براہِ کرم! کوئی دوسرا اسم منتخب کیجئے۔',
 'loginerror' => 'داخلے میں غلطی',
+'createacct-error' => 'تخلیق کھاتہ میں نقص',
 'createaccounterror' => 'کھاتہ $1 بنایا نہیں جاسکا',
 'nocookiesnew' => 'کھاتۂ صارف بنادیا گیا ہے، لیکن آپ کا داخلہ نہیں ہوا.
 صارفین کے داخلہ کیلئے {{SITENAME}} کوکیز استعمال کرتا ہے.
@@ -944,10 +961,6 @@ $1",
 آپ فی الحال گوگل کے ذریعے تلاش کرسکتے ہیں.
 یاد رکھئے کہ اُن کے {{SITENAME}} اشاریے ممکناً پرانے ہوسکتے ہیں.',
 
-# Quickbar
-'qbsettings' => 'فوری‌بار',
-'qbsettings-none' => 'ہیچ',
-
 # Preferences page
 'preferences' => 'ترجیحات',
 'mypreferences' => 'میری ترجیہات',
@@ -1567,6 +1580,9 @@ $1 × $2 عکصر (پکسلز)، حجم ملف: $3، MIME قسم: $4',
 'ilsubmit' => 'تلاش',
 'bydate' => 'بالحاظ تاریخ',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'weeks' => '{{PLURAL:$1|$1ہفتہ| $1  ہفتے}}',
+
 # Bad image list
 'bad_image_list' => 'شکلبند درج ذیل ہے:
 
index 668fca2..e7dba1f 100644 (file)
@@ -53,7 +53,7 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#YONALTIRISH', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#YOʻNALTIRISH', '#YONALTIRISH', '#REDIRECT' ),
        'notoc'                     => array( '0', '__ICHIDAGILARYOQ__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__GALEREYAYOQ__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__ICHIDAGILARMAJBURIY__', '__FORCETOC__' ),
@@ -89,6 +89,10 @@ $magicWords = array(
        'numberofedits'             => array( '1', 'OZGARISHSONI', 'NUMBEROFEDITS' ),
        'numberofviews'             => array( '1', 'KORISHSONI', 'NUMBEROFVIEWS' ),
        'pagename'                  => array( '1', 'SAHIFANOMI', 'PAGENAME' ),
+       'namespace'                 => array( '1', 'NOMFAZO', 'NAMESPACE' ),
+       'gender'                    => array( '0', 'JINS', 'GENDER:' ),
+       'currentweek'               => array( '1', 'JORIYHAFTA', 'CURRENTWEEK' ),
+       'language'                  => array( '0', '#TIL:', '#LANGUAGE:' ),
        'numberofadmins'            => array( '1', 'ADMINISTRATORSONI', 'NUMBEROFADMINS' ),
        'special'                   => array( '0', 'maxsus', 'special' ),
        'tag'                       => array( '0', 'yorliq', 'tag' ),
@@ -113,7 +117,7 @@ $messages = array(
 'tog-usenewrc' => 'Yangi oʻzgarishlar va kuzatuv roʻyxatidagi sahifalarni guruhlarga boʻlish (JavaScript orqali)',
 'tog-numberheadings' => 'Sarlavhalarni avtomatik raqamlash',
 'tog-showtoolbar' => 'Tahrirlash asboblari joylashgan yoʻlakchani koʻrsatish (JavaScript orqali)',
-'tog-editondblclick' => 'Sichqoncha tugmasini ikki martagina bosib tahrirlashni boshlash',
+'tog-editondblclick' => 'Sichqoncha tugmasini ikki marta bosish orqali tahrirlashni boshlash',
 'tog-editsection' => '[tahrir] havolasini har bir boʻlim boshida koʻrsatish',
 'tog-editsectiononrightclick' => 'Boʻlim sarlavhasiga sichqonchaning oʻng tugmasi bilan bosib tahrirlashni boshlash',
 'tog-showtoc' => 'Mundarijani koʻrsatish (3 tadan koʻproq sarlavha bor sahifalarda)',
@@ -126,16 +130,14 @@ $messages = array(
 'tog-previewontop' => 'Tahrir oynasi tepasida koʻrib chiqish',
 'tog-previewonfirst' => 'Tahrirlashga oʻtiboq koʻrib chiqishni boshlash',
 'tog-nocache' => 'Brauzer sahifalarni kesh xotirasida saqlamasin',
-'tog-enotifwatchlistpages' => 'Kuzatuv roʻyxatimdagi sahifa yoki fayllar oʻzgartirilsa, e-pochtamga bu haqda xat yuborilsin',
-'tog-enotifusertalkpages' => 'Munozara sahifam oʻzgartirilsa, e-pochtamga bu haqda xat yuborilsin',
+'tog-enotifwatchlistpages' => 'Kuzatuv roʻyxatimdagi sahifa yoki fayllar oʻzgartirilsa, menga bu haqda xat yuborilsin',
+'tog-enotifusertalkpages' => 'Munozara sahifam oʻzgartirilsa, menga bu haqda xat yuborilsin',
 'tog-enotifminoredits' => 'Kichik tahrir qilinsa ham e-pochtamga bu haqda xat yuborilsin',
 'tog-enotifrevealaddr' => 'Xabar beruvchi xatlarda e-pochta manzilim koʻrsatilsin',
 '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-externaleditor' => 'Sukut boʻyicha tashqi tahrirlash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors Batafsil])',
-'tog-externaldiff' => 'Sukut boʻyicha tashqi taqqoslash dasturidan foydalanish (faqat mutaxassislar uchun, kompyuteringizda maxsus moslamalar boʻlishi zarur. [//www.mediawiki.org/wiki/Manual:External_editors Batafsil])',
-'tog-showjumplinks' => 'yordamchi "tez oʻtish" havolalarini yoqish',
+'tog-showjumplinks' => 'Yordamchi «tez oʻtish» havolalarini yoqish',
 'tog-uselivepreview' => 'Tez koʻrib chiqish (JavaScript orqali) (sinovda)',
 'tog-forceeditsummary' => 'Qisqa tavsif oynasi toʻldirilmagani haqida ogohlantirish koʻrsatilsin',
 'tog-watchlisthideown' => 'Oʻz tahrirlarim kuzatuv roʻyxatimda koʻrsatilmasin',
@@ -144,11 +146,12 @@ $messages = array(
 'tog-watchlisthideliu' => 'Tizimga kirgan foydalanuvchilar tahrirlari kuzatuv roʻyxatimda koʻrsatilmasin',
 'tog-watchlisthideanons' => 'Anonim foydalanuvchilar tahrirlari kuzatuv roʻyxatimda koʻrsatilmasin',
 'tog-watchlisthidepatrolled' => 'Tekshirilgan tahrirlar kuzatuv roʻyxatimda koʻrsatilmasin',
-'tog-ccmeonemails' => 'Boshqa ishtirokchilarga yozgan xatimning nusxasi oʻzimning e-pochtamga joʻnatilsin.',
+'tog-ccmeonemails' => 'Boshqa ishtirokchilarga yozgan xatimning nusxasi oʻzimga yuborilsin',
 'tog-diffonly' => 'Versiyalar taqqoslanayotganda, pastda sahifa matni koʻrsatilmasin',
 'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsatish',
 'tog-noconvertlink' => "Sarlavhaga aylantirish dastagini o'chirib qo'yish",
-'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosini koʻrsatish kerak emas',
+'tog-norollbackdiff' => 'Tahrir qaytarilganda, versiyalar taqqosi koʻrsatilmasin',
+'tog-useeditwarning' => 'Kiritgan oʻzgarishlarimni saqlamay sahifadan chiqib ketayotganim haqida ogohlantirilsin',
 
 'underline-always' => 'Har doim',
 'underline-never' => 'Hech qachon',
@@ -363,8 +366,8 @@ $1',
 'badaccess-groups' => "So'ralgan amallarni kamida $1 {{PLURAL:$2|guruhi|guruhlari}} foydalanuvchilarigina amalga oshirishi mumkin.",
 
 'versionrequired' => '$1 versiyasidagi MediaWiki talab etiladi',
-'versionrequiredtext' => "Ushbu sahifani bilan ishlash uchun $1 versiyasidagi MediaWiki talab etiladi.
-[[Special:Version|Dasturiy ta'minot haqida axborot]]ni ko'ring.",
+'versionrequiredtext' => 'Bu sahifada ishlash uchun MediaWikining $1-versiyasi talab etiladi.
+[[Special:Version|Dasturiy taʼminot haqida axborot]]ni koʻring.',
 
 'ok' => 'OK',
 'retrievedfrom' => ' "$1" dan olindi',
@@ -403,14 +406,14 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Maqola',
-'nstab-user' => 'Foydalanuvchi sahifasi',
+'nstab-user' => 'Foydalanuvchi',
 'nstab-media' => 'Media sahifasi',
 'nstab-special' => 'Maxsus sahifa',
-'nstab-project' => 'Loyiha sahifasi',
+'nstab-project' => 'Vikipediya',
 'nstab-image' => 'Fayl',
 'nstab-mediawiki' => 'Xabar',
 'nstab-template' => 'Andoza',
-'nstab-help' => 'Yordam sahifasi',
+'nstab-help' => 'Yordam',
 'nstab-category' => 'Turkum',
 
 # Main script and global functions
@@ -427,13 +430,13 @@ $1',
 'internalerror_info' => 'Ichki xato: $1',
 'badtitle' => 'Notoʻgʻri sarlavha',
 'viewsource' => 'Manbasini koʻrish',
-'viewsource-title' => "$1 sahifasining manbasini ko'rish",
+'viewsource-title' => '$1 sahifasining manbasini koʻrish',
 'actionthrottled' => "Tezlik bo'yicha cheklov",
-'protectedpagetext' => 'Bu sahifa tahrirlashdan saqlanish maqsadida qulflangan.',
+'protectedpagetext' => 'Bu sahifa tahrirlash va boshqa oʻzgartirishlar kiritishdan himoyalangan.',
 'viewsourcetext' => 'Siz bu sahifaning manbasini koʻrishingiz va uni nusxasini olishingiz mumkin:',
-'editinginterface' => "'''Diqqat:''' Siz dasturiy ta'minot interfeysi matni mavjud bo'lgan sahifani tahrirlamoqdasiz.
-Uning o'zgartirilishi ushbu vikidagi boshqa foydalanuvchilar uchun ham interfeysning tashqi ko'rinishiga ta'sir qiladi.
-Ushbu xabar tarjimasini qo'shish yoki o'zgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] lokalizatsiya saytidan foydalaning.",
+'editinginterface' => "'''Diqqat:''' Siz dasturiy taʼminot interfeysi matni mavjud boʻlgan sahifani tahrirlamoqdasiz.
+Uning oʻzgartirilishi ushbu vikidagi boshqa foydalanuvchilar uchun ham interfeys oʻzgarishiga olib keladi.
+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.',
@@ -452,7 +455,7 @@ Ushbu xabar tarjimasini qo'shish yoki o'zgartirish uchun, iltimos, MediaWikining
 {{SITENAME}} saytidan anonim holda foydalanishda davom etishindiz mumkin. Yoki siz yana hozirgi yoki boshqa foydalanuvchi nomi bilan qaytadan tizimga kirishingiz mumkin.
 Shuni e'tiborga olingki, ayrim sahifalar siz brauzeringiz keshini tozalamaguningizga qadar xuddi tizimga kirganingizdagidek ko'rinishda davom etaverishi mumkin.",
 'yourname' => 'Foydalanuvchi nomi',
-'yourpassword' => 'Maxfiy soʻz',
+'yourpassword' => 'Maxfiy soʻz:',
 'yourpasswordagain' => 'Maxfiy so‘zni qayta kiriting:',
 'remembermypassword' => 'Hisob ma’lumotlarim ushbu brauzerda eslab qolinsin (ko‘pi bilan $1 {{PLURAL:$1|kunga|kunga}})',
 'securelogin-stick-https' => "Kirgandan keyin HTTPS bo'yicha ulanishni davom ettirish",
@@ -487,7 +490,7 @@ Ism yozilishini tekshirib koʻring.',
 'wrongpasswordempty' => "Iltimos, bo'sh bo'lmagan maxfiy so'z kiriting.",
 'mailmypassword' => "Elektron pochta orqali yangi maxfiy so'zni jo'natish",
 'passwordremindertitle' => "{{SITENAME}} uchun vaqtinchalik yangi maxfiy so'z",
-'emailauthenticated' => 'Sizning e-mail manzilingiz $2, $3 da tasdiqlangan.',
+'emailauthenticated' => 'Sizning elektron pochta manzilingiz $2, $3 da tasdiqlangan.',
 'emailconfirmlink' => 'Sizning elektron pochta manzilingizni tasdiqlash',
 'emaildisabled' => 'Bu sayt elektron pochta xatlarini yubora olmaydi.',
 'accountcreated' => 'Hisob yozuvi yaratildi',
@@ -555,7 +558,7 @@ Vaqtinchalik maxfiy so'z: $2",
 'summary-preview' => "Tavsif shunday bo'ladi:",
 'subject-preview' => "Sarlavha shunday bo'ladi:",
 'blockedtitle' => 'Foydalanuvchi chetlashtirildi',
-'blockedtext' => "'''Siz (foydalanuvchi ismingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
+'blockedtext' => "'''Siz (foydalanuvchi nomingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
 
 Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
 
@@ -564,7 +567,7 @@ Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
 * Chetlashtirish maqsadi: $7
 
 Siz $1 yoki boshqa [[{{MediaWiki:Grouppage-sysop}}|administrator]] bilan bogʻlanib, arz qilishingiz mumkin.
-You 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.
+Siz «foydalanuvchiga maktub» xizmatidan foydalana olmaysiz, agarda: a) shaxsiy moslamalaringizda haqiqiy e-pochta manzilingiz koʻrsatilmagan yoki tasdiqlanmagan boʻlsa, b) chetlatish shartlarida bu xizmat toʻsilgan boʻlsa.
 Sizning hozirgi IP manzilingiz - $3, chetlashtirish raqamingiz - #$5. Arizaga bularni ilova qilishingiz mumkin.",
 'blockednoreason' => "sabab ko'rsatilmadi",
 'whitelistedittext' => "Siz sahifalarni o'zgartirish uchun $1.",
@@ -604,7 +607,7 @@ Siz shuningdek bu yozganlaringiz sizniki yoki erkin litsenziya ostida ekanligini
 Bundan tashqari, siz ushbu ma'lumotlarni o'zingiz yozgan bo'lishingiz yoki ruxsat berilgan internet manzilidan yoki shu kabi erkin resursdan nusxa olgan bo'lishingiz lozim (Qo'shimcha ma'lumotlar uchun $1 sahifasiga murojaat qiling).
 '''MUALLIFLIK HUQUQI QO'YILGAN ISHLARNI RUXSATSIZ BU YERGA JOYLASHTIRMANG!'''",
 'templatesused' => 'Ushbu sahifada foydalanilgan {{PLURAL:$1|andoza|andozalar}}:',
-'templatesusedpreview' => "Ushbu ko'rib chiqilayotgan sahifada foydalanilgan {{PLURAL:$1|andoza|andozalar}}:",
+'templatesusedpreview' => 'Ushbu sahifada foydalanilgan {{PLURAL:$1|andoza|andozalar}}:',
 'templatesusedsection' => "Ushbu bo'limda foydalanilgan {{PLURAL:$1|andoza|andozalar}}:",
 'template-protected' => '(himoyalangan)',
 'template-semiprotected' => '(yarim-himoyalangan)',
@@ -615,7 +618,7 @@ Ortga qaytib, mavjud sahifani tahrirlashingiz yoki [[Special:UserLogin|tizimga k
 'sectioneditnotsupported-title' => "Bo'limlarni tahrirlash imkoniyati yo'q",
 'sectioneditnotsupported-text' => "Ushbu sahifada bo'limlarni tahrirlash imkoniyati yo'q.",
 'permissionserrors' => 'Ruxsat huquqida xato',
-'permissionserrorstext-withaction' => "Sizda quyidagi {{PLURAL:$1|sabab|sabablar}}ga ko'ra '''$2'''ga ruxsat mavjud emas:",
+'permissionserrorstext-withaction' => "Sizda quyidagi {{PLURAL:$1|sabab|sabablar}}ga koʻra '''$2'''ga ruxsat mavjud emas:",
 'recreate-moveddeleted-warn' => "'''Diqqat: Siz avval yoʻqotilgan sahifani yana yaratmoqchisiz.'''
 
 Bu sahifani yaratishda davom etishdan avval uning nega avval yoʻqotilgani bilan qiziqib koʻring.
@@ -712,7 +715,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 # Search results
 'searchresults' => 'Qidiruv natijalari',
 'searchresults-title' => '"$1" uchun qidiruv natijalari',
-'searchresulttext' => "{{SITENAME}}da qidirish haqida qo'shimcha ma'lumotga ega bo'lishini xoxlasangiz, [[{{MediaWiki:Helppage}}|{{SITENAME}}da qidiruv]] sahifasini o'qing.",
+'searchresulttext' => '{{SITENAME}}da qidirish haqida qoʻshimcha maʼlumot olish uchun [[{{MediaWiki:Helppage}}|yordam]] sahifasiga qarang.',
 'searchsubtitle' => '\'\'\'[[:$1]]\'\'\'ni qidirdingiz ([[Special:Prefixindex/$1|"$1" bilan boshlanadigan sahifalar]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"ga bogʻlangan sahifalar]])',
 'searchsubtitleinvalid' => "'''$1'''ni qidirdingiz",
 'toomanymatches' => "Juda ko'p o'xshashliklar topildi, iltimos, boshqa so'rov bilan urinib ko'ring",
@@ -733,9 +736,9 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Ushbu prefiks mavjud bo'lgan sahifalarni ko'rsatish]]",
 'searchprofile-articles' => 'Asosiy sahifalar',
 'searchprofile-project' => 'Yordam va loyiha sahifalari',
-'searchprofile-images' => 'Multimediya',
+'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Har yerda',
-'searchprofile-advanced' => "Qo'shimcha",
+'searchprofile-advanced' => 'Kengaytirilgan',
 'searchprofile-articles-tooltip' => '$1da qidirish',
 'searchprofile-project-tooltip' => '$1da qidirish',
 'searchprofile-images-tooltip' => 'Fayllarni qidir',
@@ -769,18 +772,10 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'powersearch-togglenone' => 'Hech qaysini',
 'search-external' => 'Tashqi qidiruv',
 
-# Quickbar
-'qbsettings' => 'Saytda harakatlanish darchasi',
-'qbsettings-none' => "Ko'rsatmaslik",
-'qbsettings-fixedleft' => "Qo'zg'almas chap",
-'qbsettings-fixedright' => "Qo'zg'almas o'ng",
-'qbsettings-floatingleft' => 'Suzuvchi chap',
-'qbsettings-floatingright' => "Suzuvchi o'ng",
-
 # Preferences page
 'preferences' => 'Moslamalar',
 'mypreferences' => 'Moslamalarim',
-'prefs-edits' => 'Tahrirlar soni',
+'prefs-edits' => 'Tahrirlar soni:',
 'prefsnologin' => "Siz tizimda o'zingizni tanitmadingiz",
 'changepassword' => 'Maxfiy soʻzni oʻzgartirish',
 'prefs-skin' => 'Tashqi ko‘rinishi',
@@ -798,7 +793,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'prefs-watchlist-edits-max' => 'Eng katta son: 1000',
 'prefs-misc' => 'Boshqa moslamalar',
 'prefs-resetpass' => 'Maxfiy soʻzni oʻzgartirish',
-'prefs-changeemail' => 'E-mail manzilingizni o‘zgartirish',
+'prefs-changeemail' => 'Elektron pochta manzilini oʻzgartirish',
 'prefs-email' => 'Elektron pochta moslamalari',
 'prefs-rendering' => 'Tashqi ko‘rinishi',
 'saveprefs' => 'Saqlash',
@@ -810,10 +805,12 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'columns' => 'Ustunlar soni:',
 'searchresultshead' => 'Qidiruv',
 'resultsperpage' => 'Sahifaga topilgan yozuvlar miqdori',
-'stub-threshold' => '<a href="#" class="stub">Tayyorlanmaga havolalar</a>ni rasmiylashtirish uchun boshlash ostonasi (baytlarda).',
+'stub-threshold' => '<a href="#" class="stub">Chala maqolalarga ishorat</a> keltirish uchun pastki chegara (baytlarda):',
 'stub-threshold-disabled' => "O'chirib qo'yilgan",
-'recentchangesdays-max' => 'Eng koʻpi $1 kun',
-'recentchangescount' => 'Sukut boʻyicha koʻrsatiladigan tahrirlar soni',
+'recentchangesdays' => 'Necha kunlik tahrirlar koʻrsatiladi:',
+'recentchangesdays-max' => 'Eng koʻpi — $1 kun',
+'recentchangescount' => 'Sukut boʻyicha koʻrsatiladigan tahrirlar soni:',
+'prefs-help-recentchangescount' => 'Yangi oʻzgarishlar, tarix va qaydlar uchun.',
 'savedprefs' => 'Sizning moslamalaringiz saqlandi.',
 'timezonelegend' => 'Vaqt mintaqangiz:',
 'localtime' => 'Mahalliy vaqt:',
@@ -836,38 +833,38 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'prefs-searchoptions' => 'Qidiruv',
 'prefs-namespaces' => 'Nomfazolar',
 'defaultns' => 'Aks holda quyidagi nomfazolardan qidirish:',
-'default' => "boshlang'ich",
+'default' => 'Sukut boʻyicha',
 'prefs-files' => 'Fayllar',
 'prefs-custom-css' => 'Shaxsiy CSS',
 'prefs-custom-js' => 'Shaxsiy JavaScript',
-'prefs-common-css-js' => "Barcha tashqi ko'rinishlar uchun umumiy CSS/JavaScript:",
+'prefs-common-css-js' => 'Umumiy CSS/JavaScript (barcha tashqi koʻrinishlar uchun):',
 'prefs-emailconfirm-label' => 'Elektron pochta manzilini tasdiqlash:',
 'prefs-textboxsize' => 'Tahrir oynasining oʻlchami',
 'youremail' => 'E-mail:',
 'username' => 'Foydalanuvchi nomi',
 'uid' => 'Identifikator:',
 'prefs-memberingroups' => 'Qaysi {{PLURAL:$1|guruh|guruhlar}} aʼzosi:',
-'prefs-registration' => 'Hisob ochilgan vaqt',
+'prefs-registration' => 'Hisob yaratilgan vaqt:',
 'yourrealname' => 'Haqiqiy ism *:',
 'yourlanguage' => 'Til:',
-'yourvariant' => 'Tarkib tili varianti',
-'prefs-help-variant' => "Viki sahifalari matnini tasvirlash uchun ma'qul ko'rilgan til varianti",
-'yournick' => 'Yangi imzo',
-'prefs-help-signature' => 'Munozara sahifalarida imzo "<nowiki>~~~~</nowiki>" orqali qoʻyiladi (u sizning imzoingiz va joriy vaqtga aylantiriladi).',
+'yourvariant' => 'Yozuv turi (lotin/kirill):',
+'prefs-help-variant' => 'Ushbu vikidagi sahifalar qaysi tilda va yozuvda koʻrsatilishi.',
+'yournick' => 'Yangi imzo:',
+'prefs-help-signature' => 'Munozara sahifalarida imzo "<nowiki>~~~~</nowiki>" orqali qoʻyiladi, u sizning imzoingiz va joriy vaqtga aylantiriladi.',
 'yourgender' => 'Jinsi:',
 'gender-unknown' => 'Koʻrsatilmagan',
 'gender-male' => 'Erkak',
 'gender-female' => 'Ayol',
-'prefs-help-gender' => "Ixtiyoriy: Foydalanuvching jinsiga bog'liq bo'lgan loyihaning ayrim xabarlarida foydalaniladi.
-Ushbu axborot ommaviy xususiyatga ega bo'ladi.",
+'prefs-help-gender' => 'Koʻrsatilishi majburiy emas: taʼminot xizmatining foydalanuvchi jinsiga qarab yuboradigan ayrim xabarlarida foydalaniladi.
+Bu maʼlumot hammaga koʻrsatiladi.',
 'email' => 'E-mail:',
 'prefs-help-realname' => "Haqiqiy ism (ixtiyoriy maydon).
 Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini ko'rsatish uchun foydalaniladi.",
-'prefs-help-email' => "Elektron pochta manzilini ko'rsatish majburiy emas, lekin u siz maxfiy so'zni unutib qo'ysangiz kerak bo'lishi mumkin.",
-'prefs-help-email-others' => "U shuningdek, sizning elektron pochtangiz manzilini oshkora qilmasdan, boshqa ishtirokchilar bilan shaxsiy sahifangiz orqali bog'lanish imkonini ham beradi.",
+'prefs-help-email' => 'Elektron pochta manzilini koʻrsatish majburiy emas, lekin u siz maxfiy soʻzni unutib qoʻysangiz kerak boʻladi.',
+'prefs-help-email-others' => 'Shuningdek, u boshqa foydalanuvchilarga Siz bilan shaxsiy sahifangiz yoki munozara sahifangizdagi havola orqali bogʻlanish imkonini beradi. Bunda Siz bilan bogʻlanmoqchi boʻlgan foydalanuvchiga pochta manzilingiz koʻrsatilmaydi.',
 'prefs-help-email-required' => 'E-mail manzilni koʻrsatish shart emas',
 'prefs-info' => 'Asosiy maʼlumot',
-'prefs-i18n' => 'Internatsionallashtirish',
+'prefs-i18n' => 'Baynalmilallashtirish',
 'prefs-signature' => 'Imzo',
 'prefs-dateformat' => 'Sana formati',
 'prefs-timeoffset' => 'Vaqt farqi',
@@ -933,9 +930,9 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 # Recent changes
 'nchanges' => "$1 {{PLURAL:$1|o'zgarish|o'zgarishlar}}",
 'recentchanges' => 'Yangi oʻzgarishlar',
-'recentchanges-legend' => 'Yangi tahrirlar moslamalari',
-'recentchanges-summary' => 'Bu sahifada siz oxirgi oʻzgarishlarni koʻrishingiz mumkin.',
-'recentchanges-feed-description' => "Vikida mazkur oqimdagi oxirgi o'zgarishlarni kuzatish",
+'recentchanges-legend' => 'Yangi oʻzgarishlar moslamalari',
+'recentchanges-summary' => 'Bu sahifada siz oxirgi oʻzgarishlarni koʻrishingiz mumkin',
+'recentchanges-feed-description' => 'Vikida mazkur oqimdagi oxirgi oʻzgarishlarni kuzatish',
 'recentchanges-label-newpage' => 'Bu tahrir orqali yangi sahifa yaratildi',
 'recentchanges-label-minor' => 'Bu kichik tahrir',
 'recentchanges-label-bot' => 'Bu tahrirni bot bajardi',
@@ -948,15 +945,16 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'rcshowhideliu' => 'Ro‘yxatdan o‘tgan foydalanuvchilar: $1 ta',
 'rcshowhideanons' => 'Anonim foydalanuvchilar: $1 ta',
 'rcshowhidepatr' => 'Tekshirilgan tahrirlarni $1',
-'rcshowhidemine' => "O'z tahrirlarimni $1",
+'rcshowhidemine' => 'Oʻz tahrirlarimni $1',
 'rclinks' => 'Oxirgi $2 kun ichida sodir boʻlgan $1 oʻzgarishlar koʻrsatildi.<br />$3',
 'diff' => 'farq',
 'hist' => 'tarix',
-'hide' => 'Yashirish',
-'show' => 'koʻrsatish',
+'hide' => 'Yashir',
+'show' => 'Koʻrsat',
 'minoreditletter' => 'k',
 'newpageletter' => 'Y',
 'boteditletter' => 'b',
+'newsectionsummary' => '/* $1 */ yangi mavzu',
 'rc-enhanced-expand' => 'Tasfilotlarni koʻrsatish (JavaScript talab qilinadi)',
 'rc-enhanced-hide' => 'Tafsilotlolarni yashirish',
 'rc-old-title' => 'dastlab "$1" sifatida yaratilgan',
@@ -1044,7 +1042,18 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 
 # Statistics
 'statistics' => 'Statistika',
+'statistics-header-pages' => 'Sahifalar statistikasi',
+'statistics-header-edits' => 'Tahrirlar statistikasi',
 'statistics-header-users' => 'Foydalanuvchilar statistikasi',
+'statistics-articles' => 'Maqolalar',
+'statistics-pages' => 'Sahifalar',
+'statistics-pages-desc' => 'Ushbu vikidagi barcha sahifalar, jumladan munozara, yoʻnaltirish va hk.',
+'statistics-files' => 'Yuklangan fayllar',
+'statistics-edits' => '{{SITENAME}} qurilganidan beri qilingan tahrirlar',
+'statistics-edits-average' => 'Sahifa boshiga tahrirlar',
+'statistics-users' => 'Qayd etilgan [[Special:ListUsers|foydalanuvchilar]]',
+'statistics-users-active' => 'Faol foydalanuvchilar',
+'statistics-users-active-desc' => 'Oxirgi $1 kun ichida kamida bitta amal qilgan foydalanuvchilar',
 
 'disambiguationspage' => '{{ns:template}}:Disambig',
 
@@ -1082,6 +1091,7 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'speciallogtitlelabel' => 'Moʻljal (nom yoki foydalanuvchi):',
 'log' => 'Qaydlar',
 'all-logs-page' => 'Barcha ochiq qaydlar',
+'logempty' => 'Qaydnomada mos keladigan yozuvlar mavjud emas.',
 'log-title-wildcard' => 'Shu matndan boshlanuvchi sarlavhalarni izlash',
 
 # Special:AllPages
@@ -1174,7 +1184,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Watchlist
 'watchlist' => 'Kuzatuv roʻyxatim',
 'mywatchlist' => 'Kuzatuv roʻyxatim',
-'watchlistfor2' => '$1 $2 uchun',
+'watchlistfor2' => '$1 uchun $2',
 'nowatchlist' => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
 'watchnologin' => "Siz tizimda o'zingizni tanishtirmadingiz",
 'addwatch' => "Kuzatuv ro'yxatiga qo'shish",
@@ -1330,7 +1340,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 # Namespace form on various pages
 'namespace' => 'Nomfazo:',
 'invert' => 'Tanlash tartibini almashtirish',
-'namespace_association' => "Bog'liq nomfazo",
+'namespace_association' => 'Bogʻliq nomfazo',
 'blanknamespace' => '(asosiy)',
 
 # Contributions
@@ -1338,7 +1348,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'contributions-title' => '{{GENDER:$1|Foydalanuvchi}} $1 hissasi',
 'mycontris' => 'Hissam',
 'contribsub2' => '$1 uchun ($2)',
-'nocontribs' => "Belgilangan shartlarga muvofiq o'zgarishlar topilmadi",
+'nocontribs' => 'Belgilangan shartlarga muvofiq oʻzgarishlar topilmadi',
 'uctop' => '(oxirgi)',
 'month' => 'Oydan (va avvalroq)',
 'year' => 'Yildan (va avvalroq)',
@@ -1354,7 +1364,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'sp-contributions-userrights' => 'foydalanuvchining huquqlarini boshqarish',
 'sp-contributions-search' => 'Hissalarni qidirish',
 'sp-contributions-username' => 'IP-manzil yoki foydalanuvchi nomi:',
-'sp-contributions-toponly' => "Faqat oxirgi versiya hisoblangan tahrirlarni ko'rsatish",
+'sp-contributions-toponly' => 'Faqat oxirgi deb hisoblangan tahrirlarni koʻrsat',
 'sp-contributions-submit' => 'Qidirish',
 
 # What links here
@@ -1431,7 +1441,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'contribslink' => 'hissa',
 'emaillink' => 'e-maktub jo‘natish',
 'blocklogpage' => 'Chetlatish qaydlari',
-'blocklogentry' => '$2 davrga [[$1]]ni chetlashtirdi $3',
+'blocklogentry' => '$2 muddatga [[$1]]ni chetlashtirdi $3',
 'block-log-flags-nocreate' => 'hisob ochish toʻxtatilgan',
 'block-log-flags-nousertalk' => "o'zining munozara sahifasini tahrirlay olmaydi",
 'proxyblocksuccess' => 'Bajarildi.',
@@ -1442,11 +1452,13 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'movearticle' => 'Sahifani qayta nomlash',
 'movenologin' => 'Siz tizimga kirmagansiz',
 'newtitle' => 'Yangi nom:',
+'move-watch' => 'Ushbu sahifani kuzatuv roʻyxatiga qoʻshish',
 'movepagebtn' => 'Sahifani koʻchirish',
 'pagemovedsub' => 'Sahifa qayta nomlandi',
 'movepage-moved' => '\'\'\'"$1" nomli sahifa "$2" nomli sahifaga koʻchirildi\'\'\'',
 'movepage-moved-redirect' => 'Qayta yo‘naltirish yaratildi.',
 'movedto' => 'quyidagiga qayta nomlandi',
+'movetalk' => 'Mos munozara sahifasini qayta nomlash',
 'movelogpage' => 'Koʻchirish qaydlari',
 'movesubpage' => '{{PLURAL:$1|Ostsahifa|Ostsahifalar}}',
 'movesubpagetext' => 'Ushbu sahifada $1 {{PLURAL:$1| ta ostsahifa}} mavjud.',
@@ -1498,10 +1510,10 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'tooltip-pt-anonlogin' => "Bu majburiyat bo'lmasada, kirishingiz taklif qilinadi.",
 'tooltip-pt-logout' => 'Chiqish',
 'tooltip-ca-talk' => 'Sahifa matni borasida munozara',
-'tooltip-ca-edit' => "Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldim ko'rib chiqish tugmasidan foydalaning.",
+'tooltip-ca-edit' => 'Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldin koʻrib chiqish tugmasidan foydalaning',
 'tooltip-ca-addsection' => 'Yangi boʻlim ochish',
 'tooltip-ca-viewsource' => 'Bu sahifa himoyalangan. Siz uning manbasini koʻrishingiz mumkin.',
-'tooltip-ca-history' => 'Bu sahifaning oldingi versiyalari.',
+'tooltip-ca-history' => 'Bu sahifaning oʻzgarishlar tarixi',
 'tooltip-ca-protect' => 'Bu sahifani himoyalash',
 'tooltip-ca-unprotect' => "Ushbu sahifaning himoyasini o'zgaritish",
 'tooltip-ca-delete' => 'Ushbu sahifani o‘chirish',
@@ -1531,14 +1543,14 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'tooltip-t-print' => 'Ushbu sahifaning bosma uchun versiyasi',
 'tooltip-t-permalink' => 'Sahifaning ushbu versiyasiga doimiy ishorat',
 'tooltip-ca-nstab-main' => 'Sahifani ko‘rish',
-'tooltip-ca-nstab-user' => "Foydalanuvchi sahifasini ko'rish",
-'tooltip-ca-nstab-media' => "Media sahifasini ko'rish",
+'tooltip-ca-nstab-user' => 'Foydalanuvchi sahifasini koʻrish',
+'tooltip-ca-nstab-media' => 'Media sahifasini koʻrish',
 'tooltip-ca-nstab-special' => 'Bu maxsus sahifa, uni tahrirlay olmaysiz.',
-'tooltip-ca-nstab-project' => "Loyiha sahifasini ko'rish",
-'tooltip-ca-nstab-image' => "Rasm sahifasini ko'rish",
-'tooltip-ca-nstab-mediawiki' => "Tizim xabarini ko'rish",
+'tooltip-ca-nstab-project' => 'Loyiha sahifasini koʻrish',
+'tooltip-ca-nstab-image' => 'Rasm sahifasini koʻrish',
+'tooltip-ca-nstab-mediawiki' => 'MediaWiki tizimining xabarini koʻrish',
 'tooltip-ca-nstab-template' => 'Andozani koʻrish',
-'tooltip-ca-nstab-help' => "Yordam sahifasini ko'rish",
+'tooltip-ca-nstab-help' => 'Yordam sahifasini koʻrish',
 'tooltip-ca-nstab-category' => 'Turkum sahifasini koʻrish',
 'tooltip-minoredit' => 'Kichik o‘zgartirish sifatida belgilash',
 'tooltip-save' => 'Oʻzgarishlarni saqlash',
@@ -1564,12 +1576,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'pageinfo-redirectsto' => 'Qayta yoʻnaltirish',
 
 # Skin names
-'skinname-standard' => 'Klassik',
-'skinname-nostalgia' => "Sog'inch",
-'skinname-cologneblue' => "Kyolncha sog'inch",
-'skinname-myskin' => "O'zimniki",
-'skinname-chick' => "Jo'ja",
-'skinname-simple' => 'Oddiy',
+'skinname-cologneblue' => 'Kyolncha sogʻinch',
 'skinname-modern' => 'Zamonaviy',
 'skinname-vector' => 'Vektor',
 
@@ -1598,7 +1605,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'metadata-expand' => 'Batafsil axborotni koʻrsatish',
 'metadata-collapse' => 'Batafsil axborotni yashirish',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Eni',
 'exif-imagelength' => 'Boʻyi',
 'exif-artist' => 'Muallif',
@@ -1678,7 +1685,7 @@ Umumiy omborda [[:$1]] mavjud. Faylning bu nomga qayta nomlanishi faylning umumi
 'specialpages' => 'Maxsus sahifalar',
 
 # Special:Tags
-'tag-filter' => '[[Special:Tags|nishonlar]] filtri:',
+'tag-filter' => '[[Special:Tags|Nishonlar]] filtri:',
 
 # HTML forms
 'htmlform-reset' => 'Oʻzgarishlarni bekor qilish',
index 1b20b2f..4e05e33 100644 (file)
@@ -13,6 +13,7 @@
  * @author Frigotoni
  * @author GatoSelvadego
  * @author Kaganer
+ * @author Nemo bis
  * @author Nick1915
  * @author Omnipaedista
  * @author OrbiliusMagister
@@ -185,8 +186,6 @@ $messages = array(
 '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-externaleditor' => "Dopara par default un editor de testo esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
-'tog-externaldiff' => "Dopara par default un programa de diff esterno (soło par utenti esperti. Richiede l'uxo de inpostasion particołari sol proprio computer)",
 'tog-showjumplinks' => 'Ativa i cołegamenti acesibiłi "va a"',
 'tog-uselivepreview' => 'Ativa ła funsion "Line preview" (el dimanda JavaScript; sperimentałe)',
 'tog-forceeditsummary' => "Chiedi conferma se l'ozeto de ła modifega el xé vodo",
@@ -200,6 +199,7 @@ $messages = array(
 'tog-diffonly' => 'No visuałisar el contenuo de ła pajina dopo el confronto tra version',
 'tog-showhiddencats' => 'Mostra łe categorie sconte',
 'tog-norollbackdiff' => 'No mostrare el confronto tra version dopo aver efetuà on rollback',
+'tog-useeditwarning' => 'Dime se sto lassando na pagina de modifica sensa aver salvà',
 
 'underline-always' => 'Senpre',
 'underline-never' => 'Mai',
@@ -569,9 +569,18 @@ Ocio che serte pagine podarìa èssar che ti 'e vedi come se te fussi 'ncora dre
 'welcomecreation-msg' => 'El to nome utente el xe stà creà.
 Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SITENAME}}]].',
 'yourname' => 'Nome utente:',
+'userlogin-yourname' => 'Nome utente',
+'userlogin-yourname-ph' => 'Inserissi el to nome utente',
 'yourpassword' => 'Password:',
+'userlogin-yourpassword' => 'Password',
+'userlogin-yourpassword-ph' => 'Inserisi ła to password',
+'createacct-yourpassword-ph' => 'Inserisi na password',
 'yourpasswordagain' => 'De novo la password:',
+'createacct-yourpasswordagain' => 'Conferma la password',
+'createacct-yourpasswordagain-ph' => 'Inserissi da novo la password',
 'remembermypassword' => 'Tiente in mente la password su sto conputer (par un massimo de $1 {{PLURAL:$1|zorno|zorni}})',
+'userlogin-remembermypassword' => 'Tienme colegà',
+'userlogin-signwithsecure' => 'Entra con na conesion segura',
 'securelogin-stick-https' => 'Resta tacà par HTTPS dopo èssar entrà',
 'yourdomainname' => 'Spesifegare el dominio',
 'password-change-forbidden' => 'Nó xe posibiłe canbiar ła password so sta wiki.',
@@ -584,18 +593,38 @@ Nó desmentegarte de personałixare łe [[Special:Preferences|prefarense de {{SI
 'logout' => 'Và fora',
 'userlogout' => 'và fora',
 'notloggedin' => 'No te sì entrà col to nome utente',
+'userlogin-noaccount' => 'Gheto mia na utensa?',
+'userlogin-joinproject' => 'Unìssete a {{SITENAME}}',
 'nologin' => "No te sito gnancora iscrito? '''$1'''.",
 'nologinlink' => 'Falo desso',
 'createaccount' => 'Crea un utente novo',
 'gotaccount' => "Sito zà iscrito? '''$1'''.",
 'gotaccountlink' => 'Entra',
 'userlogin-resetlink' => "Desmentegà i to dati d'aceso?",
+'userlogin-resetpassword-link' => 'Reinposta la to password',
+'helplogin-url' => 'Help:Login',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuto col login]]',
+'createacct-join' => 'Meti le to informassion qua soto.',
+'createacct-emailrequired' => 'Indirisso e-mail',
+'createacct-emailoptional' => 'Indiriso e-mail (opsionałe)',
+'createacct-email-ph' => 'Inserissi el to indirizo de e-mail',
 'createaccountmail' => 'Dopara na password caxuałe tenporanea e inviała al indiriso e-mail spesifegà cuà soto',
+'createacct-realname' => 'Nome reale (opsionale)',
 'createaccountreason' => 'Motivassion:',
+'createacct-reason' => 'Motivo',
+'createacct-reason-ph' => "Com'èla te sì drio crear n'altra utensa",
+'createacct-captcha' => 'Controlo de sicuresa',
+'createacct-imgcaptcha-ph' => 'Inserissi el testo che te vedi de sora',
+'createacct-submit' => 'Crea la to utensa',
+'createacct-benefit-heading' => '{{SITENAME}} xe fato da gente come ti.',
+'createacct-benefit-body1' => '$1 {{PLURAL:$1|contributo|contributi}}',
+'createacct-benefit-body2' => '$1 {{PLURAL:$1|pàxena|pàxene}}',
+'createacct-benefit-body3' => '{{PLURAL:$1|contributor recente|contributori recenti}}',
 'badretype' => 'Le do password le xe difarenti.',
 'userexists' => 'El nome utente inserido vien xa doparà da cualchedun altro.
 Prova co un nome utente difarente.',
 'loginerror' => "Erore ne l'aceso",
+'createacct-error' => "Eror durante la creasion de l'utensa",
 'createaccounterror' => "No se pole crear l'utente: $1",
 'nocookiesnew' => "Ła rejistrasion xè sta conpletà, ma no xè sta posibiłe asedare a {{SITENAME}} parché i cookie i xè disativai. Riprovare l'aceso con el nome utente e ła password pena creai dopo aver ativà i cookie nel proprio browser.",
 'nocookieslogin' => "L'aceso a {{SITENAME}} richiede l'uso de i cookie, che i risulta disativai. Riprovare l'aceso dopo aver ativà i cookie nel proprio browser.",
@@ -627,7 +656,9 @@ Se no te sì mìa stà ti a far la domanda, opure t\'è vegnù in mente la passw
 Par piaser, fà subito un login \'pena che la te riva.',
 'blocked-mailpassword' => 'Per prevegner abusi, no se pol mìa doparar la funzion "Invia nova password" da un indirizo IP blocà.',
 'eauthentsent' => "Na email de conferma la xè stà invià a l'indirizzo che te ghè indicà. Prima che qualunque altra mail te vegna invià, te ghè da seguir le istrussioni contegnùe ne la mail ricevuta, par confermar che quel'indirizzo el xè dal bon el tuo.",
-'throttled-mailpassword' => 'Na password nova la xe zà stà mandà da manco de {{PLURAL:$1|$1 ora|$1 ore}}. Par prevegner abusi, la funzion "Invia nova password" la pol èssar doparà solo na volta ogni {{PLURAL:$1|$1 ora|$1 ore}}.',
+'throttled-mailpassword' => 'Na password nova la xe zà stà mandà da manco de {{PLURAL:$1|$1 ora|$1 ore}}. 
+
+Par prevegner abusi, se pol farse mandar na password nova solo na volta ogni {{PLURAL:$1|$1 ora|$1 ore}}.',
 'mailerror' => "Ghe xè stà un eror nel mandare l'email: $1",
 'acct_creation_throttle_hit' => "Dei utenti de sta wiki col to stesso indirisso IP i gà creà {{PLURAL:$1|1 utensa|$1 utense}} ne l'ultimo zorno, che xe el massimo consentìo in sto periodo de tenpo. Perciò, i utenti che dòpara sto indirisso IP no i pode crear altre utense par el momento.",
 'emailauthenticated' => "El to indirisso de e-mail l'è stado autenticado su $2 el $3.",
@@ -674,13 +705,13 @@ Spèta un tocheto prima de proàr da novo.',
 'resetpass-wrong-oldpass' => 'Password corente o tenporanea mia valida.
 Forse te ghè zà canbià la to password o te ghè domandà na password tenporanea nova.',
 'resetpass-temp-password' => 'Password tenporanea:',
+'resetpass-abort-generic' => "La modifica de la password la xe sta anulà da un'estension.",
 
 # Special:PasswordReset
 'passwordreset' => 'Rinposta ła password',
-'passwordreset-text' => 'Conpleta sto moduło par riçevare i detaji del to account via posta ełetronega.',
 'passwordreset-legend' => 'Rinposta ła password',
 'passwordreset-disabled' => 'Ła rinpostasion deła password xe stà dixabiłità so sto projeto wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1|| Inserisi una dełe porsion de dati cua soto}}',
+'passwordreset-emaildisabled' => 'Le funsionalità de posta eletrònega le xe stà disabilità su sta wiki.',
 'passwordreset-username' => 'Nome utente:',
 'passwordreset-domain' => 'Dominio',
 'passwordreset-capture' => 'Vixuałixare el contenuto del mesajo de posta ełetronega?',
@@ -692,22 +723,20 @@ Forse te ghè zà canbià la to password o te ghè domandà na password tenporan
 $2
 
 {{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.
-Sarì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 dei to detaji del profiło par {{SITENAME}} ($4). {{PLURAL:$3|El profiło utente asocià|I profiłi utenti asociadi}} a sto indiriso de posta ełetronega łi xe:
+Sarì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:
 
 $2
 
 {{PLURAL:$3|Sta password tenporanea ła scadarà|Ste password tenporanee łe scadarà}} dopo {{PLURAL:$5|un dì|$5 dì}}.
-Sarì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.",
+Sarì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
 Password tenporanea: $2',
-'passwordreset-emailsent' => 'Xe stà invià on promemoria via posta eletronega.',
-'passwordreset-emailsent-capture' => 'Xe stà invià un promemoria via posta eletronega: el contegù xe riportà cuà de seguito.',
-'passwordreset-emailerror-capture' => "Xe stà generà el promemoria riportà cuà de seguito. L'invio al utente no xe riusido: $1",
+'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",
 
 # Special:ChangeEmail
 'changeemail' => 'Canbia indiriso de posta ełetronega',
@@ -914,6 +943,8 @@ La esiste de zà.',
 'content-failed-to-parse' => "Inposibiłe anałixare $2 pa'l modèl $1: $3",
 'invalid-content-data' => 'Dati contegnui nó vałidi',
 'content-not-allowed-here' => 'Contegnùo in "$1" nó consentio inte ła pàjina [[$2]]',
+'editwarning-warning' => 'Se te vè via da sta pagina te podaressi pèrdar tute le modìfeghe che te ghè fato.
+Se te sì loggà, te poli disabilitar sto aviso in te la sezion "{{int:prefs-editing}} de le to preferense.',
 
 # Content models
 'content-model-wikitext' => 'wikitesto',
@@ -1172,7 +1203,7 @@ I detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-interwiki-default' => 'Risultati da $1:',
 'search-interwiki-more' => '(altro)',
 'search-relatedarticle' => 'Ligà',
-'mwsuggest-disable' => 'Disabilita sugerimenti AJAX',
+'mwsuggest-disable' => 'Disabilita sugerimenti de riserca',
 'searcheverything-enable' => 'Serca in tuti quanti i namespace',
 'searchrelated' => 'ligà',
 'searchall' => 'tuti',
@@ -1192,15 +1223,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'powersearch-togglenone' => 'Nissun',
 'search-external' => 'Riserca esterna',
 'searchdisabled' => 'La riserca interna de {{SITENAME}} no la xe ativa; par intanto te pol proár a doparar un motore de riserca esterno come Google. (Nota però che i contenuti de {{SITENAME}} presenti in sti motori i podarìa èssar mìà agiornà.)',
-
-# Quickbar
-'qbsettings' => 'Settaggio barra menu',
-'qbsettings-none' => 'Nessun',
-'qbsettings-fixedleft' => 'Fisso a sinistra',
-'qbsettings-fixedright' => 'Fisso a destra',
-'qbsettings-floatingleft' => 'Fluttuante a sinistra',
-'qbsettings-floatingright' => 'Fluttuante a destra',
-'qbsettings-directionality' => 'Fiso, a seconda de ła diresion del testo nte ła to lengua',
+'search-error' => 'Se gà verifegà un eror durante la riserca: $1',
 
 # Preferences page
 'preferences' => 'Prefarense',
@@ -1342,6 +1365,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'userrights-notallowed' => 'No te ghe i parmesi necesari par xontarghe o cavarghe diriti ai utenti.',
 'userrights-changeable-col' => 'Grupi che te pol canbiar',
 'userrights-unchangeable-col' => 'Grupi che no te pol canbiar',
+'userrights-conflict' => 'Conflito de diriti utente! Aplica de novo le to modifiche.',
 
 # Groups
 'group' => 'Grupo:',
@@ -1738,7 +1762,6 @@ Par na major sicuressa, img_auth.php el xe disabilità.',
 'http-read-error' => 'Eror de letura HTTP.',
 'http-timed-out' => 'Richiesta HTTP scadùa.',
 'http-curl-error' => "Eror nel recupero de l'URL: $1",
-'http-host-unreachable' => 'URL mìa ragiungibile',
 'http-bad-status' => 'Ghe xe stà un problema durante la richiesta HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1892,6 +1915,12 @@ Probabilmente te vui modifegar ła descrision prexente inte ła [$2 pàjina de d
 Łe podaria dover puntar a na pàjina pì apropià.<br />
 Vien considerae pàjine de dixanbiguasion tute cuełe che łe ga drento i modełi elencai in [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'Pagine co na proprietà de pagina',
+'pageswithprop-legend' => 'Pagine co na proprietà de pagina',
+'pageswithprop-text' => 'Sta pagina la elenca le pagine che dòpara na particolare proprietà de pagina.',
+'pageswithprop-prop' => 'Nome proprietà:',
+'pageswithprop-submit' => 'Và',
+
 'doubleredirects' => 'Redirect dopi',
 'doubleredirectstext' => 'Sta pagina le elenca pagine che rimanda a altre pagine de rimando.
 Ogni riga la contien dei colegamenti al primo e al secondo rimando, oltre a la destinassion del secondo rimando, che de solito la xe la "vera" pagina de destinassion, a cui dovarìa pontar el primo rimando.
@@ -2140,8 +2169,8 @@ I futuri canbiamenti a sta pàjina e a ła so pàjina de discusion i vegnarà el
 'notvisiblerev' => 'La revision la xe stà scancelà',
 'watchnochange' => "Nissuna pagina tegnùa d'ocio la xe stà canbià nel periodo mostrà.",
 'watchlist-details' => "Te sì drio tegner d'ocio {{PLURAL:$1|una pagina (e la so pagina de discussion)|$1 pagine (e le so pagine de discussion)}}.",
-'wlheader-enotif' => 'Xe ativà la notifica via e-mail.',
-'wlheader-showupdated' => "Le pagine che xe stà canbià da la to ultima visita le xe segnà in '''grosso'''",
+'wlheader-enotif' => 'Xe ativà la notifica via e-mail.',
+'wlheader-showupdated' => "Le pagine che xe stà canbià da la to ultima visita le xe segnà in '''grosso'''",
 'watchmethod-recent' => 'controło de łe ultime modifeghe par i osservati speciałi',
 'watchmethod-list' => 'controło de i osservati speciałi par modifeghe recenti',
 'watchlistcontains' => 'La lista de i osservati speciałi la contien {{PLURAL:$1|una pagina|$1 pagine}}.',
@@ -2540,6 +2569,7 @@ Qua soto ghe xe el registro de le sopression:',
 'proxyblocksuccess' => 'Fatto.',
 'sorbsreason' => 'Sto indirizo IP el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.',
 'sorbs_create_account_reason' => 'No se pol crear acessi novi da sto indirizo IP parché el xe elencà come proxy verto ne la lista nera DNSBL doparà da {{SITENAME}}.',
+'xffblockreason' => "Un indiriso IP presente ne l'intestasion X-Forwarded-For, tuo o del server proxy che te sì drio doparar, el xe stà blocà. La motivasion originale del bloco la xe: $1",
 'cant-block-while-blocked' => 'No se pode blocar altri utenti finché se xe blocài.',
 'cant-see-hidden-user' => "L'utente che te vol blocar el xe zà stà blocà e sconto. Sicome a no te ghè mia i diriti de hideuser, no te pol mia védar o canbiar el bloco de l'utente.",
 'ipbblocked' => 'No te pui blocare o sblocare altri utenti, parché ti steso te si blocà',
@@ -2886,6 +2916,7 @@ Questo xe probabilmente dovùo a la presenza de un colegamento a un sito foresto
 'pageinfo-robot-noindex' => 'Mia indicizabile',
 'pageinfo-views' => 'Nùmaro de visite',
 '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',
 'pageinfo-subpages-name' => 'Sotopagine de sta pagina',
 'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|rimandi}}; $3 {{PLURAL:$3|no rimandi}})',
@@ -2989,11 +3020,25 @@ La so esecuzion la podarìa danegiar el to computer.",
 'minutes' => '{{PLURAL:$1|un minuto|$1 minuti}}',
 'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
 'days' => '{{PLURAL:$1|un zorno|$1 zorni}}',
+'weeks' => '{{PLURAL:$1|$1 stimana|$1 stimane}}',
 'months' => '{{PLURAL:$1|$1 mexe|$1 mexi}}',
 'years' => '{{PLURAL:$1|$1 ano|$1 ani}}',
 'ago' => '$1 fa',
 'just-now' => 'giusto desso',
 
+# Human-readable timestamps
+'hours-ago' => '$1 {{PLURAL:$1|ora|ore}} fa',
+'minutes-ago' => '$1 {{PLURAL:$1|minuto|minuti}} fa',
+'seconds-ago' => '$1 {{PLURAL:$1|secondo|secondi}} fa',
+'monday-at' => 'Luni a le $1',
+'tuesday-at' => 'Marti a le $1',
+'wednesday-at' => 'Mèrcore a le $1',
+'thursday-at' => 'Zòbia a le $1',
+'friday-at' => 'Vènere a le $1',
+'saturday-at' => 'Sabo a le $1',
+'sunday-at' => 'Doménega a le $1',
+'yesterday-at' => 'Jèri a le $1',
+
 # Bad image list
 'bad_image_list' => 'El formato xe sto qua:
 
@@ -3021,7 +3066,7 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Largheza',
 'exif-imagelength' => 'Alteza',
 'exif-bitspersample' => 'Bit par campione',
@@ -3199,7 +3244,7 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-originalimageheight' => "Altesa de l'imaxene prima che ła fuse tajà",
 'exif-originalimagewidth' => "Larghesa de l'imaxene prima che ła fuse tajà",
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'No conpresso',
 'exif-compression-2' => 'CCITT grupo 3 monodimensionałe - codifega run length de Huffman modifegà',
 'exif-compression-3' => 'Codifega fax CCITT Group 3',
@@ -3611,12 +3656,17 @@ Insieme co sto programa te dovaressi 'ver ricevùo na copia de la Licensa Public
 'version-entrypoints-header-entrypoint' => 'Punti de aceso',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Percorso de un file',
-'filepath-page' => 'Nome del file:',
-'filepath-submit' => 'Va',
-'filepath-summary' => 'Sta pagina speciale la restituìsse el percorso conpleto de un file.
-Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tipi de file vien avià diretamente el programa associà.',
+# Special:Redirect
+'redirect' => 'Rimando par file, utente, o ID de revision.',
+'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à',
+'redirect-lookup' => 'Ciave de riserca:',
+'redirect-value' => 'Valor:',
+'redirect-user' => 'ID utente',
+'redirect-revision' => 'Revision de la pagina',
+'redirect-file' => 'Nome del file',
+'redirect-not-exists' => 'Valor mia catà',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Riçerca dei file duplicà',
@@ -3706,23 +3756,26 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'htmlform-submit' => 'Manda',
 'htmlform-reset' => 'Scancèla modifiche',
 'htmlform-selectorother-other' => 'Altro',
+'htmlform-no' => 'No',
+'htmlform-yes' => 'Sì',
+'htmlform-chosen-placeholder' => 'Selessiona na opzione',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 con la possibilità de riserca completa nel testo',
 'sqlite-no-fts' => '$1 sensa la possibilità de riserca completa nel testo',
 
 # New logging system
-'logentry-delete-delete' => '$1 ga scansełà ła pajina $3',
-'logentry-delete-restore' => '$1 ga ripristinà "$3"',
-'logentry-delete-event' => '$1 ga canbià ła vixibiłità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
-'logentry-delete-revision' => '$1 ga canbià ła vixibiłità de {{PLURAL:$5|na revixion|$5 revixion}} de ła pajina"$3": $4',
-'logentry-delete-event-legacy' => '$1 ga canbià ła vixibiłità de calche asion del registro de "$3"',
-'logentry-delete-revision-legacy' => '$1 ga canbià ła vixibiłità par łe revixion de ła pajina $3',
-'logentry-suppress-delete' => '$1 ga sconto la pajina "$3"',
-'logentry-suppress-event' => '$1 ga canbià de scondón la vixibilità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
-'logentry-suppress-revision' => '$1 ga canbià de scondón la vixibilità de {{PLURAL:$5|na revixion|$5 revixion}} de "$3": $4',
-'logentry-suppress-event-legacy' => '$1 ga canbià de scondón la vixibilità de calche asion del registro de "$3"',
-'logentry-suppress-revision-legacy' => '$1 ga canbià de scondón la vixibilità de calche revixion de $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|el|la}} ga scansełà ła pajina $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|el|la}} ga ripristinà "$3"',
+'logentry-delete-event' => '$1 {{GENDER:$2|el|la}} ga canbià ła vixibiłità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|el|la}} ga canbià ła vixibiłità de {{PLURAL:$5|na revixion|$5 revixion}} de ła pajina"$3": $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2|el|la}} ga canbià ła vixibiłità de calche asion del registro de "$3"',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2|el|la}} ga canbià ła vixibiłità par łe revixion de ła pajina $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2|el|la}} ga sconto la pajina "$3"',
+'logentry-suppress-event' => '$1 {{GENDER:$2|el|la}} ga canbià de scondón la vixibilità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|el|la}} ga canbià de scondón la vixibilità de {{PLURAL:$5|na revixion|$5 revixion}} de "$3": $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|el|la}} ga canbià de scondón la vixibilità de calche asion del registro de "$3"',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2|el|la}} ga canbià de scondón la vixibilità de calche revixion de $3',
 'revdelete-content-hid' => 'contegnùo sconto',
 'revdelete-summary-hid' => 'ogeto de ła modifega sconto',
 'revdelete-uname-hid' => 'nome utente sconto',
@@ -3731,20 +3784,20 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'revdelete-uname-unhid' => 'nome utente ripristinà',
 'revdelete-restricted' => 'aplicà restrizioni ai aministradori',
 'revdelete-unrestricted' => 'gà cavà le limitazion par i aministradori',
-'logentry-move-move' => '$1 ga spostà ła pajina $3 a $4',
-'logentry-move-move-noredirect' => '$1 ga spostà ła pajina $3 a $4 sensa metare un rimando',
-'logentry-move-move_redir' => '$1 ga spostà ła pajina $3 a $4 lasiando un rimando',
-'logentry-move-move_redir-noredirect' => '$1 ga spostà la pajina $3 a $4 al posto de un rimando sensa metare un rimando',
-'logentry-patrol-patrol' => '$1 ga segnà la revixion $4 de la pajina $3 come verifegà',
-'logentry-patrol-patrol-auto' => '$1 ga segnà automategamente la revixion $4 de la pajina $3 come verifegà',
-'logentry-newusers-newusers' => "L'utensa $1 xe sta creà",
-'logentry-newusers-create' => "L'utensa $1 xe sta creà",
-'logentry-newusers-create2' => "L'utensa $3 xe sta creà da $1",
-'logentry-newusers-byemail' => "L'utensa $3 xe sta creà da $1 e ła password ła xe sta invià via e-mail",
-'logentry-newusers-autocreate' => "L'utensa $1 xè stà creà automategamente",
-'logentry-rights-rights' => "$1 ga canbià l'apartenensa de $3 dal grupo $4 al grupo $5",
-'logentry-rights-rights-legacy' => "$1 ga canbià l'apartenensa a grupi de $3",
-'logentry-rights-autopromote' => '$1 xe stà automategamente promoso/a da $4 a $5',
+'logentry-move-move' => '$1 {{GENDER:$2|el|la}} ga spostà ła pajina $3 a $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|el|la}} ga spostà ła pajina $3 a $4 sensa metare un rimando',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|el|la}} ga spostà ła pajina $3 a $4 lasandoghe un rimando',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|el|la}} ga spostà la pajina $3 a $4 al posto de un rimando sensa lasarghe un rimando',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|el|la}} ga segnà la revixion $4 de la pajina $3 come verifegà',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|el|la}} ga segnà automategamente la revixion $4 de la pajina $3 come verifegà',
+'logentry-newusers-newusers' => "L'utensa $1 xe sta {{GENDER:$2|creà}}",
+'logentry-newusers-create' => "L'utensa $1 xe sta {{GENDER:$2|creà}}",
+'logentry-newusers-create2' => "L'utensa $3 xe sta {{GENDER:$2|creà}} da $1",
+'logentry-newusers-byemail' => "L'utensa $3 xe sta {{GENDER:$2|creà}} da $1 e ła password ła xe sta invià par e-mail",
+'logentry-newusers-autocreate' => "L'utensa $1 xè stà {{GENDER:$2|creà}} automategamente",
+'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',
 'rightsnone' => '(nissun)',
 
 # Feedback
@@ -3819,4 +3872,7 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'duration-centuries' => '$1 {{PLURAL:$1|secolo|secoli}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenio|mileni}}',
 
+# Image rotation
+'rotate-comment' => 'Imagine girà de $1 {{PLURAL:$1|grado|gradi}} in senso orario',
+
 );
index 6647ce6..7ea0d96 100644 (file)
@@ -118,8 +118,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Ozutada niiden kävutajiden lugu, kudambad oma mülütanuded lehtpolen ičeze kaclendnimikirjutesihe',
 'tog-oldsig' => 'Nügüdläine allekirjutez',
 'tog-fancysig' => 'Ičeze allekirjutesen wiki-znamišt (avtomatižeta kosketuseta)',
-'tog-externaleditor' => 'Kävutada irdredaktor augotižjärgendusen mödhe (vaiše ekspertoiden täht; pidab järgeta specialižikš kompjuter; [//www.mediawiki.org/wiki/Manual:External_editors Enamb informacijad.])',
-'tog-externaldiff' => 'Kävutada irdredaktor augotižjärgendusen mödhe (vaiše ekspertoiden täht; pidab järgeta specialižikš kompjuter; [//www.mediawiki.org/wiki/Manual:External_editors Enamb informacijad.])',
 'tog-showjumplinks' => 'Ližata "hüpähtada..."-abukosketused',
 'tog-uselivepreview' => 'Kävutada hered ezikacund (JavaScript) (Eksperimentaline)',
 'tog-forceeditsummary' => 'Varutada, kunz toižetusen ümbrikirjutandan pöud ei ole täuttud',
@@ -974,14 +972,6 @@ Kävutagat prefiks ''all:'', miše ectä kaikes südäimištospäi (lodulehtpoli
 Tö voit nügüd' ectä Google'n turbiš.
 Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda vanhtunuden.",
 
-# Quickbar
-'qbsettings' => "Navigacijan panel'",
-'qbsettings-none' => 'Ala ozuta',
-'qbsettings-fixedleft' => 'Likumatoi huralpäi',
-'qbsettings-fixedright' => 'Likumatoi oiktalpäi',
-'qbsettings-floatingleft' => 'Ujui huralpäi',
-'qbsettings-floatingright' => 'Ujui oiktalpäi',
-
 # Preferences page
 'preferences' => 'Järgendused',
 'mypreferences' => 'Järgendused',
@@ -1409,7 +1399,6 @@ Ku problem jäb jäl'ghepäi-ki, säkat pagin [[Special:ListUsers/sysop|sistemad
 'http-read-error' => "HTTP'd lugemižen petuz.",
 'http-timed-out' => 'HTTP-he küzelendan aig om lopnus.',
 'http-curl-error' => "Petuz URL'ad ecmäs: $1",
-'http-host-unreachable' => 'Ei voi säta sidod URL:anke',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Ei voi säta sidod URL:anke',
@@ -1749,7 +1738,7 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
 'notanarticle' => "Nece ei ole lehtpol'",
 'notvisiblerev' => 'Versijad oma čutud',
 'watchlist-details' => "Teiden kaclendnimikirjuteses om {{PLURAL:$1|$1 lehtpol'|$1 lehtpol't}}. Lodulehtpoled ei olgoi neciš lugus.",
-'wlheader-enotif' => 'Tedotand e-počtadme om kävutamas.',
+'wlheader-enotif' => 'Tedotand e-počtadme om kävutamas.',
 'watchmethod-recent' => 'ozutadas kaceltud lehtpoliden tantoižed toižetused',
 'watchmethod-list' => 'kaceltud lehtpoliden kodvind tantoižid toižetusid ectes',
 'watchlistcontains' => "Teiden kaclendnimikirjuteses om $1 {{PLURAL:$1|lehtpol'|lehtpol't}}.",
@@ -2371,13 +2360,8 @@ Voib olda, necil lehtpolel om kosketuz irdsaitale, kudamb om mustas nimikirjutes
 'pageinfo-authors' => 'Erazvuiččiden avtoroiden lugu',
 
 # Skin names
-'skinname-standard' => 'Klassine',
-'skinname-nostalgia' => "Nostal'gii",
 'skinname-cologneblue' => "Köl'nan sinine",
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => 'Ičeze',
-'skinname-chick' => 'Cipuine',
-'skinname-simple' => 'Koveritoi',
 'skinname-modern' => "Nügüd'aigaine",
 
 # Patrolling
@@ -2453,8 +2437,6 @@ Jäl'ghižed kosketused siš-žo rives oma arvostadud kut erindad (lehtpoled, ku
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'hans',
@@ -2480,7 +2462,7 @@ Ku fail redaktiruidihe sändan polhe, erased parametrad voidas erineda nügüdl
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Leveduz',
 'exif-imagelength' => 'Korktuz’',
 'exif-bitspersample' => 'Mujun süvuz',
@@ -2612,7 +2594,7 @@ Ku fail redaktiruidihe sändan polhe, erased parametrad voidas erineda nügüdl
 'exif-label' => 'Arbaine',
 'exif-pngfilecomment' => 'Kommentarii PNG-failha',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Ahtištamatoi',
 
 'exif-unknowndate' => 'Tundmatoi dat',
@@ -2960,11 +2942,6 @@ Kävutagat normaline ezikacund.',
 'version-software-version' => 'Versii',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Te failannoks',
-'filepath-page' => 'Fail:',
-'filepath-submit' => 'Te',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ectä kaksitadud failad',
 'fileduplicatesearch-summary' => 'Ühtejiččiden failoiden ecmine niiden heš-kodan mödhe.',
index 3c65416..62bf24f 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Apple
  * @author Arisa
+ * @author Cheers!
  * @author DHN
  * @author Kaganer
  * @author Minh Nguyen
@@ -56,7 +57,7 @@ $namespaceAliases = array(
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'Người_dùng_tích_cực' ),
-       'Allmessages'               => array( 'Mọi_thông_báo' ),
+       'Allmessages'               => array( 'Mọi_thông_điệp', 'Mọi_thông_báo' ),
        'Allpages'                  => array( 'Mọi_bài' ),
        'Ancientpages'              => array( 'Trang_cũ' ),
        'Badtitle'                  => array( 'Tựa_đề_hỏng' ),
@@ -71,7 +72,7 @@ $specialPageAliases = array(
        'ComparePages'              => array( 'So_sánh_trang' ),
        'Confirmemail'              => array( 'Xác_nhận_thư' ),
        'Contributions'             => array( 'Đóng_góp' ),
-       'CreateAccount'             => array( 'Đăng_ký', 'Đăng_kí' ),
+       'CreateAccount'             => array( 'Mở_tài_khoản', 'Đăng_ký', 'Đăng_kí' ),
        'Deadendpages'              => array( 'Trang_đường_cùng' ),
        'DeletedContributions'      => array( 'Đóng_góp_bị_xóa', 'Đóng_góp_bị_xoá' ),
        'Disambiguations'           => array( 'Trang_định_hướng' ),
@@ -101,6 +102,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'Tìm_MIME' ),
        'Mostcategories'            => array( 'Thể_loại_lớn_nhất' ),
        'Mostimages'                => array( 'Tập_tin_liên_kết_nhiều_nhất' ),
+       'Mostinterwikis'            => array( 'Nhiều_liên_wiki_nhất', 'Nhiều_interwiki_nhất' ),
        'Mostlinked'                => array( 'Liên_kết_nhiều_nhất' ),
        'Mostlinkedcategories'      => array( 'Thể_loại_liên_kết_nhiều_nhất' ),
        'Mostlinkedtemplates'       => array( 'Bản_mẫu_liên_kết_nhiều_nhất', 'Tiêu_bản_liên_kết_nhiều_nhất' ),
@@ -112,18 +114,19 @@ $specialPageAliases = array(
        'Myuploads'                 => array( 'Tập_tin_tôi' ),
        'Newimages'                 => array( 'Tập_tin_mới', 'Hình_mới' ),
        'Newpages'                  => array( 'Trang_mới' ),
+       'PagesWithProp'             => array( 'Trang_theo_thuộc_tính' ),
        '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' ),
-       'Protectedtitles'           => array( 'Tựa_đề_bị_khóa' ),
+       'Protectedpages'            => array( 'Trang_khóa', 'Trang_khoá' ),
+       'Protectedtitles'           => array( 'Tựa_đề_bị_khóa', 'Tựa_đề_bị_khoá' ),
        'Randompage'                => array( 'Ngẫu_nhiên' ),
        'Randomredirect'            => array( 'Đổi_hướng_ngẫu_nhiên' ),
        'Recentchanges'             => array( 'Thay_đổi_gần_đây' ),
        'Recentchangeslinked'       => array( 'Thay_đổi_liên_quan' ),
-       'Revisiondelete'            => array( 'Xóa_phiên_bản' ),
+       'Revisiondelete'            => array( 'Xóa_phiên_bản', 'Xoá_phiên_bản' ),
        'Search'                    => array( 'Tìm_kiếm' ),
        'Shortpages'                => array( 'Trang_ngắn' ),
        'Specialpages'              => array( 'Trang_đặc_biệt' ),
@@ -144,7 +147,7 @@ $specialPageAliases = array(
        'UploadStash'               => array( 'Hàng_đợi_tải_lên' ),
        'Userlogin'                 => array( 'Đăng_nhập' ),
        'Userlogout'                => array( 'Đăng_xuất' ),
-       'Userrights'                => array( 'Quyền_thành_viên' ),
+       'Userrights'                => array( 'Quyền_thành_viên', 'Quyền_người_dùng' ),
        'Version'                   => array( 'Phiên_bản' ),
        'Wantedcategories'          => array( 'Thể_loại_cần_thiết' ),
        'Wantedfiles'               => array( 'Tập_tin_cần_thiết' ),
@@ -157,7 +160,7 @@ $specialPageAliases = array(
 
 $magicWords = array(
        'redirect'                  => array( '0', '#đổi', '#REDIRECT' ),
-       'notoc'                     => array( '0', '__KHÔNGMỤCMỤC__', '__NOTOC__' ),
+       'notoc'                     => array( '0', '__KHÔNGMỤCLỤC__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__KHÔNGALBUM__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__LUÔNMỤCLỤC__', '__FORCETOC__' ),
        'toc'                       => array( '0', '__MỤCLỤC__', '__TOC__' ),
@@ -191,6 +194,7 @@ $magicWords = array(
        'pagename'                  => array( '1', 'TÊNTRANG', 'PAGENAME' ),
        'pagenamee'                 => array( '1', 'TÊNTRANG2', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'KHÔNGGIANTÊN', 'NAMESPACE' ),
+       'namespacenumber'           => array( '1', 'SỐKHÔNGGIANTÊN', 'NAMESPACENUMBER' ),
        'talkspace'                 => array( '1', 'KGTTHẢOLUẬN', 'TALKSPACE' ),
        'subjectspace'              => array( '1', 'KGTNỘIDUNG', 'SUBJECTSPACE', 'ARTICLESPACE' ),
        'fullpagename'              => array( '1', 'TÊNTRANGĐỦ', 'FULLPAGENAME' ),
@@ -210,6 +214,13 @@ $magicWords = array(
        'img_framed'                => array( '1', 'khung', 'framed', 'enframed', 'frame' ),
        'img_page'                  => array( '1', 'trang=$1', 'trang $1', 'page=$1', 'page $1' ),
        'img_upright'               => array( '1', 'đứng', 'đứng=$1', 'đứng $1', 'upright', 'upright=$1', 'upright $1' ),
+       'img_baseline'              => array( '1', 'chân-chữ', 'baseline' ),
+       'img_sub'                   => array( '1', 'chỉ-số-dưới', 'sub' ),
+       'img_super'                 => array( '1', 'chỉ-số-trên', 'super', 'sup' ),
+       'img_top'                   => array( '1', 'trên', 'top' ),
+       'img_text_top'              => array( '1', 'trên-chữ', 'text-top' ),
+       'img_bottom'                => array( '1', 'dưới', 'bottom' ),
+       'img_text_bottom'           => array( '1', 'dưới-chữ', 'text-bottom' ),
        'img_link'                  => array( '1', 'liên_kết=$1', 'link=$1' ),
        'img_class'                 => array( '1', 'lớp=$1', 'class=$1' ),
        'int'                       => array( '0', 'NỘI:', 'INT:' ),
@@ -234,13 +245,23 @@ $magicWords = array(
        'revisionmonth'             => array( '1', 'THÁNGBẢN', 'REVISIONMONTH' ),
        'revisionmonth1'            => array( '1', 'THÁNGBẢN1', 'REVISIONMONTH1' ),
        'revisionyear'              => array( '1', 'NĂMBẢN', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'MỐCTHỜIGIANBẢN', 'DẤUTHỜIGIANBẢN', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'NGƯỜIDÙNGBẢN', 'REVISIONUSER' ),
        'plural'                    => array( '0', 'SỐNHIỀU:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'URLĐỦ:', 'FULLURL:' ),
+       'canonicalurl'              => array( '0', 'URLCHUẨN:', 'CANONICALURL:' ),
+       'lcfirst'                   => array( '0', 'CHỮĐẦUHOA:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', 'CHỮĐẦUTHƯỜNG:', 'UCFIRST:' ),
+       'lc'                        => array( '0', 'CHỮHOA:', 'LC:' ),
+       'uc'                        => array( '0', 'CHỮTHƯỜNG:', 'UC:' ),
        'displaytitle'              => array( '1', 'TÊNHIỂNTHỊ', 'DISPLAYTITLE' ),
        'newsectionlink'            => array( '1', '__LIÊNKẾTMỤCMỚI__', '__NEWSECTIONLINK__' ),
        'nonewsectionlink'          => array( '1', '__KHÔNGLIÊNKẾTMỤCMỚI__', '__NONEWSECTIONLINK__' ),
        'currentversion'            => array( '1', 'BẢNNÀY', 'CURRENTVERSION' ),
        'urlencode'                 => array( '0', 'MÃHÓAURL:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'MÃHÓANEO', 'ANCHORENCODE' ),
+       'currenttimestamp'          => array( '1', 'MỐCTHỜIGIANNÀY', 'DẤUTHỜIGIANNÀY', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'            => array( '1', 'MỐCTHỜIGIANĐỊAPHƯƠNG', 'DẤUTHỜIGIANĐỊAPHƯƠNG', 'LOCALTIMESTAMP' ),
        'language'                  => array( '0', '#NGÔNNGỮ:', '#LANGUAGE:' ),
        'contentlanguage'           => array( '1', 'NGÔNNGỮNỘIDUNG', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
        'pagesinnamespace'          => array( '1', 'CỠKHÔNGGIANTÊN:', 'CỠKGT:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
@@ -252,6 +273,8 @@ $magicWords = array(
        'hiddencat'                 => array( '1', '__THỂLOẠIẨN__', '__HIDDENCAT__' ),
        'pagesincategory'           => array( '1', 'CỠTHỂLOẠI', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesize'                  => array( '1', 'CỠTRANG', 'PAGESIZE' ),
+       'index'                     => array( '1', '__CHỈMỤC__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__KHÔNGCHỈMỤC__', '__NOINDEX__' ),
        'numberingroup'             => array( '1', 'CỠNHÓM', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__ĐỔIHƯỚNGNHẤTĐỊNH__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', 'MỨCKHÓA', 'MỨCKHOÁ', 'PROTECTIONLEVEL' ),
@@ -330,8 +353,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Hiển thị số người đang xem',
 'tog-oldsig' => 'Chữ ký hiện tại:',
 'tog-fancysig' => 'Xem chữ ký là mã wiki (không có liên kết tự động)',
-'tog-externaleditor' => 'Mặc định dùng trình soạn thảo bên ngoài (chỉ dành cho người thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
-'tog-externaldiff' => 'Mặc định dùng trình so sánh bên ngoài (chỉ dành cho người thành thạo, cần thiết lập đặc biệt trên máy tính của bạn; [//www.mediawiki.org/wiki/Manual:External_editors?uselang=vi chi tiết])',
 'tog-showjumplinks' => 'Bật liên kết “bước tới” trên đầu trang cho bộ trình duyệt thuần văn bản hay âm thanh',
 'tog-uselivepreview' => 'Xem thử trực tiếp (JavaScript; chưa ổn định)',
 'tog-forceeditsummary' => 'Nhắc tôi khi tôi quên tóm lược sửa đổi',
@@ -346,6 +367,7 @@ $messages = array(
 'tog-showhiddencats' => 'Hiển thị thể loại ẩn',
 'tog-noconvertlink' => 'Tắt liên kết chuyển đổi tựa đề',
 'tog-norollbackdiff' => 'Không so sánh sau khi lùi sửa',
+'tog-useeditwarning' => 'Cảnh báo khi tôi thoát trang sửa đổi mà chưa lưu trang',
 
 'underline-always' => 'Luôn luôn',
 'underline-never' => 'Không bao giờ',
@@ -409,6 +431,18 @@ $messages = array(
 'oct' => 'tháng 10',
 'nov' => 'tháng 11',
 'dec' => 'tháng 12',
+'january-date' => '$1 tháng 1',
+'february-date' => '$1 tháng 2',
+'march-date' => '$1 tháng 3',
+'april-date' => '$1 tháng 4',
+'may-date' => '$1 tháng 5',
+'june-date' => '$1 tháng 6',
+'july-date' => '$1 tháng 7',
+'august-date' => '$1 tháng 8',
+'september-date' => '$1 tháng 9',
+'october-date' => '$1 tháng 10',
+'november-date' => '$1 tháng 11',
+'december-date' => '$1 tháng 12',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Thể loại|Thể loại}}',
@@ -550,7 +584,7 @@ $1',
 'policy-url' => 'Project:Quy định và hướng dẫn',
 'portal' => 'Cộng đồng',
 'portal-url' => 'Project:Cộng đồng',
-'privacy' => 'Quy định quyền riêng tư',
+'privacy' => 'Quy định về quyền riêng tư',
 'privacypage' => 'Project:Quy định quyền riêng tư',
 
 'badaccess' => 'Lỗi về quyền truy cập',
@@ -711,9 +745,18 @@ Bạn có thể tiếp tục dùng {{SITENAME}} một cách vô danh, hoặc b
 'welcomecreation-msg' => 'Tài khoản của bạn đã được mở.
 Hãy nhớ thay đổi [[Special:Preferences|tùy chọn cá nhân {{SITENAME}}]] của bạn.',
 'yourname' => 'Tên người dùng:',
+'userlogin-yourname' => 'Tên đăng nhập',
+'userlogin-yourname-ph' => 'Nhập tên đăng nhập',
 'yourpassword' => 'Mật khẩu:',
+'userlogin-yourpassword' => 'Mật khẩu',
+'userlogin-yourpassword-ph' => 'Nhập mật khẩu',
+'createacct-yourpassword-ph' => 'Nhập vào mật khẩu',
 'yourpasswordagain' => 'Gõ lại mật khẩu',
+'createacct-yourpasswordagain' => 'Xác nhận lại mật khẩu',
+'createacct-yourpasswordagain-ph' => 'Nhập mật khẩu lần nữa',
 'remembermypassword' => 'Nhớ thông tin đăng nhập của tôi trên máy tính này (cho đến $1 ngày)',
+'userlogin-remembermypassword' => 'Giữ trạng thái đăng nhập',
+'userlogin-signwithsecure' => 'Sử dụng kết nối an toàn',
 'securelogin-stick-https' => 'Giữ kết nối với HTTPS sau khi đăng nhập',
 'yourdomainname' => 'Tên miền của bạn:',
 'password-change-forbidden' => 'Bạn không thể đổi mật khẩu trên wiki này.',
@@ -726,18 +769,38 @@ Hãy nhớ thay đổi [[Special:Preferences|tùy chọn cá nhân {{SITENAME}}]
 'logout' => 'Đăng xuất',
 'userlogout' => 'Đăng xuất',
 'notloggedin' => 'Chưa đăng nhập',
+'userlogin-noaccount' => 'Bạn chưa có tài khoản?',
+'userlogin-joinproject' => 'Tham gia {{SITENAME}}',
 'nologin' => "Bạn chưa có tài khoản ở đây? '''$1'''.",
 'nologinlink' => 'Mở tài khoản mới',
 'createaccount' => 'Mở tài khoản',
 'gotaccount' => "Đã mở tài khoản rồi? '''$1'''.",
 'gotaccountlink' => 'Đăng nhập',
 'userlogin-resetlink' => 'Quên mất thông tin đăng nhập?',
+'userlogin-resetpassword-link' => 'Đặt lại mật khẩu của bạn',
+'helplogin-url' => 'Help:Đăng nhập',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Trợ giúp đăng nhập]]',
+'createacct-join' => 'Nhập thông tin của bạn bên dưới.',
+'createacct-emailrequired' => 'Địa chỉ thư điện tử',
+'createacct-emailoptional' => 'Địa chỉ thư điện tử (tùy chọn)',
+'createacct-email-ph' => 'Nhập địa chỉ thư điện tử của bạn',
 'createaccountmail' => 'Sử dụng mật khẩu ngẫu nhiên tạm và gửi nó cho địa chỉ thư điện tử được chỉ định ở dưới',
+'createacct-realname' => 'Tên thật (tùy chọn)',
 'createaccountreason' => 'Lý do:',
+'createacct-reason' => 'Lý do',
+'createacct-reason-ph' => 'Nhập lý do tạo một tài khoản khác',
+'createacct-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-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.',
 'userexists' => 'Tên người dùng được nhập đã có người lấy.
 Hãy chọn một tên khác.',
 'loginerror' => 'Lỗi đăng nhập',
+'createacct-error' => 'Lỗi mở tài khoản',
 'createaccounterror' => 'Không thể mở tài khoản: $1',
 'nocookiesnew' => 'Bạn đã tạo tài khoản thành công, nhưng bạn chưa đăng nhập. {{SITENAME}} sử dụng cookie để đăng nhập vào tài khoản. Bạn đã tắt cookie. Xin hãy bật cookie lên, rồi đăng nhập lại với tên người dùng và mật khẩu mới.',
 'nocookieslogin' => '{{SITENAME}} sử dụng cookie để đăng nhập thành viên. Bạn đã tắt cookie. Xin hãy kích hoạt rồi thử lại.',
@@ -765,9 +828,9 @@ Nếu bạn không yêu cầu gửi mật khẩu mới, hoặc bạn đã nhớ
 'noemail' => 'Thành viên “$1” không ghi thư điện tử.',
 'noemailcreate' => 'Bạn cần cung cấp một địa chỉ thư điện tử hợp lệ',
 'passwordsent' => 'Mật khẩu mới đã được gửi tới thư điện tử của thành viên “$1”. Xin đăng nhập lại sau khi nhận thư.',
-'blocked-mailpassword' => 'Địa chỉ IP của bạn bị cấm không được sửa đổi, do đó cũng không được phép dùng chức năng phục hồi mật khẩu để tránh lạm dụng.',
+'blocked-mailpassword' => 'Địa chỉ IP của bạn bị cấm không được sửa đổi, do đó cũng không được phép dùng chức năng phục hồi mật khẩu để tránh sai phạm.',
 'eauthentsent' => 'Thư xác nhận đã được gửi. Trước khi dùng chức năng nhận thư, bạn cần thực hiện hướng dẫn trong thư xác nhận, để đảm bảo tài khoản thuộc về bạn.',
-'throttled-mailpassword' => 'Mật khẩu đã được gửi đến cho bạn trong vòng {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ trở lại. Để tránh lạm dụng, chỉ có thể gửi mật khẩu {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ một lần.',
+'throttled-mailpassword' => 'Mật khẩu đã được gửi đến cho bạn trong vòng {{PLURAL:$1|$1 giờ|$1 giờ}} đồng hồ trở lại. Để tránh lạm dụng, chỉ có thể gửi mật khẩu $1 giờ đồng hồ một lần.',
 'mailerror' => 'Lỗi gửi thư : $1',
 'acct_creation_throttle_hit' => 'Ai đó cùng [[địa chỉ IP]] với bạn đã mở {{PLURAL:$1|một tài khoản|$1 tài khoản}} ở đây trong vòng 24 giờ. Vì quy định hạn chế số tài khoản mở trên một địa chỉ IP nên bạn hiện không thể mở thêm được nữa dùng địa chỉ IP này.',
 'emailauthenticated' => 'Địa chỉ thư điện tử của bạn được xác nhận vào lúc $3 $2.',
@@ -813,13 +876,15 @@ Xin hãy đợi chốc lát rồi thử lại.',
 'resetpass-wrong-oldpass' => 'Mật khẩu tạm hoặc mật khẩu hiện thời không hợp lệ.
 Có thể bạn đã thay đổi thành công mật khẩu của mình hoặc đã yêu cầu cung cấp một mật khẩu tạm mới.',
 'resetpass-temp-password' => 'Mật khẩu tạm:',
+'resetpass-abort-generic' => 'Một phần mở rộng đã hủy bỏ tác vụ thay đổi mật khẩu.',
 
 # Special:PasswordReset
 'passwordreset' => 'Tái tạo mật khẩu',
-'passwordreset-text' => 'Hãy điền mẫu đơn này để tái tạo mật khẩu.',
+'passwordreset-text-one' => 'Hãy điền mẫu đơn này để tái tạo mật khẩu.',
+'passwordreset-text-many' => '{{PLURAL:$1|Nhập một trong những chi tiết sau để táo tạo mật khẩu.}}',
 'passwordreset-legend' => 'Tái tạo mật khẩu',
 'passwordreset-disabled' => 'Chức năng tái tạo mật khẩu đã bị tắt trên wiki này.',
-'passwordreset-pretext' => '{{PLURAL:$1||Nhập một trong những thông tin được yêu cầu ở dưới}}',
+'passwordreset-emaildisabled' => 'Tính năng gửi thư điện tử không được kích hoạt trên wiki này.',
 'passwordreset-username' => 'Tên người dùng:',
 'passwordreset-domain' => 'Tên miền:',
 'passwordreset-capture' => 'Xem thư điện tử có mật khẩu tạm',
@@ -850,7 +915,7 @@ mật khẩu cũ.',
 Mật khẩu tạm: $2',
 'passwordreset-emailsent' => 'Đã gửi thư điện tử để tái tạo mật khẩu.',
 '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 người dùng: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Đổi địa chỉ thư điện tử',
@@ -984,9 +1049,9 @@ Nó chưa được lưu!'''",
 Các thay đổi của bạn vẫn chưa được lưu!",
 'continue-editing' => 'Đi đến hộp sửa đổi',
 'previewconflict' => 'Phần xem thử này là kết quả của văn bản trong vùng soạn thảo phía trên và nó sẽ xuất hiện như vậy nếu bạn chọn lưu trang.',
-'session_fail_preview' => "'''Những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.
+'session_fail_preview' => "'''Rất tiếc, những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.'''
 Xin hãy thử lần nữa.
-Nếu vẫn không thành công, hãy thử [[Special:UserLogout|đăng xuất]] rồi đăng nhập lại.'''",
+Nếu vẫn không thành công, hãy thử [[Special:UserLogout|đăng xuất]] rồi đăng nhập lại.",
 'session_fail_preview_html' => "'''Những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.'''
 
 ''Do {{SITENAME}} cho phép dùng mã HTML, trang xem thử được ẩn đi để đề phòng bị tấn công bằng JavaScript.''
@@ -1058,12 +1123,15 @@ Không có lý do nào được đưa ra.',
 Dường như trang này đã bị xóa.',
 'edit-conflict' => 'Sửa đổi mâu thuẫn.',
 'edit-no-change' => 'Sửa đổi của bạn không được tính đến, vì nó không làm thay đổi nội dung.',
+'postedit-confirmation' => 'Sửa đổi của bạn đã được lưu.',
 'edit-already-exists' => 'Không thể tạo trang mới.
 Nó đã tồn tại.',
 'defaultmessagetext' => 'Nội dung mặc định',
 'content-failed-to-parse' => 'Thất bại phân tích nội dung $2 cho mô hình $1: $3',
 'invalid-content-data' => 'Dữ liệu nội dung không hợp lệ',
 'content-not-allowed-here' => 'Không cho phép đưa nội dung “$1” vào trang [[$2]]',
+'editwarning-warning' => 'Rời khỏi trang này sẽ khiến bạn mất các sửa đổi đã thực hiện.
+Nếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “Sửa đổi” trong tùy chọn cá nhân.',
 
 # Content models
 'content-model-wikitext' => 'mã wiki',
@@ -1345,15 +1413,7 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'powersearch-togglenone' => 'Không',
 'search-external' => 'Tìm kiếm từ bên ngoài',
 'searchdisabled' => 'Chức năng tìm kiếm tại {{SITENAME}} đã bị tắt. Bạn có tìm kiếm bằng Google trong thời gian này. Chú ý rằng các chỉ mục từ {{SITENAME}} của chúng có thể đã lỗi thời.',
-
-# Quickbar
-'qbsettings' => 'Thanh công cụ',
-'qbsettings-none' => 'Không có',
-'qbsettings-fixedleft' => 'Cố định trái',
-'qbsettings-fixedright' => 'Cố định phải',
-'qbsettings-floatingleft' => 'Nổi bên trái',
-'qbsettings-floatingright' => 'Nổi bên phải',
-'qbsettings-directionality' => 'Cố định, tùy theo hướng viết ngôn ngữ của bạn',
+'search-error' => 'Đã xuất hiện lỗi khi tìm kiếm: $1',
 
 # Preferences page
 'preferences' => 'Tùy chọn',
@@ -1498,6 +1558,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'userrights-notallowed' => 'Tài khoản của bạn không có quyền gán hoặc bãi miễn quyền cho thành viên.',
 'userrights-changeable-col' => 'Những nhóm bạn có thể thay đổi',
 'userrights-unchangeable-col' => 'Những nhóm bạn không thể thay đổi',
+'userrights-conflict' => 'Mâu thuẫn thay đổi sửa nhóm thành viên! Xin vui lòng áp dụng các thay đổi của bạn một lần nữa.',
 
 # Groups
 'group' => 'Nhóm:',
@@ -1819,7 +1880,7 @@ Xin hãy liên hệ với một [[Special:ListUsers/sysop|bảo quản viên]].'
 'upload-misc-error-text' => 'Có lỗi lạ khi tải lên.
 Xin hãy xác nhận lại địa chỉ URL là hợp lệ và có thể truy cập được không rồi thử lại lần nữa.
 Nếu vẫn còn bị lỗi, xin hãy liên hệ với một [[Special:ListUsers/sysop|bảo quản viên]].',
-'upload-too-many-redirects' => 'URL có quá nhiều chuyển hướng',
+'upload-too-many-redirects' => 'URL có quá nhiều đổi hướng',
 'upload-unknown-size' => 'Không rõ kích thước',
 '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.',
@@ -1911,7 +1972,6 @@ Vì lý do bảo mật, img_auth.php đã bị tắt.',
 'http-read-error' => 'Lỗi đọc HTTP.',
 'http-timed-out' => 'Hết thời gian yêu cầu HTTP.',
 'http-curl-error' => 'Có lỗi khi truy xuất URL: $1',
-'http-host-unreachable' => 'Không thể truy cập URL',
 'http-bad-status' => 'Có vấn đề khi yêu cầu HTTP: $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2318,8 +2378,8 @@ Những sửa đổi đối với trang này và trang thảo luận của nó s
 'notvisiblerev' => 'Phiên bản bị xóa',
 'watchnochange' => 'Không có trang nào bạn theo dõi được sửa đổi.',
 'watchlist-details' => 'Bạn đang theo dõi {{PLURAL:$1|$1 trang|$1 trang}}, không kể các trang thảo luận.',
-'wlheader-enotif' => 'Đã bật thông báo qua thư điện tử.',
-'wlheader-showupdated' => "* Các trang đã thay đổi từ lần cuối bạn xem chúng được in '''đậm'''",
+'wlheader-enotif' => 'Đã bật thông báo qua thư điện tử.',
+'wlheader-showupdated' => "Các trang đã thay đổi kể từ lần cuối bạn xem chúng được in '''đậm'''",
 'watchmethod-recent' => 'Dưới đây hiện thay đổi mới với các trang theo dõi.',
 'watchmethod-list' => 'Dưới đây hiện danh sách các trang theo dõi.',
 'watchlistcontains' => 'Danh sách theo dõi của bạn có $1 {{PLURAL:$1|trang|trang}}.',
@@ -2727,6 +2787,7 @@ Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 'proxyblocksuccess' => 'Xong.',
 'sorbsreason' => 'Địa chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng.',
 'sorbs_create_account_reason' => 'Địa chỉ chỉ IP của bạn bị liệt kê là một proxy mở trong DNSBL mà {{SITENAME}} đang sử dụng. Bạn không thể mở tài khoản.',
+'xffblockreason' => 'Đầu đề X-Forwarded-For chứa một địa chỉ IP đã bị cấm, địa chỉ này hoặc của bạn hoặc của một máy chủ proxy bạn đang sử dụng. Lý do cấm ban đầu là: $1',
 'cant-block-while-blocked' => 'Bạn không thể cấm thành viên khác trong khi bạn đang bị cấm.',
 'cant-see-hidden-user' => 'Thành viên bạn muốn cấm đã bị cấm trước đây hoặc đã bị ẩn đi. Vì bạn không có quyền hideuser, bạn không thể xem hoặc thay đổi mức cấm của thành viên.',
 'ipbblocked' => 'Bạn không thể cấm hay bỏ cấm người dùng khác vì chính bạn đang bị cấm.',
@@ -2799,7 +2860,7 @@ Trong những trường hợp đó, bạn phải di chuyển hoặc hợp nhất
 'pagemovedsub' => 'Di chuyển thành công',
 'movepage-moved' => "'''“$1” đã được di chuyển đến “$2”'''",
 'movepage-moved-redirect' => 'Đã tạo trang đổi hướng.',
-'movepage-moved-noredirect' => 'Chức năng tạo trang chuyển hướng đã bị tắt.',
+'movepage-moved-noredirect' => 'Chức năng tạo trang đổi hướng đã bị tắt.',
 'articleexists' => 'Đã có một trang với tên đó, hoặc tên bạn chọn không hợp lệ.
 Xin hãy chọn tên khác.',
 'cantmove-titleprotected' => 'Bạn không thể đổi tên trang, vì tên trang mới đã bị khóa không cho tạo mới',
@@ -2890,6 +2951,8 @@ Mời vào [//www.mediawiki.org/wiki/Localisation?uselang=vi Địa phương hó
 'thumbnail-more' => 'Phóng lớn',
 'filemissing' => 'Không có tập tin',
 'thumbnail_error' => 'Hình thu nhỏ có lỗi: $1',
+'thumbnail_error_remote' => 'Thông báo lỗi từ $1:
+$2',
 'djvu_page_error' => 'Trang DjVu quá xa',
 'djvu_no_xml' => 'Không thể truy xuất XML cho tập tin DjVu',
 'thumbnail-temp-create' => 'Không thể tạo tập tin hình nhỏ tạm thời',
@@ -3038,17 +3101,11 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 
 # Stylesheets
 'common.css' => '/* Mã CSS đặt ở đây sẽ áp dụng cho mọi hình dạng */',
-'standard.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Cổ điển */',
-'nostalgia.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Vọng cổ */',
 'cologneblue.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Xanh Cologne */',
 'monobook.css' => '/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng MonoBook */',
-'myskin.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Cá nhân */',
-'chick.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Chick */',
-'simple.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Đơn giản */',
 'modern.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng sử dụng hình dạng Hiện đại */',
 'vector.css' => '/* Mã CSS đặt ở đây sẽ ảnh hưởng đến thành viên sử dụng hình dạng Vectơ */',
 'print.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến bản để in */',
-'handheld.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến các thiết bị cầm tay dựa trên hình dạng cấu hình trong $wgHandheldStyle */',
 'noscript.css' => '/* Mã CSS tại đây sẽ ảnh hưởng đến những người dùng tắt JavaScript */',
 'group-autoconfirmed.css' => '/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các thành viên tự động xác nhận */',
 'group-bot.css' => '/* Mã CSS tại đây sẽ chỉ ảnh hưởng đến các bot */',
@@ -3057,13 +3114,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 
 # Scripts
 'common.js' => '/* Bất kỳ mã JavaScript ở đây sẽ được tải cho tất cả các thành viên khi tải một trang nào đó lên. */',
-'standard.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Cổ điển */',
-'nostalgia.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Vọng cổ */',
 'cologneblue.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng hình dạng Xanh Cologne */',
 'monobook.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài MonoBook */',
-'myskin.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Cá nhân */',
-'chick.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Chick */',
-'simple.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Đơn giản */',
 'modern.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Hiện đại */',
 'vector.js' => '/* Mã JavaScript tại đây sẽ được tải khi người dùng sử dụng bề ngoài Vectơ */',
 'group-autoconfirmed.js' => '/* Mã JavaScript tại đây sẽ chỉ được tải cho các thành viên tự động xác nhận */',
@@ -3144,11 +3196,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'pageinfo-category-files' => 'Số tập tin',
 
 # Skin names
-'skinname-standard' => 'Cổ điển',
-'skinname-nostalgia' => 'Vọng cổ',
 'skinname-cologneblue' => 'Xanh Cologne',
-'skinname-myskin' => 'Cá nhân',
-'skinname-simple' => 'Đơn giản',
 'skinname-modern' => 'Hiện đại',
 'skinname-vector' => 'Vectơ',
 
@@ -3233,11 +3281,25 @@ Nếu thực thi nó máy tính của bạn có thể bị tiếm quyền.",
 'minutes' => '$1 phút',
 'hours' => '$1 giờ',
 'days' => '$1 ngày',
+'weeks' => '$1 tuần',
 'months' => '$1 tháng',
 'years' => '$1 năm',
 'ago' => 'cách đây $1',
 'just-now' => 'hồi nãy',
 
+# Human-readable timestamps
+'hours-ago' => 'cách đây $1 giờ',
+'minutes-ago' => 'cách đây $1 phút',
+'seconds-ago' => 'cách đây $1 giây',
+'monday-at' => 'Thứ Hai lúc $1',
+'tuesday-at' => 'Thứ Ba lúc $1',
+'wednesday-at' => 'Thứ Tư lúc $1',
+'thursday-at' => 'Thứ Năm lúc $1',
+'friday-at' => 'Thứ Sáu lúc $1',
+'saturday-at' => 'Thứ Bảy lúc $1',
+'sunday-at' => 'Chủ nhật lúc $1',
+'yesterday-at' => 'Hôm qua lúc $1',
+
 # Bad image list
 'bad_image_list' => 'Định dạng như sau:
 
@@ -3246,8 +3308,6 @@ Các liên kết sau đó trên cùng một dòng được xem là các ngoại
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => 'Giản thể',
@@ -3307,7 +3367,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Chiều ngang',
 'exif-imagelength' => 'Chiều cao',
 'exif-bitspersample' => 'Bit trên mẫu',
@@ -3487,7 +3547,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
 'exif-originalimageheight' => 'Chiều cao của hình trước khi được cắt',
 'exif-originalimagewidth' => 'Chiều rộng của hình trước khi được cắt',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Không nén',
 'exif-compression-2' => 'CCITT Nhóm 3: mã hóa thời gian chạy Huffman sửa một chiều',
 'exif-compression-3' => 'CCITT Nhóm 3: mã hóa fax',
@@ -3795,7 +3855,7 @@ Xin hãy xác nhận bạn thực sự muốn tạo lại trang này.",
 'recreate' => 'Tạo ra lại',
 
 # action=purge
-'confirm_purge_button' => 'Làm mới',
+'confirm_purge_button' => 'Làm tươi',
 'confirm-purge-top' => 'Làm sạch vùng nhớ đệm của trang này?',
 'confirm-purge-bottom' => 'Làm mới một trang sẽ giúp xóa bộ đệm và buộc hiển thị phiên bản gần nhất.',
 
@@ -3972,12 +4032,17 @@ hoặc [//www.gnu.org/licenses/old-licenses/gpl-2.0.html đọc nó trực tuy
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=vi Đường dẫn bài]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=vi Đường dẫn kịch bản]',
 
-# Special:FilePath
-'filepath' => 'Đường dẫn tập tin',
-'filepath-page' => 'Tập tin:',
-'filepath-submit' => 'Hiển thị tập tin',
-'filepath-summary' => 'Trang này cho ra địa chỉ đầy đủ của một tập tin.
-Các hình ảnh được hiển thị ở kích thước tối đa, còn các loại tập tin khác được mở lên ngay trong chương trình mặc định.',
+# Special:Redirect
+'redirect' => 'Đổi hướng đến tập tin, người dùng, hoặc số phiên bản',
+'redirect-legend' => 'Đổi hướng đến tập tin hoặc trang',
+'redirect-summary' => 'Trang đặc biệt này đổi hướng đến một tập tin (theo tên tập tin được cho vào), trang (theo số phiên bản được cho vào), hoặc trang cá nhân (theo số thành viên).',
+'redirect-submit' => 'Đi',
+'redirect-lookup' => 'Tra cứu:',
+'redirect-value' => 'Giá trị:',
+'redirect-user' => 'Số thành viên',
+'redirect-revision' => 'Phiên bản trang',
+'redirect-file' => 'Tên tập tin',
+'redirect-not-exists' => 'Không tìm thấy giá trị',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Tìm kiếm các tập tin trùng lắp',
@@ -4068,23 +4133,26 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'htmlform-submit' => 'Đăng',
 'htmlform-reset' => 'Hủy các thay đổi',
 'htmlform-selectorother-other' => 'Khác',
+'htmlform-no' => 'Không',
+'htmlform-yes' => 'Có',
+'htmlform-chosen-placeholder' => 'Chọn một tùy chọn',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 với sự hỗ trợ tìm kiếm toàn văn',
 'sqlite-no-fts' => '$1 không có hỗ trợ tìm kiếm toàn văn',
 
 # New logging system
-'logentry-delete-delete' => '$1 đã xóa trang “$3”',
-'logentry-delete-restore' => '$1 đã phục hồi trang “$3”',
-'logentry-delete-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4',
-'logentry-delete-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
-'logentry-delete-event-legacy' => '$1 đã thay đổi mức hiển thị của các mục nhật trình về $3',
-'logentry-delete-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3',
-'logentry-suppress-delete' => '$1 đã ẩn trang $3',
-'logentry-suppress-event' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3 một cách kín đáo: $4',
-'logentry-suppress-revision' => '$1 đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
-'logentry-suppress-event-legacy' => '$1 đã thay đổi mức hiển thị các mục nhật trình về $3 một cách kín đáo',
-'logentry-suppress-revision-legacy' => '$1 đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
+'logentry-delete-delete' => '$1 {{GENDER:$2}}đã xóa trang “$3”',
+'logentry-delete-restore' => '$1 {{GENDER:$2}}đã phục hồi trang “$3”',
+'logentry-delete-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các mục nhật trình về $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$2}}đã ẩn trang $3',
+'logentry-suppress-event' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3 một cách kín đáo: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3 một cách kín đáo: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị các mục nhật trình về $3 một cách kín đáo',
+'logentry-suppress-revision-legacy' => '$1 {{GENDER:$2}}đã thay đổi mức hiển thị của các phiên bản trang $3 một cách kín đáo',
 'revdelete-content-hid' => 'đã ẩn nội dung',
 'revdelete-summary-hid' => 'đã ẩn tóm lược sửa đổi',
 'revdelete-uname-hid' => 'đã ẩn tên người dùng',
@@ -4093,20 +4161,20 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'revdelete-uname-unhid' => 'đã hiện tên người dùng',
 'revdelete-restricted' => 'đã áp dụng hạn chế cho bảo quản viên',
 'revdelete-unrestricted' => 'đã gỡ bỏ hạn chế cho bảo quản viên',
-'logentry-move-move' => '$1 đã đổi $3 thành $4',
-'logentry-move-move-noredirect' => '$1 đã đổi $3 thành $4 (đã tắt đổi hướng)',
-'logentry-move-move_redir' => '$1 đã đổi $3 thành $4 qua đổi hướng',
-'logentry-move-move_redir-noredirect' => '$1 đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
-'logentry-patrol-patrol' => '$1 đã đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-patrol-patrol-auto' => '$1 đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-newusers-newusers' => 'Đã mở tài khoản người dùng $1',
-'logentry-newusers-create' => 'Đã mở tài khoản người dùng $1',
-'logentry-newusers-create2' => '$1 đã mở tài khoản người dùng $3',
-'logentry-newusers-byemail' => '$1 đã 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 đã được mở tự động',
-'logentry-rights-rights' => '$1 đã đổi các nhóm liên kết của $3 từ $4 đến $5',
-'logentry-rights-rights-legacy' => '$1 đã đổi các nhóm liên kết của $3',
-'logentry-rights-autopromote' => '$1 đã được tự động phong cấp từ $4 đến $5',
+'logentry-move-move' => '$1 {{GENDER:$2}}đã đổi $3 thành $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 (đã tắt đổi hướng)',
+'logentry-move-move_redir' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2}}đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2}}đã đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2}}đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
+'logentry-newusers-newusers' => '{{GENDER:$2}}Đã mở tài khoản người dùng $1',
+'logentry-newusers-create' => '{{GENDER:$2}}Đã mở tài khoản người dùng $1',
+'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-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',
 'rightsnone' => '(không có)',
 
 # Feedback
index 926cb12..3f15d71 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Altaileopard
+ * @author Matma Rex
  * @author Silvicola
  */
 
@@ -80,10 +81,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Dii andsôôl dr beoobachdâr ôôdsajchn',
 'tog-oldsig' => 'foorschau fon dr agduäln signaduur:',
 'tog-fancysig' => 'Signaduur is dhägsd in wighi-sindhags (alsâ ned audomaadisch â lingg)',
-'tog-externaleditor' => 'Schdandardwäässich an ägsdhärnân eedidhâr neemn (nôr for di sich ausghenn, dâdsuu
-mus mr ufm ajchnen rächnâr was ajrichdn gehnn)',
-'tog-externaldiff' => ' ägsdhärns Brogram dsum ôôdsjachn fon dâ wärsjoons-undârschiid neemn (nôr fir dii sich
-ausghenn, mr mus dâdsuu ufm ajchnen rächnâr was âjrichdn ghenn)',
 'tog-uselivepreview' => 'Schnäl-foorschau benudsn (brauchd JavaScript) (ärschd ân fârsuuch)',
 'tog-forceeditsummary' => 'Sich erinärn lasn, wemmâr ghâ dsusamnfasung gschriiwn had',
 'tog-watchlisthideown' => 'Ajchne bearbajdungn ned in dr beoobachdungs-lischdn uffiirn',
@@ -483,14 +480,6 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'search-external' => 'Ägsdärne suach',
 'searchdisabled' => 'Diâ {{SITENAME}}-suâch ist ausgschald. Duu ghâusch so lang mid Google suâchn. Dengg drâu, des was mr dôô fir {{SITENAME}} find, ghâu iwârhoold saj.',
 
-# Quickbar
-'qbsettings' => 'Sajdn-lajsdn',
-'qbsettings-none' => 'Ghane',
-'qbsettings-fixedleft' => 'Lings, feschd',
-'qbsettings-fixedright' => 'Rächds, feschd',
-'qbsettings-floatingleft' => 'Lings, schwääbnd',
-'qbsettings-floatingright' => 'Rächds, schwääbnd',
-
 # Preferences page
 'preferences' => 'ajschdelunga',
 'mypreferences' => 'Maj ajschdelunga',
@@ -654,7 +643,7 @@ S'gajd awâr aa â [[Special:WhatLinksHere/$2|lisdn mid alâ fârwajs]].",
 # Special:ListGroupRights
 'listgrouprights-members' => '(Lisdn fon dâ midgliidâr)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Dem ôôgmeldn â iimejl schign',
 
 # Watchlist
@@ -876,23 +865,9 @@ Bidde gug's mi´m foorschau-gnobf ôô fôrm schbajchan",
 
 # Stylesheets
 'common.css' => '/* CSS hiir beâjflusd ale schelfn */',
-'standard.css' => "/* CSS hiir beâjflusd nôr dii Klassik-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an [[MediaWiki:Common.css]] was ändârn. */",
-'nostalgia.css' => "/* CSS hiir beâjflusd nôr dii Nostalgia-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'cologneblue.css' => "/* CSS hiir beâjflusd nôr dii Kölnisch-Blau-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'monobook.css' => "/* CSS hiir beâjflusd nôr dii Monobook-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'myskin.css' => "/* CSS hiir beâjflusd nôr dii MySkin-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'chick.css' => "/* CSS hiir beâjflusd nôr dii Küken-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'simple.css' => "/* CSS hiir beâjflusd nôr dii Simple-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
-'modern.css' => "/* CSS hiir beâjflusd nôr dii Modern-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */
-
-/* Dii glôôschrajwung im nawigadsjoonsberajch fârhindârd des: */
-.portlet h5,
-.portlet h6,
-#p-personal ul,
-#p-cactions li a,
-#preftoc a {
-     text-transform: none;
-}",
+'modern.css' => "/* CSS hiir beâjflusd nôr dii Modern-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'vector.css' => "/* CSS hiir beâjflusd nôr dii Vector-schelfn. Wen'd ale uf ôômôôl beâjflusn wilsch, muâsch an MediaWiki:Common.css was ändârn. */",
 'print.css' => '/* CSS hiir beâjflusd nôr dii drugausgaawe. */',
 'handheld.css' => '/* CSS hiir beâjflusd nôr dii handgerääde, jee nachdeem, welche schelfn in $wgHandheldStyle âjgeschdeld is. */',
@@ -935,7 +910,7 @@ Bloos  dsajln, dii mi´m dsajchn * ôôfanga, wärn berigsichdichd. Un dä ärsc
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'brajdn',
 'exif-imagelength' => 'Heen',
 
index ec4deeb..5620a99 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Iketsi
  * @author Kaganer
  * @author Malafaya
  * @author Reedy
@@ -141,8 +142,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Jonön numi gebanas galädöl',
 'tog-oldsig' => 'Dispenäd dabinöl:',
 'tog-fancysig' => 'Dispenäd balugik (nen yüms lü gebanapad)',
-'tog-externaleditor' => 'Gebön nomiko redakömi plödik (te pro jäfüdisevans; paramets patik paneodons su nünöm olik)',
-'tog-externaldiff' => 'Gebön nomiko difi plödik (te pro jäfüdisevans; paramets patik paneodons su nünöm olik)',
 'tog-showjumplinks' => 'Dälön lügolovi me yüms „lübunöl“',
 'tog-uselivepreview' => 'Gebön büologedi itjäfidik (JavaScript) (Sperimäntik)',
 'tog-forceeditsummary' => 'Sagön obe, ven redakaplän brefik vagon',
@@ -237,8 +236,8 @@ $messages = array(
 'newwindow' => '(maifikon in fenät nulik)',
 'cancel' => 'Stöpädön',
 'moredotdotdot' => 'Plu...',
-'mypage' => 'Pad obik',
-'mytalk' => 'Bespiks obik',
+'mypage' => 'Pad',
+'mytalk' => 'Bespiks',
 'anontalk' => 'Bespiks ela IP at',
 'navigation' => 'Nafam',
 'and' => '&#32;e',
@@ -408,9 +407,9 @@ Mögos i, das atos sinifon, das dabinon säkädil pö program fa {{SITENAME}} pa
 'dberrortext' => 'Süntagapök pö geb vüka at ejenon.
 Atos ba sinifön, das dabinon säkäd pö program.
 Steifül lätik ad gebön vüki äbinon:
-<blockquote><tt>$1</tt></blockquote>
-se dunod: „<tt>$2</tt>“.
-Nünodem ägesedon pökanuni: „<tt>$3: $4</tt>“.',
+<blockquote><code>$1</code></blockquote>
+se dunod: „<code>$2</code>“.
+Nünodem ägesedon pökanuni: „<samp>$3: $4</samp>“.',
 'dberrortextcl' => 'Süntagapök pö geb vüka at ejenon.
 Steifül lätik ad gebön vüki at äbinon:
 „$1“
@@ -912,7 +911,7 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Logön padis labü foyümot at]]',
 'searchprofile-articles' => 'Ninädapads',
 'searchprofile-project' => 'Yufa e Proyegapads',
-'searchprofile-images' => 'Ragivs',
+'searchprofile-images' => 'Mödamedäd',
 'searchprofile-everything' => 'Valikos',
 'searchprofile-advanced' => 'Paramets pluik',
 'searchprofile-articles-tooltip' => 'Sukön in $1',
@@ -930,7 +929,7 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'search-interwiki-default' => 'Seks se $1:',
 'search-interwiki-more' => '(pluikos)',
 'search-relatedarticle' => 'Tefik',
-'mwsuggest-disable' => 'Nemögükön mobis ela AJAX',
+'mwsuggest-disable' => 'Nemögükön sukamobis',
 'searcheverything-enable' => 'Sukolöd in nemaspads valik',
 'searchrelated' => 'tefik',
 'searchall' => 'valik',
@@ -950,17 +949,9 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'search-external' => 'Suk plödik',
 'searchdisabled' => 'Suk in {{SITENAME}} penemogükon. Vütimo kanol sukön yufü el Google. Demolös, das liseds onik tefü ninäd in {{SITENAME}} ba no binon anuik.',
 
-# Quickbar
-'qbsettings' => 'Stumem',
-'qbsettings-none' => 'Nonik',
-'qbsettings-fixedleft' => 'nedeto (fimiko)',
-'qbsettings-fixedright' => 'Deto (fimiko)',
-'qbsettings-floatingleft' => 'nedeto (vebölo)',
-'qbsettings-floatingright' => 'deto (vebölo)',
-
 # Preferences page
 'preferences' => 'Buükams',
-'mypreferences' => 'Buükams obik',
+'mypreferences' => 'Buükams',
 'prefs-edits' => 'Num redakamas:',
 'prefsnologin' => 'No enunädon oki',
 'prefsnologintext' => 'Nedol <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} nunädön oli]</span> büä kanol votükön gebanabuükamis.',
@@ -1017,9 +1008,9 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'prefs-custom-css' => 'CSS nekösömik',
 'prefs-custom-js' => 'JavaScript nekösömik',
 'youremail' => 'Ladet leäktronik *:',
-'username' => 'Gebananem:',
+'username' => '{{GENDER:$1|Gebananem}}:',
 'uid' => 'Gebanadientif:',
-'prefs-memberingroups' => 'Liman {{PLURAL:$1|grupa|grupas}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Liman}} {{PLURAL:$1|grupa|grupas}}:',
 'yourrealname' => 'Nem jenöfik *:',
 'yourlanguage' => 'Pük:',
 'yournick' => 'Dispenäd nulik:',
@@ -1590,7 +1581,7 @@ Logolös i [[Special:WantedCategories|klads pevilöl]].',
 'sp-deletedcontributions-contribs' => 'keblünots',
 
 # Special:LinkSearch
-'linksearch' => 'Yüms plödik',
+'linksearch' => 'Suk yümas plödik',
 'linksearch-pat' => 'Sukapated:',
 'linksearch-ns' => 'Nemaspad:',
 'linksearch-ok' => 'Suk',
@@ -1651,8 +1642,8 @@ Ba dabinons [[{{MediaWiki:Listgrouprights-helppage}}|nüns pluik]] tefü gebanag
 'emailuserfooter' => 'Pened at pesedon fa geban: $1 gebane: $2 medü program: „sedön gebane penedi“ ela {{SITENAME}}.',
 
 # Watchlist
-'watchlist' => 'Galädalised obik',
-'mywatchlist' => 'Galädalised obik',
+'watchlist' => 'Galädalised',
+'mywatchlist' => 'Galädalised',
 'watchlistfor2' => 'Ela $1 $2',
 'nowatchlist' => 'Labol nosi in galädalised olik.',
 'watchlistanontext' => '$1 ad logön u redakön lienis galädaliseda olik',
@@ -1673,8 +1664,8 @@ If vilol poso moükön padi de galädalised olik, välolös lä on knopi: „neg
 'notvisiblerev' => 'Fomam pemoükon',
 'watchnochange' => 'Nonik padas pagalädöl olik peredakon dü period löpo pejonöl.',
 'watchlist-details' => '{{PLURAL:$1|pad $1|pads $1}} su galädalised, plä bespikapads.',
-'wlheader-enotif' => 'Nunam medü pot leäktronik pemögükon.',
-'wlheader-showupdated' => "Pads pos visit lätik ola pevotüköls papenons '''me tonats bigik'''",
+'wlheader-enotif' => 'Nunam medü pot leäktronik pemögükon.',
+'wlheader-showupdated' => "Pads pos visit lätik ola pevotüköls papenons '''me tonats bigik'''",
 'watchmethod-recent' => 'vestigam redakamas brefabüik padas galädaliseda',
 'watchmethod-list' => 'vestigam votükamas brefabüik padas galädaliseda',
 'watchlistcontains' => 'Galädalised olik labon {{PLURAL:$1|padi|padis}} $1.',
@@ -1884,9 +1875,9 @@ $1',
 'blanknamespace' => '(Cifik)',
 
 # Contributions
-'contributions' => 'Gebanakeblünots',
+'contributions' => '{{GENDER:$1|Gebanakeblünots}}',
 'contributions-title' => 'Gebanakeblünots pro $1',
-'mycontris' => 'Keblünots obik',
+'mycontris' => 'Keblünots',
 'contribsub2' => 'Tefü $1 ($2)',
 'nocontribs' => 'Votükams nonik petuvons me paramets at.',
 'uctop' => '(lätik)',
@@ -1922,7 +1913,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 lüodükömis',
 'whatlinkshere-hidetrans' => '$1 ninükodis',
 'whatlinkshere-hidelinks' => '$1 yümis',
-'whatlinkshere-hideimages' => '$1 yümis magodas',
+'whatlinkshere-hideimages' => '$1 yümis ragivas',
 'whatlinkshere-filters' => 'Suls',
 
 # Block/unblock
@@ -2290,7 +2281,7 @@ Pad luveratiko ninädon yümi lü bevüresodatopäd plödik in blägalised.',
 'spam_blanking' => 'Moükam revidas valik (bi ninädons yüms lü $1)',
 
 # Info page
-'pageinfo-header-edits' => 'Redakams',
+'pageinfo-header-edits' => 'Jenotem redakamas',
 
 # Patrolling
 'markaspatrolleddiff' => 'Zepön',
@@ -2379,7 +2370,7 @@ Nünabinets votik poklänedons.
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Vidot',
 'exif-imagelength' => 'Geilot',
 'exif-bitspersample' => 'Jölätabinets a köl',
@@ -2491,7 +2482,7 @@ Nünabinets votik poklänedons.
 'exif-languagecode' => 'Pük',
 'exif-iimcategory' => 'Klad',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'No pekobopedöl',
 
 'exif-unknowndate' => 'Dät nesevädik',
@@ -2744,13 +2735,6 @@ Kanol i [[Special:EditWatchlist|gebön redakametodi kösömik]].',
 'version-software-product' => 'Prodäd',
 'version-software-version' => 'Fomam',
 
-# Special:FilePath
-'filepath' => 'Ragivaluveg',
-'filepath-page' => 'Ragiv:',
-'filepath-submit' => 'Gololöd',
-'filepath-summary' => 'Pad patik at tuvon luvegi lölöfik ragiva.
-Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü programs onsik.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Sukön ragivis petelüköl',
 'fileduplicatesearch-summary' => 'Sukön ragivis petelüköl stabü völad kontrolasaedota onsik.',
index 6ca447b..cfe4728 100644 (file)
@@ -404,9 +404,6 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
 'powersearch-redir' => 'Spiiska mešaitussijõ',
 'powersearch-field' => 'Etsi',
 
-# Quickbar
-'qbsettings-none' => 'Eb õõ',
-
 # Preferences page
 'preferences' => 'Koozid',
 'mypreferences' => 'Minu koozid',
@@ -603,7 +600,7 @@ Seness [$2 kuvauhsõ lehocülless] informaattsija on alapallõ annõttu.',
 # Special:ListGroupRights
 'listgrouprights-members' => '(selttsilainspiiska)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Lähettega elektropoštia selle cäüttijälle',
 'emailusername' => 'Cäüttijänimi:',
 'emailmessage' => 'Ilmottamin:',
@@ -890,7 +887,7 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-gpstimestamp' => 'GPS-aika',
 'exif-languagecode' => 'Ceeli',
 'exif-iimcategory' => 'Gruppa',
@@ -934,10 +931,6 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Warning:\'\'\' Default sort key "$2" overrides earlier default sort key "$1".',
 
-# Special:FilePath
-'filepath-page' => 'Faili:',
-'filepath-submit' => 'Mee',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Failinimi:',
 'fileduplicatesearch-submit' => 'Etsi',
index de0cfbf..a715c85 100644 (file)
@@ -65,15 +65,13 @@ $messages = array(
 'tog-previewontop' => 'Näütäq proovikaehust inne, mitte perän toimõnduskasti',
 'tog-previewonfirst' => 'Näütäq edimädse toimõndusõ aigo proovikaehust',
 'tog-nocache' => 'Pästku-i lehekülgi võrgokaeja vaihõmällo',
-'tog-enotifwatchlistpages' => 'Saadaq mullõ e-kiri, ku muq perräkaetavat lehte muudõtas',
+'tog-enotifwatchlistpages' => 'Saadaq mullõ e-kiri, ku muq perräkaetavat lehte vai teedüstüt muudõtas',
 'tog-enotifusertalkpages' => 'Saadaq mullõ e-kiri, ku mu arotuslehte muudõtas',
-'tog-enotifminoredits' => 'Saadaq mullõ e-kiri ka väikeisi muutmiisi kotsilõ',
+'tog-enotifminoredits' => 'Saadaq mullõ e-kiri ka lehti ja failõ väikeisi muutmiisi kotsilõ',
 'tog-enotifrevealaddr' => 'Näütäq mu e-postiaadrõssit tõisilõ saadõtuin teedüssin',
 'tog-shownumberswatching' => "Näütäq, ku pall'o pruukjit taa lehe perrä kaes",
-'tog-oldsig' => 'Parhilladsõ alakirotusõ proomikaehus:',
+'tog-oldsig' => 'Parhillanõ alakirotus:',
 'tog-fancysig' => 'Pruugiq vikiteksti moodulist alakirotust (ilma automaatsõ lingildä)',
-'tog-externaleditor' => "Pruugiq vaikimiisi välist tekstitoimõndajat (õnnõ as'atundjilõ, nõud suq puutri ümbresäädmist, kaeq [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
-'tog-externaldiff' => "Pruugiq vaikimiisi välist võrrõlusprogrammi (õnnõ as'atundjilõ, nõud su puutri ümbresäädmist, kaeq [//www.mediawiki.org/wiki/Manual:External_editors More information.])",
 'tog-showjumplinks' => 'Panõq lehe algustõ kipõqlingiq',
 'tog-uselivepreview' => 'Pruugiq kipõkaehust (JavaScript) (proomi)',
 'tog-forceeditsummary' => 'Annaq teedäq, ku olõ-i kirotõt kokkovõtõt',
@@ -90,7 +88,7 @@ $messages = array(
 
 'underline-always' => 'Kõgõ',
 'underline-never' => 'Ei kunagi',
-'underline-default' => 'Võrgokaeja perrä',
+'underline-default' => 'Kujondusõ vai võrgokaeja perrä',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Toimõndamiskotusõ kirätüüp:',
@@ -168,6 +166,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'lätt edesi',
 'index-category' => 'Indeksiga leheq',
 'noindex-category' => 'Indeksildä leheq',
+'broken-file-category' => 'Katskiidsi pildilinkega leheküleq',
 
 'about' => 'Pääteedüs',
 'article' => 'Sisu',
@@ -814,14 +813,6 @@ otsisõna iin edejakku ''all:''. Ütest kimmäst nimeruumist otsmisõs pruugiq e
 'search-external' => 'Väline otsminõ',
 'searchdisabled' => "{{SITENAME}} otsminõ parhillaq ei tüütäq. Niikavva, ku otsminõ jälq tüüle saa, võit pruukiq otsmisõs alanolõvat Google'i otsikasti, a näide teedüs {{SITENAME}} sisust pruugi-i ollaq alasi kõgõ värskimb.",
 
-# Quickbar
-'qbsettings' => 'Kipõriba säädmine',
-'qbsettings-none' => 'Olõ-i',
-'qbsettings-fixedleft' => 'Kõgõ kural puul',
-'qbsettings-fixedright' => 'Kõgõ hüäl puul',
-'qbsettings-floatingleft' => 'Ujovahe kural puul',
-'qbsettings-floatingright' => 'Ujovahe hüäl puul',
-
 # Preferences page
 'preferences' => 'Säädmine',
 'mypreferences' => 'Säädmiseq',
@@ -1330,8 +1321,8 @@ ja sul piät umin [[Special:Preferences|säädmiisin]] olõma e-postiaadrõs, et
 'notanarticle' => 'Olõ-i artikli',
 'watchnochange' => 'Taa ao seen olõ-i üttegi perräkaetavat lehte muudõt.',
 'watchlist-details' => 'Perräkaemisnimekirän om {{PLURAL:$1|$1 leht|$1 lehte}}, rehkendämäldä arotuslehti.',
-'wlheader-enotif' => 'E-postiga teedäqandmisõq ommaq käügin.',
-'wlheader-showupdated' => "Leheq, midä om muudõt päält su viimäst käümist, ommaq '''paksun kirän'''",
+'wlheader-enotif' => 'E-postiga teedäqandmisõq ommaq käügin.',
+'wlheader-showupdated' => "Leheq, midä om muudõt päält su viimäst käümist, ommaq '''paksun kirän'''",
 'watchmethod-recent' => 'kontrollitas perräkaetavidõ lehti perämäidsi muutmiisi',
 'watchmethod-list' => 'perräkaetavidõ lehti perämädseq muutmisõq',
 'watchlistcontains' => 'Perräkaemisnimekirän om $1 {{PLURAL:$1|leht|lehte}}.',
@@ -1823,9 +1814,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
 'spam_blanking' => "Kõigin kujõn oll' linke lehele $1. Leht tühäs tett.",
 
 # Skin names
-'skinname-standard' => 'Array',
 'skinname-cologneblue' => 'Array',
-'skinname-myskin' => 'Array',
 
 # Patrolling
 'markaspatrolleddiff' => 'Märgiq ülekaetus',
@@ -1893,7 +1882,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lakjus',
 'exif-imagelength' => 'Korgus',
 'exif-bitspersample' => 'Bitti osa kotsilõ',
@@ -2007,7 +1996,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
 'exif-gpsdatestamp' => 'GPS-kuupäiv',
 'exif-gpsdifferential' => 'GPS-differentsiaalparandus',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Kokkopakmalda',
 
 'exif-unknowndate' => 'Tundmalda kuupäiv',
@@ -2236,11 +2225,6 @@ Prooviq harilikku kaehust.',
 'version-version' => '(Kujo $1)',
 'version-software-version' => 'Kujo',
 
-# Special:FilePath
-'filepath' => 'Teedüstü aadrõs',
-'filepath-page' => 'Teedüstü:',
-'filepath-submit' => 'Aadrõs',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Teedüstünimi:',
 'fileduplicatesearch-submit' => 'Otsiq',
index d6b8740..7a8020f 100644 (file)
@@ -113,8 +113,6 @@ $messages = array(
 'tog-shownumberswatching' => "Mostrer l' nombe d' uzeus ki shuvèt l' pådje",
 'tog-oldsig' => 'Siné pol moumint:',
 'tog-fancysig' => 'Sinateure avou do tecse wiki (sins loyén otomatike)',
-'tog-externaleditor' => "Eployî on dfoûtrin aspougneu d' tecse come prémetowe dujhance (po les spepieus uzeus seulmint, ca i vs fåt fé des apontiaedjes sol sopiutrece da vosse, [//www.mediawiki.org/wiki/Manual:External_editors loukîz chal po pus di racsegnes]).",
-'tog-externaldiff' => 'Eployî on dfoûtrin programe di diferinces come prémetowe dujhance (po les spepieus uzeus seulmint, ca i vs fåt fé des apontiaedjes sol sopiutrece da vosse, [//www.mediawiki.org/wiki/Manual:External_editors loukîz chal po pus di racsegnes]).',
 'tog-showjumplinks' => 'Mete en alaedje les loyéns di naiviaedje «potchî a» å dzeu del pådje (pol pea «Myskin» et ds ôtes)',
 'tog-uselivepreview' => "Eployî l' prévoeyaedje abeye (JavaScript) (Esperimintå)",
 'tog-forceeditsummary' => "M' advierti cwand dji lai vude on rascourti",
@@ -127,6 +125,7 @@ $messages = array(
 'tog-ccmeonemails' => "M' evoyî ene copeye des emiles ki dj' evoye ås ôtes",
 'tog-diffonly' => "Èn nén håyner l' contnou del pådje pa dzo l' pådje des diferinces",
 'tog-showhiddencats' => 'Mostrer les categoreyes mucheyes',
+'tog-useeditwarning' => "M' advierti cwand dji cwite ene pådje k' a des candjmints nén schapés",
 
 'underline-always' => 'Tofer',
 'underline-never' => 'Måy',
@@ -711,6 +710,8 @@ Motoit k' elle a stî tapêye evoye.",
 'edit-conflict' => 'Ecramiaedje di candjmints.',
 'edit-no-change' => "Vosse sicrijhaedje n' a nén passé, paski rén n' a stî candjî al modêye di dvant.",
 'edit-already-exists' => "Li novele pâdje n' a savou esse ahivêye, ca cisse pâdje la egzistêye dedja.",
+'editwarning-warning' => "Cwiter cisse pådje ci vos frè piede tos les candjmints ki vos avoz fwait.
+Si vos estoz elodjî, vos ploz dismete cist adviertixhmint ci dins l' linwete «Boesse di tecse» di vos preferinces.",
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Asteme:''' I gn a trop di modeles dins cisse pådje ci.
@@ -855,15 +856,6 @@ Vos ploz sayî di mete «all:» pa dvant l' tecse a cweri po cweri dins tot l' c
 'search-external' => 'Difoûtrin cweraedje',
 'searchdisabled' => "Mande escuzes! Li cweraedje å dvins des årtikes a stî dismetou pol moumint, cåze ki l' sierveu est fortcherdjî. Tot ratindant, vos ploz eployî Google po fé les rcweraedjes so {{SITENAME}}, mins çoula pout esse ene miete vî.",
 
-# Quickbar
-'qbsettings' => 'Apontiaedjes pol bår di menu',
-'qbsettings-none' => 'Nole bår',
-'qbsettings-fixedleft' => 'Aclawêye a hintche',
-'qbsettings-fixedright' => 'Aclawêye a droete',
-'qbsettings-floatingleft' => 'Flotante a hintche',
-'qbsettings-floatingright' => 'Flotante a droete',
-'qbsettings-directionality' => "Aclawêye, sorlon l' sinse di scrijhaedje di vosse lingaedje",
-
 # Preferences page
 'preferences' => 'Preferinces',
 'mypreferences' => 'Mes preferinces',
@@ -1472,8 +1464,8 @@ Si vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «
 'notanarticle' => 'Nén èn årtike',
 'watchnochange' => "Nole des pådjes di vosse djivêye di pådjes a shuve n' a stî candjeye dins l' termene di tins dmandêye.",
 'watchlist-details' => 'Vos avoz {{PLURAL:$1|$1 pådje shuvowe|$1 pådjes shuvowes}} (sins conter les pådjes di copene).',
-'wlheader-enotif' => 'Li notifiaedje pa emile est en alaedje.',
-'wlheader-showupdated' => "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''",
+'wlheader-enotif' => 'Li notifiaedje pa emile est en alaedje.',
+'wlheader-showupdated' => "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''",
 'watchmethod-recent' => "Cwerant après les pådjes k' ont stî candjeyes dierinnmint ki sont eto des pådjes shuvowes",
 'watchmethod-list' => "Cwerant après les pådjes shuvowes k' ont stî candjeyes dierinnmint",
 'watchlistcontains' => 'I gn a {{PLURAL:$1|$1 pådje|$1 pådjes}} e vosse djivêye des pådjes a shuve.',
@@ -2051,7 +2043,7 @@ est raptiti. Les ôtes seront catchîs.
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Lårdjeur',
 'exif-imagelength' => 'Hôteur',
 'exif-bitspersample' => 'Bits pa compôzant',
@@ -2268,9 +2260,6 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 'version-software-product' => 'Prodût',
 'version-software-version' => 'Modêye',
 
-# Special:FilePath
-'filepath-page' => 'Fitchî:',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Cweraedje après les dobes fitchîs',
 'fileduplicatesearch-submit' => 'Cweri',
index c52243f..38f0cdd 100644 (file)
@@ -94,8 +94,6 @@ $messages = array(
 '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-externaleditor' => 'Gamit hin ha-gawas nga pagliwat ha default (ha mga experto la ini, nakinahanglan hin mga pinaurog nga mga seting ha imo kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors More information.]  )',
-'tog-externaldiff' => 'Gamit hin ha-gawas nga diff ha default (ha mga experto la, nakinahanglan hin mga pinaurog nga mga seting ha imo kompyuter.  [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Enable "jump to" accessibility links',
 'tog-uselivepreview' => 'Gamita an buhi nga pahiuna nga pagawas (nagkikinahanglan hin JavaScript) (eksperimental)',
 'tog-forceeditsummary' => 'Pasabti ako kun waray ko ginsurat ha dalikyat-nga-tigaman han pagliwat (edit summary)',
@@ -109,6 +107,7 @@ $messages = array(
 'tog-diffonly' => 'Ayaw igpakita an sulod han pakli ha ilarom han pagkakaiba',
 'tog-showhiddencats' => 'Igpakita an mga tinago nga mga kaarangay',
 'tog-norollbackdiff' => 'Iglat-ang an kaiban kahuman himoa an libot-pabalik',
+'tog-useeditwarning' => 'Pasabti ako kun nabaya ako hin ginliwat ng pakli nga waray katipig an mga pagbag-o',
 
 'underline-always' => 'Pirme',
 'underline-never' => 'Diri',
@@ -233,6 +232,7 @@ $messages = array(
 'namespaces' => "Mga ngaran-lat'ang",
 'variants' => 'Mga pagkadirudilain',
 
+'navigation-heading' => 'Menu hit nabigasyon',
 'errorpagetitle' => 'Sayop',
 'returnto' => 'Balik ngadto ha $1.',
 'tagline' => 'Tikang ha {{SITENAME}}',
@@ -353,6 +353,7 @@ $1',
 'restorelink' => '{{PLURAL:$1|usa nga ginpara nga pagliwat|$1 ka ginpara nga mga pagliwat}}',
 'feedlinks' => 'Igsulod:',
 'feed-invalid' => 'Inbalido nga pagpapaabot',
+'feed-unavailable' => 'Waray mga syndication feed',
 'site-rss-feed' => '$1 RSS nga feed',
 'site-atom-feed' => '$1 Atom nga feed',
 'page-rss-feed' => '"$1" RSS nga feed',
@@ -400,6 +401,9 @@ Nagbalik hin sayop an database nga "$3: $4"',
 'laggedslavemode' => 'Pahimatngon: It pakli bangin waray mga kabag-ohan nga bag-o.',
 'readonly' => 'Gintrankahan an database',
 'enterlockreason' => 'Pagbutang hin rason para han pagtrangka, upod hin banabana kon san-o kukuha-on an pagtrangka',
+'readonlytext' => 'An database in nakatrangka yana ha bag-o nga mga entrada ngan iba nga mga modipikasyon, tungod siguro ha routine database maintenance, kahuman ini in mabalik ha normal.
+
+An magdudumara nga nagtrangka hini in naghatag hini nga kasayoran: $1',
 'missing-article' => 'Ini nga database in waray nakaagi han teksto han pakli nga dapat mabilngan, nga ginngaranan nga "$1" $2.
 
 Ini in agsob hinungdan han pagsunod han kadaan nga kaibhan o sumpay han kaagi ngadto ha pakli nga ginpara.
@@ -446,6 +450,9 @@ Alayon pagutro kahuman hin pipira ka mga minuto.',
 'viewyourtext' => "Puydi nim makit-an ngan makopya an tinikangan han '''imo mga pagliwat''' ha 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.
 Para 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.
+An mga pagbag-o hini nga pakli in makakaapekto han user interface han iba nga mga gumaramit hini nga wiki.
+Para 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.",
 'sqlhidden' => '(nakatago an SQL query)',
 'namespaceprotected' => "Diri ka gintutugutan pagliwat han mga pakli ha ngaran-lat'ang nga '''$1'''.",
 'customcssprotected' => 'Diri ka gintutugotan pagliwat hini nga CSS nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
@@ -457,22 +464,39 @@ An katadungan nga ginhatag amo in "\'\'$2\'\'".',
 
 An magdudurmara nga nagtrangka hini in naghatag hini nga eksplenasyon: "$3".',
 'invalidtitle-knownnamespace' => 'Titulo nga inbalido nga may pan-ngaran "$2 ngan teksto nga "$3"',
+'invalidtitle-unknownnamespace' => 'Diri ginkakarawat nga titulo tungod mayda ini hin mga diri nakikilala nga ngaran-lat\'ang ihap $1 ngan teksto "$2"',
 'exception-nologin' => 'Diri nakalog-in',
 'exception-nologin-text' => 'Ini nga pakli o pagbuhat in nagkikinahanglan nga ikaw in mag-log-in ha dinhi nga wiki.',
 
 # Virus scanner
+'virus-badscanner' => "Maraot nga configuration: Waray kasabti nga virus scanner: ''$1''",
 'virus-scanfailed' => 'Pakyas an pag-scan (kodigo $1)',
 'virus-unknownscanner' => 'diri-nasasabtan nga antivirus:',
 
 # Login and logout pages
+'logouttext' => "'''Nakalog-out kana.'''
+
+Puydi ka magpadayon paggamit hin {{SITENAME}} nga diri magpapakilala, o puydi ka gihapon <span class='plainlinks'>[$1 mag-log in utro]</span> ha parehas o iba nga gumaramit.",
 'welcomeuser' => '¡Uswag ngan Dayon, $1!',
+'welcomecreation-msg' => 'An im akawnt in nahimo na.
+Ayaw kalimti pagbalyo han imo [[Special:Preferences|{{SITENAME}} preperensya]].',
 'yourname' => 'Agnay hit gumaramit:',
+'userlogin-yourname' => 'Ngaran han gumaramit',
+'userlogin-yourname-ph' => 'Igbutang an imo ngaran-gumaramit',
 'yourpassword' => 'Tigaman-pagsulod:',
+'userlogin-yourpassword' => 'Tigaman pagsakob',
+'userlogin-yourpassword-ph' => 'Igbutang an imo tigaman-pagsakob',
+'createacct-yourpassword-ph' => 'Pagbutang hin uska tigaman-pagsakob',
 'yourpasswordagain' => 'Utroha pagbutang an tigaman-han-pagsakob:',
+'createacct-yourpasswordagain' => 'Igkompirma an tigaman-pagsakob',
+'createacct-yourpasswordagain-ph' => 'Igbutang an tigaman-pagsakob utro',
 'remembermypassword' => "Hinumdumi an akon pan-sakob dinhi nga panngaykay ''(browser)'' (para ha pinakamaiha $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})",
+'userlogin-remembermypassword' => 'I-log-in la ako',
+'userlogin-signwithsecure' => 'Gamit hin koneksyon nga nakakasegurado',
 'securelogin-stick-https' => 'Nagpapabilin nga masumpay ha HTTPS kahuman makalog-in',
 'yourdomainname' => 'Imo dominyo:',
 'password-change-forbidden' => 'Diri ka makakabalyo hin pulong-pagsulod ha dinhi nga wiki.',
+'externaldberror' => 'Mayda authenticaton database error o diri ka tinutugotan pag-update an imo akwant ha gawas.',
 'login' => 'Sakob',
 'nav-login-createaccount' => 'Magpalista nga masakob / paghimo hin bag-o nga akawnt',
 'loginprompt' => "Kinahanglan mo hin mga kuki (''cookie'') para makapag log-in ha {{SITENAME}}.",
@@ -481,21 +505,41 @@ An magdudurmara nga nagtrangka hini in naghatag hini nga eksplenasyon: "$3".',
 'logout' => 'Gawas',
 'userlogout' => 'Gawas',
 'notloggedin' => 'Diri sakob',
+'userlogin-noaccount' => 'Waray ka akawnt?',
+'userlogin-joinproject' => 'Tambong ha {{SITENAME}}',
 'nologin' => 'Waray ka akawnt? $1.',
 'nologinlink' => 'Paghimo hin akawnt',
 'createaccount' => 'Himo-a an akawnt',
 'gotaccount' => '¿Mayda kana akawnt? $1.',
 'gotaccountlink' => 'Sakob',
 'userlogin-resetlink' => 'Nangalimot han imo detalye han pagsakob?',
+'userlogin-resetpassword-link' => 'Ig-reset an imo tigaman-pagsakob',
+'helplogin-url' => 'Help:Pag-log-in',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bulig han pag-log-in]]',
+'createacct-join' => 'Igbutang an imo impormasyon ha ubos.',
+'createacct-emailrequired' => 'Email address',
+'createacct-emailoptional' => 'Email address (opsyonal)',
+'createacct-email-ph' => 'Igbutang an imo email address',
 'createaccountmail' => 'Gamiti hin temporaryo nga bisan ano nag password ngan igpadangat ngada ha e-mail address nga nakasurat ha ubos',
+'createacct-realname' => 'Tinuod nga ngaran (opsyonal)',
 '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-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}}',
 'badretype' => 'Diri naangay an mga tigaman-pagsulod nga im ginbutang',
 'userexists' => 'An agnay hiton gumaramit nga im ginbutang in gingamit na.
 Alayon pagpili hin lain nga ngaran.',
 'loginerror' => 'Sayop hin pagsakob',
+'createacct-error' => 'Pakyas an paghimo han akawnt',
 'createaccounterror' => 'Diri makakahimo hin akawnt: $1',
 'nocookieslogin' => '{{SITENAME}} in nagkikinahanglan hin mga kuki para makapagpalog-in hin mga gumaramit.  An im mga kuki in diri nagana.
 Alayon paganaha hira ngan utro liwat.',
+'noname' => 'Waray ka nakahatag hin maupay nga agnay-hit-gumaramit.',
 'loginsuccesstitle' => 'Malinamposon an pagsulod',
 'loginsuccess' => "'''Ikaw in nakalog-in ha {{SITENAME}} komo \"\$1\".'''",
 'nosuchuser' => 'Waray gumaramit an may-ada ngaran nga "$1".
@@ -552,8 +596,9 @@ Ikaw in naglalog-in yana...',
 
 # Special:PasswordReset
 'passwordreset' => 'igreset an tigaman-hit-pagsulod',
-'passwordreset-text' => 'Kompletoha ini nga porma para makakarawat hin email hin pahinumdom han detalye han akawnt.',
+'passwordreset-text' => 'Kumpletoha ini nga porma para makareset han imo password.',
 'passwordreset-legend' => 'igreset an tigaman-hit-pagsulod',
+'passwordreset-disabled' => 'Waray ginpaandar an password reset hini nga wiki.',
 'passwordreset-username' => 'Agnay hiton gumaramit:',
 'passwordreset-domain' => 'Dominyo:',
 'passwordreset-capture' => 'Kikitaon mo an resulta nga e-mail?',
@@ -561,9 +606,9 @@ Ikaw in naglalog-in yana...',
 'passwordreset-emailtitle' => 'Mga detalye han akawnt ha {{SITENAME}}',
 'passwordreset-emailelement' => 'Agnay han gumaramit: $1
 Temporaryo nga tigaman han pagsakob: $2',
-'passwordreset-emailsent' => 'Ginpadara hin usa ka pahinumdom nga e-mail.',
-'passwordreset-emailsent-capture' => 'Mayda pahinumdom nga ginpadangat ha im e-mail, kun diin ini in ginpapakita ha ubos.',
-'passwordreset-emailerror-capture' => 'Mayda pahinumdom nga e-mail han nahimo, kun diin ini in ginpapakita ha ubos, pero pakyas an pagpadangat ngada ha gumaramit: $1',
+'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',
 
 # Special:ChangeEmail
 'changeemail' => 'Igliwan an e-mail address',
@@ -573,6 +618,7 @@ Temporaryo nga tigaman han pagsakob: $2',
 'changeemail-oldemail' => 'Yana nga e-mail address:',
 'changeemail-newemail' => 'Bag-o nga e-mail address:',
 'changeemail-none' => '(waray)',
+'changeemail-password' => 'An imo {{SITENAME}} password:',
 'changeemail-submit' => 'Igbalyo an e-mail',
 'changeemail-cancel' => 'Pasagdi',
 
@@ -691,8 +737,13 @@ An iba nga mga batakan in diri mauupod.",
 Ini nga mga argumento in ginlaktawan.",
 'post-expand-template-argument-category' => 'Mga pakli nga nagsusulod hin ginlaktawan nga mga argumento hin batakan',
 
+# "Undo" feature
+'undo-norev' => 'An pagliwat in diri mapapawaray-buhat tungod waray ito dida o napara na.',
+'undo-summary' => 'Igpawaray-buhat an rebisyon nga $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])',
+
 # Account creation failure
 'cantcreateaccounttitle' => 'Diri makakahimo hin akawnt',
+'cantcreateaccount-text' => "An paghimo hin akawnt hini nga IP address  ('''$1''') in ginpugngan ni [[User:$3|$3]]. An rason nga ginhatag ni $3 in ''$2''",
 
 # History pages
 'viewpagelogs' => 'Kitaa an mga log para hini nga pakli',
@@ -722,12 +773,18 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'history-feed-title' => 'Kaagi han pagliwat',
 'history-feed-description' => 'Kaagi han pagliwat para hini nga pakli ha wiki',
 'history-feed-item-nocomment' => '$1 ha $2',
+'history-feed-empty' => 'An imo ginpaalayon nga pakli in waray dida.
+Bangin ini napara tikang ha wiki, o ginngaranan hin iba.
+
+[[Special:Search|pamilnga ha wiki]] para han may pagkahisumpay nga bag-o nga pakli.',
 
 # Revision deletion
 'rev-deleted-comment' => '(gintanggal an kaagi han dalikyat nga sumat)',
 'rev-deleted-user' => '(gintanggal an agnay hiton gumaramit)',
 'rev-deleted-event' => '(gintanggal an talaan han mga buhat)',
 'rev-deleted-user-contribs' => '[gintanggal an agnay-hit-gumaramit o IP address - an pagliwat in gintago tikang han mga amot]',
+'rev-deleted-text-permission' => "Ini nga rebisyon han pakli in '''ginpara'''.
+An mga detalye in mabibilngan ha [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
 'rev-suppressed-no-diff' => "Diri mo makikita ini nga kaibhan tungod nga usa ha mga rebisyon in '''ginpara'''.",
 'rev-delundel' => 'igpakita/igtago',
 'rev-showdeleted' => 'igpakita',
@@ -833,14 +890,6 @@ Diri mo ini malalabtan.',
 Pamilnga la anay pinaagi ha Google ha pagkayana.
 Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 
-# Quickbar
-'qbsettings' => 'Quickbar',
-'qbsettings-none' => 'Waray',
-'qbsettings-fixedleft' => 'Ginayad an wala',
-'qbsettings-fixedright' => 'Gin-ayad an to-o',
-'qbsettings-floatingleft' => 'Nalutaw pawala',
-'qbsettings-floatingright' => 'Nalutaw pato-o',
-
 # Preferences page
 'preferences' => 'Mga karuyag',
 'mypreferences' => 'Mga akon karuyag',
@@ -893,10 +942,12 @@ Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 'prefs-namespaces' => "Ngaran-lat'ang",
 'default' => 'aada-nga-daan',
 'prefs-files' => 'Mga paypay',
+'prefs-emailconfirm-label' => 'Kompirmasyon han email:',
+'prefs-textboxsize' => 'Kadako han editing window',
 'youremail' => 'E-mail:',
 'username' => '{{HENERO:$1|Agnay hit gumaramit}}:',
 'uid' => 'ID hit {{HENERO:$1|Gumaramit}}:',
-'prefs-memberingroups' => 'Api han {{PLURAL:$1| nga hugpo|nga mga hugpo}}:',
+'prefs-memberingroups' => '{{GENDER:$2|Api}} han {{PLURAL:$1|grupo|mga grupo}}:',
 'prefs-registration' => 'Oras han pagrehistro:',
 'yourrealname' => 'Tinuod nga ngaran:',
 'yourlanguage' => 'Yinaknan:',
@@ -908,6 +959,8 @@ Dapat diri malabaw ha $1 {{PLURAL:$1|agi|mga agi}} nga kahilaba.',
 'gender-male' => 'Lalaki',
 'gender-female' => 'Babaye',
 'email' => 'E-mail',
+'prefs-help-realname' => 'Opsyonal an tinuod nga ngaran.
+Kun pilion mo nga ihatag, ini in gagamiton ha paghatag hin atribusyon ha imo mga buhat.',
 'prefs-help-email' => "Diri pinipirit it pagbutang hin E-mail address, pero kinahanglan ini para hin pag-utro hin tigaman-hit-pagsulod (''password''), ngan kun mangalimot ka hit imo tigaman-hit-pagsulod.",
 'prefs-help-email-others' => 'Puydi mo pilion nga it iba in makakontak ha imo gamit an e-mail pinaagi han sumpay ha imo gumaramit o hiruhimangraw nga pakli.
 An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makontak ha imo.',
@@ -993,6 +1046,7 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'right-blockemail' => 'Pugnga an uska gumaramit tikang ha pagpadangat hin e-mail',
 'right-hideuser' => 'Pugnga an uska agnay-hin-gumaramit, tago-a ito tikang ha publiko',
 'right-unblockself' => 'Lugaring nga makakatanggal han pagpugong',
+'right-editinterface' => 'Igliwat an user interface',
 'right-editusercssjs' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS ngan JavaScript',
 'right-editusercss' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS',
 'right-edituserjs' => 'Iliwat an kanan iba mga gumaramit nga paypay han JavaScript',
@@ -1001,6 +1055,7 @@ Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki
 'right-mergehistory' => 'Igtampo an kaagi han mga pakli',
 'right-userrights' => 'Igliwat an ngatanan nga mga katungod han gumaramit',
 'right-userrights-interwiki' => 'Igliwat an mga katungod han gumaramit han mga gumaramit ha iba nga mga wiki',
+'right-siteadmin' => 'Igtrangka ngan igrangka an database',
 'right-sendemail' => 'Padad-i hin e-mail ngada ha iba nga mga gumaramit',
 
 # Special:Log/newusers
@@ -1093,7 +1148,7 @@ Mga pakli ha [[Special:Watchlist|imo angay timan-an]] in naka-'''bold'''.",
 
 An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para han imo kamurayaw:",
 'upload-permitted' => 'Gintutugotan nga mga klase han paypay: $1.',
-'upload-preferred' => 'Mas karugag nga mga tipo hin paypay: %1.',
+'upload-preferred' => 'Karuyag nga mga tipo hin paypay: $1.',
 'upload-prohibited' => 'Gindidire nga mga klase han paypay: $1.',
 'uploadlog' => 'Talaan hin ginkarga-pasaka',
 'uploadlogpage' => 'Talaan han mga ginkarga-paigbaw',
@@ -1113,6 +1168,7 @@ An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para ha
 'filename-tooshort' => 'An ngaran han fayl in halipot hin duro.',
 'filetype-banned' => 'Ini nga klase nga paypay in gindidire.',
 'illegal-filename' => 'An ngaran han fayl in diri gintutugutan.',
+'overwrite' => 'It pagsapaw han aada nga paypay in diri gintutugotan.',
 'unknown-error' => 'Nahitabo an waray kasasabti nga sayop.',
 'tmp-create-error' => 'Diri makakahimo hin temporaryo nga paypay.',
 'tmp-write-error' => 'Sayop ha pagsurat hin temporaryo nga paypay.',
@@ -1177,6 +1233,8 @@ $1',
 'lockmanager-fail-acquirelock' => 'Diri nakakakarawat hin trangka para hit "$1".',
 'lockmanager-fail-openlock' => 'Diri nakakaabre han nakatrangka nga paypay para hit "$1".',
 'lockmanager-fail-releaselock' => 'Diri nakakabul-iw han trangka para hit "$1".',
+'lockmanager-fail-svr-acquire' => 'Diri nakakakarawat in mga trangka ha serbidor $1.',
+'lockmanager-fail-svr-release' => 'Diri nakakabul-iw in mga trangka ha serbidor $1.',
 
 # ZipDirectoryReader
 'zip-wrong-format' => 'An espisipikado nga paypay in diri naka ZIP nga paypay.',
@@ -1189,7 +1247,9 @@ $1',
 'img-auth-nofile' => 'Waray ngada an paypay nga "$1".',
 
 # HTTP errors
-'http-host-unreachable' => 'Diri nakakaabot ha URL.',
+'http-read-error' => 'HTTP maysayop ha pagbasa.',
+'http-timed-out' => 'Naubosan hin oras ha pagpaalayon ha HTTP.',
+'http-curl-error' => 'May sayop ha pagkuha hin URL: $1',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Diri nakakaabot ha URL',
@@ -1424,8 +1484,13 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'listgrouprights-removegroup' => 'Tanggala {{PLURAL:$2|hugpo|mga hugpo}}: $1',
 'listgrouprights-addgroup-all' => 'Igdugang ngatanan nga mga hugpo',
 'listgrouprights-removegroup-all' => 'Igtanggal ngatanan nga mga hugpo',
+'listgrouprights-addgroup-self' => 'Igdugang an {{PLURAL:$2|grupo|mga grupo}} ha kalugaringon nga akawnt: $1',
+'listgrouprights-removegroup-self' => 'Igtanggal an {{PLURAL:$2|grupo|mga grupo}} tikang ha kalugaringon nga akawnt: $1',
+'listgrouprights-addgroup-self-all' => 'Igdugang an ngatanan nga mga grupo ha kalugaringon nga akawnt',
+'listgrouprights-removegroup-self-all' => 'Igtanggal an ngatanan nga mga grupo tikang ha kalugaringon nga akawnt',
 
 # Email user
+'mailnologin' => 'Waray kakadtoan nga address',
 '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',
@@ -1455,10 +1520,13 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'watchlistfor2' => 'Para ha $1 $2',
 'watchnologin' => 'Diri nakalog-in',
 'addwatch' => 'Igdugang an listahan hit binabantayan',
+'removewatch' => 'Tanggala tikang ha listahan han binabantayan',
 'watch' => 'Bantayi',
 'watchthispage' => 'Bantayi ini nga pakli',
 'unwatch' => 'Pabay-i an pagbantay',
 'unwatchthispage' => 'Undangi pagbantay',
+'notanarticle' => 'Diri uska unod nga pakli',
+'notvisiblerev' => 'An urhi nga pagliwat han iba nga gumaramit in ginpara',
 'watchlist-details' => '{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} nga aada ha imo talaan nga binabantayan, diri lakip an mga hiruhimangraw-nga-pakli.',
 'wlshowlast' => 'Igpakita an katapusan nga $1 nga mga oras $2 nga mga adlaw $3',
 'watchlist-options' => 'Mga pirilian han talaan han binabantayan',
@@ -1469,6 +1537,11 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 
 'enotif_reset' => 'Markahi an ngatanan nga mga pakli nga ginbisita na',
 'enotif_impersonal_salutation' => 'gumaramit han {{SITENAME}}',
+'enotif_subject_deleted' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginpara}} ni $2',
+'enotif_subject_created' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginhimo}} ni $2',
+'enotif_subject_moved' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginbalhin}} ni $2',
+'enotif_subject_restored' => 'An {{SITENAME}} pakli nga $1 in {{GENDER:$2|ginbalik}} ni $2',
+'enotif_subject_changed' => '{{SITENAME}} page $1 has been {{GENDER:$2|ginbal-iw}} by $2',
 'enotif_anon_editor' => 'waray magpakilala nga gumaramit $1',
 'created' => 'nahimo',
 'changed' => 'naliwanan',
@@ -1504,6 +1577,9 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'rollbacklink' => 'libot-pabalik',
 'rollbackfailed' => 'Diri malinamposon an paglibot-pabalik',
 
+# Edit tokens
+'sessionfailure-title' => 'Pakyas an sesyon',
+
 # Protect
 'protectlogpage' => 'Talaan han pinasaliporan',
 'protectedarticle' => 'pinasaliporan "[[$1]]"',
@@ -1867,6 +1943,10 @@ Makikit-an nimo an ginkuhaaan',
 'pageinfo-contentpage' => 'Ginlakip komo uska unod nga pakli',
 'pageinfo-contentpage-yes' => 'Oo',
 'pageinfo-protect-cascading-yes' => 'Oo',
+'pageinfo-category-info' => 'Impormasyon han kaarangay',
+'pageinfo-category-pages' => 'Ihap han mga pakli',
+'pageinfo-category-subcats' => 'Ihap han mga ubos-kaarangay',
+'pageinfo-category-files' => 'Ihap han mga paypay',
 
 # Patrolling
 'markaspatrolleddiff' => 'Igmarka komo ginpatrolya na',
@@ -1942,7 +2022,7 @@ An iba in daan nakatago.
 * gpsngalongitud
 * gpsngaaltitud',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Kahaluag',
 'exif-imagelength' => 'Kahitaas',
 'exif-ycbcrpositioning' => 'Pagpoposisyon han Y ngan C',
@@ -2202,11 +2282,6 @@ An iba in daan nakatago.
 'version-entrypoints-header-entrypoint' => 'Surudlan',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Aragian han paypay',
-'filepath-page' => 'Paypay:',
-'filepath-submit' => 'Kadto-a',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Pamiling hin nadoble nga mga paypay',
 'fileduplicatesearch-legend' => 'Pamiling hin nadoble',
@@ -2219,11 +2294,13 @@ An iba in daan nakatago.
 'specialpages-group-maintenance' => 'Mga sumat han pagmintinar',
 'specialpages-group-other' => 'Mga iba nga pinaurog nga pakli',
 'specialpages-group-login' => 'Magpalista nga masakob / paghimo hin bag-o nga akawnt',
+'specialpages-group-changes' => 'Mga kababag-o pala ngan mga log',
+'specialpages-group-media' => 'Sumat media ngan mga ginkarga-pasaka',
 'specialpages-group-users' => 'Mga gumaramit ngan mga katungod',
 'specialpages-group-highuse' => 'Mga pakli nga damo nagamit',
 'specialpages-group-pages' => 'Talaan hin mga pakli',
 'specialpages-group-pagetools' => 'Mga higamit han pakli',
-'specialpages-group-wiki' => 'Datos ngan mga higamit han Wiki',
+'specialpages-group-wiki' => 'Datos ngan mga higamit',
 'specialpages-group-redirects' => 'Ginreredirek an mga pakli nga pinaurog',
 'specialpages-group-spam' => 'Mga higamit han spam',
 
@@ -2258,6 +2335,8 @@ An iba in daan nakatago.
 
 # Database error messages
 'dberr-header' => 'Ini nga wiki mayda problema',
+'dberr-problems' => 'Pasayloi!
+Ini nga sityo in nageeksperyensya hin mga pagkuri teknikal.',
 
 # HTML forms
 'htmlform-submit' => 'Isumite',
index 3ab6639..b9bede3 100644 (file)
@@ -110,8 +110,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Wone limu jëfandikukat yiy topp wii xët',
 'tog-oldsig' => 'Wonendig xaatim gi teew:',
 'tog-fancysig' => 'Soppi sa xaatim (du am lëkkalekaay bu boppu)',
-'tog-externaleditor' => 'Jëfandikoo soppikaay bu biti saa su ne',
-'tog-externaldiff' => 'Jëfandiku ab méngalekaay bu biti saa su ne (ngir jëfandikukat yu xarale yi rekk, dafa laaj yenn kocc-koccal yi ci sa nosukaay)',
 'tog-showjumplinks' => 'Doxalal lëkkalekaay yii di « joowin » ak « seet »',
 'tog-uselivepreview' => 'Jëfandikul wonendi gu gaaw gi (JavaScript)',
 'tog-forceeditsummary' => 'Wax ma ko suma mottaliwul koju coppite bi',
@@ -924,14 +922,6 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
 '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.',
 
-# Quickbar
-'qbsettings' => 'Banqaasu jumtukaay',
-'qbsettings-none' => 'Kenn',
-'qbsettings-fixedleft' => 'Cammooñ',
-'qbsettings-fixedright' => 'Ndijoor',
-'qbsettings-floatingleft' => 'Ci cammooñ',
-'qbsettings-floatingright' => 'Ci ndijoor',
-
 # Preferences page
 'preferences' => 'Tànneef',
 'mypreferences' => 'Samay tànneef',
@@ -1604,7 +1594,7 @@ Coppite yiy ñëw yu xët wi ak xëtu waxtaanuwaay wi mu àndal di nañu leen fa
 'unwatchthispage' => 'Bul toppati',
 'watchnochange' => 'Lenn ci xët yi ngay topp soppikuwul ci diir bii',
 'watchlist-details' => 'Topp nga $1 {{PLURAL:$1|xët|ciy xët}}, soo waññiwaalewul xëti waxtaanuwaay yi.',
-'wlheader-showupdated' => 'Xët yi ñu soppiwoon ca sa duggu bu mujj ñoom la ñu fesal ñu <b>xëm</b>',
+'wlheader-showupdated' => 'Xët yi ñu soppiwoon ca sa duggu bu mujj ñoom la ñu fesal ñu <b>xëm</b>',
 'watchmethod-recent' => 'saytug coppite yu mujj yu xët yi ngay topp',
 'watchmethod-list' => 'saytug xët yi ñuy topp ngir ay coppite yu mujj',
 'watchlistcontains' => "Sa limu toppte am na '''$1''' {{PLURAL:$1|xët|xët}}.",
@@ -2058,24 +2048,14 @@ Dafay tax nga man a bind ngirte li ci boyotu tënk bi.',
 
 # Stylesheets
 'common.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci col yépp  */',
-'standard.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Standard  */',
-'nostalgia.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Nostalgia  */',
 'cologneblue.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Cologne Blue */',
 'monobook.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Monobook. */',
-'myskin.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu MySkin */',
-'chick.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Chick */',
-'simple.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Simple */',
 'modern.css' => '/* CSS yiñ def fii dañuy am ay njeexit ci jëfandikukatu col gu Modern */',
 
 # Scripts
 'common.js' => '/* Bépp JavaScript buñ fi duggal, xët yéppa koy yeb ak jëfandikukat bumu manti doon. */',
-'standard.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Standard keppa koy yeb  */',
-'nostalgia.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Nostalgia keppa koy yeb */',
 'cologneblue.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Cologne Blue keppa koy yeb */',
 'monobook.js' => '/*Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Monobook keppa koy yeb. */',
-'myskin.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu MySkin keppa koy yeb */',
-'chick.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Chick keppa koy yeb */',
-'simple.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Simple keppa koy yeb*/',
 'modern.js' => '/* Bépp JavaScript buñ fi duggal jëfandikukat yiy jëfandikoo col gu Modern keppa koy yeb */',
 
 # Metadata
@@ -2136,7 +2116,7 @@ Lëkkalekaay yiy toftal, ci wenn rëdd wi, dees leen di jàppee nikiy sette, maa
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Yaatuwaay',
 'exif-imagelength' => 'Kawewaay',
 'exif-usercomment' => 'Kadduy jëfëndikookat bi',
index 2da4ece..36e57dc 100644 (file)
@@ -11,6 +11,7 @@
  * @author O
  * @author Reedy
  * @author Wu-chinese.com
+ * @author Yfdyh000
  */
 
 $fallback = 'zh-hans';
@@ -46,8 +47,6 @@ $messages = array(
 'tog-shownumberswatching' => '显示监控此页个用户数目',
 'tog-oldsig' => '现在签名个预览:',
 'tog-fancysig' => '拿签名当成wiki文本(弗产生自动链接)',
-'tog-externaleditor' => '默认使用外部编辑器(仅供高手使用,需要来许电脑上作出特殊设置)',
-'tog-externaldiff' => '默认使用外部分析(仅供高手使用,需要来许电脑上作出特殊设置)',
 'tog-showjumplinks' => '启用“跳转”链接',
 'tog-uselivepreview' => '使用实时预览(Javascript)(试验)',
 'tog-forceeditsummary' => '编辑摘要为空个辰光提醒我',
@@ -900,14 +899,6 @@ $1",
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}个搜索已禁用。侬可以暂时使用Google搜索,须注意渠拉索引个{{SITENAME}}内容作兴会过时。',
 
-# Quickbar
-'qbsettings' => '快速导航排',
-'qbsettings-none' => '呒',
-'qbsettings-fixedleft' => '左许固定',
-'qbsettings-fixedright' => '右许固定',
-'qbsettings-floatingleft' => '左许氽移',
-'qbsettings-floatingright' => '右许氽移',
-
 # Preferences page
 'preferences' => '偏好',
 'mypreferences' => '个人设置',
@@ -1483,8 +1474,6 @@ $1",
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-tw' => '台湾',
@@ -1512,7 +1501,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-artist' => '作者',
 
 'exif-componentsconfiguration-0' => '弗存在',
@@ -1574,21 +1563,16 @@ Variants for Chinese language
 'autosumm-new' => '新页面:$1',
 
 # Watchlist editor
-'watchlistedit-normal-title' => '编辑监列表',
+'watchlistedit-normal-title' => '编辑监列表',
 
 # Watchlist editing tools
 'watchlisttools-view' => '查看搭界个修改',
 'watchlisttools-edit' => '查看并编辑监控列表',
-'watchlisttools-raw' => '编辑源监控列表',
+'watchlisttools-raw' => '编辑原始监视列表',
 
 # Special:Version
 'version' => '版本',
 
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件:',
-'filepath-submit' => '路径',
-
 # Special:SpecialPages
 'specialpages' => '特殊页面',
 
index a575bf4..77254aa 100644 (file)
@@ -86,8 +86,6 @@ $messages = array(
 'tog-shownumberswatching' => 'Тер халх шинҗлдг демнчнрин то үзүлх',
 'tog-oldsig' => 'Бәәдг тәвсн һарна хәләвр:',
 'tog-fancysig' => 'Эврән тәвсн һарна бики темдлһн (авто заалһта уга)',
-'tog-externaleditor' => 'Һаза чикллгч олзлх (һанцхн эрдмчнрт, тана тоолцврт шишлң көг кергтә. [//www.mediawiki.org/wiki/Manual:External_editors Дәкәд өггцн.])',
-'tog-externaldiff' => 'Һаза йилһән үзүлдг програм олзлх (һанцхн эрдмчнрт, тана тоолцврт шишлң көг кергтә [//www.mediawiki.org/wiki/Manual:External_editors Дәкәд өггцн.])',
 'tog-showjumplinks' => 'Туслмҗ заалһуд «-д/-т һарх» йовулх',
 'tog-uselivepreview' => 'Шамдһа хәләвр олзлх (JavaScript кергтә, амслһн)',
 'tog-forceeditsummary' => 'Учр-утх хоосн бәәхлә медүлх',
@@ -604,9 +602,6 @@ $1',
 'powersearch-field' => 'Хәәх',
 'powersearch-togglenone' => 'Уга',
 
-# Quickbar
-'qbsettings' => 'Ормин самбр',
-
 # Preferences page
 'preferences' => 'Дурллһн',
 'mypreferences' => 'Көгүд',
@@ -858,7 +853,7 @@ $1',
 # Special:ListGroupRights
 'listgrouprights-members' => '(мөчүдин сеткүл)',
 
-# E-mail user
+# Email user
 'emailuser' => 'Энд E-mail йовулх',
 
 # Watchlist
@@ -1156,7 +1151,7 @@ $2 шидрә һарһлһна төлә хәләтн.',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Өргн',
 'exif-imagelength' => 'Өндр',
 'exif-bitspersample' => 'Өңгин гүн',
@@ -1234,11 +1229,6 @@ $2 шидрә һарһлһна төлә хәләтн.',
 'version-software-product' => 'Һарц',
 'version-software-version' => 'Һарц',
 
-# Special:FilePath
-'filepath' => 'Боомгд хаалһ',
-'filepath-page' => 'Боомг:',
-'filepath-submit' => 'Орх',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Боомгин нерн:',
 'fileduplicatesearch-submit' => 'Хәәх',
index 2deb341..f0ab960 100644 (file)
@@ -606,7 +606,7 @@ $messages = array(
 # Special:ListGroupRights
 'listgrouprights-members' => '(მაკათურეფიშ ერკებული)',
 
-# E-mail user
+# Email user
 'emailuser' => 'მიდუჯღონით ელ.ფოშტა ათე მახვარებუს',
 
 # Watchlist
@@ -882,7 +882,7 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'სიგანე',
 'exif-imagelength' => 'სიმაღალე',
 
index 3c6c155..c8aa314 100644 (file)
@@ -46,6 +46,10 @@ $namespaceAliases = array(
        'באזונדער' => NS_SPECIAL,
        'באנוצער' => NS_USER,
        'באנוצער_רעדן' => NS_USER_TALK,
+       'משתמש' => NS_USER,
+       'שיחת_משתמש' => NS_USER_TALK,
+       'משתמשת' => NS_USER,
+       'שיחת_משתמשת' => NS_USER_TALK,
        'בילד' => NS_FILE,
        'בילד_רעדן' => NS_FILE_TALK,
        'מעדיעוויקי' => NS_MEDIAWIKI,
@@ -55,6 +59,10 @@ $namespaceAliases = array(
        'באניצער' => NS_USER,
        'באניצער_רעדן' => NS_USER_TALK,
 );
+$namespaceGenderAliases = array(
+       NS_USER      => array( 'male' => 'באַניצער', 'female' => 'באַניצערין' ),
+       NS_USER_TALK => array( 'male' => 'באַניצער_רעדן', 'female' => 'באַניצערין_רעדן' ),
+);
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'טעטיגע_באניצער' ),
@@ -216,10 +224,6 @@ $messages = array(
 'tog-shownumberswatching' => 'ווייזן דעם נומער פון בלאט אויפֿפאסערס',
 'tog-oldsig' => 'איצטיגער אונטערשריפֿט:',
 'tog-fancysig' => 'באַהאַנדלן  אונטערשריפט אַלס וויקיטעקסט (אָן אויטאמאטישן לינק)',
-'tog-externaleditor' => 'ניצן א דרויסנדיגן רעדאקטירער גרונטלעך (נאר פֿאר מומחים, דאס פֿאדערט באזונדערע קאמפיוטער שטעלונגען).
-[//www.mediawiki.org/wiki/Manual:External_editors ווײַטערע אינפֿארמאַציע.]',
-'tog-externaldiff' => 'ניצן א דרויסנדיגן פֿאַרגלײַכער גרונטלעך (נאר פֿאר מומחים, דאס פֿאדערט באזונדערע קאמפיוטער שטעלונגען)
-[//www.mediawiki.org/wiki/Manual:External_editors ווײַטערע אינפֿארמאַציע.]',
 'tog-showjumplinks' => 'באמעגלעך צוטריט לינקס פון "שפרינג צו"',
 'tog-uselivepreview' => 'באנוצט זיך מיט לייוו פאראויסדיגע ווייזונג (JavaScript) (עקספירענמעטל)',
 'tog-forceeditsummary' => 'ווארן מיך ווען איך לייג א ליידיג קורץ ווארט ענדערונג',
@@ -233,6 +237,7 @@ $messages = array(
 'tog-diffonly' => 'ווייז נישט אינהאלט אונטער די דיפערענץ',
 'tog-showhiddencats' => 'ווײַז באהאלטענע קאטעגאריעס',
 'tog-norollbackdiff' => 'היפט איבער ווײַזן אונטערשייד נאכן אויספֿירן א צוריקדריי',
+'tog-useeditwarning' => 'שטעלן א ווארענונג ווען איך לאז איבער א רעדאקטירונג בלאט מיט נישט אויפגעהיטענע ענדערונגען',
 
 'underline-always' => 'אייביג',
 'underline-never' => 'קיינמאל',
@@ -296,6 +301,18 @@ $messages = array(
 '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 דעצעמבער',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|קאַטעגאָריע|קאַטעגאָריעס}}',
@@ -331,7 +348,7 @@ $messages = array(
 
 # Cologne Blue skin
 'qbfind' => 'טרעף',
-'qbbrowse' => '×\91×\9c×¢×\98ער×\98',
+'qbbrowse' => '×\91×\9c×¢×\98ער×\9f',
 'qbedit' => 'ענדערן',
 'qbpageoptions' => 'דער בלאט',
 'qbmyoptions' => 'מיינע בלעטער',
@@ -606,9 +623,18 @@ $2',
 'welcomecreation-msg' => "מ'האט געשאפן אייער קאנטע.
 פארגעסט נישט צו ענדערן אייערע [[Special:Preferences|{{SITENAME}} פרעפערענצן]].",
 'yourname' => 'באַניצער נאָמען:',
+'userlogin-yourname' => 'באַניצער נאָמען',
+'userlogin-yourname-ph' => 'גיט אריין אייער באניצער נאמען',
 'yourpassword' => 'פאסווארט',
+'userlogin-yourpassword' => 'פאַסווארט',
+'userlogin-yourpassword-ph' => 'אַרײַנגעבן אײַער פאַסווארט',
+'createacct-yourpassword-ph' => 'אַרײַנגעבן א פאַסווארט',
 'yourpasswordagain' => 'ווידער אריינקלאפן פאסווארט',
+'createacct-yourpasswordagain' => 'באשטעטיקן פאסווארט',
+'createacct-yourpasswordagain-ph' => 'ארײַנגעבן פאסווארט נאכאמאל',
 'remembermypassword' => 'געדיינק מײַן אַרײַנלאגירן אויף דעם קאמפיוטער (ביז  $1 {{PLURAL:$1|טאָג|טעג}})',
+'userlogin-remembermypassword' => 'לאז מיך בלײַבן ארײַנלאגירט',
+'userlogin-signwithsecure' => 'ניצן זיכערן סארווער',
 'securelogin-stick-https' => 'בלייַבן פארבונדן צו HTTPS נאָכן ארײַנלאָגירן',
 'yourdomainname' => 'אײַער געביט:',
 'password-change-forbidden' => 'איר קען נישט ענדערן פאסווערטער אויף דער וויקי.',
@@ -621,25 +647,45 @@ $2',
 'logout' => 'אַרױסלאָגירן',
 'userlogout' => 'אַרױסלאָגירן',
 'notloggedin' => 'נישט איינגעשריבן',
+'userlogin-noaccount' => 'איר האט נישט קיין קאנטע?',
+'userlogin-joinproject' => 'איינטרעטן ביי {{SITENAME}}',
 'nologin' => "איר האט נישט קיין קאנטע? '''$1'''.",
 'nologinlink' => 'שאַפֿן אַ קאנטע',
 'createaccount' => 'שאַפֿן אַ נײַע קאנטע',
 'gotaccount' => "האסטו שוין א קאנטע? '''$1'''.",
 'gotaccountlink' => 'אַרײַנלאגירן',
 'userlogin-resetlink' => 'פארגעסן אײַערע אַרײַנלאָגירן פרטים?',
+'userlogin-resetpassword-link' => 'צוריקשטעלן אײַער פאַסווארט',
+'helplogin-url' => 'Help:אריינלאגירן',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|הילף מיט אריינלאגירן]]',
+'createacct-join' => 'גיט ארײַן אײַער אינפֿארמאציע אונטן.',
+'createacct-emailrequired' => 'בליצפּאָסט אַדרעס',
+'createacct-emailoptional' => 'בליצפאסט אדרעס (אפציאנאל)',
+'createacct-email-ph' => 'קלאַפט ארײַן אײַער בליצפּאָסט אַדרעס',
 'createaccountmail' => 'ניצן א פראוויזאריש פאסווארט און שיקן צום ע-פאסט אדרעס געצייכנט אונטן',
+'createacct-realname' => 'עכטער נאמען (אפציאנאל)',
 'createaccountreason' => 'אורזאַך:',
+'createacct-reason' => 'אורזאך',
+'createacct-reason-ph' => 'פֿארוואס שאפֿט איר נאך א קאנטע',
+'createacct-captcha' => 'פארזיכערן קאנטראל',
+'createacct-imgcaptcha-ph' => 'קלאפט ארײַן דעם טעקסט איר זעט אויבן',
+'createacct-submit' => 'שאפֿט אײַער קאנטע',
+'createacct-benefit-heading' => '{{SITENAME}} איז געמאכט דורך מענטשן ווי איר.',
+'createacct-benefit-body1' => '{{PLURAL:$1|רעדאַקטירונג|$1 רעדאַקטירונגען}}',
+'createacct-benefit-body2' => '$1 {{PLURAL:$1|בלאַט|בלעטער}}',
+'createacct-benefit-body3' => 'לעצטיקע {{PLURAL:$1|בײַשטײַערער}}',
 'badretype' => 'די פאסווערטער וואס איר האט אריינגעלייגט זענען נישט אייניג.',
-'userexists' => 'דער באַניצער נאָמען איז שוין געניצט. 
+'userexists' => 'דער באַניצער נאָמען איז שוין געניצט.
 ביטע קלײַבט אױס אַן אַנדער נאָמען.',
 'loginerror' => 'לאגירן פֿעלער',
+'createacct-error' => 'קאנטע שאפן פעלער',
 'createaccounterror' => 'האט נישט געקענט שאַפֿן קאנטע: $1',
 'nocookiesnew' => 'די באניצער קאנטע איז באשאפן, אבער איר זענט נישט אריינלאגירט.
 {{SITENAME}} ניצט קיכלעך אריינצולאגירן באניצער.
-איר האט קיכלעך נישט-ערמעגלעכט. 
+איר האט קיכלעך נישט-ערמעגלעכט.
 ביטע ערמעגלעכט זיי, דאן טוט אריינלאגירן מיט אייערע נייע באניצער נאמען און פאסווארט.',
-'nocookieslogin' => '{{SITENAME}} נוצט קיכלעך כדי אַרײַנלאגירן באַניצער. 
-בײַ אײַך זענען קיכלעך אומדערמעגלעכט. 
+'nocookieslogin' => '{{SITENAME}} נוצט קיכלעך כדי אַרײַנלאגירן באַניצער.
+בײַ אײַך זענען קיכלעך אומדערמעגלעכט.
 ביטע אַקטיווירט זיי און פרובירט נאכאַמאָל.',
 'nocookiesfornew' => 'מען האט נישט געשאַפֿן די באַניצער קאנטע, ווײַל מען האט נישט געקענט באַשטעטיקן איר מקור.
 טוט פֿעסטשטעלן אָז קיכלעך זענען אַקטיווירט, לאָדט אָן נאכאַמאל דעם בלאַט און פרואווט ווידער.',
@@ -649,7 +695,7 @@ $2',
 'nosuchuser' => 'נישטא קיין באניצער מיטן נאמען  "$1".
 
 קוקט איבער אײַער אויסלייג, אדער [[Special:UserLogin/signup|שאַפֿט א נײַע קאנטע]].',
-'nosuchusershort' => 'נישטאָ קיין באַניצער מיטן נאָמען "$1". 
+'nosuchusershort' => 'נישטאָ קיין באַניצער מיטן נאָמען "$1".
 ביטע באַשטעטיקט דעם אויסלייג.',
 'nouserspecified' => 'איר ברויכט ספעציפֿיצירן א באַניצער-נאָמען.',
 'login-userblocked' => 'דער באַניצער איז בלאקירט. ארײַנלאגירן נישט ערלויבט.',
@@ -726,10 +772,9 @@ $2',
 
 # Special:PasswordReset
 'passwordreset' => 'צוריקשטעלן פאַסווארט',
-'passwordreset-text' => 'דערגאַנצט די פאָרעם צוריקצושטעלן אײַער פאַסווארט.',
 'passwordreset-legend' => 'צוריקשטעלן פאַסווארט',
 'passwordreset-disabled' => 'מען האט אומאַקטיוויטר צוריקשטעלן פאַסווערטער אויף דער וויקי.',
-'passwordreset-pretext' => '{{PLURAL:$1| | קלאַפט אַרײַן איינע פֿון די דאַטן אונטן}}',
+'passwordreset-emaildisabled' => 'ע-פאסט דינסטן זענען געווארן אומאקטיווירט אויף דער דאזיקער וויקי.',
 'passwordreset-username' => 'באַניצער נאָמען:',
 'passwordreset-domain' => 'דאמען:',
 'passwordreset-capture' => 'זען  דעם געשיקטן ע־בריוו?',
@@ -742,23 +787,23 @@ $2',
 $2
 
 {{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.
-איר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה, 
+איר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,
 אדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,
  קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.',
-'passwordreset-emailtext-user' => 'באניצער $1 אויף  {{SITENAME}} האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4). 
+'passwordreset-emailtext-user' => 'באניצער $1 אויף  {{SITENAME}} האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4).
 די פאלגנדע באניצער {{PLURAL:$3|קאנטע איז|קאנטעס זענען}} פארבונדן מיט דעם ע־פאסט אדרעס:
 
 $2
 
 {{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.
-איר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה, 
+איר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,
 אדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,
  קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.',
-'passwordreset-emailelement' => 'באַניצער נאָמען: $1 
+'passwordreset-emailelement' => 'באַניצער נאָמען: $1
 פראוויזארישער פּאַראָל: $2',
 'passwordreset-emailsent' => "מ'האט געשיקט א פאסווארט צוריקשטעלן ע-פּאָסט.",
 'passwordreset-emailsent-capture' => 'מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.',
-'passwordreset-emailerror-capture' => 'מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום באניצער איז דורכגעפאלן: $1',
+'passwordreset-emailerror-capture' => 'מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'ענדערן ע-פּאָסט אַדרעס',
@@ -868,7 +913,7 @@ $2
 
 דאס געשעט געוויינלעך פון פאלגן א פארעלטערטן היסטאריע לינק צו א בלאט וואס איז געווארן אויסגעמעקט.
 פרטים קען מען געפינען אינעם [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאגבוך].',
-'userpage-userdoesnotexist' => 'באניצער קאנטע "$1" איז נישט אײַנגעשריבן. 
+'userpage-userdoesnotexist' => 'באניצער קאנטע "$1" איז נישט אײַנגעשריבן.
 קוקט איבער צי איר ווילט שאפֿן/רעדאקטירן דעם בלאט.',
 'userpage-userdoesnotexist-view' => 'באניצער קאנטע "$1" איז נישט איינגעשריבן.',
 'blocked-notice-logextract' => 'דער באַניצער איז דערווייַל פֿאַרשפאַרט.
@@ -932,7 +977,7 @@ $2
 
 אזוי אויך, זאגט איר צו אז איר האט דאס געשריבן אליין, אדער דאס איבערקאפירט פון א מקור מיט פולן רשות דאס מפקיר זיין (זעט $1 פאר מער פרטים).
 '''זיכט נישט באניצן מיט שטאף וואס איז באשיצט מיט קאפירעכטן!'''",
-'longpageerror' => "'''פעלער: דער טעקסט וואס איר האט ארײַנגעשטעלט איז לאנג {{PLURAL:$1|איין קילאבייט|$1 קילאבייטן}}, וואס איז לענגער פון דעם מאקסימום פון {{PLURAL:$2|איין קילאבייט|$2 קילאבייטן}}. 
+'longpageerror' => "'''פעלער: דער טעקסט וואס איר האט ארײַנגעשטעלט איז לאנג {{PLURAL:$1|איין קילאבייט|$1 קילאבייטן}}, וואס איז לענגער פון דעם מאקסימום פון {{PLURAL:$2|איין קילאבייט|$2 קילאבייטן}}.
 ער קען נישט ווערן אפגעהיטן.'''",
 'readonlywarning' => "'''ווארענונג: די דאטנבאזע איז געווארן פארשלאסן פאר אויפהאלטונג, ממילא וועט איר נישט קענען אפהיטן אייערע ענדערונגען אצינד. '''
 איר קענט קאפירן און ארײַנלייגן דעם טעקסט אריין צו א טעקסט טעקע און דאס דארטן אפהיטן אויף שפעטער.
@@ -979,6 +1024,8 @@ $2
 'content-failed-to-parse' => 'פארזן $2 אינהאלט פאר $1 מאדעל דורכגעפאלן: $3',
 'invalid-content-data' => 'אומגילטיקע אינהאלט דאטן',
 'content-not-allowed-here' => '"$1" אינהאלט נישט דערלויבט אויף בלאט [[$2]]',
+'editwarning-warning' => 'איבערלאזן דעם בלאט קען גורם זײַן פֿארלירן אײַערע ענדערונגען.
+אויב איר זענט ארײַנלאגירט, קענט איר מבטל זײַן די דאזיגע ווארענונג אין דער "באארבעטן" אפטיילונג פון אײַערע פרעפערענצן.',
 
 # Content models
 'content-model-wikitext' => 'וויקיטעקסט',
@@ -1003,6 +1050,7 @@ $2
 'node-count-exceeded-warning' => 'קנופנצאל אויפן בלאט צו הויך',
 'expansion-depth-exceeded-category' => "בלעטער וואו מ'האט אריבערגעשטיגן די פארברייטערונג טיף",
 'expansion-depth-exceeded-warning' => 'בלאט גייט אריבער דער פארברייטערונג טיף',
+'parser-unstrip-loop-warning' => 'פעטליע געטראפֿן',
 'converter-manual-rule-error' => 'געטראפן א גרײַז אין האנטלעכן שפראך־קאנווערטירן כלל',
 
 # "Undo" feature
@@ -1260,15 +1308,7 @@ $1",
 'searchdisabled' => "{{SITENAME}} זוך איז אָפאַקטיווירט.
 צווישנצײַט קענט איר זוכן מיט גוגל.
 געב אכט אז ס'איז מעגלעך אַז זייער אינדעקס פֿון {{SITENAME}} אינהאַלט איז אפשר פֿאַרעלטערט.",
-
-# Quickbar
-'qbsettings' => 'גיכפאַס',
-'qbsettings-none' => 'גארנישט',
-'qbsettings-fixedleft' => 'קבוע לינקס',
-'qbsettings-fixedright' => 'קבוע רעכטס',
-'qbsettings-floatingleft' => 'שווימנדיג לינקס',
-'qbsettings-floatingright' => 'שווימנדיג רעכטס',
-'qbsettings-directionality' => 'פֿעסט, אפהענגיק אויף דער שריפֿט ריכטונג פֿון אײַער שפראַך.',
+'search-error' => "ס'האט פאסירט א פֿעלער ביים זוכן: $1",
 
 # Preferences page
 'preferences' => 'פרעפֿערענצן',
@@ -1365,7 +1405,7 @@ $1",
 'email' => 'ע-פאסט',
 'prefs-help-realname' => '* עכטער נאמען (אפציאנאל): אויב וועט איר אויסוועלן צוצישטעלן דאס, וועט גענוצט ווערן צו געבן אטריביאציע צו אייער ארבייט.',
 'prefs-help-email' => 'ע-פאסט אַדרעס איז ברירהדיק, אבער עס דערמעגליכט אז מען קען אייך שיקן א ניי פאסווארט טאמער איר פֿארגעסט דאָס אַלטע.',
-'prefs-help-email-others' => 'איר קענט אויך אויסקלייבן צו לאזן אנדערע פֿארבינדן מיט אייך דורך ע־פאסט דורך א לינק אויף אייער באניצער אדער שמועס בלאט. 
+'prefs-help-email-others' => 'איר קענט אויך אויסקלייבן צו לאזן אנדערע פֿארבינדן מיט אייך דורך ע־פאסט דורך א לינק אויף אייער באניצער אדער שמועס בלאט.
 מען וועט נישט אנטפלעקן אייער ע־פאסט אדרעס ווען אנדערע פֿארבינדן זיך מיט אייך.',
 'prefs-help-email-required' => 'בליצפאסט אדרעס באדארפט.',
 'prefs-info' => 'גרונטלעכע אינפֿארמאַציע',
@@ -1469,6 +1509,7 @@ $1",
 'right-block' => 'בלאקירן אַנדערע באַניצער פֿון רעדאַקטירן',
 'right-blockemail' => 'בלאקירן א באַניצער פֿון שיקן ע־פאסט',
 'right-hideuser' => 'בלאקירן באַניצער־נאָמען און פֿאַרבארגן אים',
+'right-ipblock-exempt' => 'ארומגיין IP בלאקן, אויטאבלאקן און גרייך־בלאקן',
 'right-unblockself' => 'זיך אליין אויפֿשפאַרן',
 'right-protect' => 'ענדערן שוץ ניוואען און רעדאַגירן געשיצטע בלעטער',
 'right-editprotected' => 'רעדאַגירן געשיצטע בלעטער (אָן קאַסקאַדן שוץ)',
@@ -1663,11 +1704,11 @@ $1",
 'file-thumbnail-no' => "דער טעקע־נאמען הייבט אן מיט <strong>$1</strong>.
 זי זעט אויס ווי א פארקלענערט בילד ''(מיניאטור)''.
 טאמער האט איר דאס בילד אין פולער רעזאלוציע טוט עס ארויפלאדן, אנדערשט זייט אזוי גוט און ענדערט דעם טעקע־נאמען.",
-'fileexists-forbidden' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין, און מען קען זי נישט אַריבערשרײַבן. 
-אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען. 
+'fileexists-forbidden' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין, און מען קען זי נישט אַריבערשרײַבן.
+אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען.
 [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין אינעם צענטראַלן אַרכיוו.
-אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען. 
+אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'די טעקע איז א דופליקאַט פון די פֿאלגנדע {{PLURAL:$1|טעקע|טעקעס}}:',
 'file-deleted-duplicate' => "א טעקע אידענטיש מיט דער טעקע ([[:$1]]) האט מען שוין אויסגעמעקט.
@@ -1720,6 +1761,7 @@ $1",
 # File backend
 'backend-fail-stream' => 'קען נישט מאכן שטראמען טעקע $1.',
 'backend-fail-notexists' => 'נישט פֿאראן די טעקע $1.',
+'backend-fail-notsame' => 'א נישט־אידענטישע טעקע עקזיסטירט שוין ביי "$1".',
 'backend-fail-invalidpath' => '$1 איז נישט קיין גילטיקער שפייכלערן שטעג.',
 'backend-fail-delete' => 'קען נישט אויסמעקן טעקע $1.',
 'backend-fail-describe' => 'קען נישט ענדערן מעטאדאטן פאר דער טעקע "$1".',
@@ -1736,7 +1778,11 @@ $1",
 
 # Lock manager
 'lockmanager-notlocked' => 'מ\'קען נישט אויפֿשליסן "$1"; ער איז נישט פֿארשלאסן.',
+'lockmanager-fail-closelock' => 'נישט מעגלעך פארשפארן שלאס טעקע פאר "$1".',
 'lockmanager-fail-deletelock' => 'נישט מעגלעך אויסמעקן שלאס טעקע פאר "$1".',
+'lockmanager-fail-acquirelock' => 'נישט מעגלעך צו באקומען שלאס טעקע פאר "$1".',
+'lockmanager-fail-openlock' => 'נישט מעגלעך עפֿענען שלאס טעקע פאר "$1".',
+'lockmanager-fail-releaselock' => 'נישט מעגלעך באפֿרייען שלאס טעקע פאר "$1".',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'געטראפן א גרײַז ביים עפענען די טעקע פאר ZIP־קאנטראלירונג.',
@@ -1746,6 +1792,7 @@ $1",
 'uploadstash' => 'אַרויפֿלאָד רעזערוו',
 'uploadstash-clear' => 'אויסמעקן טעקעס פון זאפאס',
 'uploadstash-nofiles' => 'איר האט נישט קיין טעקעס אין זאפאס.',
+'uploadstash-errclear' => 'אוועקנעמען די טעקעס דורכגעפאלן.',
 'uploadstash-refresh' => 'דערפֿרישן די רשימה פון טעקעס',
 
 # img_auth script messages
@@ -1765,7 +1812,6 @@ $1",
 'http-read-error' => 'HTTP לייענען גרײַז.',
 'http-timed-out' => 'HTTP בקשה אויסגעגאַנגען.',
 'http-curl-error' => 'גרײַז בײַם ברענגען URL: $1',
-'http-host-unreachable' => "מ'קען נישט דערגרייכן דעם URL",
 'http-bad-status' => "ס'איז געווען א פראבלעם ביים HTTP פֿאַרלאַנג: $1 $2",
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1915,6 +1961,9 @@ $1",
 'disambiguationspage' => 'Template:באדייטן',
 'disambiguations-text' => "די קומענדיגע בלעטער פארבינדן צו א '''באדייטן בלאט'''. זיי ברויכן ענדערשט פֿארבינדן צו דעם רעלעוואנטן טעמע בלאט.<br />א בלאט ווערט פאררעכענט פאר א באדײַטן בלאט אויב ער באניצט זיך מיט א מוסטער וואס איז פארבינדען פון [[MediaWiki:Disambiguationspage]].",
 
+'pageswithprop' => 'בלעטער מיט א בלאט אייגנשאפט',
+'pageswithprop-legend' => 'בלעטער מיט א בלאט אייגנשאפט',
+'pageswithprop-text' => 'דער בלאט האלט א רשימה פון בלעטער וואס ניצן א געוויסע בלאט אייגנשאפט.',
 'pageswithprop-prop' => 'אייגנשאפט נאמען:',
 'pageswithprop-submit' => 'גייט',
 
@@ -2087,7 +2136,7 @@ $1",
 'listgrouprights' => 'באַניצער גרופע רעכטן',
 'listgrouprights-summary' => "פֿאלגנד איז א רשימה פֿון באַניצער גרופעס דעפֿינירט אויף דער דאָזיקער וויקי, מיט זײַערע אַסאציאירטע צוטריט רעכטן.
 ס'קען זײַן  [[{{MediaWiki:Listgrouprights-helppage}}|מער אינפֿארמאַציע]] וועגן איינציקע רעכטן.",
-'listgrouprights-key' => '* <span class="listgrouprights-granted">נאָכגעגעבן רעכט</span> 
+'listgrouprights-key' => '* <span class="listgrouprights-granted">נאָכגעגעבן רעכט</span>
  * <span class="listgrouprights-revoked">אָפגערופֿן רעכט</span>',
 'listgrouprights-group' => 'גרופע',
 'listgrouprights-rights' => 'רעכטן',
@@ -2162,8 +2211,8 @@ $1",
 'notvisiblerev' => 'די באארבעטונג איז געווארן אויסגעמעקט',
 'watchnochange' => 'קיינע פֿון אײַערע אויפֿגעפאַסטע בלעטער האבן זיך געענדערט אין דעם צײַט פעריאד געוויזן.',
 'watchlist-details' => '{{PLURAL:$1|איין בלאט|$1 בלעטער}} אין אייער אויפֿפאסן ליסטע (נישט רעכענען  רעדן בלעטער).',
-'wlheader-enotif' => 'ע-פאסט מעלדונג ערמעגליכט.',
-'wlheader-showupdated' => "* בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''",
+'wlheader-enotif' => 'ע-פאסט מעלדונג ערמעגליכט.',
+'wlheader-showupdated' => "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
 'watchmethod-recent' => 'קאנטראלירן לעצטע ענדערונגען פֿאַר אויפֿגעפאַסטע בלעטער',
 'watchmethod-list' => 'קאנטראלירן בלעטער אין אַכטונג־ליסטע פֿאַר לעצטע ענדערונגען',
 'watchlistcontains' => 'אייער אויפֿפאסונג ליסטע אנטהאלט {{PLURAL:$1|איין בלאט|$1 בלעטער}}.',
@@ -2205,7 +2254,7 @@ $PAGEINTRO $NEWPAGE
 
 עס וועט מער נישט זיין קיין מעלדונגען אין פאל פון נאך ענדערונגען נאר אויב איר וועט באזוכן דעם בלאט.
 איר קענט אויך צוריקשטעלן די מעלדונגען פאנען פון אלע אייערע אויפֿגעפאסטע בלעטער אין אייער אויפפאסונג ליסטע.
-             
+
 אייער פֿריינטליכע  {{SITENAME}} מעלדונגען סיסטעם
 
 --
@@ -2356,8 +2405,8 @@ $UNWATCHURL
 'undeleterevisions' => '{{PLURAL:$1|איין ווערסיע|$1 ווערסיעס}} אַרכיווירט',
 'undeletehistory' => 'אויב איר שטעלט צוריק דעם בלאַט, וועלן אַלע רעוויזיעס ווערן צוריקגעשטעלט אין דער היסטאריע.
 אויב מען האט באַשאַפֿן א בלאַט מיטן זעלבן נאָמען זײַטן אויסמעקן, וועלן די צוריקגעשטעלטע רעוויזיעס זיך באַווײַזן אין דער פֿריערדיקער היסטאריע.',
-'undeletehistorynoadmin' => 'דער בלאַט איז געווארן אויסגעמעקט. 
- די סיבה פֿאַרן אויסמעקן ווערט געוויזן אין דער רעזומע אונטן, צוזאמען מיט פרטים פון די באַניצער וואס האבן רעדאַקטירט דעם בלאַט פֿאַרן אויסמעקן. 
+'undeletehistorynoadmin' => 'דער בלאַט איז געווארן אויסגעמעקט.
+ די סיבה פֿאַרן אויסמעקן ווערט געוויזן אין דער רעזומע אונטן, צוזאמען מיט פרטים פון די באַניצער וואס האבן רעדאַקטירט דעם בלאַט פֿאַרן אויסמעקן.
  דער טעקסט פון די אויסגעמעקטע ווערסיעס איז דערגרײַכלעך בלויז צו סיסאפן.',
 'undelete-revision' => 'אויסגעמעקטע ווערסיע פֿון $1 (פֿון $4, אום $5) פֿון $3:',
 'undeleterevision-missing' => 'אומגילטיקע אדער פֿעלנדיקע ווערסיע.
@@ -2544,7 +2593,7 @@ $1',
 דער פֿאַרשטיקונג לאג איז צוגעשטעלט אונטן:',
 'blocklogentry' => 'בלאקירט "[[$1]]" אויף אַ תקופה פון $2 $3',
 'reblock-logentry' => 'גענדערט די בלאקירונג דעפיניציעס פון [[$1]] מיטן צייט אפלויף פון $2 $3',
-'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצער. 
+'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצער.
 איי פי אדרעסן וואס זענען בלאקירט אויטאמאטיש ווערן נישט אויסגערעכענט דא.
 זעט די איצטיקע [[Special:BlockList|ליסטע פון בלאקירטע באניצער]].',
 'unblocklogentry' => 'אומבלאקירט $1',
@@ -2563,7 +2612,7 @@ $1',
 'ipb-needreblock' => '$1 איז שוין בלאקירט. צי ווילט איר טוישן די באַצייכנונגען?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|אנדער בלאקירונג|אנדערע בלאקירונגען}}',
 'unblock-hideuser' => 'איר קענט נישט אומבלאקירן דעם באניצער, ווײַל זײַן באַניצער נאָמען איז פֿאַרבארגן.',
-'ipb_cant_unblock' => "גרײַז: בלאק ID $1 נישט געפֿונען. 
+'ipb_cant_unblock' => "גרײַז: בלאק ID $1 נישט געפֿונען.
 ס'מעגליך שוין געווארן באַפֿרייט.",
 'ipb_blocked_as_range' => "טעות: דער IP אַדרעס $1 איז נישט בלאקירט גראָד און מען קען אים נישט אויפֿבלאקירן.
 דאך איז ער בלאקירט אַלס א טייל פֿון דעם אָפשטאַנד $2, וואָס מ'קען יא אויפֿבלאקירן.",
@@ -2606,11 +2655,11 @@ $1',
 
 איר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צום געהעריגן ציל.
 
-דער בלאט וועט '''נישט''' ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען. 
+דער בלאט וועט '''נישט''' ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.
 פשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרייבן אן עקסיסטירנדן בלאט.
 
 '''ווארענונג!'''
- אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט; 
+ אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט;
 ביטע פֿארזיכערט אז איר פֿארשטייט די ווייטגרייכנדע קאנסקווענסן צו דער אקציע בעפֿאר איר פֿירט דאס אויס.",
 'movepagetext-noredirectfixer' => "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.
 
@@ -2620,7 +2669,7 @@ $1',
 
 איר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.
 
-אַכטונג: דער בלאַט וועט '''נישט''' ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז ליידיג. אדער ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען. 
+אַכטונג: דער בלאַט וועט '''נישט''' ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז ליידיג. אדער ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.
 פשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.
 
 '''ווארענונג:''' אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
@@ -2781,7 +2830,7 @@ $1',
 'import-nonewrevisions' => 'אַלע רעוויזיעס שוין אימפארטירט.',
 'xml-error-string' => '$1 בײַ שורה $2, זייל $3 (בייט $4): $5',
 'import-upload' => 'אַרויפֿלאָדן XML דאַטן',
-'import-token-mismatch' => 'אָנווער פון סעסיע דאַטן. 
+'import-token-mismatch' => 'אָנווער פון סעסיע דאַטן.
  ביטע פרובירט נאכאמאל.',
 'import-invalid-interwiki' => 'נישט מעגלעך צו אימפארטירן פון ספעציפֿירטער וויקי.',
 'import-error-edit' => 'דעם בלאט "$1" קען מען נישט אימפארטירן ווייל איר האט נישט די רעכט אים צו רעדאקטירן.',
@@ -2880,13 +2929,8 @@ $1',
 
 # Stylesheets
 'common.css' => '/* CSS געשריבן דא וועט אפילירן און באיינפלוסן אלע סקינס */',
-'standard.css' => '/* CSS געשטעלט דא ווירקט אויפן סטאנדארט סקין */',
-'nostalgia.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן נאסטאלגיע סקין */',
 'cologneblue.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן קעלנישן־בלוי סקין */',
 'monobook.css' => '/* סטייל דא געלייגט וועט באאיינפלוסן דעם Monobook סקין */',
-'myskin.css' => '/* CSS געשטעלט דא ווירקט אויפן MySkin סקין */',
-'chick.css' => '/* CSS געשטעלט דא ווירקט אויפן טשיק סקין */',
-'simple.css' => '/* CSS געשטעלט דא ווירקט אויפן איינפאך סקין */',
 'modern.css' => '/* CSS געשטעלט דא ווירקט אויפן מאדערנעם סקין */',
 'vector.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן וועקטאר סקין */',
 
@@ -2962,13 +3006,8 @@ $1',
 'pageinfo-category-files' => 'צאָל טעקעס',
 
 # Skin names
-'skinname-standard' => 'קלאסיש',
-'skinname-nostalgia' => 'נאסטאלגיע',
 'skinname-cologneblue' => 'קעלניש בלוי',
 'skinname-monobook' => 'מאנאבוק',
-'skinname-myskin' => 'מיין סקין',
-'skinname-chick' => 'טשיק',
-'skinname-simple' => 'איינפֿאַך',
 'skinname-modern' => 'מאדערן',
 'skinname-vector' => 'וועקטאר',
 
@@ -3085,7 +3124,7 @@ $1',
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'ברייט',
 'exif-imagelength' => 'הייך',
 'exif-bitspersample' => 'ביטס פער באשטאנדטייל',
@@ -3237,7 +3276,7 @@ $1',
 'exif-intellectualgenre' => 'ארט  איינהייט',
 'exif-subjectnewscode' => 'טעמע קאד',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'אומ-צאמגעקוועטשט',
 
 'exif-copyrighted-true' => 'געשיצט מיט קאפירעכט',
@@ -3453,7 +3492,7 @@ $3
 $5
 
 דער באשטעטיגונג קאד גייט אויס $4.',
-'confirmemail_body_set' => 'עמעצער, ווארשיינליך איר, פֿון IP אַדרעס $1, 
+'confirmemail_body_set' => 'עמעצער, ווארשיינליך איר, פֿון IP אַדרעס $1,
 האט געענדערט דעם ע־פאסט אַדרעס פֿון דער קאנטע "$2" צו דעם אדרעס אויף {{SITENAME}}.
 
 צו באַשטעטיקן אַז די קאנטע געהערט טאקע צו אייך און ווידער אַקטיווירן ע־פאסט דינסטן אויף {{SITENAME}}, ביטע טוט עפֿענען דעם לינק אין אייער בלעטערער:
@@ -3612,17 +3651,13 @@ $5
 'version-version' => '(ווערסיע $1)',
 'version-license' => 'ליצענץ',
 'version-poweredby-others' => 'אַנדערע',
+'version-credits-summary' => 'מיר ווילן אנערקענען די פֿאלגנדע מענטשן פֿאר זייער בײַשטײַערוג צו [[Special:Version|מעדיעוויקי]].',
 'version-software' => 'אינסטאַלירט ווייכוואַרג',
 'version-software-product' => 'פראדוקט',
 'version-software-version' => 'ווערסיע',
 'version-entrypoints-header-entrypoint' => 'אריינגאנג פונקט',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'טעקע שטעג',
-'filepath-page' => 'טעקע:',
-'filepath-submit' => 'גיין',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'זוכן דופליקאַטע טעקעס',
 'fileduplicatesearch-summary' => 'זוכן דופליקאטע טעקעס באזירט אויף האש־ווערטן.',
@@ -3710,23 +3745,25 @@ $5
 'htmlform-submit' => 'אײַנגעבן',
 'htmlform-reset' => 'צוריקשטעלן ענדערונגען',
 'htmlform-selectorother-other' => 'אַנדער',
+'htmlform-no' => 'ניין',
+'htmlform-yes' => 'יא',
 
 # SQLite database support
 'sqlite-has-fts' => '$1 מיט פולן-טעקסט זוכן שטיץ',
 'sqlite-no-fts' => '$1 אָן פֿולן-טעקסט זוכן שטיץ',
 
 # New logging system
-'logentry-delete-delete' => '$1 האט אויסגעמעקט בלאט $3',
-'logentry-delete-restore' => '$1 האט צוריקגעשטעלט בלאט $3',
-'logentry-delete-event' => '$1 האט געענדערט די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
-'logentry-delete-revision' => '$1 האט געענדערט די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
-'logentry-delete-event-legacy' => '$1 האט געענדערט די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
-'logentry-delete-revision-legacy' => '$1 האט געענדערט די זעבארקייט פון רעוויזיעס אויף בלאט $3',
-'logentry-suppress-delete' => '$1 האט אונטערדריקט בלאט $3',
-'logentry-suppress-event' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
-'logentry-suppress-revision' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
-'logentry-suppress-event-legacy' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
-'logentry-suppress-revision-legacy' => '$1 האט געהיימלעך געענדערט די זעבארקייט פון רעוויזיעס אויף בלאט $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|האט אויסגעמעקט}} בלאט $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|האט צוריקגעשטעלט }} בלאט $3',
+'logentry-delete-event' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון {{PLURAL:$5|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$2|האט געענדערט}} די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
+'logentry-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|א לאגבוך אקטיוויטעט|$5 לאגבוך אקטיוויטעטן}} אויף $3: $4',
+'logentry-suppress-revision' => '$1 {{GENDER:$2|האט געהיימלעך געענדערט}}  די זעבארקייט פון  {{PLURAL:$5|א רעוויזיע|$5 רעוויזיעס}} אויף בלאט $3: $4',
+'logentry-suppress-event-legacy' => '$1 {{GENDER:$2|האט געהיימלעך געענדערט}}  די זעבארקייט פון לאגבוך אקטיוויטעטן אויף $3',
+'logentry-suppress-revision-legacy' => '!$1 {{GENDER:$2|האט געהיימלעך געענדערט}}  די זעבארקייט פון רעוויזיעס אויף בלאט $3',
 'revdelete-content-hid' => 'אינהאלט פארהוילן',
 'revdelete-summary-hid' => 'רעדאקטירונג קאנספעקט פארהוילן',
 'revdelete-uname-hid' => 'באניצער־נאמען פארהוילן',
@@ -3735,19 +3772,20 @@ $5
 'revdelete-uname-unhid' => 'באַניצער נאָמען ארויסגעגעבן',
 'revdelete-restricted' => 'צוגעלייגט באגרעניצונגען פאר סיסאפן',
 'revdelete-unrestricted' => 'אוועקגענומען באגרעניצונגען פאר סיסאפן',
-'logentry-move-move' => '$1 האט באוועגט בלאט $3 צו $4',
-'logentry-move-move-noredirect' => '$1 האט באוועגט בלאט $3 צו $4 אן לאזן א ווייטערפירונג',
-'logentry-move-move_redir' => '$1 האט באוועגט $3 צו $4 אריבער ווייטערפירונג',
-'logentry-move-move_redir-noredirect' => '$1 האט באוועגט $3 צו $4 אריבער א ווייטערפירונג אן לאזן א  ווייטערפירונג',
-'logentry-patrol-patrol' => '$1 האט מארקירט רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
-'logentry-patrol-patrol-auto' => '$1 האט אויטאמאטיש מארקירט רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
-'logentry-newusers-newusers' => 'באניצער קאנטע $1 געשאפן געווארן',
-'logentry-newusers-create' => 'באניצער קאנטע $1 געשאפן געווארן',
-'logentry-newusers-create2' => 'באניצער קאנטע $1 געשאפן געווארן דורך $3',
-'logentry-newusers-autocreate' => 'קאנטע $1 באשאפן אויטאמאטיש',
-'logentry-rights-rights' => '$1 האט געביטן גרופע מיטגלידערשאַפֿט פֿאַר $3 פֿון $4 אויף $5',
-'logentry-rights-rights-legacy' => '$1 האט געביטן גרופע מיטגלידערשאפט פאר $3',
-'logentry-rights-autopromote' => '$1 אויטאמאטיש פראמאווירט פון $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|האט באוועגט}} $3 צו $4 אריבער ווייטערפירונג',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|האט באוועגט}} $3 צו $4 אריבער א ווייטערפירונג אן לאזן א  ווייטערפירונג',
+'logentry-patrol-patrol' => '$1 {{GENDER:$2|האט מארקירט}} רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
+'logentry-patrol-patrol-auto' => '$1 {{GENDER:$2|האט אויטאמאטיש מארקירט}} רעוויזיע $4 פון בלאט $3 ווי קאנטראלירט',
+'logentry-newusers-newusers' => 'באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}}',
+'logentry-newusers-create' => 'באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}}',
+'logentry-newusers-create2' => 'באניצער קאנטע $1 איז {{GENDER:$2|געשאפן געווארן}} דורך $3',
+'logentry-newusers-byemail' => 'באניצער קאנטע $3 איז {{GENDER:$2|געשאפן געווארן}} דורך $1 און דאס פאסווארט איז געשיקט געווארט דורך ע־פאסט',
+'logentry-newusers-autocreate' => 'באַניצער קאנטע $1 {{GENDER:$2|געשאפן}} אויטאמאטיש',
+'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',
 'rightsnone' => '(גארנישט)',
 
 # Feedback
@@ -3802,6 +3840,7 @@ $5
 'api-error-ok-but-empty' => 'אינערלעכער גרײַז: קיין ענטפֿער פֿון סערווירער.',
 'api-error-overwrite' => 'מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע.',
 'api-error-stashfailed' => 'אינערלעכער גרײַז: סערווירער האט נישט געקענט אײַנשפייכלערן צייַטווייַליקע טעקע.',
+'api-error-publishfailed' => 'אינערלעכער גרײַז: סערווירער האט נישט געזדאנזשעט פארעפנטלעכן צייַטווייַליקע טעקע.',
 'api-error-timeout' => 'דער סערווירער האט ניט געענטפֿערט אינערהאַלב דער דערוואַרטעטער צייַט.',
 'api-error-unclassified' => 'אַן אומבאַקאַנט טעות איז פֿארגעקומען.',
 'api-error-unknown-code' => 'אומבאַקאַנט טעות: " $1 "',
@@ -3822,4 +3861,7 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|יארהונדערט|יארהונדערטער}}',
 'duration-millennia' => '$1 {{PLURAL:$1|יארטויזנט|יארטויזנטער}}',
 
+# Image rotation
+'rotate-comment' => 'בילד געדרייט דורך $1 {{PLURAL:$1|גראד}} זייגערווייז',
+
 );
index 47d8d0f..0b91405 100644 (file)
@@ -83,8 +83,6 @@ $messages = array(
 'tog-shownumberswatching' => "S'àfihàn iye àwọn oníṣe tí wọn tẹjú mọ́ọ",
 'tog-oldsig' => 'Ìtọwọ́bọ̀wé tówà:',
 'tog-fancysig' => 'Ṣe ìtọwọ́bọ̀wé bíi ìkọ wiki (láìní ìjápọ̀ fúnrararẹ̀)',
-'tog-externaleditor' => 'Lo aláàtúnṣe ọ̀tọ̀ látìbẹ̀rẹ̀ (fún àwọn tó mọ̀ nìkan, ìtò ọ̀tọ̀ọ̀tọ̀ pọndandan lórí kọ̀mpútà yín. [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
-'tog-externaldiff' => 'Lo awoìyàtò ọ̀tọ̀ látìbẹ̀rẹ̀ (fún àwọn tó mọ̀ nìkan, ìtò ọ̀tọ̀ọ̀tọ̀ pọndandan lórí kọ̀mpútà yín. [//www.mediawiki.org/wiki/Manual:External_editors Ìfọ̀rọ̀tónilétí mìhínhìn.])',
 'tog-showjumplinks' => 'Ìgbàláyè "fò lọ sí" àwọn ìjápọ̀ ìṣeégbà',
 'tog-uselivepreview' => 'Ìlo àkọ́kọ́yẹ̀wò lẹ́ṣẹ̀kẹṣẹ̀ (JavaScript pọndandan) (aládànhánwò)',
 'tog-forceeditsummary' => 'Kìlọ̀ fún mi tí àkótán àtúnṣe bá jẹ́ òfo',
@@ -98,6 +96,7 @@ $messages = array(
 'tog-diffonly' => 'Kò gbọdọ̀ ṣàfihàn àkóónú ojúewé lábẹ́ àwọn ìyàtọ̀',
 'tog-showhiddencats' => "Ṣ'àfihàn àwọn ẹ̀ka pípamọ́",
 'tog-norollbackdiff' => 'Fo ìyàtọ̀ lẹ́yín síṣe ìyísẹ́yìn',
+'tog-useeditwarning' => 'Kìlọ̀ fún mi tí mo bá únkúrò ní ojúewé àtúnṣe láì tíì mupamọ́',
 
 'underline-always' => 'Nígbà gbogbo',
 'underline-never' => 'Rárá',
@@ -186,6 +185,7 @@ $messages = array(
 'newwindow' => '(yíò sí nínú fèrèsè tuntun)',
 'cancel' => 'Fagilé',
 'moredotdotdot' => 'Ẹ̀kúnrẹ́rẹ́...',
+'morenotlisted' => 'Àtòjọ kíkúnrẹ́rẹ́ kò sí...',
 'mypage' => 'Ojúewé',
 'mytalk' => 'Ọ̀rọ̀',
 'anontalk' => 'Ọ̀rọ̀ fún IP yí',
@@ -467,9 +467,18 @@ Olùṣeàmójútó tó típa ṣe àlàyé yìí: "$3".',
 'welcomecreation-msg' => "A ti ṣ'èdá àpamọ́ yín.
 Ẹ mọ́ gbàgbé l'áti ṣ'àtúnṣe [[Special:Preferences|{{SITENAME}} àwọn ìfẹ́ràn]] yín.",
 'yourname' => 'Orúkọ oníṣe:',
+'userlogin-yourname' => 'Orúkọ olùṣe',
+'userlogin-yourname-ph' => 'Ẹ kọ orúkọ olùṣe yín',
 'yourpassword' => 'Ọ̀rọ̀ìpamọ́:',
+'userlogin-yourpassword' => 'Ọ̀rọ̀ìpamọ́',
+'userlogin-yourpassword-ph' => 'Ẹ kọ ọ̀rọ̀ìpamọ́ yín',
+'createacct-yourpassword-ph' => 'Ẹ kọ ọ̀rọ̀ìpamọ́',
 'yourpasswordagain' => 'Kọ ọ̀rọ̀ìpamọ́ lẹ́ẹ̀kansí:',
+'createacct-yourpasswordagain' => 'Ẹ ṣe ìfidájú ọ̀rọ̀ìpamọ́',
+'createacct-yourpasswordagain-ph' => 'Ẹ kọ ọ̀rọ̀ìpamọ́ lẹ́ẹ̀kan síi',
 'remembermypassword' => "Ṣè'rántí ìwọlé mi lórí kọ̀mpútà yìí (fún ó pẹ́ jù {{PLURAL:$1|ọjọ́|ọjọ́}} $1)",
+'userlogin-remembermypassword' => 'Ṣè rántí mi',
+'userlogin-signwithsecure' => 'Ẹ wọlé pẹ̀lú ẹ̀rọ-ìpèsè tó ní àbò',
 'securelogin-stick-https' => 'Ìwàní sísopọ̀ mọ́ HTTPS lẹ́yín ìwọlé',
 'yourdomainname' => 'Domain yín:',
 'password-change-forbidden' => 'Ẹ kò le ṣe ìyípadà ọ̀rọ̀ìpamọ́ lórí wiki yìí.',
@@ -482,18 +491,34 @@ Olùṣeàmójútó tó típa ṣe àlàyé yìí: "$3".',
 'logout' => 'Ìjáde',
 'userlogout' => 'Ìjáde',
 'notloggedin' => "Ẹ kò tí w'ọlé",
+'userlogin-noaccount' => 'Ṣé ẹ kò ní àkópamọ́?',
+'userlogin-joinproject' => 'Ẹ darapọ̀mọ́ {{SITENAME}}',
 'nologin' => "Ṣé ẹ fẹ́ wọlé? '''$1'''.",
 'nologinlink' => 'Ìforúkọsílẹ̀',
 'createaccount' => 'Ẹ fi orúkọ sílẹ̀',
 'gotaccount' => "Ṣé ẹ ti ní àpamọ́ tẹ́lẹ̀? '''$1'''.",
 'gotaccountlink' => "Ẹ w'ọlé",
 'userlogin-resetlink' => 'À bí ẹ gbàgbé ìwọlé yín?',
-'createaccountmail' => 'pẹ̀lú e-mail',
+'helplogin-url' => 'Help:Ìwolé',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ìrànlọ́wọ́ láti ìwọlé]]',
+'createacct-join' => 'Ẹ kọ ìsọ̀rọ̀nípa yín sísàlẹ̀',
+'createacct-emailrequired' => 'Àdírẹ̀sì email',
+'createacct-emailoptional' => 'Àdírẹ̀sì email (kò pọndandan)',
+'createacct-email-ph' => 'Ẹ kọ àdírẹ̀sì email yín',
+'createaccountmail' => 'Lo ọ̀rọ̀ìpamọ́ àrìnnàkò ìgbàdíẹ̀ ná, kí o sì fi ránsẹ́ sí àdírẹ̀sì email tó wà nísàlẹ̀',
+'createacct-realname' => 'Orúkọ yín gangan (kò pọndandan)',
 'createaccountreason' => 'Ìdíẹ̀:',
+'createacct-reason' => 'Ìdí',
+'createacct-imgcaptcha-ph' => 'Ẹ kọ ìkọ̀rọ̀ tí ẹ rí lókè',
+'createacct-benefit-heading' => 'Àwọn ènìyàn bíi yín ni wọ́n dá {{SITENAME}}.',
+'createacct-benefit-body1' => 'àtúnṣe',
+'createacct-benefit-body2' => 'ojúewé',
+'createacct-benefit-body3' => 'olùkópa ní oṣù yìí',
 'badretype' => 'Àwọn ọ̀rọ̀ìpamọ́ tí ẹ kọ kò jọ ra wọn.',
 'userexists' => 'Orúkọ oníṣe tí ẹ mú wà lọ́wọ́ ẹlòmíràn.
 Ẹjọ̀wọ́ ẹ yan orúkọ mìíràn tó yàtọ̀.',
 'loginerror' => 'Àsìṣe ìwọlé',
+'createacct-error' => 'Àṣìṣe ìdá àkópamọ́',
 'createaccounterror' => 'Kò le dá àkópamọ́: $1',
 'nocookiesnew' => 'A ti dá àpamọ́ oníṣe, ṣugbọ́n ẹ kò tíì wọlé.
 {{SITENAME}} ún lo cookies láti gba àwọn oníṣe wọlé.
@@ -537,8 +562,8 @@ tí ẹ kò sì fẹ́ yípadà mọ́, ẹ mọ́ kọbiara sí ìránṣẹ́
 'blocked-mailpassword' => 'Àdírẹ́sì IP yín jẹ́ dídèlọ́nà láti ṣàtúnṣe, nípa báyìí kò ní ààyè láti lo ìfigbéṣe ìtúnwárí ọ̀rọ̀ìpamọ́ kó le dínà ìbàjẹ́.',
 'eauthentsent' => 'A ti fi e-mail ìmúdájú ránṣẹ́ sí àdírẹ́ẹ̀sì e-mail tí ẹ fi sílẹ̀.
 Kí á tó fi e-mail mìíràn ránṣẹ́ sí àkópamọ́ yìí, ẹ gbọ́dọ̀ tẹ̀lé àwọn ìlànà inú e-mail ọ̀ún, láti múdájú pé àkópamọ́ ọ̀ún jẹ́ ti yín lóòótọ́.',
-'throttled-mailpassword' => 'Aṣèránnilétí ọ̀rọ̀ìpamọ́ tilẹ̀ ti jẹ́ fífiránṣẹ́, láàrin {{PLURAL:$1|wákàtí kan|wákàtí $1}} ṣẹ́yìn.
-Láti dínà Ã¬bàjẹÌ\81, aṣèránnilétí ọ̀rọ̀ìpamọ́ kan péré ni yíò jẹ́ fífiránṣẹ́ láàrin {{PLURAL:$1|wákàtí kọ̀ọ̀kan|wákàtí $1}}.',
+'throttled-mailpassword' => 'Email ìtúntò ọ̀rọ̀ìpamọ́ kan tilẹ̀ ti jẹ́ fífiránṣẹ́, láàrin {{PLURAL:$1|wákàtí kan|wákàtí $1}} ṣẹ́yìn.
+Láti dínà Ã lòbàjẹÌ\81, email Ã¬túntò ọ̀rọ̀ìpamọ́ kan péré ni yíò jẹ́ fífiránṣẹ́ láàrin {{PLURAL:$1|wákàtí kọ̀ọ̀kan|wákàtí $1}}.',
 'mailerror' => 'Àsìṣe ìfiránṣẹ́: $1',
 'acct_creation_throttle_hit' => 'Àwọn aṣàbẹ̀wò sí wiki yìí tí wọ́n únlo àdírẹ́sì IP yín ti dá {{PLURAL:$1|àpamọ́ 1|àpamọ́ $1}} láàrin ọjọ́ tókọjá, èyí ni púpọ̀jùlọ tó jẹ́ gbígbà ní ààyè láàrin gbà àsìkò yìí.
 Nítorí èyí, àwọn aṣàbẹ̀wò tí wọ́n únlo àdírẹ́sì IP yìí kò le dá àpamọ́ báyìí.',
@@ -568,6 +593,7 @@ E-mail kankan kò ní jẹ́ fífiránṣẹ́ fún ìkankan nínú àwọn ìn
 # Email sending
 'php-mail-error-unknown' => 'Àsìṣe àìmọ̀ nínú ìgbéṣe mail() ti PHP',
 'user-mail-no-addy' => 'Ó fẹ́ fi e-mail ránṣẹ́ láìsí àdírẹ́sì e-mail.',
+'user-mail-no-body' => 'Ò fẹ́ fi email tí kò ní ọ̀rọ̀ kankan nínú ránsẹ́.',
 
 # Change password dialog
 'resetpass' => 'Ìyípadà ọ̀rọ̀ìpamọ́',
@@ -589,9 +615,10 @@ Láti parí ìmúwọlẹ́, ẹ gbọ́dọ̀ ṣètò ọ̀rọ̀ìpamọ́ tu
 
 # Special:PasswordReset
 'passwordreset' => 'Ìtúntò ọ̀rọ̀ìpamọ́',
-'passwordreset-text' => 'Ẹ parí fọ́ọ̀mù yìí láti gba e-mail aránlétí nípa àwọn ẹ̀kúnrẹ́rẹ́ àpamọ́ yín.',
+'passwordreset-text' => 'Ẹ parí fọ́ọ̀mù yìí láti ṣe ìtúntò ọ̀rọ̀ìpamọ́ yín.',
 'passwordreset-legend' => 'Ìtúntò ọ̀rọ̀ìpamọ́',
 'passwordreset-disabled' => 'Ìdálẹ́kun ìtúntò ọ̀rọ̀ìpamọ́ lórí wiki yìí.',
+'passwordreset-emaildisabled' => 'Ìdálẹ́kun lílo email lórí wiki yìí.',
 'passwordreset-pretext' => '{{PLURAL:$1||Ẹ kọ ìkan nínú àwọn wẹ́wẹ́ dátà ìsàlẹ̀}}',
 'passwordreset-username' => 'Orúkọ oníṣe:',
 'passwordreset-domain' => 'Àbùgbé:',
@@ -842,6 +869,8 @@ Kò ṣe àlàyé kankan.',
 'content-failed-to-parse' => 'Ìkùnà láti ṣàtúwò àkóónú $2 fún àfijúwe $1: $3',
 'invalid-content-data' => 'Àkóónú dátà tí kò yẹ',
 'content-not-allowed-here' => 'Àkóónú "$1" kò ní ìyọ̀nda lórí ojúewé [[$2]]',
+'editwarning-warning' => 'Kíkúrò ní ojúewé yìí yíò jẹ́ kí ẹ pòfo àwọn àtúnṣe tí ẹ ti ṣe.
+Tó bá jẹ́ pé ẹ ti wọlé, ẹ lè dẹ́kun ìkìlọ̀ yìí nínù abala "Àtúnṣe ṣíṣe" ti àwọn ìfẹ́ràn yín.',
 
 # Content models
 'content-model-wikitext' => 'ìkọ̀rọ̀ wiki',
@@ -1130,15 +1159,6 @@ Kò ṣe é bòmọ́lẹ̀.',
 Ní báyìí ná ẹ le ṣàwárí lọ́dọ̀ Google.
 Àkíyèsí pé àwọn atọ́ka wọn fún àkóónú {{SITENAME}} le mọ́ jẹ́ tuntun.',
 
-# Quickbar
-'qbsettings' => 'Pẹpẹ ìṣárémúlò',
-'qbsettings-none' => 'Ìkankan',
-'qbsettings-fixedleft' => 'Kíkàn sí òsì',
-'qbsettings-fixedright' => 'Kíkàn sí ọ̀tún',
-'qbsettings-floatingleft' => 'Léfòó sí òsì',
-'qbsettings-floatingright' => 'Léfòó sí ọ̀tún',
-'qbsettings-directionality' => 'Fi sí ẹ̀gbẹ́, gẹ́gẹ́ bí ìdojúkọ lẹ́tà-ọ̀rọ̀ èdè yín bá ṣe rí',
-
 # Preferences page
 'preferences' => 'Àwọn ìfẹ́ràn',
 'mypreferences' => 'Àwọn ìfẹ́ràn',
@@ -1693,7 +1713,6 @@ Fún àbò kúnkún, img_auth.php ti jẹ́ dídálẹ́kun.',
 'http-read-error' => 'Àṣìṣe kíkà HTTP.',
 'http-timed-out' => 'Àsìkò ìtọrọ HTTP ti tán.',
 'http-curl-error' => 'Àsìṣe ìmúwá URL: $1',
-'http-host-unreachable' => 'Kò le dé ibi URL.',
 'http-bad-status' => 'Ìṣòro kan ṣẹlẹ̀ nìgbà ìtọrọ HTTP: $1, $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2102,8 +2121,8 @@ A óò ṣ\'àkójọ àwọn àtúnṣe ọjọ́wajú sí ojúewé yìí àti
 'notvisiblerev' => 'Àtúnyẹ̀wò gbígbẹ̀yìn látọwọ́ oníṣe míràn ti jẹ́ píparẹ́',
 'watchnochange' => 'Kò sí ìkankan nínú àwọn ohun ìmójútó yín tó jẹ́ títúnṣe láàrin àsìkò títẹ́kalẹ̀.',
 'watchlist-details' => '{{PLURAL:$1|Ojúewé $1|Àwọn ojúewé $1}} ló wà nínú ìmójútó yín, tí a kò bá ka àwọn ojúewé ọ̀rọ̀.',
-'wlheader-enotif' => 'Ìfitónilétí e-mail wà ní gbígbàláyè.',
-'wlheader-showupdated' => "Àwọn ojúewé tí wọn ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wọn gbẹ̀yìn jẹ́ fífihàn ní ''kedere'''",
+'wlheader-enotif' => 'Ìfitónilétí e-mail wà ní gbígbàláyè.',
+'wlheader-showupdated' => "Àwọn ojúewé tí wọn ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wọn gbẹ̀yìn jẹ́ fífihàn ní ''kedere'''",
 'watchmethod-recent' => 'únwo àwọn àtúnṣe tuntun fún àwọn ojúewé mímójútó',
 'watchmethod-list' => 'únwo àwọn ojúewé mímójútó fún àwọn àtúnṣe tuntun',
 'watchlistcontains' => 'Àwọn ìmójútó yín ní {{PLURAL:$1|ojúewé|àwọn ojúewé}} $1 nínú.',
@@ -3008,7 +3027,7 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 * gpslongitude
 * gpsaltitude",
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => 'Fífẹ̀sí',
 'exif-imagelength' => 'Gígasí',
 'exif-bitspersample' => 'Bit fún àkóónú kọ̀ọ̀kan',
@@ -3129,7 +3148,7 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 'exif-organisationinimage' => 'Àgbájọ tó ṣe',
 'exif-personinimage' => 'Ẹni àfihàn',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => 'Àìtẹ̀pọ̀',
 
 'exif-copyrighted-true' => 'Ó ní ẹ̀tọ́-àwòkọ',
@@ -3426,13 +3445,6 @@ $5
 'version-entrypoints-header-entrypoint' => 'Ojú ìwọlé',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => 'Ipaṣẹ̀ fáìlì',
-'filepath-page' => 'Faili:',
-'filepath-submit' => 'Lọ',
-'filepath-summary' => 'Ojúewé pàtàkì yìí úndá gbogbo ipasẹ̀ fáìlì kan padà.
-Àwọn àwòrán únhàn ní kedere, àwọn irú fáìlì míràn jẹ́ bíbẹ̀rẹ̀ pẹ̀lú ètò ìbáṣe wọn tàràtà.',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Ìṣàwárí fún àwọn fáìlì àdáwòkọ',
 'fileduplicatesearch-summary' => 'Ìṣàwárí fún àwọn fáìlì àdáwòkọ gẹ́gẹ́bí nọ́mbà hash',
index a376d9d..3c4fec0 100644 (file)
@@ -7,15 +7,18 @@
  * @ingroup Language
  * @file
  *
+ * @author Anson2812
  * @author Horacewai2
  * @author Justincheng12345
  * @author Kaganer
  * @author KaiesTse
  * @author Mark85296341
+ * @author Nemo bis
  * @author Simon Shek
  * @author Waihorace
  * @author William915
  * @author Wong128hk
+ * @author Yfdyh000
  */
 
 $namespaceNames = array(
@@ -261,8 +264,6 @@ $messages = array(
 'tog-shownumberswatching' => '顯示有幾多人監視',
 'tog-oldsig' => '原有簽名嘅預覽:',
 'tog-fancysig' => '將簽名以維基字對待(冇自動連結)',
-'tog-externaleditor' => '預設用外掛編輯器(高階者專用,需要響你部電腦度做一啲特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多資訊。])',
-'tog-externaldiff' => '預設用外掛比較器(高階者專用,需要響你部電腦度做一啲特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多資訊。])',
 'tog-showjumplinks' => '啟用 "跳至" 協助連結',
 'tog-uselivepreview' => '用即時預覽(需要JavaScript)(實驗緊)',
 'tog-forceeditsummary' => '我冇入修改註解時通知我',
@@ -277,6 +278,7 @@ $messages = array(
 'tog-showhiddencats' => '顯示隱藏類',
 'tog-noconvertlink' => '唔轉連結標題',
 'tog-norollbackdiff' => '進行反轉之後略過差異',
+'tog-useeditwarning' => '當我離開未保存好嘅修改嗰陣警告我',
 
 'underline-always' => '全部',
 'underline-never' => '永不',
@@ -826,7 +828,7 @@ $1',
 '''佢嘅內容重未儲存!'''",
 'userinvalidcssjstitle' => "'''警告:''' 無叫做 \"\$1\" 嘅畫面。請記住自訂介面的 .css 和 .js 頁面時應使用細楷,例如:{{ns:user}}:Foo/vector.css 而唔係 {{ns:user}}:Foo/Vector.css 。",
 'updated' => '(己更新)',
-'note' => "'''留意:'''",
+'note' => "'''留意'''",
 'previewnote' => "'''請記住呢個只係預覽。'''
 更改嘅内容重未儲存!",
 'previewconflict' => '呢個預覽係反映如果你選擇儲存嘅話,嘅上面嘅文字編輯區裏面嘅字會儲存落嚟。',
@@ -903,6 +905,8 @@ $1',
 'edit-no-change' => '你嘅編輯已經略過,因為文字無改過。',
 'edit-already-exists' => '唔可以開一新版。
 佢已經存在。',
+'editwarning-warning' => '離開呢一版會令到你嘅修改唔見咗。
+你可以響你嘅喜好設定嘅"{{int:prefs-editing}}"小節度停用呢個警告。',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => '警告: 呢一版有太多耗費嘅語法功能呼叫。
@@ -1162,14 +1166,6 @@ $1",
 'search-external' => '出面搵嘢',
 'searchdisabled' => '{{SITENAME}}嘅搜尋功能已經關閉。你可以利用Google嚟搵。不過佢哋對{{SITENAME}}嘅索引可能唔係最新嘅。',
 
-# Quickbar
-'qbsettings' => '快捷列',
-'qbsettings-none' => '無',
-'qbsettings-fixedleft' => '左邊固定',
-'qbsettings-fixedright' => '右邊固定',
-'qbsettings-floatingleft' => '左邊浮動',
-'qbsettings-floatingright' => '右邊浮動',
-
 # Preferences page
 'preferences' => '喜好設定',
 'mypreferences' => '自訂喜好',
@@ -1199,7 +1195,7 @@ $1",
 'resetprefs' => '清除未保存嘅更改',
 'restoreprefs' => '恢復全部預設設定',
 'prefs-editing' => '編輯中',
-'prefs-edit-boxsize' => '編框大細',
+'prefs-edit-boxsize' => '編框大細',
 'rows' => '列:',
 'columns' => '行:',
 'searchresultshead' => '搵嘢',
@@ -1242,7 +1238,7 @@ $1",
 'prefs-common-css-js' => '共有嘅CSS同埋JavaScript畀所有畫面用:',
 'prefs-reset-intro' => '你可以用呢版去重設你嘅喜好設定到網站預設值。呢個動作無得番轉頭。',
 'prefs-emailconfirm-label' => '電郵確認:',
-'prefs-textboxsize' => '編輯窗大細',
+'prefs-textboxsize' => '編寫框大細',
 'youremail' => '電郵:',
 'username' => '用戶名:',
 'uid' => '用戶 ID:',
@@ -1644,7 +1640,6 @@ $1',
 'http-read-error' => 'HTTP讀取錯誤。',
 'http-timed-out' => 'HTTP請求已過時。',
 'http-curl-error' => '擷取URL嗰陣出錯:$1',
-'http-host-unreachable' => '到唔到URL。',
 'http-bad-status' => '當做緊HTTP請求嗰陣出現咗問題:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2017,8 +2012,8 @@ Template:搞清楚',
 'notvisiblerev' => '上次由唔同用戶嘅修訂已經刪除咗',
 'watchnochange' => '響顯示嘅時間之內,你所監視嘅頁面並無任何嘅更改。',
 'watchlist-details' => '唔計討論頁,有 $1 版響你個監視清單度。',
-'wlheader-enotif' => '電子郵件通知已經啟用。',
-'wlheader-showupdated' => "'''粗體字'''嘅頁響你上次嚟之後被人改過",
+'wlheader-enotif' => '電子郵件通知已經啟用。',
+'wlheader-showupdated' => "'''粗體字'''嘅頁響你上次嚟之後被人改過",
 'watchmethod-recent' => '睇緊最近修改中有邊頁監視緊',
 'watchmethod-list' => '睇緊被監視頁有乜新修改',
 'watchlistcontains' => '你嘅監視清單裏面有$1頁。',
@@ -2644,27 +2639,16 @@ $1',
 
 # Stylesheets
 'common.css' => '/* 響呢度放 CSS 碼來改成個網站嘅畫面 */',
-'standard.css' => '/* 響呢度放 CSS 碼去改用戶用嘅傳統畫面 */',
-'nostalgia.css' => '/* 響呢度放 CSS 碼去改用戶用嘅懷舊畫面 */',
 'cologneblue.css' => '/* 響呢度放 CSS 碼去改用戶用嘅科隆藍畫面 */',
 'monobook.css' => '/* 響呢度放 CSS 碼去改用戶用嘅 Monobook 畫面 */',
-'myskin.css' => '/* 響呢度放 CSS 碼去改用戶用嘅我嘅畫面 */',
-'chick.css' => '/* 響呢度放 CSS 碼去改用戶用嘅俏畫面 */',
-'simple.css' => '/* 響呢度放 CSS 碼去改用戶用嘅簡單畫面 */',
 'modern.css' => '/* 響呢度放 CSS 碼去改用戶用嘅摩登畫面 */',
 'vector.css' => '/* 響呢度放 CSS 碼去改用戶用嘅域達畫面 */',
 'print.css' => '/* 響呢度放 CSS 碼去改打印輸出 */',
-'handheld.css' => '/* 響呢度放 CSS 碼去改響 $wgHandheldStyle 設定手提裝置畫面 */',
 
 # Scripts
 'common.js' => '/* 響每一次個頁面載入時,所有用戶都會載入呢度任何嘅JavaScript。 */',
-'standard.js' => '/* 響每一次個頁面載入時,用標準畫面嘅用戶都會載入呢度任何嘅JavaScript */',
-'nostalgia.js' => '/* 響每一次個頁面載入時,用懷舊畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 'cologneblue.js' => '/* 響每一次個頁面載入時,用科隆藍畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 'monobook.js' => '/* 響每一次個頁面載入時,用 Monobook 畫面嘅用戶都會載入呢度任何嘅JavaScript */',
-'myskin.js' => '/* 響每一次個頁面載入時,用我嘅畫面嘅用戶都會載入呢度任何嘅JavaScript */',
-'chick.js' => '/* 響每一次個頁面載入時,用俏畫面嘅用戶都會載入呢度任何嘅JavaScript */',
-'simple.js' => '/* 響每一次個頁面載入時,用簡單畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 'modern.js' => '/* 響每一次個頁面載入時,用摩登畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 'vector.js' => '/* 響每一次個頁面載入時,用域達畫面嘅用戶都會載入呢度任何嘅JavaScript */',
 
@@ -2693,13 +2677,8 @@ $1',
 'spam_blanking' => '全部版本都含有指去$1嘅連結,留空',
 
 # Skin names
-'skinname-standard' => '傳統',
-'skinname-nostalgia' => '懷舊',
 'skinname-cologneblue' => '科隆藍',
 'skinname-monobook' => 'MonoBook',
-'skinname-myskin' => '我嘅畫面',
-'skinname-chick' => '俏',
-'skinname-simple' => '簡單',
 'skinname-modern' => '摩登',
 'skinname-vector' => 'Vector',
 
@@ -2771,8 +2750,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => '簡體',
@@ -2818,7 +2795,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '闊',
 'exif-imagelength' => '高',
 'exif-bitspersample' => '每部位位元數',
@@ -2934,7 +2911,7 @@ Variants for Chinese language
 'exif-gpsdifferential' => 'GPS 差動修正',
 'exif-objectname' => '短標題',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '未壓過',
 
 'exif-unknowndate' => '未知日期',
@@ -3262,12 +3239,6 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅
 'version-software-product' => '產品',
 'version-software-version' => '版本',
 
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔名:',
-'filepath-submit' => '去',
-'filepath-summary' => '呢個特別頁拎一個檔案嘅完整路徑。圖像會以完整嘅解像度顯示,其它嘅檔案類型會以同佢哋關聯咗嘅程式啟動。',
-
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '㨂重覆檔案',
 'fileduplicatesearch-summary' => '用重覆檔案嘅切細值去搵個檔案係唔係重覆。',
index 2715b8f..5bb99cd 100644 (file)
@@ -73,8 +73,6 @@ $messages = array(
 'tog-shownumberswatching' => "'t Antal gebrukers weerheven 't a deêze pahina volg",
 'tog-oldsig' => 'Bestaende onderteêkenienge',
 'tog-fancysig' => "As wikitekst behandel'n (zonder automaotische verwiezienge ni de gebrukersbladzie)",
-'tog-externaleditor' => 'Standard een externe tekstbewerker gebruken (alleêne vò experts - vò deêze functie ben speciaole ienstellienge nudig. [//www.mediawiki.org/wiki/Manual:External_editors Meê informaosie]).',
-'tog-externaldiff' => 'Standard een extern verheliekiengsprohramma gebruken (alleên vò experts - vò deêze functie ben speciaole ienstelliengen nudig. [//www.mediawiki.org/wiki/Manual:External_editors Meê informaosie]).',
 'tog-showjumplinks' => '“hi nae”-toehankelijkeidslienks inschaokelen',
 'tog-uselivepreview' => '“live voevertoônienge” gebruken (JavaScript vereist – experimenteêl)',
 'tog-forceeditsummary' => 'Heef me een meldieng bie een lehe saemenvattieng',
@@ -842,14 +840,6 @@ Zurg da je bie deêze wiezigieng de heschiedenisdeurloôpendeid van de pagina be
 Je kan gebruuk maeken van Google.
 De hehevens over {{SITENAME}} zien meuhlijk nie bie'ewerkt.",
 
-# Quickbar
-'qbsettings' => 'Menubalke',
-'qbsettings-none' => 'Uuteschaokeld',
-'qbsettings-fixedleft' => 'Lienks vast',
-'qbsettings-fixedright' => 'Rechs vast',
-'qbsettings-floatingleft' => 'Lienks zwevend',
-'qbsettings-floatingright' => 'Rechs zwevend',
-
 # Preferences page
 'preferences' => 'Vòkeuren',
 'mypreferences' => 'Mien vòkeuren',
index be84b22..b63cb57 100644 (file)
@@ -18,6 +18,7 @@
  * @author Chenzw
  * @author Chinalace
  * @author Cicku
+ * @author Cwek
  * @author Dimension
  * @author Dingyuang
  * @author Fantasticfears
  * @author Hydra
  * @author Hzy980512
  * @author Jding2010
+ * @author Jetlag
  * @author Jidanni
  * @author Jimmy xu wrk
  * @author Kaganer
  * @author KaiesTse
  * @author Kuailong
+ * @author Li3939108
  * @author Liangent
  * @author Linforest
  * @author Makecat
  * @author Mark85296341
  * @author MarkAHershberger
  * @author Mys 721tx
+ * @author Nemo bis
  * @author O
  * @author Onecountry
  * @author PhiLiP
@@ -49,6 +53,8 @@
  * @author Shirayuki
  * @author Shizhao
  * @author Simon Shek
+ * @author Slboat
+ * @author Stevenliuyi
  * @author Supaiku
  * @author Tommyang
  * @author Waihorace
@@ -58,6 +64,7 @@
  * @author Wrightbus
  * @author Xiaomingyan
  * @author Yfdyh000
+ * @author 乌拉跨氪
  * @author 燃玉
  * @author 阿pp
  */
@@ -376,9 +383,7 @@ $messages = array(
 'tog-enotifrevealaddr' => '在通知电子邮件中显示我的电子邮件地址',
 'tog-shownumberswatching' => '显示监视用户数',
 'tog-oldsig' => '当前签名:',
-'tog-fancysig' => '将签名以wiki文本对待(不产生自动链接)',
-'tog-externaleditor' => '默认使用外部编辑器(供高级用户使用,需要在您的计算机上作出一些特别设置。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
-'tog-externaldiff' => '默认使用外部差异分析(供高级用户使用,需要在您的计算机上作出一些特别设置。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
+'tog-fancysig' => '将签名视为wiki代码(不自动生成链接)',
 'tog-showjumplinks' => '启用“跳转到”访问链接',
 'tog-uselivepreview' => '使用实时预览(需要JavaScript)(实验功能)',
 'tog-forceeditsummary' => '未输入编辑摘要时提醒我',
@@ -389,14 +394,15 @@ $messages = array(
 'tog-watchlisthideanons' => '在监视列表中隐藏匿名用户',
 'tog-watchlisthidepatrolled' => '在监视列表中隐藏已巡查的编辑',
 'tog-ccmeonemails' => '把我给其他用户发送的电子邮件的副本发送给我',
-'tog-diffonly' => '比较差异时不显示页面内容',
+'tog-diffonly' => '不在版本差异下面显示页面内容',
 'tog-showhiddencats' => '显示隐藏分类',
 'tog-noconvertlink' => '停用链接文字转换',
 'tog-norollbackdiff' => '执行回退后不显示差异',
+'tog-useeditwarning' => '如在更改未保存时离开页面,则发出警告',
 
 'underline-always' => '总是使用',
 'underline-never' => '从不使用',
-'underline-default' => '浏览器默认设置',
+'underline-default' => '皮肤或浏览器默认设置',
 
 # Font style option in Special:Preferences
 'editfont-style' => '编辑区字体样式:',
@@ -456,6 +462,18 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
 
 # Categories related messages
 'pagecategories' => '$1个分类',
@@ -481,7 +499,7 @@ $messages = array(
 'newwindow' => '(将于新窗口中打开)',
 'cancel' => '取消',
 'moredotdotdot' => '更多',
-'morenotlisted' => 'æ\9b´å¤\9aæ\9cªè¢«å\88\97å\87ºç\9a\84模æ\9d¿...',
+'morenotlisted' => 'æ\9b´å¤\9a模æ\9d¿æ\9cªå\88\97å\87º...',
 'mypage' => '页面',
 'mytalk' => '讨论',
 'anontalk' => '该IP地址的讨论',
@@ -517,7 +535,7 @@ $messages = array(
 
 'navigation-heading' => '导航菜单',
 'errorpagetitle' => '错误',
-'returnto' => '返回$1。',
+'returnto' => '返回$1。',
 'tagline' => '来自{{SITENAME}}',
 'help' => '帮助',
 'search' => '搜索',
@@ -543,7 +561,7 @@ $messages = array(
 'protect_change' => '更改',
 'protectthispage' => '保护本页',
 'unprotect' => '更改保护',
-'unprotectthispage' => '更改本页面的保护',
+'unprotectthispage' => '更改本页面保护设置',
 'newpage' => '新页面',
 'talkpage' => '讨论本页',
 'talkpagelinktext' => '讨论',
@@ -561,19 +579,19 @@ $messages = array(
 'templatepage' => '查看模板页面',
 'viewhelppage' => '查看帮助页面',
 'categorypage' => '查看分类页面',
-'viewtalkpage' => '查看讨论页面',
+'viewtalkpage' => '查看讨论',
 'otherlanguages' => '其他语言',
 'redirectedfrom' => '(重定向自$1)',
-'redirectpagesub' => '重定向页',
+'redirectpagesub' => '重定向页',
 'lastmodifiedat' => '本页面最后修改于$1 $2。',
 'viewcount' => '此页面已被浏览过$1次。',
 'protectedpage' => '受保护页面',
 'jumpto' => '跳转至:',
 'jumptonavigation' => '导航',
 'jumptosearch' => '搜索',
-'view-pool-error' => '抱歉,服务器超负荷运转。
+'view-pool-error' => '抱歉,服务器目前正超负荷运转。
 过多用户正尝试查看本页面。
-请在再次尝试访问本页面之前稍等片刻
+请稍等片刻后再次尝试访问本页面
 
 $1',
 'pool-timeout' => '等待锁超时',
@@ -594,10 +612,10 @@ $1',
 'helppage' => 'Help:目录',
 'mainpage' => '首页',
 'mainpage-description' => '首页',
-'policy-url' => 'Project:æ\96¹é\92\88',
+'policy-url' => 'Project:æ\94¿ç­\96',
 'portal' => '社区专页',
 'portal-url' => 'Project:社区专页',
-'privacy' => '隐私政策',
+'privacy' => 'é\9a\90ç§\81æ\9d\83æ\94¿ç­\96',
 'privacypage' => 'Project:隐私权政策',
 
 'badaccess' => '权限错误',
@@ -615,7 +633,7 @@ $1',
 'newmessagesdifflink' => '最后更改',
 'youhavenewmessagesfromusers' => '你有来自{{PLURAL:$3|其他用户|$3个用户}}的$1($2)。',
 'youhavenewmessagesmanyusers' => '你有来自多个用户的$1($2)。',
-'newmessageslinkplural' => '{{PLURAL:$1|一条新信息|新信息}}',
+'newmessageslinkplural' => '{{PLURAL:$1|新信息}}',
 'newmessagesdifflinkplural' => '最后{{PLURAL:$1|更改}}',
 'youhavenewmessagesmulti' => '你在$1有新信息',
 'editsection' => '编辑',
@@ -645,7 +663,7 @@ $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => '页面',
-'nstab-user' => '用户页',
+'nstab-user' => '用户页',
 'nstab-media' => '媒体页面',
 'nstab-special' => '特殊页面',
 'nstab-project' => '项目页面',
@@ -756,13 +774,22 @@ $2',
 'welcomeuser' => '欢迎,$1!',
 'welcomecreation-msg' => '你的账户已创建。请不要忘记更改你的[[Special:Preferences|{{SITENAME}}系统设置]]。',
 'yourname' => '用户名:',
+'userlogin-yourname' => '用户名',
+'userlogin-yourname-ph' => '请输入你的用户名',
 'yourpassword' => '密码:',
+'userlogin-yourpassword' => '密码',
+'userlogin-yourpassword-ph' => '请输入你的密码',
+'createacct-yourpassword-ph' => '请输入密码',
 'yourpasswordagain' => '再次输入密码:',
+'createacct-yourpasswordagain' => '确认新密码',
+'createacct-yourpasswordagain-ph' => '请再次输入密码',
 'remembermypassword' => '在该浏览器保存我的登录状态(最长$1日)',
+'userlogin-remembermypassword' => '记住我的登录状态',
+'userlogin-signwithsecure' => '使用安全连接',
 'securelogin-stick-https' => '登录后继续使用HTTPS连接',
 'yourdomainname' => '您的域名:',
-'password-change-forbidden' => '你不能在本wiki更改密码。',
-'externaldberror' => '这可能是由于验证数据库错误或您被禁止更新您的外部账号。',
+'password-change-forbidden' => '您不能在本wiki上更改密码。',
+'externaldberror' => '验证数据库出错或您被禁止更新您的外部账号。',
 'login' => '登录',
 'nav-login-createaccount' => '登录/创建账户',
 'loginprompt' => '你必须启用Cookies才能登录{{SITENAME}}。',
@@ -771,21 +798,41 @@ $2',
 'logout' => '退出',
 'userlogout' => '退出',
 'notloggedin' => '未登录',
+'userlogin-noaccount' => '没有账户?',
+'userlogin-joinproject' => '加入{{SITENAME}}',
 'nologin' => '没有账户?$1。',
 'nologinlink' => '创建账户',
 'createaccount' => '创建账户',
 'gotaccount' => '已经拥有账户?请$1。',
 'gotaccountlink' => '登录',
 'userlogin-resetlink' => '忘记了你的登录信息?',
+'userlogin-resetpassword-link' => '重置您的密码',
+'helplogin-url' => 'Help:登录',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登录帮助]]',
+'createacct-join' => '请在下面输入你的信息。',
+'createacct-emailrequired' => '电子邮件地址:',
+'createacct-emailoptional' => '电子邮件地址 (可选)',
+'createacct-email-ph' => '请输入您的电子邮件地址',
 'createaccountmail' => '使用一个临时的随机密码,并将它发送到以下指定的电子邮件地址',
+'createacct-realname' => '真实姓名 (可选)',
 'createaccountreason' => '原因:',
+'createacct-reason' => '原因',
+'createacct-reason-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|贡献者}}',
 'badretype' => '您所输入的密码并不相同。',
 'userexists' => '用户名已存在。请使用其他名称。',
 'loginerror' => '登录错误',
+'createacct-error' => '账户创建出错',
 'createaccounterror' => '无法建立账户:$1',
-'nocookiesnew' => '本用户账户已被创建,但登录失败。{{SITENAME}}使用cookie登录。你已停用cookie。请启用cookie,然后使用你的新用户名和密码登录。',
-'nocookieslogin' => '{{SITENAME}}使用cookieç\99»å½\95ã\80\82ä½ å·²å\81\9cç\94¨cookieã\80\82请å\90¯ç\94¨cookieå\90\8eé\87\8dè¯\95ã\80\82',
-'nocookiesfornew' => 'æ\9c¬ç\94¨æ\88·è´¦æ\88·æ\9cªè¢«å\88\9b建ï¼\8cæ\88\91们ä¸\8dè\83½ç¡®è®¤å®\83ç\9a\84æ\9d¥æº\90ã\80\82请确ä¿\9dä½ å·²å\90¯ç\94¨cookieï¼\8cå\88·æ\96°æ\9c¬é¡µå\90\8eé\87\8dè¯\95ã\80\82',
+'nocookiesnew' => '该用户帐户已被创建,但登录失败。{{SITENAME}}使用Cookie实现用户登录。您已禁用Cookie,请启用Cookie,然后使用你的新用户名与密码登录。',
+'nocookieslogin' => '{{SITENAME}}使用Cookieå®\9eç\8e°ç\94¨æ\88·ç\99»å½\95ã\80\82æ\82¨å·²å\81\9cç\94¨Cookieã\80\82请å\90¯ç\94¨Cookieå\90\8eå\86\8dè¯\95ã\80\82',
+'nocookiesfornew' => '该ç\94¨æ\88·è´¦æ\88·æ\9cªè¢«å\88\9b建ï¼\8cæ\88\91们ä¸\8dè\83½ç¡®è®¤å®\83ç\9a\84æ\9d¥æº\90ã\80\82请确ä¿\9dä½ å·²å\90¯ç\94¨Cookieï¼\8cå\88·æ\96°æ\9c¬é¡µå\90\8eå\86\8dè¯\95ã\80\82',
 'noname' => '你没有指定有效的用户名。',
 'loginsuccesstitle' => '登录成功',
 'loginsuccess' => "'''“$1”,欢迎登录{{SITENAME}}。'''",
@@ -794,11 +841,11 @@ $2',
 'nouserspecified' => '你必须指定用户名。',
 'login-userblocked' => '该用户已被封禁,禁止登录。',
 'wrongpassword' => '你输入的密码错误。请重试。',
-'wrongpasswordempty' => '您没有输入密码,请重试!',
+'wrongpasswordempty' => '密码输入为空。请重试。',
 'passwordtooshort' => '您的密码至少需要$1个字符。',
 'password-name-match' => '您的密码必须和您的用户名不相同。',
 'password-login-forbidden' => '这个用户名称及密码的使用是被禁止的。',
-'mailmypassword' => 'ç\94¨ç\94µå­\90é\82®ä»¶å\8f\91é\80\81æ\96°å¯\86ç \81',
+'mailmypassword' => '电子邮件发送新密码',
 'passwordremindertitle' => '{{SITENAME}}的新临时密码',
 'passwordremindertext' => '有人(可能是您,来自IP地址$1)已请求{{SITENAME}}的新密码($4)。
 用户“$2”的一个新临时密码现在已被设置好为“$3”。
@@ -856,34 +903,34 @@ $2',
 'resetpass-submit-cancel' => '取消',
 'resetpass-wrong-oldpass' => '临时密码或当前密码无效。您可能已经更改了您的密码,或者请求了新的临时密码。',
 'resetpass-temp-password' => '临时密码:',
+'resetpass-abort-generic' => '密码更改已被一个扩展插件中止。',
 
 # Special:PasswordReset
 'passwordreset' => '重置密码',
-'passwordreset-text' => '完成该表格以接收你账户信息的邮件提醒。',
 'passwordreset-legend' => '重置密码',
 'passwordreset-disabled' => '此wiki已经禁用密码重置。',
-'passwordreset-pretext' => '{{PLURAL:$1||输入下面的数据项之一}}',
+'passwordreset-emaildisabled' => '此Wiki上无法使用邮件功能。',
 'passwordreset-username' => '用户名:',
 'passwordreset-domain' => '域:',
 'passwordreset-capture' => '查看生成的电子邮件吗?',
 'passwordreset-capture-help' => '如果您选中此框,电子邮件(包括临时密码)将显示,并发送给用户。',
 'passwordreset-email' => '电子邮件地址:',
 'passwordreset-emailtitle' => '在 {{SITENAME}} 的帐户详细信息',
-'passwordreset-emailtext-ip' => '有人通过IP地址 $1 (可能是您)请求获取 {{SITENAME}} ($4)上相关账户的密码提示。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:
+'passwordreset-emailtext-ip' => '有人通过IP地址$1(可能是您请求重设{{SITENAME}}($4)上相关账户的密码。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:
 
 $2
 
-{{PLURAL:$3|这个|这个}}临时密码将会在{{PLURAL:$5|一天|$5 天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。',
-'passwordreset-emailtext-user' => '用户 $1 请求获取 {{SITENAME}} ($4)上您的账户的密码提示。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:
+这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。',
+'passwordreset-emailtext-user' => '用户$1请求重设{{SITENAME}}($4)上您的账户的密码。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:
 
 $2
 
-{{PLURAL:$3|这个|这个}}临时密码将会在{{PLURAL:$5|一天|$5 天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。',
+这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。',
 'passwordreset-emailelement' => '用户名:$1
 临时密码:$2',
 'passwordreset-emailsent' => '密码重置邮件已发送。',
-'passwordreset-emailsent-capture' => '提醒电子邮件已发送,并在下面显示。',
-'passwordreset-emailerror-capture' => '生成的提醒电子邮件如下所示,但发送失败:$1',
+'passwordreset-emailsent-capture' => '密码重设电子邮件已发送,并在下面显示。',
+'passwordreset-emailerror-capture' => '重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1',
 
 # Special:ChangeEmail
 'changeemail' => '更改电子邮件地址',
@@ -1066,12 +1113,14 @@ $2
 它可能刚刚被删除。',
 'edit-conflict' => '编辑冲突。',
 'edit-no-change' => '因为没有文字更改,你的编辑已被忽略。',
+'postedit-confirmation' => '您的编辑已保存。',
 'edit-already-exists' => '不可以建立一个新页面。
 它已经存在。',
 'defaultmessagetext' => '默认消息文本',
 'content-failed-to-parse' => '未能将 $2 内容转换为 $1:$3',
 'invalid-content-data' => '无效的内容数据',
 'content-not-allowed-here' => '[[$2]]页面上不允许“$1”内容',
+'editwarning-warning' => '离开这个页面会令您遗失之前的所有更改。若您已经登入,您可在您参数设置的“{{int:prefs-editing}}”节中关闭此警告。',
 
 # Content models
 'content-model-wikitext' => 'wiki语法',
@@ -1222,7 +1271,7 @@ $1",
 'revdelete-otherreason' => '其他/附加原因:',
 'revdelete-reasonotherlist' => '其他原因',
 'revdelete-edit-reasonlist' => '编辑删除埋由',
-'revdelete-offender' => '修订版本编辑者:',
+'revdelete-offender' => '版本作者:',
 
 # Suppression log
 'suppressionlog' => '监督日志',
@@ -1327,27 +1376,19 @@ $1",
 'powersearch' => '高级搜索',
 'powersearch-legend' => '高级搜索',
 'powersearch-ns' => '在以下的名字空间中搜索:',
-'powersearch-redir' => '重定向页列表',
+'powersearch-redir' => '列出重定向页',
 'powersearch-field' => '搜索',
 'powersearch-togglelabel' => '选择:',
 'powersearch-toggleall' => '全选',
 'powersearch-togglenone' => '全不选',
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}的搜索已被禁用。您可以暂时使用Google进行搜索,须注意他们索引的{{SITENAME}}内容可能会过时。',
-
-# Quickbar
-'qbsettings' => '快速导航栏',
-'qbsettings-none' => '无',
-'qbsettings-fixedleft' => '左侧固定',
-'qbsettings-fixedright' => '右侧固定',
-'qbsettings-floatingleft' => '左侧漂移',
-'qbsettings-floatingright' => '右侧漂移',
-'qbsettings-directionality' => '根据您的语言文本方向固定位置',
+'search-error' => '搜索时发生错误:$1',
 
 # Preferences page
-'preferences' => '参数设置',
+'preferences' => '设置',
 'mypreferences' => '系统设置',
-'prefs-edits' => '编辑数:',
+'prefs-edits' => '编辑数:',
 'prefsnologin' => '未登录',
 'prefsnologintext' => '您必须先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登录]</span>才能设置个人参数。',
 'changepassword' => '更改密码',
@@ -1406,7 +1447,7 @@ $1",
 'timezoneregion-europe' => '欧洲',
 'timezoneregion-indian' => '印度洋',
 'timezoneregion-pacific' => '太平洋',
-'allowemail' => '接受来自其他用户的邮件',
+'allowemail' => '接受来自其他用户的电子邮件',
 'prefs-searchoptions' => '搜索',
 'prefs-namespaces' => '名字空间',
 'defaultns' => '否则在这些名字空间中搜索:',
@@ -1481,6 +1522,7 @@ $1",
 'userrights-notallowed' => '你的账户没有权限添加或删除用户权限。',
 'userrights-changeable-col' => '你可以更改的用户组',
 'userrights-unchangeable-col' => '你不能更改的用户组',
+'userrights-conflict' => '用户权限冲突 !请重新应用您的更改。',
 
 # Groups
 'group' => '用户组:',
@@ -1644,7 +1686,7 @@ $1",
 'rc_categories' => '分类限制(用“|”分隔)',
 'rc_categories_any' => '任意',
 'rc-change-size-new' => '更改后$1字节',
-'newsectionsummary' => '/*$1*/新段落',
+'newsectionsummary' => '/* $1 */ 新段落',
 'rc-enhanced-expand' => '显示细节(需要JavaScript)',
 'rc-enhanced-hide' => '隐藏细节',
 'rc-old-title' => '最初被创建为" $1 "',
@@ -1684,7 +1726,7 @@ $1",
 'upload-prohibited' => '禁止的文件类型:$1。',
 'uploadlog' => '上传日志',
 'uploadlogpage' => '上传日志',
-'uploadlogpagetext' => '下面是最近的文件上传的列表。图像概览请见[[Special:NewFiles|新文件库]]。',
+'uploadlogpagetext' => 'ä¸\8bé\9d¢æ\98¯æ\9c\80è¿\91ç\9a\84æ\96\87件ä¸\8aä¼ ç\9a\84å\88\97表ã\80\82å\9b¾å\83\8fæ¦\82è§\88请è§\81[[Special:NewFiles|æ\96°æ\96\87件å\9b¾åº\93]]ã\80\82',
 'filename' => '文件名',
 'filedesc' => '文件说明',
 'fileuploadsummary' => '摘要:',
@@ -1867,7 +1909,6 @@ $1',
 'http-read-error' => 'HTTP读取错误。',
 'http-timed-out' => 'HTTP请求已过时。',
 'http-curl-error' => '撷取URL时出错:$1',
-'http-host-unreachable' => '无法到达URL。',
 'http-bad-status' => '进行HTTP请求时出现问题:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -2016,12 +2057,12 @@ $1',
 'statistics-users-active-desc' => '在前$1天中操作过的用户',
 'statistics-mostpopular' => '浏览最多的页面',
 
-'disambiguations' => '链接至消歧义页的页面',
+'disambiguations' => '链接至消歧义页的页面',
 'disambiguationspage' => 'Template:消歧义',
 'disambiguations-text' => "以下的页面都有到'''消歧义页'''的链接,但它们可能可以链接到更适当的页面。<br />一个页面如果使用了[[MediaWiki:Disambiguationspage]]内的模板,则会被视为消歧义页。",
 
-'pageswithprop' => '有页面属性的页面',
-'pageswithprop-legend' => '有页面属性的页面',
+'pageswithprop' => '有页面属性的页面',
+'pageswithprop-legend' => '有页面属性的页面',
 'pageswithprop-text' => '此页面列出了使用特定页面属性的页面名单。',
 'pageswithprop-prop' => '属性名称:',
 'pageswithprop-submit' => '提交',
@@ -2032,17 +2073,17 @@ $1',
 'double-redirect-fixed-maintenance' => '修复双重重定向自[[$1]]至[[$2]]。',
 'double-redirect-fixer' => '重定向页修复器',
 
-'brokenredirects' => '损坏的重定向页',
+'brokenredirects' => '受损重定向页',
 'brokenredirectstext' => '以下的重定向页面指向的是不存在的页面:',
 'brokenredirects-edit' => '编辑',
 'brokenredirects-delete' => '删除',
 
-'withoutinterwiki' => '无语言链接页面',
+'withoutinterwiki' => '无语言链接页面',
 'withoutinterwiki-summary' => '以下的页面是未有语言链接到其它语言版本。',
 'withoutinterwiki-legend' => '前缀',
 'withoutinterwiki-submit' => '显示',
 
-'fewestrevisions' => '最少版本页面',
+'fewestrevisions' => '版本最少页面',
 
 # Miscellaneous special pages
 'nbytes' => '$1字节',
@@ -2062,10 +2103,10 @@ $1',
 'uncategorizedimages' => '未归类文件',
 'uncategorizedtemplates' => '未归类模板',
 'unusedcategories' => '未使用分类',
-'unusedimages' => '未使用图像',
+'unusedimages' => '未使用文件',
 'popularpages' => '热点页面',
 'wantedcategories' => '需要的分类',
-'wantedpages' => '待撰页面',
+'wantedpages' => '需要的页面',
 'wantedpages-badtitle' => '在结果组上的无效标题:$1',
 'wantedfiles' => '需要的文件',
 'wantedfiletext-cat' => '下列被使用的文件并不存在。已列出可能存在外部媒体库中的文件。任何此类误报将被<del>剔除</del>。此外,[[:$1]]列出列出了嵌入不存在文件的页面。',
@@ -2082,7 +2123,7 @@ $1',
 'prefixindex-namespace' => '所有有前缀的页面($1名字空间)',
 'shortpages' => '短页面',
 'longpages' => '长页面',
-'deadendpages' => 'æ\96­链页面',
+'deadendpages' => 'æ\97 链页面',
 'deadendpagestext' => '以下页面没有链接到{{SITENAME}}中的其它页面。',
 'protectedpages' => '受保护页面',
 'protectedpages-indef' => '仅无限期保护',
@@ -2099,7 +2140,7 @@ $1',
 'usercreated' => '$1 $2{{GENDER:$3|创建}}',
 'newpages' => '新页面',
 'newpages-username' => '用户名:',
-'ancientpages' => '最页面',
+'ancientpages' => '最页面',
 'move' => '移动',
 'movethispage' => '移动本页',
 'unusedimagestext' => '下列文件已存在,但并未插入任何页面。
@@ -2222,7 +2263,7 @@ $1',
 'emailpage' => '电邮联系',
 'emailpagetext' => '你可以使用下面的表格发送电子邮件信息至该{{GENDER:$1|用户}}。你在[[Special:Preferences|系统设置]]中输入的电子邮件地址将显示为邮件的“发件人”地址,所以该用户将可以直接回复你。',
 'usermailererror' => 'Mail 对象返回错误:',
-'defemailsubject' => '{{SITENAME}}来自用户“$1”的电子邮件',
+'defemailsubject' => '来自{{SITENAME}}用户“$1”的电子邮件',
 'usermaildisabled' => '用户电子邮件停用',
 'usermaildisabledtext' => '你不能发送电子邮件至本wiki的其他用户',
 'noemailtitle' => '无电子邮件地址',
@@ -2269,8 +2310,8 @@ $1',
 'notvisiblerev' => '上次由不同用户所作的修订版本已经删除',
 'watchnochange' => '在显示的时间段内您所监视的页面没有更改。',
 'watchlist-details' => '不计讨论页面,你的监视列表中有$1个页面。',
-'wlheader-enotif' => '* 已经启动电子邮件通知功能。',
-'wlheader-showupdated' => "*你上次访问后更改的页面以'''粗体'''显示",
+'wlheader-enotif' => '已启用电子邮件通知',
+'wlheader-showupdated' => "你上次访问后更改的页面以'''粗体'''显示",
 'watchmethod-recent' => '检查被监视页面的最近编辑',
 'watchmethod-list' => '查看监视页中的最新修改',
 'watchlistcontains' => '您的监视列表包含$1个页面。',
@@ -2293,11 +2334,11 @@ $1',
 'enotif_subject_restored' => '{{SITENAME}}页面$1已被$2恢复',
 'enotif_subject_changed' => '{{SITENAME}}页面$1已被$2更改',
 'enotif_body_intro_deleted' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|删除}},请见$3。',
-'enotif_body_intro_created' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|创建}},请浏览$3查看当前版本。',
-'enotif_body_intro_moved' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|移动}},请浏览$3查看当前版本。',
-'enotif_body_intro_restored' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|恢复}},请浏览$3查看当前版本。',
-'enotif_body_intro_changed' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|更改}},请浏览$3查看当前版本。',
-'enotif_lastvisited' => '请浏览$1查看你上次访问后的所有更改。',
+'enotif_body_intro_created' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|创建}},请浏览<$3>查看当前版本。',
+'enotif_body_intro_moved' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|移动}},请浏览<$3>查看当前版本。',
+'enotif_body_intro_restored' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|恢复}},请浏览<$3>查看当前版本。',
+'enotif_body_intro_changed' => '{{SITENAME}}页面$1已于$PAGEEDITDATE被$2{{GENDER:$2|更改}},请浏览 $3 查看当前版本。',
+'enotif_lastvisited' => '请浏览 $1 查看你上次访问后的所有更改。',
 'enotif_lastdiff' => '请浏览$1查看该更改。',
 'enotif_anon_editor' => '匿名用户$1',
 'enotif_body' => '亲爱的$WATCHINGUSERNAME:
@@ -2451,7 +2492,7 @@ $UNWATCHURL
 'viewdeletedpage' => '查看被删页面',
 'undeletepagetext' => '以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。',
 'undelete-fieldset-title' => '恢复版本',
-'undeleteextrahelp' => "恢复整个编辑历史时,请清除所有复选框后点击'''''{{int:undeletebtn}}'''''。恢复特定版本时,请选择相应版本前的复选框后点击'''''{{int:undeletebtn}}'''''。",
+'undeleteextrahelp' => "要恢复该页面的整个历史记录时,不选中任何复选框直接点击'''''{{int:undeletebtn}}'''''。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击'''''{{int:undeletebtn}}'''''。",
 'undeleterevisions' => '$1版本存档',
 'undeletehistory' => '如果您恢复了该页面,所有版本都会被恢复到修订历史中。
 如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。',
@@ -2525,7 +2566,7 @@ $1',
 最近的封锁日志项目在下面提供以便参考:',
 'sp-contributions-search' => '搜索贡献',
 'sp-contributions-username' => 'IP地址或用户名:',
-'sp-contributions-toponly' => '只显示最后修订版本的编辑',
+'sp-contributions-toponly' => '仅显示最后版本编辑',
 'sp-contributions-submit' => '搜索',
 
 # What links here
@@ -2535,13 +2576,13 @@ $1',
 'linkshere' => "以下页面链接至'''[[:$1]]''':",
 'nolinkshere' => "没有页面链接至'''[[:$1]]'''。",
 'nolinkshere-ns' => "在所选的名字空间内没有页面链接到'''[[:$1]]'''。",
-'isredirect' => '重定向页',
+'isredirect' => '重定向页',
 'istemplate' => '包含',
 'isimage' => '文件链接',
 'whatlinkshere-prev' => '上$1个',
 'whatlinkshere-next' => '下$1个',
 'whatlinkshere-links' => '←链入页面',
-'whatlinkshere-hideredirs' => '$1重定向',
+'whatlinkshere-hideredirs' => '$1重定向',
 'whatlinkshere-hidetrans' => '$1包含',
 'whatlinkshere-hidelinks' => '$1链接',
 'whatlinkshere-hideimages' => '$1个文件链接',
@@ -2665,6 +2706,7 @@ $1被封禁的理由是:“$2”',
 'proxyblocksuccess' => '完成。',
 'sorbsreason' => '在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理。',
 'sorbs_create_account_reason' => '在{{SITENAME}}使用的DNSBL中,您的IP地址被列为公开代理,因此您不能创建新账户。',
+'xffblockreason' => '您或您正在使用的代理服务器呈现在X-Forwarded-For数据包头的一个IP地址已被封禁。封禁原因为:$1',
 'cant-block-while-blocked' => '您无法在封禁期内封禁其他用户。',
 'cant-see-hidden-user' => '您尝试封禁的用户已被封禁并隐藏。
 由于您尚无隐藏用户的权限,您无法查看或编辑此用户的封禁。',
@@ -2824,6 +2866,8 @@ $1被封禁的理由是:“$2”',
 'thumbnail-more' => '放大',
 'filemissing' => '无法找到文件',
 'thumbnail_error' => '生成缩略图错误:$1',
+'thumbnail_error_remote' => '来自$1的错误消息从:
+$2',
 'djvu_page_error' => 'DjVu页面超出范围',
 'djvu_no_xml' => '无法在DjVu文件中获取XML',
 'thumbnail-temp-create' => '无法创建临时缩略图文件',
@@ -2906,7 +2950,7 @@ $1被封禁的理由是:“$2”',
 'tooltip-pt-anontalk' => '有关本IP地址的编辑的讨论',
 'tooltip-pt-preferences' => '你的系统设置',
 'tooltip-pt-watchlist' => '你正在监视更改的页面的列表',
-'tooltip-pt-mycontris' => '你的贡献列表',
+'tooltip-pt-mycontris' => '你的贡献列表',
 'tooltip-pt-login' => '我们鼓励你登录,不过这不是强制的',
 'tooltip-pt-anonlogin' => '我们鼓励你登录,不过这不是强制的',
 'tooltip-pt-logout' => '退出登录',
@@ -2954,7 +2998,7 @@ $1被封禁的理由是:“$2”',
 'tooltip-ca-nstab-help' => '查看帮助页面',
 'tooltip-ca-nstab-category' => '查看分类页面',
 'tooltip-minoredit' => '标记本编辑为小编辑',
-'tooltip-save' => '保存的更改',
+'tooltip-save' => '保存的更改',
 'tooltip-preview' => '预览您的更改,请在保存前使用此功能!',
 'tooltip-diff' => '显示您对该文字所做的更改',
 'tooltip-compareselectedversions' => '查看此页面两个选定的修订版本间的差异。',
@@ -2970,17 +3014,11 @@ $1被封禁的理由是:“$2”',
 
 # Stylesheets
 'common.css' => '/* 此处的 CSS 将应用于所有的皮肤 */',
-'standard.css' => '/* 此处的 CSS 将影响使用标准皮肤的用户 */',
-'nostalgia.css' => '/* 此处的 CSS 将影响使用怀旧皮肤的用户 */',
 'cologneblue.css' => '/* 此处的 CSS 将影响使用科隆香水蓝皮肤的用户 */',
 'monobook.css' => '/* 此处的 CSS 将影响使用 Monobook 皮肤的用户 */',
-'myskin.css' => '/* 此处的 CSS 将影响使用 MySkin 皮肤的用户 */',
-'chick.css' => '/* 此处的 CSS 将影响使用 Chick 皮肤的用户 */',
-'simple.css' => '/* 此处的 CSS 将影响使用 Simple 皮肤的用户 */',
 'modern.css' => '/* 此处的 CSS 将影响使用 Modern 皮肤的用户 */',
 'vector.css' => '/* 此处的 CSS 将影响使用 Vector 皮肤的用户 */',
 'print.css' => '/* 此处的 CSS 将影响打印输出 */',
-'handheld.css' => '/* 此处的 CSS 将影响在 $wgHandheldStyle 设置手提装置面板 */',
 'noscript.css' => '/* 此处的 CSS 将影响没有启用 JavaScript 的用户 */',
 'group-autoconfirmed.css' => '/* 此处的 CSS 将只会影响自动确认用户 */',
 'group-bot.css' => '/* 此处的 CSS 将只会影响机器人 */',
@@ -2989,13 +3027,8 @@ $1被封禁的理由是:“$2”',
 
 # Scripts
 'common.js' => '/* 此处的JavaScript将加载于所有用户每一个页面。 */',
-'standard.js' => '/* 此处的JavaScript将加载于使用标准皮肤的用户 */',
-'nostalgia.js' => '/* 此处的JavaScript将加载于使用怀旧皮肤的用户 */',
 'cologneblue.js' => '/* 此处的JavaScript将加载于使用科隆香水蓝皮肤的用户 */',
 'monobook.js' => '/* 此处的JavaScript将加载于使用Monobook皮肤的用户 */',
-'myskin.js' => '/* 此处的JavaScript将加载于使用MySkin皮肤的用户 */',
-'chick.js' => '/* 此处的JavaScript将加载于使用Chick皮肤的用户 */',
-'simple.js' => '/* 此处的JavaScript将加载于使用Simple皮肤的用户 */',
 'modern.js' => '/* 此处的JavaScript将加载于使用Modern皮肤的用户 */',
 'vector.js' => '/* 此处的JavaScript将加载于使用Vector皮肤的用户 */',
 'group-autoconfirmed.js' => '/* 此处的JavaScript将仅加载于自动确认用户 */',
@@ -3030,55 +3063,52 @@ $1被封禁的理由是:“$2”',
 
 # Info page
 'pageinfo-title' => '“$1”的信息',
-'pageinfo-not-current' => 'å\8fªè\83½æ\98¾ç¤ºå½\93å\89\8d修订ç\89\88æ\9c¬ç\9a\84信息。',
+'pageinfo-not-current' => '对ä¸\8dèµ·ï¼\8cæ\88\91们æ\97 æ³\95æ\8f\90ä¾\9bæ\97§ç\89\88æ\9c¬ç\9a\84该信息。',
 'pageinfo-header-basic' => '基本信息',
 'pageinfo-header-edits' => '编辑历史',
 'pageinfo-header-restrictions' => '页面保护',
 'pageinfo-header-properties' => '页面属性',
 'pageinfo-display-title' => '显示的标题',
-'pageinfo-default-sort' => 'é»\98认æ\8e\92åº\8få­\97',
+'pageinfo-default-sort' => 'é»\98认æ\8e\92åº\8få\85³é\94®è¯\8d',
 'pageinfo-length' => '页面长度(字节)',
 'pageinfo-article-id' => '页面ID',
 'pageinfo-language' => '页面内容语言',
 'pageinfo-robot-policy' => '搜索引擎状态',
 'pageinfo-robot-index' => '可索引',
 'pageinfo-robot-noindex' => '不可索引',
-'pageinfo-views' => 'æ\9f¥ç\9c\8b次æ\95°',
-'pageinfo-watchers' => '页面监视者数',
-'pageinfo-few-watchers' => '少于$1监视者',
-'pageinfo-redirects-name' => '重定向到本页',
-'pageinfo-subpages-name' => '本页的子页面',
-'pageinfo-subpages-value' => '$1 ($2个重定向;$3个非重定向)',
+'pageinfo-views' => '查看数',
+'pageinfo-watchers' => '页面监视者数',
+'pageinfo-few-watchers' => '少于$1监视者',
+'pageinfo-redirects-name' => '本页重定向页数',
+'pageinfo-subpages-name' => '本页子页面数',
+'pageinfo-subpages-value' => '$1($2个重定向页,$3个非重定向页)',
 'pageinfo-firstuser' => '页面创建者',
 'pageinfo-firsttime' => '页面创建日期',
-'pageinfo-lastuser' => '最后编辑',
-'pageinfo-lasttime' => '最后编辑日期',
-'pageinfo-edits' => 'æ\80»ç¼\96è¾\91次æ\95°',
-'pageinfo-authors' => '不同编者总计',
-'pageinfo-recent-edits' => 'æ\9c\80è¿\91ç\9a\84ç¼\96è¾\91æ\95°ï¼\88$1内)',
-'pageinfo-recent-authors' => '最近的不同者数',
+'pageinfo-lastuser' => '最后编辑',
+'pageinfo-lasttime' => '最后编辑日期',
+'pageinfo-edits' => '总编辑数',
+'pageinfo-authors' => '不同作者总数',
+'pageinfo-recent-edits' => 'æ\9c\80è¿\91ç¼\96è¾\91æ\95°ï¼\88è¿\87å\8e»$1内)',
+'pageinfo-recent-authors' => '最近的不同者数',
 'pageinfo-magic-words' => '魔术字($1)',
 'pageinfo-hidden-categories' => '隐藏分类($1)',
 'pageinfo-templates' => '使用的模板($1)',
-'pageinfo-transclusions' => '$1个包含此页的页面',
+'pageinfo-transclusions' => '包含该页的页面($1)',
 'pageinfo-toolboxlink' => '页面信息',
-'pageinfo-redirectsto' => '重定向',
+'pageinfo-redirectsto' => '重定向',
 'pageinfo-redirectsto-info' => '信息',
-'pageinfo-contentpage' => '计算为内容页',
+'pageinfo-contentpage' => '计为内容页面',
 'pageinfo-contentpage-yes' => '是',
-'pageinfo-protect-cascading' => 'ä»\8eè¿\99é\87\8cå¼\80å§\8bè¿\9eé\94\81ä¿\9dæ\8a¤',
+'pageinfo-protect-cascading' => 'ä¿\9dæ\8a¤è¿\9eé\94\81è\87ªæ­¤',
 'pageinfo-protect-cascading-yes' => '是',
-'pageinfo-protect-cascading-from' => '保护级联自',
+'pageinfo-protect-cascading-from' => '保护连锁自',
 'pageinfo-category-info' => '分类信息',
-'pageinfo-category-pages' => '页数',
+'pageinfo-category-pages' => '页数',
 'pageinfo-category-subcats' => '子分类数',
 'pageinfo-category-files' => '文件数',
 
 # Skin names
-'skinname-standard' => '标准',
-'skinname-nostalgia' => '怀旧',
 'skinname-cologneblue' => '科隆香水蓝',
-'skinname-simple' => '简单',
 'skinname-modern' => '现代',
 
 # Patrolling
@@ -3139,7 +3169,7 @@ $1',
 'file-no-thumb-animation-gif' => "'''注意:由于技术限制,高分辨率GIF图像的缩略图无法进行动画处理。'''",
 
 # Special:NewFiles
-'newimages' => '新文件库',
+'newimages' => 'æ\96°æ\96\87件å\9b¾åº\93',
 'imagelisttext' => "以下是按$2排列的'''$1'''个文件列表。",
 'newimages-summary' => '本特殊页面展示最后上传的文件。',
 'newimages-legend' => '过滤',
@@ -3159,11 +3189,25 @@ $1',
 'minutes' => '$1分',
 'hours' => '$1小时',
 'days' => '$1天',
-'months' => '{{PLURAL:$1|$1个月}}',
-'years' => '{{PLURAL:$1|$1年}}',
+'weeks' => '$1周',
+'months' => '$1个月',
+'years' => '$1年',
 'ago' => '$1前',
 'just-now' => '刚刚',
 
+# Human-readable timestamps
+'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',
+'yesterday-at' => '昨天$1',
+
 # Bad image list
 'bad_image_list' => '请按照下列格式编写:
 
@@ -3172,8 +3216,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => '简体',
@@ -3216,7 +3258,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '宽度',
 'exif-imagelength' => '高度',
 'exif-bitspersample' => '每像素字节数',
@@ -3394,7 +3436,7 @@ Variants for Chinese language
 'exif-originalimageheight' => '裁剪前的图像高度',
 'exif-originalimagewidth' => '裁剪前的图像宽度',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '未压缩',
 'exif-compression-2' => 'CCITT第3组一维修改霍夫曼游程编码',
 'exif-compression-3' => 'CCITT第3组传真编码',
@@ -3764,8 +3806,8 @@ $5
 'watchlistedit-raw-removed' => '$1个标题被删除:',
 
 # Watchlist editing tools
-'watchlisttools-view' => '查看监视更改',
-'watchlisttools-edit' => 'æ\9f¥ç\9c\8b并编辑监视列表',
+'watchlisttools-view' => '查看监视更改',
+'watchlisttools-edit' => 'æ\9f¥ç\9c\8bå\92\8c编辑监视列表',
 'watchlisttools-raw' => '编辑原始监视列表',
 
 # Signatures
@@ -3810,11 +3852,17 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 条目路径]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath 脚本路径]',
 
-# Special:FilePath
-'filepath' => '文件路径',
-'filepath-page' => '文件名:',
-'filepath-submit' => '提交',
-'filepath-summary' => '本特殊页面返回文件的完整路径。图像以完整分辨率显示,其它文件类型以关联程序直接打开。',
+# Special:Redirect
+'redirect' => '重定向',
+'redirect-legend' => '重定向至文件或页面',
+'redirect-summary' => '本特殊页面会重定向到一个文件(给予文件名),一个页面(给予修订版本ID),或一个用户页面(给予用户数字ID)。',
+'redirect-submit' => '提交',
+'redirect-lookup' => '基于:',
+'redirect-value' => '值:',
+'redirect-user' => '用户ID',
+'redirect-revision' => '页面修订',
+'redirect-file' => '文件名',
+'redirect-not-exists' => '没找到相应值',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '搜索重复文件',
@@ -3905,6 +3953,9 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'htmlform-submit' => '提交',
 'htmlform-reset' => '撤销更改',
 'htmlform-selectorother-other' => '其他',
+'htmlform-no' => '否',
+'htmlform-yes' => '是',
+'htmlform-chosen-placeholder' => '选择选项',
 
 # SQLite database support
 'sqlite-has-fts' => '带全文搜索的版本$1',
@@ -3914,14 +3965,14 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'logentry-delete-delete' => '$1删除页面$3',
 'logentry-delete-restore' => '$1恢复页面$3',
 'logentry-delete-event' => '$1已更改$3中$5项日志的可见性:$4',
-'logentry-delete-revision' => '$1已更改$3中{{PLURAL:$5|$5个历史版本|$5个历史版本}}的可见性:$4',
-'logentry-delete-event-legacy' => '$1已更改$3中日志的可见性',
-'logentry-delete-revision-legacy' => '$1已更改$3中历史版本的可见性',
-'logentry-suppress-delete' => '$1已隐藏页面$3',
-'logentry-suppress-event' => '$1已不可见地更改$3中{{PLURAL:$5|$5项日志|$5项日志}}的可见性:$4',
-'logentry-suppress-revision' => '$1已不可见地更改$3中{{PLURAL:$5|$5个历史版本|$5个历史版本}}的可见性:$4',
-'logentry-suppress-event-legacy' => '$1已不可见地更改$3中日志的可见性',
-'logentry-suppress-revision-legacy' => '$1已不可见地更改$3中历史版本的可见性',
+'logentry-delete-revision' => '$1{{GENDER:$2|已更改}}$3中{{PLURAL:$5|$5个历史版本|$5个历史版本}}的可见性:$4',
+'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|更改}}$3中{{PLURAL:$5|$5项日志|$5项日志}}的可见性:$4',
+'logentry-suppress-revision' => '$1已不可见地{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5个历史版本|$5个历史版本}}的可见性:$4',
+'logentry-suppress-event-legacy' => '$1已不可见地{{GENDER:$2|更改}}$3中日志的可见性',
+'logentry-suppress-revision-legacy' => '!$1已不可见地{{GENDER:$2|更改}}$3中历史版本的可见性',
 'revdelete-content-hid' => '隐藏内容',
 'revdelete-summary-hid' => '隐藏编辑摘要',
 'revdelete-uname-hid' => '隐藏用户名',
@@ -3932,22 +3983,22 @@ MediaWiki发表时预期有用,但对此'''无任何保证''',亦无隐含
 'revdelete-unrestricted' => '已移除对管理员的限制',
 'logentry-move-move' => '$1移动$3页面至$4',
 'logentry-move-move-noredirect' => '$1移动$3页面至$4,不留重定向',
-'logentry-move-move_redir' => '$1移å\8a¨é¡µé\9d¢$3è\87³$4è¦\86ç\9b\96é\87\8då®\9aå\90\91',
+'logentry-move-move_redir' => '$1移å\8a¨é¡µé\9d¢$3è¦\86ç\9b\96é\87\8då®\9aå\90\91页$4',
 'logentry-move-move_redir-noredirect' => '$1通过重定向移动$3页面至$4,不留重定向',
-'logentry-patrol-patrol' => '$1标记页面$3的版本$4为已巡查',
-'logentry-patrol-patrol-auto' => '$1自动标记页面$3的版本$4为已巡查',
-'logentry-newusers-newusers' => '已创建用户帐户 $1',
-'logentry-newusers-create' => '创建用户帐户 $1',
-'logentry-newusers-create2' => '创建用户帐户 $3 由 $1',
+'logentry-patrol-patrol' => '$1{{GENDER:$2|标记}}页面$3的版本$4为已巡查',
+'logentry-patrol-patrol-auto' => '$1自动{{GENDER:$2|标记}}页面$3的版本$4为已巡查',
+'logentry-newusers-newusers' => '已{{GENDER:$2|创建}}用户帐户$1',
+'logentry-newusers-create' => '{{GENDER:$2|创建}}用户帐户$1',
+'logentry-newusers-create2' => '用户帐户 $3 由 $1 创建',
 'logentry-newusers-byemail' => '$1创建用户$3,并且密码已通过电子邮件发送',
-'logentry-newusers-autocreate' => '帐户$1已被自动地创建',
+'logentry-newusers-autocreate' => '用户帐户$1已被自动{{GENDER:$2|创建}}',
 'logentry-rights-rights' => '$1将$3的用户组从$4改为$5',
 'logentry-rights-rights-legacy' => '$1更改$3的用户组',
 'logentry-rights-autopromote' => '$1的用户组已自动从$4改为$5',
 'rightsnone' => '(无)',
 
 # Feedback
-'feedback-bugornote' => '如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名和使用的浏览器。',
+'feedback-bugornote' => '如果你准备好详细描述一个技术问题,请[$1 报告bug]。或者你可以使用下面的简单表格。你的评论将被添加至页面“[$3 $2]”,附有你的用户名。',
 'feedback-subject' => '主题:',
 'feedback-message' => '信息:',
 'feedback-cancel' => '取消',
index 3f51cfe..f69f53f 100644 (file)
  * @author Andrew971218
  * @author Bencmq
  * @author Breawycker
+ * @author Danny0838
  * @author FireJackey
  * @author Frankou
+ * @author Gakmo
  * @author Gaoxuewei
  * @author Hakka
  * @author Horacewai2
@@ -27,6 +29,8 @@
  * @author Kuailong
  * @author Lauhenry
  * @author Liangent
+ * @author Liflon
+ * @author Littletung
  * @author Mark85296341
  * @author Oapbtommy
  * @author Pbdragonwang
@@ -174,6 +178,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( '隨機重定向頁面' ),
        'Recentchanges'             => array( '最近更改' ),
        'Recentchangeslinked'       => array( '鏈出更改' ),
+       'Redirect'                  => array( '重定向' ),
        'Revisiondelete'            => array( '刪除或恢復版本' ),
        'Search'                    => array( '搜索' ),
        'Shortpages'                => array( '短頁面' ),
@@ -207,6 +212,7 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
+       'redirect'                  => array( '0', '#重定向', '#REDIRECT' ),
        'notoc'                     => array( '0', '__無目錄__', '__无目录__', '__NOTOC__' ),
        'nogallery'                 => array( '0', '__無圖庫__', '__无图库__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__強制目錄__', '__强显目录__', '__FORCETOC__' ),
@@ -228,10 +234,10 @@ $magicWords = array(
        'img_page'                  => array( '1', '頁=$1', '$1頁', '页数=$1', '$1页', 'page=$1', 'page $1' ),
        'img_link'                  => array( '1', '連結=$1', '链接=$1', 'link=$1' ),
        'sitename'                  => array( '1', '網站名稱', '站点名称', 'SITENAME' ),
-       'ns'                        => array( '0', '名字空間', '名字空间:', 'NS:' ),
-       'nse'                       => array( '0', '名字空間E', '名字空间E:', 'NSE:' ),
-       'localurl'                  => array( '0', '本地URL', '本地URL:', 'LOCALURL:' ),
-       'localurle'                 => array( '0', '本地URLE', '本地URLE:', 'LOCALURLE:' ),
+       'ns'                        => array( '0', '名字空間:', '名字空间:', 'NS:' ),
+       'nse'                       => array( '0', '名字空間E:', '名字空间E:', 'NSE:' ),
+       'localurl'                  => array( '0', '本地URL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', '本地URLE:', 'LOCALURLE:' ),
        'pageid'                    => array( '0', '頁面ID', '页面ID', 'PAGEID' ),
        'server'                    => array( '0', '伺服器', '服务器', 'SERVER' ),
        'servername'                => array( '0', '伺服器名稱', '服务器名', 'SERVERNAME' ),
@@ -240,6 +246,7 @@ $magicWords = array(
        'nocontentconvert'          => array( '0', '__不轉換內容__', '__不转换内容__', '__NOCONTENTCONVERT__', '__NOCC__' ),
        'displaytitle'              => array( '1', '顯示標題', '显示标题', 'DISPLAYTITLE' ),
        'currentversion'            => array( '1', '當前版本', '当前版本', 'CURRENTVERSION' ),
+       'language'                  => array( '0', '#語言:', '#语言:', '#LANGUAGE:' ),
        'hiddencat'                 => array( '1', '__隱藏分類__', '__隐藏分类__', '__HIDDENCAT__' ),
        'staticredirect'            => array( '1', '__靜態重定向__', '__静态重定向__', '__STATICREDIRECT__' ),
 );
@@ -266,38 +273,37 @@ $messages = array(
 'tog-editsection' => '允許通過點擊[編輯]連結編輯段落',
 'tog-editsectiononrightclick' => '允許右擊標題編輯段落 (需要JavaScript)',
 'tog-showtoc' => '顯示目錄 (針對一頁超過3個標題的頁面)',
-'tog-rememberpassword' => '在這個瀏覽器上記住我的登入資訊(可維持 $1 {{PLURAL:$1|天|天}})',
-'tog-watchcreations' => '將我建立的頁面和檔案添加到我的監視列表中',
-'tog-watchdefault' => '將我更改的頁面和檔案添加到我的監視列表中',
-'tog-watchmoves' => '將我移動的頁面和檔案添加到我的監視列表',
-'tog-watchdeletion' => '將我刪除的頁面和檔案添加到我的監視列表',
-'tog-minordefault' => '預設將編輯設定為小編輯',
+'tog-rememberpassword' => '在這個瀏覽器上記住我的登入狀態(最多 $1 天)',
+'tog-watchcreations' => '將我建立的頁面和上傳的檔案加入監視列表',
+'tog-watchdefault' => '將我更改的頁面和檔案加入監視列表',
+'tog-watchmoves' => '將我移動的頁面和檔案加入監視列表',
+'tog-watchdeletion' => '將我刪除的頁面和檔案加入監視列表',
+'tog-minordefault' => '預設將所有編輯標記為小修改',
 'tog-previewontop' => '在編輯框上方顯示預覽',
 'tog-previewonfirst' => '第一次編輯時顯示預覽',
-'tog-nocache' => '禁止瀏覽器頁面快取',
-'tog-enotifwatchlistpages' => '當在我的監視列表中的頁面或檔案改變時發電子郵件給我',
-'tog-enotifusertalkpages' => '當我的對話頁更改時發電子郵件給我',
-'tog-enotifminoredits' => '即使是頁面和檔案的小修改也向我發電子郵件',
+'tog-nocache' => '停用瀏覽器的頁面快取',
+'tog-enotifwatchlistpages' => '當我監視列表中的頁面或檔案有更動時發電子郵件給我',
+'tog-enotifusertalkpages' => '我的對話頁有更動時發電子郵件給我',
+'tog-enotifminoredits' => '頁面和檔案的小修改也發電子郵件給我',
 'tog-enotifrevealaddr' => '在通知電子郵件中顯示我的電子郵件位址',
-'tog-shownumberswatching' => '顯示監視用戶的數目',
+'tog-shownumberswatching' => '顯示正在監視的使用者數目',
 'tog-oldsig' => '原有簽名:',
-'tog-fancysig' => '將簽名以維基文字對待 (不產生自動連結)',
-'tog-externaleditor' => '預設使用外部編輯器 (進階者專用,需要在您的電腦上作出一些特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
-'tog-externaldiff' => '預設使用外部差異分析 (進階者專用,需要在您的電腦上作出一些特別設定。[//www.mediawiki.org/wiki/Manual:External_editors 更多信息。])',
+'tog-fancysig' => '將簽名視為維基文字(不會自動產生連結)',
 'tog-showjumplinks' => '啟用「跳轉到」訪問連結',
-'tog-uselivepreview' => '使ç\94¨å¯¦æ\99\82é \90覽 ï¼\88é\9c\80è¦\81JavaScriptï¼\89ï¼\88試é©\97中ï¼\89',
-'tog-forceeditsummary' => '當沒有輸入摘要時提醒我',
+'tog-uselivepreview' => '使ç\94¨å\8d³æ\99\82é \90覽ï¼\88é\9c\80è¦\81 JavaScriptï¼\89ï¼\88實é©\97中ï¼\89',
+'tog-forceeditsummary' => '未輸入編輯摘要時提醒我',
 'tog-watchlisthideown' => '監視列表中隱藏我的編輯',
 'tog-watchlisthidebots' => '監視列表中隱藏機器人的編輯',
 'tog-watchlisthideminor' => '監視列表中隱藏小修改',
-'tog-watchlisthideliu' => '監視列表中隱藏登入用戶',
-'tog-watchlisthideanons' => '監視列表中隱藏匿名用戶',
+'tog-watchlisthideliu' => '監視列表中隱藏登入用戶的編輯',
+'tog-watchlisthideanons' => '監視列表中隱藏匿名用戶的編輯',
 'tog-watchlisthidepatrolled' => '監視清單中隱藏已巡查的編輯',
 'tog-ccmeonemails' => '當我寄電子郵件給其他用戶時,也寄一份副本到我的信箱',
-'tog-diffonly' => '比較版本差異時不顯示頁面內容',
+'tog-diffonly' => '比對版本差異時下面不顯示頁面內容',
 'tog-showhiddencats' => '顯示隱藏分類',
 'tog-noconvertlink' => '不轉換連結標題',
-'tog-norollbackdiff' => '進行回退後略過差異比較',
+'tog-norollbackdiff' => '回退後不做差異比對',
+'tog-useeditwarning' => '當離開頁面時編輯仍未儲存,請提醒我',
 
 'underline-always' => '總是使用',
 'underline-never' => '從不使用',
@@ -306,7 +312,7 @@ $messages = array(
 # Font style option in Special:Preferences
 'editfont-style' => '編輯區字型樣式:',
 'editfont-default' => '瀏覽器預設',
-'editfont-monospace' => '固定間距字型',
+'editfont-monospace' => '距字型',
 'editfont-sansserif' => '無襯線字型',
 'editfont-serif' => '襯線字型',
 
@@ -361,25 +367,37 @@ $messages = array(
 'oct' => '10月',
 'nov' => '11月',
 'dec' => '12月',
+'january-date' => '1月$1日',
+'february-date' => '2月$1日',
+'march-date' => '3月$1日',
+'april-date' => '4月$1日',
+'may-date' => '5月$1日',
+'june-date' => '6月$1日',
+'july-date' => '7月$1日',
+'august-date' => '8月$1日',
+'september-date' => '9月$1日',
+'october-date' => '10月$1日',
+'november-date' => '11月$1日',
+'december-date' => '12月$1日',
 
 # Categories related messages
 'pagecategories' => '$1個分類',
 'category_header' => '「$1」分類中的頁面',
-'subcategories' => '分類',
+'subcategories' => '分類',
 'category-media-header' => '「$1」分類中的媒體',
-'category-empty' => "''這個分類中尚未包含任何頁面或媒體。''",
+'category-empty' => "''此分類目前未包含頁面或媒體。''",
 'hidden-categories' => '$1個隱藏分類',
 'hidden-category-category' => '隱藏分類',
-'category-subcat-count' => '{{PLURAL:$2|這個分類中只有以下的子分類。|這個分類中有以下的 $1 個子分類,共有 $2 個子分類。}}',
-'category-subcat-count-limited' => '這個分類下有$1個附分類。',
-'category-article-count' => '{{PLURAL:$2|這個分類中只有以下的頁面。|這個分類中有以下的 $1 個頁面,共有 $2 個頁面。}}',
-'category-article-count-limited' => '這個分類下有$1個頁面。',
-'category-file-count' => '{{PLURAL:$2|這個分類中只有以下的檔案。|這個分類中有以下的 $1 個檔案,共有 $2 個檔案。}}',
-'category-file-count-limited' => '這個分類下有$1個檔案。',
+'category-subcat-count' => '{{PLURAL:$2|此分類有以下一個子分類。|此分類有 $2 個子分類,以下列出了 $1 個。}}',
+'category-subcat-count-limited' => '此分類有以下 $1 個子分類。',
+'category-article-count' => '{{PLURAL:$2|此分類有以下一個頁面。|此分類有 $2 個頁面,以下列出了 $1 個。}}',
+'category-article-count-limited' => '此分類有以下 $1 個頁面。',
+'category-file-count' => '{{PLURAL:$2|此分類有以下一個檔案。|此分類有 $2 個檔案,以下列出了 $1 個。}}',
+'category-file-count-limited' => '此分類有 $1 個檔案。',
 'listingcontinuesabbrev' => '續',
-'index-category' => '已索引的頁面',
-'noindex-category' => '未索引的頁面',
-'broken-file-category' => 'å\8c\85å\90«æ\90\8då£\9eç\9a\84檔案連結的頁面',
+'index-category' => '已索引的頁面',
+'noindex-category' => '未索引的頁面',
+'broken-file-category' => 'å\90«æ\9c\89æ\90\8då£\9e檔案連結的頁面',
 
 'about' => '關於',
 'article' => '內容頁面',
@@ -389,7 +407,7 @@ $messages = array(
 'morenotlisted' => '更多未列出的項目...',
 'mypage' => '頁面',
 'mytalk' => '討論',
-'anontalk' => 'IP的對話頁',
+'anontalk' => 'IP的對話頁',
 'navigation' => '導覽',
 'and' => '和',
 
@@ -476,19 +494,17 @@ $messages = array(
 'jumpto' => '跳轉到:',
 'jumptonavigation' => '導覽',
 'jumptosearch' => '搜尋',
-'view-pool-error' => '抱歉,現時伺服器已超出負荷。
-太多用戶正嘗試檢視此頁。
-請稍等一會後再次訪問此頁。
+'view-pool-error' => '抱歉,太多用戶正嘗試檢視此頁,使伺服器超出負荷。請稍候片刻再嘗試。
 
 $1',
-'pool-timeout' => '等待鎖死時超時',
+'pool-timeout' => '等待鎖定逾時',
 'pool-queuefull' => '請求池已滿',
 'pool-errorunknown' => '未知錯誤',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '關於 {{SITENAME}}',
 'aboutpage' => 'Project:關於',
-'copyright' => '本站的全部文本內容在$1之條款下提供。',
+'copyright' => '本站內容以$1條款提供。',
 'copyrightpage' => '{{ns:project}}:版權訊息',
 'currentevents' => '新聞動態',
 'currentevents-url' => 'Project:新聞動態',
@@ -501,15 +517,15 @@ $1',
 'mainpage-description' => '首頁',
 'policy-url' => 'Project:方針',
 'portal' => '社群主頁',
-'portal-url' => 'Project:社主頁',
+'portal-url' => 'Project:社主頁',
 'privacy' => '隱私政策',
-'privacypage' => 'Project:é\9a±ç§\81æ¬\8aæ\94¿ç­\96',
+'privacypage' => 'Project:隱私政策',
 
 'badaccess' => '權限錯誤',
-'badaccess-group0' => '你所請求執行的操作被禁止。',
-'badaccess-groups' => '您剛才的請求只有{{PLURAL:$2|這個|這些}}用戶組的用戶才能使用:$1',
+'badaccess-group0' => '系統不允許您執行這項操作。',
+'badaccess-groups' => '您請求的操作只有{{PLURAL:$2|這個|這些}}用戶群組的用戶能使用:$1',
 
-'versionrequired' => '需要MediaWiki $1 版',
+'versionrequired' => '需要 MediaWiki $1 版',
 'versionrequiredtext' => '需要版本$1的 MediaWiki 才能使用此頁。
 參見[[Special:Version|版本頁]]。',
 
@@ -522,7 +538,7 @@ $1',
 'youhavenewmessagesmanyusers' => '你有來自多位用戶的$1( $2 )。',
 'newmessageslinkplural' => '{{PLURAL:$1|一項新訊息|新訊息}}',
 'newmessagesdifflinkplural' => '最新{{PLURAL:$1|更改|更改}}',
-'youhavenewmessagesmulti' => '您在 $1 有一條新訊息',
+'youhavenewmessagesmulti' => '您在 $1 有新訊息',
 'editsection' => '編輯',
 'editold' => '編輯',
 'viewsourceold' => '檢視原始碼',
@@ -669,9 +685,18 @@ $2',
 'welcomecreation-msg' => '您的賬號已經建立。
 不要忘記設置[[Special:Preferences|{{SITENAME}}的個人參數]]。',
 'yourname' => '用戶名:',
+'userlogin-yourname' => '用戶名',
+'userlogin-yourname-ph' => '輸入你的用戶名',
 'yourpassword' => '您的密碼:',
+'userlogin-yourpassword' => '密碼',
+'userlogin-yourpassword-ph' => '輸入密碼',
+'createacct-yourpassword-ph' => '輸入密碼',
 'yourpasswordagain' => '再次輸入密碼:',
+'createacct-yourpasswordagain' => '確認密碼',
+'createacct-yourpasswordagain-ph' => '再次輸入密碼',
 'remembermypassword' => '在這個瀏覽器上記住我的登入資訊(可維持 $1 {{PLURAL:$1|天|天}})',
+'userlogin-remembermypassword' => '保持我的登入狀態',
+'userlogin-signwithsecure' => '使用安全連線',
 'securelogin-stick-https' => '登入後繼續以HTTPS連接',
 'yourdomainname' => '您的網域:',
 'password-change-forbidden' => '您不可更改此wiki上的密碼。',
@@ -684,17 +709,37 @@ $2',
 'logout' => '登出',
 'userlogout' => '登出',
 'notloggedin' => '未登入',
+'userlogin-noaccount' => '沒有帳戶嗎?',
+'userlogin-joinproject' => '參與 {{SITENAME}}',
 'nologin' => '您還沒有帳號嗎?$1。',
-'nologinlink' => '建立新帳號',
-'createaccount' => '建立新帳號',
+'nologinlink' => '建立帳戶',
+'createaccount' => '建立帳戶',
 'gotaccount' => '已經擁有帳號?$1。',
 'gotaccountlink' => '登入',
 'userlogin-resetlink' => '忘記了你的登錄信息?',
+'userlogin-resetpassword-link' => '重設密碼',
+'helplogin-url' => 'Help:登入',
+'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|登入説明]]',
+'createacct-join' => '輸入您的基本資料:',
+'createacct-emailrequired' => '電子郵件',
+'createacct-emailoptional' => '電子郵件(可選)',
+'createacct-email-ph' => '設置電郵地址',
 'createaccountmail' => '使用一個臨時的隨機密碼,並將它發送到以下指定的電子郵件地址',
+'createacct-realname' => '真實姓名(可選)',
 'createaccountreason' => '理由:',
+'createacct-reason' => '原因',
+'createacct-reason-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|貢獻者|貢獻者}}',
 'badretype' => '您所輸入的密碼並不相同。',
 'userexists' => '!您所輸入的用戶名稱已經存在,請另選一個名稱。',
 'loginerror' => '登入錯誤',
+'createacct-error' => '帳戶創建錯誤',
 'createaccounterror' => '無法建立帳號:$1',
 'nocookiesnew' => '已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。',
 'nocookieslogin' => '本站利用 Cookies 進行用戶登入,偵測到您已關閉 Cookies,請開啟它並重新登入。',
@@ -777,13 +822,15 @@ $2',
 'resetpass-wrong-oldpass' => '無效的臨時或現有的密碼。
 您可能已成功地更改了您的密碼,或者已經請求一個新的臨時密碼。',
 'resetpass-temp-password' => '臨時密碼:',
+'resetpass-abort-generic' => '擴充元件已中止了更改密碼操作。',
 
 # Special:PasswordReset
 'passwordreset' => '重新設定密碼',
-'passwordreset-text' => '完成此表格以重置您的密碼。',
+'passwordreset-text-one' => '完成此表格以重新設定您的密碼。',
+'passwordreset-text-many' => '{{PLURAL:$1|輸入其中一項資料以重新設定您的密碼。}}',
 'passwordreset-legend' => '重設密碼',
 'passwordreset-disabled' => '此維基上已禁止了重設密碼。',
-'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一個}}',
+'passwordreset-emaildisabled' => '電子郵件功能在此 wiki 上已禁用。',
 'passwordreset-username' => '用戶名:',
 'passwordreset-domain' => '域名:',
 'passwordreset-capture' => '查看生成的電子郵件嗎?',
@@ -809,7 +856,7 @@ $2
 臨時密碼:$2',
 'passwordreset-emailsent' => '已發送重置密碼電郵。',
 'passwordreset-emailsent-capture' => '重置密碼電子郵件已發送,並在下面顯示。',
-'passwordreset-emailerror-capture' => '生成的重置密碼電子郵件如下所示,但發送失敗:$1',
+'passwordreset-emailerror-capture' => '生成的重置密碼電子郵件如下所示,但發送給{{GENDER:$2|用戶}}失敗:$1',
 
 # Special:ChangeEmail
 'changeemail' => '更改電郵地址',
@@ -1013,12 +1060,14 @@ $2
 它可能剛剛被刪除。',
 'edit-conflict' => '編輯衝突。',
 'edit-no-change' => '您的編輯已經略過,因為文字無任何改動。',
+'postedit-confirmation' => '您的編輯已儲存。',
 'edit-already-exists' => '不可以建立一個新頁面。
 它已經存在。',
 'defaultmessagetext' => '預設訊息文字',
 'content-failed-to-parse' => '未能轉換$2 內容成為$1:$3',
 'invalid-content-data' => '內容資料無效',
 'content-not-allowed-here' => '[[$2]]頁面上不允許「$1」內容',
+'editwarning-warning' => '離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「編輯」部份裡關閉此警告。',
 
 # Content models
 'content-model-wikitext' => 'wiki語法',
@@ -1283,15 +1332,7 @@ $1",
 'powersearch-togglenone' => '無',
 'search-external' => '外部搜索',
 'searchdisabled' => '{{SITENAME}}由於性能方面的原因,全文搜索已被暫時停用。您可以暫時透過Google搜索。請留意他們的索引可能會過時。',
-
-# Quickbar
-'qbsettings' => '快速導航條',
-'qbsettings-none' => '無',
-'qbsettings-fixedleft' => '左側固定',
-'qbsettings-fixedright' => '右側固定',
-'qbsettings-floatingleft' => '左側漂移',
-'qbsettings-floatingright' => '右側漂移',
-'qbsettings-directionality' => '固定,取決於你的語言腳本的方向性',
+'search-error' => '搜尋時發生錯誤:$1',
 
 # Preferences page
 'preferences' => '偏好設定',
@@ -1434,6 +1475,7 @@ $1",
 'userrights-notallowed' => '您的賬戶無權限來添加或刪除用戶權限。',
 'userrights-changeable-col' => '您可以更改的群組',
 'userrights-unchangeable-col' => '您不可以更改的群組',
+'userrights-conflict' => '使用者權限衝突!請重新套用您的更改。',
 
 # Groups
 'group' => '群組:',
@@ -1826,7 +1868,6 @@ $1',
 'http-read-error' => 'HTTP讀取錯誤。',
 'http-timed-out' => 'HTTP請求已過時。',
 'http-curl-error' => '擷取URL時出錯:$1',
-'http-host-unreachable' => '無法到達URL。',
 'http-bad-status' => '進行HTTP請求時出現問題:$1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -1999,7 +2040,7 @@ Template:消除歧義',
 'double-redirect-fixed-maintenance' => '修復從[[$1]]到[[$2]]的雙重重定向。',
 'double-redirect-fixer' => '重新定向修正器',
 
-'brokenredirects' => '損壞的重定向頁',
+'brokenredirects' => '受損重定向頁',
 'brokenredirectstext' => '以下的重定向頁指向的是不存在的頁面:',
 'brokenredirects-edit' => '編輯',
 'brokenredirects-delete' => '刪除',
@@ -2228,8 +2269,7 @@ Template:消除歧義',
 'watchnologin' => '未登入',
 'watchnologintext' => '您必須先[[Special:UserLogin|登入]],才能更改您的監視列表。',
 'addwatch' => '加至監視列表',
-'addedwatchtext' => '頁面「[[:$1]]」已加到您的[[Special:Watchlist|監視清單]]中。
-將來有關此頁面及其討論頁的任何修改將會在那裡列出。',
+'addedwatchtext' => '已將頁面「[[:$1]]」加入您的[[Special:Watchlist|監視列表]]。將來此頁面及其討論頁如有更動都會在那裡列出。',
 'removewatch' => '停止監視',
 'removedwatchtext' => '[[:$1]]已經從[[Special:Watchlist|您的監視頁面]]中移除。',
 'watch' => '監視',
@@ -2239,9 +2279,9 @@ Template:消除歧義',
 'notanarticle' => '不是頁面',
 'notvisiblerev' => '上次由不同用戶所作的修訂版本已經刪除',
 'watchnochange' => '在顯示的時間段內您所監視的頁面沒有更改。',
-'watchlist-details' => 'ä¸\8då\8c\85å\90«è¨\8eè«\96é \81ï¼\8cæ\9c\89 $1 é \81å\9c¨æ\82¨ç\9a\84ç\9b£è¦\96å\88\97表ä¸\8a。',
-'wlheader-enotif' => '已經啟動電子郵件通知功能。',
-'wlheader-showupdated' => "* 在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''",
+'watchlist-details' => 'ä¸\8då\8c\85å\90«è¨\8eè«\96é \81ï¼\8cæ\82¨ç\9a\84ç\9b£è¦\96å\88\97表ä¸\8aæ\9c\89 $1 å\80\8bé \81é\9d¢。',
+'wlheader-enotif' => '已經啟動電子郵件通知功能。',
+'wlheader-showupdated' => "在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''。",
 'watchmethod-recent' => '檢查被監視頁面的最近編輯',
 'watchmethod-list' => '檢查最近編輯的被監視頁面',
 'watchlistcontains' => '您的監視列表包含$1個頁面。',
@@ -2267,7 +2307,7 @@ Template:消除歧義',
 'enotif_body_intro_created' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2建立,請見$3瀏覽當前版本。。',
 'enotif_body_intro_moved' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2移動,請見$3瀏覽當前版本。',
 'enotif_body_intro_restored' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2恢復,請見$3瀏覽當前版本。',
-'enotif_body_intro_changed' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2修改,請見$3瀏覽當前版本。',
+'enotif_body_intro_changed' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2修改,請見 $3 瀏覽當前版本。',
 'enotif_lastvisited' => '請參閱 $1 檢視你上次訪問後的所有更改。',
 'enotif_lastdiff' => '請參閱 $1 檢視該更改。',
 'enotif_anon_editor' => '匿名用戶$1',
@@ -2391,7 +2431,7 @@ $UNWATCHURL
 'protect-summary-cascade' => '連鎖',
 'protect-expiring' => '終止於 $1 (UTC)',
 'protect-expiring-local' => '$1到期',
-'protect-expiry-indefinite' => '永久',
+'protect-expiry-indefinite' => '無限期',
 'protect-cascade' => '保護本頁中包含的頁面 (連鎖保護)',
 'protect-cantedit' => '您無法更改這個頁面的保護等級,因為您沒有權限去編輯它。',
 'protect-othertime' => '其它時間:',
@@ -2554,7 +2594,7 @@ $1',
 'ipbenableautoblock' => '自動查封此用戶最後所用的IP位址,以及後來試圖編輯所用的所有位址',
 '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',
+'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',
 'ipbotheroption' => '其他',
 'ipbotherreason' => '其它/附帶原因:',
 'ipbhidename' => '在編輯及列表中隱藏用戶名',
@@ -2595,7 +2635,7 @@ $1',
 'ipblocklist-submit' => '搜尋',
 'ipblocklist-localblock' => '本地封鎖',
 'ipblocklist-otherblocks' => '其他{{PLURAL:$1|封鎖|封鎖}}',
-'infiniteblock' => '永久',
+'infiniteblock' => '無限期',
 'expiringblock' => '$1 $2 到期',
 'anononlyblock' => '僅限匿名用戶',
 'noautoblockblock' => '禁用自動查封',
@@ -2644,6 +2684,7 @@ $1被封禁的理由是“$2”',
 'proxyblocksuccess' => '完成。',
 'sorbsreason' => '您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器。',
 'sorbs_create_account_reason' => '由於您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器,所以您無法建立賬號。',
+'xffblockreason' => '您或您使用的代理伺服器X-Forwarded-For字段所包含的一個IP地址已被封禁。原始封禁理由:$1',
 'cant-block-while-blocked' => '當您被封鎖時不可以封鎖其他用戶。',
 'cant-see-hidden-user' => '您現正嘗試封鎖的用戶已經被封鎖或隱藏。
 您現在沒有隱藏用戶的權限,您不可以檢視或者編輯這位用戶的封鎖。',
@@ -2810,6 +2851,8 @@ $1被封禁的理由是“$2”',
 'thumbnail-more' => '放大',
 'filemissing' => '無法找到檔案',
 'thumbnail_error' => '創建縮圖錯誤: $1',
+'thumbnail_error_remote' => '$1發出的電子郵件:
+$2',
 'djvu_page_error' => 'DjVu頁面超出範圍',
 'djvu_no_xml' => '無法在DjVu檔案中擷取XML',
 'thumbnail-temp-create' => '無法創建臨時縮略圖文件',
@@ -2958,17 +3001,11 @@ $1被封禁的理由是“$2”',
 
 # Stylesheets
 'common.css' => '/* 此處的 CSS 將應用於所有的面板 */',
-'standard.css' => '/* 此處的 CSS 將影響使用標準面板的用戶 */',
-'nostalgia.css' => '/* 此處的 CSS 將影響使用懷舊面板的用戶 */',
 'cologneblue.css' => '/* 此處的 CSS 將影響使用科隆香水藍面板的用戶 */',
 'monobook.css' => '/* 此處的 CSS 將影響使用 Monobook 面板的用戶 */',
-'myskin.css' => '/* 此處的 CSS 將影響使用 MySkin 面板的用戶 */',
-'chick.css' => '/* 此處的 CSS 將影響使用 Chick 面板的用戶 */',
-'simple.css' => '/* 此處的 CSS 將影響使用 Simple 面板的用戶 */',
 'modern.css' => '/* 此處的 CSS 將影響使用 Modern 面板的用戶 */',
 'vector.css' => '/* 此處的 CSS 將影響使用 Vector 面板的用戶 */',
 'print.css' => '/* 此處的 CSS 將影響打印輸出 */',
-'handheld.css' => '/* 此處的 CSS 將影響在 $wgHandheldStyle 設定手提裝置面板 */',
 'noscript.css' => '/* 此處的 CSS 將影響沒有啓用 JavaScript 的用戶 */',
 'group-autoconfirmed.css' => '/* 此處的 CSS 將只會影響自動確認用戶 */',
 'group-bot.css' => '/* 此處的 CSS 將只會影響機器人 */',
@@ -2977,13 +3014,8 @@ $1被封禁的理由是“$2”',
 
 # Scripts
 'common.js' => '/* 此處的JavaScript將載入於所有用戶每一個頁面。 */',
-'standard.js' => '/* 此處的JavaScript將載入於使用標準面板的用戶 */',
-'nostalgia.js' => '/* 此處的JavaScript將載入於使用懷舊面板的用戶 */',
 'cologneblue.js' => '/* 此處的JavaScript將載入於使用科隆香水藍面板的用戶 */',
 'monobook.js' => '/* 此處的JavaScript將載入於使用Monobook面板的用戶 */',
-'myskin.js' => '/* 此處的JavaScript將載入於使用MySkin面板的用戶 */',
-'chick.js' => '/* 此處的JavaScript將載入於使用Chick面板的用戶 */',
-'simple.js' => '/* 此處的JavaScript將載入於使用Simple面板的用戶 */',
 'modern.js' => '/* 此處的JavaScript將載入於使用Modern面板的用戶 */',
 'vector.js' => '/* 此處的JavaScript將載入於使用Vector面板的用戶 */',
 
@@ -3059,10 +3091,7 @@ $1被封禁的理由是“$2”',
 'pageinfo-category-files' => '編輯數量',
 
 # Skin names
-'skinname-standard' => '標準',
-'skinname-nostalgia' => '懷舊',
 'skinname-cologneblue' => '科隆香水藍',
-'skinname-simple' => '簡單',
 'skinname-modern' => '現代',
 
 # Patrolling
@@ -3140,11 +3169,25 @@ $1',
 'minutes' => '$1分鍾',
 'hours' => '$1小時',
 'days' => '$1天',
+'weeks' => '{{PLURAL:$1|$1周|$1周}}',
 'months' => '{{PLURAL:$1|$1個月|$1個月}}',
 'years' => '{{PLURAL:$1|$1年|$1年}}',
 'ago' => '$1前',
 'just-now' => '剛才',
 
+# Human-readable timestamps
+'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',
+'yesterday-at' => '昨天$1',
+
 # Bad image list
 'bad_image_list' => '請按照下列格式編寫:
 
@@ -3154,8 +3197,6 @@ $1',
 
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => '‪中文(简体)',
@@ -3195,7 +3236,7 @@ Variants for Chinese language
 * gpslongitude
 * gpsaltitude',
 
-# EXIF tags
+# Exif tags
 'exif-imagewidth' => '寬度',
 'exif-imagelength' => '高度',
 'exif-bitspersample' => '每象素比特數',
@@ -3373,7 +3414,7 @@ Variants for Chinese language
 'exif-originalimageheight' => '被裁剪前高度',
 'exif-originalimagewidth' => '被裁剪前寬度',
 
-# EXIF attributes
+# Exif attributes
 'exif-compression-1' => '未壓縮',
 'exif-compression-2' => 'CCITT第3組一維修改霍夫曼遊程編碼',
 'exif-compression-3' => 'CCITT第3組傳真編碼',
@@ -3787,11 +3828,17 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'version-entrypoints-header-entrypoint' => '入口點',
 'version-entrypoints-header-url' => 'URL',
 
-# Special:FilePath
-'filepath' => '檔案路徑',
-'filepath-page' => '檔案名:',
-'filepath-submit' => '前往',
-'filepath-summary' => '這個特殊頁面擷取一個檔案的完整路徑。圖片會以完整的解像度顯示,其它的檔案類型會以同它們已關聯程式啟動。',
+# Special:Redirect
+'redirect' => '重定向檔案、用戶ID或頁面修訂ID',
+'redirect-legend' => '重定向到檔案或頁面',
+'redirect-summary' => '此特殊頁面重定向到檔案(指定的檔案名稱)、頁面 (指定的頁面修訂ID) 或用戶頁面(指定的用戶ID數值)。',
+'redirect-submit' => '提交',
+'redirect-lookup' => '尋找:',
+'redirect-value' => '值:',
+'redirect-user' => '用戶ID:',
+'redirect-revision' => '頁面修訂ID',
+'redirect-file' => '檔案名稱',
+'redirect-not-exists' => '找不到',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => '選擇重覆檔案',
@@ -3883,6 +3930,9 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'htmlform-submit' => '提交',
 'htmlform-reset' => '撤銷更改',
 'htmlform-selectorother-other' => '其他',
+'htmlform-no' => '否',
+'htmlform-yes' => '是',
+'htmlform-chosen-placeholder' => '選項',
 
 # SQLite database support
 'sqlite-has-fts' => '帶全文搜尋的版本$1',
@@ -3892,14 +3942,14 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'logentry-delete-delete' => '$1刪除頁面$3',
 'logentry-delete-restore' => '$1恢復頁面$3',
 'logentry-delete-event' => '$1已更改$3中$5項日誌的可見性:$4',
-'logentry-delete-revision' => '$1已更改$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$4',
-'logentry-delete-event-legacy' => '$1已更改$3中日誌的可見性',
-'logentry-delete-revision-legacy' => '$1已更改$3中歷史版本的可見性',
-'logentry-suppress-delete' => '$1已隱藏頁面$3',
-'logentry-suppress-event' => '$1已不可見地更改$3中{{PLURAL:$5|$5項日誌|$5項日誌}}的可見性:$4',
-'logentry-suppress-revision' => '$1已不可見地更改$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$4',
-'logentry-suppress-event-legacy' => '$1已不可見地更改$3中日誌的可見性',
-'logentry-suppress-revision-legacy' => '$1已不可見地更改$3中歷史版本的可見性',
+'logentry-delete-revision' => '$1已{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$4',
+'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|更改}}$3中{{PLURAL:$5|$5項日誌|$5項日誌}}的可見性:$4',
+'logentry-suppress-revision' => '$1已不可見地{{GENDER:$2|更改}}$3中{{PLURAL:$5|$5個歷史版本|$5個歷史版本}}的可見性:$4',
+'logentry-suppress-event-legacy' => '$1已不可見地{{GENDER:$2|更改}}$3中日誌的可見性',
+'logentry-suppress-revision-legacy' => '$1已不可見地{{GENDER:$2|更改}}$3中歷史版本的可見性',
 'revdelete-content-hid' => '隱藏內容',
 'revdelete-summary-hid' => '隱藏編輯摘要',
 'revdelete-uname-hid' => '隱藏用戶名',
@@ -3912,13 +3962,13 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'logentry-move-move-noredirect' => '$1移動$3頁面至$4,不留重定向',
 'logentry-move-move_redir' => '$1通過重定向移動$3頁面至$4',
 'logentry-move-move_redir-noredirect' => '$1通過重定向移動$3頁面至$4,不留重定向',
-'logentry-patrol-patrol' => '$1標記頁面$3的版本$4為已巡查',
-'logentry-patrol-patrol-auto' => '$1自動標記頁面$3的版本$4為已巡查',
-'logentry-newusers-newusers' => '已建立用戶「$1」',
-'logentry-newusers-create' => '已建立用戶「$1」',
+'logentry-patrol-patrol' => '$1{{GENDER:$2|標記}}頁面$3的版本$4為已巡查',
+'logentry-patrol-patrol-auto' => '$1自動{{GENDER:$2|標記}}頁面$3的版本$4為已巡查',
+'logentry-newusers-newusers' => '已{{GENDER:$2|建立}}用戶「$1」',
+'logentry-newusers-create' => '已{{GENDER:$2|建立}}用戶「$1」',
 'logentry-newusers-create2' => '用戶「$1」建立用戶「$3」',
 'logentry-newusers-byemail' => '$1建立用戶$3並電郵密碼給他',
-'logentry-newusers-autocreate' => '用戶$1被自動創建',
+'logentry-newusers-autocreate' => '用戶$1被自動{{GENDER:$2|建立}}',
 'logentry-rights-rights' => '$1將$3的權限從$4改為$5',
 'logentry-rights-rights-legacy' => '$1更改$3的權限',
 'logentry-rights-autopromote' => '$1的權限自動從$4改為$5',
index 56627f7..43e8aaf 100644 (file)
@@ -67,7 +67,7 @@ class CLDRPluralRuleEvaluator {
        public static function evaluateCompiled( $number, array $rules ) {
                // The compiled form is RPN, with tokens strictly delimited by
                // spaces, so this is a simple RPN evaluator.
-               foreach ( $rules as $i => $rule  ) {
+               foreach ( $rules as $i => $rule ) {
                        $stack = array();
                        $zero = ord( '0' );
                        $nine = ord( '9' );
@@ -104,7 +104,7 @@ class CLDRPluralRuleEvaluator {
         */
        private static function doOperation( $token, $left, $right ) {
                if ( in_array( $token, array( 'in', 'not-in', 'within', 'not-within' ) ) ) {
-                       if ( !($right instanceof CLDRPluralRuleEvaluator_Range ) ) {
+                       if ( !( $right instanceof CLDRPluralRuleEvaluator_Range ) ) {
                                $right = new CLDRPluralRuleEvaluator_Range( $right );
                        }
                }
@@ -305,7 +305,7 @@ class CLDRPluralRuleConverter {
                                continue;
                        } else {
                                // Operator
-                               if  ( !$expectOperator ) {
+                               if ( !$expectOperator ) {
                                        $token->error( 'unexpected operator' );
                                }
                                // Resolve higher precedence levels
@@ -381,7 +381,7 @@ class CLDRPluralRuleConverter {
 
                // Word
                if ( !preg_match( self::WORD_REGEX, $this->rule, $m, 0, $this->pos ) ) {
-                       $this->error( 'unexpected character "' . $this->rule[$this->pos] . '"'  );
+                       $this->error( 'unexpected character "' . $this->rule[$this->pos] . '"' );
                }
                $word1 = strtolower( $m[0] );
                $word2 = '';
index f363c3f..1790f48 100644 (file)
--- a/load.php
+++ b/load.php
 // Bail if PHP is too low
 if ( !function_exists( 'version_compare' ) || version_compare( phpversion(), '5.3.2' ) < 0 ) {
        // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
-       require( dirname( __FILE__ ) . '/includes/PHPVersionError.php' );
+       require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
        wfPHPVersionError( 'load.php' );
 }
 
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       require ( 'phase3/includes/WebStart.php' );
-} else {
-       require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 wfProfileIn( 'load.php' );
 
index e6862ac..90e4f7e 100644 (file)
@@ -44,7 +44,7 @@ QT_AUTOBRIEF           = NO
 MULTILINE_CPP_IS_BRIEF = NO
 INHERIT_DOCS           = YES
 SEPARATE_MEMBER_PAGES  = NO
-TAB_SIZE               = 8
+TAB_SIZE               = 4
 ALIASES =      "type{1}=<b> \1 </b>:" \
                "types{2}=<b> \1 </b> or <b> \2 </b>:" \
                "types{3}=<b> \1 </b>, <b> \2 </b>, or <b> \3 </b>:" \
@@ -176,6 +176,7 @@ FILE_PATTERNS          = *.c \
                          *.txt \
                          README
 RECURSIVE              = YES
+EXCLUDE                = {{EXCLUDE}}
 EXCLUDE_SYMLINKS       = YES
 EXCLUDE_PATTERNS       = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE_PATTERNS}}
 EXCLUDE_SYMBOLS        =
index a13453d..b4df328 100644 (file)
@@ -23,7 +23,7 @@
 // Make sure we're on PHP5.3.2 or better
 if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
        // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
-       require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+       require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
        wfPHPVersionError( 'cli' );
 }
 
@@ -54,8 +54,8 @@ abstract class Maintenance {
         * Constants for DB access type
         * @see Maintenance::getDbType()
         */
-       const DB_NONE  = 0;
-       const DB_STD   = 1;
+       const DB_NONE = 0;
+       const DB_STD = 1;
        const DB_ADMIN = 2;
 
        // Const for getStdin()
@@ -153,7 +153,7 @@ abstract class Maintenance {
                        return false; // last call should be to this function
                }
                $includeFuncs = array( 'require_once', 'require', 'include', 'include_once' );
-               for( $i=1; $i < $count; $i++ ) {
+               for ( $i = 1; $i < $count; $i++ ) {
                        if ( !in_array( $bt[$i]['function'], $includeFuncs ) ) {
                                return false; // previous calls should all be "requires"
                        }
@@ -327,7 +327,7 @@ abstract class Maintenance {
                }
                if ( $channel === null ) {
                        $this->cleanupChanneled();
-                       print( $out );
+                       print $out;
                } else {
                        $out = preg_replace( '/\n\z/', '', $out );
                        $this->outputChanneled( $out, $channel );
@@ -426,9 +426,10 @@ abstract class Maintenance {
                $this->addOption( 'server', "The protocol and server name to use in URLs, e.g. " .
                                "http://en.wikipedia.org. This is sometimes necessary because " .
                                "server name detection may fail in command line scripts.", false, true );
+               $this->addOption( 'profiler', 'Set to "text" or "trace" show profiling output', false, true );
 
                # Save generic options to display them separately in help
-               $this->mGenericParameters = $this->mParams ;
+               $this->mGenericParameters = $this->mParams;
 
                # Script dependant options:
 
@@ -454,7 +455,7 @@ abstract class Maintenance {
                // Make sure the class is loaded first
                if ( !MWInit::classExists( $maintClass ) ) {
                        if ( $classFile ) {
-                               require_once( $classFile );
+                               require_once $classFile;
                        }
                        if ( !MWInit::classExists( $maintClass ) ) {
                                $this->error( "Cannot spawn child: $maintClass" );
@@ -515,7 +516,7 @@ abstract class Maintenance {
                $wgCommandLineMode = true;
 
                # Turn off output buffering if it's on
-               while( ob_get_level() > 0 ) {
+               while ( ob_get_level() > 0 ) {
                        ob_end_flush();
                }
 
@@ -634,7 +635,7 @@ abstract class Maintenance {
                        } elseif ( substr( $arg, 0, 1 ) == '-' ) {
                                # Short options
                                for ( $p = 1; $p < strlen( $arg ); $p++ ) {
-                                       $option = $arg { $p } ;
+                                       $option = $arg { $p };
                                        if ( !isset( $this->mParams[$option] ) && isset( $this->mShortParamsMap[$option] ) ) {
                                                $option = $this->mShortParamsMap[$option];
                                        }
@@ -712,7 +713,7 @@ abstract class Maintenance {
         * @param $force boolean Whether to force the help to show, default false
         */
        protected function maybeHelp( $force = false ) {
-               if( !$force && !$this->hasOption( 'help' ) ) {
+               if ( !$force && !$this->hasOption( 'help' ) ) {
                        return;
                }
 
@@ -743,8 +744,9 @@ abstract class Maintenance {
                                } else {
                                        $output .= '[' . $arg['name'] . ']';
                                }
-                               if ( $k < count( $this->mArgList ) - 1 )
+                               if ( $k < count( $this->mArgList ) - 1 ) {
                                        $output .= ' ';
+                               }
                        }
                }
                $this->output( "$output\n\n" );
@@ -765,7 +767,7 @@ abstract class Maintenance {
                $this->output( "\n" );
 
                $scriptDependantParams = $this->mDependantParameters;
-               if( count($scriptDependantParams) > 0 ) {
+               if ( count( $scriptDependantParams ) > 0 ) {
                        $this->output( "Script dependant parameters:\n" );
                        // Parameters description
                        foreach ( $scriptDependantParams as $par => $info ) {
@@ -790,7 +792,7 @@ abstract class Maintenance {
                        $this->mGenericParameters,
                        $this->mDependantParameters
                );
-               if( count($scriptSpecificParams) > 0 ) {
+               if ( count( $scriptSpecificParams ) > 0 ) {
                        $this->output( "Script specific parameters:\n" );
                        // Parameters description
                        foreach ( $scriptSpecificParams as $par => $info ) {
@@ -806,7 +808,7 @@ abstract class Maintenance {
                }
 
                // Print arguments
-               if( count( $this->mArgList ) > 0 ) {
+               if ( count( $this->mArgList ) > 0 ) {
                        $this->output( "Arguments:\n" );
                        // Arguments description
                        foreach ( $this->mArgList as $info ) {
@@ -839,7 +841,7 @@ abstract class Maintenance {
                $wgCommandLineMode = true;
 
                # Override $wgServer
-               if( $this->hasOption( 'server') ) {
+               if ( $this->hasOption( 'server' ) ) {
                        $wgServer = $this->getOption( 'server', $wgServer );
                }
 
@@ -876,6 +878,16 @@ abstract class Maintenance {
                $wgShowSQLErrors = true;
                @set_time_limit( 0 );
                $this->adjustMemoryLimit();
+
+               // Per-script profiling; useful for debugging
+               $forcedProfiler = $this->getOption( 'profiler' );
+               if ( $forcedProfiler === 'text' ) {
+                       Profiler::setInstance( new ProfilerSimpleText( array() ) );
+                       Profiler::instance()->setTemplated( true );
+               } elseif ( $forcedProfiler === 'trace' ) {
+                       Profiler::setInstance( new ProfilerSimpleTrace( array() ) );
+                       Profiler::instance()->setTemplated( true );
+               }
        }
 
        /**
@@ -906,7 +918,7 @@ abstract class Maintenance {
 
                if ( isset( $this->mOptions['conf'] ) ) {
                        $settingsFile = $this->mOptions['conf'];
-               } elseif ( defined("MW_CONFIG_FILE") ) {
+               } elseif ( defined( "MW_CONFIG_FILE" ) ) {
                        $settingsFile = MW_CONFIG_FILE;
                } else {
                        $settingsFile = "$IP/LocalSettings.php";
@@ -1025,7 +1037,7 @@ abstract class Maintenance {
                                                ( strpos( file_get_contents( $file ), '$maintClass' ) === false ) ) {
                                                continue;
                                        }
-                                       require( $file );
+                                       require $file;
                                        $vars = get_defined_vars();
                                        if ( array_key_exists( 'maintClass', $vars ) ) {
                                                self::$mCoreScripts[$vars['maintClass']] = $file;
@@ -1076,7 +1088,7 @@ abstract class Maintenance {
         * @param &$db DatabaseBase object
         */
        private function unlockSearchindex( &$db ) {
-               $db->unlockTables(  __CLASS__ . '::' . __METHOD__ );
+               $db->unlockTables( __CLASS__ . '::' . __METHOD__ );
        }
 
        /**
@@ -1190,7 +1202,9 @@ abstract class Maintenance {
                                        $st = fgets( STDIN, 1024 );
                                }
                        }
-                       if ( $st === false ) return false;
+                       if ( $st === false ) {
+                               return false;
+                       }
                        $resp = trim( $st );
                        return $resp;
                }
diff --git a/maintenance/archives/patch-eu_local_id.sql b/maintenance/archives/patch-eu_local_id.sql
deleted file mode 100644 (file)
index bb59d06..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-ALTER TABLE /*_*/external_user
-CHANGE COLUMN eu_wiki_id
-eu_local_id int unsigned NOT NULL;
diff --git a/maintenance/archives/patch-external_user.sql b/maintenance/archives/patch-external_user.sql
deleted file mode 100644 (file)
index 176b46d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-CREATE TABLE /*_*/external_user (
-  -- Foreign key to user_id
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-
-  -- Some opaque identifier provided by the external database
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
diff --git a/maintenance/archives/patch-img_media_mime-index.sql b/maintenance/archives/patch-img_media_mime-index.sql
new file mode 100644 (file)
index 0000000..bfaf84f
--- /dev/null
@@ -0,0 +1,4 @@
+-- New index on image table to allow searches for types i.e. video webm
+-- Added 2013-01-08
+
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
diff --git a/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql b/maintenance/archives/patch-iwl_prefix_title_from-non-unique.sql
new file mode 100644 (file)
index 0000000..bff63c7
--- /dev/null
@@ -0,0 +1,5 @@
+--
+-- Makes the iwl_prefix_title_from index for the iwlinks table non-unique
+--
+DROP INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks;
+CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
diff --git a/maintenance/archives/patch-iwlinks-from-title-index.sql b/maintenance/archives/patch-iwlinks-from-title-index.sql
new file mode 100644 (file)
index 0000000..8b73f9e
--- /dev/null
@@ -0,0 +1,4 @@
+--
+-- Recreates the iwl_prefix_from_title index for the iwlinks table
+--
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
diff --git a/maintenance/archives/patch-kill-iwl_pft.sql b/maintenance/archives/patch-kill-iwl_pft.sql
deleted file mode 100644 (file)
index 96e1435..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill the old iwl_prefix_from_title index, which may be present on some
--- installs if they ran update.php between it being added and being renamed
---
-
-DROP INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks;
-
index f080645..0749bbf 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceArchive
  */
 
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
 
 /**
  * Maintenance script that upgrade for log_id/log_deleted fields in a
index 475cafc..2cf277f 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to correct wrong values in the `page_latest` field
@@ -83,4 +83,4 @@ class AttachLatest extends Maintenance {
 }
 
 $maintClass = "AttachLatest";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index e3dc488..db045cf 100644 (file)
@@ -40,17 +40,17 @@ class BackupDumper {
        var $reportingInterval = 100;
        var $reporting = true;
        var $pageCount = 0;
-       var $revCount  = 0;
-       var $server    = null; // use default
-       var $pages     = null; // all pages
+       var $revCount = 0;
+       var $server = null; // use default
+       var $pages = null; // all pages
        var $skipHeader = false; // don't output <mediawiki> and <siteinfo>
        var $skipFooter = false; // don't output </mediawiki>
-       var $startId    = 0;
-       var $endId      = 0;
+       var $startId = 0;
+       var $endId = 0;
        var $revStartId = 0;
-       var $revEndId   = 0;
-       var $sink       = null; // Output filters
-       var $stubText   = false; // include rev_text_id instead of text; for 2-pass dump
+       var $revEndId = 0;
+       var $sink = null; // Output filters
+       var $stubText = false; // include rev_text_id instead of text; for 2-pass dump
        var $dumpUploads = false;
        var $dumpUploadFileContents = false;
        var $lastTime = 0;
@@ -116,7 +116,7 @@ class BackupDumper {
         */
        function loadPlugin( $class, $file ) {
                if ( $file != '' ) {
-                       require_once( $file );
+                       require_once $file;
                }
                $register = array( $class, 'register' );
                call_user_func_array( $register, array( &$this ) );
@@ -133,7 +133,7 @@ class BackupDumper {
                        $matches = array();
                        if ( preg_match( '/^--(.+?)(?:=(.+?)(?::(.+?))?)?$/', $arg, $matches ) ) {
                                @list( /* $full */ , $opt, $val, $param ) = $matches;
-                               switch( $opt ) {
+                               switch ( $opt ) {
                                case "plugin":
                                        $this->loadPlugin( $val, $param );
                                        break;
@@ -202,8 +202,9 @@ class BackupDumper {
        function dump( $history, $text = WikiExporter::TEXT ) {
                # Notice messages will foul up your XML output even if they're
                # relatively harmless.
-               if ( ini_get( 'display_errors' ) )
+               if ( ini_get( 'display_errors' ) ) {
                        ini_set( 'display_errors', 'stderr' );
+               }
 
                $this->initProgress( $history );
 
@@ -215,8 +216,9 @@ class BackupDumper {
                $wrapper = new ExportProgressFilter( $this->sink, $this );
                $exporter->setOutputSink( $wrapper );
 
-               if ( !$this->skipHeader )
+               if ( !$this->skipHeader ) {
                        $exporter->openStream();
+               }
                # Log item dumps: all or by range
                if ( $history & WikiExporter::LOGS ) {
                        if ( $this->startId || $this->endId ) {
@@ -225,7 +227,7 @@ class BackupDumper {
                                $exporter->allLogs();
                        }
                # Page dumps: all or by page ID range
-               } else if ( is_null( $this->pages ) ) {
+               } elseif ( is_null( $this->pages ) ) {
                        if ( $this->startId || $this->endId ) {
                                $exporter->pagesByRange( $this->startId, $this->endId );
                        } elseif ( $this->revStartId || $this->revEndId ) {
@@ -238,8 +240,9 @@ class BackupDumper {
                        $exporter->pagesByName( $this->pages );
                }
 
-               if ( !$this->skipFooter )
+               if ( !$this->skipFooter ) {
                        $exporter->closeStream();
+               }
 
                $this->report( true );
        }
@@ -365,7 +368,7 @@ class BackupDumper {
 
        function fatalError( $msg ) {
                $this->progress( "$msg\n" );
-               die(1);
+               die( 1 );
        }
 }
 
index cc0a7e1..04352b9 100644 (file)
@@ -51,7 +51,7 @@ class BaseDump {
                $this->infiles = explode( ';', $infile );
                $this->reader = new XMLReader();
                $infile = array_shift( $this->infiles );
-               if (defined( 'LIBXML_PARSEHUGE' ) ) {
+               if ( defined( 'LIBXML_PARSEHUGE' ) ) {
                        $this->reader->open( $infile, null, LIBXML_PARSEHUGE );
                }
                else {
@@ -110,8 +110,8 @@ class BaseDump {
                        }
                } else {
                        $this->close();
-                       if (count($this->infiles)) {
-                               $infile = array_shift($this->infiles);
+                       if ( count( $this->infiles ) ) {
+                               $infile = array_shift( $this->infiles );
                                $this->reader->open( $infile );
                                $this->atEnd = false;
                        }
@@ -181,7 +181,7 @@ class BaseDump {
                }
                $buffer = "";
                while ( $this->reader->read() ) {
-                       switch( $this->reader->nodeType ) {
+                       switch ( $this->reader->nodeType ) {
                        case XMLReader::TEXT:
 //                     case XMLReader::WHITESPACE:
                        case XMLReader::SIGNIFICANT_WHITESPACE:
index 0b8b344..c5e48f4 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/backup.inc' );
+require_once __DIR__ . '/backup.inc';
 
 /**
  * @ingroup Maintenance
@@ -141,8 +141,9 @@ class TextPassDumper extends BackupDumper {
        function dump( $history, $text = WikiExporter::TEXT ) {
                // Notice messages will foul up your XML output even if they're
                // relatively harmless.
-               if ( ini_get( 'display_errors' ) )
+               if ( ini_get( 'display_errors' ) ) {
                        ini_set( 'display_errors', 'stderr' );
+               }
 
                $this->initProgress( $this->history );
 
@@ -182,7 +183,7 @@ class TextPassDumper extends BackupDumper {
                global $IP;
                $url = $this->processFileOpt( $val, $param );
 
-               switch( $opt ) {
+               switch ( $opt ) {
                case 'prefetch':
                        require_once "$IP/maintenance/backupPrefetch.inc";
                        $this->prefetch = new BaseDump( $url );
@@ -214,7 +215,7 @@ class TextPassDumper extends BackupDumper {
        function processFileOpt( $val, $param ) {
                $fileURIs = explode( ';', $param );
                foreach ( $fileURIs as $URI ) {
-                       switch( $val ) {
+                       switch ( $val ) {
                                case "file":
                                        $newURI = $URI;
                                        break;
@@ -298,7 +299,7 @@ class TextPassDumper extends BackupDumper {
        }
 
        function checkIfTimeExceeded() {
-               if ( $this->maxTimeAllowed &&  ( $this->lastTime - $this->timeOfCheckpoint  > $this->maxTimeAllowed ) ) {
+               if ( $this->maxTimeAllowed && ( $this->lastTime - $this->timeOfCheckpoint > $this->maxTimeAllowed ) ) {
                        return true;
                }
                return false;
@@ -611,17 +612,21 @@ class TextPassDumper extends BackupDumper {
 
        private function closeSpawn() {
                wfSuppressWarnings();
-               if ( $this->spawnRead )
+               if ( $this->spawnRead ) {
                        fclose( $this->spawnRead );
+               }
                $this->spawnRead = false;
-               if ( $this->spawnWrite )
+               if ( $this->spawnWrite ) {
                        fclose( $this->spawnWrite );
+               }
                $this->spawnWrite = false;
-               if ( $this->spawnErr )
+               if ( $this->spawnErr ) {
                        fclose( $this->spawnErr );
+               }
                $this->spawnErr = false;
-               if ( $this->spawnProc )
+               if ( $this->spawnProc ) {
                        pclose( $this->spawnProc );
+               }
                $this->spawnProc = false;
                wfRestoreWarnings();
        }
@@ -631,11 +636,15 @@ class TextPassDumper extends BackupDumper {
 
                $ok = fwrite( $this->spawnWrite, "$id\n" );
                // $this->progress( ">> $id" );
-               if ( !$ok ) return false;
+               if ( !$ok ) {
+                       return false;
+               }
 
                $ok = fflush( $this->spawnWrite );
                // $this->progress( ">> [flush]" );
-               if ( !$ok ) return false;
+               if ( !$ok ) {
+                       return false;
+               }
 
                // check that the text id they are sending is the one we asked for
                // this avoids out of sync revision text errors we have encountered in the past
@@ -649,18 +658,24 @@ class TextPassDumper extends BackupDumper {
 
                $len = fgets( $this->spawnRead );
                // $this->progress( "<< " . trim( $len ) );
-               if ( $len === false ) return false;
+               if ( $len === false ) {
+                       return false;
+               }
 
                $nbytes = intval( $len );
                // actual error, not zero-length text
-               if ( $nbytes < 0 ) return false;
+               if ( $nbytes < 0 ) {
+                       return false;
+               }
 
                $text = "";
 
                // Subprocess may not send everything at once, we have to loop.
                while ( $nbytes > strlen( $text ) ) {
                        $buffer = fread( $this->spawnRead, $nbytes - strlen( $text ) );
-                       if ( $buffer === false ) break;
+                       if ( $buffer === false ) {
+                               break;
+                       }
                        $text .= $buffer;
                }
 
index 98b35b5..dd558f3 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Base class for benchmark scripts.
@@ -48,20 +48,20 @@ abstract class Benchmarker extends Maintenance {
 
                foreach( $benchs as $bench ) {
                        // handle empty args
-                       if(!array_key_exists( 'args', $bench )) {
+                       if( !array_key_exists( 'args', $bench ) ) {
                                $bench['args'] = array();
                        }
 
                        $bench_number++;
                        $start = microtime( true );
-                       for( $i=0; $i<$count; $i++ ) {
+                       for( $i = 0; $i < $count; $i++ ) {
                                call_user_func_array( $bench['function'], $bench['args'] );
                        }
                        $delta = microtime( true ) - $start;
 
                        // function passed as a callback
                        if( is_array( $bench['function'] ) ) {
-                               $ret = get_class( $bench['function'][0] ). '->' . $bench['function'][1];
+                               $ret = get_class( $bench['function'][0] ) . '->' . $bench['function'][1];
                                $bench['function'] = $ret;
                        }
 
@@ -85,7 +85,7 @@ abstract class Benchmarker extends Maintenance {
                                join( ', ', $res['arguments'] )
                        );
                        $ret .= sprintf( "   %6.2fms (%6.2fms each)\n",
-                               $res['delta']   * 1000,
+                               $res['delta'] * 1000,
                                $res['average'] * 1000
                        );
                }
index fa76ae2..6f800fb 100644 (file)
@@ -24,7 +24,7 @@
  * @author  Platonides
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks HTTP request vs HTTPS request.
@@ -62,4 +62,4 @@ class bench_HTTP_HTTPS extends Benchmarker {
 }
 
 $maintClass = 'bench_HTTP_HTTPS';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index d974149..3eff534 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks SQL DELETE vs SQL TRUNCATE.
@@ -101,4 +101,4 @@ class BenchmarkDeleteTruncate extends Benchmarker {
 }
 
 $maintClass = "BenchmarkDeleteTruncate";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1f590d4..80fd962 100644 (file)
@@ -24,7 +24,7 @@
  * @author  Platonides
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmark if elseif... versus switch case.
@@ -93,4 +93,4 @@ class bench_if_switch extends Benchmarker {
 }
 
 $maintClass = 'bench_if_switch';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 10c5cd0..bd21b18 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 function bfNormalizeTitleStrTr( $str ) {
        return strtr( $str, '_', ' ' );
@@ -75,4 +75,4 @@ class bench_strtr_str_replace extends Benchmarker {
 }
 
 $maintClass = 'bench_strtr_str_replace';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index f598780..078293e 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * This little benchmark executes the regexp used in Language->checkTitleEncoding()
@@ -38,7 +38,7 @@ class bench_utf8_title_check extends Benchmarker {
        public function __construct() {
                parent::__construct();
 
-               $this->data = array (
+               $this->data = array(
                        "",
                        "United States of America", // 7bit ASCII
                        "S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e",
@@ -123,4 +123,4 @@ class bench_utf8_title_check extends Benchmarker {
 }
 
 $maintClass = 'bench_utf8_title_check';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index a1e5c6a..f8a2156 100644 (file)
@@ -22,7 +22,7 @@
  * @author Tyler Romeo
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks wfBaseConvert().
@@ -74,4 +74,4 @@ class bench_wfBaseConvert extends Benchmarker {
 }
 
 $maintClass = 'bench_wfBaseConvert';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 8543982..1cd2016 100644 (file)
@@ -24,7 +24,7 @@
  * @author  Platonides
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks wfIsWindows().
@@ -66,4 +66,4 @@ class bench_wfIsWindows extends Benchmarker {
 }
 
 $maintClass = 'bench_wfIsWindows';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index fdb016f..3f5d6db 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks %MediaWiki hooks.
@@ -84,4 +84,4 @@ class BenchmarkHooks extends Benchmarker {
 }
 
 $maintClass = 'BenchmarkHooks';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ec686b2..fd863d5 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Benchmark
  */
 
-require_once( __DIR__ . '/Benchmarker.php' );
+require_once __DIR__ . '/Benchmarker.php';
 
 /**
  * Maintenance script that benchmarks Squid purge.
@@ -112,4 +112,4 @@ class BenchmarkPurge extends Benchmarker {
 }
 
 $maintClass = "BenchmarkPurge";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index c06c2cd..d42f9f7 100644 (file)
  */
 
 /** */
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 function cdbShowHelp( $command ) {
        $commandList = array(
                'load' => 'load a cdb file for reading',
-               'get'  => 'get a value for a key',
+               'get' => 'get a value for a key',
                'exit' => 'exit cdb',
                'quit' => 'exit cdb',
                'help' => 'help about a command',
@@ -55,7 +55,9 @@ do {
        static $fileHandle;
 
        $line = Maintenance::readconsole();
-       if ( $line === false ) exit;
+       if ( $line === false ) {
+               exit;
+       }
 
        $args = explode( ' ', $line );
        $command = array_shift( $args );
@@ -67,25 +69,25 @@ do {
                        cdbShowHelp( array_shift( $args ) );
                        break;
                case 'load':
-                       if( !isset( $args[0] ) ) {
+                       if ( !isset( $args[0] ) ) {
                                print "Need a filename there buddy\n";
                                break;
                        }
                        $file = $args[0];
                        print "Loading cdb file $file...";
                        $fileHandle = CdbReader::open( $file );
-                       if( !$fileHandle ) {
+                       if ( !$fileHandle ) {
                                print "not a cdb file or unable to read it\n";
                        } else {
                                print "ok\n";
                        }
                        break;
                case 'get':
-                       if( !$fileHandle ) {
+                       if ( !$fileHandle ) {
                                print "Need to load a cdb file first\n";
                                break;
                        }
-                       if( !isset( $args[0] ) ) {
+                       if ( !isset( $args[0] ) ) {
                                print "Need to specify a key, Luke\n";
                                break;
                        }
index 861610b..5d98e1f 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to change the password of a given user.
@@ -62,4 +62,4 @@ class ChangePassword extends Maintenance {
 }
 
 $maintClass = "ChangePassword";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4ba7e66..a96e9b8 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to check that pages marked as being redirects really are.
@@ -61,4 +61,4 @@ class CheckBadRedirects extends Maintenance {
 }
 
 $maintClass = "CheckBadRedirects";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index c05d915..e6aea53 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  * @ingroup Maintenance
  */
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to check images to see if they exist, are readable, etc.
@@ -87,4 +87,4 @@ class CheckImages extends Maintenance {
 }
 
 $maintClass = "CheckImages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1e44e23..dc8626d 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to check syntax of all PHP files in MediaWiki.
@@ -221,12 +221,14 @@ class CheckSyntax extends Maintenance {
        private function isSuitableFile( $file ) {
                $file = str_replace( '\\', '/', $file );
                $ext = pathinfo( $file, PATHINFO_EXTENSION );
-               if ( $ext != 'php' && $ext != 'inc' && $ext != 'php5' )
+               if ( $ext != 'php' && $ext != 'inc' && $ext != 'php5' ) {
                        return false;
+               }
                foreach ( $this->mIgnorePaths as $regex ) {
                        $m = array();
-                       if ( preg_match( "~{$regex}~", $file, $m ) )
+                       if ( preg_match( "~{$regex}~", $file, $m ) ) {
                                return false;
+                       }
                }
                return true;
        }
@@ -328,14 +330,15 @@ class CheckSyntax extends Maintenance {
        private function checkForMistakes( $file ) {
                foreach ( $this->mNoStyleCheckPaths as $regex ) {
                        $m = array();
-                       if ( preg_match( "~{$regex}~", $file, $m ) )
+                       if ( preg_match( "~{$regex}~", $file, $m ) ) {
                                return;
+                       }
                }
 
                $text = file_get_contents( $file );
                $tokens = token_get_all( $text );
 
-               $this->checkEvilToken( $file, $tokens, '@', 'Error supression operator (@)');
+               $this->checkEvilToken( $file, $tokens, '@', 'Error supression operator (@)' );
                $this->checkRegex( $file, $text, '/^[\s\r\n]+<\?/', 'leading whitespace' );
                $this->checkRegex( $file, $text, '/\?>[\s\r\n]*$/', 'trailing ?>' );
                $this->checkRegex( $file, $text, '/^[\xFF\xFE\xEF]/', 'byte-order mark' );
@@ -367,4 +370,4 @@ class CheckSyntax extends Maintenance {
 }
 
 $maintClass = "CheckSyntax";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index dd5e002..7deca80 100644 (file)
@@ -21,8 +21,7 @@
  * @ingroup Maintenance
  */
 
-
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to check that database usernames are actually valid.
@@ -37,25 +36,34 @@ class CheckUsernames extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Verify that database usernames are actually valid";
+               $this->setBatchSize( 1000 );
        }
 
        function execute() {
                $dbr = wfGetDB( DB_SLAVE );
 
-               $res = $dbr->select( 'user',
-                       array( 'user_id', 'user_name' ),
-                       null,
-                       __METHOD__
-               );
+               $maxUserId = 0;
+               do {
+                       $res = $dbr->select( 'user',
+                               array( 'user_id', 'user_name' ),
+                               array( 'user_id > ' . $maxUserId ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'user_id',
+                                       'LIMIT' => $this->mBatchSize,
+                               )
+                       );
 
-               foreach ( $res as $row ) {
-                       if ( ! User::isValidUserName( $row->user_name ) ) {
-                               $this->error( sprintf( "%s: %6d: '%s'\n", wfWikiID(), $row->user_id, $row->user_name ) );
-                               wfDebugLog( 'checkUsernames', $row->user_name );
+                       foreach ( $res as $row ) {
+                               if ( ! User::isValidUserName( $row->user_name ) ) {
+                                       $this->error( sprintf( "%s: %6d: '%s'\n", wfWikiID(), $row->user_id, $row->user_name ) );
+                                       wfDebugLog( 'checkUsernames', $row->user_name );
+                               }
                        }
-               }
+                       $maxUserId = $row->user_id;
+               } while( $res->numRows() );
        }
 }
 
 $maintClass = "CheckUsernames";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index dbc2e0d..694efaa 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to cleans up old database tables, dropping old indexes
@@ -38,7 +38,7 @@ class CleanupAncientTables extends Maintenance {
        }
 
        public function execute() {
-               if( !$this->hasOption( 'force' ) ) {
+               if ( !$this->hasOption( 'force' ) ) {
                        $this->error( "This maintenance script will remove old columns and indexes.\n"
                                . "It is recommended to backup your database first, and ensure all your data has been migrated to newer tables\n"
                                . "If you want to continue, run this script again with the --force \n"
@@ -61,7 +61,7 @@ class CleanupAncientTables extends Maintenance {
                        'validate', // 1.6
                );
 
-               foreach( $ancientTables as $table ) {
+               foreach ( $ancientTables as $table ) {
                        if ( $db->tableExists( $table, __METHOD__ ) ) {
                                $this->output( "Dropping table $table..." );
                                $db->dropTable( $table, __METHOD__ );
@@ -78,7 +78,7 @@ class CleanupAncientTables extends Maintenance {
                        'user_timestamp',
                        'usertext_timestamp',
                );
-               foreach( $oldIndexes as $index ) {
+               foreach ( $oldIndexes as $index ) {
                        if ( $db->indexExists( 'text', $index, __METHOD__ ) ) {
                                $this->output( "Dropping index $index from the text table..." );
                                $db->query( "DROP INDEX " . $db->addIdentifierQuotes( $index )
@@ -97,7 +97,7 @@ class CleanupAncientTables extends Maintenance {
                        'old_minor_edit',
                        'inverse_timestamp',
                );
-               foreach( $oldFields as $field ) {
+               foreach ( $oldFields as $field ) {
                        if ( $db->fieldExists( 'text', $field, __METHOD__ ) ) {
                                $this->output( "Dropping the $field field from the text table..." );
                                $db->query( "ALTER TABLE  " . $db->tableName( 'text' )
@@ -110,4 +110,4 @@ class CleanupAncientTables extends Maintenance {
 }
 
 $maintClass = "CleanupAncientTables";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ec2aa95..1a47ac4 100644 (file)
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
 
 /**
  * Maintenance script to clean up broken page links when somebody turns on $wgCapitalLinks.
@@ -103,4 +103,4 @@ class CapsCleanup extends TableCleanup {
 }
 
 $maintClass = "CapsCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4e7b937..0e0b619 100644 (file)
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
 
 /**
  * Maintenance script to clean up broken, unparseable upload filenames.
@@ -213,4 +213,4 @@ class ImageCleanup extends TableCleanup {
 }
 
 $maintClass = "ImageCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index c0a526b..06ae17f 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that removes hidden preferences from the database.
@@ -36,7 +36,7 @@ class CleanupPreferences extends Maintenance {
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
-               foreach( $wgHiddenPrefs as $item ) {
+               foreach ( $wgHiddenPrefs as $item ) {
                        $dbw->delete(
                                'user_properties',
                                array( 'up_property' => $item ),
@@ -49,4 +49,4 @@ class CleanupPreferences extends Maintenance {
 }
 
 $maintClass = 'CleanupPreferences'; // Tells it to run the class
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2085da9..84eec28 100644 (file)
@@ -22,7 +22,7 @@
  * @author Roan Kattouw
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to remove cache entries for removed ResourceLoader modules
@@ -58,7 +58,7 @@ class CleanupRemovedModules extends Maintenance {
                        $this->output( "Batch $i: $numRows rows\n" );
                        $i++;
                        wfWaitForSlaves( $maxlag );
-               } while( $numRows > 0 );
+               } while ( $numRows > 0 );
                $this->output( "done\n" );
 
                $this->output( "Cleaning up msg_resource table...\n" );
@@ -72,7 +72,7 @@ class CleanupRemovedModules extends Maintenance {
                        $this->output( "Batch $i: $numRows rows\n" );
                        $i++;
                        wfWaitForSlaves( $maxlag );
-               } while( $numRows > 0 );
+               } while ( $numRows > 0 );
                $this->output( "done\n" );
 
                $this->output( "Cleaning up msg_resource_links table...\n" );
@@ -85,10 +85,10 @@ class CleanupRemovedModules extends Maintenance {
                        $this->output( "Batch $i: $numRows rows\n" );
                        $i++;
                        wfWaitForSlaves( $maxlag );
-               } while( $numRows > 0 );
+               } while ( $numRows > 0 );
                $this->output( "done\n" );
        }
 }
 
 $maintClass = "CleanupRemovedModules";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index a41423a..4b8c9fe 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to cleanup all spam from a given hostname.
@@ -141,4 +141,4 @@ class CleanupSpam extends Maintenance {
 }
 
 $maintClass = "CleanupSpam";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 57acfd8..410a55c 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Generic class to cleanup a database table. Already subclasses Maintenance.
index 66f9e87..895254f 100644 (file)
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
 
 /**
  * Maintenance script to clean up broken, unparseable titles.
@@ -83,8 +83,12 @@ class TitleCleanup extends TableCleanup {
                $legalized = preg_replace_callback( "!([^$legal])!",
                        array( &$this, 'hexChar' ),
                        $row->page_title );
-               if ( $legalized == '.' ) $legalized = '(dot)';
-               if ( $legalized == '_' ) $legalized = '(space)';
+               if ( $legalized == '.' ) {
+                       $legalized = '(dot)';
+               }
+               if ( $legalized == '_' ) {
+                       $legalized = '(space)';
+               }
                $legalized = 'Broken/' . $legalized;
 
                $title = Title::newFromText( $legalized );
@@ -121,7 +125,9 @@ class TitleCleanup extends TableCleanup {
 
                        # Old cleanupTitles could move articles there. See bug 23147.
                        $ns = $row->page_namespace;
-                       if ( $ns < 0 ) $ns = 0;
+                       if ( $ns < 0 ) {
+                               $ns = 0;
+                       }
 
                        $clean = 'Broken/' . $prior;
                        $verified = Title::makeTitleSafe( $ns, $clean );
@@ -156,4 +162,4 @@ class TitleCleanup extends TableCleanup {
 }
 
 $maintClass = "TitleCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 441e8ae..9dd62a3 100644 (file)
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to remove old or broken uploads from temporary uploaded
@@ -65,7 +65,7 @@ class UploadStashCleanup extends Maintenance {
                } else {
                        // finish the read before starting writes.
                        $keys = array();
-                       foreach( $res as $row ) {
+                       foreach ( $res as $row ) {
                                array_push( $keys, $row->us_key );
                        }
 
@@ -76,15 +76,15 @@ class UploadStashCleanup extends Maintenance {
                        $stash = new UploadStash( $repo );
 
                        $i = 0;
-                       foreach( $keys as $key ) {
+                       foreach ( $keys as $key ) {
                                $i++;
                                try {
                                        $stash->getFile( $key, true );
                                        $stash->removeFileNoAuth( $key );
                                } catch ( UploadStashBadPathException $ex ) {
-                                       $this->output( "Failed removing stashed upload with key: $key\n"  );
+                                       $this->output( "Failed removing stashed upload with key: $key\n" );
                                } catch ( UploadStashZeroLengthFileException $ex ) {
-                                       $this->output( "Failed removing stashed upload with key: $key\n"  );
+                                       $this->output( "Failed removing stashed upload with key: $key\n" );
                                }
                                if ( $i % 100 == 0 ) {
                                        $this->output( "$i\n" );
@@ -94,7 +94,7 @@ class UploadStashCleanup extends Maintenance {
                }
 
                // Delete all the corresponding thumbnails...
-               $dir      = $tempRepo->getZonePath( 'thumb' );
+               $dir = $tempRepo->getZonePath( 'thumb' );
                $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
                $this->output( "Deleting old thumbnails...\n" );
                $i = 0;
@@ -112,7 +112,7 @@ class UploadStashCleanup extends Maintenance {
                $this->output( "$i done\n" );
 
                // Apparently lots of stash files are not registered in the DB...
-               $dir      = $tempRepo->getZonePath( 'public' );
+               $dir = $tempRepo->getZonePath( 'public' );
                $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
                $this->output( "Deleting orphaned temp files...\n" );
                if ( strpos( $dir, '/local-temp' ) === false ) { // sanity check
@@ -140,4 +140,4 @@ class UploadStashCleanup extends Maintenance {
 }
 
 $maintClass = "UploadStashCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index fbab6a3..f1a7b48 100644 (file)
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/cleanupTable.inc' );
+require_once __DIR__ . '/cleanupTable.inc';
 
 /**
  * Maintenance script to remove broken, unparseable titles in the watchlist table.
@@ -77,9 +77,9 @@ class WatchlistCleanup extends TableCleanup {
                if ( !$this->dryrun && $this->hasOption( 'fix' ) ) {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->delete( 'watchlist', array(
-                               'wl_user'      => $row->wl_user,
+                               'wl_user' => $row->wl_user,
                                'wl_namespace' => $row->wl_namespace,
-                               'wl_title'     => $row->wl_title ),
+                               'wl_title' => $row->wl_title ),
                        __METHOD__ );
                        $this->output( "- removed\n" );
                        return 1;
@@ -90,4 +90,4 @@ class WatchlistCleanup extends TableCleanup {
 }
 
 $maintClass = "WatchlistCleanup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 7a0d664..6a96612 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to remove all statistics tracking from the cache.
@@ -57,4 +57,4 @@ class ClearCacheStats extends Maintenance {
 }
 
 $maintClass = "ClearCacheStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 88769df..80c9004 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to clear the cache of interwiki prefixes for all local wikis.
@@ -55,4 +55,4 @@ class ClearInterwikiCache extends Maintenance {
 }
 
 $maintClass = "ClearInterwikiCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 86a558d..be07142 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 global $optionsWithArgs;
 if ( !isset( $optionsWithArgs ) ) {
@@ -55,5 +55,5 @@ class CommandLineInc extends Maintenance {
 }
 
 $maintClass = 'CommandLineInc';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
 
index 1f3ac1c..fabc257 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/dumpIterator.php' );
+require_once __DIR__ . '/dumpIterator.php';
 
 /**
  * Maintenance script to take page text out of an XML dump file and render
@@ -55,8 +55,8 @@ class CompareParsers extends DumpIterator {
        }
 
        public function checkOptions() {
-               if ( $this->hasOption('save-failed') ) {
-                       $this->saveFailed = $this->getOption('save-failed');
+               if ( $this->hasOption( 'save-failed' ) ) {
+                       $this->saveFailed = $this->getOption( 'save-failed' );
                }
 
                $this->stripParametersEnabled = $this->hasOption( 'strip-parameters' );
@@ -87,8 +87,9 @@ class CompareParsers extends DumpIterator {
 
        public function conclusions() {
                $this->error( "{$this->failed} failed revisions out of {$this->count}" );
-               if ($this->count > 0)
+               if ( $this->count > 0 ) {
                        $this->output( " (" . ( $this->failed / $this->count ) . "%)\n" );
+               }
        }
 
        function stripParameters( $text ) {
@@ -155,4 +156,4 @@ class CompareParsers extends DumpIterator {
 }
 
 $maintClass = "CompareParsers";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 5f7b02e..17b9111 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to convert from the old links schema (string->ID)
@@ -80,9 +80,9 @@ This gives a huge speed improvement for very large links tables which are MyISAM
 
                # --------------------------------------------------------------------
 
-               list ( $cur, $links, $links_temp, $links_backup ) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
+               list( $cur, $links, $links_temp, $links_backup ) = $dbw->tableNamesN( 'cur', 'links', 'links_temp', 'links_backup' );
 
-               if( $dbw->tableExists( 'pagelinks' ) ) {
+               if ( $dbw->tableExists( 'pagelinks' ) ) {
                        $this->output( "...have pagelinks; skipping old links table updates\n" );
                        return;
                }
@@ -177,15 +177,16 @@ This gives a huge speed improvement for very large links tables which are MyISAM
                                }
                                $dbw->freeResult( $res );
                                # $this->output( "rowOffset: $rowOffset\ttuplesAdded: $tuplesAdded\tnumBadLinks: $numBadLinks\n" );
-                               if ( $tuplesAdded != 0  ) {
+                               if ( $tuplesAdded != 0 ) {
                                        if ( $reportLinksConvProgress ) {
                                                $this->output( "Inserting $tuplesAdded tuples into $links_temp..." );
                                        }
                                        $dbw->query( implode( "", $sqlWrite ) );
                                        $totalTuplesInserted += $tuplesAdded;
-                                       if ( $reportLinksConvProgress )
+                                       if ( $reportLinksConvProgress ) {
                                                $this->output( " done. Total $totalTuplesInserted tuples inserted.\n" );
-                                               $this->performanceLog( $fh, $totalTuplesInserted . " " . ( $this->getMicroTime() - $baseTime ) . "\n"  );
+                                               $this->performanceLog( $fh, $totalTuplesInserted . " " . ( $this->getMicroTime() - $baseTime ) . "\n" );
+                                       }
                                }
                        }
                        $this->output( "$totalTuplesInserted valid titles and $numBadLinks invalid titles were processed.\n\n" );
@@ -258,4 +259,4 @@ This gives a huge speed improvement for very large links tables which are MyISAM
 }
 
 $maintClass = "ConvertLinks";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index e2223e1..34c643b 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to convert user options to the new `user_properties` table.
@@ -96,4 +96,4 @@ class ConvertUserOptions extends Maintenance {
 }
 
 $maintClass = "ConvertUserOptions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index f2c4ac5..13301ed 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Copy all files in one container of one backend to another.
@@ -35,6 +35,8 @@ require_once( __DIR__ . '/Maintenance.php' );
  * @ingroup Maintenance
  */
 class CopyFileBackend extends Maintenance {
+       protected $statCache = array();
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Copy files in one backend to another.";
@@ -43,6 +45,7 @@ class CopyFileBackend extends Maintenance {
                $this->addOption( 'containers', 'Pipe separated list of containers', true, true );
                $this->addOption( 'subdir', 'Only do items in this child directory', false, true );
                $this->addOption( 'ratefile', 'File to check periodically for batch size', false, true );
+               $this->addOption( 'prestat', 'Stat the destination files first (try to use listings)' );
                $this->addOption( 'skiphash', 'Skip SHA-1 sync checks for files' );
                $this->addOption( 'missingonly', 'Only copy files missing from destination listing' );
                $this->addOption( 'utf8only', 'Skip source files that do not have valid UTF-8 names' );
@@ -53,7 +56,7 @@ class CopyFileBackend extends Maintenance {
                $src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
                $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
                $containers = explode( '|', $this->getOption( 'containers' ) );
-               $subDir = $this->getOption( rtrim( 'subdir', '/' ), '' );
+               $subDir = rtrim( $this->getOption( 'subdir', '' ), '/' );
 
                $rateFile = $this->getOption( 'ratefile' );
 
@@ -72,31 +75,52 @@ class CopyFileBackend extends Maintenance {
                        }
 
                        $srcPathsRel = $src->getFileList( array(
-                               'dir' => $src->getRootStoragePath() . "/$backendRel" ) );
+                               'dir' => $src->getRootStoragePath() . "/$backendRel",
+                               'adviseStat' => !$this->hasOption( 'missingonly' ) // avoid HEADs
+                       ) );
                        if ( $srcPathsRel === null ) {
                                $this->error( "Could not list files in $container.", 1 ); // die
                        }
 
-                       // Do a listing comparison if specified
                        if ( $this->hasOption( 'missingonly' ) ) {
-                               $relFilesSrc = array();
-                               $relFilesDst = array();
-                               foreach ( $srcPathsRel as $srcPathRel ) {
-                                       $relFilesSrc[] = $srcPathRel;
-                               }
                                $dstPathsRel = $dst->getFileList( array(
                                        'dir' => $dst->getRootStoragePath() . "/$backendRel" ) );
                                if ( $dstPathsRel === null ) {
                                        $this->error( "Could not list files in $container.", 1 ); // die
                                }
+                               // Get the list of destination files
+                               $relFilesDstSha1 = array();
                                foreach ( $dstPathsRel as $dstPathRel ) {
-                                       $relFilesDst[] = $dstPathRel;
+                                       $relFilesDstSha1[sha1( $dstPathRel )] = 1;
                                }
+                               unset( $dstPathsRel ); // free
+                               // Get the list of missing files
+                               $missingPathsRel = array();
+                               foreach ( $srcPathsRel as $srcPathRel ) {
+                                       if ( !isset( $relFilesDstSha1[sha1( $srcPathRel )] ) ) {
+                                               $missingPathsRel[] = $srcPathRel;
+                                       }
+                               }
+                               unset( $srcPathsRel ); // free
                                // Only copy the missing files over in the next loop
-                               $srcPathsRel = array_diff( $relFilesSrc, $relFilesDst );
+                               $srcPathsRel = $missingPathsRel;
                                $this->output( count( $srcPathsRel ) . " file(s) need to be copied.\n" );
-                               unset( $relFilesSrc );
-                               unset( $relFilesDst );
+                       } elseif ( $this->getOption( 'prestat' ) ) {
+                               // Build the stat cache for the destination files
+                               $this->output( "Building destination stat cache..." );
+                               $dstPathsRel = $dst->getFileList( array(
+                                       'dir' => $dst->getRootStoragePath() . "/$backendRel",
+                                       'adviseStat' => true // avoid HEADs
+                               ) );
+                               if ( $dstPathsRel === null ) {
+                                       $this->error( "Could not list files in $container.", 1 ); // die
+                               }
+                               $this->statCache = array(); // clear
+                               foreach ( $dstPathsRel as $dstPathRel ) {
+                                       $path = $dst->getRootStoragePath() . "/$backendRel/$dstPathRel";
+                                       $this->statCache[sha1( $path )] = $dst->getFileStat( array( 'src' => $path ) );
+                               }
+                               $this->output( "done [" . count( $this->statCache ) . " file(s)]\n" );
                        }
 
                        $batchPaths = array();
@@ -134,6 +158,7 @@ class CopyFileBackend extends Maintenance {
                $ops = array();
                $fsFiles = array();
                $copiedRel = array(); // for output message
+               $wikiId = $src->getWikiId();
 
                // Download the batch of source files into backend cache...
                if ( $this->hasOption( 'missingonly' ) ) {
@@ -153,9 +178,11 @@ class CopyFileBackend extends Maintenance {
                        $srcPath = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
                        $dstPath = $dst->getRootStoragePath() . "/$backendRel/$srcPathRel";
                        if ( $this->hasOption( 'utf8only' ) && !mb_check_encoding( $srcPath, 'UTF-8' ) ) {
-                               $this->error( "Detected illegal (non-UTF8) path for $srcPath." );
+                               $this->error( "$wikiId: Detected illegal (non-UTF8) path for $srcPath." );
                                continue;
-                       } elseif ( $this->filesAreSame( $src, $dst, $srcPath, $dstPath ) ) {
+                       } elseif ( !$this->hasOption( 'missingonly' )
+                               && $this->filesAreSame( $src, $dst, $srcPath, $dstPath ) )
+                       {
                                $this->output( "Already have $srcPathRel.\n" );
                                continue; // assume already copied...
                        }
@@ -163,12 +190,18 @@ class CopyFileBackend extends Maintenance {
                                ? $fsFiles[$srcPath]
                                : $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
                        if ( !$fsFile ) {
-                               $this->error( "Could not get local copy of $srcPath.", 1 ); // die
+                               $src->clearCache( array( $srcPath ) );
+                               if ( $src->fileExists( array( 'src' => $srcPath, 'latest' => 1 ) ) === false ) {
+                                       $this->error( "$wikiId: File '$srcPath' was listed but does not exist." );
+                               } else {
+                                       $this->error( "$wikiId: Could not get local copy of $srcPath." );
+                               }
+                               continue;
                        } elseif ( !$fsFile->exists() ) {
                                // FSFileBackends just return the path for getLocalReference() and paths with
                                // illegal slashes may get normalized to a different path. This can cause the
                                // local reference to not exist...skip these broken files.
-                               $this->error( "Detected possible illegal path for $srcPath." );
+                               $this->error( "$wikiId: Detected possible illegal path for $srcPath." );
                                continue;
                        }
                        $fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
@@ -176,7 +209,7 @@ class CopyFileBackend extends Maintenance {
                        $status = $dst->prepare( array( 'dir' => dirname( $dstPath ), 'bypassReadOnly' => 1 ) );
                        if ( !$status->isOK() ) {
                                $this->error( print_r( $status->getErrorsArray(), true ) );
-                               $this->error( "Could not copy $srcPath to $dstPath.", 1 ); // die
+                               $this->error( "$wikiId: Could not copy $srcPath to $dstPath.", 1 ); // die
                        }
                        $ops[] = array( 'op' => 'store',
                                'src' => $fsFile->getPath(), 'dst' => $dstPath, 'overwrite' => 1 );
@@ -193,7 +226,7 @@ class CopyFileBackend extends Maintenance {
                $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
                if ( !$status->isOK() ) {
                        $this->error( print_r( $status->getErrorsArray(), true ) );
-                       $this->error( "Could not copy file batch.", 1 ); // die
+                       $this->error( "$wikiId: Could not copy file batch.", 1 ); // die
                } elseif ( count( $copiedRel ) ) {
                        $this->output( "\nCopied these file(s) [{$ellapsed_ms}ms]:\n" .
                                implode( "\n", $copiedRel ) . "\n\n" );
@@ -202,17 +235,22 @@ class CopyFileBackend extends Maintenance {
 
        protected function filesAreSame( FileBackend $src, FileBackend $dst, $sPath, $dPath ) {
                $skipHash = $this->hasOption( 'skiphash' );
+               $srcStat = $src->getFileStat( array( 'src' => $sPath ) );
+               $dPathSha1 = sha1( $dPath );
+               $dstStat = isset( $this->statCache[$dPathSha1] )
+                       ? $this->statCache[$dPathSha1]
+                       : $dst->getFileStat( array( 'src' => $dPath ) );
                return (
-                       ( $src->fileExists( array( 'src' => $sPath, 'latest' => 1 ) )
-                               === $dst->fileExists( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
-                       ) && ( $src->getFileSize( array( 'src' => $sPath, 'latest' => 1 ) )
-                               === $dst->getFileSize( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
-                       ) && ( $skipHash || ( $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
+                       is_array( $srcStat ) // sanity check that source exists
+                       && is_array( $dstStat ) // dest exists
+                       && $srcStat['size'] === $dstStat['size']
+                       && ( !$skipHash || $srcStat['mtime'] <= $dstStat['mtime'] )
+                       && ( $skipHash || $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
                                === $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) )
-                       ) )
+                       )
                );
        }
 }
 
 $maintClass = 'CopyFileBackend';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/copyJobQueue.php b/maintenance/copyJobQueue.php
new file mode 100644 (file)
index 0000000..e833115
--- /dev/null
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Copy all jobs from one job queue system to another.
+ *
+ * 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';
+
+/**
+ * Copy all jobs from one job queue system to another.
+ * This uses an ad-hoc $wgJobQueueMigrationConfig setting,
+ * which is a map of queue system names to JobQueue::factory() parameters.
+ * The parameters should not have wiki or type settings and thus partial.
+ *
+ * @ingroup Maintenance
+ */
+class CopyJobQueue extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Copy jobs from one queue system to another.";
+               $this->addOption( 'src', 'Key to $wgJobQueueMigrationConfig for source', true, true );
+               $this->addOption( 'dst', 'Key to $wgJobQueueMigrationConfig for destination', true, true );
+               $this->addOption( 'type', 'Types of jobs to copy (use "all" for all)', true, true );
+               $this->setBatchSize( 500 );
+       }
+
+       public function execute() {
+               global $wgJobQueueMigrationConfig;
+
+               $srcKey = $this->getOption( 'src' );
+               $dstKey = $this->getOption( 'dst' );
+
+               if ( !isset( $wgJobQueueMigrationConfig[$srcKey] ) ) {
+                       $this->error( "\$wgJobQueueMigrationConfig not set for '$srcKey'.", 1 );
+               } elseif ( !isset( $wgJobQueueMigrationConfig[$dstKey] ) ) {
+                       $this->error( "\$wgJobQueueMigrationConfig not set for '$dstKey'.", 1 );
+               }
+
+               $types = ( $this->getOption( 'type' ) === 'all' )
+                       ? JobQueueGroup::singleton()->getQueueTypes()
+                       : array( $this->getOption( 'type' ) );
+
+               foreach ( $types as $type ) {
+                       $baseConfig = array( 'type' => $type, 'wiki' => wfWikiID() );
+                       $src = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$srcKey] );
+                       $dst = JobQueue::factory( $baseConfig + $wgJobQueueMigrationConfig[$dstKey] );
+
+                       list( $total, $totalOK ) = $this->copyJobs( $src, $dst, $src->getAllQueuedJobs() );
+                       $this->output( "Copied $totalOK/$total queued $type jobs.\n" );
+
+                       list( $total, $totalOK ) = $this->copyJobs( $src, $dst, $src->getAllDelayedJobs() );
+                       $this->output( "Copied $totalOK/$total delayed $type jobs.\n" );
+               }
+       }
+
+       protected function copyJobs( JobQueue $src, JobQueue $dst, $jobs ) {
+               $total = 0;
+               $totalOK = 0;
+               $batch = array();
+               foreach ( $jobs as $job ) {
+                       ++$total;
+                       $batch[] = $job;
+                       if ( count( $batch ) >= $this->mBatchSize ) {
+                               if ( $dst->push( $batch ) ) {
+                                       $totalOK += count( $batch );
+                               }
+                               $batch = array();
+                               $dst->waitForBackups();
+                       }
+               }
+               if ( count( $batch ) ) {
+                       if ( $dst->push( $batch ) ) {
+                               $totalOK += count( $batch );
+                       }
+                       $dst->waitForBackups();
+               }
+               return array( $total, $totalOK );
+       }
+}
+
+$maintClass = 'CopyJobQueue';
+require_once RUN_MAINTENANCE_IF_MAIN;
index 81fbbb3..03e6904 100644 (file)
@@ -23,7 +23,7 @@
  * @author Pablo Castellano <pablo@anche.no>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to create an account and grant it administrator rights.
@@ -38,11 +38,11 @@ class CreateAndPromote extends Maintenance {
                parent::__construct();
                $this->mDescription = "Create a new user account and/or grant it additional rights";
                $this->addOption( "force", "If acccount exists already, just grant it rights or change password." );
-               foreach( self::$permitRoles as $role ) {
+               foreach ( self::$permitRoles as $role ) {
                        $this->addOption( $role, "Add the account to the {$role} group" );
                }
                $this->addArg( "username", "Username of new user" );
-               $this->addArg( "password", "Password to set (not required if --force is used)", false);
+               $this->addArg( "password", "Password to set (not required if --force is used)", false );
        }
 
        public function execute() {
@@ -60,10 +60,10 @@ class CreateAndPromote extends Maintenance {
 
                if ( $exists && !$force ) {
                        $this->error( "Account exists. Perhaps you want the --force option?", true );
-               } else if ( !$exists && !$password ) {
+               } elseif ( !$exists && !$password ) {
                        $this->error( "Argument <password> required!", false );
                        $this->maybeHelp( true );
-               } else if ( $exists ) {
+               } elseif ( $exists ) {
                        $inGroups = $user->getGroups();
                }
 
@@ -72,7 +72,7 @@ class CreateAndPromote extends Maintenance {
                if ( $exists && !$password && count( $promotions ) === 0 ) {
                        $this->output( "Account exists and nothing to do.\n" );
                        return;
-               } else if ( count( $promotions ) !== 0 ) {
+               } elseif ( count( $promotions ) !== 0 ) {
                        $promoText = "User:{$username} into " . implode( ', ', $promotions ) . "...\n";
                        if ( $exists ) {
                                $this->output( wfWikiID() . ": Promoting $promoText" );
@@ -114,4 +114,4 @@ class CreateAndPromote extends Maintenance {
 }
 
 $maintClass = "CreateAndPromote";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 792ee6c..d58e9a4 100644 (file)
@@ -42,7 +42,7 @@ class DeleteArchivedFilesImplementation {
                        $group = $row->fa_storage_group;
                        $id = $row->fa_id;
                        $path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
-                       if( isset( $row->fa_sha1 ) ) {
+                       if ( isset( $row->fa_sha1 ) ) {
                                $sha1 = $row->fa_sha1;
                        } else {
                                // old row, populate from key
index 85ffc23..ad7b54d 100644 (file)
@@ -24,8 +24,8 @@
  * @author Aaron Schulz
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
-require_once( __DIR__ . '/deleteArchivedFiles.inc' );
+require_once __DIR__ . '/Maintenance.php';
+require_once __DIR__ . '/deleteArchivedFiles.inc';
 
 /**
  * Maintenance script to delete archived (non-current) files from the database.
@@ -55,4 +55,4 @@ class DeleteArchivedFiles extends Maintenance {
 }
 
 $maintClass = "DeleteArchivedFiles";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4b658bb..ffd581c 100644 (file)
@@ -24,8 +24,8 @@
  * @author Aaron Schulz
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
-require_once( __DIR__ . '/deleteArchivedRevisions.inc' );
+require_once __DIR__ . '/Maintenance.php';
+require_once __DIR__ . '/deleteArchivedRevisions.inc';
 
 /**
  * Maintenance script to delete archived (deleted from public) revisions
@@ -59,4 +59,4 @@ class DeleteArchivedRevisions extends Maintenance {
 }
 
 $maintClass = "DeleteArchivedRevisions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 936a52b..c1cc03c 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to delete a batch of pages.
@@ -121,4 +121,4 @@ class DeleteBatch extends Maintenance {
 }
 
 $maintClass = "DeleteBatch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4ab6d1d..7d8c80e 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes all pages in the MediaWiki namespace
@@ -51,7 +51,7 @@ class DeleteDefaultMessages extends Maintenance {
                        )
                );
 
-               if( $dbr->numRows( $res ) == 0 ) {
+               if ( $dbr->numRows( $res ) == 0 ) {
                        # No more messages left
                        $this->output( "done.\n" );
                        return;
@@ -86,4 +86,4 @@ class DeleteDefaultMessages extends Maintenance {
 }
 
 $maintClass = "DeleteDefaultMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 38e6956..1e36363 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes all pages in the MediaWiki namespace
@@ -31,76 +31,117 @@ class DeleteEqualMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Deletes all pages in the MediaWiki namespace that are equal to the default message";
-               $this->addOption( 'delete', 'Actually delete the pages' );
-               $this->addOption( 'delete-talk', 'Don\'t leave orphaned talk pages behind' );
-               $this->addOption( 'lang-code', 'Check for subpages of this lang-code (default: root page against content language)', false, true );
+               $this->addOption( 'delete', 'Actually delete the pages (default: dry run)' );
+               $this->addOption( 'delete-talk', 'Don\'t leave orphaned talk pages behind during deletion' );
+               $this->addOption( 'lang-code', 'Check for subpages of this language code (default: root page against content language). ' .
+                       'Use value "*" to run for all mwfile language code subpages (including the base pages that override content language).', false, true );
        }
 
-       public function execute() {
-               global $wgUser, $wgContLang;
+       /**
+        * @param string|bool $langCode See --lang-code option.
+        */
+       protected function fetchMessageInfo( $langCode, array &$messageInfo ) {
+               global $wgContLang;
 
-               $doDelete = $this->hasOption( 'delete' );
-               $doDeleteTalk = $this->hasOption( 'delete-talk' );
-               $forLangCode = $this->getOption( 'lang-code' );
-
-               if ( $forLangCode ) {
-                       $langObj = Language::factory( $forLangCode );
-                       $langCode = $langObj->getCode();
+               if ( $langCode ) {
+                       $this->output( "\n... fetching message info for language: $langCode" );
                        $nonContLang = true;
                } else {
-                       $langObj = $wgContLang;
+                       $this->output( "\n... fetching message info for content language" );
                        $langCode = $wgContLang->getCode();
                        $nonContLang = false;
                }
 
-               $this->output( "Checking for pages with default message..." );
-
                /* Based on SpecialAllmessages::reallyDoQuery #filter=modified */
 
-               $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
+               $l10nCache = Language::getLocalisationCache();
+               $messageNames = $l10nCache->getSubitemList( 'en', 'messages' );
                // Normalise message names for NS_MEDIAWIKI page_title
-               $messageNames = array_map( array( $langObj, 'ucfirst' ), $messageNames );
-               // TODO: Do the below for each language code (e.g. delete /xxx subpage if equal to MessagesXxx)
-               // Right now it only takes care of the root override, which is enough since most wikis aren't multi-lang wikis.
+               $messageNames = array_map( array( $wgContLang, 'ucfirst' ), $messageNames );
+
                $statuses = AllmessagesTablePager::getCustomisedStatuses( $messageNames, $langCode, $nonContLang );
+               // getCustomisedStatuses is stripping the sub page from the page titles, add it back
+               $titleSuffix = $nonContLang ? "/$langCode" : '';
 
-               $relevantPages = 0;
-               $equalPages = 0;
-               $equalPagesTalks = 0;
-               $results = array();
                foreach ( $messageNames as $key ) {
                        $customised = isset( $statuses['pages'][$key] );
                        if ( $customised ) {
                                $actual = wfMessage( $key )->inLanguage( $langCode )->plain();
                                $default = wfMessage( $key )->inLanguage( $langCode )->useDatabase( false )->plain();
 
-                               $relevantPages++;
+                               $messageInfo['relevantPages']++;
                                if ( $actual === $default ) {
                                        $hasTalk = isset( $statuses['talks'][$key] );
-                                       $results[] = array(
-                                               'title' => $key,
+                                       $messageInfo['results'][] = array(
+                                               'title' => $key . $titleSuffix,
                                                'hasTalk' => $hasTalk,
                                        );
-                                       $equalPages++;
+                                       $messageInfo['equalPages']++;
                                        if ( $hasTalk ) {
-                                               $equalPagesTalks++;
+                                               $messageInfo['equalPagesTalks']++;
                                        }
                                }
                        }
                }
+       }
+
+       public function execute() {
+               $doDelete = $this->hasOption( 'delete' );
+               $doDeleteTalk = $this->hasOption( 'delete-talk' );
+               $langCode = $this->getOption( 'lang-code' );
+
+               $messageInfo = array(
+                       'relevantPages' => 0,
+                       'equalPages' => 0,
+                       'equalPagesTalks' => 0,
+                       'results' => array(),
+               );
+
+               $this->output( 'Checking for pages with default message...' );
+
+               // Load message information
+               if ( $langCode ) {
+                       $langCodes = Language::fetchLanguageNames( null, 'mwfile' );
+                       if ( $langCode === '*' ) {
+                               // All valid lang-code subpages in NS_MEDIAWIKI that
+                               // override the messsages in that language
+                               foreach ( $langCodes as $key => $value ) {
+                                       $this->fetchMessageInfo( $key, $messageInfo );
+                               }
+                               // Lastly, the base pages in NS_MEDIAWIKI that override
+                               // messages in content language
+                               $this->fetchMessageInfo( false, $messageInfo );
+                       } else {
+                               if ( !isset( $langCodes[$langCode] ) ) {
+                                       $this->error( 'Invalid language code: ' . $langCode, 1 );
+                               }
+                               $this->fetchMessageInfo( $langCode, $messageInfo );
+                       }
+               } else {
+                       $this->fetchMessageInfo( false, $messageInfo );
+               }
 
-               if ( $equalPages === 0 ) {
+               if ( $messageInfo['equalPages'] === 0 ) {
                        // No more equal messages left
-                       $this->output( "done.\n" );
+                       $this->output( "\ndone.\n" );
                        return;
                }
 
-               $this->output( "\n{$relevantPages} pages in the MediaWiki namespace override messages." );
-               $this->output( "\n{$equalPages} pages are equal to the default message ({$equalPagesTalks} talk pages).\n" );
+               $this->output( "\n{$messageInfo['relevantPages']} pages in the MediaWiki namespace override messages." );
+               $this->output( "\n{$messageInfo['equalPages']} pages are equal to the default message (+ {$messageInfo['equalPagesTalks']} talk pages).\n" );
 
                if ( !$doDelete ) {
-                       $this->output( "\nRun the script again with --delete to delete these pages" );
-                       if ( $equalPagesTalks !== 0 ) {
+                       $list = '';
+                       foreach ( $messageInfo['results'] as $result ) {
+                               $title = Title::makeTitle( NS_MEDIAWIKI, $result['title'] );
+                               $list .= "* [[$title]]\n";
+                               if ( $result['hasTalk'] ) {
+                                       $title = Title::makeTitle( NS_MEDIAWIKI_TALK, $result['title'] );
+                                       $list .= "* [[$title]]\n";
+                               }
+                       }
+                       $this->output( "\nList:\n$list\nRun the script again with --delete to delete these pages" );
+                       if ( $messageInfo['equalPagesTalks'] !== 0 ) {
                                $this->output( " (include --delete-talk to also delete the talk pages)" );
                        }
                        $this->output( "\n" );
@@ -111,33 +152,36 @@ class DeleteEqualMessages extends Maintenance {
                if ( !$user ) {
                        $this->error( "Invalid username", true );
                }
+               global $wgUser;
                $wgUser = $user;
 
                // Hide deletions from RecentChanges
                $user->addGroup( 'bot' );
 
                // Handle deletion
-               $this->output( "\n...deleting equal messages (this may take a long time!)...", 'msg' );
+               $this->output( "\n...deleting equal messages (this may take a long time!)..." );
                $dbw = wfGetDB( DB_MASTER );
-               foreach ( $results as $result ) {
+               foreach ( $messageInfo['results'] as $result ) {
                        wfWaitForSlaves();
                        $dbw->ping();
                        $dbw->begin( __METHOD__ );
                        $title = Title::makeTitle( NS_MEDIAWIKI, $result['title'] );
+                       $this->output( "\n* [[$title]]" );
                        $page = WikiPage::factory( $title );
                        $error = ''; // Passed by ref
                        $page->doDeleteArticle( 'No longer required', false, 0, false, $error, $user );
                        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 );
                        }
                        $dbw->commit( __METHOD__ );
                }
-               $this->output( "done!\n", 'msg' );
+               $this->output( "\n\ndone!\n" );
        }
 }
 
 $maintClass = "DeleteEqualMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 3c8c5fd..835de35 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes image information from the object cache.
@@ -59,13 +59,15 @@ class DeleteImageCache extends Maintenance {
                $total = $this->getImageCount();
 
                foreach ( $res as $row ) {
-                       if ( $i % $this->report == 0 )
+                       if ( $i % $this->report == 0 ) {
                                $this->output( sprintf( "%s: %13s done (%s)\n", wfWikiID(), "$i/$total", wfPercent( $i / $total * 100 ) ) );
+                       }
                        $md5 = md5( $row->img_name );
                        $wgMemc->delete( wfMemcKey( 'Image', $md5 ) );
 
-                       if ( $sleep != 0 )
+                       if ( $sleep != 0 ) {
                                usleep( $sleep );
+                       }
 
                        ++$i;
                }
@@ -78,4 +80,4 @@ class DeleteImageCache extends Maintenance {
 }
 
 $maintClass = "DeleteImageCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 114aefd..847d863 100644 (file)
@@ -22,7 +22,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes old (non-current) revisions from the database.
@@ -100,4 +100,4 @@ class DeleteOldRevisions extends Maintenance {
 }
 
 $maintClass = "DeleteOldRevisions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index f0da9a8..f0a9692 100644 (file)
@@ -24,7 +24,7 @@
  * @todo More efficient cleanup of text records
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes revisions which refer to a nonexisting page.
@@ -54,8 +54,9 @@ class DeleteOrphanedRevisions extends Maintenance {
 
                # Stash 'em all up for deletion (if needed)
                $revisions = array();
-               foreach ( $res as $row )
+               foreach ( $res as $row ) {
                        $revisions[] = $row->rev_id;
+               }
                $count = count( $revisions );
                $this->output( "found {$count}.\n" );
 
@@ -83,11 +84,12 @@ class DeleteOrphanedRevisions extends Maintenance {
         * @param $dbw DatabaseBase class (needs to be a master)
         */
        private function deleteRevs( $id, &$dbw ) {
-               if ( !is_array( $id ) )
+               if ( !is_array( $id ) ) {
                        $id = array( $id );
+               }
                $dbw->delete( 'revision', array( 'rev_id' => $id ), __METHOD__ );
        }
 }
 
 $maintClass = "DeleteOrphanedRevisions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ad6470d..6bc0f7c 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes one or more revisions by moving them
@@ -85,4 +85,4 @@ class DeleteRevision extends Maintenance {
 }
 
 $maintClass = "DeleteRevision";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index da220d6..a097622 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that deletes self-references to $wgServer
@@ -47,10 +47,12 @@ class DeleteSelfExternals extends Maintenance {
                                . $db->buildLike( $wgServer . '/', $db->anyString() ), $this->mBatchSize );
                        $this->output( "Deleting a batch\n" );
                        $db->query( $q );
-                       if ( !$db->affectedRows() ) return;
+                       if ( !$db->affectedRows() ) {
+                               return;
+                       }
                }
        }
 }
 
 $maintClass = "DeleteSelfExternals";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1d5070b..a3cc0ba 100644 (file)
@@ -25,8 +25,8 @@ if ( PHP_SAPI != 'cli-server' ) {
        die( "This script can only be run by php's cli-server sapi." );
 }
 
-ini_set('display_errors', 1);
-error_reporting(E_ALL);
+ini_set( 'display_errors', 1 );
+error_reporting( E_ALL );
 
 if ( isset( $_SERVER["SCRIPT_FILENAME"] ) ) {
        # Known resource, sometimes a script sometimes a file
@@ -58,7 +58,7 @@ if ( $ext == 'php' || $ext == 'php5' ) {
        # We use require and return true here because when you return false
        # the php webserver will discard post data and things like login
        # will not function in the dev environment.
-       require( $file );
+       require $file;
        return true;
 }
 $mime = false;
@@ -83,16 +83,16 @@ if ( $mime ) {
        # This way we can serve things like .svg files that the built-in
        # PHP webserver doesn't understand.
        # ;) Nicely enough we just happen to bundle a mime.types file
-       $f = fopen($file, 'rb');
+       $f = fopen( $file, 'rb' );
        if ( preg_match( '#^text/#', $mime ) ) {
                # Text should have a charset=UTF-8 (php's webserver does this too)
-               header("Content-Type: $mime; charset=UTF-8");
+               header( "Content-Type: $mime; charset=UTF-8" );
        } else {
-               header("Content-Type: $mime");
+               header( "Content-Type: $mime" );
        }
-       header("Content-Length: " . filesize($file));
+       header( "Content-Length: " . filesize( $file ) );
        // Stream that out to the browser
-       fpassthru($f);
+       fpassthru( $f );
        return true;
 }
 
diff --git a/maintenance/dictionary/mediawiki.dic b/maintenance/dictionary/mediawiki.dic
new file mode 100644 (file)
index 0000000..59ea18f
--- /dev/null
@@ -0,0 +1,4550 @@
+ænglisc
+ævar
+&add
+&amp
+&bar
+&sim
+&url
+ABNF
+API
+Aacute
+Aborted
+Abuse
+Account
+Accum
+Acirc
+Action
+Activity
+Agrave
+All
+Allocations
+Ancientpages
+Anim
+Api
+Apitestsysop
+Apitestuser
+Aring
+Article
+As
+Atilde
+Auml
+Autopromote
+BACKCOMPAT
+Backlinks
+Blacklist
+Block
+Blocked
+Blocks
+Bodytext
+Broken
+COMPUTERNAME
+CRLF
+CURLOPT
+Campaign
+Capture
+Categories
+Category
+Ccedil
+Central
+Changes
+Check
+Click
+Client
+Clientfor
+Colorer
+Compare
+Config
+Console
+Continue
+Contribs
+Contributions
+Conversiontable
+Coordinates
+Create
+Creation
+Cview
+DDLMODE
+DWIM
+DWIMD
+Daily
+Dbkeyform
+Deadendpages
+Debugtext
+Delete
+Deletedrevs
+Denied
+Dfile
+Disambiguations
+Double
+Duplicate
+EAGAIN
+EBML
+ECMA
+EDITFILTERMERGED
+EINPROGRESS
+EINTR
+EOCDR
+ETAG
+Eacute
+Ecirc
+Edit
+Editor
+Education
+Egrave
+Ehcache
+Elig
+Email
+Empty
+End
+English
+Enlist
+Euml
+Eval
+Events
+Exists
+Expand
+Expression
+Ext
+External
+Extracts
+Extraneous
+FFFD
+FOLLOWLOCATION
+Failure
+Featured
+Feed
+Feedback
+Feedbackv
+Feeds
+Fewestrevisions
+Ffile
+File
+Filearchive
+Filedelete
+Files
+Filter
+Filters
+Flag
+Flagged
+GI
+GRAPHEME
+Gadget
+Gadgets
+Geo
+Get
+Global
+Groups
+HEA
+HTM
+Hardblock
+Help
+Helpful
+ID
+IPTC
+IWBacklinks
+IWLinks
+Iacute
+Icirc
+Igrave
+Illegal
+Image
+Images
+Implict
+Import
+Info
+Invalidateemail
+Isarticle
+Item
+Iuml
+LOCALISATIONCACHE
+Lang
+Lastmod
+Links
+Linktags
+List
+Listredirects
+Living
+Log
+Login
+Logout
+Logs
+Lonelypages
+Longpages
+Love
+Ltitle
+MSVC
+Mark
+Match
+Matrix
+Members
+Mesg
+Messages
+Metatags
+Mobile
+Mostcategories
+Mostimages
+Mostinterwikis
+Mostlinked
+Mostlinkedcategories
+Mostlinkedtemplates
+Mostrevisions
+Move
+Mssql
+Mwstore
+Myuploads
+NEWPAGE
+NOTIC
+Name
+Need
+No
+Noscript
+Not
+Notalk
+Notice
+Notification
+Ntilde
+Oacute
+Ocirc
+Ograve
+Oldreviewedpages
+Open
+Options
+Oslash
+Otilde
+Ouml
+PAGEEDITDATE
+PAGEEDITOR
+PAGEEDITTIME
+PAGEINTRO
+PAGEMINOREDIT
+PAGESUMMARY
+PARSEHUGE
+PARSERFIRSTCALLINIT
+PHPTAL
+PMID
+Page
+Pages
+Param
+Parse
+Parsers
+Pass
+Passpass
+Patrol
+People
+Plugin
+Possible
+Program
+Props
+Protect
+Protected
+Protectexpiry
+Protectother
+Protectreason
+Protectreasonother
+Purge
+Query
+Queued
+Random
+Rapid
+Ratings
+Raw
+Recent
+Redirects
+Redis
+Referer
+Refresh
+Regexlike
+Replacer
+Reset
+Resursive
+Revert
+Review
+Revisions
+Rollback
+Rsd
+SEGSIZE
+STDERR
+SYSDBA
+Scaron
+Scribunto
+Search
+Section
+Set
+Shortpages
+Site
+Siteinfo
+Solr
+Stabilize
+Stash
+Stats
+Status
+Success
+Syntax
+TMPDIR
+TOOLBOXEND
+TRANSLIT
+Tagging
+Tags
+Template
+Templates
+Textform
+Tfile
+Throttled
+Timestamp
+Title
+Titles
+Token
+Tokens
+Tracking
+Transcode
+Triage
+UNWATCHURL
+Uacute
+Ucirc
+Ugrave
+Unblock
+Uncategorizedcategories
+Uncategorizedimages
+Uncategorizedpages
+Uncategorizedtemplates
+Undelete
+Unusedcategories
+Unusedimages
+Unusedtemplates
+Unwatchedpages
+Upload
+Urlform
+Usage
+User
+Usercreate
+Userdir
+Userlang
+Userrights
+Users
+Useruser
+Ustart
+Uuml
+Value
+Video
+View
+Visual
+WATCHINGUSERNAME
+WEBPVP
+Wantedcategories
+Wantedfiles
+Wantedpages
+Wantedtemplates
+Warning
+Watch
+Watchingusers
+Watchlist
+Wiki
+Wikibase
+Withoutinterwiki
+Wrong
+XX
+Xml
+YYYY
+YYYYMMDDHHMMSS
+Yacute
+Yuml
+\
+a
+aa
+aacute
+abbrv
+abcdefghijklmnopqrstuvwxyz
+abf
+aboutpage
+aboutsite
+abusefilter
+abusefiltercheckmatch
+abusefilterchecksyntax
+abusefilterevalexpression
+abusefilters
+abusefilterunblockautopromote
+abuselog
+abusive
+ac
+acad
+accel
+acceptlang
+accessdenied
+accesskey
+accesskeycache
+accesskeys
+accessors
+acchits
+account
+accountcreator
+accum
+acirc
+aclimit
+acprefix
+action
+actioncomplete
+actionhidden
+actions
+actiontext
+actionthrottled
+actionthrottledtext
+actiontoken
+activeusers
+activity
+acuxvalidate
+add
+addablegroups
+addbegin
+addedline
+addedwatchtext
+addergroup
+addergroups
+addin
+adding
+additional
+addr
+address
+addresses
+addsection
+addstudent
+admin
+administrator
+adnum
+adrelid
+adsrc
+advancedediting
+advancedrc
+advancedrendering
+advancedsearchoptions
+advancedwatchlist
+aelig
+af
+afl
+aft
+afttest
+afvf
+age
+aggregators
+agrave
+ahandler
+ahttp
+ai
+aifc
+aiff
+aiprop
+ajaxwatch
+al
+alefsym
+algo
+algos
+all
+all's
+allcategories
+alldata
+alle
+allexamples
+allhidden
+allimages
+allimit
+alllinks
+alllogstext
+allmessages
+allmonths
+allowedctypes
+allowedonly
+allowemail
+allowsduplicates
+allowusertalk
+allpages
+allpagesbadtitle
+allpagesprefix
+allpagesredirect
+allpagessubmit
+allrev
+alltitles
+alltransclusions
+allusers
+aloption
+alprefix
+alreadyblocked
+alreadydone
+alreadyexists
+alreadyrolled
+alunique
+am
+anchor
+anchorclose
+anchorencode
+and
+andconvert
+andtitle
+anon
+anoneditwarning
+anonlogin
+anonnotice
+anononly
+anonpreviewwarning
+anontalk
+anontalkpagetext
+anontoken
+anonuserpage
+anonymous
+anti
+antispoof
+antivirus
+anymap
+ap
+apcond
+apdir
+api
+api's
+apibase
+apihelp
+apihighlimits
+apis
+aplimit
+apnamespace
+apng
+apos
+appendnotsupported
+appendtext
+apprefix
+approve
+aprops
+aqbt
+aqct
+archivename
+aren
+args
+argsarams
+aring
+arnfjörð
+article
+articleexists
+articlefeedbackv
+articleid
+articlelink
+articlepage
+articlepath
+articles
+aryeh
+asc
+ascending
+asctime
+asdf
+aspx
+assert
+astriks
+asymp
+async
+asynccopyuploaddisabled
+asyncdownload
+at
+atend
+atext
+atid
+atilde
+atime
+atlimit
+atoi
+atom
+atprefix
+atthasdef
+attibs
+attibute
+attlen
+attname
+attnum
+attrdef
+attrelid
+attrib
+attribs
+attributename
+attrs
+atttypid
+atunique
+au
+auml
+authplugins
+autoaccount
+autobiography
+autoblock
+autoblocked
+autoblockedtext
+autoblocker
+autoblockid
+autoblocking
+autoblockip
+autoblocks
+autocad
+autocomment
+autocomments
+autocomplete
+autoconfirm
+autoconfirmed
+autocreate
+autocreated
+autocreation
+autodetection
+autoflag
+autofocus
+autogen
+autogenerated
+autohide
+autoload
+autoloader
+autoloaders
+autoloading
+automagically
+automatic
+autonym
+autopatrol
+autoplay
+autopromote
+autopromoted
+autopromotion
+autoreview
+autoreviewer
+autoreviewrestore
+autosumm
+autosummaries
+autosummary
+axto
+azərbaycanca
+backends
+backlink
+backlinks
+backlinksubtitle
+backported
+backslashed
+backtraces
+bad
+badaccess
+badarticleerror
+badcontinue
+baddiff
+bademail
+badfilename
+badformat
+badgenerator
+badhookmsg
+badinterwiki
+badip
+badipaddress
+badkey
+badmd
+badmime
+badminpassword
+badminuser
+badnamespace
+badoption
+badparams
+badport
+badretype
+badrevids
+badsig
+badsiglength
+badsyntax
+badtag
+badtimestamp
+badtitle
+badtitletext
+badtoken
+badtype
+badupload
+baduser
+badversion
+balancer
+balancers
+banjar
+barstein
+base
+basefont
+basename
+basepagename
+basepagenamee
+basetimestamp
+bashkir
+bashpid
+bcancel
+bceffd
+bcmath
+bcompress
+bcpio
+bdop
+bdquo
+becampus
+beinstructor
+belarusian
+beonline
+bereviewer
+berror
+bestq
+besttype
+bg
+bgcolor
+bgzip
+bidi
+bigdelete
+binhex
+bitdepth
+bitfield
+bitfields
+bitmask
+bjarmason
+bk
+bkey
+bkinvalidparammix
+bkmissingparam
+bkusers
+bl
+blanking
+blanknamespace
+blankpage
+blegh
+bleh
+blinvalidparammix
+blksize
+blmissingparam
+block
+blockable
+blocked
+blockedasrange
+blockedby
+blockedbyid
+blockedemailuser
+blockedexpiry
+blockedfrommail
+blockednoreason
+blockedreason
+blockedtext
+blockedtitle
+blockemail
+blockexpiry
+blockid
+blockinfo
+blockip
+blocklink
+blocklogentry
+blocklogpage
+blocklogtext
+blockme
+blockquote
+blockreason
+blocks
+blocktoken
+bloggs
+blogs
+blogspot
+bltitle
+bluelink
+bluelinks
+bmwschema
+bmysql
+bname
+bodycontent
+boldening
+bolding
+booksources
+bool
+boolean
+borderhack
+bot
+botedit
+boteditletter
+bots
+bottom
+bottomscripts
+bpassword
+bpatch
+bpchar
+bport
+bprefix
+broeck
+brokenlibxml
+brokenredirects
+brokenredirectstext
+browsearchive
+brvbar
+bserver
+bservers
+bssl
+btestpassword
+btestuser
+btype
+bucket
+bucketcount
+bugfix
+bugfixes
+buglist
+bugzilla
+buildpath
+buildpathentry
+bulgakov
+bulkdelcourses
+bulkdelorgs
+bureaucrat
+buser
+by
+byemail
+byid
+bytea
+bytesleft
+bytesread
+bytevalue
+cacheable
+cached
+cachedcount
+cachedsidebar
+cachedspecial
+cachedtimestamp
+calimit
+callargs
+campaign
+campus
+cancelto
+cannotdelete
+cannotundelete
+canonicalised
+canonicalization
+canonicalize
+canonicalizes
+canonicalizing
+canremember
+canreset
+cansecurelogin
+cantblock
+cantcreate
+cantdelete
+cantedit
+cantexecute
+canthide
+cantimport
+cantmove
+cantmovefile
+cantopenfile
+cantoverwrite
+cantrollback
+cantsend
+cantunblock
+cantundelete
+capitalizeallnouns
+captchaid
+captchas
+captchaword
+cascade
+cascadeable
+cascadeon
+cascadeprotected
+cascadeprotectedwarning
+cascading
+cascadingness
+categories
+categories's
+categorieshtml
+category
+categoryfinder
+categoryinfo
+categorylinks
+categorymembers
+categorypage
+categoryviewer
+catids
+catlinks
+catpage
+catrope
+cattitles
+ccedil
+ccme
+ccmeonemails
+cdab
+cdel
+cdlink
+cedil
+ceebc
+cellpadding
+cellspacing
+central
+centralauth
+centralnotice
+centralnoticeallocations
+centralnoticelogs
+centralnoticequerycampaign
+cgroup
+cgroups
+change
+change's
+changeablegroups
+changed
+changedby
+changedorcreated
+changeemail
+changelog
+changeslist
+changing
+characters
+chardiff
+charoff
+chars
+checkfreq
+checkmatrix
+checkstatus
+checkuser
+checkuserlog
+chgrp
+childs
+chillu
+chmoding
+choicesstring
+chrs
+chunk
+chunked
+chunking
+ci
+cidr
+cidrtoobroad
+circ
+citeseer
+ckers
+ckey
+cl
+clamav
+clamscan
+classname
+clcategorie
+cldir
+cldr
+clear
+clearable
+clearyourcache
+clfrom
+clickjacking
+clicktracking
+clientfor
+clientpool
+cllimit
+clober
+closed
+clto
+cm
+cminvalidparammix
+cmmissingparam
+cmnamespace
+cmtitle
+co
+code
+codemap
+codepoint
+codestr
+coi
+colgroup
+collapsable
+collectionsaveascommunitypage
+collectionsaveasuserpage
+colname
+cologneblue
+colonseparator
+colorer
+colspan
+commafy
+commafying
+comment
+commentedit
+commenthidden
+comments
+commitdiff
+commoncssjs
+compactpro
+compare
+compat
+complete
+cond
+condcomment
+condeferrable
+condeferred
+conds
+config
+confirmdeletetext
+confirmed
+confirmedittext
+confirmemail
+confirmrecreate
+conflimit
+confstr
+conkey
+conname
+conrelid
+console
+content
+contentformat
+contenthandler
+contentlanguage
+contentless
+contentmodel
+contenttoobig
+continue
+contribs
+contribslink
+conttitle
+contype
+conv
+converttitles
+convmv
+cookieprefix
+cooltalk
+coord
+coordinates
+copyrightico
+copyrightpage
+copyrightwarning
+copyuploadbaddomain
+copyuploaddisabled
+copyvio
+copywarn
+cors
+couldn
+counter
+countmsg
+country
+course
+courseid
+cpio
+cprefs
+cprotected
+crarr
+crashbug
+create
+createaccount
+createonly
+createpage
+createtalk
+creationsort
+creativecommons
+creditspage
+crocker
+cryptrand
+csize
+csrf
+css
+cssclass
+csslinks
+cssprefs
+cta
+ctime
+ctor
+ctype
+cu
+cul
+curation
+curdiff
+curid
+curlink
+curren
+currentarticle
+currentbrowser
+currentday
+currentdayname
+currentdow
+currenthour
+currentmonth
+currentmonthabbrev
+currentmonthname
+currentmonthnamegen
+currentrev
+currentrevisionlink
+currenttime
+currenttimestamp
+currentversion
+currentweek
+currentyear
+customcssprotected
+customised
+customjsprotected
+cut
+cyber
+cygwin
+cyrl
+d'oh
+dadedad
+dairiki
+danga
+danielc
+darr
+datalen
+dataset
+datasets
+datasize
+datatable
+datatype
+datedefault
+dateformat
+dateheader
+dateopts
+daysago
+dbcnt
+dbconnect
+dberrortext
+dbg
+dbgfm
+dbkey
+dbkeys
+dbks
+dbname
+dbrepllag
+dbsettings
+dbtype
+dbversion
+ddjvu
+de
+deadend
+deadendpagestext
+deadenpages
+dealies
+debughtml
+decline
+declined
+decls
+decr
+decrease
+default
+defaultcontentmodel
+defaultmessagetext
+defaultmissing
+defaultns
+defaultsort
+defaultval
+deferr
+definite
+deflimit
+defs
+deja
+delete
+deleteall
+deletecomment
+deleteconfirm
+deleted
+deletedhistory
+deletedline
+deletedonly
+deletedrevision
+deletedrevs
+deletedtext
+deletedwhileediting
+deleteeducation
+deleteglobalaccount
+deletelogentry
+deleteone
+deleteotherreason
+deletepage
+deletereason
+deletereasonotherlist
+deleterevision
+deleteset
+deletethispage
+deletetoken
+deletion
+deletionlog
+delim
+dellogpage
+dellogpagetext
+delundel
+deprecated
+deps
+depth
+dequeue
+dequeued
+dequeueing
+dequeues
+derivatives
+desc
+descending
+description
+descriptionmsg
+descriptionmsgparams
+descriptionurl
+deserialization
+deserialize
+dest
+detail
+details
+devangari
+devel
+df
+dflt
+dhtml
+diams
+didn
+diff
+diff's
+diffchange
+diffhist
+difflink
+diffonly
+difftext
+diffto
+difftocontent
+difftotext
+dim
+dimensions
+dir
+direction
+directionmark
+directorycreateerror
+directorynotreadableerror
+directoryreadonlyerror
+dirmark
+dirname
+disabled
+disabledtranscode
+disablemail
+disablepp
+disablesuggest
+disclaimerpage
+diskussion
+displayname
+displayrc
+displaysearchoptions
+displaytitle
+displaytitles
+displaywatchlist
+distclean
+distro
+djava
+djob
+djvu
+djvudump
+djvulibre
+djvutoxml
+djvutxt
+djvuxml
+djvuzone
+dkjsagfjsgashfajsh
+dlen
+dltk
+dmoz
+dnsbl
+dnsblacklist
+dnumber
+docm
+docroot
+doctype
+doctypes
+docx
+dodiff
+doesn
+domain
+domainnames
+domainpart
+domainparts
+domas
+doms
+dotdotcount
+dotm
+dotsc
+dotsi
+dotsm
+dotso
+dotwise
+dotx
+doubleclick
+doublequote
+doxygen
+dpos
+dr
+dropdown
+dump
+dumpfm
+dupfunc
+duplicatefiles
+duplicatesoffile
+dvips
+dwfx
+dwhitelist
+e
+eacute
+earth
+eauth
+ecirc
+ecmascript
+edit
+editbutton
+editconflict
+editconflicts
+editcount
+editfont
+editform
+edithelp
+edithelppage
+edithelpurl
+editingcomment
+editinginterface
+editingold
+editingsection
+editinterface
+editintro
+edititis
+editlink
+editnotice
+editnotsupported
+editondblclick
+editor
+editownusertalk
+editpage
+editprotected
+editreasons
+editredlink
+editrestriction
+edits
+editsection
+editsectionhint
+editsectiononrightclick
+editsonly
+editthispage
+edittime
+edittoken
+edittools
+editurl
+editusercss
+editusercssjs
+edituserjs
+edoe
+egrave
+ehcache
+ei
+eich
+eiinvalidparammix
+eimissingparam
+eititle
+el
+elapsedreal
+elemname
+elink
+eltitle
+email
+emailable
+emailaddress
+emailauthenticated
+emailauthentication
+emailauthenticationclass
+emailcapture
+emailconfirm
+emailconfirmed
+emailconfirmlink
+emaildisabled
+emailling
+emaillink
+emailnotauthenticated
+emailtoken
+emailuser
+embeddedin
+empty
+emptyfile
+emptynewsection
+emptypage
+emsenhuber
+emsp
+en
+enabled
+enabledonly
+enableparser
+encapsed
+enctype
+end
+endcode
+endcond
+endian
+endid
+endl
+endsortkey
+endsortkeyprefix
+endtime
+endverbatim
+enhancedchanges
+enlist
+enotif
+enotifminoredits
+enotifrevealaddr
+enotifusertalkpages
+enotifwatchlistpages
+enqueueing
+enroll
+ensp
+entirewatchlist
+entityid
+envcmd
+enwiki
+eocdr
+ep
+eparticle
+epcampus
+epcoordinator
+epinstructor
+eponline
+erevoke
+errno
+error
+errorbox
+errormessage
+errorpagetitle
+errors
+errorstr
+errortext
+errorunknown
+errstr
+es
+escapenoentities
+escapeshellarg
+esearch
+español
+española
+etag
+eu
+euml
+event
+eventid
+ex
+exampleextension
+examples
+excludegroup
+excludepage
+excludeuser
+executables
+exempt
+existingwiki
+exists
+exiv
+expandtab
+expandtemplates
+expandurl
+experiment
+expertise
+expiry
+expiryarray
+explainconflict
+export
+exportnowrap
+exportxml
+expression
+exptime
+extauth
+extendwatchlist
+extensionname
+extensions
+extensiontags
+external
+externaldberror
+externaldiff
+externaledit
+externaleditor
+externallinks
+externalstore
+extet
+extiw
+extlink
+extlinks
+extracts
+extradata
+extrafields
+extraq
+extratags
+exturlusage
+extuser
+exxaammppllee
+fa
+facto
+failback
+failover
+failsafe
+fallbacks
+false
+falsy
+fancysig
+fastcgi
+faux
+favicon
+fclose
+fdef
+fdff
+feature
+featured
+featuredfeed
+feed
+feed's
+feedback
+feedbackid
+feedcontributions
+feedformat
+feeditems
+feedlink
+feedlinks
+feedurl
+feedwatchlist
+feff
+female
+fetchfileerror
+fffe
+ffff
+fffff
+ffffff
+fieldname
+fieldset
+fieldsets
+file
+filearchive
+filebackend
+filecache
+filecopyerror
+filedelete
+filedeleteerror
+fileexists
+fileextensions
+filehidden
+filehist
+filehistory
+fileinfo
+filejournal
+filekey
+filelinks
+filemissing
+filemover
+filemtime
+filename
+filenames
+filenotfound
+filepage
+filepath
+filerenameerror
+filerepo
+filerevert
+filerevisions
+files
+filesize
+filesort
+filesorts
+filesystem's
+filesystems
+filetoc
+filetoobig
+filetype
+filetypemismatch
+fileversions
+filter
+filterbots
+filteriw
+filterlanglinks
+filterlocal
+filterredir
+filterwatched
+findnext
+finfo
+firefox
+firstname
+firstrev
+firsttime
+fishbowl
+fixme
+fixup
+flac
+flag
+flagconfig
+flagged
+flags
+flagtype
+flatlist
+flds
+float
+fmttime
+fname
+fnof
+foldmarker
+foldmethod
+followpolicy
+footericon
+footericons
+footerlinks
+fopen
+for
+forall
+forbidden
+forcearticlepath
+forcebot
+forceditsummary
+forceeditsummary
+forcelinkupdate
+forcetoc
+forcontent
+formaction
+format
+formatmodules
+formatted
+formatters
+formatting
+formedness
+formenctype
+formnovalidate
+formtype
+forupdate
+found
+founder
+fr
+frac
+frameless
+framesets
+frasl
+fread
+freedomdefined
+freeform
+freenode
+frickin
+from
+fromdb
+fromdbmaster
+fromid
+fromrev
+fromrevid
+fromtitle
+frontends
+fseek
+fsockopen
+fsync
+ftp
+fullhistory
+fullpagename
+fullpagenamee
+fulluri
+fullurl
+funcname
+functionhooks
+functionname
+futuresplash
+fvalue
+ga
+gack
+gadgetcategories
+gadgets
+gaid
+gaifilterredir
+gallerybox
+gallerycaption
+gallerytext
+gapdir
+gapfilterredir
+gaplimit
+gapprefix
+garber
+gblblock
+gblock
+gblrights
+gc
+gcldir
+gcllimit
+gender
+general
+generatexml
+generator
+geocoordinate
+geosearch
+gerrit
+getcookie
+getenv
+getheader
+getimagesize
+getlink
+getmac
+getmarkashelpfulitem
+getmypid
+getrusage
+gettimeofday
+gettingstarted
+gettoken
+getuid
+gfdl
+ggp
+ghostscript
+gimpbaseenums
+git
+gitdir
+github
+gitweb
+global
+globalauth
+globalblock
+globalblocks
+globalgroupmembership
+globalgrouppermissions
+globalgroups
+globalsettings
+globalunblock
+globalusage
+globaluserinfo
+globe
+gmail
+gmdate
+goodtitle
+gopher
+graymap
+grayscale
+greant
+greymap
+group
+groupcounts
+groupless
+groupmember
+grouppage
+groupperms
+groupprms
+groups
+growinglink
+grxml
+gs
+gtar
+gu
+guesstimezone
+gui
+guid
+gunblock
+guser
+gwicke
+gzcompress
+gzdeflate
+gzencode
+gzhandler
+gzip
+gzipped
+gzipping
+hacky
+hansm
+hant
+hardblocks
+hardcode
+hardcoding
+harr
+hash
+hashar
+hashcheckfailed
+hashsearchdisabled
+hashtable
+hashtables
+hasmatch
+hasmsg
+hasn
+hasrelated
+headelement
+headerpos
+headhtml
+headitems
+headlinks
+headscripts
+height
+hellip
+help
+helpful
+helppage
+helptext
+helpurl
+helpurls
+helpwindow
+hexdump
+hexstring
+hidden
+hiddencat
+hiddencategories
+hiddencats
+hide
+hideanons
+hidebots
+hidediff
+hideliu
+hideminor
+hidemyself
+hidename
+hidepatrolled
+hideredirects
+hiderevision
+hideuser
+hidpi
+highlimit
+highmax
+highuse
+hilfe
+hiphop
+histfirst
+histlast
+historyempty
+historysubmit
+historywarning
+hit
+hitcount
+hitcounter
+hits
+hmac
+hmtl
+hobby
+homelink
+hookaborted
+horohoe
+hostnames
+hours
+hphp
+hplist
+hpos
+hreflang
+hslots
+htaccess
+htcp
+html
+htmlelements
+htmlescaped
+htmlform
+htmlish
+htmllist
+htmlnest
+htmlpair
+htmlpairs
+htmlsingle
+htmlsingleallowed
+htmlsingleonly
+htmlspecialchars
+htmltidy
+http
+httpaccept
+httpbl
+https
+i
+ia
+iabn
+iacute
+icirc
+icononly
+iconv
+icubench
+icutest
+id
+idanduser
+ids
+ie's
+ieinternals
+ietf
+iexcl
+ifconfig
+iframe
+igbinary
+iges
+ignorewarnings
+igrave
+ii
+iicontinue
+iiprop
+iiurlparam
+iiurlwidth
+iker
+ilfrom
+ilto
+im
+image
+imagegetsize
+imageinfo
+imageinvalidfilename
+imagelinks
+imagemagick
+imagemaxsize
+imagenocrossnamespace
+imagepage
+imagerepository
+imagerotate
+images
+imagesize
+imagetype
+imagetypemismatch
+imageusage
+imagick
+imgmultigo
+imgmultigoto
+imgmultipagenext
+imgmultipageprev
+imgs
+imgserv
+immobilenamespace
+implicitgroups
+import
+importbadinterwiki
+importcantopen
+importlogpage
+importlogpagetext
+importnofile
+importtoken
+importupload
+importuploaderrorpartial
+importuploaderrorsize
+importuploaderrortemp
+in
+iname
+inbound
+includable
+include
+includecomments
+includelocal
+includeonly
+includexmlnamespace
+incr
+increase
+indefinite
+index
+indexfield
+indexpageids
+indexpolicy
+indstr
+infin
+infinite
+infiniteblock
+info
+infoaction
+infobox
+infoline
+infomsg
+ingroups
+injectjs
+inkscape
+inlanguagecode
+inlined
+inno
+inputneeded
+insb
+inser
+instantcommons
+institution
+instructor
+int
+integer
+integeroutofrange
+intentionallyblankpage
+interlang
+interlangs
+interlanguage
+internal
+internaledit
+internalerror
+interwiki
+interwikimap
+interwikipage
+interwikis
+interwikisource
+intnull
+intoken
+intra
+intro
+intrw
+ints
+intval
+invalid
+invalidaction
+invalidations
+invalidcategory
+invaliddomain
+invalidemail
+invalidemailaddress
+invalidexpiry
+invalidip
+invalidlang
+invalidlevel
+invalidmode
+invalidoldimage
+invalidpage
+invalidpageid
+invalidparameter
+invalidparammix
+invalidpath
+invalidrange
+invalidsection
+invalidsessiondata
+invalidsha
+invalidspecialpage
+invalidtags
+invalidtime
+invalidtitle
+invalidtoken
+invaliduser
+invalue
+iorm
+ip
+ipbblocked
+ipblock
+ipblocks
+ipbnounblockself
+ipchain
+ipedits
+iphash
+ipinrange
+ipusers
+iquest
+irc
+ircs
+isam
+isapi
+isbot
+isconnected
+iscur
+isin
+isip
+ismap
+isminor
+ismodsince
+ismulti
+isnew
+ispermalink
+isself
+isset
+istainted
+istalk
+iswatch
+it
+item
+itemid
+itemprop
+itemref
+itemscope
+itemtype
+iter
+iu
+iuinvalidparammix
+iumissingparam
+iuml
+iw
+iwbacklinks
+iwbl
+iwlfrom
+iwlinks
+iwlprefix
+iwltitle
+iwprefix
+iwtitle
+iwurl
+javascript
+javascripttest
+jbartsh
+jconds
+jdk's
+jhtml
+jimbo
+joaat
+jobqueue
+jointype
+jorsch
+journaling
+jpeg
+jpegtran
+jslint
+jsmimetype
+jsminplus
+json
+jsonfm
+jsparse
+jstext
+jsvarurl
+justthis
+kabardian
+kangxi
+kashubia
+kattouw
+kblength
+kernowek
+key
+keygen
+keylen
+keyname
+keynames
+keytype
+khash
+kludgy
+knownnamespace
+konqueror
+kpos
+kuza
+labarga
+labelmsg
+laggedslavemode
+laggy
+lang
+langbacklinks
+langcode
+langcodes
+langconversion
+langlinks
+langprop
+langs
+language
+languagelinks
+languages
+languageshtml
+laquo
+large
+larr
+last
+lastdiff
+lastdot
+lastedit
+lasteditor
+lastedittime
+lastlink
+lastmod
+lastmodifiedat
+lastname
+lastrevid
+lastvisited
+latgalian
+laxström
+lbase
+lbl
+lcattrib
+lceil
+lcomments
+lcount
+lcrocker
+ldquo
+le
+leavemessage
+len
+length
+leprop
+lesque
+lettercase
+level
+lfloor
+lg
+lgname
+lgpassword
+lgpl
+lgtoken
+lguserid
+lgusername
+libcurl
+libel
+libgimpbase
+libketama
+libmemcached
+libre
+libtidy
+ligabue
+lighttpd
+limit
+limitable
+line
+linenumber
+linestart
+link
+linkarr
+linkcolour
+linkprefix
+links
+linkstoimage
+linktbl
+linktext
+linktodiffs
+linktrail
+linktype
+linkupdate
+list
+listable
+listadmins
+listbots
+listfiles
+listgrouprights
+listinfo
+listingcontinuesabbrev
+listoutput
+listresult
+lists
+listtags
+listuser
+listusers
+listusersfrom
+livepreview
+ll
+llfrom
+lllang
+lltitle
+lnumber
+local
+localday
+localdayname
+localdow
+locale
+localhour
+localmonth
+localmonthabbrev
+localmonthname
+localmonthnamegen
+localname
+localonly
+localsettings
+localtimezone
+localweek
+localyear
+lock
+lockandhid
+lockdb
+lockdir
+locked
+lockmanager
+log
+logaction
+logentry
+logevent
+logevents
+logextract
+loggedin
+logid
+login
+loginend
+loginerror
+loginfo
+loginlanguagelinks
+loginlink
+loginprompt
+loginreqlink
+loginreqpagetext
+loginreqtitle
+logins
+loginstart
+logitem
+loglink
+loglist
+logname
+logonly
+logopath
+logourl
+logout
+logpage
+logtext
+logtitle
+logtype
+longpage
+longpageerror
+lookie
+lookups
+loopback
+lossless
+lossy
+lowast
+lowercaps
+lowercased
+lowlimit
+lsaquo
+lsquo
+ltags
+ltitle
+ltrimmed
+lurl
+lysator
+möller
+macr
+magicarr
+magicfile
+magick
+magicword
+magicwordkey
+magicwords
+magnus
+mahaction
+mailerror
+mailmypassword
+mailnologin
+mailparts
+mailpassword
+mailtext
+mailto
+mainmodule
+mainpage
+maintainership
+makesafe
+male
+malloc
+manske
+manualthumb
+mark
+markashelpful
+markaspatrolledlink
+markaspatrolledtext
+markbot
+markbotedits
+markedaspatrollederror
+markpatrolled
+masse
+match
+matchcount
+mathml
+mathtt
+matrixes
+matroska
+max
+maxage
+maxdim
+maxlag
+maxlength
+maxlifetime
+maxqueue
+maxresults
+maxsize
+maxuploadsize
+maxwidth
+mazeland
+mbresponse
+mbstring
+mckey
+mcklmqw
+mcrypt
+mcvalue
+md
+mdash
+medialink
+mediaqueries
+mediatype
+mediawarning
+mediawiki's
+mediawikipage
+megapixels
+member
+memberingroups
+members
+memc
+memcache
+memcached
+memlimit
+memoryp
+memsw
+merge
+mergeable
+merged
+mergehistory
+mergelog
+mergelogpagetext
+message
+messagekey
+messagename
+messagepattern
+messages
+messagetype
+meta
+metacharacters
+metachars
+metadata
+metadataversion
+metafile
+mhash
+mhtml
+micrblogging
+microdata
+microsyntaxes
+microtime
+middot
+migurski
+millitime
+mime
+mimer
+mimesearchdisabled
+mimetype
+min
+minangkabau
+minh
+minification
+minified
+minifier
+minifies
+minify
+minifying
+minimal
+minor
+minordefault
+minoredit
+minoreditletter
+minsize
+misconfigured
+misermode
+mismatch
+misresolved
+missing
+missingcommentheader
+missingcommenttext
+missingdata
+missingparam
+missingpermission
+missingresult
+missingrev
+missingsummary
+missingtext
+missingtitle
+missinguser
+mituzas
+mixedapproval
+mkdir
+mms
+mobile
+mobileformat
+mobileview
+modified
+modifiedarticleprotection
+modify
+modsecurity
+modsince
+module
+moduledisabled
+modulename
+modules
+monitor
+monobook
+monospace
+monospaced
+month
+monthsall
+moodbar
+moredotdotdot
+morelinkstoimage
+morethan
+move
+movedarticleprotection
+moveddeleted
+movedto
+movefile
+movelogpage
+movelogpagetext
+movenologintext
+movenotallowed
+movenotallowedfile
+moveonly
+moveoverredirect
+movepage
+moves
+movestable
+movesubpages
+movetalk
+movethispage
+movetoken
+mozilla
+mpeg
+mpegurl
+mpga
+mplink
+mptitle
+msdn
+msdownload
+msec
+msexcel
+msgid
+msgkey
+msgs
+msgsize
+msgsmall
+msgtext
+msie
+msmetafile
+mssql
+msvideo
+msword
+mtime
+mtype
+mullane
+multi
+multibyte
+multicast
+multipage
+multipageimage
+multipageimagenavbox
+multipart
+multiselect
+multisource
+multithreaded
+multival
+multivalue
+multpages
+munge
+musso
+mustbeloggedin
+mustbeposted
+mutator
+mutators
+muxers
+mwdumper
+mwfile
+mwstore
+mwsuggest
+mwuser
+mxircecho
+mycontributions
+mycontris
+myext
+myextension
+myisam
+mykey
+mypage
+mypreferences
+mysqldump
+mytalk
+mytext
+mywatchlist
+nabla
+name
+namehidden
+nameinlowercase
+names
+namespace
+namespacealiases
+namespacebanner
+namespacee
+namespacenotice
+namespacenumber
+namespaceoptions
+namespaceprotected
+namespaces
+namespacesall
+namespaceselector
+namespacing
+nassert
+nbase
+nbsp
+nbytes
+nchanges
+ncount
+ndash
+nearmatch
+nedersaksies
+nedersaksisch
+needreblock
+needservers
+needtoken
+netcdf
+netware
+never
+new
+newaddr
+newarticletext
+newarticletextanon
+newer
+newerthanrevid
+newgroups
+newheader
+newid
+newimages
+newlen
+newmessagesdifflink
+newmessagesdifflinkplural
+newmessageslink
+newmessageslinkplural
+newname
+newnames
+newnamespace
+newpage
+newpageletter
+newpages
+newpageshidepatrolled
+newparams
+newpass
+newpassword
+newpos
+newquery
+newrevid
+news
+newsectionlink
+newsectionsummary
+newset
+newsfeed
+newsize
+newtalk
+newtalks
+newtalkseparator
+newtext
+newtimestamp
+newtitle
+newuser
+newuserlogpage
+newuserlogpagetext
+newusers
+newwidth
+newwindow
+nextdiff
+nextid
+nextlink
+nextn
+nextpage
+nextredirect
+nextrevision
+nextval
+nfkc
+nginx
+nheight
+niklas
+nlink
+nlinks
+nmime
+nnnn
+nntp
+no
+noanimatethumb
+noanontoken
+noapiwrite
+noarchivename
+noarticle
+noarticletext
+noarticletextanon
+noautopatrol
+noblock
+nobots
+nobucket
+nobuffer
+nochange
+nochanges
+noclasses
+nocode
+nocomment
+nocomplete
+nocontent
+nocontentconvert
+nocontinue
+noconvertlink
+nocookiesfornew
+nocopyright
+nocourseid
+nocreate
+nocreatetext
+nocredits
+nocta
+nodata
+nodatabase
+nodb
+nodefault
+nodeid
+nodeleteablefile
+nodeletion
+nodelist
+nodename
+nodirection
+nodotdot
+noedit
+noeditsection
+noemail
+noemailprefs
+noemailtitle
+noeventid
+noexec
+noexpertise
+noexpression
+nofeed
+nofeedbackid
+nofile
+nofilekey
+nofilename
+nofilter
+noflagtype
+noflip
+nofollow
+nofound
+nogallery
+nogomatch
+nogroup
+noheader
+noheadings
+nohires
+noids
+noimage
+noimageredirect
+noimages
+noinclude
+noindex
+noindexing
+nointerwikipage
+nointerwikiuserrights
+noitem
+nojs
+nolabel
+nolang
+nolicense
+nolimit
+nolink
+nolinkstoimage
+nologging
+nologin
+nomahaction
+nominornewtalk
+nomodule
+non
+noname
+nonamespacenumber
+nonascii
+noncascading
+nondefaults
+none
+nonewsectionlink
+nonexistent
+nonfile
+nonfilenamespace
+nonincludable
+noninfringement
+noninitial
+nonlocal
+nonote
+nonredirects
+nonsense
+nonunicodebrowser
+noobjective
+noofexpiries
+noofprotections
+noop
+nooptions
+nooverride
+nopaction
+nopage
+nopageid
+nopagetext
+nopagetitle
+noparser
+nopathinfo
+nopermission
+noport
+noprefix
+noproject
+noprop
+noprotections
+noquestion
+noradius
+noratelimit
+norating
+norcid
+noread
+noreason
+noredir
+noredirect
+norequest
+norestrictiontypes
+noresult
+noreturnto
+norev
+norevid
+noreviewed
+normalizedtitle
+norole
+norollbackdiff
+noscale
+noschema
+noscript
+nosearch
+nosectiontitle
+nosession
+noshade
+noskipnotif
+noslash
+nosniff
+nosort
+nosortdirection
+nosource
+nospecialpagetext
+nost
+nosubaction
+nosubject
+nosubpage
+nosubpages
+nosuccess
+nosuchaction
+nosuchactiontext
+nosuchdatabase
+nosuchlogid
+nosuchpageid
+nosuchrcid
+nosuchrevid
+nosuchsection
+nosuchsectiontext
+nosuchsectiontitle
+nosuchspecialpage
+nosuchuser
+nosuchusershort
+nosummary
+notacceptable
+notag
+notaglist
+notalk
+notallowed
+notanarticle
+notarget
+notcached
+notdeleted
+note
+notempdir
+notemplate
+notext
+nothumb
+notif
+notificationtimestamp
+notificationtimestamps
+notin
+notitle
+notitleconvert
+notloggedin
+notminor
+noto
+notoc
+notoggle
+notoken
+notransform
+notreviewable
+notrustworthy
+notspecialpage
+notsuspended
+notvisiblerev
+notwatched
+notwikitext
+notype
+noudp
+noupdates
+nouploadmodule
+nouser
+nouserid
+nousername
+nouserspecified
+novalues
+noview
+nowatchlist
+nowellwritten
+nowiki
+nowlocal
+nowserver
+nparsing
+ns
+nsassociated
+nsfrom
+nsinvert
+nslinks
+nslist
+nsname
+nsnum
+nspname
+nsselect
+nstab
+nsub
+ntfs
+ntilde
+ntitle
+nuke
+null
+nullable
+numauthors
+number
+numberheadings
+numberingroup
+numberof
+numberofactiveusers
+numberofadmins
+numberofarticles
+numberofedits
+numberoffiles
+numberofpages
+numberofusers
+numberofviews
+numberofwatchingusers
+numedits
+numentries
+numericized
+numgroups
+numtalkauthors
+numtalkedits
+numwatchers
+nwidth
+oacute
+objectcache
+objective
+ocirc
+ocount
+oelig
+of
+officedocument
+offset
+offsite
+ofname
+ogevents
+ogghandler
+ograve
+old
+oldaddr
+oldcountable
+older
+olderror
+oldfile
+oldgroups
+oldid
+oldimage
+oldlen
+oldnamespace
+oldquery
+oldrev
+oldrevid
+oldreviewedpages
+oldshared
+oldsig
+oldsize
+oldtext
+oldtitle
+oldtitlemsg
+oline
+oname
+onkeyup
+online
+onload
+onlyauthor
+onlyinclude
+onlypst
+onlyquery
+onsubmit
+onthisday
+ontop
+openbasedir
+opendoc
+opendocument
+opensearch
+opensearchdescription
+openssl's
+openxml
+openxmlformats
+oplus
+oppositedm
+optgroup
+optgroups
+optionname
+options
+optionstoken
+optionvalue
+optstack
+or
+ordertype
+ordf
+ordm
+org
+origcategory
+ortime
+oslash
+other
+otherlanguages
+otherlist
+otheroption
+otherreason
+othertime
+otilde
+otimes
+otitle
+ouml
+outparam
+outputter
+outputtype
+outreachwiki
+over
+overridable
+override
+oversight
+oversighted
+oversighter
+overwrite
+overwroteimage
+own
+owner
+paction
+page
+pagecannotexist
+pagecategories
+pagecategorieslink
+pageclass
+pagecontent
+pagecount
+pagecss
+pagedeleted
+pagedlinks
+pageid
+pageids
+pageimages
+pageinfo
+pagelink
+pagelinks
+pagemerge
+pagename
+pagenamee
+pagenames
+pagenum
+pageoffset
+pagepropnames
+pageprops
+pagerestrictions
+pages
+pageselector
+pageset
+pagesetmodule
+pagesincategory
+pagesinnamespace
+pageswithprop
+pagetextmsg
+pagetitle
+pagetools
+pagetriage
+pagetriageaction
+pagetriagelist
+pagetriagestats
+pagetriagetagging
+pagetriagetemplate
+pageurl
+pageview
+param
+parameters
+paraminfo
+paramlist
+paramname
+params
+paren
+parens
+parentid
+parenttree
+parms
+parse
+parsedcomment
+parseddescription
+parsedsummary
+parseerror
+parseinline
+parsemag
+parser
+parsercache
+parserfuncs
+parserfunctions
+parserhook
+parserrender
+parsetree
+parsevalue
+parsoid
+partialupload
+partname
+pass's
+passthru
+password
+passwordfor
+passwordreset
+passwordtooshort
+paste
+pastexpiry
+pathchar
+pathinfo
+pathname
+patrol
+patroldisabled
+patrolled
+patrollink
+patrolmarks
+patroltoken
+pattern
+pcache
+pcntl
+pcomment
+pdbk
+pdf's
+pendingdelta
+perc
+perfcached
+perfcachedts
+perm
+perma
+permalink
+permdenied
+permil
+permissiondenied
+permissionerror
+permissionserrors
+permissionserrorstext
+permissiontype
+perp
+perrow
+pgsql
+photoshop
+php
+php's
+phpfm
+phps
+phpsapi
+phpunit
+phpversion
+phpwiki
+phrasewise
+phtml
+pi
+pipermail
+pixmap
+pkey
+pkuk
+pl
+plain
+plainlink
+plainlinks
+plaintext
+plfrom
+plink
+pllimit
+plns
+plpgsql
+pltitle
+pltitles
+plusminus
+plusmn
+pname
+pnmtojpeg
+pnmtopng
+poolcounter
+popts
+popularpages
+portlet
+portlets
+posplus
+possible
+postcomment
+postgre
+postsep
+potd
+potm
+potx
+poweredby
+poweredbyico
+powersearch
+pp
+ppam
+ppsm
+ppsx
+pptm
+pptx
+precaching
+precompiled
+preferences
+preferencestoken
+prefill
+prefilled
+prefix
+prefixindex
+prefixsearchdisabled
+prefs
+prefsection
+prefsnologin
+prefsnologintext
+prefsubmit
+preload
+preloads
+preloadtitle
+prepending
+prependtext
+preprocess
+preprocessing
+preprocessors
+presentationml
+presep
+prevchar
+prevdiff
+previd
+previewconflict
+previewhead
+previewheader
+previewnote
+previewonfirst
+previewontop
+previewtext
+previousrevision
+prevlink
+prevn
+prexpiry
+prfiltercascade
+prfx
+primary
+printableversion
+printfooter
+printurl
+privacypage
+private
+privs
+prlevel
+probabalistically
+probs
+proc
+processings
+procs
+prodromou
+profession
+profileinfo
+programmatically
+project
+projectpage
+promotion
+prop
+properties
+property
+propname
+props
+prot
+protect
+protectcomment
+protectedarticle
+protectedinterface
+protectednamespace
+protectedpage
+protectedpages
+protectedpagetext
+protectedpagewarning
+protectedtitle
+protectedtitles
+protection
+protections
+protectlevel
+protectlogpage
+protectlogtext
+protectthispage
+protecttoken
+proto
+protocol
+protocols
+protos
+proxied
+proxyblocker
+proxyblockreason
+proxyunbannable
+prtype
+psir
+pst
+psttext
+psychedelix
+pt
+ptext
+ptool
+pubdate
+publicsuffix
+publishfailed
+punycode
+purge
+purged
+qabardjajəbza
+qbar
+qbsettings
+qmoicj
+qp
+quasit
+query
+querycache
+querycachetwo
+querycur
+querydiff
+querykey
+querymodule
+querymodules
+querypage
+querypages
+querystring
+querytype
+question
+queuefull
+quickbar
+quicktemplate
+quicktime
+qunit
+quux
+qvalues
+rabdiff
+radic
+radius
+raggett
+raii
+raimond
+random
+randompage
+randomredirect
+randstr
+range
+rangeblock
+rangeblocks
+rangedisabled
+rangeend
+rangestart
+raquo
+rarr
+rarticle
+rasterizations
+rasterize
+rasterized
+rasterizer
+ratelimited
+ratelimits
+rating
+ratings
+raw
+rawfm
+rawrow
+rbspan
+rc
+rcdays
+rceil
+rcfeed
+rcid
+rcids
+rclimit
+rcoptions
+rcpatroldisabled
+rctitle
+rctoken
+rdev
+rdfa
+rdfrom
+rdftype
+rdquo
+read
+readable
+readapidenied
+readarray
+reader
+readline
+readonlyreason
+readonlytext
+readonlywarning
+readrequired
+readrights
+realaudio
+realllly
+realname
+realpath
+reason
+reasonlist
+reasonstr
+reblock
+rebuildtextindex
+recache
+recached
+recaching
+recalc
+recentchange
+recentchanges
+recentchangescount
+recentchangesdays
+recentchangeslinked
+recentchangestext
+recenteditcount
+recentedits
+recip
+recips
+recreate
+recurse
+recurses
+redir
+redirect
+redirectable
+redirectcreated
+redirectedfrom
+redirections
+redirectpagesub
+redirectparams
+redirects
+redirectsnippet
+redirectstofile
+redirecttitle
+redirectto
+redirid
+redirlinks
+redirs
+redis
+redlink
+redlinks
+redocument
+reedyboy
+reenables
+reencode
+reference
+refetch
+refresheducation
+refreshlinks
+regexes
+regexlike
+region
+registered
+registration
+registrationdate
+reimport
+reindexation
+reindexed
+releasenotes
+relevance
+relevant
+relicense
+relimit
+relkind
+relname
+relnamespace
+remarticle
+remembermypassword
+rememberpassword
+removablegroups
+removal
+remove
+removed
+removedwatchtext
+removetags
+remreviewer
+remstudent
+renameuser
+renaming
+renderable
+renormalized
+repeating
+repl
+replaceafter
+replacer
+replacers
+replag
+replyto
+reporttime
+repos
+request
+requested
+requestid
+requeue
+required
+rerender
+rerendered
+rescnt
+researcher
+resends
+reset
+resetkinds
+resetlink
+resetpass
+resized
+resolutioninfo
+resolutionunit
+resolve
+resolved
+resourceloader
+responsecode
+restore
+restorelink
+restoreprefs
+restricted
+result
+resultset
+resultsperpage
+retrievedfrom
+returnto
+returntoquery
+retval
+reupload
+revalidate
+revalidation
+revdel
+revdelete
+revdelete'd
+revdelundel
+revert
+reverting
+revertpage
+reverts
+revid
+revids
+review
+reviewactivity
+reviewed
+reviewer
+reviewing
+revision
+revisionasof
+revisionday
+revisiondelete
+revisionid
+revisionmonth
+revisions
+revisiontext
+revisiontimestamp
+revisionuser
+revisionyear
+revlink
+revwrongpage
+rfloor
+rgba
+richtext
+rights
+rightscode
+rightsinfo
+rightslog
+rightslogtext
+rked
+rmdir
+rn
+rnlimit
+robotstxt
+roff
+role
+rollback
+rollbacker
+rollbacklink
+rollbacklinkcount
+rollbacktoken
+rootpage
+rootuserpages
+rowcount
+rown
+rownum
+rowsarr
+rowset
+rowspan
+rowspans
+rsaquo
+rsargs
+rsd
+rsdf
+rsquo
+rss
+rsvg
+ruleset
+rulesets
+rusyn
+rv
+rvcontinue
+rvdiffto
+rvlimit
+rvparse
+rvprop
+rvstart
+rvstartid
+rvtoken
+sabino
+safemode
+safesubst
+sais
+sameorigin
+samp
+sansserif
+save
+savearticle
+savedprefs
+saveprefs
+saveusergroups
+sawfish
+sbin
+sbquo
+scaler
+scalers
+scaron
+score
+screensize
+scribunto
+scriptable
+scriptbuilder
+scriptpath
+scrolltop
+sdot
+search
+search's
+searchaction
+searcharticle
+searchboxes
+searchbutton
+searcheverything
+searchform
+searchindex
+searchinfo
+searchlimit
+searchmenu
+searchnamespaces
+searchoptions
+searchresulttext
+searchstring
+searchtitle
+secondary
+section
+sectionanchor
+sectionedit
+sectioneditnotsupported
+sectionformat
+sectionnumber
+sectionprop
+sections
+sectionsnippet
+sectionsnotsupported
+sectiontitle
+securelogin
+seiten
+selectandother
+selectorother
+self
+selflink
+selfmove
+semiglobal
+semiprotected
+semiprotectedpagewarning
+sendemail
+sendmail
+sentences
+serialize
+servedby
+servername
+servertime
+serverurl
+sess
+session
+sessionfailure
+sessionid
+sessionkey
+setchange
+setcookie
+setemail
+setext
+setglobalaccountstatus
+setnewtype
+setnotificationtimestamp
+setopt
+setrename
+setrlimit
+setstatus
+sha
+shar
+sharding
+shared
+shareddescriptionfollows
+sharedfile
+sharedrepo
+sharedupload
+shellscript
+shiftwidth
+shockwave
+short
+shorturl
+shouldn
+shouting
+show
+showalldb
+showbots
+showdeleted
+showdiff
+showdifflinks
+showfilename
+showhiddencats
+showhideminor
+showhooks
+showingresults
+showinitializer
+showjumplinks
+showlinkedto
+showme
+showmeta
+shownavigation
+shownumberswatching
+showpreview
+showredirs
+showreviewed
+showsizediff
+showtoc
+showtoolbar
+showunreviewed
+shtml
+si
+siebrand
+sighhhh
+sigkill
+sigmaf
+signup
+sigsegv
+sigterm
+sii
+siit
+siiurlwidth
+simplesearch
+singlegroup
+singularthey
+sinumberingroup
+siprop
+site
+siteadmin
+sitecsspreview
+sitedir
+siteinfo
+sitejspreview
+sitemap
+sitemaps
+sitematrix
+sitename
+sitenotice
+siteprop
+sitesearch
+sitestats
+sitestatsupdate
+siteuser
+sitewide
+size
+sizediff
+sizediffdisabled
+sizes
+skey
+skinclass
+skinkey
+skinname
+skinnameclass
+skins
+skipcache
+skipcaptcha
+skipnotif
+skname
+sktemplate
+slideshow
+sm
+smaxage
+smil
+smtp
+snippet
+sodipodi
+softtabstop
+solaris
+somecontent
+somefeed
+someuser
+sorani
+sorbs
+sorbsreason
+sort
+sortdirection
+sortkey
+sortkeyprefix
+sortkeys
+source
+soxred
+spam
+spamdetected
+spamprotected
+spamprotectionmatch
+spamprotectiontext
+spamprotectiontitle
+spcontent
+special
+specialpage
+specialpagealiases
+specialpageattributes
+specialpagegroup
+specialpages
+specialprotected
+speedtip
+speedy
+speex
+spekking
+spellcheck
+spezial
+spoofable
+spreadsheetml
+sprefs
+sprintf
+sprotected
+sql's
+sqlite
+sqltotal
+sr
+srchres
+srcset
+srgs
+srprop
+srwhat
+stabilize
+stable
+stablesettings
+stansvik
+start
+startid
+startime
+startsortkey
+startsortkeyprefix
+starttime
+starttimestamp
+stash
+stashfailed
+stashimageinfo
+state
+staticredirect
+statistics
+statline
+status
+statuskey
+stdclass
+stdout
+steward
+stopwords
+storedversion
+strcasecmp
+strcmp
+string
+stripos
+stripslashes
+strlen
+strpos
+strrpos
+strtime
+strtok
+strtolower
+strtotime
+strtr
+struct
+strval
+stubthreshold
+student
+studies
+stuffit
+stxt
+stylename
+stylepath
+styleversion
+subaction
+subarray
+subcat
+subcats
+subclassing
+subcond
+subconds
+subdir
+subdomain
+subdomains
+sube
+subelement
+subelements
+subfunction
+subfunctions
+subimages
+subitem
+subitems
+subject
+subjectid
+subjectids
+subjectpagename
+subjectpagenamee
+subjectspace
+subjectspacee
+subkey
+subkeys
+sublevels
+submatch
+submodule
+submodule's
+submodules
+subnet
+subpage
+subpagename
+subpagenamee
+subpages
+subpagestr
+subparents
+subprocesses
+subsql
+substr
+succ
+success
+successbox
+suckage
+suggest
+suggestion
+suhosin
+suhosin's
+summ
+summary
+summarymissed
+summaryrequired
+supe
+superdomain
+superglobals
+superset
+suppress
+suppressed
+suppressedredirect
+suppressionlog
+suppressionlogtext
+suppressredirect
+suppressrevision
+svgs
+svn
+svnroot
+sybase
+symlinked
+syms
+sysinfo
+sysop
+system
+systemnachrichten
+szdiff
+szlig
+szymon
+t
+tabindex
+tablealign
+tablecell
+tablename
+tablesorter
+tablestack
+tabletags
+tabletype
+tabstop
+tag
+tagfilter
+tagline
+taglist
+tags
+tagset
+tagstack
+tailorings
+talk
+talkable
+talkfrom
+talkid
+talkids
+talkmove
+talkmoveoverredirect
+talkpage
+talkpageheader
+talkpagelinktext
+talkpagename
+talkpagenamee
+talkpagetext
+talkspace
+talkspacee
+talkto
+taraškievica
+tarask
+target
+tb
+tbase
+tbody
+tboverride
+tcount
+tcsh
+tddate
+tdtime
+teardown
+telnet
+temp
+tempdir
+template
+templatelinks
+templatepage
+templates
+templatesused
+templatesusedpreview
+templatesusedsection
+tempname
+tempout
+test
+testclean
+testdata
+testmailuser
+testpass
+testrunner
+testswarm
+testuser
+testutf
+texi
+texinfo
+text
+textarea
+textareas
+textares
+textbox
+textboxsize
+texthidden
+textid
+textlink
+textmissing
+textoverride
+textsf
+textsize
+textvector
+texvc
+tfoot
+tful
+tg
+that'll
+thead
+thelink
+theora
+thetasym
+thinsp
+thisisdeleted
+thispage
+thumbborder
+thumbcaption
+thumberror
+thumbheight
+thumbhtml
+thumbimage
+thumbinner
+thumbmime
+thumbnail
+thumbnailing
+thumbnailsize
+thumbname
+thumbsize
+thumbtext
+thumburl
+thumbwidth
+timeago
+timeanddate
+timecond
+timecorrection
+timeframe
+timekey
+timeoffset
+timep
+timespans
+timestamp
+timestamps
+timestamptz
+timezonelegend
+timezoneregion
+timezoneuseoffset
+timezoneuseserverdefault
+tino
+title
+titleblacklist
+titleconversion
+titleexists
+titlemsg
+titleprefixeddbkey
+titleprotected
+titleprotectedwarning
+titles
+titlesnippet
+titletext
+titlevector
+tl
+tllimit
+tltemplates
+tmpfile
+to
+toclevel
+tocline
+tocnumber
+tocsection
+toctext
+toctitle
+tofragment
+toggle
+toid
+token
+tokenname
+tokens
+tolang
+tongminh
+toobig
+toofewexpiries
+toohigh
+toolarray
+toolbarparent
+toolboxend
+toolboxlink
+toolong
+toolow
+tooltiponly
+tooshort
+top
+toparse
+topbar
+toplevel
+toplinks
+toponly
+torev
+torevid
+tornevall
+torunblocked
+totalcnt
+totalcount
+totalhits
+totalmemory
+totaltime
+totitle
+touched
+tplarg
+transcludable
+transclude
+transcluded
+transcluding
+transclusion
+transclusions
+transcode
+transcodekey
+transcoder
+transcodereset
+transcodestatus
+transcoding
+translatewiki
+transstat
+transwiki
+troff
+true
+truespeed
+trustworthy
+truthy
+tsearch
+tsquery
+tuple
+tweakblogs
+tweakers
+txt
+txtfm
+type
+typemustmatch
+typeof
+typname
+tzstring
+uacute
+uarr
+uc
+ucfirst
+ucirc
+udpprofile
+ufffd
+ugrave
+ui
+uint
+ulimit
+ulink
+ulinks
+uname
+unanchored
+unapprove
+unary
+unattached
+unauthenticate
+unavailable
+unblock
+unblocklogentry
+unblockself
+unblocktoken
+unbuffered
+uncacheable
+uncached
+uncategorized
+unclosable
+uncompress
+undel
+undelete
+undeleted
+undeletion
+undo
+undoafter
+undofailure
+undorev
+unescape
+unescaped
+unfeature
+unfeatured
+unflag
+ungrouped
+unhelpful
+unhidden
+unhide
+unidata
+unindent
+unindexed
+uniq
+unique
+universaleditbutton
+unixtime
+unknown
+unknownerror
+unknownnamespace
+unlock
+unlockdb
+unlogged
+unmakesafe
+unmark
+unmerge
+unmodified
+unoversight
+unoversighted
+unpadded
+unpatrolled
+unpatrolledletter
+unprefixed
+unprintables
+unprotect
+unprotectedarticle
+unprotection
+unprotectthispage
+unredacted
+unrequest
+unrequested
+unresolve
+unresolved
+unreviewed
+unreviewedpages
+unsanitized
+unseed
+unserialization
+unserialize
+unserialized
+unserializing
+unsetting
+unstub
+unstubbed
+unstubbing
+unstubs
+unsupportednamespace
+unsupportedrepo
+untaint
+untracked
+untrustworthiness
+unused
+unusual
+unversioned
+unviewable
+unviewed
+unwatch
+unwatched
+unwatchedpages
+unwatching
+unwatchthispage
+unwikified
+unwritable
+upconvert
+updateddate
+updatedtime
+updatelog
+upgradedoc
+upgrader
+upload
+upload's
+uploaddisabled
+uploadedimage
+uploadjava
+uploadlogpage
+uploadlogpagetext
+uploadnewversion
+uploadnologintext
+uploadpage
+uploadscripted
+uploadsource
+uploadstash
+uploadvirus
+uppercased
+upsih
+urandom
+url
+url's
+urlaction
+urldecode
+urldecoded
+urlencode
+urlencoded
+urlheight
+urlparam
+urlparm
+urlpath
+urlvar
+urlwidth
+ursh
+us
+usedomain
+useemail
+uselang
+uselivepreview
+usemod
+usemsgcache
+usenewrc
+user
+useragent
+useragents
+userblock
+usercan
+usercontribs
+usercreate
+usercreated
+usercss
+usercsspreview
+usercssyoucanpreview
+userdailycontribs
+userdir
+userdoesnotexist
+usereditcount
+useredits
+useremail
+userexists
+usergroup
+usergroups
+userhidden
+userid
+userinfo
+userinvalidcssjstitle
+userips
+userjs
+userjsprev
+userjspreview
+userjsyoucanpreview
+userlang
+userlangattributes
+userlink
+userlinks
+userlogin
+userloginlink
+userloginprompt
+userlogout
+usermaildisabled
+usermessage
+username
+usernameless
+usernames
+userpage
+userpages
+userpageurl
+userprefix
+userrights
+userrightstoken
+users
+usersbody
+userspace
+usertalk
+usertalklink
+usertext
+usertoollinks
+useskin
+useto
+usort
+ustar
+ustoken
+utfnormal
+uuml
+validate
+validationbuilder
+valign
+vals
+value
+values
+vandal
+vandalism
+variables
+variant
+variantarticlepath
+varlang
+varname
+vars
+varval
+vasiliev
+vasilvv
+vbase
+vbscript
+vcount
+vcsize
+venema's
+verbosify
+version
+versioning
+versionlink
+versionlog
+versionrequired
+versionrequiredtext
+very
+vhost
+vi
+vibber
+videoinfo
+view
+viewcount
+viewdeleted
+viewhelppage
+viewprevnext
+viewsource
+viewsourcelink
+viewsourcetext
+viewvc
+viewyourtext
+visible
+visualeditor
+viurlwidth
+voff
+vofp
+voicexml
+vorbis
+vpad
+vrml
+vslow
+vvcv
+vxml
+wais
+wait
+wakeup
+walltime
+warmup
+warning
+wasdeleted
+wasn
+watch
+watchcreations
+watchdefault
+watchdeletion
+watched
+watchlist
+watchlistdays
+watchlisthideanons
+watchlisthidebots
+watchlisthideliu
+watchlisthideminor
+watchlisthideown
+watchlisthidepatrolled
+watchlistraw
+watchlists
+watchlisttoken
+watchmoves
+watchthis
+watchthispage
+watchtoken
+watchuser
+wb
+wbmp
+wbxml
+wddx
+wddxfm
+weblog
+webm
+webp
+webrequest
+webserver
+weeks
+weierp
+weight
+wellwritten
+werdna
+wget
+what
+whatlinkshere
+whatwg
+wheely
+wheter
+whitelist
+whitelisted
+whitelistedittext
+whitelisting
+whois
+wicke
+width
+widthx
+wierkosz
+wietse
+wiki
+wiki'd
+wiki's
+wikia
+wikiadmin
+wikibase
+wikibits
+wikibooks
+wikidb
+wikifarm
+wikiid
+wikilink
+wikilinks
+wikilove
+wikiloveimagelog
+wikimedia
+wikimediacommons
+wikipage
+wikipedia
+wikipedian
+wikipedias
+wikiprintable
+wikis
+wikisyntax
+wikitable
+wikitables
+wikitech
+wikitext
+wikiuser
+wiktionary
+wincache
+wininet
+withaccess
+withaction
+witheditsonly
+withlanglinks
+withoutlanglinks
+wl
+wlallrev
+wldir
+wlend
+wlexcludeuser
+wllimit
+wlowner
+wlprop
+wltoken
+wmf's
+wml
+wmlc
+wmls
+wmlsc
+wmlscript
+wmlscriptc
+wordcount
+wordprocessingml
+wordwg
+workalike
+worldwind
+wouldn
+wr
+writeapi
+writeapidenied
+writedisabled
+writerequired
+writerights
+wrongpassword
+x
+xbitmap
+xcache
+xcancel
+xdebug
+xdiff
+xdomain
+xdomains
+xff
+xhtmldefaultnamespace
+xhtmlnamespaces
+xiff
+xlam
+xlsb
+xlsm
+xlsx
+xltm
+xltx
+xml
+xmldoublequote
+xmlfm
+xmlimport
+xmlns
+xmlsafe
+xmlselect
+xor
+xpinstall
+xpixmap
+xpsdocument
+xtended
+xwindowdump
+xxxx
+xxxxx
+yacute
+yaml
+yamlfm
+year
+yes
+youhavenewmessages
+youhavenewmessagesfromusers
+youhavenewmessagesmanyusers
+youhavenewmessagesmulti
+yourdiff
+yourdomainname
+youremail
+yourgender
+yourinternal
+yourlanguage
+yourname
+yournick
+yourpassword
+yourrealname
+yourtext
+yourvariant
+yourwiki
+yuml
+yyyymmddhhiiss
+zhdaemon
+zhengzhu
+zhtable
+zijdel
+zlib
+zoffset
+zwnj
index 15b0016..10984b0 100644 (file)
@@ -34,7 +34,7 @@ if ( !defined( 'RUN_MAINTENANCE_IF_MAIN' ) ) {
 // Wasn't included from the file scope, halt execution (probably wanted the class)
 // If a class is using commandLine.inc (old school maintenance), they definitely
 // cannot be included and will proceed with execution
-if( !Maintenance::shouldExecute() && $maintClass != 'CommandLineInc' ) {
+if ( !Maintenance::shouldExecute() && $maintClass != 'CommandLineInc' ) {
        return;
 }
 
@@ -54,22 +54,21 @@ $maintenance->setup();
 $self = $maintenance->getName();
 
 // Detect compiled mode
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       define( 'MW_COMPILED', 1 );
-} else {
-       # Get the MWInit class
-       require_once( "$IP/includes/Init.php" );
-       require_once( "$IP/includes/AutoLoader.php" );
-}
-
+# Get the MWInit class
+require_once "$IP/includes/Init.php";
+require_once "$IP/includes/AutoLoader.php";
 # Stub the profiler
-require_once( MWInit::compiledPath( 'includes/profiler/Profiler.php' ) );
+require_once "$IP/includes/profiler/Profiler.php";
 
-// Some other requires
-if ( !defined( 'MW_COMPILED' ) ) {
-       require_once( "$IP/includes/Defines.php" );
+# Start the profiler
+$wgProfiler = array();
+if ( file_exists( "$IP/StartProfiler.php" ) ) {
+       require "$IP/StartProfiler.php";
 }
-require_once( MWInit::compiledPath( 'includes/DefaultSettings.php' ) );
+
+// Some other requires
+require_once "$IP/includes/Defines.php";
+require_once MWInit::compiledPath( 'includes/DefaultSettings.php' );
 
 if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        # Use a callback function to configure MediaWiki
@@ -82,25 +81,26 @@ if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
                # Maybe a hook?
                global $cluster;
                $cluster = 'pmtpa';
-               require( MWInit::interpretedPath( '../wmf-config/wgConf.php' ) );
+               require MWInit::interpretedPath( '../wmf-config/wgConf.php' );
        }
        // Require the configuration (probably LocalSettings.php)
-       require( $maintenance->loadSettings() );
+       require $maintenance->loadSettings();
 }
 
 if ( $maintenance->getDbType() === Maintenance::DB_ADMIN &&
        is_readable( "$IP/AdminSettings.php" ) )
 {
-       require( MWInit::interpretedPath( 'AdminSettings.php' ) );
+       require MWInit::interpretedPath( 'AdminSettings.php' );
 }
 
 if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
-       if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) )
+       if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) ) {
                $wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
+       }
 }
 $maintenance->finalSetup();
 // Some last includes
-require_once( MWInit::compiledPath( 'includes/Setup.php' ) );
+require_once MWInit::compiledPath( 'includes/Setup.php' );
 
 // Much much faster startup than creating a title object
 $wgTitle = null;
@@ -123,6 +123,6 @@ try {
        $factory->commitMasterChanges();
        $factory->shutdown();
 } catch ( MWException $mwe ) {
-       echo( $mwe->getText() );
+       echo $mwe->getText();
        exit( 1 );
 }
index c9546c6..25a777c 100644 (file)
 
 $originalDir = getcwd();
 
-$optionsWithArgs = array( 'pagelist', 'start', 'end', 'revstart', 'revend');
+$optionsWithArgs = array( 'pagelist', 'start', 'end', 'revstart', 'revend' );
 
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/backup.inc' );
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/backup.inc';
 
 $dumper = new BackupDumper( $argv );
 
@@ -44,8 +44,8 @@ if ( isset( $options['pagelist'] ) ) {
        $pages = file( $options['pagelist'] );
        chdir( $olddir );
        if ( $pages === false ) {
-               echo( "Unable to open file {$options['pagelist']}\n" );
-               die(1);
+               echo "Unable to open file {$options['pagelist']}\n";
+               die( 1 );
        }
        $pages = array_map( 'trim', $pages );
        $dumper->pages = array_filter( $pages, create_function( '$x', 'return $x !== "";' ) );
@@ -79,7 +79,7 @@ if ( isset( $options['full'] ) ) {
        $dumper->dump( WikiExporter::STABLE, $textMode );
 } elseif ( isset( $options['logs'] ) ) {
        $dumper->dump( WikiExporter::LOGS );
-} elseif ( isset($options['revrange'] ) ) {
+} elseif ( isset( $options['revrange'] ) ) {
        $dumper->dump( WikiExporter::RANGE, $textMode );
 } else {
        $dumper->progress( <<<ENDS
index 870d632..dd468a9 100644 (file)
@@ -26,7 +26,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Base class for interating over a dump.
@@ -47,13 +47,13 @@ abstract class DumpIterator extends Maintenance {
        }
 
        public function execute() {
-               if (! ( $this->hasOption('file') ^ $this->hasOption('dump') ) ) {
-                       $this->error("You must provide a file or dump", true);
+               if ( !( $this->hasOption( 'file' ) ^ $this->hasOption( 'dump' ) ) ) {
+                       $this->error( "You must provide a file or dump", true );
                }
 
                $this->checkOptions();
 
-               if ( $this->hasOption('file') ) {
+               if ( $this->hasOption( 'file' ) ) {
                        $revision = new WikiRevision;
 
                        $revision->setText( file_get_contents( $this->getOption( 'file' ) ) );
@@ -64,10 +64,10 @@ abstract class DumpIterator extends Maintenance {
 
                $this->startTime = microtime( true );
 
-               if ( $this->getOption('dump') == '-' ) {
+               if ( $this->getOption( 'dump' ) == '-' ) {
                        $source = new ImportStreamSource( $this->getStdin() );
                } else {
-                       $this->error("Sorry, I don't support dump filenames yet. Use - and provide it on stdin on the meantime.", true);
+                       $this->error( "Sorry, I don't support dump filenames yet. Use - and provide it on stdin on the meantime.", true );
                }
                $importer = new WikiImporter( $source );
 
@@ -81,9 +81,10 @@ abstract class DumpIterator extends Maintenance {
                $this->conclusions();
 
                $delta = microtime( true ) - $this->startTime;
-               $this->error( "Done {$this->count} revisions in " . round($delta, 2) . " seconds " );
-               if ($delta > 0)
-                       $this->error( round($this->count / $delta, 2) . " pages/sec" );
+               $this->error( "Done {$this->count} revisions in " . round( $delta, 2 ) . " seconds " );
+               if ( $delta > 0 ) {
+                       $this->error( round( $this->count / $delta, 2 ) . " pages/sec" );
+               }
 
                # Perform the memory_get_peak_usage() when all the other data has been output so there's no damage if it dies.
                # It is only available since 5.2.0 (since 5.2.1 if you haven't compiled with --enable-memory-limit)
@@ -96,7 +97,7 @@ abstract class DumpIterator extends Maintenance {
                if ( $this->getDbType() == Maintenance::DB_NONE ) {
                        global $wgUseDatabaseMessages, $wgLocalisationCacheConf, $wgHooks;
                        $wgUseDatabaseMessages = false;
-                       $wgLocalisationCacheConf['storeClass'] =  'LCStore_Null';
+                       $wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
                        $wgHooks['InterwikiLoadPrefix'][] = 'DumpIterator::disableInterwikis';
                }
        }
@@ -122,9 +123,10 @@ abstract class DumpIterator extends Maintenance {
 
                $this->count++;
                if ( isset( $this->from ) ) {
-                       if ( $this->from != $title )
+                       if ( $this->from != $title ) {
                                return;
-                       $this->output( "Skipped " . ($this->count - 1) . " pages\n" );
+                       }
+                       $this->output( "Skipped " . ( $this->count - 1 ) . " pages\n" );
 
                        $this->count = 1;
                        $this->from = null;
@@ -175,4 +177,4 @@ class SearchDump extends DumpIterator {
 }
 
 $maintClass = "SearchDump";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 08aae29..be0b463 100644 (file)
@@ -30,7 +30,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that generates a plaintext link dump.
@@ -63,16 +63,17 @@ class DumpLinks extends Maintenance {
                                        $this->output( "\n" );
                                }
                                $page = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $this->output( $page->getPrefixedUrl() );
+                               $this->output( $page->getPrefixedURL() );
                                $lastPage = $row->page_id;
                        }
                        $link = Title::makeTitle( $row->pl_namespace, $row->pl_title );
-                       $this->output( " " . $link->getPrefixedUrl() );
+                       $this->output( " " . $link->getPrefixedURL() );
                }
-               if ( isset( $lastPage ) )
+               if ( isset( $lastPage ) ) {
                        $this->output( "\n" );
+               }
        }
 }
 
 $maintClass = "DumpLinks";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index e05e154..5f0c5b7 100644 (file)
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that generates a page name dump for SisterSites usage.
@@ -43,14 +43,15 @@ class DumpSisterSites extends Maintenance {
                $dbr->bufferResults( false );
                $result = $dbr->select( 'page',
                        array( 'page_namespace', 'page_title' ),
-                       array( 'page_namespace'   => NS_MAIN,
-                                  'page_is_redirect' => 0,
+                       array(
+                               'page_namespace' => NS_MAIN,
+                               'page_is_redirect' => 0,
                        ),
                        __METHOD__ );
 
                foreach ( $result as $row ) {
                        $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                       $url = $title->getFullUrl();
+                       $url = $title->getFullURL();
                        $text = $title->getPrefixedText();
                        $this->output( "$url $text\n" );
                }
@@ -58,4 +59,4 @@ class DumpSisterSites extends Maintenance {
 }
 
 $maintClass = "DumpSisterSites";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2e0d03b..5d783cb 100644 (file)
@@ -26,8 +26,8 @@
 
 $originalDir = getcwd();
 
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/backupTextPass.inc' );
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/backupTextPass.inc';
 
 
 $dumper = new TextPassDumper( $argv );
index 0d0dfcf..1a9293c 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to dump a the list of files uploaded,
@@ -125,4 +125,4 @@ By default, outputs relative paths against the parent directory of \$wgUploadDir
 }
 
 $maintClass = "UploadDumper";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 93fc3e7..7fca651 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to make a page edit.
@@ -92,4 +92,4 @@ class EditCLI extends Maintenance {
 }
 
 $maintClass = "EditCLI";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/eraseArchivedFile.php b/maintenance/eraseArchivedFile.php
new file mode 100644 (file)
index 0000000..4b06513
--- /dev/null
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Delete archived (non-current) files from storage
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Aaron Schulz
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to delete archived (non-current) files from storage.
+ *
+ * @TODO: Maybe add some simple logging
+ *
+ * @ingroup Maintenance
+ * @since 1.22
+ */
+class EraseArchivedFile extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Erases traces of deleted files.";
+               $this->addOption( 'delete', 'Perform the deletion' );
+               $this->addOption( 'filename', 'File name', false, true );
+               $this->addOption( 'filekey', 'File storage key (with extension) or "*"', true, true );
+       }
+
+       public function execute() {
+               if ( !$this->hasOption( 'delete' ) ) {
+                       $this->output( "Use --delete to actually confirm this script\n" );
+               }
+
+               $filekey = $this->getOption( 'filekey' );
+               $filename = $this->getOption( 'filename' );
+
+               if ( $filekey === '*' ) { // all versions by name
+                       if ( !strlen( $filename ) ) {
+                               $this->error( "Missing --filename parameter.", 1 );
+                       }
+                       $afile = false;
+               } else { // specified version
+                       $dbw = wfGetDB( DB_MASTER );
+                       $row = $dbw->selectRow( 'filearchive', '*',
+                               array( 'fa_storage_group' => 'deleted', 'fa_storage_key' => $filekey ),
+                               __METHOD__ );
+                       if ( !$row ) {
+                               $this->error( "No deleted file exists with key '$filekey'.", 1 );
+                       }
+                       $filename = $row->fa_name;
+                       $afile = ArchivedFile::newFromRow( $row );
+               }
+
+               $file = wfLocalFile( $filename );
+               if ( $file->exists() ) {
+                       $this->error( "File '$filename' is still a public file, use the delete form.\n", 1 );
+               }
+
+               $this->output( "Purging all thumbnails for file '$filename'..." );
+               $file->purgeCache();
+               $file->purgeHistory();
+               $this->output( "done.\n" );
+
+               if ( $afile instanceof ArchivedFile ) {
+                       $this->scrubVersion( $afile );
+               } else {
+                       $this->output( "Finding deleted versions of file '$filename'...\n" );
+                       $this->scrubAllVersions( $filename );
+                       $this->output( "Done\n" );
+               }
+       }
+
+       protected function scrubAllVersions( $name ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $res = $dbw->select( 'filearchive', '*',
+                       array( 'fa_name' => $name, 'fa_storage_group' => 'deleted' ),
+                       __METHOD__ );
+               foreach ( $res as $row ) {
+                       $this->scrubVersion( ArchivedFile::newFromRow( $row ) );
+               }
+       }
+
+       protected function scrubVersion( ArchivedFile $archivedFile ) {
+               $key = $archivedFile->getStorageKey();
+               $name = $archivedFile->getName();
+               $ts = $archivedFile->getTimestamp();
+               $repo = RepoGroup::singleton()->getLocalRepo();
+               $path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
+               if ( $this->hasOption( 'delete' ) ) {
+                       $status = $repo->getBackend()->delete( array( 'src' => $path ) );
+                       if ( $status->isOK() ) {
+                               $this->output( "Deleted version '$key' ($ts) of file '$name'\n" );
+                       } else {
+                               $this->output( "Failed to delete version '$key' ($ts) of file '$name'\n" );
+                               $this->output( print_r( $status->getErrorsArray(), true ) );
+                       }
+               } else {
+                       $this->output( "Would delete version '{$key}' ({$ts}) of file '$name'\n" );
+               }
+       }
+}
+
+$maintClass = "EraseArchivedFile";
+require_once( RUN_MAINTENANCE_IF_MAIN );
index 95f46ff..abedc61 100644 (file)
@@ -34,7 +34,7 @@
 $optionsWithArgs = array( 'd' );
 
 /** */
-require_once( __DIR__ . "/commandLine.inc" );
+require_once __DIR__ . "/commandLine.inc";
 
 if ( isset( $options['d'] ) ) {
        $d = $options['d'];
index a705bcc..05470d3 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script used to fetch page text in a subprocess.
@@ -45,7 +45,7 @@ class FetchText extends Maintenance {
         *
         * note that that the text string itself is *not* followed by newline
         */
-        public function execute() {
+       public function execute() {
                $db = wfGetDB( DB_SLAVE );
                $stdin = $this->getStdin();
                while ( !feof( $stdin ) ) {
@@ -56,12 +56,12 @@ class FetchText extends Maintenance {
                        }
                        $textId = intval( $line );
                        $text = $this->doGetText( $db, $textId );
-                       if ($text === false) {
+                       if ( $text === false ) {
                                # actual error, not zero-length text
                                $textLen = "-1";
                        }
                        else {
-                               $textLen = strlen($text);
+                               $textLen = strlen( $text );
                        }
                        $this->output( $textId . "\n" . $textLen . "\n" . $text );
                }
@@ -88,4 +88,4 @@ class FetchText extends Maintenance {
 }
 
 $maintClass = "FetchText";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 008d768..9dba818 100644 (file)
  * @ingroup Maintenance
  */
 
-$wgProfiler = array( 'class' => 'ProfilerSimpleText' );
 error_reporting( E_ALL );
-
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to test fileop performance.
@@ -44,6 +42,8 @@ class TestFileOpPerformance extends Maintenance {
        }
 
        public function execute() {
+               Profiler::setInstance( new ProfilerSimpleText( array() ) ); // clear
+
                $backend = FileBackendGroup::singleton()->get( $this->getOption( 'b1' ) );
                $this->doPerfTest( $backend );
 
@@ -52,10 +52,8 @@ class TestFileOpPerformance extends Maintenance {
                        $this->doPerfTest( $backend );
                }
 
-               $profiler = Profiler::instance();
-               $profiler->setTemplated( true );
-
-               //NOTE: as of MW1.21, $profiler->logData() is called implicitly by doMaintenance.php.
+               Profiler::instance()->setTemplated( true );
+               // NOTE: as of MW1.21, $profiler->logData() is called implicitly by doMaintenance.php.
        }
 
        protected function doPerfTest( FileBackend $backend ) {
@@ -79,7 +77,7 @@ class TestFileOpPerformance extends Maintenance {
                                $this->output( "Using '$dirname/$file' in operations.\n" );
                                $dst = $baseDir . '/' . wfBaseName( $file );
                                $ops1[] = array( 'op' => 'store',
-                                       'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1);
+                                       'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1 );
                                $ops2[] = array( 'op' => 'copy',
                                        'src' => "$dst", 'dst' => "$dst-1", 'overwrite' => 1 );
                                $ops3[] = array( 'op' => 'move',
@@ -106,7 +104,7 @@ class TestFileOpPerformance extends Maintenance {
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
-                       exit(0);
+                       exit( 0 );
                }
                $this->output( $backend->getName() . ": Stored " . count( $ops1 ) . " files in $e ms.\n" );
 
@@ -115,7 +113,7 @@ class TestFileOpPerformance extends Maintenance {
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
-                       exit(0);
+                       exit( 0 );
                }
                $this->output( $backend->getName() . ": Copied " . count( $ops2 ) . " files in $e ms.\n" );
 
@@ -124,7 +122,7 @@ class TestFileOpPerformance extends Maintenance {
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
-                       exit(0);
+                       exit( 0 );
                }
                $this->output( $backend->getName() . ": Moved " . count( $ops3 ) . " files in $e ms.\n" );
 
@@ -133,7 +131,7 @@ class TestFileOpPerformance extends Maintenance {
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
-                       exit(0);
+                       exit( 0 );
                }
                $this->output( $backend->getName() . ": Deleted " . count( $ops4 ) . " files in $e ms.\n" );
 
@@ -142,11 +140,11 @@ class TestFileOpPerformance extends Maintenance {
                $e = ( microtime( true ) - $start ) * 1000;
                if ( $status->getErrorsArray() ) {
                        print_r( $status->getErrorsArray() );
-                       exit(0);
+                       exit( 0 );
                }
                $this->output( $backend->getName() . ": Deleted " . count( $ops5 ) . " files in $e ms.\n" );
        }
 }
 
 $maintClass = "TestFileOpPerformance";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 778da5a..373170f 100644 (file)
@@ -34,7 +34,7 @@
  * @author Antoine Musso <hashar at free dot fr>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that compares documented and actually present mismatches.
@@ -248,4 +248,4 @@ class FindHooks extends Maintenance {
 }
 
 $maintClass = 'FindHooks';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 19b9777..523be7e 100644 (file)
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes double redirects.
@@ -134,4 +134,4 @@ class FixDoubleRedirects extends Maintenance {
 }
 
 $maintClass = "FixDoubleRedirects";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2403ec6..55fbd9a 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes any entriy for protocol-relative URLs
@@ -85,4 +85,4 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "FixExtLinksProtocolRelative";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ab7603d..e4e557f 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes erroneous page_latest values
@@ -106,10 +106,10 @@ class FixSlaveDesync extends Maintenance {
                        $db = wfGetDB( $i );
                        /*
                        if ( !$db->masterPosWait( $masterFile, $masterPos, 10 ) ) {
-                                  $this->output( "Slave is too lagged, aborting\n" );
-                                  $dbw->commit( __METHOD__ );
-                                  sleep(10);
-                                  return;
+                               $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__ );
@@ -213,4 +213,4 @@ class FixSlaveDesync extends Maintenance {
 }
 
 $maintClass = "FixSlaveDesync";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 84d08d3..b0609d1 100644 (file)
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes timestamp corruption caused by one or
@@ -125,4 +125,4 @@ class FixTimestamps extends Maintenance {
 }
 
 $maintClass = "FixTimestamps";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 91d42a5..097936c 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fixes the user_registration field.
@@ -58,4 +58,4 @@ class FixUserRegistration extends Maintenance {
 }
 
 $maintClass = "FixUserRegistration";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 691ed80..e2b3c41 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ .'/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that formats RELEASE-NOTE file to wiki text or HTML markup.
@@ -75,4 +75,4 @@ class MaintenanceFormatInstallDoc extends Maintenance {
 }
 
 $maintClass = 'MaintenanceFormatInstallDoc';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4c03980..6b7f38a 100644 (file)
@@ -127,17 +127,17 @@ Wiki configuration for testing:
   $wgEnableWriteAPI = true;   // enable API.
 
   // Install & enable Parser Hook extensions to increase code coverage. E.g.:
-  require_once("extensions/ParserFunctions/ParserFunctions.php");
-  require_once("extensions/Cite/Cite.php");
-  require_once("extensions/inputbox/inputbox.php");
-  require_once("extensions/Sort/Sort.php");
-  require_once("extensions/wikihiero/wikihiero.php");
-  require_once("extensions/CharInsert/CharInsert.php");
-  require_once("extensions/FixedImage/FixedImage.php");
+  require_once "extensions/ParserFunctions/ParserFunctions.php";
+  require_once "extensions/Cite/Cite.php";
+  require_once "extensions/inputbox/inputbox.php";
+  require_once "extensions/Sort/Sort.php";
+  require_once "extensions/wikihiero/wikihiero.php";
+  require_once "extensions/CharInsert/CharInsert.php";
+  require_once "extensions/FixedImage/FixedImage.php";
 
   // Install & enable Special Page extensions to increase code coverage. E.g.:
-  require_once("extensions/Cite/SpecialCite.php");
-  require_once("extensions/Renameuser/SpecialRenameuser.php");
+  require_once "extensions/Cite/SpecialCite.php";
+  require_once "extensions/Renameuser/SpecialRenameuser.php";
   // --------- End ---------
 
   If you want to try E_STRICT error logging, add this to the above:
@@ -181,7 +181,7 @@ TODO:
 // ///////////////////////// COMMAND LINE HELP ////////////////////////////////////
 
 // This is a command line script, load MediaWiki env (gives command line options);
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 // if the user asked for an explanation of command line options.
 if ( isset( $options["help"] ) ) {
@@ -657,6 +657,7 @@ class wikiFuzz {
                        "}}",
                        "{{INT:googlesearch|",
                        "}}",
+                        "{{ROOTPAGENAME}}",
                        "{{BASEPAGENAME}}",
                        "{{CONTENTLANGUAGE}}",
                        "{{PAGESINNAMESPACE:}}",
@@ -1972,7 +1973,7 @@ class specialChemicalsourcesTest extends pageTest {
  ** returns the help screen - so currently a lot of the tests aren't actually doing much
  ** because something wasn't right in the query.
  **
- ** @todo: Incomplete / unfinished; Runs too fast (suggests not much testing going on).
+ ** @todo Incomplete / unfinished; Runs too fast (suggests not much testing going on).
  */
 class api extends pageTest {
 
@@ -2542,7 +2543,7 @@ function runWikiTest( pageTest $test, &$testname, $can_overwrite = false ) {
                if ( !$valid ) print "\nW3C web validation failed - view details with: html2text " . DIRECTORY . "/" . $testname . ".validator_output.html";
        }
 
-       // Get tidy to check the page, unless we already know it produces non-XHTML output.
+       // Get tidy to check the page, unless we already know it produces non-(X)HTML output.
        if ( $test->tidyValidate() ) {
                $valid = tidyCheckFile( $testname . HTML_FILE ) && $valid;
        }
index adea97e..4f6bed5 100644 (file)
@@ -26,7 +26,7 @@
  * @see http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that generates a sitemap for the site.
@@ -167,7 +167,7 @@ class GenerateSitemap extends Maintenance {
                }
                $this->identifier = $this->getOption( 'identifier', wfWikiID() );
                $this->compress = $this->getOption( 'compress', 'yes' ) !== 'no';
-               $this->skipRedirects = $this->getOption( 'skip-redirects', false ) !== false ;
+               $this->skipRedirects = $this->getOption( 'skip-redirects', false ) !== false;
                $this->dbr = wfGetDB( DB_SLAVE );
                $this->generateNamespaces();
                $this->timestamp = wfTimestamp( TS_ISO_8601, wfTimestampNow() );
@@ -231,7 +231,7 @@ class GenerateSitemap extends Maintenance {
                        wfMkdirParents( $fspath, null, __METHOD__ ) or die( "Can not create directory $fspath.\n" );
                }
 
-               return realpath( $fspath ) . DIRECTORY_SEPARATOR ;
+               return realpath( $fspath ) . DIRECTORY_SEPARATOR;
        }
 
        /**
@@ -255,8 +255,9 @@ class GenerateSitemap extends Maintenance {
                        )
                );
 
-               foreach ( $res as $row )
+               foreach ( $res as $row ) {
                        $this->namespaces[] = $row->page_namespace;
+               }
        }
 
        /**
@@ -319,7 +320,7 @@ class GenerateSitemap extends Maintenance {
                        $this->output( "$namespace ($fns)\n" );
                        $skippedRedirects = 0;  // Number of redirects skipped for that namespace
                        foreach ( $res as $row ) {
-                               if ($this->skipRedirects && $row->page_is_redirect ) {
+                               if ( $this->skipRedirects && $row->page_is_redirect ) {
                                        $skippedRedirects++;
                                        continue;
                                }
@@ -346,7 +347,9 @@ class GenerateSitemap extends Maintenance {
                                if ( $wgContLang->hasVariants() ) {
                                        $variants = $wgContLang->getVariants();
                                        foreach ( $variants as $vCode ) {
-                                               if ( $vCode == $wgContLang->getCode() ) continue; // we don't want default variant
+                                               if ( $vCode == $wgContLang->getCode() ) {
+                                                       continue; // we don't want default variant
+                                               }
                                                $entry = $this->fileEntry( $title->getCanonicalURL( '', $vCode ), $date, $this->priority( $namespace ) );
                                                $length += strlen( $entry );
                                                $this->write( $this->file, $entry );
@@ -354,7 +357,7 @@ class GenerateSitemap extends Maintenance {
                                }
                        }
 
-                       if ($this->skipRedirects && $skippedRedirects > 0) {
+                       if ( $this->skipRedirects && $skippedRedirects > 0 ) {
                                $this->output( "  skipped $skippedRedirects redirect(s)\n" );
                        }
 
@@ -374,7 +377,7 @@ class GenerateSitemap extends Maintenance {
         */
        function open( $file, $flags ) {
                $resource = $this->compress ? gzopen( $file, $flags ) : fopen( $file, $flags );
-               if( $resource === false ) {
+               if ( $resource === false ) {
                        wfDebugDieBacktrace( __METHOD__ . " error opening file $file with flags $flags. Check permissions?" );
                }
                return $resource;
@@ -384,23 +387,25 @@ class GenerateSitemap extends Maintenance {
         * gzwrite() / fwrite() wrapper
         */
        function write( &$handle, $str ) {
-               if( $handle === true || $handle === false ) {
+               if ( $handle === true || $handle === false ) {
                        wfDebugDieBacktrace( __METHOD__ . " was passed a boolean as a file handle.\n" );
                }
-               if ( $this->compress )
+               if ( $this->compress ) {
                        gzwrite( $handle, $str );
-               else
+               } else {
                        fwrite( $handle, $str );
+               }
        }
 
        /**
         * gzclose() / fclose() wrapper
         */
        function close( &$handle ) {
-               if ( $this->compress )
+               if ( $this->compress ) {
                        gzclose( $handle );
-               else
+               } else {
                        fclose( $handle );
+               }
        }
 
        /**
@@ -485,7 +490,8 @@ class GenerateSitemap extends Maintenance {
        function fileEntry( $url, $date, $priority ) {
                return
                        "\t<url>\n" .
-                       "\t\t<loc>$url</loc>\n" .
+                       // bug 34666: $url may contain bad characters such as ampersands.
+                       "\t\t<loc>" . htmlspecialchars( $url ) . "</loc>\n" .
                        "\t\t<lastmod>$date</lastmod>\n" .
                        "\t\t<priority>$priority</priority>\n" .
                        "\t</url>\n";
@@ -516,4 +522,4 @@ class GenerateSitemap extends Maintenance {
 }
 
 $maintClass = "GenerateSitemap";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 83b5b02..57ff083 100644 (file)
@@ -23,7 +23,7 @@
  * @author Antoine Musso
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Print serialized output of MediaWiki config vars
@@ -53,7 +53,7 @@ class GetConfiguration extends Maintenance {
                }
 
                $out = null;
-               switch( $this->getOption( 'format' ) ) {
+               switch ( $this->getOption( 'format' ) ) {
                        case 'PHP':
                                $out = serialize( $res );
                                break;
@@ -86,4 +86,4 @@ class GetConfiguration extends Maintenance {
 }
 
 $maintClass = "GetConfiguration";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 72b1d48..7365a2e 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that displays replication lag times.
@@ -39,7 +39,7 @@ class GetLagTimes extends Maintenance {
 
                if ( $lb->getServerCount() == 1 ) {
                        $this->error( "This script dumps replication lag times, but you don't seem to have\n"
-                                                 . "a multi-host db server configuration." );
+                               . "a multi-host db server configuration." );
                } else {
                        $lags = $lb->getLagTimes();
                        foreach ( $lags as $n => $lag ) {
@@ -59,4 +59,4 @@ class GetLagTimes extends Maintenance {
 }
 
 $maintClass = "GetLagTimes";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ec9ed20..d618825 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that reports the hostname of a slave server.
@@ -51,4 +51,4 @@ class GetSlaveServer extends Maintenance {
 }
 
 $maintClass = "GetSlaveServer";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index f6adfe2..9c4bdfb 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that outputs page text to stdout.
@@ -62,4 +62,4 @@ class GetTextMaint extends Maintenance {
 }
 
 $maintClass = "GetTextMaint";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/hiphop/compiler.conf b/maintenance/hiphop/compiler.conf
deleted file mode 100644 (file)
index 3e01640..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-GenerateSourceInfo = true
-EnableEval = 2
-AllDynamic = true
-EnableHipHopSyntax = true
-EnableHipHopExperimentalSyntax = true
diff --git a/maintenance/hiphop/extra-files b/maintenance/hiphop/extra-files
deleted file mode 100644 (file)
index f07f7c7..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-img_auth.php
-includes/AutoLoader.php
-includes/DefaultSettings.php
-includes/Defines.php
-includes/GlobalFunctions.php
-includes/ImageFunctions.php
-includes/OutputHandler.php
-includes/ProxyTools.php
-includes/SeleniumWebSettings.php
-includes/Setup.php
-includes/StreamFile.php
-includes/WebStart.php
-includes/filerepo/NullRepo.php
-includes/normal/UtfNormalDefines.php
-includes/normal/UtfNormalUtil.php
-index.php
-languages/Names.php
-load.php
-maintenance/Maintenance.php
-maintenance/commandLine.inc
-maintenance/doMaintenance.php
-maintenance/eval.php
-opensearch_desc.php
-profileinfo.php
-redirect.php
-resources/Resources.php
-serialized/serialize.php
-skins/MonoBook.deps.php
-skins/MonoBook.php
-skins/Vector.deps.php
-skins/Vector.php
-thumb.php
-trackback.php
-
diff --git a/maintenance/hiphop/make b/maintenance/hiphop/make
deleted file mode 100644 (file)
index 13e3163..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-#!/usr/bin/hphpi -f
-<?php
-
-define( 'MW_CONFIG_CALLBACK', 'MakeHipHop::noConfigNeeded' );
-require( __DIR__ . '/../Maintenance.php' );
-
-class MakeHipHop extends Maintenance {
-       function noConfigNeeded() {}
-
-       function execute() {
-               global $wgHipHopBuildDirectory;
-
-               $startTime = time();
-
-               $thisDir = realpath( __DIR__ );
-               $IP = realpath( "$thisDir/../.." );
-               if ( strval( $wgHipHopBuildDirectory ) !== '' ) {
-                       $buildDir = $wgHipHopBuildDirectory;
-               } else {
-                       $buildDir = "$thisDir/build";
-               }
-               $extensionsDir = realpath( MWInit::getExtensionsDirectory() );
-               $outDir = "$buildDir/hiphop-output";
-               $persistentDir = "$buildDir/persistent";
-
-               if ( !is_dir( $buildDir ) ) {
-                       mkdir( $buildDir, 0777, true );
-               }
-               if ( !is_dir( $persistentDir ) ) {
-                       mkdir( $persistentDir, 0777, true );
-               }
-
-               if ( realpath( "$IP/../phase3" ) !== $IP
-                       || realpath( "$IP/../extensions" ) !== $extensionsDir )
-               {
-                       # Set up a fake source directory with the correct layout
-                       $sourceBase = "$buildDir/source";
-                       $this->setupFakeSourceBase( $IP, $extensionsDir, $sourceBase );
-               } else {
-                       $sourceBase = realpath( "$IP/.." );
-                       unlink( "$buildDir/source" );
-               }
-
-               # With the CentOS RPMs, you just get g++44, no g++, so we have to
-               # use the environment
-               if ( isset( $_ENV['CXX'] ) ) {
-                       $cxx = $_ENV['CXX'];
-               } else {
-                       $cxx = 'g++';
-               }
-
-               # Create a function that provides the HipHop compiler version, and
-               # doesn't exist when MediaWiki is invoked in interpreter mode.
-               $version = str_replace( PHP_EOL, ' ', trim( `hphp --version` ) );
-               file_put_contents(
-                       "$buildDir/HipHopCompilerVersion.php",
-                       "<" . "?php\n" .
-                       "function wfHipHopCompilerVersion() {\n" .
-                       "return " . var_export( $version, true ) . ";\n" .
-                       "}\n"
-               );
-
-               # Generate the file list
-               $files = $this->getFileList();
-               file_put_contents(
-                       "$buildDir/file-list",
-                       implode( "\n", $files ) . "\n" );
-
-               # Generate the C++
-               passthru(
-                       'hphp' .
-                       ' --target=cpp' .
-                       ' --format=file' .
-                       ' --input-dir=' . wfEscapeShellArg( $sourceBase ) .
-                       ' --input-list=' . wfEscapeShellArg( "$buildDir/file-list" ) .
-                       ' --inputs=' . wfEscapeShellArg( "$buildDir/HipHopCompilerVersion.php" ) .
-                       ' -c ' . wfEscapeShellArg( "$thisDir/compiler.conf" ) .
-                       ' --parse-on-demand=false' .
-                       ' --program=mediawiki-hphp' .
-                       ' --output-dir=' . wfEscapeShellArg( $outDir ) .
-                       ' --log=3', $ret );
-
-               if ( $ret ) {
-                       $this->error( "hphp hit an error. Stopping build.\n" );
-                       exit( 1 );
-               }
-
-               # Sanity check, quickly make sure we've got an output directory
-               if( !is_dir( $outDir ) ) {
-                       $this->error( "No output directory", true );
-               }
-
-               # Warn about volatile classes
-               $this->checkVolatileClasses( $outDir );
-
-               # Copy the generated C++ files into the source directory for cmake
-               $iter = new RecursiveIteratorIterator(
-                       new RecursiveDirectoryIterator( $outDir ),
-                       RecursiveIteratorIterator::SELF_FIRST );
-               $sourceFiles = array();
-               $regenerateMakefile = false;
-               $numFiles = 0;
-               $numFilesChanged = 0;
-               foreach ( $iter as $sourcePath => $file ) {
-                       $name = substr( $sourcePath, strlen( $outDir ) + 1 );
-                       $sourceFiles[$name] = true;
-                       $destPath = "$persistentDir/$name";
-                       if ( $file->isDir() ) {
-                               if ( !is_dir( $destPath ) ) {
-                                       mkdir( $destPath );
-                               }
-                               continue;
-                       }
-
-                       $numFiles++;
-                       # Remove any files that weren't touched, these may have been removed
-                       # from file-list, we should not compile them
-                       if ( $file->getMTime() < $startTime ) {
-                               if ( file_exists( $destPath ) ) {
-                                       unlink( $destPath );
-                                       # Files removed, regenerate the makefile
-                                       $regenerateMakefile = true;
-                               }
-                               unlink( $sourcePath );
-                               $numFilesChanged++;
-                               continue;
-                       }
-
-                       if ( file_exists( $destPath ) ) {
-                               $sourceHash = md5( file_get_contents( $sourcePath ) );
-                               $destHash = md5( file_get_contents( $destPath ) );
-                               if ( $sourceHash == $destHash ) {
-                                       continue;
-                               }
-                       } else {
-                               # New files added, regenerate the makefile
-                               $regenerateMakefile = true;
-                       }
-                       $numFilesChanged++;
-                       copy( $sourcePath, $destPath );
-               }
-
-               echo "MediaWiki: $numFilesChanged files changed out of $numFiles\n";
-
-               if ( !file_exists( "$persistentDir/CMakeLists.txt" ) ) {
-                       # Run cmake for the first time
-                       $regenerateMakefile = true;
-               }
-
-               # Do our own version of $HPHP_HOME/bin/run.sh, which isn't so broken.
-               # HipHop's RELEASE mode seems to be stuck always on, so symbols get
-               # stripped. Also we will try keeping the generated .o files instead of
-               # throwing away hours of CPU time every time you make a typo.
-
-               chdir( $persistentDir );
-
-               if ( $regenerateMakefile ) {
-                       copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt',
-                               "$persistentDir/CMakeLists.txt" );
-
-                       if ( file_exists( "$persistentDir/CMakeCache.txt" ) ) {
-                               unlink( "$persistentDir/CMakeCache.txt" );
-                       }
-
-                       $cmd = 'cmake' .
-                               " -D CMAKE_BUILD_TYPE:string=" . wfEscapeShellArg( $GLOBALS['wgHipHopBuildType'] ) .
-                               ' -D PROGRAM_NAME:string=mediawiki-hphp';
-
-                       if ( file_exists( '/usr/bin/ccache' ) ) {
-                               $cmd .= ' -D CMAKE_CXX_COMPILER:string=ccache' .
-                                       ' -D CMAKE_CXX_COMPILER_ARG1:string=' . wfEscapeShellArg( $cxx );
-                       }
-
-                       $cmd .= ' .';
-                       echo "$cmd\n";
-                       passthru( $cmd );
-               }
-
-               # Determine appropriate make concurrency
-               # Compilation can take a lot of memory, let's assume that that is limiting.
-               $procs = $this->getNumProcs();
-
-               # Run make. This is the slow step.
-               passthru( 'make -j' . wfEscapeShellArg( $procs ) );
-
-               $elapsed = time() - $startTime;
-
-               echo "Completed in ";
-               if ( $elapsed >= 3600 ) {
-                       $hours = floor( $elapsed / 3600 );
-                       echo $hours . 'h ';
-                       $elapsed -= $hours * 3600;
-               }
-               if ( $elapsed >= 60 ) {
-                       $minutes = floor( $elapsed / 60 );
-                       echo $minutes . 'm ';
-                       $elapsed -= $minutes * 60;
-               }
-               echo $elapsed . "s\n";
-               echo "The MediaWiki executable is at $buildDir/persistent/mediawiki-hphp\n";
-       }
-
-       function checkVolatileClasses( $dir ) {
-               $lines = file( "$dir/sys/dynamic_table_class.cpp" );
-               $classes = array();
-               foreach ( $lines as $line ) {
-                       if ( preg_match( '/^\s+\(const char \*\)"([^"]*)", \(const char \*\)-1/', $line, $m ) ) {
-                               $classes[] = $m[1];
-                       }
-               }
-               if ( !count( $classes ) ) {
-                       print "No volatile classes found\n";
-                       return;
-               }
-               sort( $classes );
-               $classes = array_unique( $classes );
-               print "WARNING: The following classes are volatile: " . implode( ', ', $classes ) . "\n";
-       }
-
-       function getNumProcs() {
-               global $wgHipHopCompilerProcs;
-               if ( $wgHipHopCompilerProcs !== 'detect' ) {
-                       return intval( $wgHipHopCompilerProcs );
-               }
-
-               if ( !file_exists( '/proc/meminfo' ) ) {
-                       return 1;
-               }
-               $mem = false;
-               foreach ( file( '/proc/meminfo' ) as $line ) {
-                       if ( preg_match( '/^MemTotal:\s+(\d+)\s+kB/', $line, $m ) ) {
-                               $mem = intval( $m[1] );
-                               break;
-                       }
-               }
-               if ( $mem ) {
-                       // At least one process
-                       return max( 1, floor( $mem / 1000000 ) );
-               } else {
-                       return 1;
-               }
-       }
-
-       function setupFakeSourceBase( $phase3, $extensions, $dest ) {
-               if ( !file_exists( $dest ) ) {
-                       mkdir( $dest, 0777, true );
-               }
-
-               $this->forceCreateLink( "$dest/phase3", $phase3 );
-               $this->forceCreateLink( "$dest/extensions", $extensions );
-       }
-
-       function forceCreateLink( $target, $link ) {
-               if ( file_exists( $target ) ) {
-                       if ( readlink( $target ) === $link ) {
-                               return;
-                       }
-                       unlink( $target );
-               }
-               symlink( $target, $link );
-       }
-
-       function getFileList() {
-               global $wgAutoloadClasses, $wgAutoloadLocalClasses, $wgCompiledFiles;
-               $inputFiles = array_merge(
-                       array_values( $wgAutoloadClasses ),
-                       array_values( $wgAutoloadLocalClasses ),
-                       $wgCompiledFiles
-               );
-               $processedFiles = array();
-               foreach ( $inputFiles as $file ) {
-                       if ( substr( $file, 0, 1 ) === '/' ) {
-                               $processedFiles[] = $this->absoluteToRelative( $file );
-                       } elseif ( preg_match( '/^extensions/', $file ) ) {
-                               $processedFiles[] = $file;
-                       } else {
-                               $processedFiles[] = "phase3/$file";
-                       }
-               }
-
-               $extraCoreFiles = array_map( 'trim', file( __DIR__ . '/extra-files' ) );
-               foreach ( $extraCoreFiles as $file ) {
-                       if ( $file === '' ) {
-                               continue;
-                       }
-                       $processedFiles[] = "phase3/$file";
-               }
-               return array_unique( $processedFiles );
-       }
-
-       function absoluteToRelative( $file ) {
-               global $IP;
-
-               $coreBase = realpath( $IP ) . '/';
-               $extBase = realpath( MWInit::getExtensionsDirectory() ) . '/';
-               $file = realpath( $file );
-
-               if ( substr( $file, 0, strlen( $extBase ) ) === $extBase ) {
-                       return 'extensions/' . substr( $file, strlen( $extBase ) );
-               } elseif ( substr( $file, 0, strlen( $coreBase ) ) === $coreBase ) {
-                       return 'phase3/' . substr( $file, strlen( $coreBase ) );
-               } else {
-                       $this->error( "The following file is registered for compilation but is not in \$IP or " .
-                               "\$wgExtensionsDirectory: $file \n" );
-                       exit( 1 );
-               }
-       }
-}
-
-$maintClass = 'MakeHipHop';
-require_once( RUN_MAINTENANCE_IF_MAIN );
old mode 100644 (file)
new mode 100755 (executable)
index 1adfe29..2d71b87
@@ -1,68 +1,21 @@
-#!/usr/bin/hphpi -f
+#!/usr/bin/hhvm -f
 <?php
 
-require( __DIR__ . '/../Maintenance.php' );
+require __DIR__ . '/../Maintenance.php';
 
 class RunHipHopServer extends Maintenance {
        function __construct() {
                parent::__construct();
-               $this->addOption( 'interpret', 'Run in interpreted mode' );
        }
 
        function execute() {
-               if ( $this->hasOption( 'interpret' ) ) {
-                       $this->runInterpreted();
-               } else {
-                       $this->runCompiled();
-               }
-       }
-
-       function runCompiled() {
-               global $wgHipHopBuildDirectory;
-               $thisDir = realpath( __DIR__ );
-               $IP = realpath( "$thisDir/../.." );
-               if ( strval( $wgHipHopBuildDirectory ) !== '' ) {
-                       $buildDir = $wgHipHopBuildDirectory;
-               } else {
-                       $buildDir = "$thisDir/build";
-               }
-
-               if ( file_exists( "$buildDir/source" ) ) {
-                       $sourceBase = "$buildDir/source";
-               } else {
-                       $sourceBase = realpath( "$IP/.." );
-               }
-
-               passthru(
-                       'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
-                       'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
-                       wfEscapeShellArg(
-                               "$buildDir/persistent/mediawiki-hphp",
-                               '-c', "$thisDir/server.conf",
-                               '-v', "Server.SourceRoot=$sourceBase",
-                               '-v', "Server.IncludeSearchPaths.0=$sourceBase",
-                               '-v', 'ServerVariables.MW_COMPILED=1',
-                               '--mode=server',
-                               '--port=8080'
-                       ),
-                       $ret
-               );
-               exit( $ret );
-       }
-
-       function runInterpreted() {
-               $thisDir = realpath( __DIR__ );
-               $IP = realpath( "$thisDir/../.." );
-               $sourceBase = realpath( "$IP/.." );
+               global $IP;
 
                passthru(
-                       'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
-                       'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
+                       'cd ' . wfEscapeShellArg( $IP ) . " && " .
                        wfEscapeShellArg(
-                               'hphpi',
-                               '-c', "$thisDir/server.conf",
-                               '-v', "Server.SourceRoot=$sourceBase",
-                               '-v', "Server.IncludeSearchPaths.0=$sourceBase",
+                               'hhvm',
+                               '-c', __DIR__."/server.conf",
                                '--mode=server',
                                '--port=8080'
                        ),
@@ -72,4 +25,4 @@ class RunHipHopServer extends Maintenance {
        }
 }
 $maintClass = 'RunHipHopServer';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 16af0f2..558bdad 100644 (file)
@@ -12,7 +12,7 @@ Debug {
 }
 Server {
        EnableStaticContentCache = false
-       EnableStaticContentFromDisk = false
+       EnableStaticContentFromDisk = true
        AlwaysUseRelativePath = true
 }
 VirtualHost {
@@ -22,7 +22,7 @@ VirtualHost {
                RewriteRules {
                        * {
                                pattern = ^/wiki/(.*)$
-                               to = /phase3/index.php?title=$1
+                               to = /index.php?title=$1
                                qsa = true
                        }
                }
index 904b624..1f47cf1 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that imports XML dump files into the current wiki.
@@ -34,16 +34,16 @@ require_once( __DIR__ . '/Maintenance.php' );
 class BackupReader extends Maintenance {
        public $reportingInterval = 100;
        public $pageCount = 0;
-       public $revCount  = 0;
-       public $dryRun    = false;
-       public $uploads   = false;
+       public $revCount = 0;
+       public $dryRun = false;
+       public $uploads = false;
        public $imageBasePath = false;
-       public $nsFilter  = false;
+       public $nsFilter = false;
 
        function __construct() {
                parent::__construct();
-               $gz = in_array('compress.zlib', stream_get_wrappers()) ? 'ok' : '(disabled; requires PHP zlib module)';
-               $bz2 = in_array('compress.bzip2', stream_get_wrappers()) ? 'ok' : '(disabled; requires PHP bzip2 module)';
+               $gz = in_array( 'compress.zlib', stream_get_wrappers() ) ? 'ok' : '(disabled; requires PHP zlib module)';
+               $bz2 = in_array( 'compress.bzip2', stream_get_wrappers() ) ? 'ok' : '(disabled; requires PHP bzip2 module)';
 
                $this->mDescription = <<<TEXT
 This script reads pages from an XML file as produced from Special:Export or
@@ -73,7 +73,7 @@ TEXT;
        }
 
        public function execute() {
-               if( wfReadOnly() ) {
+               if ( wfReadOnly() ) {
                        $this->error( "Wiki is in read-only mode; you'll need to disable it for import to work.", true );
                }
 
@@ -91,7 +91,7 @@ TEXT;
                        $this->setNsfilter( explode( '|', $this->getOption( 'namespaces' ) ) );
                }
 
-               if( $this->hasArg() ) {
+               if ( $this->hasArg() ) {
                        $this->importFromFile( $this->getArg() );
                } else {
                        $this->importFromStdin();
@@ -247,7 +247,7 @@ TEXT;
 
        function importFromStdin() {
                $file = fopen( 'php://stdin', 'rt' );
-               if( self::posix_isatty( $file ) ) {
+               if ( self::posix_isatty( $file ) ) {
                        $this->maybeHelp( true );
                }
                return $this->importFromHandle( $file );
@@ -259,14 +259,14 @@ TEXT;
                $source = new ImportStreamSource( $handle );
                $importer = new WikiImporter( $source );
 
-               if( $this->hasOption( 'debug' ) ) {
+               if ( $this->hasOption( 'debug' ) ) {
                        $importer->setDebug( true );
                }
                if ( $this->hasOption( 'no-updates' ) ) {
                        $importer->setNoUpdates( true );
                }
                $importer->setPageCallback( array( &$this, 'reportPage' ) );
-               $this->importCallback =  $importer->setRevisionCallback(
+               $this->importCallback = $importer->setRevisionCallback(
                        array( &$this, 'handleRevision' ) );
                $this->uploadCallback = $importer->setUploadCallback(
                        array( &$this, 'handleUpload' ) );
@@ -288,4 +288,4 @@ TEXT;
 }
 
 $maintClass = 'BackupReader';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2b3d551..5ae6d6b 100644 (file)
@@ -99,7 +99,9 @@ function findAuxFile( $file, $auxExtension, $maxStrip = 1 ) {
                }
 
                $idx = strrpos( $n, '.' );
-               if ( !$idx ) break;
+               if ( !$idx ) {
+                       break;
+               }
 
                $n = substr( $n, 0, $idx );
                $maxStrip -= 1;
index 782f502..cbbcf0f 100644 (file)
@@ -35,11 +35,11 @@ $optionsWithArgs = array(
        'extensions', 'comment', 'comment-file', 'comment-ext', 'summary', 'user',
        'license', 'sleep', 'limit', 'from', 'source-wiki-url', 'timestamp',
 );
-require_once( __DIR__ . '/commandLine.inc' );
-require_once( __DIR__ . '/importImages.inc' );
+require_once __DIR__ . '/commandLine.inc';
+require_once __DIR__ . '/importImages.inc';
 $processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
 
-echo( "Import Images\n\n" );
+echo "Import Images\n\n";
 
 # Need a path
 if ( count( $args ) == 0 ) {
@@ -104,15 +104,15 @@ if ( $limit ) {
 $timestamp = isset( $options['timestamp'] ) ? $options['timestamp'] : false;
 
 # Get the upload comment. Provide a default one in case there's no comment given.
-$comment = 'Importing image file';
+$comment = 'Importing file';
 
 if ( isset( $options['comment-file'] ) ) {
-       $comment =  file_get_contents( $options['comment-file'] );
+       $comment = file_get_contents( $options['comment-file'] );
        if ( $comment === false || $comment === null ) {
                die( "failed to read comment file: {$options['comment-file']}\n" );
        }
 } elseif ( isset( $options['comment'] ) ) {
-       $comment =  $options['comment'];
+       $comment = $options['comment'];
 }
 
 $commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
@@ -132,7 +132,7 @@ if ( $count > 0 ) {
                # Validate a title
                $title = Title::makeTitleSafe( NS_FILE, $base );
                if ( !is_object( $title ) ) {
-                       echo( "{$base} could not be imported; a valid title cannot be produced\n" );
+                       echo "{$base} could not be imported; a valid title cannot be produced\n";
                        continue;
                }
 
@@ -148,7 +148,7 @@ if ( $count > 0 ) {
                if ( $checkUserBlock && ( ( $processed % $checkUserBlock ) == 0 ) ) {
                        $user->clearInstanceCache( 'name' ); // reload from DB!
                        if ( $user->isBlocked() ) {
-                               echo( $user->getName() . " was blocked! Aborting.\n" );
+                               echo $user->getName() . " was blocked! Aborting.\n";
                                break;
                        }
                }
@@ -157,10 +157,10 @@ if ( $count > 0 ) {
                $image = wfLocalFile( $title );
                if ( $image->exists() ) {
                        if ( isset( $options['overwrite'] ) ) {
-                               echo( "{$base} exists, overwriting..." );
+                               echo "{$base} exists, overwriting...";
                                $svar = 'overwritten';
                        } else {
-                               echo( "{$base} exists, skipping\n" );
+                               echo "{$base} exists, skipping\n";
                                $skipped++;
                                continue;
                        }
@@ -172,23 +172,24 @@ if ( $count > 0 ) {
                                $dupes = $repo->findBySha1( $sha1 );
 
                                if ( $dupes ) {
-                                       echo( "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n" );
+                                       echo "{$base} already exists as " . $dupes[0]->getName() . ", skipping\n";
                                        $skipped++;
                                        continue;
                                }
                        }
 
-                       echo( "Importing {$base}..." );
+                       echo "Importing {$base}...";
                        $svar = 'added';
                }
 
                if ( isset( $options['source-wiki-url'] ) ) {
                        /* find comment text directly from source wiki, through MW's API */
                        $real_comment = getFileCommentFromSourceWiki( $options['source-wiki-url'], $base );
-                       if ( $real_comment === false )
+                       if ( $real_comment === false ) {
                                $commentText = $comment;
-                       else
+                       } else {
                                $commentText = $real_comment;
+                       }
 
                        /* find user directly from source wiki, through MW's API */
                        $real_user = getFileUserFromSourceWiki( $options['source-wiki-url'], $base );
@@ -198,7 +199,7 @@ if ( $count > 0 ) {
                                $wgUser = User::newFromName( $real_user );
                                if ( $wgUser === false ) {
                                        # user does not exist in target wiki
-                                       echo ( "failed: user '$real_user' does not exist in target wiki." );
+                                       echo "failed: user '$real_user' does not exist in target wiki.";
                                        continue;
                                }
                        }
@@ -209,11 +210,11 @@ if ( $count > 0 ) {
                        if ( $commentExt ) {
                                $f = findAuxFile( $file, $commentExt );
                                if ( !$f ) {
-                                       echo( " No comment file with extension {$commentExt} found for {$file}, using default comment. " );
+                                       echo " No comment file with extension {$commentExt} found for {$file}, using default comment. ";
                                } else {
                                        $commentText = file_get_contents( $f );
                                        if ( !$commentText ) {
-                                               echo( " Failed to load comment file {$f}, using default comment. " );
+                                               echo " Failed to load comment file {$f}, using default comment. ";
                                        }
                                }
                        }
@@ -225,13 +226,22 @@ if ( $count > 0 ) {
 
                # Import the file
                if ( isset( $options['dry'] ) ) {
-                       echo( " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... " );
+                       echo " publishing {$file} by '" . $wgUser->getName() . "', comment '$commentText'... ";
                } else {
-                       $archive = $image->publish( $file );
+                       $props = FSFile::getPropsFromPath( $file );
+                       $flags = 0;
+                       $options = array();
+                       $handler = MediaHandler::getHandler( $props['mime'] );
+                       if ( $handler ) {
+                               $options['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+                       } else {
+                               $options['headers'] = array();
+                       }
+                       $archive = $image->publish( $file, $flags, $options );
                        if ( !$archive->isGood() ) {
-                               echo( "failed. (" .
+                               echo "failed. (" .
                                        $archive->getWikiText() .
-                                       ")\n" );
+                                       ")\n";
                                $failed++;
                                continue;
                        }
@@ -243,10 +253,10 @@ if ( $count > 0 ) {
                }
 
                if ( isset( $options['dry'] ) ) {
-                       echo( "done.\n" );
-               } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, false, $timestamp ) ) {
+                       echo "done.\n";
+               } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, $props, $timestamp ) ) {
                        # We're done!
-                       echo( "done.\n" );
+                       echo "done.\n";
 
                        $doProtect = false;
 
@@ -269,21 +279,21 @@ if ( $count > 0 ) {
                                        sleep( 2.0 ); # Why this sleep?
                                        wfWaitForSlaves();
 
-                                       echo( "\nSetting image restrictions ... " );
+                                       echo "\nSetting image restrictions ... ";
 
                                        $cascade = false;
                                        $restrictions = array();
-                                       foreach( $title->getRestrictionTypes() as $type ) {
+                                       foreach ( $title->getRestrictionTypes() as $type ) {
                                                $restrictions[$type] = $protectLevel;
                                        }
 
                                        $page = WikiPage::factory( $title );
                                        $status = $page->doUpdateRestrictions( $restrictions, array(), $cascade, '', $user );
-                                       echo( ( $status->isOK() ? 'done' : 'failed' ) . "\n" );
+                                       echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
                        }
 
                } else {
-                       echo( "failed. (at recordUpload stage)\n" );
+                       echo "failed. (at recordUpload stage)\n";
                        $svar = 'failed';
                }
 
@@ -300,23 +310,24 @@ if ( $count > 0 ) {
        }
 
        # Print out some statistics
-       echo( "\n" );
+       echo "\n";
        foreach ( array( 'count' => 'Found', 'limit' => 'Limit', 'ignored' => 'Ignored',
                'added' => 'Added', 'skipped' => 'Skipped', 'overwritten' => 'Overwritten',
                'failed' => 'Failed' ) as $var => $desc ) {
-               if ( $$var > 0 )
-                       echo( "{$desc}: {$$var}\n" );
+               if ( $$var > 0 ) {
+                       echo "{$desc}: {$$var}\n";
+               }
        }
 
 } else {
-       echo( "No suitable files could be found for import.\n" );
+       echo "No suitable files could be found for import.\n";
 }
 
 exit( 0 );
 
 function showUsage( $reason = false ) {
        if ( $reason ) {
-               echo( $reason . "\n" );
+               echo $reason . "\n";
        }
 
        echo <<<TEXT
@@ -336,7 +347,7 @@ Options:
 --sleep=<sec>           Sleep between files. Useful mostly for debugging.
 --user=<username>       Set username of uploader, default 'Maintenance script'
 --check-userblock       Check if the user got blocked during import.
---comment=<text>        Set file description, default 'Importing image file'.
+--comment=<text>        Set file description, default 'Importing file'.
 --comment-file=<file>   Set description to the content of <file>.
 --comment-ext=<ext>     Causes the description for each file to be loaded from a file with the same name
                         but the extension <ext>. If a global description is also given, it is appended.
index fabc6dc..fd768b3 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to import all scripts in the MediaWiki namespace from a
@@ -105,4 +105,4 @@ class ImportSiteScripts extends Maintenance {
 }
 
 $maintClass = 'ImportSiteScripts';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index c04989c..e081c20 100644 (file)
 
 $options = array( 'help', 'nooverwrite', 'norc' );
 $optionsWithArgs = array( 'title', 'user', 'comment' );
-require_once( __DIR__ . '/commandLine.inc' );
-echo( "Import Text File\n\n" );
+require_once __DIR__ . '/commandLine.inc';
+echo "Import Text File\n\n";
 
 if ( count( $args ) < 1 || isset( $options['help'] ) ) {
        showHelp();
 } else {
 
        $filename = $args[0];
-       echo( "Using {$filename}..." );
+       echo "Using {$filename}...";
        if ( is_file( $filename ) ) {
 
                $title = isset( $options['title'] ) ? $options['title'] : titleFromFilename( $filename );
@@ -40,7 +40,7 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
 
                if ( is_object( $title ) ) {
 
-                       echo( "\nUsing title '" . $title->getPrefixedText() . "'..." );
+                       echo "\nUsing title '" . $title->getPrefixedText() . "'...";
                        if ( !$title->exists() || !isset( $options['nooverwrite'] ) ) {
 
                                $text = file_get_contents( $filename );
@@ -49,31 +49,31 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
 
                                if ( is_object( $user ) ) {
 
-                                       echo( "\nUsing username '" . $user->getName() . "'..." );
+                                       echo "\nUsing username '" . $user->getName() . "'...";
                                        $wgUser =& $user;
                                        $comment = isset( $options['comment'] ) ? $options['comment'] : 'Importing text file';
                                        $flags = 0 | ( isset( $options['norc'] ) ? EDIT_SUPPRESS_RC : 0 );
 
-                                       echo( "\nPerforming edit..." );
+                                       echo "\nPerforming edit...";
                                        $page = WikiPage::factory( $title );
                                        $content = ContentHandler::makeContent( $text, $title );
                                        $page->doEditContent( $content, $comment, $flags, false, $user );
-                                       echo( "done.\n" );
+                                       echo "done.\n";
 
                                } else {
-                                       echo( "invalid username.\n" );
+                                       echo "invalid username.\n";
                                }
 
                        } else {
-                               echo( "page exists.\n" );
+                               echo "page exists.\n";
                        }
 
                } else {
-                       echo( "invalid title.\n" );
+                       echo "invalid title.\n";
                }
 
        } else {
-               echo( "does not exist.\n" );
+               echo "does not exist.\n";
        }
 
 }
index 3135b4c..4b04683 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 class InitEditCount extends Maintenance {
        public function __construct() {
@@ -107,4 +107,4 @@ in the load balancer, usually indicating a replication environment.' );
 }
 
 $maintClass = "InitEditCount";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1990659..92268b3 100644 (file)
@@ -23,7 +23,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to re-initialise or update the site statistics table
@@ -48,7 +48,7 @@ class InitSiteStats extends Maintenance {
                $edits = $counter->edits();
                $this->output( "{$edits}\nCounting number of articles..." );
 
-               $good  = $counter->articles();
+               $good = $counter->articles();
                $this->output( "{$good}\nCounting total pages..." );
 
                $pages = $counter->pages();
@@ -85,4 +85,4 @@ class InitSiteStats extends Maintenance {
 }
 
 $maintClass = "InitSiteStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 935a296..d118747 100644 (file)
  */
 
 if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
-       require_once( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+       require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
        wfPHPVersionError( 'cli' );
 }
 
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
-require_once( dirname( __DIR__ )."/maintenance/Maintenance.php" );
+require_once dirname( __DIR__ ) . "/maintenance/Maintenance.php";
 
 /**
  * Maintenance script to install and configure MediaWiki
@@ -41,7 +41,7 @@ class CommandLineInstaller extends Maintenance {
                parent::__construct();
                global $IP;
 
-               $this->addArg( 'name', 'The name of the wiki', true);
+               $this->addArg( 'name', 'The name of the wiki', true );
 
                $this->addArg( 'admin', 'The username of the wiki administrator (WikiSysop)', true );
                $this->addOption( 'pass', 'The password for the wiki administrator.', false, true );
@@ -109,13 +109,13 @@ class CommandLineInstaller extends Maintenance {
                        InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
 
                $status = $installer->doEnvironmentChecks();
-               if( $status->isGood() ) {
+               if ( $status->isGood() ) {
                        $installer->showMessage( 'config-env-good' );
                } else {
                        $installer->showStatusMessage( $status );
                        return;
                }
-               if( !$this->hasOption( 'env-checks' ) ) {
+               if ( !$this->hasOption( 'env-checks' ) ) {
                        $installer->execute();
                        $installer->writeConfigurationFile( $this->getOption( 'confpath', $IP ) );
                }
@@ -130,4 +130,4 @@ class CommandLineInstaller extends Maintenance {
 
 $maintClass = "CommandLineInstaller";
 
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 84e4021..83cc088 100644 (file)
@@ -3,6 +3,22 @@
 # - https://github.com/senchalabs/jsduck/wiki/Custom-tags
 require 'jsduck/meta_tag'
 
+class SourceTag < JsDuck::MetaTag
+  def initialize
+    # This defines the name of the @tag
+    @name = 'source'
+  end
+
+  # Generate HTML output for this tag.
+  # One can make use of the #format method to easily support
+  # Markdown and {@link} tags inside the contents of the tag.
+  #
+  # @param tags All matches of this tag on one class.
+  def to_html(tags)
+    '<h3 class="pa">Source</h3>' + tags.map {|tag| format(tag) }.join("\n")
+  end
+end
+
 class ContextTag < JsDuck::MetaTag
   def initialize
     @name = 'context'
index 4a8ba8c..68e1fb2 100644 (file)
@@ -9,9 +9,11 @@
                                        "mw.Map",
                                        "mw.Message",
                                        "mw.loader",
+                                       "mw.log",
                                        "mw.html",
                                        "mw.html.Cdata",
-                                       "mw.html.Raw"
+                                       "mw.html.Raw",
+                                       "mw.hook"
                                ]
                        },
                        {
@@ -20,7 +22,7 @@
                                        "mw.Title",
                                        "mw.notification",
                                        "mw.util",
-                                       "mw.plugin.notify"
+                                       "mw.plugin.*"
                                ]
                        },
                        {
        {
                "name": "jQuery",
                "groups": [
-                       {
-                               "name": "Core",
-                               "classes": ["jQuery", "jQuery.Event", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR"]
-                       },
                        {
                                "name": "Plugins",
                                "classes": ["jQuery.plugin.*"]
                ]
        },
        {
-               "name": "Misc",
+               "name": "Upstream",
                "groups": [
                        {
-                               "name": "Native",
+                               "name": "jQuery",
+                               "classes": ["jQuery", "jQuery.Event", "jQuery.Callbacks", "jQuery.Promise", "jQuery.Deferred", "jQuery.jqXHR", "QUnit"]
+                       },
+                       {
+                               "name": "JavaScript",
                                "classes": ["Array", "Boolean", "Date", "Function", "Number", "Object", "RegExp", "String"]
                        }
                ]
index c4705d8..4ad75f0 100644 (file)
@@ -1,5 +1,6 @@
 {
-       "--title": "MediaWiki Code Documentation",
+       "--title": "MediaWiki core - Documentation",
+       "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
        "--categories": "./categories.json",
        "--meta-tags": "./MetaTags.rb",
        "--warnings": ["-no_doc"],
@@ -8,6 +9,7 @@
        "--": [
                "./external.js",
                "../../resources/mediawiki/mediawiki.js",
+               "../../resources/mediawiki/mediawiki.log.js",
                "../../resources/mediawiki/mediawiki.util.js",
                "../../resources/mediawiki/mediawiki.Title.js",
                "../../resources/mediawiki/mediawiki.notify.js",
@@ -15,4 +17,4 @@
                "../../resources/mediawiki.api",
                "../../resources/jquery/jquery.localize.js"
        ]
-}
\ No newline at end of file
+}
index 8ab102f..7910ec8 100644 (file)
@@ -1,26 +1,43 @@
 /**
  * @class jQuery
+ * @source <http://api.jquery.com/>
  */
 
 /**
  * @method ajax
+ * @source <http://api.jquery.com/jQuery.ajax/>
  * @return {jqXHR}
  */
 
 /**
  * @class jQuery.Event
+ * @source <http://api.jquery.com/Types/#Event>
+ */
+
+/**
+ * @class jQuery.Callbacks
+ * @source <http://api.jquery.com/jQuery.Callbacks/>
  */
 
 /**
  * @class jQuery.Promise
+ * @source <http://api.jquery.com/Types/#Promise>
  */
 
 /**
  * @class jQuery.Deferred
  * @mixins jQuery.Promise
+ * @source <http://api.jquery.com/jQuery.Deferred/>
  */
 
 /**
  * @class jQuery.jqXHR
+ * @source <http://api.jquery.com/Types/#jqXHR>
  * @alternateClassName jqXHR
  */
+
+
+/**
+ * @class QUnit
+ * @source <http://api.qunitjs.com/>
+ */
index 1a2e121..3f0a9ba 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to do test JavaScript validity parses using jsmin+'s parser
@@ -50,7 +50,7 @@ class JSParseHelper extends Maintenance {
                        wfSuppressWarnings();
                        $js = file_get_contents( $filename );
                        wfRestoreWarnings();
-                       if ($js === false) {
+                       if ( $js === false ) {
                                $this->output( "$filename ERROR: could not read file\n" );
                                $this->errs++;
                                continue;
@@ -58,7 +58,7 @@ class JSParseHelper extends Maintenance {
 
                        try {
                                $parser->parse( $js, $filename, 1 );
-                       } catch (Exception $e) {
+                       } catch ( Exception $e ) {
                                $this->errs++;
                                $this->output( "$filename ERROR: " . $e->getMessage() . "\n" );
                                continue;
@@ -67,11 +67,11 @@ class JSParseHelper extends Maintenance {
                        $this->output( "$filename OK\n" );
                }
 
-               if ($this->errs > 0) {
-                       exit(1);
+               if ( $this->errs > 0 ) {
+                       exit( 1 );
                }
        }
 }
 
 $maintClass = "JSParseHelper";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 3df1169..410bf75 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to show database lag.
@@ -68,4 +68,4 @@ class DatabaseLag extends Maintenance {
 }
 
 $maintClass = "DatabaseLag";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 20fb477..e9d8c86 100644 (file)
@@ -1,5 +1,7 @@
 <?php
-if ( !defined( 'MEDIAWIKI' ) ) die();
+if ( !defined( 'MEDIAWIKI' ) ) {
+       die();
+}
 /**
  * Statistic output classes.
  *
@@ -52,9 +54,9 @@ class wikiStatsOutput extends statsOutput {
                echo "'''Note:''' These statistics can be generated by running <code>php maintenance/language/transstat.php</code>.\n\n";
                echo "For additional information on specific languages (the message names, the actual problems, etc.), run <code>php maintenance/language/checkLanguage.php --lang=foo</code>.\n\n";
                echo 'English (en) is excluded because it is the default localization';
-               if( is_array( $wgDummyLanguageCodes ) ) {
+               if ( is_array( $wgDummyLanguageCodes ) ) {
                        $dummyCodes = array();
-                       foreach( $wgDummyLanguageCodes as $dummyCode => $correctCode ) {
+                       foreach ( $wgDummyLanguageCodes as $dummyCode => $correctCode ) {
                                $dummyCodes[] = Language::fetchLanguageName( $dummyCode ) . ' (' . $dummyCode . ')';
                        }
                        echo ', as well as the following languages that are not intended for system message translations, usually because they redirect to other language codes: ' . implode( ', ', $dummyCodes );
@@ -80,7 +82,9 @@ class wikiStatsOutput extends statsOutput {
                        # Weigh reverse with factor 20 so coloring takes effect more quickly as
                        # this option is used solely for reporting 'bad' percentages.
                        $v = $v * 20;
-                       if ( $v > 255 ) $v = 255;
+                       if ( $v > 255 ) {
+                               $v = 255;
+                       }
                        $v = 255 - $v;
                }
                if ( $v < 128 ) {
index 8caf867..d0e6e84 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that gets all messages as defined by the
@@ -44,4 +44,4 @@ class AllTrans extends Maintenance {
 }
 
 $maintClass = "AllTrans";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 6abf7b4..ac9d8cb 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../commandLine.inc' );
+require_once __DIR__ . '/../commandLine.inc';
 $messagesDir = __DIR__ . '/../../languages/messages/';
 $runTest = false;
 $run = false;
@@ -80,35 +80,37 @@ if ( $run ) {
        } elseif ( !strcmp( $runMode, 'raw' ) ) {
                $runMode = 'raw';
        }
-       include( $messagesFile );
+       include $messagesFile;
        $messageExist = isset( $messages );
-       if ( $messageExist )
+       if ( $messageExist ) {
                $wgMessages[$langCode] = $messages;
-       include( $messagesFileC );
+       }
+       include $messagesFileC;
        $messageCExist = isset( $messages );
-       if ( $messageCExist )
+       if ( $messageCExist ) {
                $wgMessages[$langCodeC] = $messages;
+       }
        $count = 0;
 
        if ( ( $messageExist ) && ( $messageCExist ) ) {
 
                if ( !strcmp( $runMode, 'php' ) ) {
-                       print( "<?php\n" );
-                       print( '$dupeMessages = array(' . "\n" );
+                       print "<?php\n";
+                       print '$dupeMessages = array(' . "\n";
                }
                foreach ( $wgMessages[$langCodeC] as $key => $value ) {
                        foreach ( $wgMessages[$langCode] as $ckey => $cvalue ) {
                                if ( !strcmp( $key, $ckey ) ) {
                                        if ( ( !strcmp( $key, $ckey ) ) && ( !strcmp( $value, $cvalue ) ) ) {
                                                if ( !strcmp( $runMode, 'raw' ) ) {
-                                                       print( "$key\n" );
+                                                       print "$key\n";
                                                } elseif ( !strcmp( $runMode, 'php' ) ) {
-                                                       print( "'$key' => '',\n" );
+                                                       print "'$key' => '',\n";
                                                } elseif ( !strcmp( $runMode, 'wiki' ) ) {
                                                        $uKey = ucfirst( $key );
-                                                       print( "* MediaWiki:$uKey/$langCode\n" );
+                                                       print "* MediaWiki:$uKey/$langCode\n";
                                                } else {
-                                                       print( "* $key\n" );
+                                                       print "* $key\n";
                                                }
                                                $count++;
                                        }
@@ -116,7 +118,7 @@ if ( $run ) {
                        }
                }
                if ( !strcmp( $runMode, 'php' ) ) {
-                       print( ");\n" );
+                       print ");\n";
                }
                if ( !strcmp( $runMode, 'text' ) ) {
                        if ( $count == 1 ) {
@@ -126,9 +128,11 @@ if ( $run ) {
                        }
                }
        } else {
-               if ( !$messageExist )
+               if ( !$messageExist ) {
                        echo "There are no messages defined in $langCode.\n";
-               if ( !$messageCExist )
+               }
+               if ( !$messageCExist ) {
                        echo "There are no messages defined in $langCodeC.\n";
+               }
        }
 }
index ebc62b6..79a4dd9 100644 (file)
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'languages.inc' );
-require_once( 'checkLanguage.inc' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'languages.inc';
+require_once 'checkLanguage.inc';
 
 if ( !class_exists( 'MessageGroups' ) || !class_exists( 'PremadeMediawikiExtensionGroups' ) ) {
        echo <<<TEXT
 Please add the Translate extension to LocalSettings.php, and enable the extension groups:
-       require_once( 'extensions/Translate/Translate.php' );
+       require_once 'extensions/Translate/Translate.php';
        \$wgTranslateEC = array_keys( \$wgTranslateAC );
 If you still get this message, update Translate to its latest version.
 
index 1860f4a..59b6fcd 100644 (file)
@@ -25,7 +25,7 @@
  * @ingroup MaintenanceLanguage
  */
 class CheckLanguageCLI {
-       protected $code  = null;
+       protected $code = null;
        protected $level = 2;
        protected $doLinks = false;
        protected $linksPrefix = '';
@@ -46,7 +46,7 @@ class CheckLanguageCLI {
        public function __construct( array $options ) {
                if ( isset( $options['help'] ) ) {
                        echo $this->help();
-                       exit(1);
+                       exit( 1 );
                }
 
                if ( isset( $options['lang'] ) ) {
@@ -222,7 +222,7 @@ Parameters:
        --links: Link the message values (default off).
        --prefix: prefix to add to links.
        --wikilang: For the links, what is the content language of the wiki to display the output in (default en).
-       --noexif: Do not check for EXIF messages (a bit hard and boring to translate), if you know
+       --noexif: Do not check for Exif messages (a bit hard and boring to translate), if you know
                that they are currently not translated and want to focus on other problems (default off).
        --whitelist: Do only the following checks (form: code,code).
        --blacklist: Do not do the following checks (form: code,code).
@@ -384,7 +384,7 @@ ENDS;
                                                echo "[messages are hidden]\n";
                                        } else {
                                                foreach ( $messages as $key => $value ) {
-                                                       if( !in_array( $check, $this->nonMessageChecks() ) ) {
+                                                       if ( !in_array( $check, $this->nonMessageChecks() ) ) {
                                                                $key = $this->formatKey( $key, $code );
                                                        }
                                                        if ( $this->level == 2 || empty( $value ) ) {
@@ -411,7 +411,7 @@ ENDS;
                        $problems = 0;
                        $detailTextForLangChecks = array();
                        foreach ( $results as $check => $messages ) {
-                               if( in_array( $check, $this->nonMessageChecks() ) ) {
+                               if ( in_array( $check, $this->nonMessageChecks() ) ) {
                                        continue;
                                }
                                $count = count( $messages );
@@ -463,9 +463,9 @@ EOL;
         * @return bool True if there are any results, false if not.
         */
        protected function isEmpty() {
-               foreach( $this->results as $results ) {
-                       foreach( $results as $messages ) {
-                               if( !empty( $messages ) ) {
+               foreach ( $this->results as $results ) {
+                       foreach ( $results as $messages ) {
+                               if ( !empty( $messages ) ) {
                                        return false;
                                }
                        }
@@ -488,7 +488,7 @@ class CheckExtensionsCLI extends CheckLanguageCLI {
        public function __construct( array $options, $extension ) {
                if ( isset( $options['help'] ) ) {
                        echo $this->help();
-                       exit(1);
+                       exit( 1 );
                }
 
                if ( isset( $options['lang'] ) ) {
@@ -645,16 +645,16 @@ ENDS;
         * @throws MWException
         */
        protected function checkLanguage( $code ) {
-               foreach( $this->extensions as $extension ) {
+               foreach ( $this->extensions as $extension ) {
                        $this->L = $extension;
                        $this->results = array();
                        $this->results[$code] = parent::checkLanguage( $code );
 
-                       if( !$this->isEmpty() ) {
+                       if ( !$this->isEmpty() ) {
                                echo $extension->name() . ":\n";
 
-                               if( $this->level > 0 ) {
-                                       switch( $this->output ) {
+                               if ( $this->level > 0 ) {
+                                       switch ( $this->output ) {
                                                case 'plain':
                                                        $this->outputText();
                                                        break;
index 99ba4e9..ec6e122 100644 (file)
@@ -21,9 +21,9 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'checkLanguage.inc' );
-require_once( 'languages.inc' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'checkLanguage.inc';
+require_once 'languages.inc';
 
 $cli = new CheckLanguageCLI( $options );
 
index 5058a54..95a7154 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that counts how many messages we have defined
@@ -59,7 +59,7 @@ class CountMessages extends Maintenance {
 
        private function getNumMessages( $file ) {
                // Separate function to limit scope
-               require( $file );
+               require $file;
                if ( isset( $messages ) ) {
                        return count( $messages );
                } else {
@@ -69,4 +69,4 @@ class CountMessages extends Maintenance {
 }
 
 $maintClass = "CountMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ed12b78..1463418 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that tests various language time and date functions.
@@ -79,4 +79,4 @@ class DateFormats extends Maintenance {
 }
 
 $maintClass = "DateFormats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 9d4cbe7..a6e0456 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that check digit transformation.
@@ -49,7 +49,7 @@ class Digit2Html extends Maintenance {
                        $filename = Language::getMessagesFileName( $code );
                        $this->output( "Loading language [$code] ... " );
                        unset( $digitTransformTable );
-                       require_once( $filename );
+                       require_once $filename;
                        if ( !isset( $digitTransformTable ) ) {
                                $this->error( "\$digitTransformTable not found for lang: $code" );
                                continue;
@@ -66,4 +66,4 @@ class Digit2Html extends Maintenance {
 }
 
 $maintClass = "Digit2Html";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 0292d31..a72e25b 100644 (file)
@@ -23,7 +23,7 @@
  * @todo Make this more useful, right now just dumps $wgContLang
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that dumps an entire language, using the keys from English.
@@ -49,4 +49,4 @@ class DumpMessages extends Maintenance {
 }
 
 $maintClass = "DumpMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 12823c0..fcf2c96 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ .'/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generate first letter data files for Collation.php
@@ -102,7 +102,7 @@ class GenerateCollationData extends Maintenance {
                                $error .= "You are using outdated version of ICU ($icuVersion), intended for "
                                        . ( $unicodeVersion ? "Unicode $unicodeVersion" : "an unknown version of Unicode" )
                                        . "; this file might not be avalaible for it, and it's not supported by MediaWiki. "
-                                       ." You are on your own; consider upgrading PHP's intl extension or try "
+                                       . " You are on your own; consider upgrading PHP's intl extension or try "
                                        . "one of the files available at:";
                        } elseif ( version_compare( $icuVersion, "51.0", ">=" ) ) {
                                // Extra recent version
@@ -386,7 +386,7 @@ class UcdXmlReader {
                $this->xml = new XMLReader;
                $this->xml->open( $this->fileName );
                if ( !$this->xml ) {
-                       throw new MWException( __METHOD__.": unable to open {$this->fileName}" );
+                       throw new MWException( __METHOD__ . ": unable to open {$this->fileName}" );
                }
                while ( $this->xml->name !== 'ucd' && $this->xml->read() );
                $this->xml->read();
@@ -466,4 +466,4 @@ class UcdXmlReader {
 }
 
 $maintClass = 'GenerateCollationData';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index c03162c..216445e 100644 (file)
@@ -21,9 +21,9 @@
  * @ingroup MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
+require_once __DIR__ . '/../../includes/normal/UtfNormalUtil.php';
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Generates normalizer data files for Arabic and Malayalam.
@@ -156,4 +156,4 @@ class GenerateNormalizerData extends Maintenance {
 }
 
 $maintClass = 'GenerateNormalizerData';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ad29efb..14485f9 100644 (file)
@@ -22,8 +22,8 @@
  */
 
 /** This is a command line script */
-require_once( __DIR__ . '/../Maintenance.php' );
-require_once( __DIR__ . '/languages.inc' );
+require_once __DIR__ . '/../Maintenance.php';
+require_once __DIR__ . '/languages.inc';
 
 /**
  * Maintenance script that tries to get the memory usage for each language file.
@@ -39,8 +39,9 @@ class LangMemUsage extends Maintenance {
        }
 
        public function execute() {
-               if ( !function_exists( 'memory_get_usage' ) )
+               if ( !function_exists( 'memory_get_usage' ) ) {
                        $this->error( "You must compile PHP with --enable-memory-limit", true );
+               }
 
                $langtool = new languages();
                $memlast = $memstart = memory_get_usage();
@@ -61,4 +62,4 @@ class LangMemUsage extends Maintenance {
 }
 
 $maintClass = "LangMemUsage";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index dcd9b9b..6070f4a 100644 (file)
@@ -43,10 +43,10 @@ class languages {
         * Load the list of languages: all the Messages*.php
         * files in the languages directory.
         *
-        * @param $exif bool Treat the EXIF messages?
+        * @param $exif bool Treat the Exif messages?
         */
        function __construct( $exif = true ) {
-               require( __DIR__ . '/messageTypes.inc' );
+               require __DIR__ . '/messageTypes.inc';
                $this->mIgnoredMessages = $wgIgnoredMessages;
                if ( $exif ) {
                        $this->mOptionalMessages = array_merge( $wgOptionalMessages );
@@ -107,7 +107,7 @@ class languages {
                $this->mSpecialPageAliases[$code] = array();
                $filename = Language::getMessagesFileName( $code );
                if ( file_exists( $filename ) ) {
-                       require( $filename );
+                       require $filename;
                        if ( isset( $messages ) ) {
                                $this->mRawMessages[$code] = $messages;
                        }
@@ -154,7 +154,7 @@ class languages {
                        if ( isset( $this->mGeneralMessages['required'][$key] ) ) {
                                $this->mMessages[$code]['required'][$key] = $value;
                                $this->mMessages[$code]['translated'][$key] = $value;
-                       } else if ( isset( $this->mGeneralMessages['optional'][$key] ) ) {
+                       } elseif ( isset( $this->mGeneralMessages['optional'][$key] ) ) {
                                $this->mMessages[$code]['optional'][$key] = $value;
                                $this->mMessages[$code]['translated'][$key] = $value;
                        } else {
@@ -184,7 +184,7 @@ class languages {
                foreach ( $this->mGeneralMessages['all'] as $key => $value ) {
                        if ( in_array( $key, $this->mIgnoredMessages ) ) {
                                $this->mGeneralMessages['ignored'][$key] = $value;
-                       } else if ( in_array( $key, $this->mOptionalMessages ) ) {
+                       } elseif ( in_array( $key, $this->mOptionalMessages ) ) {
                                $this->mGeneralMessages['optional'][$key] = $value;
                                $this->mGeneralMessages['translatable'][$key] = $value;
                        } else {
@@ -466,11 +466,11 @@ class languages {
                        '[POP]' => "\xE2\x80\xAC",
                        '[LRO]' => "\xE2\x80\xAD",
                        '[RLO]' => "\xE2\x80\xAB",
-                       '[ZWSP]'=> "\xE2\x80\x8B",
-                       '[NBSP]'=> "\xC2\xA0",
-                       '[WJ]'  => "\xE2\x81\xA0",
+                       '[ZWSP]' => "\xE2\x80\x8B",
+                       '[NBSP]' => "\xC2\xA0",
+                       '[WJ]' => "\xE2\x81\xA0",
                        '[BOM]' => "\xEF\xBB\xBF",
-                       '[FFFD]'=> "\xEF\xBF\xBD",
+                       '[FFFD]' => "\xEF\xBF\xBD",
                );
                $wrongRegExp = '/(' . implode( '|', array_values( $wrongChars ) ) . ')/sDu';
                $wrongCharsMessages = array();
@@ -500,8 +500,8 @@ class languages {
                foreach ( $this->mMessages[$code]['translated'] as $key => $value ) {
                        $matches = array();
                        preg_match_all( "/\[\[([{$tc}]+)(?:\\|(.+?))?]]/sDu", $value, $matches );
-                       for ($i = 0; $i < count($matches[0]); $i++ ) {
-                               if ( preg_match( "/.*project.*/isDu",  $matches[1][$i] ) ) {
+                       for ( $i = 0; $i < count( $matches[0] ); $i++ ) {
+                               if ( preg_match( "/.*project.*/isDu", $matches[1][$i] ) ) {
                                        $messages[$key][] = $matches[0][$i];
                                }
                        }
@@ -563,7 +563,9 @@ class languages {
                $this->loadFile( 'en' );
                $this->loadFile( $code );
                $namespacesDiff = array_diff_key( $this->mNamespaceNames['en'], $this->mNamespaceNames[$code] );
-               if ( isset( $namespacesDiff[NS_MAIN] ) ) unset( $namespacesDiff[NS_MAIN] );
+               if ( isset( $namespacesDiff[NS_MAIN] ) ) {
+                       unset( $namespacesDiff[NS_MAIN] );
+               }
                return $namespacesDiff;
        }
 
@@ -579,7 +581,7 @@ class languages {
                $namespaces = array();
 
                # Check default namespace name
-               if( isset( $this->mNamespaceNames[$code][NS_PROJECT_TALK] ) ) {
+               if ( isset( $this->mNamespaceNames[$code][NS_PROJECT_TALK] ) ) {
                        $default = $this->mNamespaceNames[$code][NS_PROJECT_TALK];
                        if ( strpos( $default, '$1' ) === false ) {
                                $namespaces[$default] = 'default';
@@ -587,7 +589,7 @@ class languages {
                }
 
                # Check namespace aliases
-               foreach( $this->mNamespaceAliases[$code] as $key => $value ) {
+               foreach ( $this->mNamespaceAliases[$code] as $key => $value ) {
                        if ( $value == NS_PROJECT_TALK && strpos( $key, '$1' ) === false ) {
                                $namespaces[$key] = '';
                        }
@@ -758,9 +760,9 @@ class extensionLanguages extends languages {
         * @param $code string The language code.
         */
        protected function loadFile( $code ) {
-               if( !isset( $this->mRawMessages[$code] ) ) {
+               if ( !isset( $this->mRawMessages[$code] ) ) {
                        $this->mRawMessages[$code] = $this->mMessageGroup->load( $code );
-                       if( empty( $this->mRawMessages[$code] ) ) {
+                       if ( empty( $this->mRawMessages[$code] ) ) {
                                $this->mRawMessages[$code] = array();
                        }
                }
index 66cc1dc..17feaf9 100644 (file)
@@ -224,6 +224,8 @@ $wgIgnoredMessages = array(
        'deletedarticle',
        // 'uploadedimage',
        // 'overwroteimage',
+       'createacct-helpusername',
+       'createacct-imgcaptcha-help',
        'userlogout-summary',
        'changeemail-summary',
        'changepassword-summary',
@@ -248,6 +250,14 @@ $wgIgnoredMessages = array(
        'ipb-default-expiry',
        'pageinfo-header',
        'pageinfo-footer',
+       'createacct-benefit-head1',
+       'createacct-benefit-icon1',
+       'createacct-benefit-head2',
+       'createacct-benefit-icon2',
+       'createacct-benefit-head3',
+       'createacct-benefit-icon3',
+       'today-at',
+       'redirect-text',
 );
 
 /** Optional messages, which may be translated only if changed in the target language. */
@@ -297,40 +307,24 @@ $wgOptionalMessages = array(
        'resetpass_text',
        'image_sample',
        'media_sample',
-       'skinname-standard',
-       'skinname-nostalgia',
        'skinname-cologneblue',
        'skinname-monobook',
-       'skinname-myskin',
-       'skinname-chick',
-       'skinname-simple',
        'skinname-modern',
        'skinname-vector',
        'common.css',
-       'standard.css',
-       'nostalgia.css',
        'cologneblue.css',
        'monobook.css',
-       'myskin.css',
-       'chick.css',
-       'simple.css',
        'modern.css',
        'vector.css',
        'print.css',
-       'handheld.css',
        'noscript.css',
        'group-autoconfirmed.css',
        'group-bot.css',
        'group-sysop.css',
        'group-bureaucrat.css',
        'common.js',
-       'standard.js',
-       'nostalgia.js',
        'cologneblue.js',
        'monobook.js',
-       'myskin.js',
-       'chick.js',
-       'simple.js',
        'modern.js',
        'vector.js',
        'group-autoconfirmed.js',
@@ -487,7 +481,7 @@ $wgOptionalMessages = array(
        'changed', // @deprecated. Remove in MediaWiki 1.23.
 );
 
-/** EXIF messages, which may be set as optional in several checks, but are generally mandatory */
+/** Exif messages, which may be set as optional in several checks, but are generally mandatory */
 $wgEXIFMessages = array(
        'exif-imagewidth',
        'exif-imagelength',
index 7c16df6..3a07553 100644 (file)
@@ -56,8 +56,6 @@ $wgMessageStructure = array(
                'tog-shownumberswatching',
                'tog-oldsig',
                'tog-fancysig',
-               'tog-externaleditor',
-               'tog-externaldiff',
                'tog-showjumplinks',
                'tog-uselivepreview',
                'tog-forceeditsummary',
@@ -72,6 +70,7 @@ $wgMessageStructure = array(
                'tog-showhiddencats',
                'tog-noconvertlink',
                'tog-norollbackdiff',
+               'tog-useeditwarning',
        ),
        'underline' => array(
                'underline-always',
@@ -136,6 +135,18 @@ $wgMessageStructure = array(
                'oct',
                'nov',
                'dec',
+               'january-date',
+               'february-date',
+               'march-date',
+               'april-date',
+               'may-date',
+               'june-date',
+               'july-date',
+               'august-date',
+               'september-date',
+               'october-date',
+               'november-date',
+               'december-date',
        ),
        'categorypages' => array(
                'pagecategories',
@@ -226,6 +237,7 @@ $wgMessageStructure = array(
                'create-this-page',
                'delete',
                'deletethispage',
+               'undeletethispage',
                'undelete_short',
                'viewdeleted_short',
                'protect',
@@ -430,9 +442,19 @@ $wgMessageStructure = array(
                'welcomeuser',
                'welcomecreation-msg',
                'yourname',
+               'userlogin-yourname',
+               'userlogin-yourname-ph',
+               'createacct-helpusername',
                'yourpassword',
+               'userlogin-yourpassword',
+               'userlogin-yourpassword-ph',
+               'createacct-yourpassword-ph',
                'yourpasswordagain',
+               'createacct-yourpasswordagain',
+               'createacct-yourpasswordagain-ph',
                'remembermypassword',
+               'userlogin-remembermypassword',
+               'userlogin-signwithsecure',
                'securelogin-stick-https',
                'yourdomainname',
                'password-change-forbidden',
@@ -446,17 +468,44 @@ $wgMessageStructure = array(
                'userlogout',
                'userlogout-summary',
                'notloggedin',
+               'userlogin-noaccount',
+               'userlogin-joinproject',
                'nologin',
                'nologinlink',
                'createaccount',
                'gotaccount',
                'gotaccountlink',
                'userlogin-resetlink',
+               'userlogin-resetpassword-link',
+               'helplogin-url',
+               'userlogin-helplink',
+               'createacct-join',
+               'createacct-emailrequired',
+               'createacct-emailoptional',
+               'createacct-email-ph',
                'createaccountmail',
+               'createacct-realname',
                'createaccountreason',
+               'createacct-reason',
+               'createacct-reason-ph',
+               'createacct-captcha',
+               'createacct-imgcaptcha-help',
+               'createacct-imgcaptcha-ph',
+               'createacct-submit',
+               'createacct-benefit-heading',
+               'createacct-benefit-icon1',
+               'createacct-benefit-head1',
+               'createacct-benefit-body1',
+               'createacct-benefit-icon2',
+               'createacct-benefit-head2',
+               'createacct-benefit-body2',
+               'createacct-benefit-icon3',
+               'createacct-benefit-head3',
+               'createacct-benefit-body3',
                'badretype',
                'userexists',
                'loginerror',
+               'createacct-error',
                'createaccounterror',
                'nocookiesnew',
                'nocookieslogin',
@@ -532,13 +581,15 @@ $wgMessageStructure = array(
                'resetpass-submit-cancel',
                'resetpass-wrong-oldpass',
                'resetpass-temp-password',
+               'resetpass-abort-generic',
        ),
        'passwordreset' => array(
                'passwordreset',
-               'passwordreset-text',
+               'passwordreset-text-one',
+               'passwordreset-text-many',
                'passwordreset-legend',
                'passwordreset-disabled',
-               'passwordreset-pretext',
+               'passwordreset-emaildisabled',
                'passwordreset-username',
                'passwordreset-domain',
                'passwordreset-capture',
@@ -688,6 +739,7 @@ $wgMessageStructure = array(
                'edit-gone-missing',
                'edit-conflict',
                'edit-no-change',
+               'postedit-confirmation',
                'edit-already-exists',
                'addsection-preload',
                'addsection-editintro',
@@ -695,6 +747,7 @@ $wgMessageStructure = array(
                'content-failed-to-parse',
                'invalid-content-data',
                'content-not-allowed-here',
+               'editwarning-warning',
        ),
        'contentmodels' => array(
                'content-model-wikitext',
@@ -943,19 +996,11 @@ $wgMessageStructure = array(
                'search-external',
                'searchdisabled',
                'googlesearch',
+               'search-error',
        ),
        'opensearch' => array(
                'opensearch-desc',
        ),
-       'quickbar' => array(
-               'qbsettings',
-               'qbsettings-none',
-               'qbsettings-fixedleft',
-               'qbsettings-fixedright',
-               'qbsettings-floatingleft',
-               'qbsettings-floatingright',
-               'qbsettings-directionality',
-       ),
        'preferences' => array(
                'preferences',
                'preferences-summary',
@@ -1101,6 +1146,7 @@ $wgMessageStructure = array(
                'userrights-changeable-col',
                'userrights-unchangeable-col',
                'userrights-irreversible-marker',
+               'userrights-conflict',
        ),
        'group' => array(
                'group',
@@ -1480,7 +1526,6 @@ $wgMessageStructure = array(
                'http-read-error',
                'http-timed-out',
                'http-curl-error',
-               'http-host-unreachable',
                'http-bad-status',
        ),
 
@@ -2291,6 +2336,7 @@ $wgMessageStructure = array(
                'sorbs',
                'sorbsreason',
                'sorbs_create_account_reason',
+               'xffblockreason',
                'cant-block-while-blocked',
                'cant-see-hidden-user',
                'ipbblocked',
@@ -2415,6 +2461,7 @@ $wgMessageStructure = array(
                'thumbnail-more',
                'filemissing',
                'thumbnail_error',
+               'thumbnail_error_remote',
                'djvu_page_error',
                'djvu_no_xml',
                'thumbnail-temp-create',
@@ -2487,7 +2534,7 @@ $wgMessageStructure = array(
                'javascripttest-pagetext-noframework',
                'javascripttest-pagetext-unknownframework',
                'javascripttest-pagetext-frameworks',
-               'javascripttest-pagetext-skins' ,
+               'javascripttest-pagetext-skins',
                'javascripttest-qunit-name',
                'javascripttest-qunit-intro',
                'javascripttest-qunit-heading',
@@ -2635,17 +2682,11 @@ $wgMessageStructure = array(
        ),
        'stylesheets' => array(
                'common.css',
-               'standard.css',
-               'nostalgia.css',
                'cologneblue.css',
                'monobook.css',
-               'myskin.css',
-               'chick.css',
-               'simple.css',
                'modern.css',
                'vector.css',
                'print.css',
-               'handheld.css',
                'noscript.css',
                'group-autoconfirmed.css',
                'group-bot.css',
@@ -2654,13 +2695,8 @@ $wgMessageStructure = array(
        ),
        'scripts' => array(
                'common.js',
-               'standard.js',
-               'nostalgia.js',
                'cologneblue.js',
                'monobook.js',
-               'myskin.js',
-               'chick.js',
-               'simple.js',
                'modern.js',
                'vector.js',
                'group-autoconfirmed.js',
@@ -2742,13 +2778,8 @@ $wgMessageStructure = array(
                'pageinfo-category-files'
        ),
        'skin' => array(
-               'skinname-standard',
-               'skinname-nostalgia',
                'skinname-cologneblue',
                'skinname-monobook',
-               'skinname-myskin',
-               'skinname-chick',
-               'skinname-simple',
                'skinname-modern',
                'skinname-vector',
        ),
@@ -2831,11 +2862,26 @@ $wgMessageStructure = array(
                'minutes',
                'hours',
                'days',
+               'weeks',
                'months',
                'years',
                'ago',
                'just-now',
        ),
+       'human-timestamps' => array(
+               'hours-ago',
+               'minutes-ago',
+               'seconds-ago',
+               'monday-at',
+               'tuesday-at',
+               'wednesday-at',
+               'thursday-at',
+               'friday-at',
+               'saturday-at',
+               'sunday-at',
+               'today-at',
+               'yesterday-at',
+       ),
        'badimagelist' => array(
                'bad_image_list',
        ),
@@ -3191,16 +3237,16 @@ $wgMessageStructure = array(
                'exif-lightsource-255',
        ),
        'exif-flash' => array(
-               'exif-flash-fired-0' ,
-               'exif-flash-fired-1' ,
-               'exif-flash-return-0' ,
-               'exif-flash-return-2' ,
-               'exif-flash-return-3' ,
-               'exif-flash-mode-1' ,
-               'exif-flash-mode-2' ,
-               'exif-flash-mode-3' ,
-               'exif-flash-function-1' ,
-               'exif-flash-redeye-1' ,
+               'exif-flash-fired-0',
+               'exif-flash-fired-1',
+               'exif-flash-return-0',
+               'exif-flash-return-2',
+               'exif-flash-return-3',
+               'exif-flash-mode-1',
+               'exif-flash-mode-2',
+               'exif-flash-mode-3',
+               'exif-flash-function-1',
+               'exif-flash-redeye-1',
        ),
        'exif-focalplaneresolutionunit' => array(
                'exif-focalplaneresolutionunit-2',
@@ -3619,11 +3665,18 @@ $wgMessageStructure = array(
                'version-entrypoints-api-php',
                'version-entrypoints-load-php',
        ),
-       'filepath' => array(
-               'filepath',
-               'filepath-page',
-               'filepath-submit',
-               'filepath-summary',
+       'redirect' => array(
+               'redirect',
+               'redirect-legend',
+               'redirect-text',
+               'redirect-summary',
+               'redirect-submit',
+               'redirect-lookup',
+               'redirect-value',
+               'redirect-user',
+               'redirect-revision',
+               'redirect-file',
+               'redirect-not-exists',
        ),
        'fileduplicatesearch' => array(
                'fileduplicatesearch',
@@ -3707,6 +3760,9 @@ $wgMessageStructure = array(
                'htmlform-submit',
                'htmlform-reset',
                'htmlform-selectorother-other',
+               'htmlform-no',
+               'htmlform-yes',
+               'htmlform-chosen-placeholder',
        ),
        'sqlite' => array(
                'sqlite-has-fts',
@@ -3863,8 +3919,8 @@ $wgBlockComments = array(
 begin with * or ** are discarded, furthermore lines that do begin with ** and
 do not contain | are also discarded, but do not depend on this behavior for
 future releases. Also note that since each list value is wrapped in a unique
-XHTML id it should only appear once and include characters that are legal
-XHTML id names.",
+(X)HTML id it should only appear once and include characters that are legal
+(X)HTML id names.",
        'toggles'             => 'User preference toggles',
        'underline'           => '',
        'editfont'            => 'Font style option in Special:Preferences',
@@ -3904,7 +3960,6 @@ XHTML id names.",
        'diffs'               => 'Diffs',
        'search'              => 'Search results',
        'opensearch'          => 'OpenSearch description',
-       'quickbar'            => 'Quickbar',
        'preferences'         => 'Preferences page',
        'preferences-email'   => 'User preference: email validation using jQuery',
        'userrights'          => 'User rights',
@@ -3994,12 +4049,11 @@ XHTML id names.",
        'patrol-log'          => 'Patrol log',
        'imagedeletion'       => 'Image deletion',
        'browsediffs'         => 'Browsing diffs',
-       'newfiles'           => 'Special:NewFiles',
+       'newfiles'            => 'Special:NewFiles',
        'video-info'          => 'Video information, used by Language::formatTimePeriod() to format lengths in the above messages',
+       'human-timestamps'    => 'Human-readable timestamps',
        'badimagelist'        => 'Bad image list',
        'variantname-zh'      => "Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language",
        'variantname-gan'      => 'Variants for Gan language',
        'variantname-sr'      => 'Variants for Serbian language',
@@ -4010,9 +4064,9 @@ Variants for Chinese language",
        'variantname-shi'     => 'Variants for Tachelhit language',
        'media-info'          => 'Media information',
        'metadata'            => 'Metadata',
-       'exif'                           => 'EXIF tags',
+       'exif'                           => 'Exif tags',
        'exif-values'                    => 'Make & model, can be wikified in order to link to the camera and model name',
-       'exif-compression'               => 'EXIF attributes',
+       'exif-compression'               => 'Exif attributes',
        'exif-copyrighted'               => '',
        'exif-unknowndate'               => '',
        'exif-photometricinterpretation' => '',
@@ -4081,7 +4135,7 @@ Variants for Chinese language",
        'signatures'            => 'Signatures',
        'CoreParserFunctions'   => 'Core parser functions',
        'version'               => 'Special:Version',
-       'filepath'              => 'Special:FilePath',
+       'redirect'              => 'Special:Redirect',
        'fileduplicatesearch'   => 'Special:FileDuplicateSearch',
        'special-specialpages'  => 'Special:SpecialPages',
        'special-blank'         => 'Special:BlankPage',
index ad83905..66948ae 100644 (file)
@@ -22,9 +22,9 @@
  * @defgroup MaintenanceLanguage MaintenanceLanguage
  */
 
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'languages.inc' );
-require_once( 'writeMessagesArray.inc' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'languages.inc';
+require_once 'writeMessagesArray.inc';
 
 /**
  * Rewrite a messages array.
@@ -56,13 +56,13 @@ function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknow
  */
 function removeDupes( $oldMsgArray, $dupeMsgSource ) {
        if ( file_exists( $dupeMsgSource ) ) {
-               include( $dupeMsgSource );
+               include $dupeMsgSource;
                if ( !isset( $dupeMessages ) ) {
-                       echo( "There are no duplicated messages in the source file provided." );
+                       echo "There are no duplicated messages in the source file provided.";
                        exit( 1 );
                }
        } else {
-               echo ( "The specified file $dupeMsgSource cannot be found." );
+               echo "The specified file $dupeMsgSource cannot be found.";
                exit( 1 );
        }
        $newMsgArray = $oldMsgArray;
index ba50322..61b84a0 100644 (file)
@@ -28,9 +28,9 @@
  */
 $optionsWithArgs = array( 'output' );
 
-require_once( __DIR__ . '/../commandLine.inc' );
-require_once( 'languages.inc' );
-require_once( __DIR__ . '/StatOutputs.php' );
+require_once __DIR__ . '/../commandLine.inc';
+require_once 'languages.inc';
+require_once __DIR__ . '/StatOutputs.php';
 
 
 if ( isset( $options['help'] ) ) {
@@ -96,7 +96,7 @@ $wgRequiredMessagesNumber = count( $wgGeneralMessages['required'] );
 
 foreach ( $wgLanguages->getLanguages() as $code ) {
        # Don't check English, RTL English or dummy language codes
-       if ( $code == 'en' || $code == 'enRTL' || (is_array( $wgDummyLanguageCodes ) &&
+       if ( $code == 'en' || $code == 'enRTL' || ( is_array( $wgDummyLanguageCodes ) &&
                isset( $wgDummyLanguageCodes[$code] ) ) ) {
                continue;
        }
index 4f00496..63d9b84 100644 (file)
@@ -36,8 +36,8 @@ define( 'NOT_REALLY_MEDIAWIKI', 1 );
 
 $IP = __DIR__ . '/../..';
 
-require_once( "$IP/includes/Defines.php" );
-require_once( "$IP/languages/Language.php" );
+require_once "$IP/includes/Defines.php";
+require_once "$IP/languages/Language.php";
 
 $files = array();
 foreach ( $argv as $arg ) {
@@ -57,7 +57,7 @@ foreach ( $files as $filename ) {
 }
 
 function getVars( $filename ) {
-       require( $filename );
+       require $filename;
        $vars = get_defined_vars();
        unset( $vars['filename'] );
        return $vars;
index b2e04c7..fc0da3f 100644 (file)
@@ -50,25 +50,27 @@ class MessageWriter {
                $sortedMessages = $messages[1];
 
                # Write to the file
-               if ( $messagesFolder )
+               if ( $messagesFolder ) {
                        $filename = Language::getFileName( "$messagesFolder/Messages", $code );
-               else
+               } else {
                        $filename = Language::getMessagesFileName( $code );
+               }
 
-               if ( file_exists( $filename ) )
+               if ( file_exists( $filename ) ) {
                        $contents = file_get_contents( $filename );
-               else
+               } else {
                        $contents = '<?php
 $messages = array(
 );
 ';
+               }
 
-               if( strpos( $contents, '$messages' ) !== false ) {
+               if ( strpos( $contents, '$messages' ) !== false ) {
                        $contents = explode( '$messages', $contents );
-                       if( $messagesText == '$messages' . $contents[1] ) {
+                       if ( $messagesText == '$messages' . $contents[1] ) {
                                echo "Generated messages for language $code. Same as the current file.\n";
                        } else {
-                               if( $write ) {
+                               if ( $write ) {
                                        $new = $contents[0];
                                        $new .= $messagesText;
                                        file_put_contents( $filename, $new );
@@ -77,12 +79,13 @@ $messages = array(
                                        echo "Generated messages for language $code. Please run the script again (without the parameter \"dry-run\") to write the array to the file.\n";
                                }
                        }
-                       if( $listUnknown && isset( $sortedMessages['unknown'] ) && !empty( $sortedMessages['unknown'] ) ) {
-                               if ( $removeUnknown )
+                       if ( $listUnknown && isset( $sortedMessages['unknown'] ) && !empty( $sortedMessages['unknown'] ) ) {
+                               if ( $removeUnknown ) {
                                        echo "\nThe following " . count( $sortedMessages['unknown'] ) . " unknown messages have been removed:\n";
-                               else
+                               } else {
                                        echo "\nThere are " . count( $sortedMessages['unknown'] ) . " unknown messages, please check them:\n";
-                               foreach( $sortedMessages['unknown'] as $key => $value ) {
+                               }
+                               foreach ( $sortedMessages['unknown'] as $key => $value ) {
                                        echo "* " . $key . "\n";
                                }
                        }
@@ -107,22 +110,22 @@ $messages = array(
                # Load messages
                $dir = $prefix ? $prefix : __DIR__;
 
-               require( $dir . '/messages.inc' );
+               require $dir . '/messages.inc';
                self::$messageStructure = $wgMessageStructure;
                self::$blockComments = $wgBlockComments;
 
-               require( $dir . '/messageTypes.inc' );
+               require $dir . '/messageTypes.inc';
                self::$ignoredMessages = $wgIgnoredMessages;
                self::$optionalMessages = $wgOptionalMessages;
 
                # Sort messages to blocks
                $sortedMessages['unknown'] = $messages;
-               foreach( self::$messageStructure as $blockName => $block ) {
+               foreach ( self::$messageStructure as $blockName => $block ) {
                        /**
                         * @var $block array
                         */
-                       foreach( $block as $key ) {
-                               if( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
+                       foreach ( $block as $key ) {
+                               if ( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
                                        $sortedMessages[$blockName][$key] = $sortedMessages['unknown'][$key];
                                        unset( $sortedMessages['unknown'][$key] );
                                }
@@ -132,13 +135,13 @@ $messages = array(
                # Write all the messages
                $messagesText = "\$messages = array(
 ";
-               foreach( $sortedMessages as $block => $messages ) {
+               foreach ( $sortedMessages as $block => $messages ) {
                        # Skip if it's the block of unknown messages - handle that in the end of file
-                       if( $block == 'unknown' ) {
+                       if ( $block == 'unknown' ) {
                                continue;
                        }
 
-                       if( $ignoredComments ) {
+                       if ( $ignoredComments ) {
                                $ignored = self::$ignoredMessages;
                                $optional = self::$optionalMessages;
                        } else {
@@ -175,10 +178,10 @@ $messages = array(
                $commentArray = array();
 
                # List of keys only
-               foreach( $messages as $key ) {
-                       if( in_array( $key, $ignored ) ) {
+               foreach ( $messages as $key ) {
+                       if ( in_array( $key, $ignored ) ) {
                                $commentArray[$key] = ' # ' . self::$ignoredComment;
-                       } elseif( in_array( $key, $optional ) ) {
+                       } elseif ( in_array( $key, $optional ) ) {
                                $commentArray[$key] = ' # ' . self::$optionalComment;
                        }
                }
@@ -202,13 +205,13 @@ $messages = array(
                $blockText = '';
 
                # Skip the block if it includes no messages
-               if( empty( $messages ) ) {
+               if ( empty( $messages ) ) {
                        return '';
                }
 
                # Format the block comment (if exists); check for multiple lines comments
-               if( !empty( $blockComment ) ) {
-                       if( strpos( $blockComment, "\n" ) === false ) {
+               if ( !empty( $blockComment ) ) {
+                       if ( strpos( $blockComment, "\n" ) === false ) {
                                $blockText .= "$prefix# $blockComment
 ";
                        } else {
@@ -223,7 +226,7 @@ $blockComment
                $maxKeyLength = max( array_map( 'strlen', array_keys( $messages ) ) );
 
                # Format the messages
-               foreach( $messages as $key => $value ) {
+               foreach ( $messages as $key => $value ) {
                        # Add the key name
                        $blockText .= "$prefix'$key'";
 
@@ -241,16 +244,16 @@ $blockComment
                        $single = "'";
                        $double = '"';
 
-                       if( strpos( $value, $single ) === false ) {
+                       if ( strpos( $value, $single ) === false ) {
                                # Nothing ugly, just use '
-                               $blockText .= $single.$value.$single;
-                       } elseif( strpos( $value, $double ) === false && !preg_match('/\$[a-zA-Z_\x7f-\xff]/', $value) ) {
+                               $blockText .= $single . $value . $single;
+                       } elseif ( strpos( $value, $double ) === false && !preg_match( '/\$[a-zA-Z_\x7f-\xff]/', $value ) ) {
                                # No "-quotes, no variables that need quoting, use "
-                               $blockText .= $double.$value.$double;
+                               $blockText .= $double . $value . $double;
                        } else {
                                # Something needs quoting, pick the quote which causes less quoting
                                $quote = substr_count( $value, $double ) + substr_count( $value, '$' ) >= substr_count( $value, $single ) ? $single : $double;
-                               if( $quote === $double ) {
+                               if ( $quote === $double ) {
                                        $extra = '$';
                                } else {
                                        $extra = '';
@@ -262,7 +265,7 @@ $blockComment
                        $blockText .= ',';
 
                        # Add comments, if there is any
-                       if( array_key_exists( $key, $messageComments ) ) {
+                       if ( array_key_exists( $key, $messageComments ) ) {
                                $blockText .= $messageComments[$key];
                        }
 
index 6ff8a17..7b7b761 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 /** */
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 $options = getopt( '', array( 'debug', 'help', 'cache:' ) );
 
@@ -48,7 +48,7 @@ if ( $cache ) {
        $servers = $wgObjectCaches[$cache]['servers'];
 } elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
        $mcc->set_servers( $wgMemCachedServers );
-} elseif( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
+} elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
        $mcc->set_servers( $wgObjectCaches[$wgMainCacheType]['servers'] );
 } else {
        print "MediaWiki isn't configured for Memcached usage\n";
@@ -116,7 +116,9 @@ do {
        $quit = false;
 
        $line = Maintenance::readconsole();
-       if ( $line === false ) exit;
+       if ( $line === false ) {
+               exit;
+       }
 
        $args = explode( ' ', $line );
        $command = array_shift( $args );
index 469feca..26e1e18 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that  makes several 'set', 'incr' and 'get' requests
@@ -34,7 +34,7 @@ class mcTest extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Makes several 'set', 'incr' and 'get' requests on every"
-                                                         . " memcached server and shows a report";
+                       . " memcached server and shows a report";
                $this->addOption( 'i', 'Number of iterations', false, true );
                $this->addOption( 'cache', 'Use servers from this $wgObjectCaches store', false, true );
                $this->addArg( 'server[:port]', 'Memcached server to test, with optional port', false );
@@ -54,7 +54,7 @@ class mcTest extends Maintenance {
                        $servers = array( $this->getArg() );
                } elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
                        global $wgMemCachedServers;
-                       $servers = $wgMemCachedServers ;
+                       $servers = $wgMemCachedServers;
                } elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
                        $servers = $wgObjectCaches[$wgMainCacheType]['servers'];
                } else {
@@ -105,4 +105,4 @@ class mcTest extends Maintenance {
 }
 
 $maintClass = "mcTest";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 62596b2..2b680d3 100644 (file)
@@ -25,7 +25,7 @@
 # Start from scratch
 define( 'MW_NO_EXTENSION_MESSAGES', 1 );
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 $maintClass = 'MergeMessageFileList';
 $mmfl = false;
 
@@ -61,7 +61,7 @@ class MergeMessageFileList extends Maintenance {
                if ( $this->hasOption( 'extensions-dir' ) ) {
                        $extdir = $this->getOption( 'extensions-dir' );
                        $entries = scandir( $extdir );
-                       foreach( $entries as $extname ) {
+                       foreach ( $entries as $extname ) {
                                if ( $extname == '.' || $extname == '..' || !is_dir( "$extdir/$extname" ) ) {
                                        continue;
                                }
@@ -88,7 +88,7 @@ class MergeMessageFileList extends Maintenance {
        }
 }
 
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
 
 foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( strval( $fileName ) === '' ) {
@@ -98,7 +98,10 @@ foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( empty( $mmfl['quiet'] ) ) {
                fwrite( STDERR, "Loading data from $fileName\n" );
        }
-       include_once( $fileName );
+       if ( !( include_once $fileName ) ) {
+               fwrite( STDERR, "Unable to read $fileName\n" );
+               exit( 1 );
+       }
 }
 fwrite( STDERR, "\n" );
 $s =
index f3e5957..6903365 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that re-assigns users from an old group to a new one.
@@ -106,4 +106,4 @@ class MigrateUserGroup extends Maintenance {
 }
 
 $maintClass = "MigrateUserGroup";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 0846a64..ec936c8 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that minifies a file or set of files.
@@ -144,4 +144,4 @@ class MinifyScript extends Maintenance {
 }
 
 $maintClass = 'MinifyScript';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 7d15959..34e6428 100644 (file)
@@ -34,7 +34,7 @@
  * e.g. immobile_namespace for namespaces which can't be moved
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to move a batch of pages.
@@ -116,4 +116,4 @@ class MoveBatch extends Maintenance {
 }
 
 $maintClass = "MoveBatch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ad99617..b76f57c 100644 (file)
@@ -305,17 +305,6 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
 -- Maximum key length ON SQL Server is 900 bytes
 CREATE INDEX /*$wgDBprefix*/externallinks_index   ON /*$wgDBprefix*/externallinks(el_index);
 
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE /*$wgDBprefix*/external_user (
-       -- Foreign key to user_id
-       eu_local_id INT NOT NULL PRIMARY KEY,
-       -- opaque identifier provided by the external database
-       eu_external_id NVARCHAR(255) NOT NULL,
-);
-CREATE UNIQUE INDEX /*$wgDBprefix*/eu_external_idx ON /*$wgDBprefix*/external_user(eu_external_id);
-
 --
 -- Track INTerlanguage links
 --
index 6eeb48d..c80981b 100644 (file)
@@ -18,6 +18,6 @@ if ( PHP_SAPI != 'cli' ) {
 $source = file_get_contents( $argv[1] );
 $regexp = '#\@var\s+([^\s]+)([^/]+)/\s+(var|public|protected|private)\s+(\$[^\s;=]+)#';
 $replac = '${2} */ ${3} ${1} ${4}';
-$source = preg_replace($regexp, $replac, $source);
+$source = preg_replace( $regexp, $replac, $source );
 
 echo $source;
index 4fad7a7..9283264 100644 (file)
@@ -8,12 +8,6 @@
  * Usage:
  *   php mwdocgen.php
  *
- * KNOWN BUGS:
- *
- * - pass_thru seems to always use buffering (even with ob_implicit_flush()),
- * that make output slow when doxygen parses language files.
- * - the menu doesnt work, got disabled at revision 13740. Need to code it.
- *
  * 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
  * @version first release
  */
 
-#
-# Variables / Configuration
-#
-
-if ( PHP_SAPI != 'cli' ) {
-       echo 'Run "' . __FILE__ . '" from the command line.';
-       die( -1 );
-}
-
-/** Figure out the base directory for MediaWiki location */
-$mwPath = dirname( __DIR__ ) . DIRECTORY_SEPARATOR;
-
-/** doxygen binary script */
-$doxygenBin = 'doxygen';
-
-/** doxygen configuration template for mediawiki */
-$doxygenTemplate = $mwPath . 'maintenance/Doxyfile';
-
-/** doxygen input filter to tweak source file before they are parsed */
-$doxygenInputFilter = "php {$mwPath}maintenance/mwdoc-filter.php";
-
-/** where Phpdoc should output documentation */
-$doxyOutput = $mwPath . 'docs' . DIRECTORY_SEPARATOR ;
-
-$doxyVersion = 'master';
-
-/** MediaWiki subpaths */
-$mwPathI = $mwPath . 'includes/';
-$mwPathL = $mwPath . 'languages/';
-$mwPathM = $mwPath . 'maintenance/';
-$mwPathS = $mwPath . 'skins/';
-
-/** Ignored paths relative to $mwPath */
-$mwExcludePaths = array(
-       'images',
-       'static',
-);
-
-/** Variable to get user input */
-$input = '';
-$excludePatterns = '';
-/** Whether to generates man pages: */
-$doxyGenerateMan = false;
-
-#
-# Functions
-#
-
-define( 'MEDIAWIKI', true );
-require_once( "$mwPath/includes/GlobalFunctions.php" );
-
-/**
- * Read a line from the shell
- * @param $prompt String
- * @return string
- */
-function readaline( $prompt = '' ) {
-       print $prompt;
-       $fp = fopen( "php://stdin", "r" );
-       $resp = trim( fgets( $fp, 1024 ) );
-       fclose( $fp );
-       return $resp;
-}
+require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Generate a configuration file given user parameters and return the temporary filename.
- * @param $doxygenTemplate String: full path for the template.
- * @param $outputDirectory String: directory where the stuff will be output.
- * @param $stripFromPath String: path that should be stripped out (usually mediawiki base path).
- * @param $currentVersion String: Version number of the software
- * @param $input String: Path to analyze.
- * @param $exclude String: Additionals path regex to exclude
- * @param $excludePatterns String: Additionals path regex to exclude
- *                 (LocalSettings.php, AdminSettings.php, .svn and .git directories are always excluded)
- * @param $doxyGenerateMan Boolean
- * @return string
+ * Maintenance script that builds doxygen documentation.
+ * @ingroup Maintenance
  */
-function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $input, $exclude, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter ) {
-
-       $template = file_get_contents( $doxygenTemplate );
-       // Replace template placeholders by correct values.
-       $replacements = array(
-               '{{OUTPUT_DIRECTORY}}' => $outputDirectory,
-               '{{STRIP_FROM_PATH}}'  => $stripFromPath,
-               '{{CURRENT_VERSION}}'  => $currentVersion,
-               '{{INPUT}}'            => $input,
-               '{{EXCLUDE}}'          => $exclude,
-               '{{EXCLUDE_PATTERNS}}' => $excludePatterns,
-               '{{HAVE_DOT}}'         => `which dot` ? 'YES' : 'NO',
-               '{{GENERATE_MAN}}'     => $doxyGenerateMan ? 'YES' : 'NO',
-               '{{INPUT_FILTER}}'     => $doxygenInputFilter,
-       );
-       $tmpCfg = str_replace( array_keys( $replacements ), array_values( $replacements ), $template );
-       $tmpFileName = tempnam( wfTempDir(), 'mwdocgen-' );
-       file_put_contents( $tmpFileName, $tmpCfg ) or die( "Could not write doxygen configuration to file $tmpFileName\n" );
-
-       return $tmpFileName;
-}
-
-#
-# Main !
-#
-
-unset( $file );
+class MWDocGen extends Maintenance {
+
+       /**
+        * Prepare Maintenance class
+        */
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Build doxygen documentation';
+
+               $this->addOption( 'doxygen',
+                       'Path to doxygen',
+                       false, true );
+               $this->addOption( 'version',
+                       'Pass a MediaWiki version',
+                       false, true );
+               $this->addOption( 'generate-man',
+                       'Whether to generate man files' );
+               $this->addOption( 'file',
+                       'Only process given file (relative to $IP)',
+                       false, true );
+               $this->addOption( 'output',
+                       'Path to write doc to',
+                       false, true );
+               $this->addOption( 'no-extensions',
+                       'Ignore extensions' );
+       }
 
-if ( is_array( $argv ) ) {
-       for ($i = 0; $i < count($argv); $i++ ) {
-               switch( $argv[$i] ) {
-               case '--all':         $input = 0; break;
-               case '--includes':    $input = 1; break;
-               case '--languages':   $input = 2; break;
-               case '--maintenance': $input = 3; break;
-               case '--skins':       $input = 4; break;
-               case '--file':
-                       $input = 5;
-                       $i++;
-                       if ( isset( $argv[$i] ) ) {
-                               $file = $argv[$i];
-                       }
-                       break;
-               case '--no-extensions': $input = 6; break;
-               case '--output':
-                       $i++;
-                       if ( isset( $argv[$i] ) ) {
-                               $doxyOutput = realpath( $argv[$i] );
-                       }
-                       break;
-               case '--version':
-                       $i++;
-                       if ( isset( $argv[$i] ) ) {
-                               $doxyVersion = $argv[$i];
-                       }
-                       break;
-               case '--generate-man':
-                       $doxyGenerateMan = true;
-                       break;
-               case '--help':
-                       print <<<END
-Usage: php mwdocgen.php [<command>] [<options>]
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
 
-Commands:
-    --all           Process entire codebase
-    --includes      Process only files in includes/ dir
-    --languages     Process only files in languages/ dir
-    --maintenance   Process only files in maintenance/ dir
-    --skins         Process only files in skins/ dir
-    --file <file>   Process only the given file
-    --no-extensions Process everything but extensions directorys
+       protected function init() {
+               global $IP;
+
+               $this->doxygen = $this->getOption( 'doxygen', 'doxygen' );
+               $this->mwVersion = $this->getOption( 'version', 'master' );
+               $this->input = $IP . '/' . $this->getOption( 'file', '' );
+               $this->output = $this->getOption( 'output', "$IP/docs" );
+
+               $this->inputFilter = wfShellWikiCmd(
+                       $IP . '/maintenance/mwdoc-filter.php' );
+               $this->template = $IP . '/maintenance/Doxyfile';
+               $this->excludes = array(
+                       'images',
+                       'static',
+               );
+               $this->excludePatterns = array();
+               if ( $this->hasOption( 'no-extensions' ) ) {
+                       $this->excludePatterns[] = 'extensions';
+               }
 
-If no command is given, you will be prompted.
+               $this->doDot = `which dot`;
+               $this->doMan = $this->hasOption( 'generate-man' );
+       }
 
-Other options:
-    --output <dir>  Set output directory (default: $doxyOutput)
-    --generate-man  Generates man page documentation
-    --version       Project version to display in the outut (default: $doxyVersion)
-    --help          Show this help and exit.
+       public function execute() {
+               global $IP;
 
+               $this->init();
 
-END;
-                       exit(0);
-                       break;
+               # Build out directories we want to exclude
+               $exclude = '';
+               foreach ( $this->excludes as $item ) {
+                       $exclude .= " $IP/$item";
                }
-       }
-}
-
-// TODO : generate a list of paths ))
 
-if ( $input === '' ) {
-       echo <<<OPTIONS
-Several documentation possibilities:
- 0 : whole documentation (1 + 2 + 3 + 4)
- 1 : only includes
- 2 : only languages
- 3 : only maintenance
- 4 : only skins
- 5 : only a given file
- 6 : all but the extensions directory
-OPTIONS;
-       while ( !is_numeric( $input ) )
-       {
-               $input = readaline( "\nEnter your choice [0]:" );
-               if ( $input == '' ) {
-                       $input = 0;
+               $excludePatterns = implode( ' ', $this->excludePatterns );
+
+               $conf = strtr( file_get_contents( $this->template ),
+                       array(
+                               '{{OUTPUT_DIRECTORY}}' => $this->output,
+                               '{{STRIP_FROM_PATH}}' => $IP,
+                               '{{CURRENT_VERSION}}' => $this->mwVersion,
+                               '{{INPUT}}' => $this->input,
+                               '{{EXCLUDE}}' => $exclude,
+                               '{{EXCLUDE_PATTERNS}}' => $excludePatterns,
+                               '{{HAVE_DOT}}' => $this->doDot ? 'YES' : 'NO',
+                               '{{GENERATE_MAN}}' => $this->doMan ? 'YES' : 'NO',
+                               '{{INPUT_FILTER}}' => $this->inputFilter,
+                       )
+               );
+
+               $tmpFile = tempnam( wfTempDir(), 'MWDocGen-' );
+               if ( file_put_contents( $tmpFile, $conf ) === false ) {
+                       $this->error( "Could not write doxygen configuration to file $tmpFile\n",
+                               /** exit code: */ 1 );
                }
-       }
-}
-
-switch ( $input ) {
-case 0: $input = $mwPath;  break;
-case 1: $input = $mwPathI; break;
-case 2: $input = $mwPathL; break;
-case 3: $input = $mwPathM; break;
-case 4: $input = $mwPathS; break;
-case 5:
-       if ( !isset( $file ) ) {
-               $file = readaline( "Enter file name $mwPath" );
-       }
-       $input = $mwPath . $file;
-       break;
-case 6:
-       $input = $mwPath;
-       $excludePatterns = 'extensions';
-}
 
-// Generate path exclusions
-$excludedPaths = $mwPath . join( " $mwPath", $mwExcludePaths );
-print "EXCLUDE: $excludedPaths\n\n";
+               $command = $this->doxygen . ' ' . $tmpFile;
+               $this->output( "Executing command:\n$command\n" );
 
-$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $doxyVersion, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter );
-$command = $doxygenBin . ' ' . $generatedConf;
+               $exitcode = 1;
+               system( $command, $exitcode );
 
-echo <<<TEXT
+               $this->output( <<<TEXT
 ---------------------------------------------------
-Launching the command:
-
-$command
+Doxygen execution finished.
+Check above for possible errors.
 
+You might want to delete the temporary file:
+ $tmpFile
 ---------------------------------------------------
 
-TEXT;
-
-$exitcode = 1;
-passthru( $command, $exitcode );
+TEXT
+       );
 
-echo <<<TEXT
----------------------------------------------------
-Doxygen execution finished.
-Check above for possible errors.
+               if ( $exitcode !== 0 ) {
+                       $this->error( "Something went wrong (exit: $exitcode)\n",
+                               $exitcode );
+               }
 
-You might want to delete the temporary file $generatedConf
+       }
 
-TEXT;
+}
 
-exit( $exitcode );
+$maintClass = 'MWDocGen';
+require_once RUN_MAINTENANCE_IF_MAIN;
index fbd428f..cccc715 100755 (executable)
@@ -1,2 +1,17 @@
-#!/usr/bin/env sh
-jsduck --config=$(cd $(dirname $0)/..; pwd)/maintenance/jsduck/config.json && echo 'JSDuck execution finished.'
+#!/usr/bin/env bash
+
+JSDUCK_MWVERSION=master
+if [[ "$1" == "--version" && "$2" != "" ]]
+then
+       JSDUCK_MWVERSION="$2"
+elif [[ "$*" != "" ]]
+then
+       echo "Usage $0: [--version <mediawiki version>]"
+       echo
+       exit 1
+fi
+
+jsduck \
+--config=$(cd $(dirname $0)/..; pwd)/maintenance/jsduck/config.json \
+--footer="Documentation for MediaWiki core ($JSDUCK_MWVERSION). Generated on {DATE} by {JSDUCK} {VERSION}." \
+&& echo 'JSDuck execution finished.'
index 6067a82..ff02468 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that checks for articles to fix after
@@ -185,7 +185,7 @@ class NamespaceConflictChecker extends Maintenance {
        }
 
        /**
-        * @todo: do this for reals
+        * @todo Do this for real
         * @param $key
         * @param $prefix
         * @param $fix
@@ -207,10 +207,10 @@ class NamespaceConflictChecker extends Maintenance {
         * @return array
         */
        private function getConflicts( $ns, $name ) {
-               $page  = 'page';
+               $page = 'page';
                $table = $this->db->tableName( $page );
 
-               $prefix     = $this->db->strencode( $name );
+               $prefix = $this->db->strencode( $name );
                $encNamespace = $this->db->addQuotes( $ns );
 
                $titleSql = "TRIM(LEADING '$prefix:' FROM {$page}_title)";
@@ -318,12 +318,12 @@ class NamespaceConflictChecker extends Maintenance {
                $this->db->update( $table,
                        array(
                                "{$prefix}_namespace" => $newTitle->getNamespace(),
-                               "{$prefix}_title"     => $newTitle->getDBkey(),
+                               "{$prefix}_title" => $newTitle->getDBkey(),
                        ),
                        array(
                                // "{$prefix}_namespace" => 0,
-                               // "{$prefix}_title"     => $row->oldtitle,
-                               "{$prefix}_id"           => $row->id,
+                               // "{$prefix}_title" => $row->oldtitle,
+                               "{$prefix}_id" => $row->id,
                        ),
                        __METHOD__ );
                $this->output( "ok.\n" );
@@ -332,4 +332,4 @@ class NamespaceConflictChecker extends Maintenance {
 }
 
 $maintClass = "NamespaceConflictChecker";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1be5146..219b5d8 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that picks a database that has pending jobs.
@@ -116,4 +116,4 @@ class nextJobDB extends Maintenance {
 }
 
 $maintClass = "nextJobDb";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index c471a44..479dcf7 100644 (file)
@@ -33,7 +33,7 @@
  * based on nukePage by Rob Church
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that removes pages with only one revision from the
@@ -66,7 +66,7 @@ class NukeNS extends Maintenance {
                foreach ( $res as $row ) {
                        // echo "$ns_name:".$row->page_title, "\n";
                        $title = Title::makeTitle( $ns, $row->page_title );
-                       $id   = $title->getArticleID();
+                       $id = $title->getArticleID();
 
                        // Get corresponding revisions
                        $res2 = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_page = $id" );
@@ -94,7 +94,7 @@ class NukeNS extends Maintenance {
                                        $n_deleted ++;
                                }
                        } else {
-                         $this->output( "skip: " . $title->getPrefixedText() . "\n" );
+                               $this->output( "skip: " . $title->getPrefixedText() . "\n" );
                        }
                }
                $dbw->commit( __METHOD__ );
@@ -119,4 +119,4 @@ class NukeNS extends Maintenance {
 }
 
 $maintClass = "NukeNS";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 89dffe0..1870273 100644 (file)
@@ -23,7 +23,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that erases a page record from the database.
@@ -54,7 +54,7 @@ class NukePage extends Maintenance {
                $this->output( "Searching for \"$name\"..." );
                $title = Title::newFromText( $name );
                if ( $title ) {
-                       $id   = $title->getArticleID();
+                       $id = $title->getArticleID();
                        $real = $title->getPrefixedText();
                        $isGoodArticle = $title->isContentPage();
                        $this->output( "found \"$real\" with ID $id.\n" );
@@ -117,4 +117,4 @@ class NukePage extends Maintenance {
 }
 
 $maintClass = "NukePage";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index a46c5e1..435625d 100644 (file)
@@ -27,7 +27,7 @@
  * i.e.: GRANT REFERENCES (user_id) ON mwuser TO hubclient;
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 class AlterSharedConstraints extends Maintenance {
        public function __construct() {
@@ -49,11 +49,11 @@ class AlterSharedConstraints extends Maintenance {
 
                $dbw = wfGetDB( DB_MASTER );
                foreach ( $wgSharedTables as $table ) {
-                       $stable = $dbw->tableNameInternal($table);
+                       $stable = $dbw->tableNameInternal( $table );
                        if ( $wgSharedPrefix != null ) {
                                $ltable = preg_replace( "/^$wgSharedPrefix(.*)/i", "$wgDBprefix\\1", $stable );
                        } else {
-                               $ltable = "{$wgDBprefix}{$stable}" ;
+                               $ltable = "{$wgDBprefix}{$stable}";
                        }
 
                        $result = $dbw->query( "SELECT uc.constraint_name, uc.table_name, ucc.column_name, uccpk.table_name pk_table_name, uccpk.column_name pk_column_name, uc.delete_rule, uc.deferrable, uc.deferred
@@ -62,14 +62,14 @@ class AlterSharedConstraints extends Maintenance {
                                           AND ucc.constraint_name = uc.constraint_name
                                           AND uccpk.constraint_name = uc.r_constraint_name
                                           AND uccpk.table_name = '$ltable'" );
-                       while (($row = $result->fetchRow()) !== false) {
+                       while ( ( $row = $result->fetchRow() ) !== false ) {
 
-                                       $this->output( "Altering {$row['constraint_name']} ...");
+                                       $this->output( "Altering {$row['constraint_name']} ..." );
 
                                        try {
                                                $dbw->query( "ALTER TABLE {$row['table_name']} DROP CONSTRAINT {$wgDBprefix}{$row['constraint_name']}" );
-                                       } catch (DBQueryError $exdb) {
-                                               if ($exdb->errno != 2443) {
+                                       } catch ( DBQueryError $exdb ) {
+                                               if ( $exdb->errno != 2443 ) {
                                                        throw $exdb;
                                                }
                                        }
@@ -88,4 +88,4 @@ class AlterSharedConstraints extends Maintenance {
 }
 
 $maintClass = "AlterSharedConstraints";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index b5b3b07..74fb1b1 100644 (file)
@@ -218,13 +218,6 @@ CREATE INDEX &mw_prefix.externallinks_i01 ON &mw_prefix.externallinks (el_from,
 CREATE INDEX &mw_prefix.externallinks_i02 ON &mw_prefix.externallinks (el_to, el_from);
 CREATE INDEX &mw_prefix.externallinks_i03 ON &mw_prefix.externallinks (el_index);
 
-CREATE TABLE &mw_prefix.external_user (
-  eu_local_id NUMBER NOT NULL,
-  eu_external_id varchar2(255) NOT NULL
-);
-ALTER TABLE &mw_prefix.external_user ADD CONSTRAINT &mw_prefix.external_user_pk PRIMARY KEY (eu_local_id);
-CREATE UNIQUE INDEX &mw_prefix.external_user_u01 ON &mw_prefix.external_user (eu_external_id);
-
 CREATE TABLE &mw_prefix.langlinks (
   ll_from    NUMBER  NOT NULL,
   ll_lang    VARCHAR2(20),
@@ -529,12 +522,12 @@ CREATE TABLE &mw_prefix.job (
   job_namespace  NUMBER  DEFAULT 0 NOT NULL,
   job_title      VARCHAR2(255)      NOT NULL,
   job_timestamp         TIMESTAMP(6) WITH TIME ZONE NULL,
-  job_params     CLOB      NOT NULL
-  job_random NUMBER NOT NULL default 0,
+  job_params     CLOB      NOT NULL,
+  job_random NUMBER DEFAULT 0 NOT NULL,
   job_token VARCHAR2(32),
   job_token_timestamp TIMESTAMP(6) WITH TIME ZONE,
   job_sha1 VARCHAR2(32),
-  job_attempts NUMBER NOT NULL default 0
+  job_attempts NUMBER DEFAULT 0 NOT NULL
 );
 ALTER TABLE &mw_prefix.job ADD CONSTRAINT &mw_prefix.job_pk PRIMARY KEY (job_id);
 CREATE INDEX &mw_prefix.job_i01 ON &mw_prefix.job (job_cmd, job_namespace, job_title);
@@ -643,10 +636,11 @@ ALTER TABLE &mw_prefix.valid_tag ADD CONSTRAINT &mw_prefix.valid_tag_pk PRIMARY
 
 -- This table is not used unless profiling is turned on
 --CREATE TABLE &mw_prefix.profiling (
---  pf_count   NUMBER         DEFAULT 0 NOT NULL,
---  pf_time    NUMERIC(18,10)  DEFAULT 0 NOT NULL,
---  pf_name    CLOB            NOT NULL,
---  pf_server  CLOB            NULL
+--  pf_count   NUMBER          DEFAULT 0 NOT NULL,
+--  pf_time    NUMBER(18,10)   DEFAULT 0 NOT NULL,
+--  pf_memory  NUMBER(18,10)   DEFAULT 0 NOT NULL,
+--  pf_name    VARCHAR2(255),
+--  pf_server  VARCHAR2(30)
 --);
 --CREATE UNIQUE INDEX &mw_prefix.profiling_u01 ON &mw_prefix.profiling (pf_name, pf_server);
 
@@ -710,7 +704,7 @@ CREATE TABLE &mw_prefix.site_identifiers (
   si_type VARCHAR2(32) NOT NULL,
   si_key VARCHAR2(32) NOT NULL
 );
-CREATE UNIQUE INDEX &mw_prefix.site_identifiers_u01 ON &mw_prefix.sites (si_type, si_key);
+CREATE UNIQUE INDEX &mw_prefix.site_identifiers_u01 ON &mw_prefix.site_identifiers (si_type, si_key);
 CREATE INDEX &mw_prefix.site_identifiers_i01 ON &mw_prefix.site_identifiers (si_site);
 CREATE INDEX &mw_prefix.site_identifiers_i02 ON &mw_prefix.site_identifiers (si_key);
 
index 3b1a9b0..b4d255a 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that looks for 'orphan' revisions hooked to pages which
@@ -171,7 +171,7 @@ class Orphans extends Maintenance {
         */
        private function checkSeparation( $fix ) {
                $dbw = wfGetDB( DB_MASTER );
-               $page     = $dbw->tableName( 'page' );
+               $page = $dbw->tableName( 'page' );
                $revision = $dbw->tableName( 'revision' );
 
                if ( $fix ) {
@@ -209,7 +209,7 @@ class Orphans extends Maintenance {
                                                        'revision',
                                                        'rev_id',
                                                        array(
-                                                               'rev_page'      => $row->page_id,
+                                                               'rev_page' => $row->page_id,
                                                                'rev_timestamp' => $row2->max_timestamp ) );
                                                $this->output( "... updating to revision $maxId\n" );
                                                $maxRev = Revision::newFromId( $maxId );
@@ -239,4 +239,4 @@ class Orphans extends Maintenance {
 }
 
 $maintClass = "Orphans";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 58e76b0..3ac7a28 100644 (file)
@@ -49,7 +49,7 @@
  * @license GNU General Public License 2.0 or later
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to parse some wikitext.
@@ -85,12 +85,12 @@ class CLIParser extends Maintenance {
         */
        protected function Wikitext() {
 
-               $php_stdin  = 'php://stdin';
+               $php_stdin = 'php://stdin';
                $input_file = $this->getArg( 0, $php_stdin );
 
-               if( $input_file === $php_stdin ) {
+               if ( $input_file === $php_stdin ) {
                        $ctrl = wfIsWindows() ? 'CTRL+Z' : 'CTRL+D';
-                       $this->error( basename(__FILE__) .": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
+                       $this->error( basename( __FILE__ ) . ": warning: reading wikitext from STDIN. Press $ctrl to parse.\n" );
                }
 
                return file_get_contents( $input_file );
@@ -113,7 +113,7 @@ class CLIParser extends Maintenance {
                $title =
                        $this->getOption( 'title' )
                        ? $this->getOption( 'title' )
-                       : 'CLIParser' ;
+                       : 'CLIParser';
                return Title::newFromText( $title );
        }
 
@@ -131,4 +131,4 @@ class CLIParser extends Maintenance {
 }
 
 $maintClass = "CLIParser";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1f39355..31ce156 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that manually runs an SQL patch outside of the general updaters.
@@ -62,4 +62,4 @@ class PatchSql extends Maintenance {
 }
 
 $maintClass = "PatchSql";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ae54d69..4c8cdaa 100644 (file)
@@ -22,7 +22,7 @@
  * @author Simetrical
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Mainteance script to populate the category table.
@@ -142,4 +142,4 @@ TEXT;
 }
 
 $maintClass = "PopulateCategory";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 27e692d..c579d4f 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once dirname( __FILE__ ) . '/Maintenance.php';
 
 /**
  * Maintenance script to populate the fa_sha1 field.
@@ -86,7 +86,7 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
                        }
 
                        $done += $i;
-                       if( $i !== $batchSize ) {
+                       if ( $i !== $batchSize ) {
                                break;
                        }
 
@@ -94,7 +94,7 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
                        $this->output( sprintf(
                                "id %d done (up to %d), %5.3f%%  \r", $lastId, $endId, $lastId / $endId * 100 ) );
                        wfWaitForSlaves();
-               } while( true );
+               } while ( true );
 
                $processingTime = microtime( true ) - $startTime;
                $this->output( sprintf( "\nDone %d files in %.1f seconds\n", $done, $processingTime ) );
@@ -104,4 +104,4 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateFilearchiveSha1";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 37429a3..126d22d 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to populate the img_sha1 field.
@@ -164,4 +164,4 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateImageSha1";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 99d8155..d65635e 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that makes the required database updates for populating the
@@ -75,7 +75,9 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                                if ( LogEventsList::typeAction( $row, $delTypes, 'revision' ) ) {
                                        $params = LogPage::extractParams( $row->log_params );
                                        // Param format: <urlparam> <item CSV> [<ofield> <nfield>]
-                                       if ( count( $params ) < 2 ) continue; // bad row?
+                                       if ( count( $params ) < 2 ) {
+                                               continue; // bad row?
+                                       }
                                        $field = RevisionDeleter::getRelationType( $params[0] );
                                        // B/C, the params may start with a title key (<title> <urlparam> <CSV>)
                                        if ( $field == null ) {
@@ -97,8 +99,9 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                                        $log->addRelations( $field, $items, $row->log_id );
                                        // Determine what table to query...
                                        $prefix = substr( $field, 0, strpos( $field, '_' ) ); // db prefix
-                                       if ( !isset( self::$tableMap[$prefix] ) )
+                                       if ( !isset( self::$tableMap[$prefix] ) ) {
                                                continue; // bad row?
+                                       }
                                        $table = self::$tableMap[$prefix];
                                        $userField = $prefix . '_user';
                                        $userTextField = $prefix . '_user_text';
@@ -109,10 +112,11 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                                                array( $field => $items )
                                        );
                                        foreach ( $sres as $srow ) {
-                                               if ( $srow->$userField > 0 )
+                                               if ( $srow->$userField > 0 ) {
                                                        $userIds[] = intval( $srow->$userField );
-                                               elseif ( $srow->$userTextField != '' )
+                                               } elseif ( $srow->$userTextField != '' ) {
                                                        $userIPs[] = $srow->$userTextField;
+                                               }
                                        }
                                        // Add item author relations...
                                        $log->addRelations( 'target_author_id', $userIds, $row->log_id );
@@ -121,7 +125,9 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                                } elseif ( LogEventsList::typeAction( $row, $delTypes, 'event' ) ) {
                                        $params = LogPage::extractParams( $row->log_params );
                                        // Param format: <item CSV> [<ofield> <nfield>]
-                                       if ( count( $params ) < 1 ) continue; // bad row
+                                       if ( count( $params ) < 1 ) {
+                                               continue; // bad row
+                                       }
                                        $items = explode( ',', $params[0] );
                                        $log = new LogPage( $row->log_type );
                                        // Add item relations...
@@ -133,10 +139,11 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                                                array( 'log_id' => $items )
                                        );
                                        foreach ( $sres as $srow ) {
-                                               if ( $srow->log_user > 0 )
+                                               if ( $srow->log_user > 0 ) {
                                                        $userIds[] = intval( $srow->log_user );
-                                               elseif ( IP::isIPAddress( $srow->log_user_text ) )
+                                               } elseif ( IP::isIPAddress( $srow->log_user_text ) ) {
                                                        $userIPs[] = $srow->log_user_text;
+                                               }
                                        }
                                        $log->addRelations( 'target_author_id', $userIds, $row->log_id );
                                        $log->addRelations( 'target_author_ip', $userIPs, $row->log_id );
@@ -152,4 +159,4 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateLogSearch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index fa9d512..e579e52 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that makes the required database updates for
@@ -82,4 +82,4 @@ class PopulateLogUsertext extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateLogUsertext";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index e81d4ff..e29fa5f 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that makes the required database updates for rev_parent_id
@@ -98,8 +98,9 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                                        }
                                }
                                $previousID = intval( $previousID );
-                               if ( $previousID != $row->rev_parent_id )
+                               if ( $previousID != $row->rev_parent_id ) {
                                        $changed++;
+                               }
                                # Update the row...
                                $db->update( 'revision',
                                        array( 'rev_parent_id' => $previousID ),
@@ -117,4 +118,4 @@ class PopulateParentId extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateParentId";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1572869..3c69125 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that populates the rev_len field for old revisions
@@ -48,7 +48,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                $db = $this->getDB( DB_MASTER );
                if ( !$db->tableExists( 'revision' ) ) {
                        $this->error( "revision table does not exist", true );
-               } else if ( !$db->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) {
+               } elseif ( !$db->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) {
                        $this->output( "rev_len column does not exist\n\n", true );
                        return false;
                }
@@ -70,12 +70,16 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                $fields = Revision::selectFields();
                while ( $blockStart <= $end ) {
                        $this->output( "...doing rev_id from $blockStart to $blockEnd\n" );
-                       $res = $db->select( 'revision',
-                                               $fields,
-                                               array( "rev_id >= $blockStart",
-                                                  "rev_id <= $blockEnd",
-                                                  "rev_len IS NULL" ),
-                                               __METHOD__ );
+                       $res = $db->select(
+                               'revision',
+                               $fields,
+                               array(
+                                       "rev_id >= $blockStart",
+                                       "rev_id <= $blockEnd",
+                                       "rev_len IS NULL"
+                               ),
+                               __METHOD__
+                       );
                        # Go through and update rev_len from these rows.
                        foreach ( $res as $row ) {
                                $rev = new Revision( $row );
@@ -105,4 +109,4 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateRevisionLength";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 113eef4..89bfb85 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that fills the rev_sha1 and ar_sha1 columns of revision
@@ -48,7 +48,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $this->error( "revision table does not exist", true );
                } elseif ( !$db->tableExists( 'archive' ) ) {
                        $this->error( "archive table does not exist", true );
-               } else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
+               } elseif ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
                        $this->output( "rev_sha1 column does not exist\n\n", true );
                        return false;
                }
@@ -189,9 +189,9 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                                array( 'ar_sha1' => Revision::base36Sha1( $text ) ),
                                array(
                                        'ar_namespace' => $row->ar_namespace,
-                                       'ar_title'     => $row->ar_title,
+                                       'ar_title' => $row->ar_title,
                                        'ar_timestamp' => $row->ar_timestamp,
-                                       'ar_len'       => $row->ar_len // extra sanity
+                                       'ar_len' => $row->ar_len // extra sanity
                                ),
                                __METHOD__
                        );
@@ -201,4 +201,4 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
 }
 
 $maintClass = "PopulateRevisionSha1";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/postgres/archives/patch-external_user.sql b/maintenance/postgres/archives/patch-external_user.sql
deleted file mode 100644 (file)
index 6058a70..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE external_user (
-  eu_local_id     INTEGER  NOT NULL  PRIMARY KEY,
-  eu_external_id TEXT
-);
-
-CREATE UNIQUE INDEX eu_external_id ON external_user (eu_external_id);
diff --git a/maintenance/postgres/archives/patch-kill-iwl_pft.sql b/maintenance/postgres/archives/patch-kill-iwl_pft.sql
deleted file mode 100644 (file)
index 4419d9e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill the old iwl_prefix_from_title index, which may be present on some
--- installs if they ran update.php between it being added and being renamed
---
-
-DROP INDEX iwl_prefix_from_title;
-
index a4bdb6a..0eb792e 100644 (file)
@@ -1,2 +1,2 @@
 DROP INDEX iwl_prefix;
-CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_from, iwl_title);
+CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
index 9cbabfd..30a8e1b 100644 (file)
@@ -232,13 +232,6 @@ CREATE TABLE externallinks (
 CREATE INDEX externallinks_from_to ON externallinks (el_from,el_to);
 CREATE INDEX externallinks_index   ON externallinks (el_index);
 
-CREATE TABLE external_user (
-  eu_local_id     INTEGER  NOT NULL  PRIMARY KEY,
-  eu_external_id TEXT
-);
-
-CREATE UNIQUE INDEX eu_external_id ON external_user (eu_external_id);
-
 CREATE TABLE langlinks (
   ll_from    INTEGER  NOT NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
   ll_lang    TEXT,
@@ -679,6 +672,7 @@ CREATE TABLE iwlinks (
 );
 CREATE UNIQUE INDEX iwl_from ON iwlinks (iwl_from, iwl_prefix, iwl_title);
 CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE UNIQUE INDEX iwl_prefix_from_title ON iwlinks (iwl_prefix, iwl_from, iwl_title);
 
 CREATE TABLE msg_resource (
   mr_resource   TEXT         NOT NULL,
index bb3d68b..0dc19e2 100644 (file)
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/dumpIterator.php' );
+require_once __DIR__ . '/dumpIterator.php';
 
 /**
  * Maintenance script that takes page text out of an XML dump file and
@@ -86,12 +86,11 @@ class PreprocessDump extends DumpIterator {
 
                try {
                        $this->mPreprocessor->preprocessToObj( strval( $content->getNativeData() ), 0 );
-               }
-               catch(Exception $e) {
-                       $this->error("Caught exception " . $e->getMessage() . " in " . $rev->getTitle()->getPrefixedText() );
+               } catch ( Exception $e ) {
+                       $this->error( "Caught exception " . $e->getMessage() . " in " . $rev->getTitle()->getPrefixedText() );
                }
        }
 }
 
 $maintClass = "PreprocessDump";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 49c7aee..563ea45 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 $wgHooks['BeforeParserFetchTemplateAndtitle'][] = 'PPFuzzTester::templateHook';
 
@@ -29,7 +29,7 @@ class PPFuzzTester {
        public $hairs = array(
                '[[', ']]', '{{', '{{', '}}', '}}', '{{{', '}}}',
                '<', '>', '<nowiki', '<gallery', '</nowiki>', '</gallery>', '<nOwIkI>', '</NoWiKi>',
-               '<!--' , '-->',
+               '<!--', '-->',
                "\n==", "==\n",
                '|', '=', "\n", ' ', "\t", "\x7f",
                '~~', '~~~', '~~~~', 'subst:',
index ff13bd6..ec03f93 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that protects or unprotects a page.
@@ -67,7 +67,7 @@ class Protect extends Maintenance {
                }
 
                $restrictions = array();
-               foreach( $t->getRestrictionTypes() as $type ) {
+               foreach ( $t->getRestrictionTypes() as $type ) {
                        $restrictions[$type] = $protection;
                }
 
@@ -86,4 +86,4 @@ class Protect extends Maintenance {
 }
 
 $maintClass = "Protect";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2ccf703..b52f20f 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( 1 );
 }
 
@@ -42,12 +42,12 @@ if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $
        $ip = $argv[1];
        $port = $argv[2];
        $url = $argv[3];
-       $host = trim(`hostname`);
+       $host = trim( `hostname` );
        $output = "Connecting to $ip:$port, target $url, this hostname $host\n";
 
        # Open socket
-       $sock = @fsockopen($ip, $port, $errno, $errstr, 5);
-       if ($errno == 0 ) {
+       $sock = @fsockopen( $ip, $port, $errno, $errstr, 5 );
+       if ( $errno == 0 ) {
                $output .= "Connected\n";
                # Send payload
                $request = "GET $url HTTP/1.0\r\n";
@@ -56,10 +56,10 @@ if ( ( isset( $_REQUEST ) && array_key_exists( 'argv', $_REQUEST ) ) || count( $
 #              $request .= "Host: ".$url."\r\n";
 #              $request .= "User-Agent: MediaWiki open proxy check\r\n";
                $request .= "\r\n";
-               @fputs($sock, $request);
-               $response = fgets($sock, 65536);
+               @fputs( $sock, $request );
+               $response = fgets( $sock, 65536 );
                $output .= $response;
-               @fclose($sock);
+               @fclose( $sock );
        } else {
                $output .= "No connection\n";
        }
index e058e3e..48d3897 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that prunes file cache for pages, objects, resources, etc.
@@ -108,4 +108,4 @@ class PruneFileCache extends Maintenance {
 }
 
 $maintClass = "PruneFileCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index cd62716..32b6569 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that scans the deletion log and purges affected files
@@ -53,8 +53,8 @@ class PurgeDeletedFiles extends Maintenance {
 
                $conds = array(
                        'log_namespace' => NS_FILE,
-                       'log_type'      => $logType,
-                       'log_action'    => array( 'delete', 'revision' )
+                       'log_type' => $logType,
+                       'log_action' => array( 'delete', 'revision' )
                );
                $start = $this->getOption( 'starttime' );
                if ( $start ) {
@@ -93,4 +93,4 @@ class PurgeDeletedFiles extends Maintenance {
 }
 
 $maintClass = "PurgeDeletedFiles";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index b72c417..2f89520 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that sends purge requests for listed pages to squid.
@@ -44,7 +44,7 @@ class PurgeList extends Maintenance {
                if ( $this->hasOption( 'all' ) ) {
                        $this->purgeNamespace( false );
                } elseif ( $this->hasOption( 'namespace' ) ) {
-                       $this->purgeNamespace( intval( $this->getOption( 'namespace') ) );
+                       $this->purgeNamespace( intval( $this->getOption( 'namespace' ) ) );
                } else {
                        $this->doPurge();
                }
@@ -63,7 +63,7 @@ class PurgeList extends Maintenance {
                        } elseif ( $page !== '' ) {
                                $title = Title::newFromText( $page );
                                if ( $title ) {
-                                       $url = $title->getInternalUrl();
+                                       $url = $title->getInternalURL();
                                        $this->output( "$url\n" );
                                        $urls[] = $url;
                                        if ( $this->getOption( 'purge' ) ) {
@@ -74,7 +74,7 @@ class PurgeList extends Maintenance {
                                }
                        }
                }
-               $this->output( "Purging " . count( $urls ). " urls\n" );
+               $this->output( "Purging " . count( $urls ) . " urls\n" );
                $this->sendPurgeRequest( $urls );
        }
 
@@ -88,7 +88,7 @@ class PurgeList extends Maintenance {
                        $conds = array( 'page_namespace' => $namespace );
                }
                while ( true ) {
-                       $res = $dbr->select( 'page', 
+                       $res = $dbr->select( 'page',
                                array( 'page_id', 'page_namespace', 'page_title' ),
                                $conds + array( 'page_id > ' . $dbr->addQuotes( $startId ) ),
                                __METHOD__,
@@ -104,7 +104,7 @@ class PurgeList extends Maintenance {
                        $urls = array();
                        foreach ( $res as $row ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $url = $title->getInternalUrl();
+                               $url = $title->getInternalURL();
                                $urls[] = $url;
                                $startId = $row->page_id;
                        }
@@ -129,7 +129,7 @@ class PurgeList extends Maintenance {
                        }
                } else {
                        if ( $this->hasOption( 'verbose' ) ) {
-                               $this->output( implode( "\n", $urls ) . "\n"  );
+                               $this->output( implode( "\n", $urls ) . "\n" );
                        }
                        $u = new SquidUpdate( $urls );
                        $u->doUpdate();
@@ -139,4 +139,4 @@ class PurgeList extends Maintenance {
 }
 
 $maintClass = "PurgeList";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 111c786..db961d8 100644 (file)
@@ -34,42 +34,42 @@ function PurgeRedundantText( $delete = false ) {
        $tbl_txt = $dbw->tableName( 'text' );
 
        # Get "active" text records from the revisions table
-       echo( "Searching for active text records in revisions table..." );
+       echo "Searching for active text records in revisions table...";
        $res = $dbw->query( "SELECT DISTINCT rev_text_id FROM $tbl_rev" );
        foreach ( $res as $row ) {
                $cur[] = $row->rev_text_id;
        }
-       echo( "done.\n" );
+       echo "done.\n";
 
        # Get "active" text records from the archive table
-       echo( "Searching for active text records in archive table..." );
+       echo "Searching for active text records in archive table...";
        $res = $dbw->query( "SELECT DISTINCT ar_text_id FROM $tbl_arc" );
        $cur = array();
        foreach ( $res as $row ) {
                $cur[] = $row->ar_text_id;
        }
-       echo( "done.\n" );
+       echo "done.\n";
 
        # Get the IDs of all text records not in these sets
-       echo( "Searching for inactive text records..." );
+       echo "Searching for inactive text records...";
        $set = implode( ', ', $cur );
        $res = $dbw->query( "SELECT old_id FROM $tbl_txt WHERE old_id NOT IN ( $set )" );
        $old = array();
        foreach ( $res as $row ) {
                $old[] = $row->old_id;
        }
-       echo( "done.\n" );
+       echo "done.\n";
 
        # Inform the user of what we're going to do
        $count = count( $old );
-       echo( "$count inactive items found.\n" );
+       echo "$count inactive items found.\n";
 
        # Delete as appropriate
        if ( $delete && $count ) {
-               echo( "Deleting..." );
+               echo "Deleting...";
                $set = implode( ', ', $old );
                $dbw->query( "DELETE FROM $tbl_txt WHERE old_id IN ( $set )" );
-               echo( "done.\n" );
+               echo "done.\n";
        }
 
        # Done
index 1f0b063..3d81e2d 100644 (file)
@@ -22,7 +22,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that purges old text records from the database.
@@ -42,4 +42,4 @@ class PurgeOldText extends Maintenance {
 }
 
 $maintClass = "PurgeOldText";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index e21dd17..ca2a041 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require( __DIR__ . '/Maintenance.php' );
+require __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to remove old objects from the parser cache.
@@ -81,4 +81,4 @@ class PurgeParserCache extends Maintenance {
        }
 }
 $maintClass = 'PurgeParserCache';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2d79f36..7e15c09 100644 (file)
@@ -23,7 +23,7 @@
  * @licence GNU General Public Licence 2.0 or later
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that reassigns edits from a user or IP address
@@ -46,7 +46,7 @@ class ReassignEdits extends Maintenance {
                if ( $this->hasArg( 0 ) && $this->hasArg( 1 ) ) {
                        # Set up the users involved
                        $from = $this->initialiseUser( $this->getArg( 0 ) );
-                       $to   = $this->initialiseUser( $this->getArg( 1 ) );
+                       $to = $this->initialiseUser( $this->getArg( 1 ) );
 
                        # If the target doesn't exist, and --force is not set, stop here
                        if ( $to->getId() || $this->hasOption( 'force' ) ) {
@@ -179,4 +179,4 @@ class ReassignEdits extends Maintenance {
 }
 
 $maintClass = "ReassignEdits";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 3165b97..12ed9fa 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that builds file cache for content pages.
@@ -153,10 +153,11 @@ class RebuildFileCache extends Maintenance {
                $this->output( "Done!\n" );
 
                // Remove these to be safe
-               if ( isset( $wgTitle ) )
+               if ( isset( $wgTitle ) ) {
                        unset( $wgTitle );
+               }
        }
 }
 
 $maintClass = "RebuildFileCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2842b40..53bf823 100644 (file)
@@ -30,7 +30,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to update image metadata records.
@@ -217,4 +217,4 @@ class ImageBuilder extends Maintenance {
 }
 
 $maintClass = 'ImageBuilder';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index db77564..ee6ddbb 100644 (file)
@@ -29,7 +29,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to rebuild the localisation cache.
@@ -44,6 +44,8 @@ class RebuildLocalisationCache extends Maintenance {
                $this->addOption( 'threads', 'Fork more than one thread', false, true );
                $this->addOption( 'outdir', 'Override the output directory (normally $wgCacheDirectory)',
                        false, true );
+               $this->addOption( 'lang', 'Only rebuild these languages, comma separated.',
+                       false, true );
        }
 
        public function memoryLimit() {
@@ -90,7 +92,19 @@ class RebuildLocalisationCache extends Maintenance {
                }
                $lc = new LocalisationCache_BulkLoad( $conf );
 
-               $codes = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) );
+               $allCodes = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) );
+               if ( $this->hasOption( 'lang' ) ) {
+                       # Validate requested languages
+                       $codes = array_intersect( $allCodes,
+                               explode( ',', $this->getOption( 'lang' ) ) );
+                       # Bailed out if nothing is left
+                       if ( count( $codes ) == 0 ) {
+                               $this->error( 'None of the languages specified exists.', 1 );
+                       }
+               } else {
+                       # By default get all languages
+                       $codes = $allCodes;
+               }
                sort( $codes );
 
                // Initialise and split into chunks
@@ -162,4 +176,4 @@ class RebuildLocalisationCache extends Maintenance {
 }
 
 $maintClass = "RebuildLocalisationCache";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 882ae1b..54444e9 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that rebuilds link tracking tables from scratch.
@@ -58,4 +58,4 @@ class RebuildAll extends Maintenance {
 }
 
 $maintClass = "RebuildAll";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index a70e591..f223f1a 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that purges all languages from the message cache.
@@ -45,12 +45,13 @@ class RebuildMessages extends Maintenance {
                foreach ( $databases as $db ) {
                        $this->output( "Deleting message cache for {$db}... " );
                        $messageMemc->delete( "{$db}:messages" );
-                       if ( $wgEnableSidebarCache )
+                       if ( $wgEnableSidebarCache ) {
                                $messageMemc->delete( "{$db}:sidebar" );
+                       }
                        $this->output( "Deleted\n" );
                }
        }
 }
 
 $maintClass = "RebuildMessages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index bfaaab5..1834825 100644 (file)
@@ -23,7 +23,7 @@
  * @todo Document
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that rebuilds recent changes from scratch.
@@ -61,9 +61,9 @@ class RebuildRecentchanges extends Maintenance {
                $this->output( '$wgRCMaxAge=' . $wgRCMaxAge );
                $days = $wgRCMaxAge / 24 / 3600;
                if ( intval( $days ) == $days ) {
-                               $this->output( " (" . $days . " days)\n" );
+                       $this->output( " (" . $days . " days)\n" );
                } else {
-                               $this->output( " (approx. " .  intval( $days ) . " days)\n" );
+                       $this->output( " (approx. " . intval( $days ) . " days)\n" );
                }
 
                $cutoff = time() - $wgRCMaxAge;
@@ -99,13 +99,13 @@ class RebuildRecentchanges extends Maintenance {
         */
        private function rebuildRecentChangesTablePass2() {
                $dbw = wfGetDB( DB_MASTER );
-               list ( $recentchanges, $revision ) = $dbw->tableNamesN( 'recentchanges', 'revision' );
+               list( $recentchanges, $revision ) = $dbw->tableNamesN( 'recentchanges', 'revision' );
 
                $this->output( "Updating links and size differences...\n" );
 
                # Fill in the rc_last_oldid field, which points to the previous edit
                $sql = "SELECT rc_cur_id,rc_this_oldid,rc_timestamp FROM $recentchanges " .
-                 "ORDER BY rc_cur_id,rc_timestamp";
+                       "ORDER BY rc_cur_id,rc_timestamp";
                $res = $dbw->query( $sql, DB_MASTER );
 
                $lastCurId = 0;
@@ -142,12 +142,12 @@ class RebuildRecentchanges extends Maintenance {
                                $dbw->update( 'recentchanges',
                                        array(
                                                'rc_last_oldid' => $lastOldId,
-                                               'rc_new'        => $new,
-                                               'rc_type'       => $new,
-                                               'rc_old_len'    => $lastSize,
-                                               'rc_new_len'    => $size,
+                                               'rc_new' => $new,
+                                               'rc_type' => $new,
+                                               'rc_old_len' => $lastSize,
+                                               'rc_new_len' => $size,
                                        ), array(
-                                               'rc_cur_id'     => $lastCurId,
+                                               'rc_cur_id' => $lastCurId,
                                                'rc_this_oldid' => $obj->rc_this_oldid,
                                        ),
                                        __METHOD__
@@ -292,4 +292,4 @@ class RebuildRecentchanges extends Maintenance {
 }
 
 $maintClass = "RebuildRecentchanges";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 534b7ca..a31aba2 100644 (file)
@@ -25,7 +25,7 @@
  * @todo document
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that rebuilds search index table from scratch.
@@ -147,7 +147,7 @@ class RebuildTextIndex extends Maintenance {
                $searchindex = $this->db->tableName( 'searchindex' );
                $this->output( "\nRebuild the index...\n" );
                $sql = "ALTER TABLE $searchindex ADD FULLTEXT si_title (si_title), " .
-                 "ADD FULLTEXT si_text (si_text)";
+                       "ADD FULLTEXT si_text (si_text)";
                $this->db->query( $sql, __METHOD__ );
        }
 
@@ -162,4 +162,4 @@ class RebuildTextIndex extends Maintenance {
 }
 
 $maintClass = "RebuildTextIndex";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 74f0f35..8b852e3 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to refresh file headers from metadata
@@ -90,4 +90,4 @@ class RefreshFileHeaders extends Maintenance {
 }
 
 $maintClass = 'RefreshFileHeaders';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 55f5b4a..7fe5c4c 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to refresh image metadata fields.
@@ -99,7 +99,7 @@ class RefreshImageMetadata extends Maintenance {
 
                        if ( $res->numRows() > 0 ) {
                                $row1 = $res->current();
-                               $this->output( "Processing next {$this->mBatchSize} rows starting with {$row1->img_name}.\n");
+                               $this->output( "Processing next {$this->mBatchSize} rows starting with {$row1->img_name}.\n" );
                                $res->rewind();
                        } else {
                                $this->error( "No images to process.", 4 );
@@ -123,7 +123,7 @@ class RefreshImageMetadata extends Maintenance {
                                                $this->output( "Warning: File:{$row->img_name} used to have " .
                                                "$oldLength bytes of metadata but now has $newLength bytes.\n" );
                                        } elseif ( $verbose ) {
-                                               $this->output("Refreshed File:{$row->img_name}.\n" );
+                                               $this->output( "Refreshed File:{$row->img_name}.\n" );
                                        }
                                } else {
                                        $leftAlone++;
@@ -138,7 +138,7 @@ class RefreshImageMetadata extends Maintenance {
 
                                                }
                                                if ( $verbose ) {
-                                                       $this->output("Forcibly refreshed File:{$row->img_name}.\n" );
+                                                       $this->output( "Forcibly refreshed File:{$row->img_name}.\n" );
                                                }
                                        }
                                        else {
@@ -151,7 +151,7 @@ class RefreshImageMetadata extends Maintenance {
                        }
                        $conds2 = array( 'img_name > ' . $dbw->addQuotes( $row->img_name ) );
                        wfWaitForSlaves();
-               } while( $res->numRows() === $this->mBatchSize );
+               } while ( $res->numRows() === $this->mBatchSize );
 
                $total = $upgraded + $leftAlone;
                if ( $force ) {
@@ -173,7 +173,7 @@ class RefreshImageMetadata extends Maintenance {
                $like = $this->getOption( 'metadata-contains', false );
 
                if ( $end !== false ) {
-                       $conds[] = 'img_name <= ' . $dbw->addQuotes( $end ) ;
+                       $conds[] = 'img_name <= ' . $dbw->addQuotes( $end );
                }
                if ( $mime !== false ) {
                        list( $major, $minor ) = File::splitMime( $mime );
@@ -209,4 +209,4 @@ class RefreshImageMetadata extends Maintenance {
 
 
 $maintClass = 'RefreshImageMetadata';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 7b25566..0e6725c 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to refresh link tables.
@@ -281,12 +281,13 @@ class RefreshLinks extends Maintenance {
                        $this->output( "Retrieving illegal entries from $table... " );
 
                        // SELECT DISTINCT( $field ) FROM $table LEFT JOIN page ON $field=page_id WHERE page_id IS NULL;
-                       $results = $dbr->select( array( $table, 'page' ),
-                                                 $field,
-                                                 array( 'page_id' => null ),
-                                                 __METHOD__,
-                                                 'DISTINCT',
-                                                 array( 'page' => array( 'LEFT JOIN', "$field=page_id" ) )
+                       $results = $dbr->select(
+                               array( $table, 'page' ),
+                               $field,
+                               array( 'page_id' => null ),
+                               __METHOD__,
+                               'DISTINCT',
+                               array( 'page' => array( 'LEFT JOIN', "$field=page_id" ) )
                        );
 
                        $counter = 0;
@@ -315,4 +316,4 @@ class RefreshLinks extends Maintenance {
 }
 
 $maintClass = 'RefreshLinks';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index b4528ca..24c66b1 100644 (file)
@@ -23,7 +23,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that removes unused user accounts from the database.
@@ -77,6 +77,9 @@ class RemoveUnusedAccounts extends Maintenance {
                        $this->output( "\nDeleting inactive accounts..." );
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->delete( 'user', array( 'user_id' => $del ), __METHOD__ );
+                       $dbw->delete( 'user_groups', array( 'ug_user' => $del ), __METHOD__ );
+                       $dbw->delete( 'user_former_groups', array( 'ufg_user' => $del ), __METHOD__ );
+                       $dbw->delete( 'user_properties', array( 'up_user' => $del ), __METHOD__ );
                        $dbw->delete( 'logging', array( 'log_user' => $del ), __METHOD__ );
                        $dbw->delete( 'recentchanges', array( 'rc_user' => $del ), __METHOD__ );
                        $this->output( "done.\n" );
@@ -124,4 +127,4 @@ class RemoveUnusedAccounts extends Maintenance {
 }
 
 $maintClass = "RemoveUnusedAccounts";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 6f24479..ed9d1f5 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that changes the prefix of database tables.
@@ -91,4 +91,4 @@ class RenameDbPrefix extends Maintenance {
 }
 
 $maintClass = "RenameDbPrefix";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2ba2b3d..0cde28c 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that takes page text out of an XML dump file
@@ -69,9 +69,10 @@ class DumpRenderer extends Maintenance {
                $importer->doImport();
 
                $delta = microtime( true ) - $this->startTime;
-               $this->error( "Rendered {$this->count} pages in " . round($delta, 2) . " seconds " );
-               if ($delta > 0)
-                       $this->error( round($this->count / $delta, 2) . " pages/sec" );
+               $this->error( "Rendered {$this->count} pages in " . round( $delta, 2 ) . " seconds " );
+               if ( $delta > 0 ) {
+                       $this->error( round( $this->count / $delta, 2 ) . " pages/sec" );
+               }
                $this->error( "\n" );
        }
 
@@ -104,11 +105,10 @@ class DumpRenderer extends Maintenance {
                $output = $content->getParserOutput( $title, null, $options );
 
                file_put_contents( $filename,
-                       "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " .
-                       "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" .
-                       "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" .
+                       "<!DOCTYPE html>\n" .
+                       "<html lang=\"en\" dir=\"ltr\">\n" .
                        "<head>\n" .
-                       "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n" .
+                       "<meta charset=\"UTF-8\" />\n" .
                        "<title>" . htmlspecialchars( $display ) . "</title>\n" .
                        "</head>\n" .
                        "<body>\n" .
@@ -119,4 +119,4 @@ class DumpRenderer extends Maintenance {
 }
 
 $maintClass = "DumpRenderer";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index d7f8c6d..241d632 100644 (file)
@@ -23,7 +23,7 @@
  * @author Daniel Friesen <mediawiki@danielfriesen.name>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to reset the user_token for all users on the wiki.
@@ -75,4 +75,4 @@ class ResetUserTokens extends Maintenance {
 }
 
 $maintClass = "ResetUserTokens";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4660bce..e5e33c0 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to rollback all edits by a given user or IP provided
@@ -104,4 +104,4 @@ class RollbackEdits extends Maintenance {
 }
 
 $maintClass = 'RollbackEdits';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index e113916..93ba24a 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to run a database query in batches and wait for slaves.
@@ -38,8 +38,9 @@ class BatchedQueryRunner extends Maintenance {
        }
 
        public function execute() {
-               if ( !$this->hasArg() )
+               if ( !$this->hasArg() ) {
                        $this->error( "No query specified. Specify the query as a command line parameter.", true );
+               }
 
                $query = $this->getArg();
                $n = 1;
@@ -61,4 +62,4 @@ class BatchedQueryRunner extends Maintenance {
 
 
 $maintClass = "BatchedQueryRunner";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index b1be714..6a6f9d2 100644 (file)
@@ -25,7 +25,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that runs pending jobs.
@@ -61,10 +61,11 @@ class RunJobs extends Maintenance {
                        $procs = intval( $this->getOption( 'procs' ) );
                        if ( $procs < 1 || $procs > 1000 ) {
                                $this->error( "Invalid argument to --procs", true );
-                       }
-                       $fc = new ForkController( $procs );
-                       if ( $fc->start() != 'child' ) {
-                               exit( 0 );
+                       } elseif ( $procs != 1 ) {
+                               $fc = new ForkController( $procs );
+                               if ( $fc->start() != 'child' ) {
+                                       exit( 0 );
+                               }
                        }
                }
                $maxJobs = $this->getOption( 'maxjobs', false );
@@ -82,10 +83,11 @@ class RunJobs extends Maintenance {
                        $this->runJobsLog( "Executed $count periodic queue task(s)." );
                }
 
-               $lastTime = time();
+               $flags = JobQueueGroup::USE_CACHE | JobQueueGroup::USE_PRIORITY;
+               $lastTime = time(); // time since last slave check
                do {
                        $job = ( $type === false )
-                               ? $group->pop( JobQueueGroup::TYPE_DEFAULT, JobQueueGroup::USE_CACHE )
+                               ? $group->pop( JobQueueGroup::TYPE_DEFAULT, $flags )
                                : $group->pop( $type ); // job from a single queue
                        if ( $job ) { // found a job
                                ++$jobsRun;
@@ -93,13 +95,16 @@ class RunJobs extends Maintenance {
 
                                // Run the job...
                                $t = microtime( true );
+                               wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
                                try {
                                        $status = $job->run();
                                        $error = $job->getLastError();
                                } catch ( MWException $e ) {
                                        $status = false;
                                        $error = get_class( $e ) . ': ' . $e->getMessage();
+                                       wfDebugLog( 'exception', $e->getLogMessage() );
                                }
+                               wfProfileOut( __METHOD__ . '-' . get_class( $job ) );
                                $timeMs = intval( ( microtime( true ) - $t ) * 1000 );
 
                                // Mark the job as done on success or when the job cannot be retried
@@ -107,7 +112,7 @@ class RunJobs extends Maintenance {
                                        $group->ack( $job ); // done
                                }
 
-                               if ( !$status ) {
+                               if ( $status === false ) {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs error={$error}" );
                                } else {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs good" );
@@ -124,6 +129,7 @@ class RunJobs extends Maintenance {
                                $timePassed = time() - $lastTime;
                                if ( $timePassed >= 5 || $timePassed < 0 ) {
                                        wfWaitForSlaves();
+                                       $lastTime = time();
                                }
                                // Don't let any queue slaves/backups fall behind
                                if ( $jobsRun > 0 && ( $jobsRun % 100 ) == 0 ) {
@@ -144,4 +150,4 @@ class RunJobs extends Maintenance {
 }
 
 $maintClass = "RunJobs";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 8f23868..cd9768d 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that shows statistics from the cache.
@@ -103,4 +103,4 @@ class ShowCacheStats extends Maintenance {
 }
 
 $maintClass = "ShowCacheStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 8b49517..322a849 100644 (file)
@@ -25,7 +25,7 @@
  * @author Antoine Musso
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that reports the number of jobs currently waiting
@@ -44,11 +44,16 @@ class ShowJobs extends Maintenance {
                $group = JobQueueGroup::singleton();
                if ( $this->hasOption( 'group' ) ) {
                        foreach ( $group->getQueueTypes() as $type ) {
-                               $queue   = $group->get( $type );
+                               $queue = $group->get( $type );
                                $pending = $queue->getSize();
                                $claimed = $queue->getAcquiredCount();
+                               $abandoned = $queue->getAbandonedCount();
+                               $active = ( $claimed - $abandoned );
                                if ( ( $pending + $claimed ) > 0 ) {
-                                       $this->output( "{$type}: $pending queued; $claimed acquired\n" );
+                                       $this->output(
+                                               "{$type}: $pending queued; " .
+                                               "$claimed claimed ($active active, $abandoned abandoned)\n"
+                                       );
                                }
                        }
                } else {
@@ -62,4 +67,4 @@ class ShowJobs extends Maintenance {
 }
 
 $maintClass = "ShowJobs";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index e7359b2..49148b3 100644 (file)
@@ -29,7 +29,7 @@
  * @license GNU General Public License 2.0 or later
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to show the cached statistics.
@@ -48,6 +48,7 @@ class ShowSiteStats extends Maintenance {
                        'ss_good_articles' => 'Number of articles',
                        'ss_total_pages' => 'Total pages',
                        'ss_users' => 'Number of users',
+                       'ss_active_users' => 'Active users',
                        'ss_images' => 'Number of images',
                );
 
@@ -59,7 +60,7 @@ class ShowSiteStats extends Maintenance {
                $max_length_value = $max_length_desc = 0;
                foreach ( $fields as $field => $desc ) {
                        $max_length_value = max( $max_length_value, strlen( $stats->$field ) );
-                       $max_length_desc  = max( $max_length_desc,  strlen( $desc ) ) ;
+                       $max_length_desc = max( $max_length_desc, strlen( $desc ) );
                }
 
                // Show them
@@ -70,4 +71,4 @@ class ShowSiteStats extends Maintenance {
 }
 
 $maintClass = "ShowSiteStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1169990..216db93 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that sends SQL queries from the specified file to the database.
@@ -70,9 +70,9 @@ class MwSql extends Maintenance {
 
                $wholeLine = '';
                $newPrompt = '> ';
-               $prompt    = $newPrompt;
+               $prompt = $newPrompt;
                while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) {
-                       if( !$line ) {
+                       if ( !$line ) {
                                # User simply pressed return key
                                continue;
                        }
@@ -91,12 +91,12 @@ class MwSql extends Maintenance {
                                readline_add_history( $wholeLine . $dbw->getDelimiter() );
                                readline_write_history( $historyFile );
                        }
-                       try{
+                       try {
                                $res = $dbw->query( $wholeLine );
                                $this->sqlPrintResult( $res, $dbw );
-                               $prompt    = $newPrompt;
+                               $prompt = $newPrompt;
                                $wholeLine = '';
-                       } catch (DBQueryError $e) {
+                       } catch ( DBQueryError $e ) {
                                $doDie = ! Maintenance::posix_isatty( 0 );
                                $this->error( $e, $doDie );
                        }
@@ -132,4 +132,4 @@ class MwSql extends Maintenance {
 }
 
 $maintClass = "MwSql";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 16568ac..49f4e00 100644 (file)
@@ -73,7 +73,9 @@ class Sqlite {
 
                        $tables = $db->query( "SELECT name FROM sqlite_master WHERE type='table'", __METHOD__ );
                        foreach ( $tables as $table ) {
-                               if ( strpos( $table->name, 'sqlite_' ) === 0 ) continue;
+                               if ( strpos( $table->name, 'sqlite_' ) === 0 ) {
+                                       continue;
+                               }
 
                                $columns = $db->query( "PRAGMA table_info({$table->name})", __METHOD__ );
                                foreach ( $columns as $col ) {
@@ -89,4 +91,4 @@ class Sqlite {
                $db->close();
                return true;
        }
- };
+};
index 4085c59..8a78524 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that performs some operations specific to SQLite database backend.
@@ -137,4 +137,4 @@ class SqliteMaintenance extends Maintenance {
 }
 
 $maintClass = "SqliteMaintenance";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/sqlite/archives/patch-kill-iwl_pft.sql b/maintenance/sqlite/archives/patch-kill-iwl_pft.sql
deleted file mode 100644 (file)
index 8fc4b5c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---
--- Kill the old iwl_prefix_from_title index, which may be present on some
--- installs if they ran update.php between it being added and being renamed
---
-
-DROP INDEX IF EXISTS /*i*/iwl_prefix;
-
index fd4c9ec..6d5b1bf 100644 (file)
@@ -2,4 +2,4 @@
 -- Recreates the iwl_prefix for the iwlinks table
 --
 DROP INDEX IF EXISTS /*i*/iwl_prefix;
-CREATE INDEX IF NOT EXISTS /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
+CREATE INDEX IF NOT EXISTS /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
index fd9393f..03dc113 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 if ( !defined( 'MEDIAWIKI' ) ) {
-       require_once( __DIR__ . '/../commandLine.inc' );
+       require_once __DIR__ . '/../commandLine.inc';
 
        $cs = new CheckStorage;
        $fix = isset( $options['fix'] );
@@ -75,7 +75,7 @@ class CheckStorage {
                        'fixable' => array(),
                );
 
-               for ( $chunkStart = 1 ; $chunkStart < $maxRevId; $chunkStart += $chunkSize ) {
+               for ( $chunkStart = 1; $chunkStart < $maxRevId; $chunkStart += $chunkSize ) {
                        $chunkEnd = $chunkStart + $chunkSize - 1;
                        // print "$chunkStart of $maxRevId\n";
 
@@ -443,18 +443,26 @@ class CheckStorage {
 
        function importRevision( &$revision, &$importer ) {
                $id = $revision->getID();
-               $text = $revision->getText();
+               $content = $revision->getContent( Revision::RAW );
+               $id = $id ? $id : '';
+
+               if ( $content === null ) {
+                       echo "Revision $id is broken, we have no content available\n";
+                       return;
+               }
+
+               $text = $content->serialize();
                if ( $text === '' ) {
                        // This is what happens if the revision was broken at the time the
                        // dump was made. Unfortunately, it also happens if the revision was
                        // legitimately blank, so there's no way to tell the difference. To
                        // be safe, we'll skip it and leave it broken
-                       $id = $id ? $id : '';
+
                        echo "Revision $id is blank in the dump, may have been broken before export\n";
                        return;
                }
 
-               if ( !$id )  {
+               if ( !$id ) {
                        // No ID, can't import
                        echo "No id tag in revision, can't import\n";
                        return;
index d636283..8cb5548 100644 (file)
@@ -41,7 +41,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that compress the text of a wiki.
@@ -53,7 +53,7 @@ class CompressOld extends Maintenance {
         * @todo document
         */
        const LS_INDIVIDUAL = 0;
-       const LS_CHUNKED    = 1;
+       const LS_CHUNKED = 1;
 
        public function __construct() {
                parent::__construct();
@@ -113,9 +113,9 @@ class CompressOld extends Maintenance {
                $this->output( "Starting from old_id $start...\n" );
                $dbw = wfGetDB( DB_MASTER );
                do {
-                       $res = $dbw->select( 'text', array( 'old_id','old_flags','old_text' ),
+                       $res = $dbw->select( 'text', array( 'old_id', 'old_flags', 'old_text' ),
                                "old_id>=$start", __METHOD__, array( 'ORDER BY' => 'old_id', 'LIMIT' => $chunksize, 'FOR UPDATE' ) );
-                       if( $res->numRows() == 0 ) {
+                       if ( $res->numRows() == 0 ) {
                                break;
                        }
                        $last = $start;
@@ -126,7 +126,7 @@ class CompressOld extends Maintenance {
                        }
                        $start = $last + 1; # Deletion may leave long empty stretches
                        $this->output( "$start...\n" );
-               } while( true );
+               } while ( true );
        }
 
        /**
@@ -223,7 +223,7 @@ class CompressOld extends Maintenance {
                        }
                        $conds[] = "rev_timestamp>'" . $beginDate . "'";
                }
-               if ( $endDate )  {
+               if ( $endDate ) {
                        if ( !preg_match( '/^\d{14}$/', $endDate ) ) {
                                $this->error( "Invalid end date \"$endDate\"\n" );
                                return false;
@@ -254,8 +254,8 @@ class CompressOld extends Maintenance {
 
                        # Get the page row
                        $pageRes = $dbr->select( 'page',
-                               array('page_id', 'page_namespace', 'page_title','page_latest'),
-                               $pageConds + array('page_id' => $pageId), __METHOD__ );
+                               array( 'page_id', 'page_namespace', 'page_title', 'page_latest' ),
+                               $pageConds + array( 'page_id' => $pageId ), __METHOD__ );
                        if ( $pageRes->numRows() == 0 ) {
                                continue;
                        }
@@ -282,7 +282,7 @@ class CompressOld extends Maintenance {
                                $revs[] = $revRow;
                        }
 
-                       if ( count( $revs ) < 2) {
+                       if ( count( $revs ) < 2 ) {
                                # No revisions matching, no further processing
                                $this->output( "\n" );
                                continue;
@@ -351,21 +351,22 @@ class CompressOld extends Maintenance {
                                        if ( $extdb != "" ) {
                                                # Move blob objects to External Storage
                                                $stored = $storeObj->store( $extdb, serialize( $chunk ));
-                                               if ($stored === false) {
-                                                       $this->error(  "Unable to store object" );
+                                               if ( $stored === false ) {
+                                                       $this->error( "Unable to store object" );
                                                        return false;
                                                }
                                                # Store External Storage URLs instead of Stub placeholders
-                                               foreach ($stubs as $stub) {
-                                                       if ($stub===false)
+                                               foreach ( $stubs as $stub ) {
+                                                       if ( $stub === false ) {
                                                                continue;
+                                                       }
                                                        # $stored should provide base path to a BLOB
-                                                       $url = $stored."/".$stub->getHash();
+                                                       $url = $stored . "/" . $stub->getHash();
                                                        $dbw->update( 'text',
                                                                array( /* SET */
                                                                        'old_text' => $url,
                                                                        'old_flags' => 'external,utf-8',
-                                                               ), array ( /* WHERE */
+                                                               ), array( /* WHERE */
                                                                        'old_id' => $stub->getReferrer(),
                                                                )
                                                        );
@@ -387,7 +388,7 @@ class CompressOld extends Maintenance {
                                                        if ( $stubs[$j] !== false && $revs[$i + $j]->rev_text_id != $primaryOldid ) {
                                                                $dbw->update( 'text',
                                                                        array( /* SET */
-                                                                               'old_text' => serialize($stubs[$j]),
+                                                                               'old_text' => serialize( $stubs[$j] ),
                                                                                'old_flags' => 'object,utf-8',
                                                                        ), array( /* WHERE */
                                                                                'old_id' => $revs[$i + $j]->rev_text_id
@@ -411,4 +412,4 @@ class CompressOld extends Maintenance {
 }
 
 $maintClass = 'CompressOld';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 39f08f9..f12bbd1 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that gets the text of a revision,
@@ -46,7 +46,7 @@ class DumpRev extends Maintenance {
                        $this->error( "Row not found", true );
                }
 
-               $flags = explode( ',',  $row->old_flags );
+               $flags = explode( ',', $row->old_flags );
                $text = $row->old_text;
                if ( in_array( 'external', $flags ) ) {
                        $this->output( "External $text\n" );
@@ -85,4 +85,4 @@ class DumpRev extends Maintenance {
 }
 
 $maintClass = "DumpRev";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 30cbcf1..101aa06 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script to fix bug 20757.
@@ -348,4 +348,4 @@ class FixBug20757 extends Maintenance {
 }
 
 $maintClass = 'FixBug20757';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 1049e0c..348fb77 100644 (file)
@@ -24,9 +24,9 @@
 define( 'REPORTING_INTERVAL', 1 );
 
 if ( !defined( 'MEDIAWIKI' ) ) {
-       require_once( __DIR__ . '/../commandLine.inc' );
-       require_once( __DIR__ . '/../../includes/externalstore/ExternalStoreDB.php' );
-       require_once( 'resolveStubs.php' );
+       require_once __DIR__ . '/../commandLine.inc';
+       require_once __DIR__ . '/../../includes/externalstore/ExternalStoreDB.php';
+       require_once 'resolveStubs.php';
 
        $fname = 'moveToExternal';
 
index 4e24628..1df1501 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 /**
  * Maintenance script that shows some statistics on the blob_orphans table,
@@ -74,4 +74,4 @@ class OrphanStats extends Maintenance {
 }
 
 $maintClass = "OrphanStats";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 030a147..b266316 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 $optionsWithArgs = RecompressTracked::getOptionsWithArgs();
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
 
 if ( count( $args ) < 1 ) {
        echo "Usage: php recompressTracked.php [options] <cluster> [... <cluster>...]
@@ -279,7 +279,7 @@ class RecompressTracked {
         */
        function dispatchToSlave( $slaveId, $args ) {
                $args = (array)$args;
-               $cmd = implode( ' ',  $args );
+               $cmd = implode( ' ', $args );
                fwrite( $this->slavePipes[$slaveId], "$cmd\n" );
        }
 
index 414eab8..e47d640 100644 (file)
@@ -27,7 +27,7 @@ define( 'REPORTING_INTERVAL', 100 );
 if ( !defined( 'MEDIAWIKI' ) ) {
        $optionsWithArgs = array( 'm' );
 
-       require_once( __DIR__ . '/../commandLine.inc' );
+       require_once __DIR__ . '/../commandLine.inc';
 
        resolveStubs();
 }
index 3187c31..e33057f 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
-require_once( __DIR__ . '/../Maintenance.php' );
+require_once __DIR__ . '/../Maintenance.php';
 
 class StorageTypeStats extends Maintenance {
        function execute() {
@@ -112,4 +112,4 @@ SQL;
 }
 
 $maintClass = 'StorageTypeStats';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index e13e1b1..fdc28d9 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 $optionsWithArgs = array( 'start', 'limit', 'type' );
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
 
 if ( !isset( $args[0] )  ) {
        echo "Usage: php testCompression.php [--type=<type>] [--start=<start-date>] [--limit=<num-revs>] <page-title>\n";
index 2f3c8c6..7857dd9 100644 (file)
@@ -22,7 +22,7 @@
  * @see wfWaitForSlaves()
  */
 
-require( __DIR__ . '/../commandLine.inc' );
+require __DIR__ . '/../commandLine.inc';
 
 
 if ( count( $args ) < 1 ) {
index 158019b..f0be709 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that syncs one file backend to another based on
@@ -40,6 +40,7 @@ class SyncFileBackend extends Maintenance {
                $this->addOption( 'posdir', 'Directory to read/record journal positions', false, true );
                $this->addOption( 'posdump', 'Just dump current journal position into the position dir.' );
                $this->addOption( 'postime', 'For position dumps, get the ID at this time', false, true );
+               $this->addOption( 'backoff', 'Stop at entries younger than this age (sec).', false, true );
                $this->addOption( 'verbose', 'Verbose mode', false, false, 'v' );
                $this->setBatchSize( 50 );
        }
@@ -88,7 +89,13 @@ class SyncFileBackend extends Maintenance {
                } else {
                        $startFromPosFile = false;
                }
-               $end = $this->getOption( 'end', INF );
+
+               if ( $this->hasOption( 'backoff' ) ) {
+                       $time = time() - $this->getOption( 'backoff', 0 );
+                       $end = (int)$src->getJournal()->getPositionAtTime( $time );
+               } else {
+                       $end = $this->getOption( 'end', INF );
+               }
 
                $this->output( "Synchronizing backend '{$dst->getName()}' to '{$src->getName()}'...\n" );
                $this->output( "Starting journal position is $start.\n" );
@@ -289,4 +296,4 @@ class SyncFileBackend extends Maintenance {
 }
 
 $maintClass = "SyncFileBackend";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4307c0c..da2c6df 100644 (file)
@@ -626,21 +626,6 @@ CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
 
-
---
--- Track external user accounts, if ExternalAuth is used
---
-CREATE TABLE /*_*/external_user (
-  -- Foreign key to user_id
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-
-  -- Some opaque identifier provided by the external database
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
-
-
 --
 -- Track interlanguage links
 --
@@ -674,7 +659,8 @@ CREATE TABLE /*_*/iwlinks (
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/iwl_from ON /*_*/iwlinks (iwl_from, iwl_prefix, iwl_title);
-CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
+CREATE INDEX /*i*/iwl_prefix_from_title ON /*_*/iwlinks (iwl_prefix, iwl_from, iwl_title);
 
 
 --
@@ -821,7 +807,7 @@ CREATE TABLE /*_*/image (
   img_width int NOT NULL default 0,
   img_height int NOT NULL default 0,
 
-  -- Extracted EXIF metadata stored as a serialized PHP array.
+  -- Extracted Exif metadata stored as a serialized PHP array.
   img_metadata mediumblob NOT NULL,
 
   -- For images, bits per pixel if known.
@@ -862,6 +848,8 @@ CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
 CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
 -- Used in API and duplicate search
 CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
+-- Used to get media of one type
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
 
 
 --
@@ -1064,7 +1052,7 @@ CREATE TABLE /*_*/recentchanges (
   -- rev_id of the prior revision, for generating diff links.
   rc_last_oldid int unsigned NOT NULL default 0,
 
-  -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG)
+  -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG,RC_EXTERNAL)
   rc_type tinyint unsigned NOT NULL default 0,
 
   -- If the Recent Changes Patrol option is enabled,
index ea8b0c4..c890c69 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 class Undelete extends Maintenance {
        public function __construct() {
@@ -55,4 +55,4 @@ class Undelete extends Maintenance {
 }
 
 $maintClass = "Undelete";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index f69a9b0..6fcec2c 100644 (file)
  */
 
 if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '5.3.2' ) < 0 ) ) {
-       require( dirname( __FILE__ ) . '/../includes/PHPVersionError.php' );
+       require dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
        wfPHPVersionError( 'cli' );
 }
 
 $wgUseMasterForMaintenance = true;
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to run database schema updates.
@@ -83,7 +83,7 @@ class UpdateMediaWiki extends Maintenance {
        function execute() {
                global $wgVersion, $wgTitle, $wgLang, $wgAllowSchemaUpdates;
 
-               if( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
+               if ( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
                        $this->error( "Do not run update.php on this wiki. If you're seeing this you should\n"
                                . "probably ask for some help in performing your schema updates or use\n"
                                . "the --noschema and --schema options to get an SQL file for someone\n"
@@ -92,12 +92,12 @@ class UpdateMediaWiki extends Maintenance {
                }
 
                $this->fileHandle = null;
-               if( substr( $this->getOption( 'schema' ), 0, 2 ) === "--" ) {
+               if ( substr( $this->getOption( 'schema' ), 0, 2 ) === "--" ) {
                        $this->error( "The --schema option requires a file as an argument.\n", true );
-               } else if( $this->hasOption( 'schema' ) ) {
+               } elseif ( $this->hasOption( 'schema' ) ) {
                        $file = $this->getOption( 'schema' );
                        $this->fileHandle = fopen( $file, "w" );
-                       if( $this->fileHandle === false ) {
+                       if ( $this->fileHandle === false ) {
                                $err = error_get_last();
                                $this->error( "Problem opening the schema file for writing: $file\n\t{$err['message']}", true );
                        }
@@ -122,7 +122,7 @@ class UpdateMediaWiki extends Maintenance {
                $db = wfGetDB( DB_MASTER );
 
                $this->output( "Going to run database updates for " . wfWikiID() . "\n" );
-               if( $db->getType() === 'sqlite' ) {
+               if ( $db->getType() === 'sqlite' ) {
                        $this->output( "Using SQLite file: '{$db->mDatabaseFile}'\n" );
                }
                $this->output( "Depending on the size of your database this may take a while!\n" );
@@ -135,13 +135,13 @@ class UpdateMediaWiki extends Maintenance {
                $shared = $this->hasOption( 'doshared' );
 
                $updates = array( 'core', 'extensions' );
-               if( !$this->hasOption('schema') ) {
-                       if( $this->hasOption('noschema') ) {
+               if ( !$this->hasOption( 'schema' ) ) {
+                       if ( $this->hasOption( 'noschema' ) ) {
                                $updates[] = 'noschema';
                        }
                        $updates[] = 'stats';
 
-                       if( !$this->hasOption('nopurge') ) {
+                       if ( !$this->hasOption( 'nopurge' ) ) {
                                $updates[] = 'purge';
                        }
                }
@@ -149,7 +149,7 @@ class UpdateMediaWiki extends Maintenance {
                $updater = DatabaseUpdater::newForDb( $db, $shared, $this );
                $updater->doUpdates( $updates );
 
-               foreach( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
+               foreach ( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
                        $child = $this->runChild( $maint );
 
                        // LoggedUpdateMaintenance is checking the updatelog itself
@@ -166,7 +166,7 @@ class UpdateMediaWiki extends Maintenance {
                        }
                }
 
-               if( !$this->hasOption('nopurge') ) {
+               if ( !$this->hasOption( 'nopurge' ) ) {
                        $updater->purgeCache();
                }
 
@@ -189,4 +189,4 @@ class UpdateMediaWiki extends Maintenance {
 }
 
 $maintClass = 'UpdateMediaWiki';
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4d49dd2..7964a21 100644 (file)
@@ -23,7 +23,7 @@
  * @author Rob Church <robchur@gmail.com>
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to provide a better count of the number of articles
@@ -58,4 +58,4 @@ class UpdateArticleCount extends Maintenance {
 }
 
 $maintClass = "UpdateArticleCount";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index a76a1ee..b847c23 100644 (file)
@@ -26,7 +26,7 @@
 
 #$optionsWithArgs = array( 'begin', 'max-slave-lag' );
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that will find all rows in the categorylinks table
@@ -303,4 +303,4 @@ TEXT;
 }
 
 $maintClass = "UpdateCollation";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index dc7398a..41988d1 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to normalize double-byte latin UTF-8 characters.
@@ -72,4 +72,4 @@ class UpdateDoubleWidthSearch extends Maintenance {
 }
 
 $maintClass = "UpdateDoubleWidthSearch";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 8699dc2..175447e 100644 (file)
@@ -24,7 +24,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that updates page_restrictions table from
@@ -114,4 +114,4 @@ class UpdateRestrictions extends Maintenance {
 }
 
 $maintClass = "UpdateRestrictions";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index ac78484..0691bee 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script for periodic off-peak updating of the search index.
@@ -60,7 +60,7 @@ class UpdateSearchIndex extends Maintenance {
                        # We can safely delete the file when we're done though.
                        $start = file_get_contents( 'searchUpdate.pos' );
                        unlink( 'searchUpdate.pos' );
-               } elseif( is_readable( $posFile ) ) {
+               } elseif ( is_readable( $posFile ) ) {
                        $start = file_get_contents( $posFile );
                } else {
                        $start = wfTimestamp( TS_MW, time() - 86400 );
@@ -97,9 +97,8 @@ class UpdateSearchIndex extends Maintenance {
 
                $page = $dbw->tableName( 'page' );
                $sql = "SELECT rc_cur_id FROM $recentchanges
-                 JOIN $page ON rc_cur_id=page_id AND rc_this_oldid=page_latest
-                 WHERE rc_type != " . RC_LOG . " AND rc_timestamp BETWEEN '$start' AND '$end'
-                 ";
+                       JOIN $page ON rc_cur_id=page_id AND rc_this_oldid=page_latest
+                       WHERE rc_type != " . RC_LOG . " AND rc_timestamp BETWEEN '$start' AND '$end'";
                $res = $dbw->query( $sql, __METHOD__ );
 
                $this->updateSearchIndex( $maxLockTime, array( $this, 'searchIndexUpdateCallback' ), $dbw, $res );
@@ -113,4 +112,4 @@ class UpdateSearchIndex extends Maintenance {
 }
 
 $maintClass = "UpdateSearchIndex";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index f92f67a..181c222 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to update cached special pages.
@@ -67,7 +67,7 @@ class UpdateSpecialPages extends Maintenance {
                }
 
                // This is needed to initialise $wgQueryPages
-               require_once( "$IP/includes/QueryPage.php" );
+               require_once "$IP/includes/QueryPage.php";
 
                foreach ( $wgQueryPages as $page ) {
                        list( $class, $special ) = $page;
@@ -94,13 +94,13 @@ class UpdateSpecialPages extends Maintenance {
                        } else {
                                if ( !class_exists( $class ) ) {
                                        $file = $specialObj->getFile();
-                                       require_once( $file );
+                                       require_once $file;
                                }
                                $queryPage = new $class;
                        }
 
                        if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
-                               $this->output( sprintf( '%-30s ',  $special ) );
+                               $this->output( sprintf( '%-30s ', $special ) );
                                if ( $queryPage->isExpensive() ) {
                                        $t1 = explode( ' ', microtime() );
                                        # Do the query
@@ -124,7 +124,7 @@ class UpdateSpecialPages extends Maintenance {
                                                $this->output( sprintf( "%.2fs\n", $seconds ) );
                                        }
                                        # Reopen any connections that have closed
-                                       if ( !wfGetLB()->pingAll() )  {
+                                       if ( !wfGetLB()->pingAll() ) {
                                                $this->output( "\n" );
                                                do {
                                                        $this->error( "Connection failed, reconnecting in 10 seconds..." );
@@ -146,4 +146,4 @@ class UpdateSpecialPages extends Maintenance {
 }
 
 $maintClass = "UpdateSpecialPages";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index be45a11..6fb29be 100644 (file)
@@ -112,9 +112,9 @@ class UserDupes {
                $count = count( $dupes );
 
                $this->out( "Found $count accounts with duplicate records on " . wfWikiID() . ".\n" );
-               $this->trimmed    = 0;
+               $this->trimmed = 0;
                $this->reassigned = 0;
-               $this->failed     = 0;
+               $this->failed = 0;
                foreach ( $dupes as $name ) {
                        $this->examine( $name, $doDelete );
                }
@@ -223,7 +223,7 @@ class UserDupes {
                        __METHOD__ );
 
                $firstRow = $this->db->fetchObject( $result );
-               $firstId  = $firstRow->user_id;
+               $firstId = $firstRow->user_id;
                $this->out( "Record that will be used for '$name' is user_id=$firstId\n" );
 
                foreach ( $result as $row ) {
index cbe6b05..51da80d 100644 (file)
@@ -25,7 +25,7 @@
 $options = array( 'list', 'nowarn', 'quiet', 'usage', 'dry' );
 $optionsWithArgs = array( 'old', 'new' );
 
-require_once( __DIR__ . '/commandLine.inc' );
+require_once __DIR__ . '/commandLine.inc';
 
 /**
  * @ingroup Maintenance
@@ -38,7 +38,7 @@ class userOptions {
        public $mOldValue;
        public $mNewValue;
 
-       private $mMode, $mReady ;
+       private $mMode, $mReady;
 
        /** Constructor. Will show usage and exit if script options are not correct */
        function __construct( $opts, $args ) {
@@ -60,9 +60,9 @@ class userOptions {
         */
        private function checkOpts( $opts, $args ) {
                // The three possible ways to run the script:
-               $list   = isset( $opts['list'] );
-               $usage  = isset( $opts['usage'] ) && ( count( $args ) <= 1 );
-               $change = isset( $opts['old'] ) && isset( $opts['new'] ) && ( count( $args ) <= 1 ) ;
+               $list = isset( $opts['list'] );
+               $usage = isset( $opts['usage'] ) && ( count( $args ) <= 1 );
+               $change = isset( $opts['old'] ) && isset( $opts['new'] ) && ( count( $args ) <= 1 );
 
                // We want only one of them
                $isValid = ( ( $list + $usage + $change ) == 1 );
@@ -82,18 +82,18 @@ class userOptions {
 
                $this->mQuick = isset( $opts['nowarn'] );
                $this->mQuiet = isset( $opts['quiet'] );
-               $this->mDry   = isset( $opts['dry'] );
+               $this->mDry = isset( $opts['dry'] );
 
                // Set object properties, specially 'mMode' used by run()
                if ( isset( $opts['list'] ) ) {
-                       $this->mMode = 'LISTER' ;
+                       $this->mMode = 'LISTER';
                } elseif ( isset( $opts['usage'] ) ) {
-                       $this->mMode = 'USAGER' ;
-                       $this->mAnOption = isset( $args[0] ) ? $args[0] : false ;
+                       $this->mMode = 'USAGER';
+                       $this->mAnOption = isset( $args[0] ) ? $args[0] : false;
                } elseif ( isset( $opts['old'] ) && isset( $opts['new'] ) ) {
-                       $this->mMode = 'CHANGER' ;
-                       $this->mOldValue = $opts['old'] ;
-                       $this->mNewValue = $opts['new'] ;
+                       $this->mMode = 'CHANGER';
+                       $this->mOldValue = $opts['old'];
+                       $this->mNewValue = $opts['new'];
                        $this->mAnOption = $args[0];
                } else {
                        die( "There is a bug in the software, this should never happen\n" );
@@ -212,7 +212,9 @@ class userOptions {
                                if ( !$this->mDry ) {
                                        $user->saveSettings();
                                }
-                               if ( !$this->mQuiet ) { print " OK\n"; }
+                               if ( !$this->mQuiet ) {
+                                       print " OK\n";
+                               }
 
                        } elseif ( !$this->mQuiet ) {
                                print "Not changing '$username' using <{$this->mAnOption}> = '$curValue'\n";
index 1e1f24b..e0de357 100644 (file)
@@ -25,7 +25,7 @@
  */
 
 // This is a command line script, load tools and parse args
-require_once( 'userOptions.inc' );
+require_once 'userOptions.inc';
 
 // Load up our tool system, exit with usage() if options are not fine
 $uo = new userOptions( $options, $args );
index df83928..a62d161 100644 (file)
@@ -22,7 +22,7 @@
  * @see wfWaitForSlaves()
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to wait until slave lag goes under a certain value.
@@ -40,4 +40,4 @@ class WaitForSlave extends Maintenance {
 }
 
 $maintClass = "WaitForSlave";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 2823210..570b426 100644 (file)
@@ -24,11 +24,7 @@ define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
 chdir( dirname( __DIR__ ) );
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       require ( 'core/includes/WebStart.php' );
-} else {
-       require( dirname( __DIR__ ) . '/includes/WebStart.php' );
-}
+require dirname( __DIR__ ) . '/includes/WebStart.php';
 
 wfInstallerMain();
 
index cb8b1be..ecd5051 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-require_once( __DIR__ . '/includes/WebStart.php' );
+require_once __DIR__ . '/includes/WebStart.php';
 
 if ( $wgRequest->getVal( 'ctype' ) == 'application/xml' ) {
        // Makes testing tweaks about a billion times easier
index 4117d97..8120599 100644 (file)
 ini_set( 'zlib.output_compression', 'off' );
 
 $wgEnableProfileInfo = $wgProfileToDatabase = false;
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       require ( 'core/includes/WebStart.php' );
-} else {
-       require ( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 header( 'Content-Type: text/html; charset=utf-8' );
 
@@ -390,8 +386,9 @@ if ( isset( $_REQUEST['filter'] ) ) {
        }
 
        $s = new profile_point( 'SQL Queries', 0, $sqltotal, 0, 0 );
-       foreach ( $queries as $q )
+       foreach ( $queries as $q ) {
                $s->add_child( $q );
+       }
        $points[] = $s;
 
        usort( $points, 'compare_point' );
diff --git a/redirect.php b/redirect.php
deleted file mode 100644 (file)
index 5e6cfee..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/**
- * Script that redirects to the article passed in the "wpDropdown" parameter.
- * This is used by the nostalgia skin for the special pages drop-down
- *
- * 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
- */
-
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       require ( 'phase3/includes/WebStart.php' );
-} else {
-       require ( __DIR__ . '/includes/WebStart.php' );
-}
-
-global $wgArticlePath;
-
-$page = $wgRequest->getVal( 'wpDropdown' );
-
-$url = str_replace( "$1", urlencode( $page ), $wgArticlePath );
-
-header( "Location: {$url}", true, 301 );
diff --git a/redirect.php5 b/redirect.php5
deleted file mode 100644 (file)
index b65f69a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-/**
- * Version of redirect.php to used in web server requiring .php5 extension
- * to execute scripts with 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
- */
-
-require './redirect.php';
diff --git a/redirect.phtml b/redirect.phtml
deleted file mode 100644 (file)
index 3e430bf..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-// stub file for compatibility with older versions
-include_once('./redirect.php');
index 9593fa8..90c6c95 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( 'Not an entry point.' );
 }
 
@@ -60,14 +60,11 @@ return array(
         *
         * See Vector for an example.
         */
-
-       'skins.chick' => array(
-               'styles' => array( 'chick/main.css' => array( 'media' => 'screen, handheld' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
        'skins.cologneblue' => array(
-               'styles' => array( 'cologneblue/screen.css' => array( 'media' => 'screen' ) ),
+               'styles' => array(
+                       'cologneblue/screen.css' => array( 'media' => 'screen' ),
+                       'cologneblue/print.css' => array( 'media' => 'print' ),
+               ),
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
@@ -89,21 +86,6 @@ return array(
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
-       'skins.nostalgia' => array(
-               'styles' => array( 'nostalgia/screen.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.simple' => array(
-               'styles' => array( 'simple/main.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.standard' => array(
-               'styles' => array( 'standard/main.css' => array( 'media' => 'screen' ) ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
        'skins.vector' => array(
                // Keep in sync with WebInstallerOutput::getCSS()
                'styles' => array(
@@ -162,6 +144,10 @@ return array(
                'scripts' => 'resources/jquery/jquery.checkboxShiftClick.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'jquery.chosen' => array(
+               'scripts' => 'resources/jquery.chosen/chosen.jquery.js',
+               'styles' => 'resources/jquery.chosen/chosen.css',
+       ),
        'jquery.client' => array(
                'scripts' => 'resources/jquery/jquery.client.js',
                'targets' => array( 'desktop', 'mobile' ),
@@ -198,6 +184,7 @@ return array(
        ),
        'jquery.getAttrs' => array(
                'scripts' => 'resources/jquery/jquery.getAttrs.js',
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'jquery.hidpi' => array(
                'scripts' => 'resources/jquery/jquery.hidpi.js',
@@ -609,6 +596,9 @@ return array(
                        'user.tokens',
                ),
        ),
+       'mediawiki.icon' => array(
+               'styles' => 'resources/mediawiki/mediawiki.icon.css',
+       ),
        'mediawiki.debug' => array(
                'scripts' => 'resources/mediawiki/mediawiki.debug.js',
                'styles' => 'resources/mediawiki/mediawiki.debug.css',
@@ -656,6 +646,7 @@ return array(
        ),
        'mediawiki.htmlform' => array(
                'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
+               'messages' => array( 'htmlform-chosen-placeholder' ),
        ),
        'mediawiki.notification' => array(
                'styles' => 'resources/mediawiki/mediawiki.notification.css',
@@ -680,6 +671,7 @@ return array(
                        'jquery.client',
                        'jquery.placeholder',
                        'jquery.suggestions',
+                       'mediawiki.api',
                ),
        ),
        'mediawiki.Title' => array(
@@ -752,11 +744,24 @@ return array(
        ),
        'mediawiki.action.view.postEdit' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.js',
-               'dependencies' => 'jquery.cookie'
+               'styles' => 'resources/mediawiki.action/mediawiki.action.view.postEdit.css',
+               'dependencies' => array(
+                       'jquery.cookie',
+                       'mediawiki.jqueryMsg'
+               ),
+               'messages' => array(
+                       'postedit-confirmation',
+               ),
        ),
        'mediawiki.action.view.rightClickEdit' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
        ),
+       'mediawiki.action.edit.editWarning' => array(
+               'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.editWarning.js',
+               'messages' => array(
+                       'editwarning-warning',
+               ),
+       ),
        // Alias for backwards compatibility
        'mediawiki.action.watch.ajax' => array(
                'dependencies' => 'mediawiki.page.watch.ajax'
@@ -908,7 +913,7 @@ return array(
        ),
        'mediawiki.special.changeslist' => array(
                'styles' => 'resources/mediawiki.special/mediawiki.special.changeslist.css',
-               'dependencies' => array( 'jquery.makeCollapsible' ),
+               'dependencies' => array( 'jquery.makeCollapsible', 'mediawiki.icon' ),
        ),
        'mediawiki.special.movePage' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.movePage.js',
@@ -916,7 +921,7 @@ return array(
        ),
        'mediawiki.special.preferences' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.preferences.js',
-               'styles'  => 'resources/mediawiki.special/mediawiki.special.preferences.css',
+               'styles' => 'resources/mediawiki.special/mediawiki.special.preferences.css',
        ),
        'mediawiki.special.recentchanges' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.recentchanges.js',
@@ -936,7 +941,7 @@ return array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.undelete.js',
        ),
        'mediawiki.special.upload' => array(
-               // @TODO: merge in remainder of mediawiki.legacy.upload
+               // @todo merge in remainder of mediawiki.legacy.upload
                'scripts' => 'resources/mediawiki.special/mediawiki.special.upload.js',
                'messages' => array(
                        'widthheight',
@@ -951,6 +956,29 @@ return array(
        'mediawiki.special.userlogin.signup' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.userLogin.signup.js',
        ),
+       'mediawiki.special.userlogin.vform' => array(
+               'styles' => array(
+                       'resources/mediawiki.special/mediawiki.special.vforms.css',
+                       'resources/mediawiki.special/mediawiki.special.userLogin.vform.css',
+               ),
+               'position' => 'top',
+       ),
+       'mediawiki.special.createaccount.vform' => array(
+               'styles' => array(
+                       'resources/mediawiki.special/mediawiki.special.vforms.css',
+                       'resources/mediawiki.special/mediawiki.special.createAccount.vform.css',
+               ),
+               'position' => 'top',
+       ),
+       'mediawiki.special.createaccount.vform.js' => array(
+               'scripts' => 'resources/mediawiki.special/mediawiki.special.createAccount.vform.js',
+               'messages' => array(
+                       'createacct-captcha',
+                       'createacct-imgcaptcha-ph'
+               ),
+               'dependencies' => 'mediawiki.jqueryMsg',
+               'position' => 'top',
+       ),
        'mediawiki.special.javaScriptTest' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.javaScriptTest.js',
                'messages' => array_merge( Skin::getSkinNameMessages(), array(
@@ -1050,4 +1078,11 @@ return array(
                'remoteBasePath' => $GLOBALS['wgStylePath'],
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
+       'mediawiki.ui' => array(
+               'skinStyles' => array(
+                       'default' => 'resources/mediawiki.ui/mediawiki.ui.default.css',
+                       'vector' => 'resources/mediawiki.ui/mediawiki.ui.vector.css',
+               ),
+               'position' => 'top',
+       ),
 );
diff --git a/resources/jquery.chosen/LICENSE b/resources/jquery.chosen/LICENSE
new file mode 100644 (file)
index 0000000..0675dc5
--- /dev/null
@@ -0,0 +1,24 @@
+# Chosen, a Select Box Enhancer for jQuery and Protoype
+## by Patrick Filler for [Harvest](http://getharvest.com)
+
+Available for use under the [MIT License](http://en.wikipedia.org/wiki/MIT_License)
+
+Copyright (c) 2011-2013 by Harvest
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/resources/jquery.chosen/chosen-sprite.png b/resources/jquery.chosen/chosen-sprite.png
new file mode 100644 (file)
index 0000000..3611ae4
Binary files /dev/null and b/resources/jquery.chosen/chosen-sprite.png differ
diff --git a/resources/jquery.chosen/chosen-sprite@2x.png b/resources/jquery.chosen/chosen-sprite@2x.png
new file mode 100644 (file)
index 0000000..ffe4d7d
Binary files /dev/null and b/resources/jquery.chosen/chosen-sprite@2x.png differ
diff --git a/resources/jquery.chosen/chosen.css b/resources/jquery.chosen/chosen.css
new file mode 100644 (file)
index 0000000..17793ed
--- /dev/null
@@ -0,0 +1,440 @@
+/* @group Base */
+.chzn-container {
+  font-size: 13px;
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+  zoom: 1;
+  *display: inline;
+}
+.chzn-container .chzn-drop {
+  background: #fff;
+  border: 1px solid #aaa;
+  border-top: 0;
+  position: absolute;
+  top: 100%;
+  left: -9999px;
+  -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
+  -moz-box-shadow   : 0 4px 5px rgba(0,0,0,.15);
+  box-shadow        : 0 4px 5px rgba(0,0,0,.15);
+  z-index: 1010;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+
+.chzn-container.chzn-with-drop .chzn-drop {
+  left: 0;
+}
+
+/* @end */
+
+/* @group Single Chosen */
+.chzn-container-single .chzn-single {
+  background-color: #ffffff;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );   
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
+  background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: linear-gradient(#ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 
+  -webkit-border-radius: 5px;
+  -moz-border-radius   : 5px;
+  border-radius        : 5px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  border: 1px solid #aaaaaa;
+  -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  -moz-box-shadow   : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  box-shadow        : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  height: 23px;
+  line-height: 24px;
+  padding: 0 0 0 8px;
+  color: #444444;
+  text-decoration: none;
+}
+.chzn-container-single .chzn-default {
+  color: #999;
+}
+.chzn-container-single .chzn-single span {
+  margin-right: 26px;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  -o-text-overflow: ellipsis;
+  -ms-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+}
+.chzn-container-single .chzn-single abbr {
+  display: block;
+  position: absolute;
+  right: 26px;
+  top: 6px;
+  width: 12px;
+  height: 12px;
+  font-size: 1px;
+  background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-single .chzn-single abbr:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-single.chzn-disabled .chzn-single abbr:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-single .chzn-single div {
+  position: absolute;
+  right: 0;
+  top: 0;
+  display: block;
+  height: 100%;
+  width: 18px;
+}
+.chzn-container-single .chzn-single div b {
+  background: url('chosen-sprite.png') no-repeat 0px 2px;
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+.chzn-container-single .chzn-search {
+  padding: 3px 4px;
+  position: relative;
+  margin: 0;
+  white-space: nowrap;
+  z-index: 1010;
+}
+.chzn-container-single .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+  margin: 1px 0;
+  padding: 4px 20px 4px 5px;
+  outline: 0;
+  border: 1px solid #aaa;
+  font-family: sans-serif;
+  font-size: 1em;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+.chzn-container-single .chzn-drop {
+  margin-top: -1px;
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius   : 0 0 4px 4px;
+  border-radius        : 0 0 4px 4px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+}
+.chzn-container-single-nosearch .chzn-search {
+  position: absolute;
+  left: -9999px;
+}
+/* @end */
+
+/* @group Multi Chosen */
+.chzn-container-multi .chzn-choices {
+  background-color: #fff;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: linear-gradient(#eeeeee 1%, #ffffff 15%);
+  border: 1px solid #aaa;
+  margin: 0;
+  padding: 0;
+  cursor: text;
+  overflow: hidden;
+  height: auto !important;
+  height: 1%;
+  position: relative;
+  width: 100%;
+  -moz-box-sizing   : border-box;
+  -ms-box-sizing    : border-box;
+  -webkit-box-sizing: border-box;
+  -khtml-box-sizing : border-box;
+  box-sizing        : border-box;
+}
+.chzn-container-multi .chzn-choices li {
+  float: left;
+  list-style: none;
+}
+.chzn-container-multi .chzn-choices .search-field {
+  white-space: nowrap;
+  margin: 0;
+  padding: 0;
+}
+.chzn-container-multi .chzn-choices .search-field input {
+  color: #666;
+  background: transparent !important;
+  border: 0 !important;
+  font-family: sans-serif;
+  font-size: 100%;
+  height: 15px;
+  padding: 5px;
+  margin: 1px 0;
+  outline: 0;
+  -webkit-box-shadow: none;
+  -moz-box-shadow   : none;
+  box-shadow        : none;
+}
+.chzn-container-multi .chzn-choices .search-field .default {
+  color: #999;
+}
+.chzn-container-multi .chzn-choices .search-choice {
+  -webkit-border-radius: 3px;
+  -moz-border-radius   : 3px;
+  border-radius        : 3px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); 
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 
+  -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  -moz-box-shadow   : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  box-shadow        : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  color: #333;
+  border: 1px solid #aaaaaa;
+  line-height: 13px;
+  padding: 3px 20px 3px 5px;
+  margin: 3px 0 3px 5px;
+  position: relative;
+  cursor: default;
+}
+.chzn-container-multi .chzn-choices .search-choice.search-choice-disabled {
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 );
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  color: #666;
+  border: 1px solid #cccccc;
+  padding-right: 5px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus {
+  background: #d4d4d4;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
+  display: block;
+  position: absolute;
+  right: 3px;
+  top: 4px;
+  width: 12px;
+  height: 12px;
+  font-size: 1px;
+  background: url('chosen-sprite.png') -42px 1px no-repeat;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
+  background-position: -42px -10px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
+  background-position: -42px -10px;
+}
+/* @end */
+
+/* @group Results */
+.chzn-container .chzn-results {
+  margin: 0 4px 4px 0;
+  max-height: 240px;
+  padding: 0 0 0 4px;
+  position: relative;
+  overflow-x: hidden;
+  overflow-y: auto;
+  -webkit-overflow-scrolling: touch;
+}
+.chzn-container-multi .chzn-results {
+  margin: 0;
+  padding: 0;
+}
+.chzn-container .chzn-results li {
+  display: none;
+  line-height: 15px;
+  padding: 5px 6px;
+  margin: 0;
+  list-style: none;
+}
+.chzn-container .chzn-results .active-result {
+  cursor: pointer;
+  display: list-item;
+}
+.chzn-container .chzn-results .highlighted {
+  background-color: #3875d7;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );  
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+  background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
+  color: #fff;
+}
+.chzn-container .chzn-results li em {
+  background: #feffde;
+  font-style: normal;
+}
+.chzn-container .chzn-results .highlighted em {
+  background: transparent;
+}
+.chzn-container .chzn-results .no-results {
+  background: #f4f4f4;
+  display: list-item;
+}
+.chzn-container .chzn-results .group-result {
+  cursor: default;
+  color: #999;
+  font-weight: bold;
+}
+.chzn-container .chzn-results .group-option {
+  padding-left: 15px;
+}
+.chzn-container-multi .chzn-drop .result-selected {
+  display: none;
+}
+.chzn-container .chzn-results-scroll {
+  background: white;
+  margin: 0 4px;
+  position: absolute;
+  text-align: center;
+  width: 321px; /* This should by dynamic with js */
+  z-index: 1;
+}
+.chzn-container .chzn-results-scroll span {
+  display: inline-block;
+  height: 17px;
+  text-indent: -5000px;
+  width: 9px;
+}
+.chzn-container .chzn-results-scroll-down {
+  bottom: 0;
+}
+.chzn-container .chzn-results-scroll-down span {
+  background: url('chosen-sprite.png') no-repeat -4px -3px;
+}
+.chzn-container .chzn-results-scroll-up span {
+  background: url('chosen-sprite.png') no-repeat -22px -3px;
+}
+/* @end */
+
+/* @group Active  */
+.chzn-container-active .chzn-single {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active.chzn-with-drop .chzn-single {
+  border: 1px solid #aaa;
+  -webkit-box-shadow: 0 1px 0 #fff inset;
+  -moz-box-shadow   : 0 1px 0 #fff inset;
+  box-shadow        : 0 1px 0 #fff inset;
+  background-color: #eee;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: linear-gradient(#eeeeee 20%, #ffffff 80%);
+  -webkit-border-bottom-left-radius : 0;
+  -webkit-border-bottom-right-radius: 0;
+  -moz-border-radius-bottomleft : 0;
+  -moz-border-radius-bottomright: 0;
+  border-bottom-left-radius : 0;
+  border-bottom-right-radius: 0;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div {
+  background: transparent;
+  border-left: none;
+}
+.chzn-container-active.chzn-with-drop .chzn-single div b {
+  background-position: -18px 2px;
+}
+.chzn-container-active .chzn-choices {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active .chzn-choices .search-field input {
+  color: #111 !important;
+}
+/* @end */
+
+/* @group Disabled Support */
+.chzn-disabled {
+  cursor: default;
+  opacity:0.5 !important;
+}
+.chzn-disabled .chzn-single {
+  cursor: default;
+}
+.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+  cursor: default;
+}
+
+/* @group Right to Left */
+.chzn-rtl { text-align: right; }
+.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
+.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
+
+.chzn-rtl .chzn-single div { left: 3px; right: auto; }
+.chzn-rtl .chzn-single abbr {
+  left: 26px;
+  right: auto;
+}
+.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
+.chzn-rtl .chzn-choices li { float: right; }
+.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
+.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; }
+.chzn-rtl .chzn-search { left: 9999px; }
+.chzn-rtl.chzn-with-drop .chzn-search { left: 0px; }
+.chzn-rtl .chzn-drop { left: 9999px; }
+.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
+.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
+.chzn-rtl.chzn-container-active.chzn-with-drop .chzn-single div { border-right: none; }
+.chzn-rtl .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat -30px -20px;
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-gradient(linear, 0 0, 0 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);  
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -30px -20px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -30px -20px, linear-gradient(#eeeeee 1%, #ffffff 15%);
+  padding: 4px 5px 4px 20px;
+  direction: rtl;
+}
+.chzn-container-single.chzn-rtl .chzn-single div b {
+  background-position: 6px 2px;
+}
+.chzn-container-single.chzn-rtl.chzn-with-drop .chzn-single div b {
+  background-position: -12px 2px;
+}
+/* @end */
+
+/* @group Retina compatibility */
+@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi)  {
+  .chzn-rtl .chzn-search input, .chzn-container-single .chzn-single abbr, .chzn-container-single .chzn-single div b, .chzn-container-single .chzn-search input, .chzn-container-multi .chzn-choices .search-choice .search-choice-close, .chzn-container .chzn-results-scroll-down span, .chzn-container .chzn-results-scroll-up span {
+      background-image: url('chosen-sprite@2x.png') !important;
+      background-repeat: no-repeat !important;
+      background-size: 52px 37px !important;
+  }
+}
+/* @end */
diff --git a/resources/jquery.chosen/chosen.jquery.js b/resources/jquery.chosen/chosen.jquery.js
new file mode 100644 (file)
index 0000000..a240ebd
--- /dev/null
@@ -0,0 +1,1103 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+//
+// Version 0.9.14
+// Full source at https://github.com/harvesthq/chosen
+// Copyright (c) 2011 Harvest http://getharvest.com
+
+// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+// This file is generated by `cake build`, do not edit it by hand.
+(function() {
+  var SelectParser;
+
+  SelectParser = (function() {
+
+    function SelectParser() {
+      this.options_index = 0;
+      this.parsed = [];
+    }
+
+    SelectParser.prototype.add_node = function(child) {
+      if (child.nodeName.toUpperCase() === "OPTGROUP") {
+        return this.add_group(child);
+      } else {
+        return this.add_option(child);
+      }
+    };
+
+    SelectParser.prototype.add_group = function(group) {
+      var group_position, option, _i, _len, _ref, _results;
+      group_position = this.parsed.length;
+      this.parsed.push({
+        array_index: group_position,
+        group: true,
+        label: group.label,
+        children: 0,
+        disabled: group.disabled
+      });
+      _ref = group.childNodes;
+      _results = [];
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        _results.push(this.add_option(option, group_position, group.disabled));
+      }
+      return _results;
+    };
+
+    SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+      if (option.nodeName.toUpperCase() === "OPTION") {
+        if (option.text !== "") {
+          if (group_position != null) {
+            this.parsed[group_position].children += 1;
+          }
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            value: option.value,
+            text: option.text,
+            html: option.innerHTML,
+            selected: option.selected,
+            disabled: group_disabled === true ? group_disabled : option.disabled,
+            group_array_index: group_position,
+            classes: option.className,
+            style: option.style.cssText
+          });
+        } else {
+          this.parsed.push({
+            array_index: this.parsed.length,
+            options_index: this.options_index,
+            empty: true
+          });
+        }
+        return this.options_index += 1;
+      }
+    };
+
+    return SelectParser;
+
+  })();
+
+  SelectParser.select_to_array = function(select) {
+    var child, parser, _i, _len, _ref;
+    parser = new SelectParser();
+    _ref = select.childNodes;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      child = _ref[_i];
+      parser.add_node(child);
+    }
+    return parser.parsed;
+  };
+
+  this.SelectParser = SelectParser;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+  var AbstractChosen, root;
+
+  root = this;
+
+  AbstractChosen = (function() {
+
+    function AbstractChosen(form_field, options) {
+      this.form_field = form_field;
+      this.options = options != null ? options : {};
+      if (!AbstractChosen.browser_is_supported()) {
+        return;
+      }
+      this.is_multiple = this.form_field.multiple;
+      this.set_default_text();
+      this.set_default_values();
+      this.setup();
+      this.set_up_html();
+      this.register_observers();
+      this.finish_setup();
+    }
+
+    AbstractChosen.prototype.set_default_values = function() {
+      var _this = this;
+      this.click_test_action = function(evt) {
+        return _this.test_active_click(evt);
+      };
+      this.activate_action = function(evt) {
+        return _this.activate_field(evt);
+      };
+      this.active_field = false;
+      this.mouse_on_container = false;
+      this.results_showing = false;
+      this.result_highlighted = null;
+      this.result_single_selected = null;
+      this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
+      this.disable_search_threshold = this.options.disable_search_threshold || 0;
+      this.disable_search = this.options.disable_search || false;
+      this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
+      this.search_contains = this.options.search_contains || false;
+      this.choices = 0;
+      this.single_backstroke_delete = this.options.single_backstroke_delete || false;
+      this.max_selected_options = this.options.max_selected_options || Infinity;
+      return this.inherit_select_classes = this.options.inherit_select_classes || false;
+    };
+
+    AbstractChosen.prototype.set_default_text = function() {
+      if (this.form_field.getAttribute("data-placeholder")) {
+        this.default_text = this.form_field.getAttribute("data-placeholder");
+      } else if (this.is_multiple) {
+        this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
+      } else {
+        this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
+      }
+      return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
+    };
+
+    AbstractChosen.prototype.mouse_enter = function() {
+      return this.mouse_on_container = true;
+    };
+
+    AbstractChosen.prototype.mouse_leave = function() {
+      return this.mouse_on_container = false;
+    };
+
+    AbstractChosen.prototype.input_focus = function(evt) {
+      var _this = this;
+      if (this.is_multiple) {
+        if (!this.active_field) {
+          return setTimeout((function() {
+            return _this.container_mousedown();
+          }), 50);
+        }
+      } else {
+        if (!this.active_field) {
+          return this.activate_field();
+        }
+      }
+    };
+
+    AbstractChosen.prototype.input_blur = function(evt) {
+      var _this = this;
+      if (!this.mouse_on_container) {
+        this.active_field = false;
+        return setTimeout((function() {
+          return _this.blur_test();
+        }), 100);
+      }
+    };
+
+    AbstractChosen.prototype.result_add_option = function(option) {
+      var classes, style;
+      if (!option.disabled) {
+        option.dom_id = this.container_id + "_o_" + option.array_index;
+        classes = option.selected && this.is_multiple ? [] : ["active-result"];
+        if (option.selected) {
+          classes.push("result-selected");
+        }
+        if (option.group_array_index != null) {
+          classes.push("group-option");
+        }
+        if (option.classes !== "") {
+          classes.push(option.classes);
+        }
+        style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
+        return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
+      } else {
+        return "";
+      }
+    };
+
+    AbstractChosen.prototype.results_update_field = function() {
+      this.set_default_text();
+      if (!this.is_multiple) {
+        this.results_reset_cleanup();
+      }
+      this.result_clear_highlight();
+      this.result_single_selected = null;
+      return this.results_build();
+    };
+
+    AbstractChosen.prototype.results_toggle = function() {
+      if (this.results_showing) {
+        return this.results_hide();
+      } else {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.results_search = function(evt) {
+      if (this.results_showing) {
+        return this.winnow_results();
+      } else {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.choices_click = function(evt) {
+      evt.preventDefault();
+      if (!this.results_showing) {
+        return this.results_show();
+      }
+    };
+
+    AbstractChosen.prototype.keyup_checker = function(evt) {
+      var stroke, _ref;
+      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+      this.search_field_scale();
+      switch (stroke) {
+        case 8:
+          if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
+            return this.keydown_backstroke();
+          } else if (!this.pending_backstroke) {
+            this.result_clear_highlight();
+            return this.results_search();
+          }
+          break;
+        case 13:
+          evt.preventDefault();
+          if (this.results_showing) {
+            return this.result_select(evt);
+          }
+          break;
+        case 27:
+          if (this.results_showing) {
+            this.results_hide();
+          }
+          return true;
+        case 9:
+        case 38:
+        case 40:
+        case 16:
+        case 91:
+        case 17:
+          break;
+        default:
+          return this.results_search();
+      }
+    };
+
+    AbstractChosen.prototype.generate_field_id = function() {
+      var new_id;
+      new_id = this.generate_random_id();
+      this.form_field.id = new_id;
+      return new_id;
+    };
+
+    AbstractChosen.prototype.generate_random_char = function() {
+      var chars, newchar, rand;
+      chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+      rand = Math.floor(Math.random() * chars.length);
+      return newchar = chars.substring(rand, rand + 1);
+    };
+
+    AbstractChosen.prototype.container_width = function() {
+      var width;
+      if (this.options.width != null) {
+        return this.options.width;
+      }
+      width = window.getComputedStyle != null ? parseFloat(window.getComputedStyle(this.form_field).getPropertyValue('width')) : (typeof jQuery !== "undefined" && jQuery !== null) && (this.form_field_jq != null) ? this.form_field_jq.outerWidth() : this.form_field.getWidth();
+      return width + "px";
+    };
+
+    AbstractChosen.browser_is_supported = function() {
+      var _ref;
+      if (window.navigator.appName === "Microsoft Internet Explorer") {
+        return (null !== (_ref = document.documentMode) && _ref >= 8);
+      }
+      return true;
+    };
+
+    AbstractChosen.default_multiple_text = "Select Some Options";
+
+    AbstractChosen.default_single_text = "Select an Option";
+
+    AbstractChosen.default_no_result_text = "No results match";
+
+    return AbstractChosen;
+
+  })();
+
+  root.AbstractChosen = AbstractChosen;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+
+(function() {
+  var $, Chosen, root,
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  root = this;
+
+  $ = jQuery;
+
+  $.fn.extend({
+    chosen: function(options) {
+      if (!AbstractChosen.browser_is_supported()) {
+        return this;
+      }
+      return this.each(function(input_field) {
+        var $this;
+        $this = $(this);
+        if (!$this.hasClass("chzn-done")) {
+          return $this.data('chosen', new Chosen(this, options));
+        }
+      });
+    }
+  });
+
+  Chosen = (function(_super) {
+
+    __extends(Chosen, _super);
+
+    function Chosen() {
+      return Chosen.__super__.constructor.apply(this, arguments);
+    }
+
+    Chosen.prototype.setup = function() {
+      this.form_field_jq = $(this.form_field);
+      this.current_selectedIndex = this.form_field.selectedIndex;
+      return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
+    };
+
+    Chosen.prototype.finish_setup = function() {
+      return this.form_field_jq.addClass("chzn-done");
+    };
+
+    Chosen.prototype.set_up_html = function() {
+      var container_classes, container_props;
+      this.container_id = this.form_field.id.length ? this.form_field.id.replace(/[^\w]/g, '_') : this.generate_field_id();
+      this.container_id += "_chzn";
+      container_classes = ["chzn-container"];
+      container_classes.push("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+      if (this.inherit_select_classes && this.form_field.className) {
+        container_classes.push(this.form_field.className);
+      }
+      if (this.is_rtl) {
+        container_classes.push("chzn-rtl");
+      }
+      container_props = {
+        'id': this.container_id,
+        'class': container_classes.join(' '),
+        'style': "width: " + (this.container_width()) + ";",
+        'title': this.form_field.title
+      };
+      this.container = $("<div />", container_props);
+      if (this.is_multiple) {
+        this.container.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop"><ul class="chzn-results"></ul></div>');
+      } else {
+        this.container.html('<a href="javascript:void(0)" class="chzn-single chzn-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
+      }
+      this.form_field_jq.hide().after(this.container);
+      this.dropdown = this.container.find('div.chzn-drop').first();
+      this.search_field = this.container.find('input').first();
+      this.search_results = this.container.find('ul.chzn-results').first();
+      this.search_field_scale();
+      this.search_no_results = this.container.find('li.no-results').first();
+      if (this.is_multiple) {
+        this.search_choices = this.container.find('ul.chzn-choices').first();
+        this.search_container = this.container.find('li.search-field').first();
+      } else {
+        this.search_container = this.container.find('div.chzn-search').first();
+        this.selected_item = this.container.find('.chzn-single').first();
+      }
+      this.results_build();
+      this.set_tab_index();
+      this.set_label_behavior();
+      return this.form_field_jq.trigger("liszt:ready", {
+        chosen: this
+      });
+    };
+
+    Chosen.prototype.register_observers = function() {
+      var _this = this;
+      this.container.mousedown(function(evt) {
+        _this.container_mousedown(evt);
+      });
+      this.container.mouseup(function(evt) {
+        _this.container_mouseup(evt);
+      });
+      this.container.mouseenter(function(evt) {
+        _this.mouse_enter(evt);
+      });
+      this.container.mouseleave(function(evt) {
+        _this.mouse_leave(evt);
+      });
+      this.search_results.mouseup(function(evt) {
+        _this.search_results_mouseup(evt);
+      });
+      this.search_results.mouseover(function(evt) {
+        _this.search_results_mouseover(evt);
+      });
+      this.search_results.mouseout(function(evt) {
+        _this.search_results_mouseout(evt);
+      });
+      this.search_results.bind('mousewheel DOMMouseScroll', function(evt) {
+        _this.search_results_mousewheel(evt);
+      });
+      this.form_field_jq.bind("liszt:updated", function(evt) {
+        _this.results_update_field(evt);
+      });
+      this.form_field_jq.bind("liszt:activate", function(evt) {
+        _this.activate_field(evt);
+      });
+      this.form_field_jq.bind("liszt:open", function(evt) {
+        _this.container_mousedown(evt);
+      });
+      this.search_field.blur(function(evt) {
+        _this.input_blur(evt);
+      });
+      this.search_field.keyup(function(evt) {
+        _this.keyup_checker(evt);
+      });
+      this.search_field.keydown(function(evt) {
+        _this.keydown_checker(evt);
+      });
+      this.search_field.focus(function(evt) {
+        _this.input_focus(evt);
+      });
+      if (this.is_multiple) {
+        return this.search_choices.click(function(evt) {
+          _this.choices_click(evt);
+        });
+      } else {
+        return this.container.click(function(evt) {
+          evt.preventDefault();
+        });
+      }
+    };
+
+    Chosen.prototype.search_field_disabled = function() {
+      this.is_disabled = this.form_field_jq[0].disabled;
+      if (this.is_disabled) {
+        this.container.addClass('chzn-disabled');
+        this.search_field[0].disabled = true;
+        if (!this.is_multiple) {
+          this.selected_item.unbind("focus", this.activate_action);
+        }
+        return this.close_field();
+      } else {
+        this.container.removeClass('chzn-disabled');
+        this.search_field[0].disabled = false;
+        if (!this.is_multiple) {
+          return this.selected_item.bind("focus", this.activate_action);
+        }
+      }
+    };
+
+    Chosen.prototype.container_mousedown = function(evt) {
+      if (!this.is_disabled) {
+        if (evt && evt.type === "mousedown" && !this.results_showing) {
+          evt.preventDefault();
+        }
+        if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
+          if (!this.active_field) {
+            if (this.is_multiple) {
+              this.search_field.val("");
+            }
+            $(document).click(this.click_test_action);
+            this.results_show();
+          } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) {
+            evt.preventDefault();
+            this.results_toggle();
+          }
+          return this.activate_field();
+        }
+      }
+    };
+
+    Chosen.prototype.container_mouseup = function(evt) {
+      if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
+        return this.results_reset(evt);
+      }
+    };
+
+    Chosen.prototype.search_results_mousewheel = function(evt) {
+      var delta, _ref, _ref1;
+      delta = -((_ref = evt.originalEvent) != null ? _ref.wheelDelta : void 0) || ((_ref1 = evt.originialEvent) != null ? _ref1.detail : void 0);
+      if (delta != null) {
+        evt.preventDefault();
+        if (evt.type === 'DOMMouseScroll') {
+          delta = delta * 40;
+        }
+        return this.search_results.scrollTop(delta + this.search_results.scrollTop());
+      }
+    };
+
+    Chosen.prototype.blur_test = function(evt) {
+      if (!this.active_field && this.container.hasClass("chzn-container-active")) {
+        return this.close_field();
+      }
+    };
+
+    Chosen.prototype.close_field = function() {
+      $(document).unbind("click", this.click_test_action);
+      this.active_field = false;
+      this.results_hide();
+      this.container.removeClass("chzn-container-active");
+      this.winnow_results_clear();
+      this.clear_backstroke();
+      this.show_search_field_default();
+      return this.search_field_scale();
+    };
+
+    Chosen.prototype.activate_field = function() {
+      this.container.addClass("chzn-container-active");
+      this.active_field = true;
+      this.search_field.val(this.search_field.val());
+      return this.search_field.focus();
+    };
+
+    Chosen.prototype.test_active_click = function(evt) {
+      if ($(evt.target).parents('#' + this.container_id).length) {
+        return this.active_field = true;
+      } else {
+        return this.close_field();
+      }
+    };
+
+    Chosen.prototype.results_build = function() {
+      var content, data, _i, _len, _ref;
+      this.parsing = true;
+      this.results_data = root.SelectParser.select_to_array(this.form_field);
+      if (this.is_multiple && this.choices > 0) {
+        this.search_choices.find("li.search-choice").remove();
+        this.choices = 0;
+      } else if (!this.is_multiple) {
+        this.selected_item.addClass("chzn-default").find("span").text(this.default_text);
+        if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
+          this.container.addClass("chzn-container-single-nosearch");
+        } else {
+          this.container.removeClass("chzn-container-single-nosearch");
+        }
+      }
+      content = '';
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        data = _ref[_i];
+        if (data.group) {
+          content += this.result_add_group(data);
+        } else if (!data.empty) {
+          content += this.result_add_option(data);
+          if (data.selected && this.is_multiple) {
+            this.choice_build(data);
+          } else if (data.selected && !this.is_multiple) {
+            this.selected_item.removeClass("chzn-default").find("span").text(data.text);
+            if (this.allow_single_deselect) {
+              this.single_deselect_control_build();
+            }
+          }
+        }
+      }
+      this.search_field_disabled();
+      this.show_search_field_default();
+      this.search_field_scale();
+      this.search_results.html(content);
+      return this.parsing = false;
+    };
+
+    Chosen.prototype.result_add_group = function(group) {
+      if (!group.disabled) {
+        group.dom_id = this.container_id + "_g_" + group.array_index;
+        return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
+      } else {
+        return "";
+      }
+    };
+
+    Chosen.prototype.result_do_highlight = function(el) {
+      var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
+      if (el.length) {
+        this.result_clear_highlight();
+        this.result_highlight = el;
+        this.result_highlight.addClass("highlighted");
+        maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
+        visible_top = this.search_results.scrollTop();
+        visible_bottom = maxHeight + visible_top;
+        high_top = this.result_highlight.position().top + this.search_results.scrollTop();
+        high_bottom = high_top + this.result_highlight.outerHeight();
+        if (high_bottom >= visible_bottom) {
+          return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
+        } else if (high_top < visible_top) {
+          return this.search_results.scrollTop(high_top);
+        }
+      }
+    };
+
+    Chosen.prototype.result_clear_highlight = function() {
+      if (this.result_highlight) {
+        this.result_highlight.removeClass("highlighted");
+      }
+      return this.result_highlight = null;
+    };
+
+    Chosen.prototype.results_show = function() {
+      if (this.result_single_selected != null) {
+        this.result_do_highlight(this.result_single_selected);
+      } else if (this.is_multiple && this.max_selected_options <= this.choices) {
+        this.form_field_jq.trigger("liszt:maxselected", {
+          chosen: this
+        });
+        return false;
+      }
+      this.container.addClass("chzn-with-drop");
+      this.form_field_jq.trigger("liszt:showing_dropdown", {
+        chosen: this
+      });
+      this.results_showing = true;
+      this.search_field.focus();
+      this.search_field.val(this.search_field.val());
+      return this.winnow_results();
+    };
+
+    Chosen.prototype.results_hide = function() {
+      this.result_clear_highlight();
+      this.container.removeClass("chzn-with-drop");
+      this.form_field_jq.trigger("liszt:hiding_dropdown", {
+        chosen: this
+      });
+      return this.results_showing = false;
+    };
+
+    Chosen.prototype.set_tab_index = function(el) {
+      var ti;
+      if (this.form_field_jq.attr("tabindex")) {
+        ti = this.form_field_jq.attr("tabindex");
+        this.form_field_jq.attr("tabindex", -1);
+        return this.search_field.attr("tabindex", ti);
+      }
+    };
+
+    Chosen.prototype.set_label_behavior = function() {
+      var _this = this;
+      this.form_field_label = this.form_field_jq.parents("label");
+      if (!this.form_field_label.length && this.form_field.id.length) {
+        this.form_field_label = $("label[for=" + this.form_field.id + "]");
+      }
+      if (this.form_field_label.length > 0) {
+        return this.form_field_label.click(function(evt) {
+          if (_this.is_multiple) {
+            return _this.container_mousedown(evt);
+          } else {
+            return _this.activate_field();
+          }
+        });
+      }
+    };
+
+    Chosen.prototype.show_search_field_default = function() {
+      if (this.is_multiple && this.choices < 1 && !this.active_field) {
+        this.search_field.val(this.default_text);
+        return this.search_field.addClass("default");
+      } else {
+        this.search_field.val("");
+        return this.search_field.removeClass("default");
+      }
+    };
+
+    Chosen.prototype.search_results_mouseup = function(evt) {
+      var target;
+      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+      if (target.length) {
+        this.result_highlight = target;
+        this.result_select(evt);
+        return this.search_field.focus();
+      }
+    };
+
+    Chosen.prototype.search_results_mouseover = function(evt) {
+      var target;
+      target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
+      if (target) {
+        return this.result_do_highlight(target);
+      }
+    };
+
+    Chosen.prototype.search_results_mouseout = function(evt) {
+      if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
+        return this.result_clear_highlight();
+      }
+    };
+
+    Chosen.prototype.choice_build = function(item) {
+      var choice_id, html, link,
+        _this = this;
+      if (this.is_multiple && this.max_selected_options <= this.choices) {
+        this.form_field_jq.trigger("liszt:maxselected", {
+          chosen: this
+        });
+        return false;
+      }
+      choice_id = this.container_id + "_c_" + item.array_index;
+      this.choices += 1;
+      if (item.disabled) {
+        html = '<li class="search-choice search-choice-disabled" id="' + choice_id + '"><span>' + item.html + '</span></li>';
+      } else {
+        html = '<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>';
+      }
+      this.search_container.before(html);
+      link = $('#' + choice_id).find("a").first();
+      return link.click(function(evt) {
+        return _this.choice_destroy_link_click(evt);
+      });
+    };
+
+    Chosen.prototype.choice_destroy_link_click = function(evt) {
+      evt.preventDefault();
+      evt.stopPropagation();
+      if (!this.is_disabled) {
+        return this.choice_destroy($(evt.target));
+      }
+    };
+
+    Chosen.prototype.choice_destroy = function(link) {
+      if (this.result_deselect(link.attr("rel"))) {
+        this.choices -= 1;
+        this.show_search_field_default();
+        if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
+          this.results_hide();
+        }
+        link.parents('li').first().remove();
+        return this.search_field_scale();
+      }
+    };
+
+    Chosen.prototype.results_reset = function() {
+      this.form_field.options[0].selected = true;
+      this.selected_item.find("span").text(this.default_text);
+      if (!this.is_multiple) {
+        this.selected_item.addClass("chzn-default");
+      }
+      this.show_search_field_default();
+      this.results_reset_cleanup();
+      this.form_field_jq.trigger("change");
+      if (this.active_field) {
+        return this.results_hide();
+      }
+    };
+
+    Chosen.prototype.results_reset_cleanup = function() {
+      this.current_selectedIndex = this.form_field.selectedIndex;
+      return this.selected_item.find("abbr").remove();
+    };
+
+    Chosen.prototype.result_select = function(evt) {
+      var high, high_id, item, position;
+      if (this.result_highlight) {
+        high = this.result_highlight;
+        high_id = high.attr("id");
+        this.result_clear_highlight();
+        if (this.is_multiple) {
+          this.result_deactivate(high);
+        } else {
+          this.search_results.find(".result-selected").removeClass("result-selected");
+          this.result_single_selected = high;
+          this.selected_item.removeClass("chzn-default");
+        }
+        high.addClass("result-selected");
+        position = high_id.substr(high_id.lastIndexOf("_") + 1);
+        item = this.results_data[position];
+        item.selected = true;
+        this.form_field.options[item.options_index].selected = true;
+        if (this.is_multiple) {
+          this.choice_build(item);
+        } else {
+          this.selected_item.find("span").first().text(item.text);
+          if (this.allow_single_deselect) {
+            this.single_deselect_control_build();
+          }
+        }
+        if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
+          this.results_hide();
+        }
+        this.search_field.val("");
+        if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
+          this.form_field_jq.trigger("change", {
+            'selected': this.form_field.options[item.options_index].value
+          });
+        }
+        this.current_selectedIndex = this.form_field.selectedIndex;
+        return this.search_field_scale();
+      }
+    };
+
+    Chosen.prototype.result_activate = function(el) {
+      return el.addClass("active-result");
+    };
+
+    Chosen.prototype.result_deactivate = function(el) {
+      return el.removeClass("active-result");
+    };
+
+    Chosen.prototype.result_deselect = function(pos) {
+      var result, result_data;
+      result_data = this.results_data[pos];
+      if (!this.form_field.options[result_data.options_index].disabled) {
+        result_data.selected = false;
+        this.form_field.options[result_data.options_index].selected = false;
+        result = $("#" + this.container_id + "_o_" + pos);
+        result.removeClass("result-selected").addClass("active-result").show();
+        this.result_clear_highlight();
+        this.winnow_results();
+        this.form_field_jq.trigger("change", {
+          deselected: this.form_field.options[result_data.options_index].value
+        });
+        this.search_field_scale();
+        return true;
+      } else {
+        return false;
+      }
+    };
+
+    Chosen.prototype.single_deselect_control_build = function() {
+      if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
+        return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
+      }
+    };
+
+    Chosen.prototype.winnow_results = function() {
+      var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len1, _ref;
+      this.no_results_clear();
+      results = 0;
+      searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
+      regexAnchor = this.search_contains ? "" : "^";
+      regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
+      _ref = this.results_data;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        option = _ref[_i];
+        if (!option.disabled && !option.empty) {
+          if (option.group) {
+            $('#' + option.dom_id).css('display', 'none');
+          } else if (!(this.is_multiple && option.selected)) {
+            found = false;
+            result_id = option.dom_id;
+            result = $("#" + result_id);
+            if (regex.test(option.html)) {
+              found = true;
+              results += 1;
+            } else if (this.enable_split_word_search && (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0)) {
+              parts = option.html.replace(/\[|\]/g, "").split(" ");
+              if (parts.length) {
+                for (_j = 0, _len1 = parts.length; _j < _len1; _j++) {
+                  part = parts[_j];
+                  if (regex.test(part)) {
+                    found = true;
+                    results += 1;
+                  }
+                }
+              }
+            }
+            if (found) {
+              if (searchText.length) {
+                startpos = option.html.search(zregex);
+                text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
+                text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
+              } else {
+                text = option.html;
+              }
+              result.html(text);
+              this.result_activate(result);
+              if (option.group_array_index != null) {
+                $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item');
+              }
+            } else {
+              if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
+                this.result_clear_highlight();
+              }
+              this.result_deactivate(result);
+            }
+          }
+        }
+      }
+      if (results < 1 && searchText.length) {
+        return this.no_results(searchText);
+      } else {
+        return this.winnow_results_set_highlight();
+      }
+    };
+
+    Chosen.prototype.winnow_results_clear = function() {
+      var li, lis, _i, _len, _results;
+      this.search_field.val("");
+      lis = this.search_results.find("li");
+      _results = [];
+      for (_i = 0, _len = lis.length; _i < _len; _i++) {
+        li = lis[_i];
+        li = $(li);
+        if (li.hasClass("group-result")) {
+          _results.push(li.css('display', 'auto'));
+        } else if (!this.is_multiple || !li.hasClass("result-selected")) {
+          _results.push(this.result_activate(li));
+        } else {
+          _results.push(void 0);
+        }
+      }
+      return _results;
+    };
+
+    Chosen.prototype.winnow_results_set_highlight = function() {
+      var do_high, selected_results;
+      if (!this.result_highlight) {
+        selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
+        do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
+        if (do_high != null) {
+          return this.result_do_highlight(do_high);
+        }
+      }
+    };
+
+    Chosen.prototype.no_results = function(terms) {
+      var no_results_html;
+      no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
+      no_results_html.find("span").first().html(terms);
+      return this.search_results.append(no_results_html);
+    };
+
+    Chosen.prototype.no_results_clear = function() {
+      return this.search_results.find(".no-results").remove();
+    };
+
+    Chosen.prototype.keydown_arrow = function() {
+      var first_active, next_sib;
+      if (!this.result_highlight) {
+        first_active = this.search_results.find("li.active-result").first();
+        if (first_active) {
+          this.result_do_highlight($(first_active));
+        }
+      } else if (this.results_showing) {
+        next_sib = this.result_highlight.nextAll("li.active-result").first();
+        if (next_sib) {
+          this.result_do_highlight(next_sib);
+        }
+      }
+      if (!this.results_showing) {
+        return this.results_show();
+      }
+    };
+
+    Chosen.prototype.keyup_arrow = function() {
+      var prev_sibs;
+      if (!this.results_showing && !this.is_multiple) {
+        return this.results_show();
+      } else if (this.result_highlight) {
+        prev_sibs = this.result_highlight.prevAll("li.active-result");
+        if (prev_sibs.length) {
+          return this.result_do_highlight(prev_sibs.first());
+        } else {
+          if (this.choices > 0) {
+            this.results_hide();
+          }
+          return this.result_clear_highlight();
+        }
+      }
+    };
+
+    Chosen.prototype.keydown_backstroke = function() {
+      var next_available_destroy;
+      if (this.pending_backstroke) {
+        this.choice_destroy(this.pending_backstroke.find("a").first());
+        return this.clear_backstroke();
+      } else {
+        next_available_destroy = this.search_container.siblings("li.search-choice").last();
+        if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
+          this.pending_backstroke = next_available_destroy;
+          if (this.single_backstroke_delete) {
+            return this.keydown_backstroke();
+          } else {
+            return this.pending_backstroke.addClass("search-choice-focus");
+          }
+        }
+      }
+    };
+
+    Chosen.prototype.clear_backstroke = function() {
+      if (this.pending_backstroke) {
+        this.pending_backstroke.removeClass("search-choice-focus");
+      }
+      return this.pending_backstroke = null;
+    };
+
+    Chosen.prototype.keydown_checker = function(evt) {
+      var stroke, _ref;
+      stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+      this.search_field_scale();
+      if (stroke !== 8 && this.pending_backstroke) {
+        this.clear_backstroke();
+      }
+      switch (stroke) {
+        case 8:
+          this.backstroke_length = this.search_field.val().length;
+          break;
+        case 9:
+          if (this.results_showing && !this.is_multiple) {
+            this.result_select(evt);
+          }
+          this.mouse_on_container = false;
+          break;
+        case 13:
+          evt.preventDefault();
+          break;
+        case 38:
+          evt.preventDefault();
+          this.keyup_arrow();
+          break;
+        case 40:
+          this.keydown_arrow();
+          break;
+      }
+    };
+
+    Chosen.prototype.search_field_scale = function() {
+      var div, h, style, style_block, styles, w, _i, _len;
+      if (this.is_multiple) {
+        h = 0;
+        w = 0;
+        style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
+        styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
+        for (_i = 0, _len = styles.length; _i < _len; _i++) {
+          style = styles[_i];
+          style_block += style + ":" + this.search_field.css(style) + ";";
+        }
+        div = $('<div />', {
+          'style': style_block
+        });
+        div.text(this.search_field.val());
+        $('body').append(div);
+        w = div.width() + 25;
+        div.remove();
+        if (!this.f_width) {
+          this.f_width = this.container.outerWidth();
+        }
+        if (w > this.f_width - 10) {
+          w = this.f_width - 10;
+        }
+        return this.search_field.css({
+          'width': w + 'px'
+        });
+      }
+    };
+
+    Chosen.prototype.generate_random_id = function() {
+      var string;
+      string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
+      while ($("#" + string).length > 0) {
+        string += this.generate_random_char();
+      }
+      return string;
+    };
+
+    return Chosen;
+
+  })(AbstractChosen);
+
+  root.Chosen = Chosen;
+
+}).call(this);
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png b/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png
deleted file mode 100644 (file)
index 8f7cf74..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-hover.png b/resources/jquery.ui/themes/vector/images/button-blue-hover.png
deleted file mode 100644 (file)
index 1fc2816..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue-large.png b/resources/jquery.ui/themes/vector/images/button-blue-large.png
deleted file mode 100644 (file)
index 22ee5e5..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-blue.png b/resources/jquery.ui/themes/vector/images/button-blue.png
deleted file mode 100644 (file)
index 2e6d121..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png b/resources/jquery.ui/themes/vector/images/button-disabled-blue.png
deleted file mode 100644 (file)
index 28eb1fc..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-green.png b/resources/jquery.ui/themes/vector/images/button-disabled-green.png
deleted file mode 100644 (file)
index 0e29d85..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled-red.png b/resources/jquery.ui/themes/vector/images/button-disabled-red.png
deleted file mode 100644 (file)
index ede6998..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-disabled.png b/resources/jquery.ui/themes/vector/images/button-disabled.png
deleted file mode 100644 (file)
index e4e4ec1..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-blue.png b/resources/jquery.ui/themes/vector/images/button-down-blue.png
deleted file mode 100644 (file)
index 766e574..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-green.png b/resources/jquery.ui/themes/vector/images/button-down-green.png
deleted file mode 100644 (file)
index 90969c3..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down-red.png b/resources/jquery.ui/themes/vector/images/button-down-red.png
deleted file mode 100644 (file)
index f625729..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-down.png b/resources/jquery.ui/themes/vector/images/button-down.png
deleted file mode 100644 (file)
index c646757..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-down.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-hover-large.png b/resources/jquery.ui/themes/vector/images/button-green-hover-large.png
deleted file mode 100644 (file)
index dd8851e..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-hover.png b/resources/jquery.ui/themes/vector/images/button-green-hover.png
deleted file mode 100644 (file)
index 19c3991..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green-large.png b/resources/jquery.ui/themes/vector/images/button-green-large.png
deleted file mode 100644 (file)
index a8e830e..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-green.png b/resources/jquery.ui/themes/vector/images/button-green.png
deleted file mode 100644 (file)
index 54c418e..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png b/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png
deleted file mode 100644 (file)
index f76f7b0..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-large-disabled-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-large-off-green.png b/resources/jquery.ui/themes/vector/images/button-large-off-green.png
deleted file mode 100644 (file)
index f997431..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-large-off-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-blue.png b/resources/jquery.ui/themes/vector/images/button-off-blue.png
deleted file mode 100644 (file)
index 82dedb5..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-green.png b/resources/jquery.ui/themes/vector/images/button-off-green.png
deleted file mode 100644 (file)
index 109907f..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off-red.png b/resources/jquery.ui/themes/vector/images/button-off-red.png
deleted file mode 100644 (file)
index 5a85b8a..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-off.png b/resources/jquery.ui/themes/vector/images/button-off.png
deleted file mode 100644 (file)
index cc5eb11..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-off.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png b/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png
deleted file mode 100644 (file)
index 6f0dbd5..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-hover.png b/resources/jquery.ui/themes/vector/images/button-orange-hover.png
deleted file mode 100644 (file)
index a1077c5..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange-large.png b/resources/jquery.ui/themes/vector/images/button-orange-large.png
deleted file mode 100644 (file)
index 3d7f37f..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-orange.png b/resources/jquery.ui/themes/vector/images/button-orange.png
deleted file mode 100644 (file)
index 02347cf..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-orange.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-blue.png b/resources/jquery.ui/themes/vector/images/button-over-blue.png
deleted file mode 100644 (file)
index 9edb7aa..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over-blue.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-green.png b/resources/jquery.ui/themes/vector/images/button-over-green.png
deleted file mode 100644 (file)
index 47a0b1b..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over-green.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over-red.png b/resources/jquery.ui/themes/vector/images/button-over-red.png
deleted file mode 100644 (file)
index a244536..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over-red.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-over.png b/resources/jquery.ui/themes/vector/images/button-over.png
deleted file mode 100644 (file)
index 558f1f8..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-over.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-hover-large.png b/resources/jquery.ui/themes/vector/images/button-red-hover-large.png
deleted file mode 100644 (file)
index 11ccef0..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red-hover-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-hover.png b/resources/jquery.ui/themes/vector/images/button-red-hover.png
deleted file mode 100644 (file)
index 55a6174..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red-hover.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red-large.png b/resources/jquery.ui/themes/vector/images/button-red-large.png
deleted file mode 100644 (file)
index 8d089ef..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red-large.png and /dev/null differ
diff --git a/resources/jquery.ui/themes/vector/images/button-red.png b/resources/jquery.ui/themes/vector/images/button-red.png
deleted file mode 100644 (file)
index 7a292fc..0000000
Binary files a/resources/jquery.ui/themes/vector/images/button-red.png and /dev/null differ
old mode 100644 (file)
new mode 100755 (executable)
index a6a1b54..9314ef6
@@ -29,6 +29,7 @@ button.ui-button-icons-only {
 .ui-button .ui-button-text {
        display: block;
        line-height: 1.4;
+       text-shadow: 0 1px 1px #fff;
 }
 .ui-button-text-only .ui-button-text {
        padding: 0.3em 1em 0.25em 1em;
@@ -98,17 +99,21 @@ button.ui-button::-moz-focus-inner {
        border: 0;
        padding: 0; /* reset extra padding in Firefox */
 }
-
-body .ui-button {
-       margin: 0.5em 0 0.5em 0.4em;
-       border: 1px solid #a6a6a6 !important;
+/* Disables the annoying dashed border Firefox puts on active buttons */
+body button.ui-button::-moz-focus-inner {
+       border: 0;
+}
+/* Give large buttons some extra padding */
+body .ui-button-large {
+       padding: 5px;
+}
+/* Use white icons for colored buttons */
+.ui-button-green .ui-icon,
+.ui-button-blue .ui-icon,
+.ui-button-red .ui-icon,
+.ui-button-orange .ui-icon {
        /* @embed */
-       background: #f2f2f2 url(images/button-off.png) repeat-x scroll 50% 100% !important;
-       cursor: pointer;
-       font-size: 1em;
-       line-height: 1.4em;
-       width: auto;
-       overflow: visible;
+       background-image: url(images/ui-icons_ffffff_256x240.png) !important;
 }
 
 /* Corner radius */
@@ -124,6 +129,7 @@ body .ui-button {
 }
 .ui-button.ui-corner-all,
 .ui-button.ui-corner-top,
+
 .ui-button.ui-corner-right,
 .ui-button.ui-corner-tr {
        -moz-border-radius-topright: 4px;
@@ -147,145 +153,230 @@ body .ui-button {
        border-bottom-right-radius: 4px;
 }
 
+body .ui-button {
+       color: #2779aa;
+       margin: 0.5em 0 0.5em 0.4em;
+       border: 1px solid #aaa !important;
+       background: #f0f0f0 !important;
+       background: -moz-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #fff 0%, #ddd 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #fff 0%, #ddd 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#dddddd', GradientType=0); /* IE6-8 */
+       cursor: pointer;
+       font-size: 1em;
+       line-height: 1.4em;
+       width: auto;
+       overflow: visible;
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.2);
+       box-shadow: 0 1px 3px rgba(0,0,0,.2);
+}
 body .ui-button:hover {
-       border-color: #6e7273;
-       /* @embed */
-       background: #e1e1e1 url(images/button-over.png) repeat-x scroll 50% 100% !important;
+       color: #2779aa;
+       border-color: #bbb !important;
+       background: #fff !important;
+       background: -moz-linear-gradient(top, #fff 0%, #eee 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #fff 0%, #eee 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #fff 0%, #eee 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #fff 0%, #eee 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.1);
+       box-shadow: 0 1px 3px rgba(0,0,0,.1);
 }
 body .ui-button:active,
 body .ui-button:focus {
-       border-color: #707271;
-       /* @embed */
-       background: #bfbfbf url(images/button-down.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.disabled {
-       color: #7f7f7f;
-       border-color: #cccccc;
-       /* @embed */
-       background: #f2f2f2 url(images/button-disabled.png) repeat-x scroll 50% 100% !important;
-}
-/* Disables the annoying dashed border Firefox puts on active buttons */
-body button.ui-button::-moz-focus-inner {
-       border: 0;
-}
-/* Give large buttons some extra padding */
-body .ui-button-large {
-       padding: 5px;
-}
-/* Use white icons for colored buttons */
-.ui-button-green .ui-icon, .ui-button-blue .ui-icon, .ui-button-red .ui-icon, .ui-button-orange .ui-icon {
-       /* @embed */
-       background-image: url(images/ui-icons_ffffff_256x240.png) !important;
+       border-color: #8ad !important;
+       -webkit-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+       -moz-box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+       box-shadow: 0 0 1px 1px rgba(167,215,249,.5);
+}
+body .ui-button:active {
+       background: #e0e0e0 !important;
+       background: -moz-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #f0f0f0 0%, #d0d0d0 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f0f0f0', endColorstr='#d0d0d0', GradientType=0); /* IE6-8 */
 }
 
 /* Green buttons */
-
+body .ui-button-green,
+body .ui-button-green .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #072;
+}
 body .ui-button.ui-button-green {
-       color: white !important;
-       border-color: #97af7e !important;
-       /* @embed */
-       background: #3cb677 url(images/button-green.png) repeat-x scroll 50% 100% !important;
+       border-color: #294 !important;
+       background: #295 !important;
+       background: -moz-linear-gradient(top, #3c8 0%, #295 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #3c8 0%, #295 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #3c8 0%, #295 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #3c8 0%, #295 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#33cc88', endColorstr='#229955', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       box-shadow: 0 1px 3px rgba(0,0,0,.3);
 }
 body .ui-button.ui-button-green:hover {
-       border-color: #778e61 !important;
-       /* @embed */
-       background: #339b65 url(images/button-green-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.ui-button-large {
-       /* @embed */
-       background: #3cb677 url(images/button-green-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.ui-button-large:hover {
-       /* @embed */
-       background: #339b65 url(images/button-green-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-green.disabled {
-       filter:alpha(opacity=50);
-       -moz-opacity:0.50;
-       -khtml-opacity: 0.50;
-       opacity: 0.50;
+       background: #33a055 !important;
+       background: -moz-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #44d388 0%, #33a055 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #44d388 0%, #33a055 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#44d388', endColorstr='#33a055', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.25);
+       box-shadow: 0 1px 3px rgba(0,0,0,.25);
+}
+body .ui-button.ui-button-green:active,
+body .ui-button.ui-button-green:focus {
+       border-color: #172 !important;
+       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-green:active {
+       background: #338855 !important;
+       background: -moz-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #30c080 0%, #338855 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #30c080 0%, #338855 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#30c080', endColorstr='#338855', GradientType=0); /* IE6-8 */
 }
 
 /* Blue buttons */
-
+body .ui-button-blue,
+body .ui-button-blue .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #037;
+}
 body .ui-button.ui-button-blue {
-       color: white !important;
-       border-color: #628acb !important;
-       /* @embed */
-       background: #3365ba url(images/button-blue.png) repeat-x scroll 50% 100% !important;
+       border-color: #468 !important;
+       background: #36b !important;
+       background: -moz-linear-gradient(top, #48e 0%, #36b 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #48e 0%, #36b 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #48e 0%, #36b 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #48e 0%, #36b 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4488ee', endColorstr='#3366bb', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       box-shadow: 0 1px 3px rgba(0,0,0,.35);
 }
 body .ui-button.ui-button-blue:hover {
-       border-color: #5375ad !important;
-       /* @embed */
-       background: #2b569e url(images/button-blue-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.ui-button-large {
-       /* @embed */
-       background: #3365ba url(images/button-blue-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.ui-button-large:hover {
-       /* @embed */
-       background: #2b569e url(images/button-blue-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-blue.disabled {
-       filter:alpha(opacity=50);
-       -moz-opacity:0.50;
-       -khtml-opacity: 0.50;
-       opacity: 0.50;
+       background: #36c !important;
+       background: -moz-linear-gradient(top, #59e 0%, #36c 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #59e 0%, #36c 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #59e 0%, #36c 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #59e 0%, #36c 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5599ee', endColorstr='#3366cc', GradientType=0); /* IE6-8 */
+}
+body .ui-button.ui-button-blue:active,
+body .ui-button.ui-button-blue:focus {
+       border-color: #357 !important;
+       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.75);
+}
+body .ui-button.ui-button-blue:active {
+       background: #3060a0 !important;
+       background: -moz-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #4080e0 0%, #3060a0 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #4080e0 0%, #3060a0 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4080e0', endColorstr='#3060a0', GradientType=0); /* IE6-8 */
 }
 
 /* Red buttons */
-
+body .ui-button-red,
+body .ui-button-red .ui-button-text {
+       color: white;
+       text-shadow: 0 -1px 1px #700;
+}
 body .ui-button.ui-button-red {
-       color: white !important;
-       border-color: #af977e !important;
-       /* @embed */
-       background: #cb0000 url(images/button-red.png) repeat-x scroll 50% 100% !important;
+       border-color: #944 !important;
+       background: #a22 !important;
+       background: -moz-linear-gradient(top, #d44 0%, #a22 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #d44 0%, #a22 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #d44 0%, #a22 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #d44 0%, #a22 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dd4444', endColorstr='#aa2222', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.35);
+       box-shadow: 0 1px 3px rgba(0,0,0,.35);
 }
 body .ui-button.ui-button-red:hover {
-       border-color: #8e7761 !important;
-       /* @embed */
-       background: #ad0000 url(images/button-red-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.ui-button-large {
-       /* @embed */
-       background: #cb0000 url(images/button-red.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.ui-button-large:hover {
-       /* @embed */
-       background: #ad0000 url(images/button-red-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-red.disabled {
-       filter:alpha(opacity=50);
-       -moz-opacity:0.50;
-       -khtml-opacity: 0.50;
-       opacity: 0.50;
+       border-color: #a44 !important;
+       background: #b03333 !important;
+       background: -moz-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #ee4646 0%, #b03333 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #ee4646 0%, #b03333 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee4646', endColorstr='#b03333', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,.3);
+       box-shadow: 0 1px 3px rgba(0,0,0,.3);
+}
+body .ui-button.ui-button-red:active,
+body .ui-button.ui-button-red:focus {
+       border-color: #747 !important;
+       -webkit-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+       -moz-box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+       box-shadow: 0 0 2px 2px rgba(167,215,249,.7);
+}
+body .ui-button.ui-button-red:active {
+       background: #952020 !important;
+       background: -moz-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #d04545 0%, #952020 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #d04545 0%, #952020 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d04545', endColorstr='#952020', GradientType=0); /* IE6-8 */
 }
 
-/* Orange buttons */
-
-body .ui-button.ui-button-orange {
-       color: white !important;
-       border-color: #f3a863 !important;
-       /* @embed */
-       background: #f07f14 url(images/button-orange.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange:hover {
-       border-color: #ce9055 !important;
-       /* @embed */
-       background: #cc6c11 url(images/button-orange-hover.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.ui-button-large {
-       /* @embed */
-       background: #f07f14 url(images/button-orange-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.ui-button-large:hover {
-       /* @embed */
-       background: #cc6c11 url(images/button-orange-hover-large.png) repeat-x scroll 50% 100% !important;
-}
-body .ui-button.ui-button-orange.disabled {
-       filter:alpha(opacity=50);
-       -moz-opacity:0.50;
-       -khtml-opacity: 0.50;
-       opacity: 0.50;
-}
+/* Disabled buttons */
+body .ui-button-green.disabled,
+body .ui-button-green.disabled:hover,
+body .ui-button-green.disabled:active,
+body .ui-button-green.disabled:focus,
+body .ui-button-blue.disabled,
+body .ui-button-blue.disabled:hover,
+body .ui-button-blue.disabled:active,
+body .ui-button-blue.disabled:focus,
+body .ui-button-red.disabled,
+body .ui-button-red.disabled:hover,
+body .ui-button-red.disabled:active,
+body .ui-button-red.disabled:focus,
+body .ui-button.disabled,
+body .ui-button.disabled:hover {
+       color: #aaa;
+       border-color: #ccc !important;
+       background: #eee !important;
+       background: -moz-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* FF3.6+ */
+       background: -webkit-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Chrome10+, Safari5.1+ */
+       background: -o-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* Opera 11.10+ */
+       background: -ms-linear-gradient(top, #f6f6f6 0%, #eee 90%) !important; /* IE10+ */
+       background: linear-gradient(to bottom, #f6f6f6 0%, #eee 90%) !important;
+       filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f6f6', endColorstr='#eeeeee', GradientType=0); /* IE6-8 */
+       -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0);
+       -moz-box-shadow: 0 1px 3px rgba(0,0,0,0);
+       box-shadow: 0 1px 3px rgba(0,0,0,0);
+}
+body .ui-button-green.disabled .ui-button-text,
+body .ui-button-blue.disabled .ui-button-text,
+body .ui-button-red.disabled .ui-button-text {
+       color: #aaa;
+       text-shadow: 0 1px 1px #fff;
+}
\ No newline at end of file
index d961bf3..c706bb9 100644 (file)
@@ -8,6 +8,7 @@
        font-size: 12px;
        line-height: 12px;
        background-color: #d2d2d2;
+       cursor: pointer;
 }
 
 .mw-badge-content {
 }
 
 .mw-badge-inline {
-       display: inline-block;
        margin-left: 3px;
+       display: inline-block;
+       /* Hack for IE6 and IE7 (bug 47926) */
+       zoom: 1;
+       *display: inline;
+
 }
 .mw-badge-overlay {
        position: absolute;
index f2b98f0..a8c0b06 100644 (file)
@@ -78,7 +78,8 @@
                // Chop off characters from the end of the "inserted content" string
                // until the limit is statisfied.
                if ( fn ) {
-                       while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit ) {
+                       // 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 );
                        }
                } else {
index 630002d..e1a07b6 100644 (file)
@@ -24,7 +24,7 @@
         * @param {Object|undefined} options
         */
        function toggleElement( $collapsible, action, $defaultToggle, options ) {
-               var $collapsibleContent, $containers;
+               var $collapsibleContent, $containers, hookCallback;
                options = options || {};
 
                // Validate parameters
                        return;
                }
 
+               // Trigger a custom event to allow callers to hook to the collapsing/expanding,
+               // allowing the module to be testable, and making it possible to
+               // e.g. implement persistence via cookies
+               $collapsible.trigger( action === 'expand' ? 'beforeExpand.mw-collapsible' : 'beforeCollapse.mw-collapsible' );
+               hookCallback = function () {
+                       $collapsible.trigger( action === 'expand' ? 'afterExpand.mw-collapsible' : 'afterCollapse.mw-collapsible' );
+               };
+
                // Handle different kinds of elements
 
                if ( !options.plainMode && $collapsible.is( 'table' ) ) {
                                // http://stackoverflow.com/questions/467336#920480
                                if ( options.instantHide ) {
                                        $containers.hide();
+                                       hookCallback();
                                } else {
-                                       $containers.stop( true, true ).fadeOut();
+                                       $containers.stop( true, true ).fadeOut( hookCallback );
                                }
                        } else {
-                               $containers.stop( true, true ).fadeIn();
+                               $containers.stop( true, true ).fadeIn( hookCallback );
                        }
 
                } else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
                        if ( action === 'collapse' ) {
                                if ( options.instantHide ) {
                                        $containers.hide();
+                                       hookCallback();
                                } else {
-                                       $containers.stop( true, true ).slideUp();
+                                       $containers.stop( true, true ).slideUp( hookCallback );
                                }
                        } else {
-                               $containers.stop( true, true ).slideDown();
+                               $containers.stop( true, true ).slideDown( hookCallback );
                        }
 
                } else {
                                if ( action === 'collapse' ) {
                                        if ( options.instantHide ) {
                                                $collapsibleContent.hide();
+                                               hookCallback();
                                        } else {
-                                               $collapsibleContent.slideUp();
+                                               $collapsibleContent.slideUp( hookCallback );
                                        }
                                } else {
-                                       $collapsibleContent.slideDown();
+                                       $collapsibleContent.slideDown( hookCallback );
                                }
 
                        // Otherwise assume this is a customcollapse with a remote toggle
                                if ( action === 'collapse' ) {
                                        if ( options.instantHide ) {
                                                $collapsible.hide();
+                                               hookCallback();
                                        } else {
                                                if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                                       $collapsible.fadeOut();
+                                                       $collapsible.fadeOut( hookCallback );
                                                } else {
-                                                       $collapsible.slideUp();
+                                                       $collapsible.slideUp( hookCallback );
                                                }
                                        }
                                } else {
                                        if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                               $collapsible.fadeIn();
+                                               $collapsible.fadeIn( hookCallback );
                                        } else {
-                                               $collapsible.slideDown();
+                                               $collapsible.slideDown( hookCallback );
                                        }
                                }
                        }
         * @param {jQuery.Event|null} e either the event or null if unavailable
         * @param {Object|undefined} options
         */
-       function togglingHandler( $toggle, $collapsible, event, options ) {
+       function togglingHandler( $toggle, $collapsible, e, options ) {
                var wasCollapsed, $textContainer, collapseText, expandText;
 
-               if ( event ) {
+               if ( options === undefined ) {
+                       options = {};
+               }
+
+               if ( e ) {
                        // Don't fire if a link was clicked, if requested  (for premade togglers by default)
-                       if ( options.linksPassthru && $.nodeName( event.target, 'a' ) ) {
-                               return true;
+                       if ( options.linksPassthru && $.nodeName( e.target, 'a' ) ) {
+                               return;
                        } else {
-                               event.preventDefault();
-                               event.stopPropagation();
+                               e.preventDefault();
+                               e.stopPropagation();
                        }
                }
 
         */
        function toggleLinkPremade( $that, e, options ) {
                var $collapsible = $that.eq( 0 ).closest( '.mw-collapsible' );
-               options = $.extend( { toggleClasses: true }, options );
+               options = $.extend( { toggleClasses: true, linksPassthru: true }, options );
                togglingHandler( $that, $collapsible, e, options );
        }
 
         * @param {jQuery} $collapsible
         */
        function toggleLinkCustom( $that, e, options, $collapsible ) {
-               options = $.extend( { linksPassthru: true }, options );
                togglingHandler( $that, $collapsible, e, options );
        }
 
                                                .parent()
                                                .prepend( '&nbsp;[' )
                                                .append( ']&nbsp;' )
-                                               .on( 'click.mw-collapse', function ( e, opts ) {
+                                               .on( 'click.mw-collapsible', function ( e, opts ) {
                                                        opts = $.extend( { toggleText: { collapseText: collapsetext, expandText: expandtext } }, options, opts );
                                                        toggleLinkDefault( $(this), e, opts );
                                                } );
 
                        // Bind the custom togglers
                        if ( $customTogglers && $customTogglers.length ) {
-                               $customTogglers.on( 'click.mw-collapse', function ( e, opts ) {
+                               $customTogglers.on( 'click.mw-collapsible', function ( e, opts ) {
                                        opts = $.extend( {}, options, opts );
                                        toggleLinkCustom( $(this), e, opts, $collapsible );
                                } );
                                        if ( !$toggle.length ) {
                                                $firstItem.eq(-1).prepend( $toggleLink );
                                        } else {
-                                               $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
+                                               $toggleLink = $toggle.off( 'click.mw-collapsible' ).on( 'click.mw-collapsible', function ( e, opts ) {
                                                        opts = $.extend( {}, options, opts );
                                                        toggleLinkPremade( $toggle, e, opts );
                                                } );
                                                }
                                                $collapsible.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
                                        } else {
-                                               $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
+                                               $toggleLink = $toggle.off( 'click.mw-collapsible' ).on( 'click.mw-collapsible', function ( e, opts ) {
                                                        opts = $.extend( {}, options, opts );
                                                        toggleLinkPremade( $toggle, e, opts );
                                                } );
                                        if ( !$toggle.length ) {
                                                $collapsible.prepend( $toggleLink );
                                        } else {
-                                               $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, opts ) {
+                                               $toggleLink = $toggle.off( 'click.mw-collapsible' ).on( 'click.mw-collapsible', function ( e, opts ) {
                                                        opts = $.extend( {}, options, opts );
                                                        toggleLinkPremade( $toggle, e, opts );
                                                } );
index b28dab2..405c600 100644 (file)
                ts.dateRegex[0] = new RegExp( /^\s*(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{1,2})[\,\.\-\/'\s]{1,2}(\d{2,4})\s*?/i);
 
                // Written Month name, dmy
-               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[1] = new RegExp( '^\\s*(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
                // Written Month name, mdy
-               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]*(\\d{1,2})[\\,\\.\\-\\/\'\\s]*(\\d{2,4})\\s*$', 'i' );
+               ts.dateRegex[2] = new RegExp( '^\\s*(' + regex + ')' + '[\\,\\.\\-\\/\'\\s]+(\\d{1,2})[\\,\\.\\-\\/\'\\s]+(\\d{2,4})\\s*$', 'i' );
 
        }
 
index 17fd0cd..c44816b 100644 (file)
@@ -89,7 +89,7 @@
                         * Ported from skins/common/edit.js by Trevor Parscal
                         * (c) 2009 Wikimedia Foundation (GPLv2) - http://www.wikimedia.org
                         *
-                        * Inserts text at the begining and end of a text selection, optionally
+                        * Inserts text at the beginning and end of a text selection, optionally
                         * inserting text at the caret when selection is empty.
                         *
                         * @fixme document the options parameters
                         * Some code copied from
                         * http://www.dedestruct.com/2008/03/22/howto-cross-browser-cursor-position-in-textareas/
                         *
-                        * Get the position (in resolution of bytes not nessecarily characters)
+                        * Get the position (in resolution of bytes not necessarily characters)
                         * in a textarea
                         *
                         * Will focus the textarea in some browsers (IE/Opera)
diff --git a/resources/mediawiki.action/images/green-checkmark.png b/resources/mediawiki.action/images/green-checkmark.png
new file mode 100644 (file)
index 0000000..8ec604e
Binary files /dev/null and b/resources/mediawiki.action/images/green-checkmark.png differ
diff --git a/resources/mediawiki.action/mediawiki.action.edit.editWarning.js b/resources/mediawiki.action/mediawiki.action.edit.editWarning.js
new file mode 100644 (file)
index 0000000..cfe9762
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Javascript for module editWarning
+ */
+( function ( mw, $ ) {
+       $( document ).ready( function () {
+               // Check if EditWarning is enabled and if we need it
+               if ( $( '#wpTextbox1' ).length === 0 ) {
+                       return true;
+               }
+               // Get the original values of some form elements
+               $( '#wpTextbox1, #wpSummary' ).each( function () {
+                       $( this ).data( 'origtext', $( this ).val() );
+               });
+               var savedWindowOnBeforeUnload;
+               $( window )
+                       .on( 'beforeunload.editwarning', function () {
+                               var retval;
+
+                               // Check if the current values of some form elements are the same as
+                               // the original values
+                               if (
+                                       mw.config.get( 'wgAction' ) === 'submit' ||
+                                               $( '#wpTextbox1' ).data( 'origtext' ) !== $( '#wpTextbox1' ).val() ||
+                                               $( '#wpSummary' ).data( 'origtext' ) !== $( '#wpSummary' ).val()
+                               ) {
+                                       // Return our message
+                                       retval = mw.msg( 'editwarning-warning' );
+                               }
+
+                               // Unset the onbeforeunload handler so we don't break page caching in Firefox
+                               savedWindowOnBeforeUnload = window.onbeforeunload;
+                               window.onbeforeunload = null;
+                               if ( retval !== undefined ) {
+                                       // ...but if the user chooses not to leave the page, we need to rebind it
+                                       setTimeout( function () {
+                                               window.onbeforeunload = savedWindowOnBeforeUnload;
+                                       }, 1 );
+                                       return retval;
+                               }
+                       } )
+                       .on( 'pageshow.editwarning', function () {
+                               // Re-add onbeforeunload handler
+                               if ( !window.onbeforeunload ) {
+                                       window.onbeforeunload = savedWindowOnBeforeUnload;
+                               }
+                       } );
+
+               // Add form submission handler
+               $( '#editform' ).submit( function () {
+                       // Unbind our handlers
+                       $( window ).off( '.editwarning' );
+               } );
+       } );
+
+}( mediaWiki, jQuery ) );
+
index 2835c9c..fc1b18d 100644 (file)
                        }
                }() );
 
-               $( 'textarea, input:text' ).focus( function () {
-                       currentFocused = $(this);
-               });
+               // Apply to dynamically created textboxes as well as normal ones
+               $( document ).on( 'focus', 'textarea, input:text', function () {
+                       currentFocused = $( this );
+               } );
 
                // HACK: make currentFocused work with the usability iframe
                // With proper focus detection support (HTML 5!) this'll be much cleaner
diff --git a/resources/mediawiki.action/mediawiki.action.view.postEdit.css b/resources/mediawiki.action/mediawiki.action.view.postEdit.css
new file mode 100644 (file)
index 0000000..1e531bf
--- /dev/null
@@ -0,0 +1,80 @@
+.postedit-container {
+       margin: 0 auto;
+       position: fixed;
+       top: 0;
+       height: 0;
+       left: 50%;
+       z-index: 1000;
+}
+
+.postedit {
+       position: relative;
+       top: 0.6em;
+       left: -50%;
+       padding: .6em 3.6em .6em 1.1em;
+       font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+       font-size: 0.8em;
+       line-height: 1.5625em;
+       color: #626465;
+       background-color: #f4f4f4;
+       border: 1px solid #dcd9d9;
+       -webkit-text-shadow: 0 0.0625em 0 rgba(255, 255, 255, 0.5);
+       -moz-text-shadow: 0 0.0625em 0 rgba(255, 255, 255, 0.5);
+       text-shadow: 0 0.0625em 0 rgba(255, 255, 255, 0.5);
+       -webkit-border-radius: 5px;
+       -moz-border-radius: 5px;
+       border-radius: 5px;
+       -webkit-box-shadow: 0 2px 5px 0 #ccc;
+       -moz-box-shadow: 0 2px 5px 0 #ccc;
+       box-shadow: 0 2px 5px 0 #ccc;
+       -webkit-transition: all 0.25s ease-in-out;
+       -moz-transition: all 0.25s ease-in-out;
+       -ms-transition: all 0.25s ease-in-out;
+       -o-transition: all 0.25s ease-in-out;
+       transition: all 0.25s ease-in-out;
+}
+
+.skin-monobook .postedit {
+       top: 3em !important;
+}
+
+.postedit-faded {
+       opacity: 0;
+}
+
+.postedit-icon {
+       padding-left: 41px; /* 25 + 8 + 8 */
+       /* like min-height, but old IE compatible and keeps text vertically aligned, too */
+       line-height: 25px;
+       background-repeat: no-repeat;
+       background-position: 8px 50%;
+}
+
+.postedit-icon-checkmark {
+       /* @embed */
+       background-image: url(images/green-checkmark.png);
+       background-position: left;
+}
+
+.postedit-close {
+       position: absolute;
+       padding: 0 .8em;
+       right: 0;
+       top: 0;
+       font-size: 1.25em;
+       font-weight: bold;
+       line-height: 2.3em;
+       color: black;
+       text-shadow: 0 0.0625em 0 white;
+       text-decoration: none;
+       opacity: 0.2;
+       filter: alpha(opacity=20);
+}
+
+.postedit-close:hover {
+       color: black;
+       text-decoration: none;
+       cursor: pointer;
+       opacity: 0.4;
+       filter: alpha(opacity=40);
+}
index a11233f..e7a3e3c 100644 (file)
@@ -1,15 +1,45 @@
 ( function ( mw, $ ) {
-       // Only a view can be a post-edit.
-       if ( mw.config.get( 'wgAction' ) !== 'view' ) {
+       'use strict';
+
+       var config = mw.config.get( [ 'wgAction', 'wgCookiePrefix', 'wgCurRevisionId' ] ),
+               // This should match EditPage::POST_EDIT_COOKIE_KEY_PREFIX:
+               cookieKey = config.wgCookiePrefix + 'PostEditRevision' + config.wgCurRevisionId,
+               div, id;
+
+       if ( config.wgAction !== 'view' || $.cookie( cookieKey ) !== '1' ) {
                return;
        }
 
-       // Matches EditPage::POST_EDIT_COOKIE_KEY_PREFIX
-       var cookieKey = mw.config.get( 'wgCookiePrefix' ) + 'PostEditRevision' + mw.config.get( 'wgCurRevisionId' );
+       $.cookie( cookieKey, null, { path: '/' } );
+       mw.config.set( 'wgPostEdit', true );
+
+       function removeConfirmation() {
+               div.parentNode.removeChild( div );
+               mw.hook( 'postEdit.afterRemoval' ).fire();
+       }
+
+       function fadeOutConfirmation() {
+               clearTimeout( id );
+               div.firstChild.className = 'postedit postedit-faded';
+               setTimeout( removeConfirmation, 500 );
+               return false;
+       }
 
-       if ( $.cookie( cookieKey ) === '1' ) {
-               // We just saved this page
-               $.cookie( cookieKey, null, { path: '/' } );
-               mw.config.set( 'wgPostEdit', true );
+       function showConfirmation() {
+               div = document.createElement( 'div' );
+               div.className = 'postedit-container';
+               div.innerHTML =
+                       '<div class="postedit">' +
+                               '<div class="postedit-icon postedit-icon-checkmark">' +
+                                       mw.message( 'postedit-confirmation', mw.user ).escaped() +
+                               '</div>' +
+                               '<a href="#" class="postedit-close">&times;</a>' +
+                       '</div>';
+               id = setTimeout( fadeOutConfirmation, 3000 );
+               div.firstChild.lastChild.onclick = fadeOutConfirmation;
+               document.body.insertBefore( div, document.body.firstChild );
        }
+
+       mw.hook( 'postEdit' ).add( showConfirmation ).fire();
+
 } ( mediaWiki, jQuery ) );
index 61d9d15..0e85fd9 100644 (file)
@@ -8,7 +8,7 @@ jQuery( function ( $ ) {
        // Don't use the ":has:(.editsection a)" selector because it performs very bad.
        // http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
        $( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
-               var $edit = $( this ).find( '.editsection a' );
+               var $edit = $( this ).find( '.mw-editsection a, .editsection a' );
                if ( !$edit.length ) {
                        return;
                }
index 4de5291..8bba1fc 100644 (file)
                 * @return {boolean} return.done.isCategory Whether the category exists.
                 */
                isCategory: function ( title, ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        prop: 'categoryinfo',
                                        titles: title.toString()
                                } )
@@ -36,7 +37,7 @@
                                })
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                },
 
                /**
                 * @return {String[]} return.done.categories Matched categories
                 */
                getCategoriesByPrefix: function ( prefix, ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
                        // Fetch with allpages to only get categories that have a corresponding description page.
-                       this.get( {
+                       apiPromise = this.get( {
                                        list: 'allpages',
                                        apprefix: prefix,
                                        apnamespace: mw.config.get('wgNamespaceIds').category
@@ -72,7 +74,7 @@
                                })
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                },
 
 
                 *  if title was not found.
                 */
                getCategories: function ( title, ok, err, async ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        prop: 'categories',
                                        titles: title.toString()
                                }, {
                                                } );
                                        }
                                        d.resolve( ret );
-                               })
+                               } )
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                }
 
        } );
index 3c775ad..96947cc 100644 (file)
@@ -27,7 +27,7 @@
                                // an infinite loop. If this fresh token is bad, something else is very wrong.
                                useTokenToPost = function ( token ) {
                                        params.token = token;
-                                       api.post( params, ok, err );
+                                       api.post( params, { ok: ok, err: err } );
                                };
                                return api.getEditToken( useTokenToPost, err );
                        } else {
@@ -43,7 +43,7 @@
                                                err( code, result );
                                        }
                                };
-                               return api.post( params, { ok : ok, err : getTokenIfBad });
+                               return api.post( params, { ok: ok, err: getTokenIfBad } );
                        }
                },
 
                 * @return {string} return.done.token Received token.
                 */
                getEditToken: function ( ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        action: 'tokens',
                                        type: 'edit'
                                }, {
                                        } else {
                                                d.reject( 'token-missing', data );
                                        }
-                               })
+                               } )
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                },
 
                /**
index cf7443f..142c454 100644 (file)
                 */
                ajax: function ( parameters, ajaxOptions ) {
                        var token,
-                               apiDeferred = $.Deferred();
+                               apiDeferred = $.Deferred(),
+                               xhr;
 
                        parameters = $.extend( {}, this.defaults.parameters, parameters );
                        ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
                        }
 
                        // Make the AJAX request
-                       $.ajax( ajaxOptions )
+                       xhr = $.ajax( ajaxOptions )
                                // If AJAX fails, reject API call with error code 'http'
                                // and details in second argument.
                                .fail( function ( xhr, textStatus, exception ) {
                                } );
 
                        // Return the Promise
-                       return apiDeferred.promise().fail( function ( code, details ) {
+                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
                                mw.log( 'mw.Api error: ', code, details );
-                       });
+                       } );
                }
 
        };
index ea0388c..4044655 100644 (file)
                 * @return {string} return.done.data Parsed HTML of `wikitext`.
                 */
                parse: function ( wikitext, ok, err ) {
-                       var d = $.Deferred();
+                       var d = $.Deferred(),
+                               apiPromise;
                        // Backwards compatibility (< MW 1.20)
                        d.done( ok );
                        d.fail( err );
 
-                       this.get( {
+                       apiPromise = this.get( {
                                        action: 'parse',
                                        text: wikitext
                                } )
@@ -31,7 +32,7 @@
                                } )
                                .fail( d.reject );
 
-                       return d.promise();
+                       return d.promise( { abort: apiPromise.abort } );
                }
        } );
 
index c86a90a..e2be5c7 100644 (file)
@@ -19,7 +19,9 @@
         * @return {string} return.done.watch.message Parsed HTML of the confirmational interface message
         */
        function doWatchInternal( page, ok, err, addParams ) {
-               var params, d = $.Deferred();
+               var params,
+                       d = $.Deferred(),
+                       apiPromise;
                // Backwards compatibility (< MW 1.20)
                d.done( ok );
                d.fail( err );
                        $.extend( params, addParams );
                }
 
-               this.post( params )
+               apiPromise = this.post( params )
                        .done( function ( data ) {
                                d.resolve( data.watch );
                        } )
                        .fail( d.reject );
 
-               return d.promise();
+               return d.promise( { abort: apiPromise.abort } );
        }
 
        $.extend( mw.Api.prototype, {
index af49889..2242924 100644 (file)
        this.JpegMeta.JpegFile.prototype._JFIF_IDENT = "JFIF\x00";
        this.JpegMeta.JpegFile.prototype._JFXX_IDENT = "JFXX\x00";
        
-       /* EXIF idents */
+       /* Exif idents */
        this.JpegMeta.JpegFile.prototype._EXIF_IDENT = "Exif\x00";
        
        /* TIFF types */
index f945fa9..5ba77a1 100644 (file)
@@ -71,7 +71,7 @@
 
                actionPaths = mw.config.get( 'wgActionPaths' );
 
-               // @todo: Does MediaWiki give action path or query param
+               // @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 ) {
diff --git a/resources/mediawiki.special/images/arrow-collapsed-ltr.png b/resources/mediawiki.special/images/arrow-collapsed-ltr.png
deleted file mode 100644 (file)
index 467a555..0000000
Binary files a/resources/mediawiki.special/images/arrow-collapsed-ltr.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/arrow-collapsed-rtl.png b/resources/mediawiki.special/images/arrow-collapsed-rtl.png
deleted file mode 100644 (file)
index 2246254..0000000
Binary files a/resources/mediawiki.special/images/arrow-collapsed-rtl.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/arrow-expanded.png b/resources/mediawiki.special/images/arrow-expanded.png
deleted file mode 100644 (file)
index 58a9fc6..0000000
Binary files a/resources/mediawiki.special/images/arrow-expanded.png and /dev/null differ
diff --git a/resources/mediawiki.special/images/glyph-people-large.png b/resources/mediawiki.special/images/glyph-people-large.png
new file mode 100644 (file)
index 0000000..f43505e
Binary files /dev/null and b/resources/mediawiki.special/images/glyph-people-large.png differ
diff --git a/resources/mediawiki.special/images/icon-contributors.png b/resources/mediawiki.special/images/icon-contributors.png
new file mode 100644 (file)
index 0000000..e9b8874
Binary files /dev/null and b/resources/mediawiki.special/images/icon-contributors.png differ
diff --git a/resources/mediawiki.special/images/icon-edits.png b/resources/mediawiki.special/images/icon-edits.png
new file mode 100644 (file)
index 0000000..f4ec247
Binary files /dev/null and b/resources/mediawiki.special/images/icon-edits.png differ
diff --git a/resources/mediawiki.special/images/icon-lock.png b/resources/mediawiki.special/images/icon-lock.png
new file mode 100644 (file)
index 0000000..4b3d4ee
Binary files /dev/null and b/resources/mediawiki.special/images/icon-lock.png differ
diff --git a/resources/mediawiki.special/images/icon-pages.png b/resources/mediawiki.special/images/icon-pages.png
new file mode 100644 (file)
index 0000000..a406ce7
Binary files /dev/null and b/resources/mediawiki.special/images/icon-pages.png differ
index fcdeba1..7b3740e 100644 (file)
@@ -49,16 +49,7 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
        cursor: pointer;
 }
 
-.mw-enhancedchanges-arrow.mw-collapsible-toggle-collapsed {
-       /* @embed */
-       background: url(images/arrow-collapsed-ltr.png) no-repeat left center;
-}
-
-.mw-enhancedchanges-arrow.mw-collapsible-toggle-expanded {
-       /* @embed */
-       background: url(images/arrow-expanded.png) no-repeat left center;
-}
-
-.mw-changeslist-line-watched .mw-title {
+.mw-changeslist-line-watched .mw-title,
+.mw-enhanced-watched .mw-enhanced-rc-time {
        font-weight: bold;
 }
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.vform.css b/resources/mediawiki.special/mediawiki.special.createAccount.vform.css
new file mode 100644 (file)
index 0000000..11d00e7
--- /dev/null
@@ -0,0 +1,89 @@
+/* Disable the underline that Vector puts on h2 headings, and bold them. */
+.mw-ui-container h2 {
+       border: 0;
+       font-weight: bold;
+}
+
+/**** shuffled CAPTCHA ****/
+#wpCaptchaWord {
+       margin-top: 6px;
+}
+
+.mw-createacct-captcha-container {
+       background-color: #f8f8f8;
+       border: 1px solid #c9c9c9;
+       padding: 10px;
+       text-align: center;
+}
+
+.mw-createacct-captcha-assisted {
+       display: block;
+       margin-top: 0.5em;
+}
+
+/* Put a border around the fancycaptcha-image-container. */
+.mw-createacct-captcha-and-reload {
+       border: 1px solid #c9c9c9;
+       display: table-cell; /* Other display formats end up too wide */
+       width: 270px;
+       background-color: #FFF;
+}
+
+/* Make the fancycaptcha-image-container full-width within its parent.  */
+.fancycaptcha-image-container
+{
+       width: 100%;
+}
+
+/**** Benefits column CSS to the right (if it fits) of the form. ****/
+.mw-ui-container #userloginForm {
+       float: left;
+}
+
+div.mw-createacct-benefits-container {
+       /* Keeps this column compact and close to the form, but tends to squish contents. */
+       float: left;
+}
+
+div.mw-createacct-benefits-container h2 {
+       margin-bottom: 30px;
+}
+
+.mw-number-text.icon-edits {
+       /* @embed */
+       background: url(images/icon-edits.png) no-repeat left center;
+}
+
+.mw-number-text.icon-pages {
+       /* @embed */
+       background: url(images/icon-pages.png) no-repeat left center;
+}
+
+.mw-number-text.icon-contributors {
+       /* @embed */
+       background: url(images/icon-contributors.png) no-repeat left center;
+}
+
+/* Special font for numbers in benefits*/
+div.mw-number-text h3 {
+       top: 0;
+       margin: 0;
+       padding: 0;
+       color: #252525;
+       font-family: 'Georgia', serif;
+       font-weight: normal;
+       font-size: 2.2em;
+       line-height: 1.2;
+       text-align: center;
+}
+
+/* Contains a number and explanatory text, with space for an icon */
+div.mw-number-text {
+       display: block;
+       font-size: 1.2em;
+       color: #444;
+       margin-top: 1em;
+       padding: 0 0 0 95px; /* 80px wide icon plus "margin" */
+       min-height: 75px; /* matches max icon height, ensures icon emblem is visible */
+       text-align: center;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.createAccount.vform.js b/resources/mediawiki.special/mediawiki.special.createAccount.vform.js
new file mode 100644 (file)
index 0000000..0cbf31b
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ * JavaScript for Create account form (Special:UserLogin?type=signup).
+ */
+( function ( mw, $ ) {
+
+       $( document ).ready( function( $ ) {
+               var $content = $( '#mw-content-text' ),
+                       $submit = $content.find( '#wpCreateaccount' ),
+                       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.
+                       helpMsg = mw.config.get( 'wgCreateacctImgcaptchaHelp' ),
+                       helpHtml = '';
+
+               /*
+                * CAPTCHA
+                * The CAPTCHA is in a div style="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).
+                */
+               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
+                       // after 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" 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' ) );
+               }
+
+       } );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki.special/mediawiki.special.userLogin.vform.css b/resources/mediawiki.special/mediawiki.special.userLogin.vform.css
new file mode 100644 (file)
index 0000000..312f811
--- /dev/null
@@ -0,0 +1,36 @@
+/* Styles just for VForm user login */
+#mw-userlogin-help {
+       text-align: center;
+}
+
+.mw-ui-vform .mw-secure {
+       /* @embed */
+       background: url(images/icon-lock.png) no-repeat scroll left center transparent;
+       margin: 0 0 0 1px;
+       padding: 0 0 0 11px;
+}
+
+/* The login form invites users to create an account */
+#mw-createaccount-cta {
+       width: 20em;
+       height: 10em;
+       text-align: center;
+       /* @embed */
+       background: url(images/glyph-people-large.png) no-repeat 50%;
+       margin: 0 auto;
+}
+
+#mw-createaccount-cta h3 {
+       font-size: 0.9em;
+       font-weight: normal;
+       text-align: center;
+       padding-top: 4em;
+}
+
+#mw-createaccount-join {
+       margin-left: 0.75em;
+       /* Separate from background image */
+       box-shadow: 4px 4px 4px 4px rgba(255, 255, 255, 1);
+       width: auto;
+       display: inline-block;
+}
diff --git a/resources/mediawiki.special/mediawiki.special.vforms.css b/resources/mediawiki.special/mediawiki.special.vforms.css
new file mode 100644 (file)
index 0000000..2d948ea
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * When inside the VForm style, disable the border that Vector and other skins
+ * put on the div surrounding the login/create account form.
+ * Also disable the margin and padding that Vector puts around the form.
+ */
+.mw-ui-container #userloginForm,
+.mw-ui-container #userlogin {
+       border: 0;
+       margin: 0;
+       padding: 0;
+}
+
+/* Reposition and resize language links, which appear on a per-wiki basis */
+.mw-ui-container #languagelinks {
+       margin-bottom: 2em;
+       font-size: 0.8em;
+}
+
+/* Put some space under template's header, which may contain CAPTCHA HTML.*/
+section.mw-form-header {
+       margin-bottom: 10px;
+}
+
+/*
+ * Besides errorbox there could be warningbox, successbox, msgbox, though
+ * spage has never seen these in practice.
+ * Vector has styles coloring warningbox cream and successbox green.
+ */
+.mw-ui-vform .errorbox,
+.mw-ui-vform .warningbox,
+.mw-ui-vform .successbox {
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+       font-size: 0.9em;
+       margin: 0 0 1em 0;
+       padding: 0.5em;
+       color: #cc0000;
+       border: 1px solid #fac5c5;
+       background-color: #fae3e3;
+       text-shadow: 0 1px #fae3e3;
+       word-wrap: break-word;
+}
+
+/*
+ * Override the right margin of the form to give space in case a benefits
+ * column appears to the side.
+ *
+ */
+.mw-ui-container #userloginForm {
+       margin-right: 100px;
+}
diff --git a/resources/mediawiki.ui/mediawiki.ui.default.css b/resources/mediawiki.ui/mediawiki.ui.default.css
new file mode 100644 (file)
index 0000000..810340c
--- /dev/null
@@ -0,0 +1,243 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+/* _effects.scss */
+/* Mixins for visual effects in CSS3 */
+/* line 7, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-left {
+  float: left;
+  margin-left: 0;
+  padding-left: 0;
+}
+
+/* line 11, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-right {
+  float: right;
+  margin-right: 0;
+  padding-right: 0;
+}
+
+/* line 15, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+/* line 4, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: middle;
+  *vertical-align: auto;
+  zoom: 1;
+  *display: inline;
+  padding: 0.4em 1em 0.4em 1em;
+  margin: 0;
+  background-color: #c9c9c9;
+  *background-color: #c9c9c9;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
+  background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
+  color: #4a4a4a;
+  text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
+  border: 1px solid #c4c4c4;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  -ms-border-radius: 3px;
+  -o-border-radius: 3px;
+  border-radius: 3px;
+  vertical-align: middle;
+  text-align: center;
+  text-decoration: none;
+  font-weight: bold;
+  cursor: pointer;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
+  background-color: gainsboro;
+  *background-color: gainsboro;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
+  background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:active, .mw-ui-button.mw-ui-active {
+  background-image: none;
+  background-color: #c1c1c1;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  background-image: none;
+  background-color: #c9c9c9;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 30, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  cursor: default;
+}
+/* line 36, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-big {
+  font-size: 1.3em;
+}
+/* line 41, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-block {
+  display: block;
+  width: 100%;
+}
+
+/* line 49, sourcefiles/scss/components/default/_buttons.scss */
+a.mw-ui-button {
+  text-decoration: none;
+}
+
+/* line 56, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > * {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -ms-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+  float: left;
+}
+/* line 60, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:first-child {
+  -moz-border-radius-topleft: 3px;
+  -webkit-border-top-left-radius: 3px;
+  border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -webkit-border-bottom-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+/* line 65, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:last-child {
+  -moz-border-radius-topright: 3px;
+  -webkit-border-top-right-radius: 3px;
+  border-top-right-radius: 3px;
+  -moz-border-radius-bottomright: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+
+/* line 14, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 290px;
+}
+/* line 19, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+/* line 27, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input,
+.mw-ui-vform > div .mw-ui-button {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  margin: 0;
+  width: 100%;
+}
+/* line 34, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input {
+  outline: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 12, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+/* line 38, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 0.9em;
+  color: #4a4a4a;
+  width: auto;
+  margin: 0 0 0.2em 0;
+  padding: 0;
+}
+/* line 34, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label * {
+  font-weight: normal;
+}
+/* line 49, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input[type="checkbox"],
+.mw-ui-vform > div input[type="radio"] {
+  display: inline;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  width: auto;
+}
+
+/* line 65, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-input {
+  outline: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 12, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+
+/* line 72, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-label {
+  font-size: 0.9em;
+  color: #4a4a4a;
+}
+/* line 34, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-label * {
+  font-weight: normal;
+}
+
+/* line 81, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+  margin-bottom: 0.5em;
+  cursor: pointer;
+  vertical-align: bottom;
+  line-height: normal;
+  font-weight: normal;
+}
+/* line 50, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
+  width: auto;
+  height: auto;
+  margin: 0 0.1em 0em 0;
+  padding: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  cursor: pointer;
+}
diff --git a/resources/mediawiki.ui/mediawiki.ui.vector.css b/resources/mediawiki.ui/mediawiki.ui.vector.css
new file mode 100644 (file)
index 0000000..5f03376
--- /dev/null
@@ -0,0 +1,388 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+/* _effects.scss */
+/* Mixins for visual effects in CSS3 */
+/* line 7, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-left {
+  float: left;
+  margin-left: 0;
+  padding-left: 0;
+}
+
+/* line 11, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-flush-right {
+  float: right;
+  margin-right: 0;
+  padding-right: 0;
+}
+
+/* line 15, sourcefiles/scss/components/_utilities.scss */
+.mw-ui-center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+/* line 4, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button {
+  display: -moz-inline-stack;
+  display: inline-block;
+  vertical-align: middle;
+  *vertical-align: auto;
+  zoom: 1;
+  *display: inline;
+  padding: 0.4em 1em 0.4em 1em;
+  margin: 0;
+  background-color: #c9c9c9;
+  *background-color: #c9c9c9;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFDCDCDC', endColorstr='#FFC9C9C9');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #dcdcdc), color-stop(100%, #c9c9c9));
+  background-image: -webkit-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -moz-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: -o-linear-gradient(top, #dcdcdc, #c9c9c9);
+  background-image: linear-gradient(top, #dcdcdc, #c9c9c9);
+  color: #4a4a4a;
+  text-shadow: 0 1px 1px rgba(201, 201, 201, 0.3);
+  border: 1px solid #c4c4c4;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  -ms-border-radius: 3px;
+  -o-border-radius: 3px;
+  border-radius: 3px;
+  vertical-align: middle;
+  text-align: center;
+  text-decoration: none;
+  font-weight: bold;
+  cursor: pointer;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:hover, .mw-ui-button.mw-ui-hover {
+  background-color: gainsboro;
+  *background-color: gainsboro;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE9E9E9', endColorstr='#FFDCDCDC');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e9e9e9), color-stop(100%, #dcdcdc));
+  background-image: -webkit-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -moz-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: -o-linear-gradient(top, #e9e9e9, #dcdcdc);
+  background-image: linear-gradient(top, #e9e9e9, #dcdcdc);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:active, .mw-ui-button.mw-ui-active {
+  background-image: none;
+  background-color: #c1c1c1;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  background-image: none;
+  background-color: #c9c9c9;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 30, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button:disabled, .mw-ui-button.mw-ui-disabled {
+  cursor: default;
+}
+/* line 36, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-big {
+  font-size: 1.3em;
+}
+/* line 41, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button.mw-ui-block {
+  display: block;
+  width: 100%;
+}
+
+/* line 49, sourcefiles/scss/components/default/_buttons.scss */
+a.mw-ui-button {
+  text-decoration: none;
+}
+
+/* line 56, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > * {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  -ms-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+  float: left;
+}
+/* line 60, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:first-child {
+  -moz-border-radius-topleft: 3px;
+  -webkit-border-top-left-radius: 3px;
+  border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -webkit-border-bottom-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+/* line 65, sourcefiles/scss/components/default/_buttons.scss */
+.mw-ui-button-group > *:last-child {
+  -moz-border-radius-topright: 3px;
+  -webkit-border-top-right-radius: 3px;
+  border-top-right-radius: 3px;
+  -moz-border-radius-bottomright: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+
+/* line 3, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button {
+  font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+  font-size: 1em;
+  line-height: 1.4em;
+}
+/* line 6, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-primary {
+  background-color: #3366bb;
+  *background-color: #3366bb;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF4779CD', endColorstr='#FF3366BB');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4779cd), color-stop(100%, #3366bb));
+  background-image: -webkit-linear-gradient(top, #4779cd, #3366bb);
+  background-image: -moz-linear-gradient(top, #4779cd, #3366bb);
+  background-image: -o-linear-gradient(top, #4779cd, #3366bb);
+  background-image: linear-gradient(top, #4779cd, #3366bb);
+  color: white;
+  text-shadow: 0 1px 1px rgba(51, 102, 187, 0.75);
+  border: 1px solid #3162b3;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:hover, .mw-ui-button.mw-ui-primary.mw-ui-hover {
+  background-color: #4779cd;
+  *background-color: #4779cd;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF5B88D2', endColorstr='#FF4779CD');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5b88d2), color-stop(100%, #4779cd));
+  background-image: -webkit-linear-gradient(top, #5b88d2, #4779cd);
+  background-image: -moz-linear-gradient(top, #5b88d2, #4779cd);
+  background-image: -o-linear-gradient(top, #5b88d2, #4779cd);
+  background-image: linear-gradient(top, #5b88d2, #4779cd);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:active, .mw-ui-button.mw-ui-primary.mw-ui-active {
+  background-image: none;
+  background-color: #305faf;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-primary:disabled, .mw-ui-button.mw-ui-primary.mw-ui-disabled {
+  background-image: none;
+  background-color: #3366bb;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 10, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-constructive {
+  background-color: #27aa65;
+  *background-color: #27aa65;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF2EC977', endColorstr='#FF27AA65');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2ec977), color-stop(100%, #27aa65));
+  background-image: -webkit-linear-gradient(top, #2ec977, #27aa65);
+  background-image: -moz-linear-gradient(top, #2ec977, #27aa65);
+  background-image: -o-linear-gradient(top, #2ec977, #27aa65);
+  background-image: linear-gradient(top, #2ec977, #27aa65);
+  color: white;
+  text-shadow: 0 1px 1px rgba(39, 170, 101, 0.75);
+  border: 1px solid #25a260;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:hover, .mw-ui-button.mw-ui-constructive.mw-ui-hover {
+  background-color: #2ec977;
+  *background-color: #2ec977;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FF3ED384', endColorstr='#FF2EC977');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3ed384), color-stop(100%, #2ec977));
+  background-image: -webkit-linear-gradient(top, #3ed384, #2ec977);
+  background-image: -moz-linear-gradient(top, #3ed384, #2ec977);
+  background-image: -o-linear-gradient(top, #3ed384, #2ec977);
+  background-image: linear-gradient(top, #3ed384, #2ec977);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:active, .mw-ui-button.mw-ui-constructive.mw-ui-active {
+  background-image: none;
+  background-color: #249e5e;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-constructive:disabled, .mw-ui-button.mw-ui-constructive.mw-ui-disabled {
+  background-image: none;
+  background-color: #27aa65;
+  opacity: 0.5;
+  text-shadow: none;
+}
+/* line 14, sourcefiles/scss/components/vector/_buttons.scss */
+.mw-ui-button.mw-ui-destructive {
+  background-color: #cc0000;
+  *background-color: #cc0000;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFF20000', endColorstr='#FFCC0000');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f20000), color-stop(100%, #cc0000));
+  background-image: -webkit-linear-gradient(top, #f20000, #cc0000);
+  background-image: -moz-linear-gradient(top, #f20000, #cc0000);
+  background-image: -o-linear-gradient(top, #f20000, #cc0000);
+  background-image: linear-gradient(top, #f20000, #cc0000);
+  color: white;
+  text-shadow: 0 1px 1px rgba(204, 0, 0, 0.75);
+  border: 1px solid #c20000;
+}
+/* line 38, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:hover, .mw-ui-button.mw-ui-destructive.mw-ui-hover {
+  background-color: #f20000;
+  *background-color: #f20000;
+  *zoom: 1;
+  filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFFF0D0D', endColorstr='#FFF20000');
+  background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ff0d0d), color-stop(100%, #f20000));
+  background-image: -webkit-linear-gradient(top, #ff0d0d, #f20000);
+  background-image: -moz-linear-gradient(top, #ff0d0d, #f20000);
+  background-image: -o-linear-gradient(top, #ff0d0d, #f20000);
+  background-image: linear-gradient(top, #ff0d0d, #f20000);
+  text-decoration: none;
+}
+/* line 44, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:active, .mw-ui-button.mw-ui-destructive.mw-ui-active {
+  background-image: none;
+  background-color: #bd0000;
+  text-shadow: none;
+}
+/* line 54, sourcefiles/scss/mixins/_effects.scss */
+.mw-ui-button.mw-ui-destructive:disabled, .mw-ui-button.mw-ui-destructive.mw-ui-disabled {
+  background-image: none;
+  background-color: #cc0000;
+  opacity: 0.5;
+  text-shadow: none;
+}
+
+/* line 14, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 290px;
+}
+/* line 19, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div {
+  display: block;
+  margin: 0 0 15px 0;
+  padding: 0;
+  width: 100%;
+}
+/* line 27, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input,
+.mw-ui-vform > div .mw-ui-button {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  margin: 0;
+  width: 100%;
+}
+/* line 34, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input {
+  outline: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 12, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+/* line 38, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div label {
+  display: block;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  font-size: 0.9em;
+  color: #4a4a4a;
+  width: auto;
+  margin: 0 0 0.2em 0;
+  padding: 0;
+}
+/* line 34, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-vform > div label * {
+  font-weight: normal;
+}
+/* line 49, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-vform > div input[type="checkbox"],
+.mw-ui-vform > div input[type="radio"] {
+  display: inline;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  width: auto;
+}
+
+/* line 65, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-input {
+  outline: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  color: #252525;
+  padding: 0.35em 0 0.35em 0.5em;
+}
+/* line 12, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-input:focus {
+  box-shadow: #4091ed 0px 0px 5px;
+  border-color: #4091ed;
+}
+
+/* line 72, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-label {
+  font-size: 0.9em;
+  color: #4a4a4a;
+}
+/* line 34, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-label * {
+  font-weight: normal;
+}
+
+/* line 81, sourcefiles/scss/components/default/_forms.scss */
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+  margin-bottom: 0.5em;
+  cursor: pointer;
+  vertical-align: bottom;
+  line-height: normal;
+  font-weight: normal;
+}
+/* line 50, sourcefiles/scss/mixins/_forms.scss */
+.mw-ui-checkbox-label > input[type="checkbox"], .mw-ui-checkbox-label > input[type="radio"], .mw-ui-radio-label > input[type="checkbox"], .mw-ui-radio-label > input[type="radio"] {
+  width: auto;
+  height: auto;
+  margin: 0 0.1em 0em 0;
+  padding: 0;
+  border-style: solid;
+  border-width: 1px;
+  border-color: #c9c9c9;
+  cursor: pointer;
+}
+
+/* line 5, sourcefiles/scss/components/vector/_forms.scss */
+.mw-ui-vform,
+.mw-ui-vform > div input,
+.mw-ui-input {
+  font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+  font-size: 1em;
+  line-height: 1.4em;
+}
+
+/* line 3, sourcefiles/scss/components/vector/_containers.scss */
+.mw-ui-container {
+  font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+  font-size: 1em;
+  line-height: 1.4em;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/Makefile b/resources/mediawiki.ui/sourcefiles/Makefile
new file mode 100644 (file)
index 0000000..dea9013
--- /dev/null
@@ -0,0 +1,24 @@
+DATE=$(shell date +%I:%M%p)
+CHECK=\033[32m✔\033[39m
+HR=\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#
+
+build:
+       @echo "\n${HR}"
+       @echo "Building Agora..."
+       @echo "${HR}\n"
+       @compass compile
+       @echo "Compiling Compass project...            ${CHECK} Done"
+       @rm -rf .sass-cache
+       @echo "Removing .sass-cache...                 ${CHECK} Done"
+       @echo "\n${HR}"
+       @echo "Agora successfully built at ${DATE}."
+       @echo "${HR}\n"
+
+all: build
+
+watch:
+       @echo "\n${HR}"
+       @echo "Watching SCSS files for Agora..."
+       @echo "${HR}\n"
+       @compass watch
+       @echo "Started watching modules/scss at ${DATE}..."
diff --git a/resources/mediawiki.ui/sourcefiles/config.rb b/resources/mediawiki.ui/sourcefiles/config.rb
new file mode 100644 (file)
index 0000000..28c6524
--- /dev/null
@@ -0,0 +1,27 @@
+# Require any additional compass plugins here.
+
+# Set this to the root of your project when deployed:
+# (unused so far): http_path = "/"
+
+# Output to parent of build directory
+css_dir = ".."
+sass_dir = "scss"
+# (unused so far): images_dir = "modules/img"
+# (unused so far): javascripts_dir = "modules/js"
+
+# You can select your preferred output style here (can be overridden via the command line):
+# output_style = :expanded or :nested or :compact or :compressed
+output_style = :expanded
+
+# To enable relative paths to assets via compass helper functions. Uncomment:
+relative_assets = true
+
+# To disable debugging comments that display the original location of your selectors. Uncomment:
+line_comments = true
+
+
+# If you prefer the indented syntax, you might want to regenerate this
+# project again passing --syntax sass, or you can uncomment this:
+# preferred_syntax = :sass
+# and then run:
+# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_default.scss
new file mode 100644 (file)
index 0000000..e7090eb
--- /dev/null
@@ -0,0 +1,3 @@
+@import "utilities";
+@import "default/buttons";
+@import "default/forms";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_utilities.scss
new file mode 100644 (file)
index 0000000..4f1dba2
--- /dev/null
@@ -0,0 +1,17 @@
+// Generic helper classes that could be used in many elements/layouts
+
+// --------------------------------------------------------------------------
+// Positioning
+// --------------------------------------------------------------------------
+
+.mw-ui-flush-left {
+    @include agora-flush-left;
+}
+
+.mw-ui-flush-right {
+    @include agora-flush-right;
+}
+
+.mw-ui-center-block {
+    @include agora-center-block;
+}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss b/resources/mediawiki.ui/sourcefiles/scss/components/_vector.scss
new file mode 100644 (file)
index 0000000..d7cb34a
--- /dev/null
@@ -0,0 +1,4 @@
+@import "utilities";
+@import "vector/buttons";
+@import "vector/forms";
+@import "vector/containers";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_buttons.scss
new file mode 100644 (file)
index 0000000..d67810f
--- /dev/null
@@ -0,0 +1,69 @@
+$buttonBorderRadius: 3px;
+
+// Button styling
+.mw-ui-button {
+    // Container layout
+    @include inline-block;
+    padding: 0.4em 1em 0.4em 1em;
+    margin: 0;
+
+    // Container styling
+    @include buttonColors($agoraGray);
+    @include border-radius($buttonBorderRadius);
+
+    // Content styling
+    vertical-align: middle;
+
+    text: {
+        align: center;
+        decoration: none;
+    }
+
+    font: {
+        weight: bold;
+    }
+
+    // Interaction styling
+    cursor: pointer;
+
+    &:disabled,
+    &.mw-ui-disabled {
+        cursor: default;
+    }
+
+    // Button sizes and displays
+    // -----------------------------------------
+    &.mw-ui-big {
+        font: {
+            size: $baseFontSize * 1.3;
+        }
+    }
+    &.mw-ui-block {
+        display: block;
+        width: 100%;
+    }
+}
+
+// This overrides an underline declaration on a:hover and a:focus in commonElements.css, which the
+// class alone isn't specific enough to do
+a.mw-ui-button {
+    text: {
+        decoration: none;
+    }
+}
+
+// Button groups
+.mw-ui-button-group > * {
+  @include border-radius(0);
+  float: left;
+
+  &:first-child{
+    @include border-top-left-radius($buttonBorderRadius);
+    @include border-bottom-left-radius($buttonBorderRadius);
+  }
+
+  &:last-child{
+    @include border-top-right-radius($buttonBorderRadius);
+    @include border-bottom-right-radius($buttonBorderRadius);
+  }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/default/_forms.scss
new file mode 100644 (file)
index 0000000..8bbe3c2
--- /dev/null
@@ -0,0 +1,83 @@
+// Form elements and layouts
+
+// --------------------------------------------------------------------------
+// Layouts
+// --------------------------------------------------------------------------
+
+// The FancyCaptcha image CAPTCHA used on WMF wikis drives the width of the
+// 'VForm' design, the form can't be narrower than this.
+$captchaContainerWidth: 290px;
+$defaultFormWidth: $captchaContainerWidth;
+
+// Style a compact vertical stacked form ("VForm") and the elements in divs
+// within it.
+.mw-ui-vform {
+    @include box-sizing(border-box);
+
+    width: $defaultFormWidth;
+
+    & > div {
+        display: block;
+        margin: 0 0 15px 0;
+        padding: 0;
+        width: 100%;
+
+        // MW currently doesn't use the type attribute everywhere on inputs.
+        input,
+        .mw-ui-button {
+            display: block;
+            @include box-sizing(border-box);
+            margin: 0;
+            width: 100%;
+        }
+
+        input {
+            @include agora-field-styling; // mixins/_forms.scss
+        }
+
+        label {
+            display: block;
+            @include box-sizing(border-box);
+            @include agora-label-styling;
+            width: auto;
+            margin: 0 0 0.2em 0;
+            padding: 0;
+        }
+
+        // Override input styling just for checkboxes and radio inputs.
+        input[type="checkbox"],
+        input[type="radio"] {
+            display: inline;
+            @include box-sizing(content-box);
+            width: auto;
+        }
+
+    }
+}
+
+// --------------------------------------------------------------------------
+// Elements
+// --------------------------------------------------------------------------
+
+// Apply mw-ui-input to individual input fields to style them.
+// You generally don't need to use this class if <input> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-input {
+    @include agora-field-styling; // mixins/_forms.scss
+}
+
+// Apply mw-ui-label to individual elements to style them.
+// You generally don't need to use this class if <label> is within an Agora
+// form container such as mw-ui-vform
+.mw-ui-label {
+    @include agora-label-styling; // mixins/_forms.scss
+}
+
+// Nesting an input checkbox or radio button inside a label with this class
+// improves alignment, e.g.
+//   <label class="mw-ui-checkbox-label">
+//       <input type="checkbox">The label text
+//   </label>
+.mw-ui-checkbox-label, .mw-ui-radio-label {
+    @include agora-inline-label-styling;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_buttons.scss
new file mode 100644 (file)
index 0000000..8d5f0b6
--- /dev/null
@@ -0,0 +1,19 @@
+@import "../default/buttons"; // Layer Vector on top of the default settings.
+
+.mw-ui-button {
+    // Button colors determined by function.
+    // -----------------------------------------
+    &.mw-ui-primary {
+        @include buttonColors($agoraBlue);
+    }
+
+    &.mw-ui-constructive {
+        @include buttonColors($agoraGreen);
+    }
+
+    &.mw-ui-destructive {
+        @include buttonColors($agoraRed);
+    }
+
+    @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_containers.scss
new file mode 100644 (file)
index 0000000..ed01603
--- /dev/null
@@ -0,0 +1,5 @@
+// No default settings for containers yet.
+
+.mw-ui-container {
+    @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/components/vector/_forms.scss
new file mode 100644 (file)
index 0000000..73ea24e
--- /dev/null
@@ -0,0 +1,7 @@
+@import "../default/forms"; // Layer Vector on top of the default settings.
+
+.mw-ui-vform,
+.mw-ui-vform > div input,
+.mw-ui-input {
+    @include vector-type;
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.default.scss
new file mode 100644 (file)
index 0000000..e6db523
--- /dev/null
@@ -0,0 +1,16 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using a skin other than
+ * Vector.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+
+@charset "UTF-8";
+
+@import "compass";
+
+@import "settings/all";
+
+@import "mixins/all";
+
+@import "components/default";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss b/resources/mediawiki.ui/sourcefiles/scss/mediawiki.ui.vector.scss
new file mode 100644 (file)
index 0000000..ac113ee
--- /dev/null
@@ -0,0 +1,15 @@
+/**
+ * Provide Agora appearance for mw-ui-* classes when using the Vector skin.
+ * Compass builds these Agora styles from source Sass files in
+ * extensions/Agora/modules/scss
+ */
+
+@charset "UTF-8";
+
+@import "compass";
+
+@import "settings/all";
+
+@import "mixins/all";
+
+@import "components/vector";
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_all.scss
new file mode 100644 (file)
index 0000000..adc48cd
--- /dev/null
@@ -0,0 +1,4 @@
+@import "utilities";
+@import "type";
+@import "effects";
+@import "forms";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_effects.scss
new file mode 100644 (file)
index 0000000..03fae1b
--- /dev/null
@@ -0,0 +1,62 @@
+/* _effects.scss */
+
+/* Mixins for visual effects in CSS3 */
+
+// ----------------------------------------------------------------------------
+// Gradients
+// ----------------------------------------------------------------------------
+@mixin vertical-gradient ($startColor: lighten($agoraGray, 95%), $endColor: $agoraGray) {
+       // Fallback
+    background-color: $endColor;
+    *background-color: $endColor; // IE7
+
+    // IE6-8
+    @include filter-gradient($startColor, $endColor, vertical);
+
+    // IE9+, Opera, Gecko, WebKit
+    @include background-image(linear-gradient(top, $startColor, $endColor));
+}
+
+// ----------------------------------------------------------------------------
+// Button styling
+// ----------------------------------------------------------------------------
+@mixin buttonColors ($baseColor: $agoraGray) {
+       // Background color
+       @include vertical-gradient(lighten($baseColor, 7.5%), $baseColor);
+
+       @if $baseColor == $agoraGray {
+               color: darken($baseColor, 50%);
+               @include text-shadow(0 1px 1px rgba($baseColor, 0.3));
+       } @else {
+               color: white;
+               @include text-shadow(0 1px 1px rgba($baseColor, 0.75));
+       }
+
+       border: 1px solid darken($baseColor, 2%);
+
+       &:hover,
+       &.mw-ui-hover {
+               @include vertical-gradient(lighten($baseColor, 12.5%), lighten($baseColor, 7.5%));
+               text-decoration: none;
+       }
+
+       &:active,
+       &.mw-ui-active {
+               background: {
+                       image: none;
+                       color: darken($baseColor, 3%);
+               }
+
+               text-shadow: none;
+       }
+
+       &:disabled,
+       &.mw-ui-disabled {
+               background: {
+                       image: none;
+                       color: $baseColor;
+               }
+               opacity: 0.5;
+               text-shadow: none;
+       }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_forms.scss
new file mode 100644 (file)
index 0000000..5db857a
--- /dev/null
@@ -0,0 +1,62 @@
+// Font is not included.
+// For Vector, that should be layered on top with vector-type
+@mixin agora-field-styling() {
+    @include reset-focus;  // Removes OS field focus
+
+    border: {
+        style: solid;
+        width: 1px;
+        color: $agoraGray;
+    };
+
+    &:focus {
+        // @include box-shadow generates unneeded prefixes
+        // https://github.com/chriseppstein/compass/issues/1054 , so specify
+        // directly.
+        box-shadow: $agoraBlueShadow 0px 0px 5px;
+
+        border: {
+            color: $agoraBlueShadow;
+        };
+    }
+
+    color: $agoraTextColor;
+    padding: 0.35em 0 0.35em 0.5em;
+}
+
+@mixin agora-label-styling() {
+    font: {
+        //weight: bold;
+        size: 0.9em;
+    };
+    color: darken($agoraGray, 50%);
+
+    & * {
+        font-weight: normal;
+    }
+}
+
+@mixin agora-inline-label-styling() {
+    margin-bottom: 0.5em;
+    cursor: pointer;
+    vertical-align: bottom;
+    line-height: normal;
+
+    font: {
+        weight: normal;
+    };
+
+    & > input[type="checkbox"],
+    & > input[type="radio"] {
+        width: auto;
+        height: auto;
+        margin: 0 0.1em 0em 0;
+        padding: 0;
+        border: {
+            style: solid;
+            width: 1px;
+            color: $agoraGray;
+        }
+        cursor: pointer;
+    }
+}
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_type.scss
new file mode 100644 (file)
index 0000000..964d590
--- /dev/null
@@ -0,0 +1,7 @@
+@mixin vector-type {
+    font: {
+        family: $baseFontFamily;
+        size: $baseFontSize;
+    }
+    line-height: $baseLineHeight;
+}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss b/resources/mediawiki.ui/sourcefiles/scss/mixins/_utilities.scss
new file mode 100644 (file)
index 0000000..71a93b6
--- /dev/null
@@ -0,0 +1,19 @@
+@mixin agora-flush-left() {
+    float: left;
+    margin-left: 0;
+    padding-left: 0;
+}
+
+@mixin agora-flush-right() {
+    float: right;
+    margin-right: 0;
+    padding-right: 0;
+}
+
+@mixin agora-center-block() {
+    display: block;
+    margin: {
+        left: auto;
+        right: auto;
+    };
+}
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_all.scss
new file mode 100644 (file)
index 0000000..21ac292
--- /dev/null
@@ -0,0 +1,2 @@
+@import "colors";
+@import "typography";
\ No newline at end of file
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_colors.scss
new file mode 100644 (file)
index 0000000..0c18bdb
--- /dev/null
@@ -0,0 +1,17 @@
+// Grays
+// -----------------------------------------
+$agoraGray: #c9c9c9;
+$agoraTextColor: #252525;
+
+// Blues
+// -----------------------------------------
+$agoraBlue: #3366bb;
+$agoraBlueShadow: #4091ed;
+
+// Greens
+// -----------------------------------------
+$agoraGreen: #27aa65;
+
+// Reds
+// -----------------------------------------
+$agoraRed: #cc0000;
diff --git a/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss b/resources/mediawiki.ui/sourcefiles/scss/settings/_typography.scss
new file mode 100644 (file)
index 0000000..5f0cea2
--- /dev/null
@@ -0,0 +1,6 @@
+$baseFontSize: 1em;
+$baseFontFamily: "Helvetica Neue", "Helvetica", "Arial", sans-serif;
+$baseLineHeight: 1.4 * $baseFontSize;
+$baseFontColor: $agoraTextColor;
+
+$smallFontSize: 0.75em;
\ No newline at end of file
diff --git a/resources/mediawiki/images/arrow-collapsed-ltr.png b/resources/mediawiki/images/arrow-collapsed-ltr.png
new file mode 100644 (file)
index 0000000..ea9c67a
Binary files /dev/null and b/resources/mediawiki/images/arrow-collapsed-ltr.png differ
diff --git a/resources/mediawiki/images/arrow-collapsed-rtl.png b/resources/mediawiki/images/arrow-collapsed-rtl.png
new file mode 100644 (file)
index 0000000..081d3a8
Binary files /dev/null and b/resources/mediawiki/images/arrow-collapsed-rtl.png differ
diff --git a/resources/mediawiki/images/arrow-expanded.png b/resources/mediawiki/images/arrow-expanded.png
new file mode 100644 (file)
index 0000000..fa4bf26
Binary files /dev/null and b/resources/mediawiki/images/arrow-expanded.png differ
index 643e5c3..a2d4d6c 100644 (file)
                                        uri = this,
                                        matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
                                $.each( properties, function ( i, property ) {
-                                       uri[ property ] = matches[ i+1 ];
+                                       uri[ property ] = matches[ i + 1 ];
                                } );
 
                                // uri.query starts out as the query string; we will parse it into key-val pairs then make
                                q = {};
                                // using replace to iterate over a string
                                if ( uri.query ) {
-                                       uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ($0, $1, $2, $3) {
+                                       uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ( $0, $1, $2, $3 ) {
                                                var k, v;
                                                if ( $1 ) {
                                                        k = Uri.decode( $1 );
index 88af3c6..986917a 100644 (file)
                        $( '<colgroup>' ).css( 'width', 350 ).appendTo( $table );
 
 
-                       entryTypeText = function( entryType ) {
+                       entryTypeText = function ( entryType ) {
                                switch ( entryType ) {
                                        case 'log':
                                                return 'Log';
index 83bf2e3..ac6f2a1 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * Utility functions for jazzing up HTMLForm elements.
  */
-( function ( $ ) {
+( function ( mw, $ ) {
 
        /**
         * jQuery plugin to fade or snap to visible state.
 
        } );
 
-}( jQuery ) );
+       function addMulti( $oldContainer, $container ) {
+               var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
+                       oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen)/g, '' ),
+                       $select = $( '<select>' ),
+                       dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
+               oldClass = $.trim( oldClass );
+               $select.attr( {
+                       name: name,
+                       multiple: 'multiple',
+                       'data-placeholder': dataPlaceholder.plain(),
+                       'class': 'htmlform-chzn-select mw-input ' + oldClass
+               } );
+               $oldContainer.find( 'input' ).each( function () {
+                       var $oldInput = $(this),
+                       checked = $oldInput.prop( 'checked' ),
+                       $option = $( '<option>' );
+                       $option.prop( 'value', $oldInput.prop( 'value' ) );
+                       if ( checked ) {
+                               $option.prop( 'selected', true );
+                       }
+                       $option.text( $oldInput.prop( 'value' ) );
+                       $select.append( $option );
+               } );
+               $container.append( $select );
+       }
+
+       function convertCheckboxesToMulti( $oldContainer, type ) {
+               var $fieldLabel = $( '<td>' ),
+               $td = $( '<td>' ),
+               $fieldLabelText = $( '<label>' ),
+               $container;
+               if ( type === 'table' ) {
+                       addMulti( $oldContainer, $td );
+                       $container = $( '<tr>' );
+                       $container.append( $td );
+               } else if ( type === 'div' ) {
+                       $fieldLabel = $( '<div>' );
+                       $container = $( '<div>' );
+                       addMulti( $oldContainer, $container );
+               }
+               $fieldLabel.attr( 'class', 'mw-label' );
+               $fieldLabelText.text( $oldContainer.find( '.mw-label label' ).text() );
+               $fieldLabel.append( $fieldLabelText );
+               $container.prepend( $fieldLabel );
+               $oldContainer.parent().append( $container );
+               $oldContainer.remove();
+               return $container;
+       }
+
+       if ( $( '.mw-chosen' ).length ) {
+               mw.loader.using( 'jquery.chosen', function () {
+                       var $toConvert,
+                       $converted;
+                       $toConvert = $( 'table .mw-chosen' );
+                       if ( $toConvert.length ) {
+                               $converted = convertCheckboxesToMulti( $toConvert, 'table' );
+                               $converted.find( '.htmlform-chzn-select' ).chosen( { width: 'auto' } );
+                       }
+                       $toConvert = $( 'div .mw-chosen' );
+                       if ( $toConvert.length ) {
+                               $converted = convertCheckboxesToMulti( $toConvert, 'div' );
+                               $converted.find( '.htmlform-chzn-select' ).chosen( { width: 'auto' } );
+                       }
+               } );
+       }
+
+       $( document ).ready( function() {
+               var $matrixTooltips = $( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
+               if ( $matrixTooltips.length ) {
+                       mw.loader.using( 'jquery.tipsy', function () {
+                               $matrixTooltips.tipsy();
+                       } );
+               }
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/mediawiki/mediawiki.icon.css b/resources/mediawiki/mediawiki.icon.css
new file mode 100644 (file)
index 0000000..f61b725
--- /dev/null
@@ -0,0 +1,15 @@
+/* General-purpose icons via CSS. Classes here should be named "mw-icon-*". */
+
+/* For the collapsed and expanded arrows, we also provide selectors to make it
+ * easy to use them with jquery.makeCollapsible. */
+.mw-icon-arrow-collapsed,
+.mw-collapsible-arrow.mw-collapsible-toggle-collapsed {
+       /* @embed */
+       background: url(images/arrow-collapsed-ltr.png) no-repeat left bottom;
+}
+
+.mw-icon-arrow-expanded,
+.mw-collapsible-arrow.mw-collapsible-toggle-expanded {
+       /* @embed */
+       background: url(images/arrow-expanded.png) no-repeat left bottom;
+}
index 183b525..5539d4d 100644 (file)
@@ -3,6 +3,7 @@
 * See: http://www.mediawiki.org/wiki/Extension:UploadWizard/MessageParser for docs
 *
 * @author neilk@wikimedia.org
+* @author mflaschen@wikimedia.org
 */
 ( function ( mw, $ ) {
        var oldParser,
                        magic : {
                                'SITENAME' : mw.config.get( 'wgSiteName' )
                        },
+                       // This is a whitelist based on, but simpler than, Sanitizer.php.
+                       // Self-closing tags are not currently supported.
+                       allowedHtmlElements : [
+                               'b',
+                               'i'
+                       ],
+                       // Key tag name, value allowed attributes for that tag.
+                       // See Sanitizer::setupAttributeWhitelist
+                       allowedHtmlCommonAttributes : [
+                               // HTML
+                               'id',
+                               'class',
+                               'style',
+                               'lang',
+                               'dir',
+                               'title',
+
+                               // WAI-ARIA
+                               'role'
+                       ],
+
+                       // Attributes allowed for specific elements.
+                       // Key is element name in lower case
+                       // Value is array of allowed attributes for that element
+                       allowedHtmlAttributesByElement : {},
                        messages : mw.messages,
                        language : mw.language,
 
 
                };
 
+       /**
+        * 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.
+        *
+        * Object elements of children (jQuery, HTMLElement, TextNode, etc.) will be left as is.
+        *
+        * @param {jQuery} $parent Parent node wrapped by jQuery
+        * @param {Object|string|Array} children What to append, with the same possible types as jQuery
+        * @return {jQuery} $parent
+        */
+       function appendWithoutParsing( $parent, children ) {
+               var i, len;
+
+               if ( !$.isArray( children ) ) {
+                       children = [children];
+               }
+
+               for ( i = 0, len = children.length; i < len; i++ ) {
+                       if ( typeof children[i] !== 'object' ) {
+                               children[i] = document.createTextNode( children[i] );
+                       }
+               }
+
+               return $parent.append( children );
+       }
+
+       /**
+        * Decodes the main HTML entities, those encoded by mw.html.escape.
+        *
+        * @param {string} encode Encoded string
+        * @return {string} String with those entities decoded
+        */
+       function decodePrimaryHtmlEntities( encoded ) {
+               return encoded
+                       .replace( /&#039;/g, '\'' )
+                       .replace( /&quot;/g, '"' )
+                       .replace( /&lt;/g, '<' )
+                       .replace( /&gt;/g, '>' )
+                       .replace( /&amp;/g, '&' );
+       }
+
        /**
         * Given parser options, return a function that parses a key and replacements, returning jQuery object
         * @param {Object} parser options
                        try {
                                return parser.parse( key, argsArray );
                        } catch ( e ) {
-                               return $( '<span>' ).append( key + ': ' + e.message );
+                               return $( '<span>' ).text( key + ': ' + e.message );
                        }
                };
        }
                 */
                return function () {
                        var $target = this.empty();
-                       // TODO: Simply $target.append( failableParserFn( arguments ).contents() )
-                       // or Simply $target.append( failableParserFn( arguments ) )
+                       // TODO: Simply appendWithoutParsing( $target, failableParserFn( arguments ).contents() )
+                       // or Simply appendWithoutParsing( $target, failableParserFn( arguments ) )
                        $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
-                               $target.append( node );
+                               appendWithoutParsing( $target, node );
                        } );
                        return $target;
                };
                 * @return {Mixed} abstract syntax tree
                 */
                wikiTextToAst: function ( input ) {
-                       var pos,
+                       var pos, settings = this.settings, concat = Array.prototype.concat,
                                regularLiteral, regularLiteralWithoutBar, regularLiteralWithoutSpace, regularLiteralWithSquareBrackets,
-                               backslash, anyCharacter, escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
-                               whitespace, dollar, digits,
-                               openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openLink, closeLink, templateName, pipe, colon,
+                               doubleQuote, singleQuote, backslash, anyCharacter, asciiAlphabetLiteral,
+                               escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
+                               whitespace, dollar, digits, htmlDoubleQuoteAttributeValue, htmlSingleQuoteAttributeValue,
+                               htmlAttributeEquals, openHtmlStartTag, optionalForwardSlash, openHtmlEndTag, closeHtmlTag,
+                               openExtlink, closeExtlink, wikilinkPage, wikilinkContents, openWikilink, closeWikilink, templateName, pipe, colon,
                                templateContents, openTemplate, closeTemplate,
                                nonWhitespaceExpression, paramExpression, expression, curlyBraceTransformExpression, result;
 
                                        return result;
                                };
                        }
+
+                       /**
+                        * Makes a regex parser, given a RegExp object.
+                        * The regex being passed in should start with a ^ to anchor it to the start
+                        * of the string.
+                        *
+                        * @param {RegExp} regex anchored regex
+                        * @return {Function} function to parse input based on the regex
+                        */
                        function makeRegexParser( regex ) {
                                return function () {
                                        var matches = input.substr( pos ).match( regex );
                        // but some debuggers can't tell you exactly where they come from. Also the mutually
                        // recursive functions seem not to work in all browsers then. (Tested IE6-7, Opera, Safari, FF)
                        // This may be because, to save code, memoization was removed
-                       regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
+
+                       regularLiteral = makeRegexParser( /^[^{}\[\]$<\\]/ );
                        regularLiteralWithoutBar = makeRegexParser(/^[^{}\[\]$\\|]/);
                        regularLiteralWithoutSpace = makeRegexParser(/^[^{}\[\]$\s]/);
                        regularLiteralWithSquareBrackets = makeRegexParser( /^[^{}$\\]/ );
+
                        backslash = makeStringParser( '\\' );
+                       doubleQuote = makeStringParser( '"' );
+                       singleQuote = makeStringParser( '\'' );
                        anyCharacter = makeRegexParser( /^./ );
+
+                       openHtmlStartTag = makeStringParser( '<' );
+                       optionalForwardSlash = makeRegexParser( /^\/?/ );
+                       openHtmlEndTag = makeStringParser( '</' );
+                       htmlAttributeEquals = makeRegexParser( /^\s*=\s*/ );
+                       closeHtmlTag = makeRegexParser( /^\s*>/ );
+
                        function escapedLiteral() {
                                var result = sequence( [
                                        backslash,
                                return result === null ? null : result.join('');
                        }
 
+                       asciiAlphabetLiteral = makeRegexParser( /[A-Za-z]+/ );
+                       htmlDoubleQuoteAttributeValue = makeRegexParser( /^[^"]*/ );
+                       htmlSingleQuoteAttributeValue = makeRegexParser( /^[^']*/ );
+
                        whitespace = makeRegexParser( /^\s+/ );
                        dollar = makeStringParser( '$' );
                        digits = makeRegexParser( /^\d+/ );
                        }
                        openExtlink = makeStringParser( '[' );
                        closeExtlink = makeStringParser( ']' );
-                       // this extlink MUST have inner text, e.g. [foo] not allowed; [foo bar] is allowed
+                       // 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;
                                result = null;
                                        openExtlink,
                                        nonWhitespaceExpression,
                                        whitespace,
-                                       expression,
+                                       nOrMore( 1, expression ),
                                        closeExtlink
                                ] );
                                if ( parsedResult !== null ) {
-                                        result = [ 'LINK', parsedResult[1], parsedResult[3] ];
+                                       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] ) );
+                                       }
                                }
                                return result;
                        }
                                if ( result === null ) {
                                        return null;
                                }
-                               return [ 'LINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
+                               return [ 'EXTLINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
                        }
-                       openLink = makeStringParser( '[[' );
-                       closeLink = makeStringParser( ']]' );
+                       openWikilink = makeStringParser( '[[' );
+                       closeWikilink = makeStringParser( ']]' );
                        pipe = makeStringParser( '|' );
 
                        function template() {
                                wikilinkPage // unpiped link
                        ] );
 
-                       function link() {
+                       function wikilink() {
                                var result, parsedResult, parsedLinkContents;
                                result = null;
 
                                parsedResult = sequence( [
-                                       openLink,
+                                       openWikilink,
                                        wikilinkContents,
-                                       closeLink
+                                       closeWikilink
                                ] );
                                if ( parsedResult !== null ) {
                                        parsedLinkContents = parsedResult[1];
-                                       result = [ 'WLINK' ].concat( parsedLinkContents );
+                                       result = [ 'WIKILINK' ].concat( parsedLinkContents );
+                               }
+                               return result;
+                       }
+
+                       // TODO: Support data- if appropriate
+                       function doubleQuotedHtmlAttributeValue() {
+                               var parsedResult = sequence( [
+                                       doubleQuote,
+                                       htmlDoubleQuoteAttributeValue,
+                                       doubleQuote
+                               ] );
+                               return parsedResult === null ? null : parsedResult[1];
+                       }
+
+                       function singleQuotedHtmlAttributeValue() {
+                               var parsedResult = sequence( [
+                                       singleQuote,
+                                       htmlSingleQuoteAttributeValue,
+                                       singleQuote
+                               ] );
+                               return parsedResult === null ? null : parsedResult[1];
+                       }
+
+                       function htmlAttribute() {
+                               var parsedResult = sequence( [
+                                       whitespace,
+                                       asciiAlphabetLiteral,
+                                       htmlAttributeEquals,
+                                       choice( [
+                                               doubleQuotedHtmlAttributeValue,
+                                               singleQuotedHtmlAttributeValue
+                                       ] )
+                               ] );
+                               return parsedResult === null ? null : [parsedResult[1], parsedResult[3]];
+                       }
+
+                       /**
+                        * Checks if HTML is allowed
+                        *
+                        * @param {string} startTagName HTML start tag name
+                        * @param {string} endTagName HTML start tag name
+                        * @param {Object} attributes array of consecutive key value pairs,
+                        *  with index 2 * n being a name and 2 * n + 1 the associated value
+                        * @return {boolean} true if this is HTML is allowed, false otherwise
+                        */
+                       function isAllowedHtml( startTagName, endTagName, attributes ) {
+                               var i, len, attributeName;
+
+                               startTagName = startTagName.toLowerCase();
+                               endTagName = endTagName.toLowerCase();
+                               if ( startTagName !== endTagName || $.inArray( startTagName, settings.allowedHtmlElements ) === -1 ) {
+                                       return false;
+                               }
+
+                               for ( i = 0, len = attributes.length; i < len; i += 2 ) {
+                                       attributeName = attributes[i];
+                                       if ( $.inArray( attributeName, settings.allowedHtmlCommonAttributes ) === -1 &&
+                                            $.inArray( attributeName, settings.allowedHtmlAttributesByElement[startTagName] || [] ) === -1 ) {
+                                               return false;
+                                       }
+                               }
+
+                               return true;
+                       }
+
+                       function htmlAttributes() {
+                               var parsedResult = nOrMore( 0, htmlAttribute )();
+                               // Un-nest attributes array due to structure of jQueryMsg operations (see emit).
+                               return concat.apply( ['HTMLATTRIBUTES'], parsedResult );
+                       }
+
+                       // Subset of allowed HTML markup.
+                       // Most elements and many attributes allowed on the server are not supported yet.
+                       function html() {
+                               var result = null, parsedOpenTagResult, parsedHtmlContents,
+                                       parsedCloseTagResult, wrappedAttributes, attributes,
+                                       startTagName, endTagName, startOpenTagPos, startCloseTagPos,
+                                       endOpenTagPos, endCloseTagPos;
+
+                               // Break into three sequence calls.  That should allow accurate reconstruction of the original HTML, and requiring an exact tag name match.
+                               // 1. open through closeHtmlTag
+                               // 2. expression
+                               // 3. openHtmlEnd through close
+                               // This will allow recording the positions to reconstruct if HTML is to be treated as text.
+
+                               startOpenTagPos = pos;
+                               parsedOpenTagResult = sequence( [
+                                       openHtmlStartTag,
+                                       asciiAlphabetLiteral,
+                                       htmlAttributes,
+                                       optionalForwardSlash,
+                                       closeHtmlTag
+                               ] );
+
+                               if ( parsedOpenTagResult === null ) {
+                                       return null;
                                }
+
+                               endOpenTagPos = pos;
+                               startTagName = parsedOpenTagResult[1];
+
+                               parsedHtmlContents = nOrMore( 0, expression )();
+
+                               startCloseTagPos = pos;
+                               parsedCloseTagResult = sequence( [
+                                       openHtmlEndTag,
+                                       asciiAlphabetLiteral,
+                                       closeHtmlTag
+                               ] );
+
+                               if ( parsedCloseTagResult === null ) {
+                                       // Closing tag failed.  Return the start tag and contents.
+                                       return [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ].concat( parsedHtmlContents );
+                               }
+
+                               endCloseTagPos = pos;
+                               endTagName = parsedCloseTagResult[1];
+                               wrappedAttributes = parsedOpenTagResult[2];
+                               attributes = wrappedAttributes.slice( 1 );
+                               if ( isAllowedHtml( startTagName, endTagName, attributes) ) {
+                                       result = [ 'HTMLELEMENT', startTagName, wrappedAttributes ].concat( parsedHtmlContents );
+                               } else {
+                                       // HTML is not allowed, so contents will remain how
+                                       // it was, while HTML markup at this level will be
+                                       // treated as text
+                                       // E.g. assuming script tags are not allowed:
+                                       //
+                                       // <script>[[Foo|bar]]</script>
+                                       //
+                                       // results in '&lt;script&gt;' and '&lt;/script&gt;'
+                                       // (not treated as an HTML tag), surrounding a fully
+                                       // parsed HTML link.
+                                       //
+                                       // Concatenate everything from the tag, flattening the contents.
+                                       result = [ 'CONCAT', input.substring( startOpenTagPos, endOpenTagPos ) ].concat( parsedHtmlContents, input.substring( startCloseTagPos, endCloseTagPos ) );
+                               }
+
                                return result;
                        }
+
                        templateName = transform(
                                // see $wgLegalTitleChars
                                // not allowing : due to the need to catch "PLURAL:$1"
                        closeTemplate = makeStringParser('}}');
                        nonWhitespaceExpression = choice( [
                                template,
-                               link,
+                               wikilink,
                                extLinkParam,
                                extlink,
                                replacement,
                        ] );
                        paramExpression = choice( [
                                template,
-                               link,
+                               wikilink,
                                extLinkParam,
                                extlink,
                                replacement,
 
                        expression = choice( [
                                template,
-                               link,
+                               wikilink,
                                extLinkParam,
                                extlink,
                                replacement,
+                               html,
                                literal
                        ] );
 
                        $.each( nodes, function ( i, node ) {
                                if ( node instanceof jQuery && node.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                        $.each( node.contents(), function ( j, childNode ) {
-                                               $span.append( 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)
-                                       $span.append( $.type( node ) === 'object' ? node : document.createTextNode( node ) );
+                                       appendWithoutParsing( $span, node );
                                }
                        } );
                        return $span;
                 *
                 * @param nodes
                 */
-               wlink: function ( nodes ) {
+               wikilink: function ( nodes ) {
                        var page, anchor, url;
 
                        page = nodes[0];
                        } ).text( anchor );
                },
 
+               /**
+                * Converts array of HTML element key value pairs to object
+                *
+                * @param {Array} nodes array of consecutive key value pairs, with index 2 * n being a name and 2 * n + 1 the associated value
+                * @return {Object} object mapping attribute name to attribute value
+                */
+               htmlattributes: function ( nodes ) {
+                       var i, len, mapping = {};
+                       for ( i = 0, len = nodes.length; i < len; i += 2 ) {
+                               mapping[nodes[i]] = decodePrimaryHtmlEntities( nodes[i + 1] );
+                       }
+                       return mapping;
+               },
+
+               /**
+                * Handles an (already-validated) HTML element.
+                *
+                * @param {Array} nodes nodes to process when creating element
+                * @return {jQuery|Array} jQuery node for valid HTML or array for disallowed element
+                */
+               htmlelement: function ( nodes ) {
+                       var tagName, attributes, contents, $element;
+
+                       tagName = nodes.shift();
+                       attributes = nodes.shift();
+                       contents = nodes;
+                       $element = $( document.createElement( tagName ) ).attr( attributes );
+                       return appendWithoutParsing( $element, contents );
+               },
+
                /**
                 * Transform parsed structure into external link
                 * If the href is a jQuery object, treat it as "enclosing" the link text.
                 * @param {Array} of two elements, {jQuery|Function|String} and {String}
                 * @return {jQuery}
                 */
-               link: function ( nodes ) {
+               extlink: function ( nodes ) {
                        var $el,
                                arg = nodes[0],
                                contents = nodes[1];
                                        $el.attr( 'href', arg.toString() );
                                }
                        }
-                       $el.append( contents );
-                       return $el;
+                       return appendWithoutParsing( $el, contents );
                },
 
                /**
-                * This is basically use a combination of replace + link (link with parameter
+                * 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.
                 * @param {Array} of one element, integer, n >= 0
                 * @return {String} replacement
                 */
-               linkparam: function ( nodes, replacements ) {
+               extlinkparam: function ( nodes, replacements ) {
                        var replacement,
                                index = parseInt( nodes[0], 10 );
                        if ( index < replacements.length) {
                        } else {
                                replacement = '$' + ( index + 1 );
                        }
-                       return this.link( [ replacement, nodes[1] ] );
+                       return this.extlink( [ replacement, nodes[1] ] );
                },
 
                /**
                // 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 );
                }
index 2ceb3ea..d199132 100644 (file)
@@ -32,8 +32,8 @@ var mw = ( function ( $, undefined ) {
                 *
                 * If called with no arguments, all values will be returned.
                 *
-                * @param selection mixed String key or array of keys to get values for.
-                * @param fallback mixed Value to use in case key(s) do not exist (optional).
+                * @param {string|Array} selection String key or array of keys to get values for.
+                * @param {Mixed} [fallback] Value to use in case key(s) do not exist.
                 * @return mixed If selection was a string returns the value or null,
                 *  If selection was an array, returns an object of key/values (value is null if not found),
                 *  If selection was not passed or invalid, will return the 'values' object member (be careful as
@@ -73,8 +73,8 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Sets one or multiple key/value pairs.
                 *
-                * @param selection {mixed} String key or array of keys to set values for.
-                * @param value {mixed} Value to set (optional, only in use when key is a string)
+                * @param {string|Object} selection String key to set value for, or object mapping keys to values.
+                * @param {Mixed} [value] Value to set (optional, only in use when key is a string)
                 * @return {Boolean} This returns true on success, false on failure.
                 */
                set: function ( selection, value ) {
@@ -96,7 +96,7 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Checks if one or multiple keys exist.
                 *
-                * @param selection {mixed} String key or array of keys to check
+                * @param {Mixed} selection String key or array of keys to check
                 * @return {boolean} Existence of key(s)
                 */
                exists: function ( selection ) {
@@ -134,8 +134,7 @@ var mw = ( function ( $, undefined ) {
 
        Message.prototype = {
                /**
-                * Simple message parser, does $N replacement, HTML-escaping (only for
-                * 'escaped' format), and nothing else.
+                * Simple message parser, does $N replacement and nothing else.
                 *
                 * This may be overridden to provide a more complex message parser.
                 *
@@ -268,10 +267,17 @@ var mw = ( function ( $, undefined ) {
                /* Public Members */
 
                /**
-                * Dummy function which in debug mode can be replaced with a function that
-                * emulates console.log in console-less environments.
+                * Dummy placeholder for {@link mw.log}
+                * @method
                 */
-               log: function () { },
+               log: ( function () {
+                       var log = function () {};
+                       log.warn = function () {};
+                       log.deprecate = function ( obj, key, val ) {
+                               obj[key] = val;
+                       };
+                       return log;
+               }() ),
 
                // Make the Map constructor publicly available.
                Map: Map,
@@ -295,8 +301,6 @@ var mw = ( function ( $, undefined ) {
                 */
                libs: {},
 
-               /* Extension points */
-
                /**
                 * @property
                 */
@@ -363,7 +367,7 @@ var mw = ( function ( $, undefined ) {
                         *             'dependencies': ['required.foo', 'bar.also', ...], (or) function () {}
                         *             'group': 'somegroup', (or) null,
                         *             'source': 'local', 'someforeignwiki', (or) null
-                        *             'state': 'registered', 'loading', 'loaded', 'ready', 'error' or 'missing'
+                        *             'state': 'registered', 'loaded', 'loading', 'ready', 'error' or 'missing'
                         *             'script': ...,
                         *             'style': ...,
                         *             'messages': { 'key': 'value' },
@@ -393,7 +397,9 @@ var mw = ( function ( $, undefined ) {
                                // Selector cache for the marker element. Use getMarker() to get/use the marker!
                                $marker = null,
                                // Buffer for addEmbeddedCSS.
-                               cssBuffer = '';
+                               cssBuffer = '',
+                               // Callbacks for addEmbeddedCSS.
+                               cssCallbacks = $.Callbacks();
 
                        /* Private methods */
 
@@ -470,10 +476,15 @@ var mw = ( function ( $, undefined ) {
                        /**
                         * @param {string} [cssText=cssBuffer] If called without cssText,
                         * the internal buffer will be inserted instead.
+                        * @param {Function} [callback]
                         */
-                       function addEmbeddedCSS( cssText ) {
+                       function addEmbeddedCSS( cssText, callback ) {
                                var $style, styleEl;
 
+                               if ( callback ) {
+                                       cssCallbacks.add( callback );
+                               }
+
                                // Yield once before inserting the <style> tag. There are likely
                                // more calls coming up which we can combine this way.
                                // Appending a stylesheet and waiting for the browser to repaint
@@ -487,7 +498,13 @@ var mw = ( function ( $, undefined ) {
                                                // TODO: Use requestAnimationFrame in the future which will
                                                // perform even better by not injecting styles while the browser
                                                // is paiting.
-                                               setTimeout( addEmbeddedCSS );
+                                               setTimeout( function () {
+                                                       // Can't pass addEmbeddedCSS to setTimeout directly because Firefox
+                                                       // (below version 13) has the non-standard behaviour of passing a
+                                                       // numerical "lateness" value as first argument to this callback
+                                                       // http://benalman.com/news/2009/07/the-mysterious-firefox-settime/
+                                                       addEmbeddedCSS();
+                                               } );
                                                return;
                                        }
 
@@ -525,11 +542,14 @@ var mw = ( function ( $, undefined ) {
                                                } else {
                                                        styleEl.appendChild( document.createTextNode( String( cssText ) ) );
                                                }
+                                               cssCallbacks.fire().empty();
                                                return;
                                        }
                                }
 
                                $( addStyleTag( cssText, getMarker() ) ).data( 'ResourceLoaderDynamicStyleTag', true );
+
+                               cssCallbacks.fire().empty();
                        }
 
                        /**
@@ -643,7 +663,7 @@ var mw = ( function ( $, undefined ) {
                         *
                         * @private
                         * @param {string|string[]} states Module states to filter by
-                        * @param {Array} modules List of module names to filter (optional, by default the entire
+                        * @param {Array} [modules] List of module names to filter (optional, by default the entire
                         * registry is used)
                         * @return {Array} List of filtered module names
                         */
@@ -874,7 +894,8 @@ var mw = ( function ( $, undefined ) {
                         * @param {string} module Module name to execute
                         */
                        function execute( module ) {
-                               var key, value, media, i, urls, script, markModuleReady, nestedAddScript;
+                               var key, value, media, i, urls, cssHandle, checkCssHandles,
+                                       cssHandlesRegistered = false;
 
                                if ( registry[module] === undefined ) {
                                        throw new Error( 'Module has not been registered yet: ' + module );
@@ -883,7 +904,7 @@ var mw = ( function ( $, undefined ) {
                                } else if ( registry[module].state === 'loading' ) {
                                        throw new Error( 'Module has not completed loading yet: ' + module );
                                } else if ( registry[module].state === 'ready' ) {
-                                       throw new Error( 'Module has already been loaded: ' + module );
+                                       throw new Error( 'Module has already been executed: ' + module );
                                }
 
                                /**
@@ -901,6 +922,80 @@ var mw = ( function ( $, undefined ) {
                                        el.href = url;
                                }
 
+                               function runScript() {
+                                       var script, markModuleReady, nestedAddScript;
+                                       try {
+                                               script = registry[module].script;
+                                               markModuleReady = function () {
+                                                       registry[module].state = 'ready';
+                                                       handlePending( module );
+                                               };
+                                               nestedAddScript = function ( arr, callback, async, i ) {
+                                                       // Recursively call addScript() in its own callback
+                                                       // for each element of arr.
+                                                       if ( i >= arr.length ) {
+                                                               // We're at the end of the array
+                                                               callback();
+                                                               return;
+                                                       }
+
+                                                       addScript( arr[i], function () {
+                                                               nestedAddScript( arr, callback, async, i + 1 );
+                                                       }, async );
+                                               };
+
+                                               if ( $.isArray( script ) ) {
+                                                       nestedAddScript( script, markModuleReady, registry[module].async, 0 );
+                                               } else if ( $.isFunction( script ) ) {
+                                                       registry[module].state = 'ready';
+                                                       script( $ );
+                                                       handlePending( module );
+                                               }
+                                       } 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
+                                               log( 'Exception thrown by ' + module + ': ' + e.message, e );
+                                               registry[module].state = 'error';
+                                               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 );
+                               }
+
+                               // Make sure we don't run the scripts until all (potentially asynchronous)
+                               // stylesheet insertions have completed.
+                               ( function () {
+                                       var pending = 0;
+                                       checkCssHandles = function () {
+                                               // cssHandlesRegistered ensures we don't take off too soon, e.g. when
+                                               // one of the cssHandles is fired while we're still creating more handles.
+                                               if ( cssHandlesRegistered && pending === 0 && runScript ) {
+                                                       runScript();
+                                                       runScript = undefined; // Revoke
+                                               }
+                                       };
+                                       cssHandle = function () {
+                                               var check = checkCssHandles;
+                                               pending++;
+                                               return function () {
+                                                       if (check) {
+                                                               pending--;
+                                                               check();
+                                                               check = undefined; // Revoke
+                                                       }
+                                               };
+                                       };
+                               }() );
+
                                // Process styles (see also mw.loader.implement)
                                // * back-compat: { <media>: css }
                                // * back-compat: { <media>: [url, ..] }
@@ -919,7 +1014,7 @@ var mw = ( function ( $, undefined ) {
                                                                // Strings are pre-wrapped in "@media". The media-type was just ""
                                                                // (because it had to be set to something).
                                                                // This is one of the reasons why this format is no longer used.
-                                                               addEmbeddedCSS( value );
+                                                               addEmbeddedCSS( value, cssHandle() );
                                                        } else {
                                                                // back-compat: { <media>: [url, ..] }
                                                                media = key;
@@ -936,7 +1031,7 @@ var mw = ( function ( $, undefined ) {
                                                                        addLink( media, value[i] );
                                                                } else if ( key === 'css' ) {
                                                                        // { "css": [css, ..] }
-                                                                       addEmbeddedCSS( value[i] );
+                                                                       addEmbeddedCSS( value[i], cssHandle() );
                                                                }
                                                        }
                                                // Not an array, but a regular object
@@ -953,47 +1048,9 @@ var mw = ( function ( $, undefined ) {
                                        }
                                }
 
-                               // Add localizations to message system
-                               if ( $.isPlainObject( registry[module].messages ) ) {
-                                       mw.messages.set( registry[module].messages );
-                               }
-
-                               // Execute script
-                               try {
-                                       script = registry[module].script;
-                                       markModuleReady = function () {
-                                               registry[module].state = 'ready';
-                                               handlePending( module );
-                                       };
-                                       nestedAddScript = function ( arr, callback, async, i ) {
-                                               // Recursively call addScript() in its own callback
-                                               // for each element of arr.
-                                               if ( i >= arr.length ) {
-                                                       // We're at the end of the array
-                                                       callback();
-                                                       return;
-                                               }
-
-                                               addScript( arr[i], function () {
-                                                       nestedAddScript( arr, callback, async, i + 1 );
-                                               }, async );
-                                       };
-
-                                       if ( $.isArray( script ) ) {
-                                               registry[module].state = 'loading';
-                                               nestedAddScript( script, markModuleReady, registry[module].async, 0 );
-                                       } else if ( $.isFunction( script ) ) {
-                                               registry[module].state = 'ready';
-                                               script( $ );
-                                               handlePending( module );
-                                       }
-                               } 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
-                                       log( 'Exception thrown by ' + module + ': ' + e.message, e );
-                                       registry[module].state = 'error';
-                                       handlePending( module );
-                               }
+                               // Kick off.
+                               cssHandlesRegistered = true;
+                               checkCssHandles();
                        }
 
                        /**
@@ -1261,12 +1318,12 @@ var mw = ( function ( $, undefined ) {
                                 * Registers a module, letting the system know about it and its
                                 * properties. Startup modules contain calls to this function.
                                 *
-                                * @param module {String}: Module name
-                                * @param version {Number}: Module version number as a timestamp (falls backs to 0)
-                                * @param dependencies {String|Array|Function}: One string or array of strings of module
+                                * @param {string} module Module name
+                                * @param {number} version Module version number as a timestamp (falls backs to 0)
+                                * @param {string|Array|Function} dependencies One string or array of strings of module
                                 *  names on which this module depends, or a function that returns that array.
-                                * @param group {String}: Group which the module is in (optional, defaults to null)
-                                * @param source {String}: Name of the source. Defaults to local.
+                                * @param {string} [group=null] Group which the module is in
+                                * @param {string} [source='local'] Name of the source
                                 */
                                register: function ( module, version, dependencies, group, source ) {
                                        var m;
@@ -1368,10 +1425,10 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Executes a function as soon as one or more required modules are ready
                                 *
-                                * @param dependencies {String|Array} Module name or array of modules names the callback
+                                * @param {string|Array} dependencies Module name or array of modules names the callback
                                 *  dependends on to be ready before executing
-                                * @param ready {Function} callback to execute when all dependencies are ready (optional)
-                                * @param error {Function} callback to execute when if dependencies have a errors (optional)
+                                * @param {Function} [ready] callback to execute when all dependencies are ready
+                                * @param {Function} [error] callback to execute when if dependencies have a errors
                                 */
                                using: function ( dependencies, ready, error ) {
                                        var tod = typeof dependencies;
@@ -1405,15 +1462,15 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Loads an external script or one or more modules for future use
                                 *
-                                * @param modules {mixed} Either the name of a module, array of modules,
+                                * @param {string|Array} modules Either the name of a module, array of modules,
                                 *  or a URL of an external script or style
-                                * @param type {String} mime-type to use if calling with a URL of an
+                                * @param {string} [type='text/javascript'] mime-type to use if calling with a URL of an
                                 *  external script or style; acceptable values are "text/css" and
                                 *  "text/javascript"; if no type is provided, text/javascript is assumed.
-                                * @param async {Boolean} (optional) If true, load modules asynchronously
-                                *  even if document ready has not yet occurred. If false (default),
-                                *  block before document ready and load async after. If not set, true will
-                                *  be assumed if loading a URL, and false will be assumed otherwise.
+                                * @param {boolean} [async] If true, load modules asynchronously
+                                *  even if document ready has not yet occurred. If false, block before
+                                *  document ready and load async after. If not set, true will be
+                                *  assumed if loading a URL, and false will be assumed otherwise.
                                 */
                                load: function ( modules, type, async ) {
                                        var filtered, m, module, l;
@@ -1485,8 +1542,8 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Changes the state of a module
                                 *
-                                * @param module {String|Object} module name or object of module name/state pairs
-                                * @param state {String} state name
+                                * @param {string|Object} module module name or object of module name/state pairs
+                                * @param {string} state state name
                                 */
                                state: function ( module, state ) {
                                        var m;
@@ -1514,7 +1571,7 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Gets the version of a module
                                 *
-                                * @param module string name of module to get version for
+                                * @param {string} module name of module to get version for
                                 */
                                getVersion: function ( module ) {
                                        if ( registry[module] !== undefined && registry[module].version !== undefined ) {
@@ -1533,7 +1590,7 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Gets the state of a module
                                 *
-                                * @param module string name of module to get state for
+                                * @param {string} module name of module to get state for
                                 */
                                getState: function ( module ) {
                                        if ( registry[module] !== undefined && registry[module].state !== undefined ) {
@@ -1611,9 +1668,9 @@ var mw = ( function ( $, undefined ) {
                                /**
                                 * Create an HTML element string, with safe escaping.
                                 *
-                                * @param name The tag name.
-                                * @param attrs An object with members mapping element names to values
-                                * @param contents The contents of the element. May be either:
+                                * @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:
                                 *  - 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.
@@ -1682,7 +1739,82 @@ var mw = ( function ( $, undefined ) {
                user: {
                        options: new Map(),
                        tokens: new Map()
-               }
+               },
+
+               /**
+                * Registry and firing of events.
+                *
+                * MediaWiki has various interface components that are extended, enhanced
+                * or manipulated in some other way by extensions, gadgets and even
+                * in core itself.
+                *
+                * This framework helps streamlining the timing of when these other
+                * code paths fire their plugins (instead of using document-ready,
+                * which can and should be limited to firing only once).
+                *
+                * Features like navigating to other wiki pages, previewing an edit
+                * and editing itself – without a refresh – can then retrigger these
+                * hooks accordingly to ensure everything still works as expected.
+                *
+                * Example usage:
+                *
+                *     mw.hook( 'wikipage.content' ).add( fn ).remove( fn );
+                *     mw.hook( 'wikipage.content' ).fire( $content );
+                *
+                * Handlers can be added and fired for arbitrary event names at any time. The same
+                * event can be fired multiple times. The last run of an event is memorized
+                * (similar to `$(document).ready` and `$.Deferred().done`).
+                * This means if an event is fired, and a handler added afterwards, the added
+                * function will be fired right away with the last given event data.
+                *
+                * Like Deferreds and Promises, the mw.hook object is both detachable and chainable.
+                * Thus allowing flexible use and optimal maintainability and authority control.
+                * You can pass around the `add` and/or `fire` method to another piece of code
+                * without it having to know the event name (or `mw.hook` for that matter).
+                *
+                *     var h = mw.hook( 'bar.ready' );
+                *     new mw.Foo( .. ).fetch( { callback: h.fire } );
+                *
+                * @class mw.hook
+                */
+               hook: ( function () {
+                       var lists = {};
+
+                       /**
+                        * @method hook
+                        * @member mw
+                        * @param {string} name Name of hook.
+                        * @return {mw.hook}
+                        */
+                       return function ( name ) {
+                               var list = lists[name] || ( lists[name] = $.Callbacks( 'memory' ) );
+
+                               return {
+                                       /**
+                                        * Register a hook handler
+                                        * @param {Function...} handler Function to bind.
+                                        * @chainable
+                                        */
+                                       add: list.add,
+
+                                       /**
+                                        * Unregister a hook handler
+                                        * @param {Function...} handler Function to unbind.
+                                        * @chainable
+                                        */
+                                       remove: list.remove,
+
+                                       /**
+                                        * Run a hook.
+                                        * @param {Mixed...} data
+                                        * @chainable
+                                        */
+                                       fire: function () {
+                                               return list.fireWith( null, slice.call( arguments ) );
+                                       }
+                               };
+                       };
+               }() )
        };
 
 }( jQuery ) );
index ee08b12..75e4c96 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Logger for MediaWiki javascript.
  * Implements the stub left by the main 'mediawiki' module.
  *
@@ -8,16 +8,21 @@
 
 ( function ( mw, $ ) {
 
+       /**
+        * @class mw.log
+        * @singleton
+        */
+
        /**
         * Logs a message to the console.
         *
         * In the case the browser does not have a console API, a console is created on-the-fly by appending
-        * a <div id="mw-log-console"> element to the bottom of the body and then appending this and future
+        * a `<div id="mw-log-console">` element to the bottom of the body and then appending this and future
         * messages to that, instead of the console.
         *
-        * @param {String} First in list of variadic messages to output to console.
+        * @param {string...} msg Messages to output to console.
         */
-       mw.log = function ( /* logmsg, logmsg, */ ) {
+       mw.log = function () {
                // Turn arguments into an array
                var     args = Array.prototype.slice.call( arguments ),
                        // Allow log messages to use a configured prefix to identify the source window (ie. frame)
@@ -54,7 +59,7 @@
                                hovzer.update();
                        }
                        $log.append(
-                               $( '<div></div>' )
+                               $( '<div>' )
                                        .css( {
                                                borderBottom: 'solid 1px #DDDDDD',
                                                fontSize: 'small',
                } );
        };
 
+       /**
+        * Write a message the console's warning channel.
+        * Also logs a stacktrace for easier debugging.
+        * Each action is silently ignored if the browser doesn't support it.
+        *
+        * @param {string...} msg Messages to output to console
+        */
+       mw.log.warn = function () {
+               var console = window.console;
+               if ( console && console.warn ) {
+                       console.warn.apply( console, arguments );
+                       if ( console.trace ) {
+                               console.trace();
+                       }
+               }
+       };
+
+       /**
+        * Create a property in a host object that, when accessed, will produce
+        * a deprecation warning in the console with backtrace.
+        *
+        * @param {Object} obj Host object of deprecated property
+        * @param {string} key Name of property to create in `obj`
+        * @param {Mixed} val The value this property should return when accessed
+        * @param {string} [msg] Optional text to include in the deprecation message.
+        */
+       mw.log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
+               obj[key] = val;
+       } : function ( obj, key, val, msg ) {
+               msg = 'MWDeprecationWarning: Use of "' + key + '" property is deprecated.' +
+                       ( msg ? ( ' ' + msg ) : '' );
+               try {
+                       Object.defineProperty( obj, key, {
+                               configurable: true,
+                               enumerable: true,
+                               get: function () {
+                                       mw.log.warn( msg );
+                                       return val;
+                               },
+                               set: function ( newVal ) {
+                                       mw.log.warn( msg );
+                                       val = newVal;
+                               }
+                       } );
+               } catch ( err ) {
+                       // IE8 can throw on Object.defineProperty
+                       obj[key] = val;
+               }
+       };
+
 }( mediaWiki, jQuery ) );
index 2bc7cea..08f10fe 100644 (file)
                searchboxesSelectors = [
                        // Primary searchbox on every page in standard skins
                        '#searchInput',
-                       // Secondary searchbox in legacy skins (LegacyTemplate::searchForm uses id "searchInput + unique id")
-                       '#searchInput2',
                        // Special:Search
                        '#powerSearchText',
                        '#searchText',
                $( searchboxesSelectors.join(', ') )
                        .suggestions( {
                                fetch: function ( query ) {
-                                       var $el, jqXhr;
+                                       var $el;
 
                                        if ( query.length !== 0 ) {
-                                               $el = $(this);
-                                               jqXhr = $.ajax( {
-                                                       url: mw.util.wikiScript( 'api' ),
-                                                       data: {
-                                                               format: 'json',
-                                                               action: 'opensearch',
-                                                               search: query,
-                                                               namespace: 0,
-                                                               suggest: ''
-                                                       },
-                                                       dataType: 'json',
-                                                       success: function ( data ) {
-                                                               if ( $.isArray( data ) && data.length ) {
-                                                                       $el.suggestions( 'suggestions', data[1] );
-                                                               }
-                                                       }
-                                               });
-                                               $el.data( 'request', jqXhr );
+                                               $el = $( this );
+                                               $el.data( 'request', ( new mw.Api() ).get( {
+                                                       action: 'opensearch',
+                                                       search: query,
+                                                       namespace: 0,
+                                                       suggest: ''
+                                               } ).done( function ( data ) {
+                                                       $el.suggestions( 'suggestions', data[1] );
+                                               } ) );
                                        }
                                },
                                cancel: function () {
-                                       var jqXhr = $(this).data( 'request' );
+                                       var apiPromise = $( this ).data( 'request' );
                                        // If the delay setting has caused the fetch to have not even happened
-                                       // yet, the jqXHR object will have never been set.
-                                       if ( jqXhr && $.isFunction( jqXhr.abort ) ) {
-                                               jqXhr.abort();
-                                               $(this).removeData( 'request' );
+                                       // yet, the apiPromise object will have never been set.
+                                       if ( apiPromise && $.isFunction( apiPromise.abort ) ) {
+                                               apiPromise.abort();
+                                               $( this ).removeData( 'request' );
                                        }
                                },
                                result: {
                        return;
                }
 
-               // Placeholder text for search box
-               $searchInput
-                       .attr( 'placeholder', mw.msg( 'searchsuggest-search' ) )
-                       .placeholder();
-
                // Special suggestions functionality for skin-provided search box
                $searchInput.suggestions( {
                        result: {
index 308e4ad..9fd2e5e 100644 (file)
                };
 
                /**
-                * Gets the current user's name or a random ID automatically generated and kept in a cookie.
+                * Gets the current user's name or the session ID
                 *
-                * This ID is persistent for anonymous users, staying in their browser up to 1 year. The
-                * expiration time is reset each time the ID is queried, so in most cases this ID will
-                * persist until the browser's cookies are cleared or the user doesn't visit for 1 year.
-                *
-                * @return String: User name or random session ID
+                * @return {string} User name or random session ID
                 */
-               this.id = function() {
-                       var id,
-                               name = user.getName();
+               this.id = function () {
+                       var name = user.getName();
                        if ( name ) {
                                return name;
                        }
-                       id = $.cookie( 'mediaWiki.user.id' );
-                       if ( typeof id === 'undefined' || id === null ) {
-                               id = user.generateRandomSessionId();
-                       }
-                       // Set cookie if not set, or renew it if already set
-                       $.cookie( 'mediaWiki.user.id', id, {
-                               expires: 365,
-                               path: '/'
-                       } );
-                       return id;
+                       return user.sessionId();
                };
 
                /**
                 * must have at least one pair)
                 * @param options.version Number: Version of bucket test, changing this forces rebucketing
                 * (optional, default: 0)
-                * @param options.tracked Boolean: Track the event of bucketing through the API module of
-                * the ClickTracking extension (optional, default: false)
                 * @param options.expires Number: Length of time (in days) until the user gets rebucketed
                 * (optional, default: 30)
                 * @return String: Bucket name - the randomly chosen key of the options.buckets object
                 *     mw.user.bucket( 'test', {
                 *         'buckets': { 'ignored': 50, 'control': 25, 'test': 25 },
                 *         'version': 1,
-                *         'tracked': true,
                 *         'expires': 7
                 *     } );
                 */
                        options = $.extend( {
                                buckets: {},
                                version: 0,
-                               tracked: false,
                                expires: 30
                        }, options || {} );
 
                                                break;
                                        }
                                }
-                               if ( options.tracked ) {
-                                       mw.loader.using( 'jquery.clickTracking', function () {
-                                               $.trackAction(
-                                                       'mediaWiki.user.bucket:' + key + '@' + version + ':' + bucket
-                                               );
-                                       } );
-                               }
                                $.cookie(
                                        'mediaWiki.user.bucket:' + key,
                                        version + ':' + bucket,
index 5211b0d..977929d 100644 (file)
                                return util.$content;
                        } )();
 
+                       mw.hook( 'wikipage.content' ).fire( util.$content );
+
                        // Table of contents toggle
                        $tocTitle = $( '#toctitle' );
                        $tocToggleLink = $( '#togglelink' );
                 * Returns null if not found.
                 *
                 * @param {string} param The parameter name.
-                * @param {string} [url] URL to search through.
+                * @param {string} [url=document.location.href] URL to search through, defaulting to the current document's URL.
                 * @return {Mixed} Parameter value or null.
                 */
                getParamValue: function ( param, url ) {
                /**
                 * @property {RegExp}
                 * Regex to match accesskey tooltips.
+                *
+                * Should match:
+                *
+                * - "ctrl-option-"
+                * - "alt-shift-"
+                * - "ctrl-alt-"
+                * - "ctrl-"
+                *
+                * The accesskey is matched in group $6.
                 */
-               tooltipAccessKeyRegexp: /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
+               tooltipAccessKeyRegexp: /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
 
                /**
                 * Add the appropriate prefix to the accesskey shown in the tooltip.
                        }
 
                        $nodes.attr( 'title', function ( i, val ) {
-                               if ( val && util.tooltipAccessKeyRegexp.exec( val ) ) {
+                               if ( val && util.tooltipAccessKeyRegexp.test( val ) ) {
                                        return val.replace( util.tooltipAccessKeyRegexp,
-                                               '[' + util.tooltipAccessKeyPrefix + '$5]' );
+                                               '[' + util.tooltipAccessKeyPrefix + '$6]' );
                                }
                                return val;
                        } );
                                $link.attr( 'title', tooltip );
                        }
 
-                       // Some skins don't have any portlets
-                       // just add it to the bottom of their 'sidebar' element as a fallback
-                       switch ( mw.config.get( 'skin' ) ) {
-                       case 'standard':
-                               $( '#quickbar' ).append( $link.after( '<br/>' ) );
-                               return $link[0];
-                       case 'nostalgia':
-                               $( '#searchform' ).before( $link ).before( ' &#124; ' );
-                               return $link[0];
-                       default: // Skins like chick, modern, monobook, myskin, simple, vector...
-
-                               // Select the specified portlet
-                               $portlet = $( '#' + portlet );
-                               if ( $portlet.length === 0 ) {
-                                       return null;
-                               }
-                               // Select the first (most likely only) unordered list inside the portlet
-                               $ul = $portlet.find( 'ul' ).eq( 0 );
+                       // Select the specified portlet
+                       $portlet = $( '#' + portlet );
+                       if ( $portlet.length === 0 ) {
+                               return null;
+                       }
+                       // Select the first (most likely only) unordered list inside the portlet
+                       $ul = $portlet.find( 'ul' ).eq( 0 );
 
-                               // If it didn't have an unordered list yet, create it
-                               if ( $ul.length === 0 ) {
+                       // If it didn't have an unordered list yet, create it
+                       if ( $ul.length === 0 ) {
 
-                                       $ul = $( '<ul>' );
+                               $ul = $( '<ul>' );
 
-                                       // If there's no <div> inside, append it to the portlet directly
-                                       if ( $portlet.find( 'div:first' ).length === 0 ) {
-                                               $portlet.append( $ul );
-                                       } else {
-                                               // otherwise if there's a div (such as div.body or div.pBody)
-                                               // append the <ul> to last (most likely only) div
-                                               $portlet.find( 'div' ).eq( -1 ).append( $ul );
-                                       }
-                               }
-                               // Just in case..
-                               if ( $ul.length === 0 ) {
-                                       return null;
+                               // If there's no <div> inside, append it to the portlet directly
+                               if ( $portlet.find( 'div:first' ).length === 0 ) {
+                                       $portlet.append( $ul );
+                               } else {
+                                       // otherwise if there's a div (such as div.body or div.pBody)
+                                       // append the <ul> to last (most likely only) div
+                                       $portlet.find( 'div' ).eq( -1 ).append( $ul );
                                }
+                       }
+                       // Just in case..
+                       if ( $ul.length === 0 ) {
+                               return null;
+                       }
 
-                               // Unhide portlet if it was hidden before
-                               $portlet.removeClass( 'emptyPortlet' );
+                       // Unhide portlet if it was hidden before
+                       $portlet.removeClass( 'emptyPortlet' );
 
-                               // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
-                               // and back up the selector to the list item
-                               if ( $portlet.hasClass( 'vectorTabs' ) ) {
-                                       $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
-                               } else {
-                                       $item = $link.wrap( '<li></li>' ).parent();
-                               }
+                       // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
+                       // and back up the selector to the list item
+                       if ( $portlet.hasClass( 'vectorTabs' ) ) {
+                               $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
+                       } else {
+                               $item = $link.wrap( '<li></li>' ).parent();
+                       }
 
-                               // Implement the properties passed to the function
-                               if ( id ) {
-                                       $item.attr( 'id', id );
-                               }
+                       // Implement the properties passed to the function
+                       if ( id ) {
+                               $item.attr( 'id', id );
+                       }
+
+                       if ( tooltip ) {
+                               // Trim any existing accesskey hint and the trailing space
+                               tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
                                if ( accesskey ) {
-                                       $link.attr( 'accesskey', accesskey );
                                        tooltip += ' [' + accesskey + ']';
-                                       $link.attr( 'title', tooltip );
                                }
-                               if ( accesskey && tooltip ) {
+                               $link.attr( 'title', tooltip );
+                               if ( accesskey ) {
                                        util.updateTooltipAccessKeys( $link );
                                }
+                       }
 
-                               // Where to put our node ?
-                               // - nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
-                               if ( nextnode && nextnode.parentNode === $ul[0] ) {
-                                       $(nextnode).before( $item );
+                       if ( accesskey ) {
+                               $link.attr( 'accesskey', accesskey );
+                       }
 
-                               // - nextnode is a CSS selector for jQuery
-                               } else if ( typeof nextnode === 'string' && $ul.find( nextnode ).length !== 0 ) {
-                                       $ul.find( nextnode ).eq( 0 ).before( $item );
+                       // Where to put our node ?
+                       // - nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
+                       if ( nextnode && nextnode.parentNode === $ul[0] ) {
+                               $( nextnode ).before( $item );
 
-                               // If the jQuery selector isn't found within the <ul>,
-                               // or if nextnode was invalid or not passed at all,
-                               // then just append it at the end of the <ul> (this is the default behavior)
-                               } else {
-                                       $ul.append( $item );
-                               }
+                       // - nextnode is a CSS selector for jQuery
+                       } else if ( typeof nextnode === 'string' && $ul.find( nextnode ).length !== 0 ) {
+                               $ul.find( nextnode ).eq( 0 ).before( $item );
 
-
-                               return $item[0];
+                       // If the jQuery selector isn't found within the <ul>,
+                       // or if nextnode was invalid or not passed at all,
+                       // then just append it at the end of the <ul> (this is the default behavior)
+                       } else {
+                               $ul.append( $item );
                        }
+
+                       return $item[0];
                },
 
                /**
                 *
                 * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
                 * to allow CSS/JS to hide different boxes. null = no class used.
-                * @deprecated Use mw#notify
+                * @deprecated since 1.20 Use mw#notify
                 */
                jsMessage: function ( message ) {
                        if ( !arguments.length || message === '' || message === null ) {
index deff7e6..6fa8b3c 100644 (file)
  * This function will be deleted after it's used, so do not expand it to be
  * generally useful beyond startup.
  *
- * MediaWiki & jQuery compatibility:
- * - Internet Explorer 6.0+
- * - Firefox 10+
- * - Safari 5.0+
- * - Opera 11+
- * - Chrome
+ * See also:
+ * - https://www.mediawiki.org/wiki/Compatibility#Browser
+ * - http://jquerymobile.com/gbs/
+ * - http://jquery.com/browser-support/
  */
 
 /*jshint unused: false */
-function isCompatible() {
-       // IE < 6.0
-       if ( navigator.appVersion.indexOf( 'MSIE' ) !== -1
-               && parseFloat( navigator.appVersion.split( 'MSIE' )[1] ) < 6 )
-       {
-               return false;
+function isCompatible( ua ) {
+       if ( ua === undefined ) {
+               ua = navigator.userAgent;
        }
-       return true;
+
+       // MediaWiki JS or jQuery is known to have issues with:
+       return !(
+               // Internet Explorer < 6
+               ( ua.indexOf( 'MSIE' ) !== -1 && parseFloat( ua.split( 'MSIE' )[1] ) < 6 ) ||
+               // Firefox < 3
+               ( ua.indexOf( 'Firefox/' ) !== -1 && parseFloat( ua.split( 'Firefox/' )[1] ) < 3 ) ||
+               // BlackBerry < 6
+               ua.match( /BlackBerry[^\/]*\/[1-5]\./ ) ||
+               // Open WebOS < 1.5
+               ua.match( /webOS\/1\.[0-4]/ ) ||
+               // Anything PlayStation based.
+               ua.match( /PlayStation/i ) ||
+               // Any Symbian based browsers
+               ua.match( /SymbianOS|Series60/ ) ||
+               // Any NetFront based browser
+               ua.match( /NetFront/ ) ||
+               // Opera Mini, all versions
+               ua.match( /Opera Mini/ )
+       );
 }
 
 /**
index 09aec79..766c1a5 100644 (file)
@@ -24,7 +24,7 @@
 if ( !defined( 'MEDIAWIKI' ) ) {
        $wgNoDBParam = true;
        $optionsWithArgs = array( 'o' );
-       require_once( __DIR__ .'/../maintenance/commandLine.inc' );
+       require_once __DIR__ .'/../maintenance/commandLine.inc';
 
        $stderr = fopen( 'php://stderr', 'w' );
        if ( !isset( $args[0] ) ) {
@@ -65,7 +65,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 //----------------------------------------------------------------------------
 
 function getVars( $_gv_filename ) {
-       require( $_gv_filename );
+       require $_gv_filename;
        $vars = get_defined_vars();
        unset( $vars['_gv_filename'] );
 
diff --git a/skins/Chick.php b/skins/Chick.php
deleted file mode 100644 (file)
index 75b807a..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-/**
- * Chick: A lightweight Monobook skin with no sidebar, the sidebar links are
- * given at the bottom of the page instead, as in the unstyled MySkin.
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
-       die( -1 );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinChick extends SkinTemplate {
-       var $skinname = 'chick', $stylename = 'chick',
-       $template = 'MonoBookTemplate', $useHeadElement = true;
-
-       /**
-        * @param $out OutputPage
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-
-               $out->addModuleStyles( 'skins.chick' );
-
-               // TODO: Migrate all of these to RL
-               $out->addStyle( 'chick/IE60Fixes.css', 'screen,handheld', 'IE 6' );
-       }
-}
index 21b07f7..d766b64 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( -1 );
 }
 
@@ -39,7 +39,7 @@ class SkinCologneBlue extends SkinTemplate {
         * @param $out OutputPage
         */
        function setupSkinUserCss( OutputPage $out ) {
-               $out->addModuleStyles( 'mediawiki.legacy.shared' );
+               parent::setupSkinUserCss( $out );
                $out->addModuleStyles( 'mediawiki.legacy.oldshared' );
                $out->addModuleStyles( 'skins.cologneblue' );
        }
@@ -127,7 +127,7 @@ class CologneBlueTemplate extends BaseTemplate {
         *
         * @return string
         */
-       function processBottomLink( $key, $navlink, $message=null ) {
+       function processBottomLink( $key, $navlink, $message = null ) {
                if ( !$navlink ) {
                        // Empty navlinks might be passed.
                        return null;
@@ -202,7 +202,7 @@ class CologneBlueTemplate extends BaseTemplate {
                $companionTitle = $title->isTalkPage() ? $title->getSubjectPage() : $title->getTalkPage();
                $companionNamespace = $companionTitle->getNamespace();
 
-               // TODO these messages appear to only be used by CologneBlue and legacy skins,
+               // TODO these messages are only be used by CologneBlue,
                // kill and replace with something more sensibly named?
                $nsToMessage = array(
                        NS_MAIN => 'articlepage',
@@ -234,7 +234,7 @@ class CologneBlueTemplate extends BaseTemplate {
 
                // Use the regular navigational link, but replace its text. Everything else stays unmodified.
                $namespacesLinks = $this->data['content_navigation']['namespaces'];
-               return $this->processBottomLink( $message,  $namespacesLinks[$key], $message );
+               return $this->processBottomLink( $message, $namespacesLinks[$key], $message );
        }
 
        /**
@@ -246,7 +246,7 @@ class CologneBlueTemplate extends BaseTemplate {
         * @param $navlink array Navigational link generated by SkinTemplate
         * @param $idPrefix mixed Prefix to add to id of this navlink. If false, id is removed entirely. Default is 'cb-'.
         */
-       function processNavlinkForDocument( $navlink, $idPrefix='cb-' ) {
+       function processNavlinkForDocument( $navlink, $idPrefix = 'cb-' ) {
                if ( $navlink['id'] ) {
                        $navlink['single-id'] = $navlink['id']; // to allow for tooltip generation
                        $navlink['tooltiponly'] = true; // but no accesskeys
@@ -255,7 +255,7 @@ class CologneBlueTemplate extends BaseTemplate {
                        if ( $idPrefix === false ) {
                                unset( $navlink['id'] );
                        } else {
-                               $navlink['id'] =  $idPrefix . $navlink['id'];
+                               $navlink['id'] = $idPrefix . $navlink['id'];
                        }
                }
 
@@ -316,7 +316,8 @@ class CologneBlueTemplate extends BaseTemplate {
                ob_start();
 ?>
        </div>
-       <div id="footer" role="contentinfo">
+       <div id="footer">
+               <div id="footer-navigation" role="navigation">
 <?php
                // Page-related links
                echo $this->bottomLinks();
@@ -328,8 +329,10 @@ class CologneBlueTemplate extends BaseTemplate {
                        $this->getSkin()->aboutLink(),
                        $this->searchForm( 'footer' )
                ) );
-               echo "\n<br />";
-
+?>
+               </div>
+               <div id="footer-info" role="contentinfo">
+<?php
                // Standard footer info
                $footlinks = $this->getFooterLinks();
                if ( $footlinks['info'] ) {
@@ -338,6 +341,7 @@ class CologneBlueTemplate extends BaseTemplate {
                        }
                }
 ?>
+               </div>
        </div>
 </div>
 <div id="mw-navigation">
@@ -376,7 +380,7 @@ class CologneBlueTemplate extends BaseTemplate {
                );
 
                $personalUrls = $this->getPersonalTools();
-               foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+               foreach ( array( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
                        if ( $personalUrls[$key] ) {
                                $s[] = $this->makeListItem( $key, $personalUrls[$key], array( 'tag' => 'span' ) );
                        }
@@ -417,7 +421,7 @@ class CologneBlueTemplate extends BaseTemplate {
 
                // Personal tools ("My pages")
                $qbmyoptions = $this->getPersonalTools();
-               foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+               foreach ( array( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
                        $qbmyoptions[$key] = null;
                }
 
@@ -532,17 +536,17 @@ class CologneBlueTemplate extends BaseTemplate {
 
                $search = $this->getSkin()->getRequest()->getText( 'search' );
                $action = $this->data['searchaction'];
-               $s = "<form id=\"searchform-" . htmlspecialchars($which) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
-               if( $which == 'footer' ) {
+               $s = "<form id=\"searchform-" . htmlspecialchars( $which ) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
+               if ( $which == 'footer' ) {
                        $s .= wfMessage( 'qbfind' )->text() . ": ";
                }
 
                $s .= "<input type='text' class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\""
                        . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />"
-                       . ($which == 'footer' ? " " : "<br />")
+                       . ( $which == 'footer' ? " " : "<br />" )
                        . "<input type='submit' class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
 
-               if( $wgUseTwoButtonsSearchForm ) {
+               if ( $wgUseTwoButtonsSearchForm ) {
                        $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'searchbutton' )->escaped() . "\" />\n";
                } else {
                        $s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
index 9dbefb1..52f9fa2 100644 (file)
@@ -22,8 +22,9 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( -1 );
+}
 
 /**
  * Inherit main code from SkinTemplate, set the CSS and template filter.
@@ -39,7 +40,7 @@ class SkinModern extends SkinTemplate {
         */
        function setupSkinUserCss( OutputPage $out ) {
                parent::setupSkinUserCss( $out );
-               $out->addModuleStyles ('skins.modern');
+               $out->addModuleStyles( 'skins.modern' );
        }
 }
 
@@ -68,7 +69,7 @@ class ModernTemplate extends MonoBookTemplate {
        <div id="mw_header"><h1 id="firstHeading" lang="<?php
                $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
                $this->html( 'pageLanguage' );
-       ?>"><span dir="auto"><?php $this->html('title') ?></span></h1></div>
+       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div>
 
        <div id="mw_main">
        <div id="mw_contentwrapper">
@@ -82,30 +83,30 @@ class ModernTemplate extends MonoBookTemplate {
             for the margins -->
        <div id="mw_contentholder" class="mw-body">
                <div class='mw-topboxes'>
-                       <div id="mw-js-message" style="display:none;"<?php $this->html('userlangattributes')?>></div>
-                       <div class="mw-topbox" id="siteSub"><?php $this->msg('tagline') ?></div>
-                       <?php if($this->data['newtalk'] ) {
-                               ?><div class="usermessage mw-topbox"><?php $this->html('newtalk')  ?></div>
+                       <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+                       <div class="mw-topbox" id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                       <?php if ( $this->data['newtalk'] ) {
+                               ?><div class="usermessage mw-topbox"><?php $this->html( 'newtalk' ) ?></div>
                        <?php } ?>
-                       <?php if($this->data['sitenotice']) {
-                               ?><div class="mw-topbox" id="siteNotice"><?php $this->html('sitenotice') ?></div>
+                       <?php if ( $this->data['sitenotice'] ) {
+                               ?><div class="mw-topbox" id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
                        <?php } ?>
                </div>
 
-               <div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></div>
+               <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
 
-               <?php if($this->data['undelete']) { ?><div id="contentSub2"><?php     $this->html('undelete') ?></div><?php } ?>
-               <?php if($this->data['showjumplinks']) { ?><div id="jump-to-nav"><?php $this->msg('jumpto') ?> <a href="#mw_portlets"><?php $this->msg('jumptonavigation') ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div><?php } ?>
+               <?php if ( $this->data['undelete'] ) { ?><div id="contentSub2"><?php $this->html( 'undelete' ) ?></div><?php } ?>
+               <?php if ( $this->data['showjumplinks'] ) { ?><div id="jump-to-nav"><?php $this->msg( 'jumpto' ) ?> <a href="#mw_portlets"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div><?php } ?>
 
-               <?php $this->html('bodytext') ?>
+               <?php $this->html( 'bodytext' ) ?>
                <div class='mw_clear'></div>
-               <?php if($this->data['catlinks']) { $this->html('catlinks'); } ?>
-               <?php $this->html ('dataAfterContent') ?>
+               <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
+               <?php $this->html( 'dataAfterContent' ) ?>
        </div><!-- mw_contentholder -->
        </div><!-- mw_content -->
        </div><!-- mw_contentwrapper -->
 
-       <div id="mw_portlets"<?php $this->html("userlangattributes") ?>>
+       <div id="mw_portlets"<?php $this->html( "userlangattributes" ) ?>>
        <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
 
        <!-- portlets -->
@@ -120,11 +121,11 @@ class ModernTemplate extends MonoBookTemplate {
 
        <!-- personal portlet -->
        <div class="portlet" id="p-personal" role="navigation">
-               <h3><?php $this->msg('personaltools') ?></h3>
+               <h3><?php $this->msg( 'personaltools' ) ?></h3>
                <div class="pBody">
                        <ul>
-<?php          foreach($this->getPersonalTools() as $key => $item) { ?>
-                               <?php echo $this->makeListItem($key, $item); ?>
+<?php          foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+                               <?php echo $this->makeListItem( $key, $item ); ?>
 
 <?php          } ?>
                        </ul>
@@ -133,19 +134,19 @@ class ModernTemplate extends MonoBookTemplate {
 
 
        <!-- footer -->
-       <div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
+       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
                        <ul id="f-list">
 <?php
-               foreach( $this->getFooterLinks("flat") as $aLink ) {
-                       if( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
-?>                             <li id="<?php echo$aLink?>"><?php $this->html($aLink) ?></li>
+               foreach ( $this->getFooterLinks( "flat" ) as $aLink ) {
+                       if ( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
+?>                             <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
 <?php          }
                }
 ?>
                        </ul>
 <?php
-               foreach ( $this->getFooterIcons("nocopyright") as $blockName => $footerIcons ) { ?>
-                       <div id="mw_<?php echo htmlspecialchars($blockName); ?>">
+               foreach ( $this->getFooterIcons( "nocopyright" ) as $blockName => $footerIcons ) { ?>
+                       <div id="mw_<?php echo htmlspecialchars( $blockName ); ?>">
 <?php
                        foreach ( $footerIcons as $icon ) { ?>
                                <?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?>
index f03d31b..e805aca 100644 (file)
@@ -25,8 +25,9 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) )
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( -1 );
+}
 
 /**
  * Inherit main code from SkinTemplate, set the CSS and template filter.
@@ -42,17 +43,10 @@ class SkinMonoBook extends SkinTemplate {
         * @param $out OutputPage
         */
        function setupSkinUserCss( OutputPage $out ) {
-               global $wgHandheldStyle;
                parent::setupSkinUserCss( $out );
 
                $out->addModuleStyles( 'skins.monobook' );
 
-               // Ugh. Can't do this properly because $wgHandheldStyle may be a URL
-               if( $wgHandheldStyle ) {
-                       // Currently in testing... try 'chick/main.css'
-                       $out->addStyle( $wgHandheldStyle, 'handheld' );
-               }
-
                // TODO: Migrate all of these
                $out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
                $out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
@@ -82,39 +76,39 @@ class MonoBookTemplate extends BaseTemplate {
 ?><div id="globalWrapper">
 <div id="column-content"><div id="content" class="mw-body-primary" role="main">
        <a id="top"></a>
-       <?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?>
+       <?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?>
 
        <h1 id="firstHeading" class="firstHeading" lang="<?php
                $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
                $this->html( 'pageLanguage' );
-       ?>"><span dir="auto"><?php $this->html('title') ?></span></h1>
+       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
        <div id="bodyContent" class="mw-body">
-               <div id="siteSub"><?php $this->msg('tagline') ?></div>
-               <div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></div>
-<?php if($this->data['undelete']) { ?>
-               <div id="contentSub2"><?php $this->html('undelete') ?></div>
-<?php } ?><?php if($this->data['newtalk'] ) { ?>
-               <div class="usermessage"><?php $this->html('newtalk')  ?></div>
-<?php } ?><?php if($this->data['showjumplinks']) { ?>
-               <div id="jump-to-nav" class="mw-jump"><?php $this->msg('jumpto') ?> <a href="#column-one"><?php $this->msg('jumptonavigation') ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg('jumptosearch') ?></a></div>
+               <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+               <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
+<?php if ( $this->data['undelete'] ) { ?>
+               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+<?php } ?><?php if ( $this->data['newtalk'] ) { ?>
+               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+<?php } ?><?php if ( $this->data['showjumplinks'] ) { ?>
+               <div id="jump-to-nav" class="mw-jump"><?php $this->msg( 'jumpto' ) ?> <a href="#column-one"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
 <?php } ?>
                <!-- start content -->
-<?php $this->html('bodytext') ?>
-               <?php if($this->data['catlinks']) { $this->html('catlinks'); } ?>
+<?php $this->html( 'bodytext' ) ?>
+               <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
                <!-- end content -->
-               <?php if($this->data['dataAfterContent']) { $this->html ('dataAfterContent'); } ?>
+               <?php if ( $this->data['dataAfterContent'] ) { $this->html( 'dataAfterContent' ); } ?>
                <div class="visualClear"></div>
        </div>
 </div></div>
-<div id="column-one"<?php $this->html('userlangattributes')  ?>>
+<div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
        <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
 <?php $this->cactions(); ?>
        <div class="portlet" id="p-personal" role="navigation">
-               <h3><?php $this->msg('personaltools') ?></h3>
+               <h3><?php $this->msg( 'personaltools' ) ?></h3>
                <div class="pBody">
-                       <ul<?php $this->html('userlangattributes') ?>>
-<?php          foreach($this->getPersonalTools() as $key => $item) { ?>
-                               <?php echo $this->makeListItem($key, $item); ?>
+                       <ul<?php $this->html( 'userlangattributes' ) ?>>
+<?php          foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+                               <?php echo $this->makeListItem( $key, $item ); ?>
 
 <?php          } ?>
                        </ul>
@@ -125,7 +119,7 @@ class MonoBookTemplate extends BaseTemplate {
                        echo Html::element( 'a', array(
                                'href' => $this->data['nav_urls']['mainpage']['href'],
                                'style' => "background-image: url({$this->data['logopath']});" )
-                               + Linker::tooltipAndAccesskeyAttribs('p-logo') ); ?>
+                               + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
 
        </div>
 <?php
@@ -138,14 +132,14 @@ class MonoBookTemplate extends BaseTemplate {
        $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
 
        if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
+<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
 <?php
                $footerEnd = '</div>';
        } else {
                $footerEnd = '';
        }
        foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
-       <div id="f-<?php echo htmlspecialchars($blockName); ?>ico">
+       <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
 <?php foreach ( $footerIcons as $icon ) { ?>
                <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
 
@@ -157,8 +151,8 @@ class MonoBookTemplate extends BaseTemplate {
                if ( count( $validFooterLinks ) > 0 ) {
 ?>     <ul id="f-list">
 <?php
-                       foreach( $validFooterLinks as $aLink ) { ?>
-               <li id="<?php echo $aLink ?>"><?php $this->html($aLink) ?></li>
+                       foreach ( $validFooterLinks as $aLink ) { ?>
+               <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
 <?php
                        }
 ?>
@@ -181,13 +175,20 @@ echo $footerEnd;
         * @param $sidebar array
         */
        protected function renderPortals( $sidebar ) {
-               if ( !isset( $sidebar['SEARCH'] ) ) $sidebar['SEARCH'] = true;
-               if ( !isset( $sidebar['TOOLBOX'] ) ) $sidebar['TOOLBOX'] = true;
-               if ( !isset( $sidebar['LANGUAGES'] ) ) $sidebar['LANGUAGES'] = true;
+               if ( !isset( $sidebar['SEARCH'] ) ) {
+                       $sidebar['SEARCH'] = true;
+               }
+               if ( !isset( $sidebar['TOOLBOX'] ) ) {
+                       $sidebar['TOOLBOX'] = true;
+               }
+               if ( !isset( $sidebar['LANGUAGES'] ) ) {
+                       $sidebar['LANGUAGES'] = true;
+               }
 
-               foreach( $sidebar as $boxName => $content ) {
-                       if ( $content === false )
+               foreach ( $sidebar as $boxName => $content ) {
+                       if ( $content === false ) {
                                continue;
+                       }
 
                        if ( $boxName == 'SEARCH' ) {
                                $this->searchBox();
@@ -205,19 +206,19 @@ echo $footerEnd;
                global $wgUseTwoButtonsSearchForm;
 ?>
        <div id="p-search" class="portlet" role="search">
-               <h3><label for="searchInput"><?php $this->msg('search') ?></label></h3>
+               <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
                <div id="searchBody" class="pBody">
-                       <form action="<?php $this->text('wgScript') ?>" id="searchform">
-                               <input type='hidden' name="title" value="<?php $this->text('searchtitle') ?>"/>
-                               <?php echo $this->makeSearchInput(array( "id" => "searchInput" )); ?>
+                       <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+                               <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+                               <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
 
-                               <?php echo $this->makeSearchButton("go", array( "id" => "searchGoButton", "class" => "searchButton" ));
-                               if ($wgUseTwoButtonsSearchForm): ?>&#160;
-                               <?php echo $this->makeSearchButton("fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ));
-                               else: ?>
+                               <?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) );
+                               if ( $wgUseTwoButtonsSearchForm ) { ?>&#160;
+                               <?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) );
+                               } else { ?>
 
-                               <div><a href="<?php $this->text('searchaction') ?>" rel="search"><?php $this->msg('powersearch-legend') ?></a></div><?php
-                               endif; ?>
+                               <div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+                               } ?>
 
                        </form>
                </div>
@@ -232,10 +233,10 @@ echo $footerEnd;
        function cactions() {
 ?>
        <div id="p-cactions" class="portlet" role="navigation">
-               <h3><?php $this->msg('views') ?></h3>
+               <h3><?php $this->msg( 'views' ) ?></h3>
                <div class="pBody">
                        <ul><?php
-                               foreach($this->data['content_actions'] as $key => $tab) {
+                               foreach ( $this->data['content_actions'] as $key => $tab ) {
                                        echo '
                                ' . $this->makeListItem( $key, $tab );
                                } ?>
@@ -249,12 +250,12 @@ echo $footerEnd;
        function toolbox() {
 ?>
        <div class="portlet" id="p-tb" role="navigation">
-               <h3><?php $this->msg('toolbox') ?></h3>
+               <h3><?php $this->msg( 'toolbox' ) ?></h3>
                <div class="pBody">
                        <ul>
 <?php
                foreach ( $this->getToolbox() as $key => $tbitem ) { ?>
-                               <?php echo $this->makeListItem($key, $tbitem); ?>
+                               <?php echo $this->makeListItem( $key, $tbitem ); ?>
 
 <?php
                }
@@ -269,14 +270,14 @@ echo $footerEnd;
 
        /*************************************************************************************************/
        function languageBox() {
-               if( $this->data['language_urls'] ) {
+               if ( $this->data['language_urls'] ) {
 ?>
        <div id="p-lang" class="portlet" role="navigation">
-               <h3<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h3>
+               <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
                <div class="pBody">
                        <ul>
-<?php          foreach($this->data['language_urls'] as $key => $langlink) { ?>
-                               <?php echo $this->makeListItem($key, $langlink); ?>
+<?php          foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+                               <?php echo $this->makeListItem( $key, $langlink ); ?>
 
 <?php          } ?>
                        </ul>
@@ -298,14 +299,15 @@ echo $footerEnd;
                        $portletAttribs['title'] = $tooltip;
                }
                echo '  ' . Html::openElement( 'div', $portletAttribs );
+               $msgObj = wfMessage( $bar );
 ?>
 
-               <h3><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h3>
+               <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
                <div class='pBody'>
 <?php   if ( is_array( $cont ) ) { ?>
                        <ul>
-<?php                  foreach($cont as $key => $val) { ?>
-                               <?php echo $this->makeListItem($key, $val); ?>
+<?php                  foreach ( $cont as $key => $val ) { ?>
+                               <?php echo $this->makeListItem( $key, $val ); ?>
 
 <?php                  } ?>
                        </ul>
diff --git a/skins/MySkin.php b/skins/MySkin.php
deleted file mode 100644 (file)
index fb49b88..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * MySkin: Monobook without the CSS. The idea is that you
- * customise it using user or site CSS.
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
-       die( -1 );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinMySkin extends SkinTemplate {
-       var $skinname = 'myskin', $stylename = 'myskin',
-               $template = 'MonoBookTemplate', $useHeadElement = true;
-}
diff --git a/skins/Nostalgia.php b/skins/Nostalgia.php
deleted file mode 100644 (file)
index 3028915..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-<?php
-/**
- * Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) ) {
-       die( -1 );
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class SkinNostalgia extends SkinLegacy {
-       var $skinname = 'nostalgia', $stylename = 'nostalgia',
-               $template = 'NostalgiaTemplate';
-
-       /**
-        * @param $out OutputPage
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-               $out->addModuleStyles( 'skins.nostalgia' );
-       }
-
-}
-
-class NostalgiaTemplate extends LegacyTemplate {
-
-       /**
-        * @return string
-        */
-       function doBeforeContent() {
-               $s = "\n<div id='content'>\n<div id='top'>\n";
-               $s .= '<div id="logo">' . $this->getSkin()->logoText( 'right' ) . '</div>';
-
-               $s .= $this->pageTitle();
-               $s .= $this->pageSubtitle() . "\n";
-
-               $s .= '<div id="topbar">';
-               $s .= $this->topLinks() . "\n<br />";
-
-               $notice = $this->getSkin()->getSiteNotice();
-               if( $notice ) {
-                       $s .= "\n<div id='siteNotice'>$notice</div>\n";
-               }
-               $s .= $this->pageTitleLinks();
-
-               $ol = $this->otherLanguages();
-               if( $ol ) {
-                       $s .= '<br />' . $ol;
-               }
-
-               $s .= $this->getSkin()->getCategories();
-
-               $s .= "<br clear='all' /></div><hr />\n</div>\n";
-               $s .= "\n<div id='article'>";
-
-               return $s;
-       }
-
-       /**
-        * @return string
-        */
-       function topLinks() {
-               $sep = " |\n";
-
-               $s = $this->getSkin()->mainPageLink() . $sep
-                 . Linker::specialLink( 'Recentchanges' );
-
-               if ( $this->data['isarticle'] ) {
-                       $s .= $sep . '<strong>' . $this->editThisPage() . '</strong>' . $sep . $this->talkLink() .
-                                       $sep . $this->historyLink();
-               }
-
-               /* show links to different language variants */
-               $s .= $this->variantLinks();
-               $s .= $this->extensionTabLinks();
-               if ( !$this->data['loggedin'] ) {
-                       $s .= $sep . Linker::specialLink( 'Userlogin' );
-               } else {
-                       /* show user page and user talk links */
-                       $user = $this->getSkin()->getUser();
-                       $s .= $sep . Linker::link( $user->getUserPage(), wfMessage( 'mypage' )->escaped() );
-                       $s .= $sep . Linker::link( $user->getTalkPage(), wfMessage( 'mytalk' )->escaped() );
-                       if ( $user->getNewtalk() ) {
-                               $s .= ' *';
-                       }
-                       /* show watchlist link */
-                       $s .= $sep . Linker::specialLink( 'Watchlist' );
-                       /* show my contributions link */
-                       $s .= $sep . Linker::link(
-                               SpecialPage::getSafeTitleFor( 'Contributions', $this->data['username'] ),
-                               wfMessage( 'mycontris' )->escaped() );
-                       /* show my preferences link */
-                       $s .= $sep . Linker::specialLink( 'Preferences' );
-                       /* show upload file link */
-                       if( UploadBase::isEnabled() && UploadBase::isAllowed( $user ) === true ) {
-                               $s .= $sep . $this->getUploadLink();
-                       }
-
-                       /* show log out link */
-                       $s .= $sep . Linker::specialLink( 'Userlogout' );
-               }
-
-               $s .= $sep . $this->specialPagesList();
-
-               return $s;
-       }
-
-       /**
-        * @return string
-        */
-       function doAfterContent() {
-               $s = "\n</div><br clear='all' />\n";
-
-               $s .= "\n<div id='footer'><hr />";
-
-               $s .= $this->bottomLinks();
-               $s .= "\n<br />" . $this->pageStats();
-               $s .= "\n<br />" . $this->getSkin()->mainPageLink()
-                               . ' | ' . $this->getSkin()->aboutLink()
-                               . ' | ' . $this->searchForm();
-
-               $s .= "\n</div>\n</div>\n";
-
-               return $s;
-       }
-}
diff --git a/skins/Simple.php b/skins/Simple.php
deleted file mode 100644 (file)
index 9a3ab94..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * Simple: A lightweight skin with a simple white-background sidebar and no
- * top bar.
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) )
-       die( -1 );
-
-/** */
-require_once( __DIR__ . '/MonoBook.php' );
-
-/**
- * Inherit main code from SkinTemplate, set the CSS and template filter.
- * @ingroup Skins
- */
-class SkinSimple extends SkinTemplate {
-       var $skinname = 'simple', $stylename = 'simple',
-               $template = 'MonoBookTemplate', $useHeadElement = true;
-
-       /**
-        * @param $out OutputPage
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-
-               $out->addModuleStyles( 'skins.simple' );
-
-               /* Add some userprefs specific CSS styling */
-               $rules = array();
-               $underline = "";
-
-               if ( $this->getUser()->getOption( 'underline' ) < 2 ) {
-                       $underline = "text-decoration: " . $this->getUser()->getOption( 'underline' ) ? 'underline !important' : 'none' . ";";
-               }
-               $style = implode( "\n", $rules );
-               $out->addInlineStyle( $style, 'flip' );
-
-       }
-}
diff --git a/skins/Standard.php b/skins/Standard.php
deleted file mode 100644 (file)
index 5b358e0..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-<?php
-/**
- * Standard (a.k.a. Classic) skin: old MediaWiki default skin
- *
- * 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 Skins
- */
-
-if( !defined( 'MEDIAWIKI' ) ) {
-       die( -1 );
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class SkinStandard extends SkinLegacy {
-       var $skinname = 'standard', $stylename = 'standard',
-               $template = 'StandardTemplate';
-
-       /**
-        * @param $out OutputPage
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-               $out->addModuleStyles( 'skins.standard' );
-
-               $qb = $this->qbSetting();
-               $rules = array();
-
-               if ( 2 == $qb ) { # Right
-                       $rules[] = "/* @noflip */#quickbar { position: absolute; top: 4px; right: 4px; border-left: 2px solid #000000; }";
-                       $rules[] = "/* @noflip */#article, #mw-data-after-content { margin-left: 4px; margin-right: 152px; }";
-                       $rules[] = "/* @noflip */#topbar, #footer { margin-right: 152px; }";
-               } elseif ( 1 == $qb || 3 == $qb ) {
-                       $rules[] = "/* @noflip */#quickbar { position: absolute; top: 4px; left: 4px; border-right: 1px solid gray; }";
-                       $rules[] = "/* @noflip */#article, #mw-data-after-content { margin-left: 152px; margin-right: 4px; }";
-                       $rules[] = "/* @noflip */#topbar, #footer { margin-left: 152px; }";
-                       if( 3 == $qb ) {
-                               $rules[] = "/* @noflip */#quickbar { position: fixed; padding: 4px; }";
-                       }
-               } elseif ( 4 == $qb ) {
-                       $rules[] = "/* @noflip */#quickbar { position: fixed; right: 0; top: 0; padding: 4px; }";
-                       $rules[] = "/* @noflip */#quickbar { border-right: 1px solid gray; }";
-                       $rules[] = "/* @noflip */#article, #mw-data-after-content { margin-right: 152px; margin-left: 4px; }";
-                       $rules[] = "/* @noflip */#topbar, #footer { margin-right: 152px; }";
-               }
-               $style = implode( "\n", $rules );
-               $out->addInlineStyle( $style, 'flip' );
-       }
-
-}
-
-class StandardTemplate extends LegacyTemplate {
-
-       /**
-        * @return string
-        */
-       function doAfterContent() {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-1' );
-
-               $s = "\n</div><br style=\"clear:both\" />\n";
-               $s .= "\n<div id='footer'>";
-               $s .= '<table cellspacing="0"><tr>';
-
-               wfProfileOut( __METHOD__ . '-1' );
-               wfProfileIn( __METHOD__ . '-2' );
-               $l = $this->getSkin()->getLanguage()->alignStart();
-               $s .= "<td class='bottom' style='text-align: $l; vertical-align: top;'>";
-
-               $s .= $this->bottomLinks();
-               $s .= "\n<br />" . $this->getSkin()->getLanguage()->pipeList( array(
-                       $this->getSkin()->mainPageLink(),
-                       $this->getSkin()->aboutLink(),
-                       Linker::specialLink( 'Recentchanges' ),
-                       $this->searchForm() ) )
-                       . '<br /><span id="pagestats">' . $this->pageStats() . '</span>';
-
-               $s .= '</td>';
-               $s .= "</tr></table>\n</div>\n</div>\n";
-
-               wfProfileOut( __METHOD__ . '-2' );
-               wfProfileIn( __METHOD__ . '-3' );
-               if ( $this->getSkin()->qbSetting() != 0 ) {
-                       $s .= $this->quickBar();
-               }
-               wfProfileOut( __METHOD__ . '-3' );
-               wfProfileOut( __METHOD__ );
-               return $s;
-       }
-
-       /**
-        * @return string
-        */
-       function quickBar() {
-               global $wgContLang;
-
-               wfProfileIn( __METHOD__ );
-
-               $action = $this->getSkin()->getRequest()->getText( 'action' );
-               $wpPreview = $this->getSkin()->getRequest()->getBool( 'wpPreview' );
-               $title = $this->getSkin()->getTitle();
-               $tns = $title->getNamespace();
-
-               $s = "\n<div id='quickbar'>";
-               $s .= "\n" . $this->getSkin()->logoText() . "\n<hr class='sep' />";
-
-               $sep = "\n<br />";
-
-               # Use the first heading from the Monobook sidebar as the "browse" section
-               $bar = $this->getSkin()->buildSidebar();
-               unset( $bar['SEARCH'] );
-               unset( $bar['LANGUAGES'] );
-               unset( $bar['TOOLBOX'] );
-
-               $barnumber = 1;
-               foreach ( $bar as $browseLinks ) {
-                       if ( is_array( $browseLinks ) ) {
-                               if ( $barnumber > 1 ) {
-                                       $s .= "\n<hr class='sep' />";
-                               }
-                               foreach ( $browseLinks as $link ) {
-                                       if ( $link['text'] != '-' ) {
-                                               $s .= "<a href=\"{$link['href']}\">" .
-                                                       htmlspecialchars( $link['text'] ) . '</a>' . $sep;
-                                       }
-                               }
-                       }
-                       if ( $barnumber == 1 ) {
-                               // only show watchlist link if logged in
-                               if( $this->data['loggedin'] ) {
-                                       $s.= Linker::specialLink( 'Watchlist' ) ;
-                                       $s .= $sep . Linker::linkKnown(
-                                               SpecialPage::getTitleFor( 'Contributions' ),
-                                               wfMessage( 'mycontris' )->escaped(),
-                                               array(),
-                                               array( 'target' => $this->data['username'] )
-                                       );
-                               }
-                       }
-                       $barnumber = $barnumber + 1;
-               }
-
-               $s .= "\n<hr class='sep' />";
-               $articleExists = $title->getArticleID();
-               if ( $this->data['isarticle'] || $action == 'edit' || $action == 'history' || $wpPreview ) {
-                       if( $this->data['isarticle'] ) {
-                               $s .= '<strong>' . $this->editThisPage() . '</strong>';
-                       } else { # backlink to the article in edit or history mode
-                               if( $articleExists ){ # no backlink if no article
-                                       switch( $tns ) {
-                                               case NS_TALK:
-                                               case NS_USER_TALK:
-                                               case NS_PROJECT_TALK:
-                                               case NS_FILE_TALK:
-                                               case NS_MEDIAWIKI_TALK:
-                                               case NS_TEMPLATE_TALK:
-                                               case NS_HELP_TALK:
-                                               case NS_CATEGORY_TALK:
-                                                       $text = wfMessage('viewtalkpage');
-                                                       break;
-                                               case NS_MAIN:
-                                                       $text = wfMessage( 'articlepage' );
-                                                       break;
-                                               case NS_USER:
-                                                       $text = wfMessage( 'userpage' );
-                                                       break;
-                                               case NS_PROJECT:
-                                                       $text = wfMessage( 'projectpage' );
-                                                       break;
-                                               case NS_FILE:
-                                                       $text = wfMessage( 'imagepage' );
-                                                       break;
-                                               case NS_MEDIAWIKI:
-                                                       $text = wfMessage( 'mediawikipage' );
-                                                       break;
-                                               case NS_TEMPLATE:
-                                                       $text = wfMessage( 'templatepage' );
-                                                       break;
-                                               case NS_HELP:
-                                                       $text = wfMessage( 'viewhelppage' );
-                                                       break;
-                                               case NS_CATEGORY:
-                                                       $text = wfMessage( 'categorypage' );
-                                                       break;
-                                               default:
-                                                       $text = wfMessage( 'articlepage' );
-                                       }
-
-                                       $link = $title->getText();
-                                       $nstext = $wgContLang->getNsText( $tns );
-                                       if( $nstext ) { # add namespace if necessary
-                                               $link = $nstext . ':' . $link;
-                                       }
-
-                                       $s .= Linker::link( Title::newFromText( $link ), $text->escaped() );
-                               } elseif( $title->getNamespace() != NS_SPECIAL ) {
-                                       # we just throw in a "New page" text to tell the user that he's in edit mode,
-                                       # and to avoid messing with the separator that is prepended to the next item
-                                       $s .= '<strong>' . wfMessage( 'newpage' )->escaped() . '</strong>';
-                               }
-                       }
-
-                       # "Post a comment" link
-                       if( ( $title->isTalkPage() || $this->getSkin()->getOutput()->showNewSectionLink() ) && $action != 'edit' && !$wpPreview )
-                               $s .= '<br />' . Linker::link(
-                                       $title,
-                                       wfMessage( 'postcomment' )->escaped(),
-                                       array(),
-                                       array(
-                                               'action' => 'edit',
-                                               'section' => 'new'
-                                       )
-                               );
-
-                       /**
-                        * Watching could cause problems in edit mode:
-                        * if user edits article, then loads "watch this article" in background and then saves
-                        * article with "Watch this article" checkbox disabled, the article is transparently
-                        * unwatched. Therefore we do not show the "Watch this page" link in edit mode.
-                        */
-                       if ( $this->data['loggedin'] && $articleExists ) {
-                               if( $action != 'edit' && $action != 'submit' ) {
-                                       $s .= $sep . $this->watchThisPage();
-                               }
-                               if ( $title->userCan( 'edit' ) )
-                                       $s .= $sep . $this->moveThisPage();
-                       }
-                       if ( $this->getSkin()->getUser()->isAllowed( 'delete' ) && $articleExists ) {
-                               $s .= $sep . $this->deleteThisPage() .
-                               $sep . $this->protectThisPage();
-                       }
-                       $s .= $sep . $this->talkLink();
-                       if( $articleExists && $action != 'history' ) {
-                               $s .= $sep . $this->historyLink();
-                       }
-                       $s .= $sep . $this->whatLinksHere();
-
-                       if( $this->getSkin()->getOutput()->isArticleRelated() ) {
-                               $s .= $sep . $this->watchPageLinksLink();
-                       }
-
-                       if (
-                               NS_USER == $title->getNamespace() ||
-                               $title->getNamespace() == NS_USER_TALK
-                       ) {
-
-                               $id = User::idFromName( $title->getText() );
-                               $ip = User::isIP( $title->getText() );
-
-                               if( $id || $ip ){
-                                       $s .= $sep . $this->userContribsLink();
-                               }
-                               if( $this->getSkin()->showEmailUser( $id ) ) {
-                                       $s .= $sep . $this->emailUserLink();
-                               }
-                       }
-                       $s .= "\n<br /><hr class='sep' />";
-               }
-
-               if( UploadBase::isEnabled() && UploadBase::isAllowed( $this->getSkin()->getUser() ) === true ) {
-                       $s .= $this->getUploadLink() . $sep;
-               }
-
-               $s .= Linker::specialLink( 'Specialpages' );
-
-               global $wgSiteSupportPage;
-               if( $wgSiteSupportPage ) {
-                       $s .= "\n<br /><a href=\"" . htmlspecialchars( $wgSiteSupportPage ) .
-                       '" class="internal">' . wfMessage( 'sitesupport' )->escaped() . '</a>';
-               }
-
-               $s .= "\n<br /></div>\n";
-               wfProfileOut( __METHOD__ );
-               return $s;
-       }
-}
index d0f9995..d0305f0 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Skins
  */
 
-if( !defined( 'MEDIAWIKI' ) ) {
+if ( !defined( 'MEDIAWIKI' ) ) {
        die( -1 );
 }
 
@@ -48,7 +48,7 @@ class SkinVector extends SkinTemplate {
                parent::initPage( $out );
 
                // Append CSS which includes IE only behavior fixes for hover support -
-               // this is better than including this in a CSS fille since it doesn't
+               // this is better than including this in a CSS file since it doesn't
                // wait for the CSS file to load before fetching the HTC file.
                $min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
                $out->addHeadItem( 'csshover',
@@ -61,8 +61,7 @@ class SkinVector extends SkinTemplate {
        }
 
        /**
-        * Load skin and user CSS files in the correct order
-        * fixes bug 22916
+        * Loads skin and user CSS files.
         * @param $out OutputPage object
         */
        function setupSkinUserCss( OutputPage $out ) {
@@ -155,81 +154,52 @@ class VectorTemplate extends BaseTemplate {
 ?>
                <div id="mw-page-base" class="noprint"></div>
                <div id="mw-head-base" class="noprint"></div>
-               <!-- content -->
                <div id="content" class="mw-body" role="main">
                        <a id="top"></a>
                        <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
-                       <?php if ( $this->data['sitenotice'] ): ?>
-                       <!-- sitenotice -->
+                       <?php if ( $this->data['sitenotice'] ) { ?>
                        <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
-                       <!-- /sitenotice -->
-                       <?php endif; ?>
-                       <!-- firstHeading -->
+                       <?php } ?>
                        <h1 id="firstHeading" class="firstHeading" lang="<?php
                                $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
                                $this->html( 'pageLanguage' );
                        ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
-                       <!-- /firstHeading -->
-                       <!-- bodyContent -->
                        <div id="bodyContent">
-                               <?php if ( $this->data['isarticle'] ): ?>
-                               <!-- tagline -->
+                               <?php if ( $this->data['isarticle'] ) { ?>
                                <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-                               <!-- /tagline -->
-                               <?php endif; ?>
-                               <!-- subtitle -->
+                               <?php } ?>
                                <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
-                               <!-- /subtitle -->
-                               <?php if ( $this->data['undelete'] ): ?>
-                               <!-- undelete -->
+                               <?php if ( $this->data['undelete'] ) { ?>
                                <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
-                               <!-- /undelete -->
-                               <?php endif; ?>
-                               <?php if( $this->data['newtalk'] ): ?>
-                               <!-- newtalk -->
-                               <div class="usermessage"><?php $this->html( 'newtalk' )  ?></div>
-                               <!-- /newtalk -->
-                               <?php endif; ?>
-                               <?php if ( $this->data['showjumplinks'] ): ?>
-                               <!-- jumpto -->
+                               <?php } ?>
+                               <?php if ( $this->data['newtalk'] ) { ?>
+                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+                               <?php } ?>
+                               <?php if ( $this->data['showjumplinks'] ) { ?>
                                <div id="jump-to-nav" class="mw-jump">
                                        <?php $this->msg( 'jumpto' ) ?>
                                        <a href="#mw-navigation"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?>
                                        <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
                                </div>
-                               <!-- /jumpto -->
-                               <?php endif; ?>
-                               <!-- bodycontent -->
+                               <?php } ?>
                                <?php $this->html( 'bodycontent' ) ?>
-                               <!-- /bodycontent -->
-                               <?php if ( $this->data['printfooter'] ): ?>
-                               <!-- printfooter -->
+                               <?php if ( $this->data['printfooter'] ) { ?>
                                <div class="printfooter">
                                <?php $this->html( 'printfooter' ); ?>
                                </div>
-                               <!-- /printfooter -->
-                               <?php endif; ?>
-                               <?php if ( $this->data['catlinks'] ): ?>
-                               <!-- catlinks -->
+                               <?php } ?>
+                               <?php if ( $this->data['catlinks'] ) { ?>
                                <?php $this->html( 'catlinks' ); ?>
-                               <!-- /catlinks -->
-                               <?php endif; ?>
-                               <?php if ( $this->data['dataAfterContent'] ): ?>
-                               <!-- dataAfterContent -->
+                               <?php } ?>
+                               <?php if ( $this->data['dataAfterContent'] ) { ?>
                                <?php $this->html( 'dataAfterContent' ); ?>
-                               <!-- /dataAfterContent -->
-                               <?php endif; ?>
+                               <?php } ?>
                                <div class="visualClear"></div>
-                               <!-- debughtml -->
                                <?php $this->html( 'debughtml' ); ?>
-                               <!-- /debughtml -->
                        </div>
-                       <!-- /bodyContent -->
                </div>
-               <!-- /content -->
                <div id="mw-navigation">
                        <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-                       <!-- header -->
                        <div id="mw-head">
                                <?php $this->renderNavigation( 'PERSONAL' ); ?>
                                <div id="left-navigation">
@@ -239,41 +209,34 @@ class VectorTemplate extends BaseTemplate {
                                        <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
                                </div>
                        </div>
-                       <!-- /header -->
-                       <!-- panel -->
                        <div id="mw-panel">
-                               <!-- logo -->
                                        <div id="p-logo" role="banner"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ) ?>></a></div>
-                               <!-- /logo -->
                                <?php $this->renderPortals( $this->data['sidebar'] ); ?>
                        </div>
-                       <!-- /panel -->
                </div>
-               <!-- footer -->
                <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-                       <?php foreach( $this->getFooterLinks() as $category => $links ): ?>
+                       <?php foreach ( $this->getFooterLinks() as $category => $links ) { ?>
                                <ul id="footer-<?php echo $category ?>">
-                                       <?php foreach( $links as $link ): ?>
+                                       <?php foreach ( $links as $link ) { ?>
                                                <li id="footer-<?php echo $category ?>-<?php echo $link ?>"><?php $this->html( $link ) ?></li>
-                                       <?php endforeach; ?>
+                                       <?php } ?>
                                </ul>
-                       <?php endforeach; ?>
-                       <?php $footericons = $this->getFooterIcons("icononly");
-                       if ( count( $footericons ) > 0 ): ?>
+                       <?php } ?>
+                       <?php $footericons = $this->getFooterIcons( "icononly" );
+                       if ( count( $footericons ) > 0 ) { ?>
                                <ul id="footer-icons" class="noprint">
-<?php                  foreach ( $footericons as $blockName => $footerIcons ): ?>
+<?php                  foreach ( $footericons as $blockName => $footerIcons ) { ?>
                                        <li id="footer-<?php echo htmlspecialchars( $blockName ); ?>ico">
-<?php                          foreach ( $footerIcons as $icon ): ?>
+<?php                          foreach ( $footerIcons as $icon ) { ?>
                                                <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
 
-<?php                          endforeach; ?>
+<?php                          } ?>
                                        </li>
-<?php                  endforeach; ?>
+<?php                  } ?>
                                </ul>
-                       <?php endif; ?>
+                       <?php } ?>
                        <div style="clear:both"></div>
                </div>
-               <!-- /footer -->
                <?php $this->printTrail(); ?>
 
        </body>
@@ -299,11 +262,11 @@ class VectorTemplate extends BaseTemplate {
                }
                // Render portals
                foreach ( $portals as $name => $content ) {
-                       if ( $content === false )
+                       if ( $content === false ) {
                                continue;
+                       }
 
-                       echo "\n<!-- {$name} -->\n";
-                       switch( $name ) {
+                       switch ( $name ) {
                                case 'SEARCH':
                                        break;
                                case 'TOOLBOX':
@@ -318,7 +281,6 @@ class VectorTemplate extends BaseTemplate {
                                        $this->renderPortal( $name, $content );
                                break;
                        }
-                       echo "\n<!-- /{$name} -->\n";
                }
        }
 
@@ -332,29 +294,30 @@ class VectorTemplate extends BaseTemplate {
                if ( $msg === null ) {
                        $msg = $name;
                }
+               $msgObj = wfMessage( $msg );
                ?>
 <div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?>>
-       <h3<?php $this->html( 'userlangattributes' ) ?>><?php $msgObj = wfMessage( $msg ); echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
+       <h3<?php $this->html( 'userlangattributes' ) ?>><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
        <div class="body">
 <?php
-               if ( is_array( $content ) ): ?>
+               if ( is_array( $content ) ) { ?>
                <ul>
 <?php
-                       foreach( $content as $key => $val ): ?>
+                       foreach ( $content as $key => $val ) { ?>
                        <?php echo $this->makeListItem( $key, $val ); ?>
 
 <?php
-                       endforeach;
+                       }
                        if ( $hook !== null ) {
                                wfRunHooks( $hook, array( &$this, true ) );
                        }
                        ?>
                </ul>
 <?php
-               else: ?>
+               } else { ?>
                <?php echo $content; /* Allow raw HTML block to be defined by extensions */ ?>
 <?php
-               endif; ?>
+               } ?>
        </div>
 </div>
 <?php
@@ -379,36 +342,35 @@ class VectorTemplate extends BaseTemplate {
                }
                // Render elements
                foreach ( $elements as $name => $element ) {
-                       echo "\n<!-- {$name} -->\n";
                        switch ( $element ) {
                                case 'NAMESPACES':
 ?>
-<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
        <h3><?php $this->msg( 'namespaces' ) ?></h3>
        <ul<?php $this->html( 'userlangattributes' ) ?>>
-               <?php foreach ( $this->data['namespace_urls'] as $link ): ?>
+               <?php foreach ( $this->data['namespace_urls'] as $link ) { ?>
                        <li <?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></span></li>
-               <?php endforeach; ?>
+               <?php } ?>
        </ul>
 </div>
 <?php
                                break;
                                case 'VARIANTS':
 ?>
-<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
        <h3 id="mw-vector-current-variant">
-       <?php foreach ( $this->data['variant_urls'] as $link ): ?>
-               <?php if ( stripos( $link['attributes'], 'selected' ) !== false ): ?>
+       <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
+               <?php if ( stripos( $link['attributes'], 'selected' ) !== false ) { ?>
                        <?php echo htmlspecialchars( $link['text'] ) ?>
-               <?php endif; ?>
-       <?php endforeach; ?>
+               <?php } ?>
+       <?php } ?>
        </h3>
        <h3><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
        <div class="menu">
                <ul>
-                       <?php foreach ( $this->data['variant_urls'] as $link ): ?>
+                       <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
                                <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" lang="<?php echo htmlspecialchars( $link['lang'] ) ?>" hreflang="<?php echo htmlspecialchars( $link['hreflang'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
-                       <?php endforeach; ?>
+                       <?php } ?>
                </ul>
        </div>
 </div>
@@ -417,29 +379,29 @@ class VectorTemplate extends BaseTemplate {
                                case 'VIEWS':
 ?>
 <div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
-       <h3><?php $this->msg('views') ?></h3>
-       <ul<?php $this->html('userlangattributes') ?>>
-               <?php foreach ( $this->data['view_urls'] as $link ): ?>
+       <h3><?php $this->msg( 'views' ) ?></h3>
+       <ul<?php $this->html( 'userlangattributes' ) ?>>
+               <?php foreach ( $this->data['view_urls'] as $link ) { ?>
                        <li<?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php
                                // $link['text'] can be undefined - bug 27764
                                if ( array_key_exists( 'text', $link ) ) {
-                                       echo array_key_exists( 'img', $link ) ?  '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] );
+                                       echo array_key_exists( 'img', $link ) ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] );
                                }
                                ?></a></span></li>
-               <?php endforeach; ?>
+               <?php } ?>
        </ul>
 </div>
 <?php
                                break;
                                case 'ACTIONS':
 ?>
-<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
        <h3><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
        <div class="menu">
                <ul<?php $this->html( 'userlangattributes' ) ?>>
-                       <?php foreach ( $this->data['action_urls'] as $link ): ?>
+                       <?php foreach ( $this->data['action_urls'] as $link ) { ?>
                                <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
-                       <?php endforeach; ?>
+                       <?php } ?>
                </ul>
        </div>
 </div>
@@ -447,7 +409,7 @@ class VectorTemplate extends BaseTemplate {
                                break;
                                case 'PERSONAL':
 ?>
-<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
        <h3><?php $this->msg( 'personaltools' ) ?></h3>
        <ul<?php $this->html( 'userlangattributes' ) ?>>
 <?php
@@ -465,21 +427,21 @@ class VectorTemplate extends BaseTemplate {
 <div id="p-search" role="search">
        <h3<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
        <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-               <?php if ( $wgVectorUseSimpleSearch && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ): ?>
+               <?php if ( $wgVectorUseSimpleSearch && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ) { ?>
                <div id="simpleSearch">
-                       <?php if ( $this->data['rtl'] ): ?>
+                       <?php if ( $this->data['rtl'] ) { ?>
                        <?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-rtl.png' ), 'width' => '12', 'height' => '13' ) ); ?>
-                       <?php endif; ?>
+                       <?php } ?>
                        <?php echo $this->makeSearchInput( array( 'id' => 'searchInput', 'type' => 'text' ) ); ?>
-                       <?php if ( !$this->data['rtl'] ): ?>
+                       <?php if ( !$this->data['rtl'] ) { ?>
                        <?php echo $this->makeSearchButton( 'image', array( 'id' => 'searchButton', 'src' => $this->getSkin()->getSkinStylePath( 'images/search-ltr.png' ), 'width' => '12', 'height' => '13' ) ); ?>
-                       <?php endif; ?>
-               <?php else: ?>
+                       <?php } ?>
+               <?php } else { ?>
                <div>
                        <?php echo $this->makeSearchInput( array( 'id' => 'searchInput' ) ); ?>
                        <?php echo $this->makeSearchButton( 'go', array( 'id' => 'searchGoButton', 'class' => 'searchButton' ) ); ?>
                        <?php echo $this->makeSearchButton( 'fulltext', array( 'id' => 'mw-searchButton', 'class' => 'searchButton' ) ); ?>
-               <?php endif; ?>
+               <?php } ?>
                        <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
                </div>
        </form>
@@ -488,7 +450,6 @@ class VectorTemplate extends BaseTemplate {
 
                                break;
                        }
-                       echo "\n<!-- /{$name} -->\n";
                }
        }
 }
diff --git a/skins/chick/IE60Fixes.css b/skins/chick/IE60Fixes.css
deleted file mode 100644 (file)
index 18e9655..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* 6.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-#column-content {
-    float: none;
-    margin-left: 0;
-    height: 1%;
-}
-#column-content #content {
-    margin-left: 12.2em;
-    margin-top: 3em;
-    height: 1%;
-}
-#column-one {
-    position: absolute;
-    top: 0;
-    left: 0;
-    z-index: 4;
-}
-#footer {
-    margin-left: 13.6em;
-    border-left: 1px solid #fabd23;
-}
-
-/* the tabs */
-
-#p-cactions {
-    z-index: 3;
-}
-
-#p-cactions li {
-    padding-bottom: 0 !important;
-    border: none;
-    background-color: transparent;
-    cursor: default;
-    float: none !important;
-}
-#p-cactions li a {
-    display: inline-block !important;
-    vertical-align: top;
-    padding-bottom: 0;
-    border: solid #aaa;
-    border-width: 1px 1px 0;
-}
-#p-cactions li.selected a {
-    border-color: #fabd23;
-    padding-bottom: 0.17em;
-}
-#p-cactions li a:hover {
-    padding-bottom: 0.17em;
-}
-#portal-personaltools {
-    padding-bottom: 0.1em;
-}
-#bodyContent a.external {
-    background: url(external.png) center right no-repeat;
-    padding-right: 13px;
-}
-
-/* show the hand */
-#p-logo a,
-#p-logo a:hover {
-    cursor: pointer;
-}
-div.visualClear {
-    width:100%;
-    line-height: 0;
-}
-textarea {
-    width: 96%;
-}
-
-div.editsection,
-#catlinks,
-div.tright,
-div.tleft {
-    position: relative;
-}
-/*{ border:1px solid Red !important;}*/
diff --git a/skins/chick/main.css b/skins/chick/main.css
deleted file mode 100644 (file)
index 5e2a2e7..0000000
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
-** MediaWiki 'chick' style sheet for PDAs or other small-screen devices.
-** Copyright Timwi
-** License: GPL (http://www.gnu.org/copyleft/gpl.html)
-**
-** Loosely based on Monobook by Gabriel Wicke
-*/
-
-body {
-       font-family: sans-serif;
-       color: black;
-       background: white;
-       margin: 0;
-       padding: 0.3em;
-}
-
-a { color: #002bb8; }
-a:visited { color: #5a3696; }
-a:active { color: #ffa500; }
-a.stub { color: #772233; }
-a.new,
-#p-personal a.new { color:#ba0000; }
-a.new:visited,
-#p-personal a.new:visited { color:#a55858; }
-
-img {
-       border: none;
-       vertical-align: middle;
-}
-p {
-       margin: 0.4em 0em 0.5em 0em;
-       line-height: 1.5em;
-}
-
-p img { margin: 0; }
-
-hr {
-       height: 1px;
-       color: #aaaaaa;
-       background-color: #aaaaaa;
-       border: 0;
-       margin: 0.2em 0 0.2em 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
-       color: black;
-       background: none;
-       font-weight: normal;
-       margin: 0;
-       overflow: hidden;
-       padding-top: 0.5em;
-       padding-bottom: 0.17em;
-       border-bottom: 1px solid #aaaaaa;
-}
-.editsection {
-       font-weight: normal;
-}
-h1 { font-size: 188%; }
-h1 .editsection { font-size: 53.2%; }
-h2 { font-size: 150%; }
-h2 .editsection { font-size: 66.7%; }
-h3, h4, h5, h6 {
-       border-bottom: none;
-       font-weight: bold;
-}
-h3 { font-size: 132%; }
-h3 .editsection { font-size: 75.8%; }
-h4 { font-size: 116%; }
-h4 .editsection { font-size: 86.2%; }
-h5 { font-size: 100%; }
-h6 { font-size: 80%;  }
-h6 .editsection { font-size: 125%; }
-
-ul {
-       line-height: 1.5em;
-       margin: 0.3em 0 0 1.5em;
-       padding:0;
-}
-ol {
-       line-height: 1.5em;
-       margin: 0.3em 0 0 3.2em;
-       padding:0;
-       list-style-image: none;
-}
-li { margin-bottom: 0.1em; }
-dt {
-       font-weight: bold;
-       margin-bottom: 0.1em;
-}
-dl{
-       margin-top: 0.2em;
-       margin-bottom: 0.5em;
-}
-dd {
-       line-height: 1.5em;
-       margin-left: 2em;
-       margin-bottom: 0.1em;
-}
-
-fieldset {
-       border: 1px solid #2f6fab;
-       margin: 1em 0em 1em 0em;
-       padding: 0em 1em 1em 1em;
-       line-height: 1.5em;
-}
-legend {
-       background: white;
-       padding: 0.5em;
-       font-size: 95%;
-}
-form {
-       border: none;
-       margin: 0;
-}
-
-textarea {
-       border: 1px solid #2f6fab;
-       color: black;
-       background-color: white;
-       width: 100%;
-       padding: 0.1em;
-       overflow: auto;
-}
-/* hide this from ie/mac and konq2.2 */
-@media All {
-       head:first-child+body input {
-               visibility: visible;
-               border: 1px solid #2f6fab;
-               color: black;
-               background-color: white;
-               vertical-align: middle;
-               padding: 0.2em;
-       }
-}
-input.historysubmit {
-       padding: 0 0.3em 0.3em 0.3em !important;
-       font-size: 94%;
-       cursor: pointer;
-       height: 1.7em !important;
-       margin-left: 1.6em;
-}
-input[type="radio"],
-input[type="checkbox"] { border:none; }
-select {
-       border: 1px solid #2f6fab;
-       color: black;
-       vertical-align: top;
-}
-q {
-       font-family: Times, "Times New Roman", serif;
-       font-style: italic;
-}
-code { background-color: #f9f9f9; }
-pre, .mw-code {
-       padding: 1em;
-       border: 1px dashed #2f6fab;
-       color: black;
-       background-color: #f9f9f9;
-       line-height: 1.1em;
-}
-
-/*
-** the main content area
-*/
-
-span.subpages { display: block; }
-
-/* Some space under the headers in the content area */
-#bodyContent h1, #bodyContent h2 { margin-bottom:0.6em; }
-#bodyContent h3,
-#bodyContent h4,
-#bodyContent h5 {
-       margin-bottom: 0.3em;
-}
-#firstHeading { margin-bottom:0.1em; }
-
-/* user notification thing */
-.usermessage {
-       background-color: #ffce7b;
-       border: 1px solid #ffa500;
-       color: black;
-       font-weight: bold;
-       margin: 0.1em 0 0 0;
-       padding: 2px 5px;
-       vertical-align: middle;
-}
-#siteNotice {
-       text-align: center;
-       font-size: 95%;
-       padding: 0 0.9em 0 0.9em;
-}
-#siteNotice p { margin: 0; padding: 0; }
-.error {
-       color: red;
-       font-size: larger;
-}
-.catlinks {
-       border:1px solid #aaaaaa;
-       background-color:#f9f9f9;
-       padding: 2px 5px;
-       margin: 0.1em 0 0 0;
-       clear: both;
-}
-.catlinks { margin: 0; padding: 0; }
-
-/* emulate center */
-.center {
-       width: 100%;
-       text-align: center;
-}
-*.center * {
-       margin-left: auto;
-       margin-right: auto;
-}
-/* small for tables and similar */
-.small { font-size: 94%; }
-table.small { font-size: 100% }
-
-/*
-** content styles
-*/
-
-#toc {
-       /*border:1px solid #2f6fab;*/
-       border:1px solid #aaaaaa;
-       background-color:#f9f9f9;
-       padding:5px;
-       font-size: 95%;
-}
-#toc ul { margin: 0 2em; }
-#toc .toctoggle { font-size: 94%; }
-#toc .editsection {
-       margin-top: 0.7em;
-       font-size: 94%;
-}
-
-/* images */
-/* @noflip */div.floatright, table.floatright {
-       margin: 0;
-       border: 0.5em solid white;
-       border-width: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p { font-style: italic; }
-/* @noflip */div.floatleft, table.floatleft {
-       margin: 0.3em 0.5em 0.5em 0;
-       border: 0.5em solid white;
-       border-width: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p { font-style: italic; }
-/* thumbnails */
-div.thumb {
-       margin-bottom: 0.5em;
-       width: auto;
-}
-div.thumbinner {
-       border:1px solid #cccccc;
-       padding: 3px !important;
-       background-color:#f9f9f9;
-       font-size: 94%;
-       text-align: center;
-       overflow: hidden;
-}
-html .thumbimage {
-       border:1px solid #cccccc;
-}
-html .thumbcaption {
-       border: none;
-       text-align: left;
-       line-height: 1.4em;
-       padding: 0.3em 0 0.1em 0;
-}
-div.magnify {
-       float: right;
-       border: none !important;
-       background: none !important;
-}
-div.magnify a, div.magnify img {
-       display: block;
-       border: none !important;
-       background: none !important;
-}
-/* @noflip */div.tright {
-       margin: 0.5em 0 1.3em 1.4em;
-}
-/* @noflip */div.tleft {
-       margin: 0.5em 1.4em 1.3em 0;
-}
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-/*
-** classes for special content elements like town boxes
-** intended to be referenced directly from the wiki src
-*/
-
-/*
-** User styles
-*/
-/* table standards */
-table.rimage {
-       float:right;
-       position:relative;
-       margin-left:1em;
-       margin-bottom:1em;
-       text-align:center;
-}
-.toccolours {
-       border:1px solid #aaaaaa;
-       background-color:#f9f9f9;
-       padding:5px;
-       font-size: 95%;
-}
-
-/*
-** edit views etc
-*/
-.special li {
-       line-height: 1.4em;
-       margin: 0;
-       padding: 0;
-}
-
-a.external { color: #3366bb; }
-div#footer { text-align: center; }
-ul#f-list li { list-style: none;  text-align: center; }
-div.portlet { margin: 0.5em 0; }
-
-.redirectText {
-       font-size:150%;
-       margin:5px;
-}
-
-ul.special li.not-patrolled, ol.special li.not-patrolled {
-       background-color: #ffa;
-}
-div.patrollink {
-       font-size: 75%;
-       text-align: right;
-}
-
-span.updatedmarker {
-       color:black;
-       background-color:#00FF00;
-}
-
-div.gallerybox {
-       width:  150px;
-}
-
-#xjump-to-nav {
-       display: none;
-}
-
-.templatesUsed { margin-top: 1.5em; }
-
-#footer {
-       background-color: white;
-       border-top: 1px solid #fabd23;
-       border-bottom: 1px solid #fabd23;
-       margin: .6em 0 1em 0;
-       padding: .4em 0 1.2em 0;
-       text-align: center;
-       font-size: 90%;
-}
-#f-poweredbyico, #f-copyrightico {
-       display: inline;
-}
diff --git a/skins/cologneblue/print.css b/skins/cologneblue/print.css
new file mode 100644 (file)
index 0000000..d4b0551
--- /dev/null
@@ -0,0 +1,6 @@
+#sitetitle,
+#sitesub,
+#titlelinks,
+#footer-navigation {
+       display: none;
+}
index 121f9d1..ca74b38 100644 (file)
@@ -1,15 +1,23 @@
-// remote scripting library
-// (c) copyright 2005 modernmethod, inc
-window.sajax_debug_mode = false;
-window.sajax_request_type = 'GET';
+/**
+ * Remote Scripting Library
+ * Copyright 2005 modernmethod, inc
+ * Under the open source BSD license
+ * http://www.modernmethod.com/sajax/
+ */
+
+/*jshint camelcase:false, onevar:false */
+/*global alert */
+( function ( mw ) {
 
 /**
- * if sajax_debug_mode is true, this function outputs given the message into 
- * the element with id = sajax_debug; if no such element exists in the document, 
+ * if sajax_debug_mode is true, this function outputs given the message into
+ * the element with id = sajax_debug; if no such element exists in the document,
  * it is injected.
  */
-window.sajax_debug = function(text) {
-       if (!sajax_debug_mode) return false;
+function debug( text ) {
+       if ( !window.sajax_debug_mode ) {
+               return false;
+       }
 
        var e = document.getElementById( 'sajax_debug' );
 
@@ -33,36 +41,36 @@ window.sajax_debug = function(text) {
        e.appendChild( m );
 
        return true;
-};
+}
 
 /**
  * Compatibility wrapper for creating a new XMLHttpRequest object.
  */
-window.sajax_init_object = function() {
-       sajax_debug( 'sajax_init_object() called..' );
-       var A;
+function createXhr() {
+       debug( 'sajax_init_object() called..' );
+       var a;
        try {
                // Try the new style before ActiveX so we don't
                // unnecessarily trigger warnings in IE 7 when
                // set to prompt about ActiveX usage
-               A = new XMLHttpRequest();
-       } catch ( e ) {
+               a = new XMLHttpRequest();
+       } catch ( xhrE ) {
                try {
-                       A = new ActiveXObject( 'Msxml2.XMLHTTP' );
-               } catch ( e ) {
+                       a = new window.ActiveXObject( 'Msxml2.XMLHTTP' );
+               } catch ( msXmlE ) {
                        try {
-                               A = new ActiveXObject( 'Microsoft.XMLHTTP' );
-                       } catch ( oc ) {
-                               A = null;
+                               a = new window.ActiveXObject( 'Microsoft.XMLHTTP' );
+                       } catch ( msXhrE ) {
+                               a = null;
                        }
                }
        }
-       if ( !A ) {
-               sajax_debug( 'Could not create connection object.' );
+       if ( !a ) {
+               debug( 'Could not create connection object.' );
        }
 
-       return A;
-};
+       return a;
+}
 
 /**
  * Perform an AJAX call to MediaWiki. Calls are handled by AjaxDispatcher.php
@@ -80,13 +88,13 @@ window.sajax_init_object = function() {
  * (1, 2, 3) as the parameter list, and will show the result in the element
  * with id = showFoo
  */
-window.sajax_do_call = function(func_name, args, target) {
-       var i, x, n;
+function doAjaxRequest( func_name, args, target ) {
+       var i, x;
        var uri;
        var post_data;
        uri = mw.util.wikiScript() + '?action=ajax';
-       if ( sajax_request_type == 'GET' ) {
-               if ( uri.indexOf( '?' ) == -1 ) {
+       if ( window.sajax_request_type === 'GET' ) {
+               if ( uri.indexOf( '?' ) === -1 ) {
                        uri = uri + '?rs=' + encodeURIComponent( func_name );
                } else {
                        uri = uri + '&rs=' + encodeURIComponent( func_name );
@@ -102,47 +110,47 @@ window.sajax_do_call = function(func_name, args, target) {
                        post_data = post_data + '&rsargs[]=' + encodeURIComponent( args[i] );
                }
        }
-       x = sajax_init_object();
+       x = createXhr();
        if ( !x ) {
                alert( 'AJAX not supported' );
                return false;
        }
 
        try {
-               x.open( sajax_request_type, uri, true );
+               x.open( window.sajax_request_type, uri, true );
        } catch ( e ) {
-               if ( window.location.hostname == 'localhost' ) {
-                       alert( "Your browser blocks XMLHttpRequest to 'localhost', try using a real hostname for development/testing." );
+               if ( location.hostname === 'localhost' ) {
+                       alert( 'Your browser blocks XMLHttpRequest to "localhost", try using a real hostname for development/testing.' );
                }
                throw e;
        }
-       if ( sajax_request_type == 'POST' ) {
+       if ( window.sajax_request_type === 'POST' ) {
                x.setRequestHeader( 'Method', 'POST ' + uri + ' HTTP/1.1' );
                x.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
        }
        x.setRequestHeader( 'Pragma', 'cache=yes' );
        x.setRequestHeader( 'Cache-Control', 'no-transform' );
-       x.onreadystatechange = function() {
-               if ( x.readyState != 4 ) {
+       x.onreadystatechange = function () {
+               if ( x.readyState !== 4 ) {
                        return;
                }
 
-               sajax_debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
+               debug( 'received (' + x.status + ' ' + x.statusText + ') ' + x.responseText );
 
                //if ( x.status != 200 )
                //      alert( 'Error: ' + x.status + ' ' + x.statusText + ': ' + x.responseText );
                //else
 
-               if ( typeof( target ) == 'function' ) {
+               if ( typeof target === 'function' ) {
                        target( x );
-               } else if ( typeof( target ) == 'object' ) {
-                       if ( target.tagName == 'INPUT' ) {
-                               if ( x.status == 200 ) {
+               } else if ( typeof target === 'object' ) {
+                       if ( target.tagName === 'INPUT' ) {
+                               if ( x.status === 200 ) {
                                        target.value= x.responseText;
                                }
                                //else alert( 'Error: ' + x.status + ' ' + x.statusText + ' (' + x.responseText + ')' );
                        } else {
-                               if ( x.status == 200 ) {
+                               if ( x.status === 200 ) {
                                        target.innerHTML = x.responseText;
                                } else {
                                        target.innerHTML = '<div class="error">Error: ' + x.status +
@@ -150,24 +158,37 @@ window.sajax_do_call = function(func_name, args, target) {
                                }
                        }
                } else {
-                       alert( 'bad target for sajax_do_call: not a function or object: ' + target );
+                       alert( 'Bad target for sajax_do_call: not a function or object: ' + target );
                }
        };
 
-       sajax_debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
+       debug( func_name + ' uri = ' + uri + ' / post = ' + post_data );
        x.send( post_data );
-       sajax_debug( func_name + ' waiting..' );
-       delete x;
+       debug( func_name + ' waiting..' );
 
        return true;
-};
+}
 
 /**
- * @return boolean whether the browser supports XMLHttpRequest
+ * @return {boolean} Whether the browser supports AJAX
  */
-window.wfSupportsAjax = function() {
-       var request = sajax_init_object();
+function wfSupportsAjax() {
+       var request = createXhr();
        var supportsAjax = request ? true : false;
-       delete request;
+       request = undefined;
        return supportsAjax;
-};
+}
+
+// Expose + Mark as deprecated
+var deprecationNotice = 'Sajax is deprecated, use jQuery.ajax or mediawiki.api instead.';
+
+// Variables
+mw.log.deprecate( window, 'sajax_debug_mode', false, deprecationNotice );
+mw.log.deprecate( window, 'sajax_request_type', 'GET', deprecationNotice );
+// Methods
+mw.log.deprecate( window, 'sajax_debug', debug, deprecationNotice );
+mw.log.deprecate( window, 'sajax_init_object', createXhr, deprecationNotice );
+mw.log.deprecate( window, 'sajax_do_call', doAjaxRequest, deprecationNotice );
+mw.log.deprecate( window, 'wfSupportsAjax', wfSupportsAjax, deprecationNotice );
+
+}( mediaWiki ) );
index 2fa0cba..a1e809d 100644 (file)
@@ -116,13 +116,13 @@ h4 .editsection {
        font-size: 86%;
        font-weight: normal; }
 h5 {
-       font-size: 100%;
+       font-size: 105%;
 }
 h5 .editsection {
        font-weight: normal;
 }
 h6 {
-       font-size: 80%;
+       font-size: 100%;
 }
 h6 .editsection {
        font-size: 125%;
index 6cb213f..9ea89d9 100644 (file)
@@ -111,6 +111,7 @@ div#jump-to-nav,
 div.top,
 div#column-one,
 #colophon,
+.mw-editsection,
 .editsection,
 .toctoggle,
 .tochidden,
@@ -191,7 +192,7 @@ a:link, a:visited {
 #content a.external.text:after,
 #content a.external.autonumber:after {
        /* Expand URLs for printing */
-       content: " (" attr(href) ") ";
+       content: " (" attr(href) ")";
 }
 
 #globalWrapper {
@@ -352,7 +353,7 @@ a.sortheader {
 .wikitable, .thumb, img {
        page-break-inside: avoid;
 }
-h2, h3, h4, h5, h6, h7 {
+h2, h3, h4, h5, h6 {
        page-break-after: avoid;
 }
 p {
diff --git a/skins/common/images/question-small.png b/skins/common/images/question-small.png
new file mode 100644 (file)
index 0000000..590f0cb
Binary files /dev/null and b/skins/common/images/question-small.png differ
diff --git a/skins/common/images/question.svg b/skins/common/images/question.svg
new file mode 100644 (file)
index 0000000..2797305
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="21.059px" height="21.06px" viewBox="0 0 21.059 21.06" enable-background="new 0 0 21.059 21.06" xml:space="preserve">\r
+<path fill="#575757" d="M10.529,0C4.715,0,0,4.714,0,10.529s4.715,10.53,10.529,10.53c5.816,0,10.529-4.715,10.529-10.53\r
+       S16.346,0,10.529,0z M10.527,16.767c-0.861,0-1.498-0.688-1.498-1.516c0-0.862,0.637-1.534,1.498-1.534c0.828,0,1.5,0.672,1.5,1.534\r
+       C12.027,16.078,11.355,16.767,10.527,16.767z M12.664,10.255c-0.723,0.568-1,0.931-1,1.739v0.5H9.459v-0.603\r
+       c0-1.517,0.449-2.136,1.154-2.688c0.707-0.552,1.139-0.845,1.139-1.637c0-0.672-0.414-1.051-1.24-1.051\r
+       c-0.707,0-1.328,0.189-1.982,0.638L7.479,5.346c0.861-0.604,1.93-1.034,3.342-1.034c1.912,0,3.516,1.051,3.516,3.066\r
+       C14.336,8.808,13.543,9.566,12.664,10.255z"/>\r
+</svg>\r
index 6dcdf6f..fa86aee 100644 (file)
@@ -11,8 +11,9 @@
 h1 { font-size: 2em; }
 h2 { font-size: 1.5em; }
 h3 { font-size: 1.17em; }
-h5 { font-size: .83em; }
-h6 { font-size: .75em; }
+h4 { font-size: 1.11em; }
+h5 { font-size: 1.05em; }
+h6 { font-size: 1em; }
 h1, h2, h3, h4, h5, h6 {
        font-weight: bolder;
 }
@@ -161,9 +162,6 @@ img { border: none; }
 }
 
 /* preference page with js-genrated toc */
-#mw-pref-clear {
-       clear: both;
-}
 #preftoc {
        float: left;
        margin: 1em 1em 1em 1em;
@@ -283,7 +281,7 @@ li span.deleted {
        font-style: italic;
 }
 
-/* Classes for EXIF data display */
+/* Classes for Exif data display */
 table.mw_metadata {
        margin-left: 0.5em;
 }
@@ -458,4 +456,4 @@ html > body.rtl div#bodyContent ul#filetoc {
        display: block;
 }
 
-/* RTL specific CSS ends here **/
\ No newline at end of file
+/* RTL specific CSS ends here **/
index 6e1c94f..d946ce2 100644 (file)
@@ -235,6 +235,32 @@ td.mw-label {
 .prefsection table.mw-htmlform-matrix {
        width: auto;
 }
+
+.mw-icon-question {
+       /* @embed */
+       background: url('images/question-small.png') no-repeat;
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG)
+        * lifted from #pt-login css rule in skins/vector/screen.css */
+       /* @embed */
+       background: -webkit-linear-gradient(transparent, transparent), url('images/question.svg') no-repeat;
+       /* @embed */
+       background: linear-gradient(transparent, transparent), url('images/question.svg') 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;
 }
@@ -543,9 +569,12 @@ table.collapsed tr.collapsable {
        font-size: larger;
        border: 2px solid;
        padding: .5em 1em;
-       float: left;
        margin-bottom: 2em;
        color: #000;
+       display: -moz-inline-block;
+       display: inline-block;
+       zoom: 1;
+       *display: inline;
 }
 .errorbox {
        border-color: red;
@@ -684,7 +713,7 @@ ul#filetoc {
        padding-right: 2em;
 }
 
-/* Classes for EXIF data display */
+/* Classes for Exif data display */
 table.mw_metadata {
        font-size: 0.8em;
        margin-left: 0.5em;
@@ -1092,9 +1121,36 @@ table.floatleft {
        z-index: 99;
 }
 
-.editsection, .toctoggle {
+.mw-editsection, .editsection, .toctoggle {
        -moz-user-select: none;
        -webkit-user-select: none;
        -ms-user-select: none;
        user-select: none;
 }
+
+/* Display editsection links smaller and next to headings */
+.mw-editsection {
+       font-size: small;
+       font-weight: normal;
+       margin-left: 1em;
+       vertical-align: baseline;
+       /* Reset line-height; headings tend to have it set to larger values */
+       line-height: 1em;
+       /* As .mw-editsection is a <span> (inline element), it is treated as part */
+       /* of the heading content when selecting text by multiple clicks and thus */
+       /* selected together with heading content, despite the user-select: none; */
+       /* rule set above. This enforces non-selection without changing the look. */
+       display: inline-block;
+}
+
+/* Correct directionality when page dir is different from site/user dir */
+/* @noflip */
+.mw-content-ltr .mw-editsection,
+.mw-content-rtl .mw-content-ltr .mw-editsection {
+       margin-left: 1em;
+}
+/* @noflip */
+.mw-content-rtl .mw-editsection,
+.mw-content-ltr .mw-content-rtl .mw-editsection {
+       margin-right: 1em;
+}
index c2c00db..8c01ba3 100644 (file)
@@ -1,67 +1,61 @@
 /**
  * MediaWiki legacy wikibits
  */
-( function ( mw ) {
-
-window.clientPC = navigator.userAgent.toLowerCase(); // Get client info
-window.is_gecko = /gecko/.test( clientPC ) &&
-       !/khtml|spoofer|netscape\/7\.0/.test(clientPC);
-
-window.is_safari = window.is_safari_win = window.webkit_version =
-       window.is_chrome = window.is_chrome_mac = false;
-window.webkit_match = clientPC.match(/applewebkit\/(\d+)/);
-if (webkit_match) {
-       window.is_safari = clientPC.indexOf('applewebkit') != -1 &&
-               clientPC.indexOf('spoofer') == -1;
-       window.is_safari_win = is_safari && clientPC.indexOf('windows') != -1;
-       window.webkit_version = parseInt(webkit_match[1]);
-       // Tests for chrome here, to avoid breaking old scripts safari left alone
-       // This is here for accesskeys
-       window.is_chrome = clientPC.indexOf('chrome') !== -1 &&
-               clientPC.indexOf('spoofer') === -1;
-       window.is_chrome_mac = is_chrome && clientPC.indexOf('mac') !== -1
-}
+/*jshint quotmark:false, onevar:false */
+( function ( mw, $ ) {
+       var isIE6, isGecko,
+               ua = navigator.userAgent.toLowerCase(),
+               uaMsg = 'Use feature detection or module jquery.client instead.';
 
-// For accesskeys; note that FF3+ is included here!
-window.is_ff2 = /firefox\/[2-9]|minefield\/3/.test( clientPC );
-window.ff2_bugs = /firefox\/2/.test( clientPC );
-// These aren't used here, but some custom scripts rely on them
-window.is_ff2_win = is_ff2 && clientPC.indexOf('windows') != -1;
-window.is_ff2_x11 = is_ff2 && clientPC.indexOf('x11') != -1;
-
-window.is_opera = window.is_opera_preseven = window.is_opera_95 =
-       window.opera6_bugs = window.opera7_bugs = window.opera95_bugs = false;
-if (clientPC.indexOf('opera') != -1) {
-       window.is_opera = true;
-       window.is_opera_preseven = window.opera && !document.childNodes;
-       window.is_opera_seven = window.opera && document.childNodes;
-       window.is_opera_95 = /opera\/(9\.[5-9]|[1-9][0-9])/.test( clientPC );
-       window.opera6_bugs = is_opera_preseven;
-       window.opera7_bugs = is_opera_seven && !is_opera_95;
-       window.opera95_bugs = /opera\/(9\.5)/.test( clientPC );
-}
-// As recommended by <http://msdn.microsoft.com/en-us/library/ms537509.aspx>,
-// avoiding false positives from moronic extensions that append to the IE UA
-// string (bug 23171)
-window.ie6_bugs = false;
-if ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( clientPC ) != null
-&& parseFloat( RegExp.$1 ) <= 6.0 ) {
-       ie6_bugs = true;
+/**
+ * User-agent sniffing.
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.17 Use jquery.client instead.
+ */
+mw.log.deprecate( window, 'clientPC', ua, uaMsg );
+$.each([
+               'is_gecko',
+               'is_chrome_mac',
+               'is_chrome',
+               'webkit_version',
+               'is_safari_win',
+               'is_safari',
+               'webkit_match',
+               'is_ff2',
+               'ff2_bugs',
+               'is_ff2_win',
+               'is_ff2_x11',
+               'opera95_bugs',
+               'opera7_bugs',
+               'opera6_bugs',
+               'is_opera_95',
+               'is_opera_preseven',
+               'is_opera',
+               'ie6_bugs'
+       ],
+       function ( i, key ) {
+               mw.log.deprecate( window, key, false, uaMsg );
+       }
+);
+if ( /msie ([0-9]{1,}[\.0-9]{0,})/.exec( ua ) && parseFloat( RegExp.$1 ) <= 6.0 ) {
+       isIE6 = true;
 }
+isGecko = /gecko/.test( ua ) && !/khtml|spoofer|netscape\/7\.0/.test( ua );
 
 // add any onload functions in this hook (please don't hard-code any events in the xhtml source)
 window.doneOnloadHook = undefined;
 
-if (!window.onloadFuncts) {
+if ( !window.onloadFuncts ) {
        window.onloadFuncts = [];
 }
 
 window.addOnloadHook = function( hookFunct ) {
        // Allows add-on scripts to add onload functions
-       if( !doneOnloadHook ) {
-               onloadFuncts[onloadFuncts.length] = hookFunct;
+       if( !window.doneOnloadHook ) {
+               window.onloadFuncts[window.onloadFuncts.length] = hookFunct;
        } else {
-               hookFunct();  // bug in MSIE script loading
+               hookFunct(); // bug in MSIE script loading
        }
 };
 
@@ -69,15 +63,15 @@ window.importScript = function( page ) {
        var uri = mw.config.get( 'wgScript' ) + '?title=' +
                mw.util.wikiUrlencode( page ) +
                '&action=raw&ctype=text/javascript';
-       return importScriptURI( uri );
+       return window.importScriptURI( uri );
 };
 
 window.loadedScripts = {}; // included-scripts tracker
 window.importScriptURI = function( url ) {
-       if ( loadedScripts[url] ) {
+       if ( window.loadedScripts[url] ) {
                return null;
        }
-       loadedScripts[url] = true;
+       window.loadedScripts[url] = true;
        var s = document.createElement( 'script' );
        s.setAttribute( 'src', url );
        s.setAttribute( 'type', 'text/javascript' );
@@ -86,7 +80,7 @@ window.importScriptURI = function( url ) {
 };
 
 window.importStylesheet = function( page ) {
-       return importStylesheetURI( mw.config.get( 'wgScript' ) + '?action=raw&ctype=text/css&title=' + mw.util.wikiUrlencode( page ) );
+       return window.importStylesheetURI( mw.config.get( 'wgScript' ) + '?action=raw&ctype=text/css&title=' + mw.util.wikiUrlencode( page ) );
 };
 
 window.importStylesheetURI = function( url, media ) {
@@ -113,23 +107,11 @@ window.appendCSS = function( text ) {
        return s;
 };
 
-// Special stylesheet links for Monobook only (see bug 14717)
-var skinpath = mw.config.get( 'stylepath' ) + '/' + mw.config.get( 'skin' );
-if ( mw.config.get( 'skin' ) === 'monobook' ) {
-       if ( opera6_bugs ) {
-               importStylesheetURI( skinpath + '/Opera6Fixes.css' );
-       } else if ( opera7_bugs ) {
-               importStylesheetURI( skinpath + '/Opera7Fixes.css' );
-       } else if ( opera95_bugs ) {
-               importStylesheetURI( skinpath + '/Opera9Fixes.css' );
-       } else if ( ff2_bugs ) {
-               importStylesheetURI( skinpath + '/FF2Fixes.css' );
-       }
-}
-
 if ( mw.config.get( 'wgBreakFrames' ) ) {
-       // Un-trap us from framesets
-       if ( window.top != window ) {
+       // 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 = window.location;
        }
 }
@@ -145,7 +127,7 @@ window.changeText = function( el, newText ) {
 
 window.killEvt = function( evt ) {
        evt = evt || window.event || window.Event; // W3C, IE, Netscape
-       if ( typeof ( evt.preventDefault ) != 'undefined' ) {
+       if ( typeof evt.preventDefault !== 'undefined' ) {
                evt.preventDefault(); // Don't follow the link
                evt.stopPropagation();
        } else {
@@ -162,7 +144,7 @@ window.escapeQuotes = function( text ) {
        text = text.replace( re, "\\'" );
        re = new RegExp( "\\n", "g" );
        text = text.replace( re, "\\n" );
-       return escapeQuotesHTML( text );
+       return window.escapeQuotesHTML( text );
 };
 
 window.escapeQuotesHTML = function( text ) {
@@ -178,63 +160,14 @@ window.escapeQuotesHTML = function( text ) {
 };
 
 /**
- * Set the accesskey prefix based on browser detection.
- */
-window.tooltipAccessKeyPrefix = 'alt-';
-if ( is_opera ) {
-       tooltipAccessKeyPrefix = 'shift-esc-';
-} else if ( is_chrome ) {
-       tooltipAccessKeyPrefix = is_chrome_mac ? 'ctrl-option-' : 'alt-';
-} else if ( !is_safari_win && is_safari && webkit_version > 526 ) {
-       tooltipAccessKeyPrefix = 'ctrl-alt-';
-} else if ( !is_safari_win && ( is_safari
-               || clientPC.indexOf('mac') != -1
-               || clientPC.indexOf('konqueror') != -1 ) ) {
-       tooltipAccessKeyPrefix = 'ctrl-';
-} else if ( is_ff2 ) {
-       tooltipAccessKeyPrefix = 'alt-shift-';
-}
-window.tooltipAccessKeyRegexp = /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/;
-
-/**
- * Add the appropriate prefix to the accesskey shown in the tooltip.
- * If the nodeList parameter is given, only those nodes are updated;
- * otherwise, all the nodes that will probably have accesskeys by
- * default are updated.
+ * Accesskey prefix utilities.
+ * To be removed in MediaWiki 1.23.
  *
- * @param nodeList Array list of elements to update
+ * @deprecated since 1.17 Use mediawiki.util instead.
  */
-window.updateTooltipAccessKeys = function( nodeList ) {
-       if ( !nodeList ) {
-               // Rather than scan all links on the whole page, we can just scan these
-               // containers which contain the relevant links. This is really just an
-               // optimization technique.
-               var linkContainers = [
-                       'column-one', // Monobook and Modern
-                       'mw-head', 'mw-panel', 'p-logo' // Vector
-               ];
-               for ( var i in linkContainers ) {
-                       var linkContainer = document.getElementById( linkContainers[i] );
-                       if ( linkContainer ) {
-                               updateTooltipAccessKeys( linkContainer.getElementsByTagName( 'a' ) );
-                       }
-               }
-               // these are rare enough that no such optimization is needed
-               updateTooltipAccessKeys( document.getElementsByTagName( 'input' ) );
-               updateTooltipAccessKeys( document.getElementsByTagName( 'label' ) );
-               return;
-       }
-
-       for ( var i = 0; i < nodeList.length; i++ ) {
-               var element = nodeList[i];
-               var tip = element.getAttribute( 'title' );
-               if ( tip && tooltipAccessKeyRegexp.exec( tip ) ) {
-                       tip = tip.replace(tooltipAccessKeyRegexp,
-                                         '[' + tooltipAccessKeyPrefix + "$5]");
-                       element.setAttribute( 'title', tip );
-               }
-       }
-};
+mw.log.deprecate( window, 'tooltipAccessKeyPrefix', 'alt-', 'Use mediawiki.util instead.' );
+mw.log.deprecate( window, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, 'Use mediawiki.util instead.' );
+mw.log.deprecate( window, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, 'Use mediawiki.util instead.' );
 
 /**
  * Add a link to one of the portlet menus on the page, including:
@@ -277,7 +210,7 @@ window.addPortletLink = function( portlet, href, text, id, tooltip, accesskey, n
                node = document.createElement( 'ul' );
                var lastElementChild = null;
                for ( var i = 0; i < root.childNodes.length; ++i ) { /* get root.lastElementChild */
-                       if ( root.childNodes[i].nodeType == 1 ) {
+                       if ( root.childNodes[i].nodeType === 1 ) {
                                lastElementChild = root.childNodes[i];
                        }
                }
@@ -317,10 +250,10 @@ window.addPortletLink = function( portlet, href, text, id, tooltip, accesskey, n
                link.setAttribute( 'title', tooltip );
        }
        if ( accesskey && tooltip ) {
-               updateTooltipAccessKeys( [link] );
+               mw.util.updateTooltipAccessKeys( [link] );
        }
 
-       if ( nextnode && nextnode.parentNode == node ) {
+       if ( nextnode && nextnode.parentNode === node ) {
                node.insertBefore( item, nextnode );
        } else {
                node.appendChild( item );  // IE compatibility (?)
@@ -330,10 +263,10 @@ window.addPortletLink = function( portlet, href, text, id, tooltip, accesskey, n
 };
 
 window.getInnerText = function( el ) {
-       if ( typeof el == 'string' ) {
+       if ( typeof el === 'string' ) {
                return el;
        }
-       if ( typeof el == 'undefined' ) {
+       if ( typeof el === 'undefined' ) {
                return el;
        }
        // Custom sort value through 'data-sort-value' attribute
@@ -355,7 +288,7 @@ window.getInnerText = function( el ) {
        for ( var i = 0; i < l; i++ ) {
                switch ( cs[i].nodeType ) {
                        case 1: // ELEMENT_NODE
-                               str += getInnerText( cs[i] );
+                               str += window.getInnerText( cs[i] );
                                break;
                        case 3: // TEXT_NODE
                                str += cs[i].nodeValue;
@@ -365,71 +298,21 @@ window.getInnerText = function( el ) {
        return str;
 };
 
-window.checkboxes = undefined;
-window.lastCheckbox = undefined;
-
-window.setupCheckboxShiftClick = function() {
-       checkboxes = [];
-       lastCheckbox = null;
-       var inputs = document.getElementsByTagName( 'input' );
-       addCheckboxClickHandlers( inputs );
-};
-
-window.addCheckboxClickHandlers = function( inputs, start ) {
-       if ( !start ) {
-               start = 0;
-       }
-
-       var finish = start + 250;
-       if ( finish > inputs.length ) {
-               finish = inputs.length;
-       }
-
-       for ( var i = start; i < finish; i++ ) {
-               var cb = inputs[i];
-               if ( !cb.type || cb.type.toLowerCase() != 'checkbox' || ( ' ' + cb.className + ' ' ).indexOf( ' noshiftselect ' )  != -1 ) {
-                       continue;
-               }
-               var end = checkboxes.length;
-               checkboxes[end] = cb;
-               cb.index = end;
-               addClickHandler( cb, checkboxClickHandler );
-       }
-
-       if ( finish < inputs.length ) {
-               setTimeout( function() {
-                       addCheckboxClickHandlers( inputs, finish );
-               }, 200 );
-       }
-};
-
-window.checkboxClickHandler = function( e ) {
-       if ( typeof e == 'undefined' ) {
-               e = window.event;
-       }
-       if ( !e.shiftKey || lastCheckbox === null ) {
-               lastCheckbox = this.index;
-               return true;
-       }
-       var endState = this.checked;
-       var start, finish;
-       if ( this.index < lastCheckbox ) {
-               start = this.index + 1;
-               finish = lastCheckbox;
-       } else {
-               start = lastCheckbox;
-               finish = this.index - 1;
-       }
-       for ( var i = start; i <= finish; ++i ) {
-               checkboxes[i].checked = endState;
-               if( i > start && typeof checkboxes[i].onchange == 'function' ) {
-                       checkboxes[i].onchange(); // fire triggers
-               }
-       }
-       lastCheckbox = this.index;
-       return true;
-};
-
+/**
+ * Toggle checkboxes with shift selection.
+ * To be removed in MediaWiki 1.23.
+ *
+ * @deprecated since 1.17 Use jquery.checkboxShiftClick instead.
+ */
+$.each({
+       checkboxes: [],
+       lastCheckbox: null,
+       setupCheckboxShiftClick: $.noop,
+       addCheckboxClickHandlers: $.noop,
+       checkboxClickHandler: $.noop
+}, function ( key, val ) {
+       mw.log.deprecate( window, key, val, 'Use jquery.checkboxShiftClick instead.' );
+} );
 
 /*
        Written by Jonathan Snook, http://www.snook.ca/jonathan
@@ -439,22 +322,22 @@ window.checkboxClickHandler = function( e ) {
 */
 window.getElementsByClassName = function( oElm, strTagName, oClassNames ) {
        var arrReturnElements = [];
-       if ( typeof( oElm.getElementsByClassName ) == 'function' ) {
+       if ( typeof oElm.getElementsByClassName === 'function' ) {
                /* Use a native implementation where possible FF3, Saf3.2, Opera 9.5 */
                var arrNativeReturn = oElm.getElementsByClassName( oClassNames );
-               if ( strTagName == '*' ) {
+               if ( strTagName === '*' ) {
                        return arrNativeReturn;
                }
                for ( var h = 0; h < arrNativeReturn.length; h++ ) {
-                       if( arrNativeReturn[h].tagName.toLowerCase() == strTagName.toLowerCase() ) {
+                       if( arrNativeReturn[h].tagName.toLowerCase() === strTagName.toLowerCase() ) {
                                arrReturnElements[arrReturnElements.length] = arrNativeReturn[h];
                        }
                }
                return arrReturnElements;
        }
-       var arrElements = ( strTagName == '*' && oElm.all ) ? oElm.all : oElm.getElementsByTagName( strTagName );
+       var arrElements = ( strTagName === '*' && oElm.all ) ? oElm.all : oElm.getElementsByTagName( strTagName );
        var arrRegExpClassNames = [];
-       if( typeof oClassNames == 'object' ) {
+       if( typeof oClassNames === 'object' ) {
                for( var i = 0; i < oClassNames.length; i++ ) {
                        arrRegExpClassNames[arrRegExpClassNames.length] =
                                new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)");
@@ -482,16 +365,17 @@ window.getElementsByClassName = function( oElm, strTagName, oClassNames ) {
 };
 
 window.redirectToFragment = function( fragment ) {
-       var match = navigator.userAgent.match(/AppleWebKit\/(\d+)/);
+       var webKitVersion,
+               match = navigator.userAgent.match(/AppleWebKit\/(\d+)/);
        if ( match ) {
-               var webKitVersion = parseInt( match[1] );
+               webKitVersion = parseInt( match[1], 10 );
                if ( webKitVersion < 420 ) {
                        // Released Safari w/ WebKit 418.9.1 messes up horribly
                        // Nightlies of 420+ are ok
                        return;
                }
        }
-       if ( window.location.hash == '' ) {
+       if ( !window.location.hash ) {
                window.location.hash = fragment;
 
                // Mozilla needs to wait until after load, otherwise the window doesn't
@@ -500,12 +384,12 @@ window.redirectToFragment = function( fragment ) {
                // version-testing.  If Firefox fixes the bug, they'll jump twice, but
                // better twice than not at all, so make the fix hit future versions as
                // well.
-               if ( is_gecko ) {
-                       addOnloadHook(function() {
-                               if ( window.location.hash == fragment ) {
+               if ( isGecko ) {
+                       $( function () {
+                               if ( window.location.hash === fragment ) {
                                        window.location.hash = fragment;
                                }
-                       });
+                       } );
                }
        }
 };
@@ -515,11 +399,9 @@ window.redirectToFragment = function( fragment ) {
  * something, replacing any preexisting message.
  *
  * @deprecated since 1.17 Use the 'mediawiki.notify' module instead.
- * @param {String|HTMLElement} message To be put inside the message box.
+ * @param {string|HTMLElement} message To be put inside the message box.
  */
-window.jsMsg = function () {
-       return mw.util.jsMessage.apply( mw.util, arguments );
-};
+mw.log.deprecate( window, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead.' );
 
 /**
  * Inject a cute little progress spinner after the specified element
@@ -553,17 +435,17 @@ window.removeSpinner = function( id ) {
 
 window.runOnloadHook = function() {
        // don't run anything below this for non-dom browsers
-       if ( doneOnloadHook || !( document.getElementById && document.getElementsByTagName ) ) {
+       if ( window.doneOnloadHook || !( document.getElementById && document.getElementsByTagName ) ) {
                return;
        }
 
        // set this before running any hooks, since any errors below
        // might cause the function to terminate prematurely
-       doneOnloadHook = true;
+       window.doneOnloadHook = true;
 
        // Run any added-on functions
-       for ( var i = 0; i < onloadFuncts.length; i++ ) {
-               onloadFuncts[i]();
+       for ( var i = 0; i < window.onloadFuncts.length; i++ ) {
+               window.onloadFuncts[i]();
        }
 };
 
@@ -583,7 +465,7 @@ window.addHandler = function( element, attach, handler ) {
 };
 
 window.hookEvent = function( hookName, hookFunct ) {
-       addHandler( window, hookName, hookFunct );
+       window.addHandler( window, hookName, hookFunct );
 };
 
 /**
@@ -593,7 +475,7 @@ window.hookEvent = function( hookName, hookFunct ) {
  * @param handler callable Event handler callback
  */
 window.addClickHandler = function( element, handler ) {
-       addHandler( element, 'click', handler );
+       window.addHandler( element, 'click', handler );
 };
 
 /**
@@ -612,10 +494,10 @@ window.removeHandler = function( element, remove, handler ) {
 };
 // note: all skins should call runOnloadHook() at the end of html output,
 //      so the below should be redundant. It's there just in case.
-hookEvent( 'load', runOnloadHook );
+window.hookEvent( 'load', window.runOnloadHook );
 
-if ( ie6_bugs ) {
-       importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' );
+if ( isIE6 ) {
+       window.importScriptURI( mw.config.get( 'stylepath' ) + '/common/IEFixes.js' );
 }
 
-}( mediaWiki ) );
+}( mediaWiki, jQuery ) );
index 95fcfef..f5650b5 100644 (file)
@@ -32,6 +32,7 @@ a.stub {
 #logo,
 #footer,
 #siteNotice,
+.mw-editsection,
 .editsection,
 .toctoggle {
        display: none;
index f201209..7e7758a 100644 (file)
@@ -412,11 +412,6 @@ h1, h2, h3, h4, h5, h6 {
        text-decoration: none;
        color: white;
 }
-
-#mw-pref-clear {
-       clear: both;
-}
-
 #mw_content a.external,
 #mw_content a.external[href ^="gopher://"] {
        /* @embed */
index 8278410..6e0f8b3 100644 (file)
@@ -3,6 +3,7 @@
 #p-personal,
 #jump-to-nav,
 #footer,
+.mw-editsection,
 span.editsection,
 .noprint {
        display: none;
diff --git a/skins/monobook/FF2Fixes.css b/skins/monobook/FF2Fixes.css
deleted file mode 100644 (file)
index c8b65f5..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-.rtl .external, a.feedlink {
-       padding: 0 !important;
-       background: none !important;
-}
diff --git a/skins/monobook/Opera6Fixes.css b/skins/monobook/Opera6Fixes.css
deleted file mode 100644 (file)
index 77dec09..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/* opera 6 fixes */
-div#column-one {
-       position: relative;
-       max-width: 11.7em;
-}
-#p-personal {
-       width: 45em;
-       margin-left: 8.6em;
-       right: 0;
-}
-#bodyContent a.external {
-       background: url(external.png) center right no-repeat;
-       padding-right: 13px;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
diff --git a/skins/monobook/Opera7Fixes.css b/skins/monobook/Opera7Fixes.css
deleted file mode 100644 (file)
index 1dcba7c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* small tweaks for opera seven */
-#p-cactions {
-       margin-top: .1em;
-}
-#p-cactions li a {
-       top: 2px;
-}
-#bodyContent a.external {
-       background: url(external.png) center right no-repeat;
-       padding-right: 13px;
-}
-.rtl #bodyContent a.external {
-       background-image: url(external-rtl.png);
-       padding-right: 13px;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
diff --git a/skins/monobook/Opera9Fixes.css b/skins/monobook/Opera9Fixes.css
deleted file mode 100644 (file)
index 9c312a8..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-.rtl #bodyContent a.external {
-       background-image: url(external-rtl.png);
-       padding-right: 13px;
-       padding-left: 0;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
index 4cbc093..90a41d3 100644 (file)
@@ -17,7 +17,7 @@ div#column-content {
 }
 div#content {
        margin: 2.8em 0 0 12.2em;
-       padding: 0 1em 1em 1em;
+       padding: 1em;
        position: relative;
        z-index: 2;
 }
@@ -93,6 +93,9 @@ pre, .mw-code {
        line-height: 1.1em;
 }
 
+#firstHeading {
+       padding-top: 0;
+}
 /*
 ** the main content area
 */
@@ -319,7 +322,7 @@ input.searchButton {
        position: absolute;
        left: 0;
        top: 0;
-       z-index: 0;
+       z-index: 3;
 }
 #p-personal {
        width: 100%;
@@ -381,19 +384,22 @@ input.searchButton {
 #p-personal li.active a:hover {
        background-color: transparent;
 }
-/* the icon in front of the user name, single quotes
-in bg url to hide it from iemac */
+/* The icon in front of the username / login link */
 li#pt-userpage,
 li#pt-anonuserpage,
 li#pt-login {
        /* @embed */
        background: url(user.gif) top left no-repeat;
        padding-left: 20px;
-       text-transform: none;
 }
 #p-personal ul {
        text-transform: lowercase;
 }
+/* Don't lowercase username or IP addresses (IPv6) */
+li#pt-userpage,
+li#pt-anonuserpage {
+       text-transform: none;
+}
 #p-personal li.active {
        font-weight: bold;
 }
@@ -422,14 +428,13 @@ li#pt-login {
        display: inline;
        border: 1px solid #aaa;
        border-bottom: none;
-       padding: 0 0 .1em 0;
+       padding: 0 0 1em 0;
        margin: 0 .3em 0 0;
        overflow: visible;
        background: white;
 }
 #p-cactions li.selected {
        border-color: #fabd23;
-       padding: 0 0 .2em 0;
        font-weight: bold;
 }
 #p-cactions li a {
@@ -515,7 +520,8 @@ div#footer {
        border-top: 1px solid #fabd23;
        border-bottom: 1px solid #fabd23;
        margin: .6em 0 1em 0;
-       padding: .4em 0 1.2em 0;
+       overflow: hidden;
+       padding: .4em 0 .3em 0;
        text-align: center;
        font-size: 90%;
 }
diff --git a/skins/myskin/main.css b/skins/myskin/main.css
deleted file mode 100644 (file)
index f3ab020..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/* this file must be empty */
diff --git a/skins/nostalgia/screen.css b/skins/nostalgia/screen.css
deleted file mode 100644 (file)
index aed5715..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-body {
-       /* background color is set separately on page type */
-       color: black;
-}
-
-#specialform {
-       display: inline;
-}
-
-#powersearch {
-       background: #DDEEFF;
-       border-style: solid;
-       border-width: 1px;
-       padding: 2px;
-}
-
-a.new {
-       color: #ba0000;
-}
-
-a.interwiki,
-a.external {
-       color: #3366BB;
-}
-
-a.printable {
-       text-decoration: underline;
-}
-
-a.stub {
-       color: #772233;
-       text-decoration: none;
-}
-
-h1.pagetitle {
-       padding-top: 0;
-       margin-top: 0;
-       padding-bottom: 0;
-       margin-bottom: 0;
-}
-
-h2, h3, h4, h5, h6 {
-       margin-bottom: 0;
-}
-
-textarea {
-       overflow: auto;
-}
-
-p.subtitle {
-       padding-top: 0;
-       margin-top: 0;
-}
-div.sitenotice {
-       clear: both;
-}
diff --git a/skins/simple/discussionitem_icon.gif b/skins/simple/discussionitem_icon.gif
deleted file mode 100644 (file)
index e3ca6d9..0000000
Binary files a/skins/simple/discussionitem_icon.gif and /dev/null differ
diff --git a/skins/simple/external.png b/skins/simple/external.png
deleted file mode 100644 (file)
index acf260f..0000000
Binary files a/skins/simple/external.png and /dev/null differ
diff --git a/skins/simple/file_icon.gif b/skins/simple/file_icon.gif
deleted file mode 100644 (file)
index 69dbeaf..0000000
Binary files a/skins/simple/file_icon.gif and /dev/null differ
diff --git a/skins/simple/link_icon.gif b/skins/simple/link_icon.gif
deleted file mode 100644 (file)
index 168c1a2..0000000
Binary files a/skins/simple/link_icon.gif and /dev/null differ
diff --git a/skins/simple/lock_icon.gif b/skins/simple/lock_icon.gif
deleted file mode 100644 (file)
index 8284403..0000000
Binary files a/skins/simple/lock_icon.gif and /dev/null differ
diff --git a/skins/simple/mail_icon.gif b/skins/simple/mail_icon.gif
deleted file mode 100644 (file)
index cf5680d..0000000
Binary files a/skins/simple/mail_icon.gif and /dev/null differ
diff --git a/skins/simple/main.css b/skins/simple/main.css
deleted file mode 100644 (file)
index edb1d7d..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-/**
- * For clarity, explicitly state some recommendations from
- * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right.
- */
-
-h1 {
-       font-size: 2em;
-}
-h2 {
-       font-size: 1.5em;
-}
-h3 {
-       font-size: 1.17em;
-}
-h5 {
-       font-size: .83em;
-}
-h6 {
-       font-size: .75em;
-}
-h1, h2, h3, h4, h5, h6 {
-       font-weight: bolder;
-}
-
-/* Now the custom parts */
-
-/* Make edit sections (which are inside h# tags) normal-sized */
-.editsection {
-       font-weight: normal;
-}
-h1 .editsection {
-       font-size: 50%;
-}
-h2 .editsection {
-       font-size: 66.7%;
-}
-h3 .editsection {
-       font-size: 85.5%;
-}
-h5 .editsection {
-       font-size: 120%;
-}
-h6 .editsection {
-       font-size: 133%;
-}
-
-#toolbar {
-       display: none;
-}
-
-div.center {
-       text-align: center;
-}
-
-#contentSub {
-       padding-left: 2em;
-}
-
-a {
-       text-decoration: none;
-}
-
-a:hover {
-       text-decoration: underline;
-}
-
-#column-content {
-       width: 100%;
-       float: right;
-       margin: 0 0 0.6em -12.2em;
-       padding: 0;
-}
-
-#content {
-       margin: 0em 0 0 12.2em;
-       padding: 0em 1em 1.5em 1em;
-       border-left: 1px solid #959595;
-       line-height: 1.5em;
-}
-
-#column-one {
-       position: absolute;
-       top: 0;
-       left: 0;
-}
-
-/* Hide, but keep accessible for screen-readers */
-#column-one h2 {
-       position: absolute;
-       top: -9999px;
-}
-
-body {
-       margin: 0;
-       padding: 0;
-}
-
-#globalWrapper {
-       width: 100%;
-       height: 100%;
-       margin: 0;
-       padding: 0;
-}
-.visualClear {
-       clear: both;
-}
-
-img {
-       border: none;
-}
-p {
-       margin: 0.4em 0em 0.5em 0em;
-       line-height: 1.5em;
-}
-p img {
-       margin: 0;
-}
-
-h1, h2, h3, h4, h5, h6 {
-       margin: 0;
-       padding-top: 0.5em;
-       padding-bottom: 0.17em;
-}
-fieldset {
-       margin: 1em 0em 1em 0em;
-       padding: 0em 1em 1em 1em;
-}
-.usermessage {
-       background-color: #ffce7b;
-       border: 1px solid #ffa500;
-       color: black;
-       font-weight: bold;
-       margin: 2em 0em 1em 0em;
-       padding: 0.5em 1em;
-       vertical-align: middle;
-}
-.error {
-       color: red;
-       font-size: larger;
-}
-
-table.rimage {
-       float: right;
-       position: relative;
-       margin-left: 1em;
-       margin-bottom: 1em;
-       text-align: center;
-}
-
-.portlet {
-       border: none;
-       float: none;
-       padding: 0;
-       width: 11.8em;
-       overflow: hidden;
-}
-.portlet h4 {
-       font-weight: normal;
-       white-space: nowrap;
-}
-.portlet h5 {
-       padding: 0em 1em 0em 0.5em;
-       display: inline;
-       height: 1em;
-       font-weight: normal;
-       white-space: nowrap;
-}
-.portlet h6 {
-       padding: 0em 1em 0em 1em;
-       display: block;
-       height: 1.2em;
-       font-weight: normal;
-       white-space: nowrap;
-}
-.pBody {
-       border-collapse: collapse;
-       padding: 0 0.8em 0.3em 0.5em;
-}
-.portlet h1,
-.portlet h2,
-.portlet h3,
-.portlet h4 {
-       margin: 0;
-       padding: 0;
-       font-size: small;
-}
-
-#p-search .pBody {
-       text-align: center;
-}
-
-#searchInput {
-       width: 100%;
-       clear: both;
-       margin: 0 0 0 0;
-}
-
-input.searchButton {
-       margin-top: 1px;
-       padding: 0 0.4em;
-       cursor: pointer;
-}
-
-#p-search .pBody {
-       padding: 0.5em 0.4em 0.4em 0.4em;
-}
-
-/* feed links */
-a.feedlink {
-       background: url(../common/images/feed-icon.png) center left no-repeat;
-       padding-left: 16px;
-}
-
-textarea {
-       width: 100%;
-}
-
-.pBody li,
-.pBody ul {
-       padding-left: 0em;
-       margin-left: 0.5em;
-}
-
-pre, .mw-code {
-       margin: 2em;
-       border: solid 1px black;
-}
-
-h1.firstHeading,
-h2 {
-       border-bottom: solid 1px black;
-}
-#bodyContent a.external,
-#bodyContent a.external[href ^="gopher://"] {
-       background: url(external.png) center right no-repeat;
-       padding-right: 13px;
-}
-#bodyContent a.external[href ^="https://"],
-.link-https {
-       background: url(lock_icon.gif) center right no-repeat;
-       padding-right: 16px;
-}
-#bodyContent a.external[href ^="mailto:"],
-.link-mailto {
-       background: url(mail_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-#bodyContent a.external[href ^="news:"] {
-       background: url(news_icon.png) center right no-repeat;
-       padding-right: 18px;
-}
-#bodyContent a.external[href ^="ftp://"],
-.link-ftp {
-       background: url(file_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-#bodyContent a.external[href ^="irc://"],
-#bodyContent a.external[href ^="ircs://"],
-.link-irc {
-       background: url(discussionitem_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.extiw,
-#bodyContent a.extiw:active {
-       color: #5E7CFF;
-}
-
-td.diff-addedline {
-       background-color: #B9FFB0;
-}
-
-td.diff-deletedline {
-       background-color: #f8ffaa;
-}
-
-.diffchange {
-       background-color: #FFCDF3;
-       text-decoration: none;
-}
-
-#pagehistory li {
-       border: none;
-}
-
-div.tocindent {
-       margin-left: 2em;
-}
-#toc {
-       text-align: left;
-       border-top: solid 1px black;
-       border-bottom: solid 1px black;
-}
-
-/* @noflip */div.floatright, table.floatright {
-       margin: 0;
-       border-width: 0.5em 0 0.8em 1.4em;
-}
-div.floatright p {
-       font-style: italic;
-}
-/* @noflip */div.floatleft, table.floatleft {
-       margin: 0.3em 0.5em 0.5em 0;
-       border-width: 0.5em 1.4em 0.8em 0;
-}
-div.floatleft p {
-       font-style: italic;
-}
-
-/* thumbnails */
-div.thumb {
-       margin-bottom: 0.5em;
-       width: auto;
-}
-div.thumbinner {
-       padding: 3px !important;
-       text-align: center;
-       overflow: hidden;
-}
-
-html .thumbcaption {
-       border: none;
-       text-align: left;
-       line-height: 1.4;
-       padding: 0.3em 0 0.1em 0;
-}
-div.magnify {
-       float: right;
-       border: none !important;
-       background: none !important;
-}
-div.magnify a,
-div.magnify img {
-       display: block;
-       border: none !important;
-       background: none !important;
-}
-/* @noflip */div.tright {
-       border-width: 0.5em 0 0.8em 1.4em;
-}
-/* @noflip */div.tleft {
-       margin-right: 0.5em;
-       border-width: 0.5em 1.4em 0.8em 0;
-}
-img.thumbborder {
-       border: 1px solid #dddddd;
-}
-
-a.stub {
-       color: #772233;
-}
-a.new,
-#p-personal a.new {
-       color: #BA0000;
-       text-decoration: line-through;
-}
-li.new {
-       text-decoration: line-through;
-}
-/**
- * Overrides text justification (user preference)
- * See bug 31990
- */
-#catlinks {
-       text-align: center;
-}
-.catlinks {
-       text-align: center;
-       width: 80%;
-       margin-left: auto;
-       margin-right: auto;
-       padding: 3px;
-}
-
-#mytabs {
-       background-color: inherit;
-}
-#p-cactions {
-       background-color: inherit;
-}
-
-#footer {
-       padding-left: 11.8em;
-}
-
-#n-portal,
-#n-currentevents,
-#n-help,
-#n-sitesupport {
-       display: none;
-}
-
-#preftoc {
-       float: left;
-       margin: 1em;
-       width: 13em;
-}
-#preftoc li {
-}
-#preftoc li.selected {
-       border: 1px dashed #aaa;
-}
-#preftoc a,
-#preftoc a:active {
-       display: block;
-}
-div.htmlform-tip {
-       font-size: 95%;
-       margin-top: 1em;
-}
-
-#mw_trackbacks {
-       border-style: groove;
-}
-
-#jump-to-nav {
-       display: none;
-}
-
-table.collapsed tr.collapsable {
-       display: none;
-}
-
-.templatesUsed {
-       margin-top: 1.5em;
-}
-
diff --git a/skins/standard/main.css b/skins/standard/main.css
deleted file mode 100644 (file)
index a4b03a8..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-/**
- * This style sheet is used by the classic (aka standard) skin
- */
-
-#article {
-       padding: 4px;
-}
-
-#content {
-       margin: 0;
-       padding: 0;
-}
-
-#footer {
-       padding: 4px;
-       font-size: 95%;
-       clear: both;
-}
-
-#pagestats {
-       font-size: 9pt;
-}
-
-#powersearch {
-       background: #DDEEFF;
-       border-style: solid;
-       border-width: 1px;
-       padding: 2px;
-}
-
-#quickbar {
-       width: 140px;
-       height: 100%;
-       padding: 4px;
-       visibility: visible;
-       z-index: 99;
-       font-size: 95%;
-}
-
-#topbar {
-       padding: 4px;
-       font-size: 95%;
-}
-
-/* Table of contents */
-.toctoggle,
-.editsection {
-       font-size: smaller;
-}
-
-/* ... */
-#toolbar {
-       padding: 0;
-}
-
-#infobox {
-       background: #eeeeff;
-       color: black;
-}
-
-#editform {
-       margin-top: 1px;
-}
-
-a.interwiki,
-a.external {
-       color: #3366BB;
-}
-
-a.printable {
-       text-decoration: underline;
-}
-
-a.new {
-       color: #ba0000;
-}
-
-a.stub {
-       color: #772233;
-       text-decoration: none;
-}
-
-a:visited {
-       color: #5A3696;
-}
-
-body {
-       margin: 0;
-       padding: 4px;
-       color: black;
-}
-
-form.inline {
-       display: inline;
-}
-
-textarea {
-       overflow: auto;
-}
-
-h1.pagetitle {
-       padding-top: 0;
-       margin-top: 0;
-       padding-bottom: 0;
-       margin-bottom: 0;
-       font-size: 150%;
-}
-
-h1.pagetitle .editsection {
-       font-size: 66.7%;
-}
-
-h2 {
-       font-size: 120%;
-}
-
-h2 .editsection {
-       font-size: 83.3%;
-}
-
-h2, h3, h4, h5, h6 {
-       margin-bottom: 0;
-}
-
-h3 {
-       font-size: 106.25%;
-}
-
-h3 .editsection {
-       font-size: 94.1%;
-}
-
-h4 {
-       font-size: 103.125%;
-}
-
-h4 .editsection {
-       font-size: 97.0%;
-}
-
-h5 {
-       font-size: 100%;
-}
-
-h5 .editsection {
-       font-size: 100%;
-}
-
-h6 {
-       font-size: 95%;
-}
-
-h6 .editsection {
-       font-size: 105.3%;
-}
-
-hr.sep {
-       color: gray;
-       height: 1px;
-       background-color: gray;
-}
-
-p.subpages {
-       font-size: small;
-}
-
-p.subtitle {
-       padding-top: 0;
-       margin-top: 0;
-}
-
-.catlinks {
-       font-size: small;
-       margin-top: 0;
-       text-align:right;
-}
-
-td {
-       empty-cells: show;
-}
-
-td.bottom {
-       border-top: 1px solid gray;
-}
-
-td.top {
-       border-bottom: 1px solid gray;
-}
diff --git a/skins/vector/images/user-icon.svg b/skins/vector/images/user-icon.svg
new file mode 100644 (file)
index 0000000..767d510
--- /dev/null
@@ -0,0 +1,424 @@
+<?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:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="12"
+   height="13.837458"
+   id="svg2108">
+  <metadata
+     id="metadata68">
+    <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>
+  <defs
+     id="defs3">
+    <linearGradient
+       id="linearGradient4356">
+      <stop
+         id="stop4358"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4360"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4344">
+      <stop
+         id="stop4346"
+         style="stop-color:#727e0a;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4348"
+         style="stop-color:#5b6508;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4338">
+      <stop
+         id="stop4340"
+         style="stop-color:#e9b15e;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4342"
+         style="stop-color:#966416;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4163">
+      <stop
+         id="stop4165"
+         style="stop-color:#3b74bc;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4167"
+         style="stop-color:#2d5990;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3824">
+      <stop
+         id="stop3826"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3828"
+         style="stop-color:#c9c9c9;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3816">
+      <stop
+         id="stop3818"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3820"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3800">
+      <stop
+         id="stop3802"
+         style="stop-color:#f4d9b1;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3804"
+         style="stop-color:#df9725;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient3806"
+       xlink:href="#linearGradient3800"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient3822"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient3830"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="28.089741"
+       cy="27.203083"
+       r="13.56536"
+       fx="28.089741"
+       fy="27.203083"
+       id="radialGradient4169"
+       xlink:href="#linearGradient4163"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient4171"
+       xlink:href="#linearGradient3800"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient4175"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.707108,0)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient4179"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient4326"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-12.41789,-7)" />
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient4328"
+       xlink:href="#linearGradient4338"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient4330"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient4332"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-13.125,-7)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient4336"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="16.214741"
+       cy="19.836468"
+       r="13.56536"
+       fx="16.214741"
+       fy="19.836468"
+       id="radialGradient4350"
+       xlink:href="#linearGradient4344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient4362"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient4366"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient4372"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient4374"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient1366"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,41.80576,-11.11866)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient1369"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,-7.07212,-9.82492)" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient1372"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-12.41789,-7)" />
+    <radialGradient
+       cx="16.214741"
+       cy="19.836468"
+       r="13.56536"
+       fx="16.214741"
+       fy="19.836468"
+       id="radialGradient1381"
+       xlink:href="#linearGradient4344"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.681917,0,8.233773)" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient2243"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="28.089741"
+       cy="27.203083"
+       r="13.56536"
+       fx="28.089741"
+       fy="27.203083"
+       id="radialGradient2245"
+       xlink:href="#linearGradient4163"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.297564,0,0,0.884831,-8.358505,4.940469)" />
+    <linearGradient
+       x1="30.935921"
+       y1="29.553486"
+       x2="30.935921"
+       y2="35.803486"
+       id="linearGradient2247"
+       xlink:href="#linearGradient3824"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="31.112698"
+       cy="19.008621"
+       r="8.6620579"
+       fx="31.112698"
+       fy="19.008621"
+       id="radialGradient2249"
+       xlink:href="#linearGradient3816"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="29.344931"
+       cy="17.064077"
+       r="9.1620579"
+       fx="29.344931"
+       fy="17.064077"
+       id="radialGradient2251"
+       xlink:href="#linearGradient3800"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.787998,0,0,0.787998,6.221198,3.617627)" />
+    <linearGradient
+       x1="20.661695"
+       y1="35.817974"
+       x2="22.626925"
+       y2="36.217758"
+       id="linearGradient2253"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.983375,0.181588,-0.181588,0.983375,6.231716,-2.651466)" />
+    <linearGradient
+       x1="22.686766"
+       y1="36.3904"
+       x2="21.408455"
+       y2="35.739632"
+       id="linearGradient2255"
+       xlink:href="#linearGradient4356"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.977685,0.210075,0.210075,0.977685,55.1096,-3.945209)" />
+  </defs>
+  <g
+     transform="translate(-5.0000039,-32.070112)"
+     id="layer1"
+     style="display:inline" />
+  <g
+     transform="translate(-5.0000039,-32.070112)"
+     id="layer2"
+     style="display:inline">
+    <g
+       transform="matrix(0.39012793,0,0,0.39012793,-1.0891578,28.22979)"
+       id="g2230">
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         transform="matrix(1.77551,0,0,0.959183,-24.25322,18.77153)"
+         id="path4306"
+         style="color:#000000;fill:url(#radialGradient2243);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 25.986174,41.636039 10.606602,0 c 3.005204,0 5.980484,-1.101932 7.071067,-4.242641 1.035639,-2.982476 0.176777,-8.662058 -6.540737,-13.258252 l -12.551146,0 c -6.717514,4.24264 -7.556991,10.044831 -6.010407,13.435028 1.575595,3.45379 4.24264,4.065865 7.424621,4.065865 z"
+         id="path4308"
+         style="color:#000000;fill:url(#radialGradient2245);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 26.693281,25.726136 c 3.18198,2.828427 4.596194,13.081476 4.596194,13.081476 0,0 1.414213,-10.253048 3.889087,-13.258252 l -8.485281,0.176776 z"
+         id="path4310"
+         style="color:#000000;fill:url(#linearGradient2247);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 28.972721,26.786797 c 0,0 -2.151323,1.660335 -1.965991,3.660533 -2.041226,-1.800794 -2.099873,-5.251524 -2.099873,-5.251524 l 4.065864,1.590991 z"
+         id="path4312"
+         style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 25.914862,40.593933 10.493447,-0.0221 c 2.639723,0 5.253161,-0.967919 6.211112,-3.726667 0.909689,-2.61976 -0.09472,-7.608614 -5.995279,-11.645837 L 25.099417,24.956264 c -5.900557,3.726667 -7.04262,8.823219 -5.662029,12.044182 1.380592,3.220963 3.395211,3.57139 6.477474,3.593487 z"
+         id="path4314"
+         style="opacity:0.21518986;color:#000000;fill:none;stroke:#ffffff;stroke-width:0.99999976px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 33.410795,26.786797 c 0,0 2.151323,1.660335 1.965991,3.660533 2.041226,-1.800794 2.099873,-5.251524 2.099873,-5.251524 l -4.065864,1.590991 z"
+         id="path4316"
+         style="color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         transform="translate(-0.125,3.5)"
+         id="path4318"
+         style="color:#000000;fill:url(#radialGradient2249);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         id="path4320"
+         style="color:#000000;fill:url(#radialGradient2251);fill-opacity:1;fill-rule:evenodd;stroke:#c17d11;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 39.774755,19.008621 a 8.6620579,8.6620579 0 1 1 -17.324115,0 8.6620579,8.6620579 0 1 1 17.324115,0 z"
+         transform="matrix(0.877095,0,0,0.877095,3.823927,2.336267)"
+         id="path4322"
+         style="opacity:0.19620254;color:#000000;fill:none;stroke:#ffffff;stroke-width:1.14012825px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 21.85179,40.775197 c -1.247607,-0.544969 -1.805994,-1.858277 -1.805994,-1.858277 0.841281,-4.069136 3.719925,-7.046216 3.719925,-7.046216 0,0 -2.279321,6.411514 -1.913931,8.904493 z"
+         id="path4354"
+         style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2253);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="m 40.757497,39.916846 c 1.231251,-0.580978 1.80438,-2.002321 1.80438,-2.002321 -0.95912,-4.042983 -3.976149,-6.842821 -3.976149,-6.842821 0,0 2.464593,6.342602 2.171769,8.845142 z"
+         id="path4364"
+         style="opacity:0.22784807;color:#000000;fill:url(#linearGradient2255);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible" />
+    </g>
+  </g>
+</svg>
index 2e09ee1..eb4a4dd 100644 (file)
@@ -75,8 +75,8 @@ div.emptyPortlet {
        position: absolute;
        top: 0.33em;
        right: 0.75em;
-       /* Display on top of page tabs - bug 37158 */
-       z-index: 1;
+       /* Display on top of page tabs - bugs 37158, 48078 */
+       z-index: 100;
 }
 #p-personal h3,
 #p-personal h5 {
@@ -709,7 +709,6 @@ pre, .mw-code {
 #firstHeading {
        padding-top: 0;
        margin-top: 0;
-       padding-top: 0;
        font-size: 1.6em;
 }
 div#content a.external,
@@ -783,8 +782,13 @@ div#content a.external[href *=".pdf?"], div#content a.external[href *=".PDF?"],
 #pt-login {
        /* @embed */
        background: url(images/user-icon.png) left top no-repeat;
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/user-icon.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/user-icon.svg);
        padding-left: 15px !important;
-       text-transform: none;
 }
 
 .redirectText {
index b7320cb..c25dff7 100644 (file)
@@ -30,21 +30,21 @@ if ( PHP_SAPI != 'cli' ) {
 
 define( 'SELENIUMTEST', true );
 
-require( __DIR__ . '/../maintenance/Maintenance.php' );
+require __DIR__ . '/../maintenance/Maintenance.php';
 
-require_once( 'PHPUnit/Runner/Version.php' );
+require_once 'PHPUnit/Runner/Version.php';
 if ( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '>=' ) ) {
        # PHPUnit 3.5.0 introduced a nice autoloader based on class name
-       require_once( 'PHPUnit/Autoload.php' );
+       require_once 'PHPUnit/Autoload.php';
 } else {
        # Keep the old pre PHPUnit 3.5.0 behavior for compatibility
-       require_once( 'PHPUnit/TextUI/Command.php' );
+       require_once 'PHPUnit/TextUI/Command.php';
 }
 
-require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
-include_once( 'PHPUnit/Util/Log/JUnit.php' );
+require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
+include_once 'PHPUnit/Util/Log/JUnit.php';
 
-require_once( __DIR__ . "/selenium/SeleniumServerManager.php" );
+require_once __DIR__ . "/selenium/SeleniumServerManager.php";
 
 class SeleniumTester extends Maintenance {
        protected $selenium;
@@ -85,7 +85,7 @@ class SeleniumTester extends Maintenance {
 
        protected function startServer() {
                if ( $this->seleniumServerExecPath == '' ) {
-                       die ( "The selenium server exec path is not set in " .
+                       die( "The selenium server exec path is not set in " .
                                "selenium_settings.ini. Cannot start server \n" .
                                "as requested - terminating RunSeleniumTests\n" );
                }
@@ -96,11 +96,11 @@ class SeleniumTester extends Maintenance {
                        case 'started':
                                break;
                        case 'failed':
-                               die ( "Unable to start the Selenium Server - " .
+                               die( "Unable to start the Selenium Server - " .
                                        "terminating RunSeleniumTests\n" );
                        case 'running':
-                               echo "Warning: The Selenium Server is " .
-                                       "already running\n" );
+                               echo "Warning: The Selenium Server is " .
+                                       "already running\n";
                                break;
                }
 
@@ -108,17 +108,17 @@ class SeleniumTester extends Maintenance {
        }
 
        protected function stopServer() {
-               if ( !isset ( $this->serverManager ) ) {
-                       echo "Warning: Request to stop Selenium Server, but it was " .
+               if ( !isset( $this->serverManager ) ) {
+                       echo "Warning: Request to stop Selenium Server, but it was " .
                                "not stared by RunSeleniumTests\n" .
                                "RunSeleniumTests cannot stop a Selenium Server it " .
-                               "did not start\n" );
+                               "did not start\n";
                } else {
                        switch ( $this->serverManager->stop() ) {
                                case 'stopped':
                                        break;
                                case 'failed':
-                                       echo ( "unable to stop the Selenium Server\n" );
+                                       echo "unable to stop the Selenium Server\n";
                        }
                }
                return;
@@ -133,7 +133,7 @@ class SeleniumTester extends Maintenance {
                }
 
                foreach ( $seleniumTestSuites as $testSuiteName => $testSuiteFile ) {
-                       require( $testSuiteFile );
+                       require $testSuiteFile;
                        $suite = new $testSuiteName();
                        $suite->setName( $testSuiteName );
                        $suite->addTests();
@@ -255,4 +255,4 @@ class SeleniumTester extends Maintenance {
 
 $maintClass = "SeleniumTester";
 
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 264ba69..9f8887b 100644 (file)
@@ -30,8 +30,10 @@ $wgAutoloadClasses += array(
        'DbTestPreviewer' => "$testDir/testHelpers.inc",
        'DbTestRecorder' => "$testDir/testHelpers.inc",
        'DelayedParserTest' => "$testDir/testHelpers.inc",
+       'ParserTestResult' => "$testDir/parser/ParserTestResult.php",
        'TestFileIterator' => "$testDir/testHelpers.inc",
        'TestRecorder' => "$testDir/testHelpers.inc",
+       'ITestRecorder' => "$testDir/testHelpers.inc",
 
        # tests/phpunit
        'MediaWikiTestCase' => "$testDir/phpunit/MediaWikiTestCase.php",
@@ -47,9 +49,8 @@ $wgAutoloadClasses += array(
 
        //db
        'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
-
-       //Selenium
-       'SeleniumTestConstants' => "$testDir/selenium/SeleniumTestConstants.php",
+       'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
+       'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
 
        # tests/phpunit/includes/api
        'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php",
@@ -80,6 +81,11 @@ $wgAutoloadClasses += array(
        'SiteTest' => "$testDir/phpunit/includes/site/SiteTest.php",
        'TestSites' => "$testDir/phpunit/includes/site/TestSites.php",
 
+       # tests/phpunit/mocks
+       'MockFSFile' => "$testDir/phpunit/mocks/filebackend/MockFSFile.php",
+       'MockFileBackend' => "$testDir/phpunit/mocks/filebackend/MockFileBackend.php",
+       'MockBitmapHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
+
        # tests/phpunit/languages
        'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php",
 
diff --git a/tests/parser/ParserTestResult.php b/tests/parser/ParserTestResult.php
new file mode 100644 (file)
index 0000000..d9ad773
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * @copyright Copyright © 2013, Antoine Musso
+ * @copyright Copyright © 2013, Wikimedia Foundation Inc.
+ * @license GNU GPL v2
+ *
+ * @file
+ */
+
+/**
+ * Represent the result of a parser test.
+ *
+ * @since 1.22
+ */
+class ParserTestResult {
+       /**
+        * Description of the parser test.
+        *
+        * This is usually the text used to describe a parser test in the .txt
+        * files.  It is initialized on a construction and you most probably
+        * never want to change it.
+        */
+       public $description;
+       /** Text that was expected */
+       public $expected;
+       /** Actual text rendered */
+       public $actual;
+
+       /**
+        * @param $description string A short text describing the parser test
+        *        usually the text in the parser test .txt file.  The description
+        *        is later available using the property $description.
+        */
+       public function __construct( $description ) {
+               $this->description = $description;
+       }
+
+       /** Whether the test passed */
+       public function isSuccess() {
+               return $this->expected === $this->actual;
+       }
+}
index ce621f4..972ad8f 100644 (file)
@@ -143,13 +143,12 @@ class ParserTest {
                        $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
                        $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
                        $parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
-                       $wgArticlePath, $wgStyleSheetPath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
+                       $wgArticlePath, $wgScript, $wgStylePath, $wgExtensionAssetsPath,
                        $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType, $wgLockManagers;
 
                $wgScript = '/index.php';
                $wgScriptPath = '/';
                $wgArticlePath = '/wiki/$1';
-               $wgStyleSheetPath = '/skins';
                $wgStylePath = '/skins';
                $wgExtensionAssetsPath = '/extensions';
                $wgThumbnailScriptPath = false;
@@ -487,7 +486,7 @@ class ParserTest {
                } elseif ( isset( $opts['comment'] ) ) {
                        $out = Linker::formatComment( $input, $title, $local );
                } elseif ( isset( $opts['preload'] ) ) {
-                       $out = $parser->getpreloadText( $input, $title, $options );
+                       $out = $parser->getPreloadText( $input, $title, $options );
                } else {
                        $output = $parser->parse( $input, $title, $options, true, true, 1337 );
                        $out = $output->getText();
@@ -518,18 +517,23 @@ class ParserTest {
                }
 
                $this->teardownGlobals();
-               return $this->showTestResult( $desc, $result, $out );
+
+               $testResult = new ParserTestResult( $desc );
+               $testResult->expected = $result;
+               $testResult->actual = $out;
+
+               return $this->showTestResult( $testResult );
        }
 
        /**
-        *
+        * Refactored in 1.22 to use ParserTestResult
         */
-       function showTestResult( $desc, $result, $out ) {
-               if ( $result === $out ) {
-                       $this->showSuccess( $desc );
+       function showTestResult( ParserTestResult $testResult ) {
+               if ( $testResult->isSuccess() ) {
+                       $this->showSuccess( $testResult );
                        return true;
                } else {
-                       $this->showFailure( $desc, $result, $out );
+                       $this->showFailure( $testResult );
                        return false;
                }
        }
@@ -664,7 +668,6 @@ class ParserTest {
                        ),
                        'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
                        'wgStylePath' => '/skins',
-                       'wgStyleSheetPath' => '/skins',
                        'wgSitename' => 'MediaWiki',
                        'wgLanguageCode' => $lang,
                        'wgDBprefix' => $this->db->getType() != 'oracle' ? 'parsertest_' : 'pt_',
@@ -869,18 +872,36 @@ class ParserTest {
                $this->uploadDir = $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
+               # are actually set by inspecting the file itself; the arguments
+               # to recordUpload2 have no effect.  That said, we try to make things
+               # match up so it is less confusing to readers of the code & tests.
                $image->recordUpload2( '', 'Upload of some lame file', 'Some lame file', array(
-                       'size' => 12345,
+                       'size' => 7881,
                        'width' => 1941,
                        'height' => 220,
-                       'bits' => 24,
+                       'bits' => 8,
                        'media_type' => MEDIATYPE_BITMAP,
                        'mime' => 'image/jpeg',
                        'metadata' => serialize( array() ),
-                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                       'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20010115123500' ), $user );
 
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Thumb.png' ) );
+               # again, note that size/width/height below are ignored; see above.
+               $image->recordUpload2( '', 'Upload of some lame thumbnail', 'Some lame thumbnail', array(
+                       'size' => 22589,
+                       'width' => 135,
+                       'height' => 135,
+                       'bits' => 8,
+                       'media_type' => MEDIATYPE_BITMAP,
+                       'mime' => 'image/png',
+                       'metadata' => serialize( array() ),
+                       'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+                       'fileExists' => true
+               ), $this->db->timestamp( '20130225203040' ), $user );
+
                # This image will be blacklisted in [[MediaWiki:Bad image list]]
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
                $image->recordUpload2( '', 'zomgnotcensored', 'Borderline image', array(
@@ -891,7 +912,7 @@ class ParserTest {
                        'media_type' => MEDIATYPE_BITMAP,
                        'mime' => 'image/jpeg',
                        'metadata' => serialize( array() ),
-                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                       'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20010115123500' ), $user );
        }
@@ -960,6 +981,8 @@ class ParserTest {
 
                wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
                copy( "$IP/skins/monobook/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
+               wfMkdirParents( $dir . '/e/ea', null, __METHOD__ );
+               copy( "$IP/skins/monobook/wiki.png", "$dir/e/ea/Thumb.png" );
                wfMkdirParents( $dir . '/0/09', null, __METHOD__ );
                copy( "$IP/skins/monobook/headbg.jpg", "$dir/0/09/Bad.jpg" );
 
@@ -1008,6 +1031,8 @@ class ParserTest {
                                "$dir/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
                                "$dir/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
 
+                               "$dir/e/ea/Thumb.png",
+
                                "$dir/0/09/Bad.jpg",
 
                                "$dir/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
@@ -1024,6 +1049,9 @@ class ParserTest {
                                "$dir/thumb/3/3a",
                                "$dir/thumb/3",
 
+                               "$dir/e/ea",
+                               "$dir/e",
+
                                "$dir/0/09/",
                                "$dir/0/",
                                "$dir/thumb",
@@ -1070,10 +1098,12 @@ class ParserTest {
        /**
         * Print a happy success message.
         *
-        * @param $desc String: the test name
+        * Refactored in 1.22 to use ParserTestResult
+        *
+        * @param $testResult ParserTestResult
         * @return Boolean
         */
-       protected function showSuccess( $desc ) {
+       protected function showSuccess( ParserTestResult $testResult ) {
                if ( $this->showProgress ) {
                        print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
                }
@@ -1085,28 +1115,29 @@ class ParserTest {
         * Print a failure message and provide some explanatory output
         * about what went wrong if so configured.
         *
-        * @param $desc String: the test name
-        * @param $result String: expected HTML output
-        * @param $html String: actual HTML output
+        * Refactored in 1.22 to use ParserTestResult
+        *
+        * @param $testResult ParserTestResult
         * @return Boolean
         */
-       protected function showFailure( $desc, $result, $html ) {
+       protected function showFailure( ParserTestResult $testResult ) {
                if ( $this->showFailure ) {
                        if ( !$this->showProgress ) {
                                # In quiet mode we didn't show the 'Testing' message before the
                                # test, in case it succeeded. Show it now:
-                               $this->showTesting( $desc );
+                               $this->showTesting( $testResult->description );
                        }
 
                        print $this->term->color( '31' ) . 'FAILED!' . $this->term->reset() . "\n";
 
                        if ( $this->showOutput ) {
-                               print "--- Expected ---\n$result\n--- Actual ---\n$html\n";
+                               print "--- Expected ---\n{$testResult->expected}\n";
+                               print "--- Actual ---\n{$testResult->actual}\n";
                        }
 
                        if ( $this->showDiffs ) {
-                               print $this->quickDiff( $result, $html );
-                               if ( !$this->wellFormed( $html ) ) {
+                               print $this->quickDiff( $testResult->expected, $testResult->actual );
+                               if ( !$this->wellFormed( $testResult->actual ) ) {
                                        print "XML error: $this->mXmlError\n";
                                }
                        }
@@ -1141,9 +1172,10 @@ class ParserTest {
 
                global $wgDiff3;
                // we assume that people with diff3 also have usual diff
-               $diff = ( wfIsWindows() && !$wgDiff3 )
-                       ? `fc $shellInfile $shellOutfile`
-                       : `diff -au $shellInfile $shellOutfile`;
+               $shellCommand = ( wfIsWindows() && !$wgDiff3 ) ? 'fc' : 'diff -au';
+
+               $diff = wfShellExec( "$shellCommand $shellInfile $shellOutfile" );
+
                unlink( $infile );
                unlink( $outfile );
 
index 251bf23..f7296bd 100644 (file)
@@ -164,6 +164,198 @@ baz
 </p>
 !! end
 
+!! test
+Paragraphs with newline spacing with comment lines in between
+!! input
+----
+a
+<!--foo-->
+b
+----
+a
+<!--foo--><!--More than 1 comment disables stripping of this line!-->
+b
+----
+a
+<!--foo-->
+
+b
+----
+a
+
+<!--foo-->
+b
+----
+a
+<!--foo-->
+
+
+b
+----
+a
+
+
+<!--foo-->
+b
+----
+!! result
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p><br />
+b
+</p>
+<hr />
+<p>a
+</p><p><br />
+b
+</p>
+<hr />
+
+!! end
+
+!! test
+Paragraphs with newline spacing with non-empty white-space lines in between
+!! input
+----
+a
+b
+----
+a
+b
+----
+!! result
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p><br /> 
+b
+</p>
+<hr />
+
+!! end
+
+!! test
+Paragraphs with newline spacing with non-empty mixed comment and white-space lines in between
+!! input
+----
+a
+ <!--foo-->
+b
+----
+a
+ <!--foo--><!--More than 1 comment disables stripping of this line!-->
+b
+----
+a
+<!--foo-->
+ <!--bar-->
+b
+----
+a
+ <!--foo-->
+ <!--bar-->
+b
+----
+!! result
+<hr />
+<p>a
+b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p>b
+</p>
+<hr />
+<p>a
+</p><p><br /> 
+b
+</p>
+<hr />
+
+!! end
+
+!! test
+Extra newlines: More paragraphs with indented comment
+!! input
+a
+
+   <!--boo-->
+
+b
+!!result
+<p>a
+</p><p><br />
+b
+</p>
+!!end
+
+!! test
+Extra newlines followed by heading
+!! input
+a
+
+
+
+=b=
+[[a]]
+
+
+=b=
+!! result
+<p>a
+</p><p><br />
+</p>
+<h1><span class="mw-headline" id="b">b</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: b">edit</a>]</span></h1>
+<p><a href="/index.php?title=A&amp;action=edit&amp;redlink=1" class="new" title="A (page does not exist)">a</a>
+</p><p><br />
+</p>
+<h1><span class="mw-headline" id="b_2">b</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b">edit</a>]</span></h1>
+
+!! end
+
+!! test
+Extra newlines between heading and content are swallowed
+!! input
+=b=
+
+
+
+[[a]]
+!! result
+<h1><span class="mw-headline" id="b">b</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: b">edit</a>]</span></h1>
+<p><a href="/index.php?title=A&amp;action=edit&amp;redlink=1" class="new" title="A (page does not exist)">a</a>
+</p>
+!! end
+
 !! test
 Parsing an URL
 !! input
@@ -224,6 +416,16 @@ Italics and bold
 
 !! end
 
+# this example taken from the simple/Moon article
+!! test
+Italics and possessives
+!! input
+obtained by ''[[Lunar Prospector]]'''s gamma-ray spectrometer
+!! result
+<p>obtained by <i><a href="/index.php?title=Lunar_Prospector&amp;action=edit&amp;redlink=1" class="new" title="Lunar Prospector (page does not exist)">Lunar Prospector</a>'</i>s gamma-ray spectrometer
+</p>
+!! end
+
 ###
 ### 2-quote opening sequence tests
 ###
@@ -258,13 +460,26 @@ Italics and bold: 2-quote opening sequence: (2,4)
 
 
 !! test
-Italics and bold: 2-quote opening sequence: (2,5)
+Italics and bold: 2-quote opening sequence: (2,5) (php)
+!! options
+php
 !! input
 ''foo'''''
 !! result
 <p><i>foo</i>
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 2-quote opening sequence: (2,5) (parsoid)
+!! options
+parsoid
+!! input
+''foo'''''
+!! result
+<p><i>foo</i><b></b>
+</p>
+!!end
 
 
 ###
@@ -302,13 +517,26 @@ Italics and bold: 3-quote opening sequence: (3,4)
 
 
 !! test
-Italics and bold: 3-quote opening sequence: (3,5)
+Italics and bold: 3-quote opening sequence: (3,5) (php)
+!! options
+php
 !! input
 '''foo'''''
 !! result
 <p><b>foo</b>
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 3-quote opening sequence: (3,5) (parsoid)
+!! options
+parsoid
+!! input
+'''foo'''''
+!! result
+<p><b>foo<i></i></b>
+</p>
+!!end
 
 
 ###
@@ -346,13 +574,26 @@ Italics and bold: 4-quote opening sequence: (4,4)
 
 
 !! test
-Italics and bold: 4-quote opening sequence: (4,5)
+Italics and bold: 4-quote opening sequence: (4,5) (php)
+!! options
+php
 !! input
 ''''foo'''''
 !! result
 <p>'<b>foo</b>
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: 4-quote opening sequence: (4,5) (parsoid)
+!! options
+parsoid
+!! input
+''''foo'''''
+!! result
+<p>'<b>foo<i></i></b>
+</p>
+!!end
 
 
 ###
@@ -360,13 +601,26 @@ Italics and bold: 4-quote opening sequence: (4,5)
 ###
 
 !! test
-Italics and bold: 5-quote opening sequence: (5,2)
+Italics and bold: 5-quote opening sequence: (5,2) (php)
+!! options
+php
 !! input
 '''''foo''
 !! result
 <p><b><i>foo</i></b>
 </p>
 !!end
+# Parsoid reverses the nesting order, compared to the PHP parser
+!! test
+Italics and bold: 5-quote opening sequence: (5,2) (parsoid)
+!! options
+parsoid
+!! input
+'''''foo''
+!! result
+<p><i><b>foo</b></i>
+</p>
+!!end
 
 
 !! test
@@ -432,23 +686,49 @@ Italics and bold: multiple quote sequences: (2,4,4)
 
 
 !! test
-Italics and bold: multiple quote sequences: (3,4,2)
+Italics and bold: multiple quote sequences: (3,4,2) (php)
+!! options
+php
 !! input
 '''foo''''bar''
 !! result
 <p><b>foo'</b>bar
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: multiple quote sequences: (3,4,2) (parsoid)
+!! options
+parsoid
+!! input
+'''foo''''bar''
+!! result
+<p><b>foo'</b>bar<i></i>
+</p>
+!!end
 
 
 !! test
-Italics and bold: multiple quote sequences: (3,4,3)
+Italics and bold: multiple quote sequences: (3,4,3) (php)
+!! options
+php
 !! input
 '''foo''''bar'''
 !! result
 <p><b>foo'</b>bar
 </p>
 !!end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+Italics and bold: multiple quote sequences: (3,4,3) (parsoid)
+!! options
+parsoid
+!! input
+'''foo''''bar'''
+!! result
+<p><b>foo'</b>bar<b></b>
+</p>
+!!end
 
 ###
 ### other quote tests
@@ -483,14 +763,32 @@ Italics and bold: other quote tests: (3,2,3,2)
 !!end
 
 
+# The Parsoid team believes the PHP parser's output on this test is wrong.
+# It only checks for convert-to-bold-on-single-character-word when the word
+# matches with a bold tag ("'''") that is *odd* in the list of quote tokens.
+# This means that the bold token in position 2 (0-indexed) gets converted by
+# parsoid, but doesn't get changed by the PHP parser.
 !! test
-Italics and bold: other quote tests: (3,2,3,3)
+Italics and bold: other quote tests: (3,2,3,3) (php)
+!! options
+php
 !! input
 '''this is about ''foo'''s family'''
 !! result
 <p>'<i>this is about </i>foo<b>s family</b>
 </p>
 !!end
+# This is the output the Parsoid team believes to be correct.
+!! test
+Italics and bold: other quote tests: (3,2,3,3) (parsoid)
+!! options
+parsoid
+!! input
+'''this is about ''foo'''s family'''
+!! result
+<p><b>this is about <i>foo'</i>s family</b>
+</p>
+!!end
 
 
 !! test
@@ -837,7 +1135,7 @@ x <div>foo</div> z
 !! end
 
 !! test
-Empty lines between block tags to test open p-tags are closed between the block tags
+Empty lines between lines with block tags
 !! input
 <div></div>
 
@@ -845,6 +1143,12 @@ Empty lines between block tags to test open p-tags are closed between the block
 <div></div>a
 
 b
+<div>a</div>b
+
+<div>b</div>d
+
+
+<div>e</div>
 !! result
 <div></div>
 <p><br />
@@ -852,6 +1156,12 @@ b
 <div></div>a
 <p>b
 </p>
+<div>a</div>b
+<div>b</div>d
+<p><br />
+</p>
+<div>e</div>
+
 !! end
 
 ###
@@ -1920,8 +2230,13 @@ Definition Lists: Nesting: Test 4
 !! end
 
 
+## The Parsoid team believes the following three test exposes a
+## bug in the PHP parser.  (Parsoid team thinks the PHP parser is
+## wrong to close the <dl> after the <dt> containing the <ul>.)
 !! test
-Definition Lists: Mixed Lists: Test 1
+Definition Lists: Mixed Lists: Test 1 (php)
+!! options
+php
 !! input
 :;* foo
 ::* bar
@@ -1936,7 +2251,19 @@ Definition Lists: Mixed Lists: Test 1
 </dd></dl>
 
 !! end
-
+!! test
+Definition Lists: Mixed Lists: Test 1 (parsoid)
+!! options
+parsoid
+!! input
+:;* foo
+::* bar
+:; baz
+!! result
+<dl><dd><dl><dt><ul><li> foo
+</li></ul></dt><dd><ul><li> bar
+</li></ul></dd><dt> baz</dt></dl></dd></dl>
+!! end
 
 !! test
 Definition Lists: Mixed Lists: Test 2
@@ -2068,9 +2395,15 @@ Definition Lists: Mixed Lists: Test 10
 
 !! end
 
+# The Parsoid team disagrees with the PHP parser's seemingly-random
+# rules regarding dd/dt on the next two tests.  Parsoid is more
+# consistent, and recognizes the shared nesting and keeps the
+# still-open tags around until the nesting is complete.
 
 !! test
-Definition Lists: Mixed Lists: Test 11
+Definition Lists: Mixed Lists: Test 11 (php)
+!! options
+php
 !! input
 *#*#;*;;foo :bar
 *#*#;boo :baz
@@ -2088,10 +2421,40 @@ Definition Lists: Mixed Lists: Test 11
 </li></ul>
 
 !! end
-
-
 !! test
-Definition Lists: Weird Ones: Test 1
+Definition Lists: Mixed Lists: Test 11 (parsoid)
+!! options
+parsoid
+!! input
+*#*#;*;;foo :bar
+*#*#;boo :baz
+!! result
+<ul>
+<li>
+<ol>
+<li>
+<ul>
+<li>
+<ol>
+<li>
+<dl>
+<dt>
+<ul>
+<li>
+<dl>
+<dt>
+<dl>
+<dt>foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dd data-parsoid='{"stx":"row"}'>bar</dd></dl></dt></dl></li></ul></dt>
+<dt>boo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dd data-parsoid='{"stx":"row"}'>baz</dd></dl></li></ol></li></ul></li></ol></li></ul>
+!! end
+
+
+!! test
+Definition Lists: Weird Ones: Test 1 (php)
+!! options
+php
 !! input
 *#;*::;; foo : bar (who uses this?)
 !! result
@@ -2105,6 +2468,31 @@ Definition Lists: Weird Ones: Test 1
 </li></ol>
 </li></ul>
 
+!! end
+!! test
+Definition Lists: Weird Ones: Test 1 (parsoid)
+!! options
+parsoid
+!! input
+*#;*::;; foo : bar (who uses this?)
+!! result
+<ul>
+<li>
+<ol>
+<li>
+<dl>
+<dt>
+<ul>
+<li>
+<dl>
+<dd>
+<dl>
+<dd>
+<dl>
+<dt>
+<dl>
+<dt> foo<span typeof="mw:Placeholder" data-parsoid='{"src":" "}'>&nbsp;</span></dt>
+<dd data-parsoid='{"stx":"row"}'> bar (who uses this?)</dd></dl></dt></dl></dd></dl></dd></dl></li></ul></dt></dl></li></ol></li></ul>
 !! end
 
 ###
@@ -2781,7 +3169,9 @@ Normal text. '''''Bold italic text.''''' Normal text.
 
 
 !! test
-Unclosed and unmatched quotes
+Unclosed and unmatched quotes (php)
+!! options
+php
 !! input
 '''''Bold italic text '''with bold deactivated''' in between.'''''
 
@@ -2816,6 +3206,48 @@ Plain ''italic'''s plain
 </p><p>Plain <i>italic'</i>s plain
 </p>
 !! end
+# Parsoid inserts an empty bold tag pair at the end of the line, that the PHP
+# parser strips. The wikitext contains just the first half of the bold
+# quote pair. (There's also a case where Parsoid nests <b> and <i>
+# differently than the PHP parser.)
+!! test
+Unclosed and unmatched quotes (parsoid)
+!! options
+parsoid
+!! input
+'''''Bold italic text '''with bold deactivated''' in between.'''''
+
+'''''Bold italic text ''with italic deactivated'' in between.'''''
+
+'''Bold text..
+
+..spanning two paragraphs (should not work).'''
+
+'''Bold tag left open
+
+''Italic tag left open
+
+Normal text.
+
+<!-- Unmatching number of opening, closing tags: -->
+'''This year''''s election ''should'' beat '''last year''''s.
+
+''Tom'''s car is bigger than ''Susan'''s.
+
+Plain ''italic'''s plain
+!! result
+<p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
+</p><p><i><b>Bold italic text </b></i><b>with italic deactivated<i> in between.</i></b>
+</p><p><b>Bold text..</b>
+</p><p>..spanning two paragraphs (should not work).<b></b>
+</p><p><b>Bold tag left open</b>
+</p><p><i>Italic tag left open</i>
+</p><p>Normal text.
+</p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
+</p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
+</p><p>Plain <i>italic'</i>s plain
+</p>
+!! end
 
 ###
 ### Tables
@@ -2827,16 +3259,30 @@ Plain ''italic'''s plain
 # is the bare minimun required by the spec, see:
 # http://www.w3.org/TR/xhtml-modularization/dtd_module_defs.html#a_module_Basic_Tables
 !! test
-A table with no data.
+A table with no data. (php)
+!! options
+php
+!! input
+{||}
+!! result
+!! end
+# Parsoid team replies: empty table tags are legal in HTML5
+!! test
+A table with no data. (parsoid)
+!! options
+parsoid
 !! input
 {||}
 !! result
+<table></table>
 !! end
 
 # A table with nothing but a caption is invalid XHTML, we might want to render
 # this as <p>caption</p>
 !! test
-A table with nothing but a caption
+A table with nothing but a caption (php)
+!! options
+php
 !! input
 {|
 |+ caption
@@ -2846,6 +3292,18 @@ A table with nothing but a caption
 <caption> caption
 </caption><tr><td></td></tr></table>
 
+!! end
+# Parsoid team replies: table with only a caption is legal in HTML5
+!! test
+A table with nothing but a caption (parsoid)
+!! options
+parsoid
+!! input
+{|
+|+ caption
+|}
+!! result
+<table><caption> caption</caption></table>
 !! end
 
 !! test
@@ -3270,21 +3728,40 @@ Table with row followed by newlines and table heading
 
 !! end
 
+!! test
+Table with empty line following the start tag
+!! input
+{|
+
+|-
+| foo
+|}
+!! result
+<table>
+
+
+<tr>
+<td> foo
+</td></tr></table>
+
+!! end
+
 # FIXME: Preserve the attribute properly (with an empty string as value) in
 # the PHP parser. Parsoid implements the behavior below.
 !! test
 Table attributes with empty value
 !! options
-disabled
+parsoid
 !! input
 {|
 | style=| hello
 |}
 !! result
 <table>
+<tbody>
 <tr>
 <td style=""> hello
-</td></tr></table>
+</td></tr></tbody></table>
 
 !! end
 
@@ -3328,6 +3805,23 @@ b
 
 !! end
 
+!! test
+Table cell with a single comment
+!! input
+{|
+| <!-- c1 -->
+| a
+|}
+!! result
+<table>
+<tr>
+<td>
+</td>
+<td> a
+</td></tr></table>
+
+!! end
+
 # The expected HTML structure in this test is debatable. The PHP parser does
 # not parse this kind of table at all. The main focus for Parsoid is on
 # round-tripping, so this output is ok for now. TODO: revisit!
@@ -3344,7 +3838,6 @@ parsoid
 <table>
 <tbody>
 <tr>
-<td></td>
 <td>foo</td></tr></tbody></table>
 !! end
 
@@ -3563,6 +4056,33 @@ Link containing "<#" and ">#" as a hex sequences
 </p>
 !! end
 
+!! test
+Link containing an equals sign
+!! input
+[[Special:BookSources/isbn=4-00-026157-6]]
+!! result
+<p><a href="/wiki/Special:BookSources/isbn%3D4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a>
+</p>
+!! end
+
+!! article
+Foo~bar
+!! text
+Just a test of an article title containing a tilde.
+!! endarticle
+
+# note that links containing signatures, like [[Foo~~~~]], are
+# massaged by the pre-save transform (PST) and so the tildes are never
+# seen by the parser.
+!! test
+Link containing a tilde
+!! input
+[[Foo~bar]]
+!! result
+<p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a>
+</p>
+!! end
+
 !! test
 Link containing double-single-quotes '' (bug 4598)
 !! input
@@ -3824,6 +4344,69 @@ language=kaa
 </p>
 !! end
 
+!! article
+Söfnuður
+!! text
+Test.
+!! endarticle
+
+!! test
+Internal link with is link prefix
+!! options
+language=is
+!! input
+Aðrir mótmælenda[[söfnuður|söfnuðir]] og
+!! result
+<p>Aðrir <a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a> og
+</p>
+!! end
+
+!! article
+Mótmælendatrú
+!! text
+Test.
+!! endarticle
+
+!! test
+Internal link with is link trail and link prefix
+!! options
+language=is
+!! input
+[[mótmælendatrú|xxx]]ar
+[[mótmælendatrú]]ar
+mótmælenda[[söfnuður]]
+mótmælenda[[söfnuður|söfnuðir]]
+mótmælenda[[söfnuður|söfnuðir]]xxx
+!! result
+<p><a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">xxxar</a>
+<a href="/wiki/M%C3%B3tm%C3%A6lendatr%C3%BA" title="Mótmælendatrú">mótmælendatrúar</a>
+<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuður</a>
+<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðir</a>
+<a href="/wiki/S%C3%B6fnu%C3%B0ur" title="Söfnuður">mótmælendasöfnuðirxxx</a>
+</p>
+!! end
+
+!! test
+Parsoid link trail escaping
+!! options
+parsoid=html2wt,html2html
+!! input
+[[apple]]<nowiki/>s
+!! result
+<p><a rel="mw:WikiLink" href="Apple">apple</a>s</p>
+!! end
+
+!! test
+Parsoid link prefix escaping
+!! options
+language=is
+parsoid=html2wt,html2html
+!! input
+Aðrir mótmælenda<nowiki/>[[söfnuður]]
+!! result
+<p>Aðrir mótmælenda<a rel="mw:WikiLink" href="Söfnuður">söfnuður</a></p>
+!! end
+
 !! test
 Parsoid-centric test: Whitespace in ext- and wiki-links should be preserved
 !! input
@@ -4060,7 +4643,7 @@ Horizontal ruler -- eats additional dashes on the same line
 !! end
 
 !! test
-Horizontal ruler -- does not collaps dashes on consecutive lines
+Horizontal ruler -- does not collapse dashes on consecutive lines
 !! input
 ----
 ----
@@ -4306,9 +4889,9 @@ Nested lists 8 (multiple nesting transitions)
 
 !! test
 Unbalanced closing block tags break a list
-(Disabled since php parser generates broken html -- relies on Tidy to fix up)
+(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
 !! options
-disabled
+parsoid
 !! input
 <div>
 *a</div><div>
@@ -4323,9 +4906,9 @@ disabled
 
 !! test
 Unbalanced closing non-block tags don't break a list
-(Disabled since php parser generates broken html -- relies on Tidy to fix up)
+(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
 !! options
-disabled
+parsoid
 !! input
 <span>
 *a</span><span>
@@ -4340,9 +4923,9 @@ disabled
 
 !! test
 Unclosed formatting tags that straddle lists are closed and reopened
-(Disabled since php parser generates broken html -- relies on Tidy to fix up)
+(Parsoid-only since php parser generates broken html -- relies on Tidy to fix up)
 !! options
-disabled
+parsoid
 !! input
 # <s> a
 # b </s>
@@ -4429,7 +5012,7 @@ List interrupted by empty line or heading
 <ul><li><ul><li> bar
 </li></ul>
 </li></ul>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading"> A heading </span></h2>
+<h2><span class="mw-headline" id="A_heading">A heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a>]</span></h2>
 <ul><li> Another list item
 </li></ul>
 
@@ -4450,6 +5033,26 @@ Multiple list tags generated by templates
 
 !!end
 
+!!test
+Single-comment whitespace lines dont break lists, but multi-comment whitespace lines do
+!!input
+*a
+<!--This line will NOT split the list-->
+*b
+ <!--This line will NOT split the list either-->
+*c
+ <!--foo--> <!--This line with more than 1 comment will split the list-->
+*d
+!!result
+<ul><li>a
+</li><li>b
+</li><li>c
+</li></ul>
+<ul><li>d
+</li></ul>
+
+!!end
+
 ###
 ### Magic Words
 ###
@@ -4613,7 +5216,7 @@ Magic Word: {{NUMBEROFFILES}}
 !! input
 {{NUMBEROFFILES}}
 !! result
-<p>2
+<p>3
 </p>
 !! end
 
@@ -4717,6 +5320,36 @@ Magic Word: {{SITENAME}}
 </p>
 !! end
 
+!! test
+Case-sensitive magic words, when cased differently, should just be template transclusions
+!! input
+{{CurrentMonth}}
+{{currentday}}
+{{cURreNTweEK}}
+{{currentHour}}
+!! result
+<p><a href="/index.php?title=Template:CurrentMonth&amp;action=edit&amp;redlink=1" class="new" title="Template:CurrentMonth (page does not exist)">Template:CurrentMonth</a>
+<a href="/index.php?title=Template:Currentday&amp;action=edit&amp;redlink=1" class="new" title="Template:Currentday (page does not exist)">Template:Currentday</a>
+<a href="/index.php?title=Template:CURreNTweEK&amp;action=edit&amp;redlink=1" class="new" title="Template:CURreNTweEK (page does not exist)">Template:CURreNTweEK</a>
+<a href="/index.php?title=Template:CurrentHour&amp;action=edit&amp;redlink=1" class="new" title="Template:CurrentHour (page does not exist)">Template:CurrentHour</a>
+</p>
+!! end
+
+!! test
+Case-insensitive magic words should still work with weird casing.
+!! input
+{{sErVeRNaMe}}
+{{LCFirst:AOEU}}
+{{ucFIRST:aoeu}}
+{{SERver}}
+!! result
+<p>example.org
+aOEU
+Aoeu
+<a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
+</p>
+!! end
+
 !! test
 Namespace 1 {{ns:1}}
 !! input
@@ -5459,8 +6092,8 @@ Bug 6563: Edit link generation for section shown by <includeonly>
 !! input
 {{includeonly section}}
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Includeonly_section">Includeonly section</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Section_T-1">Section T-1</span></h2>
+<h2><span class="mw-headline" id="Includeonly_section">Includeonly section</span><span class="mw-editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a>]</span></h2>
+<h2><span class="mw-headline" id="Section_T-1">Section T-1</span><span class="mw-editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a>]</span></h2>
 
 !! end
 
@@ -5486,7 +6119,7 @@ Bug 6563: Edit link generation for section suppressed by <includeonly>
 </includeonly>
 ==Section 1==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
+<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span></h2>
 
 !! end
 
@@ -5648,6 +6281,19 @@ bar <div>baz</div>
 
 !!end
 
+!!test
+Templates: P-wrapping: 1d. Template preceded by comment-only line
+!!options
+parsoid=wt2html,wt2wt
+!!input
+<!-- foo -->
+{{echo|Bar}}
+!!result
+<!-- foo -->
+<p typeof="mw:Transclusion">Bar
+</p>
+!!end
+
 !!test
 Templates: Inline Text: 1. Multiple tmeplate uses
 !!input
@@ -5807,6 +6453,15 @@ Templates: HTML Tag: 6. Generation of end piece of HTML attr value
 
 !!end
 
+!!test
+Templates: HTML Tag: 7. Generation of partial attribute key string
+!!input
+<div st{{echo|yle}}="color:red;">foo</div>
+!!result
+<div style="color:red;">foo</div>
+
+!!end
+
 !!test
 Templates: HTML Tables: 1. Generating start of a HTML table
 !!input
@@ -6023,24 +6678,24 @@ Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
 Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
 (PHP parser generates misnested html)
 !! options
-disabled
+parsoid=wt2html,wt2wt
 !!input
 {{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
 !!result
-<p><span><i>a</i></span><i><span>b</span></i><span>c</span><i>d</i><span>e</span></p>
+<p><span typeof="mw:Transclusion"><i>a</i></span><i typeof="mw:Transclusion"><span>b</span></i><span>c</span><i>d</i><span>e</span></p>
 !!end
 
 !!test
 Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
 (PHP parser generates misnested html)
 !! options
-disabled
+parsoid=wt2html,wt2wt
 !!input
 {{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
 !!result
-<div><i>a</i></div>
-<div><i>b</i>c<i>d</i></div>
-<div>e</div>
+<div typeof="mw:Transclusion"><i>a</i></div>
+<div typeof="mw:Transclusion"><i>b</i>c<i>d</i></div>
+<div typeof="mw:Transclusion">e</div>
 !!end
 
 !!test
@@ -6063,10 +6718,10 @@ parsoid
 |bar
 |}
 !!result
-<table  about="#mwt1" typeof="mw:Object/Template ">
-<tbody><tr><td>foo</td></tr></tbody></table><span about="#mwt1">
-bar</span><span about="#mwt1">
-</span>
+<table typeof="mw:Transclusion">
+<tbody>
+<tr>
+<td>foo</td></tr></tbody></table><span>bar</span>
 !!end
 
 !!test
@@ -6095,7 +6750,7 @@ parsoid
   </tr>
 </table>
 !!result
-<table  about="#mwt1" typeof="mw:Object/Template">
+<table  about="#mwt1" typeof="mw:Transclusion">
   <tbody><tr >
     <td >
     <table >
@@ -6274,10 +6929,13 @@ wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
 wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
 !!end
 
+# Leading @ in this template definition works around a limitation
+# in parsoid's parserTests which otherwise strips the <span> from the
+# result (confusing it for a template wrapper)
 !! article
 Template:dangerous
 !!text
-<span onmouseover="alert('crap')">Oh no</span>
+@<span onmouseover="alert('crap')">Oh no</span>
 !!endarticle
 
 !!test
@@ -6285,7 +6943,7 @@ Template:dangerous
 !! input
 {{Template:dangerous}}
 !! result
-<p><span>Oh no</span>
+<p>@<span>Oh no</span>
 </p>
 !! end
 
@@ -6952,6 +7610,8 @@ Image with link parameter (URL target) and unnamed parameter
 
 !! test
 Thumbnail image with link parameter
+!! options
+php
 !! input
 [[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
 !! result
@@ -6960,54 +7620,109 @@ Thumbnail image with link parameter
 !! end
 
 !! test
-Image with frame and link
+Manually-specified thumbnail image
+!! options
+php
 !! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
+[[Image:Foobar.jpg|thumb=Thumb.png|Title]]
 !! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
 
 !! end
 
 !! test
-Image with frame and link and explicit alt
+Manually-specified thumbnail image with explicit link to wiki page
+!! options
+php
 !! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
+[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|Title]]
 !! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
 
 !! end
 
 !! test
-Image with wiki markup in implicit alt
+Manually-specified thumbnail image with explicit link to url
+!! options
+php
 !! input
-[[Image:Foobar.jpg|testing '''bold''' in alt]]
+[[Image:Foobar.jpg|thumb=Thumb.png|link=http://example.com|Title]]
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="http://example.com"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
 !! end
 
 !! test
-Image with wiki markup in explicit alt
+Manually-specified thumbnail image with explicit no link
+!! options
+php
 !! input
-[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
+[[Image:Foobar.jpg|thumb=Thumb.png|link=|Title]]
 !! result
-<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>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" />  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
 !! end
 
 !! test
-Link to image page- image page normally doesn't exists, hence edit link
-Add test with existing image page
-#<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a>
+Manually-specified thumbnail image with explicit link and alt text
+!! options
+php
 !! input
-[[:Image:test]]
+[[Image:Foobar.jpg|thumb=Thumb.png|link=Main Page|alt=alttext|Title]]
 !! result
-<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">Image:test</a>
-</p>
+<div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/Main_Page" title="Main Page"><img alt="alttext" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
 !! end
 
 !! test
-bug 18784  Link to non-existent image page with caption should use caption as link text
+Image with frame and link
+!! input
+[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
+!! result
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+
+!! end
+
+!! test
+Image with frame and link and explicit alt
+!! input
+[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
+!! result
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+
+!! end
+
+!! test
+Image with wiki markup in implicit alt
+!! input
+[[Image:Foobar.jpg|testing '''bold''' in alt]]
+!! result
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! end
+
+!! test
+Image with wiki markup in explicit alt
+!! input
+[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
+!! result
+<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>
+!! end
+
+!! test
+Link to image page- image page normally doesn't exists, hence edit link
+Add test with existing image page
+#<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a>
+!! input
+[[:Image:test]]
+!! result
+<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">Image:test</a>
+</p>
+!! end
+
+!! test
+bug 18784  Link to non-existent image page with caption should use caption as link text
 !! input
 [[:Image:test|caption]]
 !! result
@@ -7237,6 +7952,198 @@ wgEnableUploads=0
 </p>
 !! end
 
+# Parsoid-specific testing for images
+# http://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images
+# Currently imperfect due to a flaw in the Parsoid testrunner
+# Work in progress
+
+!! test
+Parsoid-specific image handling - simple image
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg]]
+!! result
+<p>
+<span class="mw-default-size" typeof="mw:Image">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg" height="220" width="1941">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - simple image without link
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|link=]]
+!! result
+<p>
+<span class="mw-default-size" typeof="mw:Image">
+<span>
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg" height="220" width="1941">
+</span>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - simple image with specific link
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|link=Main Page]]
+!! result
+<p>
+<span class="mw-default-size" typeof="mw:Image">
+<a href="Main_Page">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg" height="220" width="1941">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - simple image with size and middle alignment
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|50px|middle]]
+!! result
+<p>
+<span class="mw-valign-middle" typeof="mw:Image">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - simple image with both sizes, a baseline alignment, and a caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|500x10px|baseline|caption]]
+!! result
+<p>
+<span class="mw-valign-baseline" typeof="mw:Image" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/89px-Foobar.jpg" height="10" width="89">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - simple image with border and size spec
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|50px|border|caption]]
+!! result
+<p>
+<span class="mw-image-border" typeof="mw:Image" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50">
+</a>
+</span>
+</p>
+!! end
+
+!! test
+Parsoid-specific image handling - thumbnail with halign, valign, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|thumb|left|baseline|caption content]]
+!! result
+<figure class="mw-default-size mw-halign-left mw-valign-baseline" typeof="mw:Image/Thumb">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/180px-Foobar.jpg" height="21" width="180" />
+</a>
+<figcaption class="mw-figcaption">caption content</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - thumbnail with specific size, halign, valign, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|thumb|50x50px|right|middle|caption]]
+!! result
+<figure class="mw-halign-right mw-valign-middle" typeof="mw:Image/Thumb">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/50px-Foobar.jpg" height="6" width="50" />
+</a>
+<figcaption class="mw-figcaption">caption</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - framed image with specific size and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|500x50px|frame|caption]]
+!! result
+<figure typeof="mw:Image/Frame">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+<figcaption class="mw-figcaption">caption</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - framed image with specific size, halign, valign, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|500x50px|frame|left|baseline|caption]]
+!! result
+<figure class="mw-halign-left mw-valign-baseline" typeof="mw:Image/Frame">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+<figcaption class="mw-figcaption">caption</figcaption>
+</figure>
+!! end
+
+!! test
+Parsoid-specific image handling - frameless image with specific size, border, and caption
+!! options
+parsoid
+!! input
+[[Image:Foobar.jpg|frameless|500x50px|border|caption]]
+!! result
+<p>
+<span class="mw-image-border" typeof="mw:Image/Frameless" data-mw="{&quot;caption&quot;:&quot;caption&quot;}">
+<a href="File:Foobar.jpg">
+<img resource="./File:Foobar.jpg" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg/442px-Foobar.jpg" height="50" width="442" />
+</a>
+</p>
+!! end
+
+#!! test
+#Parsoid-specific image handling - simple image with a formatted caption
+#!! options
+#parsoid
+#!! input
+#[[Image:Foobar.jpg|<table><tr><td>a</td><td>b</td></tr><tr><td>c</td></tr></table>]]
+#!! result
+#<p>
+#<span typeof="mw:Image">
+#<a class="mw-default-size" href="Image:Foobar.jpg">
+#<img alt="Foobar.jpg" class="mw-default-size" src="http://upload.wikimedia.org/wikipedia/commons/3/3a/Foobar.jpg" height="220" width="1941">
+#</a>
+#<span>abc</span>
+#</span>
+#</p>
+
 
 ###
 ### Subpages
@@ -7494,13 +8401,13 @@ More
 ===Smaller headline===
 Blah blah
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
+<h2><span class="mw-headline" id="Headline_1">Headline 1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span></h2>
 <p>Some text
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
+<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span></h2>
 <p>More
 </p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</span> <span class="mw-headline" id="Smaller_headline">Smaller headline</span></h3>
+<h3><span class="mw-headline" id="Smaller_headline">Smaller headline</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</span></h3>
 <p>Blah blah
 </p>
 !! end
@@ -7539,14 +8446,14 @@ Some text
 </li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1"> Subheadline 1 </span></h3>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level"> Skipping a level </span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2"> Skipping a level </span></h6>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2"> Headline 2 </span></h2>
+<h2><span class="mw-headline" id="Headline_1">Headline 1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span></h2>
+<h3><span class="mw-headline" id="Subheadline_1">Subheadline 1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span></h3>
+<h5><span class="mw-headline" id="Skipping_a_level">Skipping a level</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span></h5>
+<h6><span class="mw-headline" id="Skipping_a_level_2">Skipping a level</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span></h6>
+<h2><span class="mw-headline" id="Headline_2">Headline 2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span></h2>
 <p>Some text
 </p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline" id="Another_headline">Another headline</span></h3>
+<h3><span class="mw-headline" id="Another_headline">Another headline</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span></h3>
 
 !! end
 
@@ -7594,16 +8501,16 @@ Handling of sections up to level 6 and beyond
 </li>
 </ul>
 </td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading"> Level 1 Heading</span></h1>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading"> Level 2 Heading</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading"> Level 3 Heading</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading"> Level 4 Heading</span></h4>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading"> Level 5 Heading</span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading"> Level 6 Heading</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span></h6>
+<h1><span class="mw-headline" id="Level_1_Heading">Level 1 Heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span></h1>
+<h2><span class="mw-headline" id="Level_2_Heading">Level 2 Heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span></h2>
+<h3><span class="mw-headline" id="Level_3_Heading">Level 3 Heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span></h3>
+<h4><span class="mw-headline" id="Level_4_Heading">Level 4 Heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span></h4>
+<h5><span class="mw-headline" id="Level_5_Heading">Level 5 Heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span></h5>
+<h6><span class="mw-headline" id="Level_6_Heading">Level 6 Heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span></h6>
+<h6><span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span></h6>
+<h6><span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span></h6>
+<h6><span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span></h6>
+<h6><span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</span></h6>
 
 !! end
 
@@ -7636,12 +8543,12 @@ TOC regression (bug 9764)
 </li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span></h2>
+<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span></h3>
+<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span></h4>
+<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span></h3>
+<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span></h2>
+<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span></h3>
 
 !! end
 
@@ -7672,12 +8579,12 @@ wgMaxTocLevel=3
 </li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span></h2>
+<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span></h3>
+<h4><span class="mw-headline" id="title_1.1.1">title 1.1.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span></h4>
+<h3><span class="mw-headline" id="title_1.2">title 1.2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span></h3>
+<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span></h2>
+<h3><span class="mw-headline" id="title_2.1">title 2.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span></h3>
 
 !! end
 
@@ -7702,11 +8609,11 @@ wgMaxTocLevel=3
 <li class="toclevel-1 tocsection-5"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1">Section 1.1</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span></h4>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span></h4>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
+<h2><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span></h2>
+<h3><span class="mw-headline" id="Section_1.1">Section 1.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a>]</span></h3>
+<h4><span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a>]</span></h4>
+<h4><span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a>]</span></h4>
+<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a>]</span></h2>
 
 !! end
 
@@ -7717,8 +8624,8 @@ Resolving duplicate section names
 == Foo bar ==
 == Foo bar ==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2"> Foo bar </span></h2>
+<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span></h2>
+<h2><span class="mw-headline" id="Foo_bar_2">Foo bar</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span></h2>
 
 !! end
 
@@ -7728,8 +8635,8 @@ Resolving duplicate section names with differing case (bug 10721)
 == Foo bar ==
 == Foo Bar ==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> Foo Bar </span></h2>
+<h2><span class="mw-headline" id="Foo_bar">Foo bar</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span></h2>
+<h2><span class="mw-headline" id="Foo_Bar_2">Foo Bar</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span></h2>
 
 !! end
 
@@ -7748,10 +8655,10 @@ __NOTOC__
 {{sections}}
 ==Section 4==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</span> <span class="mw-headline" id="Section_0">Section 0</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</span> <span class="mw-headline" id="Section_4">Section 4</span></h2>
+<h2><span class="mw-headline" id="Section_0">Section 0</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</span></h2>
+<h3><span class="mw-headline" id="Section_1">Section 1</span><span class="mw-editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a>]</span></h3>
+<h2><span class="mw-headline" id="Section_2">Section 2</span><span class="mw-editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a>]</span></h2>
+<h2><span class="mw-headline" id="Section_4">Section 4</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</span></h2>
 
 !! end
 
@@ -7762,8 +8669,8 @@ __NOEDITSECTION__
 ==Section 1==
 ==Section 2==
 !! result
-<h2> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h2> <span class="mw-headline" id="Section_2">Section 2</span></h2>
+<h2><span class="mw-headline" id="Section_1">Section 1</span></h2>
+<h2><span class="mw-headline" id="Section_2">Section 2</span></h2>
 
 !! end
 
@@ -7772,7 +8679,7 @@ Link inside a section heading
 !! input
 ==Section with a [[Main Page|link]] in it==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</span> <span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span></h2>
+<h2><span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</span></h2>
 
 !! end
 
@@ -7794,9 +8701,9 @@ __TOC__
 <li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
+<h2><span class="mw-headline" id="title_1">title 1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span></h2>
+<h3><span class="mw-headline" id="title_1.1">title 1.1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span></h3>
+<h2><span class="mw-headline" id="title_2">title 2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span></h2>
 
 !! end
 
@@ -7818,10 +8725,10 @@ The line above must have a trailing space!
 --> <!-- -->
 But just in case it doesn't...
 !! result
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D">=</span></h1>
+<h1><span class="mw-headline" id=".3D">=</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a>]</span></h1>
 <p>The line above must have a trailing space!
 </p>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D_2">=</span></h1>
+<h1><span class="mw-headline" id=".3D_2">=</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a>]</span></h1>
 <p>But just in case it doesn't...
 </p>
 !! end
@@ -7857,19 +8764,19 @@ section 5
 <li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text"> text &gt; text </span></h2>
+<h2><span class="mw-headline" id="text_.3E_text">text &gt; text</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span></h2>
 <p>section 1
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text"> text &lt; text </span></h2>
+<h2><span class="mw-headline" id="text_.3C_text">text &lt; text</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span></h2>
 <p>section 2
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span> <span class="mw-headline" id="text_.26_text"> text &amp; text </span></h2>
+<h2><span class="mw-headline" id="text_.26_text">text &amp; text</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span></h2>
 <p>section 3
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text"> text ' text </span></h2>
+<h2><span class="mw-headline" id="text_.27_text">text ' text</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span></h2>
 <p>section 4
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span> <span class="mw-headline" id="text_.22_text"> text " text </span></h2>
+<h2><span class="mw-headline" id="text_.22_text">text " text</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span></h2>
 <p>section 5
 </p>
 !! end
@@ -7891,10 +8798,49 @@ Headers with excess '=' characters
 <li class="toclevel-1 tocsection-4"><a href="#.3Ditalic_heading"><span class="tocnumber">4</span> <span class="toctext">=<i>italic</i> heading</span></a></li>
 </ul>
 </td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: foo=">edit</a>]</span> <span class="mw-headline" id="foo.3D">foo=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a>]</span> <span class="mw-headline" id=".3Dfoo">=foo</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a>]</span> <span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span></h1>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a>]</span> <span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span></h1>
+<h1><span class="mw-headline" id="foo.3D">foo=</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: foo=">edit</a>]</span></h1>
+<h1><span class="mw-headline" id=".3Dfoo">=foo</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =foo">edit</a>]</span></h1>
+<h1><span class="mw-headline" id="italic_heading.3D"><i>italic</i> heading=</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: italic heading=">edit</a>]</span></h1>
+<h1><span class="mw-headline" id=".3Ditalic_heading">=<i>italic</i> heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: =italic heading">edit</a>]</span></h1>
+
+!! end
+
+!! test
+HTML headers vs TOC (bug 23393)
+(__NOEDITSECTION__ for clearer output, doesn't matter here)
+!! input
+<h1>Header 1</h1>
+== Header 1.1 ==
+== Header 1.2 ==
+
+<h1>Header 2
+</h1>
+== Header 2.1 ==
+== Header 2.2 ==
+__NOEDITSECTION__
+!! result
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-1"><a href="#Header_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Header 1.1</span></a></li>
+<li class="toclevel-2 tocsection-2"><a href="#Header_1.2"><span class="tocnumber">1.2</span> <span class="toctext">Header 1.2</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#Header_2"><span class="tocnumber">2</span> <span class="toctext">Header 2</span></a>
+<ul>
+<li class="toclevel-2 tocsection-3"><a href="#Header_2.1"><span class="tocnumber">2.1</span> <span class="toctext">Header 2.1</span></a></li>
+<li class="toclevel-2 tocsection-4"><a href="#Header_2.2"><span class="tocnumber">2.2</span> <span class="toctext">Header 2.2</span></a></li>
+</ul>
+</li>
+</ul>
+</td></tr></table>
+<h1><span class="mw-headline" id="Header_1">Header 1</span></h1>
+<h2><span class="mw-headline" id="Header_1.1">Header 1.1</span></h2>
+<h2><span class="mw-headline" id="Header_1.2">Header 1.2</span></h2>
+<h1><span class="mw-headline" id="Header_2">Header 2</span></h1>
+<h2><span class="mw-headline" id="Header_2.1">Header 2.1</span></h2>
+<h2><span class="mw-headline" id="Header_2.2">Header 2.2</span></h2>
 
 !! end
 
@@ -7990,7 +8936,7 @@ div with illegal double attributes
 !! test
 div with empty attribute value, space before equals
 !! options
-disabled
+parsoid
 !! input
 <div class =>HTML rocks</div>
 !! result
@@ -8003,7 +8949,7 @@ disabled
 !! test
 div with braces in attribute value
 !! options
-disabled
+parsoid
 !! input
 <div title="{}">Foo</div>
 !! result
@@ -8020,7 +8966,7 @@ disabled
 !! test
 div with empty attribute value, no space before equals
 !! options
-disabled
+parsoid
 !! input
 <div class=>HTML rocks</div>
 !! result
@@ -9181,7 +10127,7 @@ Fuzz testing: Parser14
 == onmouseover= ==
 http://__TOC__
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D"> onmouseover= </span></h2>
+<h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span></h2>
 http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
@@ -9196,7 +10142,7 @@ Fuzz testing: Parser14-table
 ==a==
 {| STYLE=__TOC__
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</span> <span class="mw-headline" id="a">a</span></h2>
+<h2><span class="mw-headline" id="a">a</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</span></h2>
 <table style="&#95;_TOC&#95;_">
 <tr><td></td></tr>
 </table>
@@ -9342,7 +10288,7 @@ Fuzz testing: image with bogus manual thumbnail
 !!input
 [[Image:foobar.jpg|thumbnail= ]]
 !!result
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
 
 !!end
 
@@ -10360,11 +11306,23 @@ Handling of &#x0A; in URLs
 !!end
 
 !! test
-5 quotes, code coverage +1 line
+5 quotes, code coverage +1 line (php)
+!! options
+php
 !! input
 '''''
 !! result
 !! end
+# The PHP parser strips the empty tags out for giggles; parsoid doesn't.
+!! test
+5 quotes, code coverage +1 line (parsoid)
+!! options
+parsoid
+!! input
+'''''
+!! result
+<p><i><b></b></i></p>
+!! end
 
 !! test
 Special:Search page linking.
@@ -10382,6 +11340,8 @@ Say the magic word
 * {{BASEPAGENAME}}
 * {{SUBPAGENAME}}
 * {{SUBPAGENAMEE}}
+* {{ROOTPAGENAME}}
+* {{ROOTPAGENAMEE}}
 * {{BASEPAGENAME}}
 * {{BASEPAGENAMEE}}
 * {{TALKPAGENAME}}
@@ -10402,6 +11362,8 @@ Say the magic word
 </li><li> Parser_test
 </li><li> Parser test
 </li><li> Parser_test
+</li><li> Parser test
+</li><li> Parser_test
 </li><li> Talk:Parser test
 </li><li> Talk:Parser_test
 </li><li> Parser test
@@ -10977,7 +11939,7 @@ Inclusion of !userCanEdit() content
 !! input
 {{MediaWiki:Fake}}
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a>]</span> <span class="mw-headline" id="header">header</span></h2>
+<h2><span class="mw-headline" id="header">header</span><span class="mw-editsection">[<a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a>]</span></h2>
 
 !! end
 
@@ -11008,12 +11970,12 @@ Out-of-order TOC heading levels
 </li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2">2</span></h2>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a>]</span> <span class="mw-headline" id="6">6</span></h6>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a>]</span> <span class="mw-headline" id="3">3</span></h3>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a>]</span> <span class="mw-headline" id="1">1</span></h1>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a>]</span> <span class="mw-headline" id="5">5</span></h5>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2_2">2</span></h2>
+<h2><span class="mw-headline" id="2">2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a>]</span></h2>
+<h6><span class="mw-headline" id="6">6</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a>]</span></h6>
+<h3><span class="mw-headline" id="3">3</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a>]</span></h3>
+<h1><span class="mw-headline" id="1">1</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a>]</span></h1>
+<h5><span class="mw-headline" id="5">5</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a>]</span></h5>
+<h2><span class="mw-headline" id="2_2">2</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a>]</span></h2>
 
 !! end
 
@@ -11120,7 +12082,7 @@ anchorencode encodes like the TOC generator: (bug 18431)
 {{anchorencode: _ +:.3A%3A&&amp;]] }}
 __NOEDITSECTION__
 !! result
-<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D"> _ +:.3A%3A&amp;&amp;]] </span></h3>
+<h3><span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D">_ +:.3A%3A&amp;&amp;]]</span></h3>
 <p>.2B:.3A.253A.26.26.5D.5D
 </p>
 !! end
@@ -11169,6 +12131,27 @@ bar
 </pre>
 !! end
 
+!!test
+Parsing of overlapping (improperly nested) inline html tags (PHP parser)
+!!options
+php
+!!input
+<span><s>x</span></s>
+!!result
+<p><span><s>x&lt;/span&gt;</s></span>
+</p>
+!!end
+
+!!test
+Parsing of overlapping (improperly nested) inline html tags (Parsoid)
+!!options
+parsoid
+!!input
+<span><s>x</span></s>
+!!result
+<p><span><s>x</s></span><s></s>
+</p>
+!!end
 
 ###
 ### Language variants related tests
@@ -11350,7 +12333,7 @@ language=sr variant=sr-ec
 !! input
 == -{Naslov}- ==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-"> Naslov </span></h2>
+<h2><span class="mw-headline" id="-.7BNaslov.7D-">Naslov</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span></h2>
 
 !! end
 
@@ -11463,6 +12446,30 @@ This won't take interferes with the title rule.
 </p>
 !! end
 
+!! test
+Partly disable title conversion if variant == main language code
+!! options
+language=zh variant=zh title=[[ZH]] showtitle
+!! input
+-{T|zh-cn:CN;zh-tw:TW}-
+!! result
+ZH
+<p>
+</p>
+!! end
+
+!! test
+Partly disable title conversion if variant == main language code, more
+!! options
+language=zh variant=zh title=[[ZH]] showtitle
+!! input
+-{T|TW}-
+!! result
+ZH
+<p>
+</p>
+!! end
+
 !! test
 Raw output of variant escape tags (R flag)
 !! options
@@ -11667,7 +12674,7 @@ Morwen/13: Unclosed link followed by heading
 !! result
 <p>[[link
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
+<h2><span class="mw-headline" id="heading">heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span></h2>
 
 !! end
 
@@ -11679,7 +12686,7 @@ HHP2.1: Heuristics for headings in preprocessor parenthetical structures
 !! result
 <p>{{foo|
 </p>
-<h1> <span class="mw-headline" id="heading">heading</span></h1>
+<h1><span class="mw-headline" id="heading">heading</span></h1>
 
 !! end
 
@@ -11691,7 +12698,7 @@ HHP2.2: Heuristics for headings in preprocessor parenthetical structures
 !! result
 <p>{{foo|
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
+<h2><span class="mw-headline" id="heading">heading</span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span></h2>
 
 !! end
 
@@ -12282,6 +13289,40 @@ Screen
 </p>
 !! end
 
+!! test
+Verify that displaytitle handles inline CSS styles (bug 26547) - rejected value
+!! options
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=true
+!! input
+this is not the the title
+{{DISPLAYTITLE:<span style="display: none;">s</span>creen}}
+!! result
+<span style="/* attempt to bypass $wgRestrictDisplayTitle */">s</span>creen
+<p>this is not the the title
+</p>
+!! end
+
+!! test
+Verify that displaytitle handles inline CSS styles (bug 26547) - accepted value
+!! options
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=true
+!! input
+this is not the the title
+{{DISPLAYTITLE:<span style="color: red;">s</span>creen}}
+!! result
+<span style="color: red;">s</span>creen
+<p>this is not the the title
+</p>
+!! end
+
 !! test
 preload: check <noinclude> and <includeonly>
 !! options
@@ -12511,7 +13552,7 @@ __TOC__
 <li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"> <i>Lost</i> episodes </span></h2>
+<h2><span class="mw-headline" id="Lost_episodes"><i>Lost</i> episodes</span><span class="mw-editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span></h2>
 
 !! end
 
@@ -12528,7 +13569,7 @@ __TOC__
 <li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"> <b>should be bold</b> then normal text </span></h2>
+<h2><span class="mw-headline" id="should_be_bold_then_normal_text"><b>should be bold</b> then normal text</span><span class="mw-editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span></h2>
 
 !! end
 
@@ -12545,7 +13586,7 @@ __TOC__
 <li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image"> Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> </span></h2>
+<h2><span class="mw-headline" id="Image">Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></span><span class="mw-editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span></h2>
 
 !! end
 
@@ -12562,7 +13603,7 @@ __TOC__
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"> <blockquote>Quote</blockquote> </span></h2>
+<h2><span class="mw-headline" id="Quote"><blockquote>Quote</blockquote></span><span class="mw-editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span></h2>
 
 !! end
 
@@ -12581,7 +13622,7 @@ QED
 <li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3"> Proof: 2 &lt; 3 </span></h2>
+<h2><span class="mw-headline" id="Proof:_2_.3C_3">Proof: 2 &lt; 3</span><span class="mw-editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span></h2>
 <p><small>Hanc marginis exiguitas non caperet.</small>
 QED
 </p>
@@ -12601,8 +13642,8 @@ __TOC__
 <li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"> <i>Foo</i> <b>Bar</b> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> <i>Foo</i> <blockquote>Bar</blockquote> </span></h2>
+<h2><span class="mw-headline" id="Foo_Bar"><i>Foo</i> <b>Bar</b></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a>]</span></h2>
+<h2><span class="mw-headline" id="Foo_Bar_2"><i>Foo</i> <blockquote>Bar</blockquote></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span></h2>
 
 !! end
 
@@ -12620,8 +13661,8 @@ __TOC__
 <li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"> <sup class="in-h2">Hello</sup> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"> <sup> b"&gt;Evilbye</sup> </span></h2>
+<h2><span class="mw-headline" id="Hello"><sup class="in-h2">Hello</sup></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a>]</span></h2>
+<h2><span class="mw-headline" id="b.22.3EEvilbye"><sup> b"&gt;Evilbye</sup></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span></h2>
 
 !! end
 
@@ -12648,11 +13689,11 @@ __TOC__
 <li class="toclevel-1 tocsection-5"><a href="#Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">5</span> <span class="toctext"><span dir="ltr">Attributes after dir on these span tags must be deleted from the TOC</span></span></a></li>
 </ul>
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: C++">edit</a>]</span> <span class="mw-headline" id="C.2B.2B"> <span dir="ltr">C++</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a>]</span> <span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"> <span dir="rtl">זבנג!</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"> <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> </span></h2>
+<h2><span class="mw-headline" id="C.2B.2B"><span dir="ltr">C++</span></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: C++">edit</a>]</span></h2>
+<h2><span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"><span dir="rtl">זבנג!</span></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a>]</span></h2>
+<h2><span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a>]</span></h2>
+<h2><span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a>]</span></h2>
+<h2><span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a>]</span></h2>
 
 !! end
 
@@ -12669,7 +13710,7 @@ title=[[Main Page]]
 !! input
 {{int:Bug32057}}
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text"> Headline text </span></h2>
+<h2><span class="mw-headline" id="Headline_text">Headline text</span><span class="mw-editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span></h2>
 
 !! end
 
@@ -12771,7 +13812,7 @@ nowiki inside link inside heading (bug 18295)
 !! input
 ==[[foo|x<nowiki>y</nowiki>z]]==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a>]</span> <span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span></h2>
+<h2><span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span><span class="mw-editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a>]</span></h2>
 
 !! end
 
@@ -12931,25 +13972,30 @@ HttP://MediaWiki.Org/
 !!test
 1. SOL-sensitive wikitext tokens as template-args
 !!options
-disabled
+parsoid=wt2html,wt2wt
 !!input
 {{echo|*a}}
 {{echo|#a}}
 {{echo|:a}}
 !!result
-<p>*a
-#a
-:a
-</p>
+<span about="#mwt1" typeof="mw:Transclusion">
+</span><ul about="#mwt1"><li>a</li></ul>
+<span about="#mwt2" typeof="mw:Transclusion">
+</span><ol about="#mwt2"><li>a</li></ol>
+<span about="#mwt3" typeof="mw:Transclusion">
+</span><dl about="#mwt3"><dd>a</dd></dl>
 !!end
 
 #### The following section of tests are primarily to test
-#### wikitext escaping capabilities of Parsoid.
-#### A lot of the tests are disabled for the PHP parser either
-#### because of minor newline diffs or other reasons.
-#### As Parsoid serializer can handle newlines and other HTML
-#### more robustly, some of these tests might get reenabled
-#### for the PHP parser.
+#### wikitext escaping capabilities of Parsoid.  Given that
+#### escaping can be done any number of ways, the wikitext (input)
+#### is always adjusted to reflect how Parsoid adds nowiki
+#### escape tags.
+####
+#### We are marking several tests as parsoid-only since the
+#### HTML in the result section is different from what the
+#### PHP parser generates for it.
+
 
 #### --------------- Headings ---------------
 #### 0. Unnested
@@ -12962,20 +14008,30 @@ disabled
 #### ----------------------------------------
 !! test
 Headings: 0. Unnested
+!! options
+parsoid
 !! input
 <nowiki>=foo=</nowiki>
 
-<nowiki>=foo</nowiki>''a''=
+<nowiki> =foo= </nowiki>
+<!--cmt-->
+<nowiki>=foo=</nowiki>
+
+=foo''a''<nowiki>=</nowiki>
 !! result
-<p>=foo=
-</p><p>=foo<i>a</i>=
-</p>
+<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
 
 !! test
 Headings: 1. Nested inside html
 !! options
-disabled
+parsoid
 !! input
 =<nowiki>=foo=</nowiki>=
 ==<nowiki>=foo=</nowiki>==
@@ -12984,18 +14040,18 @@ disabled
 =====<nowiki>=foo=</nowiki>=====
 ======<nowiki>=foo=</nowiki>======
 !! result
-<h1>=foo=</h1>
-<h2>=foo=</h2>
-<h3>=foo=</h3>
-<h4>=foo=</h4>
-<h5>=foo=</h5>
-<h6>=foo=</h6>
+<h1><span typeof="mw:Nowiki">=foo=</span></h1>
+<h2><span typeof="mw:Nowiki">=foo=</span></h2>
+<h3><span typeof="mw:Nowiki">=foo=</span></h3>
+<h4><span typeof="mw:Nowiki">=foo=</span></h4>
+<h5><span typeof="mw:Nowiki">=foo=</span></h5>
+<h6><span typeof="mw:Nowiki">=foo=</span></h6>
 !!end
 
 !! test
 Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
 !! options
-disabled
+parsoid
 !! input
 =foo=
 <nowiki>*bar</nowiki>
@@ -13012,44 +14068,63 @@ disabled
 !! test
 Headings: 3. Nested inside html with wikitext split by html tags
 !! options
-disabled
+parsoid
 !! input
-=<nowiki>=</nowiki>'''bold'''foo==
+=='''bold'''<nowiki>foo=</nowiki>=
 !! result
-<h1>=<b>bold</b>foo=</h1>
+<h1>=<b>bold</b><span typeof="mw:Nowiki">foo=</span></h1>
 !!end
 
 !! test
-Headings: 4. No escaping needed (testing just h1 and h2)
+Headings: 4a. No escaping needed (testing just h1 and h2)
 !! options
-disabled
+parsoid
 !! input
 ==foo=
 =foo==
+= =foo= =
+==foo= bar=
 ===foo==
 ==foo===
 =''=''foo==
-===
+=<nowiki>=</nowiki>=
 !! result
 <h1>=foo</h1>
 <h1>foo=</h1>
+<h1> =foo= </h1>
+<h1>=foo= bar</h1>
 <h2>=foo</h2>
 <h2>foo=</h2>
 <h1><i>=</i>foo=</h1>
-<h1>=</h1>
+<h1><span typeof="mw:Nowiki">=</span></h1>
+!!end
+
+!! test
+Headings: 4b. No escaping needed (inside p-tags)
+!! options
+parsoid
+!! input
+===
+=foo= x
+=foo= <s></s>
+!! result
+<p>===
+=foo= x
+=foo= <s></s>
+</p>
 !!end
 
 !! test
 Headings: 5. Empty headings
 !! options
-disabled
+parsoid
 !! input
-=<nowiki></nowiki>=
-==<nowiki></nowiki>==
-===<nowiki></nowiki>===
-====<nowiki></nowiki>====
-=====<nowiki></nowiki>=====
-======<nowiki></nowiki>======
+=<nowiki/>=
+==<nowiki/>==
+===<nowiki/>===
+====<nowiki/>====
+=====<nowiki/>=====
+======<nowiki/>======
 !! result
 <h1></h1>
 <h2></h2>
@@ -13062,12 +14137,13 @@ disabled
 !! test
 Headings: 6. Heading chars in SOL context
 !! options
-disabled
+parsoid
 !! input
 <!--cmt--><nowiki>=h1=</nowiki>
+<!--cmt--><nowiki> =h1= </nowiki>
 !! result
-<p><!--cmt-->=h1=
-</p>
+<p><!--cmt--><span typeof="mw:Nowiki">=h1=</span>
+<!--cmt--><span typeof="mw:Nowiki"> =h1= </span></p>
 !!end
 
 #### --------------- Lists ---------------
@@ -13172,7 +14248,7 @@ Lists: 3. Only bullets at start of text should be escaped
 !! test
 Lists: 4. No escapes needed
 !! options
-disabled
+parsoid
 !! input
 *foo*bar
 
@@ -13184,7 +14260,7 @@ disabled
 </li></ul>
 <ul><li><i>foo</i>*bar
 </li></ul>
-<ul><li><a href="Foo" rel="mw:WikiLink">Foo</a>: bar
+<ul><li><a rel="mw:WikiLink" href="Foo">Foo</a>: bar
 </li></ul>
 !!end
 
@@ -13197,9 +14273,11 @@ Lists: 5. No unnecessary escapes
 
 *[[bar <span><nowiki>[[foo]]</nowiki></span>
 
-*<nowiki>]]bar </nowiki><span><nowiki>[[foo]]</nowiki></span>
+*]]bar <span><nowiki>[[foo]]</nowiki></span>
 
 *=bar <span>foo]]</span>=
+
+* <s></s>: a
 !! result
 <ul><li> bar <span>[[foo]]</span>
 </li></ul>
@@ -13211,18 +14289,19 @@ Lists: 5. No unnecessary escapes
 </li></ul>
 <ul><li>=bar <span>foo]]</span>=
 </li></ul>
+<ul><li> <s></s>: a
+</li></ul>
 
 !!end
 
 !! test
 Lists: 6. Escape bullets in SOL position
 !! options
-disabled
+parsoid
 !! input
 <!--cmt--><nowiki>*foo</nowiki>
 !! result
-<p><!--cmt-->*foo
-</p>
+<p><!--cmt--><span typeof="mw:Nowiki">*foo</span></p>
 !!end
 
 !! test
@@ -13243,18 +14322,15 @@ Lists: 7. Escape bullets in a multi-line context
 !! test
 HRs: 1. Single line
 !! options
-disabled
+parsoid
 !! input
-----
-<nowiki>----</nowiki>
-----
-<nowiki>=foo=</nowiki>
-----
-<nowiki>*foo</nowiki>
+----<nowiki>----</nowiki>
+----=foo=
+----*foo
 !! result
-<hr/>----
-<hr/>=foo=
-<hr/>*foo
+<hr><span typeof="mw:Nowiki">----</span>
+<hr>=foo=
+<hr>*foo
 !! end
 
 #### --------------- Tables ---------------
@@ -13317,99 +14393,90 @@ Tables: 1d. No escaping needed
 !! test
 Tables: 2a. Nested in td
 !! options
-disabled
+parsoid
 !! input
 {|
 |<nowiki>foo|bar</nowiki>
 |}
 !! result
-<table>
-<tr><td>foo|bar
-</td></tr></table>
-
+<table><tbody><tr>
+<td><span typeof="mw:Nowiki">foo|bar</span></td></tr></tbody></table>
 !! end
 
 !! test
 Tables: 2b. Nested in td
 !! options
-disabled
+parsoid
 !! input
 {|
 |<nowiki>foo||bar</nowiki>
 |''it''<nowiki>foo||bar</nowiki>
 |}
 !! result
-<table>
-<tr><td>foo||bar
-</td><td><i>it</i>foo||bar
-</td></tr></table>
-
+<table><tbody><tr>
+<td><span typeof="mw:Nowiki">foo||bar</span></td>
+<td><i>it</i><span typeof="mw:Nowiki">foo||bar</span></td></tr></tbody></table>
 !! end
 
 !! test
 Tables: 2c. Nested in td -- no escaping needed
 !! options
-disabled
+parsoid
 !! input
 {|
 |foo!!bar
 |}
 !! result
-<table>
-<tr><td>foo!!bar
-</td></tr></table>
+<table><tbody><tr><td>foo!!bar
+</td></tr></tbody></table>
 
 !! end
 
 !! test
 Tables: 3a. Nested in th
 !! options
-disabled
+parsoid
 !! input
 {|
 !foo!bar
 |}
 !! result
-<table>
-<tr><th>foo!bar
-</th></tr></table>
+<table><tbody><tr><th>foo!bar
+</th></tr></tbody></table>
 
 !! end
 
 !! test
 Tables: 3b. Nested in th
 !! options
-disabled
+parsoid
 !! input
 {|
 !<nowiki>foo!!bar</nowiki>
 |}
 !! result
 <table>
-<tr><th>foo!!bar
-</th></tr></table>
-
+<tbody><tr><th><span typeof="mw:Nowiki">foo!!bar</span></th></tr>
+</tbody></table>
 !! end
 
 !! test
 Tables: 3c. Nested in th -- no escaping needed
 !! options
-disabled
+parsoid
 !! input
 {|
-!foo||bar
+!<nowiki>foo||bar</nowiki>
 |}
 !! result
-<table>
-<tr><th>foo||bar
-</th></tr></table>
-
+<table><tbody><tr>
+<th><span typeof="mw:Nowiki">foo||bar</span></th></tr></tbody></table>
 !! end
 
 !! test
 Tables: 4a. Escape -
 !! options
-disabled
+parsoid
 !! input
 {|
 |-
@@ -13420,14 +14487,14 @@ disabled
 !! result
 <table><tbody>
 <tr><th>-bar</th></tr>
-<tr><td>-bar</td></tr>
-</tbody></table>
+<tr>
+<td><span typeof="mw:Nowiki">-bar</span></td></tr></tbody></table>
 !! end
 
 !! test
 Tables: 4b. Escape +
 !! options
-disabled
+parsoid
 !! input
 {|
 |-
@@ -13438,14 +14505,14 @@ disabled
 !! result
 <table><tbody>
 <tr><th>+bar</th></tr>
-<tr><td>+bar</td></tr>
-</tbody></table>
+<tr>
+<td><span typeof="mw:Nowiki">+bar</span></td></tr></tbody></table>
 !! end
 
 !! test
 Tables: 4c. No escaping needed
 !! options
-disabled
+parsoid
 !! input
 {|
 |-
@@ -13462,8 +14529,16 @@ disabled
 </tbody></table>
 !! end
 
+### SSS FIXME: Disabled right now because accurate html2wt
+### on this snippet requires data-parsoid flags that we've
+### stripped out of these tests.  We should scheme how we
+### we want to handle these kind of tests that require
+### data-parsoid flags for accurate html2wt serialization
+
 !! test
 Tables: 4d. No escaping needed
+!! options
+disabled
 !! input
 {|
 ||+1
@@ -13489,7 +14564,7 @@ Tables: 4d. No escaping needed
 !! test
 Links 1. Quote marks in link text
 !! options
-disabled
+parsoid
 !! input
 [[Foo|<nowiki>Foo''boo''</nowiki>]]
 !! result
@@ -13499,15 +14574,18 @@ disabled
 !! test
 Links 2. WikiLinks: Escapes needed
 !! options
-disabled
+parsoid
 !! input
 [[Foo|<nowiki>[Foobar]</nowiki>]]
 [[Foo|<nowiki>Foobar]</nowiki>]]
-[[Foo|<nowiki>x [Foobar] x</nowiki>]]
+[[Foo|x [Foobar] x]]
 [[Foo|<nowiki>x [http://google.com g] x</nowiki>]]
 [[Foo|<nowiki>[[Bar]]</nowiki>]]
 [[Foo|<nowiki>x [[Bar]] x</nowiki>]]
 [[Foo|<nowiki>|Bar</nowiki>]]
+[[Foo|<nowiki>]]bar</nowiki>]]
+[[Foo|<nowiki>[[bar</nowiki>]]
+[[Foo|<nowiki>x ]] y [[ z</nowiki>]]
 !! result
 <a href="Foo" rel="mw:WikiLink">[Foobar]</a>
 <a href="Foo" rel="mw:WikiLink">Foobar]</a>
@@ -13516,12 +14594,15 @@ disabled
 <a href="Foo" rel="mw:WikiLink">[[Bar]]</a>
 <a href="Foo" rel="mw:WikiLink">x [[Bar]] x</a>
 <a href="Foo" rel="mw:WikiLink">|Bar</a>
+<a href="Foo" rel="mw:WikiLink">]]bar</a>
+<a href="Foo" rel="mw:WikiLink">[[bar</a>
+<a href="Foo" rel="mw:WikiLink">x ]] y [[ z</a>
 !! end
 
 !! test
 Links 3. WikiLinks: No escapes needed
 !! options
-disabled
+parsoid
 !! input
 [[Foo|[Foobar]]
 [[Foo|foo|bar]]
@@ -13533,7 +14614,7 @@ disabled
 !! test
 Links 4. ExtLinks: Escapes needed
 !! options
-disabled
+parsoid
 !! input
 [http://google.com <nowiki>[google]</nowiki>]
 [http://google.com <nowiki>google]</nowiki>]
@@ -13545,7 +14626,7 @@ disabled
 !! test
 Links 5. ExtLinks: No escapes needed
 !! options
-disabled
+parsoid
 !! input
 [http://google.com [google]
 !! result
@@ -13617,9 +14698,9 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 
 [[bar <span><nowiki>[[foo]]</nowiki></span>
 
-<nowiki>]]bar </nowiki><span><nowiki>[[foo]]</nowiki></span>
+]]bar <span><nowiki>[[foo]]</nowiki></span>
 
-<nowiki>=bar </nowiki><span>foo]]</span>=
+=bar <span>foo]]</span><nowiki>=</nowiki>
 !! result
 <p>bar <span>[[foo]]</span>
 </p><p>=bar <span>[[foo]]</span>
@@ -13635,7 +14716,7 @@ bar <span><nowiki>[[foo]]</nowiki></span>
 !! test
 1. Leading space in SOL context should be escaped
 !! options
-disabled
+parsoid
 !! input
 <nowiki> foo</nowiki>
 <!--cmt--><nowiki> foo</nowiki>
@@ -13653,7 +14734,7 @@ disabled
 !! test
 1. a tags
 !! options
-disabled
+parsoid
 !! input
 <a href="http://google.com">google</a>
 !! result
@@ -13693,8 +14774,8 @@ Escaping nowikis
 <p>&lt;nowiki&gt;foo&lt;/nowiki&gt;
 </p>
 !! end
-
 !! test
+
 Tag-like HTML structures are passed through as text
 !! input
 <x y>
@@ -13727,11 +14808,11 @@ a>b
 !! test
 Tag names followed by punctuation should not be recognized as tags
 !! options
-disabled
+parsoid
 !! input
 <s.ome> text
 !! result
-<p>&lt;s.ome&gt text
+<p>&lt;s.ome&gt; text
 </p>
 !! end
 
@@ -13814,12 +14895,32 @@ parsoid
 | style="color:red|Bar
 |}
 !! result
-<table>
+<table><tbody>
 <tr>
 <td title="Hello world">Foo
 </td><td style="color: red">Bar
-</td></tr></table>
+</td></tr></tbody></table>
+
+!! end
+
+!! test
+Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+!! options
+parsoid
+!! input
+{{}}
+!! result
+{{}}
+!! end
 
+!! test
+Parsoid-only: Don't wrap broken template tags in <nowiki> on wt2wt (Bug 42353)
+!! options
+parsoid
+!! input
+}}{{
+!! result
+}}{{
 !! end
 
 !!test
@@ -13888,6 +14989,151 @@ Empty table rows go away
 
 !! end
 
+###
+### Parsoid-centric tests for testing RTing of inter-element separators
+### Edge cases not tested by existing parser tests and specific to
+### Parsoid-specific serialization strategies.
+###
+
+!!test
+RT-ed inter-element separators should be valid separators
+!!input
+{|
+|- [[foo]]
+|}
+!!result
+<table>
+
+</table>
+
+!!end
+
+!!test
+Trailing newlines in a deep dom-subtree that ends a wikitext line should be migrated out
+(Parsoid-only since PHP parser relies on Tidy for correct output)
+!!options
+parsoid
+!!input
+{|
+|<small>foo
+bar
+|}
+
+{|
+|<small>foo<small>
+|}
+!!result
+!!end
+
+!!test
+Empty TD followed by TD with tpl-generated attribute
+!!input
+{|
+|-
+|
+|{{echo|style='color:red'}}|foo
+|}
+!!result
+<table>
+
+<tr>
+<td>
+</td>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Indented table with an empty td
+!!input
+ {|
+ |-
+ |
+ |foo
+ |}
+!!result
+<table>
+
+<tr>
+<td>
+</td>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Empty TR followed by a template-generated TR
+(Parsoid-specific since PHP parser doesn't handle this mixed tbl-wikitext)
+!!options
+parsoid=wt2html,wt2wt
+!!input
+{|
+|-
+{{echo|<tr><td>foo</td></tr>}}
+|}
+!!result
+<table>
+<tbody>
+<tr></tr>
+<tr typeof="mw:Transclusion">
+<td>foo</td></tr></tbody></table>
+!!end
+
+## PHP and parsoid output differ for this, and since this is primarily
+## for testing Parsoid's serializer, marking this Parsoid only
+!!test
+Empty TR followed by mixed-ws-comment line should RT correctly
+!!options
+parsoid
+!!input
+{|
+|-
+ <!--c-->
+|-
+<!--c--> <!--d-->
+|}
+!!result
+<table>
+<tbody>
+<tr>
+<td> <!--c--></td></tr>
+<tr>
+<td><!--c--> <!--d--></td></tr>
+</tbody></table>
+
+!!end
+
+!!test
+Multi-line image caption generated by templates with/without trailing newlines
+!!options
+parsoid
+!!input
+[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}]]
+[[File:foo.jpg|thumb|300px|foo\n{{echo|A}}\n{{echo|B}}\n{{echo|C}}\n\n]]
+!!result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a>  <div class="thumbcaption">foo\nA\nB\nC</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Foo.jpg" class="new" title="File:Foo.jpg">File:Foo.jpg</a>  <div class="thumbcaption">foo\nA\nB\nC\n\n</div></div></div>
+
+!!end
+
+## PHP emits broken html for this, and since this is primarily
+## a Parsoid serializer test, marking this Parsoid only
+!!test
+Improperly nested inline or quotes tags with whitespace in between
+!!options
+parsoid
+!!input
+<span> <s>x</span> </s>
+''' ''x''' ''
+!!result
+<p><span> <s>x</s></span><s> </s>
+<b> <i>x</i></b><i> </i>
+</p>
+!!end
+
+
 TODO:
 more images
 more tables
index 804a30c..debb357 100644 (file)
@@ -27,8 +27,8 @@
 $otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'run-disabled', 'run-parsoid' );
 $optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
 
-require_once( __DIR__ . '/../maintenance/commandLine.inc' );
-require_once( __DIR__ . '/TestsAutoLoader.php' );
+require_once __DIR__ . '/../maintenance/commandLine.inc';
+require_once __DIR__ . '/TestsAutoLoader.php';
 
 if ( isset( $options['help'] ) ) {
        echo <<<ENDS
@@ -84,11 +84,11 @@ if ( isset( $options['file'] ) ) {
 
 # Print out software version to assist with locating regressions
 $version = SpecialVersion::getVersion();
-echo( "This is MediaWiki version {$version}.\n\n" );
+echo "This is MediaWiki version {$version}.\n\n";
 
 if ( isset( $options['fuzz'] ) ) {
        $tester->fuzzTest( $files );
 } else {
        $ok = $tester->runTestsFromFiles( $files );
-       exit ( $ok ? 0 : 1 );
+       exit( $ok ? 0 : 1 );
 }
diff --git a/tests/phpunit/AutoLoaderTest.php b/tests/phpunit/AutoLoaderTest.php
deleted file mode 100644 (file)
index c8f3868..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-class AutoLoaderTest extends MediaWikiTestCase {
-
-       public function testAutoLoadConfig() {
-               $results = self::checkAutoLoadConf();
-
-               $this->assertEquals(
-                       $results['expected'],
-                       $results['actual']
-               );
-       }
-
-       protected static function checkAutoLoadConf() {
-               global $wgAutoloadLocalClasses, $wgAutoloadClasses, $IP;
-               static $supportsParsekit;
-               $supportsParsekit = function_exists( 'parsekit_compile_file' );
-
-               // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
-               $expected = $wgAutoloadLocalClasses + $wgAutoloadClasses;
-               $actual = array();
-
-               $files = array_unique( $expected );
-
-               foreach ( $files as $file ) {
-                       // Only prefix $IP if it doesn't have it already.
-                       // Generally local classes don't have it, and those from extensions and test suites do.
-                       if ( substr( $file, 0, 1 ) != '/' && substr( $file, 1, 1 ) != ':' ) {
-                               $filePath = "$IP/$file";
-                       } else {
-                               $filePath = $file;
-                       }
-                       if ( $supportsParsekit ) {
-                               $parseInfo = parsekit_compile_file( "$filePath" );
-                               $classes = array_keys( $parseInfo['class_table'] );
-                       } else {
-                               $contents = file_get_contents( "$filePath" );
-                               $m = array();
-                               preg_match_all( '/\n\s*(?:final)?\s*(?:abstract)?\s*(?:class|interface)\s+([a-zA-Z0-9_]+)/', $contents, $m, PREG_PATTERN_ORDER );
-                               $classes = $m[1];
-                       }
-                       foreach ( $classes as $class ) {
-                               $actual[$class] = $file;
-                       }
-               }
-
-               return array(
-                       'expected' => $expected,
-                       'actual' => $actual,
-               );
-       }
-}
index 0cf6e38..1131385 100644 (file)
@@ -15,6 +15,10 @@ abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
                                "\$wgContLang->getCode() (" . $wgContLang->getCode() . ")" );
                }
 
+               // HACK: Call getLanguage() so the real $wgContLang is cached as the user language
+               // rather than our fake one. This is to avoid breaking other, unrelated tests.
+               RequestContext::getMain()->getLanguage();
+
                $langCode = 'en'; # For mainpage to be 'Main Page'
                $langObj = Language::factory( $langCode );
 
index 12c2e00..f5760ea 100644 (file)
@@ -18,7 +18,6 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
                foreach ( self::$additionalOptions as $option => $default ) {
                        $this->longOptions[$option] = $option . 'Handler';
                }
-
        }
 
        public static function main( $exit = true ) {
@@ -86,7 +85,7 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
 ParserTest-specific options:
 
   --regex="<regex>"        Only run parser tests that match the given regex
-  --file="<filename>"      Prints the version and exits.
+  --file="<filename>"      File describing parser tests
   --keep-uploads           Re-use the same upload directory for each test, don't delete it
 
 
@@ -97,5 +96,4 @@ Database options:
 
 EOT;
        }
-
 }
index 7d95b07..25ba29e 100644 (file)
@@ -137,6 +137,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        protected function getNewTempFile() {
                $fname = tempnam( wfTempDir(), 'MW_PHPUnit_' . get_class( $this ) . '_' );
                $this->tmpfiles[] = $fname;
+
                return $fname;
        }
 
@@ -158,6 +159,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                // where temporary directory creation is bundled and can be improved
                unlink( $fname );
                $this->assertTrue( wfMkdirParents( $fname ) );
+
                return $fname;
        }
 
@@ -171,7 +173,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->called['setUp'] = 1;
 
                /*
-               //@todo: global variables to restore for *every* test
+               // @todo global variables to restore for *every* test
                array(
                        'wgLang',
                        'wgContLang',
@@ -348,7 +350,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * Stub. If a test needs to add additional data to the database, it should
         * implement this method and do so
         */
-       function addDBData() {}
+       function addDBData() {
+       }
 
        private function addCoreDBData() {
                # disabled for performance
@@ -377,7 +380,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                                'page_touched' => $this->db->timestamp(),
                                'page_latest' => 0,
                                'page_len' => 0 ), __METHOD__, array( 'IGNORE' ) );
-
                }
 
                User::resetIdByNameCache();
@@ -394,7 +396,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        $user->saveSettings();
                }
 
-
                //Make 1 page with 1 revision
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
                if ( !$page->getId() == 0 ) {
@@ -438,7 +439,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * even if using different parameters.
         *
         * @param DatabaseBase $db The database connection
-        * @param String  $prefix The prefix to use for the new table set (aka schema).
+        * @param String $prefix The prefix to use for the new table set (aka schema).
         *
         * @throws MWException if the database table prefix is already $prefix
         */
@@ -461,6 +462,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
                        CloneDatabase::changePrefix( $prefix );
+
                        return;
                } else {
                        $dbClone->cloneTableStructure();
@@ -523,6 +525,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        private static function unprefixTable( $tableName ) {
                global $wgDBprefix;
+
                return substr( $tableName, strlen( $wgDBprefix ) );
        }
 
@@ -547,6 +550,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        unset( $tables['searchindex_segments'] );
                        $tables = array_flip( $tables );
                }
+
                return $tables;
        }
 
@@ -561,13 +565,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( isset( MediaWikiPHPUnitCommand::$additionalOptions[$offset] ) ) {
                        return MediaWikiPHPUnitCommand::$additionalOptions[$offset];
                }
-
        }
 
        public function setCliArg( $offset, $value ) {
 
                MediaWikiPHPUnitCommand::$additionalOptions[$offset] = $value;
-
        }
 
        /**
@@ -839,12 +841,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        ) {
 
                                $wikitextNS = $ns;
+
                                return $wikitextNS;
                        }
                }
 
                // give up
-               // @todo: Inside a test, we could skip the test as incomplete.
+               // @todo Inside a test, we could skip the test as incomplete.
                //        But frequently, this is used in fixture setup.
                throw new MWException( "No namespace defaults to wikitext!" );
        }
@@ -906,6 +909,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( !$loaded ) {
                        $this->markTestSkipped( "PHP extension '$extName' is not loaded, skipping." );
                }
+
                return $loaded;
        }
 
@@ -934,5 +938,4 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $this->assertInstanceOf( $expected, $pokemons, $message );
        }
-
 }
diff --git a/tests/phpunit/StructureTest.php b/tests/phpunit/StructureTest.php
deleted file mode 100644 (file)
index a942098..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * The tests here verify the structure of the code.  This is for outright bugs,
- * not just style issues.
- */
-
-class StructureTest extends MediaWikiTestCase {
-       /**
-        * Verify all files that appear to be tests have file names ending in
-        * Test.  If the file names do not end in Test, they will not be run.
-        * @group medium
-        */
-       public function testUnitTestFileNamesEndWithTest() {
-               if ( wfIsWindows() ) {
-                       $this->markTestSkipped( 'This test does not work on Windows' );
-               }
-               $rootPath = escapeshellarg( __DIR__ );
-               $testClassRegex = implode( '|', array(
-                       'ApiFormatTestBase',
-                       'ApiTestCase',
-                       'ApiQueryTestBase',
-                       'ApiQueryContinueTestBase',
-                       'MediaWikiLangTestCase',
-                       'MediaWikiTestCase',
-                       'PHPUnit_Framework_TestCase',
-                       'DumpTestCase',
-               ) );
-               $testClassRegex = "^class .* extends ($testClassRegex)";
-               $finder = "find $rootPath -name '*.php' '!' -name '*Test.php'" .
-                       " | xargs grep -El '$testClassRegex|function suite\('";
-
-               $results = null;
-               $exitCode = null;
-               exec( $finder, $results, $exitCode );
-
-               $this->assertEquals(
-                       0,
-                       $exitCode,
-                       'Verify find/grep command succeeds.'
-               );
-
-               $results = array_filter(
-                       $results,
-                       array( $this, 'filterSuites' )
-               );
-               $strip = strlen( $rootPath ) - 1;
-               foreach ( $results as $k => $v ) {
-                       $results[$k] = substr( $v, $strip );
-               }
-               $this->assertEquals(
-                       array(),
-                       $results,
-                       "Unit test file in $rootPath must end with Test."
-               );
-       }
-
-       /**
-        * Filter to remove testUnitTestFileNamesEndWithTest false positives.
-        */
-       public function filterSuites( $filename ) {
-               return strpos( $filename, __DIR__ . '/suites/' ) !== 0;
-       }
-}
index 01caf8f..d929b79 100644 (file)
@@ -11,22 +11,5 @@ if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
 You are running these tests directly from phpunit. You may not have all globals correctly set.
 Running phpunit.php instead is recommended.
 EOF;
-       require_once ( __DIR__ . "/phpunit.php" );
+       require_once __DIR__ . "/phpunit.php";
 }
-
-// Output a notice when running with older versions of PHPUnit
-if ( version_compare( PHPUnit_Runner_Version::id(), "3.6.7", "<" ) ) {
-       echo <<<EOF
-********************************************************************************
-
-These tests run best with version PHPUnit 3.6.7 or better. Earlier versions may
-show failures because earlier versions of PHPUnit do not properly implement
-dependencies.
-
-********************************************************************************
-
-EOF;
-}
-
-/** @todo Check if this is really needed */
-MessageCache::destroyInstance();
index 6e56add..7e8f30e 100644 (file)
@@ -146,11 +146,6 @@ CREATE TABLE /*_*/externallinks (
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
 CREATE TABLE /*_*/langlinks (
   ll_from int unsigned NOT NULL default 0,
   ll_lang varbinary(20) NOT NULL default '',
index 69ae376..e02e3e1 100644 (file)
@@ -151,11 +151,6 @@ CREATE TABLE /*_*/externallinks (
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
 CREATE TABLE /*_*/langlinks (
   ll_from int unsigned NOT NULL default 0,
   ll_lang varbinary(20) NOT NULL default '',
index b106d2b..8bfc28e 100644 (file)
@@ -157,11 +157,6 @@ CREATE TABLE /*_*/externallinks (
 CREATE INDEX /*i*/el_from ON /*_*/externallinks (el_from, el_to(40));
 CREATE INDEX /*i*/el_to ON /*_*/externallinks (el_to(60), el_from);
 CREATE INDEX /*i*/el_index ON /*_*/externallinks (el_index(60));
-CREATE TABLE /*_*/external_user (
-  eu_local_id int unsigned NOT NULL PRIMARY KEY,
-  eu_external_id varchar(255) binary NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/eu_external_id ON /*_*/external_user (eu_external_id);
 CREATE TABLE /*_*/langlinks (
   ll_from int unsigned NOT NULL default 0,
   ll_lang varbinary(20) NOT NULL default '',
index 9aa867b..115cdc9 100644 (file)
@@ -1,26 +1,26 @@
 <?php
-$result = array (
+$result = array(
        'xmp-exif' =>
-       array (
+       array(
                'CameraOwnerName' => 'Me!',
        ),
        'xmp-general' =>
-       array (
+       array(
                'LicenseUrl' => 'http://creativecommons.com/cc-by-2.9',
                'ImageDescription' =>
-               array (
+               array(
                        'x-default' => 'Test image for the cc: xmp: xmpRights: namespaces in xmp',
                        '_type' => 'lang',
                ),
                'ObjectName' =>
-               array (
+               array(
                        'x-default' => 'xmp core/xmp rights/cc ns test',
                        '_type' => 'lang',
                ),
                'DateTimeDigitized' => '2005:04:03',
                'Software' => 'The one true editor: Vi (ok i used gimp)',
                'Identifier' =>
-               array (
+               array(
                        0 => 'http://example.com/identifierurl',
                        1 => 'urn:sha1:342524abcdef',
                        '_type' => 'ul',
@@ -33,12 +33,12 @@ $result = array (
                'RightsCertificate' => 'http://example.com/rights-certificate/',
                'Copyrighted' => 'True',
                'CopyrightOwner' =>
-               array (
+               array(
                        0 => 'Bawolff is copyright owner',
                        '_type' => 'ul',
                ),
                'UsageTerms' =>
-               array (
+               array(
                        'x-default' => 'do whatever you want',
                        'en-gb' => 'Do whatever you want in british english',
                        '_type' => 'lang',
@@ -46,7 +46,7 @@ $result = array (
                'WebStatement' => 'http://example.com/web_statement',
        ),
        'xmp-deprecated' =>
-       array (
+       array(
                'Identifier' => 'http://example.com/identifierurl/wrong',
        ),
 );
index 967ffa1..686ab93 100644 (file)
@@ -16,18 +16,17 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
                $wgContLang = Language::factory( 'es' );
 
                $wgLang = Language::factory( 'fr' );
-               $status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', 0, false, $user );
+               $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', 0, false, $user );
                $templates1 = $title->getTemplateLinksFrom();
 
                $wgLang = Language::factory( 'de' );
                $page->mPreparedEdit = false; // In order to force the rerendering of the same wikitext
 
                // We need an edit, a purge is not enough to regenerate the tables
-               $status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
+               $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
                $templates2 = $title->getTemplateLinksFrom();
 
                $this->assertEquals( $templates1, $templates2 );
                $this->assertEquals( $templates1[0]->getFullText(), 'Historial' );
        }
-
 }
index 19c9b68..32fc2c5 100644 (file)
@@ -51,13 +51,15 @@ class BlockTest extends MediaWikiLangTestCase {
                } else {
                        throw new MWException( "Failed to insert block for BlockTest; old leftover block remaining?" );
                }
+
+               $this->addXffBlocks();
        }
 
        /**
         * debug function : dump the ipblocks table
         */
        function dumpBlocks() {
-               $v = $this->db->query( 'SELECT * FROM unittest_ipblocks' );
+               $v = $this->db->select( 'ipblocks', '*' );
                print "Got " . $v->numRows() . " rows. Full dump follow:\n";
                foreach ( $v as $row ) {
                        print_r( $row );
@@ -70,7 +72,6 @@ class BlockTest extends MediaWikiLangTestCase {
                $this->assertTrue( $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ), "newFromTarget() returns the same block as the one that was made" );
 
                $this->assertTrue( $this->block->equals( Block::newFromID( $this->blockId ) ), "newFromID() returns the same block as the one that was made" );
-
        }
 
        /**
@@ -80,7 +81,6 @@ class BlockTest extends MediaWikiLangTestCase {
                // delta to stop one-off errors when things happen to go over a second mark.
                $delta = abs( $this->madeAt - $this->block->mTimestamp );
                $this->assertLessThan( 2, $delta, "If no timestamp is specified, the block is recorded as time()" );
-
        }
 
        /**
@@ -131,7 +131,6 @@ class BlockTest extends MediaWikiLangTestCase {
                $u->addToDatabase();
                unset( $u );
 
-
                // Sanity check
                $this->assertNull(
                        Block::newFromTarget( $username ),
@@ -228,4 +227,128 @@ class BlockTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'MetaWikiUser', $block->getByName(), 'Correct blocker name' );
                $this->assertEquals( 0, $block->getBy(), 'Correct blocker id' );
        }
+
+       protected function addXffBlocks() {
+               static $inited = false;
+
+               if ( $inited ) {
+                       return;
+               }
+
+               $inited = true;
+
+               $blockList = array(
+                       array( 'target' => '70.2.0.0/16',
+                               'type' => Block::TYPE_RANGE,
+                               'desc' => 'Range Hardblock',
+                               'ACDisable' => false,
+                               'isHardblock' => true,
+                               'isAutoBlocking' => false,
+                       ),
+                       array( 'target' => '2001:4860:4001::/48',
+                               'type' => Block::TYPE_RANGE,
+                               'desc' => 'Range6 Hardblock',
+                               'ACDisable' => false,
+                               'isHardblock' => true,
+                               'isAutoBlocking' => false,
+                       ),
+                       array( 'target' => '60.2.0.0/16',
+                               'type' => Block::TYPE_RANGE,
+                               'desc' => 'Range Softblock with AC Disabled',
+                               'ACDisable' => true,
+                               'isHardblock' => false,
+                               'isAutoBlocking' => false,
+                       ),
+                       array( 'target' => '50.2.0.0/16',
+                               'type' => Block::TYPE_RANGE,
+                               'desc' => 'Range Softblock',
+                               'ACDisable' => false,
+                               'isHardblock' => false,
+                               'isAutoBlocking' => false,
+                       ),
+                       array( 'target' => '50.1.1.1',
+                               'type' => Block::TYPE_IP,
+                               'desc' => 'Exact Softblock',
+                               'ACDisable' => false,
+                               'isHardblock' => false,
+                               'isAutoBlocking' => false,
+                       ),
+               );
+
+               foreach ( $blockList as $insBlock ) {
+                       $target = $insBlock['target'];
+
+                       if ( $insBlock['type'] === Block::TYPE_IP ) {
+                               $target = User::newFromName( IP::sanitizeIP( $target ), false )->getName();
+                       } elseif ( $insBlock['type'] === Block::TYPE_RANGE ) {
+                               $target = IP::sanitizeRange( $target );
+                       }
+
+                       $block = new Block();
+                       $block->setTarget( $target );
+                       $block->setBlocker( 'testblocker@global' );
+                       $block->mReason = $insBlock['desc'];
+                       $block->mExpiry = 'infinity';
+                       $block->prevents( 'createaccount', $insBlock['ACDisable'] );
+                       $block->isHardblock( $insBlock['isHardblock'] );
+                       $block->isAutoblocking( $insBlock['isAutoBlocking'] );
+                       $block->insert();
+               }
+       }
+
+       public static function providerXff() {
+               return array(
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Hardblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, 50.2.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Softblock with AC Disabled'
+                       ),
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 50.1.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Exact Softblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 50.1.1.1, 2.3.4.5',
+                               'count' => 3,
+                               'result' => 'Exact Softblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 50.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Hardblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, 70.2.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Hardblock'
+                       ),
+                       array( 'xff' => '50.2.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range Softblock with AC Disabled'
+                       ),
+                       array( 'xff' => '1.2.3.4, 50.1.1.1, 60.2.1.1, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Exact Softblock'
+                       ),
+                       array( 'xff' => '1.2.3.4, <$A_BUNCH-OF{INVALID}TEXT\>, 60.2.1.1, 2.3.4.5',
+                               'count' => 1,
+                               'result' => 'Range Softblock with AC Disabled'
+                       ),
+                       array( 'xff' => '1.2.3.4, 50.2.1.1, 2001:4860:4001:802::1003, 2.3.4.5',
+                               'count' => 2,
+                               'result' => 'Range6 Hardblock'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider providerXff
+        */
+       function testBlocksOnXff( $xff, $exCount, $exResult ) {
+               $list = array_map( 'trim', explode( ',', $xff ) );
+               $xffblocks = Block::getBlocksForIPList( $list, true );
+               $this->assertEquals( $exCount, count( $xffblocks ), 'Number of blocks for ' . $xff );
+               $block = Block::chooseBlock( $xffblocks, $list );
+               $this->assertEquals( $exResult, $block->mReason, 'Correct block type for XFF header ' . $xff );
+       }
 }
index add585d..e3d9da7 100644 (file)
@@ -66,7 +66,6 @@ class CdbTest extends MediaWikiTestCase {
                        $this->cdbAssert( "PHP error", $key, $v1, $value );
                        $this->cdbAssert( "DBA error", $key, $v2, $value );
                }
-
        }
 
        private function randomString() {
@@ -75,6 +74,7 @@ class CdbTest extends MediaWikiTestCase {
                for ( $j = 0; $j < $len; $j++ ) {
                        $s .= chr( mt_rand( 0, 255 ) );
                }
+
                return $s;
        }
 
diff --git a/tests/phpunit/includes/CollationTest.php b/tests/phpunit/includes/CollationTest.php
new file mode 100644 (file)
index 0000000..ae35fd7
--- /dev/null
@@ -0,0 +1,111 @@
+<?php
+class CollationTest extends MediaWikiLangTestCase {
+       protected function setUp() {
+               parent::setUp();
+               if ( !wfDl( 'intl' ) ) {
+                       $this->markTestSkipped( 'These tests require intl extension' );
+               }
+       }
+
+       /**
+        * Test to make sure, that if you
+        * have "X" and "XY", the binary
+        * sortkey also has "X" being a
+        * prefix of "XY". Our collation
+        * code makes this assumption.
+        *
+        * @param $lang String Language code for collator
+        * @param $base String Base string
+        * @param $extended String String containing base as a prefix.
+        *
+        * @dataProvider prefixDataProvider
+        */
+       function testIsPrefix( $lang, $base, $extended ) {
+               $cp = Collator::create( $lang );
+               $cp->setStrength( Collator::PRIMARY );
+               $baseBin = $cp->getSortKey( $base );
+               // Remove sortkey terminator
+               $baseBin = rtrim( $baseBin, "\0" );
+               $extendedBin = $cp->getSortKey( $extended );
+               $this->assertStringStartsWith( $baseBin, $extendedBin, "$base is not a prefix of $extended" );
+       }
+
+       function prefixDataProvider() {
+               return array(
+                       array( 'en', 'A', 'AA' ),
+                       array( 'en', 'A', 'AAA' ),
+                       array( 'en', 'Д', 'ДЂ' ),
+                       array( 'en', 'Д', 'ДA' ),
+                       // 'Ʒ' should expand to 'Z ' (note space).
+                       array( 'fi', 'Z', 'Ʒ' ),
+                       // 'Þ' should expand to 'th'
+                       array( 'sv', 't', 'Þ' ),
+                       // Javanese is a limited use alphabet, so should have 3 bytes
+                       // per character, so do some tests with it.
+                       array( 'en', 'ꦲ', 'ꦲꦤ' ),
+                       array( 'en', 'ꦲ', 'ꦲД' ),
+                       array( 'en', 'A', 'Aꦲ' ),
+               );
+       }
+
+       /**
+        * Opposite of testIsPrefix
+        *
+        * @dataProvider notPrefixDataProvider
+        */
+       function testNotIsPrefix( $lang, $base, $extended ) {
+               $cp = Collator::create( $lang );
+               $cp->setStrength( Collator::PRIMARY );
+               $baseBin = $cp->getSortKey( $base );
+               // Remove sortkey terminator
+               $baseBin = rtrim( $baseBin, "\0" );
+               $extendedBin = $cp->getSortKey( $extended );
+               $this->assertStringStartsNotWith( $baseBin, $extendedBin, "$base is a prefix of $extended" );
+       }
+
+       function notPrefixDataProvider() {
+               return array(
+                       array( 'en', 'A', 'B' ),
+                       array( 'en', 'AC', 'ABC' ),
+                       array( 'en', 'Z', 'Ʒ' ),
+                       array( 'en', 'A', 'ꦲ' ),
+               );
+       }
+
+       /**
+        * Test correct first letter is fetched.
+        *
+        * @param $collation String Collation name (aka uca-en)
+        * @param $string String String to get first letter of
+        * @param $firstLetter String Expected first letter.
+        *
+        * @dataProvider firstLetterProvider
+        */
+       function testGetFirstLetter( $collation, $string, $firstLetter ) {
+               $col = Collation::factory( $collation );
+               $this->assertEquals( $firstLetter, $col->getFirstLetter( $string ) );
+       }
+
+       function firstLetterProvider() {
+               return array(
+                       array( 'uppercase', 'Abc', 'A' ),
+                       array( 'uppercase', 'abc', 'A' ),
+                       array( 'identity', 'abc', 'a' ),
+                       array( 'uca-en', 'abc', 'A' ),
+                       array( 'uca-en', ' ', ' ' ),
+                       array( 'uca-en', 'Êveryone', 'E' ),
+                       array( 'uca-vi', 'Êveryone', 'Ê' ),
+                       // Make sure thorn is not a first letter.
+                       array( 'uca-sv', 'The', 'T' ),
+                       array( 'uca-sv', 'Å', 'Å' ),
+                       array( 'uca-hu', 'dzsdo', 'Dzs' ),
+                       array( 'uca-hu', 'dzdso', 'Dz' ),
+                       array( 'uca-hu', 'CSD', 'Cs' ),
+                       array( 'uca-root', 'CSD', 'C' ),
+                       array( 'uca-fi', 'Ǥ', 'G' ),
+                       array( 'uca-fi', 'Ŧ', 'T' ),
+                       array( 'uca-fi', 'Ʒ', 'Z' ),
+                       array( 'uca-fi', 'Ŋ', 'N' ),
+               );
+       }
+}
index dcd9ddd..53f33d9 100644 (file)
@@ -4,14 +4,17 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
        protected function setUp() {
                if ( !extension_loaded( 'xdiff' ) ) {
                        $this->markTestSkipped( 'The xdiff extension is not available' );
+
                        return;
                }
                if ( !function_exists( 'xdiff_string_rabdiff' ) ) {
                        $this->markTestSkipped( 'The version of xdiff extension is lower than 1.5.0' );
+
                        return;
                }
                if ( !extension_loaded( 'hash' ) && !extension_loaded( 'mhash' ) ) {
                        $this->markTestSkipped( 'Neither the hash nor mhash extension is available' );
+
                        return;
                }
                parent::setUp();
index e0e5535..07215c1 100644 (file)
@@ -26,11 +26,7 @@ class ExtraParserTest extends MediaWikiTestCase {
                MagicWord::clearCache();
        }
 
-       /**
-        * Bug 8689 - Long numeric lines kill the parser
-        *
-        * @group Database
-        */
+       // Bug 8689 - Long numeric lines kill the parser
        function testBug8689() {
                global $wgUser;
                $longLine = '1.' . str_repeat( '1234567890', 100000 ) . "\n";
@@ -41,20 +37,13 @@ class ExtraParserTest extends MediaWikiTestCase {
                        $this->parser->parse( $longLine, $t, $options )->getText() );
        }
 
-       /**
-        * Test the parser entry points
-        *
-        * @group Database
-        */
+       /* Test the parser entry points */
        function testParse() {
                $title = Title::newFromText( __FUNCTION__ );
                $parserOutput = $this->parser->parse( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
                $this->assertEquals( "<p>Test\nContent of <i>Template:Foo</i>\nContent of <i>Template:Bar</i>\n</p>", $parserOutput->getText() );
        }
 
-       /**
-        * @group Database
-        */
        function testPreSaveTransform() {
                global $wgUser;
                $title = Title::newFromText( __FUNCTION__ );
@@ -63,9 +52,6 @@ class ExtraParserTest extends MediaWikiTestCase {
                $this->assertEquals( "Test\nContent of ''Template:Foo''\n{{Bar}}", $outputText );
        }
 
-       /**
-        * @group Database
-        */
        function testPreprocess() {
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->preprocess( "Test\n{{Foo}}\n{{Bar}}", $title, $this->options );
@@ -87,8 +73,7 @@ class ExtraParserTest extends MediaWikiTestCase {
         * cleanSig() should do nothing if disabled
         */
        function testCleanSigDisabled() {
-               global $wgCleanSignatures;
-               $wgCleanSignatures = false;
+               $this->setMwGlobals( 'wgCleanSignatures', false );
 
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
diff --git a/tests/phpunit/includes/FauxRequestTest.php b/tests/phpunit/includes/FauxRequestTest.php
new file mode 100644 (file)
index 0000000..dfb0f13
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+
+class FauxRequestTest extends MediaWikiTestCase {
+
+       function testGetSetHeader() {
+               $value = 'test/test';
+
+               $request = new FauxRequest();
+               $request->setHeader( 'Content-Type', $value );
+
+               $this->assertEquals( $request->getHeader( 'Content-Type' ), $value );
+               $this->assertEquals( $request->getHeader( 'CONTENT-TYPE' ), $value );
+               $this->assertEquals( $request->getHeader( 'content-type' ), $value );
+       }
+}
index 56691c9..977c22b 100644 (file)
@@ -47,6 +47,9 @@ class FauxResponseTest extends MediaWikiTestCase {
 
                $this->response->header( 'Location: http://127.0.0.2/', false );
                $this->assertEquals( 'http://127.0.0.1/', $this->response->getheader( 'Location' ), 'Same header with override disabled' );
+
+               $this->response->header( 'Location: http://localhost/' );
+               $this->assertEquals( 'http://localhost/', $this->response->getheader( 'LOCATION' ), 'Get header case insensitive' );
        }
 
        function testResponseCode() {
index 4053683..fb2304d 100644 (file)
@@ -81,5 +81,4 @@ class FormOptionsInitializationTest extends MediaWikiTestCase {
                        $this->object->getOptions()
                );
        }
-
 }
index 24fc47c..166a3ce 100644 (file)
@@ -257,7 +257,6 @@ class GlobalTest extends MediaWikiTestCase {
 
                $sampleUTF = "Östergötland_coat_of_arms.png";
 
-
                //mb_substr
                $substr_params = array(
                        array( 0, 0 ),
@@ -280,7 +279,6 @@ class GlobalTest extends MediaWikiTestCase {
                        );
                }
 
-
                //mb_strlen
                $this->assertEquals(
                        mb_strlen( $sampleUTF ),
@@ -288,7 +286,6 @@ class GlobalTest extends MediaWikiTestCase {
                        'Fallback mb_strlen'
                );
 
-
                //mb_str(r?)pos
                $strpos_params = array(
                        //array( 'ter' ),
@@ -315,7 +312,6 @@ class GlobalTest extends MediaWikiTestCase {
                                'Fallback mb_strrpos with params ' . implode( ', ', $old_param_set )
                        );
                }
-
        }
 
 
@@ -329,7 +325,6 @@ class GlobalTest extends MediaWikiTestCase {
                $old_wgDebugTimestamps = $wgDebugTimestamps;
                $wgDebugTimestamps = false;
 
-
                wfDebug( "This is a normal string" );
                $this->assertEquals( "This is a normal string", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
@@ -338,7 +333,6 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertEquals( "This is nöt an ASCII string", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
 
-
                wfDebug( "\00305This has böth UTF and control chars\003" );
                $this->assertEquals( " 05This has böth UTF and control chars ", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
@@ -351,7 +345,6 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertGreaterThan( 5000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
                unlink( $wgDebugLogFile );
 
-
                $wgDebugLogFile = $old_log_file;
                $wgDebugTimestamps = $old_wgDebugTimestamps;
        }
@@ -398,7 +391,6 @@ class GlobalTest extends MediaWikiTestCase {
 
                $this->assertEquals( $var1, 2, 'var1 is swapped' );
                $this->assertEquals( $var2, 1, 'var2 is swapped' );
-
        }
 
        function testWfPercentTest() {
@@ -570,7 +562,7 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $index, "wfMakeUrlIndexes(\"$url\")" );
        }
 
-       function provideMakeUrlIndexes() {
+       public static function provideMakeUrlIndexes() {
                return array(
                        array(
                                // just a regular :)
@@ -627,7 +619,7 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $actual, $description );
        }
 
-       function provideWfMatchesDomainList() {
+       public static function provideWfMatchesDomainList() {
                $a = array();
                $protocols = array( 'HTTP' => 'http:', 'HTTPS' => 'https:', 'protocol-relative' => '' );
                foreach ( $protocols as $pDesc => $p ) {
@@ -643,6 +635,7 @@ class GlobalTest extends MediaWikiTestCase {
                                array( "$p//nds-nl.wikipedia.org", array( 'nl.wikipedia.org' ), true, "Substrings of domains match while they shouldn't, $pDesc URL" ),
                        ) );
                }
+
                return $a;
        }
 
@@ -658,8 +651,9 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $actual, $description );
        }
 
-       function provideWfShellMaintenanceCmdList() {
+       public static function provideWfShellMaintenanceCmdList() {
                global $wgPhpCli;
+
                return array(
                        array( 'eval.php', array( '--help', '--test' ), array(),
                                "'$wgPhpCli' 'eval.php' '--help' '--test'",
index 4879a38..8bd0849 100644 (file)
@@ -11,8 +11,9 @@ class GlobalWithDBTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
        }
 
-       function provideWfIsBadImageList() {
+       public static function provideWfIsBadImageList() {
                $blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
+
                return array(
                        array( 'Bad.jpg', false, $blacklist, true,
                                'Called on a bad image' ),
index 4bd8c68..4184d15 100644 (file)
@@ -87,7 +87,6 @@ class WfAssembleUrlTest extends MediaWikiTestCase {
                                                                $url .= '#' . $fragment;
                                                        }
 
-
                                                        $cases[] = array(
                                                                $parts,
                                                                $url,
index 8df038d..6229be3 100644 (file)
@@ -28,7 +28,7 @@ class WfBCP47Test extends MediaWikiTestCase {
        /**
         * Array format is ($code, $expected)
         */
-       function provideLanguageCodes() {
+       public static function provideLanguageCodes() {
                return array(
                        // Extracted from BCP47 (list not exhaustive)
                        # 2.1.1
index 10b62b3..c60f223 100644 (file)
@@ -152,6 +152,7 @@ class WfBaseConvertTest extends MediaWikiTestCase {
 
                        $x[] = array( $base, $str );
                }
+
                return $x;
        }
 
index 407be8d..3c4fa20 100644 (file)
@@ -11,7 +11,7 @@ class WfBaseNameTest extends MediaWikiTestCase {
                        "wfBaseName('$fullpath') => '$basename'" );
        }
 
-       function providePaths() {
+       public static function providePaths() {
                return array(
                        array( '', '' ),
                        array( '/', '' ),
index c1225e3..5b622c1 100644 (file)
@@ -6,11 +6,10 @@ class WfExpandUrlTest extends MediaWikiTestCase {
        /** @dataProvider provideExpandableUrls */
        public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
                // Fake $wgServer and $wgCanonicalServer
-               global $wgServer, $wgCanonicalServer;
-               $oldServer = $wgServer;
-               $oldCanServer = $wgCanonicalServer;
-               $wgServer = $server;
-               $wgCanonicalServer = $canServer;
+               $this->setMwGlobals( array(
+                       'wgServer' => $server,
+                       'wgCanonicalServer' => $canServer,
+               ) );
 
                // Fake $_SERVER['HTTPS'] if needed
                if ( $httpsMode ) {
@@ -20,10 +19,6 @@ class WfExpandUrlTest extends MediaWikiTestCase {
                }
 
                $this->assertEquals( $fullUrl, wfExpandUrl( $shortUrl, $defaultProto ), $message );
-
-               // Restore $wgServer and $wgCanonicalServer
-               $wgServer = $oldServer;
-               $wgCanonicalServer = $oldCanServer;
        }
 
        /**
@@ -108,6 +103,7 @@ class WfExpandUrlTest extends MediaWikiTestCase {
                                }
                        }
                }
+
                return $retval;
        }
 }
index 58cf6b9..3521d18 100644 (file)
@@ -18,6 +18,7 @@ class WfGetCallerTest extends MediaWikiTestCase {
                if ( $n > 0 ) {
                        return self::intermediateFunction( $level, $n - 1 );
                }
+
                return wfGetCaller( $level );
        }
 
@@ -29,7 +30,8 @@ class WfGetCallerTest extends MediaWikiTestCase {
                $this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
                $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( 1, 0 ) );
 
-               for ( $i = 0; $i < 10; $i++ )
+               for ( $i = 0; $i < 10; $i++ ) {
                        $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( $i + 1, $i ) );
+               }
        }
 }
index 9d66d6b..604f901 100644 (file)
@@ -12,7 +12,7 @@ class WfShorthandToIntegerTest extends MediaWikiTestCase {
                );
        }
 
-       function provideABunchOfShorthands() {
+       public static function provideABunchOfShorthands() {
                return array(
                        array( '', -1, 'Empty string' ),
                        array( '     ', -1, 'String of spaces' ),
@@ -24,5 +24,4 @@ class WfShorthandToIntegerTest extends MediaWikiTestCase {
                        array( '1k', 1024, 'One kb lowercased' ),
                );
        }
-
 }
index cf1830f..3ac33a4 100644 (file)
@@ -10,8 +10,9 @@ class WfTimestampTest extends MediaWikiTestCase {
                $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
        }
 
-       function provideNormalTimestamps() {
+       public static function provideNormalTimestamps() {
                $t = gmmktime( 12, 34, 56, 1, 15, 2001 );
+
                return array(
                        // TS_UNIX
                        array( $t, TS_MW, '20010115123456', 'TS_UNIX to TS_MW' ),
@@ -60,7 +61,7 @@ class WfTimestampTest extends MediaWikiTestCase {
                $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
        }
 
-       function provideOldTimestamps() {
+       public static function provideOldTimestamps() {
                return array(
                        array( '19011213204554', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:54 GMT', 'Earliest time according to php documentation' ),
                        array( '20380119031407', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:07 GMT', 'Latest 32 bit time' ),
@@ -99,7 +100,7 @@ class WfTimestampTest extends MediaWikiTestCase {
                $this->assertEquals( $output, wfTimestamp( TS_MW, $input ), $desc );
        }
 
-       function provideHttpDates() {
+       public static function provideHttpDates() {
                return array(
                        array( 'Sun, 06 Nov 1994 08:49:37 GMT', '19941106084937', 'RFC 822 date' ),
                        array( 'Sunday, 06-Nov-94 08:49:37 GMT', '19941106084937', 'RFC 850 date' ),
diff --git a/tests/phpunit/includes/HTMLCheckMatrixTest.php b/tests/phpunit/includes/HTMLCheckMatrixTest.php
new file mode 100644 (file)
index 0000000..5bbafd3
--- /dev/null
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * Unit tests for the HTMLCheckMatrix form field
+ */
+class HtmlCheckMatrixTest extends MediaWikiTestCase {
+       static private $defaultOptions = array(
+               'rows' => array( 'r1', 'r2' ),
+               'columns' => array( 'c1', 'c2' ),
+               'fieldname' => 'test',
+       );
+
+       public function testPlainInstantiation() {
+               try {
+                       $form = new HTMLCheckMatrix( array() );
+               } catch ( MWException $e ) {
+                       $this->assertInstanceOf( 'HTMLFormFieldRequiredOptionsException', $e );
+                       return;
+               }
+
+               $this->fail( 'Expected MWException indicating missing parameters but none was thrown.' );
+       }
+
+       public function testInstantiationWithMinimumRequiredParameters() {
+               $form = new HTMLCheckMatrix( self::$defaultOptions );
+               $this->assertTrue( true ); // form instantiation must throw exception on failure
+       }
+
+       public function testValidateCallsUserDefinedValidationCallback() {
+               $called = false;
+               $field = new HTMLCheckMatrix( self::$defaultOptions + array(
+                       'validation-callback' => function() use ( &$called ) {
+                               $called = true;
+                               return false;
+                       },
+               ) );
+               $this->assertEquals( false, $this->validate( $field, array() ) );
+               $this->assertTrue( $called );
+       }
+
+       public function testValidateRequiresArrayInput() {
+               $field = new HTMLCheckMatrix( self::$defaultOptions );
+               $this->assertEquals( false, $this->validate( $field, null ) );
+               $this->assertEquals( false, $this->validate( $field, true ) );
+               $this->assertEquals( false, $this->validate( $field, 'abc' ) );
+               $this->assertEquals( false, $this->validate( $field, new stdClass ) );
+               $this->assertEquals( true, $this->validate( $field, array() ) );
+       }
+
+       public function testValidateAllowsOnlyKnownTags() {
+               $field = new HTMLCheckMatrix( self::$defaultOptions );
+               $this->assertInternalType( 'string', $this->validate( $field, array( 'foo' ) ) );
+       }
+
+       public function testValidateAcceptsPartialTagList() {
+               $field = new HTMLCheckMatrix( self::$defaultOptions );
+               $this->assertTrue( $this->validate( $field, array() ) );
+               $this->assertTrue( $this->validate( $field, array( 'c1-r1' ) ) );
+               $this->assertTrue( $this->validate( $field, array( 'c1-r1', 'c1-r2', 'c2-r1', 'c2-r2' ) ) );
+       }
+
+       /**
+        * This form object actually has no visibility into what happens later on, but essentially
+        * if the data submitted by the user passes validate the following is run:
+        * foreach ( $field->filterDataForSubmit( $data ) as $k => $v ) {
+        *     $user->setOption( $k, $v );
+        * }
+        */
+       public function testValuesForcedOnRemainOn() {
+               $field = new HTMLCheckMatrix( self::$defaultOptions + array(
+                       'force-options-on' => array( 'c2-r1' ),
+               ) );
+               $expected = array(
+                       'c1-r1' => false,
+                       'c1-r2' => false,
+                       'c2-r1' => true,
+                       'c2-r2' => false,
+               );
+               $this->assertEquals( $expected, $field->filterDataForSubmit( array() ) );
+       }
+
+       public function testValuesForcedOffRemainOff() {
+               $field = new HTMLCheckMatrix( self::$defaultOptions + array(
+                       'force-options-off' => array( 'c1-r2', 'c2-r2' ),
+               ) );
+               $expected = array(
+                       'c1-r1' => true,
+                       'c1-r2' => false,
+                       'c2-r1' => true,
+                       'c2-r2' => false,
+               );
+               // array_keys on the result simulates submitting all fields checked
+               $this->assertEquals( $expected, $field->filterDataForSubmit( array_keys( $expected ) ) );
+       }
+
+       protected function validate( HTMLFormField $field, $submitted ) {
+               return $field->validate(
+                       $submitted,
+                       array( self::$defaultOptions['fieldname'] => $submitted )
+               );
+       }
+}
diff --git a/tests/phpunit/includes/HashRingTest.php b/tests/phpunit/includes/HashRingTest.php
new file mode 100644 (file)
index 0000000..bc4e499
--- /dev/null
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @group HashRing
+ */
+class HashRingTest extends MediaWikiTestCase {
+       function testHashRing() {
+               $ring = new HashRing( array( 's1' => 1, 's2' => 1, 's3' => 2, 's4' => 2, 's5' => 2, 's6' => 3 ) );
+
+               $locations = array();
+               for ( $i = 0; $i < 20; $i++ ) {
+                       $locations[ "hello$i"] = $ring->getLocation( "hello$i" );
+               }
+               $expectedLocations = array(
+                       "hello0" => "s5",
+                       "hello1" => "s6",
+                       "hello2" => "s2",
+                       "hello3" => "s5",
+                       "hello4" => "s6",
+                       "hello5" => "s4",
+                       "hello6" => "s5",
+                       "hello7" => "s4",
+                       "hello8" => "s5",
+                       "hello9" => "s5",
+                       "hello10" => "s3",
+                       "hello11" => "s6",
+                       "hello12" => "s1",
+                       "hello13" => "s3",
+                       "hello14" => "s3",
+                       "hello15" => "s5",
+                       "hello16" => "s4",
+                       "hello17" => "s6",
+                       "hello18" => "s6",
+                       "hello19" => "s3"
+               );
+
+               $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+
+               $locations = array();
+               for ( $i = 0; $i < 5; $i++ ) {
+                       $locations[ "hello$i"] = $ring->getLocations( "hello$i", 2 );
+               }
+
+               $expectedLocations = array(
+                       "hello0" => array( "s5", "s6" ),
+                       "hello1" => array( "s6", "s4" ),
+                       "hello2" => array( "s2", "s1" ),
+                       "hello3" => array( "s5", "s6" ),
+                       "hello4" => array( "s6", "s4" ),
+               );
+               $this->assertEquals( $expectedLocations, $locations, 'Items placed at proper locations' );
+       }
+}
index 89e789b..81dd487 100644 (file)
@@ -2,81 +2,62 @@
 
 class HooksTest extends MediaWikiTestCase {
 
-       public function testOldStyleHooks() {
-               $foo = 'Foo';
-               $bar = 'Bar';
-
-               $i = new NothingClass();
-
+       function setUp() {
                global $wgHooks;
-
-               $wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStatic' );
-
-               wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-               $this->assertEquals( 'fOO', $foo, 'Standard method' );
-               $foo = 'Foo';
-
-               $wgHooks['MediaWikiHooksTest001'][] = $i;
-
-               wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-               $this->assertEquals( 'foo', $foo, 'onEventName style' );
-               $foo = 'Foo';
-
-               $wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someNonStaticWithData', 'baz' );
-
-               wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-               $this->assertEquals( 'baz', $foo, 'Data included' );
-               $foo = 'Foo';
-
-               $wgHooks['MediaWikiHooksTest001'][] = array( $i, 'someStatic' );
-
-               wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-               $this->assertEquals( 'bah', $foo, 'Standard static method' );
-               //$foo = 'Foo';
-
+               parent::setUp();
+               Hooks::clear( 'MediaWikiHooksTest001' );
                unset( $wgHooks['MediaWikiHooksTest001'] );
-
        }
 
-       public function testNewStyleHooks() {
-               $foo = 'Foo';
-               $bar = 'Bar';
-
+       public static function provideHooks() {
                $i = new NothingClass();
 
-               Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStatic' ) );
-
-               Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-               $this->assertEquals( 'fOO', $foo, 'Standard method' );
-               $foo = 'Foo';
-
-               Hooks::register( 'MediaWikiHooksTest001', $i );
-
-               Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-
-               $this->assertEquals( 'foo', $foo, 'onEventName style' );
-               $foo = 'Foo';
+               return array(
+                       array( 'Object and method', array( $i, 'someNonStatic' ), 'changed-nonstatic', 'changed-nonstatic' ),
+                       array( 'Object and no method', array( $i ), 'changed-onevent', 'original' ),
+                       array( 'Object and method with data', array( $i, 'someNonStaticWithData', 'data' ), 'data', 'original' ),
+                       array( 'Object and static method', array( $i, 'someStatic' ), 'changed-static', 'original' ),
+                       array( 'Class::method static call', array( 'NothingClass::someStatic' ), 'changed-static', 'original' ),
+                       array( 'Global function', array( 'NothingFunction' ), 'changed-func', 'original' ),
+                       array( 'Global function with data', array( 'NothingFunctionData', 'data' ), 'data', 'original' ),
+                       array( 'Closure', array( function ( &$foo, $bar ) {
+                               $foo = 'changed-closure';
+
+                               return true;
+                       } ), 'changed-closure', 'original' ),
+                       array( 'Closure with data', array( function ( $data, &$foo, $bar ) {
+                               $foo = $data;
+
+                               return true;
+                       }, 'data' ), 'data', 'original' )
+               );
+       }
 
-               Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someNonStaticWithData', 'baz' ) );
+       /**
+        * @dataProvider provideHooks
+        */
+       public function testOldStyleHooks( $msg, array $hook, $expectedFoo, $expectedBar ) {
+               global $wgHooks;
+               $foo = $bar = 'original';
 
-               Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
+               $wgHooks['MediaWikiHooksTest001'][] = $hook;
+               wfRunHooks( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
 
-               $this->assertEquals( 'baz', $foo, 'Data included' );
-               $foo = 'Foo';
+               $this->assertSame( $expectedFoo, $foo, $msg );
+               $this->assertSame( $expectedBar, $bar, $msg );
+       }
 
-               Hooks::register( 'MediaWikiHooksTest001', array( $i, 'someStatic' ) );
+       /**
+        * @dataProvider provideHooks
+        */
+       public function testNewStyleHooks( $msg, $hook, $expectedFoo, $expectedBar ) {
+               $foo = $bar = 'original';
 
+               Hooks::register( 'MediaWikiHooksTest001', $hook );
                Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
 
-               $this->assertEquals( 'bah', $foo, 'Standard static method' );
-               $foo = 'Foo';
-
-               Hooks::clear( 'MediaWikiHooksTest001' );
+               $this->assertSame( $expectedFoo, $foo, $msg );
+               $this->assertSame( $expectedBar, $bar, $msg );
        }
 
        public function testNewStyleHookInteraction() {
@@ -85,10 +66,6 @@ class HooksTest extends MediaWikiTestCase {
                $a = new NothingClass();
                $b = new NothingClass();
 
-               // make sure to start with a clean slate
-               Hooks::clear( 'MediaWikiHooksTest001' );
-               unset( $wgHooks['MediaWikiHooksTest001'] );
-
                $wgHooks['MediaWikiHooksTest001'][] = $a;
                $this->assertTrue( Hooks::isRegistered( 'MediaWikiHooksTest001' ), 'Hook registered via $wgHooks should be noticed by Hooks::isRegistered' );
 
@@ -101,37 +78,81 @@ class HooksTest extends MediaWikiTestCase {
                Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
                $this->assertEquals( 1, $a->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
                $this->assertEquals( 1, $b->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
+       }
 
-               // clean up
-               Hooks::clear( 'MediaWikiHooksTest001' );
-               unset( $wgHooks['MediaWikiHooksTest001'] );
+       /**
+        * @expectedException MWException
+        */
+       public function testUncallableFunction() {
+               Hooks::register( 'MediaWikiHooksTest001', 'ThisFunctionDoesntExist' );
+               Hooks::run( 'MediaWikiHooksTest001', array() );
        }
+
+       public function testFalseReturn() {
+               Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) {
+                       return false;
+               } );
+               Hooks::register( 'MediaWikiHooksTest001', function ( &$foo ) {
+                       $foo = 'test';
+
+                       return true;
+               } );
+               $foo = 'original';
+               Hooks::run( 'MediaWikiHooksTest001', array( &$foo ) );
+               $this->assertSame( 'original', $foo, 'Hooks continued processing after a false return.' );
+       }
+
+       /**
+        * @expectedException FatalError
+        */
+       public function testFatalError() {
+               Hooks::register( 'MediaWikiHooksTest001', function () {
+                       return 'test';
+               } );
+               Hooks::run( 'MediaWikiHooksTest001', array() );
+       }
+}
+
+function NothingFunction( &$foo, &$bar ) {
+       $foo = 'changed-func';
+
+       return true;
+}
+
+function NothingFunctionData( $data, &$foo, &$bar ) {
+       $foo = $data;
+
+       return true;
 }
 
 class NothingClass {
        public $calls = 0;
 
        public static function someStatic( &$foo, &$bar ) {
-               $foo = 'bah';
+               $foo = 'changed-static';
+
                return true;
        }
 
        public function someNonStatic( &$foo, &$bar ) {
                $this->calls++;
-               $foo = 'fOO';
-               $bar = 'bAR';
+               $foo = 'changed-nonstatic';
+               $bar = 'changed-nonstatic';
+
                return true;
        }
 
        public function onMediaWikiHooksTest001( &$foo, &$bar ) {
                $this->calls++;
-               $foo = 'foo';
+               $foo = 'changed-onevent';
+
                return true;
        }
 
-       public function someNonStaticWithData( $foo, &$bar ) {
+       public function someNonStaticWithData( $data, &$foo, &$bar ) {
                $this->calls++;
-               $bar = $foo;
+               $foo = $data;
+
                return true;
        }
 }
index 590664e..ecfe418 100644 (file)
@@ -37,14 +37,11 @@ class HtmlTest extends MediaWikiTestCase {
                        'wgLanguageCode' => $langCode,
                        'wgContLang' => $langObj,
                        'wgLang' => $langObj,
-                       'wgHtml5' => true,
                        'wgWellFormedXml' => false,
                ) );
        }
 
        public function testElementBasics() {
-               global $wgWellFormedXml;
-
                $this->assertEquals(
                        '<img>',
                        Html::element( 'img', null, '' ),
@@ -63,7 +60,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'Close tag for empty element (array, string)'
                );
 
-               $wgWellFormedXml = true;
+               $this->setMwGlobals( 'wgWellFormedXml', true );
 
                $this->assertEquals(
                        '<img />',
@@ -72,6 +69,31 @@ class HtmlTest extends MediaWikiTestCase {
                );
        }
 
+       public function dataXmlMimeType() {
+               return array(
+                       // ( $mimetype, $isXmlMimeType )
+                       # HTML is not an XML MimeType
+                       array( 'text/html', false ),
+                       # XML is an XML MimeType
+                       array( 'text/xml', true ),
+                       array( 'application/xml', true ),
+                       # XHTML is an XML MimeType
+                       array( 'application/xhtml+xml', true ),
+                       # Make sure other +xml MimeTypes are supported
+                       # SVG is another random MimeType even though we don't use it
+                       array( 'image/svg+xml', true ),
+                       # Complete random other MimeTypes are not XML
+                       array( 'text/plain', false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataXmlMimeType
+        */
+       public function testXmlMimeType( $mimetype, $isXmlMimeType ) {
+               $this->assertEquals( $isXmlMimeType, Html::isXmlMimeType( $mimetype ) );
+       }
+
        public function testExpandAttributesSkipsNullAndFalse() {
 
                ### EMPTY ########
@@ -90,8 +112,6 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        public function testExpandAttributesForBooleans() {
-               global $wgHtml5, $wgWellFormedXml;
-
                $this->assertEquals(
                        '',
                        Html::expandAttributes( array( 'selected' => false ) ),
@@ -114,21 +134,13 @@ class HtmlTest extends MediaWikiTestCase {
                        'Boolean attributes have no value when value is true (passed as numerical array)'
                );
 
-               $wgWellFormedXml = true;
+               $this->setMwGlobals( 'wgWellFormedXml', true );
 
                $this->assertEquals(
                        ' selected=""',
                        Html::expandAttributes( array( 'selected' => true ) ),
                        'Boolean attributes have empty string value when value is true (wgWellFormedXml)'
                );
-
-               $wgHtml5 = false;
-
-               $this->assertEquals(
-                       ' selected="selected"',
-                       Html::expandAttributes( array( 'selected' => true ) ),
-                       'Boolean attributes have their key as value when value is true (wgWellFormedXml, wgHTML5 = false)'
-               );
        }
 
        /**
@@ -136,8 +148,6 @@ class HtmlTest extends MediaWikiTestCase {
         * Please note it output a string prefixed with a space!
         */
        public function testExpandAttributesVariousExpansions() {
-               global $wgWellFormedXml;
-
                ### NOT EMPTY ####
                $this->assertEquals(
                        ' empty_string=""',
@@ -160,7 +170,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'Number 0 value needs no quotes'
                );
 
-               $wgWellFormedXml = true;
+               $this->setMwGlobals( 'wgWellFormedXml', true );
 
                $this->assertEquals(
                        ' empty_string=""',
@@ -418,7 +428,7 @@ class HtmlTest extends MediaWikiTestCase {
         * List of input element types values introduced by HTML5
         * Full list at http://www.w3.org/TR/html-markup/input.html
         */
-       function provideHtml5InputTypes() {
+       public static function provideHtml5InputTypes() {
                $types = array(
                        'datetime',
                        'datetime-local',
@@ -438,6 +448,7 @@ class HtmlTest extends MediaWikiTestCase {
                foreach ( $types as $type ) {
                        $cases[] = array( $type );
                }
+
                return $cases;
        }
 
@@ -602,6 +613,7 @@ class HtmlTest extends MediaWikiTestCase {
                                isset( $case[3] ) ? $case[3] : ''
                        );
                }
+
                return $ret;
        }
 
@@ -616,5 +628,4 @@ class HtmlTest extends MediaWikiTestCase {
                        'Allow special case "step=any".'
                );
        }
-
 }
index 7698776..12ba226 100644 (file)
@@ -194,6 +194,7 @@ class MWHttpRequestTester extends MWHttpRequest {
                                        throw new MWException( __METHOD__ . ': allow_url_fopen needs to be enabled for pure PHP' .
                                                ' http requests to work. If possible, curl should be used instead. See http://php.net/curl.' );
                                }
+
                                return new PhpHttpRequestTester( $url, $options );
                        default:
                }
diff --git a/tests/phpunit/includes/JsonTest.php b/tests/phpunit/includes/JsonTest.php
deleted file mode 100644 (file)
index 96a2ead..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-class JsonTest extends MediaWikiTestCase {
-
-       function testPhpBug46944Test() {
-               $this->assertNotEquals(
-                       '\ud840\udc00',
-                       strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
-                       'Test encoding an broken json_encode character (U+20000)'
-               );
-
-       }
-
-       function testDecodeVarTypes() {
-               $this->assertInternalType(
-                       'object',
-                       FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
-                       'Default to object'
-               );
-
-               $this->assertInternalType(
-                       'array',
-                       FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
-                       'Optional array'
-               );
-       }
-}
index d4d93b0..93ce119 100644 (file)
@@ -85,7 +85,7 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
                $wgUser->mFrom = 'defaults';
                $wgUser->mOptionsLoaded = true;
                // The user's data is ignored because the variant is set in the URL.
-               $wgUser->setOption( 'variant', 'tg-latn' ); 
+               $wgUser->setOption( 'variant', 'tg-latn' );
                $this->assertEquals( 'tg', $this->lc->getPreferredVariant() );
        }
 
@@ -123,7 +123,6 @@ class TestConverter extends LanguageConverter {
                        'tg' => new ReplacementArray()
                );
        }
-
 }
 
 class LanguageToTest extends Language {
index e353c46..ec4d98e 100644 (file)
@@ -17,7 +17,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                );
        }
 
-       function provideCasesForUserLink() {
+       public static function provideCasesForUserLink() {
                # Format:
                # - expected
                # - userid
index c83f7da..4e6d3ea 100644 (file)
@@ -122,7 +122,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
                $po->addImage( "Foo.png" );
 
-
                $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
                        array( 'Foo.png' ),
                ) );
@@ -133,7 +132,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
                $po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
 
-
                $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
                        array( 'En', 'Foo' ),
                ) );
@@ -149,7 +147,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
                ) );
        }
 
-       #@todo: test recursive, too!
+       // @todo test recursive, too!
 
        protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, array $expectedRows ) {
                $update = new LinksUpdate( $title, $parserOutput );
index 6c17bf4..becf507 100644 (file)
@@ -59,7 +59,6 @@ class MWFunctionTest extends MediaWikiTestCase {
        public static function someMethod() {
                return func_get_args();
        }
-
 }
 
 class MWBlankClass {
index 45f8daf..7d6d5a1 100644 (file)
@@ -125,7 +125,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testGetAssociated() {
                $this->assertEquals( NS_TALK, MWNamespace::getAssociated( NS_MAIN ) );
                $this->assertEquals( NS_MAIN, MWNamespace::getAssociated( NS_TALK ) );
-
        }
 
        ### Exceptions with getAssociated()
@@ -201,7 +200,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
                        NS_SPECIAL, NS_MEDIA,
                        "NS_SPECIAL and NS_MEDIA are different subject namespaces"
                );
-
        }
 
        /**
@@ -346,33 +344,32 @@ class MWNamespaceTest extends MediaWikiTestCase {
 
                $this->assertEquals(
                        array( NS_MAIN ),
-                       MWNamespace::getcontentNamespaces(),
+                       MWNamespace::getContentNamespaces(),
                        '$wgContentNamespaces is an array with only NS_MAIN by default'
                );
 
-
                # test !is_array( $wgcontentNamespaces )
                $wgContentNamespaces = '';
-               $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+               $this->assertEquals( NS_MAIN, MWNamespace::getContentNamespaces() );
 
                $wgContentNamespaces = false;
-               $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+               $this->assertEquals( NS_MAIN, MWNamespace::getContentNamespaces() );
 
                $wgContentNamespaces = null;
-               $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+               $this->assertEquals( NS_MAIN, MWNamespace::getContentNamespaces() );
 
                $wgContentNamespaces = 5;
-               $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+               $this->assertEquals( NS_MAIN, MWNamespace::getContentNamespaces() );
 
                # test $wgContentNamespaces === array()
                $wgContentNamespaces = array();
-               $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+               $this->assertEquals( NS_MAIN, MWNamespace::getContentNamespaces() );
 
                # test !in_array( NS_MAIN, $wgContentNamespaces )
                $wgContentNamespaces = array( NS_USER, NS_CATEGORY );
                $this->assertEquals(
                        array( NS_MAIN, NS_USER, NS_CATEGORY ),
-                       MWNamespace::getcontentNamespaces(),
+                       MWNamespace::getContentNamespaces(),
                        'NS_MAIN is forced in $wgContentNamespaces even if unwanted'
                );
 
@@ -380,13 +377,13 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $wgContentNamespaces = array( NS_MAIN );
                $this->assertEquals(
                        array( NS_MAIN ),
-                       MWNamespace::getcontentNamespaces()
+                       MWNamespace::getContentNamespaces()
                );
 
                $wgContentNamespaces = array( NS_MAIN, NS_USER, NS_CATEGORY );
                $this->assertEquals(
                        array( NS_MAIN, NS_USER, NS_CATEGORY ),
-                       MWNamespace::getcontentNamespaces()
+                       MWNamespace::getContentNamespaces()
                );
        }
 
index c378bb8..0f74899 100644 (file)
@@ -56,12 +56,18 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'abcdefghijka2', $msg->params( $params )->plain(), 'Params > 9 are replaced correctly' );
        }
 
-       function testInContentLanguage() {
-               global $wgLang, $wgForceUIMsgAsContentMsg;
-               $wgLang = Language::factory( 'fr' );
+       function testInContentLanguageDisabled() {
+               $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
 
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
-               $wgForceUIMsgAsContentMsg['testInContentLanguage'] = 'mainpage';
+       }
+
+       function testInContentLanguageEnabled() {
+               $this->setMwGlobals( array(
+                       'wgLang' => Language::factory( 'fr' ),
+                       'wgForceUIMsgAsContentMsg' => array( 'mainpage' ),
+               ) );
+
                $this->assertEquals( 'Accueil', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg enabled' );
        }
 
index 4084fb1..56bb0fc 100644 (file)
@@ -19,7 +19,6 @@ class OutputPageTest extends MediaWikiTestCase {
         *
         * options['printableQuery'] - value of query string for printable, or omitted for none
         * options['handheldQuery'] - value of query string for handheld, or omitted for none
-        * options['handheldForIPhone'] - value of the $wgHandheldForIPhone global
         * options['media'] - passed into the method under the same name
         * options['expectedReturn'] - expected return value
         * options['message'] - PHPUnit message for assertion
@@ -39,58 +38,38 @@ class OutputPageTest extends MediaWikiTestCase {
                $fauxRequest = new FauxRequest( $queryData, false );
                $this->setMWGlobals( array(
                        'wgRequest' => $fauxRequest,
-                       'wgHandheldForIPhone' => $args['handheldForIPhone']
                ) );
 
                $actualReturn = OutputPage::transformCssMedia( $args['media'] );
                $this->assertSame( $args['expectedReturn'], $actualReturn, $args['message'] );
        }
 
-       /**
-        * Tests a case of transformCssMedia with both values of wgHandheldForIPhone.
-        * Used to verify that behavior is orthogonal to that option.
-        *
-        * If the value of wgHandheldForIPhone should matter, use assertTransformCssMediaCase.
-        *
-        * @param array $args key-value array of arguments as shown in assertTransformCssMediaCase.
-        * Will be mutated.
-        */
-       protected function assertTransformCssMediaCaseWithBothHandheldForIPhone( $args ) {
-               $message = $args['message'];
-               foreach ( array( true, false ) as $handheldForIPhone ) {
-                       $args['handheldForIPhone'] = $handheldForIPhone;
-                       $stringHandheldForIPhone = var_export( $handheldForIPhone, true );
-                       $args['message'] = "$message. \$wgHandheldForIPhone was $stringHandheldForIPhone";
-                       $this->assertTransformCssMediaCase( $args );
-               }
-       }
-
        /**
         * Tests print requests
         */
        public function testPrintRequests() {
-               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+               $this->assertTransformCssMediaCase( array(
                        'printableQuery' => '1',
                        'media' => 'screen',
                        'expectedReturn' => null,
                        'message' => 'On printable request, screen returns null'
                ) );
 
-               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+               $this->assertTransformCssMediaCase( array(
                        'printableQuery' => '1',
                        'media' => self::SCREEN_MEDIA_QUERY,
                        'expectedReturn' => null,
                        'message' => 'On printable request, screen media query returns null'
                ) );
 
-               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+               $this->assertTransformCssMediaCase( array(
                        'printableQuery' => '1',
                        'media' => self::SCREEN_ONLY_MEDIA_QUERY,
                        'expectedReturn' => null,
                        'message' => 'On printable request, screen media query with only returns null'
                ) );
 
-               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+               $this->assertTransformCssMediaCase( array(
                        'printableQuery' => '1',
                        'media' => 'print',
                        'expectedReturn' => '',
@@ -103,25 +82,30 @@ class OutputPageTest extends MediaWikiTestCase {
         */
        public function testScreenRequests() {
                $this->assertTransformCssMediaCase( array(
-                       'handheldForIPhone' => false,
                        'media' => 'screen',
                        'expectedReturn' => 'screen',
-                       'message' => 'On screen request, with handheldForIPhone false, screen media type is preserved'
+                       'message' => 'On screen request, screen media type is preserved'
+               ) );
+
+               $this->assertTransformCssMediaCase( array(
+                       'media' => 'handheld',
+                       'expectedReturn' => 'handheld',
+                       'message' => 'On screen request, handheld media type is preserved'
                ) );
 
-               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+               $this->assertTransformCssMediaCase( array(
                        'media' => self::SCREEN_MEDIA_QUERY,
                        'expectedReturn' => self::SCREEN_MEDIA_QUERY,
                        'message' => 'On screen request, screen media query is preserved.'
                ) );
 
-               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+               $this->assertTransformCssMediaCase( array(
                        'media' => self::SCREEN_ONLY_MEDIA_QUERY,
                        'expectedReturn' => self::SCREEN_ONLY_MEDIA_QUERY,
                        'message' => 'On screen request, screen media query with only is preserved.'
                ) );
 
-               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+               $this->assertTransformCssMediaCase( array(
                        'media' => 'print',
                        'expectedReturn' => 'print',
                        'message' => 'On screen request, print media type is preserved'
@@ -129,44 +113,21 @@ class OutputPageTest extends MediaWikiTestCase {
        }
 
        /**
-        * Tests handheld and wgHandheldForIPhone behavior
+        * Tests handheld behavior
         */
        public function testHandheld() {
-               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+               $this->assertTransformCssMediaCase( array(
                        'handheldQuery' => '1',
                        'media' => 'handheld',
                        'expectedReturn' => '',
                        'message' => 'On request with handheld querystring and media is handheld, returns empty string'
                ) );
 
-               $this->assertTransformCssMediaCaseWithBothHandheldForIPhone( array(
+               $this->assertTransformCssMediaCase( array(
                        'handheldQuery' => '1',
                        'media' => 'screen',
                        'expectedReturn' => null,
                        'message' => 'On request with handheld querystring and media is screen, returns null'
                ) );
-
-               // A bit counter-intuitively, $wgHandheldForIPhone should only matter if the query handheld is false or omitted
-               $this->assertTransformCssMediaCase( array(
-                       'handheldQuery' => '0',
-                       'media' => 'screen',
-                       'handheldForIPhone' => true,
-                       'expectedReturn' => 'screen and (min-device-width: 481px)',
-                       'message' => 'With $wgHandheldForIPhone true, screen media type is transformed'
-               ) );
-
-               $this->assertTransformCssMediaCase( array(
-                       'media' => 'handheld',
-                       'handheldForIPhone' => true,
-                       'expectedReturn' => 'handheld, only screen and (max-device-width: 480px)',
-                       'message' => 'With $wgHandheldForIPhone true, handheld media type is transformed'
-               ) );
-
-               $this->assertTransformCssMediaCase( array(
-                       'media' => 'handheld',
-                       'handheldForIPhone' => false,
-                       'expectedReturn' => 'handheld',
-                       'message' => 'With $wgHandheldForIPhone false, handheld media type is preserved'
-               ) );
        }
 }
index 2259187..386ddb8 100644 (file)
@@ -151,18 +151,20 @@ class PathRouterTest extends MediaWikiTestCase {
                $router->add( array( 'qwerty' => "/qwerty/$1" ), array( 'qwerty' => '$key' ) );
                $router->add( "/$2/$1", array( 'restricted-to-y' => '$2' ), array( '$2' => 'y' ) );
 
-               foreach ( array(
-                                       '/Foo' => array( 'title' => 'Foo' ),
-                                       '/Bar' => array( 'ping' => 'pong' ),
-                                       '/Baz' => array( 'marco' => 'polo' ),
-                                       '/asdf-foo' => array( 'title' => 'qwerty-foo' ),
-                                       '/qwerty-bar' => array( 'title' => 'asdf-bar' ),
-                                       '/a/Foo' => array( 'title' => 'Foo' ),
-                                       '/asdf/Foo' => array( 'title' => 'Foo' ),
-                                       '/qwerty/Foo' => array( 'title' => 'Foo', 'qwerty' => 'qwerty' ),
-                                       '/baz/Foo' => array( 'title' => 'Foo', 'unrestricted' => 'baz' ),
-                                       '/y/Foo' => array( 'title' => 'Foo', 'restricted-to-y' => 'y' ),
-                               ) as $path => $result ) {
+               foreach (
+                       array(
+                               '/Foo' => array( 'title' => 'Foo' ),
+                               '/Bar' => array( 'ping' => 'pong' ),
+                               '/Baz' => array( 'marco' => 'polo' ),
+                               '/asdf-foo' => array( 'title' => 'qwerty-foo' ),
+                               '/qwerty-bar' => array( 'title' => 'asdf-bar' ),
+                               '/a/Foo' => array( 'title' => 'Foo' ),
+                               '/asdf/Foo' => array( 'title' => 'Foo' ),
+                               '/qwerty/Foo' => array( 'title' => 'Foo', 'qwerty' => 'qwerty' ),
+                               '/baz/Foo' => array( 'title' => 'Foo', 'unrestricted' => 'baz' ),
+                               '/y/Foo' => array( 'title' => 'Foo', 'restricted-to-y' => 'y' ),
+                       ) as $path => $result
+               ) {
                        $this->assertEquals( $router->parse( $path ), $result );
                }
        }
@@ -251,5 +253,4 @@ class PathRouterTest extends MediaWikiTestCase {
                $matches = $router->parse( "/wiki/Foo" );
                $this->assertEquals( $matches, array( 'title' => 'bar%20$1' ) );
        }
-
 }
index 7aa3c4a..392ad08 100644 (file)
@@ -30,7 +30,10 @@ class PreferencesTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
 
-               $this->setMwGlobals( 'wgEnableEmail', true );
+               $this->setMwGlobals( array(
+                       'wgEnableEmail' => true,
+                       'wgEmailAuthentication' => true,
+               ) );
        }
 
        /**
@@ -77,6 +80,7 @@ class PreferencesTest extends MediaWikiTestCase {
                        , $this->context
                        , $preferences
                );
+
                return $preferences;
        }
 }
index 948b635..4ddc0b0 100644 (file)
@@ -16,6 +16,7 @@ class MediaWikiProvide {
                for ( $i = 1; $i <= $num; $i++ ) {
                        $ret[] = array( $i );
                }
+
                return $ret;
        }
 
@@ -39,6 +40,7 @@ class MediaWikiProvide {
                                $ret[] = array( $day[0], $month[0] );
                        }
                }
+
                return $ret;
        }
 }
index a1e6236..8e476b3 100644 (file)
@@ -225,7 +225,7 @@ class RecentChangeTest extends MediaWikiTestCase {
        }
 
        /**
-        * @todo: Emulate these edits somehow and extract
+        * @todo Emulate these edits somehow and extract
         * raw edit summary from RecentChange object
         * --
         */
@@ -276,5 +276,4 @@ class RecentChangeTest extends MediaWikiTestCase {
                        $msg
                );
        }
-
 }
index f587171..e3a9cfb 100644 (file)
@@ -25,7 +25,6 @@ class RequestContextTest extends MediaWikiTestCase {
                $context->setTitle( $curTitle );
                $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
                        "When a title is updated the WikiPage should be purged and recreated on-demand with the new title." );
-
        }
 
        public function testImportScopedSession() {
@@ -58,7 +57,7 @@ class RequestContextTest extends MediaWikiTestCase {
                $this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
                $this->assertEquals( 'UnitTestContextUser', $context->getUser()->getName(), "Correct context user name." );
 
-               unset ( $sc ); // restore previous context
+               unset( $sc ); // restore previous context
 
                $info = $context->exportSession();
                $this->assertEquals( $oInfo['ip'], $info['ip'], "Correct initial IP address." );
index 60618b1..fa228a6 100644 (file)
@@ -11,6 +11,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
         */
        public static function resourceLoaderRegisterModules( &$resourceLoader ) {
                self::$resourceLoaderRegisterModulesHook = true;
+
                return true;
        }
 
@@ -31,6 +32,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
                self::$resourceLoaderRegisterModulesHook = false;
                $resourceLoader = new ResourceLoader();
                $this->assertTrue( self::$resourceLoaderRegisterModulesHook );
+
                return $resourceLoader;
        }
 
@@ -77,14 +79,20 @@ class ResourceLoaderTest extends MediaWikiTestCase {
                                'Regression fixed in r88706 with dotless names',
                                array( 'foo', 'bar', 'baz' ),
                                'foo,bar,baz',
-                       )
+                       ),
+                       array(
+                               'Prefixless modules after a prefixed module',
+                               array( 'single.module', 'foobar', 'foobaz' ),
+                               'single.module|foobar,foobaz',
+                       ),
                );
        }
 }
 
 /* Stubs */
 
-class ResourceLoaderTestModule extends ResourceLoaderModule {}
+class ResourceLoaderTestModule extends ResourceLoaderModule {
+}
 
 /* Hooks */
 global $wgHooks;
index 3b8e5cf..00b1f29 100644 (file)
@@ -365,7 +365,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum', CONTENT_MODEL_WIKITEXT );
                $rev1 = $page->getRevision();
 
-               # @todo: find out if this should be true
+               # @todo find out if this should be true
                # $this->assertTrue( $rev1->isCurrent() );
 
                $rev1x = Revision::newFromId( $rev1->getId() );
@@ -374,7 +374,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 'second rev' );
                $rev2 = $page->getRevision();
 
-               # @todo: find out if this should be true
+               # @todo find out if this should be true
                # $this->assertTrue( $rev2->isCurrent() );
 
                $rev1x = Revision::newFromId( $rev1->getId() );
index 3948e34..f35a05f 100644 (file)
@@ -6,14 +6,9 @@
  * ^--- important, causes temporary tables to be used instead of the real database
  */
 class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
-       var $saveContentHandlerNoDB = null;
 
        function setUp() {
-               global $wgContentHandlerUseDB;
-
-               $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
-               $wgContentHandlerUseDB = false;
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
 
                $dbw = wfGetDB( DB_MASTER );
 
@@ -32,14 +27,6 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
                parent::setUp();
        }
 
-       function tearDown() {
-               global $wgContentHandlerUseDB;
-
-               parent::tearDown();
-
-               $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
-       }
-
        /**
         * @covers Revision::selectFields
         */
@@ -76,7 +63,7 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
         */
        public function testGetContentFormat() {
                try {
-                       //@todo: change this to test failure on using a non-standard (but supported) format
+                       // @todo change this to test failure on using a non-standard (but supported) format
                        //       for a content model supported in the given location. As of 1.21, there are
                        //       no alternative formats for any of the standard content models that could be
                        //       used for this though.
@@ -91,5 +78,4 @@ class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
                        $this->assertTrue( true ); // ok
                }
        }
-
 }
index db0245b..e3b0844 100644 (file)
@@ -134,9 +134,7 @@ class RevisionTest extends MediaWikiTestCase {
 
        function testCompressRevisionTextUtf8Gzip() {
                $this->checkPHPExtension( 'zlib' );
-
-               global $wgCompressRevisions;
-               $wgCompressRevisions = true;
+               $this->setMwGlobals( 'wgCompressRevisions', true );
 
                $row = new stdClass;
                $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
@@ -405,7 +403,6 @@ class RevisionTest extends MediaWikiTestCase {
                // for immutable content like wikitext, this should be the same object
                $this->assertSame( $content, $content2 );
        }
-
 }
 
 class RevisionTestModifyableContent extends TextContent {
@@ -424,7 +421,6 @@ class RevisionTestModifyableContent extends TextContent {
        public function setText( $text ) {
                $this->mText = $text;
        }
-
 }
 
 class RevisionTestModifyableContentHandler extends TextContentHandler {
index c0ed4a5..38c15ee 100644 (file)
@@ -71,8 +71,6 @@ class SanitizerTest extends MediaWikiTestCase {
         */
        function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
                $this->setMwGlobals( array(
-                       # Enable HTML5 mode
-                       'wgHtml5' => true,
                        'wgUseTidy' => false
                ) );
 
@@ -90,7 +88,7 @@ class SanitizerTest extends MediaWikiTestCase {
        /**
         * Provide HTML5 tags
         */
-       function provideHtml5Tags() {
+       public static function provideHtml5Tags() {
                $ESCAPED = true; # We want tag to be escaped
                $VERBATIM = false; # We want to keep the tag
                return array(
@@ -101,18 +99,43 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function testSelfClosingTag() {
-               $this->setMwGlobals( array(
-                       'wgUseTidy' => false
-               ) );
-
-               $this->assertEquals(
-                       '<div>Hello world</div>',
-                       Sanitizer::removeHTMLtags( '<div>Hello world</div />' ),
-                       'Self-closing closing div'
+       function dataRemoveHTMLtags() {
+               return array(
+                       // former testSelfClosingTag
+                       array(
+                               '<div>Hello world</div />',
+                               '<div>Hello world</div>',
+                               'Self-closing closing div'
+                       ),
+                       // Make sure special nested HTML5 semantics are not broken
+                       // http://www.whatwg.org/html/text-level-semantics.html#the-kbd-element
+                       array(
+                               '<kbd><kbd>Shift</kbd>+<kbd>F3</kbd></kbd>',
+                               '<kbd><kbd>Shift</kbd>+<kbd>F3</kbd></kbd>',
+                               'Nested <kbd>.'
+                       ),
+                       // http://www.whatwg.org/html/text-level-semantics.html#the-sub-and-sup-elements
+                       array(
+                               '<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>',
+                               '<var>x<sub><var>i</var></sub></var>, <var>y<sub><var>i</var></sub></var>',
+                               'Nested <var>.'
+                       ),
+                       // http://www.whatwg.org/html/text-level-semantics.html#the-dfn-element
+                       array(
+                               '<dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>',
+                               '<dfn><abbr title="Garage Door Opener">GDO</abbr></dfn>',
+                               '<abbr> inside <dfn>',
+                       ),
                );
        }
 
+       /**
+        * @dataProvider dataRemoveHTMLtags
+        */
+       function testRemoveHTMLtags( $input, $output, $msg = null ) {
+               $GLOBALS['wgUseTidy'] = false;
+               $this->assertEquals( $output, Sanitizer::removeHTMLtags( $input ), $msg );
+       }
 
        /**
         * @dataProvider provideTagAttributesToDecode
@@ -125,7 +148,7 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function provideTagAttributesToDecode() {
+       public static function provideTagAttributesToDecode() {
                return array(
                        array( array( 'foo' => 'bar' ), 'foo=bar', 'Unquoted attribute' ),
                        array( array( 'foo' => 'bar' ), '    foo   =   bar    ', 'Spaced attribute' ),
@@ -148,7 +171,6 @@ class SanitizerTest extends MediaWikiTestCase {
                        array( array( 'foo.' => 'baz' ), 'foo.=baz', 'A . is allowed as last character' ),
                        array( array( 'foo6' => 'baz' ), 'foo6=baz', 'Numbers are allowed' ),
 
-
                        # This bit is more relaxed than XML rules, but some extensions use
                        # it, like ProofreadPage (see bug 27539)
                        array( array( '1foo' => 'baz' ), '1foo=baz', 'Leading numbers are allowed' ),
@@ -205,10 +227,14 @@ class SanitizerTest extends MediaWikiTestCase {
        public static function provideCssCommentsFixtures() {
                /** array( <expected>, <css>, [message] ) */
                return array(
-                       array( ' ', '/**/' ),
+                       // Valid comments spanning entire input
+                       array( '/**/', '/**/' ),
+                       array( '/* comment */', '/* comment */' ),
+                       // Weird stuff
                        array( ' ', '/****/' ),
-                       array( ' ', '/* comment */' ),
-                       array( ' ', "\\2f\\2a foo \\2a\\2f",
+                       array( ' ', '/* /* */' ),
+                       array( 'display: block;', "display:/* foo */block;" ),
+                       array( 'display: block;', "display:\\2f\\2a foo \\2a\\2f block;",
                                'Backslash-escaped comments must be stripped (bug 28450)' ),
                        array( '', '/* unfinished comment structure',
                                'Remove anything after a comment-start token' ),
@@ -229,7 +255,7 @@ class SanitizerTest extends MediaWikiTestCase {
        /**
         * Test for support or lack of support for specific attributes in the attribute whitelist.
         */
-       function provideAttributeSupport() {
+       public static function provideAttributeSupport() {
                /** array( <attributes>, <expected>, <message> ) */
                return array(
                        array( 'div', ' role="presentation"', ' role="presentation"', 'Support for WAI-ARIA\'s role="presentation".' ),
@@ -246,5 +272,4 @@ class SanitizerTest extends MediaWikiTestCase {
                        $message
                );
        }
-
 }
index 3422c90..4b49f63 100644 (file)
@@ -138,8 +138,8 @@ testBrowser                 = "firefox"
                $seleniumSettings = array();
                $seleniumBrowsers = array();
                $seleniumTestSuites = array();
-               global $wgSeleniumConfigFile;
-               $wgSeleniumConfigFile = '';
+               $this->setMwGlobals( 'wgSeleniumConfigFile', '' );
+
                SeleniumConfig::getSeleniumSettings( $seleniumSettings,
                        $seleniumBrowsers,
                        $seleniumTestSuites );
@@ -152,9 +152,9 @@ testBrowser                 = "firefox"
                $seleniumSettings = array();
                $seleniumBrowsers = array();
                $seleniumTestSuites = array();
-               global $wgSeleniumConfigFile;
                $this->writeToTempFile( $this->testConfig0 );
-               $wgSeleniumConfigFile = $this->tempFileName;
+               $this->setMwGlobals( 'wgSeleniumConfigFile', $this->tempFileName );
+
                SeleniumConfig::getSeleniumSettings( $seleniumSettings,
                        $seleniumBrowsers,
                        $seleniumTestSuites );
index fc7d8d0..4cdf020 100644 (file)
@@ -10,6 +10,7 @@ function getSiteParams( $conf, $wiki ) {
                        break;
                }
        }
+
        return array(
                'suffix' => $site,
                'lang' => $lang,
index db3d265..842e2fc 100644 (file)
@@ -29,7 +29,7 @@ class StringUtilsTest extends MediaWikiTestCase {
         */
        function testIsUtf8WithPhpFallbackImplementation( $expected, $string ) {
                $this->assertEquals( $expected,
-                       StringUtils::isUtf8( $string, /** disable mbstring: */ true ),
+                       StringUtils::isUtf8( $string, /** disable mbstring: */true ),
                        'Testing string "' . $this->escaped( $string ) . '" with pure PHP implementation'
                );
        }
@@ -49,6 +49,7 @@ class StringUtilsTest extends MediaWikiTestCase {
                                $escaped .= $char;
                        }
                }
+
                return $escaped;
        }
 
@@ -57,7 +58,7 @@ class StringUtilsTest extends MediaWikiTestCase {
         * Markus Kuhn:
         * http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
         */
-       function provideStringsForIsUtf8Check() {
+       public static function provideStringsForIsUtf8Check() {
                // Expected return values for StringUtils::isUtf8()
                $PASS = true;
                $FAIL = false;
@@ -116,7 +117,7 @@ class StringUtilsTest extends MediaWikiTestCase {
                        array( $FAIL, "\xff" ),
                        array( $FAIL, "\xfe\xfe\xff\xff" ),
 
-                       /**
+                       /*
                        # The PHP implementation does not handle characters
                        # being represented in a form which is too long :(
 
@@ -133,7 +134,7 @@ class StringUtilsTest extends MediaWikiTestCase {
                        array( $FAIL, "\xf0\x8F\xbf\xbf" ),
                        array( $FAIL, "\xf8\x87\xbf\xbf" ),
                        array( $FAIL, "\xfc\x83\xbf\xbf\xbf\xbf" ),
-                       **/
+                       */
 
                        # non characters
                        array( $PASS, "\xef\xbf\xbe" ),
index a793bab..ffa8c42 100644 (file)
@@ -13,14 +13,14 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
                $user = new User();
                $user->mRights = array( 'createpage', 'edit', 'purge' );
 
-               $status = $page->doEditContent( new WikitextContent( '{{Categorising template}}' ), 'Create a page with a template', 0, false, $user );
+               $page->doEditContent( new WikitextContent( '{{Categorising template}}' ), 'Create a page with a template', 0, false, $user );
                $this->assertEquals(
                        array()
                        , $title->getParentCategories()
                );
 
                $template = WikiPage::factory( Title::newFromText( 'Template:Categorising template' ) );
-               $status = $template->doEditContent( new WikitextContent( '[[Category:Solved bugs]]' ), 'Add a category through a template', 0, false, $user );
+               $template->doEditContent( new WikitextContent( '[[Category:Solved bugs]]' ), 'Add a category through a template', 0, false, $user );
 
                // Run the job queue
                JobQueueGroup::destroySingletons();
@@ -33,5 +33,4 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
                        , $title->getParentCategories()
                );
        }
-
 }
index c4d8945..2fb0f49 100644 (file)
@@ -53,6 +53,5 @@ class TestUser {
                        }
                }
                $this->user->saveSettings();
-
        }
 }
index a58702b..3a2c62a 100644 (file)
@@ -4,22 +4,27 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
 
-               $this->setMwGlobals( array(
-                       'wgLocalTZoffset' => null,
-                       'wgContLang' => Language::factory( 'en' ),
-                       'wgLanguageCode' => 'en',
-               ) );
-
                $this->iniSet( 'precision', 15 );
        }
 
-       # Test offset usage for a given language::userAdjust
-       function testUserAdjust() {
-               global $wgLocalTZoffset, $wgContLang;
+       /**
+        * Test offset usage for a given language::userAdjust
+        * @dataProvider dataUserAdjust
+        */
+       public function testUserAdjust( $date, $localTZoffset, $expected ) {
+               global $wgContLang;
+
+               $this->setMwGlobals( 'wgLocalTZoffset', $localTZoffset );
 
-               #  Collection of parameters for Language_t_Offset.
-               # Format: date to be formatted, localTZoffset value, expected date
-               $userAdjust_tests = array(
+               $this->assertEquals(
+                       strval( $expected ),
+                       strval( $wgContLang->userAdjust( $date, '' ) ),
+                       "User adjust {$date} by {$localTZoffset} minutes should give {$expected}"
+               );
+       }
+
+       public static function dataUserAdjust() {
+               return array(
                        array( 20061231235959, 0, 20061231235959 ),
                        array( 20061231235959, 5, 20070101000459 ),
                        array( 20061231235959, 15, 20070101001459 ),
@@ -31,15 +36,5 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
                        array( 20061231235959, -30, 20061231232959 ),
                        array( 20061231235959, -60, 20061231225959 ),
                );
-
-               foreach ( $userAdjust_tests as $data ) {
-                       $wgLocalTZoffset = $data[1];
-
-                       $this->assertEquals(
-                               strval( $data[2] ),
-                               strval( $wgContLang->userAdjust( $data[0], '' ) ),
-                               "User adjust {$data[0]} by {$data[1]} minutes should give {$data[2]}"
-                       );
-               }
        }
 }
index 0690683..07dcb7d 100644 (file)
@@ -3,16 +3,12 @@
 /**
  * Tests timestamp parsing and output.
  */
-class TimestampTest extends MediaWikiTestCase {
+class TimestampTest extends MediaWikiLangTestCase {
 
        protected function setUp() {
                parent::setUp();
 
-               $this->setMwGlobals( array(
-                       'wgLanguageCode' => 'en',
-                       'wgContLang' => Language::factory( 'en' ),
-                       'wgLang' => Language::factory( 'en' ),
-               ) );
+               RequestContext::getMain()->setLanguage( Language::factory( 'en' ) );
        }
 
        /**
@@ -38,7 +34,7 @@ class TimestampTest extends MediaWikiTestCase {
         * @expectedException TimestampException
         */
        function testInvalidParse() {
-               $timestamp = new MWTimestamp( "This is not a timestamp." );
+               new MWTimestamp( "This is not a timestamp." );
        }
 
        /**
@@ -50,18 +46,6 @@ class TimestampTest extends MediaWikiTestCase {
                $timestamp->getTimestamp( 98 );
        }
 
-       /**
-        * Test human readable timestamp format.
-        */
-       function testHumanOutput() {
-               $timestamp = new MWTimestamp( time() - 3600 );
-               $this->assertEquals( "1 hour ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
-               $timestamp = new MWTimestamp( time() - 5184000 );
-               $this->assertEquals( "2 months ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
-               $timestamp = new MWTimestamp( time() - 31536000 );
-               $this->assertEquals( "1 year ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
-       }
-
        /**
         * Returns a list of valid timestamps in the format:
         * array( type, timestamp_of_type, timestamp_in_MW )
@@ -83,4 +67,137 @@ class TimestampTest extends MediaWikiTestCase {
                        array( TS_UNIX, '-62135596801', '00001231235959' )
                );
        }
+
+       /**
+        * @test
+        * @dataProvider provideHumanTimestampTests
+        */
+       public function testHumanTimestamp(
+               $tsTime, // The timestamp to format
+               $currentTime, // The time to consider "now"
+               $timeCorrection, // The time offset to use
+               $dateFormat, // The date preference to use
+               $expectedOutput, // The expected output
+               $desc // Description
+       ) {
+               $user = $this->getMock( 'User' );
+               $user->expects( $this->any() )
+                       ->method( 'getOption' )
+                       ->with( 'timecorrection' )
+                       ->will( $this->returnValue( $timeCorrection ) );
+
+               $user->expects( $this->any() )
+                       ->method( 'getDatePreference' )
+                       ->will( $this->returnValue( $dateFormat ) );
+
+               $tsTime = new MWTimestamp( $tsTime );
+               $currentTime = new MWTimestamp( $currentTime );
+
+               $this->assertEquals(
+                       $expectedOutput,
+                       $tsTime->getHumanTimestamp( $currentTime, $user ),
+                       $desc
+               );
+       }
+
+       public static function provideHumanTimestampTests() {
+               return array(
+                       array(
+                               '20111231170000',
+                               '20120101000000',
+                               'Offset|0',
+                               'mdy',
+                               'Yesterday at 17:00',
+                               '"Yesterday" across years',
+                       ),
+                       array(
+                               '20120717190900',
+                               '20120717190929',
+                               'Offset|0',
+                               'mdy',
+                               'just now',
+                               '"Just now"',
+                       ),
+                       array(
+                               '20120717190900',
+                               '20120717191530',
+                               'Offset|0',
+                               'mdy',
+                               '6 minutes ago',
+                               'X minutes ago',
+                       ),
+                       array(
+                               '20121006173100',
+                               '20121006173200',
+                               'Offset|0',
+                               'mdy',
+                               '1 minute ago',
+                               '"1 minute ago"',
+                       ),
+                       array(
+                               '20120617190900',
+                               '20120717190900',
+                               'Offset|0',
+                               'mdy',
+                               'June 17',
+                               'Another month'
+                       ),
+                       array(
+                               '19910130151500',
+                               '20120716193700',
+                               'Offset|0',
+                               'mdy',
+                               '15:15, January 30, 1991',
+                               'Different year',
+                       ),
+                       array(
+                               '20120101050000',
+                               '20120101080000',
+                               'Offset|-360',
+                               'mdy',
+                               'Yesterday at 23:00',
+                               '"Yesterday" across years with time correction',
+                       ),
+                       array(
+                               '20120714184300',
+                               '20120716184300',
+                               'Offset|-420',
+                               'mdy',
+                               'Saturday at 11:43',
+                               'Recent weekday with time correction',
+                       ),
+                       array(
+                               '20120714184300',
+                               '20120715040000',
+                               'Offset|-420',
+                               'mdy',
+                               '11:43',
+                               'Today at another time with time correction',
+                       ),
+                       array(
+                               '20120617190900',
+                               '20120717190900',
+                               'Offset|0',
+                               'dmy',
+                               '17 June',
+                               'Another month with dmy'
+                       ),
+                       array(
+                               '20120617190900',
+                               '20120717190900',
+                               'Offset|0',
+                               'ISO 8601',
+                               '06-17',
+                               'Another month with ISO-8601'
+                       ),
+                       array(
+                               '19910130151500',
+                               '20120716193700',
+                               'Offset|0',
+                               'ISO 8601',
+                               '1991-01-30T15:15:00',
+                               'Different year with ISO-8601',
+                       ),
+               );
+       }
 }
index 89812c9..a11c3d9 100644 (file)
@@ -10,7 +10,7 @@
  */
 class TitleMethodsTest extends MediaWikiTestCase {
 
-       public function setup() {
+       public function setUp() {
                global $wgContLang;
 
                parent::setUp();
@@ -34,7 +34,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $wgContLang->resetNamespaces(); # reset namespace cache
        }
 
-       public function teardown() {
+       public function tearDown() {
                global $wgContLang;
 
                parent::tearDown();
@@ -286,5 +286,4 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->isWikitextPage() );
        }
-
 }
index e2c079a..f0eb76f 100644 (file)
@@ -66,7 +66,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                        $this->user = $this->userUser;
                }
-
        }
 
        function setUserPerm( $perm ) {
@@ -234,7 +233,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                if ( $this->isWikitextNS( NS_MAIN ) ) {
                        //NOTE: some content models don't allow moving
-                       //@todo: find a Wikitext namespace for testing
+                       // @todo find a Wikitext namespace for testing
 
                        $this->setTitle( NS_MAIN );
                        $this->setUser( 'anon' );
@@ -317,7 +316,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                $this->title->userCan( $action, $this->user, true ) );
                        $this->assertEquals( $check[$action][3],
                                $this->title->quickUserCan( $action, $this->user ) );
-
                        # count( User::getGroupsWithPermissions( $action ) ) < 1
                }
        }
@@ -538,7 +536,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->userCan( 'edit', $this->user ) );
                $this->assertEquals( array(),
                        $this->title->getUserPermissionsErrors( 'edit', $this->user ) );
-
        }
 
        function testActionPermissions() {
@@ -562,7 +559,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( true,
                        $this->title->userCan( 'create', $this->user ) );
 
-
                $this->setUserPerm( array( 'createpage' ) );
                $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
                        $this->title->getUserPermissionsErrors( 'create', $this->user ) );
@@ -605,7 +601,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
                $this->assertEquals( false,
                        $this->title->userCan( 'move-target', $this->user ) );
-
        }
 
        function testUserBlock() {
@@ -648,13 +643,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                global $wgLocalTZoffset;
                $wgLocalTZoffset = -60;
                $this->user->mBlockedby = $this->user->getName();
-               $this->user->mBlock = new Block( '127.0.8.1', 0, 1, 'no reason given', $now, 0, 10 );
+               $this->user->mBlock = new Block( '127.0.8.1', 0, $this->user->getId(),
+                       'no reason given', $now, 0, 10 );
                $this->assertEquals( array( array( 'blockedtext',
                                '[[User:Useruser|Useruser]]', 'no reason given', '127.0.0.1',
                                'Useruser', null, '23:00, 31 December 1969', '127.0.8.1',
                                $wgLang->timeanddate( wfTimestamp( TS_MW, $now ), true ) ) ),
                        $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
-
                # $action != 'read' && $action != 'createaccount' && $user->isBlockedFrom( $this )
                #   $user->blockedFor() == ''
                #   $user->mBlock->mExpiry == 'infinity'
index a906785..33bd8d6 100644 (file)
@@ -38,7 +38,7 @@ class TitleTest extends MediaWikiTestCase {
        function testBug31100FixSpecialName( $text, $expectedParam ) {
                $title = Title::newFromText( $text );
                $fixed = $title->fixSpecialName();
-               $stuff = explode( '/', $fixed->getDbKey(), 2 );
+               $stuff = explode( '/', $fixed->getDBkey(), 2 );
                if ( count( $stuff ) == 2 ) {
                        $par = $stuff[1];
                } else {
@@ -197,6 +197,7 @@ class TitleTest extends MediaWikiTestCase {
                foreach ( $errors as $error ) {
                        $result[] = $error[0];
                }
+
                return $result;
        }
 
@@ -230,7 +231,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       function provideCasesForGetpageviewlanguage() {
+       public static function provideCasesForGetpageviewlanguage() {
                # Format:
                # - expected
                # - Title name
@@ -280,7 +281,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       function provideBaseTitleCases() {
+       public static function provideBaseTitleCases() {
                return array(
                        # Title, expected base, optional message
                        array( 'User:John_Doe/subOne/subTwo', 'John Doe/subOne' ),
@@ -319,7 +320,7 @@ class TitleTest extends MediaWikiTestCase {
                );
        }
 
-       function provideSubpageTitleCases() {
+       public static function provideSubpageTitleCases() {
                return array(
                        # Title, expected base, optional message
                        array( 'User:John_Doe/subOne/subTwo', 'subTwo' ),
index 46f8025..1c6b733 100644 (file)
@@ -101,11 +101,21 @@ class WebRequestTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideGetIP
         */
-       function testGetIP( $expected, $input, $squid, $private, $description ) {
-               global $wgSquidServersNoPurge, $wgUsePrivateIPs;
+       function testGetIP( $expected, $input, $squid, $xffList, $private, $description ) {
                $_SERVER = $input;
-               $wgSquidServersNoPurge = $squid;
-               $wgUsePrivateIPs = $private;
+               $this->setMwGlobals( array(
+                       'wgSquidServersNoPurge' => $squid,
+                       'wgUsePrivateIPs' => $private,
+                       'wgHooks' => array(
+                               'IsTrustedProxy' => array(
+                                       function( &$ip, &$trusted ) use ( $xffList ) {
+                                               $trusted = $trusted || in_array( $ip, $xffList );
+                                               return true;
+                                       }
+                               )
+                       )
+               ) );
+
                $request = new WebRequest();
                $result = $request->getIP();
                $this->assertEquals( $expected, $result, $description );
@@ -119,6 +129,7 @@ class WebRequestTest extends MediaWikiTestCase {
                                        'REMOTE_ADDR' => '127.0.0.1'
                                ),
                                array(),
+                               array(),
                                false,
                                'Simple IPv4'
                        ),
@@ -128,6 +139,7 @@ class WebRequestTest extends MediaWikiTestCase {
                                        'REMOTE_ADDR' => '::1'
                                ),
                                array(),
+                               array(),
                                false,
                                'Simple IPv6'
                        ),
@@ -138,6 +150,7 @@ class WebRequestTest extends MediaWikiTestCase {
                                        'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
                                ),
                                array( '12.0.0.1', '12.0.0.2' ),
+                               array(),
                                false,
                                'With X-Forwaded-For'
                        ),
@@ -148,6 +161,7 @@ class WebRequestTest extends MediaWikiTestCase {
                                        'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
                                ),
                                array(),
+                               array(),
                                false,
                                'With X-Forwaded-For and disallowed server'
                        ),
@@ -158,29 +172,87 @@ class WebRequestTest extends MediaWikiTestCase {
                                        'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
                                ),
                                array( '12.0.0.1' ),
+                               array(),
                                false,
                                'With multiple X-Forwaded-For and only one allowed server'
                        ),
                        array(
-                               '12.0.0.2',
+                               '10.0.0.3',
                                array(
                                        'REMOTE_ADDR' => '12.0.0.2',
-                                       'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+                                       'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
                                ),
                                array( '12.0.0.1', '12.0.0.2' ),
+                               array(),
                                false,
-                               'With X-Forwaded-For and private IP'
+                               'With X-Forwaded-For and private IP (from cache proxy)'
                        ),
                        array(
-                               '10.0.0.3',
+                               '10.0.0.4',
                                array(
                                        'REMOTE_ADDR' => '12.0.0.2',
-                                       'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+                                       'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
+                               ),
+                               array( '12.0.0.1', '12.0.0.2', '10.0.0.3' ),
+                               array(),
+                               true,
+                               'With X-Forwaded-For and private IP (allowed)'
+                       ),
+                       array(
+                               '10.0.0.4',
+                               array(
+                                       'REMOTE_ADDR' => '12.0.0.2',
+                                       'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
                                ),
                                array( '12.0.0.1', '12.0.0.2' ),
+                               array( '10.0.0.3' ),
                                true,
                                'With X-Forwaded-For and private IP (allowed)'
                        ),
+                       array(
+                               '10.0.0.3',
+                               array(
+                                       'REMOTE_ADDR' => '12.0.0.2',
+                                       'HTTP_X_FORWARDED_FOR' => '10.0.0.4, 10.0.0.3, 12.0.0.2'
+                               ),
+                               array( '12.0.0.1', '12.0.0.2' ),
+                               array( '10.0.0.3' ),
+                               false,
+                               'With X-Forwaded-For and private IP (disallowed)'
+                       ),
+                       array(
+                               '12.0.0.3',
+                               array(
+                                       'REMOTE_ADDR' => '12.0.0.1',
+                                       'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
+                               ),
+                               array(),
+                               array( '12.0.0.1', '12.0.0.2' ),
+                               false,
+                               'With X-Forwaded-For'
+                       ),
+                       array(
+                               '12.0.0.2',
+                               array(
+                                       'REMOTE_ADDR' => '12.0.0.1',
+                                       'HTTP_X_FORWARDED_FOR' => '12.0.0.3, 12.0.0.2'
+                               ),
+                               array(),
+                               array( '12.0.0.1' ),
+                               false,
+                               'With multiple X-Forwaded-For and only one allowed server'
+                       ),
+                       array(
+                               '12.0.0.2',
+                               array(
+                                       'REMOTE_ADDR' => '12.0.0.2',
+                                       'HTTP_X_FORWARDED_FOR' => '10.0.0.3, 12.0.0.2'
+                               ),
+                               array(),
+                               array( '12.0.0.2' ),
+                               false,
+                               'With X-Forwaded-For and private IP and hook (disallowed)'
+                       ),
                );
        }
 
index 4bb6daa..bf8cd37 100644 (file)
@@ -569,7 +569,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
        public static function provideGetParserOutput() {
                return array(
                        array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>" ),
-                       // @todo: more...?
+                       // @todo more...?
                );
        }
 
@@ -587,6 +587,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $text = preg_replace( '!\s*(</p>)!sm', '\1', $text ); # don't let tidy confuse us
 
                $this->assertEquals( $expectedHtml, $text );
+
                return $po;
        }
 
@@ -608,7 +609,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $opt = new ParserOptions();
                $po = $page->getParserOutput( $opt, $page->getLatest() + 1234 );
 
-               //@todo: would be neat to also test deleted revision
+               // @todo would be neat to also test deleted revision
 
                $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
        }
@@ -1014,5 +1015,4 @@ more stuff
 
                $this->assertEquals( $expected, $text );
        }
-
 }
index 1d937e9..41f3572 100644 (file)
@@ -6,16 +6,10 @@
  * ^--- important, causes temporary tables to be used instead of the real database
  */
 class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
-       var $saveContentHandlerNoDB = null;
 
        function setUp() {
-               global $wgContentHandlerUseDB;
-
                parent::setUp();
-
-               $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
-
-               $wgContentHandlerUseDB = false;
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
 
                $dbw = wfGetDB( DB_MASTER );
 
@@ -32,14 +26,6 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
                }
        }
 
-       function tearDown() {
-               global $wgContentHandlerUseDB;
-
-               $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
-
-               parent::tearDown();
-       }
-
        public function testGetContentModel() {
                $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
 
@@ -58,5 +44,4 @@ class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
                $page = new WikiPage( $page->getTitle() );
                $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
        }
-
 }
index d7227b4..08c031f 100644 (file)
@@ -7,7 +7,6 @@ class XmlSelectTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
                $this->setMwGlobals( array(
-                       'wgHtml5' => true,
                        'wgWellFormedXml' => true,
                ) );
                $this->select = new XmlSelect();
index f482328..2294804 100644 (file)
@@ -29,7 +29,6 @@ class XmlTest extends MediaWikiTestCase {
 
                $this->setMwGlobals( array(
                        'wgLang' => $langObj,
-                       'wgHtml5' => true,
                        'wgWellFormedXml' => true,
                ) );
        }
index 94082e5..50638ca 100644 (file)
@@ -47,13 +47,16 @@ class ApiCreateAccountTest extends ApiTestCase {
                $token = $a['token'];
 
                // Finally create the account
-               $ret = $this->doApiRequest( array(
-                       'action' => 'createaccount',
-                       'name' => 'Apitestnew',
-                       'password' => $password,
-                       'token' => $token,
-                       'email' => 'test@domain.test',
-                       'realname' => 'Test Name' ), $ret[2]
+               $ret = $this->doApiRequest(
+                       array(
+                               'action' => 'createaccount',
+                               'name' => 'Apitestnew',
+                               'password' => $password,
+                               'token' => $token,
+                               'email' => 'test@domain.test',
+                               'realname' => 'Test Name'
+                       ),
+                       $ret[2]
                );
 
                $result = $ret[0];
@@ -65,8 +68,7 @@ class ApiCreateAccountTest extends ApiTestCase {
                        'action' => 'login',
                        'lgname' => 'Apitestnew',
                        'lgpassword' => $password,
-                       )
-               );
+               ) );
 
                $result = $ret[0];
                $this->assertNotInternalType( 'bool', $result );
@@ -76,12 +78,14 @@ class ApiCreateAccountTest extends ApiTestCase {
                $this->assertEquals( 'NeedToken', $a );
                $token = $result['login']['token'];
 
-               $ret = $this->doApiRequest( array(
-                       'action' => 'login',
-                       'lgtoken' => $token,
-                       'lgname' => 'Apitestnew',
-                       'lgpassword' => $password,
-                       ), $ret[2]
+               $ret = $this->doApiRequest(
+                       array(
+                               'action' => 'login',
+                               'lgtoken' => $token,
+                               'lgname' => 'Apitestnew',
+                               'lgpassword' => $password,
+                       ),
+                       $ret[2]
                );
 
                $result = $ret[0];
@@ -92,9 +96,11 @@ class ApiCreateAccountTest extends ApiTestCase {
                $this->assertEquals( 'Success', $a );
 
                // log out to destroy the session
-               $ret = $this->doApiRequest( array(
-                       'action' => 'logout',
-                       ), $ret[2]
+               $ret = $this->doApiRequest(
+                       array(
+                               'action' => 'logout',
+                       ),
+                       $ret[2]
                );
                $this->assertEquals( array(), $ret[0] );
        }
@@ -104,7 +110,7 @@ class ApiCreateAccountTest extends ApiTestCase {
         * @expectedException UsageException
         */
        function testNoName() {
-               $ret = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'createaccount',
                        'token' => LoginForm::getCreateaccountToken(),
                        'password' => 'password',
@@ -116,7 +122,7 @@ class ApiCreateAccountTest extends ApiTestCase {
         * @expectedException UsageException
         */
        function testNoPassword() {
-               $ret = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'createaccount',
                        'name' => 'testName',
                        'token' => LoginForm::getCreateaccountToken(),
index 8f6b935..a3d39dd 100644 (file)
@@ -6,7 +6,6 @@
  * @group medium
  */
 class ApiBlockTest extends ApiTestCase {
-
        protected function setUp() {
                parent::setUp();
                $this->doLogin();
@@ -36,7 +35,6 @@ class ApiBlockTest extends ApiTestCase {
         * previously always considered valid (bug 34212).
         */
        function testMakeNormalBlock() {
-
                $data = $this->getTokens();
 
                $user = User::newFromName( 'UTApiBlockee' );
@@ -53,7 +51,7 @@ class ApiBlockTest extends ApiTestCase {
                $key = array_pop( $keys );
                $pageinfo = $data[0]['query']['pages'][$key];
 
-               $data = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'block',
                        'user' => 'UTApiBlockee',
                        'reason' => 'Some reason',
@@ -66,7 +64,6 @@ class ApiBlockTest extends ApiTestCase {
                $this->assertEquals( 'UTApiBlockee', (string)$block->getTarget() );
                $this->assertEquals( 'Some reason', $block->mReason );
                $this->assertEquals( 'infinity', $block->mExpiry );
-
        }
 
        /**
@@ -109,7 +106,7 @@ class ApiBlockTest extends ApiTestCase {
        /**
         * Just provide the 'block' and 'unblock' action to test both API calls
         */
-       function provideBlockUnblockAction() {
+       public static function provideBlockUnblockAction() {
                return array(
                        array( 'block' ),
                        array( 'unblock' ),
index 1efbaea..f3b9a67 100644 (file)
  */
 class ApiEditPageTest extends ApiTestCase {
 
-       public function setup() {
+       public function setUp() {
                global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
 
-               parent::setup();
+               parent::setUp();
 
                $wgExtraNamespaces[12312] = 'Dummy';
                $wgExtraNamespaces[12313] = 'Dummy_talk';
@@ -28,7 +28,7 @@ class ApiEditPageTest extends ApiTestCase {
                $this->doLogin();
        }
 
-       public function teardown() {
+       public function tearDown() {
                global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
 
                unset( $wgExtraNamespaces[12312] );
@@ -40,7 +40,7 @@ class ApiEditPageTest extends ApiTestCase {
                MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
                $wgContLang->resetNamespaces(); # reset namespace cache
 
-               parent::teardown();
+               parent::tearDown();
        }
 
        function testEdit() {
@@ -124,7 +124,7 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertEquals( $data, $page->getContent()->serialize() );
        }
 
-       static function provideEditAppend() {
+       public static function provideEditAppend() {
                return array(
                        array( #0: append
                                'foo', 'append', 'bar', "foobar"
@@ -161,13 +161,13 @@ class ApiEditPageTest extends ApiTestCase {
                if ( $text !== null ) {
                        if ( $text === '' ) {
                                // can't create an empty page, so create it with some content
-                               list( $re, , ) = $this->doApiRequestWithToken( array(
+                               $this->doApiRequestWithToken( array(
                                        'action' => 'edit',
                                        'title' => $name,
                                        'text' => '(dummy)', ) );
                        }
 
-                       list( $re, , ) = $this->doApiRequestWithToken( array(
+                       list( $re ) = $this->doApiRequestWithToken( array(
                                'action' => 'edit',
                                'title' => $name,
                                'text' => $text, ) );
@@ -176,7 +176,7 @@ class ApiEditPageTest extends ApiTestCase {
                }
 
                // -- try append/prepend --------------------------------------------
-               list( $re, , ) = $this->doApiRequestWithToken( array(
+               list( $re ) = $this->doApiRequestWithToken( array(
                        'action' => 'edit',
                        'title' => $name,
                        $op . 'text' => $append, ) );
@@ -224,7 +224,7 @@ class ApiEditPageTest extends ApiTestCase {
 
                // try to save edit, expect conflict
                try {
-                       list( $re, , ) = $this->doApiRequestWithToken( array(
+                       $this->doApiRequestWithToken( array(
                                'action' => 'edit',
                                'title' => $name,
                                'text' => 'nix bar!',
@@ -280,7 +280,7 @@ class ApiEditPageTest extends ApiTestCase {
 
                // try again, without following the redirect. Should fail.
                try {
-                       list( $re, , ) = $this->doApiRequestWithToken( array(
+                       $this->doApiRequestWithToken( array(
                                'action' => 'edit',
                                'title' => $rname,
                                'text' => 'nix bar!',
index 902b7b8..ae74e38 100644 (file)
@@ -116,6 +116,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                                $mapping[$key] = 'unused';
                        }
                }
+
                return $mapping;
        }
 
@@ -126,12 +127,14 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'optionname' => null,
                        'optionvalue' => null,
                );
+
                return array_merge( $request, $custom );
        }
 
        private function executeQuery( $request ) {
                $this->mContext->setRequest( new FauxRequest( $request, true, $this->mSession ) );
                $this->mTested->execute();
+
                return $this->mTested->getResult()->getData();
        }
 
@@ -156,6 +159,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                } catch ( UsageException $e ) {
                        $this->assertEquals( 'notloggedin', $e->getCodeString() );
                        $this->assertEquals( 'Anonymous users cannot change preferences', $e->getMessage() );
+
                        return;
                }
                $this->fail( "UsageException was not thrown" );
@@ -169,6 +173,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                } catch ( UsageException $e ) {
                        $this->assertEquals( 'nooptionname', $e->getCodeString() );
                        $this->assertEquals( 'The optionname parameter must be set', $e->getMessage() );
+
                        return;
                }
                $this->fail( "UsageException was not thrown" );
@@ -191,6 +196,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                } catch ( UsageException $e ) {
                        $this->assertEquals( 'nochanges', $e->getCodeString() );
                        $this->assertEquals( 'No changes were requested', $e->getMessage() );
+
                        return;
                }
                $this->fail( "UsageException was not thrown" );
index a42e5aa..b408875 100644 (file)
@@ -16,7 +16,7 @@ class ApiParseTest extends ApiTestCase {
                $somePage = mt_rand();
 
                try {
-                       $data = $this->doApiRequest( array(
+                       $this->doApiRequest( array(
                                'action' => 'parse',
                                'page' => $somePage ) );
 
@@ -26,5 +26,4 @@ class ApiParseTest extends ApiTestCase {
                                "Parse request for nonexistent page must give 'missingtitle' error: " . var_export( $ex->getMessageArray(), true ) );
                }
        }
-
 }
index a7f9229..881eb3f 100644 (file)
@@ -37,5 +37,4 @@ class ApiPurgeTest extends ApiTestCase {
                        $this->assertArrayHasKey( $pages[$v['title']], $v );
                }
        }
-
 }
index 2277028..e278fd0 100644 (file)
@@ -81,8 +81,7 @@ class ApiTest extends ApiTestCase {
                        "action" => "login",
                        "lgname" => $user->username,
                        "lgpassword" => "bad",
-                       )
-               );
+               ) );
 
                $result = $ret[0];
 
@@ -136,7 +135,7 @@ class ApiTest extends ApiTestCase {
                $token = $result["login"]["token"];
 
                $ret = $this->doApiRequest(
-                       array(
+                       array(
                                "action" => "login",
                                "lgtoken" => $token,
                                "lgname" => $user->username,
index 552fbfb..1559bef 100644 (file)
@@ -52,6 +52,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
        protected function editPage( $pageName, $text, $summary = '', $defaultNs = NS_MAIN ) {
                $title = Title::newFromText( $pageName, $defaultNs );
                $page = WikiPage::factory( $title );
+
                return $page->doEditContent( ContentHandler::makeContent( $text, $title ), $summary );
        }
 
@@ -131,6 +132,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        $session['wsEditToken'] = $session['wsToken'];
                        // add token to request parameters
                        $params['token'] = md5( $session['wsToken'] ) . User::EDIT_TOKEN_SUFFIX;
+
                        return $this->doApiRequest( $params, $session, false, $user );
                } else {
                        throw new Exception( "request data not in right format" );
@@ -164,6 +166,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        'titles' => 'Main Page',
                        'intoken' => 'edit|delete|protect|move|block|unblock|watch',
                        'prop' => 'info' ), $session, false, $user->user );
+
                return $data;
        }
 
@@ -204,11 +207,14 @@ class UserWrapper {
 }
 
 class MockApi extends ApiBase {
-       public function execute() {}
+       public function execute() {
+       }
 
-       public function getVersion() {}
+       public function getVersion() {
+       }
 
-       public function __construct() {}
+       public function __construct() {
+       }
 
        public function getAllowedParams() {
                return array(
@@ -234,6 +240,7 @@ class ApiTestContext extends RequestContext {
                if ( $user !== null ) {
                        $context->setUser( $user );
                }
+
                return $context;
        }
 }
index 8028491..7e18b6e 100644 (file)
@@ -47,6 +47,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                        // see if it now doesn't exist; reload
                        $title = Title::newFromText( $title->getText(), NS_FILE );
                }
+
                return !( $title && $title instanceof Title && $title->exists() );
        }
 
@@ -69,6 +70,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                foreach ( $dupes as $dupe ) {
                        $success &= $this->deleteFileByTitle( $dupe->getTitle() );
                }
+
                return $success;
        }
 
@@ -105,7 +107,6 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                );
 
                return true;
-
        }
 
        function fakeUploadChunk( $fieldName, $fileName, $type, & $chunkData ) {
@@ -145,5 +146,4 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
        function clearFakeUploads() {
                $_FILES = array();
        }
-
 }
index 0d98b04..2548273 100644 (file)
@@ -16,7 +16,7 @@
 
 // TODO: port the other Upload tests, and other API tests to this framework
 
-require_once( 'ApiTestCaseUpload.php' );
+require_once 'ApiTestCaseUpload.php';
 
 /**
  * @group Database
@@ -27,7 +27,6 @@ require_once( 'ApiTestCaseUpload.php' );
  * This is pretty sucky... needs to be prettified.
  */
 class ApiUploadTest extends ApiTestCaseUpload {
-
        /**
         * Testing login
         * XXX this is a funny way of getting session context
@@ -59,8 +58,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->assertArrayHasKey( 'lgtoken', $result['login'] );
 
                $this->assertNotEmpty( $session, 'API Login must return a session' );
-               return $session;
 
+               return $session;
        }
 
        /**
@@ -118,7 +117,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->deleteFileByFileName( $fileName );
                $this->deleteFileByContent( $filePath );
 
-
                if ( !$this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
                        $this->markTestIncomplete( "Couldn't upload file!\n" );
                }
@@ -298,7 +296,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user );
                } catch ( UsageException $e ) {
                        $exception = true;
@@ -307,7 +305,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->assertEquals( 'Success', $result['upload']['result'] );
                $this->assertFalse( $exception );
 
-
                // second upload with the same content (but different name)
 
                if ( !$this->fakeUploadFile( 'file', $fileNames[1], $mimeType, $filePaths[0] ) ) {
@@ -324,7 +321,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user ); // FIXME: leaks a temporary file
                } catch ( UsageException $e ) {
                        $exception = true;
@@ -341,7 +338,6 @@ class ApiUploadTest extends ApiTestCaseUpload {
                unlink( $filePaths[0] );
        }
 
-
        /**
         * @depends testLogin
         */
@@ -382,7 +378,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
 
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user ); // FIXME: leaks a temporary file
                } catch ( UsageException $e ) {
                        $exception = true;
@@ -411,7 +407,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->clearFakeUploads();
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user );
                } catch ( UsageException $e ) {
                        $exception = true;
@@ -482,7 +478,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        if ( !$chunkSessionKey ) {
                                // Upload fist chunk ( and get the session key )
                                try {
-                                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                                self::$users['uploader']->user );
                                } catch ( UsageException $e ) {
                                        $this->markTestIncomplete( $e->getMessage() );
@@ -509,7 +505,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        $this->assertEquals( $resultOffset, $params['offset'] );
                        // Upload current chunk
                        try {
-                               list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                               list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
                                        self::$users['uploader']->user );
                        } catch ( UsageException $e ) {
                                $this->markTestIncomplete( $e->getMessage() );
@@ -548,7 +544,7 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $this->clearFakeUploads();
                $exception = false;
                try {
-                       list( $result, $request, $session ) = $this->doApiRequestWithToken( $params, $session,
+                       list( $result ) = $this->doApiRequestWithToken( $params, $session,
                                self::$users['uploader']->user );
                } catch ( UsageException $e ) {
                        $exception = true;
index aefd939..a9bc43a 100644 (file)
@@ -7,7 +7,6 @@
  * @todo This test suite is severly broken and need a full review
  */
 class ApiWatchTest extends ApiTestCase {
-
        protected function setUp() {
                parent::setUp();
                $this->doLogin();
@@ -95,8 +94,7 @@ class ApiWatchTest extends ApiTestCase {
        /**
         */
        function testGetRollbackToken() {
-
-               $pageinfo = $this->getTokens();
+               $this->getTokens();
 
                if ( !Title::newFromText( 'Help:UTPage' )->exists() ) {
                        $this->markTestSkipped( "The article [[Help:UTPage]] does not exist" ); //TODO: just create it?
@@ -168,7 +166,7 @@ class ApiWatchTest extends ApiTestCase {
                $this->assertArrayHasKey( 'delete', $data[0] );
                $this->assertArrayHasKey( 'title', $data[0]['delete'] );
 
-               $data = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'query',
                        'list' => 'watchlist' ) );
 
index 3040758..59756b2 100644 (file)
@@ -34,7 +34,7 @@ class RandomImageGenerator {
        private $shapesToDraw = 5;
 
        /**
-        * Orientations: 0th row, 0th column, EXIF orientation code, rotation 2x2 matrix that is opposite of orientation
+        * Orientations: 0th row, 0th column, Exif orientation code, rotation 2x2 matrix that is opposite of orientation
         * n.b. we do not handle the 'flipped' orientations, which is why there is no entry for 2, 4, 5, or 7. Those
         * seem to be rare in real images anyway
         * (we also would need a non-symmetric shape for the images to test those, like a letter F)
@@ -108,6 +108,7 @@ class RandomImageGenerator {
                foreach ( $filenames as $filename ) {
                        $this->{$imageWriteMethod}( $this->getImageSpec(), $format, $filename );
                }
+
                return $filenames;
        }
 
@@ -156,7 +157,6 @@ class RandomImageGenerator {
                }
 
                return $filenames;
-
        }
 
 
@@ -196,7 +196,6 @@ class RandomImageGenerator {
                                array( 'x' => $originX, 'y' => $originY - $radius )
                        );
                        $draws[] = $draw;
-
                }
 
                $spec['draws'] = $draws;
@@ -216,6 +215,7 @@ class RandomImageGenerator {
                foreach ( $shape as $point ) {
                        $points[] = $point['x'] . ',' . $point['y'];
                }
+
                return join( " ", $points );
        }
 
@@ -304,7 +304,7 @@ class RandomImageGenerator {
 
        /**
         * Given an image specification, produce rotated version
-        * This is used when simulating a rotated image capture with EXIF orientation
+        * This is used when simulating a rotated image capture with Exif orientation
         * @param $spec Object returned by getImageSpec
         * @param $matrix 2x2 transformation matrix
         * @return transformed Spec
@@ -337,6 +337,7 @@ class RandomImageGenerator {
                        }
                        $tSpec['draws'][] = $tDraw;
                }
+
                return $tSpec;
        }
 
@@ -384,6 +385,7 @@ class RandomImageGenerator {
                $command = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " . implode( " ", $args );
                $retval = null;
                wfShellExec( $command, $retval );
+
                return ( $retval === 0 );
        }
 
@@ -397,6 +399,7 @@ class RandomImageGenerator {
                for ( $i = 0; $i <= 2; $i++ ) {
                        $components[] = mt_rand( 0, 255 );
                }
+
                return 'rgb(' . join( ', ', $components ) . ')';
        }
 
@@ -414,6 +417,7 @@ class RandomImageGenerator {
                for ( $i = 0; $i < $count; $i += 2 ) {
                        $pairs[] = array( $lines[$i], $lines[$i + 1] );
                }
+
                return $pairs;
        }
 
@@ -461,5 +465,4 @@ class RandomImageGenerator {
 
                return $lines;
        }
-
 }
index a59983d..802a0e1 100644 (file)
@@ -13,7 +13,5 @@ class ApiFormatPhpTest extends ApiFormatTestBase {
 
                $this->assertInternalType( 'array', unserialize( $data ) );
                $this->assertGreaterThan( 0, count( (array)$data ) );
-
        }
-
 }
index bdd15c4..87f5c4c 100644 (file)
@@ -6,8 +6,8 @@
  */
 
 // Start up MediaWiki in command-line mode
-require_once( __DIR__ . "/../../../../maintenance/Maintenance.php" );
-require( __DIR__ . "/RandomImageGenerator.php" );
+require_once __DIR__ . "/../../../../maintenance/Maintenance.php";
+require __DIR__ . "/RandomImageGenerator.php";
 
 class GenerateRandomImages extends Maintenance {
 
@@ -43,4 +43,4 @@ class GenerateRandomImages extends Maintenance {
 }
 
 $maintClass = 'GenerateRandomImages';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
index 6d4e371..403034b 100644 (file)
@@ -24,7 +24,7 @@
  * @file
  */
 
-require_once( 'ApiQueryTestBase.php' );
+require_once 'ApiQueryTestBase.php';
 
 /** These tests validate basic functionality of the api query module
  *
@@ -67,7 +67,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'title' => 'AQBT-All',
                                'links' => array(
                                        array( 'ns' => 0, 'title' => 'AQBT-Links' ),
-       ) ) ) ) );
+                               )
+                       )
+               ) )
+       );
 
        private static $templates = array(
                array( 'prop' => 'templates', 'titles' => 'AQBT-All' ),
@@ -78,7 +81,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'title' => 'AQBT-All',
                                'templates' => array(
                                        array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
-       ) ) ) ) );
+                               )
+                       )
+               ) )
+       );
 
        private static $categories = array(
                array( 'prop' => 'categories', 'titles' => 'AQBT-All' ),
@@ -89,7 +95,10 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'title' => 'AQBT-All',
                                'categories' => array(
                                        array( 'ns' => 14, 'title' => 'Category:AQBT-Cat' ),
-       ) ) ) ) );
+                               )
+                       )
+               ) )
+       );
 
        private static $allpages = array(
                array( 'list' => 'allpages', 'apprefix' => 'AQBT-' ),
@@ -98,7 +107,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                        array( 'pageid' => 2, 'ns' => 0, 'title' => 'AQBT-Categories' ),
                        array( 'pageid' => 3, 'ns' => 0, 'title' => 'AQBT-Links' ),
                        array( 'pageid' => 4, 'ns' => 0, 'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $alllinks = array(
                array( 'list' => 'alllinks', 'alprefix' => 'AQBT-' ),
@@ -107,40 +117,46 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                        array( 'ns' => 0, 'title' => 'AQBT-Categories' ),
                        array( 'ns' => 0, 'title' => 'AQBT-Links' ),
                        array( 'ns' => 0, 'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $alltransclusions = array(
                array( 'list' => 'alltransclusions', 'atprefix' => 'AQBT-' ),
                array( 'alltransclusions' => array(
                        array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
                        array( 'ns' => 10, 'title' => 'Template:AQBT-T' ),
-       ) ) );
+               ) )
+       );
 
        private static $allcategories = array(
                array( 'list' => 'allcategories', 'acprefix' => 'AQBT-' ),
                array( 'allcategories' => array(
                        array( '*' => 'AQBT-Cat' ),
-       ) ) );
+               ) )
+       );
 
        private static $backlinks = array(
                array( 'list' => 'backlinks', 'bltitle' => 'AQBT-Links' ),
                array( 'backlinks' => array(
                        array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
-       ) ) );
+               ) )
+       );
 
        private static $embeddedin = array(
                array( 'list' => 'embeddedin', 'eititle' => 'Template:AQBT-T' ),
                array( 'embeddedin' => array(
                        array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
                        array( 'pageid' => 4, 'ns' => 0, 'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $categorymembers = array(
                array( 'list' => 'categorymembers', 'cmtitle' => 'Category:AQBT-Cat' ),
                array( 'categorymembers' => array(
                        array( 'pageid' => 1, 'ns' => 0, 'title' => 'AQBT-All' ),
                        array( 'pageid' => 2, 'ns' => 0, 'title' => 'AQBT-Categories' ),
-       ) ) );
+               ) )
+       );
 
        private static $generatorAllpages = array(
                array( 'generator' => 'allpages', 'gapprefix' => 'AQBT-' ),
@@ -161,7 +177,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'pageid' => 4,
                                'ns' => 0,
                                'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $generatorLinks = array(
                array( 'generator' => 'links', 'titles' => 'AQBT-Links' ),
@@ -178,14 +195,17 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                'pageid' => 4,
                                'ns' => 0,
                                'title' => 'AQBT-Templates' ),
-       ) ) );
+               ) )
+       );
 
        private static $generatorLinksPropLinks = array(
                array( 'prop' => 'links' ),
                array( 'pages' => array(
                        '1' => array( 'links' => array(
                                array( 'ns' => 0, 'title' => 'AQBT-Links' ),
-       ) ) ) ) );
+                       ) )
+               ) )
+       );
 
        private static $generatorLinksPropTemplates = array(
                array( 'prop' => 'templates' ),
@@ -194,7 +214,8 @@ class ApiQueryBasicTest extends ApiQueryTestBase {
                                array( 'ns' => 10, 'title' => 'Template:AQBT-T' ) ) ),
                        '4' => array( 'templates' => array(
                                array( 'ns' => 10, 'title' => 'Template:AQBT-T' ) ) ),
-               ) ) );
+               ) )
+       );
 
        /**
         * Test basic props
index 0a3ac1d..4d5ddba 100644 (file)
@@ -18,7 +18,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once( 'ApiQueryContinueTestBase.php' );
+require_once 'ApiQueryContinueTestBase.php';
 
 /**
  * @group API
@@ -48,7 +48,7 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
         */
        public function testA() {
                $this->mVerbose = false;
-               $mk = function( $g, $p, $gDir ) {
+               $mk = function ( $g, $p, $gDir ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT73462-',
@@ -59,10 +59,10 @@ class ApiQueryContinue2Test extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop + 1 list
-               $data = $this->query( $mk(99,99,true), 1, 'g1p', false );
-               $this->checkC( $data, $mk(1,1,true), 6, 'g1p-11t' );
-               $this->checkC( $data, $mk(2,2,true), 3, 'g1p-22t' );
-               $this->checkC( $data, $mk(1,1,false), 6, 'g1p-11f' );
-               $this->checkC( $data, $mk(2,2,false), 3, 'g1p-22f' );
+               $data = $this->query( $mk( 99, 99, true ), 1, 'g1p', false );
+               $this->checkC( $data, $mk( 1, 1, true ), 6, 'g1p-11t' );
+               $this->checkC( $data, $mk( 2, 2, true ), 3, 'g1p-22t' );
+               $this->checkC( $data, $mk( 1, 1, false ), 6, 'g1p-11f' );
+               $this->checkC( $data, $mk( 2, 2, false ), 3, 'g1p-22f' );
        }
 }
index cb8f181..f494e9c 100644 (file)
@@ -18,7 +18,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once( 'ApiQueryContinueTestBase.php' );
+require_once 'ApiQueryContinueTestBase.php';
 
 /**
  * These tests validate the new continue functionality of the api query module by
@@ -58,21 +58,21 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function test1List() {
                $this->mVerbose = false;
-               $mk = function( $l ) {
+               $mk = function ( $l ) {
                        return array(
                                'list' => 'allpages',
                                'apprefix' => 'AQCT-',
                                'aplimit' => "$l",
                        );
                };
-               $data = $this->query( $mk(99), 1, '1L', false );
+               $data = $this->query( $mk( 99 ), 1, '1L', false );
 
                // 1 list
-               $this->checkC( $data, $mk(1), 5, '1L-1' );
-               $this->checkC( $data, $mk(2), 3, '1L-2' );
-               $this->checkC( $data, $mk(3), 2, '1L-3' );
-               $this->checkC( $data, $mk(4), 2, '1L-4' );
-               $this->checkC( $data, $mk(5), 1, '1L-5' );
+               $this->checkC( $data, $mk( 1 ), 5, '1L-1' );
+               $this->checkC( $data, $mk( 2 ), 3, '1L-2' );
+               $this->checkC( $data, $mk( 3 ), 2, '1L-3' );
+               $this->checkC( $data, $mk( 4 ), 2, '1L-4' );
+               $this->checkC( $data, $mk( 5 ), 1, '1L-5' );
        }
 
        /**
@@ -81,7 +81,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function test2Lists() {
                $this->mVerbose = false;
-               $mk = function( $l1, $l2 ) {
+               $mk = function ( $l1, $l2 ) {
                        return array(
                                'list' => 'allpages|alltransclusions',
                                'apprefix' => 'AQCT-',
@@ -92,12 +92,12 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // 2 lists
-               $data = $this->query( $mk(99,99), 1, '2L', false );
-               $this->checkC( $data, $mk(1,1), 5, '2L-11' );
-               $this->checkC( $data, $mk(2,2), 3, '2L-22' );
-               $this->checkC( $data, $mk(3,3), 2, '2L-33' );
-               $this->checkC( $data, $mk(4,4), 2, '2L-44' );
-               $this->checkC( $data, $mk(5,5), 1, '2L-55' );
+               $data = $this->query( $mk( 99, 99 ), 1, '2L', false );
+               $this->checkC( $data, $mk( 1, 1 ), 5, '2L-11' );
+               $this->checkC( $data, $mk( 2, 2 ), 3, '2L-22' );
+               $this->checkC( $data, $mk( 3, 3 ), 2, '2L-33' );
+               $this->checkC( $data, $mk( 4, 4 ), 2, '2L-44' );
+               $this->checkC( $data, $mk( 5, 5 ), 1, '2L-55' );
        }
 
        /**
@@ -106,7 +106,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testGen1Prop() {
                $this->mVerbose = false;
-               $mk = function( $g, $p ) {
+               $mk = function ( $g, $p ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -116,12 +116,12 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop
-               $data = $this->query( $mk(99,99), 1, 'G1P', false );
-               $this->checkC( $data, $mk(1,1), 11, 'G1P-11' );
-               $this->checkC( $data, $mk(2,2), 6, 'G1P-22' );
-               $this->checkC( $data, $mk(3,3), 4, 'G1P-33' );
-               $this->checkC( $data, $mk(4,4), 3, 'G1P-44' );
-               $this->checkC( $data, $mk(5,5), 2, 'G1P-55' );
+               $data = $this->query( $mk( 99, 99 ), 1, 'G1P', false );
+               $this->checkC( $data, $mk( 1, 1 ), 11, 'G1P-11' );
+               $this->checkC( $data, $mk( 2, 2 ), 6, 'G1P-22' );
+               $this->checkC( $data, $mk( 3, 3 ), 4, 'G1P-33' );
+               $this->checkC( $data, $mk( 4, 4 ), 3, 'G1P-44' );
+               $this->checkC( $data, $mk( 5, 5 ), 2, 'G1P-55' );
        }
 
        /**
@@ -130,7 +130,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testGen2Prop() {
                $this->mVerbose = false;
-               $mk = function( $g, $p1, $p2 ) {
+               $mk = function ( $g, $p1, $p2 ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -141,17 +141,17 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 2 props
-               $data = $this->query( $mk(99,99,99), 1, 'G2P', false );
-               $this->checkC( $data, $mk(1,1,1), 16, 'G2P-111' );
-               $this->checkC( $data, $mk(2,2,2), 9, 'G2P-222' );
-               $this->checkC( $data, $mk(3,3,3), 6, 'G2P-333' );
-               $this->checkC( $data, $mk(4,4,4), 4, 'G2P-444' );
-               $this->checkC( $data, $mk(5,5,5), 2, 'G2P-555' );
-               $this->checkC( $data, $mk(5,1,1), 10, 'G2P-511' );
-               $this->checkC( $data, $mk(4,2,2), 7, 'G2P-422' );
-               $this->checkC( $data, $mk(2,3,3), 7, 'G2P-233' );
-               $this->checkC( $data, $mk(2,4,4), 5, 'G2P-244' );
-               $this->checkC( $data, $mk(1,5,5), 5, 'G2P-155' );
+               $data = $this->query( $mk( 99, 99, 99 ), 1, 'G2P', false );
+               $this->checkC( $data, $mk( 1, 1, 1 ), 16, 'G2P-111' );
+               $this->checkC( $data, $mk( 2, 2, 2 ), 9, 'G2P-222' );
+               $this->checkC( $data, $mk( 3, 3, 3 ), 6, 'G2P-333' );
+               $this->checkC( $data, $mk( 4, 4, 4 ), 4, 'G2P-444' );
+               $this->checkC( $data, $mk( 5, 5, 5 ), 2, 'G2P-555' );
+               $this->checkC( $data, $mk( 5, 1, 1 ), 10, 'G2P-511' );
+               $this->checkC( $data, $mk( 4, 2, 2 ), 7, 'G2P-422' );
+               $this->checkC( $data, $mk( 2, 3, 3 ), 7, 'G2P-233' );
+               $this->checkC( $data, $mk( 2, 4, 4 ), 5, 'G2P-244' );
+               $this->checkC( $data, $mk( 1, 5, 5 ), 5, 'G2P-155' );
        }
 
        /**
@@ -160,7 +160,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testGen1Prop1List() {
                $this->mVerbose = false;
-               $mk = function( $g, $p, $l ) {
+               $mk = function ( $g, $p, $l ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -174,24 +174,24 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop + 1 list
-               $data = $this->query( $mk(99,99,99), 1, 'G1P1L', false );
-               $this->checkC( $data, $mk(1,1,1), 11, 'G1P1L-111' );
-               $this->checkC( $data, $mk(2,2,2), 6, 'G1P1L-222' );
-               $this->checkC( $data, $mk(3,3,3), 4, 'G1P1L-333' );
-               $this->checkC( $data, $mk(4,4,4), 3, 'G1P1L-444' );
-               $this->checkC( $data, $mk(5,5,5), 2, 'G1P1L-555' );
-               $this->checkC( $data, $mk(5,5,1), 4, 'G1P1L-551' );
-               $this->checkC( $data, $mk(5,5,2), 2, 'G1P1L-552' );
+               $data = $this->query( $mk( 99, 99, 99 ), 1, 'G1P1L', false );
+               $this->checkC( $data, $mk( 1, 1, 1 ), 11, 'G1P1L-111' );
+               $this->checkC( $data, $mk( 2, 2, 2 ), 6, 'G1P1L-222' );
+               $this->checkC( $data, $mk( 3, 3, 3 ), 4, 'G1P1L-333' );
+               $this->checkC( $data, $mk( 4, 4, 4 ), 3, 'G1P1L-444' );
+               $this->checkC( $data, $mk( 5, 5, 5 ), 2, 'G1P1L-555' );
+               $this->checkC( $data, $mk( 5, 5, 1 ), 4, 'G1P1L-551' );
+               $this->checkC( $data, $mk( 5, 5, 2 ), 2, 'G1P1L-552' );
        }
 
        /**
         * Test smart continue - generator=allpages, prop=links|templates,
-        *                                         list=alllinks|alltransclusions, meta=siteinfo
+        *                       list=alllinks|alltransclusions, meta=siteinfo
         * @medium
         */
        public function testGen2Prop2List1Meta() {
                $this->mVerbose = false;
-               $mk = function( $g, $p1, $p2, $l1, $l2 ) {
+               $mk = function ( $g, $p1, $p2, $l1, $l2 ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -211,16 +211,16 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop + 1 list
-               $data = $this->query( $mk(99,99,99,99,99), 1, 'G2P2L1M', false );
-               $this->checkC( $data, $mk(1,1,1,1,1), 16, 'G2P2L1M-11111' );
-               $this->checkC( $data, $mk(2,2,2,2,2), 9, 'G2P2L1M-22222' );
-               $this->checkC( $data, $mk(3,3,3,3,3), 6, 'G2P2L1M-33333' );
-               $this->checkC( $data, $mk(4,4,4,4,4), 4, 'G2P2L1M-44444' );
-               $this->checkC( $data, $mk(5,5,5,5,5), 2, 'G2P2L1M-55555' );
-               $this->checkC( $data, $mk(5,5,5,1,1), 4, 'G2P2L1M-55511' );
-               $this->checkC( $data, $mk(5,5,5,2,2), 2, 'G2P2L1M-55522' );
-               $this->checkC( $data, $mk(5,1,1,5,5), 10, 'G2P2L1M-51155' );
-               $this->checkC( $data, $mk(5,2,2,5,5), 5, 'G2P2L1M-52255' );
+               $data = $this->query( $mk( 99, 99, 99, 99, 99 ), 1, 'G2P2L1M', false );
+               $this->checkC( $data, $mk( 1, 1, 1, 1, 1 ), 16, 'G2P2L1M-11111' );
+               $this->checkC( $data, $mk( 2, 2, 2, 2, 2 ), 9, 'G2P2L1M-22222' );
+               $this->checkC( $data, $mk( 3, 3, 3, 3, 3 ), 6, 'G2P2L1M-33333' );
+               $this->checkC( $data, $mk( 4, 4, 4, 4, 4 ), 4, 'G2P2L1M-44444' );
+               $this->checkC( $data, $mk( 5, 5, 5, 5, 5 ), 2, 'G2P2L1M-55555' );
+               $this->checkC( $data, $mk( 5, 5, 5, 1, 1 ), 4, 'G2P2L1M-55511' );
+               $this->checkC( $data, $mk( 5, 5, 5, 2, 2 ), 2, 'G2P2L1M-55522' );
+               $this->checkC( $data, $mk( 5, 1, 1, 5, 5 ), 10, 'G2P2L1M-51155' );
+               $this->checkC( $data, $mk( 5, 2, 2, 5, 5 ), 5, 'G2P2L1M-52255' );
        }
 
        /**
@@ -229,7 +229,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testSameGenAndProp() {
                $this->mVerbose = false;
-               $mk = function( $g, $gDir, $p, $pDir ) {
+               $mk = function ( $g, $gDir, $p, $pDir ) {
                        return array(
                                'titles' => 'AQCT-1',
                                'generator' => 'templates',
@@ -241,31 +241,31 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 prop
-               $data = $this->query( $mk(99,true,99,true), 1, 'G=P', false );
+               $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=P', false );
 
-               $this->checkC( $data, $mk(1,true,1,true), 4, 'G=P-1t1t' );
-               $this->checkC( $data, $mk(2,true,2,true), 2, 'G=P-2t2t' );
-               $this->checkC( $data, $mk(3,true,3,true), 2, 'G=P-3t3t' );
-               $this->checkC( $data, $mk(1,true,3,true), 4, 'G=P-1t3t' );
-               $this->checkC( $data, $mk(3,true,1,true), 2, 'G=P-3t1t' );
+               $this->checkC( $data, $mk( 1, true, 1, true ), 4, 'G=P-1t1t' );
+               $this->checkC( $data, $mk( 2, true, 2, true ), 2, 'G=P-2t2t' );
+               $this->checkC( $data, $mk( 3, true, 3, true ), 2, 'G=P-3t3t' );
+               $this->checkC( $data, $mk( 1, true, 3, true ), 4, 'G=P-1t3t' );
+               $this->checkC( $data, $mk( 3, true, 1, true ), 2, 'G=P-3t1t' );
 
-               $this->checkC( $data, $mk(1,true,1,false), 4, 'G=P-1t1f' );
-               $this->checkC( $data, $mk(2,true,2,false), 2, 'G=P-2t2f' );
-               $this->checkC( $data, $mk(3,true,3,false), 2, 'G=P-3t3f' );
-               $this->checkC( $data, $mk(1,true,3,false), 4, 'G=P-1t3f' );
-               $this->checkC( $data, $mk(3,true,1,false), 2, 'G=P-3t1f' );
+               $this->checkC( $data, $mk( 1, true, 1, false ), 4, 'G=P-1t1f' );
+               $this->checkC( $data, $mk( 2, true, 2, false ), 2, 'G=P-2t2f' );
+               $this->checkC( $data, $mk( 3, true, 3, false ), 2, 'G=P-3t3f' );
+               $this->checkC( $data, $mk( 1, true, 3, false ), 4, 'G=P-1t3f' );
+               $this->checkC( $data, $mk( 3, true, 1, false ), 2, 'G=P-3t1f' );
 
-               $this->checkC( $data, $mk(1,false,1,true), 4, 'G=P-1f1t' );
-               $this->checkC( $data, $mk(2,false,2,true), 2, 'G=P-2f2t' );
-               $this->checkC( $data, $mk(3,false,3,true), 2, 'G=P-3f3t' );
-               $this->checkC( $data, $mk(1,false,3,true), 4, 'G=P-1f3t' );
-               $this->checkC( $data, $mk(3,false,1,true), 2, 'G=P-3f1t' );
+               $this->checkC( $data, $mk( 1, false, 1, true ), 4, 'G=P-1f1t' );
+               $this->checkC( $data, $mk( 2, false, 2, true ), 2, 'G=P-2f2t' );
+               $this->checkC( $data, $mk( 3, false, 3, true ), 2, 'G=P-3f3t' );
+               $this->checkC( $data, $mk( 1, false, 3, true ), 4, 'G=P-1f3t' );
+               $this->checkC( $data, $mk( 3, false, 1, true ), 2, 'G=P-3f1t' );
 
-               $this->checkC( $data, $mk(1,false,1,false), 4, 'G=P-1f1f' );
-               $this->checkC( $data, $mk(2,false,2,false), 2, 'G=P-2f2f' );
-               $this->checkC( $data, $mk(3,false,3,false), 2, 'G=P-3f3f' );
-               $this->checkC( $data, $mk(1,false,3,false), 4, 'G=P-1f3f' );
-               $this->checkC( $data, $mk(3,false,1,false), 2, 'G=P-3f1f' );
+               $this->checkC( $data, $mk( 1, false, 1, false ), 4, 'G=P-1f1f' );
+               $this->checkC( $data, $mk( 2, false, 2, false ), 2, 'G=P-2f2f' );
+               $this->checkC( $data, $mk( 3, false, 3, false ), 2, 'G=P-3f3f' );
+               $this->checkC( $data, $mk( 1, false, 3, false ), 4, 'G=P-1f3f' );
+               $this->checkC( $data, $mk( 3, false, 1, false ), 2, 'G=P-3f1f' );
        }
 
        /**
@@ -274,7 +274,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
         */
        public function testSameGenList() {
                $this->mVerbose = false;
-               $mk = function( $g, $gDir, $l, $pDir ) {
+               $mk = function ( $g, $gDir, $l, $pDir ) {
                        return array(
                                'generator' => 'allpages',
                                'gapprefix' => 'AQCT-',
@@ -287,27 +287,27 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                        );
                };
                // generator + 1 list
-               $data = $this->query( $mk(99,true,99,true), 1, 'G=L', false );
+               $data = $this->query( $mk( 99, true, 99, true ), 1, 'G=L', false );
 
-               $this->checkC( $data, $mk(1,true,1,true), 5, 'G=L-1t1t' );
-               $this->checkC( $data, $mk(2,true,2,true), 3, 'G=L-2t2t' );
-               $this->checkC( $data, $mk(3,true,3,true), 2, 'G=L-3t3t' );
-               $this->checkC( $data, $mk(1,true,3,true), 5, 'G=L-1t3t' );
-               $this->checkC( $data, $mk(3,true,1,true), 5, 'G=L-3t1t' );
-               $this->checkC( $data, $mk(1,true,1,false), 5, 'G=L-1t1f' );
-               $this->checkC( $data, $mk(2,true,2,false), 3, 'G=L-2t2f' );
-               $this->checkC( $data, $mk(3,true,3,false), 2, 'G=L-3t3f' );
-               $this->checkC( $data, $mk(1,true,3,false), 5, 'G=L-1t3f' );
-               $this->checkC( $data, $mk(3,true,1,false), 5, 'G=L-3t1f' );
-               $this->checkC( $data, $mk(1,false,1,true), 5, 'G=L-1f1t' );
-               $this->checkC( $data, $mk(2,false,2,true), 3, 'G=L-2f2t' );
-               $this->checkC( $data, $mk(3,false,3,true), 2, 'G=L-3f3t' );
-               $this->checkC( $data, $mk(1,false,3,true), 5, 'G=L-1f3t' );
-               $this->checkC( $data, $mk(3,false,1,true), 5, 'G=L-3f1t' );
-               $this->checkC( $data, $mk(1,false,1,false), 5, 'G=L-1f1f' );
-               $this->checkC( $data, $mk(2,false,2,false), 3, 'G=L-2f2f' );
-               $this->checkC( $data, $mk(3,false,3,false), 2, 'G=L-3f3f' );
-               $this->checkC( $data, $mk(1,false,3,false), 5, 'G=L-1f3f' );
-               $this->checkC( $data, $mk(3,false,1,false), 5, 'G=L-3f1f' );
+               $this->checkC( $data, $mk( 1, true, 1, true ), 5, 'G=L-1t1t' );
+               $this->checkC( $data, $mk( 2, true, 2, true ), 3, 'G=L-2t2t' );
+               $this->checkC( $data, $mk( 3, true, 3, true ), 2, 'G=L-3t3t' );
+               $this->checkC( $data, $mk( 1, true, 3, true ), 5, 'G=L-1t3t' );
+               $this->checkC( $data, $mk( 3, true, 1, true ), 5, 'G=L-3t1t' );
+               $this->checkC( $data, $mk( 1, true, 1, false ), 5, 'G=L-1t1f' );
+               $this->checkC( $data, $mk( 2, true, 2, false ), 3, 'G=L-2t2f' );
+               $this->checkC( $data, $mk( 3, true, 3, false ), 2, 'G=L-3t3f' );
+               $this->checkC( $data, $mk( 1, true, 3, false ), 5, 'G=L-1t3f' );
+               $this->checkC( $data, $mk( 3, true, 1, false ), 5, 'G=L-3t1f' );
+               $this->checkC( $data, $mk( 1, false, 1, true ), 5, 'G=L-1f1t' );
+               $this->checkC( $data, $mk( 2, false, 2, true ), 3, 'G=L-2f2t' );
+               $this->checkC( $data, $mk( 3, false, 3, true ), 2, 'G=L-3f3t' );
+               $this->checkC( $data, $mk( 1, false, 3, true ), 5, 'G=L-1f3t' );
+               $this->checkC( $data, $mk( 3, false, 1, true ), 5, 'G=L-3f1t' );
+               $this->checkC( $data, $mk( 1, false, 1, false ), 5, 'G=L-1f1f' );
+               $this->checkC( $data, $mk( 2, false, 2, false ), 3, 'G=L-2f2f' );
+               $this->checkC( $data, $mk( 3, false, 3, false ), 2, 'G=L-3f3f' );
+               $this->checkC( $data, $mk( 1, false, 3, false ), 5, 'G=L-1f3f' );
+               $this->checkC( $data, $mk( 3, false, 1, false ), 5, 'G=L-3f1f' );
        }
 }
index 4717479..fbb1e64 100644 (file)
@@ -24,7 +24,7 @@
  * @file
  */
 
-require_once( 'ApiQueryTestBase.php' );
+require_once 'ApiQueryTestBase.php';
 
 abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 
@@ -36,7 +36,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
        /**
         * Run query() and compare against expected values
         */
-       protected function checkC( $expected, $params, $expectedCount, $id, $continue = true  ) {
+       protected function checkC( $expected, $params, $expectedCount, $id, $continue = true ) {
                $result = $this->query( $params, $expectedCount, $id, $continue );
                $this->assertResult( $expected, $result, $id );
        }
@@ -52,7 +52,7 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
         */
        protected function query( $params, $expectedCount, $id, $useContinue = true ) {
                if ( isset( $params['action'] ) ) {
-                       $this->assertEquals( 'query', $params['action'], 'Invalid query action');
+                       $this->assertEquals( 'query', $params['action'], 'Invalid query action' );
                } else {
                        $params['action'] = 'query';
                }
@@ -64,17 +64,18 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                $continue = array();
                do {
                        $request = array_merge( $params, $continue );
-                       uksort( $request, function( $a, $b ) {
+                       uksort( $request, function ( $a, $b ) {
                                // put 'continue' params at the end - lazy method
                                $a = strpos( $a, 'continue' ) !== false ? 'zzz ' . $a : $a;
                                $b = strpos( $b, 'continue' ) !== false ? 'zzz ' . $b : $b;
+
                                return strcmp( $a, $b );
                        } );
                        $reqStr = http_build_query( $request );
                        //$reqStr = str_replace( '&', ' & ', $reqStr );
                        $this->assertLessThan( $expectedCount, $count, "$id more data: $reqStr" );
                        if ( $this->mVerbose ) {
-                               print ("$id (#$count): $reqStr\n");
+                               print "$id (#$count): $reqStr\n";
                        }
                        try {
                                $data = $this->doApiRequest( $request );
@@ -103,52 +104,57 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                                if ( $expectedCount > $count ) {
                                        print "***** $id Finished early in $count turns. $expectedCount was expected\n";
                                }
+
                                return $result;
                        } elseif ( !$useContinue ) {
                                $this->assertFalse( 'Non-smart query must be requested all at once' );
                        }
-               } while( true );
+               } while ( true );
        }
 
        private function printResult( $data ) {
                $q = $data['query'];
                $print = array();
-               if (isset($q['pages'])) {
-                       foreach ($q['pages'] as $p) {
+               if ( isset( $q['pages'] ) ) {
+                       foreach ( $q['pages'] as $p ) {
                                $m = $p['title'];
-                               if (isset($p['links'])) {
-                                       $m .= '/[' . implode(',', array_map(
-                                               function ($v) {
+                               if ( isset( $p['links'] ) ) {
+                                       $m .= '/[' . implode( ',', array_map(
+                                               function ( $v ) {
                                                        return $v['title'];
                                                },
-                                               $p['links'])) . ']';
+                                               $p['links'] ) ) . ']';
                                }
-                               if (isset($p['categories'])) {
-                                       $m .= '/(' . implode(',', array_map(
-                                               function ($v) {
-                                                       return str_replace('Category:', '', $v['title']);
+                               if ( isset( $p['categories'] ) ) {
+                                       $m .= '/(' . implode( ',', array_map(
+                                               function ( $v ) {
+                                                       return str_replace( 'Category:', '', $v['title'] );
                                                },
-                                               $p['categories'])) . ')';
+                                               $p['categories'] ) ) . ')';
                                }
                                $print[] = $m;
                        }
                }
-               if (isset($q['allcategories'])) {
-                       $print[] = '*Cats/(' . implode(',', array_map(
-                               function ($v) { return $v['*']; },
-                               $q['allcategories'])) . ')';
+               if ( isset( $q['allcategories'] ) ) {
+                       $print[] = '*Cats/(' . implode( ',', array_map(
+                               function ( $v ) {
+                                       return $v['*'];
+                               },
+                               $q['allcategories'] ) ) . ')';
                }
                self::GetItems( $q, 'allpages', 'Pages', $print );
                self::GetItems( $q, 'alllinks', 'Links', $print );
                self::GetItems( $q, 'alltransclusions', 'Trnscl', $print );
-               print(' ' . implode('  ', $print) . "\n");
+               print ' ' . implode( '  ', $print ) . "\n";
        }
 
        private static function GetItems( $q, $moduleName, $name, &$print ) {
-               if (isset($q[$moduleName])) {
-                       $print[] = "*$name/[" . implode(',',
-                               array_map( function ($v) { return $v['title']; },
-                                               $q[$moduleName])) . ']';
+               if ( isset( $q[$moduleName] ) ) {
+                       $print[] = "*$name/[" . implode( ',',
+                               array_map( function ( $v ) {
+                                               return $v['title'];
+                                       },
+                                       $q[$moduleName] ) ) . ']';
                }
        }
 
@@ -164,12 +170,12 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
                        $this->assertEquals( $results, $newResult, 'Repeated result must be the same as before' );
                } else {
                        $sort = null;
-                       foreach( $newResult as $key => $value ) {
+                       foreach ( $newResult as $key => $value ) {
                                if ( !$numericIds && $sort === null ) {
                                        if ( !is_array( $value ) ) {
                                                $sort = false;
                                        } elseif ( array_key_exists( 'title', $value ) ) {
-                                               $sort = function( $a, $b ) {
+                                               $sort = function ( $a, $b ) {
                                                        return strcmp( $a['title'], $b['title'] );
                                                };
                                        } else {
index 7fb5307..bc01ec2 100644 (file)
@@ -20,7 +20,6 @@ class ApiQueryTest extends ApiTestCase {
                        'action' => 'query',
                        'titles' => 'Project:articleA|article_B' ) );
 
-
                $this->assertArrayHasKey( 'query', $data[0] );
                $this->assertArrayHasKey( 'normalized', $data[0]['query'] );
 
@@ -42,7 +41,6 @@ class ApiQueryTest extends ApiTestCase {
                        ),
                        $data[0]['query']['normalized'][1]
                );
-
        }
 
        function testTitlesAreRejectedIfInvalid() {
@@ -65,5 +63,4 @@ class ApiQueryTest extends ApiTestCase {
                $this->assertArrayHasKey( 'missing', $data[0]['query']['pages'][-2] );
                $this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
        }
-
 }
index 7b9f8ed..8ee8ea9 100644 (file)
@@ -24,7 +24,6 @@
  * @file
  */
 
-
 /** This class has some common functionality for testing query module
  */
 abstract class ApiQueryTestBase extends ApiTestCase {
@@ -43,11 +42,12 @@ STR;
        protected function merge( /*...*/ ) {
                $request = array();
                $expected = array();
-               foreach ( func_get_args() as $v ) {
+               foreach ( func_get_args() as $v ) {
                        list( $req, $exp ) = $this->validateRequestExpectedPair( $v );
                        $request = array_merge_recursive( $request, $req );
                        $this->mergeExpected( $expected, $exp );
                }
+
                return array( $request, $expected );
        }
 
@@ -57,11 +57,12 @@ STR;
         */
        private function validateRequestExpectedPair( $v ) {
                $this->assertType( 'array', $v, self::PARAM_ASSERT );
-               $this->assertEquals( 2, count($v), self::PARAM_ASSERT );
+               $this->assertEquals( 2, count( $v ), self::PARAM_ASSERT );
                $this->assertArrayHasKey( 0, $v, self::PARAM_ASSERT );
                $this->assertArrayHasKey( 1, $v, self::PARAM_ASSERT );
                $this->assertType( 'array', $v[0], self::PARAM_ASSERT );
                $this->assertType( 'array', $v[1], self::PARAM_ASSERT );
+
                return $v;
        }
 
@@ -71,7 +72,7 @@ STR;
        private function mergeExpected( &$all, $item ) {
                foreach ( $item as $k => $v ) {
                        if ( array_key_exists( $k, $all ) ) {
-                               if ( is_array ( $all[$k] ) ) {
+                               if ( is_array( $all[$k] ) ) {
                                        $this->mergeExpected( $all[$k], $v );
                                } else {
                                        $this->assertEquals( $all[$k], $v );
@@ -108,10 +109,10 @@ STR;
                        if ( is_array( $message ) ) {
                                $message = http_build_query( $message );
                        }
-                       print( "\nRequest: $message\n" );
-                       print( "\nExpected:\n" );
+                       print "\nRequest: $message\n";
+                       print "\nExpected:\n";
                        print_r( $exp );
-                       print( "\nResult:\n" );
+                       print "\nResult:\n";
                        print_r( $result );
                        throw $e; // rethrow it
                }
index 4cc8bd2..c550150 100644 (file)
@@ -8,31 +8,50 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
        protected function setUp() {
                parent::setUp();
+               $this->configureLanguages();
                MessageCache::singleton()->enable();
        }
 
-       function addDBData() {
-               // be sure english messages under $key, not $key/en
+       /**
+        * Helper function -- setup site language for testing
+        */
+       protected function configureLanguages() {
+               // for the test, we need the content language to be anything but English,
+               // let's choose e.g. German (de)
+               $langCode = 'de';
+               $langObj = Language::factory( $langCode );
+
                $this->setMwGlobals( array(
-                       'wgLanguageCode' => 'en',
-                       'wgContLang' => Language::factory( 'en' ),
+                       'wgLanguageCode' => $langCode,
+                       'wgLang' => $langObj,
+                       'wgContLang' => $langObj,
                ) );
+       }
+
+       function addDBData() {
+               $this->configureLanguages();
 
-               // Set up messages and fallbacks ab -> ru -> en
+               // Set up messages and fallbacks ab -> ru -> de
                $this->makePage( 'FallbackLanguageTest-Full', 'ab' );
                $this->makePage( 'FallbackLanguageTest-Full', 'ru' );
-               $this->makePage( 'FallbackLanguageTest-Full', 'en' );
+               $this->makePage( 'FallbackLanguageTest-Full', 'de' );
 
                // Fallbacks where ab does not exist
                $this->makePage( 'FallbackLanguageTest-Partial', 'ru' );
-               $this->makePage( 'FallbackLanguageTest-Partial', 'en' );
+               $this->makePage( 'FallbackLanguageTest-Partial', 'de' );
 
-               // Fallback to english
-               $this->makePage( 'FallbackLanguageTest-English', 'en' );
+               // Fallback to the content language
+               $this->makePage( 'FallbackLanguageTest-ContLang', 'de' );
+
+               // Add customizations for an existing message.
+               $this->makePage( 'sunday', 'ru' );
 
                // Full key tests -- always want russian
                $this->makePage( 'MessageCacheTest-FullKeyTest', 'ab' );
                $this->makePage( 'MessageCacheTest-FullKeyTest', 'ru' );
+
+               // In content language -- get base if no derivative
+               $this->makePage( 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none', false );
        }
 
        /**
@@ -40,17 +59,23 @@ class MessageCacheTest extends MediaWikiLangTestCase {
         *
         * @param string $title Title of page to be created
         * @param string $lang  Language and content of the created page
+        * @param string|null $content Content of the created page, or null for a generic string
+        * @param bool $createSubPage Set to false if a root page should be created
         */
-       protected function makePage( $title, $lang ) {
+       protected function makePage( $title, $lang, $content = null, $createSubPage = true ) {
                global $wgContLang;
 
-               $title = Title::newFromText(
-                       ($lang == $wgContLang->getCode()) ? $title : "$title/$lang",
-                       NS_MEDIAWIKI
-               );
+               if ( $content === null ) {
+                       $content = $lang;
+               }
+               if ( $lang !== $wgContLang->getCode() || $createSubPage ) {
+                       $title = "$title/$lang";
+               }
+
+               $title = Title::newFromText( $title, NS_MEDIAWIKI );
                $wikiPage = new WikiPage( $title );
-               $content = ContentHandler::makeContent( $lang, $title );
-               $wikiPage->doEditContent( $content, "$lang translation test case" );
+               $contentHandler = ContentHandler::makeContent( $content, $title );
+               $wikiPage->doEditContent( $contentHandler, "$lang translation test case" );
        }
 
        /**
@@ -67,8 +92,16 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                return array(
                        array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
                        array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
-                       array( 'FallbackLanguageTest-English', 'ab', 'en' ),
+                       array( 'FallbackLanguageTest-ContLang', 'ab', 'de' ),
                        array( 'FallbackLanguageTest-None', 'ab', false ),
+
+                       // Existing message with customizations on the fallbacks
+                       array( 'sunday', 'ab', 'амҽыш' ),
+
+                       // bug 46579
+                       array( 'FallbackLanguageTest-NoDervContLang', 'de', 'de/none' ),
+                       // UI language different from content language should only use de/none as last option
+                       array( 'FallbackLanguageTest-NoDervContLang', 'fit', 'de/none' ),
                );
        }
 
index c7e75d9..1c81ea7 100644 (file)
@@ -52,6 +52,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                for ( $i = $firstKey; $i <= $lastKey; $i++ ) {
                        $expected["cache-key-$i"] = array( "prop-$i" => "value-$i" );
                }
+
                return $expected;
        }
 
@@ -70,7 +71,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        function testConstructorGivenInvalidValue( $maxSize ) {
-               $c = new ProcessCacheLRUTestable( $maxSize );
+               new ProcessCacheLRUTestable( $maxSize );
        }
 
        /**
@@ -125,7 +126,6 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                        $cache->getCache(),
                        "Filling a $cacheMaxEntries entries cache with $entryToFill entries"
                );
-
        }
 
        /**
@@ -218,9 +218,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
                        ),
                        $cache->getCache()
                );
-
        }
-
 }
 
 /**
index 19ceadd..2904472 100644 (file)
@@ -10,9 +10,9 @@
  */
 class ContentHandlerTest extends MediaWikiTestCase {
 
-       public function setup() {
+       public function setUp() {
                global $wgContLang;
-               parent::setup();
+               parent::setUp();
 
                $this->setMwGlobals( array(
                        'wgExtraNamespaces' => array(
@@ -145,62 +145,72 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( $expected->getCode(), $lang->getCode() );
        }
 
-       public function testGetContentText_Null() {
-               global $wgContentHandlerTextFallback;
+       public static function dataGetContentText_Null() {
+               return array(
+                       array( 'fail' ),
+                       array( 'serialize' ),
+                       array( 'ignore' ),
+               );
+       }
 
-               $content = null;
+       /**
+        * @dataProvider dataGetContentText_Null
+        */
+       public function testGetContentText_Null( $contentHandlerTextFallback ) {
+               $this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
 
-               $wgContentHandlerTextFallback = 'fail';
-               $text = ContentHandler::getContentText( $content );
-               $this->assertEquals( '', $text );
+               $content = null;
 
-               $wgContentHandlerTextFallback = 'serialize';
                $text = ContentHandler::getContentText( $content );
                $this->assertEquals( '', $text );
+       }
 
-               $wgContentHandlerTextFallback = 'ignore';
-               $text = ContentHandler::getContentText( $content );
-               $this->assertEquals( '', $text );
+       public static function dataGetContentText_TextContent() {
+               return array(
+                       array( 'fail' ),
+                       array( 'serialize' ),
+                       array( 'ignore' ),
+               );
        }
 
-       public function testGetContentText_TextContent() {
-               global $wgContentHandlerTextFallback;
+       /**
+        * @dataProvider dataGetContentText_TextContent
+        */
+       public function testGetContentText_TextContent( $contentHandlerTextFallback ) {
+               $this->setMwGlobals( 'wgContentHandlerTextFallback', $contentHandlerTextFallback );
 
                $content = new WikitextContent( "hello world" );
 
-               $wgContentHandlerTextFallback = 'fail';
-               $text = ContentHandler::getContentText( $content );
-               $this->assertEquals( $content->getNativeData(), $text );
-
-               $wgContentHandlerTextFallback = 'serialize';
-               $text = ContentHandler::getContentText( $content );
-               $this->assertEquals( $content->serialize(), $text );
-
-               $wgContentHandlerTextFallback = 'ignore';
                $text = ContentHandler::getContentText( $content );
                $this->assertEquals( $content->getNativeData(), $text );
        }
 
-       public function testGetContentText_NonTextContent() {
-               global $wgContentHandlerTextFallback;
+       /**
+        * ContentHandler::getContentText should have thrown an exception for non-text Content object
+        * @expectedException MWException
+        */
+       public function testGetContentText_NonTextContent_fail() {
+               $this->setMwGlobals( 'wgContentHandlerTextFallback', 'fail' );
 
                $content = new DummyContentForTesting( "hello world" );
 
-               $wgContentHandlerTextFallback = 'fail';
+               ContentHandler::getContentText( $content );
+       }
 
-               try {
-                       $text = ContentHandler::getContentText( $content );
+       public function testGetContentText_NonTextContent_serialize() {
+               $this->setMwGlobals( 'wgContentHandlerTextFallback', 'serialize' );
 
-                       $this->fail( "ContentHandler::getContentText should have thrown an exception for non-text Content object" );
-               } catch ( MWException $ex ) {
-                       // as expected
-               }
+               $content = new DummyContentForTesting( "hello world" );
 
-               $wgContentHandlerTextFallback = 'serialize';
                $text = ContentHandler::getContentText( $content );
                $this->assertEquals( $content->serialize(), $text );
+       }
+
+       public function testGetContentText_NonTextContent_ignore() {
+               $this->setMwGlobals( 'wgContentHandlerTextFallback', 'ignore' );
+
+               $content = new DummyContentForTesting( "hello world" );
 
-               $wgContentHandlerTextFallback = 'ignore';
                $text = ContentHandler::getContentText( $content );
                $this->assertNull( $text );
        }
@@ -247,8 +257,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                } catch ( MWException $ex ) {
                        if ( !$shouldFail ) {
                                $this->fail( "ContentHandler::makeContent failed unexpectedly: " . $ex->getMessage() );
-                       }
-                       else {
+                       } else {
                                // dummy, so we don't get the "test did not perform any assertions" message.
                                $this->assertTrue( true );
                        }
@@ -308,6 +317,7 @@ class DummyContentHandlerForTesting extends ContentHandler {
         */
        public function unserializeContent( $blob, $format = null ) {
                $d = unserialize( $blob );
+
                return new DummyContentForTesting( $d );
        }
 
@@ -421,4 +431,18 @@ class DummyContentForTesting extends AbstractContent {
        public function getParserOutput( Title $title, $revId = null, ParserOptions $options = null, $generateHtml = true ) {
                return new ParserOutput( $this->getNativeData() );
        }
+
+       /**
+        * @see AbstractContent::fillParserOutput()
+        *
+        * @param $title        Title Context title for parsing
+        * @param $revId        int|null Revision ID (for {{REVISIONID}})
+        * @param $options      ParserOptions|null Parser options
+        * @param $generateHtml bool Whether or not to generate HTML
+        * @param $output       ParserOutput The output object to fill (reference).
+        */
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output ) {
+               $output = new ParserOutput( $this->getNativeData() );
+       }
 }
index 8f53dd3..61716f9 100644 (file)
@@ -5,7 +5,7 @@
  * @group Database
  *        ^--- needed, because we do need the database to test link updates
  */
-class CssContentTest extends MediaWikiTestCase {
+class CssContentTest extends JavaScriptContentTest {
 
        protected function setUp() {
                parent::setUp();
@@ -77,5 +77,4 @@ class CssContentTest extends MediaWikiTestCase {
        public function testEquals( Content $a, Content $b = null, $equal = false ) {
                $this->assertEquals( $equal, $a->equals( $b ) );
        }
-
 }
index 2d693fe..5c1ff8f 100644 (file)
@@ -137,7 +137,7 @@ class JavaScriptContentTest extends TextContentTest {
        }
 
        /**
-        * @todo: test needs database!
+        * @todo Test needs database!
         */
        /*
        public function getRedirectChain() {
@@ -147,7 +147,7 @@ class JavaScriptContentTest extends TextContentTest {
        */
 
        /**
-        * @todo: test needs database!
+        * @todo Test needs database!
         */
        /*
        public function getUltimateRedirectTarget() {
@@ -269,5 +269,4 @@ class JavaScriptContentTest extends TextContentTest {
                        array( new JavaScriptContent( "hallo" ), new JavaScriptContent( "HALLO" ), false ),
                );
        }
-
 }
index 382f71a..d7dde37 100644 (file)
@@ -7,14 +7,21 @@
  */
 class TextContentTest extends MediaWikiLangTestCase {
        protected $context;
+       protected $savedContentGetParserOutput;
 
        protected function setUp() {
+               global $wgHooks;
+
                parent::setUp();
 
                // Anon user
                $user = new User();
                $user->setName( '127.0.0.1' );
 
+               $this->context = new RequestContext( new FauxRequest() );
+               $this->context->setTitle( Title::newFromText( 'Test' ) );
+               $this->context->setUser( $user );
+
                $this->setMwGlobals( array(
                        'wgUser' => $user,
                        'wgTextModelsToParse' => array(
@@ -26,9 +33,22 @@ class TextContentTest extends MediaWikiLangTestCase {
                        'wgAlwaysUseTidy' => false,
                ) );
 
-               $this->context = new RequestContext( new FauxRequest() );
-               $this->context->setTitle( Title::newFromText( 'Test' ) );
-               $this->context->setUser( $user );
+               // bypass hooks that force custom rendering
+               if ( isset( $wgHooks['ContentGetParserOutput'] )  ) {
+                       $this->savedContentGetParserOutput = $wgHooks['ContentGetParserOutput'];
+                       unset( $wgHooks['ContentGetParserOutput'] );
+               }
+       }
+
+       public function teardown() {
+               global $wgHooks;
+
+               // restore hooks that force custom rendering
+               if ( $this->savedContentGetParserOutput !== null ) {
+                       $wgHooks['ContentGetParserOutput'] = $this->savedContentGetParserOutput;
+               }
+
+               parent::teardown();
        }
 
        public function newContent( $text ) {
@@ -162,7 +182,7 @@ class TextContentTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @todo: test needs database! Should be done by a test class in the Database group.
+        * @todo Test needs database! Should be done by a test class in the Database group.
         */
        /*
        public function getRedirectChain() {
@@ -172,7 +192,7 @@ class TextContentTest extends MediaWikiLangTestCase {
        */
 
        /**
-        * @todo: test needs database! Should be done by a test class in the Database group.
+        * @todo Test needs database! Should be done by a test class in the Database group.
         */
        /*
        public function getUltimateRedirectTarget() {
@@ -211,15 +231,11 @@ class TextContentTest extends MediaWikiLangTestCase {
         * @group Database
         */
        public function testIsCountable( $text, $hasLinks, $mode, $expected ) {
-               global $wgArticleCountMethod;
-
-               $old = $wgArticleCountMethod;
-               $wgArticleCountMethod = $mode;
+               $this->setMwGlobals( 'wgArticleCountMethod', $mode );
 
                $content = $this->newContent( $text );
 
                $v = $content->isCountable( $hasLinks, $this->context->getTitle() );
-               $wgArticleCountMethod = $old;
 
                $this->assertEquals( $expected, $v, 'isCountable() returned unexpected value ' . var_export( $v, true )
                        . ' instead of ' . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
@@ -427,5 +443,4 @@ class TextContentTest extends MediaWikiLangTestCase {
                        $this->assertEquals( $expectedNative, $converted->getNativeData() );
                }
        }
-
 }
index 0f6a968..45d8140 100644 (file)
@@ -181,5 +181,4 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
        /*
        public function testGetUndoContent( Revision $current, Revision $undo, Revision $undoafter = null ) {}
        */
-
 }
index c9eecf7..37b01fd 100644 (file)
@@ -240,7 +240,7 @@ just a test"
        }
 
        /**
-        * @todo: test needs database! Should be done by a test class in the Database group.
+        * @todo Test needs database! Should be done by a test class in the Database group.
         */
        /*
        public function getRedirectChain() {
@@ -250,7 +250,7 @@ just a test"
        */
 
        /**
-        * @todo: test needs database! Should be done by a test class in the Database group.
+        * @todo Test needs database! Should be done by a test class in the Database group.
         */
        /*
        public function getUltimateRedirectTarget() {
@@ -380,7 +380,7 @@ just a test"
                                CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
                                array( 'LinksDeletionUpdate' => array() )
                        ),
-                       // @todo: more...?
+                       // @todo more...?
                );
        }
 }
index 0979243..46ccfe0 100644 (file)
@@ -2,35 +2,40 @@
 
 /**
  * Test the abstract database layer
- * Using Mysql for the sql at the moment TODO
- *
- * @group Database
+ * This is a non DBMS depending test.
  */
 class DatabaseSQLTest extends MediaWikiTestCase {
 
+       private $database;
+
        protected function setUp() {
                parent::setUp();
-               // TODO support other DBMS or find another way to do it
-               if ( $this->db->getType() !== 'mysql' ) {
-                       $this->markTestSkipped( 'No mysql database' );
-               }
+               $this->database = new DatabaseTestHelper( __CLASS__ );
+       }
+
+       protected function assertLastSql( $sqlText ) {
+               $this->assertEquals(
+                       $this->database->getLastSqls(),
+                       $sqlText
+               );
        }
 
        /**
-        * @dataProvider provideSelectSQLText
+        * @dataProvider provideSelect
         */
-       function testSelectSQLText( $sql, $sqlText ) {
-               $this->assertEquals( trim( $this->db->selectSQLText(
-                       isset( $sql['tables'] ) ? $sql['tables'] : array(),
-                       isset( $sql['fields'] ) ? $sql['fields'] : array(),
+       function testSelect( $sql, $sqlText ) {
+               $this->database->select(
+                       $sql['tables'],
+                       $sql['fields'],
                        isset( $sql['conds'] ) ? $sql['conds'] : array(),
                        __METHOD__,
                        isset( $sql['options'] ) ? $sql['options'] : array(),
                        isset( $sql['join_conds'] ) ? $sql['join_conds'] : array()
-               ) ), $sqlText );
+               );
+               $this->assertLastSql( $sqlText );
        }
 
-       public static function provideSelectSQLText() {
+       public static function provideSelect() {
                return array(
                        array(
                                array(
@@ -38,8 +43,8 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                        'fields' => array( 'field', 'alias' => 'field2' ),
                                        'conds' => array( 'alias' => 'text' ),
                                ),
-                               "SELECT  field,field2 AS alias  " .
-                                       "FROM `unittest_table`  " .
+                               "SELECT field,field2 AS alias " .
+                                       "FROM table " .
                                        "WHERE alias = 'text'"
                        ),
                        array(
@@ -49,9 +54,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                        'conds' => array( 'alias' => 'text' ),
                                        'options' => array( 'LIMIT' => 1, 'ORDER BY' => 'field' ),
                                ),
-                               "SELECT  field,field2 AS alias  " .
-                                       "FROM `unittest_table`  " .
-                                       "WHERE alias = 'text'  " .
+                               "SELECT field,field2 AS alias " .
+                                       "FROM table " .
+                                       "WHERE alias = 'text' " .
                                        "ORDER BY field " .
                                        "LIMIT 1"
                        ),
@@ -65,9 +70,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                                'LEFT JOIN', 'tid = t2.id'
                                        ) ),
                                ),
-                               "SELECT  tid,field,field2 AS alias,t2.id  " .
-                                       "FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id))  " .
-                                       "WHERE alias = 'text'  " .
+                               "SELECT tid,field,field2 AS alias,t2.id " .
+                                       "FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
+                                       "WHERE alias = 'text' " .
                                        "ORDER BY field " .
                                        "LIMIT 1"
                        ),
@@ -81,9 +86,9 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                                'LEFT JOIN', 'tid = t2.id'
                                        ) ),
                                ),
-                               "SELECT  tid,field,field2 AS alias,t2.id  " .
-                                       "FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id))  " .
-                                       "WHERE alias = 'text'  " .
+                               "SELECT tid,field,field2 AS alias,t2.id " .
+                                       "FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
+                                       "WHERE alias = 'text' " .
                                        "GROUP BY field HAVING COUNT(*) > 1 " .
                                        "LIMIT 1"
                        ),
@@ -97,12 +102,440 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                                'LEFT JOIN', 'tid = t2.id'
                                        ) ),
                                ),
-                               "SELECT  tid,field,field2 AS alias,t2.id  " .
-                                       "FROM `unittest_table` LEFT JOIN `unittest_table2` `t2` ON ((tid = t2.id))  " .
-                                       "WHERE alias = 'text'  " .
+                               "SELECT tid,field,field2 AS alias,t2.id " .
+                                       "FROM table LEFT JOIN table2 t2 ON ((tid = t2.id)) " .
+                                       "WHERE alias = 'text' " .
                                        "GROUP BY field,field2 HAVING (COUNT(*) > 1) AND field = '1' " .
                                        "LIMIT 1"
                        ),
+                       array(
+                               array(
+                                       'tables' => array( 'table' ),
+                                       'fields' => array( 'alias' => 'field' ),
+                                       'conds' => array( 'alias' => array( 1, 2, 3, 4 ) ),
+                               ),
+                               "SELECT field AS alias " .
+                                       "FROM table " .
+                                       "WHERE alias IN ('1','2','3','4')"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideUpdate
+        */
+       function testUpdate( $sql, $sqlText ) {
+               $this->database->update(
+                       $sql['table'],
+                       $sql['values'],
+                       $sql['conds'],
+                       __METHOD__,
+                       isset( $sql['options'] ) ? $sql['options'] : array()
+               );
+               $this->assertLastSql( $sqlText );
+       }
+
+       public static function provideUpdate() {
+               return array(
+                       array(
+                               array(
+                                       'table' => 'table',
+                                       'values' => array( 'field' => 'text', 'field2' => 'text2' ),
+                                       'conds' => array( 'alias' => 'text' ),
+                               ),
+                               "UPDATE table " .
+                                       "SET field = 'text'" .
+                                       ",field2 = 'text2' " .
+                                       "WHERE alias = 'text'"
+                       ),
+                       array(
+                               array(
+                                       'table' => 'table',
+                                       'values' => array( 'field = other', 'field2' => 'text2' ),
+                                       'conds' => array( 'id' => '1' ),
+                               ),
+                               "UPDATE table " .
+                                       "SET field = other" .
+                                       ",field2 = 'text2' " .
+                                       "WHERE id = '1'"
+                       ),
+                       array(
+                               array(
+                                       'table' => 'table',
+                                       'values' => array( 'field = other', 'field2' => 'text2' ),
+                                       'conds' => '*',
+                               ),
+                               "UPDATE table " .
+                                       "SET field = other" .
+                                       ",field2 = 'text2'"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideDelete
+        */
+       function testDelete( $sql, $sqlText ) {
+               $this->database->delete(
+                       $sql['table'],
+                       $sql['conds'],
+                       __METHOD__
+               );
+               $this->assertLastSql( $sqlText );
+       }
+
+       public static function provideDelete() {
+               return array(
+                       array(
+                               array(
+                                       'table' => 'table',
+                                       'conds' => array( 'alias' => 'text' ),
+                               ),
+                               "DELETE FROM table " .
+                                       "WHERE alias = 'text'"
+                       ),
+                       array(
+                               array(
+                                       'table' => 'table',
+                                       'conds' => '*',
+                               ),
+                               "DELETE FROM table"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideUpsert
+        */
+       function testUpsert( $sql, $sqlText ) {
+               $this->database->upsert(
+                       $sql['table'],
+                       $sql['rows'],
+                       $sql['uniqueIndexes'],
+                       $sql['set'],
+                       __METHOD__
+               );
+               $this->assertLastSql( $sqlText );
+       }
+
+       public static function provideUpsert() {
+               return array(
+                       array(
+                               array(
+                                       'table' => 'upsert_table',
+                                       'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
+                                       'uniqueIndexes' => array( 'field' ),
+                                       'set' => array( 'field' => 'set' ),
+                               ),
+                               "BEGIN; " .
+                                       "UPDATE upsert_table " .
+                                       "SET field = 'set' " .
+                                       "WHERE ((field = 'text')); " .
+                                       "INSERT IGNORE INTO upsert_table " .
+                                       "(field,field2) " .
+                                       "VALUES ('text','text2'); " .
+                                       "COMMIT"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideDeleteJoin
+        */
+       function testDeleteJoin( $sql, $sqlText ) {
+               $this->database->deleteJoin(
+                       $sql['delTable'],
+                       $sql['joinTable'],
+                       $sql['delVar'],
+                       $sql['joinVar'],
+                       $sql['conds'],
+                       __METHOD__
+               );
+               $this->assertLastSql( $sqlText );
+       }
+
+       public static function provideDeleteJoin() {
+               return array(
+                       array(
+                               array(
+                                       'delTable' => 'table',
+                                       'joinTable' => 'table_join',
+                                       'delVar' => 'field',
+                                       'joinVar' => 'field_join',
+                                       'conds' => array( 'alias' => 'text' ),
+                               ),
+                               "DELETE FROM table " .
+                                       "WHERE field IN (" .
+                                       "SELECT field_join FROM table_join WHERE alias = 'text'" .
+                                       ")"
+                       ),
+                       array(
+                               array(
+                                       'delTable' => 'table',
+                                       'joinTable' => 'table_join',
+                                       'delVar' => 'field',
+                                       'joinVar' => 'field_join',
+                                       'conds' => '*',
+                               ),
+                               "DELETE FROM table " .
+                                       "WHERE field IN (" .
+                                       "SELECT field_join FROM table_join " .
+                                       ")"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideInsert
+        */
+       function testInsert( $sql, $sqlText ) {
+               $this->database->insert(
+                       $sql['table'],
+                       $sql['rows'],
+                       __METHOD__,
+                       isset( $sql['options'] ) ? $sql['options'] : array()
+               );
+               $this->assertLastSql( $sqlText );
+       }
+
+       public static function provideInsert() {
+               return array(
+                       array(
+                               array(
+                                       'table' => 'table',
+                                       'rows' => array( 'field' => 'text', 'field2' => 2 ),
+                               ),
+                               "INSERT INTO table " .
+                                       "(field,field2) " .
+                                       "VALUES ('text','2')"
+                       ),
+                       array(
+                               array(
+                                       'table' => 'table',
+                                       'rows' => array( 'field' => 'text', 'field2' => 2 ),
+                                       'options' => 'IGNORE',
+                               ),
+                               "INSERT IGNORE INTO table " .
+                                       "(field,field2) " .
+                                       "VALUES ('text','2')"
+                       ),
+                       array(
+                               array(
+                                       'table' => 'table',
+                                       'rows' => array(
+                                               array( 'field' => 'text', 'field2' => 2 ),
+                                               array( 'field' => 'multi', 'field2' => 3 ),
+                                       ),
+                                       'options' => 'IGNORE',
+                               ),
+                               "INSERT IGNORE INTO table " .
+                                       "(field,field2) " .
+                                       "VALUES " .
+                                       "('text','2')," .
+                                       "('multi','3')"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideInsertSelect
+        */
+       function testInsertSelect( $sql, $sqlText ) {
+               $this->database->insertSelect(
+                       $sql['destTable'],
+                       $sql['srcTable'],
+                       $sql['varMap'],
+                       $sql['conds'],
+                       __METHOD__,
+                       isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : array(),
+                       isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : array()
+               );
+               $this->assertLastSql( $sqlText );
+       }
+
+       public static function provideInsertSelect() {
+               return array(
+                       array(
+                               array(
+                                       'destTable' => 'insert_table',
+                                       'srcTable' => 'select_table',
+                                       'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
+                                       'conds' => '*',
+                               ),
+                               "INSERT INTO insert_table " .
+                                       "(field_insert,field) " .
+                                       "SELECT field_select,field2 " .
+                                       "FROM select_table"
+                       ),
+                       array(
+                               array(
+                                       'destTable' => 'insert_table',
+                                       'srcTable' => 'select_table',
+                                       'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
+                                       'conds' => array( 'field' => 2 ),
+                               ),
+                               "INSERT INTO insert_table " .
+                                       "(field_insert,field) " .
+                                       "SELECT field_select,field2 " .
+                                       "FROM select_table " .
+                                       "WHERE field = '2'"
+                       ),
+                       array(
+                               array(
+                                       'destTable' => 'insert_table',
+                                       'srcTable' => 'select_table',
+                                       'varMap' => array( 'field_insert' => 'field_select', 'field' => 'field2' ),
+                                       'conds' => array( 'field' => 2 ),
+                                       'insertOptions' => 'IGNORE',
+                                       'selectOptions' => array( 'ORDER BY' => 'field' ),
+                               ),
+                               "INSERT IGNORE INTO insert_table " .
+                                       "(field_insert,field) " .
+                                       "SELECT field_select,field2 " .
+                                       "FROM select_table " .
+                                       "WHERE field = '2' " .
+                                       "ORDER BY field"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideReplace
+        */
+       function testReplace( $sql, $sqlText ) {
+               $this->database->replace(
+                       $sql['table'],
+                       $sql['uniqueIndexes'],
+                       $sql['rows'],
+                       __METHOD__
+               );
+               $this->assertLastSql( $sqlText );
+       }
+
+       public static function provideReplace() {
+               return array(
+                       array(
+                               array(
+                                       'table' => 'replace_table',
+                                       'uniqueIndexes' => array( 'field' ),
+                                       'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
+                               ),
+                               "DELETE FROM replace_table " .
+                                       "WHERE ( field='text' ); " .
+                                       "INSERT INTO replace_table " .
+                                       "(field,field2) " .
+                                       "VALUES ('text','text2')"
+                       ),
+                       array(
+                               array(
+                                       'table' => 'module_deps',
+                                       'uniqueIndexes' => array( array( 'md_module', 'md_skin' ) ),
+                                       'rows' => array(
+                                               'md_module' => 'module',
+                                               'md_skin' => 'skin',
+                                               'md_deps' => 'deps',
+                                       ),
+                               ),
+                               "DELETE FROM module_deps " .
+                                       "WHERE ( md_module='module' AND md_skin='skin' ); " .
+                                       "INSERT INTO module_deps " .
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module','skin','deps')"
+                       ),
+                       array(
+                               array(
+                                       'table' => 'module_deps',
+                                       'uniqueIndexes' => array( array( 'md_module', 'md_skin' ) ),
+                                       'rows' => array(
+                                               array(
+                                                       'md_module' => 'module',
+                                                       'md_skin' => 'skin',
+                                                       'md_deps' => 'deps',
+                                               ), array(
+                                                       'md_module' => 'module2',
+                                                       'md_skin' => 'skin2',
+                                                       'md_deps' => 'deps2',
+                                               ),
+                                       ),
+                               ),
+                               "DELETE FROM module_deps " .
+                                       "WHERE ( md_module='module' AND md_skin='skin' ); " .
+                                       "INSERT INTO module_deps " .
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module','skin','deps'); " .
+                                       "DELETE FROM module_deps " .
+                                       "WHERE ( md_module='module2' AND md_skin='skin2' ); " .
+                                       "INSERT INTO module_deps " .
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module2','skin2','deps2')"
+                       ),
+                       array(
+                               array(
+                                       'table' => 'module_deps',
+                                       'uniqueIndexes' => array( 'md_module', 'md_skin' ),
+                                       'rows' => array(
+                                               array(
+                                                       'md_module' => 'module',
+                                                       'md_skin' => 'skin',
+                                                       'md_deps' => 'deps',
+                                               ), array(
+                                                       'md_module' => 'module2',
+                                                       'md_skin' => 'skin2',
+                                                       'md_deps' => 'deps2',
+                                               ),
+                                       ),
+                               ),
+                               "DELETE FROM module_deps " .
+                                       "WHERE ( md_module='module' ) OR ( md_skin='skin' ); " .
+                                       "INSERT INTO module_deps " .
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module','skin','deps'); " .
+                                       "DELETE FROM module_deps " .
+                                       "WHERE ( md_module='module2' ) OR ( md_skin='skin2' ); " .
+                                       "INSERT INTO module_deps " .
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module2','skin2','deps2')"
+                       ),
+                       array(
+                               array(
+                                       'table' => 'module_deps',
+                                       'uniqueIndexes' => array(),
+                                       'rows' => array(
+                                               'md_module' => 'module',
+                                               'md_skin' => 'skin',
+                                               'md_deps' => 'deps',
+                                       ),
+                               ),
+                               "INSERT INTO module_deps " .
+                                       "(md_module,md_skin,md_deps) " .
+                                       "VALUES ('module','skin','deps')"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideNativeReplace
+        */
+       function testNativeReplace( $sql, $sqlText ) {
+               $this->database->nativeReplace(
+                       $sql['table'],
+                       $sql['rows'],
+                       __METHOD__
+               );
+               $this->assertLastSql( $sqlText );
+       }
+
+       public static function provideNativeReplace() {
+               return array(
+                       array(
+                               array(
+                                       'table' => 'replace_table',
+                                       'rows' => array( 'field' => 'text', 'field2' => 'text2' ),
+                               ),
+                               "REPLACE INTO replace_table " .
+                                       "(field,field2) " .
+                                       "VALUES ('text','text2')"
+                       ),
                );
        }
 
@@ -110,7 +543,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
         * @dataProvider provideConditional
         */
        function testConditional( $sql, $sqlText ) {
-               $this->assertEquals( trim( $this->db->conditional(
+               $this->assertEquals( trim( $this->database->conditional(
                        $sql['conds'],
                        $sql['true'],
                        $sql['false']
@@ -145,4 +578,116 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                        ),
                );
        }
+
+       /**
+        * @dataProvider provideBuildConcat
+        */
+       function testBuildConcat( $stringList, $sqlText ) {
+               $this->assertEquals( trim( $this->database->buildConcat(
+                       $stringList
+               ) ), $sqlText );
+       }
+
+       public static function provideBuildConcat() {
+               return array(
+                       array(
+                               array( 'field', 'field2' ),
+                               "CONCAT(field,field2)"
+                       ),
+                       array(
+                               array( "'test'", 'field2' ),
+                               "CONCAT('test',field2)"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideBuildLike
+        */
+       function testBuildLike( $array, $sqlText ) {
+               $this->assertEquals( trim( $this->database->buildLike(
+                       $array
+               ) ), $sqlText );
+       }
+
+       public static function provideBuildLike() {
+               return array(
+                       array(
+                               'text',
+                               "LIKE 'text'"
+                       ),
+                       array(
+                               array( 'text', new LikeMatch( '%' ) ),
+                               "LIKE 'text%'"
+                       ),
+                       array(
+                               array( 'text', new LikeMatch( '%' ), 'text2' ),
+                               "LIKE 'text%text2'"
+                       ),
+                       array(
+                               array( 'text', new LikeMatch( '_' ) ),
+                               "LIKE 'text_'"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideUnionQueries
+        */
+       function testUnionQueries( $sql, $sqlText ) {
+               $this->assertEquals( trim( $this->database->unionQueries(
+                       $sql['sqls'],
+                       $sql['all']
+               ) ), $sqlText );
+       }
+
+       public static function provideUnionQueries() {
+               return array(
+                       array(
+                               array(
+                                       'sqls' => array( 'RAW SQL', 'RAW2SQL' ),
+                                       'all' => true,
+                               ),
+                               "(RAW SQL) UNION ALL (RAW2SQL)"
+                       ),
+                       array(
+                               array(
+                                       'sqls' => array( 'RAW SQL', 'RAW2SQL' ),
+                                       'all' => false,
+                               ),
+                               "(RAW SQL) UNION (RAW2SQL)"
+                       ),
+                       array(
+                               array(
+                                       'sqls' => array( 'RAW SQL', 'RAW2SQL', 'RAW3SQL' ),
+                                       'all' => false,
+                               ),
+                               "(RAW SQL) UNION (RAW2SQL) UNION (RAW3SQL)"
+                       ),
+               );
+       }
+
+       function testTransactionCommit() {
+               $this->database->begin( __METHOD__ );
+               $this->database->commit( __METHOD__ );
+               $this->assertLastSql( 'BEGIN; COMMIT' );
+       }
+
+       function testTransactionRollback() {
+               $this->database->begin( __METHOD__ );
+               $this->database->rollback( __METHOD__ );
+               $this->assertLastSql( 'BEGIN; ROLLBACK' );
+       }
+
+       function testDropTable() {
+               $this->database->setExistingTables( array( 'table' ) );
+               $this->database->dropTable( 'table', __METHOD__ );
+               $this->assertLastSql( 'DROP TABLE table' );
+       }
+
+       function testDropNonExistingTable() {
+               $this->assertFalse(
+                       $this->database->dropTable( 'non_existing', __METHOD__ )
+               );
+       }
 }
index 097e57a..91ab33a 100644 (file)
@@ -9,6 +9,7 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
 
        function query( $sql, $fname = '', $tempIgnore = false ) {
                $this->lastQuery = $sql;
+
                return true;
        }
 
@@ -232,7 +233,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
        /**
         * Runs upgrades of older databases and compares results with current schema
-        * @todo: currently only checks list of tables
+        * @todo Currently only checks list of tables
         */
        public function testUpgrades() {
                global $IP, $wgVersion, $wgProfileToDatabase;
@@ -327,12 +328,14 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $db->sourceFile( "$IP/tests/phpunit/data/db/sqlite/tables-$version.sql" );
                $updater = DatabaseUpdater::newForDB( $db, false, $maint );
                $updater->doUpdates( array( 'core' ) );
+
                return $db;
        }
 
        private function getTables( $db ) {
                $list = array_flip( $db->listTables() );
                $excluded = array(
+                       'external_user', // removed from core in 1.22
                        'math', // moved out of core in 1.18
                        'trackbacks', // removed from core in 1.19
                        'searchindex',
@@ -348,6 +351,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                }
                $list = array_flip( $list );
                sort( $list );
+
                return $list;
        }
 
@@ -359,6 +363,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                        $cols[$col->name] = $col;
                }
                ksort( $cols );
+
                return $cols;
        }
 
@@ -376,6 +381,7 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                        $indexes[$index->name] = $index;
                }
                ksort( $indexes );
+
                return $indexes;
        }
 
index 65c80d1..c9f5f5c 100644 (file)
@@ -209,4 +209,10 @@ class DatabaseTest extends MediaWikiTestCase {
                                . ( $this->db->getType() == 'postgres' ? '()' : '' )
                );
        }
+
+       function testUnknownTableCorruptsResults() {
+               $res = $this->db->select( 'page', '*', array( 'page_id' => 1 ) );
+               $this->assertFalse( $this->db->tableExists( 'foobarbaz' ) );
+               $this->assertInternalType( 'int', $res->numRows() );
+       }
 }
diff --git a/tests/phpunit/includes/db/DatabaseTestHelper.php b/tests/phpunit/includes/db/DatabaseTestHelper.php
new file mode 100644 (file)
index 0000000..790f273
--- /dev/null
@@ -0,0 +1,166 @@
+<?php
+
+/**
+ * Helper for testing the methods from the DatabaseBase class
+ * @since 1.22
+ */
+class DatabaseTestHelper extends DatabaseBase {
+
+       /**
+        * __CLASS__ of the test suite,
+        * used to determine, if the function name is passed every time to query()
+        */
+       protected $testName = array();
+
+       /**
+        * Array of lastSqls passed to query(),
+        * This is an array since some methods in DatabaseBase can do more than one
+        * query. Cleared when calling getLastSqls().
+        */
+       protected $lastSqls = array();
+
+       /**
+        * Array of tables to be considered as existing by tableExist()
+        * Use setExistingTables() to alter.
+        */
+       protected $tablesExists;
+
+       public function __construct( $testName ) {
+               $this->testName = $testName;
+       }
+
+       /**
+        * Returns SQL queries grouped by '; '
+        * Clear the list of queries that have been done so far.
+        */
+       public function getLastSqls() {
+               $lastSqls = implode( '; ', $this->lastSqls );
+               $this->lastSqls = array();
+
+               return $lastSqls;
+       }
+
+       public function setExistingTables( $tablesExists ) {
+               $this->tablesExists = (array)$tablesExists;
+       }
+
+       protected function addSql( $sql ) {
+               // clean up spaces before and after some words and the whole string
+               $this->lastSqls[] = trim( preg_replace(
+                       '/\s{2,}(?=FROM|WHERE|GROUP BY|ORDER BY|LIMIT)|(?<=SELECT|INSERT|UPDATE)\s{2,}/',
+                       ' ', $sql
+               ) );
+       }
+
+       protected function checkFunctionName( $fname ) {
+               if ( substr( $fname, 0, strlen( $this->testName ) ) !== $this->testName ) {
+                       throw new MWException( 'function name does not start with test class. ' .
+                               $fname . ' vs. ' . $this->testName . '. ' .
+                               'Please provide __METHOD__ to database methods.' );
+               }
+       }
+
+       function strencode( $s ) {
+               // Choose apos to avoid handling of escaping double quotes in quoted text
+               return str_replace( "'", "\'", $s );
+       }
+
+       public function addIdentifierQuotes( $s ) {
+               // no escaping to avoid handling of double quotes in quoted text
+               return $s;
+       }
+
+       public function query( $sql, $fname = '', $tempIgnore = false ) {
+               $this->checkFunctionName( $fname );
+               $this->addSql( $sql );
+
+               return parent::query( $sql, $fname, $tempIgnore );
+       }
+
+       public function tableExists( $table, $fname = __METHOD__ ) {
+               $this->checkFunctionName( $fname );
+
+               return in_array( $table, (array)$this->tablesExists );
+       }
+
+       // Redeclare parent method to make it public
+       public function nativeReplace( $table, $rows, $fname ) {
+               return parent::nativeReplace( $table, $rows, $fname );
+       }
+
+       function getType() {
+               return 'test';
+       }
+
+       function open( $server, $user, $password, $dbName ) {
+               return false;
+       }
+
+       function fetchObject( $res ) {
+               return false;
+       }
+
+       function fetchRow( $res ) {
+               return false;
+       }
+
+       function numRows( $res ) {
+               return -1;
+       }
+
+       function numFields( $res ) {
+               return -1;
+       }
+
+       function fieldName( $res, $n ) {
+               return 'test';
+       }
+
+       function insertId() {
+               return -1;
+       }
+
+       function dataSeek( $res, $row ) {
+               /* nop */
+       }
+
+       function lastErrno() {
+               return -1;
+       }
+
+       function lastError() {
+               return 'test';
+       }
+
+       function fieldInfo( $table, $field ) {
+               return false;
+       }
+
+       function indexInfo( $table, $index, $fname = 'Database::indexInfo' ) {
+               return false;
+       }
+
+       function affectedRows() {
+               return -1;
+       }
+
+       function getSoftwareLink() {
+               return 'test';
+       }
+
+       function getServerVersion() {
+               return 'test';
+       }
+
+       function getServerInfo() {
+               return 'test';
+       }
+
+       protected function closeConnection() {
+               return false;
+       }
+
+       protected function doQuery( $sql ) {
+               return array();
+       }
+}
index 596d0bd..27d4d0e 100644 (file)
@@ -76,6 +76,7 @@ abstract class ORMRowTest extends \MediaWikiTestCase {
         */
        protected function getRowInstance( array $data, $loadDefaults ) {
                $class = $this->getRowClass();
+
                return new $class( $this->getTableInstance(), $data, $loadDefaults );
        }
 
index 4cadf31..e583d1b 100644 (file)
@@ -45,6 +45,7 @@ class ORMTableTest extends MediaWikiTestCase {
         */
        public function getTable() {
                $class = $this->getTableClass();
+
                return $class::singleton();
        }
 
@@ -84,7 +85,6 @@ class ORMTableTest extends MediaWikiTestCase {
 
                $db->ignoreErrors( false );
        }
-
 }
 
 /**
index 263553a..f65642b 100644 (file)
@@ -64,23 +64,40 @@ class TestORMRowTest extends ORMRowTest {
                $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';
 
-               $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__
-               );
+               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() {
@@ -91,11 +108,12 @@ class TestORMRowTest extends ORMRowTest {
        }
 
        public function constructorTestProvider() {
+               $dbw = wfGetDB( DB_MASTER );
                return array(
                        array(
                                array(
                                        'name' => 'Foobar',
-                                       'time' => '20120101020202',
+                                       'time' => $dbw->timestamp( '20120101020202' ),
                                        'age' => 42,
                                        'height' => 9000.1,
                                        'awesome' => true,
@@ -122,10 +140,10 @@ class TestORMRowTest extends ORMRowTest {
                        'blob' => new stdClass()
                );
        }
-
 }
 
-class TestORMRow extends ORMRow {}
+class TestORMRow extends ORMRow {
+}
 
 class TestORMTable extends ORMTable {
 
@@ -194,6 +212,4 @@ class TestORMTable extends ORMTable {
        protected function getFieldPrefix() {
                return 'test_';
        }
-
-
 }
index 9fbf7bb..013bbe2 100644 (file)
@@ -13,7 +13,8 @@ class FileBackendTest extends MediaWikiTestCase {
        protected function setUp() {
                global $wgFileBackends;
                parent::setUp();
-               $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . time() . '-' . mt_rand();
+               $uniqueId = time() . '-' . mt_rand();
+               $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . $uniqueId;
                if ( $this->getCliArg( 'use-filebackend=' ) ) {
                        if ( self::$backendToUse ) {
                                $this->singleBackend = self::$backendToUse;
@@ -36,32 +37,34 @@ class FileBackendTest extends MediaWikiTestCase {
                        }
                } else {
                        $this->singleBackend = new FSFileBackend( array(
-                               'name'        => 'localtesting',
+                               'name' => 'localtesting',
                                'lockManager' => 'fsLockManager',
                                #'parallelize' => 'implicit',
+                               'wikiId' => wfWikiID() . $uniqueId,
                                'containerPaths' => array(
                                        'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
                                        'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
                        ) );
                }
                $this->multiBackend = new FileBackendMultiWrite( array(
-                       'name'        => 'localtesting',
+                       'name' => 'localtesting',
                        'lockManager' => 'fsLockManager',
                        'parallelize' => 'implicit',
-                       'backends'    => array(
+                       'wikiId' => wfWikiId() . $uniqueId,
+                       'backends' => array(
                                array(
-                                       'name'          => 'localmultitesting1',
-                                       'class'         => 'FSFileBackend',
-                                       'lockManager'   => 'nullLockManager',
+                                       'name' => 'localmultitesting1',
+                                       'class' => 'FSFileBackend',
+                                       'lockManager' => 'nullLockManager',
                                        'containerPaths' => array(
                                                'unittest-cont1' => "{$tmpPrefix}-localtestingmulti1-cont1",
                                                'unittest-cont2' => "{$tmpPrefix}-localtestingmulti1-cont2" ),
                                        'isMultiMaster' => false
                                ),
                                array(
-                                       'name'          => 'localmultitesting2',
-                                       'class'         => 'FSFileBackend',
-                                       'lockManager'   => 'nullLockManager',
+                                       'name' => 'localmultitesting2',
+                                       'class' => 'FSFileBackend',
+                                       'lockManager' => 'nullLockManager',
                                        'containerPaths' => array(
                                                'unittest-cont1' => "{$tmpPrefix}-localtestingmulti2-cont1",
                                                'unittest-cont2' => "{$tmpPrefix}-localtestingmulti2-cont2" ),
@@ -88,7 +91,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "FileBackend::isStoragePath on path '$path'" );
        }
 
-       function provider_testIsStoragePath() {
+       public static function provider_testIsStoragePath() {
                return array(
                        array( 'mwstore://', true ),
                        array( 'mwstore://backend', true ),
@@ -112,7 +115,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "FileBackend::splitStoragePath on path '$path'" );
        }
 
-       function provider_testSplitStoragePath() {
+       public static function provider_testSplitStoragePath() {
                return array(
                        array( 'mwstore://backend/container', array( 'backend', 'container', '' ) ),
                        array( 'mwstore://backend/container/', array( 'backend', 'container', '' ) ),
@@ -136,7 +139,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "FileBackend::normalizeStoragePath on path '$path'" );
        }
 
-       function provider_normalizeStoragePath() {
+       public static function provider_normalizeStoragePath() {
                return array(
                        array( 'mwstore://backend/container', 'mwstore://backend/container' ),
                        array( 'mwstore://backend/container/', 'mwstore://backend/container' ),
@@ -162,7 +165,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "FileBackend::parentStoragePath on path '$path'" );
        }
 
-       function provider_testParentStoragePath() {
+       public static function provider_testParentStoragePath() {
                return array(
                        array( 'mwstore://backend/container/path/to/obj', 'mwstore://backend/container/path/to' ),
                        array( 'mwstore://backend/container/path/to', 'mwstore://backend/container/path' ),
@@ -312,6 +315,7 @@ class FileBackendTest extends MediaWikiTestCase {
                                "Source file $source does not exist ($backendName)." );
                        $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
                                "Destination file $dest does not exist ($backendName)." );
+
                        return; // done
                }
 
@@ -431,6 +435,7 @@ class FileBackendTest extends MediaWikiTestCase {
                                "Source file $source does not exist ($backendName)." );
                        $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
                                "Destination file $dest does not exist ($backendName)." );
+
                        return; // done
                }
 
@@ -817,32 +822,66 @@ class FileBackendTest extends MediaWikiTestCase {
                        "$base/unittest-cont1/e/fileB.a",
                        "$base/unittest-cont1/e/fileC.a"
                );
-               $ops = array();
+               $createOps = array();
                $purgeOps = array();
                foreach ( $files as $path ) {
                        $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
                        $this->assertGoodStatus( $status,
                                "Preparing $path succeeded without warnings ($backendName)." );
-                       $ops[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand(0, 50000) );
+                       $createOps[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand( 0, 50000 ) );
+                       $copyOps[] = array( 'op' => 'copy', 'src' => $path, 'dst' => "$path-2" );
+                       $moveOps[] = array( 'op' => 'move', 'src' => "$path-2", 'dst' => "$path-3" );
                        $purgeOps[] = array( 'op' => 'delete', 'src' => $path );
+                       $purgeOps[] = array( 'op' => 'delete', 'src' => "$path-3" );
                }
                $purgeOps[] = array( 'op' => 'null' );
-               $status = $this->backend->doQuickOperations( $ops );
-               $this->assertGoodStatus( $status,
-                       "Creation of source files succeeded ($backendName)." );
 
+               $this->assertGoodStatus(
+                       $this->backend->doQuickOperations( $createOps ),
+                       "Creation of source files succeeded ($backendName)." );
                foreach ( $files as $file ) {
                        $this->assertTrue( $this->backend->fileExists( array( 'src' => $file ) ),
                                "File $file exists." );
                }
 
-               $status = $this->backend->doQuickOperations( $purgeOps );
-               $this->assertGoodStatus( $status,
-                       "Quick deletion of source files succeeded ($backendName)." );
+               $this->assertGoodStatus(
+                       $this->backend->doQuickOperations( $copyOps ),
+                       "Quick copy of source files succeeded ($backendName)." );
+               foreach ( $files as $file ) {
+                       $this->assertTrue( $this->backend->fileExists( array( 'src' => "$file-2" ) ),
+                               "File $file-2 exists." );
+               }
+
+               $this->assertGoodStatus(
+                       $this->backend->doQuickOperations( $moveOps ),
+                       "Quick move of source files succeeded ($backendName)." );
+               foreach ( $files as $file ) {
+                       $this->assertTrue( $this->backend->fileExists( array( 'src' => "$file-3" ) ),
+                               "File $file-3 move in." );
+                       $this->assertFalse( $this->backend->fileExists( array( 'src' => "$file-2" ) ),
+                               "File $file-2 moved away." );
+               }
+
+               $this->assertGoodStatus(
+                       $this->backend->quickCopy( array( 'src' => $files[0], 'dst' => $files[0] ) ),
+                       "Copy of file {$files[0]} over itself succeeded ($backendName)." );
+               $this->assertTrue( $this->backend->fileExists( array( 'src' => $files[0] ) ),
+                       "File {$files[0]} still exists." );
 
+               $this->assertGoodStatus(
+                       $this->backend->quickMove( array( 'src' => $files[0], 'dst' => $files[0] ) ),
+                       "Move of file {$files[0]} over itself succeeded ($backendName)." );
+               $this->assertTrue( $this->backend->fileExists( array( 'src' => $files[0] ) ),
+                       "File {$files[0]} still exists." );
+
+               $this->assertGoodStatus(
+                       $this->backend->doQuickOperations( $purgeOps ),
+                       "Quick deletion of source files succeeded ($backendName)." );
                foreach ( $files as $file ) {
                        $this->assertFalse( $this->backend->fileExists( array( 'src' => $file ) ),
                                "File $file purged." );
+                       $this->assertFalse( $this->backend->fileExists( array( 'src' => "$file-3" ) ),
+                               "File $file-3 purged." );
                }
        }
 
@@ -855,6 +894,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
                $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
+               $this->filesToPrune[] = $op['dst']; # avoid file leaking
                $this->tearDownFiles();
 
                $this->backend = $this->multiBackend;
@@ -873,8 +913,8 @@ class FileBackendTest extends MediaWikiTestCase {
                foreach ( $srcs as $i => $source ) {
                        $this->prepare( array( 'dir' => dirname( $source ) ) );
                        $ops[] = array(
-                               'op'      => 'create', // operation
-                               'dst'     => $source, // source
+                               'op' => 'create', // operation
+                               'dst' => $source, // source
                                'content' => $srcsContent[$i]
                        );
                        $expContent .= $srcsContent[$i];
@@ -927,7 +967,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testConcatenate() {
+       public static function provider_testConcatenate() {
                $cases = array();
 
                $rand = mt_rand( 0, 2000000000 ) . time();
@@ -1041,7 +1081,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testGetFileStat() {
+       public static function provider_testGetFileStat() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1096,7 +1136,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testGetFileContents() {
+       public static function provider_testGetFileContents() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1164,7 +1204,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $tmpFile->bind( $obj );
        }
 
-       function provider_testGetLocalCopy() {
+       public static function provider_testGetLocalCopy() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1230,7 +1270,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testGetLocalReference() {
+       public static function provider_testGetLocalReference() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1305,7 +1345,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       function provider_testGetFileHttpUrl() {
+       public static function provider_testGetFileHttpUrl() {
                $cases = array();
 
                $base = self::baseStorePath();
@@ -1329,8 +1369,9 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       function provider_testPrepareAndClean() {
+       public static function provider_testPrepareAndClean() {
                $base = self::baseStorePath();
+
                return array(
                        array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
                        array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
@@ -1419,7 +1460,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
-       // @TODO: testSecure
+       // @todo testSecure
 
        public function testDoOperations() {
                $this->backend = $this->singleBackend;
@@ -1729,7 +1770,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( true, $status->isOK(),
                        "Creation of files succeeded with OK status ($backendName)." );
 
-               // Expected listing
+               // Expected listing at root
                $expected = array(
                        "e/test1.txt",
                        "e/test2.txt",
@@ -1748,27 +1789,28 @@ class FileBackendTest extends MediaWikiTestCase {
                );
                sort( $expected );
 
-               // Actual listing (no trailing slash)
-               $list = array();
+               // Actual listing (no trailing slash) at root
                $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
+               $list = $this->listToArray( $iter );
                sort( $list );
+               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
+               // Actual listing (no trailing slash) at root with advise
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1", 'adviseStat' => 1 ) );
+               $list = $this->listToArray( $iter );
+               sort( $list );
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
-               // Actual listing (with trailing slash)
+               // Actual listing (with trailing slash) at root
                $list = array();
                $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
                sort( $list );
-
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
-               // Expected listing
+               // Expected listing at subdir
                $expected = array(
                        "test1.txt",
                        "test2.txt",
@@ -1780,36 +1822,39 @@ class FileBackendTest extends MediaWikiTestCase {
                );
                sort( $expected );
 
-               // Actual listing (no trailing slash)
-               $list = array();
+               // Actual listing (no trailing slash) at subdir
                $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
+               $list = $this->listToArray( $iter );
                sort( $list );
+               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
+               // Actual listing (no trailing slash) at subdir with advise
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+               $list = $this->listToArray( $iter );
+               sort( $list );
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
-               // Actual listing (with trailing slash)
+               // Actual listing (with trailing slash) at subdir
                $list = array();
                $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir/" ) );
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
                sort( $list );
-
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
                // Actual listing (using iterator second time)
-               $list = array();
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
+               $list = $this->listToArray( $iter );
                sort( $list );
-
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
 
-               // Expected listing (top files only)
+               // Actual listing (top files only) at root
+               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1" ) );
+               $list = $this->listToArray( $iter );
+               sort( $list );
+               $this->assertEquals( array(), $list, "Correct top file listing ($backendName)." );
+
+               // Expected listing (top files only) at subdir
                $expected = array(
                        "test1.txt",
                        "test2.txt",
@@ -1819,14 +1864,16 @@ class FileBackendTest extends MediaWikiTestCase {
                );
                sort( $expected );
 
-               // Actual listing (top files only)
-               $list = array();
+               // Actual listing (top files only) at subdir
                $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
+               $list = $this->listToArray( $iter );
                sort( $list );
+               $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
 
+               // Actual listing (top files only) at subdir with advise
+               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+               $list = $this->listToArray( $iter );
+               sort( $list );
                $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
 
                foreach ( $files as $file ) { // clean up
@@ -1834,7 +1881,9 @@ class FileBackendTest extends MediaWikiTestCase {
                }
 
                $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
-               foreach ( $iter as $iter ) {} // no errors
+               foreach ( $iter as $iter ) {
+                       // no errors
+               }
        }
 
        public function testGetDirectoryList() {
@@ -2023,7 +2072,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
 
                $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir1" ) );
-               $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+               $items = $this->listToArray( $iter );
                $this->assertEquals( array(), $items, "Directory listing is empty." );
 
                foreach ( $files as $file ) { // clean up
@@ -2031,12 +2080,15 @@ class FileBackendTest extends MediaWikiTestCase {
                }
 
                $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
-               foreach ( $iter as $file ) {} // no errors
-               $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+               foreach ( $iter as $file ) {
+                       // no errors
+               }
+
+               $items = $this->listToArray( $iter );
                $this->assertEquals( array(), $items, "Directory listing is empty." );
 
                $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/not/exists" ) );
-               $items = is_array( $iter ) ? $iter : iterator_to_array( $iter );
+               $items = $this->listToArray( $iter );
                $this->assertEquals( array(), $items, "Directory listing is empty." );
        }
 
@@ -2071,7 +2123,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "subdir2/subdir/sub/120-px-file.txt",
                );
 
-               for ( $i=0; $i<25; $i++ ) {
+               for ( $i = 0; $i < 25; $i++ ) {
                        $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
                        $this->assertEquals( print_r( array(), true ), print_r( $status->errors, true ),
                                "Locking of files succeeded ($backendName) ($i)." );
@@ -2141,6 +2193,11 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Scoped unlocking of files succeeded with OK status ($backendName)." );
        }
 
+       // helper function
+       private function listToArray( $iter ) {
+               return is_array( $iter ) ? $iter : iterator_to_array( $iter );
+       }
+
        // test helper wrapper for backend prepare() function
        private function prepare( array $params ) {
                return $this->backend->prepare( $params );
@@ -2149,12 +2206,15 @@ class FileBackendTest extends MediaWikiTestCase {
        // test helper wrapper for backend prepare() function
        private function create( array $params ) {
                $params['op'] = 'create';
+
                return $this->backend->doQuickOperations( array( $params ) );
        }
 
        function tearDownFiles() {
                foreach ( $this->filesToPrune as $file ) {
-                       @unlink( $file );
+                       if ( is_file( $file ) ) {
+                               unlink( $file );
+                       }
                }
                $containers = array( 'unittest-cont1', 'unittest-cont2' );
                foreach ( $containers as $container ) {
index 7cc25b1..033ae0b 100644 (file)
@@ -1,26 +1,25 @@
 <?php
 
 class FileRepoTest extends MediaWikiTestCase {
-
        /**
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionCanNotBeNull() {
-               $f = new FileRepo();
+               new FileRepo();
        }
 
        /**
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionCanNotBeAnEmptyArray() {
-               $f = new FileRepo( array() );
+               new FileRepo( array() );
        }
 
        /**
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionNeedNameKey() {
-               $f = new FileRepo( array(
+               new FileRepo( array(
                        'backend' => 'foobar'
                ) );
        }
@@ -29,7 +28,7 @@ class FileRepoTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        function testFileRepoConstructionOptionNeedBackendKey() {
-               $f = new FileRepo( array(
+               new FileRepo( array(
                        'name' => 'foobar'
                ) );
        }
index a89ef98..71a585e 100644 (file)
@@ -69,6 +69,7 @@ class StoreBatchTest extends MediaWikiTestCase {
                $result = $this->repo->store( $srcPath, 'temp', $dstRel, $flags );
                $result->value = $this->repo->getVirtualUrl( 'temp' ) . '/' . $dstUrlRel;
                $this->createdFiles[] = $result->value;
+
                return $result;
        }
 
index 74b921a..2642541 100644 (file)
@@ -20,7 +20,7 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
        /**
         * Provider for testFormat()
         */
-       function provideDocFormattingTests() {
+       public static function provideDocFormattingTests() {
                # Format: (expected string, unformattedText string, optional message)
                return array(
                        # Escape some wikitext
diff --git a/tests/phpunit/includes/installer/OracleInstallerTest.php b/tests/phpunit/includes/installer/OracleInstallerTest.php
new file mode 100644 (file)
index 0000000..7c37f98
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Tests for OracleInstaller
+ *
+ * @group Database
+ * @group Installer
+ */
+
+class OracleInstallerTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideOracleConnectStrings
+        */
+       function testCheckConnectStringFormat( $expected, $connectString, $msg = '' ) {
+               $validity = $expected ? 'should be valid' : 'should NOT be valid';
+               $msg = "'$connectString' ($msg) $validity.";
+               $this->assertEquals( $expected,
+                       OracleInstaller::checkConnectStringFormat( $connectString ),
+                       $msg
+               );
+       }
+
+       /**
+        * Provider to test OracleInstaller::checkConnectStringFormat()
+        */
+       function provideOracleConnectStrings() {
+               // expected result, connectString[, message]
+               return array(
+                       array( true, 'simple_01', 'Simple TNS name' ),
+                       array( true, 'simple_01.world', 'TNS name with domain' ),
+                       array( true, 'simple_01.domain.net', 'TNS name with domain' ),
+                       array( true, 'host123', 'Host only' ),
+                       array( true, 'host123.domain.net', 'FQDN only' ),
+                       array( true, '//host123.domain.net', 'FQDN URL only' ),
+                       array( true, '123.223.213.132', 'Host IP only' ),
+                       array( true, 'host:1521', 'Host and port' ),
+                       array( true, 'host:1521/service', 'Host, port and service' ),
+                       array( true, 'host:1521/service:shared', 'Host, port, service and shared server type' ),
+                       array( true, 'host:1521/service:dedicated', 'Host, port, service and dedicated server type' ),
+                       array( true, 'host:1521/service:pooled', 'Host, port, service and pooled server type' ),
+                       array( true, 'host:1521/service:shared/instance1', 'Host, port, service, server type and instance' ),
+                       array( true, 'host:1521//instance1', 'Host, port and instance' ),
+               );
+       }
+
+}
index ad4c8df..6990153 100644 (file)
@@ -8,7 +8,6 @@
 class JobQueueTest extends MediaWikiTestCase {
        protected $key;
        protected $queueRand, $queueRandTTL, $queueFifo, $queueFifoTTL;
-       protected $old = array();
 
        function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
@@ -17,10 +16,11 @@ class JobQueueTest extends MediaWikiTestCase {
        }
 
        protected function setUp() {
-               global $wgMemc, $wgJobTypeConf;
+               global $wgJobTypeConf;
                parent::setUp();
-               $this->old['wgMemc'] = $wgMemc;
-               $wgMemc = new HashBagOStuff();
+
+               $this->setMwGlobals( 'wgMemc', new HashBagOStuff() );
+
                if ( $this->getCliArg( 'use-jobqueue=' ) ) {
                        $name = $this->getCliArg( 'use-jobqueue=' );
                        if ( !isset( $wgJobTypeConf[$name] ) ) {
@@ -32,44 +32,50 @@ class JobQueueTest extends MediaWikiTestCase {
                }
                $baseConfig['type'] = 'null';
                $baseConfig['wiki'] = wfWikiID();
-               $this->queueRand = JobQueue::factory(
-                       array( 'order' => 'random', 'claimTTL' => 0 ) + $baseConfig );
-               $this->queueRandTTL = JobQueue::factory(
-                       array( 'order' => 'random', 'claimTTL' => 10 ) + $baseConfig );
-               $this->queueFifo = JobQueue::factory(
-                       array( 'order' => 'fifo', 'claimTTL' => 0 ) + $baseConfig );
-               $this->queueFifoTTL = JobQueue::factory(
-                       array( 'order' => 'fifo', 'claimTTL' => 10 ) + $baseConfig );
-               if ( $baseConfig['class'] !== 'JobQueueDB' ) { // DB namespace with prefix or temp tables
-                       foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
-                               $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
-                       }
+               $variants = array(
+                       'queueRand' => array( 'order' => 'random', 'claimTTL' => 0 ),
+                       'queueRandTTL' => array( 'order' => 'random', 'claimTTL' => 10 ),
+                       'queueTimestamp' => array( 'order' => 'timestamp', 'claimTTL' => 0 ),
+                       'queueTimestampTTL' => array( 'order' => 'timestamp', 'claimTTL' => 10 ),
+                       'queueFifo' => array( 'order' => 'fifo', 'claimTTL' => 0 ),
+                       'queueFifoTTL' => array( 'order' => 'fifo', 'claimTTL' => 10 ),
+               );
+               foreach ( $variants as $q => $settings ) {
+                       try {
+                               $this->$q = JobQueue::factory( $settings + $baseConfig );
+                               if ( !( $this->$q instanceof JobQueueDB ) ) {
+                                       $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
+                               }
+                       } catch ( MWException $e ) {
+                               // unsupported?
+                               // @todo What if it was another error?
+                       };
                }
        }
 
        protected function tearDown() {
-               global $wgMemc;
                parent::tearDown();
-               foreach ( array( 'queueRand', 'queueRandTTL', 'queueFifo', 'queueFifoTTL' ) as $q ) {
-                       do {
-                               $job = $this->$q->pop();
-                               if ( $job ) {
-                                       $this->$q->ack( $job );
-                               }
-                       } while ( $job );
+               foreach (
+                       array(
+                               'queueRand', 'queueRandTTL', 'queueTimestamp', 'queueTimestampTTL',
+                               'queueFifo', 'queueFifoTTL'
+                       ) as $q
+               ) {
+                       if ( $this->$q ) {
+                               $this->$q->delete();
+                       }
+                       $this->$q = null;
                }
-               $this->queueRand = null;
-               $this->queueRandTTL = null;
-               $this->queueFifo = null;
-               $this->queueFifoTTL = null;
-               $wgMemc = $this->old['wgMemc'];
        }
 
        /**
         * @dataProvider provider_queueLists
         */
-       function testProperties( $queue, $order, $recycles, $desc ) {
+       function testProperties( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
 
                $this->assertEquals( wfWikiID(), $queue->getWiki(), "Proper wiki ID ($desc)" );
                $this->assertEquals( 'null', $queue->getType(), "Proper job type ($desc)" );
@@ -78,8 +84,12 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_queueLists
         */
-       function testBasicOperations( $queue, $order, $recycles, $desc ) {
+       function testBasicOperations( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
+
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
@@ -94,6 +104,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->flushCaches();
                $this->assertEquals( 2, $queue->getSize(), "Queue size is correct ($desc)" );
                $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $jobs = iterator_to_array( $queue->getAllQueuedJobs() );
+               $this->assertEquals( 2, count( $jobs ), "Queue iterator size is correct ($desc)" );
 
                $job1 = $queue->pop();
                $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
@@ -132,13 +144,25 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $queue->flushCaches();
                $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
+
+               $this->assertTrue( $queue->batchPush( array( $this->newJob(), $this->newJob() ) ),
+                       "Push worked ($desc)" );
+               $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
+
+               $queue->delete();
+               $queue->flushCaches();
+               $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
+               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
        }
 
        /**
         * @dataProvider provider_queueLists
         */
-       function testBasicDeduplication( $queue, $order, $recycles, $desc ) {
+       function testBasicDeduplication( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
 
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
@@ -146,8 +170,10 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
                $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
-               $this->assertTrue( $queue->batchPush(
-                               array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ) ),
+               $this->assertTrue(
+                       $queue->batchPush(
+                               array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() )
+                       ),
                        "Push worked ($desc)" );
 
                $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
@@ -156,9 +182,12 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertEquals( 1, $queue->getSize(), "Queue size is correct ($desc)" );
                $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 
-               $this->assertTrue( $queue->batchPush(
-                               array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() ) ),
-                       "Push worked ($desc)" );
+               $this->assertTrue(
+                       $queue->batchPush(
+                               array( $this->newDedupedJob(), $this->newDedupedJob(), $this->newDedupedJob() )
+                       ),
+                       "Push worked ($desc)"
+               );
 
                $this->assertFalse( $queue->isEmpty(), "Queue is not empty ($desc)" );
 
@@ -186,8 +215,11 @@ class JobQueueTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_queueLists
         */
-       function testRootDeduplication( $queue, $order, $recycles, $desc ) {
+       function testRootDeduplication( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
 
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
@@ -238,6 +270,9 @@ class JobQueueTest extends MediaWikiTestCase {
         */
        function testJobOrder( $queue, $recycles, $desc ) {
                $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
 
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
@@ -264,16 +299,18 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
        }
 
-       function provider_queueLists() {
+       public static function provider_queueLists() {
                return array(
-                       array( 'queueRand', 'rand', false, 'Random queue without ack()' ),
-                       array( 'queueRandTTL', 'rand', true, 'Random queue with ack()' ),
-                       array( 'queueFifo', 'fifo', false, 'Ordered queue without ack()' ),
-                       array( 'queueFifoTTL', 'fifo', true, 'Ordered queue with ack()' )
+                       array( 'queueRand', false, 'Random queue without ack()' ),
+                       array( 'queueRandTTL', true, 'Random queue with ack()' ),
+                       array( 'queueTimestamp', false, 'Time ordered queue without ack()' ),
+                       array( 'queueTimestampTTL', true, 'Time ordered queue with ack()' ),
+                       array( 'queueFifo', false, 'FIFO ordered queue without ack()' ),
+                       array( 'queueFifoTTL', true, 'FIFO ordered queue with ack()' )
                );
        }
 
-       function provider_fifoQueueLists() {
+       public static function provider_fifoQueueLists() {
                return array(
                        array( 'queueFifo', false, 'Ordered queue without ack()' ),
                        array( 'queueFifoTTL', true, 'Ordered queue with ack()' )
diff --git a/tests/phpunit/includes/json/FormatJsonTest.php b/tests/phpunit/includes/json/FormatJsonTest.php
new file mode 100644 (file)
index 0000000..ef263c4
--- /dev/null
@@ -0,0 +1,161 @@
+<?php
+
+class FormatJsonTest extends MediaWikiTestCase {
+
+       public function testEncoderPrettyPrinting() {
+               $obj = array(
+                       'emptyObject' => new stdClass,
+                       'emptyArray' => array(),
+                       'string' => 'foobar\\',
+                       'filledArray' => array(
+                               array(
+                                       123,
+                                       456,
+                               ),
+                               '"7":["8",{"9":"10"}]',
+                       ),
+               );
+
+               // 4 space indent, no trailing whitespace, no trailing linefeed
+               $json = '{
+    "emptyObject": {
+
+    },
+    "emptyArray": [
+
+    ],
+    "string": "foobar\\\\",
+    "filledArray": [
+        [
+            123,
+            456
+        ],
+        "\"7\":[\"8\",{\"9\":\"10\"}]"
+    ]
+}';
+
+               $json = str_replace( "\r", '', $json ); // Windows compat
+               $this->assertSame( $json, FormatJson::encode( $obj, true ) );
+       }
+
+       public static function provideEncodeDefault() {
+               return self::getEncodeTestCases( array() );
+       }
+
+       /**
+        * @dataProvider provideEncodeDefault
+        */
+       public function testEncodeDefault( $from, $to ) {
+               $this->assertSame( $to, FormatJson::encode( $from ) );
+       }
+
+       public static function provideEncodeUtf8() {
+               return self::getEncodeTestCases( array( 'unicode' ) );
+       }
+
+       /**
+        * @dataProvider provideEncodeUtf8
+        */
+       public function testEncodeUtf8( $from, $to ) {
+               $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::UTF8_OK ) );
+       }
+
+       public static function provideEncodeXmlMeta() {
+               return self::getEncodeTestCases( array( 'xmlmeta' ) );
+       }
+
+       /**
+        * @dataProvider provideEncodeXmlMeta
+        */
+       public function testEncodeXmlMeta( $from, $to ) {
+               $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::XMLMETA_OK ) );
+       }
+
+       public static function provideEncodeAllOk() {
+               return self::getEncodeTestCases( array( 'unicode', 'xmlmeta' ) );
+       }
+
+       /**
+        * @dataProvider provideEncodeAllOk
+        */
+       public function testEncodeAllOk( $from, $to ) {
+               $this->assertSame( $to, FormatJson::encode( $from, false, FormatJson::ALL_OK ) );
+       }
+
+       public function testEncodePhpBug46944() {
+               $this->assertNotEquals(
+                       '\ud840\udc00',
+                       strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
+                       'Test encoding an broken json_encode character (U+20000)'
+               );
+       }
+
+       public function testDecodeReturnType() {
+               $this->assertInternalType(
+                       'object',
+                       FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
+                       'Default to object'
+               );
+
+               $this->assertInternalType(
+                       'array',
+                       FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
+                       'Optional array'
+               );
+       }
+
+       /**
+        * Generate a set of test cases for a particular combination of encoder options.
+        *
+        * @param array $unescapedGroups List of character groups to leave unescaped
+        * @return array: Arrays of unencoded strings and corresponding encoded strings
+        */
+       private static function getEncodeTestCases( array $unescapedGroups ) {
+               $groups = array(
+                       'always' => array(
+                               // Forward slash (always unescaped)
+                               '/' => '/',
+
+                               // Control characters
+                               "\0" => '\u0000',
+                               "\x08" => '\b',
+                               "\t" => '\t',
+                               "\n" => '\n',
+                               "\r" => '\r',
+                               "\f" => '\f',
+                               "\x1f" => '\u001f', // representative example
+
+                               // Double quotes
+                               '"' => '\"',
+
+                               // Backslashes
+                               '\\' => '\\\\',
+                               '\\\\' => '\\\\\\\\',
+                               '\\u00e9' => '\\\u00e9', // security check for Unicode unescaping
+
+                               // Line terminators
+                               "\xe2\x80\xa8" => '\u2028',
+                               "\xe2\x80\xa9" => '\u2029',
+                       ),
+                       'unicode' => array(
+                               "\xc3\xa9" => '\u00e9',
+                               "\xf0\x9d\x92\x9e" => '\ud835\udc9e', // U+1D49E, outside the BMP
+                       ),
+                       'xmlmeta' => array(
+                               '<' => '\u003C', // JSON_HEX_TAG uses uppercase hex digits
+                               '>' => '\u003E',
+                               '&' => '\u0026',
+                       ),
+               );
+
+               $cases = array();
+               foreach ( $groups as $name => $rules ) {
+                       $leaveUnescaped = in_array( $name, $unescapedGroups );
+                       foreach ( $rules as $from => $to ) {
+                               $cases[] = array( $from, '"' . ( $leaveUnescaped ? $from : $to ) . '"' );
+                       }
+               }
+
+               return $cases;
+       }
+}
diff --git a/tests/phpunit/includes/json/ServicesJsonTest.php b/tests/phpunit/includes/json/ServicesJsonTest.php
deleted file mode 100644 (file)
index 56dc648..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-/* 
- * Test cases for our Services_Json library. Requires PHP json support as well,
- * so we can compare output
- */
-class ServicesJsonTest extends MediaWikiTestCase {
-       /**
-        * Test to make sure core json_encode() and our Services_Json()->encode()
-        * produce the same output
-        *
-        * @dataProvider provideValuesToEncode
-        */
-       public function testJsonEncode( $input, $desc ) {
-               if ( !function_exists( 'json_encode' ) ) {
-                       $this->markTestIncomplete( 'No PHP json support, unable to test' );
-                       return;
-               } elseif ( strtolower( json_encode( "\xf0\xa0\x80\x80" ) ) != '"\ud840\udc00"' ) {
-                       $this->markTestIncomplete( 'Have buggy PHP json support, unable to test' );
-                       return;
-               } else {
-                       $jsonObj = new Services_JSON();
-                       $this->assertEquals(
-                               $jsonObj->encode( $input ),
-                               json_encode( $input ),
-                               $desc
-                       );
-               }
-       }
-
-       /**
-        * Test to make sure core json_decode() and our Services_Json()->decode()
-        * produce the same output
-        *
-        * @dataProvider provideValuesToDecode
-        */
-       public function testJsonDecode( $input, $desc ) {
-               if ( !function_exists( 'json_decode' ) ) {
-                       $this->markTestIncomplete( 'No PHP json support, unable to test' );
-                       return;
-               } else {
-                       $jsonObj = new Services_JSON();
-                       $this->assertEquals(
-                               $jsonObj->decode( $input ),
-                               json_decode( $input ),
-                               $desc
-                       );
-               }
-       }
-
-       function provideValuesToEncode() {
-               $obj = new stdClass();
-               $obj->property = 'value';
-               $obj->property2 = null;
-               $obj->property3 = 1.234;
-               return array(
-                       array( 1, 'basic integer' ),
-                       array( -1, 'negative integer' ),
-                       array( 1.1, 'basic float' ),
-                       array( true, 'basic bool true' ),
-                       array( false, 'basic bool false' ),
-                       array( 'some string', 'basic string test' ),
-                       array( "some string\nwith newline", 'newline string test' ),
-                       array( '♥ü', 'unicode string test' ),
-                       array( array( 'some', 'string', 'values' ), 'basic array of strings' ),
-                       array( array( 'key1' => 'val1', 'key2' => 'val2' ), 'array with string keys' ),
-                       array( array( 1 => 'val1', 3 => 'val2', '2' => 'val3' ), 'out of order numbered array test' ),
-                       array( array(), 'empty array test' ),
-                       array( $obj, 'basic object test' ),
-                       array( new stdClass, 'empty object test' ),
-                       array( null, 'null test' ),
-               );
-       }
-
-       function provideValuesToDecode() {
-               return array(
-                       array( '1', 'basic integer' ),
-                       array( '-1', 'negative integer' ),
-                       array( '1.1', 'basic float' ),
-                       array( '1.1e1', 'scientific float' ),
-                       array( 'true', 'basic bool true' ),
-                       array( 'false', 'basic bool false' ),
-                       array( '"some string"', 'basic string test' ),
-                       array( '"some string\nwith newline"', 'newline string test' ),
-                       array( '"♥ü"', 'unicode character string test' ),
-                       array( '"\u2665"', 'unicode \\u string test' ),
-                       array( '["some","string","values"]', 'basic array of strings' ),
-                       array( '[]', 'empty array test' ),
-                       array( '{"key":"value"}', 'Basic key => value test' ),
-                       array( '{}', 'empty object test' ),
-                       array( 'null', 'null test' ),
-               );
-       }
-}
index 26747b9..632eb52 100644 (file)
@@ -54,7 +54,7 @@ class CSSJanusTest extends MediaWikiTestCase {
         * These transform cases are tested *in both directions*
         * No need to declare a principle twice in both directions here.
         */
-       function provideTransformCases() {
+       public static function provideTransformCases() {
                return array(
                        // Property keys
                        array(
@@ -476,7 +476,7 @@ class CSSJanusTest extends MediaWikiTestCase {
         * If both ways can be tested, either put both versions in here or move
         * it to provideTransformCases().
         */
-       function provideTransformAdvancedCases() {
+       public static function provideTransformAdvancedCases() {
                $bgPairs = array(
                        # [ - _ . ] <-> [ left right ltr rtl ]
                        'foo.jpg' => 'foo.jpg',
@@ -542,7 +542,7 @@ class CSSJanusTest extends MediaWikiTestCase {
         * Cases that are currently failing, but
         * should be looked at in the future as enhancements and/or bug fix
         */
-       function provideTransformBrokenCases() {
+       public static function provideTransformBrokenCases() {
                return array(
                        // Guard against selectors that look flippable
                        array(
index 57017a8..e9901ce 100644 (file)
@@ -27,7 +27,7 @@ class CSSMinTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
        }
 
-       function provideMinifyCases() {
+       public static function provideMinifyCases() {
                return array(
                        // Whitespace
                        array( "\r\t\f \v\n\r", "" ),
@@ -77,7 +77,7 @@ class CSSMinTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedOutput, $remapped, 'CSSMin::remap should return the expected url form.' . $messageAdd );
        }
 
-       function provideRemapCases() {
+       public static function provideRemapCases() {
                // Parameter signature:
                // CSSMin::remap( $code, $local, $remote, $embedData = true )
                return array(
@@ -119,7 +119,7 @@ class CSSMinTest extends MediaWikiTestCase {
                $this->testMinifyOutput( $code, $expectedOutput );
        }
 
-       function provideStringCases() {
+       public static function provideStringCases() {
                return array(
                        // String values should be respected
                        // - More than one space in a string value
index 37a9b34..7436c43 100644 (file)
@@ -73,6 +73,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
         */
        protected function getNew( array $elements = array() ) {
                $class = $this->getInstanceClass();
+
                return new $class( $elements );
        }
 
@@ -197,6 +198,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
        public function testOffsetSet( array $elements ) {
                if ( $elements === array() ) {
                        $this->assertTrue( true );
+
                        return;
                }
 
@@ -258,5 +260,4 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
 
                $this->assertArrayEquals( $list, $copy, true, true );
        }
-
 }
index 1f55079..eb64a64 100644 (file)
@@ -2,7 +2,7 @@
 
 class JavaScriptMinifierTest extends MediaWikiTestCase {
 
-       function provideCases() {
+       public static function provideCases() {
                return array(
 
                        // Basic whitespace and comments that should be stripped entirely
@@ -132,7 +132,7 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
        }
 
-       function provideBug32548() {
+       public static function provideBug32548() {
                return array(
                        array(
                                // This one gets interpreted all together by the prior code;
index b221b83..ffa6084 100644 (file)
@@ -18,8 +18,6 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         * translation (to en) where XMP should win.
         */
        public function testMultilingualCascade() {
-               global $wgShowEXIF;
-
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
@@ -27,7 +25,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                        $this->markTestSkipped( "This test needs the xml extension." );
                }
 
-               $wgShowEXIF = true;
+               $this->setMwGlobals( 'wgShowEXIF', true );
 
                $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
                        '/Xmp-exif-multilingual_test.jpg' );
@@ -148,5 +146,4 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                $res = $handler->getTiffByteOrder( $this->filePath . 'test.tiff' );
                $this->assertEquals( 'LE', $res );
        }
-
 }
index 3de60b7..c4706bf 100644 (file)
@@ -22,7 +22,7 @@ class BitmapScalingTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedParams, $params, $msg );
        }
 
-       function provideNormaliseParams() {
+       public static function provideNormaliseParams() {
                return array(
                        /* Regular resize operations */
                        array(
index db29d17..f02e8b9 100644 (file)
@@ -25,21 +25,11 @@ class ExifRotationTest extends MediaWikiTestCase {
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
-               global $wgShowEXIF;
-               $this->show = $wgShowEXIF;
-               $wgShowEXIF = true;
 
-               global $wgEnableAutoRotation;
-               $this->oldAuto = $wgEnableAutoRotation;
-               $wgEnableAutoRotation = true;
-       }
-
-       protected function tearDown() {
-               global $wgShowEXIF, $wgEnableAutoRotation;
-               $wgShowEXIF = $this->show;
-               $wgEnableAutoRotation = $this->oldAuto;
-
-               parent::tearDown();
+               $this->setMwGlobals( array(
+                       'wgShowEXIF' => true,
+                       'wgEnableAutoRotation' => true,
+               ) );
        }
 
        /**
@@ -139,14 +129,11 @@ class ExifRotationTest extends MediaWikiTestCase {
         * @dataProvider provideFilesNoAutoRotate
         */
        function testMetadataNoAutoRotate( $name, $type, $info ) {
-               global $wgEnableAutoRotation;
-               $wgEnableAutoRotation = false;
+               $this->setMwGlobals( 'wgEnableAutoRotation', false );
 
                $file = $this->dataFile( $name, $type );
                $this->assertEquals( $info['width'], $file->getWidth(), "$name: width check" );
                $this->assertEquals( $info['height'], $file->getHeight(), "$name: height check" );
-
-               $wgEnableAutoRotation = true;
        }
 
        /**
@@ -154,8 +141,7 @@ class ExifRotationTest extends MediaWikiTestCase {
         * @dataProvider provideFilesNoAutoRotate
         */
        function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
-               global $wgEnableAutoRotation;
-               $wgEnableAutoRotation = false;
+               $this->setMwGlobals( 'wgEnableAutoRotation', false );
 
                foreach ( $thumbs as $size => $out ) {
                        if ( preg_match( '/^(\d+)px$/', $size, $matches ) ) {
@@ -187,7 +173,6 @@ class ExifRotationTest extends MediaWikiTestCase {
                                $this->assertEquals( $out[1], $gis[1], "$name: thumb actual height check for $size" );
                        }
                }
-               $wgEnableAutoRotation = true;
        }
 
        public static function provideFilesNoAutoRotate() {
@@ -238,7 +223,7 @@ class ExifRotationTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $result );
        }
 
-       function provideBitmapExtractPreRotationDimensions() {
+       public static function provideBitmapExtractPreRotationDimensions() {
                return array(
                        array(
                                0,
index e7e95f7..6ad28ac 100644 (file)
@@ -39,6 +39,4 @@ class ExifTest extends MediaWikiTestCase {
                );
                $this->assertEquals( $expected, $data );
        }
-
-
 }
index c9648a7..81a58dd 100644 (file)
@@ -56,5 +56,4 @@ class IPTCTest extends MediaWikiTestCase {
                $res = IPTC::Parse( $iptcData );
                $this->assertEquals( array( '¼' ), $res['Keywords'] );
        }
-
 }
index 3bbce2b..58d791f 100644 (file)
@@ -52,7 +52,6 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
                // encoded as just \xA9.
                $expected = "© 2010 Bawolff";
 
-
                $this->assertArrayHasKey( 'text', $meta );
                $meta = $meta['text'];
                $this->assertArrayHasKey( 'Copyright', $meta );
@@ -149,5 +148,4 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
                        'greyscale-na-png.png' );
                $this->assertEquals( 'greyscale', $meta['colorType'] );
        }
-
 }
index 97a0000..3bf9c59 100644 (file)
@@ -21,6 +21,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                $r = new XMLReader();
                if ( !method_exists( $r, 'readInnerXML' ) ) {
                        $this->markTestSkipped( 'XMLReader::readInnerXML() does not exist (libxml >2.6.20 needed).' );
+
                        return;
                }
                $this->assertMetadata( $infile, $expected );
@@ -41,6 +42,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
        public static function provideSvgFiles() {
                $base = __DIR__ . '/../../data/media';
+
                return array(
                        array(
                                "$base/Wikimedia-logo.svg",
index 86c722b..25a43eb 100644 (file)
@@ -62,9 +62,10 @@ class XMPTest extends MediaWikiTestCase {
                        // result array, but it seems kind of big to put directly in the test
                        // file.
                        $result = null;
-                       include( $xmpPath . $file[0] . '.result.php' );
+                       include $xmpPath . $file[0] . '.result.php';
                        $data[] = array( $xmp, $result, '[' . $file[0] . '.xmp] ' . $file[1] );
                }
+
                return $data;
        }
 
@@ -157,5 +158,4 @@ class XMPTest extends MediaWikiTestCase {
 
                $this->assertEquals( $expected, $actual );
        }
-
 }
index a2b4e1c..257c40a 100644 (file)
@@ -41,7 +41,5 @@ class XMPValidateTest extends MediaWikiTestCase {
                        array( '2001-05-12T15', null ),
                        array( '2001-12T15:13', null ),
                );
-
        }
-
 }
index 99ec05d..68efd86 100644 (file)
  *
  * @ingroup UtfNormal
  * @group Large
+ *
+ * We ignore code coverage for this test suite until they are rewritten
+ * to use data providers (bug 46561).
+ * @codeCoverageIgnore
  */
 class CleanUpTest extends MediaWikiTestCase {
        /** @todo document */
index 88b07f0..be603e5 100644 (file)
@@ -15,7 +15,6 @@ class BagOStuffTest extends MediaWikiTestCase {
                        $name = $this->getCliArg( 'use-bagostuff=' );
 
                        $this->cache = ObjectCache::newFromId( $name );
-
                } else {
                        // no type defined - use simple hash
                        $this->cache = new HashBagOStuff;
index 51643ce..263df5f 100644 (file)
@@ -65,68 +65,44 @@ class MagicVariableTest extends MediaWikiTestCase {
 
        # day
 
-       /**
-        * @dataProvider MediaWikiProvide::Days
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Days */
        function testCurrentdayIsUnPadded( $day ) {
                $this->assertUnPadded( 'currentday', $day );
        }
 
-       /**
-        * @dataProvider MediaWikiProvide::Days
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Days */
        function testCurrentdaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'currentday2', $day );
        }
 
-       /**
-        * @dataProvider MediaWikiProvide::Days
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Days */
        function testLocaldayIsUnPadded( $day ) {
                $this->assertUnPadded( 'localday', $day );
        }
 
-       /**
-        * @dataProvider MediaWikiProvide::Days
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Days */
        function testLocaldaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'localday2', $day );
        }
 
        # month
 
-       /**
-        * @dataProvider MediaWikiProvide::Months
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Months */
        function testCurrentmonthIsZeroPadded( $month ) {
                $this->assertZeroPadded( 'currentmonth', $month );
        }
 
-       /**
-        * @dataProvider MediaWikiProvide::Months
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Months */
        function testCurrentmonthoneIsUnPadded( $month ) {
                $this->assertUnPadded( 'currentmonth1', $month );
        }
 
-       /**
-        * @dataProvider MediaWikiProvide::Months
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Months */
        function testLocalmonthIsZeroPadded( $month ) {
                $this->assertZeroPadded( 'localmonth', $month );
        }
 
-       /**
-        * @dataProvider MediaWikiProvide::Months
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Months */
        function testLocalmonthoneIsUnPadded( $month ) {
                $this->assertUnPadded( 'localmonth1', $month );
        }
@@ -134,36 +110,24 @@ class MagicVariableTest extends MediaWikiTestCase {
 
        # revision day
 
-       /**
-        * @dataProvider MediaWikiProvide::Days
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Days */
        function testRevisiondayIsUnPadded( $day ) {
                $this->assertUnPadded( 'revisionday', $day );
        }
 
-       /**
-        * @dataProvider MediaWikiProvide::Days
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Days */
        function testRevisiondaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'revisionday2', $day );
        }
 
        # revision month
 
-       /**
-        * @dataProvider MediaWikiProvide::Months
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Months */
        function testRevisionmonthIsZeroPadded( $month ) {
                $this->assertZeroPadded( 'revisionmonth', $month );
        }
 
-       /**
-        * @dataProvider MediaWikiProvide::Months
-        * @group Database
-        */
+       /** @dataProvider MediaWikiProvide::Months */
        function testRevisionmonthoneIsUnPadded( $month ) {
                $this->assertUnPadded( 'revisionmonth1', $month );
        }
@@ -172,19 +136,20 @@ class MagicVariableTest extends MediaWikiTestCase {
         * Rough tests for {{SERVERNAME}} magic word
         * Bug 31176
         * @group Database
+        * @dataProvider dataServernameFromDifferentProtocols
         */
-       function testServernameFromDifferentProtocols() {
-               global $wgServer;
-               $saved_wgServer = $wgServer;
+       function testServernameFromDifferentProtocols( $server ) {
+               $this->setMwGlobals( 'wgServer', $server );
 
-               $wgServer = 'http://localhost/';
-               $this->assertMagic( 'localhost', 'servername' );
-               $wgServer = 'https://localhost/';
-               $this->assertMagic( 'localhost', 'servername' );
-               $wgServer = '//localhost/'; # bug 31176
                $this->assertMagic( 'localhost', 'servername' );
+       }
 
-               $wgServer = $saved_wgServer;
+       function dataServernameFromDifferentProtocols() {
+               return array(
+                       array( 'http://localhost/' ),
+                       array( 'https://localhost/' ),
+                       array( '//localhost/' ), # bug 31176
+               );
        }
 
        ############### HELPERS ############################################
index 067a7c4..22737b3 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-require_once( __DIR__ . '/NewParserTest.php' );
+require_once __DIR__ . '/NewParserTest.php';
 
 /**
  * The UnitTest must be either a class that inherits from MediaWikiTestCase
@@ -16,19 +16,32 @@ class MediaWikiParserTest {
 
                $suite = new PHPUnit_Framework_TestSuite;
 
-               foreach ( $wgParserTestFiles as $filename ) {
-                       $testsName = basename( $filename, '.txt' );
+               foreach ( $wgParserTestFiles as $fileName ) {
+                       $testsName = basename( $fileName, '.txt' );
+                       $escapedFileName = strtr( $fileName, array( "'" => "\\'", '\\' => '\\\\' ) );
                        /* This used to be ucfirst( basename( dirname( $filename ) ) )
                         * and then was ucfirst( basename( $filename, '.txt' )
                         * but that didn't work with names like foo.tests.txt
                         */
-                       $className = str_replace( '.', '_', ucfirst( $testsName ) );
+                       $parserTestClassName = str_replace( '.', '_', ucfirst( $testsName ) );
+                       $parserTestClassDefinition = <<<EOT
+/**
+ * @group Database
+ * @group Parser
+ * @group ParserTests
+ * @group ParserTests_$parserTestClassName
+ */
+class $parserTestClassName extends NewParserTest {
+       protected \$file = '$escapedFileName';
+}
+EOT;
 
-                       eval( "/** @group Database\n@group Parser\n*/ class $className extends NewParserTest { protected \$file = '" . strtr( $filename, array( "'" => "\\'", '\\' => '\\\\' ) ) . "'; } " );
+                       eval( $parserTestClassDefinition );
 
-                       $parserTester = new $className( $testsName );
+                       $parserTester = new $parserTestClassName( $testsName );
                        $suite->addTestSuite( new ReflectionClass ( $parserTester ) );
                }
+
                return $suite;
        }
 }
index bf6931a..8cee07b 100644 (file)
@@ -19,7 +19,6 @@ class NewParserTest extends MediaWikiTestCase {
        public $runParsoid = false;
        public $regex = '';
        public $showProgress = true;
-       public $savedInitialGlobals = array();
        public $savedWeirdGlobals = array();
        public $savedGlobals = array();
        public $hooks = array();
@@ -33,7 +32,7 @@ class NewParserTest extends MediaWikiTestCase {
        protected $file = false;
 
        protected function setUp() {
-               global $wgNamespaceProtection, $wgNamespaceAliases;
+               global $wgNamespaceAliases;
                global $wgHooks, $IP;
 
                parent::setUp();
@@ -52,11 +51,16 @@ class NewParserTest extends MediaWikiTestCase {
 
                $tmpGlobals['wgLanguageCode'] = 'en';
                $tmpGlobals['wgContLang'] = Language::factory( 'en' );
+               $tmpGlobals['wgSitename'] = 'MediaWiki';
+               $tmpGlobals['wgServer'] = 'http://example.org';
                $tmpGlobals['wgScript'] = '/index.php';
                $tmpGlobals['wgScriptPath'] = '/';
                $tmpGlobals['wgArticlePath'] = '/wiki/$1';
-               $tmpGlobals['wgStyleSheetPath'] = '/skins';
+               $tmpGlobals['wgActionPaths'] = array();
+               $tmpGlobals['wgVariantArticlePath'] = false;
+               $tmpGlobals['wgExtensionAssetsPath'] = '/extensions';
                $tmpGlobals['wgStylePath'] = '/skins';
+               $tmpGlobals['wgEnableUploads'] = true;
                $tmpGlobals['wgThumbnailScriptPath'] = false;
                $tmpGlobals['wgLocalFileRepo'] = array(
                        'class' => 'LocalRepo',
@@ -67,51 +71,66 @@ class NewParserTest extends MediaWikiTestCase {
                        'backend' => 'local-backend'
                );
                $tmpGlobals['wgForeignFileRepos'] = array();
+               $tmpGlobals['wgDefaultExternalStore'] = array();
                $tmpGlobals['wgEnableParserCache'] = false;
-               $tmpGlobals['wgHooks'] = $wgHooks;
+               $tmpGlobals['wgCapitalLinks'] = true;
+               $tmpGlobals['wgNoFollowLinks'] = true;
+               $tmpGlobals['wgNoFollowDomainExceptions'] = array();
+               $tmpGlobals['wgExternalLinkTarget'] = false;
+               $tmpGlobals['wgThumbnailScriptPath'] = false;
+               $tmpGlobals['wgUseImageResize'] = true;
+               $tmpGlobals['wgAllowExternalImages'] = true;
+               $tmpGlobals['wgRawHtml'] = false;
+               $tmpGlobals['wgUseTidy'] = false;
+               $tmpGlobals['wgAlwaysUseTidy'] = false;
+               $tmpGlobals['wgWellFormedXml'] = true;
+               $tmpGlobals['wgAllowMicrodataAttributes'] = true;
+               $tmpGlobals['wgExperimentalHtmlIds'] = false;
+               $tmpGlobals['wgAdaptiveMessageCache'] = true;
+               $tmpGlobals['wgUseDatabaseMessages'] = true;
+               $tmpGlobals['wgLocaltimezone'] = 'UTC';
                $tmpGlobals['wgDeferredUpdateList'] = array();
-               $tmpGlobals['wgMemc'] = wfGetMainCache();
-               $tmpGlobals['messageMemc'] = wfGetMessageCacheStorage();
-               $tmpGlobals['parserMemc'] = wfGetParserCacheStorage();
+               $tmpGlobals['wgGroupPermissions'] = array(
+                       '*' => array(
+                               'createaccount' => true,
+                               'read' => true,
+                               'edit' => true,
+                               'createpage' => true,
+                               'createtalk' => true,
+               ) );
+               $tmpGlobals['wgNamespaceProtection'] = array( NS_MEDIAWIKI => 'editinterface' );
 
-               // $tmpGlobals['wgContLang'] = new StubContLang;
-               $tmpGlobals['wgUser'] = new User;
-               $context = new RequestContext();
-               $tmpGlobals['wgLang'] = $context->getLanguage();
-               $tmpGlobals['wgOut'] = $context->getOutput();
                $tmpGlobals['wgParser'] = new StubObject( 'wgParser', $GLOBALS['wgParserConf']['class'], array( $GLOBALS['wgParserConf'] ) );
-               $tmpGlobals['wgRequest'] = $context->getRequest();
 
                if ( $GLOBALS['wgStyleDirectory'] === false ) {
                        $tmpGlobals['wgStyleDirectory'] = "$IP/skins";
                }
 
+               # Replace all media handlers with a mock. We do not need to generate
+               # actual thumbnails to do parser testing, we only care about receiving
+               # a ThumbnailImage properly initialized.
+               global $wgMediaHandlers;
+               foreach ( $wgMediaHandlers as $type => $handler ) {
+                       $tmpGlobals['wgMediaHandlers'][$type] = 'MockBitmapHandler';
+               }
 
-               foreach ( $tmpGlobals as $var => $val ) {
-                       if ( array_key_exists( $var, $GLOBALS ) ) {
-                               $this->savedInitialGlobals[$var] = $GLOBALS[$var];
-                       }
+               $tmpHooks = $wgHooks;
+               $tmpHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
+               $tmpHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
+               $tmpGlobals['wgHooks'] = $tmpHooks;
 
-                       $GLOBALS[$var] = $val;
-               }
+               $this->setMwGlobals( $tmpGlobals );
 
-               $this->savedWeirdGlobals['mw_namespace_protection'] = $wgNamespaceProtection[NS_MEDIAWIKI];
                $this->savedWeirdGlobals['image_alias'] = $wgNamespaceAliases['Image'];
                $this->savedWeirdGlobals['image_talk_alias'] = $wgNamespaceAliases['Image_talk'];
 
-               $wgNamespaceProtection[NS_MEDIAWIKI] = 'editinterface';
                $wgNamespaceAliases['Image'] = NS_FILE;
                $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
        }
 
        protected function tearDown() {
-               foreach ( $this->savedInitialGlobals as $var => $val ) {
-                       $GLOBALS[$var] = $val;
-               }
-
-               global $wgNamespaceProtection, $wgNamespaceAliases;
+               global $wgNamespaceAliases;
 
-               $wgNamespaceProtection[NS_MEDIAWIKI] = $this->savedWeirdGlobals['mw_namespace_protection'];
                $wgNamespaceAliases['Image'] = $this->savedWeirdGlobals['image_alias'];
                $wgNamespaceAliases['Image_talk'] = $this->savedWeirdGlobals['image_talk_alias'];
 
@@ -119,6 +138,12 @@ class NewParserTest extends MediaWikiTestCase {
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
 
+               // Remove temporary pages from the link cache
+               LinkCache::singleton()->clear();
+
+               // Restore message cache (temporary pages and $wgUseDatabaseMessages)
+               MessageCache::destroyInstance();
+
                parent::tearDown();
        }
 
@@ -174,12 +199,6 @@ class NewParserTest extends MediaWikiTestCase {
                        __METHOD__
                );
 
-               # Reinitialise the LocalisationCache to match the database state
-               Language::getLocalisationCache()->unloadAll();
-
-               # Clear the message cache
-               MessageCache::singleton()->clear();
-
                $user = User::newFromId( 0 );
                LinkCache::singleton()->clear(); # Avoids the odd failure at creating the nullRevision
 
@@ -187,6 +206,10 @@ class NewParserTest extends MediaWikiTestCase {
                # We will upload the actual files later. Note that if anything causes LocalFile::load()
                # to be triggered before then, it will break via maybeUpgrade() setting the fileExists
                # member to false and storing it in cache.
+               # note that the size/width/height/bits/etc of the file
+               # are actually set by inspecting the file itself; the arguments
+               # to recordUpload2 have no effect.  That said, we try to make things
+               # match up so it is less confusing to readers of the code & tests.
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Foobar.jpg' ) );
                if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
                        $image->recordUpload2(
@@ -194,19 +217,39 @@ class NewParserTest extends MediaWikiTestCase {
                                'Upload of some lame file',
                                'Some lame file',
                                array(
-                                       'size' => 12345,
+                                       'size' => 7881,
                                        'width' => 1941,
                                        'height' => 220,
-                                       'bits' => 24,
+                                       'bits' => 8,
                                        'media_type' => MEDIATYPE_BITMAP,
                                        'mime' => 'image/jpeg',
                                        'metadata' => serialize( array() ),
-                                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                                       'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
                                        'fileExists' => true ),
                                $this->db->timestamp( '20010115123500' ), $user
                        );
                }
 
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Thumb.png' ) );
+               if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+                       $image->recordUpload2(
+                               '', // archive name
+                               'Upload of some lame thumbnail',
+                               'Some lame thumbnail',
+                               array(
+                                       'size' => 22589,
+                                       'width' => 135,
+                                       'height' => 135,
+                                       'bits' => 8,
+                                       'media_type' => MEDIATYPE_BITMAP,
+                                       'mime' => 'image/png',
+                                       'metadata' => serialize( array() ),
+                                       'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+                                       'fileExists' => true ),
+                               $this->db->timestamp( '20130225203040' ), $user
+                       );
+               }
+
                # This image will be blacklisted in [[MediaWiki:Bad image list]]
                $image = wfLocalFile( Title::makeTitle( NS_FILE, 'Bad.jpg' ) );
                if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
@@ -222,7 +265,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        'media_type' => MEDIATYPE_BITMAP,
                                        'mime' => 'image/jpeg',
                                        'metadata' => serialize( array() ),
-                                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                                       'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
                                        'fileExists' => true ),
                                $this->db->timestamp( '20010115123500' ), $user
                        );
@@ -265,7 +308,10 @@ class NewParserTest extends MediaWikiTestCase {
                                $backend = self::$backendToUse;
                        }
                } else {
-                       $backend = new FSFileBackend( array(
+                       # Replace with a mock. We do not care about generating real
+                       # files on the filesystem, just need to expose the file
+                       # informations.
+                       $backend = new MockFileBackend( array(
                                'name' => 'local-backend',
                                'lockManager' => 'nullLockManager',
                                'containerPaths' => array(
@@ -276,12 +322,6 @@ class NewParserTest extends MediaWikiTestCase {
                }
 
                $settings = array(
-                       'wgServer' => 'http://example.org',
-                       'wgScript' => '/index.php',
-                       'wgScriptPath' => '/',
-                       'wgArticlePath' => '/wiki/$1',
-                       'wgExtensionAssetsPath' => '/extensions',
-                       'wgActionPaths' => array(),
                        'wgLocalFileRepo' => array(
                                'class' => 'LocalRepo',
                                'name' => 'local',
@@ -291,47 +331,15 @@ class NewParserTest extends MediaWikiTestCase {
                                'backend' => $backend
                        ),
                        'wgEnableUploads' => self::getOptionValue( 'wgEnableUploads', $opts, true ),
-                       'wgStylePath' => '/skins',
-                       'wgStyleSheetPath' => '/skins',
-                       'wgSitename' => 'MediaWiki',
                        'wgLanguageCode' => $lang,
                        'wgDBprefix' => $this->db->getType() != 'oracle' ? 'unittest_' : 'ut_',
                        'wgRawHtml' => isset( $opts['rawhtml'] ),
-                       'wgLang' => null,
-                       'wgContLang' => null,
                        'wgNamespacesWithSubpages' => array( NS_MAIN => isset( $opts['subpage'] ) ),
                        'wgMaxTocLevel' => $maxtoclevel,
-                       'wgCapitalLinks' => true,
-                       'wgNoFollowLinks' => true,
-                       'wgNoFollowDomainExceptions' => array(),
-                       'wgThumbnailScriptPath' => false,
-                       'wgUseImageResize' => true,
                        'wgUseTeX' => isset( $opts['math'] ),
                        'wgMathDirectory' => $uploadDir . '/math',
-                       'wgLocaltimezone' => 'UTC',
-                       'wgAllowExternalImages' => true,
-                       'wgUseTidy' => false,
                        'wgDefaultLanguageVariant' => $variant,
-                       'wgVariantArticlePath' => false,
-                       'wgGroupPermissions' => array( '*' => array(
-                               'createaccount' => true,
-                               'read' => true,
-                               'edit' => true,
-                               'createpage' => true,
-                               'createtalk' => true,
-                       ) ),
-                       'wgNamespaceProtection' => array( NS_MEDIAWIKI => 'editinterface' ),
-                       'wgDefaultExternalStore' => array(),
-                       'wgForeignFileRepos' => array(),
                        'wgLinkHolderBatchSize' => $linkHolderBatchSize,
-                       'wgExperimentalHtmlIds' => false,
-                       'wgExternalLinkTarget' => false,
-                       'wgAlwaysUseTidy' => false,
-                       'wgHtml5' => true,
-                       'wgWellFormedXml' => true,
-                       'wgAllowMicrodataAttributes' => true,
-                       'wgAdaptiveMessageCache' => true,
-                       'wgUseDatabaseMessages' => true,
                );
 
                if ( $config ) {
@@ -349,6 +357,15 @@ class NewParserTest extends MediaWikiTestCase {
                /** @since 1.20 */
                wfRunHooks( 'ParserTestGlobals', array( &$settings ) );
 
+               $langObj = Language::factory( $lang );
+               $settings['wgContLang'] = $langObj;
+               $settings['wgLang'] = $langObj;
+
+               $context = new RequestContext();
+               $settings['wgOut'] = $context->getOutput();
+               $settings['wgUser'] = $context->getUser();
+               $settings['wgRequest'] = $context->getRequest();
+
                foreach ( $settings as $var => $val ) {
                        if ( array_key_exists( $var, $GLOBALS ) ) {
                                $this->savedGlobals[$var] = $GLOBALS[$var];
@@ -357,21 +374,9 @@ class NewParserTest extends MediaWikiTestCase {
                        $GLOBALS[$var] = $val;
                }
 
-               $langObj = Language::factory( $lang );
-               $GLOBALS['wgContLang'] = $langObj;
-               $context = new RequestContext();
-               $GLOBALS['wgLang'] = $context->getLanguage();
-
-               $GLOBALS['wgMemc'] = new EmptyBagOStuff;
-               $GLOBALS['wgOut'] = $context->getOutput();
-               $GLOBALS['wgUser'] = $context->getUser();
-
-               global $wgHooks;
-
-               $wgHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
-               $wgHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
-
                MagicWord::clearCache();
+
+               # The entries saved into RepoGroup cache with previous globals will be wrong.
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
 
@@ -381,9 +386,6 @@ class NewParserTest extends MediaWikiTestCase {
                # Publish the articles after we have the final language set
                $this->publishTestArticles();
 
-               # The entries saved into RepoGroup cache with previous globals will be wrong.
-               RepoGroup::destroySingleton();
-               FileBackendGroup::destroySingleton();
                MessageCache::destroyInstance();
 
                return $context;
@@ -408,6 +410,7 @@ class NewParserTest extends MediaWikiTestCase {
                // wfDebug( "Creating upload directory $dir\n" );
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
+
                        return $dir;
                }
 
@@ -429,6 +432,10 @@ class NewParserTest extends MediaWikiTestCase {
                $backend->store( array(
                        'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/3/3a/Foobar.jpg"
                ) );
+               $backend->prepare( array( 'dir' => "$base/local-public/e/ea" ) );
+               $backend->store( array(
+                       'src' => "$IP/skins/monobook/wiki.png", 'dst' => "$base/local-public/e/ea/Thumb.png"
+               ) );
                $backend->prepare( array( 'dir' => "$base/local-public/0/09" ) );
                $backend->store( array(
                        'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
@@ -445,9 +452,6 @@ class NewParserTest extends MediaWikiTestCase {
                foreach ( $this->savedGlobals as $var => $val ) {
                        $GLOBALS[$var] = $val;
                }
-
-               RepoGroup::destroySingleton();
-               LinkCache::singleton()->clear();
        }
 
        /**
@@ -458,6 +462,12 @@ class NewParserTest extends MediaWikiTestCase {
                        return;
                }
 
+               $backend = RepoGroup::singleton()->getLocalRepo()->getBackend();
+               if ( $backend instanceof MockFileBackend ) {
+                       # In memory backend, so dont bother cleaning them up.
+                       return;
+               }
+
                $base = $this->getBaseDir();
                // delete the files first, then the dirs.
                self::deleteFiles(
@@ -478,8 +488,9 @@ class NewParserTest extends MediaWikiTestCase {
                                "$base/local-thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
                                "$base/local-thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
 
+                               "$base/local-public/e/ea/Thumb.png",
+
                                "$base/local-public/0/09/Bad.jpg",
-                               "$base/local-thumb/0/09/Bad.jpg",
 
                                "$base/local-public/math/f/a/5/fa50b8b616463173474302ca3e63586b.png",
                        )
@@ -514,6 +525,7 @@ class NewParserTest extends MediaWikiTestCase {
                        global $wgParserTestFiles;
                        $this->file = $wgParserTestFiles[0];
                }
+
                return new TestFileIterator( $this->file, $this );
        }
 
@@ -537,7 +549,7 @@ class NewParserTest extends MediaWikiTestCase {
 
                if ( !$this->isWikitextNS( NS_MAIN ) ) {
                        // parser tests frequently assume that the main namespace contains wikitext.
-                       // @todo: When setting up pages, force the content model. Only skip if
+                       // @todo When setting up pages, force the content model. Only skip if
                        //        $wgtContentModelUseDB is false.
                        $this->markTestSkipped( "Main namespace does not support wikitext,"
                                . "skipping parser test: $desc" );
@@ -577,7 +589,7 @@ class NewParserTest extends MediaWikiTestCase {
                } elseif ( isset( $opts['comment'] ) ) {
                        $out = Linker::formatComment( $input, $title, $local );
                } elseif ( isset( $opts['preload'] ) ) {
-                       $out = $parser->getpreloadText( $input, $title, $options );
+                       $out = $parser->getPreloadText( $input, $title, $options );
                } else {
                        $output = $parser->parse( $input, $title, $options, true, true, 1337 );
                        $out = $output->getText();
@@ -688,7 +700,6 @@ class NewParserTest extends MediaWikiTestCase {
                        }
 
                        $id++;
-
                }
        }
 
@@ -882,6 +893,7 @@ class NewParserTest extends MediaWikiTestCase {
                                }
                        }
                }
+
                return $opts;
        }
 
@@ -893,6 +905,7 @@ class NewParserTest extends MediaWikiTestCase {
                if ( substr( $opt, 0, 2 ) == '[[' ) {
                        return substr( $opt, 2, -2 );
                }
+
                return $opt;
        }
 
index 5c1a268..cacbb85 100644 (file)
@@ -28,5 +28,21 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $text );
        }
 
+       public function testCallParserFunction() {
+               global $wgParser;
+
+               // Normal parses test passing PPNodes. Test passing an array.
+               $title = Title::newFromText( str_replace( '::', '__', __METHOD__ ) );
+               $wgParser->startExternalParse( $title, new ParserOptions(), Parser::OT_HTML );
+               $frame = $wgParser->getPreprocessor()->newFrame();
+               $ret = $wgParser->callParserFunction( $frame, '#tag',
+                       array( 'pre', 'foo', 'style' => 'margin-left: 1.6em' )
+               );
+               $ret['text'] = $wgParser->mStripState->unstripBoth( $ret['text'] );
+               $this->assertSame( array(
+                       'found' => true,
+                       'text' => '<pre style="margin-left: 1.6em">foo</pre>',
+               ), $ret, 'callParserFunction works for {{#tag:pre|foo|style=margin-left: 1.6em}}' );
+       }
        // TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
 }
index e16b407..c609164 100644 (file)
@@ -68,5 +68,4 @@ class ParserPreloadTest extends MediaWikiTestCase {
                        $msg
                );
        }
-
 }
index c51a1dc..fb13118 100644 (file)
@@ -18,7 +18,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                return array( 'gallery', 'display map' /* Used by Maps, see r80025 CR */, '/foo' );
        }
 
-       function provideCases() {
+       public static function provideCases() {
                return array(
                        array( "Foo", "<root>Foo</root>" ),
                        array( "<!-- Foo -->", "<root><comment>&lt;!-- Foo --&gt;</comment></root>" ),
@@ -148,7 +148,7 @@ class PreprocessorTest extends MediaWikiTestCase {
        /**
         * These are more complex test cases taken out of wiki articles.
         */
-       function provideFiles() {
+       public static function provideFiles() {
                return array(
                        array( "QuoteQuran" ), # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC-BY-SA by Striver
                        array( "Factorial" ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC-BY-SA by Polonium
@@ -180,7 +180,7 @@ class PreprocessorTest extends MediaWikiTestCase {
        /**
         * Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
         */
-       function provideHeadings() {
+       public static function provideHeadings() {
                return array( /* These should become headings: */
                        array( "== h ==<!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment></h></root>" ),
                        array( "== h ==         <!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==       <comment>&lt;!--c1--&gt;</comment></h></root>" ),
index d643264..ed60079 100644 (file)
@@ -20,7 +20,6 @@ class TagHookTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideValidNames
-        * @group Database
         */
        function testTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
@@ -48,7 +47,6 @@ class TagHookTest extends MediaWikiTestCase {
 
        /**
         * @dataProvider provideValidNames
-        * @group Database
         */
        function testFunctionTagHooks( $tag ) {
                global $wgParserConf, $wgContLang;
index 6abca6d..8957a2f 100644 (file)
@@ -45,7 +45,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                }
 
                if ( !$this->isWikitextNS( NS_MAIN ) ) {
-                       //@todo: cover the case of non-wikitext content in the main namespace
+                       // @todo cover the case of non-wikitext content in the main namespace
                        return;
                }
 
@@ -87,6 +87,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                # sort them numerically so we will compare simply that we received
                # the expected matches.
                sort( $matches );
+
                return $matches;
        }
 
@@ -172,5 +173,4 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        $this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
                        "Title power search failed" );
        }
-
 }
index 7d867bc..d19cdd0 100644 (file)
@@ -28,6 +28,7 @@ class SearchUpdateTest extends MediaWikiTestCase {
        function update( $text, $title = 'Test', $id = 1 ) {
                $u = new SearchUpdate( $id, $title, $text );
                $u->doUpdate();
+
                return array( MockSearch::$title, MockSearch::$text );
        }
 
index 0cecdee..e0092a5 100644 (file)
@@ -62,7 +62,7 @@ class MediaWikiSiteTest extends SiteTest {
                $this->assertEquals( $expected, $site->getFileUrl( $pathArgument ) );
        }
 
-       public function provideGetPageUrl() {
+       public static function provideGetPageUrl() {
                return array(
                        // path, page, expected substring
                        array( 'http://acme.test/wiki/$1', 'Berlin', '/wiki/Berlin' ),
@@ -85,5 +85,4 @@ class MediaWikiSiteTest extends SiteTest {
                $this->assertContains( $path, $site->getPageUrl() );
                $this->assertContains( $expected, $site->getPageUrl( $page ) );
        }
-
 }
index c329839..bd2ae07 100644 (file)
@@ -186,5 +186,4 @@ class SiteListTest extends MediaWikiTestCase {
                        $this->assertTrue( $copy->hasInternalId( $site->getInternalId() ) );
                }
        }
-
 }
index cf4ce94..cf652e9 100644 (file)
@@ -119,5 +119,4 @@ class SiteSQLStoreTest extends MediaWikiTestCase {
                $sites = $store->getSites();
                $this->assertEquals( 0, $sites->count() );
        }
-
 }
index d20e2a5..b453e74 100644 (file)
@@ -201,7 +201,7 @@ class SiteTest extends MediaWikiTestCase {
                $this->assertEquals( '', $site->getProtocol() );
        }
 
-       public function provideGetPageUrl() {
+       public static function provideGetPageUrl() {
                //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.
@@ -263,5 +263,4 @@ class SiteTest extends MediaWikiTestCase {
 
                $this->assertEquals( $serialization, serialize( $newInstance ) );
        }
-
 }
index a5656a7..f224b7d 100644 (file)
@@ -97,5 +97,4 @@ class TestSites {
                $sitesTable->clear();
                $sitesTable->saveSites( TestSites::getSites() );
        }
-
 }
diff --git a/tests/phpunit/includes/specials/SpecialPreferencesTest.php b/tests/phpunit/includes/specials/SpecialPreferencesTest.php
new file mode 100644 (file)
index 0000000..c7a4828
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Test class for SpecialPreferences class.
+ *
+ * Copyright © 2013, Antoine Musso
+ * Copyright © 2013, Wikimedia Foundation Inc.
+ *
+ */
+
+class SpecialPreferencesTest extends MediaWikiTestCase {
+
+       /**
+        * Make sure a nickname which is longer than $wgMaxSigChars
+        * is not throwing a fatal error.
+        *
+        * Test specifications by Alexandre "ialex" Emsenhuber.
+        */
+       function testBug41337() {
+
+               // Set a low limit
+               $this->setMwGlobals( 'wgMaxSigChars', 2 );
+
+               $user = $this->getMock( 'User' );
+               $user->expects( $this->any() )
+                       ->method( 'isAnon' )
+                       ->will( $this->returnValue( false ) );
+
+               # Yeah foreach requires an array, not NULL =(
+               $user->expects( $this->any() )
+                       ->method( 'getEffectiveGroups' )
+                       ->will( $this->returnValue( array() ) );
+
+               # The mocked user has a long nickname
+               $user->expects( $this->any() )
+                       ->method( 'getOption' )
+                       ->will( $this->returnValueMap( array(
+                               array( 'nickname', null, false, 'superlongnickname' ),
+                       )
+                       ) );
+
+               # Validate the mock (FIXME should probably be removed)
+               $this->assertFalse( $user->isAnon() );
+               $this->assertEquals( array(),
+                       $user->getEffectiveGroups() );
+               $this->assertEquals( 'superlongnickname',
+                       $user->getOption( 'nickname' ) );
+
+               # Forge a request to call the special page
+               $context = new RequestContext();
+               $context->setRequest( new FauxRequest() );
+               $context->setUser( $user );
+               $context->setTitle( Title::newFromText( 'Test' ) );
+
+               # Do the call, should not spurt a fatal error.
+               $special = new SpecialPreferences();
+               $special->setContext( $context );
+               $special->execute( array() );
+       }
+
+}
index add830b..436eb2e 100644 (file)
@@ -42,7 +42,6 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        /** return false if condition begin with 'rc_timestamp ' */
        private static function filterOutRcTimestampCondition( $var ) {
                return ( false === strpos( $var, 'rc_timestamp ' ) );
-
        }
 
        public function testRcNsFilter() {
@@ -123,5 +122,4 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                        array( NS_TALK, NS_MAIN ),
                );
        }
-
 }
index f5ef0fb..c737f05 100644 (file)
@@ -53,10 +53,9 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        )
                        , $message
                );
-
        }
 
-       function provideSearchOptionsTests() {
+       public static function provideSearchOptionsTests() {
                $defaultNS = SearchEngine::defaultNamespaces();
                $EMPTY_REQUEST = array();
                $NO_USER_PREF = null;
@@ -105,6 +104,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
                foreach ( $opt as $name => $value ) {
                        $u->setOption( $name, $value );
                }
+
                return $u;
        }
 
@@ -135,6 +135,5 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        $pageTitle,
                        "Search term '{$term}' should not be expanded in Special:Search <title>"
                );
-
        }
 }
diff --git a/tests/phpunit/includes/upload/UploadBaseTest.php b/tests/phpunit/includes/upload/UploadBaseTest.php
new file mode 100644 (file)
index 0000000..298420b
--- /dev/null
@@ -0,0 +1,144 @@
+<?php
+/**
+ * @group Upload
+ */
+class UploadBaseTest extends MediaWikiTestCase {
+       protected $upload;
+
+
+       protected function setUp() {
+               global $wgHooks;
+               parent::setUp();
+
+               $this->upload = new UploadTestHandler;
+               $this->hooks = $wgHooks;
+               $wgHooks['InterwikiLoadPrefix'][] = function ( $prefix, &$data ) {
+                       return false;
+               };
+       }
+
+       protected function tearDown() {
+               global $wgHooks;
+               $wgHooks = $this->hooks;
+
+               parent::tearDown();
+       }
+
+
+       /**
+        * First checks the return code
+        * of UploadBase::getTitle() and then the actual returned title
+        *
+        * @dataProvider provideTestTitleValidation
+        */
+       public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
+               /* Check the result code */
+               $this->assertEquals( $code,
+                       $this->upload->testTitleValidation( $srcFilename ),
+                       "$msg code" );
+
+               /* If we expect a valid title, check the title itself. */
+               if ( $code == UploadBase::OK ) {
+                       $this->assertEquals( $dstFilename,
+                               $this->upload->getTitle()->getText(),
+                               "$msg text" );
+               }
+       }
+
+       /**
+        * Test various forms of valid and invalid titles that can be supplied.
+        */
+       public static function provideTestTitleValidation() {
+               return array(
+                       /* Test a valid title */
+                       array( 'ValidTitle.jpg', 'ValidTitle.jpg', UploadBase::OK,
+                               'upload valid title' ),
+                       /* A title with a slash */
+                       array( 'A/B.jpg', 'B.jpg', UploadBase::OK,
+                               'upload title with slash' ),
+                       /* A title with illegal char */
+                       array( 'A:B.jpg', 'A-B.jpg', UploadBase::OK,
+                               'upload title with colon' ),
+                       /* Stripping leading File: prefix */
+                       array( 'File:C.jpg', 'C.jpg', UploadBase::OK,
+                               'upload title with File prefix' ),
+                       /* Test illegal suggested title (r94601) */
+                       array( '%281%29.JPG', null, UploadBase::ILLEGAL_FILENAME,
+                               'illegal title for upload' ),
+                       /* A title without extension */
+                       array( 'A', null, UploadBase::FILETYPE_MISSING,
+                               'upload title without extension' ),
+                       /* A title with no basename */
+                       array( '.jpg', null, UploadBase::MIN_LENGTH_PARTNAME,
+                               'upload title without basename' ),
+                       /* A title that is longer than 255 bytes */
+                       array( str_repeat( 'a', 255 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
+                               'upload title longer than 255 bytes' ),
+                       /* A title that is longer than 240 bytes */
+                       array( str_repeat( 'a', 240 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
+                               'upload title longer than 240 bytes' ),
+               );
+       }
+
+       /**
+        * Test the upload verification functions
+        */
+       public function testVerifyUpload() {
+               /* Setup with zero file size */
+               $this->upload->initializePathInfo( '', '', 0 );
+               $result = $this->upload->verifyUpload();
+               $this->assertEquals( UploadBase::EMPTY_FILE,
+                       $result['status'],
+                       'upload empty file' );
+       }
+
+       // Helper used to create an empty file of size $size.
+       private function createFileOfSize( $size ) {
+               $filename = tempnam( wfTempDir(), "mwuploadtest" );
+
+               $fh = fopen( $filename, 'w' );
+               ftruncate( $fh, $size );
+               fclose( $fh );
+
+               return $filename;
+       }
+
+       /**
+        * test uploading a 100 bytes file with $wgMaxUploadSize = 100
+        *
+        * This method should be abstracted so we can test different settings.
+        */
+
+       public function testMaxUploadSize() {
+               global $wgMaxUploadSize;
+               $savedGlobal = $wgMaxUploadSize; // save global
+               global $wgFileExtensions;
+               $wgFileExtensions[] = 'txt';
+
+               $wgMaxUploadSize = 100;
+
+               $filename = $this->createFileOfSize( $wgMaxUploadSize );
+               $this->upload->initializePathInfo( basename( $filename ) . '.txt', $filename, 100 );
+               $result = $this->upload->verifyUpload();
+               unlink( $filename );
+
+               $this->assertEquals(
+                       array( 'status' => UploadBase::OK ), $result );
+
+               $wgMaxUploadSize = $savedGlobal; // restore global
+       }
+}
+
+class UploadTestHandler extends UploadBase {
+       public function initializeFromRequest( &$request ) {
+       }
+
+       public function testTitleValidation( $name ) {
+               $this->mTitle = false;
+               $this->mDesiredDestName = $name;
+               $this->mTitleError = UploadBase::OK;
+               $this->getTitle();
+
+               return $this->mTitleError;
+       }
+}
index 4d2d8ce..a75fba6 100644 (file)
@@ -6,14 +6,14 @@
  * @group Database
  */
 class UploadFromUrlTest extends ApiTestCase {
-
        protected function setUp() {
-               global $wgEnableUploads, $wgAllowCopyUploads, $wgAllowAsyncCopyUploads;
                parent::setUp();
 
-               $wgEnableUploads = true;
-               $wgAllowCopyUploads = true;
-               $wgAllowAsyncCopyUploads = true;
+               $this->setMwGlobals( array(
+                       'wgEnableUploads' => true,
+                       'wgAllowCopyUploads' => true,
+                       'wgAllowAsyncCopyUploads' => true,
+               ) );
                wfSetupSession();
 
                if ( wfLocalFile( 'UploadFromUrlTest.png' )->exists() ) {
@@ -30,6 +30,7 @@ class UploadFromUrlTest extends ApiTestCase {
                $module->execute();
 
                wfSetupSession( $sessionId );
+
                return array( $module->getResultData(), $req );
        }
 
@@ -174,7 +175,6 @@ class UploadFromUrlTest extends ApiTestCase {
 
                $this->user->addGroup( 'users' );
 
-
                $data = $this->doAsyncUpload( $token );
 
                $this->assertEquals( $data[0]['upload']['result'], 'Warning' );
@@ -235,7 +235,7 @@ class UploadFromUrlTest extends ApiTestCase {
 
                $this->assertFalse( (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ), 'User talk does not exist' );
 
-               $data = $this->doApiRequest( array(
+               $this->doApiRequest( array(
                        'action' => 'upload',
                        'filename' => 'UploadFromUrlTest.png',
                        'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
@@ -259,7 +259,7 @@ class UploadFromUrlTest extends ApiTestCase {
 
                $exception = false;
                try {
-                       $data = $this->doApiRequest( array(
+                       $this->doApiRequest( array(
                                'action' => 'upload',
                                'filename' => 'UploadFromUrlTest.png',
                                'url' => 'http://bits.wikimedia.org/skins-1.5/common/images/poweredby_mediawiki_88x31.png',
@@ -277,7 +277,6 @@ class UploadFromUrlTest extends ApiTestCase {
                $this->assertFalse( $job );
 
                return;
-
                /*
                // Broken until using leavemessage with ignorewarnings is supported
                $job->run();
@@ -330,7 +329,6 @@ class UploadFromUrlTest extends ApiTestCase {
                return $data;
        }
 
-
        /**
         *
         */
index 8fcaa21..7a0fea4 100644 (file)
@@ -44,8 +44,7 @@ class UploadStashTest extends MediaWikiTestCase {
        }
 
        public function testBug29408() {
-               global $wgUser;
-               $wgUser = self::$users['uploader']->user;
+               $this->setMwGlobals( 'wgUser', self::$users['uploader']->user );
 
                $repo = RepoGroup::singleton()->getLocalRepo();
                $stash = new UploadStash( $repo );
diff --git a/tests/phpunit/includes/upload/UploadTest.php b/tests/phpunit/includes/upload/UploadTest.php
deleted file mode 100644 (file)
index b809d32..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-<?php
-/**
- * @group Upload
- */
-class UploadTest extends MediaWikiTestCase {
-       protected $upload;
-
-
-       protected function setUp() {
-               global $wgHooks;
-               parent::setUp();
-
-               $this->upload = new UploadTestHandler;
-               $this->hooks = $wgHooks;
-               $wgHooks['InterwikiLoadPrefix'][] = function ( $prefix, &$data ) {
-                       return false;
-               };
-       }
-
-       protected function tearDown() {
-               global $wgHooks;
-               $wgHooks = $this->hooks;
-
-               parent::tearDown();
-       }
-
-
-       /**
-        * First checks the return code
-        * of UploadBase::getTitle() and then the actual returned title
-        *
-        * @dataProvider provideTestTitleValidation
-        */
-       public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
-               /* Check the result code */
-               $this->assertEquals( $code,
-                       $this->upload->testTitleValidation( $srcFilename ),
-                       "$msg code" );
-
-               /* If we expect a valid title, check the title itself. */
-               if ( $code == UploadBase::OK ) {
-                       $this->assertEquals( $dstFilename,
-                               $this->upload->getTitle()->getText(),
-                               "$msg text" );
-               }
-       }
-
-       /**
-        * Test various forms of valid and invalid titles that can be supplied.
-        */
-       public static function provideTestTitleValidation() {
-               return array(
-                       /* Test a valid title */
-                       array( 'ValidTitle.jpg', 'ValidTitle.jpg', UploadBase::OK,
-                               'upload valid title' ),
-                       /* A title with a slash */
-                       array( 'A/B.jpg', 'B.jpg', UploadBase::OK,
-                               'upload title with slash' ),
-                       /* A title with illegal char */
-                       array( 'A:B.jpg', 'A-B.jpg', UploadBase::OK,
-                               'upload title with colon' ),
-                       /* Stripping leading File: prefix */
-                       array( 'File:C.jpg', 'C.jpg', UploadBase::OK,
-                               'upload title with File prefix' ),
-                       /* Test illegal suggested title (r94601) */
-                       array( '%281%29.JPG', null, UploadBase::ILLEGAL_FILENAME,
-                               'illegal title for upload' ),
-                       /* A title without extension */
-                       array( 'A', null, UploadBase::FILETYPE_MISSING,
-                               'upload title without extension' ),
-                       /* A title with no basename */
-                       array( '.jpg', null, UploadBase::MIN_LENGTH_PARTNAME,
-                               'upload title without basename' ),
-                       /* A title that is longer than 255 bytes */
-                       array( str_repeat( 'a', 255 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
-                               'upload title longer than 255 bytes' ),
-                       /* A title that is longer than 240 bytes */
-                       array( str_repeat( 'a', 240 ) . '.jpg', null, UploadBase::FILENAME_TOO_LONG,
-                               'upload title longer than 240 bytes' ),
-               );
-       }
-
-       /**
-        * Test the upload verification functions
-        */
-       public function testVerifyUpload() {
-               /* Setup with zero file size */
-               $this->upload->initializePathInfo( '', '', 0 );
-               $result = $this->upload->verifyUpload();
-               $this->assertEquals( UploadBase::EMPTY_FILE,
-                       $result['status'],
-                       'upload empty file' );
-       }
-
-       // Helper used to create an empty file of size $size.
-       private function createFileOfSize( $size ) {
-               $filename = tempnam( wfTempDir(), "mwuploadtest" );
-
-               $fh = fopen( $filename, 'w' );
-               ftruncate( $fh, $size );
-               fclose( $fh );
-
-               return $filename;
-       }
-
-       /**
-        * test uploading a 100 bytes file with $wgMaxUploadSize = 100
-        *
-        * This method should be abstracted so we can test different settings.
-        */
-
-       public function testMaxUploadSize() {
-               global $wgMaxUploadSize;
-               $savedGlobal = $wgMaxUploadSize; // save global
-               global $wgFileExtensions;
-               $wgFileExtensions[] = 'txt';
-
-               $wgMaxUploadSize = 100;
-
-               $filename = $this->createFileOfSize( $wgMaxUploadSize );
-               $this->upload->initializePathInfo( basename( $filename ) . '.txt', $filename, 100 );
-               $result = $this->upload->verifyUpload();
-               unlink( $filename );
-
-               $this->assertEquals(
-                       array( 'status' => UploadBase::OK ), $result );
-
-               $wgMaxUploadSize = $savedGlobal; // restore global
-       }
-}
-
-class UploadTestHandler extends UploadBase {
-       public function initializeFromRequest( &$request ) {}
-
-       public function testTitleValidation( $name ) {
-               $this->mTitle = false;
-               $this->mDesiredDestName = $name;
-               $this->mTitleError = UploadBase::OK;
-               $this->getTitle();
-               return $this->mTitleError;
-       }
-
-
-}
index 3601274..1f60293 100755 (executable)
@@ -8,7 +8,7 @@ has_binary () {
 }
 
 if [ `id -u` -ne 0 ]; then
-    echo '*** ERROR' Must be root to run
+    echo '*** ERROR: Must be root to run'
     exit 1
 fi
 
index 9723e1e..fdf3347 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/LanguageAm.php */
 class LanguageAmTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
index 523ee7f..a623912 100644 (file)
@@ -6,7 +6,6 @@
 
 /** Tests for MediaWiki languages/LanguageAr.php */
 class LanguageArTest extends LanguageClassesTestCase {
-
        function testFormatNum() {
                $this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->getLang()->formatNum( '1234567' ) );
                $this->assertEquals( '-١٢٫٨٩', $this->getLang()->formatNum( -12.89 ) );
@@ -20,7 +19,7 @@ class LanguageArTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) );
        }
 
-       function providerSprintfDate() {
+       public static function providerSprintfDate() {
                return array(
                        array(
                                'xg "vs" g',
@@ -51,7 +50,12 @@ class LanguageArTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
index 0144941..a88356a 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/LanguageBe.php */
 class LanguageBeTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
index 5b246d8..3fcc0e5 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 class LanguageBe_taraskTest extends LanguageClassesTestCase {
-
        /**
         * Make sure the language code we are given is indeed
         * be-tarask. This is to ensure LanguageClassesTestCase
@@ -33,13 +32,18 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
                $this->assertEquals( '1234', $this->getLang()->commafy( '1234' ) );
        }
 
-       /** @dataProvider providePluralFourForms */
-       function testPluralFourForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralFourForms() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
@@ -57,17 +61,16 @@ class LanguageBe_taraskTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'several' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
-                       array( 'several', 11 ),
-                       array( 'several', 91 ),
-                       array( 'several', 121 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
                );
        }
-
 }
index c364917..3cdde36 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/LanguageBho.php */
 class LanguageBhoTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
@@ -22,5 +26,4 @@ class LanguageBhoTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 76d0070..83a0ef6 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/LanguageBs.php */
 class LanguageBsTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'many', 0 ),
                        array( 'one', 1 ),
@@ -29,5 +33,4 @@ class LanguageBsTest extends LanguageClassesTestCase {
                        array( 'many', 200 ),
                );
        }
-
 }
index 6659dad..4274335 100644 (file)
@@ -96,5 +96,4 @@ abstract class LanguageClassesTestCase extends MediaWikiTestCase {
                unset( $this->languageObject );
                parent::tearDown();
        }
-
 }
index 884a129..93ee0f0 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/Languagecs.php */
 class LanguageCsTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -28,5 +32,4 @@ class LanguageCsTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index e2394b3..562d6d9 100644 (file)
@@ -7,27 +7,30 @@
 
 /** Tests for MediaWiki languages/LanguageCu.php */
 class LanguageCuTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'few', 'many', 'other' );
+               $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
-                       array( 'few', 2 ),
-                       array( 'many', 3 ),
-                       array( 'many', 4 ),
+                       array( 'two', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
                        array( 'other', 5 ),
                        array( 'one', 11 ),
                        array( 'other', 20 ),
-                       array( 'few', 22 ),
-                       array( 'many', 223 ),
+                       array( 'two', 22 ),
+                       array( 'few', 223 ),
                        array( 'other', 200 ),
                );
        }
-
 }
index 2a7f4a9..435da4f 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageCy.php */
 class LanguageCyTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'zero', 'one', 'two', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
@@ -30,5 +34,4 @@ class LanguageCyTest extends LanguageClassesTestCase {
                        array( 'other', 200.00 ),
                );
        }
-
 }
index 285ce64..be42124 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageDsb.php */
 class LanguageDsbTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -28,5 +32,4 @@ class LanguageDsbTest extends LanguageClassesTestCase {
                        array( 'other', 555 ),
                );
        }
-
 }
index faf0de5..4f96b48 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageFr.php */
 class LanguageFrTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
@@ -22,5 +26,4 @@ class LanguageFrTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 2dbb088..73c4800 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGa.php */
 class LanguageGaTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -22,5 +26,4 @@ class LanguageGaTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 5de1e9d..edf8e50 100644 (file)
@@ -7,15 +7,14 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGd.php */
 class LanguageGdTest extends LanguageClassesTestCase {
-
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
-               return array (
+       public static function providerPlural() {
+               return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
@@ -33,16 +32,16 @@ class LanguageGdTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralExplicit() {
-               return array (
-                               array( 'other', 0 ),
-                               array( 'one', 1 ),
-                               array( 'two', 2 ),
-                               array( 'Form11', 11 ),
-                               array( 'Form12', 12 ),
-                               array( 'few', 3 ),
-                               array( 'few', 19 ),
-                               array( 'other', 200 ),
+       public static function providerPluralExplicit() {
+               return array(
+                       array( 'other', 0 ),
+                       array( 'one', 1 ),
+                       array( 'two', 2 ),
+                       array( 'Form11', 11 ),
+                       array( 'Form12', 12 ),
+                       array( 'few', 3 ),
+                       array( 'few', 19 ),
+                       array( 'other', 200 ),
                );
        }
 }
index 4126e07..71c0160 100644 (file)
@@ -7,15 +7,21 @@
 
 /** Tests for MediaWiki languages/classes/LanguageGv.php */
 class LanguageGvTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                // This is not compatible with CLDR plural rules http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#gv
+               // What does this mean? Is there a hard-coded override for gv somewhere? -Ryan Kaldari 2013-01-28
                $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->markTestSkipped( "This test won't work since convertPlural for gv doesn't seem to actually follow our plural rules." );
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'Form 4', 0 ),
                        array( 'Form 2', 1 ),
@@ -28,5 +34,4 @@ class LanguageGvTest extends LanguageClassesTestCase {
                        array( 'Form 4', 50 ),
                );
        }
-
 }
index 6de88e5..a8524bb 100644 (file)
 
 /** Tests for MediaWiki languages/classes/LanguageHe.php */
 class LanguageHeTest extends LanguageClassesTestCase {
+       /*
+       The most common usage for the plural forms is two forms,
+       for singular and plural. In this case, the second form
+       is technically dual, but in practice it's used as plural.
+       In some cases, usually with expressions of time, three forms
+       are needed - singular, dual and plural.
+       CLDR also specifies a fourth form for multiples of 10,
+       which is very rare. It also has a mistake, because
+       the number 10 itself is supposed to be just plural,
+       so currently it's overridden in MediaWiki.
+       */
 
-       /** @dataProvider providerPluralDual */
-       function testPluralDual( $result, $value ) {
+       /** @dataProvider provideTwoPluralForms */
+       function testTwoPluralForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /** @dataProvider provideThreePluralForms */
+       function testThreePluralForms( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralDual() {
+       /** @dataProvider provideFourPluralForms */
+       function testFourPluralForms( $result, $value ) {
+               $forms = array( 'one', 'two', 'many', 'other' );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       /** @dataProvider provideFourPluralForms */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function provideTwoPluralForms() {
                return array(
-                       array( 'other', 0 ), // Zero -> plural
+                       array( 'other', 0 ), // Zero - plural
                        array( 'one', 1 ), // Singular
-                       array( 'two', 2 ), // Dual
-                       array( 'other', 3 ), // Plural
+                       array( 'other', 2 ), // No third form provided, use it as plural
+                       array( 'other', 3 ), // Plural - other
+                       array( 'other', 10 ), // No fourth form provided, use it as plural
+                       array( 'other', 20 ), // No fourth form provided, use it as plural
                );
        }
 
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
-               $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       public static function provideThreePluralForms() {
+               return array(
+                       array( 'other', 0 ), // Zero - plural
+                       array( 'one', 1 ), // Singular
+                       array( 'two', 2 ), // Dual
+                       array( 'other', 3 ), // Plural - other
+                       array( 'other', 10 ), // No fourth form provided, use it as plural
+                       array( 'other', 20 ), // No fourth form provided, use it as plural
+               );
        }
 
-       function providerPlural() {
+       public static function provideFourPluralForms() {
                return array(
-                       array( 'other', 0 ), // Zero -> plural
+                       array( 'other', 0 ), // Zero - plural
                        array( 'one', 1 ), // Singular
-                       array( 'other', 2 ), // Plural, no dual provided
-                       array( 'other', 3 ), // Plural
+                       array( 'two', 2 ), // Dual
+                       array( 'other', 3 ), // Plural - other
+                       array( 'other', 10 ), // 10 is supposed to be plural (other), not "many"
+                       array( 'many', 20 ), // Fourth form provided - rare, but supported by CLDR
                );
        }
 
-       /** @dataProvider providerGrammar */
+       /** @dataProvider provideGrammar */
        function testGrammar( $result, $word, $case ) {
                $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
        }
 
        // The comments in the beginning of the line help avoid RTL problems
        // with text editors.
-       function providerGrammar() {
+       public static function provideGrammar() {
                return array(
                        array(
-                               /* result */ 'וויקיפדיה',
-                               /* word   */ 'ויקיפדיה',
-                               /* case   */ 'תחילית',
+                               /* result */'וויקיפדיה',
+                               /* word   */'ויקיפדיה',
+                               /* case   */'תחילית',
                        ),
                        array(
-                               /* result */ 'וולפגנג',
-                               /* word   */ 'וולפגנג',
-                               /* case   */ 'prefixed',
+                               /* result */'וולפגנג',
+                               /* word   */'וולפגנג',
+                               /* case   */'prefixed',
                        ),
                        array(
-                               /* result */ 'קובץ',
-                               /* word   */ 'הקובץ',
-                               /* case   */ 'תחילית',
+                               /* result */'קובץ',
+                               /* word   */'הקובץ',
+                               /* case   */'תחילית',
                        ),
                        array(
-                               /* result */ '־Wikipedia',
-                               /* word   */ 'Wikipedia',
-                               /* case   */ 'תחילית',
+                               /* result */'־Wikipedia',
+                               /* word   */'Wikipedia',
+                               /* case   */'תחילית',
                        ),
                        array(
-                               /* result */ '־1995',
-                               /* word   */ '1995',
-                               /* case   */ 'תחילית',
+                               /* result */'־1995',
+                               /* word   */'1995',
+                               /* case   */'תחילית',
                        ),
                );
        }
index 86d6af5..9502d6a 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/LanguageHi.php */
 class LanguageHiTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
@@ -22,5 +26,4 @@ class LanguageHiTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 9dce4ea..7516bac 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHr.php */
 class LanguageHrTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'many', 0 ),
                        array( 'one', 1 ),
@@ -29,5 +33,4 @@ class LanguageHrTest extends LanguageClassesTestCase {
                        array( 'many', 200 ),
                );
        }
-
 }
index bec7d81..bae4542 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageHsb.php */
 class LanguageHsbTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -28,5 +32,4 @@ class LanguageHsbTest extends LanguageClassesTestCase {
                        array( 'other', 555 ),
                );
        }
-
 }
index 23d8e0c..40ae108 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/LanguageHu.php */
 class LanguageHuTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -22,5 +26,4 @@ class LanguageHuTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 7088d37..1abc375 100644 (file)
@@ -7,14 +7,19 @@
 
 /** Tests for MediaWiki languages/LanguageHy.php */
 class LanguageHyTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               // This fails for 0, but I'm not sure why. Some voodoo going on here.
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -22,5 +27,4 @@ class LanguageHyTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 9b4a53a..291c59b 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageKsh.php */
 class LanguageKshTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other', 'zero' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
@@ -22,5 +26,4 @@ class LanguageKshTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 669d8b0..2fa40b5 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageLn.php */
 class LanguageLnTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
@@ -22,5 +26,4 @@ class LanguageLnTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index 9d6428b..e5a10b5 100644 (file)
@@ -7,20 +7,18 @@
 
 /** Tests for MediaWiki languages/LanguageLt.php */
 class LanguageLtTest extends LanguageClassesTestCase {
-
-       /** @dataProvider provideOneFewOtherCases */
-       function testOneFewOtherPlural( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       /** @dataProvider provideOneFewCases */
-       function testOneFewPlural( $result, $value ) {
-               $forms = array( 'one', 'few' );
-               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
        }
 
-       function provideOneFewOtherCases() {
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -36,10 +34,21 @@ class LanguageLtTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideOneFewCases() {
+       /** @dataProvider providePluralTwoForms */
+       function testOneFewPlural( $result, $value ) {
+               $forms = array( 'one', 'other' );
+               // This fails for 21, but not sure why.
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
+       }
+
+       public static function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
-                       array( 'few', 15 ),
+                       array( 'other', 2 ),
+                       array( 'other', 15 ),
+                       array( 'other', 20 ),
+                       array( 'one', 21 ),
+                       array( 'other', 22 ),
                );
        }
 }
index bd0c759..368ac8c 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageLv.php */
 class LanguageLvTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'zero', 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'zero', 0 ),
                        array( 'one', 1 ),
@@ -27,5 +31,4 @@ class LanguageLvTest extends LanguageClassesTestCase {
                        array( 'other', 200 ),
                );
        }
-
 }
index c1e516b..f4eb99a 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMg.php */
 class LanguageMgTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
@@ -23,5 +27,4 @@ class LanguageMgTest extends LanguageClassesTestCase {
                        array( 'other', 123.3434 ),
                );
        }
-
 }
index 5c241ba..0ae533d 100644 (file)
@@ -7,27 +7,28 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMk.php */
 class LanguageMkTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
 
-       function providerPlural() {
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'other', 11 ),
                        array( 'one', 21 ),
-                       array( 'other', 411 ),
+                       array( 'one', 411 ),
                        array( 'other', 12.345 ),
                        array( 'other', 20 ),
                        array( 'one', 31 ),
                        array( 'other', 200 ),
                );
        }
-
-
 }
index 396114d..057ca67 100644 (file)
@@ -14,7 +14,7 @@ class LanguageMlTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->formatNum( $value ) );
        }
 
-       function providerFormatNum() {
+       public static function providerFormatNum() {
                return array(
                        array( '12,34,567', '1234567' ),
                        array( '12,345', '12345' ),
index f7da1cd..3b162b7 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMo.php */
 class LanguageMoTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'few', 0 ),
                        array( 'one', 1 ),
index f2b881e..12af2e8 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageMt.php */
 class LanguageMtTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPluralAllForms */
-       function testPluralAllForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralAllForms() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'few', 0 ),
                        array( 'one', 1 ),
@@ -37,28 +41,28 @@ class LanguageMtTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralTwoForms() {
+       public static function providerPluralTwoForms() {
                return array(
-                       array( 'many', 0 ),
+                       array( 'other', 0 ),
                        array( 'one', 1 ),
-                       array( 'many', 2 ),
-                       array( 'many', 10 ),
-                       array( 'many', 11 ),
-                       array( 'many', 19 ),
-                       array( 'many', 20 ),
-                       array( 'many', 99 ),
-                       array( 'many', 100 ),
-                       array( 'many', 101 ),
-                       array( 'many', 102 ),
-                       array( 'many', 110 ),
-                       array( 'many', 111 ),
-                       array( 'many', 119 ),
-                       array( 'many', 120 ),
-                       array( 'many', 201 ),
+                       array( 'other', 2 ),
+                       array( 'other', 10 ),
+                       array( 'other', 11 ),
+                       array( 'other', 19 ),
+                       array( 'other', 20 ),
+                       array( 'other', 99 ),
+                       array( 'other', 100 ),
+                       array( 'other', 101 ),
+                       array( 'other', 102 ),
+                       array( 'other', 110 ),
+                       array( 'other', 111 ),
+                       array( 'other', 119 ),
+                       array( 'other', 120 ),
+                       array( 'other', 201 ),
                );
        }
 }
index 9d80d13..1d62567 100644 (file)
@@ -7,18 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageNso.php */
 class LanguageNsoTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
-                       array( 'many', 2 ),
+                       array( 'other', 2 ),
                );
        }
 }
index 1e36097..9ec2a88 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguagePl.php */
 class LanguagePlTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPluralFourForms */
-       function testPluralFourForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralFourForms() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'many', 0 ),
                        array( 'one', 1 ),
@@ -35,30 +39,30 @@ class LanguagePlTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+       /** @dataProvider providerPluralTwoForms */
+       function testPluralTwoForms( $result, $value ) {
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       public static function providerPluralTwoForms() {
                return array(
-                       array( 'many', 0 ),
+                       array( 'other', 0 ),
                        array( 'one', 1 ),
-                       array( 'many', 2 ),
-                       array( 'many', 3 ),
-                       array( 'many', 4 ),
-                       array( 'many', 5 ),
-                       array( 'many', 9 ),
-                       array( 'many', 10 ),
-                       array( 'many', 11 ),
-                       array( 'many', 21 ),
-                       array( 'many', 22 ),
-                       array( 'many', 23 ),
-                       array( 'many', 24 ),
-                       array( 'many', 25 ),
-                       array( 'many', 200 ),
-                       array( 'many', 201 ),
+                       array( 'other', 2 ),
+                       array( 'other', 3 ),
+                       array( 'other', 4 ),
+                       array( 'other', 5 ),
+                       array( 'other', 9 ),
+                       array( 'other', 10 ),
+                       array( 'other', 11 ),
+                       array( 'other', 21 ),
+                       array( 'other', 22 ),
+                       array( 'other', 23 ),
+                       array( 'other', 24 ),
+                       array( 'other', 25 ),
+                       array( 'other', 200 ),
+                       array( 'other', 201 ),
                );
        }
 }
index 916ea45..919a744 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageRo.php */
 class LanguageRoTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'few', 0 ),
                        array( 'one', 1 ),
index 0792f75..bfd5074 100644 (file)
@@ -8,14 +8,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageRu.php */
 class LanguageRuTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providePluralFourForms */
-       function testPluralFourForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralFourForms() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
@@ -33,16 +37,16 @@ class LanguageRuTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'several' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
-                       array( 'several', 11 ),
-                       array( 'several', 91 ),
-                       array( 'several', 121 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
                );
        }
 
@@ -51,7 +55,7 @@ class LanguageRuTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
        }
 
-       function providerGrammar() {
+       public static function providerGrammar() {
                return array(
                        array(
                                'Википедии',
index c7dd802..70efa3b 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSe.php */
 class LanguageSeTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPluralThreeForms */
-       function testPluralThreeForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralThreeForms() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -23,13 +27,13 @@ class LanguageSeTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
+       /** @dataProvider providerPluralTwoForms */
+       function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       public static function providerPluralTwoForms() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 95e6346..589a369 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSgs.php */
 class LanguageSgsTest extends LanguageClassesTestCase {
-
        /** @dataProvider providePluralAllForms */
        function testPluralAllForms( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralAllForms() {
+       /** @dataProvider providePluralAllForms */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePluralAllForms() {
                return array(
                        array( 'few', 0 ),
                        array( 'one', 1 ),
@@ -38,7 +42,7 @@ class LanguageSgsTest extends LanguageClassesTestCase {
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 282fd2f..9f34db5 100644 (file)
@@ -7,18 +7,30 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSh.php */
 class LanguageShTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'many', 0 ),
                        array( 'one', 1 ),
-                       array( 'many', 2 ),
+                       array( 'few', 2 ),
+                       array( 'few', 4 ),
+                       array( 'many', 5 ),
+                       array( 'many', 10 ),
+                       array( 'many', 11 ),
+                       array( 'many', 12 ),
+                       array( 'one', 101 ),
+                       array( 'few', 102 ),
+                       array( 'many', 111 ),
                );
        }
 }
index 89cbbf0..3f32c66 100644 (file)
@@ -8,14 +8,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSk.php */
 class LanguageSkTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 075e6af..84c2e01 100644 (file)
@@ -8,16 +8,20 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSl.php */
 class LanguageSlTest extends LanguageClassesTestCase {
-
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'two', 'few', 'other', 'zero' );
+               $forms = array( 'one', 'two', 'few', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providerPlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providerPlural() {
                return array(
-                       array( 'zero', 0 ),
+                       array( 'other', 0 ),
                        array( 'one', 1 ),
                        array( 'two', 2 ),
                        array( 'few', 3 ),
index 6d65521..5819831 100644 (file)
@@ -7,14 +7,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageSma.php */
 class LanguageSmaTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPluralThreeForms */
-       function testPluralThreeForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPluralThreeForms() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
@@ -23,13 +27,13 @@ class LanguageSmaTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providerPlural */
-       function testPlural( $result, $value ) {
+       /** @dataProvider providerPluralTwoForms */
+       function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       public static function providerPluralTwoForms() {
                return array(
                        array( 'other', 0 ),
                        array( 'one', 1 ),
index 5611030..40d14e3 100644 (file)
  * @file
  */
 
-require_once dirname( __DIR__ ) . '/bootstrap.php';
-
 /** Tests for MediaWiki languages/LanguageSr.php */
 class LanguageSrTest extends LanguageClassesTestCase {
-
-       ##### TESTS #######################################################
-
        function testEasyConversions() {
                $this->assertCyrillic(
                        'шђчћжШЂЧЋЖ',
@@ -113,13 +108,18 @@ class LanguageSrTest extends LanguageClassesTestCase {
                );
        }
 
-       /** @dataProvider providePluralFourForms */
-       function testPluralFourForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralFourForms() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
@@ -137,16 +137,16 @@ class LanguageSrTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'several' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
-                       array( 'several', 11 ),
-                       array( 'several', 91 ),
-                       array( 'several', 121 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
                );
        }
 
@@ -205,8 +205,8 @@ class LanguageSrTest extends LanguageClassesTestCase {
                return $this->getLang()
                        ->mConverter
                        ->convertTo(
-                       $text, $variant
-               );
+                               $text, $variant
+                       );
        }
 
        function convertToCyrillic( $text ) {
index 7647144..d687dbb 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 class LanguageTest extends LanguageClassesTestCase {
-
        function testLanguageConvertDoubleWidthToSingleWidth() {
                $this->assertEquals(
                        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
@@ -19,7 +18,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $this->getLang()->formatTimePeriod( $seconds, $format ), $desc );
        }
 
-       function provideFormattableTimes() {
+       public static function provideFormattableTimes() {
                return array(
                        array(
                                9.45,
@@ -202,7 +201,6 @@ class LanguageTest extends LanguageClassesTestCase {
                                'formatTimePeriod() rounding, recursion, (>48h)'
                        ),
                );
-
        }
 
        function testTruncate() {
@@ -251,7 +249,7 @@ class LanguageTest extends LanguageClassesTestCase {
        /**
         * Array format is ($len, $ellipsis, $input, $expected)
         */
-       function provideHTMLTruncateData() {
+       public static function provideHTMLTruncateData() {
                return array(
                        array( 0, 'XXX', "1234567890", "XXX" ),
                        array( 8, 'XXX', "1234567890", "12345XXX" ),
@@ -324,7 +322,7 @@ class LanguageTest extends LanguageClassesTestCase {
         * and distributed as free software, under the GNU General Public Licence.
         * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
         */
-       function provideWellFormedLanguageTags() {
+       public static function provideWellFormedLanguageTags() {
                return array(
                        array( 'fr', 'two-letter code' ),
                        array( 'fr-latn', 'two-letter code with lower case script code' ),
@@ -375,7 +373,7 @@ class LanguageTest extends LanguageClassesTestCase {
         * and distributed as free software, under the GNU General Public Licence.
         * http://www.bortzmeyer.org/gabuzomeu-parsing-language-tags.html
         */
-       function provideMalformedLanguageTags() {
+       public static function provideMalformedLanguageTags() {
                return array(
                        array( 'f', 'language too short' ),
                        array( 'f-Latn', 'language too short with script' ),
@@ -437,7 +435,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideLanguageCodes() {
+       public static function provideLanguageCodes() {
                return array(
                        array( 'fr', 'Two letters, minor case' ),
                        array( 'EN', 'Two letters, upper case' ),
@@ -460,7 +458,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideKnownLanguageTags() {
+       public static function provideKnownLanguageTags() {
                return array(
                        array( 'fr', 'simple code' ),
                        array( 'bat-smg', 'an MW legacy tag' ),
@@ -493,12 +491,36 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideUnknownLanguageTags() {
+       public static function provideUnknownLanguageTags() {
                return array(
                        array( 'mw', 'non-existent two-letter code' ),
                );
        }
 
+       /**
+        * Test too short timestamp
+        * @expectedException MWException
+        */
+       function testSprintfDateTooShortTimestamp() {
+               $this->getLang()->sprintfDate( 'xiY', '1234567890123' );
+       }
+
+       /**
+        * Test too long timestamp
+        * @expectedException MWException
+        */
+       function testSprintfDateTooLongTimestamp() {
+               $this->getLang()->sprintfDate( 'xiY', '123456789012345' );
+       }
+
+       /**
+        * Test too short timestamp
+        * @expectedException MWException
+        */
+       function testSprintfDateNotAllDigitTimestamp() {
+               $this->getLang()->sprintfDate( 'xiY', '-1234567890123' );
+       }
+
        /**
         * @dataProvider provideSprintfDateSamples
         */
@@ -511,10 +533,10 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        /**
-        * bug 33454. sprintfDate should always use UTC.
+        * sprintfDate should always use UTC when no zone is given.
         * @dataProvider provideSprintfDateSamples
         */
-       function testSprintfDateTZ( $format, $ts, $expected, $msg ) {
+       function testSprintfDateNoZone( $format, $ts, $expected, $ignore, $msg ) {
                $oldTZ = date_default_timezone_get();
                $res = date_default_timezone_set( 'Asia/Seoul' );
                if ( !$res ) {
@@ -530,42 +552,65 @@ class LanguageTest extends LanguageClassesTestCase {
                date_default_timezone_set( $oldTZ );
        }
 
-       function provideSprintfDateSamples() {
+       /**
+        * sprintfDate should use passed timezone
+        * @dataProvider provideSprintfDateSamples
+        */
+       function testSprintfDateTZ( $format, $ts, $ignore, $expected, $msg ) {
+               $tz = new DateTimeZone( 'Asia/Seoul' );
+               if ( !$tz ) {
+                       $this->markTestSkipped( "Error getting Timezone" );
+               }
+
+               $this->assertEquals(
+                       $expected,
+                       $this->getLang()->sprintfDate( $format, $ts, $tz ),
+                       "sprintfDate('$format', '$ts', 'Asia/Seoul'): $msg"
+               );
+       }
+
+       public static function provideSprintfDateSamples() {
                return array(
                        array(
                                'xiY',
                                '20111212000000',
                                '1390', // note because we're testing English locale we get Latin-standard digits
+                               '1390',
                                'Iranian calendar full year'
                        ),
                        array(
                                'xiy',
                                '20111212000000',
                                '90',
+                               '90',
                                'Iranian calendar short year'
                        ),
                        array(
                                'o',
                                '20120101235000',
                                '2011',
+                               '2011',
                                'ISO 8601 (week) year'
                        ),
                        array(
                                'W',
                                '20120101235000',
                                '52',
+                               '52',
                                'Week number'
                        ),
                        array(
                                'W',
                                '20120102235000',
                                '1',
+                               '1',
                                'Week number'
                        ),
                        array(
                                'o-\\WW-N',
                                '20091231235000',
                                '2009-W53-4',
+                               '2009-W53-4',
                                'leap week'
                        ),
                        // What follows is mostly copied from http://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
@@ -573,252 +618,336 @@ class LanguageTest extends LanguageClassesTestCase {
                                'Y',
                                '20120102090705',
                                '2012',
+                               '2012',
                                'Full year'
                        ),
                        array(
                                'y',
                                '20120102090705',
                                '12',
+                               '12',
                                '2 digit year'
                        ),
                        array(
                                'L',
                                '20120102090705',
                                '1',
+                               '1',
                                'Leap year'
                        ),
                        array(
                                'n',
                                '20120102090705',
                                '1',
+                               '1',
                                'Month index, not zero pad'
                        ),
                        array(
                                'N',
                                '20120102090705',
                                '01',
+                               '01',
                                'Month index. Zero pad'
                        ),
                        array(
                                'M',
                                '20120102090705',
                                'Jan',
+                               'Jan',
                                'Month abbrev'
                        ),
                        array(
                                'F',
                                '20120102090705',
                                'January',
+                               'January',
                                'Full month'
                        ),
                        array(
                                'xg',
                                '20120102090705',
                                'January',
+                               'January',
                                'Genitive month name (same in EN)'
                        ),
                        array(
                                'j',
                                '20120102090705',
                                '2',
+                               '2',
                                'Day of month (not zero pad)'
                        ),
                        array(
                                'd',
                                '20120102090705',
                                '02',
+                               '02',
                                'Day of month (zero-pad)'
                        ),
                        array(
                                'z',
                                '20120102090705',
                                '1',
+                               '1',
                                'Day of year (zero-indexed)'
                        ),
                        array(
                                'D',
                                '20120102090705',
                                'Mon',
+                               'Mon',
                                'Day of week (abbrev)'
                        ),
                        array(
                                'l',
                                '20120102090705',
                                'Monday',
+                               'Monday',
                                'Full day of week'
                        ),
                        array(
                                'N',
                                '20120101090705',
                                '7',
+                               '7',
                                'Day of week (Mon=1, Sun=7)'
                        ),
                        array(
                                'w',
                                '20120101090705',
                                '0',
+                               '0',
                                'Day of week (Sun=0, Sat=6)'
                        ),
                        array(
                                'N',
                                '20120102090705',
                                '1',
+                               '1',
                                'Day of week'
                        ),
                        array(
                                'a',
                                '20120102090705',
                                'am',
+                               'am',
                                'am vs pm'
                        ),
                        array(
                                'A',
                                '20120102120000',
                                'PM',
+                               'PM',
                                'AM vs PM'
                        ),
                        array(
                                'a',
                                '20120102000000',
                                'am',
+                               'am',
                                'AM vs PM'
                        ),
                        array(
                                'g',
                                '20120102090705',
                                '9',
+                               '9',
                                '12 hour, not Zero'
                        ),
                        array(
                                'h',
                                '20120102090705',
                                '09',
+                               '09',
                                '12 hour, zero padded'
                        ),
                        array(
                                'G',
                                '20120102090705',
                                '9',
+                               '9',
                                '24 hour, not zero'
                        ),
                        array(
                                'H',
                                '20120102090705',
                                '09',
+                               '09',
                                '24 hour, zero'
                        ),
                        array(
                                'H',
                                '20120102110705',
                                '11',
+                               '11',
                                '24 hour, zero'
                        ),
                        array(
                                'i',
                                '20120102090705',
                                '07',
+                               '07',
                                'Minutes'
                        ),
                        array(
                                's',
                                '20120102090705',
                                '05',
+                               '05',
                                'seconds'
                        ),
                        array(
                                'U',
                                '20120102090705',
                                '1325495225',
+                               '1325462825',
                                'unix time'
                        ),
                        array(
                                't',
                                '20120102090705',
                                '31',
+                               '31',
                                'Days in current month'
                        ),
                        array(
                                'c',
                                '20120102090705',
                                '2012-01-02T09:07:05+00:00',
+                               '2012-01-02T09:07:05+09:00',
                                'ISO 8601 timestamp'
                        ),
                        array(
                                'r',
                                '20120102090705',
                                'Mon, 02 Jan 2012 09:07:05 +0000',
+                               'Mon, 02 Jan 2012 09:07:05 +0900',
                                'RFC 5322'
                        ),
+                       array(
+                               'e',
+                               '20120102090705',
+                               'UTC',
+                               'Asia/Seoul',
+                               'Timezone identifier'
+                       ),
+                       array(
+                               'I',
+                               '19880602090705',
+                               '0',
+                               '1',
+                               'DST indicator'
+                       ),
+                       array(
+                               'O',
+                               '20120102090705',
+                               '+0000',
+                               '+0900',
+                               'Timezone offset'
+                       ),
+                       array(
+                               'P',
+                               '20120102090705',
+                               '+00:00',
+                               '+09:00',
+                               'Timezone offset with colon'
+                       ),
+                       array(
+                               'T',
+                               '20120102090705',
+                               'UTC',
+                               'KST',
+                               'Timezone abbreviation'
+                       ),
+                       array(
+                               'Z',
+                               '20120102090705',
+                               '0',
+                               '32400',
+                               'Timezone offset in seconds'
+                       ),
                        array(
                                'xmj xmF xmn xmY',
                                '20120102090705',
                                '7 Safar 2 1433',
+                               '7 Safar 2 1433',
                                'Islamic'
                        ),
                        array(
                                'xij xiF xin xiY',
                                '20120102090705',
                                '12 Dey 10 1390',
+                               '12 Dey 10 1390',
                                'Iranian'
                        ),
                        array(
                                'xjj xjF xjn xjY',
                                '20120102090705',
                                '7 Tevet 4 5772',
+                               '7 Tevet 4 5772',
                                'Hebrew'
                        ),
                        array(
                                'xjt',
                                '20120102090705',
                                '29',
+                               '29',
                                'Hebrew number of days in month'
                        ),
                        array(
                                'xjx',
                                '20120102090705',
                                'Tevet',
+                               'Tevet',
                                'Hebrew genitive month name (No difference in EN)'
                        ),
                        array(
                                'xkY',
                                '20120102090705',
                                '2555',
+                               '2555',
                                'Thai year'
                        ),
                        array(
                                'xoY',
                                '20120102090705',
                                '101',
+                               '101',
                                'Minguo'
                        ),
                        array(
                                'xtY',
                                '20120102090705',
                                '平成24',
+                               '平成24',
                                'nengo'
                        ),
                        array(
                                'xrxkYY',
                                '20120102090705',
                                'MMDLV2012',
+                               'MMDLV2012',
                                'Roman numerals'
                        ),
                        array(
                                'xhxjYY',
                                '20120102090705',
                                'ה\'תשע"ב2012',
+                               'ה\'תשע"ב2012',
                                'Hebrew numberals'
                        ),
                        array(
                                'xnY',
                                '20120102090705',
                                '2012',
+                               '2012',
                                'Raw numerals (doesn\'t mean much in EN)'
                        ),
                        array(
                                '[[Y "(yea"\\r)]] \\"xx\\"',
                                '20120102090705',
                                '[[2012 (year)]] "x"',
+                               '[[2012 (year)]] "x"',
                                'Various escaping'
                        ),
 
@@ -836,7 +965,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideFormatSizes() {
+       public static function provideFormatSizes() {
                return array(
                        array(
                                0,
@@ -898,7 +1027,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideFormatBitrate() {
+       public static function provideFormatBitrate() {
                return array(
                        array(
                                0,
@@ -970,7 +1099,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideFormatDuration() {
+       public static function provideFormatDuration() {
                return array(
                        array(
                                0,
@@ -1106,7 +1235,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideCheckTitleEncodingData() {
+       public static function provideCheckTitleEncodingData() {
                return array(
                        array( "" ),
                        array( "United States of America" ), // 7bit ASCII
@@ -1170,7 +1299,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideRomanNumeralsData() {
+       public static function provideRomanNumeralsData() {
                return array(
                        array( 1, 'I' ),
                        array( 2, 'II' ),
@@ -1225,7 +1354,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $chosen );
        }
 
-       function providePluralData() {
+       public static function providePluralData() {
                // Params are: [expected text, number given, [the plural forms]]
                return array(
                        array( 'plural', 0, array(
@@ -1255,6 +1384,9 @@ class LanguageTest extends LanguageClassesTestCase {
                        array( 'other', 2, array(
                                'kissa=kala', '1=2=3', 'other',
                        ) ),
+                       array( '', 2, array(
+                               '0=explicit zero', '1=explicit one',
+                       ) ),
                );
        }
 
@@ -1273,7 +1405,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $lang->translateBlockExpiry( $str ), $desc );
        }
 
-       function provideTranslateBlockExpiry() {
+       public static function provideTranslateBlockExpiry() {
                return array(
                        array( '2 hours', '2 hours', 'simple data from ipboptions' ),
                        array( 'indefinite', 'infinite', 'infinite from ipboptions' ),
@@ -1302,7 +1434,7 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
-       function provideCommafyData() {
+       public static function provideCommafyData() {
                return array(
                        array( 1, '1' ),
                        array( 10, '10' ),
@@ -1341,7 +1473,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, Language::isSupportedLanguage( $code ), $comment );
        }
 
-       static function provideIsSupportedLanguage() {
+       public static function provideIsSupportedLanguage() {
                return array(
                        array( 'en', true, 'is supported language' ),
                        array( 'fi', true, 'is supported language' ),
index 8af0eee..36446c4 100644 (file)
@@ -7,18 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageTi.php */
 class LanguageTiTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
-                       array( 'many', 2 ),
+                       array( 'other', 2 ),
                );
        }
 }
index abd8581..422ad43 100644 (file)
@@ -7,18 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageTl.php */
 class LanguageTlTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
-                       array( 'many', 2 ),
+                       array( 'other', 2 ),
                );
        }
 }
index e93d49d..6358ac0 100644 (file)
@@ -31,7 +31,7 @@ class LanguageTrTest extends LanguageClassesTestCase {
                $this->assertEquals( $expected, $res, $msg );
        }
 
-       function provideDottedAndDotlessI() {
+       public static function provideDottedAndDotlessI() {
                return array(
                        # function, input, input case, expected
                        # Case changed:
@@ -56,5 +56,4 @@ class LanguageTrTest extends LanguageClassesTestCase {
 
                );
        }
-
 }
index 9bbfaf6..3180d30 100644 (file)
@@ -8,14 +8,18 @@
 
 /** Tests for MediaWiki languages/classes/LanguageUk.php */
 class LanguageUkTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providePluralFourForms */
-       function testPluralFourForms( $result, $value ) {
+       /** @dataProvider providePlural */
+       function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralFourForms() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 1 ),
                        array( 'many', 11 ),
@@ -33,16 +37,16 @@ class LanguageUkTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
-               $forms = array( 'one', 'several' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providePluralTwoForms() {
+       public static function providePluralTwoForms() {
                return array(
                        array( 'one', 1 ),
-                       array( 'several', 11 ),
-                       array( 'several', 91 ),
-                       array( 'several', 121 ),
+                       array( 'other', 11 ),
+                       array( 'other', 91 ),
+                       array( 'other', 121 ),
                );
        }
 }
index 495c0be..8ee95b7 100644 (file)
@@ -12,8 +12,6 @@
  * @file
  */
 
-require_once dirname( __DIR__ ) . '/bootstrap.php';
-
 /** Tests for MediaWiki languages/LanguageUz.php */
 class LanguageUzTest extends LanguageClassesTestCase {
 
index 28329fa..ffa3375 100644 (file)
@@ -7,18 +7,22 @@
 
 /** Tests for MediaWiki languages/classes/LanguageWa.php */
 class LanguageWaTest extends LanguageClassesTestCase {
-
-       /** @dataProvider providerPlural */
+       /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many' );
+               $forms = array( 'one', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
-       function providerPlural() {
+       /** @dataProvider providePlural */
+       function testGetPluralRuleType( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) );
+       }
+
+       public static function providePlural() {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
-                       array( 'many', 2 ),
+                       array( 'other', 2 ),
                );
        }
 }
index 73d5dcc..3bf7414 100644 (file)
@@ -89,7 +89,7 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
                        array( 'n', 'just n' ),
                        array( 'n is in 5', 'is in' ),
                );
+
                return $tests;
        }
-
 }
index 40d24fc..78a5153 100644 (file)
@@ -73,8 +73,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * Clears $wgUser, and reports errors from addDBData to PHPUnit
         */
        protected function setUp() {
-               global $wgUser;
-
                parent::setUp();
 
                // Check if any Exception is stored for rethrowing from addDBData
@@ -83,7 +81,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                        throw $this->exceptionFromAddDBData;
                }
 
-               $wgUser = new User();
+               $this->setMwGlobals( 'wgUser', new User() );
        }
 
        /**
@@ -126,6 +124,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -147,6 +146,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                                return true;
                        }
                }
+
                return false;
        }
 
@@ -273,7 +273,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                $this->assertTextNode( "title", $name );
                $this->assertTextNode( "ns", $ns );
                $this->assertTextNode( "id", $id );
-
        }
 
        /**
@@ -301,8 +300,8 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @param $parentid int|false: (optional) id of the parent revision
         */
        protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false,
-                                                                          $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT ) {
-
+               $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT
+       ) {
                $this->assertNodeStart( "revision" );
                $this->skipWhitespace();
 
index 741f8b7..f4b61af 100644 (file)
@@ -128,7 +128,6 @@ class MaintenanceFixup extends Maintenance {
        public function execute() {
                $this->testCase->fail( __METHOD__ . " called unexpectedly" );
        }
-
 }
 
 class MaintenanceTest extends MediaWikiTestCase {
@@ -186,7 +185,6 @@ class MaintenanceTest extends MediaWikiTestCase {
        // test.*Intermittent.* tests), the objective of these tests is not to describe
        // consistent behavior, but rather currently existing behavior.
 
-
        function testOutputEmpty() {
                $this->m->output( "" );
                $this->assertOutputPrePostShutdown( "", false );
@@ -815,6 +813,4 @@ class MaintenanceTest extends MediaWikiTestCase {
                $m2->simulateShutdown();
                $this->assertOutputPrePostShutdown( "foobar\n\n", false );
        }
-
-
 }
index cc00e6e..bc2d737 100644 (file)
@@ -36,7 +36,6 @@ class BaseDumpTest extends MediaWikiTestCase {
        private function assertPrefetchEquals( $expected, $page, $revision ) {
                $this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ),
                        "Prefetch of page $page revision $revision" );
-
        }
 
        function testSequential() {
@@ -181,7 +180,6 @@ class BaseDumpTest extends MediaWikiTestCase {
   </siteinfo>
 ';
 
-
                // An array holding the pages that are available for prefetch
                $available_pages = array();
 
@@ -274,5 +272,4 @@ class BaseDumpTest extends MediaWikiTestCase {
 
                return $fname;
        }
-
 }
index 0962344..653a114 100644 (file)
@@ -63,7 +63,7 @@ class TextPassDumperTest extends DumpTestCase {
                        // Page from non-default namespace
 
                        if ( $ns === NS_TALK ) {
-                               //@todo: work around this.
+                               // @todo work around this.
                                throw new MWException( "The default wikitext namespace is the talk namespace. "
                                        . " We can't currently deal with that." );
                        }
@@ -80,7 +80,6 @@ class TextPassDumperTest extends DumpTestCase {
                        // DumpTestCase
                        $this->exceptionFromAddDBData = $e;
                }
-
        }
 
        protected function setUp() {
@@ -94,7 +93,6 @@ class TextPassDumperTest extends DumpTestCase {
                        array( $this->pageId2, $this->pageId3, $this->pageId4 ),
                        array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
                        "Page ids increasing without holes" );
-
        }
 
        function testPlain() {
@@ -214,7 +212,6 @@ class TextPassDumperTest extends DumpTestCase {
                $this->assertPageEnd();
 
                $this->assertDumpEnd();
-
        }
 
        /**
@@ -239,7 +236,6 @@ class TextPassDumperTest extends DumpTestCase {
                $minDuration = 2; // We want the dump to take at least this many seconds
                $checkpointAfter = 0.5; // Generate checkpoint after this many seconds
 
-
                // Until a dump takes at least $minDuration seconds, perform a dump and check
                // duration. If the dump did not take long enough increase the iteration
                // count, to generate a bigger stub file next time.
@@ -579,6 +575,7 @@ class TextPassDumperTest extends DumpTestCase {
                $content .= $tail;
                $this->assertEquals( strlen( $content ), file_put_contents(
                        $fname, $content ), "Length of prepared stub" );
+
                return $fname;
        }
 }
index 5cf172e..98d8165 100644 (file)
@@ -39,6 +39,7 @@ class BackupDumperLoggerTest extends DumpTestCase {
                if ( $parameters !== null ) {
                        $logEntry->setParameters( $parameters );
                }
+
                return $logEntry->insert();
        }
 
@@ -75,14 +76,12 @@ class BackupDumperLoggerTest extends DumpTestCase {
                                $user2, NS_MAIN, "PageA", "SomeOtherComment",
                                array( 'key1' => 1, 3 => 'value3' ) );
                        $this->assertGreaterThan( 0, $this->logId3 );
-
                } catch ( Exception $e ) {
                        // We'd love to pass $e directly. However, ... see
                        // documentation of exceptionFromAddDBData in
                        // DumpTestCase
                        $this->exceptionFromAddDBData = $e;
                }
-
        }
 
 
@@ -226,5 +225,4 @@ class BackupDumperLoggerTest extends DumpTestCase {
                // the following statement to catch good output
                $this->expectOutputString( '' );
        }
-
 }
index 07c7670..99bd270 100644 (file)
@@ -34,7 +34,7 @@ class BackupDumperPageTest extends DumpTestCase {
                        $this->talk_namespace = NS_TALK;
 
                        if ( $this->namespace === $this->talk_namespace ) {
-                               //@todo: work around this.
+                               // @todo work around this.
                                throw new MWException( "The default wikitext namespace is the talk namespace. "
                                        . " We can't currently deal with that." );
                        }
@@ -79,7 +79,6 @@ class BackupDumperPageTest extends DumpTestCase {
                        // DumpTestCase
                        $this->exceptionFromAddDBData = $e;
                }
-
        }
 
        protected function setUp() {
@@ -93,7 +92,6 @@ class BackupDumperPageTest extends DumpTestCase {
                        array( $this->pageId2, $this->pageId3, $this->pageId4 ),
                        array( $this->pageId1 + 1, $this->pageId2 + 1, $this->pageId3 + 1 ),
                        "Page ids increasing without holes" );
-
        }
 
        function testFullTextPlain() {
@@ -403,6 +401,4 @@ class BackupDumperPageTest extends DumpTestCase {
 
                $this->expectETAOutput();
        }
-
-
 }
index 4d1d45d..e8df199 100644 (file)
@@ -63,7 +63,6 @@ class SemiMockedFetchText extends FetchText {
 
                return fopen( 'data://text/plain,' . $this->mockStdinText, 'r' );
        }
-
 }
 
 /**
@@ -236,5 +235,4 @@ class FetchTextTest extends MediaWikiTestCase {
                                $this->textId3 . "\n23\nFetchTextTestPage2Text2"
                        ) ) );
        }
-
 }
index 699571b..2c84886 100644 (file)
@@ -64,6 +64,4 @@ class GetSlaveServerTest extends MediaWikiTestCase {
                $this->expectOutputRegex( "/^[[:space:]]*\[wgDBprefix\][[:space:]]*=> "
                        . $wgDBprefix . "$/m" );
        }
-
-
 }
diff --git a/tests/phpunit/mocks/filebackend/MockFSFile.php b/tests/phpunit/mocks/filebackend/MockFSFile.php
new file mode 100644 (file)
index 0000000..31deaf7
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Mock of a filesystem file.
+ *
+ * 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 FileBackend
+ */
+
+/**
+ * Class representing an in memory fake file.
+ * This is intended for unit testing / developement when you do not want
+ * to hit the filesystem.
+ *
+ * It reimplements abstract methods with some hardcoded values. Might
+ * not be suitable for all tests but is good enough for the parser tests.
+ *
+ * @ingroup FileBackend
+ */
+class MockFSFile extends FSFile {
+       private $sha1Base36 = null; // File Sha1Base36
+
+       public function exists() {
+               return true;
+       }
+
+       /**
+        * August 22 – The theft of the Mona Lisa is discovered in the Louvre."
+        * @bug 20281
+        */
+       public function getSize() {
+               return 1911;
+       }
+
+       public function getTimestamp() {
+               return wfTimestamp( TS_MW );
+       }
+
+       public function getMimeType() {
+               return 'text/mock';
+       }
+
+       public function getProps( $ext = true ) {
+               return array(
+                       'fileExists' => $this->exists(),
+                       'size' => $this->getSize(),
+                       'file-mime' => $this->getMimeType(),
+                       'sha1' => $this->getSha1Base36(),
+               );
+       }
+
+       public function getSha1Base36( $recache = false ) {
+               return '1234567890123456789012345678901';
+       }
+}
diff --git a/tests/phpunit/mocks/filebackend/MockFileBackend.php b/tests/phpunit/mocks/filebackend/MockFileBackend.php
new file mode 100644 (file)
index 0000000..49aefbd
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Simulation (mock) of a backend storage.
+ *
+ * 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 FileBackend
+ * @author Antoine Musso <hashar@free.fr>
+ */
+
+/**
+ * Class simulating a backend store.
+ *
+ * @ingroup FileBackend
+ * @since 1.22
+ */
+class MockFileBackend extends FileBackendStore {
+
+       protected $mocked = array();
+
+       /** Poor man debugging */
+       protected function debug( $msg = '' ) {
+               wfDebug( wfGetCaller() . "$msg\n" );
+       }
+
+       public function isPathUsableInternal( $storagePath ) {
+               return true;
+       }
+
+       protected function doCreateInternal( array $params ) {
+               if ( isset( $params['content'] ) ) {
+                       $content = $params['content'];
+               } else {
+                       $content = 'Default mocked file content';
+               }
+               $this->debug( serialize( $params ) );
+               $dst = $params['dst'];
+               $this->mocked[$dst] = $content;
+               return Status::newGood();
+       }
+
+       protected function doStoreInternal( array $params ) {
+               $this->debug( serialize( $params ) );
+               return $this->doCreateInternal( $params );
+       }
+
+       protected function doCopyInternal( array $params ) {
+               $this->debug( serialize( $params ) );
+               $src = $params['src'];
+               $dst = $params['dst'];
+               $this->mocked[$dst] = $this->mocked[$src];
+               return Status::newGood();
+       }
+
+       protected function doDeleteInternal( array $params ) {
+               $this->debug( serialize( $params ) );
+               $src = $params['src'];
+               unset( $this->mocked[$src] );
+               return Status::newGood();
+       }
+
+       protected function doGetFileStat( array $params ) {
+               $src = $params['src'];
+               if ( array_key_exists( $src, $this->mocked ) ) {
+                       $this->debug( "('$src') found" );
+                       return array(
+                               'mtime' => wfTimestamp( TS_MW ),
+                               'size' => strlen( $this->mocked[$src] ),
+                               # No sha1, stat does not need it.
+                       );
+               } else {
+                       $this->debug( "('$src') not found" );
+                       return false;
+               }
+       }
+
+       protected function doGetLocalCopyMulti( array $params ) {
+               $tmpFiles = array(); // (path => MockFSFile)
+
+               $this->debug( '(' . serialize( $params ) . ')' );
+               foreach ( $params['srcs'] as $src ) {
+                       $tmpFiles[$src] = new MockFSFile(
+                               wfTempDir() . '/' . wfRandomString( 32 )
+                       );
+               }
+               return $tmpFiles;
+       }
+
+       protected function doDirectoryExists( $container, $dir, array $params ) {
+               $this->debug();
+               return true;
+       }
+
+       public function getDirectoryListInternal( $container, $dir, array $params ) {
+               $this->debug();
+               return array();
+       }
+
+       public function getFileListInternal( $container, $dir, array $params ) {
+               $this->debug();
+               return array();
+       }
+
+       protected function directoriesAreVirtual() {
+               $this->debug();
+               return true;
+       }
+}
diff --git a/tests/phpunit/mocks/media/MockBitmapHandler.php b/tests/phpunit/mocks/media/MockBitmapHandler.php
new file mode 100644 (file)
index 0000000..2ae30a3
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Fake handler for 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
+ * 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
+ */
+
+/**
+ * Mock handler for images.
+ *
+ * This is really intended for unit testing.
+ *
+ * @ingroup Media
+ */
+class MockBitmapHandler extends BitmapHandler {
+
+       /**
+        * Override BitmapHandler::doTransform() making sure we do not generate
+        * a thumbnail at all. That is merely returning a ThumbnailImage that
+        * will be consumed by the unit test.  There is no need to create a real
+        * thumbnail on the filesystem.
+        */
+       function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+               # Example of what we receive:
+               # $image: LocalFile
+               # $dstPath: /tmp/transform_7d0a7a2f1a09-1.jpg
+               # $dstUrl : http://example.com/images/thumb/0/09/Bad.jpg/320px-Bad.jpg
+               # $params:  width: 320,  descriptionUrl http://trunk.dev/wiki/File:Bad.jpg
+
+               $this->normaliseParams( $image, $params );
+
+               $scalerParams = array(
+                       # The size to which the image will be resized
+                       'physicalWidth' => $params['physicalWidth'],
+                       'physicalHeight' => $params['physicalHeight'],
+                       'physicalDimensions' => "{$params['physicalWidth']}x{$params['physicalHeight']}",
+                       # The size of the image on the page
+                       'clientWidth' => $params['width'],
+                       'clientHeight' => $params['height'],
+                       # Comment as will be added to the EXIF of the thumbnail
+                       'comment' => isset( $params['descriptionUrl'] ) ?
+                       "File source: {$params['descriptionUrl']}" : '',
+                       # Properties of the original image
+                       'srcWidth' => $image->getWidth(),
+                       'srcHeight' => $image->getHeight(),
+                       'mimeType' => $image->getMimeType(),
+                       'dstPath' => $dstPath,
+                       'dstUrl' => $dstUrl,
+               );
+
+               # In some cases, we do not bother generating a thumbnail.
+               if ( !$image->mustRender() &&
+                       $scalerParams['physicalWidth'] == $scalerParams['srcWidth']
+                       && $scalerParams['physicalHeight'] == $scalerParams['srcHeight'] ) {
+                       wfDebug( __METHOD__ . ": returning unscaled image\n" );
+                       return $this->getClientScalingThumbnailImage( $image, $scalerParams );
+               }
+
+               return new ThumbnailImage( $image, $dstUrl, false, $params );
+       }
+}
index 2ec0744..deef745 100755 (executable)
@@ -12,7 +12,7 @@
 define( 'MW_PHPUNIT_TEST', true );
 
 // Start up MediaWiki in command-line mode
-require_once( dirname( dirname( __DIR__ ) ) . "/maintenance/Maintenance.php" );
+require_once dirname( dirname( __DIR__ ) ) . "/maintenance/Maintenance.php";
 
 class PHPUnitMaintClass extends Maintenance {
 
@@ -33,6 +33,9 @@ class PHPUnitMaintClass extends Maintenance {
                global $wgLocaltimezone, $wgLocalisationCacheConf;
                global $wgDevelopmentWarnings;
 
+               // Inject test autoloader
+               require_once __DIR__ . '/../TestsAutoLoader.php';
+
                // wfWarn should cause tests to fail
                $wgDevelopmentWarnings = true;
 
@@ -50,8 +53,11 @@ class PHPUnitMaintClass extends Maintenance {
 
                // Bug 44192 Do not attempt to send a real e-mail
                Hooks::clear( 'AlternateUserMailer' );
-               Hooks::register( 'AlternateUserMailer',
-                       function() { return false; }
+               Hooks::register(
+                       'AlternateUserMailer',
+                       function () {
+                               return false;
+                       }
                );
        }
 
@@ -86,7 +92,6 @@ class PHPUnitMaintClass extends Maintenance {
                        unset( $_SERVER['argv'][$key] ); // the option
                        unset( $_SERVER['argv'][$key + 1] ); // its value
                        $_SERVER['argv'] = array_values( $_SERVER['argv'] );
-
                }
        }
 
@@ -96,16 +101,14 @@ class PHPUnitMaintClass extends Maintenance {
 }
 
 $maintClass = 'PHPUnitMaintClass';
-require( RUN_MAINTENANCE_IF_MAIN );
+require RUN_MAINTENANCE_IF_MAIN;
 
-require_once( 'PHPUnit/Runner/Version.php' );
+require_once 'PHPUnit/Runner/Version.php';
 
 if ( PHPUnit_Runner_Version::id() !== '@package_version@'
        && version_compare( PHPUnit_Runner_Version::id(), '3.6.7', '<' )
 ) {
        die( 'PHPUnit 3.6.7 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
 }
-require_once( 'PHPUnit/Autoload.php' );
-
-require_once( "$IP/tests/TestsAutoLoader.php" );
+require_once 'PHPUnit/Autoload.php';
 MediaWikiPHPUnitCommand::main();
diff --git a/tests/phpunit/resources/ResourcesTest.php b/tests/phpunit/resources/ResourcesTest.php
deleted file mode 100644 (file)
index 71b8c67..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
- * Sanity checks for making sure registered resources are sane.
- *
- * @file
- * @author Niklas Laxström, 2012
- * @author Antoine Musso, 2012
- * @author Santhosh Thottingal, 2012
- * @author Timo Tijhof, 2012
- * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
- */
-class ResourcesTest extends MediaWikiTestCase {
-
-       /**
-        * @dataProvider provideResourceFiles
-        */
-       public function testFileExistence( $filename, $module, $resource ) {
-               $this->assertFileExists( $filename,
-                       "File '$resource' referenced by '$module' must exist."
-               );
-       }
-
-       /**
-        * This ask the ResouceLoader for all registered files from modules
-        * created by ResourceLoaderFileModule (or one of its descendants).
-        *
-        *
-        * Since the raw data is stored in protected properties, we have to
-        * overrride this through ReflectionObject methods.
-        */
-       public static function provideResourceFiles() {
-               global $wgEnableJavaScriptTest;
-
-               // Test existance of test suite files as well
-               // (can't use setUp or setMwGlobals because providers are static)
-               $live_wgEnableJavaScriptTest = $wgEnableJavaScriptTest;
-               $wgEnableJavaScriptTest = true;
-
-               // Array with arguments for the test function
-               $cases = array();
-
-               // Initialize ResourceLoader
-               $rl = new ResourceLoader();
-
-               // See also ResourceLoaderFileModule::__construct
-               $filePathProps = array(
-                       // Lists of file paths
-                       'lists' => array(
-                               'scripts',
-                               'debugScripts',
-                               'loaderScripts',
-                               'styles',
-                       ),
-
-                       // Collated lists of file paths
-                       'nested-lists' => array(
-                               'languageScripts',
-                               'skinScripts',
-                               'skinStyles',
-                       ),
-               );
-
-               foreach ( $rl->getModuleNames() as $moduleName ) {
-                       $module = $rl->getModule( $moduleName );
-                       if ( !$module instanceof ResourceLoaderFileModule ) {
-                               continue;
-                       }
-
-                       $reflectedModule = new ReflectionObject( $module );
-
-                       $files = array();
-
-                       foreach ( $filePathProps['lists'] as $propName ) {
-                               $property = $reflectedModule->getProperty( $propName );
-                               $property->setAccessible( true );
-                               $list = $property->getValue( $module );
-                               foreach ( $list as $key => $value ) {
-                                       // 'scripts' are numeral arrays.
-                                       // 'styles' can be numeral or associative.
-                                       // In case of associative the key is the file path
-                                       // and the value is the 'media' attribute.
-                                       if ( is_int( $key ) ) {
-                                               $files[] = $value;
-                                       } else {
-                                               $files[] = $key;
-                                       }
-                               }
-                       }
-
-                       foreach ( $filePathProps['nested-lists'] as $propName ) {
-                               $property = $reflectedModule->getProperty( $propName );
-                               $property->setAccessible( true );
-                               $lists = $property->getValue( $module );
-                               foreach ( $lists as $group => $list ) {
-                                       foreach ( $list as $key => $value ) {
-                                               // We need the same filter as for 'lists',
-                                               // due to 'skinStyles'.
-                                               if ( is_int( $key ) ) {
-                                                       $files[] = $value;
-                                               } else {
-                                                       $files[] = $key;
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Get method for resolving the paths to full paths
-                       $method = $reflectedModule->getMethod( 'getLocalPath' );
-                       $method->setAccessible( true );
-
-                       // Populate cases
-                       foreach ( $files as $file ) {
-                               $cases[] = array(
-                                       $method->invoke( $module, $file ),
-                                       $module->getName(),
-                                       $file,
-                               );
-                       }
-
-               }
-
-               // Restore settings
-               $wgEnableJavaScriptTest = $live_wgEnableJavaScriptTest;
-
-               return $cases;
-       }
-
-}
index 3902b68..850d39c 100644 (file)
@@ -100,7 +100,6 @@ class SideBarTest extends MediaWikiLangTestCase {
 ** http://valid.no.desc.org/
 '
                );
-
        }
 
        /**
@@ -116,13 +115,13 @@ class SideBarTest extends MediaWikiLangTestCase {
                                # ** Baz|Fred
                                array(
                                        'text' => 'Fred',
-                                       'href' => Title::newFromText( 'Baz' )->getLocalUrl(),
+                                       'href' => Title::newFromText( 'Baz' )->getLocalURL(),
                                        'id' => 'n-Fred',
                                        'active' => null,
                                ),
                                array(
                                        'text' => 'title-to-display',
-                                       'href' => Title::newFromText( 'page-to-go-to' )->getLocalUrl(),
+                                       'href' => Title::newFromText( 'page-to-go-to' )->getLocalURL(),
                                        'id' => 'n-title-to-display',
                                        'active' => null,
                                ),
@@ -151,11 +150,12 @@ class SideBarTest extends MediaWikiLangTestCase {
 
        /**
         * Simple test to verify our helper assertAttribs() is functional
-        * Please note this assume MediaWiki default settings:
-        *   $wgNoFollowLinks = true
-        *   $wgExternalLinkTarget = false
         */
        function testTestAttributesAssertionHelper() {
+               $this->setMwGlobals( array(
+                       'wgNoFollowLinks' => true,
+                       'wgExternalLinkTarget' => false,
+               ) );
                $attribs = $this->getAttribs();
 
                $this->assertArrayHasKey( 'rel', $attribs );
@@ -168,38 +168,30 @@ class SideBarTest extends MediaWikiLangTestCase {
         * Test $wgNoFollowLinks in sidebar
         */
        function testRespectWgnofollowlinks() {
-               global $wgNoFollowLinks;
-               $saved = $wgNoFollowLinks;
-               $wgNoFollowLinks = false;
+               $this->setMwGlobals( 'wgNoFollowLinks', false );
 
                $attribs = $this->getAttribs();
                $this->assertArrayNotHasKey( 'rel', $attribs,
                        'External URL in sidebar do not have rel=nofollow when $wgNoFollowLinks = false'
                );
-
-               // Restore global
-               $wgNoFollowLinks = $saved;
        }
 
        /**
         * Test $wgExternaLinkTarget in sidebar
+        * @dataProvider dataRespectExternallinktarget
         */
-       function testRespectExternallinktarget() {
-               global $wgExternalLinkTarget;
-               $saved = $wgExternalLinkTarget;
-
-               $wgExternalLinkTarget = '_blank';
-               $attribs = $this->getAttribs();
-               $this->assertArrayHasKey( 'target', $attribs );
-               $this->assertEquals( $attribs['target'], '_blank' );
+       function testRespectExternallinktarget( $externalLinkTarget ) {
+               $this->setMwGlobals( 'wgExternalLinkTarget', $externalLinkTarget );
 
-               $wgExternalLinkTarget = '_self';
                $attribs = $this->getAttribs();
                $this->assertArrayHasKey( 'target', $attribs );
-               $this->assertEquals( $attribs['target'], '_self' );
-
-               // Restore global
-               $wgExternalLinkTarget = $saved;
+               $this->assertEquals( $attribs['target'], $externalLinkTarget );
        }
 
+       function dataRespectExternallinktarget() {
+               return array(
+                       array( '_blank' ),
+                       array( '_self' ),
+               );
+       }
 }
diff --git a/tests/phpunit/structure/AutoLoaderTest.php b/tests/phpunit/structure/AutoLoaderTest.php
new file mode 100644 (file)
index 0000000..e49ea6d
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+class AutoLoaderTest extends MediaWikiTestCase {
+
+       public function testAutoLoadConfig() {
+               $results = self::checkAutoLoadConf();
+
+               $this->assertEquals(
+                       $results['expected'],
+                       $results['actual']
+               );
+       }
+
+       protected static function checkAutoLoadConf() {
+               global $wgAutoloadLocalClasses, $wgAutoloadClasses, $IP;
+               $supportsParsekit = function_exists( 'parsekit_compile_file' );
+
+               // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
+               $expected = $wgAutoloadLocalClasses + $wgAutoloadClasses;
+               $actual = array();
+
+               $files = array_unique( $expected );
+
+               foreach ( $files as $file ) {
+                       // Only prefix $IP if it doesn't have it already.
+                       // Generally local classes don't have it, and those from extensions and test suites do.
+                       if ( substr( $file, 0, 1 ) != '/' && substr( $file, 1, 1 ) != ':' ) {
+                               $filePath = "$IP/$file";
+                       } else {
+                               $filePath = $file;
+                       }
+                       if ( $supportsParsekit ) {
+                               $parseInfo = parsekit_compile_file( "$filePath" );
+                               $classes = array_keys( $parseInfo['class_table'] );
+                       } else {
+                               $contents = file_get_contents( "$filePath" );
+                               $m = array();
+                               preg_match_all( '/\n\s*(?:final)?\s*(?:abstract)?\s*(?:class|interface)\s+([a-zA-Z0-9_]+)/', $contents, $m, PREG_PATTERN_ORDER );
+                               $classes = $m[1];
+                       }
+                       foreach ( $classes as $class ) {
+                               $actual[$class] = $file;
+                       }
+               }
+
+               return array(
+                       'expected' => $expected,
+                       'actual' => $actual,
+               );
+       }
+}
diff --git a/tests/phpunit/structure/ResourcesTest.php b/tests/phpunit/structure/ResourcesTest.php
new file mode 100644 (file)
index 0000000..3af805a
--- /dev/null
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Sanity checks for making sure registered resources are sane.
+ *
+ * @file
+ * @author Niklas Laxström, 2012
+ * @author Antoine Musso, 2012
+ * @author Santhosh Thottingal, 2012
+ * @author Timo Tijhof, 2012
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+class ResourcesTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideResourceFiles
+        */
+       public function testFileExistence( $filename, $module, $resource ) {
+               $this->assertFileExists( $filename,
+                       "File '$resource' referenced by '$module' must exist."
+               );
+       }
+
+       /**
+        * This ask the ResouceLoader for all registered files from modules
+        * created by ResourceLoaderFileModule (or one of its descendants).
+        *
+        *
+        * Since the raw data is stored in protected properties, we have to
+        * overrride this through ReflectionObject methods.
+        */
+       public static function provideResourceFiles() {
+               global $wgEnableJavaScriptTest;
+
+               // Test existance of test suite files as well
+               // (can't use setUp or setMwGlobals because providers are static)
+               $live_wgEnableJavaScriptTest = $wgEnableJavaScriptTest;
+               $wgEnableJavaScriptTest = true;
+
+               // Array with arguments for the test function
+               $cases = array();
+
+               // Initialize ResourceLoader
+               $rl = new ResourceLoader();
+
+               // See also ResourceLoaderFileModule::__construct
+               $filePathProps = array(
+                       // Lists of file paths
+                       'lists' => array(
+                               'scripts',
+                               'debugScripts',
+                               'loaderScripts',
+                               'styles',
+                       ),
+
+                       // Collated lists of file paths
+                       'nested-lists' => array(
+                               'languageScripts',
+                               'skinScripts',
+                               'skinStyles',
+                       ),
+               );
+
+               foreach ( $rl->getModuleNames() as $moduleName ) {
+                       $module = $rl->getModule( $moduleName );
+                       if ( !$module instanceof ResourceLoaderFileModule ) {
+                               continue;
+                       }
+
+                       $reflectedModule = new ReflectionObject( $module );
+
+                       $files = array();
+
+                       foreach ( $filePathProps['lists'] as $propName ) {
+                               $property = $reflectedModule->getProperty( $propName );
+                               $property->setAccessible( true );
+                               $list = $property->getValue( $module );
+                               foreach ( $list as $key => $value ) {
+                                       // 'scripts' are numeral arrays.
+                                       // 'styles' can be numeral or associative.
+                                       // In case of associative the key is the file path
+                                       // and the value is the 'media' attribute.
+                                       if ( is_int( $key ) ) {
+                                               $files[] = $value;
+                                       } else {
+                                               $files[] = $key;
+                                       }
+                               }
+                       }
+
+                       foreach ( $filePathProps['nested-lists'] as $propName ) {
+                               $property = $reflectedModule->getProperty( $propName );
+                               $property->setAccessible( true );
+                               $lists = $property->getValue( $module );
+                               foreach ( $lists as $list ) {
+                                       foreach ( $list as $key => $value ) {
+                                               // We need the same filter as for 'lists',
+                                               // due to 'skinStyles'.
+                                               if ( is_int( $key ) ) {
+                                                       $files[] = $value;
+                                               } else {
+                                                       $files[] = $key;
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Get method for resolving the paths to full paths
+                       $method = $reflectedModule->getMethod( 'getLocalPath' );
+                       $method->setAccessible( true );
+
+                       // Populate cases
+                       foreach ( $files as $file ) {
+                               $cases[] = array(
+                                       $method->invoke( $module, $file ),
+                                       $module->getName(),
+                                       $file,
+                               );
+                       }
+               }
+
+               // Restore settings
+               $wgEnableJavaScriptTest = $live_wgEnableJavaScriptTest;
+
+               return $cases;
+       }
+}
diff --git a/tests/phpunit/structure/StructureTest.php b/tests/phpunit/structure/StructureTest.php
new file mode 100644 (file)
index 0000000..df00d4d
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * The tests here verify the structure of the code.  This is for outright bugs,
+ * not just style issues.
+ */
+
+class StructureTest extends MediaWikiTestCase {
+       /**
+        * Verify all files that appear to be tests have file names ending in
+        * Test.  If the file names do not end in Test, they will not be run.
+        * @group medium
+        */
+       public function testUnitTestFileNamesEndWithTest() {
+               if ( wfIsWindows() ) {
+                       $this->markTestSkipped( 'This test does not work on Windows' );
+               }
+               $rootPath = escapeshellarg( __DIR__ . '/..' );
+               $testClassRegex = implode( '|', array(
+                       'ApiFormatTestBase',
+                       'ApiTestCase',
+                       'ApiQueryTestBase',
+                       'ApiQueryContinueTestBase',
+                       'MediaWikiLangTestCase',
+                       'MediaWikiTestCase',
+                       'PHPUnit_Framework_TestCase',
+                       'DumpTestCase',
+               ) );
+               $testClassRegex = "^class .* extends ($testClassRegex)";
+               $finder = "find $rootPath -name '*.php' '!' -name '*Test.php'" .
+                       " | xargs grep -El '$testClassRegex|function suite\('";
+
+               $results = null;
+               $exitCode = null;
+               exec( $finder, $results, $exitCode );
+
+               $this->assertEquals(
+                       0,
+                       $exitCode,
+                       'Verify find/grep command succeeds.'
+               );
+
+               $results = array_filter(
+                       $results,
+                       array( $this, 'filterSuites' )
+               );
+               $strip = strlen( $rootPath ) - 1;
+               foreach ( $results as $k => $v ) {
+                       $results[$k] = substr( $v, $strip );
+               }
+               $this->assertEquals(
+                       array(),
+                       $results,
+                       "Unit test file in $rootPath must end with Test."
+               );
+       }
+
+       /**
+        * Filter to remove testUnitTestFileNamesEndWithTest false positives.
+        */
+       public function filterSuites( $filename ) {
+               return strpos( $filename, __DIR__ . '/../suites/' ) !== 0;
+       }
+}
index 56f6447..844c853 100644 (file)
@@ -29,7 +29,7 @@
                        <directory>maintenance</directory>
                </testsuite>
                <testsuite name="structure">
-                       <file>StructureTest.php</file>
+                       <directory>structure</directory>
                </testsuite>
                <testsuite name="uploadfromurl">
                        <file>suites/UploadFromUrlTestSuite.php</file>
index 28d38ab..7eb599e 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-require_once( dirname( __DIR__ ) . '/includes/upload/UploadFromUrlTest.php' );
+require_once dirname( __DIR__ ) . '/includes/upload/UploadFromUrlTest.php';
 
 class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
        public $savedGlobals = array();
@@ -16,16 +16,16 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
        }
 
        protected function setUp() {
-               global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
-                       $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
-                       $wgNamespaceAliases, $wgNamespaceProtection, $parserMemc;
+               global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgUser,
+                       $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
+                       $wgEnableParserCache, $wgNamespaceAliases, $wgNamespaceProtection,
+                       $parserMemc;
 
                $tmpGlobals = array();
 
                $tmpGlobals['wgScript'] = '/index.php';
                $tmpGlobals['wgScriptPath'] = '/';
                $tmpGlobals['wgArticlePath'] = '/wiki/$1';
-               $tmpGlobals['wgStyleSheetPath'] = '/skins';
                $tmpGlobals['wgStylePath'] = '/skins';
                $tmpGlobals['wgThumbnailScriptPath'] = false;
                $tmpGlobals['wgLocalFileRepo'] = array(
@@ -56,7 +56,6 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                $wgNamespaceAliases['Image'] = NS_FILE;
                $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
 
-
                $wgEnableParserCache = false;
                DeferredUpdates::clearPendingUpdates();
                $wgMemc = wfGetMainCache();
@@ -184,6 +183,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
 
                if ( file_exists( $dir ) ) {
                        wfDebug( "Already exists!\n" );
+
                        return $dir;
                }
 
@@ -201,6 +201,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                // the UploadFromUrlTest class
                class_exists( 'UploadFromUrlTest' );
                $suite = new UploadFromUrlTestSuite( 'UploadFromUrlTest' );
+
                return $suite;
        }
 }
index 01072d8..c874375 100644 (file)
@@ -6,6 +6,7 @@ return array(
 
        'mediawiki.tests.qunit.suites' => array(
                'scripts' => array(
+                       'tests/qunit/suites/resources/startup.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.byteLength.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js',
@@ -16,6 +17,7 @@ return array(
                        'tests/qunit/suites/resources/jquery/jquery.hidpi.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.highlightText.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.localize.test.js',
+                       'tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.mwExtension.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
@@ -45,6 +47,7 @@ return array(
                        'jquery.hidpi',
                        'jquery.highlightText',
                        'jquery.localize',
+                       'jquery.makeCollapsible',
                        'jquery.mwExtension',
                        'jquery.tabIndex',
                        'jquery.tablesorter',
@@ -61,6 +64,5 @@ return array(
                        'mediawiki.language',
                        'mediawiki.cldr',
                ),
-               'position' => 'top',
        )
 );
index 604ede8..12e5a2d 100644 (file)
@@ -61,7 +61,7 @@
  * </code>
  */
 
-require( __DIR__ . '/../../../maintenance/Maintenance.php' );
+require __DIR__ . '/../../../maintenance/Maintenance.php';
 
 class GenerateJqueryMsgData extends Maintenance {
 
@@ -147,4 +147,4 @@ class GenerateJqueryMsgData extends Maintenance {
 }
 
 $maintClass = "GenerateJqueryMsgData";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;
index 7ff392a..f6eff77 100644 (file)
@@ -24,6 +24,7 @@
  */
 header( 'Content-Type: text/javascript; charset=utf-8' );
 
+require_once __DIR__ . '/../../../includes/json/FormatJson.php';
 require_once __DIR__ . '/../../../includes/Xml.php';
 
 $moduleImplementations = array(
@@ -50,7 +51,7 @@ if ( isset( $_GET['modules'] ) ) {
                if ( isset( $moduleImplementations[$module] ) ) {
                        $response .= $moduleImplementations[$module];
                } else {
-                       $response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ) );
+                       $response .= Xml::encodeJsCall( 'mw.loader.state', array( $module, 'missing' ), true );
                }
        }
 }
index 62dd81a..1a2bfa1 100644 (file)
@@ -38,6 +38,8 @@
                tooltip: 'Enable debug mode in ResourceLoader'
        } );
 
+       QUnit.config.requireExpects = true;
+
        /**
         * Load TestSwarm agent
         */
        // of MediaWiki has actually been configured with the required url to that inject.js
        // script. By default it is false.
        if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) {
-               document.write( '<scr' + 'ipt src="' + QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) + '"></scr' + 'ipt>' );
+               jQuery.getScript( QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) );
        }
 
        /**
         * CompletenessTest
+        *
+        * Adds toggle checkbox to header
         */
-        // Adds toggle checkbox to header
        QUnit.config.urlConfig.push( {
                id: 'completenesstest',
                label: 'Run CompletenessTest',
@@ -93,8 +96,9 @@
 
        /**
         * Test environment recommended for all QUnit test modules
+        *
+        * Whether to log environment changes to the console
         */
-        // Whether to log environment changes to the console
        QUnit.config.urlConfig.push( 'mwlogenv' );
 
        /**
                assert.equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
        } );
 
+       QUnit.test( 'Loader status', 2, function ( assert ) {
+               var i, len, state,
+                       modules = mw.loader.getModuleNames(),
+                       error = [],
+                       missing = [];
+
+               for ( i = 0, len = modules.length; i < len; i++ ) {
+                       state = mw.loader.getState( modules[i] );
+                       if ( state === 'error' ) {
+                               error.push( modules[i] );
+                       } else if ( state === 'missing' ) {
+                               missing.push( modules[i] );
+                       }
+               }
+
+               assert.deepEqual( error, [], 'Modules in error state' );
+               assert.deepEqual( missing, [], 'Modules in missing state' );
+       } );
+
        QUnit.test( 'htmlEqual', 8, function ( assert ) {
                assert.htmlEqual(
                        '<div><p class="some classes" data-length="10">Child paragraph with <a href="http://example.com">A link</a></p>Regular text<span>A span</span></div>',
index c21844e..596c57c 100644 (file)
        /**
         * Test factory for $.fn.byteLimit
         *
-        * @param $input {jQuery} jQuery object in an input element
-        * @param hasLimit {Boolean} Wether a limit should apply at all
-        * @param limit {Number} Limit (if used) otherwise undefined
-        * The limit should be less than 20 (the sample data's length)
+        * @param {Object} options
+        * @param {string} options.description Test name
+        * @param {jQuery} options.$input jQuery object in an input element
+        * @param {string} options.sample Sequence of characters to simulate being
+        *  added one by one
+        * @param {string} options.expected Expected final value of `$input`
         */
        function byteLimitTest( options ) {
                var opt = $.extend( {
                        description: '',
                        $input: null,
                        sample: '',
-                       hasLimit: false,
-                       expected: '',
-                       limit: null
+                       expected: ''
                }, options );
 
-               QUnit.asyncTest( opt.description, opt.hasLimit ? 3 : 2, function ( assert ) {
+               QUnit.asyncTest( opt.description, 1, function ( assert ) {
                        setTimeout( function () {
-                               var rawVal, fn, effectiveVal;
-
                                opt.$input.appendTo( '#qunit-fixture' );
 
                                // Simulate pressing keys for each of the sample characters
                                addChars( opt.$input, opt.sample );
 
-                               rawVal = opt.$input.val();
-                               fn = opt.$input.data( 'byteLimit.callback' );
-                               effectiveVal = fn ? fn( rawVal ) : rawVal;
-
-                               if ( opt.hasLimit ) {
-                                       assert.ltOrEq(
-                                               $.byteLength( effectiveVal ),
-                                               opt.limit,
-                                               'Prevent keypresses after byteLimit was reached, length never exceeded the limit'
-                                       );
-                                       assert.equal(
-                                               $.byteLength( rawVal ),
-                                               $.byteLength( opt.expected ),
-                                               'Not preventing keypresses too early, length has reached the expected length'
-                                       );
-                                       assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
-
-                               } else {
-                                       assert.equal(
-                                               $.byteLength( effectiveVal ),
-                                               $.byteLength( opt.expected ),
-                                               'Unlimited scenarios are not affected, expected length reached'
-                                       );
-                                       assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
-                               }
+                               assert.equal(
+                                       opt.$input.val(),
+                                       opt.expected,
+                                       'New value matches the expected string'
+                               );
+
                                QUnit.start();
                        }, 10 );
                } );
@@ -89,7 +68,6 @@
                description: 'Plain text input',
                $input: $( '<input type="text"/>' ),
                sample: simpleSample,
-               hasLimit: false,
                expected: simpleSample
        } );
 
@@ -98,7 +76,6 @@
                $input: $( '<input type="text"/>' )
                        .byteLimit(),
                sample: simpleSample,
-               hasLimit: false,
                expected: simpleSample
        } );
 
                        .attr( 'maxlength', '10' )
                        .byteLimit(),
                sample: simpleSample,
-               hasLimit: true,
-               limit: 10,
                expected: '1234567890'
        } );
 
                $input: $( '<input type="text"/>' )
                        .byteLimit( 10 ),
                sample: simpleSample,
-               hasLimit: true,
-               limit: 10,
                expected: '1234567890'
        } );
 
                        .attr( 'maxlength', '10' )
                        .byteLimit( 15 ),
                sample: simpleSample,
-               hasLimit: true,
-               limit: 15,
                expected: '123456789012345'
        } );
 
                $input: $( '<input type="text"/>' )
                        .byteLimit( 14 ),
                sample: mbSample,
-               hasLimit: true,
-               limit: 14,
                expected: '1234567890' + U_20AC + '1'
        } );
 
                $input: $( '<input type="text"/>' )
                        .byteLimit( 12 ),
                sample: mbSample,
-               hasLimit: true,
-               limit: 12,
                expected: '1234567890' + '12'
        } );
 
                                return new mw.Title( String( val ) ).getMain();
                        } ),
                sample: 'User:Sample',
-               hasLimit: true,
-               limit: 6, // 'Sample' length
                expected: 'User:Sample'
        } );
 
                                return new mw.Title( String( val ) ).getMain();
                        } ),
                sample: 'User:Sample',
-               hasLimit: true,
-               limit: 6, // 'Sample' length
                expected: 'User:Sample'
        } );
 
+       byteLimitTest( {
+               description: 'Pass the limit and a callback as input filter',
+               $input: $( '<input type="text"/>' )
+                       .byteLimit( 6, function ( val ) {
+                               // Invalid title
+                               if ( val === '' ) {
+                                       return '';
+                               }
+
+                               // Return without namespace prefix
+                               return new mw.Title( String( val ) ).getMain();
+                       } ),
+               sample: 'User:Example',
+               // The callback alters the value to be used to calculeate
+               // the length. The altered value is "Exampl" which has
+               // a length of 6, the "e" would exceed the limit.
+               expected: 'User:Exampl'
+       } );
+
+       byteLimitTest( {
+               description: 'Input filter that increases the length',
+               $input: $( '<input type="text"/>' )
+               .byteLimit( 10, function ( text ) {
+                       return 'prefix' + text;
+               } ),
+               sample: simpleSample,
+               // Prefix adds 6 characters, limit is reached after 4
+               expected: '1234'
+       } );
+
+       // Regression tests for bug 41450
+       byteLimitTest( {
+               description: 'Input filter of which the base exceeds the limit',
+               $input: $( '<input type="text"/>' )
+               .byteLimit( 3, function ( text ) {
+                       return 'prefix' + text;
+               } ),
+               sample: simpleSample,
+               hasLimit: true,
+               limit: 6, // 'prefix' length
+               expected: ''
+       } );
+
        QUnit.test( 'Confirm properties and attributes set', 4, function ( assert ) {
                var $el, $elA, $elB;
 
diff --git a/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js b/tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
new file mode 100644 (file)
index 0000000..7ae743c
--- /dev/null
@@ -0,0 +1,140 @@
+( function ( mw, $ ) {
+       var loremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.';
+
+       QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment() );
+
+       function prepareCollapsible( html, options ) {
+               return $( $.parseHTML( html ) )
+                       .appendTo( '#qunit-fixture' )
+                       // options might be undefined here - this is okay
+                       .makeCollapsible( options );
+       }
+
+       QUnit.asyncTest( 'testing hooks (triggers)', 4, function ( assert ) {
+               var $collapsible, $content, $toggle;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible">' + loremIpsum + '</div>'
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+               $toggle = $collapsible.find( '.mw-collapsible-toggle' );
+
+               // In one full collapse-expand cycle, each event will be fired once
+
+               // On collapse...
+               $collapsible.on( 'beforeCollapse.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':visible' ), 'first beforeCollapseExpand: content is visible' );
+               } );
+               $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':hidden' ), 'first afterCollapseExpand: content is hidden' );
+
+                       // On expand...
+                       $collapsible.on( 'beforeExpand.mw-collapsible', function () {
+                               assert.assertTrue( $content.is( ':hidden' ), 'second beforeCollapseExpand: content is hidden' );
+                       } );
+                       $collapsible.on( 'afterExpand.mw-collapsible', function () {
+                               assert.assertTrue( $content.is( ':visible' ), 'second afterCollapseExpand: content is visible' );
+
+                               QUnit.start();
+                       } );
+
+                       // ...expanding happens here
+                       $toggle.trigger( 'click' );
+               } );
+
+               // ...collapsing happens here
+               $toggle.trigger( 'click' );
+       } );
+
+       QUnit.asyncTest( 'basic operation', 3, function ( assert ) {
+               var $collapsible, $content;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible">' + loremIpsum + '</div>'
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+
+               assert.equal( $content.length, 1, 'content is present' );
+               assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+               $collapsible.on( 'afterCollapse.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+                       QUnit.start();
+               } );
+
+               $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+       } );
+
+       QUnit.test( 'basic operation with instantHide (synchronous test)', 2, function ( assert ) {
+               var $collapsible, $content;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible">' + loremIpsum + '</div>',
+                       { instantHide: true }
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+
+               assert.assertTrue( $content.is( ':visible' ), 'content is visible' );
+
+               $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+
+               assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
+       } );
+
+       QUnit.asyncTest( 'initially collapsed - mw-collapsed class', 2, function ( assert ) {
+               var $collapsible, $content;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible mw-collapsed">' + loremIpsum + '</div>'
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+
+               // Synchronous - mw-collapsed should cause instantHide: true to be used on initial collapsing
+               assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
+
+               $collapsible.on( 'afterExpand.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+                       QUnit.start();
+               } );
+
+               $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+       } );
+
+       QUnit.asyncTest( 'initially collapsed - options', 2, function ( assert ) {
+               var $collapsible, $content;
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible">' + loremIpsum + '</div>',
+                       { collapsed: true }
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+
+               // Synchronous - collapsed: true should cause instantHide: true to be used on initial collapsing
+               assert.assertTrue( $content.is( ':hidden' ), 'content is hidden' );
+
+               $collapsible.on( 'afterExpand.mw-collapsible', function () {
+                       assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' );
+                       QUnit.start();
+               } );
+
+               $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
+       } );
+
+       QUnit.test( 'premade toggler - options.linksPassthru' , 2, function ( assert ) {
+               var $collapsible, $content;
+
+               $collapsible = prepareCollapsible(
+                       '<div class="mw-collapsible">' +
+                               '<div class="mw-collapsible-toggle">' +
+                                       'Toggle <a href="#top">toggle</a> toggle <b>toggle</b>' +
+                               '</div>' +
+                               '<div class="mw-collapsible-content">' + loremIpsum + '</div>' +
+                       '</div>',
+                       // Can't do asynchronous because we're testing that the event *doesn't* happen
+                       { instantHide: true }
+               );
+               $content = $collapsible.find( '.mw-collapsible-content' );
+
+               $collapsible.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
+               assert.assertTrue( $content.is( ':visible' ), 'click event on link inside toggle passes through (content not toggled)' );
+
+               $collapsible.find( '.mw-collapsible-toggle b' ).trigger( 'click' );
+               assert.assertTrue( $content.is( ':hidden' ), 'click event on non-link inside toggle toggles content' );
+       } );
+
+}( mediaWiki, jQuery ) );
index 4b99c49..4353464 100644 (file)
@@ -5,6 +5,8 @@
                wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
                wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
                wgDefaultDateFormat: 'dmy',
+               wgSeparatorTransformTable: ['', ''],
+               wgDigitTransformTable: ['', ''],
                wgContentLanguage: 'en'
        };
 
                }
        );
 
-       QUnit.test( 'Test detection routine', function ( assert ) {
+       QUnit.test( 'Test detection routine', 1, function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable">' +
        } );
 
        /** FIXME: the diff output is not very readeable. */
-       QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {
+       QUnit.test( 'bug 32047 - caption must be before thead', 1, function ( assert ) {
                var $table;
                $table = $(
                        '<table class="sortable">' +
                );
        } );
 
-       QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
+       QUnit.test( 'data-sort-value attribute, when available, should override sorting position', 3, function ( assert ) {
                var $table, data;
 
                // Example 1: All cells except one cell without data-sort-value,
                }
        );
 
-       QUnit.test( 'Sorting images using alt text', function ( assert ) {
+       QUnit.test( 'Sorting images using alt text', 1, function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'Sorting images using alt text (complex)', function ( assert ) {
+       QUnit.test( 'Sorting images using alt text (complex)', 1, function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
                );
        } );
 
-       QUnit.test( 'Sorting images using alt text (with format autodetection)', function ( assert ) {
+       QUnit.test( 'Sorting images using alt text (with format autodetection)', 1, function ( assert ) {
                var $table = $(
                        '<table class="sortable">' +
                                '<tr><th>THEAD</th></tr>' +
index ce03b69..5fe2394 100644 (file)
 
                        var start = opt.before.start,
                                end = opt.before.end;
-                       if ( window.opera ) {
-                               // Compensate for Opera's craziness converting \n to \r\n and counting that as two chars
-                               var newLinesBefore = opt.before.text.substring( 0, start ).split( '\n' ).length - 1,
-                                       newLinesInside = opt.before.text.substring( start, end ).split( '\n' ).length - 1;
-                               start += newLinesBefore;
-                               end += newLinesBefore + newLinesInside;
-                       }
 
                        var options = $.extend( {}, opt.replace ); // Clone opt.replace
                        options.selectionStart = start;
index 9389651..ee854ae 100644 (file)
@@ -3,7 +3,7 @@
 
        // TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
 
-       QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
+       QUnit.test( '"all" namespace disable checkboxes', 8, function ( assert ) {
                var selectHtml, $env, $options;
 
                // from Special:Recentchanges
index 0a9df96..e0e823d 100644 (file)
@@ -1,20 +1,17 @@
 ( function ( mw, $ ) {
-       var mwLanguageCache = {}, oldGetOuterHtml, formatnumTests, specialCharactersPageName,
+       var mwLanguageCache = {}, formatText, formatParse, formatnumTests, specialCharactersPageName,
                expectedListUsers, expectedEntrypoints;
 
+       // When the expected result is the same in both modes
+       function assertBothModes( assert, parserArguments, expectedResult, assertMessage ) {
+               assert.equal( formatText.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'text\'' );
+               assert.equal( formatParse.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'parse\'' );
+       }
+
        QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( {
                setup: function () {
                        this.orgMwLangauge = mw.language;
                        mw.language = $.extend( true, {}, this.orgMwLangauge );
-                       oldGetOuterHtml = $.fn.getOuterHtml;
-                       $.fn.getOuterHtml = function () {
-                               var $div = $( '<div>' ), html;
-                               $div.append( $( this ).eq( 0 ).clone() );
-                               html = $div.html();
-                               $div.empty();
-                               $div = undefined;
-                               return html;
-                       };
 
                        // Messages that are reused in multiple tests
                        mw.messages.set( {
                                'external-link-replace': 'Foo [$1 bar]'
                        } );
 
+                       mw.config.set( {
+                               wgArticlePath: '/wiki/$1'
+                       } );
+
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
 
-                       expectedListUsers = '注册' + $( '<a>' ).attr( {
-                               title: 'Special:ListUsers',
-                               href: mw.util.wikiGetlink( 'Special:ListUsers' )
-                       } ).text( '用户' ).getOuterHtml();
+                       expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
 
                        expectedEntrypoints = '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>';
+
+                       formatText = mw.jqueryMsg.getMessageFunction( {
+                               format: 'text'
+                       } );
+
+                       formatParse = mw.jqueryMsg.getMessageFunction( {
+                               format: 'parse'
+                       } );
                },
                teardown: function () {
                        mw.language = this.orgMwLangauge;
-                       $.fn.getOuterHtml = oldGetOuterHtml;
                }
        } ) );
 
        }
 
        QUnit.test( 'Replace', 9, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction();
-
                mw.messages.set( 'simple', 'Foo $1 baz $2' );
 
-               assert.equal( parser( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
-               assert.equal( parser( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
-               assert.equal( parser( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
+               assert.equal( formatParse( 'simple' ), 'Foo $1 baz $2', 'Replacements with no substitutes' );
+               assert.equal( formatParse( 'simple', 'bar' ), 'Foo bar baz $2', 'Replacements with less substitutes' );
+               assert.equal( formatParse( 'simple', 'bar', 'quux' ), 'Foo bar baz quux', 'Replacements with all substitutes' );
 
                mw.messages.set( 'plain-input', '<foo foo="foo">x$1y&lt;</foo>z' );
 
                assert.equal(
-                       parser( 'plain-input', 'bar' ),
+                       formatParse( 'plain-input', 'bar' ),
                        '&lt;foo foo="foo"&gt;xbary&amp;lt;&lt;/foo&gt;z',
                        'Input is not considered html'
                );
                mw.messages.set( 'plain-replace', 'Foo $1' );
 
                assert.equal(
-                       parser( 'plain-replace', '<bar bar="bar">&gt;</bar>' ),
+                       formatParse( 'plain-replace', '<bar bar="bar">&gt;</bar>' ),
                        'Foo &lt;bar bar="bar"&gt;&amp;gt;&lt;/bar&gt;',
                        'Replacement is not considered html'
                );
                mw.messages.set( 'object-replace', 'Foo $1' );
 
                assert.equal(
-                       parser( 'object-replace', $( '<div class="bar">&gt;</div>' ) ),
+                       formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ) ),
                        'Foo <div class="bar">&gt;</div>',
                        'jQuery objects are preserved as raw html'
                );
 
                assert.equal(
-                       parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).get( 0 ) ),
+                       formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ).get( 0 ) ),
                        'Foo <div class="bar">&gt;</div>',
                        'HTMLElement objects are preserved as raw html'
                );
 
                assert.equal(
-                       parser( 'object-replace', $( '<div class="bar">&gt;</div>' ).toArray() ),
+                       formatParse( 'object-replace', $( '<div class="bar">&gt;</div>' ).toArray() ),
                        'Foo <div class="bar">&gt;</div>',
                        'HTMLElement[] arrays are preserved as raw html'
                );
 
                assert.equal(
-                       parser( 'external-link-replace', 'http://example.org/?x=y&z' ),
+                       formatParse( 'external-link-replace', 'http://example.org/?x=y&z' ),
                        'Foo <a href="http://example.org/?x=y&amp;z">bar</a>',
                        'Href is not double-escaped in wikilink function'
                );
        } );
 
        QUnit.test( 'Plural', 3, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction();
-
-               assert.equal( parser( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
-               assert.equal( parser( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
-               assert.equal( parser( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
+               assert.equal( formatParse( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
+               assert.equal( formatParse( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
+               assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
        } );
 
        QUnit.test( 'Gender', 11, function ( assert ) {
                // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
                // TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
-               var user = mw.user,
-                       parser = mw.jqueryMsg.getMessageFunction();
+               var user = mw.user;
 
                user.options.set( 'gender', 'male' );
                assert.equal(
-                       parser( 'gender-msg', 'Bob', 'male' ),
+                       formatParse( 'gender-msg', 'Bob', 'male' ),
                        'Bob: blue',
                        'Masculine from string "male"'
                );
                assert.equal(
-                       parser( 'gender-msg', 'Bob', user ),
+                       formatParse( 'gender-msg', 'Bob', user ),
                        'Bob: blue',
                        'Masculine from mw.user object'
                );
 
                user.options.set( 'gender', 'unknown' );
                assert.equal(
-                       parser( 'gender-msg', 'Foo', user ),
+                       formatParse( 'gender-msg', 'Foo', user ),
                        'Foo: green',
                        'Neutral from mw.user object' );
                assert.equal(
-                       parser( 'gender-msg', 'Alice', 'female' ),
+                       formatParse( 'gender-msg', 'Alice', 'female' ),
                        'Alice: pink',
                        'Feminine from string "female"' );
                assert.equal(
-                       parser( 'gender-msg', 'User' ),
+                       formatParse( 'gender-msg', 'User' ),
                        'User: green',
                        'Neutral when no parameter given' );
                assert.equal(
-                       parser( 'gender-msg', 'User', 'unknown' ),
+                       formatParse( 'gender-msg', 'User', 'unknown' ),
                        'User: green',
                        'Neutral from string "unknown"'
                );
                mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}}: $2 {{PLURAL:$2|edit|edits}}' );
 
                assert.equal(
-                       parser( 'gender-msg-one-form', 'male', 10 ),
+                       formatParse( 'gender-msg-one-form', 'male', 10 ),
                        'User: 10 edits',
                        'Gender neutral and plural form'
                );
                assert.equal(
-                       parser( 'gender-msg-one-form', 'female', 1 ),
+                       formatParse( 'gender-msg-one-form', 'female', 1 ),
                        'User: 1 edit',
                        'Gender neutral and singular form'
                );
 
                mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' );
                assert.equal(
-                       parser( 'gender-msg-lowercase', 'male' ),
+                       formatParse( 'gender-msg-lowercase', 'male' ),
                        'he is awesome',
                        'Gender masculine'
                );
                assert.equal(
-                       parser( 'gender-msg-lowercase', 'female' ),
+                       formatParse( 'gender-msg-lowercase', 'female' ),
                        'she is awesome',
                        'Gender feminine'
                );
 
                mw.messages.set( 'gender-msg-wrong', '{{gender}} test' );
                assert.equal(
-                       parser( 'gender-msg-wrong', 'female' ),
+                       formatParse( 'gender-msg-wrong', 'female' ),
                        ' test',
                        'Invalid syntax should result in {{gender}} simply being stripped away'
                );
        } );
 
        QUnit.test( 'Grammar', 2, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction();
-
-               assert.equal( parser( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
+               assert.equal( formatParse( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
 
                mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
-               assert.equal( parser( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
+               assert.equal( formatParse( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
        } );
 
        QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
        } );
 
        QUnit.test( 'Links', 6, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction(),
-                       expectedDisambiguationsText,
+               var expectedDisambiguationsText,
                        expectedMultipleBars,
                        expectedSpecialCharacters;
 
                 the bold was removed because it is not yet implemented.
                 */
 
-               assert.equal(
-                       parser( 'jquerymsg-test-statistics-users' ),
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-test-statistics-users' ),
                        expectedListUsers,
                        'Piped wikilink'
                );
 
                expectedDisambiguationsText = 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from ' +
-                       $( '<a>' ).attr( {
-                               title: 'MediaWiki:Disambiguationspage',
-                               href: mw.util.wikiGetlink( 'MediaWiki:Disambiguationspage' )
-                       } ).text( 'MediaWiki:Disambiguationspage' ).getOuterHtml() + '.';
+                       '<a title="MediaWiki:Disambiguationspage" href="/wiki/MediaWiki:Disambiguationspage">MediaWiki:Disambiguationspage</a>.';
+
                mw.messages.set( 'disambiguations-text', 'The following pages contain at least one link to a disambiguation page.\nThey may have to link to a more appropriate page instead.\nA page is treated as a disambiguation page if it uses a template that is linked from [[MediaWiki:Disambiguationspage]].' );
-               assert.equal(
-                       parser( 'disambiguations-text' ),
+               assert.htmlEqual(
+                       formatParse( 'disambiguations-text' ),
                        expectedDisambiguationsText,
                        'Wikilink without pipe'
                );
 
-               assert.equal(
-                       parser( 'jquerymsg-test-version-entrypoints-index-php' ),
+               assert.htmlEqual(
+                       formatParse( 'jquerymsg-test-version-entrypoints-index-php' ),
                        expectedEntrypoints,
                        'External link'
                );
                // Pipe trick is not supported currently, but should not parse as text either.
                mw.messages.set( 'pipe-trick', '[[Tampa, Florida|]]' );
                assert.equal(
-                       parser( 'pipe-trick' ),
+                       formatParse( 'pipe-trick' ),
                        'pipe-trick: Parse error at position 0 in input: [[Tampa, Florida|]]',
                        'Pipe trick should return error string.'
                );
 
-               expectedMultipleBars = $( '<a>' ).attr( {
-                       title: 'Main Page',
-                       href: mw.util.wikiGetlink( 'Main Page' )
-               } ).text( 'Main|Page' ).getOuterHtml();
+               expectedMultipleBars = '<a title="Main Page" href="/wiki/Main_Page">Main|Page</a>';
                mw.messages.set( 'multiple-bars', '[[Main Page|Main|Page]]' );
-               assert.equal(
-                       parser( 'multiple-bars' ),
+               assert.htmlEqual(
+                       formatParse( 'multiple-bars' ),
                        expectedMultipleBars,
                        'Bar in anchor'
                );
 
-               expectedSpecialCharacters = $( '<a>' ).attr( {
-                       title: specialCharactersPageName,
-                       href: mw.util.wikiGetlink( specialCharactersPageName )
-               } ).text( specialCharactersPageName ).getOuterHtml();
+               expectedSpecialCharacters = '<a title="&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?" href="/wiki/%22Who%22_wants_to_be_a_millionaire_%26_live_on_%27Exotic_Island%27%3F">&quot;Who&quot; wants to be a millionaire &amp; live on &#039;Exotic Island&#039;?</a>';
 
                mw.messages.set( 'special-characters', '[[' + specialCharactersPageName + ']]' );
-               assert.equal(
-                       parser( 'special-characters' ),
+               assert.htmlEqual(
+                       formatParse( 'special-characters' ),
                        expectedSpecialCharacters,
                        'Special characters'
                );
 
 // Tests that {{-transformation vs. general parsing are done as requested
        QUnit.test( 'Curly brace transformation', 14, function ( assert ) {
-               var formatText, formatParse, oldUserLang;
-
-               oldUserLang = mw.config.get( 'wgUserLanguage' );
-
-               formatText = mw.jqueryMsg.getMessageFunction( {
-                       format: 'text'
-               } );
-
-               formatParse = mw.jqueryMsg.getMessageFunction( {
-                       format: 'parse'
-               } );
-
-               // When the expected result is the same in both modes
-               function assertBothModes( parserArguments, expectedResult, assertMessage ) {
-                       assert.equal( formatText.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'text\'' );
-                       assert.equal( formatParse.apply( null, parserArguments ), expectedResult, assertMessage + ' when format is \'parse\'' );
-               }
+               var oldUserLang = mw.config.get( 'wgUserLanguage' );
 
-               assertBothModes( ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
+               assertBothModes( assert, ['gender-msg', 'Bob', 'male'], 'Bob: blue', 'gender is resolved' );
 
-               assertBothModes( ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
+               assertBothModes( assert, ['plural-msg', 5], 'Found 5 items', 'plural is resolved' );
 
-               assertBothModes( ['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( ['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
 
                        mw.messages.get( 'jquerymsg-test-statistics-users' ),
                        'Internal link message unchanged when format is \'text\''
                );
-               assert.equal(
+               assert.htmlEqual(
                        formatParse( 'jquerymsg-test-statistics-users' ),
                        expectedListUsers,
                        'Internal link message parsed when format is \'parse\''
                        mw.messages.get( 'jquerymsg-test-version-entrypoints-index-php' ),
                        'External link message unchanged when format is \'text\''
                );
-               assert.equal(
+               assert.htmlEqual(
                        formatParse( 'jquerymsg-test-version-entrypoints-index-php' ),
                        expectedEntrypoints,
                        'External link message processed when format is \'parse\''
                        'Foo [http://example.com bar]',
                        'External link message only substitutes parameter when format is \'text\''
                );
-               assert.equal(
+               assert.htmlEqual(
                        formatParse( 'external-link-replace', 'http://example.com' ),
                        'Foo <a href="http://example.com">bar</a>',
                        'External link message processed when format is \'parse\''
        } );
 
        QUnit.test( 'Int', 4, function ( assert ) {
-               var parser = mw.jqueryMsg.getMessageFunction(),
-                       newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Helppage}}|help page]] for more info). If you are here by mistake, click your browser\'s back button.',
-                       expectedNewarticletext;
+               var newarticletextSource = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the [[{{Int:Helppage}}|help page]] for more info). If you are here by mistake, click your browser\'s back button.',
+                       expectedNewarticletext,
+                       helpPageTitle = 'Help:Contents';
 
-               mw.messages.set( 'helppage', 'Help:Contents' );
+               mw.messages.set( 'helppage', helpPageTitle );
 
                expectedNewarticletext = 'You have followed a link to a page that does not exist yet. To create the page, start typing in the box below (see the ' +
-                       $( '<a>' ).attr( {
-                               title: mw.msg( 'helppage' ),
-                               href: mw.util.wikiGetlink( mw.msg( 'helppage' ) )
-                       } ).text( 'help page' ).getOuterHtml() + ' for more info). If you are here by mistake, click your browser\'s back button.';
+                       '<a title="Help:Contents" href="/wiki/Help:Contents">help page</a> for more info). If you are here by mistake, click your browser\'s back button.';
 
                mw.messages.set( 'newarticletext', newarticletextSource );
 
-               assert.equal(
-                       parser( 'newarticletext' ),
+               assert.htmlEqual(
+                       formatParse( 'newarticletext' ),
                        expectedNewarticletext,
                        'Link with nested message'
                );
 
                assert.equal(
-                       parser( 'see-portal-url' ),
+                       formatParse( 'see-portal-url' ),
                        'Project:Community portal is an important community page.',
                        'Nested message'
                );
                mw.messages.set( 'newarticletext-lowercase',
                        newarticletextSource.replace( 'Int:Helppage', 'int:helppage' ) );
 
-               assert.equal(
-                       parser( 'newarticletext-lowercase' ),
+               assert.htmlEqual(
+                       formatParse( 'newarticletext-lowercase' ),
                        expectedNewarticletext,
                        'Link with nested message, lowercase include'
                );
                mw.messages.set( 'uses-missing-int', '{{int:doesnt-exist}}' );
 
                assert.equal(
-                       parser( 'uses-missing-int' ),
+                       formatParse( 'uses-missing-int' ),
                        '[doesnt-exist]',
                        'int: where nested message does not exist'
                );
@@ -596,4 +566,149 @@ QUnit.test( 'formatnum', formatnumTests.length, function ( assert ) {
        } );
 } );
 
+// HTML in wikitext
+QUnit.test( 'HTML', 26, 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' );
+
+       mw.messages.set( 'jquerymsg-bold-msg', '<b>Strong</b> speaker' );
+       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' );
+
+       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' );
+
+       mw.messages.set( 'jquerymsg-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' );
+
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-italics-with-link' ),
+               'An <i>italicized <a title="link" href="' + mw.html.escape( mw.util.wikiGetlink( 'link' ) ) + '">wiki-link</i>',
+               'Italics with link inside in parse mode'
+       );
+
+       assert.equal(
+               formatText( 'jquerymsg-italics-with-link' ),
+               mw.messages.get( 'jquerymsg-italics-with-link' ),
+               'Italics with link unchanged in text mode'
+       );
+
+       mw.messages.set( 'jquerymsg-italics-id-class', '<i id="foo" class="bar">Foo</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-italics-id-class' ),
+               mw.messages.get( 'jquerymsg-italics-id-class' ),
+               'ID and class are allowed'
+       );
+
+       mw.messages.set( 'jquerymsg-italics-onclick', '<i onclick="alert(\'foo\')">Foo</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-italics-onclick' ),
+               '&lt;i onclick=&quot;alert(\'foo\')&quot;&gt;Foo&lt;/i&gt;',
+               'element with onclick is escaped because it is not allowed'
+       );
+
+       mw.messages.set( 'jquerymsg-script-msg', '<script  >alert( "Who put this tag here?" );</script>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-script-msg' ),
+               '&lt;script  &gt;alert( &quot;Who put this tag here?&quot; );&lt;/script&gt;',
+               'Tag outside whitelist escaped in parse mode'
+       );
+
+       assert.equal(
+               formatText( 'jquerymsg-script-msg' ),
+               mw.messages.get( 'jquerymsg-script-msg' ),
+               'Tag outside whitelist unchanged in text mode'
+       );
+
+       mw.messages.set( 'jquerymsg-script-link-msg', '<script>[[Foo|bar]]</script>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-script-link-msg' ),
+               '&lt;script&gt;<a title="Foo" href="' + mw.html.escape( mw.util.wikiGetlink( 'Foo' ) ) + '">bar</a>&lt;/script&gt;',
+               'Script tag text is escaped because that element is not allowed, but link inside is still HTML'
+       );
+
+       mw.messages.set( 'jquerymsg-mismatched-html', '<i class="important">test</b>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-mismatched-html' ),
+               '&lt;i class=&quot;important&quot;&gt;test&lt;/b&gt;',
+               '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>',
+               '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>',
+               'Non-whitelisted HTML tag in external link anchor treated as text'
+       );
+
+       // Intentionally not using htmlEqual for the quote tests
+       mw.messages.set( 'jquerymsg-double-quotes-preserved', '<i id="double">Double</i>' );
+       assert.equal(
+               formatParse( 'jquerymsg-double-quotes-preserved' ),
+               mw.messages.get( 'jquerymsg-double-quotes-preserved' ),
+               'Attributes with double quotes are preserved as such'
+       );
+
+       mw.messages.set( 'jquerymsg-single-quotes-normalized-to-double', '<i id=\'single\'>Single</i>' );
+       assert.equal(
+               formatParse( 'jquerymsg-single-quotes-normalized-to-double' ),
+               '<i id="single">Single</i>',
+               'Attributes with single quotes are normalized to double'
+       );
+
+       mw.messages.set( 'jquerymsg-escaped-double-quotes-attribute', '<i style="font-family:&quot;Arial&quot;">Styled</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-escaped-double-quotes-attribute' ),
+               mw.messages.get( 'jquerymsg-escaped-double-quotes-attribute' ),
+               'Escaped attributes are parsed correctly'
+       );
+
+       mw.messages.set( 'jquerymsg-escaped-single-quotes-attribute', '<i style=\'font-family:&#039;Arial&#039;\'>Styled</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-escaped-single-quotes-attribute' ),
+               mw.messages.get( 'jquerymsg-escaped-single-quotes-attribute' ),
+               'Escaped attributes are parsed correctly'
+       );
+
+
+       mw.messages.set( 'jquerymsg-wikitext-contents-parsed', '<i>[http://example.com Example]</i>' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-wikitext-contents-parsed' ),
+               '<i><a href="http://example.com">Example</a></i>',
+               'Contents of valid tag are treated as wikitext, so external link is parsed'
+       );
+
+       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>',
+               'Contents of valid tag are treated as wikitext, so invalid HTML element is treated as text'
+       );
+
+       mw.messages.set( 'jquerymsg-unclosed-tag', 'Foo<tag>bar' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-unclosed-tag' ),
+               'Foo&lt;tag&gt;bar',
+               'Nonsupported unclosed tags are escaped'
+       );
+
+       mw.messages.set( 'jquerymsg-self-closing-tag', 'Foo<tag/>bar' );
+       assert.htmlEqual(
+               formatParse( 'jquerymsg-self-closing-tag' ),
+               'Foo&lt;tag/&gt;bar',
+               'Self-closing tags don\'t cause a parse error'
+       );
+} );
+
 }( mediaWiki, jQuery ) );
index e8663f8..73dcf34 100644 (file)
                                'gender-plural-msg': '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome',
                                'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
                                'formatnum-msg': '{{formatnum:$1}}',
-                               'int-msg': 'Some {{int:other-message}}'
+                               'int-msg': 'Some {{int:other-message}}',
+                               'mediawiki-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+                               'external-link-replace': 'Foo [$1 bar]'
                        } );
 
-                       // For formatnum tests
-                       mw.config.set( 'wgUserLanguage', 'en' );
+                       mw.config.set( {
+                               wgArticlePath: '/wiki/$1',
+
+                               // For formatnum tests
+                               wgUserLanguage: 'en'
+                       } );
 
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
                }
                assert.ok( mw.config instanceof mw.Map, 'mw.config instance of mw.Map' );
        } );
 
-       QUnit.test( 'mw.message & mw.messages', 54, function ( assert ) {
+       QUnit.test( 'mw.message & mw.messages', 83, function ( assert ) {
                var goodbye, hello;
 
                // Convenience method for asserting the same result for multiple formats
                assert.equal( hello.escaped(), 'Hello &lt;b&gt;awesome&lt;/b&gt; world', 'Message.escaped returns the escaped message' );
                assert.equal( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
 
-               assert.ok( mw.messages.set( 'escaped-with-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ) );
-               assert.equal( mw.message( 'escaped-with-curly-brace' ).escaped(), mw.html.escape( '"' + mw.config.get( 'wgSiteName' ) + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
+               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'], '"' + mw.config.get( 'wgSiteName') + '" 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( '"' + mw.config.get( 'wgSiteName') + '" 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' );
+               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' );
 
-               assert.ok( mw.messages.set( 'escaped-with-square-brackets', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ) );
-               assert.equal( mw.message( 'escaped-with-square-brackets' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
+               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' );
+               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' );
 
                hello.parse();
                assert.equal( hello.format, 'parse', 'Message.parse correctly updated the "format" property' );
                assert.ok( mw.messages.set( 'mediawiki-test-categorytree-collapse-bullet', '[<b>−</b>]' ), 'mw.messages.set: Register' );
                assert.equal( mw.message( 'mediawiki-test-categorytree-collapse-bullet' ).plain(), mw.messages.get( 'mediawiki-test-categorytree-collapse-bullet' ), 'Single square brackets unchanged in plain mode' );
 
-               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>)' ) );
+               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( ['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' );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-italics-msg' ).escaped(),
+                       '&lt;i&gt;Very&lt;/i&gt; important',
+                       'Italics are escaped in escaped mode'
+               );
+
+               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' );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-italics-with-link' ).escaped(),
+                       'An &lt;i&gt;italicized [[link|wiki-link]]&lt;/i&gt;',
+                       'Italics and link unchanged except for escaping in escaped mode'
+               );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-italics-with-link' ).parse(),
+                       'An <i>italicized <a title="link" href="' + mw.util.wikiGetlink( 'link' ) + '">wiki-link</i>',
+                       'Italics with link inside in parse mode'
+               );
+
+               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' );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-script-msg' ).escaped(),
+                       '&lt;script  &gt;alert( "Who put this script here?" );&lt;/script&gt;',
+                       'Script escaped when using escaped format'
+               );
+               assert.htmlEqual(
+                       mw.message( 'mediawiki-script-msg' ).parse(),
+                       '&lt;script  &gt;alert( "Who put this script here?" );&lt;/script&gt;',
+                       'Script escaped when using parse format'
+               );
+
+
        } );
 
        QUnit.test( 'mw.msg', 14, function ( assert ) {
                assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
                assert.equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
 
-               assert.ok( mw.messages.set( 'plural-item', 'Found $1 {{PLURAL:$1|item|items}}' ) );
+               assert.ok( mw.messages.set( 'plural-item' , 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
                assert.equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
                assert.equal( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
                assert.equal( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );
        function assertStyleAsync( assert, $element, prop, val, fn ) {
                var styleTestStart,
                        el = $element.get( 0 ),
-                       styleTestTimeout = ( QUnit.config.testTimeout - 200 ) || 5000;
+                       styleTestTimeout = ( QUnit.config.testTimeout || 5000 ) - 200;
 
                function isCssImportApplied() {
                        // Trigger reflow, repaint, redraw, whatever (cross-browser)
                } );
        } );
 
-       QUnit.test( 'mw.loader.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
+       QUnit.asyncTest( 'mw.loader.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
                var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
 
                assert.notEqual(
                mw.loader.implement(
                        'test.implement.a',
                        function () {
-                               QUnit.stop();
-                               setTimeout(function () {
-                                       assert.equal(
-                                               $element.css( 'float' ),
-                                               'right',
-                                               'style is applied'
-                                       );
-                                       QUnit.start();
-                               });
+                               assert.equal(
+                                       $element.css( 'float' ),
+                                       'right',
+                                       'style is applied'
+                               );
+                               QUnit.start();
                        },
                        {
                                'all': '.mw-test-implement-a { float: right; }'
                ] );
        } );
 
-// Backwards compatibility
-       QUnit.test( 'mw.loader.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
+       // Backwards compatibility
+       QUnit.asyncTest( 'mw.loader.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
                var $element = $( '<div class="mw-test-implement-c"></div>' ).appendTo( '#qunit-fixture' );
 
                assert.notEqual(
                mw.loader.implement(
                        'test.implement.c',
                        function () {
-                               QUnit.stop();
-                               setTimeout(function () {
-                                       assert.equal(
-                                               $element.css( 'float' ),
-                                               'right',
-                                               'style is applied'
-                                       );
-                                       QUnit.start();
-                               });
+                               assert.equal(
+                                       $element.css( 'float' ),
+                                       'right',
+                                       'style is applied'
+                               );
+                               QUnit.start();
                        },
                        {
                                'all': '.mw-test-implement-c { float: right; }'
                ] );
        } );
 
-// Backwards compatibility
+       // Backwards compatibility
        QUnit.asyncTest( 'mw.loader.implement( styles={ <media>: [url, ..] } ) (back-compat)', 4, function ( assert ) {
                var $element = $( '<div class="mw-test-implement-d"></div>' ).appendTo( '#qunit-fixture' ),
                        $element2 = $( '<div class="mw-test-implement-d2"></div>' ).appendTo( '#qunit-fixture' );
                ] );
        } );
 
-// @import (bug 31676)
+       // @import (bug 31676)
        QUnit.asyncTest( 'mw.loader.implement( styles has @import)', 5, function ( assert ) {
                var isJsExecuted, $element;
 
 
        } );
 
+       QUnit.test( 'mw.hook', 10, function ( assert ) {
+               var hook, add, fire, chars, callback;
+
+               mw.hook( 'test.hook.unfired' ).add( function () {
+                       assert.ok( false, 'Unfired hook' );
+               } );
+
+               mw.hook( 'test.hook.basic' ).add( function () {
+                       assert.ok( true, 'Basic callback' );
+               } );
+               mw.hook( 'test.hook.basic' ).fire();
+
+               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)' );
+               } );
+               mw.hook( 'test.hook.data' ).fire( 'example', ['two'] );
+
+               mw.hook( 'test.hook.chainable' ).add( function () {
+                       assert.ok( true, 'Chainable' );
+               } ).fire();
+
+               hook = mw.hook( 'test.hook.detach' );
+               add = hook.add;
+               fire = hook.fire;
+               add( function ( x, y ) {
+                       assert.deepEqual( [x, y], ['x', 'y'], 'Detached (contextless) with data' );
+               } );
+               fire( 'x', 'y' );
+
+               mw.hook( 'test.hook.fireBefore' ).fire().add( function () {
+                       assert.ok( true, 'Invoke handler right away if it was fired before' );
+               } );
+
+               mw.hook( 'test.hook.fireTwiceBefore' ).fire().fire().add( function () {
+                       assert.ok( true, 'Invoke handler right away if it was fired before (only last one)' );
+               } );
+
+               chars = [];
+
+               mw.hook( 'test.hook.many' )
+                       .add( function ( chr ) {
+                               chars.push( chr );
+                       } )
+                       .fire( 'x' ).fire( 'y' ).fire( 'z' )
+                       .add( function ( chr ) {
+                               assert.equal( chr, 'z', 'Adding callback later invokes right away with last data' );
+                       } );
+
+               assert.deepEqual( chars, ['x', 'y', 'z'], 'Multiple callbacks with multiple fires' );
+
+               chars = [];
+               callback = function ( chr ) {
+                       chars.push( chr );
+               };
+
+               mw.hook( 'test.hook.variadic' )
+                       .add(
+                               callback,
+                               callback,
+                               function ( chr ) {
+                                       chars.push( chr );
+                               },
+                               callback
+                       )
+                       .fire( 'x' )
+                       .remove(
+                               function () {
+                                       'not-added';
+                               },
+                               callback
+                       )
+                       .fire( 'y' )
+                       .remove( callback )
+                       .fire( 'z' );
+
+               assert.deepEqual(
+                       chars,
+                       ['x', 'x', 'x', 'x', 'y', 'z'],
+                       '"add" and "remove" support variadic arguments. ' +
+                               '"add" does not filter unique. ' +
+                               '"remove" removes all equal by reference. ' +
+                               '"remove" is silent if the function is not found'
+               );
+       } );
+
 }( mediaWiki, jQuery ) );
index bba3160..713ec4b 100644 (file)
@@ -1,5 +1,13 @@
 ( function ( mw, $ ) {
-       QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment() );
+       QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.taPrefix = mw.util.tooltipAccessKeyPrefix;
+                       mw.util.tooltipAccessKeyPrefix = 'ctrl-alt-';
+               },
+               teardown: function () {
+                       mw.util.tooltipAccessKeyPrefix = this.taPrefix;
+               }
+       } ) );
 
        QUnit.test( 'rawurlencode', 1, function ( assert ) {
                assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
                assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
        } );
 
-       QUnit.test( 'tooltipAccessKey', 3, function ( assert ) {
-               assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'mw.util.tooltipAccessKeyPrefix must be a string' );
-               assert.ok( mw.util.tooltipAccessKeyRegexp instanceof RegExp, 'mw.util.tooltipAccessKeyRegexp instance of RegExp' );
-               assert.ok( mw.util.updateTooltipAccessKeys, 'mw.util.updateTooltipAccessKeys' );
+       QUnit.test( 'tooltipAccessKey', 4, function ( assert ) {
+               assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'tooltipAccessKeyPrefix must be a string' );
+               assert.equal( $.type( mw.util.tooltipAccessKeyRegexp ), 'regexp', 'tooltipAccessKeyRegexp is a regexp' );
+               assert.ok( mw.util.updateTooltipAccessKeys, 'updateTooltipAccessKeys is non-empty' );
+
+               'Example [a]'.replace( mw.util.tooltipAccessKeyRegexp, function ( sub, m1, m2, m3, m4, m5, m6 ) {
+                       assert.equal( m6, 'a', 'tooltipAccessKeyRegexp finds the accesskey hint' );
+               } );
        } );
 
        QUnit.test( '$content', 2, function ( assert ) {
         * Previously, test elements where invisible to the selector since only
         * one element can have a given id.
         */
-       QUnit.test( 'addPortletLink', 8, function ( assert ) {
+       QUnit.test( 'addPortletLink', 10, function ( assert ) {
                var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo;
 
                pTestTb = '\
                $( '#qunit-fixture' ).append( pTestTb, pCustom, vectorTabs );
 
                tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
-                       'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l' );
+                       'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l'
+               );
 
                assert.ok( $.isDomElement( tbRL ), 'addPortletLink returns a valid DOM Element according to $.isDomElement' );
 
                        'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', tbRL );
                $tbMW = $( tbMW );
 
+               assert.propEqual(
+                       $tbMW.getAttrs(),
+                       {
+                               id: 't-mworg'
+                       },
+                       'Validate attributes of created element'
+               );
+
+               assert.propEqual(
+                       $tbMW.find( 'a' ).getAttrs(),
+                       {
+                               href: '//mediawiki.org/',
+                               title: 'Go to MediaWiki.org [ctrl-alt-m]',
+                               accesskey: 'm'
+                       },
+                       'Validate attributes of anchor tag in created element'
+               );
 
-               assert.equal( $tbMW.attr( 'id' ), 't-mworg', 'Link has correct ID set' );
                assert.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
                assert.equal( $tbMW.next().attr( 'id' ), 't-rl', 'Link is in the correct position (by passing nextnode)' );
 
-               cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux' );
+               cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
 
+               assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [ctrl-alt-q]', 'Existing accesskey is stripped and updated' );
+
                assert.equal(
                        $( '#p-test-custom #c-barmenu ul li' ).length,
                        1,
diff --git a/tests/qunit/suites/resources/startup.test.js b/tests/qunit/suites/resources/startup.test.js
new file mode 100644 (file)
index 0000000..57825c5
--- /dev/null
@@ -0,0 +1,126 @@
+/*global isCompatible: true */
+( function ( $ ) {
+       var testcases = {
+               // Supported: Compatible
+               gradeA: [
+                       // Chrome
+                       'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.205 Safari/534.16',
+                       // Firefox 4+
+                       'Mozilla/5.0 (Windows NT 6.1.1; rv:5.0) Gecko/20100101 Firefox/5.0',
+                       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
+                       'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4) Gecko/2012010317 Firefox/10.0a4',
+                       'Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0',
+                       'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1',
+                       // Kindle Fire
+                       'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1',
+                       // Safari 5.0+
+                       'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 10_6_7; ru-ru) AppleWebKit/534.31+ (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
+                       // Opera 11+
+                       'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10',
+                       // Internet Explorer 6+
+                       'Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)',
+                       'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)',
+                       'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)',
+                       'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
+                       'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
+                       // IE Mobile
+                       'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)',
+                       // BlackBerry 6+
+                       'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.570 Mobile Safari/534.8+',
+                       'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+',
+                       'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.386 Mobile Safari/537.3+',
+                       // Open WebOS 1.4+ (HP Veer 4G)
+                       'Mozilla/5.0 (webOS/2.1.2; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 P160UNA/1.0',
+                       // Firefox Mobile
+                       'Mozilla/5.0 (Mobile; rv:14.0) Gecko/14.0 Firefox/14.0',
+                       // iOS
+                       'Mozilla/5.0 (ipod: U;CPU iPhone OS 2_2 like Mac OS X: es_es) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3',
+                       'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3',
+                       // Android
+                       'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17'
+               ],
+               // Supported: Uncompatible, serve basic content
+               gradeB: [
+                       // Internet Explorer < 6
+                       'Mozilla/2.0 (compatible; MSIE 3.03; Windows 3.1)',
+                       'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)',
+                       'Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;)',
+                       'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
+                       // Firefox < 3.6
+                       'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2',
+                       'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.1) Gecko/20070311 Firefox/2.0.0.1',
+                       // BlackBerry < 6
+                       'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133',
+                       'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1',
+                       // Open WebOS < 1.5 (Palm Pre, Palm Pixi)
+                       'Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0',
+                       'Mozilla/5.0 (webOS/1.4.0; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pixi/1.1 ',
+                       // SymbianOS
+                       'NokiaN95_8GB-3;Mozilla/5.0 SymbianOS/9.2;U;Series60/3.1 NokiaN95_8GB-3/11.2.011 Profile/MIDP-2.0 Configuration/CLDC-1.1 AppleWebKit/413 (KHTML, like Gecko)',
+                       'Nokia7610/2.0 (5.0509.0) SymbianOS/7.0s Series60/2.1 Profile/MIDP-2.0 Configuration/CLDC-1.0 ',
+                       'Mozilla/5.0 (SymbianOS/9.1; U; [en]; SymbianOS/91 Series60/3.0) AppleWebKit/413 (KHTML, like Gecko) Safari/413',
+                       'Mozilla/5.0 (SymbianOS/9.3; Series60/3.2 NokiaE52-2/091.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.34 Mobile Safari/533.4',
+                       // NetFront
+                       'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)',
+                       'Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 824x1200; rotate)',
+                       'Mozilla/4.08 (Windows; Mobile Content Viewer/1.0) NetFront/3.2',
+                       // Opera Mini
+                       'Opera/9.80 (J2ME/MIDP; Opera Mini/3.1.10423/22.387; U; en) Presto/2.5.25 Version/10.54',
+                       'Opera/9.50 (J2ME/MIDP; Opera Mini/4.0.10031/298; U; en)',
+                       'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/26.1305; U; en) Presto/2.8.119 Version/10.54',
+                       'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10'
+               ],
+               // No explicit support for or against these browsers, they're
+               // given a shot at Grade A at their own risk.
+               gradeX: [
+                       // Firefox 3.6
+                       'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
+                       // Gecko
+                       'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060928 (Debian|Debian-1.8.0.7-1) Epiphany/2.14',
+                       'Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.6) Gecko/20070817 IceWeasel/2.0.0.6-g2',
+                       // KHTML
+                       'Mozilla/5.0 (compatible; Konqueror/4.3; Linux) KHTML/4.3.5 (like Gecko)',
+                       // Text browsers
+                       'Links (2.1pre33; Darwin 8.11.0 Power Macintosh; x)',
+                       'Links (6.9; Unix 6.9-astral sparc; 80x25)',
+                       'Lynx/2.8.6rel.4 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8g',
+                       'w3m/0.5.1',
+                       // Bots
+                       'Googlebot/2.1 (+http://www.google.com/bot.html)',
+                       'Mozilla/5.0 (compatible; googlebot/2.1; +http://www.google.com/bot.html)',
+                       'Mozilla/5.0 (compatible; YandexBot/3.0)',
+                       // Scripts
+                       'curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5',
+                       'Wget/1.9',
+                       'Wget/1.10.1 (Red Hat modified)',
+                       // Unknown
+                       'I\'m an unknown browser',
+                       // Empty
+                       ''
+               ]
+       };
+
+       QUnit.module( 'startup', QUnit.newMwEnvironment() );
+
+       QUnit.test( 'isCompatible( Grade A )', testcases.gradeA.length, function ( assert ) {
+               $.each( testcases.gradeA, function ( i, ua ) {
+                               assert.strictEqual( isCompatible( ua ), true, ua );
+                       }
+               );
+       } );
+
+       QUnit.test( 'isCompatible( Grade B )', testcases.gradeB.length, function ( assert ) {
+               $.each( testcases.gradeB, function ( i, ua ) {
+                               assert.strictEqual( isCompatible( ua ), false, ua );
+                       }
+               );
+       } );
+
+       QUnit.test( 'isCompatible( Grade X )', testcases.gradeX.length, function ( assert ) {
+               $.each( testcases.gradeX, function ( i, ua ) {
+                               assert.strictEqual( isCompatible( ua ), true, ua );
+                       }
+               );
+       } );
+
+}( jQuery ) );
index 07f9867..935d692 100644 (file)
@@ -4,7 +4,7 @@
  * This is implemented as a singleton.
  */
 
-require( 'Testing/Selenium.php' );
+require 'Testing/Selenium.php';
 
 class Selenium {
        protected static $_instance = null;
index 8d5e771..1a860f4 100644 (file)
@@ -2,8 +2,8 @@
 
 class SeleniumLoader {
        static function load() {
-               require_once( 'Testing/Selenium.php' );
-               require_once( 'PHPUnit/Framework.php' );
-               require_once( 'PHPUnit/Extensions/SeleniumTestCase.php' );
+               require_once 'Testing/Selenium.php';
+               require_once 'PHPUnit/Framework.php';
+               require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
        }
 }
index 9efa509..1a1ee00 100644 (file)
@@ -214,7 +214,7 @@ class SeleniumServerManager {
                                        }
                                }
                                wfRestoreWarnings();
-                               echo ( "Starting Selenium server timed out.\n" );
+                               echo "Starting Selenium server timed out.\n";
                                return 'failed';
                        } else {
                                // server already running.
index 5346b1b..a2676ca 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-include( "SeleniumTestConstants.php" );
+include 'SeleniumTestConstants.php';
 
 class SeleniumTestCase extends PHPUnit_Framework_TestCase { // PHPUnit_Extensions_SeleniumTestCase
        protected $selenium;
index 21332cf..2d4e964 100644 (file)
@@ -3,7 +3,7 @@
 class SeleniumTestHTMLLogger {
        public function setHeaders() {
                global $wgOut;
-               $wgOut->addHeadItem( 'selenium', '<style type="text/css">
+               $wgOut->addHeadItem( 'selenium', '<style>
                .selenium pre {
                        overflow-x: auto; /* Use horizontal scroller if needed; for Firefox 2, not needed in Firefox 3 */
                        white-space: pre-wrap; /* css-3 */
index 4583360..9c060fa 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 30 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 6375d66..117e5c8 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 04 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index fad4e06..ed08928 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 02 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 37f5af2..da10eec 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 09 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 536ceb6..3b2f012 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 10 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index f0efce6..f7f5910 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 29 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index a9a8fc3..472d2ed 100644 (file)
@@ -24,9 +24,9 @@
  */
 
 require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
-require_once ( __DIR__ . '/MediaWikiInstallationConfig.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationMessage.php' );
-require_once ( __DIR__ . '/MediaWikiInstallationVariables.php' );
+require_once __DIR__ . '/MediaWikiInstallationConfig.php';
+require_once __DIR__ . '/MediaWikiInstallationMessage.php';
+require_once __DIR__ . '/MediaWikiInstallationVariables.php';
 
 class MediaWikiInstallationCommonFunction extends PHPUnit_Extensions_SeleniumTestCase {
        function setUp() {
index 6946cc7..e32a9e6 100644 (file)
@@ -29,19 +29,19 @@ if ( PHP_SAPI != 'cli' ) {
 
 require_once 'PHPUnit/Framework/TestSuite.php';
 
-require_once ( __DIR__ . '/MediaWikiUserInterfaceTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiButtonsAvailabilityTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiHelpFieldHintTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiRightFrameworkLinksTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiRestartInstallationTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiErrorsConnectToDatabasePageTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiErrorsNamepageTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiMySQLDataBaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiMySQLiteDataBaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiUpgradeExistingDatabaseTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiDifferntDatabasePrefixTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiDifferentDatabaseAccountTestCase.php' );
-require_once ( __DIR__ . '/MediaWikiOnAlreadyInstalledTestCase.php' );
+require_once __DIR__ . '/MediaWikiUserInterfaceTestCase.php';
+require_once __DIR__ . '/MediaWikiButtonsAvailabilityTestCase.php';
+require_once __DIR__ . '/MediaWikiHelpFieldHintTestCase.php';
+require_once __DIR__ . '/MediaWikiRightFrameworkLinksTestCase.php';
+require_once __DIR__ . '/MediaWikiRestartInstallationTestCase.php';
+require_once __DIR__ . '/MediaWikiErrorsConnectToDatabasePageTestCase.php';
+require_once __DIR__ . '/MediaWikiErrorsNamepageTestCase.php';
+require_once __DIR__ . '/MediaWikiMySQLDataBaseTestCase.php';
+require_once __DIR__ . '/MediaWikiMySQLiteDataBaseTestCase.php';
+require_once __DIR__ . '/MediaWikiUpgradeExistingDatabaseTestCase.php';
+require_once __DIR__ . '/MediaWikiDifferntDatabasePrefixTestCase.php';
+require_once __DIR__ . '/MediaWikiDifferentDatabaseAccountTestCase.php';
+require_once __DIR__ . '/MediaWikiOnAlreadyInstalledTestCase.php';
 
 $suite = new PHPUnit_Framework_TestSuite( 'ArrayTest' );
 $result = new PHPUnit_Framework_TestResult;
index 92f26d0..823bb8c 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 01 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index e9be370..11d0437 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 06 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index ce27500..6c77dee 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 
 /**
index f34210c..1a026f1 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 11, 12 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 039d71a..709085f 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 14, 15, 16, 17 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index cd901d1..0f969b7 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 05 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 9733152..71ef684 100644 (file)
@@ -23,7 +23,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once ( __DIR__ . '/MediaWikiInstallationCommonFunction.php' );
+require_once __DIR__ . '/MediaWikiInstallationCommonFunction.php';
 
 /**
  * Test Case ID   : 18 - 27 (http://www.mediawiki.org/wiki/New_installer/Test_plan)
index 2803ff2..1237bb5 100644 (file)
@@ -105,8 +105,6 @@ class AddContentToNewPageTestCase extends SeleniumTestCase {
 
        // Add level 2 headline and verify output in the preview
        public function testAddLevel2HeadLine() {
-               $blnElementPresent = false;
-               $blnTextPresent = false;
                $this->getExistingPage();
                $this->clickEditLink();
                $this->loadWikiEditor();
index 446836a..9fe6fb8 100644 (file)
@@ -3,7 +3,7 @@
  * Sample test suite.
  * Two ways to configure MW for these tests
  * 1) If you are running multiple test suites, add the following in LocalSettings.php
- * require_once("tests/selenium/SimpleSeleniumConfig.php");
+ * require_once "tests/selenium/SimpleSeleniumConfig.php";
  * $wgSeleniumTestConfigs['SimpleSeleniumTestSuite'] = 'SimpleSeleniumConfig::getSettings';
  * OR
  * 2) Add the following to your Localsettings.php
index 02fcf24..88e5885 100644 (file)
  * @ingroup Testing
  */
 
-class TestRecorder {
+/**
+ * Interface to record parser test results.
+ *
+ * The ITestRecorder is a very simple interface to record the result of
+ * MediaWiki parser tests. One should call start() before running the
+ * full parser tests and end() once all the tests have been finished.
+ * After each test, you should use record() to keep track of your tests
+ * results. Finally, report() is used to generate a summary of your
+ * test run, one could dump it to the console for human consumption or
+ * register the result in a database for tracking purposes.
+ *
+ * @since 1.22
+ */
+interface ITestRecorder {
+
+       /** Called at beginning of the parser test run */
+       public function start();
+
+       /** Called after each test */
+       public function record( $test, $result );
+
+       /** Called before finishing the test run */
+       public function report();
+
+       /** Called at the end of the parser test run */
+       public function end();
+
+}
+
+class TestRecorder implements ITestRecorder {
        var $parent;
        var $term;
 
@@ -481,7 +510,7 @@ class TestFileIterator implements Iterator {
                                        return true;
                                }
 
-                               if ( isset ( $this->sectionData[$this->section] ) ) {
+                               if ( isset( $this->sectionData[$this->section] ) ) {
                                        throw new MWException( "duplicate section '$this->section' at line {$this->lineNum} of $this->file\n" );
                                }
 
index ede30e6..4a0c9fb 100644 (file)
--- a/thumb.php
+++ b/thumb.php
  */
 
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
-if ( isset( $_SERVER['MW_COMPILED'] ) ) {
-       require( 'core/includes/WebStart.php' );
-} else {
-       require( __DIR__ . '/includes/WebStart.php' );
-}
+require __DIR__ . '/includes/WebStart.php';
 
 // Don't use fancy mime detection, just check the file extension for jpg/gif/png
 $wgTrivialMimeDetection = true;
@@ -126,7 +122,7 @@ function wfStreamThumb( array $params ) {
                $img = new UnregisteredLocalFile( null, $repo,
                        # Temp files are hashed based on the name without the timestamp.
                        # The thumbnails will be hashed based on the entire name however.
-                       # @TODO: fix this convention to actually be reasonable.
+                       # @todo fix this convention to actually be reasonable.
                        $repo->getZonePath( 'public' ) . '/' . $repo->getTempHashPath( $fileName ) . $fileName
                );
        } elseif ( $isOld ) {
index 69bdddd..7afa9aa 100644 (file)
@@ -26,4 +26,4 @@ define( 'THUMB_HANDLER', true );
 
 # Execute thumb.php, having set THUMB_HANDLER so that
 # it knows to extract params from a thumbnail file URL.
-require( __DIR__ . '/thumb.php' );
+require __DIR__ . '/thumb.php';
index 435dff0..b5450e1 100644 (file)
@@ -1,3 +1,3 @@
 <?php
 // stub file for compatibility with older versions
-include_once('./index.php');
+include_once './index.php';